windows 10个屏幕坐标偏移7
windows 10 screen coordinates are offset by 7
我在 windows 10 - 直接 win32 API.
上用 C++ 编码
我想在屏幕右上角显示一个 window。
当我这样做时,我注意到最大化 window 的屏幕坐标是 left=-8, top=-8, right=1936, bottom=1088.
此外,当我将 window 定位为 right=1920 和 top=0 时,右侧大约有 8 像素的间隙。我试着移动 window 来查看我得到的屏幕坐标。
rect.left 对于非最大化 window 可以从 -7 到 1912。
所以东西滑动了 7 个像素? WTF 微软 ??
我该如何想出 rec.right=1913 值来使我的 window 与屏幕右侧对齐而没有该死的间隙?
但 1920 年的 rect.right 留下了空白。所以 1912 年的 rect.right 会留下更多的空白...
我需要一个可以返回到 Vista 的解决方案。
在 win10 之前,rect.right 应该像你期望的那样是 1920。
这是怎么回事?我要开始乱扔刀子了!!
代码明智,这正是 GetWindowRect 报告的内容...
(请原谅我奇怪的调试功能)
::GetWindowRect (_wndo, r);
DBG("ExtRc l=`d r=`d t=`d b=`d w=`d h=`d",
r->left, r->right, r->top, r->bottom, r->right-r->left, r->bottom-r->top);
这是因为 window 边框的宽度和其他因素,这取决于 OS 版本、用户偏好和 DPI 设置。请参阅 GetSystemMetrics 函数。
感谢@ChristopherOicles
这真的是他的回答。将其复制为您自己的(或对其进行任何调整),我会接受您的。
微软正在破坏 windows 10 中的边框宽度。
GetWindowRect returns 外部window 坐标作为屏幕坐标。
GetClientRect returns里面的window坐标。
直到 Windows 10 (F U Win10 !!),
它们之间的宽度和高度的差异是边框的宽度和高度。
在 win10 上,边框宽度报告为 16 像素,因此边为 8 像素。
但是,这些像素中只有 1 个是可见的。其中7个是透明的。
所以你的 window 在左边、右边和底部有 7 个透明像素。
因此,如果您要以编程方式在屏幕上排列 window,则需要考虑那些透明的 7 像素。用户不希望屏幕边框旁边有 7 像素的间隙!
具有属性 DWMWA_EXTENDED_FRAME_BOUNDS 的 DwmGetWindowAttribute 将为您提供屏幕坐标中边框实际显示部分的宽度和高度。与 GetWindowRect 非常相似,但 rect 不包含 invisible-ness。
大多数时候你仍然需要 GetWindowRect 来设置你的 window 的宽度和高度,并且需要每边不可见的 7 个像素来调整 window 的大小以编程方式正确。
所以使用 rect GetWindowRect returns 的 .left 和 DwmTerribleName returns 的 .left 之间的差异来获得 7 个像素的偏移量。
在我看来,谁在微软做了这件事,就应该立即枪毙。
这是一个我不需要跳过的圈套。
这打破了与过去的兼容性。
我在 windows 10 - 直接 win32 API.
上用 C++ 编码我想在屏幕右上角显示一个 window。 当我这样做时,我注意到最大化 window 的屏幕坐标是 left=-8, top=-8, right=1936, bottom=1088.
此外,当我将 window 定位为 right=1920 和 top=0 时,右侧大约有 8 像素的间隙。我试着移动 window 来查看我得到的屏幕坐标。
rect.left 对于非最大化 window 可以从 -7 到 1912。
所以东西滑动了 7 个像素? WTF 微软 ??
我该如何想出 rec.right=1913 值来使我的 window 与屏幕右侧对齐而没有该死的间隙?
但 1920 年的 rect.right 留下了空白。所以 1912 年的 rect.right 会留下更多的空白...
我需要一个可以返回到 Vista 的解决方案。 在 win10 之前,rect.right 应该像你期望的那样是 1920。
这是怎么回事?我要开始乱扔刀子了!!
代码明智,这正是 GetWindowRect 报告的内容... (请原谅我奇怪的调试功能)
::GetWindowRect (_wndo, r);
DBG("ExtRc l=`d r=`d t=`d b=`d w=`d h=`d",
r->left, r->right, r->top, r->bottom, r->right-r->left, r->bottom-r->top);
这是因为 window 边框的宽度和其他因素,这取决于 OS 版本、用户偏好和 DPI 设置。请参阅 GetSystemMetrics 函数。
感谢@ChristopherOicles 这真的是他的回答。将其复制为您自己的(或对其进行任何调整),我会接受您的。
微软正在破坏 windows 10 中的边框宽度。
GetWindowRect returns 外部window 坐标作为屏幕坐标。 GetClientRect returns里面的window坐标。 直到 Windows 10 (F U Win10 !!),
它们之间的宽度和高度的差异是边框的宽度和高度。
在 win10 上,边框宽度报告为 16 像素,因此边为 8 像素。 但是,这些像素中只有 1 个是可见的。其中7个是透明的。 所以你的 window 在左边、右边和底部有 7 个透明像素。
因此,如果您要以编程方式在屏幕上排列 window,则需要考虑那些透明的 7 像素。用户不希望屏幕边框旁边有 7 像素的间隙!
具有属性 DWMWA_EXTENDED_FRAME_BOUNDS 的 DwmGetWindowAttribute 将为您提供屏幕坐标中边框实际显示部分的宽度和高度。与 GetWindowRect 非常相似,但 rect 不包含 invisible-ness。
大多数时候你仍然需要 GetWindowRect 来设置你的 window 的宽度和高度,并且需要每边不可见的 7 个像素来调整 window 的大小以编程方式正确。
所以使用 rect GetWindowRect returns 的 .left 和 DwmTerribleName returns 的 .left 之间的差异来获得 7 个像素的偏移量。
在我看来,谁在微软做了这件事,就应该立即枪毙。 这是一个我不需要跳过的圈套。 这打破了与过去的兼容性。