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

📄 lyricbar.pas

📁 超级播放器 -- 软件特点 -- 功能齐全 操作简便 绿色环保
💻 PAS
📖 第 1 页 / 共 2 页
字号:
unit lyricBar;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,StrUtils, Grids, Menus, ExtCtrls,registry;

type
  TfrmLyricBar = class(TForm)
    PopupMenu1: TPopupMenu;
    N1: TMenuItem;
    Timer1: TTimer;
    mnuScroll: TMenuItem;
    PaintBox1: TPaintBox;
    N3: TMenuItem;
    FontDialog1: TFontDialog;
    ColorDialog1: TColorDialog;
    lbBackFont: TLabel;
    LBFrontFont: TLabel;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    N9: TMenuItem;
    N10: TMenuItem;
    N11: TMenuItem;
    procedure FormShow(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormHide(Sender: TObject);
    procedure N1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure mnuScrollClick(Sender: TObject);
    procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure PaintBox1DblClick(Sender: TObject);
    procedure N3Click(Sender: TObject);
    procedure N6Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N11Click(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    fTop,fLeft,fWidth,fHeight:Smallint;
    procedure readSysInfo;
    procedure SaveSysInfo;
  public
    { Public declarations }
    lyricStrs:TStrings;
    vPlayItem:integer;    //目前歌词对应的曲目号
    HeadPos:integer;//目前滚动位置
    lyricBmp:TBitmap;
    pressLeft:boolean;
    PressMoveY:integer;

    ScrollAble:boolean;
    procedure resetLyric;
    procedure updateLyric;
    procedure UpdateView;
  end;

var
  frmLyricBar: TfrmLyricBar;

implementation

uses main;

{$R *.dfm}

procedure TfrmLyricBar.UpdateView;
var
   i:integer;
  NewRect,newrect2:Trect;
begin
  LyricBmp.canvas.FillRect(LyricBmp.canvas.ClipRect);
  for i:=0 to lyricStrs.Count -1 do
  begin
    if i=mainfrm.LyricIndex then
       LyricBmp.canvas.Font :=lbFrontFont.Font
    else
       LyricBmp.canvas.Font := lbBackFont.Font ;
    with NewRect2 do
    begin
       NewRect2.left :=lyricBmp.Canvas.ClipRect.left;
       NewRect2.right :=lyricBmp.Canvas.ClipRect.right;
       if not mainfrm.HaveLyric then
       begin
           NewRect2.top := 2 + i*(2+LBBackFont.Canvas.TextHeight(LyricStrs[i]));
           NewRect2.bottom:=NewRect2.top +LBBackFont.Canvas.TextHeight(LyricStrs[i]) ;
       end
       else
       begin
         if i<mainfrm.LyricIndex then
         begin
           NewRect2.top := 2 + i*(2+LBBackFont.Canvas.TextHeight(LyricStrs[i]));
           NewRect2.bottom:=NewRect2.top +LBBackFont.Canvas.TextHeight(LyricStrs[i]) ;
         end
         else if i= mainfrm.LyricIndex then
         begin
           NewRect2.top := 2 + i*(2+LBBackFont.Canvas.TextHeight(LyricStrs[i]));
           NewRect2.bottom:=NewRect2.top +LBFrontFont.Canvas.TextHeight(LyricStrs[i]) ;
         end
         else if i> mainfrm.LyricIndex then
         begin
           NewRect2.top := 2+ (i-1)*(2+LBBackFont.Canvas.TextHeight(LyricStrs[i]))
                          +(2+LBFrontFont.Canvas.TextHeight(LyricStrs[i])) ;
           NewRect2.bottom:=NewRect2.top +LBBackFont.Canvas.TextHeight(LyricStrs[i]) ;
         end;
       end;
    end;
    DrawText(LyricBmp.Canvas.Handle, PChar(lyricStrs[i]), Length(lyricStrs[i]),newrect2 ,  DT_CENTER or DT_SINGLELINE or DT_VCENTER)
  end;

  //刷掉原来歌词 向下移动后上方的歌词
  if HeadPos>0 then
    with NewRect do
    begin
      top := 0;
      left:=(paintbox1.ClientWidth -LyricBmp.Width) div 2;
      right:=left+LyricBmp.Width;
      bottom:=HeadPos;
      paintbox1.Canvas.FillRect(NewRect );
    end;

  //刷掉原来歌词  向上移动后下方的歌词
  if HeadPos+lyricBmp.Height <paintbox1.ClientHeight then
    with NewRect do
    begin
      top := HeadPos+lyricBmp.Height;
      left:=(paintbox1.ClientWidth -LyricBmp.Width) div 2;
      right:=left+LyricBmp.Width;
      bottom:=paintbox1.clientHeight;
      paintbox1.Canvas.FillRect(NewRect );
    end;

  //画出所有歌词
  newrect:=lyricbmp.Canvas.ClipRect;
  offsetRect(newRect,(paintbox1.ClientWidth -LyricBmp.Width) div 2,headPos);
  paintbox1.Canvas.CopyRect(NewRect ,LyricBmp.Canvas,lyricbmp.Canvas.cliprect);
end;

//设置字体大小后要...
procedure TfrmLyricBar.updateLyric;
var
  tmpstr:string;
  i,pos1:integer;
  maxWidth:integer;
  NewRect:Trect;
begin
     //刷掉原来显示的歌词
     NewRect.Top := HeadPos;
     NewRect.Bottom := HeadPos+LyricBmp.Height ;
     NewRect.Left := (PaintBox1.ClientWidth -LyricBmp.Width) div 2 ;
     NewRect.Right := NewRect.Left +LyricBmp.Width;
     Paintbox1.Canvas.FillRect(NewRect);

     maxWidth:=0;
     for i:=0 to lyricStrs.Count -1 do
     begin
        tmpstr:=lyricStrs.Strings[i];
        pos1:=pos(']',tmpstr);
        while pos1<>0 do
          begin
            tmpstr:=rightstr(tmpstr,length(tmpstr)-pos1);
            pos1:=pos(']',tmpstr);
          end;

        lyricStrs.Strings[i]:=tmpstr;
        if mainfrm.HaveLyric then
        begin
          if LBFrontFont.Canvas.TextWidth(tmpstr)>LBBackFont.Canvas.TextWidth(tmpstr) then
          begin
            if maxwidth<LBFrontFont.Canvas.TextWidth(tmpstr) then
              maxWidth:=LBFrontFont.Canvas.TextWidth(tmpstr);
          end
          else
          begin
            if maxwidth<LBBackFont.Canvas.TextWidth(tmpstr) then
              maxWidth:=LBBackFont.Canvas.TextWidth(tmpstr);
          end;
        end
        else
        begin
          if maxwidth<LBBackFont.Canvas.TextWidth(tmpstr) then
            maxWidth:=LBBackFont.Canvas.TextWidth(tmpstr);
        end;
     end;

     LyricBmp.Width :=MaxWidth;

     if Mainfrm.HaveLyric then
        LyricBmp.Height:=2+(lyricStrs.Count-1)*(lbbackFont.canvas.TextHeight(lbbackFont.Caption )+2)
                  + (lbFrontFont.canvas.TextHeight(lbFrontFont.Caption )+2)
     else
        LyricBmp.Height :=2+lyricStrs.Count*(lbbackFont.canvas.TextHeight(lbbackFont.Caption )+2);
end;

procedure TfrmLyricBar.resetLyric;
var
  tmpstr:string;
  i,pos1:integer;
  maxWidth:integer;
  NewRect:Trect;
begin
   //更新歌词
     if (HeadPos<>8000) or ((HeadPos=8000) and MainFrm.HaveLyric) then
     begin
       //刷掉原来歌词
       NewRect.Top :=HeadPos;
       NewRect.Bottom :=HeadPos+LyricBmp.Height ;
       NewRect.Left :=(PaintBox1.ClientWidth -LyricBmp.Width) div 2 ;
       NewRect.Right :=NewRect.Left +LyricBmp.Width;
       Paintbox1.Canvas.FillRect(NewRect);
     end;

     //
     if (HeadPos=8000) and not mnuScroll.Checked then
        HeadPos:= ( Paintbox1.ClientHeight-LyricBmp.Height) div 2;

     //正在修改当前歌词...
     if not (Mainfrm.HaveLyric and (vPlayItem=Mainfrm.playItem) and (lyricStrs<>mainfrm.Lyric)) then
       if mnuScroll.Checked then
         HeadPos:=Paintbox1.ClientHeight;


     if MainFrm.HaveLyric then
       vPlayItem:=Mainfrm.playItem
     else
       vPlayItem:=-1;
     if Mainfrm.HaveLyric then
       lyricStrs.Assign(mainfrm.Lyric)
     else
       lyricStrs.LoadFromFile('readme.txt');

     maxWidth:=0;
     for i:=0 to lyricStrs.Count -1 do
     begin
        tmpstr:=lyricStrs.Strings[i];
        pos1:=pos(']',tmpstr);
        while pos1<>0 do
          begin
            tmpstr:=rightstr(tmpstr,length(tmpstr)-pos1);
            pos1:=pos(']',tmpstr);
          end;

        lyricStrs.Strings[i]:=tmpstr;
        if mainfrm.HaveLyric then
        begin
          if LBFrontFont.Canvas.TextWidth(tmpstr)>LBBackFont.Canvas.TextWidth(tmpstr) then
          begin
            if maxwidth<LBFrontFont.Canvas.TextWidth(tmpstr) then
              maxWidth:=LBFrontFont.Canvas.TextWidth(tmpstr);
          end
          else
          begin
            if maxwidth<LBBackFont.Canvas.TextWidth(tmpstr) then
              maxWidth:=LBBackFont.Canvas.TextWidth(tmpstr);
          end;
        end
        else
        begin
          if maxwidth<LBBackFont.Canvas.TextWidth(tmpstr) then
            maxWidth:=LBBackFont.Canvas.TextWidth(tmpstr);
        end;
     end;

     LyricBmp.Width :=MaxWidth;

     if Mainfrm.HaveLyric then
        LyricBmp.Height:=2+(lyricStrs.Count-1)*(lbbackFont.canvas.TextHeight(lbbackFont.Caption )+2)
                  + (lbFrontFont.canvas.TextHeight(lbFrontFont.Caption )+2)
     else
        LyricBmp.Height :=2+lyricStrs.Count*(lbbackFont.canvas.TextHeight(lbbackFont.Caption )+2);
end;

procedure TfrmLyricBar.FormShow(Sender: TObject);
begin
   resetLyric;
   timer1.Enabled :=true;
end;

procedure TfrmLyricBar.FormCreate(Sender: TObject);
begin
  lyricBmp:=TBitmap.Create;
  with lyricbmp do
  begin
    canvas.Font :=lbBackFont.Font;
    width := paintbox1.ClientWidth;
    height := paintbox1.ClientHeight;
    canvas.Brush.Color :=clBlack;
  end;
  readSysInfo ;
  self.Caption :=application.Title +' - 歌词秀'  ;

  pressLeft:=false;
  lyricStrs:=Tstringlist.Create;
  LyricStrs.LoadFromFile('readme.txt');
  vPlayItem:=-1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -