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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...