Hướng dẫn dùng Windows Media Player / VB6

Các bài viết hướng dẫn, giúp các bạn hiểu và tiếp cận với Visual Basic nhanh hơn
Post Reply
User avatar
truongphu
VIP
VIP
Posts: 4779
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

Hướng dẫn dùng Windows Media Player / VB6

Post by truongphu »

Tên bài viết: Hướng dẫn dùng Windows Media Player / VB6
Tác giả: truongphu
Cấp độ bài viết: advance
Tóm tắt: Công cụ WMP rất hay, nhưng đa số chúng tachỉ mày mò. Bài viết này sẽ hướng dẫn cụ thể WMP trên VB6



Giao diện thử nghiệm:
giao diên.JPG


1- Vẽ lên Form WMP control, đặt tên là WMP cho khỏi rườm rà, (trên hình là góc trên trái). Bên dưới ta vẽ thêm 1 FileListbox, tên File1 để quản lý các file trong folder.

Lưu ý: các file và folder trên máy nên dùng tiếng Việt không dấu.

*** WMP sẽ hoạt động tốt với các file "playlist" với đuôi là wpl. Thư mục hay chứa file nầy (default trên XP) là My Documents\My Music.
Khai Path cho File1 đặt ở Form Load.

Code: Select all

    sMyMusic = CreateObject("Shell.Application").Namespace(13).Self.Path _
    & "\My Playlists"

sMyMusic được trả về đường dẫn tốt (trên XP, version cao hơn chưa test)

Code: Select all

    File1.Path = sMyMusic


nếu trong đó có các file wpl, danh sách playlist sẽ hiện lên...

2- Giả sử máy chưa có playlist nào, vậy sau form load, ta phải làm: dẫn đến folder chứa các file mp3 (hay mpeg...) để tạo playlist.
(Trên hình, góc dưới phải có nút Add Folder cho việc nầy)

Code: Select all

Public Function FindFolder$() ' Browser the folder
    Dim PathFolder As Object
    Set PathFolder = CreateObject("Shell.Application") _
    .BrowseForFolder(0, "Select a folder:", 0)
    If Not PathFolder Is Nothing Then FindFolder = PathFolder.Self.Path
    Set PathFolder = Nothing
End Function


dùng function ở nút Add Folder:

Code: Select all

 sPath = FindFolder ' Add Folder
        If sPath = "" Then Exit Sub
        Dim FSO As Object, FTmp As Object
        Set FSO = CreateObject("Scripting.FileSystemObject").GetFolder(sPath).Files
        For Each FTmp In FSO
            M = GetFileNameFromPath(FTmp.Path)
            M = Left(M, Len(M) - 4)
            List2.AddItem M
            dicLamPlaylist.Add CStr(Rnd * 1000), FTmp.Path
        Next
        La(7).Caption = List2.ListCount & " bài"
        Set MyFSO = Nothing: Set FTmp = Nothing


Còn tiếp... :D

(Bạn nào muốn xem và load project nhanh, ghé vào
https://plus.google.com/communities/100 ... 4243511758 )
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
User avatar
truongphu
VIP
VIP
Posts: 4779
Joined: Sun 04/11/2007 10:57 am
Location: Cam Đức, Khánh hòa
Has thanked: 14 times
Been thanked: 525 times

Re: Hướng dẫn dùng Windows Media Player / VB6

Post by truongphu »

Dùng thư viện của Windows Media Player:

I- Liên quan đến Playlist: (Danh sách bài nhạc)
Play một bản nhạc, tạo một danh sách... tất cả đều liên quan đến Playlist.
Kiến trúc (Class) cao nhất của lớp Playlist là IWMPPlaylistCollection, là tập hợp toàn bộ Playlist (Collection of Playlist).
[IWMP] là tiếp đầu ngữ của nhóm lớp (Class)

Ta có: WMP---> PlaylistCollection
Dưới PlaylistCollection, phân từng mảng Playlist: IWMPPlaylistArray
Ta có: WMP ---> PlaylistCollection ----> PlaylistArray
Cuối cùng là một Playlist cụ thể.
Ta có: WMP ---> PlaylistCollection ----> PlaylistArray ----> Playlist

Khi ta vẽ lên Form một WMP, vd WindowsMediaPlayer1, ta đã có công cụ thực hành (application) đứng lớp cao nhất.
Ta chỉ việc khai báo các biến Object theo thứ tự lớp ở trên, và gán cho WindowsMediaPlayer1 dùng:

I)- A- lớp PlaylistCollection: dùng tên biến tùy ý, để dễ phân biệt, tôi dùng tên CollecPlaylist, lần lượt là MangPlaylist và MyPlaylist.

Code: Select all

Dim CollecPlaylist As IWMPPlaylistCollection ''''' (General) '''''
Set CollecPlaylist = WindowsMediaPlayer1.PlayListCollection


Ghi chú: Các biến Object như CollecPlaylist, MangPlaylist, MyPlaylist phải khai báo toàn cục (General) vì được dùng trong nhiều Sub.

Ghi chú: Câu Set CollecPlaylist = WindowsMediaPlayer1.PlayListCollection nên đưa vào Form Load để tránh lập lại, chỉ cần khai báo 1 lần.

Ghi chú: vì ta có Set địa chỉ cụ thể, nên câu khai báo Dim, có thể gán là Object, vd:
Dim CollecPlaylist As Object
Set CollecPlaylist = WindowsMediaPlayer1.PlayListCollection


Nhưng kiểu khai báo nầy không được IDE hổ trợ cho việc viết code, vì chỉ khi runtime, CollecPlaylist mới biến thành WindowsMediaPlayer1.PlayListCollection, còn khi viết code thì chưa, do đó IDE chưa biết CollecPlaylist là cái gì!

I)- B- tiếp theo lớp PlaylistArray
Dim MangPlaylist As IWMPPlaylistArray ''''' (General) '''''
Set MangPlaylist = WindowsMediaPlayer1.PlayListCollection.(PlaylistArray)

CollecPlaylist = WindowsMediaPlayer1.PlayListCollection
nên ta viết gọn:
Set MangPlaylist = CollecPlaylist.(PlaylistArray)

Làm gì có code .(PlaylistArray) ? Tôi viết như thế để các bạn thấy chuỗi lớp từ "cha" đến "con".
Sau CollecPlaylist khi ta gõ dấu chấm . thì IDE đã xuất hiện các lớp con (tương đương PlaylistArray). Và tùy tình huống mà ta Set:
Hai tình huống hay gặp nhất là load Playlist và tạo mới Playlist và code hay dùng là:

Code: Select all

Set MangPlaylist = CollecPlaylist.getByName(Name)


mà đối số Name của hàm .getByName là tên của Playlist cần load hay tạo mới.

I)- C- tiếp theo lớp Playlist:

Code: Select all

Dim MyPlaylist As IWMPPlaylist ' (General)


Tùy tình huống mà Set MyPlaylist:
C1- tạo Playlist mới:

Code: Select all

Set MyPlaylist = CollecPlaylist.newPlaylist(Name)


C2- load Playlist

Code: Select all

Set MyPlaylist = MangPlaylist.Item(0)


trong 2 tình huống trên, C2 là cha đẻ con, mà C1 thì ông nội đẻ cháu!
Thực ra lớp PlaylistArray chỉ là trung gian giữa 2 lớp PlayListCollection và PlayList. (giữa tập hợp PL và PL).
Khi tạo mới Playlist, ta dùng trực tiếp từ PlaylistCollection ---> Playlist [CollecPlaylist.newPlaylist(Name)].

Còn khi load, PlaylistCollection phải lục lọi trong kho [CollecPlaylist.getByName(Name)], mà hàm .getByName(Name) trả về mảng!
Vì thế, cho dù Name của Playlist chỉ có 1, ta không thể viết tắt như Set MyPlaylist = CollecPlaylist.getByName(Name).
Cho nên ta phải viết Set MyPlaylist = MangPlaylist.Item(0) là vì vậy.

Túm lại, hai câu lệnh sau phải, hoặc hay đi kèm:

Code: Select all

Set MangPlaylist = CollecPlaylist.getByName(Name)
Set MyPlaylist = MangPlaylist.Item(0)


Từ đây, MyPlaylist được WindowsMediaPlayer1 quản lý như là 1 Playlist trong Collection của nó. Để WindowsMediaPlayer1 dùng MyPlaylist, ta viết:

Code: Select all

WindowsMediaPlayer1.currentPlaylist = MyPlaylist


II- Liên quan đến Media: (bài nhạc = file)
Các bài nhạc được WMP cho vào Collection riêng, (MediaCollection)
Ta có: WMP---> MediaCollection ----> Media
Phân lớp ở đây đơn giản hơn, nên code gọn hơn:

II)- A- MediaCollection

Code: Select all

Dim AllSong As IWMPMediaCollection ''''' (General) '''''

Chỉ khi dùng tạo mới Playlist, có liên quan đến các file, MediaCollection mới sử dụng đến, do đó câu trên thích khai báo trong Sub làm Playlist cũng được.

Code: Select all

Set AllSong = WindowsMediaPlayer1.MediaCollection

Và câu Set đương nhiên nên nằm trong Sub làm Playlist rồi!

II)- B- Media

Code: Select all

Dim MySong As IWMPMedia ''''' (General) '''''

Cũng như MediaCollection, đối tượng Media ít quan trọng, ưng khai báo trong Sub cũng được. (Tuy niên vì nhiều ứng dụng, nên viết ở General)

Đối tượng Media nầy nhiều ứng dụng, chuẩn nhất là khi dùng tạo mới Playlist, Set như sau

Code: Select all

Set MySong = AllSong.Add(Path_File_as_String)


Ngoài ra, Media nầy được dùng để lấy bài nhạc cụ thể (thông tin file nhạc) từ Playlist, vd:

Code: Select all

Set MySong = MyPlaylist.Item(i_As_Long)


Vì thế, chuẩn thì gọi MySong (IWMPMedia), viết nhanh thì gán bất cứ Object nào:

Code: Select all

Set zzzObject = AllSong.Add(Path_File_as_String)
Set oooObject = MyPlaylist.Item(i_As_Long)


Kết: Bạn đã quen các đối tượng WMP: PlaylistCollection, PlaylistArray, Playlist, MediaCollection, Media.
Với các khái niệm làm quen trên, tôi đảm bảo bạn sẽ viết code dùng WMP dễ dàng với IDE trợ giúp; hoặc đọc code dễ hiểu trong Project mà bạn nếu đã load.

Các bài sau sẽ có code từng button...
B-)
o0o--truongphu--o0o

.........
Ghé thăm:
Chuyện Linh Tinh
dongdo1234
Thành viên chính thức
Thành viên chính thức
Posts: 19
Joined: Fri 18/01/2013 8:56 am
Location: Giao Thủy - Nam Định
Has thanked: 9 times
Been thanked: 1 time
Contact:

Re: Hướng dẫn dùng Windows Media Player / VB6

Post by dongdo1234 »

Bài viết rất chi tiết
Thank bác
BUIKHAI2129
Posts: 2
Joined: Sun 01/11/2015 1:52 pm

Re: Hướng dẫn dùng Windows Media Player / VB6

Post by BUIKHAI2129 »

muốn nó phát tất cả các bài (hát xong bài này tự chuyển sang bài khác) thì làm sao ạ ??? help cháu với (nói trong nước mắt )
User avatar
NoBi
Quản trị
Quản trị
Posts: 970
Joined: Tue 18/03/2008 1:22 pm
Location: Sài Gòn
Has thanked: 58 times
Been thanked: 68 times
Contact:

Re: Hướng dẫn dùng Windows Media Player / VB6

Post by NoBi »

Nó có sự kiện khi kết thúc 1 bài hát. Bạn bắt sự kiện đó rồi cho nó phát bài tiếp theo trong list.
:>
BUIKHAI2129
Posts: 2
Joined: Sun 01/11/2015 1:52 pm

Re: Hướng dẫn dùng Windows Media Player / VB6

Post by BUIKHAI2129 »

??????? , anh NoBi nói như không, em không thấy cái vụ đấy
MinhAnVanMan
Posts: 9
Joined: Fri 28/08/2020 1:29 pm
Been thanked: 1 time

Re: Hướng dẫn dùng Windows Media Player / VB6

Post by MinhAnVanMan »

muốn nó phát tất cả các bài (hát xong bài này tự chuyển sang bài khác) thì làm sao ạ ??? help cháu với (nói trong nước mắt )

Để giải quyết vấn đề này thì có hướng suy nghĩ đơn giản như vậy
1. WMP có thuộc tính lấy giá trị thời lượng của bài hát đang phát (wmp.currentMedia.duration)
2. WMP có thuộc tính lấy thời gian hiện hành của bài hát (wmp.Controls.currentPosition)
Chúng ta sẽ lấy các giá trị này in ra trên hai nhãn label, thời lượng bài hát thì nhập trong biến cố double click lên bài hát khi mở nó lên
còn thời gian hiện hành bài hát đang chạy thì để trong Timer.
Dùng một hàm so sánh hai số đó, nếu b=a (với a là thời lượng bài hát,b thời gian hiện hành bài hát) hai cái đó bằng nhau nghĩa là hết bài hát thì sẽ chuyển sang bài hát tiếp theo.
Đó là suy nghĩ lý thuyết vì thực tế có một delay nhất định mà giá trị b chưa kịp bằng a thì đã nhảy về 0 rồi và như vậy xảy ra lỗi vừa mở bài hát lên đã chuyển bài và nhảy sang bài tiếp theo rồi.
Vậy nên tôi có cách giải quyết nó như sau.
1. Tạo hai PictuoreBox lồng vào nhau với thuộc tính Height và Width như nhau
2. Gán thuộc tính Width của Picture2 = 0 trong sự kiện Form Load
3. Tạo đối tượng Timer2 và bắt đầu cho Width của Picture2 nó chạy theo thời gian hiện hành của bài hát đang phát
4. Đến khi nào Picture2.Width = Picture1.Width thì cho chuyển bài
5. Với cách làm này thì chỉnh thuộc tính Custom>Select mode>None cho WMP để ẩn đi bảng control của WMP

Vậy đến khi phát hết bài cuối danh sách thì muốn phát lại bài đầu danh sách thì sao?
Hướng giải quyết đơn giản là làm cái hàm If : nếu như cái list1.index = list1.listcount thì
List1.Selected(List1.Columns) = True
List2.Selected(List2.Columns) = True
là nó sẽ tự chọn bài hát đầu tiên trong danh sách
Nghe bai nay qua bai khac.rar
(3.39 KiB) Downloaded 15 times
Post Reply

Return to “[VB] Bài viết hướng dẫn”