⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jvbreatheskin.pas

📁 East make Tray Icon in delphi
💻 PAS
📖 第 1 页 / 共 4 页
字号:
  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 + -