2012-04-26 39 views
6

Sử dụng Biểu mẫu Windows Tôi muốn định vị cửa sổ thành các coords cụ thể. Tôi nghĩ rằng nó có thể được thực hiện một cách đơn giản, nhưng sau mã không làm việc ở tất cả:Định vị cửa sổ C#

public Form1() 
{ 
    InitializeComponent(); 

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

Tuy nhiên, khi chỉ nhận được một xử lý cho cửa sổ đó, nó hoạt động tốt:

public Form1() 
{ 
    InitializeComponent(); 

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

Bạn có thể thấy rằng tôi không làm việc với con trỏ đó chút nào. Tôi tìm thấy tại MSDN tuyên bố sau:

Giá trị của thuộc tính Xử lý là Windows HWND. Nếu tay cầm có chưa được tạo, việc tham chiếu thuộc tính này sẽ bắt buộc xử lý sẽ được tạo.

Điều đó có nghĩa là chúng tôi chỉ có thể đặt vị trí cửa sổ SAU KHI tạo trình xử lý? Là setters Top/Left sử dụng xử lý này trong nội bộ? Cảm ơn bạn đã làm rõ.

+0

Không trả lời câu hỏi của bạn, nhưng bạn có thể ghi đè phương thức 'OnHandleCreated' để tránh cuộc gọi đến' this.Handle'. Tôi đồng ý nó là lạ rằng 'this.Handle' dường như kiểm tra và tạo ra các xử lý cơ bản, trong khi các thuộc tính khác phụ thuộc vào xử lý cơ bản thì không. –

+0

bạn đã cố gắng đặt chúng trong nhà thiết kế chưa? –

+0

Tôi biết tôi có thể giải quyết vấn đề này bằng nhiều cách. Tôi chỉ muốn biết tại sao nó hoạt động theo cách này bởi vì trong các khung công tác khác (Qt, wxWidgets, MFC ...), bạn có thể đặt vị trí cửa sổ của mình trực tiếp trong khi xây dựng cửa sổ. – Fremen

Trả lời

5

Thông thường một WinForm được định vị trên màn hình theo thuộc tính StartupPosition.
Điều này có nghĩa là sau khi thoát khỏi hàm tạo Form1, Trình quản lý cửa sổ sẽ xây dựng cửa sổ và định vị nó theo thuộc tính đó.
Nếu bạn đặt StartupPosition = Manual thì các giá trị Trái và Trên (Vị trí) được đặt thông qua trình thiết kế sẽ được xác nhận.
See MSDN cho StartupPosition và cũng cho en2 FormStartPosition enum.

Tất nhiên điều này sẽ xóa nhu cầu sử dụng this.Handle. (Tôi cho rằng tham chiếu thuộc tính mà bạn đang buộc trình quản lý cửa sổ xây dựng ngay lập tức biểu mẫu bằng cách sử dụng giá trị thiết kế trong StartupPosition)

+0

Xây dựng cửa sổ sau khi truyền hàm tạo cho tôi giải thích. Cảm ơn bạn. – Fremen

3

Không chắc chắn về lý do, nhưng nếu bạn thêm mã định vị vào sự kiện Form_Load nó sẽ làm việc như mong đợi mà không cần phải khởi tạo trình xử lý một cách rõ ràng.

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); 
} 

Hoặc:

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

Bạn có thể thiết lập vị trí trên sự kiện dưới hình thức tải như thế này. đây là tự động Xử lý vị trí Biểu mẫu.

this.Location = new Point(0, 0); // or any value to set the location 
Các vấn đề liên quan