2016-01-29 27 views
5

我正在使用VB.NET編寫一個運行在使用碰撞檢測的窗體中的遊戲。爲了實現這一點,我必須能夠理解定位系統。我知道窗體座標從左上角開始,不包括底部或右邊緣。但座標開始和結束的數字是多少? (我的意思是什麼是左上角的座標,什麼是差不多右下角座標)窗體的座標系在哪裏停止並開始?

+1

ClientSize.Width/Height minus 1. –

+0

我認爲這裏隱藏了一個更有趣的問題:ClientSize是否包含FormBorder(如果有的話)? – MrPaulch

+1

不,@MrPaulch。這就是* client *大小的含義。它從不包含表單的邊框。邊界是*非客戶端*區域的一部分。 –

回答

5

座標系取決於您是否在說客戶端座標或屏幕座標。這是一個基本的Windows UI管理器,而WinForms包裝器遵循相同的模式。

當您處理客戶端座標時,原點(左上角)點的座標爲(0, 0)。總是。範圍由表格的寬度和高度來定義,可分別通過Me.ClientSize.WidthMe.ClientSize.Height訪問。客戶矩形因此是:
{(0, 0) × (ClientSize.Width, ClientSize.Height)},也可以使用ClientRectangle屬性檢索。

客戶區域的獨特之處在於它不包括窗體的非客戶區域 - 邊界,標題欄和其他系統相關屬性。

                   
                    (拍攝的圖像出於說明性目的從Jose Menendez Póo's article上創建的Aero的ToolStrip)

您不必擔心計算這些尺寸(您也不應該擔心,因爲它們可能會發生變化)。你只需要在客戶端座標上工作,框架將負責其餘部分。將子對象(如控件)放置在其父窗體上時,可以使用客戶端座標,並且您甚至可以通過指定客戶端大小來調整窗體大小。其實際大小將自動計算,並考慮到非客戶區域。

這是非常罕見的,你將永遠不得不在屏幕座標。如果你想在屏幕上移動一個窗體(窗口)(這也應該是很少見的,因爲你不知道用戶有多大的屏幕尺寸,你也不應該試圖控制她放置窗戶的位置)。在屏幕座標中,主監視器的左上角座標爲(0, 0)。座標系的其餘部分基於virtual screen,它考慮了多顯示器配置。

                   

窗體的LocationSize屬性給你值屏幕座標。如果需要在客戶端和屏幕座標之間進行映射(轉換),則有PointToClientPointToScreen方法。通過這些分別用屏幕或客戶端座標定義的位置,然後將它們轉換爲另一個座標系。

唯一需要注意的其他問題是Windows使用endpoint-exclusive rectangles。 WinForms包裝將其保留在Rectangle結構中。你幾乎不用擔心這一點,因爲一旦你瞭解它,這真的是一個非常自然的系統。此外,WinForms框架的所有部分和部分都使用慣例,所以如果您只是傳遞點和大小以及矩形,那麼您不會遇到麻煩。但這是值得注意的。正如我們前面所看到的,您可以這樣想:您的客戶區有矩形{(0, 0) × (ClientSize.Width, ClientSize.Height)}。如果您要填充此純色矩形,填充將從點(0, 0)延伸到點(ClientSize.Width - 1, ClientSize.Height - 1)

+0

謝謝SOOOO多!!!!我需要得到這個,因爲它是一個學校項目,所以我幾乎不能感謝你。 :) –

0

如果你留在你的表格中,你可以通過「寬度」和「高度」來計算它。 你也有「左」和「頂」。

開始是(left = 0 and top = 0),它結束於右下角,值爲「width」和「height」的座標。

0

Windows窗體應用程序在屏幕座標中指定窗口在屏幕上的位置。對於屏幕座標,原點是屏幕的左上角。窗口的全部位置通常由包含兩個點的屏幕座標的Rectangle結構來描述,這兩個點定義窗口的左上角和右下角。 (MSDN

左上角是(0, 0),右下角是(Form1.Width, Form1.Height)