按钮平滑曲线



我想创建一个类似于这个或这个的切换按钮。动画对我来说并不重要。我尝试用下面的代码创建一个切换按钮。然而,我不能得到光滑的曲线和边缘。我正在使用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();
        }        
    }
}

请张贴你的解决方案看起来像什么图像,但从你所描述的,我猜你没有抗锯齿启用。这里有一篇关于如何启用抗锯齿的MSDN文章。如果您打算更改应用程序中许多控件的外观,您可能需要查看Windows Presentation Foundation或新的通用Windows平台。与Windows窗体相比,WPF和UWP都是基于矢量的接口层,使用XAML设计。由于WPF和UWP实现其设计系统的方式,完全自定义应用程序的外观和感觉非常容易。此外,这两个平台都内置了动画功能。

相关内容

  • 没有找到相关文章

最新更新