win32下Listbox文件拖放及delete键删除

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

 









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章