高级语言程序设计 第六章 MFC编程基础.ppt_第1页
高级语言程序设计 第六章 MFC编程基础.ppt_第2页
高级语言程序设计 第六章 MFC编程基础.ppt_第3页
高级语言程序设计 第六章 MFC编程基础.ppt_第4页
高级语言程序设计 第六章 MFC编程基础.ppt_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、高级语言程序设计第六章 MFC编程基础,周律,1基本概念,API(应用程序接口:Application Program Interface)编程:其实质是程序内的一套调用函数,是面向底层的编程,比较复杂,但代码执行效率极高; MFC(微软基础类库:Microsoft Fondation Classes)编程:MFC对Windows中的大部分API进行了封装,用户只从这些类集成生成实例或直接生成实例,而不用与底层的API函数打交道,提高了编程的效率。可以说MFC是VC+的主体部分。,2020/8/9,2,以消息为基础,以事件驱动之 消息(Message)就是关于发生事件的信息。 从程序的观点度看

2、,消息驱动就是由消息来驱动/响应某个函数,消息驱动程序设计是围绕着消息的产生与处理而展开的。而DOS程序则是过程驱动的。 Windows系统中已预定义了7000多条消息,用户可在VC的winuser.h中找到这些消息宏定义。 如:#define WM_MOUSEMOVE 0 x0200 /Mouse移动 #define WM_LBUTTONDOWN 0 x0201 /Mouse左键按下,2020/8/9,3,消息类型 命令消息WM_COMMAND:菜单,加速键或工具栏等产生。派生自CCmdTarget的类均可处理。由菜单项ID标识出处。 标准消息: 除WM_COMMAND外的以WM_开头的消息

3、。任何派生自CWnd的类可以接收。 控件通知:(control notification) 用户自定义消息: 内部消息:0 x04000 x7fff 如:#define WM_USER 0 x400 外部消息:0 xc0000 xffff,3 图形设备接口 GDI(图形设备接口:Graphical Device Interface)与设备驱动程序实现了与设备无关的操作。(见图所示) 图:图形设备接口 图中,DC(设备环境/设备上下文:Device Context)是物理设备(如显示器、打印机等)的逻辑模型,GDI是DC和设备驱动程序之间的隔离层(或叫做抽象接口)。,2020/8/9,5,4 M

4、FC体系结构 MFC是个相当庞大的类库,各个类间的继承与派生关系井井有条。 CObject类是MFC的基类,其它大部分类都是从CObject派生而来的。CObject类的派生类按功能可分为多个部分。下面简要介绍部分常用的类的派生结构。,2020/8/9,6,4.1 窗口类 图:部分窗口类的继承关系,2020/8/9,7,CObject,CCmdTarget,CWnd,CFrameWnd,CView,CDialog,控件类如 CButton,其中,CCmdTarget(命令目标类)是MFC中拥有消息循环和消息处理机制的基类。关于MFC Windows程序中建立消息处理机制的步骤在后面详细介绍。

5、CWnd类是从CCmdTarget中派生出来的重要类,它是所有窗口类的基类。 CCmdTarget间接派生出了文档/视图结构中应用程序框架中的许多重要的类:CWinApp、CFrameWnd、CDocument、CView等(SDI应用程序框架的四个主要的类)。,2020/8/9,8,4.2 应用程序框架类 图:应用程序框架类的继承关系 CWinApp类是从CCmdTarget中派生出来的最重要的类,每个用MFC编写的Windows程序必须有一个它的派生类的对象,它代表一个应用程序,整个程序的运行都由它负责。CWinApp类很大程度上隐藏了API Windows程序中WinMain函数。,20

6、20/8/9,9,CDocTemplate,4.3图形绘制类 图:图形绘制类的继承关系 图形绘制类的基类是CDC(设备环境类)。CDC类提供了基本的绘图及文本输出函数。,2020/8/9,10,4.4图形对象类 图:部分绘图对象类的继承关系 绘图对象类提供给CDC及其派生类在绘图时所需的各种图形对象,如画笔、刷子、字体等。,2020/8/9,11,5 用Win32 Application工程创建MFC Windows 程序,例:编写一个MFC Windows 程序(SDI)。要求程序运行主窗口弹出后,单击Mouse弹出消息框。 程序写法1: /mfc1.cpp #include /MFC核心库

7、,2020/8/9,12,class CMainFrame:public CFrameWnd public: CMainFrame() CString ch=MFC Windows程序; Create(NULL,ch);/创建主窗口 protected: afx_msg void OnLButtonDown(UINT nFlags,CPoint point); DECLARE_MESSAGE_MAP() ;,2020/8/9,13,2020/8/9,14,class CMinApp:public CWinApp public: virtual BOOL InitInstance(); ; BE

8、GIN_MESSAGE_MAP(CMainFrame,CFrameWnd) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP() /Mouse单击处理 void CMainFrame:OnLButtonDown(UINT nFlags,CPoint point) CString str=马到成功!; MessageBox(str); CFrameWnd:OnLButtonDown(nFlags,point); ,BOOL CMinApp:InitInstance() m_pMainWnd=new CMainFrame;/生成主窗口对象指针 m_pMainWnd-ShowW

9、indow(SW_SHOWMAXIMIZED); m_pMainWnd-UpdateWindow(); return TRUE; CMinApp MyApp;/生成应用程序对象并执行应用程序 返回,2020/8/9,15,6 MFC Windows应用程序消息处理机制的建立,在MFC Windows应用程序中,必须正确地建立消息处理机制。 建立消息处理机制步骤如下(可归纳为三步曲): 1、 声明消息映射 若希望能进行消息处理的类具有接收消息的能力,需要在该类的末尾加入消息映射说明。 格式: DECLARE_MESSAGE_MAP() 2、 建立消息与处理函数之间的映射 格式: BEGIN_ME

10、SSAGE_MAP(子类名,父类名) /消息映射宏定义或消息映射语句(根据使用消息的多少,一般有若干个) ON_(消息名或控制号,处理函数名) END_MESSAGE_MAP(),2020/8/9,16,注:消息映射宏定义将一个消息与一个处理函数关联起来,以便对消息作出响应。 3、 在进行消息处理的类中定义各消息处理函数 消息处理函数原型为: afx_msg 类型 函数名(WPARAM wParam,LPARAM lParam); 例: MOUSE左键按下消息处理函数原型为: afx_msg void OnLButtonDown(UINT nFlags,CPoint point);,2020/

11、8/9,17,具体而微的WIN32程序(1),WinMain函数:Windows程序的进入点 RegisterClass():注册窗口的属性 外貌:窗口的边框、颜色、标题、位置等等 行为:接收到消息的反应。 CreateWindow()-ShowWindows()-UpdateWindow() 消息循环 : while (GetMessage( ,具体而微的WIN32程序(2),WndProc:窗口函数,窗口的生命中枢,通过switch/case方式判断消息种类,以决定处理方式。 程序的退出方式:文件close命令,系统送出WM_CLOSE,DefwindowProc对其处理,调用Destro

12、yWindow把窗口清除,后者送出WM_DESTROY,程序调用PostQuitMessage,其发送WM_QUIT,GetMessage获得后结束消息循环。,MFC程序与WIN32的对比(1),CWinApp :代表程序本身,取代WndMain的地位。 class CMyApp : public CWinApp public: CMyApp(); / Overrides / ClassWizard generated virtual function overrides /AFX_VIRTUAL(CMyApp) public: virtual BOOL InitApplication();/

13、后添加,文档模板管理工作 virtual BOOL InitInstance();/通过new CMainFrame;产生窗口并显示 virtual int Run();/后添加 ,进行消息循环 /AFX_VIRTUAL / Implementation public: /AFX_MSG(CMyApp) afx_msg void OnAppAbout(); / NOTE - the ClassWizard will add and remove member functions here. / DO NOT EDIT what you see in these blocks of genera

14、ted code ! /AFX_MSG DECLARE_MESSAGE_MAP() ;,MFC程序与WIN32的对比(2),CFrameWnd:代表一个主窗框,取代WndPOC的地位。 protected: /AFX_MSG(CMainFrame) afx_msg void OnPaint();/后添加,默认的已移到CChildView类中 afx_msg void OnAppAbout();/后添加,默认的已移到CMyApp类中 /AFX_MSG DECLARE_MESSAGE_MAP()/在.h文件中 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) /AF

15、X_MSG_MAP(CMainFrame) ON_WM_PAINT() ON_COMMAND(ID_APP_ABOUT, OnAppAbout) /AFX_MSG_MAP END_MESSAGE_MAP()/在cpp 文件中 这三个宏 完成了消息映射,7 图形输出,基本的图形输出要通过DC设备环境进行。VC中CDC类是定义设备环境的基类,它封装了170多个成员函数,包括文本输出函数和绘图函数。另外CDC还派生了CClientDC、CWindowDC、CPaintDC、CMetaFileDC等类,以满足不同的用途需要。,2020/8/9,22,7.1基本图形显示,用CDC在一个定义的函数中绘图三

16、个步骤: 1、 调用绘图函数之前,先获取设备环境对象; 常用函数: CWnd:GetDC() 格式:CDC *GetDC(); 功能:获取当前窗口的设备环境对象的指针。 典型用法: CDC *pDC=GetDC();/获取当前窗口的设备环境对象指针。 注:OnDraw函数忽略此步,因为它已由AppWizard自动生成了这个部分,并把对象地址传递给了该函数的pDC对象指针形参。,2020/8/9,23,2、 调用绘图函数时,要正确地引用设备环境; 如要在客户区的点(100,100)位置绘一蓝点的典型代码如下: pDC-SetPixel(50,50,RGB(0,0,255); 常用绘图函数 CDC

17、:SetPixel 格式:COLORREF SetPixel(int x,int y,COLORREF crColor); COLORREF SetPixel(POINT point,COLORREF crColor); 功能:设置指定坐标像素为最接近crColor所指定的颜色。 返回:若调用成功,返回指定坐标像素的实际RGB值。 参数: x-点的逻辑x坐标。 y-点的逻辑x坐标。 crColor-指定绘制此点的颜色。,2020/8/9,24,Example:在OnDraw函数中,添加如下语句 pDC-SetPixel(50,50,RGB(0,0,255); 则点(50,50)被画为兰色。 C

18、DC:MoveTo/LineTo 格式:CPoint MoveTo(int x,int y); CPoint MoveTo(POINT point); 功能:将当前位置移到(x,y)或point参数指定的点。 返回:将先前位置(x,y)坐标返回给CPoint对象。 参数: x-新位置的逻辑x坐标。 y-新位置的逻辑y坐标。 point-指定的新位置。可以是一个POINT结构或一个CPoint对象。,2020/8/9,25,格式:BOOL LineTo(int x,int y); BOOL LineTo(POINT point); 功能:从当前位置向指定点绘制一条直线,但不包括指定的点。 返回:若调用成功,则返回非0。 参数: x-线段端点的逻辑x坐标。 y-线段端点的逻辑y坐标。 point-指定线段端点。可以是一个POINT结构或一个CPoint对象。 Example:在OnDraw函数中,添加如下语句 pDC-MoveTo(10,10); pDC-LineTo

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论