2010-10-24 32 views
8

Ho un'applicazione WinForm che ospita molte immagini. Quando metto l'applicazione su un computer Win7 con un DPI di 120, rovina completamente l'aspetto del modulo. C'è un modo per disabilitare il ridimensionamento del mio modulo?C# WinForms disabilita il ridimensionamento DPI

Sono consapevole che questo è qualcosa che non è consigliato e che DPI dovrebbe essere senza soluzione di continuità e gestito dal sistema operativo. Ma quando si tratta di un'applicazione pelata, le immagini non si adattano bene. Non ho il lusso di creare immagini per tutte le variazioni DPI, quindi per favore non suggerirlo come risposta.

risposta

10

Avrete problemi più grandi quando si modifica la proprietà AutoScaleMode. Aumentando il DPI cambia anche la dimensione del carattere di sistema. Necessariamente così, le dimensioni dei caratteri sono espresse in punti, 1/72 di pollice. I caratteri devono essere più grandi per ottenere la stessa dimensione dei punti quando il DPI aumenta e mantenere il testo leggibile se visto dalla stessa distanza.

Poiché i controlli non vengono più ridimensionati, il testo su, ad esempio, un pulsante non si adatta più. Un modo per combattere questo è modificare proporzionalmente la dimensione del carattere sui controlli. Semplice se si lascia che tutti i controlli ereditino il carattere del modulo, cambiando semplicemente la proprietà Font del modulo si aggiornano automaticamente anche i controlli. Il chiaro svantaggio è che l'utente avrà più difficoltà a leggere il testo. Questo diventa particolarmente grave quando il DPI va a 150 punti per pollice e oltre, l'interfaccia utente si trasforma in un francobollo inutilizzabile.

Sì, le immagini di sfondo devono essere ridimensionate per adattarsi al controllo o alla forma più grandi. Un pixel nell'immagine ora non mappa più da uno a uno a un pixel del monitor. Il valore Graphics.InterpolationMode predefinito esegue un lavoro abbastanza decente di filtraggio dell'immagine. Ma dipende dal tipo di immagine che risulta bene. Una foto quasi sempre scala molto bene. La line art e il testo finemente dettagliati non lo fanno. Scegliere il giusto tipo di immagine fa molto per evitare di doverne creare di separati.

Questo problema non scomparirà finché i monitor non avranno il tipo di risoluzione di una stampante. Siamo ancora lontani da 600 dpi per i monitor desktop. I telefoni saranno i primi

+1

600 schermi DPI stanno diventando realtà. Guarda il tuo telefono (ok, non 600 ma 480 sono qui). Il futuro è qui. – Hooch

3

È possibile impostare la proprietà AutoScaleMode del modulo su None.

+7

ho provato questo con scarso successo. – MarkP

+0

Combinare questo con il ridimensionamento manuale dei caratteri dei controlli (come suggerito in un'altra soluzione qui) ha risolto il problema per me. – Zarat

3

L'aggiunta di una riga di codice prima della chiamata generato automaticamente a InitializeComponent nel Form1 costruttore risolto per me:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     // Make the GUI ignore the DPI setting 
     Font = new Font(Font.Name, 8.25f * 96f/CreateGraphics().DpiX, Font.Style, Font.Unit, Font.GdiCharSet, Font.GdiVerticalFont); 
     InitializeComponent(); 
    } 
} 
+0

Non funziona affatto su Windows 10 con un monitor 4K scalato al 150% – SlapY

+0

Combinare questo con l'impostazione di AutoScaleMode su Nessuno ha risolto il problema per me – Zarat

Problemi correlati