mfc使用Slider控件控制系统的音量

之前想实现这个功能,找了很多资料,全都不给力,最后发现Microsoft给的那才是可以用的,总的来说就是使用mixer api来打开混音器设备、获得音频线路信息、然后设定属性。实现这个之后,就可以用在你写的程序比如播放器上面啦。

 

总共就下面几个函数:

通过这9个API,我们就可以来控制音频的输入和输出设备了,其实有关这几个函数的定义你可以在C:/Program Files/Microsoft Visual Studio/VC98/Include/mmsystem.h文件中找到。下面我简单介绍一下这几个函数,详细地介绍你可以参见msdn。

  mixerOpen和mixerClose函数用来打开和关闭混音器设备

  mixerGetNumDevs可以确定系统中有多少混音器设备

  mixerGetDevCaps函数可以确定混音器设备的能力

  mixerGetLineInfo可以检索指定音频线路的信息

  mixerGetLineControls用于检索一个或者多个与音频线路相关的控制的通用信息

  mixerGetControlDetails用于检索与某个音频线路相关的一个控制的属性

  mixerSetControlDetails用于设置制定控制的属性。

 

对话框工程(工程->设置->链接 添加winmm.lib,头文件包含mmsystem.h),添加一个slider控件,关联control变量m_volume

我把那个滑块设为了垂直样式,仿右下角那个小喇叭的风格:)

但是这样一来我发现一个问题,垂直样式默认刻度是上边小下边大,而我想实现的是下边为0刻度,上面为最大值,google一下无解决方案。

csdn就是智慧无穷,我被鄙视了。。。kemee童鞋说“..... 我是自己再做个运算的....比如0~100,不管什么数据要在控件上显示了,就和100先做个运算,再设置,这样0就显示100,100的时候就显示0了。。”,就是这么无须解释,我承认我脑袋很锈

给CSliderDlg添加成员变量:

 

MIXERCONTROLDETAILS_SIGNED volStruct;

MIXERCONTROLDETAILS mxcd;

MIXERLINECONTROLS mxlc;

MIXERLINE mxl;

MIXERCONTROL mxc;

HMIXER m_hmx;

 

 

在OnInitDialog中添加一下代码

 

// TODO: Add extra initialization here unsigned long err; CString str; err = mixerOpen(&m_hmx,0,0,0,0); if(err) { MessageBox("ERROR:Can't open Mixer Device!"); } //初始化MIXERLINE结构体 ZeroMemory(&mxl,sizeof(mxl)); mxl.cbStruct = sizeof(mxl); // 指出需要获取的通道,扬声器用MIXERLINE_COMPONENTTYPE_DST_SPEAKERS mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS; if(mixerGetLineInfo((HMIXEROBJ)m_hmx,&mxl, MIXER_GETLINEINFOF_COMPONENTTYPE)) { MessageBox("Couldn't get the mixer line!"); } // 取得控制器. ZeroMemory(&mxlc, sizeof(mxlc)); mxlc.cbStruct = sizeof(mxlc); mxlc.dwLineID = mxl.dwLineID; mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME; mxlc.cControls =1; mxlc.cbmxctrl = sizeof(mxc); mxlc.pamxctrl = &mxc; ZeroMemory(&mxc, sizeof(mxc)); mxc.cbStruct = sizeof(mxc); if(mixerGetLineControls((HMIXEROBJ)m_hmx,&mxlc, MIXER_GETLINECONTROLSF_ONEBYTYPE)) { MessageBox("取得控制器失败!"); } // 获取控制器中的值的音量范围:mxc.Bounds.lMinimum到mxc.Bounds.lMaximum. // 初始化MIXERCONTROLDETAILS结构体 ZeroMemory(&mxcd, sizeof(mxcd)); mxcd.cbStruct = sizeof(mxcd); mxcd.cbDetails = sizeof(volStruct); mxcd.dwControlID = mxc.dwControlID; mxcd.paDetails = &volStruct; mxcd.cChannels = 1; // 获得音量值 if(mixerGetControlDetails((HMIXEROBJ)m_hmx, &mxcd, MIXER_GETCONTROLDETAILSF_VALUE)) { MessageBox("无法获得音量"); } //str.Format("%d %d %d",mxc.Bounds.dwMinimum,mxc.Bounds.dwMaximum,volStruct.lValue); //MessageBox(str); /*unsigned long mixerID; err = mixerGetID((struct HMIXEROBJ__ *)m_hmx, (unsigned int *)&mixerID, MIXER_OBJECTF_HMIXER); if (err) { MessageBox("ERROR: Can't get Mixer Device ID!"); } else { str.Format("Mixer Device ID = %d/n", mixerID); MessageBox(str); } MIXERCAPS mixcaps; unsigned long iNumDevs, i; // 获取系统中混音器设备个数 iNumDevs = mixerGetNumDevs(); // 遍历所有的混音器并显示它们的ID和名称 for (i = 0; i < iNumDevs; i++) { // 获取下一个混音器设备的信息 if (!mixerGetDevCaps(i, &mixcaps, sizeof(MIXERCAPS))) { // 显示ID和名称 str.Format("Device ID #%u: %s/r/n", i, mixcaps.szPname); MessageBox(str); } }*/ m_volume.SetRange(mxc.Bounds.dwMinimum,mxc.Bounds.dwMaximum); m_volume.SetPos(mxc.Bounds.dwMaximum - volStruct.lValue); 

 

然后在OnVScroll中(注意,是OnVScroll,不是OnHScroll,因为控件是垂直样式的!)

void CSliderDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) { // TODO: Add your message handler code here and/or call default if((CWnd*)pScrollBar == (CWnd*)&m_volume) { int pos = mxc.Bounds.dwMaximum - m_volume.GetPos(); CString str; str.Format("%d",pos); //MessageBox(str); volStruct.lValue = pos; //想要设置的值 mixerSetControlDetails((HMIXEROBJ)m_hmx, &mxcd, MIXER_SETCONTROLDETAILSF_VALUE); } CDialog::OnVScroll(nSBCode, nPos, pScrollBar); } 

成功,运行试一下吧!

 

 

你可能感兴趣的:(api,struct,Microsoft,mfc,DST,initialization)