趙艷鋒
摘 要:本系統(tǒng)是現實中手機的計算機模擬,是集網絡通信,電話撥號,數據庫操作,多媒體顯示等各項功能于一身,是現實中手機在計算機中的再現。
關鍵詞:數據庫;網絡;電話撥號;多媒體;手機
主程序是基于單文檔建立起來的,消息始終貫穿于整個程序中。數據的變化,控制量的變化均是通過消息的通知來實現的。消息是VC++的精髓,消息的驅動能產生神奇的效果。當程序由待機狀態(tài)進入主菜單時,程序創(chuàng)建主菜單CEntry類,這時m_pActiveWnd將被設置為CEntry類的對象地址,這樣“手機鍵盤”產生的消息將由CEntry類來處理。當選擇了主菜單的某一項時,CEntry類將向其父窗口CMobView回送一個自定義消息WM_FLAG以通知父窗口要創(chuàng)建新窗口了(::PostMessage(this->GetParent()->m_hWnd,WM_FLAG,m_nCurrentSel+1,0);),在WM_FLAG的處理函數中我們將創(chuàng)建新的窗口:
void CMobView::OnFlag(WPARAM wParam, LPARAM lParam)
{
switch(wParam)
{
case 1:
if(m_pActiveWnd != this)
m_pActiveWnd->ShowWindow(SW_HIDE);
m_pBeforeWnd = m_pActiveWnd;
m_hTelebook.Create(this,IDD_TELEBOOK);
m_pActiveWnd = &m_hTelebook;
m_hTelebook.m_pBefore = this->m_pBeforeWnd;
if(m_pActiveWnd != this)
m_pActiveWnd->ShowWindow(SW_SHOW);
break; .
}
}
CMobView類中有個變量CWnd的指針類型變量m_pBeforeWnd,子窗口中也有指針類型變量m_pBefore。它的作用主要體現在從子窗口的返回過程中。在創(chuàng)建新的子窗口前先將當前活動窗口地址保存至子窗口的變量m_pBefore。子窗口創(chuàng)建后,“手機鍵盤”產生的消息都傳送到子窗口中去。也就是說負責“返回”操作的右軟鍵,所產生的消息由子窗口來處理。所以原窗口的顯示,子窗口的銷毀,都應該在子窗口中處理。這樣我們就可以這樣來做:
void CEntry::OnRSoft()
{
m_bmpDisplay.DeleteObject();
CMobView* pView;
pView = (CMobView*)this->GetParent();
m_pBefore = (CMobView*)this->GetParent();
pView->m_pActiveWnd=m_pBefore;
this->DestroyWindow();
}
我們把保存在子窗口中的原來的活動窗口重新傳給父窗口的m_pActiveWnd,然后子窗口再銷毀自己。這樣,我們就成功地實現了窗口的返回。
函數ReceiveMessage用于接收消息,處理接收到的消息數據。在本程序中,每次收到消息后,都將其存入數據庫中。CMessage顯示短信數據時,將從數據庫中讀取相應數據。其定義如下:
void CMobView::ReceiveMessage()
{
ASSERT(m_pSocket);
char buffer[4096];
char bufferMess[4000];
int len = m_pSocket->Receive(buffer,4095);
if(len<1)
{
AfxMessageBox("接收信息異常!");
return;
}
buffer[len] = 0;
CString m_strAll = buffer;
//取得時間
CString m_strTime;
char bufferTime[30];
int j;
for(j = 0;j { bufferTime[j] = buffer[24+j]; } bufferTime[m_nLen] = 0; m_strTime = bufferTime; //取得號碼 char bufferFrom[12]; char bufferTo[12]; for(int i = 0;i<11;i++) { bufferFrom[i] = buffer[i]; bufferTo[i] = buffer[11+i]; } bufferFrom[11] = 0; bufferTo[11] = 0; CString strFrom = bufferFrom; CString strTo = bufferTo; CString str = bufferMess; extern CString m_strMyNum; //播放聲音 m_nWave.OpenDevice(); m_nWave.Play(this,m_strMesRing); 函數OnSend用于發(fā)送消息,其定義如下: void CMobView::OnSend() { if(m_pSocket == NULL) return; extern CString m_strMyMess; if(!m_pSocket->Send(m_strMyMess,strlen(m_strMyMess))) { AfxMessageBox("發(fā)送消息失敗!"); return; } } 在該函數中,Send所發(fā)送的消息為全局變量字符串m_strMyMess,它是在CMessage中被賦值的: m_strMyMess=m_strMyNum+m_strToNum+m_strLen+m_strTime+m_strMyMess;其中有本手機號,對方手機號,消息發(fā)送時間,編輯框中編輯的消息。 當客戶端收到消息時,將消息存入數據庫表“短信”中。當客戶端連接服務器成功后,通過查詢字段TeleNumTo,來判斷消息是否是自己的。如果是便可在“收件箱”中得以顯示了。 [參考文獻] [1]王育堅.《Visual C++面向對象編程教程》.清華大學出版社,2003年. [2]梁肇新.《編程高手箴言》.電子工業(yè)出版社,2004年. [3]飛思科技.《精通MFC》.電子工業(yè)出版社,2003年. [4]George Shepherd,Scot Wingo.《深入解析MFC》.中國電力出版社,2003年. [5]張海藩.《軟件工程導論》,清華大學出版社,2003年.