





















lazarus在某些linux版本使用gtk2可能修改TEdit等控件输入框的背景颜色无效的问题,最终在lazarus官方论坛找到处理方法,并在AI的帮助下完成。现在只需在uses的最后添加UniGTKColorFix这个单元就可以。
使用UniGTKColorFix前:

使用UniGTKColorFix后:

使用方法:
新uses最后加上UniGTKColorFix就可以。
unit Unit1; {$mode objfpc}{$H+} interface uses Classes, SysUtils, Forms, Controls, Graphics, Dialogs, DBCtrls, StdCtrls, ExtCtrls, MaskEdit, Spin, EditBtn , UniGTKColorFix ; type { TForm1 }
直接上UniGTKColorFix.pas代码:
unit UniGTKColorFix; {$mode objfpc}{$H+} interface // 仅在 Linux GTK2 环境下生效,其他系统自动忽略,不影响跨平台编译 {$IFDEF LCLGTK2} uses Classes, SysUtils, Graphics, Controls, StdCtrls, DBCtrls,ExtCtrls,MaskEdit,Spin, EditBtn,GroupedEdit, gtk2, WSProc; // ========================================== // 辅助函数:应用 GTK2 强制颜色样式 // ========================================== procedure ApplyGTKColorStyle(AWidget: PGtkWidget; AColor: TColor); // ========================================== // 1. 增强 TEdit // ========================================== type TEdit = class(StdCtrls.TEdit) protected procedure CreateWnd; override; procedure SetColor(Value: TColor); override; end; // ========================================== // 2. 增强 TDBEdit // ========================================== TDBEdit = class(DBCtrls.TDBEdit) protected procedure CreateWnd; override; procedure SetColor(Value: TColor); override; end; // ========================================== // 3. 增强 TComboBox // ========================================== TComboBox = class(StdCtrls.TComboBox) protected procedure CreateWnd; override; procedure SetColor(Value: TColor); override; end; // ========================================== // 4. 增强 TDBComboBox // ========================================== TDBComboBox = class(DBCtrls.TDBComboBox) protected procedure CreateWnd; override; procedure SetColor(Value: TColor); override; end; // ========================================== // 5. 增强 TLabeledEdit // ========================================== TLabeledEdit = class(ExtCtrls.TLabeledEdit) protected procedure CreateWnd; override; procedure SetColor(Value: TColor); override; end; // ========================================== // 6. 增强 TMaskEdit // ========================================== TMaskEdit = class(MaskEdit.TMaskEdit) protected procedure CreateWnd; override; procedure SetColor(Value: TColor); override; end; // ========================================== // 7. 增强 TSpinEdit // ========================================== TSpinEdit = class(Spin.TSpinEdit) protected procedure CreateWnd; override; procedure SetColor(AValue: TColor); override; end; // ========================================== // 8. 增强 TFloatSpinEdit // ========================================== TFloatSpinEdit = class(Spin.TFloatSpinEdit) protected procedure CreateWnd; override; procedure SetColor(AValue: TColor); override; end; // ========================================== // 9. 增强 TEditButton // ========================================== TEditButton = class(EditBtn.TEditButton) protected procedure CreateWnd; override; //改名避免冲突,添加 reintroduce 指示字 function GetMyColor: TColor; procedure SetMyColor(AValue: TColor); reintroduce; public property Color: TColor read GetMyColor write SetMyColor; end; implementation procedure ApplyGTKColorStyle(AWidget: PGtkWidget; AColor: TColor); var RCStr: String; R, G, B: Byte; StyleName: String; HexColor: String; begin if not GTK_IS_WIDGET(AWidget) then Exit; // 1. 转换颜色 RedGreenBlue(ColorToRGB(AColor), R, G, B); HexColor := IntToHex(R, 2) + IntToHex(G, 2) + IntToHex(B, 2); // 2. 生成唯一样式名 (基于控件内存地址) StyleName := 'forced_color_' + IntToHex(PtrUInt(AWidget), 8); // 3. 构建 RC 字符串:同时设置 base 和 bg,覆盖焦点和非焦点状态 RCStr := 'style "' + StyleName + '" {' + LineEnding + ' engine "" {}' + LineEnding + // 禁用主题引擎 ' bg[NORMAL] = "#' + HexColor + '"' + LineEnding + ' bg[ACTIVE] = "#' + HexColor + '"' + LineEnding + ' base[NORMAL] = "#' + HexColor + '"' + LineEnding + // 关键:Edit输入框背景 ' base[ACTIVE] = "#' + HexColor + '"' + LineEnding + // 关键:Edit焦点背景 ' text[NORMAL] = "#000000"' + LineEnding + ' text[ACTIVE] = "#000000"' + LineEnding + '}' + LineEnding + 'widget "*.' + StyleName + '" style "' + StyleName + '"'; // 4. 应用 gtk_rc_parse_string(PChar(RCStr)); gtk_widget_set_name(AWidget, PChar(StyleName)); gtk_widget_reset_rc_styles(AWidget); end; // ========================================== // TEdit 实现 // ========================================== procedure TEdit.CreateWnd; begin inherited CreateWnd; // 句柄创建后,应用当前 Color 属性 ApplyGTKColorStyle(PGtkWidget(Handle), Color); end; procedure TEdit.SetColor(Value: TColor); begin inherited SetColor(Value); // 运行时修改颜色,立即应用 if HandleAllocated then ApplyGTKColorStyle(PGtkWidget(Handle), Value); end; // ========================================== // TDBEdit 实现 // ========================================== procedure TDBEdit.CreateWnd; begin inherited CreateWnd; ApplyGTKColorStyle(PGtkWidget(Handle), Color); end; procedure TDBEdit.SetColor(Value: TColor); begin inherited SetColor(Value); if HandleAllocated then ApplyGTKColorStyle(PGtkWidget(Handle), Value); end; // ========================================== // TComboBox 实现 // ========================================== procedure TComboBox.CreateWnd; begin inherited CreateWnd; ApplyGTKColorStyle(PGtkWidget(Handle), Color); end; procedure TComboBox.SetColor(Value: TColor); begin inherited SetColor(Value); if HandleAllocated then ApplyGTKColorStyle(PGtkWidget(Handle), Value); end; // ========================================== // TDBComboBox 实现 // ========================================== procedure TDBComboBox.CreateWnd; begin inherited CreateWnd; ApplyGTKColorStyle(PGtkWidget(Handle), Color); end; procedure TDBComboBox.SetColor(Value: TColor); begin inherited SetColor(Value); if HandleAllocated then ApplyGTKColorStyle(PGtkWidget(Handle), Value); end; // ========================================== // TLabeledEdit 实现 // ========================================== procedure TLabeledEdit.CreateWnd; begin inherited CreateWnd; ApplyGTKColorStyle(PGtkWidget(Handle), Color); end; procedure TLabeledEdit.SetColor(Value: TColor); begin inherited SetColor(Value); if HandleAllocated then ApplyGTKColorStyle(PGtkWidget(Handle), Value); end; // ========================================== // TMaskEdit 实现 // ========================================== procedure TMaskEdit.CreateWnd; begin inherited CreateWnd; ApplyGTKColorStyle(PGtkWidget(Handle), Color); end; procedure TMaskEdit.SetColor(Value: TColor); begin inherited SetColor(Value); if HandleAllocated then ApplyGTKColorStyle(PGtkWidget(Handle), Value); end; // ========================================== // TSpinEdit 实现 // ========================================== procedure TSpinEdit.CreateWnd; begin inherited CreateWnd; ApplyGTKColorStyle(PGtkWidget(Handle), Color); end; procedure TSpinEdit.SetColor(AValue: Graphics.TColor); begin inherited SetColor(AValue); if HandleAllocated then ApplyGTKColorStyle(PGtkWidget(Handle), AValue); end; // ========================================== // TFloatSpinEdit 实现 // ========================================== procedure TFloatSpinEdit.CreateWnd; begin inherited CreateWnd; ApplyGTKColorStyle(PGtkWidget(Handle), Color); end; procedure TFloatSpinEdit.SetColor(AValue: Graphics.TColor); begin inherited SetColor(AValue); if HandleAllocated then ApplyGTKColorStyle(PGtkWidget(Handle), AValue); end; // ========================================== // TEditButton 实现 // ========================================== // ========================================== // TEditButton 实现 // ========================================== function TEditButton.GetMyColor: TColor; begin // 读取父类属性 Result := inherited Color; end; procedure TEditButton.SetMyColor(AValue: TColor); begin // 1. 调用父类写入 inherited Color := AValue; // 2. 应用 GTK 修复 // 注意:TEditButton 是复合控件,必须对内部的 Edit 控件应用样式 if Assigned(Edit) and Edit.HandleAllocated then ApplyGTKColorStyle(PGtkWidget(Edit.Handle), AValue); end; procedure TEditButton.CreateWnd; begin inherited CreateWnd; // 同样针对内部 Edit 控件 if Assigned(Edit) and Edit.HandleAllocated then ApplyGTKColorStyle(PGtkWidget(Edit.Handle), GetMyColor); end; {$ENDIF} // end of LCLGTK2 end.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。