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