Delphi XE2 VCL样式,如何在TBitBtn上禁用VCL样式?

时间:2012-08-30 11:17:56

标签: delphi delphi-xe2 vcl-styles

我在Delphi XE2中使用新的VCL样式系统,它的工作正常,但在一个Form上我想要异常。此表单包含多个TBitBtn控件,每个TBitBtn控件都有自己的字体颜色(clRed,clBlue,clLime等)与其他颜色不同。 由于Style实现,所有TBitBtn控件的标题都以黑色而不是设置颜色显示。 是否有任何可以在TBitBtn控件上注册的TStyleHook,它在该窗体上禁用了TBitBtn控件上的样式?

1 个答案:

答案 0 :(得分:2)

TBitBtn组件不使用vcl样式钩子,此控件使用TButtonGlyph类(在Vcl.Buttons单元的实现部分中定义和实现)来绘制按钮使用Windows主题或当前的vcl样式,此类(TButtonGlyph)在本机之外无法访问,因此您在这里运气不佳。

我想到的唯一选择是创建一个内插器类并拦截CN_DRAWITEM控件的TBitBtn消息,然后执行自己的代码来绘制按钮。

  TBitBtn = class(Vcl.Buttons.TBitBtn)
  private
   procedure MyDrawItem(const DrawItemStruct: TDrawItemStruct);
  public
   procedure CNDrawItem(var Message: TWMDrawItem); message CN_DRAWITEM;
  end;

procedure TBitBtn.CNDrawItem(var Message: TWMDrawItem);
begin
  MyDrawItem(Message.DrawItemStruct^);
end;

procedure TBitBtn.MyDrawItem(const DrawItemStruct: TDrawItemStruct);
begin
  //the new code goes here.
end;