欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

学习笔记:初探Windows API的——基于Windows API的音乐播放器

程序员文章站 2024-03-19 08:12:34
...

 通过上一篇笔记,已经通过Windows API建立了一个简单的窗口程序。本次采用Visual Studio 2017的资源管理工具,通过对话框制作一个音乐播放器。

学习笔记:初探Windows API的——基于Windows API的音乐播放器

先在VS中新建一个资源文件(脚本),并添加一个对话框资源(Dialog)

学习笔记:初探Windows API的——基于Windows API的音乐播放器

新建源文件并键入基础代码:

#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))
{
    //......
}


成果:

学习笔记:初探Windows API的——基于Windows API的音乐播放器