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)
当工具栏具有平面样式时,本机控件会为分隔符按钮绘制垂直线。因此,如果您删除平面样式,则 VCL 的分隔线将被保留。当应用程序有主题时,您可以安全地删除样式,主题工具栏按钮不考虑平面样式(为什么工具栏分隔符会考虑平面样式,我不知道)。然而,当主题被禁用时,将会再次出现两行。在这种情况下,保留分隔符而不是分隔符似乎是更好的选择。
人们可能会猜测取消该属性会产生文档Flat
所述的任何影响。然而,启用时无条件启用它。所以需要一个API调用;TToolBar.CreateParams
StyleServices
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 在哪里绘制它,我怀疑是否有。