C# как показать форму в определенном положении мыши на экране?

У меня есть две формы, моя основная форма Form1 и моя вторичная форма, показанная по требованию в виде диалога Form2. Теперь, если я вызываю Form2, он всегда отображается в верхнем левом углу экрана. В первый раз я подумал, что моей формы вообще нет, но потом я увидел, что она висит в верхнем углу экрана. Я хотел бы показать свою форму в текущей позиции мыши, где пользователь щелкает контекстное меню, чтобы отобразить модальный диалог. Я уже пробовал разные вещи и искал образцы кода. Но я нашел ничего, кроме тысячи различных кодов о том, как получить фактическую позицию мыши разными способами, которые я уже знаю. Но это положение в любом случае всегда относительно экрана, основной формы, элемента управления или любого текущего контекста. Здесь мой код (расположение рабочего стола, которое я также пробовал, не работает, и центр-экран центрирует только форму, поэтому я оставил свойство Windows.По умолчанию.Позиция):

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

2 ответов


ваша проблема в том, что ваш первый звонок: frm2.ShowDialog(this); и затем вызов frm2.SetDesktopLocation который фактически вызывается только после того, как форма (frm2) уже закрыта.

ShowDialog является блокирующим вызовом-это означает, что он возвращается только тогда, когда форма, вызывающая ShowDialog, закрывается. Таким образом, вам понадобится другой подход к установке позиции формы.

вероятно, самый простой способ сделать это - создать второй конструктор на вашем Form2 (который вы хотите positioned), который принимает два параметра для координат 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 в обработчике загрузки.


вам нужно вызвать SetDesktopLocation перед методом ShowDialog (), например :

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 statemen, он рекомендуется. Удачи ;)