第276章 フォルダ選択ダイアログを出す


前回までのプログラムでは解凍先のフォルダを選択するダイアログは 旧式のものでした。今回は今風のものに変えてみます。



左の図のようなダイアログはよく見かけると思います。 ツリー表示の上に1行のエディットコントロールが見えますが、 これはオプションです。また、「現在XXが選択されています」というのは ステータスエリアと呼ばれるオプションです。



では、このようなダイアログはどのように呼び出せばよいのでしょうか。 これは、シェル関数を使います。(シェル関数はSHで始まることが多いですが 例外もたくさんあります。)

LPITEMIDLIST SHBrowseForFolder( LPBROWSEINFO lpbi );

フォルダー選択ダイアログボックスを表示します。

lpbiには、BROWSEINFO構造体へのポインタを指定します。

typedef struct _browseinfo { HWND hwndOwner; LPCITEMIDLIST pidlRoot; LPTSTR pszDisplayName; LPCTSTR lpszTitle; UINT ulFlags; BFFCALLBACK lpfn; LPARAM lParam; int iImage; } BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;

hwndOwnerには、ダイアログボックスのオーナーを指定します。

pidlRootには、ITEMIDLIST構造体へのポインタを指定します。ITEMIDLIST 構造体にはブラウジングの最初のフォルダを指定します。これは、NULLを指定する こともできます。この場合デスクトップが選択されます。

pszDisplayNameには、ユーザーが選択したフォルダの名前を受け取るバッファの ポインタを指定します。

lpszTitleには、タイトルを指定します。

ulFlagsには、ダイアログボックスのオプションを選択します。0または 次のフラグの組み合わせを指定します

BIF_BROWSEFORCOMPUTERコンピュータのみを返します。それ以外を 選択しているときはOKボタンが使えません。
BIF_BROWSEFORPRINTER プリンタのみを返します。それ以外を 選択しているときはOKボタンは使えません。
BIF_BROWSEINCLUDEFILESファイルも表示します。
BIF_BROWSEINCLUDEURLSURLも表示します。BIF_USENEWUI と BIF_BROWSEINCLUDEFILES も同時にセットされていないといけません。
BIF_DONTGOBELOWDOMAINドメイン以下のネットワークフォルダを含みません。
BIF_EDITBOXエディットコントロールを含みます。
BIF_NEWDIALOGSTYLE新しいスタイルのダイアログボックスを使います。 サイズ変更やその他の機能が付加されています。(詳細はヘルプ参照)
BIF_RETURNFSANCESTORSancestorのみを返します。ancestorとは、ルートフォルダ以下の サブフォルダを指します。
BIF_RETURNONLYFSDIRSファイルシステムのディレクトリのみを返します。
BIF_SHAREABLEリモートシステムの共有リソースのみを表示します。
BIF_STATUSTEXTダイアログボックスにステータスエリアを含みます。
BIF_USENEWUIBIF_EDITBOX | BIF_NEWDIALOGSTYLEと同じです。
BIF_VALIDATEユーザーがエディットコントロールに無効な名前をタイプしたら BrowseCallbackProcにBFFM_VALIDATEFAILEDメッセージを送ります。

以上のフラグが使用可能かどうかはShell32.dllのバージョンに依存します。詳しくはヘルプを 参照してください。

lpfnには、ダイアログボックスでイベントが起こったときにダイアログボックスが呼び出す アプリケーション定義の関数のアドレスを指定します。NULLも指定できます。

lParamには、プロシージャに渡すアプリケーション定義データを指定します(もしあれば)。

iImageには、選択されたフォルダに関連づけられたイメージを受け取る変数を指定します。イメージは システムイメージリストのインデックスです。

この構造体はShell32.dllのバージョンが4.00以降でないと使えません。

さて、lpfnで指定したプロシージャは次のようなものでなくてはいけません。 (もちろん関数の名前は何でもよい)

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

hwndは、ダイアログボックスのウィンドウハンドルです。この関数から、ダイアログボックスに 次のメッセージを送ることができます。

BFFM_ENABLEOKダイアログボックスのOKボタンを使用可能、不能にします。 lParamをTRUEにするかFALSEにする事でボタン使用の可否を設定します。
BFFM_SETSELECTION特定のフォルダを選択します。フォルダはPIDLで指定し、lParam で送ります。この時wParamはFALSEにします。
もしくはフォルダを文字列として表しlParamで送ります。この時wParamはTRUEにします。
BFFM_SETSTATUSTEXTステータステキストをセットします。

uMsgは、イベントの値で、次の中の一つです。

BFFM_INITIALIZEDダイアログボックスの初期化が終わりました。lParamは0です。
BFFM_SELCHANGEDフォルダの選択が変化しました。lParamには新しく選択された フォルダのアイテムIDが入ります。
BFFM_VALIDATEFAILEDユーザーがエディットボックスに無効な名前をタイプしました。 lParamは無効な名前を含んでいるバッファのアドレスを示します。

lParamは、uMsgの副メッセージです。

lpDataは、BROWSEINFO構造体のlParamメンバで示されるアプリケーション定義のデータです。

さて、SHBrowseForFolder関数の戻り値であるLPITEMIDLISTとは何でしょうか。 これは、ITEMIDLIST構造体へのポインタです。

typedef struct _ITEMIDLIST { SHITEMID mkid; } ITEMIDLIST, * LPITEMIDLIST; typedef const ITEMIDLIST * LPCITEMIDLIST;

mkidはアイテム識別子のリストです。

この構造体のポインタはPIDLと呼ばれ、シェル名前空間のオブジェクトの識別子として使われます。 PIDLを使用するにはIMallocインターフェイスを使用する必要があります。詳細は省略しますが このインターフェイスのポインタを取得するにはSHGetMallocシェル関数を使用します。

HRESULT SHGetMalloc( LPMALLOC *ppMalloc );

LPMALLOCは、IMallocインターフェイスへのポインタです。 使い方等はサンプルプログラムで解説します。

さて、今回は抽象的な解説になってしまいましたが、実際的な使い方は次章で解説します。


[SDK第3部 Index] [総合Index] [Previous Chapter] [Next Chapter]

Update 26/Jun/2000 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。