www.pudn.com > 使用语音卡做的投诉抢修管理系统.zip > DBtestView.cpp


// DBtestView.cpp : implementation of the CDBtestView class 
// 
// 视图类:程序主要在此编写 
// 功能:处理计算机和电话之间的各种信息,包括投诉、抢修、和查询等。 
// 编者:徐景周 
// 日期:1999.4.18 
 
 
#include "stdafx.h" 
#include "DBtest.h" 
#include "TW8a.h" 
#include "DBtestSet.h" 
#include "DBtestDoc.h" 
#include "DBtestView.h" 
#include "RingOption.h" 
#include "PhonenumOpt.h" 
#include "FindIt.h" 
#include  
#include  
#include  
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
#define WAIT_TIMER	20 	/* 20 seconds */ 
 
#define LEFT		320  //信息窗视图框架 
#define TOP			340 
#define RIGHT		1024 
#define HEIGHT		22 
 
#define ID_TIMER	1025   //计数器号 
#define PASSWORDBIT	4     //口令位数 
 
 
#define INFORMATION1	".\\message1.tw" 
#define INFORMATION2	".\\message2.tw" 
#define INFORMATION3	".\\message3.tw"   // 信息文件 
#define VOICE_FILE      ".\\sample.tw"     
 
 
#define CHANNELS_IN_TW8A 8                 //硬件设置参数 
WORD AdapterNumber, TW_ChannelNumber; 
DWORD TW_IRQ; 
char Status[MAX_CHANNELS+1]; 
 
typedef enum  
{	 
	WS_AUTODIAL,         //自动拔号状态 
    WS_DIALOUT, 
	WS_TIMER, 
	WS_RECORDINFORMATION, 
	WS_BUSY, 
	WS_HANGUP,								//挂机状态 
	WS_PLAY,	//放音状态 
	WS_PLAYINF,     //播放信息文件状态 
	WS_RECORD,								//录音状态 
	WS_WAITFORPASSWORD,						//等待密码状态(限时10秒) 
	WS_WAITFORFILE,	 
	WS_DEFAULT,       //等待数据库给出放音文件名 
} WORKING_STATUS;							//内外线电话状态 
WORKING_STATUS	CS[MAX_CHANNELS];	 
 
char	ChMess[MAX_CHANNELS][64]; 
char	filename[4][25];					//通道中进行录、放音的文件名 
char	*filenamestr;			 
char	welcomfile[]=".\\newwelcom.tw";     		//初始放音文件名,初始时播放 
char	chooseappeal[]=".\\newchooseappeal.tw";//选择投诉放音文件名,按1时播放 
char	leaveword[]=".\\tvcall.tw";			//留言放音文件名,按2时播放 
char	chooseinf[]=".\\thanks.tw";			//选择信息放音文件名,按3时播放 
char	particular[]=".\\particular.tw";		//特殊功能放音文件名,按0时播放 
char	recordinf[]=".\\recordinf.tw";			//选择录音类型提示文件名 
char	choosecommand[]=".\\choosecommand.tw";	//选择放音类型提示文件名 
char    dialout[]=".\\dialout.tw"; 
 
typedef enum      //在线实时状态结构 
{ 
	START, 
	APPEAL, 
	LEAVEWORD, 
	INQUIRE, 
	PARTICULAR, 
	CHOOSECOMMAND, 
	RECORDINF, 
}LINE_STATUS; 
LINE_STATUS inputchar[MAX_CHANNELS]; 
 
typedef struct 
{     
    char PhoneNumber[13]; 
	unsigned int RecordNumber; 
    char FileName[25]; 
	int  Type; 
} APPEAL_STRUC; 
 APPEAL_STRUC ad ;    // 投诉库结构  
 
typedef enum 
{   
	WS_INITIALIZED, 
	WS_STARTDIAL, 
	WS_ONDIAL, 
	WS_WAITOFFHOOK, 
	WS_CALLBACK, 
	WS_STARTPLAY, 
	WS_ONPLAY, 
	WS_WAITHANGUP, 
} DIAL_STATUS; 
  DIAL_STATUS DIAL[MAX_CHANNELS]; //自动拨号结构 
 
//FILE *fp; 
unsigned int Count,RecordNum; 
char Fname[21],Temp,Type;             //文件结构   
char Key; 
int ch1;  
unsigned int FileLen ; 
 
char truepassword1[]="1999"; 
char truepassword2[]="2000";     //口令检验 
char password[5]; 
int passwordpointer; 
 
char cPhoneNum[8];    //内线拔出 
int iPointer=0; 
 
char cType[9]; 
char cTemp1[6],cTemp2[6];  //数据库更新临时变量 
 
int iTitleHeight;         //连续打印字体高度 
int iContextHeight; 
int iRowTotal; 
 
char PhoneNum[4][14];  //存贮设置的电话号码 
 
///////////////////////////////////////////////////////////////////////////// 
// CDBtestView 
 
IMPLEMENT_DYNCREATE(CDBtestView, CRecordView) 
 
BEGIN_MESSAGE_MAP(CDBtestView, CRecordView) 
	//{{AFX_MSG_MAP(CDBtestView) 
	ON_COMMAND(ID_RECORD_ADD, OnRecordAdd) 
	ON_COMMAND(ID_RECORD_DELETE, OnRecordDelete) 
	ON_COMMAND(ID_SORT_ID, OnSortId) 
	ON_COMMAND(ID_SORT_TYPE, OnSortType) 
	ON_COMMAND(ID_SORT_FILENAME, OnSortFilename) 
	ON_COMMAND(ID_RECORD_PLAY, OnRecordPlay) 
	ON_COMMAND(ID_RECORD_FIRST, OnRecordFirst) 
	ON_COMMAND(ID_RECORD_LAST, OnRecordLast) 
	ON_COMMAND(ID_RECORD_NEXT, OnRecordNext) 
	ON_COMMAND(ID_RECORD_PREV, OnRecordPrev) 
	ON_BN_CLICKED(IDC_BUTTONOK, OnButtonok) 
	ON_BN_CLICKED(IDC_BUTTONCANCEL, OnButtoncancel) 
	ON_WM_TIMER() 
	ON_WM_PAINT() 
	ON_COMMAND(ID_RECORD_REPAIR, OnRecordRepair) 
	ON_EN_KILLFOCUS(IDC_RECORD_MEMO, OnKillfocusRecordMemo) 
	ON_WM_DESTROY() 
	ON_COMMAND(ID_RING, OnRing) 
	ON_COMMAND(ID_RECORD_QUERY, OnRecordQuery) 
	ON_COMMAND(ID_PHONENUM, OnPhonenum) 
	//}}AFX_MSG_MAP 
	// Standard printing commands 
	ON_COMMAND(ID_FILE_PRINT, CRecordView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CRecordView::OnFilePrint) 
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CRecordView::OnFilePrintPreview) 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CDBtestView construction/destruction 
 
CDBtestView::CDBtestView() 
	: CRecordView(CDBtestView::IDD) 
{ 
	//{{AFX_DATA_INIT(CDBtestView) 
	m_pSet = NULL; 
	m_bAdding=FALSE; 
	m_IntTimes = 0; 
	//}}AFX_DATA_INIT 
  
} 
 
CDBtestView::~CDBtestView() 
{ 
} 
 
void CDBtestView::OnPaint()  
{ 
 LOGFONT m_font; 
 CFont font; 
 
	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 
	{ 
	    CDC	*	pDC; 
	    PAINTSTRUCT	ps; 
 
		pDC = BeginPaint(&ps);  
 
		 //3D阴影标题字体属性设置 
        memset(&m_font,0,sizeof(m_font)); 
        m_font.lfHeight=16; 
	    m_font.lfWidth=8; 
	    m_font.lfWeight=FW_SEMIBOLD; 
	    m_font.lfCharSet=GB2312_CHARSET; 
	    strcpy(m_font.lfFaceName,"隶书"); 
	    m_font.lfHeight*=4;    //字体放大倍数 
	    m_font.lfWidth*=4; 
			//在客户区显示3D阴影标题字(黑白组成) 
	    font.CreateFontIndirect(&m_font); 
		CFont *pOldFont=pDC->SelectObject(&font); 
		int nOldMode=pDC->SetBkMode(TRANSPARENT); 
		COLORREF OldColor=pDC->SetTextColor(RGB(0,0,0)); 
		pDC->TextOut(LEFT-30,TOP-200,"投诉抢修管理系统"); 
		pDC->SetTextColor(RGB(255,255,255)); 
		pDC->TextOut(LEFT-25,TOP-195,"投诉抢修管理系统"); 
		pDC->SetTextColor(OldColor);  //恢复原始字体设置  
		pDC->SetBkMode(nOldMode); 
		pDC->SelectObject(pOldFont);   
		 
		//显示通道当前状态提示 
	    for (WORD i = 0; i < TW_ChannelNumber; ++i) 
			pDC->TextOut(LEFT, TOP + i * HEIGHT, ChMess[i], strlen (ChMess[i])); 
	    EndPaint (&ps); 
		 
		CRecordView::OnPaint();	 
	} 
	// Do not call CRecordView::OnPaint() for painting messages 
} 
 
  
 
 
void CDBtestView::DoDataExchange(CDataExchange* pDX) 
{ 
	CRecordView::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CDBtestView) 
	DDX_Control(pDX, IDC_RECORD_NUM, m_oNum); 
	DDX_Control(pDX, IDC_BUTTONOK, m_oOk); 
	DDX_Control(pDX, IDC_BUTTONCANCEL, m_oCancel); 
	DDX_Control(pDX, IDC_RECORD_MEMO, m_oMemo); 
	DDX_Control(pDX, IDC_RECORD_FILENAME, m_oFilename); 
	DDX_Control(pDX, IDC_RECORD_TYPE, m_oType); 
	DDX_Control(pDX, IDC_RECORD_ID, m_oSampleID); 
	DDX_FieldText(pDX, IDC_RECORD_FILENAME, m_pSet->m_FileName, m_pSet); 
	DDX_FieldText(pDX, IDC_RECORD_MEMO, m_pSet->m_memo, m_pSet); 
	DDV_MaxChars(pDX, m_pSet->m_memo, 256); 
	DDX_FieldText(pDX, IDC_RECORD_TYPE, m_pSet->m_type, m_pSet); 
	DDX_FieldText(pDX, IDC_RECORD_ID, m_pSet->m_sampleID, m_pSet); 
	DDX_FieldText(pDX, IDC_RECORD_NUM, m_pSet->m_RecordNum, m_pSet); 
	//}}AFX_DATA_MAP 
} 
 
BOOL CDBtestView::PreCreateWindow(CREATESTRUCT& cs) 
{ 
	// TODO: Modify the Window class or styles here by modifying 
	//  the CREATESTRUCT cs 
     
	return CRecordView::PreCreateWindow(cs); 
} 
 
//在此监视并显示各内外线电话的摘挂机状态 
void CDBtestView::UpdateIntTimes() 
{ 
	int i; 
	char message[41]=""; 
	m_IntTimes++; 
 
	for (i = 0; i < TW_ChannelNumber; i++)  
	{ 
		//注意:放音模块为i=3时进行相应操作 
		switch (TW_ChannelType(i))  
		{ 
		case CT_INTERNAL: 
			Status[i] = TW_OffHookDetect(i)? '|' :'-'; 
			//sprintf(ChMess[i],"通道%d (内线) : 正在侦听...",i); 
	        //ChPaint(i); 
			InternalChannels (i); 
			break; 
 
		case CT_EXTERNAL: 
			Status[i] = TW_ListenerOffHook(i)? '|' : '-'; 
			//sprintf(ChMess[i],"通道%d (外线) : 正在侦听...",i); 
	        //ChPaint(i); 
			ExternalChannels (i); 
			break; 
		}  
	  if(Status[i]=='|') 
         strcat(message,"摘机 "); 
	  else 
		 strcat(message,"挂机 "); 
	   
	 	} 
	 
	GetDlgItem(IDC_EDIT_CHANNEL_STATUS)->SetWindowText(message); 
} 
 
void CDBtestView::OnTimer(UINT nIDEvent) //100毫秒更新一次计数器 
{ 
 	UpdateIntTimes();  //更新电话通道状态显示 
 
	CRecordView::OnTimer(nIDEvent); 
} 
 
 
void CDBtestView::ChPaint(WORD ch) 
{ 
	RECT	r; 
 
	if (IsIconic ()) //提示字符显示大小 
		return; 
	r.left	 = LEFT; 
	r.top	 = TOP + ch * HEIGHT;  
	r.right	 = RIGHT; 
	r.bottom = TOP + ch * HEIGHT + HEIGHT-1; 
	InvalidateRect (&r, TRUE); 
} 
 
void CDBtestView::CheckDtmf(WORD i)     //检查dtmf按键 
{ 
	int	d; 
 
	while ((d = TW_GetDTMFChar (i)) != -1)  
	{ 
		TW_StartTimer (i, WAIT_TIMER); 
		sprintf (ChMess[i], "通道%2d (%s) : 接收到DTMF '%c'", i, TW_ChannelType (i) == CT_INTERNAL ? "内线" : "外线", d); 
		ChPaint (i); 
	} 
} 
/*从系统时间获得文件名:0~3:年;4~6:月;7,8:日;9,10:时;11,12:分;*** 
***13,14:秒;15:留言(此位为0)或投诉类型(此位大于0),16:通道号(0或1)**** 
***17~19:文件名后缀:“.TW”;20:字符串结束标志:'\0'***********************/ 
char* CDBtestView::GetFileName(char type,int chnumber) 
{ 
	struct tm *newtime; 
	time_t aclock; 
	int i; 
	char *times; 
	static char filename[21]; 
	time( &aclock );                // Get time in seconds  
	newtime = localtime( &aclock ); // Convert time to struct tm form  
	times=asctime( newtime ); 
	for(i=0;i<=3;i++) 
		filename[i]=times[20+i];	//年 
	for(i=4;i<=6;i++) 
		filename[i]=times[i];		//月 
	for(i=7;i<=8;i++) 
		filename[i]=times[i+1];		//日 
	for(i=9;i<=10;i++) 
		filename[i]=times[i+2];		//时 
	for(i=11;i<=12;i++) 
		filename[i]=times[i+3];		//分 
	for(i=13;i<=14;i++) 
		filename[i]=times[i+4];		//秒 
	filename[15]=type;				//留言或投诉类型 
	filename[16]=chnumber+'0';		//通道号 
	filename[17]='.'; 
	filename[18]='t'; 
	filename[19]='w'; 
	filename[20]='\0'; 
	  
	return filename; 
} 
 
//外线电话管理模块 
void CDBtestView::ExternalChannels(WORD i) 
{ 
	WORD Sig; 
	DWORD	SigCount, SigLen; 
	int dtmf,j; 
    long fail; 
 
	switch (CS[i])  
	{ 
		/******挂机时收到外线来电进行摘机操作并播放提示语音文件*****/ 
		case WS_HANGUP : 
 
			if(bRingTime) 
			{ 
				//振铃1次之后摘机 
			if (TW_RingDetect (i) >iRingTimeNum) 
			{ 
				sprintf (ChMess[i], "通道%2d (外线) : 有外来振玲...",i);  
				ChPaint(i); 
				TW_OffHookCtrl (i); 
				TW_FlushDTMF (i); 
				inputchar[i]=START; 
				strcpy(filename[i],welcomfile);//播放初始放音文件 
				 
				if (TW_StartPlayFile (i, filename[i] , 0 , LONG_MAX) == -1) 
				{ 
					sprintf (ChMess[i], " 通道%d (外线) : 初始放音失败.", i); 
					ChPaint (i); 
					TW_HangUpCtrl (i); 
					CS[i] = WS_HANGUP; 
				} 
				else  
				{ 
				 
					TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; 
					  
			        sprintf (ChMess[i], "通道%2d (外线) : 正在播放提示音...", i); 
					ChPaint (i); 
					CS[i] = WS_PLAY; 
				} 
			} 
			//当外线无来电时查询是否拨号队列为空,若不空时,自动拨号播放相应文件 
			else  
			{ 
			 	 
			} 
			} 
			else 
			{ 
				//根据设置时间摘机 
				if(TW_RingDetect (i) >1) 
				{ 
				Sleep(iRingTimeNum ); 
				sprintf (ChMess[i], "通道%2d (外线) : 有外来振玲...",i);  
				ChPaint(i); 
				TW_OffHookCtrl (i); 
				TW_FlushDTMF (i); 
				inputchar[i]=START; 
				strcpy(filename[i],welcomfile);//播放初始放音文件 
				 
				if (TW_StartPlayFile (i, filename[i] , 0 , LONG_MAX) == -1) 
				{ 
					sprintf (ChMess[i], " 通道%d (外线) : 初始放音失败.", i); 
					ChPaint (i); 
					TW_HangUpCtrl (i); 
					CS[i] = WS_HANGUP; 
				} 
				else  
				{ 
				 
					TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; 
					  
			        sprintf (ChMess[i], "通道%2d (外线) : 正在播放提示音...", i); 
					ChPaint (i); 
					CS[i] = WS_PLAY; 
				} 
			} 
			} 
			break; 
 
		/******播放提示语音文件时对用户挂机、按键进行相应处理,无操作时重复播放******/ 
		case WS_PLAY : 
			/* 
				Can't call TW_CheckSignal(...) here 
			*/ 
			//当用户挂机时 
			if (TW_MonitorBusy (i, SIG_BUSY1, 5) || TW_MonitorBusy (i, SIG_BUSY2, 5)) 
			{ 
				sprintf (ChMess[i], "通道%2d (外线) : 在播放提示音期间用户挂机.", i); 
				ChPaint (i); 
				TW_StopPlayFile (i); 
				TW_StopPlayFile(3);     //放音模块放音 
				TW_HangUpCtrl (i); 
				CS[i] = WS_HANGUP; 
			} 
		 
			//当用户有按键时 
			else if((dtmf=TW_GetDTMFChar (i)) != -1) 
			{ 
				TW_StopPlayFile(i); 
				TW_StopPlayFile(3); 
			/*************在初使状态时按键***************/ 
				if(inputchar[i]==START) 
				{ 
					switch	(dtmf)//根据按键不同转入不同功能 
					{ 
						case  '1' ://进入投诉功能 
						inputchar[i]=APPEAL; 
						strcpy(filename[i] , chooseappeal); 
						break; 
 
						case  '2' ://进入留言功能 
						inputchar[i]=LEAVEWORD; 
						strcpy(filename[i] , leaveword); 
						break; 
 
						case  '3' ://进入查询功能 
						inputchar[i]=INQUIRE; 
						strcpy(filename[i] , chooseinf); 
						break; 
 
						case  '0' ://进入领导功能 
						inputchar[i]=PARTICULAR; 
						TW_FlushDTMF(i); 
						strcpy(filename[i] , particular); 
						break; 
 
						default: 
						strcpy(filename[i] , welcomfile); 
						break; 
					} 
					TW_StartPlayFile(i , filename[i] , 0 , LONG_MAX); 
				      
				    TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ;  //放音模块开始播放 
				} 
				/**************在播放选择投诉或留言提示过程中按键***********/ 
				else if( inputchar[i] == APPEAL || inputchar[i] == LEAVEWORD) 
				{ 
					switch (dtmf) 
					{ 
					case '1': 
					case '2': 
					case '3': 
					case '4': 
						if(inputchar[i]==LEAVEWORD) dtmf='0'; 
						filenamestr=GetFileName(dtmf,i); 
						strcpy(filename[i],filenamestr); 
   						fail=TW_StartRecordFile( i , filename[i] , 0 , LONG_MAX); 
                        if( fail==-1) 
						{ 
							MessageBox("初始录音失败!","错误",MB_OK|MB_ICONSTOP); 
							strcpy(filename[i],welcomfile); 
							TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
				            TW_StartPlayFile (3, filename[i], 0 , LONG_MAX); //放音模块开始播放 
							CS[i]=WS_PLAY; 
							inputchar[i]=START; 
						 
						} 
						else			 
						  CS[i]=WS_RECORD; 
					 break; 
					default: 
						if(inputchar[i]==LEAVEWORD) 
						{ 
						filenamestr=GetFileName('0',i); 
						strcpy(filename[i],filenamestr); 
						fail=TW_StartRecordFile(i,filename[i],0,LONG_MAX); 
					    if (fail==-1) //录音失败 
						{ 
							MessageBox("初始录音失败!","错误",MB_ICONQUESTION); 
							strcpy(filename[i],welcomfile); 
							TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
				            TW_StartPlayFile (3, filename[i], 0 , LONG_MAX); //放音模块开始播放 
							CS[i]=WS_PLAY;                                     
							inputchar[i]=START; 
						} 
						else 
						  CS[i]=WS_RECORD; 
						}	 
						else                              
						{ 
						strcpy(filename[i],welcomfile); 
						inputchar[i]=START; 
						TW_StartPlayFile( i , filename[i] , 0 , LONG_MAX); 
				        TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块开始播放 
						} 
					break; 
					} 
				} 
				else if(inputchar[i]==INQUIRE)//进入查询功能 
				{ 
					switch (dtmf) 
					{ 
					case '1': 
						strcpy(filename[i],INFORMATION1); 
						CS[i]=WS_PLAYINF; 
						break; 
					case '2': 
						strcpy(filename[i],INFORMATION2); 
						CS[i]=WS_PLAYINF; 
						break; 
					case '3': 
						strcpy(filename[i],INFORMATION3); 
						CS[i]=WS_PLAYINF; 
						break; 
					default: 
						strcpy(filename[i],chooseinf); 
						break; 
					} 
					TW_StartPlayFile(i , filename[i] , 0 , LONG_MAX); 
				    TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ;  //放音模块 
					while(TW_PlayFileRest(i)>0&&TW_PlayFileRest(3)>0); 
				} 
				else if(inputchar[i]==PARTICULAR)	//进入特殊功能输入密码 
				{ 
					passwordpointer=0; 
					password[passwordpointer++]=dtmf; 
				    TW_StartTimer(i,30); 
					CS[i]=WS_WAITFORPASSWORD; 
				} 
				 
				else if(inputchar[i]==CHOOSECOMMAND)//正在播放选择放音文件时有按键则停止放音 
				{ 
					//将放音要求送入放音队列并等待 
					Key=dtmf; 
	                if((Key=='*'||Key=='#')&&!(m_pSet->IsEOF())) 
						m_pSet->MoveLast(); 
					else if(!m_pSet->IsBOF()) 
						  m_pSet->MoveFirst(); 
 
				  
					CS[i]=WS_WAITFORFILE; 
				 
 
				} 
				else if(inputchar[i]==RECORDINF)//正在选择录制信息文件时有按键则进入相应录音状态 
				{ 
					switch (dtmf) 
					{	 
					 case '1': 
						TW_StartRecordFile(i , INFORMATION1 , 0 , LONG_MAX); 
						sprintf(ChMess[i],"通道%2d (外线) : 正在录制信息文件1...",i); 
						ChPaint(i); 
						for(j=0;j<30000;j++) ; 
						CS[i]=WS_RECORD; 
						break; 
				    case '2': 
						TW_StartRecordFile(i , INFORMATION2 , 0 , LONG_MAX); 
					    sprintf(ChMess[i],"通道%2d (外线) : 正在录制信息文件2...",i); 
						ChPaint(i); 
						for(j=0;j<30000;j++); 
						CS[i]=WS_RECORD; 
						break; 
					case '3': 
						TW_StartRecordFile(i , INFORMATION3 , 0 , LONG_MAX); 
						sprintf(ChMess[i],"通道%2d (外线) : 正在录制信息文件3...",i); 
						ChPaint(i); 
						for(j=0;j<30000;j++); 
						CS[i]=WS_RECORD; 
						break; 
                    default : 
						sprintf(ChMess[i],"通道%2d (外线) : 选择录制文件的类型错!",i); 
						ChPaint(i); 
						strcpy(filename[i],welcomfile); 
						TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
				        TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块 
						CS[i]=WS_PLAY; 
						inputchar[i]=START; 
						break; 
					} 
					 
				} 
			} 
				//当提示语音文件或选择放音文件播放完时 
			else if (TW_PlayFileRest (i) <= 0 && TW_PlayFileRest (3) <= 0 )  
			{ 
				sprintf (ChMess[i], "通道%2d (外线) : 提示音播放完成.", i); 
				ChPaint (i); 
				TW_StartPlayFile (i, filename[i] , 0 , LONG_MAX); 
 
				TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; 
				sprintf (ChMess[i], "通道%2d (外线) : 重新开始播放提示音...", i); 
				ChPaint (i); 
			} 
			else    //否则直到文件播放完 
			{ 
				TW_PlayFileRest(i); 
				TW_PlayFileRest(3); 
			} 
		break; 
 
        case WS_PLAYINF: 
			        	//正在播放信息文件时有按键则停止放音 
				 
					strcpy(filename[i],welcomfile); 
					TW_StartPlayFile(i , filename[i] , 0 , LONG_MAX); 
				    TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; 
			        CS[i]=WS_PLAY; 
					inputchar[i]=START; 
				   break; 
 
		case WS_RECORD: 
			if (TW_MonitorBusy (i, SIG_BUSY1, 5) || TW_MonitorBusy (i, SIG_BUSY2, 5)) 
			{ 
				sprintf (ChMess[i], "通道%2d (外线) : 在录音期间用户挂机.", i); 
				ChPaint (i); 
				 
				TW_StopRecordFile (i); 
				//若不为录制信息文件状态则将文件名放入队列 
				if(inputchar[i]!=RECORDINF) 
				{ 
					//将文件名放入队列 
				} 
				TW_HangUpCtrl (i); 
				CS[i] = WS_HANGUP; 
		 
			} 
			else if((dtmf=TW_GetDTMFChar (i)) != -1) 
			{ 
			    
			    for(j=0;j<30000;j++) ; 
				TW_StopRecordFile(i); 
				//若不为录制信息文件状态则将文件名放入队列 
				if(inputchar[i]!=RECORDINF) 
				{ 
				//将文件名放入队列 
                   
					sprintf(ChMess[i],"通道%d (外线) : 正在保存记录信息...",i); 
					ChPaint(i); 
 
                    m_pSet->MoveLast(); 
					RecordNum=m_pSet->m_RecordNum+1; 
					if(!m_pSet->CanAppend()) 
						MessageBox("记录不能被添加到数据库中!","数据库打开错误",MB_ICONERROR); 
                    else 
					{ 
					m_pSet->AddNew(); 
 
					m_pSet->m_RecordNum=RecordNum; 
                    m_pSet->m_FileName=filename[i]; 
					m_pSet->m_type=filename[i][15]; 
		            m_pSet->m_memo=""; 
					if(m_pSet->CanUpdate()) 
					 m_pSet->Update(); 
					else 
						MessageBox("数据库不能被更新!","数据库错误",MB_ICONERROR); 
                     
                    m_pSet->Requery();  
					m_pSet->MoveLast(); 
					} 
				   
			     if( filename[i][15]!='0') 
				 {  
				   sprintf(ChMess[i],"通道%2d (外线) : 计算机进行自动投诉. ",i); 
				   ChPaint(i); 
				   TW_HangUpCtrl(i); 
				   
				   CS[i]=WS_AUTODIAL; 
				   DIAL[i]=WS_INITIALIZED; 
				   strcpy(ad.FileName,filename[i]); 
				    
				   switch(filename[i][15]) 
				   { case '1':                     //安装部门 
				             if(bPhoneNum) 
								 strcpy(ad.PhoneNumber,PhoneNum[0]);  
							 else 
				                 strcpy(ad.PhoneNumber,"8637772"); 
 
							 break; 
				     case '2':                 //抢修部门 
						     if(bPhoneNum) 
								 strcpy(ad.PhoneNumber ,PhoneNum[1]); 
							 else 
						         strcpy(ad.PhoneNumber,"8630031"); 
 
							 break; 
					 case '3':                 //维护部门 
						     if(bPhoneNum) 
								  strcpy(ad.PhoneNumber ,PhoneNum[2]); 
							 else 
						          strcpy(ad.PhoneNumber,"999,669507"); 
 
							 break; 
					 default:                  //咨询部门 
						     sprintf(ChMess[i],"通道%2d (外线) : 选择投诉的类型错误,一律按内线处理!",i); 
   							 ChPaint(i); 
							 TW_HangUpCtrl (i); 
							 TW_GenerateRing(2); 
							 CS[2]=WS_DEFAULT; 
							 break; 
				   } 
				    TW_StartTimer(i,11); 
                 } 
   				else 
				{ 
				 strcpy(filename[i],welcomfile); 
			     TW_StartPlayFile(i , filename[i] , 0 , LONG_MAX); 
				 TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; 
				 inputchar[i]=START; 
				 CS[i]=WS_PLAY; 
				} 
				}  
			   else     //播放欢迎信息文件 
				{ 
					strcpy(filename[i],welcomfile);		 
				    TW_StartPlayFile(i , filename[i] , 0 , LONG_MAX); 
				    TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; 
					inputchar[i]=START; 
					CS[i]=WS_PLAY; 
					 
				}	 
			} 
			else  
				TW_RecordFileRest(i);      //否则完成录制信息文件 
			 
		break; 
 
 
        case WS_AUTODIAL:   //自动拔号进行投诉 
			  switch(DIAL[i]) 
			  { 
			  case WS_INITIALIZED:			    
				 
					  if(TW_TimerElapsed(i)<0) 
					  { 
					  TW_OffHookCtrl(i); 
					  DIAL[i]=WS_STARTDIAL; 
					  sprintf(ChMess[i],"通道%2d (外线) : 计算机开始拔号.",i); 
					  ChPaint(i); 
					  } 
					 
					  break; 
			  case WS_STARTDIAL: 
				     
				    Sig=TW_CheckSignal(i,&SigCount,&SigLen); 
				    if(Sig==SIG_DIAL) 
					 { 
					  TW_StartDial(i,(LPCSTR)ad.PhoneNumber); 
					  DIAL[i]=WS_ONDIAL; 
					  sprintf(ChMess[i],"通道%2d (外线) : 计算机正在拔号...",i); 
					  ChPaint(i); 
					 } 
					// else 
					// { 
					//	 TW_HangUpCtrl(i); 
					//	 DIAL[i]=WS_INITIALIZED; 
					 //} 
					  break; 
              case  WS_ONDIAL: 
				      if(TW_DialRest(i)==0) 
					  {  
                        TW_GenerateRing(i);                        
						TW_StartTimer(i,90); 
						TW_StartMonitor(i); 
						DIAL[i]=WS_WAITOFFHOOK; 
						sprintf(ChMess[i],"通道%2d (外线) : 计算机完成拔号,等待摘机. ",i); 
						ChPaint(i); 
					     
                      } 
                      else  
						TW_DialRest(i); 
					  break; 
              case  WS_WAITOFFHOOK: 
				      if(TW_MonitorOffHook(i,25)) 
					  { 
						TW_PowerCtrl(i); 
						sprintf(ChMess[i],"通道%2d (外线) : 相应抢修部门已摘机. ",i); 
						ChPaint(i); 
						DIAL[i]=WS_STARTPLAY; 
						TW_StartTimer(i,40); 
						 
					  } 
					  else if(TW_TimerElapsed(i)<0) 
					  { 
						TW_HangUpCtrl(i); 
						strcpy(ad.PhoneNumber,"8227302"); 
						DIAL[i]=WS_INITIALIZED; 
						TW_StartTimer(i,11); 
						sprintf(ChMess[i],"通道%2d (外线) : 等待时间超时,计算机重拔上级号码... ",i); 
						ChPaint(i); 
					 
					  } 
					  break; 
			  case   WS_STARTPLAY: 
				     if(TW_StartPlayFile(i,ad.FileName,0,LONG_MAX)==0) 
					 {   
						 sprintf(ChMess[i],"通道%2d (外线) : 找到的投诉记录是空文件或不存在!",i); 
						 ChPaint(i); 
                         strcpy(filename[i],welcomfile); 
						 TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
						 TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
 
						 inputchar[i]=START; 
						 CS[i]=WS_PLAY; 
						 
                     } 
                     else 
					 { 
					 TW_StartPlayFile (3,  ad.FileName, 0 , LONG_MAX) ; //放音模块放音 
					   
					 sprintf(ChMess[i],"通道%2d (外线) : 计算机正在播放记录信息... ",i); 
					 ChPaint(i); 
					 DIAL[i]=WS_ONPLAY; 
					 } 
					 break; 
			  case  WS_ONPLAY: 
				     if(TW_MonitorBusy(i,SIG_BUSY1,5)|| TW_MonitorBusy(i,SIG_BUSY2,5)) 
					 { 
						TW_StopPlayFile(i); 
						TW_StopPlayFile(3); 
						TW_HangUpCtrl(i); 
						CS[i]=WS_HANGUP; 
					 
						sprintf(ChMess[i],"通道%2d (外线) : 相应抢修部门已挂机. " ,i); 
						ChPaint(i); 
					 
					 } 
					 else if(TW_TimerElapsed(i)<0) 
					 { 
						 TW_StopPlayFile(i); 
						 TW_StopPlayFile(3); 
						 TW_HangUpCtrl(i); 
						 CS[i]=WS_HANGUP; 
						 sprintf(ChMess[i],"通道%2d (外线) : 等待时间到,计算机结束播放!",i); 
						 ChPaint(i); 
			 
					 } 
					 else if(TW_PlayFileRest(i)<=0) 
					 { 
					    if(TW_PlayFileRest(3)<=0) 
						{ 
						 DIAL[i]=WS_STARTPLAY; 
						sprintf(ChMess[i],"通道%2d (外线) : 计算机已完成放音,再次重放...",i); 
						ChPaint(i); 
						} 
                        else 
							TW_PlayFileRest(3); 
					 } 
					 else 
					 { 
						 TW_PlayFileRest(i); 
                         TW_PlayFileRest(3); 
					 } 
					 break; 
			  } 
			 break; 
 
		case WS_WAITFORPASSWORD :   //等待密码状态 
			Sig = TW_CheckSignal (i, &SigCount, &SigLen); 
		     
			if ((Sig == SIG_BUSY1 || Sig == SIG_BUSY2) && SigCount >= 3) //忙音 
			{ 
				sprintf (ChMess[i], "通道%2d (外线) : 等待口令期间用户挂机!", i); 
				ChPaint (i); 
				TW_HangUpCtrl (i); 
				CS[i] = WS_HANGUP; 
			} 
		 
			else if((dtmf=TW_GetDTMFChar (i)) != -1)					//用户有按键 
			{ 
				password[passwordpointer++]=dtmf; 
				if(passwordpointer>=4)									//输入键达到4个 
				{ 
					password[4]='\0'; 
					if(strcmp(password,truepassword1)==0)				//选择放音文件密码正确 
					{ 
					strcpy(filename[i],choosecommand);					//播放选择播放命令文件 
					TW_StartPlayFile(i , filename[i] , 0 , LONG_MAX); 
					TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; 
 
			  
					sprintf(ChMess[i],"通道%2d (外线) : 正在选择相应留言或投诉信息文件.",i); 
					ChPaint(i); 
					inputchar[i]=CHOOSECOMMAND; 
					CS[i]=WS_PLAY; 
				  
					 
					} 
					else if(strcmp(password,truepassword2)==0) 
					{ 
					sprintf(ChMess[i],"通道%2d (外线) : 正在选择录制相应信息文件.",i); 
					ChPaint(i); 
					strcpy(filename[i],recordinf);						//播放选择录音文件类型 
					TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
					TW_StartPlayFile(i , filename[i] , 0 , LONG_MAX); 
					inputchar[i]=RECORDINF; 
					CS[i]=WS_PLAY; 
				 
					} 
					else  
					{ 
					sprintf(ChMess[i],"通道%2d (外线): 输入口令错,计算机自动挂机!",i); 
					ChPaint(i); 
					TW_HangUpCtrl (i); 
					CS[i] = WS_HANGUP; 
					} 
				} 
			} 
			else if (TW_TimerElapsed (i) < 0)							//等待时间到 
			{ 
				sprintf (ChMess[i], "通道%2d (外线) : 等待时间超时,计算机自动挂机.", i); 
				ChPaint (i); 
				TW_HangUpCtrl (i); 
				CS[i] = WS_HANGUP; 
			} 
		break; 
 
		case WS_WAITFORFILE: 
			 
				//查询相应的文件名区,若不为空时播放文件且 
				//取出第一个文件的指针开始放音 
 
		     
            if(Key=='*') 
			 { 
				 
				if(m_pSet->m_type=='0') 
				{ 
				   if(m_pSet->m_FileName=="") 
                  { 
					sprintf(ChMess[i],"通道%2d (外线) : 找到留言记录所对应的语音文件为空!",i); 
			        ChPaint(i); 
				  } 
				  else 
				  { 
				   strcpy(filename[i],m_pSet->m_FileName); 
				   TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
				   TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
				   while(TW_PlayFileRest(i)>0&&TW_PlayFileRest(3)>0) ; 
				  } 
				} 
				else 
				{ 
                 if(m_pSet->IsBOF()) 
				 {	 
			      sprintf(ChMess[i],"通道%2d (外线) : 没有找到相应类型的留言记录.",i); 
			      ChPaint(i); 
				 }				 
				 else	 
				 { 
					 m_pSet->MovePrev(); 
                      break; 
				 } 
				} 
			 } 
			 else if(Key=='#') 
			 { 
				 if(m_pSet->m_type=='1'||m_pSet->m_type=='2'||m_pSet->m_type=='3') 
				 { 
                    if(m_pSet->m_FileName=="") 
                  { 
					sprintf(ChMess[i],"通道%2d (外线) : 找到投诉记录所对应的语音文件为空!",i); 
			        ChPaint(i); 
				  } 
				  else 
				  { 
				   strcpy(filename[i],m_pSet->m_FileName); 
				   TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
				   TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
				   while(TW_PlayFileRest(i)>0&&TW_PlayFileRest(3)>0) ; 
				  } 
				 } 
				 else  
				 { 
					 if(!m_pSet->IsBOF()) 
					 { 
						 m_pSet->MovePrev(); 
						 break; 
					 } 
					 else 
					 { 
					   sprintf(ChMess[i],"通道%2d (外线) : 没有找到相应类型的投诉记录!",i); 
			           ChPaint(i);  
                     } 
				 } 
			 } 
             else 
			 { 
                if(!m_pSet->IsEOF()) 
				{ 
				  if(Key==m_pSet->m_type) 
				  { 
                    if(m_pSet->m_FileName=="") 
                  { 
					sprintf(ChMess[i],"通道%2d (外线) : 找到记录所对应的语音文件为空!",i); 
			        ChPaint(i); 
				  } 
				  else 
				  { 
				   strcpy(filename[i],m_pSet->m_FileName); 
				   TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
				   TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
				   while(TW_PlayFileRest(i)>0&&TW_PlayFileRest(3)>0) ; 
				  } 
				  } 
                   
				  m_pSet->MoveNext(); 
				  break; 
				} 
				else 
				{ 
                   	    sprintf(ChMess[i],"通道%d (外线) : 查询放音全部结束!",i); 
						ChPaint(i); 
 
						TW_FlushDTMF(i); 
						strcpy(filename[i],welcomfile); 
						TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
						TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; 
 
						CS[i]=WS_PLAY; 
						inputchar[i]=START; 
						break; 
				} 
			 } 
			sprintf(ChMess[i],"通道%d (外线) : 查询放音全部结束!",i); 
			ChPaint(i); 
 
		    TW_FlushDTMF(i); 
			strcpy(filename[i],welcomfile); 
			TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
			TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; 
 
			CS[i]=WS_PLAY; 
			inputchar[i]=START;	   
 
			break;     
 
 
		case WS_BUSY : 
			if (!TW_OffHookDetect (2))  
			{ 
				sprintf (ChMess[2], "通道%2d (内线) : 内线已在忙音等待下挂机.", i); 
				ChPaint (2); 
				TW_GenerateSignal (2, SIG_SILENCE); 
				CS[2] = WS_HANGUP; 
			} 
			break; 
 
		default: 
			break; 
	} 
} 
 
 // 内线模块实现如下 
void  CDBtestView::InternalChannels(WORD i) 
{ 
   WORD Sig; 
   DWORD  SigCount, SigLen; 
   int dtmf,j ; 
   //char ch; 
   //int point=1,result; 
  // long fail; 
	switch (CS[i]) { 
        
			case WS_DEFAULT: 
              
			   TW_StartTimer(2,30);   
			 
			   if(TW_OffHookDetect(2)) 
			   { 
				   TW_PowerCtrl(2); 
				   if(TW_StartPlayFile(2,ad.FileName,0,LONG_MAX)==0) 
					 {   
						 sprintf(ChMess[2],"通道%2d (内线) : 相应投诉语音是空文件或不存在!",i); 
						 ChPaint(2); 
                         strcpy(filename[i],welcomfile); 
						 TW_StartPlayFile(2,filename[i],0,LONG_MAX); 
						 TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
 
						 inputchar[2]=START; 
						 CS[2]=WS_PLAY; 
						 
                     } 
                     else 
					 { 
					 TW_StartPlayFile (2,  ad.FileName, 0 , LONG_MAX) ; //内线模块正在放音 
					 TW_StartPlayFile(3,ad.FileName,0,LONG_MAX); 
					 for(j=0;j<3;j++) 
					 { 
					 while(TW_PlayFileRest(2)>0&&TW_PlayFileRest(3)>0) 
					 { 
					  sprintf(ChMess[2],"通道%2d (内线) : 正在播放相应投诉语音记录... ",i); 
					  ChPaint(2); 
					 
					  TW_PlayFileRest(2); 
                      TW_PlayFileRest(3); 
					 } 
					 } 
                      sprintf(ChMess[2],"通道%2d (内线) : 计算机已完成放音,结束放音...",i); 
					  ChPaint(2); 
					  TW_GenerateSignal (2, SIG_BUSY1); 
				      CS[i] = WS_BUSY; 
					 
					 } 
			   } 
			   else if (TW_TimerElapsed (2) < 0)  
			   { 
				sprintf (ChMess[2], "通道%2d (内线) : 等待时间超时,自动停止振玲.", i); 
				ChPaint (2); 
                TW_PowerCtrl(2); 
			    CS[i]=WS_HANGUP; 
			   } 
 
               break; 
		case WS_HANGUP : 
			if (TW_OffHookDetect (i))  
			{ 
				sprintf (ChMess[i], "通道%2d (内线) : 有电话摘机.", i); 
				ChPaint (i); 
				TW_FlushDTMF (i); 
				inputchar[i]=START; 
				strcpy(filename[i],welcomfile);//播放初始放音文件 
				 
				if (TW_StartPlayFile (i, filename[i] , 0 , LONG_MAX) == -1) 
				{ 
					sprintf (ChMess[i], " 通道%d (内线) : 初始放音失败.", i); 
					ChPaint (i); 
				    TW_StartTimer (i, 10); 
					CS[i] = WS_TIMER; 
				} 
				else  
				{ 
				    TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
 
					sprintf (ChMess[i], "通道%2d (内线) : 正在播放提示音...", i); 
					ChPaint (i); 
					CS[i] = WS_PLAY; 
				} 
				   
			} 
			break; 
 
		case WS_PLAY : 
			//CheckDtmf (i); 
		    if((dtmf=TW_GetDTMFChar (i)) != -1) 
			{ 
				TW_StopPlayFile(i); 
			/*************在初使状态时按键***************/ 
				if(inputchar[i]==START) 
				{ 
					switch	(dtmf)//根据按键不同转入不同功能 
					{ 
				//		case  '1' ://进入投诉功能 
				//		inputchar[i]=APPEAL; 
				//		strcpy(filename[i] , chooseappeal); 
				//		break; 
 
				//		case  '2' ://进入留言功能 
				//		inputchar[i]=LEAVEWORD; 
				//		strcpy(filename[i] , leaveword); 
				//		break; 
 
						case  '3' ://进入查询功能 
						inputchar[i]=INQUIRE; 
						strcpy(filename[i] , chooseinf); 
						break; 
 
						case  '0' ://进入领导功能 
						inputchar[i]=PARTICULAR; 
						TW_FlushDTMF(i); 
						strcpy(filename[i] , particular); 
						break; 
 
						case '*': //进入呼出功能 
                        CS[i]=WS_DIALOUT; 
						strcpy(filename[i],dialout); 
						break; 
 
						default: 
						strcpy(filename[i] , welcomfile); 
						break; 
					} 
					TW_StartPlayFile(i , filename[i] , 0 , LONG_MAX); 
					TW_StartPlayFile(3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
 
				} 
				/**************在播放选择投诉或留言提示过程中按键***********/ 
			/*	else if( inputchar[i] == APPEAL || inputchar[i] == LEAVEWORD) 
			 	{ 
			 		switch (dtmf) 
			 		{ 
			 		case '1': 
            		case '2': 
			 		case '3': 
			 			if(inputchar[i]==LEAVEWORD) dtmf='0'; 
			 			filenamestr=GetFileName(dtmf,i); 
		    			strcpy(filename[i],filenamestr); 
   			 			fail=TW_StartRecordFile( i , filename[i] , 0 , LONG_MAX); 
                         if( fail==-1) 
			 			{ 
			 				MessageBox("开始录音失败!","错误",MB_ICONSTOP); 
			 				strcpy(filename[i],welcomfile); 
			 				TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
			 				CS[i]=WS_PLAY; 
			 				inputchar[i]=START;			 
			 			} 
			 			else			 
			 			 CS[i]=WS_RECORD; 
		        		break; 
			 		default: 
			 			if(inputchar[i]==LEAVEWORD) 
			 			{ 
			 			filenamestr=GetFileName('0',i); 
			 			strcpy(filename[i],filenamestr); 
			 			fail=TW_StartRecordFile(i,filename[i],0,LONG_MAX); 
			 		    if (fail==-1) 
			 			{ 
			 				MessageBox("开始录音失败!","错误",MB_ICONQUESTION); 
                            strcpy(filename[i],welcomfile); 
		    				TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
			 				CS[i]=WS_PLAY; 
			 				inputchar[i]=START; 
			 			} 
			 			else 
			 			  CS[i]=WS_RECORD; 
			 			}	 
			    		else                              
			 			{ 
			 			strcpy(filename[i],welcomfile); 
			 			inputchar[i]=START; 
			 			TW_StartPlayFile( i , filename[i] , 0 , LONG_MAX); 
			 			} 
			 		break; 
			 		} 
			 	} */ 
				else if(inputchar[i]==INQUIRE)//进入查询功能 
				{ 
					switch (dtmf) 
					{ 
					case '1': 
						strcpy(filename[i],INFORMATION1); 
						CS[i]=WS_PLAYINF; 
						break; 
					case '2': 
						strcpy(filename[i],INFORMATION2); 
						CS[i]=WS_PLAYINF; 
						break; 
					case '3': 
						strcpy(filename[i],INFORMATION3); 
						CS[i]=WS_PLAYINF; 
						break; 
					default: 
						strcpy(filename[i],chooseinf); 
						break; 
					} 
					TW_StartPlayFile(i , filename[i] , 0 , LONG_MAX); 
					TW_StartPlayFile(3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
 
				} 
				else if(inputchar[i]==PARTICULAR)	//进入特殊功能输入密码 
				{ 
					passwordpointer=0; 
					password[passwordpointer++]=dtmf; 
				    TW_StartTimer(i,15); 
					CS[i]=WS_WAITFORPASSWORD; 
				} 
			 
				else if(inputchar[i]==CHOOSECOMMAND)//正在播放选择放音文件时有按键则停止放音 
				{ 
					//将放音要求送入放音队列并等待 
					Key=dtmf; 
				   if((Key=='*'||Key=='#')&&!(m_pSet->IsEOF())) 
						m_pSet->MoveLast(); 
				   else if(!m_pSet->IsBOF()) 
						  m_pSet->MoveFirst(); 
			  
					CS[i]=WS_WAITFORFILE; 
				 
 
				} 
				else if(inputchar[i]==RECORDINF)//正在选择录制信息文件时有按键则进入相应录音状态 
				{ 
					switch (dtmf) 
					{	 
					 case '1': 
						TW_StartRecordFile(i , INFORMATION1 , 0 , LONG_MAX); 
						sprintf(ChMess[i],"通道%2d (内线) : 正在录制信息文件1...",i); 
						ChPaint(i); 
						for(j=0;j<30000;j++) ; 
						CS[i]=WS_RECORD; 
						break; 
				    case '2': 
						TW_StartRecordFile(i , INFORMATION2 , 0 , LONG_MAX); 
					    sprintf(ChMess[i],"通道%2d (内线) : 正在录制信息文件2...",i); 
						ChPaint(i); 
						for(j=0;j<30000;j++); 
						CS[i]=WS_RECORD; 
						break; 
					case '3': 
						TW_StartRecordFile(i , INFORMATION3 , 0 , LONG_MAX); 
						sprintf(ChMess[i],"通道%2d (内线) : 正在录制信息文件3...",i); 
						ChPaint(i); 
						for(j=0;j<30000;j++); 
						CS[i]=WS_RECORD; 
						break; 
                    default : 
						sprintf(ChMess[i],"通道%2d (内线) : 选择录制文件的类型错!",i); 
						ChPaint(i); 
						strcpy(filename[i],welcomfile); 
						TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
					    TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
						CS[i]=WS_PLAY; 
						inputchar[i]=START; 
						break; 
					} 
					 
				} 
			} 
			else 
			{ 
			if (!TW_OffHookDetect (i))  
			{ 
				sprintf (ChMess[i], "通道%2d (内线) : 在播放提示音期间,内线挂机.", i); 
				ChPaint (i); 
				TW_StopPlayFile (i); 
				TW_StopPlayFile(3);   //停止放音 
				CS[i] = WS_HANGUP; 
			} 
			else if (TW_PlayFileRest (i) <= 0)  
			{ 
				if(TW_PlayFileRest(3)<=0) 
				{ 
				sprintf (ChMess[i], "通道%2d (内线) : 提示音播放完成.", i); 
				ChPaint (i); 
				TW_StartPlayFile (i, filename[i] , 0 , LONG_MAX); 
				TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
				sprintf (ChMess[i], "通道%2d (内线) : 重新开始播放提示音...", i); 
				ChPaint (i); 
				} 
				else 
                  TW_PlayFileRest(3); 
			} 
			} 
			break; 
 
		case WS_DIALOUT: 
			TW_StartTimer(i,5); 
            if(!TW_OffHookDetect(i)) 
			{ 
			  sprintf(ChMess[i],"通道%2d (内线) : 用户已挂机!",i); 
			  ChPaint(i); 
			  CS[i]=WS_HANGUP; 
			} 
			else if(TW_TimerElapsed(i)<0) 
			{ 
				sprintf(ChMess[i],"通道%2d (内线) : 等待时间到,计算机自动产生忙音!",i); 
				ChPaint(i); 
				TW_GenerateSignal(i,SIG_BUSY1); 
				CS[i]=WS_BUSY; 
			} 
			else if((dtmf=TW_GetDTMFChar(i))!=-1) 
			{ 
				cPhoneNum[iPointer++]=dtmf; 
				if(iPointer>=7) 
				{ 
					cPhoneNum[7]='\0'; 
					CS[i]=WS_AUTODIAL; 
				} 
			} 
			break; 
 
        case WS_PLAYINF: 
				    		//正在播放信息文件时有按键则停止放音 
				 
					strcpy(filename[i],welcomfile); 
					TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
					TW_StartPlayFile(i , filename[i] , 0 , LONG_MAX); 
			        CS[i]=WS_PLAY; 
					inputchar[i]=START; 
				break; 
 
        case WS_RECORD: 
			if (!TW_OffHookDetect (i)) 
			{ 
				sprintf (ChMess[i], "通道%2d (内线) : 在录音期间用户挂机.", i); 
				ChPaint (i); 
				 
				TW_StopRecordFile (i); 
				TW_StopRecordFile(3); 
				CS[i] = WS_HANGUP; 
		 
			} 
			else if((dtmf=TW_GetDTMFChar (i)) != -1) 
			{ 
			    
			    for(j=0;j<30000;j++) ; 
				TW_StopRecordFile(i); 
				//若不为录制信息文件状态则将文件名放入队列 
				if(inputchar[i]!=RECORDINF) 
				{ 
				//将文件名放入队列 
            
			//     if( filename[i][15]!='0') 
			//	 {  
			//	   sprintf(ChMess[i],"通道%2d (内线) : 进行自动投诉. ",i); 
			//	   ChPaint(i); 
 
			//	   TW_StartTimer(i,5); 
			//	   TW_GenerateSignal (i, SIG_BUSY1); 
			//	   if (TW_TimerElapsed (i) < 0) 
			//	   { 
			//	   if (!TW_OffHookDetect (i))  
			//	   { 
			//	   sprintf (ChMess[i], "通道%2d (内线) : 在忙音下内线已挂机.", i); 
			//	   ChPaint (i); 
				   // TW_GenerateSignal (i, SIG_SILENCE); 
				   
			//	   } 
			//	   else 
			//	   { 
			//		   sprintf(ChMess[i],"通道%2d (内线) : 在忙音下内线仍未挂机.",i); 
			//		   ChPaint(i); 
			//	   } 
			//	   } 
 
			//	   CS[i]=WS_AUTODIAL; 
			//	   DIAL[i]=WS_INITIALIZED; 
			//	   strcpy(ad.FileName,filename[i]); 
				    
			//	   switch(filename[i][15]) 
			//	   { case '1': 
			//	             strcpy(ad.PhoneNumber,"8227302"); 
			//				 break; 
			//	     case '2':  
			//			     strcpy(ad.PhoneNumber,"1279012312"); 
			//				 break; 
			//		 case '3': 
			//			     strcpy(ad.PhoneNumber,"1275094581"); 
			//				 break; 
			//		 default: 
			//			     sprintf(ChMess[i],"通道%2d (内线) : 选择投诉的类型错误,不能自动投诉!",i); 
   			//				 ChPaint(i); 
			//				 TW_StartTimer (i,5); 
			//		         CS[i] = WS_TIMER; 
			//				 break; 
			//	   } 
			//	    TW_StartTimer(i,10);   //延时10秒,等待挂机 
              //   } 
   			//	else 
			//	{ 
			//	 strcpy(filename[i],welcomfile); 
			  //   TW_StartPlayFile(i , filename[i] , 0 , LONG_MAX); 
			//	 inputchar[i]=START; 
			//	 CS[i]=WS_PLAY; 
			//	} 
				}  
			   else     //播放欢迎信息文件 
				{ 
					strcpy(filename[i],welcomfile);		 
				    TW_StartPlayFile(i , filename[i] , 0 , LONG_MAX); 
					TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
					inputchar[i]=START; 
					CS[i]=WS_PLAY; 
					 
				}	 
			} 
			else  
				TW_RecordFileRest(i);      //否则完成录制信息文件 
			 
		break; 
 
        case WS_AUTODIAL:   //自动拔号进行投诉 
			  switch(DIAL[i]) 
			  { 
			  case WS_INITIALIZED:			    
				 
					  TW_OffHookCtrl(1); 
					  DIAL[i]=WS_STARTDIAL; 
					  sprintf(ChMess[i],"通道%2d (内线) : 计算机开始拔号.",i); 
					  ChPaint(i); 
					   
					  break; 
			  case WS_STARTDIAL: 
				     
				    Sig=TW_CheckSignal(1,&SigCount,&SigLen); 
				    if(Sig==SIG_DIAL) 
					 { 
					  TW_StartDial(1,(LPCSTR)cPhoneNum); 
					  DIAL[i]=WS_ONDIAL; 
					  sprintf(ChMess[i],"通道%2d (内线) : 计算机正在拔号...",i); 
					  ChPaint(i); 
					 } 
				/*	else 
					{ 
						TW_HangUpCtrl(1); 
						DIAL[i]=WS_INITIALIZED; 
					} */ 
				 
					break; 
              case  WS_ONDIAL: 
				      if(TW_DialRest(1)==0) 
					  {  
                        TW_RingCtrl(1);                        
						TW_StartMonitor(1); 
						DIAL[i]=WS_WAITOFFHOOK; 
						sprintf(ChMess[i],"通道%2d (内线) : 计算机完成拔号,等待摘机. ",i); 
						ChPaint(i); 
                      } 
                      else  
						TW_DialRest(1); 
 
					  break; 
              case  WS_WAITOFFHOOK: 
				      if(TW_MonitorOffHook(1,25)) 
					  { 
						TW_PowerCtrl(1); 
						sprintf(ChMess[i],"通道%2d (内线) : 被呼叫方已摘机. ",i); 
						ChPaint(i); 
						DIAL[i]=WS_CALLBACK; 
					  } 
					    
					  break; 
			  case  WS_CALLBACK: 
				     if(TW_MonitorBusy(1,SIG_BUSY1,5)||TW_MonitorBusy(1,SIG_BUSY2,5)) 
					 { 
						 TW_HangUpCtrl(1); 
						 sprintf(ChMess[i],"通道%2d (内线) : 被呼叫方已挂机!",i); 
						 ChPaint(i); 
						 strcpy(filename[i],welcomfile);		 
				        TW_StartPlayFile(i , filename[i] , 0 , LONG_MAX); 
					    TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
					    inputchar[i]=START; 
					    CS[i]=WS_PLAY; 
					 
					 } 
					 TW_ConnectChannels(1,i); 
					 DIAL[i]=WS_WAITHANGUP; 
 
			         break; 
			  case  WS_WAITHANGUP: 
				     sprintf(ChMess[i],"通道%2d (内线) : 两方正在通话...",i); 
					 ChPaint(i); 
				    if(!TW_OffHookDetect (i)) 
					 { 
						TW_HangUpCtrl(1); 
						TW_DisconnectChannels(1,i); 
						TW_GenerateSignal (1, SIG_SILENCE); 
						CS[i]=WS_HANGUP; 
						sprintf(ChMess[i],"通道%2d (内线) : 用户已中止通话! " ,i); 
						ChPaint(i); 
					 
					 } 
					else if(TW_MonitorBusy(1,SIG_BUSY1,5)||TW_MonitorBusy(1,SIG_BUSY2,5)) 
					{ 
						TW_HangUpCtrl(1); 
						sprintf(ChMess[i],"通道%2d (内线) : 被呼叫方已中止通话!",i); 
						ChPaint(i); 
						TW_DisconnectChannels(1,i); 
						TW_GenerateSignal (1, SIG_SILENCE); 
						strcpy(filename[i],welcomfile);		 
				       TW_StartPlayFile(i , filename[i] , 0 , LONG_MAX); 
					   TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
					   inputchar[i]=START; 
					   CS[i]=WS_PLAY; 
					 
					} 
					 
					break; 
			  default: 
				    break; 
			  } 
			 break;   
 
        case WS_WAITFORPASSWORD :   //等待密码状态 
			Sig = TW_CheckSignal (i, &SigCount, &SigLen); 
		     
			if ((Sig == SIG_BUSY1 || Sig == SIG_BUSY2) && SigCount >= 3) //忙音 
			{ 
				sprintf (ChMess[i], "通道%2d (内线) : 等待口令期间用户挂机.", i); 
				ChPaint (i); 
				CS[i] = WS_HANGUP; 
			} 
		 
			else if((dtmf=TW_GetDTMFChar (i)) != -1)					//用户有按键 
			{ 
				password[passwordpointer++]=dtmf; 
				if(passwordpointer>=4)									//输入键达到4个 
				{ 
					password[4]='\0'; 
					if(strcmp(password,truepassword1)==0)				//选择放音文件密码正确 
					{ 
					strcpy(filename[i],choosecommand);					//播放选择播放命令文件 
					TW_StartPlayFile(i , filename[i] , 0 , LONG_MAX); 
			  
					sprintf(ChMess[i],"通道%2d (内线) : 正在选择相应留言或投诉信息文件.",i); 
					ChPaint(i); 
					inputchar[i]=CHOOSECOMMAND; 
					CS[i]=WS_PLAY; 
					 
					} 
					else if(strcmp(password,truepassword2)==0) 
					{ 
					sprintf(ChMess[i],"通道%2d (内线) : 正在选择录制相应信息文件类型.",i); 
					ChPaint(i); 
					strcpy(filename[i],recordinf);						//播放选择录音文件类型 
					TW_StartPlayFile(i , filename[i] , 0 , LONG_MAX); 
					TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
					inputchar[i]=RECORDINF; 
					CS[i]=WS_PLAY; 
				 
					} 
					else  
					{ 
					sprintf(ChMess[i],"通道%2d (内线) : 输入口令错,计算机自动挂机!",i); 
					ChPaint(i); 
					TW_StartTimer (i, 3); 
					CS[i] = WS_TIMER; 
					} 
				} 
			} 
			else if (TW_TimerElapsed (i) < 0)							//等待时间到 
			{ 
				sprintf (ChMess[i], "通道%2d (内线) : 等待时间超时,计算机自动挂机.", i); 
				ChPaint (i); 
				TW_StartTimer (i, 3); 
				CS[i] = WS_TIMER; 
			} 
		break; 
 
	   case WS_WAITFORFILE: 
			 
				//查询相应的文件名区,若不为空时播放文件且 
				//取出第一个文件的指针开始放音 
 
		 if(Key=='*') 
			 { 
				 
				if(m_pSet->m_type=='0') 
				{ 
				  if(m_pSet->m_FileName=="") 
                  { 
					sprintf(ChMess[i],"通道%2d (内线) : 找到留言记录所对应的语音文件为空!",i); 
			        ChPaint(i); 
				  } 
				  else 
				  { 
				   strcpy(filename[i],m_pSet->m_FileName); 
				   TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
				   TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
				   while(TW_PlayFileRest(i)>0&&TW_PlayFileRest(3)>0) ; 
				  } 
				} 
				else 
				{ 
                 if(m_pSet->IsBOF()) 
				 {	 
			      sprintf(ChMess[i],"通道%2d (内线) : 没有找到相应类型留言记录.",i); 
			      ChPaint(i); 
				 }				 
				 else	 
				 { 
				  m_pSet->MovePrev(); 
				  break; 
				 } 
				} 
			 } 
			 else if(Key=='#') 
			 { 
				 if(m_pSet->m_type=='1'||m_pSet->m_type=='2'||m_pSet->m_type=='3') 
				 { 
                   if(m_pSet->m_FileName=="") 
                  { 
					sprintf(ChMess[i],"通道%2d (内线) : 找到投诉记录所对应的语音文件为空!",i); 
			        ChPaint(i); 
				  } 
				  else 
				  { 
				   strcpy(filename[i],m_pSet->m_FileName); 
				   TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
				   TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
				   while(TW_PlayFileRest(i)>0&&TW_PlayFileRest(3)>0) ; 
				  } 
				 } 
				 else  
				 { 
					 if(!m_pSet->IsBOF()) 
					 { 
						 m_pSet->MovePrev(); 
                         break; 
					 } 
					 else 
					 { 
					   sprintf(ChMess[i],"通道%2d (内线) : 没有找到相应类型的投诉记录!",i); 
			           ChPaint(i);  
                     } 
				 } 
			 } 
             else 
			 { 
                if(!m_pSet->IsEOF()) 
				{ 
				  if(Key==m_pSet->m_type) 
				  { 
                   if(m_pSet->m_FileName=="") 
                  { 
					sprintf(ChMess[i],"通道%2d (内线) : 找到记录所对应的语音文件为空!",i); 
			        ChPaint(i); 
				  } 
				  else 
				  { 
				   strcpy(filename[i],m_pSet->m_FileName); 
				   TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
				   TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; //放音模块放音 
				   while(TW_PlayFileRest(i)>0&&TW_PlayFileRest(3)>0) ; 
				  } 
				  } 
                   
				  m_pSet->MoveNext(); 
				  break; 
				} 
				else 
				{ 
                   	    sprintf(ChMess[i],"通道%d (内线) :记录放音已全部结束!",i); 
						ChPaint(i); 
 
						TW_FlushDTMF(i); 
						strcpy(filename[i],welcomfile); 
						TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
						TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; 
 
						CS[i]=WS_PLAY; 
						inputchar[i]=START; 
						break; 
				} 
			 } 
			sprintf(ChMess[i],"通道%d (内线) : 记录放音已全部结束!",i); 
			ChPaint(i); 
 
		    TW_FlushDTMF(i); 
			strcpy(filename[i],welcomfile); 
			TW_StartPlayFile(i,filename[i],0,LONG_MAX); 
			TW_StartPlayFile (3, filename[i], 0 , LONG_MAX) ; 
 
			CS[i]=WS_PLAY; 
			inputchar[i]=START;	   
 
			break;         
	 
		case WS_TIMER : 
			 
			if (!TW_OffHookDetect (i)) 
			{ 
				sprintf (ChMess[i], "通道%2d (内线) : 内线已挂机.", i); 
				ChPaint (i); 
				CS[i] = WS_HANGUP; 
			} 
			else if (TW_TimerElapsed (i) < 0)  
			{ 
				sprintf (ChMess[i], "通道%2d (内线) : 等待时间超时,计算机自动产生忙音.", i); 
				ChPaint (i); 
				TW_GenerateSignal (i, SIG_BUSY1); 
				CS[i] = WS_BUSY; 
			} 
			break; 
 
		case WS_BUSY : 
			if (!TW_OffHookDetect (i))  
			{ 
				sprintf (ChMess[i], "通道%2d (内线) : 内线在忙音等待下已挂机.", i); 
				ChPaint (i); 
				TW_GenerateSignal (i, SIG_SILENCE); 
				CS[i] = WS_HANGUP; 
			} 
			break; 
	} 
} 
 
  //程序开始时的初始化工作(在此初始化语音卡) 
void CDBtestView::OnInitialUpdate() 
{ 
	 //建立气泡工具提示 
	m_BalloonToolWnd.Create(this); 
	m_BalloonToolWnd.m_bStuck = true; 
    //为需要建立的控件加入气泡工具提示 
	m_BalloonToolWnd.AddTool(GetDlgItem(IDC_RECORD_ID),"自动建立记录ID号"); 
	m_BalloonToolWnd.AddTool(GetDlgItem(IDC_RECORD_NUM),"记录号"); 
	m_BalloonToolWnd.AddTool(GetDlgItem(IDC_RECORD_TYPE),"记录类型", RGB(0,0,255)); 
	m_BalloonToolWnd.AddTool(GetDlgItem(IDC_RECORD_FILENAME),"记录文件名");	 
	m_BalloonToolWnd.AddTool(GetDlgItem(IDC_RECORD_MEMO),"记录备注信息"); 
	m_BalloonToolWnd.AddTool(GetDlgItem(IDC_BUTTONOK),"确定记录操作"); 
	m_BalloonToolWnd.AddTool(GetDlgItem(IDC_BUTTONCANCEL),"取消记录操作"); 
//	m_BalloonToolWnd.AddTool(GetDlgItem(IDC_STATIC),"各通道状态提示信息"); 
//	m_BalloonToolWnd.AddTool(GetDlgItem(IDC_EDIT_CHANNEL_STATUS),"各通道内外线指示信息"); 
 
	m_pSet = &GetDocument()->m_dBtestSet; 
	CRecordView::OnInitialUpdate(); 
	 
	//在此初始化语音卡 
	TW_ChannelNumber = TW_Installed(); 
	if (TW_ChannelNumber == 0)  
	{ 
		char s[256]; 
		sprintf(s, "TW语音卡设备没有安装,错误类型是%u", TW_GetReturnCode()); 
		MessageBox(s, "设备错误",MB_ICONSTOP); 
	    exit(0); 
	} 
	GetDlgItem(IDC_EDIT_CHANNEL_STATUS)->SetWindowText(Status); 
 
	TW_Initialize(); 
    TW_CompressRatio (RATE_64K); 
 
	memset(Status, '-', 64); 
	Status[TW_ChannelNumber] = 0; 
	UpdateData(FALSE);  
	for (WORD i = 0; i < TW_ChannelNumber; ++i) 
	{ 
		//inputchar[i]=HANGUP; 
		CS[i] = WS_HANGUP; 
	} 
 
	TW_SetLength (0x2000);    
	SetTimer (ID_TIMER, 100, NULL); //启动计时器 
 
	bRingTime=TRUE;  //设置振铃初始值 
	iRingTimeNum=1;  
	    
	bPhoneNum=false; //设置号码改变初始值 
 
    
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CDBtestView printing 
 
BOOL CDBtestView::OnPreparePrinting(CPrintInfo* pInfo) 
{ 
	// default preparation 
	 
	return DoPreparePrinting(pInfo); 
} 
 
void CDBtestView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo) 
{ 
  CDBtestDoc *pDoc=GetDocument(); 
  ASSERT_VALID(pDoc); 
 
  pDC->SetMapMode(MM_LOENGLISH);   //计算所须纸张页数 
  int iPageHeight=pDC->GetDeviceCaps(VERTRES); 
  int iLogPixelsY=pDC->GetDeviceCaps (LOGPIXELSY); 
  int iRectHeight=(int)(iContextHeight*iLogPixelsY); 
  int iNumPages=(iTitleHeight*iLogPixelsY)+iRowTotal*iRectHeight/iPageHeight+1; 
  pInfo->SetMaxPage (iNumPages); 
} 
 
void CDBtestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) 
{ 
	// TODO: add cleanup after printing 
} 
 
///////////////////////////////////////////////////////////////////////////// 
// CDBtestView diagnostics 
 
#ifdef _DEBUG 
void CDBtestView::AssertValid() const 
{ 
	CRecordView::AssertValid(); 
} 
 
void CDBtestView::Dump(CDumpContext& dc) const 
{ 
	CRecordView::Dump(dc); 
} 
 
CDBtestDoc* CDBtestView::GetDocument() // non-debug version is inline 
{ 
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDBtestDoc))); 
	return (CDBtestDoc*)m_pDocument; 
} 
#endif //_DEBUG 
 
///////////////////////////////////////////////////////////////////////////// 
// CDBtestView database support 
CRecordset* CDBtestView::OnGetRecordset()   //得到记录集指针 
{ 
	return m_pSet; 
} 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CDBtestView message handlers 
 
void CDBtestView::OnRecordAdd() //添加一个记录 
{ 
  if(m_pSet->CanAppend()==0) 
	  MessageBox("不能向数据库中添加记录!","数据库打开错误",MB_OK|MB_ICONERROR); 
  else 
  { 
	  //set the option button displaying 
	  m_oOk.ShowWindow(SW_SHOW); 
	  m_oCancel.ShowWindow(SW_SHOW); 
	  //create a blank record for the user to edit  
	  m_oSampleID.SetWindowText(""); 
	   m_oSampleID.SetReadOnly(TRUE); 
	  m_oNum.SetWindowText(""); 
	   m_oNum.SetReadOnly(FALSE); 
	  m_oType.SetWindowText(""); 
	   m_oType.SetReadOnly(FALSE); 
	  m_oFilename.SetWindowText(""); 
	   m_oFilename.SetReadOnly(FALSE); 
	  m_oMemo.SetWindowText(""); 
	   m_oMemo.SetReadOnly(FALSE); 
 
  } 
 
} 
 
void CDBtestView::OnRecordDelete() //从物理上删除一个记录 
{ 
   char cValue[7],cFilename[21]; 
    
    strcpy(cFilename,m_pSet->m_FileName); 
    m_pSet->Delete(); 
    CFile::Remove(cFilename); 
    
	m_pSet->MoveNext(); 
 
	if(m_pSet->IsEOF()) 
		m_pSet->MoveLast(); 
  
   if(m_pSet->IsBOF()) 
		m_pSet->SetFieldNull(NULL); 
 
   //restore the display data 
	 
  else 
  { 
   itoa(m_pSet->m_sampleID,cValue,10); 
   m_oSampleID.SetWindowText(cValue); 
    m_oSampleID.SetReadOnly(TRUE); 
 
   itoa(m_pSet->m_RecordNum,cValue,10); 
   m_oNum.SetWindowText(cValue); 
    m_oNum.SetReadOnly(TRUE); 
 
   if(m_pSet->m_type=='0') 
	 strcpy(cType,"留言"); 
   else if(m_pSet->m_type!='1'&&m_pSet->m_type!='2'&&m_pSet->m_type!='3') 
	 strcpy(cType,"空类型"); 
   else 
	 strcpy(cType,"投诉"); 
   m_oType.SetWindowText(cType); 
    m_oType.SetReadOnly(TRUE); 
 
   m_oFilename.SetWindowText(m_pSet->m_FileName); 
    m_oFilename.SetReadOnly(TRUE); 
 
   m_oMemo.SetWindowText(m_pSet->m_memo); 
    m_oMemo.SetReadOnly(TRUE); 
  } 
     
	//UpdateData(FALSE); 
	  
} 
 
void CDBtestView::OnSortId() //按记录ID排序 
{ 
	m_pSet->Close(); 
	m_pSet->m_strSort="RecordNum"; 
	m_pSet->Open(); 
	UpdateData(FALSE); 
	 
} 
 
void CDBtestView::OnSortType() //按记录类型排序 
{ 
    m_pSet->Close(); 
	m_pSet->m_strSort="type"; 
	m_pSet->Open(); 
	UpdateData(FALSE); 
  
} 
 
void CDBtestView::OnSortFilename()  //按文件名排序 
{ 
	m_pSet->Close(); 
	m_pSet->m_strSort="FileName"; 
	m_pSet->Open(); 
	UpdateData(FALSE);	 
} 
 
void CDBtestView::OnRecordPlay()  //播放语音记录 
{ 
 if(m_pSet->m_FileName!="") 
 { 
 TW_StartPlayFile (3, m_pSet->m_FileName, 0 , LONG_MAX) ; 
 while(TW_PlayFileRest(3)>0); 
 } 
  
} 
 
void CDBtestView::OnRecordFirst()  //移到第一个记录并显示 
{ 
 m_pSet->MoveFirst(); 
  
  itoa(m_pSet->m_sampleID,cTemp1,10);  //convert integer into character(decimal). 
  m_oSampleID.SetWindowText(cTemp1); 
 
 itoa(m_pSet->m_RecordNum,cTemp2,10); 
  m_oNum.SetWindowText(cTemp2); 
 
 GetDlgItem(IDC_RECORD_FILENAME)->SetWindowText(m_pSet->m_FileName); 
 
 if(m_pSet->m_type=='0') 
	 strcpy(cType,"留言"); 
 else if(m_pSet->m_type!='1'&&m_pSet->m_type!='2'&&m_pSet->m_type!='3') 
	 strcpy(cType,"空类型"); 
 else 
	 strcpy(cType,"投诉"); 
 GetDlgItem(IDC_RECORD_TYPE)->SetWindowText(cType); 
 
 GetDlgItem(IDC_RECORD_MEMO)->SetWindowText(m_pSet->m_memo); 
 //UpdateData(FALSE); 
 
   m_oSampleID.SetReadOnly(TRUE); 
   m_oNum.SetReadOnly(TRUE); 
   m_oType.SetReadOnly(TRUE); 
   m_oFilename.SetReadOnly(TRUE); 
   m_oMemo.SetReadOnly(TRUE); 
 
} 
 
void CDBtestView::OnRecordLast()  //移到最后一个记录并显示 
{ 
 	m_pSet->MoveLast();  
 
  itoa(m_pSet->m_sampleID,cTemp1,10); 
  m_oSampleID.SetWindowText(cTemp1); 
 
  itoa(m_pSet->m_RecordNum,cTemp2,10); 
  m_oNum.SetWindowText(cTemp2); 
 
 GetDlgItem(IDC_RECORD_FILENAME)->SetWindowText(m_pSet->m_FileName); 
 
  if(m_pSet->m_type=='0') 
	 strcpy(cType,"留言"); 
 else if(m_pSet->m_type!='1'&&m_pSet->m_type!='2'&&m_pSet->m_type!='3') 
	 strcpy(cType,"空类型"); 
 else 
	 strcpy(cType,"投诉"); 
 GetDlgItem(IDC_RECORD_TYPE)->SetWindowText(cType); 
 
 GetDlgItem(IDC_RECORD_MEMO)->SetWindowText(m_pSet->m_memo); 
 //UpdateData(FALSE); 
  m_oSampleID.SetReadOnly(TRUE); 
  m_oNum.SetReadOnly(TRUE); 
   m_oType.SetReadOnly(TRUE); 
   m_oFilename.SetReadOnly(TRUE); 
   m_oMemo.SetReadOnly(TRUE); 
	 
} 
 
void CDBtestView::OnRecordNext()  
{ 
  m_pSet->MoveNext();      //后移一个记录并显示 
  if(m_pSet->IsEOF()) 
   m_pSet->MoveLast(); 
 
  itoa(m_pSet->m_sampleID,cTemp1,10); 
 m_oSampleID.SetWindowText(cTemp1); 
 
  itoa(m_pSet->m_RecordNum,cTemp2,10); 
 m_oNum.SetWindowText(cTemp2); 
 
 GetDlgItem(IDC_RECORD_FILENAME)->SetWindowText(m_pSet->m_FileName); 
 
  if(m_pSet->m_type=='0') 
	 strcpy(cType,"留言"); 
 else if(m_pSet->m_type!='1'&&m_pSet->m_type!='2'&&m_pSet->m_type!='3') 
	 strcpy(cType,"空类型"); 
 else 
	 strcpy(cType,"投诉"); 
 GetDlgItem(IDC_RECORD_TYPE)->SetWindowText(cType); 
 
 GetDlgItem(IDC_RECORD_MEMO)->SetWindowText(m_pSet->m_memo); 
 //UpdateData(FALSE); 
 
   m_oSampleID.SetReadOnly(TRUE); 
   m_oNum.SetReadOnly(TRUE); 
   m_oType.SetReadOnly(TRUE); 
   m_oFilename.SetReadOnly(TRUE); 
   m_oMemo.SetReadOnly(TRUE); 
 
} 
 
void CDBtestView::OnRecordPrev()     //前移一个记录并显示 
{ 
	m_pSet->MovePrev(); 
	if(m_pSet->IsBOF())	 
 	 m_pSet->MoveFirst(); 
  itoa(m_pSet->m_sampleID,cTemp1,10); 
 m_oSampleID.SetWindowText(cTemp1); 
 
  itoa(m_pSet->m_RecordNum,cTemp2,10); 
 m_oNum.SetWindowText(cTemp2); 
 
 GetDlgItem(IDC_RECORD_FILENAME)->SetWindowText(m_pSet->m_FileName); 
 
 if(m_pSet->m_type=='0') 
	 strcpy(cType,"留言"); 
 else if(m_pSet->m_type!='1'&&m_pSet->m_type!='2'&&m_pSet->m_type!='3') 
	 strcpy(cType,"空类型"); 
 else 
	 strcpy(cType,"投诉"); 
 GetDlgItem(IDC_RECORD_TYPE)->SetWindowText(cType); 
 
 GetDlgItem(IDC_RECORD_MEMO)->SetWindowText(m_pSet->m_memo); 
  
  m_oSampleID.SetReadOnly(TRUE); 
   m_oNum.SetReadOnly(TRUE); 
   m_oType.SetReadOnly(TRUE); 
   m_oFilename.SetReadOnly(TRUE); 
   m_oMemo.SetReadOnly(TRUE); 
 
   
} 
  
  //简单报表生成部分 
void CDBtestView::OnPrint(CDC* pDC, CPrintInfo* pInfo)  
{ 
  int iRowCount=1; 
  LPSTR lpstrRow="EMPTY1"; // TEXT FORM OF ROW COUNT 
  LPSTR lpstrID="sampleID"; 
  CString cLine; 
  CPen oPen; 
  CBrush oBrush; 
  CFont oTextFont; 
  CFont oHeadFont; 
  CFont oColFont; 
  LOGFONT lfFont; 
  CSize oFontSize; 
  COLORREF oClrRef; 
  int iRowPos=120; 
  int iTextHeight=0; 
  CRect oDrawRect;      // drawing area for printer 
  int iRecNumPos; 
  int iSampleIDPos; 
  int iTypePos; 
  int iFilenamePos; 
  int iMemoPos; 
 
   oDrawRect=pInfo->m_rectDraw; 
    
   //create a pen and brush object 
   oClrRef=0x00000000; 
   oPen.CreatePen(PS_SOLID,2,oClrRef); 
   pDC->SelectObject(&oPen); 
 
   oClrRef=0x00c0c0c0; 
   oBrush.CreateSolidBrush(oClrRef); 
   pDC->SelectObject(&oBrush); 
   
   //create a heading font and select into our device context 
   oHeadFont.CreatePointFont(240,"宋体",pDC); 
   pDC->SelectObject(&oHeadFont); 
 
   oFontSize=pDC->GetOutputTextExtent("投诉抢修报表"); 
   pDC->Ellipse(500,iRowPos-(oFontSize.cy/2)-10,oDrawRect.Width()-500,iRowPos+(oFontSize.cy/2)+10); 
   pDC->SetBkMode(TRANSPARENT); 
   pDC->TextOut((oDrawRect.Width()-oFontSize.cx)/2,iRowPos-(oFontSize.cy/2)-10,"投诉抢修报表"); 
   pDC->SetBkMode(OPAQUE); 
    
   // CREATE THE APPROPRIATE SPACE 
   oHeadFont.GetLogFont(&lfFont); 
   iRowPos=abs(lfFont.lfHeight+500); 
   
   //create a text font 
   oTextFont.CreatePointFont(120,"宋体",pDC); 
   oTextFont.GetLogFont(&lfFont); 
   iTextHeight=abs(lfFont.lfHeight)+10; 
    
   //create a font for displaying column headings. 
   lfFont.lfWeight=700; //make it bold,normal is 400. 
   oColFont.CreateFontIndirect(&lfFont); 
   pDC->SelectObject(&oColFont); 
    
   //set the first column to 1/2 inch 
   iRecNumPos=int(oDrawRect.Width()/17); 
   iSampleIDPos=iRecNumPos+50+pDC->GetOutputTextExtent("####").cx; 
   iTypePos=iSampleIDPos+50+pDC->GetOutputTextExtent("######").cx; 
   iFilenamePos=iTypePos+50+pDC->GetOutputTextExtent("TYPE EMPTY").cx; 
   iMemoPos=iFilenamePos+50+pDC->GetOutputTextExtent("YearMonthDayChannelnum").cx; 
    
   pDC->TextOut(iRecNumPos,iRowPos,"#"); 
   pDC->TextOut(iSampleIDPos,iRowPos,"记录ID"); 
   pDC->TextOut(iTypePos,iRowPos,"类  型"); 
   pDC->TextOut(iFilenamePos,iRowPos,"文件名称"); 
   pDC->TextOut(iMemoPos,iRowPos,"备  注"); 
 
   //create a space between the column heading and the text 
   iRowPos+=iTextHeight; 
   pDC->MoveTo(iRecNumPos,iRowPos); 
   pDC->LineTo(oDrawRect.Width()-iRecNumPos,iRowPos); 
   iRowPos+=30; 
    
   iTitleHeight=iRowPos; 
   //select our text font into the device context 
    pDC->SelectObject(&oTextFont); 
	iTextHeight=20+pDC->GetOutputTextExtent("Pp").cy; 
 
	iContextHeight=iTextHeight; 
 
	//print the records in a loop 
	if(!m_pSet->IsBOF()) 
        m_pSet->MoveFirst(); 
	while(iRowCount<=m_pSet->GetRecordCount()) 
	{ 
      itoa(iRowCount,lpstrRow,10); 
	   
	  pDC->TextOut(iRecNumPos,iRowPos,lpstrRow); 
	  itoa(m_pSet->m_sampleID,lpstrID,10); 
	  pDC->TextOut(iSampleIDPos,iRowPos,lpstrID); 
	   
	  if(m_pSet->m_type=='0') 
		  pDC->TextOut(iTypePos,iRowPos,"留言"); 
	  else if(m_pSet->m_type=='1'||m_pSet->m_type=='2'||m_pSet->m_type=='3') 
		  pDC->TextOut(iTypePos,iRowPos,"投诉"); 
	  else 
		  pDC->TextOut(iTypePos,iRowPos,"空类型"); 
 
	  pDC->TextOut(iFilenamePos,iRowPos,m_pSet->m_FileName); 
	  pDC->TextOut(iMemoPos,iRowPos,m_pSet->m_memo); 
	  m_pSet->MoveNext(); 
 
	  iRowPos+=iTextHeight; 
	  iRowCount++; 
	}   
     iRowTotal=iRowCount-1; 
 
	CRecordView::OnPrint(pDC, pInfo); 
	  
} 
 
void CDBtestView::OnButtonok()  
{ 
 CString cValue; 
 BOOL lNew=TRUE; 
 int iNum;             
           //确定则保存入库并重新显示记录 
 //initialize the search value 
 m_oNum.GetWindowText(cValue); 
 iNum=atoi(cValue); 
 m_pSet->MoveFirst(); 
 while(!m_pSet->IsEOF() && lNew) 
 { 
	 if(m_pSet->m_RecordNum==iNum) 
		 lNew=FALSE; 
 
	 m_pSet->MoveNext(); 
 } 
 //save the new data into the record. 
 m_pSet->AddNew(); 
 
 if(lNew) 
	 m_pSet->m_RecordNum=iNum; 
 //m_oSampleID.GetWindowText(cValue); 
 //iNum=atoi(cValue); 
 //m_pSet->m_sampleID=iNum; 
 m_oType.GetWindowText(cValue); 
  m_pSet->m_type=cValue; 
 m_oFilename.GetWindowText(cValue); 
  m_pSet->m_FileName=cValue; 
 m_oMemo.GetWindowText(cValue); 
  m_pSet->m_memo=cValue; 
 
  //once the user completes the record,update the database. 
   m_pSet->Update(); 
   m_pSet->Requery();     
   m_pSet->MoveLast(); 
 
   m_oOk.ShowWindow(SW_HIDE); 
   m_oCancel.ShowWindow(SW_HIDE); 
 
   m_oSampleID.SetReadOnly(TRUE); 
   m_oNum.SetReadOnly(TRUE); 
   m_oType.SetReadOnly(TRUE); 
   m_oFilename.SetReadOnly(TRUE); 
   m_oMemo.SetReadOnly(TRUE); 
 
} 
 
void CDBtestView::OnButtoncancel()  
{ 
  char cValue[7];       
	                          
   m_oOk.ShowWindow(SW_HIDE);      //取消操作时隐藏按扭并恢复初始记录 
   m_oCancel.ShowWindow(SW_HIDE); 
 
   //restore the display data 
   itoa(m_pSet->m_sampleID,cValue,10); 
   m_oSampleID.SetWindowText(cValue); 
    m_oSampleID.SetReadOnly(TRUE); 
 
	itoa(m_pSet->m_RecordNum,cValue,10); 
   m_oNum.SetWindowText(cValue); 
    m_oNum.SetReadOnly(TRUE); 
 
 if(m_pSet->m_type=='0') 
	 strcpy(cType,"留言"); 
 else if(m_pSet->m_type!='1'&&m_pSet->m_type!='2'&&m_pSet->m_type!='3') 
	 strcpy(cType,"空类型"); 
 else 
	 strcpy(cType,"投诉"); 
   m_oType.SetWindowText(cType); 
    m_oType.SetReadOnly(TRUE); 
 
   m_oFilename.SetWindowText(m_pSet->m_FileName); 
    m_oFilename.SetReadOnly(TRUE); 
 
   m_oMemo.SetWindowText(m_pSet->m_memo); 
    m_oMemo.SetReadOnly(TRUE); 
 
} 
 
void CDBtestView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)  
{ 
  if(pDC->IsPrinting())      //正在打印时重新设置页面起点 
  { 
	  int iPageHeight=pDC->GetDeviceCaps(VERTRES); 
	  int iOriginy=iPageHeight*(pInfo->m_nCurPage-1); 
	  pDC->SetViewportOrg(0,-iOriginy); 
  }  
 
	CRecordView::OnPrepareDC(pDC, pInfo); 
} 
 
 
 
void CDBtestView::OnRecordRepair()  //修改备注部分 
{                             
  if(!m_pSet) 
  { 
   m_oMemo.SetReadOnly(FALSE); 
   m_pSet->Edit();        
  } 
} 
 
  
 
void CDBtestView::OnKillfocusRecordMemo()  
{ 
	   
  CString cValue;      //备注失去焦点时入库 
                            
  m_oMemo.GetWindowText(cValue); 
  m_pSet->m_memo=cValue; 
 
  m_pSet->Update(); 
  m_oMemo.SetReadOnly(TRUE); 
} 
 
 
 
void CDBtestView::OnDestroy()  
{ 
	CRecordView::OnDestroy(); 
	 
 	KillTimer(ID_TIMER);	//退出时处理 
	TW_Disable();         //关闭计时器和语音卡 
} 
 
void CDBtestView::OnRing()  
{ 
   CRingOption RingDlg; 
   CString str; 
	if(RingDlg.DoModal()==IDOK) 
	{ 
	  	 
	  if(RingDlg.bRingNum)     //得到振铃,时间设置的结果 
	  { 
		  
		  iRingTimeNum=RingDlg.iRingCount; 
	  } 
	  else 
	  { 
		  iRingTimeNum=RingDlg.iTimeCount ; 
	  } 
	  bRingTime=RingDlg.bRingNum ; 
	} 
  
} 
 
void CDBtestView::OnRecordQuery()    
{ 
   FindIt oFindIt; //Create an instanse of our dialog box 
   bool bFound=false; //did we find a match record? 
   CDBVariant varBookmark; //positioning bookmark. 
   char cValue[7]; 
 
   if(oFindIt.DoModal ()==IDOK) 
   { 
	   //Save the current position 
	   if(m_pSet->CanBookmark()) 
	     m_pSet->GetBookmark (varBookmark); 
      
	 //Go to the begining of the query and search for 
	 //the samepleID entered by the user. 
      m_pSet->MoveFirst (); 
	  while(!m_pSet->IsEOF ()&&!bFound) 
	  { 
		  //check if the value is equal. 
		  if(m_pSet->m_RecordNum==atoi(oFindIt.m_FindID) ) 
		    bFound=true; 
		  else 
			  m_pSet->MoveNext() ; 
	  } 
	  if(!bFound) 
	  { 
	   //Display an error message if we didn't find the record. 
		  MessageBox("没有发现相应记录!","数据库错误",MB_OK|MB_ICONERROR); 
		  if(m_pSet->CanBookmark ()) 
			//Restore the current position if the database support bookmark. 
			m_pSet->SetBookmark (varBookmark); 
		  else 
			  m_pSet->MoveFirst(); 
	  } 
	  else 
	  { 
		  //Display the data in the new record. 
	 
     itoa(m_pSet->m_sampleID,cValue,10);    //整数形转换为字符形 
     m_oSampleID.SetWindowText(cValue); 
     m_oSampleID.SetReadOnly(TRUE);       
 
	 itoa(m_pSet->m_RecordNum,cValue,10); 
     m_oNum.SetWindowText(cValue); 
     m_oNum.SetReadOnly(TRUE); 
 
     if(m_pSet->m_type=='0') 
	   strcpy(cType,"留言"); 
     else if(m_pSet->m_type!='1'&&m_pSet->m_type!='2'&&m_pSet->m_type!='3') 
	   strcpy(cType,"空类型"); 
     else 
	   strcpy(cType,"投诉"); 
       m_oType.SetWindowText(cType); 
       m_oType.SetReadOnly(TRUE); 
 
      m_oFilename.SetWindowText(m_pSet->m_FileName); 
      m_oFilename.SetReadOnly(TRUE);      //Custom readonly 
 
      m_oMemo.SetWindowText(m_pSet->m_memo); 
      m_oMemo.SetReadOnly(TRUE); 
	  } 
   } 
} 
 
void CDBtestView::OnPhonenum()  
{ 
  CPhonenumOpt PhoneDlg; 
  int i; 
 
    if(PhoneDlg.DoModal ()==IDOK) 
	{ 
     for(i=0;i<=3;i++) //得到改变的电话号码 
	  strcpy(PhoneNum[i],PhoneDlg.Phone[i] ); 
      
	 bPhoneNum=true; //改变为真 
	} 
    
} 
 
BOOL CDBtestView::PreTranslateMessage(MSG* pMsg)  
{ 
	// TODO: Add your specialized code here and/or call the base class 
	if(m_BalloonToolWnd) //传送气泡工具提示消息 
		m_BalloonToolWnd.RelayEvent(pMsg); 
 
	return CRecordView::PreTranslateMessage(pMsg); 
}