63 messaggi dal 01 novembre 2012
Buongiorno,

In una PictureBox ho inserito delle voci con la numerazione.

Prova1 [1], Prova2 [2], Prova3 [3].
Gradirei gentilmente che cliccando su una delle voci
dovrebbe svolgere una azione.
Ho provato con l'evento Switch senza riuscire.

Gentilmente potete suggerire come potrei risolvere?
Anicipatamente ringrazio e fiducioso, saluto.

Domenico
57 messaggi dal 17 maggio 2010
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);
            }});
63 messaggi dal 01 novembre 2012
ringrazio della tempestività e disponibilità.

Mi scuso del ritardo che ancora non sono riuscito
che mi da errore sottolineando in rosso "myPictureBox1".
Ho anche inserito "using System.IO;"
Riporto il codice:
private void PictureBox1_Click(object sender, EventArgs e)
        {
            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);
                }
            });

Fiducioso, saluto.
Domenico
57 messaggi dal 17 maggio 2010
Non va inserito li quel codice, ma nel costruttore o nell'evento load del form. Inoltre come già indicato devi aggiungere la MyPictureBox come faresti per la picturebox normale, ovvero dalla casella degli strumenti (dovrebbe essere proprio il primo in alto) e la trascini nel form.
Ovviamente devi inserire anche la classe MyPictureBox nel codice.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.