【正文】
息響應(yīng)函數(shù),如圖 。 ? 郵件內(nèi)容依據(jù)索引都被保存在了 CStringArray類型的字符串?dāng)?shù)組中了,索引可以根據(jù)索引號(hào)找到相應(yīng)郵件的內(nèi)容。在類 CSendDlg的頭文件中添加文件包含命令,如下: ? include ? “發(fā)件箱”對(duì)話框的設(shè)計(jì)如圖 ,圖示還包括了一些關(guān)鍵控件的 ID號(hào)。 ? 用 ClassWizard為控件創(chuàng)建關(guān)聯(lián)變量,修改按鈕變量的類型為 CBitButtonNL,如圖 。 ? 接下來我們處理按鈕“發(fā)送郵件”和“重寫郵件”的美化,同樣,在處理函數(shù) OnInitDialog()中添加如下代碼: ? 處理函數(shù)添加的代碼設(shè)置了按鈕的圖像、顯示字體和聲音。 ? ( 2)添加“重寫郵件”按鈕的消息響應(yīng)函數(shù),如下: ? 可以看出,重寫郵件只是將郵件的正文內(nèi)容清空了,其它信息還保留著。 I D C _ M S G圖 “正在處理中 …” 對(duì)話框背景圖 ? 將位圖導(dǎo)入工程,并修改 ID為 IDB_PROGRESS。 ? “正在處理中 … ”窗體主要是用來彈出顯示信息的,沒有按鈕也不需要用戶操作,因?yàn)樗亲詣?dòng)彈出和關(guān)閉的。 小結(jié) ? 本章主要講述了要如何制作一個(gè)郵件管理器。 , February 13, 2023 ? 雨中黃葉樹,燈下白頭人。 :09:1223:09:12February 13, 2023 ? 1他鄉(xiāng)生白發(fā),舊國見青山。 2023年 2月 13日星期一 11時(shí) 9分 12秒 23:09:1213 February 2023 ? 1做前,能夠環(huán)視四周;做時(shí),你只能或者最好沿著以腳為起點(diǎn)的射線向前。 :09:1223:09Feb2313Feb23 ? 1世間成事,不求其絕對(duì)圓滿,留一份不足,可得無限完美。 。 , February 13, 2023 ? 閱讀一切好書如同和過去最杰出的人談話。勝人者有力,自勝者強(qiáng)。 2023年 2月 13日星期一 11時(shí) 9分 12秒 23:09:1213 February 2023 ? 1一個(gè)人即使已登上頂峰,也仍要自強(qiáng)不息。 2023年 2月 13日星期一 下午 11時(shí) 9分 12秒 23:09: ? 1最具挑戰(zhàn)性的挑戰(zhàn)莫過于提升自我。 :09:1223:09Feb2313Feb23 ? 1越是無能的人,越喜歡挑剔別人的錯(cuò)兒。 2023年 2月 13日星期一 11時(shí) 9分 12秒 23:09:1213 February 2023 ? 1空山新雨后,天氣晚來秋。 :09:1223:09:12February 13, 2023 ? 1意志堅(jiān)強(qiáng)的人能把世界放在手中像泥塊一樣任意揉捏。 , February 13, 2023 ? 很多事情努力了未必有結(jié)果,但是不努力卻什么改變也沒有。 。 :09:1223:09Feb2313Feb23 ? 1故人江海別,幾度隔山川。讀者可以在此實(shí)例的基礎(chǔ)上開發(fā)出更多的功能,當(dāng)然也可以借用本實(shí)例的一些做法完善自己寫的其它實(shí)例。它在對(duì)話框被初始化的時(shí)候用到,如下: ? 很簡單的調(diào)用了類 CWnd的成員函數(shù) GetDlgItem(),獲得指定 ID控件的句柄。在函數(shù)OnInitDialog()中添加代碼如下: ? 消息的處理函數(shù) OnInitDialog()為對(duì)話框設(shè)置了背景圖像和對(duì)話框的標(biāo)題。在類 CProgressDlg的頭文件中添加文件包含命令,如下: ? include ? “正在處理中 … ”對(duì)話框的設(shè)計(jì)如圖 ,圖示還包括了一些關(guān)鍵控件的 ID號(hào)。效果如圖 。在函數(shù)OnInitDialog()中添加代碼如下: ? 消息的處理函數(shù) OnInitDialog()為對(duì)話框設(shè)置了背景圖像和對(duì)話框的標(biāo)題。 I D C _ S M T P _ I PI D C _ S U B J E C TI D C _ F I L EI D C _ A P P E N DI D C _ C O N T E X TI D C _ B T N S E N D I D C _ C L E A RI D C _ R E C V圖 編輯框樣式設(shè)置 ? 用“畫圖”工具繪制圖 。那么再來添加“刷新郵箱”按鈕的響應(yīng)函數(shù),編寫如下: ? 響應(yīng)函數(shù)的代碼只是比“刷新郵箱”多了一行,即調(diào)用了函數(shù) getMail(),重新獲取了一次郵箱中的所有郵件,這個(gè)功能適用于收到新郵件的時(shí)候。 ? 類 CListCtrl的成員函數(shù) GetFirstSelectedItemPosition(),用來獲取用戶單擊列表項(xiàng)的位置。 ? lParam:一個(gè) 32位應(yīng)用程序?yàn)榱斜眄?xiàng)指定的值,同樣我們沒有用到。 ? 類 CListCtrl的成員函數(shù) InsertItem(),用來往列表控件中插入新的一項(xiàng),并返回新項(xiàng)的位置,函數(shù)原型如下: ? int InsertItem( ? int nItem, ? LPCTSTR lpszItem ? )。 ? 在類 CReceiveDlg的實(shí)現(xiàn)文件中填寫消息的映射,如下: ? 最后,我們定義響應(yīng)函數(shù) OnProgress()如下: ? 響應(yīng)函數(shù) OnProgress()根據(jù)消息 WM_MY_GET的附加信息 lparam決定做什么操作: ? 1:顯示“正在處理中 … ”窗體,文本顯示“正在連接郵箱服務(wù)器, \n請(qǐng)稍后 ……” 。 ? ( 1)為類 CReceiveDlg添加一個(gè)帶參數(shù)的構(gòu)造函數(shù),用來被創(chuàng)建對(duì)象時(shí)傳入信息,函數(shù)編寫如下: ? g_strServer、 g_strUser和 g_strPsd是定義在類CReceiveDlg的實(shí)現(xiàn)文件中的全局變量,為 CString類型。 ? 類 CListCtrl的成員函數(shù) InsertColumn(),用來向列表控件中插入新的一列,原型如下: ? int InsertColumn( ? int nCol, ? LPCTSTR lpszColumnHeading, ? int nFormat = LVCFMT_LEFT, ? int nWidth = 1, ? int nSubItem = 1 ? )。 ? 參數(shù)含義如下: ? hWnd:接收和處理消息的窗口句柄。 ? 用 ClassWizard為控件創(chuàng)建關(guān)聯(lián)變量,修改按鈕變量的類型為 CBitButtonNL,如圖 。在類 CReceiveDlg的頭文件中添加文件包含命令,如下: ? include ? “收件箱”對(duì)話框的設(shè)計(jì)如圖 ,圖示還包括了一些關(guān)鍵控件的 ID號(hào)。 ? 為此,我們需要做的就是修改程序運(yùn)行時(shí)的啟動(dòng)窗體,如下: ? 我們只是簡單的創(chuàng)建了一個(gè)“設(shè)置”窗體對(duì)象,用 if語句包含了向?qū)槲覀兩傻某绦蛑鞔绑w顯示的代碼,條件是用戶需要單擊“設(shè)置”窗體的“確定”按鈕。 圖 添加消息處理 ? 在函數(shù) OnInitDialog()中添加代碼如下: ? 消息的處理函數(shù) OnInitDialog()為對(duì)話框設(shè)置了背景圖像和對(duì)話框的標(biāo)題。 I D O K I D C A N C E LI D C _ I PI D C _ U S E R N A M EI D C _ P A S S W O R D圖 按鈕樣式設(shè)置 ? 用“畫圖”工具繪制圖 。響應(yīng)函數(shù) OnSet()負(fù)責(zé)“設(shè)置”對(duì)話框的顯示。 ? ( 2)添加單擊“發(fā)件箱”按鈕的消息響應(yīng)函數(shù) OnSend(),代碼如下: ? CSendDlg是我們?yōu)椤鞍l(fā)件箱”對(duì)話框創(chuàng)建的類,并定義了 2個(gè)公有的成員變量 m_sender和 m_sendPsd,分別保存登錄郵箱用的用戶名和密碼。鼠標(biāo)單擊按鈕時(shí)的效果如圖 。 ? 接下來我們來美化一下窗口上“收件箱”、“發(fā)件箱”和“設(shè)置”按鈕。 ? 我們還需要通過向?qū)轭?CEmailManager添加處理消息 WM_CTLCOLOR的函數(shù) OnCtlColor()。 ? CBitButtonNL m_bnSend。 ? CButton m_bnSend。修改鼠標(biāo)圖像資源的 ID為 IDC_CURSOR_HAND,如圖 。 圖 按鈕不同狀態(tài)下的界面設(shè)計(jì) ? 本示例的所有按鈕,均使用這 3個(gè)圖片,插入工程,修改 ID分別為: IDB_BTN_NORMAL、IDB_BTN_DOWN、 IDB_BTN_HLIGHT。所以按鈕擺放在了對(duì)話框靠右下的位置。 程序主窗體 ? 本小節(jié)將會(huì)完成程序主窗體界面和功能的設(shè)計(jì),需要在類 CEmailManagerDlg的頭文件中加入文件包含指令,如下: ? include ? 因?yàn)槲覀兊陌粹o將要?jiǎng)?chuàng)建的變量就是 CBitButtonNL類型的,所以當(dāng)然要包含這個(gè)類的頭文件才能使用這個(gè)類。 郵件管理程序示例 ? 本節(jié)開始,我們就要應(yīng)用前面講解的知識(shí),慢慢完成本章的示例了。 ? 我們僅介紹一下函數(shù)中用到的結(jié)構(gòu)成員: ? itemState:指定自繪按鈕發(fā)生的改變。 ? HDC hDC。 ? UINT itemID。 ? 類 CWnd的成員函數(shù) GetFont(),用來獲取當(dāng)前的字體。 ? 再添加消息映射: ? 然后實(shí)現(xiàn)它: ? 兩個(gè)響應(yīng)函數(shù) OnMouseMove()和 OnMouseLeave()都調(diào)用了一個(gè)函數(shù) CancelHover(),是類 CBitButtonNL的公有成員函數(shù),定義如下: ? 此函數(shù)是用來修改一個(gè)類型為 BOOL的變量 m_bMouseOnButton,記錄鼠標(biāo)此時(shí)已經(jīng)不再按鈕上了。 ? DWORD dwHoverTime。 ? 該函數(shù)原型如下: ? BOOL _TrackMouseEvent( ? LPTRACKMOUSEEVENT lpEventTrack ? )。 ? 那么鼠標(biāo)是否在按鈕的上方要如何檢測(cè)呢?只要判斷鼠標(biāo)所在的窗口與按鈕這個(gè)特殊的“窗口”是不是同一個(gè)窗口就可以了,這里使用了函數(shù)WindowFromPoint(),用來獲取指定點(diǎn)的窗口句柄。 ? ClassWizard無法為我們生成 ON_CONTROL_REFLECT_EX映射,所以我們需要手動(dòng)修改。在類 CBitButtonNL的實(shí)現(xiàn)文件中找到單擊事件的消息映射: ? BEGIN_MESSAGE_MAP(CBitButtonNL, CButton) ? //{{AFX_MSG_MAP(CBitButtonNL) ? ON_WM_SETCURSOR() ? ON_CONTROL_REFLECT(BN_CLICKED, OnClicked) ? //}}AFX_MSG_MAP ? END_MESSAGE_MAP() ? 修改消息映射為: ? BEGIN_MESSAGE_MAP(CBitButtonNL, CButton) ? //{{AFX_MSG_MAP(CBitButtonNL) ? ON_WM_SETCURSOR() ? ON_CONTROL_REFLECT_EX(BN_CLICKED, OnClicked) ? //}}AFX_MSG_MAP ? END_MESSAGE_MAP() ? 現(xiàn)在我們?yōu)轫憫?yīng)函數(shù) OnClicked()添加播放聲音的代碼,如下: ? 好了現(xiàn)在來解釋下為什么要做剛才的修改: ? 通常情況下,按鈕的單擊事件是由按鈕所在的窗體或者對(duì)話框來負(fù)責(zé)處理,特殊情況下按鈕也可以自己來處理被單擊的事件。 ? afx_msg v