お世話になっております。
VisualStudio 2005 Pro + MFC
の環境でC++によるWindowsアプリの開発を行っています。
WinVistaで新しいルックスのFileOpenダイアログが導入され、
遅ればせながら自作のアプリにも導入しようと思ったのですが、
以下のような現象が起きています。
MFCのCFileDialogクラスをそのまま使うとXPスタイルのダイアログに
なってしまうので、GetOpenFileName()などのAPIを使用して新しい
ダイアログを表示しています。
ここまではいいのですが、このダイアログにフックを追加すると、
XPスタイルの表示に戻ってしまいます。
フック関連の部分だけを抜き出すと、、、
OPENFILENAME ofn;
ofn.Flags |= (OFN_ENABLEHOOK | OFN_EXPLORER);
ofn.lpfnHook = OFNHookProc;
----------------------------------------
UINT_PTR CALLBACK OFNHookProc(HWND hdlg, UINT uiMsg, WPARAM wParam, LPARAM
lParam)
{
LPOFNOTIFY lpOfNotify;
switch(uiMsg){
case WM_INITDIALOG:
return TRUE;
case WM_NOTIFY:
lpOfNotify = (LPOFNOTIFY) lParam;
if (lpOfNotify->hdr.code == CDN_FILEOK) {
AfxMessageBox(Lテストメッセージ);
}
break;
}
return 0;
}
おそらく、MFCのCFileDialogクラスもフックを使用しているので、
XPスタイルになってしまうのだと想像していますが、
Vistaスタイルのダイアログでフックを有効にする方法というのは
あるのでしょうか?
フックでやりたいことは、選択されたファイル名の検証だけです。
よろしくお願い致します。
Vista以降だとGetOpenFileName/GetSaveFileNameから
IFileDialog(IFileOpenDialog/IFileSaveDialog)に
リダイレクトされるようになっていると思います。
IFileDialogで直接操作するように変更して
IFileDialog::AdviseでIFileDialogEventsを
渡してやればハンドリングできそうな感じです。
XP以前でも動作させるならOS判定して
処理を切り替える手間が増えてしまいますどね。
> VisualStudio 2005 Pro + MFC
開発環境を拝見すると、Vistaは対応してないですね。
まぁー、動作はする可能性はありますが、マイクロソフトは保障していません。
> ここまではいいのですが、このダイアログにフックを追加すると、
> XPスタイルの表示に戻ってしまいます。
VisualStudio 2005のMFCがvistaのスタイルに完全対応していない可能性が高いですね。
VisualStudio 2008以降を購入して再検討するか、FremeWorkで作り変えるかですね。
VisualStudio 2010を購入する方がいいかもしれません。
subaru さん、ITO さん、アドバイスありがとうございました。
IFileDialogというCOMインターフェースがあったんですね。
知りませんでした。
ネットで調べたら、サンプルソースなども見つかりました。
かなり複雑そうですが、VS2005でも使えるかどうか調べてみたいと思います。
ありがとうございました。