學習筆記:初探Windows API的——基於Windows API的音樂播放器
阿新 • • 發佈:2019-02-09
通過上一篇筆記,已經通過Windows API建立了一個簡單的視窗程式。本次採用Visual Studio 2017的資源管理工具,通過對話方塊製作一個音樂播放器。
先在VS中新建一個資原始檔(指令碼),並新增一個對話方塊資源(Dialog)
新建原始檔並鍵入基礎程式碼:
#include <windows.h> #include "resource.h" BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); //對話方塊過程 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)//主函式 { return DialogBox(hInstance, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DlgProc); }
幾個知識點:
1、訊息分流器:用於簡化訊息響應程式碼,是一個HANDLE_MSG巨集,需要引用<windowsx.h>
例子:
HANDLE_MSG(hDlg, WM_INITDIALOG, Cls_OnInitDialog);
HANDLE_MSG(hDlg, WM_COMMAND, Cls_OnCommand);
HANDLE_MSG(hDlg, WM_CLOSE, Cls_OnClose);
2、MCI(媒體控制介面):用於播放音樂檔案
例子:
#include <mmsystem.h> #pragma comment(lib, "WINMM.LIB") mciSendString(“open (Path)”, NULL, 0, NULL); mciSendString(“close (Path)”, NULL, 0, NULL); mciSendString(“play (Path)”, NULL, 0, NULL); mciSendString(“stop (Path)”, NULL, 0, NULL); mciSendString(“pause (Path)”, NULL, 0, NULL); mciSendString(“resume (Path)”, NULL, 0, NULL); mciSendString(“status (Path) length”,len, sizeof(len), NULL); mciSendString(“status (Path) position”,pos,sizeof(pos), NULL); mciSendString(“play (Path) from (pos)”, NULL, 0, NULL);
3、GetShortPathName函式: 播放器要獲取音樂檔案的路徑,本函式可以獲取指定路徑的短路徑形式,用來解決路徑帶空格的檔案無法開啟的情況。
函式原型:
GetShortPathName(
_In_ LPCWSTR lpszLongPath,
_Out_writes_to_opt_(cchBuffer, return + 1) LPWSTR lpszShortPath,
_In_ DWORD cchBuffer
);
4、定時器:SetTimer是一種API函式,用於每隔一段時間執行一件事。通常有兩種方法來實現:傳送WM_TIMER訊息和呼叫應用程式定義的回撥函式。不需要指定定時器時,可以呼叫對應的KillTimer函式銷燬指定的時鐘。
函式原型:
SetTimer(
_In_opt_ HWND hWnd,
_In_ UINT_PTR nIDEvent,
_In_ UINT uElapse,
_In_opt_ TIMERPROC lpTimerFunc);
再在對話方塊過程中響應WM_Timer訊息:
case WM_TIMER:
{
//......
}
5、建立“開啟”對話方塊
OPENFILENAME ofn;
TCHAR szFileName[MAX_PATH * 30];
ZeroMemory(&ofn, sizeof(ofn));
ZeroMemory(szFileName, sizeof(szFileName));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwnd; //父視窗控制代碼
ofn.lpstrFilter = TEXT("MP3檔案 (*.mp3)\0*.mp3\0WAV檔案 (*.wav)\0*.wav\0");
ofn.lpstrFile = szFileName;
ofn.nMaxFile = sizeof(szFileName);
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_ALLOWMULTISELECT;
ofn.lpstrInitialDir = TEXT(".\\"); //預設的開啟的檔案路徑,這裡以當前目錄為例
if (GetOpenFileName(&ofn))
{
//......
}
成果: