现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

win32使用文件拖拽

2014-09-19 06:37 工业·编程 ⁄ 共 2242字 ⁄ 字号 暂无评论

在win32程序中,使用文件进行拖拽的操作,是很常见的(不否定有的人喜欢用按钮来打开),其实在程序中使用拖拽,很简单,只需要在创建窗口的时候使用WS_EX_ACCEPTFILES标识符,然后使用一个消息函数去处理(当然,这是属于窗口的扩展风格,所以需要使用CreateWindowEx来创建):

hWnd = CreateWindowEx(WS_EX_ACCEPTFILES, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,  

                         CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); 

这样我们就可以响应对应的消息类型:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片

case WM_DROPFILES: 

        OnDropFiles(hWnd, (HDROP)wParam); 

        break; 

响应函数,其实挺简单的:

VOID OnDropFiles(HWND hwnd, HDROP hDropInfo) 

    UINT  nFileCount = ::DragQueryFile(hDropInfo, (UINT)-1, NULL, 0); 

    TCHAR szFileName[_MAX_PATH] = _T(""); 

    DWORD dwAttribute; 

 

    // 获取拖拽进来文件和文件夹 

    for (UINT i = 0; i < nFileCount; i++) 

    { 

        ::DragQueryFile(hDropInfo, i, szFileName, sizeof(szFileName)); 

        dwAttribute = ::GetFileAttributes(szFileName); 

 

        // 是否为文件夹 

        if (dwAttribute & FILE_ATTRIBUTE_DIRECTORY) 

        {           

            ::SetCurrentDirectory(szFileName);        

            EnumerateFiles(); 

        } 

        else 

        { 

            // 文件可以直接进行播放 

            cout << szFileName << endl; 

            MessageBox(0, szFileName, "", MB_OK); 

        } 

    } 

 

    ::DragFinish(hDropInfo); 

EnumerateFiles()是枚举文件夹中子文件的函数:

VOID EnumerateFiles() 

    WIN32_FIND_DATA fd; 

    HANDLE hFind = ::FindFirstFile(_T("*.*"), &fd); 

 

    if (hFind != INVALID_HANDLE_VALUE) 

    { 

        do  

        { 

            // 如果为目录 

            if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 

            { 

                if (_tcscmp(fd.cFileName, _T(".")) && _tcscmp(fd.cFileName, _T(".."))) 

                { 

                    ::SetCurrentDirectory(fd.cFileName);     

                    EnumerateFiles(); 

                    ::SetCurrentDirectory(_T(".."));         

                } 

            } 

            // 如果为文件 

            else 

            { 

                string strDir; 

                TCHAR      lpDir[MAX_PATH]; 

 

                ::GetCurrentDirectory(MAX_PATH, lpDir); 

                strDir = lpDir; 

//              if ( strDir.Right(1) != _T("\\") ) 

//              { 

//                  strDir += _T("\\"); 

//              } 

                strDir += fd.cFileName; 

                MessageBox(0, strDir.c_str(), "", MB_OK); 

            } 

        } while (::FindNextFile(hFind, &fd)); 

 

        ::FindClose(hFind); 

    } 

} 

就这么简单,就能实现所要的效果了.

相关阅读

    ----VC实现图片拖拽及动画

给我留言

留言无头像?