按钮中的曲线平滑

时间:2016-08-12 15:11:26

标签: c# user-interface button

我想创建一个类似于thisthis的切换按钮。动画对我来说无关紧要。我尝试使用下面的代码创建一个切换按钮。但是我无法让它成为平滑的曲线和边缘。我正在使用Windows窗体应用程序和C#UI设计中的初学者。

我的问题是,是否可以使曲线平滑,或者仍然保持这样?我在第二个链接中导入了代码,但按钮仍然没有显示为平滑。

我也用 -

e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;   

以下是按钮的完整代码 -

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Drawing.Drawing2D;

namespace MyWorkspace
{
    public class ToggleButton : Control
    {
        #region variables        
        public enum ButtonState { ON, OFF };
        private ButtonState toggleState = ButtonState.OFF;
        private Rectangle contentRectangle = Rectangle.Empty;
        #endregion

        #region properties
        public ButtonState ToggleState
        {
            get
            {
                return toggleState;
            }
            set
            {
                if (toggleState != value)
                {                    
                    toggleState = value;
                    Invalidate();
                    this.Refresh();
                }
            }
        }
        #endregion

        public ToggleButton() : base()
        {
            this.MinimumSize = new Size(50, 25);
            this.MaximumSize = new Size(50, 25);
            contentRectangle = new Rectangle(0, 0, this.Width, this.Height);
            this.BackColor = Application.RenderWithVisualStyles ? Color.Azure : this.Parent.BackColor;
        }        

        // Draw the large or small button, depending on the current state.
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            e.Graphics.SmoothingMode = SmoothingMode.HighQuality;
            e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;            

            Rectangle rect = new Rectangle(0, contentRectangle.Y, contentRectangle.Height, contentRectangle.Height);            

            GraphicsPath gp = new GraphicsPath();
            int d = this.Height;
            gp.AddArc(contentRectangle.X, contentRectangle.Y, d, d, 180, 90);
            gp.AddArc(contentRectangle.X + contentRectangle.Width - d, contentRectangle.Y, d, d, 270, 90);
            gp.AddArc(contentRectangle.X + contentRectangle.Width - d, contentRectangle.Y + contentRectangle.Height - d, d, d, 0, 90);
            gp.AddArc(contentRectangle.X, contentRectangle.Y + contentRectangle.Height - d, d, d, 90, 90);

            this.Region = new Region(gp);

            Rectangle ar2 = new Rectangle(rect.X, contentRectangle.Y, (rect.X + rect.Width / 2) + contentRectangle.Right, contentRectangle.Height);

            LinearGradientBrush br;
            Rectangle ellipse_rect;
            if (toggleState == ButtonState.ON)
            {
                br = new LinearGradientBrush(ar2, Color.FromArgb(0, 127, 234), Color.FromArgb(96, 174, 241), LinearGradientMode.Vertical);                
                ellipse_rect = new Rectangle(contentRectangle.Right - (contentRectangle.Height -2),
                    contentRectangle.Y, contentRectangle.Height - 4, contentRectangle.Height);                
            }
            else
            {                 
                br = new LinearGradientBrush(ar2, Color.FromArgb(120, 120, 120), Color.Silver, LinearGradientMode.Vertical);                
                ellipse_rect = rect;
            }

            e.Graphics.FillRectangle(br, ar2);
            e.Graphics.DrawEllipse(new Pen(Color.Gray, 2f), ellipse_rect);
            LinearGradientBrush br2 = new LinearGradientBrush(rect, Color.White, Color.Silver, LinearGradientMode.Vertical);
            e.Graphics.FillEllipse(br2, ellipse_rect);   
            Color c = this.Parent != null ? this.Parent.BackColor : Color.White;
            e.Graphics.DrawPath(new Pen(c, 2f), gp);            
        }        

        protected override void OnClick(EventArgs e)
        {
            if (toggleState == ButtonState.ON)
                toggleState = ButtonState.OFF;                            
            else
                toggleState = ButtonState.ON;

            Invalidate();
        }        
    }
}

1 个答案:

答案 0 :(得分:1)

请发布您的解决方案的图像,但根据您的描述,我猜您没有启用抗锯齿功能。 Here is a MSDN article关于如何启用消除锯齿功能。如果您要更改应用程序中许多控件的外观,可能需要查看Windows Presentation Foundation或新Universal Windows Platform。 与Windows窗体相比,WPF和UWP都是使用XAML设计的基于矢量的界面层。由于WPF和UWP实现其设计系统的方式,很容易完全自定义应用程序的外观。此外,这两个平台都内置了动画功能。