如何確保應用程式在高 DPI 顯示器上正確顯示
雖然DirectWrite為您解決許多高 DPI 問題,但您應該採取兩個步驟,以確保您的應用程式可在高 DPI 顯示器上正常運作。
步驟 1:建立視窗之後,使用視窗本身的 DPI
Direct2D
GetDpiForWindow函式會擷取指定視窗的每英吋點數 (DPI) 值。 若要使用該值來設定視窗的寬度,請使用下列公式:
< Dpi>* <寬度,以圖元 > 為單位/ <預設 DPI>
...其中 DPI 是 GetDpiForWindow所重試的值, 而預設 DPI 為 96。 公式與垂直軸類似:
< Dpi>* <高度,以圖元 > 為單位/ <預設垂直 DPI>
建立簡單 Direct2D 應用程式的步驟 2.3 中的程式碼範例會擷取視窗的 DPI,然後將其大小設定為 640 × 480,縮放為 DPI。
注意
針對通用 Windows 平臺 (UWP) app,您可以使用DisplayInformation::LogicalDpi屬性。
GDI
GDI 提供 GetDeviceCaps 函式來擷取裝置資訊。 您可以傳遞 LOGPIXELSX 和 LOGPIXELSY 索引值來擷取 DPI 資訊。 判斷視窗水準和垂直大小的公式與上述 Direct2D 範例相同。
下列程式碼會使用 GetDeviceCaps 函式來建立縮放至系統 DPI 的 640 x 480 視窗。
FLOAT dpiX, dpiY;
HDC screen = GetDC(0);
dpiX = static_cast<FLOAT>(GetDeviceCaps(screen, LOGPIXELSX));
dpiY = static_cast<FLOAT>(GetDeviceCaps(screen, LOGPIXELSY));
ReleaseDC(0, screen);
hWnd = CreateWindow(
TEXT("DirectWriteApp"),
TEXT("DirectWrite Demo App"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
static_cast<INT>(dpiX * 640.f / 96.f),
static_cast<INT>(dpiY * 480.f / 96.f),
NULL,
NULL,
hInstance,
NULL);
步驟 2:宣告應用程式為 DPI 感知
當應用程式將本身宣告為 DPI 感知時,它是一個語句,指定應用程式在 DPI 設定上運作良好,最高為 200 DPI。 在 Windows Vista 和 Windows 7 中,啟用 DPI 虛擬化時,會調整非 DPI 感知的應用程式,以及應用程式從系統 API 接收虛擬化資料,例如 GetSystemMetric 函式。 若要宣告您的應用程式為 DPI 感知,請完成下列步驟。
建立名為 DeclareDPIAware.manifest 的檔案。
將下列 xml 複製到檔案中,並加以儲存:
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3" > <asmv3:application> <asmv3:windowsSettings xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings"> <dpiAware>true</dpiAware> </asmv3:windowsSettings> </asmv3:application> </assembly>
在專案的 .vcproj 檔案中,于 VisualStudioProject/Configurations 下的每個 Configuration 元素內新增下列專案:
<Tool Name="VCManifestTool" AdditionalManifestFiles="DeclareDPIAware.manifest"/>