深入浅出MFC学习笔记
孙鑫MFC视频 笔记
/*CDC *pDC=GetDC();
pDC->MoveTo(m_ptOrigin);
pDC->LineTo(point);
ReleaseDC(pDC);必须成对使用。*/
//CClientDC dc(this);
/*CClientDC dc(GetParent());
3)用CClientDC
4)用CWindowDC,用它甚至可以整个屏幕区域画线。
下面是上面4种方法的代码
/*HDC hdc;
hdc=::GetDC(m_hWnd);
MoveToEx(hdc,m_ptOrigin.x,m_ptOrigin.y,NULL);
LineTo(hdc,point.x,point.y);
12.GetDC()与ReleaseDC()要成对使用,否则会内存泄漏。同样,BeginPaint()与EndPaint()。
13.GetStockObject()得到画笔、画刷、字体、调色板的句柄,使用时必须用类型转换。
14.什么时候用NULL,什么时候用0.答,对指针赋值时用NULL,对变量赋值时用0.
}
而在BOOL CTestApp::InitInstance()中的代码
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CTestDoc),
dc.MoveTo(m_ptOrigin);
dc.LineTo(point);此处不需要ReleaseDC,因为CClientDC会自动释放DC*/
MFC高级编程学习笔记
No.3 /*SystemParametersInfo*/
//设置桌面壁纸
SystemParametersInfo(SPI_SETDESKWALLPAPER,0,lpPath,0);
//屏蔽掉系统键
SystemParametersInfo(SPI_SETSCREENSAVERRUNNING,true,&bOld,SPIF_UPDATEINIFILE);
(4)获取函数指针:PFUNC pFunc=(PFUNC)GetProcAddress(hdll,"函数名");
(5)调用函数后,释放DLL:FreeLibrary(hdll);
3.资源的导入使用(显式链接,以菜单导入为例)
(1)进行1中的步骤(1)(2);
(2)载入DLL库:HINSTANCE hdll=LoadLibrary("*.dll");
原型:
WINSHELLAPI HINSTANCE APIENTRY ShellExecuteW(HWND hwnd, LPCWSTR lpOperation, LPCWSTR lpFile, LPCWSTR lpParameters, LPCWSTR lpDirectory, INT nShowCmd);
2.文件删除:
BOOL DeleteFile(LPTSTR lpFileName);
3.文件复制:
BOOL CopyFile(LPCTSTR lpExistingFileName,LPCTSTR lpNewFileName,BOOL bFailIfExists);其中参数bFailIfExists告诉系统当目标文件存在时如何操作,当bFailIfExists为true时,如果目标文件存在,则函数执行失败;当bFailIfExists为false时,如果目标文件存在,则覆盖目标文件。
VC、MFC各前辈学习方法及感受整理
MFC编程基础教程
MFC编程基础教程MFC(Microsoft Foundation Classes)是一套基于C++的应用程序框架,用于开发可视化的Windows应用程序。
MFC提供了丰富的工具和类库,使程序开发人员能够更加轻松地创建Windows应用程序。
一、MFC框架的介绍MFC是一种C++编程框架,用于开发Windows应用程序。
MFC提供了一系列的类和方法,用于处理窗口、消息处理、资源管理等常见的任务。
MFC框架的核心是一个称为CWinApp的类,它是应用程序的入口点。
二、MFC的基本概念1.窗口:MFC使用窗口来显示应用程序的用户界面。
窗口可以是主窗口、对话框、工具栏、菜单等。
2.消息处理函数:MFC使用消息机制来处理用户输入和系统事件。
消息处理函数是在收到特定的消息时执行的代码块。
3.控件:控件是用于用户交互的窗口元素,例如按钮、文本框、列表框等。
4.对象模型:MFC使用面向对象的概念来管理窗口和控件。
每个窗口或控件都是一个C++对象,有自己的属性和方法。
三、MFC应用程序的创建1.创建一个MFC应用程序的步骤:a. 新建项目:在Visual Studio中创建一个MFC应用程序项目。
c.编写代码:编写消息处理函数和其他代码,实现应用程序的功能。
d.编译和运行:编译项目并运行应用程序。
四、MFC消息处理1.应用程序的消息循环:MFC应用程序的消息循环负责接收和处理用户输入和系统事件。
2.消息映射表:消息映射表是一个用于将消息与消息处理函数关联的数据结构。
3.常见的消息类型:MFC提供了大量的消息类型,包括鼠标和键盘消息、窗口消息、菜单消息等。
五、MFC控件的使用1.控件的创建和操作:使用MFC提供的类和方法来创建和操作控件。
2.控件的属性设置:通过设置控件的属性来改变它的外观和行为。
3.控件事件的处理:通过处理控件的事件来响应用户的操作。
六、MFC对话框的使用2.对话框控件的操作:对话框中的控件可以像其他控件一样进行操作。
关于MFC的有些知识
关于MFC的有些知识实验⼀1、在VC++中,⼯程与各种源⽂件之间是什么关系?解答:⼯程的实质是⼀些相互关联的源⽂件的集合,可以把项⽬理解成⼀个⼯作任务, 开发环境中,⼯程包含在⼯作区间中,⼀个⼯作区可以管理多个⼯程2、⼀个VC++⼯程下会有3个⽂件夹,这3个⽂件夹分别是什么?以.cpp为后缀的⽂件会添加到哪个⽂件夹中?以.h为后缀⽂件会添加到哪个⽂件夹中?解答:分别是head Files ,Sourse Files, Resourse Files ,.cpp放在Sourse ⽂件⾥⾯,.h放在Head Files⽂件⾥3,以win32 console application⼯程为例,简述⼯程的建⽴,⽂件的添加,⼯程的编译和链接及⼯程的执⾏过程。
解答:这个就是win32 console application⼯程的实例验证过程。
实验⼆1.简述Windows应⽤程序的特点。
解答:⼀.事件驱动的程序设计它是⼀种“被动”式程序设计⽅法,程序开始运⾏时,处于等待⽤户输⼊事件状态,然后取得事件并作出相应反应,处理完毕⼜返回并处于等待事件状态。
⼆. 消息循环与输⼊消息是⼀种报告有关事件发⽣的通知。
· 事件驱动是靠消息循环机制来实现的。
· Windows应⽤程序的消息来源有以下四种:(1)输⼊消息(2)控制消息(3)系统消息(4)⽤户消息三. 图形输出Windows程序的所有输出都是图形,字符也被作为图形来处理。
· GDI提供两种基本服务:创建图形输出和存储图象。
· 绘图函数分为三类:⼀是⽂字输出;⼆是⽮量图形函数,⽤于画线、圆等⼏何图形;三是光栅(位图)图形函数,⽤于绘制位图。
四. ⽤户界⾯对象⽤户界⾯对象:窗⼝边框系统菜单框标题栏菜单栏⼯具条客户区垂直滚动条和⽔平滚动条状态栏图标光标插⼊符对话框控件消息框五.资源共享· 常见的资源包括:设备上下⽂,画刷,画笔,字体,对话框控制,对话框,图标,定时器,插⼊符号,通信端⼝,电话线等。
MFC教程入门知识全集
说明:本书稿为张孝祥、袁龙友两位老师在2000年依据张孝祥的vc++讲课记录整理,由于时间关系,仅仅是写成了草稿,欢迎大家使用!第1章 掌握C++1.1 类的定义与应用1.1.1 结构的定义1.1.2 类的定义1.1.2.1 类与结构1.1.2.2 类的使用 (例子代码EX01-00)1.2 函数的重载1.2.1 重载参数个数不同的函数 (例子代码EX01-01)1.2.2 重载参数数据类型不同的函数 (例子代码EX01-02)1.3 构造函数与析构函数1.3.1 构造函数1.3.2 析构函数 (图1,没有)(图2,没有)1.4 this指针的引用1.5 类的继承与protected访问修饰符1.5.1单一继承 (例子代码EX01-03) (图x,没有)1.5.2多重继承1.6 虚函数与多态性1.7类的书写规范1.8 小结第2章 Windows程序内部运行原理2.1 Windows应用程序,操作系统,计算机硬件之间的相互关系2.1.1 关于API (图1,没有)2.1.2 关于消息及消息队列 (图1、图2没有)2.2 什么是句柄2.3 谈谈WinMain函数 (例子代码EX02-00)2.3.1 WinMain函数的定义及功能2.3.2 窗口及其生成2.3.2.1 如何设计一个窗口类——步骤12.3.2.2 注册设计好的窗口类——步骤22.3.2.3 创建窗口——步骤32.3.2.4 显示创建的窗口——步骤42.3.3 消息循环2.3.4 完成回调函数2.4 程序编写操作步骤与实验2.5 小结第3章 VC集成开发环境介绍3.1 Visual C++开发环境3.1.1 工作区窗格3.1.2 输出窗格3.1.3 编辑区3.1.4菜单栏、工具栏、状态栏3.2 系统菜单功能介绍3.2.1 File菜单3.2.2 Edit菜单3.2.3 View菜单3.2.4 Insert菜单3.2.5 Project菜单3.2.6 Build菜单3.2.6 Tools菜单3.2.7 Window菜单3.2.8 Help菜单3.3 Visual C++重要工具介绍3.3.1 C/C++编译器3.3.2 资源编辑器3.3.3 资源编译器3.3.4 链接器和调试器3.3.5 AppWizard和ClassWizard3.3.6 资源浏览器3.3.7 Microsoft活动模板库、仓库3.4 小结第4章 MFC应用程序框架剖析4.1 什么是MFC以及MFC的特点 (例子代码EX04-00) 4.2 MFC应用程序框架 (例子代码EX04-01)4.3 应用程序框架说明4.4 文档-视图体系结构4.4.1 文档-视图相互作用的函数4.4.2 单文档-视图应用程序结构4.4.2 多文档-视图应用程序结构4.5 MFC消息映射机制4.5.1 消息的种类4.5.2 应用程序的Run函数4.5.3 消息映射表4.5.4 如何添加消息映射4.6 ClssWizard的使用4.6.1 ClssWizard概貌4.6.2 如何添加消息处理函数4.6.3 如何添加成员变量4.6.4 如何添加一个新类第5章 图形与文本5.1 理解图形设备接口5.2 设备描述表5.2.1 什么是设备描述表5.2.2 MFC中的设备描述表类5.2.3 获取设备描述表5.3 Windows的GDI对象5.4 GDI对象的创建5.4.1 自定义画刷(CBrush)5.4.2 自定义画笔(CPen)5.4.3 自定义字体(CFont)5.5 GDI对象的使用及示例5.5.1 画笔的使用5.5.1.1 在MFC程序中画线5.5.1.2 在Windows Application程序中画线5.5.1.3 实现橡皮筋功能5.5.2 画刷的使用5.5.2.1 带颜色的画刷的使用5.5.2.2 带位图的画刷的使用5.5.3 字体的使用5.5.3.1 一个简单的文字处理程序5.5.3.2 模拟卡拉OK程序5.5.3.3 剪切区和路径层第六章 菜单、工具栏和状态栏6.1 菜单6.1.1 菜单介绍6.1.2 创建一个菜单6.1.2.1 添加一个菜单资源6.1.2.2 利用菜单编辑器编辑菜单资源6.1.2.3 将菜单加入到应用程序中6.1.2.4 给菜单项添加COMMAND消息处理6.1.2.5 给菜单项添加UPDATE_COMMAND_UI消息处理6.1.2.6 一个简单的绘图程序6.1.3 在应用程序中控制菜单6.1.3.1 在应用程序中取得菜单6.1.3.2 在应用程序中修改菜单的状态6.1.3.3 在应用程序中添加、删除、插入菜单或菜单项6.1.3.4 一个简易的电话本程序6.1.4 创建快捷方式菜单6.2 工具栏6.2.1 工具栏介绍6.2.1.1 熟悉CToolBar类6.2.1.2 AppWizard是如何创建工具栏6.2.1.3 利用工具栏编辑器设计工具栏按钮6.2.2 新建一个工具栏6.2.3 显示/隐藏工具栏6.3 状态栏6.3.1 状态栏介绍6.3.1.1 熟悉CStatusBar类6.3.1.2 AppWizard是如何创建状态栏6.3.2 修改状态栏6.3.2.1 指示器数组6.3.2.2 修改状态栏窗格6.3.3 在状态栏上显示鼠标坐标、时钟和进度条6.3.3.1 在状态栏上显示鼠标坐标6.3.3.2 在状态栏上显示时钟6.3.3.3 在状态栏上显示进度条第七章 对话框和控件7.1 对话框及控件的介绍7.1.1 常用控件介绍7.1.2 对话框介绍7.1.2.1 对话框的组成7.1.2.2 对话框的种类7.1.2.3 使用对话框编辑器设计对话框7.1.3 创建一个对话框7.1.3.2 创建非模态对话框7.1.3.3 对话框的数据交换机制7.1.3.4 创建模态对话框7.1.4 模态对话框和非模态对话框的区别7.1.5 按钮逃跑小程序7.2 属性页和向导对话框7.2.1 创建属性页对话框7.2.1 创建向导对话框7.3 公用对话框7.3.1 增加设置对话框来完善绘图程序7.3.2 颜色对话框的使用7.3.3 字体对话框的使用7.3.4 控制控件颜色做漂亮界面第8章 文档序列化8.1 序列化8.1.1 CArchive类和Serialize函数8.1.2 使自己的类支持序列化8.1.3 实例:保存和显示图形8.2 CFile类8.2.1 CFile类的构造函数8.2.2 打开文件8.2.3 读写数据8.2.4 关闭文件8.3 文件I/O处理8.3.1 利用MFC类来实现8.3.2 利用C函数来实现8.3.3 利用C++函数来实现8.3.4 利用API函数来实现8.3.5 创建保存、打开对话框8.4 注册表操作8.4.1 什么是注册表8.4.2 注册表结构8.4.3 修改注册表第9章 修改框架程序的显示效果9.1修改Windows应用程序外观样式9.1.1 在框架类中修改程序外观9.1.2 在视图类中修改程序外观9.2 制作动画图标9.3 将图片作为窗口显示的背景第10章 网络编程10.1 计算机网络的基本概念10.1.1 计算机网络的分类10.1.2 网络拓扑结构10.2 网络体系结构和网络协议10.2.1 ISO/OSI参考模型10.2.2 TCP/IP参考模型10.2.3 TCP/IP协议10.2.3.1 协议概述10.2.3.2 TCP/IP协议层次结构及各种协议介绍10.2.3.3 IP地址10.2.3.4 端口号10.2.4 专业术语解释10.3 Socket套接字10.3.1 Socket介绍10.3.2 关于协议族和地址族10.3.3 使用Socket10.3.3.1 创建Socket10.3.3.2 指定本地地址及端口号10.3.3.3 建立连接10.3.3.4 监听连接10.3.3.5 发送数据10.3.3.6 接收数据10.3.3.7 关闭套接字10.3.4 套接字一般调用过程10.4 WinSock编程机制10.4.1 认识Windows Socket10.4.2 Windows Sockets库函数介绍10.4.2.1 Berkeley socket函数10.4.2.2 数据库函数10.4.2.3 Windows专有扩展函数10.5 WinSock编程实例10.5.1 实例一:面向连接服务的socket调用10.5.2 实例二:面向非连接服务的socket调用10.5.3 实例三:基于字符界面的聊天程序第11章 线程间的同步11.1 进程和线程的概念11.2 Win32的线程11.2.1 线程的创建11.2.2 线程的终止11.2.3 实例:通过创建多线程来编写网络聊天程序 11.3 MFC的线程处理11.3.1 创建工作者线程11.3.2 创建用户界面线程11.4 线程同步11.4.1 为什么要同步11.4.2 等待函数11.4.3 同步对象11.4.3.1 关键代码段11.4.3.2 互斥对象11.4.3.3 信标对象11.4.3.4 事件对象11.4.4 如何选择同步对象第12章 进程间的通讯12.1 进程控制12.1.1 进程的创建12.1.2 进程的终止12.2 进程间通讯12.2.1 剪贴板通讯方式12.2.2 邮槽通讯方式12.2.3 管道通讯方式12.2.3.1 命名管道通讯12.2.3.2 匿名管道通讯第14章 ActiveX技术14.1 ActiveX简介14.2 ActiveX控件和普通Windows控件14.2.1 ActiveX控件和普通Windows控件的相同点14.2.2 ActiveX控件和普通Windows控件的相同点 14.3 ActiveX控件的属性、方法和事件14.3.1 ActiveX控件的属性14.3.2 ActiveX控件的方法14.3.3 ActiveX控件的事件14.4 创建ActiveX控件。
“深入浅出MFC(第2版)(附光盘)”
如果必须要为C程序员做一个关于应用程序框架的恰当的比喻的话,我想可以把这个框架理解成main函数中传入命令行参数的机制:为了从命令行中获取信息,你需要定义argc, argv两个参数,OS会自动帮你填入值;同样的道理,为了捕捉鼠标事件、按钮的点击事件并设置相关函数进行处理,你自然不能越MFC的规矩办事咯。希望这个有些简陋的比喻能对挣扎在MFC一线的苦手有所帮助和启示吧。
不过VC++相比其它的RAD(Rapid Application Development 快速应用程序开发)工具(如VB)却是有着本质的不同。在VC++中,虽然使用者可以同VB一样通过IDE完成大部分的工作,但是VC++并不掩饰反应程序运行机理的代码;而在VB中程序员能看到的只有自己添加的代码。很难说那种方式一定最好吧,毕竟各有各的用户群。VB针对入门级的程序员,以简单快速的开发方式吸引大家上手;VC++则面向系统级的程序员,提供高率的编译代码以及访问底层系统属性的能力。透过VC++暴露给程序员的代码,侯俊杰先生引领读者将MFC的各项重要机制一一“剖膛破肚”。令我大开眼界的是MFC的框架竟然能在编译器不提供RTTI(运行时类型信息)支持的情况下,完成了该框架所必须的RTTI功能。MFC将Macro(宏、巨集)的功能简直发挥到了极致。尽管相较于Java、C#等面向对象领域的后起之秀来说,MFC的宏确实显得有些笨拙和缺乏可读性,但是在当时的环境之下,通过宏来实现却不得不说是一种优雅。
第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一解析
深入浅出MFC一Contents[Trial version] 目录[Trial version] 第0章你一定要知道(导读)[Trial version] 第1章Win32基本程序观念[Trial version] 第2章C++的重要性质[Trial version] 第3章MFC六大关键技术之模拟[Trial version] 第5章总观AlicationFramework[Trial version] 第6章MFC程序设计导论[Trial version] 第7章简单而完整:MFC骨干程序[Trial version] 第8章Document-View深入探讨[Trial version] 第9章消息映射与命令绕行[Trial version] 第10章MFC与对话框[Trial version] 第11章View功能之加强与重绘效率之提升[Trial version] 第12章打印与预览[Trial version] 第13章多重文件与多重显示[Trial version] 第14章MFC多线程程序设计[Trial version] 第15章定制一个AWizard[Trial version] 第16章站上众人的肩膀--使用Comonents&am;amActiveXControls[Trial version] 附录A无责任书评[Amber demo]owered By Gisun htt://目录第0章你一定要知道(导读)/1这本书适合谁/1你需要什么技术基础/1你需要什么软硬件环境让我们使用同一种语言本书符号习惯/3磁盘内容与安装范例程序说明第一篇勿在浮砂筑高台- 本书技术前提/3 第1章Win32 程序基本观念/3Win32程序开发流程/4需要什么函数库(.LIB)/4需要什么头文件(.H)/4以消息为基础以事件驱动之/5一个具体而微的Win32 程序/5程序进入点WinMain/10窗口类之注册与窗口之诞生/11 消息循环/12窗口的生命中枢—窗口函数/12 消息映射(Message Ma)雏形/13 对话框的运作/14模块定义文件(.DEF)/14资源描述文件(.RC)/15 Windows 程序的生与死/15闲置时间的处理:OnIdle /16 Console 程序/17Console 程序与DOS 程序的差别/17 Console 程序的编译链接/18JBACKU:Win32 Console 程序设计/19 MFCCON:MFC Console 程序设计/20什么是C Runtime Library 的多线程版本/22 进程与线程(rocess and Thread)/22核心对象/22一个进程的诞生与死亡/23产生子进程/23一个线程的诞生与死亡/24以_beginthreadex取代CreateThread/25线程优先权(riority)/26多线程程序设计实例/27第2章C++ 的重要性质/29类及其成员—谈封装(encasulation)/29基类与派生类—谈继承(Inheritance)/29this 指针/31虚函数与多态(olymorhism)/32类与对象大解剖/40Object slicing 与虚函数/42静态成员(变量与函数)/44C++程序的生与死:兼谈构造函数与析构函数/46四种不同的对象生存方式/47所谓“Unwinding”/48运行时类型信息(RTTI)/48动态生成(Dynamic Creation)/50异常处理(Excetion Handling)/50 Temlate /53Temlate Functions /53Temlate Classes /54Temlates 的编译与链接/56第3章MFC六大关键技术之模拟/57MFC类阶层/57Frame1范例程序/57MFC程序的初始化过程/59Frame2范例程序/61RTTI(运行时类型辨识)/65 CRuntimeClass与类型录/65DECLARE_DYNAMIC / IMLEMENT_DYNAMIC宏/66 Frame3 范例程序/71IsKindOf(类型辨识)/77Frame4 范例程序/77Dynamic Creation(动态生成)/78DECLARE_DYNCREATE / IMLEMENT_DYNCREATE 宏/79 Frame6 范例程序/84ersistence(永续生存)机制/91Serialize(数据读写)/91DECLARE_SERIAL/IMLEMENT_SERIAL 宏/95没有范例程序Message Maing(消息映射)/97Frame7 范例程序/104Command Routing(命令循环)/112Frame8 范例程序/119本章回顾/130第二篇欲善工事先利其器-Visual C++ 5.0 开发工具第4章Visual C++ - 整合性软件开发环境安装与组成四个重要的工具内务府总管:Visual C++ 整合开发环境关于roject关于工具设定Source BrowserOnline Hel除错工具VC++ 除错器Excetion Handling程序代码产生器—AWizard东圈西点完成MFC 程序骨干Scribble Ste0威力强大的资源器Icon 器Cursor器Bitma器ToolBar器VERSIONINFO资源器String Table器Menu 器Accelerator 器Dialog 器Console 程序的项目管理第三篇浅出MFC程序设计第5章总观Alication Framework /130 什么是Alication Framework /130侯捷怎么说/130我怎么说/131别人怎么说/133为什么使用Alication Framework /134 Microsoft Foundation Class(MFC)/136 白头宫女话天宝:Visual C++与MFC/137 纵览MFC /138General urose classes /138Windows AI classes /139Alication framework classes /140High level abstractions /140Afx全局函数/140MFC宏(macros)/141MFC数据类型(data tye)/142第6章MFC程序设计导论——MFC程序的生死因果/144 不二法门:熟记MFC类的阶层架构/144需要什么函数库(.LIB)/146需要什么含入文件(.H)/146简化的MFC程序架构—以Hello MFC为例/148Hello 程序原始代码/148MFC 程序的来龙去脉/152我只借用两个类:CWinA和CFrameWnd /152 CWinA—取代WinMain的地位/152CFrameWnd—取代Wndroc的地位/154引爆器—Alication object /155隐晦不明的WinMain /156AfxWinInit - AFX 内部初始化动作/158CWinA::InitAlication /160CMyWinA::InitInstance /160CFrameWnd::Create 产生主窗口(并注册窗口类)/161 奇怪的窗口类名称Afx:b:14ae:6:3e8f/168 窗口显示与更新/170CWinA::Run - 程序生命的活水源头/170把消息与处理函数串接在一起:Message Ma机制/172来龙去脉总整理/173Callback 函数/174闲置时间(idle time)的处理:OnIdle/176 Dialog 与Control/178通用对话框(Common Controls)/178本章回顾/179第7章简单而完整:MFC 骨干程序/180 不二法门:熟记MFC 类的阶层架构/180 MFC程序的UI新风貌/180Document/View 支撑你的应用程序/181 利用Visual C++工具完成Scribble ste0 /183骨干程序使用哪些MFC类?/183Document Temlate的意义/187Scribble的Document/View 设计/190主窗口的诞生/192工具列和状态列的诞生(Toolbar &am; Status bar)/193 鼠标拖放(Drag and Dro)/195消息映射(Message Ma)/196标准菜单File/Edit/View/Window/Hel/196对话框/199改用CEditView /199第四篇深入MFC程序设计/199第8章Document-View 深入探讨/200为什么需要Document-View(形而上)/200 Document /200View /201Document Frame(View Frame)/202Document Temlate /202CDocTemlate 管理CDocument / CView / CFrameWnd /202 Scribble Ste1 的Document(数据结构设计)/207 MFC Collection Classes 的选用/207Temlate-Based Classes /208Temlate-Based Classes 的使用方法/209CScribbleDoc 的修改/209 SCRIBBLEDOC.H /211 SCRIBBLEDOC.C /212文件:一连串的线条/215 CScribbleDoc 的成员变量/215 CObList /215CScribbleDoc 的成员函数/215 线条与坐标点/217CStroke 的成员变量/217 CArray<Coint, Coint> /217 CStroke 的成员函数/217Scribble Ste1 的View:数据重绘与/218 CScribbleView 的修改/218 SCRIBBLEVIEW.H /219SCRIBBLEVIEW.C /220View 的重绘动作—GetDocument和OnDraw /222 CScribbleView的成员变量/222 CScribbleView的成员函数/223View 与使用者的交谈(鼠标消息处理实例)/223 ClassWizard 的辅佐/224WizardBar 的辅佐/225Serialize:对象的文件读写/225Serialization以外的文件读写动作/226 台面上的Serialize动作/227台面下的Serialize写文件奥秘/231台面下的Serialize读文件奥秘/233 DYNAMIC / DYNCREATE / SERIAL 三宏/240 Serializable 的必要条件/244CObject 类/245IsKindOf/245IsSerializable/245CObject::Serialize/245CArchive类/246oerator<<和oerator>>/246效率考虑/250自定SERIAL宏给抽象类使用/250在CObList中加入CStroke 以外的类/250 Document与View 交流—为Scribble Ste4做准备/254 第9章消息映射与命令循环/255到底要解决什么/255消息分类/256万流归宗Command Target(CCmdTarget)/256三个奇怪的宏一张巨大的/257 DECLARE_MESSAGE_MA 宏/257消息映射的形成:BEGIN_/ON_/END_ 宏/258米诺托斯(Minotauros)与西修斯(Theseus)/261 两万五千里长征—消息的流窜/265直线上溯(一般Windows 消息)/265拐弯上溯(WM_COMMAND 命令消息)/268罗塞达碑石:AfxSig_xx 的秘密/273Scribble Ste2:UI 对象的变化/277改变菜单/277改变工具列/278利用ClassWizard连接命令项识别代码与命令处理函数/280 维护UI对象状态(UDATE_COMMAND_UI)/282本章回顾/285第10章MFC 与对话框/285对话框器/286利用ClassWizard 连接对话框与其专属类/288ENDLG.H /290ENDLG.C /291对话框的消息处理函数/292MFC中各式各样的MA /294对话框数据交换与查核(DDX &am; DDV)/294MFC中各式各样的DDx_函数/297如何唤起对话框/297本章回顾/299第11章View功能之加强与重绘效率之提升/299同时修改多个Views:UdateAllViews 和OnUdate/300 在View中定义一个hint/302把hint传给OnUdate/304利用hint增加重绘效率/305可卷动的窗口:CScrollView /307大窗口中的小窗口:Slitter /313分裂窗口的功能/313分裂窗口的程序概念/314分裂窗口之实现/315本章回顾/317第12章印表与预览/317概观/317打印动作的后台原理/320MFC预设的打印机制/324Scribble打印机制的补强/333打印机的页和文件的页/333配置GDI绘图工具/334尺寸与方向:关于映射模式(坐标系统)/334分页/336表头(Header)与表尾/338动态计算页代码/338打印预览(rint review)/339本章回顾/339第13章多重文件与多重显示/339 MDI 和SDI /340多重显像(Multile Views)/340窗口的动态分裂/342窗口的静态分裂/343 CreateStatic 和CreateView /343窗口的静态三叉分裂/345Grah 范例程序/346静态分裂窗口之观念整理/354同源子窗口/355 CMDIFrameWnd::OnWindowNew/355 Text 范例程序/356非制式作法的缺点/361多重文件/361新的Document类/362新的Document Temlate /363新的UI系统/364新文件的文件读写动作/365第14章MFC多线程程序设计(Multi-threaded rogramming in MFC)/367从操作系统层面看线程/367三个观念:模块、进程、线程/367线程优先权(riority)/368线程排程(Scheduling)/369Thread Context /370从程序设计层面看线程/371Worker Threads 和UI Threads /371错误观念/372正确态度/372MFC多线程程序设计/372探索CwinThread/372产生一个Worker Thread/374产生一个UI Thread /375线程的结束/376线程与同步控制/376 MFC多线程程序实例/378第15章定制一个AWizard /380到底Wizard是什么?/381Custom AWizard 的基本操作/381剖析AWizard Comonents /385Dialog Temlates 和Dialog Classes /385Macros /386Directives /387动手修改To Studio AWizard/387利用资源器修改IDD_CUSTOM1对话窗画面/387 利用ClassWizard 修改CCustom1Dlg类/388改写OnDismiss 虚函数在其中定义macros /389 修改text temlate/389To Studio AWizard执行结果/390更多的信息/390第16章站上众人的肩膀—使用Comonents和ActiveX Controls/391 什么是Comonent Gallery /391使用Comonents /393Slash screen /393System Info for About Dlg /394Tis of the Day /394Comonents实际运用:ComTest 程序/395修改ComTest 程序内容/409使用ActiveX Controls /411ActiveX Control 基础观念:roerties、Methods、Events/411ActiveX Controls 的五大使用步骤/412使用“Grid”ActiveX Control:OcxTest 程序/413[Amber demo]owered By Gisun htt://第0章你一定要知道(导读)这本书适合谁深入浅出MFC是一本介绍MFC(Microsoft Foundation Classes)程序设计技术的书籍。
MFC学习心得
有六个基本的控制:CStatic、CButton、CEdit、CList、CComboBox和CScrollBar。
你需要理解的是那个控制能做些什么、你应该如何控制它的外表和行为以及如何让控制能响应用户事件。
void CHelloView::OnDraw(CDC* pDC)
{
CHelloDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CString str("Hello,World!");
创建一个静态控件分两步。首先,调用构造函数来构造此CStatic对象,然后调用Create成员函数来创建此静态控件并将它与该CStatic对象连接。如果你是在一个对话框中创建了一个静态控件(通过一个对话框资源),则当用户关闭这个对话框时,此CStatic对象被自动销毁。如果你是在一个窗口中创建了一个CStatic对象,则必须由你来销毁它。在一个窗口的堆栈中创建的CStatic对象将自动被销毁。如果你是使用new函数在堆中创建CStatic对象,则当你使用完后,必须调用delete来销毁这个CStatic对象。
SS_BLACKRECT 该控制以填充的矩形显示。颜色与当前的窗口框架相同。
SS_CENTER 文本居中。
SS_GRAYFRAME 控制以矩形边框方式显示。颜色与当前桌面相同。
SS_GRAYRECT 该控制以填充的矩形显示。颜色与当前的桌面相同。
SS_ICON 控制以图标形式显示。文本作为图标在资源文件的名称。rect参数只控制位
《深入浅出MFC》中关于永久保存机制的问题
《深入浅出MFC》中关于永久保存机制的问题《深入浅出MFC》中谈到Persistence(永久保存机制)时,P126中提出了一个例子:我们可以在每次记录对象内容的时候,先写入一个代码,表示此对象的类是否曾在文件中记录过了。
如果是新类,乖乖地记录其类名称;如果是旧类,则以代码表示。
这样可以节省文件大小以及程序用于解析的时间。
下面是新的构想,也就是Serialization的目标:20 03 84 03 ;Document size06 00 ;CObList elements countFF FF ;new class tag02 00 ;schema07 00 ;class name string length43 53 74 72 6F 6B 65 ;“CStroke”02 00 ; DWordArray Size28 00 13 00 ; point28 00 13 00 ; pointFF FF ;new class tag01 00 ;schema0A 00 ; class name string length43 52 65 63 74 61 6E 67 6C 65 ; ”CRectangle”11 00 22 00 33 00 44 00 ; CRectFF FF ;new class tag01 00 ; schema07 00 ; class name string length43 43 69 72 63 6C 65 ; “circle”55 00 66 00 77 00 ; CPoint & radius01 80 ; old class tag02 00 ; DWordArray size28 00 35 00 ; point28 00 35 00 ; point03 80 ; old class tag11 00 22 00 33 00 44 00 ; CRect05 80 ; old class tag55 00 66 00 77 00 ; CPoint & radius我看到这里有一个疑问,比如01 80 ; old class tag那么它表示旧类,但是是表示哪一种旧类呢?这个机制是如何识别的呢?还有schema又有什么意义呢?(或者说什么作用呢?)。
MFC基础教程
MFC基础教程MFC(Microsoft Foundation Classes)是微软公司开发的一组C++类库,用于开发Windows平台的应用程序。
MFC提供了许多用于创建图形用户界面和处理用户输入的类和函数,使开发者能够更轻松地构建Windows应用程序。
对于初学者来说,学习MFC可以帮助他们快速入门Windows编程,并且能够开发出功能丰富的应用程序。
本教程将向初学者介绍MFC的基础知识和使用方法。
1.MFC的概述MFC是构建Windows应用程序的一种开发方式。
它提供了大量的类和函数,包括窗口、对话框、控件、消息处理等,用于简化开发者创建和操作Windows界面的过程。
2.开发环境准备在开始学习MFC之前,需要安装Visual Studio等集成开发环境。
Visual Studio是一个开发Windows应用程序的强大工具,它包含了MFC 类库和丰富的开发工具。
3.创建MFC应用程序在Visual Studio中,可以选择创建一个MFC应用程序项目。
在创建项目的过程中,可以选择使用对话框、单文档或多文档应用程序。
4.MFC应用程序的结构MFC应用程序通常由一个或多个窗口或对话框组成。
窗口是应用程序的主要界面,可以包含菜单、工具栏、状态栏等。
对话框用于收集用户输入或显示特定信息。
5.消息映射和消息处理MFC应用程序通过消息系统与用户交互。
当用户执行一些操作(例如点击按钮、按下键盘)时,应用程序会接收到相应的消息。
通过消息映射和消息处理函数,可以定义应用程序对不同消息的响应。
6.控件的使用7.对话框的使用8.文件操作MFC提供了丰富的文件操作功能,包括打开、保存、读取和写入文件等。
通过MFC类中的方法,可以轻松地进行文件操作,并处理异常情况。
9.资源管理10.调试和错误处理在开发应用程序时,调试和错误处理是非常重要的。
MFC提供了丰富的调试工具和机制,帮助开发者快速定位和修复错误。
通过使用断点、输出调试信息等方法,可以更好地调试应用程序。
如何学习MFC
本文由luyng19贡献 doc1。
对 0 基础 MFC 者的一点建议 因为上半年自己刚刚学了点 MFC,算是对 MFC 有了点了解。
但 也只算是会使用,至于对其更多的细节算不上了解。
所以其实所知甚 少。
这里所要讲的, 只是帮助 从未接触过 MFC 的人更快地了解和能 使用 MFC,减少入门的时间,至于其核心原理,我爱莫能助。
另外, 因为我在深圳学习 MFC 期间做的笔记无缘丢失, 所以 当时总结的很 多东西都没有保存下来。
所以很多东西都有点忘了,有些想提醒的东 西都记不太清楚。
所以本文的水准就大为下降。
这里得先提一个东西。
就是 VC 与 MFC 的关系。
VC 是一个 windows 开发的一个软件开发平台,在里面可以进行与 C 和 C++相关的各类 工程的代码编写。
而 MFC 只不过是其中的一种工程。
所有讲 VC 的 书,除了会讲软件如何使用之外,一般大部分的内容都会围绕 MFC 的使用来讲。
可能是因为 MFC 是易上手,而 最流行。
所以如果在入 门时想找一些书籍,只要找 VC 的教程就行了。
反而以 MFC 做关键 字得到的搜索结果的那些书对入门帮助不大。
下面讲一下初接触 MFC 的困难。
第一,MFC 是一个大的框架。
其的 运行由内部控制。
东西很多。
而且系统会自动添加代码,所以当在看 一个 MFC 程序时, 很多 人往往不知道哪些代码是人写的, 哪些是系 统自动生成的。
第二,因为 MFC 的运行流程由框架在内部控制,通 过表面的代码看不出来程序是如何运行的。
这往往会 导致一个困惑, 就是不知道某部分代码为什么样要加在这里。
自己要实现某个功能应 该说哪个地方添加代码。
第三、MFC 一般会建立一个工程,里面一 般包括三类 文件,APP,VIEW ,DOC。
这就更增加了初学者的难 度。
因为这三种文件各有什么样用,他们之间是什么样关系也是让人 困惑的问题。
记得高中语文老师讲过读书分为三个境界。
mfc的工作原理
mfc的工作原理
MFC (Microsoft Foundation Class) 是微软公司开发的一种基于
类库的应用程序框架,用于构建Windows操作系统上的图形
用户界面(GUI)应用程序。
MFC的工作原理主要涉及以下
几个方面:
1. 封装了Windows API:MFC通过封装Windows API,提供
了一套更加简洁、易用的面向对象的编程接口,使开发者能够更方便地创建和管理窗口、对话框、控件以及其他GUI元素。
2. 事件驱动的编程模型:MFC采用了事件驱动的编程模型,
开发者可以通过重载消息映射表中的事件处理函数,响应用户的输入或系统的消息,例如点击按钮、键盘按键等。
这种模型使得开发者能够更加灵活地控制应用程序的行为。
3. 对象模型:MFC基于面向对象的编程思想,通过类的继承
和多态等机制,实现了可重用性和扩展性。
开发者可以通过创建和继承MFC的类,重写其成员函数来实现自定义的应用程
序逻辑。
4. 消息循环:MFC应用程序通过消息循环来处理用户的输入
和系统的消息。
消息循环负责从消息队列中获取消息,并将其分发给相应的窗口或控件进行处理。
开发者可以通过重载消息循环中的函数,定制应用程序的消息处理方式。
总的来说,MFC的工作原理是基于面向对象的编程思想和事
件驱动的编程模型,封装了Windows API提供了方便的编程
接口,通过消息循环处理用户输入和系统消息。
这样的设计使开发者能够更加简单地创建和管理GUI应用程序。
MFC笔记——VC++深入详解(第3版)孙鑫
MFC笔记——VC++深⼊详解(第3版)孙鑫1、Windows下的程序都是基于消息的,窗⼝在创建时都会产⽣⼀个WM_CREATE消息。
其他类可以响应这个消息,添加WM_CREATE消息的处理函数。
类视图——某个类处⿏标右键,属性——消息(找到WM_CREATE)。
或者使⽤“类向导”。
2、⽂档/视类结构,视类窗⼝始终覆盖在框架类窗⼝之上,⿏标所有操作都只能由视类窗⼝捕获。
如,CMainFrame中⿏标单击事件⽆反应,⽽在CDrawView中就有反应。
3、消息映射机制消息映射表,由头⽂件的DECLARE_MESSAGE_MAP()、源⽂件的BEGIN_MESSAGE_MAP与END_MESSAGE_MAP构建⽽成。
BEGIN_MESSAGE_MAP与END_MESSAGE_MAP之间,有消息映射宏,⼀旦有消息产⽣,程序就调⽤对应的消息响应函数来处理。
消息响应函数4、画线,推荐⽅式三/* ⽅式⼀:SDK// ⾸先获得窗⼝的设备描述表HDC hdc;hdc = ::GetDC(m_hWnd); //当前窗⼝的设备描述表//移动到线条的起点MoveToEx(hdc, m_ptOrigin.x, m_ptOrigin.y, NULL);//画线LineTo(hdc, point.x, point.y);//释放设备描述表::ReleaseDC(m_hWnd, hdc);*//* ⽅式⼆:MFC的CDC类,封装了所有与绘图相关的操作CDC* pDC = GetDC();pDC->MoveTo(m_ptOrigin);pDC->LineTo(point);ReleaseDC(pDC);*/⽅式三:MFC的CClientDC类,CDC的进⼀步封装,省去GetDC与ReleaseDCCClientDC dc(this); //客户区范围//CClientDC dc(GetParent()); //客户区+⼯具栏区dc.MoveTo(m_ptOrigin);dc.LineTo(point);/* ⽅式四:MFC的CWindowDC类,也是派⽣⾃CDC,可画的范围更⼤CWindowDC dc(this); //客户区范围//CWindowDC dc(GetParent()); //客户区+⼯具栏区//CWindowDC dc(GetDesktopWindow()); //所有窗⼝dc.MoveTo(m_ptOrigin);dc.LineTo(point);*/5、画笔CPen pen(PS_SOLID, 1, RGB(255, 0, 0)); //PS_DASH、PS_DOT宽度≤1,虚线才有效CClientDC dc(this);CPen* pOldPen = dc.SelectObject(&pen); //选择画笔dc.MoveTo(m_ptOrigin);dc.LineTo(point);//推荐写上以下两⾏,不然可能造成GDI对象的增加,程序崩溃dc.SelectObject(pOldPen); //重置画笔pen.DeleteObject(); //释放画笔6、画刷,⼀般⽤于填充CBrush brush(RGB(255, 0, 0));//创建⼀个红⾊画刷CClientDC dc(this); //创建并获得设备描述表dc.FillRect(CRect(m_ptOrigin, point), &brush);//利⽤红⾊画刷填充⿏标拖曳过程中形成的矩形区域brush.DeleteObject();画刷画矩形,dc中有默认⽩⾊画刷。
MFC基础知识
AfxRegisterWndClass:注册用于创建Windows窗口的窗口类
24
8.4应用程序向导
25
26
27
28
29
30
31
32
15
5.控件类
控件子层次结构包括若干类,使用这些类可建立静态文本、 命令按钮、位图按钮、列表框、组合框、滚动条、编辑框等。 这些直观控件为Windows应用程序提供了各种输入和显示界面。
6.控件条类:CControlBar类
控件条子层次结构为工具条、状态条、对话条和分割窗 口建立模型。该类是CToolBar、CStatusBar、CDialogBar的 基类,负责管理工具条、状态条、对话条的一些成员函数。控 件条指的是连接在主窗口框架的顶部或底部的小窗口
19
产生异常的原因描述将储存在异常对象的 m_cause数据成员中。
例如CArchiveException 类的m_cause数据成员 的可能值如下:
• badClass:不能读错误对象类型中的内容 • badIndex:无效文件格式 • badSchema:无效对象版本 • endOfFile:到达文件尾 • Generic:不明异常 • None:无异常 • readOnly:试图向只读文件进行写操作 • writeOnly:试图向只写文件进行读操作
2
是用来编 写Windows 应用程序 的C++类集
以层次结构组织 封装了大部分API函数 提供了图形环境下应用程序的框架 提供了创建应用程序的组件
提供了大量的基类供程序员根据不同的应用环境进行扩充 MFC
允许在编程过程中自定义和扩展应用程序中的类
较好的移植性,可移植于众多的平台
MFC还很好地保持了程序的向下兼容性
MFC新手到高手必须看的几本经典著作!!!
声明:笔者也谈不上什么高手,但看了这些书后,对MFC已经不再如从前那般知其然而不知其所以然,至少做什么不在束手束脚无从下手,我相信,当你认真读完这些书以后,你也会有同样的想法。
1、对C++有一定的了解。
这类书很多,笔者看的是(正版)C++ Primer Plus(第五版)中文版
2、对windows API有一定的了解。
对常用的函数有一定的了解。
MFC说白了是对API的封装,所以,许多时候你还是要跟这些东些给打交道。
精通Windows API : 函数、接口、编程实例
3、把c++技术内幕这本书看明白。
熟悉编程环境。
Visual C++技术内幕(附光盘第4版修订版)
4、把深入浅出MFC这本书看明白,但是这本书中有些问题,有些地方讲得不够明白,但仍是值得一看的书,读这本书主要是为了弄明白MFC的几大技术难题。
[商城正版]深入浅出MFC(附
光盘)/侯俊杰
5、《windows程序设计第二版》,这本书主要是为了解几个STATE及MAP是如何运着的,
其中还讲了钩子技术,相当值得一看。
Windows程序设计(第2版)(附光盘)/王艳平
6、《visual c++权威剖析》一书,这本是迄今为止对MFC研究得最深入最详细的一本书,对体系结构各方面都讲得比较透彻。
Visual C++权威剖析——MFC原理、机制与开发实例(配光盘)
加深刻的体会。
深入浅出MFC
CShape::setcolor(2, (CRect*)&rect1); CShape::setcolor(3, (CRect*)&rect2);
Index
類別及其成員-談封裝(encapsulation) 基礎類別與衍生類別-談繼承(Inheritance) This指標
Example(cont’)
#0028 class CSquare : public CRect #0029 #0030 public: #0031 void display() { ... } #0032 }; // 四方形是一種矩形
Example(cont’)
CSquare square; //宣告一個矩形名為square CRect rect1, rect2; //宣告兩個四方形 CCirclቤተ መጻሕፍቲ ባይዱ circle;
compile
class CShape { ... public: void setcolor(int color, (CShape*)this) { this->m_color = color; } };
CRect::setcolor(2, (CRect*)&rect1); CRect::setcolor(3, (CRect*)&rect2);
四方形(Csquare)
color(資料) Display(行為)
Example-Csquare (cont’)
{
對Csquare物件的描述:
class CSquare // 常常我們以C 作為類別名稱的開頭
private:
int m_color; public: void display() { ... } // 通常我們以m_ 作為成員變數的名稱開頭
C++学习由浅入深过来人图书指导
6、《COM本质论》——让你透过现象看本质,如果学习COM不读此书真是让我不敢相信你是做COM编程的。个人认为此书是学习COM的最好的一本书,太精彩了,尤其是前几章一定会让你眼前一亮。书中对套间的描述更让我迷茫很久的问题,得到了最好的解决。但是学习本书一定要有良好的C++基础和对外国人叙述事物的语言的良好领悟能力。
10、ATL开发指南
首先声明本人并非COM/ATL高手,尽管本人接触他们已经有4年了,但是因为工作中的一些原因一直未能深入研究和广泛的实际的使用它们。不过回想学习它们的痛苦经历,实在是有点不堪回首。在此仅以此文和大家探讨一下学习它们的路径,以让后来人少走弯路。
我个人认为学习COM是一件不简单的事情,只有一步一个脚印踏踏实实的理解每个观点和理论才能真正懂得其精髓。那样才能在发生错误的时候,依靠自己的知识解决问题。我个人认为如果要学好COM/ATL没有一年的时间是肯定不行的,也许是我比较愚笨。个人认为需要COM/ATL的应该循序渐进,可以参考的书目有:
1、《C++ Primer》——学习C++语言。主要理解其中的继承、重载、多态、多重继承、虚函数、纯虚函数、C++模板,这些都是以后学习COM的基础。因为C+ +对COM的实现是完全支持的,只有在C++上才能实现COM所有功能,体现其无穷魅力。很多书在说明COM原理的时候也是使用C++给予说明的。《COM技术内幕》中为了说明COM的使用了C++的多重继承和纯虚函数,MFC使用了嵌套类实现COM,ATL使用多重继承实现COM。不要认为这些基础不重要,在很多的满口继承和重载的C++高手中,很多人都不知道什么叫纯虚函数?虚函数表是什么东西?它在内存中是怎么存储的?派生类中又如何?
mfc面试知识点总结
mfc面试知识点总结MFC(Microsoft Foundation Class)是微软公司开发的一套 C++ 库,用于简化 Windows 应用程序的开发。
MFC 提供了一系列的类和函数,用于处理 windows 窗口、消息、事件等,使得开发者能够更快速地完成 Windows 程序的开发。
在 MFC 的面试中,通常会涉及到一些基础知识和高级知识,下面就来总结一些常见的 MFC 面试知识点。
一、MFC 的基本概念1. MFC 是什么?MFC 是 Microsoft Foundation Class 的简称,是微软公司提供的用于简化 Windows 应用程序的开发的一套 C++ 类库。
2. MFC 的特点有哪些?MFC 的特点包括易学易用、功能强大、提供了丰富的类库和工具等。
3. MFC 和 Win32 API 有什么区别?MFC 是建立在 Win32 API 之上的,它封装了 Win32 API,提供了更加高层次的接口,使得开发 Windows 应用程序更加简单和方便。
4. MFC 和 ATL 有什么区别?MFC 是面向传统 Windows 应用程序的开发框架,而 ATL 是为开发高效的 COM 组件而设计的,两者目标不同。
5. MFC 和 .Net 的关系是什么?MFC 是基于 C++ 的框架,而 .Net 是 Microsoft 开发的基于 .Net Framework 的框架,两者属于不同的技术栈。
二、MFC 的基本类和对象1. CWinApp 类CWinApp 是 MFC 应用程序的主类,它代表了一个 MFC 应用程序的实例,通常包含了一个主窗口类对象和一些初始化及清理代码。
2. CFrameWnd 类CFrameWnd 是 MFC 中的主窗口类,它代表了应用程序的主窗口,通常包含了菜单、工具栏等 UI 元素。
3. CView 类CView 是MFC 中的视图类,它用于显示窗口中的用户界面,通常包含了子视图、控件等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
调函数一般都是由 windows 系统来调用,不是用户自己调用。在用户使用 bsearch 函数时, 用户自己定义的 cmp 函数也是由 C 函数库来调用,不是自己调用。 回调函数的概念虽然在 C 语言中就已经存在, 但使用的范围远没有 windows 中的这么广 (其 实在设计接口时, 遇到某些有共性的未知操作就可以用传递一个函数的方法解决——例如遍 历某个未知集合中的每个元素) 。 回调函数在 windows 开发中得到推广应该是由其“以消息为基础的事件驱动系统”本质决 定的。用用户要实现某个操作,但是不知道什么时候开始执行(因为不知道什么时候能收到 相应的消息) ;系统则知道什么时候触发操作(因为消息由系统发出) ,但是又不知道操作的 具体细节(操作是用户自己定义的) 。在这种时候回调函数就成了用户和系统之间沟通的桥 梁——用户自己定义操作的细节,但是由系统在适当的时刻帮助调用。 因此,回调函数就成了“以消息为基础的事件驱动系统”系统平台上程序开发的核心! 为了向面向对象思想看齐, 一般把回调函数也设计成类的成员。 又因为回调函数有固定格式, 不能随便修改,因此在类中要把它声明为 static 类型函数(这是利用了 C++编译器不会为类 中 static 函数添加 this 指针参数的隐含特征) 。 在 windows 中程序设计的主要任务就是对自己感兴趣的消息做出相应的处理:程序等待某 个特定消息的发生,然后针对该消息做出特定的操作,如此而已!
第二章 C++的重要性质
面向对象有三个核心概念:封装,继承,多态。封装和继承这里不想细说,主要讲一下多态。 很多书里都说多态是面向对象的核心(也不知道对不对) 。在 C++中支持多态的关键技术就 是虚函数。虚函数的有些特征很怪异,这主要是和传统 C 函数比较而言的(如果没有传统 的函数概念也就不会觉得奇怪了) 。 以前很多人用 C 语言(现在也有好多人用 C 入门) ,对 C 的执行机制很熟悉。C 语言是一种 高级的汇编语言,写一段代码就是一段代码,编译器不会暗中给你做什么手脚。即使编译器 做也就是在初始化和退出的时候调用一些函数,这些用户都知道(fork、exec、exit……) 。 关于函数这一块也一样: 函数参数是值传递——数组除外(数组传地址) ,为了支持变参数,参数是从右到左进栈, 函数名就代表一个函数的入口地址,比较复杂一些的就是函数指针。 所以 C 程序员在调用一个函数的时候就根本想不出它会有什么出格的行为! 在 C++中就不一样了,特别是虚函数,有时候简直搞不清楚它到底是调用了哪个函数(真是 麻烦) !
2 运行时类型识别
我觉得这里的识别有两种级别,打个比方:X 是某个人,还是具有某个人的血统? 这个问题该问谁,怎么问?问 X 的爸爸妈妈、爷爷奶奶还是 X 自己?如果李四问李世民吗(他怎么会知道自己有多少后代)? 正确的办法是: 1. 把 X 设为李四。 2. X 是不是李世民? 3. 如果 X 是就停止,并输出结果是。 4. 如果 X 不是,但 X 有爸爸,就 X 设成 X 的爸爸,然后转到 2。 5. 如果 X 没有爸爸就停止,输出结果否。 在 MFC 中保存了一棵类的家族树,CObject 是根结点,其他的类都是他的后代(有几个特 殊的除外,如: CPoint 等) 。由于类的家族树存放的是类的信息——不是对象的信息,因此 只需要保存一个就够了,所以 MFC 将这棵树保存为 static 类型。 MFC 类的家族树和数据结构中的树并不相同,普通的树通过跟结点就可以访问所有的结点 (包括叶子) 。但在 MFC 中却不行——它只能逆向地从叶子结点向根结点方向访问(从父 结点访问不到子结点) 。 我自己把这种树叫做逆树(和通常的树相反,好象是反物质一类的东东) 。 其实在所有关于 指针的数据结构中都有这种逆*的存在。你可以想象在一个单向链表中,从一个结点移动到 后一个结点时,就回不到之前的结点了(除非你另外保存了它的地址) 。在现实中也有很多 这种情况: 你可以知道你所认识的人, 但却很难知道所有认识你的人——这是指针的不可逆 性造成的。 MFC 为 了 隐 藏 类 的 家 族 树 的 实 现 细 节 , 定 义 了 2 个 宏 : DEALARE_DYNAMIC 和 IMPLEMENT_DYNAMIC。 DEALARE_DYNAMIC 用于定义变量, IMPLEMENT_DYNAMIC 则进行相应的初始化,宏的具体细节可以参考书中代码。 我比较感兴趣的是 AFX_CLASSINIT 的初始化过程,代码如下: static AFX_CLASSINIT _init_classname(class_name::classclass_name); struct AFX_CLASSINIT { AFX_CLASSINIT(CRuntimeClass *pNewClass); }; AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass *pNewClass) { pNewClass->m_pNextClass = CRuntimeClass::pFirstClass; CRuntimeClass::pFirstClass = pNewClass; } 由于 _init_classname 是静态的 AFX_CLASSINIT 类型,因此在定义的时候自动的调用 AFX_CLASSINIT 初 始 化 操 作 从 而 将 pNewClass 神 不 知 鬼 不 觉 地 插 入 到 了 CRuntimeClass::pFirstClass 链表的开头(这个 pFirstClass 链表在动态识别中还用不着) !
这很有点像一种静态的初始化操作——AFX_CLASSINIT 在运行之前已经被自动地完成了。 当然 AFX_CLASSINIT 和静态初始化还是有些区别的:我感觉静态初始化应该是在编译时 被调用,而不是在执行时被调用。这应该算是 C++中一些很晦涩的技巧吧 pFirstClass 链 表 是 通 过 AFX_CLASSINIT 自 动 初 始 化 的 。 但 是 class_name::classclass_name::m_pBaseClass 指向的同宗链表则完全是手工初始化的(通过宏 传递的参数) 。在同宗链表中每个类和它的父类都可以用确定名称直接访问(静态的类别型 录网中的每个 CRuntimeClass 都可以通过一个确定的名称直接访问——不必要从 pFirstClass 开始遍历) 。 补充一点:定义 CObject 类时要手工生成 pFirstClass 链表和手工初始化 CRuntimeClass。
第三章 MFC 六大关键技术之仿真
其实除了消息外,其他的几个技术细节都可以看作是面向对象语言的特征。例如:对象的产
生过程、动态识别 ……。动态识别、动态创建、序列化特征已经在 JAVA 等新的面向对象 语言中得到支持了。如果不想了解编译器的实现细节的话,也可以不看。MFC 本身特有的 东西应该是消息的传播机制。 当然这里还是要全部总结一下了 (毕竟也是这本书最有特色的 地方了) 。 1 对象创建 MFC 中所有的类都继承自 CObject,创建对象时要考虑其父类的创建。个人觉得是这样一个 规则(不知道对不对) :创建对象之前要先创建父类,除非它没有父类!构造的函数的调用 规则也是这样:如果有就先调用父类的构造函数(这是 MFC,不是 C++,不考虑多重继承 的情况) 。 这就像人类的繁衍:一个人要出生,他的爸爸妈妈肯定要先出生,除非他是第一个进化成人 类的(或者是人工合成的) 。
3 动态创建 MFC 也定义了 2 个宏:DEALARE_DYNCREATE 和 IMPLEMENT_DYNCREATE。 要动态的生成对象,首先要知道对象的初始化函数,在 MFC 中采用在 CRuntimeClass 中保 存函数指针的方法来实现。保存指针等操作的代码也是在宏中加入的(MFC 要求要有一个 空参数的构造函数,个人觉得也可以让它们传递一个 void 型指针) 。 上面说过, 在动态识别一个类时不需要 pFirstClass 链表, 因为类是沿着它的同宗路线比较 (这 也是一种隐含的链表) 。但是动态创建就需要了,因为它也不知道自己是什么类型,因此要 遍历 pFirstClass 链表中所有的已知的类, 直到找到与自己相符的类型。 如果查找成功则通过 指针调用初始化函数来创建对象(指针为 NULL 则不能创建) ,否则就无法动态创建。 在强调一点:这是 MFC——不是 C++,所有的类都是从 COject 继承而来(个别类除外) , 因此他们如果存在就一定被保存在 pFirstClass 链表中。 如果你要是另起炉灶, 随便派生自一 个类,又使用了 DEALARE_DYNCREATE 和 IMPLEMENT_DYNCREATE 宏,那情况就糟 糕了,pFirstClass 链表可能被彻底的破坏,那 COject 的什么特性就都没了(切记) ! ! !
《深入浅出 MFC》学习笔记
学习时间:2006.3.19 - 2006.2.30 柴树杉 2006.2.30 整理于 VisionTek
第一章 win32 基本程序概念
windows 是一个“以消息为基础的事件驱动系统” 。当系统内核捕捉到外围设备发生的事件 后, 将以一种特定的消息传递出去。 而用户程序在接收到相应的消息后再做出相应的处理 (否 则系统以默认函数处理) 。处理窗口过程的一般是窗口函数(window procedure) 。Windows 程序的执行流程如上图。 窗口函数习惯上称作回调函数, 回调函数类似于 C 语言中 bsearch (二分法查找) 函数的 cmp (用于比较两个元素的大小)参数: // #include <stdlib.h> void *bsearch(const void *key, const void *base, size_t n, size_t size, int (*cmp)(const void *keyval, const void *datum)); 想一想开发 bsearch 函数的人怎么会知道两个元素的是什么,怎么比较大小呢?因此就必须 留给用户要自己定义 cmp 函数了! 回调函数一般都有固定的格式(不知道是否会用变参数的情况) ,不然可能会发生错误。回