RcButton按鈕控制元件,可設定漸變色和懸停圖片
阿新 • • 發佈:2018-12-27
namespace Controls { using System; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; public partial class RcButton { public RcButton() { InitializeComponent(); } /// <summary> /// 必需的設計器變數。 /// </summary> IContainer components = null; /// <summary> /// 填充按鈕的圖片控制元件 /// </summary> PictureBox fillImage = new PictureBox(); /// <summary> /// 清理所有正在使用的資源。 /// </summary> /// <param name="disposing">如果應釋放託管資源,為 true;否則為 false。</param> protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region 漸變屬性 int _radius = 1; [Browsable(true), Category("按鈕樣式屬性"), Description("圓角弧度")] public int Radius { get { return _radius; } set { _radius = value > 0 ? value : 1; } } LinearGradientMode _linearGradientMode = LinearGradientMode.Vertical; [Browsable(true), Category("按鈕樣式屬性"), Description("漸變方向")] public LinearGradientMode LinearGradientMode { get { return _linearGradientMode; } set { _linearGradientMode = value; } } Color _beginColor = Color.LightGray; [Browsable(true), Category("按鈕樣式屬性"), Description("漸變起始顏色")] public Color FadeColorStart { get { return _beginColor; } set { _beginColor = value; } } Color _endColor = Color.LightGray; [Browsable(true), Category("按鈕樣式屬性"), Description("漸變結束顏色")] public Color FadeColorEnd { get { return _endColor; } set { _endColor = value; } } #endregion #region 圖片屬性 bool _isImageMode = false; [Browsable(true), Category("按鈕樣式屬性"), Description("啟用圖片模式")] public bool IsImageMode { get { return _isImageMode; } set { _isImageMode = value; // 去除觸發條件 this.Controls.Remove(fillImage); this.Paint -= event_paint; // 新增觸發條件 if (_isImageMode) { this.Controls.Add(this.fillImage); } else { this.Paint += event_paint; } } } Image _normal; [Browsable(true), Category("按鈕樣式屬性"), Description("預設顯示圖片")] public Image ImageNormal { get { return _normal; } set { _normal = value; fillImage.BackgroundImage = _normal; } } Image _enter; [Browsable(true), Category("按鈕樣式屬性"), Description("滑鼠懸停圖片")] public Image ImageEnter { get { return _enter; } set { _enter = value; fillImage.BackgroundImage = _enter; } } Image _click; [Browsable(true), Category("按鈕樣式屬性"), Description("點選按鈕圖片")] public Image ImageClick { get { return _click; } set { _click = value; fillImage.BackgroundImage = _click; } } #endregion #region 重新調整尺寸 Image resizeImage(Image imgToResize, Size size) { if (imgToResize == null) return null; //期望的寬度 int destWidth = size.Width; //期望的高度 int destHeight = size.Height; Bitmap b = new Bitmap(destWidth, destHeight); Graphics g = Graphics.FromImage(b); g.InterpolationMode = InterpolationMode.HighQualityBicubic; //繪製圖像 g.DrawImage(imgToResize, 0, 0, destWidth, destHeight); g.Dispose(); return b; } #endregion #region 內部事件 /// <summary> /// 渲染繪製事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void event_paint(object sender, PaintEventArgs e) { // 獲取引數 var cr = e.ClipRectangle; var g = e.Graphics; // 繪製漸變 var lgb = new LinearGradientBrush(cr, FadeColorStart, FadeColorEnd, LinearGradientMode); // 繪製圓角矩形 var gp = new GraphicsPath(); gp.AddArc(cr.X, cr.Y, Radius, Radius, 180, 90); gp.AddArc(cr.Width - Radius, cr.Y, Radius, Radius, 270, 90); gp.AddArc(cr.Width - Radius, cr.Height - Radius, Radius, Radius, 0, 90); gp.AddArc(cr.X, cr.Height - Radius, Radius, Radius, 90, 90); gp.CloseAllFigures();// 閉合連線所有圖形(畫直線) // 繪製圖形 g.Clear(Parent.BackColor); g.FillPath(lgb, gp); var point = g.MeasureString(Text, Font).ToPointF(); var x = (Width - point.X) / 2; var y = (Height - point.Y) / 2; // 新增文字 g.DrawString(Text, Font, new SolidBrush(ForeColor), new PointF(x, y)); } /// <summary> /// 點選事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void fillImage_ImageClick(object sender, EventArgs e) { fillImage.BackgroundImage = ImageClick; } /// <summary> /// 滑鼠移入事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void fillImage_ImageEnter(object sender, EventArgs e) { fillImage.BackgroundImage = ImageEnter; } /// <summary> /// 滑鼠離開事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void fillImage_ImageNormal(object sender, EventArgs e) { fillImage.BackgroundImage = ImageNormal; } /// <summary> /// 更改尺寸時重置 /// </summary> /// <param name="e"></param> protected override void OnResize(EventArgs e) { base.OnResize(e); fillImage.Size = Size; _normal = resizeImage(_normal, Size); _enter = resizeImage(_enter, Size); _click = resizeImage(_click, Size); fillImage.BackgroundImage = ImageNormal; } #endregion #region 元件設計器生成的程式碼 /// <summary> /// 設計器支援所需的方法 - 不要修改 /// 使用程式碼編輯器修改此方法的內容。 /// </summary> void InitializeComponent() { // // 圖片控制元件 // ((ISupportInitialize)(this.fillImage)).BeginInit(); this.SuspendLayout(); this.fillImage.Name = "fillImage"; this.fillImage.Size = Size; this.fillImage.Location = Point.Empty; this.fillImage.SizeMode = PictureBoxSizeMode.CenterImage; this.fillImage.TabIndex = 0; this.fillImage.TabStop = false; // 新增事件 this.fillImage.MouseDown += fillImage_ImageClick; this.fillImage.MouseUp += fillImage_ImageEnter; this.fillImage.MouseEnter += fillImage_ImageEnter; this.fillImage.MouseLeave += fillImage_ImageNormal; ((ISupportInitialize)(this.fillImage)).EndInit(); this.ResumeLayout(false); } #endregion } }