Mangiare Senza Glutine disponibile su App Store

Per altre informazioni scrivi a fabriziocaldarelli@negusweb.it

Testo scritto verticalmente in un controllo Button

Da Programmazione Software.

Descrizione

Può capitare di dover scrivere del testo verticalmente in un pulsante. Il controllo Button, come molti altri controlli del framework .NET, non dispongono di una proprietà che consenta di orientare verticalmente il testo da visualizzare nel controllo. Facciamo un passo indietro. L'orientamento del sistema di coordinate standard pone l'origine degli assi nel punto in alto a sinistra del controllo, l'orientamento positivo dell'asse delle X verso destra e quello dell'asse delle Y verso il basso, in questo modo: Orientamento di default del sistema di coordinate

Orientamento di default
Ora per raggiungere il nostro scopo l'operazione indispensabile da fare è cambiare, in fase di disegno del controllo (painting), l'orientamento del sistema di coordinate associate al controllo. L'orientamento, in verso antiorario di 90 gradi, sarà il seguente:

Orientamento ruotato del sistema di coordinate

Orientamento ruotato
Utilizzeremo, a questo scopo, il metodo RotateTransform dell'istanza della classe di tipo PaintEventArgs, che avremo a disposizione nel metodo OnPaint opportunamente sovrascritto (override). Prestate attenzione al fatto che l'orientamento cambiato interessa il sistema di coordinate relative al controllo, perchè a livello fisico l'area effettivamente di disegno del controllo è quella con la disposizione iniziale. A questo punto, per completare l'opera, conviente anche traslare l'origine degli assi del nostro sistema con l'inizio del controllo (in questo caso il punto in basso a sinistra del controllo) spostando l'origine degli assi, dell'altezza base.Height, con il metodo TranslateTransform, sempre dell'istanza dell'oggetto di tipo PaintEventArgs. Fatto questi cambiamenti del sistema di coordinate possiamo procedere con il disegno del bordo della controllo e della scrittura del testo all'interno del controllo. Per disegnare il bordo, prenderemo come caratteristiche di colore e dimensione quelle effettivamente associate al controllo leggendole dalla proprietà FlatAppearence; per scrivere il testo (in mezzo al controllo, per completezza), oltre allo stesso discorso sul colore fatto per disegnare il bordo, dobbiamo tenere conto anche delle dimensioni del testo per trovare il punto in cui posizionare il testo, attraverso il metodo MeasureString.

Vediamo il codice:

protected override void OnPaint(PaintEventArgs pe)
{
     // Ridisegnamo la base del controllo con la proprietà BackColor del controllo
     pe.Graphics.Clear(base.BackColor);
 
     // Trasla di base.Height in senso verticale e ruota di 90 gradi in senso antiorario
     pe.Graphics.TranslateTransform(0,base.Height);
     pe.Graphics.RotateTransform(-90);
 
     /*
         Lo stesso effetto può anche essere raggiunto applicando prima la rotazione e poi una traslazione.
         Una rotazione sempre di 90 gradi in senso antiorario (e quindi di segno negativo) e poi una 
         traslazione dell'origine degli assi questa volta di (-base.Height,0), perchè dobbiamo considerare
         il nuovo orientamento, dopo la rotazione, ovvero
 
         pe.Graphics.RotateTransform(-90);
         pe.Graphics.TranslateTransform(-base.Height,0);
     */
 
 
     // Scrive il bordo del pulsante
     Pen pen = new Pen(new SolidBrush(base.FlatAppearance.BorderColor), base.FlatAppearance.BorderSize);
     pe.Graphics.DrawRectangle(pen, new Rectangle(0, 0, base.Height, base.Width));
 
     // Scrive il testo, considerando nel posizionamento, anche lo spazio occupato dal testo stesso
     Font fnt = new Font(base.Font, FontStyle.Bold);
     SolidBrush brush = new SolidBrush(base.ForeColor);
     PointF pointString = new PointF(base.Height/2.0F,base.Width/2.0F);
     SizeF sizeF = pe.Graphics.MeasureString(base.Text, fnt);
     pointString.X -= sizeF.Width/2.0F;
     pointString.Y -= sizeF.Height/2.0F;
     pe.Graphics.DrawString(base.Text, fnt, brush, pointString);
}


Allegati