2016-08-12 5 views
-1

Я хочу создать тумблер, подобный this или до this. Анимация для меня не имеет значения. Я попытался создать кнопку переключения с кодом ниже. Однако я не могу заставить его быть гладкими кривыми и краями. Я использую приложение форм Windows и новичок в дизайне интерфейса C#.Гладкие кривые в кнопке

Мой вопрос в том, можно ли сделать кривые гладкими, или он все равно останется таким? Я импортировал код во вторую ссылку, но кнопка не выглядела гладкой.

Я также использовал -

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 Forms, как WPF, так и UWP - это векторные интерфейсные уровни, которые разработаны с использованием XAML. Благодаря тому, как WPF и UWP внедряют свою систему проектирования, очень легко полностью настроить внешний вид вашего приложения. Кроме того, обе платформы имеют встроенную функциональность для анимации.

Смежные вопросы