可视化编程课件02MFC.ppt

上传人:sccc 文档编号:5613408 上传时间:2023-08-02 格式:PPT 页数:96 大小:5.53MB
返回 下载 相关 举报
可视化编程课件02MFC.ppt_第1页
第1页 / 共96页
可视化编程课件02MFC.ppt_第2页
第2页 / 共96页
可视化编程课件02MFC.ppt_第3页
第3页 / 共96页
可视化编程课件02MFC.ppt_第4页
第4页 / 共96页
可视化编程课件02MFC.ppt_第5页
第5页 / 共96页
点击查看更多>>
资源描述

《可视化编程课件02MFC.ppt》由会员分享,可在线阅读,更多相关《可视化编程课件02MFC.ppt(96页珍藏版)》请在三一办公上搜索。

1、1,第2章 MFC基础与编程方法,Visual C+6.0开发平台MFC类的组织结构MFC向导的主要功能MFC程序框架分析Windows消息机制,2,Visual C+6.0平台(1),编辑区,工作区,输出区,3,Visual C+6.0平台(2),ClassView面板列出项目中的所有类FileView面板显示项目中的所有文件ResourceView面板显示项目中的所有资源,例如Bitmap、Cursor、Dialog、Icon、Menu、Accelerator、String Table、Toolbar与Version等,4,Visual C+6.0平台(3),可创建的项目类型,5,Visu

2、al C+6.0平台(4),可创建的项目类型,6,Visual C+6.0平台(5),可创建的文件类型,7,Visual C+6.0平台(6),可创建的文件类型,8,Visual C+6.0平台(7),MFC ClassWizard,9,程序调试与运行(1),编译(Compile)链接(Link)执行(Execute)调试(Debug),工具按钮,10,程序调试与运行(2),Debugger可以完成的工作:设置断点单步执行代码监视变量、寄存器和内存查看汇编代码和调用堆栈修改代码和变量值,11,程序调试与运行(3),Start DebugGoStep IntoStep OverStep OutB

3、reak Point,12,程序调试与运行(4),例2-1,13,项目的概念(1),项目(Project)由多个源、头文件组成,以及系统提供的函数支持,编译时有很多特殊选择,例如版本、优化、链接库等项目内容存在项目文件中,由它对整个程序进行统一管理。不同版本文件后缀不同,Visual C+5.0以上为“.dsp”,14,项目的概念(2),版本类型Debug版本产生调试信息,便于程序调试与运行Release版本不产生调试信息,代码简短且经过优化,程序执行效率较高,15,项目的概念(3),Build菜单Batch Build,16,项目的概念(4),项目文件类型*.dsp 项目中所有内容*.dsw

4、 工作区中所有项目*.clw ClassWizard信息*.rc 资源描述信息Resource.h 所有资源符号定义StdAfx.h和.cpp 建立预编译头文件/res 各种资源存放的目录,17,MFC类的组织结构(1),MFC是C+语言的安全子集,也是一个应用程序框架,简化Windows编程难度MFC类是以层次结构组织,封装大部分Windows API和控件当前MFC版本包含100多个类,可实现应用程序的大部分功能,18,MFC类的组织结构(2),根类(CObject)应用程序结构类(CCmdTarget、CWinThread、CWinApp、CDocument)可视对象类(CWnd、CVi

5、ew、CMenu、CDialog、控件类、CControlBar、CGdiObject)通用类(CFile、CException、CArray),19,根类与应用程序类(1),根类CObjectCObject是MFC抽象基类,多数MFC类与用户自定义类的根类,提供编程所需的公共操作,例如对象建立与删除应用程序类CWinAppCWinApp是MFC应用程序基类,每个程序只有一个程序对象,该类是从CWinApp派生,提供程序相关操作,例如初始化、运行与终止,20,根类与应用程序类(2),CWinApp类的继承关系CCmdTarget:MFC消息映射基类CWinThread:MFC线程操作基类,21

6、,根类与应用程序类(3),CWinApp类的公有成员函数,22,根类与应用程序类(4),文档与视图文档对象由文档模板创建,管理应用程序的数据,包括文档创建、打开与保存文档模板及基类:CDocTemplate:文档模板基类CSingleDocTemplate:SDI文档模板CMultiDocTemplate:MDI文档模板CDocument:专用文档基类,23,可视对象类(1),窗口类CWndCWnd类是MFC窗口基类,实现不同类型窗口CWnd派生类CFrameWnd:单文档框架窗口类CMIDFrameWnd:多文档主框架窗口类CMIDChildWnd:多文档子框架窗口类,24,可视对象类(2)

7、,视图类CViewCView类是MFC视图基类,实现框架窗口中的客户区,25,可视对象类(3),CView派生类,26,可视对象类(4),菜单类CMenuCMenu类是MFC菜单类,实现菜单界面对话框类CDialogCFileDialog:文件存取对话框CColorDialog:颜色选择对话框CFontDialog:字体选择对话框CPrintDialog:文件打印对话框CFindReplaceDialog:文本查找对话框,27,可视对象类(5),控件类,28,可视对象类(6),控件条类CControlBarCControlBar是控件栏基类,实现工具条、状态条与浮动对话框CControlBar

8、派生类CStatusBar:状态条CToolBar:带位图按钮的工具条CDialogBar:控件条形式的浮动对话框,29,可视对象类(7),绘图对象类CGdiObjectCGdiObject是GDI基类,实现绘图对象CGdiObject派生类CBitmap:位图操作接口CBrush:画刷CFont:字体CPalette:调色板CPen:画笔CRgn:椭圆或多边型域,30,可视对象类(8),设备描述环境类CDC主要用来实现窗口绘制CDC派生类CPaintDC:绘图设备描述环境CClientDC:客户区的设备描述环境CWindowDC:窗口的设备描述环境CMetaFileDC:元文件的设备描述环境

9、,31,通用类(1),文件类CFileCFile类是文件访问基类,实现文件输入与输出操作CFile派生类CMemFile:驻内存文件访问接口CStdioFile:缓存流式文件访问接口CArchive类CFile类通常由CArchive间接访问,32,通用类(2),异常类CExceptionCNotSupportException:不支持异常CMemoryException:内存异常CFileException:文件异常CResourceException:资源异常COleException:OLE异常CDBException:数据库异常CUserException:用户操作异常,33,通用类(

10、3),模板收集类CArray:将数据存储到数组CList:将数据存储到链表CMap:关键字与数据的映射,34,OLE类,OLE是对象链接与嵌入,对象服务体系结构普通类:COleDocument、COleItem客户类:COleClientDoc、COleClientItem服务类:COleServer、COleTemplate可视编辑容器类:COleLinkingDoc数据传输类:COleDropSource、COleTarget、COleDataSource、COleDataObject对话类:COleInsertDialog,35,ODBC类,ODBC类是MFC数据库访问类,可访问支持OD

11、BC的数据库系统,完成查询、更新等操作CDatabase:连接数据源CRecordset:数据源的一组记录CRecordView:记录的表单视图CFieldExchange:支持记录字段交换CLongBinary:存储二进制对象句柄,36,MFC全局函数,以Afx为前缀的函数,37,MFC向导功能(1),第1步:应用程序类型 第2步:数据库支持,例2-2,38,MFC向导功能(2),第3步:OLE与ActiveX 第4步:用户界面,39,MFC向导功能(3),第5步:应用程序风格 第6步:MFC类选择,40,MFC向导功能(4),Single DocumentNo DatabaseNo OLE

12、Tool BarStatus BarSystem Button,41,MFC程序框架分析(1),例2-3,Windows程序核心是CWinApp,42,MFC程序框架分析(2),Test.cpp CTestApp theAppBOOL CTestApp:InitInstance()WinMain.cpp pThread-InitInstance()nReturnCode=pThread-Run()AfxWinTerm(),43,MFC程序框架分析(3),44,MFC程序框架分析(4),每次启动新的应用程序,WinMain函数都调用InitInstance()创建并注册文档模板,CSingleD

13、ocTemplate*pDocTemplate;pDocTemplate=new CSingleDocTemplate(IDR_MAINFRAME,RUNTIME_CLASS(CTestDoc),RUNTIME_CLASS(CMainFrame),RUNTIME_CLASS(CTestView);AddDocTemplate(pDocTemplate);,45,MFC程序框架分析(5),装载标准文件选项创建主边框窗口,CMainFrame*pMainFrame=new CMainFrame;if(!pMainFrame-LoadFrame(IDR_MAINFRAME)return FALSE;

14、m_pMainWnd=pMainFrame;,pMainFrame-ShowWindow(m_nCmdShow);pMainFrame-UpdateWindow();,46,MFC程序框架分析(6),InitInstance():初始化应用程序Run():启动消息循环OnIdle():空闲处理ExitInstance():终止应用程序,47,文档模板(1),文档模板用于存放与文档、视图和边框窗口相关的信息CSingleDocTemplate 单文档模板CMultiDocTemplate 多文档模板传递给C*DocTemplate的资源符号串,包括7个参数,每个参数用n隔开,用GetDocStr

15、ing可获得每个参数,48,文档模板(2),资源符号串,49,窗口类与窗口对象,50,消息的概念,消息处理机制是Windows核心,它是应用程序运行的动力来源消息是系统定义的32位值,它唯一定义一个事件,向Windows系统发出一个通知,告诉应用程序某个事件发生,51,消息循环,PeekMessage:查看消息队列,只起检测作用GetMessage:查看消息队列,将消息移走PreTranslateMessage:TranslateMessage的预处理函数TranslateMessage:将虚拟键转化为字符码,例如Shift+8*DispatchMessage:消息分发到消息处理函数,52,消

16、息映射表,/TestView.hclass CTestView:public CView protected:/AFX_MSG(CTestView)afx_msg void OnLButtonDown(UINT nFlags,CPoint point);afx_msg void OnEditPaste();/AFX_MSG DECLARE_MESSAGE_MAP();/TestView.cppBEGIN_MESSAGE_MAP(CTestView,CView)/AFX_MSG_MAP(CTestView)ON_WM_LBUTTONDOWN()ON_COMMAND(ID_EDIT_PASTE,O

17、nEditPaste)/AFX_MSG_MAPEND_MESSAGE_MAP(),53,消息控制机制(1),在CTestView:OnDraw()中,例2-4,pDC-TextOut(20,20,Hello World!);pDC-SelectStockObject(GRAY_BRUSH);pDC-Ellipse(20,50,100,130);,54,消息控制机制(2),鼠标控制消息,CDC*pDC=GetDC();pDC-TextOut(point.x,point.y,Mouse Clicked!);ReleaseDC(pDC);,55,消息控制机制(3),鼠标控制消息,CClientDC

18、cDC(this);cDC.TextOut(point.x,point.y,Mouse Clicked!);,56,消息控制机制(4),菜单控制消息,CDC*pDC=GetDC();pDC-TextOut(20,120,Menu Clicked!);ReleaseDC(pDC);,57,趣味性例子(1),绘制一片绿色的叶子,例2-5,58,趣味性例子(2),void CMyTreeView:OnDraw(CDC*pDC)int nTotalPoints=32000;/打印nTotalPoints个点 CRect rect;GetClientRect(,59,趣味性例子(3),if(dP0.01

19、,60,消息的种类(1),Windows系统将各种事件以消息形式发送给目标,目标根据消息内容进行处理目标窗口 消息类型 参数wParam 参数lParam,61,消息的种类(2),标准Windows消息窗口消息(WM_CREATE、WM_PAINT等)、鼠标消息(WM_LBUTTONDOWN、WM_MOUSEMOVE等)、键盘消息(WM_KEYDOWN、WM_CHAR等)、WM_TIMER控件消息从控件传送给父窗口的消息命令消息用户界面对象(包括菜单、工具栏、加速键等)的WM_COMMAND消息,62,消息处理过程(1),标准Windows消息不通过命令目标链,由发送消息的窗口处理,处理函数在

20、相应类中定义,通过AFX_MSG区分,/AFX_MSG(CTestView)afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);afx_msg void OnDestroy();afx_msg void OnLButtonDown(UINT nFlags,CPoint point);/AFX_MSG,63,消息处理过程(2),WM_COMMAND能被更多的对象处理,包括应用程序、窗口、文档与视图等命令消息通过命令目标链发送,每个目标都检查自己的消息映射,决定能否处理消息命令目标链发送顺序:当前活动的子目标、自己、其它目标,64,消息处理过程(

21、3),命令处理顺序,65,窗口消息(1),WM_CREATE消息当窗口对象生成后,系统发送WM_CREATE,完成窗口的初始化WM_DESTROY消息当应用程序退出时,系统发送WM_DESTROY,完成某些收尾工作WM_PAINT消息当窗口发生变化时,系统发送WM_PAINT,重绘窗口并显示数据,66,窗口消息(2),添加WM_CREATE消息ClassWizardMessage MapsCTestView WM_CREATEAdd Function编写WM_CREATE的响应函数CTestView:OnCreate()中 MessageBox(完成窗口初始化!);添加WM_DESTROY消息

22、CTestView:OnDestory()中 MessageBox(完成窗口销毁!);,例2-6,67,窗口消息(3),68,窗口消息(4),在CTestView类定义中在CTestView构造函数中在CTestView:OnDraw()中,m_Num=0;/初始化,private:int m_Num;,m_Num+;CString str;str.Format(窗口重绘次数:%d,m_Num);pDC-TextOut(0,0,str);pDC-SelectStockObject(GRAY_BRUSH);pDC-Ellipse(0,20,200,220);,69,窗口消息(5),WM_PAIN

23、TCTestView消息循环CView消息循环CView:OnPaint()CView:OnDraw(),70,鼠标消息(1),当用户对鼠标进行操作时,会产生对应的消息,系统将消息发送给对应窗口鼠标消息主要包括:WM_MOUSEMOVE 鼠标移动WM_LBUTTONDOWN 鼠标左键按下WM_RBUTTONDOWN 鼠标右键按下WM_LBUTTONUP 鼠标左键释放WM_RBUTTONUP 鼠标右键释放WM_LBUTTONDBLCLK 鼠标左键双击,71,鼠标消息(2),鼠标消息处理函数的参数:nFlag和pointnFlag表示鼠标按钮状态,鼠标事件发生时的键盘某些键状态,每位由nFlag相

24、应位表示MK_CONTROL、MK_SHIFT、MK_LBUTTON、MK_MBUTTON、MK_RBUTTONpoint表示鼠标事件发生时的光标位置,72,鼠标消息(3),在CTestView:OnLButtonDown()中窗口最小化,然后最大化。哪些信息保留,哪些信息消失?为什么?如何保留最后一次鼠标单击信息?,例2-7,CDC*pDC=GetDC();pDC-TextOut(point.x,point.y,Mouse Clicked!);ReleaseDC(pDC);,73,鼠标消息(4),在CTestView类定义中在CTestView:CTestView()中,private:CP

25、oint m_Pos;CString m_Des;,m_Pos=CPoint(0,0);m_Des.Empty();,74,鼠标消息(5),在CTestView:OnLButtonDown()中在CTestView:OnDraw()中,m_Pos=point;if(nFlags,pDC-TextOut(m_Pos.x,m_Pos.y,m_Des);,75,鼠标消息(6),窗口重绘的结果,76,键盘消息(1),用户对键盘进行操作,产生相应的键盘消息,系统将消息发送给相应窗口键盘消息主要包括:WM_KEYDOWN:键盘按下WM_KEYUP:键盘弹起WM_CHAR:输入一个字符,77,键盘消息(2)

26、,在CTestView:OnChar()中,void CTestView:OnChar(UINT nChar,UINT nRepCnt,UINT nFlags)CString str;str.Format(按下%c键!,nChar);MessageBox(str,键盘按键);,例2-8,78,键盘消息(3),特殊键处理,例如F1、F2、等,BOOL CTestView:PreTranslateMessage(MSG*pMsg)if(pMsg-message=WM_KEYDOWN)if(pMsg-wParam=VK_F1)MessageBox(按下F1键);if(pMsg-wParam=VK_U

27、P)MessageBox(按下键);,79,菜单与工具栏消息(1),添加菜单消息ResourceViewMenuIDR_MAINFRAME一级菜单项MyMenu二级菜单项Execute(ID_EXECUTE)一级菜单项MyMenu二级菜单项Font(ID_FONT)在CTestView:OnExecute()中MessageBox(菜单创建成功!);,例2-9,80,菜单与工具栏消息(2),添加工具栏消息ResourceViewToolBarIDR_MAINFRAME添加按钮(ID_COLOR)在CTestView:OnColor()中,CColorDialog Dlg;Dlg.DoModal

28、();,81,WM_TIMER消息(1),WM_TIMER消息是一种计时器消息通过SetTimer()函数设置时钟,当预定的时间到达,系统产生WM_TIMER消息,并通过参数表明是哪个时钟用户用于进行周期性处理,82,WM_TIMER消息(2),WM_CREATE消息,在OnCreate()中 SetTimer(1,2000,NULL);/设置计时器,ID号为1,间隔2000ms,消息处理函数默认WM_TIMER消息,在OnTimer()中if(nIDEvent=1)WM_DESTROY消息,在OnDestroy()中KillTimer(1);/清除计时器1,83,简单动画程序设计,使用WM_

29、TIMER消息异或方式制作动画:SetROP2(R2_XORPEN),例2-10,84,其他消息(1),有些消息不常出现,ClassWizard中没有封装,因此找不到相应消息,但系统确实存在该消息,需要手工处理消息典型的是热键消息WM_HOTKEY。用户可以定义一个热键,不论是前台或后台程序,只要用户按这个热键,程序立即切换到前台,并收到一个热键消息,参数表明哪个热键按下,85,其他消息(2),在CTestView类定义中void OnHotkey(WPARAM wParam,LPARAM lParam);在CTestView类中ON_MESSAGE(WM_HOTKEY,OnHotkey)在C

30、TestView:OnCreate()中,RegisterHotKey(m_hWnd,1001,MOD_CONTROL|MOD_ALT,z);RegisterHotKey(m_hWnd,1002,MOD_CONTROL|MOD_ALT,Z);,86,其他消息(3),在CTestView:OnHotkey()中在CTestView:OnDestroy()中,if(wParam=1001|wParam=1002)MessageBox(接收热键消息!);,UnregisterHotKey(m_hWnd,1001);UnregisterHotKey(m_hWnd,1002);,87,自定义消息(1),

31、用户有时需要定义内部消息,以区别系统定义的消息,完成用户自定义的处理这些消息是用户定义,系统不知道消息存在,通过PostMessage()或SendMessage()发送消息是一个整数,系统已使用一部分。小于WM_USER的整数保留,大于的供用户使用用户自定义消息的方式#define WM_MYMESSAGE WM_USER+N,88,自定义消息(2),自定义消息的操作步骤定义自己的窗口消息在适当位置声明消息处理函数将消息处理函数与消息对应实现消息处理函数向发送消息者提供窗口句柄,89,自定义消息(3),声明用户自定义消息#define WM_MYMESSAGE WM_USER+1在CTest

32、View类定义中void OnMyMessage(WPARAM wParam,LPARAM lParam);在CTestView类中,建立消息映射关系ON_MESSAGE(WM_MYMESSAGE,OnMyMessage),例2-11,90,自定义消息(4),在CTestView:OnMyMessage()中,void CTestView:OnMyMessage(WPARAM wParam,LPARAM lParam)CString str;str.Format(消息参数%d和%d,wParam,lParam);MessageBox(str);,91,自定义消息(5),在CTestView:O

33、nLButtonUp()中 PostMessage(WM_MYMESSAGE,1,2);在CTestView:OnChar()中 SendMessage(WM_MYMESSAGE,3,4);,92,有趣的分形理论(1),分形理论建立于20世纪70年代末,它的出现震惊科学界,被列入20项重大科学发现在欧几里得几何学无能为力的领域,分形理论脱颖而出。分形是对没有特征长度、具有一定意义的自相似图形或结构的总称,例2-12,93,有趣的分形理论(2),void CTestView:OnDraw(CDC*pDC)CRect rect;this-GetClientRect(,94,有趣的分形理论(3),void CTestView:OnDraw(CDC*pDC)m_pDC=pDC;CRect rect;this-GetClientRect(,95,第2次作业,编程实现键盘鼠标测试程序,满足以下要求:按下键盘任意键,屏幕显示按键信息单击鼠标左键,屏幕显示鼠标信息假设鼠标右键失灵,用Ctrl+鼠标左键代替自定义WM_MY_MESSAGE消息,带50和100两个参数,由“?”键激活,屏幕显示相应信息编程实现SmallBall程序,96,谢谢大家,

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

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号