2017-02-26 38 views
-3

我正在編寫c + +在Windows 10 - 直win32 API。窗口10的屏幕座標被偏移7

我想讓窗口顯示在屏幕的右上角。 正如我這樣做,我注意到最大化窗口的屏幕座標是左= -8,頂= -8,右= 1936,底= 1088。另外,當我定位一個窗口如此右邊= 1920和頂部= 0時,右邊有大約8個像素的間隙。我試着移動窗口看看我得到了什麼屏幕座標。

rect.left用於nonmaximized窗口可以去從-7到1912

這樣的事情是由7個像素滑動? WTF微軟?

我該怎麼想出rec.right = 1913的值來將我的窗口對準屏幕右側而沒有這個窗口間隙?

但1920年的rect.right留下了缺口。因此,直到1912年將留下更多的差距...

而我需要一個解決方案,可以回到Vista。 前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

不要向周圍扔刀。那些破窗戶。 – rubenvb

+0

是的,它不需要太多來打破窗戶10似乎我是... :(((( –

+0

那麼這不是一個好問題 - 需要一些改進。代碼?圖像?你在非客戶區閱讀,是不是? –

回答

1

非常感謝@ChristopherOicles 這真是他的答案。複製這個作爲你自己的(或調整它,不管),我會接受你的。

這是怎麼回事是Microsoft Windows的搶險邊框寬度10

GetWindowRect返回外面窗口座標爲屏幕座標。 GetClientRect返回窗口座標內部。 直到Windows 10(F U Win10 !!),

它們之間的寬度和高度差異是邊框的寬度和高度。

在win10上,邊框寬度報告16個像素,所以8個像素一邊。 但是,只有其中一個像素可見。其中7個是透明的。 因此,您的窗口左側,右側和底部有一個透明的7像素。

因此,如果要以編程方式排列屏幕上的窗口,則需要考慮那些透明的7像素。用戶不希望屏幕邊界旁邊的7像素間隙!

帶屬性DWMWA_EXTENDED_FRAME_BOUNDS的DwmGetWindowAttribute將獲得屏幕座標中邊框的ACTUALLY SHOWING部分的寬度和高度。與GetWindowRect類似,但是矩形不包含不可見性。

大多數情況下,您仍然需要GetWindowRect來設置窗口的寬度和高度,並且每個不可見邊的7個像素都需要以編程方式正確調整窗口的大小。

因此,使用rect GetWindowRect返回的.left和DwmTerribleName返回的.left之間的差異來獲得7個像素的偏移量。

在我看來,無論誰在微軟做過這件事,都應該立即開槍。 這是一個箍,我不需要跳過。 這打破了與過去的兼容性。

2

這是因爲窗口邊界和其他因素的影響,這取決於改變的寬度操作系統版本,用戶首選項和DPI設置。請參閱GetSystemMetrics函數。

+0

好吧,我發現GetWindowRect和GetClientRect報告的邊界寬度差異爲16像素,因此8個像素位於側面,但實際邊框寬度爲win10是一個像素,有一個API可以幫助我計算出8個像素邊框的寬度是多少「只是空氣」,我怎樣才能從windows API中獲得魔術7?寬度之前是GetWindowRect寬度和GetClientRect寬度/ 2之間的差異。那麼calc不再適用於win10。那麼我怎麼知道偏移了7? –

+1

GetSystemMetrics沒有得到我那7個像素的偏移量DwmGetWindowAttribute的屬性爲DWMWA_EXTENDED_FRAME_BOUNDS:do 。 –