GUI 剖析之播放器 实例2) 全功能播放器
来源:互联网 发布:明底线知敬畏懂感恩 编辑:程序博客网 时间:2024/05/22 17:44
// 全功能播放器.cpp : 定义应用程序的入口点。
//本播放器采用MciSendString接口实现,还有一些功能没有实现,读者可参考 GUI 剖析之播放器实例1)代码,望见谅
点击打开链接参考播放器实例3
#include "stdafx.h"
#include "全功能播放器.h"
#include "resource.h"
#include <ShellAPI.h>
#include <string.h>
#include "CommDlg.h "
#include "mmsystem.h"
#include "DIGITALV.H"
#define MAX_LOADSTRING 100
#define MCI_ERROR 0xFFFFFFFF
// 全局变量:
HWND hVideoWnd;
BOOL bAVI;
UINT uDeviceID;
MCIDEVICEID m_mci_DID=MCI_ERROR;
DWORD m_dwCallBack=0;//MM_MCINOTIFY
#define BUFFER_SIZE 256
void aviVideoFileOpen(HWND hWnd,HWND hDlg);
DWORD GetVolume();
MCIERROR AddVolume(int dwVol);
MCIERROR SetVolume(DWORD dwVol);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK Set(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: 在此放置代码。
DialogBox(hInstance, MAKEINTRESOURCE(IDD_ABOUTBOX), NULL, About);
return 0;
}
// “关于”框的消息处理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
HDC hdc;
PAINTSTRUCT ps;
static BOOL bpaused;
static int dwVol=30;
switch (message)
{
case WM_ERASEBKGND:
{
return 0;
}
case WM_PAINT:
{
HWND hPlay=GetDlgItem(hDlg,IDC_STATIC);
RECT rect;
GetClientRect(hPlay,&rect);
hdc=BeginPaint(hPlay,&ps);
HDC hMemDC=CreateCompatibleDC(hdc);
HBITMAP hMemBm=CreateCompatibleBitmap(hdc,rect.right,rect.bottom);
SelectObject(hMemDC,hMemBm);
HBRUSH mybrush=(HBRUSH)CreateSolidBrush(RGB(0,0,0,255));
FillRect(hMemDC,&rect,mybrush);
HFONT hFont;;
hFont=CreateFont(23,23,0,0,
FW_THIN,
false,
false,
false,
GB2312_CHARSET,
OUT_CHARACTER_PRECIS,
CLIP_CHARACTER_PRECIS,
DEFAULT_QUALITY,
FF_MODERN,
L"隶书");
SelectObject(hMemDC,hFont);
SetTextColor(hMemDC,RGB(255,0,0));
SetBkMode(hMemDC,TRANSPARENT);
DrawText(hMemDC,L"天策版视频播放器(1.1版)[可以播放MPEG,AVI等格式文件] 郑金玮",-1,&rect,DT_WORDBREAK);
BitBlt(hdc,0,0,rect.right,rect.bottom,hMemDC,0,0,SRCCOPY);
DeleteDC(hMemDC);
DeleteObject(hMemBm);
EndPaint(hPlay,&ps);
break;
}
case WM_INITDIALOG:
{
SetWindowText(hDlg,TEXT("天策版媒体播放器"));
SetVolume(50);
return (INT_PTR)TRUE;
}
case WM_COMMAND:
{
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
switch(LOWORD(wParam))
{
case IDC_PLAY://播放
{
HWND hPlay=GetDlgItem(hDlg,IDC_STATIC);
mciSendString(L"seek thevideo to start",0,0,0);
if(bAVI)mciSendString(L"play thevideo window",0,0,0);
else mciSendString(L"play thevideo",0,0,0);
break;
}
case IDC_PAUSE://暂停
{
if(!bpaused)
{
mciSendString(L"pause thevideo",0,0,0);
HWND hText=GetDlgItem(hDlg,IDC_PAUSE);
SetWindowText(hText,TEXT("继续播放"));
bpaused=TRUE;
}
else
{
mciSendString(L"resume thevideo",0,0,0);
HWND hText=GetDlgItem(hDlg,IDC_PAUSE);
SetWindowText(hText,TEXT("暂停播放"));
bpaused=FALSE;
}
break;
}
case IDC_BREAK://停止
{
mciSendString(L"stop thevideo",0,0,0);
mciSendString(L"seek thevideo to start",0,0,0);
break;
}
case IDC_NEXT://下一曲目
{
break;
}
case IDC_LAST://上一曲目
{
break;
}
case IDC_ABOUT:
{
MessageBox(hDlg,TEXT("此播放器乃本人学习测试制作,\n功能齐全,可能存在一些bug,希望指正\nQQ:2538698032\n'©';copyright:All Right Reserved"),TEXT("关于"),MB_ICONINFORMATION|MB_OK);
break;
}
case IDC_DELETEITEM://删除选定项
{
break;
}
case IDC_EMPTYLIST://清空列表
{
mciSendCommand(MCI_ALL_DEVICE_ID, MCI_CLOSE, 0, NULL);
SendDlgItemMessage(hDlg,IDC_LIST1,LB_RESETCONTENT,0,0);
break;
}
case IDC_GETINFO://获取媒体信息
{
MCI_DGV_STATUS_PARMS StatusParam;
StatusParam.dwItem = MCI_WAVE_STATUS_SAMPLESPERSEC;
mciSendCommand(uDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM,(DWORD_PTR)&StatusParam);
DWORD samplerate = StatusParam.dwReturn; //该参数返回采样
StatusParam.dwItem = MCI_WAVE_STATUS_CHANNELS;
mciSendCommand(uDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM,(DWORD_PTR) &StatusParam);
DWORD channelnumber = StatusParam.dwReturn; //该参数返回通道数
WCHAR szBuff[256]={0};
wsprintf(szBuff,TEXT("采样:%d\n通道:%d"),samplerate,channelnumber);
MessageBox(hDlg,szBuff,TEXT(""),MB_OK|MB_ICONINFORMATION);
break;
}
case IDC_KNOW://了解制作人
{
ShellExecute(NULL,L"open",L"http://my.csdn.net/dai_jing",NULL,NULL,SW_SHOW);
break;
}
case IDC_JINGYIN://静音
{
SetVolume(0);
break;
}
case IDC_ZDYL://增大音量
{
if (dwVol<=0)
{
dwVol=-dwVol;
}
AddVolume(dwVol);
break;
}
case IDC_JXYL://减小音量
{
if (dwVol>=0)
{
dwVol=-dwVol;
}
AddVolume(dwVol);
break;
}
case IDC_GXH://个性化
{
break;
}
case IDC_ADDTOLIST:
{
HWND hPlay=GetDlgItem(hDlg,IDC_STATIC);
aviVideoFileOpen(hPlay,hDlg);
break;
}
case IDC_EXIT:
{
PostQuitMessage(0);
break;
}
case IDC_KJ://快进
{
mciSendString(L"stop thevideo",0,0,0);
mciSendString(L"STEP thevideo by 100",0,0,0);
if(bAVI)mciSendString(L"play thevideo window",0,0,0);
else mciSendString(L"play thevideo",0,0,0);
break;
}
case IDC_KT://快退
{
mciSendString(L"stop thevideo",0,0,0);
mciSendString(TEXT("step thevideo reverse by 100"),0,0,0);
if(bAVI)mciSendString(L"play thevideo window",0,0,0);
else mciSendString(L"play thevideo",0,0,0);
break;
}
case IDC_KNOW2://设置
{
HINSTANCE hInst=(HINSTANCE)GetWindowLong(hDlg,GWL_HINSTANCE);
DialogBox(NULL, MAKEINTRESOURCE(IDD_DIALOG1), hDlg,Set);
break;
}
default:break;
}
}
break;
}
return (INT_PTR)FALSE;
}
void aviVideoFileOpen(HWND hWnd,HWND hDlg)
{
OPENFILENAME ofn;
static WCHAR szFile[BUFFER_SIZE]=L"";
static WCHAR szFileTitle[BUFFER_SIZE];
memset(&ofn,0,sizeof(ofn));
ofn.lStructSize=sizeof(ofn);
ofn.hwndOwner=hWnd;
ofn.lpstrFilter=L"allfiles(*.avi,*.dat,*.mpg,*.mp4,*.3gp,*.mp3,*.wma,*.flv,*.*;)\0*.*;0*.flv;0*.wma;0*.mp3;0*.3gp;0*.mp4;0*.avi;*.dat;*.mpg\0\0";
ofn.nFilterIndex=0;
ofn.lpstrFile=szFile;
ofn.nMaxFile=sizeof(szFile);
ofn.lpstrFileTitle=szFileTitle;
ofn.nMaxFileTitle=sizeof(szFileTitle);
ofn.Flags=OFN_PATHMUSTEXIST|OFN_FILEMUSTEXIST|OFN_EXPLORER;
if(GetOpenFileName(&ofn))
{
SendDlgItemMessage(hDlg,IDC_LIST1,LB_ADDSTRING,0,(LPARAM)szFile);
mciSendCommand(MCI_ALL_DEVICE_ID, MCI_CLOSE, 0, NULL);
RECT rect;
MCI_DGV_OPEN_PARMS mciOpen;
MCI_DGV_STATUS_PARMS mciStatus;
memset(&mciOpen,0,sizeof(mciOpen));
mciStatus.dwItem=MCI_DGV_STATUS_HWND;
mciOpen.lpstrAlias=L"thevideo";
lstrcpy(szFile,ofn.lpstrFile);
mciOpen.lpstrElementName=szFile;
mciOpen.lpstrDeviceType=L"cdaudio";
mciOpen.hWndParent=hWnd;
mciOpen.dwCallback=(DWORD)hWnd;
mciOpen.dwStyle=WS_CHILD;
if(mciSendCommand(0,MCI_OPEN,MCI_OPEN_ALIAS|MCI_OPEN_ELEMENT|
MCI_DGV_OPEN_PARENT|MCI_DGV_OPEN_WS,(DWORD)&mciOpen)==0)
{
uDeviceID=mciOpen.wDeviceID;
if(wcsstr(szFile,L".AVI"))bAVI=TRUE;else bAVI=FALSE;
mciSendCommand(uDeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)&mciStatus);
hVideoWnd=(HWND)mciStatus.dwReturn;
GetClientRect(hWnd,&rect);
if(bAVI)mciSendString(L"play thevideo window",0,0,0);
else mciSendString(L"play thevideo ",0,0,0);
MoveWindow(hVideoWnd,rect.left,rect.top,rect.right,rect.bottom,TRUE);
}
MessageBox(hWnd,L"添加成功",L"关于添加",
MB_ICONINFORMATION|MB_OK);
WCHAR szBuff[256]={0};
wsprintf(szBuff,TEXT("正在播放:%s"),szFile);
SetDlgItemText(hDlg,IDC_ZJW,szBuff);
}
}
DWORD GetVolume()
{
if(MCI_ERROR==uDeviceID)
return 0;//Invalid device ID.
MCI_STATUS_PARMS mci_p = {0};
mci_p.dwCallback = m_dwCallBack;
mci_p.dwItem = MCI_DGV_STATUS_VOLUME;
mciSendCommand(
uDeviceID,
MCI_STATUS,
MCI_NOTIFY|MCI_STATUS_ITEM,
(DWORD)&mci_p);
return mci_p.dwReturn;
}
MCIERROR AddVolume(int dwVol)
{
int newVol=(int)GetVolume()+dwVol;
if(newVol<0)
newVol=0;
return SetVolume(newVol);
}
MCIERROR SetVolume(DWORD dwVol)
{
if(MCI_ERROR==uDeviceID)
return MCIERR_INVALID_DEVICE_ID;//Invalid device ID.
MCIERROR mciERR = ERROR_SUCCESS;
MCI_DGV_SETAUDIO_PARMS mci_p = {0};
if(dwVol<0)
dwVol=0;
if(dwVol>1000)
dwVol=1000;
mci_p.dwCallback = m_dwCallBack;
mci_p.dwItem = MCI_DGV_SETAUDIO_VOLUME;
mci_p.dwValue = dwVol;
mciERR = mciSendCommand(
uDeviceID,
MCI_SETAUDIO,
MCI_NOTIFY|MCI_DGV_SETAUDIO_ITEM|MCI_DGV_SETAUDIO_VALUE,
(DWORD)&mci_p);
return mciERR;
}
INT_PTR CALLBACK Set(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
switch (message)
{
case WM_INITDIALOG:
{
SetWindowText(hDlg,TEXT("播放设置"));
return (INT_PTR)TRUE;
}
case WM_COMMAND:
{
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
}
break;
}
}
return (INT_PTR)FALSE;
}
- GUI 剖析之播放器 实例2) 全功能播放器
- GUI 剖析之播放器实例1
- GUI 剖析之 6)我想写音乐播放器程序
- 下载全功能视频播放器
- 创建一个全功能的FLV播放器
- 制作一个全功能的FLV播放器
- 安卓MP3播放器开发实例(2)之音乐播放
- iOS视频播放器之ZFPlayer剖析
- Android 视频播放器笔记之播放器实例代码
- 稳扎稳打Silverlight(18) - 2.0视频之详解MediaElement, 开发一个简易版的全功能播放器
- Swing之音乐播放器实例
- VLC播放器架构剖析
- ffplay播放器原理剖析
- AS3制作全功能的FLV网络视频播放器
- EasyPlayer RTSP/RTMP/HTTP/HLS全功能播放器
- Android音乐播放器的播放实例
- 音乐播放器之--在线音乐播放
- Html5 音频播放器实例
- Qt 4.8.3 中资源文件找不到的错误
- 新华时代公司简介
- 高级程序员装逼指南
- 完美解决failed to open stream: HTTP request failed!
- SpringMVC+Spring+Hibernate整合
- GUI 剖析之播放器 实例2) 全功能播放器
- HR 故事-应聘和竞聘
- java标签之表格的隔行间色显示
- 挂载SD卡
- 2012 SCI收录期刊及影响因子(4/10)
- Android开发者指南(6) —— AIDL
- 管理心理学
- 利用Python抓取和解析网页
- Qt动画框架--原创翻译