【发布时间】:2019-10-11 17:00:21
【问题描述】:
BCN_HOTITEMCHANGE 通知代码没有被 CMFCButton 类调用。
我正在使用 Visual Studio 2010
执行的步骤:
1) 从资源编辑器向我的对话框添加一个 CButton。
2) 使用我自己的派生类 CMFCButtonEx 派生自 CMFCButton 类(又派生自 CButton 类)。
3) 向我的对话框声明 CMFCButtonEx 'm_btn_ex' 实例变量。
4) 添加 DDX_Control(pDX, IDC_BUTTON_EX, m_btn_ex);
5) 当我单击此按钮时,派生类中的所有消息处理程序都会被调用,但与 OnButtonItemChange 函数关联的 BCN_HOTITEMCHANGE 通知除外。该函数中的断点永远不会命中。所有其他消息处理程序(OnMouseMove、OnMouseLeave 和 OnButtonClicked)都被正确调用,并且它们中的断点被命中。
请注意,如果我从 CButton 类通过 CMFCButtonEx 类派生,那么我可以在 OnButtonItemChange 函数中命中断点,即正确处理 BCN_HOTITEMCHANGE 通知代码
由于某种原因,CMFCButton 类没有正确处理我的 BCN_HOTITEMCHANGE 通知代码。我不明白我在这里做错了什么。我也尝试使用 TBN_HOTITEMCHANGE 通知代码而不是 BCN_HOTITEMCHANGE 但 OnButtonItemChange 函数中的断点从未命中。
谢谢!
CMFCButtonEx 类代码:
IMPLEMENT_DYNAMIC(CMFCButtonEx, CMFCButton)
CMFCButtonEx::CMFCButtonEx()
{
m_bMouseTracking = FALSE
}
CMFCButtonEx::~CMFCButtonEx()
{
}
BEGIN_MESSAGE_MAP(CMFCButtonEx, CMFCButton)
//{{AFX_MSG_MAP(CMFCButtonEx)
ON_WM_MOUSEMOVE()
ON_WM_MOUSELEAVE()
ON_NOTIFY_REFLECT_EX(BCN_HOTITEMCHANGE, OnButtonItemChange)
//ON_NOTIFY_REFLECT_EX(TBN_HOTITEMCHANGE, OnButtonItemChange)
ON_CONTROL_REFLECT_EX(BN_CLICKED, OnButtonClicked)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
BOOL CMFCButtonEx::OnButtonClicked()
{
AfxMessageBox("MFC Button Clicked");
return FALSE;
}
BOOL CMFCButtonEx::OnButtonItemChange(NMHDR* pNMHDR, LRESULT* pResult)
{
NMBCHOTITEM* pnmbchotitem = (NMBCHOTITEM*)pNMHDR;
AfxMessageBox("MFC Button Item Change");
*pResult = 0;
return FALSE;
}
void CMFCButtonEx::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_bMouseTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_LEAVE;
tme.hwndTrack = this->m_hWnd;
if (::_TrackMouseEvent(&tme))
{
m_bMouseTracking = TRUE;
AfxMessageBox("MFC Button Mouse Move");
}
}
CMFCButton::OnMouseMove(nFlags, point);
}
void CMFCButtonEx::OnMouseLeave()
{
m_bMouseTracking = FALSE;
AfxMessageBox("MFC Button Mouse Move");
CMFCButton::OnMouseLeave();
}
【问题讨论】:
标签: c++ visual-studio-2010 visual-c++ mfc