質問させて頂きます。
環境:
Windows XP SP2
Visual C++ 6.0 SP6
Platform SDK Feb 2003
ATL で作成した ActiveX コントロールに、
MSDN などのサイトを参考にして、
Wizard を用いてプロパティページを 2 つ追加しました。
基本的には問題なく動作しているのですが、
Apply() メソッドが プロパティシートのタブの切り替え時 にも呼び出されて、
適用 の処理が実行されてしまいます。
MSDN を読む限りでは、
Apply() メソッドは 適用 ボタンか OK ボタンが押されたときにしか
呼び出されないようなのですが、
プロパティシートのタブの切り替え時 にも呼び出されてしまいます。
しかたがないので、
プロパティシートのタブの切り替え時 に呼び出されると MSDN に書いてあった
Show() メソッドでフラグを管理して、
Apply() が プロパティシートのタブの切り替え時 に呼び出されても、
適用の処理を行わないようにしようと思ったのですが、
どうも、初めてプロパティページが表示されるときに ( つまり最初の 1 回だけ ) しか
Show() メソッドは呼び出されないようです。
そこで、
WM_NOTIFY メッセージを独自に処理しようと思い、
メッセージハンドラ OnNotify を定義したのですが、
WM_NOTIFY メッセージが来ません。
どなたかご助言頂ければ幸いです。
NOTIFY_CODE_HANDLER も試してみましたが、
メッセージを捕まえることができませんでした。
NOTIFY_CODE_HANDLER(PSN_APPLY,OnApply)
LRESULT OnApply(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
・・・
}
そもそもメッセージハンドラを仕掛ける場所が間違っているのでしょうか?
下記のように実装しているのですが・・・。
class ATL_NO_VTABLE CTestPropertyPage :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CTestPropertyPage, &CLSID_TestPropertyPage>,
public IPropertyPageImpl<CTestPropertyPage>,
public CDialogImpl<CTestPropertyPage>
{
public:
・・・
BEGIN_MSG_MAP(CTestPropertyPage)
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
NOTIFY_CODE_HANDLER(PSN_APPLY,OnApply)
COMMAND_HANDLER(IDC_TEXT, EN_CHANGE, OnChangeText)
HAIN_MSG_MAP(IPropertyPageImpl<CTestPropertyPage>)
END_MSG_MAP()
・・・
LRESULT OnApply(int idCtrl, LPNMHDR pnmh, BOOL& bHandled)
{
・・・
}
・・・
};
(質問を簡潔にできました)
ATL で作成したプロパティーページにおいて WM_NOTIFY メッセージをフックする方法はありますでしょうか?
CDialogImpl と CDialogImplBaseT を独自に実装して、
WM_NOTIFY メッセージが来るかどうか監視してみましたが、
来ませんでした・・・。
どうも WM_NOTIFY メッセージのフックは無理っぽいですね。
ツイート | ![]() |