Pb menu contextuel // OnPaint [Résolu]

Messages postés
52
Date d'inscription
mardi 4 novembre 2003
Statut
Membre
Dernière intervention
28 janvier 2010
- - Dernière réponse : maqfab
Messages postés
52
Date d'inscription
mardi 4 novembre 2003
Statut
Membre
Dernière intervention
28 janvier 2010
- 26 oct. 2009 à 12:12
Bonjour,

Je developpe un user control qui dessine certaines choses. Pour cela je surcharge la méthode OnPaint, et tout va bien.

Par contre, je voudrais ajouter un menu contextuel mais je pense que son affichage au run est contrarié par cette méthode.

J'ai pourtant intercepté le clic du bouton droit, stocké dans un bool et j'applique le dessin des formes si le bool est à faux.

En gros, les formes se dessinent bien, mais mon menu n'apparait pas.

Quelqu'un a une idée ?

Config : C#, .Net 3.5
Code:

private void Traceur_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (_droite_down)
_droite_down = false;
else
{
_rectx = e.X;
_recty = e.Y;
_gauche_down = true;
}
}
if (e.Button == MouseButtons.Right)
{
_droite_down = true;
_menux = e.X;
_menuy = e.Y;
}
}

private void Traceur_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
_gauche_down = false;
Invalidate(ClientRectangle);
}
}

private void Traceur_MouseMove(object sender, MouseEventArgs e)
{
if ((e.Button == MouseButtons.Left) && (_gauche_down))
{
_rectw = e.X - _rectx;
_recth = e.Y - _recty;
Invalidate(ClientRectangle);
}
}

protected override void OnPaint(PaintEventArgs e)
{
if (_droite_down)
mnuContext.Show(menux, _menuy);
else
{
base.OnPaint(e);
CalculBounds();
Dessiner(e.Graphics);
if (_gauche_down)
e.Graphics.DrawRectangle(_penSelection, _rectx, _recty, _rectw, _recth);
}
}
Afficher la suite 

2 réponses

Meilleure réponse
Messages postés
2641
Date d'inscription
mercredi 2 juin 2004
Statut
Membre
Dernière intervention
8 janvier 2014
11
3
Merci
Hello,

pour l'affichage du contextmnu :

En fait je ne suis pas sûr que la partie mouseDown soit très utile, tu peux très bien récupérer les mêmes éléments dans le Up.

en revanche, ton Up, justement ne demande rien lors qu'un clic droit est effectué... c'est d'ailleur ici que je te conseil d'y demander l'affichage de ton contextmnu

sachant que le paint, est demandé en cas de déplacement, modif affichage, etc... il ne sera pas appelé s'il n'y a rien à faire...
ou alors dans le mouseup demande le rafraichissement de ta winform.

Chris...Web : Firstruner

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 6032 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cboulas
Messages postés
52
Date d'inscription
mardi 4 novembre 2003
Statut
Membre
Dernière intervention
28 janvier 2010
0
Merci
Merci beaucoup du coup de main. Je pensais que le fait de demander au menu de s'afficher aller forcer le OnPaint et donc pas marcher.

Pour info, voici le code modifié:

private void Traceur_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (_droite_down)
_droite_down = false;
else
{
_rectx = e.X;
_recty = e.Y;
_gauche_down = true;
}
}
}

private void Traceur_MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
_gauche_down = false;
Invalidate(ClientRectangle);
}
if (e.Button == MouseButtons.Right)
{
_droite_down = true;
mnuContext.Show(PointToScreen(new Point(e.X, e.Y)));
}
}

private void Traceur_MouseMove(object sender, MouseEventArgs e)
{
if ((e.Button == MouseButtons.Left) && (_gauche_down))
{
_rectw = e.X - _rectx;
_recth = e.Y - _recty;
Invalidate(ClientRectangle);
}
}

protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
CalculBounds();
Dessiner(e.Graphics);
if (_gauche_down)
e.Graphics.DrawRectangle(_penSelection, _rectx, _recty, _rectw, _recth);
}
Commenter la réponse de maqfab