Si vous avez plusieurs moniteurs, je crois que les dimensions de l'interface utilisateur de l'écran sont simplement plus grandes. Ainsi, l'approche normale "1 moniteur" de stockage et de restauration de l'emplacement fonctionnera simplement. Je n'ai pas essayé parce que je suis loin de mon deuxième écran, mais cela ne devrait pas être difficile à tester. La façon dont vous avez posé la question semble indiquer que vous ne l'avez pas testé.
Votre deuxième exigence signifie que vous devrez vérifier les dimensions maximales de l'écran lors de la restauration de l'application, puis repositionner si nécessaire. Pour faire cette dernière chose, j'utilise ce code :
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);
}
J'appelle cette méthode lors de la restauration du formulaire. Je stocke la géométrie de l'écran dans le registre à la fermeture du formulaire, puis je lis la géométrie à l'ouverture du formulaire. Je récupère les limites, mais je contrains ensuite les limites restaurées à l'écran actuel, en utilisant la méthode ci-dessus.
Économisez sur la fermeture :
// 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));
Restaurer à l'ouverture du formulaire :
// 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]));
}