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