Disabilitazione degli stili visivi per ToolstripdropdownMenu
-
12-12-2019 - |
Domanda
Sto cercando di impedire che il controllo MenuStrip
sia influenzato da stili visivi.
Quindi ho creato una forma semplice con semplice striscia di menu e stili visivi disabilitati in Main()
:
// Application.EnableVisualStyles(); <-- no visual styles
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
.
che produce questo aspetto (nota Border Border e Background):
Ora voglio fare lo stesso nel modo in cui altri controlli di questo modulo sono influenzati da stili visivi (voglio disabilitare gli stili visivi solo per questo a discesa).
Così all'inizio ho provato a disabilitare gli stili visivi per DropDown
di ogni ToolStripMenuItem
, ma non funzionava. Poi ho provato a disabilitare gli stili visivi per il MenuStrip
intero, ma né quello ha funzionato.
Ecco il codice del mio Menustrip personalizzato:
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);
}
}
.
Nonostante l'utilizzo del controllo personalizzato MenuStrip
, quando viene chiamato Application.EnableVisualStyles();
in Main()
, l'aspetto della forma sta seguendo (blu):
Qualche idea che altro potrebbe influire sull'aspetto di questo ascensore?
Cosa mi manca?
Grazie.
Soluzione
Ti manca che il Menustrip non è affatto un controllo nativo di Windows e quindi non è direttamente influenzato dal tema Stili visivi.Tutte le rendering vengono eseguite da codice .NET.La classe base che fa questo è ToolstripRenderer, con due implementazioni fornite: ToolstripprofessionalRenderer e ToolstripsystemRenderer.Quest'ultimo cerca di emulare il look del sistema operativo, lo si ottiene impostando il redermodo di Menustrip in "Sistema".L'emulazione è così così errata in sistemi operativi successivi come Windows 7.
Se si desidera che il vero sistema operativo look-sentore, usa invece mainmenu.Ha alcune limitazioni rispetto a Menustrip.Se si desidera modificare i colori, puoi implementare il tuo rendering e modificare la sua tabella dei colori.Come mostrato in Questa risposta .