使用Delphi VCL样式的平面工具栏按钮 – 通过下拉菜单修复工具栏项目?

这是关于在启用VCL样式时使工具栏按钮变平的 this question的后续行动.使用该问题的解决方案,现在我的大多数TActionToolbar按钮都是扁平的.但是,有一个工具栏按钮,其下拉菜单包含其他操作:

它仍然在它周围绘制按钮边缘.如何删除带有下拉菜单的工具栏按钮的按钮边框,以便它们与其他普通按钮匹配,看起来更像是在禁用VCL样式时?

解决方法

这种按钮是由TThemedDropDownButton类绘制的,因此必须覆盖此类和TThemedDropDownButton.DrawBackground方法.

使用same unit of the previous answer添加一个名为TThemedDropDownButtonEx的新类

TThemedDropDownButtonEx= class(TThemedDropDownButton)
  protected
    procedure DrawBackground(var PaintRect: TRect); override;
  end;

然后像这样实现DrawBackground方法

procedure TThemedDropDownButtonEx.DrawBackground(var PaintRect: TRect);
const
  CheckedState: array[Boolean] of TThemedToolBar = (ttbButtonHot,ttbButtonCheckedHot);
var
  LIndex : Integer;
begin
  LIndex := SaveDC(Canvas.Handle);
  try
    if Enabled and not (ActionBar.DesignMode) then
    begin
      if (MouseInControl or IsChecked or DroppedDown) and
         (Assigned(ActionClient) and not ActionClient.Separator) then
      begin
        StyleServices.DrawElement(Canvas.Handle,StyleServices.GetElementDetails(CheckedState[IsChecked or (FState = bsDown)]),PaintRect);

       if IsChecked and not MouseInControl then
          StyleServices.DrawElement(Canvas.Handle,StyleServices.GetElementDetails(ttbButtonPressed),PaintRect);
      end
      else
        ;
    end
    else
      ;
  finally
    RestoreDC(Canvas.Handle,LIndex);
  end;
end;

最后以这种方式修改TPlatformVclStylesStyle.GetControlClass方法

更改此代码

if AnItem.HasItems then
  case GetActionControlStyle of
    csStandard: Result := TStandardDropDownButton;
    csXPStyle: Result := TXPStyleDropDownBtn;
  else
    Result := TThemedDropDownButton;
  end
else

这样

if AnItem.HasItems then
  case GetActionControlStyle of
    csStandard: Result := TStandardDropDownButton;
    csXPStyle: Result := TXPStyleDropDownBtn;
  else
    Result := TThemedDropDownButtonEx;
  end
else

相关文章

 从网上看到《Delphi API HOOK完全说明》这篇文章,基本上都...
  从网上看到《Delphi API HOOK完全说明》这篇文章,基本上...
ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c+&#x...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和ED...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的...