我试图按照示例禁用表单上控件的颜色.
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样式实用工具来获得所需的结果,但这不是一件容易的事.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。