雖然 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)應用程式,您可以使用 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 感知能力時,這表示該應用程式在最高 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"/>