📄 mainfrm.cpp
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "VISMCU.h"
#include "MemberListView.h"
#include "RoomListView.h"
#include "OutputView.h"
#include "MainFrm.h"
#include "OptionAudioDlg.h"
#include "OptionVideoDlg.h"
#include "OptionNetworkDlg.h"
#include "OptionGKDlg.h"
#include "CallDlg.h"
#include "MemberDetailDlg.h"
#include "AnnounceDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_SETFOCUS()
ON_WM_SIZING()
ON_WM_CLOSE()
ON_COMMAND(ID_CALL, OnCall)
ON_COMMAND(ID_HANGUP, OnHangup)
ON_UPDATE_COMMAND_UI(ID_HANGUP, OnUpdateHangup)
ON_COMMAND(ID_LOGIN, OnLogin)
ON_UPDATE_COMMAND_UI(ID_LOGIN, OnUpdateLogin)
ON_COMMAND(ID_LOGOUT, OnLogout)
ON_UPDATE_COMMAND_UI(ID_LOGOUT, OnUpdateLogout)
ON_COMMAND(ID_AUDIO, OnAudio)
ON_COMMAND(ID_VIDEO, OnVideo)
ON_COMMAND(ID_NETWORK, OnNetwork)
ON_COMMAND(ID_GATEKEEPER, OnGatekeeper)
ON_UPDATE_COMMAND_UI(ID_MEMBER_DETAIL, OnUpdateMemberDetail)
ON_COMMAND(ID_MEMBER_DETAIL, OnMemberDetail)
ON_COMMAND(ID_AUTO_SAVE_LOG, OnAutoSaveLog)
ON_UPDATE_COMMAND_UI(ID_AUTO_SAVE_LOG, OnUpdateAutoSaveLog)
ON_COMMAND(ID_SAVE_LOG, OnSaveLog)
ON_COMMAND(ID_SEND_ANNOUNCEMENT, OnSendAnnouncement)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
IDS_NOT_LOGIN,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
//创建终端
m_pep=new CMCUEndPoint(*this);
}
CMainFrame::~CMainFrame()
{
//删除终端
delete m_pep;
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
!m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failed to create status bar\n");
return -1; // fail to create
}
else
{
UINT nID,nStyle;
int w;
m_wndStatusBar.GetPaneInfo(1,nID,nStyle,w);
m_wndStatusBar.SetPaneInfo(1,nID,nStyle,250);
}
CWinApp* app=AfxGetApp();
m_autoSaveLog=app->GetProfileInt("",KEY_AUTO_SAVE_LOG,0)>0;
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
//初始化终端
if(!InitEndPoint())
{
AfxMessageBox("初始化失败!");
return -1;
}
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnSetFocus(CWnd* pOldWnd)
{
// forward focus to the view window
GetRoomListCtrl().GetParent()->SetFocus();
}
BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
// let the view have first crack at the command
if (GetRoomListCtrl().GetParent()->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
return TRUE;
// otherwise, do default handling
return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
//创建切分窗口
m_splitter1.CreateStatic(this,2,1);
m_splitter2.CreateStatic(&m_splitter1,1, 2,WS_CHILD | WS_VISIBLE | WS_BORDER,m_splitter1.IdFromRowCol(0, 0));
m_splitter1.SetRowInfo(0,350,0);
m_splitter2.CreateView(0,0,RUNTIME_CLASS(CRoomListView),CSize(200,0),pContext);
m_splitter2.CreateView(0,1,RUNTIME_CLASS(CMemberListView),CSize(0,0),pContext);
m_splitter1.CreateView(1,0,RUNTIME_CLASS(COutputView),CSize(0,0),pContext);
return CFrameWnd::OnCreateClient(lpcs, pContext);
}
CListCtrl & CMainFrame::GetRoomListCtrl()
{
//返回会议列表框控件
return ((CListView*)m_splitter2.GetPane(0,0))->GetListCtrl();
}
CListCtrl& CMainFrame::GetMemberListCtrl()
{
//返回成员列表控件
return ((CListView*)m_splitter2.GetPane(0,1))->GetListCtrl();
}
COutputView* CMainFrame::GetOutputView()
{
//返回输出框控件
return (COutputView*)m_splitter1.GetPane(1,0);
}
void CMainFrame::OnSizing(UINT fwSide, LPRECT pRect)
{
//调整切分窗口
CFrameWnd::OnSizing(fwSide, pRect);
CRect rc;
GetWindowRect(&rc);
long dh=rc.Height()-(pRect->bottom-pRect->top);
int cy,min;
m_splitter1.GetRowInfo(0,cy,min);
m_splitter1.SetRowInfo(0,cy-dh>0?cy-dh:0,0);
}
BOOL CMainFrame::InitEndPoint()
{
Output(IDS_LOG_START,COMPANY,PRODUCT,MAJOR_VERSION,MINOR_VERSION,BUILD_NUM);
BOOL bRet=FALSE;
CWinApp *app=AfxGetApp();
char name[256]="";
//初始化终端
if(!m_pep->Initialize(COMPANY,PRODUCT,MAJOR_VERSION,MINOR_VERSION,CODE_STATUS,BUILD_NUM))
goto RET;
//向这个函数传入您的授权码,如果授权码合法,就没有通话时间限制了
m_pep->Authorise("Your authorizatio code");
Output(IDS_LOG_INITIALIZE);
//开始在指定的端口监听
if(!m_pep->StartListen(NULL,app->GetProfileInt("",KEY_LISTEN_PORT,H323_LISTEN_PORT)))
Output(IDS_LOG_PORT_FAIL,app->GetProfileInt("",KEY_LISTEN_PORT,H323_LISTEN_PORT));
else
Output(IDS_LOG_PORT,app->GetProfileInt("",KEY_LISTEN_PORT,H323_LISTEN_PORT));
//设置首选音频codec
m_pep->SetPreferredAudioCodec(app->GetProfileInt("",KEY_PREFERRED_AUDIO_CODEC,0));
m_pep->GetAudioCodecName(m_pep->GetPreferredAudioCodec(),name,256);
Output(IDS_LOG_PREFER_CODEC,name);
//设置音频抖动缓冲
m_pep->SetMaxAudioDelayJitter(0,app->GetProfileInt("",KEY_AUDIO_JITTER,60));
Output(IDS_LOG_JITTER,app->GetProfileInt("",KEY_AUDIO_JITTER,60));
//设置静音抑制模式
m_pep->SetSilenceDetectionMode(0,
(enum SilenceDetectionMode)app->GetProfileInt("",KEY_SILENCE_DETECTION_MODE,0),
app->GetProfileInt("",KEY_SILENCE_DETECTION_THRESHOLD,0));
{
CString s;
enum SilenceDetectionMode mode;
DWORD threshold;
m_pep->GetSilenceDetectionMode(0,mode,threshold);
if(mode==NoSilenceDetection)
s="关";
else if(mode==FixedSilenceDetection)
s="手动";
else
s="自动";
Output(IDS_LOG_SILENCE_DETECTION,s,threshold);
}
Output(IDS_LOG_H263,IsH263Available()?"已加载":"未加载");
Output(IDS_LOG_VIDEO_FPS,app->GetProfileInt("",KEY_VIDEO_FPS,10));
//设置自动发送视频
m_pep->AutoSendVideo(app->GetProfileInt("",KEY_SEND_VIDEO,1)>0);
Output(IDS_LOG_SENDVIDEO,app->GetProfileInt("",KEY_SEND_VIDEO,1)>0?"是":"否");
//设置视频发送格式
m_pep->SetVideoSize(0,app->GetProfileInt("",KEY_VIDEO_FORMAT,0)==0?VS_QCIF:VS_CIF);
Output(IDS_LOG_VIDEO_FORMAT,app->GetProfileInt("",KEY_VIDEO_FORMAT,0)==0?"QCIF":"CIF");
//设置视频压缩品质
m_pep->SetVideoQuality(0,app->GetProfileInt("",KEY_VIDEO_QUALITY,100));
Output(IDS_LOG_VIDEO_QUALITY,app->GetProfileInt("",KEY_VIDEO_QUALITY,100));
//设置初始带宽值
m_pep->SetInitialBandwidth(app->GetProfileInt("",KEY_BANDWIDTH,10000)*1000);
Output(IDS_LOG_BANDWIDTH,app->GetProfileInt("",KEY_BANDWIDTH,10000));
//设置最大连接数
m_pep->SetMaxConnection(app->GetProfileInt("",KEY_MAX_CONN,10000));
Output(IDS_LOG_MAX_CONN,m_pep->GetMaxConnection());
Output(IDS_LOG_DEFAULT_ROOM,app->GetProfileString("",KEY_DEFAULT_ROOM,DEFAULT_ROOM));
Output(IDS_LOG_ROOM_SIZE,app->GetProfileInt("",KEY_ROOM_SIZE,DEFAULT_ROOM_SIZE));
//建议禁用fast-start
m_pep->EnableFastStart(app->GetProfileInt("",KEY_FASTSTART,0)>0);
Output(IDS_LOG_FASTSTART,app->GetProfileInt("",KEY_FASTSTART,1)>0?"开":"关");
m_pep->EnableH245inSetup(app->GetProfileInt("",KEY_H245INSETUP,1)>0);
Output(IDS_LOG_H245INSETUP,app->GetProfileInt("",KEY_H245INSETUP,1)>0?"开":"关");
m_pep->EnableH245Tunnel(app->GetProfileInt("",KEY_H245TUNNEL,1)>0);
Output(IDS_LOG_H245TUNNEL,app->GetProfileInt("",KEY_H245TUNNEL,1)>0?"开":"关");
m_pep->SetUserName(app->GetProfileString("",KEY_USER_NAME),app->GetProfileString("",KEY_USER_ALIAS));
m_pep->GetUserName(name,256);
Output(IDS_LOG_USERNAME,name);
m_pep->GetUserAlias(name,256);
Output(IDS_LOG_USERALIAS,name);
if(app->GetProfileInt("",KEY_AUTO_LOGIN,0)>0)
{
if(m_pep->UseGatekeeper(app->GetProfileString("",KEY_GK_ADDRESS),app->GetProfileString("",KEY_PASSWORD)))
{
Output(IDS_LOG_LOGIN,app->GetProfileString("",KEY_GK_ADDRESS));
m_pep->m_findingGK=TRUE;
}
else
{
Output(IDS_LOG_FAIL_LOGIN,app->GetProfileString("",KEY_GK_ADDRESS));
}
}
bRet=TRUE;
RET:
return bRet;
}
void CMainFrame::OnClose()
{
//Hang up all connections
m_pep->HangUp();
//等待所有连接真正断开
MSG msg;
while(m_pep->GetConnectionCount()>0)
{
PeekMessage(&msg,NULL,0,0,PM_REMOVE);
Sleep(0);
}
m_pep->UnuseGatekeeper();
Output(IDS_LOG_END);
if(m_autoSaveLog)
{//保存log
OnSaveLog();
}
CFrameWnd::OnClose();
}
void CMainFrame::RefreshMemberList()
{//刷新成员列表
CListCtrl &roomListCtrl=GetRoomListCtrl();
CListCtrl &memberListCtrl=GetMemberListCtrl();
memberListCtrl.DeleteAllItems();
int index=roomListCtrl.GetNextItem(-1,LVNI_SELECTED);
if(index>=0)
{
CRoom *room=(CRoom*)roomListCtrl.GetItemData(index);
ASSERT(room!=NULL);
char str[256]="";
for(DWORD i=0;i<room->GetMemberCount();i++)
{
CDWordArray& members=room->GetMembers();
index=memberListCtrl.InsertItem(memberListCtrl.GetItemCount(),m_pep->GetRemoteName(members[i]));
m_pep->GetRemoteAddress(members[i],str,256);
memberListCtrl.SetItemText(index,1,str);
m_pep->GetRemoteApplication(members[i],str,256);
memberListCtrl.SetItemText(index,2,str);
//将成员的id与列表项关联
memberListCtrl.SetItemData(index,members[i]);
}
}
}
void CMainFrame::OnCall()
{
CCallDlg dlg;
if(dlg.DoModal()==IDOK)
{
DWORD connID;
if(m_pep->MakeCall(connID,dlg.m_callNum))
{
Output(IDS_LOG_MAKECALL,dlg.m_callNum,connID);
//
if(!m_pep->AddMember(connID,dlg.m_room))
{
m_pep->HangUp(connID);
Output(IDS_LOG_HANGUP,connID);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -