質問

C#を使用してWPFでマップコントロールを開発しています。キャンバスコントロールを使用しています。 400 x200。たとえば、 2,000m x 1,000m。

マップの縮尺は、 canvas_size_in_meters / real_size_in_meters です。

canvas_size_in_metersを見つけたい。

canvas.ActualWidthは、DIU(デバイス独立単位)の幅を示します。つまり、400 DIUは400/96 = 4,17インチであり、物理的解像度は提供で、モニターの解像度は96 dpiです。

ただし、定規を使用して、モニターの物理解像度が87 dpiであることがわかりました。 (実際に96物理dpiを持つモニターはほとんどありません)

そのDPIの差(10%)は、画面上の実際のマップコントロール幅の+ 10%の差に変換されます。

画面解像度とDPI設定に関係なく、WPFコントロールのサイズをインチ単位で正確に測定するにはどうすればよいですか?

役に立ちましたか?

解決

  

画面解像度とDPI設定に関係なく、WPFコントロールのサイズをインチ単位で正確に測定するにはどうすればよいですか?

これは実際には不可能です。WPFが機能するには、モニターの解像度(DPIの観点から)を知る必要があるためです。理論上はいいように聞こえますが、実際には、ウィンドウはこの情報を知りません。これが、Windows自体が賢くするのではなく、盲目的に常に96dpiを想定している理由です。

手動で通知する方法があった場合、または特定のモニターに正しい情報をWindowsに渡すカスタムドライバーがある場合でも、これは他のコンピューターでは機能しないため、Windowsはパスしませんこの情報をすべてのアプリケーションに。

できることは、Googleマップのように縮尺を描くことです。 1 pixel == 1マイルであることを知っているので、「この線は50マイルに等しい」というラベルを付けて、マップ上に50ピクセルの線を描くことができます

他のヒント

現在のピクセルサイズをmmまたはインチで計算する方法があります。以前の投稿で述べたように、これは固定値ではなく、現在の解像度とモニターサイズによって異なります。

まず現在の解像度を取得します。 1280x1024と仮定します GetDeviceCaps関数を使用して、mm単位のモニター幅を取得します。標準のWindowsライブラリ関数。

int widthmm = GetDeviceCaps(deviceContext、HORZSIZE); モニターの幅は362mmです

ピクセルサイズ= 362/1280 = 0.282 mm

この方法の精度は、表示領域がモニターの幅を正確にカバーするという前提に依存します。

つまり、元の質問に答えるには、キャンバスサイズ400 x 200ピクセルは (400 * 0.282 / 1000)x(200 * 0.282 / 1000)(モニターに表示される場合はメートル)

ご返信いただきありがとうございます。

完全に同意しますが、そもそもそれを信じたくありませんでした。マップを使用してマップデータの異なるレイヤーを表示する場合(スケールに依存)、マップのスケールの概算計算が必要です。 ほとんどのアプリケーションでは、スライダーコントロールを使用しています。 「スケール」を設定する10個の個別のマップレベル。

絶対的なスケールを持つことはアプリケーションにとって重要ではありません。1:15,000のような指標スケールを表示するのは良いことです。

絶対スケールでは追加の変数 monitorPhysicalDPI が必要です(最初は96に設定されています)。マップコントロールのサイズは次のとおりです。

map.ActualWidth *(96 / monitorPhysicalDPI)* inchPerDIU、 inchesPerDIUは1/96

これも化粧品です。WindowsがACTUALコントロールの寸法を知っていたらいいと思いませんか。 (ユーザーは、OSセットアップの画面サイズに関する情報を提供するか、単にモニターINFファイルをインストールする必要があります)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top