跟我一起玩Win32開發(20):瀏覽文件夾

最近忙于一些相當無聊的事情,還沒忙完,不過,博客還是要寫的,不然我頭頂上會多了幾塊磚頭。

在上一篇博文中,我們瀏覽了文件,今天我們也瀏覽一下目錄,如何?

瀏覽目錄我們同樣有兩個規矩,用托管類庫的我就不說了,相信大家兩分鐘就能弄好。重點還是說說第二個規矩,用API方式。我們用到的是Shell函數,一提到Shell,可能有朋友會感到痛苦,因為它很多函數涉及到COM,不過,也沒什么了,反正我的哲學理念是立足于實戰。所以,我給大家總結了思路。

就拿今天我們要用到的SHBrowseForFolder函數來說吧,先說說這個函數的用途吧,一句話概括:顯示一個對話框,讓你可以選擇一個目錄

COM對象需要先初始化,再用,用完了釋放,根據這個思路,大的步驟如下:

1、CoInitialize(NULL); //初始化。

2、調用函數。

3、CoUninitialize(); //釋放。

這個動作就好比你去租用商家的自行車去游玩,別人只是把資源(自行車)借給你用,你給押金(引用計數),等到你耍完了,再去把資源還給人家。

要調用SHBrowseForFolder函數,先初始化它的參數,也就是BROWSEINFO結構體,這個家伙初始化后,將地址傳給SHBrowseForFolder的lpbi參數。BROWSEINFO結構你得設置以下成員。

[cpp]?view plain?copy
  1. PIDLIST_ABSOLUTE?pIDLIST;//函數返回的值存在這里??
  2. BROWSEINFO?brsInfo;??
  3. WCHAR?fdpath[MAX_PATH];?//接收選擇目錄的字符數組??
  4. ??
  5. 。。。。。。。。。。。。。。。。。。。??
  6. brsInfo.hwndOwner?=?hWnd;?//擁有者窗口??
  7. brsInfo.pidlRoot?=?NULL;?//根目錄為桌面??
  8. brsInfo.pszDisplayName?=?fdpath;?//返回的被選擇的路徑??
  9. brsInfo.lpszTitle?=?L"請選擇目錄";?//對話框標題??
  10. brsInfo.ulFlags=?BIF_RETURNONLYFSDIRS?|?BIF_DONTGOBELOWDOMAIN?|?BIF_NEWDIALOGSTYLE;?//不顯示網絡路徑??
  11. brsInfo.lpfn?=?NULL;?//沒有回調??
  12. brsInfo.lParam?=?NULL;?//沒有額外參數??

之后就可以調用函數了。

[cpp]?view plain?copy
  1. //?初始化COM組件,用完后記得釋放??
  2. CoInitialize(NULL);??
  3. pIDLIST?=?SHBrowseForFolder(&brsInfo);??
  4. if(pIDLIST)??
  5. {??
  6. ????//取出對話框中用來顯示結果的控件??
  7. ????HWND?hStatic?=?GetDlgItem(hfDlg,?IDC_DISPLAY);??
  8. ????SendMessage(hStatic,WM_SETTEXT,?NULL,?(LPARAM)fdpath);??
  9. }??
  10. CoUninitialize();??
  11. //?釋放IDLIST??
  12. CoTaskMemFree((LPVOID)pIDLIST);??

由于PIDLIST也是COM對象資源,通過調用CoTaskMemFree函數將其釋放。

現在,運行一下應用程序。

?

?

聰明的你會發現,雖然我們得到了選擇的目錄名字,但不是完整路徑,通常我們是需要完整的路徑的。這個也不難,我們再請出另一個函數——SHGetPathFromIDList,它可以幫我們得出完整的路徑。

所以,我們把上面的代碼修改一下。

[cpp]?view plain?copy
  1. if(pIDLIST)??
  2. {??
  3. ????//得到完整路徑??
  4. ????SHGetPathFromIDList(pIDLIST,?fullPath);??
  5. ????//取出對話框中用來顯示結果的控件??
  6. ????HWND?hStatic?=?GetDlgItem(hfDlg,?IDC_DISPLAY);??
  7. ????SendMessage(hStatic,?WM_SETTEXT,?NULL,?(LPARAM)fullPath);??
  8. ????//SendMessage(hStatic,WM_SETTEXT,?NULL,?(LPARAM)fdpath);??
  9. }??

現在再看看結果,這回你肯定滿意了。

?

-------------- 【C++ Code】 -------------------------

[cpp]?view plain?copy
  1. LRESULT?CALLBACK?WndProc(HWND?hWnd,?UINT?message,?WPARAM?wParam,?LPARAM?lParam)??
  2. {??
  3. ????int?wmId,?wmEvent;??
  4. ????PAINTSTRUCT?ps;??
  5. ????HDC?hdc;??
  6. ??
  7. ????PIDLIST_ABSOLUTE?pIDLIST;//函數返回的值存在這里??
  8. ????BROWSEINFO?brsInfo;??
  9. ????WCHAR?fdpath[MAX_PATH];?//接收選擇目錄的字符數組??
  10. ????WCHAR?fullPath[MAX_PATH];?//完整路徑??
  11. ??
  12. ????static?HWND?hfDlg;??
  13. ??
  14. ????switch?(message)??
  15. ????{??
  16. ????case?WM_CREATE:??
  17. ????????hfDlg?=?CreateDialog(hInst,?MAKEINTRESOURCE(IDD_FORMVIEW),?hWnd,?NULL);??
  18. ????????ShowWindow(hfDlg,SW_SHOW);??
  19. ????????break;??
  20. ????case?WM_COMMAND:??
  21. ????????wmId????=?LOWORD(wParam);??
  22. ????????wmEvent?=?HIWORD(wParam);??
  23. ????????//?分析菜單選擇:??
  24. ????????switch?(wmId)??
  25. ????????{??
  26. ????????case?IDM_ABOUT:??
  27. ????????????DialogBox(hInst,?MAKEINTRESOURCE(IDD_ABOUTBOX),?hWnd,?About);??
  28. ????????????break;??
  29. ????????case?IDM_EXIT:??
  30. ????????????DestroyWindow(hWnd);??
  31. ????????????break;??
  32. ????????case?IDM_BROWSFOLDER:??
  33. ????????????brsInfo.hwndOwner?=?hWnd;?//擁有者窗口??
  34. ????????????brsInfo.pidlRoot?=?NULL;?//根目錄為桌面??
  35. ????????????brsInfo.pszDisplayName?=?fdpath;?//返回的被選擇的路徑??
  36. ????????????brsInfo.lpszTitle?=?L"請選擇目錄";?//對話框標題??
  37. ????????????brsInfo.ulFlags=?BIF_RETURNONLYFSDIRS?|?BIF_DONTGOBELOWDOMAIN?|?BIF_NEWDIALOGSTYLE;?//不顯示網絡路徑??
  38. ????????????brsInfo.lpfn?=?NULL;?//沒有回調??
  39. ????????????brsInfo.lParam?=?NULL;?//沒有額外參數??
  40. ????????????//?初始化COM組件,用完后記得釋放??
  41. ????????????CoInitialize(NULL);??
  42. ????????????pIDLIST?=?SHBrowseForFolder(&brsInfo);??
  43. ????????????if(pIDLIST)??
  44. ????????????{??
  45. ????????????????//得到完整路徑??
  46. ????????????????SHGetPathFromIDList(pIDLIST,?fullPath);??
  47. ????????????????//取出對話框中用來顯示結果的控件??
  48. ????????????????HWND?hStatic?=?GetDlgItem(hfDlg,?IDC_DISPLAY);??
  49. ????????????????SendMessage(hStatic,?WM_SETTEXT,?NULL,?(LPARAM)fullPath);??
  50. ????????????????//SendMessage(hStatic,WM_SETTEXT,?NULL,?(LPARAM)fdpath);??
  51. ????????????}??
  52. ????????????CoUninitialize();??
  53. ????????????//?釋放IDLIST??
  54. ????????????CoTaskMemFree((LPVOID)pIDLIST);??
  55. ????????????break;??
  56. ????????default:??
  57. ????????????return?DefWindowProc(hWnd,?message,?wParam,?lParam);??
  58. ????????}??
  59. ????????break;??
  60. ????case?WM_PAINT:??
  61. ????????hdc?=?BeginPaint(hWnd,?&ps);??
  62. ????????//?TODO:?在此添加任意繪圖代碼...??
  63. ????????EndPaint(hWnd,?&ps);??
  64. ????????break;??
  65. ????case?WM_DESTROY:??
  66. ????????PostQuitMessage(0);??
  67. ????????break;??
  68. ????default:??
  69. ????????return?DefWindowProc(hWnd,?message,?wParam,?lParam);??
  70. ????}??
  71. ????return?0;??
  72. }??

轉載于:https://www.cnblogs.com/weekbo/p/8681932.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453101.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453101.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么材料反射熱量好_封陽臺用什么材料好,封陽臺用什么玻璃好

展開全部陽臺是建e68a8462616964757a686964616f31333433663065筑物室內的擴張,是居住者吸取新鮮空氣、曬各種衣物、放置盆栽的場地方,其裝修需要顧及實用更要注重美觀問題。封陽臺的優點1、具有保暖等的作用。陽臺封閉后,多了一層抵擋塵埃和噪…

k8s實戰之從私有倉庫拉取鏡像 - kubernetes

1、實戰目的 從私有docker倉庫拉取鏡像,部署pod。上一篇中,我們搭建了私有的鏡像倉庫,這一篇我們將與k8s結合實戰使用私有倉庫。 2、登錄docker 為了完成本次實戰,需要登錄docker,如下: 3、為k8s集群創建Se…

李開復評價馬斯克:他真正的目的是把人變成半機械人

本文來自AI新媒體量子位(QbitAI)李開復在昨日接受Quartz的采訪時說,伊隆馬斯克在用太陽能汽車和腦部醫療植入物做誘餌掩飾他真正的目的:改變從傳統電力公司獲得能源的方式,并且將人類變成半機械人。 △ 伊隆馬斯克 李開…

《那些年啊,那些事——一個程序員的奮斗史》

段伏櫪,一個瘦小,矮小,根本和“帥”這個字粘不上任何關系的普通人。名字的來源在于其多讀了幾年書的老爹,總抱著有一天要出書出名乃至于名流千古的美好理想,但可惜現實總是給予他無情的而又現實的打擊,于是…

計算機機房安全風險防控規范,中心機房安全風險分析一覽表

《中心機房安全風險分析一覽表》由會員分享,可在線閱讀,更多相關《中心機房安全風險分析一覽表(6頁珍藏版)》請在人人文庫網上搜索。1、中心機房安全風險分析一覽表組件構件丿元糸風險點物理環境 及保障物理環境場地場地選址不當場地安全措施不當自然災害…

c語言的翻譯叫什么_什么是編譯器?什么是集成開發環境?

我們平時所說的程序,是指雙擊后就可以直接運行的程序,這樣的程序被稱為可執行程序(Executable Program)。在 Windows 下,可執行程序的后綴有 .exe 和 .com(其中 .exe 比較常見);在類…

平板電腦硬件如何測試軟件,先鋒(Pioneer)G71平板電腦軟件測試評測-ZOL中關村在線...

谷歌對旗下的智能操作系統Android采取了開源的做法,所以說也就造成了它相較于蘋果iOS以及微軟Windows系統嚴重的碎片化現象,當然我們也看到了像三星 TouchWiz UX,HTC Sense UI以及小米 MIUI這些非常成熟且易用的第三方固件,只是它…

WPF 中設置Combox下拉框Text 顯示值

最近在寫一個WPF客戶端的一個小程序,其中有個小需求如下: 展示下拉列表里面有樹形結構點擊下拉子項時同時顯示父級和子級文本也就是說在DisplayMember 中有兩種顯示方式 下拉列表顯示時,顯示的是DisplayMember 的值點擊選中子項時&#xff0c…

簡單的文件上傳功能實現(java)

現在很多做后臺系統的項目大部分都會用到文件上傳這個功能,網上有很多例子,這邊是自己用SSM框架技術做的一個簡單的文件上傳功能。 在寫文件上傳功能前首先要導入相應的jar包: commons-fileupload-1.3.1-jar ;commons-io-2.2-jar …

多讀讀書,對自己有好處

首先,打破一切常規 我一直以來養成了一個習慣,就是睡覺之前看半個小時或更長時間的書,這些書都是雜七雜八的,沒有特定的類型,這種習慣有好有壞,好的書好的句子能讓我回味無窮,在甜美中慢慢地進…

增量導出_[華為]一種實用的增量式深度CTR模型訓練方法

今天給大家介紹一篇有關深度CTR模型增量訓練的文章,來自華為諾亞方舟實驗室。1、背景深度CTR模型需要大量的數據進行訓練,同時需要不斷的更新以適應最新的數據分布。如果模型沒有及時更新,則有可能帶來線上效果的衰減,如下圖&…

win7如何添加終端服務器,Windows7系統超級終端的添加方法 win7如何添加超級終端...

有用戶在剛升級到Windows7系統以后反映,在XP 操作系統里,超級終端是很好用的,但是卻不知道為什么,升級為Windows7系統后卻找不到超級終端在哪,出現這樣的情況讓用戶非常的煩惱,其實找不到超級終端&#xff…

騰訊這家公司的核心競爭力是什么?為什么?

Andy Pan ,騰訊無線國際業務產品總監, 騰訊國際業務部... 我決定在國外出差的最后一晚晚點休息,在酒店靜靜的認真的回答這個問題。我盡量客觀的負責的回答,不憤青,不炫耀,不攻擊,用樸實的語言。只代表我個人的思考&…

h.323 服務器 作用,Cisco CallManager服務器冗余的H.323 網關撥號對端配置

語音、視頻和集成數據 (AVVID) 設計的體系結構一般建議您具有主 Cisco CallManager 服務器和輔助 Cisco CallManager 服務器以實現冗余。如果主 Cisco CallManager 服務器發生故障,則輔助 Cisco CallManager 服務器將接管,并且 IP 電話將重定向到此服務器…

靜態優先權和動態優先權

靜態優先級:在創建進程時確定的,且在進程的整個運行期間保持不變動態優先級:在創建進程時所賦予的優先權,是可以隨進程的推進或隨其等待時間的增加而改變的,以便獲得更好的調度性能。確定靜態優先權的依據有如下三個方…

xmind可以畫流程圖嗎_新娘妝可以自己畫嗎?臨夏化妝學校告訴你答案!

對于很多女性來說,一生中最重要的時候無疑是新婚的那一天,古時候的閨閣女子,鳳披霞冠,八臺大轎,攜手自己的如意郎君相伴一生,現代女子,潔白的婚紗,手握鮮花,一枚戒指&…