Ridimensionamento automatico in Windows Form
La scala automatica consente la visualizzazione in maniera appropriata di un form e dei relativi controlli, progettati su un computer con una determinata risoluzione o un tipo di carattere di sistema, su un altro computer con una risoluzione o un tipo di carattere di sistema diverso. Viene verificato che il form e i relativi controlli siano ridimensionati in modo coerente con le applicazioni Windows native e con le altre applicazioni presenti sui computer degli utenti e degli altri sviluppatori. Il supporto di .NET Framework per la scala automatica e gli stili visivi consente alle applicazioni .NET Framework di conservare un aspetto coerente rispetto alle applicazioni Windows native sui computer di ciascun utente.
Necessità della scala automatica
Senza la scala automatica, un'applicazione progettata per una risoluzione o un tipo di carattere risulterà di dimensioni troppo piccole o troppo grandi quando si modifica la risoluzione o il tipo di carattere. Ad esempio, se l'applicazione è progettata per utilizzare come base il tipo di carattere Tahoma con dimensione 9, senza la modifica le dimensioni risulteranno troppo piccole se l'applicazione viene eseguita in un computer in cui il tipo di carattere di sistema è Tahoma con dimensione 12. Il rendering degli elementi di testo, come i titoli, i menu, i contenuti delle caselle di testo e altri, risulterà inferiore rispetto alle altre applicazioni. Inoltre, le dimensioni degli elementi dell'interfaccia utente che contengono testo, come la barra del titolo, i menu e molti controlli, dipendono dal tipo di carattere utilizzato. In questo esempio, anche questi elementi appariranno relativamente più piccoli.
Una situazione analoga si verifica quando un'applicazione è progettata per una determinata risoluzione. La risoluzione più comune è 96 DPI, ma si utilizzano sempre più spesso risoluzioni maggiori, che supportano 120, 133, 170 DPI e oltre. Con l'adattamento, un'applicazione, specie se di tipo grafico, progettata per un tipo di risoluzione, risulterà troppo grande o troppo piccola quando viene eseguita con un'altra risoluzione.
La scala automatica tenta di risolvere questi problemi ridimensionando automaticamente il form e i relativi controlli figlio secondo le dimensioni del tipo di carattere o la risoluzione relativi. Il sistema operativo Windows supporta la scala automatica delle finestre di dialogo utilizzando unità di misura relative definite unità della finestra di dialogo. L'unità della finestra di dialogo si basa sul tipo di carattere di sistema e le relazioni con i pixel possono essere determinate mediante la funzione GetDialogBaseUnits di Win32 SDK. Quando un utente cambia il tema utilizzato da Windows, tutte le finestre di dialogo vengono adattate in modo appropriato. Si tenga inoltre presente quanto segue:
.NET Framework supporta la scala automatica in base alla risoluzione o al tipo di carattere di sistema predefinito. La scala automatica può anche essere disabilitata in un'applicazione.
Supporto originario per la scala automatica
Le versioni 1.0 e 1.1 di .NET Framework supportavano la scala automatica in maniera diretta in base al tipo di carattere di sistema predefinito di Windows utilizzato per la UI, rappresentato dal valore Win32 SDK DEFAULT_GUI_FONT. Questo tipo di carattere viene in genere modificato solo quando la risoluzione cambia. Per implementare la scala automatica veniva utilizzato il seguente meccanismo:
In fase di progettazione, la proprietà AutoScaleBaseSize (ora obsoleta) era impostata sull'altezza e la larghezza del tipo di carattere di sistema predefinito nel computer utilizzato per lo sviluppo.
In fase di esecuzione, veniva utilizzato il tipo di carattere di sistema predefinito nel computer dell'utente per inizializzare la proprietà Font della classe Form.
Prima di visualizzare il form, veniva chiamato il metodo ApplyAutoScaling per eseguire la scala del form. Questo metodo calcolava le dimensioni di scala relative dalla proprietà AutoScaleBaseSize e dalla proprietà Font, quindi chiamava il metodo Scale per eseguire la scala vera e propria del form e degli elementi figlio.
Il valore della proprietà AutoScaleBaseSize era aggiornato in modo che le chiamate successive al metodo ApplyAutoScaling non ridimensionassero progressivamente il form.
Anche se questo meccanismo era sufficiente per la maggior parte degli scopi, era tuttavia sottoposto alle seguenti limitazioni:
Dal momento che la proprietà AutoScaleBaseSize rappresenta la dimensione del tipo di carattere di base in valori integrali, si verificano errori di arrotondamento che divengono evidenti quando un form passa da una risoluzione a un'altra.
La scala automatica era implementata solo nella classe Form, non nella classe ContainerControl. Di conseguenza, i controlli utente potevano essere scalati in modo corretto solo quando il controllo utente era progettato con la stessa risoluzione del form ed era posizionato nel form in fase di progettazione.
I form e i relativi controlli figlio potevano solo essere progettati contemporaneamente da più sviluppatori se le risoluzioni dei rispettivi computer erano le stesse. Analogamente, l'ereditarietà di un form era dipendente dalla risoluzione associata al form padre.
Questo meccanismo non è compatibile con i nuovi metodi di gestione del layout introdotti con .NET Framework versione 2.0, come FlowLayoutPanel e TableLayoutPanel.
Non veniva fornito il supporto per la scala basato direttamente sulla risoluzione richiesta per la compatibilità con la modalità .NET Compact Framework.
Sebbene questo meccanismo sia stato conservato in .NET Framework versione 2.0 per preservare la compatibilità con le versioni precedenti, esso è stato sostituito dal meccanismo di scala più efficace descritto di seguito. Di conseguenza, la proprietà AutoScale, il metodo ApplyAutoScaling, la proprietà AutoScaleBaseSize e alcuni overload Scale sono contrassegnati come obsoleti.
Nota
È possibile eliminare senza problemi i riferimenti a questi membri durante l'aggiornamento del codice legacy rispetto alla versione 2.0 di .NET Framework.
Supporto corrente per la scala automatica
Nella versione 2.0 di .NET Framework sono state superate le precedenti limitazioni mediante l'introduzione delle seguenti modifiche alla scala automatica di Windows Form:
Il supporto di base per la scala è stato spostato nella classe ContainerControl in modo che i form, i controlli nativi composti e i controlli utente ricevano tutti un supporto uniforme per la scala. Sono stati aggiunti i nuovi membri AutoScaleFactor, AutoScaleDimensions, AutoScaleMode e PerformAutoScale.
La classe Control dispone anche di diversi nuovi membri che ne consentono la partecipazione alla scala e al supporto alla scala mista sullo stesso form. In particolare, i membri Scale, ScaleChildren e GetScaledBounds supportano la scala.
È stato aggiunto il supporto per la scala basato sulla risoluzione come supporto per i tipi di caratteri di sistema, definito dall'enumerazione AutoScaleMode. Questa modalità è compatibile con la scala automatica supportata dalla modalità .NET Compact Framework che semplifica la migrazione dell'applicazione.
All'implementazione della scala automatica è stata aggiunta la compatibilità con i gestori del layout come FlowLayoutPanel e TableLayoutPanel.
I fattori di scala sono ora rappresentati come valori a virgola mobile, utilizzando in genere la struttura SizeF, in modo che gli errori di arrotondamento sono stati praticamente eliminati.
Attenzione |
---|
Le combinazioni arbitrarie di DPI e modalità di scala dei tipi di carattere non sono supportate. Anche se è possibile scalare un controllo utente utilizzando una modalità (ad esempio, DPI) e posizionarlo in un controllo utilizzando un'altra modalità (Font) senza che si verifichino problemi, la combinazione di un form di base in una modalità e di un form derivato in un'altra può produrre risultati imprevisti. |
Funzionamento della scala automatica
Windows Form utilizza la seguente logica per la scala automatica dei form e dei relativi contenuti:
In fase di progettazione, ciascuna classe ContainerControl registra la modalità di scala e la risoluzione corrente rispettivamente nella proprietà AutoScaleMode e nella proprietà AutoScaleDimensions.
In fase di esecuzione, la risoluzione vera e propria viene memorizzata nella proprietà CurrentAutoScaleDimensions. La proprietà AutoScaleFactor calcola dinamicamente il rapporto tra la risoluzione della scala in fase di esecuzione e in fase di progettazione.
Quando il form viene caricato, se i valori delle proprietà CurrentAutoScaleDimensions e AutoScaleDimensions sono diversi, viene chiamato il metodo PerformAutoScale per la scala del controllo e dei relativi controlli figlio. Questo metodo sospende il layout e chiama il metodo Scale per eseguire la scala vera e propria. In seguito, il valore della proprietà AutoScaleDimensions viene aggiornato per evitare la scala progressiva.
Nelle situazioni che seguono viene anche richiamato il metodo PerformAutoScale:
In risposta all'evento OnFontChanged se la modalità di scala è Font.
Quando viene visualizzato nuovamente il layout del controllo contenitore e viene individuata una modifica nella proprietà AutoScaleDimensions o nella proprietà AutoScaleMode.
Come accennato in precedenza, quando viene eseguita la scala di un oggetto ContainerControl padre. Ciascun controllo contenitore gestisce la scala dei relativi controlli figlio utilizzando i relativi fattori di scala e non quello derivante dal contenitore padre.
I controlli figlio possono modificare il loro comportamento nelle operazioni di adattamento in scala in diversi modi:
La proprietà ScaleChildren può essere sottoposta a override per determinare se i controlli figlio devono essere scalati o no.
Il metodo GetScaledBounds può essere sottoposto a override per regolare i bordi di ridimensionamento del controllo, ma non la logica della scala.
Il metodo ScaleControl può essere sottoposto a override per modificare la logica del fattore di scala per il controllo corrente.
Vedere anche
Attività
Procedura: abilitare gli stili di visualizzazione di Windows XP
Procedura: migliorare le prestazioni evitando l'adattamento automatico