by yu0627 » 2006年1月16日(月) 19:35
コード: 全て選択
別のものとはどのようになるのでしょうか?
もっと具体的に教えてください。
えぇと、例えば、僕のPCの場合、mp3ファイルをRealPlayerに関連付けていて、エクスプローラでのアイコンの表示はRealPlayerのアイコンなんですが、WMPのアイコンになってしまいます。また、wmaファイルの関連付けはWMPで、エクスプローラーのアイコンもWMPなのですが、RealPlayerのアイコンになってしまいます。
コード: 全て選択
できればMainWnd.sbpの全ソースか、せめてリストビューとイメージリスト関連の処理部分だけでも載せられませんか?
そうでないと比較・実験できませんので。
すみません。以下に、MainWnd.sbpの全内容を載せます。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Declare Function SHGetFileInfo Lib "shell32" Alias "SHGetFileInfoA" (pszPath As BytePtr, dwFileAttributes As DWord, ByRef psfi As SHFILEINFO, cbFileInfo As DWord, uFlags As DWord) As DWord
'タイマーのID。
Const ID_TIMER = 100
'MCI_OPEN_PARMS構造体。MCIデバイスのオープンに関する情報が格納される。
Dim mop As MCI_OPEN_PARMS
'現在選択されているフォルダのパスが格納される。
Dim ChosenFolderPath[MAX_PATH] As Byte
Dim IsGetMusicLong As Long
Dim MusicLong As Long
'アイコンのハンドル
Dim hIcon As DWord
'リストビューアイコンのハンドル
Dim liHandle As DWord
MusicLong=0
'現在再生されている音楽の分を格納する
Dim nNowMusicMinute As Long
'現在再生されている音楽の秒を格納する
Dim nNowMusicSecond As Long
'ソフト名とバージョンを格納する
Dim lpstrSoftNameVer[255] As Byte
lstrcpy(lpstrSoftNameVer, "SameFolder MusicPlayer v1.3.4.0")
'定数宣言
Const SHGFI_ICON = &H000000100 ' get icon
Const SHGFI_DISPLAYNAME = &H000000200 ' get display name
Const SHGFI_TYPENAME = &H000000400 ' get type name
Const SHGFI_ATTRIBUTES = &H000000800 ' get attributes
Const SHGFI_ICONLOCATION = &H000001000 ' get icon location
Const SHGFI_EXETYPE = &H000002000 ' return exe type
Const SHGFI_SYSICONINDEX = &H000004000 ' get system icon index
Const SHGFI_LINKOVERLAY = &H000008000 ' put a link overlay on icon
Const SHGFI_SELECTED = &H000010000 ' show icon in selected state
Const SHGFI_ATTR_SPECIFIED = &H000020000 ' get only specified attributes
Const SHGFI_LARGEICON = &H000000000 ' get large icon
Const SHGFI_SMALLICON = &H000000001 ' get small icon
Const SHGFI_OPENICON = &H000000002 ' get open icon
Const SHGFI_SHELLICONSIZE = &H000000004 ' get shell size icon
Const SHGFI_PIDL = &H000000008 ' pszPath is a pidl
Const SHGFI_USEFILEATTRIBUTES = &H000000010 ' use passed dwFileAttribute
Const SHGFI_ADDOVERLAYS = &H000000020 ' apply the appropriate overlays
Const SHGFI_OVERLAYINDEX = &H000000040 ' Get the index of the overlay
'構造体宣言
Type SHFILEINFO
hIcon As DWord ' out: icon
iIcon As Long ' out: icon index
dwAttributes As Dword ' out: SFGAO_ flags
szDisplayName[MAX_PATH] As Byte ' out: display name (or path)
szTypeName[80-1] As Byte ' out: type name
End Type
'MCIデバイスをオープンする為の自作関数。
Function OpenMciDevice(FileName As BytePtr) As Long
Dim bErr As DWord
Dim dwError As DWord
Dim buffer[255] As Byte 'MCIエラーを格納する変数
Dim OsVerInfo As OSVERSIONINFO 'OSのバージョンを格納する構造体
'メッセージ通知のためのウィンドウを指定
mop.dwCallback=hMainWnd
'OsVerInfo.dwOSVersionInfoSizeのサイズを指定
OsVerInfo.dwOSVersionInfoSize=Len(OsVerInfo)
'OSのバージョンを取得
GetVersionEx(OsVerInfo)
'もしOSがWin2KかWinXPでファイルがMIDIならMPEGVideoデバイスを指定
If OsVerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT and Right$(FileName, 3)="mid" or _
OsVerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT and Right$(FileName, 4)="midi" Then
If OsVerInfo.dwMinorVersion=0 or OsVerInfo.dwMinorVersion=1 Then
mop.lpstrDeviceType="MPEGVideo"
mop.lpstrElementName=FileName
bErr=mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT or MCI_OPEN_TYPE, mop)
If bErr Then
mciGetErrorString(dwError, buffer, 255)
MessageBox(hMainWnd, buffer, "SameFolder MusicPlayer Error", MB_OK or MB_ICONERROR)
OpenMciDevice=0
CloseMciDevice()
Exit Sub
End If
End If
Else
mop.lpstrElementName=FileName
bErr=mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, mop)
If bErr Then
mciGetErrorString(dwError, buffer, 255)
MessageBox(hMainWnd, buffer, "SameFolder MusicPlayer Error", MB_OK or MB_ICONERROR)
OpenMciDevice=0
CloseMciDevice()
Exit Sub
End If
End If
OpenMciDevice=1
End Function
'MCIデバイスをクローズするための関数
Sub CloseMciDevice()
Dim dwDummy As DWord
mciSendCommand(mop.wDeviceID, MCI_CLOSE, MCI_WAIT, dwDummy)
mop.wDeviceID=0
End Sub
'フォルダの選択ダイアログを出し、それをChosenFolderPath変数にコピーしスタティックに表示する関数
Function GetFolderPath() As Long
Dim bi As BROWSEINFO
Dim pidl As Long
'BROWSEINFO構造体の初期化
FillMemory(VarPtr(bi),Len(bi),0)
bi.hwndOwner=hMainWnd
bi.lpszTitle="フォルダを選択してください"
bi.ulFlags=BIF_RETURNONLYFSDIRS
'「フォルダの参照」ダイアログボックスを表示
pidl=SHBrowseForFolder(bi)
If pidl Then
'フォルダへのパスを取得(lpFolderポインタが示すバッファにコピー)
SHGetPathFromIDList(pidl, ChosenFolderPath)
CoTaskMemFree(pidl)
GetFolderPath=1
SetDlgItemText(hMainWnd, Static_NowFolderPath, ChosenFolderPath)
SetDlgItemText(hChooseDirDlg, Static_ChooseFolder, ChosenFolderPath)
Else
GetFolderPath=0
End If
SetFocus(hChooseDirDlg)
End Function
'ChosenFolderPathに格納されたパスの中の音楽ファイルを検索しMusicFileListViewにセットする為の関数
Function SetMusicFileListView(pExt As BytePtr) As Long
'検索に関する情報が格納される構造体
Dim FindData As WIN32_FIND_DATA
'検索のハンドル
Dim hFind As DWord
'音楽ファイルのパスを格納する変数
Dim PathBuffer[MAX_PATH]
'リストビューのアイテム設定時に使用する構造体
Dim lvItem As LVITEM
'音楽ファイルの長さを格納する変数
Dim MFileLong As String
'リストビューの番号を格納する変数
Dim ListViewNum As Long
Dim temp As DWord
Dim cnt As Long
'SHFILEINFO構造体
Dim shfi As SHFILEINFO
'ListViewNumの初期化
ListViewNum=0
Dim ExitCode As DWord
If mop.wDeviceID Then
'もし再生中なら停止する
SendMessage(hMainWnd, WM_COMMAND, StopButton, 0)
End If
hFind=FindFirstFile(ChosenFolderPath & "\*." & pExt, FindData)
If hFind = INVALID_HANDLE_VALUE Then
'戻り値を設定する
SetMusicFileListView = FALSE
Exit Function
End If
Do
'ファイルパスをセット
wsprintf(PathBuffer, "%s\%s", ChosenFolderPath, FindData.cFileName)
'アイコンハンドル取得
FillMemory(VarPtr(shfi), Len(shfi), 0)
SHGetFileInfo(PathBuffer, 0, shfi, Len(shfi), SHGFI_ICON or SHGFI_SMALLICON)
'アイコンハンドルをイメージリストに追加
ImageList_AddIcon(liHandle, shfi.hIcon)
'リストビューにファイルを追加
With lvItem
.mask=LVIF_TEXT or LVIF_PARAM or LVIF_IMAGE
.pszText=FindData.cFileName
.iImage=cnt
.iItem=0
.iSubItem=0
.lParam=ListViewNum
End With
SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_INSERTITEM, 0, VarPtr(lvItem))
cnt=cnt+1
Loop While FindNextFile(hFind, FindData)
FindClose(hFind)
'戻り値を設定する
SetMusicFileListView = TRUE
End Function
'ボタンを有効・無効する関数
Sub EnaDisaButton(Play As Long, Pause As Long, Stop As Long, Reload As Long)
EnableWindow(GetDlgItem(hMainWnd, PlayButton), Play)
EnableWindow(GetDlgItem(hMainWnd, PauseButton), Pause)
EnableWindow(GetDlgItem(hMainWnd, StopButton), Stop)
EnableWindow(GetDlgItem(hMainWnd, ReLoadButton), Reload)
End Sub
Sub SetMusicLong()
'変数宣言
Dim lvItem As LVITEM
Dim lpstrMusicPath[MAX_PATH] As Byte
Dim lpstrMusicName[MAX_PATH] As Byte
Dim lpstrBeforeMusicName[MAX_PATH] As Byte
Dim msp As MCI_STATUS_PARMS
Dim i As Long, i2 As Long
Dim lpstrbuffer[255] As Byte
Dim dw As DWord
Dim lvitem(6)As Long
'リストビューの項目数を取得
i2=SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_GETITEMCOUNT, 0, 0)
FillMemory(VarPtr(lvItem), Len(lvItem), 0)
For i=0 To i2
'上から順に内容を取得
lvitem(0)=LVIF_TEXT
lvitem(1)=i
lvitem(2)=0
lvitem(3)=0
lvitem(4)=0
lvitem(5)=lpstrMusicName
lvitem(6)=MAX_PATH
SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_GETITEM, 0, VarPtr(lvitem(0)))
'パスを設定する
lstrcpy(lpstrMusicPath, ChosenFolderPath & "\" & lpstrMusicName)
'MCIデバイスをオープン
If OpenMciDevice(lpstrMusicPath)=0 Then Exit Sub
'時間を取得する
msp.dwItem = MCI_STATUS_LENGTH
mciSendCommand(mop.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, msp)
'MCIデバイスをクローズ
CloseMciDevice()
wsprintf(lpstrbuffer, "%02d:%02d", msp.dwReturn/1000\60, msp.dwReturn/1000 mod 60)
'リストビューに時間を追加する
lvItem.mask=LVIF_TEXT
lvItem.pszText=lpstrbuffer
lvItem.iItem=i
lvItem.iSubItem=1
SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_SETITEM, 0, VarPtr(lvItem))
lstrcpy(lpstrBeforeMusicName, lpstrMusicName)
Next
EnableWindow(GetDlgItem(hMainWnd, MusicFileListView), 1)
EnaDisaButton(1, 0, 0, 1)
End Sub
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As DWord, dwMsg As DWord, wParam As DWord, lParam As DWord) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
sfmp_DestroyObjects()
PostQuitMessage(0)
ImageList_Destroy(liHandle)
End Sub
Sub MainWnd_IDM_VERSION_MenuClick()
'VerDlgダイアログボックスを出す
DialogBox(hMainWnd, "VerDlg")
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
'行全体を選択するように設定
SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT)
'----------------------------------
' リストビューのカラムを設定
'----------------------------------
'リストビューの追加に関する情報が格納される構造体
Dim lc As LVCOLUMN
lc.mask=LVCF_FMT or LVCF_WIDTH or LVCF_TEXT or LVCF_SUBITEM
lc.fmt=LVCFMT_LEFT
lc.cx=200
lc.pszText="ファイル名"
lc.iSubItem=0
SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_INSERTCOLUMN, 0, VarPtr(lc))
lc.cx=100
lc.pszText="時間"
lc.iSubItem=1
SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_INSERTCOLUMN, 1, VarPtr(lc))
'MainWndを画面の中央に配置
Dim MainWndRect As RECT
GetWindowRect(hMainWnd, MainWndRect)
SetWindowPos(hMainWnd, 0,_
(GetSystemMetrics(SM_CXSCREEN) - MainWndRect.right + MainWndRect.left) \ 2,_
(GetSystemMetrics(SM_CYSCREEN) - MainWndRect.bottom + MainWndRect.top) \ 2,_
0, 0, SWP_NOSIZE or SWP_NOZORDER)
'ソフト名を表示
SetWindowText(hMainWnd, lpstrSoftNameVer)
'アイコンハンドルを作成
liHandle=ImageList_Create(16, 16, ILC_COLOR32 or ILC_MASK, 10, 10)
'アイコンの追加
SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_SETIMAGELIST, LVSIL_SMALL, liHandle)
End Sub
Sub MainWnd_ChooseFolderButton_Click()
If DialogBox(hMainWnd, "ChooseDirDlg")=1 Then
'リストビューの内容を除去する
EnableWindow(GetDlgItem(hMainWnd, MusicFileListView), 0)
SendMessage(GetDlgItem(hMainWnd, MusicFileListView),&H1009,0,0)
EnaDisaButton(0, 0, 0, 0)
Dim fWav As Long, fMP3 As Long, fMID As Long, fWma As Long
fWav = SetMusicFileListView("wav")
fMP3 = SetMusicFileListView("mp3")
fMID = SetMusicFileListView("mid")
fWma = SetMusicFileListView("wma")
If fWav = FALSE And fMP3 = FALSE And fMID = FALSE And fWma = FALSE Then
MessageBox(hMainWnd, "指定したフォルダには音楽ファイルがありませんでした", "SameFolder MusicPlayer", MB_OK or MB_ICONEXCLAMATION)
EnableWindow(GetDlgItem(hMainWnd, MusicFileListView), 0)
End If
If fWav=TRUE or fMP3=TRUE or fMID=TRUE or fWma=TRUE Then
If IsGetMusicLong=1 Then
Dim hSetMusicLongThread As DWord
CreateThread(ByVal 0, 0, AddressOf(SetMusicLong), 0, 0, VarPtr(hSetMusicLongThread))
Else
EnableWindow(GetDlgItem(hMainWnd, MusicFileListView), 1)
EnaDisaButton(1, 0, 0, 1)
End If
End If
End If
End Sub
Sub MainWnd_ReLoadButton_Click()
EnableWindow(GetDlgItem(hMainWnd, MusicFileListView), 0)
'リストビューの内容を除去する
SendMessage(GetDlgItem(hMainWnd, MusicFileListView),&H1009,0,0)
EnaDisaButton(0, 0, 0, 0)
Dim fWav As Long, fMP3 As Long, fMID As Long, fWma As Long
fWav = SetMusicFileListView("wav")
fMP3 = SetMusicFileListView("mp3")
fMID = SetMusicFileListView("mid")
fWma = SetMusicFileListView("wma")
If fWav = FALSE And fMP3 = FALSE And fMID = FALSE And fWma = FALSE Then
MessageBox(hMainWnd, "指定したフォルダには音楽ファイルがありませんでした", "SameFolder MusicPlayer", MB_OK or MB_ICONEXCLAMATION)
End If
If fWav=TRUE or fMP3=TRUE or fMID=TRUE or fWma=TRUE Then
If IsGetMusicLong=1 Then
Dim hSetMusicLongThread As DWord
CreateThread(ByVal 0, 0, AddressOf(SetMusicLong), 0, 0, VarPtr(hSetMusicLongThread))
Else
EnableWindow(GetDlgItem(hMainWnd, MusicFileListView), 1)
EnaDisaButton(1, 0, 0, 1)
End If
End If
End Sub
Sub MainWnd_PlayButton_Click()
Dim dwError As DWord
Dim buffer[255] As Byte
Dim mpp As MCI_PLAY_PARMS
Dim lvFind As LVFINDINFO
Dim dwParms As DWord
Dim temp As Long
Dim bErr As Long
'もし再生中なら再生を停止
If mop.wDeviceID Then
CloseMciDevice()
End If
If mop.wDeviceID=0 Then
'-------------------------------
' 新たにMCIデバイスをオープン
'-------------------------------
'現在選択されている行を取得
temp=SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_GETNEXTITEM, -1, LVNI_ALL or LVNI_SELECTED)
If temp=LB_ERR Then Exit Sub
Dim buf[MAX_PATH] As Byte
Dim buf2[MAX_PATH] As Byte
Dim lvitem(6)As Long
lvitem(0)=1
lvitem(1)=temp
lvitem(2)=0
lvitem(3)=0
lvitem(4)=0
lvitem(5)=VarPtr(buf)
lvitem(6)=1024
'リストビューにあるファイル名を取得
SendMessage(GetDlgItem(hMainWnd, MusicFileListView),&H1005,0,VarPtr(lvitem(0)))
'MCIデバイスをオープン
lstrcpy(buf2, ChosenFolderPath & "\" & buf)
If OpenMciDevice(buf2)=0 Then Exit Sub
'-------------------------------
' トラックバーの範囲を設定
'-------------------------------
'サウンドの長さを取得
Dim msp As MCI_STATUS_PARMS
msp.dwItem=MCI_STATUS_LENGTH
mciSendCommand(mop.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, msp)
'トラックバーの範囲を設定
Dim nMax As Long
Dim hTrackBar As DWord
hTrackBar=GetDlgItem(hMainWnd, TrackBar1)
nMax=msp.dwReturn/100
SendMessage(hTrackBar, TBM_SETRANGE, 0, MAKELONG(0, nMax))
SendMessage(hTrackBar, TBM_SETPOS, 1, 0)
'音楽の長さを計算しグローバル変数にコピーする
nNowMusicMinute=msp.dwReturn/1000\60
nNowMusicSecond=msp.dwReturn/1000 mod 60
'スタティックに再生する音楽の長さを表示する
Dim lpstrbuffer[255] As Byte
wsprintf(lpstrbuffer, "00:00/%02d:%02d", nNowMusicMinute, nNowMusicSecond)
SetDlgItemText(hMainWnd, Static_NowMusicPos, lpstrbuffer)
'----------------
' 演奏を開始
'----------------
'演奏位置をトラックバーが示す位置に設定
Dim mciSeekParms As MCI_SEEK_PARMS
mciSeekParms.dwTo=SendMessage(hTrackBar, TBM_GETPOS, 0, 0)*100
bErr=mciSendCommand(mop.wDeviceID, MCI_SEEK, MCI_TO, mciSeekParms)
If bErr Then
MessageBox(hMainWnd, "シークに失敗しました", "SameFolder MusicPlayer Error", MB_OK or MB_ICONSTOP)
CloseMciDevice()
Exit Sub
End If
End If
'再生
mpp.dwCallback=hMainWnd
bErr=mciSendCommand(mop.wDeviceID, MCI_PLAY, MCI_NOTIFY, mpp)
If bErr Then
MessageBox(hMainWnd, "再生に失敗しました", "SameFolder MusicPlayer Error", MB_OK or MB_ICONSTOP)
Exit Sub
End If
'再生ボタンを無効化し、一時停止・停止・再読み込みボタンを有効化する
EnaDisaButton(0, 1, 1, 1)
'タイマー処理を開始する
SetTimer(hMainWnd, ID_TIMER, 100, 0)
End Sub
Sub MainWnd_PauseButton_Click()
'一時停止する
mciSendCommand(mop.wDeviceID, MCI_PAUSE, 0, ByVal 0)
'再生・停止・再読み込みボタンを有効化し、一時停止ボタンを無効化する
EnaDisaButton(1, 0, 1, 1)
'タイマー処理を終了する
KillTimer(hMainWnd, ID_TIMER)
End Sub
Sub MainWnd_StopButton_Click()
Dim bErr As Long
Dim dwCallback As DWord
'停止する
bErr=mciSendCommand(mop.wDeviceID, MCI_STOP, MCI_WAIT, dwCallback)
If bErr Then
MessageBox(hMainWnd, "デバイスの停止に失敗しました", "SameFolder MusicPlayer Error", MB_OK or MB_ICONSTOP)
End If
'デバイスを閉じる
mciSendCommand(mop.wDeviceID, MCI_CLOSE, MCI_WAIT, dwCallback)
mop.wDeviceID=0
'再生・再読み込みボタンを有効化し、一時停止・停止ボタンを無効化する
EnaDisaButton(1, 0, 0, 1)
'タイマー処理を終了する
KillTimer(hMainWnd, ID_TIMER)
'トラックバーの位置を0に設定
SendMessage(GetDlgItem(hMainWnd, TrackBar1), TBM_SETPOS, 1, 0)
'スタティックの表示を元に戻す
SetDlgItemText(hMainWnd, Static_NowMusicPos, "00:00/00:00")
End Sub
Sub MainWnd_MciNotify(flags As Long, DevID As DWord)
If flags=MCI_NOTIFY_SUCCESSFUL Then
'[停止]ボタンのイベントを実行
SendMessage(hMainWnd, WM_COMMAND, StopButton, 0)
End If
End Sub
Sub MainWnd_HScroll(nScrollCode As Long, nPos As Integer, hwndScrollBar As DWord)
Dim sw As Long
If mop.wDeviceID<>0 And _
hwndScrollBar=GetDlgItem(hMainWnd, TrackBar1) and _
(nScrollCode=SB_ENDSCROLL or _
nScrollCode=SB_LEFT or _
nScrollCode=SB_RIGHT or _
nScrollCode=SB_LINELEFT or _
nScrollCode=SB_LINERIGHT or _
nScrollCode=SB_PAGELEFT or _
nScrollCode=SB_PAGERIGHT or _
nScrollCode=SB_THUMBPOSITION)Then
'------------------------------------------------------
' ユーザーがトラックバーの位置を変えたとき
'------------------------------------------------------
If IsWindowEnabled(GetDlgItem(hMainWnd, PlayButton))=0 Then
'再生中のときは一時停止
SendMessage(hMainWnd, WM_COMMAND, PauseButton, 0)
sw=1
Else
sw=0
End If
'演奏位置をトラックバーが示す位置に設定
Dim bErr As Long
Dim mciSeekParms As MCI_SEEK_PARMS
mciSeekParms.dwTo=SendMessage(GetDlgItem(hMainWnd, TrackBar1), TBM_GETPOS, 0, 0)*100
bErr=mciSendCommand(mop.wDeviceID, MCI_SEEK, MCI_TO, mciSeekParms)
If bErr Then
MessageBox(hMainWnd, "シークに失敗しました", "SameFloder MusicPlayer Error", MB_OK or MB_ICONSTOP)
Exit Sub
End If
If sw Then
'再生中のときは再生を再開
SendMessage(hMainWnd, WM_COMMAND, PlayButton, 0)
End If
End If
End Sub
Sub MainWnd_Timer(TimerID As DWord)
Dim hTrackBar As DWord
Dim pos As Long
Dim msp As MCI_STATUS_PARMS
Dim Temp As Double, nMinute As Long, nSecond As Long
Dim lpstrBuffer[255] As Byte
If TimerID=ID_TIMER Then
hTrackBar=GetDlgItem(hMainWnd, TrackBar1)
'トラックバーを1目盛り進める
pos=SendMessage(hTrackBar, TBM_GETPOS, 0, 0)
pos=pos+1
SendMessage(hTrackBar, TBM_SETPOS, 1, pos)
'サウンドの現在位置を取得
msp.dwItem=MCI_STATUS_POSITION
mciSendCommand(mop.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, msp)
'サウンドの現在位置を表示
wsprintf(lpstrBuffer, "%02d:%02d/%02d:%02d", msp.dwReturn/1000\60, msp.dwReturn/1000 mod 60, nNowMusicMinute, nNowMusicSecond)
SetDlgItemText(hMainWnd, Static_NowMusicPos, lpstrBuffer)
End If
End Sub
Sub MainWnd_MusicFileListView_DblClick(ByRef nmListView As NMLISTVIEW)
SendMessage(hMainWnd, WM_COMMAND, PlayButton, 0)
End Sub
Sub MainWnd_QueryClose(ByRef cancel As Integer)
If mop.wDeviceID and IsWindowEnabled(GetDlgItem(hMainWnd, PlayButton))=FALSE Then
'もし再生中なら確認メッセージをだす。
'ユーザーが「いいえ」を選んだらcancel変数に1を格納し終了させない
If MessageBox(hMainWnd, "再生中です。終了しますか?", "SameFolder MusicPlayer", MB_YESNO or MB_ICONQUESTION)=IDNO Then
cancel=1
End If
End If
End Sub
Sub MainWnd_IDM_HELP_MenuClick()
Exec "Readme.txt"
End Sub
最後に、不完全な投稿であったことを、お詫び申し上げます。
[code]別のものとはどのようになるのでしょうか?
もっと具体的に教えてください。[/code] えぇと、例えば、僕のPCの場合、mp3ファイルをRealPlayerに関連付けていて、エクスプローラでのアイコンの表示はRealPlayerのアイコンなんですが、WMPのアイコンになってしまいます。また、wmaファイルの関連付けはWMPで、エクスプローラーのアイコンもWMPなのですが、RealPlayerのアイコンになってしまいます。
[code]できればMainWnd.sbpの全ソースか、せめてリストビューとイメージリスト関連の処理部分だけでも載せられませんか?
そうでないと比較・実験できませんので。[/code] すみません。以下に、MainWnd.sbpの全内容を載せます。
[hide][code]'-----------------------------------------------------------------------------
' イベント プロシージャ
'-----------------------------------------------------------------------------
' このファイルには、ウィンドウ [MainWnd] に関するイベントをコーディングします。
' ウィンドウ ハンドル: hMainWnd
' TODO: この位置にグローバルな変数、構造体、定数、関数を定義します。
Declare Function SHGetFileInfo Lib "shell32" Alias "SHGetFileInfoA" (pszPath As BytePtr, dwFileAttributes As DWord, ByRef psfi As SHFILEINFO, cbFileInfo As DWord, uFlags As DWord) As DWord
'タイマーのID。
Const ID_TIMER = 100
'MCI_OPEN_PARMS構造体。MCIデバイスのオープンに関する情報が格納される。
Dim mop As MCI_OPEN_PARMS
'現在選択されているフォルダのパスが格納される。
Dim ChosenFolderPath[MAX_PATH] As Byte
Dim IsGetMusicLong As Long
Dim MusicLong As Long
'アイコンのハンドル
Dim hIcon As DWord
'リストビューアイコンのハンドル
Dim liHandle As DWord
MusicLong=0
'現在再生されている音楽の分を格納する
Dim nNowMusicMinute As Long
'現在再生されている音楽の秒を格納する
Dim nNowMusicSecond As Long
'ソフト名とバージョンを格納する
Dim lpstrSoftNameVer[255] As Byte
lstrcpy(lpstrSoftNameVer, "SameFolder MusicPlayer v1.3.4.0")
'定数宣言
Const SHGFI_ICON = &H000000100 ' get icon
Const SHGFI_DISPLAYNAME = &H000000200 ' get display name
Const SHGFI_TYPENAME = &H000000400 ' get type name
Const SHGFI_ATTRIBUTES = &H000000800 ' get attributes
Const SHGFI_ICONLOCATION = &H000001000 ' get icon location
Const SHGFI_EXETYPE = &H000002000 ' return exe type
Const SHGFI_SYSICONINDEX = &H000004000 ' get system icon index
Const SHGFI_LINKOVERLAY = &H000008000 ' put a link overlay on icon
Const SHGFI_SELECTED = &H000010000 ' show icon in selected state
Const SHGFI_ATTR_SPECIFIED = &H000020000 ' get only specified attributes
Const SHGFI_LARGEICON = &H000000000 ' get large icon
Const SHGFI_SMALLICON = &H000000001 ' get small icon
Const SHGFI_OPENICON = &H000000002 ' get open icon
Const SHGFI_SHELLICONSIZE = &H000000004 ' get shell size icon
Const SHGFI_PIDL = &H000000008 ' pszPath is a pidl
Const SHGFI_USEFILEATTRIBUTES = &H000000010 ' use passed dwFileAttribute
Const SHGFI_ADDOVERLAYS = &H000000020 ' apply the appropriate overlays
Const SHGFI_OVERLAYINDEX = &H000000040 ' Get the index of the overlay
'構造体宣言
Type SHFILEINFO
hIcon As DWord ' out: icon
iIcon As Long ' out: icon index
dwAttributes As Dword ' out: SFGAO_ flags
szDisplayName[MAX_PATH] As Byte ' out: display name (or path)
szTypeName[80-1] As Byte ' out: type name
End Type
'MCIデバイスをオープンする為の自作関数。
Function OpenMciDevice(FileName As BytePtr) As Long
Dim bErr As DWord
Dim dwError As DWord
Dim buffer[255] As Byte 'MCIエラーを格納する変数
Dim OsVerInfo As OSVERSIONINFO 'OSのバージョンを格納する構造体
'メッセージ通知のためのウィンドウを指定
mop.dwCallback=hMainWnd
'OsVerInfo.dwOSVersionInfoSizeのサイズを指定
OsVerInfo.dwOSVersionInfoSize=Len(OsVerInfo)
'OSのバージョンを取得
GetVersionEx(OsVerInfo)
'もしOSがWin2KかWinXPでファイルがMIDIならMPEGVideoデバイスを指定
If OsVerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT and Right$(FileName, 3)="mid" or _
OsVerInfo.dwPlatformId=VER_PLATFORM_WIN32_NT and Right$(FileName, 4)="midi" Then
If OsVerInfo.dwMinorVersion=0 or OsVerInfo.dwMinorVersion=1 Then
mop.lpstrDeviceType="MPEGVideo"
mop.lpstrElementName=FileName
bErr=mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT or MCI_OPEN_TYPE, mop)
If bErr Then
mciGetErrorString(dwError, buffer, 255)
MessageBox(hMainWnd, buffer, "SameFolder MusicPlayer Error", MB_OK or MB_ICONERROR)
OpenMciDevice=0
CloseMciDevice()
Exit Sub
End If
End If
Else
mop.lpstrElementName=FileName
bErr=mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT, mop)
If bErr Then
mciGetErrorString(dwError, buffer, 255)
MessageBox(hMainWnd, buffer, "SameFolder MusicPlayer Error", MB_OK or MB_ICONERROR)
OpenMciDevice=0
CloseMciDevice()
Exit Sub
End If
End If
OpenMciDevice=1
End Function
'MCIデバイスをクローズするための関数
Sub CloseMciDevice()
Dim dwDummy As DWord
mciSendCommand(mop.wDeviceID, MCI_CLOSE, MCI_WAIT, dwDummy)
mop.wDeviceID=0
End Sub
'フォルダの選択ダイアログを出し、それをChosenFolderPath変数にコピーしスタティックに表示する関数
Function GetFolderPath() As Long
Dim bi As BROWSEINFO
Dim pidl As Long
'BROWSEINFO構造体の初期化
FillMemory(VarPtr(bi),Len(bi),0)
bi.hwndOwner=hMainWnd
bi.lpszTitle="フォルダを選択してください"
bi.ulFlags=BIF_RETURNONLYFSDIRS
'「フォルダの参照」ダイアログボックスを表示
pidl=SHBrowseForFolder(bi)
If pidl Then
'フォルダへのパスを取得(lpFolderポインタが示すバッファにコピー)
SHGetPathFromIDList(pidl, ChosenFolderPath)
CoTaskMemFree(pidl)
GetFolderPath=1
SetDlgItemText(hMainWnd, Static_NowFolderPath, ChosenFolderPath)
SetDlgItemText(hChooseDirDlg, Static_ChooseFolder, ChosenFolderPath)
Else
GetFolderPath=0
End If
SetFocus(hChooseDirDlg)
End Function
'ChosenFolderPathに格納されたパスの中の音楽ファイルを検索しMusicFileListViewにセットする為の関数
Function SetMusicFileListView(pExt As BytePtr) As Long
'検索に関する情報が格納される構造体
Dim FindData As WIN32_FIND_DATA
'検索のハンドル
Dim hFind As DWord
'音楽ファイルのパスを格納する変数
Dim PathBuffer[MAX_PATH]
'リストビューのアイテム設定時に使用する構造体
Dim lvItem As LVITEM
'音楽ファイルの長さを格納する変数
Dim MFileLong As String
'リストビューの番号を格納する変数
Dim ListViewNum As Long
Dim temp As DWord
Dim cnt As Long
'SHFILEINFO構造体
Dim shfi As SHFILEINFO
'ListViewNumの初期化
ListViewNum=0
Dim ExitCode As DWord
If mop.wDeviceID Then
'もし再生中なら停止する
SendMessage(hMainWnd, WM_COMMAND, StopButton, 0)
End If
hFind=FindFirstFile(ChosenFolderPath & "\*." & pExt, FindData)
If hFind = INVALID_HANDLE_VALUE Then
'戻り値を設定する
SetMusicFileListView = FALSE
Exit Function
End If
Do
'ファイルパスをセット
wsprintf(PathBuffer, "%s\%s", ChosenFolderPath, FindData.cFileName)
'アイコンハンドル取得
FillMemory(VarPtr(shfi), Len(shfi), 0)
SHGetFileInfo(PathBuffer, 0, shfi, Len(shfi), SHGFI_ICON or SHGFI_SMALLICON)
'アイコンハンドルをイメージリストに追加
ImageList_AddIcon(liHandle, shfi.hIcon)
'リストビューにファイルを追加
With lvItem
.mask=LVIF_TEXT or LVIF_PARAM or LVIF_IMAGE
.pszText=FindData.cFileName
.iImage=cnt
.iItem=0
.iSubItem=0
.lParam=ListViewNum
End With
SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_INSERTITEM, 0, VarPtr(lvItem))
cnt=cnt+1
Loop While FindNextFile(hFind, FindData)
FindClose(hFind)
'戻り値を設定する
SetMusicFileListView = TRUE
End Function
'ボタンを有効・無効する関数
Sub EnaDisaButton(Play As Long, Pause As Long, Stop As Long, Reload As Long)
EnableWindow(GetDlgItem(hMainWnd, PlayButton), Play)
EnableWindow(GetDlgItem(hMainWnd, PauseButton), Pause)
EnableWindow(GetDlgItem(hMainWnd, StopButton), Stop)
EnableWindow(GetDlgItem(hMainWnd, ReLoadButton), Reload)
End Sub
Sub SetMusicLong()
'変数宣言
Dim lvItem As LVITEM
Dim lpstrMusicPath[MAX_PATH] As Byte
Dim lpstrMusicName[MAX_PATH] As Byte
Dim lpstrBeforeMusicName[MAX_PATH] As Byte
Dim msp As MCI_STATUS_PARMS
Dim i As Long, i2 As Long
Dim lpstrbuffer[255] As Byte
Dim dw As DWord
Dim lvitem(6)As Long
'リストビューの項目数を取得
i2=SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_GETITEMCOUNT, 0, 0)
FillMemory(VarPtr(lvItem), Len(lvItem), 0)
For i=0 To i2
'上から順に内容を取得
lvitem(0)=LVIF_TEXT
lvitem(1)=i
lvitem(2)=0
lvitem(3)=0
lvitem(4)=0
lvitem(5)=lpstrMusicName
lvitem(6)=MAX_PATH
SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_GETITEM, 0, VarPtr(lvitem(0)))
'パスを設定する
lstrcpy(lpstrMusicPath, ChosenFolderPath & "\" & lpstrMusicName)
'MCIデバイスをオープン
If OpenMciDevice(lpstrMusicPath)=0 Then Exit Sub
'時間を取得する
msp.dwItem = MCI_STATUS_LENGTH
mciSendCommand(mop.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, msp)
'MCIデバイスをクローズ
CloseMciDevice()
wsprintf(lpstrbuffer, "%02d:%02d", msp.dwReturn/1000\60, msp.dwReturn/1000 mod 60)
'リストビューに時間を追加する
lvItem.mask=LVIF_TEXT
lvItem.pszText=lpstrbuffer
lvItem.iItem=i
lvItem.iSubItem=1
SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_SETITEM, 0, VarPtr(lvItem))
lstrcpy(lpstrBeforeMusicName, lpstrMusicName)
Next
EnableWindow(GetDlgItem(hMainWnd, MusicFileListView), 1)
EnaDisaButton(1, 0, 0, 1)
End Sub
'-----------------------------------------------------------------------------
' ウィンドウメッセージを処理するためのコールバック関数
Function MainWndProc(hWnd As DWord, dwMsg As DWord, wParam As DWord, lParam As DWord) As DWord
' TODO: この位置にウィンドウメッセージを処理するためのコードを記述します。
' イベントプロシージャの呼び出しを行います。
MainWndProc=EventCall_MainWnd(hWnd,dwMsg,wParam,lParam)
End Function
'-----------------------------------------------------------------------------
' ここから下は、イベントプロシージャを記述するための領域になります。
Sub MainWnd_Destroy()
sfmp_DestroyObjects()
PostQuitMessage(0)
ImageList_Destroy(liHandle)
End Sub
Sub MainWnd_IDM_VERSION_MenuClick()
'VerDlgダイアログボックスを出す
DialogBox(hMainWnd, "VerDlg")
End Sub
Sub MainWnd_Create(ByRef CreateStruct As CREATESTRUCT)
'行全体を選択するように設定
SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_SETEXTENDEDLISTVIEWSTYLE, 0, LVS_EX_FULLROWSELECT)
'----------------------------------
' リストビューのカラムを設定
'----------------------------------
'リストビューの追加に関する情報が格納される構造体
Dim lc As LVCOLUMN
lc.mask=LVCF_FMT or LVCF_WIDTH or LVCF_TEXT or LVCF_SUBITEM
lc.fmt=LVCFMT_LEFT
lc.cx=200
lc.pszText="ファイル名"
lc.iSubItem=0
SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_INSERTCOLUMN, 0, VarPtr(lc))
lc.cx=100
lc.pszText="時間"
lc.iSubItem=1
SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_INSERTCOLUMN, 1, VarPtr(lc))
'MainWndを画面の中央に配置
Dim MainWndRect As RECT
GetWindowRect(hMainWnd, MainWndRect)
SetWindowPos(hMainWnd, 0,_
(GetSystemMetrics(SM_CXSCREEN) - MainWndRect.right + MainWndRect.left) \ 2,_
(GetSystemMetrics(SM_CYSCREEN) - MainWndRect.bottom + MainWndRect.top) \ 2,_
0, 0, SWP_NOSIZE or SWP_NOZORDER)
'ソフト名を表示
SetWindowText(hMainWnd, lpstrSoftNameVer)
'アイコンハンドルを作成
liHandle=ImageList_Create(16, 16, ILC_COLOR32 or ILC_MASK, 10, 10)
'アイコンの追加
SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_SETIMAGELIST, LVSIL_SMALL, liHandle)
End Sub
Sub MainWnd_ChooseFolderButton_Click()
If DialogBox(hMainWnd, "ChooseDirDlg")=1 Then
'リストビューの内容を除去する
EnableWindow(GetDlgItem(hMainWnd, MusicFileListView), 0)
SendMessage(GetDlgItem(hMainWnd, MusicFileListView),&H1009,0,0)
EnaDisaButton(0, 0, 0, 0)
Dim fWav As Long, fMP3 As Long, fMID As Long, fWma As Long
fWav = SetMusicFileListView("wav")
fMP3 = SetMusicFileListView("mp3")
fMID = SetMusicFileListView("mid")
fWma = SetMusicFileListView("wma")
If fWav = FALSE And fMP3 = FALSE And fMID = FALSE And fWma = FALSE Then
MessageBox(hMainWnd, "指定したフォルダには音楽ファイルがありませんでした", "SameFolder MusicPlayer", MB_OK or MB_ICONEXCLAMATION)
EnableWindow(GetDlgItem(hMainWnd, MusicFileListView), 0)
End If
If fWav=TRUE or fMP3=TRUE or fMID=TRUE or fWma=TRUE Then
If IsGetMusicLong=1 Then
Dim hSetMusicLongThread As DWord
CreateThread(ByVal 0, 0, AddressOf(SetMusicLong), 0, 0, VarPtr(hSetMusicLongThread))
Else
EnableWindow(GetDlgItem(hMainWnd, MusicFileListView), 1)
EnaDisaButton(1, 0, 0, 1)
End If
End If
End If
End Sub
Sub MainWnd_ReLoadButton_Click()
EnableWindow(GetDlgItem(hMainWnd, MusicFileListView), 0)
'リストビューの内容を除去する
SendMessage(GetDlgItem(hMainWnd, MusicFileListView),&H1009,0,0)
EnaDisaButton(0, 0, 0, 0)
Dim fWav As Long, fMP3 As Long, fMID As Long, fWma As Long
fWav = SetMusicFileListView("wav")
fMP3 = SetMusicFileListView("mp3")
fMID = SetMusicFileListView("mid")
fWma = SetMusicFileListView("wma")
If fWav = FALSE And fMP3 = FALSE And fMID = FALSE And fWma = FALSE Then
MessageBox(hMainWnd, "指定したフォルダには音楽ファイルがありませんでした", "SameFolder MusicPlayer", MB_OK or MB_ICONEXCLAMATION)
End If
If fWav=TRUE or fMP3=TRUE or fMID=TRUE or fWma=TRUE Then
If IsGetMusicLong=1 Then
Dim hSetMusicLongThread As DWord
CreateThread(ByVal 0, 0, AddressOf(SetMusicLong), 0, 0, VarPtr(hSetMusicLongThread))
Else
EnableWindow(GetDlgItem(hMainWnd, MusicFileListView), 1)
EnaDisaButton(1, 0, 0, 1)
End If
End If
End Sub
Sub MainWnd_PlayButton_Click()
Dim dwError As DWord
Dim buffer[255] As Byte
Dim mpp As MCI_PLAY_PARMS
Dim lvFind As LVFINDINFO
Dim dwParms As DWord
Dim temp As Long
Dim bErr As Long
'もし再生中なら再生を停止
If mop.wDeviceID Then
CloseMciDevice()
End If
If mop.wDeviceID=0 Then
'-------------------------------
' 新たにMCIデバイスをオープン
'-------------------------------
'現在選択されている行を取得
temp=SendDlgItemMessage(hMainWnd, MusicFileListView, LVM_GETNEXTITEM, -1, LVNI_ALL or LVNI_SELECTED)
If temp=LB_ERR Then Exit Sub
Dim buf[MAX_PATH] As Byte
Dim buf2[MAX_PATH] As Byte
Dim lvitem(6)As Long
lvitem(0)=1
lvitem(1)=temp
lvitem(2)=0
lvitem(3)=0
lvitem(4)=0
lvitem(5)=VarPtr(buf)
lvitem(6)=1024
'リストビューにあるファイル名を取得
SendMessage(GetDlgItem(hMainWnd, MusicFileListView),&H1005,0,VarPtr(lvitem(0)))
'MCIデバイスをオープン
lstrcpy(buf2, ChosenFolderPath & "\" & buf)
If OpenMciDevice(buf2)=0 Then Exit Sub
'-------------------------------
' トラックバーの範囲を設定
'-------------------------------
'サウンドの長さを取得
Dim msp As MCI_STATUS_PARMS
msp.dwItem=MCI_STATUS_LENGTH
mciSendCommand(mop.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, msp)
'トラックバーの範囲を設定
Dim nMax As Long
Dim hTrackBar As DWord
hTrackBar=GetDlgItem(hMainWnd, TrackBar1)
nMax=msp.dwReturn/100
SendMessage(hTrackBar, TBM_SETRANGE, 0, MAKELONG(0, nMax))
SendMessage(hTrackBar, TBM_SETPOS, 1, 0)
'音楽の長さを計算しグローバル変数にコピーする
nNowMusicMinute=msp.dwReturn/1000\60
nNowMusicSecond=msp.dwReturn/1000 mod 60
'スタティックに再生する音楽の長さを表示する
Dim lpstrbuffer[255] As Byte
wsprintf(lpstrbuffer, "00:00/%02d:%02d", nNowMusicMinute, nNowMusicSecond)
SetDlgItemText(hMainWnd, Static_NowMusicPos, lpstrbuffer)
'----------------
' 演奏を開始
'----------------
'演奏位置をトラックバーが示す位置に設定
Dim mciSeekParms As MCI_SEEK_PARMS
mciSeekParms.dwTo=SendMessage(hTrackBar, TBM_GETPOS, 0, 0)*100
bErr=mciSendCommand(mop.wDeviceID, MCI_SEEK, MCI_TO, mciSeekParms)
If bErr Then
MessageBox(hMainWnd, "シークに失敗しました", "SameFolder MusicPlayer Error", MB_OK or MB_ICONSTOP)
CloseMciDevice()
Exit Sub
End If
End If
'再生
mpp.dwCallback=hMainWnd
bErr=mciSendCommand(mop.wDeviceID, MCI_PLAY, MCI_NOTIFY, mpp)
If bErr Then
MessageBox(hMainWnd, "再生に失敗しました", "SameFolder MusicPlayer Error", MB_OK or MB_ICONSTOP)
Exit Sub
End If
'再生ボタンを無効化し、一時停止・停止・再読み込みボタンを有効化する
EnaDisaButton(0, 1, 1, 1)
'タイマー処理を開始する
SetTimer(hMainWnd, ID_TIMER, 100, 0)
End Sub
Sub MainWnd_PauseButton_Click()
'一時停止する
mciSendCommand(mop.wDeviceID, MCI_PAUSE, 0, ByVal 0)
'再生・停止・再読み込みボタンを有効化し、一時停止ボタンを無効化する
EnaDisaButton(1, 0, 1, 1)
'タイマー処理を終了する
KillTimer(hMainWnd, ID_TIMER)
End Sub
Sub MainWnd_StopButton_Click()
Dim bErr As Long
Dim dwCallback As DWord
'停止する
bErr=mciSendCommand(mop.wDeviceID, MCI_STOP, MCI_WAIT, dwCallback)
If bErr Then
MessageBox(hMainWnd, "デバイスの停止に失敗しました", "SameFolder MusicPlayer Error", MB_OK or MB_ICONSTOP)
End If
'デバイスを閉じる
mciSendCommand(mop.wDeviceID, MCI_CLOSE, MCI_WAIT, dwCallback)
mop.wDeviceID=0
'再生・再読み込みボタンを有効化し、一時停止・停止ボタンを無効化する
EnaDisaButton(1, 0, 0, 1)
'タイマー処理を終了する
KillTimer(hMainWnd, ID_TIMER)
'トラックバーの位置を0に設定
SendMessage(GetDlgItem(hMainWnd, TrackBar1), TBM_SETPOS, 1, 0)
'スタティックの表示を元に戻す
SetDlgItemText(hMainWnd, Static_NowMusicPos, "00:00/00:00")
End Sub
Sub MainWnd_MciNotify(flags As Long, DevID As DWord)
If flags=MCI_NOTIFY_SUCCESSFUL Then
'[停止]ボタンのイベントを実行
SendMessage(hMainWnd, WM_COMMAND, StopButton, 0)
End If
End Sub
Sub MainWnd_HScroll(nScrollCode As Long, nPos As Integer, hwndScrollBar As DWord)
Dim sw As Long
If mop.wDeviceID<>0 And _
hwndScrollBar=GetDlgItem(hMainWnd, TrackBar1) and _
(nScrollCode=SB_ENDSCROLL or _
nScrollCode=SB_LEFT or _
nScrollCode=SB_RIGHT or _
nScrollCode=SB_LINELEFT or _
nScrollCode=SB_LINERIGHT or _
nScrollCode=SB_PAGELEFT or _
nScrollCode=SB_PAGERIGHT or _
nScrollCode=SB_THUMBPOSITION)Then
'------------------------------------------------------
' ユーザーがトラックバーの位置を変えたとき
'------------------------------------------------------
If IsWindowEnabled(GetDlgItem(hMainWnd, PlayButton))=0 Then
'再生中のときは一時停止
SendMessage(hMainWnd, WM_COMMAND, PauseButton, 0)
sw=1
Else
sw=0
End If
'演奏位置をトラックバーが示す位置に設定
Dim bErr As Long
Dim mciSeekParms As MCI_SEEK_PARMS
mciSeekParms.dwTo=SendMessage(GetDlgItem(hMainWnd, TrackBar1), TBM_GETPOS, 0, 0)*100
bErr=mciSendCommand(mop.wDeviceID, MCI_SEEK, MCI_TO, mciSeekParms)
If bErr Then
MessageBox(hMainWnd, "シークに失敗しました", "SameFloder MusicPlayer Error", MB_OK or MB_ICONSTOP)
Exit Sub
End If
If sw Then
'再生中のときは再生を再開
SendMessage(hMainWnd, WM_COMMAND, PlayButton, 0)
End If
End If
End Sub
Sub MainWnd_Timer(TimerID As DWord)
Dim hTrackBar As DWord
Dim pos As Long
Dim msp As MCI_STATUS_PARMS
Dim Temp As Double, nMinute As Long, nSecond As Long
Dim lpstrBuffer[255] As Byte
If TimerID=ID_TIMER Then
hTrackBar=GetDlgItem(hMainWnd, TrackBar1)
'トラックバーを1目盛り進める
pos=SendMessage(hTrackBar, TBM_GETPOS, 0, 0)
pos=pos+1
SendMessage(hTrackBar, TBM_SETPOS, 1, pos)
'サウンドの現在位置を取得
msp.dwItem=MCI_STATUS_POSITION
mciSendCommand(mop.wDeviceID, MCI_STATUS, MCI_STATUS_ITEM, msp)
'サウンドの現在位置を表示
wsprintf(lpstrBuffer, "%02d:%02d/%02d:%02d", msp.dwReturn/1000\60, msp.dwReturn/1000 mod 60, nNowMusicMinute, nNowMusicSecond)
SetDlgItemText(hMainWnd, Static_NowMusicPos, lpstrBuffer)
End If
End Sub
Sub MainWnd_MusicFileListView_DblClick(ByRef nmListView As NMLISTVIEW)
SendMessage(hMainWnd, WM_COMMAND, PlayButton, 0)
End Sub
Sub MainWnd_QueryClose(ByRef cancel As Integer)
If mop.wDeviceID and IsWindowEnabled(GetDlgItem(hMainWnd, PlayButton))=FALSE Then
'もし再生中なら確認メッセージをだす。
'ユーザーが「いいえ」を選んだらcancel変数に1を格納し終了させない
If MessageBox(hMainWnd, "再生中です。終了しますか?", "SameFolder MusicPlayer", MB_YESNO or MB_ICONQUESTION)=IDNO Then
cancel=1
End If
End If
End Sub
Sub MainWnd_IDM_HELP_MenuClick()
Exec "Readme.txt"
End Sub[/code][/hide]
最後に、不完全な投稿であったことを、お詫び申し上げます。