contextMenuStrip position ???

contextMenuStrip position ??? - C#/.NET managed - Programmation

Marsh Posté le 14-01-2008 à 20:19:32    

Bonjour,
 
J'amerai faire apparaitre un menu contextuel sous le pointeur avec un clique gauche.

Code :
  1. if (e.Button == MouseButtons.Right)
  2.      contextMenuStrip1.Show(this, new Point(e.X,e.Y));


avec ce code ce la ne marche pas car apparament les coordonée 'e.x' et 'e.y' sont par rapport à l'objet ou l'on clique.
Est on obligé de rajouter les coordonnée de tout les conteneurs, j'ai un datagridView, un groupbox, des onglets plus le menu de la fenetre mère , cela fait bcp de chose n'y a t'il pas un moyen plus simple  :heink:

Reply

Marsh Posté le 14-01-2008 à 20:19:32   

Reply

Marsh Posté le 15-01-2008 à 10:12:48    

clic gauche & 'MouseButtons.Right' [:cerveau autobot]
 
Sinon, concernant ton pb de coordonnées, il existe des méthode PointToScreen et PointToclient pour les contrôles qui permettent de retourner les coordonnées relative à l'écran ou à la fenêtre de ton application.
 
http://msdn2.microsoft.com/en-us/l [...] creen.aspx


---------------
VA APPRENDRE ET REVIENS QUAND TU SAIS, SINON ABSTIENT TOI C'EST UN GRAND CONSEIL QUE JE TE DONNE... TU ES INCOMPÉTENT ET C'EST UNE RÉALITÉ, TU N'AS RIEN A FAIRE ICI FAUT S'Y CONNAITRE ... -Jojo1998 - RIP - http://tinyurl.com/qc47ftk
Reply

Marsh Posté le 15-01-2008 à 10:42:55    

Just my 2 cents...
 

Code :
  1. this.ContextMenuStrip = this.contextMenuStrip1;


 
Ca résoudrait pas ton problème par hasard ?
 
A mettre juste sur le conteneur du plus haut niveau (habituellement ton objet Form) qui doit gérer le menu contextuel.
Il sera hérité à tous les enfants du conteneur, sauf si ceux-ci font un appel explicite à un menu contextuel spécifique.
 
Ca me semble un peu plus simple que de devoir gérer à la main les évènements non ?


Message édité par MagicBuzz le 15-01-2008 à 10:44:45
Reply

Marsh Posté le 15-01-2008 à 13:28:48    

utilise cela:
this.contextMenuStrip1.Show(System.Windows.Forms.Control.MousePosition);

Reply

Marsh Posté le 15-01-2008 à 14:50:56    

et pourquoi pas ma méthode plutôt ?
 
qui est juste la méthode standard, et ne nécessite même pas l'écriture de la moindre ligne de code, puisqu'elle peut se faire via la GUI


Message édité par MagicBuzz le 15-01-2008 à 14:51:56
Reply

Marsh Posté le 15-01-2008 à 20:20:46    

j'ai trouve plus simple sur un forum  

Code :
  1. Cursor.Position

:D  
 
merci qd meme tlm  :jap:

Reply

Marsh Posté le 15-01-2008 à 21:18:24    

bon, et maintenant que vous avez énuméré toutes les solutions pourries de la terre, est-ce que quelqu'un peu me dire pourquoi la solution que j'ai donné ne serait pas la bonne ?
 
franchement c'est quoi cette idée de vouloir réécrire ce qui existe déjà en natif ?


Message édité par MagicBuzz le 15-01-2008 à 21:18:52
Reply

Marsh Posté le 16-01-2008 à 12:40:01    

tu n'as aucun controle spécifique possible en passant par la méthode standards c'est tout :)
 
moi personnellement, dans une de mes applics, je voulais qu'elle ne s'affiche que si je faisais un click droit sur une ligne de ma grille.  
 
mais sinon si c'est pas faire un truc standards, ta méthode est de loin la meilleure.

Reply

Marsh Posté le 16-01-2008 à 12:50:17    

d'accord, en effet, pour du spécifique, on a besoin de modifier le fonctionne.
 
ceci dit, je reviens après un petit test :)

Reply

Marsh Posté le 16-01-2008 à 12:55:42    

ok, très con c#, les mouseevents ne sont pas annulables...
du coup pas moyen de bloquer l'apparition du contextmenu via un test au moment du click...


Message édité par MagicBuzz le 16-01-2008 à 12:55:59
Reply

Marsh Posté le 16-01-2008 à 12:55:42   

Reply

Marsh Posté le 16-01-2008 à 16:40:35    

il te reste cependant la possibilité de ne propager l'event plus bas :) on interceptant le click

Reply

Marsh Posté le 16-01-2008 à 16:47:34    

moi23372 a écrit :

il te reste cependant la possibilité de ne propager l'event plus bas :) on interceptant le click


Ben oui, mais justement, je peux l'intercepter, mais je vois pas comment je peux le bloquer ensuite (:??:)
 
En tout cas, si c'est faisable, je trouve ça mieux d'utiliser la méthode "de base", et au cas par cas, parceque je dois pas montrer une ligne sur deux par exemple, bloquer son appel, mais là je vois pas comment faire (faut dire que j'ai pas trop chercher non plus ;))

Reply

Marsh Posté le 16-01-2008 à 19:41:32    

suffit de dériver du controle.  
d'overrider la méthode "WndProc" dans laquelle passe tous les Events.  
 
Dans celle ci, mettre une condition pour tester l'event qui arrive.
Si c'est le click, faire le traitement souhaité.  
Pour annuler le click, ne pas faire un "base.WndProc(...)".
 
dans les autres cas, appeler "base.WndProc(...)".
 
Et le tour est joué.

Reply

Marsh Posté le 16-01-2008 à 20:29:44    

effectivement :jap:
 
c'est un peu lourd, mais ça marche avec cette technique

Reply

Marsh Posté le 17-01-2008 à 12:56:33    

c'est de cette façon qu'on peut rajouter des event sur les controles:
 
TabControl --> SelectedIndexChanging
Grille --> BeforeRowDeactivate
etc..

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed