第07章 Windows程序設(shè)計(jì)基礎(chǔ).ppt_第1頁
第07章 Windows程序設(shè)計(jì)基礎(chǔ).ppt_第2頁
第07章 Windows程序設(shè)計(jì)基礎(chǔ).ppt_第3頁
第07章 Windows程序設(shè)計(jì)基礎(chǔ).ppt_第4頁
第07章 Windows程序設(shè)計(jì)基礎(chǔ).ppt_第5頁
已閱讀5頁,還剩80頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Windows程序設(shè)計(jì)基礎(chǔ),第07章,本章主要內(nèi)容,幾個基本概念,窗口 消息驅(qū)動 圖形設(shè)備接口 資源 句柄 API和SDK,1、窗口,對話框中的按鈕、 文本框等也是窗口 它們具有同等地位,2、消息驅(qū)動,消息機(jī)制,消息傳遞 操作系統(tǒng)感知事件,封裝一個消息(描述事件的結(jié)構(gòu)體),投遞到程序的消息隊(duì)列中。 應(yīng)用程序從消息隊(duì)列中取出消息,調(diào)用對應(yīng)的消息處理過程。 消息結(jié)構(gòu) typdef struct tagMSG HWND hWnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG;,消息的標(biāo)識,消息結(jié)構(gòu) typ

2、def struct tagMSG UINT message; MSG; Message成員是標(biāo)識消息的整數(shù),不同的消息數(shù)值不同。 為了便于表達(dá),定義形同WM_XXX的消息宏,如WM_KEYDOWN。,特殊的數(shù)據(jù)類型,3、圖形設(shè)備接口,4、資源,程序的構(gòu)成 程序代碼 UI(用戶接口)資源,對話框、菜單、圖標(biāo)等 資源的描述 資源如圖標(biāo)(.ico)、位圖(.bmp)以二進(jìn)制文件存在;資源描述文件(.rc)描述所有資源。 資源編譯器將所有資源集中生成.res文件,最終的目標(biāo)代碼集成形成.exe文件。 實(shí)現(xiàn)界面和代碼的分離,5、句柄,Windows程序中,窗口和各種資源(圖標(biāo)、菜單、光標(biāo)等)都使用句柄

3、進(jìn)行標(biāo)識。 系統(tǒng)在創(chuàng)建資源時(shí),會為它們分配內(nèi)存并返回句柄以作為標(biāo)識,同種資源的不同實(shí)例標(biāo)識不同。句柄本質(zhì)上就是一個32位無符號整數(shù)值。 假設(shè)屏幕上有10個窗口,Windows將它們編號為110,當(dāng)又創(chuàng)建一個窗口時(shí),將其編號為11。當(dāng)應(yīng)用程序讀到11時(shí),并知道11代表什么,但將11傳遞給Windows后,Windows自然知道是哪個窗口了。,5、API和SDK,API應(yīng)用程序編程接口 Application Programming Interface Windows操作系統(tǒng)提供的編程接口,多數(shù)函數(shù)原型在windows.h中聲明; 1000多個函數(shù),單詞首字母大寫,MSDN SDK軟件開發(fā)包 So

4、ftware Development Kit Win32 SDK:微軟提供的包括API函數(shù)、幫助文檔、輔助工具等構(gòu)成的開發(fā)包。,本章主要內(nèi)容,7.2.1 API程序結(jié)構(gòu),入口函數(shù):WinMain 創(chuàng)建窗口 建立消息循環(huán) 窗口過程函數(shù) 處理各種消息,創(chuàng)建最簡單Windows程序,2 API程序設(shè)計(jì),創(chuàng)建最簡單Windows程序,2 API程序設(shè)計(jì),創(chuàng)建最簡單Windows程序,2 API程序設(shè)計(jì),創(chuàng)建最簡單Windows程序,2 API程序設(shè)計(jì),創(chuàng)建最簡單Windows程序,2 API程序設(shè)計(jì),WinMain入口函數(shù),WinMain原型 int WINAPI WinMain( HINSTANCE

5、 hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow );, 標(biāo)識應(yīng)用程序?qū)?例的句柄 前一個實(shí)例句柄 Win32中恒為0, 傳遞的命令行 參數(shù) 定義窗口的初 始狀態(tài),WINAPI解析,int WINAPI WinMain(); 函數(shù)調(diào)用中,有_stdcall和_cdecl兩種約定,定義參數(shù)入棧次序。 可變參數(shù)函數(shù)如printf遵循_cdecl約定,而Win32 API遵循_stdcall約定,默認(rèn)的編譯選項(xiàng)為_cdecl,在聲明時(shí)需顯示指定_stdcall。 為了保持兼容和便于使用 #define WINAPI

6、_stdcall #define CALLBACK _stdcall,7.2.2 創(chuàng)建窗口,創(chuàng)建窗口工作主要在WinMain中完成 設(shè)計(jì)窗口類 注冊窗口類 創(chuàng)建窗口 顯示窗口,1、設(shè)計(jì)窗口類,窗口類的概念 創(chuàng)建窗口的“模板”,指定將要創(chuàng)建窗口的特征 窗口類通過一個結(jié)構(gòu)體進(jìn)行描述。 typedef struct _WNDCLASS UINT style; WNDPROClpfnWndProc; int cbClsExtra; int cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground;

7、LPCTSTR lpszMenuName; LPCTSTR lpszClassName; WNDCLASS;,常用屬性介紹,style成員 定義窗口的樣式,如CS_NOCLOSE、CS_VREDRAW等 位標(biāo)志,CS_NOCLOSE值為0 x0200,CS_VREDRAW的值為0 x0001,只有1位為1。 組合屬性 style= CS_NOCLOSE|CS_VREDRAW 去除屬性 style #define LRESULT long,2、注冊窗口類,在使用窗口類創(chuàng)建窗口之前,還必須對窗口類進(jìn)行注冊;注冊成功后才能創(chuàng)建窗口。 ATOM RegisterClass( CONST WNDCLAS

8、S *lpWndClass); 函數(shù)的參數(shù)為之前定義的窗口類結(jié)構(gòu)體變量的地址。,3、創(chuàng)建窗口,使用CreateWindow創(chuàng)建窗口 HWND CreateWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName, DWORD dwStyle, int x, int y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu, HANDLE hInstance, LPVOID lpParam );,4、顯示窗口,ShowWindow BOOL ShowWindow( HWND hWnd, int nC

9、mdShow); nCmdShow指定顯示方式 SW_HIDE SW_SHOW SW_SHOWMAXIMIZED SW_SHOWMINIMIZED,5、更新窗口,UpdateWindow BOOL UpdateWindow( HWND hWnd); 工作原理 調(diào)用UpdateWindow后向指定的窗口發(fā)送消息WM_PAINT,通常會在該消息處理過程中刷新窗口的輸出。,7.2.3 建立消息循環(huán),WinMain中,創(chuàng)建并顯示窗口后,要為窗口建立消息循環(huán) 經(jīng)典結(jié)構(gòu) MSG msg; while(GetMessage( ,1、從消息隊(duì)列取消息,GetMessage BOOL GetMessage( L

10、PMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax); 注解 取得的消息保存在lpMsg定義的結(jié)構(gòu)體中; hWnd常設(shè)置為NULL,接收所有消息; 常將最后兩個參數(shù)設(shè)置為0。,while循環(huán),消息循環(huán)的流程 GetMessage收到WM_QUIT消息后,返回0,循環(huán)結(jié)束,整個程序結(jié)束。 收到其它消息,返回非0,繼續(xù)循環(huán); 沒有消息,則放棄執(zhí)行,等待。,2、消息轉(zhuǎn)換,TranslateMessage 按鍵時(shí)通常會產(chǎn)生WM_KEYDOWN、WM_KEYUP等消息,參數(shù)中通常保存的是虛鍵值和掃描碼。通過TranslateMess

11、age,可以合成WM_CHAR消息,參數(shù)中保存了ASCII碼。,3、分發(fā)消息,消息分發(fā)流程 OS感知消息,將消息放到應(yīng)用程序消息隊(duì)列; GetMessage獲取消息; DispatchMessage將消息回傳給OS; OS調(diào)用窗口過程函數(shù)。,1.2.4 窗口過程函數(shù),程序的主要代碼集中在窗口過程函數(shù)中 LRESULT CALLBACK WindowPro( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam ); 要點(diǎn):窗口過程函數(shù)名稱可以隨意,確保窗口類中的lpfnWndProc成員指向該函數(shù)。,典型的窗口過程函數(shù),LRESULT CALLB

12、ACK WindowPro() switch (uMsg) case WM_CLOSE: if(IDYES=MessageBox(hWnd, “是否結(jié)束”, “message”,MB_YESNO) DestroyWindow(hWnd); break; case WM_DESTROY: PostQuitMessage(0); break; case WM_CHAR: default: return DefWindowProc(hWnd,uMsg,wParam,lParam); return 0; ,注解:MessageBox,MessageBox:彈出消息框,4個參數(shù) 參數(shù)1:指定父窗口句柄

13、參數(shù)2:指定消息正文 參數(shù)3:指定消息框標(biāo)題 參數(shù)4:指定消息框中的圖標(biāo)和按鈕 用戶點(diǎn)擊不同按鈕,返回值不同,MSDN,7.2.5 完整的Window程序,1、設(shè)計(jì)窗口類,int WINAPI WinMain() WNDCLASS wndcls; wndcls.cbClsExtra=0; wndcls.cbWndExtra=0; wndcls.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); wndcls.hCursor=LoadCursor(NULL,IDC_CROSS); wndcls.hIcon=LoadIcon(NULL,IDI_ER

14、ROR); wndcls.hInstance=hInstance; wndcls.lpfnWndProc=MyWinProc; wndcls.lpszClassName=xiajb; wndcls.lpszMenuName=NULL; wndcls.style=CS_HREDRAW | CS_VREDRAW; RegisterClass( ,2、創(chuàng)建窗口,int WINAPI WinMain() WNDCLASS wndcls; RegisterClass( ,3、消息循環(huán),int WINAPI WinMain() RegisterClass( ,4、窗口過程,LRESULT CALLBACK

15、 MyWinProc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) switch(uMsg) case WM_CLOSE: if(IDYES=MessageBox(hwnd,“是否真的結(jié)束?”, 確認(rèn)結(jié)束程序,MB_YESNO) DestroyWindow(hwnd); break; case WM_DESTROY: PostQuitMessage(0);break; case default: return DefWindowProc(hwnd,uMsg,wParam,lParam); return 0; ,窗口過程,LRESULT

16、 CALLBACK MyWinProc( HWND hwnd, ) switch(uMsg) case WM_CHAR: char szChar40; sprintf(szChar,ASCII is %d,wParam); MessageBox(hwnd,szChar,“按鍵通知”,0); break; case WM_LBUTTONDOWN: MessageBox(hwnd,mouse clicked,鼠標(biāo)單擊通知,0); HDC hdc; hdc=GetDC(hwnd); TextOut(hdc,0,50,Hello World,strlen(Hello World); ReleaseDC

17、(hwnd,hdc); break; return 0; ,本章主要內(nèi)容,7.3.1 MFC概述,關(guān)于Application FrameWork 應(yīng)用程序框架是一個完整的程序模型,具備標(biāo)準(zhǔn)應(yīng)用程序的基本功能;是一組緊密合作的“類”構(gòu)建起來的大模型。 程序模型是確定的,程序員只是根據(jù)個人需要,進(jìn)行適當(dāng)修改,如改寫虛函數(shù),添加成員函數(shù)。 爭議:軟件創(chuàng)作在Application FrameWord之后逐漸成為工匠技術(shù),程序員們逐漸成為軟件裝配工程的男工和女工。,為什么使用應(yīng)用程序框架,軟件技術(shù)發(fā)展的目標(biāo): 降低軟件編寫難度和復(fù)雜度、加快開發(fā)效率、增強(qiáng)可維護(hù)性、增加可靠性。 三大工具: raw API

18、 Class Library Application FrameWork:MFC、OWL等 使用應(yīng)用程序框架的好處 開發(fā)效率和效益,API編程特點(diǎn),程序主干由WinMain和WndProc兩個函數(shù)構(gòu)成,WinMain是Windows程序的入口函數(shù),通常在該函數(shù)中注冊、創(chuàng)建窗口,建立消息循環(huán)。當(dāng)收到消息后調(diào)用WndProc進(jìn)行處理(由系統(tǒng)實(shí)現(xiàn)的間接調(diào)用)。 在WndProc中,需要針對不同的消息(用戶操作鼠標(biāo)、點(diǎn)擊菜單、按鍵、系統(tǒng)消息等)作出相應(yīng)的處理。 程序員應(yīng)對數(shù)以千計(jì)的Windows API函數(shù),MFC應(yīng)運(yùn)而生,MFC幫助我們將繁多的API整合起來,利用面向?qū)ο笤?,將其邏輯地組織起來,具

19、備封裝、繼承、多態(tài)、模塊化特點(diǎn)。 將API編程中的眾多的“一成不變”的內(nèi)容隱藏在MFC類中,如WinMain、注冊窗口、創(chuàng)建窗口等操作。 使用眾多精妙的宏和消息映射機(jī)制,大大簡化程序員的工作,增強(qiáng)代碼模塊化。 配合集成開發(fā)環(huán)境:AppWizard、ClassWizard、資源編輯器,提高編程效率,AppWizard,VC提供應(yīng)用程序向?qū)ppWizard,能快速生成應(yīng)用程序框架,框架集成了幾個相互作用的類。 MFC已經(jīng)建立了對象與對象之間的關(guān)系,設(shè)定了消息的流動程序。當(dāng)要為應(yīng)用程序設(shè)計(jì)一個應(yīng)用功能時(shí),不必要知道使用者如何按鍵、如何點(diǎn)擊鼠標(biāo),只要注意按鍵之后真正要做的功能即可。 MFC帶來面向?qū)?/p>

20、象程序設(shè)計(jì)的觀念和方法,并使我們能繼承這些優(yōu)秀工程技術(shù)人員的成果來開發(fā)自己所需要的程序。,MFC的學(xué)習(xí)難點(diǎn),API編程模式:程序結(jié)構(gòu)清晰,從WinMain開始,注冊窗口類、創(chuàng)建窗口、建立消息循環(huán)、窗口過程等,程序的流程比較清晰。 MFC程序設(shè)計(jì):高門檻 隱藏(封裝)了程序運(yùn)行的基本過程,不理解 眾多的類及相互關(guān)系 大量的宏及消息映射機(jī)制 框架的約束,7.3.2 AppWizard使用,生成MFC應(yīng)用程序:項(xiàng)目類型,生成MFC應(yīng)用程序:數(shù)據(jù)庫選項(xiàng),生成MFC應(yīng)用程序:OLE選項(xiàng),生成MFC應(yīng)用程序:外觀設(shè)置,設(shè)置基本的外觀選項(xiàng),生成MFC應(yīng)用程序:附加選項(xiàng),一般取默認(rèn)值,生成MFC應(yīng)用程序:變更

21、類名,一般可取默認(rèn)值,效果,3 MFC程序設(shè)計(jì),已經(jīng)初具Windows程序規(guī)模, 具備菜單、工具欄、標(biāo)題欄、 狀態(tài)欄、窗口,構(gòu)成程序的類, 雙擊類名,定 位到類定義處; 雙擊類中的成員 函數(shù)名,定位到 該函數(shù)實(shí)現(xiàn)處,常用的類,CFirstApp:派生自CWinApp,代表整個MFC應(yīng)用程序。 CFirstView:派生自CView,代表屏幕上所看見的窗口,負(fù)責(zé)在顯示設(shè)備上顯示內(nèi)容。 CFirstDoc:派生自CDocument,在該類中添加數(shù)據(jù)成員,以便存儲數(shù)據(jù)。 CMainFrame:派生自CFrameWnd,代表程序框架,用于組織程序界面(菜單、工具欄、視圖窗口) 一般應(yīng)用程序都會派生自己

22、的應(yīng)用程序、視圖、文檔和主框架類,名稱和項(xiàng)目名稱有關(guān)。,本章主要內(nèi)容,7.4.1 消息處理的概念,消息處理是Windows應(yīng)用程序的核心,消息通常由用戶激發(fā)(也可能由操作系統(tǒng)),由操作系統(tǒng)捕獲并分發(fā)到對應(yīng)的程序;程序根據(jù)接收到的消息調(diào)用相應(yīng)的處理過程。 MFC通常為每個消息映射一個消息處理函數(shù),并作為某個類的成員函數(shù)。編寫MFC程序的主要任務(wù):映射消息并編寫消息處理代碼。,一個簡單示例:顯式鼠標(biāo)位置,:視圖類中定義成員變量,:代碼分析,雙擊視圖類CFirstView,切換至視圖類定義中;在視圖類中定義成員變量即可。 認(rèn)識CPoint:MFC提供了許多封裝成類的基本數(shù)據(jù)類型,CPoint是表示坐

23、標(biāo)點(diǎn)的類,含兩個整型數(shù)據(jù)成員x和y。 CPoint m_MousePos;用來記錄鼠標(biāo)移動過程中當(dāng)前坐標(biāo)點(diǎn)。,:初始化成員,:ClassWizard鼠標(biāo)移動消息,:ClassWizard鼠標(biāo)移動消息,雙擊想映射的消息,:添加消息處理代碼,:代碼分析,當(dāng)用戶在客戶區(qū)移動鼠標(biāo)時(shí),系統(tǒng)會不斷捕獲WM_MOUSEMOVE消息,并將消息發(fā)送到應(yīng)用程序。 當(dāng)應(yīng)用程序通過自己的消息循環(huán)檢測到WM_MOUSEMOV消息時(shí),便調(diào)用CFirstView的成員函數(shù)OnMouseMove。系統(tǒng)給該函數(shù)傳遞兩個參數(shù),其中point表示鼠標(biāo)當(dāng)前位置坐標(biāo)。 Invalidate:是從CView繼承來的成員函數(shù),用于刷新整個

24、視圖窗口屏幕,刷新屏幕后會自動調(diào)用OnDraw()成員函數(shù)重新繪制屏幕。,:實(shí)現(xiàn)OnDraw虛函數(shù),雙擊鼠標(biāo)定位到OnDraw函數(shù)體,:函數(shù)代碼,void CFirstView:OnDraw(CDC* pDC) CFirstDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); CString str; str.Format(X位置:%d,m_MousePos.x); pDC-TextOut( m_MousePos.x,m_MousePos.y,str); str.Format(Y位置:%d,m_MousePos.y); pDC-TextOut( m_Mo

25、usePos.x,m_MousePos.y+20,str); ,:代碼分析,機(jī)制:OnDraw是CView類的純虛函數(shù),必須在自己的視圖類CFirstView中實(shí)現(xiàn)該函數(shù)。 系統(tǒng)在視圖窗口中繪圖就是通過間接調(diào)用OnDraw實(shí)現(xiàn)的,這一機(jī)制被隱藏在MFC框架中;要畫圖,在OnDraw中添加具體的繪圖代碼即可。 熟悉CString類:MFC用CString類封裝對字符串的操作,在MFC程序中應(yīng)用廣泛。該類的Format成員可以按指定的格式設(shè)置字符串,類似printf的用法。,:代碼分析,OnDraw函數(shù)中有一個參數(shù)pDC,用來指向設(shè)備環(huán)境類對象,可以指向屏幕輸出設(shè)備,也可以指向打印設(shè)備。 CDC類

26、提供了大量的成員函數(shù),實(shí)現(xiàn)對視圖窗口的繪圖和文本輸出工作。TextOut用于在指定位置輸出字符串。,了解消息映射結(jié)構(gòu),消息映射的目的,將某個消息與某個類的成員函數(shù)關(guān)聯(lián)起來;當(dāng)收到該消息時(shí),便自動調(diào)用與該消息關(guān)聯(lián)的成員函數(shù)。 成員函數(shù)聲明: class CFirstView protected: /AFX_MSG(CFirstView) afx_msg void OnMouseMove(); /AFX_MSG DECLARE_MESSAGE_MAP() ;,表示是消息映射函數(shù) #define afx_msg,了解消息映射結(jié)構(gòu),成員函數(shù)的實(shí)現(xiàn) 消息映射表:在類實(shí)現(xiàn)文件頭部 BEGIN_MESSAG

27、E_MAP(CFirstView, CView) /AFX_MSG_MAP(CFirstView) ON_WM_MOUSEMOVE() /AFX_MSG_MAP / Standard printing commands END_MESSAGE_MAP(),每映射一個消息會出現(xiàn)一個消息映射條目; 不能破壞注釋部分,ClassWizard的使用,選擇正確的類和雙擊所要映射的消息后,自動完成函數(shù)聲明、成員函數(shù)實(shí)現(xiàn)、添加消息映射條目等工作,程序員根據(jù)需要擴(kuò)展修改實(shí)現(xiàn)代碼即可。,小結(jié):MFC編程步驟、特點(diǎn),使用AppWizard生成基本程序框架; 使用資源編輯器設(shè)置或變更界面外觀; 使用ClassWiz

28、ard將需要映射的消息映射到特定的類中; 定位到消息處理成員函數(shù)中,編寫代碼,完成特定的功能。 需要不斷積累:適應(yīng)MFC框架對程序創(chuàng)建、消息傳遞機(jī)制的封裝、簡化;逐步熟悉MFC中常用基本數(shù)據(jù)類型的使用,如CPoint、CString、CRect等;了解MFC類庫的結(jié)構(gòu),熟悉常用基類中所提供的可供我們繼承的方法。,7.4.2 消息介紹,Windows系統(tǒng)中的消息有近兩千種,在編寫程序時(shí),絕大多數(shù)消息并不用映射,一般只映射用戶感興趣的消息;沒有映射的消息由操作系統(tǒng)作默認(rèn)處理。 三大類消息: 標(biāo)準(zhǔn)Windows消息 控件消息:操作對話框中控件時(shí)產(chǎn)生的消息 命令消息:菜單和工具欄按鈕產(chǎn)生的消息,標(biāo)準(zhǔn)Windows消息,除WM_COMMAND外,名稱以WM_打頭的消息都是Wi

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論