共用方式為


如何確保應用程式在高 DPI 顯示器上正確顯示

雖然DirectWrite為您解決許多高 DPI 問題,但您應該採取兩個步驟,以確保您的應用程式可在高 DPI 顯示器上正常運作。

步驟 1:建立視窗之後,使用視窗本身的 DPI

這可以使用 Direct2D 或使用 GDI來完成。

Direct2D

GetDpiForWindow函式會擷取指定視窗的每英吋點數 (DPI) 值。 若要使用該值來設定視窗的寬度,請使用下列公式:

< Dpi>* <寬度,以圖元 > 為單位/ <預設 DPI>

...其中 DPIGetDpiForWindow所重試的值, 而預設 DPI 為 96。 公式與垂直軸類似:

< Dpi>* <高度,以圖元 > 為單位/ <預設垂直 DPI>

建立簡單 Direct2D 應用程式的步驟 2.3 中的程式碼範例會擷取視窗的 DPI,然後將其大小設定為 640 × 480,縮放為 DPI。

注意

針對通用 Windows 平臺 (UWP) app,您可以使用DisplayInformation::LogicalDpi屬性。

GDI

GDI 提供 GetDeviceCaps 函式來擷取裝置資訊。 您可以傳遞 LOGPIXELSXLOGPIXELSY 索引值來擷取 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 感知,請完成下列步驟。

  1. 建立名為 DeclareDPIAware.manifest 的檔案。

  2. 將下列 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>
    
  3. 在專案的 .vcproj 檔案中,于 VisualStudioProject/Configurations 下的每個 Configuration 元素內新增下列專案:

    <Tool
        Name="VCManifestTool"
        AdditionalManifestFiles="DeclareDPIAware.manifest"/>