1

我的应用程序使用标准 TComboBoxes 和 TButtonedEdits 来生成具有更复杂下拉面板的控件。我希望这两个控件看起来相同。特别是,我希望我的 TButtonedEdits 上的图像与 TComboBoxes 上的图像相同,无论程序在哪个当前或未来的操作系统上运行(也就是说,假设这个图像是由操作系统决定的,而不是 Delphi )。

我假设我必须在运行时将向 TComboBox 提供图像的资源安装到 TImageList 中,以使其可用于我的 TButtonedEdits。如何定位和提取该资源?

4

1 回答 1

2

您可以使用主题引擎自己绘制按钮 - 尝试这样的初学者:

uses
  Themes;

procedure DrawComboBoxButton(ACanvas: TCanvas; ADown, AMouseInControl: Boolean; const ARect: TRect);
var
  ComboElem: TThemedComboBox;
  Details: TThemedElementDetails;
begin
  if ThemeServices.ThemesEnabled then
  begin
    if ADown then
      ComboElem := tcDropDownButtonPressed
    else if AMouseInControl then
      ComboElem := tcDropDownButtonHot
    else
      ComboElem := tcDropDownButtonNormal;
    Details := ThemeServices.GetElementDetails(ComboElem);
    ThemeServices.DrawElement(ACanvas.Handle, Details, ARect);
  end
  else
  begin
    if ADown then
      DrawFrameControl(ACanvas.Handle, ARect, DFC_SCROLL, DFCS_SCROLLCOMBOBOX or DFCS_PUSHED)
    else
      DrawFrameControl(ACanvas.Handle, ARect, DFC_SCROLL, DFCS_SCROLLCOMBOBOX);
  end;
end;

procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
  DrawComboBoxButton(PaintBox1.Canvas, False, False, Bounds(0, 0, 20, 20));
  DrawComboBoxButton(PaintBox1.Canvas, True, False, Bounds(20, 0, 20, 20));
end;

(改编自Embarcadero 论坛中的“组合框中的 Windows 主题”主题)。

Mike Lischke 的“Windows XP 主题资源管理器”可以帮助您找到正确的“元素”和“详细信息”。看看这个 SO 线程

于 2011-01-26T15:37:43.197 回答