3

显示与Items不同的字符串值的一种非常简单的方法是将Style属性csDropDown设置csOwnerDrawFixedAndreas Rejbrand几年前回答的那样。

问题是:一旦你这样做,你就会失去对 Windows 主题的支持。
同样的限制适用于使用csOwnerDrawVariable

这两个Style值被转换为添加CBS_OWNERDRAWFIXEDCBS_OWNERDRAWVARIABLE(除了CBS_DROPDOWNLIST)Windows COMBOBOX 控件的样式

反过来,CBS_OWNERDRAWFIXED或者CBS_OWNERDRAWVARIABLE导致您立即失去对 Windows 主题的支持

当您像颜色选择器一样进行完全自定义绘画时,一切都很好。但是当你只想替换绘制的文本时,它不是。

Windows COMBOBOX 控件似乎没有办法解决这个问题,所以我想知道:如何从 Delphi 模拟 Windows 主题?

我认为它与DrawThemedBackground有关,但是自从我完成了认真的 Delphi Control 工作以来已经有一段时间了,所以任何关于如何开始的指示也很好(即使它们使我的假设无效)。

4

3 回答 3

2

几年前,我为TurboPower Orpheus ComboBox添加了主题支持。查看 {$IFDEF VERSION2010}...{$ENDIF} 部分中的代码。这应该让您对需要什么有一个很好的了解。

于 2013-04-17T20:45:16.220 回答
0

我在drawitem中修复了它

procedure Tfrmxxx.cbTypeDrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
begin
    with (Control as TCombobox).Canvas do
    begin
    if odSelected in State then
      Brush.Color := StyleServices.GetSystemColor(clHighlight);// $00FFD2A6;

    FillRect(Rect);
    TextOut(Rect.Left, Rect.Top, (Control as TCombobox).Items[Index]);
    if odFocused In State then
    begin
      Brush.Color := (Control as TCombobox).Color;
      DrawFocusRect(Rect);
    end;
  end;
end;
于 2020-04-09T09:20:45.760 回答