C#自定義控制項—指示燈

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

前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...


C#用戶控制項之指示燈

在體現通訊狀態、運行狀態等用一個靚眼的指示燈如何做?

思路(GDI)

  • 外環用筆繪製(Pen),內圓用畫刷(SolidBrush);

兩個方法(用筆畫圓,用畫刷填充圓的內部):

  1. 繪製邊界RectangleF定義的橢圓/圓

DrawEllipse(Pen pen,RectangleF rect)

  1. 填充RectangleF定義邊框的橢圓的內部

FillEllipse(Brush brush,RectangleF rect)


定義屬性

  • 指示燈顏色、外環與邊界的間隙、內圓與邊界的間隙、外環寬度、當前顏色
//外環寬度
private float outWidth = 4.0f;
[Browsable(true)]
[Category("佈局_G")]
[Description("外環的寬度")]
public float OutWidth
{
    get { return outWidth; }
    set
    {
         if (value <=0||value<0.1*this.Width ) return;
        outWidth = value; this.Invalidate();
    }
}


//顏色(Color)——備註:寫5種顏色屬性(灰色=Gray、棕色=DarkGoldenrod、紅色=Red、藍色=Blue、綠色=limeGreen<比Green好看些>)
private Color zcolor1 = Color.Gray;   //灰色.......寫5種
 [Browsable(true)]
 [Category("佈局_G")]
 [Description("顏色1")]
 public Color ZColor1
 {
     get { return zcolor1; }
     set { zcolor1 = value; this.Invalidate(); }
 }
//當前顏色獲取(定義一個私有方法)(Int)
  private Color GetCurColor()
  {
      List<Color> colors = new List<Color>();
      colors.Add(zcolor1);
      colors.Add(zcolor2);
      colors.Add(zcolor3);
      colors.Add(zcolor4);
      colors.Add(zcolor5);
      return colors[curValue];
  }
//間隙(float),屬性都是一個樣往下敲就是
註意:間隙設置值的範圍(外環間隙要小於內圓間隙)

GDI繪製圖形:(外環、內圓)

Color getCurColor = GetCurColor();  //獲取當前顏色

//繪製外環(DrawEllipse-用筆畫橢圓)
p = new Pen(getCurColor, outWidth);
RectangleF rec = new RectangleF(this.gapOut, this.gapOut, this.width - 2 * this.gapOut, this.height - 2 * gapOut);
g.DrawEllipse(p, rec);

//繪製內圓(FillEllipse-填充橢圓內部)
sb = new SolidBrush(getCurColor);
rec = new RectangleF(gapIn, gapIn, this.width - 2 * this.gapIn, this.height - 2 * gapIn);
g.FillEllipse(sb, rec);


最後生成(閃爍的話,是不是對用戶更友好呢)


兩種閃爍方法

關鍵在於timer定時器的使用,在定時器的Tick方法中定義變數更替


【1】只內圓閃爍(定義內圓畫刷顏色Transparent<透明色>、GetCurColor<當前色>兩種畫刷)

if (this.flickerAct == true)
{
    if (this.blink == true)  //將blink標誌位在定時器的Tick方法中取反 (blink=!blink)
    {
        sb = new SolidBrush(zcolor6);  //zcolor6為透明色
    }
    else
    {
        sb = new SolidBrush(getCurColor);  //getCurColor為當前色
    }
}
else
{
    sb = new SolidBrush(getCurColor);  //不閃爍就定義當前色畫刷
}
rec = new RectangleF(gapIn, gapIn, this.width - 2 * this.gapIn, this.height - 2 * gapIn);
g.FillEllipse(sb, rec);


【2】整體都閃爍(定義控制項的Visible)

 private void MyTimer_Tick(object sender, EventArgs e)  //定時器Tick事件方法
 {
     if (this.flickerVis == true)
     {
         //顯隱控制項
         this.Visible=!this.Visible;  //整體閃爍只定義Visible即可
         this.blink=false;
     }
     else
     {
         //內圓閃爍標誌
         this.blink = !this.blink;
     }
     this.Invalidate();
 }

【3】頻率可調(定時器的Interval)


private bool flickerAct = false;
[Browsable(true)]
[Category("佈局_G")]
[Description("是否閃爍")]
public bool FlickerAct
{
    get { return flickerAct; }
    set
    {
        if (value == true)
        {
            myTimer.Interval = this.flickerFre;  //傳遞給定時器Interval 一個int(毫秒刷新率)值即可
            this.myTimer.Start();  //閃爍定時器開始
        }
        else
        {
            this.myTimer.Stop();  //不閃爍定時器停止;同時將標誌位、顯示置為預設值
            this.blink = false;
            this.Visible = true;
        }
        flickerAct = value; this.Invalidate();
    }
}

閃瞎雙眼,捂臉


想要二進位使用示例

  private void led1_Load(object sender, EventArgs e)
  {
      bool b = false;
      //三元運算定義兩種顏色即可
      this.led1.CurValue = b ? 2 : 3; 
  }

End


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

-Advertisement-
Play Games
更多相關文章
  • 簡介 在現代微服務架構中,服務發現(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)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...