VisualStyleRenderer возвращает ошибку для пункта меню

1

Код

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

возвращает следующее сообщение

Данная комбинация Class, Part и State не определяется текущим визуальным стилем.

на машине Windows 8.1.

Кто-нибудь знает, почему и как я могу обойти это?

  • 0
    Я повторяю, более строгую проверку ошибок, я предполагаю. Ни одна из частей, чье имя оканчивается на "TMSCHEMA", не разрешена. Что бы они ни имели в виду, я предполагаю, что программист .NET тоже не знал. Вместо этого рассмотрим новый VisualStyleRenderer («MENU», 8, 1), чтобы получить «BarItem».
  • 0
    Я не уверен, что часть 8. Если я попробую BarItem, то идентификатор будет 3. В любом случае, это не совсем правильный стиль - текст не будет отображаться одинаково. Есть ли где-нибудь список поиска кодов где-нибудь?
Показать ещё 2 комментария
Теги:
visual-styles

1 ответ

0

ИТАК с 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...
}

Я всегда получаю поврежденную память.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню