2012-04-03 2 views
0

Я пытаюсь переместить форму в нижнюю/правую точку элемента управления.Альтернатива GetWindowRect() для использования с несколькими мониторами?

public void SetAutoLocation() 
{ 
    Rect rect; 
    GetWindowRect(referenceControl.Handle, out rect); 
    Point targetPoint; 
    targetPoint = new Point(rect.left, rect.top + referenceControl.Height); 

    if (rect.left + referenceControl.Width - this.Width < 0) //Outside left border 
    { 
     targetPoint.X = 0; 
    } 
    else 
    { 
     targetPoint.X = rect.left - this.Width + referenceControl.Width; 
    } 
    if (targetPoint.X + this.Width > System.Windows.Forms.SystemInformation.WorkingArea.Right) //Outside right border 
    { 
     targetPoint.X = System.Windows.Forms.SystemInformation.WorkingArea.Right - this.Width; 
    } 
    else if (targetPoint.X < 0) 
     targetPoint.X = 0; 

    if (targetPoint.Y + this.Height > System.Windows.Forms.SystemInformation.WorkingArea.Bottom) //Outside below border 
    { 
     targetPoint.Y = rect.top - this.Height; 
    } 
    if (targetPoint.Y < 0) 
    { 
     targetPoint.Y = 0; 
    } 
    if (targetPoint.X < 0) 
    { 
     targetPoint.X = 0; 
    } 

    this.Location = targetPoint; 
    this.Refresh(); 

} 

Приведенный выше код хорошо работает на одном мониторе. Но когда родительская форма открывается на дисплее с двойным монитором, форма позиционирует себя на первом мониторе, так как GetWindowRect() возвращает прямоугольник внутри основного дисплея.

Ищите альтернативу GetWindowRect(), которая может работать на мультидисплей.

ответ

2

Используйте класс Screen, чтобы получить WorkingArea для монитора, что управление находится на:

var screen = Screen.FromControl(referenceControl); 
    var area = screen.WorkingArea; 
    var rect = referenceControl.RectangleToScreen(
     new Rectangle(0, 0, referenceControl.Width, referenceControl.Height)); 
    // etc.. 

Обратите внимание, как RectangleToScreen может помочь вам избежать PInvoke GetWindowRect().

1

Если вы советуете MSDN это четко указано, что SystemInformation.WorkingArea возвращает информацию только для основного монитора:

WorkingArea всегда возвращает рабочую область основного монитора. Если вам нужна рабочая область монитора в среде с несколькими дисплеями, вы можете вызвать одну из перегрузок Screen.GetWorkingArea.