Deshabilitar estilos visuales para ToolStripDropDownMenu
-
12-12-2019 - |
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):
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):
¿Alguna idea de qué más podría afectar la apariencia de este menú desplegable?
¿Qué me estoy perdiendo?
Gracias.
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.