2016-08-12 128 views
-1

我想创建类似于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

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