如何在鼠标悬停时突出显示标题列?

时间:2011-12-14 06:34:07

标签: winapi visual-c++ hover

我有一个ListView控件的所有者绘制标题。如果标题不是所有者绘制的,当鼠标位于其中一个标题列上时,我们会有一个很好的悬停效果。在我绘制了标题列所有者之后,我必须自己处理悬停效果。

为了捕获它,我在标题窗口中监视WM_MOUSEMOVE消息,当我收到此消息时,我首先重写具有更改背景的标题列,然后在其上绘制文本和其他必要图形。只有一个但......文本的字体变为粗体

你可以在下面看到它。第一个标题是我的,第二个标题来自Windows资源管理器,在日期修改列上具有悬停效果。

enter image description here

为什么字体突然变粗? 这是实现悬停效果的正确方法吗?也许我错过了一些特定于Header的通知?

2 个答案:

答案 0 :(得分:1)

在所有者绘制模式中,您必须处理包括字体在内的所有内容。不要以为你知道当前的DC字体是什么。如果需要特定字体,则需要在绘制文本之前在DC中选择一种字体。

答案 1 :(得分:0)

好吧,我解开了这个谜:)虽然我仍然不知道为什么DrawThemeText函数中使用的字体在WM_MOUSEMOVE通知中突然改变了。我的方法仍然依赖于捕获WM_MOUSEMOVE事件并重新绘制鼠标指针下方的列。为了不更改默认标题字体(如我的问题中的插图),我使用以下代码来获取和设置它:

HFONT displayFont = (HFONT)SendMessage( header, WM_GETFONT, 0, 0 ); // gets default header font
SelectObject(hdc, displayFont); // sets device context to use newly found font

此解决方案至少有一个缺点:我过于频繁地重绘标题(每次鼠标在标题列中移动)。