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); }