如何使用Delphi实现突出显示的工具栏图标?

时间:2011-02-03 19:38:00

标签: delphi user-interface menu toolbar

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

Toolbar example

图像是用一个框围绕它绘制的,背景已经变为橙色。

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

作为奖励,还有一种方法可以使用相关项目菜单中的图标做同样的事情吗?例如如下所示,标尺和标记条目:

Menu example


跟进:

谢谢Andreas,我的问题是一个简单而正确的答案。作为Delphi 4程序员转换为Delphi 2009,我对Delphi 5到7的VCL添加不够熟悉,因此TActionManager,TActionToolbar及其工作不在我的Delphi词汇表中。这是基于Delphi使用类似于Microsoft O / S主题的风格的能力。

然而,有了你的回答,以及使用它的一些研究,我确认我不想以这种方式做到这一点。一个有启发性的Embarcadero线程:弹出菜单:"Checked" items with icon no longer shown as sunken?与Peter Below贡献他的专业知识,让我意识到我根本不想改变XP主题,因为那会对Vista和Windows 7做一些事情。用户,将他们带回青铜时代。

这里真正的罪魁祸首是O / S主题要求您尊重某些事物。德尔福试图遵守规则。我可以回到XP,XP风格/主题和XP Color Map。在此模式下,已检查的项目将被点亮。这就是我想要的 - 突出显示已检查的项目。我以Office 2003为例,因为它是我想要的那种高光。但我真的不想完全改变主题并强迫我的程序焕然一新。对于Vista和Windows 7用户来说,这会让事情看起来不自然。

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

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

3 个答案:

答案 0 :(得分:13)

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

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

Toolbar sample http://privat.rejbrand.se/toolbar.png

答案 1 :(得分:2)

我也可以使用普通TToolBarDrawingStyle设置为dsGradient,我刚刚发现。

Sample toolbar with dsGradient as DrawingStyle http://privat.rejbrand.se/toolbar2.png

答案 2 :(得分:0)

在不改变整个主题的情况下,我认为这可能会有所体现:

  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;
    
  3. 现在图片在工具栏上显示如下:

    toolbar

    并在菜单上显示:

    menu

    这种方法的好处在于它也适用于菜单,你可以有多个图像来表示你想要的东西。此外,它不会破坏程序所采用的主题(XP,Vista,Windows 7等)。

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