Comment intégrer un lien hypertexte dans un ToolStripItem en C#
Introduction
Aujourd'hui nous allons voir comment insérer un lien hypertexte dans un MenuStrip, ContextMenuStrip, StatusStrip ou encore un ToolStrip en C#. Pour cela nous allons remplacer (override) la classe ToolStripMenuItem.
Prérequis
- - Avoir Visual Studio d'installer sur sa machine - Version Express disponible sur le site microsoft.com
- - Un peu de patiente et de lecture...
Commençons
Étape 1 : Création du projet
Créer un nouveau projet sous Visual Studio de type Windows Forms. Pour ma part je le nomme TutoToolStripMenuItemLink.
Étape 2 : Ajout des contrôles dans la WinForm
Ajoutez dans le designer de votre Form1.cs (que je renomme FormMain) les éléments suivants :
Nous ajouterons les items avec le lien vers une page web manuellemennt à partir du code.
Étape 3 : Création de la classe ToolStripItemLink
Nous allons maitenant créer une nouvelle classe (ci-dessous) en héritant le membre ToolStripMenuItem, ce qui nous permettra d'ajouter
notre Item dans tous les contrôles acceptant la classe ToolStripMenuItem. Pour ma part je la nomme ToolStripItemLink.
- using System;
- using System.ComponentModel;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
-
- namespace TutoToolStripItemLink
- {
- [Description("ToolStripItem avec un lien, utilisable dans les controles MenuStrip, ContextMenuStrip, ToolStrip et StatusStrip")]
- public class ToolStripItemLink : ToolStripItem
- {
- private int linkStart;
- private int linkLenght;
- private string url;
- private Rectangle linkRectangle;
- private Point mouseLocation;
-
- // ---------------------------------------------
-
- // Constructeur
- // Initialise automatiquement les éléments de l'item
- public ToolStripItemLink(string _text, int _start, int _lenght, string _url)
- {
- base.Size = new Size(140, 20);
- base.Text = _text;
- this.linkStart = _start;
- this.linkLenght = _lenght;
- this.url = _url;
- }
-
- // ---------------------------------------------
-
- // Détection des mouvements de la souris
- // Utilise la méthode IsOnLink() pour savoir si le pointeur et sur le lien,
- // le cas échéant, le pointeur de la souris devient une main.
- protected override void OnMouseMove(MouseEventArgs mea)
- {
- this.mouseLocation = mea.Location;
- base.Invalidate();
- base.OnMouseMove(mea);
-
- if (IsOnLink())
- base.Parent.Cursor = Cursors.Hand;
- else
- base.Parent.Cursor = Cursors.Default;
- }
-
- // Override de la méthode OnPaint()
- // Permet de redéssiner le contrôle à notre manière, on recréer le texte
- // et on dessine le surlignement du lien lors du passage de la souris.
- protected override void OnPaint(PaintEventArgs e)
- {
- Font font = new Font("Segoe UI", 10.0f, FontStyle.Regular);
-
- string link = base.Text.Substring(this.linkStart, this.linkLenght);
- string firstText = base.Text.Substring(0, this.linkStart);
- string endText = base.Text.Substring(this.linkStart + this.linkLenght);
-
- float position = 1;
-
- // Dessine le texte de début
- // Si le lien est en début de chaine, on ne dessine pas le texte
- if (firstText.Length > 0)
- {
- font = new Font("Segoe UI", 10.0f, FontStyle.Regular);
- e.Graphics.DrawString(firstText, font, new SolidBrush(Color.Black), new PointF(position, 0));
- position = e.Graphics.MeasureString(firstText, font).Width;
- }
-
- // Dessine le lien
- if (link.Length > 0)
- {
- if (this.IsOnLink())
- font = new Font("Segoe UI", 10.0f, FontStyle.Underline);
- else
- font = new Font("Segoe UI", 10.0f, FontStyle.Regular);
-
- e.Graphics.DrawString(link, font, new SolidBrush(Color.Blue), new PointF(position - 2, 0));
-
- SizeF linkSize = e.Graphics.MeasureString(link, font);
-
- // On enregistre la rectangle dans lequel se trouve le lien,
- // ce qui va nous permettre de définir si la souris est dessus dans la methode IsOnLink()
- linkRectangle = new Rectangle((int)position, 0, (int)linkSize.Width, (int)linkSize.Height);
- position += linkSize.Width;
- }
-
- // Dessine le texte de fin
- // Si le lien est à la fin de la chaine, on ne dessine pas le texte
- if (endText.Length > 0)
- e.Graphics.DrawString(endText,
- new Font("Segoe UI", 10.0f, FontStyle.Regular),
- new SolidBrush(Color.Black),
- new PointF(position - 6, 0));
-
- base.OnPaint(e);
- }
-
- // Override du click sur l'item
- // Ouvre le lien dans le navigateur uniquement si la souris se trouve sur le lien
- protected override void OnClick(EventArgs e)
- {
- if (this.IsOnLink())
- System.Diagnostics.Process.Start(this.url);
-
- base.OnClick(e);
- }
-
- // ---------------------
-
- // Méthode pour savoir si la souris se trouve sur le lien
- private bool IsOnLink()
- {
- if (this.mouseLocation.X > this.linkRectangle.X
- && this.mouseLocation.X < (this.linkRectangle.X + this.linkRectangle.Width))
- return true;
- else
- return false;
- }
-
- // ------------------------------------------
-
- }
- }
Étape 4 : Utilisation dans le code
Nous ajoutons manuellement les items lors du chargement de la fenêtre.
On pourrait très bien créer des contrôles personnalisés hérités et ajouter "l'item lien" depuis le designer.
- using System;
- using System.ComponentModel;
- using System.Drawing;
- using System.Text;
- using System.Windows.Forms;
-
- namespace TutoToolStripItemLink
- {
- public partial class FormMain : Form
- {
- public FormMain()
- {
- InitializeComponent();
- }
-
- private void FormMain_Load(object sender, EventArgs e)
- {
- // Création des items lors du chargement de la window form
- ToolStripItemLink linkItem1 = new ToolStripItemLink("Lien MLI", 5, 3, "http://www.mounier-logiciels.fr");
- ToolStripItemLink linkItem2 = new ToolStripItemLink("Visitez notre site : MLI", 21, 3, "http://www.monsite.fr");
- ToolStripItemLink linkItem3 = new ToolStripItemLink("MLI", 0, 3, "lien vers fichier sur l'ordi");
- ToolStripItemLink linkItem4 = new ToolStripItemLink("Lien au milieu du texte", 5, 9, "lien pour execution d'un programme");
-
- // Ajout des items de type lien dans nos contrôles
- fichierToolStripMenuItem.DropDownItems.Add(linkItem2);
- menuStrip1.Items.Add(linkItem1);
- statusStrip1.Items.Add(linkItem3);
- contextMenuStrip1.Items.Add(linkItem4);
- }
- }
- }
Pour finir
L'ensemble des contrôles de base WinForm sont modifiables, il devient facile avec un peu d'imagination de modifier un contrôle et de créer son propre design ou sa propre fonctionnalité.
Téléchargement
Télécharger le projet "Comment intégrer un lien hypertexte dans un ToolStripItem en C#" :
Commentaires
Aidez nous à améliorer cet article.