12

C# を使用して WPF でマップ コントロールを開発しています。たとえば、2,000mx 1,000m のマップ領域が割り当てられた 400 x 200 などのキャンバス コントロールを使用しています。

マップの縮尺は 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 コントロールのサイズをインチ単位で正確に測定するにはどうすればよいですか?

4

3 に答える 3

9

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

これが機能するためには、WPF がモニターの解像度 (DPI に関して) を知る必要があるため、これは実際には不可能です。理論的には良さそうですが、実際にはウィンドウはこの情報を知りません。これが、Windows 自体が常に 96dpi を賢くするのではなく、やみくもに想定している理由です。

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

あなたができる最善のことは、Googleマップのように縮尺を描くことです. 1ピクセル== 1 マイルであることがわかっているので、地図上に 50 ピクセルの線を引くことができ、「この線は 50 マイルに等しい」というラベルが付けられます。

于 2008-11-19T00:48:06.400 に答える
2

現在のピクセル サイズを 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) メートルになります。

于 2008-12-16T15:03:39.520 に答える
0

迅速な返信ありがとうございます。

私は完全に同意しますが、そもそもそれを信じたくありませんでした。ご覧のとおり、マップを使用してマップデータのさまざまなレイヤーを表示する場合は、マップの縮尺を概算する必要があります(縮尺によって異なります)。ほとんどのアプリケーションは、「スケール」を設定するために、たとえば10個の個別のマップレベルを持つスライダーコントロールを使用します。

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

絶対尺度では、追加の変数monitorPhysicalDPI(最初は96に設定)が必要になります。これは、用途を変更することを選択した場合、わずかに優れた尺度になります(これも重要ではありません)。マップコントロールのサイズは次のようになります。

map.ActualWidth *(96 / monitorPhysicalDPI)* inchPerDIU、 inchsPerDIUは1/96です

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

于 2008-11-19T13:29:45.927 に答える