MFC第七讲
mfc7
void CWinApp::OnAppExit()
{
// same as double-clicking on main window close box
然后,关闭并销毁对应的边框窗口。
如果文档对象的 m_bAutoDelete为真,则销毁文档对象自身。
窗口的销毁过程
DestroyWindow
从图6-1、图6-2可以看出,销毁窗口是通过调用DestroyWindow来完成的。DestroyWindow是CWnd类的一个虚拟函数。CWnd实现了该函数,而CMDIChildWnd覆盖了该函数。
BOOL CDocument::OnSaveDocument(LPCTSTR lpszPathName)
该函数是虚拟函数,用来保存文件。其实现的功能和OpOpenDocument相反,但处理流程类似,描述如下:
根据lpszPathName打开文件pFile;
使用pFile构造一个用于写入数据的CArchive对象,此对象用来保存数据到文件;
设置鼠标为时间瓶形状;
使用Serialize函数完成序列化写;
完毕,恢复鼠标的形状。
CWinApp::SaveAllModified()
CWinApp::CloseAllDocuments(BOOL bEndSession)
这两个函数都遍历模板管理器列表,并分别对列表中的模板管理器对象逐个调用CDocManager的同名成员函数:
如果不是主窗口被关闭,则是文档边框窗口被关闭,又分两种情况:若该窗口所显示的文档被且仅被该窗口显示,则关闭文档和文档窗口并销毁窗口;若该窗口显示的文档还被其他文档边框窗口所显示,则仅仅关闭和销毁文档窗口。
MFC讲义
1.将MFC应用程序的命令处理路径补充完整:命令—(视图类)—(文档类)—文档模板类—(框架窗口类)—应用程序类2.传统的软件开发主要采用(过程)驱动的方法,而WINDOWS程序的开发使用(消息)驱动模型,该模型靠(事件)机制来实现其功能。
3.(主框架类)是应用程序中负责控制菜单、工具栏和状态栏等界面元素的最主要的类。
4.VC++开发环境可以生成的基于MFC AppWizard exe的应用程序类型有(对话框)(单文档/视图结构)和(多文档/视图结构)。
5.包含类定义的文件称为(头文件),包含类中成员函数的实现代码的文件称为(源文件),包含资源信息的文件称为(资源文件)。
6.Resource View的主要功能是(编辑当前工程中的资源)。
7.应用程序向导的主要功能是(帮助生成应用程序)。
8.导的主要功能是(管理各个类中的消息)。
9.工作区窗口一般在开发环境的左侧,它包含工程的多各方面,分别是(ClassView)、(ResourceView)和(FileView)。
10.项目工作区的文件扩展名为(dsw)。
11. WINDOWS应用程序的消息来源主要包括(输入消息)、(控制消息)、(系统消息)和(用户消息)。
12.发送消息可以采用的两个函数是(PostMessage)和(SendMessage)。
mdUI类的主要功能是(主要用来更新命令用户接口的状态,如子菜单、工具栏上的按钮等)。
14.代码ON_UPDATE_COMMAND_UI(ID_TEST,OnUpdateTest)的主要功能是(将对ID_TEST的更新命令接口消息的处理映射到OnUpdateTest函数上)。
15.CString类的功能是(处理字符串),其Format函数的功能是(格式化字符串)。
16.Ctime类的功能是(处理日期时间),其Format函数的功能是(将时间对象格式化为字符串)。
17.MessageBox函数的第一个参数表示(消息文字),第二个参数表示(标题文字),第三个参数表示(图标与按钮组合).18.在windows中,按下一个字符键,会依次触发(WM_KEYDOWN)、(WM_CHAR)和(WM_KEYUP)3个消息19.windows窗口内部需要重新绘制时,会得到一个(WM_PAINT)消息,当释放鼠标右键时,会得到一个(WM_RBUTTONUP)消息。
MFC知识点(自己整理的,只供参考)
知识点:不是很全面,只供参考第一章Windows应用程序使用的界面是由各种图形元素组成的图形界面(GUI)。
Windows提供了大量预定义的用C语言编写的函数,这些函数就叫做API(Application Programming Interface)函数。
在Windows应用程序中,存在着许多与DOS应用程序不同的复杂对象,例如窗口、按钮、滚动条等等。
Windows把为这种复杂对象所定义的标识叫做句柄。
常用的句柄类型:HWND 窗口句柄,HDC 图形设备环境句柄,HINSTANCE 当前程序应用实例句柄,HBITMAP 位图句柄,HICON 图标句柄,HCURSOR 光标句柄,HBRUSH 画刷句柄,HPEN 画笔句柄,HFONT 字体句柄,HMENU 菜单句柄,HFILE 文件句柄事件的描述是一个消息消息的结构:typedef struct tagMSG{HWND hwnd; //产生消息的窗口句柄UINT message;//消息的标识码WPARAM wParam;//消息的附加信息1LPARAM lParam;//消息的附加信息2DWORD time; //消息进入消息队列的时刻POINT pt; //表示发送该消息时鼠标的位置}MSG;消息循环:while(GetMessage(&msg,NULL,NULL,NULL))//系统处理了消息后返回{TranslateMessage(&msg);//把键盘消息翻译成字符消息DispatchMessage(&msg);//把消息派发给Windows系统创建窗口的三个步骤:注册窗口类:RegisterClass(&wc);创建窗口:hwnd=CreateWindow( lpszClassName,"Windows",WS_OVERLAPPEDWINDOW,120,50,800,600,NULL, NULL, hInstance,NULL);显示窗口:ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);大题:用函数封装Windows程序(P16)第二章类封装:窗口类:class CFrameWnd{public:HWND hWnd;///数据成员public:int RegisterWindow(); //定义及注册窗口类void Create(LPCTSTR lpClassName,LPCTSTR lpWindowName);//创建窗口void ShowWindow(int nCmdShow);//显示与更新窗口void UpdateWindow();};应用程序类:class CWinApp{public:CFrameWnd*m_pMainWnd;//以窗口类的对象作为数据成员public:BOOL InitInstance (int nCmdShow);//在初始化函数中创建及显示窗口int Run();//消息循环};窗口函数的封装——消息映射用DECLARE_MESSAGE_MAP来声明消息映射表用BEGIN_MESSAGE_MAPBEGIN_MESSAGE_MAP(类名称,基类名称)ON_XXXX 例ON_WM_PAINT()END_MESSAGE_MAP来实现消息映射表大题:类封装Windows应用程序第三章应用程序的框架由两个对象组成:应用程序类CWinApp的派生类对象和框架窗口类CFrameWnd的派生类对象,后者作为一个成员对象嵌在前者之中。
第7章 MFC原理与方法new精品PPT课件
7.4.1 MFC消息映射机制
MFC 采 用 消 息 映 射 ( Message Map) 机 制 取 代 C/C++语言中的switch-case结构来处理消息。
MFC消息映射机制包括一组消息映射宏。一条消息 映射宏把一个Windows消息和其消息处理函数联结 起来。
MFC应用程序框架提供了消息映射功能。 在 类 的 实 现 源 文 件 中 用 BEGIN_MESSAGE_MAP()
BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) //{{AFX_MSG_MAP(CMainFrame) ON_WM_CREATE() // 由MFC AppWizard程序向导自动生成的消息映
射 ON_WM_CLOSE() // 由ClassWizard类向导添加 ON_WM_DESTROY() ON_COMMAND(ID_EDIT_COPY, OnEditCopy) //}}AFX_MSG_MAP
命令(Command)消息:由菜单项、工具栏按钮、快捷 键等用户界面对象发出的WM_COMMAND消息。命令 消息与其它消息不同,它可被更广泛的的对象如文档、 文档模板、应用程序对象、窗口和视图等处理。
消息用MSG结构表示:
typedef struct tagMSG
{
HWND hWnd;
// 目标窗口句柄
和END_MESSAGE_MAP()宏来定义消息映射。 在类定义的结尾用DECLARE_MESSAGE_MAP()宏
来声明使用消息映射。
MFC应用程序MESSAGE_MAP消息映射形式:
BEGIN_MESSAGE_MAP(theclass, baseclass)
//{{AFX_MSG_MAP(theclass)
VS2010之MFC入门到精通教程(1-55全部)
VS2010/MFC编程入门教程之目录第一部分:VS2010/MFC开发环境VS2010/MFC编程入门之前言VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解)第二部分:VS2010-MFC应用程序框架VS2010/MFC编程入门之二(利用MFC向导生成单文档应用程序框架)VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)VS2010/MFC编程入门之四(MFC应用程序框架分析)VS2010/MFC编程入门之五(MFC消息映射机制概述)第三部分:对话框VS2010/MFC编程入门之六(对话框:创建对话框模板和修改对话框属性)VS2010/MFC编程入门之七(对话框:为对话框添加控件)VS2010/MFC编程入门之八(对话框:创建对话框类和添加控件变量)VS2010/MFC编程入门之九(对话框:为控件添加消息处理函数)VS2010/MFC编程入门之十(对话框:设置对话框控件的Tab顺序)VS2010/MFC编程入门之十一(对话框:模态对话框及其弹出过程)VS2010/MFC编程入门之十二(对话框:非模态对话框的创建及显示)VS2010/MFC编程入门之十三(对话框:属性页对话框及相关类的介绍)VS2010/MFC编程入门之十四(对话框:向导对话框的创建及显示)VS2010/MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)VS2010/MFC编程入门之十六(对话框:消息对话框)VS2010/MFC编程入门之十七(对话框:文件对话框)VS2010/MFC编程入门之十八(对话框:字体对话框)VS2010/MFC编程入门之十九(对话框:颜色对话框)第四部分:常用控件VS2010/MFC编程入门之二十(常用控件:静态文本框)VS2010/MFC编程入门之二十一(常用控件:编辑框Edit Control)VS2010/MFC编程入门之二十二(常用控件:按钮控件Button、Radio Button和Check Box)VS2010/MFC编程入门之二十三(常用控件:按钮控件的编程实例)VS2010/MFC编程入门之二十四(常用控件:列表框控件ListBox)VS2010/MFC编程入门之二十五(常用控件:组合框控件Combo Box)VS2010/MFC编程入门之二十六(常用控件:滚动条控件Scroll Bar)VS2010/MFC编程入门之二十七(常用控件:图片控件Picture Control)VS2010/MFC编程入门之二十八(常用控件:列表视图控件List Control 上)VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)VS2010/MFC编程入门之三十(常用控件:树形控件Tree Control 上)VS2010/MFC编程入门之三十一(常用控件:树形控件Tree Control 下)VS2010/MFC编程入门之三十二(常用控件:标签控件Tab Control 上)VS2010/MFC编程入门之三十三(常用控件:标签控件Tab Control 下)第五部分:菜单、工具栏与状态栏VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)VS2010/MFC编程入门之三十五(菜单:菜单及CMenu类的使用)VS2010/MFC编程入门之三十六(工具栏:工具栏资源及CToolBar类)VS2010/MFC编程入门之三十七(工具栏:工具栏的创建、停靠与使用)VS2010/MFC编程入门之三十八(状态栏的使用详解)第六部分:文档、视图和框架VS2010/MFC编程入门之三十九(文档、视图和框架:概述)VS2010/MFC编程入门之四十(文档、视图和框架:各对象之间的关系)VS2010/MFC编程入门之四十一(文档、视图和框架:分割窗口)第七部分:MFC常用类VS2010/MFC编程入门之四十二(MFC常用类:CString类)VS2010/MFC编程入门之四十三(MFC常用类:CTime类和CTimeSpan类)VS2010/MFC编程入门之四十四(MFC常用类:定时器Timer)VS2010/MFC编程入门之四十五(MFC常用类:CFile文件操作类)VS2010/MFC编程入门之四十六(MFC常用类:MFC异常处理)第八部分:字体和文本输出VS2010/MFC编程入门之四十七(字体和文本输出:CFont字体类)VS2010/MFC编程入门之四十八(字体和文本输出:文本输出)第九部分:图形图像VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)VS2010/MFC编程入门之五十(图形图像:GDI对象之画笔CPen)VS2010/MFC编程入门之五十一(图形图像:GDI对象之画刷CBrush)第十部分:Ribbon界面开发VS2010/MFC编程入门之五十二(Ribbon界面开发:创建Ribbon样式的应用程序框架)VS2010/MFC编程入门之五十三(Ribbon界面开发:为Ribbon Bar添加控件)VS2010/MFC编程入门之五十四(Ribbon界面开发:使用更多控件并为控件添加消息处理函数)VS2010/MFC编程入门之前言鸡啄米的C++编程入门系列给大家讲了C++的编程入门知识,大家对C++语言在语法和设计思想上应该有了一定的了解了。
MFC使用教程
MFC使用教程第一部分:MFC简介Visual C++ 不仅仅是一个编译器。
它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的C++ 来开发出专业级的Windows 应用程序。
为了能充分利用这些特性,你必须理解C++ 程序设计语言。
掌握了C++,你就必须掌握Microsoft 基本类库(MFC) 的层次结构。
该层次结构包容了Windows API 中的用户界面部分,并使你能够很容易地以面向对象的方式建立Windows 应用程序。
这种层次结构适用于所有版本的Windows 并彼此兼容。
你用MFC 所建立的代码是完全可移植的。
简单介绍MFC的基本概念和术语以及事件驱动程序设计方法。
输入、编译和运行一个简单的MFC程序。
第二部分中将详细解释这些代码。
第三部分讨论了MFC控件和如何定制它们。
什么是MFC?如果你要建立一个Windows 应用程序,应该如何下手?好的开端是从设计用户界面开始。
首先,你要决定什么样的用户能使用该程序并根据需要来设置相应的用户界面对象。
Windows 用户界面有一些标准的控件,如按钮、菜单、滚动条和列表等,这对那些Windows 用户已经是很熟悉了。
要记住的是,作为程序员必须选择一组控件并决定如何把它们安排到屏幕上。
传统上,你需要在纸上做一下用户界面的草图,直到对各元素感到满意为止。
这对于一些比较小的项目,以及一些大项目的早期原型阶段是可以的。
下一步,是要实现代码。
为任何Windows 平台建立应用程序时,程序员都有两种选择:C 或C++。
使用C,程序员是在Windows 应用程序界面( API ) 的水平上编写代码。
该界面是由几百个 C 函数所组成,这些函数在Windows API 参考手册中都有介绍。
对于Windows NT, API 被称为"Win32 API",以区别于其用于Windows 3.1的16位API, Microsoft 也提供了C++ 库,它位于任何Windows API 之上,能够使程序员的工作更容易。
第7章:MFC编程基础知识
Visual C++
概述
VC开发应用程序的最常用的模式就是利用MFC进行Win32应 用程序的设计。简单来说,MFC就是利用面向对象的思想,将 Windows大部分API函数封装起来的一个浩瀚的类库,利用MFC 编写程序本质上就是选择该类库中合适的类,并调用其下相 应成员函数来完成某个功能。虽然MFC编程相对于API编程简 单了(入门是简单了,但作到胸中丘壑自成却不容易),但 初学者却常常忘不了学习MFC的艰难。其主要原因有:(1) MFC采用的是C++语言,对C++本身的技术没有掌握。因此想学 好MFC,必须把第一篇的内容搞清楚;(2)MFC庞大的类库中 类的命名及成员变量或成员函数的命名没有清楚,其实很简 单,MFC中的类及其成员的命名都采用的是匈牙利命名法,把 这些名字的英文直接翻译过来,就知道它是什么意思。(3) MFC编程,首先生成的是一个应用程序架构,对这个架构的不 了解导致生成的代码不知其为何如此。本章就是要给大家一 个架构的概貌;(4)传统的API编程的步骤统统不见了,使人 们不知道编写的Windows程序什么时候建立起来 、什么时候 消亡. 事实上,MFC的应用程序架构把类似于API编程所要求 的步骤都隐藏了,都封装到架构中了。
Visual C++
*7.1.5 使用C++和MFC的好处
从本书的第一篇,我们已经看出了面向对象程序设计的好处,如 可复用性、代码和数据紧密地绑定等。类是面向对象程序设计的核心 概念,程序中不仅可以使用自己建立的类,还可以使用系统所提供的 类,一个好的类库可以大大减少编码的数量。MFC成功之处在于,它是 一个类库、一个包罗计算机系统方方面面的类库、一个集MicroSoft 各路软件高手之大成的类库。通过从MFC继承自己所需要的类,可以充 分利用基类所具有的各种功能。 MFC将类、类的继承、动态约束、类的关系和相互作用等应用程序 概念封装起来,可以使开发者高效、轻松地建立Windows应用程序,而 不受设备限制并且由事件进行驱动。 MFC具有良好的通用性和可移植性,它定义了应用程序的轮廓,并 提供了用户接口的标准实现方法,程序员所要做的工作就是通过VC所 提供的各种工具来完成这个工作。
MFC教程
01章用向导创建文档窗口MFC教程是小雅最怕写的内容,除了水平问题之外,还有一点就是,MFC将许多程序封装起来,使众多程序员在编程时,即使编出了程序,也不知究竟为什么这样就可以了。
这一现象使小雅想到当今的Java程序员,许多人在开发外包项目时,因为整个FrameWork已经建成,自己只是担当其中一部分功能,出了BUG之后,找原因非常困难。
在SDK教程中,小雅将各种功能进行详细解说,而MFC教程中,只是用例子来讲解MFC的原理,学会原理之后,就会感到MFC比SDK编程省了许多事。
小雅在SDK教程中,为了讲明API功能,用的方法都是C语言的方法,而MFC用的全是C++的内容,因此,学习MFC必须对C++有较深的了解,不会C语言、C++语言而能够学会MFC的人只能是吹牛。
小雅的“C语言教程”和“C++语言教程”都是按照标准C/C++来写的,在Unix、Linux、Windows都适用,这是很重要的基础。
SDK教程主要是让初学者明白WindowsAPI的功能,以及程序的实现方法,基本上是“C语言+ API”,而MFC基本上是“C++ + API”。
SDK编程和MFC是可以相互转化,相互调用的,因为MFC 封装了绝大部分API,但不是所有的API函数。
注意:SDK并不是只能用C语言来写,用C++一样编程,小雅在作教程时为了把内容说清楚,同时兼顾不会C++的人员才使用C语言。
对于初学者,小雅建议在C/C++的基础上用MFC来编程,一是省去了很多编程,二是用上了C++的面向对象编程的思想。
当今要找一个C++的项目来一边做一边学是很困难的。
小雅自己也一直想找一个C++的工作而未能如愿。
通过学习MFC 再反过来加强一下学的不是很深的C++,不是很好的一个方法吗?不过,MFC和SDK与C/C++不同点在消息事件处理方面,初学者要学会这一内容。
关于“”有“托管”和“非托管”二种编程方式,小雅的SDK教程和MFC教程全部是“非托管”编程,也就是传统编程。
第7章 MFC基础知识PPT教学课件
• AFX小组实际上做了两件工作:MFC类库和对MFC的IDE支持(即资源 编译器和操作向导)。在1994年4月份后,AFX的名字停止使用,该 小组成员成为Visual C++开发组的一部分,即现在的MFC小组。
▪ MFC的优势
• 完全支持Windows所有的函数、控件、消息、GDI基本图形函数、 菜单及对话框。
• 使用与API同样的命名规则,即匈牙利命名法; • 进行消息处理时,不使用易产生错误的switch/case语句,所有
消息通过宏来实现消息到成员函数的映射; • 可 利 用 与 MFC 紧 密 结 合 的 AppWizard( 应 用 程 序 向 导 ) 和
ClassWizard(类向导)等工具,快速开发出功能强大的应用程序。 • MFC是扩展了的C++类层次结构,开发Windows应用程序更容易。
2020/12/10
2
▪ 发展过程
• 开始,Microsoft建立了一个AFX( Application Framework应用 程序框架)小组,是为了与Borland C++的OWL (Object Windows Language)竞争。AFX小组时期提出了一个高度抽象Windows API的 一个类库,但由于过分抽象并没有太大的实用性,后放弃。
d
d
d
MFC类的基本层次结构
2020/12/10
5
(3)窗口、对话框和控件类 ·框架窗口类(窗口) ·视类(窗口) ·对话框类 ·控件类 ·控件条类
Visual_C++MFC入门教程(经典版)
Visual C++MFC入门教程目录+-- 第一章 VC入门|------ 1.1 如何学好VC|------ 1.2 理解Windows消息机制|------ 1.3 利用Visual C++/MFC开发Windows程序的优势|------ 1.4 利用MFC进行开发的通用方法介绍|------ 1.5 MFC中常用类,宏,函数介绍+-- 第二章图形输出|------ 2.1 和GUI有关的各种对象|------ 2.2 在窗口中输出文字|------ 2.3 使用点,刷子,笔进行绘图|------ 2.4 在窗口中绘制设备相关位图,图标,设备无关位图|------ 2.5 使用各种映射方式|------ 2.6 多边形和剪贴区域+-- 第三章文档视结构|------ 3.1 文档视图框架窗口间的关系和消息传送规律|------ 3.2 接收用户输入|------ 3.3 使用菜单|------ 3.4 文档,视,框架之间相互作用|------ 3.5 利用序列化进行文件读写|------ 3.6 MFC中所提供的各种视类介绍+-- 第四章窗口控件|------ 4.1 Button|------ 4.2 Static Box|------ 4.3 Edit Box|------ 4.4 Scroll Bar|------ 4.5 List Box/Check List Box|------ 4.6 Combo Box/Combo Box Ex|------ 4.7 Tree Ctrl|------ 4.8 List Ctrl|------ 4.9 Tab Ctrl|------ 4.A Tool Bar|------ 4.B Status Bar|------ 4.C Dialog Bar|------ 4.D 利用AppWizard创建并使用ToolBar StatusBar Dialog Bar |------ 4.E General Window|------ 4.F 关于WM_NOTIFY的使用方法+-- 第五章对话框|------ 5.1 使用资源编辑器编辑对话框|------ 5.2 创建有模式对话框|------ 5.3 创建无模式对话框|------ 5.4 在对话框中进行消息映射|------ 5.5 在对话框中进行数据交换和数据检查|------ 5.6 使用属性对话框|------ 5.7 使用通用对话框|------ 5.8 建立以对话框为基础的应用|------ 5.9 使用对话框作为子窗口+-- 第六章网络通信开发|------ 6.1 WinSock介绍|------ 6.2 利用WinSock进行无连接的通信+------ 6.3 利用WinSock建立有连接的通信《Visual C++开发指南》闻怡洋/文1.1 如何学好VC这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果。
MFC程序设计PPT课件
例 bIsValid ChText,ChGrade cString CsName DwFlags fnSort hWnd,hPen iCount pFrame szName m_szName
3.1.3 应用程序框架介绍
MFC提供了构造Windows应用程序的框架,它不 仅为应用程序建立标准的结构,生成一系列起动文 件,还提供标准的图形用户界面如菜单、工具栏、 状态条等供开发人员在程序中补充完善,开发人员 只需要完成针对特定应用的代码。使用应用程序框 架的应用程序代码小,运行速度快,它提供的工具 也降低了编码的难度。
3. 全局变量 全局变量名以afx开头,如afxTraceFlag、 afxDump等,主要与异常处理有关。
3.1.2 MFC命名规则
匈牙利命名法规定: • 变量名以一个或多个小写字母开头作为前 缀,标识变量的数据类型; • 类型标识后是若干个单词,标识变量含义, 每个单词以大写字母开头,其余字母小写;
• MFC中所有类及自定义类都以C开头; • 类成员变量以m_为前缀,下划线后是变 量名等等。
前缀 B,b Ch c Cs Dw fn
h i p sz m_
表3.1 命名规则
数据类型 BOOL char class CString DWORD function handle int pointer ASCII string Data member
1.文档-视图结构
文档视图结构提供一种连续处理数据的方式,使 应用程序的数据与数据的显示分开处理。
程序的数据储存在文档类中(作为文档类的数据成员),是 对数据的抽象表示。数据显示由视图负责,视图是程序窗 口的客户区,框架窗口是客户区的框架,程序数据显示在 窗口,用户通过视图与程序交互。
mfc课件
福建农林大学 李丽珊
•建立程序框架
• 使用MFC AppWizard 可以创建基于MFC的Windows 应用程序 • MFC AppWizard 显示一系列对话框,引导用户逐步 建立起应用程序的框架和设置程序的基本选项。 • MFC AppWizard 会自动生成应用程序所需的基本文 件,包括程序源文件、头文件、资源文件和项目文件 等。 • MFC AppWizard只为用户建立程序框架,例如程序的 基本界面,具体操作代码仍需要用户自己编写。
福建农林大学 李丽珊
目的要求
理解 MFC的类体系结构和关键技术
具有可视化界面的面向对象系统 开发方法;使用UML进行面向对 象系统的设计;
掌握
熟悉
MFC的类体系和关键技术;
了解
命名空间、UML语言基础 及简单应用。
福建农林大学 李丽珊
8.1 MFC基础和VC可视化开发基础
8.1.1 MFC的类体系
基类Cobject提供的最基本功能有: 1. 支持序列化(serialization)。序列化指如何让一个对象保持持 久不变,即把对象成员数据内容存入一个文件或从一个文件中 读取内容重构对象的过程。 2. 运行时(Run-time)类的信息获取。 3. 提供特定的new,delete和=操作符,完成对象的建立与删除。 福建农林大学 李丽珊
福建农林大学 李丽珊
福建农林大学 李丽珊
• 在项目工作区可以看到,MFC AppWizard创建 了CAboutDlg、CHelloApp、CHelloDoc、 CHelloView和CMainFrame 五个类。这时,我 们可以建立并运行这个程序,选择Build 菜单下 的!Executive hello.exe 选项,运行结果如图所 示。
第十单元MFC原理与方法PPT课件
Windows程序 = 程序代码 + 资源 Windows应用程序的一个特性是资源共享。
许多资源是在使用前必须向Windows操作 系统申请,使用结束后必须释放。
(注:第4条中提到的资源所指的范围和第3条提到 的资源所指的范围不同)
} else{
DispatchMessage(&msg); // 分发消息 } }
MFC应用程序框架
应用程序类中通常需要重载的函数
InitInstance用来添加自己应用程序的初始 化(全局变量等)代码。
ExitInstance用来完成一些应用程序资源 (全局变量等)的释放工作。
OnIdle用来处理一些后台操作,通常优先级 较低且占用时间很短。
MFC应用程序对象之间的关系
(p270,图7-4)必须牢记!!!
MFC应用程序框架
MFC应用程序的生与死
任何Windows应用程序有且只有一个从 CWinApp类派生的应用程序类
应用程序类对象theApp是在窗口创建之前就 构建好的,换言之,MFC应用程序启动时,首 先创建的就是应用程序对象theApp.
所有的外部响应(如键盘、鼠标和计时器等) 都由Windows先拦截,然后转换成消息后再 发送到应用程序的目标对象,应用程序根据消 息的具体内容进行相应的处理。
消息可以由Windows发出,也可以有应用程 序本身发出,还可以自定义消息。
事件和消息
消息队列:
Windows为每一个应用程序都维护一个或多个消息队 列。
Visual C++面向对象编程
第七章 MFC原理与方法
概述
与Visual C++捆绑在一起的是MFC。 MFC:Microsoft Foundation Class
MFC通用控件使用详解
PWIN98/95下演练VC5中的COMMON一族辽宁省铁岭市委办公室(112000)宋立波中文PWIN98/95之所以深受广大计算机用户的青睐,除其在32位多任务、多线程和系统稳固性等核心技术的重要改进之外,更主要的还是其优秀的用户交互界面。
这就给程序设计人员提出了新的课题,如何在自己开发的应用程序中充分利用WIN98/95支持的各种高级通用控制和视,这也是学习VC编程所必须掌握的基本内容,本文将通过实例来具体演练VC5中的这些控件,其中常用的COMMON一族主要成员包括:1.表头控制 Header Control2.图像列表控制 Image List3.列表控制和视 List Control&List View4.树控制和视 Tree Control&Tree View5.标签控制和视 Tab Control&Tab View6.工具条控制 Toolbar Control7.进度条控制 Progress Control8.滑动条控制 Slider Control9.旋转按钮控制 Spin Button Control10.状态条控制 Status Bar Control其中,绝大部分通用控制在MFC类库中都存在两种封装形式,即控制类和视类,控制类主要是供直接使用控制而提供的,而视类则是通过间接使用控制而提供的,视类可以更好地把控制类集成到MFC结构中,并且使用视类可以利用引用直接对嵌套在其中的控制进行各种操作。
两者在使用方法上没有太大区别,就拿列表控制类和视类来说,当创建列表视后可通过CListCtrl& ctrlList = GetListCtrl()成员函数取得视类引用ctrlList之后,就可以利用列表视的视函数对视进行各项操作(ctrlList.Add等)。
一、PWIN98/95下演练CHeadCtrl表头控制(CHeaderCtrl)通常应用在窗口中的文本或数据的列表之上。
C++MFC控件使用详解
1。
mfc单文档结构2。
添加左击鼠标,按下键盘事件3。
消息:窗口消息,控件的通知消息,命令消息第5章对话框和常用控件5.1对话框的使用5.2控件的创建和使用方法5.4通用对话框和消息对话框5.1对话框的使用5.1.1模式和无模式对话框模式对话框指当对话框被弹出,用户必须在对话框中作出相应的操作,在退出对话框之前,对话框所在的应用程序不能继续执行。
无模式对话框指当对话框被弹出后,一直保留在屏幕上,可继续在对话框所在的应用程序中进行其它操作;需要使用对话框时,单击对话框所在的区域即可激活。
在创建和退出对话框窗口时的方式不同:创建时,模式对话框由系统自动分配内存空间,对话框退出时,对话框对象自动删除。
无模式对话框需要来指定内存,退出时还需删除对话框对象。
退出时,两种对话框所使用的终止函数不一样。
模式对话框通过调用CDialog:: EndDialog来终止,无模式对话框则是调用CWnd::DestroyWindow来终止。
函数CDiaolog::OnOK 和CDiaolog::OnCancel 是调用EndDialog 的,因此无模式对话框必须用DestroyWindow来重载OnOK和OnCancel两个函数。
需要正确删除表示对话框的对象。
对模式对话框,在创建函数返回后即可删除对象。
无模式对话框不是同步的,在创建函数调用后立即返回,因而不知道何时删除对象,但可以通过重载CWnd::PostNcDestroy函数并执行清除操作。
5.1.2使用对话框编辑器打开对话框编辑器将项目工作区窗口切换到ResourceView页面,双击Dialog目录下任意一个对话框ID 或者,选择“Insert ”“Resource菜单命令(或按快捷键Ctrl+R),选择Dialog项,单击New 在对话框中添加和编辑控件(1)控件添加的方法在对话框中添加一个控件的方法有下列几种:在控件工具栏中单击某控件,鼠标箭头在对话框内变成十”字形状;在对话框指定位置单击鼠标左键,再拖动选择框可改变控件的大小和位置。
L07_MFC可视化编程
wndclass.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
基本应用程序的建立
if (!RegisterClass (&wndclass)) {
MessageBox (NULL,"窗口注册失败!", "HelloWin", 0) ;
return 0 ; }
hwnd = CreateWindow ("HelloWin", "我的窗口", // WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; // 窗口类名 窗口标题 // 窗口样式 // 窗口最初的 x 位置 // 窗口最初的 y 位置 // 窗口最初的 x 大小 // 窗口最初的 y 大小 // 父窗口句柄 // 窗口菜单句柄 // 应用程序实例句柄 // 创建窗口的参数
} return msg.wParam ;
}
消息框循环 提供交互
基本应用程序的建立
每一个C++ Windows应用程序都需要Windows.h头 文件,它还包含了其他的一些Windows头文件。这些 头文件定义了Windows的所有数据类型、常用函数、 数据结构和符号常量。
基本应用程序的建立 例1 一个简单的Windows应用程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MFC(对话框,孙鑫C++第七讲笔记整理)分类:MFC2012-08-14 23:25 393人阅读评论(0) 收藏举报1.如果在SDI中要调用对话框a.先插入一个对话框资源;b.然后在ClassWizards中为其创建一个类。
其目的是比较方便为添加按纽和消息响应函数。
c.然后实例化它。
在实例化时,必须将其头文件包含进去。
2.创建非模态对话框,注意它不能是局部变量。
当点击非模态对话框的OnOK按纽时,它并没有关闭,而是隐藏了。
需要调用destroyWindow().3.一个对象只能一个按纽。
为什么?因为在Wincore.cpp的628行有代码ASSERT(pWnd->m_hWnd == NULL); // only do once而创建后它的m_hWnd就不为0了。
此处ASSERT的用法是如果括号里面不为真,则程序崩溃。
4.如何为静态文本框增加消息响应?首先将IDC_STATIC改名。
同时还需要将Notify特性复选中。
5.完成加法功能。
a.GetDlgItem();b.GetDlgItemT ext();c.GetDlgItemInt();d.将IDC_EDIT1关联CEDIT类型变量e.将IDC_EDIT1关联int型变量。
注意调用UpdateData();//::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT ,10,(LPARAM)ch1);//::SendMessage(m_edit1.m_hWnd,WM_GETTEXT,10,(LPARAM)ch1) ;//GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPAR AM)ch1);m_edit1.SendMessage(WM_GETTEXT,10,(LPARAM)ch1);g.SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1) ;SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,(LPARAM)ch2) ;6.点击按纽改变窗口尺寸if(GetDlgItemT ext(IDC_BUTTON2,str),str=="收缩<<"){SetDlgItemT ext(IDC_BUTTON2,"扩展>>");static CRect rectLarge;static CRect rectSmall;if(rectLarge.IsRectNull()){CRect rectSeparator;GetWindowRect(&rectLarge);GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&rectSeparator); rectSmall.left=rectLarge.left;rectSmall.top=rectLarge.top;rectSmall.right=rectLarge.right;rectSmall.bottom=rectSeparator.bottom;if(str=="收缩<<"){SetWindowPos(NULL,0,0,rectSmall.Width(),rectSmall.Height(), SWP_NOMOVE | SWP_NOZORDER);}else{SetWindowPos(NULL,0,0,rectLarge.Width(),rectLarge.Height(), SWP_NOMOVE | SWP_NOZORDER);}7.回车时将输入焦点移动到下一个控件SetWindowLong()改变窗口的属性。
方法1:改变控件的回调函数,注意IDC_EDIT1的MultiLine要复选上。
WNDPROC prevProc;LRESULT CALLBACK WinSunProc(HWND hwnd, // handle to windowUINT uMsg, // message identifierWPARAM wParam, // first message parameterLPARAM lParam // second message parameter){if(uMsg==WM_CHAR && wParam==0x0d){//::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT));//SetFocus(::GetWindow(hwnd,GW_HWNDNEXT));CString str;str.Format("%d",hwnd);AfxMessageBox(str);//, UINT nType = MB_OK, UINT nIDHelp = 0 ); // AfxGetApp()->SetFocus(::GetNextDlgT abItem(::GetParent(hwnd),hwnd,FALSE)); return 1;}else{return prevProc(hwnd,uMsg,wParam,lParam);}}BOOL CT estDlg::OnInitDialog(){CDialog::OnInitDialog();// TOD Add extra initialization hereprevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m _hWnd,GWL_WNDPROC,(LONG)WinSunProc);//设置回调函数return TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE}方法2:在OnOK响应函数中加入代码//GetDlgItem(IDC_EDIT1)->GetNextWindow()->SetFocus();//GetFocus()->GetNextWindow()->SetFocus();//GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus(); GetNextDlgT abItem(GetFocus())->SetFocus();显示一个模态对话框:显示一个非模态对话框:1void CMyDialogView::OnShowmenue()2{3// TODO: Add your command handler code here45/*CTestDialog cdlg;6 cdlg.DoModal();*/78 CTestDialog *cdlg=new CTestDialog();//这里可以设置成成员变量,指针定义,堆栈跟程序一样的声明周期9 cdlg->Create(IDD_DIALOG1,NULL);10 cdlg->ShowWindow(SW_NORMAL);111213}下面两端代码的效果是一样的:14void CTestDialog::OnButton()15{16// TODO: Add your control notification handler code here1718if(!bIsCreate)19 {20 m_btn.Create("按钮",BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,80),this,123);21 bIsCreate=TRUE;22 }23else24 {25 m_btn.DestroyWindow();26 bIsCreate=FALSE;27 }2829/*if(!m_btn.m_hWnd)30 {3132 m_btn.Create("按钮",BS_PUSHBUTTON|WS_VISIBLE|WS_CHILD,CRect(0,0,100,80),this,123);33 }34 else35 {36 m_btn.DestroyWindow();37 }*/38}几种访问控件的方式:拉控件:利用调整位置改变了静态文本的ID,才能添加事件修改了Notify才能在事件中,改变文本的内容方法一:39void CTestDialog::OnNumber1()40{41// TODO: Add your control notification handler code here42 CString str;43 GetDlgItem(ID_NUMBER1)->GetWindowText(str);44if(str=="number1:")45 {46 GetDlgItem(ID_NUMBER1)->SetWindowText("数值1:");47 }48else49 {50 GetDlgItem(ID_NUMBER1)->SetWindowText("number1:");51 }52}方法二:53int num1,num2,num3;54char ch1[8],ch2[8],ch3[9];55 GetDlgItem(IDC_EDIT1)->GetWindowText(ch1,8);56 GetDlgItem(IDC_EDIT2)->GetWindowText(ch2,8);5758 num1=atoi(ch1);//将字符串转化为整数59 num2=atoi(ch2);60 num3=num1+num2;6162 itoa(num3,ch3,10);//将整数转化为字符串6364 GetDlgItem(IDC_EDIT3)->SetWindowText(ch3); 方法三:65TCHAR ch1[8],ch2[8],ch3[9];66 GetDlgItemText(IDC_EDIT1,ch1,8);67 GetDlgItemText(IDC_EDIT2,ch2,8);6869int num1=atoi(ch1);70int num2=atoi(ch2);71int num3=num1+num2;7273 itoa(num3,ch3,10);7475 SetDlgItemText(IDC_EDIT3,ch3);方法四:数值关联:76 UpdateData();//默认参数是TRUE,不直接调用DodataExchange函数77m_num3=m_num1+m_num2;78UpdateData(FALSE);方法五:控制关联:79TCHAR ch1[9],ch2[9],ch3[9];80int num1,num2,num3;81m_edit1.GetWindowText(ch1,9);82m_edit2.GetWindowText(ch2,9);8384num1=atoi(ch1);85num2=atoi(ch2);8687num3=num1+num2;8889itoa(num3,ch3,10);9091m_edit3.SetWindowText(ch3);方法六:92int num1=GetDlgItemInt(IDC_EDIT1);93int num2=GetDlgItemInt(IDC_EDIT2);94int num3=num1+num2;9596 SetDlgItemInt(IDC_EDIT3,num3);方法七:97/*TCHAR ch1[10],ch2[10],ch3[10];98 ::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);99 ::SendMessage(GetDlgItem(IDC_EDIT2)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch2);100101 int num1=atoi(ch1);102 int num2=atoi(ch2);103 int num3=num1+num2;104105 itoa(num3,ch3,10);106107 ::SendMessage(GetDlgItem(IDC_EDIT3)->m_hWnd,WM_SETTEXT,0,(LPARAM)ch3);*/ 108109110/*TCHAR ch1[10],ch2[10],ch3[10];111 GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)ch1);112 GetDlgItem(IDC_EDIT2)->SendMessage(WM_GETTEXT,10,(LPARAM)ch2);113114 int num1=atoi(ch1);115 int num2=atoi(ch2);116 int num3=num1+num2;117118 itoa(num3,ch3,10);119120 SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)ch3);121 SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,0,2);122 GetDlgItem(IDC_EDIT3)->SetFocus();*/123124125TCHAR ch1[10],ch2[10],ch3[10];126 SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);127 SendDlgItemMessage(IDC_EDIT2,WM_GETTEXT,10,(LPARAM)ch2);128129int num1=atoi(ch1);130int num2=atoi(ch2);131int num3=num1+num2;132133 itoa(num3,ch3,10);134135 SendDlgItemMessage(IDC_EDIT3,WM_SETTEXT,0,(LPARAM)ch3);136 SendDlgItemMessage(IDC_EDIT3,EM_SETSEL,0,2);137 GetDlgItem(IDC_EDIT3)->SetFocus();伸缩效果:拉入一个picture:138void CTestDialog::OnShensuo()139{140// TODO: Add your control notification handler code here 141 CString cst;142if(GetDlgItemText(ID_SHENSUO,cst),cst=="缩小<<")143 {144 SetDlgItemText(ID_SHENSUO,"扩展>>");145 }146else147 {148 SetDlgItemText(ID_SHENSUO,"缩小<<");149 }150151static CRect crectLarge,crectSmall;152153if(crectLarge.IsRectNull())154 {155 GetWindowRect(&crectLarge);156 CRect ctemp;157158 GetDlgItem(IDC_SEPARATOR)->GetWindowRect(&ctemp); 159160 crectSmall.left=crectLarge.left;161 crectSmall.top=crectLarge.top;162 crectSmall.right=crectLarge.right;163 crectSmall.bottom=ctemp.bottom;164165 }166167if(cst=="缩小<<")168 {169SetWindowPos(NULL,0,0,crectSmall.Width(),crectSmall.Height(),SWP_NOZORDER|SWP_NO MOVE);170 }171else172 {173174SetWindowPos(NULL,0,0,crectLarge.Width(),crectLarge.Height(),SWP_NOZORDER|SWP_NO MOVE);175 }176177}回车响应SetFocus()只能一次multiline178WNDPROC prevProc;179LRESULT CALLBACK DialogProc(180HWND hwnd, // handle to window181UINT uMsg, // message identifier182WPARAM wParam, // first message parameter183LPARAM lParam // second message parameter184 )185{186if(uMsg==WM_CHAR && wParam==0x0d)187 {188//::SetFocus(::GetNextWindow(hwnd,GW_HWNDNEXT));189//::SetFocus(::GetWindow(hwnd,GW_HWNDNEXT));190 ::SetFocus(::GetNextDlgTabItem(GetParent(hwnd),hwnd,FALSE));191return 1;192 }193else194 {195return prevProc(hwnd,uMsg,wParam,lParam);196 }197}198199200BOOL CTestDialog::OnInitDialog()201{202 CDialog::OnInitDialog();203204205// TODO: Add extra initialization here206prevProc=(WNDPROC)SetWindowLong(GetDlgItem(IDC_EDIT1)->m_hWnd,GWL_WNDPROC,(LONG) DialogProc);207208209return TRUE; // return TRUE unless you set the focus to a control210// EXCEPTION: OCX Property Pages should return FALSE211}212void CTestDlg::OnOK()213{214// TODO: Add extra validation here215//GetDlgItem(IDC_EDIT1)->GetNextWindow()->SetFocus();216//GetFocus()->GetNextWindow()->SetFocus();217//GetFocus()->GetWindow(GW_HWNDNEXT)->SetFocus();218 GetNextDlgTabItem(GetFocus())->SetFocus();219// CDialog::OnOK();220}。