关于这个问题,我看到有人在2004年提出过,不知道当时解决了没。
http://bbs.csdn.net/topics/50435702具体的描述如下:
我重载了Button,并对OnPaint、OnLButtonDown、OnLButtonUp、OnEraseBkgnd这四个事件进行了处理。但是发现在CDialog无法触发重载按钮的onclick事件。
重载按钮的代码如下:class CMyBitmapButton : public CButton
{
DECLARE_DYNAMIC(CMyBitmapButton)public:
CMyBitmapButton();
~CMyBitmapButton();protected:
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
afx_msg void OnPaint();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
};
IMPLEMENT_DYNAMIC(CMyBitmapButton, CBitmapButton)CMyBitmapButton::CMyBitmapButton()
{
}CMyBitmapButton::~CMyBitmapButton()
{
}
BEGIN_MESSAGE_MAP(CMyBitmapButton, CBitmapButton)
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_PAINT()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()void CMyBitmapButton::OnLButtonDown(UINT nFlags, CPoint point)
{
  //todo
}
void CMyBitmapButton::OnLButtonUp(UINT nFlags, CPoint point)
{
  //todo
}
void CMyBitmapButton::OnPaint()
{
  //todo
}
void CMyBitmapButton::OnEraseBkgnd(CDC* pDC)
{
  //todo
}CDialog的按钮点击事件如下:BEGIN_MESSAGE_MAP(CDlgLobby, CDialog)
...
ON_BN_CLICKED(IDC_TABLE_1_1, &CDlgLobby::OnSelectTable1)
...
END_MESSAGE_MAP()先在MyDialog上面放一个Button,然后通过CMyBitmapButton m_hTable1_1;
m_hTable1_1.SubclassDlgItem(IDC_TABLE_1_1, this);关联到自定义的按钮.现在的问题是MyDialog收不到onclick消息,该怎么处理

解决方案 »

  1.   

    当然啦,你需要在OnLButtonDown和OnLButtonUp中加上CButton::OnLButtonDown和CButton::OnLButtonUp
      

  2.   

    void CMyButton::OnLButtonDown(UINT nFlags, CPoint point)
    {
    // TODO: 在此添加消息处理程序代码和/或调用默认值 CButton::OnLButtonDown(nFlags, point);
    }
      

  3.   

    是这样子的哦,加上CButton::OnLButtonDown和CButton::OnLButtonUp在debug模式下,程序执行会报错哦。所以当时给去掉了。
    现在按照您的说法,我又给加回去了。发现release版本不会报错,debug版本就报截图的那个错误
      

  4.   

    class CMyBitmapButton : public CButtonBEGIN_MESSAGE_MAP(CMyBitmapButton, CBitmapButton)这2个好像没对应啊,要么都是CButton,要么都是CBitmapButton
      

  5.   

    谢谢,这的确是个问题。修复后,debug模式下,还是会报那个错误IMPLEMENT_DYNAMIC(CMyBitmapButton, CButton)CMyBitmapButton::CMyBitmapButton()
    {
    IsLButtonDown = FALSE;
    }CMyBitmapButton::~CMyBitmapButton()
    {
    }
    BEGIN_MESSAGE_MAP(CMyBitmapButton, CButton)
    ON_WM_LBUTTONDOWN()
    ON_WM_LBUTTONUP()
    ON_WM_PAINT()
    ON_WM_ERASEBKGND()
    END_MESSAGE_MAP()
      

  6.   

    CMyBitmapButton m_hTable1_1;  这个放到成员变量中m_hTable1_1.SubclassDlgItem(IDC_TABLE_1_1, this);