Se ho capito bene tu aggiungi delle stringhe tramite graphics della picturebox, se è così dovresti innanzi tutto inserire in una lista tutte le stringhe che devi utilizzare nel picturebox, mettendo anche le informazioni sulla posizione della stringa, poi allo scattare dell'evento click sulla picturebox devi confrontare la posizione del mouse con i margini della stringa, se collidono allora attivi l'azione corrispondente.
Per ottenere "l'ingombro" della stringa in modo da ottenere i limiti cliccabili, puoi usare MeasureString dell'oggetto graphics della picturebox, questo ti restituisce un sizeF che se unito al punto iniziale (x,y) puoi ottenere un rectangleF, questo servirà poi per usare IntersectsWith (dell'oggetto rectangleF) per valutare se il click del mouse rientra nei margini della stringa disegnata sul picturebox.
Ovviamente per fare tutto questo ti conviene fare una classe derivata da picturebox e fare tutto li.
Ad esempio:
public class MyPictureBox: PictureBox
{
public List<LinkInfo> LinkList = new List<LinkInfo>();
protected override void OnPaint(PaintEventArgs pe)
{
LinkList.ForEach(f => {
f.Rectangle = new RectangleF(f.Point, pe.Graphics.MeasureString(f.Text, f.Font, f.Point,null));
pe.Graphics.DrawString(f.Text, f.Font, f.Brush, f.Rectangle);
});
base.OnPaint(pe);
}
protected override void OnMouseClick(MouseEventArgs e)
{
var link = LinkList.FirstOrDefault(f => f.Rectangle.IntersectsWith(new RectangleF(e.X, e.Y, 1, 1)));
link?.Action(link);
base.OnMouseClick(e);
}
}
public class LinkInfo
{
public string Text { get; set; }
public Action<LinkInfo> Action { get; set; }
public RectangleF Rectangle { get; set; }
public Font Font { get; set; }
public Brush Brush { get; set; }
public PointF Point { get; set; }
public LinkInfo()
{
Font = new Font("Arial", 12);
Rectangle = new RectangleF();
Text="inserire testo";
Brush = Brushes.Red;
Point = new PointF(0, 0);
Action = (link) => { };
}
}
va aggiunta come una normale picturebox e la usi in questo modo:
this.myPictureBox1.LinkList.Add(new LinkInfo() { Point=new PointF(40,30), Text = "Ciao a tutti!", Action = (link) =>
//quando clicchi sulla prima scritta viene aperto un messagebox con il testo del primo link
MessageBox.Show(link.Text) });
this.myPictureBox1.LinkList.Add(new LinkInfo() { Point = new PointF(40, 50), Text = "Questa è una stringa lunga che simula una descrizione", Brush=Brushes.Gray, Action = (link) =>
{
//quando clicchi sulla seconda scritta viene modificato testo e colore del primo link
var primoLink = this.myPictureBox1.LinkList.First();
primoLink.Text = "Hai cliccato sulla descrizione";
primoLink.Brush = Brushes.Gold;
this.myPictureBox1.Invalidate();
MessageBox.Show(link.Text);
}});