前一篇我们讲了win32下编辑框的文件拖放,今天我们来讲讲ListBox下的文件拖放,其实原理是一样的,可以复用编辑框文件拖放的代码,在编辑框文件拖放中我们只是实现了单个文件拖放,在ListBox中我们来实现一次性多个文件拖放。
我们先来讲下文件拖放的核心函数:DragQueryFile函数,定义如下:
UINT DragQueryFile( HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch);
hDrop:表示拖拽句柄,我们无需多了解,
在控件消息回调函数中,我们只需传入wparam值即可;
iFile:
文件索引值,上一篇博客中我们把它设为0,表示我们提取的是第一个文件路径,如果为
0xFFFFFFFF则函数返回拖拽文件个数;
lpszFile:
为存储文件路径缓冲区,这个很容易理解;
cch:
为缓冲区大小,这个也很容易理解。
有了上面这个函数,再结合上一篇博客,就很容易实现多个文件拖拽到ListBox控件上了。
我们先新建一个win32工程,这个我就不细讲了,创建一个对话框资源,拉入LIstBox控件,将ListBox控件的Accept File属性设置为TRUE,得到界面效果下图所示:
跟编辑框的处理一样,我们也要重写ListBox控件的消息回调函数,重点重写WM_DROPFILES消息处理,处理如下:
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);
}
这时我们便可以将文件通过拖拽的形式在ListBox控件中显示了,而且支持多个文件同时拖拽。
有时候我们想通过按delete键将ListBox列表中的项删除,怎么处理呢?很简单,只需要实现Listbox消息回调函数的WM_KEYDOWN消息即可,整个代码如下:
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;
}