2010-08-29 3 views
0

У меня есть основной вид «MainForm» с IsMdiContainer = верноКак определить местоположение экрана дочерней формы MDI?

Я один или более динамически создаются дочерние формы, где я установил MdiParent = MainForm

Теперь то, что я хочу сделать, это быть в состоянии отделить эти дочерние формы, установив MdiParent = null, но с сохранением того же местоположения на экране.

Я попытался использовать ChildForm.PointToScreen (ChildForm.Location), но это дает мне расположение экрана относительно клиентской области формы.

EDIT

PointToScreen() на самой форме дает мне почти правильное расположение, за исключением того, что она дает расположение экрана 0,0 внутри формы, в то время как .Location относится к внешнему краю форма.

ответ

3

Вы должны использовать метод МДИ окно клиента родительского объекта в PointToScreen():

private void button1_Click(object sender, EventArgs e) { 
     if (this.MdiParent != null) { 
      MdiClient client = null; 
      foreach (Control ctl in this.MdiParent.Controls) { 
       if (ctl is MdiClient) { client = ctl as MdiClient; break; } 
      } 
      this.WindowState = FormWindowState.Normal; 
      Point loc = client.PointToScreen(this.Location); 
      this.MdiParent = null; 
      this.Location = loc; 
     } 
    } 

Вы не можете избежать небольшое смещение вы получите на Aero, ни мерцания.

+0

Это не работает, поскольку у меня есть другие элементы, закрепленные в «MainForm». Приведенный выше код будет позиционировать форму с таким же относительным расстоянием до «MainForm», как ранее в области MdiClient. –

+0

Вам нужно будет найти окно MdiClient, чтобы вы могли использовать его метод PointToScreen. Найдите его, итерируя родительскую коллекцию Controls, проверьте с помощью «is MdiClient». Или просто отрегулируйте положение. –

+0

Добавлен сниппет обновлен. –

Смежные вопросы