VC++技术内幕(第四版)笔记
第一章:microsoft windows 和 visual c++
1,windows应用程序中一定要有winmain函数,用来完成某些特殊的任务,其中最主要的是创建应用次序的主窗口。
2,dos下,所有次序的目标模块在创建过程中都被静态连接起来。而windows允许动态连接,即一些特定结构的库(dll)可以在运行过程中被装入和连接,并且被多个应用程序共享。
3,项目是一些相互关联的源文件的集合,这些源文件经过编译、连接,然后被组合在一起形成可执行的wwindows应用程序或dll。
4,几个重要developer studio创建的中间文件:
clw (支持classwizard )dsp (项目文件)
dsw (工作空间文件)ncb (支持classview)
opt (保持工作空间的配置)plg (建立日志文件)
5,appwizard是一个代码生成器,它会按照用户通过对话框指定的特性、类名、及源代码文件名来产生windows应用程序工作架构。appwizard所产生的代码只是一些最基本的代码,它完成的功能完全由应用程序的基类所决定。
/**************************************/
第二章:microsoft基本类库应用程序框架
1,按照惯例,mfc库类名用大写“c”打头。
2,类cmyapp的对象theapp就代表一个应用程序。当运行该应用程序的时候,windows自动调用程序框架内部的winmain函数,winmain函数会去查找该应用程序的全局构造对象(theapp),该对象是有cwinapp类派生类的对象。c++中,全局对象在主程序被运行之前就已经构造好了。
3,当winmain发现该应用程序对象(theapp)时,会自动调用虚拟成员函数cwinapp::initinstance(),该函数会进一步调用相应的函数来完成主窗口的构造和显示工作。由于基类cwinapp中不知道我们实际需要的什么样的窗口,所以我们必须在派生出的应用程序类cmyapp中重载initinstance()函数(cmyapp::initinstance()),由多态性,当调用cwinapp::initinstance()时候,会自动转向myapp::initinstance().
4,winmain函数调用完initinstance()函数后,就调用cwinapp::run函数,cwinapp::run函数被隐藏在基类中负责传递应用程序的消息给相应的窗口,从而维护应用程序的运转。
5,关闭应用程序(对单一框架程序来说),首先cmyframe 对象被删除,然后退出run,进而退出winmain,最后删除cmyapp对象(theapp)。
6,一些windows类库在基类为鼠标事件消息以及其他一些标准消息定义一些虚函数,如果需要,派生类会对这些函数进行重载。
mfc库应用程序框架没有采用虚函数来处理windows消息,而是通过一些宏来将特定的消息映射到派生类中相应的成员函数上。(原因:p21。c++类对程序中用到的每一个派生类都要求有一张虚函数分发表vtable,在btable中每个虚函数都需要有一个4字节的入口项,而不管该函数会不会在派生类中被重载。)
mfc消息控件函数要求提供函数原型,函数体,以及在消息映射中的入口。
7,文档-视图结构将数据从用户对数据的观察中分离出来,这样就允许对同一数据可以有多个视图。
mfc库应用程序中,文档和视图是由c++类的实例来描述的。
文档基类代码通常和file open,file save菜单项关联,而派生文档类则一般用来完成对文档对象数据的实际读写工作。
视图基类通常表示一个包含于框架窗口中的窗口,而派生视图类则常用来和稳当类相联系,负责应用程序的显示和打印机i/o。
派生视图类及其基类共同处理windows的消息,而mfc库则协调文档,视图,框架窗口,以及应用程序之间的相互作用关系,这种协调多用虚函数来实现。
文档对象既可以与一次可全部读入内存的磁盘文件相关联,也可以同数据库相关联。
第三章:从“hello,world!”着手学习appwizard
1,视图:从用户角度看,视图是一个普通的窗口;从程序员角度看,试图是一个从mfc库中cview类所派生的类的对象。视图对象的行为完全由类的成员函数和数据成员决定,其中包括派生类的特定成员和基类的继承而来的成员。
2,cex03aview类最重要的基类是cwnd和cview。cwnd提供cex03aview的窗口属性,而cview提供它和应用程序框架其它部分之间的联系,特别是和文档及框架窗口之间的联系。
3,视图类中ondraw成员函数:ondraw成员函数被设计成一个虚成员函数,每次当视窗需要被重绘时候,应用程序都要调用ondraw函数。
当用户改变了窗口尺寸,或当前窗口恢复了先前被遮盖的部分,或当前应用程序改变了窗口的数据的时候,窗口都需要被重绘。
当用户改变了窗口尺寸,或窗口需要恢复被遮盖的部分,则应用程序自动去调用ondraw函数。
但注意,如果程序中某个函数修改了窗口数据,则它必须通过调用视图所继承的invalidate(inbalidaterect)成员函数来通知windows,调用invalidate后会触发对ondraw函数的调用。
4,window中不允许直接访问显示硬件,必须通过和窗口相关联的“设备环境”跟显示硬件通讯。mfc中设备环境由cdc类对象来表示。
5,利用win32 debug模式 和 win32 release模式开发应用程序。
(默认情况不出现build工具栏,可从tools菜单选择customize项,设置显示build工具栏,vc6中也可在工具栏上直接点击右键选择build工具栏)
win32 release模式win32 debug模式[iocblog.net 来源]
源码调试不能编译器连接器都允许
mfc诊断宏不能(定义了ndebug)可以(定义了_debug)
库连接mfc release库mfc debug库
编译优化速度优化(学习版不能)没有优化(快速编译)
我们应在win32 debug模式下开发应用程序,然后在发布或交付前用win32 release模式重建应用程序。in32 release模式下建立的exe文件又小又快。
6,诊断宏trace宏对监测程序状态特别有用。这些宏要求在允许追踪的情况下才有效,允许追踪是默认设置。
(问题:trace宏的应用事例与运行原理。宏trace的输出在在哪显示呢?在output输出框下选择debug项,调试运行程序即可看到trace宏输出。)
7,预编译头文件代表了编译器在源代码特定行上进行‘快照’。在mfc库程序中,快照常紧接在#include "stdafx.h"后进行。
文件stdafx.h包含了mfc库头文件的#include语句。该文件的内容取决于运行appwizard时候所做的选择。
文件stdafx.cpp只包含#include "stdafx.h"语句。stdafx.cpp文件用来在相应项目的目录下产生预编译头文件(pch文件)。编译开关/yc只用于stdafx.cpp文件,导致产生预编译头文件(pch),而其它源文件的/yu编译开关使可以使用一个存在的pch文件。开关/fp用来指定专门的pch文件名,默认情况下为相应目标输出文件目录下与项目同名扩展名为pch的文件。
(vc6下具体设置参见:[project settings属性框] [c/c++]属性页[projectoptions]、[source file options]项)
(注意:在vc6[project settings属性框]中查看stdafx.cpp文件[source file options]项时候,可以看到[project settings, and /yc"stdafx.h"],这里说明一下,stdafx.cpp文件的[ /yc"stdafx.h"]的设置覆盖了[project options]设置中的[/yu"stdafx.h"])[iocblog.net 来源]
文章整理:iocblog
版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。