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

📄 vfwdialogdlg.cpp

📁 一个简单的视频会议VC++MFC工程文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// GraghDialogDlg.cpp : implementation file
//

#include "stdafx.h"
#include "GraghDialog.h"
#include "GraghDialogDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif


BOOL	m_bExitNow	= FALSE;


/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	CButtonST	m_OK;
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	DDX_Control(pDX, IDOK, m_OK);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void CAboutDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	CDialog::OnLButtonDown(nFlags, point);
	PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x,point.y)); 
}
/////////////////////////////////////////////////////////////////////////////
// CGraghDialogDlg dialog

CGraghDialogDlg::CGraghDialogDlg(CWnd* pParent /*=NULL*/)
	: CDialog(IDD, pParent)
{
	//{{AFX_DATA_INIT(CGraghDialogDlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CGraghDialogDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CGraghDialogDlg)
	DDX_Control(pDX, IDC_QUIT, m_Quit);
	DDX_Control(pDX, IDC_VIEWLOCAL, m_VLocal);
	DDX_Control(pDX, IDC_ABOUT, m_About);
	DDX_Control(pDX, IDCANCEL, m_Cancel);
	DDX_Control(pDX, IDOK, m_OK);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CGraghDialogDlg, CDialog)
	//{{AFX_MSG_MAP(CGraghDialogDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_ABOUT, OnAbout)
	ON_BN_CLICKED(IDC_VIEWLOCAL, OnViewlocal)
	ON_WM_LBUTTONDOWN()
	ON_WM_MOUSEMOVE()
	ON_WM_ERASEBKGND()
	ON_MESSAGE(WM_TRAYNOTIFY,OnTrayNotify)
	ON_BN_CLICKED(IDC_QUIT, OnQuit)
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CGraghDialogDlg message handlers

BOOL CGraghDialogDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
//InitializeSkin(_T("XPCorona.ssk"));
	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	HANDLE h=(HANDLE)1;
	::SetProp(m_hWnd,_T("视频会议系统"),h);

	SetMainBmp (IDB_MAIN) ;
	SetWindowText(_T("视频会议系统"));
	m_OK.SetIcon (IDI_CALLIN,IDI_CALL,32,32);
	m_OK.AddToolTip (_T("呼叫"));
	m_About.SetIcon (IDI_ABOUTIN,IDI_ABOUTOUT,10,10);
	m_About.AddToolTip(_T("关于"));
	m_Quit.SetIcon (IDI_QUITIN,IDI_QUIT,10,10);
	m_Quit.AddToolTip(_T("退出"));
	m_Cancel.SetIcon (IDI_MININ,IDI_MIN,10,10);
	m_Cancel.AddToolTip(_T("缩小到系统托盘"));
	m_hdc = GetDC()->m_hDC ;
	m_Retry = 0;
	m_VLocal.AddToolTip (_T("该窗口显示本地/远程视频"));

	m_VLocal.EnableWindow (FALSE);
	m_bVidInit	= FALSE;
	m_bStart	= FALSE;
	m_AutoAccept= FALSE;

	m_bExitNow	= FALSE;
	m_VidLocal	= TRUE;
	
	m_AFrames = 0;m_ABytesSent=0;
	m_VFrames	= 0;m_VBytesSent = 0;

	m_Video_x=7;
	m_Video_y=30;

	//make the title bar region
	POINT pt[4];
	pt[0].x=25;		pt[0].y=5;
	pt[1].x=162;	pt[1].y=5;
	pt[2].x=144;	pt[2].y=23;
	pt[3].x=7;		pt[3].y=23;
	m_hTitleRgn	=	CreatePolygonRgn(pt,4,ALTERNATE);

	pt[0].x =m_Video_x;		pt[0].y =m_Video_y;
	pt[1].x=m_Video_x+176;	pt[1].y =m_Video_y;
	pt[2].x=m_Video_x+176;	pt[2].y =m_Video_y+144;
	pt[3].x =m_Video_x;		pt[3].y =m_Video_y+144;
	m_hVideoRgn	=	CreatePolygonRgn(pt,4,ALTERNATE);

	pt[0].x =10;	pt[0].y =179;
	pt[1].x=249;	pt[1].y =179;
	pt[2].x=249;	pt[2].y =198;
	pt[3].x =10;	pt[3].y =198;
	m_hMesgRgn = 	CreatePolygonRgn(pt,4,ALTERNATE);

	// Setup the parent for differnt datagram sockets
	dcontrol.SetParent(this);
	dcontrol.CreateSocket(PORT_CONTROL,TYPE_CONTROL);

	m_VUnComped =NULL;
	m_VComped	=NULL;
	m_AUnComped =NULL;
	m_AComped	=NULL;

	m_vidcap=NULL;
	m_bmpinfo=	NULL;
	hdib	=	NULL;
//	setup Video Codec
	m_VideoCodec.SetCodecType (MS_MPEG4V3);
	m_VideoCodec.SetParent (this);

	m_RemoteDlg.Create (IDD_REMOTE,this);
	m_RemoteDlg.SetParent (this);
	m_RemoteDlg.ShowWindow (SW_HIDE);
	m_AddrBook = NULL;	
	m_TextChatDlg.Create (IDD_TEXTCHAT,this);
	m_TextChatDlg.SetParent (this);
	m_TextChatDlg.ShowWindow (SW_HIDE);

	m_AudioPlay=new CAudioPlay(this);
	m_AudioPlay->CreateThread();
	if(m_AudioPlay)
	{
		m_AudioPlay->PostThreadMessage(WM_PLAYSOUND_STARTPLAYING,0,0);
	}
	m_AudioRec=new CAudioRec(this);
	m_AudioRec->CreateThread();

	m_State=STATE_IDLE;

	SetTimer(1,2000,NULL);
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CGraghDialogDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CGraghDialogDlg::OnPaint() 
{
	CPaintDC dc(this);
	if (IsIconic())
	{
		 // device context for painting
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		DrawTitleBar(m_hdc);
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CGraghDialogDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

BOOL CGraghDialogDlg::InitCap()
{
	TRACE("CGraghDialogDlg::InitCap\n");
	if(m_bVidInit)	return TRUE;

	m_vidcap=new VideoCapture;
	m_vidcap->SetDialog(this);

	if(m_vidcap->Initialize()) // success
	{
		m_bmpinfo=&(m_vidcap->m_bmpinfo);
		m_bVidInit =TRUE;
	}else
	{
		if(m_bmpinfo) 		delete m_bmpinfo;
		m_bVidInit = FALSE;
		m_bmpinfo=new BITMAPINFO;
		m_bmpinfo->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
		m_bmpinfo->bmiHeader.biWidth=IMAGE_WIDTH;
		m_bmpinfo->bmiHeader.biHeight=IMAGE_HEIGHT;
		m_bmpinfo->bmiHeader.biPlanes=1;
		m_bmpinfo->bmiHeader.biBitCount=24;
		m_bmpinfo->bmiHeader.biCompression=0;
		m_bmpinfo->bmiHeader.biSizeImage=IMAGE_WIDTH*IMAGE_HEIGHT*3;
		m_bmpinfo->bmiHeader.biXPelsPerMeter=0;
		m_bmpinfo->bmiHeader.biYPelsPerMeter=0;
		m_bmpinfo->bmiHeader.biClrUsed=0;
		m_bmpinfo->bmiHeader.biClrImportant=0;
	}
	return m_bVidInit;
}

void	CGraghDialogDlg::DestroyCap()
{
	TRACE("CGraghDialogDlg::DestroyCap\n");
	if(m_vidcap)
	{
		m_vidcap->StopCapture ();
		m_vidcap->Destroy ();
		delete m_vidcap;
		m_vidcap=NULL;
	}
	if(m_bmpinfo  )
	{
		if(!m_bVidInit)	delete m_bmpinfo;
		m_bmpinfo=NULL;
	}
	m_bVidInit=FALSE;
}

BOOL	CGraghDialogDlg::InitDib()
{
	TRACE("CGraghDialogDlg::InitDib\n");
	if(!hdib)
	{
		if((hdib=DrawDibOpen())!=NULL)
		{
			DrawDibBegin(hdib,
				m_hdc,
				-1,				// don't stretch
				-1,				// don't stretch
				&m_bmpinfo->bmiHeader,
				IMAGE_WIDTH,         // width of image
				IMAGE_HEIGHT,        // height of image
				0				
				);
			return TRUE;
		}
	}
	return TRUE;
}
void	CGraghDialogDlg::DestroyDib()
{
	TRACE("CGraghDialogDlg::DestroyDib\n");
	if(hdib!=NULL)
	{
		DrawDibEnd(hdib);
		DrawDibClose(hdib);
		hdib=NULL;
	}
}

BOOL CGraghDialogDlg::StartConference()
{
	BOOL	ret=TRUE;
	TRACE("CGraghDialogDlg::StartConference\n");
	m_OK.EnableWindow (TRUE);
//	if(!m_bStart)	return TRUE; //not started yet
	if(m_State == STATE_IDLE || m_State == STATE_CONNECTED)	
		return FALSE; //timeout and rejected or already started
	if(!m_VideoCodec.Init ()) return FALSE;
	
	daudio.SetParent(this);
	dvideo.SetParent(this);
	dtext.SetParent(this);
	ret = InitCap() ;
	ret = InitDib() && ret;
	if( !dtext.CreateSocket(PORT_TEXT,TYPE_TEXT) ||
		!daudio.CreateSocket(PORT_AUDIO,TYPE_AUDIO) ||
		!dvideo.CreateSocket(PORT_VIDEO,TYPE_VIDEO)
		)
	{
		DestroyConference();
		return FALSE;
	}

	if(m_vidcap && m_bVidInit)		
		ret =  m_vidcap->StartCapture () && ret;

	m_VUnComped = new char[m_bmpinfo->bmiHeader .biSizeImage];
	m_VComped	= new char[m_bmpinfo->bmiHeader .biWidth * m_bmpinfo->bmiHeader .biHeight ];
	m_AUnComped = new char[SIZE_AUDIO_FRAME];
	m_AComped	= new char[SIZE_AUDIO_PACKED];

	if(!m_VUnComped || !m_VComped || !m_AUnComped || !m_AComped)	
	{
		AfxMessageBox("分配视频压缩/解压缩内存出错!");
		if(m_VUnComped)	delete []m_VUnComped;
		if(m_VComped)	delete []m_VComped;
		if(m_AUnComped) delete []m_AUnComped;
		if(m_AComped)	delete []m_AComped;
		DestroyConference();
		return FALSE;
	}
	ZeroMemory(m_VUnComped,m_bmpinfo->bmiHeader .biSizeImage );
	ZeroMemory(m_VComped,m_bmpinfo->bmiHeader .biWidth * m_bmpinfo->bmiHeader .biHeight );
	ZeroMemory(m_AUnComped,SIZE_AUDIO_FRAME);
	ZeroMemory(m_AComped,SIZE_AUDIO_PACKED);	

	if(m_AudioRec)
		m_AudioRec->PostThreadMessage(WM_RECORDSOUND_STARTRECORDING,0,0);
	TRACE("CGraghDialogDlg::StartConference->InitVideoCodec,InitCap,InitDib,Socket,AV Memory Alloc,Start AudioRec OK\n");
//	if(m_AudioPlay)
//	{
//		m_AudioPlay->PostThreadMessage(WM_PLAYSOUND_STOPPLAYING,0,0);
//		m_AudioPlay->PostThreadMessage(WM_PLAYSOUND_STARTPLAYING,0,0);
//	}
	m_bExitNow = FALSE;
	m_bStart = TRUE;
	m_VLocal.EnableWindow (TRUE);
	m_OK.SetIcon (IDI_HANGIN,IDI_HANG,32,32);
	m_OK.AddToolTip (_T("断开"));
	RECT rc,rcrd;;
	GetClientRect(&rc);
	ClientToScreen (&rc);
	m_RemoteDlg.GetClientRect (&rcrd);
	if(rc.left <(rcrd.right -rcrd.left ))
		::SetWindowPos (m_RemoteDlg.m_hWnd,HWND_TOP,rc.right+1 ,rc.top ,m_bmpinfo->bmiHeader.biWidth+8 ,m_bmpinfo->bmiHeader.biHeight +24 ,0);
	else
		::SetWindowPos (m_RemoteDlg.m_hWnd,HWND_TOP,rc.left- m_bmpinfo->bmiHeader.biWidth-8,rc.top ,m_bmpinfo->bmiHeader.biWidth+8 ,m_bmpinfo->bmiHeader.biHeight +24,0);

⌨️ 快捷键说明

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