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、藍(lán)色=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)前顏色獲?。ǘx一個私有方法)(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)志位、顯示置為默認(rèn)值
this.blink = false;
this.Visible = true;
}
flickerAct = value; this.Invalidate();
}
}閃瞎雙眼,捂臉

想要二進(jìn)制使用示例
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ù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
C#使用泛型方法實現(xiàn)操作不同數(shù)據(jù)類型的數(shù)組
這篇文章主要為大家詳細(xì)介紹了C#如何使用一個泛型方法對不同類型的數(shù)組進(jìn)行操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以學(xué)習(xí)一下2024-02-02
使用C#發(fā)送Http請求實現(xiàn)模擬登陸實例
本文主要介紹了使用C#發(fā)送Http請求實現(xiàn)模擬登陸實例,模擬登陸的原理簡單,想要了解的朋友可以了解一下。2016-10-10

