C#版類似酷我音樂盒設計小總結
酷我音樂盒很酷吧,我們一個個寫程序的程序員(包括我這種業餘選手)總是手心癢癢,要不開始動手仿製一下唄,不過不包括網絡下載功能。
我主要是將設計重點放在了音樂播放,歌詞顯示,歌詞拖動定位,歌詞滾動定位,桌面歌詞加滾動的實現上。下面一一介紹這些實現過程。
一、歌曲播放
歌曲播放使用主要使用MCI API的mciSendString和mciSendCommand函數,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 time和string txt,time是該句歌詞的位置(毫秒),txt是該句歌詞的內容。
歌詞顯示有幾種方式,可以定時更新paint有效歌詞到一張bmp上面。或者一次性paint到bmp上面,定時移動bmp的location,然後用蒙版將當前歌詞高亮。
三、歌詞拖動定位和滾動定位
歌詞拖動定位,酷我在拖動歌詞時候,歌曲播放位置並沒有改變,而是改變了當前歌詞的位置。這個可以通過改變LRC類實例的offset屬性來實現,offset增加則歌詞提前,反之相反。
歌詞滾動定位,酷我在鼠標滾動時候會調節歌詞位置和歌曲播放位置。這個可以直接調用mciSendString函數來實現,函數具體用法可以網上查閱。
四、桌面歌詞加滾動顯示
桌面歌詞實現比較有意思點,網上通常的辦法是窗口用透明位圖,繪製文字上去來實現。但是這種辦法並不是酷我使用的辦法,酷我在桌面歌詞顯示的時候,窗口具有topmost屬性。
而且被歌詞覆蓋的矩形區域是不影響被覆蓋窗體的事件的。看到這裏我相信有一些朋友已經想到了他的實現原理,沒錯,就是異型窗體(不規則窗體),異形窗體的實現網上資料不少,利用GraphicsPath實現,同時可以製作出文字描邊效果,很像吧。。
整個程序用一個timer來定時更新歌詞顯示,鼠標滾動和拖動直接調節歌詞或者歌曲位置,異型窗體實現桌面歌詞。
好了,總結就寫到這裏!~~~~