快速,持续,稳定,傻瓜式
支持Mysql,Sqlserver数据同步

mfc对话框基础要点资源

请联系QQ:1793040 索取软件

img

mfc对话框基础要点

MFC基于对话框的编程,介绍了基于对话框的编程中用到的基础知识,非常的有用



img

MFC对话框编程要点

MFC对话框编程要点,基本概念及要点,适合初学者,欢迎讨论!



img

MFC对话框中使用打印及预览模块(2实例与要点说明)

MFC对话框的打印与预览不如单文档方便,为了帮助初学者了解在对话框中调用打印与预览模块,提供了2个应用实例和应用要点说明,程序中存在多处问题,但由于重点在说明使用的方法,就不作修改了,在实际应用中读者可根据实际情况灵活运用。程序在VS2009中通过编译



img

MFC基于对话框实现GDI+绘图入门代码总结

之前研究了很久GDI+,也一直看不到,因为一直都不动手,今天偶然百度查询资料,终于实现了GDI+绘图的基本流程了,因此总结下基本编写代码的流程,分为单文档,和对话框两种方式来绘图,也写出了注意要点,在此分享,也方便以后自己使用



img

深入解析MFC

这是一本填补”使用向导”类的VisualC++书籍、产品文档以及MFC源代码之间空隙的MFC书籍。本书是了解MFC内幕的向导,提供了关于那些没有文档记录的MFC类、实用函数和数据成员的独一无二并且透彻的信息,介绍了有用的编码技巧,并对MFC各个类之间的协作方式进行了重要的分析。
本书的第一部分包含了核心的MFC图形用户界面类以及支持它们的类,第二部分包含了像OLE这种扩展基本Windows支持的主题。如果做到以下几点,你就可以成为一位透彻理解MFC实现细节的专家:探索MFC文档/视图结构的内幕,从而学习视图同步、打印和打印预览;更深入地了解MFC序列化中那些没有文档记录的方面和一些没有文档记录的类,例如CPreview、CPreviewDC、CMirrorFile以及CDockBar等等;最后理解MFC
和OLE是如何共同运作的,以及OLE控悠扬是如何实现的;积累技巧,学会自己研究和理解MFC源代码。 目录: 前言 致谢 简介 第1章 MFC的概念性总括
面向对象编程的一些背景 面向对象编程术语 通常的对象 对象与C++ 为什么使用OOP 应用程序框架与MFC MFC要点之旅 结语 第2章
基本的Windows支持 MFC与C/SDK 基本的MFC应用程序组件 现在,找到WinMain() 一些其他隐藏的信息 MFC对GDI的支持 结语 第3章
MFC中的消息处理 CCmdTarget和消息映射表 窗口消息 MFC消息映射内幕 MFC如何使用消息映射表
进入消息循环:PreTranslateMessage() 结语 第4章 MFC实用类 简单值类型 MFC的集合类 CFile家族:MFC对文件的访问
CExcephon:提供更好的错误处理 结语 第5章 CObject 使用CObject的代价 CObject的特性 宏的介绍 运行时类的信息
MFC中的持续性 CObject对诊断的支持 CObject的诊断支持内幕 组合在一起 投入使用 是否值得 结语 第6章 MFC对话框和控件类
CDialog:模态MFC对话框和非模态MFC对话框 MFC公用对话框 OLE对话框 属性页(也称带标签的对话框) MFC控件类 结语 第7章
MFC的文档/视图结构 为什么要用文档/视图 其他原因 旧的方法 体系结构 文档/视图结构内幕 文档舰图内幕再览 结语 第8章 高级文档舰图结构内幕
CMirrorFile CView打印 CView对打印预览支持的内幕 CView的派生类:CScrollView
CView的另一个派生类:CCtrlView 结语 第9章 MFC的增强型用户界面类 CSplitterWnd:MFC分割窗口
MFC的CControlBar体系结构 CMiniFrameWnd MFC的MRU文件链表实现 结语 第10章 MFC的DLL与线程 理解状态 MFC的DLL
MFC线程 结语 下一章 第11章 用MFC实现COM MFC和OLE COM 何为COM类 COM接口 GUID 剖析IUnknown接口 COM对象服务器
拥有多个接口的COM类 MFCCOM类 使用MFC创建CoMath MFCCOM和接口映射宏 使用MFC的CoMath类 完成服务器的设计 MFC对类厂的支持
结语 第12章 统一数据传输和MFC 历史回顾 重要的结构 IDataObject接口 OLE剪贴板 MFC的IDataObjeot类 延迟供应
深入了解MFC的IDataObject类 OLE拖放 结语 第13章 使用MFC实现OLE文档 OLE文档101 MFC对OLE文档的支持
使用MFC实现OLE文档服务器 容器朋艮务器的协调工作 使条目无效 保存容器的文档 装载OLE文档 结语 第14章 MFC与自动化 自动化的历史 自动化的功能
使用MFC实现自动化应用程序 自动化的工作机制 COM接口与自动化 实现自动化的另外一种方法:使用类型信息 MFC与自动化 结语:使用”MFC方式”的结果
第15章OLE控件 VBX及其缺陷 OLE控件 写一个OLE控件 在工程里使用OLE控件 它是如何工作的 MFC和OLE控件的容器 OLE控件的生存周期
OLE连接 OLE控件的事件 MFC如何处理事件 技巧:在一个视图中加入一个事件接收器 OLE控件的属性页 结语 附录A MFC源代码导读 MFC编码技术
探索MFC的工具 MFC源代码指南 愉快的旅途 附录B 本书的示例代码 术语表



img

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建立有连接的通信   第一章
VC入门 1.1 如何学好VC
这个问题很多朋友都问过我,当然流汗是必须的,但同时如果按照某种思路进行有计划的学习就会起到更好的效果。万事开头难,为了帮助朋友们更快的掌握VC开发,下面我将自己的一点体会讲一下:
1、需要有好的C/C++基础。正所谓”磨刀不误砍柴工”,最开始接触VC时不要急于开始Windows程序开发,而是应该进行一些字符界面程序的编写。这样做的目的主要是增加对语言的熟悉程度,同时也训练自己的思维和熟悉一些在编程中常犯的错误。更重要的是理解并能运用C++的各种特性,这些在以后的开发中都会有很大的帮助,特别是利用MFC进行开发的朋友对C++一定要能熟练运用。
2、理解Windows的消息机制,窗口句柄和其他GUI句柄的含义和用途。了解和MFC各个类功能相近的API函数。 3、一定要理解MFC中消息映射的作用。
4、训练自己在编写代码时不使用参考书而是使用Help Online。 5、记住一些常用的消息名称和参数的意义。 6、学会看别人的代码。
7、多看书,少买书,买书前一定要慎重。 8、闲下来的时候就看参考书。 9、多来我的主页。^O^
后面几条是我个人的一点意见,你可以根据需要和自身的情况选用适用于自己的方法。 此外我将一些我在选择参考书时的原则:
对于初学者:应该选择一些内容比较全面的书籍,并且书籍中的内容应该以合理的方式安排,在使用该书时可以达到循序渐进的效果,书中的代码要有详细的讲解。尽量买翻译的书,因为这些书一般都比较易懂,而且语言比较轻松。买书前一定要慎重如果买到不好用的书可能会对自己的学习积极性产生击。
对于已经掌握了VC的朋友:这种程度的开发者应该加深自己对系统原理,技术要点的认识。需要选择一些对原理讲解的比较透彻的书籍,这样一来才会对新技术有更多的了解,最好书中对技术的应用有一定的阐述。尽量选择示范代码必较精简的书,可以节约银子。
此外最好涉猎一些辅助性的书籍。 1.2 理解Windows消息机制
Windows系统是一个消息驱动的OS,什么是消息呢?我很难说得清楚,也很难下一个定义(谁在嘘我),我下面从不同的几个方面讲解一下,希望大家看了后有一点了解。
1、消息的组成:一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。例如当菜单转中之后会有WM_COMMAND消息发送,WPARAM的高字中(HIWORD(wParam))是命令的ID号,对菜单来讲就是菜单ID。当然用户也可以定义自己的消息名称,也可以利用自定义消息来发送通知和传送数据。
2、谁将收到消息:一个消息必须由一个窗口接收。在窗口的过程(WNDPROC)中可以对消息进行分析,对自己感兴趣的消息进行处理。例如你希望对菜单选择进行处理那么你可以定义对WM_COMMAND进行处理的代码,如果希望在窗口中进行图形输出就必须对WM_PAINT进行处理。
3、未处理的消息到那里去了:M$为窗口编写了默认的窗口过程,这个窗口过程将负责处理那些你不处理消息。正因为有了这个默认窗口过程我们才可以利用Windows的窗口进行开发而不必过多关注窗口各种消息的处理。例如窗口在被拖动时会有很多消息发送,而我们都可以不予理睬让系统自己去处理。
4、窗口句柄:说到消息就不能不说窗口句柄,系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,所以用户的输入就会被正确的处理。例如有两个窗口共用一个窗口过程代码,你在窗口一上按下鼠标时消息就会通过窗口一的句柄被发送到窗口一而不是窗口二。
5、示例:下面有一段伪代码演示如何在窗口过程中处理消息 LONG yourWndProc(HWND hWnd,UINT uMessageType,WPARAM
wP,LPARAM) { switch(uMessageType) {//使用SWITCH语句将各种消息分开 case(WM_PAINT):
doYourWindow(…);//在窗口需要重新绘制时进行输出 break; case(WM_LBUTTONDOWN):
doYourWork(…);//在鼠标左键被按下时进行处理 break; default:
callDefaultWndProc(…);//对于其它情况就让系统自己处理 break; } }
接下来谈谈什么是消息机制:系统将会维护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以Windows可以同时进行多个任务。下面的伪代码演示了消息循环的用法:
while(1) { id=getMessage(…); if(id==quit) break; translateMessage(…); }
当该程序没有消息通知时getMessage就不会返回,也就不会占用系统的CPU时间。 下图为消息投递模式
在16位的系统中系统中只有一个消息队列,所以系统必须等待当前任务处理消息后才可以发送下一消息到相应程序,如果一个程序陷如死循环或是耗时操作时系统就会得不到控制权。这种多任务系统也就称为协同式的多任务系统。Windows3.X就是这种系统。而32位的系统中每一运行的程序都会有一个消息队列,所以系统可以在多个消息队列中转换而不必等待当前程序完成消息处理就可以得到控制权。这种多任务系统就称为抢先式的多任务系统。Windows95/NT就是这种系统。
1.3 利用Visual C++/MFC开发Windows程序的优势
MFC借助C++的优势为Windows开发开辟了一片新天地,同时也借助ApplicationWizzard使开发者摆脱离了那些每次都必写基本代码,借助ClassWizard和消息映射使开发者摆脱了定义消息处理时那种混乱和冗长的代码段。更令人兴奋的是利用C++的封装功能使开发者摆脱Windows中各种句柄的困扰,只需要面对C++中的对象,这样一来使开发更接近开发语言而远离系统。(但我个人认为了解系统原理对开发很有帮助)
正因为MFC是建立在C++的基础上,所以我强调C/C++语言基础对开发的重要性。利用C++的封装性开发者可以更容易理解和操作各种窗口对象;利用C++的派生性开发者可以减少开发自定义窗口的时间和创造出可重用的代码;利用虚拟性可以在必要时更好的控制窗口的活动。而且C++本身所具备的超越C语言的特性都可以使开发者编写出更易用,更灵活的代码。
在MFC中对消息的处理利用了消息映射的方法,该方法的基础是宏定义实现,通过宏定义将消息分派到不同的成员函数进行处理。下面简单讲述一下这种方法的实现方法:
代码如下 BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()//}}AFX_MSG_MAP ON_COMMAND(ID_FONT_DROPDOWN, DoNothing)
END_MESSAGE_MAP() 经过编译后,代码被替换为如下形式(这只是作讲解,实际情况比这复杂得多):
//BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd) CMainFrame::newWndProc(…) {
switch(…) {//{{AFX_MSG_MAP(CMainFrame)//ON_WM_CREATE() case(WM_CREATE):
OnCreate(…); break;//}}AFX_MSG_MAP//ON_COMMAND(ID_FONT_DROPDOWN,
DoNothing) case(WM_COMMAND): if(HIWORD(wP)==ID_FONT_DROPDOWN) { DoNothing(…);
} break;//END_MESSAGE_MAP() } } newWndProc就是窗口过程只要是该类的实例生成的窗口都使用该窗口过程。
所以了解了Windows的消息机制在加上对消息映射的理解就很容易了解MFC开发的基本思路了。 1.4 利用MFC进行开发的通用方法介绍
以下是我在最初学习VC时所常用的开发思路和方法,希望能对初学VC的朋友有所帮助和启发。
1、开发需要读写文件的应用程序并且有简单的输入和输出可以利用单文档视结构。
2、开发注重交互的简单应用程序可以使用对话框为基础的窗口,如果文件读写简单这可利用CFile进行。
3、开发注重交互并且文件读写复杂的的简单应用程序可以利用以CFormView为基础视的单文档视结构。
4、利用对话框得到用户输入的数据,在等级提高后可使用就地输入。 5、在对多文档要求不强烈时尽量避免多文档视结构,可以利用分隔条产生单文档多视结构。
6、在要求在多个文档间传递数据时使用多文档视结构。 7、学会利用子窗口,并在自定义的子窗口包含多个控件达到封装功能的目的。 8、尽量避免使用多文档多视结构。
9、不要使用多重继承并尽量减少一个类中封装过多的功能。 1.5 MFC中常用类,宏,函数介绍 常用类 CRect:用来表示矩形的类,拥有四个成员变量:top
left bottom right。分别表是左上角和右下角的坐标。可以通过以下的方法构造:CRect( int l, int t, int r, int b
); 指明四个坐标 CRect( const RECT& srcRect ); 由RECT结构构造 CRect( LPCRECT lpSrcRect );
由RECT结构构造 CRect( POINT point, SIZE size ); 有左上角坐标和尺寸构造 CRect( POINT topLeft,
POINT bottomRight ); 有两点坐标构造 下面介绍几个成员函数:int Width( ) const; 得到宽度 int Height( )
const; 得到高度 CSize Size( ) const; 得到尺寸 CPoint& TopLeft( ); 得到左上角坐标 CPoint&
BottomRight( ); 得到右下角坐标 CPoint CenterPoint( ) const; 得当中心坐标
此外矩形可以和点(CPoint)相加进行位移,和另一个矩形相加得到”并”操作后的矩形。 CPoint:用来表示一个点的坐标,有两个成员变量:x y。
可以和另一个点相加。 CString:用来表示可变长度的字符串。使用CString可不指明内存大小,CString会根据需要自行分配。下面介绍几个成员函数:
GetLength 得到字符串长度 GetAt 得到指定位置处的字符 operator + 相当于strcat void Format( LPCTSTR
lpszFormat,…); 相当于sprintf Find 查找指定字符,字符串 Compare 比较 CompareNoCase 不区分大小写比较
MakeUpper 改为小写 MakeLower 改为大写
CStringArray:用来表示可变长度的字符串数组。数组中每一个元素为CString对象的实例。下面介绍几个成员函数:Add 增加CString
RemoveAt 删除指定位置CString对象 RemoveAll 删除数组中所有CString对象 GetAt 得到指定位置的CString对象
SetAt 修改指定位置的CString对象 InsertAt 在某一位置插入CString对象 常用宏 RGB TRACE ASSERT VERIFY
常用函数 CWindApp* AfxGetApp(); HINSTANCE AfxGetInstanceHandle( ); HINSTANCE
AfxGetResourceHandle( ); int AfxMessageBox( LPCTSTR lpszText, UINT nType=MB_OK, UINT nIDHelp=0 );用于弹出一个消息框 第二章 图形输出 2.1 和GUI有关的各种对象
在Windows中有各种GUI对象(不要和C++对象混淆),当你在进行绘图就需要利用这些对象。而各种对象都拥有各种属性,下面分别讲述各种GUI对象和拥有的属性。
字体对象CFont用于输出文字时选用不同风格和大小的字体。可选择的风格包括:是否为斜体,是否为粗体,字体名称,是否有下划线等。颜色和背景色不属于字体的属性。关于如何创建和使用字体在2.2
在窗口中输出文字中会详细讲解。
刷子CBrush对象决定填充区域时所采用的颜色或模板。对于一个固定色的刷子来讲它的属性为颜色,是否采用网格和网格的类型如水平的,垂直的,交叉的等。你也可以利用8*8的位图来创建一个自定义模板的刷子,在使用这种刷子填充时系统会利用位图逐步填充区域。关于如何创建和使用刷子在2.3
使用刷子,笔进行绘图中会详细讲解。
画笔CPen对象在画点和画线时有用。它的属性包括颜色,宽度,线的风格,如虚线,实线,点划线等。关于如何创建和使用画笔在2.3
使用刷子,笔进行绘图中会详细讲解。 位图CBitmap对象可以包含一幅图像,可以保存在资源中。关于如何使用位图在2.4
在窗口中绘制设备相关位图,图标,设备无关位图中会详细讲解。
还有一种特殊的GUI对象是多边形,利用多边形可以很好的限制作图区域或是改变窗口外型。关于如何创建和使用多边形在2.6 多边形和剪贴区域中会详细讲解。
在Windows中使用GUI对象必须遵守一定的规则。首先需要创建一个合法的对象,不同的对象创建方法不同。然后需要将该GUI对象选入DC中,同时保存DC中原来的GUI对象。如果选入一个非法的对象将会引起异常。在使用完后应该恢复原来的对象,这一点特别重要,如果保存一个临时对象在DC中,而在临时对象被销毁后可能引起异常。有一点必须注意,每一个对象在重新创建前必须销毁,下面的代码演示了这一种安全的使用方法:
OnDraw(CDC* pDC) { CPen pen1,pen2;
pen1.CreatePen(PS_SOLID,2,RGB(128,128,128));//创建对象
pen2.CreatePen(PS_SOLID,2,RGB(128,128,0));//创建对象 CPen*
pPenOld=(CPen*)pDC->SelectObject(&pen1);//选择对象进DC drawWithPen1…
(CPen*)pDC->SelectObject(&pen2);//选择对象进DC drawWithPen2…
pen1.DeleteObject();//再次创建前先销毁 pen1.CreatePen(PS_SOLID,2,RGB(0,0,0));//再次创建对象
(CPen*)pDC->SelectObject(&pen1);//选择对象进DC drawWithPen1…
pDC->SelectObject(pOldPen);//恢复 }
此外系统中还拥有一些库存GUI对象,你可以利用CDC::SelectStockObject(SelectStockObject( int nIndex
)选入这些对象,它们包括一些固定颜色的刷子,画笔和一些基本字体。 BLACK_BRUSH Black brush. DKGRAY_BRUSH Dark
gray brush. GRAY_BRUSH Gray brush. HOLLOW_BRUSH Hollow brush.
LTGRAY_BRUSH Light gray brush. NULL_BRUSH Null brush. WHITE_BRUSH White
brush. BLACK_PEN Black pen. NULL_PEN Null pen. WHITE_PEN White pen.
ANSI_FIXED_FONT ANSI fixed system font. ANSI_VAR_FONT ANSI variable system
font. DEVICE_DEFAULT_FONT Device-dependent font. OEM_FIXED_FONT
OEM-dependent fixed font. SYSTEM_FONT The system font.By default, Windows
uses the system font to draw menus, dialog-box controls, and other text.In
Windows versions 3.0 and later, the system font is proportional width; earlier
versions of Windows use a fixed-width system font. SYSTEM_FIXED_FONT The
fixed-width system font used in Windows prior to version 3.0.This object is
available for compatibility with earlier versions of Windows. DEFAULT_PALETTE
Default color palette.This palette consists of the 20 static colors in the
system palette.这些对象留在DC中是安全的,所以你可以利用选入库存对象来作为恢复DC中GUI对象。
大家可能都注意到了绘图时都需要一个DC对象,DC(Device
Context设备环境)对象是一个抽象的作图环境,可能是对应屏幕,也可能是对应打印机或其它。这个环境是设备无关的,所以你在对不同的设备输出时只需要使用不同的设备环境就行了,而作图方式可以完全不变。这也就是Windows耀眼的一点设备无关性。如同你将对一幅画使用照相机或复印机将会产生不同的输出,而不需要对画进行任何调整。DC的使用会穿插在本章中进行介绍。
2.2 在窗口中输出文字
在这里我假定读者已经利用ApplicationWizard生成了一个SDI界面的程序代码。接下来的你只需要在CView派生类的OnDraw成员函数中加入绘图代码就可以了。在这里我需要解释一下OnDraw函数的作用,OnDraw函数会在窗口需要重绘时自动被调用,传入的参数CDC*
pDC对应的就是DC环境。使用OnDraw的优点就在于在你使用打印功能的时候传入OnDraw的DC环境将会是打印机绘图环境,使用打印预览时传入的是一个称为CPreviewDC的绘图环境,所以你只需要一份代码就可以完成窗口/打印预览/打印机绘图三重功能。利用Windows的设备无关性和M$为打印预览所编写的上千行代码你可以很容易的完成一个具有所见即所得的软件。
输出文字一般使用CDC::BOOL TextOut( int x, int y, const CString& str )和CDC::int
DrawText( const CString& str, LPRECT lpRect, UINT nFormat
)两个函数,对TextOut来讲只能输出单行的文字,而DrawText可以指定在一个矩形中输出单行或多行文字,并且可以规定对齐方式和使用何种风格。nFormat可以是多种以下标记的组合(利用位或操作)以达到选择输出风格的目的。
DT_BOTTOM底部对齐 Specifies bottom-justified text.This value must be combined
with DT_SINGLELINE. DT_CALCRECT计算指定文字时所需要矩形尺寸 Determines the width and height
of the rectangle.If there are multiple lines of text, DrawText will use the
width of the rectangle pointed to by lpRect and extend the base of the
rectangle to bound the last line of text.If there is only one line of text,
DrawText will modify the right side of the rectangle so that it bounds the last
character in the line.In either case, DrawText returns the height of the
formatted text, but does not draw the text. DT_CENTER中部对齐 Centers text
horizontally. DT_END_ELLIPSIS or DT_PATH_ELLIPSIS Replaces part of the given
string with ellipses, if necessary, so that the result fits in the specified
rectangle.The given string is not modified unless the DT_MODIFYSTRING flag is
specified.You can specify DT_END_ELLIPSIS to replace characters at the end of
the string, or DT_PATH_ELLIPSIS to replace characters in the middle of the
string.If the string contains backslash (\) characters, DT_PATH_ELLIPSIS
preserves as much as possible of the text after the last backslash.
DT_EXPANDTABS Expands tab characters.The default number of characters per tab
is eight. DT_EXTERNALLEADING Includes the font抯 external leading in the line
height.Normally, external leading is not included in the height of a line of
text. DT_LEFT左对齐 Aligns text flush-left. DT_MODIFYSTRING Modifies the given
string to match the displayed text.This flag has no effect unless the
DT_END_ELLIPSIS or DT_PATH_ELLIPSIS flag is specified.Note Some uFormat flag
combinations can cause the passed string to be modified.Using DT_MODIFYSTRING
with either DT_END_ELLIPSIS or DT_PATH_ELLIPSIS may cause the string to be
modified, causing an assertion in the CString override. DT_NOCLIP Draws
without clipping.DrawText is somewhat faster when DT_NOCLIP is used.
DT_NOPREFIX禁止使用&前缀 Turns off processing of prefix characters.Normally,
DrawText interprets the ampersand (&) mnemonic-prefix character as a directive
to underscore the character that follows, and the two-ampersand (&&)
mnemonic-prefix characters as a directive to print a single ampersand.By
specifying DT_NOPREFIX, this processing is turned off. DT_PATH_ELLIPSIS
DT_RIGHT右对齐 Aligns text flush-right. DT_SINGLELINE单行输出 Specifies single line
only.Carriage returns and linefeeds do not break the line.
DT_TABSTOP设置TAB字符所占宽度 Sets tab stops.The high-order byte of nFormat is the
number of characters for each tab.The default number of characters per tab is
eight. DT_TOP定部对齐 Specifies top-justified text (single line only).
DT_VCENTER中部对齐 Specifies vertically centered text (single line only).
DT_WORDBREAK每行只在单词间被折行 Specifies word-breaking.Lines are automatically broken
between words if a word would extend past the edge of the rectangle specified
by lpRect.A carriage return杔inefeed sequence will also break the line.
在输出文字时如果希望改变文字的颜色,你可以利用CDC::SetTextColor( COLORREF crColor
)进行设置,如果你希望改变背景色就利用CDC::SetBkColor( COLORREF crColor
),很多时候你可能需要透明的背景色你可以利用CDC::SetBkMode( int nBkMode )设置,可接受的参数有 OPAQUE
Background is filled with the current background color before the text, hatched
brush, or pen is drawn.This is the default background mode. TRANSPARENT
Background is not changed before drawing.
接下来讲讲如何创建字体,你可以创建的字体有两种:库存字体CDC::CreateStockObject( int nIndex )和自定义字体。
在创建非库存字体时需要填充一个LOGFONT结构并使用CFont::CreateFontIndirect(const LOGFONT* lpLogFont
),或使用CFont::CreateFont( int nHeight, int nWidth, int nEscapement, int
nOrientation, int nWeight, BYTE bItalic, BYTE bUnderline, BYTE cStrikeOut, BYTE
nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE
nPitchAndFamily, LPCTSTR lpszFacename )其中的参数和LOGFONT中的分量有一定的对应关系。下面分别讲解参数的意义:
nHeight 字体高度(逻辑单位)等于零为缺省高度,否则取绝对值并和可用的字体高度进行匹配。 nWidth
宽度(逻辑单位)如果为零则使用可用的横纵比进行匹配。 nEscapement 出口矢量与X轴间的角度 nOrientation 字体基线与X轴间的角度
nWeight 字体粗细,可取以下值 Constant Value FW_DONTCARE 0 FW_THIN 100 FW_EXTRALIGHT 200
FW_ULTRALIGHT 200 FW_LIGHT 300 FW_NORMAL 400 FW_REGULAR 400 FW_MEDIUM 500
FW_SEMIBOLD 600 FW_DEMIBOLD 600 FW_BOLD 700 FW_EXTRABOLD 800 FW_ULTRABOLD 800
FW_BLACK 900 FW_HEAVY 900 bItalic 是否为斜体 bUnderline 是否有下划线 cStrikeOut 是否带删除线
nCharSet 指定字符集合,可取以下值 Constant Value ANSI_CHARSET 0 DEFAULT_CHARSET 1
SYMBOL_CHARSET 2 SHIFTJIS_CHARSET 128 OEM_CHARSET 255 nOutPrecision 输出精度
OUT_CHARACTER_PRECIS OUT_STRING_PRECIS OUT_DEFAULT_PRECIS OUT_STROKE_PRECIS
OUT_DEVICE_PRECIS OUT_TT_PRECIS OUT_RASTER_PRECIS nClipPrecision 剪辑精度,可取以下值
CLIP_CHARACTER_PRECIS CLIP_MASK CLIP_DEFAULT_PRECIS CLIP_STROKE_PRECIS
CLIP_ENCAPSULATE CLIP_TT_ALWAYS CLIP_LH_ANGLES nQuality 输出质量,可取以下值
DEFAULT_QUALITY Appearance of the font does not matter. DRAFT_QUALITY
Appearance of the font is less important than when PROOF_QUALITY is used.For
GDI raster fonts, scaling is enabled.Bold, italic, underline, and strikeout
fonts are synthesized if necessary. PROOF_QUALITY Character quality of the
font is more important than exact matching of the logical-font attributes.For
GDI raster fonts, scaling is disabled and the font closest in size is chosen.
Bold, italic, underline, and strikeout fonts are synthesized if necessary.
nPitchAndFamily 字体间的间距 lpszFacename 指定字体名称,为了得到系统所拥有的字体可以利用EmunFontFamiliesEx。
此外可以利用CFontDialog来得到用户选择的字体的LOGFONT数据。 最后我讲一下文本坐标的计算,利用CDC::GetTextExtent(
const CString& str
)可以得到字符串的在输出时所占用的宽度和高度,这样就可以在手工输出多行文字时使用正确的行距。另外如果需要更精确的对字体高度和宽度进行计算就需要使用CDC::GetTextMetrics(
LPTEXTMETRIC lpMetrics ) 该函数将会填充TEXTMETRIC结构,该结构中的分量可以非常精确的描述字体的各种属性。 2.3
使用点,刷子,笔进行绘图 在Windows中画点的方法很简单,只需要调用COLORREF CDC::SetPixel( int x, int y,
COLORREF crColor )就可以在指定点画上指定颜色,同时返回原来的颜色。COLORREF CDC::GetPixel( int x, int
y)可以得到指定点的颜色。在Windows中应该少使用画点的函数,因为这样做的执行效率比较低。
刷子和画笔在Windows作图中是使用最多的GUI对象,本节在讲解刷子和画笔使用方法的同时也讲述一写基本作图函数。
在画点或画线时系统使用当前DC中的画笔,所以在创建画笔后必须将其选入DC才会在绘图时产生效果。画笔可以通过CPen对象来产生,通过调用CPen::CreatePen(
int nPenStyle, int nWidth, COLORREF crColor )来创建。其中nPenStyle指名画笔的风格,可取如下值:
PS_SOLID 实线 Creates a solid pen. PS_DASH 虚线,宽度必须为一 Creates a dashed pen.
Valid only when the pen width is 1 or less, in device units. PS_DOT 点线,宽度必须为一
Creates a dotted pen.Valid only when the pen width is 1 or less, in device
units. PS_DASHDOT 点划线,宽度必须为一 Creates a pen with alternating dashes and dots.
Valid only when the pen width is 1 or less, in device units. PS_DASHDOTDOT
双点划线,宽度必须为一 Creates a pen with alternating dashes and double dots.Valid only
when the pen width is 1 or less, in device units. PS_NULL 空线,使用时什么也不会产生
Creates a null pen. PS_ENDCAP_ROUND 结束处为圆形 End caps are round.
PS_ENDCAP_SQUARE 结束处为方形 End caps are square.nWidth和crColor为线的宽度和颜色。
刷子是在画封闭曲线时用来填充的颜色,例如当你画圆形或方形时系统会用当前的刷子对内部进行填充。刷子可利用CBrush对象产生。通过以下几种函数创建刷子:
BOOL CreateSolidBrush( COLORREF crColor ); 创建一种固定颜色的刷子 BOOL CreateHatchBrush(
int nIndex, COLORREF crColor ); 创建指定颜色和网格的刷子,nIndex可取以下值: HS_BDIAGONAL
Downward hatch (left to right) at 45 degrees HS_CROSS Horizontal and vertical
crosshatch HS_DIAGCROSS Crosshatch at 45 degrees HS_FDIAGONAL Upward hatch
(left to right) at 45 degrees HS_HORIZONTAL Horizontal hatch HS_VERTICAL
Vertical hatch BOOL CreatePatternBrush( CBitmap* pBitmap ); 创建以8*8位图为模板的刷子
在选择了画笔和刷子后就可以利用Windows的作图函数进行作图了,基本的画线函数有以下几种 CDC::MoveTo( int x, int y );
改变当前点的位置 CDC::LineTo( int x, int y ); 画一条由当前点到参数指定点的线 CDC::BOOL Arc(
LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 画弧线 CDC::BOOL Polyline( LPPOINT
lpPoints, int nCount ); 将多条线依次序连接 基本的作图函数有以下几种: CDC::BOOL Rectangle( LPCRECT
lpRect ); 矩形 CDC::RoundRect( LPCRECT lpRect, POINT point ); 圆角矩形
CDC::Draw3dRect( int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF
clrBottomRight ); 3D边框 CDC::Chord( LPCRECT lpRect, POINT ptStart, POINT ptEnd
); 扇形 CDC::Ellipse( LPCRECT lpRect ); 椭圆形 CDC::Pie( LPCRECT lpRect, POINT
ptStart, POINT ptEnd ); CDC::Polygon( LPPOINT lpPoints, int nCount ); 多边形
对于矩形,圆形或类似的封闭曲线,系统会使用画笔绘制边缘,使用刷子填充内部。如果你不希望填充或是画出边缘,你可以选入空刷子(NULL_PEN)或是(NULL_BRUSH)空笔。
下面的代码创建一条两象素宽的实线并选入DC。并进行简单的作图:{…CPen pen;
pen.CreatePen(PS_SOLID,2,RGB(128,128,128)); CPen*
pOldPen=(CPen*)dc.SelectObject(&pen); dc.SelectStockObject(NULL_BRUSH);//选入空刷子
dc.Rectangle(CRect(0,0,20,20));//画矩形…} 2.4 在窗口中绘制设备相关位图,图标,设备无关位图
在Windows中可以将预先准备好的图像复制到显示区域中,这种内存拷贝执行起来是非常快的。在Windows中提供了两种使用图形拷贝的方法:通过设备相关位图(DDB)和设备无关位图(DIB)。
DDB可以用MFC中的CBitmap来表示,而DDB一般是存储在资源文件中,在加载时只需要通过资源ID号就可以将图形装入。BOOL
CBitmap::LoadBitmap( UINT nIDResource
)可以装入指定DDB,但是在绘制时必须借助另一个和当前绘图DC兼容的内存DC来进行。通过CDC::BitBlt( int x, int y, int
nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop
)绘制图形,同时指定光栅操作的类型。BitBlt可以将源DC中位图复制到目的DC中,其中前四个参数为目的区域的坐标,接下来是源DC指针,然后是源DC中的起始坐标,由于BitBlt为等比例复制,所以不需要再次指定长宽,(StretchBlt可以进行缩放)最后一个参数为光栅操作的类型,可取以下值:
BLACKNESS 输出区域为黑色 Turns all output black. DSTINVERT 反色输出区域 Inverts the
destination bitmap. MERGECOPY 在源和目的间使用AND操作 Combines the pattern and the
source bitmap using the Boolean AND operator. MERGEPAINT 在反色后的目的和源间使用OR操作
Combines the inverted source bitmap with the destination bitmap using the
Boolean OR operator. NOTSRCCOPY 将反色后的源拷贝到目的区 Copies the inverted source
bitmap to the destination. PATINVERT 源和目的间进行XOR操作 Combines the destination
bitmap with the pattern using the Boolean XOR operator. SRCAND 源和目的间进行AND操作
Combines pixels of the destination and source bitmaps using the Boolean AND
operator. SRCCOPY 复制源到目的区 Copies the source bitmap to the destination bitmap.
SRCINVERT 源和目的间进行XOR操作 Combines pixels of the destination and source bitmaps
using the Boolean XOR operator. SRCPAINT 源和目的间进行OR操作 Combines pixels of the
destination and source bitmaps using the Boolean OR operator. WHITENESS
输出区域为白色 Turns all output white.下面用代码演示这种方法:CYourView::OnDraw(CDC* pDC) { CDC
memDC;//定义一个兼容DC memDC.CreateCompatibleDC(pDC);//创建DC CBitmap bmpDraw;
bmpDraw.LoadBitmap(ID_BMP) ;//装入DDB CBitmap*
pbmpOld=memDC.SelectObject(&bmpDraw) ;//保存原有DDB,并选入新DDB入DC
pDC->BitBlt(0,0,20,20,&memDC,0,0,SRCCOPY) ;
//将源DC中(0,0,20,20)复制到目的DC(0,0,20,20)
pDC->BitBlt(20,20,40,40,&memDC,0,0,SRCAND);
//将源DC中(0,0,20,20)和目的DC(20,20,40,40)中区域进行AND操作 memDC.SelectObject(pbmpOld)
;//选入原DDB } (图标并不是一个GDI对象,所以不需要选入DC)在MFC中没有一个专门的图标类,因为图标的操作比较简单,使用HICON
CWinApp::LoadIcon( UINT nIDResource )或是HICON CWinApp::LoadStandardIcon( LPCTSTR
lpszIconName ) 装入后就可以利用BOOL CDC::DrawIcon( int x, int y, HICON hIcon
)绘制。由于在图标中可以指定透明区域,所以在某些需要使用非规则图形而且面积不大的时候使用图标会比较简单。下面给出简单的代码:OnDraw(CDC* pDC)
{ HICON hIcon1=AfxGetApp()->LoadIcon(IDI_I1); HICON
hIcon2=AfxGetApp()->LoadIcon(IDI_I2); pDC->DrawIcon(0,0,hIcon1);
pDC->DrawIcon(0,40,hIcon2); DestroyIcon(hIcon1); DestroyIcon(hIcon2); }
同样在MFC也没有提供一个DIB的类,所以在使用DIB位图时我们需要自己读取位图文件中的头信息,并读入数据,并利用API函数StretchDIBits绘制。位图文件以BITMAPFILEHEADER结构开始,然后是BITMAPINFOHEADER结构和调色版信息和数据,其实位图格式是图形格式中最简单的一种,而且也是Windows可以理解的一种。我不详细讲解DIB位图的结构,提供一个CDib类供大家使用,这个类包含了基本的功能如:Load,Save,Draw。DownLoad
CDib 4K 2.5 使用各种映射方式
所谓的映射方式简单点讲就是坐标的安排方式,系统默认的映射方式为MM_TEXT即X坐标向右增加,Y坐标向下增加,(0,0)在屏幕左上方,DC中的每一点就是屏幕上的一个象素。也许你会认为这种方式下是最好理解的,但是一个点和象素对应的关系在屏幕上看来是正常的,但到了打印机上就会很不正常。因为我们作图是以点为单位并且打印机的分辨率远远比显示器高(800DPI
800点每英寸)所以在打印机上图形看起来就会很小。这样就需要为打印另做一套代码而加大了工作量。如果每个点对应0.1毫米那么在屏幕上的图形就会和打印出来的图形一样大小。
通过int CDC::SetMapMode( int nMapMode )可以指定映射方式,可用的有以下几种: MM_HIENGLISH
每点对应0.001英寸 Each logical unit is converted to 0.001 inch.Positive x is to the
right; positive y is up. MM_HIMETRIC 每点对应0.001毫米 Each logical unit is
converted to 0.01 millimeter.Positive x is to the right; positive y is up.
MM_LOENGLISH 每点对应0.01英寸 Each logical unit is converted to 0.01 inch.Positive x
is to the right; positive y is up. MM_LOMETRIC 每点对应0.001毫米 Each logical unit
is converted to 0.1 millimeter.Positive x is to the right; positive y is up.
MM_TEXT 象素对应 Each logical unit is converted to 1 device pixel.Positive x is to
the right; positive y is down.
以上几种映射默认的原点在屏幕左上方。除MM_TEXT外都为X坐标向右增加,Y坐标向上增加,和自然坐标是一致的。所以在作图是要注意什么时候应该使用负坐标。而且以上的映射都是X-Y等比例的,即相同的长度在X,Y轴上显示的长度都是相同的。
DownLoad Sample 另外的一种映射方式为MM_ANISOTROPIC,这种方式可以规定不同的长宽比例。在设置这中映射方式后必须调用CSize
CDC::SetWindowExt( SIZE size )和CSize CDC::SetViewportExt( SIZE size
)来设定长宽比例。系统会根据两次设定的长宽的比值来确定长宽比例。下面给出一段代码比较映射前后的长宽比例:OnDraw(CDC* pDC) { CRect
rcC1(200,0,400,200); pDC->FillSolidRect(rcC1,RGB(0,0,255));
pDC->SetMapMode(MM_ANISOTROPIC ); CSize sizeO; sizeO=pDC->SetWindowExt(5,5);
TRACE(“winExt %d %d\n”,sizeO.cx,sizeO.cy); sizeO=pDC->SetViewportExt(5,10);
TRACE(“ViewExt %d %d\n”,sizeO.cx,sizeO.cy); CRect rcC(0,0,200,200);
pDC->FillSolidRect(rcC,RGB(0,128,0)); } 上面代码在映射后画出的图形将是一个长方形。 DownLoad Sample
最后讲讲视原点(viewport origin),你可以通过调用CPoint CDC::SetViewportOrg( POINT point
)重新设置原点的位置,这就相对于对坐标进行了位移。例如你将原点设置在(20,20)那么原来的(0,0)就变成了(-20,-20)。 2.6 多边形和剪贴区域
多边形也是一个GDI对象,同样遵守其他GDI对象的规则,只是通常都不将其选入DC中。在MFC中多边形有CRgn表示。多边形用来表示一个不同与矩形的区域,和矩形具有相似的操作。如:检测某点是否在内部,并操作等。此外还得到一个包含此多边形的最小矩形。下面介绍一下多边形类的成员函数:
CreateRectRgn 由矩形创建一个多边形 CreateEllipticRgn 由椭圆创建一个多边形 CreatePolygonRgn
创建一个有多个点围成的多边形 PtInRegion 某点是否在内部 CombineRgn 两个多边形相并 EqualRgn 两个多边形是否相等
在本节中讲演多边形的意义在于重新在窗口中作图时提高效率。因为引发窗口重绘的原因是某个区域失效,而失效的区域用多边形来表示。假设窗口大小为500*400当上方的另一个窗口从(0,0,10,10)移动到(20,20,30,30)这时(0,0,10,10)区域就失效了,而你只需要重绘这部分区域而不是所有区域,这样你程序的执行效率就会提高。
通过调用API函数int GetClipRgn( HDC hdc, HRGN
hrgn)就可以得到失效区域,但是一般用不着那么精确而只需得到包含该区域的最小矩形就可以了,所以可以利用int CDC::GetClipBox( LPRECT
lpRect )完成这一功能。 第三章 文档视结构 3.1 文档 视图 框架窗口间的关系和消息传送规律
在MFC中M$引入了文档-视结构的概念,文档相当于数据容器,视相当于查看数据的窗口或是和数据发生交互的窗口。(这一结构在MFC中的OLE,ODBC开发时又得到更多的拓展)因此一个完整的应用一般由四个类组成:CWinApp应用类,CFrameWnd窗口框架类,CDocument文档类,CView视类。(VC6中支持创建不带文档-视的应用)
在程序运行时CWinApp将创建一个CFrameWnd框架窗口实例,而框架窗口将创建文档模板,然后有文档模板创建文档实例和视实例,并将两者关联。一般来讲我们只需对文档和视进行操作,框架的各种行为已经被MFC安排好了而不需人为干预,这也是M$设计文档-视结构的本意,让我们将注意力放在完成任务上而从界面编写中解放出来。
在应用中一个视对应一个文档,但一个文档可以包含多个视。一个应用中只用一个框架窗口,对多文档界面来讲可能有多个MDI子窗口。每一个视都是一个子窗口,在单文档界面中父窗口即是框架窗口,在多文档界面中父窗口为MDI子窗口。一个多文档应用中可以包含多个文档模板,一个模板定义了一个文档和一个或多个视之间的对应关系。同一个文档可以属于多个模板,但一个模板中只允许定义一个文档。同样一个视也可以属于多个文档模板。(不知道我说清楚没有)
接下来看看如何在程序中得到各种对象的指针: 全局函数AfxGetApp可以得到CWinApp应用类指针
AfxGetApp()->m_pMainWnd为框架窗口指针 在框架窗口中:CFrameWnd::GetActiveDocument得到当前活动文档指针
在框架窗口中:CFrameWnd::GetActiveView得到当前活动视指针 在视中:CView::GetDocument得到对应的文档指针
在文档中:CDocument::GetFirstViewPosition,CDocument::GetNextView用来遍历所有和文档关联的视。
在文档中:CDocument::GetDocTemplate得到文档模板指针
在多文档界面中:CMDIFrameWnd::MDIGetActive得到当前活动的MDI子窗口
一般来讲用户输入消息(如菜单选择,鼠标,键盘等)会先发往视,如果视未处理则会发往框架窗口。所以定义消息映射时定义在视中就可以了,如果一个应用同时拥有多个视而当前活动视没有对消息进行处理则消息会发往框架窗口。
3.2 接收用户输入 在视中接收鼠标输入:
鼠标消息是我们常需要处理的消息,消息分为:鼠标移动,按钮按下/松开,双击。利用ClassWizard可以轻松的添加这几种消息映射,下面分别讲解每种消息的处理。
WM_MOUSEMOVE对应的函数为OnMouseMove( UINT nFlags, CPoint point
),nFlags表明了当前一些按键的消息,你可以通过”位与”操作进行检测。 MK_CONTROL Ctrl键是否被按下 Set if the CTRL
key is down. MK_LBUTTON 鼠标左键是否被按下 Set if the left mouse button is down.
MK_MBUTTON 鼠标中间键是否被按下 Set if the middle mouse button is down. MK_RBUTTON
鼠标右键是否被按下 Set if the right mouse button is down. MK_SHIFT Shift键是否被按下 Set if
the SHIFT key is down.point表示当前鼠标的设备坐标,坐标原点对应视左上角。
WM_LBUTTONDOWN/WM_RBUTTONDOWN(鼠标左/右键按下)对应的函数为OnLButtonDown/OnRButtonDown( UINT
nFlags, CPoint point )参数意义和OnMouseMove相同。
WM_LBUTTONUP/WM_RBUTTONUP(鼠标左/右键松开)对应的函数为OnLButtonUp/OnRButtonUp( UINT nFlags,
CPoint point )参数意义和OnMouseMove相同。
WM_LBUTTONDBLCLK/WM_RBUTTONDBLCLK(鼠标左/右键双击)对应的函数为OnLButtonDblClk/OnRButtonDblClk(
UINT nFlags, CPoint point )参数意义和OnMouseMove相同。 下面我用一段伪代码来讲解一下这些消息的用法:
代码的作用是用鼠标拉出一个矩形 global BOOL fDowned;//是否在拉动 global CPoint ptDown;//按下位置 global
CPoint ptUp;//松开位置 OnLButtonDown(UINT nFlags, CPoint point) { fDowned=TRUE;
ptUp=ptDown=point; DrawRect();…} OnMouseMove(UINT nFlags, CPoint point) {
if(fDowned) { DrawRect();//恢复上次所画的矩形 ptUp=point; DrawRect();//画新矩形 } }
OnLButtonUp(UINT nFlags, CPoint point) { if(fDowned) { DrawRect();//恢复上次所画的矩形
ptUp=point; DrawRect();//画新矩形 fDowned=FALSE; } } DrawRect()
{//以反色屏幕的方法画出ptDown,ptUp标记的矩形 CClientDC dc(this); MakeRect(ptDown,ptUp);
SetROP(NOT); Rect(); }
坐标间转换:在以上的函数中point参数对应的都是窗口的设备坐标,我们应该将设备坐标和逻辑坐标相区别,在图32_g1由于窗口使用了滚动条,所以传入的设备坐标是对应于当前窗口左上角的坐标,没有考虑是否滚动,而逻辑坐标必须考虑滚动后对应的坐标,所以我以黄线虚拟的表达一个逻辑坐标的区域。可以看得出同一点在滚动后的坐标值是不同的,这一规则同样适用于改变了映射方式的窗口,假设你将映射方式设置为每点为0.01毫米,那么设备坐标所对应的逻辑坐标也需要重新计算。进行这种转换需要写一段代码,所幸的是系统提供了进行转换的功能DC的DPtoLP,LPtoDP,下面给出代码完成由设备坐标到逻辑坐标的转换。
图32_g1 CPoint CYourView::FromDP(CPoint point) { CClientDC dc(this); CPoint
ptRet=point; dc.PrepareDC();//必须先准备DC,这在使用滚动时让DC重新计算坐标
//如果你作图设置了不同的映射方式,则在下面需要设置 dc.SetMapMode(…)//dc.DPtoLP(&ptRet);//DP->LP进行转换
return ptRet; }
在图32_g1中以蓝线标记的是屏幕区域,红线标记的客户区域。利用ScreenToClient,ClientToScreen可以将坐标在这两个区域间转换。
在视中接收键盘输入:
键盘消息有三个:键盘被按下/松开,输入字符。其中输入字符相当于直接得到用户输入的字符这在不需要处理按键细节时使用,而键盘被按下/松开在按键状态改变时发送。
WM_CHAR对应的函数为OnChar( UINT nChar, UINT nRepCnt, UINT nFlags
),其中nChar为被按下的字符,nRepCnt表明在长时间为松开时相当于的按键次数,nFlags中的不同位代表不同的含义,在这里一般不使用。
WM_KEYDOWN/WM_KEYUP所对应的函数为OnKeyDown/OnKeyUp( UINT nChar, UINT nRepCnt, UINT
nFlags )nChar代表按键的虚拟码值,如VK_ALT为ALT键,VK_CONTROL为Ctrl键。nFlags各位的含义如下:Value
Description 0 Scan code (OEM-dependent value).8 Extended key, such as a
function key or a key on the numeric keypad (1 if it is an extended key).90
Not used.112 Used internally by Windows.13 Context code (1 if the ALT key is
held down while the key is pressed; otherwise 0).14 Previous key state (1 if
the key is down before the call, 0 if the key is up).15 Transition state (1 if
the key is being released, 0 if the key is being pressed).3.3 使用菜单
利用菜单接受用户命令是一中很简单的交互方法,同时也是一种很有效的方法。通常菜单作为一中资源存储在文件中,因此我们可以在设计时就利用资源编辑器设计好一个菜单。关于使用VC设计菜单我就不再多讲了,但你在编写菜单时应该尽量在属性对话框的底部提示(Prompt)处输入文字,这虽然不是必要的,但MFC在有状态栏和工具条的情况下会使用该文字,文字的格式为”状态栏出说明\n工具条提示”。
图33_g1
我们要面临的任务是如何知道用户何时选择了菜单,他选的是什么菜单项。当用户选择了一个有效的菜单项时系统会向应用发送一个WM_COMMAND消息,在消息的参数中表明来源。在MFC中我们只需要进行一次映射,将某一菜单ID映射到一处理函数,图33_g2。在这里我们在CView的派生类中处理菜单消息,同时我对同一ID设置两个消息映射,接下来将这两种映射的作用。
图33_g2 ON_COMMAND 映射的作用为在用户选择该菜单时调用指定的处理函数。如:ON_COMMAND(IDM_COMMAND1,
OnCommand1)会使菜单被选择时调用OnCommand1成员函数。 ON_UPDATE_COMMAND_UI(IDM_COMMAND1,
OnUpdateCommand1)
映射的作用是在菜单被显示时通过调用指定的函数来进行确定其状态。在这个处理函数中你可以设置菜单的允许/禁止状态,其显示字符串是什么,是否在前面打钩。函数的参数为CCmdUI*
pCmdUI,CCmdUI是MFC专门为更新命令提供的一个类,你可以调用 Enable 设置允许/禁止状态 SetCheck 设置是否在前面打钩
SetText 设置文字
下面我讲解一个例子:我在CView派生类中有一个变量m_fSelected,并且在视中处理两个菜单的消息,当IDM_COMMAND1被选时,对m_fSelected进行逻辑非操作,当IDM_COMMAND2被选中时出一提示;同时IDM_COMMAND1根据m_fSelected决定菜单显示的文字和是否在前面打上检查符号,IDM_COMMAND2根据m_fSelected的值决定菜单的允许/禁止状态。下面是代码和说明:下载示例代码
17K void CMenuDView::OnCommand1() { m_fSelected=!m_fSelected; TRACE(“command1
selected\n”); } void CMenuDView::OnUpdateCommand1(CCmdUI* pCmdUI) {
pCmdUI->SetCheck(m_fSelected);//决定检查状态
pCmdUI->SetText(m_fSelected”当前被选中”:”当前未被选中”);//决定所显示的文字 } void
CMenuDView::OnUpdateCommand2(CCmdUI* pCmdUI) {//决定是否为允许
pCmdUI->Enable(m_fSelected); } void CMenuDView::OnCommand2() {//选中时给出提示
AfxMessageBox(“你选了command2”); }
接下来再讲一些通过代码操纵菜单的方法,在MFC中有一个类CMenu用来处理和菜单有关的功能。在生成一个CMenu对象时你需要从资源中装如菜单,通过调用BOOL
CMenu::LoadMenu( UINT nIDResource )进行装入,然后你就可以对菜单进行动态的修改,所涉及到的函数有: CMenu*
GetSubMenu( int nPos )
一位置得到子菜单的指针,因为一个CMenu对象只能表示一个弹出菜单,如果菜单中的某一项也为弹出菜单,就需要通过该函数获取指针。 BOOL
AppendMenu( UINT nFlags, UINT nIDNewItem=0, LPCTSTR lpszNewItem=NULL )
在末尾添加一项,nFlag为MF_SEPARATOR表示增加一个分隔条,这样其他两个参数将会被忽略;为MF_STRING表示添加一个菜单项uIDNewItem为该菜单的ID命令值;为MF_POPUP表示添加一个弹出菜单项,这时uIDNewItem为另一菜单的句柄HMENU。lpszNewItem为菜单文字说明。
BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem=0, LPCTSTR
lpszNewItem=NULL
)用于在指定位置插入一菜单,位置由变量nPosition指明。如果nFlags包含MF_BYPOSITION则表明插入在nPosition位置,如果包含MF_BYCOMMAND表示插入在命令ID为nPosition的菜单处。
BOOL ModifyMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem=0, LPCTSTR
lpszNewItem=NULL
)用于修改某一位置的菜单,如果nFlags包含MF_BYPOSITION则表明修改nPosition位置的菜单,如果包含MF_BYCOMMAND表示修改命令ID为nPosition处的菜单。
BOOL RemoveMenu( UINT nPosition, UINT nFlags
)用于删除某一位置的菜单。如果nFlags包含MF_BYPOSITION则表明删除nPosition位置的菜单,如果包含MF_BYCOMMAND表示删除命令ID为nPosition处的菜单。
BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp ) 和 BOOL
InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp
)可以添加一位图菜单,但这样的菜单在选中时只是反色显示,并不美观。
视图中是没有菜单的,在框架窗口中才有,所以只有用AfxGetApp()->m_pMainWnd->GetMenu()才能得到应用的菜单指针。
最后我讲一下如何在程序中弹出一个菜单,你必须先装入一个菜单资源,你必需得到一个弹出菜单的指针然后调用BOOL TrackPopupMenu( UINT
nFlags, int x, int y, CWnd* pWnd, LPCRECT lpRect=NULL
)弹出菜单,你需要指定(x,y)为菜单弹出的位置,pWnd为接收命令消息的窗口指针。下面有一段代码说明方法,下载示例代码
17K。当然为了处理消息你应该在pWnd指明的窗口中对菜单命令消息进行映射。 CMenu menu; menu.LoadMenu(IDR_POPUP);
CMenu* pM=menu.GetSubMenu(0); CPoint pt; GetCursorPos(&pt);
pM->TrackPopupMenu(TPM_LEFTALIGN,pt.x,pt.y,this);
另一种做法是通过CMenu::CreatePopupMenu()建立一个弹出菜单,然后使用TrackPopupMenu弹出菜单。使用CreatePopupMenu创建的菜单也可以将其作为一个弹出项添加另一个菜单中。下面的伪代码演示了如何创建一个弹出菜单并进行修改后弹出:
CMenu menu1,menu2; menu1.CreatePopupMenu menu1.InsertMenu(1)
menu1.InsertMenu(2) menu1.InsertMenu(3) menu2.CreatePopupMenu
menu2.AppendMenu(MF_POPUP,1,menu1.Detach()) 将弹出菜单加入 or InsertMenu…
menu2.InsertMenu(“string desc”); menu.TrackPopupMenu(…) 3.4 文档,视,框架之间相互作用
一般来说用户的输入/输出基本都是通过视进行,但一些例外的情况下可能需要和框架直接发生作用,而在多视的情况下如何在视之间传递数据。
在使用菜单时大家会发现当一个菜单没有进行映射处理时为禁止状态,在多视的情况下菜单的状态和处理映射是和当前活动视相联系的,这样MFC可以保证视能正确的接收到各种消息,但有时候也会产生不便。有一个解决办法就是在框架中对消息进行处理,这样也可以保证当前文档可以通过框架得到当前消息。
在用户进行输入后如何使视的状态得到更新?这个问题在一个文档对应一个视图时是不存在的,但是现在有一个文档对应了两个视图,当在一个视上进行了输入时如何保证另一个视也得到通知呢?MFC的做法是利用文档来处理的,因为文档管理着当前和它联系的视,由它来通知各个视是最合适的。让我们同时看两个函数:
void CView::OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint ) void
CDocument::UpdateAllViews( CView* pSender, LPARAM lHint=0L, CObject* pHint=NULL )
当文档的UpdateAllViews被调用时和此文档相关的所有视的OnUpdate都会被调用,而参数lHint和pHint都会被传递。这样一来发生改变视就可以通知其他的兄弟了。那么还有一个问题:如何在OnUpdate中知道是那个视图发生了改变呢,这就可以利用pHint参数,只要调用者将this指针赋值给参数就可以了,当然完全可以利用该参数传递更复杂的结构。
视的初始化,当一个文档被打开或是新建一个文档时视图的CView::OnInitialUpdate()会被调用,你可以通过重载该函数对视进行初始化,并在结束前调用父类的OnInitialUpdate,因为这样可以保证OnUpdate会被调用。
文档中内容的清除,当文档被关闭时(比如退出或是新建前上一个文档清除)void CDocument::DeleteContents
()会被调用,你可以通过重载该函数来进行清理工作。
在单文档结构中上面两点尤其重要,因为软件运行文档对象和视对象只会被产生并删除一次。所以应该将上面两点和C++对象构造和构析分清楚。
最后将一下文档模板(DocTemplate)的作用,文档模板分为两类单文档模板和多文档模板,分别由CSingleDocTemplate和CMultiDocTemplate表示,模板的作用在于记录文档,视,框架之间的对应关系。还有一点就是模板可以记录应用程序可以打开的文件的类型,当打开文件时会根据文档模板中的信息选择正确的文档和视。模板是一个比较抽想的概念,一般来说是不需要我们直接进行操作的。
当使用者通过视修改了数据时,应该调用GetDocument()->SetModifiedFlag(TRUE)通知文档数据已经被更新,这样在关闭文档时会自动询问用户是否保存数据。
好象这一节讲的有些乱,大家看后有什么想法和问题请在VCHelp论坛上留言,我会尽快回复并且会对本节内容重新整理和修改。 3.5 利用序列化进行文件读写
在很多应用中我们需要对数据进行保存,或是从介质上读取数据,这就涉及到文件的操作。我们可以利用各种文件存取方法完成这些工作,但MFC中也提供了一种读写文件的简单方法——”序列化”。序列化机制通过更高层次的接口功能向开发者提供了更利于使用和透明于字节流的文件操纵方法,举一个例来讲你可以将一个字串写入文件而不需要理会具体长度,读出时也是一样。你甚至可以对字符串数组进行操作。在MFC提供的可自动分配内存的类的支持下你可以更轻松的读/写数据。你也可以根据需要编写你自己的具有序列化功能的类。
序列化在最低的层次上应该被需要序列化的类支持,也就是说如果你需要对一个类进行序列化,那么这个类必须支持序列化。当通过序列化进行文件读写时你只需要该类的序列化函数就可以了。
怎样使类具有序列化功能呢?你需要以下的工作: 该类从CObject派生。 在类声明中包括DECLARE_SERIAL宏定义。
提供一个缺省的构造函数。 在类中实现Serialze函数 使用IMPLEMENT_SERIAL指明类名和版本号
下面的代码建立了一个简单身份证记录的类,同时也能够支持序列化。 in H struct strPID { char szName[10]; char
szID[16]; struct strPID* pNext; }; class CAllPID : public CObject { public:
DECLARE_SERIAL(CAllPID) CAllPID(); ~CAllPID(); public://序列化相关 struct strPID*
pHead;//其他的成员函数 void Serialize(CArchive& ar); }; in CPP
IMPLEMENT_SERIAL(CAllPID,CObject,1)//version is 1,版本用于读数据时的检测 void
CAllPID::Serialize(CArchive& ar) { int iTotal; if(ar.IsStoring()) {//保存数据
iTotal=GetTotalID();//得到链表中的记录数量 arr<26;i++) ar<<&(((BYTE*)pItem)+i);//写一个strPID中所有的数据 } } else {//读数据 ar>>iTotal; for(int
i=0;i26;j++) ar>>*(((BYTE*)pID)+j);//读一个strPID中所有的数据//修改链表 } } }
当然上面的代码很不完整,但已经可以说明问题。这样CAllPID就是一个可以支持序列化的类,并且可以根据记录的数量动态分配内存。在序列化中我们使用了CArchive类,该类用于在序列化时提供读写支持,它重载了<<和>>运算符号,并且提供Read和Write函数对数据进行读写。
下面看看如何在文档中使用序列化功能,你只需要修改文档类的Serialize(CArchive&
ar)函数,并调用各个进行序列化的类的Serial进行数据读写就可以了。当然你也可以在文档类的内部进行数据读写,下面的代码利用序列化功能读写数据:class
CYourDoc : public CDocument { void Serialize(CArchive& ar); CString m_szDesc;
CAllPID m_allPID;……} void CYourDoc::Serialize(CArchive& ar) { if
(ar.IsStoring()) {//由于CString对CArchive定义了<<和>>操作符号,所以可以直接利用>>和<m_szDesc;
} m_allPID.Serialize(ar);//调用数据类的序列化函数 3.6 MFC中所提供的各种视类介绍
MFC中提供了丰富的视类供开发者使用,下面对各个类进行介绍:CView类是最基本的视类只支持最基本的操作。
CScrollView类提供了滚动的功能,你可以利用void CScrollView::SetScrollSizes( int nMapMode, SIZE
sizeTotal, const SIZE& sizePage=sizeDefault, const SIZE& sizeLine=sizeDefault )设置滚动尺寸,和坐标映射模式。但是在绘图和接收用户输入时需要对坐标进行转换。请参见3.2 接收用户输入。
CFormView类提供用户在资源文件中定义界面的能力,并可以将子窗口和变量进行绑定。通过UpdateData函数让数据在变量和子窗口间交换。
CTreeView类利用TreeCtrl界面作为视界面,通过调用CTreeCtrl& CTreeView::GetTreeCtrl( )
const得到CTreeCtrl的引用。 CListView类利用ListCtrl界面作为视界面,通过调用CTreeCtrl&
CTreeView::GetTreeCtrl( ) const得到CListCtrl的引用。
CEditView类利用Edit接收用户输入,它具有输入框的一切功能。通过调用CEdit& CEditView::GetEditCtrl( )
const得到Edit&的引用。void CEditView::SetPrinterFont( CFont* pFont )可以设置打印字体。
CRichEditView类作为Rich Text
Edit(富文本输入)的视类,提供了可以按照格式显示文本的能力,在使用时需要CRichEditDoc的支持。 第四章 窗口控件 4.1 Button
按钮窗口(控件)在MFC中使用CButton表示,CButton包含了三种样式的按钮,Push Button,Check Box,Radio
Box。所以在利用CButton对象生成按钮窗口时需要指明按钮的风格。 创建按钮:BOOL CButton::Create( LPCTSTR
lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID
);其中lpszCaption是按钮上显示的文字,dwStyle为按钮风格,除了Windows风格可以使用外(如WS_CHILD|WS_VISUBLE|WS_BORDER)还有按钮专用的一些风格。
BS_AUTOCHECKBOX 检查框,按钮的状态会自动改变 Same as a check box, except that a check mark
appears in the check box when the user selects the box; the check mark
disappears the next time the user selects the box. BS_AUTORADIOBUTTON
圆形选择按钮,按钮的状态会自动改变 Same as a radio button, except that when the user selects it,
the button automatically highlights itself and removes the selection from any
other radio buttons with the same style in the same group. BS_AUTO3STATE
允许按钮有三种状态即:选中,未选中,未定 Same as a three-state check box, except that the box
changes its state when the user selects it. BS_CHECKBOX 检查框 Creates a small
square that has text displayed to its right (unless this style is combined with
the BS_LEFTTEXT style). BS_DEFPUSHBUTTON 默认普通按钮 Creates a button that has a
heavy black border.The user can select this button by pressing the ENTER key.
This style enables the user to quickly select the most likely option (the
default option). BS_LEFTTEXT 左对齐文字 When combined with a radio-button or
check-box style, the text appears on the left side of the radio button or check
box. BS_OWNERDRAW 自绘按钮 Creates an owner-drawn button.The framework calls the
DrawItem member function when a visual aspect of the button has changed.This
style must be set when using the CBitmapButton class. BS_PUSHBUTTON 普通按钮
Creates a pushbutton that posts a WM_COMMAND message to the owner window when
the user selects the button. BS_RADIOBUTTON 圆形选择按钮 Creates a small circle
that has text displayed to its right (unless this style is combined with the
BS_LEFTTEXT style).Radio buttons are usually used in groups of related but
mutually exclusive choices. BS_3STATE 允许按钮有三种状态即:选中,未选中,未定 Same as a check
box, except that the box can be dimmed as well as checked.The dimmed state
typically is used to show that a check box has been disabled.
rect为窗口所占据的矩形区域,pParentWnd为父窗口指针,nID为该窗口的ID值。
获取/改变按钮状态:对于检查按钮和圆形按钮可能有两种状态,选中和未选中,如果设置了BS_3STATE或BS_AUTO3STATE风格就可能出现第三种状态:未定,这时按钮显示灰色。通过调用int
CButton::GetCheck( ) 得到当前是否被选中,返回0:未选中,1:选中,2:未定。调用void CButton::SetCheck( int
nCheck );设置当前选中状态。 处理按钮消息:要处理按钮消息需要在父窗口中进行消息映射,映射宏为ON_BN_CLICKED( id, memberFxn
)id为按钮的ID值,就是创建时指定的nID值。处理函数原型为afx_msg void memberFxn( ); 4.2 Static Box
静态文本控件的功能比较简单,可作为显示字符串,图标,位图用。创建一个窗口可以使用成员函数:BOOL CStatic::Create( LPCTSTR
lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID=0xffff
); 其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对静态控件指明专门的风格。
SS_CENTER,SS_LEFT,SS_RIGHT 指明字符显示的对齐方式。 SS_GRAYRECT 显示一个灰色的矩形 SS_NOPREFIX
如果指明该风格,对于字符&将直接显示,否则&将作为转义符,&将不显示而在其后的字符将有下划线,如果需要直接显示&必须使用&&表示。 SS_BITMAP
显示位图 SS_ICON 显示图标 SS_CENTERIMAGE 图象居中显示
控制显示的文本利用成员函数SetWindowText/GetWindowText用于设置/得到当前显示的文本。
控制显示的图标利用成员函数SetIcon/GetIcon用于设置/得到当前显示的图标。
控制显示的位图利用成员函数SetBitmap/GetBitmap用于设置/得到当前显示的位图。下面一段代码演示如何创建一个显示位图的静态窗口并设置位图
CStatic* pstaDis=new CStatic;
pstaDis->Create(“”,WS_CHILD|WS_VISIBLE|SS_BITMAP|SSCENTERIMAGE,
CRect(0,0,40,40),pWnd,1); CBitmap bmpLoad; bmpLoad.LoadBitmap(IDB_TEST);
pstaDis->SetBitmap(bmpLoad.Detach()); 4.3 Edit Box
Edit窗口是用来接收用户输入最常用的一个控件。创建一个输入窗口可以使用成员函数:BOOL CEdit::Create( LPCTSTR lpszText,
DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID=0xffff );
其中dwStyle将指明该窗口的风格,除了子窗口常用的风格WS_CHILD,WS_VISIBLE外,你可以针对输入控件指明专门的风格。
ES_AUTOHSCROLL,ES_AUTOVSCROLL 指明输入文字超出显示范围时自动滚动。 ES_CENTER,ES_LEFT,ES_RIGHT
指定对齐方式 ES_MULTILINE 是否允许多行输入 ES_PASSWORD 是否为密码输入框,如果指明该风格则输入的文字显示为*
ES_READONLY 是否为只读 ES_UPPERCASE,ES_LOWERCASE 显示大写/小写字符
控制显示的文本利用成员函数SetWindowText/GetWindowText用于设置/得到当前显示的文本。
通过GetLimitText/SetLimitText可以得到/设置在输入框中输入的字符数量。 由于在输入时用户可能选择某一段文本,所以通过void
CEdit::GetSel( int& nStartChar, in



img

学生管理 mfc课设

建立一个默认的单文档应用程序采用多视图编写一个学生成绩管理系统。左侧为树视图,各级节点分别为学校名称、学院名称、专业名称;右侧为列表视图,显示学生的基本信息和成绩。
编程要求:设计一个学生成绩管理系统,要求能够实现学生成绩的录入、修改、查找、删除;按班级、专业统计成绩。
程序中左侧为树视图,显示学校、院系、专业等信息,可以动态添加。右侧为列表视图,显示被添加的学生的个人基本信息和各科成绩,可以动态添加。 要点分析:
在此程序中,当选中左侧树视图的某一专业节点时,右侧显示对应专业的学生成绩信息。并且采用序列化方式保存和读取学生信息。成功添加、修改、删除、查找某一学生的成绩信息时,弹出对话框提示成功,否则提示失败。并且不允许重复添加。
解题步骤:



img

精通MFC (光盘) 源代码

目录 第1章 面向对象编程 1.1 面向对象的基本概念 1.1.1 类和对象 1.1.2 封装、多态和继承 1.1.3 消息 1.2 面向对象的建模技术UML
1.2.1 类图 1.2.2 交互图 1.2.3 用例图 1.3 面向对象的C++语言 1.3.1 C++对象的内存布局 1.3.2 C++编程技术要点
1.4 小结 第2章 窗口 2.1 窗口结构 2.2 窗口类型 2.3 窗口关系 2.4 消息和消息处理 2.4.1 系统定义的消息 2.4.2
应用程序定义的消息 2.4.3 消息参数 2.4.4 消息队列 2.4.5 消息循列 2.4.6 窗口过程 2.5 窗口应用框架 2.6 小结 第3章
MFC简介 3.1 MFC的优势 3.2 MFC中的类 3.3 用MFC开发应用的基本方法 3.4 MFC中的窗口管理 3.4.1
C++窗口对象和Windows窗体之间的关系 3.4.2 创建窗口 3.4.3 销毁窗体 3.4.4 定位窗体 3.4.5 绘图 3.4.6 消息处理 3.5
小结 第4章 CObject类 4.1 概述 4.2 创建对象 4.2.1 直接构造 4.2.2 使用new操作符 4.3 诊断功能 4.3.1 Dump成员
4.3.2 AssertValid 4.4 运行时类信息 4.4.1 CRuntimeClass结构 4.4.2 添加运行时类信息 4.4.3
IsKindOf 4.5 动态创建 4.6 序列化 4.6.1 添加序列化支持 4.6.2 CArchive类 4.6.3 对象序列化实例 4.7 小结
第5章 MFC应用框架 5.1 应用程序对象和MFC类库的交互 5.2 应用程序的初始化 5.3 消息循环 5.4 空闲处理 5.5 应用程序的退出 5.6
CWinApp提供的其他服务 5.6.1 外壳程序注册 5.6.2 文件管理器拖放 5.6.3 跟踪最近使用的文档 5.7 小结 第6章 消息映射 6.1
基本概念 6.2 消息映射表 6.3 一般窗口消息的处理成员的定位 6.4 命令处理成员的定位 6.5 消息映射宏 6.5.1 窗口映射宏 6.5.2
命令映射宏 6.5.3 控制通知消息映射宏 6.5.4 通知消息映射宏 6.5.5 反射消息映射宏 6.6 小结 第7章 消息处理 7.1 处理标准窗口消息
7.1.1 处理WM_CREATE消息 7.1.2 处理WM_DESTROY消息 7.1.3 处理WM_NCDESTORY消息 7.1.4
处理WM_CLOSE消息 7.2 处理命令消息 7.3 处理反射消息 7.4 投递和发送消息 7.4.1 投递和发送消息的概念 7.4.2
postMessage函数 7.4.3 SendMessage函数 7.4.4 SendMessage 7.5
SendNotifymessage和SendMessageCallback 7.6 使用自定义命令 7.7 使用自定义窗口消息 7.8 使用登记消息 7.9
处理线程消息 7.10 跨进程处理消息 7.11 消息钩子 7.11.1 钩子和过滤器 7.11.2 钩子的类型和范围 7.11.3 安装和解除消息钩子
7.11.4 使用线程范围和钩子实例 7.11.5 使用全局钩子实例 7.12 小结 第8章 对话框 8.1 对话框的生存期 8.1.1 对话框的创建
8.1.2 对话框的初始化 8.1.3 对话框的消息处理 8.1.4 对话框的结束 8.2 数据交换和数据验证 8.3 使用通用对话框 8.3.1 基本用法
8.3.2 定制通用对话框 8.4 运行时修改对话框 8.5 作为子窗口的对话框 8.6 HTML对话框 8.6.1 HTML资源 8.6.2
让HTML全部可见 8.6.3 混合HTML元素和窗口控件设计对话框 8.6.4 HTML消息处理 8.6.5 HTML元素和对话框成员间的数据交换
8.6.6 导航 8.6.7 基于HTML对话框的实用实例 8.7 使用属性表 8.8 使用对话栏 8.8.1 创建 8.8.2 销毁 8.8.3
处理控件消息 8.8.4 访问对话栏成员 8.8.5 实例 8.9 小结 第9章 文档和视图 9.1 文档/视图结构 9.1.1 原理 9.1.2
为什么使用文档/视图结构 9.1.3 基于文档/视图结构的应用 9.2 文档/视图结构的创建 9.2.1 文档模板的创建 9.2.2 文档的创建 9.2.3
框架的创建 9.2.4 视图的创建 9.2.5 文档/视图的初始化 9.3 深入文档模板 9.3.1 文档模板管理器 9.3.2 文档模板的创建 9.3.3
管理文档 9.3.4 其他 9.4 文档对象 9.4.1 文档的初始化 9.4.2 保存文档 9.4.3 设置修改标志和保存修改 9.4.4 关闭文档
9.4.5 管理视图 9.4.6 文档的销毁 9.4.7 命令处理 9.4.8 文档的序列化 9.4.9 设计文档的成员 9.5 视图对象 9.5.1
视图的初始化 9.5.2 视图和文档间的数据交换 9.5.3 视图的绘制 9.5.4 视图的销毁 9.6 框架窗口 9.6.1 初始化 9.6.2
和文档的交互 9.6.3 和视图的交换 9.6.4 命令处理 9.6.5 确定视图大小 9.6.6 为框架添加其他子控件 9.7 打印 9.7.1
文档/视图框架中的打印流程 9.7.2 自定义打印 9.7.3 打印预览 9.8 小结 第10章 深入视图 10.1 拆分 10.1.1 视图的创建
10.1.2 拆分窗口的命令处理 10.1.3 对拆分子窗口的管理 10.1.4 绘制 10.2 流动和缩放 10.2.1 滚动 10.2.2 缩放视图
10.3 控件视图 10.4 窗体视图 10.5 基于HTML的视图——CDHtmlView 10.5.1 加载HTML 10.5.2 事件处理 10.5.3
在新的文档中打开HTML 10.6 小结 第11章 GDI绘图 11.1 GDI绘图的编程模型 11.1.1 逻辑空间和设备空间 11.1.2 设备上下文
11.1.3 GDI对象 11.1.4 坐标变量和坐标映射 11.2 绘制图形 11.2.1 画线 11.2.2 绘制矩形 11.2.3 绘制椭圆
11.2.4 绘制弧线 11.2.5 绘制多边形 11.2.6 绘制贝济埃样条 11.2.7 使用路径 11.2.8 填充 11.2.9 区域 11.3
使用图像 11.3.1 位图的结构 11.3.2 位图类型 11.3.3 图像初始化和销毁 11.3.4 从文件加载图像文件 11.3.5 将图像保存为文件
11.3.6 图像的显示、裁剪和缩放 11.3.7 图像处理 11.4 小结 第12章 GDI+绘图 12.1 GDI+编程模型 12.1.1 GDI+的组成
12.1.2 GDI+的功能 12.1.3 GDI+编程步骤 12.1.4 新增功能 12.2 绘制基数样条曲线 12.3 独立的路径对象 12.4
Alpha混合 12.4.1 在钢笔中应用Alpha混合 12.4.2 在画刷中应用Alpha混合 12.4.3 对图像应用Alpha混合 12.5 渐变
12.5.1 线性渐变 12.5.2 轨迹渐变 12.6 变换和矩形对象 12.7 使用图像 12.8 小结 第13章 进程和线程 13.1 基本理论
13.1.1 什么是进程 13.1.2 什么是线程 13.1.3 进程地址空间 13.1.4 线程的生命周期 13.2 创建子进程 13.3 虚拟内存管理
13.4 进程间内存共享 13.5 用户界面线程 13.5.1 创建 13.5.2 退出 13.5.3 线程间通信 13.6 辅助线程 13.6.1 创建
13.6.2 退出 13.6.3 线程间通信 13.7 线程安全措施 13.7.1 需要采取线程安全措施的对象 13.7.2 线程安全的实现 13.8 小结
第14章 动态链接库 14.1 简介 14.1.1 DLL的构成 14.1.2 到DLL的链接 14.1.3 DLL映射到进程空间 14.1.4
使用动态链接的好处 14.2 规则DLL创建及其使用 14.2.1 创建规则DLL 14.2.2 规则DLL的使用 14.2.3 输出全局变量 14.2.4
输出类 14.2.5 输出进程间共享的数据 14.3 进程状态、模块状态和线程状态 14.3.1 线程局部存储 14.3.2 模块状态 14.4
创建和使用扩展DLL 14.4.1 创建 14.4.2 使用 14.5 DLL中的资源 14.5.1 资源的名字和类型 14.5.2 确定定义资源的模块
14.5.3 在模块中查找、加载资源 14.5.4 枚举资源 14.5.5 修改可执行文件的资源 14.5.6 纯资源DLL 14.5.7 附属DLL
14.6 小结 第15章 COM组件编程 15.1 COM基础知识 15.1.1 COM中的接口 15.1.2 COM对象的线程模型 15.1.3
进程内组件和进程间组件 15.1.4 COM库 15.1.5 COMK 的功能复用 15.2 IUnknown接口在MFC中的实现 15.2.1 内部类
15.2.2 接口映射类 15.2.3 聚合的实现 15.3 类厂及其MFC实现 15.3.1 ColeObjectFactory类 15.3.2 全局类厂链
15.3.3 类厂的注册/反注册 15.3.4 类厂对象的创建 15.3.5 类厂对象创建COM对象 15.3.6 为CCmdTarget添加类厂支持
15.4 用MFC实现简单的COM组件 15.4.1 创建支持自动化的规则DLL 15.4.2 定义接口文件 15.4.3 实现被聚合的COM组件
15.4.4 实现包容组件 15.4.5 编译、注册COM组件 15.4.6 创建一个对话框应用 15.5 双重接口 15.5.1 调度表 15.5.2
COleDispatchImpl 15.5.3 m_xDispatch成员 15.5.4 输出IDispatch接口 15.5.5 双重接口的客户端
15.5.6 范例 15.6 可连接对象及其MFC实现 15.6.1 用CCmdTarget实现可连接对象 15.6.2 可连接对象的客户端 15.7
封送的应用:在线程间传递接口指针 15.8 小结 第16章.NET应用开发 16.1 C++托管扩展简介 16.1.1 什么是.NET平台 16.1.2
托管C++中的类型 16.1.3 托管C++的用途 16.1.4 为什么MFC应用添加托管支持 16.1.5 使用.NET类型 16.1.6
实例:创建手管类型 16.1.7 装箱:值类型到引用类型的转化 16.1.8 托管类型和非托管类型的混用 16.1.9 固定指针 16.2
常用的托管C++编程技能 16.2.1 声明托管类 16.2.2 声明值类型的托管类型 16.2.3 添加属性 16.2.4 定义及实现接口 16.2.5
托管数组 16.2.6 处理异常 16.2.7 定义和使用委托 16.2.8 创建对象 16.2.9 对象的序列化和反序列化 16.2.10
用ADO.NET访问数据库 16.2.11 断方和条件编译 16.3 具有双重接口功能的规则DLL 16.4 典型托管应用开发 16.4.1 控制台应用
16.4.2 类库应用 16.4.3 窗体应用 16.5 小结



img

77G 22套C语言 C++ 数据结构 程序设计视频课程合集 C…

VC++ MFC 经典教程-基础篇 1.CP_YourFirstWindowsProgram.mp4 10.MFC_GDI_画直线和曲线.mp4
11.MFC_GDI_画椭圆_多边形及其他形状.mp4 12.MFC_GDI_画笔和画刷.mp4 13.MFC_GDI_画文本和字体.mp4
14.MFC_GDI_备用对象和取消选定.mp4 15.MFC_Ruler.mp4 16.MFC_窗口滚动条.mp4 17.MFC_Accel.mp4
18.MFC_Accel(2).mp4 19.MFC_消息框.mp4 2.Windows_编程模型.mp4 20MFC_客户区鼠标消息.mp4
21.MFC_TicTac-1.mp4 22.MFC_TicTac-2.mp4 23.MFC_TicTac-3.mp4 24.MFC_鼠标滚轮.mp4
25.MFC_捕获鼠标.mp4 26.MFC_VisualKB-1.mp4 27.MFC_VisualKB-2.mp4 29.MFC_菜单.mp4
3.MFC_第一个MFC程序设计.mp4 30.MFC_CButton类.mp4 31.MFC_E_FontView-1.mp4
32.MFC_E_FontView-2.mp4 33.MFC_CEdit类.mp4 34.MFC_MyPad.mp4
35.MFC_对话框_静态文本_编辑框.mp4 36.MFC_对话框_访问控件_7种方法_A.mp4 37.MFC_对话框_访问控件_7种方法_B.mp4
38.MFC_对话框_访问控件_7种方法_C.mp4 39.MFC_对话框_复选框_单选钮.mp4 4.MFC_消息映射.mp4
40.MFC_模态对话框.mp4 41.MFC_非模态对话框.mp4 42.MFC_属性表.mp4 43.MFC_公用对话框.mp4
44.MFC_数组类-1.mp4 45.MFC_数组类-2.mp4 46.MFC_CArray.mp4 47.MFC_列表类.mp4
48.MFC_映射类.mp4 49.MFC_类型指针类.mp4 5.MFC_使用向导快速进行MFC程序设计.mp4 50.MFC_CFile.mp4
51.MFC_CArchive.mp4 52.MFC_四个对象四种方法.mp4 53.MFC_Ruler.mp4 54.MFC_Ruler.mp4
55.MFC_Ruler.mp4 56.MFC_SdiSquares.mp4 57.MFC_Scroll_Ruler.mp4
58.MFC_CHtmlView.mp4 59.MFC_CTreeView.mp4 6.MFC_字符集和TEXT宏.mp4
60.MFC_CListView.mp4 61.MFC_MdiSquares.mp4 62.MFC_动态拆分窗口.mp4 63.MFC_ToolBar.mp4
64.MFC_ToolBar_Ex13a.mp4 65.MFC_StatusBar.mp4 66.MFC_StatusBar_Ex13b.mp4
67.MFC_Rebar.mp4 68.MFC_EZPrint.mp4 69.MFC_Print_Bubble.mp4 7.MFC_建立应用程序.mp4
8.MFC_第一个MFC程序设计(不用向导).mp4 9.MFC_Windows_GDI_设备描述表类.mp4 数据结构与算法_C语言 01.swap.mp4
02.BubbleSort.mp4 03.SelecttionSort.mp4 04.顺序查找.mp4 05.C_DS_折半查找.mp4 06.递归.mp4
07递归算法_折半查找.mp4 08.Permutations.mp4 09.插入排序.mp4 10.快速排序.mp4 11.归并排序.mp4
12.顺序栈.mp4 13.顺序队列.mp4 14.链表的基本概念.mp4 15.单链表的基本运算.mp4 16.循环单链表.mp4 17.双向链表.mp4
18.链式栈.mp4 19.链式队列.mp4 20.基数排序.mp4 21.树.mp4 22.二叉树的存储表示与实现.mp4 23.二叉树的遍历.mp4
24.二叉查找树.mp4 25.红黑树.mp4 26.堆.mp4 27.堆排序.mp4 28.哈希表.mp4 29.图_邻接矩阵.mp4 30.邻接表.mp4
31.图_深度优先搜索.mp4 32.图_广度优先搜索.mp4 快速通过_计算机二级_C语言 dk2j_c_calloc.mp4
dk2j_c_fopen_fclose.mp4 dk2j_c_goto语句.mp4 dk2j_c_if语句.mp4
dk2j_c_main参数和文件复制.mp4 dk2j_c_malloc.mp4 dk2j_c_realloc.mp4 dk2j_c_全局变量.mp4
dk2j_c_关系运算和逻辑运算.mp4 dk2j_c_函数的存储分类.mp4 dk2j_c_变量.mp4 dk2j_c_字符IO.mp4
dk2j_c_字符串函数.mp4 dk2j_c_字符串数组.mp4 dk2j_c_字符串的输入和输出.mp4 dk2j_c_字符型数据.mp4
dk2j_c_实型数据.mp4 dk2j_c_局部变量.mp4 dk2j_c_常量.mp4 dk2j_c_库函数.mp4 dk2j_c_数据输入.mp4
dk2j_c_数据输出.mp4 dk2j_c_整型数据.mp4 dk2j_c_标识符.mp4 dk2j_c_程序设计的基本概念.mp4
dk2j_c_算术运算符.mp4 dk2j_c_自加自减逗号运算符.mp4 dk2j_c_赋值表达式.mp4 dk2j_c_赋值语句_复合语句_空语句.mp4
KRC0507_多维数组.mp4 lc_流定位.mp4 MCU51_位操作运算符.mp4 MCU51_分支控制.mp4 MCU51_循环控制.mp4
MCU51_编译预处理.mp4 MCU_51_一维数组.mp4 MCU_51_二维数组.mp4 MCU_51_函数概述.mp4 MCU_51_字符数组.mp4
MCU_51_局部变量和全局变量.mp4 MCU_51_指针_数组与字符串指针.mp4 MCU_51_指针与函数参数.mp4
MCU_51_指针变量和指针运算符.mp4 MCU_51_指针数组.mp4 MCU_51_结构.mp4 MCU_51_结构数组_结构与函数.mp4
MCU_51_联合.mp4 PonC_指针和数组-2.mp4 VSE_6_安装.mp4 VS_2008_速成版_下载和安装.mp4 大家可以学的C语言
ABG2C_Cpp_更强大的C.mp4 ABG2C_for_循环.mp4 ABG2C_两个预处理器指令.mp4 ABG2C_从何处入手.mp4
ABG2C_关系运算符.mp4 ABG2C_初识C语言.mp4 ABG2C_变量.mp4 ABG2C_字符串.mp4 ABG2C_字符和字符串函数.mp4
ABG2C_循环.mp4 ABG2C_数学函数.mp4 ABG2C_数学运算.mp4 ABG2C_更高级的运算符.mp4 ABG2C_注释.mp4
ABG2C_测试多个值.mp4 ABG2C_终止循环.mp4 ABG2C_表达式还能用来做什么.mp4 ABG2C_输入.mp4
ABG2C_输入和输出.mp4 ABG2C_输出.mp4 ABG2C_逻辑运算符.mp4 CppDS_BubbleSort.mp4
CppDS_折半查找.mp4 CppDS_顺序查找.mp4 C_DR_函数.mp4 dk2j_c_fopen_fclose.mp4
dk2j_c_malloc.mp4 dk2j_c_字符IO.mp4 MCU_51_一维数组.mp4 MCU_51_结构.mp4 PonC_指针和函数.mp4
PonC_指针和数组-1.mp4 PonC_指针和数组-2.mp4 VC++ MFC快速入门 001.MFC_应用程序类型.mp4
002.MFC_对话框_静态文本_编辑框.mp4 003.MFC_对话框_访问控件_7种方法_A.mp4
004.MFC_对话框_访问控件_7种方法_B.mp4 005.MFC_对话框_访问控件_7种方法_C.mp4 006.MFC_对话框_复选框_单选钮.mp4
007.MFC_ComboBox_ListBox.mp4 008.MFC_ScrollBar.mp4 009.MFC_Spin.mp4
010.MFC_Progress.mp4 011.MFC_Slider.mp4 012.MFC_ListControl.mp4
013.MFC_TreeControl.mp4 014.MFC_DateTimePicker.mp4 015.MFC_Menu.mp4
016.MFC_Toolbar16.mp4 017.MFC_Toolbar24.mp4 018.MFC_StatusBar.mp4
019.MFC_两种对话框.mp4 020.MFC_文件对话框.mp4 021.MFC_字体和颜色对话框.mp4 022.MFC_图片控件_动画控件.mp4
023.MFC_属性页控件.mp4 024.讲MFC_窗口指针.mp4 025.MFC_窗口操作.mp4 026.MFC_发送消息.mp4
027.MFC_映射消息.mp4 028.MFC_自定义消息.mp4 029.MFC_拦截消息.mp4 030.MFC_定时器.mp4
031.讲VDD_注册表.mp4 032.MFC_系统度量.mp4 033.MFC_注销_关机_重启.mp4 034.MFC_鼠标消息.mp4
035.MFC_拖动无边框窗体.mp4 036.MFC_模拟鼠标键盘消息.mp4 037..创建进程.mp4 038.打开进程_终止进程.mp4
039..TH_管道.mp4 040..TH_双管道.mp4 041.MFC_只运行一个实例.mp4 042.内存映射文件.mp4
043.内存映射_共享数据.mp4 044.枚举进程-1.mp4 045.枚举进程-2.mp4 046.枚举进程-3.mp4 047.枚举进程-4.mp4
048.MFC_进程和线程.mp4 049.MFC_创建线程.mp4 050.MFC_线程控制.mp4 051.MFC_线程同步.mp4
052.MFC_线程同步方法.mp4 053.MFC_缩放位图.mp4 054.MFC_画刷.mp4 055.MFC_GDIPlus.mp4
056.MFC_使用GDIPlus打开和保存图片.mp4 057.MFC_CFile.mp4 058.MFC_CFile_家族.mp4
059.MFC_DBAPI_简介.mp4 060.MFC_初始化_ADO.mp4 061._数据库连接.mp4
062.MFC_ADO_MSSQL_Select.mp4 063.MFC_MiniMS_1.mp4 064.MFC_MiniMS_2.mp4
065.MFC_MiniMS_3.mp4 066.WS_Socket_编程原理.mp4 067.WS_TCP_Socket.mp4
068.WS_TCP_Socket_Client.mp4 069.WS_UDP_Socket_Receiver.mp4
070.WS_UDP_Socket_Sender.mp4 071.MFC_抓取网页.mp4 072.MFC_HOOK.mp4
073.MFC_全局键盘钩子.mp4 074.MFC_PlaySound.mp4 075.MFC_MCI.mp4
076.MFC_MCI_MP3_Player_1.mp4 077.MFC_MCI_MP3_Player_2.mp4 078.MFC_框架结构剖析.mp4
079.MFC_第一个MFC程序设计.mp4 080.MFC_消息映射.mp4 081.MFC_使用向导快速进行MFC程序设计.mp4
082.MFC_建立应用程序.mp4 083.MFC_第一个MFC程序设计(不用向导).mp4 084.在窗口中显示按钮.mp4
085.MFC_InnoSetup.mp4 C语言高级教程-指针和结构体 01.PonC_指针-1.mp4 02.PonC_指针-2.mp4
03.PonC_指针实例.mp4 04.PonC_指针运算.mp4 05.PonC_指针和函数.mp4 06.dk2j_cpp_函数指针.mp4
07.PonC_转换表.mp4 08.PonC_指针和数组-1.mp4 09.PonC_指针和数组-2.mp4 10.PonC_字符串函数-1.mp4
11.PonC_字符串函数-2.mp4 12.PonC_字符串函数-3.mp4 13.C语言字符串的缺点.mp4 14.MCU_51_结构.mp4
15.MCU_51_结构数组_结构与函数.mp4 16.API_数据结构.mp4 17.时间信息.mp4 18.文件属性和时间.mp4 19.遍历目录.mp4
20.递归目录.mp4 21.系统信息.mp4 22.选择字体.mp4 23.LOGFONT.mp4 C++ 编程思想 第1卷 1.对象导言.mp4
10.友元.mp4 11.句柄类.mp4 12.初始化与清除_1.mp4 13.初始化与清除_2.mp4 14.函数重载.mp4 15.联合.mp4
16.默认参数.mp4 17.默认参数还是函数重载.mp4 18.常量_1.mp4 19.常量_2.mp4 2.FirstCpp.mp4
20.常量_3.mp4 21.常量_4.mp4 22.常量_5.mp4 23.常量_6.mp4 24.内联函数.mp4
25.带内联函数的Stash和Stack.mp4 26.改进的错误检查.mp4 27.访问函数.mp4 28.函数内部的静态变量.mp4
29.静态对象.mp4 3.SecondCpp.mp4 30.控制连接.mp4 31.名字空间_1.mp4 32.名字空间_2.mp4
33.静态成员_1.mp4 34.静态成员_2.mp4 35.单例模式.mp4 36.替代连接.mp4 37.引用.mp4 38.拷贝构造函数.mp4
39.运算符重载_1.mp4 4.函数要点和函数库.mp4 40.运算符重载_2.mp4 41.运算符重载_3.mp4 42.运算符重载_5.mp4
43.重载赋值操作符_1.mp4 44.重载赋值操作符_2.mp4 45.重载赋值操作符_3.mp4 46.自动类型转换.mp4 47.动态创建对象.mp4
48.delete_可能会出错.mp4 49.指针的Stash.mp4 5.CStash.mp4 50.继承语法.mp4 51.继承和组合.mp4
52.继承中的构造和析构.mp4 53.继承的其它要点.mp4 54.继承中的向上类型转换.mp4 55.再论继承和组合.mp4
56.多态性和虚函数_1.mp4 57.多态性和虚函数_2.mp4 58.多态性和虚函数_3.mp4 59.多态性和虚函数_4.mp4
6.CStashLib.mp4 60.多态性和虚函数_5.mp4 61.多态性和虚函数_6.mp4 62.模板语法.mp4 63.模板中的常量.mp4
64.简单的Stack模板.mp4 65.链表的Stack模板.mp4 66.打开和关闭所有权.mp4 67.模板化的指针Stash.mp4
68.迭代器简介_1.mp4 69.迭代器简介_2.mp4 7.Stash.mp4 70.迭代器简介_3.mp4 71.函数模板_1.mp4
8.Stack.mp4 9.访问控制.mp4



img

visual c++ 完全自学手册 古万荣 源代码

本书特色:涵盖基础知识、核心技术、典型示例等内容,按照”基本概念-核心语法-典型示例’的模式讲解,容易上手。提供100个典型实例、3个完整案例。 Visual
c++6.0(以下简称VC6.0)是微软精心打造的集成开发环境,使用VC6.0可以自由地开发MFc应用程序、Win32应用程序、DLL.组件和web服务程序等。VC6.0的核心是MFC库,本书着重介绍MFC库的原理和使用方法,循环渐进地讲解了MFC库的知识,从基本概念到具体实践、从理论本质到具体操作、从小型实例到大中型综合实例。在本书的各个知识点中,都会给出相应的实例进行知识点的巩固和提高,通过实践练习来消化知识点和相关应用。
本书的特点是详细介绍了使用VC6.0进行c++程序设计,从c++语言理论,至IJMFC库的使用和c0M组件等扩展知识的剖析,突出了理论严谨性和程序实用性。本书含有大量实例,详细描述实例开发过程和挖掘理论实践要点。
本书适合需要学习vc6.0进行应用程序开发的读者阅读,也可以作为开发人员的参考手册随时进行查阅。 第一篇 C++、VC6.0和应用程序框架基础 第1章
VC6.0开发环境和应用程序框架 第2章 C++语法基础第二篇 MFC基础 第3章 Windows消息映射 第4章 GDI函数 第5章 对话框 第6章 控件
第7章 Windows的基本输入 第8章 ActiveX控件第三篇 深入学习MFC 第9章 菜单和框架窗口 第10章 工具栏和状态栏 第11章
文档和视图的分离 第12章 文档的读和写 第13章 切分窗口和多视图 第14章 打印功能 第15章 上下文相关帮助 第16章 动态链接库(DLL) 第17章
MFC类家族第四篇 自动化、COM和OLE 第18章 自动化 第19章 组件对象模型(COM) 第20章 OLE DB第五篇 软件研发实践 第21章
数据库编程基础 第22章 数据库研发实践:家庭财务管理系统 第23章 网络编程基础 第24章 网络编程研发实践:即时通信软件 第25章
仿3D游戏开发:推箱子游戏



img

Visual C++程序设计教程与上机指导(PDF)

深入浅出地介绍了Visual C++编程技术的各个要点知识,首先介绍了Visual
C++开发环境,并概要性地介绍了基于MFC的应用程序,然后以实例的形式对图形和文本输出、对话框和Windows标准控件、菜单、工具栏、状态栏、文档视图、数据库、组件与ActiveX控件、动态链接库、多线程及网络等方面的知识进行了详细介绍,其中包括了Visual
C++程序设计的方法和技巧,读者能够直接引用,从中受益。



img

Visual C++ 2008入门经典–详细书签版

CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251
特别说明:该版本是目前网络上最全的版本:修正了268-367页缺页的问题。 Visual C++ 2008入门经典 基本信息 原书名:Ivor
Horton’s Beginning Visual C++ 2008 原出版社:Wrox 作者:(美)Ivor Horton 译者:姜玲玲 张云
出版社:清华大学出版社 ISBN:9787302194637 上架时间:2009-2-25 出版日期:2009 年2月 开本:16开 页码:1124
版次:1-1 编辑推荐   1.本书是C++编程方面最畅销的图书品种之一。.   2.本书是编程语言先驱者Ivor Horton的又一经典之作。   
3.本书早期版本曾影响着无数程序员。..   4.本书适用于想学习C++程序的初学者,学习本书内容无需任何编程基础。    5.本书不仅涵盖了Visual
C++ 2008编程知识,还全面介绍了标准C++语言和C++/CLI。 内容简介   本书系编程语言先驱者ivor
horton的经典之作,是c++编程方面最畅销的图书品种之一,不仅涵盖了visual c++
2008编程知识,还全面介绍了标准c++语言和c++/cli。本书延续了ivor horton讲解编程语言的独特方法,从中读者可以学习visual c++
2008的基础知识,了解如何使用mfc进行本地iso/ansi c++ windows应用程序开发以及如何使用windows forms进行c++/cli
windows应用程序开发,并全面掌握在mfc和windows
forms中访问数据源的技术。此外,本书各章后面的习题将有助于读者温故而知新,并尽快成为c++高效程序员。.   本书学习目标    ◆
使用标准模板库(stl)来组织和操作本地c++程序中的数据    ◆ c++程序调试技术..   ◆ 构造microsoft
windows应用程序的技术以及每个应用程序的基本元素    ◆ 创建和使用常用控件构建应用程序的图形用户界面    ◆ 使用mfc开发库    ◆
访问数据源的不同控件、控件的工作方式以及定制控件的方法    本书读者对象   
本书适用于想学习如何为windows操作系统编写c++程序的初学者,学习本书内容无需任何编程基础。…   本书源代码及习题答案下载   
http://www.wrox.com    http://www.tupwk.com.cn/downpage 作译者   Ivor
Horton是世界著名的计算机图书作家,主要从事与编程相关的咨询及撰写工作,曾帮助无数程序员步入编程的殿堂。他曾在IBM工作多年,能使用多种语言进行编程(在多种机器上使用汇编语言和高级语言),设计和实现了实时闭环工业控制系统。Horton拥有丰富的教学经验(教学内容包括C、C++、Fortran、PL/1、APL等),同时还是机械、加工和电子CAD系统、机械CAM系统和DNC/CNC系统方面的专家。IvorHorton还著有关于C、C++和Java的多部入门级好书,如《C语言入门经典(第4版)》和《C++入门经典(第3版)》。
目录 封面-19 前言-18 目录-10 第1章 使用Visual C++ 2008编程 1 1.1.NET Framework 1 1.2 CLR
2 1.3 编写C++应用程序 3 1.4 学习Windows编程 4 1.4.1 学习C++ 4 1.4.2 C++标准 5 1.4.3 属性 5
1.4.4 控制台应用程序 6 1.4.5 Windows编程概念 6 1.5 集成开发环境简介 8 1.6 使用IDE 9 1.6.1 工具栏选项 10
1.6.2 可停靠的工具栏 10 1.6.3 文档 11 1.6.4 项目和解决方案 11 1.6.5 设置Visual C++ 2008的选项 22
1.6.6 创建和执行Windows应用程序 23 1.6.7 创建Windows Forms应用程序 25 1.7 小结 27 第2章 数据、变量和计算
28 2.1 C++程序结构 28 2.1.1 程序注释 33 2.1.2 #include指令—— 头文件 34 2.1.3 命名空间和using声明 34
2.1.4 main()函数 35 2.1.5 程序语句 35 2.1.6 空白 37 2.1.7 语句块 37 2.1.8 自动生成的控制台程序 38
2.2 定义变量 39 2.2.1 命名变量 39 2.2.2 声明变量 40 2.2.3 变量的初值 41 2.3 基本数据类型 41 2.3.1 整型变量
42 2.3.2 字符数据类型 43 2.3.3 整型修饰符 44 2.3.4 布尔类型 44 2.3.5 浮点类型 45 2.3.6 字面值 46
2.3.7 定义数据类型的同义词 47 2.3.8 具有特定值集的变量 47 2.4 基本的输入/输出操作 48 2.4.1 从键盘输入 49 2.4.2
到命令行的输出 49 2.4.3 格式化输出 50 2.4.4 转义序列 51 2.5 C++中的计算 53 2.5.1 赋值语句 53 2.5.2 算术运算
53 2.5.3 计算余数 58 2.5.4 修改变量 58 2.5.5 增量和减量运算符 59 2.5.6 计算的顺序 61 2.6 变量类型和类型强制转换
62 2.6.1 对操作数进行类型强制转换的规则 63 2.6.2 赋值语句中的类型强制转换 64 2.6.3 显式类型强制转换 64 2.6.4
老式的类型强制转换 65 2.6.5 按位运算符 65 2.7 了解存储时间和作用域 71 2.7.1 自动变量 72 2.7.2 决定变量声明的位置 74
2.7.3 全局变量 74 2.7.4 静态变量 77 2.8 命名空间 78 2.8.1 声明命名空间 79 2.8.2 多个命名空间 80 2.9
C++/CLI编程 81 2.9.1 C++/CLI特有的基本数据类型 81 2.9.2 命令行上的C++/CLI输出 85 2.9.3
C++/CLI特有的功能——格式化输出 86 2.9.4 C++/CLI的键盘输入 88 2.9.5 使用safe_cast 90 2.9.6
C++/CLI枚举 90 2.10 小结 94 2.11 练习题 95 第3章 判断和循环 97 3.1 比较数据值 97 3.1.1 if语句 98
3.1.2 嵌套的if语句 99 3.1.3 扩展的if语句 101 3.1.4 嵌套的if-else语句 103 3.1.5 逻辑运算符和表达式 105
3.1.6 条件运算符 108 3.1.7 switch语句 109 3.1.8 无条件转移 111 3.2 重复执行语句块 112 3.2.1 循环的概念
112 3.2.2 for循环的变体 115 3.2.3 while循环 122 3.2.4 do-while循环 124 3.2.5 嵌套的循环 124
3.3 C++/CLI编程 127 3.4 小结 133 3.5 练习 133 第4章 数组、字符串和指针 134 4.1 处理多个相同类型的数据值 134
4.1.1 数组 135 4.1.2 声明数组 135 4.1.3 初始化数组 138 4.1.4 字符数组和字符串处理 139 4.1.5 多维数组 142
4.2 间接数据存取 145 4.2.1 指针的概念 145 4.2.2 声明指针 146 4.2.3 使用指针 147 4.2.4 初始化指针 149
4.2.5 sizeof运算符 154 4.2.6 常量指针和指向常量的指针 155 4.2.7 指针和数组 157 4.3 动态内存分配 163 4.3.1
堆的别名—— 自由存储器 164 4.3.2 new和delete运算符 164 4.3.3 为数组动态分配内存 165 4.3.4 多维数组的动态分配
167 4.4 使用引用 168 4.4.1 引用的概念 168 4.4.2 声明并初始化引用 168 4.5 字符串的本地C++库函数 169 4.5.1
查找以空字符结尾的字符串的长度 169 4.5.2 连接以空字符结尾的字符串 170 4.5.3 复制以空字符结尾的字符串 171 4.5.4
比较以空字符结尾的字符串 172 4.5.5 搜索以空字符结尾的字符串 173 4.6 C++/CLI编程 175 4.6.1 跟踪句柄 175 4.6.2
CLR数组 177 4.6.3 字符串 191 4.6.4 跟踪引用 199 4.6.5 内部指针 200 4.7 小结 202 4.8 练习 203 第5章
程序结构(1) 205 5.1 理解函数 205 5.1.1 需要函数的原因 206 5.1.2 函数的结构 206 5.1.3 使用函数 208 5.2
给函数传递实参 212 5.2.1 按值传递机制 212 5.2.2 给函数传递指针实参 214 5.2.3 给函数传递数组 215 5.2.4
给函数传递引用实参 219 5.2.5 使用const修饰符 221 5.2.6 main()函数的实参 222 5.2.7 接受数量不定的函数实参 224
5.3 从函数返回值 226 5.3.1 返回指针 226 5.3.2 返回引用 229 5.3.3 函数中的静态变量 231 5.4 递归函数调用 233
5.5 C++/CLI编程 235 5.5.1 接受数量可变实参的函数 236 5.5.2 main( )的实参 237 5.6 小结 238 5.7 练习
238 第6章 程序结构(2) 240 6.1 函数指针 240 6.1.1 声明函数指针 241 6.1.2 函数指针作为实参 243 6.1.3
函数指针的数组 245 6.2 初始化函数形参 245 6.3 异常 247 6.3.1 抛出异常 248 6.3.2 捕获异常 249 6.3.3
MFC中的异常处理 250 6.4 处理内存分配错误 251 6.5 函数重载 252 6.5.1 函数重载的概念 253 6.5.2 何时重载函数 255
6.6 函数模板 255 6.7 使用函数的示例 257 6.7.1 实现计算器 258 6.7.2 从字符串中删除空格 260 6.7.3 计算表达式的值
261 6.7.4 获得项值 263 6.7.5 分析数 264 6.7.6 整合程序 266 6.7.7 扩展程序 268 6.7.8 提取子字符串 269
6.7.9 运行修改过的程序 271 6.8 C++/CLI编程 271 6.8.1 理解泛型函数 272 6.8.2 CLR版本的计算器程序 277 6.9
小结 283 6.10 练习 283 第7章 自定义数据类型 285 7.1 C++中的结构 285 7.1.1 结构的概念 286 7.1.2 定义结构
286 7.1.3 初始化结构 286 7.1.4 访问结构的成员 287 7.1.5 伴随结构的智能帮助 290 7.1.6 RECT结构 291
7.1.7 使用指针处理结构 291 7.2 数据类型、对象、类和实例 293 7.2.1 类的起源 294 7.2.2 类的操作 295 7.2.3 术语
295 7.3 理解类 295 7.3.1 定义类 296 7.3.2 声明类的对象 296 7.3.3 访问类的数据成员 297 7.3.4 类的成员函数
299 7.3.5 成员函数定义的位置 300 7.3.6 内联函数 301 7.4 类构造函数 302 7.4.1 构造函数的概念 302 7.4.2
默认的构造函数 304 7.4.3 在类定义中指定默认的形参值 306 7.4.4 在构造函数中使用初始化列表 307 7.5 类的私有成员 308
7.5.1 访问私有类成员 310 7.5.2 类的友元函数 311 7.5.3 默认复制构造函数 313 7.6 this指针 315 7.7
类的const对象 317 7.7.1 类的const成员函数 318 7.7.2 类外部的成员函数定义 318 7.8 类对象的数组 319 7.9
类的静态成员 321 7.9.1 类的静态数据成员 321 7.9.2 类的静态函数成员 323 7.10 类对象的指针和引用 324 7.10.1
类对象的指针 324 7.10.2 类对象的引用 327 7.11 C++/CLI编程 328 7.11.1 定义数值类类型 329 7.11.2
定义引用类类型 333 7.11.3 定义引用类类型的复制构造函数 335 7.11.4 类属性 336 7.11.5 initonly字段 348
7.11.6 静态构造函数 349 7.12 小结 350 7.13 练习 351 第8章 深入理解类 352 8.1 类的析构函数 352 8.1.1
析构函数的概念 352 8.1.2 默认的析构函数 353 8.1.3 析构函数与动态内存分配 354 8.2 实现复制构造函数 357 8.3
在变量之间共享内存 359 8.3.1 定义联合 360 8.3.2 匿名联合 361 8.3.3 类和结构中的联合 361 8.4 运算符重载 362
8.6.2 实现重载的运算符 362 8.4.2 实现对运算符的完全支持 365 8.4.3 重载赋值运算符 368 8.4.4 重载加法运算符 372
8.4.5 重载递增和递减运算符 376 8.5 类模板 377 8.5.1 定义类模板 377 8.5.2 根据类模板创建对象 380 8.5.3
使用有多个形参的类模板 382 8.6 使用类 384 8.6.1 类接口的概念 384 8.6.2 定义问题 384 8.6.3 实现CBox类 385
8.6.4 使用CBox类 400 8.7 组织程序代码 403 8.8 字符串的本地C++库类 405 8.8.1 创建字符串对象 405 8.8.2
连接字符串 407 8.8.3 访问与修改字符串 410 8.8.4 比较字符串 414 8.8.5 搜索字符串 417 8.9 C++/CLI编程 425
8.9.1 在数值类中重载运算符 425 8.9.2 重载递增和递减运算符 430 8.9.3 在引用类中重载运算符 431 8.9.4
实现引用类型的赋值运算符 433 8.10 小结 434 8.11 练习 435 第9章 类继承和虚函数 436 9.1 面向对象编程的基本思想 436
9.2 类的继承 437 9.2.1 基类的概念 438 9.2.2 基类的派生类 438 9.3 继承机制下的访问控制 441 9.3.1
派生类中构造函数的操作 444 9.3.2 声明类的保护成员 447 9.3.3 继承类成员的访问级别 449 9.4 派生类中的复制构造函数 451 9.5
友元类成员 455 9.5.1 友元类 456 9.5.2 对类友元关系的限制 456 9.6 虚函数 456 9.6.1 虚函数的概念 459 9.6.2
使用指向类对象的指针 461 9.6.3 使用引用处理虚函数 462 9.6.4 纯虚函数 463 9.6.5 抽象类 464 9.6.6 间接基类 467
9.6.7 虚析构函数 469 9.7 类类型之间的强制转换 473 9.8 嵌套类 474 9.9 C++/CLI编程 477 9.9.1 装箱与拆箱
477 9.9.2 C++/CLI类的继承 478 9.9.3 接口类 483 9.9.4 定义接口类 484 9.9.5 类和程序集 487 9.9.6
被指定为new的函数 491 9.9.7 委托和事件 492 9.9.8 引用类的析构函数和终结器 503 9.9.9 通用类 505 9.10 小结 514
9.11 练习 515 第10章 标准模板库 518 10.1 标准模板库的定义 518 10.1.1 容器 518 10.1.2 容器适配器 519
10.1.3 迭代器 520 10.1.4 算法 521 10.1.5 函数对象 522 10.1.6 函数适配器 522 10.2 STL容器范围 522
10.3 序列容器 522 10.3.1 创建矢量容器 524 10.3.2 矢量容器的容量和大小 526 10.3.3 访问矢量中的元素 530
10.3.4 在矢量中插入和删除元素 531 10.3.5 在矢量中存储类对象 533 10.3.6 排序矢量元素 536 10.3.7 排序矢量中的指针
537 10.3.8 双端队列容器 539 10.3.9 使用列表容器 542 10.3.10 使用其他序列容器 551 10.4 关联容器 561
10.4.1 使用映射容器 561 10.4.2 使用多重映射容器 572 10.5 关于迭代器的更多内容 573 10.5.1 使用输入流迭代器 573
10.5.2 使用插入迭代器 576 10.5.3 使用输出流迭代器 577 10.6 关于函数对象的更多内容 579 10.7 关于算法的更多内容 580
10.7.1 fill() 581 10.7.2 replace() 581 10.7.3 find() 581 10.7.4 transform() 582
10.8 C++/CLI程序的STL 583 10.8.1 STL/CLR容器 583 10.8.2 使用序列容器 584 10.8.3 使用关联容器 591
10.9 小结 597 10.10 练习 597 第11章 调试技术 598 11.1 理解调试 598 11.1.1 程序故障 599 11.1.2
常见故障 600 11.2 基本的调试操作 601 11.2.1 设置断点 603 11.2.2 设置跟踪点 604 11.2.3 启动调试模式 605
11.2.4 修改变量的值 608 11.3 添加调试代码 609 11.3.1 使用断言 609 11.3.2 添加自己的调试代码 610 11.4
调试程序 615 11.4.1 调用堆栈 616 11.4.2 单步执行到出错位置 617 11.5 测试扩展的类 620 11.6 调试动态内存 623
11.6.1 检查自由存储器的函数 623 11.6.2 控制自由存储器的调试操作 624 11.6.3 自由存储器的调试输出 626 11.7
调试C++/CLI程序 630 11.7.1 使用调试和跟踪类 631 11.7.2 在Windows Forms应用程序中获得跟踪输出 638 11.8
小结 639 第12章 Windows编程的概念 640 12.1 Windows编程基础 640 12.1.1 窗口的元素 641 12.1.2
Windows程序与操作系统 642 12.1.3 事件驱动型程序 643 12.1.4 Windows消息 643 12.1.5 Windows API
643 12.1.6 Windows数据类型 644 12.1.7 Windows程序中的符号 645 12.2 Windows程序的结构 646
12.2.1 WinMain()函数 647 12.2.2 消息处理函数 657 12.2.3 简单的Windows程序 661 12.3
Windows程序的组织 662 12.4 MFC 663 12.4.1 MFC标记法 663 12.4.2 MFC程序的组织方式 664 12.5
使用Windows Forms 668 12.6 小结 670 第13章 使用MFC编写Windows程序 671 13.1 MFC的文档/视图概念 671
13.1.1 文档的概念 671 13.1.2 文档界面 672 13.1.3 视图的概念 672 13.1.4 连接文档和视图 673 13.1.5
应用程序和MFC 674 13.2 创建MFC应用程序 675 13.2.1 创建SDI应用程序 677 13.2.2 MFC Application
Wizard的输出 680 13.2.3 创建MDI应用程序 689 13.3 小结 690 13.4 练习 691 第14章 处理菜单和工具栏 692
14.1 与Windows进行通信 692 14.1.1 了解消息映射 693 14.1.2 消息类别 695 14.1.3 处理程序中的消息 696
14.2 扩充Sketcher程序 697 14.3 菜单的元素 697 14.4 为菜单消息添加处理程序 700 14.4.1 选择处理菜单消息的类 701
14.4.2 创建菜单消息函数 702 14.4.3 编写菜单消息函数的代码 704 14.4.4 添加更新用户界面的消息处理程序 708 14.5
添加工具栏按钮 711 14.5.1 编辑工具栏按钮的属性 712 14.5.2 练习使用工具栏按钮 713 14.5.3 添加工具提示 713 14.6
C++/CLI程序中的菜单和工具栏 714 14.6.1 理解Windows Forms 714 14.6.2 理解Windows Forms应用程序 715
14.6.3 在CLR Sketcher中添加菜单 717 14.6.4 添加菜单项的事件处理程序 719 14.6.5 实现事件处理程序 720
14.6.6 设置菜单项复选 721 14.6.7 添加工具栏 723 14.7 小结 725 14.8 练习题 725 第15章 在窗口中绘图 726
15.1 窗口绘图的基础知识 726 15.1.1 窗口客户区 727 15.1.2 Windows图形设备界面 727 15.2 Visual
C++中的绘图机制 729 15.2.1 应用程序中的视图类 729 15.2.2 CDC类 730 15.3 实际绘制图形 737 15.4 对鼠标进行编程
739 15.4.1 鼠标发出的消息 740 15.4.2 鼠标消息处理程序 741 15.4.3 使用鼠标绘图 743 15.5
练习使用Sketcher程序 764 15.5.1 运行示例 765 15.5.2 捕获鼠标消息 765 15.6 在CLR中绘图 767 15.6.1
在窗体上绘图 767 15.6.2 添加鼠标事件处理程序 767 15.6.3 定义C++/CLI元素类 769 15.6.4
实现MouseMove事件处理程序 775 15.6.5 实现MouseUp事件处理程序 776 15.6.6 实现窗体的Paint事件处理程序 776
15.7 小结 777 15.8 练习题 778 第16章 创建文档和改进视图 779 16.1 MFC集合类 779 16.1.1 集合的类型 780
16.1.2 类型安全的集合类 780 16.1.3 对象集合 780 16.1.4 类型化指针集合 789 16.2 使用CList模板类 790
16.2.1 绘制曲线 791 16.2.2 定义CCurve类 792 16.2.3 实现CCurve类 794 16.2.4 练习使用CCurve类
795 16.3 创建草图文档 796 16.4 改进视图 801 16.4.1 更新多个视图 801 16.4.2 滚动视图 803 16.4.3
使用MM_LOENGLISH映射模式 807 16.5 删除和移动形状 808 16.6 实现上下文菜单 809 16.6.1 关联菜单和类 810
16.6.2 选择上下文菜单 812 16.6.3 醒目显示元素 816 16.6.4 处理菜单消息 821 16.7 处理被屏蔽的元素 828 16.8
扩展CLR Sketcher 829 16.8.1 坐标系统转换 829 16.8.2 定义曲线 831 16.8.3 定义草图类 833 16.8.4
在Paint事件处理程序中绘制草图 834 16.8.5 实现元素的醒目显示 835 16.8.6 创建上下文菜单 838 16.9 小结 843 16.10
练习 844 第17章 使用对话框和控件 845 17.1 理解对话框 845 17.2 理解控件 846 17.3 创建对话框资源 847 17.4
对话框的编程 849 17.4.1 添加对话框类 849 17.4.2 模态和非模态对话框 851 17.4.3 显示对话框 851 17.5 支持对话框控件
854 17.5.1 初始化控件 854 17.5.2 处理单选按钮消息 855 17.6 完成对话框的操作 856 17.6.1 给文档类添加存储线宽的成员
857 17.6.2 给元素添加线宽 857 17.6.3 在视图中创建元素 858 17.6.4 练习使用对话框 859 17.7 使用微调按钮控件 859
17.7.1 添加Scale菜单项和工具栏按钮 860 17.7.2 创建微调按钮 860 17.7.3 生成比例对话框类 861 17.7.4 显示微调按钮
864 17.8 使用比例系数 865 17.8.1 可缩放的映射模式 865 17.8.2 设置文档的大小 866 17.8.3 设置映射模式 867
17.8.4 同时实现滚动与缩放 868 17.9 使用状态栏 870 17.10 使用列表框 874 17.10.1 删除比例对话框 874 17.10.2
创建列表框控件 875 17.11 使用编辑框控件 877 17.11.1 创建编辑框资源 877 17.11.2 创建对话框类 878 17.11.3
添加Text菜单项 880 17.11.4 定义文本元素 880 17.11.5 实现CText类 881 17.11.6 创建文本元素 883 17.12
CLR Sketcher中的对话框和控件 884 17.12.1 添加对话框 885 17.12.2 创建文本元素 890 17.12.3 创建文本对话框
894 17.13 小结 896 17.14 练习 897 第18章 存储和打印文档 898 18.1 了解串行化 898 18.2 串行化文档 899
18.2.1 文档类定义中的串行化 899 18.2.2 文档类实现中的串行化 900 18.2.3 基于CObject的类的功能 902 18.2.4
串行化的工作方式 903 18.2.5 如何实现类的串行化 904 18.3 应用串行化 905 18.3.1 记录文档修改 905 18.3.2 串行化文档
906 18.3.3 串行化元素类 907 18.4 练习串行化 910 18.5 移动文本 911 18.6 打印文档 912 18.7 实现多页打印
915 18.7.1 获取文档的总尺寸 916 18.7.2 存储打印数据 917 18.7.3 准备打印 917 18.7.4 打印后的清除 919
18.7.5 准备设备环境 919 18.7.6 打印文档 920 18.7.7 获得文档的打印输出 923 18.8 CLR
Sketcher中的串行化和打印 924 18.8.1 了解二进制串行化 924 18.8.2 串行化草图 928 18.8.3 打印草图 933 18.9
小结 934 18.10 练习题 935 第19章 编写自己的DLL 936 19.1 了解DLL 936 19.1.1 DLL的工作方式 937
19.1.2 DLL的内容 939 19.1.3 DLL变体 940 19.2 决定放入DLL的内容 941 19.3 编写DLL 941 19.3.1
编写和使用扩展DLL 942 19.3.2 从DLL中导出变量和函数 948 19.3.3 将符号导入程序 949 19.3.4 实现符号从DLL的导出
949 19.4 小结 952 19.5 练习题 952 第20章 连接到数据源 953 20.1 数据库基础知识 953 20.2 SQL 955
20.2.1 使用SQL检索数据 956 20.2.2 使用SQL连接表 957 20.2.3 对记录进行排序 959 20.3 MFC中的数据库支持 959
20.4 创建数据库应用程序 961 20.4.1 注册ODBC数据库 961 20.4.2 生成MFC ODBC程序 962 20.4.3 了解程序结构
965 20.4.4 示例练习 974 20.5 对记录集进行排序 974 20.6 使用另一个记录集对象 976 20.6.1 添加记录集类 976
20.6.2 添加记录集的视图类 978 20.6.3 定制记录集 982 20.6.4 访问多个表视图 985 20.6.5 查看产品的订单 990
20.7 查看客户的详细情况 990 20.7.1 添加客户记录集 990 20.7.2 创建客户对话框资源 991 20.7.3 创建客户视图类 992
20.7.4 添加过滤器 993 20.7.5 实现过滤器参数 995 20.7.6 链接订单对话框和客户对话框 996 20.7.7 练习使用数据库查看器
998 20.8 小结 999 20.9 练习题 999 第21章 更新数据源 1000 21.1 更新操作 1000 21.1.1
CRecordset更新操作 1001 21.1.2 事务 1003 21.2 简单的更新示例 1004 21.3 管理更新过程 1007 21.4
向表中添加行 1016 21.4.1 订单录入过程 1017 21.4.2 创建资源 1017 21.4.3 创建记录集 1018 21.4.4
创建记录集视图 1018 21.4.5 给对话框资源添加控件 1022 21.4.6 实现对话框切换 1026 21.4.7 创建订单ID 1030
21.4.8 存储订单数据 1034 21.4.9 为订单选择产品 1036 21.4.10 添加新订单 1038 21.5 小结 1042 21.6 练习
1042 第22章 Windows Forms应用程序进阶 1043 22.1 创建应用程序API 1043 22.1.1 添加选项卡控件 1045
22.1.2 使用GroupBox控件 1046 22.1.3 使用Button控件 1048 22.1.4 使用WebBrowser控件 1049
22.1.5 Winning应用程序的操作 1050 22.1.6 添加上下文菜单 1050 22.1.7 创建事件处理程序 1051 22.1.8
处理Limits菜单的事件 1057 22.1.9 创建对话框 1057 22.1.10 使用对话框 1061 22.1.11 添加第二个对话框 1066
22.1.12 实现Help | About菜单项 1072 22.1.13 处理按钮单击事件 1073 22.1.14 响应上下文菜单 1075 22.2
小结 1081 22.3 练习 1082 第23章 在Windows Forms 应用程序中访问数据源 1083 23.1 使用数据源 1083 23.2
访问并显示数据 1084 23.3 使用DataGridView控件 1085 23.4 在无约束模式中使用DataGridView控件 1086 23.5
定制DataGridView控件 1091 23.5.1 定制题头单元格 1092 23.5.2 定制非题头单元格 1092 23.5.3 动态设置单元格样式
1098 23.6 使用约束模式 1103 23.7 BindingSource组件 1104 23.8 使用BindingNavigator控件 1108
23.9 绑定到单独的控件 1111 23.10 使用多个表 1113 23.11 小结 1115 23.12 练习 1115 附录A C++关键字 1116
附录B ASCII码 1118 附录C Windows消息类型 1123 前言
  欢迎使用本书。通过学习本书,您可成为优秀的C++程序员。Microsoft公司的最新开发系统Visual Studio
2008支持两种截然不同但又紧密相关的C++语言。该系统完全支持原来的ISO/ANSI标准C++,同时还支持名为C++/CLI的新版C++。C++/CLI由Microsoft公司开发,现在是ECMA标准。这两种C++版本互为补充,各自完成不同的任务。ISO/ANSI
C++用于开发在本地计算机上运行的高性能应用程序,而C++/CLI专门为.NET
Framework开发。本书将讲述使用这两种C++版本开发应用程序的基础知识。.  当编写ISO/ANSI
C++程序时,我们可以从自动生成的代码中获得大量帮助,但仍然需要亲自编写大量C++代码。我们不仅需要对面向对象的编程技术有扎实的理解,而且需要充分了解Windows编程所涉及的方方面面。C++/CLI虽然针对.NET
Framework开发,但同时也是Windows Forms应用程序开发的载体。开发Windows
Forms程序经常只需要编写很少的代码,有时甚至不用编写代码。当然,当必须给Windows
Forms应用程序添加代码时,即使这部分代码只占到代码总量的很小比例,也仍然要求我们有较多的C++/CLI语言的知识。ISO/ANSI
C++仍然是许多专业人员选用的语言,但C++/CLI和Windows
Forms应用程序带来的开发速度使得C++/CLI也成了基本的语言。因此,笔者将在本书中介绍这两种C++语言的基本内容。   0.1 本书读者对象
  本书讲授如何使用Visual C++ 2008或Visual Studio 2008的任何版本,编写在Microsoft
Windows操作系统下运行的C++应用程序。阅读本书不需要预先具备任何特定编程语言的知识。如果属于下列4种情形之一,那么您就适于学习本教程:
  ●具备少量其他语言的编程经验,如BASIC;渴望学习C++,并想提升实际的Microsoft Windows编程技能。
  ●有一些使用C或C++语言的经验,但使用环境不是Microsoft Windows;希望使用最新的工具和技术,扩充在Windows环境下编程的技能。
  ●有一些C++知识,希望扩展C++技能,成为会使用C++/CLI的编程人员。
  ●属于编程新手,十分渴望投入编程世界,并最终掌握C++。要取得成功,您至少需要对计算机的工作原理有透彻的理解——包括内存的组织方式以及数据和指令的存储方式。
  0.2 本书主要内容   本书使用Visual C++
2008支持的两种技术,讲授C++编程的基础知识。详细介绍了两种风格的C++语言,使用Microsoft基本类(Microsoft Foundation
Classes,MFC)开发本地的ISO/ANSI C++ Windows应用程序,使用Windows Forms开发C++/CLI
Windows应用程序等知识。   由于数据库技术在今天的重要性和普遍性,本书还介绍了可用于在MFC和 Windows
Forms应用程序中访问数据源的技术。与Windows
Forms应用程序相比,MFC应用程序相对来说属于编码密集型程序,原因是前者的创建过程使用了Visual C++
2008中的高级设计功能,可以以图形方式组装应用程序的整个图形用户界面(GUI),并使所有代码自动生成。因此,本书把较多的篇幅给予了MFC编程,而非Windows
Forms编程。   0.3 本书结构   本书内容的结构安排如下:  ●第1章介绍使用C++编写本地应用程序和.NET
Framework应用程序所需要理解的基本概念,以及在Visual C++ 2008开发环境中体现的主要思想。还叙述了如何使用Visual C++
2008的功能来创建本书其余部分要学习的各种C++应用程序。
  ●第2~9章专门讲授两种C++语言版本,还讲述了调试过程中涉及的基本概念和技术。第2~9章内容的组织方式都相似:各章的前半部分讨论ISO/ANSI
C++主题,后半部分讨论C++/CLI主题。   ●第10章介绍如何使用标准模板库(Standard Template
Library,STL)。STL是一组功能强大且全面的工具,用来组成和操作本地C++程序中的数据。由于STL是独立于应用程序的,因此我们可以在上下文中大量应用它。第10章还介绍了Visual
C++ 2008新增的STL/CLR。它是C++/CLI应用程序的STL版本。   ●第11章介绍了在C++程序中查找错误的技术。
  ●第12章讨论Microsoft
Windows应用程序的组织方式,并描述和展示了在所有Windows应用程序中都存在的基本元素。本章解释了以ISO/ANSI
C++语言编写的、使用Windows API和MFC的Windows应用程序示例,还给出了一个使用C++/CLI语言编写的Windows
Forms应用程序基础示例。   ●第13~18章详细描述了MFC提供的构建GUI的功能以及如何在程序中针对.NET
Framework使用等价的工具。我们将学习如何创建并使用通用控件来构建应用程序的图形用户界面,还将学习如何处理因用户与程序的交互作用而产生的事件。在此过程中,我们将用本地C++创建一个具有相当规模的应用程序,并用C++/CLI创建一个本质上与C++程序功能相同的程序。除了学习构建GUI的技术以外,我们还将从开发该应用程序的过程中学到如何使用MFC来打印文档,以及如何在磁盘上保存文档。
  ●第19章讲述为使用MFC创建自己的库而需要知道的基本知识。我们将了解可以创建的不同种类的库,还将开发能够与前6章开发的应用程序协同工作的示例。
.  ●第20、21两章讲述如何在MFC应用程序中访问数据源。我们首先介绍在只读模式中访问数据库的经验,然后再学习使用MFC更新数据库的基本编程技术。这两章的示例使用了从Web上下载的Northwind数据库,但我们也可以把这两章描述的技术应用于自己的数据源。
  ●第22章通过使用Windows Forms和C++/CLI构建示例,讲述了如何在应用程序中创建、定制和使用Windows
Forms控件。通过贯穿本章构建的另一个完整的应用程序,我们将获得一定的实践经验。
  ●第23章以第22章讲述的知识为基础,演示了可用来访问数据源的控件的工作原理,并讲述了定制这些控件的方法。我们还将学习如何在不编写任何代码的情况下,创建能够访问数据库的应用程序。..
  本书各章内容都包括许多示范所讨论的编程技术的示例。每章结束的”小结”部分总结了该章所讲述的要点,大多数章都在最后给出了一组练习题,您可以应用所学的技术来试着解答这些练习题。练习题的答案连同书中的所有代码都可以从Web站点上下载(参见后面的”源代码”部分了解详细情况)。
  关于C++语言教程使用的示例都是使用简单的命令行输入和输出的控制台程序。这种方法使我们能够在不陷入复杂的Windows
GUI编程的情况下,学习C++的各种功能。实际上,我们只有在对编程语言有了透彻理解之后,才能进行Windows 编程。
  如果希望使学习过程尽可能简单,您最初可以只学习ISO/ANSI C++编程。讲授C++语言的各章(第2~9章)都是首先讨论特定方面的ISO/ANSI
C++功能,然后再讨论C++/CLI在相同的上下文中引入的新功能。以这种方式组织各章内容的原因在于,C++/CLI是作为ISO/ANSI标准语言的扩充定义的,因此对C++/CLI的理解是以对ISO/ANSI
C++的理解为基础的。因此,您可以只阅读第2~21章中的ISO/ANSI主题,而忽略后面的C++/CLI部分。然后可以继续学习使用ISO/ANSI
C++的Windows应用程序开发部分,而免去记住两种语言版本的苦恼。在熟悉了ISO/ANSI
C++之后,您可以回头重新学习C++/CLI。当然,您也可以逐章进行学习,从而同步增加这两种C++语言版本的知识。   0.4 使用本书的前提
  为了使用本书,您需要拥有Visual Studio 2008 Standard Edition、Visual Studio 2008
Professional Edition或者Visual Studio 2008 Team System。注意,Visual C++ Express
2008因不包括MFC而不能胜任。   Visual Studio 2008要求操作系统是Windows XP(x86或x64) Service Pack
2或更高版本,Windows Server 2003 Service Pack 1或更高版本,或者Windows Vista除Starter
Edition之外的版本。为了安装上述3种Visual Studio 2008版本,您的计算机需要有1
.6GHz的处理器,至少要有384MB的内存(Windows
Vista至少需要768MB),硬盘驱动器上至少需要有2.2GB的可用空间。为了安装随产品提供的完整MSDN文档,您在安装驱动器上需要有额外的1.8GB可用空间。
  书中的数据库示例使用了Northwind Traders数据库。通过在http://msdn.microsoft.com上搜索”Northwind
Traders”,可以找到该数据库的下载链接。当然,您可以把相应的示例改编成使用其他数据库。
  最为重要的是,为了使本书发挥最大功效,您需要有学习的愿望和掌握目前最强大的Windows应用程序编程工具的决心,需要有输入和完成所有示例以及完成书中所有练习题的决心。这些要求听起来比较难,而实际上不然,您会惊讶于自己在相对较短的时间内就能达到的成就。记住,每一个学习编程的人都会不时陷入困境,但只要坚持不懈,错综复杂的问题必将变得越来越清晰,而您最终必将走出困境。本书将帮助您开始独立的实践,并由此成为成功的C++程序员。
  0.5 使用Windows Classic主题   如果您在Windows Vista系统下使用Visual Studio
2008,可能会注意到视图看起来令人惊异。Aero
Glass界面提供的透明效果看第一眼时(甚至以后看了多眼后仍然)是非常惊人的。当您添加了Vista提供的所有视觉效果后,可能会奇怪怎么有人会拒绝这么好的环境呢?然而,当您注视窗口几个小时后,会发现它的显示使您眼花缭乱,您可能宁可设置不那么令视觉疲劳的界面。更重要的是,您可能注意到用这个产品时会使系统速度大大下降,因为所有这些视觉花样(eye
candy)抢夺了系统的重要处理周期。   视觉花样当然是好的,但是在写了一整天的代码后按时回家不更好吗?这是本书使用Windows
Classic主题显示Visual Studio 2008窗口的原因之一。另一个原因是,如果我们仍然使用Windows
XP,那么奇特的Vista窗口对您就意义不大了。Windows
Classic主题是这两种操作系统的公共主题,因此无论您用的是哪种操作系统它总是适用的,而且肯定比Aero Glass界面对眼睛更好。
  如果您使用的是Vista,那么建议尝试一下Vista提供的各种主题,看看它们有没有在您的机器上生效。然而,如果您愿意在Vista中使用本书所用的主题,可以采用下面的步骤来设置。
  (1) 右击Desktop并从上下文菜单中选择Personalize。出现的Personalize窗口如图0-1所示。这个窗口提供对获得Windows
Classic视图需要的所有显示设置的访问权限。   (2) 单击Theme以显示Theme Settings对话框,如图0-2所示。   (3)
在Theme栏中选择Windows Classic,并单击OK按钮。这时,您的显示将与笔者的非常相像。当然,您仍然需要处理那些特效。下面几步将去除特效。
  (4) 关闭Personalize窗口。   (5) 打开Control Panel中的System applet,显示System窗口,如图0-3所示。
  (6) 单击Advanced system settings,显示System Properties对话框的Advanced选项卡,如图0-4所示。
  (7) 单击Performance区域中的Settings按钮,显示Performance Options对话框,如图0-5所示。   (8)
像图0-5中那样选中Adjust for best
performance单选按钮。单击OK按钮两次关闭对话框。这时,您的系统就调整为与笔者使用相同的视图,也具有了最佳图形化性能。
  您可能也想通过Classic Start菜单来更轻松地定位应用程序和执行其他任务。为了配置系统提供Classic
Start菜单,右击任务栏并选择Properties。选择Start菜单项,再选择Classic
Start菜单项,并单击Customize进行所有必需的自定义,然后单击OK按钮。您现在就有了使用Visual Studio的最佳环境了。
  当然,如果使用的是Windows
XP,并希望屏幕图像看起来如本书中所示,也可以在这里使用Classic主题。只要在Windows桌面上右击,从弹出的菜单中选择Properties选项,就会显示图0-6所示的对话框。
  在Display Properties对话框的Themes选项卡上,从主题下拉列表中选择Windows Classic。单击OK按钮,就可以使用该主题了。
  0.6 源代码
  在练习本书中的示例时,读者可以手动输入所有的代码,也可以使用本书提供的源代码文件。本书中的所有源代码均可在http://www.wrox.com或http://www.tupwk.com.cn/downpage站点下载。登录到站点http://www.wrox.com,使用Search工具或书名列表就可以找到本书。在显示本书详细内容的页面上单击Download
Code链接即可获取源代码。   注意:
  由于很多图书的书名都很类似,因此通过ISBN查找是最简单的。本书英文版的ISBN号是978-0-470-22590-5。
  在下载源代码之后,只需使用自己喜欢的解压缩工具对其进行解压缩即可。另一个途径是访问Wrox代码下载主页面http://www.wrox.com/dynamic/books/download.aspx,这里有本书及其他所有Wrox图书的源代码。
  0.7 勘误表
  我们尽最大努力确保本书在叙述和代码中没有错误。然而,错误总是难免的。如果读者在本书中发现什么错误,例如拼写错误或代码错误,我们将非常感谢您能反馈给我们。通过将错误添加到勘误表中,您也许能帮其他读者节约数小时的时间,也可以帮助我们提供更高质量的图书。
  请给wkservice@vip.163.com发电子邮件,如果您的意见是正确的,我们将在本书的后续版本中采用。
  要找到本书的勘误表,可以登录http://www.wrox.com,搜索本书的书名或者使用书名列表。然后,在本书的详细内容页面上,单击Book
Errata链接。在这个页面上读者可以查看到所有已提交的、由Wrox的编辑发布的错误信息。也可以在http://www.wrox.com/
misc-pages/booklist.shtml页面找到一个完整的书名列表,这个列表包含了每本书的勘误表链接。   0.8 p2p.wrox.com
  如果想参与讨论,可以加入P2P论坛,网址是http://p2p.wrox.com。这个论坛是基于Web站点的系统,其作用是让读者发布与Wrox的图书和相关技术有关的消息,并与其他读者和技术用户交流。该论坛提供订阅功能,当有读者感兴趣的主题发布时,论坛会通过电子邮件把这些消息发送给读者。Wrox的作家、编辑、其他行业专家及和您一样的读者都会到该论坛探讨一些问题。
  在http://p2p.wrox.com中,读者将找到很多不同的论坛,这些论坛不仅能帮助读者阅读本书,还可以帮助读者开发自己的应用程序。要加入这些论坛,可按如下步骤操作:
  (1) 登录http://p2p.wrox.com并单击Register链接。   (2) 阅读使用协议并单击Agree按钮。   (3)
填写加入论坛所必需的信息和可选信息并单击Submit按钮。   (4) 读者将收到一封电子邮件,该邮件告诉读者怎样验证账户并成功加入。   注意:
  不加入P2P论坛也可以阅读该论坛上的信息,但是如果希望发布自己的消息,则必须加入该论坛。
  加入之后,就可以发布新消息或者回复其他用户发布的消息了。可以在任何时间阅读Web站点上的消息。如果希望某个论坛能将最新的消息通过电子邮件发送给您,则可以单击论坛列表中该论坛名称旁边的Subscribe
to this Forum图标。   要获得如何使用P2P论坛的更多信息,可以阅读P2P
FAQ列表中的问题及其答复,这些问题与论坛软件的工作原理及很多与P2P和Wrox图书相关的常见问题有关。要阅读FAQ,可以单击任意P2P页面上的FAQ链接。



img

Visual C++ 2008入门经典–源代码及课后练习答案

CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251
特别说明:该版本是目前网络上最全的版本:修正了268-367页缺页的问题。 该资料是《Visual C++ 2008入门经典》的源代码及课后练习答案
对应的书籍资料见: Visual C++ 2008入门经典 基本信息 原书名:Ivor Horton’s Beginning Visual C++ 2008
原出版社:Wrox 作者:(美)Ivor Horton 译者:姜玲玲 张云 出版社:清华大学出版社 ISBN:9787302194637
上架时间:2009-2-25 出版日期:2009 年2月 开本:16开 页码:1124 版次:1-1 编辑推荐
  1.本书是C++编程方面最畅销的图书品种之一。.   2.本书是编程语言先驱者Ivor Horton的又一经典之作。   
3.本书早期版本曾影响着无数程序员。..   4.本书适用于想学习C++程序的初学者,学习本书内容无需任何编程基础。    5.本书不仅涵盖了Visual
C++ 2008编程知识,还全面介绍了标准C++语言和C++/CLI。 内容简介   本书系编程语言先驱者ivor
horton的经典之作,是c++编程方面最畅销的图书品种之一,不仅涵盖了visual c++
2008编程知识,还全面介绍了标准c++语言和c++/cli。本书延续了ivor horton讲解编程语言的独特方法,从中读者可以学习visual c++
2008的基础知识,了解如何使用mfc进行本地iso/ansi c++ windows应用程序开发以及如何使用windows forms进行c++/cli
windows应用程序开发,并全面掌握在mfc和windows
forms中访问数据源的技术。此外,本书各章后面的习题将有助于读者温故而知新,并尽快成为c++高效程序员。.   本书学习目标    ◆
使用标准模板库(stl)来组织和操作本地c++程序中的数据    ◆ c++程序调试技术..   ◆ 构造microsoft
windows应用程序的技术以及每个应用程序的基本元素    ◆ 创建和使用常用控件构建应用程序的图形用户界面    ◆ 使用mfc开发库    ◆
访问数据源的不同控件、控件的工作方式以及定制控件的方法    本书读者对象   
本书适用于想学习如何为windows操作系统编写c++程序的初学者,学习本书内容无需任何编程基础。…   本书源代码及习题答案下载   
http://www.wrox.com    http://www.tupwk.com.cn/downpage 作译者   Ivor
Horton是世界著名的计算机图书作家,主要从事与编程相关的咨询及撰写工作,曾帮助无数程序员步入编程的殿堂。他曾在IBM工作多年,能使用多种语言进行编程(在多种机器上使用汇编语言和高级语言),设计和实现了实时闭环工业控制系统。Horton拥有丰富的教学经验(教学内容包括C、C++、Fortran、PL/1、APL等),同时还是机械、加工和电子CAD系统、机械CAM系统和DNC/CNC系统方面的专家。IvorHorton还著有关于C、C++和Java的多部入门级好书,如《C语言入门经典(第4版)》和《C++入门经典(第3版)》。
目录 封面-19 前言-18 目录-10 第1章 使用Visual C++ 2008编程 1 1.1.NET Framework 1 1.2 CLR
2 1.3 编写C++应用程序 3 1.4 学习Windows编程 4 1.4.1 学习C++ 4 1.4.2 C++标准 5 1.4.3 属性 5
1.4.4 控制台应用程序 6 1.4.5 Windows编程概念 6 1.5 集成开发环境简介 8 1.6 使用IDE 9 1.6.1 工具栏选项 10
1.6.2 可停靠的工具栏 10 1.6.3 文档 11 1.6.4 项目和解决方案 11 1.6.5 设置Visual C++ 2008的选项 22
1.6.6 创建和执行Windows应用程序 23 1.6.7 创建Windows Forms应用程序 25 1.7 小结 27 第2章 数据、变量和计算
28 2.1 C++程序结构 28 2.1.1 程序注释 33 2.1.2 #include指令—— 头文件 34 2.1.3 命名空间和using声明 34
2.1.4 main()函数 35 2.1.5 程序语句 35 2.1.6 空白 37 2.1.7 语句块 37 2.1.8 自动生成的控制台程序 38
2.2 定义变量 39 2.2.1 命名变量 39 2.2.2 声明变量 40 2.2.3 变量的初值 41 2.3 基本数据类型 41 2.3.1 整型变量
42 2.3.2 字符数据类型 43 2.3.3 整型修饰符 44 2.3.4 布尔类型 44 2.3.5 浮点类型 45 2.3.6 字面值 46
2.3.7 定义数据类型的同义词 47 2.3.8 具有特定值集的变量 47 2.4 基本的输入/输出操作 48 2.4.1 从键盘输入 49 2.4.2
到命令行的输出 49 2.4.3 格式化输出 50 2.4.4 转义序列 51 2.5 C++中的计算 53 2.5.1 赋值语句 53 2.5.2 算术运算
53 2.5.3 计算余数 58 2.5.4 修改变量 58 2.5.5 增量和减量运算符 59 2.5.6 计算的顺序 61 2.6 变量类型和类型强制转换
62 2.6.1 对操作数进行类型强制转换的规则 63 2.6.2 赋值语句中的类型强制转换 64 2.6.3 显式类型强制转换 64 2.6.4
老式的类型强制转换 65 2.6.5 按位运算符 65 2.7 了解存储时间和作用域 71 2.7.1 自动变量 72 2.7.2 决定变量声明的位置 74
2.7.3 全局变量 74 2.7.4 静态变量 77 2.8 命名空间 78 2.8.1 声明命名空间 79 2.8.2 多个命名空间 80 2.9
C++/CLI编程 81 2.9.1 C++/CLI特有的基本数据类型 81 2.9.2 命令行上的C++/CLI输出 85 2.9.3
C++/CLI特有的功能——格式化输出 86 2.9.4 C++/CLI的键盘输入 88 2.9.5 使用safe_cast 90 2.9.6
C++/CLI枚举 90 2.10 小结 94 2.11 练习题 95 第3章 判断和循环 97 3.1 比较数据值 97 3.1.1 if语句 98
3.1.2 嵌套的if语句 99 3.1.3 扩展的if语句 101 3.1.4 嵌套的if-else语句 103 3.1.5 逻辑运算符和表达式 105
3.1.6 条件运算符 108 3.1.7 switch语句 109 3.1.8 无条件转移 111 3.2 重复执行语句块 112 3.2.1 循环的概念
112 3.2.2 for循环的变体 115 3.2.3 while循环 122 3.2.4 do-while循环 124 3.2.5 嵌套的循环 124
3.3 C++/CLI编程 127 3.4 小结 133 3.5 练习 133 第4章 数组、字符串和指针 134 4.1 处理多个相同类型的数据值 134
4.1.1 数组 135 4.1.2 声明数组 135 4.1.3 初始化数组 138 4.1.4 字符数组和字符串处理 139 4.1.5 多维数组 142
4.2 间接数据存取 145 4.2.1 指针的概念 145 4.2.2 声明指针 146 4.2.3 使用指针 147 4.2.4 初始化指针 149
4.2.5 sizeof运算符 154 4.2.6 常量指针和指向常量的指针 155 4.2.7 指针和数组 157 4.3 动态内存分配 163 4.3.1
堆的别名—— 自由存储器 164 4.3.2 new和delete运算符 164 4.3.3 为数组动态分配内存 165 4.3.4 多维数组的动态分配
167 4.4 使用引用 168 4.4.1 引用的概念 168 4.4.2 声明并初始化引用 168 4.5 字符串的本地C++库函数 169 4.5.1
查找以空字符结尾的字符串的长度 169 4.5.2 连接以空字符结尾的字符串 170 4.5.3 复制以空字符结尾的字符串 171 4.5.4
比较以空字符结尾的字符串 172 4.5.5 搜索以空字符结尾的字符串 173 4.6 C++/CLI编程 175 4.6.1 跟踪句柄 175 4.6.2
CLR数组 177 4.6.3 字符串 191 4.6.4 跟踪引用 199 4.6.5 内部指针 200 4.7 小结 202 4.8 练习 203 第5章
程序结构(1) 205 5.1 理解函数 205 5.1.1 需要函数的原因 206 5.1.2 函数的结构 206 5.1.3 使用函数 208 5.2
给函数传递实参 212 5.2.1 按值传递机制 212 5.2.2 给函数传递指针实参 214 5.2.3 给函数传递数组 215 5.2.4
给函数传递引用实参 219 5.2.5 使用const修饰符 221 5.2.6 main()函数的实参 222 5.2.7 接受数量不定的函数实参 224
5.3 从函数返回值 226 5.3.1 返回指针 226 5.3.2 返回引用 229 5.3.3 函数中的静态变量 231 5.4 递归函数调用 233
5.5 C++/CLI编程 235 5.5.1 接受数量可变实参的函数 236 5.5.2 main( )的实参 237 5.6 小结 238 5.7 练习
238 第6章 程序结构(2) 240 6.1 函数指针 240 6.1.1 声明函数指针 241 6.1.2 函数指针作为实参 243 6.1.3
函数指针的数组 245 6.2 初始化函数形参 245 6.3 异常 247 6.3.1 抛出异常 248 6.3.2 捕获异常 249 6.3.3
MFC中的异常处理 250 6.4 处理内存分配错误 251 6.5 函数重载 252 6.5.1 函数重载的概念 253 6.5.2 何时重载函数 255
6.6 函数模板 255 6.7 使用函数的示例 257 6.7.1 实现计算器 258 6.7.2 从字符串中删除空格 260 6.7.3 计算表达式的值
261 6.7.4 获得项值 263 6.7.5 分析数 264 6.7.6 整合程序 266 6.7.7 扩展程序 268 6.7.8 提取子字符串 269
6.7.9 运行修改过的程序 271 6.8 C++/CLI编程 271 6.8.1 理解泛型函数 272 6.8.2 CLR版本的计算器程序 277 6.9
小结 283 6.10 练习 283 第7章 自定义数据类型 285 7.1 C++中的结构 285 7.1.1 结构的概念 286 7.1.2 定义结构
286 7.1.3 初始化结构 286 7.1.4 访问结构的成员 287 7.1.5 伴随结构的智能帮助 290 7.1.6 RECT结构 291
7.1.7 使用指针处理结构 291 7.2 数据类型、对象、类和实例 293 7.2.1 类的起源 294 7.2.2 类的操作 295 7.2.3 术语
295 7.3 理解类 295 7.3.1 定义类 296 7.3.2 声明类的对象 296 7.3.3 访问类的数据成员 297 7.3.4 类的成员函数
299 7.3.5 成员函数定义的位置 300 7.3.6 内联函数 301 7.4 类构造函数 302 7.4.1 构造函数的概念 302 7.4.2
默认的构造函数 304 7.4.3 在类定义中指定默认的形参值 306 7.4.4 在构造函数中使用初始化列表 307 7.5 类的私有成员 308
7.5.1 访问私有类成员 310 7.5.2 类的友元函数 311 7.5.3 默认复制构造函数 313 7.6 this指针 315 7.7
类的const对象 317 7.7.1 类的const成员函数 318 7.7.2 类外部的成员函数定义 318 7.8 类对象的数组 319 7.9
类的静态成员 321 7.9.1 类的静态数据成员 321 7.9.2 类的静态函数成员 323 7.10 类对象的指针和引用 324 7.10.1
类对象的指针 324 7.10.2 类对象的引用 327 7.11 C++/CLI编程 328 7.11.1 定义数值类类型 329 7.11.2
定义引用类类型 333 7.11.3 定义引用类类型的复制构造函数 335 7.11.4 类属性 336 7.11.5 initonly字段 348
7.11.6 静态构造函数 349 7.12 小结 350 7.13 练习 351 第8章 深入理解类 352 8.1 类的析构函数 352 8.1.1
析构函数的概念 352 8.1.2 默认的析构函数 353 8.1.3 析构函数与动态内存分配 354 8.2 实现复制构造函数 357 8.3
在变量之间共享内存 359 8.3.1 定义联合 360 8.3.2 匿名联合 361 8.3.3 类和结构中的联合 361 8.4 运算符重载 362
8.6.2 实现重载的运算符 362 8.4.2 实现对运算符的完全支持 365 8.4.3 重载赋值运算符 368 8.4.4 重载加法运算符 372
8.4.5 重载递增和递减运算符 376 8.5 类模板 377 8.5.1 定义类模板 377 8.5.2 根据类模板创建对象 380 8.5.3
使用有多个形参的类模板 382 8.6 使用类 384 8.6.1 类接口的概念 384 8.6.2 定义问题 384 8.6.3 实现CBox类 385
8.6.4 使用CBox类 400 8.7 组织程序代码 403 8.8 字符串的本地C++库类 405 8.8.1 创建字符串对象 405 8.8.2
连接字符串 407 8.8.3 访问与修改字符串 410 8.8.4 比较字符串 414 8.8.5 搜索字符串 417 8.9 C++/CLI编程 425
8.9.1 在数值类中重载运算符 425 8.9.2 重载递增和递减运算符 430 8.9.3 在引用类中重载运算符 431 8.9.4
实现引用类型的赋值运算符 433 8.10 小结 434 8.11 练习 435 第9章 类继承和虚函数 436 9.1 面向对象编程的基本思想 436
9.2 类的继承 437 9.2.1 基类的概念 438 9.2.2 基类的派生类 438 9.3 继承机制下的访问控制 441 9.3.1
派生类中构造函数的操作 444 9.3.2 声明类的保护成员 447 9.3.3 继承类成员的访问级别 449 9.4 派生类中的复制构造函数 451 9.5
友元类成员 455 9.5.1 友元类 456 9.5.2 对类友元关系的限制 456 9.6 虚函数 456 9.6.1 虚函数的概念 459 9.6.2
使用指向类对象的指针 461 9.6.3 使用引用处理虚函数 462 9.6.4 纯虚函数 463 9.6.5 抽象类 464 9.6.6 间接基类 467
9.6.7 虚析构函数 469 9.7 类类型之间的强制转换 473 9.8 嵌套类 474 9.9 C++/CLI编程 477 9.9.1 装箱与拆箱
477 9.9.2 C++/CLI类的继承 478 9.9.3 接口类 483 9.9.4 定义接口类 484 9.9.5 类和程序集 487 9.9.6
被指定为new的函数 491 9.9.7 委托和事件 492 9.9.8 引用类的析构函数和终结器 503 9.9.9 通用类 505 9.10 小结 514
9.11 练习 515 第10章 标准模板库 518 10.1 标准模板库的定义 518 10.1.1 容器 518 10.1.2 容器适配器 519
10.1.3 迭代器 520 10.1.4 算法 521 10.1.5 函数对象 522 10.1.6 函数适配器 522 10.2 STL容器范围 522
10.3 序列容器 522 10.3.1 创建矢量容器 524 10.3.2 矢量容器的容量和大小 526 10.3.3 访问矢量中的元素 530
10.3.4 在矢量中插入和删除元素 531 10.3.5 在矢量中存储类对象 533 10.3.6 排序矢量元素 536 10.3.7 排序矢量中的指针
537 10.3.8 双端队列容器 539 10.3.9 使用列表容器 542 10.3.10 使用其他序列容器 551 10.4 关联容器 561
10.4.1 使用映射容器 561 10.4.2 使用多重映射容器 572 10.5 关于迭代器的更多内容 573 10.5.1 使用输入流迭代器 573
10.5.2 使用插入迭代器 576 10.5.3 使用输出流迭代器 577 10.6 关于函数对象的更多内容 579 10.7 关于算法的更多内容 580
10.7.1 fill() 581 10.7.2 replace() 581 10.7.3 find() 581 10.7.4 transform() 582
10.8 C++/CLI程序的STL 583 10.8.1 STL/CLR容器 583 10.8.2 使用序列容器 584 10.8.3 使用关联容器 591
10.9 小结 597 10.10 练习 597 第11章 调试技术 598 11.1 理解调试 598 11.1.1 程序故障 599 11.1.2
常见故障 600 11.2 基本的调试操作 601 11.2.1 设置断点 603 11.2.2 设置跟踪点 604 11.2.3 启动调试模式 605
11.2.4 修改变量的值 608 11.3 添加调试代码 609 11.3.1 使用断言 609 11.3.2 添加自己的调试代码 610 11.4
调试程序 615 11.4.1 调用堆栈 616 11.4.2 单步执行到出错位置 617 11.5 测试扩展的类 620 11.6 调试动态内存 623
11.6.1 检查自由存储器的函数 623 11.6.2 控制自由存储器的调试操作 624 11.6.3 自由存储器的调试输出 626 11.7
调试C++/CLI程序 630 11.7.1 使用调试和跟踪类 631 11.7.2 在Windows Forms应用程序中获得跟踪输出 638 11.8
小结 639 第12章 Windows编程的概念 640 12.1 Windows编程基础 640 12.1.1 窗口的元素 641 12.1.2
Windows程序与操作系统 642 12.1.3 事件驱动型程序 643 12.1.4 Windows消息 643 12.1.5 Windows API
643 12.1.6 Windows数据类型 644 12.1.7 Windows程序中的符号 645 12.2 Windows程序的结构 646
12.2.1 WinMain()函数 647 12.2.2 消息处理函数 657 12.2.3 简单的Windows程序 661 12.3
Windows程序的组织 662 12.4 MFC 663 12.4.1 MFC标记法 663 12.4.2 MFC程序的组织方式 664 12.5
使用Windows Forms 668 12.6 小结 670 第13章 使用MFC编写Windows程序 671 13.1 MFC的文档/视图概念 671
13.1.1 文档的概念 671 13.1.2 文档界面 672 13.1.3 视图的概念 672 13.1.4 连接文档和视图 673 13.1.5
应用程序和MFC 674 13.2 创建MFC应用程序 675 13.2.1 创建SDI应用程序 677 13.2.2 MFC Application
Wizard的输出 680 13.2.3 创建MDI应用程序 689 13.3 小结 690 13.4 练习 691 第14章 处理菜单和工具栏 692
14.1 与Windows进行通信 692 14.1.1 了解消息映射 693 14.1.2 消息类别 695 14.1.3 处理程序中的消息 696
14.2 扩充Sketcher程序 697 14.3 菜单的元素 697 14.4 为菜单消息添加处理程序 700 14.4.1 选择处理菜单消息的类 701
14.4.2 创建菜单消息函数 702 14.4.3 编写菜单消息函数的代码 704 14.4.4 添加更新用户界面的消息处理程序 708 14.5
添加工具栏按钮 711 14.5.1 编辑工具栏按钮的属性 712 14.5.2 练习使用工具栏按钮 713 14.5.3 添加工具提示 713 14.6
C++/CLI程序中的菜单和工具栏 714 14.6.1 理解Windows Forms 714 14.6.2 理解Windows Forms应用程序 715
14.6.3 在CLR Sketcher中添加菜单 717 14.6.4 添加菜单项的事件处理程序 719 14.6.5 实现事件处理程序 720
14.6.6 设置菜单项复选 721 14.6.7 添加工具栏 723 14.7 小结 725 14.8 练习题 725 第15章 在窗口中绘图 726
15.1 窗口绘图的基础知识 726 15.1.1 窗口客户区 727 15.1.2 Windows图形设备界面 727 15.2 Visual
C++中的绘图机制 729 15.2.1 应用程序中的视图类 729 15.2.2 CDC类 730 15.3 实际绘制图形 737 15.4 对鼠标进行编程
739 15.4.1 鼠标发出的消息 740 15.4.2 鼠标消息处理程序 741 15.4.3 使用鼠标绘图 743 15.5
练习使用Sketcher程序 764 15.5.1 运行示例 765 15.5.2 捕获鼠标消息 765 15.6 在CLR中绘图 767 15.6.1
在窗体上绘图 767 15.6.2 添加鼠标事件处理程序 767 15.6.3 定义C++/CLI元素类 769 15.6.4
实现MouseMove事件处理程序 775 15.6.5 实现MouseUp事件处理程序 776 15.6.6 实现窗体的Paint事件处理程序 776
15.7 小结 777 15.8 练习题 778 第16章 创建文档和改进视图 779 16.1 MFC集合类 779 16.1.1 集合的类型 780
16.1.2 类型安全的集合类 780 16.1.3 对象集合 780 16.1.4 类型化指针集合 789 16.2 使用CList模板类 790
16.2.1 绘制曲线 791 16.2.2 定义CCurve类 792 16.2.3 实现CCurve类 794 16.2.4 练习使用CCurve类
795 16.3 创建草图文档 796 16.4 改进视图 801 16.4.1 更新多个视图 801 16.4.2 滚动视图 803 16.4.3
使用MM_LOENGLISH映射模式 807 16.5 删除和移动形状 808 16.6 实现上下文菜单 809 16.6.1 关联菜单和类 810
16.6.2 选择上下文菜单 812 16.6.3 醒目显示元素 816 16.6.4 处理菜单消息 821 16.7 处理被屏蔽的元素 828 16.8
扩展CLR Sketcher 829 16.8.1 坐标系统转换 829 16.8.2 定义曲线 831 16.8.3 定义草图类 833 16.8.4
在Paint事件处理程序中绘制草图 834 16.8.5 实现元素的醒目显示 835 16.8.6 创建上下文菜单 838 16.9 小结 843 16.10
练习 844 第17章 使用对话框和控件 845 17.1 理解对话框 845 17.2 理解控件 846 17.3 创建对话框资源 847 17.4
对话框的编程 849 17.4.1 添加对话框类 849 17.4.2 模态和非模态对话框 851 17.4.3 显示对话框 851 17.5 支持对话框控件
854 17.5.1 初始化控件 854 17.5.2 处理单选按钮消息 855 17.6 完成对话框的操作 856 17.6.1 给文档类添加存储线宽的成员
857 17.6.2 给元素添加线宽 857 17.6.3 在视图中创建元素 858 17.6.4 练习使用对话框 859 17.7 使用微调按钮控件 859
17.7.1 添加Scale菜单项和工具栏按钮 860 17.7.2 创建微调按钮 860 17.7.3 生成比例对话框类 861 17.7.4 显示微调按钮
864 17.8 使用比例系数 865 17.8.1 可缩放的映射模式 865 17.8.2 设置文档的大小 866 17.8.3 设置映射模式 867
17.8.4 同时实现滚动与缩放 868 17.9 使用状态栏 870 17.10 使用列表框 874 17.10.1 删除比例对话框 874 17.10.2
创建列表框控件 875 17.11 使用编辑框控件 877 17.11.1 创建编辑框资源 877 17.11.2 创建对话框类 878 17.11.3
添加Text菜单项 880 17.11.4 定义文本元素 880 17.11.5 实现CText类 881 17.11.6 创建文本元素 883 17.12
CLR Sketcher中的对话框和控件 884 17.12.1 添加对话框 885 17.12.2 创建文本元素 890 17.12.3 创建文本对话框
894 17.13 小结 896 17.14 练习 897 第18章 存储和打印文档 898 18.1 了解串行化 898 18.2 串行化文档 899
18.2.1 文档类定义中的串行化 899 18.2.2 文档类实现中的串行化 900 18.2.3 基于CObject的类的功能 902 18.2.4
串行化的工作方式 903 18.2.5 如何实现类的串行化 904 18.3 应用串行化 905 18.3.1 记录文档修改 905 18.3.2 串行化文档
906 18.3.3 串行化元素类 907 18.4 练习串行化 910 18.5 移动文本 911 18.6 打印文档 912 18.7 实现多页打印
915 18.7.1 获取文档的总尺寸 916 18.7.2 存储打印数据 917 18.7.3 准备打印 917 18.7.4 打印后的清除 919
18.7.5 准备设备环境 919 18.7.6 打印文档 920 18.7.7 获得文档的打印输出 923 18.8 CLR
Sketcher中的串行化和打印 924 18.8.1 了解二进制串行化 924 18.8.2 串行化草图 928 18.8.3 打印草图 933 18.9
小结 934 18.10 练习题 935 第19章 编写自己的DLL 936 19.1 了解DLL 936 19.1.1 DLL的工作方式 937
19.1.2 DLL的内容 939 19.1.3 DLL变体 940 19.2 决定放入DLL的内容 941 19.3 编写DLL 941 19.3.1
编写和使用扩展DLL 942 19.3.2 从DLL中导出变量和函数 948 19.3.3 将符号导入程序 949 19.3.4 实现符号从DLL的导出
949 19.4 小结 952 19.5 练习题 952 第20章 连接到数据源 953 20.1 数据库基础知识 953 20.2 SQL 955
20.2.1 使用SQL检索数据 956 20.2.2 使用SQL连接表 957 20.2.3 对记录进行排序 959 20.3 MFC中的数据库支持 959
20.4 创建数据库应用程序 961 20.4.1 注册ODBC数据库 961 20.4.2 生成MFC ODBC程序 962 20.4.3 了解程序结构
965 20.4.4 示例练习 974 20.5 对记录集进行排序 974 20.6 使用另一个记录集对象 976 20.6.1 添加记录集类 976
20.6.2 添加记录集的视图类 978 20.6.3 定制记录集 982 20.6.4 访问多个表视图 985 20.6.5 查看产品的订单 990
20.7 查看客户的详细情况 990 20.7.1 添加客户记录集 990 20.7.2 创建客户对话框资源 991 20.7.3 创建客户视图类 992
20.7.4 添加过滤器 993 20.7.5 实现过滤器参数 995 20.7.6 链接订单对话框和客户对话框 996 20.7.7 练习使用数据库查看器
998 20.8 小结 999 20.9 练习题 999 第21章 更新数据源 1000 21.1 更新操作 1000 21.1.1
CRecordset更新操作 1001 21.1.2 事务 1003 21.2 简单的更新示例 1004 21.3 管理更新过程 1007 21.4
向表中添加行 1016 21.4.1 订单录入过程 1017 21.4.2 创建资源 1017 21.4.3 创建记录集 1018 21.4.4
创建记录集视图 1018 21.4.5 给对话框资源添加控件 1022 21.4.6 实现对话框切换 1026 21.4.7 创建订单ID 1030
21.4.8 存储订单数据 1034 21.4.9 为订单选择产品 1036 21.4.10 添加新订单 1038 21.5 小结 1042 21.6 练习
1042 第22章 Windows Forms应用程序进阶 1043 22.1 创建应用程序API 1043 22.1.1 添加选项卡控件 1045
22.1.2 使用GroupBox控件 1046 22.1.3 使用Button控件 1048 22.1.4 使用WebBrowser控件 1049
22.1.5 Winning应用程序的操作 1050 22.1.6 添加上下文菜单 1050 22.1.7 创建事件处理程序 1051 22.1.8
处理Limits菜单的事件 1057 22.1.9 创建对话框 1057 22.1.10 使用对话框 1061 22.1.11 添加第二个对话框 1066
22.1.12 实现Help | About菜单项 1072 22.1.13 处理按钮单击事件 1073 22.1.14 响应上下文菜单 1075 22.2
小结 1081 22.3 练习 1082 第23章 在Windows Forms 应用程序中访问数据源 1083 23.1 使用数据源 1083 23.2
访问并显示数据 1084 23.3 使用DataGridView控件 1085 23.4 在无约束模式中使用DataGridView控件 1086 23.5
定制DataGridView控件 1091 23.5.1 定制题头单元格 1092 23.5.2 定制非题头单元格 1092 23.5.3 动态设置单元格样式
1098 23.6 使用约束模式 1103 23.7 BindingSource组件 1104 23.8 使用BindingNavigator控件 1108
23.9 绑定到单独的控件 1111 23.10 使用多个表 1113 23.11 小结 1115 23.12 练习 1115 附录A C++关键字 1116
附录B ASCII码 1118 附录C Windows消息类型 1123 前言
  欢迎使用本书。通过学习本书,您可成为优秀的C++程序员。Microsoft公司的最新开发系统Visual Studio
2008支持两种截然不同但又紧密相关的C++语言。该系统完全支持原来的ISO/ANSI标准C++,同时还支持名为C++/CLI的新版C++。C++/CLI由Microsoft公司开发,现在是ECMA标准。这两种C++版本互为补充,各自完成不同的任务。ISO/ANSI
C++用于开发在本地计算机上运行的高性能应用程序,而C++/CLI专门为.NET
Framework开发。本书将讲述使用这两种C++版本开发应用程序的基础知识。.  当编写ISO/ANSI
C++程序时,我们可以从自动生成的代码中获得大量帮助,但仍然需要亲自编写大量C++代码。我们不仅需要对面向对象的编程技术有扎实的理解,而且需要充分了解Windows编程所涉及的方方面面。C++/CLI虽然针对.NET
Framework开发,但同时也是Windows Forms应用程序开发的载体。开发Windows
Forms程序经常只需要编写很少的代码,有时甚至不用编写代码。当然,当必须给Windows
Forms应用程序添加代码时,即使这部分代码只占到代码总量的很小比例,也仍然要求我们有较多的C++/CLI语言的知识。ISO/ANSI
C++仍然是许多专业人员选用的语言,但C++/CLI和Windows
Forms应用程序带来的开发速度使得C++/CLI也成了基本的语言。因此,笔者将在本书中介绍这两种C++语言的基本内容。   0.1 本书读者对象
  本书讲授如何使用Visual C++ 2008或Visual Studio 2008的任何版本,编写在Microsoft
Windows操作系统下运行的C++应用程序。阅读本书不需要预先具备任何特定编程语言的知识。如果属于下列4种情形之一,那么您就适于学习本教程:
  ●具备少量其他语言的编程经验,如BASIC;渴望学习C++,并想提升实际的Microsoft Windows编程技能。
  ●有一些使用C或C++语言的经验,但使用环境不是Microsoft Windows;希望使用最新的工具和技术,扩充在Windows环境下编程的技能。
  ●有一些C++知识,希望扩展C++技能,成为会使用C++/CLI的编程人员。
  ●属于编程新手,十分渴望投入编程世界,并最终掌握C++。要取得成功,您至少需要对计算机的工作原理有透彻的理解——包括内存的组织方式以及数据和指令的存储方式。
  0.2 本书主要内容   本书使用Visual C++
2008支持的两种技术,讲授C++编程的基础知识。详细介绍了两种风格的C++语言,使用Microsoft基本类(Microsoft Foundation
Classes,MFC)开发本地的ISO/ANSI C++ Windows应用程序,使用Windows Forms开发C++/CLI
Windows应用程序等知识。   由于数据库技术在今天的重要性和普遍性,本书还介绍了可用于在MFC和 Windows
Forms应用程序中访问数据源的技术。与Windows
Forms应用程序相比,MFC应用程序相对来说属于编码密集型程序,原因是前者的创建过程使用了Visual C++
2008中的高级设计功能,可以以图形方式组装应用程序的整个图形用户界面(GUI),并使所有代码自动生成。因此,本书把较多的篇幅给予了MFC编程,而非Windows
Forms编程。   0.3 本书结构   本书内容的结构安排如下:  ●第1章介绍使用C++编写本地应用程序和.NET
Framework应用程序所需要理解的基本概念,以及在Visual C++ 2008开发环境中体现的主要思想。还叙述了如何使用Visual C++
2008的功能来创建本书其余部分要学习的各种C++应用程序。
  ●第2~9章专门讲授两种C++语言版本,还讲述了调试过程中涉及的基本概念和技术。第2~9章内容的组织方式都相似:各章的前半部分讨论ISO/ANSI
C++主题,后半部分讨论C++/CLI主题。   ●第10章介绍如何使用标准模板库(Standard Template
Library,STL)。STL是一组功能强大且全面的工具,用来组成和操作本地C++程序中的数据。由于STL是独立于应用程序的,因此我们可以在上下文中大量应用它。第10章还介绍了Visual
C++ 2008新增的STL/CLR。它是C++/CLI应用程序的STL版本。   ●第11章介绍了在C++程序中查找错误的技术。
  ●第12章讨论Microsoft
Windows应用程序的组织方式,并描述和展示了在所有Windows应用程序中都存在的基本元素。本章解释了以ISO/ANSI
C++语言编写的、使用Windows API和MFC的Windows应用程序示例,还给出了一个使用C++/CLI语言编写的Windows
Forms应用程序基础示例。   ●第13~18章详细描述了MFC提供的构建GUI的功能以及如何在程序中针对.NET
Framework使用等价的工具。我们将学习如何创建并使用通用控件来构建应用程序的图形用户界面,还将学习如何处理因用户与程序的交互作用而产生的事件。在此过程中,我们将用本地C++创建一个具有相当规模的应用程序,并用C++/CLI创建一个本质上与C++程序功能相同的程序。除了学习构建GUI的技术以外,我们还将从开发该应用程序的过程中学到如何使用MFC来打印文档,以及如何在磁盘上保存文档。
  ●第19章讲述为使用MFC创建自己的库而需要知道的基本知识。我们将了解可以创建的不同种类的库,还将开发能够与前6章开发的应用程序协同工作的示例。
.  ●第20、21两章讲述如何在MFC应用程序中访问数据源。我们首先介绍在只读模式中访问数据库的经验,然后再学习使用MFC更新数据库的基本编程技术。这两章的示例使用了从Web上下载的Northwind数据库,但我们也可以把这两章描述的技术应用于自己的数据源。
  ●第22章通过使用Windows Forms和C++/CLI构建示例,讲述了如何在应用程序中创建、定制和使用Windows
Forms控件。通过贯穿本章构建的另一个完整的应用程序,我们将获得一定的实践经验。
  ●第23章以第22章讲述的知识为基础,演示了可用来访问数据源的控件的工作原理,并讲述了定制这些控件的方法。我们还将学习如何在不编写任何代码的情况下,创建能够访问数据库的应用程序。..
  本书各章内容都包括许多示范所讨论的编程技术的示例。每章结束的”小结”部分总结了该章所讲述的要点,大多数章都在最后给出了一组练习题,您可以应用所学的技术来试着解答这些练习题。练习题的答案连同书中的所有代码都可以从Web站点上下载(参见后面的”源代码”部分了解详细情况)。
  关于C++语言教程使用的示例都是使用简单的命令行输入和输出的控制台程序。这种方法使我们能够在不陷入复杂的Windows
GUI编程的情况下,学习C++的各种功能。实际上,我们只有在对编程语言有了透彻理解之后,才能进行Windows 编程。
  如果希望使学习过程尽可能简单,您最初可以只学习ISO/ANSI C++编程。讲授C++语言的各章(第2~9章)都是首先讨论特定方面的ISO/ANSI
C++功能,然后再讨论C++/CLI在相同的上下文中引入的新功能。以这种方式组织各章内容的原因在于,C++/CLI是作为ISO/ANSI标准语言的扩充定义的,因此对C++/CLI的理解是以对ISO/ANSI
C++的理解为基础的。因此,您可以只阅读第2~21章中的ISO/ANSI主题,而忽略后面的C++/CLI部分。然后可以继续学习使用ISO/ANSI
C++的Windows应用程序开发部分,而免去记住两种语言版本的苦恼。在熟悉了ISO/ANSI
C++之后,您可以回头重新学习C++/CLI。当然,您也可以逐章进行学习,从而同步增加这两种C++语言版本的知识。   0.4 使用本书的前提
  为了使用本书,您需要拥有Visual Studio 2008 Standard Edition、Visual Studio 2008
Professional Edition或者Visual Studio 2008 Team System。注意,Visual C++ Express
2008因不包括MFC而不能胜任。   Visual Studio 2008要求操作系统是Windows XP(x86或x64) Service Pack
2或更高版本,Windows Server 2003 Service Pack 1或更高版本,或者Windows Vista除Starter
Edition之外的版本。为了安装上述3种Visual Studio 2008版本,您的计算机需要有1
.6GHz的处理器,至少要有384MB的内存(Windows
Vista至少需要768MB),硬盘驱动器上至少需要有2.2GB的可用空间。为了安装随产品提供的完整MSDN文档,您在安装驱动器上需要有额外的1.8GB可用空间。
  书中的数据库示例使用了Northwind Traders数据库。通过在http://msdn.microsoft.com上搜索”Northwind
Traders”,可以找到该数据库的下载链接。当然,您可以把相应的示例改编成使用其他数据库。
  最为重要的是,为了使本书发挥最大功效,您需要有学习的愿望和掌握目前最强大的Windows应用程序编程工具的决心,需要有输入和完成所有示例以及完成书中所有练习题的决心。这些要求听起来比较难,而实际上不然,您会惊讶于自己在相对较短的时间内就能达到的成就。记住,每一个学习编程的人都会不时陷入困境,但只要坚持不懈,错综复杂的问题必将变得越来越清晰,而您最终必将走出困境。本书将帮助您开始独立的实践,并由此成为成功的C++程序员。
  0.5 使用Windows Classic主题   如果您在Windows Vista系统下使用Visual Studio
2008,可能会注意到视图看起来令人惊异。Aero
Glass界面提供的透明效果看第一眼时(甚至以后看了多眼后仍然)是非常惊人的。当您添加了Vista提供的所有视觉效果后,可能会奇怪怎么有人会拒绝这么好的环境呢?然而,当您注视窗口几个小时后,会发现它的显示使您眼花缭乱,您可能宁可设置不那么令视觉疲劳的界面。更重要的是,您可能注意到用这个产品时会使系统速度大大下降,因为所有这些视觉花样(eye
candy)抢夺了系统的重要处理周期。   视觉花样当然是好的,但是在写了一整天的代码后按时回家不更好吗?这是本书使用Windows
Classic主题显示Visual Studio 2008窗口的原因之一。另一个原因是,如果我们仍然使用Windows
XP,那么奇特的Vista窗口对您就意义不大了。Windows
Classic主题是这两种操作系统的公共主题,因此无论您用的是哪种操作系统它总是适用的,而且肯定比Aero Glass界面对眼睛更好。
  如果您使用的是Vista,那么建议尝试一下Vista提供的各种主题,看看它们有没有在您的机器上生效。然而,如果您愿意在Vista中使用本书所用的主题,可以采用下面的步骤来设置。
  (1) 右击Desktop并从上下文菜单中选择Personalize。出现的Personalize窗口如图0-1所示。这个窗口提供对获得Windows
Classic视图需要的所有显示设置的访问权限。   (2) 单击Theme以显示Theme Settings对话框,如图0-2所示。   (3)
在Theme栏中选择Windows Classic,并单击OK按钮。这时,您的显示将与笔者的非常相像。当然,您仍然需要处理那些特效。下面几步将去除特效。
  (4) 关闭Personalize窗口。   (5) 打开Control Panel中的System applet,显示System窗口,如图0-3所示。
  (6) 单击Advanced system settings,显示System Properties对话框的Advanced选项卡,如图0-4所示。
  (7) 单击Performance区域中的Settings按钮,显示Performance Options对话框,如图0-5所示。   (8)
像图0-5中那样选中Adjust for best
performance单选按钮。单击OK按钮两次关闭对话框。这时,您的系统就调整为与笔者使用相同的视图,也具有了最佳图形化性能。
  您可能也想通过Classic Start菜单来更轻松地定位应用程序和执行其他任务。为了配置系统提供Classic
Start菜单,右击任务栏并选择Properties。选择Start菜单项,再选择Classic
Start菜单项,并单击Customize进行所有必需的自定义,然后单击OK按钮。您现在就有了使用Visual Studio的最佳环境了。
  当然,如果使用的是Windows
XP,并希望屏幕图像看起来如本书中所示,也可以在这里使用Classic主题。只要在Windows桌面上右击,从弹出的菜单中选择Properties选项,就会显示图0-6所示的对话框。
  在Display Properties对话框的Themes选项卡上,从主题下拉列表中选择Windows Classic。单击OK按钮,就可以使用该主题了。
  0.6 源代码
  在练习本书中的示例时,读者可以手动输入所有的代码,也可以使用本书提供的源代码文件。本书中的所有源代码均可在http://www.wrox.com或http://www.tupwk.com.cn/downpage站点下载。登录到站点http://www.wrox.com,使用Search工具或书名列表就可以找到本书。在显示本书详细内容的页面上单击Download
Code链接即可获取源代码。   注意:
  由于很多图书的书名都很类似,因此通过ISBN查找是最简单的。本书英文版的ISBN号是978-0-470-22590-5。
  在下载源代码之后,只需使用自己喜欢的解压缩工具对其进行解压缩即可。另一个途径是访问Wrox代码下载主页面http://www.wrox.com/dynamic/books/download.aspx,这里有本书及其他所有Wrox图书的源代码。
  0.7 勘误表
  我们尽最大努力确保本书在叙述和代码中没有错误。然而,错误总是难免的。如果读者在本书中发现什么错误,例如拼写错误或代码错误,我们将非常感谢您能反馈给我们。通过将错误添加到勘误表中,您也许能帮其他读者节约数小时的时间,也可以帮助我们提供更高质量的图书。
  请给wkservice@vip.163.com发电子邮件,如果您的意见是正确的,我们将在本书的后续版本中采用。
  要找到本书的勘误表,可以登录http://www.wrox.com,搜索本书的书名或者使用书名列表。然后,在本书的详细内容页面上,单击Book
Errata链接。在这个页面上读者可以查看到所有已提交的、由Wrox的编辑发布的错误信息。也可以在http://www.wrox.com/
misc-pages/booklist.shtml页面找到一个完整的书名列表,这个列表包含了每本书的勘误表链接。   0.8 p2p.wrox.com
  如果想参与讨论,可以加入P2P论坛,网址是http://p2p.wrox.com。这个论坛是基于Web站点的系统,其作用是让读者发布与Wrox的图书和相关技术有关的消息,并与其他读者和技术用户交流。该论坛提供订阅功能,当有读者感兴趣的主题发布时,论坛会通过电子邮件把这些消息发送给读者。Wrox的作家、编辑、其他行业专家及和您一样的读者都会到该论坛探讨一些问题。
  在http://p2p.wrox.com中,读者将找到很多不同的论坛,这些论坛不仅能帮助读者阅读本书,还可以帮助读者开发自己的应用程序。要加入这些论坛,可按如下步骤操作:
  (1) 登录http://p2p.wrox.com并单击Register链接。   (2) 阅读使用协议并单击Agree按钮。   (3)
填写加入论坛所必需的信息和可选信息并单击Submit按钮。   (4) 读者将收到一封电子邮件,该邮件告诉读者怎样验证账户并成功加入。   注意:
  不加入P2P论坛也可以阅读该论坛上的信息,但是如果希望发布自己的消息,则必须加入该论坛。
  加入之后,就可以发布新消息或者回复其他用户发布的消息了。可以在任何时间阅读Web站点上的消息。如果希望某个论坛能将最新的消息通过电子邮件发送给您,则可以单击论坛列表中该论坛名称旁边的Subscribe
to this Forum图标。   要获得如何使用P2P论坛的更多信息,可以阅读P2P
FAQ列表中的问题及其答复,这些问题与论坛软件的工作原理及很多与P2P和Wrox图书相关的常见问题有关。要阅读FAQ,可以单击任意P2P页面上的FAQ链接。



img

Visual C++ 2005 入门经典 详细书签版

CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251
Visual C++ 2005入门经典 基本信息 原书名:Ivor Horton’s Beginning Visual C++ 2005 原出版社:
Wiley 作者:(美)Ivor Horton 译者:李颂华 康会光 出版社:清华大学出版社 ISBN:9787302142713
上架时间:2007-2-12 出版日期:2007 年1月 开本:16开 页码:1046 版次:1-1 编辑推荐   本书由编程语言先驱者Ivor
Horton倾力而著,是国内第一本全面、深入介绍Visual C++ 2005的经典之作! 内容简介   本书系编程语言先驱者Ivor
Horton的经典之作,是学习C++编程最畅销的图书品种之一,不仅涵盖了Visual C++.NET编程知识,还全面介绍了标准C++语言和.NET
C++/CLI。本书延续了Ivor Horton讲解编程语言的独特方法,从中读者可以学习Visual C++
2005的基础知识,并全面掌握在MFC和Windows
Forms中访问数据源的技术。此外,本书各章后面的习题将有助于读者温故而知新,并尽快成为C++高效程序员。…   作译者   Ivor
Horton是世界著名的计算机图书作家,主要从事与编程相关的顾问及撰写工作,曾帮助无数程序员步入编程的殿堂。他曾在IBM工作多年,能使用多种语言进行编程(在多种机器上使用汇编语言和高级语言),设计和实现了实时闭环工业控制系统。Horton拥有丰富的教学经验(教学内容包括C、C++、Fortran、PL/1、APL等),同时还是机械、加工和电子CAD系统、机械CAM系统和DNC/CNC系统方面的专家。Ivor
Horton还著有Beginning Visual C++ 6、Beginning C Programming和Beginning Java
2等多部入门级好书。 目录 封面-18 前言-14 目录-9 第1章 使用Visual C++ 2005编程 1 1.1 .NET Framework
1 1.2 CLR 2 1.3 编写C++应用程序 3 1.4 学习Windows编程 4 1.4.1 学习C++ 4 1.4.2 C++标准 5
1.4.3 控制台应用程序 5 1.4.4 Windows编程概念 6 1.5 集成开发环境简介 7 1.6 使用IDE 9 1.6.1 工具栏选项 9
1.6.2 可停靠的工具栏 10 1.6.3 文档 11 1.6.4 项目和解决方案 11 1.6.5 设置Visual C++ 2005的选项 23
1.6.6 创建和执行Windows应用程序 24 1.6.7 创建Windows Forms应用程序 26 1.7 小结 29 第2章 数据、变量和计算
31 2.1 C++程序结构 31 2.1.1 程序注释 36 2.1.2 #include指令——头文件 37 2.1.3 命名空间和using声明 37
2.1.4 main()函数 38 2.1.5 程序语句 38 2.1.6 空白 40 2.1.7 语句块 41 2.1.8 自动生成的控制台程序 41
2.2 定义变量 42 2.2.1 命名变量 43 2.2.2 C++中的关键字 43 2.2.3 声明变量 44 2.2.4 变量的初值 44
2.3 基本数据类型 45 2.3.1 整型变量 45 2.3.2 字符数据类型 46 2.3.3 整型修饰符 47 2.3.4 布尔类型 48
2.3.5 浮点类型 48 2.3.6 ISO/ANSI C++中的基本类型 49 2.3.7 字面值 50 2.3.8 定义数据类型的同义词 50
2.3.9 具有特定值集的变量 51 2.3.10 指定枚举常量的类型 52 2.4 基本的输入/输出操作 53 2.4.1 从键盘输入 53
2.4.2 到命令行的输出 53 2.4.3 格式化输出 54 2.4.4 转义序列 55 2.5 C++中的计算 57 2.5.1 赋值语句 57
2.5.2 算术运算 58 2.5.3 计算余数 63 2.5.4 修改变量 63 2.5.5 增量和减量运算符 64 2.5.6 计算的顺序 66
2.6 变量类型和类型强制转换 67 2.6.1 对操作数进行类型强制转换的规则 68 2.6.2 赋值语句中的类型强制转换 69
2.6.3 显式类型强制转换 69 2.6.4 老式的类型强制转换 70 2.6.5 按位运算符 71 2.7 了解存储时间和作用域 76
2.7.1 自动变量 77 2.7.2 决定变量声明的位置 79 2.7.3 全局变量 79 2.7.4 静态变量 82 2.8 命名空间 83
2.8.1 声明命名空间 84 2.8.2 多个命名空间 86 2.9 C++/CLI编程 87 2.9.1 C++/CLI特有的基本数据类型 87
2.9.2 命令行上的C++/CLI输出 91 2.9.3 C++/CLI特有的功能——格式化输出 92 2.9.4 C++/CLI的键盘输入 94
2.9.5 使用safe_cast 95 2.9.6 C++/CLI枚举 96 2.10 小结 98 2.11 练习题 100 第3章 判断和循环 101
3.1 比较数据值 101 3.1.1 if语句 102 3.1.2 嵌套的if语句 103 3.1.3 扩展的if语句 105
3.1.4 嵌套的if-else语句 107 3.1.5 逻辑运算符和表达式 109 3.1.6 条件运算符 112 3.1.7 switch语句 114
3.1.8 无条件转移 116 3.2 重复执行语句块 117 3.2.1 循环的概念 117 3.2.2 for循环的变体 120
3.2.3 while循环 127 3.2.4 do-while循环 129 3.2.5 嵌套的循环 130 3.3 C++/CLI编程 133 3.4 小结
139 3.5 练习 140 第4章 数组、字符串和指针 141 4.1 处理多个相同类型的数据值 141 4.1.1 数组 142 4.1.2 声明数组
142 4.1.3 初始化数组 145 4.1.4 字符数组和字符串处理 147 4.1.5 多维数组 150 4.2 间接数据存取 153
4.2.1 指针的概念 153 4.2.2 声明指针 154 4.2.3 使用指针 155 4.2.4 初始化指针 157 4.2.5 sizeof运算符
162 4.2.6 常量指针和指向常量的指针 164 4.2.7 指针和数组 165 4.3 动态内存分配 172 4.3.1 堆的别名——自由存储器 172
4.3.2 new和delete运算符 172 4.3.3 为数组动态分配内存 173 4.3.4 多维数组的动态分配 176 4.4 使用引用 177
4.4.1 引用的概念 177 4.4.2 声明并初始化引用 177 4.5 C++/CLI编程 178 4.5.1 跟踪句柄 178 4.5.2 CLR数组
180 4.5.3 字符串 195 4.5.4 跟踪引用 203 4.5.5 内部指针 204 4.6 小结 206 4.7 练习 207
第5章 程序结构(1) 209 5.1 理解函数 209 5.1.1 需要函数的原因 210 5.1.2 函数的结构 210 5.1.3 使用函数 212
5.2 给函数传递实参 216 5.2.1 按值传递机制 217 5.2.2 给函数传递指针实参 218 5.2.3 给函数传递数组 219
5.2.4 给函数传递引用实参 224 5.2.5 使用const修饰符 226 5.2.6 main()函数的实参 227
5.2.7 接受数量不定的函数实参 229 5.3 从函数返回值 231 5.3.1 返回指针 231 5.3.2 返回引用 234
5.3.3 函数中的静态变量 236 5.4 递归函数调用 239 5.5 C++/CLI编程 241 5.5.1 接受数量可变实参的函数 242
5.5.2 main( )的实参 243 5.6 小结 244 5.7 练习 245 第6章 程序结构(2) 246 6.1 函数指针 246
6.1.1 声明函数指针 247 6.1.2 函数指针作为实参 250 6.1.3 函数指针的数组 251 6.2 初始化函数形参 252 6.3 异常
253 6.3.1 抛出异常 255 6.3.2 捕获异常 256 6.3.3 MFC中的异常处理 257 6.4 处理内存分配错误 258 6.5 函数重载
259 6.5.1 函数重载的概念 260 6.5.2 何时重载函数 262 6.6 函数模板 262 6.7 使用函数的示例 265 6.7.1 实现计算器
265 6.7.2 从字符串中删除空格 268 6.7.3 计算表达式的值 268 6.7.4 获得项值 271 6.7.5 分析数 272
6.7.6 整合程序 274 6.7.7 扩展程序 276 6.7.8 提取子字符串 277 6.7.9 运行修改过的程序 280 6.8 C++/CLI编程
280 6.8.1 理解类函数 281 6.8.2 CLR版本的计算器程序 287 6.9 小结 293 6.10 练习 293 第7章 自定义数据类型
295 7.1 C++中的结构 295 7.1.1 结构的概念 296 7.1.2 定义结构 296 7.1.3 初始化结构 296
7.1.4 访问结构的成员 297 7.1.5 伴随结构的智能帮助 300 7.1.6 RECT结构 301 7.1.7 使用指针处理结构 302
7.2 数据类型、对象、类和实例 303 7.2.1 类的起源 305 7.2.2 类的操作 305 7.2.3 术语 306 7.3 理解类 306
7.3.1 定义类 307 7.3.2 声明类的对象 307 7.3.3 访问类的数据成员 308 7.3.4 类的成员函数 310
7.3.5 成员函数定义的位置 312 7.3.6 内联函数 312 7.4 类构造函数 313 7.4.1 构造函数的概念 313
7.4.2 默认的构造函数 315 7.4.3 在类定义中指定默认的形参值 318 7.4.4 在构造函数中使用初始化列表 320 7.5 类的私有成员
320 7.5.1 访问私有类成员 323 7.5.2 类的友元函数 324 7.5.3 默认复制构造函数 326 7.6 this指针 328
7.7 类的const对象 331 7.7.1 类的const成员函数 331 7.7.2 类外部的成员函数定义 332 7.8 类对象的数组 333
7.9 类的静态成员 335 7.9.1 类的静态数据成员 335 7.9.2 类的静态函数成员 338 7.10 类对象的指针和引用 338
7.10.1 类对象的指针 338 7.10.2 类对象的引用 341 7.11 C++/CLI编程 343 7.11.1 定义数值类类型 344
7.11.2 定义引用类类型 348 7.11.3 类属性 351 7.11.4 initonly字段 364 7.11.5 静态构造函数 366
7.12 小结 367 7.13 练习 367 第8章 深入理解类 369 8.1 类的析构函数 369 8.1.1 析构函数的概念 369
8.1.2 默认的析构函数 370 8.1.3 析构函数与动态内存分配 372 8.2 实现复制构造函数 375 8.3 在变量之间共享内存 377
8.3.1 定义联合 377 8.3.2 匿名联合 379 8.3.3 类和结构中的联合 379 8.4 运算符重载 379 8.6.2 实现重载的运算符
380 8.4.2 实现对运算符的完全支持 383 8.4.3 重载赋值运算符 387 8.4.4 重载加法运算符 392 8.4.5 重载递增和递减运算符
396 8.5 类模板 396 8.5.1 定义类模板 397 8.5.2 根据类模板创建对象 400 8.5.3 使用有多个形参的类模板 403
8.6 使用类 405 8.6.1 类接口的概念 405 8.6.2 定义问题 405 8.6.3 实现CBox类 406 8.6.4 定义CBox类 413
8.6.5 使用CBox类 423 8.7 组织程序代码 426 8.8 C++/CLI编程 428 8.8.1 在数值类中重载运算符 429
8.8.2 重载递增和递减运算符 434 8.8.3 在引用类中重载运算符 435 8.9 小结 437 8.10 练习 438 第9章 类继承和虚函数
440 9.1 面向对象编程的基本思想 440 9.2 类的继承 441 9.2.1 基类的概念 442 9.2.2 基类的派生类 442
9.3 继承机制下的访问控制 446 9.3.1 派生类中构造函数的操作 448 9.3.2 声明类的保护成员 452 9.3.3 继承类成员的访问级别
455 9.4 派生类中的复制构造函数 456 9.5 友元类成员 461 9.5.1 友元类 462 9.5.2 对类友元关系的限制 462 9.6 虚函数
462 9.6.1 虚函数的概念 465 9.6.2 使用指向类对象的指针 467 9.6.3 使用引用处理虚函数 469 9.6.4 纯虚函数 470
9.6.5 抽象类 471 9.6.6 间接基类 474 9.6.7 虚析构函数 476 9.7 类类型之间的强制转换 481 9.8 嵌套类 482
9.9 C++/CLI编程 485 9.9.1 C++/CLI类的继承 486 9.9.2 接口类 492 9.9.3 定义接口类 492
9.9.4 类和程序集 496 9.9.5 被指定为new的函数 501 9.9.6 委托和事件 502 9.9.7 引用类的析构函数和结束函数 514
9.9.8 通用类 516 9.10 小结 527 9.11 练习 528 第10章 调试技术 531 10.1 理解调试 531 10.1.1 程序故障
532 10.1.2 常见故障 533 10.2 基本的调试操作 534 10.2.1 设置断点 536 10.2.2 设置跟踪点 538
10.2.3 启动调试模式 538 10.2.4 修改变量的值 542 10.3 添加调试代码 542 10.3.1 使用断言 543
10.3.2 添加自己的调试代码 544 10.4 调试程序 549 10.4.1 调用堆栈 549 10.4.2 单步执行到出错位置 551
10.5 测试扩展的类 555 10.6 调试动态内存 558 10.6.1 检查自由存储器的函数 558 10.6.2 控制自由存储器的调试操作 559
10.6.3 自由存储器的调试输出 561 10.7 调试C++/CLI程序 566 10.8 小结 575 第11章 Windows编程的概念 576
11.1 Windows编程基础 576 11.1.1 窗口的元素 577 11.1.2 Windows程序与操作系统 579 11.1.3 事件驱动型程序
579 11.1.4 Windows消息 579 11.1.5 Windows API 580 11.1.6 Windows数据类型 580
11.1.7 Windows程序中的符号 581 11.2 Windows程序的结构 582 11.2.1 WinMain()函数 583
11.2.2 消息处理函数 594 11.2.3 简单的Windows程序 598 11.3 Windows程序的组织 600 11.4 MFC 601
11.4.1 MFC标记法 601 11.4.2 MFC程序的组织方式 602 11.5 使用Windows Forms 606 11.6 小结 608
第12章 使用MFC编写Windows程序 609 12.1 MFC的文档/视图概念 609 12.1.1 文档的概念 609 12.1.2 文档界面 610
12.1.3 视图的概念 610 12.1.4 连接文档和视图 611 12.1.5 应用程序和MFC 612 12.2 创建MFC应用程序 613
12.2.1 创建SDI应用程序 615 12.2.2 MFC Application wizard的输出 618 12.2.3 创建MDI应用程序 628
12.3 小结 630 12.4 练习 631 第13章 处理菜单和工具栏 632 13.1 与Windows进行通信 632 13.1.1 了解消息映射
633 13.1.2 消息类别 635 13.1.3 处理程序中的消息 636 13.2 扩充Sketcher程序 637 13.3 菜单的元素 638
13.4 为菜单消息添加处理程序 642 13.4.1 选择处理菜单消息的类 643 13.4.2 创建菜单消息函数 643
13.4.3 编写菜单消息函数的代码 646 13.4.4 添加更新用户界面的消息处理程序 650 13.5 添加工具栏按钮 653
13.5.1 编辑工具栏按钮的属性 654 13.5.2 练习使用工具栏按钮 655 13.5.3 添加工具提示 656 13.6 小结 656
13.7 练习题 657 第14章 在窗口中绘图 658 14.1 窗口绘图的基础知识 658 14.1.1 窗口客户区 659
14.1.2 Windows图形设备界面 659 14.2 Visual C++中的绘图机制 662 14.2.1 应用程序中的视图类 662
14.2.2 CDC类 663 14.3 实际绘制图形 671 14.4 对鼠标进行编程 673 14.4.1 鼠标发出的消息 673
14.4.2 鼠标消息处理程序 675 14.4.3 使用鼠标绘图 677 14.5 练习使用Sketcher程序 700 14.5.1 运行这个示例 700
14.5.2 捕获鼠标消息 701 14.6 小结 703 14.7 练习题 703 第15章 创建文档和改进视图 705 15.1 什么是集合类 705
15.1.1 集合的类型 705 15.1.2 类型安全的集合类 706 15.1.3 对象集合 706 15.1.4 类型化指针集合 715
15.2 使用CList模板类 717 15.2.1 绘制曲线 718 15.2.2 定义CCurve类 719 15.2.3 实现CCurve类 720
15.2.4 练习使用CCurve类 722 15.3 创建文档 723 15.4 改进视图 728 15.4.1 更新多个视图 728
15.4.2 滚动视图 730 15.4.3 使用MM_LOENGLISH映射模式 734 15.5 删除和移动形状 735 15.6 实现上下文菜单 736
15.6.1 关联菜单和类 737 15.6.2 选择上下文菜单 739 15.6.3 醒目显示元素 744 15.6.4 处理菜单消息 749
15.7 处理被屏蔽的元素 756 15.8 小结 757 15.9 练习 758 第16章 使用对话框和控件 759 16.1 理解对话框 759
16.2 理解控件 760 16.3 创建对话框资源 761 16.4 对话框的编程 764 16.4.1 添加对话框类 764
16.4.2 模态和非模态对话框 765 16.4.3 显示对话框 765 16.5 支持对话框控件 768 16.5.1 初始化控件 769
16.5.2 处理单选按钮消息 770 16.6 完成对话框的操作 771 16.6.1 给文档类添加存储线宽的成员 772 16.6.2 给元素添加线宽
772 16.6.3 在视图中创建元素 773 16.6.4 练习使用对话框 774 16.7 使用微调按钮控件 775
16.7.1 添加Scale菜单项和工具栏按钮 775 16.7.2 创建微调按钮 776 16.7.3 生成比例对话框类 777 16.7.4 显示微调按钮
780 16.8 使用比例系数 781 16.8.1 可缩放的映射模式 781 16.8.2 设置文档的大小 783 16.8.3 设置映射模式 783
16.8.4 同时实现滚动与缩放 785 16.9 使用状态栏 787 16.10 使用列表框 791 16.10.1 删除比例对话框 791
16.10.2 创建列表框控件 792 16.11 使用编辑框控件 795 16.11.1 创建编辑框资源 795 16.11.2 创建对话框类 796
16.11.3 添加Text菜单项 798 16.11.4 定义文本元素 799 16.11.5 实现CText类 800 16.11.6 创建文本元素
801 16.12 小结 803 16.13 练习 804 第17章 存储和打印文档 805 17.1 了解串行化 805 17.2 串行化文档 806
17.2.1 文档类定义中的串行化 806 17.2.2 文档类实现中的串行化 807 17.2.3 基于CObject的类的功能 809
17.2.4 串行化的工作方式 810 17.2.5 如何实现类的串行化 811 17.3 应用串行化 812 17.3.1 记录文档修改 812
17.3.2 串行化文档 813 17.3.3 串行化元素类 814 17.4 练习串行化 818 17.5 移动文本 819 17.6 打印文档 821
17.7 实现多页打印 824 17.7.1 获取文档的总尺寸 825 17.7.2 存储打印数据 825 17.7.3 准备打印 826
17.7.4 打印后的清除 828 17.7.5 准备设备上下文 828 17.7.6 打印文档 829 17.7.7 获得文档的打印输出 833
17.8 小结 833 17.9 练习题 834 第18章 编写自己的DLL 835 18.1 了解DLL 835 18.1.1 DLL的工作方式 836
18.1.2 DLL的内容 838 18.1.3 DLL变体 839 18.2 决定放入DLL的内容 840 18.3 编写DLL 841
18.3.1 编写和使用扩展DLL 841 18.3.2 从DLL中导出变量和函数 848 18.3.3 将符号导入程序 849
18.3.4 实现符号从DLL的导出 849 18.4 小结 852 18.5 练习题 852 第19章 连接到数据源 853 19.1 数据库基础知识
853 19.2 SQL 855 19.2.1 使用SQL检索数据 856 19.2.2 使用SQL连接表 857 19.2.3 对记录进行排序 859
19.3 MFC中的数据库支持 859 19.4 创建数据库应用程序 861 19.4.1 注册ODBC数据库 861 19.4.2 生成MFC ODBC程序
862 19.4.3 了解程序结构 865 19.4.4 示例练习 875 19.5 对记录集进行排序 876 19.6 使用另一个记录集对象 877
19.6.1 添加记录集类 878 19.6.2 添加记录集的视图类 880 19.6.3 定制记录集 884 19.6.4 访问多个表视图 887
19.6.5 查看产品的订单 892 19.7 查看客户的详细情况 893 19.7.1 添加客户记录集 893 19.7.2 创建客户对话框资源 894
19.7.3 创建客户视图类 894 19.7.4 添加过滤器 896 19.7.5 实现过滤器参数 898 19.7.6 链接订单对话框和客户对话框 899
19.7.7 练习使用数据库查看器 902 19.8 小结 902 19.9 练习题 902 第20章 更新数据源 904 20.1 更新操作 904
20.1.1 CRecordset更新操作 905 20.1.2 事务 907 20.2 简单的更新示例 908 20.3 管理更新过程 911
20.4 向表中添加行 922 20.4.1 订单录入过程 922 20.4.2 创建资源 923 20.4.3 创建记录集 924
20.4.4 创建记录集视图 924 20.4.5 给对话框资源添加控件 929 20.4.6 实现对话框切换 932 20.4.7 创建订单ID 936
20.4.8 存储订单数据 941 20.4.9 为订单选择产品 943 20.4.10 添加新订单 945 20.5 小结 950 20.6 练习 950
第21章 使用Windows Forms的应用程序 952 21.1 理解Windows Forms 952 21.2 理解Windows Forms应用程序
953 21.2.1 修改窗体的属性 954 21.2.2 如何启动应用程序 955 21.3 定制应用程序GUI 956 21.3.1 给窗体添加控件
957 21.3.2 添加选项卡控件 960 21.3.3 使用GroupBox控件 962 21.3.4 使用Button控件 964
21.3.5 使用WebBrowser控件 965 21.3.6 Winning应用程序的操作 967 21.3.7 添加上下文菜单 967
21.3.8 创建事件处理程序 967 21.3.9 处理Limits菜单的事件 974 21.3.10 创建对话框 974 21.3.11 使用对话框
979 21.3.12 添加第二个对话框 985 21.3.13 实现Help | About菜单项 992 21.3.14 处理按钮单击事件 993
21.3.15 响应上下文菜单 996 21.4 小结 1002 21.5 练习 1003 第22章 在Windows Forms应用程序中访问数据源
1004 22.1 使用数据源 1004 22.2 访问并显示数据 1005 22.3 使用DataGridView控件 1006
22.4 在无约束模式中使用DataGridView控件 1007 22.5 定制DataGridView控件 1012 22.5.1 定制题头单元格
1014 22.5.2 定制非题头单元格 1014 22.5.3 动态设置单元格样式 1020 22.6 使用约束模式 1026
22.7 BindingSource组件 1027 22.8 使用BindingNavigator控件 1031 22.9 绑定到单独的控件 1033
22.10 使用多个表 1037 22.11 小结 1038 22.12 练习 1039 附录A C++关键字 1040 A.1 ISO/ANSI
C++关键字 1040 A.2 C++/CLI关键字 1041 附录B ASCII码 1042 前言
  欢迎使用本书。通过使用本书,您可成为优秀的C++程序员。Microsoft公司的最新开发系统Visual Studio
2005支持两种截然不同但又紧密相关的C++语言。该系统完全支持原来的ISO/ANSI标准C++,同时还支持名为C++/CLI的新版C++。C++/CLI由Microsoft公司开发,现在是ECMA标准。这两种C++版本互为补充,各自完成不同的任务。ISO/ANSI
C++用于开发在本地计算机上运行的高性能应用程序,而C++/CLI专门为.NET
Framework开发。本书将讲述使用这两种C++版本开发应用程序的基础知识。.  当编写ISO/ANSI
C++程序时,我们可以从自动生成的代码中获得大量帮助,但仍然需要亲自编写大量C++代码。我们不仅需要对面向对象的编程技术有扎实的理解,而且需要充分了解Windows编程所涉及的方方面面。C++/CLI虽然针对.NET
Framework开发,但同时也是Windows Forms应用程序开发的载体。开发Windows
Forms程序经常只需要编写很少的代码,有时甚至不用编写代码。当然,当必须给Windows
Forms应用程序添加代码时,即使这部分代码只占到代码总量的很小比例,也仍然要求我们有较多的C++/CLI语言的知识。   ISO/ANSI
C++仍然是许多专业人员选用的语言,但C++/CLI和Windows
Forms应用程序带来的开发速度使得C++/CLI也成了基本的语言。因此,笔者决定在本书中包括这两种C++语言的基本内容。   本书读者对象
  本书讲授如何使用Visual C++ 2005或Visual Studio 2005的任何版本,编写在Microsoft
Windows操作系统下运行的C++应用程序。阅读本书不需要预先具备任何特定编程语言的知识。如果属于下列3种情形之一,那么您就适于学习本教程:
  ●具备少量其他语言的编程经验,比如BASIC或Pascal;渴望学习C++,并想提升实际的Microsoft Windows编程技能。
  ●有一些使用C或C++语言的经验,但使用环境不是Microsoft Windows;希望使用最新的工具和技术,扩充在Windows环境下编程的技能。
  ●属于编程新手,十分渴望投入编程世界,并最终掌握C++。要取得成功,您至少需要对计算机的工作原理有透彻的理解——包括内存的组织方式以及数据和指令的存储方式。
  本书主要内容   本书使用Visual C++
2005支持的两种技术,讲授C++编程的基础知识。详细介绍了两种风格的C++语言,使用Microsoft基本类(Microsoft Foundation
Classes,MFC)开发本地的ISO/ANSI C++ Windows应用程序,使用Windows Forms开发C++/CLI
Windows应用程序等知识。由于数据库技术在今天的重要性和普遍性,本书还介绍了可用于在MFC和 Windows
Forms应用程序中访问数据源的技术。与Windows
Forms应用程序相比,MFC应用程序相对来说属于编码密集型程序,原因是前者的创建过程使用了Visual C++
2005中的高级设计功能,可以以图形方式组装应用程序的整个图形用户界面(GUI),并使所有代码自动生成。因此,本书把较多的篇幅给予了MFC编程,而非Windows
Forms编程。   本书结构   本书内容的结构安排如下:  ●第1章介绍使用C++编写本地应用程序和.NET
Framework应用程序而需要理解的基本概念,以及在Visual C++ 2005开发环境中体现的主要思想。还叙述了如何使用Visual C++
2005的功能,来创建本书其余部分要学习的各种C++应用程序。
  ●第2~10章专门讲授两种C++语言版本,还讲述了调试过程中涉及的基本概念和技术。第2~10章的内容的组织方式都相似:各章的前半部分讨论ISO/ANSI
C++主题,后半部分讨论C++/CLI主题。   ●第11章讨论Microsoft
Windows应用程序的组织方式,并描述和展示了在所有Windows应用程序中都存在的基本元素。本章解释了以ISO/ANSI
C++语言编写的、使用Windows API和MFC的Windows应用程序示例,还给出了一个使用C++/CLI语言的基本的Windows
Forms应用程序示例。
  ●第12~17章详细描述了MFC提供的构建GUI的功能。我们将学习如何创建并使用通用控件来构建应用程序的图形用户界面,还将学习如何处理因用户与程序的交互作用而产生的事件。在此过程中,我们将创建一个具有相当规模的应用程序。除了学习构建GUI的技术以外,我们还将从开发该应用程序的过程中学到如何使用MFC来打印文档,以及如何在磁盘上保存文档。
  ●第18章讲述为使用MFC创建自己的库而需要知道的基本知识。我们将了解可以创建的不同种类的库,还将开发能够与前6章逐渐开发的应用程序协同工作的示例。
  ●第19、20两章讲述如何在MFC应用程序中访问数据源。我们首先了解到在只读模式中访问数据库的经验,然后再学习使用MFC更新数据库的基本编程技术。这两章的示例使用了可以从Web上下载的Northwind数据库,但我们也可以把这两章描述的技术应用于自己的数据源。
  ●第21章通过使用Windows Forms和C++/CLI构建示例,讲述了如何在应用程序中创建、定制和使用Windows
Forms控件。通过在本章从头至尾逐渐构建出一个完整的应用程序,我们将获得一定的实践经验。
  ●第22章以第21章获得的知识为基础,演示了可用来访问数据源的控件的工作原理,并讲述了定制这些控件的方法。我们还将学习如何在不编写任何代码的情况下,创建能够访问数据库的应用程序。
.  本书各章内容都包括许多示范所讨论的编程技术的示例。每章结束时的”小结”部分总结了该章所讲述的要点,大多数章都在最后给出了一组练习题,您可以应用所学的技术来试着解答这些练习题。练习题的答案连同书中的所有代码都可以从Web站点上下载(参见后面的”源代码”部分了解详细情况)。
  关于C++语言教程使用的示例都是使用简单的命令行输入和输出的控制台程序。这种方法使我们能够在不陷入复杂的Windows
GUI编程的情况下,学习C++的各种功能。实际上,我们只有在对编程语言有了透彻理解之后,才能进行Windows 编程。
  如果希望使学习过程尽可能简单,您最初可以只学习ISO/ANSI C++编程。讲授C++语言的各章(第2~10章)都是首先讨论特定方面的ISO/ANSI
C++功能,然后再讨论C++/CLI在相同的上下文中引入的新功能。以这种方式组织各章内容的原因在于,C++/CLI是作为ISO/ANSI标准语言的扩充定义的,因此对C++/CLI的理解是以对ISO/ANSI
C++的理解为基础的。因此,您可以只阅读第2~10章中的ISO/ANSI主题,而忽略跟在后面的C++/CLI部分。然后可以继续学习使用ISO/ANSI
C++的Windows应用程序开发部分,而免去记住两种语言版本的苦恼。在熟悉了ISO/ANSI
C++之后,您可以回头重新学习C++/CLI。当然,您也可以逐章进行学习,从而同步增加这两种C++语言版本的知识。   使用本书的前提..
  为了使用本书,您需要拥有Visual Studio 2005 Standard Edition、Visual Studio 2005
Professional Edition或者Visual Studio 2005 Team System。注意,Visual C++ Express
2005因不包括MFC而不能胜任。Visual Studio 2005要求操作系统是Windows XP Service Pack 2或Windows
2000 Service Pack 4。为了安装上述3种Visual Studio 2005版本,您的计算机需要有1
GHz的处理器,至少要有256MB的内存,系统驱动器上至少需要有1GB的可用空间,在安装驱动器上至少要有2GB的可用空间。为了安装随产品提供的完整MSDN文档,您在安装驱动器上需要有额外的1.8GB可用空间。
  书中的数据库示例使用了Northwind Traders数据库。通过在http://msdn.microsoft.com上搜索”Northwind
Traders”,可以找到该数据库的下载链接。当然,您可以把相应的示例改编成使用其他数据库。
  最为重要的是,为了使本书发挥最大功效,您需要有学习的愿望和掌握目前最强大的Windows编程工具的决心,需要有输入和完成所有示例、以及完成书中所有练习题的献身精神。这些要求听起来比较难,而实际上不然,您会惊讶于自己在相对较短的时间内就能达到的成就。记住,每一个学习编程的人都会不时陷入困境,但只要坚持不懈,错综复杂的问题必将变得越来越清晰,而您最终必将走出困境。本书将帮助您开始独立的实践,并由此成为成功的C++程序员。
  源代码
  在您登录到Wrox站点http://www.wrox.com/时,只需使用Search工具或使用书名列表就可以找到本书。接着在Code栏中单击Download链接,或单击本书信息页面上的Download
Code链接,就可以获得本书所有的源代码。另外,您也可以从本书的合作站点www.tupwk.com.cn/downpage上下载本书的所有源代码。
  从以上站点上下载的文件使用WinZip进行了压缩。在把文件保存到硬盘的一个文件夹中时,需要使用解压缩软件(如WinZip或PKUnzip)对该文件解压缩。在解压缩时,代码常常放在各自的章节文件夹中。在开始解压缩过程时,一定要将解压缩软件WinZip或PKUnzip设置为使用文件夹名。
  勘误表
  尽管我们已经尽了各种努力来保证文章或代码中不出现错误,但是错误总是难免的,如果您在本书中找到了错误,例如拼写错误或代码错误,请告诉我们,我们将非常感激。通过勘误表,可以让其他读者避免受挫,当然,这还有助于提供更高质量的信息。请给fwkbook@tup.tsinghua.edu.cn发电子邮件,我们就会检查您的信息,如果是正确的,就把它发送到该书的勘误表页面上,或在本书的后续版本中采用。
  要在网站上找到勘误表,可以登录http://www.wrox.com,通过Advanced
Search工具或书名列表查找本书,然后在本书的信息页面上,单击Book Errata链接。   E-Mail支持
  如果您希望直接就本书的问题向对本书知之甚多的专家咨询,那么,就向support@wrox.
com发电子邮件,在电子邮件的”主题”(Subject)栏中,加上本书的名称和ISBN的最后4位号码。典型的电子邮件应该包括下列内容:
  ●在”主题”栏加上英文书的书名、ISBN的最后4位数字(1974)和问题所在的页码。   ●在邮件的正文中加上您的姓名、联系信息和问题。
  我们不会发给您垃圾邮件。我们只需要详细的情况以节省您的宝贵时间和我们的时间。当您发送电子邮件时,它会直接链接到以下支持链:
  ●客户支持——您的消息会传送到我们的客户支持人员,他们是阅读信息的第一人。他们有常见问题的文件,会迅速回答一般性的问题。他们回答关于本书和网站的一般性问题。
  ●编辑支持——更深的问题会转发到负责本书的技术编辑处。他(或)她具有编程或特殊产品的经验,能够回答某个主题的详细技术问题。
  ●作者支持——最后,在编辑都不能回答问题的情况下(这种情况很少出现),这些问题将转发到作者。我们试图保护作者不要从写作中分心,但是,我们也很愿意将特殊的问题转发给他们。所有的Wrox作者帮助支持他们的书籍。他们向客户和编辑回复电子邮件,所有的读者都会从中受益。
  Wrox支持过程只能提供直接与已出版的图书相关的问题。对于超出此范围的问题可以通过http://p2p.wrox.com/论坛的团体列表来提供支持。
  p2p.wrox.com   P2P邮件列表是为作者和同行的讨论而设立的。我们在邮件列表、论坛和新闻组中提供”程序员到程序员的支持”(programmer
to programmer
support),还包括一对一的电子邮件支持系统。如果把问题发送给P2P,就可以相信,您的问题不仅仅是由支持专家解答,而且还要提供给我们邮件列表中的许多Wrox作者和其他业界专家。在p2p.wrox.com上,可以从许多不同的列表中获得帮助,不仅在阅读本书时获得帮助,还可以在开发应用程序时获得帮助。在网站的.NET类别中,最适合本书的是beginning_vb和vb_dotnet列表。
  要订阅一个邮件列表,可以遵循下面的步骤:  (1) 进入http://p2p.wrox.com。   (2) 从左侧的菜单栏中选择合适的列表。
  (3) 单击想加入的邮件列表。   (4) 按照指示订阅和填写电子邮件地址和密码。   (5) 回复接收到的确认电子邮件。   (6)
使用订阅管理器加入更多的列表,设置自己的邮件设置。   为什么这个系统提供最好的支持
  您可加入该邮件列表中,也可以每周分类接收它们。如果您没有时间或设备接收该邮件列表,可以搜索我们的在线文档。垃圾邮件和广告邮件会被删除,您自己的电子邮件地址会被独特的Lyris系统保护起来。任何加入或退出列表的查询,或者与列表相关的一般问题,都应发送到listsupport@p2p.wrox.com。



img

Visual C++ 2005入门经典–源代码及课后练习答案

CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251
该资料是《Visual C++ 2005入门经典》的源代码及课后练习答案 对应的书籍资料见: Visual C++ 2005入门经典 基本信息 原书名:
Ivor Horton’s Beginning Visual C++ 2005 原出版社:Wiley 作者:(美)Ivor Horton 译者:李颂华
康会光 出版社:清华大学出版社 ISBN:9787302142713 上架时间:2007-2-12 出版日期:2007 年1月 开本:16开 页码:1046
版次:1-1 编辑推荐   本书由编程语言先驱者Ivor Horton倾力而著,是国内第一本全面、深入介绍Visual C++ 2005的经典之作! 内容简介
  本书系编程语言先驱者Ivor Horton的经典之作,是学习C++编程最畅销的图书品种之一,不仅涵盖了Visual C++
.NET编程知识,还全面介绍了标准C++语言和.NET C++/CLI。本书延续了Ivor Horton讲解编程语言的独特方法,从中读者可以学习Visual
C++ 2005的基础知识,并全面掌握在MFC和Windows
Forms中访问数据源的技术。此外,本书各章后面的习题将有助于读者温故而知新,并尽快成为C++高效程序员。…   作译者   Ivor
Horton是世界著名的计算机图书作家,主要从事与编程相关的顾问及撰写工作,曾帮助无数程序员步入编程的殿堂。他曾在IBM工作多年,能使用多种语言进行编程(在多种机器上使用汇编语言和高级语言),设计和实现了实时闭环工业控制系统。Horton拥有丰富的教学经验(教学内容包括C、C++、Fortran、PL/1、APL等),同时还是机械、加工和电子CAD系统、机械CAM系统和DNC/CNC系统方面的专家。Ivor
Horton还著有Beginning Visual C++ 6、Beginning C Programming和Beginning Java
2等多部入门级好书。 目录 封面-18 前言-14 目录-9 第1章 使用Visual C++ 2005编程 1 1.1 .NET Framework
1 1.2 CLR 2 1.3 编写C++应用程序 3 1.4 学习Windows编程 4 1.4.1 学习C++ 4 1.4.2 C++标准 5
1.4.3 控制台应用程序 5 1.4.4 Windows编程概念 6 1.5 集成开发环境简介 7 1.6 使用IDE 9 1.6.1 工具栏选项 9
1.6.2 可停靠的工具栏 10 1.6.3 文档 11 1.6.4 项目和解决方案 11 1.6.5 设置Visual C++ 2005的选项 23
1.6.6 创建和执行Windows应用程序 24 1.6.7 创建Windows Forms应用程序 26 1.7 小结 29 第2章 数据、变量和计算
31 2.1 C++程序结构 31 2.1.1 程序注释 36 2.1.2 #include指令——头文件 37 2.1.3 命名空间和using声明 37
2.1.4 main()函数 38 2.1.5 程序语句 38 2.1.6 空白 40 2.1.7 语句块 41 2.1.8 自动生成的控制台程序 41
2.2 定义变量 42 2.2.1 命名变量 43 2.2.2 C++中的关键字 43 2.2.3 声明变量 44 2.2.4 变量的初值 44
2.3 基本数据类型 45 2.3.1 整型变量 45 2.3.2 字符数据类型 46 2.3.3 整型修饰符 47 2.3.4 布尔类型 48
2.3.5 浮点类型 48 2.3.6 ISO/ANSI C++中的基本类型 49 2.3.7 字面值 50 2.3.8 定义数据类型的同义词 50
2.3.9 具有特定值集的变量 51 2.3.10 指定枚举常量的类型 52 2.4 基本的输入/输出操作 53 2.4.1 从键盘输入 53
2.4.2 到命令行的输出 53 2.4.3 格式化输出 54 2.4.4 转义序列 55 2.5 C++中的计算 57 2.5.1 赋值语句 57
2.5.2 算术运算 58 2.5.3 计算余数 63 2.5.4 修改变量 63 2.5.5 增量和减量运算符 64 2.5.6 计算的顺序 66
2.6 变量类型和类型强制转换 67 2.6.1 对操作数进行类型强制转换的规则 68 2.6.2 赋值语句中的类型强制转换 69
2.6.3 显式类型强制转换 69 2.6.4 老式的类型强制转换 70 2.6.5 按位运算符 71 2.7 了解存储时间和作用域 76
2.7.1 自动变量 77 2.7.2 决定变量声明的位置 79 2.7.3 全局变量 79 2.7.4 静态变量 82 2.8 命名空间 83
2.8.1 声明命名空间 84 2.8.2 多个命名空间 86 2.9 C++/CLI编程 87 2.9.1 C++/CLI特有的基本数据类型 87
2.9.2 命令行上的C++/CLI输出 91 2.9.3 C++/CLI特有的功能——格式化输出 92 2.9.4 C++/CLI的键盘输入 94
2.9.5 使用safe_cast 95 2.9.6 C++/CLI枚举 96 2.10 小结 98 2.11 练习题 100 第3章 判断和循环 101
3.1 比较数据值 101 3.1.1 if语句 102 3.1.2 嵌套的if语句 103 3.1.3 扩展的if语句 105
3.1.4 嵌套的if-else语句 107 3.1.5 逻辑运算符和表达式 109 3.1.6 条件运算符 112 3.1.7 switch语句 114
3.1.8 无条件转移 116 3.2 重复执行语句块 117 3.2.1 循环的概念 117 3.2.2 for循环的变体 120
3.2.3 while循环 127 3.2.4 do-while循环 129 3.2.5 嵌套的循环 130 3.3 C++/CLI编程 133 3.4 小结
139 3.5 练习 140 第4章 数组、字符串和指针 141 4.1 处理多个相同类型的数据值 141 4.1.1 数组 142 4.1.2 声明数组
142 4.1.3 初始化数组 145 4.1.4 字符数组和字符串处理 147 4.1.5 多维数组 150 4.2 间接数据存取 153
4.2.1 指针的概念 153 4.2.2 声明指针 154 4.2.3 使用指针 155 4.2.4 初始化指针 157 4.2.5 sizeof运算符
162 4.2.6 常量指针和指向常量的指针 164 4.2.7 指针和数组 165 4.3 动态内存分配 172 4.3.1 堆的别名——自由存储器 172
4.3.2 new和delete运算符 172 4.3.3 为数组动态分配内存 173 4.3.4 多维数组的动态分配 176 4.4 使用引用 177
4.4.1 引用的概念 177 4.4.2 声明并初始化引用 177 4.5 C++/CLI编程 178 4.5.1 跟踪句柄 178 4.5.2 CLR数组
180 4.5.3 字符串 195 4.5.4 跟踪引用 203 4.5.5 内部指针 204 4.6 小结 206 4.7 练习 207
第5章 程序结构(1) 209 5.1 理解函数 209 5.1.1 需要函数的原因 210 5.1.2 函数的结构 210 5.1.3 使用函数 212
5.2 给函数传递实参 216 5.2.1 按值传递机制 217 5.2.2 给函数传递指针实参 218 5.2.3 给函数传递数组 219
5.2.4 给函数传递引用实参 224 5.2.5 使用const修饰符 226 5.2.6 main()函数的实参 227
5.2.7 接受数量不定的函数实参 229 5.3 从函数返回值 231 5.3.1 返回指针 231 5.3.2 返回引用 234
5.3.3 函数中的静态变量 236 5.4 递归函数调用 239 5.5 C++/CLI编程 241 5.5.1 接受数量可变实参的函数 242
5.5.2 main( )的实参 243 5.6 小结 244 5.7 练习 245 第6章 程序结构(2) 246 6.1 函数指针 246
6.1.1 声明函数指针 247 6.1.2 函数指针作为实参 250 6.1.3 函数指针的数组 251 6.2 初始化函数形参 252 6.3 异常
253 6.3.1 抛出异常 255 6.3.2 捕获异常 256 6.3.3 MFC中的异常处理 257 6.4 处理内存分配错误 258 6.5 函数重载
259 6.5.1 函数重载的概念 260 6.5.2 何时重载函数 262 6.6 函数模板 262 6.7 使用函数的示例 265 6.7.1 实现计算器
265 6.7.2 从字符串中删除空格 268 6.7.3 计算表达式的值 268 6.7.4 获得项值 271 6.7.5 分析数 272
6.7.6 整合程序 274 6.7.7 扩展程序 276 6.7.8 提取子字符串 277 6.7.9 运行修改过的程序 280 6.8 C++/CLI编程
280 6.8.1 理解类函数 281 6.8.2 CLR版本的计算器程序 287 6.9 小结 293 6.10 练习 293 第7章 自定义数据类型
295 7.1 C++中的结构 295 7.1.1 结构的概念 296 7.1.2 定义结构 296 7.1.3 初始化结构 296
7.1.4 访问结构的成员 297 7.1.5 伴随结构的智能帮助 300 7.1.6 RECT结构 301 7.1.7 使用指针处理结构 302
7.2 数据类型、对象、类和实例 303 7.2.1 类的起源 305 7.2.2 类的操作 305 7.2.3 术语 306 7.3 理解类 306
7.3.1 定义类 307 7.3.2 声明类的对象 307 7.3.3 访问类的数据成员 308 7.3.4 类的成员函数 310
7.3.5 成员函数定义的位置 312 7.3.6 内联函数 312 7.4 类构造函数 313 7.4.1 构造函数的概念 313
7.4.2 默认的构造函数 315 7.4.3 在类定义中指定默认的形参值 318 7.4.4 在构造函数中使用初始化列表 320 7.5 类的私有成员
320 7.5.1 访问私有类成员 323 7.5.2 类的友元函数 324 7.5.3 默认复制构造函数 326 7.6 this指针 328
7.7 类的const对象 331 7.7.1 类的const成员函数 331 7.7.2 类外部的成员函数定义 332 7.8 类对象的数组 333
7.9 类的静态成员 335 7.9.1 类的静态数据成员 335 7.9.2 类的静态函数成员 338 7.10 类对象的指针和引用 338
7.10.1 类对象的指针 338 7.10.2 类对象的引用 341 7.11 C++/CLI编程 343 7.11.1 定义数值类类型 344
7.11.2 定义引用类类型 348 7.11.3 类属性 351 7.11.4 initonly字段 364 7.11.5 静态构造函数 366
7.12 小结 367 7.13 练习 367 第8章 深入理解类 369 8.1 类的析构函数 369 8.1.1 析构函数的概念 369
8.1.2 默认的析构函数 370 8.1.3 析构函数与动态内存分配 372 8.2 实现复制构造函数 375 8.3 在变量之间共享内存 377
8.3.1 定义联合 377 8.3.2 匿名联合 379 8.3.3 类和结构中的联合 379 8.4 运算符重载 379 8.6.2 实现重载的运算符
380 8.4.2 实现对运算符的完全支持 383 8.4.3 重载赋值运算符 387 8.4.4 重载加法运算符 392 8.4.5 重载递增和递减运算符
396 8.5 类模板 396 8.5.1 定义类模板 397 8.5.2 根据类模板创建对象 400 8.5.3 使用有多个形参的类模板 403
8.6 使用类 405 8.6.1 类接口的概念 405 8.6.2 定义问题 405 8.6.3 实现CBox类 406 8.6.4 定义CBox类 413
8.6.5 使用CBox类 423 8.7 组织程序代码 426 8.8 C++/CLI编程 428 8.8.1 在数值类中重载运算符 429
8.8.2 重载递增和递减运算符 434 8.8.3 在引用类中重载运算符 435 8.9 小结 437 8.10 练习 438 第9章 类继承和虚函数
440 9.1 面向对象编程的基本思想 440 9.2 类的继承 441 9.2.1 基类的概念 442 9.2.2 基类的派生类 442
9.3 继承机制下的访问控制 446 9.3.1 派生类中构造函数的操作 448 9.3.2 声明类的保护成员 452 9.3.3 继承类成员的访问级别
455 9.4 派生类中的复制构造函数 456 9.5 友元类成员 461 9.5.1 友元类 462 9.5.2 对类友元关系的限制 462 9.6 虚函数
462 9.6.1 虚函数的概念 465 9.6.2 使用指向类对象的指针 467 9.6.3 使用引用处理虚函数 469 9.6.4 纯虚函数 470
9.6.5 抽象类 471 9.6.6 间接基类 474 9.6.7 虚析构函数 476 9.7 类类型之间的强制转换 481 9.8 嵌套类 482
9.9 C++/CLI编程 485 9.9.1 C++/CLI类的继承 486 9.9.2 接口类 492 9.9.3 定义接口类 492
9.9.4 类和程序集 496 9.9.5 被指定为new的函数 501 9.9.6 委托和事件 502 9.9.7 引用类的析构函数和结束函数 514
9.9.8 通用类 516 9.10 小结 527 9.11 练习 528 第10章 调试技术 531 10.1 理解调试 531 10.1.1 程序故障
532 10.1.2 常见故障 533 10.2 基本的调试操作 534 10.2.1 设置断点 536 10.2.2 设置跟踪点 538
10.2.3 启动调试模式 538 10.2.4 修改变量的值 542 10.3 添加调试代码 542 10.3.1 使用断言 543
10.3.2 添加自己的调试代码 544 10.4 调试程序 549 10.4.1 调用堆栈 549 10.4.2 单步执行到出错位置 551
10.5 测试扩展的类 555 10.6 调试动态内存 558 10.6.1 检查自由存储器的函数 558 10.6.2 控制自由存储器的调试操作 559
10.6.3 自由存储器的调试输出 561 10.7 调试C++/CLI程序 566 10.8 小结 575 第11章 Windows编程的概念 576
11.1 Windows编程基础 576 11.1.1 窗口的元素 577 11.1.2 Windows程序与操作系统 579 11.1.3 事件驱动型程序
579 11.1.4 Windows消息 579 11.1.5 Windows API 580 11.1.6 Windows数据类型 580
11.1.7 Windows程序中的符号 581 11.2 Windows程序的结构 582 11.2.1 WinMain()函数 583
11.2.2 消息处理函数 594 11.2.3 简单的Windows程序 598 11.3 Windows程序的组织 600 11.4 MFC 601
11.4.1 MFC标记法 601 11.4.2 MFC程序的组织方式 602 11.5 使用Windows Forms 606 11.6 小结 608
第12章 使用MFC编写Windows程序 609 12.1 MFC的文档/视图概念 609 12.1.1 文档的概念 609 12.1.2 文档界面 610
12.1.3 视图的概念 610 12.1.4 连接文档和视图 611 12.1.5 应用程序和MFC 612 12.2 创建MFC应用程序 613
12.2.1 创建SDI应用程序 615 12.2.2 MFC Application wizard的输出 618 12.2.3 创建MDI应用程序 628
12.3 小结 630 12.4 练习 631 第13章 处理菜单和工具栏 632 13.1 与Windows进行通信 632 13.1.1 了解消息映射
633 13.1.2 消息类别 635 13.1.3 处理程序中的消息 636 13.2 扩充Sketcher程序 637 13.3 菜单的元素 638
13.4 为菜单消息添加处理程序 642 13.4.1 选择处理菜单消息的类 643 13.4.2 创建菜单消息函数 643
13.4.3 编写菜单消息函数的代码 646 13.4.4 添加更新用户界面的消息处理程序 650 13.5 添加工具栏按钮 653
13.5.1 编辑工具栏按钮的属性 654 13.5.2 练习使用工具栏按钮 655 13.5.3 添加工具提示 656 13.6 小结 656
13.7 练习题 657 第14章 在窗口中绘图 658 14.1 窗口绘图的基础知识 658 14.1.1 窗口客户区 659
14.1.2 Windows图形设备界面 659 14.2 Visual C++中的绘图机制 662 14.2.1 应用程序中的视图类 662
14.2.2 CDC类 663 14.3 实际绘制图形 671 14.4 对鼠标进行编程 673 14.4.1 鼠标发出的消息 673
14.4.2 鼠标消息处理程序 675 14.4.3 使用鼠标绘图 677 14.5 练习使用Sketcher程序 700 14.5.1 运行这个示例 700
14.5.2 捕获鼠标消息 701 14.6 小结 703 14.7 练习题 703 第15章 创建文档和改进视图 705 15.1 什么是集合类 705
15.1.1 集合的类型 705 15.1.2 类型安全的集合类 706 15.1.3 对象集合 706 15.1.4 类型化指针集合 715
15.2 使用CList模板类 717 15.2.1 绘制曲线 718 15.2.2 定义CCurve类 719 15.2.3 实现CCurve类 720
15.2.4 练习使用CCurve类 722 15.3 创建文档 723 15.4 改进视图 728 15.4.1 更新多个视图 728
15.4.2 滚动视图 730 15.4.3 使用MM_LOENGLISH映射模式 734 15.5 删除和移动形状 735 15.6 实现上下文菜单 736
15.6.1 关联菜单和类 737 15.6.2 选择上下文菜单 739 15.6.3 醒目显示元素 744 15.6.4 处理菜单消息 749
15.7 处理被屏蔽的元素 756 15.8 小结 757 15.9 练习 758 第16章 使用对话框和控件 759 16.1 理解对话框 759
16.2 理解控件 760 16.3 创建对话框资源 761 16.4 对话框的编程 764 16.4.1 添加对话框类 764
16.4.2 模态和非模态对话框 765 16.4.3 显示对话框 765 16.5 支持对话框控件 768 16.5.1 初始化控件 769
16.5.2 处理单选按钮消息 770 16.6 完成对话框的操作 771 16.6.1 给文档类添加存储线宽的成员 772 16.6.2 给元素添加线宽
772 16.6.3 在视图中创建元素 773 16.6.4 练习使用对话框 774 16.7 使用微调按钮控件 775
16.7.1 添加Scale菜单项和工具栏按钮 775 16.7.2 创建微调按钮 776 16.7.3 生成比例对话框类 777 16.7.4 显示微调按钮
780 16.8 使用比例系数 781 16.8.1 可缩放的映射模式 781 16.8.2 设置文档的大小 783 16.8.3 设置映射模式 783
16.8.4 同时实现滚动与缩放 785 16.9 使用状态栏 787 16.10 使用列表框 791 16.10.1 删除比例对话框 791
16.10.2 创建列表框控件 792 16.11 使用编辑框控件 795 16.11.1 创建编辑框资源 795 16.11.2 创建对话框类 796
16.11.3 添加Text菜单项 798 16.11.4 定义文本元素 799 16.11.5 实现CText类 800 16.11.6 创建文本元素
801 16.12 小结 803 16.13 练习 804 第17章 存储和打印文档 805 17.1 了解串行化 805 17.2 串行化文档 806
17.2.1 文档类定义中的串行化 806 17.2.2 文档类实现中的串行化 807 17.2.3 基于CObject的类的功能 809
17.2.4 串行化的工作方式 810 17.2.5 如何实现类的串行化 811 17.3 应用串行化 812 17.3.1 记录文档修改 812
17.3.2 串行化文档 813 17.3.3 串行化元素类 814 17.4 练习串行化 818 17.5 移动文本 819 17.6 打印文档 821
17.7 实现多页打印 824 17.7.1 获取文档的总尺寸 825 17.7.2 存储打印数据 825 17.7.3 准备打印 826
17.7.4 打印后的清除 828 17.7.5 准备设备上下文 828 17.7.6 打印文档 829 17.7.7 获得文档的打印输出 833
17.8 小结 833 17.9 练习题 834 第18章 编写自己的DLL 835 18.1 了解DLL 835 18.1.1 DLL的工作方式 836
18.1.2 DLL的内容 838 18.1.3 DLL变体 839 18.2 决定放入DLL的内容 840 18.3 编写DLL 841
18.3.1 编写和使用扩展DLL 841 18.3.2 从DLL中导出变量和函数 848 18.3.3 将符号导入程序 849
18.3.4 实现符号从DLL的导出 849 18.4 小结 852 18.5 练习题 852 第19章 连接到数据源 853 19.1 数据库基础知识
853 19.2 SQL 855 19.2.1 使用SQL检索数据 856 19.2.2 使用SQL连接表 857 19.2.3 对记录进行排序 859
19.3 MFC中的数据库支持 859 19.4 创建数据库应用程序 861 19.4.1 注册ODBC数据库 861 19.4.2 生成MFC ODBC程序
862 19.4.3 了解程序结构 865 19.4.4 示例练习 875 19.5 对记录集进行排序 876 19.6 使用另一个记录集对象 877
19.6.1 添加记录集类 878 19.6.2 添加记录集的视图类 880 19.6.3 定制记录集 884 19.6.4 访问多个表视图 887
19.6.5 查看产品的订单 892 19.7 查看客户的详细情况 893 19.7.1 添加客户记录集 893 19.7.2 创建客户对话框资源 894
19.7.3 创建客户视图类 894 19.7.4 添加过滤器 896 19.7.5 实现过滤器参数 898 19.7.6 链接订单对话框和客户对话框 899
19.7.7 练习使用数据库查看器 902 19.8 小结 902 19.9 练习题 902 第20章 更新数据源 904 20.1 更新操作 904
20.1.1 CRecordset更新操作 905 20.1.2 事务 907 20.2 简单的更新示例 908 20.3 管理更新过程 911
20.4 向表中添加行 922 20.4.1 订单录入过程 922 20.4.2 创建资源 923 20.4.3 创建记录集 924
20.4.4 创建记录集视图 924 20.4.5 给对话框资源添加控件 929 20.4.6 实现对话框切换 932 20.4.7 创建订单ID 936
20.4.8 存储订单数据 941 20.4.9 为订单选择产品 943 20.4.10 添加新订单 945 20.5 小结 950 20.6 练习 950
第21章 使用Windows Forms的应用程序 952 21.1 理解Windows Forms 952 21.2 理解Windows Forms应用程序
953 21.2.1 修改窗体的属性 954 21.2.2 如何启动应用程序 955 21.3 定制应用程序GUI 956 21.3.1 给窗体添加控件
957 21.3.2 添加选项卡控件 960 21.3.3 使用GroupBox控件 962 21.3.4 使用Button控件 964
21.3.5 使用WebBrowser控件 965 21.3.6 Winning应用程序的操作 967 21.3.7 添加上下文菜单 967
21.3.8 创建事件处理程序 967 21.3.9 处理Limits菜单的事件 974 21.3.10 创建对话框 974 21.3.11 使用对话框
979 21.3.12 添加第二个对话框 985 21.3.13 实现Help | About菜单项 992 21.3.14 处理按钮单击事件 993
21.3.15 响应上下文菜单 996 21.4 小结 1002 21.5 练习 1003 第22章 在Windows Forms应用程序中访问数据源
1004 22.1 使用数据源 1004 22.2 访问并显示数据 1005 22.3 使用DataGridView控件 1006
22.4 在无约束模式中使用DataGridView控件 1007 22.5 定制DataGridView控件 1012 22.5.1 定制题头单元格
1014 22.5.2 定制非题头单元格 1014 22.5.3 动态设置单元格样式 1020 22.6 使用约束模式 1026
22.7 BindingSource组件 1027 22.8 使用BindingNavigator控件 1031 22.9 绑定到单独的控件 1033
22.10 使用多个表 1037 22.11 小结 1038 22.12 练习 1039 附录A C++关键字 1040 A.1 ISO/ANSI
C++关键字 1040 A.2 C++/CLI关键字 1041 附录B ASCII码 1042 前言
  欢迎使用本书。通过使用本书,您可成为优秀的C++程序员。Microsoft公司的最新开发系统Visual Studio
2005支持两种截然不同但又紧密相关的C++语言。该系统完全支持原来的ISO/ANSI标准C++,同时还支持名为C++/CLI的新版C++。C++/CLI由Microsoft公司开发,现在是ECMA标准。这两种C++版本互为补充,各自完成不同的任务。ISO/ANSI
C++用于开发在本地计算机上运行的高性能应用程序,而C++/CLI专门为.NET
Framework开发。本书将讲述使用这两种C++版本开发应用程序的基础知识。.  当编写ISO/ANSI
C++程序时,我们可以从自动生成的代码中获得大量帮助,但仍然需要亲自编写大量C++代码。我们不仅需要对面向对象的编程技术有扎实的理解,而且需要充分了解Windows编程所涉及的方方面面。C++/CLI虽然针对.NET
Framework开发,但同时也是Windows Forms应用程序开发的载体。开发Windows
Forms程序经常只需要编写很少的代码,有时甚至不用编写代码。当然,当必须给Windows
Forms应用程序添加代码时,即使这部分代码只占到代码总量的很小比例,也仍然要求我们有较多的C++/CLI语言的知识。   ISO/ANSI
C++仍然是许多专业人员选用的语言,但C++/CLI和Windows
Forms应用程序带来的开发速度使得C++/CLI也成了基本的语言。因此,笔者决定在本书中包括这两种C++语言的基本内容。   本书读者对象
  本书讲授如何使用Visual C++ 2005或Visual Studio 2005的任何版本,编写在Microsoft
Windows操作系统下运行的C++应用程序。阅读本书不需要预先具备任何特定编程语言的知识。如果属于下列3种情形之一,那么您就适于学习本教程:
  ●具备少量其他语言的编程经验,比如BASIC或Pascal;渴望学习C++,并想提升实际的Microsoft Windows编程技能。
  ●有一些使用C或C++语言的经验,但使用环境不是Microsoft Windows;希望使用最新的工具和技术,扩充在Windows环境下编程的技能。
  ●属于编程新手,十分渴望投入编程世界,并最终掌握C++。要取得成功,您至少需要对计算机的工作原理有透彻的理解——包括内存的组织方式以及数据和指令的存储方式。
  本书主要内容   本书使用Visual C++
2005支持的两种技术,讲授C++编程的基础知识。详细介绍了两种风格的C++语言,使用Microsoft基本类(Microsoft Foundation
Classes,MFC)开发本地的ISO/ANSI C++ Windows应用程序,使用Windows Forms开发C++/CLI
Windows应用程序等知识。由于数据库技术在今天的重要性和普遍性,本书还介绍了可用于在MFC和 Windows
Forms应用程序中访问数据源的技术。与Windows
Forms应用程序相比,MFC应用程序相对来说属于编码密集型程序,原因是前者的创建过程使用了Visual C++
2005中的高级设计功能,可以以图形方式组装应用程序的整个图形用户界面(GUI),并使所有代码自动生成。因此,本书把较多的篇幅给予了MFC编程,而非Windows
Forms编程。   本书结构   本书内容的结构安排如下:  ●第1章介绍使用C++编写本地应用程序和.NET
Framework应用程序而需要理解的基本概念,以及在Visual C++ 2005开发环境中体现的主要思想。还叙述了如何使用Visual C++
2005的功能,来创建本书其余部分要学习的各种C++应用程序。
  ●第2~10章专门讲授两种C++语言版本,还讲述了调试过程中涉及的基本概念和技术。第2~10章的内容的组织方式都相似:各章的前半部分讨论ISO/ANSI
C++主题,后半部分讨论C++/CLI主题。   ●第11章讨论Microsoft
Windows应用程序的组织方式,并描述和展示了在所有Windows应用程序中都存在的基本元素。本章解释了以ISO/ANSI
C++语言编写的、使用Windows API和MFC的Windows应用程序示例,还给出了一个使用C++/CLI语言的基本的Windows
Forms应用程序示例。
  ●第12~17章详细描述了MFC提供的构建GUI的功能。我们将学习如何创建并使用通用控件来构建应用程序的图形用户界面,还将学习如何处理因用户与程序的交互作用而产生的事件。在此过程中,我们将创建一个具有相当规模的应用程序。除了学习构建GUI的技术以外,我们还将从开发该应用程序的过程中学到如何使用MFC来打印文档,以及如何在磁盘上保存文档。
  ●第18章讲述为使用MFC创建自己的库而需要知道的基本知识。我们将了解可以创建的不同种类的库,还将开发能够与前6章逐渐开发的应用程序协同工作的示例。
  ●第19、20两章讲述如何在MFC应用程序中访问数据源。我们首先了解到在只读模式中访问数据库的经验,然后再学习使用MFC更新数据库的基本编程技术。这两章的示例使用了可以从Web上下载的Northwind数据库,但我们也可以把这两章描述的技术应用于自己的数据源。
  ●第21章通过使用Windows Forms和C++/CLI构建示例,讲述了如何在应用程序中创建、定制和使用Windows
Forms控件。通过在本章从头至尾逐渐构建出一个完整的应用程序,我们将获得一定的实践经验。
  ●第22章以第21章获得的知识为基础,演示了可用来访问数据源的控件的工作原理,并讲述了定制这些控件的方法。我们还将学习如何在不编写任何代码的情况下,创建能够访问数据库的应用程序。
.  本书各章内容都包括许多示范所讨论的编程技术的示例。每章结束时的”小结”部分总结了该章所讲述的要点,大多数章都在最后给出了一组练习题,您可以应用所学的技术来试着解答这些练习题。练习题的答案连同书中的所有代码都可以从Web站点上下载(参见后面的”源代码”部分了解详细情况)。
  关于C++语言教程使用的示例都是使用简单的命令行输入和输出的控制台程序。这种方法使我们能够在不陷入复杂的Windows
GUI编程的情况下,学习C++的各种功能。实际上,我们只有在对编程语言有了透彻理解之后,才能进行Windows 编程。
  如果希望使学习过程尽可能简单,您最初可以只学习ISO/ANSI C++编程。讲授C++语言的各章(第2~10章)都是首先讨论特定方面的ISO/ANSI
C++功能,然后再讨论C++/CLI在相同的上下文中引入的新功能。以这种方式组织各章内容的原因在于,C++/CLI是作为ISO/ANSI标准语言的扩充定义的,因此对C++/CLI的理解是以对ISO/ANSI
C++的理解为基础的。因此,您可以只阅读第2~10章中的ISO/ANSI主题,而忽略跟在后面的C++/CLI部分。然后可以继续学习使用ISO/ANSI
C++的Windows应用程序开发部分,而免去记住两种语言版本的苦恼。在熟悉了ISO/ANSI
C++之后,您可以回头重新学习C++/CLI。当然,您也可以逐章进行学习,从而同步增加这两种C++语言版本的知识。   使用本书的前提..
  为了使用本书,您需要拥有Visual Studio 2005 Standard Edition、Visual Studio 2005
Professional Edition或者Visual Studio 2005 Team System。注意,Visual C++ Express
2005因不包括MFC而不能胜任。Visual Studio 2005要求操作系统是Windows XP Service Pack 2或Windows
2000 Service Pack 4。为了安装上述3种Visual Studio 2005版本,您的计算机需要有1
GHz的处理器,至少要有256MB的内存,系统驱动器上至少需要有1GB的可用空间,在安装驱动器上至少要有2GB的可用空间。为了安装随产品提供的完整MSDN文档,您在安装驱动器上需要有额外的1.8GB可用空间。
  书中的数据库示例使用了Northwind Traders数据库。通过在http://msdn.microsoft.com上搜索”Northwind
Traders”,可以找到该数据库的下载链接。当然,您可以把相应的示例改编成使用其他数据库。
  最为重要的是,为了使本书发挥最大功效,您需要有学习的愿望和掌握目前最强大的Windows编程工具的决心,需要有输入和完成所有示例、以及完成书中所有练习题的献身精神。这些要求听起来比较难,而实际上不然,您会惊讶于自己在相对较短的时间内就能达到的成就。记住,每一个学习编程的人都会不时陷入困境,但只要坚持不懈,错综复杂的问题必将变得越来越清晰,而您最终必将走出困境。本书将帮助您开始独立的实践,并由此成为成功的C++程序员。
  源代码
  在您登录到Wrox站点http://www.wrox.com/时,只需使用Search工具或使用书名列表就可以找到本书。接着在Code栏中单击Download链接,或单击本书信息页面上的Download
Code链接,就可以获得本书所有的源代码。另外,您也可以从本书的合作站点www.tupwk.com.cn/downpage上下载本书的所有源代码。
  从以上站点上下载的文件使用WinZip进行了压缩。在把文件保存到硬盘的一个文件夹中时,需要使用解压缩软件(如WinZip或PKUnzip)对该文件解压缩。在解压缩时,代码常常放在各自的章节文件夹中。在开始解压缩过程时,一定要将解压缩软件WinZip或PKUnzip设置为使用文件夹名。
  勘误表
  尽管我们已经尽了各种努力来保证文章或代码中不出现错误,但是错误总是难免的,如果您在本书中找到了错误,例如拼写错误或代码错误,请告诉我们,我们将非常感激。通过勘误表,可以让其他读者避免受挫,当然,这还有助于提供更高质量的信息。请给fwkbook@tup.tsinghua.edu.cn发电子邮件,我们就会检查您的信息,如果是正确的,就把它发送到该书的勘误表页面上,或在本书的后续版本中采用。
  要在网站上找到勘误表,可以登录http://www.wrox.com,通过Advanced
Search工具或书名列表查找本书,然后在本书的信息页面上,单击Book Errata链接。   E-Mail支持
  如果您希望直接就本书的问题向对本书知之甚多的专家咨询,那么,就向support@wrox.
com发电子邮件,在电子邮件的”主题”(Subject)栏中,加上本书的名称和ISBN的最后4位号码。典型的电子邮件应该包括下列内容:
  ●在”主题”栏加上英文书的书名、ISBN的最后4位数字(1974)和问题所在的页码。   ●在邮件的正文中加上您的姓名、联系信息和问题。
  我们不会发给您垃圾邮件。我们只需要详细的情况以节省您的宝贵时间和我们的时间。当您发送电子邮件时,它会直接链接到以下支持链:
  ●客户支持——您的消息会传送到我们的客户支持人员,他们是阅读信息的第一人。他们有常见问题的文件,会迅速回答一般性的问题。他们回答关于本书和网站的一般性问题。
  ●编辑支持——更深的问题会转发到负责本书的技术编辑处。他(或)她具有编程或特殊产品的经验,能够回答某个主题的详细技术问题。
  ●作者支持——最后,在编辑都不能回答问题的情况下(这种情况很少出现),这些问题将转发到作者。我们试图保护作者不要从写作中分心,但是,我们也很愿意将特殊的问题转发给他们。所有的Wrox作者帮助支持他们的书籍。他们向客户和编辑回复电子邮件,所有的读者都会从中受益。
  Wrox支持过程只能提供直接与已出版的图书相关的问题。对于超出此范围的问题可以通过http://p2p.wrox.com/论坛的团体列表来提供支持。
  p2p.wrox.com   P2P邮件列表是为作者和同行的讨论而设立的。我们在邮件列表、论坛和新闻组中提供”程序员到程序员的支持”(programmer
to programmer
support),还包括一对一的电子邮件支持系统。如果把问题发送给P2P,就可以相信,您的问题不仅仅是由支持专家解答,而且还要提供给我们邮件列表中的许多Wrox作者和其他业界专家。在p2p.wrox.com上,可以从许多不同的列表中获得帮助,不仅在阅读本书时获得帮助,还可以在开发应用程序时获得帮助。在网站的.NET类别中,最适合本书的是beginning_vb和vb_dotnet列表。
  要订阅一个邮件列表,可以遵循下面的步骤:  (1) 进入http://p2p.wrox.com。   (2) 从左侧的菜单栏中选择合适的列表。
  (3) 单击想加入的邮件列表。   (4) 按照指示订阅和填写电子邮件地址和密码。   (5) 回复接收到的确认电子邮件。   (6)
使用订阅管理器加入更多的列表,设置自己的邮件设置。   为什么这个系统提供最好的支持
  您可加入该邮件列表中,也可以每周分类接收它们。如果您没有时间或设备接收该邮件列表,可以搜索我们的在线文档。垃圾邮件和广告邮件会被删除,您自己的电子邮件地址会被独特的Lyris系统保护起来。任何加入或退出列表的查询,或者与列表相关的一般问题,都应发送到listsupport@p2p.wrox.com。



img

Visual C++音频/视频处理技术及工程实践 (分卷1)

本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual
C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642
DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地介绍Visual C++
2005进行流媒体编程的基本思路和方法,采用案例为主的叙述方式,将大量的技术理论融入具体的案例剖析中。采用的案例均来源于作者实际开发工作,具有很好的实用价值,可以帮助读者在开发中进行参考或直接应用。
第1篇 开发基础 1 第1章 数字音视频开发技术基础 3 1.1 数字音视频基本概念 4 1.1.1 数字音频技术基础 4 1.1.2
各种数字音频文件格式基础 4 1.1.3 视频的相关基础概念 8 1.1.4 常见的视频文件格式 8 1.2 数字音视频数据的编解码技术 10 1.2.1
音频数据的编解码 11 1.2.2 视频数据的编解码 13 1.2.3 音视频编码的相关标准 13 1.3 音视频处理平台的选择 15 1.3.1
个人多媒体计算机 15 1.3.2 嵌入式处理器ARM 16 1.3.3 数字媒体处理器DSP 16 1.4 音视频开发的典型应用 16 1.4.1
个人消费类电子产品 16 1.4.2 公共领域的音视频应用 18 1.5 常用音视频开发工具 21 1.5.1 DirectSound音频开发 21
1.5.2 DirectShow视频开发 21 1.5.3 DSP CCS算法开发 22 1.6 本章小结 23 第2章 Visual C++
2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26
2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用程序 27 2.2.2 生成基于MFC的应用程序 32
2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2
生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 2.4.3
常用消息 66 2.5 基于对话框的编程 68 2.5.1 创建和编辑对话框 68 2.5.2 对话框种类 75 2.6 常用控件使用技巧 79 2.6.1
按钮类控件的使用 80 2.6.2 文本可编辑类控件的使用 81 2.6.3 静态类控件的使用 82 2.6.4 其他控件 83 2.7 Visual
2005开发技术资源 84 2.7.1 MSDN在线帮助 84 2.7.2 丰富的网络资源 86 2.8 Visual 2005开发的常见问题 86
2.8.1 如何使用volatile和const_cast 86 2.8.2 如何构造unicode版本的程序 87 2.8.3 如何使用.def文件 87
2.8.4 如何正确编写Win32 DLL 87 2.8.5 如何编写和使用资源DLL 88 2.8.6 如何实现对话框的数据交换 88 2.9 本章小结
89 第2篇 音频开发 91 第3章 DirectSound开发基础 93 3.1 Microsoft DirectSound SDK 94 3.1.1
比较DirectSound与DirectMusic 94 3.1.2 DirectSound SDK能做什么 95 3.1.3 如何获取DirectSound
SDK 96 3.1.4 DirectSound SDK的基本结构 98 3.1.5 Directsound SDK安装 100 3.1.6
选择最适合用户的DirectSound SDK 100 3.1.7 用DirectSound进行编程的必要步骤 102 3.2
DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107
3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119
3.3.2 DirectSound应用程序的开发环境配置 119 3.3.3 DirectSound Filter开发环境配置 121 3.4
调试音频处理程序 125 3.4.1 Visual C++调试器 125 3.4.2 DirectSound中常用的调试技术 128 3.5
DirectSound开发的常见问题 130 3.6 本章小结 131 第4章 打造自己的音频播放器 133 4.1 系统设计和分析 134 4.2
缓冲区和通知基础 135 4.2.1 缓冲区的概念 135 4.2.2 缓冲区的通知 136 4.3 播放文件 137 4.3.1
创建DirectSound对象 137 4.3.2 创建播放缓冲区 138 4.3.3 调用方法播放声音 145 4.3.4 结束播放 146 4.4
系统效果演示 146 4.4.1 新建基于对话框的程序框架 147 4.4.2 添加控件及变量 147 4.4.3
封装CDirectSound类实现DirectSound声音播放 148 4.4.4 与对话框界面相关操作实现 156 4.4.5 程序运行结果 159
4.5 DirectSound开发常见问题 160 4.6 本章小结 161 第5章 语音3D特效器制作 163 5.1 系统设计和分析 164 5.2
DirectSound 3D缓冲区 164 5.2.1 获取3D缓冲区对象 165 5.2.2 最大距离和最小距离 166 5.2.3 处理模式 167
5.2.4 声音圆锥 167 5.3 DirectSound 3D虚拟听众 168 5.3.1 获得3D听众 168 5.3.2 听众的空间参数 169
5.3.3 距离因子与Doppler效应 171 5.3.4 滚降因子与延迟设置 173 5.4 系统效果演示 174 5.4.1 具体的实现步骤 174
5.4.2 程序的实现代码 176 5.4.3 程序运行结果 186 5.5 DirectSound 3D开发常见问题 187 5.6 本章小结 188
第6章 对拾音设备录制自己的语音文件 189 6.1 系统分析和设计 190 6.2 管理捕获缓冲区 191 6.2.1 创建捕获缓冲区 191 6.2.2
启动缓冲区 197 6.2.3 封锁缓冲区 197 6.2.4 解锁缓冲区 198 6.2.5 中止捕获 199 6.3 系统效果演示 199 6.3.1
声音类的封装 199 6.3.2 声音管理函数的实现 202 6.3.3 程序运行结果 214 6.4 DirectSound录制语音文件开发常见问题 215
6.5 本章小结 216 第3篇 视频开发 217 第7章 DirectShow开发基础 219 7.1 Microsoft DirectShow SDK
220 7.1.1 DirectX及成员组成 220 7.1.2 DirectShow SDK能做什么 221 7.1.3 如何获取DirectShow
SDK 221 7.1.4 安装Direshow SDK 222 7.2 开发环境配置 224 7.2.1 生成DirectShow SDK开发库 224
7.2.2 Visual C++开发环境配置 229 7.2.3 常见问题解析集锦 232 7.3 DirectShow SDK基本架构 234 7.3.1
DirectShow SDK总体架构 234 7.3.2 DirectShow SDK简单应用程序案例 236 7.3.3 滤波器链表Filer
Graph及各种组件 244 7.3.4 构建滤波器链表(Building Filer Graph) 252 7.3.5 滤波器链表中的数据流动Data
Flow 257 7.3.6 DirectShow中的事件通知机制 261 7.3.7 常用DirectShow SDK接口 267 7.4
DirectShow SDK常用开发案例 267 7.4.1 通用开发流程 268 7.4.2 系统初始化 268 7.4.3 媒体播放方法 268
7.4.4 消息处理方法 270 7.4.5 视频采集技术 271 7.4.6 音频采集案例 282 7.5 本章小结 293 第8章 打造自己的媒体播放器
295 8.1 系统分析与设计 296 8.1.1 FilterGraph结构设计 297 8.1.2 GraphEdit模拟实现 297 8.1.3
界面设计 299 8.2 实现媒体控制类 307 8.2.1 CDXGraph类初始化 308 8.2.2 创建Graph滤波器链表 309 8.2.3
图像窗口设计 311 8.2.4 媒体播放控制 312 8.2.5 全屏显示及抓图存盘实现 315 8.3 实现一个简单的媒体播放器 317 8.4
升级你的播放器 321 8.6.2 添加控制功能 321 8.4.2 添加拖放功能 325 8.4.3 添加音量调节功能 326 8.4.4 添加欢迎背景图片
328 8.5 系统效果展示 328 8.6 如何播放更多的文件格式 329 8.7 本章小结 330 第9章 自制DV实现视频采集 331 9.1
系统分析与设计 332 9.1.1 采集设备的枚举 332 9.1.2 使用Capture Graph Builder 335 9.1.3 采集参数的设置
336 9.2 使用经典采集技术实现视频捕获 338 9.2.1 GraphEdit模拟实现 338 9.2.2 视频捕获类CCaptureClass的实现
340 9.2.3 界面设计 345 9.3 使用VMR技术实现视频图像捕获 350 9.3.1 VMR技术基础 350 9.3.2
GraphEdit模拟实现视频捕获预览 350 9.3.3 视频图像捕获类CVMR_Capture的实现 353 9.3.4 界面设计 361 9.4
系统效果演示 366 9.4.1 实例一 系统效果演示 367 9.4.2 实例二 系统效果演示 368 9.5 本章小结 369 第10章
VFW技术实现视频处理通用平台 371 10.1 VFW开发技术流程分析 372 10.1.1 技术概述 372 10.1.2 VFW采集开发流程图 373
10.2 使用VFW实现视频捕获和预览 373 10.2.1 建立单文档应用程序 373 10.2.2 创建视频窗口 375 10.2.3 设计回调函数
376 10.2.4 视频图像显示设置 378 10.2.5 捕获预览视频 379 10.2.6 配置视频格式及图像参数 381 10.3
使用系统插件实现视频编解码 382 10.3.1 使用系统视频编解码插件 383 10.3.2 视频编码码流写AVI文件 385 10.3.3 关闭平台
387 10.4 使用XviD CODEC算法实现视频编解码 388 10.4.1 生成XviD算法静态库(编译过程) 388 10.4.2 实现XviD
CODEC视频编码算法函数 389 10.4.3 实现XviD CODEC视频解码算法函数 393 10.4.4 使用XviD CODEC编解码算法 395
10.5 平台应用效果展示 398 10.6 本章小结 399 第4篇 编解码技术 401 第11章 纵览音视频编解码技术 403 11.1 数字音视频基础
404 11.2 音视频编解码及方法 406 11.2.1 音频编码方法 406 11.2.2 视频编码方法 410 11.3 编解码技术标准 417
11.3.1 静态图像编码标准 418 11.3.2 MPEG-4/H.264视频算法 424 11.3.3 AVS国产视频编码标准 430 11.4
编解码产业及发展 431 11.4.1 编解码资源一览 431 11.4.2 编解码发展前景 432 11.5 本章小结 433 第12章 使用MMX/SSE
2进行多媒体编程 435 12.1 MMX/SSE 2技术基础 436 12.2 MMX/SSE 2指令剖析 439 12.2.1 MMX媒体扩展指令 439
12.2.2 MMX程序设计 444 12.2.3 SSE/SSE 2媒体扩展指令 455 12.2.4 SSE程序设计详细解析 457 12.3
使用MMX/SSE 2进行音视频开发 463 12.3.1 开发前技术准备 464 12.3.2 MMX/SSE 2视频编解码编程 465 12.3.3
使用VC调试MMX/SSE 2程序 470 12.4 MMX/SSE 2开发常见问题 472 12.4.1 制订计划 472 12.4.2
哪部分代码可使用MMX技术改进 473 12.4.3 代码是浮点型还是整型 473 12.4.4 EMMS准则 474 12.4.5
CPUID的检测MMX技术的用法 474 12.4.6 数据对齐 474 12.4.7 数据安排 475 12.4.8 应用程序最后的调整 476 12.5
本章小结 476 第13章 用DM642实现视频编解码技术 477 13.1 数字媒体处理器TMS320DM642DSP概述 478 13.2
DSP软件开发环境CCS 481 13.2.1 安装CCS 481 13.2.2 CCS主要部件 482 13.2.3 使用CCS优化工具实现算法优化 488
13.3 用C语言进行视频算法框架编程 492 13.3.1 C编程规则和参考 492 13.3.2 DSP关键字与CMD文件使用 493 13.3.3
算法系统资源剖析 495 13.4 DM642实现视频算法优化 497 13.4.1 并行算法指令和建立软件流水 497 13.4.2
使用intrinsic指令完成核心模块的优化 499 13.4.3 使用DSP线性汇编优化核心模块 500 13.4.4 使用Cache技术实现算法优化
507 13.4.5 使用乒乓式EDMA实现算法优化 508 13.5 DM642优化视频算法常见问题 513 13.6 本章小结 518 第14章 XviD
CODEC实现MPEG-4编解码 519 14.1 MPEG-4编解码概述 520 14.1.1 基于对象的MPEG-4视频编码 520 14.1.2
XviD格式文件播放 520 14.2 XviD CODEC编解码分析 521 14.2.1 MPEG-4编解码设计与剖析 521 14.2.2
MMX/SSE 2实现XviD CODEC 549 14.2.3 DM642下XviD CODEC优化 553 14.3 运行XviD CODEC系统 559
14.3.1 YUV原始视频数据及其显示 559 14.3.2 VC平台下编译和运行XviD CODEC 559 14.3.3
CODEC在DSP下软仿真和硬仿真 562 14.4 系统效果展示 562 14.5 本章小结 563 第15章 X264实现H.264/AVC视频编码
565 15.1 H.264/AVC编码概要 566 15.1.1 开源代码工程管理软件 566 15.1.2 获取开源算法工程 566 15.1.3
H.264/AVC新特性 567 15.2 X264视频编码分析 568 15.2.1 H.264/AVC关键技术要点 569 15.2.2
X264视频编码设计与剖析 577 15.2.3 X264核心模块MMX/DSP汇编优化 599 15.3 运行X264编码系统 606 15.3.1
VC平台下编译和运行X264 606 15.3.2 JM验证X264码流 610 15.3.3 ffmpeg中的H.264视频解码 611 15.4
系统效果展示 611 15.4.1 X264实现H.264/AVC视频编码 611 15.4.2 ffmpeg-h264-vc工程实现H.264视频解码
612 15.5 本章小结 613 第16章 打造自己的DVR监控系统 615 16.1 DVR监控系统分析与设计 616 16.1.1 监控系统分类 616
16.1.2 监控系统组成 617 16.1.3 基于压缩板卡的SDK软件开发包 619 16.2 DVR监控系统主界面软件设计 621 16.2.1
对话框应用程序开发 621 16.2.2 位图按钮设计 622 16.3 模拟DVR视频采集 636 16.3.1 基于DirectShow的视频采集回放
636 16.3.2 基于DirectShow的影音文件回放 638 16.4 系统效果展示 643 16.5 本章小结 644 附录A 旧版VC升级到VC
2005程序安全的10点注意事项 645 附录B 开发常见问题 (附源码)
由于文件过大所以本文件采用分卷压缩的,需要安装好压,并下载完全部压缩分卷。共12个分卷



img

Visual C++音频视频处理技术及工程实践(分卷10)

本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual
C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642
DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地介绍Visual C++
2005进行流媒体编程的基本思路和方法,采用案例为主的叙述方式,将大量的技术理论融入具体的案例剖析中。采用的案例均来源于作者实际开发工作,具有很好的实用价值,可以帮助读者在开发中进行参考或直接应用。
第1篇 开发基础 1 第1章 数字音视频开发技术基础 3 1.1 数字音视频基本概念 4 1.1.1 数字音频技术基础 4 1.1.2
各种数字音频文件格式基础 4 1.1.3 视频的相关基础概念 8 1.1.4 常见的视频文件格式 8 1.2 数字音视频数据的编解码技术 10 1.2.1
音频数据的编解码 11 1.2.2 视频数据的编解码 13 1.2.3 音视频编码的相关标准 13 1.3 音视频处理平台的选择 15 1.3.1
个人多媒体计算机 15 1.3.2 嵌入式处理器ARM 16 1.3.3 数字媒体处理器DSP 16 1.4 音视频开发的典型应用 16 1.4.1
个人消费类电子产品 16 1.4.2 公共领域的音视频应用 18 1.5 常用音视频开发工具 21 1.5.1 DirectSound音频开发 21
1.5.2 DirectShow视频开发 21 1.5.3 DSP CCS算法开发 22 1.6 本章小结 23 第2章 Visual C++
2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26
2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用程序 27 2.2.2 生成基于MFC的应用程序 32
2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2
生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 2.4.3
常用消息 66 2.5 基于对话框的编程 68 2.5.1 创建和编辑对话框 68 2.5.2 对话框种类 75 2.6 常用控件使用技巧 79 2.6.1
按钮类控件的使用 80 2.6.2 文本可编辑类控件的使用 81 2.6.3 静态类控件的使用 82 2.6.4 其他控件 83 2.7 Visual
2005开发技术资源 84 2.7.1 MSDN在线帮助 84 2.7.2 丰富的网络资源 86 2.8 Visual 2005开发的常见问题 86
2.8.1 如何使用volatile和const_cast 86 2.8.2 如何构造unicode版本的程序 87 2.8.3 如何使用.def文件 87
2.8.4 如何正确编写Win32 DLL 87 2.8.5 如何编写和使用资源DLL 88 2.8.6 如何实现对话框的数据交换 88 2.9 本章小结
89 第2篇 音频开发 91 第3章 DirectSound开发基础 93 3.1 Microsoft DirectSound SDK 94 3.1.1
比较DirectSound与DirectMusic 94 3.1.2 DirectSound SDK能做什么 95 3.1.3 如何获取DirectSound
SDK 96 3.1.4 DirectSound SDK的基本结构 98 3.1.5 Directsound SDK安装 100 3.1.6
选择最适合用户的DirectSound SDK 100 3.1.7 用DirectSound进行编程的必要步骤 102 3.2
DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107
3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119
3.3.2 DirectSound应用程序的开发环境配置 119 3.3.3 DirectSound Filter开发环境配置 121 3.4
调试音频处理程序 125 3.4.1 Visual C++调试器 125 3.4.2 DirectSound中常用的调试技术 128 3.5
DirectSound开发的常见问题 130 3.6 本章小结 131 第4章 打造自己的音频播放器 133 4.1 系统设计和分析 134 4.2
缓冲区和通知基础 135 4.2.1 缓冲区的概念 135 4.2.2 缓冲区的通知 136 4.3 播放文件 137 4.3.1
创建DirectSound对象 137 4.3.2 创建播放缓冲区 138 4.3.3 调用方法播放声音 145 4.3.4 结束播放 146 4.4
系统效果演示 146 4.4.1 新建基于对话框的程序框架 147 4.4.2 添加控件及变量 147 4.4.3
封装CDirectSound类实现DirectSound声音播放 148 4.4.4 与对话框界面相关操作实现 156 4.4.5 程序运行结果 159
4.5 DirectSound开发常见问题 160 4.6 本章小结 161 第5章 语音3D特效器制作 163 5.1 系统设计和分析 164 5.2
DirectSound 3D缓冲区 164 5.2.1 获取3D缓冲区对象 165 5.2.2 最大距离和最小距离 166 5.2.3 处理模式 167
5.2.4 声音圆锥 167 5.3 DirectSound 3D虚拟听众 168 5.3.1 获得3D听众 168 5.3.2 听众的空间参数 169
5.3.3 距离因子与Doppler效应 171 5.3.4 滚降因子与延迟设置 173 5.4 系统效果演示 174 5.4.1 具体的实现步骤 174
5.4.2 程序的实现代码 176 5.4.3 程序运行结果 186 5.5 DirectSound 3D开发常见问题 187 5.6 本章小结 188
第6章 对拾音设备录制自己的语音文件 189 6.1 系统分析和设计 190 6.2 管理捕获缓冲区 191 6.2.1 创建捕获缓冲区 191 6.2.2
启动缓冲区 197 6.2.3 封锁缓冲区 197 6.2.4 解锁缓冲区 198 6.2.5 中止捕获 199 6.3 系统效果演示 199 6.3.1
声音类的封装 199 6.3.2 声音管理函数的实现 202 6.3.3 程序运行结果 214 6.4 DirectSound录制语音文件开发常见问题 215
6.5 本章小结 216 第3篇 视频开发 217 第7章 DirectShow开发基础 219 7.1 Microsoft DirectShow SDK
220 7.1.1 DirectX及成员组成 220 7.1.2 DirectShow SDK能做什么 221 7.1.3 如何获取DirectShow
SDK 221 7.1.4 安装Direshow SDK 222 7.2 开发环境配置 224 7.2.1 生成DirectShow SDK开发库 224
7.2.2 Visual C++开发环境配置 229 7.2.3 常见问题解析集锦 232 7.3 DirectShow SDK基本架构 234 7.3.1
DirectShow SDK总体架构 234 7.3.2 DirectShow SDK简单应用程序案例 236 7.3.3 滤波器链表Filer
Graph及各种组件 244 7.3.4 构建滤波器链表(Building Filer Graph) 252 7.3.5 滤波器链表中的数据流动Data
Flow 257 7.3.6 DirectShow中的事件通知机制 261 7.3.7 常用DirectShow SDK接口 267 7.4
DirectShow SDK常用开发案例 267 7.4.1 通用开发流程 268 7.4.2 系统初始化 268 7.4.3 媒体播放方法 268
7.4.4 消息处理方法 270 7.4.5 视频采集技术 271 7.4.6 音频采集案例 282 7.5 本章小结 293 第8章 打造自己的媒体播放器
295 8.1 系统分析与设计 296 8.1.1 FilterGraph结构设计 297 8.1.2 GraphEdit模拟实现 297 8.1.3
界面设计 299 8.2 实现媒体控制类 307 8.2.1 CDXGraph类初始化 308 8.2.2 创建Graph滤波器链表 309 8.2.3
图像窗口设计 311 8.2.4 媒体播放控制 312 8.2.5 全屏显示及抓图存盘实现 315 8.3 实现一个简单的媒体播放器 317 8.4
升级你的播放器 321 8.6.2 添加控制功能 321 8.4.2 添加拖放功能 325 8.4.3 添加音量调节功能 326 8.4.4 添加欢迎背景图片
328 8.5 系统效果展示 328 8.6 如何播放更多的文件格式 329 8.7 本章小结 330 第9章 自制DV实现视频采集 331 9.1
系统分析与设计 332 9.1.1 采集设备的枚举 332 9.1.2 使用Capture Graph Builder 335 9.1.3 采集参数的设置
336 9.2 使用经典采集技术实现视频捕获 338 9.2.1 GraphEdit模拟实现 338 9.2.2 视频捕获类CCaptureClass的实现
340 9.2.3 界面设计 345 9.3 使用VMR技术实现视频图像捕获 350 9.3.1 VMR技术基础 350 9.3.2
GraphEdit模拟实现视频捕获预览 350 9.3.3 视频图像捕获类CVMR_Capture的实现 353 9.3.4 界面设计 361 9.4
系统效果演示 366 9.4.1 实例一 系统效果演示 367 9.4.2 实例二 系统效果演示 368 9.5 本章小结 369 第10章
VFW技术实现视频处理通用平台 371 10.1 VFW开发技术流程分析 372 10.1.1 技术概述 372 10.1.2 VFW采集开发流程图 373
10.2 使用VFW实现视频捕获和预览 373 10.2.1 建立单文档应用程序 373 10.2.2 创建视频窗口 375 10.2.3 设计回调函数
376 10.2.4 视频图像显示设置 378 10.2.5 捕获预览视频 379 10.2.6 配置视频格式及图像参数 381 10.3
使用系统插件实现视频编解码 382 10.3.1 使用系统视频编解码插件 383 10.3.2 视频编码码流写AVI文件 385 10.3.3 关闭平台
387 10.4 使用XviD CODEC算法实现视频编解码 388 10.4.1 生成XviD算法静态库(编译过程) 388 10.4.2 实现XviD
CODEC视频编码算法函数 389 10.4.3 实现XviD CODEC视频解码算法函数 393 10.4.4 使用XviD CODEC编解码算法 395
10.5 平台应用效果展示 398 10.6 本章小结 399 第4篇 编解码技术 401 第11章 纵览音视频编解码技术 403 11.1 数字音视频基础
404 11.2 音视频编解码及方法 406 11.2.1 音频编码方法 406 11.2.2 视频编码方法 410 11.3 编解码技术标准 417
11.3.1 静态图像编码标准 418 11.3.2 MPEG-4/H.264视频算法 424 11.3.3 AVS国产视频编码标准 430 11.4
编解码产业及发展 431 11.4.1 编解码资源一览 431 11.4.2 编解码发展前景 432 11.5 本章小结 433 第12章 使用MMX/SSE
2进行多媒体编程 435 12.1 MMX/SSE 2技术基础 436 12.2 MMX/SSE 2指令剖析 439 12.2.1 MMX媒体扩展指令 439
12.2.2 MMX程序设计 444 12.2.3 SSE/SSE 2媒体扩展指令 455 12.2.4 SSE程序设计详细解析 457 12.3
使用MMX/SSE 2进行音视频开发 463 12.3.1 开发前技术准备 464 12.3.2 MMX/SSE 2视频编解码编程 465 12.3.3
使用VC调试MMX/SSE 2程序 470 12.4 MMX/SSE 2开发常见问题 472 12.4.1 制订计划 472 12.4.2
哪部分代码可使用MMX技术改进 473 12.4.3 代码是浮点型还是整型 473 12.4.4 EMMS准则 474 12.4.5
CPUID的检测MMX技术的用法 474 12.4.6 数据对齐 474 12.4.7 数据安排 475 12.4.8 应用程序最后的调整 476 12.5
本章小结 476 第13章 用DM642实现视频编解码技术 477 13.1 数字媒体处理器TMS320DM642DSP概述 478 13.2
DSP软件开发环境CCS 481 13.2.1 安装CCS 481 13.2.2 CCS主要部件 482 13.2.3 使用CCS优化工具实现算法优化 488
13.3 用C语言进行视频算法框架编程 492 13.3.1 C编程规则和参考 492 13.3.2 DSP关键字与CMD文件使用 493 13.3.3
算法系统资源剖析 495 13.4 DM642实现视频算法优化 497 13.4.1 并行算法指令和建立软件流水 497 13.4.2
使用intrinsic指令完成核心模块的优化 499 13.4.3 使用DSP线性汇编优化核心模块 500 13.4.4 使用Cache技术实现算法优化
507 13.4.5 使用乒乓式EDMA实现算法优化 508 13.5 DM642优化视频算法常见问题 513 13.6 本章小结 518 第14章 XviD
CODEC实现MPEG-4编解码 519 14.1 MPEG-4编解码概述 520 14.1.1 基于对象的MPEG-4视频编码 520 14.1.2
XviD格式文件播放 520 14.2 XviD CODEC编解码分析 521 14.2.1 MPEG-4编解码设计与剖析 521 14.2.2
MMX/SSE 2实现XviD CODEC 549 14.2.3 DM642下XviD CODEC优化 553 14.3 运行XviD CODEC系统 559
14.3.1 YUV原始视频数据及其显示 559 14.3.2 VC平台下编译和运行XviD CODEC 559 14.3.3
CODEC在DSP下软仿真和硬仿真 562 14.4 系统效果展示 562 14.5 本章小结 563 第15章 X264实现H.264/AVC视频编码
565 15.1 H.264/AVC编码概要 566 15.1.1 开源代码工程管理软件 566 15.1.2 获取开源算法工程 566 15.1.3
H.264/AVC新特性 567 15.2 X264视频编码分析 568 15.2.1 H.264/AVC关键技术要点 569 15.2.2
X264视频编码设计与剖析 577 15.2.3 X264核心模块MMX/DSP汇编优化 599 15.3 运行X264编码系统 606 15.3.1
VC平台下编译和运行X264 606 15.3.2 JM验证X264码流 610 15.3.3 ffmpeg中的H.264视频解码 611 15.4
系统效果展示 611 15.4.1 X264实现H.264/AVC视频编码 611 15.4.2 ffmpeg-h264-vc工程实现H.264视频解码
612 15.5 本章小结 613 第16章 打造自己的DVR监控系统 615 16.1 DVR监控系统分析与设计 616 16.1.1 监控系统分类 616
16.1.2 监控系统组成 617 16.1.3 基于压缩板卡的SDK软件开发包 619 16.2 DVR监控系统主界面软件设计 621 16.2.1
对话框应用程序开发 621 16.2.2 位图按钮设计 622 16.3 模拟DVR视频采集 636 16.3.1 基于DirectShow的视频采集回放
636 16.3.2 基于DirectShow的影音文件回放 638 16.4 系统效果展示 643 16.5 本章小结 644 附录A 旧版VC升级到VC
2005程序安全的10点注意事项 645 附录B 开发常见问题 (附源码)
由于文件过大所以本文件采用分卷压缩的,需要安装好压,并下载完全部压缩分卷。共11个分卷。



img

Visual C++音频视频处理技术及工程实践(分卷5)

本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual
C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642
DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地介绍Visual C++
2005进行流媒体编程的基本思路和方法,采用案例为主的叙述方式,将大量的技术理论融入具体的案例剖析中。采用的案例均来源于作者实际开发工作,具有很好的实用价值,可以帮助读者在开发中进行参考或直接应用。
第1篇 开发基础 1 第1章 数字音视频开发技术基础 3 1.1 数字音视频基本概念 4 1.1.1 数字音频技术基础 4 1.1.2
各种数字音频文件格式基础 4 1.1.3 视频的相关基础概念 8 1.1.4 常见的视频文件格式 8 1.2 数字音视频数据的编解码技术 10 1.2.1
音频数据的编解码 11 1.2.2 视频数据的编解码 13 1.2.3 音视频编码的相关标准 13 1.3 音视频处理平台的选择 15 1.3.1
个人多媒体计算机 15 1.3.2 嵌入式处理器ARM 16 1.3.3 数字媒体处理器DSP 16 1.4 音视频开发的典型应用 16 1.4.1
个人消费类电子产品 16 1.4.2 公共领域的音视频应用 18 1.5 常用音视频开发工具 21 1.5.1 DirectSound音频开发 21
1.5.2 DirectShow视频开发 21 1.5.3 DSP CCS算法开发 22 1.6 本章小结 23 第2章 Visual C++
2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26
2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用程序 27 2.2.2 生成基于MFC的应用程序 32
2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2
生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 2.4.3
常用消息 66 2.5 基于对话框的编程 68 2.5.1 创建和编辑对话框 68 2.5.2 对话框种类 75 2.6 常用控件使用技巧 79 2.6.1
按钮类控件的使用 80 2.6.2 文本可编辑类控件的使用 81 2.6.3 静态类控件的使用 82 2.6.4 其他控件 83 2.7 Visual
2005开发技术资源 84 2.7.1 MSDN在线帮助 84 2.7.2 丰富的网络资源 86 2.8 Visual 2005开发的常见问题 86
2.8.1 如何使用volatile和const_cast 86 2.8.2 如何构造unicode版本的程序 87 2.8.3 如何使用.def文件 87
2.8.4 如何正确编写Win32 DLL 87 2.8.5 如何编写和使用资源DLL 88 2.8.6 如何实现对话框的数据交换 88 2.9 本章小结
89 第2篇 音频开发 91 第3章 DirectSound开发基础 93 3.1 Microsoft DirectSound SDK 94 3.1.1
比较DirectSound与DirectMusic 94 3.1.2 DirectSound SDK能做什么 95 3.1.3 如何获取DirectSound
SDK 96 3.1.4 DirectSound SDK的基本结构 98 3.1.5 Directsound SDK安装 100 3.1.6
选择最适合用户的DirectSound SDK 100 3.1.7 用DirectSound进行编程的必要步骤 102 3.2
DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107
3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119
3.3.2 DirectSound应用程序的开发环境配置 119 3.3.3 DirectSound Filter开发环境配置 121 3.4
调试音频处理程序 125 3.4.1 Visual C++调试器 125 3.4.2 DirectSound中常用的调试技术 128 3.5
DirectSound开发的常见问题 130 3.6 本章小结 131 第4章 打造自己的音频播放器 133 4.1 系统设计和分析 134 4.2
缓冲区和通知基础 135 4.2.1 缓冲区的概念 135 4.2.2 缓冲区的通知 136 4.3 播放文件 137 4.3.1
创建DirectSound对象 137 4.3.2 创建播放缓冲区 138 4.3.3 调用方法播放声音 145 4.3.4 结束播放 146 4.4
系统效果演示 146 4.4.1 新建基于对话框的程序框架 147 4.4.2 添加控件及变量 147 4.4.3
封装CDirectSound类实现DirectSound声音播放 148 4.4.4 与对话框界面相关操作实现 156 4.4.5 程序运行结果 159
4.5 DirectSound开发常见问题 160 4.6 本章小结 161 第5章 语音3D特效器制作 163 5.1 系统设计和分析 164 5.2
DirectSound 3D缓冲区 164 5.2.1 获取3D缓冲区对象 165 5.2.2 最大距离和最小距离 166 5.2.3 处理模式 167
5.2.4 声音圆锥 167 5.3 DirectSound 3D虚拟听众 168 5.3.1 获得3D听众 168 5.3.2 听众的空间参数 169
5.3.3 距离因子与Doppler效应 171 5.3.4 滚降因子与延迟设置 173 5.4 系统效果演示 174 5.4.1 具体的实现步骤 174
5.4.2 程序的实现代码 176 5.4.3 程序运行结果 186 5.5 DirectSound 3D开发常见问题 187 5.6 本章小结 188
第6章 对拾音设备录制自己的语音文件 189 6.1 系统分析和设计 190 6.2 管理捕获缓冲区 191 6.2.1 创建捕获缓冲区 191 6.2.2
启动缓冲区 197 6.2.3 封锁缓冲区 197 6.2.4 解锁缓冲区 198 6.2.5 中止捕获 199 6.3 系统效果演示 199 6.3.1
声音类的封装 199 6.3.2 声音管理函数的实现 202 6.3.3 程序运行结果 214 6.4 DirectSound录制语音文件开发常见问题 215
6.5 本章小结 216 第3篇 视频开发 217 第7章 DirectShow开发基础 219 7.1 Microsoft DirectShow SDK
220 7.1.1 DirectX及成员组成 220 7.1.2 DirectShow SDK能做什么 221 7.1.3 如何获取DirectShow
SDK 221 7.1.4 安装Direshow SDK 222 7.2 开发环境配置 224 7.2.1 生成DirectShow SDK开发库 224
7.2.2 Visual C++开发环境配置 229 7.2.3 常见问题解析集锦 232 7.3 DirectShow SDK基本架构 234 7.3.1
DirectShow SDK总体架构 234 7.3.2 DirectShow SDK简单应用程序案例 236 7.3.3 滤波器链表Filer
Graph及各种组件 244 7.3.4 构建滤波器链表(Building Filer Graph) 252 7.3.5 滤波器链表中的数据流动Data
Flow 257 7.3.6 DirectShow中的事件通知机制 261 7.3.7 常用DirectShow SDK接口 267 7.4
DirectShow SDK常用开发案例 267 7.4.1 通用开发流程 268 7.4.2 系统初始化 268 7.4.3 媒体播放方法 268
7.4.4 消息处理方法 270 7.4.5 视频采集技术 271 7.4.6 音频采集案例 282 7.5 本章小结 293 第8章 打造自己的媒体播放器
295 8.1 系统分析与设计 296 8.1.1 FilterGraph结构设计 297 8.1.2 GraphEdit模拟实现 297 8.1.3
界面设计 299 8.2 实现媒体控制类 307 8.2.1 CDXGraph类初始化 308 8.2.2 创建Graph滤波器链表 309 8.2.3
图像窗口设计 311 8.2.4 媒体播放控制 312 8.2.5 全屏显示及抓图存盘实现 315 8.3 实现一个简单的媒体播放器 317 8.4
升级你的播放器 321 8.6.2 添加控制功能 321 8.4.2 添加拖放功能 325 8.4.3 添加音量调节功能 326 8.4.4 添加欢迎背景图片
328 8.5 系统效果展示 328 8.6 如何播放更多的文件格式 329 8.7 本章小结 330 第9章 自制DV实现视频采集 331 9.1
系统分析与设计 332 9.1.1 采集设备的枚举 332 9.1.2 使用Capture Graph Builder 335 9.1.3 采集参数的设置
336 9.2 使用经典采集技术实现视频捕获 338 9.2.1 GraphEdit模拟实现 338 9.2.2 视频捕获类CCaptureClass的实现
340 9.2.3 界面设计 345 9.3 使用VMR技术实现视频图像捕获 350 9.3.1 VMR技术基础 350 9.3.2
GraphEdit模拟实现视频捕获预览 350 9.3.3 视频图像捕获类CVMR_Capture的实现 353 9.3.4 界面设计 361 9.4
系统效果演示 366 9.4.1 实例一 系统效果演示 367 9.4.2 实例二 系统效果演示 368 9.5 本章小结 369 第10章
VFW技术实现视频处理通用平台 371 10.1 VFW开发技术流程分析 372 10.1.1 技术概述 372 10.1.2 VFW采集开发流程图 373
10.2 使用VFW实现视频捕获和预览 373 10.2.1 建立单文档应用程序 373 10.2.2 创建视频窗口 375 10.2.3 设计回调函数
376 10.2.4 视频图像显示设置 378 10.2.5 捕获预览视频 379 10.2.6 配置视频格式及图像参数 381 10.3
使用系统插件实现视频编解码 382 10.3.1 使用系统视频编解码插件 383 10.3.2 视频编码码流写AVI文件 385 10.3.3 关闭平台
387 10.4 使用XviD CODEC算法实现视频编解码 388 10.4.1 生成XviD算法静态库(编译过程) 388 10.4.2 实现XviD
CODEC视频编码算法函数 389 10.4.3 实现XviD CODEC视频解码算法函数 393 10.4.4 使用XviD CODEC编解码算法 395
10.5 平台应用效果展示 398 10.6 本章小结 399 第4篇 编解码技术 401 第11章 纵览音视频编解码技术 403 11.1 数字音视频基础
404 11.2 音视频编解码及方法 406 11.2.1 音频编码方法 406 11.2.2 视频编码方法 410 11.3 编解码技术标准 417
11.3.1 静态图像编码标准 418 11.3.2 MPEG-4/H.264视频算法 424 11.3.3 AVS国产视频编码标准 430 11.4
编解码产业及发展 431 11.4.1 编解码资源一览 431 11.4.2 编解码发展前景 432 11.5 本章小结 433 第12章 使用MMX/SSE
2进行多媒体编程 435 12.1 MMX/SSE 2技术基础 436 12.2 MMX/SSE 2指令剖析 439 12.2.1 MMX媒体扩展指令 439
12.2.2 MMX程序设计 444 12.2.3 SSE/SSE 2媒体扩展指令 455 12.2.4 SSE程序设计详细解析 457 12.3
使用MMX/SSE 2进行音视频开发 463 12.3.1 开发前技术准备 464 12.3.2 MMX/SSE 2视频编解码编程 465 12.3.3
使用VC调试MMX/SSE 2程序 470 12.4 MMX/SSE 2开发常见问题 472 12.4.1 制订计划 472 12.4.2
哪部分代码可使用MMX技术改进 473 12.4.3 代码是浮点型还是整型 473 12.4.4 EMMS准则 474 12.4.5
CPUID的检测MMX技术的用法 474 12.4.6 数据对齐 474 12.4.7 数据安排 475 12.4.8 应用程序最后的调整 476 12.5
本章小结 476 第13章 用DM642实现视频编解码技术 477 13.1 数字媒体处理器TMS320DM642DSP概述 478 13.2
DSP软件开发环境CCS 481 13.2.1 安装CCS 481 13.2.2 CCS主要部件 482 13.2.3 使用CCS优化工具实现算法优化 488
13.3 用C语言进行视频算法框架编程 492 13.3.1 C编程规则和参考 492 13.3.2 DSP关键字与CMD文件使用 493 13.3.3
算法系统资源剖析 495 13.4 DM642实现视频算法优化 497 13.4.1 并行算法指令和建立软件流水 497 13.4.2
使用intrinsic指令完成核心模块的优化 499 13.4.3 使用DSP线性汇编优化核心模块 500 13.4.4 使用Cache技术实现算法优化
507 13.4.5 使用乒乓式EDMA实现算法优化 508 13.5 DM642优化视频算法常见问题 513 13.6 本章小结 518 第14章 XviD
CODEC实现MPEG-4编解码 519 14.1 MPEG-4编解码概述 520 14.1.1 基于对象的MPEG-4视频编码 520 14.1.2
XviD格式文件播放 520 14.2 XviD CODEC编解码分析 521 14.2.1 MPEG-4编解码设计与剖析 521 14.2.2
MMX/SSE 2实现XviD CODEC 549 14.2.3 DM642下XviD CODEC优化 553 14.3 运行XviD CODEC系统 559
14.3.1 YUV原始视频数据及其显示 559 14.3.2 VC平台下编译和运行XviD CODEC 559 14.3.3
CODEC在DSP下软仿真和硬仿真 562 14.4 系统效果展示 562 14.5 本章小结 563 第15章 X264实现H.264/AVC视频编码
565 15.1 H.264/AVC编码概要 566 15.1.1 开源代码工程管理软件 566 15.1.2 获取开源算法工程 566 15.1.3
H.264/AVC新特性 567 15.2 X264视频编码分析 568 15.2.1 H.264/AVC关键技术要点 569 15.2.2
X264视频编码设计与剖析 577 15.2.3 X264核心模块MMX/DSP汇编优化 599 15.3 运行X264编码系统 606 15.3.1
VC平台下编译和运行X264 606 15.3.2 JM验证X264码流 610 15.3.3 ffmpeg中的H.264视频解码 611 15.4
系统效果展示 611 15.4.1 X264实现H.264/AVC视频编码 611 15.4.2 ffmpeg-h264-vc工程实现H.264视频解码
612 15.5 本章小结 613 第16章 打造自己的DVR监控系统 615 16.1 DVR监控系统分析与设计 616 16.1.1 监控系统分类 616
16.1.2 监控系统组成 617 16.1.3 基于压缩板卡的SDK软件开发包 619 16.2 DVR监控系统主界面软件设计 621 16.2.1
对话框应用程序开发 621 16.2.2 位图按钮设计 622 16.3 模拟DVR视频采集 636 16.3.1 基于DirectShow的视频采集回放
636 16.3.2 基于DirectShow的影音文件回放 638 16.4 系统效果展示 643 16.5 本章小结 644 附录A 旧版VC升级到VC
2005程序安全的10点注意事项 645 附录B 开发常见问题 (附源码)
由于文件过大所以本文件采用分卷压缩的,需要安装好压,并下载完全部压缩分卷。共12个分卷。



img

Visual C++音频视频处理技术及工程实践(分卷9)

本书共16章,分为4篇,详细讲解了使用各种软件和平台进行音、视频多媒体编程的技术,以案例为对象展示实现过程、分析技术难点。主要内容包括软件Visual
C++2005的开发技术、DirectSound开发音频、DirectShow/VFW开发视频、MMX/SSE进行多媒体汇编编程、DM642
DSP进行音视频算法优化和主流视频算法MPEG-4/H.264的编码原理及工程实践。本书系统地介绍Visual C++
2005进行流媒体编程的基本思路和方法,采用案例为主的叙述方式,将大量的技术理论融入具体的案例剖析中。采用的案例均来源于作者实际开发工作,具有很好的实用价值,可以帮助读者在开发中进行参考或直接应用。
第1篇 开发基础 1 第1章 数字音视频开发技术基础 3 1.1 数字音视频基本概念 4 1.1.1 数字音频技术基础 4 1.1.2
各种数字音频文件格式基础 4 1.1.3 视频的相关基础概念 8 1.1.4 常见的视频文件格式 8 1.2 数字音视频数据的编解码技术 10 1.2.1
音频数据的编解码 11 1.2.2 视频数据的编解码 13 1.2.3 音视频编码的相关标准 13 1.3 音视频处理平台的选择 15 1.3.1
个人多媒体计算机 15 1.3.2 嵌入式处理器ARM 16 1.3.3 数字媒体处理器DSP 16 1.4 音视频开发的典型应用 16 1.4.1
个人消费类电子产品 16 1.4.2 公共领域的音视频应用 18 1.5 常用音视频开发工具 21 1.5.1 DirectSound音频开发 21
1.5.2 DirectShow视频开发 21 1.5.3 DSP CCS算法开发 22 1.6 本章小结 23 第2章 Visual C++
2005开发基础 25 2.1 Visual C++ 2005新增特性 26 2.1.1 句柄(Handles) 26 2.1.2 类型的声明 26
2.1.3 对代码编辑的改进 27 2.2 VC能做的事情 27 2.2.1 生成传统的控制台应用程序 27 2.2.2 生成基于MFC的应用程序 32
2.2.3 生成静态链接库 40 2.2.4 生成动态链接库 41 2.3 利用向导完成基本开发 46 2.3.1 生成应用程序 46 2.3.2
生成应用库LIB/DLL 53 2.4 MFC编程基础 56 2.4.1 Windows消息与事件 56 2.4.2 消息与事件的响应 63 2.4.3
常用消息 66 2.5 基于对话框的编程 68 2.5.1 创建和编辑对话框 68 2.5.2 对话框种类 75 2.6 常用控件使用技巧 79 2.6.1
按钮类控件的使用 80 2.6.2 文本可编辑类控件的使用 81 2.6.3 静态类控件的使用 82 2.6.4 其他控件 83 2.7 Visual
2005开发技术资源 84 2.7.1 MSDN在线帮助 84 2.7.2 丰富的网络资源 86 2.8 Visual 2005开发的常见问题 86
2.8.1 如何使用volatile和const_cast 86 2.8.2 如何构造unicode版本的程序 87 2.8.3 如何使用.def文件 87
2.8.4 如何正确编写Win32 DLL 87 2.8.5 如何编写和使用资源DLL 88 2.8.6 如何实现对话框的数据交换 88 2.9 本章小结
89 第2篇 音频开发 91 第3章 DirectSound开发基础 93 3.1 Microsoft DirectSound SDK 94 3.1.1
比较DirectSound与DirectMusic 94 3.1.2 DirectSound SDK能做什么 95 3.1.3 如何获取DirectSound
SDK 96 3.1.4 DirectSound SDK的基本结构 98 3.1.5 Directsound SDK安装 100 3.1.6
选择最适合用户的DirectSound SDK 100 3.1.7 用DirectSound进行编程的必要步骤 102 3.2
DirectSound的详细使用方法 103 3.2.1 DirectSound设备对象 104 3.2.2 DirectSound缓冲区对象 107
3.2.3 使用WAV数据 114 3.2.4 使用音效 116 3.3 开发环境配置 118 3.3.1 Visual C++基本开发环境配置 119
3.3.2 DirectSound应用程序的开发环境配置 119 3.3.3 DirectSound Filter开发环境配置 121 3.4
调试音频处理程序 125 3.4.1 Visual C++调试器 125 3.4.2 DirectSound中常用的调试技术 128 3.5
DirectSound开发的常见问题 130 3.6 本章小结 131 第4章 打造自己的音频播放器 133 4.1 系统设计和分析 134 4.2
缓冲区和通知基础 135 4.2.1 缓冲区的概念 135 4.2.2 缓冲区的通知 136 4.3 播放文件 137 4.3.1
创建DirectSound对象 137 4.3.2 创建播放缓冲区 138 4.3.3 调用方法播放声音 145 4.3.4 结束播放 146 4.4
系统效果演示 146 4.4.1 新建基于对话框的程序框架 147 4.4.2 添加控件及变量 147 4.4.3
封装CDirectSound类实现DirectSound声音播放 148 4.4.4 与对话框界面相关操作实现 156 4.4.5 程序运行结果 159
4.5 DirectSound开发常见问题 160 4.6 本章小结 161 第5章 语音3D特效器制作 163 5.1 系统设计和分析 164 5.2
DirectSound 3D缓冲区 164 5.2.1 获取3D缓冲区对象 165 5.2.2 最大距离和最小距离 166 5.2.3 处理模式 167
5.2.4 声音圆锥 167 5.3 DirectSound 3D虚拟听众 168 5.3.1 获得3D听众 168 5.3.2 听众的空间参数 169
5.3.3 距离因子与Doppler效应 171 5.3.4 滚降因子与延迟设置 173 5.4 系统效果演示 174 5.4.1 具体的实现步骤 174
5.4.2 程序的实现代码 176 5.4.3 程序运行结果 186 5.5 DirectSound 3D开发常见问题 187 5.6 本章小结 188
第6章 对拾音设备录制自己的语音文件 189 6.1 系统分析和设计 190 6.2 管理捕获缓冲区 191 6.2.1 创建捕获缓冲区 191 6.2.2
启动缓冲区 197 6.2.3 封锁缓冲区 197 6.2.4 解锁缓冲区 198 6.2.5 中止捕获 199 6.3 系统效果演示 199 6.3.1
声音类的封装 199 6.3.2 声音管理函数的实现 202 6.3.3 程序运行结果 214 6.4 DirectSound录制语音文件开发常见问题 215
6.5 本章小结 216 第3篇 视频开发 217 第7章 DirectShow开发基础 219 7.1 Microsoft DirectShow SDK
220 7.1.1 DirectX及成员组成 220 7.1.2 DirectShow SDK能做什么 221 7.1.3 如何获取DirectShow
SDK 221 7.1.4 安装Direshow SDK 222 7.2 开发环境配置 224 7.2.1 生成DirectShow SDK开发库 224
7.2.2 Visual C++开发环境配置 229 7.2.3 常见问题解析集锦 232 7.3 DirectShow SDK基本架构 234 7.3.1
DirectShow SDK总体架构 234 7.3.2 DirectShow SDK简单应用程序案例 236 7.3.3 滤波器链表Filer
Graph及各种组件 244 7.3.4 构建滤波器链表(Building Filer Graph) 252 7.3.5 滤波器链表中的数据流动Data
Flow 257 7.3.6 DirectShow中的事件通知机制 261 7.3.7 常用DirectShow SDK接口 267 7.4
DirectShow SDK常用开发案例 267 7.4.1 通用开发流程 268 7.4.2 系统初始化 268 7.4.3 媒体播放方法 268
7.4.4 消息处理方法 270 7.4.5 视频采集技术 271 7.4.6 音频采集案例 282 7.5 本章小结 293 第8章 打造自己的媒体播放器
295 8.1 系统分析与设计 296 8.1.1 FilterGraph结构设计 297 8.1.2 GraphEdit模拟实现 297 8.1.3
界面设计 299 8.2 实现媒体控制类 307 8.2.1 CDXGraph类初始化 308 8.2.2 创建Graph滤波器链表 309 8.2.3
图像窗口设计 311 8.2.4 媒体播放控制 312 8.2.5 全屏显示及抓图存盘实现 315 8.3 实现一个简单的媒体播放器 317 8.4
升级你的播放器 321 8.6.2 添加控制功能 321 8.4.2 添加拖放功能 325 8.4.3 添加音量调节功能 326 8.4.4 添加欢迎背景图片
328 8.5 系统效果展示 328 8.6 如何播放更多的文件格式 329 8.7 本章小结 330 第9章 自制DV实现视频采集 331 9.1
系统分析与设计 332 9.1.1 采集设备的枚举 332 9.1.2 使用Capture Graph Builder 335 9.1.3 采集参数的设置
336 9.2 使用经典采集技术实现视频捕获 338 9.2.1 GraphEdit模拟实现 338 9.2.2 视频捕获类CCaptureClass的实现
340 9.2.3 界面设计 345 9.3 使用VMR技术实现视频图像捕获 350 9.3.1 VMR技术基础 350 9.3.2
GraphEdit模拟实现视频捕获预览 350 9.3.3 视频图像捕获类CVMR_Capture的实现 353 9.3.4 界面设计 361 9.4
系统效果演示 366 9.4.1 实例一 系统效果演示 367 9.4.2 实例二 系统效果演示 368 9.5 本章小结 369 第10章
VFW技术实现视频处理通用平台 371 10.1 VFW开发技术流程分析 372 10.1.1 技术概述 372 10.1.2 VFW采集开发流程图 373
10.2 使用VFW实现视频捕获和预览 373 10.2.1 建立单文档应用程序 373 10.2.2 创建视频窗口 375 10.2.3 设计回调函数
376 10.2.4 视频图像显示设置 378 10.2.5 捕获预览视频 379 10.2.6 配置视频格式及图像参数 381 10.3
使用系统插件实现视频编解码 382 10.3.1 使用系统视频编解码插件 383 10.3.2 视频编码码流写AVI文件 385 10.3.3 关闭平台
387 10.4 使用XviD CODEC算法实现视频编解码 388 10.4.1 生成XviD算法静态库(编译过程) 388 10.4.2 实现XviD
CODEC视频编码算法函数 389 10.4.3 实现XviD CODEC视频解码算法函数 393 10.4.4 使用XviD CODEC编解码算法 395
10.5 平台应用效果展示 398 10.6 本章小结 399 第4篇 编解码技术 401 第11章 纵览音视频编解码技术 403 11.1 数字音视频基础
404 11.2 音视频编解码及方法 406 11.2.1 音频编码方法 406 11.2.2 视频编码方法 410 11.3 编解码技术标准 417
11.3.1 静态图像编码标准 418 11.3.2 MPEG-4/H.264视频算法 424 11.3.3 AVS国产视频编码标准 430 11.4
编解码产业及发展 431 11.4.1 编解码资源一览 431 11.4.2 编解码发展前景 432 11.5 本章小结 433 第12章 使用MMX/SSE
2进行多媒体编程 435 12.1 MMX/SSE 2技术基础 436 12.2 MMX/SSE 2指令剖析 439 12.2.1 MMX媒体扩展指令 439
12.2.2 MMX程序设计 444 12.2.3 SSE/SSE 2媒体扩展指令 455 12.2.4 SSE程序设计详细解析 457 12.3
使用MMX/SSE 2进行音视频开发 463 12.3.1 开发前技术准备 464 12.3.2 MMX/SSE 2视频编解码编程 465 12.3.3
使用VC调试MMX/SSE 2程序 470 12.4 MMX/SSE 2开发常见问题 472 12.4.1 制订计划 472 12.4.2
哪部分代码可使用MMX技术改进 473 12.4.3 代码是浮点型还是整型 473 12.4.4 EMMS准则 474 12.4.5
CPUID的检测MMX技术的用法 474 12.4.6 数据对齐 474 12.4.7 数据安排 475 12.4.8 应用程序最后的调整 476 12.5
本章小结 476 第13章 用DM642实现视频编解码技术 477 13.1 数字媒体处理器TMS320DM642DSP概述 478 13.2
DSP软件开发环境CCS 481 13.2.1 安装CCS 481 13.2.2 CCS主要部件 482 13.2.3 使用CCS优化工具实现算法优化 488
13.3 用C语言进行视频算法框架编程 492 13.3.1 C编程规则和参考 492 13.3.2 DSP关键字与CMD文件使用 493 13.3.3
算法系统资源剖析 495 13.4 DM642实现视频算法优化 497 13.4.1 并行算法指令和建立软件流水 497 13.4.2
使用intrinsic指令完成核心模块的优化 499 13.4.3 使用DSP线性汇编优化核心模块 500 13.4.4 使用Cache技术实现算法优化
507 13.4.5 使用乒乓式EDMA实现算法优化 508 13.5 DM642优化视频算法常见问题 513 13.6 本章小结 518 第14章 XviD
CODEC实现MPEG-4编解码 519 14.1 MPEG-4编解码概述 520 14.1.1 基于对象的MPEG-4视频编码 520 14.1.2
XviD格式文件播放 520 14.2 XviD CODEC编解码分析 521 14.2.1 MPEG-4编解码设计与剖析 521 14.2.2
MMX/SSE 2实现XviD CODEC 549 14.2.3 DM642下XviD CODEC优化 553 14.3 运行XviD CODEC系统 559
14.3.1 YUV原始视频数据及其显示 559 14.3.2 VC平台下编译和运行XviD CODEC 559 14.3.3
CODEC在DSP下软仿真和硬仿真 562 14.4 系统效果展示 562 14.5 本章小结 563 第15章 X264实现H.264/AVC视频编码
565 15.1 H.264/AVC编码概要 566 15.1.1 开源代码工程管理软件 566 15.1.2 获取开源算法工程 566 15.1.3
H.264/AVC新特性 567 15.2 X264视频编码分析 568 15.2.1 H.264/AVC关键技术要点 569 15.2.2
X264视频编码设计与剖析 577 15.2.3 X264核心模块MMX/DSP汇编优化 599 15.3 运行X264编码系统 606 15.3.1
VC平台下编译和运行X264 606 15.3.2 JM验证X264码流 610 15.3.3 ffmpeg中的H.264视频解码 611 15.4
系统效果展示 611 15.4.1 X264实现H.264/AVC视频编码 611 15.4.2 ffmpeg-h264-vc工程实现H.264视频解码
612 15.5 本章小结 613 第16章 打造自己的DVR监控系统 615 16.1 DVR监控系统分析与设计 616 16.1.1 监控系统分类 616
16.1.2 监控系统组成 617 16.1.3 基于压缩板卡的SDK软件开发包 619 16.2 DVR监控系统主界面软件设计 621 16.2.1
对话框应用程序开发 621 16.2.2 位图按钮设计 622 16.3 模拟DVR视频采集 636 16.3.1 基于DirectShow的视频采集回放
636 16.3.2 基于DirectShow的影音文件回放 638 16.4 系统效果展示 643 16.5 本章小结 644 附录A 旧版VC升级到VC
2005程序安全的10点注意事项 645 附录B 开发常见问题 (附源码)
由于文件过大所以本文件采用分卷压缩的,需要安装好压,并下载完全部压缩分卷。共11个分卷。



相关推荐

咨询软件
 
QQ在线咨询
售前咨询热线
QQ1793040