Pb menu contextuel // OnPaint

Résolu
maqfab Messages postés 51 Date d'inscription mardi 4 novembre 2003 Statut Membre Dernière intervention 28 janvier 2010 - 23 oct. 2009 à 16:37
maqfab Messages postés 51 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);
}
}

2 réponses

cboulas Messages postés 2641 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 8 janvier 2014 16
24 oct. 2009 à 09:57
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
3
maqfab Messages postés 51 Date d'inscription mardi 4 novembre 2003 Statut Membre Dernière intervention 28 janvier 2010
26 oct. 2009 à 12:12
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);
}
0
Rejoignez-nous