C#winform控件的各種坐標獲取


一、窗體

  • 綠色邊框框住的區域:屏幕
  • 橙色邊框框住的區域:窗體
  • 黃色邊框框住的區域:窗體工作區

1.邊框 

 窗體的FormBorderStyle可以設置以下的值,每個值導致窗體的邊框的寬度不一樣,但是可以發現的是左、右、下邊框的寬度是一樣的:

    //
    // 摘要:
    //     指定窗體的邊框樣式。
    [ComVisible(true)]
    public enum FormBorderStyle
    {
        //
        // 摘要:
        //     無邊框。
        None = 0,
        //
        // 摘要:
        //     固定的單線邊框。
        FixedSingle = 1,
        //
        // 摘要:
        //     固定的三維邊框。
        Fixed3D = 2,
        //
        // 摘要:
        //     粗、 固定的對話框樣式邊框。
        FixedDialog = 3,
        //
        // 摘要:
        //     可調整大小的邊框。
        Sizable = 4,
        //
        // 摘要:
        //     不是可調整大小工具窗口邊框。 在任務欄中或在用戶按 ALT + TAB 時出現的窗口中未顯示工具窗口。 雖然窗體,用於指定 System.Windows.Forms.FormBorderStyle.FixedToolWindow
        //     通常不顯示在任務欄中,您必須確保 System.Windows.Forms.Form.ShowInTaskbar 屬性設置為 false, ,因為其默認值是
        //     true。
        FixedToolWindow = 5,
        //
        // 摘要:
        //     可調整大小的工具窗口邊界。 在任務欄中或在用戶按 ALT + TAB 時出現的窗口中未顯示工具窗口。
        SizableToolWindow = 6
    }

     可以通過ClientSize獲取工作區的大小,即窗體除邊框外的大小

Size clientSize = this.ClientSize;   //獲取窗體工作區的大小
int left = (this.Size.Width - clientSize.Width) / 2;   //左右的邊框長度
int top = (this.Size.Height - clientSize.Height) - left;  //下邊框和左右邊框長度一樣

    各窗體模式下的邊框寬度如下: 

 

2.坐標 

窗體的坐標,即Location屬性,是窗體左上角(不是工作區的左上角)相對於屏幕而言的。屏幕左上角是原點,原點往右為X的正方向,往下為Y的正方向。

二、相對坐標

1.PointToClient 

將指定屏幕點的位置計算成工作區坐標

Control.PointToClient(p2);

 p2坐標是相對於屏幕,即屏幕左上角原點(0,0)的坐標;假如Control相對於屏幕原點的坐標為 p1;Control.PointToClient(p2) 的結果為 p2 - p1。即以p1為原點時p2的坐標(坐標系和窗體的一致)

PS:如果Control為Form時,p1為Form工作區相對於原點的坐標,而不是Location。 

2.PointToScreen 

將指定工作區點的位置計算成屏幕坐標

Control.PointToScreen(p2);

p2坐標是相對於屏幕,即屏幕左上角原點(0,0)的坐標;假如Control相對於屏幕原點的坐標為 p1;Control.PointToScreen(p2) 的結果為 p2 + p1。即以屏幕原點為原點p1和p2的疊加

PS: 如果Control為Form時,p1為Form工作區相對於原點的坐標,而不是Location。 

三、獲取坐標 

 1.相對於屏幕

Control.PointToScreen(new Point(0,0));    //獲取控件相對於屏幕原點的絕對坐標

PS:如果Control為Form時,是指工作區相對於屏幕的坐標。Form相對於屏幕的坐標就是Location

2.相對於控件

//Control1相對於Control2的坐標
Control2.PointToClient(Control1.PointToScreen(new Point(0,0))); 

3.相對於窗體 

Control.FindForm().PointToClient(Control.PointToScreen(new Point(0,0))); 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM