如何获取使用Windows 7的图像在树视图控件中绘制父节点?

RRU*_*RUZ 15 delphi winapi custom-controls

我正在使用一个混合两个窗口控件(listview和treeview)的自定义控件.在某些时候,我需要绘制使用Windows 7(启用主题)的图像来识别父节点,我正在使用DrawThemeBackground具有TVP_GLYPH部分和GLPS_CLOSED状态的函数(我尝试了与TREEVIEW该类相关的所有部分和状态而没有运气),但结果图像总是旧的(+)或( - ).

此图像显示了该问题

在此输入图像描述

我想绘制箭头图像(黑色圆圈内部)而不是(+)符号(橙色圆圈内部).

这是我用来绘制图像的示例代码.

uses
  UxTheme;

procedure TForm40.Button1Click(Sender: TObject);
var
  iPartId : integer;
  iStateId: integer;
  hTheme  : THandle;
begin
  hTheme  := OpenThemeData(Handle, VSCLASS_TREEVIEW);

  iPartId := TVP_GLYPH;
  iStateId:= GLPS_CLOSED;          
  //iPartId := TVP_TREEITEM;
  //iStateId:= TREIS_NORMAL;
  if hTheme <> 0 then
    try

      //if (IsThemeBackgroundPartiallyTransparent(hTheme, iPartId, iStateId)) then
      //    DrawThemeParentBackground(Handle, PaintBox1.Canvas.Handle, nil);

      DrawThemeBackground(hTheme, PaintBox1.Canvas.Handle, iPartId, iStateId, Rect(0, 0, 31, 31), nil);
    finally
      CloseThemeData(hTheme);
    end;
end;
Run Code Online (Sandbox Code Playgroud)

我查了一些工具,如应用程序所作的Andreas Rejbrand和这个太多,但我找不到我想要的图像.

我的问题是:如何获得箭头图像?

UPDATE

感谢为Stigma发布的答案,我发现了Explorer::Treeview类的部分和状态值的额外资源.

Sti*_*gma 11

首先,在普通的情况下,ListView或者TreeView可以简单地调用SetWindowTheme其手柄来应用适当的样式.MSDN页面的示例如下:

SetWindowTheme(hwndList, L"Explorer", NULL);
Run Code Online (Sandbox Code Playgroud)

由于我们正在谈论自定义控件,所以我不太确定这适用于此.但是由于SetWindowTheme导致WM_THEMECHANGED消息被发送到正确的窗口,这意味着您只需要对OpenThemeData特定的子主题使用正确的调用.

我认为卢克的评论是正确的.您可能只需要传递'Explorer :: Treeview'而不是普通样式.因此,除非多年未触及Delphi/Pascal:

hTheme  := OpenThemeData(Handle, 'Explorer::Treeview');
Run Code Online (Sandbox Code Playgroud)