gpt4 book ai didi

.net - VisualStyleRenderer 和主题 (WinForms)

转载 作者:行者123 更新时间:2023-12-04 00:45:40 28 4
gpt4 key购买 nike

我有自己的 TreeView 控件,它完全是 OwnerDraw'n:

  myTreeView.DrawMode = TreeViewDrawMode.OwnerDrawAll;

我试图实现的是根据当前资源管理器主题绘制打开/关闭的字形。特别是在 Vista 和 Win7 机器上,我希望看到新的字形(黑色三角形)而不是加号/减号。我知道,对于非OwnerDraw'n TreeView,这可以按如下方式实现,效果很好:
  myTreeView.HandleCreated += delegate(object sender, EventArgs args)
{
MyNativeMethods.SetWindowTheme(myTreeView.Handle, "explorer", null);
};

我认为 VisualStyleRenderer 让我绘制字形主题感知:
  VisualStyleRenderer r = new VisualStyleRenderer(VisualStyleElement.TreeView.Glyph.Opened);
r.DrawBackground(e.Graphics, e.Bounds);

不幸的是,上面的代码在所有情况下都绘制了减号。看起来 VisualStyleRenderer 不遵守主题设置。

有人可以对此有所了解吗?谢谢!

最佳答案

我想我偶然发现了这篇文章是一件好事,当我开始更新我的一些项目使用的 Owner-Drawn TreeView 控件时,我想知道同样的事情,上周经过一些 uxtheme 黑客攻击后,我发现了资源管理器使用的状态和后来把它们贴在这里给其他人:http://www.codeproject.com/KB/list/ObjectListView.aspx?msg=3492581#xx3492581xx

这是无证使用 SetWindowTheme API 时由 Windows 设置的样式,此处未列出其他一些部件和状态 ID,但它们似乎没有用,为了简洁起见,我省略了错误检查和 VisualStyleRenderer.IsElementDefined()。

如果您需要在 native 代码中使用这些类名、状态和部件 ID,OpenThemeData/OpenThemeDataEx 和 DrawThemeBackground API 也可以使用它们。

资源管理器树 View 样式:

(这些由 Glyph +/- expando 图标使用)

VisualStyleRenderer OpenedRenderer = new VisualStyleRenderer("Explorer::TreeView", 2, 2);
VisualStyleRenderer ClosedRenderer = new VisualStyleRenderer("Explorer::TreeView", 2, 1);

(这两个是当鼠标位于上面两个 Glyph 上时使用的)
VisualStyleRenderer HoverOpenedRenderer = new VisualStyleRenderer("Explorer::TreeView", 4, 2);
VisualStyleRenderer HoverClosedRenderer = new VisualStyleRenderer("Explorer::TreeView", 4, 1);

(悬停在 TreeView 项目上的状态)
VisualStyleRenderer ItemHoverRenderer = new VisualStyleRenderer("Explorer::TreeView", 1, 2); 

(选中状态 TreeView 项)
VisualStyleRenderer ItemSelectedRenderer = new VisualStyleRenderer("Explorer::TreeView", 1, 3);

(选中但当控件失去焦点时(当 this.HideSelecton = False 时))
VisualStyleRenderer LostFocusSelectedRenderer = new VisualStyleRenderer("Explorer::TreeView", 1, 5); 

(还有另一种 SelectedTreeView 状态,它比默认状态(1-3)暗一点,用于在当前选择所有项目时显示当前选择的项目??)
VisualStyleRenderer Selectedx2Renderer = new VisualStyleRenderer("Explorer::TreeView", 1, 6); 

资源管理器 ListView 样式:

(将状态悬停在 ListView 项上)
VisualStyleRenderer ItemHoverRenderer = new VisualStyleRenderer("Explorer::ListView", 1, 2); 

(选中状态 TreeView 项)
VisualStyleRenderer ItemSelectedRenderer = new VisualStyleRenderer("Explorer::ListView", 1, 3);

(选中但当控件失去焦点时(当 this.HideSelecton = False 时))
VisualStyleRenderer LostFocusSelectedRenderer = new VisualStyleRenderer("Explorer::ListView", 1, 5); 

(同样,还有另一个 Selected 状态,它比默认状态 (1-3) 稍暗,用于在当前选择所有项目时显示当前选择的项目??)
VisualStyleRenderer Selectedx2Renderer = new VisualStyleRenderer("Explorer::ListView", 1, 6); 

示例: (取自 ObjectListView)
protected virtual void DrawExpansionGlyphStyled(Graphics g, Rectangle r, bool isExpanded)
{
VisualStyleElement glowelement = VisualStyleElement.CreateElement("Explorer::TreeView", 2, 1);

if (isExpanded)
glowelement = VisualStyleElement.CreateElement("Explorer::TreeView", 2, 2);

VisualStyleRenderer renderer = new VisualStyleRenderer(glowelement);
renderer.DrawBackground(g, r);
}

只要确保你 缓存 VisualStyleRenderer 的创建 具有属性,因此当您的控件被绘制时,您不会每秒读取 uxtheme.dll 100 次;)
private static VisualStyleRenderer closedRenderer;
public static VisualStyleRenderer ClosedRenderer
{
get
{
if (closedRenderer == null)
closedRenderer = new VisualStyleRenderer("Explorer::TreeView", 2, 1);

return closedRenderer;
}
}

上面使用缓存的 VisualStyleRenderer 的示例:
protected virtual void DrawExpansionGlyphStyled(Graphics g, Rectangle r, bool isExpanded)
{

if (isExpanded)
OpenedRenderer.DrawBackground(g, r);
else
ClosedRenderer.DrawBackground(g, r);
}

享受。
美联社

关于.net - VisualStyleRenderer 和主题 (WinForms),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3014816/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com