一个SDI程序基于CFormView视。上面放一个CStatic控件,给视图添加双击消息,运行程序后,双击视图,会有弹出消息响应。 但是双击CStatic类控件,却没有响应

来源:互联网 发布:邬桑为什么哭 知乎 编辑:程序博客网 时间:2024/05/29 15:18

一个SDI程序基于CFormView视。上面放一个CStatic控件,给视图添加双击消息,运行程序后,双击视图,会有弹出消息响应。
但是双击CStatic类控件,却没有响应,请问如何添加这个消息??

同样的问题,一个派生自CWnd类的控件,创建在CFormView视图上,此时却无法响应鼠标的左右键 双击消息,
请问如何处理?


其实是要求CStatic把消息反射出来.

因为你单击CStatic控件,控件本身接受.
主窗口是不接受这个消息的.

你要得到消息,3个办法:
1.创造自己的CStatic扩展类 (子类化亦可), 在自己CStatic扩展类的WndProc中就可以得到双击消息.
2.使用CStatic Notify 的方法,使主窗口可以得到双击的消息

3.使用PreTranslateMessage的方法,该方法能获取所有控件,窗口的消息.


    this->ModifyStyle(0, SS_NOTIFY);     // 设置 notify
    // this->ModifyStyle(SS_NOTIFY, 0);  // 取消 notify


昨天一直在做avatar头像在工具里的显示,让策划调好头像位置后,保存一个世界矩阵到avatar文件里,游戏里显示avatar头像时,就只需要读取那个世界矩阵就可以了,一切准备工作已经就绪,实验成功了,本来在dialog的消息响应,为了改进操作手段,我决定把鼠标事件放到cstatic里,让策划可以直觉操作,所以,这玩意需要相应2个鼠标事件:

ON_MOUSEMOVE

ON_MOUSEWHEEL

实现当鼠标左键按下,移动鼠标,则移动视图。

当鼠标右键按下,移动鼠标,则旋转avatar。

 

然而,遇到的问题还是挺多的。

 

高兴的写好了这些处理代码,各种相应都写好了,结果怎么也相应不了。

 

原来有一个很重要的原因, 需要给CStatic设置notify,可以在资源界面里改,也可以在创建函数里改,这样一改,就可以支持ON_MOUSEMOVE消息了。可是还有一个,ON_MOUSEWHEEL,还是无法响应。

 

原来是这样的,CStatic正如其名,他是一个static控件,而static控件默认是无法获取输入焦点的,例如EditCtrl,你一点,就可以输入文字了,但静态控件不同,就是让你看的。所以,为了让它支持支持MOUSEWHEEL消息,就需要让他获取焦点。

简单的,在CStatic 的ON_LBUTTONDOWN和ON_RBUTTONDOWN事件响应里,手动让他SetFocus就行了。

没有焦点的控件,对OnMouseWheel不响应的,所以要下得到焦点.


void CStaticTest::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
SetFocus();
CStatic::OnLButtonDown(nFlags, point);
}
//
void CStaticTest::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
SetFocus();
CStatic::OnRButtonDown(nFlags, point);
}
现在可以:
BOOL CStaticTest::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
{
// TODO: Add your message handler code here and/or call default
AfxMessageBox("haha");//
return CStatic::OnMouseWheel(nFlags, zDelta, pt);
}

 

一般意义上,控件不响应消息,可能只有2中原因,一种是外部原因,控件的消息被父控件过滤了,还有就是自身原因啦,这个控件,本身它只不支持某种消息呢,或者是否需要打开某种开关才能支持呢,比如像CStatic的notify开关,以及需要获取焦点才能响应MOUSEWHEEL这样的情况。


0 0