3

如何将 Windows 窗体打开时放置在屏幕的右下角,而不是左上角?

情况:我有一个Form1,它实际上并没有作为表单做任何事情,我只是将它用于它的上下文菜单(我的应用程序只能从托盘工作)。因此,大部分主要运行代码进入 Form1 类。单击上下文菜单时,它将进行一些处理,最后将显示Form2。因此Form2Form1的上下文菜单项打开/调用。在这种情况下如何更改 Form2 的位置?

Form1.csForm2被触发的部分)

private void menu_upload_file_Click(object sender, EventArgs e)
{
    DialogResult dialogOpened = openFileDialog1.ShowDialog();
    if (dialogOpened == DialogResult.OK)
    {
        string filename = openFileDialog1.FileName;

        using (var client = new WebClient())
        {
            var response = client.UploadFile("http://localhost/imgitv3/upload.php?submit=true&action=upload&request=app", "POST", filename);
            // string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + Path.DirectorySeparatorChar + "response.txt";

            if (response != null)
            {
                string responseContent = System.Text.Encoding.ASCII.GetString(response);
                Form2 linkWindow = new Form2();

                if (isURL(responseContent))
                {
                    linkWindow.toTextBox(responseContent);
                    linkWindow.Show();
                }
            }
        }
    }
}

Form2.Designer.cs

// 
            // Form2
            // 
            this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
            this.CausesValidation = false;
            this.ClientSize = new System.Drawing.Size(419, 163);
            this.Controls.Add(this.textBox2);
            this.Controls.Add(this.textBox1);
            this.Controls.Add(this.label3);
            this.Controls.Add(this.label2);
            this.Controls.Add(this.label1);
            this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
            this.MaximizeBox = false;
            this.MaximumSize = new System.Drawing.Size(435, 202);
            this.MinimizeBox = false;
            this.MinimumSize = new System.Drawing.Size(435, 202);
            this.Name = "Form2";
            this.ShowInTaskbar = false;
            this.StartPosition = System.Windows.Forms.FormStartPosition.Manual;
            this.Text = "IMGit Image Uploader";
            this.TopMost = true;
            this.WindowState = System.Windows.Forms.FormWindowState.Maximized;
            this.Load += new System.EventHandler(this.Form2_Load);
            this.ResumeLayout(false);
            this.PerformLayout();
4

4 回答 4

5

你需要知道两件事。首先是您要在其上显示表单的屏幕的工作区域。工作区是屏幕的大小减去该屏幕上显示的任务栏。您可以为此使用 Screen.WorkingArea 属性。

其次是窗口的实际大小。这通常不是表单的设计大小,您的用户可能已经更改了窗口标题栏中文本的大小,或者可能正在以与您不同的 DPI 设置运行视频适配器。您必须等到表单的 Load 事件触发后才能知道该大小。

所以让你的代码看起来像这样,假设你想在主监视器上显示表单:

        var frm = new Form2();
        frm.Load += (s, ea) => {
            var wa = Screen.PrimaryScreen.WorkingArea;
            frm.Location = new Point(wa.Right - frm.Width, wa.Bottom - frm.Height);
        };
        frm.Show();

这会在窗口变得可见之前重新定位窗口。表单的 StartPosition 属性无关紧要。

于 2013-02-07T18:22:30.133 回答
2

您可以设置表单属性StartPosition=Manual,然后将form.leftform.top属性设置为所需的值。

您应该在显示对话框之前设置它们。

Form2 linkWindow = new Form2();
linkWindow.StartPosition = FormStartPosition.Manual;
linkWindow.Left = 200;
linkWindow.Top = 200;

if (isURL(responseContent))
{
  linkWindow.toTextBox(responseContent);
  linkWindow.Show();
}

使用 Left 和 Top 值

于 2013-02-07T17:39:16.903 回答
2

从您的 Form2 中挂钩 FormLoad 事件:

Form2 linkWindow = new Form2();
linkWindow.FormLoad += Form2_Load;

然后在某处添加此方法:

    private void Form2_Load(object sender, EventArgs e)
    {
        this.StartPosition = FormStartPosition.Manual;
        this.Location = new Point(400, 400);  //set x,y to where you want it to appear
    }

将 X,y 值更改为您想要放置窗口的任何值。

于 2013-02-07T17:55:09.863 回答
2

除了关于 this.StartPosition = FormStartPosition.Manual 和 location 等的答案。要计算 Form 的位置,可以使用 Screen 类及其 WorkingArea 属性。 http://msdn.microsoft.com/en-us/library/system.windows.forms.screen.aspx

于 2013-02-07T18:20:59.857 回答