Delphi timage 上的 DrawThemeBackground 导致白色背景

Delphi DrawThemeBackground on timage causing white background

我想使用 Windows 的原生外观,我正在尝试学习如何使用它。

我正在尝试用 Windows 工具按钮背景绘制 timage.canvas,但是 timage 的背景看起来是白色的,它看起来与 Windows 不一样, 我该如何解决?

这是我的代码;

procedure TForm1.Button1Click(Sender: TObject);
var
  theme: HTHEME;
begin
  theme := OpenThemeData(Handle, 'TOOLBAR');
  // error checking omitted for brevity
  try
    DrawThemeBackground(
      theme,
      Image1.Canvas.Handle,
      TP_BUTTON,
      TS_HOT,
      Image1.ClientRect,
      nil
    );
  finally
    CloseThemeData(theme);
  end;
end;

这是我在timage上应用主题后的结果图片:

如果你想要一个按钮,你应该要求 'BUTTON' 主题,而不是 'TOOLBAR'。

theme := OpenThemeData(Handle, 'BUTTON');

另外这一行应该在 try.

之前

主题部分和状态列表see this

从上面的列表中您会看到您使用的 iPartIdiStateId 不是正确的(尽管有效)。我建议改为使用 BP_PUSHBUTTONPBS_HOT

procedure TForm3.Button2Click(Sender: TObject);
var
  theme: HTHEME;
begin
  theme := OpenThemeData(Handle, 'BUTTON');
  try
    DrawThemeBackground(theme,
                        Image1.Canvas.Handle,
                        BP_PUSHBUTTON,
                        PBS_HOT,
                        Image1.ClientRect,
                        nil);
  finally
    CloseThemeData(theme);
  end;
end;

编辑 这是一张图片,用于比较 TToolButton 和 Windows 7 中的 TToolBar

如您所见,TToolbutton(在顶部的 TToolbar 上)在 'hot' 时没有 TButton 的蓝色外观。在工具栏下方,左侧是您的代码,右侧是我的建议。你问的是浅灰/白还是浅灰/蓝的区别?