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

Delphi XE2 VCL样式,如何在TBitBtn上禁用VCL样式?,delphi,delphi-xe2,vcl-styles,Delphi,Delphi Xe2,Vcl Styles,我在DelphiXe2中使用了新的VCL样式系统,它的工作很好,但有一种形式我想例外。此表单包含多个TBitBtn控件,每个TBitBtn控件都有自己不同的字体颜色(clRed、clBlue、clLime等)。 由于样式实现,所有TBitBtn控件的标题均以黑色显示,而不是设置颜色。 是否有任何TStyleHook可以在TBitBtn控件上注册,从而禁用该窗体上TBitBtn控件上的样式?组件不使用vcl样式挂钩,此控件使用TButtonGlyph类(在vcl.buttongs单元的实现部分中定

我在DelphiXe2中使用了新的VCL样式系统,它的工作很好,但有一种形式我想例外。此表单包含多个TBitBtn控件,每个TBitBtn控件都有自己不同的字体颜色(clRed、clBlue、clLime等)。 由于样式实现,所有TBitBtn控件的标题均以黑色显示,而不是设置颜色。 是否有任何TStyleHook可以在TBitBtn控件上注册,从而禁用该窗体上TBitBtn控件上的样式?

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

我想到的唯一选项是创建一个interposer类,截取
TBitBtn
控件的
CN\u DRAWITEM
消息,然后执行您自己的代码来绘制按钮

  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;

为什么使用
TBitBtn
而不是
TButton
?我问这个问题是因为
TButton
使用了Vcl风格的钩子,并且可以轻松定制。我们最近将应用程序从Delphi4迁移到Delphi XE2。这个TBitBtn按钮功能是十年前引入的,我们不知道当时为什么使用它。更改一个工作代码总是有风险的,所以我不怀疑不经过深思熟虑就更改控制。如果我们找到了一个可行的解决方案,并且没有太多的代码更改,那么其他人就必须以不同的方式思考,并按照您的建议引入新的组件,这将需要更多的测试和努力。似乎我几乎只想去掉所有的TBitBtn,然后使用其他东西。但如果这是不可能的,那么这将是一条出路。我真的不喜欢那些“实现部分类”。TSpeedButton也使用了一个。我认为这个解决方案没有多大帮助,因为你提到TButtonGlyph是私有的。似乎我需要用其他控件更改TBitBtn