本文要讨论的功能,是在某一程序运行之后,如何直接将其可以操作的文件拖进程序中打开。
第一步:添加消息声明,消息映射以及消息响应函数
afx_msg void OnDropFiles(HDROP hDropInfo) ;
ON_MESSAGE(WM_DROPFILES,OnDropFiles)
void CBitmapDlg::OnDropFiles(HDROP hDropInfo)
{
}
如此,则可以对由鼠标拖入的文件进行响应,当然要想作出响应,还得自己完成响应函数
第二步:完成响应函数
只需调用一个函数:UINT DragQueryFile(HDROP hDrop ,UINT iFile ,LPSTR lpszFile ,UINT cch);
参数说明:
hDrop:存放所拖放文件名称的数据结构的句柄,也就是文件名缓冲区的句柄
iFile:文件索引编号(用于指明所要查询文件的序号, 如果拖进多个文件,则索引编号从零开始);
如果iFile值为 0xFFFFFFFF 时,返回的是拖曳到窗体上的文件的个数;
如果iFile值在0和拖拽文件总数之间时,DragQueryFile拷贝与文件名存储缓冲区大小适应的文件名称到缓冲区中。
lpszFile: 函数返回时,用于存储拖拽文件名称的缓冲区指针;
文件名称是一个以空终止“\0”结尾的字符串;
如果此参数是NULL,DragQueryFile函数返回拖拽的文件数目;
函数DragQueryFile得到的文件名,是带完整路径的文件名。
cch:存储拖拽文件名称缓冲区的大小,即lpszFile指针所指缓冲区的字符数。
void CBitmapDlg::OnDropFiles(HDROP hDropInfo)
{
char filePath[MAX_PATH];
int iNum = DragQueryFile(hDropInfo, 0xFFFFFFFF, filePath, MAX_PATH); //获取拖动文件的个数
if(iNum >1)
{
// MessageBox("拖入文件数多余一个,只分析第一个文件!", "Tips");
}
DragQueryFile(hDropInfo,0,filePath,MAX_PATH); //获取第一个拖动文件的路径
m_strBmpPath = filePath;
UpdateData(FALSE);
DragFinish(hDropInfo); //结束拖放,释放内存
CDialog::OnDropFiles(hDropInfo);
}