学习笔记:初探Windows API的——基于Windows API的音乐播放器
程序员文章站
2024-03-19 08:12:34
...
通过上一篇笔记,已经通过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))
{
//......
}
成果:
上一篇: NATAPP使用教程(内网穿透)
下一篇: windows API窗口程序
推荐阅读