左の図のようなダイアログはよく見かけると思います。
ツリー表示の上に1行のエディットコントロールが見えますが、
これはオプションです。また、「現在XXが選択されています」というのは
ステータスエリアと呼ばれるオプションです。
では、このようなダイアログはどのように呼び出せばよいのでしょうか。
これは、シェル関数を使います。(シェル関数はSHで始まることが多いですが
例外もたくさんあります。)
フォルダー選択ダイアログボックスを表示します。LPITEMIDLIST SHBrowseForFolder( LPBROWSEINFO lpbi );
lpbiには、BROWSEINFO構造体へのポインタを指定します。
hwndOwnerには、ダイアログボックスのオーナーを指定します。typedef struct _browseinfo { HWND hwndOwner; LPCITEMIDLIST pidlRoot; LPTSTR pszDisplayName; LPCTSTR lpszTitle; UINT ulFlags; BFFCALLBACK lpfn; LPARAM lParam; int iImage; } BROWSEINFO, *PBROWSEINFO, *LPBROWSEINFO;
pidlRootには、ITEMIDLIST構造体へのポインタを指定します。ITEMIDLIST 構造体にはブラウジングの最初のフォルダを指定します。これは、NULLを指定する こともできます。この場合デスクトップが選択されます。
pszDisplayNameには、ユーザーが選択したフォルダの名前を受け取るバッファの ポインタを指定します。
lpszTitleには、タイトルを指定します。
ulFlagsには、ダイアログボックスのオプションを選択します。0または 次のフラグの組み合わせを指定します
BIF_BROWSEFORCOMPUTER | コンピュータのみを返します。それ以外を 選択しているときはOKボタンが使えません。 |
BIF_BROWSEFORPRINTER | プリンタのみを返します。それ以外を 選択しているときはOKボタンは使えません。 |
BIF_BROWSEINCLUDEFILES | ファイルも表示します。 |
BIF_BROWSEINCLUDEURLS | URLも表示します。BIF_USENEWUI と BIF_BROWSEINCLUDEFILES も同時にセットされていないといけません。 |
BIF_DONTGOBELOWDOMAIN | ドメイン以下のネットワークフォルダを含みません。 |
BIF_EDITBOX | エディットコントロールを含みます。 |
BIF_NEWDIALOGSTYLE | 新しいスタイルのダイアログボックスを使います。 サイズ変更やその他の機能が付加されています。(詳細はヘルプ参照) |
BIF_RETURNFSANCESTORS | ancestorのみを返します。ancestorとは、ルートフォルダ以下の サブフォルダを指します。 |
BIF_RETURNONLYFSDIRS | ファイルシステムのディレクトリのみを返します。 |
BIF_SHAREABLE | リモートシステムの共有リソースのみを表示します。 |
BIF_STATUSTEXT | ダイアログボックスにステータスエリアを含みます。 |
BIF_USENEWUI | BIF_EDITBOX | BIF_NEWDIALOGSTYLEと同じです。 |
BIF_VALIDATE | ユーザーがエディットコントロールに無効な名前をタイプしたら BrowseCallbackProcにBFFM_VALIDATEFAILEDメッセージを送ります。 |
以上のフラグが使用可能かどうかはShell32.dllのバージョンに依存します。詳しくはヘルプを 参照してください。
lpfnには、ダイアログボックスでイベントが起こったときにダイアログボックスが呼び出す アプリケーション定義の関数のアドレスを指定します。NULLも指定できます。
lParamには、プロシージャに渡すアプリケーション定義データを指定します(もしあれば)。
iImageには、選択されたフォルダに関連づけられたイメージを受け取る変数を指定します。イメージは システムイメージリストのインデックスです。
この構造体はShell32.dllのバージョンが4.00以降でないと使えません。
さて、lpfnで指定したプロシージャは次のようなものでなくてはいけません。 (もちろん関数の名前は何でもよい)
hwndは、ダイアログボックスのウィンドウハンドルです。この関数から、ダイアログボックスに 次のメッセージを送ることができます。int CALLBACK BrowseCallbackProc( HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData );
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構造体へのポインタです。
mkidはアイテム識別子のリストです。typedef struct _ITEMIDLIST { SHITEMID mkid; } ITEMIDLIST, * LPITEMIDLIST; typedef const ITEMIDLIST * LPCITEMIDLIST;
この構造体のポインタはPIDLと呼ばれ、シェル名前空間のオブジェクトの識別子として使われます。 PIDLを使用するにはIMallocインターフェイスを使用する必要があります。詳細は省略しますが このインターフェイスのポインタを取得するにはSHGetMallocシェル関数を使用します。
LPMALLOCは、IMallocインターフェイスへのポインタです。 使い方等はサンプルプログラムで解説します。HRESULT SHGetMalloc( LPMALLOC *ppMalloc );
さて、今回は抽象的な解説になってしまいましたが、実際的な使い方は次章で解説します。
Update 26/Jun/2000 By Y.Kumei