none
自定义控件显示闪烁问题 RRS feed

  • 常规讨论

  • 大家好!
    请问自定义控件的时候,我生成DLL,然后在窗体里面用的时候, 我用了一个定时器,每隔一秒就刷新一下我自己定义的Text属性, 该属性是用来显示在控件上的文本, 可整个控件出现了一闪一闪的抖动, 我也看过一下相关的资料, setstyle()方法,   在自定义控件里的LOAD事件里加上这个方法, 控件程序就出错, 控件代码我贴出: 
    [System.ComponentModel.Designer("System.Windows.Forms.Design.ParentControlDesigner,   System.Design ")]
        public partial class UserControl1 : UserControl
        {
            private Color starColor = SystemColors.MenuHighlight;
            private Color endColor = Color.White;
            private float   lineBrushAng = 90f;
            private Color penColor = SystemColors.MenuHighlight;
            private float penWidth = 2.0f;
            private Font leftFont = new Font("Arial", 9f, FontStyle.Regular, GraphicsUnit.Point);
            private Font rightFont = new Font("Arial", 9f, FontStyle.Regular, GraphicsUnit.Point);
            private Color leftColor = Color.Black;
            private Color rightColor = Color.Black;
            private string leftText = "UserControl1";
            private string rightText = "UserControl1";

            public UserControl1()
            {
                InitializeComponent();
            }

            /// <summary>
            /// 控件第一次加载时引发的事件
            /// </summary>
            /// <param name="sender">事件发行者的信息</param>
            /// <param name="e">事件信息</param>
            private void UserControl1_Load(object sender, EventArgs e)
            {
                this.ResizeRedraw = true;
            }

            #region   //控件新增属性值定义
            //渐变起始色属性值
            [Description("背景渐变起始色")]   //显示在属性设计视图中的描述
            public Color StarColor
            {
                get
                {
                    return starColor;
                }
                set
                {
                    starColor= value;
                    this.Invalidate();
                }
            }

            [Description("背景渐变结束色")]   //显示在属性设计视图中的描述
            //渐变结束色属性值
            public Color EndColor
            {
                get
                {
                    return endColor;
                }
                set
                {
                    endColor = value;
                    this.Invalidate();
                }
            }

            [Description("背景渐变角色")]      //显示在属性设计视图中的描述
            //渐变色角度属性值
            public float LineBrushAng
            {
                get
                {
                    return lineBrushAng;
                }
                set
                {
                    lineBrushAng = value;
                    this.Invalidate();
                }
            }

            [Description("外框笔画颜色")]         //显示在属性设计视图中的描述
            //外框笔画颜色
            public Color PenColor
            {
                get
                {
                    return penColor;
                }
                set
                {
                    penColor = value;
                    this.Invalidate();
                }
            }

            [Description("外框笔画宽度")]         //显示在属性设计视图中的描述
            //外框笔画宽度
            public float PenWidth
            {
                get
                {
                    return penWidth;
                }
                set
                {
                    penWidth = value;
                    this.Invalidate();
                }
            }

            [Description("控件左边显示文本字体属性")]         //显示在属性设计视图中的描述
            //控件左手文本字体属性值
            public Font LeftFont
            {
                get
                {
                    return leftFont;
                }
                set
                {
                    leftFont = value;
                    this.Invalidate();
                }
            }

            [Description("控件右边显示文本字体属性")]         //显示在属性设计视图中的描述
            //控件右手文本字体属性值
            public Font RightFont
            {
                get
                {
                    return rightFont;
                }
                set
                {
                    rightFont = value;
                    this.Invalidate();
                }
            }

            [Description("控件左边文件字体颜色")]         //显示在属性设计视图中的描述
            //控件左边文件字体颜色
            public Color LeftColor
            {
                get
                {
                    return leftColor;
                }
                set
                {
                    leftColor = value;
                    this.Invalidate();
                }
            }

            [Description("控件右边文件字体颜色")]         //显示在属性设计视图中的描述
            //控件右边文件字体颜色
            public Color RightColor
            {
                get
                {
                    return rightColor;
                }
                set
                {
                    rightColor = value;
                    this.Invalidate();
                }
            }

            [Description("控件左边显示文本")]         //显示在属性设计视图中的描述
            //控件左边文本属性值
            public string LeftText
            {
                get
                {
                    return leftText;
                }
                set
                {
                    leftText = value;
                    this.Invalidate();
                }
            }

            [Description("控件右边显示文本")]         //显示在属性设计视图中的描述
            //控件右边文本属性值
            public string RightText
            {
                get
                {
                    return rightText;
                }
                set
                {
                    rightText = value;
                    this.Invalidate();
                }
            }
            #endregion

            /// <summary>
            /// 控件paint事件
            /// </summary>
            /// <param name="sender">事件发行者信息</param>
            /// <param name="e">paint事件信息</param>
            private void UserControl1_Paint(object sender, PaintEventArgs e)
            {
                Graphics pG = e.Graphics;
                Pen pP = new Pen(penColor, penWidth);
                pP.Alignment = PenAlignment.Inset;
                LinearGradientBrush pL = new LinearGradientBrush(new Rectangle(new Point(0, 0), new Size(this.Width, this.Height)), starColor, endColor, lineBrushAng);

                //绘制控件整体填充形状
                GraphicsPath gPath = new GraphicsPath();
                int x = 0;
                int y = 0;
                int w = this.Width;
                int h = this.Height;
                int a = 10;
                gPath.AddArc(new Rectangle(new Point(x, y), new Size(a, a)), 180, 90);
                gPath.AddLine(new Point(a, y), new Point(w, y));
                gPath.AddArc(new Rectangle(new Point(w - a, y), new Size(a, a)), 270, 90);
                gPath.AddLine(new Point(w, y), new Point(w, h));
                gPath.AddArc(new Rectangle(new Point(w - a, h - a), new Size(a, a)), 0, 90);
                gPath.AddLine(new Point(w, h), new Point(a, h));
                gPath.AddArc(new Rectangle(new Point(x, h - a), new Size(a, a)), 90, 90);
                gPath.AddLine(new Point(x, h - a), new Point(x, y));
                gPath.CloseAllFigures();
                Region = new Region(gPath);
                pG.FillPath(pL, gPath);
                pG.DrawPath(pP, gPath);

                //绘制控件外框
                pG.DrawLine(pP, new PointF(w * 3 / 5, y), new PointF(w * 3 / 5, h));

                //绘制控件左边文本
                RectangleF gR = new RectangleF(new PointF(0, 0), new SizeF(w * 3 / 5, h));
                StringFormat gS = new StringFormat();
                gS.Alignment = StringAlignment.Center;
                gS.LineAlignment = StringAlignment.Center;
                gS.FormatFlags = StringFormatFlags.NoWrap;
                pG.DrawString(leftText, leftFont, new SolidBrush(leftColor), gR, gS);

                //绘制控件右文本
                gR.X = w * 3 / 5;
                gR.Y = y;
                gR.Width = w - w * 3 / 5;
                gR.Height = h;
                pG.DrawString(rightText, rightFont, new SolidBrush(rightColor), gR, gS);

                pP.Dispose();
                pL.Dispose();
                gPath.Dispose();
                gS.Dispose();
                pG.Dispose();
            }
        }
    在修改左边文本属性或者修改右边文本的属性的时候,都出现闪动, 我也试过自己定义一事件, 来专门用来处理显示文本, 左边文本显示定义一个事件, 右边文本显示定义一个事件, 还是搞不定.
    请问大家有什么好的方法解决!!!    

    2009年5月16日 0:23

全部回复

  • 你好!
         你试试在类的构造函数里加这行代码:
    this.SetStyle(ControlStyles.AllPaintingInWmPaint|ControlStyles.UserPaint|ControlStyles.OptimizedDoubleBuffer,true);
    周雪峰
    2009年5月16日 4:29
    版主
  • 你好!
      我试了,在类的构造函数里加this.SetStyle(ControlStyles.AllPaintingInWmPaint|ControlStyles.UserPaint|ControlStyles.OptimizedDoubleBuffer,true); 但一调试运行就出现这个错误 ArgumentException
    2009年5月16日 7:26
  • 你好!
        不知道你用的是哪个版本的.NET Framework,如果是1.0或1.1的话,ControlStyles.OptimizedDoubleBuffer不支持,你这样修改:
    this.SetStyle(ControlStyles.AllPaintingInWmPaint|ControlStyles.UserPaint|ControlStyles.DoubleBuffer,true);
    周雪峰
    2009年5月16日 8:31
    版主
  • 我用的是VS2005, 我把this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);放到构造器里还是出现同样的错.  ArgumentException

    2009年5月16日 8:40
  • 怎么可能呢?我刚刚测试成功了啊!这行代码就是从我的VS里复制的啊!
    请问提供你的代码吗?

    周雪峰
    2009年5月16日 10:53
    版主
  •  public UserControl1()
        {
            InitializeComponent();
            this.DoubleBuffered = true;
        }
    
        protected override bool DoubleBuffered
        {
            get
            {
                return base.DoubleBuffered;
            }
            set
            {
                if (value)
                {
                    base.DoubleBuffered = value;
                }
                else
                    base.DoubleBuffered = true;
            }
        }
    你好,

    或者你override用户控件的DoubleBuffered属性,看看结果。


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Welcome to the All-In-One Code Framework! If you have any feedback, please tell us.
    2009年5月18日 9:05
    版主