MCI音乐播放器

MCI做的简单的音乐播放器,有播放、暂停、停止、快放/慢放、快进/回退等主要功能,并且可以播放视频,不过视频播放有BUG,还请见谅。播放音频有很无奈的BUG,播放时进度条前进会影响声音卡顿,求解……


// MCIPlayerDlg.h : 头文件
#pragma once
#include "afxcmn.h"
// CMCIPlayerDlg 对话框
class CMCIPlayerDlg : public CDialogEx
{
// 构造
public:
	CMCIPlayerDlg(CWnd* pParent = NULL);	// 标准构造函数
// 对话框数据
	enum { IDD = IDD_MCIPLAYER_DIALOG };
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持
// 实现
protected:
	HICON m_hIcon;
	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
private:
	unsigned int speed;
	unsigned int volume;
	CString song;
	CSliderCtrl slider;
	bool start;
	void changeSpeed(unsigned int);
	static DWORD WINAPI ThreadProc(LPVOID lpParam);
	void updatePro();
public:
	afx_msg void OnBnClickedBtnPlay();
	afx_msg void OnBnClickedBtnPause();
	afx_msg void OnBnClickedBtnStop();
	afx_msg void OnBnClickedBtnFast();
	afx_msg void OnBnClickedBtnSlow();
	afx_msg void OnBnClickedBtnChild();
	afx_msg void OnBnClickedBtnDeepman();
	afx_msg void OnBnClickedBtnHighwoman();
	afx_msg void OnBnClickedBtnAchead();
	afx_msg void OnBnClickedBtnBack();
	afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
	afx_msg void OnNMCustomdrawSlider2(NMHDR *pNMHDR, LRESULT *pResult);
	afx_msg void OnTimer(UINT_PTR nIDEvent);
	int position;
	CSliderCtrl slider_progress;
	afx_msg void OnBnClickedBtnOpen();
};
// MCIPlayerDlg.cpp : 实现文件
#include "stdafx.h"
#include "MCIPlayer.h"
#include "MCIPlayerDlg.h"
#include "afxdialogex.h"
#include <mmsystem.h>  
#pragma comment(lib,"winmm.lib")

#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CMCIPlayerDlg 对话框
CMCIPlayerDlg::CMCIPlayerDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CMCIPlayerDlg::IDD, pParent)
	, speed(1000)
	, position(0)
	, volume(600)
	, start(FALSE)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CMCIPlayerDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_SLIDER1, slider);
	DDX_Control(pDX, IDC_SLIDER2, slider_progress);
}
BEGIN_MESSAGE_MAP(CMCIPlayerDlg, CDialogEx)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BTN_PLAY, &CMCIPlayerDlg::OnBnClickedBtnPlay)
	ON_BN_CLICKED(IDC_BTN_PAUSE, &CMCIPlayerDlg::OnBnClickedBtnPause)
	ON_BN_CLICKED(IDC_BTN_STOP, &CMCIPlayerDlg::OnBnClickedBtnStop)
	ON_BN_CLICKED(IDC_BTN_FAST, &CMCIPlayerDlg::OnBnClickedBtnFast)
	ON_BN_CLICKED(IDC_BTN_SLOW, &CMCIPlayerDlg::OnBnClickedBtnSlow)
	ON_BN_CLICKED(IDC_BTN_CHILD, &CMCIPlayerDlg::OnBnClickedBtnChild)
	ON_BN_CLICKED(IDC_BTN_DEEPMAN, &CMCIPlayerDlg::OnBnClickedBtnDeepman)
	ON_BN_CLICKED(IDC_BTN_HIGHWOMAN, &CMCIPlayerDlg::OnBnClickedBtnHighwoman)
	ON_BN_CLICKED(IDC_BTN_ACHEAD, &CMCIPlayerDlg::OnBnClickedBtnAchead)
	ON_BN_CLICKED(IDC_BTN_BACK, &CMCIPlayerDlg::OnBnClickedBtnBack)
	ON_WM_HSCROLL()
	ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER2, &CMCIPlayerDlg::OnNMCustomdrawSlider2)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BTN_OPEN, &CMCIPlayerDlg::OnBnClickedBtnOpen)
END_MESSAGE_MAP()
// CMCIPlayerDlg 消息处理程序
void CMCIPlayerDlg::changeSpeed(unsigned int p_speed)
{
	LPTSTR str_temp = new TCHAR[100];
	wsprintf(str_temp, "set temp_song speed %d", p_speed);
	mciSendString(str_temp, NULL, 0, NULL);
	
	return;
}
void CMCIPlayerDlg::OnBnClickedBtnPlay()
{
	// TODO: Add your control notification handler code here
	CString f_open, f_movie;
	HWND hWn = GetDlgItem(IDC_P)->GetSafeHwnd();
	f_open.Format("open %s type MPEGVideo alias temp_song parent %u Style %u notify", song, hWn, WS_CHILD);
	mciSendString(f_open.GetBuffer(f_open.GetLength()), NULL, 0, NULL);
	f_movie.Format("put temp_song window at 0 0 %d %d", 330, 184);
	mciSendString(f_movie, NULL, 0, NULL);
	mciSendString("play temp_song", NULL, 0, NULL);

	if (start)
	{
		return;
	}
	slider.SetRange(1, 1000);
	slider.SetTicFreq(10);
	slider.SetPos(600);
	mciSendString("setaudio temp_song volume to 600", NULL, 0, NULL);

	char le[1024];
	mciSendString("status temp_song length", le, sizeof(le), 0);
	int temp_le = atoi(le);
	slider_progress.SetRange(1, temp_le);
	slider_progress.SetPos(0);
	
	SetTimer(1, 1000, NULL);
	//hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)ThreadProc, (LPVOID)this, 0, NULL);

	start = TRUE;
}
void CMCIPlayerDlg::OnBnClickedBtnPause()
{
	// TODO: Add your control notification handler code here
	mciSendString("pause temp_song", NULL, 0, NULL);
}
void CMCIPlayerDlg::OnBnClickedBtnStop()
{
	// TODO: Add your control notification handler code here
	mciSendString("stop temp_song", NULL, 0, NULL);
	mciSendString("close temp_song", NULL, 0, NULL);
	speed = 1000;
	start = FALSE;
	KillTimer(1);
	//CloseHandle(hThread);
}
void CMCIPlayerDlg::OnBnClickedBtnFast()
{
	// TODO: Add your control notification handler code here
	speed += 100;
	changeSpeed(speed);
}
void CMCIPlayerDlg::OnBnClickedBtnSlow()
{
	// TODO: Add your control notification handler code here
	speed -= 100;
	changeSpeed(speed);
}
void CMCIPlayerDlg::OnBnClickedBtnChild()
{
	// TODO: Add your control notification handler code here
	speed = 1400;
	changeSpeed(speed);
}
void CMCIPlayerDlg::OnBnClickedBtnDeepman()
{

	// TODO: Add your control notification handler code here
	speed = 800;
	changeSpeed(speed);
}
void CMCIPlayerDlg::OnBnClickedBtnHighwoman()
{
	// TODO: Add your control notification handler code here
	speed = 1200;
	changeSpeed(speed);
}
void CMCIPlayerDlg::OnBnClickedBtnAchead()

{
	// TODO: Add your control notification handler code here
	CString temp;
	char po[256];
	mciSendString("status temp_song position", po, 255, 0);
	position = StrToInt(po) + 4000;
	temp.Format("seek temp_song to %d", position);
	mciSendString(temp.GetBuffer(temp.GetLength()), NULL, 0, NULL);
	mciSendString("play temp_song", NULL, 0, NULL);
}
void CMCIPlayerDlg::OnBnClickedBtnBack()
{

	// TODO: Add your control notification handler code here
	CString temp;
	char po[256];
	mciSendString("status temp_song position", po, 255, 0);
	if ((position = StrToInt(po) - 4000) < 0)
	{
		position = 0;
	}
	temp.Format("seek temp_song to %d", position);
	mciSendString(temp.GetBuffer(temp.GetLength()), NULL, 0, NULL);
	mciSendString("play temp_song", NULL, 0, NULL);

}
void CMCIPlayerDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
	// TODO: Add your message handler code here and/or call default
	volume = slider.GetPos();
	CString temp;
	temp.Format("setaudio temp_song volume to %d", volume);
	mciSendString(temp.GetBuffer(temp.GetLength()), NULL, 0, NULL);

	CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CMCIPlayerDlg::OnNMCustomdrawSlider2(NMHDR *pNMHDR, LRESULT *pResult)
{
	LPNMCUSTOMDRAW pNMCD = reinterpret_cast<LPNMCUSTOMDRAW>(pNMHDR);
	// TODO: Add your control notification handler code here
	CString temp;

	position = slider_progress.GetPos();
	temp.Format("seek temp_song to %d", position);
	mciSendString(temp.GetBuffer(temp.GetLength()), NULL, 0, NULL);
	mciSendString("play temp_song", NULL, 0, NULL);

	*pResult = 0;
}
void CMCIPlayerDlg::OnTimer(UINT_PTR nIDEvent)
{
	// TODO: Add your message handler code here and/or call default
	char po[256];
	mciSendString("status temp_song position", po, 255, 0);
	int position = StrToInt(po);
	slider_progress.SetPos(position);

	CDialogEx::OnTimer(nIDEvent);
}
DWORD WINAPI CMCIPlayerDlg::ThreadProc(LPVOID lpParam)
{
	//SetTimer((HWND)lpParam, 1, 1000, NULL);
	//CMCIPlayerDlg* p = (CMCIPlayerDlg*)lpParam;
	while (TRUE)
	{
		Sleep(1000);
		((CMCIPlayerDlg*)lpParam)->updatePro();
	}

	return 0;
}
void CMCIPlayerDlg::updatePro()
{
	//char po[256];
	//mciSendString("status temp_song position", po, 255, 0);
	//int position = StrToInt(po);
	//slider_progress.SetPos(position);

	return;
}
void CMCIPlayerDlg::OnBnClickedBtnOpen()
{
	// TODO: Add your control notification handler code here
	CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
		"音频文件(*.mp3;*.wav)|*.mp3;*.wav|"
		"视频文件(*.f4v;*.mp4;*.avi)|*.f4v;*.mp4;*.avi|");

	if(dlg.DoModal()==IDOK)
	{
		song = dlg.GetPathName();
		OnBnClickedBtnPlay();
	}
}

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值