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;
}

 









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