2012-04-26 10 views
6

Uso di Windows Form Volevo posizionare la finestra in specifiche coordinate. Ho pensato che può essere fatto in modo semplice, ma a seguito di codice non funziona affatto:Posizionamento della finestra C#

public Form1() 
{ 
    InitializeComponent(); 

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

Tuttavia, quando solo ottenere un handle a quella finestra, funziona bene:

public Form1() 
{ 
    InitializeComponent(); 

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

È posso vedere che non sto lavorando con quel puntatore. Ho trovato in MSDN seguente dichiarazione:

Il valore della proprietà Handle è un HWND di Windows. Se l'handle non è stato ancora creato , il riferimento a questa proprietà impone l'handle da creare.

Significa che possiamo impostare la posizione della finestra solo DOPO la creazione della sua maniglia? I setter Top/Left utilizzano questa maniglia internamente? Grazie per il chiarimento.

+0

Non rispondere alla domanda, ma è possibile sovrascrivere il metodo 'OnHandleCreated' per evitare la chiamata a' this.Handle'. Sono d'accordo che è strano che 'this.Handle' controlli e crei l'handle sottostante, mentre altre proprietà dipendenti dall'handle sottostante non lo fanno. –

+0

hai provato a impostarli nella finestra di progettazione? –

+0

So che posso aggirarlo in molti modi. Volevo solo sapere perché si comporta in questo modo perché in altri framework (Qt, wxWidgets, MFC ...) è possibile impostare la posizione della finestra direttamente durante la creazione della finestra. – Fremen

risposta

5

In genere un WinForm viene posizionato sullo schermo in base alla proprietà StartupPosition.
Ciò significa che dopo essere usciti dal costruttore di Form1, il Window Manager crea la finestra e la posiziona in base a tale proprietà.
Se si imposta StartupPosition = Manuale, i valori Left e Top (Posizione) impostati tramite il designer verranno riconosciuti.
See MSDN per StartupPosition e anche per enum FormStartPosition.

Ovviamente questo elimina la necessità di utilizzare this.Handle. (Suppongo che facendo riferimento a tale proprietà si costringa il gestore di windows a compilare immediatamente il modulo utilizzando i valori del designer in StartupPosition)

+0

Costruire la finestra dopo aver passato il costruttore mi dà una spiegazione. Grazie. – Fremen

3

Non molto sicuro del motivo, ma se si aggiunge il codice di posizionamento nell'evento Form_Load lo si funziona come previsto senza la necessità di inizializzare esplicitamente il gestore.

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

Oppure:

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

È possibile impostare la posizione sul carico di maschera come questo. questo è automaticamente Handle la posizione Modulo.

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