ファイルダイアログのカスタマイズ ~フィルタの拡張子をデフォルトに、、、

CFileDialogを使用すると、ファイルを開いたり保存したりするときのファイル名を安全に決定できてとても便利です。
ですが、ファイルを保存しようとする場合には、ちょっと困った動作をすることがあります。

例えば、以下のように設定したとしましょう。

CString strFilter = "ビットマップファイル(*.bmp)|*.bmp|TIFFファイル(*.tif)|*.tif|"
"JPEGファイル(*.jpg)|*.jpg||";
CFileDialog dlg(false, "bmp", 0, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, strFilter);


これは、デフォルトの拡張子を「bmp」にして、フィルタで、ビットマップ、TIFF、JPEGという3種類のファイル形式を選べるようにしています。

ここで困ったことは、フィルタで「TIFF」を選択しても、ファイル名欄に拡張子付きでファイル名を入れないと(例えば、「test」と入力すると)、勝手に「.bmp」が付加されてしまう(「test.tif」になって欲しいのに、「test.bmp」になってしまう)ことです。
こんな困った動作は、CFileDialogのサブクラスを作成することで解消することが出来ます。

新規作成で、CFileDialogEx という「MFCクラス」を作成し、基本クラスを「CFileDialog」にします。
そして、OnTypeChange() をオーバーライドして、以下のようにします。

void CFileDialogEx::OnTypeChange()
{
// タイプが変更されたら、フィルタから拡張子を取得して、デフォルトとして登録
LPCSTR ptr = m_ofn.lpstrFilter;
int nTarget = ((m_ofn.nFilterIndex-1)*2) + 1;
while(nTarget--)
{
while(*(ptr++) != 0);
assert(*ptr);
}
TRACE("CFileDialogEx Filter %d: %s\n", m_ofn.nFilterIndex, ptr);
CString strExt(ptr);
strExt = strExt.Right(3);
SetDefExt(strExt);
CFileDialog::OnTypeChange();
}


かなり力わざですが、いちおう期待する動作になりました。

ここで注意点があります。
フィルタの拡張子は必ず3文字で、「;」を使用した複数選択はしないこと。
また、「*.*」等のワイルドカードは使用しないこと。

上記入力は想定していませんので、未定義の動作となります。
まあ、あまり完成度が高いとはいえませんが、いちおう想定範囲内では使用できます。
[PR]
by isoq | 2004-07-13 13:06 | C/C++/Win32
e87.com(千趣会イイハナ) 花を贈るなら日比谷花壇
<< のど 保存動作のカスタマイズ >>