Я пытаюсь переместить форму в нижнюю / правую точку элемента управления.
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 (), которая может работать на нескольких экранах.