8

我有两个表单,我的主表单是 Form1,我的辅助表单按需显示为对话框是 Form2。现在,如果我调用 Form2,它总是显示在我屏幕的左上角。第一次我以为我的表格根本不存在,但后来我看到它挂在屏幕上角。我想在用户单击上下文菜单以显示模式对话框的当前鼠标位置显示我的表单。我已经尝试了不同的方法并搜索了代码示例。但是除了数千个不同的代码之外,我什么也没找到,这些代码是关于如何以我已经知道的不同方式获取实际鼠标位置的。但无论如何,这个位置总是相对于屏幕、主窗体、控件或任何当前上下文。这是我的代码(我也尝试过的桌面定位不起作用,并且中心到屏幕仅将表单居中,

        Form2 frm2 = new Form2();
        frm2.textBox1.Text = listView1.ToString();
        frm2.textBox1.Tag = RenameFile;
        DialogResult dlgres=frm2.ShowDialog(this);
        frm2.SetDesktopLocation(Cursor.Position.X, Cursor.Position.Y);
4

2 回答 2

10

您的问题是您的第一个电话:frm2.ShowDialog(this);然后调用frm2.SetDesktopLocation实际上仅在表单(frm2)已经关闭后才被调用。

ShowDialog是一个阻塞调用 - 这意味着它仅在您调用 ShowDialog 的表单关闭时返回。因此,您将需要一种不同的方法来设置表单位置。

可能最简单的方法是在您的 Form2(您想要定位的)上创建第二个构造函数,该构造函数接受两个参数,用于 X 和 Y 坐标。

public class Form2
{

    // add this code after the class' default constructor

    private int desiredStartLocationX;
    private int desiredStartLocationY;

    public Form2(int x, int y)
           : this()
    {
        // here store the value for x & y into instance variables
        this.desiredStartLocationX = x;
        this.desiredStartLocationY = y;

        Load += new EventHandler(Form2_Load);
    }

    private void Form2_Load(object sender, System.EventArgs e)
    {
        this.SetDesktopLocation(desiredStartLocationX, desiredStartLocationY);
    }

然后,当您创建要显示它的表单时,请使用此构造函数而不是默认构造函数:

Form2 frm2 = new Form2(Cursor.Position.X, Cursor.Position.Y);
frm2.textBox1.Text = listView1.ToString();
frm2.textBox1.Tag = RenameFile;
DialogResult dlgres=frm2.ShowDialog(this);

您也可以尝试this.Move(...)' instead of 'this.SetDesktopLocation在 Load 处理程序中使用。

于 2012-07-19T01:18:54.903 回答
2

您需要在 ShowDialog() 方法之前调用 SetDesktopLocation,如下所示:

using(Form2 frm2 = new Form2())
{
    frm2.textBox1.Text = listView1.ToString();
    frm2.textBox1.Tag = RenameFile;
    frm2.SetDesktopLocation(Cursor.Position.X, Cursor.Position.Y);

    DialogResult dlgres=frm2.ShowDialog(this);
}

建议使用 using 语句。祝你好运 ;)

于 2012-07-19T01:24:14.947 回答