前言:
当winform的窗体放大缩小时,希望窗体内的控件可以随着窗体的放大缩小,等比例的也随之改变,一般的想法是根据窗体的改变比例,将控件也等比例放大缩小,这个方法理论上应该可行,但是按比例计算会有精度损失差值,这个随着放大缩小的次数,控件也会发生偏移性改变。我个人认为比较可行的是按整型计算的方式,这样便不会有精度损失差值的问题。
思路:
窗体放大或缩小时,首先需要合计清楚窗体有多少控件需要随着改变
当窗体改变后,此时窗体的长高和原来的长高有一个差值(X,Y)
用X/Y和需要调整的控件数(按长或高数)进行模运算,之后X/Y减去得到的余数值,再除以控件数,求得窗体放大或缩小的调整值N,控件需要调整大小或位置只需要加上N*控件位置值(上至下1~n 或 左至右 1~n,如下图1,2,3)就可以了(放大N为正整数,缩小N为负整数)
原理是窗体一个来回的放大缩小,模运算的余数的绝对值是相等的
案例截图:
放大前:
放大后:
多次来回放大缩小后:
自己尝试......
案例此功能的代码:
private void Form1_Resize(object sender, EventArgs e) { int newX = this.Width - X; //X是窗体初始的大小 int newY = this.Height - Y; //Y是窗体初始的大小 //int newX2 = newX % 3; //3是需要放大缩小的控件数,此项目只放大缩小3个chart,其它的则只需要改变位置; int newY2 = newY % 3; //int newX3 = newX - newX2; int newY3 = newY - newY2; //int newX4 = newX3 / 3; int newY4 = newY3 / 3;
chartNiu.Width = XNiu + newX; chartNiu.Height = YNiu + newY4; label6.Top = label6t + newY4; //label6.Left = label6l + newY; textBoxZhuan.Top = textboxZhuant + newY4; //textboxZhuanl = textBoxZhuan.Left; label5.Top = label5t + newY4; //label5l = label5.Left; chartZhuan.Width = XZhuan + newX; chartZhuan.Height = YZhuan + newY4; chartZhuan.Top = TZhuan + newY4; label8.Top = label8t + 2*newY4; //label8l = label8.Left; textBoxGong.Top = textboxGongt + 2*newY4; //textboxGongl = textBoxGong.Left; label7.Top = label7t + 2*newY4; //label7l = label7.Left; chartGong.Width = XGong + newX; chartGong.Height = YGong + newY4; chartGong.Top = TGong + 2*newY4; listBoxMessage.Height = Ylist + 3*newY4; }