请选择 进入手机版 | 继续访问电脑版

无忧编程_ASP.NET  / C# / PHP 程序员的软件世界

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1628|回复: 0

WinForm中窗体resize的时候对于控件位置的控制的案例分享

[复制链接]

381

主题

412

帖子

1713

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1713
发表于 2018-2-26 15:57:29 | 显示全部楼层 |阅读模式
WinForm中窗体resize的时候对于控件位置的控制的案例分享
如果要使控件随着窗体大小的变化而变化,就要把窗体设置成dock模式。非dock模式下,最大化窗体的时候,控件的大小以及位置是没有任何变化的。但是dock模式下,控件的大小又不好控制,那么我们可以自己编写代码,通过控制各个控件的Point位置来自定义控件的大小以及位置。比如说下边的这个窗口,希望能够在用鼠标拉大或者缩小窗体的大小的时候,左右两边的TreeView框和中间的两个按钮能够随着主窗体的变化和适时的调整自己的位置和大小。当主窗体宽度增加的时候,要把增加的宽度平均分给这两个TreeView,因为左边的TreeView变宽了,所以,两个button以及右边的TreeView的位置也就变了。这里只是用宽度来作为例子,高度的算法和宽度是一致的。设置一个变量来实时记录窗体的宽度,然后通过这个变量和变化后的窗体宽度来算出窗体宽度变化的值。
[C#] 纯文本查看 复制代码
    public partial class QRGReportPrintForm : Form
    {
        private int width;//记录变化前的Form的宽度
        private int height;
        

        public Form1()
        {
            InitializeComponent();

            width = this.Width;
            height = this.Height;
        }

        private void Form1_SizeChanged(object sender, EventArgs e)
        {
            //推导出变化了的宽度值,正值说明变大了,负值说明变小了
            int widthChanged = this.Width - width;
            int heightChanged = this.Height - height;
            //因为button只需要向左右偏移,所以在Y轴上就没有改变,继续保留了原来的大小
            this.btn1.Location = new Point(this.btn1.Location.X + widthChanged / 2, this.btn1.Location.Y);
            this.btn2.Location = new Point(this.btn2.Location.X + widthChanged / 2, this.btn2.Location.Y);
            this.treeView1.Width += widthChanged / 2;//左边的TreeView的位置是不需要改变的,只是改变了其宽度。
            this.treeView1.Height += heightChanged;
            //右边的TreeView不仅宽度要变宽,因为前边的空间位置变了大小变了,所以这个TreeView的位置也要左右偏移
            this.treeView2.Location = new Point(this.treeView2.Location.X + widthChanged / 2, this.treeView2.Location.Y);
            this.treeView2.Width += widthChanged / 2;
            this.treeView2.Height += heightChanged;
            this.width = this.Width;
            this.height = this.Height;
        }
    }

上边的代码基本上能够完成需要的功能。即当用户改变窗体大小的时候,相应的部分就会跟着变化。但是这里的算法有一点不足,就是当变化很小的时候,Location以及Width都是以int值作为参数的,如果widthChanged=1,那么widthChanged / 2 = 0, 此时是没有任何变化的,如果用户始终慢慢拉大窗口,那么不断触发SizeChanged事件,但是每次widthChanged都是1,结果就是一直没有变化。这时,我们可以找一个int widthRepository来存储这些不能正好整除2的widthChanged多出来的1,然后等到widthRepository凑齐2个后,就更新到各个控件中。其实,当用户拉动窗体大小的时候,是一个不断的触发SizeChanged事件的过程,只是有时候Width变化是2,有时候是3,有时候1,这个值不会太大,但是也不确定。只要我们把其多余的部分记录下来,零存争取,凑够了2,就更新到控件上。
[C#] 纯文本查看 复制代码
    public partial class QRGReportPrintForm : Form
    {
        private int width;//记录变化前的Form的宽度
        private int height;
        

        public Form1()
        {
            InitializeComponent();

            width = this.Width;
            height = this.Height;
        }

        private void Form1_SizeChanged(object sender, EventArgs e)
        {
            int widthChanged = this.Width - width; 
            if (widthChanged%2 != 0)
              {
                widthRepository = widthRepository + 1;
                widthChanged = widthChanged - 1;
              }
            if (widthRepository == 2)
              {
                widthChanged = widthChanged + 2;
                widthRepository = 0;
              }
            int heightChanged = this.Height - height;
            this.btn1.Location = new Point(this.btn1.Location.X + widthChanged / 2, this.btn1.Location.Y); 
            this.btn2.Location = new Point(this.btn2.Location.X + widthChanged / 2, this.btn2.Location.Y);
            this.treeView1.Width += widthChanged / 2; 
            this.treeView1.Height += heightChanged;
            this.treeView2.Location = new Point(this.treeView2.Location.X + widthChanged / 2, this.treeView2.Location.Y);
            this.treeView2.Width += widthChanged / 2;
            this.treeView2.Height += heightChanged;
            this.width = this.Width;
            this.height = this.Height;
        }
    }

该例子中用到的Form


文章来自:http://blog.csdn.net/sundacheng1989/article/details/16946041


windows .net(C#+MSSQL) linux(php+mysql)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|软件编程 ( 鄂ICP备11006601号鄂公网安备 42011102001337号 |

GMT+8, 2018-12-14 19:21 , Processed in 0.147972 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表