アプリケーションが高 DPI ディスプレイに正しく表示されるようにする方法
DirectWriteは多くの高 DPI の問題に対処しますが、アプリケーションが高 DPI ディスプレイで正しく動作するようにするには、2 つの手順を実行する必要があります。
手順 1: 作成後にウィンドウの独自の DPI を使用する
これを行うには、 Direct2D を使用するか、 GDI を使用します。
Direct2D
GetDpiForWindow 関数は、指定されたウィンドウのドット/インチ (dpi) の値を取得します。 この値を使用してウィンドウの幅を設定するには、次の式を使用します。
< Dpi>* <幅(ピクセル単位>/<既定の DPI)>
...ここで 、DPI は GetDpiForWindow によって再表示される値で、 既定の DPI は 96 です。 数式は縦軸に似ています。
< Dpi>* <高さ(ピクセル単位>/<既定の垂直 DPI)>
「 単純な Direct2D アプリケーションを作成 する」の手順 2.3 のコード例では、ウィンドウの DPI を取得し、そのサイズを DPI にスケーリングして 640 × 480 に設定します。
Note
ユニバーサル Windows プラットフォーム (UWP) アプリの場合は、DisplayInformation::LogicalDpi プロパティを使用できます。
GDI
GDI には、デバイス情報を取得するための GetDeviceCaps 関数が用意されています。 DPI 情報を取得するには、 LOGPIXELSX インデックス値と LOGPIXELSY インデックス値を渡します。 ウィンドウの水平方向と垂直方向のサイズを決定するための数式は、上記の 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 の DPI 設定で適切に動作することを指定するステートメントです。 Windows Vista および Windows 7 では、DPI 仮想化が有効になっている場合、DPI 対応ではないアプリケーションがスケーリングされ、アプリケーションは GetSystemMetric 関数などのシステム API から仮想化データを受け取ります。 アプリケーションが 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"/>