ファイルダイアログプロシージャの良いフック方法は?

[戻る]
くたくた 2002/12/13(金) 23:02:11
GetOpenFileName()で、「Win2Kスタイル(左側に履歴、デスクトップetcのボタンが有る奴)
で、ユーザフックプロシージャ(以下UHP)を設定する」にはどうすれば良いでしょうか。

今は、Win2Kスタイルで表示する為に

(1) CFileDialog Dlg(???)を使ってDlg.m_ofnのメンバを設定 ( コード簡略化の為 )
(2) Dlg.m_ofn.Flags &= ~OFN_ENABLEHOOK でフラグを削除 ( Win2Kスタイル化 )
(3) GetOpenFileName( &Dlg.m_ofn ) で表示 ( Dlg.DoModal()は使えない為 )

としています。で、UHPを使いたい為 上記(2)を Dlg.lpfnHook=UHP としました。
※ UHPは↓のように定義
   staitc UINT CALLBACK UHP( HWND, UINT, WPARAM, LPARAM ){ return 0; }

UHPはデフォルト動作の為、自動的にWin2Kスタイルになるかと思いました。が、なりません。

UHPを使いつつ、Win2Kスタイルのファイルダイアログにするにはどうすればいいでしょうか。
どうぞ宜しくお願い致します。
(力技でm_ofnパラメータの組み合わせを変えていろいろ試したのですが、実現できませんで
 した。又、関数UHPは、将来 本来のコードに差し替える予定です。)

環境:Win2K+SP3,VC++6+SP5,Pentium3,MFC使用,作成ソフトはWin2K移降で使う

dairygoods 2002/12/16(月) 10:37:26
Win2Kスタイル用のOPENFILENAMEは、構造体のサイズが変わっています。
最新のMSDNを参照してください。

マクロ _WIN32_WINNT を 0x0500以上に設定することにより、
新しいOPENFILENAMEが利用できます。
CFileDialog::m_ofnは古いOPENFILENAMEなので使えません。

くたくた 2002/12/16(月) 13:56:21
[[解決]]
>最新のMSDNを参照してください。
>_WIN32_WINNTを0x0500以上に設定することにより、新しいOPENFILENAMEが利用できます。
MSDN2002年/4月と、Commdlg.hを調べたのですが、
OPENFILENAME構造体に新メンバがありませんでした。

新しいCommdlg.hの入手法が分からない為、自前で書き換えてしまいました。
その結果、FlagsExでプレースバーの
  表示  (0を設定)
  非表示(1(=OFN_EX_NOPLACESBARと判明)を設定)
をする方法が分かりました。勿論、ユーザフックプロシージャも使えます。

>CFileDialog::m_ofnは古いOPENFILENAMEなので使えません。
1) CFileDialog::CFileDialog()でCFileDialog::m_ofnを初期化
2) m_ofn.FlagsのOFN_ENABLEHOOKフラグを削除
3) GetOpenFileName( &m_ofn )
でWin2KスタイルのFileDlgが表示されるのは、"たまたま"なのかもしれませんね。

問題は解決しました。この後、新しいCommdlg.hの入手法を調べてみます。
dairygoodsさん、ありがとうございました。

くたくた 2002/12/16(月) 14:25:19
>"たまたま"なのかもしれませんね。
"たまたま"ではなく"仕様"でした。以下、MSDN2002/4のOPENFILENAMEの説明です。
For compatibility reasons, the Places Bar is hidden if Flags is set to 
OFN_ENABLEHOOK and lStructSize is OPENFILENAME_SIZE_VERSION_400.

dairygoods 2002/12/16(月) 15:55:09
最新のSDKならば、Platform SDK Updateから入手できます。
かなりのサイズですが。
http://www.microsoft.com/msdownload/platformsdk/sdkupdate/

> "たまたま"ではなく"仕様"でした。
なるほど。

くたくた 2002/12/17(火) 13:38:27
>最新のSDKならば、Platform SDK Updateから入手できます。
情報ありがとうございます。落とすのに1時間くらいかかりました。

古いスレッドには追加発言できません。