2009-04-01 7 views
1

Mon application Windows Forms a un MenuStrip et certains des éléments de menu (ToolStripMenuItem) ont une icône (définissant la propriété ToolStripMenuItem.Image).ToolStripMenuItem ne peut pas afficher la coche et Image (icône) lorsque RenderMode est "Système"?

Lorsque la propriété RenderMode du MenuStrip est réglé sur ToolStripRenderMode.System, la coche n'affiche pas lorsque le Checked ou CheckOnClick propriété est vrai et l'élément de menu a une icône.

Il écran lorsque-t i basculer la propriété MenuStrip.RenderMode-ToolStripRenderMode.Professional ou ToolStripRenderMode.RenderManagerMode.

Malheureusement, cela est un problème parce que mon application nécessite:

  1. Un ProgressBar en mode texte défilant, donc Application.EnableVisualStyles() est nécessaire pour obtenir ce travail.
  2. L'application nécessite un style visuel "plat", ce que j'ai accompli en omettant l'appel à Application.EnableVisualStyles() et en laissant la valeur par défaut ToolStripRenderMode.RenderManagerMode sur le MenuStrip. Mais alors je ne peux pas obtenir mon chapiteau ProgressBar!
  3. La définition de RenderMode à ToolStripRenderMode.System résout le problème d'aspect et de convivialité, mais supprime la possibilité de vérifier les éléments de menu avec icônes.

Existe-t-il un moyen de satisfaire toutes mes exigences? Est-ce que je manque quelque chose? Merci d'avoir regardé.

Répondre

3

Wow, j'ai perplexe SO! Maintenant je sais que je dois travailler sur un code sérieux.

Quoi qu'il en soit, la réponse est: implémentez votre propre ToolStripRenderer en créant une classe qui hérite de ToolStripSystemRenderer. Remplacez les méthodes qui dessinent les éléments avec votre propre code. Voici ce que je cherchais spécifiquement qui dessine l'article coché. Il dessine une vérification s'il n'y a pas d'image pour le ToolStripMenuItem.

protected override void OnRenderItemCheck(ToolStripItemImageRenderEventArgs e) 
{ 
    base.OnRenderItemCheck(e); 
    if (e.Item.Selected) 
    { 
     Rectangle rect = new Rectangle(3, 1, 20, 20); 
     Rectangle rect2 = new Rectangle(4, 2, 18, 18); 
     SolidBrush b = new SolidBrush(Color.FromArgb(49, 106, 197)); 
     SolidBrush b2 = new SolidBrush(Color.Orange); 

     e.Graphics.FillRectangle(b, rect); 
     e.Graphics.FillRectangle(b2, rect2); 
     e.Graphics.DrawImage(e.Image, new Point(5, 3)); 
    } 
    else 
    { 
     Rectangle rect = new Rectangle(3, 1, 20, 20); 
     Rectangle rect2 = new Rectangle(4, 2, 18, 18); 
     SolidBrush b = new SolidBrush(Color.FromArgb(49, 106, 197)); 
     SolidBrush b2 = new SolidBrush(Color.Orange); 

     e.Graphics.FillRectangle(b, rect); 
     e.Graphics.FillRectangle(b2, rect2); 
     e.Graphics.DrawImage(e.Image, new Point(5, 3)); 
    } 
} 
0

J'ai aussi rencontré une alternative plus simple:

Vous pouvez simplement mettre vos éléments de menu dans un ContextMenuStrip puis l'affecter à la DropDown propriété du DropDownButton.

Espérons que cela aidera tous ceux qui ne veulent pas remplacer la méthode Paint.

Questions connexes