问题描述
publicstructcontrolRect{publicintLeft;publicintTop;publicintWidth;publicintHeight;}publicList<controlRect>oldCtrl=newList<controlRect>();intctrlNo=0;publicvoidcontrollInitializeSize(ControlmForm){controlRectcR;cR.Left=mForm.Left;cR.Top=mForm.Top;cR.Width=mForm.Width;cR.Height=mForm.Height;oldCtrl.Add(cR);//第一个为"窗体本身",只加入一次即可AddControl(mForm);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用//this.WindowState=(System.Windows.Forms.FormWindowState)(2);//记录完控件的初始位置和大小后,再最大化//0-Normalize,1-Minimize,2-Maximize}privatevoidAddControl(Controlctl){foreach(Controlcinctl.Controls){//**放在这里,是先记录控件的子控件,后记录控件本身//if(c.Controls.Count>0)//AddControl(c);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用controlRectobjCtrl;objCtrl.Left=c.Left;objCtrl.Top=c.Top;objCtrl.Width=c.Width;objCtrl.Height=c.Height;oldCtrl.Add(objCtrl);//**放在这里,是先记录控件本身,后记录控件的子控件if(c.Controls.Count>0)AddControl(c);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用}}publicvoidcontrolAutoSize(ControlmForm){if(ctrlNo==0){//*如果在窗体的Form1_Load中,记录控件原始的大小和位置,正常没有问题,但要加入皮肤就会出现问题,因为有些控件如dataGridView的的子控件还没有完成,个数少//*要在窗体的Form1_SizeChanged中,第一次改变大小时,记录控件原始的大小和位置,这里所有控件的子控件都已经形成controlRectcR;//cR.Left=mForm.Left;cR.Top=mForm.Top;cR.Width=mForm.Width;cR.Height=mForm.Height;cR.Left=0;cR.Top=0;cR.Width=mForm.PreferredSize.Width;cR.Height=mForm.PreferredSize.Height;oldCtrl.Add(cR);//第一个为"窗体本身",只加入一次即可AddControl(mForm);//窗体内其余控件可能嵌套其它控件(比如panel),故单独抽出以便递归调用}floatwScale=(float)mForm.Width/(float)oldCtrl[0].Width;//新旧窗体之间的比例,与最早的旧窗体floathScale=(float)mForm.Height/(float)oldCtrl[0].Height;//.Height;ctrlNo=1;//进入=1,第0个为窗体本身,窗体内的控件,从序号1开始AutoScaleControl(mForm,wScale,hScale);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用}privatevoidAutoScaleControl(Controlctl,floatwScale,floathScale){intctrLeft0,ctrTop0,ctrWidth0,ctrHeight0;//intctrlNo=1;//第1个是窗体自身的Left,Top,Width,Height,所以窗体控件从ctrlNo=1开始foreach(Controlcinctl.Controls){//**放在这里,是先缩放控件的子控件,后缩放控件本身//if(c.Controls.Count>0)//AutoScaleControl(c,wScale,hScale);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用ctrLeft0=oldCtrl[ctrlNo].Left;ctrTop0=oldCtrl[ctrlNo].Top;ctrWidth0=oldCtrl[ctrlNo].Width;ctrHeight0=oldCtrl[ctrlNo].Height;//c.Left=(int)((ctrLeft0-wLeft0)*wScale)+wLeft1;//新旧控件之间的线性比例//c.Top=(int)((ctrTop0-wTop0)*h)+wTop1;c.Left=(int)((ctrLeft0)*wScale);//新旧控件之间的线性比例。控件位置只相对于窗体,所以不能加+wLeft1c.Top=(int)((ctrTop0)*hScale);//c.Width=(int)(ctrWidth0*wScale);//只与最初的大小相关,所以不能与现在的宽度相乘(int)(c.Width*w);c.Height=(int)(ctrHeight0*hScale);//ctrlNo++;//累加序号//**放在这里,是先缩放控件本身,后缩放控件的子控件if(c.Controls.Count>0)AutoScaleControl(c,wScale,hScale);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用if(ctlisDataGridView){DataGridViewdgv=ctlasDataGridView;Cursor.Current=Cursors.WaitCursor;intwidths=0;for(inti=0;i<dgv.Columns.Count;i++){dgv.AutoResizeColumn(i,DataGridViewAutoSizeColumnMode.AllCells);//自动调整列宽widths+=dgv.Columns[i].Width;//计算调整列后单元列的宽度和}if(widths>=ctl.Size.Width)//如果调整列的宽度大于设定列宽dgv.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.DisplayedCells;//调整列的模式自动elsedgv.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.Fill;//如果小于则填充Cursor.Current=Cursors.Default;}}
解决方案
解决方案二:
还需要设置什么吗
解决方案三:
窗体属性不就是可以设置么,好好看看
解决方案四:
一般设置控件上下左右的锚点就行了
解决方案五:
对啊,我记得设锚点啊
解决方案六:
设置成功以后屏幕一直闪怎么办