2016-08-24 8 views
1

MFCのCFileDialogm_ofn.lpstrCustomFilterを使用する方法を理解しようとしています。MFC、OPENFILENAME構造体:m_ofn.lpstrCustomFilter

内部構造はOPENFILENAMEです。

具体的な例が必要ですが、私が見つけたすべての例では、lpstrCustomFilterをNULLに設定しています。

答えて

3

OPENFILENAMEドキュメントによれば:

lpstrCustomFilter
型:LPTSTR
ユーザによって選択されたフィルタパターンを保存するためのNULLで終了するフィルタ文字列のペアが含ま静的バッファ。最初の文字列はカスタムフィルタを表す表示文字列で、2番目の文字列はユーザ​​ーが選択したフィルタパターンです。最初にアプリケーションでダイアログボックスが作成されたときに、最初の文字列を指定します。最初の文字列は空でない文字列にすることができます。ユーザがファイルを選択すると、ダイアログボックスは現在のフィルタパターンを2番目の文字列にコピーします。保存されたフィルタパターンは、lpstrFilterバッファで指定されたパターンの1つでもかまいません。または、ユーザが入力したフィルタパターンにすることもできます。次回のダイアログボックスの作成時に、文字列を使用してユーザー定義のファイルフィルタが初期化されます。 nFilterIndexメンバがゼロの場合、ダイアログボックスはカスタムフィルタを使用します。

このメンバーがNULLの場合、ダイアログボックスはユーザー定義のフィルタパターンを保持しません。

このメンバーは、NULLない場合、nMaxCustFilterメンバの値は、lpstrCustomFilterバッファー、文字で、サイズを指定しなければなりません。

nMaxCustFilter
タイプ:DWORD
lpstrCustomFilterによって識別バッファの文字の寸法、。このバッファの長さは少なくとも40文字です。 lpstrCustomFilterNULLである場合、または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から始まるインデックスに設定します。ダイアログが閉じられたら、lpstrFilenFileExtensionを使用してユーザーの実際に選択したファイル拡張子を抽出し、後でcustom filterエントリを初期化できるように保存します。

+0

あなたはすばらしい説明をしました。ありがとうございました。 – basjak