版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
現(xiàn)代軟件開(kāi)發(fā)技術(shù)
2023/11/222outlineC++基本概念(2)Windows程序設(shè)計(jì)基本概念(2)MFC類(lèi)庫(kù)層次結(jié)構(gòu)介紹(1)VC++IDE(2)應(yīng)用程序框架(1)實(shí)驗(yàn)一各種控件的應(yīng)用(8)實(shí)驗(yàn)二文字顯示、圖形編程(4)圖像處理與多媒體應(yīng)用(4)實(shí)驗(yàn)三MicrosoftFoundationClass2023/11/223ReferencesVisualC++6.0時(shí)尚編程百例,網(wǎng)冠科技,機(jī)械工業(yè)出版社全面掌握MicrosoftVisualC++6.0MFC應(yīng)用程序開(kāi)發(fā),MicrosoftCorporation,清華大學(xué)出版社VisualC++面向?qū)ο笈c可視化程序設(shè)計(jì),黃維通,清華大學(xué)出版社VC++編程技術(shù)內(nèi)幕,DavidJ.Kruglinskietc,潘愛(ài)民翻譯,清華大學(xué)出版社MFCWindows程序設(shè)計(jì)(第2版)深入解析MFC,GeorgeShepherd深入淺出MFC2/e,侯捷著,華中科技大學(xué)出版社2023/11/224C++編程技術(shù)主要回顧一下在我們課程(VisualC++programming)當(dāng)中用到的一些C++編程技術(shù)。OOP的主要特點(diǎn):封裝性繼承性多態(tài)性2023/11/225類(lèi)的封裝性類(lèi)和對(duì)象的概念對(duì)象:是現(xiàn)實(shí)世界的一個(gè)具體客觀的事物,是其自身所具有的狀態(tài)特征及可以對(duì)這些狀態(tài)施加的操作結(jié)合在一起所構(gòu)成的獨(dú)立實(shí)體;計(jì)算世界中對(duì)象是存儲(chǔ)器(內(nèi)存)中一個(gè)可標(biāo)識(shí)的區(qū)域。類(lèi):類(lèi)是對(duì)一組客觀事物(對(duì)象)的抽象描述;計(jì)算世界中類(lèi)是不同數(shù)據(jù)類(lèi)型的數(shù)據(jù)和處理數(shù)據(jù)的操作(過(guò)程、函數(shù))封裝在一起的融合體2023/11/226類(lèi)的封裝性類(lèi)和對(duì)象的關(guān)系任何對(duì)象都是它所屬類(lèi)的一個(gè)實(shí)例Anyobjectisaninstanceoftheclass IsInstanceOf2023/11/227
現(xiàn)實(shí)問(wèn)題空間面向?qū)ο蠼饪臻g
物質(zhì): 具體事物:小張/小李…的手表
一個(gè)對(duì)象:表的實(shí)例意識(shí): 抽象概念:
表
表類(lèi)
2023/11/228classclsName{public/public/private:Datamember propertyMemberfunction behavior};類(lèi)定義由兩個(gè)文件組成接口文件(*.h):類(lèi)定義部分實(shí)現(xiàn)文件(*.cpp):類(lèi)實(shí)現(xiàn)部分類(lèi)的定義:2023/11/229定義類(lèi)classCounter{longcount;public:
voidSetValue(long);longGetValue();};關(guān)鍵字class引導(dǎo)類(lèi)聲明Counter是類(lèi)標(biāo)識(shí)符類(lèi)體分號(hào)2023/11/2210使用類(lèi)類(lèi)是一個(gè)模板,就象數(shù)據(jù)類(lèi)型一樣,使用的時(shí)候必須定義類(lèi)變量。定義類(lèi)變量稱為類(lèi)的實(shí)例化,類(lèi)的實(shí)例化變量就是對(duì)象。voidmain(){Counterpeople;
longvalue;people.SetValue(0);value=people.GetValue();}對(duì)象是具有某一個(gè)類(lèi)所描述的共性的,但又有各自特性的個(gè)體。2023/11/2211隱含的this指針一個(gè)類(lèi)對(duì)象在內(nèi)存中所占存儲(chǔ)空間是由數(shù)據(jù)成員總和決定的;而成員函數(shù)是程序執(zhí)行的指令,在代碼區(qū),為該類(lèi)的全體對(duì)象所共享,在整個(gè)程序中只有一份copy編譯系統(tǒng)如何知道當(dāng)前的操作是由哪一個(gè)對(duì)象請(qǐng)求的?也就是說(shuō)系統(tǒng)如何對(duì)類(lèi)的成員進(jìn)行識(shí)別的?對(duì)成員函數(shù)自身及成員函數(shù)的調(diào)用進(jìn)行適當(dāng)改造!2023/11/2212編譯器在編譯時(shí)為每一個(gè)成員函數(shù)增加一個(gè)隱含的this指針參數(shù)This指針是一個(gè)隱含于每一個(gè)類(lèi)的成員函數(shù)(包括構(gòu)造函數(shù)和析構(gòu)函數(shù))中的特殊指針,它是用來(lái)指向正在被某個(gè)成員函數(shù)操作的對(duì)象的指針。2023/11/2213ClassdemoThis{Public:voidsetA(inta){thi->a=a;}Private:inta;inti;};voidsetA(inti,demoThis*constthis){this->a=i;}demoThisa1,a2;a1.setA(1); a2.setA(2);setA(1,&A1); setA(2,Aa2);2023/11/2214this指針的其它使用場(chǎng)合當(dāng)方法體內(nèi)部定義的變量(局部變量)和成員變量名字相同時(shí)。當(dāng)方法的入口參數(shù)名和對(duì)象的成員變量名相同時(shí)。當(dāng)要返回目前的對(duì)象指針時(shí)2023/11/2215繼承性概念:從已有的類(lèi)定義新類(lèi),新類(lèi)包含了已有類(lèi)的一些屬性和大部分的行為;實(shí)現(xiàn)代碼共享的手段?;?lèi)和派生類(lèi)在OOP中,通常把具有相同或相似性質(zhì)的類(lèi)抽取出來(lái)成立一個(gè)基類(lèi)/父類(lèi),然后再?gòu)脑摶?lèi)衍生出派生類(lèi)/子類(lèi),使得問(wèn)題描述更加精確并實(shí)現(xiàn)代碼重用。交通工具的分類(lèi)2023/11/2216繼承性C++中實(shí)現(xiàn)繼承ClassderClsName:public/protected/privatebaseClsName{
…};2023/11/22172023/11/2218繼承性privateprivateprivateprivateprivateprotectedprotectedprotectedprivateprotectedpublicpublicprivateprotectedpublic
基類(lèi)派生類(lèi)繼承方式成員的訪問(wèn)屬性2023/11/2219派生類(lèi)和基類(lèi)的關(guān)系派生類(lèi)是基類(lèi)的具體化派生類(lèi)是基類(lèi)定義的延續(xù)IsKindof:Aderivedclassisakindofabaseclass2023/11/2220實(shí)例://Shape.cpp2023/11/2221
多態(tài)性(實(shí)例)#include<iostream.h>ClassB0{public:virtualvoiddisplay(){cout<<“B0::display()”<<endl;}};ClassB1:publicB0{public:voiddisplay(){cout<<“B1::display()”<<endl;}};ClassB2:publicB1{public:voiddisplay(){cout<<“B2::display()”<<endl;}};2023/11/2222
多態(tài)性(實(shí)例)voidmain(){B0b0,*p;B1b1;B2b2;p=&b0;p->display();p=&b1;p->display();p=&b2;p->display();}2023/11/2223
多態(tài)性多態(tài)性是指發(fā)出同樣的消息被不同類(lèi)型的對(duì)象接收時(shí)會(huì)呈現(xiàn)不同的行為。消息在C++中主要是指對(duì)類(lèi)的成員函數(shù)的調(diào)用,不同的行為是指不同的成員函數(shù)實(shí)現(xiàn)。在Windows中消息有著專門(mén)的涵義,在后面會(huì)詳細(xì)分析。2023/11/2224C++中多態(tài)性分為兩種形式:編譯時(shí)的多態(tài)性:函數(shù)重載、運(yùn)算符重載、成員函數(shù)的重新改寫(xiě)(即同名覆蓋)、類(lèi)域機(jī)制。運(yùn)行時(shí)的多態(tài)性:虛函數(shù)實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)性的條件:公有繼承虛函數(shù)(virtual函數(shù)類(lèi)型函數(shù)名(形參表))通過(guò)對(duì)象指針或引用來(lái)調(diào)用C++primer2023/11/2225虛函數(shù)的作用:實(shí)現(xiàn)一般化:通過(guò)“基類(lèi)指針”可以指向它的所有派生類(lèi)對(duì)象,它可以把現(xiàn)在、未來(lái)的情況統(tǒng)統(tǒng)納入考慮。
公有繼承多態(tài)性:在一般化的基礎(chǔ)上,根據(jù)“基類(lèi)指針”所指向的實(shí)際的對(duì)象,調(diào)用不同的實(shí)現(xiàn)版本,體現(xiàn)不同對(duì)象的“個(gè)性”易擴(kuò)展性與易維護(hù)性:很容易增加和刪除一個(gè)類(lèi),但由于多態(tài)性使得用戶代碼不必修改實(shí)現(xiàn)各自的行為。程序更加具有靈活性。2023/11/2226純虛函數(shù):有些函數(shù)根本就不應(yīng)該通過(guò)基類(lèi)來(lái)調(diào)用,即在基類(lèi)中不定義但又必須保留一塊空間(spaceholder)給它,C++提供所謂的純虛函數(shù)(purevirtualfunction):classShape{…public:Virtualvoiddisplay()=0;}此時(shí)Shape類(lèi)就稱為抽象類(lèi)。2023/11/2227虛函數(shù)的實(shí)現(xiàn)機(jī)制:虛函數(shù)采用動(dòng)態(tài)綁定機(jī)制來(lái)實(shí)現(xiàn)多態(tài)性。為了實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編的目的,C++編譯器通過(guò)一個(gè)特定的表格,在程序執(zhí)行時(shí)“間接”地調(diào)用實(shí)際上欲綁定的虛函數(shù),稱這樣的表格為虛函數(shù)表(vtable);2023/11/2228對(duì)每一個(gè)“內(nèi)含虛函數(shù)的類(lèi)”,編譯器都會(huì)為它做出一個(gè)虛函數(shù)表,表中的每一個(gè)元素都指向一個(gè)虛函數(shù)的地址(函數(shù)名與函數(shù)地址的映射(包括基類(lèi)的虛函數(shù)))。當(dāng)對(duì)象執(zhí)行一個(gè)虛函數(shù)時(shí),則系統(tǒng)先會(huì)查這個(gè)虛函數(shù)表(vtable),找到這個(gè)函數(shù)名對(duì)應(yīng)的函數(shù)地址,調(diào)用它。此外,編譯器為了訪問(wèn)虛函數(shù)表中的元素,同時(shí)為該類(lèi)加上一項(xiàng)成員變量,是一個(gè)指向虛函數(shù)表格的指針,稱為虛指針(vptr)。
2023/11/2229ClassA{private:inta,b;public:virtualvoidfun1();virtualvoidfun2();voidfun3();};vptrabvoid(*v_func1)()void(*v_func2)()A::fun1()A::fun2()A::fun3()函數(shù)體虛函數(shù)表vtable虛指針2023/11/2230ClassB:publicA{
…public:virtualvoidfun1();virtualvoidfun2();};vptrabvoid(*v_func1)()void(*v_func2)()B::fun1()B::fun2()A::fun3()函數(shù)體虛函數(shù)表vtable虛指針2023/11/2231類(lèi)的靜態(tài)成員靜態(tài)成員變量:刻劃的是類(lèi)的屬性,不是對(duì)象的屬性。即使一個(gè)對(duì)象也未創(chuàng)建,靜態(tài)數(shù)據(jù)成員也是存在的。靜態(tài)數(shù)據(jù)成員必須初始化,但它的初始化不能放在類(lèi)中,也不能放在constructor中,只能放在類(lèi)定義體外不能在頭文件中初始化,必須在實(shí)現(xiàn)文件的初始化可以看作類(lèi)的一個(gè)全局變量2023/11/2232classSavingAccount{private:charm_name[40];//存戶姓名charm_addr[60];//存戶地址doublem_total;//存款額staticdoublem_rate;//利率
...};doubleSavingAccount::m_rate=0.0198;2023/11/2233靜態(tài)成員函數(shù):刻劃的是類(lèi)的行為。與類(lèi)相聯(lián)系,即使通過(guò)對(duì)象來(lái)調(diào)用,也是利用其所屬類(lèi)。2023/11/2234classSavingAccount{private: ...staticdoublem_rate;//利率public:static
voidsetRate(doublenewRate){m_rate=newRate;} ...};2023/11/2235voidmain(){SavingAccount::setRate(0.0074);//classSavingAccountmyAccount;myAccount.setRate(0.0074); //object}2023/11/2236程序的生與死當(dāng)創(chuàng)建一個(gè)對(duì)象時(shí),C++系統(tǒng)會(huì)自動(dòng)調(diào)用constructor來(lái)為對(duì)象構(gòu)造結(jié)構(gòu)、分配存儲(chǔ)空間和初始化數(shù)據(jù)成員。同樣當(dāng)一個(gè)對(duì)象結(jié)束其生命期時(shí),C++系統(tǒng)自動(dòng)調(diào)用destructor作善后處理工作。在一個(gè)層次結(jié)構(gòu)的類(lèi)群組中,派生類(lèi)對(duì)象創(chuàng)建時(shí)會(huì)引發(fā)所有基類(lèi)構(gòu)造函數(shù)的調(diào)用;同樣當(dāng)結(jié)束其生命期時(shí)又引發(fā)所有基類(lèi)析構(gòu)函數(shù)的調(diào)用。注意此時(shí)構(gòu)造函數(shù)和析構(gòu)函數(shù)的調(diào)用順序。2023/11/2237類(lèi)對(duì)象的誕生與死亡主要是由其存儲(chǔ)類(lèi)別來(lái)決定的。autostaticlocalstaticglobaldynamicWindows程序分“程序代碼”和“UI(UserInterface用戶接口)資源”兩大部分,這兩大部分最后融合為一個(gè)完整的EXE文件。UI資源是指功能菜單、對(duì)話框外貌、程序圖標(biāo)、光標(biāo)形狀等東西一、Windows編程基礎(chǔ)UI資源的實(shí)際內(nèi)容(二進(jìn)制代碼)是借助各種工具產(chǎn)生,并以各種擴(kuò)展名的文件存在的,如.ico、.bmp、.cur等等。程序員必須在一個(gè)所謂的資源描述文件(.rc)中描述它們。RC編譯器讀取RC文件的描述后將所有UI資源文件集中制作出一個(gè).RES文件,再與代碼結(jié)合在一起,生成.EXE文件。一、Windows編程基礎(chǔ)文本編輯器連接器編譯器資源編譯器資源開(kāi)發(fā)工具*.c,*.ccp*.obj*.exe*.res*.rc資源連接器應(yīng)用程序開(kāi)發(fā)過(guò)程一個(gè)32位WindowsSDK程序的開(kāi)發(fā)流采用交互式方法時(shí),可視化開(kāi)發(fā)平臺(tái)給出了許多選用的對(duì)象,程序員可選擇所需對(duì)象并確定其屬性,由此搭建起應(yīng)用程序的“大框架”,并可根據(jù)需要進(jìn)一步編寫(xiě)必要的細(xì)節(jié)代碼段,最后構(gòu)成完整的應(yīng)用程序Windows的程序設(shè)計(jì)語(yǔ)言VCVBVJ都是“面向?qū)ο蟆背绦蛟O(shè)計(jì)開(kāi)發(fā)工具對(duì)象是Windows的規(guī)范部件窗口菜單按鈕對(duì)話框程序模塊編寫(xiě)Windows程序相當(dāng)一部分工作是在創(chuàng)建對(duì)象和為對(duì)象屬性賦值對(duì)象特征:具有規(guī)范形態(tài)和操作模式編程方法傳統(tǒng)編寫(xiě)法-->API交互式方法-->MFCWindows應(yīng)用程序接口
API:ApplicationProgrammingInterfaceAPI
是由Windows操作系統(tǒng)提供的函數(shù)定義、參數(shù)定義和消息格式的集合。可供應(yīng)用程序使用。API函數(shù)的功能為應(yīng)用程序提供Windows系統(tǒng)特殊函數(shù)及數(shù)據(jù)結(jié)構(gòu)APIWin應(yīng)用程序可以利用標(biāo)準(zhǔn)大量API函數(shù)調(diào)用系統(tǒng)功能是Win系統(tǒng)與Win應(yīng)用程序間的標(biāo)準(zhǔn)程序接口窗口管理函數(shù)實(shí)現(xiàn)窗口的創(chuàng)建、移動(dòng)和修改功能系統(tǒng)服務(wù)函數(shù):實(shí)現(xiàn)與操作系統(tǒng)有關(guān)的多種功能圖形設(shè)備(GDI)函數(shù):實(shí)現(xiàn)與設(shè)備無(wú)關(guān)的圖形操作功能利用WindowsAPI函數(shù)編寫(xiě)Windows應(yīng)用程序必須首先了解以下內(nèi)容:(1)窗口的概念(2)事件驅(qū)動(dòng)的概念(3)句柄(4)消息
一個(gè)應(yīng)用程序的窗口一般包含下列組成部分:窗口邊界工作區(qū)控制菜單框下拉菜單水平滾動(dòng)條垂直滾動(dòng)條最大化按鈕最小化按鈕標(biāo)題欄1.窗口編寫(xiě)一個(gè)Windows應(yīng)用程序首先應(yīng)創(chuàng)建一個(gè)或多個(gè)窗口,隨后應(yīng)用程序的運(yùn)行過(guò)程即是窗口內(nèi)部、窗口與窗口之間、窗口與系統(tǒng)之間進(jìn)行數(shù)據(jù)處理與數(shù)據(jù)交換的過(guò)程。應(yīng)用程序與用戶之間交互的接口環(huán)境系統(tǒng)管理應(yīng)用程序的基本單位Win應(yīng)用程序基本的操作單元窗口通常每個(gè)Windows應(yīng)用程序至少對(duì)應(yīng)一個(gè)窗口,每個(gè)窗口都要有一個(gè)窗口函數(shù)負(fù)責(zé)處理該窗口內(nèi)所發(fā)生的事件。2.事件驅(qū)動(dòng)事件是對(duì)計(jì)算機(jī)操作的動(dòng)作(通常把用戶通過(guò)鼠標(biāo)或鍵盤(pán)的一次輸入稱作一個(gè)事件)。每個(gè)事件對(duì)應(yīng)一個(gè)消息,即每個(gè)事件發(fā)生的效果是產(chǎn)生消息(如WM_CLOSE)。2.事件驅(qū)動(dòng)事件(消息)驅(qū)動(dòng)體系Windows編程方式屬于以消息為基礎(chǔ)的事件驅(qū)動(dòng)。(程序的工作是產(chǎn)生消息,傳遞消息和處理消息)。Dos編程方式屬于過(guò)程驅(qū)動(dòng)。過(guò)程1開(kāi)始過(guò)程2...過(guò)程n結(jié)束過(guò)程驅(qū)動(dòng)編程模型消息處理事件1事件2事件3…...事件n開(kāi)始結(jié)束事件驅(qū)動(dòng)編程模型
Windows程序的本體與操作系統(tǒng)之間的關(guān)系消息驅(qū)動(dòng)模型常用句柄類(lèi)型及其說(shuō)明句柄是一個(gè)4字節(jié)長(zhǎng)的數(shù)值,用于標(biāo)識(shí)應(yīng)用程序中不同的對(duì)象。窗口按鈕圖標(biāo)滾動(dòng)條輸出設(shè)備控制文件應(yīng)用程序通過(guò)句柄訪問(wèn)相應(yīng)的對(duì)象信息HWND 窗口句柄 HDC 設(shè)備環(huán)境句柄HBITMAP 位圖句柄 HCURSOR 光標(biāo)句柄HICON 圖標(biāo)句柄 HFONT 字體句柄HMENU 菜單句柄 HPEN 畫(huà)筆句柄HFILE 文件句柄 HBRUSH 畫(huà)刷句柄 HINSTANCE 當(dāng)前實(shí)例句柄3.句柄Handle,對(duì)象的ID消息消息的功能:Windows應(yīng)用程序利用Windows消息(Message)與應(yīng)用程序及系統(tǒng)進(jìn)行信息交換消息的表示消息本身內(nèi)容UINTmessage32位無(wú)符號(hào)整數(shù)附加信息WPARAMwParamLPARAMlParam消息的定義typedefstructtagMSG{HWNDhwnd;//窗口句柄,其作用是:Identifiesthe//windowwhosewindowprocedure//receivesthemessage.UINTmessage;//消息標(biāo)識(shí),由Windows.h頭文件中的宏定義來(lái)標(biāo)識(shí)
WPARAMwParam;//包含有關(guān)消息的附加信息,不同消息其值有所不同
LPARAMlParam;//附加
DWORDtime;//指定消息送至隊(duì)列的時(shí)間
POINTpt;//指定消息發(fā)送時(shí)屏幕光標(biāo)的位置,其數(shù)據(jù)類(lèi)型POINT也是一個(gè)結(jié)構(gòu)體}MSG;
//…\vc\include\wtypes.htypedefstructtagPOINT{LONGx;
LONGy;}POINT;HWND
UINT:unsignedintDWORD:unsignedlong
WPARAM:typedef
UINT
WPARAM;LPARAM:typedef
LONG
LPARAM;消息號(hào):由事先定義好的消息名標(biāo)識(shí)字參數(shù)(wParam):用于提供消息的附加信息長(zhǎng)字參數(shù)(lParam):用于提供消息的附加信息消息附加信息與具體消息號(hào)的值有關(guān),在Win中消息用結(jié)構(gòu)體MSG表示消息的種類(lèi)…vc\include\winuser.h標(biāo)準(zhǔn)Windows消息除WM_COMMAND外,所有以WM_為前綴的消息,由窗口和視圖處理??刂葡⒂煽丶妥哟翱诎l(fā)給父窗口的消息。命令消息來(lái)自用戶接口對(duì)象。如:菜單、工具條和加速鍵等。輸入消息:包括鍵盤(pán)和鼠標(biāo)的輸入。控制消息:用來(lái)與Windows的控制對(duì)象,如列表框、按鈕、檢查框等進(jìn)行雙向通信。系統(tǒng)消息:對(duì)程序化的事件或系統(tǒng)時(shí)鐘中斷作出反應(yīng)。用戶消息:這是程序員自己定義并在應(yīng)用程序中主動(dòng)發(fā)出的,一般由應(yīng)用程序的某一部分內(nèi)部處理。消息種類(lèi)消息的產(chǎn)生
用戶產(chǎn)生消息
Windows本身產(chǎn)生消息應(yīng)用程序本身產(chǎn)生消息其他應(yīng)用程序產(chǎn)生消息消息的傳遞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)行處理。事件事件事件系統(tǒng)消息隊(duì)列應(yīng)用程序隊(duì)列應(yīng)用程序隊(duì)列應(yīng)用程序隊(duì)列應(yīng)用程序應(yīng)用程序應(yīng)用程序消息的處理每個(gè)窗口對(duì)應(yīng)一個(gè)窗口函數(shù),負(fù)責(zé)處理該窗口的所有消息.窗口函數(shù)具有4個(gè)參數(shù):HWND型窗口句柄UINT型消息內(nèi)容WPARAM型附加信息LPARAM型附加信息1Param高字節(jié)包含當(dāng)前光標(biāo)的Y坐標(biāo)值低字節(jié)包含當(dāng)前光標(biāo)的X坐標(biāo)值wParam:包含一整數(shù)值以標(biāo)識(shí)鼠標(biāo)鍵的按下?tīng)顟B(tài)MK_LBUTTON 按下鼠標(biāo)左鍵MK_MBUTTON 按下鼠標(biāo)中鍵MK_RBUTTON 按下鼠標(biāo)右鍵MK_CONTROL按下了CTRL鍵MK_SHIFT:TheSHIFTkeyisdown.二、Windows應(yīng)用程序常用消息
1.WM_LBUTTONDOWN:產(chǎn)生單擊鼠標(biāo)左鍵的消息
此外,相似的消息還有: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)生。
系統(tǒng)鍵是指實(shí)現(xiàn)系統(tǒng)操作的組合鍵,例如Alt與某個(gè)功能鍵的組合以實(shí)現(xiàn)系統(tǒng)菜單操作等。wParam為按鍵的ASCII碼1Param與WM_KEYDOWN的相同wParam:按下鍵的虛擬鍵碼,用以標(biāo)識(shí)按下或釋放的鍵1Param:記錄了按鍵的重復(fù)次數(shù)、掃描碼、轉(zhuǎn)移代碼、先前鍵的狀態(tài)等信息。相似的消息還有WM_KEYUP,在放開(kāi)系統(tǒng)鍵時(shí)產(chǎn)生如F1的虛擬鍵碼在Windows.h文件中定義為VK_F12.WM_KEYDOWN:按下一個(gè)系統(tǒng)鍵時(shí)產(chǎn)生的消息
3.WM_CHAR:按下一個(gè)非系統(tǒng)鍵時(shí)產(chǎn)生的消息
wParam:未用1Param:包含一個(gè)指向CREATESTRUCT數(shù)據(jù)結(jié)構(gòu)的指針wParam和1Param均未用。wParam和1Param均未用。4.WM_CREATE:由CreateWindow函數(shù)發(fā)出的消息
5.WM_CLOSE:關(guān)閉窗口時(shí)產(chǎn)生的消息
6.WM_DESTROY:由DestroyWindow函數(shù)發(fā)出的消息用戶區(qū)移動(dòng)或顯示用戶窗口改變大小程序通過(guò)滾動(dòng)條滾動(dòng)窗口下拉式菜單關(guān)閉并需要恢復(fù)被覆蓋的部分Windows清除對(duì)話框等對(duì)象,并需要恢復(fù)被覆蓋的部分均產(chǎn)生WM_PAINT消息7.WM_QUIT:由PostQuitMessage函數(shù)發(fā)出的消息
退出應(yīng)用程序時(shí)發(fā)出的消息
wParam:含退出代碼,標(biāo)識(shí)程序退出運(yùn)行時(shí)的有關(guān)信息
1Param:未用
8.WM_PAINT
VC中存在幾種系統(tǒng)定義的消息分類(lèi),不同的前綴符號(hào)經(jīng)常用于消息宏識(shí)別消息附屬的分類(lèi),系統(tǒng)定義的消息宏前綴如下:BM 表示按鈕控制消息CB 表示組合框控制消息DM 表示默認(rèn)下壓式按鈕控制消息EM 表示編輯控制消息LB 表示列表框控制消息SBM 表示滾動(dòng)條控制消息WM 表示窗口消息窗口管理消息初始化消息輸入消息系統(tǒng)消息剪貼板消息控制處理消息控制通知消息滾動(dòng)條通知消息非用戶區(qū)消息MDI消息DDE消息應(yīng)用程序自定義的消息Windows編程常用消息啟動(dòng)輸入姓名輸入第一次測(cè)試成績(jī)輸入第二次測(cè)試成績(jī)輸入第三次測(cè)試成績(jī)計(jì)算平均成績(jī)結(jié)束過(guò)程驅(qū)動(dòng)方法計(jì)算平均成績(jī)啟動(dòng)消息處理結(jié)束輸入姓名輸入第一次成績(jī)輸入第二次成績(jī)輸入第三次成績(jī)計(jì)算平均成績(jī)事件驅(qū)動(dòng)方法計(jì)算平均成績(jī)?nèi)?、Windows中的事件驅(qū)動(dòng)程序設(shè)計(jì)四.Windows應(yīng)用程序結(jié)構(gòu)至少包含兩個(gè)函數(shù):WinMain():必有且僅有一個(gè)。窗口函數(shù):每個(gè)窗口對(duì)應(yīng)一個(gè)窗口函數(shù),以響應(yīng)該窗口的消息。入口函數(shù)WinMain窗口函數(shù)WndProcWindows應(yīng)用程序構(gòu)成基本框架包含各種數(shù)據(jù)類(lèi)型、數(shù)據(jù)結(jié)構(gòu)與函數(shù)等WinMain和WndProc是Windows應(yīng)用程序的主體(1)所有應(yīng)用程序的入口,類(lèi)似Main函數(shù),(2)完成一系列的定義和初始化,并產(chǎn)生消息循環(huán)Main是一般C程序的進(jìn)入點(diǎn),而WinMain則是Windows程序的進(jìn)入點(diǎn)#include<windows.h>int
WINAPI
WinMain(HINSTANCE
hInstance,HINSTANCE
hPrevInstance,PSTR
szCmdLine,int
iCmdShow){
MessageBox(NULL,TEXT("Hello,Windows98!"),
TEXT("HelloMsg"),0);
return0;}WinMain()函數(shù)的原型intWINAPIWinMain(HINSTANCEhThisInst,//當(dāng)前實(shí)例HINSTANCEhPrevInst,//前一個(gè)實(shí)例PSTRpszCmdLine,//指向命令行指針intnCmdShow)//顯示方式WinMain()參數(shù)說(shuō)明WinMain的第一個(gè)參數(shù)被稱作「實(shí)例句柄」。在Windows程序設(shè)計(jì)中,句柄僅是一個(gè)應(yīng)用程序用來(lái)識(shí)別某些東西的數(shù)字。在這種情況下,該句柄唯一地標(biāo)識(shí)該程序,還需要它在其他Windows函數(shù)調(diào)用中作為參數(shù)。WinMain()參數(shù)說(shuō)明在Windows的早期版本中,當(dāng)同時(shí)運(yùn)行同一程序多次時(shí),您便創(chuàng)建了該程序的「多個(gè)實(shí)例(multipleinstances)」。同一應(yīng)用程序的所有實(shí)例共用程序和只讀的內(nèi)存(通常是例如菜單和對(duì)話框模板的資源)。程序通過(guò)檢查hPrevInstance參數(shù)就能夠確定自身的其他實(shí)例是否正在運(yùn)行。然后它可以略過(guò)一些繁雜的工作并從前面的實(shí)例將某些數(shù)據(jù)移到自己的數(shù)據(jù)區(qū)域。WinMain()參數(shù)說(shuō)明在32位Windows版本中,該概念已被拋棄。傳給WinMain的第二個(gè)參數(shù)總是NULL(定義為0)。WinMain的第三個(gè)參數(shù)是用于運(yùn)行程序的命令列。某些Windows應(yīng)用程序利用它在程序啟動(dòng)時(shí)將文件載入內(nèi)存。WinMain的第四個(gè)參數(shù)指出程序最初顯示的方式,可以是正常的或者是最大化地充滿整個(gè)畫(huà)面,或者是最小化顯示在任務(wù)欄中。我們將在第三章中介紹使用該參數(shù)的方法。WinMain()函數(shù)需完成的功能定義窗口類(lèi)注冊(cè)窗口類(lèi)建立窗口類(lèi)的窗口顯示窗口運(yùn)行消息循環(huán)并根據(jù)接受的消息調(diào)用相應(yīng)的處理過(guò)程初始化(一)WinMain函數(shù)三個(gè)基本的組成部分:函數(shù)說(shuō)明、初始化和消息循環(huán)功能注冊(cè)窗口類(lèi),建立窗口及執(zhí)行必要的初始化進(jìn)入消息循環(huán),根據(jù)接受的消息調(diào)用相應(yīng)的處理過(guò)程當(dāng)消息循環(huán)檢索到WM_QUIT時(shí)終止程序運(yùn)行WinMain函數(shù)WinMain函數(shù)說(shuō)明WinMain函數(shù)的說(shuō)明如下:intWINAPIWinMain(
HINSTANCEhThisInst, ∥應(yīng)用程序當(dāng)前實(shí)例句柄
HINSTANCehPrevInst, ∥應(yīng)用程序其他實(shí)例句柄
LPSTRlpszCmdLine, ∥指向程序命令行參數(shù)的指針
IntnCmdShow ∥應(yīng)用程序開(kāi)始執(zhí)行時(shí)窗口顯示方式的整數(shù)值標(biāo)識(shí))1.初始化i.窗口類(lèi)定義
通過(guò)給窗口類(lèi)數(shù)據(jù)結(jié)構(gòu)WNDCLASS賦值完成,該數(shù)據(jù)結(jié)構(gòu)中包含窗口類(lèi)的各種屬性。初始化顯示窗口創(chuàng)建窗口實(shí)例窗口類(lèi)的注冊(cè):窗口類(lèi)必須先注冊(cè)后使用窗口類(lèi)的定義:定義窗口的形式與功能LoadIconLoadCursorGetStockObjectRegisterClassCreateWindowShowWindow,UpdateWindowtypedefstruct_WNDCLASS{UINTstyle;WNDPROClpfnWndProc; //指向窗口函數(shù)的指針intcbClsExtra;intcbWndExtra;HANDLEhInstance;HICONhIcon;HCURSORhCursor;HBRUSHhbrBackground;LPCTSTRlpszMenuName;LPCTSTRlpszClassName; //窗口類(lèi)名}WNDCLASS;//詳細(xì)信息查看msdn文檔LoadIcon的作用是在應(yīng)用程序中加載一個(gè)窗口圖標(biāo),其原型為:HICONLoadIcon(HINSTANCEhInstance,LPCTSTRlpIconName)圖標(biāo)資源名或系統(tǒng)預(yù)定義圖標(biāo)標(biāo)識(shí)名圖標(biāo)資源所在的模塊句柄,NULL則使用系統(tǒng)預(yù)定義圖標(biāo)窗口類(lèi)定義常用函數(shù):LoadCursor的作用是在應(yīng)用程序中加載一個(gè)窗口光標(biāo)HCURSORLoadCursor(HINSTANCEhInstance, LPCTSTRlpCursorName)光標(biāo)資源所在的模塊句柄,NULL則使用系統(tǒng)預(yù)定義光標(biāo)光標(biāo)資源名或系統(tǒng)預(yù)定義光標(biāo)標(biāo)識(shí)名應(yīng)用程序調(diào)用函數(shù)GetStockObject獲取系統(tǒng)提供的背景刷HBRUSHGetStockObject(intnBrush);ii.注冊(cè)窗口類(lèi)Win系統(tǒng)本身提供部分預(yù)定義的窗口類(lèi),程序員也可以自定義窗口類(lèi),窗口類(lèi)必須先注冊(cè)后使用。窗口類(lèi)的注冊(cè)由函數(shù)RegisterClass()實(shí)現(xiàn)。
RegisterClass(&wndclass);//wndclass為窗口類(lèi)結(jié)構(gòu)
RegisterClass函數(shù)的返回為布爾值,注冊(cè)成功則返回真iii.創(chuàng)建窗口實(shí)例創(chuàng)建一個(gè)窗口類(lèi)的實(shí)例由函數(shù)CreateWindow()實(shí)現(xiàn),其原型如下:HWNDCreateWindow(LPCTSTRlpszClassName,∥窗口類(lèi)名
LPCTSTRlpszTitle, ∥窗口標(biāo)題名
DWORDdwStyle, ∥創(chuàng)建窗口的樣式
intx,y, ∥窗口左上角坐標(biāo)
intnWidth,nHeight, ∥窗口寬度和度高
HWNDhwndParent, ∥該窗口的父窗口句柄
HWENUhMenu, ∥窗口主菜單句柄
HINSTANCEhInstance,∥創(chuàng)建窗口的應(yīng)用程序當(dāng)前句柄
LPVOIDlpParam∥指向一個(gè)傳遞給窗口的參數(shù)值的指針
)iv顯示窗口窗口類(lèi)的顯示由ShowWindow和UpdateWindow函數(shù)實(shí)現(xiàn)。應(yīng)用程序調(diào)用ShowWindow函數(shù)在屏幕上顯示窗口ShowWindow(hwnd,nCmdshow);//nCmdshow為窗口顯示形式標(biāo)識(shí)iv顯示窗口顯示窗口后,應(yīng)用程序調(diào)用UpdateWindow更新并繪制用戶區(qū),并發(fā)出WM_PAINT消息。UpdateWindow(hwnd);2.消息循環(huán)將消息傳遞給窗口函數(shù)的相應(yīng)過(guò)程處理消息隊(duì)列Windows將產(chǎn)生的消息WinMain函數(shù)消息循環(huán)的常見(jiàn)格式如下:MSGMsg;…while(GetMessage(&Msg,NULL,0,0)){TranslateMessage(&Msg);DispatchMessage(&Msg);}將消息傳送到指定窗口函數(shù)2.消息循環(huán)將消息的虛擬鍵轉(zhuǎn)換為字符信息
從消息隊(duì)列中讀取一條消息,并將消息放在MSG結(jié)構(gòu)中GetMessage函數(shù)原型為:BOOLGetMessage
(lpMSG, //指向MSG結(jié)構(gòu)的指針
hwnd,nMsgFilteMin,//用于消息過(guò)濾的最小消息號(hào)值
nMsgFilterMax//用于消息過(guò)濾的最大消息號(hào)值)2.消息循環(huán)返回零值,即檢索到WM_QUIT消息,程序結(jié)束循環(huán)并退出WndProc函數(shù)由一個(gè)或多個(gè)switch語(yǔ)句組成。每一條case語(yǔ)句對(duì)應(yīng)一種消息,當(dāng)應(yīng)用程序接收到一個(gè)消息時(shí),相應(yīng)的case語(yǔ)句被激活并執(zhí)行相應(yīng)的響應(yīng)程序模塊。WndProc:包含了對(duì)各種可能接收到的消息的處理過(guò)程定義了應(yīng)用程序?qū)邮盏降牟煌⒌捻憫?yīng)(二)窗口函數(shù)WndProc窗口函數(shù)的一般形式如下:LRESULTCALLBACKWndProc( HWNDhwnd, UINTmessgae, WPARAMwParam,LPARAMlParam){…switch(message) ∥message為標(biāo)識(shí)的消息
{case…
…break;
…caseWM_DESTROY:PostQuitMessage(0);default:returnDefWindowProc(hwnd,message,wParam,lParam);}return(0);}為未定義處理過(guò)程的消息提供默認(rèn)的處理
在消息處理程序段中一般都有對(duì)WM_DESTROY的處理,該消息是關(guān)閉窗口時(shí)發(fā)出的。它向應(yīng)用程序發(fā)出WM_QUIT消息,請(qǐng)求退出處理函數(shù):
voidPostQuitMessage(intnExitCode)//nExitCode為應(yīng)用程序的退出代碼CALLBACK是一種函數(shù)調(diào)用的格式,稱為“回調(diào)函數(shù)”;意思是指“在你的程序中,被Windows系統(tǒng)調(diào)用的函數(shù)”,即此函數(shù)雖然有你設(shè)計(jì),但是永遠(yuǎn)不會(huì)也不應(yīng)該被你調(diào)用,它們是為Windows系統(tǒng)準(zhǔn)備的。
在Windows.h中定義了Windows應(yīng)用程序中包含種類(lèi)繁多的數(shù)據(jù)類(lèi)型(三)數(shù)據(jù)類(lèi)型MSG:包含一個(gè)消息的全部信息,是消息發(fā)送的格式WINDCLASS:包含一個(gè)窗口類(lèi)的全部信息及屬性POINT:定義了屏幕上或窗口中的一個(gè)點(diǎn)的X
和Y坐標(biāo)RECT:定義了一個(gè)矩形區(qū)域及其左上角和右下角的坐標(biāo)幾種重要的結(jié)構(gòu)(四)一些重要的數(shù)據(jù)結(jié)構(gòu)創(chuàng)建應(yīng)用程序框架。本例的目的在于說(shuō)明創(chuàng)建Windows應(yīng)用程序的方法及過(guò)程#include<windows.h> //包含應(yīng)用程序中所需的數(shù)據(jù)類(lèi)型和數(shù)據(jù)結(jié)構(gòu)的定義LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函數(shù)說(shuō)明//以下初始化窗口類(lèi)intWINAPIWinMain(HINSTANCEhInstance, HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow){HWNDhwnd;MSGMsg;WNDCLASSwndclass;charlpszClassName[]="窗口"; //窗口類(lèi)名
charlpszTitle[]="My_Windows"; //窗口標(biāo)題名五、應(yīng)用程序舉例
//窗口類(lèi)的定義wndclass.style=0; //窗口類(lèi)型為默認(rèn)類(lèi)型wndclass.lpfnWndProc=WndProc; //定義窗口處理函數(shù)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)為默認(rèn)圖標(biāo)wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); //窗口采用箭頭光標(biāo)wndclass.hbrBackground=GetStockObject(WHITE_BRUSH); //窗口背景為白色wndclass.lpszMenuName=NULL; //窗口中無(wú)菜單wndclass.lpszClassName=lpszClassName; //窗口類(lèi)名為“窗口”}
//以下進(jìn)行窗口類(lèi)的注冊(cè)--if(!RegisterClass(&wndclass))//注冊(cè)失敗則發(fā)出警告
{
MessageBeep(0);
returnFALSE;
}//創(chuàng)建窗口hwnd=CreateWindow ( lpszClassName, //窗口類(lèi)名
lpszTitle, //窗口實(shí)例的標(biāo)題名
WS_OVERLAPPEDWINDOW, //窗口的風(fēng)格
CW_USEDEFAULT, CW_USEDEFAULT, //窗口左上角坐標(biāo)為默認(rèn)值
CW_USEDEFAULT, CW_USEDEFAULT,, //窗口的高和寬為默認(rèn)值
NULL, //此窗口無(wú)父窗口
NULL, //此窗口無(wú)主菜單
hInstance, //創(chuàng)建此窗口的應(yīng)用程序的當(dāng)前句柄
NULL //不使用該值
);//顯示窗口ShowWindow(hwnd,nCmdShow);//繪制用戶區(qū)UpdateWindow(hwnd);//消息循環(huán)
while(GetMessage(&Msg,NULL,0,0)) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}returnMsg.wParam; //消息循環(huán)結(jié)束即程序終止時(shí)將信息返回系統(tǒng)}103/窗口函數(shù)LRESULTCALLBACKWndProc ( HWNDhwnd, UINTmessage, WPARAMwParam, LPARAMlParam ){switch(message){caseWM_DESTROY: PostQuitMessage(0); default: //默認(rèn)時(shí)采用系統(tǒng)消息默認(rèn)處理函數(shù)
returnDefWindowProc(hwnd,message,wParam,lParam);}return(0);}調(diào)用PostQuitMessage發(fā)出WM_QUIT消息104參考書(shū)推薦1.Windows程序設(shè)計(jì)(第5版)(上、下冊(cè))原書(shū)名:ProgrammingWindows(FifthEdition)原出版社:MicrosoftPress作者:(美)CharlesPetzold譯者:北京博彥科技發(fā)展有限責(zé)任公司出版社:北京大學(xué)出版社頁(yè)碼:1376105參考書(shū)推薦2.Windows核心編程原書(shū)名:ProgrammingApplicationsforMicrosoftWindowsFourthEdition
原出版社:MicrosoftPress作者:(美)JeffreyRichter譯者:王建華等出版社:機(jī)械工業(yè)出版社出版日期:2000-05頁(yè)碼:6892023/11/22106應(yīng)用程序框架ApplicationFramework是一組凝聚性強(qiáng)、組織化強(qiáng)的類(lèi)庫(kù)的集合,框架中的類(lèi)對(duì)象彼此間藉消息的流動(dòng)而溝通,并相互調(diào)用對(duì)方的函數(shù)以求完成特定的任務(wù).PC世界里推出了三套C++ApplicationFramework:MS:MFC(MicrosoftFoundationClass)VCBorland:OWL(ObjectWindowsLibrary)C++BuilderIBM:OpenClassLibraryVisaulAgeC++2023/11/22107應(yīng)用程序框架其它C++編譯器廠商如:Watcom、Symantec、Metaware等只供應(yīng)集成開(kāi)發(fā)環(huán)境(IDE),所采用的ApplicationFramework是MFCMFC1.0&MSC/C++7.0應(yīng)用程序中非圖形部分的類(lèi)GUI功能的Windows相關(guān)類(lèi)MFC2.0&MSVC++1.0在1.0基礎(chǔ)上增添了一些應(yīng)用程序MFC3.0&VC++2.0增添了對(duì)開(kāi)發(fā)32位應(yīng)用程序的支持MFC2.0&MSVC++1.5添加了ODBC類(lèi),并且還支持OLE的性能MFC4.0包含了在Win95和NT中大多數(shù)新的公共控件和DAO、MAPI增強(qiáng)了對(duì)數(shù)據(jù)庫(kù)應(yīng)用程序的支持利用DAO類(lèi)通過(guò)編程語(yǔ)言來(lái)訪問(wèn)、操縱和管理數(shù)據(jù)庫(kù)對(duì)Internet也提供了強(qiáng)有力的支持MFC4.21MFC概述MFC還很好地保持了程序的向下兼容性是用來(lái)編寫(xiě)Windows應(yīng)用程序的C++類(lèi)集以層次結(jié)構(gòu)組織封裝了大部分API函數(shù)提供了圖形環(huán)境下應(yīng)用程序的框架提供了創(chuàng)建應(yīng)用程序的組件提供了大量的基類(lèi)供程序員根據(jù)不同的應(yīng)用環(huán)境進(jìn)行擴(kuò)充允許在編程過(guò)程中自定義和擴(kuò)展應(yīng)用程序中的類(lèi)較好的移植性,可移植于眾多的平臺(tái)MFC2023/11/22110縱覽MFCMFC分為下列幾大群組:GeneralpurposeclassesWindowsAPIclassesApplicationframeworkclassesHighlevelabstractionsOperatingsystemextensions
MFC類(lèi)的組織結(jié)構(gòu)根類(lèi):CObjectMFC中多數(shù)類(lèi)和用戶自定義子類(lèi)的根類(lèi),是抽象基類(lèi)。它提供了許多編程所需的公共操作。對(duì)象的建立對(duì)象的刪除運(yùn)行時(shí)信息對(duì)象診斷輸出串行化支持應(yīng)用程序和線程支持類(lèi)命令相關(guān)類(lèi)文檔類(lèi)文檔模板類(lèi)視類(lèi)(體系結(jié)構(gòu))框架窗口(體系結(jié)構(gòu))應(yīng)用程序體系結(jié)構(gòu)類(lèi)窗口、對(duì)話框和控件類(lèi)框架窗口類(lèi)(窗口)視類(lèi)(窗口)對(duì)話框類(lèi)控件條類(lèi)繪圖和打印類(lèi)輸出(設(shè)備相關(guān))類(lèi)繪圖工具類(lèi)簡(jiǎn)單數(shù)據(jù)類(lèi)型類(lèi)MFC類(lèi)的組織結(jié)構(gòu)文件和數(shù)據(jù)庫(kù)類(lèi)文件I/O類(lèi)DAO類(lèi)ODBC類(lèi)Internet和網(wǎng)絡(luò)工作類(lèi)ISAPI類(lèi)WindowsSocket類(lèi)Win32Internet類(lèi)OLE類(lèi)OLE容器類(lèi)OLE服務(wù)器類(lèi)OLE拖放和數(shù)據(jù)傳輸類(lèi)OLE普通對(duì)話框類(lèi)OLE動(dòng)畫(huà)類(lèi)OLE動(dòng)畫(huà)類(lèi)OLE控件類(lèi)活動(dòng)文檔類(lèi)其他文檔類(lèi)調(diào)試和異常類(lèi)調(diào)試支持類(lèi)異常類(lèi)數(shù)組、列表和映射類(lèi)數(shù)組類(lèi)列表類(lèi)映射類(lèi)2023/11/22114Generalpurposeclasses根類(lèi):CObject數(shù)據(jù)處理類(lèi):包括數(shù)組、列表和映象類(lèi)文件類(lèi):CFile簡(jiǎn)單獨(dú)立數(shù)據(jù)類(lèi)型類(lèi):CRect,CSize,CPoint,CTime,CTimeSpan,CString調(diào)試和異常處理類(lèi):CDumptextCExceptions2023/11/22115WindowsAPIclasses這些類(lèi)對(duì)應(yīng)著各個(gè)WindowsAPI函數(shù)CWinthread:代表MFC程序中一個(gè)線程CWinapp:代表你的整個(gè)MFC程序CWnd:所有窗口,處理Windows消息CCmdTarget:CWnd父類(lèi),處理命令消息繪圖和打印類(lèi):GDIDCMenu2023/11/22116Applicationframeworkclasses應(yīng)用程序體系結(jié)構(gòu)類(lèi):即所謂Document/View結(jié)構(gòu),把數(shù)據(jù)的本體和數(shù)據(jù)的顯示分開(kāi)處理。由于文件產(chǎn)生之際,必須動(dòng)態(tài)創(chuàng)建Document/View/Frame,所以必須使用DocumentTemplate管理CDocTemplate,CSignleDocTemplateCMultiDocTemplateCDocumentCView2023/11/221171.窗口類(lèi):CWnd類(lèi)Cwnd提供了MFC中所有窗口類(lèi)的基本功能,是CCmdTarget類(lèi)的子類(lèi)創(chuàng)建Windows窗口要分兩步進(jìn)行引入構(gòu)造函數(shù),構(gòu)造一個(gè)CWnd對(duì)象調(diào)用Create建立Windows窗口,并將它連到CWnd對(duì)象上2023/11/22118CXTToolBarm_wndToolBar;if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)|| !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) {
TRACE0("Failedtocreatetoolbar\n");
return-1;//failtocreate }2023/11/221192.視類(lèi):CView類(lèi)該類(lèi)表示框架窗口的客戶區(qū)和顯示文檔數(shù)據(jù)并接收輸入的客戶區(qū),其派生類(lèi)主要有如下幾種:CScrollView:具有滾動(dòng)功能的視的基類(lèi)CFormView:其布局在對(duì)話資源中定義的滾動(dòng)視CEditView:具有文本編輯、查找、替換和滾動(dòng)功能的視…2023/11/22120應(yīng)用程序框架的MFC層次結(jié)構(gòu)CObjectCCmdTargert
CWinthread CWinApp
CWnd CView CFrameWnd CMDIFrameWnd CMDIChildWndCDocumentCDialogControlBar CStatusBar/CToolBar2023/11/22121Highlevelabstractions各種控件類(lèi):CToolbarCStatusBar等各種控件類(lèi)增強(qiáng)型的View類(lèi):CScrollViewCFromViewCEditViewCTreeViewCRtfView2023/11/22122OperatingsystemextensionsInternet和網(wǎng)絡(luò)類(lèi):IsAPI類(lèi)SocketsWinInletOLE類(lèi):各種OLE數(shù)據(jù)庫(kù)類(lèi):ODBCDAO類(lèi)2023/11/22123全局函數(shù)不屬于任何類(lèi),以afx開(kāi)頭AfxWinInit被winMain調(diào)用的函數(shù),初始化AfxBeginThread開(kāi)始一個(gè)新線程AfxEndThread結(jié)束一個(gè)舊線程AfxMessageBoxApi函數(shù)messageboxAfxGetApp獲得程序?qū)ο蟮闹羔楢fxGetMainWnd獲得程序主窗口指針AfxGetInstance獲得程序?qū)嵗浔鶤fxRegisterClass注冊(cè)窗口類(lèi)2023/11/22124宏CObject類(lèi)和CRuntimeClass類(lèi)中封裝了數(shù)個(gè)所謂的objectservices,包括RTTI:決定運(yùn)行時(shí)的對(duì)象的類(lèi)信息Serialization:將對(duì)象內(nèi)容寫(xiě)/讀文件動(dòng)態(tài)對(duì)象創(chuàng)建:運(yùn)行時(shí)產(chǎn)生一個(gè)特定的對(duì)象MFC針對(duì)上述機(jī)制,準(zhǔn)備了一些有意義的宏宏Declare_dynamic聲明運(yùn)行時(shí)類(lèi)信息Implement_dynamic實(shí)現(xiàn)運(yùn)行時(shí)類(lèi)信息Declare_dyncreate聲明動(dòng)態(tài)創(chuàng)建Implement_dyncreate實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建Declare_serial對(duì)象內(nèi)容的讀寫(xiě)Implement_serial對(duì)象內(nèi)容的讀寫(xiě)DECLARE_MESSAGE_MAP聲明消息映射BEGIN_MESSAGE_MAP開(kāi)始消息映射ON_COMMAND添加消息映射END_MESSAGE_MAP結(jié)束消息映射數(shù)據(jù)類(lèi)型BOOL布爾值BYTEWORDDWORDUINTLONGLPSTRLPCSTRLPTSTRLPCTSTRBSTR字符指針COLORREFLPARAMWPARAMLRESULTWNDPROCPOINTRECTSIZEPOSITION2023/11/22127MFC對(duì)消息的管理Windows消息的管理消息發(fā)送:SendMessage、PostMessage和SendDlgItemMessage消息處理:消息映射機(jī)制afx_msg:標(biāo)記它是一個(gè)消息處理成員函數(shù)
DECLARE_MESSAGE_MAP():對(duì)程序執(zhí)行部分所定義的消息映射進(jìn)行初始化BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP():消息映射宏2023/11/22128舉例:BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)ON_WM_CREATE()ON_COMMAND(ID_EDIT_COPY,OnEditCopy)ON_WM_CLOSE()END_MESSAGE_MAP()說(shuō)明:CMainFrame類(lèi)和CFrameWnd:代表當(dāng)前定義的類(lèi)和它的父類(lèi)2023/11/22129安裝與組成安裝VisualC++提供了三種版本:學(xué)習(xí)版/標(biāo)準(zhǔn)版、專業(yè)版和企業(yè)版三者都提供了c/c++編譯器、mfc以及集成開(kāi)發(fā)環(huán)境(IDE:integrateddevelopmentenvironment)2023/11/22130四個(gè)重要的工具VisualC++IDE:集成開(kāi)發(fā)環(huán)境AppWizard:代碼自動(dòng)生成器ResourceEditor:資源編輯器ClassWizard:類(lèi)生成向?qū)?023/11/22131AppWizard完成程序框架:File\New…\Projects\MfcAppwizard(exe)AppWizard總共6個(gè)步驟生成應(yīng)用程序的框架,為“一般應(yīng)用程序”產(chǎn)生幾個(gè)特定的類(lèi)AppWizard產(chǎn)生類(lèi)的命名規(guī)則:
‘C’+ProjectName+ClassType=classnameAppWizard產(chǎn)生的是化學(xué)反應(yīng),不是物理反應(yīng),是不能還原的。2023/11/22132AppWizard對(duì)SDIApp項(xiàng)目名稱為My產(chǎn)生的類(lèi)為:類(lèi)名稱基類(lèi)類(lèi)聲明于類(lèi)定義于CMyAppCWinAppMy.hMy.cppCMainFrameCFrameWndMainfrm.hMainfrm.cppCMyDocCDocumentmyDoc.hmyDoc.cppCMyViewCViewMyview.hMyview.cpp2023/11/22133AppWizard對(duì)MDIApp項(xiàng)目名稱為My產(chǎn)生的類(lèi)為:類(lèi)名稱基類(lèi)類(lèi)聲明于類(lèi)定義于CMyAppCWinAppMy.hMy.cppCMainFrameCMDIFrameWndMainfrm.hMainfrm.cppCChildFrameCMDIChildWndChildfrm.hChildfrm.cppCMyDocCDocumentmyDoc.hmyDoc.cppCMyViewCviewMyview.hMyview.cppVC++應(yīng)用程序開(kāi)發(fā)流程2023/11/22135一、VisualC++6.0簡(jiǎn)介及開(kāi)發(fā)環(huán)境的構(gòu)成1.VisualC++簡(jiǎn)介
是Windows環(huán)境下最主要的應(yīng)用開(kāi)發(fā)系統(tǒng)之一是C++語(yǔ)言的集成開(kāi)發(fā)環(huán)境與Win32緊密相連強(qiáng)大的調(diào)試功能為大型復(fù)雜軟件的開(kāi)發(fā)提供了有效的排錯(cuò)手段2.可視化指軟件開(kāi)發(fā)階段的可視化利用計(jì)算機(jī)圖形技術(shù)和方法開(kāi)發(fā)環(huán)境是程序員同VC++的交互界面通過(guò)它,可以創(chuàng)建工程文件訪問(wèn)資源編輯器使用內(nèi)部調(diào)試器訪問(wèn)程序源代碼3.開(kāi)發(fā)環(huán)境File->New->Files(1)VC++的菜單欄File菜單
File->New->Projects斷點(diǎn)作用:中斷程序的執(zhí)行過(guò)程,以便檢查程序代碼、變量和寄存器值位置斷點(diǎn)數(shù)據(jù)斷點(diǎn)消息斷點(diǎn)用來(lái)設(shè)置刪除和查看斷點(diǎn)(2)VC++的菜單欄Edit菜單
位置斷點(diǎn)通常在源代碼的指定行、函數(shù)的開(kāi)始或指定的內(nèi)存地址處設(shè)置,當(dāng)程序執(zhí)行到指定位置時(shí),位置斷點(diǎn)將中斷程序的執(zhí)行在位置斷點(diǎn)中還可以設(shè)置斷點(diǎn)條件,此時(shí)必須先指定位置,然后再設(shè)置條件斷點(diǎn)數(shù)據(jù)斷點(diǎn)是在變量或表達(dá)式上設(shè)置,當(dāng)變量或表達(dá)式的值改變時(shí),數(shù)據(jù)斷點(diǎn)將中斷程序的執(zhí)行消息斷點(diǎn)是在窗口函數(shù)WndProc上設(shè)置,當(dāng)接收到指定的消息時(shí),消息斷點(diǎn)將中斷程序的執(zhí)行(b)ListMembers選項(xiàng)利用此選項(xiàng),可減輕輸入代碼的工作量。如在變量名之后鍵入“.”或“->”,系統(tǒng)就會(huì)自動(dòng)顯示所有有效的成員名供選擇。(c)TypeInfo選項(xiàng)
如果在源代碼中將鼠標(biāo)指針停在某一變量或函數(shù)上,那么系統(tǒng)將顯示所指變量或函數(shù)等的語(yǔ)法。提供有效的成員名(d)ParameterInfo選項(xiàng)
當(dāng)輸入代碼時(shí),若在輸入函數(shù)名之后鍵入左括號(hào),系統(tǒng)將顯示該函數(shù)的完整原型,并用黑體顯示其第一個(gè)參數(shù)。輸入第一個(gè)參數(shù)之后,接著就會(huì)出現(xiàn)第二個(gè)參數(shù),依此類(lèi)推。(e)CompleteWord選項(xiàng)
系統(tǒng)自動(dòng)完成當(dāng)前語(yǔ)句其余部分的輸入。如果不能自動(dòng)完成,則給出適當(dāng)?shù)奶崾据o助用戶完成。在View菜單中可以:改變窗口改變工具欄的顯示方式檢查源代碼激活調(diào)試等View->ClassWizard選項(xiàng)(a)ClassWizard選項(xiàng)(3)VC++的菜單欄View菜單
(a-1)ClassWizard中的MessageMaps選項(xiàng)卡為窗口、對(duì)話框、控件、菜單選項(xiàng)和加速鍵等對(duì)象映射消息創(chuàng)建或刪除消息處理函數(shù)查看消息處理函數(shù)的代碼(a-2)MemberVariables選項(xiàng)卡:
定義成員變量用于自動(dòng)初始化窗口、控件、對(duì)話框等。其中:
ControlIDs是映射到成員變量的控件ID值
Type是成員變量的類(lèi)型
Member是成員變量名(a-3)Automation選項(xiàng)卡:
此選項(xiàng)卡主要將在創(chuàng)建新類(lèi)時(shí),添加自動(dòng)化方法和屬性。列出已經(jīng)添加到當(dāng)前類(lèi)中的方法和屬性的名稱Externalnames中的方法和屬性的實(shí)現(xiàn)方法(a-4)ClassInfo選項(xiàng)卡:提供有關(guān)類(lèi)的信息。(b)ResourceSymbols選項(xiàng)
該選項(xiàng)將打開(kāi)資源符號(hào)瀏覽器,從中可以瀏覽資源編輯符號(hào)。資源編輯符號(hào)是映射到整數(shù)值上的一串字符,相當(dāng)于資源的一個(gè)代號(hào),在同一個(gè)程序中,資源編輯符號(hào)不能重復(fù)(c)ResourceIncludes選項(xiàng)
該對(duì)話框包含資源符號(hào)頭文件名和預(yù)處理指令。(d)Workspace選項(xiàng)
如果工作區(qū)沒(méi)有顯示或者不是處于當(dāng)前狀態(tài),則選擇該項(xiàng)將顯示工作區(qū)窗口。(e)Output選項(xiàng)
在輸出窗口中顯示程序建立過(guò)程(如編譯、鏈接等)的有關(guān)信息或錯(cuò)誤信息,并且顯示調(diào)試運(yùn)行時(shí)的輸出結(jié)果。(a)NewClass選項(xiàng)該選項(xiàng)用來(lái)創(chuàng)建新類(lèi)并添加到項(xiàng)目中。(4)VC++的菜單欄——Insert菜單
(b)NewForm選項(xiàng)該選項(xiàng)用來(lái)創(chuàng)建新的表單并添加到項(xiàng)目中。(c)Resource選項(xiàng)該選項(xiàng)將打開(kāi)InsertResource對(duì)話框,用以創(chuàng)建新的資源或插入資源文件中。(d)ResourceCopy選項(xiàng)要選中該選項(xiàng)必須先選中某個(gè)資源,否則呈灰色。該選項(xiàng)用于復(fù)制選定的資源。(e)NewATLObject選項(xiàng)
該選項(xiàng)將啟動(dòng)ATLObjectWizard,以便添加新的ATL對(duì)象使用Project可以創(chuàng)建、修改和存儲(chǔ)正在編輯的工程文件。
工程文件組合了一個(gè)應(yīng)用程序的所有源文件的組成部分。工程文件包含在擴(kuò)展名為.MAK的文件中。(5)VC++的菜單欄——Project菜單
VC++中使用*.dsw*.dsp(b)AddToProject選項(xiàng)
選擇該選項(xiàng)將打開(kāi)一個(gè)級(jí)聯(lián)子菜單通過(guò)級(jí)聯(lián)子菜單,可以把文件、文件夾、數(shù)據(jù)鏈接以及VC組件或控件添加到當(dāng)前工程文件中在該子菜單中可以進(jìn)行如下操作:(1)New:創(chuàng)建新的文件;(2)NewFolder:插入新的文件夾;(3)Files:插入已有文件;(4)DataConnection:添加數(shù)據(jù)鏈接;(5)ComponentandControls:通過(guò)該項(xiàng)將可以插入VC組件或者已注冊(cè)的ActiveX控件。插入時(shí)相當(dāng)于插入相關(guān)的頭文件(.h文件)和實(shí)現(xiàn)文件(.cpp文件),并且更新工作區(qū)窗口的信息。(a)SetActiveProject選項(xiàng)設(shè)定指定的項(xiàng)目為工作區(qū)的活動(dòng)項(xiàng)目(c)Settings選項(xiàng)選擇該選項(xiàng)將彈出ProjectSettings對(duì)話框,其中General選項(xiàng)卡用來(lái)設(shè)置基礎(chǔ)類(lèi)用法和目錄指出應(yīng)用程序與MFC的鏈接方式指出用來(lái)構(gòu)建(build)應(yīng)用程序的一些文件(如.obj和.sbr)所在的位置用來(lái)指出最終的輸出文件的位置Build菜單用于編譯、建立和執(zhí)行應(yīng)用程序(b)Build選項(xiàng)對(duì)最后修改過(guò)的源文件進(jìn)行編譯和鏈接(a)Compile選項(xiàng)
只編譯當(dāng)前文件而不調(diào)用鏈接器或其它工具。輸出窗口將顯示編譯過(guò)程檢查出的錯(cuò)誤或警告信息,在錯(cuò)誤信息處單擊鼠標(biāo)右鍵,可以得到錯(cuò)誤代碼的位置。(c)
RebuildAll選項(xiàng)
該選項(xiàng)允許用戶編譯所有的源文件,而不管它們何時(shí)曾經(jīng)被修改過(guò)。(6)VC++的菜單欄——Build菜單
(d)BatchBuild選項(xiàng)該選項(xiàng)能單步重新建立多個(gè)工程文件,并允許用戶指定要建立的項(xiàng)目類(lèi)型。Win32Release(發(fā)行版)、Win32Debug(調(diào)試版)。VC提供了兩種應(yīng)用程序類(lèi)型(e)
StartDebug選項(xiàng)從當(dāng)前語(yǔ)句開(kāi)始執(zhí)行程序直到遇到斷點(diǎn)或遇到程序結(jié)束單步執(zhí)行程序,并在遇到函數(shù)調(diào)用時(shí)進(jìn)入函數(shù)內(nèi)部再?gòu)念^單步執(zhí)行使程序在運(yùn)行到當(dāng)前光標(biāo)所在位置時(shí)停止(相當(dāng)于設(shè)置一個(gè)臨時(shí)斷點(diǎn))調(diào)試過(guò)程中直接進(jìn)入到正在運(yùn)行的進(jìn)程中(a)SourceBrowse選項(xiàng)編譯器在建立項(xiàng)目時(shí)會(huì)創(chuàng)建與項(xiàng)目中每一程序文件信息有關(guān)的.SBR文件。BSCMAKE程序?qū)⑦@些.SBR文件匯編為單個(gè)瀏覽信息數(shù)據(jù)庫(kù)(*.bsc文件)
選擇SourceBrowse將彈出瀏覽窗口,它顯示與程序中所有符號(hào)(類(lèi)、函數(shù)、數(shù)據(jù)、宏和類(lèi)型)有關(guān)的信息Tools菜單允許用戶快速地訪問(wèn)多個(gè)不同的開(kāi)發(fā)工具(7)VC++的菜單欄——Tools菜單(b)VisualComponentManager選項(xiàng)
該工具可以在某個(gè)工程中組織、尋找和插入相關(guān)組件,而且還可以識(shí)別已存在的且可利用的對(duì)象。選擇該選項(xiàng)將彈出如圖所示的窗口。在工作區(qū)中添加項(xiàng)目:
用File->O
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年AI智能營(yíng)銷(xiāo)技術(shù)合作合同樣本
- 二零二五年度生態(tài)環(huán)保木工加工廠合作合同4篇
- 2025年醫(yī)療護(hù)士協(xié)議
- 2025年增資協(xié)議書(shū)面詳細(xì)約定內(nèi)容文本
- 2025年產(chǎn)品分銷(xiāo)渠道協(xié)定書(shū)
- 2025年家裝風(fēng)水合同
- 2025年埋頭競(jìng)業(yè)禁止合同
- 2025版智能家居燈具音響設(shè)備一體化采購(gòu)合同4篇
- 2025年媒介環(huán)境分析協(xié)議
- 2025版學(xué)校食堂豬肉食品安全風(fēng)險(xiǎn)評(píng)估與監(jiān)控合同2篇
- 口腔執(zhí)業(yè)醫(yī)師定期考核試題(資料)帶答案
- 2024人教版高中英語(yǔ)語(yǔ)境記單詞【語(yǔ)境記單詞】新人教版 選擇性必修第2冊(cè)
- 能源管理總結(jié)報(bào)告
- 挖掘機(jī)售后保養(yǎng)及維修服務(wù)協(xié)議(2024版)
- 充電樁巡查記錄表
- 阻燃材料的阻燃機(jī)理建模
- CJT 511-2017 鑄鐵檢查井蓋
- 配電工作組配電網(wǎng)集中型饋線自動(dòng)化技術(shù)規(guī)范編制說(shuō)明
- 2024高考物理全國(guó)乙卷押題含解析
- 介入科圍手術(shù)期護(hù)理
- 青光眼術(shù)后護(hù)理課件
評(píng)論
0/150
提交評(píng)論