advancedlg.cpp

来自「Visual C++编写的虚拟环绕声系统」· C++ 代码 · 共 2,022 行 · 第 1/5 页

CPP
2,022
字号
			this,
			ID_CDTRACK12_BUTTON
			);

		// 绘制 CD 窗口中的 Track13 按钮
		CDTrackButton.left  =CDTrackButton.right;
		CDTrackButton.right =CDTrackButton.left+TrackButtonWidth;
		CDTrack13.Create
			(
			"13",
			WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_PUSHBUTTON,
			CDTrackButton,
			this,
			ID_CDTRACK13_BUTTON
			);

		// 绘制 CD 窗口中的 Track14 按钮
		CDTrackButton.left  =CDTrackButton.right;
		CDTrackButton.right =CDTrackButton.left+TrackButtonWidth;
		CDTrack14.Create
			(
			"14",
			WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_PUSHBUTTON,
			CDTrackButton,
			this,
			ID_CDTRACK14_BUTTON
			);

		// 绘制 CD 窗口中的 Track15 按钮
		CDTrackButton.left  =CDTrackButton.right;
		CDTrackButton.right =CDTrackButton.left+TrackButtonWidth;
		CDTrack15.Create
			(
			"15",
			WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_PUSHBUTTON,
			CDTrackButton,
			this,
			ID_CDTRACK15_BUTTON
			);

		// 绘制各个 静态文本(CStatic)说明框
		CRect CDStaticBox;

		// 绘制 CD 窗口中的 TrackStatic 静态文本说明框
		CDStaticBox.left  =CDWndRect.left+CDControlButtonWidth/2;
		CDStaticBox.top   =CDWndRect.top+CDWndRect.Height()/5;
		CDStaticBox.right =CDStaticBox.left+CDControlButtonWidth;
		CDStaticBox.bottom=CDStaticBox.top+CDControlButtonHeight;
		CDTrackStatic.Create
			(
			"Track",
			WS_CHILD|WS_VISIBLE,
			CDStaticBox,
			this,
			ID_CDTRACK_STATIC
			);

		// 绘制 CD 窗口中的 TrackCounter 静态文本说明框
		CDStaticBox.left +=CDControlButtonWidth;
		CDStaticBox.right =CDStaticBox.left+CDControlButtonWidth;
		CDTrackCounter.Create
			(
			"1",
			WS_CHILD|WS_VISIBLE|SS_LEFTNOWORDWRAP,
			CDStaticBox,
			this,
			ID_CDTRACKCOUNTER_STATIC
			);

		// 绘制 CD 窗口中的 MinuteStatic 静态文本说明框
		CDStaticBox.left +=CDControlButtonWidth;
		CDStaticBox.right =CDStaticBox.left+CDControlButtonWidth;
		CDMinuteStatic.Create
			(
			"Minute",
			WS_CHILD|WS_VISIBLE,
			CDStaticBox,
			this,
			ID_CDMINUTE_STATIC
			);

		// 绘制 CD 窗口中的 MinuteCounter 静态文本说明框
		CDStaticBox.left +=CDControlButtonWidth;
		CDStaticBox.right =CDStaticBox.left+CDControlButtonWidth;
		CDMinuteCounter.Create
			(
			"0",
			WS_CHILD|WS_VISIBLE|SS_LEFTNOWORDWRAP,
			CDStaticBox,
			this,
			ID_CDMINUTECOUNTER_STATIC
			);

		// 绘制 CD 窗口中的 SecondStatic 静态文本说明框
		CDStaticBox.left +=CDControlButtonWidth;
		CDStaticBox.right =CDStaticBox.left+CDControlButtonWidth;
		CDSecondStatic.Create
			(
			"Second",
			WS_CHILD|WS_VISIBLE,
			CDStaticBox,
			this,
			ID_CDSECOND_STATIC
			);

		// 绘制 CD 窗口中的 Secondounter 静态文本说明框
		CDStaticBox.left +=CDControlButtonWidth;
		CDStaticBox.right =CDStaticBox.left+CDControlButtonWidth/2;
		CDSecondCounter.Create
			(
			"0",
			WS_CHILD|WS_VISIBLE|SS_LEFTNOWORDWRAP,
			CDStaticBox,
			this,
			ID_CDSECONDCOUNTER_STATIC
			);

		// 为 CD 申请工作缓冲区
		for (i=0;i<DataBufferNumber;i++)
		{
			CDDataHDR[i]=(LPWAVEHDR)GlobalAllocPtr(GMEM_MOVEABLE|GMEM_SHARE,sizeof(WAVEHDR));
			CDDataHDR[i]->lpData=(LPSTR)GlobalAllocPtr(GMEM_MOVEABLE|GMEM_SHARE,DataBufferSize);
			CDDataHDR[i]->dwBufferLength=DataBufferSize;
			CDDataHDR[i]->dwBytesRecorded=0L;
			CDDataHDR[i]->dwFlags=0L;
			CDDataHDR[i]->dwLoops=0L;
		}    

		// 设置状态为 WORKSTATE_CD
		WorkState=WORKSTATE_CD;
		// 设置 Paused 为‘未暂停’状态(FALSE)
		Paused=FALSE;
		// 设置初始Track,TotalTrack
		Track=1;
		TotalTrack=15;
		
		// 画 CD 初始界面的一幅画
		CDC pDisplayMemDC;
		CClientDC dc(this);
		pBitmap.DeleteObject(); // 清除以前加载的位图
		pBitmap.LoadBitmap(IDB_CDBEGIN_BITMAP); // 加载新的位图
		pDisplayMemDC.CreateCompatibleDC(&dc);
		pDisplayMemDC.SelectObject(&pBitmap);
		dc.BitBlt(15,10,100,90,&pDisplayMemDC,0,0,SRCCOPY);
		RedrawMyself=TRUE;

		// 声卡混音器控制
		HMIXER hMixer;
		MIXERCONTROLDETAILS_BOOLEAN     MyMixerControlDetails_f[20];
		MIXERCONTROLDETAILS_UNSIGNED    MyMixerControlDetails_u[2];
		UINT mmr;
		// 打开 Mixer
		mmr=mixerOpen
			(
			&hMixer,
			0L,
			(DWORD)m_hWnd,
			0L,
			CALLBACK_WINDOW
			);
		if (MMSYSERR_NOERROR != mmr)
		{
			MessageBox
				(
				" Unable To Open The Mixer,mixerOpen() Failed!",
				NULL,
				MB_OK|MB_ICONEXCLAMATION
				);
		}
		// 使CD的音量静音
		MyMixerControlDetails_f[0].fValue = 1;
		CDVolumeMuteControlDetails.paDetails=MyMixerControlDetails_f;
		mmr = mixerSetControlDetails
			(
			(HMIXEROBJ)hMixer,
			&CDVolumeMuteControlDetails,
			MIXER_SETCONTROLDETAILSF_VALUE
			);
		if (MMSYSERR_NOERROR != mmr)
		{
			MessageBox
				(
				" Unable To Set The Mixer.\n mixerSetControlDetails() Failed\n Program May Be Abnormal!!",
				NULL,
				MB_OK|MB_ICONEXCLAMATION
				);
		}
		// 使MIC的音量静音////恢复原有状态
		MyMixerControlDetails_f[0].fValue = 1;
		MICVolumeMuteControlDetails.paDetails=MyMixerControlDetails_f;
//		MICVolumeMuteControlDetails.paDetails=&MICVolumeMuteOldState;
		mmr = mixerSetControlDetails((HMIXEROBJ)hMixer, &MICVolumeMuteControlDetails, MIXER_SETCONTROLDETAILSF_VALUE);
		if (MMSYSERR_NOERROR != mmr)
		{
			MessageBox
				(
				" Unable To Set The Mixer.\n mixerSetControlDetails() Failed\n Program May Be Abnormal!!",
				NULL,
				MB_OK|MB_ICONEXCLAMATION
				);
		}
		// 使Line的音量静音////恢复原有状态
		MyMixerControlDetails_f[0].fValue = 1;
		LineVolumeMuteControlDetails.paDetails=MyMixerControlDetails_f;
//		LineVolumeMuteControlDetails.paDetails=&LineVolumeMuteOldState;
		mmr = mixerSetControlDetails((HMIXEROBJ)hMixer, &LineVolumeMuteControlDetails, MIXER_SETCONTROLDETAILSF_VALUE);
		if (MMSYSERR_NOERROR != mmr)
		{
			MessageBox
				(
				" Unable To Set The Mixer.\n mixerSetControlDetails() Failed\n Program May Be Abnormal!!",
				NULL,
				MB_OK|MB_ICONEXCLAMATION
				);
		}
		// 设置CD为录音声源
		for (i=0;i<20;i++)
			MyMixerControlDetails_f[i].fValue=0;
		MyMixerControlDetails_f[CDRecordItemID].fValue=1;
		RecordControlDetails.paDetails=MyMixerControlDetails_f;
		mmr = mixerSetControlDetails
			(
			(HMIXEROBJ)hMixer,
			&RecordControlDetails, 
			MIXER_SETCONTROLDETAILSF_VALUE 
			);
		if (MMSYSERR_NOERROR != mmr)
		{
			MessageBox
				(
				" Unable To Set The Mixer.\n mixerSetControlDetails() Failed\n Program May Be Abnormal!!",
				NULL,
				MB_OK|MB_ICONEXCLAMATION
				);
		}
		// 设置CD录音音量为0
		MyMixerControlDetails_u[0].dwValue=10000;
		MyMixerControlDetails_u[1].dwValue=10000;
		CDRecordVolumeControlDetails.paDetails=MyMixerControlDetails_u;
		mmr = mixerSetControlDetails
			(
			(HMIXEROBJ)hMixer,
			&CDRecordVolumeControlDetails, 
			MIXER_SETCONTROLDETAILSF_VALUE 
			);
		if (MMSYSERR_NOERROR != mmr)
		{
			MessageBox
				(
				" Unable To Set The Mixer.\n mixerSetControlDetails() Failed\n Program May Be Abnormal!!",
				NULL,
				MB_OK|MB_ICONEXCLAMATION
				);
		}
		// 恢复MIC录音的原有音量
		MICRecordVolumeControlDetails.paDetails=MICRecordVolumeOldState;
		mmr = mixerSetControlDetails
			(
			(HMIXEROBJ)hMixer,
			&MICRecordVolumeControlDetails,
			MIXER_SETCONTROLDETAILSF_VALUE 
			);
		if (MMSYSERR_NOERROR != mmr)
		{
			MessageBox
				(
				" Unable To Set The Mixer.\n mixerSetControlDetails() Failed\n Program May Be Abnormal!!",
				NULL,
				MB_OK|MB_ICONEXCLAMATION
				);
		}
		// 恢复Line录音的原有音量
		LineRecordVolumeControlDetails.paDetails=LineRecordVolumeOldState;
		mmr = mixerSetControlDetails
			(
			(HMIXEROBJ)hMixer, 
			&LineRecordVolumeControlDetails,
			MIXER_SETCONTROLDETAILSF_VALUE 
			);
		if (MMSYSERR_NOERROR != mmr)
		{
			MessageBox
				(
				" Unable To Set The Mixer.\n mixerSetControlDetails() Failed\n Program May Be Abnormal!!",
				NULL,
				MB_OK|MB_ICONEXCLAMATION
				);
		}
		// 关闭Mixer
		mixerClose(hMixer);

	}

	/////////////
	// MY CODE ENDS HERE
	/////////////
}
*/

void CAdvanceDlg::OnWavRadio() 
{
	// TODO: Add your control notification handler code here

	////////////////
	// MY CODE STARTS HERE
	////////////////

	int i;

	// 如果没有处于 WORKSTATE_WAV 状态,则重新绘制控制面板
	if (WorkState!=WORKSTATE_WAV)
	{
		CRect WAVWndRect;

		// 如果处于 WORKSTATE_INTRODUCE 状态,取得窗口大小后,
		// 删除 INTRODUCE 窗口
		if (WorkState==WORKSTATE_INTRODUCE)
		{
			CWnd* IntroduceWndPointer;
			IntroduceWndPointer=GetDlgItem(IDC_INTRODUCE_STATIC);
			IntroduceWndPointer->GetWindowRect(&WAVWndRect);
			IntroduceWndPointer->DestroyWindow();
			GetDlgItem(IDC_BEGIN_STATIC)->DestroyWindow();
		}

		// 如果处于 WORKSTATE_MIC 状态,取得窗口大小后,
		// 删除 MIC 窗口
		if (WorkState==WORKSTATE_MIC)
		{
			CWnd* MICWndPointer;
			MICWndPointer=GetDlgItem(ID_MICWND_STATIC);
			MICWndPointer->GetWindowRect(&WAVWndRect);
			MICWndPointer->DestroyWindow();
			GetDlgItem(ID_MICINTRODUCE_STATIC)->DestroyWindow();
			GetDlgItem(ID_MICPLAY_BUTTON)->DestroyWindow();
			GetDlgItem(ID_MICSTOP_BUTTON)->DestroyWindow();

			// 释放 MIC 的工作缓冲区
			for (i=0;i<DataBufferNumber;i++)
			{
				if ((MICDataHDR[i]->lpData)!=NULL)
				{
					GlobalUnlock(MICDataHDR[i]->lpData);
					GlobalFree(MICDataHDR[i]->lpData);
				}
				waveInReset(hWaveIn);
				waveInClose(hWaveIn);
				waveOutReset(hWaveOut);
				waveOutClose(hWaveOut);
			}
		}

		// 如果处于 WORKSTATE_LINE 状态,取得窗口大小后,
		// 删除 LINE 窗口
		if (WorkState==WORKSTATE_LINE)
		{
			CWnd* LineWndPointer;
			LineWndPointer=GetDlgItem(ID_LINEWND_STATIC);
			LineWndPointer->GetWindowRect(&WAVWndRect);
			LineWndPointer->DestroyWindow();
			GetDlgItem(ID_LINEINTRODUCE_STATIC)->DestroyWindow();
			GetDlgItem(ID_LINEPLAY_BUTTON)->DestroyWindow();
			GetDlgItem(ID_LINESTOP_BUTTON)->DestroyWindow();

			// 释放 LINE 的工作缓冲区
			for (i=0;i<DataBufferNumber;i++)
			{
				if ((LineDataHDR[i]->lpData)!=NULL)
				{
					GlobalUnlock(LineDataHDR[i]->lpData);
					GlobalFree(LineDataHDR[i]->lpData);
				}
				waveInReset(hWaveIn);
				waveInClose(hWaveIn);
				waveOutReset(hWaveOut);
				waveOutClose(hWaveOut);
			}
		}
		
		// 如果处于 WORKSTATE_CD 状态,取得窗口大小后,
		// 删除 CD 窗口以及 CD 窗口内的所有控件
		if (WorkState==WORKSTATE_CD)
		{
			CWnd* CDWndPointer;
			CDWndPointer=GetDlgItem(ID_CDWND_STATIC);
			CDWndPointer->GetWindowRect(&WAVWndRect);
			CDWndPointer->DestroyWindow();

			GetDlgItem(ID_CDPLAY_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDSTOP_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDPAUSE_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDPRIE_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDNEXT_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK1_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK2_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK3_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK4_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK5_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK6_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK7_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK8_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK9_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK10_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK11_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK12_BUTTON)->DestroyWindow();

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?