2009-02-15 8 views
0

Je suis l'interface graphique pour un programme de type peinture, où l'utilisateur sera en mesure de sélectionner un outil de dessin à partir d'un ToolStrip. Certains de ces outils ont des variations, et j'aimerais que l'utilisateur puisse en sélectionner un via un menu contextuel. Quiconque connaît l'interface de la barre d'outils Photoshop saura ce que je cherche: l'utilisateur peut soit cliquer sur le bouton et commencer à travailler avec l'outil sélectionné, soit choisir l'un des outils du menu contextuel apparaissant lors du clic, et à partir de ce point sur le bouton représentera cet outil. En outre, le bouton aura la propriété Checked définie sur True lorsque cette famille d'outils est sélectionnée. Je pensais que cela pouvait être accompli avec un SplitButton ou un DropDownButton, mais ceux-ci n'ont pas de propriété Checked pour que l'utilisateur puisse voir quel outil est actuellement sélectionné. Donc je suis allé avec un ToolStripButton et un ContextMenuStrip qui est montré lors du clic. Le problème est que puisque je suis en train de prendre la position du curseur pour afficher le ContextMenuStrip, en fonction de la partie du ToolStripButton qui est cliquée, le menu contextuel peut le masquer partiellement, et c'est un aspect très non poli. Comment puis-je obtenir les coordonnées de l'écran de ToolStripButton? Ou y a-t-il une meilleure façon (et encore relativement simple) de le faire?ToolStripButton avec menu contextuel?

Répondre

0

Vous ne dites pas quelle technologie vous utilisez pour l'interface graphique. Je devine winforms ou WPF. Si vous avez le choix, WPF peut être le meilleur choix à long terme pour prendre en charge non seulement les boutons de votre menu contextuel, mais aussi pour supporter la partie peinture de votre application. Si vous utilisez des winforms, avez-vous regardé l'ajout d'un menu contextuel à vos boutons principaux?

1

J'ai implémenté ce type de fonctionnalité auparavant dans les applications. Dans Photoshop, chaque outil a une icône différente (le lasso et le lasso polygonal ont des icônes différentes, le pinceau et le crayon ont des icônes différentes). Donc, lorsque j'utilise une bande d'outils, j'utilise un bouton divisé. Lorsque l'utilisateur sélectionne un outil dans la liste déroulante, vous appliquez l'icône de l'outil sélectionné au bouton de division.

Un ToolStripItem peut avoir une image d'arrière-plan. Pour afficher l'élément sélectionné, vous pouvez simplement définir l'image d'arrière-plan sur une image semi-transparente de couleur unie (c'est-à-dire en noir uni avec une transparence de 25%).

edit: Il serait sans doute préférable d'utiliser une version semi-transparente de SystemColors.Highlight

+0

Cela ne semble pas être natif. Je suppose que je vais juste coller à ma méthode alors. Existe-t-il un moyen d'obtenir les coordonnées exactes de l'écran ToolStripButton (afin que je puisse toujours y faire apparaître le ContextMenuStrip)? – Mike

+0

Je ne comprends pas quand vous dites que ça n'a pas l'air d'être natif. En outre, un bouton divisé sur une bande d'outils possède un menu contextuel intégré, vous n'avez donc pas besoin de positionner ou d'afficher manuellement le menu contextuel. – snarf