前一篇我们讲了win32下编辑框的文件拖放,今天我们来讲讲ListBox下的文件拖放,其实原理是一样的,可以复用编辑框文件拖放的代码,在编辑框文件拖放中我们只是实现了单个文件拖放,在ListBox中我们来实现一次性多个文件拖放。
我们先来讲下文件拖放的核心函数:DragQueryFile函数,定义如下:
UINT DragQueryFile( HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch);
LRESULT CALLBACK ListVProc(HWND hList, UINT Msg, WPARAM wParam, LPARAM lParam) { TCHAR szPath[MAX_PATH]; int number = 0; switch (Msg) { case WM_DROPFILES://文件拖放事件 memset(szPath, 0, sizeof(szPath)); number = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0); for (int i = 0; i < number; i++) { DragQueryFile((HDROP)wParam, i, szPath, sizeof(szPath)); SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)szPath); } DragFinish((HDROP)wParam); break; } return CallWindowProc(g_ListVProc, hList, Msg, wParam, lParam); }
LRESULT CALLBACK ListVProc(HWND hList, UINT Msg, WPARAM wParam, LPARAM lParam) { TCHAR szPath[MAX_PATH]; int number = 0; switch (Msg) { case WM_DROPFILES://文件拖放事件 memset(szPath, 0, sizeof(szPath)); number = DragQueryFile((HDROP)wParam, 0xFFFFFFFF, NULL, 0); for (int i = 0; i < number; i++) { DragQueryFile((HDROP)wParam, i, szPath, sizeof(szPath)); SendMessage(hList, LB_ADDSTRING, 0, (LPARAM)szPath); } DragFinish((HDROP)wParam); break; case WM_KEYDOWN: if (wParam == VK_DELETE)//删除 { int nIndex = (int)SendMessage(hList, LB_GETCURSEL, 0, 0); SendMessage(hList, LB_DELETESTRING, nIndex, 0); } break; } return CallWindowProc(g_ListVProc, hList, Msg, wParam, lParam); }
static WNDPROC g_ListVProc;//全局变量
BOOL CALLBACK DialogProc(HWND hWnd, UINT uMessage, WPARAM wp, LPARAM lp) { switch (uMessage) { case WM_INITDIALOG:{ HWND hList = GetDlgItem(hWnd, IDC_LIST_TEST); DragAcceptFiles(hList, TRUE);//使控件支持文件拖放,可以直接设置属性来实现 g_ListVProc = (WNDPROC)SetWindowLong(hList, GWL_WNDPROC, (LONG)ListVProc); break; } case WM_CLOSE: EndDialog(hWnd, 0); break; default: break; } return FALSE; }