Udostępnij za pośrednictwem


Direct2D i High-DPI

Pisanie aplikacji obsługującej dpi jest kluczem do spójnego wyglądu interfejsu użytkownika w wielu różnych ustawieniach wyświetlania o wysokiej rozdzielczości DPI. Aplikacja, która nie obsługuje dpi, ale jest uruchomiona w ustawieniu wyświetlania o wysokiej rozdzielczości DPI, może cierpieć na wiele artefaktów wizualnych, w tym nieprawidłowe skalowanie elementów interfejsu użytkownika, przycięty tekst i rozmyte obrazy. Dzięki dodaniu obsługi rozpoznawania dpi w aplikacji możesz sprawić, że prezentacja interfejsu użytkownika aplikacji będzie bardziej przewidywalna, dzięki czemu będzie bardziej wizualnie atrakcyjna i łatwiejsza do odczytania dla użytkowników. Na szczęście funkcja Direct2D ułatwia pisanie aplikacji, które działają dobrze w wysokiej rozdzielczości DPI. Ten temat zawiera następujące sekcje.

obsługa High-DPI w trybie Direct2D

Funkcja Direct2D udostępnia następujące funkcje do pracy ze scenariuszami o wysokiej rozdzielczości DPI:

  • Automatycznie honoruje systemową wartość DPI podczas tworzenia obiektu docelowego renderowania w oknie, tak długo, jak manifest aplikacji wskazuje, że aplikacja prawidłowo obsługuje dpi. (Aby uzyskać informacje na temat deklarowania, że aplikacja jest świadoma dpi, zobacz Jak upewnić się, że aplikacja jest prawidłowo wyświetlana na High-DPI wyświetla).
  • Wyraża współrzędne w dips (Device Independent Pixel), co umożliwia aplikacji automatyczne skalowanie po zmianie ustawienia DPI.
  • Umożliwia mapom bitowym uzyskanie dpi i poprawne skalowanie ich przez uwzględnienie dpi. Ta funkcja może również służyć do obsługi ikon w różnych rozdzielczościach.
  • Wyraża większość zasobów w dips, co sprawia, że zasoby są automatycznie niezależne od rozwiązania.
  • Używa przestrzeni współrzędnych zmiennoprzecinkowych i antyaliasingu, więc dowolną zawartość można skalować do dowolnej dpi.

Potok grafiki Direct2D jest przeznaczony do skalowania z 96 DPI do 1200DPI.

Windows 8 i High-DPI

Począwszy od systemu Windows 8, istnieją dodatkowe funkcje do obsługi wysokiej rozdzielczości DPI.

Jeśli kontekst urządzenia DPI jest wystarczająco wysoki, funkcja Direct2D zmienia próg używany do włączenia pionowego antyaliasingu tekstu. Powoduje to szybsze renderowanie tekstu na wyświetlaczach o wysokiej rozdzielczości DPI. Ponadto można przełączyć tryb jednostki na piksele zamiast diPs przy użyciu metody ID2D1DeviceContext::SetUnitMode. Jeśli ustawisz tryb jednostki na piksele i kontekst urządzenia DPI na ekranIE DPI, optymalizacja jest nadal włączona.

Co to jest DIP?

Niezależny piksel urządzenia (DIP) to piksel logiczny, który mapuje się na piksele urządzenia fizycznego za pomocą skalarnego dpi. DPI oznacza kropki na cal, gdzie kropka reprezentuje piksel urządzenia fizycznego. (Nomenklatura pochodzi z drukowania, gdzie kropki są najmniejszą kropką atramentu, którą może produkować proces drukowania). Ponieważ standardowy monitor używany do posiadania 96 kropek na cal, DPI 96 oznaczało, że urządzenie niezależne piksel (lub DIP) mapowane 1:1 z pikselem fizycznym. Jeśli na przykład dpi to 96*2 = 192, jeden dip będzie obejmował dwa piksele fizyczne.

Istnieje wiele powodów, dla których aplikacje nie muszą prawidłowo obsługiwać tego skalowania; jednym z najprostszych powodów jest to, że wymaga dodatkowej pracy w celu odnalezienia i użycia tej wartości skalarnej podczas renderowania. W trybie Direct2D skalowanie jest stosowane domyślnie. Ze względu na to mapowanie piksele urządzeń fizycznych mogą kończyć się współrzędnymi dip ułamkowych, co jest jednym z powodów, dla których direct2D używa przestrzeni współrzędnej zmiennoprzecinkowej.

piksel fizyczny = (dip × DPI) / 96

Aby przekonwertować piksel fizyczny na dip, użyj następującej formuły:

dip = (fizyczny piksel × 96) / DPI

Nuta

Począwszy od systemu Windows 8, można przełączyć tryb jednostki na piksele zamiast adresów IP przy użyciu metody ID2D1DeviceContext::SetUnitMode.

 

, jak upewnić się, że aplikacja jest prawidłowo wyświetlana na High-DPI wyświetla