VC 程序设计初步解读.ppt

上传人:本田雅阁 文档编号:3098569 上传时间:2019-07-08 格式:PPT 页数:265 大小:13.24MB
返回 下载 相关 举报
VC 程序设计初步解读.ppt_第1页
第1页 / 共265页
VC 程序设计初步解读.ppt_第2页
第2页 / 共265页
VC 程序设计初步解读.ppt_第3页
第3页 / 共265页
VC 程序设计初步解读.ppt_第4页
第4页 / 共265页
VC 程序设计初步解读.ppt_第5页
第5页 / 共265页
点击查看更多>>
资源描述

《VC 程序设计初步解读.ppt》由会员分享,可在线阅读,更多相关《VC 程序设计初步解读.ppt(265页珍藏版)》请在三一文库上搜索。

1、任课教师信息,姓名: 钟樑 手机: 15708318765(618765) Email: ,Visual C+学习参考,学习步骤: 1、掌握C+的核心知识:继承、派生、多态性。 2、熟悉利用API进行WINDOWS开发的基本原理,如消息映射。 3、学习MFC程序开发,多利用MSDN或者网上资源进行自学。 4、细分方向的开发,如图形图像方面。,参考资料: 1、MSDN 2、MFC程序设计第二版,清华大学出版社。 3、深入浅出MFC,华东理工大学出版社。 4、, ,Visual C+简介,Visual Studio是一种集成开发环境,其提供了包括Visual C+, Visual Basic, C

2、#, ASP.NET, SQL Server Express在内的多项开发功能。,Visual C+是Visual Studio的一个子集,其不是一门语言,而是多种开发技术的合集,主要包括:,1) Win32 API (Windows SDK开发) 2) Win32 Console (传统C/C+开发) 3) MFC(Microsoft Foundation Classes) 4) ATL(Active Template Library),Visual C+简介,Visual C+功能:,WEB控件:如银行的各种安全控件、甚至各种流氓控件。,通信的程序:聊天工具如QQ、BT下载工具、视频点播工

3、具等。,图形图像处理:Visual C+在图形图像处理上有先天的优势,可以说是图形图像处理领域的唯一选择。,游戏开发:Visual C+可以很方便的调用OpenGL和DirectX,是游戏开发的首选工具。,底层开发及二次开发:Visual C+有强大的底层开发功能,并能很方便为其它设计软件进行二次开发,如AutoCAD, TransModel。,Visual C+简介,利用VC编制windows程序主要有两种方法: (1)SDK ( Software Development Kit )软件开发工具包 (2)MFC(Microsoft Foundation Class Library)微软基本类

4、库,传统的结构化WINDOWS程序开发(SDK):,SDK的编程方式就是传统的C的编程方式。通过调用库函数 (win32API,也就是 Application Programming Interface,即 操作系统留给应用程序的一个调用接口)来实现程序的搭建。,优点在于:程序比较小, 效率高。,缺点在于:无框架化结构,API函数混乱,实现一个简单窗 口程序就需要上百行代码。,Visual C+简介,MFC程序开发:,MFC是面向对象程序设计与Application framework的完美结合。 它是把Win API进行封装的类库,是一个类的集合。它通过覆盖 Window API,为编程提供

5、了一个面向对象的界面。,优点在于:利用C+面象对象的特性进行编程,提供了一般性框架,大大缩短开发时间,易于实现代码移植,而且使得用户界面元素的编写变得容易起来。,缺点在于:封装复杂,细节隐藏过深,入门难度大,且不便于全面掌握其内部机理。,面向对象概念回顾,1、类,基本格式: class 类名称 public: 公有成员 protected: 保护型成员 private: 私有成员 ;,类成员函数声明的一般形式: 返回类型 函数名(形参表); 类成员函数定义的一般形式(类外定义): 返回类型 类名:函数名(形参表) /函数体 ,类属性(成员变量)的申明 同普通变量申明一致,面向对象程序设计复习,

6、2、类的构造函数,构造函数的作用: 用于在对象创建时,对对象的属性进行初始化。 构造函数的特点: 是一个函数,但没有返回值类型。 是一个和类名同名的函数。 只在对象创建时,自动地被编译器调用。 其它特征和普通函数相同,可以重载(即可以有多个版本的构造函数)。,面向对象程序设计复习,构造函数的一般声明方式: 类名(形参表); 构造函数的一般实现方式: 类名:类名(形参表) /函数体; 构造函数的另一种实现方式: 类名:类名(形参表) : 初始化列表 /函数体; 初始化列表形式: 属性(值或形参),属性(值或形参),面向对象程序设计复习,3、类的析构函数,析构函数的作用: 用于在对象生命期结束后,

7、对对象占用的内存进行清理工作。 析构函数的特点: 是一个函数,但没有返回值类型。 是一个在“类名”前加上“”符号的函数。 只在对象生命期结束时,自动地被编译器调用。 析构函数一个类中只能有一个,且不能重载。,面向对象程序设计复习,4、this指针,指向当前对象的指针。,例:Point类为例 void main() Point pt3; for(int id = 0; id 3; id+) ptid.SetX(id); ptid.SetY(id); ,void Point:SetX(int newX) m_iX = newX; ,谁的m_iX?怎么确定的?,void Point:SetX(int

8、 newX) this-m_iX = newX; ,面向对象程序设计复习,(类的)继承:一个新类从已有的类那里获得其已有的特性(属性和方法)。 获得方:子类或派生类 给予方(被获得方):父类或基类 继承的关系: 继承是一种“是一个(is-a)”的关系。 即如果一个子类B继承了父类A,我们可以说B是一个A。,5、继承的概念,面向对象程序设计复习,派生类的一般申明形式: class 类名 : 继承控制 基类名 /类声明 ;,6、基类和派生类的申明,基类的申明同一般类的申明方式。,可以是public, private, protected;,注意:基类的属性和方法在派生类中都保存了相应的一份拷贝,面

9、向对象程序设计复习,7、多重继承,派生类可以继承自多个类,一般申明形式: class 类名 : 继承控制 基类名, 继承控制 基类名, ,8、继承情况下的构造,派生类负责基类的构造 派生类利用初始化列表构造基类的属性。 派生类总是负责直接基类的构造。 有多个基类的情况下,派生类对基类的构造顺序取决于继承顺序,先继承的先构造,最后构造自身。析构顺序与此相反。,9、派生类和基类的关系以及安全赋值问题:,派生类和基类的关系为”is-a”的关系,即: 派生类是一个基类,面向对象程序设计复习,派生类的对象可以通过多种方式安全的赋值给基类,1)、派生类对象可以直接赋值给基类对象。,2)、派生类对象可以初始

10、化给基类的引用。,3)、派生类对象可以初始化给基类的指针。,动态绑定,静态绑定,基类的对象却无法安全的赋值给派生类,面向对象程序设计复习,10、虚函数与多态,虚函数的形式: virtual 成员函数申明,虚函数的意义:该成员函数在派生类中会有不同的实现方式, 即该行为因类型不同有不同的表现方法(多态),多态的使用:,第一步:必须存在继承关系。,第二步:需要表现出多态性的成员方法必须声明为基类的虚函数。,第三步:在派生类中将从基类继承而来的虚函数按照需求进行重新定义。,第四步:将派生类的对象赋值给基类的引用或者指针,第五步:通过该基类的引用或者指针调用相应的虚函数,就能根据对应的派生类表现出相应

11、的行为。,面向对象程序设计复习,11、虚函数的注意事项,几乎所有的成员函数都可以申明为虚函数(包括析构函数),但构造函数不能申明为虚函数(包括拷贝构造函数。),12、纯虚函数与抽象类,纯虚函数:一个必须由派生类实现的基类的成员方法,其实质是一个“占位符”。作用是告诉该基类的派生类,此方法必须由派生类实现。 声明方法: 虚成员函数声明 = 0; 如: virtual void GoToSchool() = 0; 抽象类:即包含了纯虚函数的类。 注意:抽象类不能实例化(即不能定义对象),面向对象程序设计复习,13、new和delete:,在堆上申请和释放内存,new的一般格式: new 类型(初值

12、) 或 new 类型数量,delete的一般格式: delete 指针 或 delete 指针,1)、必须成对使用,2)、new和delete在创建和删除对象的时候会自动调用类的构造函数和析构函数。,WINDOWS程序设计基础,基本概念: Windows程序设计是完全不同于Dos环境下的程序设计,是一种事件驱动的程序设计方法。主要是基于消息的。当用户需要完成某种功能时,会调用操作系统的某种支持,操作系统将用户的需要包装成某种消息,并投递到消息队列当中。然后利用应用程序从消息队列中取走消息并进行响应。,消息:指Windows发出的一个通知,告诉应用程序某个事情发生了, 每一次键盘按键,鼠标单击,

13、窗口更新都会产生消息。,程序中的消息:在WINDOWS开发中,一个消息被定义成了一个结构体,typedef Struct tagMsg / MSG;,WINDOWS程序设计基础,MSG的内部结构,typedef struct tagMSG / msg HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; MSG;,/消息来源的窗口句柄,/消息ID,/消息的附加参数,/消息产生的时间,/消息产生的窗口位置,其为消息的实质,通常为WM_XXX的样式,/如鼠标消息,WINDOWS程序设计基础,消息队列

14、:,操作系统会为每个应用程序建立一个消息队列。这个队列是个先进先出的缓冲区:,消息响应:当应用程序收到消息的时候,针对这个消息的进行处理的过程就叫消息响应。,消息1,消息2,消息n,消息产生,消息响应,消息响应是通过程序实现的,这也是Windows应用程序的主 要代码区。,WINDOWS程序设计基础,消息的传递机制:,检索队列中是否存在消息,属于某一个窗口,WINDOWS程序设计基础,窗口:窗口是屏幕上的一个矩形区域,WINDOWS程序设计基础,句柄(HANDLE):资源的标识,句柄,是整个windows编程的基础。一个句柄是指一个用来标志应用程序中的不同对象和同类对象中的不同的实例的唯一存在

15、的32位整数值,其特性类似一个地址。,在Windows编程中,句柄可以看做是相关资源或实例,如一个窗口,按钮,图标,滚动条,输出设备,控件或者文件等,的唯一标示。句柄在Windows编程中,大量使用,如,HINSTANCE(实例句柄) HBITMAP(位图句柄) HDC(设备描述表句柄) HICON(图标句柄),实际上,WINDOWS编程中的所有句柄均统一为:HXXX,WINDOWS程序设计基础,WINDOWS自定义类型简介:,为了维护方便,WINDOWS将C/C+的内建类型都进行了重新定义,其一般定义规则为: typedef type TYPE;,如:int对应 INT, char对应CHA

16、R,float对应FLOAT,同时,WINDOWS还按照匈牙利命名法的相关规则对相关类型指针进行了重新定义,如LPSTR, PBYTE等。另外,WINDOWS还按照需要重新定义了一些类型,如WPARAM, LPARAM, WORD等,其实质也是内建类型的重命名。,参考:ms-help:/MS.VSCC.v90/MS.MSDNQTR.v90.chs/winprog/ winprog/windows_data_types.htm,WINDOWS程序设计基础,UNICODE简介:,传统的英文字符采用的是ASCII编码,但A的意思是American,这也是ASCII编码最大的问题。而要表示中文、日语在

17、内的东方语系,ASCII就不能满足要求,这时候引入了双字节的UNICODE码。,a,97,97,00,ASCII,UNICODE,char c = a,wchar_t c = a,“abc”,char* p = “abc”;,wchar_t* p =L “abc”;,WINDOWS程序设计基础,C/C+语言的UNICODE类型以及对应函数:,定义头文件:wchar.h,strlen,strcat,strcpy,strcmp,ASCII版,UNICODE版,getc,wcslen,wcscat,wcscpy,wcscmp,getwc,ASCII版,UNICODE版,putc,putwc,putc

18、har,putwchar,getchar,getwchar,printf,wprintf,sprintf,wsprintf,类型:wchar_t,实质:typedef unsigned short wchar_t,WINDOWS程序设计基础,练习:请定义两个UNICODE字符串,并将大的字符串连接到小的字符串后面。,wchar_t* p1 = L”Hello”; wchar_t* p2 = L”my class”; int newLength = wcslen(p1) + wcslen(p2); wchar_t* p3 = new wchar_tnewLength + 1; if(wcscmp

19、(p1, p2) wcscpy(p3, p2); wcscat(p3, p1); ,else wcscpy(p3, p1); wcscat(p3, p2); ,WINDOWS程序设计基础,WINDOWS程序中的UNICODE类型:,TCHAR:解决通用的关键,WINDOWS使用了一个预定义宏来解决可能存在的ASCII和UNICODE不通用问题,TCHAR!,#ifdef UNICODE typedef wchar_t TCHAR #else typedef char TCHAR,同时,为了简便操作,还定义了一个更简短的宏 _T / _TEXT,来表示一个通用字符串,来源: #define _T

20、(x) _T(x),UNICODE: #define _T(x) L#x ASCII: #define _T(x) x,WINDOWS程序设计基础,例:一个TCHAR数组,TCHAR t10 = _T(“abcde”);,TCHAR t10 = a, b, c, d, e;,t5 = d;,TCHAR* p = _T(“Hello”);,int len = lstrlen(p);,TCHAR* q = _T(“ World”); lstrcat(p, q);,WINDOWS定义了一系列的操作TCHAR的函数: lstrlen lstrcpy lstrcpyn lstrcat lstrcmp,W

21、INDOWS程序设计基础,WINDOWS程序中的定义的其他UNICODE类型:,PCHAR, LPCH, PCH, LPSTR , PSTR = CHAR*(char*),LPCCH, PCCH, LPCSTR, PCSTR = CONST CHAR*,PWCHAR, LPWCH, PWCH, LPWSTR, PWSTR= WCHAR*,LPCWCH, PCWCH, LPCWSTR, PCWSTR = CONST WCHAR CHAR*,LPCTSTR = CONST TCHAR*,LPTSTR = TCHAR*,WINDOWS程序设计基础,WINDOWS SDK程序设计,WINDOWS程序设

22、计基础,例:一个完整的程序Hello Windows SDK,WINDOWS程序设计基础,程序源代码:,/helloWin.cpp,#include #include #pragma comment(lib, “Winmm.lib“) LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int iCmdShow) ,/申明消息处理函数,/WinMain函数入口,原型查阅MSD

23、N,/调用lib, 为了声音,WINDOWS程序设计基础,static TCHAR szAppName = _T(“Hello“); HWND hWnd; MSG msg; WNDCLASS wndClass; wndClass.style = CS_HREDRAW | CS_VREDRAW; wndClass.lpfnWndProc = WndProc; wndClass.cbClsExtra = 0; wndClass.cbWndExtra = 0; wndClass.hInstance = hInstance; wndClass.hIcon = LoadIcon(NULL, IDI_AP

24、PLICATION); wndClass.hCursor = LoadCursor(NULL, IDC_ARROW); wndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndClass.lpszMenuName = NULL; wndClass.lpszClassName = szAppName;,/程序名,/窗口句柄,/消息结构体,/窗口结构体,/窗口模式初始化,/窗口过程函数,/窗口实例句柄,/读取图标,/读取光标,/窗口背景设为白色,/设置菜单,/设置窗口类名,WINDOWS程序设计基础,if(!Register

25、Class(,/注册窗口,/创建窗口,/程序名和窗口名,/窗口样式,/x和y坐标,/高度和宽度,/父窗口句柄,/菜单句柄,/实例句柄,/附加参数,WINDOWS程序设计基础,ShowWindow(hWnd, iCmdShow); UpdateWindow(hWnd); while(GetMessage( /WinMain End,/显示窗口,/更新窗口, 发送WM_PAINT,/消息循环,WINDOWS程序设计基础,LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) HDC hdc; P

26、AINTSTRUCT ps; RECT rect; switch /代码见下页 return DefWindowProc(hWnd, message, wParam, lParam); ,/定义一个设备上下文句柄,/定义一个绘制结构体,/矩形区域,/消息处理,见下页,/默认的消息处理函数,WINDOWS程序设计基础,switch(message) case WM_CREATE: PlaySound(_T(“hello.wav“), NULL, SND_FILENAME | SND_ASYNC); return 0; case WM_PAINT: hdc = BeginPaint(hWnd, ,

27、/对消息进行处理,/处理WM_CREATE消息,/处理WM_PAINT消息,/关闭窗口消息,WINDOWS程序设计基础,入口函数:WinMain,int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd ),当前实例,之前实例,命令行,窗口显示模式,实例句柄,字符串,typedef char* LPSTR,如同C/C+的Main函数一样,WinMain代表了一个WINDOWS程序的入口点,其样式必须保持不变。,WINDOWS程序设计基础,WINDOWS程序设计基

28、本流程: 1、设计窗口,typedef struct _WNDCLASS UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; HICON hIcon; HCURSOR hCursor; HBRUSH hbrBackground; LPCTSTR lpszMenuName; LPCTSTR lpszClassName; WNDCLASS;,窗口类型,窗口过程函数指针,当前应用程序句柄,图标句柄,光标句柄,背景画刷句柄,窗口类名,WNDCLASS wc; /初始化相关字段,WIN

29、DOWS程序设计基础,2、注册窗口,RegisterClass(,3、创建窗口,HWND CreateWindow( LPCTSTR lpClassName, /已注册的窗口类的名字 LPCTSTR lpWindowName, / 窗口的名字,即标题栏上显示的文字 DWORD dwStyle, / 窗口的类型 int x, / 窗口显示时左上角的x坐标 int y, /窗口显示时左上角的y坐标 int nWidth, / 窗口宽度 int nHeight, / 窗口高度 HWND hWndParent, / 父窗口的句柄 HMENU hMenu, / 菜单的句柄 HINSTANCE hInst

30、ance, / 实例的句柄 LPVOID lpParam / 与窗口相关的附加参数 );,HWND hwnd = CreateWindow();,WINDOWS程序设计基础,4、显示和更新窗口,ShowWindow(hWnd,iShowCmd);,创建好的窗口句柄,显示状态,UpdateWindow(hWnd);,5、开始消息循环,MSG msg; while(GetMessage( /分派消息 ,来源于WinMain参数,有3种状态: SW_SHOWNORMAL, SW_SHOWMAXMIZED, SW_SHOWMINNOACTIVE,WINDOWS程序设计基础,消息循环相关函数:,BOOL

31、 GetMessage( LPMSG lpMsg, / 消息 HWND hWnd, / 哪个窗口的消息队列 UINT wMsgFilterMin, / 消息的最小值 UINT wMsgFilterMax / 消息的最大值 );,1) GetMessage:负责从消息队列中获取消息,消息过滤,2) TranslateMessage:翻译消息,BOOL TranslateMessage( const MSG *lpMsg );,例:键盘按下某个键会产生WM_KEYDOWN消息,但是要知道到底按下的那个键,需将按键信息的ASCII码插入消息,并翻译为WM_CHAR消息进行处理。,WINDOWS程序设

32、计基础,2) DispatchMessage :分发消息,DispatchMessage函数的作用是将收到的消息传给窗口的回调函 数(CallBack Function),即窗口过程函数去处理。这个窗口过程 函数就是在设计窗口类时指定的。,回调函数的概念:,回调函数是一个由开发者实现,但交由系统自动调用的函数。 其往往通过函数指针的方式赋值给某个其它函数或者数据结构 作为参数。窗口过程函数是一个典型的回调函数。,WINDOWS程序设计基础,6、窗口过程函数(消息处理)。,函数原型:LRESULT CALLBACK FuncName( HWND hWnd, UINT msg, WPARAM wP

33、aram, LPARAM lParam ),所属窗口,消息,附加参数,内部结构:,switch(msg) case WM_XXX: /Do something; / return DefWindowProc(hWnd, Msg, wParam, lParam);,函数名自定,实际是一个unsigned int,MFC程序设计基础,MFC程序设计,从向导生成开始:,选择MFC应用程序,MFC程序设计基础,直接下一步,MFC程序设计基础,选择应用程序类型:这里使用单文档,这里调节样式,MFC程序设计基础,这里可以设置扩展名,标题等,MFC程序设计基础,数据库支持,这里不选择,MFC程序设计基础,添

34、加高级功能,这里不更改,MFC程序设计基础,查看向导生成的类,并可根据需要进行更改,MFC程序设计基础,运行结果,MFC程序设计基础,向导生成的程序清单和类清单:,MFC程序设计基础,如果把这里改成CEditView,MFC程序设计基础,可见,利用MFC进行WINDOWS程序设计,相比SDK来说要方便的多,但问题是MFC有SDK编程那种清晰结构吗?,MFC程序设计基础,MFC中消失的WinMain,试图在项目中寻找WinMain,会得到以下结果,难道MFC中没有入口点函数吗?,MFC的类层次结构,MFC是一个用面向对象进行封装后的类层次结构,MFC的类层次结构,MFC9.0的所有类,ms-he

35、lp:/MS.VSCC.v90/MS.MSDNQTR.v90.chs /dv_vclib/html/19d70341-e391-4a72-94c6- 35755ce975d4.htm,MFC的类层次结构解析,从CWinApp派生出了CMyApp,代表应用程序本身。,从CView派生出了CMyView,代表一个视图窗口。,从CFrameWnd派生出了CMyFrameWnd,代表一个框架窗口。,线程类,实际上一个应用程序就等于一个线程。,消息映射,MFC的类层次结构解析,virtual BOOL InitInstance(); virtual BOOL Run(),virtual BOOL Ini

36、tInstance(); virtual BOOL Run() virtual BOOL InitApplication();,virtual BOOL InitInstance();,问题的关键:MFC程序怎么开始的呢?,MFC程序的生死循环,1、MFC程序的活水源头,CMyWinApp的全局对象。,2、链接期隐式链接的WinMain函数。,/in APPMODUL.CPP,#define _tWinMain WinMain;,MFC程序的生死循环,3、 真正的入口点,多态的威力:AfxWinMain(),/in WINMAIN.CPP, AfxWinMain简略版 AfxWinMain()

37、 CWinApp* pApp = AfxGetApp(); pApp-InitApplication(); pApp-InitInstance(); pApp-Run(); AfxWinTerm(); ,获取全局对象,由于CWinApp重写,所以调用的是CWinApp的版本。,由于CMyApp重写了InitInstance(),所以调用的是CMyApp的版本。,MFC程序的生死循环,3.1 InitInstance,窗口的设计、注册与创建,/DOCTEMPL.CPP的264行 CFrameWnd* pFrame = (CFrameWnd*)m_pFrameClass-CreateObject(

38、); 在这个函数内会通过new算子创建框架类CMainFrame。,/DOCTEMPL.CPP的277行 pFrame-LoadFrame(m_nIDResource, WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE, NULL, &context),在这个函数内完成窗口类的注册,产生主窗口并加挂菜单等诸元素,并指定 窗口标题、文件标题、文件扩展名等。,MFC程序的生死循环,3.2 InitInstance,窗口的显示和更新,m_pMainWnd是一个定义在CWinThread中的public成员,类型为CFrameWnd/CFrameWndEx;,MFC程序的生死循

39、环,4、隐晦的消息循环,pApp-Run();,/in ThredCore.cpp, Run简单版,由于派生类没有重写过Run(),所以这里调用的是CWinThread 的版本。,BOOL CWinThread:Run() do GetMessage(); TranslateMessage(); DispathMessage(); While(PeekMessage(),MFC程序的生死循环,5、 不存在的窗口过程函数,取而代之的消息映射,消息映射的基本使用方法:,DECLARE_MESSAGE_MAP(),申明消息映射,BEGIN_MESSAGE_MAP(类名, 基类名) / 消息映射 EN

40、D_MESSAGE_MAP(),开始消息映射,结束消息映射,6,程序的结束:,AfxWinTerm();,MFC程序的生死循环,不用向导生成MFC程序:,第一步:包含头文件,第二步:从CWinApp派生出CMyApp,重载虚函数InitInstance();,class CMyApp : public CWinApp public: virtual BOOL InitInstance(); ,第三步:从CFrameWnd派生出CMyWnd,实现构造函数以创建窗口。,MFC程序的生死循环,class CMyWnd : public CFrameWnd public: CMyWnd(); ;,第四

41、步:为CMyWnd添加消息映射。,DECLARE_MSG_MAP(),BEGIN_MSG_MAP(CMyWnd, CFrameWnd) END_MSG_MAP(),ON_WM_PAINT(),afx_msg void OnPaint();,MFC程序的生死循环,代码清单:,/ in helloMFC.h,#include class CMyApp : public CWinApp public: virtual BOOL InitInstance(); ;,class CMyWnd : public CFrameWnd public: CMyWnd(); afx_msg void OnPain

42、t(); DECLARE_MESSAGE_MAP(); ;,MFC程序的生死循环,/ in helloMFC.cpp,CMyApp myApp;,BOOL CMyApp:InitInstance() m_pMainWnd = new CMyWnd; m_pMainWnd-ShowWindow(SW_SHOW); m_pMainWnd-UpdateWindow(); return TRUE; ,/for CMyWnd,BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd) ON_WM_PAINT() END_MESSAGE_MAP(),MFC程序的生死循环,CMyWnd:CMy

43、MainWnd() Create(NULL, _T(“The Hello Application“); ,void CMyWnd:OnPaint() CPaintDC dc(this); CRect rect; GetClientRect( ,MFC程序的生死循环,执行结果:,MFC程序的生死循环,来龙去脉:,隐式链接,afx_msg void OnPaint();,上述程序的创建步骤: 创建一个Console程序,项目-属性中修改以下设置:,MFC重要概念窗口封装,所有的Windows程序设计,可以说是基于消息和窗口的程序设计,几乎所有常见的控件都可以说是一个窗口。出于这个理由,MFC将所有

44、的窗口进行了抽象,得到了CWnd类,并从这个基类派生出了多种窗口和控件。,对话框,视图类,控件类,框架类,MFC重要概念消息处理,MFC采取了一套封装后的消息处理机制,称为消息映射。通过消息映射,将消息和相应的消息处理函数绑定,从而实现了消息处理功能。使用规则如下:,1、申明消息映射,要使用消息映射,首先要申明消息映射。在需要进行消息映射的类申明文件里面添加:,DECLARE_MSG_MAP(),实际上是一个预编译宏,定义了一个用于存放 消息的数据结构和一个指向该数据结构的数据 结构,基类结构,消息处理,MFC重要概念消息处理,2、 开始消息循环,要使用消息循环,必须在类对应的cpp文件中添加

45、如下语句: BEGIN_MESSAGE_MAP(派生类名, 基类名),基类结构,基类结构,BEGIN_MESSAGE_MAP(derive, base)其实也是一个预编译 宏,其完成了派生类和基类消息的链接,如:BEGIN_MESSAGE_MAP(CMyWnd, CFrameWnd),CMyWnd,CFrameWnd,MFC重要概念消息处理,3、 填充消息映射以及定义消息处理函数,在完成BEGIN_MESSAGE_MAP(derive, base)后,需要进行消息 映射的填充,并定义对应的消息处理函数。,填充消息映射,对应afx_msg OnPaint(),对应afx_msg OnLButto

46、nDown(UINT, CPoint),有afx_msg的函数才是消息处理函数,MFC重要概念消息映射模式,标准Windows消息的对应规则,概念:标准Windows消息是指以“ WM_ ”开头的消息,有100多个,主要用于处理基本的绘制、键盘、鼠标等消息。,对应规则: 一般情况下 WM_XXX 消息对应的消息映射为ON_WM_XXX(),消息处理函数为afx_msg OnXXX(),WM_PAINT,ON_WM_PAINT(),OnPaint(),MFC根据消息类型不同,采取了四种不同的映射模式:,如:,WM_CHAR,ON_WM_CHAR(),OnChar(),MFC重要概念消息映射模式,

47、例1:鼠标定位程序。当鼠标左键在窗口上点击时,弹出消息框提 示鼠标点击位置。,MFC重要概念消息映射模式,例1的实现:,第一步:利用向导创建一个基于对话框的MFC应用程序,MFC重要概念消息映射模式,第二步:添加对应的消息映射,在生成的对话框程序中找到基类为CDialog的类(所在头文件和源文件一般命名为CXXXDlg.h/cpp),在源文件中找到消息映射,添加ON_WM_LBUTTONDOWN(),以处理鼠标左键单击消息。,MFC重要概念消息映射模式,第三步:在类中添加对应的消息处理函数,第四步:实现该消息处理函数,CString是一个字符串类,类似string,CString:Format

48、(),类似sprintf函数,格式化字符串。,CWnd:MessageBox(输出文本, 标题, 样式),字符分为unicode和ascii两种,对应wchar和char,这里的_T是一种自动判断的手段。,实际上MFC中定义了一种通用字符TCHAR,也会自动判断,MFC重要概念消息映射模式,ON_COMMAND消息,ON_COMMAND消息主要是为了映射菜单命名,其基本映射规则为:,ON_COMMAND(, );,其处理函数的原型均为:,afx_msg void memberFxn( );,例:如何建立菜单,并响应菜单消息。,菜单创建和ON_COMMAND,例:如何建立菜单,并响应菜单消息。,第

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1