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

我正在一个自定义控件中混合使用两个窗口控件(listview和treeview).在某些方面,我需要绘制使用 Windows 7(启用主题)的图像来标识父节点,我正在使用 DrawThemeBackground功能与TVP_GLYPH部分和GLPS_CLOSED状态(我尝试所有的部件和状态相关TREEVIEW类没有运气),但结果图像始终是old()或( – ).

图片显示问题

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

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

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,iStateId,Rect(0,31,31),nil);
    finally
      CloseThemeData(hTheme);
    end;
end;

我检查了一些像Andreas Rejbrandthis这样的application这样的工具,但是我找不到我想要的图像.

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

UPDATE

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

> VisualStyleRenderer and themes
> CodeProject

解决方法

首先,在普通的ListView或TreeView的情况下,可以简单地在其句柄上调用 SetWindowTheme来应用正确的样式.其MSDN页面的示例如下:
SetWindowTheme(hwndList,L"Explorer",NULL);

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

我认为卢克的评论是正确的.你可能只需要传递“Explorer :: Treeview”,而不是简单的样式.所以,除了几年没有碰到Delphi / Pascal:

hTheme  := OpenThemeData(Handle,'Explorer::Treeview');

相关文章

ffmpeg 是一套强大的开源的多媒体库 一般都是用 c/c++ 调用, 抽空研究了一下该库的最新版 ,把...
32位CPU所含有的寄存器有:4个数据寄存器(EAX、EBX、ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄...
1 mov dst, src dst是目的操作数,src是源操作数,指令实现的功能是:将源操作数送到目的操作数中,即:...
有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。 1.CreateProcess因为使用复杂...
API原型: Declare Function MoveFileEx& Lib "kernel32" Alias "MoveFileExA" (By...