我的项目中有一个COleControl对象。在这个COleControl中,我有一个CRectTracker对象。
我想要处理WM_LButtonUp的windows消息(事件)。(当用户停下来按下鼠标左键时)。
在我的.h文件中,我写道:
afx_msg void OnLButtonUp(UINT nFlags, CPoint point);
在我的.cpp文件中
BEGIN_MESSAGE_MAP(CMyControl, COleControl)
我添加了
ON_WM_LBUTTONUP()
然后我开发了一种方法
void CMyControl::OnLButtonUp(UINT nFlags, CPoint point)
我对windows消息LButtonDown做了同样的事情。
当我将鼠标左键留在控件中时,方法会获得句柄,一切都会正常工作。当鼠标跟踪器位于CRectTracker对象上时,当我离开鼠标左键时,就会出现问题。在这种情况下,不会处理鼠标LButtonUp消息。
我尝试使用Spy++,我可以看到windows消息WM_LButtonUp的存在并按预期发生。但这是我的代码,它不会得到处理(只是在CRectTracker上使用鼠标的情况)。
即使当鼠标在CRectTracker上时按下鼠标键时,LButtonDown事件也始终得到成功处理。
LButtonUp消息会有什么问题?
谢谢
发布于 2013-01-23 13:31:59
这只是跟踪器工作方式不可避免的副作用。一旦您单击跟踪器或其中一个大小调整手柄,MFC就会捕获鼠标并启动一个模式消息循环。它将提取鼠标移动和按键向上的消息以实现跟踪操作。该循环不会退出,直到看到左按钮向上的消息,看到Esc键或捕获丢失。因此,您的OnLButtonUp()函数不能在该循环处于活动状态时运行,消息在被分派之前就被截获了。
您需要以不同的方式执行此操作,而不是依赖于OnLButtonUp()。很难给出具体的建议,因为你没有描述为什么需要它。如果您需要更深入的了解,可以在atlmfc/src/mfc/trckrect.cpp,CRectTracker::TrackHandle()中找到模态循环的源代码。
https://stackoverflow.com/questions/14479418
复制相似问题