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

📄 vfwdialogdlg.cpp

📁 一个简单的视频会议VC++MFC工程文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	::SetWindowPos (m_TextChatDlg.m_hWnd,HWND_TOP,rc.left,rc.bottom+1 ,0,0,SWP_NOSIZE);
	
	SetTextColor((m_VLocal.GetDC ())->m_hDC,0x00660000);
	if(m_VidLocal)
	{
		SetWindowText (_T("本地视频"));
		m_RemoteDlg.SetWindowText (dcontrol.remotename );
		m_VLocal.SetWindowText (_T("本地"));
	}else
	{
		m_RemoteDlg.SetWindowText (_T("本地视频"));
		SetWindowText (dcontrol.remotename );
		m_VLocal.SetWindowText (_T("远程"));
	}
	m_State=STATE_CONNECTED;
	OnTrayNotify(IDR_MAINFRAME,WM_LBUTTONUP);
	Invalidate (TRUE);
	m_RemoteDlg.ShowWindow (SW_SHOW);
	m_TextChatDlg.ShowWindow (SW_SHOW);
	m_RemoteDlg.UpdateUI();
	m_TextChatDlg.UpdateUI ();
	m_Retry = 0;
	m_ConnectTime=CTime::GetCurrentTime();
	return ret;
}

void CGraghDialogDlg::DestroyConference()
{
	TRACE("CGraghDialogDlg::DestroyConference\n");
	m_RemoteDlg.ShowWindow (SW_HIDE);
	m_TextChatDlg.ShowWindow (SW_HIDE);
	m_State=STATE_IDLE;
	m_Retry=0;
	m_bExitNow=TRUE;
	m_OK.EnableWindow (TRUE);
	if(m_AudioRec)
		m_AudioRec->PostThreadMessage(WM_RECORDSOUND_STOPRECORDING,0,0);

	DestroyCap ();
	DestroyDib ();
	m_VideoCodec.Destroy ();

	daudio.SetParent(NULL);
	dvideo.SetParent(NULL);
	dtext.SetParent(NULL);
	dtext.CloseSocket();
	daudio.CloseSocket();
	dvideo.CloseSocket();

	if(m_VUnComped)		delete []m_VUnComped;
	m_VUnComped =NULL;
	if(m_VComped)		delete []m_VComped;
	m_VComped =NULL;
	if(m_AUnComped)		delete []m_AUnComped;
	m_AUnComped =NULL;
	if(m_AComped)		delete []m_AComped;
	m_AComped =NULL;

	m_VLocal.EnableWindow (FALSE);
	m_OK.SetIcon (IDI_CALLIN,IDI_CALL,32,32);
	m_OK.AddToolTip (_T("呼叫"));
	if(m_bStart)
		dcontrol.SendControlMessage(MESG_DISCONNECT,dcontrol.remoteaddress);
	m_bStart = FALSE;

	m_RemoteDlg.m_bVideoIn =FALSE;

	SetWindowText(_T("视频会议系统"));
	Invalidate (TRUE);
}

void CGraghDialogDlg::OnAbout() 
{
	OnSysCommand(IDM_ABOUTBOX ,0);
}

void CGraghDialogDlg::OnOK() 
{
	int ret=IDOK;
	m_bStart=!m_bStart;
	if(m_bStart)	//start now? send connect
	{
		m_AddrBook = new CAddressBook;
		m_AddrBook->SetParent (this);
		ret=m_AddrBook->DoModal();
		if(m_AddrBook) delete m_AddrBook;
		m_AddrBook=NULL;
		if(ret!=IDOK)	return;
//		MESG_CONNECT sent!
		m_dwLastTime=GetTickCount();	
		m_OK.SetIcon (IDI_HANGIN,IDI_HANG,32,32);
		m_OK.AddToolTip (_T("断开"));
	}else	//not start? send disconnect
	{
		DestroyConference();
	}
}

void	CGraghDialogDlg::SendVideo(BYTE *data,int size)
{
	int comp=0;
	if(m_bExitNow  )	return;

	if(data==NULL || size<=0)	return;
	m_VideoCodec.EncodeVideoData((char*)data,size,m_VComped,&comp,0);
//	TRACE("CGraghDialogDlg::SendVideo,Source %d Bytes,compressed %d Bytes\n",size,comp);
	if(comp>0)	
		dvideo.SendVideoData((unsigned char *)m_VComped,comp);

	m_VFrames ++;
	m_VBytesSent +=comp;
	if(m_VidLocal)
	{
		::DrawDibDraw(	
					hdib,
					m_hdc,
					m_Video_x,				// dest : left pos
					m_Video_y,				// dest : top pos
					176,							// don't zoom x
					144,							// don't zoom y
					&m_bmpinfo->bmiHeader,		// bmp header info
					data,						// bmp data
					0,							// src :left
					0,							// src :top
					IMAGE_WIDTH,				// src : width
					IMAGE_HEIGHT,				// src : height
					DDF_SAME_DRAW				// use prev params....
				  );
	}else if( !m_VidLocal && m_RemoteDlg)
		m_RemoteDlg.DisplayRemoteFrame ((unsigned char*)data,size);
}

void CGraghDialogDlg::DisplayRemoteFrame(unsigned char *data,int size)
{
//	TRACE("CGraghDialogDlg::DisplayRemoteFrame %d bytes\n",size);
	if(m_bExitNow  )	return;
	if(data == NULL || size<=0)	return;
	
	if( m_VidLocal && m_RemoteDlg)
		m_RemoteDlg.DisplayRemoteFrame (data,size);
	else if(!m_VidLocal)
		::DrawDibDraw(hdib,
				  m_hdc,
				  m_Video_x ,		// dest : left pos
				  m_Video_y,		// dest : top pos
				  176,					 // don't zoom x
				  144,					 // don't zoom y
				  &m_bmpinfo->bmiHeader,	 // bmp header info
				  data,					 // bmp data
				  0,					 // src :left
				  0,					 // src :top
				  IMAGE_WIDTH,				 // src : width
				  IMAGE_HEIGHT,				 // src : height
				  DDF_SAME_DRAW			 // use prev params....
				  );
}

void CGraghDialogDlg::PlayWavFile(LPCTSTR filename)
{
	CFile f;
	DWORD size=0;
	char *p;
	if(f.Open (filename,CFile::modeRead | CFile::typeBinary,NULL))
	{
		f.Seek (58,CFile::begin);
		size=f.GetLength ();
		p=new char [size];
		if(!p)	return;
		size=f.Read (p ,size);
		m_AudioPlay->PostThreadMessage(WM_PLAYSOUND_PLAYBLOCK,size,(LPARAM)p);
		Sleep(100);
		delete []p;
		f.Close ();
	}
}

void CGraghDialogDlg::OnViewlocal() 
{
	// TODO: Add your control notification handler code here
	m_VidLocal =!m_VidLocal;
	if(m_VidLocal)
	{
		m_VLocal.SetWindowText (_T("本地"));
		SetWindowText(_T("本地视频"));
		m_RemoteDlg.SetWindowText(dcontrol.remotename);
	}
	else
	{
		m_VLocal.SetWindowText (_T("远程"));
		SetWindowText(dcontrol.remotename);
		m_RemoteDlg.SetWindowText(_T("本地视频"));
	}
	Invalidate (TRUE);
	m_RemoteDlg.UpdateUI ();
}

void CGraghDialogDlg::OnQuit() 
{
	if(m_bStart)
	{
		INT ret=AfxMessageBox("退出会议?",MB_OKCANCEL);
		if(ret!=IDOK) return;
	}
	KillTimer(1);
	ShowWindow(SW_HIDE);
	m_bExitNow=TRUE;
//	dcontrol.SendControlMessage (MESG_DISCONNECT,dcontrol.remoteaddress );	
	DestroyConference();

	if(m_AddrBook)	delete m_AddrBook ;
	
	if(m_AudioPlay) 
	{	
		m_AudioPlay->PostThreadMessage(WM_PLAYSOUND_STOPPLAYING,0,0);
		m_AudioPlay->PostThreadMessage(WM_RECORDSOUND_ENDTHREAD,0,0);
		Sleep(200);
		delete m_AudioPlay;
	}
	if(m_AudioRec)
	{
		m_AudioRec->PostThreadMessage(WM_PLAYSOUND_ENDTHREAD,0,0);
		Sleep(200);
		delete m_AudioRec;
	}
	m_AddrBook = NULL;
	m_RemoteDlg.FreeSource();
	m_TextChatDlg .FreeSource();
	DeleteObject(m_hVideoRgn);
	DeleteObject(m_hMesgRgn);
	DeleteObject(m_hTitleRgn);
	CDialog::OnOK();
}

void CGraghDialogDlg::OnCancel() 
{
	m_tnid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);
	m_tnid.hWnd=m_hWnd;
	m_tnid.uID=IDR_MAINFRAME;
	m_tnid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;
	m_tnid.uCallbackMessage=WM_TRAYNOTIFY;
	m_tnid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
	strcpy(m_tnid.szTip,"视频会议系统");
	Shell_NotifyIcon(NIM_ADD,&m_tnid);
	ShowWindow(SW_HIDE);
	m_RemoteDlg.ShowWindow (SW_HIDE);
	m_TextChatDlg.ShowWindow (SW_HIDE);	
}

void CGraghDialogDlg::DisplayMesg(char *str)
{
	HBRUSH hbr;

	hbr=CreateSolidBrush(0x00FF0000);		

	FillRgn(m_hdc,m_hMesgRgn,hbr);
	DeleteObject(hbr);
	
	NONCLIENTMETRICS ncm;
	ncm.cbSize = sizeof(ncm);
	SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
	HFONT hf=CreateFontIndirect(&ncm.lfCaptionFont);
	HFONT hof=(HFONT)SelectObject(m_hdc,hf);
	SetBkMode(m_hdc,TRANSPARENT);
	SetTextColor(m_hdc,0x00FFFFFF);
	
	DrawText(m_hdc,str,strlen(str),&CRect(10,179,249,198),DT_LEFT);
	SelectObject(m_hdc,hof);
}

void CGraghDialogDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CDialog::OnLButtonDown(nFlags, point);
	if(PtInRegion(m_hTitleRgn,point.x,point.y))
		PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y)); 
}

void CGraghDialogDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	SetForegroundWindow ();
	SetActiveWindow ();
	PtInRegion(m_hTitleRgn,point.x,point.y)?m_bHilight =TRUE:m_bHilight =FALSE;
	if(m_bHilight != m_Last )
	{
		m_Last=m_bHilight;
		DrawTitleBar(m_hdc);
	}

	CDialog::OnMouseMove(nFlags, point);
}

BOOL CGraghDialogDlg::OnEraseBkgnd(CDC* pDC) 
{
	CDC MemDC;
	MemDC.CreateCompatibleDC(pDC);
	CBitmap *pOldBMP = (CBitmap*)MemDC.SelectObject(&m_bmpMain);
	pDC->BitBlt(0,0,m_Width,m_Height,&MemDC,0,0,SRCCOPY);
	if(pOldBMP)		MemDC.SelectObject(pOldBMP);
	MemDC.DeleteDC ();
	return TRUE;
}

LRESULT CGraghDialogDlg::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
	switch(lParam)
	{
	case WM_LBUTTONUP:
		{
			BOOL res; 
			m_tnid.cbSize = sizeof(NOTIFYICONDATA); 
			m_tnid.hWnd = m_hWnd;
			m_tnid.uID = IDR_MAINFRAME; 
			res = Shell_NotifyIcon(NIM_DELETE, &m_tnid); 
			ShowWindow(SW_SHOWNORMAL);
			SetForegroundWindow();
			SetActiveWindow();
			if( m_bStart) 
			{
				m_RemoteDlg.ShowWindow (SW_SHOW);
				m_TextChatDlg.ShowWindow (SW_SHOW);
			}
		}
		break;
	}
	return TRUE;
}

void CGraghDialogDlg::DrawTitleBar(HDC hdc)
{
	RECT rc;
	GetClientRect(&rc);
	HBRUSH hbr;
	if(m_bHilight)	hbr=CreateSolidBrush(0x00FF3333);		
	else			hbr=CreateSolidBrush(0x00660000);		
	FillRgn(hdc,m_hTitleRgn,hbr);
	DeleteObject(hbr);
	
	char szTitle[64]="";
	NONCLIENTMETRICS ncm;
	ncm.cbSize = sizeof(ncm);
	SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &ncm, 0);
	HFONT hf=CreateFontIndirect(&ncm.lfCaptionFont);
	HFONT hof=(HFONT)SelectObject(hdc,hf);
	SetBkMode(hdc,TRANSPARENT);
	if(m_bHilight)	SetTextColor(hdc,0x000000ff);
	else			SetTextColor(hdc,0x00C0C0C0);
	GetWindowText(szTitle,63);
	DrawText(hdc,szTitle,strlen(szTitle),&CRect(25,7,144,22),DT_LEFT);
	
	if(m_bStart && !m_bVidInit)
	{ // Started but inticap failed
		hbr=CreateSolidBrush(0x00000000);
		FillRgn(hdc,m_hVideoRgn,hbr);
		sprintf(szTitle,"打开视频捕捉设备失败");
		DrawText(hdc,szTitle,strlen(szTitle),&CRect(m_Width/8,m_Height/2,m_Width,m_Height),DT_LEFT);
		DeleteObject(hbr);	
	}

	SelectObject(hdc,hof);
	DeleteObject(hf);
	DeleteObject(hof);
}

void CGraghDialogDlg::SetMainBmp(int idb)
{
	BITMAP bm;
	m_bmpMain.LoadBitmap (idb);
	m_bmpMain.GetBitmap (&bm);
	m_Width		= bm.bmWidth ;
	m_Height	= bm.bmHeight ;

	RECT rc;
	GetClientRect(&rc);
	ClientToScreen (&rc);

	::SetWindowPos (m_hWnd,HWND_TOP,rc.left ,rc.top ,m_Width ,m_Height,0);
}

void CGraghDialogDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	char szFps[256]="";
	DWORD	NowTime;
	CTime t=CTime::GetCurrentTime();
	CTimeSpan ts = t - m_ConnectTime;

	switch(m_State)
	{
	case STATE_IDLE:
		break;
	case STATE_CONNECTED:
		NowTime=GetTickCount();
		if(NowTime - m_dwLastTime>=2000)
		{
			sprintf(szFps,"V:%2dFPS,%3dKbps/A:%dFPS,%02dKbps,%d:%02d:%02d",\
				m_VFrames/2,m_VBytesSent/250,m_AFrames/2,m_ABytesSent/250,
				ts.GetHours (),ts.GetMinutes (),ts.GetSeconds ());
			m_dwLastTime = NowTime;
			m_VFrames = 0;m_VBytesSent=0;
			m_AFrames = 0;m_ABytesSent=0;
			DisplayMesg(szFps);
		}
		break;
	case STATE_CALLIN:
	case STATE_CALLOUT:
		PlayWavFile(m_State==STATE_CALLIN?"callin.wav":"callout.wav");
		m_Retry++;
		sprintf(szFps,"等待对方应答: %d",m_Retry);
		DisplayMesg(szFps);
		if(m_Retry > 10)	//wait 10s
		{
			DestroyConference ();
			DisplayMesg("对方无人应答, 连接超时");
		}
		break;
	}
	CDialog::OnTimer(nIDEvent);
}

//DEL void CAboutDlg::OnOK() 
//DEL {
//DEL 	// TODO: Add extra validation here
//DEL 	
//DEL 	CDialog::OnOK();
//DEL }

⌨️ 快捷键说明

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