2012-04-26 20 views
6

Uso de Windows Forms Quería colocar la ventana en coords específicos. Pensé que se puede hacer de una manera simple, pero a raíz de código no funciona en absoluto:Posicionamiento de ventana C#

public Form1() 
{ 
    InitializeComponent(); 

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

Sin embargo, cuando sólo obtener un identificador para esa ventana, que funciona bien:

public Form1() 
{ 
    InitializeComponent(); 

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

Usted puedo ver que no estoy trabajando con ese puntero en absoluto. Encontré en la declaración siguiente de MSDN:

El valor de la propiedad Manejar es un HWND de Windows. Si todavía no se ha creado el identificador , al hacer referencia a esta propiedad se forzará el identificador para crearse.

¿Significa que solo podemos establecer la posición de la ventana DESPUÉS de la creación de su asa? ¿Los setters Top/Left usan este mango internamente? Gracias por la aclaración.

+0

No responde su pregunta, pero puede anular el método 'OnHandleCreated' para evitar la llamada a' this.Handle'. Estoy de acuerdo en que es extraño que 'this.Handle' aparentemente busque y cree el identificador subyacente, mientras que otras propiedades que dependen del manejador subyacente no lo hacen. –

+0

¿Intentó colocarlos en el diseñador? –

+0

Sé que puedo solucionarlo de muchas maneras. Solo quería saber por qué se comporta de esta manera porque en otros marcos (Qt, wxWidgets, MFC ...) puede establecer la posición de su ventana directamente durante la construcción de la ventana. – Fremen

Respuesta

5

Por lo general, un WinForm se coloca en la pantalla según la propiedad StartupPosition.
Esto significa que después de salir del constructor de Form1, el Administrador de ventanas crea la ventana y la coloca de acuerdo con esa propiedad.
Si configura StartupPosition = Manual, se reconocerán los valores Left (izquierda) y Top (Location) establecidos a través del diseñador.
See MSDN para StartupPosition y también para FormStartPosition enum.

Por supuesto, esto elimina la necesidad de utilizar this.Handle. (Supongo que al hacer referencia a esa propiedad está forzando al administrador de Windows a compilar inmediatamente el formulario con los valores del diseñador en StartupPosition)

+0

Construir la ventana después de pasar el constructor me da una explicación. Gracias. – Fremen

3

No estoy seguro del motivo, pero si agrega el código de posición en el evento Form_Load lo hará funcionar como se espera sin la necesidad de inicializar explícitamente el controlador.

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

O:

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

Puede establecer la ubicación en el evento de carga del formulario como este. esto es automáticamente Manejar la posición del formulario.

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