本书的结构如下:
第一章 走进Visual C++ :
1.1理解VC工程:主要讨论的是文件名.dsw(workspace工作空间)和文件名.dsp(project工程文件),.opt文件主要是在workspace文件中要用到的本地计算机的有关配置信息。rc为扩展名的是可以在VC集成环境中以可视化的方法进行编辑和修改,通常是位图和菜单之类的资源,而以rc2为扩展名的文件是VC集成开发环境中不能以可视化方法进行编辑和修改。
1.2 MFC编程特点:从本质上讲,应用程序都可以归为用户界面设计,对文件的操作,多媒体的使用,数据库的访问等等一些主要的方面。主要是面向对象的类库的使用。
1.3使用Wizard:就是一步一步的建立一个工程。最后再view 菜单中有个CLASSWIZARD项,用来管理程序中的对象和消息。在windows程序设计中,消息是个极为重要的概念,用户通过窗口界面的各种操作最后都转化为发送到程序中的对象的各种消息。以下为一些常用的消息:
1.窗口消息:WM_CREATE,WM_DESTROY,WM_CLOSE:当创建窗口对象的时候,收到WM_CREATE消息,对这个消息的处理过程一般用来设置一些显示窗口前的初始化工作,如设置窗口的大小,背景颜 {MOD}等。WM_DESTROY消息指示窗口即将要被撤销。收到WM_CLOSE,一般的操作是回收所有分配给这个窗口的各种资源。
2.键盘消息WM_CHAR,WM_KEYDOWN,WM_KEYUP:WM_CHAR消息是在用户的键盘输入能产生有效的ASCII码才会发生。在WM_KEYDOWN和WM_KEYUP消息是传递的按键的虚拟键码,所以这两个消息可以处理非打印字符,如方向键,功能键等。ASCII码是可以区分字母的大小写的,而虚拟键码是不能区分大小写的。
3.鼠标消息:WM_MOUSEMOVE,WM_LBUTTONDOWN,WM_LBUTTONUP,WM_LBUTTONBCLICK,WM_RBUTTONDOWN,WM_RBUTTONUP,WM_RBUTTONDBCLICK这些主要是对应鼠标的移动,左右键的按下,释放,双击事件。
4.另一组窗口消息:WM_MOVE,WM_SIZE,WM_PAIN:当窗口移动的时候产生WM_MOVE消息,窗口的大小改变的时候产生WM_SIZE消息,而当窗口工作区中的内容需要重绘的时候就会产生WM_PAINT消息。
6.定时器消息WM_TIMER:这个消息中就可以处理一些需要定期处理的事情。
第二章 MFC程序结构分析
2.1 Windows程序工作原理:用户操作用户界面,产生特定的事件,然后这些事件通过windows系统产生消息,然后程序中的对象调用特定的消息处理函数。
2.2建立应用程序:
2.3程序结构剖析:首先消息被CMYAPP接收,然后将这些消息发送给CMYVIEW,CMAINFRAME,CMYDOC处理,CMYVIEW发文档给CMYDOC处理。CMYVIEW的作用是显示数据,而数据的来源是CMYDOC。文档和视图的分离的一个好处是一个文档可以同时具有多个视窗,每个视窗只显示文档中的一部分数据,或者以特定的风格显示文档中的数据。另一个好处是在程序中可以处理多个文档,通过对不同的视窗的处理达到对不同的文档分别处理的目的。
类CMYAPP:这个类是CWINAPP的派生类,这个类有一个成员函数INITINSTANCE,在这个成员函数中会new一个函数模板,然后条用adddoctemplate函数将这个文档模板加入到应用程序所维护的文档模板链表中。
类CMAINFRAME是由CFRAMEWND派生来的,所以也是一个框架窗口。
第三章 深入MFC类库
3.1 处理用户输入:在对话框中使用了一种叫做对话框数据交换(DDX)的机制来从编辑控件当中取出数据。DoDataExchange函数就是对话框类和对话框资源进行DDX数据交换的函数。在对话框初始化的时候或者在程序中调用UpdataData()函数的时候,这个函数将会被调用。DDX_TEXT这个函数可以处理多种类型的数据成员变量与空间资源之间的数据交换。还可以通过生成一个CONTROL类型的成员变量来控制对话框当中的列表控件。在DoDataExchange当中增加了这样的代码DDX_CONTROL(),之后就可以使用刚才定义的控件对象了。
3.2有关屏幕输出:设备上下文工作原理:首先对设备上下文对象进行设置,然后选择进行屏幕输出所需要的工具,最好用DC对象的输出函数绘制图形。屏幕输出的目标一般都是窗口的客户去。每次窗口的外观发生改变的时候都会发出一个WM_PAINT消息,窗口的重绘都是在响应了这个消息的处理函数中进行的。另外在程序中调用UpdateWindow和RedrawWindow函数的时候都绘出发重绘事件。而UpdateDate是作用在对话框的初始化和恢复。还可以直接使用SendMessage函数向一个指定的窗口发送出重绘消息。另外调用CWND的Invalidate函数可以指示重绘的时候是否需要擦去背景。
有关屏幕的映射方式:DC.SetMapMode(),然后调用DC.SetViewportOrg();几种映射方式MM_LOENGLISH,逻辑单位是0.01英寸。MM_HIENGLISH,逻辑单位是0.001英寸。MM_LOMETRIC,逻辑单位是0.1毫米,MM_HIMETRIC逻辑单位是0.01毫米,MM_TWIPS逻辑单位是1/1440英寸。
3.3 文件处理:在MFC中,程序的存取工作的核心内容就是如何实现这些对象的持续化。一个可以实现持续化的对象知道如何保存和载入他们自己的数据。当然如果更喜欢直接操作文件进行数据的存取工作,MFC提供了CFile类,比API调用要简单。CObject类有一个叫做serialize的成员函数,序列化工作主要是在这个函数当中进行的。MFC使用一个类型为CArchive的归档对象作为中介,它指示CFile对象完成操作。
使类实现序列化,要五个步骤:从CObject类或其派生类派生用户类,在类声明中使用DECLARE_SERIAL宏,重载Serialize函数,定义不用变量的构造函数,,在类实现文件中使用宏IMPLEMENT_SERIAL。
3.4 DAO技术:ODBC和DAO技术使访问数据库的两种选择。而ODBC工作依赖于数据库制造商提供的驱动程序,使用ODBC API的时候,先将请假传递给正确的驱动程序,驱动程序再使用SQL语句指示DBMS完成数据库访问工作。DAO则绕开了中间环节,直接用微软提供的数据库引擎。首先要为每一个打开的数据库文件提供一个数据库对象CDaoDatabase,由这个对象管理数据库的连接。然后生成记录集对象CDaoRecordset,用它来进行查询,操作和更新等等工作。如果需要在程序中管理数据库的结构,则需要使用DAO当中的表结构信息对象CDaoTableInfo及字段定义对象CDaoFiledInfo来进行获得或者改变数据库表结构的工作。
3.5 打印
第四章 VC程序调试
4.1 VC调试工具:主要的还是断点,看寄存器的值,内存的值,把鼠标放在变量上会显式值等等方法。
4.2 高级调试技术:TRACE宏的利用,这个有点像C语言中的printf语句,不过在控制台下用不了,在Debug版本下可以输出,在release版本下没有用。ASSERT宏的使用。对象的DUMP函数的利用,首先调用基类的Dump函数,以输出基类的内容,向Cdumpcontest对象输出该类的数据。
4.3 内存漏洞的检查:这里谈到了在开始建立一个CmemoryState对象,调用其成员函数Checkpoint,以取得当前内存使用情况的快照,在你所监测的程序段的末尾处再建立一个CmemeoryState对象,调用其成员函数Checkpoint,以取得当前内存使用情况的快照,再建立第三个CmemoryState对象,调用其成员函数Difference,该函数返回非0,有内存漏洞。
第五章 Visual C++与多媒体
5.1 对声音的处理:媒体控制接口(MCI)对于VC来说有用的是这样的一个函数MCIERROR mciSendString(LPCTSTR lpszCommand,LPTSTR lpszReturnString,UINT cchReturn,HANDLE hwndCallback),还有一个是mciSendCommand()函数
5.2 多媒体文件IO:读取WAV文件的过程:mmioOpen()打开文件,mmioDescend(”WAVE”),进入“fmt”块,mmioRead(0读取WAVE文件格式信息),mmioDescend,跳出“fmt“块,mmioDescend(’data”),进入data块,mmioRead(),读取WAVE数据信息,mmioClose(0关闭文件。
5.3 多媒体图形图像技术
5.4 图像合成
5.5 FLC动画
5.6 热点
总结:看完这本书的结构,我第一大感觉是看完这本书后应该再看一看《深入浅出MFC》。MFC程序很重要的一点是封装了消息的处理,这里将整个的消息循环让你看不到了。另外就是MFC中的类为了省略虚拟表浪费空间而采用的宏的定义,第三,MFC很重要的是文档结构和视图结构的分离。很如果要求对windows编程感兴趣,那么可以看那本《windows程序设计》原书是英文的,这个是翻译过来的。如果要学习windows核心的api的话那么可以看看《widows核心编程》