【问题标题】:TToolBar paints incorrectly on non-themed WindowsTToolBar 在非主题 Windows 上绘制不正确
【发布时间】:2011-07-20 09:34:25
【问题描述】:

我最近注意到我们的一个应用程序在非主题 Windows 上绘制不正确。

工具栏是由嵌套在 TToolbar 中的 TSpeedButtons 构建的,而 TToolbar 又位于页面控件中。

在主题 Windows 上,一切看起来都不错。嗯,不太好,但还可以。

但是,在非主题 Windows 上,按钮内会出现奇怪的垂直线。

我四处搜索,但找不到任何关于此类问题的报告。 (很可能只是我的搜索功夫很烂。)有人知道这个问题的描述,或者更好的是,解决方法吗?

【问题讨论】:

  • 对不起,这些到底有什么问题?
  • @mj2008:请参阅“添加”、“编辑”、“删除”和“复制”按钮 - 它们在中间用垂直线绘制,不应该存在。
  • 在 D6 和 D2010 中重现,平面工具栏中的平面速度按钮。
  • @gabr:TToolbar 的设计目的不是容纳 TSpeedButtons。它的设计目的是容纳 TToolButtons,这些按钮不仅可以放在 ToolBar 上,而且是专门编写的,可以在工具栏上正确运行。您遇到的问题(尤其是按原样绘制分隔符的情况)是因为您使用了不兼容的 SpeedButton 并用工具按钮将它们分开。 TSpeedButton 在 TPanel 上运行良好,而 IIRC 就是在 MS 在 ComCtl 中提供 TToolBar/TToolButton 对之前设计的。一个带有 TToolBar w/TToolButtons 和一个 TPanel w/Speedbuttons 的快速测试应用程序会告诉你。
  • TToolBar.UpdateItemfStyle 中包含TBSTYLE_SEP,用于TB_INSERTBUTTON 消息。那似乎是垂直线所在的位置。但是,我不知道工具栏是如何工作的!!

标签: delphi toolbar


【解决方案1】:

TToolbar 不是为容纳 TSpeedButtons 而设计的。它旨在容纳TToolButtons,它们不仅可以坐在TToolBar 上,而且还专门编写用于在酒吧中正确运行。

您遇到的问题(尤其是按原样绘制分隔符的情况)是因为您使用了不兼容的 TSpeedButton 并用 TToolButton 分隔符分隔它们。 TSpeedButtonTPanel 上运行良好,而 IIRC 就是在 MS 在 ComCtl 中提供 TToolBar/TToolButton 对之前设计的。

一个带有TToolBarTToolButtons 和一个TPanelTSpeedButtons 的快速测试应用应该看看这是否能解决问题。

编辑:您的评论不太正确。 :)

TToolBar.AllowTextButtons 设置为True,然后将您想要加宽的按钮设置为tbsTextButton 的样式。如您所见,我使用了一个普通按钮、一个分隔符、一个文本按钮(带有文本和图像)、一个分隔符和另一个普通按钮。

【讨论】:

  • TToolButton 确实有效,但还有另一个问题 - 更改 TToolButton 的宽度会更改同一工具栏上所有其他按钮的宽度,这在我的情况下是完全不可接受的。
  • @Sertac:我不明白你的评论。这些只是我从一个 Glyfx 图像文件夹中抓取并放入图像列表进行测试的图像。捕获是在 WinXP 上使用 Delphi XE 进行的。我没有尝试对图像做任何事情 - 这不是答案的重点(或以任何方式与问题相关)。
  • @Ken - 我知道这与问题无关。我隐约记得论坛中的“黑色背景”图像问题,只是我希望 Gabr 切换到工具按钮不是问题。我没有批评答案,AAMOF 我投了赞成票。 :)
  • @Sertac:只是确保我没有遗漏什么。 IIRC,PNG 图像透明度、TImageList 和 WinXP 存在问题,但这不是我正在研究的问题。 :) 感谢您的投票。 :)
  • @Ken:感谢您对答案的补充。也许现在我会改变我的应用程序以使用 TToolButtons。
【解决方案2】:

正如 TOndrej 在 cmets 中所说,当 TSpeedButton.Flat.Transparent 都设置为 True 时会发生这种情况。正如 David 发现的那样,TToolbar 还必须将 .Flat 设置为 True 才会出现问题。

不需要更改 VCL 源代码的解决方法是将 .Transparent 设置为 False。

【讨论】:

  • 我没有提到Transparent,但你是对的,将其设置为False 确实有帮助。没有主题,Windows XP,Delphi XE。 +1 一个简单的解决方法。
  • 非常难看的解决方法。如何停止使用带有速度按钮的 TToolbar。也不需要更改 VCL 源代码。如果你想要一个带有速度按钮的面板,那么就使用一个带有速度按钮的面板,而忘记工具栏。
  • @Warren:不丑。在非主题 Windows 上,透明度无论如何都没有任何用处。
  • 将速度按钮控件放入工具栏的问题不仅仅是这个有趣的线条渲染和透明度问题。
  • @Warren:永远不会遇到任何问题,并且该应用已经存在 12 年了。
猜你喜欢
  • 1970-01-01
  • 2017-01-12
  • 2016-07-01
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
相关资源
最近更新 更多