用Visual Basic 6.0寫KTV點歌系統

[程式完成圖]

歌手列表

    

筆劃列表

注音列表

程式說明

[動機]

只是單純想利用VB寫看看這種軟體,因為去KTV唱歌唱了幾次一直覺得好像不是很難寫,就來寫看看了,在這裡介紹實作時讓我卡關的一些程式碼,希望讓有興趣的人能夠加速的學習,我個人覺得明明已經是會的知識,但為什麼每個人都要重頭學,而浪費在不必要的地方卡關,也許有的人想實做出功能很炫的點播器,但是為了一些不必要的語法卡關而放棄不是就太可惜了嗎....

[說明]

Q1:和現在市面上要錢的KTV播放系統有什麼不同?

A: 目前市面上看到的都是需要用到所謂的電視卡、電視等等,讓電腦變成真的點歌機,本程式只是單純仿功能,若你是想學習如何製作成真實的點歌機...因為我也沒有那些設備,沒辦法實作...我所做的東西就是只要有電腦就可以玩了!而分享的程式碼是為了讓有興趣的朋友可以參考,因為我當初在做時真的也研究很久,翻遍了個大網站以及自己的腦袋才做出來,而且也沒有找到專門在討論做KTV程式的地方,所以如果你有興趣或有問題歡迎一起來交流,另外有些基本的方法我沒辦法很仔細的介紹,所以希望有心但是是vb的初學者請先練好基本功再來問問題喔!!

Q2:在架構上又和市面上的KTV播放系統有什麼不同?

A:就我知道目前大家在設計時都會利用資料庫來做資料的存取,我同意這樣是很有效的管理方式,不過我只是想實現仿KTV播放系統基本的實現方式,所以並不想去研究這一塊,關於我的資料都是利用很簡單的筆記本,辛苦的打一點資料來建立的,關係大大們如果想自行修改成讀取資料庫的方式就必須要自行再去研究了。

[系統要求]

Windows XP sp2

Media Player 11.0 (必要軟體)

Visual Basic 6.0 專業版

[實作]

一、讀取歌手名稱,並顯示該歌手有那些歌曲?

(1) 首先必須知道mv存放的位置,在此我利用了一個文字檔.txt讓使用者可以任意的修改,再去讀這個文字檔內設的路徑即可。

dir.txt

I:\KTV\data\

 

讀取檔案路徑VB程式

'===========讀取檔案路徑==========
Dim StrTmp As String
F = FreeFile
Text1.Text = ""
Open App.Path + "\dir.txt" For Input As #F
Do
Line Input #F, StrTmp
Text1.SelText = StrTmp & vbCrLf
Loop Until EOF(F)
Close #F

在這裡我用了一個Text1.Text 的元件,將dir.txt的內容讀進來,程式中app.path是指執行主程式的路徑,所以data.txt是放在跟主程式同一個路徑下,如果要更改請自行更改語法。

 

(2)取得檔案路徑,接下來就要讀取所有歌手的名字。在我的設計中,所有歌手分類的方式為:

[歌手1]-歌曲1、歌曲2...

[歌手2]-歌曲1、歌曲2...

[歌手3]-歌曲1、歌曲2...

.....

所以只要利用DirlistBox就可以讀取歌手的資料夾名稱了,並利用ListBox存歌手的名字。

讀取歌手的資料夾名稱VB程式

'===========讀取目錄===========
Dir1.Path = Text1.Text
Dir1.ListIndex = 0
For I = 0 To Dir1.ListCount - 1
Text2.Text = Dir1.List(I) + "\\endfiles"
'findstr(原始字串,開頭字串,結束字串,第幾次出現)
List1.AddItem findstr(Text2.Text, Dir1.Path + "\", "\\endfiles", 1)
Next I

在這裡將Dir1的路徑設成剛剛data.txt中的路徑,之後利用一個For迴圈,將讀到的資料夾名稱一個一個存到List1中,在這裡用了一個別人寫的語法 indstr(原始字串,開頭字串,結束字串,第幾次出現) ,是一個很實用的語法,VB內建的語句只有從左或從右找起,而我是利用刪除前後段的資料留下我要的文字,在此感謝寫這段語法的大大,只要將下面的function放到程式中的任一個地方,就可以用call funtion的方式來使用這個語法。

indstr的Function

Function findstr(cSOU, cBGN, cEND, nBGN)

Dim nOPT, nSTART, nEND

nOPT = 0

nSTART = 1

nEND = 0

Do While nOPT < nBGN

nSTART = InStr(nSTART, cSOU, cBGN)

If Not nSTART = 0 Then

nOPT = nOPT + 1

Else

Exit Do

End If

If nOPT = nBGN Then

nEND = InStr(nSTART, cSOU, cEND)

findstr = Mid(cSOU, nSTART + Len(cBGN), nEND - (nSTART + Len(cBGN)))

End If

nSTART = nSTART + 1

Loop

End Function
 

現在List1顯示就如歌手列表的List上一樣,顯示了歌手的名字。接下來要點選每個歌手,在List2顯示該歌手資料夾內的歌曲名稱,如圖中歌曲列表的地方。

 

(3)在List1_Click()的事件中,寫下顯示在List2上的程式碼:

List1_Click()的事件VB程式

Private Sub List1_Click()
Text3.Text = List1.ListIndex
File1.Path = Dir1.List(Val(Text3.Text)) + "\"
File1.Refresh
List2.Clear
For I = 0 To File1.ListCount - 1
List2.AddItem Left(File1.List(I), InStrRev(File1.List(I), ".") - 1)
Next I
End Sub

在這裡利用了FileListBox元件,將檔案的名稱列出來,該元件讀取的路徑就是剛剛data.txt設定的路徑+歌手的名稱(存在Dir1.List),只要利用剛點選的歌手List1中存在的編號去抓取Dir1.List中的路徑即可,之後再將這個路徑給File1元件,讓List將檔案一個一個讀出顯示在List(在此我限定File1的Pattern為*.mpg,如此就可以只顯示副檔名為mpg的檔案,當然你也可以不用設,他就會將該資料夾所有的檔案列在List2上)。

二、如何做到注音點歌或筆劃點歌?

(1) 要做到這種功能,一定要讓程式有可以判斷刪選的功能,用筆劃來說明,比如要知道那些歌手名稱為一劃,就要有一個可以查表的地方,有點類似字典,在這裡我們可以自定義一個簡單的字典檔格式,並將他建立起來。在我的程式中,只有分類一劃~十六劃,所以只要將常見的歌手姓氏建表即可,為了以後修改方便,所以我利用了16個TXT檔讓使用者輸入修改,內容如下:

name_1.txt

n=:一;n=:0;

name_2.txt

n=:丁;n=:七;n=:刀;n=:卜;n=:0;

name_3.txt

n=:小;n=:大;n=:于;n=:0;

(中間省略)

name_14.txt

n=:劉;n=:廖;n=:熊;n=:萬;n=:詹;n=:趙;n=:黎;n=:齊;n=:蜜;n=:0;

name_15.txt

n=:歐;n=:潘;n=:澎;n=:甄;n=:盧;n=:蔡;n=:蕭;n=:鄭;n=:霍;n=:0;

name_16.txt

n=:戴;n=:簡;n=:羅;n=:薛;n=:藍;n=:蘇;n=:鍾;n=:謝;n=:關;n=:龍;n=:辦;n=:竇;n=:櫻;n=:寶;n=:歐;n=:錦;n=:翼;n=:0;

(2) 在Visual Basic 6.0專業版中,讀取TXT檔案其實有更快的方法,就是利用RichTextBox元件,而且這個元件也沒有像TextBox那樣有文字上的限制,語法上也較方便使用。

用RichTextBox讀取檔案路徑VB程式

RichTextBox1.LoadFile (App.Path + "\name\name_1.txt")
RichTextBox2.LoadFile (App.Path + "\name\name_2.txt")
RichTextBox3.LoadFile (App.Path + "\name\name_3.txt")
RichTextBox4.LoadFile (App.Path + "\name\name_4.txt")
RichTextBox5.LoadFile (App.Path + "\name\name_5.txt")
RichTextBox6.LoadFile (App.Path + "\name\name_6.txt")
RichTextBox7.LoadFile (App.Path + "\name\name_7.txt")
RichTextBox8.LoadFile (App.Path + "\name\name_8.txt")
RichTextBox9.LoadFile (App.Path + "\name\name_9.txt")
RichTextBox10.LoadFile (App.Path + "\name\name_10.txt")
RichTextBox11.LoadFile (App.Path + "\name\name_11.txt")
RichTextBox12.LoadFile (App.Path + "\name\name_12.txt")
RichTextBox13.LoadFile (App.Path + "\name\name_13.txt")
RichTextBox14.LoadFile (App.Path + "\name\name_14.txt")
RichTextBox15.LoadFile (App.Path + "\name\name_15.txt")
RichTextBox16.LoadFile (App.Path + "\name\name_16.txt")

利用 RichTextBox1.LoadFile ("路徑/*.txt") 就可以讀取txt文字檔的內容了,很好用。

(3) 之後可利用之前介紹過的 findstr 或VB內建的語法來寫IF THEN,刪去不必要的歌手留下要顯示的歌手,並顯示在List上即可,如同下圖筆劃列表的List,旁邊的歌手列表做法同上方歌手列表介紹方法。

注音也可以利用相同的方法做到刪除,最後再加上自己喜歡的功能,如新歌列表、說明等等就完成了初步的架構。

三、如何播放歌曲?

(1) 因為Windows的作業系統都有Media Player的程式,所以利用VB來控制這個元件,請加入這個元件名為Windows Media Player,在此因為我是用Windows Media Player11來測試,所以相關的語法都是控制Windows Media Player11,再之前的舊版本語法不一樣,若要控制別的播放器或舊版需自己找語法喔。因為我是在點選List2之後播放相關的歌,所以我將下列語法寫在List2中:

控制Windows Media Player11播放

WindowsMediaPlayer1.Settings.volume = 100
WindowsMediaPlayer1.Controls.Play
WindowsMediaPlayer1.URL = File1.Path + "\" + File1.List(List2.ListIndex)

其中WindowsMediaPlayer1.Settings.volume是播放控制聲音大小,WindowsMediaPlayer1.Controls.Play是設為播放,WindowsMediaPlayer1.URL則是設定要播放檔案的路徑。另外我希望在播放時要是全螢幕播放,這樣才像是KTV,所以你可以在WindowsMediaPlayer1_StatusChange()時設定以下的語法:

控制Windows Media Player11播放大小

Private Sub WindowsMediaPlayer1_StatusChange()
If WindowsMediaPlayer1.playState = wmppsPlaying Then
WindowsMediaPlayer1.fullScreen = True
End If
End Sub

WindowsMediaPlayer1.fullScreen = True就是設定播放時為全螢幕。

四、要怎麼做到切換左聲道、右聲道或立體聲的效果?

(1) 用WindowsMediaPlayer元件的好處就是,他有很多的語法可以用,如果今天你是要控制硬體的左聲道右聲道、甚至於是聲音忽遠忽近等等很炫的功能就必須去學DirectX來控制,這是當你想真的實現成KTV點播系統時必須要會的,但我們只是單純要在電腦上播放影片,所以只要直接控制WindowsMediaPlayer元件就好。

控制Windows Media Player11播放大小

Private Sub WindowsMediaPlayer1_StatusChange()

'1=立體聲道 2=左聲道 3=右聲道
Text4.Text = 3 WindowsMediaPlayer1.Controls.currentAudioLanguageIndex = Val(Text4.Text)
End Sub

在此我有說明,當WindowsMediaPlayer1.Controls.currentAudioLanguageIndex為1時就是播放立體聲道,2為左聲道,3則為右聲道,前提是你的影音檔必須要有左右聲道的區別,一般的KTV左聲道為單純歌曲,右聲道為歌曲加人聲,少數是相反,因 此可利用簡單的控制,讓使用者在程式中可以隨意的切換聲道。

(2) 因此你可以將Text4.Text =*的部份寫在程式其他地方,並利用元件來改變他,這樣就可以在播放時更改所需要的聲道了,則綜合這個功能可將WindowsMediaPlayer1_StatusChange()的程式改成下面的樣子:

WindowsMediaPlayer1_StatusChange()

Private Sub WindowsMediaPlayer1_StatusChange()
If WindowsMediaPlayer1.playState = wmppsPlaying Then
WindowsMediaPlayer1.Controls.currentAudioLanguageIndex = Val(Text4.Text)
WindowsMediaPlayer1.fullScreen = True
End If
End Sub

五、完成作品

(1) 最後再加點美工,在此我是用PhotoImpact 12來製作圖示背景等等,即可完成KTV播放程式。

六、補充

Q:要怎麼讓程式的圖示變成自訂的圖示?

A:一般VB編譯成EXE檔時,圖示都是內定的圖,不過可以更改成你要的圖示喔。首先要製作一個圖示,製作完後,在執行主程式的Form的屬性欄中的icon載入這個圖示,在你要編輯成exe檔時,選擇[選項],然後更改圖示為Form的名稱即可變成該圖示。

 

  

經過以上的設計就可以完成KTV點歌系統了

後記:當初只有歌手列表的功能時,做出來的主程式大小不到500K,現在加上其他的圖示功能動畫之後(我的圖片全部都是直接戴入到VB中了,唯一從外部讀取的只有那些TXT的文字檔),主程式大小也只有1.38MB,讓我覺得VB在實現這個程式的效果還不錯。

主程式及測試檔無私下載點:連結已失效

(注意!如要轉戴請註明出處 ,建議使用1024x768大小執行本程式。)

其它安裝:

若您無安裝專業版VB6.0,有可能在執行程式時缺少RICHTX32元件而無法執行,請下載RICHTX32.OCX,並註冊元件。(只要執行壓縮檔內的"註冊元件.BAT"即可,本壓縮檔在xp2下能正常執行)

下載點:下載RICHTX32.OCX(連結已失效)

若您缺少其它VB執行元件可以試著安裝官方提供的VBRun60sp5.exe。

下載點:下載VBRun60sp5.exe(連結已失效)

arrow
arrow
    全站熱搜

    Leo 發表在 痞客邦 留言(15) 人氣()