Direct2D och High-DPI
Att skriva ett DPI-medvetet program är nyckeln till att få ett användargränssnitt (UI) att se konsekvent bra ut i en mängd olika visningsinställningar med hög DPI. Ett program som inte är DPI-medvetet men körs på en visningsinställning med hög DPI kan drabbas av många visuella artefakter, inklusive felaktig skalning av gränssnittselement, klippt text och suddiga bilder. Genom att lägga till stöd i ditt program för DPI-medvetenhet gör du presentationen av programmets användargränssnitt mer förutsägbar, vilket gör det mer visuellt tilltalande och enklare att läsa för användare. Lyckligtvis gör Direct2D det enklare än någonsin att skriva program som fungerar bra i hög DPI. Det här avsnittet innehåller följande avsnitt.
High-DPI support i Direct2D
Direct2D innehåller följande funktioner för att arbeta med scenarier med hög DPI:
- Det respekterar automatiskt systemets DPI när du skapar ett mål för fönsteråtergivning, så länge programmanifestet anger att programmet hanterar DPI korrekt. (Information om hur du deklarerar att ditt program är DPI-medvetet finns i Så här ser du till att programmet visas korrekt på High-DPI Visar.)
- Den uttrycker koordinater i DIP:er (Enhetsoberoende pixlar), vilket gör att programmet kan skalas automatiskt när DPI-inställningen ändras.
- Det gör det möjligt för bitmappar att ha en DPI och skalar dem korrekt genom att ta hänsyn till DPI:et. Den här funktionen kan också användas för att underhålla ikoner med olika upplösningar.
- Den uttrycker de flesta resurser i DIP:er, vilket gör resurserna automatiskt oberoende av lösning.
- Den använder ett flyttalskoordinatutrymme och antialias, så att allt innehåll kan skalas till valfri godtycklig DPI.
Direct2D-grafikpipelinen är utformad för att skala från 96 DPI till 1200DPI.
Windows 8 och High-DPI
Från och med Windows 8 finns det ytterligare funktioner för stöd för hög DPI.
Om enhetskontextens DPI är tillräckligt hög ändrar Direct2D tröskelvärdet som används för att aktivera lodrät antialiasering av text. Detta resulterar i snabbare textåtergivning på hög DPI-skärmar. Dessutom kan du växla enhetsläget till pixlar i stället för DIP:er med hjälp av metoden ID2D1DeviceContext::SetUnitMode. Om du ställer in enhetsläget på bildpunkter och DPI för enhetskontext till skärmens DPI är optimeringen fortfarande aktiverad.
Vad är en DIP?
En enhetsoberoende pixel (DIP) är en logisk pixel som mappar till bildpunkterna på den fysiska enheten via en skalär, DPI: n. DPI står för punkter per tum, där en punkt representerar en fysisk enhetspixel. (Nomenklaturen kommer från utskrift, där punkter är den minsta pennanteckningspunkt som en utskriftsprocess kan producera). Eftersom en standardövervakare brukade ha 96 punkter per tum innebar en DPI på 96 att en enhetsoberoende pixel (eller DIP) mappades 1:1 med en fysisk pixel. Om DPI till exempel var 96*2 = 192 skulle ett enda DIP omfatta två fysiska bildpunkter.
Det finns många orsaker till att program inte nödvändigtvis hanterar den här skalningen korrekt. En av de enklaste orsakerna är att det krävs extra arbete för att identifiera och använda det här skalära värdet vid återgivning. I Direct2D tillämpas skalningen som standard. På grund av den här mappningen kan fysiska enhetspixlar hamna vid bråkade DIP-koordinater, vilket är en av anledningarna till att Direct2D använder ett flyttalskoordinatutrymme.
- fysisk pixel = (dip × DPI) / 96
Om du vill konvertera en fysisk pixel till ett DIP använder du den här formeln:
- dip = (fysisk pixel × 96) /DPI
Not
Från och med Windows 8 kan du växla enhetsläget till bildpunkter i stället för DIP:er med hjälp av metoden ID2D1DeviceContext::SetUnitMode.
Relaterade ämnen