如何更改已禁用的TComboBox(Delphi)的字体颜色?

时间:2015-09-01 11:12:44

标签: delphi fonts combobox controls delphi-xe2

我有一个TComboBox Style:= csOwnerDrawVariable;,我希望将黑色的Font颜色显示为黑色而不是“灰色”。

这是我从这个来源得到的:

procedure TCustomComboBox.WndProc(var Message: TMessage);
begin
  case Message.Msg of
    CN_CTLCOLORMSGBOX .. CN_CTLCOLORSTATIC, //48434..48440
    WM_CTLCOLORMSGBOX .. WM_CTLCOLORSTATIC:
    begin
      Color:= GetBackgroundColor; // get's the current background state
      Brush.Color:= Color;
    end;
  end;
  inherited;
end;

enter image description here

但我希望内部Edit控件的字体颜色为黑色。

如果我在Font.Color:= clBlack处更改WndProc或其他任何事情都没有发生。

谷歌搜索给了我一些关于将TEdit更改为只读的提示,但这对我没有帮助。

更新

现在这是我从@Abelisto获得tipp之后的简短解决方案。

TCustomComboBox = class (TComboBox)
protected
  procedure DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); override;
end;

procedure TCustomComboBox.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState);
begin
  if odComboBoxEdit in State then begin // If we are drawing item in the edit part of the Combo
    if not Enabled then
      Canvas.Font.Color:= clBlack; // Disabled font colors
    Canvas.Brush.Color:= GetBackgroundColor; // Get the right background color: normal, mandatory or disabled
  end;
  inherited DrawItem(Index, Rect, State);
end;

1 个答案:

答案 0 :(得分:5)

使用OnDrawItem事件。 组件在设计时没有特殊设置 - 全部在代码中执行。只需将表单放在ComboBox1和Button1上,然后将事件分配给它们。

procedure TForm3.Button1Click(Sender: TObject);
begin
  ComboBox1.Enabled := not ComboBox1.Enabled; // Change Enabled state
end;

procedure TForm3.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  txt: string;
begin
  if Index > -1 then
    txt := ComboBox1.Items[Index]
  else
    txt := '';
  if odComboBoxEdit in State then // If we are drawing item in the edit part of the Combo
    if ComboBox1.Enabled then
    begin // Enabled colors
      ComboBox1.Canvas.Font.Color := clRed; // Foreground
      ComboBox1.Canvas.Brush.Color := clWindow; // Background
    end
    else
    begin // Disabled colors
      ComboBox1.Canvas.Font.Color := clYellow;
      ComboBox1.Canvas.Brush.Color := clGray;
    end;

  ComboBox1.Canvas.TextRect(Rect, Rect.Left, Rect.Top, txt); // Draw item. It may be more complex 
end;

procedure TForm3.FormCreate(Sender: TObject);
begin
  with ComboBox1 do // Setup combo props
  begin
    Items.Add('111');
    Items.Add('222');
    Items.Add('333');
    ItemIndex := 1;
    Style := csOwnerDrawVariable;
  end;
end;