第9章 Windows編程基礎(chǔ).ppt_第1頁(yè)
第9章 Windows編程基礎(chǔ).ppt_第2頁(yè)
第9章 Windows編程基礎(chǔ).ppt_第3頁(yè)
第9章 Windows編程基礎(chǔ).ppt_第4頁(yè)
第9章 Windows編程基礎(chǔ).ppt_第5頁(yè)
已閱讀5頁(yè),還剩38頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第9章 Windows編程基礎(chǔ),Windows 程序設(shè)計(jì)的基本概念Windows的事件驅(qū)動(dòng)機(jī)制 Windows應(yīng)用程序中常見的消息 Windows 程序設(shè)計(jì)的基本框架,本章主要內(nèi)容,9.1 Windows 程序設(shè)計(jì)基本概念,1. Visual C+應(yīng)用程序設(shè)計(jì)方法 (1)使用Windows提供的Windows API函數(shù) Windows API是Windows系統(tǒng)和Windows應(yīng)用程序間的標(biāo)準(zhǔn)程序接口,應(yīng)用程序可以通過(guò)此接口訪問(wèn)系統(tǒng)。 (2)使用Microsoft提供的MFC類庫(kù) MFC類庫(kù)集成了大量已經(jīng)預(yù)先定義好的類,用戶可以根據(jù)編程的需要調(diào)用相應(yīng)的類,或根據(jù)需要自定義有關(guān)的類。,本章要點(diǎn)

2、,內(nèi)容:使用Windows提供的API函數(shù)進(jìn)行Windows程序設(shè)計(jì) 目的:掌握Windows程序的基本結(jié)構(gòu) 理解Windows程序的運(yùn)行機(jī)制,2. Windows程序設(shè)計(jì)基本概念 (1)窗口 窗口是應(yīng)用程序與用戶之間交互的接口環(huán)境。用戶可以通過(guò)窗口輸入數(shù)據(jù),控制應(yīng)用程序的運(yùn)行;應(yīng)用程序可以通過(guò)窗口顯示數(shù)據(jù)和狀態(tài)。 (2)對(duì)象與句柄 對(duì)象是指Windows的規(guī)范部件,包括各種窗口、菜單、按鈕、對(duì)話框以及程序模塊等。 所謂句柄,就是一個(gè)唯一的整數(shù)值,是一個(gè)4字節(jié)長(zhǎng)的數(shù)值,用以標(biāo)識(shí)許多不同的對(duì)象類型,如窗口、菜單、內(nèi)存、畫筆、畫刷和文件等。 由于Windows是一個(gè)多任務(wù)操作系統(tǒng),它可以同時(shí)運(yùn)行多

3、個(gè)程序或一個(gè)程序的多個(gè)副本。Windows不僅使用句柄來(lái)管理實(shí)例,也用它來(lái)管理窗口、位圖、字體、元文件和圖標(biāo)等系統(tǒng)資源。 常見的Windows對(duì)象句柄如表9-1所示,所有的句柄類型以H開頭。,(3)事件驅(qū)動(dòng) Windows應(yīng)用程序以消息為基礎(chǔ),以事件驅(qū)動(dòng)之。Windows應(yīng)用程序啟動(dòng)之后將進(jìn)入一個(gè)消息循環(huán),等待系統(tǒng)或應(yīng)用程序的消息,消息的產(chǎn)生是因?yàn)槭录l(fā)生的結(jié)果,Windows程序設(shè)計(jì)主要圍繞編寫事件或消息的響應(yīng)函數(shù)上。,(4)消息(Message)及其在Windows編程中的應(yīng)用,消息,就是指Windows發(fā)出的一個(gè)通知,告訴應(yīng)用程序某個(gè)事情發(fā)生了。例如,單擊鼠標(biāo)、改變窗口尺寸、按下鍵盤上的

4、一個(gè)鍵都會(huì)使Windows發(fā)送一個(gè)消息給應(yīng)用程序。 消息是應(yīng)用程序和計(jì)算機(jī)交互的途徑,在計(jì)算機(jī)上幾乎做每一個(gè)動(dòng)作都會(huì)產(chǎn)生一個(gè)消息。 鼠標(biāo)被移動(dòng)會(huì)產(chǎn)生WM_MOUSEMOVE消息; 鼠標(biāo)左鍵被按下會(huì)產(chǎn)生WM_LBUTTONDOWN的消息; 鼠標(biāo)右鍵按下便產(chǎn)生WM_RBUTTONDOWN消息等。,Windows應(yīng)用程序是由消息驅(qū)動(dòng)的。Windows系統(tǒng)下每一個(gè)應(yīng)用程序窗口都維護(hù)一個(gè)消息隊(duì)列,操作系統(tǒng)接收和管理所有輸入消息、系統(tǒng)消息,并把它們發(fā)送給相應(yīng)窗口的消息隊(duì)列。應(yīng)用程序初始化完成后,進(jìn)入消息循環(huán),維護(hù)自己的消息隊(duì)列,從中取出消息,并進(jìn)行處理。 編寫消息處理函數(shù)是Windows編程的主要工作之一

5、。 系統(tǒng)傳遞給應(yīng)用程序的消息數(shù)據(jù)是一個(gè)MSG結(jié)構(gòu)體數(shù)據(jù)類型的數(shù)據(jù)。,消息的功能,功能 幫助Windows實(shí)現(xiàn)多任務(wù)。 通知應(yīng)用程序某一事件已經(jīng)發(fā)生,各應(yīng)用程序給予響應(yīng)。,消息的組成,操作系統(tǒng)是怎樣將感知到的事件傳遞給應(yīng)用程序呢?這是通過(guò)消息機(jī)制(Message)來(lái)實(shí)現(xiàn)的。 操作系統(tǒng)將每個(gè)事件都包裝成一個(gè)稱為消息的結(jié)構(gòu)體MSG來(lái)傳遞給應(yīng)用程序。包含了消息的類型以及其他信息。例如,對(duì)于單擊鼠標(biāo)所產(chǎn)生的消息來(lái)說(shuō),這個(gè)記錄中包含了單擊鼠標(biāo)時(shí)的坐標(biāo)。,在winuser.h中,消息結(jié)構(gòu)體MSG的定義如下: typedef struct tagMSG / 消息 HWND hwnd; /目標(biāo)窗口句柄 UINT

6、 message; /消息標(biāo)識(shí) WPARAM wParam; /消息參數(shù)1 LPARAM lParam; /消息參數(shù)2 DWORD time; /消息發(fā)送時(shí)間 POINT pt; /消息發(fā)送時(shí)鼠標(biāo)的屏幕坐標(biāo) MSG; 消息標(biāo)識(shí) message 是利用#define 宏定義好的消息名標(biāo)識(shí),是用于區(qū)別其他消息的常量值,每個(gè)Windows消息都有一個(gè)信息值,該值由windows.h頭文件中的宏定義來(lái)標(biāo)識(shí)。,Windows程序和Windows消息處理的基本流程,Windows消息分類,在windows系統(tǒng)中,大約有近千種消息。大致可以分為3類: (1)Windows 消息 此類消息主要包括以前綴 WM

7、_ 開頭的消息,WM_COMMAND 除外。如鍵盤消息、鼠標(biāo)消息,Windows 消息由窗口和視圖處理。 如:WM_LBUTTONDOWN 單擊鼠標(biāo)左鍵產(chǎn)生的消息 (2)控件消息 例如按鈕,列表框的選擇等都會(huì)產(chǎn)生通告消息??丶⑹菑目丶魉徒o父窗口的消息。 (3)命令消息 此類消息包括用戶界面對(duì)象(菜單、工具欄按鈕和快捷鍵)發(fā)出的 WM_COMMAND 通知消息。,在Win32中,消息統(tǒng)一由一個(gè)MSG結(jié)構(gòu)來(lái)描述,每一條消息在消息隊(duì)列中放置一個(gè)MSG結(jié)構(gòu)變量。一般情況下,應(yīng)用程序只需對(duì)結(jié)構(gòu)中的消息類別message、附加參數(shù)wParam和lParam三個(gè)字段進(jìn)行判斷就可以區(qū)別一個(gè)消息。,系統(tǒng)保

8、留消息標(biāo)識(shí)符的值在0 x0000在0 x03ff(WM_USER-1)范圍。這些值被系統(tǒng)定義消息使用。應(yīng)用程序不能使用這些值給自己的消息。 應(yīng)用程序消息從WM_USER(0X0400)到0X7FFF,或0XC000到0XFFFF;WM_USER到0X7FFF范圍的消息由應(yīng)用程序自己使用;0XC000到0XFFFF范圍的消息用來(lái)和其他應(yīng)用程序通信. WM_NULL-0 x0000 空消息。0 x0001-0 x0087 主要是窗口消息。0 x00A0-0 x00A9 非客戶區(qū)消息 0 x0100-0 x0108 鍵盤消息0 x0111-0 x0126 菜單消息0 x0132-0 x0138 顏色

9、控制消息0 x0200-0 x020A 鼠標(biāo)消息0 x0211-0 x0213 菜單循環(huán)消息0 x0220-0 x0230 多文檔消息0 x03E0-0 x03E8 DDE消息0 x0400 WM_USER0 x8000 WM_APP0 x0400-0 x7FFF 應(yīng)用程序自定義私有消息,消息的傳遞,Windows系統(tǒng)有一個(gè)存放消息的隊(duì)列。 每個(gè)應(yīng)用程序也有一個(gè)消息隊(duì)列。 Windows系統(tǒng)先將收到的消息存放在系統(tǒng)隊(duì)列中。 然后再分發(fā)到相應(yīng)的應(yīng)用程序隊(duì)列中。 應(yīng)用程序則從自身的隊(duì)列中獲取消息并進(jìn)行處理。,9.2 Windows 中的事件驅(qū)動(dòng),Windows應(yīng)用程序以消息為基礎(chǔ),以事件驅(qū)動(dòng)之。事

10、件用來(lái)標(biāo)識(shí)發(fā)生的某件事情,主要采用以下三種方式產(chǎn)生: (1) 通過(guò)輸入設(shè)備,如鍵盤和鼠標(biāo)。 (2) 通過(guò)屏幕上的可視對(duì)象,如菜單、工具欄按鈕、滾動(dòng)條和對(duì)話框上的控件。 (3) 來(lái)自Windows內(nèi)部。 事件驅(qū)動(dòng)程序設(shè)計(jì)是圍繞著消息的產(chǎn)生與處理而展開的。一條消息是關(guān)于發(fā)生的事件的信息。作為一個(gè)Windows程序員,其工作就是對(duì)正開發(fā)的應(yīng)用程序所要發(fā)出或要接收的消息進(jìn)行排序和管理。,Windows中事件產(chǎn)生的消息由系統(tǒng)傳遞給應(yīng)用程序,應(yīng)用程序必須有一個(gè)消息循環(huán)接收消息和處理相應(yīng)的消息。消息循環(huán)的實(shí)現(xiàn)如下: MSG msg /定義一個(gè)MSG類型的變量 while (GetMessage ( /將消息

11、傳遞給窗口函數(shù),以便處理相應(yīng)的消息 ,9.3 Windows 應(yīng)用程序中常見消息,1. 鼠標(biāo)消息,2. 鍵盤消息 (1) WM_KEYDOWN 這是在按下一個(gè)非系統(tǒng)鍵時(shí)產(chǎn)生的消息。此外相似的消息還有WM_KEYUP,它是在放開非系統(tǒng)鍵時(shí)產(chǎn)生。 (2) WM_CHAR 這也是按下一個(gè)非系統(tǒng)鍵時(shí)產(chǎn)生的消息。 3. 關(guān)閉窗口消息 關(guān)閉窗口時(shí)產(chǎn)生的消息是WM_CLOSE。,4. 退出程序消息 退出程序時(shí)產(chǎn)生的消息是WM_QUIT,這是退出應(yīng)用程序時(shí)由PostQuitMessage函數(shù)發(fā)出的消息。 The PostQuitMessage function indicates to the system

12、that a thread has made a request to terminate (quit). It is typically used in response to a WM_DESTROY message. When the thread retrieves the WM_QUIT message from its message queue, it should exit its message loop and return control to the system. The exit value returned to the system must be the wP

13、aram parameter of the WM_QUIT message.,5. 重畫消息 當(dāng)發(fā)生用戶區(qū)移動(dòng)或顯示事件、用戶窗口改變大小的事件以及程序通過(guò)滾動(dòng)條滾動(dòng)窗口時(shí),均產(chǎn)生一條WM_PAINT消息。此外,當(dāng)下拉式菜單關(guān)閉并需要恢復(fù)被覆蓋的部分以及Windows清除對(duì)話框或消息框等對(duì)象,并需要恢復(fù)被覆蓋的部分時(shí),將產(chǎn)生WM_PAINT消息。 WM_PAINT An application sends the WM_PAINT message when the system or another application makes a request to paint a portion

14、of an applications window. The message is sent when the UpdateWindow or RedrawWindow function is called, or by the DispatchMessage function when the application obtains a WM_PAINT message by using the GetMessage or PeekMessage function.,【例】一個(gè)簡(jiǎn)單的Windows32應(yīng)用程序。,#include int APIENTRY WinMain(HINSTANCE

15、hInstance,HINSTANCE hPreinstance,LPSTR lpCmdLine,int nCmdshow) MessageBox(NULL,一個(gè)簡(jiǎn)單的Win32應(yīng)用程序,例9.1,MB_OK); return 0; ,9.4 Windows應(yīng)用程序的基本框架,1. Windows應(yīng)用程序的組成 一個(gè)完整的Windows應(yīng)用程序通常由五種類型的文件組成,見下表。,2. Windows API 應(yīng)用程序?qū)嵗?Windows應(yīng)用程序的開始部分十分相似,下面通過(guò)一個(gè)實(shí)例的分析充分展示W(wǎng)indows應(yīng)用程序的各個(gè)部分。 【例9-1】簡(jiǎn)單窗口顯示。,3. Windows API 應(yīng)用程序

16、結(jié)構(gòu)分析 Windows的應(yīng)用程序具有相對(duì)固定的基本結(jié)構(gòu),其中由入口函數(shù)WinMain和窗口函數(shù)構(gòu)成基本框架,并包含各種數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)與函數(shù)等。 1) WinMain函數(shù) WinMain函數(shù)是所有Windows應(yīng)用程序的入口,類似于C語(yǔ)言中的main函數(shù),其功能是完成一系列的定義和初始化工作,并產(chǎn)生消息循環(huán)。 WinMain函數(shù)有三個(gè)基本的組成部分:函數(shù)說(shuō)明、初始化和消息循環(huán)。,(1) WinMain函數(shù)說(shuō)明 int WINAPI WinMain ( HINSTANCE hInstance, /應(yīng)用程序當(dāng)前實(shí)例句柄 HINSTANCE hPrevInstance, /應(yīng)用程序其他實(shí)例句柄

17、PSTR szCmdLine, /指向程序命令行參數(shù)的指針 int iCmdShow )/應(yīng)用程序開始執(zhí)行時(shí)窗口顯示方式/的整數(shù)值,(2) 初始化 初始化包括窗口類的定義、注冊(cè)、創(chuàng)建窗口實(shí)例和顯示四個(gè)部分。 窗口類的定義 窗口類定義通過(guò)給窗口類數(shù)據(jù)結(jié)構(gòu)WNDCLASS賦值完成。,結(jié)構(gòu)體類型WNDCLASS的定義如下: typedef struct tagWNDCLASS UINT style; /窗口類的樣式,一般設(shè)置為0 WNDPROC lpfnWndProc; /指向窗口函數(shù)的指針 int cbClsExtra; /分配在窗口類結(jié)構(gòu)后的字節(jié)數(shù) int cbWndExtra; /分配在窗口實(shí)

18、例后的字節(jié)數(shù) HINSTANCE hInstance;/定義窗口類的應(yīng)用程序的實(shí)例句柄 HICON hIcon; /窗口類的圖標(biāo) HCURSOR hCursor; /窗口類的光標(biāo) HBRUSH hbrBackground; /窗口類的背景刷 LPCWSTR lpszMenuName; /窗口類的菜單名 LPCWSTR lpszClassName; /窗口類名 WNDCLASS;, 注冊(cè)窗口類 RegisterClass( /wndclass為窗口類結(jié)構(gòu) 窗口類必須先注冊(cè)后使用。, 創(chuàng)建窗口 創(chuàng)建一個(gè)窗口類的實(shí)例由函數(shù)CreatWindow( )實(shí)現(xiàn),該函數(shù)的原型為: HWND CreateWi

19、ndow( LPCTSTR lpClassName, / 窗口類名 LPCTSTR lpWindowName, / 窗口標(biāo)題名稱 DWORD dwStyle, / 窗口樣式,常用窗口樣式見表9-5 int x, / 窗口左上角橫坐標(biāo) int y, / 窗口左上角縱坐標(biāo) int nWidth, / 窗口寬度 int nHeight, / 窗口高度 HWND hWndParent, /該窗口的父窗口句柄 HMENU hMenu, / 窗口主菜單句柄 HANDLE hInstance, / 創(chuàng)建窗口的應(yīng)用程序當(dāng)前句柄 LPVOID lpParam / 指向一個(gè)傳遞給窗口的參數(shù)值的指針 );, 顯示窗

20、口 由ShowWindow和 UpdateWindow函數(shù)共同實(shí)現(xiàn)。 ShowWindow(hwnd,nCmdShow); UpdateWindow(hwnd); 其中,hwnd為窗口句柄,nCmdShow為窗口顯示形式標(biāo)識(shí),常見顯示形式標(biāo)識(shí)及特點(diǎn)見表9-6。 調(diào)用完ShowWindow后,應(yīng)用程序調(diào)用UpdateWindow更新窗口,并發(fā)出WM_PAINT消息,繪制用戶區(qū)。,(3) 消息循環(huán) MSG msg; /定義一個(gè)MSG類型的變量 while (GetMessage ( /消息分發(fā) GetMessage的作用是從消息隊(duì)列中讀取一條消息,并將消息放在一個(gè)MSG結(jié)構(gòu)的變量中。 Transl

21、ateMessage的作用是翻譯消息,如將鍵盤操作轉(zhuǎn)化為消息。 DispatchMessage函數(shù)將消息傳遞給窗口函數(shù),以便處理相應(yīng)的消息。,2) 窗口函數(shù) 窗口函數(shù)是應(yīng)用程序處理接收到的消息的函數(shù),其中包含了應(yīng)用程序?qū)Ω鞣N可能接收到的消息的處理過(guò)程,是消息處理分支控制語(yǔ)句的集合。 一般來(lái)說(shuō),窗口函數(shù)由一個(gè)或多個(gè)switch語(yǔ)句組成。每一個(gè)case語(yǔ)句對(duì)應(yīng)一種消息,當(dāng)應(yīng)用程序接受到一個(gè)消息時(shí),在窗口函數(shù)內(nèi)的相應(yīng)的case語(yǔ)句就會(huì)被激活并執(zhí)行相應(yīng)的響應(yīng)程序模塊。,窗口函數(shù)的一般形式如下: LRESULT CALLBACK WndProc ( HWND hwnd, /窗口句柄 UINT iMsg,

22、 /代表所處理消息的消息值 WPARAM wParam, /消息的附加參數(shù) LPARAM lParam) /消息的附加參數(shù) switch (iMsg) case WM_DESTROY : PostQuitMessage (0) ; /調(diào)用函數(shù)PostQuitessage退出程序 return 0 ; /系統(tǒng)默認(rèn)的處理過(guò)程,以保證所有發(fā)送到該窗口的消息均得以處理。 return DefWindowProc (hwnd, iMsg, wParam, lParam) ; ,Windows中的數(shù)據(jù)類型 除了C+中經(jīng)典的數(shù)據(jù)類型,在32位Windows的C+開發(fā)平臺(tái)中,為了滿足數(shù)據(jù)定義的需要,擴(kuò)充定義了一些新的數(shù)據(jù)類型。一般而言,指針數(shù)據(jù)類型以P或LP作為前綴,句柄類型以H作為前綴。(參下表或MSDN),Windows常用的基本數(shù)據(jù)類型,Windows基本數(shù)據(jù)類型,說(shuō)明: 這些基本數(shù)據(jù)類型都是用大寫字符來(lái)表示,以與一般C+基本數(shù)據(jù)類型相區(qū)別。 數(shù)據(jù)類型的前綴是P或LP,表示是一個(gè)指針或長(zhǎng)指針數(shù)據(jù)類型。前綴是U,表示無(wú)符號(hào)數(shù)據(jù)類型,等等。 Windows還提供一些宏來(lái)處理上述基本數(shù)據(jù)類型。,Windows中的數(shù)據(jù)類型 類型 定義-BOOL 布爾型(邏輯型)變量(應(yīng)為TRUE或FALSE)BOOLEAN 布爾型(邏輯型)變量(應(yīng)為TRUE或FALSE)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論