c++ CTreeCtrl项的边界矩形

fsi0uk1n  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(121)

在过去,我们使用Stingray树控件来描绘Map的图例。

现在我们想应用MFC CTreeCtrl来完成这项工作。Stingray控件的优点是您可以轻松地更改特殊项的边框。为了绘制图像和文本,我们使用了OnPaint方法。
MFC API列出了方法GetItemRect。尽管在互联网上的研究,我们没有找到一个等效的设置矩形的特定项目。
如果有人能告诉我们如何改变一个项目的边框,以创建Map的图例,那就太好了。
提前感谢!
注意:改变一个矩形的高度和宽度就足够了。

zzoitvuj

zzoitvuj1#

项目的宽度由其内容(图像+文本)决定。高度可以通过调用CTreeCtrl::SetItemHeight()方法(或发送TVM_SETITEMHEIGHT消息)来设置,尽管我通常不建议这样做,因为我认为系统会分配足够的垂直空间来容纳文本和图像(两者中的最大值,但您可以尝试)。最好避免自定义绘制,而是使用Win32提供的标准机制:图像列表,用于您的图像和标准文本绘图。为什么要使用OnPaint()?以上这些不都满足你的需求了吗?
SetItemHeight()文档提到:

  • cyHeight*
  • 指定树视图中每个项目的新高度(以像素为单位)。如果这个参数小于图像的高度,那么它将被设置为图像的高度。

这意味着您可以通过图像的大小来控制项目的高度(图像列表的所有成员都具有相同的大小)。

编辑:

是的,你想要可变高度的项目,但你必须检查什么是技术上可行的。Tree-View控件只能有相同高度的项-TVM_SETITEMHEIGHT消息设置所有项的高度。没有一些回调(或“通知”或什么)询问应用程序关于项目的高度或矩形。如果你想要可变高度的项目,你必须自己绘制整个东西,在这种情况下,它甚至不需要是一个树视图,它可以只是一个静态控件。由于你只想使用你的控制作为一个传奇,即没有用户输入,选择等,它应该是足够的-它只需要可扩展/可伸缩,也许滚动。
至于图像列表,它的所有成员必须具有相同的大小,这是由Windows/API设计的。如果你的不是,你可以垫较小的最大尺寸。这只是图形工作,在图像编辑应用程序的帮助下更容易完成,比如PaintShop Pro(专有的,但非常便宜)或GIMP(免费的,但有一个奇怪的UI),因为VS图像编辑器是一个笑话。您最好为整个图像列表创建一个图像文件,以便批量编辑图像(图例标签)。不知道Alpha(32位)图像是否适用于树视图控件中的图像列表。如果没有,则必须使用24位图像,其背景颜色与树视图控件相同。

相关问题