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

📄 main.cpp

📁 一个实时音频或视频通讯程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
//NetTalk
/*------------------------------------------------------------------------------*\
 =============================
   模块名称: Main.cpp
 =============================
 
 [版权]
 
   2000-2001  115软件工厂  版权所有
                                              
\*------------------------------------------------------------------------------*/
#include "wndx.h"
#include <Windowsx.h>
#include <VFW.h>
#include <stdio.h>

#include "waveshow.h"
#include "resource.h"
#include "Splash.h"
#include "AVIOMgr.h"
#include "VolumeOutWave.h"
#include "VolumeInXXX.h"
#include "VideoWnd.h"
#include "TrayNotify.h"
#include "SlideBar.h"
#include "AddrBook.h"
#include "Main.h"


CMainWnd MainWnd;
CAVIOMgr  AVIO;

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
	
	HANDLE hMutex=CreateMutex(0,FALSE,"NETTALK_MUTEX_ONCE");
	if(hMutex)
	{
		if(GetLastError()==ERROR_ALREADY_EXISTS)
			return 0;
	}
	InitXSystem(hInstance);
	CSetupDlg::LoadSetup();
	CSplash* Splash=new CSplash(3000);
	Splash->CreateSplash(IDD_SPLASH);
	InitializeSocket();
	if(!AVIO.Init())
	{
		MessageBox(0,"NetTalk初始化失败!","NetTalk出错",MB_ICONSTOP);
		return 0;	
	}
	
	MainWnd.Create(LPCTSTR(IDD_MAIN_DLG),0);
	if(CSetupDlg::s.bInitShow)
		ShowWindow(MainWnd,SW_SHOW);
	AVIO.SetMainWnd(MainWnd);
	
	MSG msg;
	
	while(GetMessage(&msg,0,0,0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	AVIO.Destroy();

	CleanUpSocket();
	return msg.wParam;
	
}

CMainWnd::CMainWnd()
{
	m_bHilightTitleBar=0;
	SetRect(&m_rcDataRate,20,218,150,231);
	SetRect(&m_rcFps,6,175,41,189);
	SetRect(&m_rcVideo,6,28,182,172);
	
	m_bAudioInEnable=TRUE;
	m_bAudioOutEnable=TRUE;
	m_bmpVideo=0;
	m_bSendVideo=TRUE;
		
}
CMainWnd::~CMainWnd()
{
}
//主窗口消息
LRESULT CMainWnd::WndProc(UINT uMsg,WPARAM wParam,LPARAM lParam)
{
	
	switch(uMsg)
	{
	case WM_TRAYNOTIFY:
		OnTrayNotify(wParam,lParam);
		break;
	case IOM_AUDIO:
		OnAudioData((BOOL)wParam,(CAVIOMgr*)lParam);
		break;
	case WM_INITDIALOG:
		return OnInitDialog();
	case WM_DESTROY:
		OnDestroy();
		break;
	case WM_CLOSE:
		OnClose();
		break;
	case WM_LBUTTONDBLCLK:
		{
			POINT point;
			point.x=GET_X_LPARAM(lParam); 
			point.y=GET_Y_LPARAM(lParam); 
			if(PtInRect(&m_rcVideo,point))
				SendMessage(m_hWnd,WM_COMMAND,IDC_VIDEO_OUTVIEW,0);
		}
		break;
	case WM_LBUTTONDOWN:
		{
			POINT point;
			point.x=GET_X_LPARAM(lParam); 
			point.y=GET_Y_LPARAM(lParam); 
			OnLButtonDown(wParam,point);		
		}break;
	
	case WM_LBUTTONUP:
		{
			POINT point;
			point.x=GET_X_LPARAM(lParam); 
			point.y=GET_Y_LPARAM(lParam); 
			OnLButtonUp(wParam,point);	
		}break;
	case WM_MOUSEMOVE:
		{
			POINT point;
			point.x=GET_X_LPARAM(lParam); 
			point.y=GET_Y_LPARAM(lParam); 
			OnMouseMove(wParam,point);	
			
		}break;
	case WM_COMMAND:
		return OnCommand(wParam,lParam);
		break;
	
	case WM_ERASEBKGND:
		OnEraseBkgnd((HDC)wParam);
		return TRUE;
		break;	
	
	case WM_TIMER:
		OnTimer(wParam);
		break;
	case WM_SETCURSOR:
		return OnSetCursor((HWND)wParam,LOWORD(lParam),HIWORD(lParam));
		break;
	case WM_CTLCOLOREDIT:
		return (LRESULT)OnCtrlColorEdit((HDC)wParam,(HWND)lParam);
		break;
	case WM_CTLCOLORSTATIC:
		return (LRESULT)OnCtrlColorStatic((HDC)wParam,(HWND)lParam);	
		break;
	
	case IOM_NOTIFY:
		OnIOMNotify(wParam,lParam);
		break;
	case WM_SLD:
		{
			if(((HWND)lParam)==((HWND)m_sldAudioOut))
			{
				m_VoOutCtrl.SetCurrentVolume((m_VoOutCtrl.GetMaximalVolume()-m_VoOutCtrl.GetMinimalVolume())*m_sldAudioOut.GetPos()/100);
			}
			else
			if(((HWND)lParam)==((HWND)m_sldAudioIn))
			{
				m_VoInCtrl.SetCurrentVolume((m_VoInCtrl.GetMaximalVolume()-m_VoInCtrl.GetMinimalVolume())*m_sldAudioIn.GetPos()/100);
			}
			else
			if(((HWND)lParam)==((HWND)m_sldVideoQ))
			{
				m_VQ=m_sldVideoQ.GetPos();
				AVIO.SetVideoQuality(m_VQ);
			}
		}
		break;
	default:
		return CDialogX::WndProc(uMsg,wParam,lParam);
	}
	return TRUE;

}


BOOL CMainWnd::OnInitDialog()
{
	HDC hdc=GetDC(m_hWnd);
	m_bmpVideo=CreateCompatibleBitmap(hdc,176,144);
	ReleaseDC(m_hWnd,hdc);
//set window region
	POINT pt[13]={{0,10},{10,0},{262,0},{262,32},{269,39},{269,160},
	{265,164},{265,228},{256,237},{20,237},{11,228},{11,221},{0,210}};
	HRGN hRgn=CreatePolygonRgn(pt,13,ALTERNATE);	
	SetWindowRgn(m_hWnd,hRgn,FALSE);	
	
//set window style
	DWORD dwStyle=GetWindowLong(m_hWnd,GWL_STYLE);
	SetWindowLong(m_hWnd,GWL_STYLE,dwStyle|WS_SYSMENU|WS_MINIMIZEBOX);
//set window caption and icon
	SetWindowText(m_hWnd,"NetTalk");		
	SendMessage(m_hWnd,WM_SETICON,ICON_BIG,(LPARAM)LoadIcon(hInstX,LPCTSTR(IDI_MAIN)));
//title bar region
	POINT pt2[5]={{11,4},{170,4},{151,23},{4,23},{4,11}};
	m_hrgnTitle=CreatePolygonRgn(pt2,5,ALTERNATE);

	m_TrayNotify.SetHwnd(m_hWnd);
	m_TrayNotify.SetIcon(LoadIcon(hInstX,LPCTSTR(IDI_MAIN)));
	m_TrayNotify.SetTip("NetTalk-115软件工厂");
	m_TrayNotify.SetMsg(WM_TRAYNOTIFY);
	m_TrayNotify.SetID(1);
	m_TrayNotify.ShowIcon(TRUE);
	
//
	m_hbCtrlBg=CreateSolidBrush(0);
	m_hbFpsBg=CreateSolidBrush(0x00b9b4b3);

	m_btnCall.LoadBitmaps(IDB_CALL1,IDB_CALL2,IDB_CALL3);
	m_btnCall.Associate(m_hWnd,IDC_CALL);
	SetWindowPos(m_btnCall,0,0,0,64,24,SWP_NOMOVE);

	m_btnHang.LoadBitmaps(IDB_HANG1,IDB_HANG2,IDB_HANG3);
	m_btnHang.Associate(m_hWnd,IDC_HANG);
	SetWindowPos(m_btnHang,0,0,0,64,24,SWP_NOMOVE);

	m_btnAddr.LoadBitmaps(IDB_ADDR1,IDB_ADDR2,IDB_ADDR3);
	m_btnAddr.Associate(m_hWnd,IDC_ADDR);
	SetWindowPos(m_btnAddr,0,0,0,64,24,SWP_NOMOVE);

	m_btnSetup.LoadBitmaps(IDB_SETUP1,IDB_SETUP2,IDB_SETUP3);
	m_btnSetup.Associate(m_hWnd,IDC_SETUP);
	SetWindowPos(m_btnSetup,0,0,0,64,24,SWP_NOMOVE);
	
	m_btnClose.LoadBitmaps(IDB_CLOSE1,IDB_CLOSE2,IDB_CLOSE3);
	m_btnClose.Associate(m_hWnd,IDC_CLOSE);
	SetWindowPos(m_btnClose,0,0,0,11,11,SWP_NOMOVE);

	m_btnMin.LoadBitmaps(IDB_MIN1,IDB_MIN2,IDB_MIN3);
	m_btnMin.Associate(m_hWnd,IDC_MIN);
	SetWindowPos(m_btnMin,0,0,0,11,11,SWP_NOMOVE);

	m_btnHelp.LoadBitmaps(IDB_HELP1,IDB_HELP2,IDB_HELP3);
	m_btnHelp.Associate(m_hWnd,IDC_HP);
	SetWindowPos(m_btnHelp,0,0,0,11,11,SWP_NOMOVE);

	m_btnAbout.LoadBitmaps(IDB_ABOUT1,IDB_ABOUT2,IDB_ABOUT3);
	m_btnAbout.Associate(m_hWnd,IDC_ABOUT);
	SetWindowPos(m_btnAbout,0,0,0,11,11,SWP_NOMOVE);

	m_btnLocal.LoadBitmaps(IDB_VIDEO_LOCAL1,IDB_VIDEO_LOCAL2,IDB_VIDEO_LOCAL3);
	m_btnLocal.Associate(m_hWnd,IDC_VIDEO_LOCAL);
	SetWindowPos(m_btnLocal,0,0,0,15,15,SWP_NOMOVE);

	m_btnOnoff.LoadBitmaps(IDB_VIDEO_ONOFF1,IDB_VIDEO_ONOFF2,IDB_VIDEO_ONOFF3);
	m_btnOnoff.Associate(m_hWnd,IDC_VIDEO_ONOFF);
	SetWindowPos(m_btnOnoff,0,0,0,15,15,SWP_NOMOVE);

	m_btnOutview.LoadBitmaps(IDB_VIDEO_OUTVIEW1,IDB_VIDEO_OUTVIEW2,IDB_VIDEO_OUTVIEW3);
	m_btnOutview.Associate(m_hWnd,IDC_VIDEO_OUTVIEW);
	SetWindowPos(m_btnOutview,0,0,0,15,15,SWP_NOMOVE);

	RECT rc;
	SetRect(&rc,174,180,250,188);
	m_sldAudioOut.Create(rc,m_hWnd,0);
	
	SetRect(&rc,174,195,250,203);
	m_sldAudioIn.Create(rc,m_hWnd,0);
	
	SetRect(&rc,51,194,141,203);
	m_sldVideoQ.Create(rc,m_hWnd,0);
	

	
	SetRect(&rc,164,211,202,229);
	m_WaveShowOut.Create(rc,m_hWnd);
	
	SetRect(&rc,218,211,256,229);
	m_WaveShowIn.Create(rc,m_hWnd);

	m_LocalVideoWnd.Create(IDD_VIDEO,m_hWnd,TRUE);
	m_RemoteVideoWnd.Create(IDD_VIDEO,m_hWnd,FALSE);
	GetWindowRect(m_hWnd,&rc);
	SetWindowPos(m_LocalVideoWnd,0,rc.right+20,rc.top,0,0,SWP_NOSIZE);
	SetWindowPos(m_RemoteVideoWnd,0,rc.left-200,rc.top,0,0,SWP_NOSIZE);
	////////////////////
	char szTip[30];
	INITCOMMONCONTROLSEX iccex; 
    
    TOOLINFO ti;
    
       /* INITIALIZE COMMON CONTROLS */
    iccex.dwICC = ICC_WIN95_CLASSES;
    iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
    InitCommonControlsEx(&iccex);
	
    /* CREATE A TOOLTIP WINDOW */
    m_hwndTT = CreateWindowEx(WS_EX_TOPMOST,
        TOOLTIPS_CLASS,
        NULL,
        WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP,		
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        CW_USEDEFAULT,
        m_hWnd,
        NULL,
        hInstX,
        NULL
        );

    SetWindowPos(m_hwndTT,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
  	
    /* INITIALIZE MEMBERS OF THE TOOLINFO STRUCTURE */
    ti.cbSize = sizeof(TOOLINFO);
    ti.uFlags = TTF_SUBCLASS;
    
    ti.hinst = hInstX;
    ti.uId = 0;
	ti.lpszText = szTip;
      //
    ti.hwnd = m_btnClose;
	GetClientRect(m_btnClose,&ti.rect);
	strcpy(szTip,"关闭NetTalk");
    SendMessage(m_hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
	ti.hwnd = m_btnMin;
	GetClientRect(m_btnMin,&ti.rect);
	strcpy(szTip,"最小化");
    SendMessage(m_hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
	ti.hwnd = m_btnHelp;
	GetClientRect(m_btnHelp,&ti.rect);
	strcpy(szTip,"帮助");
    SendMessage(m_hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
	ti.hwnd = m_btnAbout;
	GetClientRect(m_btnAbout,&ti.rect);
	strcpy(szTip,"关于...");
    SendMessage(m_hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
	ti.hwnd = m_btnLocal;
	GetClientRect(m_btnLocal,&ti.rect);
	strcpy(szTip,"本地视频");
    SendMessage(m_hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
	ti.hwnd = m_btnOutview;
	GetClientRect(m_btnOutview,&ti.rect);
	strcpy(szTip,"对方视频");
    SendMessage(m_hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
	ti.hwnd = m_btnOnoff;
	GetClientRect(m_btnOnoff,&ti.rect);
	strcpy(szTip,"传送/不传送本地视频");
    SendMessage(m_hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
	ti.hwnd = m_sldAudioIn;
	GetClientRect(m_sldAudioIn,&ti.rect);
	strcpy(szTip,"调节麦克风音量");
    SendMessage(m_hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
	ti.hwnd = m_sldAudioOut;
	GetClientRect(m_sldAudioOut,&ti.rect);
	strcpy(szTip,"调节输出音量");
    SendMessage(m_hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
	ti.hwnd = m_sldVideoQ;
	GetClientRect(m_sldVideoQ,&ti.rect);
	strcpy(szTip,"调节视频质量");
    SendMessage(m_hwndTT, TTM_ADDTOOL, 0, (LPARAM) (LPTOOLINFO) &ti);
//vol
	m_VoOutCtrl.RegisterNotificationSink(OutVolumeChanged,(DWORD)this);
	m_VoInCtrl.RegisterNotificationSink(InVolumeChanged,(DWORD)this);
	m_sldAudioOut.SetPos(100*m_VoOutCtrl.GetCurrentVolume()/
		(m_VoOutCtrl.GetMaximalVolume()-m_VoOutCtrl.GetMinimalVolume()));
	m_sldAudioIn.SetPos(100*m_VoInCtrl.GetCurrentVolume()/
		(m_VoInCtrl.GetMaximalVolume()-m_VoInCtrl.GetMinimalVolume()));
	
	m_VQ=GetPrivateProfileInt("Video","Q",50,"NetTalk.ini");
	if(m_VQ>100||m_VQ<0)
		m_VQ=100;
	AVIO.SetVideoQuality(m_VQ);
	m_sldVideoQ.SetPos(m_VQ);
	
	m_vs.Create(m_rcVideo,m_hWnd);

	AVIO.SetRemoteVideoRcvWnd(m_vs);
	AVIO.SetLocalVideoRcvWnd(m_LocalVideoWnd.m_vs);
	AVIO.SetLocalAudioRcvWnd(m_hWnd);
	AVIO.SetRemoteAudioRcvWnd(m_hWnd);

	MoveWindow(GetDlgItem(m_hWnd,IDC_DATARATE),m_rcDataRate.left,m_rcDataRate.top,m_rcDataRate.Width(),m_rcDataRate.Height(),false);
	MoveWindow(GetDlgItem(m_hWnd,IDC_FPS),m_rcFps.left,m_rcFps.top,m_rcFps.Width(),m_rcFps.Height(),false);
	return FALSE ;

}

void CMainWnd::OnDestroy()
{
	
	if(m_hbCtrlBg)
		DeleteObject(m_hbCtrlBg);
	if(m_hbFpsBg)
		DeleteObject(m_hbFpsBg);
	if(m_bmpVideo)
		DeleteObject(m_bmpVideo);
	char s[5];
	sprintf(s,"%d",m_VQ);
	WritePrivateProfileString("Video","Q",s,"NetTalk.ini");
}

void CMainWnd::OnClose()
{
	if(AVIO.GetStatus()==STA_TALK)
	{
		if(MessageBox(m_hWnd,"您正在进行通话,而且如果你关闭NetTalk的话,会收不到别人的请求,\n真的要结束通话并退出吗?","NetTalk警告",MB_YESNO|MB_ICONWARNING)==IDYES)
		{
			DestroyWindow(m_hWnd);
			PostQuitMessage(0);
		}
	}
	else
	if(MessageBox(m_hWnd,"你将关闭NetTalk,这样会无法收到别人的呼叫请求,\n真的要退出吗?","NetTalk警告",MB_YESNO|MB_ICONWARNING)==IDYES)
	{
		DestroyWindow(m_hWnd);
		PostQuitMessage(0);
	}
}

void CMainWnd::OnLButtonDown(UINT nFlags, POINT &point)
{
	if(PtInRegion(m_hrgnTitle,point.x,point.y))
	{
		SetCapture(m_hWnd);
		
		RECT rc;
		GetWindowRect(m_hWnd,&rc);
		MSG msg;
		while(GetMessage(&msg, NULL, 0, 0))
		{
			if (GetCapture()!=m_hWnd)
			{
				DispatchMessage(&msg);
				break;
			}
			switch(msg.message)
			{
			case WM_MOUSEMOVE:
				{
					POINT pt;
					pt.x=GET_X_LPARAM(msg.lParam);
					pt.y=GET_Y_LPARAM(msg.lParam);
					rc.left+=pt.x-point.x;
					rc.top+=pt.y-point.y;
					SetWindowPos(m_hWnd,0,rc.left,
						rc.top,0,0,SWP_NOSIZE);
				}
				break;
			case WM_LBUTTONUP:
				
				goto EXITLOOP;					
				
			default:
				DispatchMessage(&msg);
				break;
				
			}
		}
EXITLOOP:
		ReleaseCapture();
	}
	
}

void CMainWnd::OnLButtonUp(UINT nFlags, POINT &point)
{

}

void CMainWnd::OnMouseMove(UINT nFlags, POINT point)
{
	if(PtInRegion(m_hrgnTitle,point.x,point.y)&&!m_bHilightTitleBar)
	{
		RECT rc;
		SetRect(&rc,5,5,168,22);
		m_bHilightTitleBar=TRUE;
		HDC hdc=GetDC(m_hWnd);
		HBITMAP hb=LoadBitmap(hInstX,LPCTSTR(IDB_TITLE2));
		DrawTransBmpX(hdc,rc,hb,0,0,0);
		DeleteObject(hb);
		ReleaseDC(m_hWnd,hdc);
		SetTimer(m_hWnd,1,50,0);
		
	}
	
}

BOOL CMainWnd::OnCommand(WPARAM wParam, LPARAM lParam)
{
	switch(LOWORD(wParam))
	{
	case IDC_CLOSE:
		OnClose();
		break;
	case IDC_MIN:
		ShowWindow(m_hWnd,SW_MINIMIZE);
		if(CSetupDlg::s.bMiniHide)
			ShowWindow(m_hWnd,SW_HIDE);
		break;
	case IDC_HP:
		{
			char szPath[256];
			GetModuleFileName(0,szPath,255);
			int i;
			for(i=strlen(szPath);i>0;i--)
			{
				if(szPath[i]=='\\')
				{
					szPath[i+1]=0;
					break;
				}
			}
			strcpy(szPath+strlen(szPath),"help\\help.htm");
			ShellExecute(0,"open",szPath,0,0,SW_SHOWNORMAL);
		}
		break;
	case IDC_ABOUT:
		{
			CAboutDlg abt;
			abt.DoModal(LPCTSTR(IDD_ABOUT_DLG),m_hWnd);
		}
		break;
	case IDC_ADDR:
		{
			CAddrBook ab;
			ab.DoModal(LPCTSTR(IDD_ADDR),m_hWnd);
		}
		break;
	case 0:
		{
			if(!AVIO.Call((char*)lParam,PORT))
					MessageBox(m_hWnd,"无法完成您的呼叫请求!","NetTalk",MB_OK|MB_ICONWARNING);
		}
		break;
	case IDC_CALL:
		{
			CIPInput ip;
			if(ip.DoModal(LPCTSTR(IDD_IPINPUT),m_hWnd))
			{
				SendMessage(m_hWnd,WM_COMMAND,0,(LPARAM)ip.m_szIP);
			}
		}
		break;
	case IDC_HANG:
		{
			if(AVIO.GetStatus()==STA_TALK)
			if(MessageBox(m_hWnd,"真的要结束通话吗?","NetTalk警告",MB_YESNO|MB_ICONWARNING)==IDYES)
			{
				AVIO.EndTalk();
				ShowWindow(m_vs,SW_HIDE);
				ShowWindow(m_LocalVideoWnd.m_vs,SW_HIDE);
				ShowWindow(m_RemoteVideoWnd.m_vs,SW_HIDE);
				KillTimer(m_hWnd,2);
				DrawFps("");
				DrawDataRate("");				
			}
		}
		break;
	case IDC_SETUP:
		{
			CSetupDlg sd;
			sd.DoModal(LPCTSTR(IDD_SETUP),m_hWnd);
		}
		break;
	case IDC_VIDEO_LOCAL:
		{
			if(IsWindowVisible(m_LocalVideoWnd))
			{
				AVIO.EnablePreview(FALSE);
				ShowWindow(m_LocalVideoWnd,SW_HIDE);
				
			}
			else
			{
				ShowWindow(m_LocalVideoWnd,SW_SHOW);
				AVIO.EnablePreview(TRUE);
				
			}
		}
		break;
	case IDC_VIDEO_OUTVIEW:
		{
			if(IsWindowVisible(m_RemoteVideoWnd))
			{
				ShowWindow(m_RemoteVideoWnd,SW_HIDE);
				AVIO.SetRemoteVideoRcvWnd(m_vs);

⌨️ 快捷键说明

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