Если у вас несколько мониторов, я считаю, что размеры экранного интерфейса просто больше. Таким образом, обычный подход «1 монитор» хранения и восстановления местоположения будет просто работать. Я не пробовал это, потому что я далеко от моего второго монитора, но это не должно быть трудно проверить. То, как вы задали вопрос, похоже, вы его не проверяли.
Ваше второе требование будет означать, что вам придется проверять максимальные размеры при восстановлении приложения, а затем перемещать при необходимости. Чтобы сделать этот последний бит, я использую этот код:
private System.Drawing.Rectangle ConstrainToScreen(System.Drawing.Rectangle bounds)
{
Screen screen = Screen.FromRectangle(bounds);
System.Drawing.Rectangle workingArea = screen.WorkingArea;
int width = Math.Min(bounds.Width, workingArea.Width);
int height = Math.Min(bounds.Height, workingArea.Height);
// mmm....minimax
int left = Math.Min(workingArea.Right - width, Math.Max(bounds.Left, workingArea.Left));
int top = Math.Min(workingArea.Bottom - height, Math.Max(bounds.Top, workingArea.Top));
return new System.Drawing.Rectangle(left, top, width, height);
}
Я вызываю этот метод при восстановлении формы. Я сохраняю геометрию экрана в реестре при закрытии формы, а затем читаю геометрию при открытии формы. Я получаю границы, но затем ограничиваю восстановленные границы фактическим текущим экраном, используя метод выше.
Сохранить при закрытии:
// store the size of the form
int w = 0, h = 0, left = 0, top = 0;
if (this.Bounds.Width < this.MinimumSize.Width || this.Bounds.Height < this.MinimumSize.Height)
{
// The form is currently minimized.
// RestoreBounds is the size of the window prior to last minimize action.
w = this.RestoreBounds.Width;
h = this.RestoreBounds.Height;
left = this.RestoreBounds.Location.X;
top = this.RestoreBounds.Location.Y;
}
else
{
w = this.Bounds.Width;
h = this.Bounds.Height;
left = this.Location.X;
top = this.Location.Y;
}
AppCuKey.SetValue(_rvn_Geometry,
String.Format("{0},{1},{2},{3},{4}",
left, top, w, h, (int)this.WindowState));
Восстановление в открытой форме:
// restore the geometry of the form
string s = (string)AppCuKey.GetValue(_rvn_Geometry);
if (!String.IsNullOrEmpty(s))
{
int[] p = Array.ConvertAll<string, int>(s.Split(','),
new Converter<string, int>((t) => { return Int32.Parse(t); }));
if (p != null && p.Length == 5)
this.Bounds = ConstrainToScreen(new System.Drawing.Rectangle(p[0], p[1], p[2], p[3]));
}