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