如何让一个窗口的大小能够在不同的分辨率下都能够维持肉眼看上去的同一大小

2019-10-16 09:14:19 +08:00
 NGPONG

比如说我恒定的设置一个应用的窗口大小为 800 * 800,在分辨率小的情况下我会看到这个应用占用屏幕比例很多,但是一换到高分辨率的情况下这个窗口的大小就会缩小了,我的目的是不管在什么分辨率的情况下,这个窗口的大小就直观来说还是一样的大小不变的,我的理解应该是这个窗口的 长 * 某个半分比 宽 * 某个百分比 来根据不同的分辨率来改变窗口的长和宽以来达到效果,但是我却不知道该如何计算这个 百分比

上张图吧,大家或许能够更好地理解一点

ht 占 tp 位 s://i.loli.net/2019/10/16/CQc5zS8Fk7HZprL.png

7083 次点击
所在节点    程序员
52 条回复
learnshare
2019-10-16 12:03:18 +08:00
@NGPONG 我实测下来是不行的,写了很多年也没用过这种单位
10cm 宽的矩形,在两个分辨率相同但点距不同的设备上,分别显示为 8.8cm 和 8.2cm
NGPONG
2019-10-16 13:37:13 +08:00
@Junn 非常的清晰,感谢!
DejaVud
2019-10-16 14:34:52 +08:00
windows 桌面开发有相关指南,叫 DPI Awareness
https://docs.microsoft.com/en-us/windows/win32/hidpi/high-dpi-desktop-application-development-on-windows
你可以参考一下

DPI Unaware
DPI unaware applications render at a fixed DPI value of 96 (100%). Whenever these applications are run on a screen with a display scale greater than 96 DPI, Windows will stretch the application bitmap to the expected physical size. This results in the application appearing blurry.
所以在高分辨率下,很多不支持 DPI Awareness 的旧桌面程序打开,使用的仍是小尺寸的位图,结果就被系统强行拉伸,造成模糊(blurry).
要支持 DPI Awareness 就要给程序不同尺寸的位图,来适配不同大小的分辨率.REF 里列出了需要用到的 API.
NGPONG
2019-10-16 19:47:15 +08:00
@DejaVud 谢谢提供的意见,也是非常具有参考和突破性的 XD
NGPONG
2019-10-16 22:30:50 +08:00
@Junn

```csharp
int SH = Screen.PrimaryScreen.Bounds.Height;
int SW = Screen.PrimaryScreen.Bounds.Width;
```
NGPONG
2019-10-16 22:35:03 +08:00
@Junn

我按照你的方法来计算的话,实际拿尺子出来测量还是偏差 0.5cm
下面是我的代码(计算点距的公式是从在线 ppi 计算中拷出来的)

```csharp
int width = Screen.PrimaryScreen.Bounds.Height;
int height = Screen.PrimaryScreen.Bounds.Width;

double ratio = height / width;
double widthD = Math.Sqrt(Math.Pow(diag, 2) / (1 + Math.Pow(ratio, 2)));
double dotPitch = 25.4 / (width / widthD);

double dopi = Math.Round(dotPitch * 10000) / 10000;
double metricDiag = diag * 2.54;
```
NGPONG
2019-10-16 22:48:16 +08:00
@learnshare 感谢测量,我计算出来的结果如 46 楼,相差了 0.5cm 跟你是一个差值,我考虑的是难不成所有显示器就是这个差值了吗,明天回公司多拿几台显示器试下
Junn
2019-10-17 00:07:15 +08:00
@NGPONG #46 看代码没啥问题啊,实际计算时,屏幕尺寸有量过么?会不会是显示器标称的尺寸与实际尺寸的误差所致?
NGPONG
2019-10-17 08:21:22 +08:00
@Junn 是,昨晚还没把这个问题考虑到,回公司找找尺子去
ragnaroks
2019-10-17 08:45:43 +08:00
误差猜测是因为屏幕虚标...比如 23.8"的说自己是 24"
silencefent
2019-10-17 09:12:46 +08:00
做不到,极端条件:VR 上的显示屏,能做到 1 寸 4K 分辨率,这时候分辨率作为参照系就没有意义了
dosmlp
2019-10-17 16:03:21 +08:00
可以获取系统 dpi 然后根据不同的情况做适配

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/609755

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX