在 Windows XP 时代,DPI 调大之后,获取得到的尺寸和坐标都是像素点。Window 7 开始(Windows Vista 未知),微软对不同 DPI 显示的效果进行了调整。虽然我没有在 Windows 7 上尝试你说的那种情况,但是我大概可以猜得到原因。Windows XP 的 120DPI(125%) 下文字都放大了,同样的 Windows 7 上默认也是这么处理的。但 144DPI(150%) 时,Windows 7 的处理方式差不多相当与把 96DPI(100%) 的画面放大到 150% 的比例来显示,即变模糊了,但在高分辨率显示器上不会觉得模糊。在 Windows 7 调整 DPI 的界面上,有一个“设置自定义文本大小”,其中有个复选框是“使用 Windows XP 风格 DPI 缩放比例”。如果你去掉它,那么 120DPI(125%) 下 Windows 7 仍然会像 144DPI(150%) 一样的缩放方式把 96DPI(100%) 的画面放大到 125% 的比例来显示,也是模糊的。我估计,可能当这个“使用 Windows XP 风格 DPI 缩放比例”选项选种时,获取得到的像素是对的,但也只限于 120DPI(125%),144DPI(150%) 始终不对。如果去掉这个选项,则任何系统上得到的都不对。从 Vista 开始,系统提供了一个 LogicalToPhysicalPoint 和 PhysicalToLogicalPoint 两个 API,可能就是用于将不同 DPI 下获取得到的 POINT 或者 RECT 转换为显示器的实际分辨率,我也只是猜测,并未尝试。
更正:如果去掉这个选项,则设置 DPI 为大于 96DPI 之外的任何值得到的都不对。
经测试 Windows 7 下的 125%:不管是否选择“使用 Windows XP 风格 DPI 缩放比例”,120DPI(125%) 下 Windows 7 始终跟 XP 一样把文字放大,而非直接缩放 96DPI(100%) 到 125% 的比例来显示,不会模糊。144DPI(150%) 的会模糊。
DPI 就是“控制面板”-“显示”-“设置自定义文本大小(DPI)”谢谢关注
如果dpi调到150 对话框大小 大于屏幕大小的话,会不会对这个位置造成误差?我自己猜测至于dpi可以用GetDeviceCaps(hdc, LOGPIXELSY); 函数获取我以前做的是根据dpi不同调整控件大小位置,可以用上面的函数来获取 dpi 按照比例来调整
客户区是不是GetClientRec()?
上面只是一个测试代码,我的目的是,用来测试为什么 GetWindowRect得到的窗口位置,在大 DPI 下得到的不是屏幕分辨率
按我的理解,我一个不大的窗口(无论如何都没有超过屏幕了),Centerwindow后,取得的窗口中心点,一定是屏幕分辨率的中心点吧
不知道这次有没有说清楚。另,楼上同学,您是自己写了代码来测试了么?Messagebox弹出的位置是多少?难道在您的电脑上,弹出的位置是屏幕分辨率的中心点啊?
Windows 7,屏幕分辨率:1366*768
100%,GetWindowRect()得到的是195,573,400,966,屏幕中心点是683,384
125%,GetWindowRect()得到的是143,626,360,1006,屏幕中心点是683,384
150%,GetWindowRect()得到的是90,679,280,1086,屏幕中心点是683,384
但200%,GetWindowRect()得到的是0,774,160,12066,屏幕中心点是683,387(对话框在屏幕高度范围内不能显示完全)
最近我也遇到类似的问题:我想让GetWindowRect()的这个窗口在不同的DPI下都能相同大小,但不知道该怎么办呢。
http://bbs.csdn.net/topics/390677051
HOOK GetDeviceCaps 强制返回 96DPI
目前解决了我的问题,期待更好的方法
但是XP遇到了问题 但我们对XP要求很低 就没去管它
IsProcessDPIAware
SetProcessDPIAware
不过一旦你用了这个API,则系统就不会缩放了,你就得自己保证DPI改变时,你的布局进行调整。最好的办法是使用Twips或Point为单位布局。
参看这个http://msdn.microsoft.com/en-us/library/windows/desktop/dd464646(v=vs.85).aspx