生活随笔
收集整理的這篇文章主要介紹了
跟我一起玩Win32开发(20):浏览文件夹
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
最近忙于一些相當(dāng)無聊的事情,還沒忙完,不過,博客還是要寫的,不然我頭頂上會(huì)多了幾塊磚頭。
在上一篇博文中,我們?yōu)g覽了文件,今天我們也瀏覽一下目錄,如何?
瀏覽目錄我們同樣有兩個(gè)規(guī)矩,用托管類庫的我就不說了,相信大家兩分鐘就能弄好。重點(diǎn)還是說說第二個(gè)規(guī)矩,用API方式。我們用到的是Shell函數(shù),一提到Shell,可能有朋友會(huì)感到痛苦,因?yàn)樗芏嗪瘮?shù)涉及到COM,不過,也沒什么了,反正我的哲學(xué)理念是立足于實(shí)戰(zhàn)。所以,我給大家總結(jié)了思路。
就拿今天我們要用到的SHBrowseForFolder函數(shù)來說吧,先說說這個(gè)函數(shù)的用途吧,一句話概括:顯示一個(gè)對(duì)話框,讓你可以選擇一個(gè)目錄。
COM對(duì)象需要先初始化,再用,用完了釋放,根據(jù)這個(gè)思路,大的步驟如下:
1、CoInitialize(NULL); //初始化。
2、調(diào)用函數(shù)。
3、CoUninitialize(); //釋放。
這個(gè)動(dòng)作就好比你去租用商家的自行車去游玩,別人只是把資源(自行車)借給你用,你給押金(引用計(jì)數(shù)),等到你耍完了,再去把資源還給人家。
要調(diào)用SHBrowseForFolder函數(shù),先初始化它的參數(shù),也就是BROWSEINFO結(jié)構(gòu)體,這個(gè)家伙初始化后,將地址傳給SHBrowseForFolder的lpbi參數(shù)。BROWSEINFO結(jié)構(gòu)你得設(shè)置以下成員。
[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"請(qǐng)選擇目錄";?brsInfo.ulFlags=?BIF_RETURNONLYFSDIRS?|?BIF_DONTGOBELOWDOMAIN?|?BIF_NEWDIALOGSTYLE;?brsInfo.lpfn?=?NULL;?brsInfo.lParam?=?NULL;? 之后就可以調(diào)用函數(shù)了。
[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對(duì)象資源,通過調(diào)用CoTaskMemFree函數(shù)將其釋放。
現(xiàn)在,運(yùn)行一下應(yīng)用程序。
?
?
聰明的你會(huì)發(fā)現(xiàn),雖然我們得到了選擇的目錄名字,但不是完整路徑,通常我們是需要完整的路徑的。這個(gè)也不難,我們?cè)僬?qǐng)出另一個(gè)函數(shù)——SHGetPathFromIDList,它可以幫我們得出完整的路徑。
所以,我們把上面的代碼修改一下。
[cpp]?view plain
?copy if(pIDLIST)??{??????????SHGetPathFromIDList(pIDLIST,?fullPath);??????????HWND?hStatic?=?GetDlgItem(hfDlg,?IDC_DISPLAY);??????SendMessage(hStatic,?WM_SETTEXT,?NULL,?(LPARAM)fullPath);??????}?? 現(xiàn)在再看看結(jié)果,這回你肯定滿意了。
?
-------------- 【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"請(qǐng)選擇目錄";?????????????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;??}??
轉(zhuǎn)載于:https://www.cnblogs.com/weekbo/p/8681932.html
總結(jié)
以上是生活随笔為你收集整理的跟我一起玩Win32开发(20):浏览文件夹的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。