📄 lyricbar.pas
字号:
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 + -