はじめに
モダンなデザインを意識して丸ボタンを実装したいなと思いました。
当たり判定となるRegionと、描画のOnPaintを弄れば角丸とかもできそう。
参考
コード
自作コントロールなので、
namespaceの部分を修正したら、
ファイルをソリューションに入れて、ビルドして、
ツールボックスから投げ入れて、
ボタンの色を設定すればOK。
EllipseButoon.cs
usingSystem.ComponentModel;usingSystem.Drawing;usingSystem.Drawing.Drawing2D;usingSystem.Windows.Forms;namespaceSample_EllipseButoon{publicpartialclassEllipseButoon:Control{/// <summary>/// ボタンの色/// </summary>[Browsable(true)][Description("ボタンの色")][Category("表示")]publicColorButtonColor{get;set;}protectedoverrideCreateParamsCreateParams{get{// コントロールの透明化// ※親コントロール描画時に、本コントロールのRegion内を塗りつぶされなくなる// ※兄弟関係による最前面、最背面の概念がなくなる// この拡張コントロールと他のコントロールを兄弟関係で重ねると、重ねた領域の描画が後勝ちになる// ※ControlStyles.OptimizedDoubleBufferは透明度をサポートしていないため、これと併用するとRegion内を黒で塗りつぶされる// ちらつきは防げないし、描画処理も重くなるvarWS_EX_TRANSPARENT=0x20;varcreateParams=base.CreateParams;createParams.ExStyle=createParams.ExStyle|WS_EX_TRANSPARENT;returncreateParams;}}/// <summary>/// コンストラクタ/// </summary>publicEllipseButoon(){// OnPaintBackgroundを無効化SetStyle(ControlStyles.Opaque,true);InitializeComponent();}/// <summary>/// レイアウト初期化/// </summary>protectedoverridevoidInitLayout(){// コントロールの領域を円にするthis.Region=GetEllipseRegion();base.InitLayout();}/// <summary>/// 描画/// </summary>protectedoverridevoidOnPaint(PaintEventArgse){// ボタン色で塗るPaintBaseColor(e.Graphics);base.OnPaint(e);}/// <summary>/// 円形にボタンの色で塗りつぶす/// </summary>protectedvoidPaintBaseColor(Graphicsg){// アンチエイリアスを掛けるg.SmoothingMode=SmoothingMode.HighQuality;g.PixelOffsetMode=PixelOffsetMode.HighQuality;// 円領域の塗りつぶすと、アンチエイリアスが領域外に出ていく為、-1するg.FillEllipse(newSolidBrush(this.ButtonColor),GetEllipseRectangleF(-1));}/// <summary>/// 円の領域を取得/// </summary>protectedRegionGetEllipseRegion(){varpath=newGraphicsPath();path.AddEllipse(GetEllipseRectangleF());returnnewRegion(path);}/// <summary>/// 円を囲う四角形を取得/// </summary>protectedRectangleFGetEllipseRectangleF(intmergin=0){returnnewRectangleF(-mergin,-mergin,this.Width+mergin,this.Height+mergin);}}}