www.pudn.com > vc-network-communication.rar > Main.cpp
//NetTalk
/*------------------------------------------------------------------------------*\
=============================
模块名称: Main.cpp
=============================
[版权]
2000-2002 115软件工厂 版权所有
\*------------------------------------------------------------------------------*/
#include "wndx.h"
#include
#include
#include
#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 "GraphDlg.h"
#include "RippleWnd.h"
#include "NewMsgBox.h"
#include "MsgTalk.h"
#include "Main.h"
/*------------------------------------------------------------------------------*/
#define PORT 1159//the default port is 1159
CMainWnd MainWnd;
CAVIOMgr AVIO;
SETUP CSetupDlg::Setup;
/*------------------------------------------------------------------------------*/
//
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
//初始化WndX系统
InitXSystem(hInstance);
/* INITIALIZE COMMON CONTROLS */
INITCOMMONCONTROLSEX iccex;
iccex.dwICC = ICC_WIN95_CLASSES;
iccex.dwSize = sizeof(INITCOMMONCONTROLSEX);
InitCommonControlsEx(&iccex);
//确保只有一个实例
HANDLE hMutex=CreateMutex(0,FALSE,"NETTALK_MUTEX_ONCE");
if(hMutex)
{
if(GetLastError()==ERROR_ALREADY_EXISTS)
return 0;
}
//显示软件封面
CSplash* Splash=new CSplash(3000);
Splash->CreateSplash(IDD_SPLASH);
//初始化Socket
InitializeSocket();
//初始化AVIO(将Socket绑定到某个Port)
if(!AVIO.Init(PORT))
{
//如果失败,退出
CMsgBox::MessageBox(0,IDS_ERR_INIT,IDS_ERR,0,IDI_ERR);
return 0;
}
//创建主窗口
MainWnd.Create(LPCTSTR(IDD_MAIN_DLG),0);
//
AVIO.SetMainWnd(MainWnd);
MSG msg;
while(GetMessage(&msg,0,0,0))
{
PreTranslateMessageX(&msg);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
AVIO.Destroy();
CleanUpSocket();
return msg.wParam;
}
/*------------------------------------------------------------------------------*/
CMainWnd::CMainWnd()
{
m_bHilightTitleBar=0;
SetRect(&m_rcDataRate,20,218,140,231);
SetRect(&m_rcFps,10,175,45,189);
SetRect(&m_rcVideo,6,28,182,172);
m_bmpVideo=0;
m_bSendVideo=TRUE;
}
/*------------------------------------------------------------------------------*/
CMainWnd::~CMainWnd()
{
}
/*------------------------------------------------------------------------------*/
//主窗口消息
LRESULT CMainWnd::WndProc(UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch(uMsg)
{
case WM_HOTKEY://热键弹出
if(wParam==1)
{
ShowWindow(m_hWnd,SW_SHOWNORMAL);
SetForegroundWindow(m_hWnd);
SetActiveWindow(m_hWnd);
}
break;
case WM_USER_SETUP:
OnSetup((SETUP*)lParam);
break;
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_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;
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);
//initialize buttons(load the bitmaps,set the position)
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_ONOFF4,IDB_VIDEO_ONOFF5,IDB_VIDEO_ONOFF6);
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);
m_btnMsg.LoadBitmaps(IDB_MSG1,IDB_MSG2,IDB_MSG3);
m_btnMsg.Associate(m_hWnd,IDC_MSG);
SetWindowPos(m_btnMsg,0,0,0,15,15,SWP_NOMOVE);
//initialize the slide bar
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);
//initialize the wave show
SetRect(&rc,164,211,202,229);
m_WaveShowOut.Create(rc,m_hWnd);
SetRect(&rc,218,211,256,229);
m_WaveShowIn.Create(rc,m_hWnd);
//Create the video wnd
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-100,0,0,SWP_NOSIZE);
SetWindowPos(m_RemoteVideoWnd,0,rc.left-200,rc.top,0,0,SWP_NOSIZE);
//Create the txt chat wnd
m_MsgTalk.Create(m_hWnd);
SetWindowPos(m_MsgTalk,0,rc.right+20,rc.top+100,0,0,SWP_NOSIZE);
//add the tooltips for ctrls
char szTip[30];
TOOLINFO ti;
/* 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_btnMsg;
GetClientRect(m_btnMsg,&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);
//volume control,
m_VoOutCtrl.RegisterNotificationSink(OutVolumeChanged,(DWORD)this);
m_VoInCtrl.RegisterNotificationSink(InVolumeChanged,(DWORD)this);
if(m_VoOutCtrl.GetMaximalVolume()-m_VoOutCtrl.GetMinimalVolume())
m_sldAudioOut.SetPos(100*m_VoOutCtrl.GetCurrentVolume()/
(m_VoOutCtrl.GetMaximalVolume()-m_VoOutCtrl.GetMinimalVolume()));
if(m_VoInCtrl.GetMaximalVolume()-m_VoInCtrl.GetMinimalVolume())
m_sldAudioIn.SetPos(100*m_VoInCtrl.GetCurrentVolume()/
(m_VoInCtrl.GetMaximalVolume()-m_VoInCtrl.GetMinimalVolume()));
//get the video quality from the ini file
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);
//create the video display wnd
m_vs.Create(m_rcVideo,m_hWnd);
//to get the data from AVIO,set some wnds related to AVIO
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);
//load the setup
CSetupDlg::LoadSetup();
OnSetup(&CSetupDlg::Setup);
if(CSetupDlg::Setup.bInitShow)
ShowWindow(m_hWnd,SW_SHOW);
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");
}
/*------------------------------------------------------------------------------*/
//when close ,warning
void CMainWnd::OnClose()
{
if(AVIO.GetStatus()==STA_BUSY)
{
if(CMsgBox::MessageBox(m_hWnd,IDS_MSG_CLOSE_BUSY,IDS_WAR,MB_YESNO,IDI_INFO)==IDYES)
{
DestroyWindow(m_hWnd);
PostQuitMessage(0);
}
}
else
if(CMsgBox::MessageBox(m_hWnd,IDS_MSG_CLOSE_FREE,IDS_WAR,MB_YESNO,IDI_INFO)==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)
{
}
/*------------------------------------------------------------------------------*/
//hilight the title bar
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::Setup.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))
CMsgBox::MessageBox(m_hWnd,IDS_MSG_CALL_BUSY,IDS_ERR,MB_OK,IDI_INFO);
else
{
if(!m_CallDlg.DoModal(m_hWnd,(char*)lParam))
{
if(AVIO.GetStatus()==STA_BUSY)
{
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("");
}
AVIO.EndTalk();
}
}
}
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_BUSY)
{
if(CMsgBox::MessageBox(m_hWnd,IDS_MSG_IFENDTALK,IDS_WAR,MB_YESNO,IDI_INFO)==IDYES)
{
AVIO.EndTalk();
KillTimer(m_hWnd,2);
DrawFps("");
DrawDataRate("");
ShowWindow(m_vs,SW_HIDE);
ShowWindow(m_LocalVideoWnd.m_vs,SW_HIDE);
ShowWindow(m_RemoteVideoWnd.m_vs,SW_HIDE);
}
}
else
AVIO.EndTalk();
}
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);
ShowWindow(m_RemoteVideoWnd.m_vs,SW_HIDE);
m_btnOutview.LoadBitmaps(IDB_VIDEO_OUTVIEW1,IDB_VIDEO_OUTVIEW2,IDB_VIDEO_OUTVIEW3);
}
else
{
ShowWindow(m_RemoteVideoWnd,SW_SHOW);
AVIO.SetRemoteVideoRcvWnd(m_RemoteVideoWnd.m_vs);
ShowWindow(m_vs,SW_HIDE);
m_btnOutview.LoadBitmaps(IDB_VIDEO_OUTVIEW4,IDB_VIDEO_OUTVIEW5,IDB_VIDEO_OUTVIEW6);
}
InvalidateRect(m_btnOutview,0,FALSE);
}
break;
case IDC_VIDEO_ONOFF:
{//是否发送视频
if(m_bSendVideo)
{
m_bSendVideo=FALSE;
AVIO.VideoSend(FALSE);
m_btnOnoff.LoadBitmaps(IDB_VIDEO_ONOFF1,IDB_VIDEO_ONOFF2,IDB_VIDEO_ONOFF3);
}
else
{
m_bSendVideo=TRUE;
AVIO.VideoSend(TRUE);
m_btnOnoff.LoadBitmaps(IDB_VIDEO_ONOFF4,IDB_VIDEO_ONOFF5,IDB_VIDEO_ONOFF6);
}
}break;
case IDC_SEND:
{
//发送文字信息
char ip[50];
GetDlgItemText(m_MsgTalk,IDC_OBJ,ip,50);
AVIO.SendTxt(ip,PORT,(char*)lParam);
}break;
case IDC_MSG:
{
if(IsWindowVisible(m_MsgTalk))
ShowWindow(m_MsgTalk,SW_HIDE);
else
ShowWindow(m_MsgTalk,SW_SHOW);
}break;
}
return TRUE;
}
/*------------------------------------------------------------------------------*/
//画主窗口界面
void CMainWnd::OnEraseBkgnd(HDC hdc)
{
RECT rc;
GetClientRect(m_hWnd,&rc);
HDC hMemDC=CreateCompatibleDC(hdc);
HBITMAP hFace=LoadBitmap(hInstX,LPCTSTR(IDB_FACE));
HBITMAP hob=(HBITMAP)SelectObject(hMemDC,hFace);
//画标题条(如果被Hilight的话)
if(m_bHilightTitleBar)
{
RECT rc;
SetRect(&rc,5,5,168,22);
m_bHilightTitleBar=TRUE;
HBITMAP hb=LoadBitmap(hInstX,LPCTSTR(IDB_TITLE2));
DrawTransBmpX(hMemDC,rc,hb,0,0,0);
DeleteObject(hb);
}
BitBlt(hdc,0,0,rc.right-rc.left,
rc.bottom-rc.top,hMemDC,0,0,SRCCOPY);
SelectObject(hMemDC,hob);
DeleteObject(hFace);
DeleteDC(hMemDC);
}
/*------------------------------------------------------------------------------*/
void CMainWnd::OnTimer(UINT nIDEvent)
{
switch(nIDEvent)
{
case 1:
POINT pt;
GetCursorPos(&pt);
ScreenToClient(m_hWnd,&pt);
if(m_bHilightTitleBar&&!PtInRegion(m_hrgnTitle,pt.x,pt.y))
{
m_bHilightTitleBar=FALSE;
RECT rc;
SetRect(&rc,5,5,168,22);
HDC hdc=GetDC(m_hWnd);
HBITMAP hb=LoadBitmap(hInstX,LPCTSTR(IDB_TITLE1));
DrawTransBmpX(hdc,rc,hb,0,0,0);
DeleteObject(hb);
ReleaseDC(m_hWnd,hdc);
KillTimer(m_hWnd,nIDEvent);
}
break;
case 2://draw fps and datarate
{
//得到发送的数据和接收的数据量
DWORD ds=AVIO.GetDataSend();
DWORD dr=AVIO.GetDataRcv();
DWORD t=GetTickCount();
//画帧频率
char sz[60];
sprintf(sz,"%dfps",AVIO.GetFps());
DrawFps(sz);
//累计通话时间
m_uTalkTime++;
sprintf(sz,"%.1fkbps %d%d:%d%d:%d%d",
((float)ds-m_nDataSend+(float)dr-m_nDataRcv)*8000.0/((float)t-m_nTimePass)/1024.0,
m_uTalkTime/36000,
(m_uTalkTime/3600)%10,
((m_uTalkTime/60)%60)/10,
((m_uTalkTime/60)%60)%10,
(m_uTalkTime%60)/10,
(m_uTalkTime%60)%10);
//画比特率和通话时间
DrawDataRate(sz);
//如果连续5次接收到的数据为0的话,结束通话
if(dr-m_nDataRcv==0)
m_iZeroCount++;
else
m_iZeroCount=0;
if(m_iZeroCount>5)
{
AVIO.EndTalk();
KillTimer(m_hWnd,2);
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("");
CMsgBox::MessageBox(m_hWnd,IDS_ERR_NET_BLOCK,IDS_ERR,MB_OK,IDI_CUT);
}
m_nDataSend=ds;
m_nDataRcv=dr;
m_nTimePass=t;
}
break;
}
}
/*------------------------------------------------------------------------------*/
BOOL CMainWnd::OnSetCursor(HWND hWnd, UINT nHitTest, UINT message)
{
return FALSE;
}
/*------------------------------------------------------------------------------*/
HBRUSH CMainWnd::OnCtrlColorEdit(HDC hdc, HWND hwnd)
{
SetTextColor(hdc,0x00ffffff);
SetBkColor(hdc,0);
return m_hbCtrlBg;
}
/*------------------------------------------------------------------------------*/
void CMainWnd::DrawFps(char* pszFps)
{
SetDlgItemText(m_hWnd,IDC_FPS,pszFps);
}
/*------------------------------------------------------------------------------*/
//
void CMainWnd::OnAudioData(BOOL flag,CAVIOMgr* pMgr)
{
if(!flag)//local
{
HDC hdc=GetDC(m_WaveShowIn);
UINT len;
char* p=pMgr->GetLocalAudio(len);
m_WaveShowIn.Paint(hdc,p,len);
ReleaseDC(m_WaveShowIn,hdc);
}
else
{
HDC hdc=GetDC(m_WaveShowOut);
UINT len;
char* p=pMgr->GetRemoteAudio(len);
m_WaveShowOut.Paint(hdc,p,len);
ReleaseDC(m_WaveShowOut,hdc);
}
}
/*------------------------------------------------------------------------------*/
void CMainWnd::DrawDataRate(char* pszDataRate)
{
SetDlgItemText(m_hWnd,IDC_DATARATE,pszDataRate);
}
/*------------------------------------------------------------------------------*/
HBRUSH CMainWnd::OnCtrlColorStatic(HDC hdc, HWND hwnd)
{
if(hwnd==GetDlgItem(m_hWnd,IDC_FPS))
{
SetBkColor(hdc,0x00b9b4b3);
SetTextColor(hdc,0x00ffffff);
return m_hbFpsBg;
}
SetBkColor(hdc,0);
SetTextColor(hdc,0x00aaeeff);
return m_hbCtrlBg;
}
/*------------------------------------------------------------------------------*/
//AVIOMgr的通知消息处理
void CMainWnd::OnIOMNotify(WPARAM wParam, LPARAM lParam)
{
switch(LOWORD(wParam))
{
case IOMN_CALL://呼叫到来
{
sockaddr_in sc=AVIO.GetRemoteAddr();
char sz[50];
sprintf(sz,"%d.%d.%d.%d",
sc.sin_addr.S_un.S_un_b.s_b1,
sc.sin_addr.S_un.S_un_b.s_b2,
sc.sin_addr.S_un.S_un_b.s_b3,
sc.sin_addr.S_un.S_un_b.s_b4);
SetActiveWindow(m_hWnd);
if(m_RingDlg.DoModal(m_hWnd,sz))
{
ShowWindow(m_LocalVideoWnd,SW_SHOWNORMAL);
ShowWindow(m_hWnd,SW_SHOWNORMAL);
SetForegroundWindow(m_hWnd);
SetActiveWindow(m_hWnd);
m_uTalkTime=0;
m_nTimePass=GetTickCount();
m_nDataRcv=0;
m_nDataSend=0;
m_nFrameCount=0;
m_iZeroCount=0;
SetTimer(m_hWnd,2,1000,0);
AVIO.Accept();
//接受了呼叫,把该次事件记录到log文件中
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),"log.txt");
SYSTEMTIME st;
GetLocalTime(&st);
char szDate[20];
char szTime[20];
sprintf(szDate,"%d-%d-%d",st.wYear,st.wMonth,st.wDay);
sprintf(szTime,"%d:%d:%d",st.wHour,st.wMinute,st.wSecond);
char szLog[100];
sprintf(szLog,"接受了%s的通话请求",sz);
WritePrivateProfileString(szDate,szTime,szLog,szPath);
}
else
AVIO.Refuse();
}break;
//the request is accepted,so begin to talk
case IOMN_ACCEPT:
{
SendMessage(m_CallDlg,WM_COMMAND,IDC_OK,0);
ShowWindow(m_LocalVideoWnd,SW_SHOWNORMAL);
ShowWindow(m_hWnd,SW_SHOWNORMAL);
AVIO.OnAccept();
m_uTalkTime=0;
m_nTimePass=GetTickCount();
m_nDataRcv=0;
m_nDataSend=0;
m_nFrameCount=0;
m_iZeroCount=0;
SetTimer(m_hWnd,2,1000,0);
//write the talking event into log file
sockaddr_in sc=AVIO.GetRemoteAddr();
char sz[50];
sprintf(sz,"%d.%d.%d.%d",
sc.sin_addr.S_un.S_un_b.s_b1,
sc.sin_addr.S_un.S_un_b.s_b2,
sc.sin_addr.S_un.S_un_b.s_b3,
sc.sin_addr.S_un.S_un_b.s_b4);
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),"log.txt");
SYSTEMTIME st;
GetLocalTime(&st);
char szDate[20];
char szTime[20];
sprintf(szDate,"%d-%d-%d",st.wYear,st.wMonth,st.wDay);
sprintf(szTime,"%d:%d:%d",st.wHour,st.wMinute,st.wSecond);
char szLog[100];
sprintf(szLog,"%s你接受了你的通话请求",sz);
WritePrivateProfileString(szDate,szTime,szLog,szPath);
}
break;
case IOMN_CONNECTED:
{
if(IsWindow(m_CallDlg))
{
m_CallDlg.Connected();
}
}
break;
case IOMN_END:
{
AVIO.EndTalk();
KillTimer(m_hWnd,2);
DrawFps("");
DrawDataRate("");
ShowWindow(m_vs,SW_HIDE);
ShowWindow(m_LocalVideoWnd.m_vs,SW_HIDE);
ShowWindow(m_RemoteVideoWnd.m_vs,SW_HIDE);
if(IsWindow(m_RingDlg))
EndDialog(m_RingDlg,FALSE);
else
{
if(HIWORD(wParam)==E_USER)
{
CMsgBox::MessageBox(m_hWnd,IDS_MSG_ENDTALK,IDS_MSG,MB_OK,IDI_INFO);
}
}
}
break;
case IOMN_REFUSE:
{
switch(HIWORD(wParam))
{
case R_TIMEOUT:
{
m_CallDlg.FailConnect();
}
break;
case R_USER:
{
m_CallDlg.Refuse();
}
break;
case R_BUSY:
{
m_CallDlg.Busy();
}
break;
}
}
break;
//the error of aviomgr
case IOMN_ERR:
{
switch(HIWORD(wParam))
{
case IOME_SOCKET:
CMsgBox::MessageBox(m_hWnd,IDS_ERR_NET_SOCKET,IDS_ERR,MB_OK,IDI_ERR);
break;
case IOME_AUDIO_IN:
CMsgBox::MessageBox(m_hWnd,IDS_ERR_AUDIO_IN,IDS_ERR,MB_OK,IDI_ERR);
break;
case IOME_AUDIO_OUT:
CMsgBox::MessageBox(m_hWnd,IDS_ERR_AUDIO_OUT,IDS_ERR,MB_OK,IDI_ERR);
break;
case IOME_VIDEO_IN:
m_LocalVideoWnd.SetErrTxt("无法打开视频输入设备");
break;
case IOME_VIDEO_OUT:
//always good
break;
case IOME_AUDIO_CODEC:
CMsgBox::MessageBox(m_hWnd,IDS_ERR_AUDIO_CODEC,IDS_ERR,MB_OK,IDI_ERR);
break;
case IOME_VIDEO_CODEC:
CMsgBox::MessageBox(m_hWnd,IDS_ERR_VIDEO_CODEC,IDS_ERR,MB_OK,IDI_ERR);
break;
}
}break;
//Txt msg come,or notify that the txt msg has been confermed received
case IOMN_TXT:
{
if(HIWORD(wParam))
{
char sz[500];
sprintf(sz,"%s:%s","我",(char*)lParam);
m_MsgTalk.AddMsg(sz);
}
else
{
sockaddr_in sc=AVIO.GetCurrentAddr();
char sz[500];
sprintf(sz,"%d.%d.%d.%d:%s",
sc.sin_addr.S_un.S_un_b.s_b1,
sc.sin_addr.S_un.S_un_b.s_b2,
sc.sin_addr.S_un.S_un_b.s_b3,
sc.sin_addr.S_un.S_un_b.s_b4,(char*)lParam);
m_MsgTalk.AddMsg(sz);
if(CSetupDlg::Setup.bAutoMsg)
{
ShowWindow(m_MsgTalk,SW_SHOW);
SetForegroundWindow(m_MsgTalk);
SetActiveWindow(m_MsgTalk);
}
}
}break;
//the video quality was set by aviomgr automatically
case IOMN_VQSET:
{
m_sldVideoQ.SetPos(HIWORD(wParam));
}break;
}
}
/*------------------------------------------------------------------------------*/
//when the output volume was changed,this would be invoked
void CALLBACK CMainWnd::OutVolumeChanged( DWORD dwCurrentVolume, DWORD dwUserValue )
{
CMainWnd* p=(CMainWnd*)dwUserValue;
p->m_sldAudioOut.SetPos(dwCurrentVolume*100/
(p->m_VoOutCtrl.GetMaximalVolume()-p->m_VoOutCtrl.GetMinimalVolume()));
}
/*------------------------------------------------------------------------------*/
void CALLBACK CMainWnd::InVolumeChanged( DWORD dwCurrentVolume, DWORD dwUserValue )
{
CMainWnd* p=(CMainWnd*)dwUserValue;
p->m_sldAudioIn.SetPos(dwCurrentVolume*100/
(p->m_VoInCtrl.GetMaximalVolume()-p->m_VoInCtrl.GetMinimalVolume()));
}
/*------------------------------------------------------------------------------*/
//when the setup was changed,this would be call
void CMainWnd::OnSetup(SETUP *Setup)
{
char sz[20];
sz[1]=0;
//autorun
if(Setup->bAutoRun)
{
sz[0]='1';
HKEY hKey=NULL;
DWORD dwValueType=REG_SZ;
DWORD dwStrCb=128;
DWORD dwDisposition;
char szPath[256];
GetModuleFileName(0,szPath,255);
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"),0,KEY_QUERY_VALUE|KEY_SET_VALUE,&hKey)!=ERROR_SUCCESS)
{
RegCreateKeyEx(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"),0, NULL, REG_OPTION_NON_VOLATILE, KEY_WRITE,
NULL, &hKey, &dwDisposition);
}
if (RegSetValueEx(hKey,"NetTalk",0,REG_SZ,(const BYTE*)szPath,dwStrCb)!=ERROR_SUCCESS)
{
RegCloseKey(hKey);
}
}
else
{
sz[0]='0';
HKEY hKey=NULL;
if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"),0,KEY_QUERY_VALUE|KEY_SET_VALUE,&hKey)==ERROR_SUCCESS)
{
RegDeleteValue(hKey,"NetTalk");
}
}
//
AVIO.EnableBandAdjust(Setup->bBandAdjust);
//
AVIO.Enable(!Setup->bRefuseCall);
//when refuse call,the avio was disable,change the notify-try icon
if(Setup->bRefuseCall)
{
m_TrayNotify.SetIcon(LoadIcon(hInstX,LPCTSTR(IDI_DISABLE)));
m_TrayNotify.Refresh();
}
else
{
m_TrayNotify.SetIcon(LoadIcon(hInstX,LPCTSTR(IDI_MAIN)));
m_TrayNotify.Refresh();
}
//unregister the old hotkey,and register the new hotkey
UnregisterHotKey(m_hWnd,1);
UINT Mod=0;
if(HOTKEYF_ALT&HIBYTE(Setup->wHotKey))
Mod|=MOD_ALT;
if(HOTKEYF_CONTROL&HIBYTE(Setup->wHotKey))
Mod|=MOD_CONTROL;
if(HOTKEYF_SHIFT&HIBYTE(Setup->wHotKey))
Mod|=MOD_SHIFT;
if(!RegisterHotKey(m_hWnd,1,Mod,LOBYTE(Setup->wHotKey)))
CMsgBox::MessageBox(m_hWnd,IDS_ERR_HOTKEY,IDS_ERR,MB_OK,IDI_INFO);
}
/*------------------------------------------------------------------------------*/
//
void CMainWnd::OnTrayNotify(WPARAM wParam, LPARAM lParam)
{
switch(lParam)
{
case WM_LBUTTONDBLCLK:
{
ShowWindow(m_hWnd,SW_SHOWNORMAL);
SetForegroundWindow(m_hWnd);
SetActiveWindow(m_hWnd);
}
break;
case WM_RBUTTONDOWN:
{
HMENU hMenu=LoadMenu(hInstX,LPCTSTR(IDR_POP));
HMENU hSub=GetSubMenu(hMenu,0);
SetForegroundWindow(m_hWnd);
POINT pt;
GetCursorPos(&pt);
DWORD dwID=TrackPopupMenu(hSub,TPM_RIGHTALIGN|TPM_BOTTOMALIGN|TPM_RETURNCMD,pt.x,pt.y,0,m_hWnd,0);
{
switch(dwID)
{
case ID_SHOWCHATER:
SendMessage(m_hWnd,WM_COMMAND,IDC_MSG,0);
break;
case ID_SHOW:
ShowWindow(m_hWnd,SW_SHOWNORMAL);
SetForegroundWindow(m_hWnd);
SetActiveWindow(m_hWnd);
break;
case ID_EXIT:
SendMessage(m_hWnd,WM_CLOSE,0,0);
break;
case ID_ABOUT:
if(IsWindowEnabled(m_hWnd))
SendMessage(m_hWnd,WM_COMMAND,IDC_ABOUT,0);
break;
case ID_CALL:
if(IsWindowEnabled(m_hWnd))
SendMessage(m_hWnd,WM_COMMAND,IDC_CALL,0);
break;
case ID_H:
SendMessage(m_hWnd,WM_COMMAND,IDC_HP,0);
break;
}
}
}
}
}
/*------------------------------------------------------------------------------*/
//implementation of about dialog
CAboutDlg::CAboutDlg()
{
}
/*------------------------------------------------------------------------------*/
CAboutDlg::~CAboutDlg()
{
}
/*------------------------------------------------------------------------------*/
LRESULT CAboutDlg::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_COMMAND:
{
CGraphDlg::OnCommand(wParam,lParam);
switch(LOWORD(wParam))
{
case IDC_LOGO:
KillTimer(m_hWnd,1);
ShowWindow(m_cd1,SW_HIDE);
ShowWindow(m_cd2,SW_HIDE);
ShowWindow(m_rw,SW_SHOW);
break;
case IDC_CREDIT:
if(!IsWindowVisible(m_cd1))
SetTimer(m_hWnd,1,30,0);
SetTimer(m_hWnd,1,30,0);
ShowWindow(m_cd1,SW_SHOW);
ShowWindow(m_cd2,SW_SHOW);
ShowWindow(m_rw,SW_HIDE);
break;
}
}
break;
case WM_INITDIALOG:
{
CGraphDlg::OnInitDialog();
SetWindowText(m_hWnd,"关于NetTalk");
MoveWindow(GetDlgItem(m_hWnd,IDC_CONTAINER),7,50,286,182,FALSE);
m_rw.Create((CRectX&)CRectX(0,0,286,182),GetDlgItem(m_hWnd,IDC_CONTAINER),IDB_LOGO1,286,182);
m_cd1.Create(GetDlgItem(m_hWnd,IDC_CONTAINER));
m_cd2.Create(GetDlgItem(m_hWnd,IDC_CONTAINER));
SetWindowPos(m_cd1,0,0,0,0,0,SWP_NOSIZE);
CRectX rc;
GetWindowRect(m_cd1,&rc);
SetWindowPos(m_cd2,0,0,rc.Height(),0,0,SWP_NOSIZE);
SendDlgItemMessage(m_hWnd,IDC_LOGO,BM_SETCHECK,BST_CHECKED,0);
return FALSE;
}
break;
case WM_TIMER:
{
CGraphDlg::OnTimer(wParam);
CRectX rc1,rc2,rc3;
GetWindowRect(m_cd1,&rc1);
GetWindowRect(m_cd2,&rc2);
GetWindowRect(GetDlgItem(m_hWnd,IDC_CONTAINER),&rc3);
OffsetRect(&rc1,-rc3.left,-rc3.top);
OffsetRect(&rc2,-rc3.left,-rc3.top);
SetWindowPos(m_cd1,0,0,rc1.top-1,0,0,SWP_NOSIZE);
SetWindowPos(m_cd2,0,0,rc2.top-1,0,0,SWP_NOSIZE);
if(rc1.bottom<0)
{
SetWindowPos(m_cd1,0,0,rc2.bottom-1,0,0,SWP_NOSIZE);
}
if(rc2.bottom<0)
{
SetWindowPos(m_cd2,0,0,rc1.bottom-1,0,0,SWP_NOSIZE);
}
}break;
default:
return CGraphDlg::WndProc(uMsg,wParam,lParam);
}
return TRUE;
}
/*------------------------------------------------------------------------------*/
//implementation of IP input dialog
CIPInput::CIPInput()
{
m_szIP[0]=0;
m_uPort=0;
}
/*------------------------------------------------------------------------------*/
CIPInput::~CIPInput()
{
}
/*------------------------------------------------------------------------------*/
LRESULT CIPInput::WndProc(UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch(uMsg)
{
case WM_COMMAND:
{
switch(LOWORD(wParam))
{
case IDC_OK:
{
GetDlgItemText(m_hWnd,IDC_IP,m_szIP,29);
if(strlen(m_szIP)>0)
{
//set the result to variables
char sz[20];
GetDlgItemText(m_hWnd,IDC_PORT,sz,19);
m_uPort=(unsigned short)strtoul(sz,0,10);
//update the recent call address
HWND hcb=GetDlgItem(m_hWnd,IDC_IP);
int iItem=SendMessage(hcb,CB_FINDSTRING,-1,(LPARAM)m_szIP);
if(iItem<0)
SendMessage(hcb,CB_INSERTSTRING,0,(LPARAM)m_szIP);
else
{
SendMessage(hcb,CB_DELETESTRING,iItem,0);
SendMessage(hcb,CB_INSERTSTRING,0,(LPARAM)m_szIP);
}
int iCount=SendMessage(hcb,CB_GETCOUNT,0,0);
if(iCount>20)
iCount=20;
char szI[4];
for(int i=0;i=20)
{
c=20;
}
char szStr[256];
for(int i=0;i