我在Windows 10上使用c ++进行编码 - 直接win32 API。
我想在屏幕右上方显示一个窗口。 当我这样做时,我注意到最大化窗口的屏幕坐标是左= -8,顶部= -8,右= 1936,底部= 1088。
此外,当我将窗口定位为右= 1920并且顶部= 0时,右边有一个8像素的间隙。我试着移动窗口看看我得到了什么屏幕坐标。
对于非最大化窗口,rect.left可以从-7到1912。
所以事情是由7个像素滑动? WTF微软??
我怎么能想出rec.right = 1913的值来将我的窗口对齐到屏幕右侧而没有那个差距呢?
但1920年的rect.right留下了一个空白。因此,1912年的rect.right将留下更多的差距...
我需要一个能够回归Vista的解决方案。 pre win10,rect.right应该像你期望的那样1920年。
Whaaaaat正在这里?我即将开始扔刀!
代码明智,这就是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);
答案 0 :(得分:4)
非常感谢@ChristopherOicles 这是他的答案。将其复制为您自己的(或调整它,无论如何),我会接受您的。
正在发生的事情是微软在Windows 10中破坏边框宽度。
GetWindowRect将外部窗口坐标作为屏幕坐标返回。 GetClientRect返回窗口坐标内部。 直到Windows 10(F U Win10 !!),
它们之间的宽度和高度差异是边框的宽度和高度。
在win10上,边框宽度报告16个像素,因此每边8个像素。 但是,这些像素中只有一个是可见的。其中7个是透明的。 因此,您的窗口在左侧,右侧和底部有一个透明的7像素。
因此,如果您要以编程方式在屏幕上排列窗口,则需要考虑这些透明的7像素。用户不希望屏幕边框旁边有7个像素间隙!
具有DWMWA_EXTENDED_FRAME_BOUNDS属性的DwmGetWindowAttribute将为您提供屏幕坐标中边框的ACTUALLY SHOWING部分的宽度和高度。与GetWindowRect类似,但rect不包含不可见的内容。
您大部分时间仍然需要GetWindowRect来设置窗口的宽度和高度,并且需要以隐形方式每侧7个像素来以编程方式正确调整窗口大小。
因此,使用rect的GetWindowRect返回的.left和DwmTerribleName返回的.left之间的差异来获得7个像素的偏移量。
在我看来,无论谁在微软这样做,都应该立即开枪。 这是一个我不需要跳过的箍。 这打破了与过去的兼容性。
答案 1 :(得分:2)
这是因为窗口边框的宽度和其他因素因操作系统版本,用户首选项和DPI设置而异。请参阅GetSystemMetrics功能。