2012-04-26 6 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; 
} 

あなたはそのポインタで作業していないことがわかります。

Handleプロパティの値はWindows HWNDです。ハンドルに がまだ作成されていない場合、このプロパティを参照すると、ハンドル が強制的に作成されます。

ハンドルの作成後にのみウィンドウ位置を設定できるということですか?このハンドルを内部的に使用してセッターをトップ/レフトしますか?明確化のためにありがとうございます。

+0

あなたの質問に答えていませんが、 'OnHandleCreated'メソッドをオーバーライドして' this.Handle'の呼び出しを避けることができます。 'this.Handle'は基になるハンドルをチェックして作成するように見えますが、基になるハンドルに依存する他のプロパティは明らかに奇妙です。 –

+0

あなたはデザイナーでそれらを設定しようとしましたか? –

+0

私はそれをさまざまな方法で回避することができます。他のフレームワーク(Qt、wxWidgets、MFC ...)では、ウィンドウの構築中に直接ウィンドウの位置を設定できるので、なぜこのように動作するのか知りたかっただけです。 – Fremen

答えて

5

通常、WinFormはStartupPositionプロパティに従って画面上に配置されます。
これは、Form1のコンストラクタを終了した後、ウィンドウマネージャがウィンドウを構築し、そのプロパティに従ってウィンドウマネージャを配置することを意味します。
StartupPosition = Manualを設定した場合、デザイナーを介して設定された左と上の値(位置)は認識されません。 StartupPositionの場合は
See MSDNFormStartPositionのenumの場合もあります。

もちろん、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

次のようなフォームのLoadイベントに場所を設定することができます。これは自動的にハンドルフォームの位置です。

this.Location = new Point(0, 0); // or any value to set the location 
関連する問題