前言 推薦一款基於.NET 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
C#用戶控制項之指示燈
在體現通訊狀態、運行狀態等用一個靚眼的指示燈如何做?
思路(GDI)
- 外環用筆繪製(Pen),內圓用畫刷(SolidBrush);
兩個方法(用筆畫圓,用畫刷填充圓的內部):
- 繪製邊界RectangleF定義的橢圓/圓
DrawEllipse(Pen pen,RectangleF rect)
- 填充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;
}