📄 vfwdialogdlg.cpp
字号:
// 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 + -