加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Delphi XE2:在组件上禁用vcl Style

发布时间:2020-12-15 09:14:27 所属栏目:大数据 来源:网络整理
导读:我试图按照示例禁用表单上控件的颜色. TStyleManager.Engine.RegisterStyleHook(ClrMeans.TwwDBComboDLG,TEditStyleHook); 但是,当注册或取消注册第三方控件(infopower TwwDBComboDlg)或标准VCL TEdit时,我会收到异常.任何人对此或任何建议都有任何疑问 解决
我试图按照示例禁用表单上控件的颜色.

TStyleManager.Engine.RegisterStyleHook(ClrMeans.TwwDBComboDLG,TEditStyleHook);

但是,当注册或取消注册第三方控件(infopower TwwDBComboDlg)或标准VCL TEdit时,我会收到异常.任何人对此或任何建议都有任何疑问

解决方法

这里的 link解释了你需要知道的东西.

基本上,你需要在其中放入一个“空钩子”,这是你已经知道的,或者你需要放入一个“VCL颜色”钩子,这是你所缺少的一半.另一半是你的零指针问题.

为了使TEdit衍生物(和你的一样)看起来像VCL标准颜色,使它与你的控件一起工作所需的代码是这样的:

uses
  Winapi.Messages,Vcl.Controls,Vcl.StdCtrls,Vcl.Forms,Vcl.Themes,Vcl.Styles;

type

TEditStyleHookColor = class(TEditStyleHook)
  private
    procedure UpdateColors;
  protected
    procedure WndProc(var Message: TMessage); override;
    constructor Create(AControl: TWinControl); override;
  end;

implementation


type
 TWinControlH= class(TWinControl);


constructor TEditStyleHookColor.Create(AControl: TWinControl);
begin
  inherited;
  //call the UpdateColors method to use the custom colors
  UpdateColors;
end;

//Here you set the colors of the style hook
procedure TEditStyleHookColor.UpdateColors;
var
  LStyle: TCustomStyleServices;
begin
 if Control.Enabled then
 begin
  Brush.Color := TWinControlH(Control).Color; //use the Control color
  FontColor   := TWinControlH(Control).Font.Color;//use the Control font color
 end
 else
 begin
  //if the control is disabled use the colors of the style
  LStyle := StyleServices;
  Brush.Color := LStyle.GetStyleColor(scEditDisabled);
  FontColor := LStyle.GetStyleFontColor(sfEditBoxTextDisabled);
 end;
end;

//Handle the messages of the control
procedure TEditStyleHookColor.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    CN_CTLCOLORMSGBOX..CN_CTLCOLORSTATIC:
      begin
        //Get the colors
        UpdateColors;
        SetTextColor(Message.WParam,ColorToRGB(FontColor));
        SetBkColor(Message.WParam,ColorToRGB(Brush.Color));
        Message.Result := LRESULT(Brush.Handle);
        Handled := True;
      end;
    CM_ENABLEDCHANGED:
      begin
        //Get the colors
        UpdateColors;
        Handled := False;
      end
  else
    inherited WndProc(Message);
  end;
end;

Procedure ApplyVCLColorsStyleHook(ControlClass :TClass);
begin
    if Assigned(TStyleManager.Engine) then
       TStyleManager.Engine.RegisterStyleHook(ControlClass,TEditStyleHookColor);
end;

initialization
     ApplyVCLColorsStyleHook(TwwDBComboDlg);

NIL的问题是,如果你没有打开VCL主题,那么Engine就是nil,你应该检查并从该代码返回而不调用你正在调用的那个函数.在这里您可以打开主题,以防错过它:

有趣的一面:获得the VCL Styles utils图书馆.这是一个使用它来改变东西颜色的例子:

TCustomStyleExt(TStyleManager.ActiveStyle).SetStyleColor(scEdit,clWindow);
 TCustomStyleExt(TStyleManager.ActiveStyle).SetStyleFontColor(sfEditBoxTextNormal,clWindowText);

您可以创建样式,并将这些样式应用于特定控件,甚至可以扩展主题引擎,也可以使用VCL样式实用工具来获得所需的结果,但这不是一件容易的事.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读