关于“C# 窗体程序自适应分辨率” 的一些探索

在 .NET Framework 版本 2.0 中,通过对 Windows 窗体的自动缩放进行下列更改而克服了前面提到的缺陷:

对缩放的基本支持已经移到 ContainerControl 类,这样窗体、本机复合控件和用户控件都会获得统一的缩放支持。此外,添加了 AutoScaleFactor、AutoScaleDimensions、AutoScaleMode 和 PerformAutoScale 这些新成员。

Control 类也拥有若干新成员,这些新成员允许该类参与缩放并支持在同一窗体上进行混合缩放。具体地说,是 Scale、ScaleChildren 和 GetScaledBounds 这些成员支持缩放。

作为系统字体支持的补充,已经添加了建立在屏幕分辨率基础上的缩放支持,如 AutoScaleMode 枚举所定义。此模式与 .NET Compact Framework 支持的自动缩放是兼容的,这样更易于进行应用程序的迁移。

与诸如 FlowLayoutPanel 和 TableLayoutPanel 等布局管理器的兼容性已经添加到自动缩放的实现中。

缩放比例因子现在表示为浮点值,通常使用 SizeF 结构,这样实际上已经消除了舍入误差。

 

具体示例代码如下:

   

   private void Form1_Load(object sender, EventArgs e)
        {
            LoadForm(sender, e);

          // do some other local here for you application

            AutoScale(this);
        }

 

   void LoadForm(object sender, EventArgs e)
        {
            //这里是不同的分辨率设置控件的显示
            this.Tag = 622 + "," + 527;
            string[] tmp = ((Form)sender).Tag.ToString().Split(',');
            float width = (float)((Form)sender).Width / (float)Convert.ToInt16(tmp[0]);
            float heigth = (float)((Form)sender).Height / (float)Convert.ToInt16(tmp[1]);

            ((Form)sender).Tag = ((Form)sender).Width.ToString() + "," + ((Form)sender).Height;

            foreach (Control control in ((Form)sender).Controls)
            {
                control.Scale(new SizeF(width, heigth));

            }

        }


        //这里是让所有的控件随窗体的变化而变化
        public void AutoScale(Form frm)
        {
            frm.Tag = frm.Width.ToString() + "," + frm.Height.ToString();
            frm.SizeChanged += new EventHandler(Form1_SizeChanged);
        }

 

  void Form1_SizeChanged(object sender, EventArgs e)
        {
            try
            {
                tmp = ((Form)sender).Tag.ToString().Split(',');
                if ((int)((Form)sender).Width > 200)
                {
                    float width = (float)((Form)sender).Width / (float)Convert.ToInt16(tmp[0]);
                    float heigth = (float)((Form)sender).Height / (float)Convert.ToInt16(tmp[1]);

                    ((Form)sender).Tag = ((Form)sender).Width.ToString() + "," + ((Form)sender).Height;

                    foreach (Control control in ((Form)sender).Controls)
                    {
                        control.Scale(new SizeF(width, heigth));
                      }
                }
            }
            catch           {

                  // log your exception here

                }

        }


 

 

 

你可能感兴趣的:(.NET,WinForm,c#,float,object,exception,application,.net)