Creare un gestionale per strutture ricettive in C# – #14 – Adattare dimensioni elementi al form

Creare un gestionale per strutture ricettive in C# – #14 – Adattare dimensioni elementi al form

Creare un gestionale per strutture ricettive in C# – #14 – Adattare dimensioni elementi al form: Correzioni ai problemi che si possono presentare quando si ridimensiona un form.

Quando ridimensioniamo un Form, in molti casi è sufficiente agganciare gli elementi ai lati corretti per avere un corretto ridimensionamento.

Questo è valido soprattutto quando ci sono pochi elementi, ma con molti elementi presenti, si rende necessario intervenire via codice per evitare che questi possano sovrapporsi tra loro.

Creare un gestionale per strutture ricettive in C# – #14 – Adattare dimensioni elementi al form

Per fare in modo che le modifiche vengano applicate ogni volta che il form viene ridimensionato dovremo andare ad inserirle tutte nell’evento Paint del form.

Infatti quando viene ridimensionato il form, viene ridisegnato tutto il suo contenuto, e quindi chiamato l’evento Paint.

Al suo interno andremo quindi ad inserire i controlli che ci permetteranno di adattare le listview alle dimensioni del form e di spostare i button per fare in modo che siano sempre allineati al bordo destro e alla listview.

Dimensioni massime e minime dei controlli

Per ridimensionare correttamente il form e tutti i controlli presenti al suo interno, è importante impostare i valori massimi e minimi per larghezza e altezza.

Questo sia per il form stesso che per gli elementi che andremo a ridimensionare.

I valori minimi .MinimumSize sono fondamentali per vedere correttamente il contenuto del form.

Infatti se un utente potesse ridimensionare il form ad un valore minore rispetto alle dimensioni di un controllo, questo non sarebbe più visibile e di fatto il programma sarebbe inutilizzabile.

Per questo motivo dovremo assicurarci che il form non possa mai scendere sotto le dimensioni minime per la corretta visualizzazione del suo contenuto.

Lo stesso vale per i controlli al suo interno, nel nostro caso la ListView.

Infatti se la listview dovesse essere rimpicciolita troppo, il suo contenuto sarebbe illegibile, e quindi sarebbe impossibile per un utente vederlo.

Per quanto riguarda le dimensioni massime, il discorso è simile, ma il rischio è che gli elementi possano superare le dimensioni del form e quindi alcune parti di essi non siano visibili.

Se per le dimensioni minime possiamo decidere in anticipo quali debbano essere, cosi non può essere per le dimensioni massime, o meglio, non può essere cosi se vogliamo permettere all’utente di avere il form a schermo intero.

Infatti potremmo decidere di impostare delle dimensioni massime predefinite, ma in questo modo utenti con risoluzioni superiori non avrebbero il form a schermo intero.

Vediamo quindi come impostare le dimensioni massime dei controlli nel nostro form.

System.Drawing.Size DimensioniMassimeListView = new Size();
DimensioniMassimeListView.Width = this.Width - 25;
DimensioniMassimeListView.Height = this.Height - 25 - lblSconti.Top - 5;
lstCostiExtra.MaximumSize = DimensioniMassimeListView;

In questo esempio creiamo una variabile di tipo Size che contiene i valori Width ed Height che andremo poi ad assegnare al nostro controllo.

In entrambi i casi andiamo a prendere le misure del form (this.Width o this.Height) e andiamo a sottrarre dei valori in base allo spazio che vogliamo lasciare tra il controllo e il bordo del form.

Alla fine assegniamo i valori alla proprietà MaximumSize del controllo.

Come regolare automaticamente l’altezza di un controllo

Quando abbiamo un solo controllo ci basta aggangiarlo a tutti i lati per assicurarci che questo venga ridimensionato correttamente e mantenga sempre la stessa distanza da tutti i bordi.

Questo però non è possibile quando sono presenti altri controlli, perchè andrebbero a sovrapporsi tra loro.

Per questo motivo dovremo andare a calcolare esattamente il rapporto in percentuale del controllo con il form.

Così possiamo assicurarci che andando a ridimensionare il form, il nostro controllo manterrà sempre la stessa percentuale di altezza.

Per farlo possiamo usare una semplice formula:

Altezza Controllo / Altezza Form

oppure se vogliamo sapere la percentuale:

Altezza Controllo / Altezza Form * 100

Qui spiego come calcolare il valore percentuale tra due numeri.

Ad esempio, nel nostro caso abbiamo il Form con altezza 590 e la ListView con altezza 242.

Quindi avremo 242 / 590 = 0,41 (oppure 242/590*100 = 41%)

0,41 è proprio il valore che ci servirà per mantenere un rapporto costante tra altezza del form e altezza del controllo.

Abbiamo però un problema da risolvere, le dimensioni dei controlli hanno solo numeri interi, e moltiplicando (o dividendo) dei valori non abbiamo la certezza che il risultato sia sempre un numero intero.

Dobbiamo quindi arrotondare il risultato, e convertirlo in un numero intero.

Avremo quindi che per assegnare l’altezza della ListView dovremo scrivere:

lstCostiExtra.Height = Convert.ToInt32(Math.Round(this.Height * 0.41, 0));

Andando a scomporre tutto abbiamo, Conversione in numero intero del risultato di arrotondamento di altezza del form per 0.41.

Lo 0 dopo la virgola invece indica che stiamo arrotondando senza numeri decimali.

Come centrare una groupbox

La groupbox presente nel form, permette di aggiungere nuovi sconti o costi extra, ed era centrata per le dimensioni iniziali del form.

Ma quando l’utente ridimensiona il form, la groupbox rimarrà centrata alle dimensioni precedenti.

Per poter centrare la groupbox con qualsiasi risoluzione dovremo eseguire un’operazione simile a quella precedente.

Ci servirà quindi andare a calcolare l’altezza del form, e dividerla a metà, calcolare l’altezza della groupbox e dividerla a metà e poi sottrarla all’altezza del form.

La formula quindi sarà:

(Altezza form / 2) – (Altezza groupbox / 2)

Ovviamente dovremo poi fare la stessa cosa per la larghezza.

Il risultato finale sarà:

// CENTRARE GROUPBOX
grpAggiungiElemento.Top = Convert.ToInt32(Math.Round(this.Height / 2.0, 0)) - Convert.ToInt32(Math.Round(grpAggiungiElemento.Height / 2.0,0));
grpAggiungiElemento.Left = Convert.ToInt32(Math.Round(this.Width / 2.0, 0)) - Convert.ToInt32(Math.Round(grpAggiungiElemento.Width / 2.0, 0));
Claudio Masci

Sono innanzitutto un appassionato di informatica e tecnologia in generale. Lavoro in ambito informatico da circa 16 anni, spaziando in diversi campi, andando dalla programmazione web, allo sviluppo di software, dalla grafica alla modellazione 3d ed al video editing, ho sempre voluto approfondire ogni aspetto e questo mi ha permesso di lavorare in diversi ambiti informatici.

Rispondi