Delphi 音乐播放器,支持桌面歌词、换肤、换颜色、歌词自动下载,Win7下支持小窗口预览,有些功能未完全完成,就如调整音量(懒得搞,但是可以听了,只写了一次性播放列表没得循环的)。支持酷狗、QQ的动感歌词,以动感方式显示自己的实现方法,工程是使用Delphi XE2开发,原本是用delphi7后因为要支持win7下面的那个小窗口模式的,所以改为delphi xe2了。
主界面:
自己使用GDI+做了个png图片的控件根据皮肤的xml配置文件动态生成上去的,一部分代码:
type
TImageState = (isNormal, isActive, isDown, isDisable);
TGDIImageButton = class(TGraphicControl)
private
(*鼠标进入*)
FOnMouseEnter : TNotifyEvent;
(*鼠标离开*)
FOnMouseLeave : TNotifyEvent;
(*当前状态*)
FState : TImageState;
(*状态图标数量*)
FImgCount: Integer;
(*自动调整大小*)
FAutoSize: Boolean;
(*按钮是否按下状态*)
FDownState: Boolean;
(*图片文件名称*)
FFileName: string;
(*GDI图片对象*)
FGDIImage: TGPImage;
(*标题*)
FCaption: string;
(*是否显示标题*)
FShowCaption: Boolean;
(*对齐方式*)
FAlignment : TAlignment;
不需要安装额外的第三方控件, 有兴趣可以下载全部源码查看。
桌面歌词:
这个结纠了我很久,也花了我不少的晚上(白天要上班,我也非职业程序员),最后还是实现了在同一窗口实现背景层,未播放和正在播放的颜色层,以及滚动,不得不说其中的一点不爽,就是计算文字的宽度,这个还有点不准确,导致有的歌词绘制没有这么准确,其中有一点我感觉比酷狗的好看,我并未直接将上层与下层叠加,而是将上层向上错开了一点这样一来显示出了带有点立体感的效果了。
下面是用来绘制第一行和第二行歌词的代码:
procedure TGDIDrawLyric.DrawLyricBitmapFirst;
begin
FStrWidth1 := Round(FFirstStrWidth + FFontHeight * 0.75);
if Assigned(FBackImage) then FBackImage.Free;
FBackImage := TGPBitmap.Create(FStrWidth1, FFontHeight+1);
DrawStrToImage(FBackImage , FFirstStr, FFontName, FStrWidth1, FBackColor1, FBackColor2,
FFontHeight, True, StringAlignmentNear);
if Assigned(FForeImage) then FForeImage.Free;
FForeImage := TGPBitmap.Create(FStrWidth1, FFontHeight+1);
DrawStrToImage(FForeImage , FFirstStr, FFontName, FStrWidth1, FForeColor1, FForeColor2,
FFontHeight, False, StringAlignmentNear);
UpdateDisplay;
end;
procedure TGDIDrawLyric.DrawLyricBitmapNext;
begin
FStrWidth2 := Round(FNextStrWidth + FFontHeight * 0.75);
if Assigned(FBackImage2) then FBackImage2.Free;
FBackImage2 := TGPBitmap.Create(FStrWidth2, FFontHeight+1);
DrawStrToImage(FBackImage2 , FNextStr, FFontName, FStrWidth2, FBackColor1, FBackColor2,
FFontHeight, True, StringAlignmentNear);
if Assigned(FForeImage2) then FForeImage2.Free;
FForeImage2 := TGPBitmap.Create(FStrWidth2, FFontHeight+1);
DrawStrToImage(FForeImage2 , FNextStr, FFontName, FStrWidth2, FForeColor1, FForeColor2,
FFontHeight, False, StringAlignmentNear);
UpdateDisplay;
end;
在我的桌面歌词中实现同一层绘制已经播放和未播放关键在于下面这句了:
gFore.SetClip(MakeRect(TmpLeft2, TmpTop2, FPosition, TmpHeight)) ;
使用这句不断截剪矩形(自己这么认为)配合速度显示出不同的效果
播放列表:
是继承自TCustomDrawGrid自绘的一个(这个想了很久最后决定用这个了),一部分代码,代码很简单,也没写得很全,因为自己懒得搞,所以列表是直接传入一个 TList 的,所有的添加列表代码的都在主窗口那里做了
TPlayListCtl = class(TCustomDrawGrid)
private
(*鼠标进入*)
FOnMouseEnter : TNotifyEvent;
(*鼠标离开*)
FOnMouseLeave : TNotifyEvent;
FMouseMoveIndex : Integer;
FPlayingIndex : Integer;
FPlayColor : TColor;
FMouseMoveColor : TColor;
FFocusedColor : TColor;
FSingerPic: TBitmap;
(*要绘制数据*)
FData:TList;
procedure SetPlayListData(Value: TList);
procedure SetSingerPic(Value: TBitmap);
procedure SetNowPlayIndex(Value: Integer);
procedure SetFocusedColor(Value : TColor);
(*鼠标事件*)
procedure FDrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure FMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
后记:本来还想写在线搜索播放的,现在已经没有什么心情了,关于MP3的标签,由于写了一部分,但未用在这里,这里就做了简单的处理连歌曲名和哥手都直接使用 - 分割标题的,哈哈,这点实在是太。。。。。自己都看不过去了,大家可以一展自己的所长将自己喜欢的东西加上去,来完善这个播放器。别忘了给我看看啊。
现已开源!
下载地址:http://download.csdn.net/detail/zyjying520/4900043
效果图: