【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对象资源

演示代码

原文地址:https://www.cnblogs.com/ztercel/p/2153890.html