none
自定义圆角控件填充色的问题,如何让圆角外多余的部分透明? RRS feed

  • 问题

  • private GraphicsPath RoundRect(Rectangle r,int round)
            {
                GraphicsPath gp = new GraphicsPath();
                r.Width=r.Width-1;
                r.Height=r.Height-1;
                int x = r.X;
                int y = r.Y;
                int w = r.Width;
                int h = r.Height;
                gp.AddArc(x, y, round, round, 180, 90);
                gp.AddArc(w - round, y, round, round, 270, 90);
                gp.AddArc(w - round, h - round, round, round, 0, 90);
                gp.AddArc(x, h - round, round, round, 90, 90);
                gp.CloseAllFigures();
                return gp;
            }
            protected override void OnPaint(PaintEventArgs e)
            {
                e.Graphics.FillPath(new SolidBrush(BackColor), RoundRect(ClientRectangle, 4));
                e.Graphics.DrawPath(new Pen(Color.Green, 1), RoundRect(ClientRectangle, 14));
            }

    自定义了一个圆角控件,画控件的背景色的时候,

    onPaint方法中画出控件的背景色,再画出边框,可是边框外多余的区域还是有背景色,貌似在onPaint方法之前

    就已经把背景色给画上去了啊?在onbackcolorchanged和OnPaintBackground里面处理还是不行,请问这个背景色是在哪个地方先画出来了?

    我知道有把path转换为Region,把控件的region设为圆角区域可以实现,但是我想知道不通过这样的方法,可以让它圆角么?即使改变背景色,也还是只显示圆角图形?

    2012年8月23日 0:21

答案

  • 请参照一下代码,注意加下划线的行this.Region = new Region(gp);

     public partial class RoundPanel : UserControl
        {
            public RoundPanel()
            {
                InitializeComponent();
                SetStyle(ControlStyles.AllPaintingInWmPaint, true);
                SetStyle(ControlStyles.UserPaint, true);
                SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
                SetStyle(ControlStyles.SupportsTransparentBackColor, true);
                //this.SetStyle(ControlStyles.Opaque, true);
                this.UpdateStyles();
            }
            private GraphicsPath RoundRect(Rectangle r, int round)
            {
                GraphicsPath gp = new GraphicsPath();
                r.Width = r.Width - 1;
                r.Height = r.Height - 1;
                int x = r.X;
                int y = r.Y;
                int w = r.Width;
                int h = r.Height;
                round = round << 1;
                gp.AddArc(x, y, round, round, 180, 90);
                gp.AddArc(w - round, y, round, round, 270, 90);
                gp.AddArc(w - round, h - round, round, round, 0, 90);
                gp.AddArc(x, h - round, round, round, 90, 90);
                gp.CloseAllFigures();
                this.Region = new Region(gp);
                return gp;
            }
            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                e.Graphics.FillPath(new SolidBrush(BackColor), RoundRect(ClientRectangle, 50));
                e.Graphics.DrawPath(new Pen(Color.Black, 1), RoundRect(ClientRectangle, 50));
            }


    http://blog.csdn.net/zx13525079024




    2012年8月27日 3:14

全部回复

  • 参照下这个DMEO,这个是可以实现你要的效果的

    http://www.cnblogs.com/hcbin/archive/2010/03/13/1685041.html


    http://blog.csdn.net/zx13525079024

    2012年8月23日 7:53
  • 谢谢,看过了,那个例子的方法貌似跟我说的设置region是一样的......
    2012年8月23日 9:56
  • 你请把用户控件的全部完整代码贴出来,谢谢!


    http://blog.csdn.net/zx13525079024

    2012年8月24日 2:05
  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Drawing;
    using System.Data;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing.Drawing2D;
    namespace dd
    {
        public partial class RoundPanel : UserControl
        {
            public RoundPanel()
            {
                InitializeComponent();
                SetStyle(ControlStyles.AllPaintingInWmPaint, true);
                SetStyle(ControlStyles.UserPaint, true);
                SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
                SetStyle(ControlStyles.SupportsTransparentBackColor, true);
                //this.SetStyle(ControlStyles.Opaque, true);
                this.UpdateStyles();
            }
            private GraphicsPath RoundRect(Rectangle r, int round)
            {
                GraphicsPath gp = new GraphicsPath();
                r.Width = r.Width - 1;
                r.Height = r.Height - 1;
                int x = r.X;
                int y = r.Y;
                int w = r.Width;
                int h = r.Height;
                round = round << 1;
                gp.AddArc(x, y, round, round, 180, 90);
                gp.AddArc(w - round, y, round, round, 270, 90);
                gp.AddArc(w - round, h - round, round, round, 0, 90);
                gp.AddArc(x, h - round, round, round, 90, 90);
                gp.CloseAllFigures();
                return gp;
            }
            protected override void OnPaint(PaintEventArgs e)
            {
                e.Graphics.FillPath(new SolidBrush(BackColor), RoundRect(ClientRectangle, 5));
                e.Graphics.DrawPath(new Pen(Color.Black, 1), RoundRect(ClientRectangle, 5));
            }
        }
    }

    2012年8月24日 14:08
  • 请参照一下代码,注意加下划线的行this.Region = new Region(gp);

     public partial class RoundPanel : UserControl
        {
            public RoundPanel()
            {
                InitializeComponent();
                SetStyle(ControlStyles.AllPaintingInWmPaint, true);
                SetStyle(ControlStyles.UserPaint, true);
                SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
                SetStyle(ControlStyles.SupportsTransparentBackColor, true);
                //this.SetStyle(ControlStyles.Opaque, true);
                this.UpdateStyles();
            }
            private GraphicsPath RoundRect(Rectangle r, int round)
            {
                GraphicsPath gp = new GraphicsPath();
                r.Width = r.Width - 1;
                r.Height = r.Height - 1;
                int x = r.X;
                int y = r.Y;
                int w = r.Width;
                int h = r.Height;
                round = round << 1;
                gp.AddArc(x, y, round, round, 180, 90);
                gp.AddArc(w - round, y, round, round, 270, 90);
                gp.AddArc(w - round, h - round, round, round, 0, 90);
                gp.AddArc(x, h - round, round, round, 90, 90);
                gp.CloseAllFigures();
                this.Region = new Region(gp);
                return gp;
            }
            protected override void OnPaint(PaintEventArgs e)
            {
                base.OnPaint(e);
                e.Graphics.FillPath(new SolidBrush(BackColor), RoundRect(ClientRectangle, 50));
                e.Graphics.DrawPath(new Pen(Color.Black, 1), RoundRect(ClientRectangle, 50));
            }


    http://blog.csdn.net/zx13525079024




    2012年8月27日 3:14
  • round = round << 1;

    这句什么意思?


    • 已编辑 Lacuz 2012年8月29日 1:50
    2012年8月29日 1:06
  • <<) 将第一个操作数向左移动第二个操作数指定的位数

    MSDN:http://msdn.microsoft.com/zh-cn/library/a1sway8w


    http://blog.csdn.net/zx13525079024

    2012年8月29日 2:45