请问大家要怎样才能设置系统的声音大小,左右声道呢?是使用MCI函数嘛???
解决方案 »
- listctrl宽度太宽以至于显示不全
- 不懂!!
- 怎么增加View类(基于对话框的MFC运用程序)
- 关于给DLL减肥的问题?
- 用如上方式画图,为什么画出来的图位置分别往左和往下偏移了16个像素??
- 100分修改错误://unresolved external symbol _WinMain@16 referenced
- 系统分析员考试怎么复习啊!各位大侠指教一下,多谢!
- 如何解决这个错误:"Abstract Error"
- 用TEXTOUT输出1串字符,怎么确定当前的位置,接着刚才输出的字符后接着输出
- 关于消息响应函数添加
- wise installer 如何修改环境变量的值呀?
- 请问Create和WM_CREATE有什么区别
控制大小:
BOOL CVolumeDlg::amdInitialize()
{
// get the number of mixer devices present in the system
m_nNumMixers = ::mixerGetNumDevs(); m_hMixer = NULL;
::ZeroMemory(&m_mxcaps, sizeof(MIXERCAPS)); // open the first mixer
// A "mapper" for audio mixer devices does not currently exist.
if (m_nNumMixers != 0)
{
if (::mixerOpen(&m_hMixer,
0,
(DWORD)this->GetSafeHwnd(),
NULL,
MIXER_OBJECTF_MIXER | CALLBACK_WINDOW)
!= MMSYSERR_NOERROR)
return FALSE; if (::mixerGetDevCaps((UINT)m_hMixer, &m_mxcaps, sizeof(MIXERCAPS))
!= MMSYSERR_NOERROR)
return FALSE;
} return TRUE;
}BOOL CVolumeDlg::amdUninitialize()
{
BOOL bSucc = TRUE; if (m_hMixer != NULL)
{
bSucc = ::mixerClose(m_hMixer) == MMSYSERR_NOERROR;
m_hMixer = NULL;
} return bSucc;
}BOOL CVolumeDlg::amdGetMasterVolumeControl()
{
m_strDstLineName.Empty();
m_strVolumeControlName.Empty(); if (m_hMixer == NULL)
return FALSE; // get dwLineID
MIXERLINE mxl;
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
if (::mixerGetLineInfo((HMIXEROBJ)m_hMixer,
&mxl,
MIXER_OBJECTF_HMIXER |
MIXER_GETLINEINFOF_COMPONENTTYPE)
!= MMSYSERR_NOERROR)
return FALSE; // get dwControlID
MIXERCONTROL mxc;
MIXERLINECONTROLS mxlc;
mxlc.cbStruct = sizeof(MIXERLINECONTROLS);
mxlc.dwLineID = mxl.dwLineID;
mxlc.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
mxlc.cControls = 1;
mxlc.cbmxctrl = sizeof(MIXERCONTROL);
mxlc.pamxctrl = &mxc;
if (::mixerGetLineControls((HMIXEROBJ)m_hMixer,
&mxlc,
MIXER_OBJECTF_HMIXER |
MIXER_GETLINECONTROLSF_ONEBYTYPE)
!= MMSYSERR_NOERROR)
return FALSE; // record dwControlID
m_strDstLineName = mxl.szName;
m_strVolumeControlName = mxc.szName;
m_dwMinimum = mxc.Bounds.dwMinimum;
m_dwMaximum = mxc.Bounds.dwMaximum;
m_dwVolumeControlID = mxc.dwControlID; return TRUE;
}BOOL CVolumeDlg::amdGetMasterVolumeValue(DWORD &dwVal) const
{
if (m_hMixer == NULL ||
m_strDstLineName.IsEmpty() || m_strVolumeControlName.IsEmpty())
return FALSE; MIXERCONTROLDETAILS_UNSIGNED mxcdVolume;
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = m_dwVolumeControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;
if (::mixerGetControlDetails((HMIXEROBJ)m_hMixer,
&mxcd,
MIXER_OBJECTF_HMIXER |
MIXER_GETCONTROLDETAILSF_VALUE)
!= MMSYSERR_NOERROR)
return FALSE;
dwVal = mxcdVolume.dwValue; return TRUE;
}BOOL CVolumeDlg::amdSetMasterVolumeValue(DWORD dwVal) const
{
if (m_hMixer == NULL ||
m_strDstLineName.IsEmpty() || m_strVolumeControlName.IsEmpty())
return FALSE; MIXERCONTROLDETAILS_UNSIGNED mxcdVolume = { dwVal };
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = m_dwVolumeControlID;
mxcd.cChannels = 1;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_UNSIGNED);
mxcd.paDetails = &mxcdVolume;
if (::mixerSetControlDetails((HMIXEROBJ)m_hMixer,
&mxcd,
MIXER_OBJECTF_HMIXER |
MIXER_SETCONTROLDETAILSF_VALUE)
!= MMSYSERR_NOERROR)
return FALSE;
return TRUE;
}
调节平衡:
int CMixerFader::Init( DWORD DstType, DWORD SrcType, DWORD ControlType, int subType )
{
if ( m_hWnd == NULL )
{
PrintMessage( "CMixerFader::Init", "No Window attached. Did you create or subclass one?" );
return 0;
} EnableWindow( FALSE ); if( subType == BALANCE )
{
int min, max;
GetRange( min, max );
SetSliderPos( ( max - min )/2 );
} // start by checking the type and subtypes if( ( ControlType & MIXERCONTROL_CT_CLASS_MASK ) != MIXERCONTROL_CT_CLASS_FADER )
{
PrintMessage( "CMixerFader::Init",
"Wrong control type for a fader control: %s",
GetControlTypeString( ControlType ) );
return 0;
}
if( subType < LEFT || subType > BALANCE )
{
PrintMessage( "CMixerFader::Init", "Wrong sub-type for a fader control: %d", subType );
return 0;
} m_subType = subType; if( CMixerBase::Init( DstType, SrcType, ControlType, m_hWnd ) == 0 )
return 0; // set the slider range and number of steps from the information obtained
// on the mixer control
m_FaderSpan = m_Control.Bounds.dwMaximum - m_Control.Bounds.dwMinimum;
m_FaderStep = m_FaderSpan/m_Control.Metrics.cSteps;
m_SliderSpan = m_Control.Metrics.cSteps;
SetRange( 0, m_SliderSpan ); if( m_nChannels < 2 )
{
// a balance, left, or right control on a single channel line doesn't make sense
// abort and set the balance slider to mid-course
if( m_subType == LEFT || m_subType == RIGHT || m_subType == BALANCE )
{
PrintMessage( "CMixerFader::Init",
"Only one channel available on this line. Use Fader type MAIN only.\n"
"Windows control will be disabled.\n"
"\nItem: %s.\n"
"\n( Line: %s )",
GetControlName(),
GetLineName() ); if( subType == BALANCE )
SetSliderPos( m_SliderSpan/2 );
CloseMixer();
return 0;
}
} m_Value = (MIXERCONTROLDETAILS_UNSIGNED *)GetValuePtr();
if( m_Value == NULL )
{
PrintMessage( "CMixerFader::Init", "m_Value NULL." );
CloseMixer();
return 0;
} if( GetMixerControlValue() )
{
EnableWindow( TRUE );
SetHVSliderPos();
} return 1;
}
void CMixerFader::SetHVSliderPos()
{
float MaxVal; if( m_nChannels > 1 )
{
MaxVal = ( float )max( m_Value[RIGHT].dwValue, m_Value[LEFT].dwValue );
if( MaxVal > 0 )
{
m_DeltaOverMax = ( ( float )m_Value[RIGHT].dwValue - ( float )m_Value[LEFT].dwValue )/MaxVal;
}
}
else
{
MaxVal = ( float )m_Value[0].dwValue;
}
switch ( m_subType )
{
case MAIN: // set the main fader to the maximum value
SetSliderPos( int( MaxVal/m_FaderStep ) );
break; case BALANCE: // pos = m_SliderSpan/2 * ( delta/ max + 1 )
if( MaxVal > 0 )
{
SetSliderPos( int( m_SliderSpan*( m_DeltaOverMax + 1.0 )/2.0 ) );
}
break; case LEFT: // only set the left channel slider
SetSliderPos( int( ( float )m_Value[LEFT].dwValue/m_FaderStep ) );
break; case RIGHT: // only set the right channel slider
SetSliderPos( int( ( float )m_Value[RIGHT].dwValue/m_FaderStep ) );
break; default:
PrintMessage( "CMixerFader::SetHVSliderPos", "Wrong sub-type for a fader control." );
}
}
void CMixerFader::SetFaderValue()
{
DWORD newVal = GetSliderValue();
float MaxVal; if( m_nChannels > 1 )
{
MaxVal = ( float )max( m_Value[RIGHT].dwValue, m_Value[LEFT].dwValue );
}
else
{
MaxVal = ( float )m_Value[0].dwValue;
} switch ( m_subType )
{
case MAIN:
if( m_nChannels > 1 )
{
if( m_DeltaOverMax > 0 )
{
m_Value[RIGHT].dwValue = newVal;
m_Value[LEFT].dwValue = DWORD( newVal*( 1.0f - m_DeltaOverMax ) );
}
else
{
m_Value[LEFT].dwValue = newVal;
m_Value[RIGHT].dwValue = DWORD( newVal*( 1.0f + m_DeltaOverMax ) );
}
}
else
{
m_Value[0].dwValue = newVal;
}
break; case BALANCE:
if( ( int )newVal > m_FaderSpan/2 )
{
m_Value[RIGHT].dwValue = DWORD( MaxVal );
m_Value[LEFT].dwValue = DWORD( 2*MaxVal*( 1.0 - ( float )newVal/m_FaderSpan ) );
}
else
{
m_Value[RIGHT].dwValue = DWORD( 2*MaxVal*( float )newVal/m_FaderSpan );
m_Value[LEFT].dwValue = DWORD( MaxVal );
}
break; case LEFT:
m_Value[LEFT].dwValue = newVal;
break; case RIGHT:
m_Value[RIGHT].dwValue = newVal;
break; default:
PrintMessage( "CMixerFader::SetFaderValue", "Wrong sub-type for a fader control." );
return;
}
SetMixerControlValue();
}
//mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
// Name : GetSliderValue
//
// Descr. : gets the current slider position. The value returned depends on the orientation
// of the slider.
//
// Return : DWORD value corresponding to slider position
//-----------------------------------------------------------------------------
DWORD CMixerFader::GetSliderValue()
{
if( ( GetStyle( ) & TBS_VERT ) == TBS_VERT )
{
return ( ( m_SliderSpan - GetPos() ) * m_FaderStep );
}
else
{
return ( GetPos() * m_FaderStep );
}
}
{
UINT id = ( UINT )message; if( id == m_Control.dwControlID && m_HMixer == ( HMIXER )hMix )
{
if( GetMixerControlValue() )
{
SetHVSliderPos();
}
else
{
TRACE( "CMixerFader::OnMixerControlChanged --- error\n" );
}
} return 0L;
}void CMixerFader::HScroll ( UINT nSBCode, UINT /*nPos*/ )
{
if( m_Value == NULL )
{
PrintMessage( "CMixerFader::HScroll", "Error: Did you call Init() first?" );
return;
}
if( nSBCode == TB_THUMBTRACK || nSBCode == TB_ENDTRACK || nSBCode == TB_PAGEDOWN || nSBCode == TB_PAGEUP )
{
SetFaderValue();
}
}
void CMixerFader::VScroll ( UINT nSBCode, UINT /*nPos*/ )
{
if( m_Value == NULL )
{
PrintMessage( "CMixerFader::VScroll", "Error: Did you call Init() first?" );
return;
} if( nSBCode == TB_THUMBTRACK || nSBCode == TB_ENDTRACK || nSBCode == TB_PAGEDOWN || nSBCode == TB_PAGEUP )
{
SetFaderValue();
}
}
void CMixerFader::SetSliderPos( int value )
{
if( ( GetStyle( ) & TBS_VERT ) == TBS_VERT )
{
SetPos( m_SliderSpan - value );
}
else
{
SetPos( value );
}
}
void CMixerFader::OnDestroy()
{
CloseMixer();
CSliderCtrl ::OnDestroy();
}
信箱?我给你发这方面整套详尽代码。
[email protected]
谢谢