Pregunta

estoy tratando de prevenir MenuStrip control se verá afectado por los estilos visuales.

Así que creé un formulario simple con una franja de menú simple y estilos visuales deshabilitados en Main():

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

lo que produce esta apariencia (observe el borde y el fondo grises):

enter image description here

Ahora quiero hacer lo mismo en la forma en que otros controles de este formulario se ven afectados por los estilos visuales (quiero deshabilitar los estilos visuales solo para este menú desplegable).

Así que al principio intenté desactivar los estilos visuales para DropDown de cada ToolStripMenuItem, pero no funcionó.Luego intenté deshabilitar los estilos visuales para todo MenuStrip, pero ninguno de los dos funcionó.

Aquí está el código de mi MenuStrip personalizado:

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);
    }
}

A pesar del uso de costumbre MenuStrip controlar, cuando Application.EnableVisualStyles(); en Main() se está llamando, la apariencia del formulario es la siguiente (azul):

enter image description here

¿Alguna idea de qué más podría afectar la apariencia de este menú desplegable?
¿Qué me estoy perdiendo?

Gracias.

¿Fue útil?

Solución

Te falta que MenuStrip no sea un control nativo de Windows en absoluto y, por lo tanto, no se ve afectado directamente por el tema de estilos visuales.Todo el renderizado se realiza mediante código .NET.La clase base que hace esto es ToolStripRenderer, con dos implementaciones proporcionadas:ToolStripProfessionalRenderer y ToolStripSystemRenderer.Este último intenta emular la apariencia del sistema operativo, lo obtienes configurando el RenderMode del MenuStrip en "Sistema".La emulación es regular y totalmente errónea en sistemas operativos posteriores como Windows 7.

Si desea la apariencia real del sistema operativo, utilice MainMenu en su lugar.Tiene algunas limitaciones en comparación con MenuStrip.Si desea alterar los colores, puede implementar su propio renderizador y modificar su tabla de colores.Como se muestra en esta respuesta.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top