giovedì 18 giugno 2015

Automatic scaling di una finestra in C#

Sviluppando un software a finestre in C# e non una web application, spesso si ha il problema di renderlo in qualche modo "responsive" e quindi adattabile alle varie risoluzioni dello schermo o al ridimensionamento della finestra.

Dopo aver cercato su internet per un po', sono finalmente giunto ad uno script facile e veloce per gestire la cosa. Una premessa è doverosa: il C# ha un suo metodo di scaling che però non agisce direttamente sui Font. Il che significa che, oltre allo scaling del controllo, è necessario effettuare anche un ridimensionamento del font con la stessa proporzione.
E' importante disabilitare la funzionalità di autoscale nativa, che permette un adattamento solo parziale e successivamente ridimensionare ogni controllo della finestra con una determinata proporzione (ratio).


Di seguito i pochi passi necessari per il corretto funzionamento del ridimensionamento.

1. Aggiungere nelle dichiarazione delle variabili
private Size currSize;
2. Aggiungere nel costruttore, dopo InitializeComponent()
this.AutoScaleMode = AutoScaleMode.None;
currSize = this.Size;
3. Aggiungere la seguente funzione
private void autoscale()
{
   Font tempFont;
   SizeF ratio = SizeF.Empty;
   //calculate resizing ratio
   ratio = new SizeF((float)this.Width / currSize.Width, (float)this.Height / currSize.Height);
   //loop through all controls and scale them
   foreach (Control c in this.Controls)
   {//Get current font size, Scale object and scale font
      tempFont = new Font(c.Font.Name,
      c.Font.SizeInPoints * ratio.Width * ratio.Height);
      c.Scale(ratio);
      c.Font = tempFont;
   }
   //update current size
   currSize = this.Size;
}
4. Utilizzare la funzione precedente nell'evento SizeChanged della windows form
private void Form1_SizeChanged(object sender, EventArgs e)
{
   autoscale();
}

Nessun commento: