⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 visepdlg.cpp

📁 一个简单的视频会议VC++MFC工程文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		case ConnNotExist:
			m_statusBar.SetText("不在会议中",0,0);
			break;
		case IncomingCallWait:
			m_statusBar.SetText("有呼叫到来...",0,0);
			break;
		case WaitingForAnswer:
			m_statusBar.SetText("等待对方应答...",0,0);
			break;
		case MakingCall:
			m_statusBar.SetText("正在呼叫...",0,0);
			break;
		case HangingUp:
			m_statusBar.SetText("正在挂断...",0,0);
			break;
	
			
		}
	}
	
}

void CVISEPDlg::OnOK() 
{

}

void CVISEPDlg::OnCancel() 
{
}

void CVISEPDlg::OnAnswer() 
{
	//接听
	m_pep->AnswerCall(m_connID,TRUE);
}

//VIS MCU和VIS EP示例程序中利用nonstandard message来实现简单的会议控制
//开发者可以利用nonstandard message实现符合自己需求的会议控制,以及电子
//白板、文件共享等功能
//
//VIS MCU\VIS EP中使用的简单的控制命令如下
//  [前缀]                  含义
//  "MADD"     由MCU发给EP,告诉EP有人加入会议
//  "MDEL"     由MCU发给EP,告诉EP有人离开会议
//  "LIST"     由EP发给MCU,向MCU索取会议成员列表
//  "ROOM"     由MCU发给EP,告诉EP当前所在会议名
//  "ANNO"     通知信息,由MCU发给所有EP
//  "MSGA"     某个EP向所有人发话,由MCU发给EP
//  "MSGP"     某个EP发话给另一个EP,由MCU发给EP
//  "SMSG"     EP发话给另一个EP,由EP发给MCU,MCU然后转发成"MSGA"或者"MSGP"
//  "SETA"     EP发给MCU,告诉MCU要切换音频
//  "SETV"     EP发给MCU,告诉MCU要切换视频

void CVISEPDlg::OnReceiveNonStandardMsg(CString value)
{
	CString prefix=value.Left(4);
	CString content=value.Right(value.GetLength()-4-1);
	if(prefix=="MADD")//有人加入会议
	{
		int index=content.Find(' ');
		DWORD id=StrToInt(content.Left(index));
		CString body=content.Right(content.GetLength()-index-1);
		index=m_memberList.InsertItem(m_memberList.GetItemCount(),body);
		m_memberList.SetItemData(index,id);
		index=m_ctlTalkTo.AddString(body);
		m_ctlTalkTo.SetItemData(index,id);
		
	}
	else if(prefix=="MDEL")//有人离开会议
	{
		int index;
		DWORD id=StrToInt(content);
		LVFINDINFO lfi;
		lfi.flags=LVFI_PARAM;
		lfi.lParam=id;

		index=m_memberList.FindItem(&lfi);
		if(index>=0)
		{
			m_memberList.DeleteItem(index);
			m_ctlTalkTo.DeleteString(index);
		}
	}
	else if(prefix=="ROOM")//会议名称
	{
		GetDlgItem(IDC_ROOM_NAME)->SetWindowText(content);
		Output("加入会议:\"%s\"",content);
	}
	else if(prefix=="ANNO")
	{
		Output("服务器消息: %s",content);
	}
	else if(prefix=="MSGA")//对所有人说
	{	
		int index=content.Find(' ');
		DWORD id=StrToInt(content.Left(index));
		CString body=content.Right(content.GetLength()-index-1);
		LVFINDINFO lfi;
		lfi.flags=LVFI_PARAM;
		lfi.lParam=id;
		index=m_memberList.FindItem(&lfi);
		if(index>=0)
		{
			Output("%s 对所有人说: %s",m_memberList.GetItemText(index,0),body);
		}
	}
	else if(prefix=="MSGP")//对我说
	{
		int index=content.Find(' ');
		DWORD id=StrToInt(content.Left(index));
		CString body=content.Right(content.GetLength()-index-1);
		LVFINDINFO lfi;
		lfi.flags=LVFI_PARAM;
		lfi.lParam=id;
		index=m_memberList.FindItem(&lfi);
		if(index>=0)
		{
			Output("%s 说: %s",m_memberList.GetItemText(index,0),body);
		}
	}
	else if(prefix=="SMSG")//为了使VISEP之间能够互发消息
	{
		int index=content.Find(' ');
		DWORD id=StrToInt(content.Left(index));
		CString body=content.Right(content.GetLength()-index-1);
		Output("%s 说: %s",m_pep->GetRemoteName(m_connID),body);
	}

	
}

void CVISEPDlg::OnRefresh() 
{
	//刷新会议成员列表
	m_memberList.DeleteAllItems();
	m_memberList.InsertItem(0,"所有人");
	m_memberList.SetItemData(0,0);
	m_ctlTalkTo.ResetContent();
	m_ctlTalkTo.AddString("所有人");
	m_ctlTalkTo.SetItemData(0,0);
	m_ctlTalkTo.SetCurSel(0);
	//向MCU发送成员列表请求
	m_pep->SendNonStandardMsg(m_connID,"LIST");
}

HBRUSH CVISEPDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	if(nCtlColor==CTLCOLOR_STATIC&&pWnd->GetDlgCtrlID()==IDC_MSG_LIST)
	{
		pDC->SetBkColor(0x00ffffff);
		return m_brush;
	}
	// TODO: Return a different brush if the default is not desired
	return hbr;
}

void CVISEPDlg::OnSend() 
{
	//向其他终端发话
	UpdateData();
	int index=m_ctlTalkTo.GetCurSel();
	if(index>=0&&!m_msg.IsEmpty())
	{
		DWORD id=m_ctlTalkTo.GetItemData(index);
		//如果id==0表示向所有人说
		CString str;
		str.Format("SMSG %d %s",id,m_msg);
		m_pep->SendNonStandardMsg(m_connID,str);
		CString talkTo;
		m_ctlTalkTo.GetWindowText(talkTo);
		str.Format("你对 %s说: %s",talkTo,m_msg);
		Output(str);
		m_msg="";
		UpdateData(FALSE);
		
	}
}

void CVISEPDlg::Output(LPCTSTR str,...)
{
	CString out;
	va_list argList;

	va_start(argList, str);
	out.FormatV(str,argList);
	va_end(argList);
	CEdit *edit=(CEdit*)GetDlgItem(IDC_MSG_LIST);

	CString output;
	char t[20];
    _strtime(t);
	output.Format("[%s] %s\r\r\n",t,out);
	edit->SetSel(edit->GetWindowTextLength(),-1);
	edit->ReplaceSel(output);
}

void CVISEPDlg::Output(UINT nID,...)
{
	CString str;
	str.LoadString(nID);
	CString out;
	va_list argList;
	va_start(argList, nID);
	out.FormatV(str,argList);
	va_end(argList);
	
	Output(out);
}

void CVISEPDlg::OnLocalVideo() 
{
	if(m_localVideo.m_hWnd==NULL)
	{
		m_localVideo.Create(this,0,"本地视频",WS_OVERLAPPEDWINDOW|WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,0,0);
		if(m_pep->m_grabber.IsOpened())
			m_pep->m_grabber.StartStream(176,144);
		else
		{
			//打开视频捕获设备,实现本地视频预览
			CWinApp *app=AfxGetApp();
			m_pep->m_grabber.Open(app->GetProfileInt("",KEY_VIDEO_DEVICE,0));
			m_pep->m_grabber.StartStream(176,144);
		}
	}
	else
	{
		m_pep->m_grabber.StopStream();
		if(!m_pep->IsVideoSending(m_connID))
			m_pep->m_grabber.Close();
		m_localVideo.DestroyWindow();
	}
}

void CVISEPDlg::OnRemoteVideo() 
{
	if(m_remoteVideo.m_hWnd==NULL)
	{
		m_remoteVideo.Create(this,0,"对方视频",WS_OVERLAPPEDWINDOW|WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,0,0);
	}
	else
	{
		m_remoteVideo.DestroyWindow();
	}
}

void CVISEPDlg::OnItemchangedMemberList(NMHDR* pNMHDR, LRESULT* pResult) 
{
	//切换会议成员
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	if(m_pep->GetConnectionStatus(m_connID)==ConnEstablished)
	{
		
		int index=m_memberList.GetNextItem(-1,LVNI_SELECTED);
		DWORD id=0;
		if(index>=0)
		{
			id=m_memberList.GetItemData(index);
		}
		CString str;
		str.Format("SETA %d",id);
		//向MCU发送切换音频的请求
		m_pep->SendNonStandardMsg(m_connID,str);

		str.Format("SETV %d",id);
		//向MCU发送切换视频的请求
		m_pep->SendNonStandardMsg(m_connID,str);
	
	}
	*pResult = 0;
}

void CVISEPDlg::OnAudio() 
{
	//音频设置
	COptionAudio dlg;
	CWinApp *app=AfxGetApp();
	dlg.m_outputDevice=app->GetProfileInt("",KEY_AUDIO_OUTPUT_DEVICE,0);
	dlg.m_inputDevice=app->GetProfileInt("",KEY_AUDIO_INPUT_DEVICE,0);
	dlg.m_jitter=app->GetProfileInt("",KEY_AUDIO_JITTER,60);
	//默认禁用静音抑制
	dlg.m_silenceDetection=app->GetProfileInt("",KEY_SILENCE_DETECTION_MODE,0);
	dlg.m_threshold=app->GetProfileInt("",KEY_SILENCE_DETECTION_THRESHOLD,0);
	dlg.m_preferredCodec=m_pep->GetPreferredAudioCodec();
	if(dlg.DoModal()==IDOK)
	{
		app->WriteProfileInt("",KEY_AUDIO_OUTPUT_DEVICE,dlg.m_outputDevice);
		app->WriteProfileInt("",KEY_AUDIO_INPUT_DEVICE,dlg.m_inputDevice);
		app->WriteProfileInt("",KEY_AUDIO_JITTER,dlg.m_jitter);
		m_pep->SetMaxAudioDelayJitter(0,dlg.m_jitter);
		m_pep->SetMaxAudioDelayJitter(m_connID,dlg.m_jitter);
		app->WriteProfileInt("",KEY_SILENCE_DETECTION_MODE,dlg.m_silenceDetection);
		app->WriteProfileInt("",KEY_SILENCE_DETECTION_THRESHOLD,dlg.m_threshold);
		m_pep->SetSilenceDetectionMode(0,(enum SilenceDetectionMode)dlg.m_silenceDetection,dlg.m_threshold);
		m_pep->SetSilenceDetectionMode(m_connID,(enum SilenceDetectionMode)dlg.m_silenceDetection,dlg.m_threshold);
		app->WriteProfileInt("",KEY_PREFERRED_AUDIO_CODEC,dlg.m_preferredCodec);
		m_pep->SetPreferredAudioCodec(dlg.m_preferredCodec);
	}
}

void CVISEPDlg::OnVideo() 
{
	//视频设置
	COptionVideo dlg;
	CWinApp *app=AfxGetApp();

	dlg.m_device=app->GetProfileInt("",KEY_VIDEO_DEVICE,0);
	dlg.m_directShow=app->GetProfileInt("",KEY_USE_DIRECTSHOW,1)>0;
	dlg.m_autoSend=app->GetProfileInt("",KEY_AUTO_SEND_VIDEO,1)>0;
	dlg.m_format=app->GetProfileInt("",KEY_VIDEO_FORMAT,0)==0?0:1;
	dlg.m_quality=app->GetProfileInt("",KEY_VIDEO_QUALITY,100);
	if(dlg.DoModal()==IDOK)
	{
		app->WriteProfileInt("",KEY_VIDEO_DEVICE,dlg.m_device);
		app->WriteProfileInt("",KEY_USE_DIRECTSHOW,dlg.m_directShow?1:0);
		m_pep->m_grabber.SetGrabberMode(dlg.m_directShow?VG_DS:VG_VFW);
		app->WriteProfileInt("",KEY_AUTO_SEND_VIDEO,dlg.m_autoSend?1:0);
		m_pep->AutoSendVideo(dlg.m_autoSend);
		app->WriteProfileInt("",KEY_VIDEO_FORMAT,dlg.m_format);
		m_pep->SetVideoSize(0,dlg.m_format==0?VS_QCIF:VS_CIF);
		m_pep->SetVideoSize(m_connID,dlg.m_format==0?VS_QCIF:VS_CIF);
		app->WriteProfileInt("",KEY_VIDEO_QUALITY,dlg.m_quality);
		m_pep->SetVideoQuality(0,dlg.m_quality);
		m_pep->SetVideoQuality(m_connID,dlg.m_quality);
	}
}

void CVISEPDlg::OnNetwork() 
{
	//网络设置
	COptionNetwork dlg;	
	CWinApp *app=AfxGetApp();
	dlg.m_bandwidth=m_pep->GetInitialBandwidth()/1000;
	dlg.m_listenPort=app->GetProfileInt("",KEY_LISTEN_PORT,H323_LISTEN_PORT);
	//默认禁用fast-start
	dlg.m_faststart=app->GetProfileInt("",KEY_FASTSTART,0)>0;
	dlg.m_h245insetup=app->GetProfileInt("",KEY_H245INSETUP,1)>0;
	dlg.m_h245tunnel=app->GetProfileInt("",KEY_H245TUNNEL,1)>0;
	if(dlg.DoModal()==IDOK)
	{
		app->WriteProfileInt("",KEY_BANDWIDTH,dlg.m_bandwidth);
		m_pep->SetInitialBandwidth(dlg.m_bandwidth*1000);
		app->WriteProfileInt("",KEY_LISTEN_PORT,dlg.m_listenPort);
		m_pep->StartListen(NULL,(WORD)dlg.m_listenPort);
		app->WriteProfileInt("",KEY_FASTSTART,dlg.m_faststart?1:0);
		app->WriteProfileInt("",KEY_H245INSETUP,dlg.m_h245insetup?1:0);
		app->WriteProfileInt("",KEY_H245TUNNEL,dlg.m_h245tunnel?1:0);
		m_pep->EnableFastStart(dlg.m_faststart);
		m_pep->EnableH245inSetup(dlg.m_h245insetup);
		m_pep->EnableH245Tunnel(dlg.m_h245tunnel);
	}
}

void CVISEPDlg::OnGatekeeper() 
{
	//网守设置
	COptionGatekeeper dlg;
	CWinApp *app=AfxGetApp();
	char name[256]="";
	m_pep->GetUserName(name,256);
	dlg.m_userName=name;
	m_pep->GetUserAlias(name,256);
	dlg.m_userAlias=name;
	dlg.m_password=app->GetProfileString("",KEY_PASSWORD);
	dlg.m_gkAddr=app->GetProfileString("",KEY_GK_ADDRESS);
	if(dlg.DoModal()==IDOK)
	{
		app->WriteProfileString("",KEY_USER_NAME,dlg.m_userName);
		app->WriteProfileString("",KEY_USER_ALIAS,dlg.m_userAlias);
		m_pep->SetUserName(dlg.m_userName,dlg.m_userAlias);
		app->WriteProfileString("",KEY_PASSWORD,dlg.m_password);
		app->WriteProfileString("",KEY_GK_ADDRESS,dlg.m_gkAddr);
	}
}

void CVISEPDlg::OnLogin() 
{
	//登录网守
	CWinApp *app=AfxGetApp();
	if(m_pep->UseGatekeeper(app->GetProfileString("",KEY_GK_ADDRESS),
		app->GetProfileString("",KEY_PASSWORD)))
	{
		GetMenu()->EnableMenuItem(ID_LOGIN,MF_BYCOMMAND|MF_GRAYED);
		m_statusBar.SetText("正在登录网守...",3,0);
	}
}

void CVISEPDlg::OnLogout() 
{
	//从网守注销
	m_pep->UnuseGatekeeper();
	GetMenu()->EnableMenuItem(ID_LOGOUT,MF_BYCOMMAND|MF_GRAYED);
	m_statusBar.SetText("未登录到网守",3,0);
}

void CVISEPDlg::OnTimer(UINT nIDEvent) 
{
	if(nIDEvent==1)	
	{
		m_micVolume.SetPos(m_pep->GetAudioSignalLevel(m_connID,TRUE));
		m_spkVolume.SetPos(m_pep->GetAudioSignalLevel(m_connID,FALSE));
	}
	else if(nIDEvent==2)
	{
		CString s;
		DWORD dur;
		m_pep->GetConnectionDuration(m_connID,dur);
		s.Format("正在会议...%02d:%02d:%02d",dur/3600,dur/60%60,dur%60);
		m_statusBar.SetText(s,0,0);
	}
	CDialog::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

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