📄 jvbreatheskin.pas
字号:
RC_SufixBKColor = 'bkcolor';
RC_SufixColor = 'color';
RC_SufixFontSize = 'fontsize';
RC_SufixFont = 'font';
RC_SufixHeight = 'Height';
RC_SufixWidth = 'Width';
RC_SufixVertical = 'vertical';
RC_InfoFile = 'info.txt';
RC_BmpThumb = 'volthumb.bmp';
RC_BmpVolRuler = 'volruler.bmp';
RC_BmpPosThumb = 'posthumb.bmp';
RC_BmpPosRuler = 'posruler.bmp';
RC_BmpOver = 'over.bmp';
RC_BmpMask = 'mask.bmp';
RC_BmpInfo = 'info.bmp';
RC_BmpDeact = 'deact.bmp';
RC_BmpBack = 'back.bmp';
RC_DefTotalInfo = 'Info';
RC_DefTotalTime = '00:00';
RC_DefSongName = 'none';
RC_DefVersion = '1.0';
RC_DefNothing = '-';
RC_DefStatus = 'Status';
//=== TJvBreatheSkin =========================================================
constructor TJvBreatheSkin.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FSkin := '';
FBOptions := TJvBreatheOption.Create(Self);
FBOptions.OnChange := OptionsChanged;
FTAbout := TStringList.Create;
// enable painting ;)
Parent := TWinControl(AOwner);
FImg := TImage.Create(Self);
FImg.AutoSize := True;
FImg.Parent := Self;
FImg.Left := 0;
FImg.Top := 0;
FImg.OnMouseDown := EasyFormDown;
FImg.OnMouseMove := EasyFormMove;
FLabels := TJvBreatheLabels.Create(Self);
FButtons := TJvBreatheButtons.Create(Self);
FButtons.Move.OnMouseMove := MoveFormMove;
FButtons.Move.OnMouseDown := MoveFormDown;
// Sliders
FVolume := TJvBreatheVolume.Create(Self);
FVolume.FSlider.Left := 0;
FVolume.FSlider.Top := 0;
FVolume.FSlider.Width := 0;
FVolume.FSlider.Height := 0;
FVolume.Maximum := 100;
FVolume.Position := 100;
FPosition := TJvBreathePosition.Create(Self);
FPosition.FSlider.Left := 0;
FPosition.FSlider.Top := 0;
FPosition.FSlider.Width := 0;
FPosition.FSlider.Height := 0;
FPosition.FSlider.Parent := Self;
// Images
FBack := TBitmap.Create;
FDeact := TBitmap.Create;
FInfo := TBitmap.Create;
FMask := TBitmap.Create;
FOver := TBitmap.Create;
FPosRuler := TBitmap.Create;
FPosThumb := TBitmap.Create;
FVolRuler := TBitmap.Create;
FVolThumb := TBitmap.Create;
// Labels
FLabels.Status.Caption := RC_DefStatus;
FLabels.CurrentTime.Caption := RC_DefTotalTime;
FLabels.Layer.Caption := RC_DefNothing;
FLabels.BitRate.Caption := RC_DefNothing;
FLabels.Frequency.Caption := RC_DefNothing;
FLabels.Version.Caption := RC_DefVersion;
FLabels.SongName.Caption := RC_DefSongName;
FLabels.TotalTime.Caption := RC_DefTotalTime;
FLabels.TotalInfo.Caption := RC_DefTotalInfo;
// Load default design
InitAllBtn;
LoadDefault;
end;
destructor TJvBreatheSkin.Destroy;
var
h: THandle;
begin
try
// Reset the region of the window if not destroying
if not (csDestroying in GetParentForm(TControl(Self)).ComponentState) then
begin
// Enable Caption
h := GetParentForm(TControl(Self)).Handle;
SetWindowLong(h, GWL_STYLE, GetWindowLong(h, GWL_STYLE) or WS_CAPTION);
// Use form region
SetWindowRgn(h, 0, True);
end;
except
end;
FBack.Free;
FDeact.Free;
FInfo.Free;
FMask.Free;
FOver.Free;
FPosRuler.Free;
FPosThumb.Free;
FVolRuler.Free;
FVolThumb.Free;
FImg.Free;
FVolume.Free;
FPosition.Free;
FBOptions.Free;
FLabels.Free;
FTAbout.Free;
FButtons.Free;
inherited Destroy;
end;
procedure TJvBreatheSkin.LoadDefault;
var
res: TResourceStream;
buf: array [0..255] of Char;
st: string;
procedure LoadFromRes(bmp: TBitmap; Value: string);
var
jpeg: TJpegImage;
r: TResourceStream;
begin
r := TResourceStream.Create(hInstance, Value, RT_RCDATA);
jpeg := TJPegImage.Create;
jpeg.LoadFromStream(r);
bmp.Assign(jpeg);
r.Free;
jpeg.Free;
end;
procedure LoadFromResPcx(bmp: TBitmap; Value: string);
var
pcx: TJvPcx;
r: TResourceStream;
begin
r := TResourceStream.Create(hInstance, Value, RT_RCDATA);
pcx := TJvPcx.Create;
pcx.LoadFromStream(r);
bmp.Assign(pcx);
r.Free;
pcx.Free;
end;
begin
// Load About text
res := TResourceStream.Create(hInstance, 'infot', RT_RCDATA);
FTAbout.LoadFromStream(res);
res.Free;
LoadFromRes(FBack, 'back');
LoadFromRes(FDeact, 'deact');
LoadFromRes(FInfo, 'info');
LoadFromRes(FPosRuler, 'posruler');
LoadFromRes(FPosThumb, 'posthumb');
LoadFromRes(FVolRuler, 'volruler');
LoadFromRes(FVolThumb, 'volthumb');
LoadFromResPcx(FOver, 'over');
LoadFromResPcx(FMask, 'mask');
// assign back picture
FImg.Picture.Assign(FBack);
Width := FImg.Width;
Height := FImg.Height;
// load default skin
GetTempPath(255, buf);
st := buf;
if st[Length(st)] <> '\' then
st := st + '\';
res := TResourceStream.Create(hInstance, 'main', RT_RCDATA);
res.SaveToFile(st + '1.Ini');
LoadSkin(st + '1.Ini');
DeleteFile(st + '1.Ini');
end;
procedure TJvBreatheSkin.InitBtn(Value: TJvImage);
begin
Value.Left := 0;
Value.Top := 0;
Value.Width := 0;
Value.Height := 0;
end;
procedure TJvBreatheSkin.InitAllBtn;
begin
InitBtn(FButtons.FPlay.FButton);
InitBtn(FButtons.FStop.FButton);
InitBtn(FButtons.FPause.FButton);
InitBtn(FButtons.FNext.FButton);
InitBtn(FButtons.FPrev.FButton);
InitBtn(FButtons.FOpen.FButton);
InitBtn(FButtons.FExit.FButton);
InitBtn(FButtons.FMove.FButton);
InitBtn(FButtons.FMinimize.FButton);
InitBtn(FButtons.FId3.FButton);
InitBtn(FButtons.FForward.FButton);
InitBtn(FButtons.FRewind.FButton);
InitBtn(FButtons.FOptions.FButton);
InitBtn(FButtons.FPlaylist.FButton);
end;
procedure TJvBreatheSkin.SetSkin(const Value: TFileName);
var
Path: string;
procedure LoadFromRes(bmp: TBitmap; Value: string);
var
jpeg: TJpegImage;
r: TResourceStream;
begin
r := TResourceStream.Create(HInstance, Value, RT_RCDATA);
jpeg := TJPegImage.Create;
jpeg.LoadFromStream(r);
bmp.Assign(jpeg);
r.Free;
jpeg.Free;
end;
begin
FSkin := Value;
if FSkin <> '' then
begin
// Load images
Path := ExtractFilePath(Value);
if FileExists(Path + RC_BmpBack) then
FBack.LoadFromFile(Path + RC_BmpBack)
else
FBack.Assign(nil);
if FileExists(Path + RC_BmpDeact) then
FDeact.LoadFromFile(Path + RC_BmpDeact)
else
FDeact.Assign(nil);
if FileExists(Path + RC_BmpInfo) then
FInfo.LoadFromFile(Path + RC_BmpInfo)
else
FInfo.Assign(nil);
if FileExists(Path + RC_BmpMask) then
FMask.LoadFromFile(Path + RC_BmpMask)
else
FMask.Assign(nil);
if FileExists(Path + RC_BmpOver) then
FOver.LoadFromFile(Path + RC_BmpOver)
else
FOver.Assign(nil);
if FileExists(Path + RC_BmpPosRuler) then
FPosRuler.LoadFromFile(Path + RC_BmpPosRuler)
else
LoadFromRes(FPosRuler, 'posruler');
if FileExists(Path + RC_BmpPosThumb) then
FPosThumb.LoadFromFile(Path + RC_BmpPosThumb)
else
LoadFromRes(FPosThumb, 'posthumb');
if FileExists(Path + RC_BmpVolRuler) then
FVolRuler.LoadFromFile(Path + RC_BmpVolRuler)
else
LoadFromRes(FVolRuler, 'volruler');
if FileExists(Path + RC_BmpThumb) then
FVolThumb.LoadFromFile(Path + RC_BmpThumb)
else
LoadFromRes(FVolThumb, 'volthumb');
// Assign background
FImg.Picture.Bitmap.Assign(FBack);
if FileExists(Path + RC_InfoFile) then
FTAbout.LoadFromFile(Path + RC_InfoFile)
else
FTAbout.Clear;
// if AutoSize
if FBOptions.AutoSize then
begin
Self.Width := FImg.Width;
Self.Height := FImg.Height;
end;
// Load Ini file
LoadSkin(FSkin);
end
else
LoadDefault;
end;
procedure TJvBreatheSkin.DecoupeOver(Value: TJvImage);
var
src: TRect;
bmp: TBitmap;
begin
src.Left := Value.Left;
src.Top := Value.Top;
src.Right := Value.Left + Value.Width;
src.Bottom := Value.Top + Value.Height;
bmp := TBItmap.Create;
bmp.Width := Value.Width;
bmp.Height := Value.Height;
bmp.Canvas.CopyRect(Rect(0, 0, Value.Width, Value.Height), FOver.Canvas, src);
Value.Picture.Bitmap.Assign(bmp);
bmp.Free;
end;
procedure TJvBreatheSkin.DecoupeOverAll;
begin
DecoupeOver(FButtons.FPlay.FButton);
DecoupeOver(FButtons.FStop.FButton);
DecoupeOver(FButtons.FPause.FButton);
DecoupeOver(FButtons.FNext.FButton);
DecoupeOver(FButtons.FPrev.FButton);
DecoupeOver(FButtons.FOpen.FButton);
DecoupeOver(FButtons.FExit.FButton);
DecoupeOver(FButtons.FMove.FButton);
DecoupeOver(FButtons.FMinimize.FButton);
DecoupeOver(FButtons.FId3.FButton);
DecoupeOver(FButtons.FForward.FButton);
DecoupeOver(FButtons.FRewind.FButton);
DecoupeOver(FButtons.FOptions.FButton);
DecoupeOver(FButtons.FPlaylist.FButton);
end;
procedure TJvBreatheSkin.LoadBtn(Ini: TIniFile; Value: TJvImage; Prefix: string);
begin
Value.Top := Ini.ReadInteger(RC_Section, Prefix + RC_SufixTop, 0);
Value.Left := Ini.ReadInteger(RC_Section, Prefix + RC_SufixLeft, 0);
Value.Width := Ini.ReadInteger(RC_Section, Prefix + RC_SufixWidth, 0);
Value.Height := Ini.ReadInteger(RC_Section, Prefix + RC_SufixHeight, 0);
end;
procedure TJvBreatheSkin.LoadSlider(Ini: TIniFile; Value: TJvSlider; Prefix: string);
begin
Value.Horizontal := not (Ini.ReadBool(RC_Section, Prefix + RC_SufixVertical, False));
Value.Top := Ini.ReadInteger(RC_Section, Prefix + RC_SufixTop, 0);
Value.Left := Ini.ReadInteger(RC_Section, Prefix + RC_SufixLeft, 0);
Value.Width := Ini.ReadInteger(RC_Section, Prefix + RC_SufixWidth, 0);
Value.Height := Ini.ReadInteger(RC_Section, Prefix + RC_SufixHeight, 0);
end;
procedure TJvBreatheSkin.LoadLabel(Ini: TIniFile; Value: TJvBreatheLabel; Prefix: string);
var
i: Integer;
begin
Value.Transparent := Ini.ReadBool(RC_Section, Prefix + RC_SufixTransp, False);
Value.Top := Ini.ReadInteger(RC_Section, Prefix + RC_SufixTop, 0);
Value.Left := Ini.ReadInteger(RC_Section, Prefix + RC_SufixLeft, 0);
Value.Width := Ini.ReadInteger(RC_Section, Prefix + RC_SufixWidth, 0);
Value.Height := Ini.ReadInteger(RC_Section, Prefix + RC_SufixHeight, 0);
Value.Font.Name := Ini.ReadString(RC_Section, Prefix + RC_SufixFont, 'arial');
i := Ini.ReadInteger(RC_Section, Prefix + RC_SufixFontSize, 8);
with TControlCanvas.Create do
begin
Control := Value.FLabel;
Font.Name := Value.Font.Name;
Font.Size := i;
if Value.Height > 0 then
while TextHeight('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+-*/|') > Value.Height do
begin
Dec(i);
Font.Size := i;
end;
Free;
end;
Value.Font.Size := i;
Value.Font.Color := Ini.ReadInteger(RC_Section, Prefix + RC_SufixColor, clBlack);
Value.Color := Ini.ReadInteger(RC_Section, Prefix + RC_SufixBKColor, clBlack);
end;
procedure TJvBreatheSkin.LoadLabel(Ini: TIniFile; Value: TJvBreatheScrollLabel; Prefix: string);
var
i: Integer;
begin
Value.Transparent := Ini.ReadBool(RC_Section, Prefix + RC_SufixTransp, False);
Value.Top := Ini.ReadInteger(RC_Section, Prefix + RC_SufixTop, 0);
Value.Left := Ini.ReadInteger(RC_Section, Prefix + RC_SufixLeft, 0);
Value.Width := Ini.ReadInteger(RC_Section, Prefix + RC_SufixWidth, 0);
Value.Height := Ini.ReadInteger(RC_Section, Prefix + RC_SufixHeight, 0);
Value.Font.Name := Ini.ReadString(RC_Section, Prefix + RC_SufixFont, 'arial');
i := Ini.ReadInteger(RC_Section, Prefix + RC_SufixFontSize, 8);
with TControlCanvas.Create do
begin
Control := Value.FLabel;
Font.Name := Value.Font.Name;
Font.Size := i;
if Value.Height > 0 then
while TextHeight('abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ+-*/|') > Value.Height do
begin
Dec(i);
Font.Size := i;
end;
Free;
end;
Value.Font.Size := i;
Value.Font.Color := Ini.ReadInteger(RC_Section, Prefix + RC_SufixColor, clBlack);
Value.Color := Ini.ReadInteger(RC_Section, Prefix + RC_SufixBKColor, clBlack);
end;
procedure TJvBreatheSkin.LoadSkin(Value: string);
var
Ini: TIniFile;
begin
Ini := TIniFile.Create(Value);
InitAllBtn;
LoadBtn(Ini, FButtons.FPrev.FButton, RC_PrefixPrevious);
LoadBtn(Ini, FButtons.FRewind.FButton, RC_PrefixRewind);
LoadBtn(Ini, FButtons.FStop.FButton, RC_PrefixStop);
LoadBtn(Ini, FButtons.FPause.FButton, RC_PrefixPause);
LoadBtn(Ini, FButtons.FPlay.FButton, RC_PrefixPlay);
LoadBtn(Ini, FButtons.FForward.FButton, RC_PrefixForward);
LoadBtn(Ini, FButtons.FNext.FButton, RC_PrefixNext);
LoadBtn(Ini, FButtons.FPlaylist.FButton, RC_PrefixPlaylist);
LoadBtn(Ini, FButtons.FId3.FButton, RC_PrefixId3);
LoadBtn(Ini, FButtons.FOpen.FButton, RC_PrefixOpen);
LoadBtn(Ini, FButtons.FOptions.FButton, RC_PrefixOption);
LoadBtn(Ini, FButtons.FMinimize.FButton, RC_PrefixMinimize);
LoadBtn(Ini, FButtons.FMove.FButton, RC_PrefixMove);
LoadBtn(Ini, FButtons.FExit.FButton, RC_PrefixExit);
FPosition.FSlider.ImageRuler.Assign(FPosRuler);
FPosition.FSlider.ImageThumb.Assign(FPosThumb);
FVolume.FSlider.ImageRuler.Assign(FVolRuler);
FVolume.FSlider.ImageThumb.Assign(FVolThumb);
LoadSlider(Ini, FPosition.FSlider, RC_PrefixTbbar);
LoadSlider(Ini, FVolume.FSlider, RC_PrefixVolbar);
LoadLabel(Ini, FLabels.Version, RC_PrefixVersion);
LoadLabel(Ini, FLabels.Frequency, RC_PrefixFrequency);
LoadLabel(Ini, FLabels.BitRate, RC_PrefixBitRate);
LoadLabel(Ini, FLabels.Layer, RC_PrefixLayer);
LoadLabel(Ini, FLabels.Status, RC_PrefixInfo);
LoadLabel(Ini, FLabels.CurrentTime, RC_PrefixTime);
LoadLabel(Ini, FLabels.TotalTime, RC_PrefixTotalTime);
LoadLabel(Ini, FLabels.TotalInfo, RC_PrefixTotalInfo);
LoadLabel(Ini, FLabels.SongName, RC_PrefixSongtitle);
if not FOver.Empty then
DecoupeOverAll;
Ini.Free;
OptionsChanged(Self);
if Assigned(FOnSkinLoaded) then
FOnSkinLoaded(Self);
end;
procedure TJvBreatheSkin.OptionsChanged(Sender: TObject);
var
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -