c++ - 如何处理Microsoft Visual C++(MFC)中特定控件的鼠标悬停事件?

在我的应用程序中,我需要处理鼠标悬停事件以更改按钮的背景。使用MFC类向导,我在该项目的事件列表中找不到鼠标悬停条目。我尝试使用PreTranslateMessage,但是不起作用。我该如何处理该事件?

最佳答案

默认情况下不会生成鼠标悬停事件。您必须通过使用适当填充的TrackMouseEvent调用TRACKMOUSEEVENT structure来请求它们:

TRACKMOUSEEVENT tme = { 0 };
tme.cbSize = sizeof( tme );
tme.dwFlags = TME_HOVER;
tme.hwndTrack = myButton;
tme.dwHoverTime = myHoverTime;  // HOVER_DEFAULT, or the hover timeout in milliseconds.
::TrackMouseEvent( &tme );

如果鼠标悬停在myButton上myHoverTime毫秒,则系统将生成 WM_MOUSEHOVER消息。

由于 WM_MOUSEHOVER消息已发布到请求鼠标悬停消息的窗口,因此您将必须派生一个自定义按钮控件,并在其消息映射中添加适当的条目。特别是,您将必须使用 ON_WM_MOUSEHOVER()宏并实现 afx_msg void OnMouseHover(UINT, CPoint)(请参阅 WM_ Message Handlers: L - M以获取引用)。