【精品】mfc程序设计(可编辑.ppt

上传人:1595****071 文档编号:71300427 上传时间:2023-02-02 格式:PPT 页数:152 大小:3.32MB
返回 下载 相关 举报
【精品】mfc程序设计(可编辑.ppt_第1页
第1页 / 共152页
【精品】mfc程序设计(可编辑.ppt_第2页
第2页 / 共152页
点击查看更多>>
资源描述

《【精品】mfc程序设计(可编辑.ppt》由会员分享,可在线阅读,更多相关《【精品】mfc程序设计(可编辑.ppt(152页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、MFC程序设计11.1 MFC程序基础程序基础11.1.1 MFC类类1、MFC类的本质Microsoft利 用 面 向 对 象 的 程 序 技 术 将 大 多 数Windows API函数封装在类中,并通过继承形成了一种具有层次结构的类结构,称为MFC(Microsoft Foundation Class,微软基础类库)。MFC中的类非常全面,覆盖了绝大多数标准Windows程序部件,如窗口、对话框、菜单、工具条、设备环境、画笔、调色板、控件等。在MFC类库中定义的成员函数有好几百个,其中许多是对Windows API函数的简单封装,甚至与对应的API函数有着相同的函数名字。2、MFC类的结

2、构11.1.1 MFC类类3、MFC中主要的类中主要的类 通用数据处理类通用数据处理类包括字符串类(CString)、集合类(CByteArray、CDwordArray、CPtrArray、CStringArray等)、映射类(CMapPtrToTpr、CMapStringToOb等)、链表类(CObList、CPtrList、CStringList等)Windows API封装类封装类将将API函数按其功能分别封装到不同的类中,并为许函数按其功能分别封装到不同的类中,并为许多封装在类中的多封装在类中的API函数提供了缺省参数,使程序函数提供了缺省参数,使程序员可以通过类成员的方式访问员可以

3、通过类成员的方式访问API函数,简化了函数,简化了API函数的访问。函数的访问。如CWnd、CFrameWnd、CMIDIFrameWnd、CMainFrameWndCDialog、CFileDialogCDC、CPaintDC、CClientDC、CWindowDC等 11.1.1 MFC类类 应用程序框架类应用程序框架类 将Windows程序的基本结构封装在不同的类中,程序员可以通过这些类生成Windwos程序的雏形。应用程序框架类包括应用程序类(CWinApp)、线程类(CWindThread)、文档模板类(CDocTemplate、CSingleDocTemplate、CMultiDo

4、cTemplate)、文档类(CDocument)等 工具类工具类如工具条(CToolBar)、菜单(CMenu)、状态栏(CStatusBar)、拆分(CSplitterWnd)和滚动窗口(CScrollBar)等 11.1.2 MFC程序的结构程序的结构 消息映射宏和消息处理函数消息映射宏用于将消息和消息处理函数与对应的窗口函数关联起来 一个应用程序对象应用程序对象则是程序执行的入口点,每个MFC程序都必须有一个应用程序对象,程序执行就从该应用程序对象被建立时开始。11.1.2 MFC程序的结构程序的结构【例11-1】设计一个简单的MFC程序,该程序在鼠标左键单击位置画一个矩形,矩形的大小

5、是随机的。程序设计思路:程序设计思路:在程序中设计一个矩形数组,以鼠标单击位置为中心,以随机数为边长生成一个矩形,并将此矩形保存在数组中。然后产生一条WM_PAINT消息,并在相应的消息处理函数中重绘数组中的所有矩形。【例11-1】程序设计方法程序设计方法(1)启动VC+6.0,建立一个新的工程文件。选择“新建新建”对话框中的“工程工程”标签,并选中“MFC AppWizard(exe)”,在“位置位置”编辑框中选择保存项目文件的目录目录“C:dk”,然后在“工程工程”编辑框中输入工程文件名“Rect”,如图11-2(a)所示。(2)单击“确定确定”按钮后,接下来将是一个多步骤的向导,该向导的

6、操作方法将在11.1.3节介绍。这里选择“S单个文档单个文档”,如图11-2(b)所示,然后单击“完成完成”按钮。【例例11-1】程序设计方法程序设计方法(3)上述过程将产生多个磁盘文件,打开保存本项目所在的磁盘目录本项目所在的磁盘目录“C:dk”,保留其中的Rect.ncb,Rect.clw,Rect.dsp,Rect.dsw,Rect.opt,StdAfx.h,StdAfx.cpp,Rect.cpp文件,将其余文件全部删除。同时,单击下页图11-3中的“FileView”项,展开“Source Files”列表,删除其中除除Rect.cpp和StdAfx.cpp之外的所有文件;展开“Hea

7、der Files”列表,删除其中除除StdAfx.h之外之外的所有头文件。【例例11-1】程序设计方法程序设计方法(4)打开图)打开图11-3中的中的Rect.cpp文件,用下面的程序代码替文件,用下面的程序代码替换换Rect.cpp原来的程序代码。原来的程序代码。/Rect.cpp#include stdafx.hclass CMyWnd:public CFrameWnd CRect RECT1000;/矩形数组,CRect是矩形 int n;/记录矩形个数public:CMyWnd()n=0;/构造函数,将n初始为0protected:afx_msg void OnPaint();/WM

8、_PANIT的消息处理函数 afx_msg void OnLButtonDown(UINT nFlags,CPoint point);DECLARE_MESSAGE_MAP()/声明本类将处理消息;BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd)/消息映射消息映射 ON_WM_LBUTTONDOWN()/WM_LBUTTONDOWN消息消息 ON_WM_PAINT()/本类将处理本类将处理WM_PAINT消息消息END_MESSAGE_MAP()void CMyWnd:OnLButtonDown(UINT nFlags,CPoint point)if(n1000)int

9、r=rand()%50+10;/rand是随机函数,是随机函数,r在在1060之间之间 /下面的语句以鼠标光标为中心生成矩形下面的语句以鼠标光标为中心生成矩形 CRect rect(point.x-r,point.y-r,point.x+r,point.y+r);RECTn=rect;/将生成的矩形存入数组将生成的矩形存入数组 n+;InvalidateRect(rect,FALSE);/产生产生WM_PAINT 消息消息 /WM_PAINT消息处理函数,当产生WM_PAINT消息时调用本函数void CMyWnd:OnPaint()CPaintDC dc(this);dc.SelectSto

10、ckObject(LTGRAY_BRUSH);/将浅灰色的画刷选入设备环境 for(int i=0;iCreate(0,画矩形!);/建立窗口 pMain-ShowWindow(m_nCmdShow);/显示窗口 this-m_pMainWnd=pMain;/关联应用程序与窗口 return TRUE;CMyApp ThisApp;/ThisApp是是全局应用程序对象程序从此进入WinMain(),以启动程序的运行11.1.3 MFC程序的执行流程程序的执行流程1、MFC程序的启动Windows C+程序的入口函数是WinMain,在MFC中WinMain被MFC封装在应用程序类CWinApp

11、中。每个MFC程序都有自己的应用程序类,该类继承了CWinApp类的功能,且能通过其成员函数InitInstance将窗口与应用程序对象关联在一起。每个Windows程序都必须建立一个且只能是一个应用程序对象。在建立应用程序对象时,将自动调用应用程序类的InitInstance。程序至此开始运行,并执行许多默认操作。InitInstance将用不同的类建对象,并通过一定的方式将它们关联成在一起。11.1.3 MFC程序的执行流程程序的执行流程class CMyApp:public CWinApp /应用程序类public:virtual BOOL InitInstance;CMyApp Thi

12、sApp;InitInstance()是基类是基类CWinApp中的一个虚函数,每个MFC程序必须重载它,ThisApp对象的建立引爆了对象的建立引爆了MFC程序程序的启动执行的启动执行InitInstance函数的执行过程函数的执行过程11.1.3 MFC程序的执行流程程序的执行流程2、建立窗口MFC将窗口类的定义和注册,以及窗口的建立和显示等操作封装在类CFrameWnd中,并在该类中提供了建立窗口的默认参数,简化了窗口的建立过程。应用程序只需继承CFrameWnd类的功能,就能够快捷地建立程序窗口。CFrameWnd称为框架窗口类,用它建立的窗口称为框架窗口。2、建立窗口 MFC程序窗口

13、的建立是在InitInstance函数中完成的。在InitInstance 中的语句如下:CMyWnd*pMain=new CMyWnd;pMain-Create(0,画矩形!画矩形!);pMain-ShowWindow(m_nCmdShow);this-m_pMainWnd=pMain;11.1.3 MFC程序的执行流程程序的执行流程3、建立消息循环 InitInstance建立程序窗口后,接下来将调用执行一个默认的函数AfxWinMain,该函数将采用默认的方式为应用程序建立循环。11.1.4 消息映射1、消息类型MFC程序中的消息可以分为3种不同类型,每种类型可被不同的对象处理。窗口消息

14、:指WM_XX(除WM_COMMAND外)形式的消息,如WM_LBUTTON-DOWN、WM_MOUSEMOVE等,这类消息常由窗口类和视图类进行处理。命令消息:由快捷键、菜单及工具栏中的命令按钮等与用户交互的对象产生的WM_COMMAND消息。这类消息能够被多种对象处理,包括应用程序对象、框架窗口对象、文档和视图对象。控件消息:当选择窗口中的各种控件(如各种对话框中的“确定”和“取消”按钮)时,这些控件就会向其父窗口发送控件消息,这类消息也以WM_COMMAND形式出现。11.1.4 消息映射2、窗口函数与消息映射窗口函数与消息映射每个Windows程序至少有一个窗口,每个窗口都有一个窗口函

15、数。API程序中的窗口处理函数是显而易见的,并且采用简单明了的switch case结构处理消息。在MFC程序中,API程序窗口函数中的消息处理结构被分散到了不同的类中,由MFC进行隐式处理。要在MFC程序中处理消息,就必须了解消息处理的流程。MFC提供了一种称为消息映射的机制,通过该机制可以很方便地为程序添加事件处理函数,简化了编程工作。MFC程序设计的主要工作其实就是程序设计的主要工作其实就是利用消息映射机制为程序中的不同类添加消利用消息映射机制为程序中的不同类添加消息处理函数。息处理函数。11.1.4 消息映射3、消息映射机制的过程(1)在类声明中添加DECLARE_MESSAGE_MA

16、P消息映射声明宏class CMyWnd:public CFrameWnd DECLARE_MESSAGE_MAP()/声明本类要处理消息;3、消息映射的过程(2)在类的实现文件中添加消息映射宏)在类的实现文件中添加消息映射宏BEGIN_MESSAGE_MAP(X,xParentClass)/在此添加消息映射宏和及其对应的消息函数END_MESSAGE_MAP()其中X是要添加消息映射宏的类,xParentClass是X的基类比如,例11-1中消息映射的程序代码如下:BEGIN_MESSAGE_MAP(CMyWnd,CFrameWnd)ON_WM_LBUTTONDOWN()/处理处理WM_LB

17、UTTONDOWN消息消息 ON_WM_PAINT()/声明处理声明处理WM_PAINT消息消息END_MESSAGE_MAP()(2)在类的实现文件中添加消息映射宏)在类的实现文件中添加消息映射宏事实上,添加消息映射宏的完整形式如下BEGIN_MESSAGE_MAP消息宏,处理对应消息的消息函数消息宏,处理对应消息的消息函数END_MESSAGE_MAP()必须在此为每个消息宏指定一个处理该消息宏对应的必须在此为每个消息宏指定一个处理该消息宏对应的消息函数名。消息函数名。在例在例11-1的消息映射宏中只有消息宏,没有指定其对应的消息映射宏中只有消息宏,没有指定其对应的消息函数,是因为那些都是

18、很常用的消息宏,的消息函数,是因为那些都是很常用的消息宏,MFC已经将它们与默认的消息函数进行了关联已经将它们与默认的消息函数进行了关联,不需要再,不需要再指定了。指定了。表表11-1列出了列出了MFC为消息映射宏预定义的部分为消息映射宏预定义的部分常见消息宏响应函数。常见消息宏响应函数。表11-1 常见消息映射宏与消息处理函数消息映射宏消息映射宏对应消息对应消息对应消息处理函数对应消息处理函数ON_WM_CHARWM_CHAROnCharON_WM_CLOSEWM_CLOSEOnCloseON_WM_CREATEWM_CREATEOnCreateON_WM_LBUTTONDOWNWM_LBU

19、TTONDOWNOnLButtonDownON_WM_LBUTTONUPWM_LBUTTONUPOnLButtonUpON_WM_RBUTTONDOWNWM_RBUTTONDOWNOnRButtonDownON_WM_RBUTTONUPWM_RBUTTONUPOnRButtonUpON_WM_MOUSEMOVEWM_MOUSEMOVEOnMouseMoveON_WM_PAINT WM_PAINTOnPaint3、消息映射的过程(3)在类的实现文件中编写消息响应函数)在类的实现文件中编写消息响应函数如例11-1中的CMyWnd的成员函数OnPaint,定义如下:void CMyWnd:OnPai

20、nt()CPaintDC dc(this);dc.SelectStockObject(LTGRAY_BRUSH);for(int i=0;iShowWindow(SW_SHOW);/显示窗口显示窗口 m_pMainWnd-UpdateWindow();/产生产生WM_PAINT消息,消息,return TRUE;CMyApp theApp;(2)框架窗口类CMainFrame/MainFrm.h class CMainFrame:public CFrameWnd/继承继承CFrameWnd的功能的功能protected:CMainFrame();/构造函数自动实现了许多功能构造函数自动实现了许

21、多功能 DECLARE_DYNCREATE(CMainFrame)/与与RUNTIME_CLASS相对应相对应 public:/预定义窗口,用于注册窗口预定义窗口,用于注册窗口virtual BOOL PreCreateWindow(CREATESTRUCT&cs);virtual CMainFrame();/析构函数析构函数 virtual void AssertValid()const;/异常诊断和对象内部检测异常诊断和对象内部检测 virtual void Dump(CDumpContext&dc)const;/用于对象诊断用于对象诊断protected:CStatusBar m_wnd

22、StatusBar;/定义状态条定义状态条 CToolBar m_wndToolBar;/定义工具条定义工具条protected:afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);/建立窗口建立窗口 DECLARE_MESSAGE_MAP()/声明本类要处理消息声明本类要处理消息;MainFrm.cpp/MainFrm.cpp#include stdafx.h#include My.h#include MainFrm.h“IMPLEMENT_DYNCREATE(CMainFrame,CFrameWnd)BEGIN_MESSAGE_MAP(C

23、MainFrame,CFrameWnd)/AFX_MSG_MAP(CMainFrame)ON_WM_CREATE()/AFX_MSG_MAPEND_MESSAGE_MAP()int CMainFrame:OnCreate(LPCREATESTRUCT lpCreateStruct)if(CFrameWnd:OnCreate(lpCreateStruct)=-1)return-1;/创建窗口 /下面的命令建立工具栏下面的命令建立工具栏 if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP|CBRS_GRI

24、PPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)|!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)TRACE0(Failed to create toolbarn);return-1;/下面的命令建立状态指示栏下面的命令建立状态指示栏 if(!m_wndStatusBar.Create(this)|!m_wndStatusBar.SetIndicators (indicators,sizeof(indicators)/sizeof(UINT)TRACE0(Failed to create status barn);

25、return-1;/下面的命令指定工具栏的停靠方式,允许停靠在窗口的任何位置 m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);return 0;/下面的函数为窗口注册作准备BOOL CMainFrame:PreCreateWindow(CREATESTRUCT&cs)if(!CFrameWnd:PreCreateWindow(cs)return FALSE;/若不按默认方式定义窗口,可以在此修改cs结构的域 return TRUE;/下面

26、两个函数主要用于程序调试时的错误诊断#ifdef _DEBUGvoid CMainFrame:AssertValid()const CFrameWnd:AssertValid();void CMainFrame:Dump(CDumpContext&dc)const CFrameWnd:Dump(dc);#endif/_DEBUG(3)文档类MyDoc/MyDoc.h class CMyDoc:public CDocumentprotected:CMyDoc();/构造函数 DECLARE_DYNCREATE(CMyDoc)public:virtual BOOL OnNewDocument();

27、/菜单中的“新建”命令 virtual void Serialize(CArchive&ar);/实现文件存盘和读取操作 virtual CMyDoc();/析构函数 DECLARE_MESSAGE_MAP();/MyDoc.cpp#include stdafx.h#include My.h#include MyDoc.hIMPLEMENT_DYNCREATE(CMyDoc,CDocument)BEGIN_MESSAGE_MAP(CMyDoc,CDocument)/MFC向导在这里添加宏映射的代码END_MESSAGE_MAP()BOOL CMyDoc:OnNewDocument()if(!C

28、Document:OnNewDocument()return FALSE;/可以在此添加程序代码,实现需要的功能可以在此添加程序代码,实现需要的功能 return TRUE;void CMyDoc:Serialize(CArchive&ar)if(ar.IsStoring()/可以在此添加数据保存的代码可以在此添加数据保存的代码 else /可以在此添加读取数据的代码可以在此添加读取数据的代码 (4)视图类MyView/MyView.h class CMyView:public CView protected:CMyView();DECLARE_DYNCREATE(CMyView)public

29、:CMyDoc*GetDocument();/获取与视图对应的文档指针获取与视图对应的文档指针 virtual void OnDraw(CDC*pDC);/输出函数输出函数 virtual BOOL PreCreateWindow(CREATESTRUCT&cs);/为窗口注册作准备为窗口注册作准备 protected:/下面下面3个成员函数实现打印功能,分别对应打印前准备、打印、打印结束处理个成员函数实现打印功能,分别对应打印前准备、打印、打印结束处理 virtual BOOL OnPreparePrinting(CPrintInfo*pInfo);virtual void OnBeginP

30、rinting(CDC*pDC,CPrintInfo*pInfo);virtual void OnEndPrinting(CDC*pDC,CPrintInfo*pInfo);DECLARE_MESSAGE_MAP();inline CMyDoc*CMyView:GetDocument()return(CMyDoc*)m_pDocument;/MyView.cpp#include stdafx.h#include My.h#include MyDoc.h#include MyView.hIMPLEMENT_DYNCREATE(CMyView,CView)/下面的消息映射对应“文件”菜单的“打印、

31、打印预览”菜单项BEGIN_MESSAGE_MAP(CMyView,CView)ON_COMMAND(ID_FILE_PRINT,CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT,CView:OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW,CView:OnFilePrintPreview)END_MESSAGE_MAP()11.2.4 应用程序框架类之间的关系应用程序框架类之间的关系class CMyApp:public CWinAppvirirtual BOOL InitInstance();afx_

32、msg void OnAppAbout();DECLARE_MESSAGE_MAP();BOOL CMyApp:InitInstance()pDocTemplate=new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CMyDoc),RUNTIME_CLASS(CMainFrame),RNTIME_CLASS(CMyView);class CMainFrame:public CFrameWndafx_msg int OnCreate();DECLARE_MESSAGE_MAP();class CMyDoc:public CDocumentvir

33、tual BOOL OnNewDocument();virtual void Serialize(CArchive&ar);DECLARE_MESSAGE_MAP();class CMyView:public CViewCMyDoc*GetDocument();virtual void OnDraw(CDC*pDC);DECLARE_MESSAGE_MAP();class CAboutDlg:public CDialog;CMyApp theApp;11.3 MFC程序输出程序输出11.3.1 MFC中的图形类中的图形类MFC将设备环境和图形设备接口将设备环境和图形设备接口API函数封在类函数

34、封在类CDC中,提供了一种简便的数据输出实现方法。中,提供了一种简便的数据输出实现方法。CDC功能强大而复杂,包含了有关设备的属性和为功能强大而复杂,包含了有关设备的属性和为数众多的数众多的GDI成员函数,还继承了成员函数,还继承了CObject类的功能。类的功能。11.3.1 MFC中的图形类中的图形类1CDC类class CDC:public CObjectpublic:CPen*SelectObject(CPen*pPen);/选择画笔virtual CFont*SelectObject(CFont*pFont);/选择字体CPoint MoveTo(int x,int y);/将画笔移

35、到(x,y)BOOL LineTo(int x,int y);/从当前光标位置画直线到(x,y)BOOL LineTo(POINT point);void FillRect(LPCRECT lpRect,CBrush*pBrush);void InvertRect(LPCRECT lpRect);/将产生WM_PAINT BOOL Ellipse(int x1,int y1,int x2,int y2);/画椭圆BOOL Pie(int x1,int y1,int x2,int y2,int x3,int y3,int x4,int y4);BOOL Rectangle(LPCRECT lpR

36、ect);/画矩形virtual BOOL TextOut(int x,int y,LPCTSTR lpszString,int nCount);BOOL TextOut(int x,int y,const CString&str);/在(x,y)输出字符串str;2CPaintDC、CClientDC、CWindowDC类1、各图形类的功能CPaintDC与ON_PAINT宏相对应,该宏对应的消息处理函数是OnPaint,用来处理WM_PAINT消息。即当产生WM_PAINT消息时,将调用OnPaint消息处理函数。CClientDC 类支持在客户区域绘图,CWindowDC类支持在整个应用

37、程序窗口中绘图。CPaintDC、CClientDC、CwindowDC这3个类除了一个构造函数外,几乎没有定义其他成员函数,但它们继承了CDC类的成员函数,凡是CDC类定义的公有成员,都可以通过这3个类的对象进行访问。CPaintDC、CClientDC、CWindowDC类的构造函数类的构造函数class CPaintDC:public CDCpublic:CPaintDC(CWnd*pWnd);class CClientDC:public CDCpublic:CClientDC(CWnd*pWnd);class CWindowDC:public CDCpublic:CWindowDC(C

38、Wnd*pWnd);11.3.2 绘图对象 1、图形输出与绘图对象、图形输出与绘图对象CDC及其他几个图形类中的成员函数在绘制图形或输出文本时,需要用到画笔(CPen)、画刷(CBrush)、字体(CFont)等绘图对象。应用程序可以根据需要定义绘图对象,并用它们绘图或输出文本,当应用程序没有提供自己的绘图对象时,CDC中的成员函数将用MFC提供的缺省绘图对象绘制图形。11.3.2 绘图对象 2、绘图对象类型、绘图对象类型(1)画笔对象class CPen:public CGdiObjectpublic:CPen();/构造函数 CPen(int nPenStyle,int nWidth,CO

39、LORREF crColor);BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);其中,nWidth代表画笔的宽度(即所画线条的粗细),crColor代表画笔的颜色,nPenStyle表示画笔样式,如PS_SOLD(实线)、PS_DOT(点)、PS_DASH(虚线)、PS_DASHDOTDOT(双点)等样式。11.3.2 绘图对象(2)画刷对象)画刷对象class CBrush:public CGdiObjectpublic:CBrush();CBrush(COLORREF crColor);/建立彩色画刷 CBrush(int

40、 nIndex,COLORREF crColor);/创建纹理画刷 CBrush(CBitmap*pBitmap);/创建位图画刷,即用位图填充 BOOL CreateSolidBrush(COLORREF crColor);/创建彩色实线画笔;11.3.2 绘图对象(3)字体对象)字体对象class CFont:public CGdiObjectpublic:CFont();BOOL CreateFontIndirect(const LOGFONT*lpLogFont);BOOL CreateFont(int nHeight,/字体高度 int nWidth,/字体宽度 int nEscap

41、ement,/文本输出角度 int nOrientation,/字体倾斜度 int nWeight,/字体粗细 BYTE bItalic,/是否斜体 BYTE bUnderline,/是否带下划线 BYTE cStrikeOut,/是否带穿透线 BYTE nCharSet,/字体所用字符集 BYTE nOutPrecision,/输出精度 BYTE nClipPrecision,/定义字符溢出边界的剪切精度 BYTE nQuality,/定义打印字体质量 BYTE nPitchAndFamily,/定义字间距、字符集 LPCTSTR lpszFacename);/字体名;11.3.2 绘图对象

42、3、应用程序定义并选用绘图对象的步骤、应用程序定义并选用绘图对象的步骤(1)定义绘图对象)定义绘图对象(2)选择绘图对象)选择绘图对象(3)还原绘图对象)还原绘图对象下面的语句将创建一支下面的语句将创建一支3个像素点宽的绿色虚线画笔,个像素点宽的绿色虚线画笔,并将其选入设备环境,绘制一个椭圆,然后还原画笔。并将其选入设备环境,绘制一个椭圆,然后还原画笔。CClientDC dc(this);CPen*oPen;CPen nPen(PS_DASH,3,RGB(0,255,0);oPen=dc.SelectObject(&nPen);dc.Ellipse(10,50,100,200);dc.Sel

43、ectObject(&oPen);11.3.3 用MFC向导添加消息映射函数1、添加类的消息映射函数的方法、添加类的消息映射函数的方法MFC为消息映射提供了一个向导,该向导能够自动完为指定类添加消息映射函数的雏形。程序员只需要在向导添加的消息处理函数中添加程序代码就能够实现需要的程序功能。2、消息映射向导在类中添加的程序代码、消息映射向导在类中添加的程序代码 在类声明中添加消息映射声明宏DECLARE_MESSAGE_MAP,形式如下:class X DECLARE_MESSAGE_MAP();11.3.3 用用MFC向导添加消息映射函数向导添加消息映射函数 在类的实现文件中添加消息映射,形式

44、如下:BEGIN_MESSAGE_MAP(X,ParentClass)ON_WM_LBUTTONDOWN()END_MESSAGE_MAP()在类的实现文件中添加消息处理函数void X:OnLButtonDown(UINT nFlags,CPoint point)11.3.3 用用MFC向导添加消息映射函数向导添加消息映射函数【例11-3】扩展例11-2建立的框架程序的功能。使该程序能够处理鼠标左键和右键的单击事件。单击左键时在光标位置画椭圆,单击右键时在光标位置画矩形。程序设计思路程序设计思路:虽然CMyApp、CMainFrame、CMyDoc、CMyView这4个类都具有消息处理能力,

45、都可以实现上述功能,但在CMyView中实现这些功能最简单。原因是单击鼠标左键、右键都需要在屏幕上显示信息,而CMyView类本身就是被设计来处理数据输出的,所以在CMyView类中实现数据输出最简单。11.3.3 用用MFC向导添加消息映射函数向导添加消息映射函数编程过程编程过程1利用利用MFC向导为向导为CMyView类添加消息映射函数类添加消息映射函数(1)在VC+6.0中打开例11-2建立的框架程序项目My.dsw,选择“查看”菜单中的“建立类向导”命令,或按快捷键Ctrl+W,弹出MFC的类向导对话框,如图所示。(2)选择“Message Maps”标签,在“Project”列表框中

46、选择项目文件My,单击“Class name”下拉列表,列表中包含有本项目中的所有类“CMyApp、CMainFrame、CMyDoc、CMyView、CAboutDlg”,从中选择CMyView类名,即为CMyView添加消息映射。(3)“Messages:”列表中列出了Windows系统预定义的Windows消息,单击垂直滚动条,从中找到“WM_LBUTTONDOW”消息并双击它,或选中它然后单击“Add Function”按钮。按照同样的方式处理WM_RBUTTONDOWN消息。(4)完成了第(3)步操作后,单击“确定”按钮,结束MFC消息映射向导。查看类向导在CMyView.h头文件中

47、添加的消息处理函数的声明/MyView.hclass CMyView:public CViewprotected:/AFX_MSG(CMyView)afx_msg void OnLButtonDown(UINT nFlags,CPoint point);afx_msg void OnRButtonDown(UINT nFlags,CPoint point);/AFX_MSG DECLARE_MESSAGE_MAP();上述向导过上述向导过程添加了这程添加了这两行代码两行代码 查看MFC向导生成的消息映射宏打开CMyView.cpp文件,在其中可以看到下面形式的消息宏映射:BEGIN_MESSA

48、GE_MAP(CMyView,CView)/AFX_MSG_MAP(CMyView)ON_WM_LBUTTONDOWN()/单击鼠标左键宏单击鼠标左键宏 ON_WM_RBUTTONDOWN()/单击鼠标右键宏 /AFX_MSG_MAP END_MESSAGE_MAP()上述向导过上述向导过程添加了这程添加了这两行代码两行代码 查看查看MFC向导生成的消息处理函数向导生成的消息处理函数打开CMyView.cpp文件,在其中可以看到下面形式的消息处理函数。void CMyView:OnLButtonDown(UINT nFlags,CPoint point)/TODO:Add your messa

49、ge handler code here and/or call default CView:OnLButtonDown(nFlags,point);void CMyView:OnRButtonDown(UINT nFlags,CPoint point)/TODO:Add your message handler code here and/or call default CView:OnRButtonDown(nFlags,point);上述向导过上述向导过程添加了这程添加了这样两个消息样两个消息处理函数框处理函数框架架11.3.3 用用MFC向导添加消息映射函数向导添加消息映射函数2设计鼠

50、标右键单击事件的程序代码,实现如下功能:当当单单击击鼠鼠标标右右键键时时,利利用用CClientDC获获取取窗窗口口客客户户区区域域,然然后后创创建建具具有有3个个像像素素点点宽宽的的绿绿色色画画笔笔和和红红色色画画刷刷,并并通通过过CClientDC对对象象的的成成员员函数函数Rectangle绘制矩形。绘制矩形。打开向导生成的CMyView:OnRButtonDown 消息处理函数,在其中输入程序代码,如下所示;void CMyView:OnRButtonDown(UINT nFlags,CPoint point)CClientDC dc(this);/定义CClientDC的对象用于输出

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁