bgcode
Messages postés5Date d'inscriptionsamedi 21 décembre 2002StatutMembreDernière intervention23 février 2007
-
5 juil. 2005 à 20:33
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 2012
-
8 juil. 2005 à 20:57
Bonjour , je m'explique :
Ce que je veux concevoir ,
Sur une form , par un clic sur un bouton je dessine sur celle ci un composant nommé GraphPicture puis j'y construit un menu :
AOGie.
GraphPicture tab =
new AOGie.
GraphPicture();
tab.Name =
"table" + nb_click;
//Identifiant
tab.Location =
new
Point(200, 200);
//Place par défaut dans la fenetre
tab.Size =
new
Size(table_x, table_y);
//taille
tab.BackColor =
Color.Aqua;
tab.ToolTipText =
"Clic droit pour modifier la table";
this.graphContainer1.Controls.Add(tab);
ContextMenu ctxMenu =
new
ContextMenu();
// ON creé plusieurs menuitem puis pour chaque on definit un evenement (defini par nous meme)
ctxMenu.MenuItems.Add(
new
MenuItem(
"Champs de la table",
new
EventHandler(modifs_champs)));
ctxMenu.MenuItems.Add(
new
MenuItem(
"Modifier les dimensions",
new
EventHandler(changer_dimensions)));
ctxMenu.MenuItems.Add(
new
MenuItem(
"Changer les couleurs",
new
EventHandler(changer_couleurs)));
tab.ContextMenu = ctxMenu;
//on l'affiche !
Voila ca ca fonctionne , ca me construit bien mon menu sur chaque composant dynamique sur ma feuille
Mais ca se complique lorsque je veux savoir de quelle composant ou j'y ai cliqué sur un item du menu.
aogie
Messages postés108Date d'inscriptionvendredi 11 juillet 2003StatutMembreDernière intervention27 novembre 2007 5 juil. 2005 à 21:06
Bonsoir,
Le fait que les objets GraphLine ne soient pas des contrôles visuels, permet une superposition des lignes grâce à gestion effectuée par GraphContainer.
Le point négatif c'est que c'est lui qui gère la position de la souris et qui est reconnu comme SourceControl par le menu contextuel.
Dans l'événement de clic sur menu :
Le contrôle ctl est le GraphContainer et non l'objet GraphLine...
Solutions :
- 1) Implémenter une méthode GetGraphLineAt(Point pt). Ce n'est pas trop difficile car il suffit de s'inspirer de la méthode privée "ProcessMouseMove" pour trouver l'objet GraphLine à retourner.
- 2) Créer un menu contextuel différent pour chaque objet GraphLine. On peut ainsi reconnaître l'appelant...
La solution 1) est la plus propre. En cas de difficulté. Je me tiens à ta disposition pour créer cette méthode dans l'objet GraphContainer.
-- AOGie --
Vous n’avez pas trouvé la réponse que vous recherchez ?
aogie
Messages postés108Date d'inscriptionvendredi 11 juillet 2003StatutMembreDernière intervention27 novembre 2007 5 juil. 2005 à 22:06
Si tu consultes le code des objets du projet GraphContainer, tu remarqueras que les objets GraphLine ne sont pas des "contrôles visuels".
L'événement MouseMove est géré par le GraphContainer et les coordonnées de la souris sont dans le référenciel du GraphContainer et non de l'objet GraphLine survolé. C'est pour cette raison que l'affichage du menu contextuel possède l'objet GraphContainer comme contrôle associé.
aogie
Messages postés108Date d'inscriptionvendredi 11 juillet 2003StatutMembreDernière intervention27 novembre 2007 5 juil. 2005 à 22:27
Solutions :
1) Pour connaître l'objet GraphLine à l'origine du menu contextuel. Inscription sur l'événement MouseUp de chaque objet GraphLine comprenant le menu contextuel. (Tu peux éventuellement utiliser le même handler pour tous et tester le sender)
Ensuite, if (e.Button = = MouseButtons.Right) c'est que le menu contextuel va s'afficher. Tu conserve dans une variable membre le dernier contrôle ayant affiché le menu contextuel (sender). Lors du clic sur un élément du menu, tu consultes cette variable...
2) Pour éventuellement obtenir un objet GraphLine à partir de coordonnées dans le référentiel du GraphContainer, ajoute cette méthode dans la région des méthodes publiques de l'objet GraphContainer :
#region GetLineAt
/// <summary>
/// Extrait l'objet GraphLine situé à l'emplacement spécifié.
/// </summary>
/// Coordonnées à tester.
/// <returns>Objet GraphLine ou null.</returns>
public GraphLine GetLineAt(Point pt)
{
Lutinore
Messages postés3246Date d'inscriptionlundi 25 avril 2005StatutMembreDernière intervention27 octobre 201241 5 juil. 2005 à 23:46
Ohlala j'ai rien compris non plus, lol ! Aogie tu veux dire que c'est pas la peine de caster le sender en MenuItem, ca ne renvoie pas vraiment l'objet à l'origine de l'événement ?