[開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックス
Note
GetOpenFileName 関数は、File が使用中のサンプルで示されています。
[Windows Vista 以降、 共通のダイアログ ボックスと [名前を付けて保存 ] ダイアログ ボックスは、[ 共通アイテム] ダイアログボックスに置き換えられていた。 共通ダイアログ ボックス ライブラリのこれらのダイアログ ボックスの代わりに、共通項目ダイアログ API を使用することをお勧めします。
[ 開く ] ダイアログ ボックスでは、ユーザーが開くファイルまたはファイルのセットのドライブ、ディレクトリ、名前を指定できます。 OPENFILENAME 構造体を初期化し、その構造体を GetOpenFileName 関数に渡すことで、[開く] ダイアログ ボックスを作成して表示します。
[ 名前を付けて保存 ] ダイアログ ボックスでは、保存するファイルのドライブ、ディレクトリ、名前を指定できます。 OPENFILENAME 構造体を初期化し、その構造を GetSaveFileName 関数に渡すことで、[名前を付けて保存] ダイアログ ボックスを作成して表示します。
エクスプローラー スタイルの [開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスには、Windows エクスプローラーに似たユーザー インターフェイス機能が用意されています。 ただし、古いスタイルのユーザー インターフェイスと一致する必要があるアプリケーションの場合、システムは引き続き古いスタイルの [開 く] ダイアログ ボックスと [名前を付 けて保存] ダイアログ ボックスをサポートします。
外観の違いに加えて、エクスプローラースタイルのダイアログ ボックスと古いスタイルのダイアログ ボックスでは、ダイアログ ボックスをカスタマイズするためのカスタム テンプレートとフック プロシージャの使用が異なります。 ただし、ファイル名フィルターの指定、ユーザーの入力の検証、ユーザーが指定したファイル名の取得など、ほとんどの基本的な操作では、エクスプローラースタイルと古いスタイルのダイアログ ボックスの動作は同じです。 エクスプローラー スタイルと古いスタイルのダイアログ ボックスの詳細については、「[開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスのカスタマイズ」を参照してください。
次の図は、一般的なエクスプローラースタイルの [開く] ダイアログ ボックスを示しています。
次の図は、一般的なエクスプローラースタイルの [名前を付けて保存] ダイアログ ボックスを示しています。
ユーザーがファイル名を指定し、[ OK] ボタンをクリックすると、 GetOpenFileName または GetSaveFileName は TRUE を返します。 OPENFILENAME 構造体の lpstrFile メンバーが指すバッファーには、ユーザーが指定した完全なパスとファイル名が含まれています。
ユーザーが [ 開く ] または [ 名前を付けて保存] ダイアログ ボックスをキャンセルするか、エラーが発生した場合、関数は FALSE を返します。 エラーの原因を特定するには、 CommDlgExtendedError 関数を呼び出して、拡張エラー値を取得します。 lpstrFile バッファーが小さすぎて完全な名前を受け取れない場合、CommDlgExtendedError は FNERR_BUFFERTOOSMALLを返し、lpstrFile メンバーが指すバッファーの最初の 2 バイトは、フル ネームを受け取るために必要なサイズを指定する整数値に設定されます。
このセクションでは、次のトピックについて説明します。
- ファイル名とディレクトリ
- フィルター
- ファイルとディレクトリの検証
- [開いて名前を付けて保存] ダイアログ ボックスのカスタマイズ
- エクスプローラースタイルのフック プロシージャ
- エクスプローラー スタイルのカスタム テンプレート
- エクスプローラー スタイルのコントロール識別子
- Old-Styleダイアログ ボックスのカスタマイズ
ファイル名とディレクトリ
このセクションの情報は、エクスプローラー スタイルと古いスタイルの [開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスの両方に適用されます。
GetOpenFileName 関数または GetSaveFileName 関数を呼び出す前に、OPENFILENAME 構造体の lpstrFile メンバーがバッファーを指してファイル名を受け取る必要があります。 nMaxFile メンバーは、lpstrFile バッファーのサイズを文字数で指定する必要があります。 ANSI 関数の場合、これはバイト数ですが、Unicode 関数の場合は文字数です。
ユーザーがファイル名を指定し、[ OK] ボタンをクリックすると、選択したドライブ、ディレクトリ、ファイル名が lpstrFile バッファーにコピーされます。 また、この関数では、 nFileOffset メンバーと nFileExtension メンバーを、バッファーの先頭からファイル名およびファイル名拡張子までのオフセット (文字単位) に設定します。
ファイル名と拡張子のみを取得するには、 lpstrFileTitle メンバーをバッファーを指すように設定し、 nMaxFileTitle メンバーをバッファーのサイズ (文字数) に設定します。 または、GetFileTitle 関数の呼び出しで lpstrFile バッファーを渡して、選択したファイルの表示名を取得することもできます。 ただし、 GetFileTitle から返されるファイル名に拡張子が含まれるのは、ファイル名を表示するユーザーの設定である場合のみです。
ダイアログ ボックスでは、呼び出し元プロセスの現在のディレクトリが、ファイルとディレクトリを表示する最初のディレクトリとして使用されます。 GetCurrentDirectory 関数と SetCurrentDirectory 関数を使用して、プロセスの現在のディレクトリを取得および変更します。 現在のディレクトリを変更せずに別の初期ディレクトリを指定するには、 lpstrInitialDir メンバーを使用してディレクトリの名前を指定します。 ユーザーが別のドライブまたはディレクトリを選択すると、ダイアログ ボックスによって現在のディレクトリが自動的に変更されます。 ダイアログ ボックスで現在のディレクトリが変更されないようにするには、 OFN_NOCHANGEDIR フラグを設定します。 このフラグは、ユーザーがファイルを検索するためにディレクトリを変更することを妨げるものではありません。
既定のファイル名拡張子を指定するには、 lpstrDefExt メンバーを使用します。 ユーザーが拡張子のないファイル名を指定した場合、ダイアログ ボックスによって既定の拡張子が追加されます。 既定の拡張子を指定し、ユーザーが別の拡張子を持つファイル名を指定した場合、ダイアログ ボックスは OFN_EXTENSIONDIFFERENT フラグを設定します。
ユーザーがディレクトリから複数のファイルを選択できるようにするには、 OFN_ALLOWMULTISELECT フラグを設定します。 古いアプリケーションとの互換性のために、既定の複数選択ダイアログ ボックスでは古いスタイルのユーザー インターフェイスが使用されます。 エクスプローラースタイルの複数選択ダイアログ ボックスを表示するには、OFN_EXPLORER フラグも設定する必要があります。
ユーザーが複数のファイルを選択した場合、 lpstrFile メンバーが指すバッファーは、現在のディレクトリへのパスと、選択したファイルのファイル名を返します。 nFileOffset メンバーは最初のファイル名へのオフセットであり、nFileExtension メンバーは使用されません。 次の表では、複数のファイル名を返すエクスプローラースタイルのダイアログ ボックスと古いスタイルのダイアログ ボックスの違いについて説明します。
ダイアログ ボックスのスタイル | 説明 |
---|---|
エクスプローラー スタイルのダイアログ ボックス | ディレクトリとファイル名の文字列は NULL で区切られ、最後のファイル名の後に余分な NULL 文字が付きます。 この形式を使用すると、エクスプローラー スタイルのダイアログ ボックスは、スペースを含む長いファイル名を返します。 |
古いスタイルのダイアログ ボックス | ディレクトリとファイル名の文字列はスペースで区切られます。 スペースを含むファイル名の場合、関数は短いファイル名を使用します。 |
FindFirstFile 関数を使用して、長いファイル名と短いファイル名を変換できます。
OFN_ALLOWMULTISELECTを指定し、ユーザーがファイルを 1 つだけ選択した場合、lpstrFile 文字列にはパスとファイル名の間に区切り記号はありません。
フィルター
このセクションの情報は、エクスプローラー スタイルと古いスタイルの [開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスの両方に適用されます。
ファイル名フィルターを指定すると、ダイアログ ボックスに表示されるファイル名をユーザーが制限できます。 ファイル名フィルターは、null で終わる文字列、説明、パターンのペアで構成され、1 つはもう一方に連結されます。 ダイアログ ボックスに説明が表示され、ユーザーは使用するフィルターを選択できます。パターンを使用して表示するファイルを選択します。
フィルターを指定するには、OPENFILENAME 構造体の lpstrFilter メンバーを、フィルター文字列ペアの配列を含むバッファーを指すよう設定します。 配列内の最後の文字列の後に、追加の null 文字が続く必要があります。
パターン文字列には、有効なファイル名文字とアスタリスク (*) の組み合わせを指定できます。 アスタリスクは、有効なファイル名文字の任意の組み合わせを表すワイルドカードです。 ダイアログ ボックスには、パターンに一致するファイルのみが表示されます。 同じ説明に複数のパターンを指定するには、セミコロン (;)を使用してパターンを分離します。 パターン文字列の空白文字では、予期しない結果が発生する可能性があることに注意してください。
次のコード フラグメントは、2 つのフィルターを指定します。 "ソース" の説明を含むフィルターには、2 つのパターンがあります。 ユーザーがこのフィルターを選択すると、ダイアログ ボックスに が含まれるファイルのみが表示されます。C と 。CXX 拡張機能。 C プログラミング言語では、二重引用符で囲まれた文字列は null で終わる点に注意してください。
OPENFILENAME ofn; // common dialog box structure
ofn.lpstrFilter = "Source\0*.C;*.CXX\0All\0*.*\0"
ofn.nFilterIndex = 1;
OPENFILENAME 構造体の nFilterIndex メンバーは、ダイアログ ボックスが最初に使用するフィルターを示すインデックスを指定します。 バッファー内の最初のフィルターには、インデックス 1、2 番目の 2 などが含まれます。 ダイアログ ボックスの使用中にユーザーがフィルターを変更した場合、 nFilterIndex メンバーは、選択したフィルターのインデックスに戻り時に設定されます。
カスタム フィルターを作成するには、 lpstrCustomFilter メンバーを 1 つのフィルターを含むバッファーのアドレスに設定し、 nMaxCustFilter メンバーをバッファーのサイズ (文字数またはバイト単位) に設定します。 ダイアログ ボックスは常にフィルターの一覧の先頭にカスタム フィルターを配置し、返された場合は常に、ユーザーが選択したフィルターのパターンでフィルターのパターン部分を更新します。
エクスプローラースタイルのダイアログ ボックスでは、ユーザーが別のフィルターを選択すると、既定の拡張機能が変更される場合があります。 ユーザーが最初のパターンが * という形式のフィルターを選択した場合。xxx (つまり、拡張子にワイルドカード文字は含まれません)、ダイアログ ボックスでは既定の拡張子として xxx が使用されます。 これは、OPENFILENAME 構造体の lpstrDefExt メンバーに既定の拡張機能を指定した場合にのみ発生します。 たとえば、ユーザーが "Source\0* を選択した場合などです。C;*。CXX\0" フィルターでは、既定の拡張機能が "C" に変わります。 ただし、フィルターを "Source\0* と定義していた場合は。C*\0" では、拡張子にワイルドカードが含まれているため、既定の拡張子は変更されません。
CDN_INCLUDEITEM通知メッセージは、ダイアログ ボックスに表示される名前をフィルター処理する別の方法を提供します。 このメッセージを使用するには、OFNHookProc フック プロシージャを指定し、ダイアログ ボックスの作成時に OPENFILENAME 構造体に OFN_ENABLEINCLUDENOTIFY フラグを指定します。 ユーザーがフォルダーを開くたびに、ダイアログ ボックスは、新しく開いたフォルダー内の各項目の CDN_INCLUDEITEM 通知をフック プロシージャに送信します。 フック プロシージャの戻り値は、ダイアログ ボックスでフォルダーのアイテム リストにアイテムを表示するかどうかを示します。
ファイルとディレクトリの検証
ただし、このセクションの情報は、エクスプローラー スタイルと古いスタイルの [名前を付けて開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスの両方に適用されます。
ダイアログ ボックスでは、ユーザーが入力したファイル名が自動的に検証され、名前に有効な文字のみが含まれていることが確認されます。 ファイル名の文字検証をオーバーライドするには、 OFN_NOVALIDATE フラグを設定します。
ユーザーが既存のファイルの名前を指定したことをダイアログ ボックスで強制的に確認するには、 OFN_FILEMUSTEXIST フラグを設定します。 指定したパスが存在することを強制的に検証するには、 OFN_PATHMUSTEXIST フラグを設定します。 OFN_CREATEPROMPT フラグを設定すると、存在しないファイルを作成するためのアクセス許可をユーザーに求めるダイアログ ボックスが表示されます。 このフラグが設定され、ユーザーが新しいファイルの作成を選択すると、ダイアログ ボックスが閉じ、関数は指定した名前を返します。 それ以外の場合、ダイアログ ボックスは開いたままです。
[名前を 付けて保存 ] ダイアログ ボックスを使用する場合は、 OFN_OVERWRITEPROMPT フラグを設定して、既存のファイルを上書きするアクセス許可をユーザーに求めるダイアログ ボックスを表示できます。
既定では、ダイアログ ボックスは長さ 0 のテスト ファイルを作成して、選択したディレクトリに新しいファイルを作成できるかどうかを判断します。 このテスト ファイルが作成されないようにするには、 OFN_NOTESTFILECREATE フラグを設定します。
フック プロシージャを有効にすると、ユーザーが指定したファイル名に対してネットワーク共有違反が発生したときに、ダイアログ ボックスによってフック プロシージャに通知されます。 OFN_EXPLORER フラグを設定すると、ダイアログ ボックスから CDN_SHAREVIOLATION メッセージがフック プロシージャに送信されます。 OFN_EXPLORER設定しない場合、ダイアログ ボックスは SHAREVISTRING 登録済みメッセージをフック プロシージャに送信します。 ダイアログ ボックスで共有違反の通知が送信されないようにするには、 OFN_SHAREAWARE フラグを設定します。
ユーザーが読み取り専用のチェック ボックスを選択した場合、ダイアログ ボックスは、戻り時にOFN_READONLY フラグを設定します。 [読み取り専用で開く] チェック ボックスを非表示にするには、OFN_HIDEREADONLY フラグを設定します。 ダイアログ ボックスが読み取り専用属性を持つ既存のファイルの名前を返さないようにするには、 OFN_NOREADONLYRETURN フラグを設定します。
ダイアログ ボックスでリンク ファイルが逆参照されないようにするには、 OFN_NODEREFERENCELINKS 値を設定します。 この場合、ダイアログ ボックスは、リンク ファイルによって参照されるファイルの名前ではなく、リンク ファイルの名前を返します。
[開いて名前を付けて保存] ダイアログ ボックスのカスタマイズ
フック プロシージャ、カスタム テンプレート、またはその両方を指定して、[ 開く ] または [ 名前を付けて保存] ダイアログ ボックスをカスタマイズできます。 ただし、ダイアログ ボックスのエクスプローラースタイルと古いスタイルのバージョンでは、カスタム テンプレートとフック プロシージャの使用が異なります。
エクスプローラースタイルのダイアログ ボックスのカスタマイズの詳細については、「エクスプローラー スタイルのフック プロシージャ」、「エクスプローラー スタイルのカスタム テンプレート」、「エクスプローラー スタイルのコントロール識別子」を参照してください。 古いスタイルのダイアログ ボックスのカスタマイズの詳細については、「 Old-Styleダイアログ ボックスのカスタマイズ」を参照してください。
次の表は、2 つのスタイルの違いをまとめたものです。
カスタマイズ | 説明 |
---|---|
エクスプローラー スタイルの Hook プロシージャ | フック プロシージャは、共通ダイアログ ボックスから送信された通知メッセージと、子ダイアログ テンプレートを指定して定義した追加のコントロールのメッセージを受け取ります。 フック プロシージャは、既定のダイアログ ボックスの標準コントロールのメッセージを受信しません。 |
エクスプローラー スタイルのカスタム テンプレート | システムは、カスタム テンプレートを使用して子ダイアログ ボックスを作成します。 このテンプレートでは、追加のコントロールを定義したり、標準コントロールのクラスターの場所を指定したりできます。 カスタム テンプレートは、既定のテンプレートを置き換えません。 |
古いスタイルのフック プロシージャ | フック プロシージャは、標準コントロールとカスタム コントロールのメッセージを含め、ダイアログ ボックスに送信されたすべてのメッセージを受け取ります。 フック・プロシージャーは、共通ダイアログ・ボックスから送信された登録済みメッセージも受け取ります。 |
古いスタイルのカスタム テンプレート | カスタム テンプレートは、既定のテンプレートに置き換えられます。 Fileopen.dlg ファイルで指定された既定のテンプレートを変更して、カスタム テンプレートを作成します。 |
エクスプローラー スタイルのダイアログ ボックスと古いスタイルのダイアログ ボックスの既定のタイトルは、"開く" または "名前を付けて保存" です。タイトルを変更するには、OPENFILENAME 構造体の lpstrTitle メンバーに新しいタイトルを指定します。
ユーザーのHKEY_CURRENT_USER レジストリ ハイブには、エクスプローラー スタイルの [開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスの内容をカスタマイズする値を含めることができます。 これらのレジストリ エントリは、レジストリ ハイブに関連付けられているユーザーに表示されるダイアログ ボックスにのみ影響します。
エクスプローラースタイルの [開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスの機能を非表示にするには、管理者はこのサブキーの下にある次の表の値を設定できます。
HKEY_CURRENT_USER
Software
Microsoft
Windows
CurrentVersion
Policies
Comdlg32
値の名前 | 値 | 説明 |
---|---|---|
NoPlacesBar | 1 | 場所バーを非表示にします。 |
NoFileMRU | 1 | 最近使用した (MRU) リストを非表示にします。 |
NoBackButton | 1 | [ 戻る ] ボタンを非表示にします。 |
Places バーの内容は、次のサブキーの内容によって決まります。
HKEY_CURRENT_USER
Software
Microsoft
Windows
CurrentVersion
Policies
Comdlg32
Placesbar
現在、このキーの下には 5 つのエントリしか存在できません。値/名前インデックスは 0 から始まります。 エントリの名前は、Place0、Place1、Place2、Place3、および Place4 である必要があります。 エントリの値には、場所バーに含める場所を識別する値をREG_DWORD、REG_SZ、またはREG_EXPAND_SZできます。
値の型 | 説明 |
---|---|
REG_DWORD | フォルダーを識別する CSIDL 値。 CSIDL 値の一覧については、「 CSIDL 値」を参照してください。 |
REG_SZ または REG_EXPAND_SZ | 有効なパスを指定する null で終わる文字列。 |
Explorer-Style フック プロシージャ
フック プロシージャ、カスタム テンプレート、またはその両方を指定することで、エクスプローラースタイルの [開く] または [名前を付けて保存] ダイアログ ボックスをカスタマイズできます。 エクスプローラースタイルのダイアログ ボックスにフック プロシージャを指定すると、既定のダイアログ ボックスの子であるダイアログ ボックスが作成されます。 フック プロシージャは、子ダイアログ ボックスのダイアログ プロシージャとして機能します。 この子ダイアログ ボックスは、カスタム テンプレートに基づいており、何も指定されていない場合は既定のテンプレートに基づいています。 詳細については、「エクスプローラー スタイルのカスタム テンプレート」を参照してください。
エクスプローラースタイルの [開く] または [名前を付けて保存] ダイアログ ボックスのフック プロシージャを有効にするには、ダイアログ ボックスを作成するときに OPENFILENAME 構造体を使用します。 Flags メンバーにOFN_ENABLEHOOKフラグとOFN_EXPLORERフラグを設定し、lpfnHook メンバーの OFNHookProc フック プロシージャのアドレスを指定します。 フック プロシージャを指定し、 OFN_EXPLORER フラグを省略する場合は、 OFNHookProcOldStyle フック プロシージャを使用する必要があります。古いスタイルのユーザー インターフェイスが得られます。 詳細については、「 Old-Styleダイアログ ボックスのカスタマイズ」を参照してください。
エクスプローラースタイルのフック プロシージャは、ダイアログ ボックスが開いている間にさまざまなメッセージを受信します。 これらには、次のものが含まれます。
- WM_INITDIALOG メッセージとその他の標準ダイアログ ボックス メッセージ (WM_CTLCOLORDLG コントロールの色メッセージなど)。
- ユーザーまたはその 他のダイアログ ボックス イベントによって実行されるアクションを示す一連のWM_NOTIFY通知メッセージ。
- 子ダイアログ テンプレートを指定して定義した追加コントロールのメッセージ。
さらに、情報を取得したり、ダイアログ ボックスの動作と外観を制御したりするために、エクスプローラー スタイルのダイアログ ボックスに送信できる一連のメッセージがあります。
エクスプローラースタイルのダイアログ ボックスにフック プロシージャを指定した場合、既定のダイアログ ボックス プロシージャは、既定のダイアログ プロシージャがWM_INITDIALOG メッセージを処理するときに子ダイアログ ボックスを作成します。 フック プロシージャは、子ダイアログ ボックスのダイアログ プロシージャとして機能します。 現時点では、フック プロシージャは、ダイアログ ボックスの初期化に使用される OPENFILENAME 構造体のアドレスに lParam パラメーターを設定した独自のWM_INITDIALOG メッセージを受け取ります。 子ダイアログが独自の WM_INITDIALOG メッセージの処理を完了すると、既定のダイアログ プロシージャは、必要に応じて標準コントロールを移動して、子ダイアログ ボックスの追加のコントロール用のスペースを作ります。 既定のダイアログ プロシージャは、 CDN_INITDONE 通知メッセージをフック プロシージャに送信します。
フック プロシージャは、ダイアログ ボックスでユーザーが実行 した アクションを示すWM_NOTIFY通知メッセージを受け取ります。 これらのメッセージの一部を使用して、ダイアログ ボックスの動作を制御できます。 たとえば、フック プロシージャは、ユーザーがファイル名を選択して [OK] ボタンをクリックすると、CDN_FILEOK メッセージを受け取ります。 このメッセージに応答して、フック プロシージャは SetWindowLong 関数を使用して、選択した名前を拒否し、ダイアログ ボックスを強制的に開いたままにすることができます。
各WM_NOTIFY メッセージの lParam パラメーターは、アクションを定義する OFNOTIFY 構造体または OFNOTIFYEX 構造体へのポインターです。 この構造体のヘッダーの コード メンバーには、次のいずれかの通知メッセージが含まれています。
メッセージ | 意味 |
---|---|
CDN_FILEOK | ユーザーが [OK ] ボタンをクリックしました。ダイアログ ボックスが閉じようとしています。 |
CDN_FOLDERCHANGE | ユーザーが新しいフォルダーまたはディレクトリを開きました。 |
CDN_HELP | ユーザーが [ヘルプ ] ボタンをクリックしました。 |
CDN_INCLUDEITEM | アイテムを表示するかどうかを指定します。 ユーザーが新しいフォルダーまたはディレクトリを開くと、システムはフォルダーまたはディレクトリ内の各項目に対してこの通知を送信します。 この通知は、 OFN_ENABLEINCLUDENOTIFY フラグが設定されている場合にのみ送信されます。 |
CDN_INITDONE | システムはダイアログ ボックスの初期化を完了し、ダイアログ ボックスは WM_INITDIALOG メッセージの処理を完了しました。 また、共通ダイアログ ボックスにコントロールの配置が完了し、子ダイアログ ボックスのコントロール用のスペースが用意されています (存在する場合)。 |
CDN_SELCHANGE | ユーザーがファイル一覧から新しいファイルまたはフォルダーを選択しました。 |
CDN_SHAREVIOLATION | 共通ダイアログ ボックスで、返されるファイルに対して共有違反が発生しました。 |
CDN_TYPECHANGE | ユーザーは、ファイルの種類の一覧から新しいファイルの種類を選択しました。 |
これらのWM_NOTIFYメッセージは、以前のバージョンの [開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスで使用されていた FILEOKSTRING、LBSELCHSTRING、SHAREVISTRING、HELPMSGSTRING 登録済みメッセージよりも優先されます。 ただし、WM_NOTIFY処理で SetWindowLong を使用して 0 以外のDWL_MSGRESULT値を設定しない場合、フック プロシージャは、WM_NOTIFY メッセージの後に置き換えられたメッセージも受け取ります。
ダイアログ ボックスの状態に関する情報を取得したり、ダイアログ ボックスの動作と外観を制御したりするために、フック プロシージャは次のメッセージをダイアログ ボックスに送信できます。
メッセージ | 意味 |
---|---|
CDM_GETFILEPATH | 選択したファイルのパスとファイル名を取得します。 |
CDM_GETFOLDERIDLIST | ダイアログ ボックスが開いている現在のフォルダーに対応するアイテム識別子リストを取得します。 項目識別子リストの詳細については、「 シェル名前空間の概要」を参照してください。 |
CDM_GETFOLDERPATH | ダイアログ ボックスの現在のフォルダーまたはディレクトリのパスを取得します。 |
CDM_GETSPEC | ダイアログ ボックスで現在選択されているファイルのファイル名 (パスを含まない) を取得します。 |
CDM_HIDECONTROL | 指定したコントロールを非表示にします。 |
CDM_SETCONTROLTEXT | 指定したコントロールのテキストを設定します。 |
CDM_SETDEFEXT | ダイアログ ボックスの既定のファイル名拡張子を設定します。 |
カスタム テンプレートのExplorer-Style
エクスプローラー スタイルの [開く] または [名前を付けて保存] ダイアログ ボックスの追加コントロールを定義するには、OPENFILENAME 構造体を使用して、追加のコントロールを含む子ダイアログ ボックスのテンプレートを指定します。 子ダイアログ テンプレートがアプリケーションまたはダイナミック リンク ライブラリのリソースである場合は、Flags メンバーに OFN_ENABLETEMPLATE フラグを設定し、構造体の hInstance メンバーと lpTemplateName メンバーを使用してモジュールとリソース名を識別します。 テンプレートが既にメモリ内にある場合は、 OFN_ENABLETEMPLATEHANDLE フラグを設定し、 hInstance メンバーを使用して、テンプレートを含むメモリ オブジェクトを識別します。 エクスプローラー スタイルのダイアログ ボックスに子ダイアログ テンプレートを指定する場合は、OFN_EXPLORER フラグも設定する必要があります。それ以外の場合は、古いスタイルのダイアログ ボックスに代わるテンプレートが提供されていることを前提としています。 通常、追加のコントロールを指定する場合は、新しいコントロールのメッセージを処理するエクスプローラースタイルのフック プロシージャも提供する必要があります。
他のテンプレートと同様に、子ダイアログ ボックス テンプレートを作成できます。ただし、 WS_CHILD と WS_CLIPSIBLINGS のスタイルを指定する必要があり、 DS_3DLOOK と DS_CONTROL のスタイルを指定する必要があります。 テンプレートには既定の [開く] または [名前を付けて保存] ダイアログ ボックスの子ダイアログが定義されているため、システムには WS_CHILD スタイルが必要です。 WS_CLIPSIBLINGS スタイルを使用すると、既定のダイアログ ボックスのどのコントロールにも子ダイアログ ボックスが描画されません。 DS_3DLOOK スタイルを使用すると、子ダイアログ ボックス内のコントロールの外観が、既定のダイアログ ボックスのコントロールと一致していることを確認できます。 DS_CONTROL スタイルを使用すると、ユーザーは Tab キーやその他のナビゲーション キーを使用して、カスタマイズしたダイアログ ボックス内のすべてのコントロール (既定またはカスタム) 間を移動できます。
新しいコントロールのスペースを増やすために、システムは既定のダイアログ ボックスをカスタム ダイアログ ボックスの幅と高さで展開します。 既定では、カスタム ダイアログ ボックスのすべてのコントロールは、既定のダイアログ ボックスのコントロールの下に配置されます。 ただし、カスタム ダイアログ ボックス テンプレートに静的テキスト コントロールを含め、 stc32 のコントロール識別子の値を割り当てることで、この既定の配置をオーバーライドできます。 (この値は Dlgs.h ヘッダー ファイルで定義されています)。この場合、システムはコントロールを参照ポイントとして使用して、新しいコントロールを配置する場所を決定します。 stc32 コントロールの上と左のすべての新しいコントロールは、既定のダイアログ ボックスのコントロールの上と左に同じ量だけ配置されます。 stc32 コントロールの下と右側の新しいコントロールは、既定のコントロールの下と右側に配置されます。 一般に、新しい各コントロールは 、stc32 コントロールと同じ既定のコントロールに対して相対的に同じ位置になるように配置されます。 これらの新しいコントロール用の領域を作るために、システムは必要に応じて既定のダイアログ ボックスの左、右、下、および上部にスペースを追加します。
システムでは、カスタム ダイアログ ボックス用のすべてのメッセージを処理するフック プロシージャが必要であるため、他のダイアログ ボックス プロシージャと同じウィンドウ メッセージをフック プロシージャに送信します。 たとえば、ユーザーがカスタム ダイアログ ボックスのボタン コントロールをクリックすると、フック プロシージャは WM_COMMAND メッセージを受け取ります。 フック プロシージャは、これらのコントロールを初期化し、ダイアログ ボックスが閉じられたときにコントロールから値を取得する役割を担います。 フック・プロシージャーが WM_INITDIALOG メッセージを受け取ると、システムはコントロールを最終的な位置にまだ移動していない点に注意してください。
既定のダイアログ ボックス プロシージャは、既定のダイアログ ボックス内のすべてのコントロールのメッセージを処理しますが、「エクスプローラー スタイルのフック プロシージャ」で説明されているように、フック プロシージャはこれらのコントロールに対するユーザー アクションの通知メッセージを受け取ります。
Explorer-Style コントロール識別子
Windows Software Development Kit (SDK) には、古いスタイルのダイアログ ボックスの既定のダイアログ ボックス テンプレートが用意されていますが、エクスプローラー スタイルのダイアログ ボックスの既定のテンプレートは含まれていません。 これは、エクスプローラースタイルのダイアログ ボックスでは、独自のコントロールを追加できますが、標準コントロールのテンプレートの変更はサポートしていないためです。 ただし、場合によっては、既定のテンプレートで使用されるコントロール識別子を知る必要があります。 たとえば、 CDM_HIDECONTROL メッセージと CDM_SETCONTROLTEXT メッセージにはコントロール識別子が必要です。
次の表は、エクスプローラー スタイルの [開く] ダイアログ ボックスと [名前を付けて保存] ダイアログ ボックスの標準コントロールの識別子を示しています。 識別子は、Dlgs.h および Winuser.h で定義されている定数です。
コントロール識別子 | コントロールの説明 |
---|---|
chx1 | 読み取り専用チェック ボックス |
cmb1 | ファイルの種類のフィルターの一覧を表示するドロップダウン コンボ ボックス |
stc2 | cmb1 コンボ ボックスのラベル |
cmb2 | 現在のドライブまたはフォルダーを表示し、ユーザーが開くドライブまたはフォルダーを選択できるようにするドロップダウン コンボ ボックス |
stc4 | cmb2 コンボ ボックスのラベル |
cmb13 | 現在のファイルの名前を表示するドロップダウン コンボ ボックスを使用すると、ユーザーは開くファイルの名前を入力し、最近開いたり保存したりしたファイルを選択できます。 これは、フックまたはダイアログ テンプレートを使用しない、以前のエクスプローラー互換アプリケーションの場合です。 edt1 と比較します。 |
edt1 | 現在のファイルの名前を表示するか、開くファイルの名前をユーザーが入力できるようにする編集コントロール。 cmb13 と比較します。 |
stc3 | cmb13 コンボ ボックスと edt1 編集コントロールのラベル |
lst1 | 現在のドライブまたはフォルダーの内容を表示するリスト ボックス |
stc1 | lst1 リスト ボックスのラベル |
IDOK | [OK] コマンド ボタン (プッシュ ボタン) |
IDCANCEL | [キャンセル] コマンド ボタン (プッシュ ボタン) |
pshHelp | [ヘルプ] コマンド ボタン (プッシュ ボタン) |
Old-Style ダイアログ ボックスのカスタマイズ
既定のダイアログ ボックス プロシージャ用のメッセージまたは通知を受信する OFNHookProcOldStyle フック プロシージャを指定することで、古いスタイルの [開く] または [名前を付けて保存] ダイアログ ボックスをカスタマイズできます。 既定のテンプレートの代わりに使用するカスタム テンプレートを指定することもできます。 古いスタイルのダイアログ ボックスで使用されるフック プロシージャとテンプレートは、他の一般的なダイアログ ボックスで使用されるものと似ています。 詳細については、「 共通ダイアログ ボックスのフック プロシージャ 」および「 カスタム テンプレート」を参照してください。
古いスタイルの [開く ] または [名前を付けて保存] ダイアログ ボックスのフック プロシージャを有効にするには、ダイアログ ボックスを作成するときに OPENFILENAME 構造体を使用します。 Flags メンバーにOFN_ENABLEHOOK フラグを設定し、lpfnHook メンバーの OFNHookProcOldStyle フック プロシージャのアドレスを指定します。 ダイアログ ボックス プロシージャは、ダイアログ ボックスの初期化に使用される OPENFILENAME 構造体のアドレスに Param パラメーターを設定して、WM_INITDIALOG メッセージをフック プロシージャに送信します。
OPENFILENAME 構造体を使用すると、既定のテンプレートの代わりに使用する [開く] または [名前を付けて保存] ダイアログ ボックスのカスタム テンプレートを指定できます。 カスタム テンプレートがアプリケーションまたはダイナミック リンク ライブラリのリソースである場合は、Flags メンバーに OFN_ENABLETEMPLATE フラグを設定し、構造体の hInstance メンバーと lpTemplateName メンバーを使用してモジュールとリソース名を識別します。 カスタム テンプレートが既にメモリ内にある場合は、 OFN_ENABLETEMPLATEHANDLE フラグを設定し、 hInstance メンバーを使用して、テンプレートを含むメモリ オブジェクトを識別します。 Fileopen.dlg ファイルで指定された既定のテンプレートを変更して、カスタム テンプレートを作成します。 既定の [検索と置換] ダイアログ テンプレートで使用されるコントロール識別子は、Dlgs.h ファイルで定義されます。
既定では、GetOpenFileName 関数と GetSaveFileName 関数には、エクスプローラー スタイルのダイアログ ボックスが表示されます。 古いスタイルのダイアログ ボックスを表示する場合は、OFNHookProcOldStyle フック プロシージャを指定し、OPENFILENAME 構造体の Flags メンバーにOFN_EXPLORER フラグが設定されていないことを確認する必要があります。
OFN_EXPLORER フラグを設定すると、フック プロシージャまたはカスタム テンプレートがエクスプローラースタイルのカスタマイズとして扱われます。 エクスプローラー スタイルのダイアログ ボックスのカスタマイズについては、「エクスプローラー スタイルのカスタム テンプレート」を参照してください。