C # WinForms позиционирует форму относительно другой формы - PullRequest
1 голос
/ 22 декабря 2009

В моем приложении есть mainform. Когда нажата кнопка открытия, я хочу показать вторую (без полей) форму с загрузкой текста. У меня это работает до сих пор.

Но я хочу, чтобы форма загрузки была центрирована относительно основной формы. Как мне это сделать?

РЕШЕНИЕ:

private void tsbOpen_Click(object sender, EventArgs e)
{
    if (_fileDialog.ShowOpenDialog() == DialogResult.OK)
    {
        _progress = new frmProgress(); // _progress is a member var
        backgroundWorker1.RunWorkerAsync("open");
        _progress.ShowDialog(this);

    }
}

Ответы [ 4 ]

13 голосов
/ 22 декабря 2009

Вы можете установить StartPosition на CenterParent и передать основную форму как Владелец .

0 голосов
/ 29 января 2010

Я создал подчиненную форму с именем ProcessingRequest и поместил в нее текст и анимированный GIF.

У меня есть свойство в моей основной форме, которое вычисляет местоположение, в котором должна быть моя подформа.

private Point ProcessingLocation { get { return new Point(this.Location.X + this.Width / 2 - new ProcessingRequest().Width / 2, this.Location.Y + this.Height / 2 - new ProcessingRequest().Height / 2); } }

У меня есть класс, который создает новый поток для отображения формы.

    public class ShowProgress
    {
        static private System.Drawing.Point point;
        static private ProcessingRequest p;
        static public void ShowProgressForm(System.Drawing.Point myPoint)
        {
            point = myPoint;
            Thread t = new Thread(new ThreadStart(ShowProgress.ShowForm));
            t.IsBackground = true;
            t.SetApartmentState(ApartmentState.STA);
            t.Start();
        }
        static private void ShowForm()
        {
            p = new ProcessingRequest();
            p.StartPosition = FormStartPosition.Manual;
            p.Location = point;
            p.TopMost = true;
            Application.Run(p);
        }

        static public void CloseForm()
        {
            p.Invoke(new CloseDelegate(ShowProgress.CloseFormInternal));
        }

        static private void CloseFormInternal()
        {
            p.Close();
        }
    }
    public delegate void CloseDelegate();

Тогда в своей основной форме я просто ставлю

ShowProgress.ShowProgressForm(ProcessingLocation);
//heavy processing code goes here or whatever
ShowProgress.CloseForm();

:)

0 голосов
/ 22 декабря 2009

Martijn попробуй это

в начале метода поместите код наподобие этого

public sub Bah()
{
    if (me.InvokeRequired)
    {
        me.Invoke(new action(Bah));
        return
    }

    myform.showdialog...
}

Не знаю, компилируется ли этот код на 100%, но вы поняли

0 голосов
/ 22 декабря 2009

Получите положение основных координат формы и ее размер, возьмите размер дочерней формы и добавьте к ней простую математику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...