Desativando estilos visuais para ToolStripDropDownMenu
-
12-12-2019 - |
Pergunta
Estou tentando prevenir MenuStrip
controle a ser afetado por estilos visuais.
Então, criei um formulário simples com uma faixa de menu simples e estilos visuais desativados em Main()
:
// Application.EnableVisualStyles(); <-- no visual styles
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
que produz esta aparência (observe a borda e o fundo cinza):
Agora quero fazer o mesmo da maneira que outros controles deste formulário são afetados por estilos visuais (quero desabilitar os estilos visuais apenas para este menu suspenso).
Então, primeiro tentei desativar os estilos visuais para DropDown
de todos ToolStripMenuItem
, mas não funcionou.Então tentei desativar os estilos visuais por completo MenuStrip
, mas nenhum deles funcionou.
Aqui está o código do meu 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);
}
}
Apesar de usar custom MenuStrip
controle, quando Application.EnableVisualStyles();
em Main()
está sendo chamado, a aparência do formulário é a seguinte (azul):
Alguma idéia do que mais poderia afetar a aparência deste menu suspenso?
o que estou perdendo?
Obrigado.
Solução
Você não percebe que MenuStrip não é um controle nativo do Windows e, portanto, não é diretamente afetado pelo tema de estilos visuais.Toda a renderização é feita por código .NET.A classe base que faz isso é ToolStripRenderer, com duas implementações fornecidas:ToolStripProfessionalRenderer e ToolStripSystemRenderer.Este último tenta emular a aparência do sistema operacional, você consegue isso definindo o RenderMode do MenuStrip como "System".A emulação é moderada e totalmente errada em sistemas operacionais posteriores, como o Windows 7.
Se você deseja a aparência real do sistema operacional, use o MainMenu.Ele tem algumas limitações em comparação ao MenuStrip.Se quiser alterar as cores, você pode implementar seu próprio renderizador e modificar sua tabela de cores.Como mostrado em esta resposta.