1

CStaticから派生した子コントロールを備えたCDialogがあるMFCアプリケーションを構築しています。

CStaticコントロールのマウスイベントを受け取りたいので"Notify"、trueに設定しました。これで、メッセージマップを介してメッセージイベントを直接受信できるようになりましたMyStatic


class CMyStatic : public CStatic
{
afx_msg void OnLButtonDown(UINT nFlags, CPoint point); // Gets invoked
DECLARE_MESSAGE_MAP()
}

問題は、マウスが子の上にあるときに、親CDialogがマウスイベントを受信しないことMyStaticです。手動で送信することはできますMyStaticが、自動的に送信する方法はありますか?MyStaticそして、メッセージマップを使用してもそれらを受け取ることができますか?

4

2 に答える 2

5

いいえ、あなたは誤解しています。SS_NOTIFYを使用すると、CStaticはメッセージを受信しません。これにより、CStaticはメッセージを親に中継します。したがって、「MyStaticで直接メッセージマップを介してメッセージイベントを受信できるようになりました」は、誤った前提に基づいています。

コントロールは、メッセージを中継したり、他のトリック(グローバルフックなど)を行ったりして「一緒に遊んで」いない限り、コントロールは子ではなく、それ自体のメッセージのみを受信できるため、これは重要なポイントです。ただし、これらの場合は例外であり、「通常の」方法では、各ウィンドウがそれ自体のメッセージを受信します。

それであなたの質問に答えます:いいえ、親(CDialog)と子(CStatic)の両方にマウスイベントを「手動で」受信させたり、面倒なメッセージルーティングハックに関与させたりする方法はありません。したがって、あなたの場合、あなたがする必要があるのは、GetParent()-> SendMessage(WM_LBUTTONDOWN、...)などであり、WPARAMとLPARAMの値を手動で再作成します。または、CDialogで直接OnLButtonDownを呼び出す:GetParent()-> OnLButtonDown(...)。ただし、CDialogに返すマウス座標について考える必要がありますが、CDialogのクライアント座標に変換する必要がある場合があります。

于 2010-01-18T12:37:34.703 に答える
1

ベースのOnLButtonDownハンドラーを呼び出す場合は、メッセージを親に送信する必要があります。

CMyStatic::OnLButtonDown(UINT nFlags, CPoint point)
{
    CStatic::OnLButtonDown(nFlags, point);

    // custom handling
}
于 2010-01-19T18:06:50.143 に答える