以下內容由網路資源收集和個人專案經驗綜合:首先
browseinfo的結構如下:
typedef struct _browseinfo browseinfo, *pbrowseinfo, *lpbrowseinfo
pszdisplayname
-- 這個引數指向乙個緩衝區,shbrowseforfolder預設這個緩衝區的大小為max_path(系統定義的巨集,表示乙個路徑名的最大長度),並用它來儲存被選取的資料夾的路徑。
ulflags --
shbrowseforfolder允許我們指定對話方塊的功能和外觀,這個引數正是起這樣的用途。它的值可以由十幾個巨集組合而成。比如bif_returnnonlyfsdirs是返回檔案系統的目錄,bif_browseforcomputer是返回網路上的計算機名,bif_editbox是顯示乙個編輯框,允許使用者輸入資料夾名。一般來說,如果是簡單的用於選擇乙個資料夾,設定ulflags = bif_returnonlylyfsdirs即可。
pidroot --
它指向乙個itemidlist結構,作為在列表中顯示的資料夾的根目錄,如果為null則預設為desktop。itemidlist結構除了用在這裡外,它還用作函式的返回值(參看函式原型)。那為什麼不用字串來表示這個目錄呢,這個結構怎樣表示乙個目錄呢?下面作乙個簡單的介紹。
itemid和itemidlist
windows shell的乙個功能在於管理並提供方法訪問系統中的眾多對像,這些對像包括了檔案,網路上的計算機,控制面板程式,**站等等,為了識別每乙個對像,windows shell使用了item id來表示它們,而iten id lists用來表示乙個對像的路徑。所以,itemid和itemidlist的關係類似於檔名和路徑的關係。如果只對檔案系統而言的話,itemidlist可以看成是路徑的另一中表示法,windows shell也提供了函式來進行轉化。
bool shgetpathfromidlist( lpcitemidlist pidl, lpstr pszpath )
這個函式將乙個itemlist轉換成檔案系統中的路徑。返回值
shbrowseforfolder的返回值也是乙個指向itemidlist的指標。這個itemidlist正式表示了使用者所選擇的資料夾。如上所述,通過shgetpathfromidlist,就可以獲得乙個資料夾path的字串。
我自己程式中使用到該方法的核心**如下:
要注意的是返回的指標必須由應用程式自己來釋放。並且,由於shbrowseforfolder是通貴呼叫imalloc inte***ce來分配memory,所以,也必須通過這個inte***ce來釋放。
// 防止記憶體洩漏,要使用imalloc介面
imalloc* pmalloc;
if ( shgetmalloc( &pmalloc ) != noerror )
pmalloc->free( pitemidlist );
if ( pmalloc )
pmalloc->release();
}
在MFC中使用Tab Control
說實話,我剛開始看見tab control的時候,覺得很簡單。哪知道用了一下,才發現自己錯了。要用好它,還是需要一些技巧的。經過網上搜尋資料,以及我自己的摸索,把一些要點記錄在這裡。tab control的執行效果有點像property sheet,但兩者還是有一些區別。我的理解就是property...
在MFC中使用printf
將以下 加入到對話方塊初始化函式oninitdialog 中allocconsole 控制台除錯視窗開啟 freopen conout w stdout 開啟中文控制台輸出支援在退出函式中加入以下 freeconsole 釋放控制台資源如果使用的是右上角預設的叉號退出介面,可以直接新增以下 void...
在靜態庫中使用MFC
在專案的配置屬性中配置 mfc的使用 時,選項的區別 如果選擇 在共享dll中使用mfc 的話,編譯後的程式中不包含mfc庫,所以檔案會比較小,但是如果程式直接移到乙個沒有安裝過mfc的機器上時,可能會導致找不到mfc的dll,如果選擇 靜態庫中使用mfc 那麼編譯後的程式就直接包含了呼叫mfc的部...