MFC中窗口实现拖拽文件功能

原创 2017年09月25日 21:59:28

MFC窗口拖拽文件功能指的是用鼠标将文件拖拽入窗口后,在窗口中可以获取拖拽文件的绝对路径,如图1所示。


1 文件拖拽功能

实现窗口的拖拽文件功能,首先要将窗口注册为放置拖拽文件的目标,之后在窗口中响应拖拽消息,获取拖拽文件的绝对路径。

1将窗口注册为放置文件的目标

将窗口注册为放置文件目标的方法有两种:一种是通过MFC资源编辑器实现,另一种方法是通过代码实现。

1.1通过MFC资源编辑器实现

VS2015中创建一个基于对话框的MFC程序。接下来在VS2015的资源视图中,选择MFC程序的主对话框,然后在右侧的“属性”选项中将对话框的“Accept Files”属性设置为True,表示将对话框注册为放置拖放文件的目标,如图2所示。

 

2 修改对话框Accept Files属性

1.2通过代码实现

在对话框的OnInitDialog()函数中通过CWnd类的DragAcceptFiles()函数将对话框注册为放置拖放文件的目标。该函数的格式为

void DragAcceptFiles( BOOL bAccept = TRUE );
该函数的参数bAcceptTRUE时表示对话框接收拖拽的文件,bAcceptFALSE时表示不接受拖拽的文件。

2.文件拖拽消息的响应函数

在将窗口注册为放置文件的目标后,该窗口就可以接收文件拖拽的消息了,该消息为WM_DROPFILES

2.1 添加消息响应函数

VS2015资源管理器中选中窗口,之后在右侧的“属性”中选择“消息”,为WM_DROPFILES消息添加响应函数OnDropFiles(),如图3所示。当将文件拖拽入对话框时,OnDropFiles()函数就会被调用。

 

3 添加WM_DROPFILES消息响应函数

2.2 定义消息响应函数

OnDropFiles()函数中,获取拖拽文件的绝对路径,并在编辑框中显示出来。通过DragQueryFile()函数获取文件的绝对路径,该函数的格式为

UINT DragQueryFile(
  _In_  HDROP  hDrop,
  _In_  UINT   iFile,
  _Out_ LPTSTR lpszFile,
        UINT   cch
);
其中,参数hDrop包含了拖拽文件的信息;iFile指定了查询文件的索引号;lpszFile是保存文件绝对路径的缓冲区;cch是缓冲区的大小。如果成功获取拖拽文件的信息,则返回非零值。

在使用DragQueryFile()函数时,首先通过该函数获取拖拽文件的数量,之后遍历每个拖拽文件。一般来说,每次只拖拽一个文件。

2.2.1 获取拖拽文件的数量

通过DragQueryFile()函数获取拖拽到窗口上的文件的数量。

int count_droppedfile = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
其中,DragQueryFile()函数的第二个参数设置为0xFFFFFFFF-1时,该函数的返回值即为拖拽文件的数量。

2.2.2 拖拽文件绝对路径的显示

2.2.1 获取拖拽文件的数量”中获取了拖拽文件的数量之后,接下来遍历拖拽到窗口的文件,获取文件的绝对路径,并且在窗口的Edit控件中显示出来。

(1)Edit控件添加成员变量

要想在Edit控件中显示拖拽文件的绝对路径,就要为该控件添加成员变量。如图4所示。

 

4 Edit控件添加变量

以上方法为窗口的编辑框控件添加了一个名为m_EditCtrl_FilePath的变量,该变量的类别为Control

(2)显示绝对路径

在对话框类的OnDropFiles()函数中,有如下代码

for (int i = 0; i < count_droppedfile; ++i)
{
wchar_t filepath[MAX_PATH] = { 0 };
if (DragQueryFile(hDropInfo, i, filepath, MAX_PATH)>0)
{
m_EditCtrl_FilePath.SetWindowTextW(filepath);
}
}
其中,for循环的作用是遍历所有的拖拽文件,count_droppedfile是在“2.2.1 获取拖拽文件的数量”中获取的拖拽文件数量;通过DragQueryFile()函数获取文件的绝对路径,并且保存在filepath中,最后,通过编辑框控件的变量m_EditCtrl_FilePath调用SetWindowTextW()函数将绝对路径显示出来。

相关文章推荐

MFC 实现图片的拖拽功能,代码很详细,贴过去就能用!

拖动是界面编程频繁使用的一个效果,在windows系统下可谓大行其道。纵观时下的应用软件几乎各个都支持各种各样拖动的效果,windows7更是把拖动做到了极致。其实说起来拖动的实现也很简单,对于有句柄...

MFC----文件拖拽的实现OnDropFiles

接着上篇的讲http://blog.csdn.net/yf210yf/article/details/7853741 这篇实现文件的拖拽功能。 实现的消息是WM_DROPFILES------>O...
  • yf210yf
  • yf210yf
  • 2012年08月11日 09:21
  • 12214

MFC文件拖拽功能实现

  • 2013年07月31日 15:32
  • 27MB
  • 下载

文件拖拽功能窗口实现

文件拖拽功能窗口实现 今天在使用迅雷软件播放影片时,觉得这个拖拽播放的功能还不错,想着自己能否实现一个具备文件拖拽功能的窗口呢,查看了下MSDN,原来窗口接受文件需要处理WM_DROPFILES消...
  • nk_wang
  • nk_wang
  • 2017年07月09日 18:59
  • 128

MFC中实现单个控件接收拖拽文件的功能

现在有很多软件都支持拖拽功能,就是用鼠标拖着文件放到软件窗口中某个位置,软件就可以做出相应的反应。比如,Windows自带的播放软件Windows Media Player,你可以拖着一个媒体文件放到...

MFC单个控件实现文件拖拽功能

现在有很多软件都支持拖拽功能,就是用鼠标拖着文件放到软件窗口中某个位置,软件就可以做出相应的反应。比如,Windows自带的播放软件Windows Media Player,你可以拖着一个媒体文件放到...

VS2008中,MFC对话框类实现类似QQ拖拽上传文件的功能,CWnd::OnDropFiles

DropFiles - lvlijuan001@126 - lvlijuan001@126的博客" src="http://img.blog.163.com/photo/SiSCBTA0PNoIlOp...

用OLE实现任意窗口拖拽功能

  • 2013年11月07日 09:39
  • 13KB
  • 下载

Cindy_Lee 实现的遮罩层的增强版本,增加了增加拖拽,浏览器窗口缩放时遮罩层自动缩放等功能

代码如下所示,代码已经被我重构.... 写的不好,请见谅... config_VB2005XU.js // JavaScript Document var login_VB2005XU = { ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MFC中窗口实现拖拽文件功能
举报原因:
原因补充:

(最多只允许输入30个字)