📄 visepdlg.cpp
字号:
// VISEPDlg.cpp : implementation file
//
#include "stdafx.h"
#include "VISEP.h"
#include "VISEPDlg.h"
#include "CallDlg.h"
#include "Shlwapi.h"
#include "OptionAudio.h"
#include "OptionVideo.h"
#include "OptionNetwork.h"
#include "OptionGatekeeper.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CVISEPDlg dialog
CVISEPDlg::CVISEPDlg(CWnd* pParent /*=NULL*/)
: CDialog(CVISEPDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CVISEPDlg)
m_msg = _T("");
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_pep=new CMyEndPoint(*this);
m_connID=0;
m_brush.CreateSolidBrush(0x00ffffff);
m_localVideo.m_menuID=ID_LOCAL_VIDEO;
m_remoteVideo.m_menuID=ID_REMOTE_VIDEO;
}
CVISEPDlg::~CVISEPDlg()
{
delete m_pep;
}
void CVISEPDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CVISEPDlg)
DDX_Control(pDX, IDC_TALK_TO, m_ctlTalkTo);
DDX_Control(pDX, IDC_MEMBER_LIST, m_memberList);
DDX_Text(pDX, IDC_MSG, m_msg);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CVISEPDlg, CDialog)
//{{AFX_MSG_MAP(CVISEPDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_COMMAND(ID_ABOUTBOX, OnAboutbox)
ON_WM_CLOSE()
ON_BN_CLICKED(IDC_CALL, OnCall)
ON_BN_CLICKED(IDC_ANSWER, OnAnswer)
ON_BN_CLICKED(IDC_REFRESH, OnRefresh)
ON_WM_CTLCOLOR()
ON_BN_CLICKED(IDC_SEND, OnSend)
ON_COMMAND(ID_LOCAL_VIDEO, OnLocalVideo)
ON_COMMAND(ID_REMOTE_VIDEO, OnRemoteVideo)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_MEMBER_LIST, OnItemchangedMemberList)
ON_COMMAND(ID_AUDIO, OnAudio)
ON_COMMAND(ID_VIDEO, OnVideo)
ON_COMMAND(ID_NETWORK, OnNetwork)
ON_COMMAND(ID_GATEKEEPER, OnGatekeeper)
ON_COMMAND(ID_LOGIN, OnLogin)
ON_COMMAND(ID_LOGOUT, OnLogout)
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CVISEPDlg message handlers
BOOL CVISEPDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
// TODO: Add extra initialization here
m_memberList.InsertColumn(0,"会议成员",LVCFMT_LEFT,150);
m_memberList.SetExtendedStyle(LVS_EX_FULLROWSELECT );
int w[]={150,250,350,-1};
m_statusBar.Create(WS_CHILD|WS_VISIBLE|CCS_BOTTOM,CRect(0,0,0,0), this, AFX_IDW_STATUS_BAR );
m_statusBar.SetParts(sizeof(w)/sizeof(int),w);
m_statusBar.SetText("不在会议中",0,0);
m_statusBar.SetText("话筒",1,SBT_NOBORDERS );
m_statusBar.SetText("耳机",2,SBT_NOBORDERS );
m_statusBar.SetText("未登录到网守",3,0);
CRect rc;
m_statusBar.GetRect(1,&rc);
rc.left=rc.left+30;
//在Status bar中创建两个progress bar用来显示录音和播放的声音大小
m_micVolume.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rc,&m_statusBar,1);
m_statusBar.GetRect(2,&rc);
rc.left=rc.left+30;
m_spkVolume.Create(WS_CHILD|WS_VISIBLE|PBS_SMOOTH,rc,&m_statusBar,2);
//初始化h323终端
if(InitEndPoint()==FALSE)
AfxMessageBox("终端初始化失败!");
UpdateButtons(TRUE);
return TRUE; // return TRUE unless you set the focus to a control
}
void CVISEPDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CVISEPDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CVISEPDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CVISEPDlg::OnAboutbox()
{
CAboutDlg dlg;
dlg.DoModal();
}
BOOL CVISEPDlg::InitEndPoint()
{
BOOL ret=FALSE;
CWinApp *app=AfxGetApp();
//终端初始化
if(!m_pep->Initialize(COMPANY,PRODUCT,MAJOR_VERSION,MINOR_VERSION,CODE_STATUS,BUILD_NUM))
goto RET;
//向这个函数传入您的授权码,如果授权码合法,就没有通话时间限制了
m_pep->Authorise("Your authorization code");
//开始在指定的端口监听
if(!m_pep->StartListen(NULL,app->GetProfileInt("",KEY_LISTEN_PORT,H323_LISTEN_PORT)))
goto RET;
//设置首选音频codec
m_pep->SetPreferredAudioCodec(app->GetProfileInt("",KEY_PREFERRED_AUDIO_CODEC,0));
//设置音频抖动缓冲
m_pep->SetMaxAudioDelayJitter(0,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));
//设置自动发送视频
m_pep->AutoSendVideo(app->GetProfileInt("",KEY_AUTO_SEND_VIDEO,1)>0);
//设置视频发送格式
m_pep->SetVideoSize(0,app->GetProfileInt("",KEY_VIDEO_FORMAT,0)==0?VS_QCIF:VS_CIF);
//设置视频压缩品质
m_pep->SetVideoQuality(0,app->GetProfileInt("",KEY_VIDEO_QUALITY,100));
//设置视频捕获方式
m_pep->m_grabber.SetGrabberMode(app->GetProfileInt("",KEY_USE_DIRECTSHOW,1)>0?VG_DS:VG_VFW);
//设置初始带宽值
m_pep->SetInitialBandwidth(app->GetProfileInt("",KEY_BANDWIDTH,10000)*1000);
//建议禁用fast-start
m_pep->EnableFastStart(app->GetProfileInt("",KEY_FASTSTART,0)>0);
m_pep->EnableH245inSetup(app->GetProfileInt("",KEY_H245INSETUP,1)>0);
m_pep->EnableH245Tunnel(app->GetProfileInt("",KEY_H245TUNNEL,1)>0);
//设置用户名及用户别名
m_pep->SetUserName(app->GetProfileString("",KEY_USER_NAME),
app->GetProfileString("",KEY_USER_ALIAS));
ret=TRUE;
RET:
return ret;
}
void CVISEPDlg::OnAnswerCall(DWORD connID)
{
//保存连接id
m_connID=connID;
SetForegroundWindow();
UpdateButtons();
char name[256]="";
char app[256]="";
m_pep->GetRemotePartyName(connID,name,256);
m_pep->GetRemoteApplication(connID,app,256);
Output("%s 对你发起呼叫,远程终端 %s",name,app);
}
void CVISEPDlg::OnCallEnded(DWORD duration, enum CallEndReason reason)
{
Output("结束会议,会议持续时间%d秒,结束原因:%d",duration,reason);
KillTimer(1);
KillTimer(2);
m_connID=0;
UpdateButtons(TRUE);
//清空会议成员表
m_memberList.DeleteAllItems();
GetDlgItem(IDC_ROOM_NAME)->SetWindowText("");
m_ctlTalkTo.ResetContent();
}
void CVISEPDlg::OnTalking()
{//开始通话
char app[256]="";
char name[256]="";
m_pep->GetRemoteApplication(m_connID,app,256);
m_pep->GetRemotePartyName(m_connID,name,256);
Output("开始会议.远程终端 %s, %s",app,name);
UpdateButtons();
//获取会议成员列表
OnRefresh();
//
SetTimer(1,100,NULL);
SetTimer(2,1000,NULL);
}
void CVISEPDlg::OnWaitForAnswer()
{
Output("成功连接到远程终端,等待应答...");
UpdateButtons();
}
void CVISEPDlg::OnClose()
{
//Hangup是异步的,不会马上中断连接
m_pep->HangUp();
//等待连接真正断开
MSG msg;
while(m_pep->GetConnectionCount()>0)
{
PeekMessage(&msg,NULL,0,0,PM_REMOVE);
Sleep(0);
}
//从网守注销
m_pep->UnuseGatekeeper();
PostQuitMessage(0);
//CDialog::OnClose();
}
void CVISEPDlg::OnCall()
{
if(m_pep->GetConnectionCount()==0)
{ //终端空闲
CCallDlg dlg;
if(dlg.DoModal()==IDOK)
{
if(dlg.m_isVISMCU&&!dlg.m_room.IsEmpty())
dlg.m_callNum=dlg.m_room+"@"+dlg.m_callNum;
if(m_pep->MakeCall(m_connID,dlg.m_callNum))
Output("呼叫 %s ...",dlg.m_callNum);//呼叫成功
else
Output("呼叫 %s 失败",dlg.m_callNum);//呼叫失败
}
}
else//非空闲的时候
m_pep->HangUp(0);
UpdateButtons();
}
void CVISEPDlg::UpdateButtons(BOOL initState)
{
//更新按钮及菜单
CMenu *menu=GetMenu();
if(initState)
{
m_statusBar.SetText("不在会议中",0,0);
GetDlgItem(IDC_CALL)->SetWindowText("呼叫...");
GetDlgItem(IDC_ANSWER)->EnableWindow(FALSE);
GetDlgItem(IDC_REFRESH)->EnableWindow(FALSE);
GetDlgItem(IDC_SEND)->EnableWindow(FALSE);
menu->ModifyMenu(IDC_CALL,MF_BYCOMMAND|MF_STRING,IDC_CALL,"呼叫(&C)...");
menu->EnableMenuItem(IDC_ANSWER,MF_BYCOMMAND|MF_GRAYED);
menu->EnableMenuItem(ID_SEND_VIDEO,MF_BYCOMMAND|MF_GRAYED);
}
else
{
if(m_pep->GetConnectionCount()>0)
{
GetDlgItem(IDC_CALL)->SetWindowText("挂断");
menu->ModifyMenu(IDC_CALL,MF_BYCOMMAND|MF_STRING,IDC_CALL,"挂断(&H)");
}
else
{
GetDlgItem(IDC_CALL)->SetWindowText("呼叫...");
menu->ModifyMenu(IDC_CALL,MF_BYCOMMAND|MF_STRING,IDC_CALL,"呼叫(&C)...");
}
menu->EnableMenuItem(ID_SEND_VIDEO,MF_BYCOMMAND|(m_pep->GetConnectionStatus(m_connID)==ConnEstablished?MF_ENABLED:MF_GRAYED));
menu->EnableMenuItem(IDC_ANSWER,MF_BYCOMMAND|(m_pep->GetConnectionStatus(m_connID)==IncomingCallWait?MF_ENABLED:MF_GRAYED));
GetDlgItem(IDC_ANSWER)->EnableWindow(m_pep->GetConnectionStatus(m_connID)==IncomingCallWait);
GetDlgItem(IDC_REFRESH)->EnableWindow(m_pep->GetConnectionStatus(m_connID)==ConnEstablished);
GetDlgItem(IDC_SEND)->EnableWindow(m_pep->GetConnectionStatus(m_connID)==ConnEstablished);
switch(m_pep->GetConnectionStatus(m_connID))
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -