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

15
我正在使用自定义控件,混合了两个Windows控件(ListView和TreeView)。在某些情况下,我需要绘制使用Windows 7(启用主题)的图像来识别父节点,我正在使用DrawThemeBackground函数,其中包括TVP_GLYPH部分和GLPS_CLOSED状态(我尝试了所有与TREEVIEW类相关的部分和状态,但没有运气),但结果图像总是旧的(+)或(-)。

此图片显示了问题:

enter image description here

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

这是我用于绘制图像的示例代码:

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;

我查看了一些工具,例如由Andreas Rejbrand制作的应用程序这个,但我找不到我想要的图像。

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

更新

感谢Stigma发布的答案,我找到了有关Explorer::Treeview类的部件和状态值的其他资源。


VSCLASS_TREEVIEW 定义是什么?一些快速的谷歌搜索似乎表明您需要使用 "explorer::treeview" 而不仅仅是 "treeview"。 - Luke
VSCLASS_TREEVIEW ňťĘ UxTheme ňŹĽňůâńŞşň«Üń╣ë´╝îňƬŠś» TREEVIEW ňÇ╝šÜäńŞÇńެňŞŞÚçĆŃÇé - RRUZ
2个回答

11

首先,在普通的 ListViewTreeView 的情况下,可以通过对其句柄调用 SetWindowTheme 来应用适当的样式。它在 MSDN 页面上的示例如下:

SetWindowTheme(hwndList, L"Explorer", NULL);

既然我们谈论的是自定义控件,我不太确定这里是否适用。但由于SetWindowTheme会使WM_THEMECHANGED消息发送到正确的窗口,这意味着您只需要为特定的子主题使用适当的OpenThemeData调用。

我认为Luke的评论是正确的。您可能只需要传递'Explorer::Treeview'而不是普通样式。所以,假设多年未接触Delphi / Pascal:

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

2

在绘制之前,您必须设置SetWindowTheme(Handle, 'explorer', nil);以确保OpenThemeData使用新的资源管理器样式主题。当然,这两个函数的窗口句柄必须相同。


1
说句题外话,我总是在重载的CreateWnd中调用SetWindowTheme,以便设置可以跨窗口句柄重新创建而持续存在。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接