Deaktivieren visueller Stile für ToolStripDropDownMenu
-
12-12-2019 - |
Frage
Ich versuche zu verhindern MenuStrip
Kontrolle durch visuelle Stile beeinflusst werden.
Deshalb habe ich ein einfaches Formular mit einfacher Menüleiste und deaktivierten visuellen Stilen erstellt Main()
:
// Application.EnableVisualStyles(); <-- no visual styles
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
was dieses Erscheinungsbild ergibt (beachten Sie den grauen Rand und Hintergrund):
Jetzt möchte ich das Gleiche tun und zwar so, dass andere Steuerelemente dieses Formulars von visuellen Stilen beeinflusst werden (ich möchte visuelle Stile nur für dieses Dropdown-Menü deaktivieren).
Also habe ich zunächst versucht, visuelle Stile zu deaktivieren DropDown
von jedem ToolStripMenuItem
, aber es hat nicht funktioniert.Dann habe ich versucht, visuelle Stile vollständig zu deaktivieren MenuStrip
, aber das hat auch nicht funktioniert.
Hier ist der Code meines benutzerdefinierten MenuStrip:
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);
}
}
Trotz der Verwendung von Gewohnheiten MenuStrip
Kontrolle, wann Application.EnableVisualStyles();
In Main()
aufgerufen wird, sieht die Form wie folgt aus (blau):
Irgendwelche Ideen, was das Erscheinungsbild dieses Dropdowns sonst noch beeinflussen könnte?
Was vermisse ich?
Danke.
Lösung
Sie übersehen, dass MenuStrip überhaupt kein natives Windows-Steuerelement ist und daher nicht direkt vom Thema der visuellen Stile betroffen ist.Das gesamte Rendering erfolgt über .NET-Code.Die Basisklasse, die dies tut, ist ToolStripRenderer mit zwei bereitgestellten Implementierungen:ToolStripProfessionalRenderer und ToolStripSystemRenderer.Letzteres versucht, das Aussehen des Betriebssystems zu emulieren. Sie erhalten es, indem Sie den RenderMode des MenuStrip auf „System“ setzen.Die Emulation ist mittelmäßig und auf späteren Betriebssystemen wie Windows 7 völlig falsch.
Wenn Sie das echte Erscheinungsbild des Betriebssystems wünschen, verwenden Sie stattdessen MainMenu.Im Vergleich zu MenuStrip gibt es einige Einschränkungen.Wenn Sie die Farben ändern möchten, können Sie Ihren eigenen Renderer implementieren und dessen Farbtabelle ändern.Wie gezeigt in diese Antwort.