【问题标题】:How to highlight header column on mouse hover?如何在鼠标悬停时突出显示标题列?
【发布时间】:2011-12-14 06:34:07
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: winapi visual-c++ hover


    【解决方案1】:

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

    【讨论】:

    • 是的 - 粗体字体是 DC 的默认字体。发布者可以发送 WM_GETFONT 到标题控件以获取正确的字体。
    • 是的,我使用 WM_GETFONT 消息来获取它。
    【解决方案2】:

    好吧,我解开了这个谜团:) 尽管我仍然不知道为什么在 WM_MOUSEMOVE 通知中 DrawThemeText 函数中使用的字体突然改变了。我的方法仍然依赖于捕获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
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多