给MFC程序添加文件拖放处理

转载 2012年03月27日 09:52:04
程序支持文件拖放会使程序使用起来更加方便。

  

  当我们从shell(window的文件浏览器)中拖入一个文件到应用程序窗口时,windows会发生一个消息WM_DROPFILES给程序,支持文件拖放操作的本质就是程序要适当地处理这个消息。并不是所有程序都可以接受文件拖放消息,只有具有WS_EX_ACCEPTFILES窗口属性的窗口,才能收到这条消息。当使用WIN32 API进行编程时,就要在创建这个窗口时加上这个扩展属性。

  如果是MFC程序,则可以在创建程序时,在向导中选择窗口的Accept Files属性,也可以在窗口创建的时候(比如OnCreate函数)调用窗口的成员函数DragAcceptFiles(TRUE),效果是一样的。

在BEGIN_MESSAGE_MAP中加入 ON_WM_DROPFILES()

  支持文件拖放时,主要会涉及到以下三个API函数:DragQueryFile、DragQueryPoint、DragFinish

  它们的原型和注解分别如下:   

 

       UINT DragQueryFile(HDROP hDrop,UINT iFile,LPTSTR lpszFile,UINT cch)  

  这个函数用来取得拖放的文件名。其中,hDrop是一个指向含有被拖放的文件名的结构体的句柄(WIN32 API编程时,这个句柄就是WM_DROPFILES消息的wParam参数,而MFC编程时,则可以从消息处理函数的参数直接得到);iFiles是要查询的文件序号,因为一次可能同时拖动很多个文件;lpszFiles是出口缓冲区指针,保存iFiles指定序号的文件的路径名,cch指定该缓冲区的大小。注意,第一,如果我们在调用该函数的时候,指定iFile为0xFFFFFFFF,则DragQueryFile将忽略lpszFile和cch参数,返回本次拖放操作的文件数目;第二,如果指定lpszFile为NULL,则函数将返回实际所需的缓冲区长度。

        BOOL DragQueryPoint(HDROP hDrop, LPPOINT lppt);        

  这个函数用来获取,当拖放操作正在进行时,鼠标指针的位置。第二个参数lppt是一个指向POINT结构体的指针,用来保存文件放下时,鼠标指针的位置。窗口可以调用该函数以查询文件是否落在自己的窗口矩形中。   

        void DragFinish(HDROP hDrop);     

  当拖放操作处理完毕后需调用该函数释放系统分配来传输文件名的内存。   

  要处理WM_DROPFILES消息时,可以使用向导给对应的窗口添加消息处理函数,该消息处理函数原型是:void OnDropFiles(HDROP hDrop):

  以下是该函数处理的示例代码:

Cpp代码
  1. void CDialogDropFileDlg::OnDropFiles(HDROP hDropInfo)   
  2. {   
  3.     // TODO: 在此添加消息处理程序代码和/或调用默认值  
  4.     char szFilePathName[_MAX_PATH+1]    =    {0};      
  5.   
  6.         //得到文件个数     
  7.     UINT nNumOfFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);   
  8.   
  9.     for (UINT nIndex=0 ; nIndex< nNumOfFiles; ++nIndex) {   
  10.         // 得到文件名  
  11.          DragQueryFile(hDropInfo, nIndex, (LPTSTR)szFilePathName, _MAX_PATH);   
  12.         // 有了文件名就可以想干嘛干嘛了 :P  
  13.          AfxMessageBox((LPCTSTR)szFilePathName);   
  14.      }      
  15.   
  16.      DragFinish(hDropInfo);     
  17.   
  18.      CDialog::OnDropFiles(hDropInfo);   
  19. }  

MFC程序对文件的处理方法

对文件的处理是MFC程序设计中非常常见的应用。本文就以实例形式做一简单叙述。具体方法如下: 1.CFileDialog的应用www.111ce.com 格式如下: CFi...

MFC处理拖放文件或文件夹事件

  • 2015年07月29日 20:12
  • 30KB
  • 下载

MFC程序打包为安装文件方法

用visual studio 2010进行打包,2005、2008都差不多是一样的操作。详图如下。 1.打开visual studio 2010,新建一个安装项目,名称为InstallTest,...

MFC程序打包为安装文件方法

用visual studio 2010进行打包,2005、2008都差不多是一样的操作。详图如下。 1.打开visual studio 2010,新建一个安装项目,名称为InstallTest,...

MFC程序中创建文件夹(文件路径)

创建文件路径(即确定文件夹是否存在和创建一个文件夹),常需要PathIsDirectory和CreateDirectory两个函数实现。 PathIsDirectory函数用于判断传入的路径是否已经...

MFC程序打开文件对话框出错的问题解决

前几天从网上下了个图像分析的mfc小程序,是VC6的 用VC6在本地编译生成都没问题,运行起来弹出一个未处理的错误,程序崩溃退出。 想起来原来遇到过打开文件对话框方面的问题,当时项目时间紧张未能深...

解决VC++ MFC程序resource.h头文件中ID重复问题

一般MFC开发的时候,如果有些资源是从其他工程中移植到本工程的, 而在资源移植的时候都要将对应的资源ID复制到本工程的resource.h文件中。 此时不管你在不在本工程中添加资源ID,resou...

【转】在MFC程序中调用或打开其他文件方式

原文出处:http://blog.csdn.net/b_h_l/article/details/7717744

怎么自定义MFC程序的保存文件名称?

(转自:http://wenwen.soso.com/z/q274419303.htm) 用MFC的默认创建的单文档程序,菜单栏里的“文件->保存(或打开)”里的类型都是“所有文件(*.*)”,怎么...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:给MFC程序添加文件拖放处理
举报原因:
原因补充:

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