代码之家  ›  专栏  ›  技术社区  ›  caesay

透明绘制复合层而不是重绘

  •  3
  • caesay  · 技术社区  · 14 年前

    我有一个自定义控件,在其中重写以下方法以创建透明背景:

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= 0x20;
                return cp;
            }
        }
    

    在绘画方法上,我是这样做的:

        protected override void OnPaint(PaintEventArgs p)
        {
            base.OnPaint(p);
            Graphics e = p.Graphics;
            this.Size = Resources.CenterButtonHover.Size;
            if (mousedown)
            {
                e.DrawImage(Resources.CenterButtonDown, new Point(0, 0));
            }
            else if (hover)
            {
                e.DrawImage(Resources.CenterButtonHover, new Point(0, 0));
            }
            else
            {
                e.DrawImage(Resources.CenterButtonNormal, new Point(4, 4));
            }
            e.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
        }
    

    并对各种鼠标事件进行了调用 this.Invalidate

    正在正确渲染透明度,但每次渲染时,它都会在上一次渲染的顶部进行渲染,而不是重新绘制。这导致辉光变得越来越强烈,直到它只是一个大斑点。我该怎么解决这个问题?

    1 回复  |  直到 7 年前
        1
  •  2
  •   caesay    7 年前

    我解决这个问题的办法是,在重新绘制之前,保留一个关于是否有需要删除的渐变的布尔值。

            if (needsreset)
            {
                this.SuspendLayout();
                this.Region = new Region(this.ClientRectangle);
                needsreset = false;
                return;
            }