C# WINFORM开发闪烁自适应的问题

在进行最大化的界面过程中,会引发到界面空间闪烁问题

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,解决。

猜你喜欢

转载自www.cnblogs.com/gzoof/p/9633302.html
今日推荐