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)