2016-08-12 20 views
-1

thisまたはthisのようなトグルボタンを作成したいと思います。アニメーションは私にとって重要ではありません。私は下のコードでトグルボタンを作成しようとしました。しかし、私は滑らかな曲線とエッジになることはできません。私はC#のUIデザインでWindowsフォームアプリケーションと総初心者を使用しています。ボタンの滑らかな曲線

私の質問は、カーブをスムーズにすることは可能ですか、それとも今のままですか?私は2番目のリンクにコードをインポートしましたが、まだボタンは滑らかに見えませんでした。

私もを使用 - ここ

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が設計システムを実装する方法により、アプリケーションのルック&フィールを完全にカスタマイズするのは非常に簡単です。さらに、両方のプラットフォームには、アニメーションのための機能が組み込まれています。

関連する問題