📄 bsskinexctrls.pas
字号:
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 TbsSkinAnimateGauge.CreateImage;
begin
CreateSkinControlImage(B, Picture, SkinRect);
end;
procedure TbsSkinAnimateGauge.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 TbsSkinAnimateGauge.GetSkinData;
begin
inherited;
if FIndex <> -1
then
if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinGaugeControl
then
with TbsDataSkinGaugeControl(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 TbsSkinAnimateGauge.ChangeSkinData;
var
FAnimation: Boolean;
begin
FAnimation := FAnimationTimer <> nil;
if FAnimation then StopAnimation;
inherited;
if FAnimation then StartAnimation;
end;
constructor TbsSkinLinkImage.Create(AOwner : TComponent);
begin
inherited Create(AOwner);
AutoSize := True;
Cursor := crHandPoint;
end;
procedure TbsSkinLinkImage.Click;
begin
inherited Click;
if FURL <> ''
then
ShellExecute(0, 'open', PChar(FURL), nil, nil, SW_SHOWNORMAL);
end;
constructor TbsSkinLinkLabel.Create;
begin
inherited;
FUseUnderLine := True;
FIndex := -1;
Transparent := True;
FSD := nil;
FSkinDataName := 'stdlabel';
FDefaultFont := TFont.Create;
with FDefaultFont do
begin
Name := 'Arial';
Height := 14;
Style := [fsUnderLine];
end;
Font.Assign(FDefaultFont);
Cursor := crHandPoint;
FUseSkinFont := True;
FDefaultActiveFontColor := clBlue;
FURL := '';
end;
destructor TbsSkinLinkLabel.Destroy;
begin
FDefaultFont.Free;
inherited;
end;
procedure TbsSkinLinkLabel.SetUseUnderLine;
begin
if FUseUnderLine <> Value
then
begin
FUseUnderLine := Value;
RePaint;
end;
end;
procedure TbsSkinLinkLabel.DoDrawText(var Rect: TRect; Flags: Longint);
var
Text: string;
begin
GetSkinData;
Text := GetLabelText;
if (Flags and DT_CALCRECT <> 0) and ((Text = '') or ShowAccelChar and
(Text[1] = '&') and (Text[2] = #0)) then Text := Text + ' ';
if not ShowAccelChar then Flags := Flags or DT_NOPREFIX;
Flags := DrawTextBiDiModeFlags(Flags);
if FIndex <> -1
then
with Canvas.Font do
begin
if FUseSkinFont
then
begin
Name := FontName;
Style := FontStyle;
Height := FontHeight;
if FUseUnderLine
then
Style := Style + [fsUnderLine]
else
Style := Style - [fsUnderLine];
end
else
begin
Canvas.Font := Self.Font;
if FUseUnderLine
then
Style := Style + [fsUnderLine]
else
Style := Style - [fsUnderLine];
end;
if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
then
Charset := SkinData.ResourceStrData.CharSet
else
CharSet := FDefaultFont.Charset;
if FMouseIn
then
Color := ActiveFontColor
else
Color := FontColor;
end
else
begin
if FUseSkinFont
then
Canvas.Font := DefaultFont
else
Canvas.Font := Self.Font;
if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
then
Canvas.Font.Charset := SkinData.ResourceStrData.CharSet
else
Canvas.Font.CharSet := FDefaultFont.Charset;
if FMouseIn then Canvas.Font.Color := FDefaultActiveFontColor;
Canvas.Font.Style := Canvas.Font.Style + [fsUnderLine];
end;
if not Enabled then
begin
OffsetRect(Rect, 1, 1);
if FIndex <> -1
then
Canvas.Font.Color := FSD.SkinColors.cBtnHighLight
else
Canvas.Font.Color := clBtnHighlight;
DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
OffsetRect(Rect, -1, -1);
if FIndex <> -1
then
Canvas.Font.Color := FSD.SkinColors.cBtnShadow
else
Canvas.Font.Color := clBtnShadow;
DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
end
else
begin
if FUseUnderLine
then
Canvas.Font.Style := Canvas.Font.Style + [fsUnderLine]
else
Canvas.Font.Style := Canvas.Font.Style - [fsUnderLine];
DrawText(Canvas.Handle, PChar(Text), Length(Text), Rect, Flags);
end;
end;
procedure TbsSkinLinkLabel.Click;
begin
inherited;
if FURL <> ''
then
ShellExecute(0, 'open', PChar(FURL), nil, nil, SW_SHOWNORMAL);
end;
procedure TbsSkinLinkLabel.CMMouseEnter;
begin
inherited;
if (csDesigning in ComponentState) then Exit;
FMouseIn := True;
RePaint;
end;
procedure TbsSkinLinkLabel.CMMouseLeave;
begin
inherited;
if (csDesigning in ComponentState) then Exit;
FMouseIn := False;
RePaint;
end;
procedure TbsSkinLinkLabel.SetDefaultFont;
begin
FDefaultFont.Assign(Value);
end;
procedure TbsSkinLinkLabel.Notification;
begin
inherited Notification(AComponent, Operation);
if (Operation = opRemove) and (AComponent = FSD) then FSD := nil;
end;
procedure TbsSkinLinkLabel.GetSkinData;
begin
if (FSD = nil) or FSD.Empty
then
FIndex := -1
else
FIndex := FSD.GetControlIndex(FSkinDataName);
if (FIndex <> -1)
then
if TbsDataSkinControl(FSD.CtrlList.Items[FIndex]) is TbsDataSkinStdLabelControl
then
with TbsDataSkinStdLabelControl(FSD.CtrlList.Items[FIndex]) do
begin
Self.FontName := FontName;
Self.FontColor := FontColor;
Self.FontStyle := FontStyle;
Self.FontHeight := FontHeight;
Self.ActiveFontColor := ActiveFontColor;
end
end;
procedure TbsSkinLinkLabel.ChangeSkinData;
begin
GetSkinData;
RePaint;
end;
procedure TbsSkinLinkLabel.SetSkinData;
begin
FSD := Value;
if (FSD <> nil) then ChangeSkinData;
end;
constructor TbsSkinXFormButton.Create(AOwner: TComponent);
begin
inherited;
FDefImage := TBitMap.Create;
FDefActiveImage := TBitMap.Create;
FDefDownImage := TBitMap.Create;
FDefMask := TBitMap.Create;
CanFocused := False;
FDefActiveFontColor := 0;
FDefDownFontColor := 0;
end;
destructor TbsSkinXFormButton.Destroy;
begin
FDefImage.Free;
FDefActiveImage.Free;
FDefDownImage.Free;
FDefMask.Free;
inherited;
end;
procedure TbsSkinXFormButton.SetControlRegion;
var
TempRgn: HRGN;
begin
if (FIndex = -1) and (FDefImage <> nil) and not FDefImage.Empty
then
begin
TempRgn := FRgn;
if FDefMask.Empty and (FRgn <> 0)
then
begin
SetWindowRgn(Handle, 0, True);
end
else
begin
CreateSkinSimplyRegion(FRgn, FDefMask);
SetWindowRgn(Handle, FRgn, True);
end;
if TempRgn <> 0 then DeleteObject(TempRgn);
end
else
inherited;
end;
procedure TbsSkinXFormButton.SetBounds;
begin
inherited;
if (FIndex = -1) and (FDefImage <> nil) and not FDefImage.Empty
then
begin
if Width <> FDefImage.Width then Width := FDefImage.Width;
if Height <> FDefImage.Height then Height := FDefImage.Height;
end;
end;
procedure TbsSkinXFormButton.DrawDefaultButton;
var
IsDown: Boolean;
R: TRect;
begin
with C do
begin
R := ClientRect;
Font.Assign(FDefaultFont);
if (SkinData <> nil) and (SkinData.ResourceStrData <> nil)
then
Font.Charset := SkinData.ResourceStrData.CharSet
else
Font.Charset := FDefaultFont.CharSet;
IsDown := FDown and (((FMouseIn or (IsFocused and not FMouseDown)) and
(GroupIndex = 0)) or (GroupIndex <> 0));
if IsDown and not FDefDownImage.Empty
then
Draw(0, 0, FDefDownImage)
else
if (FMouseIn or IsFocused) and not FDefActiveImage.Empty
then
Draw(0, 0, FDefActiveImage)
else
Draw(0, 0, FDefImage);
if IsDown
then
Font.Color := FDefDownFontColor
else
if FMouseIn or IsFocused
then
Font.Color := FDefActiveFontColor;
DrawGlyphAndText(C, ClientRect, FMargin, FSpacing, FLayout,
Caption, FGlyph, FNumGlyphs, GetGlyphNum(FDown, FMouseIn), IsDown, False, 0);
end;
end;
procedure TbsSkinXFormButton.CreateControlDefaultImage;
begin
if (FIndex = -1) and not FDefImage.Empty
then
DrawDefaultButton(B.Canvas)
else
inherited;
end;
procedure TbsSkinXFormButton.ChangeSkinData;
begin
GetSkinData;
if (FIndex = -1) and not FDefImage.Empty
then
begin
Width := FDefImage.Width;
Height := FDEfImage.Width;
SetControlRegion;
RePaint;
end
else
inherited;
end;
procedure TbsSkinXFormButton.SetDefImage(Value: TBitMap);
begin
FDefImage.Assign(Value);
if not FDefImage.Empty
then
begin
DefaultHeight := FDefImage.Height;
DefaultWidth := FDefImage.Width;
end;
end;
procedure TbsSkinXFormButton.SetDefActiveImage(Value: TBitMap);
begin
FDefActiveImage.Assign(Value);
end;
procedure TbsSkinXFormButton.SetDefDownImage(Value: TBitMap);
begin
FDefDownImage.Assign(Value);
end;
procedure TbsSkinXFormButton.SetDefMask(Value: TBitMap);
begin
FDefMask.Assign(Value);
if not FDefImage.Empty
then
SetControlRegion;
end;
procedure TbsSkinXFormButton.Loaded;
begin
inherited;
if (FIndex = -1) and (FDefMask <> nil) and not FDefMask.Empty
then
SetControlRegion;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -