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

来源:https://www.cnblogs.com/guoenshuo/p/18401032
-Advertisement-
Play Games

之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...


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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.下載 Redis for Windows Redis 官方並沒有提供 Windows 版本的安裝包,但你可以使用 Microsoft 維護的 Windows 版本的 Redis。你可以從以下鏈接下載 Redis for Windows: 2.安裝 Redis 運行安裝程式: 雙擊下載的 .msi ...
  • 在Word中,分節符是一種強大的工具,用於將文檔分成不同的部分,每個部分可以有獨立的頁面設置,如頁邊距、紙張方向、頁眉和頁腳等。正確使用分節符可以極大地提升文檔的組織性和專業性,特別是在長文檔中,需要在不同部分應用不同的樣式時。本文將介紹如何使用一個免費的.NET庫通過C#實現插入或刪除Word分節 ...
  • 關說不練假把式,在上一,二篇中介紹了我心目中的CRUD的樣子 基於之前的理念,我開發了一個命名為PasteTemplate的項目,這個項目呢後續會轉化成項目模板,轉化成項目模板後,後續需要開發新的項目就可以基於這個模板創建,這樣就不要copy一個舊的項目,然後刪刪刪,改改改,重命名等操作了 強迫症, ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...