我正在存储每个窗口的最后一个位置。
下次用户打开窗口时,将恢复上次的位置。
如果用户改变他的屏幕(从双屏到一个屏幕)或只是到一个更小的分辨率,窗体无处可见......
我怎样才能检测到这个?我不喜欢存储用户设置,这取决于他的环境。
提前致谢
使用System.Windows.Forms.Screen.PrimaryScreenBounds
中的属性查看屏幕的边界,将其与表单的位置/大小进行比较,并在需要的地方进行补偿。
要获取其他屏幕的边界,请使用该Screen.AllScreens
属性上的PrimaryScreen
属性来访问Screen
表示多个屏幕的其他对象。
例如,这可能就像检查Location
您要更改为的 是否在可用屏幕上一样简单:
foreach (var screen in Screen.AllScreens)
{
if (screen.Bounds.Contains(this.Location))
{
return; // on a screen, so don't update location
}
}
// not found on a screen, so assume screen was removed and move to the primary screen
this.Location = Screen.PrimaryScreen.Bounds.Location;
当然,您可以通过决定哪个屏幕比其他任何屏幕包含更多的表单(基于Bounds
)来使这变得更复杂,并以这种方式做出决定;但是,如果没有更多关于您想要什么的详细信息,我无法提出具体建议。
让我们从头开始,你想要两个设置来存储窗口的状态。我们称它们为 Location(类型 Point,默认 = 0,0)和 Size(类型 Size,默认 = 0, 0)。您希望在调整窗口大小时保存它们,避免在窗口最小化时存储状态:
protected override void OnResizeEnd(EventArgs e) {
if (this.WindowState != FormWindowState.Minimized) {
Properties.Settings.Default.Location = this.Location;
Properties.Settings.Default.Size = this.Size;
Properties.Settings.Default.Save();
}
base.OnResizeEnd(e);
}
恢复表单的 OnLoad 方法中的状态。您需要使用 Screen.FromPoint() 来查找屏幕边界。添加额外的代码以确保窗口不会变得太大并在屏幕消失时正确定位:
protected override void OnLoad(EventArgs e) {
if (Properties.Settings.Default.Size != Size.Empty) {
Screen scr = Screen.FromPoint(Properties.Settings.Default.Location);
int width = Math.Min(Properties.Settings.Default.Size.Width, scr.WorkingArea.Width);
int height = Math.Min(Properties.Settings.Default.Size.Height, scr.WorkingArea.Height);
this.Size = new Size(width, height);
if (scr.WorkingArea.Contains(Properties.Settings.Default.Location))
this.Location = Properties.Settings.Default.Location;
else this.Location = new Point(scr.Bounds.Left + (scr.Bounds.Width - width) / 2,
scr.Bounds.Top + (scr.Bounds.Height - height) / 2);
}
base.OnLoad(e);
}