Delphi主题工具栏可以在工具按钮之间居中使用分隔线吗?

Dav*_*nan 7 windows delphi winapi

我注意到Delphi工具栏有一种令人讨厌的奇怪之处.我有一个TToolbar逻辑图标组.为了使分组脱颖而出,我想使用带有样式的分隔符按钮tbsDivider.

当我这样做时,它看起来像这样:

在此输入图像描述

请注意每个图标之间的双垂直线.右手一个位于分隔符工具按钮的中间.左手一个位于分隔符工具按钮的左边缘.

所以,我可以切换到tbsSeparator删除中间行:

在此输入图像描述

但我并不热衷于此,因为我希望分频器处于中间位置.

我查看了我的真实应用程序的古老版本,发现它有居中的分隔符.当禁用Windows主题时,似乎可以实现.以下是它的外观tbsDivider并删除了应用程序清单:

在此输入图像描述

那是我正在寻找的布局.当主题活跃时,这是否可以实现?

我确实在Embarcadero论坛上找到了关于这个问题的讨论,但是没有有用的见解:https://forums.embarcadero.com/message.jspa?messageID = 467842

为了完整起见,这里是.dfm文件的相关摘录

object ToolButton1: TToolButton
  Left = 0
  Top = 0
  ImageIndex = 0
end
object ToolButton2: TToolButton
  Left = 23
  Top = 0
  Width = 16
  ImageIndex = 1
  Style = tbsDivider
end
object ToolButton3: TToolButton
  Left = 39
  Top = 0
  ImageIndex = 1
end
object ToolButton4: TToolButton
  Left = 62
  Top = 0
  Width = 16
  ImageIndex = 2
  Style = tbsDivider
end
object ToolButton5: TToolButton
  Left = 78
  Top = 0
  ImageIndex = 2
end
Run Code Online (Sandbox Code Playgroud)

Ser*_*yuz 3

当工具栏具有平面样式时,本机控件会为分隔符按钮绘制垂直线。因此,如果您删除平面样式,则 VCL 的分隔线将被保留。当应用程序有主题时,您可以安全地删除样式,主题工具栏按钮不考虑平面样式(为什么工具栏分隔符会考虑平面样式,我不知道)。然而,当主题被禁用时,将会再次出现两行。在这种情况下,保留分隔符而不是分隔符似乎是更好的选择。

人们可能会猜测取消该属性会产生文档Flat所述的任何影响。然而,启用时无条件启用它。所以需要一个API调用;TToolBar.CreateParamsStyleServices

procedure TForm1.FormCreate(Sender: TObject);
var
  TbStyle: DWORD;
begin
  if StyleServices.Enabled then begin
    TbStyle := SendMessage(ToolBar1.Handle, TB_GETSTYLE, 0, 0);
    SendMessage(Toolbar1.Handle, TB_SETSTYLE, 0, TbStyle and not TBSTYLE_FLAT);
  end;
end;
Run Code Online (Sandbox Code Playgroud)


这消除了部分问题,剩下的部分是分隔线不正好位于两个按钮之间的中心。VCL 的问题是,它自己不想划清界限。因此它调用主题 api,将分隔线绘制到分隔符的左侧。为了避免这种情况,VCL 将分隔符矩形的右半部分传递给 api,并且该线大约位于中间。我不知道是否有任何方法可以准确地告诉主题 api 在哪里绘制它,我怀疑是否有。