C# winform根据屏幕大小自动缩放

主页 > 新闻资讯 > 软件开发资讯 > C++编程C++软件开发 >

C# winform根据屏幕大小自动缩放

1  Form基类

 

[csharp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.ComponentModel;  
  4. using System.Data;  
  5. using System.Drawing;  
  6. using System.Linq;  
  7. using System.Text;  
  8. using System.Windows.Forms;  
  9. using System.Runtime.InteropServices;  
  10. using System.IO;  
  11. using System.Reflection;  
  12.   
  13. /// <summary>  
  14. /// 用法:  
  15. /// 1 新建Form窗体,继承BaseForm  
  16. /// 2 新Form添加panel, dock = fill;  
  17. /// 3 新Form load事件添加   
  18. /// </summary>  
  19. public class BaseForm : Form  
  20. {  
  21.     #region 属性  
  22.     double formWidth, formHeight;//初始化大小  
  23.     double xScale, yScale;//缩?放比括例  
  24.     //控?件t坐?标括,?大洙小?,?字?体?  
  25.     Dictionary<stringstring> controlInfo = new Dictionary<stringstring>();  
  26.     #endregion  
  27.  
  28.     #region 方?法  
  29.   
  30.     public void RemoveVirtualBorder(object obj)  
  31.     {  
  32.         MethodInfo methodinfo = obj.GetType().GetMethod("SetStyle", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod);  
  33.         methodinfo.Invoke(obj, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.InvokeMethod, nullnew object[] { ControlStyles.Selectable, false }, Application.CurrentCulture);  
  34.   
  35.     }  
  36.     /// <summary>  
  37.     /// 获?取?原-始?大洙小?  
  38.     /// </summary>  
  39.     /// <param name="CrlContainer"></param>  
  40.     protected void GetInitInfo(Control CrlContainer)  
  41.     {  
  42.         if (CrlContainer.Parent == this)  
  43.         {  
  44.             formWidth = Convert.ToDouble(CrlContainer.Width);  
  45.             formHeight = Convert.ToDouble(CrlContainer.Height);  
  46.         }  
  47.   
  48.         foreach (Control c in CrlContainer.Controls)  
  49.         {  
  50.             if (c.Name.Trim() != "")  
  51.                 controlInfo.Add(c.Name, (c.Left + c.Width / 2) + "," + (c.Top + c.Height / 2) + "," +  
  52.                     c.Width + "," + c.Height + "," + c.Font.Size);  
  53.             if ((c as UserControl) == null && c.Controls.Count > 0)  
  54.                 GetInitInfo(c);  
  55.             RemoveVirtualBorder(c);  
  56.   
  57.         }  
  58.     }  
  59.   
  60.     /// <summary>  
  61.     /// 获?取?缩?放?比括例  
  62.     /// </summary>  
  63.     /// <param name="CrlContainer"></param>  
  64.     private void ControlsChangeInit(Control CrlContainer)  
  65.     {  
  66.         xScale = (Convert.ToDouble(CrlContainer.Width)) / formWidth;  
  67.         yScale = (Convert.ToDouble(CrlContainer.Height)) / formHeight;  
  68.     }  
  69.   
  70.     /// <summary>  
  71.     /// 缩?放?控?件t  
  72.     /// </summary>  
  73.     /// <param name="CrlContainer"></param>  
  74.     private void ControlsChange(Control CrlContainer)  
  75.     {  
  76.         double[] pos = new double[5];//存?放?当獭前°控?件t关?键ü值μ。£  
  77.   
  78.         foreach (Control c in CrlContainer.Controls)  
  79.         {  
  80.             if (c.Name.Trim() != "")  
  81.             {  
  82.                 if ((c as UserControl) == null && c.Controls.Count > 0)  
  83.                     ControlsChange(c);  
  84.                 string[] strTmp = controlInfo[c.Name].Split(',');  
  85.                 for (int i = 0; i < 5; i++)  
  86.                 {  
  87.                     pos[i] = Convert.ToDouble(strTmp[i]);  
  88.                 }  
  89.                 double cWidth = pos[2] * xScale;  
  90.                 double cHeigth = pos[3] * yScale;  
  91.                 c.Left = Convert.ToInt32(pos[0] * xScale - cWidth / 2);  
  92.                 c.Top = Convert.ToInt32(pos[1] * yScale - cHeigth / 2);  
  93.                 c.Width = Convert.ToInt32(cWidth);  
  94.                 c.Height = Convert.ToInt32(cHeigth);  
  95.                 double tmp;  
  96.                 if (xScale == 0 && yScale == 0)  
  97.                     tmp = 1;  
  98.                 else  
  99.                     tmp = Math.Min(xScale, yScale);  
  100.   
  101.                 c.Font = new Font(c.Font.Name, float.Parse((pos[4] * tmp).ToString()));  
  102.             }  
  103.         }  
  104.     }  
  105.   
  106.     protected override void OnSizeChanged(EventArgs e)  
  107.     {  
  108.         base.OnSizeChanged(e);  
  109.         if (controlInfo.Count > 0)  
  110.         {  
  111.             ControlsChangeInit(this.Controls[0]);  
  112.             ControlsChange(this.Controls[0]);  
  113.         }  
  114.     }  
  115.     #endregion  
  116. }  



上一篇: C++内存模型   下一篇:C++中std::map的使用