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

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

 

使用SHBrowseForFolder函數打開文件目錄對話框

 

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

關于SHBrowseForFolder函數和簡單使用

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

typedef struct _browseinfo {

     HWND hwndOwner;            // 父窗口句柄

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

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

     LPCTSTR lpszTitle;         // 顯示位于對話框左上部的標題

     UINT ulFlags;              // 指定對話框的外觀和功能的標志

     BFFCALLBACK lpfn;          // 處理事件的回調函數

     LPARAM lParam;             // 應用程序傳給回調函數的參數

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

} BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO

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

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

在這里需要注意的是,這個返回值是通過調用IMalloc Interface來分配內存的,函數并不負責釋放內存操作,所以我們在使用完這個返回值之后,必須通過IMalloc Interface來釋放內存。

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

       BROWSEINFO bi;

       char Buffer[MAX_PATH];

       //初始化入口參數bi開始

       bi.hwndOwner = NULL;

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

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

       bi.lpszTitle = "選擇Sis目標文件路徑";

       bi.ulFlags = BIF_EDITBOX;//帶編輯框的風格

       bi.lpfn = NULL;

       bi.lParam = 0;

       bi.iImage=IDR_MAINFRAME;

       //初始化入口參數bi結束

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

       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();

       }

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

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

由于我在實際工作中需要的就是一個有新建文件夾功能且指定初始選中路徑的瀏覽文件夾對話框,就把這個需求當做擴展應用吧,由于對話框樣式由ulFlags標記確定,而在系統頭文件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,通常網絡上給出宏為BIF_NEWDIALOGSTYLEBIF_USENEWUI,由于不知道在具體哪個頭文件中,所以我們可以在代碼中自己定義一下這兩個宏,具體如下

#define BIF_NEWDIALOGSTYLE   0x40

#define BIF_USENEWUI (BIF_NEWDIALOGSTYLE|BIF_EDITBOX)

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

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

#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];

       //初始化入口參數bi開始

       bi.hwndOwner = NULL;

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

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

       bi.lpszTitle = "選擇Sis目標文件路徑";

       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;

       //初始化入口參數bi結束

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

       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 閱讀(18829) 評論(0)  編輯 收藏 引用 所屬分類: MFC相關技術

常用鏈接

留言簿(13)

隨筆分類

個人其它博客

基礎知識鏈接

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲激情图片小说视频| 久久青草欧美一区二区三区| 黄色日韩网站| 久久国产精品72免费观看| 久久久一本精品99久久精品66| 一区二区三区在线视频免费观看| 久久亚洲高清| 一区二区三区欧美在线| 麻豆成人在线| 国产亚洲欧美日韩日本| 欧美精品在线观看91| 欧美一区免费| 日韩一级精品视频在线观看| 欧美成人免费在线| 久久久久久自在自线| 国产欧美一区二区三区久久人妖| 欧美不卡一卡二卡免费版| 亚洲欧美在线网| 亚洲视频在线观看一区| 亚洲黄页视频免费观看| 免费久久99精品国产自| 亚洲综合好骚| 亚洲一区www| 在线中文字幕日韩| 日韩一级欧洲| 91久久在线播放| 在线看不卡av| 欧美久色视频| 欧美国产高清| 欧美**字幕| 欧美成人中文| 欧美精品日韩www.p站| 欧美阿v一级看视频| 美女网站久久| 久久精品亚洲精品国产欧美kt∨| 欧美一区二区三区四区高清| 欧美一级片久久久久久久| 亚洲视频一起| 亚洲欧美日韩综合| 亚洲激情偷拍| 在线视频日韩精品| 正在播放欧美视频| 欧美亚洲网站| 久久人人超碰| 欧美黄免费看| 国产精品免费看| 国产一区二区三区的电影| 国产日韩精品视频一区| 欧美1区3d| 蜜臀99久久精品久久久久久软件 | 国产精品高潮粉嫩av| 欧美怡红院视频一区二区三区| 香蕉久久夜色精品国产| 久久久久久久久一区二区| 嫩草国产精品入口| 亚洲人在线视频| 亚洲午夜久久久久久久久电影网| 西瓜成人精品人成网站| 久久夜色精品国产欧美乱| 欧美精品一线| 狠狠色丁香久久综合频道 | 性色av一区二区怡红| 亚洲欧美日本精品| 狼人天天伊人久久| 日韩视频在线一区二区| 香蕉久久国产| 欧美激情一区二区三区全黄| 国产伦一区二区三区色一情| 国内精品一区二区| 99精品国产福利在线观看免费| 亚洲欧美一区二区三区久久| 久久综合综合久久综合| 一本色道久久综合精品竹菊| 久久久亚洲国产天美传媒修理工| 欧美激情第五页| 国产亚洲视频在线| 亚洲素人一区二区| 欧美激情一区二区三级高清视频 | 亚洲精品久久久久久久久久久久| 亚洲午夜av在线| 免费短视频成人日韩| 亚洲精品国产精品乱码不99按摩| 亚洲欧美激情诱惑| 欧美精品在线观看91| 在线观看亚洲精品| 欧美一区免费视频| 久久免费高清| 亚洲欧美精品一区| 欧美日韩亚洲在线| 日韩视频精品| 欧美激情一区二区三区在线视频观看| 亚洲午夜久久久久久久久电影院 | 蜜桃av一区二区三区| 欧美经典一区二区三区| 黄色一区二区在线观看| 亚洲免费在线播放| 亚洲经典在线看| 一本久道久久综合婷婷鲸鱼| 久久亚洲欧美| 依依成人综合视频| 久久福利视频导航| 亚洲欧美日韩国产精品| 一区二区欧美亚洲| 欧美日韩在线播放三区| 久久久久亚洲综合| 欧美日韩蜜桃| 欧美成人综合| 国产日韩在线看| 亚洲人成在线观看网站高清| 国产亚洲福利一区| 日韩视频中文字幕| 亚洲高清在线视频| 香港成人在线视频| 亚洲欧美日韩人成在线播放| 免费视频一区二区三区在线观看| 欧美一级精品大片| 欧美日韩亚洲成人| 欧美激情区在线播放| 国产一区二区三区的电影| 一区二区三区四区五区精品视频| 18成人免费观看视频| 欧美主播一区二区三区| 午夜综合激情| 国产精品一区一区| 在线亚洲免费| 中文在线一区| 欧美日韩另类国产亚洲欧美一级| 亚洲二区免费| 狠狠色狠色综合曰曰| 午夜精品一区二区三区电影天堂| 亚洲私人影院在线观看| 欧美日韩的一区二区| 欧美成人精品在线视频| 国产视频久久久久| 亚洲欧美日韩在线不卡| 欧美一区二区三区在线看 | 欧美伊人精品成人久久综合97 | 久久精品日韩欧美| 久久九九热免费视频| 国产伦精品一区二区三区视频孕妇| 一区二区三区国产| 亚洲小少妇裸体bbw| 国产精品igao视频网网址不卡日韩 | 欧美日韩国产小视频在线观看| 亚洲电影在线免费观看| 亚洲人成在线观看网站高清| 美玉足脚交一区二区三区图片| 美女尤物久久精品| 亚洲国产精品久久久久秋霞影院| 巨乳诱惑日韩免费av| 欧美亚洲免费电影| 欧美亚洲免费| 国产精品乱码一区二三区小蝌蚪 | 久久国内精品视频| 久久全球大尺度高清视频| 国内外成人免费激情在线视频| 久久国产日本精品| 欧美国产日韩二区| 一区二区三区高清在线| 国产精品久久久久久久久果冻传媒 | 久久精品国产欧美激情| 黄色小说综合网站| 欧美成人精品不卡视频在线观看| 亚洲激情婷婷| 久久国产加勒比精品无码| 狠狠色狠狠色综合日日五| 欧美高清不卡在线| 午夜在线不卡| 亚洲电影免费在线| 中国成人亚色综合网站| 国产一区二区0| 美玉足脚交一区二区三区图片| 99精品欧美一区二区三区| 午夜精品久久久久久| 韩日在线一区| 欧美激情一区二区三区四区| 亚洲一品av免费观看| 米奇777在线欧美播放| 中文av一区特黄| 国内不卡一区二区三区| 久久免费视频在线| 亚洲精品在线三区| 欧美成人黄色小视频| 亚洲欧美欧美一区二区三区| 影音先锋亚洲电影| 欧美日韩亚洲一区二区三区在线 | 欧美福利在线| 久久成人18免费网站| 一区二区三区高清不卡| 欧美成人伊人久久综合网| 欧美伊人久久久久久午夜久久久久| 亚洲三级电影在线观看| 国产欧美一区二区精品性| 欧美日韩亚洲一区二区三区四区| 久久久久www| 亚洲男人第一av网站| 亚洲精品视频二区| 亚洲国产欧美一区二区三区丁香婷| 久久久蜜桃一区二区人| 欧美亚洲综合在线|