Contributor: UDO JUERSS { Q: Why doing the 243. version of a LED light. A: It does not use bitmaps - so it|s fully scaleable (and saves resources). Contact: Udo Juerss, 57078 Siegen, Germany, CompuServe [101364,526] March 9. 1996 Greetings from germany - enjoy... } unit LEDPaint; interface uses WinTypes, WinProcs, Messages, Classes, Graphics, Controls, ExtCtrls; {------------------------------------------------------------------------------} type TLEDColor = (lcRed,lcGreen,lcBlue,lcYellow,lcNone); TLEDType = (ltRound,ltRect); TLEDPaint = class(TGraphicControl) private FBackGround: TColor; FBevelOuter: TPanelBevel; FBevelInner: TPanelBevel; FBevelWidth: Byte; FLEDColor: TLEDColor; FLEDOn: Boolean; FLEDType: TLEDType; Border: Byte; protected procedure Draw(BkGnd:Boolean); procedure DrawBevel(Rect: TRect); procedure SetBackGround(Value: TColor); procedure SetBevelOuter(Value: TPanelBevel); procedure SetBevelInner(Value: TPanelBevel); procedure SetBevelWidth(Value: Byte); procedure SetLED(Value:Boolean); procedure SetLEDColor(Value: TLEDColor); procedure SetLEDType(Value: TLEDType); public constructor Create(AOwner: TComponent); override; procedure Paint; override; published property BackGround: TColor read FBackGround write SetBackGround default clBtnFace; property BevelOuter: TPanelBevel read FBevelOuter write SetBevelOuter default bvRaised; property BevelInner: TPanelBevel read FBevelInner write SetBevelInner default bvRaised; property BevelWidth: Byte read FBevelWidth write SetBevelWidth default 1; property LEDColor: TLEDColor read FLEDColor write SetLEDColor default lcRed; property LEDOn: Boolean read FLEDOn write SetLED default False; property LEDType: TLEDType read FLEDType write SetLEDType default ltRound; end; {------------------------------------------------------------------------------} procedure Register; implementation {------------------------------------------------------------------------------} constructor TLEDPaint.Create(AOwner: TComponent); begin inherited Create(AOwner); Canvas.Brush.Style:=bsSolid; FBackGround:=clBtnFace; FBevelOuter:=bvRaised; FBevelInner:=bvRaised; FBevelWidth:=1; FLEDColor:=lcRed; FLEDOn:=False; FLEDType:=ltRound; Border:=2; Left:=0; Top:=0; Width:=19; Height:=19; end; {------------------------------------------------------------------------------} procedure TLEDPaint.Paint; begin Draw(True); end; {------------------------------------------------------------------------------} procedure TLEDPaint.DrawBevel(Rect: TRect); var TopColor: TColor; BottomColor: TColor; procedure SetColors(Bevel: TPanelBevel); begin TopColor:=clBtnHighlight; if Bevel = bvLowered then TopColor:=clBtnShadow; BottomColor:=clBtnShadow; if Bevel = bvLowered then BottomColor:=clBtnHighlight; end; begin if FBevelOuter <> bvNone then begin SetColors(BevelOuter); Frame3D(Canvas,Rect,TopColor,BottomColor,BevelWidth); end; if FBevelInner <> bvNone then begin SetColors(FBevelInner); Frame3D(Canvas,Rect,TopColor,BottomColor,FBevelWidth); end; end; {------------------------------------------------------------------------------} procedure TLEDPaint.Draw(BkGnd: Boolean); var R: TRect; OnColor: TColor; OffColor: TColor; UpColor: TColor; DnColor: TColor; S: Byte; begin R:=GetClientRect; S:=Width div 6; {Abstand der Schattierung vom Au-enkreis} if BkGnd or (csDesigning in ComponentState) then begin DrawBevel(R); if FBackGround <> clWindow then begin Canvas.Pen.Color:=FBackGround; Canvas.Brush.Color:=FBackGround; InflateRect(R,-Border,-Border); Canvas.FillRect(R); end; end else InflateRect(R,-Border,-Border); case FLEDColor of lcNone : begin OnColor:=clBtnFace; OffColor:=clBtnFace; end; lcRed : begin OnColor:=clRed; OffColor:=clMaroon; end; lcGreen : begin OnColor:=clLime; OffColor:=clGreen; end; lcBlue : begin OnColor:=clBlue; OffColor:=clNavy; end; lcYellow : begin OnColor:=clYellow; OffColor:=clOlive; end; end; if FLEDOn then Canvas.Brush.Color:=OnColor else Canvas.Brush.Color:=OffColor; Canvas.Pen.Width:=1; if FLEDType = ltRound then begin if not FLEDOn then Canvas.Pen.Color:=clSilver else Canvas.Pen.Color:=clGray; Canvas.Ellipse(R.Left,R.Top,R.Right,R.Bottom); if FLEDOn then Canvas.Pen.Color:=clSilver else Canvas.Pen.Color:=clGray; Canvas.Arc(R.Left + S,R.Top + S, R.Right - S,R.Bottom - S, R.Right - S,R.Top + S, R.Left + S,R.Bottom - S); end else begin case BevelInner of bvRaised : Frame3D(Canvas,R,clBlack,clWhite,1); bvLowered : Frame3D(Canvas,R,clWhite,clBlack,1); bvNone : begin if FBevelOuter = bvLowered then Frame3D(Canvas,R,clWhite,clBlack,1) else Frame3D(Canvas,R,clBlack,clWhite,1); end; end; Canvas.FillRect(R); end; end; {------------------------------------------------------------------------------} procedure TLEDPaint.SetBackGround(Value: TColor); begin if FBackGround <> Value then begin FBackGround:=Value; Draw(True); end; end; {------------------------------------------------------------------------------} procedure TLEDPaint.SetBevelOuter(Value: TPanelBevel); begin if FBevelOuter <> Value then begin FBevelOuter:=Value; if FBevelOuter <> bvNone then Border:=FBevelWidth else Border:=0; if FBevelInner <> bvNone then Inc(Border,FBevelWidth); Draw(True); end; end; {------------------------------------------------------------------------------} procedure TLEDPaint.SetBevelInner(Value: TPanelBevel); begin if FBevelInner <> Value then begin FBevelInner:=Value; if FBevelOuter <> bvNone then Border:=FBevelWidth else Border:=0; if FBevelInner <> bvNone then Inc(Border,FBevelWidth); Draw(True); end; end; {------------------------------------------------------------------------------} procedure TLEDPaint.SetBevelWidth(Value: Byte); begin if FBevelWidth <> Value then begin FBevelWidth:=Value; if FBevelOuter <> bvNone then Border:=FBevelWidth else Border:=0; if FBevelInner <> bvNone then Inc(Border,FBevelWidth); Draw(True); end; end; {------------------------------------------------------------------------------} procedure TLEDPaint.SetLED(Value: Boolean); begin if FLEDOn <> Value then begin FLEDOn:=Value; Draw(False); end; end; {------------------------------------------------------------------------------} procedure TLEDPaint.SetLEDColor(Value: TLEDColor); begin if FLEDColor <> Value then begin FLEDColor:=Value; Draw(False); end; end; {------------------------------------------------------------------------------} procedure TLEDPaint.SetLEDType(Value: TLEDType); begin if FLEDType <> Value then begin FLEDType:=Value; Draw(True); end; end; {------------------------------------------------------------------------------} procedure Register; begin RegisterComponents('Udo|s',[TLEDPaint]); end; {------------------------------------------------------------------------------} initialization end.