Question

J'essaie d'empêcher MenuStrip le contrôle doit être affecté par les styles visuels.

J'ai donc créé un formulaire simple avec une simple bande de menu et des styles visuels désactivés dans Main():

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

ce qui donne cette apparence (notez la bordure et l'arrière-plan gris) :

enter image description here

Maintenant, je veux faire de même dans la mesure où les autres contrôles de ce formulaire sont affectés par les styles visuels (je souhaite désactiver les styles visuels pour cette liste déroulante uniquement).

Donc, au début, j'ai essayé de désactiver les styles visuels pour DropDown de chaque ToolStripMenuItem, mais ça n'a pas marché.Ensuite, j'ai essayé de désactiver les styles visuels pour l'ensemble MenuStrip, mais ni celui-là, ni celui-là n’ont fonctionné.

Voici le code de mon MenuStrip personnalisé :

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

Malgré l'utilisation de coutumes MenuStrip contrôle, quand Application.EnableVisualStyles(); dans Main() est appelé, l'apparence de la forme est la suivante (bleu) :

enter image description here

Avez-vous une idée de ce qui pourrait affecter l'apparence de cette liste déroulante ?
Qu'est-ce que je rate?

Merci.

Était-ce utile?

La solution

Il vous manque le fait que MenuStrip n'est pas du tout un contrôle Windows natif et n'est donc pas directement affecté par le thème des styles visuels.Tout le rendu est effectué par le code .NET.La classe de base qui fait cela est ToolStripRenderer, avec deux implémentations fournies :ToolStripProfessionalRenderer et ToolStripSystemRenderer.Ce dernier essaie d'émuler l'apparence du système d'exploitation, vous l'obtenez en définissant le RenderMode de MenuStrip sur "Système".L'émulation est médiocre et totalement fausse sur les systèmes d'exploitation ultérieurs comme Windows 7.

Si vous voulez l'apparence réelle du système d'exploitation, utilisez plutôt MainMenu.Il présente certaines limites par rapport à MenuStrip.Si vous souhaitez modifier les couleurs, vous pouvez implémenter votre propre moteur de rendu et modifier sa table des couleurs.Comme représenté sur la cette réponse.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top