2010-01-27 10 views
4

Voir les deux images ci-dessous. Je ne veux pas que chaque élément du menu soit la hauteur du plus grand. Il devrait être dimensionné pour s'adapter au contenu. J'ai joué avec un certain nombre de propriétés et n'ai pas pu empêcher ce comportement. C'est possible?Comment faire pour que la hauteur des éléments du menu contextuel ne soit pas corrigée (c'est-à-dire l'échelle à la taille de l'élément particulier) dans .Net?

Desired Height http://www.blakerobertson.com/storage/perm/contextNormal.png Fixed Height For all! http://www.blakerobertson.com/storage/perm/contextThick.png

+1

Personnellement, je ne montrerais pas une exception dans le menu contextuel. Je voudrais vérifier l'exception sur le chargement, fournir un petit message d'erreur une icône, puis afficher une boîte de dialogue si l'élément de menu contextuel est cliqué – johnc

+0

@johnc +1 C'est l'approche que je vais prendre s'il n'y a pas de solution facile. J'allais nettoyer le message d'erreur considérablement à coup sûr: P – blak3r

Répondre

2

Set MenuItem.OwnerDraw true, puis gérer l'événement MenuItem.MeasureItem. Cela vous permet de dire à Windows Forms la taille de cet élément de menu indépendamment de la taille des autres, mais au prix de devoir rendre l'objet vous-même.

Notez que cela ne fait pas résultat en taille automatique pour s'adapter: vous aurez besoin d'utiliser les fonctions GDI + pour calculer la taille désirée.

+0

Dans mon cas ... ne devrais-je pas alors gérer l'événement MenuItem.MeasureItem pour tous les éléments du menu contenxt SAUF pour le premier (le grand) ? – blak3r

+0

Je crois que les éléments de menu qui ne sont pas dessinés par le propriétaire obtiendraient la taille de l'élément de menu par défaut. En laissant vide le texte "géré par Windows", c'est-à-dire la propriété MenuItem.Text, de l'élément "owner-draw", vous évitez de gonfler cette taille par défaut. (Vous pouvez toujours dessiner le texte que vous voulez dans le rectangle de l'élément de menu.) Cependant, je n'ai pas testé cela, donc vous pourriez avoir besoin de le tester! Mais si je me trompe, alors vous pouvez, comme vous le dites, résoudre ce problème en mesurant tous les éléments du menu - bien que cela soit plutôt fastidieux. – itowlson

0

Vieille question mais j'ai eu le même problème avec un ToolStripMenuItem montré pour un NotifyIcon. Résolu réglage AutoSize = False, mais il ne dessinait pas bien le texte, je ne peux pas comprendre pourquoi. Ensuite, j'ai dû dessiner par moi-même en gérant son événement Paint.

Private Sub OneMenuItem_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles OneMenuItem.Paint 
     If Me.DesignMode Then Return 
     Dim g As Graphics = e.Graphics 
     Dim it = OneMenuItem 
     Dim p = it.GetCurrentParent 
     Using b As New Drawing.SolidBrush(it.ForeColor) 
      g.DrawString(it.Text, it.Font, b, p.Padding.Left + 4 + it.Padding.Left, p.Padding.Top + 4 + it.Padding.Top) 
     End Using 
    End Sub 

ne me demandez pas ce que sont les 4 magiques, ils ont bien fonctionné à comparer les deux textes tirés dans DesignMode (il dessine le texte ok en mode conception et vous pouvez comparer).
VS2008, btw.