网站技能培训,公章电子版在线制作,一流的聊城做网站公司,建网站的方案运行界面效果#xff1a; 需要布置的界面#xff1a; 1、新建MFC应用程序#xff0c;工程名称Mplayer#xff0c;选择基于对话框#xff0c;点击完成。
2、选择工具箱中的对话框编辑器#xff0c;被选择的编辑器修改其ID及名称。 歌曲名称后面的编辑框#xff1a;IDC_f…运行界面效果 需要布置的界面 1、新建MFC应用程序工程名称Mplayer选择基于对话框点击完成。
2、选择工具箱中的对话框编辑器被选择的编辑器修改其ID及名称。 歌曲名称后面的编辑框IDC_filename 浏览按钮IDC_filechoice 播放按钮IDC_play 暂停按钮IDC_pause 停止按钮IDC_stop 音量调节里面的编辑框IDC_volume 音量滑动条IDC_SLIDER1 版本说明按钮IDC_about 退出按钮IDC_exitbtn 3、部分编辑器需要添加消息处理函数。
选择浏览、播放、暂停、停止、版本说明、退出等按钮点击右键选择类向导直接添加对应的消息处理函数。如下
3.1浏览Onfilechoice void CMplayerDlg::Onfilechoice()
{// TODO: 在此添加控件通知处理程序代码// TODO: 在此添加控件通知处理程序代码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);}
} 3.2、播放Onplay void CMplayerDlg::Onplay()
{// TODO: 在此添加控件通知处理程序代码play();SetDlgItemText(IDC_pause, 暂停);
}
3.3、暂停Onpause void CMplayerDlg::Onpause()
{// TODO: 在此添加控件通知处理程序代码CString strtemp;GetDlgItemText(IDC_pause, strtemp);//获取按钮状态 if (strtemp.Compare(暂停) 0){pause();SetDlgItemText(IDC_pause, 恢复);}if (strtemp.Compare(恢复) 0){resume();SetDlgItemText(IDC_pause, 暂停);}
} 3.4、停止Onstop void CMplayerDlg::Onstop()
{// TODO: 在此添加控件通知处理程序代码stop();SetDlgItemText(IDC_pause, 暂停);GetDlgItem(IDC_play)-EnableWindow(false);//当stop按钮按下时,播放和暂停应该均不可用 GetDlgItem(IDC_pause)-EnableWindow(false);
}
3.5、版本说明Onabout void CMplayerDlg::Onabout()
{// TODO: 在此添加控件通知处理程序代码CAboutDlg dlg;dlg.DoModal();
}
3.6、退出Onexitbt void CMplayerDlg::Onexitbt()
{// TODO: 在此添加控件通知处理程序代码CDialogEx::OnCancel();
}
3.7、为滑动块IDC_SLIDER1添加CSliderCtrl类型的控件变量m_slider。
设置滑动块的滑动范围和初始位置并在编辑框中显示初始位置那么需要修改CMplayerDlg::OnInitDialog()函数为 BOOL CMplayerDlg::OnInitDialog()
{CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX 0xFFF0) IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX 0xF000);CMenu* pSysMenu GetSystemMenu(FALSE);if (pSysMenu ! NULL){BOOL bNameValid;CString strAboutMenu;bNameValid strAboutMenu.LoadString(IDS_ABOUTBOX);ASSERT(bNameValid);if (!strAboutMenu.IsEmpty()){pSysMenu-AppendMenu(MF_SEPARATOR);pSysMenu-AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);}}// 设置此对话框的图标。 当应用程序主窗口不是对话框时框架将自动// 执行此操作SetIcon(m_hIcon, TRUE); // 设置大图标SetIcon(m_hIcon, FALSE); // 设置小图标// TODO: 在此添加额外的初始化代码m_slider.SetRange(0, 1000);// 设置水平滚动条的初始位置为200 m_slider.SetPos(200);// 在编辑框中显示200 SetDlgItemInt(IDC_volume, 200);return TRUE; // 除非将焦点设置到控件否则返回 TRUE
} 3.8、 现在滚动条还不能正常滚动并且编辑框中数字也不随滚动改变。根据上面所讲我们可以重载CMplayerDlg类的OnHScroll函数。具体操作为在CMplayerDlg类的属性页面的工具栏上点“Messages”按钮找到WM_HSCROLL消息添加响应函数就可以了。OnHScroll函数重写后如下 void CMplayerDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{// TODO: 在此添加消息处理程序代码和/或调用默认值int pos m_slider.GetPos(); // 获取水平滚动条当前位置 switch (nSBCode){// 如果向左滚动一列则pos减1 case SB_LINELEFT:pos - 1;break;// 如果向右滚动一列则pos加1 case SB_LINERIGHT:pos 1;break;// 如果向左滚动一页则pos减10 case SB_PAGELEFT:pos - 10;break;// 如果向右滚动一页则pos加10 case SB_PAGERIGHT:pos 10;break;// 如果滚动到最左端则pos为1 case SB_LEFT:pos 1;break;// 如果滚动到最右端则pos为100 case SB_RIGHT:pos 100;break;// 如果拖动滚动块滚动到指定位置则pos赋值为nPos的值 case SB_THUMBPOSITION:pos nPos;break;// 下面的m_horiScrollbar.SetScrollPos(pos);执行时会第二次进入此函数最终确定滚动块位置并且会直接到default分支所以在此处设置编辑框中显示数值 default:SetDlgItemInt(IDC_volume, pos);return;}// 设置滚动块位置 m_slider.SetPos(pos);setvolume(pos);CDialogEx::OnHScroll(nSBCode, nPos, pScrollBar);
}4、文件加载及音乐播放设置等 //定义三个全局变量
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.dwCallback (DWORD_PTR)GetSafeHwnd()*/;setvolume.dwValue vol;//音量值是vol mciSendCommand(DeviceID, MCI_SETAUDIO, MCI_DGV_SETAUDIO_ITEM | MCI_DGV_SETAUDIO_VALUE, (DWORD)(LPVOID)setvolume);return 0;
}
5、界面背景设置 选择一张16色或256色的bmp格式的图片将其导入资源视图下的.rc文件下在CMplayerDlg::OnPaint()修改为如下 void CMplayerDlg::OnPaint()
{if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_castWPARAM(dc.GetSafeHdc()), 0);// 使图标在工作区矩形中居中int 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;// 绘制图标dc.DrawIcon(x, y, m_hIcon);}else{//CDialogEx::OnPaint();CPaintDC dc(this);CRect rect;GetClientRect(rect);CDC dcMem;dcMem.CreateCompatibleDC(dc);CBitmap bmpBackground;bmpBackground.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP自己导入位图的ID BITMAP 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);}
} 接下来运行程序对于以韩文开头的歌曲名识别不出。 编译运行中出现的错误
1、 错误 1 error LNK2001: 无法解析的外部符号 public: void __thiscall CSketcherView::OnColorBlack(void) (?OnColorBlackCSketcherViewQAEXXZ) SketcherView.obj 错误 2 fatal error LNK1120: 1 个无法解析的外部命令 错误分析: 在封装的头文件中定义了一个public: afx_msg void OnColorBlack(); 然而在封装的源文件中未定义 可选择直接注释或者
在cpp源文件中定义
void CSketcherView::OnColorBlack() { // TODO: 在此添加命令处理程序代码 }
2、对话框背景导入需要bmp格式的16色或256色图
不能是24位图可通过画图软件转化。 3、编辑MFC代码时会出现如下错误 error MSB8031: Building an MFC project for a non-Unicode character set is deprecated. You must change the project property to Unicode or download an additional library. Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped 下载vc_mbcsmfc软件运行即可。 4、m_hIcon AfxGetApp()-LoadIcon(IDR_MAINFRAME);中 IDR_MAINFRAME出错。 在该函数函数第一句加上AFX_MANAGE_STATE(AfxGetStaticModuleState()); 5、IntelliSense: const char * 类型的实参与 LPCTSTR 类型的形参不兼容 解决方法 菜单 项目 - 属性 打开属性页 - 配置属性 - 常规 - 字符集 单前选中的应该是“使用Unicode字符集”改为“使用多字节字符集” 6、MFC 点击按钮弹出另一个对话框 void COnclickDlg::OnBnClickedOk()//第一种 { CMyNewDlg Dlg; Dlg.DoModal(); } 或 void COnclickDlg::OnBnClickedOk() //第二种 CMyNewDlg *dlgnew CMyNewDlg; dlg-Create(IDD_DIALOG1,this); //第一个参数是对话框ID号 dlg-ShowWindow(SW_SHOW); 或者 void COnclickDlg::OnBnClickedOk() m_DemoDlg1.ShowWindow(SW_SHOW); //第三种 //需要在主体函数初始化里加上 m_DemoDlg1.Create(IDD_DIALOG1, this); } 7、error C2065: “IDR_MAINFRAME”: 未声明的标识 这个怎么解决
应该是图片资源删除了从新添加一个.ioc的资源并把ID改为 IDR_MAINFRAME 即可 8、Debug Assertion Failed! Program: C:\Windows\system32\mfc120ud.dll File: f:\dd\vctools\vc7libs\ship\atlmfc\include\atlsimpstr.h Line: 490 Expression: (iChar 0) (iChar GetLength()) For information on how your program can cause an assertion failure, see the Visual C documentation on asserts. (Press Retry to debug the application) 出现这样的情况使用release调试。 Debug为调试版本包含调试信息并且不做任何优化是程序员用来调试程序的。其运行必须在有开发环境下运行。 Release为发布版本是的程序代码大小和运行速度上是最优的一遍用户很好的使用。 一般情况下我们需要在debug条件下编写程序并进行调试OK然后使用Release版本来生成exe给其他人使用。 参考 滚动条控件Scroll Bar显示在编辑框中点击打开链接 mfc使用Slider控件控制系统的音量点击打开链接
MFC入门-MCI简单音乐播放器实现
点击打开链接 http://www.cnblogs.com/xiaoweiwangwang/p/4111622.html
代码参考http://blog.csdn.net/ywxk1314/article/details/51273272