【Demo 0034】窗体支持文件拖拽
许多支持文件打开的软件如VS、NotePad, Word,通常都支持鼠标拖拽文件到应用软件窗体实现快速打开文件。 本节里我们也模仿这个功能的实现.
要完成此功能大体思路:
1. 窗体需要支持WS_EX_ACCEPTFILE 这个属性;
2. 通过处理WM_DRAPFILES消息使用DragQureyFile, DrayGetFileList函数即可得到拖入窗体的文件及文件夹,用DrayClose释放资源。
一、代码演示
case WM_DROPFILES:
{
HDROP hDrop = (HDROP)wParam;
if (NULL != hDrop)
{
UINT nDirCount = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0); // get file count
if (0 < nDirCount)
{
TCHAR szFilePath[MAX_PATH];
TCHAR szTemp[MAX_PATH + 32];
for (int ii = 0; ii < nDirCount; ii++) // get file path
{
//int nPathLen = DragQueryFile(hDrop, ii, szFilePath, NULL);
DragQueryFile(hDrop, ii, szFilePath, MAX_PATH);
DWORD dwAttr = GetFileAttributes(szFilePath);
if (dwAttr & FILE_ATTRIBUTE_DIRECTORY)
{
_tcscpy(szTemp, _T("Dir -- "));
} else {
_tcscpy(szTemp, _T("File -- "));
}
_tcscat(szTemp, szFilePath);
SendDlgItemMessage(hWnd, IDC_LSTWNDLIST, LB_ADDSTRING, 0, (LPARAM)szTemp);
}
}
DragFinish(hDrop);
}
break;
}
二、代码分析
1. WM_DROPFILES 消息, 窗体支持WS_EX_APPCEPTFILE 风格后当用户拖拽文件到窗体会触发此消息
wParam -- 返回HDROP 对象
lParam -- not used
2. UINT DragQueryFile(HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch)
hDrop - WM_DROPFILESR wParam 返回的对象
iFile - 指定被拖入窗体的文件列表的索引
lpszFile – 指定文件列表索引的文件路径缓冲
cch - lpszFile 缓冲大小
功能1. 当iFile为0xFFFFFFFF且lpszFile 为NULL时, 返回被拖入窗体的文件数;
功能2. 当iFile为文件列表索引(0~被拖入窗体的文件数)时, 将文件列表中索引为iFile的路径保存到lpszFile中;
功能3. 当iFile为文件列表索引(0~被拖入窗体的文件数)cch为0时,返回文件列表中索引路径的长度.
3. VOID DragFinish(HDROP hDrop)
hDrop - WM_DROPFILESR wParam 返回的对象
功能: 释放hDrop对象资源