C#自定義控制元件—旋轉按鈕

郭恩硕發表於2024-09-07

C#使用者控制元件之旋轉按鈕

按鈕功能:手自動旋轉,標籤文字顯示、點選二次彈框確認(原始碼在最後邊);


【製作方法】
  • 找到控制元件的中心座標,畫背景外環、內圓;再繪製矩形開關,進行角度旋轉即可獲得;

【關鍵節點】
  • No.1 獲取中心座標,思考要繪製圖形的相對座標、寬度、高度;
  • No.2 更改座標系原點,以此原點為座標,繪製矩形開關,再旋轉指定角度
//方法中獲取原點
Point centerPoint = GetCenterPoint();

#region 獲取中心原點
private Point GetCenterPoint()
{
    if (this.height > this.width)
    {
        return new Point(this.width / 2, this.width / 2);
    }
    else
    {
        return new Point(this.height / 2, this.height / 2);
    }
}
#endregion
//更改座標系原點
g.TranslateTransform(centerPoint.X, centerPoint.Y);

//旋轉指定角度
if (switchStatus)
{
    g.RotateTransform(36.0f);
}
else
{
    g.RotateTransform(-36.0f);
}

【1】按鈕的背景(外環<g.DrawEllipse>、內圓<g.FillEllipse>)繪製方法與指示燈的方法一樣;

注意:此座標系以控制元件左上角為準

//繪製外環—(Pen)-DrawEllipse
p = new Pen(this.cirInColor, this.cirOutWidth);
RectangleF rec = new RectangleF(this.cirOutGap, this.cirOutGap, (centerPoint.X - this.cirOutGap) * 2, (centerPoint.X - this.cirOutGap) * 2);
g.DrawEllipse(p, rec);

//填充內圓—(SolidBrush)-FillEllipse
sb = new SolidBrush(this.cirInColor);
rec = new RectangleF(this.cirInGap, this.cirInGap, (centerPoint.X - this.cirInGap) * 2, (centerPoint.X - this.cirInGap) * 2);
g.FillEllipse(sb, rec);

【2】繪製中間矩形及圓點,畫刷填充指定區域(g.FillRectangle、g.FillEllipse)

注意:此座標系以中心點為準

//更改座標系原點
g.TranslateTransform(centerPoint.X, centerPoint.Y);

//填充矩形開關
rec = new RectangleF(-this.togWidth * 0.5f, this.togGap - centerPoint.Y, togWidth, (centerPoint.Y - togGap) * 2);
g.FillRectangle(new SolidBrush(this.togColor), rec);

//填充矩形開關圓點
rec = new RectangleF(-this.togWidth * 0.5f + togForeGap, this.togGap - centerPoint.Y + togForeGap, togWidth - 2 * togForeGap, togForeHeight);
g.FillEllipse(new SolidBrush(this.togForeColor), rec);

【3】繪製文字,在指定的矩形中繪製指定的字串(g.DrawString)

//指定字串
rec = new RectangleF(this.width * 0.05f, 1, this.width, 20);
g.DrawString(this.textLeft, this.textFont, new SolidBrush(this.textColor), rec, sf);
rec = new RectangleF(this.width * 0.63f, 1, this.width, 20);
g.DrawString(this.textRight, this.textFont, new SolidBrush(this.textColor), rec, sf);

【4】建立滑鼠點選事件,新增滑鼠點選事件處理<更改屬性值>,在屬性中觸發事件(Event)

#region 新增事件
[Browsable(true)]
[Category("操作_G")]
[Description("雙擊進入事件")]
public event EventHandler MouseDown_G;   //事件宣告
//初始化函式新增滑鼠點選事件處理
this.MouseDown += Switch_MouseDown; ;
//滑鼠點選事件處理邏輯
private void Switch_MouseDown(object sender, MouseEventArgs e)
{
    DialogResult dr = MessageBox.Show("二次確認操作?", "提示您", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
    if (dr == DialogResult.OK)
    {
        SwitchStatus = !SwitchStatus; //此處屬性值,不是欄位
    }
    else return;
}
#endregion
//開關狀態屬性
 private bool switchStatus = false;
 [Browsable(true)]
 [Category("佈局_G")]
 [Description("開關狀態")]
 public bool SwitchStatus
 {
     get { return switchStatus; }
     set
     {
         switchStatus = value; this.Invalidate();

         //啟用觸發事件
         this.MouseDown_G?.Invoke(this, null);
     }
 }

備忘:指定預設事件(在應用時點選滑鼠即可進入自定義事件,否則進入‘load’事件)

[DefaultEvent("MouseDown_G")]

最後生成


下一個:一個標題皮膚,方便使用者介面的佈局


【1】新建使用者元件

【2】更改元件繼承為Panel

【3】定義屬性(標題的顏色、字型、高度;抬頭背景色;邊框顏色)

private Font titleFont = new Font("微軟雅黑", 12);
[Browsable(true)]
[Category("佈局_G")]
[Description("標題字型")]
public Font TitleFont
{
    get { return titleFont; }
    set
    {
        titleFont = value;
        this.Invalidate();
    }
}

【4】重繪畫布

//畫外邊框
g.DrawRectangle(new Pen(this.colorBorder), new Rectangle(0, 0, this.Width - 1, this.Height - 1));

//填充抬頭矩形
RectangleF rec = new RectangleF(0.5f, 0.5f, this.Width - 2, this.titleHeight);
g.FillRectangle(new SolidBrush(this.colorBack), rec);

//文字繪製
g.DrawString(this.titleText, this.titleFont, new SolidBrush(this.colorTitle), rec, sf);

【5】備註說明

  • 初始化字型格式-需要再兩個方法中定義文字對齊格式
//字型對齊格式
this.sf = new StringFormat();
this.sf.Alignment = StringAlignment.Center;
this.sf.LineAlignment = StringAlignment.Center;

//指定控制元件大小
this.Size = new System.Drawing.Size(300, 150);

最後生成並應用


原始碼連結

(不想折騰的直接用Dll,如有更好的記得留言分享哦!程式碼有不足的也請大神指教)別忘點贊哦
https://pan.baidu.com/s/1QM_iZ-UMksPqwWo2ssS5Ow?pwd=ju01


End

相關文章