?? tapiphonedlg.cpp
字號:
// tapiPhoneDlg.cpp : 實現文件
//
#include "stdafx.h"
#include "tapiPhone.h"
#include "tapiPhoneDlg.h"
#include "tapiPhoneSetupDlg.h"
#include "control.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于應用程序“關于”菜單項的 CAboutDlg 對話框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 對話框數據
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 實現
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CtapiPhoneDlg 對話框
CtapiPhoneDlg::CtapiPhoneDlg(CWnd* pParent /*=NULL*/)
: CDialog(CtapiPhoneDlg::IDD, pParent)
, m_AutoAnswer(FALSE)
, m_valStcMsg(_T(""))
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_valEdtNum = "";
m_valCallerNum = "呼入方號碼: 當前無呼叫";
}
void CtapiPhoneDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_BTN_DISCONNECT, m_btDisconnect);
DDX_Control(pDX, IDC_BTN_CALL, m_btCall);
DDX_Control(pDX, IDC_BTN_CONFIG, m_btConfig);
DDX_Control(pDX, IDC_BTN_PICKUP, m_btPickup);
DDX_Check(pDX, IDC_CHK_AUTO, m_AutoAnswer);
DDX_Text(pDX, IDC_STC_STATUS, m_valStcMsg);
DDX_Text(pDX, IDC_EDIT_NUMBER, m_valEdtNum);
DDX_Text(pDX, IDC_STATIC_, m_valCallerNum);
DDX_Control(pDX, IDC_STC_IMAGE, m_stcImage);
}
BEGIN_MESSAGE_MAP(CtapiPhoneDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDC_BTN_PICKUP, OnBnClickedBtnPickup)
//用戶自定義消息響應函數
ON_MESSAGE(WM_PRIVATETAPIEVENT, OnTapiEvent)
ON_BN_CLICKED(IDC_CHK_AUTO, OnBnClickedChkAuto)
ON_BN_CLICKED(IDC_BTN_DISCONNECT, OnBnClickedBtnDisconnect)
ON_BN_CLICKED(IDC_BTN_CALL, OnBnClickedBtnCall)
ON_BN_CLICKED(IDC_BTN_EXIT, OnBnClickedBtnExit)
ON_BN_CLICKED(IDC_BTN_CONFIG, OnBnClickedBtnConfig)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
// CtapiPhoneDlg 消息處理程序
BOOL CtapiPhoneDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 將\“關于...\”菜單項添加到系統菜單中。
// IDM_ABOUTBOX 必須在系統命令范圍內。
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);
}
}
// 設置此對話框的圖標。當應用程序主窗口不是對話框時,框架將自動
// 執行此操作
SetIcon(m_hIcon, TRUE); // 設置大圖標
SetIcon(m_hIcon, FALSE); // 設置小圖標
// TODO:在此添加額外的初始化代碼
//初始化TAPI,在此之前必需調用 AfxOleInit()初始化 COM
//將窗口的句柄 m_hWnd 傳給 CTapi,使二者之間建立聯系
m_Tapi.m_hWnd = this->m_hWnd;
if( FAILED(m_Tapi.InitializeTapi()) )
{
MessageBox("致命錯誤:TAPI 初始化失敗!");
return FALSE;
}
//
// 初始化按鈕狀態
//
m_btCall.EnableWindow();
m_btDisconnect.EnableWindow();
m_btPickup.EnableWindow(FALSE);
SetStatusMessage("準備就緒,等待電話呼入...");
// HBITMAP hBitmap;
// m_stcImage.SetBitmap(hBitmap);
return TRUE; // 除非設置了控件的焦點,否則返回 TRUE
}
void CtapiPhoneDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向對話框添加最小化按鈕,則需要下面的代碼
// 來繪制該圖標。對于使用文檔/視圖模型的 MFC 應用程序,
// 這將由框架自動完成。
void CtapiPhoneDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于繪制的設備上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
// 使圖標在工作矩形中居中
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;
// 繪制圖標
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
//當用戶拖動最小化窗口時系統調用此函數取得光標顯示。
HCURSOR CtapiPhoneDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
/////////////////////////////////////////////////////////////////////////////////////
// SetStatusMessage
//
// 顯示當前系統消息
/////////////////////////////////////////////////////////////////////////////////////
void CtapiPhoneDlg::SetStatusMessage(CString strMsg)
{
m_valStcMsg = strMsg;
UpdateData(FALSE);
}
/////////////////////////////////////////////////////////////////////////////////////
//
// 以下是用戶界面事件響應函數
//
/////////////////////////////////////////////////////////////////////////////////////
void CtapiPhoneDlg::OnBnClickedBtnPickup()
{
//
// 接聽電話
//
SetStatusMessage("正在準備接聽...");
if ( S_OK == m_Tapi.AnswerTheCall() )
{
SetStatusMessage("通話中");
m_btDisconnect.EnableWindow();
m_btPickup.EnableWindow(FALSE);
}
else
{
m_btPickup.EnableWindow(FALSE);
MessageBox("沒有接聽成功!");
SetStatusMessage("準備就緒,等待來電...");
}
}
void CtapiPhoneDlg::OnBnClickedChkAuto()
{
//
// 自動接聽與手工接聽之間切換
//
UpdateData();
}
void CtapiPhoneDlg::OnBnClickedBtnDisconnect()
{
//
// 如果是電話另一方先掛斷電話,則 m_pCall 已經掛斷并且釋放
// 此處不用再次掛斷
//
if ( m_Tapi.m_pCall != NULL )
{
SetStatusMessage("正在掛斷電話...");
// 掛斷電話
if (S_OK != m_Tapi.DisconnectTheCall())
{
MessageBox("掛斷電話失敗!");
}
else
{
m_btCall.EnableWindow();
m_btPickup.EnableWindow(FALSE);
m_valCallerNum = "呼入方號碼: 當前無呼叫";
SetStatusMessage("準備就緒,正在等待電話呼入...");
}
}
}
void CtapiPhoneDlg::OnBnClickedBtnCall()
{
//
// 呼叫號碼
//
DWORD dwAddressType;
BSTR szAddressToCall;
UpdateData();
if( m_valEdtNum.GetLength() <= 2 )
return;
szAddressToCall = m_valEdtNum.AllocSysString();
SetStatusMessage( "正在呼叫..." );
dwAddressType = LINEADDRESSTYPE_PHONENUMBER ;
// 開始呼叫
if ( S_OK == m_Tapi.MakeTheCall(dwAddressType, szAddressToCall) )
{
m_btDisconnect.EnableWindow();
m_btPickup.EnableWindow(FALSE);
m_btCall.EnableWindow(FALSE);
}
else
{
MessageBox("呼叫失敗!");
}
SysFreeString(szAddressToCall);
// m_Tapi.PreparePlay("Greeting.wav");
}
void CtapiPhoneDlg::OnBnClickedBtnExit()
{
// 退出程序
OnOK();
}
void CtapiPhoneDlg::OnBnClickedBtnConfig()
{
// 把配置對話框中的數據傳入
CtapiPhoneSetupDlg SetupDlg;
if(SetupDlg.DoModal() == IDOK)
{
m_Tapi.m_WelcomeFileName = SetupDlg.m_strFileName0;
strFileName0 = SetupDlg.m_strFileName0;
strFileName1 = SetupDlg.m_strFileName1;
strFileName2 = SetupDlg.m_strFileName2;
strPath = SetupDlg.m_strPath;
}
}
///////////////////////////////////////////////////////////////////
// OnTapiEvent
//
// 這是真正的事件處理函數,當 UI 線程接收到 WM_PRIVATETAPIEVENT消息
// 時調用此函數,在 UI 線程中進行事件響應處理
//
///////////////////////////////////////////////////////////////////
LRESULT
CtapiPhoneDlg::OnTapiEvent(
WPARAM wp,
LPARAM lp
)
{
TAPI_EVENT TapiEvent = (TAPI_EVENT)wp;
IDispatch *pEvent = (IDispatch*) lp;
if( TapiEvent == TE_DIGITEVENT )
MessageBox("TE_DIGITEVENT");
else if(TapiEvent == TE_GENERATEEVENT )
MessageBox("TE_GENERATEEVENT");
else if(TapiEvent == TE_GATHERDIGITS)
MessageBox("TE_GATHERDIGITS");
switch ( TapiEvent )
{
case TE_CALLNOTIFICATION:
{
//
// TE_CALLNOTIFICATION: 程序發現一個呼入的電話
//
TRACE("Event:-----------TE_CALLNOTIFICATION----------Event\n");
DoCallNotification(pEvent);
break;
}//TE_CALLNOTIFICATION
case TE_CALLSTATE:
{
//
// TE_CALLSTATE: 程序發現整個 Call 過程狀態有變化
//
TRACE("Event:-----------TE_CALLSTATE----------Event\n");
DoCallState(pEvent);
break;
}//TE_CALLSTATE
case TE_CALLMEDIA:
{
//
// TE_CALLMEDIA:關于媒體的事件,如有某種媒體到達
//
TRACE("Event:-----------TE_CALLMEDIA----------Event\n");
DoCallMedia(pEvent);
break;
}//TE_CALLMEDIA
case TE_FILETERMINAL:
{
//
// TE_FILETERMINAL:文件終端事件,只在 TAPI3.1 中支持
//
TRACE("Event:-----------TE_FILETERMINAL----------Event\n");
DoFileEvent(pEvent);
break;
}//TE_FILETERMINAL
case TE_DIGITEVENT:
{
//
// TE_DIGIT:接受到按鍵事件
//
TRACE("Event:-----------TE_DIGITEVENT----------Event\n");
DoDigitEvent(pEvent);
break;
}
default:
break;
}
pEvent->Release(); // 因為在 CTAPIEventNotification::Event() 中調用過 AddRef
return S_OK;
}
/////////////////////////////////////////////////////////////////////////////////////
// 處理 TE_NOTIFICATION 事件,有新電話打入時觸發此事件
// 功能:
// 1、獲取撥入方信息,主要是對方電話號碼或IP
// 2、獲取 ITBasicCallControl,存入 m_pCall,
// 3、更新用戶界面
// 注意:不能在此時就應答電話,應用程序應當等待 TE_CALLSTATE 事件觸發并判斷當前事件為
// CS_OFFERING 時才可以。
/////////////////////////////////////////////////////////////////////////////////////
HRESULT CtapiPhoneDlg::DoCallNotification( IN IDispatch * pEvent)
{
//
//通過接口 ITCallNotificationEvent 可以獲得所有關于撥入事件的信息,這里主要用來得到 ITCallInfo
//
ITCallNotificationEvent * pNotify;
HRESULT hr;
hr = pEvent->QueryInterface( IID_ITCallNotificationEvent, (void **)&pNotify );
if (S_OK != hr)
{
MessageBox( "有電話乎入,但獲得接口 ITCallNotificationEvent 失敗!");
}
else
{
//
//通過 ITCallInfo 獲得撥入方信息,如撥入方電話號碼等
//
CALL_PRIVILEGE cp;
ITCallInfo * pCall;
//
// 得到 ITCallInfo 的指針
//
hr = pNotify->get_Call( &pCall );
pNotify->Release();
if ( SUCCEEDED(hr) )
{
//
// 檢測我們對 call 是否擁有 owner 權限
//
hr = pCall->get_Privilege( &cp );
if ( FAILED(hr) || (CP_OWNER != cp) )
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -