在进行最大化的界面过程中,会引发到界面空间闪烁问题
1.界面自适应代码 在Form类文件中
全局变量X,Y
private float X; private float Y;
具体的控件自适应方法
private void setTag(Control cons) { foreach (Control con in cons.Controls) { con.Tag = con.Width + ":" + con.Height + ":" + con.Left + ":" + con.Top + ":" + con.Font.Size; if (con.Controls.Count > 0) setTag(con); } } private void setControls(float newx, float newy, Control cons) { foreach (Control con in cons.Controls) { string[] mytag = con.Tag.ToString().Split(new char[] { ':' }); float a = Convert.ToSingle(mytag[0]) * newx; con.Width = (int)a; a = Convert.ToSingle(mytag[1]) * newy; con.Height = (int)(a); a = Convert.ToSingle(mytag[2]) * newx; con.Left = (int)(a); a = Convert.ToSingle(mytag[3]) * newy; con.Top = (int)(a); Single currentSize = Convert.ToSingle(mytag[4]) * Math.Min(newx, newy); con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit); if (con.Controls.Count > 0) { setControls(newx, newy, con); } } }
点击界面form的事件Load和Resize
private void Cat_Pump_Form_Load(object sender, EventArgs e) { //--------------------------------控件大小随窗体大小变化 this.Resize += new EventHandler(Cat_Pump_Form_Resize); X = this.Width; Y = this.Height; setTag(this); Cat_Pump_Form_Resize(new object(), new EventArgs()); //---------------------------------控件大小随窗体大小变化 } private void Cat_Pump_Form_Resize(object sender, EventArgs e) { float newx = (this.Width) / X; float newy = this.Height / Y; setControls(newx, newy, this); this.Text = this.Width.ToString() + " " + this.Height.ToString(); }
2. 界面刷新闪烁问题
开启双缓冲和禁止清除背景
重新绘制控件
class MyPanel:Panel { public MyPanel() { SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.SupportsTransparentBackColor, true); } }
效果最大化切换速度变快,但是仍有闪烁。
双缓冲还是有用的,在更新不是很频繁且控件内含元素不是特别多的时候。
一旦元素过多,每次更新时间都比较长,即便使用了双缓冲,仍解决不了闪烁问题。
只需要在类文件里添加这样一个复写方法:
protected override CreateParams CreateParams { get { CreateParams cp = base.CreateParams; cp.ExStyle |= 0x02000000; return cp; } }
ok,解决。