对话框上多个自绘按钮,其中一个需要响应WM_MOUSEHOVER,应该怎么办?

vaprant 2013-09-30 01:11:55
我的自绘按钮(class CBigButton : public CButton)用于实现鼠标移动时不同状态下的形态

如果这些按钮仅仅需要实现单击消息,那么很简单,每一个控件变量响应BN_CLICKED就好,但是现在其中过一个按钮还需要响应WM_MOUSEHOVER,应该怎么办呢?
...全文
126 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
vaprant 2013-09-30
  • 打赏
  • 举报
回复
总该是笨了,再请教下 能否把判断放在BEGIN_MESSAGE_MAP(CMGDDlg, CDialog)和END_MESSAGE_MAP()之间呢? 就像普通按钮的 ON_BN_CLICKED(IDC_EXIT, &CMGDDlg::OnBnClickedExit) 这个形式一样,这样在处理函数中就只关心程序的问题了
vaprant 2013-09-30
  • 打赏
  • 举报
回复
是笨了,使用VB多了,总是反应慢一拍啊,哈哈,给分,谢谢啦~~~
vaprant 2013-09-30
  • 打赏
  • 举报
回复
哦,成了 LRESULT CMyDlg::OnMyMsg(WPARAM wParam, LPARAM lParam) { CWnd* lp = (CWnd*)wParam; if (lp->GetDlgCtrlID() == IDC_BUTTON_ABLE) { AfxMessageBox(_T("msg!")); } } 这样就好了
hurryboylqs 2013-09-30
  • 打赏
  • 举报
回复
你还可以根据指定的ID才发送这个消息也可以,太多路子了,方法总是那么的一如既往的多
hurryboylqs 2013-09-30
  • 打赏
  • 举报
回复
不是在wParam里传递了指定按钮的指针对象进来吗?你判断下就可以了,你也可以传递按钮的ID进来根据ID 是每个按钮都会弹的,但是你过滤下就可以了啊,这种还用教 LRESULT CMyDlg::OnMyMsg(WPARAM wParam, LPARAM lParam) { int nID = (int)wParam; if(nID== IDC_BUTTON1) { //是我要的按钮事件进来了 } return 0; } 发送的时候: GetParent()->SendMessage(WM_BUTTON_HOVER,(WPARAM) GetDlgCtrlID(),0);
vaprant 2013-09-30
  • 打赏
  • 举报
回复
引用 7 楼 hurryboylqs 的回复:
不用与控件变量关联,发送的时候带上控件的this指针或者窗口句柄即可 GetParent()->SendMessage(WM_BUTTON_HOVER,(WPARAM)this,0);
我的对话框可以收到我自定义的消息 LRESULT CMyDlg::OnMyMsg(WPARAM wParam, LPARAM lParam) { AfxMessageBox(_T("msg!")); return 0; } 现在是每一个和CBigButton类关联的按钮都会弹出AfxMessageBox(),我仅仅需要其中一个能够处理这个消息!
hurryboylqs 2013-09-30
  • 打赏
  • 举报
回复
不用与控件变量关联,发送的时候带上控件的this指针或者窗口句柄即可 GetParent()->SendMessage(WM_BUTTON_HOVER,(WPARAM)this,0);
vaprant 2013-09-30
  • 打赏
  • 举报
回复
引用 5 楼 hurryboylqs 的回复:
自定义一个消息即可,然后向父窗口发送这个消息,在对话框里响应
可以麻烦贴一下代码吗?我就是这个不会,ON_MESSAGE(message, memberFxn)好像不行,不能和某一个控件变量关联!!
hurryboylqs 2013-09-30
  • 打赏
  • 举报
回复
自定义一个消息即可,然后向父窗口发送这个消息,在对话框里响应
vaprant 2013-09-30
  • 打赏
  • 举报
回复
最好是我的CBigButton类收到WM_MOUSEHOVER消息之后,再抛出一个消息 然后我可以根据需要在对话框类中捕捉这个消息,让其中一个按钮响应,但是不知道代码怎么写!
vaprant 2013-09-30
  • 打赏
  • 举报
回复
引用 1 楼 hurryboylqs 的回复:
那就响应WM_MOUSEHOVER消息咯,这个消息是由 _TrackMouseEvent来触发的,需要设定一个触发时间 比如:

		TRACKMOUSEEVENT tme;
		tme.cbSize = sizeof(tme);
		tme.hwndTrack = m_hWnd;
		tme.dwFlags = TME_LEAVE|TME_HOVER;
		tme.dwHoverTime = 1;
		m_bTracking = _TrackMouseEvent(&tme);
你好,这个代码我已经写好了,在我的class CBigButton 中,我的对话框上的所有按钮均和这个类关联! 但是,如果在类中实现WM_MOUSEHOVER,例如在状态栏给出一个提示等,那么所有的按钮都会出现提示,我的要求是仅仅有一个按钮会出现提示。 如:共3个按钮,都随着WM_MOUSEHOVER,画一个边框,但是其中一个,不仅画边框,还要在状态栏给出提示!
hurryboylqs 2013-09-30
  • 打赏
  • 举报
回复
上面的代码一般放在OnMouseMove里即可,具体参考这里: http://blog.csdn.net/s_52588/article/details/8230053
hurryboylqs 2013-09-30
  • 打赏
  • 举报
回复
那就响应WM_MOUSEHOVER消息咯,这个消息是由 _TrackMouseEvent来触发的,需要设定一个触发时间 比如:

		TRACKMOUSEEVENT tme;
		tme.cbSize = sizeof(tme);
		tme.hwndTrack = m_hWnd;
		tme.dwFlags = TME_LEAVE|TME_HOVER;
		tme.dwHoverTime = 1;
		m_bTracking = _TrackMouseEvent(&tme);

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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