版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Visual C+程序設(shè)計基礎(chǔ)與實例分析朱晴婷第1頁,共311頁。第一章 VC開發(fā)環(huán)境集成開發(fā)環(huán)境集成平臺基本操作調(diào)試8/4/20222第2頁,共311頁。Developer Studio操作界面標題欄菜單欄工具欄狀態(tài)欄項目工作區(qū):ClassViewResourceViewFileView編輯區(qū)輸出框8/4/20223第3頁,共311頁。圖片:操作界面項目工作區(qū)編輯區(qū)輸出框WizardBar8/4/20224第4頁,共311頁。項目工作區(qū)WorkSpaceDeveloper Studio以項目工作區(qū)的方式來組織文件、項目、項目配置。創(chuàng)建項目工作區(qū)時,將創(chuàng)建:一個項目工作區(qū)目錄一個項目工作區(qū)文件
2、(.dsw)一個項目文件(.dsp)一個工作區(qū)選項文件(.opt)要打開一個項目,只需要打開對應(yīng)的項目工作區(qū)文件.dsw8/4/20225第5頁,共311頁。項目一個項目是由一組項目配置和一組源文件組成。項目配置:Win32DeBugWin32ReleaseProject/Setting源文件Header FilesSource FilesResource Files8/4/20226第6頁,共311頁。項目工作區(qū)窗口ClassView:顯示項目中定義的C類Resource View:顯示項目中包含的資源File View:顯示包含在項目工作區(qū)中的文件8/4/20227第7頁,共311頁。Cl
3、assView類成員變量成員函數(shù)訪問類型publicprivateprotected8/4/20228第8頁,共311頁。RecourceViewAcceleratorDialogIconMenuString TableToolBarVersion8/4/20229第9頁,共311頁。FileView查看文件增加文件Project/Add to Project/Fles刪除文件文件操作是針對項目,并不能從物理上刪除或增加一個文件8/4/202210第10頁,共311頁。File/New:FilesProjectWorkSpaceothers DocumentsMFC AppWizard(EXE
4、) 創(chuàng)建一個MFC應(yīng)用程序AppWizardSingle DocumentMultiple DocumentDialog based! 工具按鈕New只是新建一個文本文件8/4/202211第11頁,共311頁。類操作向?qū)Чぞ逤lass Wizard:對話框View/ClassWizardCtrl+W快捷菜單Wizard Bar:工具欄8/4/202212第12頁,共311頁。ClassWizard的作用支持從應(yīng)用程序框架基類中派生新類 為類添加消息映射函數(shù) 查看和編輯消息處理函數(shù) 創(chuàng)建新類時,自動加入方法和屬性 8/4/202213第13頁,共311頁。集成平臺基本操作打開應(yīng)用程序關(guān)閉應(yīng)用程
5、序編譯運行應(yīng)用程序8/4/202214第14頁,共311頁。任務(wù)1通過AppWizard,建立MFC應(yīng)用程序框架詳見實驗18/4/202215第15頁,共311頁。調(diào)試調(diào)試命令設(shè)置斷點使用Variables窗口使用Watch窗口8/4/202216第16頁,共311頁。調(diào)試命令Start DebugGo(F5)Run to CursorStep IntoStep OverAttach to ProcessStop Debugging8/4/202217第17頁,共311頁。設(shè)置斷點Location設(shè)置位置中斷Data根據(jù)表達式的值設(shè)置中斷Message設(shè)置消息中斷8/4/202218第18頁,
6、共311頁。Variables窗口AutoLocalsthis8/4/202219第19頁,共311頁。Watch窗口變量表達式8/4/202220第20頁,共311頁。任務(wù)2Visual C+ 集成開發(fā)環(huán)境下的程序調(diào)試詳見例1-18/4/202221第21頁,共311頁。聯(lián)機幫助Help菜單F1MSDN8/4/202222第22頁,共311頁。任務(wù)3實驗2實驗38/4/202223第23頁,共311頁。第二章 面向?qū)ο蟪绦蛟O(shè)計的概念C與C+的差別引用類和對象構(gòu)造函數(shù)和析構(gòu)函數(shù)第24頁,共311頁。C對C的改進一般語法的改進指針和引用函數(shù)的改進8/4/202225第25頁,共311頁。C的輸入
7、和輸出include “stdio.h”printf(“hello c”);scanf(“%d”,&sum);printf(“sum is %d”,sum);#include”iostream.h”cout sum;cout “sum is ” sum endl;一般語法的改進8/4/202226第26頁,共311頁。注釋/*/一般語法的改進8/4/202227第27頁,共311頁。變量定義變量定義可以位于程序中的任何地方下面的語句有問題嗎?for( int i=0; i10; i+)int c; c*=2; int s; 一般語法的改進8/4/202228第28頁,共311頁。符號常量的定義
8、define NULL 0#define Length 100#define PI 3.1415926const int NULL=0const int Length =100const double PI=3.1415926一般語法的改進8/4/202229第29頁,共311頁。強制轉(zhuǎn)換類型C的強制類型轉(zhuǎn)換法 (類型名)表達式函數(shù)表示法(僅限簡單類型) 類型名(表達式)int i=int(1.35); 一般語法的改進8/4/202230第30頁,共311頁。結(jié)構(gòu)體與枚舉類型的用戶標識名enum traffic red,green,yellow;struct student int num;
9、char name20;traffic Light;student stu1; !不必在一個結(jié)構(gòu)體名之前加struct,不用在一個枚舉類型名之前加關(guān)鍵字enum。一般語法的改進8/4/202231第31頁,共311頁。動態(tài)內(nèi)存分配newint*p,*q,*s;p=new int; s=new int(200);q=new int10; delete delete p;delete q;一般語法的改進 #include “iostream.h” void main() int *p; p=new int; *p=10; cout*p; delete p; 8/4/202232第32頁,共311頁
10、。引用類型的概念引用是指給對象的地址取個別名,對引用的改動則是對目標的改動。 int int1; int &rint=int1;引用不是值,不占有存儲空間引用必須初始化,并且不再指向其他不同的變量指針和引用8/4/202233第33頁,共311頁。什么能被引用double &rr=1; double temp; temp=double(1); double& rr=temp;指針變量的引用 int *a; int*&p=a; int b=8; p=&b;指針和引用8/4/202234第34頁,共311頁。什么不能被引用void &a=3;int a10; int&ra10=a;int&ra=i
11、nt;int&ri=NULL;指針和引用8/4/202235第35頁,共311頁。引用作為函數(shù)參數(shù)-地址傳遞指針的代碼可讀性差,指針作為參數(shù)傳遞,用戶調(diào)用知道函數(shù)是如何工作的。解決大對象值傳遞會產(chǎn)生副本的問題程序清單2-3指針和引用8/4/202236第36頁,共311頁。引用作為函數(shù)參數(shù)-地址傳遞存在的問題引用隱藏了函數(shù)所使用的參數(shù)傳遞的類型,應(yīng)避免重載匹配錯誤void fn(int s);void fn(int&t);用const 限定引用double fn(const double &pd)指針和引用8/4/202237第37頁,共311頁。函數(shù)原型例:int func(int,int)
12、;C+ 要求所有函數(shù)都有函數(shù)原型程序的頂部頭文件C提供更強的類型檢查,允許編譯程序?qū)ο铝星闆r報錯誤信息:被調(diào)用函數(shù)參數(shù)類型定義和類型轉(zhuǎn)換非法函數(shù)的參數(shù)個數(shù)不相符函數(shù)不能返回預定的數(shù)據(jù)類型函數(shù)的改進8/4/202238第38頁,共311頁。內(nèi)置函數(shù)inline#include void main() int a(8),b(16),c; inline int max(int,int); c=max(a,b); cout”c=”cendl; int max(int x,int y); cout”c=”cendl;8/4/202239第39頁,共311頁。內(nèi)置函數(shù)inline實質(zhì):編譯器為inline
13、 函數(shù)創(chuàng)建代碼,在每次碰到該函數(shù)的調(diào)用都用相應(yīng)的一段代碼替換說明:關(guān)鍵字inline一般放在函數(shù)聲明的前面inline放在函數(shù)定義的前面時,函數(shù)定義要在調(diào)用函數(shù)的前面限制:不能含有switch,while等復雜的結(jié)構(gòu)控制語句,遞歸函數(shù)不能被用作inline函數(shù)函數(shù)的改進8/4/202240第40頁,共311頁。inline 與宏定義宏所作的是機械代換,在參數(shù)為表達式時會產(chǎn)生不可預知的錯誤宏不能作類型檢查 define f(m) m*m 宏定義調(diào)用:f(5+5) 5+5*5+5函數(shù)的改進8/4/202241第41頁,共311頁。函數(shù)的默認參數(shù)可以在函數(shù)聲明時,對參數(shù)賦與默認值,調(diào)用沒有給出實參時
14、,就使用默認值。void delay(int loops=1000);void delay(int loops)if (loops=0) return; for(int i=0;ix p-ypai.x pai.y8/4/202254第54頁,共311頁。任務(wù)1類和對象的定義詳見實驗18/4/202255第55頁,共311頁。構(gòu)造函數(shù)構(gòu)造函數(shù)的作用是構(gòu)造對象初始化形式在定義對象時,由應(yīng)用程序自動調(diào)用構(gòu)造函數(shù)是類的一個特殊成員函數(shù)它的函數(shù)名與類名相同, 沒有返回類型它可以有任意類型的參數(shù)可以重載8/4/202256第56頁,共311頁。默認構(gòu)造函數(shù)當類定義中沒有用戶定義的構(gòu)造函數(shù)時,系統(tǒng)自動產(chǎn)生一
15、個無參數(shù)的構(gòu)造函數(shù),稱此構(gòu)造函數(shù)為默認構(gòu)造函數(shù)當定義一個對象時,默認構(gòu)造函數(shù)只是簡單地把對象中的每個成員初始化為0或空.8/4/202257第57頁,共311頁。構(gòu)造函數(shù)的類型無參構(gòu)造函數(shù)Point();Point p1;帶參構(gòu)造函數(shù)Point(int ,int);Point p2(100,200);復制構(gòu)造函數(shù)Point(const Point&);Point p3(p2);8/4/202258第58頁,共311頁??截悩?gòu)造函數(shù)示例class A public: A(int); A(const A&,int i=1);main() A a(1); A b(a,0); A c=b;8/4/20
16、2259第59頁,共311頁。析構(gòu)函數(shù)析構(gòu)函數(shù)也是類的特殊成員函數(shù),它的函數(shù)名與類名相同,但它的名字前面有一個“”.它沒有參數(shù),沒有返回類型,而且不能重載.8/4/202260第60頁,共311頁。this 指針this 是一個指向調(diào)用該函數(shù)的對象的常量指針。成員函數(shù)可通過this指針直接使用同類的其它成員this指針是隱含的int get_length()return length;int get_length()return this-length;8/4/202261第61頁,共311頁。繼承在已有類的基礎(chǔ)上定義新類的過程稱為繼承?;? base class)和派生類派生類的定義cla
17、ss : . .8/4/202262第62頁,共311頁。 繼承的方式繼承方式基類成員訪問權(quán)限派生類繼承到的訪問權(quán)限public(公有繼承)publicprotectedprivatepublicprotected不可訪問protected(保護繼承)publicprotectedprivateprotectedprotected不可訪問private( 私有繼承)publicprotectedprivateprivateprivate不可訪問8/4/202263第63頁,共311頁。例2-22 單繼承示例8/4/202264第64頁,共311頁。多繼承派生類從多個基類派生,派生類具有多個基類
18、的特性派生方法:class 派生類名:繼承方式1 基類名1,繼承方式2 基類名2,.繼承方式n 基類名n . .;8/4/202265第65頁,共311頁。例2-23 多繼承示例8/4/202266第66頁,共311頁。多態(tài)性在 基類和派生類中使用同樣的函數(shù)名而定義不同的操作,從而實現(xiàn)“一種接口,多種方法”。類型靜態(tài)多態(tài)性: 編譯時實現(xiàn),通過重載動態(tài)多態(tài)性: 運行時實現(xiàn),通過派生和虛函數(shù)8/4/202267第67頁,共311頁。虛函數(shù)在繼承體系中,如果在派生類中要對所繼承的成員函數(shù)重新定義其功能,該函數(shù)應(yīng)在基類中被定義為虛函數(shù)。虛函數(shù)是指在基類中的成員函數(shù)前加上virtual,然后在派生類中再
19、加以定義的函數(shù)。 當用指向派生類的對象的基類指針對函數(shù)進行訪問時,系統(tǒng)將根據(jù)運行時指針所指向的實際對象來確定調(diào)用哪一個類的成員函數(shù)版本。 8/4/202268第68頁,共311頁。例2-25 虛函數(shù)示例8/4/202269第69頁,共311頁。第三章 MFC應(yīng)用程序概述Windows 應(yīng)用程序概述MFC應(yīng)用程序框架文檔/視圖結(jié)構(gòu)消息映射第70頁,共311頁。 窗口編程基礎(chǔ) 窗口消息和消息隊列事件驅(qū)動的程序設(shè)計資源管理8/4/202271第71頁,共311頁。窗口的界面元素垂直滾動條標題欄菜單欄關(guān)閉按鈕最小化按鈕最大化按鈕水平滾動條窗口邊界客戶區(qū)8/4/202272第72頁,共311頁。窗口窗口
20、是應(yīng)用程序與用戶交互的界面窗口元素以對象方式組織一個應(yīng)用程序由多個窗口組成程序運行過程是窗口之間,窗口與系統(tǒng),窗口與用戶之間交換并處理數(shù)據(jù)的過程。8/4/202273第73頁,共311頁。消息和消息隊列 消息用于通知某個事件的產(chǎn)生消息機制MSG消息的類型8/4/202274第74頁,共311頁。消息機制應(yīng)用程序1窗口函數(shù)WndProc消息映射默認窗口函數(shù)DefWndowProcApp1消息隊列 App2消息隊列 App3消息隊列 系統(tǒng)隊列輸入消息系統(tǒng)消息postMessageSendMessage8/4/202275第75頁,共311頁。派送消息消息源1消息源2消息源n否程序開始程序結(jié)束捕獲消
21、息處理消息是否退出消息是8/4/202276第76頁,共311頁。MSGtypedef struct tagMSG HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt;MSG;8/4/202277第77頁,共311頁。消息的類型輸入消息控件消息系統(tǒng)消息用戶消息8/4/202278第78頁,共311頁。事件驅(qū)動的程序設(shè)計事件驅(qū)動的程序的邏輯順序是按事件的產(chǎn)生而決定的事件的產(chǎn)生不是預先定義的,有著隨機性 8/4/202279第79頁,共311頁。開始輸入第一項某運動員的成績輸入第二項某運動員的成績輸
22、入第三項某運動員的成績輸入第四項某運動員的成績計算每個運動員的總分按總分排名結(jié)束消息循環(huán)8/4/202280第80頁,共311頁。資源管理資源的類型用戶自定義資源菜單對話框工具欄系統(tǒng)資源設(shè)備上下文畫刷畫筆字體通信端口資源管理器資源ID資源模板資源文件資源編譯程序資源數(shù)據(jù)結(jié)構(gòu)8/4/202281第81頁,共311頁。窗口應(yīng)用程序剖析窗口應(yīng)用程序的構(gòu)成一個應(yīng)用程序是如何開始的?8/4/202282第82頁,共311頁。窗口應(yīng)用程序的構(gòu)成元素代碼 winmain windows procedure用戶界面資源庫模塊 DLL8/4/202283第83頁,共311頁。一個應(yīng)用程序是如何開始?操作系統(tǒng)創(chuàng)建
23、一個新的進程和一個初始線程應(yīng)用程序代碼裝載到內(nèi)存動態(tài)鏈接庫裝載到內(nèi)存(如果需要使用DLL)為數(shù)據(jù)和堆棧分配物理內(nèi)存,并映射到虛擬內(nèi)存應(yīng)用程序開始執(zhí)行8/4/202284第84頁,共311頁。窗口應(yīng)用程序組成 The WinMain function A window procedure functionmessage loop (消息循環(huán))例318/4/202285第85頁,共311頁。The WinMain Function在操作系統(tǒng)注冊窗口類。在內(nèi)存中創(chuàng)建窗口,并初始化它的屬性,使窗口正確顯示。創(chuàng)建一個消息循環(huán),檢查窗口是否產(chǎn)生消息進入消息隊列當消息循環(huán)檢測到關(guān)閉窗口消息WM_QUIT時,
24、終止程序運行8/4/202286第86頁,共311頁。The Window Procedure用戶自定義函數(shù) 決定窗口在客戶區(qū)顯示的內(nèi)容,和窗口對用戶輸入如何反應(yīng)處理開發(fā)者添加的消息處理代碼,如果不存在開發(fā)者添加的消息處理代碼,將由 default window procedure函數(shù)處理 。8/4/202287第87頁,共311頁。消息循環(huán)while (GetMessage(&msg, NULL, 0, 0) if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg) TranslateMessage(&msg);DispatchMessag
25、e(&msg);8/4/202288第88頁,共311頁。任務(wù)1 分析使用AppWizard生成的Win32窗口程序示例Exam3_2,并修改該程序。詳見例3-2 8/4/202289第89頁,共311頁。MFC應(yīng)用程序概述MFC類簡介 構(gòu)建Windows應(yīng)用程序的基本類 文檔/視圖結(jié)構(gòu)剖析MFC SDI的文件結(jié)構(gòu)8/4/202290第90頁,共311頁。MFC 類application programming interface (API)MFC 封裝了API的主要結(jié)構(gòu)和通用組件8/4/202291第91頁,共311頁。MFC的特點創(chuàng)建窗口方便,利用程序的應(yīng)用程序框架新的C+的類與早期版本的
26、 MFC兼容大量可重用的C+源代碼與 Visual C+集成 8/4/202292第92頁,共311頁。MFC的特點支持靈活快速的DAO或ODBC數(shù)據(jù)庫訪問方式支持 ActiveX 和Internet 技術(shù)支持先進的數(shù)據(jù)綁定技術(shù)支持窗口消息 API支持多線程 8/4/202293第93頁,共311頁。 MFC 的繼承關(guān)系MFC 類封裝了 the win32 API 應(yīng)用程序?qū)ο笕纾?documents,views and applictions Activex,database, Internet 特點MFC分類 CObject_derived 類 Non_CObject_derived 類8
27、/4/202294第94頁,共311頁。CObject派生類CObjectCCmdTargetCWinThreadCWinAppCWndCFrameWndCViewCDocument8/4/202295第95頁,共311頁。非CObject派生類通用工具類CString CTime CTimeSpanCRectCpointCSizeMFC支持類 CArchiveCDumpContextCRuntimeClassCFileStatusCMemoryStateCTypePointerArray8/4/202296第96頁,共311頁。構(gòu)建Windows應(yīng)用程序基本類應(yīng)用程序類主框架類8/4/202
28、297第97頁,共311頁。應(yīng)用程序類CExam1_1App類定義頭文件一個空的類結(jié)構(gòu)類的實現(xiàn)文件應(yīng)用程序類的消息映射空的構(gòu)造函數(shù)全局對象theAppInitInstance函數(shù)定義8/4/202298第98頁,共311頁。InitInstance創(chuàng)建應(yīng)用程序的主窗口一個指向有效主窗口的指針 m_pMainWnd8/4/202299第99頁,共311頁。主框架類CMainFrame管理除視圖之外的其他主窗口部分OnCreatem_wndToolBarm_wndStatusBar8/4/2022100第100頁,共311頁。任務(wù)2手工編寫MFC應(yīng)用程序 詳見實驗18/4/2022101第101頁
29、,共311頁。文檔,視圖和應(yīng)用程序框架文檔/視圖結(jié)構(gòu)SDI 和 MDI 應(yīng)用程序在SDI應(yīng)用程序中的對象非文檔/視圖結(jié)構(gòu)8/4/2022102第102頁,共311頁。文檔/視圖結(jié)構(gòu)文檔 : a data object with which the user interacts in an editing session視圖 a window object through which the user interacts with the document8/4/2022103第103頁,共311頁。類名稱基類說明CExam1_1AppCWinApp應(yīng)用程序類CMainFrameCFrameWn
30、d窗口框架類CExam1_1DocCDocument文檔類CExam1_1ViewCView視圖類文檔/視圖應(yīng)用程序的構(gòu)成8/4/2022104第104頁,共311頁。文檔/視圖結(jié)構(gòu)傳遞消息到窗口框架 傳遞消息到視圖 信息在視圖與文檔對象間雙向傳遞 文檔對象應(yīng)用程序?qū)ο蟠翱诳蚣軐ο笠晥D對象8/4/2022105第105頁,共311頁。文檔類裝載、存貯、 管理應(yīng)用程序的數(shù)據(jù)每一個文檔對象維護一張與視圖相關(guān)聯(lián)的列表,每一個視圖對象維護與其相關(guān)聯(lián)的指針。主要成員函數(shù)OnOpenDocumentOnNewDocumentSerialize8/4/2022106第106頁,共311頁。視圖類顯示保存在文
31、檔類中的信息,允許用戶輸入主要成員函數(shù)GetDocumentOnDrawOnInitialUpdateOnUpdate8/4/2022107第107頁,共311頁。視圖類的類型CScrollViewCFormViewCEditViewCRichEditViewCListViewCTreeViewCRecordViewCCtrlView8/4/2022108第108頁,共311頁。文檔模板類綁定框架、視圖、文檔和一組應(yīng)用程序資源的類不需要開發(fā)者干涉其行為,所以不存在對應(yīng)的文件CDocTemplate CSingleDocTemplate CMultiDocTemplate8/4/2022109第
32、109頁,共311頁。文檔模板類層次圖CObjectCCmdTargetCSingleDocTemplateCMultiDocTemplateCDocTemplate8/4/2022110第110頁,共311頁。SDI 和 MDI 應(yīng)用程序 SDI 只能打開一個文檔窗口畫圖MDI可以打開多個文檔窗口Excel8/4/2022111第111頁,共311頁。定義單文檔的文檔模板類型 CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate(IDR_MAINFRAME, RUNTIME_CLASS(CExam1_1
33、Doc), RUNTIME_CLASS(CMainFrame), RUNTIME_CLASS(CExam1_1View); AddDocTemplate(pDocTemplate); 8/4/2022112第112頁,共311頁。SDI 應(yīng)用程序組成Application ObjectDocument TemplateDocumentToolbarViewStatus BarMain Frame Window8/4/2022113第113頁,共311頁。MFC SDI的文件結(jié)構(gòu)工作區(qū)文件、項目文件 Exam1_1.dsw Exam1_1.dsp Exam1_1.clw 應(yīng)用程序源文件和頭文件
34、資源文件Exam1_1RCRESOURCE.HExam1_1.rc2 預編譯頭文件StdAfx.cppStdAfx.h 8/4/2022114第114頁,共311頁。消息映射消息的類別及描述消息映射系統(tǒng)消息處理的路徑自定義消息處理8/4/2022115第115頁,共311頁。消息的類別窗口消息CView和CFrame及其派生類、及自定義窗口類處理窗口消息。 命令消息從基類CCmdTarget派生的類都能處理命令消息 控件消息控件消息由控件所屬的對話框類處理8/4/2022116第116頁,共311頁。窗口消息的描述message:WM_XXX wParam和 lParam:隨WM_XXX而變
35、8/4/2022117第117頁,共311頁。命令消息的描述message :WM_COMMAND wParam:低16位為命令I(lǐng)D、高16位為0lParam:0L 8/4/2022118第118頁,共311頁??丶⒌拿枋鰉essage:WM_NOTIFY wParam:控件ID lParam:指向NMHDR的指針,NMHDR是包含了消息內(nèi)容的一個結(jié)構(gòu) 8/4/2022119第119頁,共311頁。消息宏前綴 前綴消息分類BM按鈕控制消息CB組合框控制消息DMEM默認下壓式按鈕控制消息編輯控制消息LBSBMWM列表框控制消息滾動條控制消息窗口消息8/4/2022120第120頁,共311頁
36、。消息映射系統(tǒng)CCmdTarget的派生類每個子類都定義一個消息表消息映射表DECLARE_MESSAGE_MAP()BEGIN_MESSAGE_MAP()END_MESSAGE_MAP()8/4/2022121第121頁,共311頁。MFC消息映射原理應(yīng)用程序開始運行后有一個從CWinApp派生的對象,等待和處理消息的函數(shù)是應(yīng)用程序類的RUN()函數(shù)。RUN() 函數(shù)將接收到的消息都交給主窗口的窗口函數(shù)OnWndMsg(),由OnWndMsg()函數(shù)負責將消息分類并交予不同的消息處理函數(shù)去處理。8/4/2022122第122頁,共311頁。消息映射表MFC在每一個能夠接收和處理消息類中,定義
37、一個消息和消息處理函數(shù)靜態(tài)對照表,該表稱為消息映射表。該類能夠處理的所有的消息及其對應(yīng)的消息處理函數(shù)的地址都列在該表中。8/4/2022123第123頁,共311頁。在類中加入靜態(tài)消息映射表在.h 文件中加入: DECLARE_MESSAGE_MAP()在.CPP文件中加入:BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd) ON_WM_PAINT() END_MESSAGE_MAp()8/4/2022124第124頁,共311頁。消息映射表示例BEGIN_MESSAGE_MAP(CExam1_1App, CWinApp)/AFX_MSG_MAP(CExam1_1A
38、pp)ON_COMMAND(ID_APP_ABOUT, OnAppAbout)/AFX_MSG_MAPON_COMMAND(ID_FILE_NEW, CWinApp:OnFileNew)ON_COMMAND(ID_FILE_OPEN, CWinApp:OnFileOpen)ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp:OnFilePrintSetup)END_MESSAGE_MAP() 8/4/2022125第125頁,共311頁。消息處理宏格式消息類型宏格式參數(shù)預定義窗口消息ON_WM_XXX無命令消息ON_COMMAND命令I(lǐng)D,消息處理函數(shù)名更新命令消息
39、ON_UPDATE_COMMAND_UI命令I(lǐng)D,消息處理函數(shù)名控件消息ON_XXX控件ID,消息處理函數(shù)名用戶自定義消息ON_MESSAGE自定義消息ID,消息處理函數(shù)名8/4/2022126第126頁,共311頁。例3-3創(chuàng)建一個單文檔的MFC應(yīng)用程序Exam3_3,并實現(xiàn)功能:當在視圖中雙擊鼠標右鍵時,彈出對話框,顯示鼠標的坐標。 8/4/2022127第127頁,共311頁。消息處理路徑窗口消息的處理命令消息的處理控件消息的處理8/4/2022128第128頁,共311頁。如何處理窗口消息所有基類均沒定義該消息的處理函數(shù) 窗口類:OnWndMsg(.)是窗口消息搜索窗口類的消息映射表找
40、到 ?繼續(xù)搜索基類消息映射表窗口類:DefWndProc(.)執(zhí)行消息處理函數(shù)命令消息或控件消息處理找到消息處理函數(shù)yesnoyesno8/4/2022129第129頁,共311頁。窗口消息的處理OnWndMsg()搜索窗口類的消息映射表,如果找到了匹配的消息處理函數(shù),就執(zhí)行消息處理函數(shù) 如果找不到,繼續(xù)搜索該窗口類的基類,如果找到了匹配的消息處理函數(shù),就執(zhí)行消息處理函數(shù);如果還沒有找到,則把消息交給默認窗口函數(shù)DefWindowProc()處理 8/4/2022130第130頁,共311頁。如何處理命令消息從理論上講,所有從基類 CCmdTarget類派生的類均可處理命令消息,MFC應(yīng)用程序
41、框架將依次檢查基本類的消息映射表。視圖類文檔類文檔模板類框架窗口類應(yīng)用程序類界面變灰8/4/2022131第131頁,共311頁。命令消息的處理OnWndMsg()函數(shù)會將命令消息分發(fā)給窗口類的OnCommand()函數(shù)OnCommand()函數(shù)調(diào)用成員函數(shù)OnCmdMsg()函數(shù),該函數(shù)依次搜索視圖類、文檔類、文檔模板類、框架窗口類和應(yīng)用程序類及其基類中的消息映射表,搜索到消息處理函數(shù),搜索到消息處理函數(shù)則執(zhí)行消息處理函數(shù)如果全部查找完畢,依然不能處理,則該命令消息所對應(yīng)的界面元素變灰。 8/4/2022132第132頁,共311頁。如何處理控件消息OnWndMsg(.)OnNotify(.
42、) 控件窗口類處理消息控件窗口類能處理?控件的父 窗口類: OnWndMsg(.)yesno8/4/2022133第133頁,共311頁??丶⒌奶幚戆严⒔唤o控件所屬的類,如果能夠處理,執(zhí)行消息處理函數(shù)如果控件所屬的類不能處理,調(diào)用控件的父窗口對應(yīng)類的OnCmdMsg(),搜索父窗口對應(yīng)類的消息映射表,以獲得處理該消息的函數(shù)8/4/2022134第134頁,共311頁。自定義窗口消息 的方法自定義靜態(tài)窗口消息通過指定窗口消息對應(yīng)的整數(shù)值來獲得自定義窗口消息自定義動態(tài)窗口消息通過定義一個字符串名稱來定義 一個窗口消息8/4/2022135第135頁,共311頁。自定義靜態(tài)窗口消息首先在為類實
43、現(xiàn)文件中定義消息#define WM_MYMESSAGE WM_USER+100在類中聲明消息處理函數(shù)Afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam)在類的消息映射表中加入映射項ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)在類上實現(xiàn)消息處理函數(shù) 使用SendMessage函數(shù)或PostMessage發(fā)送消息pView-SendMessage(WM_MYMESSAGE,0L,0L);8/4/2022136第136頁,共311頁。自定義動態(tài)窗口消息首先定義并注冊消息#define MESSAGE_NAME
44、“2001-8-1-THIS-IS-A-MESSAGE-TEST”UINT WM_MYMESSAGE=:RegisterWndMessage(MESSAGE_NAME) 在類中聲明消息處理函數(shù)在類的消息映射表中加入映射項在類實現(xiàn)文件中實現(xiàn)消息處理函數(shù)使用SendMessage函數(shù)或PostMessage函數(shù)發(fā)送消息8/4/2022137第137頁,共311頁。任務(wù)3實驗3實驗48/4/2022138第138頁,共311頁。第四章資源和資源編輯器資源符號和資源編輯器菜單的使用工具欄的使用狀態(tài)欄的使用第139頁,共311頁。資源加速鍵(Accelerator)位圖(Bitmap)光標(Cursor
45、)對話框(Dialog)圖標(Icon)菜單(Menu)字符串表(String Table)工具欄(Toolbar)版本信息(Version Information)8/4/2022140第140頁,共311頁。資源符號View/Resource Symbol類 別 資源符號前綴 代表的資源或?qū)ο?資源IDR_IDD_IDC_IDI_IDB_ 加速鍵或菜單對話框資源光標資源圖表資源位圖資源 菜單項命令控制 IDM_ID_IDC_ 菜單項命令項控件 字符串IDSIDP_ 字符串表中的字符串消息框中使用的字符串 8/4/2022141第141頁,共311頁。資源編輯器的公共操作查看資源使用資源模板
46、導入和導出資源查看和編輯屬性頁8/4/2022142第142頁,共311頁。創(chuàng)建新資源Insert/Resource8/4/2022143第143頁,共311頁。保存和刪除資源Resource View|*File|Save AllDelete鍵直接刪除8/4/2022144第144頁,共311頁。菜單編輯器的使用創(chuàng)建標準菜單和命令創(chuàng)建彈出命令設(shè)置快捷鍵、加速鍵和菜單命令項的狀態(tài)欄消息移動菜單命令8/4/2022145第145頁,共311頁。加速鍵編輯器的使用增加、刪除、改變和瀏覽加速鍵列表瀏覽并改變加速鍵表資源ID將一個加速鍵與一個菜單命令相聯(lián)系8/4/2022146第146頁,共311頁。
47、工具欄編輯器的使用創(chuàng)建工具欄和按鈕將位圖轉(zhuǎn)化為工具欄資源創(chuàng)建、移動和編輯工具欄按鈕8/4/2022147第147頁,共311頁。版本信息編輯器的使用文本框的編輯8/4/2022148第148頁,共311頁。字符串編輯器的使用查找、增加、刪除一個字符串移動一個字符串到另一個段移動一個字符串到另一個資源文件(*.rc)改變一個字符串或它的ID增加格式或特殊字符到一個字符串8/4/2022149第149頁,共311頁。圖形編輯器繪制位圖、圖標、鼠標繪制工具欄位圖8/4/2022150第150頁,共311頁。任務(wù)1文本編輯器的使用詳見例418/4/2022151第151頁,共311頁。菜單的類型頂層菜
48、單(top-level menu)彈出菜單(pop-up menu)下拉菜單(Drop-down menu)子菜單(Submenu)快捷菜單(Shortcut menu)CObjectCMenu8/4/2022152第152頁,共311頁。菜單編輯器的操作插入菜單項插入分割線增加子菜單刪除菜單項調(diào)整菜單項位置屬性對話框的填寫IDCaptionPrompt8/4/2022153第153頁,共311頁。 菜單消息命令的處理WMCOMMANDClassWizard8/4/2022154第154頁,共311頁。 更新菜單命令的處理UPDATE_COMMAND_UICCmdUI類及成員函數(shù)EnableS
49、etCheckSetRadioSetText用戶在選擇有些菜單命令時,希望看到選擇留下的痕跡8/4/2022155第155頁,共311頁。任務(wù)2更新菜單項舉例詳見例428/4/2022156第156頁,共311頁。任務(wù)3使用快捷菜單增加一個快捷菜單快捷菜單命令項命令處理函數(shù)詳見例43使用Component Gallery增加一個快捷菜單 8/4/2022157第157頁,共311頁。任務(wù)4在對話框應(yīng)用程序中添加菜單欄詳見實驗38/4/2022158第158頁,共311頁。工具欄和狀態(tài)欄CToolBarCStatusBarCMainFrame:OnCreateCObjectCCmdTargetC
50、WndCControlBarCToolBarCStatusBar8/4/2022159第159頁,共311頁。默認工具欄源代碼剖析定義工具欄成員變量CToolBar m_wndToolBar 創(chuàng)建工具欄窗口加載工具欄資源設(shè)置工具欄??刻匦栽O(shè)置框架窗口停靠特性把工具欄??吭诳蚣艽翱诘木唧w位置8/4/2022160第160頁,共311頁。自定義工具欄的創(chuàng)建創(chuàng)建一個工具欄資源定義一個CToolBar的對象調(diào)用CToolBar:Create創(chuàng)建工具欄窗口調(diào)用CToolBar:LoadToolBar裝載工具欄資源例448/4/2022161第161頁,共311頁。任務(wù)5生成兩個自定義的工具欄詳見實驗18
51、/4/2022162第162頁,共311頁。默認狀態(tài)欄源代碼剖析定義狀態(tài)欄成員變量CStatusBarm_wndStatusBar窗格數(shù)組CStatusBar:Create創(chuàng)建狀態(tài)欄窗口CStatusBar:SetIndicator設(shè)置窗格8/4/2022163第163頁,共311頁。修改狀態(tài)欄的窗格刪除一個窗格移動一個窗格添加一個窗格創(chuàng)建一個dummy menu菜單資源標識窗格在Indicator數(shù)組中增加窗格資源創(chuàng)建窗格ID的命令更新處理程序8/4/2022164第164頁,共311頁。任務(wù)6在狀態(tài)欄添加時間顯示詳見例458/4/2022165第165頁,共311頁。第5章圖形和文本輸出圖
52、形設(shè)備接口CGdiObject對象CDC文本處理繪圖處理第166頁,共311頁。圖形設(shè)備接口GDI(graphics device interface)矢量圖形創(chuàng)建線和填充圖形光柵圖形位圖文本輸出以邏輯坐標為單位計算文本輸出位置8/4/2022167第167頁,共311頁。繪圖工具GDI對象GdiObjectCGdiObject是一個抽象類,該類不能直接定義對象。必須使用它的派生類8/4/2022168第168頁,共311頁。設(shè)備上下文DCdevice contextGDI創(chuàng)建用來代表設(shè)備連接的數(shù)據(jù)結(jié)構(gòu)主要功能:允許應(yīng)用程序使用一個輸出設(shè)備提供窗口應(yīng)用程序,設(shè)備驅(qū)動,和輸出設(shè)備之間的連接保存當
53、前信息,例如在一個窗口內(nèi)繪圖使用的顏色,畫筆的寬度、畫刷的類型等等保存窗口剪取區(qū)域(clipping region),限制程序輸出到輸出設(shè)備中窗口覆蓋的區(qū)域8/4/2022169第169頁,共311頁。設(shè)備上下文類CDCCObjectCDCCClientDCCMetaFileDCCPanitDCCWindowDC8/4/2022170第170頁,共311頁。OnDraw函數(shù)void CMyView:OnDraw(CDC* pDC)CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native da
54、ta here pDC-TextOut(1,1,”hello world!”);8/4/2022171第171頁,共311頁。WM_PAINT消息產(chǎn)生WM_PAINT消息的場合通常有 窗口移動后及最大化,最小化后的刷新。 被覆蓋區(qū)域的刷新,如下拉菜單覆蓋的區(qū)域。 無效區(qū)域產(chǎn)生后的刷新,如執(zhí)行滾動條操作,將一區(qū)域移動至不可見。 8/4/2022172第172頁,共311頁。WM_PAINT消息人為地生成一個繪制消息,重繪窗口 的方法:Invalidate(true); CRect rect(1,1,300,300); InvalidateRect(&Rect, true);8/4/2022173
55、第173頁,共311頁。獲取設(shè)備上下文 的方法接受一個參數(shù)為指向CDC對象的指針 void CMyView:OnDraw(CDC* pDC); 構(gòu)造CClientDC對象 CClientDC dc(this); 8/4/2022174第174頁,共311頁。接受一個參數(shù)為指向CDC對象的指針void CMyView:OnDraw(CDC* pDC)CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here /在坐標為10,10的位置上畫一點,顏色黑色 pDC-SetPixe
56、l(CPoint(10,10),RGB(0,0,0); 參數(shù)為指向CDC對象的指針8/4/2022175第175頁,共311頁。構(gòu)造CClientDC對象構(gòu)造CClientDC對象 Void CMyView:OnLButtonDown(UNIT nFlags,CPoint point)/ TODO: add draw code for native data here CClientDC dc(this); /this 指針將CMyView賦值給創(chuàng)建的dc對象 dc.SetPixel(point,RGB(255,0,0);CView: OnLButtonDown( nFlags,point);
57、 8/4/2022176第176頁,共311頁。任務(wù)1編寫一個單文檔MFC(EXE)程序,在視圖類增加成員變量,追蹤鼠標的左鍵雙擊位置的坐標,并輸出詳見例5-1 8/4/2022177第177頁,共311頁。處理文本 設(shè)置文本顏色 設(shè)置文本顯示屬性 設(shè)置字體 格式化文本 文本輸出函數(shù) 圖形和文本并沒有明顯的界限8/4/2022178第178頁,共311頁。設(shè)置文本顏色COLORREF SetTextColor(COLORREF crColor); COLORREF SetBkColor(COLORREF crColor); 8/4/2022179第179頁,共311頁。顏色的表示8/4/202
58、2180第180頁,共311頁。/基本三元色COLORREF crRed=RGB(255,0,0);COLORREF crGreen=RGB(0,255,0);COLORREF crBlue=RGB(0,0,255)/ 16-color設(shè)備支持顏色const COLORREF g_crBlack = RGB(0,0,0);const COLORREF g_crYellow = RGB(255,255,0);const COLORREF g_crDkYellow = RGB(128,128,0);const COLORREF g_crRed = RGB(255,0,0);const COLORR
59、EF g_ crDkRed = RGB(128,0,0);const COLORREF g_crMagenta = RGB(255,0,255);const COLORREF g_ crDkMagenta = RGB(128,0,128);const COLORREF g_crBlue= RGB(0,0,255);const COLORREF g_ crDkBlue = RGB(0,0,128); 8/4/2022181第181頁,共311頁。void CMyView:OnDraw(CDC* pDC)CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc)
60、;pDC-SetTextColor(RGB(255,0,0);pDC-SetBkColor(RGB(0,0,0);CString str; str.Format(鼠標左鍵雙擊的位置是%d,%d,m_LPoint.x, m_LPoint.y); pDC-TextOut(0,0,str); 8/4/2022182第182頁,共311頁。設(shè)置文本顯示屬性 函數(shù)說明SetBkModeGetBkMode設(shè)置和獲取背景模式SetTextAlignGetTextAlign設(shè)置和獲取對齊方式SetTextJusttification SetTextCharaterExtra調(diào)整文本8/4/2022183第18
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 化學反應(yīng)與能量變化說課稿
- 紅眼睛綠眼睛說課稿
- 肥胖癥的預防及其治療
- 電器廠采光井施工合同
- 寵物行業(yè)稅務(wù)管理
- 企業(yè)品牌宣傳租賃合同
- 電商推廣違約承諾書
- 化工原料出口招投標實習報告
- 酒店會議室建設(shè)施工合同建筑膜
- 教育設(shè)施招投標流程在線檢驗
- 保安培訓記錄內(nèi)容
- 公務(wù)快艇常規(guī)安全
- 案例l五項目三:電動天窗系統(tǒng)的檢測與故障排除
- 高中生活如何啟航 課件 2023-2024學年高一主題班會
- 電力職業(yè)病防控
- 《互聯(lián)網(wǎng)的應(yīng)用》課件
- 2024年培養(yǎng)皿相關(guān)項目可行性分析報告
- 2024山東能源集團高校畢業(yè)生校園招聘筆試參考題庫附帶答案詳解
- 初中九年級美術(shù)期末藝術(shù)測評指標試卷及答案
- 新能源科學與工程專業(yè)職業(yè)生涯規(guī)劃
- 高考作文等級評分標準
評論
0/150
提交評論