⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.cpp

📁 一个简单的视频会议VC++MFC工程文件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -