前一篇我们讲了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;
}