You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# Windows Forms实现点击按钮保存程序启动位置

Windows窗体应用程序:点击按钮保存窗体位置

你现有的代码已经实现了窗体位置的序列化(GeometryToString)和反序列化(GeometryFromString)逻辑,以及位置合法性校验,只需将保存逻辑绑定到按钮点击事件即可,以下是完整实现方案:

步骤1:配置保存存储(使用应用程序设置)

  1. 右键项目 → 属性 → 选择「设置」选项卡
  2. 添加一个名为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 02:35:21