ATL で作成した ActiceX コントロールのプロパティページ


かるび  2007-07-27 04:27:06  No: 65847

質問させて頂きます。

環境:
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 メッセージが来ません。

どなたかご助言頂ければ幸いです。


かるび  2007-07-27 04:55:46  No: 65848

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)
    {
        ・・・
    }
    
    ・・・
};


かるび  2007-07-27 19:04:10  No: 65849

(質問を簡潔にできました)

ATL で作成したプロパティーページにおいて WM_NOTIFY メッセージをフックする方法はありますでしょうか?


かるび  2007-07-27 22:12:00  No: 65850

CDialogImpl と CDialogImplBaseT を独自に実装して、
WM_NOTIFY メッセージが来るかどうか監視してみましたが、
来ませんでした・・・。

どうも WM_NOTIFY メッセージのフックは無理っぽいですね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加