Direct2D と高 DPI
DPI 対応アプリケーションの作成は、さまざまな高 DPI ディスプレイ設定でユーザー インターフェイス (UI) を一貫して適切に表示するための鍵です。 DPI 対応ではないが高 DPI ディスプレイ設定で実行されているアプリケーションは、UI 要素の不適切なスケーリング、クリップされたテキスト、ぼやけた画像など、多くの視覚的な成果物に悩まされる可能性があります。 DPI 対応のサポートをアプリケーションに追加することで、アプリケーションの UI の表示をより予測しやすくし、ユーザーにとって視覚的に魅力的で読みやすくします。 幸いなことに、Direct2D を使用すると、高 DPI で適切に動作するアプリケーションをこれまで以上に簡単に作成できます。 このトピックは、次のセクションで構成されています。
Direct2D での高 DPI サポート
Direct2D には、高 DPI シナリオを操作するための次の機能が用意されています。
- アプリケーション マニフェストで DPI が正しく処理されることをアプリケーション マニフェストが示している限り、ウィンドウ表示のレンダー ターゲットを作成するときに、システム DPI が自動的に優先されます。 (アプリケーションが DPI 対応であることを宣言する方法については、「 高 DPI ディスプレイでアプリケーションが正しく表示されるようにする方法」を参照してください)。
- DIP (デバイスに依存しないピクセル) で座標を表します。これにより、DPI 設定が変更されたときにアプリケーションを自動的にスケーリングできます。
- これにより、ビットマップに DPI を設定し、DPI を考慮して正しくスケーリングできます。 この機能は、さまざまな解像度でアイコンを維持するためにも使用できます。
- これは、DIP 内のほとんどのリソースを表します。これにより、リソースは自動的に解決から独立します。
- 浮動小数点座標空間とアンチエイリアシングを使用するため、任意の DPI に任意のコンテンツをスケーリングできます。
Direct2D グラフィックス パイプラインは、96 DPI から 1200DPI にスケーリングするように設計されています。
Windows 8と高 DPI
Windows 8以降、高 DPI サポート用の追加機能があります。
デバイス コンテキスト DPI が十分に高い場合、Direct2D はテキストの垂直方向のアンチエイリアシングを有効にするために使用するしきい値を変更します。 これにより、高 DPI ディスプレイでのテキスト レンダリングが高速になります。 さらに、 ID2D1DeviceContext::SetUnitMode メソッドを使用して、DIP ではなくユニット モードをピクセルに切り替えることができます。 ユニット モードをピクセルに設定し、デバイス コンテキスト DPI を画面 DPI に設定した場合でも、最適化は有効になります。
DIP とは
デバイスに依存しないピクセル (DIP) は、スカラー DPI を介して物理デバイスのピクセルにマップされる論理ピクセルです。 DPI は dots per inch の略であり、ドットは物理デバイス ピクセルを表します (名前は印刷に由来しており、ドットは、印刷プロセスで生成できる最小のインク ドットです)。 標準モニターは 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
Note
Windows 8 以降では、ID2D1DeviceContext::SetUnitMode メソッドを使用して、DIP ではなくユニット モードをピクセルに切り替えることができます。
関連トピック