Альтернатива GetWindowRect () для использования нескольких мониторов? - PullRequest
0 голосов
/ 03 апреля 2012

Я пытаюсь переместить форму в нижнюю / правую точку элемента управления.

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();

}

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

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

Ответы [ 2 ]

2 голосов
/ 03 апреля 2012

Используйте класс 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 может помочь вам избежать необходимости вызывать GetWindowRect ().

1 голос
/ 03 апреля 2012

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

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

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