2009-02-21 14 views
9

Jak mogę przekonać użytkownika OwnerDontrol do przestrzegania użytkowników dpi (96/120/xxx) i/lub rozmiaru czcionki (normalny, duży, bardzo duży)?C# Skalowanie treści UserControl, aby dopasować użytkowników Dpi/Rozmiar czcionki

Niektóre osoby sugerują używanie właściwości DpiX i DpiY na obiekcie Graphics, ale nie wydaje mi się, że to cokolwiek pod moją kontrolą (tj. Zawsze są ustawione na 96, bez względu na to jaki rozmiar czcionki lub rozdzielczość dpi wybiorę).

Jest jeszcze jedno podobne pytanie w StackOverflow, gdzie sugeruje użycie właściwości AutoScale, ale sugerowane rozwiązania tak naprawdę nic nie robią.

Czy nie można tego zrobić w .NET, z wyjątkiem polegania na WPF?

Odpowiedz

3

Mam ten sam problem, próbowałem używać GetDC + GetDeviceCaps + ReleaseDC, z wyjątkiem korzystania z grafiki pracował, co najmniej w Vista32. Nie mam jeszcze doświadczenia z DPI, ale nikt nie odpowiedział na to i przynajmniej może to być pomocne dla innych.

Zapoznaj się z Creating a DPI-Aware Application. To wspomina, dlaczego zawsze może powrócić do 96 niezależnie od rzeczywistych ustawień DPI.

Cytat powyższy link:

DPI skalowanie w aplikacji Win32

W aplikacji Win32, wykonaj następujące czynności:

  • użyć funkcji SetProcessDPIAware anulować dpi skalowanie.
  • Podczas wymiarowania rysowanych elementów interfejsu należy korzystać z pomiarów fizycznych, takich jak centymetry. Używając wymiarów fizycznych, a nie pikseli, zapewniasz spójne sortowanie na wszystkich typach wyświetlaczy.
  • Aby uzyskać ustawienie systemu dpi, użyj funkcji CDC :: GetDeviceCaps z flagą LOGPIXELSX. Jeśli nie anulujesz skalowania dpi, to wywołanie zwraca domyślną wartość 96 dpi.
  • Użyj funkcji GetSystemMetrics, aby uzyskać preferowane rozmiary elementów interfejsu użytkownika, takich jak obramowanie okien. Gdy skalowanie dpi jest wyłączone, wartości pomiarowe zwracane dla elementów interfejsu są skalowane do wybranego ustawienia dpi. Jeśli skalowanie dpi jest aktywne, funkcja zwraca wyniki w oparciu o 96 dpi, niezależnie od ustawienia systemu dpi.

Odpowiedź z: kod About DPI Issue

Sample przepisany z użyciu -statement (original source):

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

Trzeba by ustawić właściwość AutoScaleMode z UserControl do AutoScaleMode. Dpi i nie ustaw właściwość AutoScale na true. Jeśli to zrobisz, zresetuje AutoScaleMode z powrotem do Brak. Właściwość AutoScale jest przestarzała i jest dostępna tylko dla zgodności wstecznej (patrz Ważna uwaga w tym MSDN article).

Również w systemie Windows Vista/7, chyba że wyraźnie określisz, że twoja aplikacja obsługuje DPI, Windows będzie emulował domyślne środowisko DPI, tak aby twoja aplikacja renderowała się z rozdzielczością 96 DPI, a następnie skalować wynikową bitmapę do odpowiedniego rozmiaru. Aby tego uniknąć, możesz zmienić swój manifest aplikacji, aby poinformować system Windows, że faktycznie jesteś świadomy DPI - patrz manifest Użycie manifestu do zadeklarowania sekcji Świadomość DPI w this article.

Powiązane problemy