2012-04-26 2 views
6

Используя Windows Forms, я хотел поместить окно в определенные координаты. Я думал, что это может быть сделано в простой форме, но следующий код не работает на всех:Позиционирование окна C#

public Form1() 
{ 
    InitializeComponent(); 

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

Однако, когда только получить дескриптор этого окна, он хорошо работает:

public Form1() 
{ 
    InitializeComponent(); 

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

You может видеть, что я вообще не работаю с этим указателем. Я нашел в MSDN следующее заявление:

Значение свойства Handle - это Windows HWND. Если дескриптор имеет , он еще не создан, ссылка на это свойство заставит дескриптор быть создан.

Означает ли это, что мы можем установить положение окна только после создания его ручки? Устанавливают ли верхние/левые сеттеры с помощью этого ручка внутри? Благодарим вас за разъяснения.

+0

Не отвечая на ваш вопрос, но вы можете переопределить метод OnHandleCreated, чтобы избежать вызова 'this.Handle'. Я согласен, что странно, что 'this.Handle', по-видимому, проверяет и создает базовый дескриптор, в то время как другие свойства, зависящие от базового дескриптора, не работают. –

+0

Вы пытались установить их в дизайнере? –

+0

Я знаю, что могу обойти это разными способами. Я только хотел узнать, почему он ведет себя так, потому что в других рамках (Qt, wxWidgets, MFC ...) вы можете установить свою позицию окна непосредственно во время построения окна. – Fremen

ответ

5

Обычно WinForm размещается на экране в соответствии со свойством StartupPosition.
Это означает, что после выхода из конструктора Form1 Window Manager построит окно и разместит его в соответствии с этим свойством.
Если вы установили StartupPosition = Manual, то значения Left и Top (Location), установленные через конструктор, будут признаны.
See MSDN для StartupPosition, а также для перечисления FormStartPosition.

Конечно, это устраняет необходимость использования this.Handle. (я полагаю, что ссылаясь на это свойство, вы вынуждаете диспетчера окон напрямую создавать форму с использованием значений конструктора в StartupPosition)

+0

Построение окна после прохождения конструктора дает мне объяснение. Спасибо. – Fremen

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 

 Смежные вопросы

  • Нет связанных вопросов^_^