类似酷我音乐盒设计小总结(C#版)

C#版类似酷我音乐盒设计小总结

酷我音乐盒很酷吧,我们一个个写程序的程序员(包括我这种业余选手)总是手心痒痒,要不开始动手仿制一下呗,不过不包括网络下载功能。

我主要是将设计重点放在了音乐播放歌词显示歌词拖动定位歌词滚动定位桌面歌词加滚动的实现上。下面一一介绍这些实现过程。

一、歌曲播放

歌曲播放使用主要使用MCI APImciSendStringmciSendCommand函数,mciSendString在用C#开发比较方便,mciSendCommand再用C/C++开发比较方便,mciSendString效率不如mciSendCommand。这里我使用mciSendString函数实现歌曲播放。关于MCI API的相关文档,大家可以网上搜索,这里不做介绍。

二、歌词显示


歌词显示,要实现这个功能,首先需要自己封装一个LRC类,用来加载Lrc文件,Lrc文件的格式网上有详细说明,这里不多介绍,不过大家注意下lrc中的[offset:毫秒数]节点,因为后面的歌词拖动定位功能将使用该节点属性。加载后的LRC类应该包含基本的ar,ti,ai,by,offset属性和一个包含歌词的list<lrcitem>lrcitem中包含两个属性int timestring txttime是该句歌词的位置(毫秒)txt是该句歌词的内容。

歌词显示有几种方式,可以定时更新paint有效歌词到一张bmp上面。或者一次性paintbmp上面,定时移动bmplocation,然后用蒙版将当前歌词高亮。

三、歌词拖动定位和滚动定位

类似酷我音乐盒设计小总结(C#版)_第1张图片

歌词拖动定位,酷我在拖动歌词时候,歌曲播放位置并没有改变,而是改变了当前歌词的位置。这个可以通过改变LRC类实例的offset属性来实现,offset增加则歌词提前,反之相反。

歌词滚动定位,酷我在鼠标滚动时候会调节歌词位置和歌曲播放位置。这个可以直接调用mciSendString函数来实现,函数具体用法可以网上查阅。

四、桌面歌词加滚动显示


桌面歌词实现比较有意思点,网上通常的办法是窗口用透明位图,绘制文字上去来实现。但是这种办法并不是酷我使用的办法,酷我在桌面歌词显示的时候,窗口具有topmost属性。


而且被歌词覆盖的矩形区域是不影响被覆盖窗体的事件的。看到这里我相信有一些朋友已经想到了他的实现原理,没错,就是异型窗体(不规则窗体),异形窗体的实现网上资料不少,利用GraphicsPath实现,同时可以制作出文字描边效果,很像吧。。

整个程序用一个timer来定时更新歌词显示,鼠标滚动和拖动直接调节歌词或者歌曲位置,异型窗体实现桌面歌词。

好了,总结就写到这里!~~~~


你可能感兴趣的:(timer,网络,C#,文档,音乐)