在win32程序中,使用文件进行拖拽的操作,是很常见的(不否定有的人喜欢用按钮来打开)
其实在程序中使用拖拽,很简单,只需要在创建窗口的时候使用WS_EX_ACCEPTFILES标识符,然后使用一个消息函数去处理(当然,这是属于窗口的扩展风格,所以需要使用CreateWindowEx来创建):
hWnd = CreateWindowEx(WS_EX_ACCEPTFILES, szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
这样我们就可以响应对应的消息类型:
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); } }
就这么简单,就能实现所要的效果了
对应的使用例子下载传送门:
http://download.csdn.net/detail/zengraoli/7864689
时间: 2024-10-10 02:51:07