0

我的项目中有一个 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 上的鼠标的情况下)。

LButtonDown 事件始终得到成功处理,即使我在鼠标位于 CRectTracker 上时按下鼠标按钮也是如此。

LButtonUp 消息可能有什么问题?

谢谢

4

1 回答 1

0

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

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

于 2013-01-23T13:31:58.547 回答