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()函数将绝对路径显示出来。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

文件拖拽功能窗口实现

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

MFC文件拖拽功能实现

  • 2013-07-31 15:32
  • 27.00MB
  • 下载

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

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

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

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

QT实现拖拽TabWidget选项卡形成单独的窗口,双击标题栏可还原的功能【dock功能】

近期做QT,我也是新手,这个主要是用重构父类事件实现的,即子类化。此文章是在http://blog.csdn.net/zmm19861210/article/details/9036779上看到的,但...

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

接着上篇的讲http://blog.csdn.net/yf210yf/article/details/7853741 这篇实现文件的拖拽功能。 实现的消息是WM_DROPFILES------>O...

MFC对象拖拽功能(不只是文件拖拽)(转)

原文链接:http://topic.okbase.net/200912/2009122416/3784490.html MFC为实现对象拖放提供了如下三个类。      1.COleDataS...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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