我有一个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;
但我希望内部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;
答案 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;