将TButtonedEdit图像与TComboBox默认图像匹配

时间:2011-01-26 15:20:14

标签: delphi delphi-2010 tbuttonededit

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

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

1 个答案:

答案 0 :(得分: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 themes in combobox")。

Mike Lischke的"Windows XP Theme Explorer"可以帮助您找到正确的“元素”和“详细信息”。并查看this SO thread