次の方法で共有


Direct2D と High-DPI

DPI 対応アプリケーションの記述は、さまざまな高 DPI 表示設定でユーザー インターフェイス (UI) を一貫して適切に表示するための鍵です。 DPI 対応ではないが、高 DPI 表示設定で実行されているアプリケーションは、UI 要素の不適切なスケーリング、クリップされたテキスト、ぼやけた画像など、多くの視覚的なアーティファクトに苦しむ可能性があります。 DPI 対応のサポートをアプリケーションに追加することで、アプリケーションの UI の表示を予測しやすくし、ユーザーにとって視覚的に魅力的で読みやすくします。 さいわい、Direct2D を使用すると、高 DPI で適切に動作するアプリケーションをこれまで以上に簡単に作成できます。 このトピックには、次のセクションが含まれています。

Direct2D での High-DPI サポート

Direct2D には、高 DPI シナリオを操作するための次の機能が用意されています。

  • アプリケーション マニフェストが DPI を正しく処理することを示す限り、ウィンドウ表示のレンダー ターゲットを作成するときにシステム DPI が自動的に適用されます。 (アプリケーションが DPI 対応であることを宣言する方法については、「アプリケーションが High-DPI Displaysに正しく表示されるようにする方法」を参照してください)。
  • DIP (デバイスに依存しないピクセル) で座標を表します。これにより、DPI 設定が変更されたときにアプリケーションを自動的にスケーリングできます。
  • これにより、ビットマップに DPI を設定し、DPI を考慮して正しくスケーリングできます。 この機能は、さまざまな解像度でアイコンを維持するためにも使用できます。
  • ほとんどのリソースが DIP で表されるため、リソースは解決から自動的に独立します。
  • 浮動小数点座標空間とアンチエイリアシングを使用するため、任意の DPI に任意のコンテンツをスケーリングできます。

Direct2D グラフィックス パイプラインは、96 DPI から 1200DPI にスケーリングするように設計されています。

Windows 8 と High-DPI

Windows 8 以降では、高 DPI サポート用の追加機能があります。

デバイス コンテキストの DPI が十分に高い場合、Direct2D はテキストの垂直方向のアンチエイリアシングを有効にするために使用するしきい値を変更します。 これにより、高 DPI ディスプレイでのテキストレンダリングが高速になります。 さらに、ID2D1DeviceContext::SetUnitMode メソッドを使用して、DIP の代わりにユニット モードをピクセルに切り替えることができます。 単位モードをピクセルに設定し、デバイス コンテキスト DPI を画面 DPI に設定した場合、最適化は引き続き有効になります。

DIP とは

デバイスに依存しないピクセル (DIP) は、スカラー DPI を介して物理デバイスのピクセルにマップされる論理ピクセルです。 DPI は 1 インチあたりのドットを表し、ドットは物理デバイス ピクセルを表します。 (命名法は印刷から来ています。ドットは、印刷プロセスが生成できる最小のインクドットです)。 標準モニターには 1 インチあたり 96 ドットが使用されているため、DPI が 96 の場合、デバイスに依存しないピクセル (または DIP) が物理ピクセルで 1:1 にマップされます。 たとえば、DPI が 96*2 = 192 の場合、1 つの DIP で 2 つの物理ピクセルが含まれます。

アプリケーションが必ずしもこのスケーリングを正しく処理しない理由は多数あります。最も簡単な理由の 1 つは、レンダリング時にこのスカラー値を検出して使用するために余分な作業が必要であるということです。 Direct2D では、スケーリングは既定で適用されます。 このマッピングにより、物理デバイスのピクセルが最終的に小数の DIP 座標になる可能性があります。これは、Direct2D が浮動小数点座標空間を使用する理由の 1 つです。

物理ピクセル = (dip × DPI) / 96

物理ピクセルを DIP に変換するには、次の数式を使用します。

dip = (物理ピクセル × 96) / DPI

手記

Windows 8 以降では、ID2D1DeviceContext::SetUnitMode メソッドを使用して、DIP の代わりにユニット モードをピクセルに切り替えることができます。

 

アプリケーションが High-DPI 表示 に正しく表示されるようにする方法