Вопрос

Я пытаюсь предотвратить MenuStrip элемент управления, на который будут влиять визуальные стили.

Поэтому я создал простую форму с простой полосой меню и отключил визуальные стили в Main():

// Application.EnableVisualStyles(); <-- no visual styles
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());

что дает такой вид (обратите внимание на серую рамку и фон):

enter image description here

Теперь я хочу сделать то же самое, чтобы визуальные стили влияли на другие элементы управления этой формы (я хочу отключить визуальные стили только для этого раскрывающегося списка).

Поэтому сначала я попытался отключить визуальные стили для DropDown каждого ToolStripMenuItem, но это не сработало.Затем я попытался полностью отключить визуальные стили. MenuStrip, но ни тот, ни другой не сработал.

Вот код моего пользовательского MenuStrip:

class MPMenuStrip : MenuStrip
{
    [DllImportAttribute("uxtheme.dll")]
    private static extern int SetWindowTheme(IntPtr hWnd, string appname, string idlist);

    protected override void OnHandleCreated(EventArgs e)
    {
        // first attempt:
        foreach (ToolStripMenuItem menuItem in this.Items)
            SetWindowTheme(menuItem.DropDown.Handle, "", "");

        // second attempt:
        SetWindowTheme(this.Handle, "", "");
        base.OnHandleCreated(e);
    }
}

Несмотря на использование пользовательских MenuStrip контролировать, когда Application.EnableVisualStyles(); в Main() вызывается, внешний вид формы следующий (синий):

enter image description here

Есть идеи, что еще может повлиять на внешний вид этого раскрывающегося списка?
Что мне не хватает?

Спасибо.

Это было полезно?

Решение

Вы упускаете из виду, что MenuStrip вообще не является собственным элементом управления Windows и, следовательно, не зависит напрямую от темы визуальных стилей.Весь рендеринг выполняется с помощью кода .NET.Базовым классом, который делает это, является ToolStripRenderer с двумя предоставленными реализациями:ToolStripProfessionalRenderer и ToolStripSystemRenderer.Последний пытается имитировать внешний вид операционной системы. Это можно сделать, установив для параметра RenderMode MenuStrip значение «Система».Эмуляция так себе и совершенно неверна в более поздних операционных системах, таких как Windows 7.

Если вам нужен внешний вид реальной операционной системы, используйте вместо этого MainMenu.У него есть некоторые ограничения по сравнению с MenuStrip.Если вы хотите изменить цвета, вы можете реализовать свой собственный рендерер и изменить его таблицу цветов.Как показано в этот ответ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top