Contextmenu

cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 - 27 févr. 2006 à 14:57
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 - 28 févr. 2006 à 15:49
bonjour,

j'aimerais savoir s'il est possible de modifier la taille du texte dans un contextmenu.

Plus généralement est-il possible de modifier le Font, la couleur du fond,etc...?

J'ai cherché sur internet et n'ai rien trouvé à ce sujet.

Merci pour votre aide

8 réponses

cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
27 févr. 2006 à 15:07
Il faut que tu mettes la propriété OwnerDraw à true dans ton contextmenu, ensuite dans l'évenement MeasureItem tu mets genre :
e.ItemWidth = 75 ;
e.ItemHeight = 30 ;

Ensuite pour afficher des texts tu fais :

e.Graphics.DrawString(
s1 ,
System::Drawing::Font("Verdana",7,FontStyle::Bold,GraphicsUnit::Millimeter),
new SolidBrush(Color.Red), rcText,sf);

Ca peut être une méthode, je pense pas qu'on puisse faire autrement mais pas sur.
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
28 févr. 2006 à 07:17
Merci pour cette information, Cela fonctionne presque . Sauf que le texte ne reste pas affiché. J'ai également un probleme pour la localisation du drawstring (rcText je pense), je l'ai mis a cursor.position (pour le premier menuitem cela semble fonctionner) mais je ne sais pas comment donner une position générale qui permettrait a chaque menu item d'etre dessiné correctement. Il doit y avoir egalement un truc pour fixer le dessin du texte du menuitem, comment faire? On ne peut donc pas changer la couleur du fond?
Sinon une question plus générale sur ce forum, apparemment je n'arrive pas a retrouver cette question(/discussion) en recherchant avec le mot clé contextmenu eet je n'ai toujours que deux pages(ou sont presents les discussion se rapportant a un sujet) maximum. AI-je mal configuré quelque chose?
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
28 févr. 2006 à 09:12
Salut, il y'a deux event, un pour la taille et un pour dessiner :


item.MeasureItem += MeasureItem;
item.DrawItem += DrawItem;


// ..


private void DrawItem( object sender, DrawItemEventArgs e )
{
Graphics g = e.Graphics;


StringFormat sf = new StringFormat( );
sf.Alignment = StringAlignment.Center;


e.DrawBackground( );


g.DrawString( ( ( MenuItem )sender ).Text, e.Font, SystemBrushes.MenuText, e.Bounds, sf );
}


private void MeasureItem( object sender, MeasureItemEventArgs e )
{
SizeF size = e.Graphics.MeasureString( ( ( MenuItem )sender ).Text, SystemFonts.MenuFont );


e.ItemWidth = ( int )size.Width + 10;
e.ItemHeight = ( int )size.Height + 5;
}
0
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
28 févr. 2006 à 10:18
En faite tu va dessiner sur ton contextmenu avec drawstring pour dessiner une chaine, fillrectangle pour te faire un fond etc... c'est du dessin.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
28 févr. 2006 à 12:52
D'abord merci
Ok cette fois-ci le message est persistant...
J'avais essayé drawitem (j'avais mis drawstring dedans mais apparemment il n'etait j'amais appelé (j'ai mis un messagebox dedans et jamais il n'apparaissait), je ne sais pas pourquoi).
J'ai juste deux petits trucs avant de "valider" ta reponse.
Si je mets ds Drawstring "e.Font" pour la taille je n'obtiens pas la taille que j'ai choisi dans measureitem. J'ai juste la taille normale (d'origine).
Dans measureItem a la place de SystemFonts.menufont , j'ai mis ce que je voulais comme font.
Si je refait le drawstring avec le meme font dans drawitem,cela fonctionne (tout en gardant e.Bounds). Je ne comprends pas trop pourquoi e.Bounds semble correct alors que e.FOnt non.
POur modifier la couleur du fond j'ai essayer un fillrectangle (ca met bien la couleur mais pas partout cad pas sur le "tour" du rectangle) mais quand on passe le curseur dessus on n'a plus la couleur qui change.
ensuite si on enleve e.drawbackground() , il nous manque egalement la couleur quand le curseur passe dessus . Cette derniere fonction sert-elle juste a permettre au menuitem de changer de couleur quand le curseur passe dessus?
Voila, c'etait quelques questions parce que jene comprends pas bien l'enchainement des evenements dans ces fonctions....
Merci
0
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
28 févr. 2006 à 13:15
ben e.Font ca represente la police de ton contextMenu mais tu peux utiliser une autre Police, tu remplace e.Font par la police que tu veux exemple : new Font("Veranda" ,10)

Mettons tu veux dessiner "bonjour", tu fais :

e.Graphics.DrawString( "Bonjour" , System.Drawing.Font("Verdana",7,FontStyle.Bold,GraphicsUnit.Millimeter), new SolidBrush(Color.Red), 5,5);

Je dessine "bonjour" au coordonné 5,5, la couleur est le rouge et la police est Verdana de taille 7 en gras.

e->bound te retourne un rectangle qui represente la zone en cours en faite. En faite le mieux c'est que tu te serve comme modèle de cet exemple : (je ne serais pas répondre à toutes t'es question)

http://64.233.179.104/search?q=cache:D4-52ulT4pMJ:www.csharphelp.com/archives/archive282.html+if+(+s1+%3D%3D+%22Open%22+)++ownerdraw+&hl=fr&gl=fr&ct=clnk&cd=3&client=firefox-a

tu télécharge la sources et tu modifi des trucs pour voir ce qui a changer, le truc à savoir c'est qu'il a abonné chaque MenuItem de son MainMenu au même événement DrawItem et MeasureItem pour éviter d'avoir à le faire 50 fois et qu'il se sert de ca :

if ( s1 == "Open" )
{
useImage = img_fileopen;
}
if ( s1 == "Close" )
{
useImage = img_close;
}
etc...

pour les differenciers. Mais de toute manière lui il met des images dans son menu et ce n'est pas ce que tu veux faire. Voila regarder le code vire ce qui te sert pas et modifie des paramètres et fais des tests pour voir ce qui change et comprends comment cela marche.
0
cs_emmanuel9 Messages postés 903 Date d'inscription mercredi 23 février 2005 Statut Membre Dernière intervention 16 juin 2010 2
28 févr. 2006 à 14:17
Pour modifier la couleur de fond quand le souris passe dessus ca se passe ici :

if ( e.State == ( DrawItemState.NoAccelerator | DrawItemState.Selected))
{
e.Graphics.FillRectangle(new SolidBrush(Color.LightYellow) , rc);
etc....
0
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
28 févr. 2006 à 15:49
Ok merci encore
j'ai reussi a faire changer la couleur quand la souris passe dessus mais le fond n'est toujours pas uniforme...en fait on ne paint que le "background" du menuitem et pas du contextmenu lui meme , c'est a dire que si je peint un menuitem en rouge dans le context box, il restera un liseraie gris clair (celui du contextmenu) autour et si j'ajoute un "element" menuitem (-) pour faire un separateur et que je laisse "windows" le dessiner il sera en gris, par contre, si je mets la propriete ownerdraw de cet element a true et bien je n'obtiens que le signe - et pas de séparateur (et puis si la taille du texte est importante ca me fait un espace vertical assez enorme dont je n'ai pas vraiment besoin.

Sinon si je veux montrer ce contextbox lors d'un evnt click (meme gauche). J'ai fait un contextmenu.Show("controlsource",new Point(0,0));
Ce contextmenu apparait tres brievement et disparait ensuite.
Par contre si je mets un messageBox avant il reste...
Je ne comprends pas
Comment faire pour qu'il soit persistant meme sans messagebox?
J'aimerais egalement savoir comment le placer au niveau du curseur.
Avec la methode.Show , on l'associe au controle source et le positionnement semble se faire par rapport a celui-ci.
Une methode pourrait etre de faire cursor.position-positiondu control-position du control qui le contient,etc.... mais ca me semble un peu lourd
Existe-t-il une methode simple et efficace?

Merci encore
0
Rejoignez-nous