信息系統(tǒng)201-Windows消息機(jī)制_第1頁(yè)
信息系統(tǒng)201-Windows消息機(jī)制_第2頁(yè)
信息系統(tǒng)201-Windows消息機(jī)制_第3頁(yè)
信息系統(tǒng)201-Windows消息機(jī)制_第4頁(yè)
信息系統(tǒng)201-Windows消息機(jī)制_第5頁(yè)
已閱讀5頁(yè),還剩53頁(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、.,信息系統(tǒng)技術(shù)基礎(chǔ)-2,授課老師: 王志宏;王長(zhǎng)軍 實(shí)驗(yàn)老師: 王長(zhǎng)軍,.,Contact Information,Name: 王長(zhǎng)軍 Office: 721 Tel: 62378372(O);M) Email: cjwang Personal Information 2007-Present 物流系, DHU 2005-2006 Computer System Division, SEC 2002-2005 SJTU,.,課程概要,企業(yè)信息化、政府信息化和社會(huì)信息化孕育著巨大的軟件市場(chǎng) 新技術(shù)(IPV6、3G、移動(dòng)IP、Wibro、藍(lán)牙、RFID)驅(qū)動(dòng)軟件市場(chǎng) 新

2、商業(yè)模式(E-Commerce、M-Commerce)拉動(dòng)軟件市場(chǎng),軟件是IT的核心與靈魂,.,課程概要,王志宏 操作系統(tǒng)相關(guān) 王長(zhǎng)軍 軟件項(xiàng)目開(kāi)發(fā)基礎(chǔ) Windows API編程基礎(chǔ)(消息機(jī)制;進(jìn)程/線程;圖形接口) 軟件項(xiàng)目實(shí)施基礎(chǔ),.,Windows消息機(jī)制,王長(zhǎng)軍 2007年7月,.,講授內(nèi)容,1. 課程背景 2. Windows程序的特點(diǎn) 3. 事件與消息系統(tǒng) 4. Windows程序的基本結(jié)構(gòu) 5. 實(shí)驗(yàn):利用API 開(kāi)發(fā)Windows程序?qū)嵗?.,1.1 預(yù)備知識(shí),Windows操作系統(tǒng):用過(guò)吧! 一門(mén)編程語(yǔ)言:C/VB,學(xué)過(guò)吧!(C#, Java, Delphi) 一個(gè)適合Wi

3、ndows程序設(shè)計(jì)的編譯器和開(kāi)發(fā)環(huán)境:Microsoft Visual C+ 6.0/ Visual Basic 6.0,.,1.2 課程目標(biāo),不是編程 API (Application Programming Interface)而不是MFC (Microsoft Foundation Class) 消化”消息”,.,1.3 Windows相關(guān),API 就是應(yīng)用程序編程接口。它是能用來(lái)操作組件、應(yīng)用程序或者操作系統(tǒng)的一組函數(shù)。典型的情況下,API 由一個(gè)或多個(gè)提供某種特殊功能的 DLL 組成 每個(gè) Windows 應(yīng)用程序都直接或間接地使用了 Windows API 隨著 Windows 操

4、作系統(tǒng)的發(fā)展,Windows API的內(nèi)容也在不斷擴(kuò)充之中,.,1.3 Windows相關(guān),MS-DOS,IBM-PC,有限的I/O函數(shù),1981,OS,硬件,MS1.03.0,16bit HW,API函數(shù),1983,圖形環(huán)境,NTXP,16/32bit HW,API函數(shù),1993,圖形環(huán)境,Vista,32/64bit HW,API函數(shù),2006,3D圖形環(huán)境,過(guò)程驅(qū)動(dòng),消息驅(qū)動(dòng),.,1.3 Windows相關(guān),NTXP,32bit HW,API函數(shù),1993,圖形環(huán)境,Vista,32/64bit HW,API函數(shù),2006,3D圖形環(huán)境,MFC (Microsoft Foundation

5、 Class Library ),WPF (Windows Presentation Foundation ) WCF (Windows Communication Foundation) WWF (Windows Workflow Foundation),.,1.3 Windows相關(guān),DOS與Windows驅(qū)動(dòng)機(jī)制的區(qū)別 DOS是過(guò)程驅(qū)動(dòng) 在等待用戶輸入過(guò)程中,所有輸入設(shè)備(資源)都被“等待”過(guò)程搶占了。 Windows是消息(事件)驅(qū)動(dòng),.,2. Windows程序的特點(diǎn),2.1圖文 2.2消息 2.3整合,.,2.1 圖文,1不僅是黑底白字 2. 而是 框架菜單按鈕滾動(dòng)條 稱為窗口要素

6、 3. 窗口類(lèi)型 Console 文字類(lèi)型 Window 菜單+用戶區(qū)域 Dialog Message Box 4. 實(shí)現(xiàn)途徑GDI(圖形設(shè)備接口,GDI32.dll),.,2.2 消息,不再是循規(guī)蹈矩 而是Message based, event driven 窗口程序的主要任務(wù)是人機(jī)交互 除非人主動(dòng)結(jié)束任務(wù),程序以while循環(huán)為主體框架 人不斷進(jìn)行各種輸入,計(jì)算機(jī)不斷響應(yīng),形成“輸入”“響應(yīng)”的程序結(jié)構(gòu),.,2.2 消息,各種類(lèi)型的“輸入”,以消息格式存在 GetMessage()取走一個(gè)消息 對(duì)事件的響應(yīng),即事件驅(qū)動(dòng) DispatchMessage()處理消息 實(shí)現(xiàn)途徑User32.d

7、ll,.,2.3 整合,MS Windows結(jié)構(gòu) OS系統(tǒng)服務(wù)(KERNEL):內(nèi)存管理、程序加載(包括DLL)、任務(wù)調(diào)度、文件管理 用戶接口(USER):窗口和消息管理,以及菜單、控制、對(duì)話框、定時(shí)器等 圖形設(shè)備接口(GDI, Graphic Device Interface):管理顯示器,為USER與應(yīng)用程序提供與硬件設(shè)備獨(dú)立的接口 對(duì)應(yīng)的,API函數(shù)也分為三類(lèi): 系統(tǒng)服務(wù);管理和圖形設(shè)備函數(shù),.,2.3 整合,.DLG,.BMP,.ICO,.CUR,.FON,.RC,.H,.C,.OBJ,.LIB DLL Import,.DEF,RC compiler,Text Editor,Dialo

8、g Editor,Image Editor,Font Editor,C Compiler,LINKER,.EXE,.RES,.,3. 事件與消息系統(tǒng),3.1事件和事件驅(qū)動(dòng) 3.2消息系統(tǒng) 3.3一個(gè)具體的窗口程序,.,3.1 事件和事件驅(qū)動(dòng),Windows程序?yàn)橄⒍吧?,因消息而“死?那么,消息從何而來(lái)? Windows操作環(huán)境中,無(wú)論是系統(tǒng)產(chǎn)生的動(dòng)作或用戶運(yùn)行應(yīng)用程序產(chǎn)生的動(dòng)作,稱為事件(Events)產(chǎn)生的消息(Message)。 那么,事件又從何而來(lái)? 通過(guò)輸入設(shè)備,如鍵盤(pán)和鼠標(biāo) 通過(guò)屏幕上可視的對(duì)象,如菜單、工具欄按鈕、滾動(dòng)條和對(duì)話框上的控件 來(lái)自Windows內(nèi)部,.,基于事件

9、驅(qū)動(dòng)的程序模型,3.1 事件和事件驅(qū)動(dòng),.,Windows消息系統(tǒng)的組成 消息隊(duì)列 消息循環(huán) 窗口過(guò)程,3.2 消息系統(tǒng),.,消息的數(shù)據(jù)結(jié)構(gòu) 消息的數(shù)據(jù)結(jié)構(gòu)MSG的定義如下: typedef struct tagMSG HWND hwnd; /用以檢索消息的窗口句柄 UINT message;/消息值 WPARAM wParam;/包含有關(guān)消息的附加信息 LPARAM lParam; /隨不同的消息而有所不同 DWORD time;/消息送到隊(duì)列的時(shí)間 POINT pt; /消息發(fā)送時(shí),屏幕光標(biāo)的位置 MSG;,3.2 消息系統(tǒng),.,Windows常用消息 WM_LBUTTONDOWN:?jiǎn)螕羰?/p>

10、標(biāo)左鍵時(shí)產(chǎn)生的消息; WM_LBUTTONUP:放開(kāi)鼠標(biāo)左鍵時(shí)產(chǎn)生的消息; WM_RBUTTONDOWN:?jiǎn)螕羰髽?biāo)右鍵時(shí)產(chǎn)生的消息; WM_RBUTTONUP:放開(kāi)鼠標(biāo)右鍵時(shí)產(chǎn)生的消息; WM_LBUTTONDBLCLK:雙擊鼠標(biāo)左鍵時(shí)產(chǎn)生的消息; WM_RBUTTONDBLCLK:雙擊鼠標(biāo)右鍵時(shí)產(chǎn)生的消息; WM_CREATE:CreateWindows()函數(shù)產(chǎn)生的消息; WM_CLOSE:關(guān)閉窗口時(shí)產(chǎn)生的消息; WM_QUIT:退出應(yīng)用程序時(shí)由PostQuitMessage()發(fā)出的消息; WM_PAINT:Windows系統(tǒng)需要重繪時(shí)產(chǎn)生的消息。 ,3.2 消息系統(tǒng),.,3.2 消息系

11、統(tǒng),消息隊(duì)列 消息隊(duì)列是系統(tǒng)定義的內(nèi)存塊,用于臨時(shí)存儲(chǔ)消息;或是把消息直接發(fā)給窗口過(guò)程 在16位的系統(tǒng)中系統(tǒng)中只有一個(gè)消息隊(duì)列 32位的系統(tǒng)中每一運(yùn)行的程序都會(huì)有一個(gè)消息隊(duì)列,.,支持隊(duì)列特征的消息驅(qū)動(dòng)模型,3.2 消息系統(tǒng),消息隊(duì)列,.,3.2 消息系統(tǒng),什么是消息循環(huán) while(GetMessage( ,.,3.2 消息系統(tǒng),Windows消息處理示意圖,Windows系統(tǒng),應(yīng)用 程序 隊(duì)列A,應(yīng)用 程序 隊(duì)列B,系統(tǒng)隊(duì)列,WinMain函數(shù) 消息循環(huán),窗口 函數(shù)1,窗口 函數(shù)2,WinMain函數(shù) 消息循環(huán),窗口 函數(shù)1,窗口 函數(shù)2,應(yīng)用程序A,應(yīng)用程序B,消息循環(huán),.,WinMai

12、n() 初始化; while(GetMessage( ,系統(tǒng) 消息 隊(duì)列,WndProc(msg) ,switch(msg) case MSG1: case MSG2: ,應(yīng)用 程序 消息 隊(duì)列,mouse driver,keyboard driver,SendMessage(),USER Module,message from Other window,PostMessage(),system,3.3 一個(gè)具體的窗口程序,.,4. Win32程序的基本結(jié)構(gòu),4.1. Windows程序組成 4.2. 詳解入口,窗口,消息 4.3. Windows數(shù)據(jù)類(lèi)型 4.4. Windows程序的“生生

13、死死”,.,WinMain()程序入口點(diǎn) 注冊(cè)窗口 RegisterClass() 生成并顯示窗口 CreateWindow() ShowWindow() 消息循環(huán) WndProc()窗口函數(shù)(功能實(shí)現(xiàn)) 區(qū)分消息 switch 根據(jù)消息觸發(fā)相應(yīng)處理 調(diào)用DefWindowProc() 不處理的消息、和需要系統(tǒng)進(jìn)一步處理的消息 如WM_CLOSE,使用者關(guān)閉了窗口。應(yīng)用程序獲得這個(gè)消息后,釋放了自己的資源,然后讓系統(tǒng)進(jìn)一步執(zhí)行關(guān)閉窗口的動(dòng)作,4.1. Windows程序組成,.,WinMain() 初始化; 創(chuàng)建、顯示、更新窗口; 建立基于消息的 事件驅(qū)動(dòng)機(jī)制 ,WinMain() Regis

14、terClass( ); CreateWindow( ); ShowWindow( ); UpdateWindow( ); while(GetMessage( ,WinMain()程序入口點(diǎn),4.2. 詳解入口,.,4.2. 詳解入口,WinMain函數(shù)的原型如下: int WINAPI WinMain ( HINSTANCE hInstance, / 當(dāng)前實(shí)例句柄 HINSTANCE hPrevInstance, / 以前的實(shí)例句柄 LPSTR lpCmdLine, / 指向命令行參數(shù)的指針 int nCmdShow ) / 窗口的顯示狀態(tài),.,初始化包括 定義窗口 注冊(cè)窗口 創(chuàng)建窗口 顯示

15、窗口 需要注意的是,在顯示窗口ShowWindow函數(shù)后,需調(diào)用UpdateWindow()函數(shù)更新并繪制用戶區(qū),并發(fā)出WM_PAINT消息。,4.2. 詳解窗口,.,注冊(cè)窗口RegisterClass( ) 在注冊(cè)之前可以設(shè)置窗口屬性,系統(tǒng)會(huì)給出一些缺省值,我們重點(diǎn)關(guān)心其中的lpfnWndProc參數(shù),WNDCLASS wc; wc.stvle = ; wc.lpfnWndProc (WNDPROC)WndProc;,提示系統(tǒng)收到消息后,調(diào)該函數(shù)處理消息,wc.hIcon = ,wc.Cursor = ,wc.hbrBackground = ,RegisterClass(,4.2. 詳解窗口

16、,.,CreateWindow() ShowWindow() UpdateWindow(),4.2. 詳解窗口,HWND CreateWindow( LPCTSTR lpClassName, / 已注冊(cè)的窗口類(lèi)名 LPCTSTR lpWindowName, / 窗口標(biāo)題 DWORD dwStyle, / 窗口風(fēng)格 int x, / 窗口的水平位置 int y, / 窗口的垂直位置 int nWidth, / 窗口寬度 int nHeight, / 窗口高度 HWND hWndParent, / 父窗口句柄 HMENU hMenu, / 菜單句柄或控件標(biāo)識(shí) HINSTANCE hInstance

17、, / 應(yīng)用程序?qū)嵗浔?LPVOID lpParam ) / 其他窗口創(chuàng)建時(shí)的參數(shù)數(shù)據(jù),.,消息 本身是一個(gè)無(wú)符號(hào)整型變量 類(lèi)型有 WM_COMMAND:系統(tǒng)命令類(lèi),菜單選擇,按鈕等 WM_PAINT: 對(duì)窗口作圖 WM_DESTORY: 關(guān)閉窗口 WM_USER: 用戶可自定義一些消息 在某個(gè)特定類(lèi)型之下,更有許多事件,一般通過(guò)wParam通知,4.2. 詳解消息,.,while(GetMessage( GetMessage具有阻塞機(jī)制 當(dāng)消息隊(duì)列中沒(méi)有消息時(shí),程序非忙等,而是讓權(quán)等待 當(dāng)收到WM_QUIT時(shí),GetMessage返回false,循環(huán)停止,同時(shí)應(yīng)用程序終止。 Dispatc

18、hMessage 通過(guò)USER模塊協(xié)助,將消息傳遞到WndProc WndProc的調(diào)用指示在注冊(cè)窗口類(lèi)時(shí),已向系統(tǒng)指明,4.2. 詳解消息采集,.,WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam),HWND hWnd: 窗口句柄,在與窗口有關(guān)的控制中使用,UINT message:消息(類(lèi)型),WPARAM wParam:傳遞的參數(shù),LPARAM lParam: 傳遞的參數(shù),1-在基于消息的機(jī)制中,有時(shí)僅有消息是不夠的 2-產(chǎn)生消息的同時(shí),傳遞什么樣的參數(shù)要視具體 的消息而定,4.2. 詳解消息處理,消息處理函數(shù)是

19、用于處理特定消息的一些代碼,一般包括一個(gè)多分支switch語(yǔ)句結(jié)構(gòu)。,.,WndProc( hWnd, message, wParam, lParam),switch(message),case WM_COMMAND:,id = LOWORD(wParam);,Switch(id) ,case IDM_OPEN:,break;,菜單中的open選項(xiàng),case WM_PAINT:,在視窗作圖;,break;,default:,DefWindowProc();,4.2. 詳解消息處理,.,4.2. 詳解消息處理,思考:怎樣根據(jù)功能要求 生成消息,并把這個(gè)消息 傳遞給窗口函數(shù)?,窗口程序的可能結(jié)構(gòu),

20、在窗口中顯示,.,4.3. Windows數(shù)據(jù)類(lèi)型,.,Windows將使用的所有類(lèi)型定義在Windows.h文件和其相關(guān)的文件中。 一些常用的類(lèi)型有句柄(HANDLE)、窗口句柄(HWND)、字符(BYTE)、短整數(shù)(WORD)、布爾型(BOOL)、字符串指針(LPSTR)以及常量字符串指針(LPCSTR)等。 HANDLE是一個(gè)用作句柄的32位整數(shù),句柄是代表某些資源的簡(jiǎn)單的數(shù)值,所有的句柄類(lèi)型以H開(kāi)頭。 凡是數(shù)據(jù)類(lèi)型的前綴是P或LP,則表示該類(lèi)型是一個(gè)指針或長(zhǎng)指針數(shù)據(jù)類(lèi)型。若前綴是U,則表示無(wú)符號(hào)數(shù)據(jù)類(lèi)型,等等。,4.3. Windows數(shù)據(jù)類(lèi)型,.,程序初始化過(guò)程中調(diào)用CreateWi

21、ndow,為程序創(chuàng)建了一個(gè)窗口,CreateWindow送出WM_CREATE直接給窗口函數(shù),后者可以在此時(shí)做些初始化操作; 在程序運(yùn)行過(guò)程中,不斷以GetMessage從消息隊(duì)列中取得消息。如果這個(gè)消息是WM_QUIT,GetMessage會(huì)得到false的返回值而結(jié)束循環(huán),進(jìn)而結(jié)束整個(gè)程序; DispatchMessage通過(guò)系統(tǒng)USER模塊的協(xié)助與監(jiān)督,把消息分派至窗口函數(shù),消息將被處理; 程序不斷循環(huán); 當(dāng)使用者按下系統(tǒng)菜單中的Close命令時(shí),系統(tǒng)送出WM_CLOSE,通常窗口程序不處理它,由DefWindowProc處理; DefWindowProc處理WM_CLOSE,調(diào)用Des

22、toryWindow把窗口清除,送出WM_DESTORY; 窗口程序?qū)M_DESTORY的處理是調(diào)用PostQuitMessage; PostQuitMessage送出WM_QUIT,于是WinMain的循環(huán)結(jié)束了,整個(gè)應(yīng)用程序也結(jié)束了。,4.4. Windows程序的“生生死死”,.,CreateWindow(),WM_CREATE,GetMessage(),DispatchMessage(WM_CREATE),WndProc(WM_CREATE),用戶程序初始化,啟動(dòng),4.4. Windows程序的“生”,WinMain() 初始化; CreateWindow(); while(GetM

23、essage( ,WndProc(msg) ,switch(msg) case WM_CREATE: 用戶程序初始化 case WM_DESTORY: PostQuitMessage() default: DefWindowProc() ,.,使用者按下關(guān)閉按鈕,WM_CLOSE,GetMessage(),DispatchMessage( WM_CLOSE),WndProc(WM_CLOSE),DefWindowProc(WM_CLOSE),關(guān)閉,WinMain() 初始化; CreateWindow(); while(GetMessage( ,WndProc(msg) ,switch(msg

24、) case WM_CREATE: 用戶程序初始化 case WM_DESTORY: PostQuitMessage() default: DefWindowProc() ,DestoryWindow( ),WM_DESTORY,GetMessage(),DispatchMessage( WM_DESTORY),WndProc(WM_DESTORY),PostQuitMessage(),WM_QIUT,GetMessage()返回為0,while結(jié)束 WinMain結(jié)束,整個(gè)程序結(jié)束,4.4. Windows程序的“死”,.,下面介紹建立基于API的應(yīng)用程序框架的步驟。 (1) 在File下拉

25、菜單中選擇New選項(xiàng),以建立項(xiàng)目文件。 (2) 在彈出的New對(duì)話框中,選擇Projects選項(xiàng)卡,并選擇其中的Win32 Application項(xiàng),在Project Name編輯框中填人所要?jiǎng)?chuàng)建的項(xiàng)目文件名Myapi,然后單擊OK按鈕。 (3) 此時(shí)彈出如后圖所示的界面,選擇其中的An empty project選項(xiàng),說(shuō)明是創(chuàng)建一個(gè)空的項(xiàng)目文件。,5. 實(shí)驗(yàn):利用API開(kāi)發(fā)Win32程序?qū)嵗?.,Win32 Application Step 1 of 1對(duì)話框,5. 利用API開(kāi)發(fā)Win32程序?qū)嵗?.,New Project Information對(duì)話框,5. 利用API開(kāi)發(fā)Win32程序

26、實(shí)例,.,空的Win32應(yīng)用程序框架界面,5. 利用API開(kāi)發(fā)Win32程序?qū)嵗?.,Insert Files into Project對(duì)話框,5. 利用API開(kāi)發(fā)Win32程序?qū)嵗?.,Windows窗口程序的運(yùn)行結(jié)果,5. 利用API開(kāi)發(fā)Win32程序?qū)嵗?.,源程序代碼如下: #include /窗口函數(shù)說(shuō)明 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM); /初始化窗口類(lèi) /WinMain函數(shù)說(shuō)明 int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst, LPSTR lps

27、zCmdLine, int nCmdShow) HWND hwnd ; MSG Msg ; WNDCLASS wndclass ; char lpszClassName = “窗口”; /窗口類(lèi)名 char lpszTitle= My_Windows; /窗口標(biāo)題名,5. 利用API開(kāi)發(fā)Win32程序?qū)嵗?.,wndclass.style = 0; /窗口類(lèi)型為缺省類(lèi)型 wndclass.lpfnWndProc = WndProc ; /窗口處理函數(shù)為WndProc wndclass.cbClsExtra= 0 ; /窗口類(lèi)無(wú)擴(kuò)展 wndclass.cbWndExtra= 0 ; /窗口實(shí)例無(wú)擴(kuò)展 wndclass.hInstance = hInstance ; /當(dāng)前實(shí)例句柄 wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION) ; /窗口的最小化圖標(biāo)為缺省 wndclass.hCursor = LoadCursor( NULL, IDC_ARR

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論