C#实现窗体中的各个控件同比自动放缩大小

实现方式主要是利用panel控件为主题,对于每个控件的大小位置和字体这几个属性进行记录,然后根据窗体改变的大小同时放缩。

简要步骤如下:

1、创建C#窗体程序项目。
2、Panel放置到窗体。
3、设置属性dock为fill。
4、注意MinnumSize不能设置为0, 改成大于0都行。

代码如下:

public partial class FrmDemo : Form 
    { 
        double dFrmWidth; 
        double dFrmHeight; 
        double dZoomHorizon; 
        double dZoomVerticality; 
        Dictionary<string, string> dicControlsAttribute = new Dictionary<string, string>(); 
 
        protected void GetAllInitiateContrlInfo(Control CrlContainer) 
        { 
            if (CrlContainer.Parent == this) 
            { 
                dFrmWidth = Convert.ToDouble(CrlContainer.Width); 
                dFrmHeight = Convert.ToDouble(CrlContainer.Height); 
            } 
            foreach (Control item in CrlContainer.Controls) 
            { 
                if (item.Name.Trim() != "") 
                    dicControlsAttribute.Add(item.Name, (item.Left + item.Width / 2) + "," + (item.Top + item.Height / 2)  
                                             + "," + item.Width + "," + item.Height + "," + item.Font.Size); 
                if ((item as UserControl) == null && item.Controls.Count > 0) 
                    GetAllInitiateContrlInfo(item); 
            } 
        } 
 
        private void ChangeControlsInitiate(Control CrlContainer) 
        { 
            dZoomHorizon = (Convert.ToDouble(CrlContainer.Width) / dFrmWidth); 
            dZoomVerticality = (Convert.ToDouble(CrlContainer.Height) / dFrmHeight); 
        } 
         
        private void ChangeCurrentControlAttr(Control CrlContainer) 
        { 
            double[] dPosition = new double[5]; 
            foreach (Control item in CrlContainer.Controls) 
            { 
                if (item.Name.Trim() != "") 
                { 
                    if ((item as UserControl) == null && item.Controls.Count > 0) 
                        ChangeCurrentControlAttr(item); 
                    string[] strs = dicControlsAttribute[item.Name].Split(','); 
                    for (int j = 0; j < 5; j++) 
                    { 
                        dPosition[j] = Convert.ToDouble(strs[j]); 
                    } 
                    double itemWidth = dPosition[2] * dZoomHorizon; 
                    double itemHeight = dPosition[3] * dZoomVerticality; 
                    item.Left = Convert.ToInt32(dPosition[0] * dZoomHorizon - itemWidth / 2); 
                    item.Top = Convert.ToInt32(dPosition[1] * dZoomVerticality - itemHeight / 2); 
                    item.Width = Convert.ToInt32(itemWidth); 
                    item.Height = Convert.ToInt32(itemHeight); 
                    //item.Font = new Font(item.Font.Name, float.Parse 
                    //((dPosition[4] * Math.Min(dZoomHorizon, dZoomVerticality)).ToString())); 
                    //字体也可以实现同比放缩。 
                     } 
            } 
        } 
        protected override void OnSizeChanged(EventArgs e) 
        { 
            base.OnSizeChanged(e); 
            if (dicControlsAttribute.Count > 0) 
            { 
                ChangeControlsInitiate(this.Controls[0]); 
                ChangeCurrentControlAttr(this.Controls[0]); 
            } 
        }  
 
        public FrmDemo() 
        { 
            InitializeComponent(); 
            GetAllInitiateContrlInfo(this.Controls[0]);//构造函数里面调用即可。 
        } 
}

5、效果测试

(0)

相关推荐

  • C#中登录窗体和欢迎窗体关闭方法分析

    本文实例分析了C#中登录窗体和欢迎窗体关闭方法.分享给大家供大家参考.具体分析如下: 在c#的winform编程中,我们经常会做登录窗体或欢迎窗体,并把他们作为启动窗体.   但是,我们有可能会遇到一些问题.   请看下面的代码: 复制代码 代码如下: private void button1_Click(object sender, EventArgs e) {     this.Close();     new Form2().Show(); } 这段代码想让form1中的button1在点

  • C#定时关闭窗体实例

    本文实例讲述了C#定时关闭窗体的方法,分享给大家供大家参考.具体方法如下: 复制代码 代码如下: public partial class Form2 : Form  {  private System.Timers.Timer timer = new System.Timers.Timer(); public Form2()  {      InitializeComponent();      InitStatus();      timer.Interval = 4000;      ti

  • C#设置窗体最大化且不遮挡任务栏的方法

    本文实例讲述了C#设置窗体最大化且不遮挡任务栏的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: /// <summary> /// 设置窗体最大化(不遮挡任务栏) /// </summary> /// <param name="frm"></param> public virtual void SetFormMax(Form frm) {     frm.Top = 0;     frm.Left = 0;    

  • C# Winform实现捕获窗体最小化、最大化、关闭按钮事件的方法

    本文实例讲述了C# Winform实现捕获窗体最小化.最大化.关闭按钮事件的方法,主要是通过重写WndProc来实现的.分享给大家供大家参考.具体方法如下: 主要功能代码如下: const int WM_SYSCOMMAND = 0x112; const int SC_CLOSE = 0xF060; const int SC_MINIMIZE = 0xF020; const int SC_MAXIMIZE = 0xF030; protected override void WndProc(ref

  • C#全局热键设置与窗体热键设置实例

    本文实例讲述了C#全局热键设置与窗体热键设置,分享给大家供大家参考.具体实现方法如下: 1.窗体热键 首先要设置主窗体KeyPreview为true,可直接在属性中进行设置, 或者在窗体加载中设置: this.KeyPreview = true; 然后添加窗体KeyDown事件,如下: 复制代码 代码如下: private void FrmMain_KeyDown(object sender, KeyEventArgs e) {     if (e.Alt && e.Shift &

  • C#窗体传值实例汇总

    本文实例汇总了C#窗体传值的方法.分享给大家供大家参考.具体方法如下: 1.静态变量传值,非常简单适合简单的非实例的 复制代码 代码如下: public calss form1:Form{     public static int A; } public class form2:Form{    form1.A=1; } 2.委托传值 复制代码 代码如下: public class form1:Form{   public int A{get;set;}   public static Act

  • C#入门之窗体的简单用法实例

    本文实例讲述了C#窗体的简单用法.分享给大家供大家参考.具体分析如下: 今天简单的学习了一些控件和事件的运用.没有什么很全面的理论,所以今天就总结下所写的程序.一个简单的注册页面程序 注册页面程序   要求:   1. 修改所有的控件Name 属性 2. 登录事件   检测各个控件是否为空,如果是空  弹出注册失败    如果成功  则显示新窗体 并且 新窗体上面显示    "XXX你好! 欢迎来学习.Net" 走马灯形式 密码输入三次那么登录按钮不可用  3分钟之后可用 把注册信息的

  • C#实现随鼠标移动窗体实例

    本文实例讲述了c#实现随鼠标移动窗体的方法,分享给大家供大家参考. 具体实现方法如下: private void MainForm_Load(object sender, EventArgs e) { //绑定事件 MouseMove += Form_MouseMove; MouseDown += Form_MouseDown; } private Point _mousePoint; private void Form_MouseMove(object sender, MouseEventAr

  • C#实现窗体中的各个控件同比自动放缩大小

    实现方式主要是利用panel控件为主题,对于每个控件的大小位置和字体这几个属性进行记录,然后根据窗体改变的大小同时放缩. 简要步骤如下: 1.创建C#窗体程序项目. 2.Panel放置到窗体. 3.设置属性dock为fill. 4.注意MinnumSize不能设置为0, 改成大于0都行. 复制代码 代码如下: public partial class FrmDemo : Form      {          double dFrmWidth;          double dFrmHeig

  • WPF中引入WindowsForms控件的方法

    本文实例讲述了WPF中引入WindowsForms控件的方法.分享给大家供大家参考,具体如下: 环境: [1]WindowsXP with SP3 [2]VS2008 with SP1 正文: Step1:在现有工程中引入Windows Forms 鼠标右键[References]->选择[Add Reference]->[.NET]标签页 加入[WindowsFormsIntegration]和[System.Windows.Forms]两项 Step2:在XAML文件里加入 [S2-1]加

  • Android开发实现AlertDialog中View的控件设置监听功能分析

    本文实例讲述了Android开发实现AlertDialog中View的控件设置监听功能.分享给大家供大家参考,具体如下: 之前给弹出的AlertDialog中的控件设置监听时,老是报空指针异常,之所以报空指针异常,是因为我findViewById写的有问题,因为我们需要给弹出框中的控件设置监听,直接用findViewById是找不到弹出框中的控件的,需要利用Dialog.findViewById或者利用你找到的弹出框中的View,然后view.findViewById;具体看下面代码 packa

  • ASP.NET中的Web控件介绍

    目录 一.HTML控件 二.HTML服务器控件 三.Web服务器控件 Web服务器控件和html服务器控件的区别 四.Web用户控件 五.Web自定义控件 1.用户控件和自定义控件的异同 2.实现自定义控件 3.复合自定义控件 1.ASP.NET登录控件的开发 2.ASP.NET登录控件的使用 4.自定义分页控件 一.HTML控件 就是我们通常的说的html语言标记,这些语言标记在已往的静态页面和其他网页里存在,不能在服务器端控制的,只能在客户端通过javascript等程序语言来控制. <in

  • ASP.NET中使用用户控件

    一.概述: 与WEB窗体页相同,程序员可以使用任何文本编辑器创作用户控件,或者使用代码隐藏类开发用户控件.此外,与WEB窗体页一样,用户控件可以在第一次请求时被编译并存储在服务器内存中,从而缩短以后请求的响应时间.但与WEB窗体页不同的是,不能独立地请求用户控件,用户控件必须包括在WEB窗体页内才能使用.用户控件减少了代码的重用性,一个用户控件就是一个简单的ASP.NET页面,不过他是包含在另一个ASP.NET页面的, 用户控件文件有如下特点: 扩展名为:.ascx. 用户控件中没有“@ pag

  • C#使用DevExpress中的SplashScreenManager控件实现启动闪屏和等待信息窗口

    DevExpress中SplashScreenManager这个控件的主要作用就是显示程序集加载之前的进度条显示和进行耗时操作时候的等待界面. 一.SplashScreenManager控件的使用 1.新建一个Windows窗体,在工具栏中找到这个控件,把它拖放到Windows窗体中,开发工具默认会在窗体下边显示这个不可视控件. 2.SplashScreenManager控件只是作为加载界面的统一管理器,我们要使用加载界面,需要自行创建加载界面. 找到这个控件,点击右上角的三角图标,出现如下显示

  • Asp.net 中使用GridView控件实现Checkbox单选

    在GridView控件中,第0列有放一个CheckBox控件,现想实现对CheckBox进行单选. 先看看效果: 在ASPX页面,可以这样做: 有一点注意的是需要使用OnRowCreated事件. 在ASPX.cs代码里,实现上面OnRowCreated事件: 上面有个事件委托: Ok,特简单的.全部使用服务端来实现,或许前端js也能实现. 以上所述是小编给大家介绍的Asp.net 中使用GridView控件实现Checkbox单选,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回

  • asp.net中使用 Repeater控件拖拽实现排序并同步数据库字段排序

    数据库表中有一个单位表,里面包括ID.Name.Order等字段,现在有个后台管理功能,可以设置这些单位在某些统计表格中的先后显示顺序,于是想到用拖拽方式实现,这样操作起来更简便. 使用了GifCam软件做了一个示例动画,效果如下图所示: 于是就动手起来,发现jquery.ui中提供sortable函数,可用于排序,界面中从数据库绑定的单位使用Repeater控件,下面简单介绍下主要步骤: 1.项目中使用到的jquery-1.7.2.min.js和jquery-ui.min.js请点击进行下载,

  • WinForm中DataGridView折叠控件【超好看】

    刚到一家新公司,领导下发任务要用cs系统做一个表格折叠显示,这真是把我难倒了,自己工作6年一直以来都是做BS的系统.这如果在BS里面那太简单了,JqGrid默认都自带,可是DataGridview不支持折叠啊.自己一点经验没有,怎么办呢?于是上网搜了相关视频,资料,开始学习起来.最后借鉴源码封了这么一个东西,发出来分享下,也能让自己加深印象. 首先不多说,上图.如果大家感谢还不错,请继续往下阅读: 大概的效果就是这样. 上代码. 1.首先重写DataGridview,代码如下: public c

  • Android中findViewById获取控件返回为空问题怎么解决

    在Android程序中,有时候需要加载非原来activity中xml布局中的控件,来使Android程序的界面更加丰富. 我本身是在使用ViewFlipper中遇到的问题. public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); inflater=(LayoutInflater)getSystemService(LAYO

随机推荐