自定义的消息没起作用

baobaodediaozhui 2012-03-12 10:28:43
class MyStaButton : public CStatic,继承了一个MyStaButton 类,打算用来做按钮。于是响应如下几个消息(鼠标移动,鼠标离开,鼠标悬停)

afx_msg void OnMouseMove(UINT nFlags, CPoint point);
afx_msg LRESULT OnMouseLeave(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OnMouseHover(WPARAM wParam, LPARAM lParam);
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
其中(鼠标离开,鼠标悬停)自定义的消息
#define WM_MOUSELEAVE (WM_USER +130)//用户自定义鼠标消息
#define WM_MOUSEHOVER (WM_USER +135)
然后.cpp里
BEGIN_MESSAGE_MAP(MyStaButton, CStatic)
ON_WM_MOUSEMOVE()
ON_MESSAGE(WM_MOUSELEAVE,&MyStaButton::OnMouseLeave)//该处使用自定义消息发送形式
ON_MESSAGE(WM_MOUSEHOVER,&MyStaButton::OnMouseHover)
ON_WM_CTLCOLOR()
ON_WM_SETCURSOR()
END_MESSAGE_MAP()
消息响应函数
LRESULT MyStaButton::OnMouseLeave(WPARAM wParam, LPARAM lParam)//未响应
{
m_btnState = BTN_LEAVE;
TRACE(_T("Leave \n"));

this->Invalidate();
bis_tracked = FALSE;
MessageBox(_T("aa"));
return 0;
}
LRESULT MyStaButton::OnMouseHover(WPARAM wParam, LPARAM lParam)
{

m_btnState = BTN_HOVER;
TRACE(_T("Hover \n"));

return 0;
}
编译通过,运行时杯具的发现OnMouseLeave,OnMouseHover未起作用。因为TRACE没起作用,打断点发现程序没有执行这两个消息函数。
求解
...全文
136 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
baobaodediaozhui 2012-03-12
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 baobaodediaozhui 的回复:]
我去掉了
#define WM_MOUSELEAVE (WM_USER +130)//用户自定义鼠标消息
#define WM_MOUSEHOVER (WM_USER +135)
然后ON_MESSAGE(WM_MOUSELEAVE,&MyStaButton::OnMouseLeave)//该处使用自定义消息发送形式
ON_MESSAGE(WM_MOUSEHOVER,&My……
[/Quote]
说未标明的标识符......
求解。。。。
酒红色的泪 2012-03-12
  • 打赏
  • 举报
回复
我是用VS2008的,低版本的VC没有尝试过
baobaodediaozhui 2012-03-12
  • 打赏
  • 举报
回复
我去掉了
#define WM_MOUSELEAVE (WM_USER +130)//用户自定义鼠标消息
#define WM_MOUSEHOVER (WM_USER +135)
然后ON_MESSAGE(WM_MOUSELEAVE,&MyStaButton::OnMouseLeave)//该处使用自定义消息发送形式
ON_MESSAGE(WM_MOUSEHOVER,&MyStaButton::OnMouseHover)
说我WM_MOUSELEAVE,WM_MOUSEHOVER没定义。。。。。
酒红色的泪 2012-03-12
  • 打赏
  • 举报
回复
调试看看上面这段代码执行了吗
baobaodediaozhui 2012-03-12
  • 打赏
  • 举报
回复
好吧,我错了。MSDN了下,确实有。但是VS2005怎么找不到呢?这两个消息怎么去触发呢?
我在OnMouseMove响应函数里加了如下代码的啊!
if(!bis_tracked)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(TRACKMOUSEEVENT);
tme.dwFlags = TME_LEAVE|TME_HOVER; //
tme.hwndTrack = GetSafeHwnd();
tme.dwHoverTime = 80;
_TrackMouseEvent(&tme);//此函数寄送鼠标消息(函数则在commctrl.h里定义,而由COMCTRL32.DLL导出)
bis_tracked = true; //MOUSELEAVE消息必须由此函数触发
}
CStatic::OnMouseMove(nFlags, point);
酒红色的泪 2012-03-12
  • 打赏
  • 举报
回复
有,见WinUser.h。
另外,如果不是系统消息,用户自定义消息也要用户自己触发,否则系统是不会平白无故触发消息的。
baobaodediaozhui 2012-03-12
  • 打赏
  • 举报
回复
WM_MOUSELEAVE和WM_MOUSEHOVER我记得这两个消息系统没有吧,只有OnMouseMove(我不确定哦)。我在VS2005也没找到这两个哦
酒红色的泪 2012-03-12
  • 打赏
  • 举报
回复
WM_MOUSELEAVE和WM_MOUSEHOVER是系统本身就有的消息,你为什么要重新定义呢?这样你当然接收不到系统发出的这两个消息了。

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧