1. 程式人生 > >學習筆記:初探Windows API的——基於Windows API的音樂播放器

學習筆記:初探Windows API的——基於Windows API的音樂播放器

通過上一篇筆記,已經通過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))
{
    //......
}


成果: