Код
var renderer = new VisualStyleRenderer(VisualStyleElement.Menu.Item.Normal);
возвращает следующее сообщение
Данная комбинация Class, Part и State не определяется текущим визуальным стилем.
на машине Windows 8.1.
Кто-нибудь знает, почему и как я могу обойти это?
ИТАК с Hans Passant помощью я имел взгляд на файл vsstyle.h (нашел копию здесь) и используют эти константы.
Если вы посмотрите на перечисление MENUPARTS, я нахожу, что путь класса "МЕНЮ" работает со всеми частями, кроме тех, которые имеют * _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...
}
Я всегда получаю поврежденную память.