閒話UI 選擇目錄對話方塊

2021-04-02 10:30:18 字數 1260 閱讀 3473

這用shbrowserforfolder這個windows api可以實現。

winshellapi lpitemidlist winapi shbrowseforfolder(

lpbrowseinfo lpbi 

);在delphi中有下面這個函式可以使用:

function selectdirectory(const caption: string; const root: widestring; out directory: string): boolean; overload; (1)

但我更喜歡用這個(在一些簡單的場合):

function selectdirectory(var directory: string; options: tselectdiropts; helpctx: longint): boolean; overload; (2)

但很多朋友不願意,認為後面這個太難看。但在我看來,第乙個對話方塊在可用性上是存在很大問題的:

* 不能設定(並展開到)預設的選擇

* 不能手工輸入,這使得要進入乙個層次深一點的目錄非常麻煩

* 不能新建目錄

其實就shbrowserforfolder這個api而言,第乙個問題是很容易解決的,不過m$提供的是一種挺麻煩的方式: 你必須得編寫**函式(browsecallbackproc),在bffm_initialized訊息裡面傳送bffm_setselection訊息。(我覺得delphi在提供selectdirectory(1)這個函式時就應該包裝這個功能。)

對於第二個問題, 如果你的shell32.dll版本大於或等於4.71, 就可以有個手工輸入路徑的編輯框了, 只要在flags中包含bif_editbox;

對於第三個問題, 如果你的shell32.dll版本大於或等於5.0, 就可以有個"新建資料夾"按鈕了, 只要在flags中包含bif_newdialogstyle (而且這個版本有其他一些特性: 對話方塊大小可調, 目錄可拖動, 目錄有context menu(這可以帶來其他一些功能)。

btw:

1. lazarus中有tselectdirectorydialog控制項,功能上等於delphi的selectdirectory(1)函式加上設定預設目錄功能。

2. dfs套件(torry.net上的資訊)裡面有乙個dfsbrowsedirectorydlg控制項,支援shell32 5.0的newdialogstyle,對這個功能包裝得比較完整(其實上面的第三個圖用得就是這個控制項),要新增新版本的特性(比如6.0的bif_notranslatetargets等)也很容易。

選擇目錄對話方塊和選擇檔案對話方塊

在mfc程式設計中經常會需要用到選擇目錄和選擇檔案的介面,以下總結一下本人常用的這兩種對話方塊的生成方法 選擇目錄對話方塊 選擇目錄按鈕 void cdcpackerdlg onbnclickeddecgen else afxmessagebox 無效的目錄,請重新選擇 選擇檔案對話方塊 cstri...

MFC 選擇目錄對話方塊和選擇檔案對話方塊

在mfc程式設計中經常會需要用到選擇目錄和選擇檔案的介面,以下總結一下本人常用的這兩種對話方塊的生成方法 選擇目錄對話方塊 void cdcpackerdlg onbnclickeddecgen else afxmessagebox 無效的目錄,請重新選擇 選擇檔案對話方塊 選擇目錄按鈕 cstri...

MFC 選擇目錄對話方塊和選擇檔案對話方塊

在mfc程式設計中經常會需要用到選擇目錄和選擇檔案的介面,以下總結一下本人常用的這兩種對話方塊的生成方法 選擇目錄對話方塊 選擇目錄按鈕 void cdcpackerdlg onbnclickeddecgen else afxmessagebox 無效的目錄,請重新選擇 選擇檔案對話方塊 cstri...