不同分辨率下的Windows窗体大小问题

本文关键字:窗体 问题 Windows 分辨率 | 更新日期: 2023-09-27 17:50:50

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

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

请详细说明您的答案,因为我对windows窗体开发相当新鲜。

谢谢

不同分辨率下的Windows窗体大小问题

你可以在load事件中循环窗体上的每个控件,并重新缩放它们和窗体本身,缩放是你设计的窗体的屏幕尺寸与应用程序正在运行的屏幕尺寸之间的比例。

    //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();

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

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

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