




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、學(xué)習(xí)目標(biāo)MFC的六大關(guān)鍵技術(shù)1使用系統(tǒng)消息2建立自定義消息3開發(fā)WIN32應(yīng)用程序4第1頁/共21頁MFC的六大關(guān)鍵技術(shù) MFC的六大關(guān)鍵技術(shù),是六大黑箱技術(shù)。使開發(fā)者只要做簡單的局部修改,即可處理大部分窗口事物。其他復(fù)雜處理過程被完美的封裝起來,這樣的技術(shù)使程序員不需要懂太多,即可進行窗口軟件的開發(fā)。 具體的MFC的六大技術(shù),包括: (1)MFC程序的初始化過程: 建立一個最簡單的MFC程序只用兩步。從CWinApp派生一個應(yīng)用程序類(CMyApp),然后建立對象(theApp)。之后整個程序的編寫,就只需要改寫一個InitInstance()函數(shù)。 (2)運行時類型識別(RTTI) 運行時
2、類型識別(RTTI)即是程序執(zhí)行過程中知道某個對象屬于某個類,參見CRuntimeClass類。 (3)動態(tài)創(chuàng)建: 動態(tài)創(chuàng)建就是運行時創(chuàng)建指定類的對象,而創(chuàng)建的對象在MFC內(nèi)部能夠被動態(tài)識別。在MFC中大量使用。如框架窗口對象、視對象,還有文檔對象等等。參見CFrameWnd,CView和CDocument等類,按F12查閱相關(guān)的宏定義,例如:DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE。第2頁/共21頁使用AppWizard (4)永久保存(串行化): MFC的連續(xù)存儲(serialize)機制俗稱串行化,參見CDocument類。網(wǎng)上流傳“弄懂它以后,你就越來
3、越像個程序員了!”。MFC剛發(fā)布的開始階段,好多軟件開發(fā)者都將文件存儲方式,改到了串行化的模式上去。實際上,串行化存儲模式也有一定的局限性,因此目前也有很多軟件又脫離開串行化,使用自定義的文件存儲模式。 (5)消息映射: 消息映射機制,就是將窗口消息與窗口類函數(shù)地址進行對應(yīng)。當(dāng)消息發(fā)生時,自動調(diào)用該類對應(yīng)的類成員函數(shù)的機制。參見BEGIN_MESSAGE_MAP 和 END_MESSAGE_MAP宏定義 (6)命令傳遞: 命令傳遞機制,主要處理WM_COMMAND消息在不同窗口之間的傳遞。例如,主窗口接收消息后傳遞給相應(yīng)的子窗口。最常用于CMainFrame類的OnCmdMsg函數(shù)。參見 CC
4、mdTarget:OnCmdMsg函數(shù),第3頁/共21頁MFC系統(tǒng)消息分類一般程序員在做2-3年的VC開發(fā)后,會自動進入閱讀MFC源代碼以及剖析以上VC內(nèi)部技術(shù)。但是對于初學(xué)者我們建議,應(yīng)該重點放在使用MFC提供的關(guān)鍵技術(shù)。Windows提供了大量的窗口消息,開發(fā)者可以在對應(yīng)的消息函數(shù)下,編寫代碼來修飾窗口的屬性。常用的窗口消息如下:(1)鍵盤消息: WM_KEYDOWN、WM_KEYUP、WM_SYSKEYDOWN、WM_SYSKEYUP和WM_CHAR等(2)鼠標(biāo)消息: 左:WM_LBUTTONDOWN、WM_LBUTTONUP和WM_LBUTTONDBLCLK 中:WM_MBUTTOND
5、OWN、WM_MBUTTONUP和WM_MBUTTONDBLCLK 右:WM_RBUTTONDOWN、WM_RBUTTONUP和WM_RBUTTONDBLCLK(3)窗口創(chuàng)建和摧毀: 普通窗口:WM_CREATE、WM_DESTROY和WM_CLOSE MDI窗口:WM_MDICREATE、WM_MDIDESTROY 對話框:WM_INITDIALOG第4頁/共21頁MFCMFC系統(tǒng)消息分類(4)客戶區(qū)消息: WM_PAINT、WM_ERASEBKGND、WM_CTLCOLOR、WM_CTLCOLORBTN和WM_SIZE等(5)非客戶區(qū)消息: WM_NCPAINT、WM_NCCREATE和W
6、M_NCLBUTTONDOWN等(6)事件消息: WM_COMMAND、WM_SYSCOMMAND、WM_TIMER和WM_HOTKEY等第5頁/共21頁使用MFC系統(tǒng)消息 建立一個基于對話框的MFC工程,按ALT+W打開ClassWizard。在Messages消息列表中選擇WM_LBUTTONDOWN雙擊。在下面生成OnLButtonDown函數(shù)處雙擊。第6頁/共21頁編輯消息映射函數(shù) 查看ClassWizard生成的消息函數(shù)代碼 除了生成OnLButtonDown成員函數(shù)外,在BEGIN_MESSAGE_MAP下面還生成了映射宏。 按F12查看ON_WM_LBUTTONDOWN的定義,了
7、解該宏建立的關(guān)聯(lián)。 #define ON_WM_LBUTTONDOWN() WM_LBUTTONDOWN, 0, 0, 0, AfxSig_vwp, (AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd:*)(UINT, CPoint)&OnLButtonDown , 在生成的消息函數(shù)中加入一些代碼,并運行查看結(jié)果 例如,在OnLButtonDown函數(shù)中輸入代碼查看點擊位置。CString str;str.Format(x=%d,y=%d,point.x,point.y);AfxMessageBox(str); 刪除消息映射函數(shù) 打開ClassW
8、izard選擇OnLButtonDown成員函數(shù),再點刪除函數(shù)按鈕。 查看刪除消息函數(shù)后的代碼,消息映射宏和頭文件中的函數(shù)聲明已經(jīng)被刪除,一般ClassWizard會保留函數(shù)體中的代碼,以備開發(fā)者保存。第7頁/共21頁關(guān)閉時的系統(tǒng)消息 點擊標(biāo)題欄上的關(guān)閉按鈕,或者系統(tǒng)菜單中的關(guān)閉菜單時,系統(tǒng)內(nèi)會觸發(fā)多種與關(guān)閉有關(guān)的系統(tǒng)消息。例如: WM_SYSCOMMAND:該消息不只支持處理關(guān)閉消息,而且支持最大化、最小化、移動、拉伸以及系統(tǒng)菜單等多種消息。在對應(yīng)的消息函數(shù)中參數(shù)nID代表系統(tǒng)消息的種類,例如:SC_CLOSE, SC_MINIMIZE等。參見CWnd:OnSysCommand函數(shù)。 WM_
9、CLOSE:相當(dāng)于WM_SYSCOMMAND關(guān)于SC_CLOSE類型的專用處理。 WM_DESTROY:通用于任何窗口在摧毀時發(fā)出的消息。 WM_NCDESTROY:通用于窗口在摧毀時,發(fā)出的最后一個消息。 在對話框窗口中,在WM_CLOSE消息之后還會發(fā)出WM_COMMAND消息,調(diào)用OnCancel函數(shù)。但是在點擊取消按鈕(IDCANCEL)后,并不會發(fā)出WM_SYSCOMMAND消息和WM_CLOSE消息。第8頁/共21頁建立自定義消息 從消息的來源來看,可以分為:系統(tǒng)定義的消息和應(yīng)用程序定義的消息。 系統(tǒng)消息ID的范圍是從0到WM_USER-1,或0X80000到0XBFFFF 應(yīng)用程
10、序消息從 WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFFFF,范圍內(nèi)的消息由應(yīng)用程序自己使用; 在MFC窗口類中定義消息成員函數(shù): 函數(shù)的格式:LRESULT MsgProc(WPARAM wParam,LPARAM lParam) 定義消息映射宏:在BEGIN_MESSAGE_MAP下面加入ON_MESSAGE(WM_USER+1,MsgProc) 在其他函數(shù)中發(fā)送自定義消息: SendMessage(WM_USER+1,3,9); 或者PostMessage(WM_USER+1,22,11); 在MsgProc消息函數(shù)中設(shè)置斷點,運行并調(diào)試: 查看是否接收到該消
11、息第9頁/共21頁SendMessage和PostMessage 、首先是返回值意義的區(qū)別,我們先看一下 MSDN 里的聲明: LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); WBOOL PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam); 其中 4 個參數(shù)的意義是一樣的,返回值類型不同(其實從數(shù)據(jù)上看他們一樣是一個 32 位的數(shù),只是意義不一樣),LRESULT 表示的是消息被處理后的返回值,BOOL 表示的是消息是不是 Post 成功
12、。 、PostMessage 是異步的,SendMessage 是同步的。PostMessage 只把消息放入隊列,不管消息是否被處理就返回,消息可能不被處理;而 SendMessage 等待消息被處理完了之后才返回,如果消息不被處理,發(fā)送消息的線程將一直被阻塞。 、如果在同一個線程內(nèi),SendMessage 發(fā)送消息時,由 USER32.DLL 模塊調(diào)用目標(biāo)窗口的消息處理程序,并將結(jié)果返回。SendMessage 在同一線程中發(fā)送消息并不入線程消息隊列。PostMessage 發(fā)送消息時,消息要先放入線程的消息隊列,然后通過消息循環(huán)分派到目標(biāo)窗口(DispatchMessage)。第10頁/
13、共21頁SendMessage和PostMessage 如果在不同線程內(nèi),SendMessage 發(fā)送消息到目標(biāo)窗口所屬線程的消息隊列,然后發(fā)送消息的線程在 USER32.DLL 模塊內(nèi)監(jiān)視和等待消息處理,直到目標(biāo)窗口處理完返回。SendMessage 在返回前還做了很多工作,比如,響應(yīng)別的線程向它 SendMessage。Post 到別的線程時,最好用 PostThreadMessage 代替 PostMessage,PostMessage 的 hWnd 參數(shù)可以是 NULL,等效于 PostThreadMessage + GetCurrentThreadId。Post WM_QUIT 時,
14、應(yīng)使用 PostQuitMessage 代替。 、系統(tǒng)只整編(marshal)系統(tǒng)消息(0 到 WM_USER 之間的消息),發(fā)送用戶消息(WM_USER 以上)到別的進程時,需要自己做整編。 用 PostMessage、SendNotifyMessage、SendMessageCallback 等異步函數(shù)發(fā)送系統(tǒng)消息時,參數(shù)里不可以使用指針,因為發(fā)送者并不等待消息的處理就返回,接受者還沒處理指針就已經(jīng)被釋放了。 、在 Windows 2000/XP 里,每個消息隊列最多只能存放 10,000 個 Post 的消息,超過的還沒被處理的將不會被處理,直接丟掉。這個值可以改得更大:HKEY_LOC
15、AL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionWindows USERPostMessageLimit,最小可以是 4000。第11頁/共21頁建立一個簡單的Win32工程 使用AppWizard建立基于Win32的應(yīng)用程序第12頁/共21頁建立一個簡單的Win32工程 選擇第2項A simple Win32 application.第13頁/共21頁編輯Win32項目資源 生成的代碼只有一個空的WinMain函數(shù): 在Workspace中只有ClassView和FileView,沒有ResourceView。 也就說明目前的工程中沒有任
16、何資源。 為了生成基于對話框的Windows應(yīng)用程序,我們需要在工程中添加一個資源文件 從主菜單中選擇File-New,打開新建文件向?qū)А?選擇Resource Script,并在Add to project上打鉤。 填入與工程相同的名字,例如Test,再按確定。 在Workspace中出現(xiàn)了ResouceView的選項卡頁面。 點關(guān)閉按鈕,關(guān)閉編輯器中的Test.rc,以便在Resource View中編輯。 如果Test.rc處于打開狀態(tài),點擊ResourceView中的資源會提示“This file is open in a editor.”以及“Load Failed”等錯誤。 按Ct
17、rl+1添加對話框資源IDD_DIALOG1, 按Ctrl+1,2,3,4。一直到Ctrl+9分別代表插入不同的資源。 包括菜單,圖標(biāo),光標(biāo),字符串表以及版本信息等。第14頁/共21頁編輯Win32項目資源第15頁/共21頁編輯Win32代碼了解消息 編輯WinMain函數(shù)加入一行代碼: DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL,NULL); 補充頭文件: #include “resource.h”。 編譯后運行執(zhí)行文件,查看結(jié)果 發(fā)現(xiàn)出現(xiàn)的對話框,不能關(guān)閉。 也就是不能響應(yīng)關(guān)閉的消息。 甚至只能通過Windows任務(wù)管理器,來
18、強制結(jié)束Win32.exe 打開MSDN,查看DialogBox函數(shù),第4個參數(shù)需要一個回調(diào)函數(shù)地址 編輯DialogProc函數(shù) INT CALLBACK DialogProc( HWND hwndDlg, UINT uMsg,WPARAM wParam, LPARAM lParam) return 0; 修改WinMain函數(shù),指定DialogBox的回調(diào)函數(shù) DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),NULL, DialogProc);第16頁/共21頁編寫代碼響應(yīng)Win32消息 修改Dialog函數(shù),加入相應(yīng)命令消息的代碼,編譯后
19、運行。switch(uMsg)case WM_COMMAND:switch(wParam)case IDCANCEL:case IDOK:EndDialog(hwndDlg,wParam);break;break;return 0; 運行結(jié)果可以關(guān)閉,對話框響應(yīng)了關(guān)閉的消息處理。第17頁/共21頁Windows編程中的句柄 在上面的代碼中,我們看到了這樣的類型定義 HINSTANCE 執(zhí)行實體(程序自身)句柄 HWND窗口句柄 句柄實際上就是 結(jié)構(gòu)體指針(參見教材第2章 理解句柄) 但是系統(tǒng)不允許你直接訪問該結(jié)構(gòu)體成員 所以稱其為“句柄”,只應(yīng)該用專門的處理函數(shù)取操作該句柄,而不應(yīng)該直接訪問結(jié)
20、構(gòu)體成員 回憶一下C標(biāo)準(zhǔn)庫中的文件操作,fopen的返回值是什么?是一個FILE指針,而FILE是一個結(jié)構(gòu)體。 平時我們按照規(guī)定用文件處理函數(shù)來操作該FILE指針,但是C語法沒有阻止我們直接訪問FILE結(jié)構(gòu)體,所以有可能會被程序員弄亂數(shù)據(jù) 。 此時,也不是沒有解決辦法,既在每個文件處理函數(shù)中檢查參數(shù),但這樣嚴(yán)重影響工作效率,且造成代碼重復(fù),增加維護成本 例如:我們可以假設(shè)HWND的結(jié)構(gòu)體為struct HWND BOOL bVisible,int x,int y,int cx,int cy; 那么,MoveWindow改變的就是其中的x,y,cx,cy字段。而 ShowWindow就是改變bVisible字段等等。第18頁/共21頁本章作業(yè) 練習(xí):(不提交)在MFC的工程中,使用ClassWizard中,給主對話框添加所有消息映射函數(shù)。設(shè)置斷點測試該消息在什么條件下被你設(shè)置的斷點截獲,函數(shù)體上注釋該消息的中文翻譯。例如:/當(dāng)鼠標(biāo)光標(biāo)移動時調(diào)用該消息void CTest1Dlg:OnMouseMove(UINT nFlags, CPoint point)。 作業(yè):(提交)1、在MFC工程中,根據(jù)WM_SYSC
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 跨境電子商務(wù)的消費者保護政策研究
- 足球校隊?wèi)?zhàn)術(shù)體系構(gòu)建的核心理念
- 如何打破部門壁壘提升合作計劃
- 與社區(qū)聯(lián)動的教育活動設(shè)計計劃
- 制訂年度銷售增長計劃的思考
- 運動醫(yī)學(xué)科工作總結(jié)與健康促進活動計劃
- 跨界合作在營銷策略與市場開發(fā)中的作用
- 財務(wù)支出監(jiān)管標(biāo)準(zhǔn)計劃
- 七年級必須收藏:名著《西游記》每回檢測題(6至10回)
- 提升班級文化品位的具體方法計劃
- 借哪吒精神燃開學(xué)斗志 開學(xué)主題班會課件
- 5S點檢表1(日檢查表)
- 醫(yī)院感染管理組織架構(gòu)圖
- 帶你看認養(yǎng)一頭牛品牌調(diào)研
- 雙鴨山玄武巖纖維及其制品生產(chǎn)基地項目(一期)環(huán)評報告表
- 冠心病病人的護理ppt(完整版)課件
- 砂石生產(chǎn)各工種安全操作規(guī)程
- (精心整理)林海雪原閱讀題及答案
- 云南藝術(shù)學(xué)院
- 2020華夏醫(yī)學(xué)科技獎知情同意報獎證明
- 素描石膏幾何體
評論
0/150
提交評論