2012-04-26 79 views
6

使用Windows窗體我想將窗口定位到特定的座標系。我認爲這可以以簡單的方式來完成,但是下面的代碼無法在所有的工作:C#窗口定位

public Form1() 
{ 
    InitializeComponent(); 

    this.Top = 0; 
    this.Left = 0; 
} 

但是,如果只得到一個句柄窗口,它工作得很好:

public Form1() 
{ 
    InitializeComponent(); 

    IntPtr hwnd = this.Handle; 
    this.Top = 0; 
    this.Left = 0; 
} 

你可以看到我沒有使用該指針。我在MSDN發現以下聲明:

Handle屬性的值是Windows HWND。如果手柄尚未創建, ,則引用此屬性將強制創建手柄 。

這是否意味着我們可以在創建其句柄之後設置窗口位置?在內部使用此句柄的setter Top/Left?感謝您的澄清。

+0

不回答你的問題,但你可以重寫'OnHandleCreated'方法來避免調用'this.Handle'。我同意奇怪的是'this.Handle'顯然檢查並創建底層句柄,而其他屬性則依賴於底層句柄。 – 2012-04-26 09:19:27

+0

你是否嘗試在設計師中設置它們? – 2012-04-26 09:20:05

+0

我知道我可以通過很多方法解決它。我只想知道它爲什麼會這樣表現,因爲在其他框架(Qt,wxWidgets,MFC ...)中,您可以在窗口構建期間直接設置窗口位置。 – Fremen 2012-04-26 09:32:07

回答

5

通常根據StartupPosition屬性將WinForm定位在屏幕上。
這意味着在從Form1的構造函數中退出後,窗口管理器將生成窗口並根據該屬性對其進行定位。
如果您設置了StartupPosition = Manual那麼通過設計器設置的左值和上值(位置)將被認知。
See MSDN爲StartupPosition,也爲FormStartPosition枚舉。

當然這不需要使用this.Handle。 (我想是引用那個屬性,你迫使窗口管理器立即使用StartupPosition中的設計器值構建表單)

+0

通過構造函數構建窗口給我解釋。謝謝。 – Fremen 2012-04-26 09:45:41

3

不太確定原因,但是如果在Form_Load事件上添加定位代碼,它會按預期工作,無需顯式初始化處理程序。

using System; 
using System.Windows.Forms; 

namespace PositioningCs 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
      /* 
      IntPtr h = this.Handle; 
      this.Top = 0; 
      this.Left = 0; 
      */ 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      this.Top = 0; 
      this.Left = 0; 
     } 
    } 
} 
4
public Form1() 
{ 
    InitializeComponent(); 
    Load += Form1_Load; 
} 

void Form1_Load(object sender, EventArgs e) 
{ 
    Location = new Point(700, 20); 
} 

或者:

public Form1() 
{ 
    InitializeComponent(); 
    StartPosition = FormStartPosition.Manual; 
    Location = new Point(700, 20); 
} 
2

您可以設置這樣的形式加載事件的位置。這是自動處理表格位置。

this.Location = new Point(0, 0); // or any value to set the location