COleControl中未处理的LButtonUp窗口消息

时间:2013-01-23 12:10:58

标签: c++ mfc ole

我的项目中有一个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消息有什么问题?

由于

1 个答案:

答案 0 :(得分:0)

这只是跟踪器工作方式不可避免的副作用。单击跟踪器或其中一个大小调整手柄后,MFC将捕获鼠标并启动模式消息循环。这将取消鼠标移动和按钮消息以实现跟踪操作。在看到左按钮消息,看到Escape键或捕获丢失之前,该循环不会退出。因此,当该循环处于活动状态时,您的OnLButtonUp()函数无法运行,该消息在被分派之前就被截获了。

您需要以不同方式执行此操作,而不是依赖于OnLButtonUp()。很难给出具体的建议,因为你没有描述为什么需要它。如果你需要更多的洞察力,模态循环的源代码在atlmfc / src / mfc / trckrect.cpp,CRectTracker :: TrackHandle()。