C#自定義控件指示燈效果
C#用戶控件之指示燈
在體現(xiàn)通訊狀態(tài)、運行狀態(tài)等用一個靚眼的指示燈如何做?
思路(GDI)
- 外環(huán)用筆繪制(Pen),內(nèi)圓用畫刷(SolidBrush);
兩個方法(用筆畫圓,用畫刷填充圓的內(nèi)部):
- 繪制邊界RectangleF定義的橢圓/圓
DrawEllipse(Pen pen,RectangleF rect)
- 填充RectangleF定義邊框的橢圓的內(nèi)部
FillEllipse(Brush brush,RectangleF rect)
定義屬性
- 指示燈顏色、外環(huán)與邊界的間隙、內(nèi)圓與邊界的間隙、外環(huán)寬度、當(dāng)前顏色
//外環(huán)寬度 private float outWidth = 4.0f; [Browsable(true)] [Category("布局_G")] [Description("外環(huán)的寬度")] 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(); } } //當(dāng)前顏色獲取(定義一個私有方法)(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),屬性都是一個樣往下敲就是 注意:間隙設(shè)置值的范圍(外環(huán)間隙要小于內(nèi)圓間隙)
GDI繪制圖形:(外環(huán)、內(nèi)圓)
Color getCurColor = GetCurColor(); //獲取當(dāng)前顏色 //繪制外環(huán)(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); //繪制內(nèi)圓(FillEllipse-填充橢圓內(nèi)部) sb = new SolidBrush(getCurColor); rec = new RectangleF(gapIn, gapIn, this.width - 2 * this.gapIn, this.height - 2 * gapIn); g.FillEllipse(sb, rec);
最后生成(閃爍的話,是不是對用戶更友好呢)
兩種閃爍方法
關(guān)鍵在于timer定時器的使用,在定時器的Tick方法中定義變量更替
【1】只內(nèi)圓閃爍(定義內(nèi)圓畫刷顏色Transparent<透明色>、GetCurColor<當(dāng)前色>兩種畫刷)
if (this.flickerAct == true) { if (this.blink == true) //將blink標(biāo)志位在定時器的Tick方法中取反 (blink=!blink) { sb = new SolidBrush(zcolor6); //zcolor6為透明色 } else { sb = new SolidBrush(getCurColor); //getCurColor為當(dāng)前色 } } else { sb = new SolidBrush(getCurColor); //不閃爍就定義當(dāng)前色畫刷 } 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 { //內(nèi)圓閃爍標(biāo)志 this.blink = !this.blink; } this.Invalidate(); }
【3】頻率可調(diào)(定時器的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(); //不閃爍定時器停止;同時將標(biāo)志位、顯示置為默認值 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; }
到此這篇關(guān)于C#自定義控件—指示燈的文章就介紹到這了,更多相關(guān)C#指示燈內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C# SaveFileDialog與OpenFileDialog用法案例詳解
這篇文章主要介紹了C# SaveFileDialog與OpenFileDialog用法案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08C#使用泛型方法實現(xiàn)操作不同數(shù)據(jù)類型的數(shù)組
這篇文章主要為大家詳細介紹了C#如何使用一個泛型方法對不同類型的數(shù)組進行操作,文中的示例代碼講解詳細,感興趣的小伙伴可以學(xué)習(xí)一下2024-02-02使用C#發(fā)送Http請求實現(xiàn)模擬登陸實例
本文主要介紹了使用C#發(fā)送Http請求實現(xiàn)模擬登陸實例,模擬登陸的原理簡單,想要了解的朋友可以了解一下。2016-10-10