前一篇我們講了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;
}