本帖最后由 VisualEleven 于 2013-12-27 13:48:24 编辑

解决方案 »

  1.   

    补充,我是 win7,
    DPI 就是“控制面板”-“显示”-“设置自定义文本大小(DPI)”谢谢关注
      

  2.   

    调整dpi的话对话框大小也会跟着变化。
    如果dpi调到150 对话框大小 大于屏幕大小的话,会不会对这个位置造成误差?我自己猜测至于dpi可以用GetDeviceCaps(hdc, LOGPIXELSY); 函数获取我以前做的是根据dpi不同调整控件大小位置,可以用上面的函数来获取 dpi 按照比例来调整
      

  3.   

    对话框 center属性是 true 试试
      

  4.   

    那getdevicecap获取长宽,然后对比下看缩放了多少
      

  5.   

    DPI一更改相当于你的窗口发生了缩放,1280*800的窗口(怀疑你这个值呢,全满屏?)只显示了一部分。看起来还是那么大,但实际上只显示了一部分(我没试,估计是)。
    客户区是不是GetClientRec()?
      

  6.   

    通过测试MessageBox显示位置,用默认的方式还是同一个位置 ,一直居中的!看屏幕分辨率还是原来的值。
      

  7.   

    谢谢各位关注。我的目的,并不是要居中窗口显示(事实上,在大 DPI 下,CenterWindow肯定可以居中窗口显示的)
    上面只是一个测试代码,我的目的是,用来测试为什么 GetWindowRect得到的窗口位置,在大 DPI 下得到的不是屏幕分辨率
    按我的理解,我一个不大的窗口(无论如何都没有超过屏幕了),Centerwindow后,取得的窗口中心点,一定是屏幕分辨率的中心点吧
    不知道这次有没有说清楚。另,楼上同学,您是自己写了代码来测试了么?Messagebox弹出的位置是多少?难道在您的电脑上,弹出的位置是屏幕分辨率的中心点啊?
      

  8.   

    GetWindowRect在不同的DPI设置下,得到的位置是不同的,但是屏幕中心点的位置是相同的(任务栏隐藏的情况)
    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下都能相同大小,但不知道该怎么办呢。
      

  9.   

    纠正:但200%,GetWindowRect()得到的是0,774,160,1206,屏幕中心点是683,387(对话框在屏幕高度范围内不能显示完全)
      

  10.   

    在 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 转换为显示器的实际分辨率,我也只是猜测,并未尝试。
      

  11.   

    更正:如果去掉这个选项,则设置 DPI 为大于 96DPI 之外的任何值得到的都不对。
      

  12.   

    经测试 Windows 7 下的 125%:不管是否选择“使用 Windows XP 风格 DPI 缩放比例”,120DPI(125%) 下 Windows 7 始终跟 XP 一样把文字放大,而非直接缩放 96DPI(100%) 到 125% 的比例来显示,不会模糊。144DPI(150%) 的会模糊。
      

  13.   

    不知道楼主的界面要求高不高,如果不高可以用我这个土方
    http://bbs.csdn.net/topics/390677051
    HOOK GetDeviceCaps 强制返回 96DPI
    目前解决了我的问题,期待更好的方法
      

  14.   

    我弄的那个程序 也遇到过界面错乱的问题 算出DPI比例 然后都调整 win7 win8 解决了问题
    但是XP遇到了问题 但我们对XP要求很低 就没去管它
      

  15.   

    纠正我的一个错误。使用 XP 风格的缩放使得文字、窗口均变大,但获取的像素数是正确的。而如果去掉此选项,则所有的缩放均使用模糊的效果,即获取到的像素数可能是错误的。比如 144DPI 下获取到的屏幕像素可能是原来的三分之二。未证实。
      

  16.   

    试一下这两个API
    IsProcessDPIAware
    SetProcessDPIAware
      

  17.   

    这个才是正确的。如果你的程序没有设置DPIAware,那么Win7就会以为你根本没有考虑按照Win7的DPI规范设置,那么界面就有可能是按像素布局的,为了保证放大的文字能完整显示,系统会强制使用96的虚拟DPI,并对你的窗口进行缩放。
    不过一旦你用了这个API,则系统就不会缩放了,你就得自己保证DPI改变时,你的布局进行调整。最好的办法是使用Twips或Point为单位布局。
    参看这个http://msdn.microsoft.com/en-us/library/windows/desktop/dd464646(v=vs.85).aspx