MFC制作简易音乐播放器

// MFC音乐播放器Dlg.cpp : implementation file
//
#include "stdafx.h"
#include "MFC音乐播放器.h"
#include "MFC音乐播放器Dlg.h"
#include "Mmsystem.h"
#include "Digitalv.h"
#pragma comment(lib,"Winmm.lib")
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif//定义三个全局变量
HWND m_hWnd;//记录当前窗口的句柄
DWORD DeviceID;//指定播放音乐的设备
MCI_OPEN_PARMS mciopenparms;//指定打开音乐文件的参数void Load(HWND hWnd,CString strFilepath)
{m_hWnd=hWnd;mciSendCommand(DeviceID,MCI_CLOSE,0,0);//在加载文件前先清空上一次播放的设备mciopenparms.lpstrElementName=strFilepath;//将音乐文件路径传给设备DWORD dwReturn;if(dwReturn=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT|MCI_WAIT,(DWORD)(LPVOID)&mciopenparms)){//如果打开文件失败,则将出错信息储存在buffer,并显示出错警告char buffer[256];mciGetErrorString(dwReturn,buffer,256);MessageBox(hWnd,buffer,"出错警告!",MB_ICONHAND|MB_ICONERROR|MB_ICONSTOP);}DeviceID=mciopenparms.wDeviceID;//打开文件成功就关联文件到设备
}void play()
{MCI_PLAY_PARMS mciplayparms;mciplayparms.dwCallback=(DWORD)m_hWnd;mciplayparms.dwFrom=0;//每次播放都是从0开始播放  dwFrom用于设置音乐播放的起始位置mciSendCommand(DeviceID,MCI_PLAY,MCI_FROM|MCI_NOTIFY,(DWORD)(LPVOID)&mciplayparms);//dwCallback与MCI_NOTIFY是配对出现的
}void pause()
{mciSendCommand(DeviceID,MCI_PAUSE,0,0);
}
void resume()
{mciSendCommand(DeviceID,MCI_RESUME,0,0);
}
void stop()
{mciSendCommand(DeviceID,MCI_STOP,0,0);//当点击停止按钮时,将所有的信息都清除掉mciSendCommand(DeviceID,MCI_CLOSE,0,0);//点关闭按钮的时候,清除设备信息,再点播放按钮,就播放不了音乐了}
DWORD setvolume(DWORD vol)
{MCI_DGV_SETAUDIO_PARMS setvolume;//这是设置音量的参数数据结构setvolume.dwCallback=NULL;setvolume.dwItem=MCI_DGV_SETAUDIO_VOLUME;//动作是设置音量setvolume.dwValue=vol;//音量值是volmciSendCommand(DeviceID,MCI_SETAUDIO,MCI_DGV_SETAUDIO_ITEM|MCI_DGV_SETAUDIO_VALUE,(DWORD)(LPVOID)&setvolume);return 0;
}/
// CAboutDlg dialog used for App Aboutclass CAboutDlg : public CDialog
{
public:CAboutDlg();// Dialog Data//{{AFX_DATA(CAboutDlg)enum { IDD = IDD_ABOUTBOX };//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CAboutDlg)
protected:virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support//}}AFX_VIRTUAL// Implementation
protected://{{AFX_MSG(CAboutDlg)//}}AFX_MSGDECLARE_MESSAGE_MAP()
};CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{//{{AFX_DATA_INIT(CAboutDlg)//}}AFX_DATA_INIT
}void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CAboutDlg)//}}AFX_DATA_MAP
}BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)//{{AFX_MSG_MAP(CAboutDlg)// No message handlers//}}AFX_MSG_MAP
END_MESSAGE_MAP()/
// CMFCDlg dialogCMFCDlg::CMFCDlg(CWnd* pParent /*=NULL*/): CDialog(CMFCDlg::IDD, pParent)
{//{{AFX_DATA_INIT(CMFCDlg)m_int = 0;//}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}void CMFCDlg::DoDataExchange(CDataExchange* pDX)
{CDialog::DoDataExchange(pDX);//{{AFX_DATA_MAP(CMFCDlg)DDX_Control(pDX, IDC_SLIDER, m_slider);DDX_Text(pDX, IDC_vol, m_int);//}}AFX_DATA_MAP
}BEGIN_MESSAGE_MAP(CMFCDlg, CDialog)//{{AFX_MSG_MAP(CMFCDlg)ON_WM_SYSCOMMAND()ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_about, Onabout)ON_BN_CLICKED(IDC_exitbt, Onexitbt)ON_NOTIFY(NM_CUSTOMDRAW, IDC_SLIDER, OnCustomdrawSlider)ON_BN_CLICKED(IDC_filechoice, Onfilechoice)ON_BN_CLICKED(IDC_play, Onplay)ON_BN_CLICKED(IDC_pause, Onpause)ON_BN_CLICKED(IDC_stop, Onstop)//}}AFX_MSG_MAP
END_MESSAGE_MAP()/
// CMFCDlg message handlersBOOL CMFCDlg::OnInitDialog()
{CDialog::OnInitDialog();// Add "About..." menu item to system menu.// IDM_ABOUTBOX must be in the system command range.ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);CMenu* pSysMenu = GetSystemMenu(FALSE);if (pSysMenu != NULL){CString strAboutMenu;strAboutMenu.LoadString(IDS_ABOUTBOX);if (!strAboutMenu.IsEmpty()){pSysMenu->AppendMenu(MF_SEPARATOR);pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// Set the icon for this dialog.  The framework does this automatically//  when the application's main window is not a dialogSetIcon(m_hIcon, TRUE);			// Set big iconSetIcon(m_hIcon, FALSE);		// Set small iconm_slider.SetRange(0,1000);//滑块的移动范围0~1000m_slider.SetPos(500);//滑块指针的初始位置设为500代表初始音量为50GetDlgItem(IDC_play)->EnableWindow(false);//文件没有读取时所有按钮应该是不可选的GetDlgItem(IDC_pause)->EnableWindow(false);GetDlgItem(IDC_stop)->EnableWindow(false);// TODO: Add extra initialization herereturn TRUE;  // return TRUE  unless you set the focus to a control
}void CMFCDlg::OnSysCommand(UINT nID, LPARAM lParam)
{if ((nID & 0xFFF0) == IDM_ABOUTBOX){CAboutDlg dlgAbout;dlgAbout.DoModal();}else{CDialog::OnSysCommand(nID, lParam);}
}// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.void CMFCDlg::OnPaint() 
{if (IsIconic()){CPaintDC dc(this); // device context for paintingSendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);// Center icon in client rectangleint cxIcon = GetSystemMetrics(SM_CXICON);int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;// Draw the icondc.DrawIcon(x, y, m_hIcon);}else{//修改对话框的背景//CDialog::OnPaint();CPaintDC   dc(this);   CRect   rect;   GetClientRect(&rect);   CDC   dcMem;   dcMem.CreateCompatibleDC(&dc);   CBitmap   bmpBackground;   bmpBackground.LoadBitmap(IDB_BITMAP);  //IDB_BITMAP:自己导入位图的IDBITMAP   bitmap;   bmpBackground.GetBitmap(&bitmap);   CBitmap   *pbmpOld=dcMem.SelectObject(&bmpBackground);   dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,   bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);  }
}// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMFCDlg::OnQueryDragIcon()
{return (HCURSOR) m_hIcon;
}void CMFCDlg::Onabout() 
{CAboutDlg dlg;dlg.DoModal();	
}void CMFCDlg::Onexitbt()    //退出软件按钮的函数  
{CDialog::OnCancel();	
}void CMFCDlg::OnCustomdrawSlider(NMHDR* pNMHDR, LRESULT* pResult) 
{UpdateData(true);m_int=m_slider.GetPos()/10;setvolume(m_slider.GetPos());UpdateData(false);*pResult = 0;
}void CMFCDlg::Onfilechoice() 
{char szFileFilter[]="mp3文件(*.mp3)|*.mp3|""wma文件(*.wma)|*.wma|""wav文件(*.wav)|*.wav|""所有文件(*.*)|*.*|";//文件类型过滤  CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONLY,szFileFilter);if(dlg.DoModal()==IDOK){CString strFilepath=dlg.GetPathName();CString strFilename=dlg.GetFileName();SetDlgItemText(IDC_filename,strFilename);Load(this->m_hWnd,strFilepath);//文件读取成功时所有按钮变为可选GetDlgItem(IDC_play)->EnableWindow(true);GetDlgItem(IDC_pause)->EnableWindow(true);GetDlgItem(IDC_stop)->EnableWindow(true);}
}void CMFCDlg::Onplay() 
{play();SetDlgItemText(IDC_pause,"暂停");	
}void CMFCDlg::Onpause() 
{CString strtemp;GetDlgItemText(IDC_pause,strtemp);//获取按钮状态if(strtemp.Compare("暂停")==0){pause();SetDlgItemText(IDC_pause,"恢复");}	if(strtemp.Compare("恢复")==0){resume();SetDlgItemText(IDC_pause,"暂停");}	
}void CMFCDlg::Onstop() 
{stop();	SetDlgItemText(IDC_pause,"暂停");GetDlgItem(IDC_play)->EnableWindow(false);//当stop按钮按下时,播放和暂停应该均不可用GetDlgItem(IDC_pause)->EnableWindow(false);
}


头文件如下:

// MFC音乐播放器Dlg.h : header file
//#if !defined(AFX_MFCDLG_H__207E26CE_BBBE_4D81_8A38_AEA46E10AB5B__INCLUDED_)
#define AFX_MFCDLG_H__207E26CE_BBBE_4D81_8A38_AEA46E10AB5B__INCLUDED_#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000/
// CMFCDlg dialogclass CMFCDlg : public CDialog
{
// Construction
public:CMFCDlg(CWnd* pParent = NULL);	// standard constructor// Dialog Data//{{AFX_DATA(CMFCDlg)enum { IDD = IDD_MFC_DIALOG };CSliderCtrl	m_slider;int		m_int;//}}AFX_DATA// ClassWizard generated virtual function overrides//{{AFX_VIRTUAL(CMFCDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV support//}}AFX_VIRTUAL// Implementation
protected:HICON m_hIcon;// Generated message map functions//{{AFX_MSG(CMFCDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void Onabout();afx_msg void Onexitbt();afx_msg void OnCustomdrawSlider(NMHDR* pNMHDR, LRESULT* pResult);afx_msg void Onfilechoice();afx_msg void Onplay();afx_msg void Onpause();afx_msg void Onstop();//}}AFX_MSGDECLARE_MESSAGE_MAP()
};//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_MFCDLG_H__207E26CE_BBBE_4D81_8A38_AEA46E10AB5B__INCLUDED_)


最后运行效果如下:






本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/492481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

即使达到5级自动驾驶阶段,自动驾驶“卡车”也不可能完全“无人”

来源&#xff1a;IEEE编译&#xff1a;大数据文摘 李雷、周素云感谢Waymo和Uber等创业公司&#xff0c;让我们知道了无人驾驶汽车是怎么回事。这些汽车或卡车上配备了大量的传感器&#xff0c;并且依靠强大的计算能力使人们可以放心乘坐。愿景是美好的&#xff0c;但是却忽视了…

iOS 两种方法实现左右滑动出现侧边菜单栏 slide view

现在很多的APP中都有slide view&#xff0c;左右滑动出现侧边菜单栏的功能&#xff0c;Weico这个应用就有。网上有很多第三方的类库实现了这种效果&#xff0c;其实自己代码写的话也是很简单的&#xff0c;下面我将介绍两种方法实现slide view。---- 一种是用第三方类库IIViewD…

MFC中如何给对话框添加背景图片

定位到 void CXXXDlg::OnPaint()&#xff0c;在if()...else()中的else()下添加如下代码&#xff1a; else { //CDialog::OnPaint();//要禁止这个调用 CPaintDC dc(this); CRect rect; GetClientRect(&rect); CDC dcMem; dcMem.CreateCompatibleDC(&am…

孙正义万字访谈:AI是我现在唯一关注的事情,我是科技的绝对信徒

来源&#xff1a;腾讯科技科技变革丝毫没有减速&#xff0c;自动化就是科技的终极使命&#xff01;这是孙正义在最新采访中再次强调的理念。在接受CNBC超长采访中&#xff0c;软银创始人、千亿美元愿景基金掌舵者一再表示&#xff0c;AI能解决人类无法解决的问题&#xff0c;未…

Oracle 直方图理论

一.何为直方图 直方图是一种几何形图表&#xff0c;它是根据从生产过程中收集来的质量数据分布情况&#xff0c;画成以组距为底边、以频数为高度的一系列连接起来的直方型矩形图&#xff0c;如图所示 二.ORACLE 直方图 在Oracle中直方图是一种对数据分布情况进行描述的工具。它…

怎样把MySQL的编码方式改为utf8?

一、当我们安装好MySQL后&#xff0c;单击电脑开始&#xff0c;然后运行cmd&#xff0c;记得必须要用管理员的身份运行。然后输入net start mysql 前面操作如果忘记采用管理员身份运行的话&#xff0c;会出现系统访问错误。 二、修改MySQL的编码方式为utf8 1、找到默认MySQL的安…

strcpy_s与strcpy的比較

strcpy_s和strcpy()函数的功能差点儿是一样的。strcpy函数&#xff0c;就象gets函数一样&#xff0c;它没有方法来保证有效的缓冲区尺寸&#xff0c;所以它仅仅能假定缓冲足够大来容纳要拷贝的字符串。在程序执行时&#xff0c;这将导致不可预料的行为。用strcpy_s就能够避免这…

要更有钱、更烧钱,OpenAI 重组,加速融资之路

来源&#xff1a;AI 科技评论OpenAI 是一个非盈利性的 AI 组织&#xff0c;他们雇佣了许多一流的研究和开发人员&#xff0c;在机器学习理论和深度学习应用方面多有诸多成果&#xff0c;我们曾经报道过的许多强化学习连续控制成果、5v5 DOTA AI「OpenAI Five」、自动生成人类水…

MFC基于单文档制作吹彩色泡泡程序

1、代码如下&#xff1a; // 吹彩色泡泡Doc.h : interface of the CMyDoc class // /#if !defined(AFX_DOC_H__559CF0A7_41F7_48A5_A356_774764C0E60F__INCLUDED_) #define AFX_DOC_H__559CF0A7_41F7_48A5_A356_774764C0E60F__INCLUDED_#if _MSC_VER > 1000 #pragma once #e…

centos设置开机自启动

在CentOS系统下&#xff0c;主要有两种方法设置自己安装的程序开机启动。 1、把启动程序的命令添加到/etc/rc.d/rc.local文件中&#xff0c;比如下面的是设置开机启动httpd。 复制代码#!/bin/sh # # This script will be executed *after* all the other init scripts. # You c…

MFC制作贪吃蛇教程详解

写在前面的话 本次贪吃蛇教程主要知识点包括以下几个方面 1 CView类中的消息响应 2 控件的消息响应 3 基于CView类内的具体游戏实现 4 数组 5 游戏图形的实现用CDC类实现。 本版游戏的具体实现是在CViewl类中实现&#xff0c;所以其他…

人们对社会与金钱奖赏的预期共享神经环路

来源&#xff1a;神经科技摘要&#xff1a;在日常生活中&#xff0c;作为多种多样的目标导向行为的诱因&#xff0c;社会性奖赏与物质性奖赏扮演着同样重要的角色。2019年2月23日&#xff0c;国际神经科学杂志《Neuroscience & Biobehavioral Reviews》(影响因子&#xff1…

埃塞俄比亚空难,人机控制权争夺后的悲剧

来源&#xff1a;姬扬科学网博客2019年3月10日&#xff0c;埃塞俄比亚航空客机起飞后6分钟突然坠毁&#xff0c;机上157人死难、无人生还&#xff0c;包括8名来自中国大陆的旅客。这次失事的飞机是刚投入使用不久的波音737-MAX8&#xff0c;与去年十月份印度尼西亚航空失事的飞…

四则运算2任务完成表

姓名&#xff1a;郭庆樑 日期&#xff1a;3/10/2015 任务 日期 听课 编写程序 阅读课本 准备考试 日总计 周二 300 300 周三 100 80 180 …

MFC制作员工信息管理系统

1.在MFC中建立如下的对话框。 2.修改相关控件的ID如下&#xff1a; 添加按钮的ID为&#xff1a;IDC_ADD,删除按钮的ID为&#xff1a;IDC_DEL&#xff0c;修改按钮的ID为&#xff1a;IDC_MOD。 三个编辑框的ID分别为&#xff1a;IDC_NUMB,IDC_NAME,IDC_SALA。列表控件的ID为&a…

中国AI创新者论坛将于3月21日在清华大学举办

来源&#xff1a;网易智能创新者是如何改变世界的&#xff1f;史蒂夫乔布斯生前在苹果产品发布会上&#xff0c;经常会用同一张幻灯片作为总结&#xff0c;在他身后的大屏幕上会出现一个路标&#xff0c;上面标示着“技术”&#xff08;Technology&#xff09;和“人文”&#…

MemoryInjector 无痕注入

最近写的一个内存注入&#xff1a;注入目标模块到目标进程中&#xff0c;并使用内存peloader的方式运行注入的模块。在模块运行时&#xff0c;在目标进程空间内只能看到image类型的内存&#xff0c;几乎隐身无痕 下载地址转载于:https://www.cnblogs.com/kkindof/p/4344852.htm…

MFC中单选按钮的特点总结

一、单选按钮的使用特点总结如下&#xff1a; 1. 每一组单选按钮都必须而且只能有一个组长。 2. 组长就是指选择了Group属性的控件。 3. 一组单选按钮中只有组长的ID是有用的&#xff0c;其他组员的ID是随 机生成即可。 4. 通过类向导建立关联变量时&#…

边缘计算:5G 时代的万亿市场

来源&#xff1a;安信证券摘要&#xff1a;边缘计算将能力从云端下沉至边缘&#xff0c;有效支撑对时延等指标要求较高的城市、交通、家居、制造等场景应用落地&#xff0c;带来边缘节点、服务商两个核心增量机遇。▌边缘计算&#xff0c;5G时代的万亿市场边缘计算成为物理世界…

Modelsim仿真tcl脚本与wave.do文件

Modelsim的仿真&#xff0c;如果一直使用图形界面建工程&#xff0c;编译&#xff0c;仿真&#xff0c;一个个加入观察波形的话&#xff0c;未免复杂了一些&#xff0c;尤其是当工程较大&#xff0c;需要观察的信号较多时&#xff0c;下面贴出一些常用的tcl脚本命令和wave.do常…