1

编码

var renderer = new VisualStyleRenderer(VisualStyleElement.Menu.Item.Normal);

返回以下消息

给定的 Class、Part 和 State 的组合不是由当前的视觉样式定义的。

在 Windows 8.1 机器上。

有人知道为什么以及如何解决这个问题吗?

4

1 回答 1

0

好的,在Hans Passant的帮助下,我查看了 vsstyle.h 文件(在此处找到了副本)并一直在使用这些常量。

如果您查看枚举 MENUPARTS,我发现“MENU”类路径适用于所有部分,但名称中带有 *_TMSCHEMA 的部分除外(这是 VisualStyleElement.Menu 列表中的结构映射到的部分)

所以,我最终使用了 MENU_POPUPITEM 和兄弟部件,它们似乎工作得很好。

例如:

var renderer = new VisualStyleRenderer("MENU", (int)MENUPARTS.MENU_POPUPBACKGROUND, (int)POPUPCHECKBACKGROUNDSTATES.MCB_NORMAL);
renderer.DrawBackground(e.Graphics, r);

renderer = new VisualStyleRenderer("MENU", (int)MENUPARTS.MENU_POPUPGUTTER, 0);
renderer.DrawBackground(e.Graphics, new Rectangle(e.Bounds.X, e.Bounds.Y, 24, e.Bounds.Height));

我希望这可以帮助别人。


IE:似乎 VisualStyleRenderer.GetMargins 方法坏了,因为如果我这样做

protected override void OnMeasureItem(MeasureItemEventArgs e)
{
   var renderer = new VisualStyleRenderer("MENU", (int)MENUPARTS.MENU_POPUPITEM, (int)POPUPITEMSTATES.MPI_HOT);
   var m = renderer.GetMargins(e.Graphics, MarginProperty.SizingMargins);
   // etc...
}

我总是收到内存损坏错误。

于 2014-07-17T08:58:48.973 回答