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

📄 main.cpp

📁 一个实时音频或视频通讯程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				ShowWindow(m_RemoteVideoWnd.m_vs,SW_HIDE);
				m_btnOutview.LoadBitmaps(IDB_VIDEO_OUTVIEW1,IDB_VIDEO_OUTVIEW2,IDB_VIDEO_OUTVIEW3);
			}
			else
			{
				ShowWindow(m_RemoteVideoWnd,SW_SHOW);
				AVIO.SetRemoteVideoRcvWnd(m_RemoteVideoWnd.m_vs);
				ShowWindow(m_vs,SW_HIDE);
				m_btnOutview.LoadBitmaps(IDB_VIDEO_OUTVIEW4,IDB_VIDEO_OUTVIEW5,IDB_VIDEO_OUTVIEW6);
			}
		}
		break;
	case IDC_VIDEO_ONOFF:
		{
			if(m_bSendVideo)
			{
				m_bSendVideo=FALSE;
				AVIO.VideoSend(FALSE);
				m_btnOnoff.LoadBitmaps(IDB_VIDEO_ONOFF4,IDB_VIDEO_ONOFF5,IDB_VIDEO_ONOFF6);
			}
			else
			{			
				m_bSendVideo=TRUE;
				AVIO.VideoSend(TRUE);
				m_btnOnoff.LoadBitmaps(IDB_VIDEO_ONOFF1,IDB_VIDEO_ONOFF2,IDB_VIDEO_ONOFF3);
			}
		}
	}
	return TRUE;
}
//画主窗口界面
void CMainWnd::OnEraseBkgnd(HDC hdc)
{
	
	RECT rc;
	GetClientRect(m_hWnd,&rc);	
	HDC hMemDC=CreateCompatibleDC(hdc);

	HBITMAP hFace=LoadBitmap(hInstX,LPCTSTR(IDB_FACE));
	HBITMAP hob=(HBITMAP)SelectObject(hMemDC,hFace);

	if(m_bHilightTitleBar)
	{
		RECT rc;
		SetRect(&rc,5,5,168,22);
		m_bHilightTitleBar=TRUE;
		
		HBITMAP hb=LoadBitmap(hInstX,LPCTSTR(IDB_TITLE2));
		DrawTransBmpX(hMemDC,rc,hb,0,0,0);
		DeleteObject(hb);
		
	}
	BitBlt(hdc,0,0,rc.right-rc.left,
		rc.bottom-rc.top,hMemDC,0,0,SRCCOPY);


	SelectObject(hMemDC,hob);
	DeleteObject(hFace);
	DeleteDC(hMemDC);
	
}


void CMainWnd::OnTimer(UINT nIDEvent)
{
	switch(nIDEvent)
	{
	case 1:
		POINT pt;
		GetCursorPos(&pt);
		ScreenToClient(m_hWnd,&pt);
		if(m_bHilightTitleBar&&!PtInRegion(m_hrgnTitle,pt.x,pt.y))
		{
			m_bHilightTitleBar=FALSE;
			RECT rc;
			SetRect(&rc,5,5,168,22);
			HDC hdc=GetDC(m_hWnd);
			HBITMAP hb=LoadBitmap(hInstX,LPCTSTR(IDB_TITLE1));
			DrawTransBmpX(hdc,rc,hb,0,0,0);
			DeleteObject(hb);
			ReleaseDC(m_hWnd,hdc);
			KillTimer(m_hWnd,nIDEvent);
			
		}
		break;
	case 2://draw fps and datarate
		{
			DWORD t=GetTickCount();
			DWORD f=AVIO.GetFrameCount();
			DWORD ds=AVIO.GetDataSend();
			DWORD dr=AVIO.GetDataRcv();
			
			
			
			char sz[30];
			sprintf(sz,"%dfps",(f-m_nFrameCount)*1000/(t-m_nTimePass));
			DrawFps(sz);
			sprintf(sz,"%.1fkbps",((float)ds-m_nDataSend+(float)dr-m_nDataRcv)*8000.0/((float)t-m_nTimePass)/1024.0);
				
			DrawDataRate(sz);
			if(dr-m_nDataRcv==0)
				m_iZeroCount++;
			else
				m_iZeroCount=0;
			
			if(m_iZeroCount>5)
			{
				KillTimer(m_hWnd,2);
				MessageBox(m_hWnd,"网络不通,通话已中断","NetTalk信息",MB_OK|MB_ICONINFORMATION);
				DrawFps("");
				DrawDataRate("");
				AVIO.EndTalk();
				ShowWindow(m_vs,SW_HIDE);
				ShowWindow(m_LocalVideoWnd.m_vs,SW_HIDE);
				ShowWindow(m_RemoteVideoWnd.m_vs,SW_HIDE);
			}
			m_nFrameCount=f;
			m_nDataSend=ds;
			m_nDataRcv=dr;
			m_nTimePass=t;
			
		}
		break;
		
		
	}
}


BOOL CMainWnd::OnSetCursor(HWND hWnd, UINT nHitTest, UINT message)
{
	
	return FALSE;
}






HBRUSH CMainWnd::OnCtrlColorEdit(HDC hdc, HWND hwnd)
{
    SetTextColor(hdc,0x00ffffff);
	SetBkColor(hdc,0);
	return m_hbCtrlBg;
}



void CMainWnd::DrawFps(char* pszFps)
{
	SetDlgItemText(m_hWnd,IDC_FPS,pszFps);
	
}



//
void CMainWnd::OnAudioData(BOOL flag,CAVIOMgr* pMgr)
{
	
	if(!flag)//local
	{
		HDC hdc=GetDC(m_WaveShowIn);
		UINT len;
		char* p=pMgr->GetLocalAudio(len);
		m_WaveShowIn.Paint(hdc,p,len);
		ReleaseDC(m_WaveShowIn,hdc);
	}
	else
	{
		HDC hdc=GetDC(m_WaveShowOut);
		UINT len;
		char* p=pMgr->GetRemoteAudio(len);
		m_WaveShowOut.Paint(hdc,p,len);
		ReleaseDC(m_WaveShowOut,hdc);
	}
	
}


void CMainWnd::DrawDataRate(char* pszDataRate)
{
	SetDlgItemText(m_hWnd,IDC_DATARATE,pszDataRate);
	
}

HBRUSH CMainWnd::OnCtrlColorStatic(HDC hdc, HWND hwnd)
{
	if(hwnd==GetDlgItem(m_hWnd,IDC_FPS))
	{
		SetBkColor(hdc,0x00b9b4b3);
		SetTextColor(hdc,0x00ffffff);
		return m_hbFpsBg;
	}
	
	SetBkColor(hdc,0);
	SetTextColor(hdc,0x00aaeeff);  
	
	return m_hbCtrlBg;
}
//AVIOMgr的通知消息处理
void CMainWnd::OnIOMNotify(WPARAM wParam, LPARAM lParam)
{
	
	switch(LOWORD(wParam))
	{
	case IOMN_CALL:
		{
			sockaddr_in sc=AVIO.GetRemoteAddr();
			char sz[100];
			sprintf(sz,"%d.%d.%d.%d发出通话请求,是否接受?",sc.sin_addr.S_un.S_un_b.s_b1,
				sc.sin_addr.S_un.S_un_b.s_b2,sc.sin_addr.S_un.S_un_b.s_b3,sc.sin_addr.S_un.S_un_b.s_b4);
			if(MessageBox(m_hWnd,sz,"NetTalk收到通话请求",MB_YESNO|MB_ICONINFORMATION|MB_SYSTEMMODAL)==IDYES)
			{
				AVIO.Accept();
				ShowWindow(m_LocalVideoWnd,SW_SHOWNORMAL);
				ShowWindow(m_hWnd,SW_SHOWNORMAL);
				SetForegroundWindow(m_hWnd);
								
				
							

				m_nTimePass=GetTickCount();
				m_nDataRcv=0;

				m_nDataSend=0;
				m_nFrameCount=0;
				m_iZeroCount=0;
				SetTimer(m_hWnd,2,1000,0);

			}
			else
				AVIO.Refuse();
		}break;
	case IOMN_ACCEPT:
		{
			AVIO.OnAccept();
			ShowWindow(m_LocalVideoWnd,SW_SHOWNORMAL);
			ShowWindow(m_hWnd,SW_SHOWNORMAL);
			
			
			
			m_nTimePass=GetTickCount();
			m_nDataRcv=0;
			m_nDataSend=0;
			m_nFrameCount=0;
			m_iZeroCount=0;
			SetTimer(m_hWnd,2,1000,0);
		}
		break;
	case IOMN_END:
		{
			AVIO.EndTalk();
			KillTimer(m_hWnd,2);
			DrawFps("");
			DrawDataRate("");
			if(HIWORD(wParam)==E_USER)
			{
				
				
				
				MessageBox(m_hWnd,"对方已经结束了通话","NetTalk信息",MB_OK);
				HDC hdc=GetDC(m_hWnd);
				OnEraseBkgnd(hdc);
				ReleaseDC(m_hWnd,hdc);
				
			}
			ShowWindow(m_vs,SW_HIDE);
			ShowWindow(m_LocalVideoWnd.m_vs,SW_HIDE);
			ShowWindow(m_RemoteVideoWnd.m_vs,SW_HIDE);
			
			
		}
		break;
	case IOMN_REFUSE:
		{
			switch(HIWORD(wParam))
			{
			case R_TIMEOUT:
				MessageBox(m_hWnd,"呼叫超时,对方没有响应!","NetTalk",MB_ICONINFORMATION);
				break;
			case R_USER:

				MessageBox(m_hWnd,"您的呼叫被对方拒绝","NetTalk",MB_ICONINFORMATION);
				break;
			case R_BUSY:
				MessageBox(m_hWnd,"对方正在通话或呼叫,您的呼叫被拒绝","NetTalk",MB_ICONINFORMATION);
				break;
			}
			
		}
		break;
	case IOMN_ERR:
		{
			switch(HIWORD(wParam))
			{
			case IOME_SOCKET:
				MessageBox(m_hWnd,"Socket发生错误","NetTalk出错",MB_ICONWARNING);
				break;
			case IOME_AUDIO_IN:
				MessageBox(m_hWnd,"音频输入初始化失败","NetTalk出错",MB_ICONWARNING);
				break;
			case IOME_AUDIO_OUT:
				MessageBox(m_hWnd,"音频输出初始化失败","NetTalk出错",MB_ICONWARNING);
				break;
			case IOME_VIDEO_IN:
				MessageBox(m_hWnd,"视频输入初始化失败","NetTalk出错",MB_ICONWARNING);
				break;
			case IOME_VIDEO_OUT:
				//always good
				break;
			case IOME_AUDIO_CODEC:
				MessageBox(m_hWnd,"音频编码解码器初始化失败","NetTalk出错",MB_ICONWARNING);
				break;
			case IOME_VIDEO_CODEC:
				MessageBox(m_hWnd,"视频编码解码器初始化失败","NetTalk出错",MB_ICONWARNING);
				break;
			}
		}break;
	}
}
//////////////////
void CALLBACK CMainWnd::OutVolumeChanged( DWORD dwCurrentVolume, DWORD dwUserValue )
{
	CMainWnd* p=(CMainWnd*)dwUserValue;
	p->m_sldAudioOut.SetPos(dwCurrentVolume*100/
		(p->m_VoOutCtrl.GetMaximalVolume()-p->m_VoOutCtrl.GetMinimalVolume()));
	
}
void CALLBACK CMainWnd::InVolumeChanged( DWORD dwCurrentVolume, DWORD dwUserValue )
{
	CMainWnd* p=(CMainWnd*)dwUserValue;
	p->m_sldAudioIn.SetPos(dwCurrentVolume*100/
		(p->m_VoInCtrl.GetMaximalVolume()-p->m_VoInCtrl.GetMinimalVolume()));

}


void CMainWnd::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
	switch(lParam)
	{
	case WM_LBUTTONDBLCLK:
		{
			ShowWindow(m_hWnd,SW_SHOWNORMAL);
			SetForegroundWindow(m_hWnd);
		}
		break;
	case WM_RBUTTONDOWN:
		{
			HMENU hMenu=LoadMenu(hInstX,LPCTSTR(IDR_POP));
			HMENU hSub=GetSubMenu(hMenu,0);
			SetForegroundWindow(m_hWnd);

			POINT pt;
			GetCursorPos(&pt);
			
			DWORD dwID=TrackPopupMenu(hSub,TPM_RIGHTALIGN|TPM_BOTTOMALIGN|TPM_RETURNCMD,pt.x,pt.y,0,m_hWnd,0);
			switch(dwID)
			{
			case ID_SHOW:
				ShowWindow(m_hWnd,SW_SHOWNORMAL);
				SetForegroundWindow(m_hWnd);
				break;
			case ID_EXIT:
				SendMessage(m_hWnd,WM_CLOSE,0,0);
				break;
			case ID_ABOUT:
				SendMessage(m_hWnd,WM_COMMAND,IDC_ABOUT,0);
				break;
			case ID_CALL:
				SendMessage(m_hWnd,WM_COMMAND,IDC_CALL,0);
				break;
			case ID_H:
				SendMessage(m_hWnd,WM_COMMAND,IDC_HP,0);
				break;
			}

		}

		
	}
}
////////////////////////////////
CAboutDlg::CAboutDlg()
{
}

CAboutDlg::~CAboutDlg()
{

}

LRESULT CAboutDlg::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uMsg)
	{
	case WM_COMMAND:
		{
			switch(LOWORD(wParam))
			{
			case IDOK:
				OnOK();
				break;
			}
		}
		break;
	case WM_CLOSE:
		{
			EndDialog(m_hWnd,0);
		}
		break;
	default:
		return FALSE;
	}
	return TRUE;
}
///////////////////////////////////////

///////////////////////
CIPInput::CIPInput()
{
	m_szIP[0]=0;
	m_uPort=0;
}

CIPInput::~CIPInput()
{

}

LRESULT CIPInput::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uMsg)
	{
	case WM_COMMAND:
		{
			switch(LOWORD(wParam))
			{
			case IDC_OK:
				{
					GetDlgItemText(m_hWnd,IDC_IP,m_szIP,29);
					char sz[20];
					GetDlgItemText(m_hWnd,IDC_PORT,sz,19);
					m_uPort=(unsigned short)strtoul(sz,0,10);
					EndDialog(m_hWnd,TRUE);
				}
				break;
			case IDC_CANCEL:
				EndDialog(m_hWnd,FALSE);
				break;
			case IDC_ADDR:
				{
					HWND h=GetParent(m_hWnd);
					EndDialog(m_hWnd,FALSE);
					CAddrBook ab;
					ab.DoModal(LPCTSTR(IDD_ADDR),h);
				}
				break;
			}
		}
		break;
	case WM_INITDIALOG:
		SetDlgItemText(m_hWnd,IDC_PORT,"1159");
		break;
	case WM_CLOSE:
		EndDialog(m_hWnd,FALSE);
		break;

	
	default:
		return CDialogX::WndProc(uMsg,wParam,lParam);
	}
	return TRUE;
}
//////////////////////////////////////////


CSetupDlg::CSetupDlg()
{
}
CSetupDlg::~CSetupDlg()
{

}


LRESULT CSetupDlg::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	switch(uMsg)
	{
	case WM_INITDIALOG:
		{
			if(s.bAutoRun)
				SendMessage(GetDlgItem(m_hWnd,IDC_AUTORUN),BM_SETCHECK,BST_CHECKED,0);
			if(s.bInitShow)
				SendMessage(GetDlgItem(m_hWnd,IDC_INITSHOW),BM_SETCHECK,BST_CHECKED,0);
			if(s.bMiniHide)
				SendMessage(GetDlgItem(m_hWnd,IDC_MINIHIDE),BM_SETCHECK,BST_CHECKED,0);
		}
		return FALSE;
	case WM_COMMAND:
		{
			switch(LOWORD(wParam))
			{
			case IDC_OK:
				s.bAutoRun=FALSE;
				s.bInitShow=FALSE;
				s.bMiniHide=FALSE;
				if(BST_CHECKED==SendMessage(GetDlgItem(m_hWnd,IDC_AUTORUN),BM_GETCHECK,0,0))
				{
					s.bAutoRun=TRUE;
				}
				if(BST_CHECKED==SendMessage(GetDlgItem(m_hWnd,IDC_INITSHOW),BM_GETCHECK,0,0))
				{
					s.bInitShow=TRUE;
				}
				if(BST_CHECKED==SendMessage(GetDlgItem(m_hWnd,IDC_MINIHIDE),BM_GETCHECK,0,0))
				{
					s.bMiniHide=TRUE;
				}
				SaveSetup();
				OnOK();
				break;
			case IDC_CANCEL:
				OnCancel();
				break;
			}
		}
		break;
	default:
		return CDialogX::WndProc(uMsg,wParam,lParam);
	}
	return TRUE;
}
void CSetupDlg::LoadSetup()
{

	s.bAutoRun=(BOOL)GetPrivateProfileInt("setup","auto",0,"NetTalk.ini");
	s.bInitShow=(BOOL)GetPrivateProfileInt("setup","initshow",0,"NetTalk.ini");
	s.bMiniHide=(BOOL)GetPrivateProfileInt("setup","minihide",1,"NetTalk.ini");
}
SETUP CSetupDlg::s;
void CSetupDlg::SaveSetup()
{
	char sz[2];
	sz[1]=0;
	if(s.bAutoRun)
	{
		sz[0]='1';
		HKEY  hKey=NULL;
		DWORD dwValueType=REG_SZ;
		DWORD dwStrCb=128;
		DWORD  dwDisposition;
		char szPath[256];
		GetModuleFileName(0,szPath,255);
		if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"),0,KEY_QUERY_VALUE|KEY_SET_VALUE,&hKey)!=ERROR_SUCCESS)
		{	
			RegCreateKeyEx(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"),0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE, 
				NULL, &hKey, &dwDisposition);
			
		}
		if (RegSetValueEx(hKey,"NetTalk",0,REG_SZ,(const BYTE*)szPath,dwStrCb)!=ERROR_SUCCESS) 
		{
			RegCloseKey(hKey);
			
		}
	}
	else
	{
		sz[0]='0';
		HKEY  hKey=NULL;
		if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"),0,KEY_QUERY_VALUE|KEY_SET_VALUE,&hKey)!=ERROR_SUCCESS)
		{
			RegDeleteValue(hKey,"NetTalk");
		}

	}
	WritePrivateProfileString("setup","auto",sz,"NetTalk.ini");
	if(s.bInitShow)
		sz[0]='1';
	else
		sz[0]='0';
	WritePrivateProfileString("setup","initshow",sz,"NetTalk.ini");
	if(s.bMiniHide)
		sz[0]='1';
	else
		sz[0]='0';
	WritePrivateProfileString("setup","minihide",sz,"NetTalk.ini");
}

⌨️ 快捷键说明

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