Win32 API中的Treeview控件 - 如何使用不同的字体显示单个树视图项?

时间:2014-04-08 18:38:01

标签: winapi treeview controls

我遇到了一个问题,我需要使用Symbol字体在树视图项(属于符号字符集)中显示一些字符,而其他字符使用默认的系统字体( Windows 7 上的Segoi UI 自定义绘图允许我们使用不同的字体绘制不同的项目,但我想使用不同的字体绘制相同的项目字符串,因为它适用于字符串中的每个字符,如上所述。 所以,我所做的不是那么令人满意的结果w.r.t.当项目数量更远时,在水平滚动上绘制性能是这样的:

  1. 我在使用TVS_NOHSCROLL样式的树视图控件中禁用了水平滚动(因为我在树视图窗口中使用我自己的滚动条控件来处理所有水平滚动)
  2. 我对树视图控件进行了细分,在子类winproc中,我处理了水平滚动通知和鼠标通知(我在那里进行了自己的测试,并发送了像TVM_EXPAND和TVM_SELECT这样的信息,因为mosue点击/双击点击)。此外,滚动条范围是根据我的自定义绘制字符串的宽度(所有项目中的最大长度)设置的。
  3. 我在收到CDDS_ITEMPOSTPAINT时使用我自己的字体为项目中的每个字符绘制每个项目的字符串。
  4. 上面的方法(我为了简洁而省略了一些细节)是有效的但是有一些问题让我在这里发布这个问题并寻找一种替代方式:

    问题:

    1. 我创建的水平滚动条控件是托管"内部"树视图窗口底部的树视图控件。但是,当项目数超出树视图客户区可垂直容纳的数量时,最后一个可见的树视图项会被滚动条控件遮挡。这可以通过不使滚动条成为树视图的子项并将其托管在树视图窗口正下方来解决。但我不想这样做,因为滚动条通常应该是树视图的子窗口。

    2. 这是主要的一个。由于我在每个水平滚动条上自己绘制项目,因此水平滚动时的绘图性能非常慢,并且在滚动时也会导致闪烁。

    3. 任何想法都会受到高度赞赏,因为我在过去的一周里一直在努力解决这个问题而没有成功。

      如果你想看看我采取的方法,我也可以在这里发布相关的代码,但我确信有一个更好的办法,必须有一些其他人会面对这个问题并在过去解决了它。

      提前致谢。

2 个答案:

答案 0 :(得分:0)

自定义绘制可让您随意绘制项目。您不限于每个项目使用一种字体。当您收到NM_CUSTOMDRAW通知时,请在提供的HDC上为指定项目绘制您想要的任何内容。您可以用一种字体绘制文本,用不同的字体绘制文本,等等。确保返回CDRF_SKIPDEFAULT,以便TreeView本身不会尝试在项目上绘制任何内容。

答案 1 :(得分:0)