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

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

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

person feedwall    schedule 19.07.2012    source источник


Ответы (2)


Ваша проблема в том, что ваш первый вызов: 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 в обработчике загрузки.

person Mike Dinescu    schedule 19.07.2012
comment
Вы пробовали мое предложение? Вы реализовали модифицированный конструктор, и это не сработало? - person Mike Dinescu; 19.07.2012
comment
@feedwall - я рад, что у вас все получилось (и спасибо за голосование и согласие) - person Mike Dinescu; 19.07.2012
comment
StartPosition необходимо установить на Manual - person ehh; 25.06.2017

Вам нужно вызвать 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);
}

Используйте использование statemen, это рекомендуется. Удачи ;)

person SidAhmed    schedule 19.07.2012