青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

franksunny的個人技術(shù)空間
獲得人生中的成功需要的專注與堅持不懈多過天才與機會。 ——C.W. Wendte

 

使用SHBrowseForFolder函數(shù)打開文件目錄對話框

 

自從第一份工作辭職后,差不多三年多沒有再搞MFC了,對于微軟的Windows桌面開發(fā)真的淡忘了,這次接到一個任務(wù),需要開發(fā)個小工具,雖然任務(wù)很小,但是在一個如何打開文件目錄對話框的小問題上卡了下,雖然通過網(wǎng)絡(luò)找到了解決方法,但是網(wǎng)上七拼八湊的文章太多,看的有點費時,所以就抽時間小結(jié)一下,雖然也是簡單使用,沒有太多擴展,就當(dāng)給自己Mark一下吧。

關(guān)于SHBrowseForFolder函數(shù)和簡單使用

打開文件目錄對話框,我找到的方法就是使用SHBrowseForFolder函數(shù),這個函數(shù)的原型是LPITEMIDLIST SHBrowseForFolder(LPBROWSEINFO lpbi)。函數(shù)很簡單,就一個返回值和一個參數(shù)。參數(shù)簡單羅列如下

typedef struct _browseinfo {

     HWND hwndOwner;            // 父窗口句柄

     LPCITEMIDLIST pidlRoot;    // 要顯示的文件目錄對話框的根(Root)

     LPTSTR pszDisplayName;     // 保存被選取的文件夾路徑的緩沖區(qū)

     LPCTSTR lpszTitle;         // 顯示位于對話框左上部的標(biāo)題

     UINT ulFlags;              // 指定對話框的外觀和功能的標(biāo)志

     BFFCALLBACK lpfn;          // 處理事件的回調(diào)函數(shù)

     LPARAM lParam;             // 應(yīng)用程序傳給回調(diào)函數(shù)的參數(shù)

     int iImage;                // 文件夾對話框的圖片索引

} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO

一般而言父窗口句柄(hwndOwner)和根(pidlRoot)設(shè)置為Null就可以了,pszDisplayName設(shè)定一塊MAX_PATH大小的緩沖區(qū),跟顯示相關(guān)的參數(shù)就是對話框提示標(biāo)題(lpszTitle)、對話框樣式(ulFlags)、設(shè)定對話框的缺省路徑的操作(lpfnlParam)以及對話框任務(wù)欄上顯示的圖標(biāo)(iImage)。

由于返回值LPITEMIDLIST是一個指向ITEMIDLIST的指針,這個ITEMIDLIST涉及到Windows Shell中關(guān)于管理諸如文件、網(wǎng)絡(luò)上的計算機、控制面板程序、回收站等等對象的知識點,Windows Shell為了識別具體的每一個對象,就使用了ITEMID來唯一識別和區(qū)分,而ITEMIDLIST就是一個完整的對象路徑。顯然這個函數(shù)可以用來瀏覽非文件對象,比如局域網(wǎng)內(nèi)的電腦等等,在這里這個LPITEMIDLIST返回的對象路徑是一個文件夾的路徑,Windows提供了一個函數(shù)BOOL SHGetPathFromIDList(LPCITEMIDLIST pidl, LPSTR pszPath)來實現(xiàn)從對象路徑轉(zhuǎn)化為文件夾路徑。

在這里需要注意的是,這個返回值是通過調(diào)用IMalloc Interface來分配內(nèi)存的,函數(shù)并不負(fù)責(zé)釋放內(nèi)存操作,所以我們在使用完這個返回值之后,必須通過IMalloc Interface來釋放內(nèi)存。

下面給出一段最簡單的使用代碼

       BROWSEINFO bi;

       char Buffer[MAX_PATH];

       //初始化入口參數(shù)bi開始

       bi.hwndOwner = NULL;

       bi.pidlRoot =NULL;//初始化制定的root目錄很不容易

       bi.pszDisplayName = Buffer;//此參數(shù)如為NULL則不能顯示對話框

       bi.lpszTitle = "選擇Sis目標(biāo)文件路徑";

       bi.ulFlags = BIF_EDITBOX;//帶編輯框的風(fēng)格

       bi.lpfn = NULL;

       bi.lParam = 0;

       bi.iImage=IDR_MAINFRAME;

       //初始化入口參數(shù)bi結(jié)束

       LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//調(diào)用顯示選擇對話框

       if(pIDList)

       {

          SHGetPathFromIDList(pIDList, Buffer);

          //取得文件夾路徑到Buffer

          CString m_cSisDes = Buffer;//將路徑保存在一個CString對象里

       }

       UpdateData(FALSE);

 

       // free memory used     

    IMalloc * imalloc = 0;

       if (SUCCEEDED(SHGetMalloc(&imalloc)))

       {

              imalloc->Free (pIDList);

              imalloc->Release();

       }

如上代碼可以顯示一個最簡單的帶編輯框的其實選中對象為我的電腦的瀏覽文件夾對話框。

創(chuàng)建一個可以新建文件夾且指定選中初始路徑的瀏覽文件夾對話框

由于我在實際工作中需要的就是一個有新建文件夾功能且指定初始選中路徑的瀏覽文件夾對話框,就把這個需求當(dāng)做擴展應(yīng)用吧,由于對話框樣式由ulFlags標(biāo)記確定,而在系統(tǒng)頭文件SHLOBJ.h頭文件中給出的對話框樣式只有如下幾種

// Browsing for directory.

#define BIF_RETURNONLYFSDIRS   0x0001  // For finding a folder to start document searching

#define BIF_DONTGOBELOWDOMAIN  0x0002  // For starting the Find Computer

#define BIF_STATUSTEXT         0x0004

#define BIF_RETURNFSANCESTORS  0x0008

#define BIF_EDITBOX            0x0010

#define BIF_VALIDATE           0x0020   // insist on valid result (or CANCEL)

 

#define BIF_BROWSEFORCOMPUTER  0x1000  // Browsing for Computers.

#define BIF_BROWSEFORPRINTER   0x2000  // Browsing for Printers

#define BIF_BROWSEINCLUDEFILES 0x4000  // Browsing for Everything

沒有滿足我需求的樣式,通過csdn查到其實有一個支持新建文件夾功能的樣式值0x40,通常網(wǎng)絡(luò)上給出宏為BIF_NEWDIALOGSTYLEBIF_USENEWUI,由于不知道在具體哪個頭文件中,所以我們可以在代碼中自己定義一下這兩個宏,具體如下

#define BIF_NEWDIALOGSTYLE   0x40

#define BIF_USENEWUI (BIF_NEWDIALOGSTYLE|BIF_EDITBOX)

這樣一來第一個問題解決了,那么如何讓對話框有初始選中的文件夾路徑呢,我起初想著通過pidlRoot,結(jié)果撞了一鼻子灰,原來設(shè)定初始選中文件夾路徑,是通過那個神奇的回調(diào)函數(shù)來實現(xiàn),換句話來說你調(diào)用SHBrowseForFolder也就好比你調(diào)用了CDialog:: DoModal()函數(shù),具體這個對話框里面的類似初始化,選擇等操作的不同實現(xiàn)就通過lpfn這個回調(diào)函數(shù)來實現(xiàn)了。

下面給出這個簡單擴展的代碼

#define BIF_NEWDIALOGSTYLE   0x40

 

int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)  

{

       if(uMsg == BFFM_INITIALIZED)

       {  

              SendMessage(hwnd, BFFM_SETSELECTION, TRUE, lpData);

       }

       return 0;  

}

 

void CSisAppendMidDlg::OnButtonSisdes()

{

       // TODO: Add your control notification handler code here

       BROWSEINFO bi;

       char Buffer[MAX_PATH];

       //初始化入口參數(shù)bi開始

       bi.hwndOwner = NULL;

       bi.pidlRoot =NULL;//初始化制定的root目錄很不容易

       bi.pszDisplayName = Buffer;//此參數(shù)如為NULL則不能顯示對話框

       bi.lpszTitle = "選擇Sis目標(biāo)文件路徑";

       bi.ulFlags = BIF_EDITBOX|BIF_NEWDIALOGSTYLE;  

       CFileFind   finder;

       if(finder.FindFile(m_cSisDes)==FALSE)

       {

              bi.lParam =0;

              bi.lpfn = NULL;

       }

       else

       {

              bi.lParam = (long)(m_cSisDes.GetBuffer(m_cSisDes.GetLength()));//初始化路徑,形如(_T("c:\\Symbian"));

              bi.lpfn = BrowseCallbackProc;

       }

       finder.Close();

       bi.iImage=IDR_MAINFRAME;

       //初始化入口參數(shù)bi結(jié)束

       LPITEMIDLIST pIDList = SHBrowseForFolder(&bi);//調(diào)用顯示選擇對話框

       if(pIDList)

       {

          SHGetPathFromIDList(pIDList, Buffer);

          //取得文件夾路徑到Buffer

          m_cSisDes = Buffer;//將路徑保存在一個CString對象里

       }

       UpdateData(FALSE);

 

       // free memory used     

    IMalloc * imalloc = 0;

       if ( SUCCEEDED(SHGetMalloc( &imalloc)))

       {

              imalloc->Free (pIDList);

              imalloc->Release();

       }

 

}

好了,簡單擴展就到這里為止,至于很多大神需要再做更深一步的擴展,那就沿著這個思路走下去就可以了。畢竟我目前也就走到這一步了,呵呵。

 

posted on 2010-12-30 18:35 frank.sunny 閱讀(18817) 評論(0)  編輯 收藏 引用 所屬分類: MFC相關(guān)技術(shù)

常用鏈接

留言簿(13)

隨筆分類

個人其它博客

基礎(chǔ)知識鏈接

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美激情一区二区三区四区| 久久精品国产一区二区三区| 一区二区三区欧美激情| 国产精品色网| 亚洲第一级黄色片| 欧美四级剧情无删版影片| 亚洲激情在线播放| 亚洲一区在线视频| 亚洲美女黄色片| 欧美在线免费看| 亚洲一区免费网站| 欧美激情中文字幕在线| 久久性天堂网| 国产欧美精品在线播放| 亚洲美女少妇无套啪啪呻吟| 韩国三级电影一区二区| 亚洲一区久久久| 日韩一级精品| 欧美成人黑人xx视频免费观看| 欧美自拍丝袜亚洲| 国产精品vvv| 亚洲理论在线| 99国产精品国产精品久久 | 亚洲国产天堂久久国产91| 亚洲欧美一区二区三区极速播放| 亚洲电影第1页| 亚洲永久免费观看| 亚洲一区综合| 国产精品成人v| 99国产精品视频免费观看| 99精品视频免费观看视频| 午夜欧美理论片| 久久国产手机看片| 欧美美女视频| 亚洲精品美女久久7777777| 亚洲国产另类久久精品| 亚洲一区二区三区在线| 亚洲小视频在线| 国产精品高精视频免费| 亚洲视屏一区| 午夜免费日韩视频| 国产欧美精品| 欧美一区二区三区久久精品| 久久精品国产免费| 国产小视频国产精品| 欧美一区国产二区| 看片网站欧美日韩| 亚洲福利视频网站| 女人香蕉久久**毛片精品| 亚洲国产裸拍裸体视频在线观看乱了中文 | 午夜精品久久99蜜桃的功能介绍| 欧美精品国产精品日韩精品| 亚洲激情专区| 一区二区三区国产在线| 国产精品久久久久91| 亚洲一本大道在线| 久久久久久日产精品| 永久久久久久| 欧美精品一区二区三区蜜桃| 日韩亚洲在线| 久久精品国产精品亚洲| 在线免费一区三区| 欧美精品三级日韩久久| av成人天堂| 久久精品一本| 亚洲精品小视频| 国产精品久久久一区麻豆最新章节| 99国产精品久久久| 久久久久.com| 99av国产精品欲麻豆| 国产精品一页| 欧美成人精品影院| 亚洲自拍16p| 欧美激情片在线观看| 亚洲女爱视频在线| 亚洲高清毛片| 欧美精品自拍| 亚洲欧美成人在线| 久久只精品国产| 日韩视频永久免费观看| 国产精品激情偷乱一区二区∴| 久久国产精品一区二区| 99精品免费网| 久久精品一区二区三区四区| 99热精品在线| 一区二区视频在线观看| 欧美性猛交xxxx乱大交退制版| 久久久噜久噜久久综合| 亚洲一区二区av电影| 亚洲大胆女人| 久久青草欧美一区二区三区| 亚洲一区二区三区激情| 亚洲欧洲日韩在线| 国内精品一区二区三区| 国产精品国产三级国产专播品爱网 | 亚洲激情电影在线| 久久久久综合| 欧美一级视频精品观看| 在线播放中文一区| 欧美三级视频| 久久综合图片| 亚洲午夜日本在线观看| 在线亚洲免费| 日韩特黄影片| 亚洲啪啪91| 亚洲电影激情视频网站| 免费91麻豆精品国产自产在线观看| 亚洲一区二区视频在线| 一本久道久久综合婷婷鲸鱼| 亚洲欧洲一区二区在线观看 | 国产精品一区毛片| 国产精品青草久久| 欧美性事在线| 国产精品扒开腿做爽爽爽软件 | 欧美四级剧情无删版影片| 在线一区二区三区四区| 亚洲午夜精品久久| 99热免费精品| 亚洲伦理自拍| 亚洲乱码视频| aⅴ色国产欧美| 亚洲最新在线视频| 一区二区三区成人精品| 一区二区三区欧美成人| 制服丝袜亚洲播放| 亚洲男人av电影| 午夜精品短视频| 欧美一区二区精品久久911| 性做久久久久久免费观看欧美| 午夜精品久久久久久久久| 午夜精品成人在线| 欧美专区中文字幕| 久久这里有精品视频| 久久激五月天综合精品| 午夜精品成人在线视频| 亚洲五月婷婷| 亚洲亚洲精品三区日韩精品在线视频 | 国产日韩一区欧美| 狠狠色丁香婷婷综合久久片| 精品91视频| 亚洲日产国产精品| 亚洲午夜精品福利| 午夜一区二区三区不卡视频| 久久精品道一区二区三区| 免播放器亚洲| 亚洲伦理精品| 欧美在线视频二区| 欧美成人自拍| 国产精品大片wwwwww| 国产最新精品精品你懂的| 亚洲黄色视屏| 亚洲一线二线三线久久久| 久久久亚洲成人| 亚洲欧洲精品一区二区| 亚洲免费在线观看| 另类av导航| 国产精品视频免费在线观看| 影音先锋成人资源站| 亚洲深夜福利| 久久人人爽人人爽爽久久| 亚洲欧洲日本专区| 亚洲一区在线看| 欧美在线观看视频在线| 老司机午夜免费精品视频| 美女视频网站黄色亚洲| 欧美日韩国产限制| 国产精品永久免费| 18成人免费观看视频| 久久精品国产亚洲精品| 欧美成人久久| 亚洲专区在线| 欧美日韩极品在线观看一区| 激情小说另类小说亚洲欧美| 在线视频你懂得一区 | 国产伦一区二区三区色一情| 99视频精品全部免费在线| 久久久免费观看视频| 一本久道久久综合中文字幕| 美国成人直播| 狠狠色综合播放一区二区| 亚洲欧美日韩爽爽影院| 亚洲欧洲精品一区二区三区波多野1战4| 亚洲欧美成人一区二区三区| 欧美日韩亚洲综合一区| 亚洲欧洲久久| 欧美成人资源网| 欧美有码在线视频| 欧美人与禽性xxxxx杂性| 国产欧美日韩激情| 亚洲免费成人av| 久久精品视频在线看| 欧美激情久久久久| 在线视频一区观看| 美女999久久久精品视频| 国产精品尤物| 亚洲最新色图| 久久久美女艺术照精彩视频福利播放| 9人人澡人人爽人人精品| 亚洲国产综合在线看不卡| 亚洲精品美女91|