10

OwnerDrawn UserControl がユーザーの dpi (96/120/xxx) やフォント サイズ (通常、大、特大) を尊重するようにするにはどうすればよいですか?

Graphics オブジェクトで DpiX および DpiY プロパティを使用することを提案する人もいますが、それは私の制御では何もないようです (つまり、選択したフォントサイズまたは dpi に関係なく、常に 96 に設定されています)。

AutoScale プロパティを使用することを提案する StackOverflow に関する別の同様の質問がありますが、提案されたソリューションも実際には何もしません。

WPF に頼る以外に .NET でこれを行う方法はありませんか?

4

2 に答える 2

11

UserControl の AutoScaleMode プロパティを AutoScaleMode.Dpi に設定する必要があり、AutoScale プロパティを true に設定しないでください。これを行うと、AutoScaleMode がリセットされて None に戻ります。AutoScale プロパティは廃止され、下位互換性のためにのみ存在します (このMSDN 記事の重要な注意事項を参照してください)。

また、Windows Vista/7 では、アプリケーションが DPI 対応であることを明示的に指定しない限り、アプリケーションが 96 DPI でレンダリングされるように、Windows はデフォルトの DPI 環境をエミュレートし、結果のビットマップを適切なサイズにスケーリングします。これを回避するには、アプリケーション マニフェストを変更して、実際に DPI 対応であることを Windows に通知します。この記事の「マニフェストを使用して DPI 対応を宣言する」セクションを参照してください

于 2009-08-19T12:40:45.850 に答える
3

私は同じ問題を抱えています.GetDC + GetDeviceCaps + ReleaseDCを使用してみましたが、少なくともVista32ではグラフィックスを使用していました. 私はまだ DPI の経験がありませんが、誰もこれに答えておらず、少なくともこれは他の人にとって役立つかもしれません.

DPI 対応アプリケーションの作成 を参照してください。これは、実際の DPI 設定に関係なく、常に 96 を返す理由について言及しています。

上記リンクより引用:

Win32 アプリケーションでの DPI スケーリング

Win32 アプリケーションでは、次の操作を行います。

  • SetProcessDPIAware 関数を使用して、dpi スケーリングをキャンセルします。
  • 描画されたインターフェイス要素のサイズを変更するときは、センチメートルなどの物理的な測定値を使用してください。ピクセルではなく物理的な寸法を使用することで、すべてのタイプのディスプレイで一貫したサイズを確保できます。
  • システムの dpi 設定を取得するには、CDC::GetDeviceCaps 関数を LOGPIXELSX フラグと共に使用します。dpi スケーリングをキャンセルしない場合、この呼び出しはデフォルト値の 96 dpi を返します。
  • GetSystemMetrics 関数を使用して、ウィンドウの境界線などのユーザー インターフェイス要素の適切なサイズを取得します。dpi スケーリングが無効になっている場合、インターフェイス要素に対して返される測定値は、選択した dpi 設定にスケーリングされます。dpi スケーリングがアクティブな場合、関数は、システムの dpi 設定に関係なく、96 dpi に基づいて測定値を返します。

回答元: DPI の問題について

using -statementで書き直したサンプル コード(元のソース):

float dpiX = 96, dpiY = 96;
using(Graphics graphics = this.CreateGraphics())
{
    dpiX = graphics.DpiX;
    dpiY = graphics.DpiY;
}
于 2009-08-04T08:06:23.770 に答える