📄 skinexctrls.pas
字号:
procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
procedure GetSkinData;
procedure DoDrawText(var Rect: TRect; Flags: Longint); override;
public
FontName: String;
FontStyle: TFontStyles;
FontHeight: Integer;
FontColor, ActiveFontColor: TColor;
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
procedure ChangeSkinData;
procedure Click; override;
published
property UseUnderLine: Boolean read FUseUnderLine write SetUseUnderLine;
property UseSkinFont: Boolean read FUseSkinFont write FUseSkinFont;
property DefaultActiveFontColor: TColor
read FDefaultActiveFontColor write FDefaultActiveFontColor;
property URL: String read FURL write FURL;
property DefaultFont: TFont read FDefaultFont write SetDefaultFont;
property SkinData: TspSkinData read FSD write SetSkinData;
property SkinDataName: String read FSkinDataName write FSkinDataName;
property Font;
property Align;
property Alignment;
property Anchors;
property AutoSize;
property BiDiMode;
property Caption;
property Color;
property Constraints;
property DragCursor;
property DragKind;
property DragMode;
property Enabled;
property FocusControl;
property ParentBiDiMode;
property ParentColor;
property ParentFont;
property ParentShowHint;
property PopupMenu;
property ShowAccelChar;
property ShowHint;
property Layout;
property Visible;
property WordWrap;
property OnClick;
property OnDblClick;
property OnDragDrop;
property OnDragOver;
property OnEndDock;
property OnEndDrag;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
property OnStartDock;
property OnStartDrag;
end;
implementation
Uses spEffBmp, ShellAPI;
const
DEF_GAUGE_FRAMES = 10;
// TspSkinAnimateGauge
constructor TspSkinAnimateGauge.Create;
begin
inherited;
Width := 100;
Height := 20;
BeginOffset := 0;
EndOffset := 0;
FProgressText := '';
FShowProgressText := False;
FSkinDataName := 'gauge';
FAnimationPause := 1000;
FAnimationPauseTimer := nil;
FAnimationTimer := nil;
FAnimationFrame := 0;
FCountFrames := 0;
FImitation := False;
end;
destructor TspSkinAnimateGauge.Destroy;
begin
if FAnimationPauseTimer <> nil then FAnimationPauseTimer.Free;
if FAnimationTimer <> nil then FAnimationTimer.Free;
inherited;
end;
procedure TspSkinAnimateGauge.OnAnimationPauseTimer(Sender: TObject);
begin
StartInternalAnimation;
end;
procedure TspSkinAnimateGauge.OnAnimationTimer(Sender: TObject);
begin
Inc(FAnimationFrame);
if FAnimationFrame > FCountFrames
then
StopInternalAnimation;
RePaint;
end;
procedure TspSkinAnimateGauge.SetAnimationPause;
begin
if Value >= 0
then
FAnimationPause := Value;
end;
procedure TspSkinAnimateGauge.StartInternalAnimation;
begin
if FAnimationPauseTimer <> nil then FAnimationPauseTimer.Enabled := False;
FAnimationFrame := 0;
FAnimationTimer.Enabled := True;
RePaint;
end;
procedure TspSkinAnimateGauge.StopInternalAnimation;
begin
if FAnimationPauseTimer <> nil then FAnimationPauseTimer.Enabled := True;
FAnimationTimer.Enabled := False;
FAnimationFrame := 0;
RePaint;
end;
procedure TspSkinAnimateGauge.StartAnimation;
begin
if (FIndex = -1) or ((FIndex <> -1) and
IsNullRect(Self.AnimationSkinRect))
then
begin
FImitation := True;
FCountFrames := DEF_GAUGE_FRAMES + 5;
end
else
begin
FImitation := False;
if AnimationCountFrames = 1
then
FCountFrames := (RectWidth(NewProgressArea) + RectWidth(AnimationSkinRect) * 2)
div (RectWidth(AnimationSkinRect) div 3)
else
FCountFrames := AnimationCountFrames;
end;
if FAnimationPauseTimer <> nil then FAnimationPauseTimer.Free;
if FAnimationTimer <> nil then FAnimationTimer.Free;
FAnimationPauseTimer := TTimer.Create(Self);
FAnimationPauseTimer.Enabled := False;
FAnimationPauseTimer.OnTimer := OnAnimationPauseTimer;
FAnimationPauseTimer.Interval := FAnimationPause;
FAnimationPauseTimer.Enabled := True;
FAnimationTimer := TTimer.Create(Self);
FAnimationTimer.Enabled := False;
FAnimationTimer.OnTimer := OnAnimationTimer;
if FImitation
then
FAnimationTimer.Interval := 40
else
FAnimationTimer.Interval := Self.AnimationTimerInterval;
StartInternalAnimation;
end;
procedure TspSkinAnimateGauge.StopAnimation;
begin
FAnimationFrame := 0;
if FAnimationTimer = nil then Exit;
if FAnimationPauseTimer <> nil
then
begin
FAnimationPauseTimer.Enabled := False;
FAnimationPauseTimer.Free;
FAnimationPauseTimer := nil;
end;
if FAnimationTimer <> nil
then
begin
FAnimationTimer.Enabled := False;
FAnimationTimer.Free;
FAnimationTimer := nil;
end;
RePaint;
end;
procedure TspSkinAnimateGauge.WMEraseBkgnd;
begin
if not FromWMPaint
then
PaintWindow(Msg.DC);
end;
procedure TspSkinAnimateGauge.DrawProgressText;
var
S: String;
TX, TY: Integer;
F: TLogFont;
begin
if (FIndex = -1)
then
C.Font.Assign(FDefaultFont)
else
if (FIndex <> -1) and not FUseSkinFont
then
begin
C.Font.Assign(FDefaultFont);
C.Font.Color := FontColor;
end
else
with C do
begin
Font.Name := FontName;
Font.Height := FontHeight;
Font.Style := FontStyle;
Font.Color := FontColor;
end;
if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
then
C.Font.Charset := SkinData.ResourceStrData.CharSet
else
C.Font.CharSet := FDefaultFont.Charset;
S := '';
if FShowProgressText then S := S + FProgressText;
if S = '' then Exit;
with C do
begin
TX := Width div 2 - TextWidth(S) div 2;
TY := Height div 2 - TextHeight(S) div 2;
Brush.Style := bsClear;
TextOut(TX, TY, S);
end;
end;
procedure TspSkinAnimateGauge.SetShowProgressText;
begin
FShowProgressText := Value;
RePaint;
end;
procedure TspSkinAnimateGauge.SetProgressText;
begin
FProgressText := Value;
RePaint;
end;
procedure TspSkinAnimateGauge.CalcSize;
var
Offset: Integer;
W1, H1: Integer;
begin
inherited;
if ResizeMode > 0
then
begin
Offset := W - RectWidth(SkinRect);
NewProgressArea := ProgressArea;
Inc(NewProgressArea.Right, Offset);
end
else
NewProgressArea := ProgressArea;
if (FIndex <> -1) and not IsNullRect(AnimationSkinRect) and
(Self.AnimationCountFrames = 1)
then
begin
FCountFrames := (RectWidth(NewProgressArea) + RectWidth(AnimationSkinRect) * 2)
div (RectWidth(AnimationSkinRect) div 3);
if (FAnimationTimer <> nil) and FAnimationTimer.Enabled
then
if FAnimationFrame > FCountFrames then FAnimationFrame := 1;
end;
end;
function TspSkinAnimateGauge.GetAnimationFrameRect;
var
fs: Integer;
begin
if RectWidth(AnimationSkinRect) > RectWidth(AnimationSkinRect)
then
begin
fs := RectWidth(AnimationSkinRect) div AnimationCountFrames;
Result := Rect(AnimationSkinRect.Left + (FAnimationFrame - 1) * fs,
AnimationSkinRect.Top,
AnimationSkinRect.Left + FAnimationFrame * fs,
AnimationSkinRect.Bottom);
end
else
begin
fs := RectHeight(AnimationSkinRect) div AnimationCountFrames;
Result := Rect(AnimationSkinRect.Left,
AnimationSkinRect.Top + (FAnimationFrame - 1) * fs,
AnimationSkinRect.Right,
AnimationSkinRect.Top + FAnimationFrame * fs);
end;
end;
function TspSkinAnimateGauge.CalcProgressRect: TRect;
var
R: TRect;
FrameWidth: Integer;
begin
R.Top := NewProgressArea.Top;
R.Bottom := R.Top + RectHeight(ProgressRect);
FrameWidth := Width div DEF_GAUGE_FRAMES;
R.Left := NewProgressArea.Left + (FAnimationFrame - 1) * FrameWidth - 3 * FrameWidth;
R.Right := R.Left + FrameWidth;
Result := R;
end;
procedure TspSkinAnimateGauge.CreateControlSkinImage;
var
Buffer: TBitMap;
R, R1: TRect;
X, Y: Integer;
XStep: Integer;
begin
inherited;
if (FAnimationTimer = nil) or (FCountFrames = 0) or (FAnimationFrame = 0)
then
begin
if ShowProgressText then DrawProgressText(B.Canvas);
Exit;
end;
if FImitation
then
begin
R := CalcProgressRect;
R.Left := R.Left - RectWidth(R) div 2;
R.Right := R.Right + RectWidth(R) div 2;
Buffer := TBitMap.Create;
Buffer.Width := RectWidth(R);
Buffer.Height := RectHeight(R);
CreateHSkinImage(BeginOffset, EndOffset, Buffer, Picture, ProgressRect,
Buffer.Width, Buffer.Height, ProgressStretch);
if ProgressTransparent
then
begin
Buffer.Transparent := True;
Buffer.TransparentMode := tmFixed;
Buffer.TransparentColor := ProgressTransparentColor;
end;
IntersectClipRect(B.Canvas.Handle,
NewProgressArea.Left, NewProgressArea.Top,
NewProgressArea.Right, NewProgressArea.Bottom);
B.Canvas.Draw(R.Left, R.Top, Buffer);
if ShowProgressText then DrawProgressText(B.Canvas);
Buffer.Free;
end
else
if not FImitation and (AnimationCountFrames > 1)
then
begin
R := NewProgressArea;
R1 := GetAnimationFrameRect;
Buffer := TBitMap.Create;
Buffer.Width := RectWidth(R);
Buffer.Height := RectHeight(R);
CreateHSkinImage(AnimationBeginOffset,
AnimationEndOffset, Buffer, Picture, R1,
Buffer.Width, Buffer.Height, True);
IntersectClipRect(B.Canvas.Handle,
NewProgressArea.Left, NewProgressArea.Top,
NewProgressArea.Right, NewProgressArea.Bottom);
B.Canvas.Draw(R.Left, R.Top, Buffer);
if ShowProgressText then DrawProgressText(B.Canvas);
Buffer.Free;
end
else
if not FImitation and (AnimationCountFrames = 1)
then
begin
FCountFrames := (RectWidth(NewProgressArea) + RectWidth(AnimationSkinRect) * 2)
div (RectWidth(AnimationSkinRect) div 3);
if FAnimationFrame > FCountFrames then FAnimationFrame := 1;
Buffer := TBitMap.Create;
Buffer.Width := RectWidth(AnimationSkinRect);
Buffer.Height := RectHeight(AnimationSkinRect);
Buffer.Canvas.CopyRect(Rect(0, 0, Buffer.Width, Buffer.Height), Picture.Canvas,
AnimationSkinRect);
XStep := RectWidth(AnimationSkinRect) div 3;
X := NewProgressArea.Left + XStep * (FAnimationFrame - 1) -
RectWidth(AnimationSkinRect);
Y := NewProgressArea.Top;
IntersectClipRect(B.Canvas.Handle,
NewProgressArea.Left, NewProgressArea.Top,
NewProgressArea.Right, NewProgressArea.Bottom);
B.Canvas.Draw(X, Y, Buffer);
if ShowProgressText then DrawProgressText(B.Canvas);
Buffer.Free;
end;
end;
procedure TspSkinAnimateGauge.CreateImage;
begin
CreateSkinControlImage(B, Picture, SkinRect);
end;
procedure TspSkinAnimateGauge.CreateControlDefaultImage(B: TBitMap);
var
R, PR: TRect;
V: Integer;
begin
R := ClientRect;
B.Canvas.Brush.Color := clWindow;
B.Canvas.FillRect(R);
Frame3D(B.Canvas, R, clbtnShadow, clbtnShadow, 1);
DrawProgressText(B.Canvas);
end;
procedure TspSkinAnimateGauge.GetSkinData;
begin
inherited;
if FIndex <> -1
then
if TspDataSkinControl(FSD.CtrlList.Items[FIndex]) is TspDataSkinGaugeControl
then
with TspDataSkinGaugeControl(FSD.CtrlList.Items[FIndex]) do
begin
Self.ProgressRect := ProgressRect;
Self.ProgressArea := ProgressArea;
Self.BeginOffset := BeginOffset;
Self.EndOffset := EndOffset;
Self.FontName := FontName;
Self.FontStyle := FontStyle;
Self.FontHeight := FontHeight;
Self.FontColor := FontColor;
Self.ProgressTransparent := ProgressTransparent;
Self.ProgressTransparentColor := ProgressTransparentColor;
Self.ProgressStretch := ProgressStretch;
Self.AnimationSkinRect := AnimationSkinRect;
Self.AnimationCountFrames := AnimationCountFrames;
Self.AnimationTimerInterval := AnimationTimerInterval;
Self.AnimationBeginOffset := AnimationBeginOffset;
Self.AnimationEndOffset := AnimationEndOffset;
end;
end;
procedure TspSkinAnimateGauge.ChangeSkinData;
var
FAnimation: Boolean;
begin
FAnimation := FAnimationTimer <> nil;
if FAnimation then StopAnimation;
inherited;
if FAnimation then StartAnimation;
end;
// ===================== TpSkinWaveLabel ==================== //
constructor TspSkinWaveLabel.Create(AOwner: TComponent);
begin
inherited;
ControlStyle := ControlStyle + [csOpaque];
FSkinDataName := 'stdlabel';
Width := 200;
Height := 40;
//
Font.Name := 'Arial';
Font.Size := 16;
Font.Style := [fsBold];
//
FAntialiasing := True;
FXDiv := 20;
FYDiv := 20;
FRatioVal := 5;
FUseSkinColor := True;
FAlignment := taCenter;
end;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -