MFCのCFileDialog
でm_ofn.lpstrCustomFilter
を使用する方法を理解しようとしています。MFC、OPENFILENAME構造体:m_ofn.lpstrCustomFilter
内部構造はOPENFILENAME
です。
具体的な例が必要ですが、私が見つけたすべての例では、lpstrCustomFilter
をNULLに設定しています。
MFCのCFileDialog
でm_ofn.lpstrCustomFilter
を使用する方法を理解しようとしています。MFC、OPENFILENAME構造体:m_ofn.lpstrCustomFilter
内部構造はOPENFILENAME
です。
具体的な例が必要ですが、私が見つけたすべての例では、lpstrCustomFilter
をNULLに設定しています。
OPENFILENAME
ドキュメントによれば:
lpstrCustomFilter
型:LPTSTR
ユーザによって選択されたフィルタパターンを保存するためのNULLで終了するフィルタ文字列のペアが含ま静的バッファ。最初の文字列はカスタムフィルタを表す表示文字列で、2番目の文字列はユーザーが選択したフィルタパターンです。最初にアプリケーションでダイアログボックスが作成されたときに、最初の文字列を指定します。最初の文字列は空でない文字列にすることができます。ユーザがファイルを選択すると、ダイアログボックスは現在のフィルタパターンを2番目の文字列にコピーします。保存されたフィルタパターンは、lpstrFilterバッファで指定されたパターンの1つでもかまいません。または、ユーザが入力したフィルタパターンにすることもできます。次回のダイアログボックスの作成時に、文字列を使用してユーザー定義のファイルフィルタが初期化されます。 nFilterIndexメンバがゼロの場合、ダイアログボックスはカスタムフィルタを使用します。このメンバーがNULLの場合、ダイアログボックスはユーザー定義のフィルタパターンを保持しません。
このメンバーは、NULLない場合、nMaxCustFilterメンバの値は、lpstrCustomFilterバッファー、文字で、サイズを指定しなければなりません。
nMaxCustFilter
タイプ:DWORD
lpstrCustomFilterによって識別バッファの文字の寸法、。このバッファの長さは少なくとも40文字です。 lpstrCustomFilterがNULLである場合、またはNULL文字列の場合、このメンバーは無視されます。例えば
:
TCHAR szfilter[256] = TEXT("custom filter\0*.ext\0");
...
m_ofn.lpstrCustomFilter = szFilter;
m_ofn.nMaxCustFilter = 256;
m_ofn.nFilterIndex = 0;
ドキュメントは、ダイアログが最初に示され、nFilterIndex
が0である場合、それはによって指定されたフィルタと異なる場合であっても、lpstrCustomFilter
によって指定された初期フィルタは、アクティブであることを意味lpstrFilter
。ユーザが異なるフィルタを選択/入力すると、szfilter
が更新され、ユーザが選択したフィルタが含まれます。これによりszFilter
を保存できるので、次にダイアログを表示するときに、必要に応じて、ユーザが最後に選択したフィルタを使用してダイアログを初期化することができます。
実際には、これはXP以前のバージョンで正常に動作します。Windows 7の(そしておそらくVistaの場合)で
以降、GetOpenFileName()
はは関係なくOPENFILENAME
が設定されているか、もうこのように振る舞うしません。 GetOpenFileName()
は単にlpstrCustomFilter
を無視し、初期カスタムフィルタを適用せず、szFilter
バッファを上書きしません。これは、lpstrCustomFilter
が廃止され、使用されなくなったことを意味し、nFilterIndex=0
は黙ってnFilterIndex=1
に昇格されます。これは、すべての例がちょうどlpstrCustomFilter
からNULL
に設定された理由を説明するかもしれません。
この動作が変更された理由は、GetOpenFileName()
が推奨されていないため、従来のコードとの下位互換性のためにIFileOpenDialog
のラッパーになりました。 IFileOpenDialog
は、ユーザー指定のフィルタの保存をサポートしていません。アプリケーション定義のフィルタでのみ機能します。ユーザー指定のフィルターを設定または取得するための新しいダイアログにはAPIはありません。したがって、MicrosoftはGetOpenFileName()
ラッパーが新しいダイアログ内の古いlpstrCustomFilter
機能をシミュレートしようとはしていません。
代わりにlpstrFilter
を使用して、古いlpstrCustomFilter
の動作を手動でシミュレートしようとすることができます。 custom filter
の追加エントリを作成します。ユーザーが以前にファイルを選択した場合は、選択したファイルの拡張子でそのエントリを初期化し、nFilterIndex
をそのエントリの1から始まるインデックスに設定します。ダイアログが閉じられたら、lpstrFile
とnFileExtension
を使用してユーザーの実際に選択したファイル拡張子を抽出し、後でcustom filter
エントリを初期化できるように保存します。
あなたはすばらしい説明をしました。ありがとうございました。 – basjak