C# Windows Forms实现点击按钮保存程序启动位置
Windows窗体应用程序:点击按钮保存窗体位置
你现有的代码已经实现了窗体位置的序列化(GeometryToString)和反序列化(GeometryFromString)逻辑,以及位置合法性校验,只需将保存逻辑绑定到按钮点击事件即可,以下是完整实现方案:
步骤1:配置保存存储(使用应用程序设置)
- 右键项目 → 属性 → 选择「设置」选项卡
- 添加一个名为
WindowGeometry的设置,类型选string,范围选「用户」,默认值留空
步骤2:修改代码实现按钮保存与启动加载
保留你原有的四个工具方法,然后添加以下事件逻辑:
// 窗体加载时,读取保存的位置并应用 private void Form1_Load(object sender, EventArgs e) { // 从Settings读取之前保存的窗体状态 string savedGeometry = Properties.Settings.Default.WindowGeometry; GeometryFromString(savedGeometry, this); } // 按钮点击时,保存当前窗体位置与状态 private void btnSaveLocation_Click(object sender, EventArgs e) { // 获取当前窗体的状态字符串 string currentGeometry = GeometryToString(this); // 保存到Settings Properties.Settings.Default.WindowGeometry = currentGeometry; // 持久化设置 Properties.Settings.Default.Save(); }
关键说明
- 原有的
GeometryFromString和GeometryToString方法无需修改,它们负责处理窗体位置、大小、状态的序列化与合法性校验 - 点击按钮时,
GeometryToString会将当前窗体的坐标、尺寸、窗口状态(正常/最大化)拼接为字符串,再保存到应用程序设置中 - 程序启动时,
Form_Load事件读取保存的字符串,通过GeometryFromString还原窗体位置,同时自动跳过异常位置(比如窗体被拖到屏幕外的情况)
原工具方法(保留即可)
public static void GeometryFromString(string thisWindowGeometry, Form formIn) { if (string.IsNullOrEmpty(thisWindowGeometry) == true) { return; } string[] numbers = thisWindowGeometry.Split('|'); string windowString = numbers[4]; if (windowString == "Normal") { Point windowPoint = new Point(int.Parse(numbers[0]), int.Parse(numbers[1])); Size windowSize = new Size(int.Parse(numbers[2]), int.Parse(numbers[3])); bool locOkay = GeometryIsBizarreLocation(windowPoint, windowSize); bool sizeOkay = GeometryIsBizarreSize(windowSize); if (locOkay == true && sizeOkay == true) { formIn.Location = windowPoint; formIn.Size = windowSize; formIn.StartPosition = FormStartPosition.Manual; formIn.WindowState = FormWindowState.Normal; } else if (sizeOkay == true) { formIn.Size = windowSize; } } else if (windowString == "Maximized") { formIn.Location = new Point(100, 100); formIn.StartPosition = FormStartPosition.Manual; formIn.WindowState = FormWindowState.Maximized; } } private static bool GeometryIsBizarreLocation(Point loc, Size size) { bool locOkay; if (loc.X < 0 || loc.Y < 0) { locOkay = false; } else if (loc.X + size.Width > Screen.PrimaryScreen.WorkingArea.Width) { locOkay = false; } else if (loc.Y + size.Height > Screen.PrimaryScreen.WorkingArea.Height) { locOkay = false; } else { locOkay = true; } return locOkay; } private static bool GeometryIsBizarreSize(Size size) { return (size.Height <= Screen.PrimaryScreen.WorkingArea.Height && size.Width <= Screen.PrimaryScreen.WorkingArea.Width); } public static string GeometryToString(Form mainForm) { return mainForm.Location.X.ToString() + "|" + mainForm.Location.Y.ToString() + "|" + mainForm.Size.Width.ToString() + "|" + mainForm.Size.Height.ToString() + "|" + mainForm.WindowState.ToString(); }
内容的提问来源于stack exchange,提问作者Csumner
相关产品推荐
相关产品推荐

