12

Windows フォームを使用して、ウィンドウを特定の座標に配置したいと考えていました。簡単な方法でできると思ったのですが、次のコードはまったく機能しません。

public Form1()
{
    InitializeComponent();

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

ただし、そのウィンドウへのハンドルのみを取得する場合は、うまく機能します。

public Form1()
{
    InitializeComponent();

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

そのポインターをまったく操作していないことがわかります。MSDN で次のステートメントを見つけました。

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

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

4

4 に答える 4

10

通常、WinFormは、StartupPositionプロパティに従って画面上に配置されます。
これは、Form1のコンストラクターを終了した後、ウィンドウマネージャーがウィンドウを作成し、そのプロパティに従ってウィンドウを配置することを意味します。StartupPosition = Manual
を設定すると、デザイナーを介して設定された左と上の値(場所)が認識されます。StartupPositionおよびFormStartPosition列挙型については、 MSDNを参照してください。

もちろん、これにより、を使用する必要がなくなりますthis.Handle。(そのプロパティを参照すると、StartupPositionのデザイナー値を使用してウィンドウマネージャーにフォームをすぐに作成するように強制していると思います)

于 2012-04-26T09:20:41.410 に答える
5
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);
}
于 2012-04-26T12:03:57.037 に答える
4

このように、フォーム読み込みイベントで場所を設定できます。これは自動的にフォームの位置を処理します。

this.Location = new Point(0, 0); // or any value to set the location
于 2016-01-22T04:54:31.830 に答える
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;
        }
    }
}
于 2012-04-26T09:30:27.500 に答える