【问题标题】:Windows Form size issue on different resolutions不同分辨率下的 Windows 窗体大小问题
【发布时间】:2014-04-24 04:29:55
【问题描述】:

我是窗体开发的新手,开发了一些窗体后发现窗体在不同分辨率下显示不正确,窗体在某些分辨率下超出屏幕

我想知道是否有任何设置可以根据分辨率自动调整表单,或者有什么技巧或一些技术可以用来设计表单。

请详细说明你的答案,因为我对 Windows 窗体开发很陌生。

谢谢

【问题讨论】:

  • I am newbie in window forms development - 不建议将 winforms 用于任何新项目,仅用于维护旧版应用程序。如果你不需要维护任何遗留应用程序,那么绝对没有必要在 2014 年开始学习 winforms。
  • 我强烈推荐 WPF 而不是 winforms。它默认独立于分辨率,具有更强大的功能,更易于定制的功能、样式、模板、严肃的 DataBinding,并且它允许 UI 和业务逻辑之间更大的分离。

标签: c# winforms


【解决方案1】:

您可以循环加载事件中表单上的每个控件,并重新缩放它们和表单本身,比例是您设计表单的屏幕尺寸与屏幕尺寸之间的比率该应用正在运行。

    //this is a utility static class
    public static class Utility{


    public static void fitFormToScreen(Form form, int h, int w)
    {

        //scale the form to the current screen resolution
        form.Height = (int)((float)form.Height * ((float)Screen.PrimaryScreen.Bounds.Size.Height / (float)h));
        form.Width = (int)((float)form.Width * ((float)Screen.PrimaryScreen.Bounds.Size.Width / (float)w));

        //here font is scaled like width
            form.Font = new Font(form.Font.FontFamily, form.Font.Size * ((float)Screen.PrimaryScreen.Bounds.Size.Width / (float)w));

        foreach (Control item in form.Controls)
        {
            fitControlsToScreen(item, h, w);
        }

    }

    static void fitControlsToScreen(Control cntrl, int h, int w)
    {
        if (Screen.PrimaryScreen.Bounds.Size.Height != h)
        {

            cntrl.Height = (int)((float)cntrl.Height * ((float)Screen.PrimaryScreen.Bounds.Size.Height / (float)h));
            cntrl.Top = (int)((float)cntrl.Top * ((float)Screen.PrimaryScreen.Bounds.Size.Height / (float)h));

        }
        if (Screen.PrimaryScreen.Bounds.Size.Width != w)
        {

            cntrl.Width = (int)((float)cntrl.Width * ((float)Screen.PrimaryScreen.Bounds.Size.Width / (float)w));
            cntrl.Left = (int)((float)cntrl.Left * ((float)Screen.PrimaryScreen.Bounds.Size.Width / (float)w));

                cntrl.Font = new Font(cntrl.Font.FontFamily, cntrl.Font.Size * ((float)Screen.PrimaryScreen.Bounds.Size.Width / (float)w));

        }

        foreach (Control item in cntrl.Controls)
        {
            fitControlsToScreen(item, h, w);
        }
    }
    }


        //inside form load event
        //send the width and height of the screen you designed the form for
        Utility.fitFormToScreen(this, 788, 1280);
        this.CenterToScreen();

【讨论】:

  • 非常感谢! :)
【解决方案2】:

这里的问题更有可能是它没有按您预期的方式工作。在 WinForms 开发中,当您设计一个表单时,您实际上是在设置它的大小。这遵循正在显示表单的机器上的默认字体大小的功能,并且与所讨论的显示器上的分辨率没有直接关系。因此,如果您设计一个包含许多控件或大型控件的大型表单,它可能在高分辨率下显示良好,但在低分辨率下就不行。为了更好地了解这种大小,请查看您的 Form1.Designer.cs 文件,您将看到为控件设置的大小值。这些大小不等于像素,但它们应该为您提供相对大小。您可能还应该在 MSDN 或其他地方研究 对话框单元

您可以编写一些代码以在表单加载事件中对该分辨率做出反应,但最终大小将部分受到您需要显示的小部件数量的限制。如果您有一个多行编辑字段、网格控件、树形控件或其他一些大部件,您可以根据当前显示分辨​​率自动调整其大小,同时调整窗口大小。但这是基于您的需要的应用程序特定决定,这就是为什么 windows 不会尝试为您自动调整大小的原因。

如上所述,WPF 提供了更灵活的表单定义模型,并且可以更灵活地重新对齐小部件,但最终,如果您的表单足够繁忙,WPF 表单在较低分辨率下也会出现同样的问题。

【讨论】:

  • 嗯,这个答案消除了我的疑虑,感谢您提供如此清晰而中肯的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-28
  • 2020-12-30
  • 2012-09-19
相关资源
最近更新 更多