12

我正在使用 C# 在 WPF 中开发地图控件。我正在使用一个画布控件,例如 400 x 200,它被分配了一个例如 2,000mx 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 控件的大小(以英寸为单位)?

4

3 回答 3

9

无论屏幕分辨率和 DPI 设置如何,如何准确测量 WPF 控件的大小(以英寸为单位)?

这实际上是不可能的,因为要使其工作,WPF 必须知道显示器的分辨率(以 DPI 为单位)。理论上听起来不错,但实际上 windows 不知道这些信息。这就是为什么 windows 本身总是盲目地假设 96dpi 而不是更聪明的原因。

即使有一些方法可以手动告诉它,或者如果您的特定显示器有一个自定义驱动程序可以将正确的信息传递给 Windows,这在其他任何人的计算机上都不起作用,因此 Windows 不会传递这些信息到任何应用程序。

你能做的最好的就是像谷歌地图那样画一个比例尺。你知道 1像素== 1 英里,所以你可以在地图上画一条 50 像素的线,标签上写着“这条线等于 50 英里”

于 2008-11-19T00:48:06.400 回答
2

有办法以毫米或英寸为单位计算当前像素大小。如前文所述,它不是一个固定值,会根据当前分辨率和显示器尺寸而有所不同。

首先获取当前分辨率。假设它是 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) * 英寸PerDIU, 英寸PerDIU 为1/96

这些都是化妆品。如果 Windows 知道 ACTUAL 控件的尺寸不是很好吗?(用户必须在操作系统设置中提供有关屏幕尺寸的信息,或者只是安装监视器 INF 文件)

于 2008-11-19T13:29:45.927 回答