【正文】
高樓,打好基礎(chǔ)是關(guān)鍵 教學(xué)內(nèi)容 167。 Windows編程基礎(chǔ) 167。 MFC程序設(shè)計(jì)基礎(chǔ) 167。 應(yīng)用程序框架 167。 綜合實(shí)例 —— 創(chuàng)建賓館管理系統(tǒng)的框架 167。 小結(jié) 思考與練習(xí) 167。 Windows編程基礎(chǔ) Windows編程基本概念 窗口 ?窗口是 Windows應(yīng)用程序中一個(gè)非常重要的元素。一個(gè) Windows應(yīng)用程序至少要有一個(gè)窗口,稱為主窗口。 ?從用戶的角度講,窗口是屏幕上與一個(gè)應(yīng)用程序相對(duì)應(yīng)的矩形區(qū)域,是用戶與應(yīng)用程序之間的圖形化的接口。每當(dāng)用戶打開(kāi)一個(gè)應(yīng)用程序時(shí),應(yīng)用程序就會(huì)創(chuàng)建并顯示一個(gè)窗口;當(dāng)用戶操作窗口中的對(duì)象時(shí),窗口就會(huì)做出反映;關(guān)閉主窗口時(shí)就會(huì)終止應(yīng)用程序的運(yùn)行;通過(guò)選擇應(yīng)用程序窗口,就會(huì)選擇與窗口對(duì)應(yīng)的應(yīng)用程序。 ?從程序員的角度講,窗口是 Windows應(yīng)用程序的基本操作單元,是系統(tǒng)管理應(yīng)用程序的基本單位,是應(yīng)用程序與用戶之間交互的接口。應(yīng)用程序的運(yùn)行過(guò)程就是窗口內(nèi)部、窗口與窗口之間、窗口與系統(tǒng)之間進(jìn)行數(shù)據(jù)處理和數(shù)據(jù)交換的過(guò)程。因此,編寫(xiě)應(yīng)用程序就是要?jiǎng)?chuàng)建一個(gè)或多個(gè)窗口,管理多個(gè)窗口之間的數(shù)據(jù)處理與交換。 167。 Windows編程基礎(chǔ) Windows編程基本概念 ?窗口的特性是由一個(gè) WNDCLASS結(jié)構(gòu)體進(jìn)行定義的。 WNDCLASS定義如下: typedef struct tagWNDCLASS { UINT style。 //窗口風(fēng)格 WNDPROC lpfnWndProc。 //指向窗口處理函數(shù)的函數(shù)指針 int cbClsExtra。 //窗口結(jié)構(gòu)中的預(yù)留字節(jié)數(shù) int cbWndExtra。 //為其它創(chuàng)建窗口預(yù)留字節(jié)數(shù) HINSTANCE hInstance。 //注冊(cè)該窗口類的實(shí)例句柄 HICON hIcon。 //代表該窗口類的圖標(biāo)句柄 HCURSOR hCursor。 // 該窗口客戶區(qū)鼠標(biāo)光標(biāo)句柄 HBRUSH hbrBackGround。 //該窗口背景顏色句柄 LPCSTR lpszMenuName。 //指向窗口菜單名的字符指針 LPCSTR lpszClassName。 //指向窗口名的字符指針 } WNDCLASS; 167。 Windows編程基礎(chǔ) Windows編程基本概念 句柄 ? 在 Windows程序中,每產(chǎn)生一個(gè)資源(如圖標(biāo)、光標(biāo)、窗口、應(yīng)用程序的實(shí)例等),操作系統(tǒng)都要將它們放入相應(yīng)的內(nèi)存,并為這些內(nèi)存指定一個(gè)唯一的標(biāo)識(shí)號(hào),這個(gè)標(biāo)識(shí)號(hào)即該資源的句柄。 ? 操作系統(tǒng)要管理和操作這些資源,都是通過(guò)句柄來(lái)找到對(duì)應(yīng)的資源的,句柄是系統(tǒng)用來(lái)唯一標(biāo)識(shí)某個(gè) Windows對(duì)象的符號(hào)。句柄的數(shù)據(jù)類型在: typedef void * HANDLE。 ? 從物理上看句柄是一個(gè)泛型(無(wú)類型)指針,但它不是指向一個(gè)Windows對(duì)象的存儲(chǔ)首地址,而是指向包含了使用該對(duì)象有關(guān)信息的一塊內(nèi)存單元。從邏輯上說(shuō)它是一個(gè)代號(hào),一個(gè)對(duì)象的代號(hào)。句柄所指向的內(nèi)容是不能由句柄操作來(lái)改變的,只能由系統(tǒng)來(lái)改變。 167。 Windows編程基礎(chǔ) Windows編程基本概念 消息和消息隊(duì)列 ? Windows程序設(shè)計(jì)是面向事件的。在 Windows環(huán)境下,應(yīng)用程序啟動(dòng)后,系統(tǒng)等待用戶在圖形用戶界面內(nèi)的輸入選擇,如鼠標(biāo)按鍵、鍵盤按鍵、窗口被創(chuàng)建、關(guān)閉、改變大小、移動(dòng)等,在 Windows看來(lái),這些都是事件。只要有事件發(fā)生,系統(tǒng)即產(chǎn)生特定的消息,驅(qū)動(dòng)相應(yīng)的處理函數(shù)進(jìn)行處理,因此 Windows 應(yīng)用程序也稱為事件驅(qū)動(dòng)程序。 ? 消息描述了事件的類別,包含了相關(guān)信息, Windows應(yīng)用程序利用消息與系統(tǒng)及其它應(yīng)用程序進(jìn)行信息交換。 ? 由于 windows事件的發(fā)生是隨機(jī)的,程序的執(zhí)行先后順序也無(wú)法預(yù)測(cè),系統(tǒng)采用消息隊(duì)列來(lái)存放事件發(fā)生的消息。每個(gè) Windows程序都有一個(gè)消息隊(duì)列,該隊(duì)列是一個(gè)先進(jìn)先出的緩沖區(qū),通常是一個(gè)某種變量類型的數(shù)組。 167。 Windows編程基礎(chǔ) Windows編程基本概念 消息和消息隊(duì)列 ?在 ,消息結(jié)構(gòu)的定義如下: typedef struct tagMSG { HWND hWnd。 //指定消息發(fā)向的窗口句柄 UINT message。 //標(biāo)識(shí)消息的消息值 WPARAM wParam。 //消息參數(shù) LPARAM lParam。 //消息參數(shù) DWORD time。 //消息進(jìn)入隊(duì)列的時(shí)間 POINT pt。 /消息進(jìn)入隊(duì)列時(shí)鼠標(biāo)指針的屏幕坐標(biāo) }MSG; 167。 Windows編程基礎(chǔ) 數(shù)據(jù)類型 數(shù)據(jù)類型 說(shuō) 明 BYTE 8位無(wú)符號(hào)字符 BSTR 32位字符指針 COLORREF 32位整數(shù),表示一個(gè)顏色 WORD 16位無(wú)符號(hào)整數(shù) LONG 32位有符號(hào)整數(shù) DWORD 32位無(wú)符號(hào)整數(shù),是 WORD的兩倍長(zhǎng)度 UINT 32位無(wú)符號(hào)整數(shù) BOOL 布爾值,值為 TRUE或 FALSE HANDLE 句柄 LPSTR 32位指針,指向字符 LPCSTR 32位指針,指向字符串常量 LPTSTR 32位指針,指向字符串,此字符串可移植到 Unicode和 DBCS雙字符集 LPCTSTR 32位指針,指向字符串常量,此字符串可移植到 Unicode和 DBCS雙字符集 LPVOID 32位指針,可指向任何類型數(shù)據(jù) LPRESULT 32位數(shù)值,作為窗口函數(shù)或 CALLBACK函數(shù)的返回類型 WNDPROC 32位指針,指向一個(gè)窗口函數(shù) 167。 Windows編程基礎(chǔ) Windows應(yīng)用程序的結(jié)構(gòu) Windows應(yīng)用程序的構(gòu)成 ?構(gòu)成 Windows程序的基本元素包括程序代碼、用戶界面資源和動(dòng)態(tài)鏈接庫(kù) (dynamiclink library)庫(kù)。 ? 程序代碼主要由可執(zhí)行代碼構(gòu)成, Windows程序要求有兩個(gè)函數(shù):一個(gè)是 WinMain。 WinMain函數(shù)是應(yīng)用程序的基礎(chǔ), Windows應(yīng)用程序的入口函數(shù)。當(dāng) Windows操作系統(tǒng)啟動(dòng)一個(gè)程序時(shí),它調(diào)用的就是該程序的WinMain函數(shù)。另一個(gè)是窗口處理函數(shù) WndProc,對(duì)來(lái)自系統(tǒng)的消息進(jìn)行處理。 ?資源是應(yīng)用程序能夠使用的一類預(yù)定義工具,用戶界面資源是應(yīng)用程序定義的圖形用戶接口 GUI(graphical user interface),如菜單、對(duì)話框、按鈕等。 167。 Windows編程基礎(chǔ) Windows應(yīng)用程序的結(jié)構(gòu) Windows消息處理 ( 1) 當(dāng) Windows應(yīng)用程序開(kāi)始執(zhí)行時(shí),操作系統(tǒng)在預(yù)定的入口WinMain與應(yīng)用程序連接。 ( 2)應(yīng)用程序創(chuàng)立一個(gè)或多個(gè)窗口,每個(gè)窗口 (包括對(duì)話框 )都有一個(gè)窗口過(guò)程函數(shù),程序通過(guò)窗口接收用戶的輸入和決定窗口顯示。 ( 3)各種輸入產(chǎn)生的消息首先進(jìn)入系統(tǒng)隊(duì)列,由系統(tǒng)根據(jù)產(chǎn)生消息的窗口將消息發(fā)至窗口所在應(yīng)用程序的消息隊(duì)列。 ( 4)程序的消息循環(huán)代碼段檢索從消息隊(duì)列中來(lái)的消息,并把它們返回Windows系統(tǒng),由系統(tǒng)發(fā)送到對(duì)應(yīng)的窗口過(guò)程函數(shù)進(jìn)行處理,對(duì)于程序未響應(yīng)的消息,發(fā)送至缺省窗口過(guò)程函數(shù)進(jìn)行處理。 167。 Windows編程基礎(chǔ) Windows程序示例 為了幫助讀者理解 Windows編程的概念,下面編寫(xiě)一個(gè)簡(jiǎn)單的Windows應(yīng)用程序。該程序創(chuàng)建一個(gè)窗口,并在該窗口響應(yīng)鼠標(biāo)和鍵盤消息。程序的實(shí)現(xiàn)步驟如下: ? WinMain函數(shù)的定義。 ? 創(chuàng)建一個(gè)窗口。 ? 進(jìn)行消息循環(huán)。 ? 編寫(xiě)窗口過(guò)程函數(shù) 167。 MFC程序設(shè)計(jì)基礎(chǔ) MFC類庫(kù)的層次結(jié)構(gòu) CObject CWnd CCmdTarget CFrameWnd CControlBar CPropertySheet CButton CComboBox CEdit CListBox CStatic CTreeCtrl CDialogBar CToolBar CStatusBar CDialog CPropertyPage CCommonDialog CView CScrollView CScrollView 167。 MFC程序設(shè)計(jì)基礎(chǔ) MFC定義的宏、全局函數(shù)及全局變量 1. MFC提供的主要宏: □消息映射宏: 聲明消息映射表宏 DECLARE_MESSAGE_MAP、定義消息映射表宏 BEGIN_MESSAGE_MAP和 END_MESSAGE_MAP對(duì)、消息映射表入口宏 ON_加消息名。 □動(dòng)態(tài) MFC對(duì)象宏: DECLARE_DYNCREATE和DECLARE_DYNAMIC, IMPLEMENT_DYNCREATE和IMPLEMENT_DYNAMIC □ 運(yùn)行時(shí)類宏: RUNTIME_CLASS □ 序列化宏: DECLARE_SERIAL和 IMPLEMENT_SERIAL □ 診斷服務(wù)宏: ASSERT、 VERIFY □ 跟蹤服務(wù)宏: TRACE □ 異常處理宏: THROW 167。 MFC程序設(shè)計(jì)基礎(chǔ) MFC定義的宏、全局函數(shù)及全局變量 2. 全局函數(shù) MFC提供一些不屬于任何類的全局函數(shù),函數(shù)名以 Afx開(kāi)頭,可以被應(yīng)用程序中的所有類和函數(shù)所調(diào)用。如: □ AfxAbort:無(wú)條件終止一個(gè)應(yīng)用程序的執(zhí)行; □ AfxGetAppName:返回指向應(yīng)用程序名的字符串指針; □ AfxWinInit由 WinMain調(diào)用,對(duì) MFC應(yīng)用程序進(jìn)行圖形用戶界面(GUI)的初始化等等。 □ AfxGetApp:返回指向應(yīng)用程序的 CWinApp對(duì)象的指針。 167。 應(yīng)用程序框架 構(gòu)架 Windows應(yīng)用程序框架 創(chuàng)建應(yīng)用程序框架 ? 使用 Visual C++.NET的應(yīng)用程序向?qū)В梢粋€(gè)名為 AnalyzeMFC的 VC++.NET項(xiàng)目。注意,我們這個(gè)例程中的應(yīng)用程序的類型為 “ 單文檔 ” 類型。 ? 在項(xiàng)目 AnalyzeMFC中,應(yīng)用程序向?qū)橛脩羯闪?4個(gè)類,這些類所對(duì)應(yīng)的頭文件和源文件如表 25所示。 序號(hào) 類名 頭文件 實(shí)現(xiàn)文件 1 CAnalyzeMFCApp 2 CAnalyzeMFCDoc 3 CAnalyzeMFCView 4 CMainFrame 167。 應(yīng)用程序框架 構(gòu)架 Windows應(yīng)用程序框架 應(yīng)用程序的執(zhí)行過(guò)程 i n t A F X A P I A f x W i n M a i n ( . . . ){ C W i n A p p * p A p p = A f x G e t A p p ( ) 。 A f x W i n I n i t ( . . . ) 。 p A p p I n i n A p p l i c a t i o n ( ) 。 p A p p I n i n t I n s t a n c e ( ) 。 n R e t u r n C o d e = p A p p R u n ( ) 。 A f x W i n T e r m ( ) 。}C M y W i n A p p t h e A p p 。B O O L C M y W i n A p p : : I n i t I n s t a n c e ( ){ m _ p M a i n W n d = n e w C M y F r a m e W n d ( ) 。 m _ p M a i n W n d S h o w W i n d o w ( m _ n C m d S h o w ) 。 m _ p M a i n W n d U p d a t e W i n d o w ( ) 。 r e t u r n T R U E 。}C M y F r a m e W n d : : C M y F r a m e W n d ( ){C r e a t e ( N U L L , ? , ? , ? )}C W i n A p p : : R u n ( ) 。C W i n T h r e a d : : R u n ( ){ ? d o { : : G e t M e s s a g e ( amp。 m s g , ? ) 。 P r e T r a n s l a t e M e s s a g e ( amp。 m s g ) 。 : : T r a n s l a t e M e s s a g e ( amp。 m s g ) 。 : : D i s p a t c h M e s s g e ( amp。 m s g ) 。 ? } w h i l e ( : : P e a k