C#窗口定位

14

我想使用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的设置器是否在内部使用此句柄?感谢您的澄清。

дёҚжҳҜеӣһзӯ”дҪ зҡ„й—®йўҳпјҢдҪҶдҪ еҸҜд»ҘйҮҚеҶҷ OnHandleCreated ж–№жі•жқҘйҒҝе…Қи°ғз”Ё this.HandleгҖӮжҲ‘еҗҢж„ҸиҝҷеҫҲеҘҮжҖӘпјҢеӣ дёә this.Handle жҳҫ然дјҡжЈҖжҹҘ并еҲӣе»әеә•еұӮеҸҘжҹ„пјҢиҖҢе…¶д»–дҫқиө–дәҺеә•еұӮеҸҘжҹ„зҡ„еұһжҖ§еҚҙдёҚдјҡиҝҷж ·еҒҡгҖӮ - C.Evenhuis
你尝试在设计师中设置它们了吗? - Abed Hawa
我知道有很多方法可以解决这个问题。我只是想知道为什么会出现这种情况,因为在其他框架(如Qt、wxWidgets、MFC等)中,你可以直接在窗口构建期间设置窗口位置。 - Fremen
我有一个跟进问题要问你们.. https://stackoverflow.com/questions/61613124/is-there-a-way-to-get-windows-to-ignore-the-manual-windowstartuplocation-im-usi - Karmel Cohen
4个回答

11
通常情况下,WinForm会根据StartupPosition属性在屏幕上定位。
这意味着,在从Form1的构造函数退出后,窗口管理器会构建窗口并根据该属性进行定位。
如果设置 StartupPosition = Manual ,则通过设计师设置的Left和Top值(位置)将被确认。
请参阅MSDN以获取StartupPosition和FormStartPosition枚举的详细信息。

当然,这样就不需要使用this.Handle了。 (我想,引用该属性会强制窗口管理器立即使用启动位置中的设计师值构建表单)


1
在传递构造函数后构建窗口会给我解释。谢谢。 - Fremen

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

4
您可以在表单加载事件中设置位置,如下所示。这将自动处理表单的位置。
this.Location = new Point(0, 0); // or any value to set the location

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接