類似酷我音樂盒設計小總結(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,然後用蒙版將當前歌詞高亮。

三、歌詞拖動定位和滾動定位


歌詞拖動定位,酷我在拖動歌詞時候,歌曲播放位置並沒有改變,而是改變了當前歌詞的位置。這個可以通過改變LRC類實例的offset屬性來實現,offset增加則歌詞提前,反之相反。

歌詞滾動定位,酷我在鼠標滾動時候會調節歌詞位置和歌曲播放位置。這個可以直接調用mciSendString函數來實現,函數具體用法可以網上查閱。

四、桌面歌詞加滾動顯示


桌面歌詞實現比較有意思點,網上通常的辦法是窗口用透明位圖,繪製文字上去來實現。但是這種辦法並不是酷我使用的辦法,酷我在桌面歌詞顯示的時候,窗口具有topmost屬性。


而且被歌詞覆蓋的矩形區域是不影響被覆蓋窗體的事件的。看到這裏我相信有一些朋友已經想到了他的實現原理,沒錯,就是異型窗體(不規則窗體),異形窗體的實現網上資料不少,利用GraphicsPath實現,同時可以製作出文字描邊效果,很像吧。。

整個程序用一個timer來定時更新歌詞顯示,鼠標滾動和拖動直接調節歌詞或者歌曲位置,異型窗體實現桌面歌詞。

好了,總結就寫到這裏!~~~~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章