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):

enter image description here

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):

enter image description here

Alguma idéia do que mais poderia afetar a aparência deste menu suspenso?
o que estou perdendo?

Obrigado.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top