Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Как задать координаты новой формы при открытии?


Автор: graham 31.8.2009, 21:50
Есть Form1 - основная и Form2, которую вызываю из Form1 через ShowModal();
При каждом новом вызове Form2 она появляется в новом месте. Хочу сделать чтобы положение Form2 зависело от Form1. 

Пробовал передать Form1->Location.X и Y и установить в конструкторе Form2 так же в X и Y.
Пробовал через Point. Но всеравно не работает. 
Пробовал координаты устанавливать в событии OnShow, тоже н помогло. 
Срабатывает только в событии OnLoad, но не знаю как туда передать нужные координаты.

Автор: diadiavova 31.8.2009, 22:50
В форме 2  создай свойство типа Point. Перед вызовом формы передай этому свойству координаты, а в обработчике лоуда используй их.
Код

public class Form2:Form
{
    public Point ShowLocation{get;set;}
    public Form2()
    {
        this.Load += Form2_Load;
    }
    void Form2_Load(object sender, EventArgs e)
    {
        this.SetDesktopLocation(ShowLocation.X, ShowLocation.Y);
    }
}


Примерно так

Автор: Lunatic2009 31.8.2009, 23:05
form2.StartPosition = FormStartPosition.CenterParent;

или в дизайнере: StartPosition = CenterParent

если нужно в коде, можно сделать что-то на подобии такого:

Код

//Form1
private void button1_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2(RectangleToScreen(DisplayRectangle));
    form2.ShowDialog();
}

//Form2
private Rectangle _rect;

public Form2(Rectangle rect)
{
    InitializeComponent();
    _rect = rect;
}

private void Form2_Load(object sender, EventArgs e)
{
    int x = _rect.X + (_rect.Width/2 - DisplayRectangle.Width/2);
    int y = _rect.Y + (_rect.Height/2 - DisplayRectangle.Height/2);

    SetBounds(x, y, DisplayRectangle.Width, DisplayRectangle.Height);
}

Автор: graham 1.9.2009, 08:17
спасибо, сделал дополнительное свойство, в которое передаю из конструктора. А уже его использую в OnLoad. Вот только так и не понял, почему нельзя сразу в конструкторе установить Location  и не париться с дополнительными свойствами. Сразу так и не стал делать, думал что-то недопонимаю.

Автор: diadiavova 1.9.2009, 09:26
graham, на счёт StartPosition Lunatic2009 прав. Задай ему значение Manual и устанавливай Location.
Код

            using (var f = new Form())
            {
                f.StartPosition= FormStartPosition.Manual;
                f.Location = new Point(this.Left + 20, this.Top + 20);
                f.ShowDialog();
             }
 

Автор: graham 1.9.2009, 12:04
После установки StartPosition = Manual поучилось сделать так:

Код

Form2 ^f = gcnew Form2();
f->DesktopLocation = this->Location;
f->ShowDialog();


теперь не надо никуда передавать координаты, все дело в StartPosition = Manual. Самое простое всегда навиду smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)