2009-02-21 6 views
9

Come posso ottenere che OwnerDrawn OwnerControl rispetti i dpi degli utenti (96/120/xxx) e/o la dimensione dei caratteri (normale, grande, extra large)?C# Scalare il contenuto di UserControl per abbinare gli utenti Dpi/Font Size

Alcune persone suggeriscono di utilizzare le proprietà DpiX e DpiY su un oggetto Graphics, ma questo non sembra avere nulla nel mio controllo (cioè sono sempre impostate su 96, indipendentemente da quale font-size o dpi scelgo).

C'è un'altra domanda simile qui su StackOverflow in cui suggerisce di utilizzare le proprietà AutoScale, ma le soluzioni suggerite non fanno nulla.

Non c'è modo di farlo in .NET se non affidarsi a WPF?

risposta

3

Ho lo stesso problema, ho provato a utilizzare GetDC + GetDeviceCaps + ReleaseDC, eccetto l'utilizzo di Grafica funzionante, almeno su Vista32. Non ho ancora esperienza con DPI, ma nessuno ha risposto a questo e almeno questo potrebbe essere utile per gli altri.

Check out Creating a DPI-Aware Application. Questo indica perché potrebbe sempre restituire 96 indipendentemente dall'impostazione DPI effettiva.

Citazione dall'alto link:

ridimensionamento DPI in un'applicazione Win32

Nelle applicazioni Win32, effettuare le seguenti operazioni:

  • Utilizzare la funzione SetProcessDPIAware per annullare dpi ridimensionamento.
  • Quando si dimensionano gli elementi dell'interfaccia, utilizzare le misurazioni fisiche, ad esempio i centimetri. Utilizzando dimensioni fisiche anziché pixel, si garantisce un dimensionamento coerente su tutti i tipi di display.
  • Per ottenere l'impostazione dpi del sistema, utilizzare la funzione CDC :: GetDeviceCaps con il flag LOGPIXELSX. Se non si annulla il ridimensionamento dpi, questa chiamata restituisce il valore predefinito di 96 dpi.
  • Utilizzare la funzione GetSystemMetrics per ottenere le dimensioni preferite degli elementi dell'interfaccia utente, ad esempio i bordi delle finestre. Quando il ridimensionamento dpi è disattivato, i valori di misurazione restituiti per gli elementi dell'interfaccia vengono ridimensionati in base all'impostazione dpi selezionata. Se è attivo il ridimensionamento dpi, la funzione restituisce misurazioni basate su 96 dpi, indipendentemente dall'impostazione dpi del sistema.

rispose dal: Codice About DPI Issue

Esempio riscritto con utilizzando -affermazione (original source):

float dpiX = 96, dpiY = 96; 
using(Graphics graphics = this.CreateGraphics()) 
{ 
    dpiX = graphics.DpiX; 
    dpiY = graphics.DpiY; 
} 
11

Lei avrebbe bisogno di impostare la proprietà AutoScaleMode di UserControl a AutoScaleMode. Dpi e non impostare la proprietà AutoScale su true. In caso contrario, ripristinerà AutoScaleMode su None. La proprietà AutoScale è obsoleta ed è disponibile solo per la compatibilità con le versioni precedenti (vedere la Nota importante in questo MSDN article).

Inoltre, in Windows Vista/7, a meno che non si specifichi esplicitamente che l'applicazione è compatibile con DPI, Windows emulerà un ambiente DPI predefinito in modo che l'applicazione esegua rendering con 96 DPI, quindi ridimensiona la bitmap risultante nella dimensione appropriata. Per evitare ciò, è possibile modificare il manifest dell'applicazione per informare Windows che si è effettivamente a conoscenza DPI - vedere lo Utilizzo di manifest per dichiarare la consapevolezza DPI nella sezione in this article.

Problemi correlati