MFC按钮控件能否检测鼠标右键单击事件?

3

我正在尝试创建一个带有多个按钮的对话框,这些按钮在左右点击时会分别改变颜色。
那么,如何处理特定按钮的右键单击事件?

ON_RBUTTONDOWN 对于特定按钮无效。


1
http://www.go4expert.com/articles/mouse-button-event-handler-t381/ - Himanshu
2
按钮无法处理右键。您需要进行子类化。 - Jonathan Potter
@Himanshu请将您的评论发布为答案,以帮助其他在未来遇到相同问题的用户 :) - Tarang Gupta
1
@TarangGupta,好的,我会很快发布它。 - Himanshu
2个回答

5

由于MFC不允许在CButton控件上捕获所有事件,但有一些常用的事件,如BN_CLICKED和BN_DOUBLECLICKED。因此,要在CButton MFC上捕获右键鼠标事件,您需要从CButton派生一个新类。

MyButton.h

#if !defined(AFX_MYBUTTON_H__46A1ECCC_0FAD_485A_B6B8_C21B6538148E__INCLUDED_)
#define AFX_MYBUTTON_H__46A1ECCC_0FAD_485A_B6B8_C21B6538148E__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MyButton.h : header file
// CMyButton window

class CMyButton : public CButton  //CMyButton  =>derive from the CButton.
{
// Construction
public:
    CMyButton();

// Attributes
public:

// Operations
public:

// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CMyButton)
    //}}AFX_VIRTUAL

// Implementation
public:
    virtual ~CMyButton();

    // Generated message map functions
protected:
    //{{AFX_MSG(CMyButton)
    afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()
};

#endif // !defined(AFX_MYBUTTON_H__46A1ECCC_0FAD_485A_B6B8_C21B6538148E__INCLUDED_)

MyButton.cpp

#include "stdafx.h"
#include "MyButton.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMyButton

CMyButton::CMyButton()
{
}

CMyButton::~CMyButton()
{
}

BEGIN_MESSAGE_MAP(CMyButton, CButton)
    //{{AFX_MSG_MAP(CMyButton)
    ON_WM_RBUTTONUP()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyButton message handlers

void CMyButton::OnRButtonUp(UINT nFlags, CPoint point) 
{
    // TODO: Add your message handler code here and/or call default
    NMHDR hdr;
    hdr.code = NM_RCLICK;
    hdr.hwndFrom = this->GetSafeHwnd();
    hdr.idFrom = GetDlgCtrlID();
    TRACE("OnRButtonUp");
    this->GetParent()->SendMessage(WM_NOTIFY, (WPARAM)hdr.idFrom, (LPARAM)&hdr);
}

现在,在您的对话框类中,您需要捕获 CMyButton 传递的消息。 传递的消息是 NM_RCLICK ,您可以将其捕获为:

ON_NOTIFY(NM_RCLICK, IDC_BUTTON1, OnRClicked)

您的成员函数必须使用以下原型进行声明:

afx_msg void OnRClicked( NMHDR * pNotifyStruct, LRESULT * result );

更多详情请访问链接 mouse-button-event-handler


0

虽然被接受的答案有效,但我发现更容易陷入WM_CONTEXT_MENU,这对于任何控件都是可能的,无需新的类,添加的代码行数也少得多。以下是一个示例:

https://stackoverflow.com/a/63633383/9655696


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接