生活随笔
收集整理的這篇文章主要介紹了
跟我一起玩Win32开发(20):浏览文件夹
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近忙于一些相當無聊的事情,還沒忙完,不過,博客還是要寫的,不然我頭頂上會多了幾塊磚頭。
在上一篇博文中,我們瀏覽了文件,今天我們也瀏覽一下目錄,如何?
瀏覽目錄我們同樣有兩個規矩,用托管類庫的我就不說了,相信大家兩分鐘就能弄好。重點還是說說第二個規矩,用API方式。我們用到的是Shell函數,一提到Shell,可能有朋友會感到痛苦,因為它很多函數涉及到COM,不過,也沒什么了,反正我的哲學理念是立足于實戰。所以,我給大家總結了思路。
就拿今天我們要用到的SHBrowseForFolder函數來說吧,先說說這個函數的用途吧,一句話概括:顯示一個對話框,讓你可以選擇一個目錄。
COM對象需要先初始化,再用,用完了釋放,根據這個思路,大的步驟如下:
1、CoInitialize(NULL); //初始化。
2、調用函數。
3、CoUninitialize(); //釋放。
這個動作就好比你去租用商家的自行車去游玩,別人只是把資源(自行車)借給你用,你給押金(引用計數),等到你耍完了,再去把資源還給人家。
要調用SHBrowseForFolder函數,先初始化它的參數,也就是BROWSEINFO結構體,這個家伙初始化后,將地址傳給SHBrowseForFolder的lpbi參數。BROWSEINFO結構你得設置以下成員。
[cpp]?view plain
?copy PIDLIST_ABSOLUTE?pIDLIST;BROWSEINFO?brsInfo;??WCHAR?fdpath[MAX_PATH];???。。。。。。。。。。。。。。。。。。。??brsInfo.hwndOwner?=?hWnd;?brsInfo.pidlRoot?=?NULL;?brsInfo.pszDisplayName?=?fdpath;?brsInfo.lpszTitle?=?L"請選擇目錄";?brsInfo.ulFlags=?BIF_RETURNONLYFSDIRS?|?BIF_DONTGOBELOWDOMAIN?|?BIF_NEWDIALOGSTYLE;?brsInfo.lpfn?=?NULL;?brsInfo.lParam?=?NULL;? 之后就可以調用函數了。
[cpp]?view plain
?copy CoInitialize(NULL);??pIDLIST?=?SHBrowseForFolder(&brsInfo);??if(pIDLIST)??{??????????HWND?hStatic?=?GetDlgItem(hfDlg,?IDC_DISPLAY);??????SendMessage(hStatic,WM_SETTEXT,?NULL,?(LPARAM)fdpath);??}??CoUninitialize();??CoTaskMemFree((LPVOID)pIDLIST);?? 由于PIDLIST也是COM對象資源,通過調用CoTaskMemFree函數將其釋放。
現在,運行一下應用程序。
?
?
聰明的你會發現,雖然我們得到了選擇的目錄名字,但不是完整路徑,通常我們是需要完整的路徑的。這個也不難,我們再請出另一個函數——SHGetPathFromIDList,它可以幫我們得出完整的路徑。
所以,我們把上面的代碼修改一下。
[cpp]?view plain
?copy if(pIDLIST)??{??????????SHGetPathFromIDList(pIDLIST,?fullPath);??????????HWND?hStatic?=?GetDlgItem(hfDlg,?IDC_DISPLAY);??????SendMessage(hStatic,?WM_SETTEXT,?NULL,?(LPARAM)fullPath);??????}?? 現在再看看結果,這回你肯定滿意了。
?
-------------- 【C++ Code】 -------------------------
[cpp]?view plain
?copy LRESULT?CALLBACK?WndProc(HWND?hWnd,?UINT?message,?WPARAM?wParam,?LPARAM?lParam)??{??????int?wmId,?wmEvent;??????PAINTSTRUCT?ps;??????HDC?hdc;????????PIDLIST_ABSOLUTE?pIDLIST;????BROWSEINFO?brsInfo;??????WCHAR?fdpath[MAX_PATH];?????WCHAR?fullPath[MAX_PATH];???????static?HWND?hfDlg;????????switch?(message)??????{??????case?WM_CREATE:??????????hfDlg?=?CreateDialog(hInst,?MAKEINTRESOURCE(IDD_FORMVIEW),?hWnd,?NULL);??????????ShowWindow(hfDlg,SW_SHOW);??????????break;??????case?WM_COMMAND:??????????wmId????=?LOWORD(wParam);??????????wmEvent?=?HIWORD(wParam);??????????????????switch?(wmId)??????????{??????????case?IDM_ABOUT:??????????????DialogBox(hInst,?MAKEINTRESOURCE(IDD_ABOUTBOX),?hWnd,?About);??????????????break;??????????case?IDM_EXIT:??????????????DestroyWindow(hWnd);??????????????break;??????????case?IDM_BROWSFOLDER:??????????????brsInfo.hwndOwner?=?hWnd;?????????????brsInfo.pidlRoot?=?NULL;?????????????brsInfo.pszDisplayName?=?fdpath;?????????????brsInfo.lpszTitle?=?L"請選擇目錄";?????????????brsInfo.ulFlags=?BIF_RETURNONLYFSDIRS?|?BIF_DONTGOBELOWDOMAIN?|?BIF_NEWDIALOGSTYLE;?????????????brsInfo.lpfn?=?NULL;?????????????brsInfo.lParam?=?NULL;?????????????????????????CoInitialize(NULL);??????????????pIDLIST?=?SHBrowseForFolder(&brsInfo);??????????????if(pIDLIST)??????????????{??????????????????????????????????SHGetPathFromIDList(pIDLIST,?fullPath);??????????????????????????????????HWND?hStatic?=?GetDlgItem(hfDlg,?IDC_DISPLAY);??????????????????SendMessage(hStatic,?WM_SETTEXT,?NULL,?(LPARAM)fullPath);??????????????????????????????}??????????????CoUninitialize();??????????????????????????CoTaskMemFree((LPVOID)pIDLIST);??????????????break;??????????default:??????????????return?DefWindowProc(hWnd,?message,?wParam,?lParam);??????????}??????????break;??????case?WM_PAINT:??????????hdc?=?BeginPaint(hWnd,?&ps);??????????????????EndPaint(hWnd,?&ps);??????????break;??????case?WM_DESTROY:??????????PostQuitMessage(0);??????????break;??????default:??????????return?DefWindowProc(hWnd,?message,?wParam,?lParam);??????}??????return?0;??}??
轉載于:https://www.cnblogs.com/weekbo/p/8681932.html
總結
以上是生活随笔為你收集整理的跟我一起玩Win32开发(20):浏览文件夹的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。