by ゲスト » 2005年8月23日(火) 23:55
ウィンドウメッセージを送ることにより、ウィンドウ処理スレッド側に
MCIを操作させるサンプルです。
マルチメディアAPIを使用可能にしたノーマルEXEプロジェクトで
MainWnd.sbpを編集します。
コード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Const MM_MCICONTROL = (WM_APP+1)
Type MCICONTROL
dwMciID As DWord
uMsg As DWord
fdwCommand As DWord
lpParam As VoidPtr
End Type
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As DWord, dwMsg As DWord, wParam As DWord, lParam As DWord) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
Dim pmc As *MCICONTROL
Dim tid As DWord
Select Case dwMsg
Case WM_CREATE
CreateThread(ByVal NULL, 0, AddressOf(SubThread), NULL, 0, VarPtr(tid))
Case MM_MCICONTROL
pmc = lParam
mciSendCommand(pmc->dwMciID, pmc->uMsg, pmc->fdwCommand, ByVal pmc->lpParam)
Case MM_MCINOTIFY
' MM_MCINOTIFYの処理
End Select
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
Dim mcic As MCICONTROL
Sub mciSendCommand2(dwMciID As DWord, uMsg As DWord, fdwCommand As DWord, lpParam As VoidPtr)
mcic.dwMciID = dwMciID
mcic.uMsg = uMsg
mcic.fdwCommand = fdwCommand
mcic.lpParam = lpParam
SendMessage(hMainWnd, MM_MCICONTROL, 0, VarPtr(mcic))
End Sub
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
Music_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub SubThread()
Dim mop As MCI_OPEN_PARMS
Dim mpp As MCI_PLAY_PARMS
Sleep(5000)
mop.lpstrDeviceType = MCI_DEVTYPE_SEQUENCER
mop.lpstrElementName = "battle.mid"
mciSendCommand2(NULL, MCI_OPEN, MCI_WAIT or MCI_OPEN_TYPE or MCI_OPEN_TYPE_ID or MCI_OPEN_ELEMENT, VarPtr(mop))
mpp.dwCallback = hMainWnd
mciSendCommand2(mop.wDeviceID, MCI_PLAY, MCI_NOTIFY, VarPtr(mpp))
Sleep(10000)
mciSendCommand2(mop.wDeviceID, MCI_STOP, MCI_WAIT, NULL)
mciSendCommand2(mop.wDeviceID, MCI_CLOSE, MCI_WAIT, NULL)
SendMessage(hMainWnd, WM_CLOSE, 0, 0)
End Sub
このサンプルでは起動して5秒後にbattle.midを演奏し、10秒後終了します。
MIDIファイルは適当なものをリネームするなどしてご用意ください。
ウィンドウメッセージを介すため、MIDIのBGMくらいは平気ですが
アクションゲームの効果音の再生では反応に遅れが出るかもしれません。
(そこまでするならDirectXの出番と思われますが。)
ウィンドウメッセージを送ることにより、ウィンドウ処理スレッド側に
MCIを操作させるサンプルです。
マルチメディアAPIを使用可能にしたノーマルEXEプロジェクトで
MainWnd.sbpを編集します。
[code]
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Const MM_MCICONTROL = (WM_APP+1)
Type MCICONTROL
dwMciID As DWord
uMsg As DWord
fdwCommand As DWord
lpParam As VoidPtr
End Type
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As DWord, dwMsg As DWord, wParam As DWord, lParam As DWord) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
Dim pmc As *MCICONTROL
Dim tid As DWord
Select Case dwMsg
Case WM_CREATE
CreateThread(ByVal NULL, 0, AddressOf(SubThread), NULL, 0, VarPtr(tid))
Case MM_MCICONTROL
pmc = lParam
mciSendCommand(pmc->dwMciID, pmc->uMsg, pmc->fdwCommand, ByVal pmc->lpParam)
Case MM_MCINOTIFY
' MM_MCINOTIFYの処理
End Select
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
Dim mcic As MCICONTROL
Sub mciSendCommand2(dwMciID As DWord, uMsg As DWord, fdwCommand As DWord, lpParam As VoidPtr)
mcic.dwMciID = dwMciID
mcic.uMsg = uMsg
mcic.fdwCommand = fdwCommand
mcic.lpParam = lpParam
SendMessage(hMainWnd, MM_MCICONTROL, 0, VarPtr(mcic))
End Sub
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
Music_DestroyObjects()
PostQuitMessage(0)
End Sub
Sub SubThread()
Dim mop As MCI_OPEN_PARMS
Dim mpp As MCI_PLAY_PARMS
Sleep(5000)
mop.lpstrDeviceType = MCI_DEVTYPE_SEQUENCER
mop.lpstrElementName = "battle.mid"
mciSendCommand2(NULL, MCI_OPEN, MCI_WAIT or MCI_OPEN_TYPE or MCI_OPEN_TYPE_ID or MCI_OPEN_ELEMENT, VarPtr(mop))
mpp.dwCallback = hMainWnd
mciSendCommand2(mop.wDeviceID, MCI_PLAY, MCI_NOTIFY, VarPtr(mpp))
Sleep(10000)
mciSendCommand2(mop.wDeviceID, MCI_STOP, MCI_WAIT, NULL)
mciSendCommand2(mop.wDeviceID, MCI_CLOSE, MCI_WAIT, NULL)
SendMessage(hMainWnd, WM_CLOSE, 0, 0)
End Sub
[/code]
このサンプルでは起動して5秒後にbattle.midを演奏し、10秒後終了します。
MIDIファイルは適当なものをリネームするなどしてご用意ください。
ウィンドウメッセージを介すため、MIDIのBGMくらいは平気ですが
アクションゲームの効果音の再生では反応に遅れが出るかもしれません。
(そこまでするならDirectXの出番と思われますが。)