advancedlg.cpp

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

CPP
2,022
字号
			GetDlgItem(ID_CDTRACK13_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK14_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK15_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK_STATIC)->DestroyWindow();
			GetDlgItem(ID_CDMINUTE_STATIC)->DestroyWindow();
			GetDlgItem(ID_CDSECOND_STATIC)->DestroyWindow();
			GetDlgItem(ID_CDTRACKCOUNTER_STATIC)->DestroyWindow();
			GetDlgItem(ID_CDMINUTECOUNTER_STATIC)->DestroyWindow();
			GetDlgItem(ID_CDSECONDCOUNTER_STATIC)->DestroyWindow();

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

		// 为 WAV 申请工作缓冲区
		for (i=0;i<DataBufferNumber;i++)
		{
			WAVDataHDR[i]=(LPWAVEHDR)GlobalAllocPtr(GMEM_MOVEABLE|GMEM_SHARE,sizeof(WAVEHDR));
			WAVDataHDR[i]->lpData=(LPSTR)GlobalAllocPtr(GMEM_MOVEABLE|GMEM_SHARE,DataBufferSize);
			ZeroMemory(WAVDataHDR[i]->lpData,DataBufferSize);
			WAVDataHDR[i]->dwBufferLength=DataBufferSize;
			WAVDataHDR[i]->dwBytesRecorded=0L;
			WAVDataHDR[i]->dwFlags=0L;
			WAVDataHDR[i]->dwLoops=0L;
		}    
		// 为 WAVDelayData,TempData 分配空间
		WAVDelayData=(LPWAVEHDR)GlobalAllocPtr(GMEM_MOVEABLE|GMEM_SHARE,sizeof(WAVEHDR));
		WAVDelayData->lpData=(LPSTR)GlobalAllocPtr(GMEM_MOVEABLE|GMEM_SHARE,DataBufferSize);
		ZeroMemory(WAVDelayData->lpData,DataBufferSize);
		WAVDelayData->dwBufferLength=DataBufferSize;
		WAVDelayData->dwBytesRecorded=0L;                                     
		WAVDelayData->dwFlags=0L;
		WAVDelayData->dwLoops=0L;
		
		TempData=(LPWAVEHDR)GlobalAllocPtr(GMEM_MOVEABLE|GMEM_SHARE,sizeof(WAVEHDR));
		TempData->lpData=(LPSTR)GlobalAllocPtr(GMEM_MOVEABLE|GMEM_SHARE,DataBufferSize);
		ZeroMemory(TempData->lpData,DataBufferSize);
		TempData->dwBufferLength=DataBufferSize;
		TempData->dwBytesRecorded=0L;                                     
		TempData->dwFlags=0L;
		TempData->dwLoops=0L;

		// 绘制 WAV 窗口
		ScreenToClient(WAVWndRect);
		WAVWnd.Create
			("WAV", 
			WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_GROUPBOX,
			WAVWndRect,
			this,
			ID_WAVWND_STATIC
			);
	
		// 绘制 WAV 窗口内的各个控件
		// 绘制各个按钮控件
		int WAVControlButtonNumber=4;
		int WAVControlButtonWidth=WAVWndRect.Width()/(WAVControlButtonNumber+2);
		int WAVControlButtonHeight=WAVWndRect.Height()/4;
		CRect WAVControlButton;

		// 绘制 WAV 窗口中的 PLAY 按钮
		WAVControlButton.left  =WAVWndRect.left+WAVControlButtonWidth;
		WAVControlButton.top   =WAVWndRect.top+WAVWndRect.Height()/2;
		WAVControlButton.right =WAVControlButton.left+WAVControlButtonWidth;
		WAVControlButton.bottom=WAVControlButton.top+WAVControlButtonHeight;
		WAVPlay.Create
			(
			"Play",
			WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_PUSHBUTTON|BS_ICON,
			WAVControlButton,
			this,
			ID_WAVPLAY_BUTTON
			);
		((CButton*)GetDlgItem(ID_WAVPLAY_BUTTON))->SetIcon(AfxGetApp()->LoadIcon(IDI_PLAY_ICON));

		// 绘制 WAV 窗口中的 STOP 按钮
		WAVControlButton.left  =WAVControlButton.right;
		WAVControlButton.right =WAVControlButton.left+WAVControlButtonWidth;
		WAVStop.Create
			(
			"Stop",
			WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_PUSHBUTTON|BS_ICON,
			WAVControlButton,
			this,
			ID_WAVSTOP_BUTTON
			);
		((CButton*)GetDlgItem(ID_WAVSTOP_BUTTON))->SetIcon(AfxGetApp()->LoadIcon(IDI_STOP_ICON));

		// 绘制 WAV 窗口中的 PAUSE 按钮
		WAVControlButton.left  =WAVControlButton.right;
		WAVControlButton.right =WAVControlButton.left+WAVControlButtonWidth;
		WAVPause.Create
			(
			"Pause",
			WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_PUSHBUTTON|BS_ICON,
			WAVControlButton,
			this,
			ID_WAVPAUSE_BUTTON
			);
		((CButton*)GetDlgItem(ID_WAVPAUSE_BUTTON))->SetIcon(AfxGetApp()->LoadIcon(IDI_PAUSE_ICON));

		// 绘制 WAV 窗口中的 List 按钮
		WAVControlButton.left  =WAVControlButton.right;
		WAVControlButton.right =WAVControlButton.left+WAVControlButtonWidth;
		WAVList.Create
			(
			"Select Music",
			WS_CHILD|WS_VISIBLE|WS_TABSTOP|BS_PUSHBUTTON|BS_ICON,
			WAVControlButton,
			this,
			ID_WAVLIST_BUTTON
			);
		((CButton*)GetDlgItem(ID_WAVLIST_BUTTON))->SetIcon(AfxGetApp()->LoadIcon(IDI_LIST_ICON));

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

		// 绘制 WAV 窗口中的 FilenameStatic 静态文本说明框
		WAVStaticBox.left  =WAVWndRect.left+WAVControlButtonWidth/2;
		WAVStaticBox.top   =WAVWndRect.top+WAVWndRect.Height()/5;
		WAVStaticBox.right =WAVStaticBox.left+WAVControlButtonWidth*3/2;
		WAVStaticBox.bottom=WAVStaticBox.top+WAVControlButtonHeight;
		WAVFilenameStatic.Create
			(
			"FileName:",
			WS_CHILD|WS_VISIBLE,
			WAVStaticBox,
			this,
			ID_WAVFILENAME_STATIC
			);
		
		// 绘制 WAV 窗口中的 FilenameCounter 静态文本说明框
		WAVStaticBox.left  =WAVStaticBox.right;
		WAVStaticBox.right =WAVStaticBox.left+WAVControlButtonWidth*7/2;
		WAVFilenameCounter.Create
			(
			WAVFileName,
			WS_CHILD|WS_VISIBLE|SS_LEFTNOWORDWRAP,
			WAVStaticBox,
			this,
			ID_WAVFILENAMECOUNTER_STATIC
			);
		
		// 设置状态为 WORKSTATE_WAV
		WorkState=WORKSTATE_WAV;

		// 单声道延迟数据复位
		WAVMonoDelay=44;

		for(i=0;i<WAVMonoDelay*2;i++)
		{
			WAVMonoDelayData[i]=0;
			WAVDelayMonoDelayData[i]=0;
		}

		// 设置 Paused 为‘未暂停’状态(FALSE)
		Paused=FALSE;
		

		// 画 WAV 初始界面的一幅画
		CDC pDisplayMemDC;
		CClientDC dc(this);
		pBitmap.DeleteObject(); // 清除以前加载的位图
		pBitmap.LoadBitmap(IDB_WAVBEGIN_BITMAP); // 加载新的位图
		pDisplayMemDC.CreateCompatibleDC(&dc);
		pDisplayMemDC.SelectObject(&pBitmap);
		dc.BitBlt(15,10,100,90,&pDisplayMemDC,0,0,SRCCOPY);
		RedrawMyself=TRUE;

		// 声卡混音器控制
		MIXERCONTROLDETAILS_BOOLEAN     MyMixerControlDetails_f[20];
		HMIXER                          hMixer;
		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;
//		CDVolumeMuteControlDetails.paDetails=&CDVolumeMuteOldState;
		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
				);
		}
		// 使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
				);
		}
		// 使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
				);
		}
		// 关闭Mixer
		mixerClose(hMixer);

	}

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

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

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

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

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

		// 如果处于 WORKSTATE_LINE 状态,取得窗口大小后,
		// 删除 LINE 窗口
		if (WorkState==WORKSTATE_LINE)
		{
			CWnd* LineWndPointer;
			LineWndPointer=GetDlgItem(ID_LINEWND_STATIC);
			LineWndPointer->GetWindowRect(&MICWndRect);
			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_WAV 状态,取得窗口大小后,
		// 删除 WAV 窗口以及 WAV 窗口内的所有控件
		if (WorkState==WORKSTATE_WAV)
		{
			CWnd* WAVWndPointer;
			WAVWndPointer=GetDlgItem(ID_WAVWND_STATIC);
			WAVWndPointer->GetWindowRect(&MICWndRect);
			WAVWndPointer->DestroyWindow();

			GetDlgItem(ID_WAVPLAY_BUTTON)->DestroyWindow();
			GetDlgItem(ID_WAVSTOP_BUTTON)->DestroyWindow();
			GetDlgItem(ID_WAVPAUSE_BUTTON)->DestroyWindow();
			GetDlgItem(ID_WAVLIST_BUTTON)->DestroyWindow();
			GetDlgItem(ID_WAVFILENAME_STATIC)->DestroyWindow();
			GetDlgItem(ID_WAVFILENAMECOUNTER_STATIC)->DestroyWindow();

			// 释放 WAV, WAVDelayData, TempData 的工作缓冲区
			for (i=0;i<DataBufferNumber;i++)
			{
				if ((WAVDataHDR[i]->lpData)!=NULL)
				{
					GlobalUnlock(WAVDataHDR[i]->lpData);
					GlobalFree(WAVDataHDR[i]->lpData);
				}
				waveOutReset(hWaveOut);
				waveOutClose(hWaveOut);
			}
			if ((WAVDelayData->lpData)!=NULL) GlobalFreePtr(WAVDelayData);
			if ((TempData->lpData)!=NULL) GlobalFreePtr(TempData);
		}

		// 如果处于 WORKSTATE_CD 状态,取得窗口大小后,
		// 删除 CD 窗口以及 CD 窗口内的所有控件
		if (WorkState==WORKSTATE_CD)
		{
			CWnd* CDWndPointer;
			CDWndPointer=GetDlgItem(ID_CDWND_STATIC);
			CDWndPointer->GetWindowRect(&MICWndRect);
			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();
			GetDlgItem(ID_CDTRACK13_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK14_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK15_BUTTON)->DestroyWindow();
			GetDlgItem(ID_CDTRACK_STATIC)->DestroyWindow();
			GetDlgItem(ID_CDMINUTE_STATIC)->DestroyWindow();
			GetDlgItem(ID_CDSECOND_STATIC)->DestroyWindow();
			GetDlgItem(ID_CDTRACKCOUNTER_STATIC)->DestroyWindow();
			GetDlgItem(ID_CDMINUTECOUNTER_STATIC)->DestroyWindow();
			GetDlgItem(ID_CDSECONDCOUNTER_STATIC)->DestroyWindow();

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

		// 绘制 MIC 窗口
		ScreenToClient(MICWndRect);
		MICWnd.Create
			("MIC",
			WS_CHILD|WS_VISIBLE|BS_GROUPBOX,
			MICWndRect,
			this,

⌨️ 快捷键说明

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