【问题标题】:How Can I Implement Highlighted Toolbar Icons With Delphi?如何使用 Delphi 实现突出显示的工具栏图标?
【发布时间】:2011-06-20 22:05:13
【问题描述】:

我想在工具栏图标的关联操作将“已检查”属性设置为 true 时突出显示它们。我想以类似于 Microsoft Office 2003 的方式进行操作,例如请参阅此图像中的粗体和左对齐图标:

图像周围有一个框,背景已更改为橙色。

我如何使用 Delphi 2009 实现这一点?

作为奖励,是否还有一种方法可以对相关项目的菜单中的图标执行相同的操作?例如与标尺和标记条目如下:


跟进:

感谢安德烈亚斯,感谢您对我的问题的简单而正确的回答。作为一名转换为 Delphi 2009 的 Delphi 4 程序员,我对 Delphi 5 到 7 的 VCL 添加不够熟悉,因此 TActionManager、TActionToolbar 及其工作原理不在我的 Delphi 词汇表中。这是基于 Delphi 使用类似于 Microsoft O/S 主题的样式的能力。

但是,根据您的回答以及使用它的一些研究,我确认我不想以这种方式这样做。一个有启发性的 Embarcadero 线程回复:弹出菜单:"Checked" items with icon no longer shown as sunken?,Peter 下面贡献了他的专业知识,让我意识到我根本不想更改为 XP 主题,因为这会对 Vista 和 Windows 7 用户产生影响,带他们回到青铜时代。

真正的罪魁祸首是操作系统主题希望您尊重某些事情。德尔福试图遵守规则。我可以回到 XP、XP 风格/主题和 XP 颜色映射。在这种模式下,选中的项目将被突出显示。这就是我真正想要的——突出显示检查的项目。我以 Office 2003 为例,因为它是我想要的那种亮点。但我真的不想完全改变主题并强制我的程序焕然一新。对于 Vista 和 Windows 7 用户来说,这尤其会使事情看起来不自然。

理想的情况是,如果我可以拥有另一组图像,这些图像将在对象被检查时应用......但没有“CheckedImages”属性。或者,如果选中,则以编程方式或自动修改图像(例如,禁用图像获得其启用图像的灰度版本)。

我仍然不介意听取任何人的意见,如果有任何方法可以实现这个或其他可能同样有效的方法,而不会改变我的程序的整个外观。

【问题讨论】:

  • 标准的TToolbarTMainMenuTPopupMenu 不是已经这样做了吗?而且它们甚至比您有屏幕截图的那些更好,因为它们以本地方式进行!
  • 我个人使用 Toolbar2000+SpTBX,比起 TToolbar 和 TActionManager 组件更喜欢它们。

标签: delphi user-interface menu toolbar


【解决方案1】:

在表单中添加TActionManager,并创建一些操作(例如,粗体、斜体和下划线)。确保将每个操作的 AutoCheck 属性设置为 true。然后添加TActionToolbar。双击动作管理器,将三个动作拖到工具栏上。现在将TXPColorMap 添加到表单中,并将其分配给操作管理器。同时添加TImageList 并添加粗体、斜体和下划线图标(来自C:\Program Files (x86)\Common Files\CodeGear Shared\Images\GlyFX\Icons\BMP\16x16)。将图像列表分配给操作管理器。

将工具栏图标设置为仅显示字形而不显示标题。最后,将 ActionManager 的Style 属性设置为XP Style。最终结果就是你所寻求的。

【讨论】:

  • +1 干得好!看到您推荐内置组件而不是自定义组件,有些惊讶! ;-)
  • @David:我也是(或者,本机 Windows 控件)。但这很好地回答了他的问题。
【解决方案2】:

也可以使用普通的TToolBar,将DrawingStyle设置为dsGradient,我刚发现。

【讨论】:

  • 这是一个更好、更简单的解决方案。它不会将整体主题更改为 XP 作为您的其他方法。太糟糕了,其中一些小功能隐藏在工具栏的 50 多个属性中,而且很难找到。
【解决方案3】:

在不改变整个主题的情况下,我认为这可能会奏效一半:

  1. 向 ImageList 添加额外的图像,这样对于给定的操作,就有两个(或更多)图像可供选择。

  2. 不要将“checked”属性更改为 true 或 false,而是将 ImageIndex 更改为备用图像,例如:

    if WS = 1 then begin
      ElTree.Align := alTop;
    //  TileTopBottomAction.Checked := true;  --- take this out
    //  TileLeftRightAction.Checked := false;  --- take this out
      TileTopBottomAction.ImageIndex := 47;  { hilighted image }
      TileLeftRightAction.ImageIndex := 14;  { regular image }
    end 
    else begin
      ElTree.Align := alLeft;
    //  TileTopBottomAction.Checked := false;  --- take this out
    //  TileLeftRightAction.Checked := true;  --- take this out
      TileTopBottomAction.ImageIndex := 13;  { regular image }
      TileLeftRightAction.ImageIndex := 48;  { hilighted image }
    end;
    

现在工具栏上的图像将如下所示:

在菜单上像这样:

这种方法的好处是它也可以在菜单上使用,并且您可以使用多个图像来表示您想要的内容。此外,它不会破坏程序采用的主题(XP、Vista、Windows 7 等)。

此方法的缺点是:您只能使用 16x16 的图像区域,并且无法在其周围绘制超出这些限制的框,就像将“checked”属性设置为 true 时发生的那样。

【讨论】:

  • 我不喜欢它。我喜欢选定/向下项目周围的清晰矩形。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 2022-06-10
  • 2018-01-01
  • 1970-01-01
  • 2014-01-25
  • 1970-01-01
相关资源
最近更新 更多