C#窗口定位

时间:2012-04-26 09:14:40

标签: c# winforms positioning window-handles

使用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。如果手柄有   尚未创建,引用此属性将强制处理   要被创造。

这是否意味着我们只能在创建其句柄后设置窗口位置?是否在内部使用此手柄设置了顶部/左侧?谢谢你的澄清。

4 个答案:

答案 0 :(得分:5)

通常根据StartupPosition属性将WinForm放置在屏幕上 这意味着在退出Form1的构造函数后,Window Manager构建窗口并根据该属性定位它 如果您设置 StartupPosition = Manual ,那么通过设计器设置的左侧和顶部值(位置)将是已知的。 See MSDN表示StartupPosition,也表示FormStartPosition枚举。

当然这样就无需使用this.Handle。 (我想引用那个属性你强迫windows管理器使用StartupPosition中的设计器值立即构建表单)

答案 1 :(得分: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 :(得分: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;
        }
    }
}

答案 3 :(得分:2)

您可以像这样在表单加载事件上设置位置。这会自动 处理 表单位置。

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