MFC获取鼠标拖入文件的完整路径名
2012-11-01 10:13
253 查看
在MFC程序中要实现鼠标拖入打开文件,首先要获取拖入文件的完整路径名。以对话框程序为例,有以下步骤需要去做:
(1)修改对话框属性,在Extended Styles标签页中勾选"Accept files" 选项;
(2)增加对话框窗口的WM_DROPFILES消息响应函数;
注意,默认的对话框程序中屏蔽了许多Window消息,如果你在默认的工程中去找这个Events,你会发现你找不到WM_DROPFILES消息。此时,打开MFC ClassWizard,切换到Class Info标签页,选择左下方的Message
filter为Window即可。
(3)在相应函数void C**Dlg::OnDropFiles(HDROP hDropInfo) 中,添加如下代码可以获取拖入的文件的完整文件名:
char* pFilePathName = new char[2048];
::DragQueryFile(hDropInfo, 0, pFilePathName, 2048); // 获取拖放文件的完整文件名
m_strFilePathName.Format("%s", pFilePathName);
::DragFinish(hDropInfo); // 注意这个不能少,它用于释放Windows 为处理文件拖放而分配的内存
delete[] pFilePathName;
如果希望鼠标能够一次性拖入多个文件,那么需要用到如下代码:
CString strCount;
char * lpszFileName = new char[1024];
int nFileCount = ::DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 1024); // 获取拖入的文件数量
strCount.Format("您拖入了%i个文件", nFileCount);
AfxMessageBox(strCount);
for (int i=0; i<nFileCount; i++)
{
UINT nChars = ::DragQueryFile(hDropInfo, i, lpszFileName,1024); // 获取拖入的第i个文件的文件名
CString strTemp(lpszFileName, nChars);
AfxMessageBox(strTemp);
}
::DragFinish (hDropInfo);
delete[] lpszFileName;
这里有必要熟悉一下DragQueryFile函数的用法:
UINT DragQueryFile(
HDROPhDrop, //
存放所拖放文件名称的数据结构的句柄,也就是文件名缓冲区的句柄
UINTiFile, // 文件索引编号(用于指明所要查询文件的序号,
如果拖进多个文件,则索引编号从零开始),
// 当iFile值为0xFFFFFFFF 时,返回的是拖曳到窗体上的文件的个数。当iFile值在0和拖拽文件
// 总数之间时,DragQueryFile拷贝与文件名存储缓冲区大小适应的文件名称到缓冲区中。
LPTSTRlpszFile, //
函数返回时,用于存储拖拽文件名称的缓冲区指针。文件名称是一个以空终止“\0”结尾的字符串。
// 如果此参数是NULL,DragQueryFile函数返回拖拽的文件数目。
UINTcch //
存储拖拽文件名称缓冲区的大小,即lpszFile指针所指缓冲区的字符数。
);
(1)修改对话框属性,在Extended Styles标签页中勾选"Accept files" 选项;
(2)增加对话框窗口的WM_DROPFILES消息响应函数;
注意,默认的对话框程序中屏蔽了许多Window消息,如果你在默认的工程中去找这个Events,你会发现你找不到WM_DROPFILES消息。此时,打开MFC ClassWizard,切换到Class Info标签页,选择左下方的Message
filter为Window即可。
(3)在相应函数void C**Dlg::OnDropFiles(HDROP hDropInfo) 中,添加如下代码可以获取拖入的文件的完整文件名:
char* pFilePathName = new char[2048];
::DragQueryFile(hDropInfo, 0, pFilePathName, 2048); // 获取拖放文件的完整文件名
m_strFilePathName.Format("%s", pFilePathName);
::DragFinish(hDropInfo); // 注意这个不能少,它用于释放Windows 为处理文件拖放而分配的内存
delete[] pFilePathName;
如果希望鼠标能够一次性拖入多个文件,那么需要用到如下代码:
CString strCount;
char * lpszFileName = new char[1024];
int nFileCount = ::DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 1024); // 获取拖入的文件数量
strCount.Format("您拖入了%i个文件", nFileCount);
AfxMessageBox(strCount);
for (int i=0; i<nFileCount; i++)
{
UINT nChars = ::DragQueryFile(hDropInfo, i, lpszFileName,1024); // 获取拖入的第i个文件的文件名
CString strTemp(lpszFileName, nChars);
AfxMessageBox(strTemp);
}
::DragFinish (hDropInfo);
delete[] lpszFileName;
这里有必要熟悉一下DragQueryFile函数的用法:
UINT DragQueryFile(
HDROPhDrop, //
存放所拖放文件名称的数据结构的句柄,也就是文件名缓冲区的句柄
UINTiFile, // 文件索引编号(用于指明所要查询文件的序号,
如果拖进多个文件,则索引编号从零开始),
// 当iFile值为0xFFFFFFFF 时,返回的是拖曳到窗体上的文件的个数。当iFile值在0和拖拽文件
// 总数之间时,DragQueryFile拷贝与文件名存储缓冲区大小适应的文件名称到缓冲区中。
LPTSTRlpszFile, //
函数返回时,用于存储拖拽文件名称的缓冲区指针。文件名称是一个以空终止“\0”结尾的字符串。
// 如果此参数是NULL,DragQueryFile函数返回拖拽的文件数目。
UINTcch //
存储拖拽文件名称缓冲区的大小,即lpszFile指针所指缓冲区的字符数。
);
相关文章推荐
- 将文件拖曳到窗体上, 并获取其完整路径 【C++ Builder下实现】
- FileUpload上传文件时,为何不能获取到完整路径
- 用MFC实现代码获取当前EXE 执行的绝对路径,用于扩展相对路径扩展,以及计算文件大小功能
- MFC的...打开一个对话框 要求获取文件路径的代码
- GetModuleFileName获取当前进程已加载模块的文件的完整路径
- android, 删除SD卡音乐文件。通过getContentResolver读取音乐文件,可以获取到一个完整的路径,直接new File(这括号写获取的路径).delete();
- MFC 浏览文件目录,获取路径传到编辑框
- 获取文件的完整路径
- [FUNC]获取文件任意层级文件夹的名称(完整路径,层级)
- win7系统如何获取文件或文件夹的完整路径
- MFC打开一个对话框 要求获取文件路径的代码
- Visual C++(MFC) 打开文件 获取文件路径 详解
- MFC中获取文件路径和文件夹路径
- MFC 获取当前工作路径和可执行文件路径
- VC/MFC 设置程序与文件关联与双击文件获取文件路径
- MFC获取打开目录路径和获取文件路径
- MFC浏览文件夹,浏览保存文件, 获取当前路径
- VC/MFC 设置程序与文件关联与双击文件获取文件路径
- python获取文件路径下的完整文件名(包括扩展名)
- VS MFC获取文件路径