 该MFC参考含盖了Microsoft基本类库中的类、全局函数、全局变量和宏的内容。

参考中“类层次结构图”是为了方便查找某个类的基类。
该MFC参考通常不描述通过继承的函数或操作符。若要寻求这些函数的信息，请参阅类层次结构图中该类的基类信息。
每个类的说明文档包括：该类的概括、类成员的种类、以及该成员函数、重载操作符或数据成员的基本用途。

仅撰写应用程序或派生类在一般情况下对于公共和保护类成员的使用说明。
寻求完整的类成员的列表，请参阅该类的头文件。

本书目录
· | 层次结构图 | 直观的描述MFC中各类的关系。
· | MFC类 | 详细解说MFC库中的每个类和头文件信息。
· | MFC宏和全局 | 详细解说MFC库中的每个宏、全局函数、全局变量。
· | 结构、风格、回调函数和消息映射 | 详细解说MFC库中的各个结构、风格、回调函数和消息映射。


MFC类目录及头文件
类 | 描述 | 头文件
CAnimateCtrl | 自动化通用控件 | afxcmn.h
CArchive |  | afx.h
CArchiveException |  | afx.h
CArray |  | afxtempl.h
CAsyncMonikerFile | 在ActiveX控件中提供对异步标记的支持 | afxole.h
CAsyncScoket | 封装Windows Sockets API，参看CSocket | afxsock.h
CBitmap |  | afxwin.h
CBitmapButton |  | afxext.h
CBrush |  | afxwin.h
CButton | 按钮控件对象 | afxwin.h
CByteArray |  | afxcoll.h
CCachedDataPathProperty | 允许一个ActiveX控件异步传输属性数据和缓冲内存中的数据，参考CDataPathProperty | afxctl.h
CCheckListBox |  | afxwin.h
CClientDC |  | afxwin.h
CCmdTarget | 所有能够接收和响应消息的对象的基类 | afxwin.h
CCmdUI |  | afxwin.h
CColorDialog | 颜色选择的通用对话框，提供为显示系统定义的颜色列表 | afxdlgs.h
CComboBox | 组合框对象 | afxwin.h
CComboBoxEx | CComboBox类的派生类，用于支持在组合框控件中的图像列表 | afxcmn.h
CCommandLineInfo |  | afxwin.h
CCommonDialog |  | afxdlgs.h
CConnectionPoint |  | afxdisp.h
CControlBar |  | afxext.h
CCreateContext |  | afxext.h
CCriticalSection |  | afxmt.h
CCtrlView |  | afxwin.h
CDaoDatabase |  | afxdao.h
CDaoException |  | afxdao.h
CDaoFieldExchange |  | afxdao.h
CDaoQueryDef |  | afxdao.h
CDaoRecordset | 代表选自数据源的记录集。CDaoRecordset对象可用于三种格式：表类型记录集，动态集类型记录集和快照类型记录集 | afxdao.h
CDaoRecordView | 提供表单视图，以在控件中显示数据库记录。表单视图是CDaoRecordset对象的一部分。参考CFormView和CRecordView | afxdao.h
CDaoTableDef |  | afxdao.h
CDaoWorkspace |  | afxdao.h
CDatabase |  | afxdb.h
CDataExchange |  | afxwin.h
CDataPathProperty | 实现一个ActiveX控件属性，它能够异步加载其数据。这个类允许ActiveX控件在后台下载属性数据时被激活 | afxctl.h
CDateTimeCtrl | 封装新的日期/时间选取器控件 | afxdtctl.h
CDBException |  | afxdb.h
CDBVariant |  | afxdb.h
CDC |  | afxwin.h
CDialog | 用于包含控件窗口的对话框对象 | afxwin.h
CDialogBar |  | afxext.h
CDocItem |  | afxole.h
CDockState |  | afxadv.h
CDocObjectServer |  | afxdocob.h
CDocObjectServerItem |  | afxdocob.h
CDocTemplate |  | afxwin.h
CDocument | 用于管理程序的数据的类 | afxwin.h
CDragListBox | Windows列表框，允许用户把其中的项拖放到不同的位置 | afxcmn.h
CDumpContext |  | afx.h
CDWordArray |  | afxcoll.h
CEdit | 用于文本输入的子窗口控件 | afxwin.h
CEditView | 提供Windows编缉控件的功能。因为CEditView派生于Cedit，该对象可同文件和文件模板一同使用 | afxext.h
CEvent |  | afxmt.h
CException |  | afx.h
CFieldExchange |  | afxdb.h
CFile |  | afx.h
CFileDialog | 通用文件对话框，提供Open和Save As对话框中的功能 | afxdlgs.h
CFileException |  | afx.h
CFileFind |  | afx.h
CFindReplaceDialog |  | afxdlgs.h
CFont |  | afxwin.h
CFontDialog | 通用字体对话框，用于显示当前已装入系统的字体列表 | afxdlgs.h
CFontHolder |  | afxctl.h
CFormView | 包含对话框控件的窗口 | afxext.h
CFrameWnd | SDI（单窗口界面）框架窗口 | afxwin.h
CFtpConnection |  | afxinet.h
CFtpFileFind |  | afxinet.h
CGdiObject |  | afxwin.h
CGopherConnection |  | afxinet.h
CGopherFile |  | afxinet.h
CGopherFileFind |  | afxinet.h
CGopherLocator |  | afxinet.h
CHeaderCtrl | 标题通用控件 | afxcmn.h
CHotKeyCtrl | 热键通用控件 | afxcmn.h
CHtmlStream |  | afxisapi.h
CHtmlView | 实现Web Browser控件的视图类，能够访问当地或Web上的HTML文件。 | afxhtml.h
CHttpConnection |  | afxinet.h
CHttpFile |  | afxinet.h
CHttpFilter | 创建并处理超文传输协议过滤器对象，该对象用于过滤用于HTTP请求的服务器通知 | afxisapi.h
CHttpFilterContext |  | afxisapi.h
CHttpServer | Internet Server API（ISAPI）的包装类 | afxisapi.h
CHttpServerContext |  | afxisapi.h
CImageList |  | afxcmn.h
CInternetConnection |  | afxinet.h
CInternetException |  | afxinet.h
CInternetFile |  | afxinet.h
CInternetSession |  | afxinet.h
CIPAddressCtrl | IP地址控件。类似于编缉框，该控件接收Internet 协议格式的地址 | afxcmn.h
CList |  | afxtempl.h
CListBox | 列表框对象 | afxwin.h
CListCtrl | 列表视通用控件 | afxcmn.h
ClistView | 简化CListCtrl的使用，添加了对文件和视图的支持 | afxcview.h
CLongBinary |  | afxdb_.h
CMap |  | afxtempl.h
CMapPtrToPtr |  | afxcoll.h
CMapPtrToWord |  | afxcoll.h
CMapStringToOb |  | afxcoll.h
CMapStringToPtr |  | afxcoll.h
CMapStringToString |  | afxcoll.h
CMapWordToOb |  | afxcoll.h
CMapWordToPtr |  | afxcoll.h
CMDIChildWnd | MDI（多文档界面）子框架窗口 | afxwin.h
CMDIFrameWnd |  | afxwin.h
CMemFile |  | afx.h
CMemoryException |  | afx.h
CMemoryState |  |
CMenu |  | afxwin.h
CMetaFileDC |  | afxext.h
CMiniFrameWnd | 半高的框架窗口，主要用于浮动工具栏。一个小框架窗口没有最小化和最大化按钮，但其他都类似于正常的框架窗口 | afxwin.h
CMonikerFile |  | afxole.h
CMonthCalCtrl | 月历控件，用于显示一个用户可选择日期的日历 | afxdtctl.h
CMultiDocTemplate |  | afxwin.h
CMultiLock |  | afxmt.h
CMutex |  | afxmt.h
CNotSupportedException |  | afx.h
CObArray |  | afxcoll.h
CObject |  | afx.h
CObList |  | afxcoll.h
COleBusyDialog |  | afxodlgs.h
COleChangeIconDialog |  | afxodlgs.h
COleChangeSourceDialog |  | afxodlgs.h
COleClientItem |  | afxole.h
COleCmdUI |  | afxdocob.h
COleControl |  | afxctl.h
COleControlModule |  | afxctl.h
COleConvertDialog |  | afxodlgs.h
COleCurrency |  | afxdisp.h
COleDataObject |  | afxole.h
COleDataSource |  | afxole.h
COleDateTime |  | afxdisp.h
COleDateTimeSpan |  | afxdisp.h
COleDBRecordView |  | afxoledb.h
COleDialog |  | afxodlgs.h
COleDispatchDriver |  | afxdisp.h
COleDispatchException |  | afxdisp.h
COleDocObjectItem |  | afxole.h
COleDocument | 把一个文件看作为CDocItem对象的一个集合。包容器和服务器都需要这个结构，因为它们的文件必须能够包含OLE项 | afxole.h
COleDropSource |  | afxole.h
COleDropTarget |  | afxole.h
COleException |  | afxdisp.h
COleInsertDialog |  | afxodlgs.h
COleIPFrameWnd |  | afxole.h
COleLinkingDoc | OLE包容器文件的基类，这些文件支持对它们所包含项的链接 | afxole.h
COleLinksDialog |  | afxodlgs.h
COleMessageFilter |  | afxole.h
COleObjectFactory |  | afxdisp.h
COlePasteSpecialDialog |  | afxodlgs.h
COlePropertiesDialog |  | afxodlgs.h
COlePropertyPage |  | afxctl.h
COleResizeBar |  | afxole.h
COleSafeArray |  | afxdisp.h
COleServerDoc | OLE服务器文件的基类 | afxole.h
COleServerItem | 为OLE项提供一个服务器界面 | afxole.h
COleStreamFile |  | afxole.h
COleTemplateServer |  | afxdisp.h
COleUpdateDialog |  | afxodlgs.h
COleVariant |  | afxdisp.h
CPageSetupDialog |  | afxdlgs.h
CPaintDC |  | afxwin.h
CPalette |  | afxwin.h
CPen |  | afxwin.h
CPictureHolder |  | afxctl.h
CPoint |  | atltypes.h
CPrintDialog | 通用打印对话框，提供Print和Print Setup对话框中的功能 | afxdlgs.h
CPrintInfo |  |
CProgressCtrl | 通用进程指示器控件 | afxcmn.h
CPropertyPage | 代表属性表单中的一页 | afxdlgs.h
CPropertyPageEx |  |
CPropertySheet | 属性表，也叫做多选项卡对话框。一个属性表由一个CPropertySheet对象和几个CPropertyPage对象组成 | afxdlgs.h
CPropertySheetEx |  |
CPropExchange |  | afxctl.h
CPtrArray |  | afxcoll.h
CPtrList |  | afxcoll.h
CReBar |  | afxext.h
CReBarCtrl |  | afxcmn.h
CRecentFileList |  | afxadv.h
CRecordset | 用于访问数据库表或查询的类 | afxdb.h
CRecordView | 包含对话框控件的窗口 | afxdb.h
CRect |  | atltypes.h
CRectTracker |  | afxext.h
CResourceException |  | afxwin.h
CRgn |  | afxwin.h
CRichEditCntrItem |  | afxrich.h
CRichEditCtrl | 用户能够输入和编缉文本的窗口，提供字符和程序段格式，以及对嵌入OLE项的支持 | afxcmn.h
CRichEditDoc |  | afxrich.h
CRichEditView |  | afxrich.h
CRuntimeClass |  |
CScrollBar | 滚动条对象 | afxwin.h
CScrollView | 可滚动的窗口，派生于CView | afxwin.h
CSemaphore |  | afxmt.h
CSharedFile |  | afxadv.h
CSingleDocTemplate |  | afxwin.h
CSingleLock |  | afxmt.h
CSize |  | atltypes.h
CSliderCtrl | 提供包含一个滑块和可选的刻度线的窗口 | afxcmn.h
CSocket | Windows Socket API的包装类 | afxsock.h
CSocketFile |  | afxsock.h
CSpinButtonCtrl | 提供箭头按钮，用户可单击它，以增加或减少某个控件中的一个值 | afxcmn.h
CSplitterWnd |  | afxext.h
CStatic | 用于标识另一个控件或给用户提供消息的简单文本框 | afxwin.h
CStatusBar |  | afxext.h
CStatusBarCtrl | 提供一个层次窗口，通常放于父窗口的底部，用于显示关于应用程序的状态信息 | afxcmn.h
CStdioFile |  | afx.h
CString |  | afx.h
CStringArray |  | afxcoll.h
CStringList |  | afxcoll.h
CSyncObject |  | afxmt.h
CTabCtrl | 允许应用程序在一个窗口或对话框的同一区域显示多个页面 | afxcmn.h
CTime |  | afx.h
CTimeSpan |  | afx.h
CToolBar |  | afxext.h
CToolBarCtrl | 工具栏通用控件 | afxcmn.h
CToolTipCtrl | 提供工具提示控件的功能，它以一个小弹出窗口的样子显示，包含描述某个工具用途的一行文本 | afxcmn.h
CTreeCtrl | 显示项的分层结构列表 | afxcmn.h
CTreeView | 简化CTreeCtrl的用法 | afxcview.h
CTypedPtrArray |  | afxtempl.h
CTypedPtrList |  | afxtempl.h
CTypedPtrMap |  | afxtempl.h
CUIntArray |  | afxcoll.h
CUserException |  | afxwin.h
CView | 用于显示程序数据的类 | afxwin.h
CWaitCursor |  | afxwin.h
CWinApp |  | afxwin.h
CWindowDC |  | afxwin.h
CWinThread | 代表一个应用程序中的一个线程 | afxwin.h
CWnd |  | afxwin.h
CWordArray |  | afxcoll.h


 CAnimateCtrl

CObject
└CCmdTarget
└CWnd
└CAnimateCtrl

CAnimateCtrl类提供了Windows通用动画控件的功能。此控件只对运行在Windows 95和Windows NT 3.51版及其更高版本下的程序有效。动画控件是显示AVI（视听交错）格式──标准Windows视/听格式片段的矩形窗口。一个AVI片段是一系列位图帧，就象电影。
动画控件只能运行简单的AVI片段。特别的，通过动画控件运行的片段必须符合下列要求：
· | 必须确切地是一个视频流并且它必须至少有一个帧。
· | 文件中至多有两个流（典型地，其它流，比如音频流，尽管动画控件忽略音频流）。
· | 片段必须是非压缩的或用RLE8压缩的。
· | 在视频流中不允许调色板改变。
可以将AVI片段作为一个AVI资源加入到自己的应用中去，或作为一个独立的AVI文件伴随应用。
既然当AVI片段显示时，线程继续执行，所以一个动画控件的一个通用使用就是在一个长时间的操作时确定系统是活动状态。例如，当系统查找一个文件时，Windows 95 Explorer的查找对话框显示一个移动的放大镜。
如果在一个对话框或由使用对话编辑器的对话资源创建一个CAnimateCtrl对象，当关闭对话框时，它会自动被毁弃。如果在一个窗口中创建CAnimateCtrl对象，可能需要去毁弃它。如果在栈上创建CAnimateCtrl对象，它会自动地被毁弃。如果使用new函数在堆上创建CAnimateCtrl对象，必须调用delete来毁弃它。如果由CAnimateCtrl派生一个新类并且给这个类分配内存，则要覆盖CAnimateCtrl析构程序来释放分配的内存。
如果要了解有关使用CAnimateCtrl的更多信息，请参阅联机文档“VisualC++程序员指南”中的“控件主题”和“使用CAnimateCtrl敗
#include <afxcmn.h>

请参阅：CAnimateCtrl::Create中的动画控件风格, ON_CONTROL

CAnimateCtrl类的成员

构造函数
CAnimateCtrl 构造一个CAnimateCtrl对象

初始化
Create 创建一个动画控件并将它附加给CanimateCtrl对象

操作
Open | 由一个文件打开一个动画控件或资源并显示第一帧
Play | 播放不带声音的AVI片段
Seek | 播放AVI片段的选定的一帧
Stop | 停止播放AVI片段
Close | 关闭原先打开的AVI片段


 CAnimateCtrl::CAnimateCtrl

CAnimateCtrl( )

说明：
构造一个CAnimateCtrl对象。在执行创建的对象上的其它任何一个操作前，都必须调用Create成员函数。

请参阅：CAnimateCtrl::Create


 CAnimateCtrl::Close

BOOL Close( )

返回值：如果成功，则返回非零值，否则为0。

说明：
使用Close成员函数关闭以前在动画控件中打开的AVI片段（如果有的话），并且从内存中移去。

请参阅：CAnimateCtrl::Open


 CAnimateCtrl::Create

BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

返回值：如果成功，则返回非零值，否则为0。

参数：
dwStyle | 指定动画控件的风格。可使用任一窗口组合及在控件说明下描述的动画控件风格。
rect | 指定动画控件的位置和大小。它可以是一个CRect对象或一个RECT结构。
pParantWnd | 指定动画控件的父窗口，通常是一个CDialog。它不能是NULL。
nID | 指定动画控件的ID。

说明：
可以用两步构造一个CAnimateCtrl。首先，调用构造程序，然后调用Create。它创建动画控件并将其附加给CAnimateCtrl对象。
动画控件可使用下列窗口风格：
· | WS_CHILD | 经常使用
· | WS_VISIBLE | 通常使用
· | WS_DISABLED | 很少使用
除了以上列出的窗口风格以外，还可能使用一种或多种下面列出的动画控件的动画控件风格：
· | ACS_CENTER | 使得AVI片段在动画控件窗口里居中并且当AVI片段被打开时，保持动画控件的大小和位置不变。如果没有设定此风格，则当AVI片段被打开时，控件将重新定义为AVI片段中图象的大小。
· | ACS_TRANSPARENT | 使用透明背景而不是在AVI片段中指定的背景颜色绘制AVI片段。
· | ACS_AUTOPLAY | 使得AVI片段一打开就开始运行。当片段播放时，它将自动重复。

请参阅：
CAnimateCtrl::CAnimateCtrl, CAnimateCtrl::Open, CAnimateCtrl::Play, CAnimateCtrl::Seek


 CAnimateCtrl::Open

BOOL Open(LPCTSTR lpszFileName);
BOOL Open(UNIT nID);

返回值：如果成功，则返回非零值，否则为0。

参数：
lpszFileName | CString对象或一个指向一个以空终止符结尾的字符串的指针。此字符串包含了AVI文件的名字或一个AVI资源的名字。如果此参数为空，则系统关闭以前动画控件打开的AVI片段，如果有的话。
nID | AVI资源识别器。如果此参数为空，则系统关闭以前动画控件打开的AVI片段，如果有的话。

说明：
调用此函数来打开一个AVI片段并显示它的第一帧。
如果动画控件为ACS_AUTOPLAY风格，则动画控件将在打开片段之后，自动开始播放它。当线程继续执行时，它将继续在背景下播放片段。
当片段播放时，它将自动重复。
如果动画控件为ACS_CENTER风格，AVI片段将在控件中居中并且控件大小不会改变。如果动画控件的风格不为ACS_AUTOPLAY，则当AVI片段被打开时控件将重新定义为AVI片段中图象的大小。控件左上角的位置不改变，只是控件的大小改变。
如果动画控件为ACS_TRANSPARENT风格，则第一帧将使用透明背景绘制而不是使用动画片段中指定的背景颜色。

请参阅：CAnimateCtrl::Close, CAnimateCtrl::Create


 CAnimateCtrl::Play

BOOL Play(UNIT nFrom, UINT nTo, UINT nRep);

返回值：如果成功，则返回非零值，否则为0。

参数：
nFrom | 运行开始的那个帧的基于零的索引。值必须小于65,536。0值意味着从AVI片段的第一帧开始。
nTo | 运行结束的那个帧的基于零的索引。值必须小于65,536。-1值意味着以AVI片段的最后一帧结束。
nRep | 重新播放AVI片段的次数。值为-1意味着无限地重新运行此文件。

说明：
调用此函数可在一个动画控件中播放AVI片段。当线程继续执行时，动画控件将在背景下播放片段。如果动画控件为ACS_TRANSPARENT风格，则第一帧将使用透明背景绘制而不是使用动画片段中指定的背景颜色。

请参阅：
CAnimateCtrl::Open, CAnimateCtrl::Stop, CAnimateCtrl::Seek, CAnimateCtrl::Create


 CAnimateCtrl::Seek

BOOL Seek(UINT nTo);

返回值：如果成功，则返回非零值，否则为0。

参数：
nTo 显示帧的基于零的索引。值必须小于65,536。0值意味着显示AVI片段的第一帧。-1值意味着显示AVI片段的最后一帧。

说明：
调用此函数可静态地显示AVI片段的一帧。如果动画控件为ACS_TRANSPARENT风格，则第一帧将使用透明背景绘制而不是使用动画片段中指定的背景颜色。

请参阅：
CAnimateCtrl::Open, CAnimateCtrl::Play, CAnimateCtrl::Create


 CAnimateCtrl::Stop

BOOL Stop( );

返回值：如果成功，则返回非零值，否则为0。

说明：调用此函数可以停止动画控件中的AVI片段的播放。

请参阅：CAnimateCtrl::Play


 CArchive

CArchive没有基类。
CArchive允许以一个永久二进制（通常为磁盘存储）的形式保存一个对象的复杂网络，它可以在对象被删除时，还能永久保存。可以从永久存储中装载对象，在内存中重新构造它们。使得数据永久保留的过程就叫作“串行化”。
可以把一个归档对象看作一种二进制流。象输入/输出流一样，归档与文件有关并允许写缓冲区以及从硬盘读出或读入数据。输入/输出流处理一系列ASCII字符，但是归档文件以一种有效率、精练的格式处理二进制对象。
必须在创建一个CArchive对象之前，创建一个CFile对象。另外，必须确信归档文件的装入/存储与文件的打开模式是兼容的。每一个文件只限于一个活动归档文件。
当构造一个CArchive对象时，要把它附加给表示一个打开文件的类CFile（或派生类）的对象上。还要指定归档文件将用于装载还是存储。
CArchive对象不仅可以处理首要类型，而且还能处理为串行化而设计的CObject派生类的对象。一个串行化类通常有一个Serialize成员函数并且使用DECLARE_SERIAL和IMPLEMENT_SERIAL宏。这些在CObject类中有所描述。
重载提取（>>）和插入（<<）是方便的归档编程接口。它支持主要类型和CObject派生类。
CArchive还支持使用MFC Windows套接字类CSocket和CSocketFile编程。IsBufferEmpty成员函数也支持这种使用。如果要了解有关CArchive的更多信息，请参阅联机文档“Visual C++ 程序员指南”中的“串行化（永久对象）” 和“Windows套接字:在归档文件中使用套接字”
#include <afx.h>

请参阅：CFile, CObject, CSocket, CSocketFile

CArchive类的成员

数据成员
m_pDocument 指向被串行化的CDocument对象

构造函数
CArchive | 创建一个CArhcive对象
Abort | 在不异常的情况下，关闭归档文件
Close | 冲掉未写入数据并且释放与CFile的连接

基础输入/输出
Flush | 从归档文件缓冲区中冲掉未写入数据
operator >> | 装载对象和归档文件的主要类型
operator << | 存储对象和归档文件的主要类型
Read | 读入原始类型
Write | 写入原始类型
WriteString | 写一行文本
ReadString | 读一行文本

状态
GetFile | 获得此归档文件的CFile对象指针
GetObjectSchema | 由Serialize函数调用来确定被非串行化的对象的版本
SetObjectSchema | 在归档文件中存储对象概要
IsLoading | 确定归档文件是否被装载
IsStoring | 确定归档文件是否被存储
IsBufferEmpty | 确定在一个Windows Socket接收过程中缓冲区是否被清空

对象输入/输出
ReadObject | 调用一个用于装载的Serialize函数
WriteObect | 调用一个用于装载的Serialize函数
MapObject | 在没有对文件串行化的映射中放置对象，但是此映射对参考的子对象有效
SetStoreParams | 设置哈希表的大小和映射的块的大小，在串行化的过程中识别唯一的对象
LoadParams | 设置装载数组扩展的大小。必须在被装载对象之前或调用MapObject或ReadObject之前
ReadClass | 读入一个原先存储在WriteClass中的类的参考
WriteClass | 把对CRuntime的参考写入CArchive
SerializeClass | 根据CArchive方向，读入或写入对CArchive对象的类的参考


 CArchive::Abort

void Abort( );

说明：
调用此函数在不异常的情况下关闭归档文件。CArchive析构程序将调用Close，它将冲掉任何没有被存储在相关CFile对象中的数据。这会引起异常。
当获取这些异常时，有一个好的方法就是使用Abort，这样析构CArchive对象就不会再引起异常。当处理异常时，在失败时CArchive::Abort将不会异常，因为与CArchive::Clsoe不同，Abort忽略失败。
如果使用new在堆上分配CArchive对象，则在关闭文件之后，必须删除它。

请参阅：CArchive::Close, CFile::Close


 CArchive::CArchive

CArchive(CFile* pFile,UINT nMode,int nBufSize=4096,void* lpBuf=NULL );
throw(CMemoryException,CArchiveException,CFileException);

参数：
pFile | CFile对象的指针。CFile对象是永久数据的最终的源或目标。
nMode标识。它指定了对象是否从归档文件中装载或存储到文件中去。nMode参数必须有下列值之一：
· | CArchive::load | 从归档文件装载数据。CFile只读。
· | CArchive::store | 把数据保存到归档文件中。允许CFile写操作。
· | CArchive::bNoFlushOnDelete | 当归档文件析构程序被调用时，防止归档文件自动调用Flush。如果设定了此标识，则在析构程序被调用之前必须负责调用Close。如果不这样做，数据就会崩溃。
nBufSize | 指定内部文件缓冲区大小的整数，以字节计算。注意缺省的缓冲区大小为4096字节。如果例程归档大的对象，使用大一些的缓冲区，即多个文件缓冲区，那么将会提高例程的执行效率。
lpBuf | 指向nBufSize大小的提供缓冲区的指针。如果不指定这个参数，归档文件从本地堆为归档文件分配一个缓冲区并且当对象被毁弃时，释放缓冲区。归档文件不能释放一个提供的缓冲区。

说明：
构造CArchive对象并且指定它将用于装载或存储对象。在创建归档文件之后，不能改变这个指定内容。
不能使用CFile操作来改变文件的状态直到已经关闭归档文件时。任何这样的操作都将会毁弃归档文件的完整性。通过由GetFile成员函数获得归档文件的文件对象使得可在串行化过程中的任何时候访问文件指针的位置。然后使用CFile::GetPosition函数。应该在获得文件指针位置之前，调用CArchive::Flush。

示例：
extern char* pFileName;
CFile f;
char buf[512];
if(!f.Open( pFileName,CFile::modeCreate| CFile::modeWrite))
{
#ifdef_DEBUG
afxDump<< "Unable to open file"<< "\n"
exit(1);
#endif
}

CArchive ar( &f, CAchive::strore,512,buf);

请参阅：
CArchive::Close, CArchive::Flush, CFile::Close


 CArchive::Close

void Close( )
throw( CArchiveException,CFileException);

说明：
冲掉保存在缓冲区中的任何数据，关闭归档文件并且释放归档文件与文件的链接。对于归档文件没有允许的其它操作。在关闭一个归档文件之后，可以为一个同样文件创建另一个归档文件或者关闭文件。
成员函数Close保证所有数据从归档文件传输到文件并且使归档文件无效。为了完成从文件到存储介质的传输，必须首先使用CFile::Close并且再毁弃CFile对象。

请参阅：CArchive::Flush, CArchive::Abort


 CArchive::Flush

void Flush( );
throw( CFileException);

说明：
迫使保留在归档文件中的数据写入文件。
成员函数Flush保证所有的数据从归档文件传输到文件。必须调用CFile::Close来完成从文件到存储介质的传输。

请参阅：
CArchive::Close, CFile::Flush, CFile::Close


 CArchive::GetFile

CFile* GetFile( ) const

返回值：指向正在使用的CFile对象的指针。

说明：
为此归档文件获得CFile对象指针。必须在使用GetFile之前冲掉归档文件。

示例：
extern CArchive ar;
const CFile* fp = ar.GetFile( );

请参阅：CArchive::Flush


 CArchive::GetObjectSchema

UINT GetObjectSchema( )

返回值：返回在非串行化过程中，被读入对象的版本。

说明：
由Serialize函数调用此函数，确定当前被非串行化的对象的版本。当CArchive对象正在被装载时，调用此函数才是有效的（CArchive::IsLoading则返回非零值）。它必须是Serialize函数的第一次调用而且只能调用一次。返回值-1（UINT）说明版本数未知。
CObject派生类可以使用与大纲版本自己（在IMPLEMENT_SERIALH宏里）结合起来使用的VERSIONABLE_SEHEMA，创建一个“版本化对象”，即一个对象它的成员函数可以读入多个版本。当版本不匹配时，缺省的框架功能（不带有VERSIONABLE_SHEMA）将异常信号。

示例：
IMPLEMENT_SERIAL(CMyObject,CObject,VERSIOANABLE_SCHEMA|1)
void CMyObject::Serialize(CArchive& ar)
{
if (ar.Isloading( ))
{
int nVersion = ar.GetObjectSchma( );
switch(nVersion)
{
case 0:
//read in previous version of
//this object
break;
case 1:
//read in current version of
//this object
break;
default:
//report unknown version of
//this object
break;
}
}
else
{
//Normal soring code goes here
}
}

请参阅：
CObject::Serialize, CObject::IsSerializable, IMPLEMENT_SERIAL, DECLARE_SERIAL, CArchive::IsLoading


 CArchive::IsBufferEmpty

BOOL IsBufferEmpty( ) const

返回值：
如果归档文件的缓冲为空，则返回非零值，否则为0。

说明：
调用此函数，确定归档文件的缓冲区是否为空。此函数支持使用Windows套接字类CSocketFile编程。对与CFile对象有关的归档文件则不需要使用它。
与CSocketFile对象相关的归档文件使用IsBufferEmpty的原因是归档文件的缓冲区可能包含多个消息或记录。在接收一个消息时，应该使用IsBufferEmpty控制这样一个循环，它不断地接收数据，直到缓冲区为空。如果要了解更多的内容，请参阅类CAsyncSocket的Rceive成员函数以及MFC高级概念样例CHATSRVR，它将告诉你如何使用IsBufferEmpty。
如果要了解更多的内容，请参阅联机文档“Visual C++程序员指南”中的“Windows套接字：在归档文件中使用套接字”。

请参阅：CSocketFile, CAsyncSocket::Receive


 CArchive::IsLoading

BOOL IsLoading( ) const

返回值：
如果正在装载归档文件，则返回非零值，否则为0。

说明：
确定归档文件是否正在装载数据。此成员函数由归档文件类的Serialize函数调用。

示例：
int i;
extern CArchive ar;
if (ar.Isloading( )) ar>>i;
else ar << i;

请参阅：CArchive::IsStoring


 CArchive::IsStoring

BOOL IsStorng( ) const;

返回值：
如果正在存储归档文件，则返回非零值，否则为0。

说明：
确定是否正在存储归档文件。这个函数由归档文件类的Serialize函数调用。
如果归档文件的IsStoring状态为非零，则它的IsLoading状态为0，反之亦然。

示例：
int i;
extern CArchive ar;
if(ar.IsStoring( )) ar< else ar>>i;

请参阅：CArchive::IsLoading


 CArchive::MapObject

void MapObject(const CObject* pOb);

参数：
pOb 指向正在存储的对象的指针。

说明：
调用此成员函数在映射中放置对象。此映射没有真的对文件串行化，但是对参考的子对象有效。举例来说，可能不想串行化一个文档，但是想对作为文档一部分的项串行化。通过调用MapObject，可允许那些项或子对象参考文档。而且，串行化子项还可以串行化它们的m_pDocument向后的指针。
当要把数据存储到CArchive对象和从它装载数据时，可以调用MapObject。在串行化和非串行化的过程中，MapObject向由CArchive保持的内部数据结构添加特定的对象，但是它不象ReadObject和WriteObject那样，它不会对对象串行化。

示例：
//MyDoc.h
//Document should have DECLEAR_SERIAL and IMPLEMENT_SERIAL
class CMyDocument: public CDocument
{
CObList m_listOfSubItems;
...
DECLARE_SERIAL(CMyDocument)
};
//MyDoc.cpp
...
IMPLEMENT_SERIAL(CMyDocument.CObject,1)
...
void CMyDocument::Serialize(CArchive& ar)
{
if (ar.IsStoring( ))
{
//TODO:add storing code here
}
else
{
//TODO:add loading code here
}
ar.MapObject(this);
//serialize the subitems in the documents;
//they will be able to serialize their m_pDoc
//back pointer
m_listOfSubItems.Serialize(ar);
}

//SubItem.h
class CSubItem:public CObject
{
public:
CSubItem(CMYDocument * pdoc) { m_pDoc = pDoc }
//back pointer to owning document
CMYDocument* m_pDoc
WORD m_I; //other item data
virtual void Serialize(CArchive& ar);
};

//SubItem.cpp
void CSubItem:Serialize(CArchive& ar)
{
if (ar.IsStoring( ))
{
//will serializing a reference
//to the “mapped”document pointer
ar < ar< }
else
{
//will load a reference to
//the “mapped”document pointer
ar >>m_pDoc;
ar >>m_i;
}
}

请参阅：CArchive::ReadObject, CArchive::WriteObject


 CArchive::Read

UINT Read(void* lpBuf,UINT nMax);
throw(CFileException);

返回值：
包含实际读入字节数的无符号整数。如果返回值小于所需要的数值，则说明已达到了文件的末尾。达到文件末尾时，没有异常。

参数：
lpBuf | 指向提供的缓冲区的指针。这个提供的缓冲区接收从归档文件读取的数据。
nMax | 标明从归档文件读取的字节数的无符号指针。

说明：
从归档文件读取指定的字节数。归档文件不解释字节数。
可以在Serialize函数里使用Read成员函数，读取包含在对象中的普通结构。

示例：
extern CArchive ar;
char pb[100];
UINT nr=ar.Read(pb.100);


 CArchive::ReadClass

CRuntimeClass* ReadClass(
const RuntimeClass* pClassRefRequested = NULL,
UINT* pSchema = NULL,
DWORD* obTag = NULL
);
throw(CArchiveException);
throw(CNotSupportedException);

返回值：指向CRuntimeClass结构的指针。

参数：
pClassRefRequested | 指向CRuntimeClass结构的指针，此结构对应于所需要的类的参考。可以为NULL。
pSchema | 指向原先存储的运行时类的大纲的指针。
obTag | 代表对象的唯一标识的数值。通过ReadObject的实现，在内部使用。只用于高级编程。obTag通常应为NULL。

说明：
调用此成员函数来读取一个原先存储在WriteClass中的类的参考。
如果pClassRefReguested不为NULL，ReadClass证明了归档文件类信息与例程类是兼容的。
如果不兼容，ReadClass将产生一个CArchiveException。
例程必须使用DECLARE_SERIAL和IMPLEMENT_SERIAL，否则，ReadClass将产生一个CNotSupportedException。
如果pSchema为NULL，则存储类的大纲可通过调用CArchive::GetObjectSchema来恢复，否则，*pSchema将会包含原先存储的运行时类的大纲。
可以使用SerializeClass来代替ReadClass，它可以处理类参考的读和写。

请参阅：
CArchive::WriteClass, CArchive::GetObjectSchema, CArchive::SetObjectSchema, CArchiveException, CNotSupportedException, CArchive::SerializeClass


 CArchive::ReadObject

CObject* ReadObject(const CRuntimeClass* pClass);
throw(CFileException, CArchiveException, CMemoryException);

返回值：
CObject指针。它必须通过使用CObject::IsKindOf安全地指向当前的派生类。

参数：
pClass 指向CRumtimeClass结构的常量指针。此结构对应于期待读入的对象。

说明：
从归档文件中读入对象并构造一个合适类型的对象。
此函数通常由CArchive提取（>>）运算符重载一个CObject指针调用它。ReadObject，反过来，调用归档文件类的Serlialize函数。
如果提供一个非零的pClass参数，它可以从RUNTIME_CLASS获得，则函数确认归档文件的运行类。假设在类的实现中已经使用IMPLEMENT_SERIAL宏。

请参阅：CArchive::WriteObject, CObject::IsKindOf


 CArchive::ReadString

BOOL ReadString(CString& rString);
LPTSTR ReadString(LPTSTR lpsz, UINT nMax);
throw(CArchiveException);

返回值：
在返回逻辑值的版本中，True代表成功；False相反。
在返回LPTSTR的版本中，LPTSTR是一个指向包含文字数据的缓冲区的指针，NULL代表到达文件尾。

参数：
rString | CString的一个参考。CString将包含从与CArchive对象有关的文件中读出的结果字符串。
lpsz | 指定一个指向提供的缓冲区的指针。此缓冲区将接收一个以空终止符结尾的文字串。
nMax | 指定读入字符的最大数。它不允许小于lpsz缓冲区的大小。

说明：
调用此函数从与CArchive对象有关的文件中读取数据，放入缓冲区。在带有nMax参数的成员函数的版本中，缓冲区最多有nMax-1字符。读入的操作由一个回车换行符终止。在新行符号后面的字符都被丢弃了。在每种情况下，都有一个空字符（“/0”）。
CArchive::Read还对文本-模式输入有效，但是它不以回车换行符终止。

请参阅：
CArchive::Read, CArchive::WriteString, CArchiveException


 CArchive::SerializeClass

void SerializeClass(const CRuntimeClass* pRuntimeClass);

参数：
pRuntimeClass 指向基类的运行类对象的指针。

说明：
当想存储和装载一个基类的版本信息时，调用此成员函数。SerializeClass读或对CArchive对象写一个类的参考，取决于CArchive的方向。使用SerializeClass来代替ReadClass和WriteClass，可以使得更方便地串行化基类对象。因为SerializeClass需要较少的代码和参数。
像ReadClass一样，SerializeClass证明了归档文件信息与的例程类兼容。如果不兼容，则SerializeClass将一个CArchiveException。
运行类必须使用DECLARE_SERIAL和IMPLEMENT_SERIAL,否则，SerializeClass将会一个CNotSupportException。
使用RUMTIME_CLASS宏，恢复pRuntimeClass参数的值。基类必须已经使用IMPLEMENT_SERIAL宏。

示例：
class CBaseClass:public CObject{...};
class CDerivedClass:public CBaseClass{...};
void CDerivedClass::Serialize(CArchive& ar)
{
if(ar.IsStoring( ))
{
//normal code for storing contents
//of this object
}
else
{
//normal code for reading contents
//of this object
}
//allow the base class to serialize along
// with its version information
ar.SerializeClass(RUNTIME_CLASS(CBaseClass));
CBaseClass::Serialize(ar);
}

请参阅：
CArchive::ReadClass, CArchive::WriteClass, CArchive::GetObjectSchema, CArchive::SetObjectSchema, CArchiveException, CNotSupportedException


 CArchive::SetLoadParams

void SetLoadParams(UINT nGrowBy=1024);

参数：
nGrowBy 如果必须扩大容量的话，这是分配的元素的最小数。

说明：
当要由归档文件读入大量CObject派生对象时，调用SetLoadParams。CArchive使用一个装载数组，解决对存储在归档文件中的对象的参考。SetLoadParams允许设置装载数组扩展的大小。
在装载任何对象或调用MapObject或调用ReadObject之后，不需要调用SetLoadParams。
示例：
class CMyLargeDocument:public CDocument{...};
void CMyLargeDocument::Serialize(CArchive& ar)
{
if (ar.IsStoring( )) ar.SetStoreParams( ); //use large defaulte
else ar.SetLoadParams( );
if (ar.IsStoring( ))
{
//code for storing CMyLargeDocument
}
else
{
//code for loading CMyLargeDocument
}
}

请参阅：CArchive::SetStoreParams


 CArchive::SetLoadSchema

void SetLoadSchema(UINT nSchema);

参数：
nSchema 指定对象的大纲。

说明：
调用此成员函数，设置存储在归档文件中的对象大纲。将此设置值放入nSchema中。对GetObjectSchema的再一次调用，将返回存储在nSchema中的值。
SetObjectSchema可用于高级版本：例如，当想在一个派生类的Serialize函数中读入一个特别版本时。

请参阅：CArchive::GetObjectSchema


 CArchive::SetObjectSchema

void SetObjectSchema( UINT nSchema );

参数：
nSchema 指定该对象的计划。

说明：
调用该成员函数将保存在archive对象中的对象计划设置为nSchema指定的项目。
之后调用的GetObjectSchema函数将返回保存在nSchema中的值。
SetObjectSchema的高级使用：比如，当你想在一个派生类的Serialize函数中读入一个特殊版本。

示例：
CFile myFile("myfile.dat", CFile::modeCreate | CFile::modeRead);
CArchive ar(&myFile, CArchive::load);

// Set schema to 2 and verify.
ar.SetObjectSchema(2);
ASSERT(ar.GetObjectSchema() == 2);

请参阅：CArchive::GetObjectSchema


 CArchive::SetStoreParams

void SetStoreParams(UINT nHashSize=2053,UINT nBlockSize=128);

参数：
nHashSize | 用于指针映射接口的哈希表的大小，必须是一个素数。
nBlockSize | 为扩展参数指定内存分配间隔。要获得最好的执行效果，应该是2的倍数。

说明：
当在一个归档文件中存储许多CObject派生对象时，使用SetStoreParams。
SetStoreParams允许设定哈希表的大小和映射的块的大小。映射用来在串行化的过程中标识唯一的对象。
在存储任何一个对象或调用MapObject或WriteObject之后，不需要调用SetStoreParams。

示例：
class CMyLargeDocument:public CDocument{...};
void CMyLargeDocument::Serialize(CArchive& ar)
{
if (ar.IsStoring( )) ar.SetStoreParams( ); //use large defaults
else ar.SetLoadParams( );
if (ar.IsStoring( ))
{
//code for storing CMyLargeDocument
}
else
{
//code for loading CMyLargeDocument
}
}

请参阅：CArchive::SetLoadParams


 CArchive::Write

void Write(const void* lpBuf, UINT nMax);
throw(CFileException);

参数：
lpBuf | 指向提供的缓冲区的指针。缓冲区中包含了将被写入归档文件的数据。
nMax | 指定要被写入归档文件的字节数的整数。

说明：
向归档文件写入特定的字节数。归档文件不会格式化字节。
可以在Serialize函数中使用Write成员函数，写入一个包含在对象中的普通结构。

示例：
extern CArchive ar;
char pb[100];
ar.Write(pb.100);

请参阅：CArchive::Read


 CArchive::WriteClass

void WriteClass(const CRuntimeClass* pClassRef);

参数：
pClassRef 指向CRuntimeClass结构的指针。此结构对应于所需要的类的参考。

说明：
在一个派生类的串行化过程中，使用WriteClass存储基类的版本和类信息。WriteClass将基类的CRuntimeClass参考写入CArchive。使用CArchive::ReadClass恢复参考。
WriteClass证明了归档文件信息与例程类兼容。如果不兼容，WriteClass将CArchive::Exception。
例程必须使用DECLARE_SERIAL和IMPLEMENT_SERIAL。否则，WriteClass将一个CNotSuppotedException。
可以使用SerializeClass代替WriteClass，它将处理类参考的读与写。

请参阅：
CArchive::ReadClass, CArchive::GetObjectSchema, CArchive::SetObjectSchema, CArchive::SerializeClass, CArchiveException, CNotSupportedException


 CArchive::WriteObject

void WriteObject(const CObject* pOb);
throw(CFileException,CArchiveException);

参数：
pOb 被存储对象的常量指针。

说明：
将特定的CObject存储到归档文件中。
此函数通常由重载CObject的CArchive插入（<<）运算符调用。WriteClass反过来，调用归档类的Serialize函数。
必须使用IMPLEMENT_SERIAL宏归档。WriteObject将ASCII类名写入归档文件。在装载过程之后，此类名会被验证。一个特定的编码设计会防止对于多个对象类名的不必要的重复使用。还能防止是多个指针目标的对象的多余存储。
正确的对象编码方法（包括在现在的ASCII类名中）是一个实现细节并且在库的以后版本中可以改变。

注意：
在归档之前，结束创建、删除和修改所有对象。如果把归档和对象修改混合，则归档文件将会被废弃。

请参阅：CArchive::ReadObject


 CArchive::WriteString

void WriteString(LPCTSTR lpsz);
throw(CFileException);

参数：
lpsz 使用此成员函数将数据从一个缓冲区写入与CArchive对象有关的文件中。结束的空字符（‘\0’）不被写入文件，新行也不自动写入。

说明：
WriteString对于几种情况都可以异常，包括磁盘满时。Write还是有效的，但不是以空终止符结尾，而是它向文件写入需要的字节数。

请参阅：
CArchive::Write, CArchive::Read, CArchive::ReadString, CFileException


 CArchive::m_pDocument

说明：
缺省情况下，设置为NULL。这个指向CDocument的指针可以被设置为CAchive实例的想设置的任何一种情况。一个关于此指针的通用使用就是把有关串行化进程的附加信息传递给所有被串行化的对象。在文档（CDocument派生类）正在串行化时，通过初始化指针归档。这样一来，如果必要的话，文档中的对象就可以访问文档。此指针在串行化时还可以由COleClientItem对象使用。
当一个打开文件或保存命令时，框架对正在串行化的文档设置m_pDocument。如果不是因为打开文件或保存的原因要串行化一个对象链接和嵌入（OLE）包容器文档，则必须明确地设置m_pDocument。举例来说，当对一个剪贴板串行化一个包容器文档时，应该这样做。

请参阅：CDocument, COleClientItem


 CArchive::operator <<

friend CArchive& operator << (CArchive& ar, const CObject* pOb);
throw (CArchiveException, CFileException);
CArchive& operator <<(BYTE by);
throw (CArchiveException, CFileException);
CArchive& operator <<(WORD w);
throw (CArchiveException, CFileException);
CArchive& operator <<(int i);
throw (CArchiveException, CFileException);
CArchive& operator <<(LONG l);
throw (CArchiveException, CFileException);
CArchive& operator <<(DWORD dw);
throw (CArchiveException, CFileException);
CArchive& operator <<(float f);
throw (CArchiveException, CFileException);
CArchive& operator <<(double d);
throw (CArchiveException, CFileException);

返回值：
CArchive参考，它可以在一行上使用多个提取运算符。

说明：
把确切的对象或主要类型存储到归档文件中。
如果在类的实现中使用IMPLEMENT_SERIAL宏，然后重载CObject的插入运算符调用被保护的WriteObject。此函数反过来调用类的Serialize函数。

示例：
long l;
int i;
extern CArchive ar;
if (ar.IsStoring( )) ar<<l<<i;

请参阅：CArchive::WriteObject, CObject::Serialize


 CArchive::operator >>

friend CArchive& operator >>(CArchive& ar, CObject* pOb);
throw (CArchiveException,CFileException,CMemoryException);
friend CArchive& operator >>(CArchive& ar,const CObject* pOb);
throw (CArchiveException,CFileException,CMemoryException);
CArchive& operator >>(BYTE& by);
throw (CArchiveException,CFileException);
CArchive& operator >>(WORD& w);
throw (CArchiveException,CFileException);
CArchive& operator >>(int& i);
throw (CArchiveException,CFileException);
CArchive& operator >>(LONG& l);
throw (CArchiveException,CFileException);
CArchive& operator >>(DWORD& dw);
throw (CArchiveException,CFileException);
CArchive& operator >>(float& f);
throw (CArchiveException,CFileException);
CArchive& operator >>(double& d);
throw (CArchiveException,CFileException);

返回值：
可使多个插入运算符在一行上的CArchive参考。

说明：
由归档文件装载确定的对象或主要类型。
如果在类的实现中使用IMPLEMENT_SERIAL宏，然后重载CObject的提取运算符调用被保护的ReadObject函数（带有一个非零的运行时指针）。此函数反过来调用类的Serialize函数。

示例：
int i;
extern CArchive ar;
if(ar.IsLoading( )) ar>>i;

请参阅：CArchive::ReadObject, CObject::Serialize


 CArchiveException

CObject
└CException
└CArchiveException

CArchiveException对象标识一个串行化异常条件。CArchiveException类包括一个公共数据成员，它可以确定异常的原因。
CArchiveException在CArchive成员函数被构造并可以在一个CATCH表达式的范围内访问这些对象。原因代码与运行系统无关。如果要了解关于异常进程的更多信息，请参阅联机文档“Visual C++程序员指南”中的“异常”。
#include <afx.h>

请参阅：CArchive, AfxThrowArchiveException, Exception Processing

CArchiveException类的成员

数据成员
m_cause 确定异常原因

构造函数
CArchiveException 构造一个CArchiveException对象


 CArchiveException::CArchiveException

CArchiveException( int cause = CArchiveException::none );

参数：
cause 枚举类型。它确定了的异常的原因。关于枚举列表，请参阅m_cause数据成员。

说明：
构造一个CArchiveException对象，在对象中存储cause的值。可以在堆上创建一个CArchiveException对象并且它或让全局函数AfxTrowArchiveException处理它。
不要直接构造程序，而要调用全局函数AfxTrowArchiveException。


 CArchiveException::m_cause

说明：
指定异常的原因。此数据成员是一个int类型的公共变量。它的值由CArchiveException枚举类型定义。枚举类型和它的含义如下：
· | CArchiveException::none | 没有错误发生
· | CArchiveException::generic | 没有指定错误
· | CArchiveException::readOnly | 企图向一个为装载打开的归档文件中写入
· | CArchiveException::endOfFile | 当读一个对象时达到文件末尾
· | CArchiveException::writeOnly | 企图由一个为存储打开的归档文件中读取
· | CArchiveException::badClass | 企图将一个对象读入一个错误的对象类型中
· | CArchiveException::badSchema | 企图读入一个不同版本类的对象

注意：
这些CArchiveException导致枚举类型与CFileException导致枚举不同。


 CArray

CObject
└CArray

template <class TYPE, class ARG_TYPE> class CArray : public CObject

参数：
TYPE | 模板参数指定存储在数组中的对象的类型。TYPE是一个由CArray返回的参数。
ARG_TYPE | 模板参数指定用于访问存储在数组中对象的参数类型。通常是一个对TYPE的参考。ARG_TYPE是一个传递给CArray的参数。

说明：
CArray类支持与CArray相似的数组，但是必要时可以动态压缩并扩展。数组索引从0开始。可以决定是固定数组上界还是允许当添加元素时扩展当前的边界。内存对上界是连续地分配空间，甚至一些元素可为空。
和CArray一样，CArray索引元素的访问时间是不变的，与数组大小无关。

提示：
在使用一个数组之前，使用SetSize建立它的大小和为它分配内存。如果不使用SetSize，则为数组添加元素就会引起频繁地重新分配和拷贝。频繁地重新分配和拷贝不但没有效率，而且导致内存碎片。

如果需要一堆数组中的个别数据，必须设置CDumpContext对象的深度为1或更大。
此类的某成员函数调用全局帮助函数，它必须为CArray的大多数使用而定制。请参阅宏和全局量部分中的“类收集帮助器”。
当从一个CArray对象中移去元素时，帮助函数DestructElements被调用。
当添加元素时，帮助函数ConstructElements被调用。
数组类的派生与列表的派生相似。
如果要了解关于使用CArray的更多信息，请参阅联机文档“Visual C++程序员指南”中的“收集”。
#include <afxtempl.h>

请参阅：
CObArray, DestructElements, ConstructElements, Collection ClassHelpers

CArray类的成员

构造函数
CArray | 构造一个空数组属性
GetSize | 获得此数组中的元素数
GetUpperBound | 返回最大的有效索引值
SetSize | 设置包含在此数组中的元素数

操作
FreeExtra | 释放大于当前上界的未使用的内存
RemoveAll | 从此数组移去所有元素元素访问
GetAt | 返回在给定索引上的值
SetAt | 设定一个给定索引的值；数组不允许扩展
ElementAt | 返回一个对数组中元素指针的临时参考
GetData | 允许对数组中的元素访问。可以为NULL扩展数组
SetAtGrow | 为一个给定索引设置值；如果必要，扩展数组
Add | 在数组的末尾添加元素；如果必要，扩展数组
Append | 在数组上附加另一个数组；如果必要，扩展数组
Copy | 把另一个数组拷贝到数组上；如果必要，扩展数组

插入/移去
InsertAt | 在指定的索引上插入一个元素（或另一个数组中的所有元素）
RemoveAt | 在指定的索引上移去一个元素

运算符
operator [] 在特定索引上设置或获取元素


 CArray::Add

int Add(ARG_TYPE newElement);
throw(CMemoryException);

返回值：添加元素的索引。

参数：
ARG_TYPE | 模板参数指定应用数组中元素的参数的类型。
newElement | 被加入此数组的元素。

说明：
在数组的末尾加入一个新的元素，数组长度加1。如果SetSize已经使用nGrowBy值比1大，则内存按其分配。无论怎样，上界只增长1。

示例：
//example for CArray:Add
CArray ptArray;
CPoint pt(10.20);
ptArray.Add(pt); //Element 0
ptArray.Add(CPoint(30,40)); //Element 1

请参阅：
CArray::SetAt, CArray::SetAtGrow, CArray::InsertAt, CArray::operator []


 CArray::Append

int Append(const CArray& src);

返回值：第一个附加元素的索引。

参数：
src 附加到数组的元素的源。

说明：
调用此成员函数将一个数组的内容附加到另一个数组的末尾。数组必须是同一种类型。
如果必要，Append将分配更多的内存来存储附加到数组上的元素。

请参阅：CArray::Copy


 CArray::CArray

CArray( );

功能：构造一个空数组。数组一次扩展一个元素。

请参阅：CObArray::CObArray


 CArray::Copy

void Copy(const CArray& src);

参数：
src 被拷贝到数组中的元素的源。

说明：
使用此成员函数将一个数组的元素拷贝到另一个数组中。
调用此成员函数用另一个数组的元素复写数组的元素。Copy不会释放内存；但是，如果必要，Copy可以为拷贝到数组的元素分配更多的内存。

请参阅：CArray::Append


 CArray::ElementAt

TYPE& ElementAt(int nIndex);

返回值：数组元素的参考。

参数：
TYPE | 指定数组元素类型的模板参数。
nIndex | 比0大或比0小的整数索引，并且小于或等于由GetUpperBound返回的值。

说明：
返回一个对数组中指定元素的临时参考。它用于实现数组的左边界分配运算符。

请参阅：CArray::operator []


 CArray::FreeExtra

void FreeExtra( );

说明：
释放任何当数组扩展时所分配的额外的内存空间。此函数不影响数组的大小和上界。


 CArray::GetAt

TYPE GetAt(int nIndex) const;

返回值：当前在索引上的数组元素。

参数：
TYPE | 指定数组元素类型的模板参数。
nIndex | 比0大或比0小的整数索引，并且小于或等于由GetUpperBound返回的值。

说明：返回特定索引的数组元素。

注意：
传递一个负值或一个比由GetUpperBound返回值大的值将会引起失败。

请参阅：
CArray::SetAt, CArray::operator []


 CArray::GetData

const TYPE* GetData( ) const;
TYPE* GetData( );

返回值：指向数组元素的指针。

参数：
TYPE 指定数组元素类型的模板参数

说明：
使用此成员函数，获得对数组中元素的直接访问。如果没有元素是有效的，GetData返回一个空值。
当对数组元素的直接访问可使工作更快时，当调用GetData时请使用警告，任何直接引起的错误都会影响数组元素。

请参阅：
CArray::GetAt, CArray::SetAt, CArray::ElementAt


 CArray::GetSize

int GetSize( ) const;

说明：
返回数组的大小。既然索引基于0，所以数组的大小比最大的索引多1。

请参阅：CArray::GetUpperBound, CArray::SetSize


 CArray::GetUpperBound

int GetUpperBound( ) const;

说明：
返回数组的上界。因为数组索引基于0，此函数返回值比GetbSize小1。GetUpperBound=-1的条件确定了数组中没有包含元素。

请参阅：CArray::GetSize, CArray::SetSize


 CArray::InsertAt

void InsertAt(int nIndex, ARG_TYPE newElement, int nCount = 1);
throw(CmemoryException);
void InsertAt(int nStarIndex, CArray* pNewArray);
throw(CMemoryException);

参数：
nIndex | 整数值，它可以比GetUpperBound返回值大。
ARG_TYPE | 指定数组元素类型的模板参数。
newElement | 要被放置到数组中的元素。
nCount | 此元素应被插入的次数（缺省为1）。
nStarIndex | 整数索引，它可以比GetUpperBound返回值大。
pNewArray | 要被加入此数组的另一个包含元素的数组。

说明：
InsertAt的第一个版本在数组的特定索引上插入一个元素（或元素的多个拷贝）。在此过程中，移动（通过索引值的增加）此索引上原有的元素，并且移动所有在其后的元素。
第二个版本由另一个CArray收集插入所有元素，从nStartIndex位置开始。
SetAt函数替换一个特定数组元素，不移动任何元素。

示例：
//example for CArray::Insert
CArray ptArray;
ptArray.Add(CPoint(10,20)); //Element 0
ptArray.Add(CPoint(30,40)); //Element 1(will become element 2)
ptArray.InsertAt(1,CPoint(50,60)); //New element 1

请参阅：CArray::GetUpperBound, CArray::SetAt, CArray::RemoveAt


 CArray::RemoveAll

void RemoveAll( );

说明：
从此数组中移去所有元素。如果数组已经为空，此函数也起作用。


 CArray::RemoveAt

void RemoveAt(int nIndex, int nCount = 1);

参数：
nIndex | 整数索引。它大于或等于0并且小于或等于GetUpperBound返回值。
nCount | 删除元素的数量。

说明：
从数组指定的索引起删除一个或多个元素。在这个过程中，它将所有的元素向下移动。它减少数组的上界值，但是不释放内存。
如果试图删除包含在数组中在删除点之上的多个元素，则使用库断言的调试版本。


 CArray::SetAt

void SetAt(int nIndex, ARG_TYPE newElement);

参数：
nIndex | 整数索引。它大于或等于0并且小于或等于GetUpperBound返回值。
ARG_TYPE | 指定用于参考数组元素的参数类型的模板参数。
newElement | 被存储在指定位置的新的元素值。

说明：
在指定的索引设置数组元素。SetAt将不会引起数组增长。
如果想让数组自动增长，请使用SetAtGrow。
必须保证索引值表示的是一个数组中的有效位置。如果它超出了边界，则使用库断言的调试版本。

请参阅：
CArray::GetAt, CArray::SetAtGrow, CArray::ElementAt, CArray::operator []


 CArray::SetAtGrow

void SetAtGrow(int nIndex, ARG_TYPE newElement);
throw(CMemoryException);

参数：
nIndex | 整数索引。它大于或等于0。
ARG_TYPE | 指定数组元素类型的模板参数。
newElement | 被添加在此数组的元素值。允许空值。

说明：
在指定的索引上设置数组元素。如果必要，数组自动增长（调整上界以接纳新元素）。

示例：
//example for CArray::SetAtGrow
CArray ptArray;
ptArray.Add(CPoint(10,20)); //Element 0
ptArray.Add(CPoint(30,40)); //Element 1
//Element 2 deliberately skipped
ptArray.SetAtGrow(3,CPoint(50,60)); //Element 3

请参阅：
CArray::GetAt, CArray::SetAt, CArray::ElementAt, CArray::operator []


 CArray::SetSize

void SetSize(int nNewSize, int nGrowBy = -1);
throw(CMemoryException);

参数：
nNewSize | 新的数组大小（元素的个数）。必须大于或等于0。
nGrowBy | 如果有必要扩展数组大小时，这是要分配的元素位置的最小值。

说明：
建立一个空的或已存在数组的大小；如果必要，则分配内存。
如果新的大小比以前的大小的话，则数组被截短并且所有未使用的内存被释放。
在开始使用数组之前，使用此函数设置数组的大小。
如果没有使用SetSize，则为数组添加元素就会引起频繁地重分配和拷贝。频繁地重分配和拷贝不仅无效率，而且会造成内存碎片。
当数组正在扩张时，nGrowBy参数会影响内部地内存分配。正象GetSize和GetUpperBound提到地那样，它的使用不会数组大小。如果使用缺省值，则MFC分配内存会使用计算方法，避免内存碎片并加已优化，使之对大多数的情况都更有效率。

请参阅：CArray::GetUpperBound, CArray::GetSize


 CArray::operator []

TYPE& operator[](int nIndex);
TYPE& operator[](int nIndex) const;

参数：
TYPE | 指定此数组中元素的类型的模板参数。
nIndex | 被访问的元素的索引。

说明：
这些下标运算符可方便地取代SetAt和GetAt函数。第一个运算符，不是常量的数组调用它，可以用在赋值语句的右（右值）或左（左值）边。第二个，为常量数组调用，只能用在赋值语句的右边。
如果下标（一个赋值语句的左或右边）超出了边界，则使用库断言的调试版本。

请参阅：
CArray::GetAt, CArray::SetAt, CArray::ElementAt


 CAsyncMonikerFile

CObject
└CFile
└COleStreamFile
└CMonikerFile
└CAsyncMonikerFile

CAsyncMonikerFile提供了在ActiveX控件（以前的OLE控件）中使用异步标识的功能。它是由CMonikerFile派生而来，CMonikerFile又是由COleStreamFile派生出来的。CAsyncMonikerFile使用IMoniker接口可以异步访问任意数据流，包括从一个URL中异步地装载文件。这些文件可以是ActiveX控件的数据路径特性。
异步标识主要用于支持Internet的应用和ActiveX控件，在文件传输中提供了一个灵活的界面。一个主要的例子就是使用CDataPathProperty来提供ActiveX控件的异步特性。在一个长时间的交换进程中，CDataPathProperty对象将重复地被调用，以确定新数据的有效性。
如果要了解有关在Internet应用中如何使用异步标识和ActiveX控件，请参阅联机文档“Visual C++程序员指南”中的以下章节：
· | “Internet初步：异步标识”
· | “Internet初步：ActiveX控件”
#include <afxole.h>

请参阅：
CMoniker, CDataPathProperty, 联机文档Win32 SDK中“OLE程序员参考”中的“异步和同步标识”。

CAsyncMonikerFile类的成员

构造函数
CAsyncMonikerFile 构造一个CAsyncMonikerFile对象

操作
GetBinding | 获取一个异步传输约束的指针
GetFormatEtc | 获取流中数据的格式

可覆盖的函数
Close | 关闭并释放所有的资源
CreateBindStatusCallback | 创建一个实现IBindStatusCallback的COM对象
GetBindInfo | 通过OLE系统库调用来获取被创建约束类型的信息
GetPriority | 通过OLE系统库调用来获取约束的优先级
OnDataAvailable | 在异步约束操作中，调用它来向客户提供有效的数据
OnLowResource | 当资源比较少时被调用
OnProgress | 在数据下载过程中调用它来标示进程
OnStartBinding | 当约束被启动时调用
OnStopBinding | 当异步传输被终止时调用
Open | 异步地打开一个文件


 CAsyncMonikerFile::CAsyncMonikerFile

CAsyncMonikerFile( );

说明：
构造一个CAsyncMonikerFile对象。它不创建IBindHost接口。IBindHost只有在Open函数中提供时，才使用IBindHost。
如果想了解有关IBindHost接口的介绍，请参阅联机文档“ActiveX SDK”。

请参阅：CDataPathProperty, CAsyncMonikerFile::Open


 CAsyncMonikerFile::Close

virtual void Close( );

说明：
通过调用此函数来关闭和释放所有资源。可在未打开或已关闭的文件上调用它。

请参阅：CAsyncMonikerFile::Open


 CAsyncMonikerFile::CreateBindStatusCallback

virtual IUnknown* CreateBindStatusCallback( IUnknown* pUnkControlling);

返回值：
如果pUnkControlling不为NULL，函数返回一个指向支持IBindStatusCallback的新COM对象上的内部IUnknown指针。如果pUnkControlling为NULL，函数返回一个指向支持IBindStatusCallback的新COM对象上的IUnknown指针。

参数：
pUnkControlling 未知控制（外部IUnknown）的指针。如果未使用聚集，pUnkControlling为NULL。

说明：
CAsyncMonikerFile需要一个实现IBindStatusCallback的COM对象。MFC实现这样一个可聚集的对象。可覆盖CreateBindStatusCallback来返回自己的COM对象。可以通过调用带有对自己COM对象未知控制的CreateBindStatusCallback来使自己的COM对象能够聚集MFC的实现。使用CCMDTarget的COM支持的COM对象能够使用CCmdTarget::GetControllingUnknown来获取未知控制。
换句话说，自己的COM对象可通过对CreateBindStatusCallback(NULL)的调用代表MFC的实现。
不带参数调用CreateBindStatusCallback。
如果想了解有关IBindStatusCallback接口的细节，请参阅联机文档“平台SDK”。如果想更多的关于异步约束的信息，请参阅联机文档“平台SDK”中的“如何使用异步约束和进行存储”。有关聚集的讨论，请参阅联机文档“平台SDK”中的“聚集”。


 CAayncMonikerFile::GetBindInfo

virtual DWORD GetBindInfo( ) const;

返回值：
获取IBindStatusCallBack的设置值。如果要了解有关IBindStatusCallBack接口的介绍信息，请参阅联机文档“ActiveX SDK”。

说明：
从一个异步标识的客户调用它来告诉异步标识约束的方式。缺省实现将约束设置为异步的方式来使用一个存储器和数据压入模式。如果想改变约束的行为，请覆盖此函数。
这样做的理由之一就是可以约束使用数据弹出模式而不是数据压入模式。在数据弹出模式中，客户驱动约束操作而且只有在读取标识时，它才提供数据。在数据压入模式中，标识驱动异步约束操作并且连续通知客户端新数据何时可用。


 CAsyncMonikerFile::GetBinding

IBinding* GetBinding( ) const;

返回值：
指向Ibinding接口的指针，此接口在异步传输开始时形成。如果因为某种原因，传输没有异步进行，则返回NULL。

说明：
可调用此函数获取指向异步传输约束的指针。这样，编程人员可通过IBinding接口，如IBinding::Abort,IBinding::Pause和IBinding::Resume，控制异步传输进程。


 CAsyncMonikerFile::GetFormatEtc

FORMATETC* GetFormatEtc( ) const;

返回值：
指向记录正打开的流的Windows结构FORMATETC的指针。如果标识没有约束、它不是异步的，或异步操作没有开始，则返回NULL。

说明：可调用此函数获取流中的数据格式。


 CAsyncMonikerFile::GetPriority

virtual long GetPriority( ) const;

返回值：
异步传输发生的优先级，为以下标准线程优先级标记之一：
THREAD_PRIORITY_ABOVE_HORMAL,
THREAD_PRIORITY_BELOW_HORMAL,
THREAD_PRIORITY_HIGHEST,
THREAD_PRIORITY_IDLE,
THREAD_PRIORITY_LOWEST,
THREAD_PRIORITY_HORMAL,
THREAD_PRIORITY_TIME_CRITICAL。
可查看Windows函数SetThreadPriority，了解对这些值的介绍。

说明：
在约束进程开始收到赋予线程进行约束操作的优先级时，从异步标识客户端调用此函数。不能直接调用GetPriority，缺省情况下返回THREAD_PRIORITY_NORMAL。


 CAsyncMonikerFile::OnDataAvailable

virtual void OnDataAvailable( DWORD dwsize, DWORD bscfFlag );

参数：
dwsize 约束开始后数据传输的累计数（字节）。可以为0，表示数据量与操作无关，或没有。
bscfFlagBSCF枚举值。可为以下值中的一个或几个：
· | BSCF_FIRSTDATANOTIFICATION | 表示对一个特定的约束操作，第一次调用OnDataAvailable。
· | BSCF_INTERMEDIATEDATANOTIFICATION | 表示对一个特定的约束操作，中间调用OnDataAvailable。
· | BSCF_LASTDATANOTIFICATION | 表示对一个特定的约束操作，最后一次调用OnDataAvailable。

说明：
在异步约束操作中，异步标识调用OnDataAvailable，向有效的客户端提供数据。缺省情况下，此函数不作任何操作。请参看下面一种实现的例子。

示例：
//refer to CDataPathProperty.
void CAsyncMyTextProperty::OnDataAvailable(DWORD dwsize, DWORD bscfFlag)
{
if((bscfFlag& BSCF_FIRSTDATANOTIFICATION) != 0)
{ m_dwReadBefore = 0;m_strText.Empty(); }

DWORD dwArriving = dwSize _ m_dwReadBefore;
if (dwArriving > 0)
{
int nLen = m_strText.GetLength();
ASSERT(nLen == m_dwReadBefore);
LPTSTR psz = m_strText.GetBuffer(nLen + dwArriving);
Read(psz+nLen,dwArriving);
m_strText.ReleaseBuffer(nLen + dwArriving);
m_dwReadBefore = dwSize;GetControl()－>Invalidate();
}
}

请参阅：CDataPathProperty


 CAsyncMonikerFile::OnLowResource

virtual void OnLowResource();

说明：
当资源减少时，由标识调用。缺省实现时调用GetBinding()->Abort()。


 CAsyncMonikerFile::OnProgress

virtual void OnProgress(
ULONG ulProgress,
ULONG ulProgessMax,
ULONG ulStatusCode,
LPCTSTR szStatusText
);

参数：
ulProgress | 表示约束操作的当前进程号，相对于ulProgressMax表示的最大数。
ulProgressMax | 表示调用OnProgress的操作中，ulProgress最大可能值。
ulStatusCode | 提供识别约束操作进程的附加信息。有效值在BINDSTATUS枚举值中。请参阅说明，查看可能的取值。
ulStatusText | 有关当前进程的信息，依赖于ulStatusCode的值。请参阅说明，查看可能的取值。

说明：
此函数被标识反复调用，以表示此次约束操作的当前操作。通常在一个长时间的操作中，取一个合适的周期。
ulStatusCode(以及szStatusText)的可能取值是：
· | BINDSTATUS_FINDINGRESOURCE | 约束操作正在查找拥有约束的对象和存储空间的资源。szStatusText提供查找到的资源的显示名称（如“www.microsoft.com”）。
· | BINDSTATUS_CONNECTING | 约束操作正在与约束的对象和存储空间的资源连接。szStatusText提供对象的显示名称（如一个IP地址）。
· | BINDSTATUS_SENDINGREQUEST | 约束操作正在请求约束的对象和存储空间。szStatusText提供对象的显示名称（如一个文件名）。
· | BINDSTATUS_REDIRECTING | 约束操作已被重定向到不同的数据地址。szStatusText提供新数据地址的显示名称。
· | BINDSTATUS_USINGCACHEDCOPY | 约束操作正在从缓存拷贝中获取被请求的对象或存储空间。szStatusText为NULL。
· | BINDSTATUS_BEGINDOWNLOADDATA | 约束操作已经开始接收约束的对象或存储空间。szStatusText提供数据地址的显示名称。
· | BINDSTATUS_DOWNLOADINGDATA | 约束操作正在接收约束的对象或存储空间。szStatusText提供数据地址的显示名称。
· | BINDSTATUS_ENDDOWNLOADDATA | 约束操作已经接收完约束的对象或存储空间。szStatusText提供数据地址的显示名称。
· | BINDSTATUS_CLASSIDAVAILABLE | 正在开始创建约束对象的实例。szStatusText以字符串的形式提供新对象的CLSID，给客户端取消约束操作的机会。


 CAsyncMonikerFile::OnStartBinding

virtual void OnStartBing();

说明：
可在派生类中覆盖此函数，以便在约束开始时执行某些操作。此函数由标识调用，缺省实现时，不作任何操作。

请参阅：CAsyncMonikerFile::OnStopBinding


 CAsyncMonikerFile::OnStopBinding

virtual void OnStopBinding(HRESULT hresult, LPCTSTR szError);

参数：
hresult | HRESULT类型，表示错误或警告的值。
szError | 描述错误的字符串。

说明：
约束操作结束时，由标识调用。可覆盖此函数，以便在传输结束时执行某些操作。缺省情况下，此函数释放IBinding。
要了解IBinding接口的介绍，可参阅联机文档“ActiveX SDK”。

请参阅：CAsyncMonikerFile::OnStartBinding


 CAsyncMonikerFile::Open

virtual BOOL Open( LPCTSTR lpszURL, CFileException* pError = NULL);
virtual BOOL Open( IMoniker* pMoniker,CFileException* pError = NULL);
virtual BOOL Open( LPCTSTR lpszURL, IBindHost* pBindHost, CFileException* pError = NULL);
virtual BOOL Open( IMoniker* pMoniker, IBindHost* pBindHost, CFileException* pError = NULL);
virtual BOOL Open( LPCTSTR lpszURL, IServiceProvider* pServiceProvider, CFileException* pError = NULL);
virtual BOOL Open( IMoniker*pMoniker, IServiceProvider* pServiceProvider, CFileException* pError = NULL);
virtual BOOL Open( LPCTSTR lpszURL, IUnknown* pUnknown, CFileException* pError = NULL);
virtual BOOL Open( IMoniker*pMoniker, IUnknown* pUnknown, CFileException* pError = NULL);

返回值：
如果文件被成功打开，则返回非零值，否则为0。

参数：
lpszURL | 指向被异步打开的文件的指针。此文件可以是任何有效的URL或文件名。
pError | 指向文件异常的指针。发生错误时，将指向其原因。
pMoniker | 指向异步标识接口的指针，它是文档自己的标识的组合，可用IoleClientSite::GetMoniker(OLEWHICHMK_CONTAINER)获取，可从路径名中创建。控件可用此标识约束，但不是控件将要存储的标识。
pBindHost | 指向IBindHost接口的指针，将用来从相关的路径名中创建标识。如果约束的宿主非法，或没有提供一个标识，此调用将为Open(lpszFileName,pError)。要了解有关IBindHost的介绍，可参阅联机文档“ActiveX SDK”。
pServiceProvider | 指向IServiceProvider接口的指针。如果服务提供者非法，或不能提供IBindHost的服务，则此调用将为Open(lpszFileName,pError)。
pUnknown | 指向IUnknown接口的指针。如果找到了IServiceProvider，此函数将查询IBindHost。如果服务提供者非法，或不能提供IBindHost的服务，则此调用将为Open(lpszFileName,pError)。

说明：
可调用此成员函数异步打开文件，此调用初始化约束的进程。
可把URL或文件名作为lpszURL参数，例如：
CMyAsyncMonFile mamf;
mamf.Open(_T("http://www.microsoft.com");
或
CMyAsyncMonFile mamf;
mamf.Open(_T("file:c:\mydata.dat"));

请参阅：CAsyncMonikerFile::CAsyncMonikerFile


 CAsyncScoket

CObject
└CAsyncSocket

CAsyncSocket对象表示一个Windows Socket--一个网络通信的末端。CAsyncSocket类封闭了Windows套接字API，对想使用与MFC连接的Windows套接字的程序员提供了一个面向对象的抽象化概念。
此类是假设已经理解了网络的通信的前提下的。负责处理块、字节排序差异以及Unicode和多个字符集（MBCS）串的对话。如果想要一个更方便的处理这些问题的接口，请参阅CSocket类。
要使用一个CAsyncSocket对象，调用它的构造程序，然后调用Create函数，创建一个基础套接字句柄（SOCKET类型），除了接收型套接字之外。对于一个服务器套接字调用Listen成员函数，对于一个客户套接字调用Connect成员函数。在接收一个连接请求时，服务器套接字应该调用一个Accept函数。使用保留的CAsyncSocket函数解决套接字之间的通信。完成之后，如果它是在堆上被创建的，就废弃掉CAsyncSocket对象。析构程序自动调用Close函数。SOCKET数据类型在联机文档“Visual C++程序员指南”中的“Windows套接字背景”章节中有所描述。
如果要了解更多信息，请参阅联机文档 “Visual C++程序员指南”中的“Windows套接字：使用CAsyncSocket类”和相关章节以及联机文档“Win32 SDK”中的“Windows套接字2的概述”和“Windows套接字编程指南”。
#include <afxsock.h>

请参阅：CSocket, CSocketFile

CAsyncSocket类的成员

构造函数
CAsyncSocket | 构造CAsyncSocket对象
Create | 创建套接字

属性
Attach | 对CAsyncSocket对象附加套接字句柄
Detach | 从CAsyncSocket对象除去套接字句柄
FromHandle | 返回CAsyncSocket对象的指针，给出套接字句柄
GetLastError | 获得上一次运行失败的状态
GetPeerName | 获得与套接字连接的对等套接字的地址
GetSockName | 获得套接字的本地名
GetSockOpt | 获得套接字选项
SetSockOpt | 设置套接字选项

运行
Accept | 接受套接字上的连接
AsyncSelect | 请求对于套接字的事件通知
Bind | 与套接字有关的本地地址
Close | 关闭套接字
Connect | 对对等套接字建立连接
IOCtl | 控制套接字模式
Listen | 建立套接字，侦听即将到来的连接请求
Receive | 从套接字接收数据
ReceiveFrom | 恢复数据报并且存储资源地址
Send | 给连接套接字发送数据
SendTo | 给特定目的地发送数据
ShutDown | 使套接字上的Send和/或Receive调用无效

覆盖通知函数
OnAccept | 通知侦听套接字，它可以通过调用Accept，接受挂起连接请求
OnClose | 通知套接字，关闭对它的套接字连接
OnConnect | 通知连接套接字，连接尝试已经完成，无论成功或失败
OnOutOfBandData | 通知接收套接字，在套接字上有带外数据读入，通常是忙消息
OnReceive | 通知侦听套接字，通过调用Receive恢复数据
OnSend | 通知套接字，通过调用Send，它可以发送数据

数据成员
m_hSocket 指定附加在此CAsyncSocket对象上的SOCKET句柄


 CAsyncSocket::Accept

virtual BOOL Accept( CAsyncSocket& rConnectedSocket, SOCKADDR* lpSockAddr = NULL, int* lpScokAddrLen = NULL);

返回值：
如果函数是成功的，则返回非零值，否则为0。可以通过调用GetLastError获取指定的错误代码。此成员函数可用的错误如下：
· | WSANOTINITIALISED | 在使用此API之前，必须有成功的AfxSocketInit发生。
· | WSAENETDOWN | Windows Socket实现可以查明网络子系统的失败。
· | WSAEFAULT | lpSockAddrLen参数太小了（小于SOCKADDR结构）。
· | WSAEINPROGRESS | 成块Windows套接字调用正在进行中。
· | WSAEINVAL | 在接收之前没有侦听。
· | WSAEMFILE | 在接受入口处队列为空，并且没有有效的描述符。
· | WSAENOBUFS | 没有有效的缓冲区空间。
· | WSAENOTSOCK | 描述符不是套接字。
· | WSAEOPNOTSUPP | 应用的套接字不是支持面向连接服务的类型。
· | WSAEWOULDBLOCK | 套接字被标明为非成块状态，并且目前没有被接收的连接。

参数：
rConnectedSocket | 定义了对连接有效的新的套接字的参考。
lpSockAddr | SOCKADDR结构的指针，它接收连接套接字的地址，就象在网络中已知的那样。当套接字被创建时，建立的地址体系确定lpSockAddr参数的格式。如果lpSockAddr和/或lpSockAddrLen等于NULL，则没有接受套接字的远程地址的信息返回。
lpSockAddrLen | 指向lpSockAddr中地址的字节长度的指针。lpSockAddr是返回值型参数：初始时，它应该包括通过lpSockAddr指向的一些空间；返回时，它应该包括返回地址的实际字节长度。

说明：
调用此成员函数，接受套接字上的连接。此例程获取挂起连接队伍中的连接，创建与此套接字特性相同的新套接字并将其附加给rConnectedSocket。如果队列中没有正挂起的连接，Accept为0。GetLastError返回错误。被接受的套接字（rConnectedSocket）不能用于接受多个连接。原先的套接字保持打开和侦听的状态。
lpSocketAddr是结果参数，其值为连接套接字的地址，正如所知的通信层一样。Accept用于基于连接的套接字类型，例如SOCK_STREAM。

请参阅：
CAsyncSocket::Bind, CAsyncSocket::Connect, CAsyncSocket::Listen, CAsyncSocket::Create, ::WSAAsyncSelect


 CAsyncSocket::AsyncSelect

BOOL AsyncSelect(long lEvent = FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE);

返回值：
如果函数成功，则返回非零值，否则为0。通过调用GetLastError可获取特定的错误代码。以下就是应用于此成员函数的错误：
· | WSANOTINTIALISED | 成功的AfxSocketInit必须发生在使用此API之前。
· | WSAENETDOWN | Windows套接字工具测试出网络系统失败。
· | WSAEINVAL | 特定的参数之一无效。
· | WSAEINPROGRESS | 成块的Windows套接字操作正在进行中。

参数：
lEvent位掩码，它指定了应用感兴趣的网络事件的组合。
· | FD_READ | 想要接收用于读取的读通知。
· | FD_WRITE | 当数据读取有效时，想要接收通知。
· | FD_OOB | 想要恢复带外的数据到达的通知。
· | FD_ACCEPT | 想要接收将要连接的通知。
· | FD_CONNECT | 想要接收连接结果的通知。
· | FD_CLOSE | 当套接字被测试关闭时，想要接收通知。

说明：
调用此成员函数，请求用于套接字的事件通知。此函数用于指定哪些MFC调用通知函数将被套接字调用。ASyncSelect 自动将此套接字设置为非成块的模式。如果要了解更多信息，请参阅联机文档“Visual C++ 程序员指南”中的“Windows套接字:套接字通知”以及Win 32 SD联机文档中的“Windows套接字编程指南”。

请参阅：CAsyncSocket::GetLastError, ::WSAAsyncSelect


 CAsyncSocket::Attach

BOOL Attach(SOCKET hSocket, long lEvent = FD_READ|READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSED);

返回值：如果成功，则返回非零值。

参数：
hSocket 包含套接字的句柄。
lEvent位掩码，它指定了应用感兴趣的网络事件的组合：
· | FD_READ | 想要接收用于读取的读通知。
· | FD_WRITE | 当数据读取有效时，想要接收通知。
· | FD_OOB | 想要恢复带外的数据到达的通知。
· | FD_ACCEPT | 想要接收将要连接的通知。
· | FD_CONNECT | 想要接收连接结果的通知。
· | FD_CLOSE | 当套接字被测试关闭时，想要接收通知。

说明：
调用此函数将hSocket句柄附加给CAsyncSocket对象。SOCKET句柄存储在对象的m_hSocket数据成员中。

请参阅：CAsyncSocket::Detach


 CAsyncSocket::Bind

BOOL Bind(UINT nSocketPort, LPCTSTR lpszSocketAddress = NULL);
BOOL Bind(const SOCKADDR* lpSockAddr, int nSockAddrLen);

返回值：
如果成功，则返回非零值，否则为0。通过调用GetLastError获取特定的错误代码。以下为应用于此成员函数的错误：
· | WSANOTINTIALISED | 成功的AfxSocketInit必须发生在使用此API之前。
· | WSAENETDOWN | Windows套接字工具测试出网络系统失败。
· | WSAEADDRINUSE | 特定的地址已在使用中（请参阅 在SetSocketOpt下的SO_REUSESADDR套接字选项）。
· | WSAEFAULT | nSockAddrLen参数太小（小于SOCKETADDR结构的大小）。
· | WSAEINPROGRESS | 成块的Windows套接字操作正在进行中。
· | WSAEAFNOSUPPORT | 此端口不支持特定的地址体系。
· | WSAEINVAL | 套接字已被约束于地址上。
· | WSAENOBUFS | 由于连接太多，已经没有足够有效的缓冲空间。
· | WSAENOTSOCK | 描述符不是套接字。

参数：
nSocketPort | 定义套接字应用的端口。
lpszSocketAddress | 网络地址，用句点分隔的数值，如“128.56.22.8”。
lpSocketAddr | 指向SOCKADDR结构的指针。SOCKADDR包含有分配给此套接字的地址。
nSockAddrLen | 以字节计算的lpSocketAddr中的地址长度。

说明：
调用此成员函数，将本地地址与套接字相关联。在顺序Connect或Listen调用之前，此例程用在未连接的数据报或数据套接字上。在它能够接受连接请求之前，侦听服务器套接字必须选择端口数并且通过调用Bind让Windows套接字知道。Bind通过将本地名分配给未命名的套接字，建立本地联系（主机地址/端口数）。

请参阅：
CAsyncSocket::Connect, CAsyncSocket::Listen, CAsyncSocket::GetSockName, CAsyncSocket::SetSockOpt, CAsyncSocket::Create


 CAsyncSocket::CAsyncSocket

CAsyncSocket( );

说明：
构造一个空套接字对象。构造该对象后，须调用它的Create成员函数以创建该SOCKET数据结构并连接它的地址。（在Windows Sockets通信服务器上，当知道套接字创建了一个用于Accept调用的套接字，则不用为该套接字调用Create）。

请参阅：CAsyncSocket::Create


 CAsyncSocket::Close

virtual void Close()

说明：
此函数关闭套接字。更精确地说，它释放套接字描述符，这就使得再对它的索引将会产生错误WSAENOTSOCK，导致失败。如果这是对下面的套接字的最后索引，则有关的命名信息及顺序数据将被丢弃。套接字的析构程序将调用Close。

请参阅：
CAsyncSocket::Accept, CAsyncSocket::CAsyncSocket, CAsyncSocket::IOCtl, CAsyncSocket::GetSockOpt, CAsyncSocket::SetSockOpt, CAsyncSocket::AsyncSelect


 CAsyncSocket::Connect

BOOL Connect(LPCTSTR lpszHostAddress, UINT nHostPort);
BOOL Connect(const SOCKADDR* lpSockAddr, int nSockAddrLen );

返回值：
如果成功，则返回非零值，否则为0。通过调用GetLastError获取特定的错误代码。如果确定了WSAEWOULDBLOCK的错误代码，并且应用正在使用函数覆盖的调用，则当连接操作完成时，应用将接收OnConnect消息。
· | WSANOTINIALISED | 成功的AfxSocketIint必须发生在使用此API之前。
· | WSANNETDOWN | Windows套接字工具测试出网络系统失败。
· | WSAEADDRINUSE | 特定的地址已在使用。
· | WSAEINPROGESS | 成块的Windows套接字正在进行中。
· | WSAEADDRNOTAVAIL | 从本地机来的特定地址无效。
· | WSAEAFNOSUPPORT | 特定体系中的地址不能用于此套接字。
· | WSAECONNREFUSED | 连接的尝试被拒绝。
· | WSAEDESTADDRREQ | 需要目的地址。
· | WSAEFAULT | nSockAddrLen参数不正确。
· | WSAEINVAL | 无效的主机地址。
· | WSAEISCONN | 套接字已连接。
· | WSAEMFILE | 没有更多有效的描述符。
· | WSAENETUNREACH | 此时网络不能从主机到达。
· | WSAENOBUFS | 没有有效的缓冲空间。套接字不能被连接。
· | WSAENOTSOCK | 描述符不是套接字。
· | WSAETIMEDOUT | 在没有建立连接时，试图连接超时。
· | WSAEWOULDBLOCK | 套接字被屏蔽为非成块并且连接不能马上完成。

参数：
lpszHostAddress | 与对象连接的套接字的网络地址：机器名，例如ftp.microsoft.com 或以句点分隔的数字，例如“128.56.22.8”
nHostPost | 定义套接字应用的端口。
lpSockAddr | 指向SOCKADDR结构的指针。SOCKADDR结构包含连接套接字的地址。
nSockAddrLen | 以字节计算的lpSockAddr中的地址长度。

说明：
调用此成员函数，建立与未连接流或数据报套接字的连接。如果套接字是未约束的，通过系统唯一的值将分配给本地联系并且套接字被屏蔽为约束。请注意，如果名称结构的地址域都为0，则Connect将返回零。为了获得扩展的更多的错误信息，请调用GetLastError成员函数。
对于流套接字（SOCK_STREAM类型），对外部主机初始化活动的连接。当成功完成套接字调用时，套接字已准备好接受发送/接受数据。
对于数据报套接字（SOCK_DGRAM类型），设置缺省的目的，它将用于顺序的Send和Receive调用。

请参阅：
CAsyncSocket::Accept, CAsyncSocket::Bind, CAsyncSocket::GetSockName, CAsyncSocket::Create, CAsyncSocket::AsyncSelect


 CAsyncSocket::Create

BOOL Create(
UINT nSocketPort = 0,
int nSocketType = SOCK_STREAM,
long lEvent = FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|FD_CONNECT|FD_CLOSE,
LPCTSTR lpszSocketAddress = NULL
);

返回值：
如果函数成功，则返回非零值，否则为0。通过调用GetLastError获取错误代码。以下是应用于此成员函数的错误：
· | WSANOTINITIALISED | 成功的AfxSocketInit必须在使用此API之前发生。
· | WSAENETDOWN | Windows套接字工具测试出网络失败。
· | WSAEAFNOSUPPORT | 不支持特定的地址体系。
· | WSAEINPROGRESS | 成块的Windows套接字操作正在进行中。
· | WSAEMFILE | 没有更多的文件描述符是有效的。
· | WSAENOBUFS | 没有缓冲空间是有效的。套接字不能被创建。
· | WSAEPROTONOSUPPORT | 不支持指定的端口。
· | WSAEPROTOTYPE | 特定端口是此套接字的错误类型。
· | WSAESOCKTNOSUPPORT | 在此地址体系中，不支持特定的套接字类型。

参数：
nSocketPort | 套接字使用的已知端口。如果想让Windows套接字选择端口，则此值为0。
nSocketType | SOCK_STREAM或SOCK_DGRAM。
lEvent位掩码，它指定了应用感兴趣的网络事件的组合。
· | FD_READ | 想要接收用于读取的读通知。
· | FD_WRITE | 当数据读取有效时，想要接收通知。
· | FD_OOB | 想要恢复带外的数据到达的通知。
· | FD_ACCEPT | 想要接收将要连接的通知。
· | FD_CONNECT | 想要接收连接结果的通知。
· | FD_CLOSE | 当套接字被测试关闭时，想要接收通知。
lpszSockAddress | 指向字符串的指针。此字符串包含了被连接的套接字的网络地址，例如以句点分隔的数字：“128.56.22.8”。

说明：
在构造套接字对象，创建Windows 套接字并且附加它之后，调用Create成员函数。然后，Create调用Bind，将套接字约束于特定的地址。以下是被支持的套接字类型：
· | SOCK_STREAM | 提供顺序的、可靠的、全双工的、基于连接的字节流。使用用于Internet地址体系的传输控制协议（TCP）。
· | SOCK_DGRAM | 支持数据报。数据报是非连接的，固定的（典型化是小的）最大长度的不可靠的包。使用用于Internet地址体系的数据报协议（UDP）。
注意：
Accept成员函数把新的、空的CSocket对象索引作为它的参数。必须在调用Accept之前，构造此对象。请记住，如果此套接字对象超出范围，连接关闭。对此新套接字对象，不要调用Create。
如果要了解关于流和数据报套接字的更多信息，请参阅联机文档“VisualC++程序员指南”中的“Windows套接字:端口和套接字地址”和联机文档“Win32 SDK”中的“Windows套接字编程指南”。

请参阅：
CAsyncSocket::Accept, CAsyncSocket::Bind, CAsyncSocket::Connect, CAsyncSocket::GetSockName, CAsyncSocket::IOCtl, CAsyncSocket::Listen, CAsyncSocket::Receive, CAsyncSocket::Send, CAsyncSocket::ShutDown


 CAsyncSocket::Detach

SOCKET Detach( );

说明：
调用此成员函数从CAsyncSocket对象中撤消m_hSocket数据成员中的SOCKET句柄。

请参阅：CAsyncSocket::Attach


 CAsyncSocket::FromHandle

Static CAsyncSocket* PASCAL FromHandle(SCOKET hSocket);

返回值：
指向CAsyncSocket对象的指针。如果没有CAsyncSocket对象附加在hSocket上，则为NULL。

参数：
hSocket 包含套接字的句柄。

说明：
返回指向CAsyncSocket对象的指针。当被给予SOCKET句柄时，如果CAsyncSocket对象没有附加给句柄，则成员函数返回NULL。

请参阅：
CSocket::FromHandle, CAsyncSocket::Attach, CAsyncSocket::Detach


 CAsyncSocket::GetLastError

Static int GetLastError( );

返回值：
通过此线程，返回值确定了最后执行的Windows套接字API例程的错误代码。

说明：
调用此成员函数，获取最后失败操作的错误状态。当特定的成员函数确定错误已经发生时，GetLastError应该被调用，恢复相应的错误代码。
请参阅用于应用错误代码列表的个别成员函数的描述。
如果想了解有关错误代码的更多信息，请参阅联机文档Win32SDK中的“Windows套接字 2和“Windows套接字编程指南”。

请参阅：::WSASetLastError


 CAsyncSocket::GetPeerName

BOOL GetPeerName(CString& rPeerAddress, UINT& rPeerPort);
BOOL GetPeerName(SOCKADDR* lpSockAddr, int* lpSockAddrLen);

返回值：
如果函数成功，则返回非零值，否则为0。通过调用GetLastError获取特定的错误代码。以下是应用于此成员函数的错误：
· | WSANOTINITIALISED | 成功的AfxSocketInit必须在使用此API之前使用。
· | WSAENETDOWN | Windows套接字工具测试出网络系统失败。
· | WSAEINPROGRESS | lpSockAddrLen参数不够大。
· | WSAEINPROGRESS | 成块的Windows套接字正在进行。
· | WSAENOTCONN | 套接字没有被连接。
· | WSAENOTSOCK | 描述符不是套接字。

参数：
rPeerAddress | CString对象的索引，CString对象接受以句点分隔的IP地址数值。
rPeerPort | 对存储端口的UINT的索引。
lpSockAddr | 指向SOCKADDR结构的指针。此结构接受对等套接字的名称。
lpSockAddrLen | 指向lpSockAddr中地址长度的指针。地址长度以字节计算。反过来，lpSockAddrLen参数包含返回的lpSockAddr的实际大小。此大小也是以字节计算的。

说明：
调用此函数，获取套接字被连接的对等套接字的地址。

请参阅：
CAsyncSocket::Bind, CAsyncSocket::Connect, CAsyncSocket::Create, CAsyncSocket::GetSockName


 CAsyncSocket::GetSockName

BOOL GetSockName(CString& rSocketAddress, UINT& rSocketPort);
BOOL GetSockName(SOCKADDR* lpSockAddr, int* lpSockAddrLen);

返回值：
如果函数成功，则返回非零值，否则为0。通过调用GetLastError获取特定的错误代码。以下是应用于此成员函数的错误：
· | WSANOTINITIALISED | 成功的AfxSocketInit必须在使用此API之前使用。
· | WSAENETDOWN | Windows套接字工具测试出网络系统失败。
· | WSAEFAULT | lpSockAddrLen参数不够大。
· | WSAEINPROGRESS | 成块的Windows套接字正在进行。
· | WSAENOTSOCK | 描述符不是套接字。
· | WSAEINVAL | 套接字没有用Bind约束在地址上。

参数：
rSocketAddress | CString对象的索引，CString对象接受以句点分隔的IP地址数值。
rSocketPort | 对存储端口的UINT的索引。
lpSockAddr | 指向SOCKADDR结构的指针。此结构接受套接字的地址。
lpSockAddrLen | 指向lpSockAddr中地址长度的指针。地址长度以字节计算。

说明：
调用此成员函数，获取套接字的本地名称。当Connect调用在没有首先使用Bind的情况下完成时，此调用是非常有用的。此调用可以提供一种方法，可以通过它确定已经被系统设置的本地联系。如果想了解更多信息，请参阅联机文档“Win32 SDK”中的“Windows套接字2概述”和“Windows套接字编程指南”。

请参阅：
CAsyncSocket::Bind, CAsyncSocket::Create, CAsyncSocket::GetPeerName


 CAsyncSocket::GetSockOpt

BOOL GetSockOpt( int nOptionName, void* lpOptionValue, int* lpOptionLen, int nLevel = SOL_SOCKET );

返回值：
函数调用成功时返回非零值，否则为0，可以调用函数GetLastError获得特定的错误代码。如果没有用SetSockOpt设置选项，则GetSockOpt返回选项的缺省值。此成员函数可用的错误代码有：
· | WSANOTINITIALISED | 在调用此API函数之前应该成功地调用了AfxSocketInit。
· | WSAENETDOWN | Windows Sockets检测到网络子系统故障。
· | WSAEFAULT | 参数lpOptionLen无效。
· | WSAEINPROGRESS | 正在进行Windows Sockets块操作。
· | WSAENOPROTOOPT | 系统不支持该选项。例如，SOCK_STREAM类型的套接字不支持SO_BROADCAST选项，SOCK_DGRAM类型的套接字不支持SO_ACCEPTCONN，SO_DONTLINGER，SO_KEEPALIVE，SO_LINGER和SO_OOBINLINE选项。
· | WSAENOTSOCK | 描述符不是一个套接字。

参数：
nOptionName | 待检索的套接字选项名。
lpOptionValue | 指向存放套接字选项的返回值的缓冲区的指针。函数返回时，套接字选项的值存放在lpOptionValue所指的缓冲中。调用时，参数lpOptionLen存放缓冲区的大小(字节数)，函数返回时，把它置成实际返回的字节数。对选项SO_LINGER来说，返回的是LINGER结构的大小；对于其它选项，返回的是BOOL值或int值的长度。请参阅后面“说明”部分选项和返回值大小的列表。
lpOptionLen | 指向lpOptionValue缓冲的大小（以字节为单位）的指针。
nLevel | 选项所定义的级别，支持的级别有：SOL_SOCKET和IPPROTO_TCP。

说明：
本成员函数用于检索套接字选项的值。GetSockOpt可以查询任意类型和状态的套接字的选项的当前值，结果保存在lpOptionValue中。选项影响套接字操作，例如包的传输路由、带外数据（out-of-band data）的数据传输等。
GetSockOpt支持以下的套接字选项。下表中的类型列说明了pOptionValue中数据的类型。TCP_NODELAY选项用于IPPROTO_TCP这一级别，其它选项用于SOL_SOCKET级别。
值 | 类型 | 含义
SO_ACCEPTCONN | BOOL | 套接字正在监听
SO_BROADCAST | BOOL | 套接字被配置成广播消息方式
SO_DEBUG | BOOL | 允许调试
SO_DONTLINGER | BOOL | 如果为真，选项SO_LINGER被禁止
SO_DONTROUTE | BOOL | 路由被禁止
SO_ERROR | int | 返回并清除错误状态
SO_KEEPALIVE | BOOL | 正在发送“保持活动”
SO_LINGER | struct LINGER | 返回当前的延时选项
SO_OOBINLINE | BOOL | 在正常数据流中收到了带外数据
SO_RCVBUF | int | 接收缓冲区的大小
SO_REUSEADDR | BOOL | 套接字可以绑定到已经在使用的地址
SO_SNDBUF | int | 发送缓冲区的大小
SO_TYPE | int | 套接字的类型（如SOCK_STREAM）
TCP_NODELAY | BOOL | 禁止发送合并数据的Nagle算法

GetSockOpt不支持的Berkeley 软件分布（BSD）选项有：
值 | 类型 | 含义
SO_RCVLOWAT | int | 接收最低水准标志
SO_RCVTIMEO | int | 接收超时消息
SO_SNDLOWAT | int | 发送最低水准标志
SO_SNDTIMEO | int | 发送超时消息
IP_OPTIONS | int | 获取IP头的选项
TCP_MAXSEG | int | 获取TCP段的最大尺寸

调用GetSockOpt时，如果参数中出现了系统不支持的选项，将会产生错误。调用GetLastError可以得到错误代码WSAENOPROTOOPT。

请参阅：CAsyncSocket::SetSockOpt


 CAsyncSocket::IOCtl

BOOL IOCtl( long lCommand, DWORD* lpArgument );

返回值：
调用成功时返回非零值，否则为0，并且可以调用GetLastError获取特定的错误代码。此成员函数可用的错误代码有：
· | WSANOTINITIALISED | 调用本API函数之前必须成功地执行了AfxsockInit函数。
· | WSAENETDOWN | Windows Sockets检测到网络系统故障。
· | WSAEINVAL | lCommand非法，或者lpArgument不是lCommand的合法参数，或者该命令不可执行这类套接字。
· | WSAEINPROGRESS | 正在进行Windows Sockets块操作。
· | WSAENOTSOCK | 描述符不是一个套接字。

参数：
lCommand | 要在套接字上执行的命令。
lpArgument | 指向lCommand所需参数的指针。

说明：
本函数用于控制套接字的模式。它可以用于任意状态、任意类型的套接字。本函数用于取得和套接字相关的操作参数，而与具体的通信协议和通信系统无关。它支持以下命令：
· | FIONBIO | 允许或禁止套接字的非成块模式。lpArgument参数指向一个DWORD类型的值，如果允许非成块方式，则非零，否则为零。如果套接字上设置了AsyncSelect，试图调用IOCtl把套接字设回成块方式都会出错，错误信息为WSAEINVAL。要想正确地设回成块方式，必须先以参数lEvent=0调用AsyncSelect禁止AsyncSelect，然后调用IOCtl。
· | FIONREAD | 检测一次Receive调用能从套接字中读出的最大字节数，结果就是lpArgument参数指向的一个DWORD类型的值。如果套接字的类型是SOCK_STREAM，FIONREAD返回一次Receive所能得到的数据总数，通常它和套接字队列中待取的数据大小一致。如果套接字的类型是SOCK_DGRAM，则FIONREAD返回套接字队列中的第一个数据报的大小。
· | SIOCATMARK | 检测是否所有的带外数据都已经被读出。这只适用于设置成在线接收所有带外数据（SO_OOBINLINE）的SOCK_STREAM类型的套接字。如果没有带外数据在等待读取，则返回一个非零值，否则为0，并且在该套接字上的下一次Receive或ReceiveFrom将取出在某个标记(mark)之前的部分或所有数据，应用需要使用SIOCATMARK操作来判断是否还有数据。如果在“紧急”（带外）数据之前还有普通数据，它们还会按照正确的次序被依次接收(一次Receive或ReceiveFrom调用是不会同时取得普通数据和带外数据的)。本函数的调用结果存放在lpArgument参数指向的DWORD类型值中。
本函数在功能上是Berkeley套接字ioctl()的子集。没有和FIOASYNC对应的选项，而且SIOCATMARK是在套接字级别上支持的唯一命令。

请参阅：
CAsyncSocket::AsyncSelect, CAsyncSocket::Create, CAsyncSocket::GetSockOpt, CAsyncSocket::SetSockOpt


 CAsyncSocket::Listen

BOOL Listen( int nConnectionBacklog = 5 );

返回值：
调用成功时返回非零值，否则为0，并且可以调用GetLastError获取特定的错误代码。此成员函数可用的错误代码有：
· | WSANOTINITIALISED | 调用本API函数之前必须成功执行了AfxsockInit函数。
· | WSAENETDOWN | Windows Sockets检测到网络系统故障。
· | WSAEADDRINUSE | 试图监听一个已经使用的地址。
· | WSAEINPROGESS | 正在进行成块的Windows Sockets操作。
· | WSAEINVAL | 套接字已经连接或者没有用Bind绑定。
· | WSAEISCONN | 套接字已经连接。
· | WSAEMFILE | 没有可用的文件描述符。
· | WSAENOBUFS | 没有足够的缓冲空间。
· | WSAENOTSOCK | 描述符不是一个套接字。
· | WSAEOPNOTSUPP | 该类型的套接字不支持Listen操作。

参数：
nConnectionBacklog 待处理连接的队列所允许达到的最大长度，有效值为1～5。

说明：
本成员函数用来监听到来的连接请求。接收连接要先调用Create建立套接字，用Listen指明记录即将连接的后台日志（backlog），然后调用Accept接受连接。Listen仅对那些支持连接的套接字起作用，也就是SOCK_STREAM类型的套接字。在进程应答连接并把它放到等待队列时，套接字被置成被动模式（passive mode）。
本函数一般由那些一次可以有多个连接的服务器使用（或任何需要接收连接的应用）。如果连接请求到达时，队列已满，客户端会接到一个错误信息，指明是WSAECONNREFUSED错误。
在没有可用端口（描述符）时，Listen将继续监听。它将接受连接，直到队列被清空。如果有可用端口，此后的Listen或Accept调用将重新把队列填充成当前或日志指定的最近的状态，然后挂起，等待以后的连接。

请参阅：
CAsyncSocket::Accept, CAsyncSocket::Connect, CAsyncSocket::Create


 CAsyncSocket::OnAccept

virtual void OnAccept( int nErrorCode );

参数：
nErrorCode套接字上最近的错误代码。此成员函数可用的错误代码有：
· | 0 | 函数成功地执行并返回。
· | WSAENETDOWN | Windows Sockets检测到网络系统故障。

说明：
由框架调用，通知监听套接字现在可以调用Accept成员函数来接收悬挂的（pending）连接请求。要了解更详细的信息，请参阅联机文档“VisualC++ 程序员指南”中的“Windows Sockets: 套接字通知”。

请参阅：
CAsyncSocket::Accept, CAsyncSocket::GetLastError, CAsyncSocket::OnClose, CAsyncSocket::OnConnect, CAsyncSocket::OnOutOfBandData, CAsyncSocket::OnReceive, CAsyncSocket::OnSend


 CAsyncSocket::OnClose

virtual void OnClose( int nErrorCode );

参数：
nErrorCode套接字上最近的错误代码。此成员函数可用的错误代码有：
· | 0 | 函数成功地执行并返回。
· | WSAENETDOWN | Windows Sockets检测到网络系统故障。
· | WSAECONNABORTED | 因为超时或其它故障使连接异常中断。

说明：
由框架调用通知该套接字，它连接上的对应套接字已经被相关进程终止了。要了解更详细的信息，请参阅联机文档“Visual C++ 程序员指南”中的“Windows Sockets:套接字通知”

请参阅：
CAsyncSocket::Close, CAsyncSocket::GetLastError, CAsyncSocket::OnAccept, CAsyncSocket::OnConnect, CAsyncSocket::OnOutOfBandData, CAsyncSocket::OnReceive, CAsyncSocket::OnSend


 CAsyncSocket::OnConnect

virtual void OnConnect( int nErrorCode );

参数：
nErrorCode套接字上最近的错误代码。此成员函数可用的错误代码有：
· | 0 | 函数成功地执行并返回。
· | WSAEADDRINUSE | 指定的地址已经被使用。
· | WSAEADDRNOTAVAIL | 本地机上不能使用该地址。
· | WSAEAFNOSUPPORT | 该套接字上不能使用这一族（family）地址。
· | WSAECONREFUSED | 拒绝连接。
· | WSAEDESTADDRREQ | 需要目标地址。
· | WSAEFAULT | 参数lpSockAddrLen不正确。
· | WSAEINVAL | 该套接字已经绑定到一个地址上了。
· | WSAEISCONN | 该套接字已经连接上了。
· | WSAEMFILE | 没有可用文件描述符。
· | WSAENETUNREACH | 本主机此时不能访问网络。
· | WSAENOBUFS | 没有可用的缓冲区空间，不能连接套接字。
· | WSAENOTCONN | 套接字没有连接上。
· | WSAENOTSOCK | 描述符是文件描述符，而不是套接字描述符。
· | WSAETIMEDOUT | 超时，不能建立连接。

说明：
本函数由框架调用，通知该套接字连接操作已经完成，并且说明连接是成功还是失败了。
重点：
不需要调用CSocket中的OnSend和OnConnect通知函数。发送数据只需调用Send，该函数在所有数据都发送完毕才返回。采用通知（notification）来结束任务是MFC实现CSocket的细节。建立连接只需调用Connect，在连接完成（无论成功执行或出现错误）后返回。连接通知的实现也是MFC的实现细节。
要了解更详细的信息，请参阅联机文档“Visual C++ 程序员指南”中的“Windows Sockets: 套接字通知”。

请参阅：
CAsyncSocket::Connect, CAsyncSocket::GetLastError, CAsyncSocket::OnAccept, CAsyncSocket::OnClose, CAsyncSocket::OnOutOfBandData, CAsyncSocket::OnReceive, CAsyncSocket::OnSend


 CAsyncSocket::OnOutOfBandData

virtual void OnOutOfBandData( int nErrorCode );

参数：
nErrorCode套接字上最近的错误代码。此成员函数可用的错误代码有：
· | 0 | 函数成功地执行并返回。
· | WSAENETDOWN | Windows Sockets检测到了网络故障。

说明：
本函数由框架调用，通知接收套接字发送套接字要发送带外数据。带外数据是一个逻辑上独立的通道，它和一对连接上的SOCK_STREAM类型的套接字相联系。该通道一般用于发送紧急数据。
MFC支持带外数据的发送，但是类CAsyncSocket不能使用它，一种替代方法是另外建立一个套接字来传输这种数据。要了解有关带外数据的更详细的信息，请参阅联机文档“Visual C++ 程序员指南”中的“WindowsSockets: 套接字通知”和“Win32 SDK”中的“Windows Sockets2概述”以及“Windows套接字编程注意事项”。

请参阅：
CAsyncSocket::GetLastError, CAsyncSocket::OnAccept, CAsyncSocket::OnClose, CAsyncSocket::OnConnect, CAsyncSocket::OnReceive, CAsyncSocket::OnSend


 CAsyncSocket::OnReceive

virtual void OnReceive( int nErrorCode );

参数：
nErrorCode套接字上最近的错误代码。此成员函数可用的错误代码有：
· | 0 | 函数成功地执行并返回。
· | WSAENETDOWN | Windows Sockets检测到了网络故障。

说明：
本函数由框架调用，通知套接字缓冲中有数据，可以调用Receive成员函数取出。要了解更详细的信息，请参阅联机文档“Visual C++ 程序员指南”中的“Windows Sockets: 套接字通知”。

请参阅：
CAsyncSocket::GetLastError, CAsyncSocket::OnAccept, CAsyncSocket::OnClose, CAsyncSocket::OnConnect, CAsyncSocket::OnOutOfBandData, CAsyncSocket::OnSend, CAsyncSocket::OnReceive


 CAsyncSocket::OnSend

virtual void OnSend( int nErrorCode );

参数：
nErrorCode套接字上最近的错误代码。此成员函数可用的错误代码有：
· | 0 | 函数成功地执行并返回。
· | WSAENETDOWN | Windows Sockets检测到了网络故障。

说明：
本函数由框架调用，通知套接字现在可以调用Send成员函数发送数据了。
重点：
不需要调用CSocket中的OnSend和OnConnect通知函数。发送数据只需调用Send，该函数在所有数据都发送完毕后才返回。采用通知（notification）来结束任务是MFC实现CSocket的细节。建立连接只需调用Connect，在连接完成（无论成功执行或出现错误）后返回。连接通知的实现也是MFC的实现细节。
要了解更详细的信息，请参阅联机文档“Visual C++ 程序员指南”中的“Windows Sockets: 套接字通知”。

请参阅：
CAsyncSocket::GetLastError, CAsyncSocket::OnAccept, CAsyncSocket::OnClose, CAsyncSocket::OnConnect, CAsyncSocket::OnOutOfBandData, CAsyncSocket::OnReceive, CAsyncSocket::Send


 CAsyncSocket::Receive

virtual int Receive( void* lpBuf, int nBufLen, int nFlags = 0 );

返回值：
调用成功时，返回接收到的字节数。如果连接被关闭了，返回0；否则返回SOCKET_ERROR，可以调用GetLastError得到特定的错误代码。此成员函数可用的错误代码有：
· | WSANOTINITIALISED | 调用本API函数之前必须成功执行了AfxsocketInit函数。
· | WSAENETDOWN | Windows Sockets检测到网络系统故障。
· | WSAENOTCONN | 套接字没有连接上。
· | WSAEINPROGRESS | 正在进行成块的Windows Sockets操作。
· | WSAENOTSOCK | 描述符不是一个套接字
· | WSAEOPNOTSUPP | 设置了MSG_OOB，但是套接字的类型不是SOCK_ STREAM。
· | WSAESHUTDOWN | 套接字已经被关闭。调用ShutDown（参数nHow的值设为0或2）后，就不能在该套接字上调用Receive了。
· | WSAEWOULDBLOCK | 套接字标志为非成块，而Receive操作将产生成块。
· | WSAEMSGSIZE | 数据报太大，不能完全放到缓冲中，将被截断。
· | WSAEINVAL | 套接字没有用Bind绑定。
· | WSAECONNABORTED | 由于超时或其它故障使虚电路异常退出。
· | WSAECONNRESET | 远端重置了虚电路。

参数：
lpBuf | 输入数据的缓冲。
nBufLen | lpBuf的大小（字节数）。
nFlags设置调用模式。本函数的语义由套接字选项和nFlags参数共同决定。nFlags由下面的任一个值组成，也可以用C++的OR操作符组合使用：
· | MSG_PEEK | 把数据拷贝到缓冲，但不从输入队列上移走。
· | MSG_OOB | 处理带外数据（请参阅联机文档“Win32 SDK”中的“Windows套接字编程注意事项”）

说明：
本函数用于从套接字获取数据。它从已连接的流套接字或数据报套接字上读输入的数据。对于流套接字（SOCK_STREAM类型的套接字），本函数返回缓冲中不超过缓冲大小的所有有效数据。如果套接字被设置成在线接收带外数据（套接字选项为SO_OOBINLINE），并且带外数据没有被读，则仅仅返回带外数据。应用可以使用IOCtl的SIOCATMARK选项或者OnOutOfBandData来检测是否还有未读的带外数据。对于数据报套接字，本函数从第一个入队的数据报中解出数据，发到缓冲中。如果数据报比缓冲大，则缓冲中仅包含数据报的前一部分，而丢弃其它的数据，Receive返回SOCKET_ERROR，错误代码设成WSAEMSGSIZE。如果套接字中没有输入数据，则返回SOCKET_ERROR，并把错误代码设为WSAEWOULD-BLOCK。当更多的数据到达时，可用回调函数OnReceive来检测。如果套接字是SOCK_STREAM类型的，并且远端接点已经正常地关闭连接，Receive会立即返回，接收的数据当然是0字节。如果连接被重置了，Receive将会异常返回，错误代码为WSAECONNRESET。

请参阅：
CAsyncSocket::AsyncSelect, CAsyncSocket::Create, CAsyncSocket::ReceiveFrom, CAsyncSocket::Send


 CAsyncSocket::ReceiveFrom

int ReceiveFrom( void* lpBuf, int nBufLen, CString& rSocketAddress, UINT& rSocketPort, int nFlags = 0 );
int ReceiveFrom( void* lpBuf, int nBufLen, SOCKADDR* lpSockAddr, int* lpSocketAddrLen, int nFlags = 0 );

返回值： 调用成功时返回读到的字节数。如果连接已经被关闭，则返回0；否则返回SOCKET_ERROR，可以调用GetLastError得到特定的错误代码。此成员函数可用的错误代码有：
· | WSANOTINITIALISED | 在调用本API函数之前，必须已经成功地执行AfxSocketInit。
· | WSAENETDOWN | Windows Sockets检测到网络系统故障。
· | WSAEFAULT | 参数lpSocketAddrLen无效：缓冲lpSockAddr太小，放不下同级地址。
· | WSAEINVAL | 套接字没有用Bind绑定。
· | WSAENOTCONN | 套接字没有连接上（仅用于SOCK_STREAM类型的套接字）
· | WSAENOTSOCK | 描述符不是一个套接字。
· | WSAEOPNOTSUPP | 设置了MSG_OOB，但套接字不是SOCK_STREAM类型的。
· | WSAESHUTDOWN | 套接字已经关闭，调用ShutDown（参数nHow被设为0或2）后，不能在套接字上调用ReceiveFrom。
· | WSAEWOULDBLOCK | 套接字被标记为非成块的，但ReceiveFrom操作将会成块。
· | WSAEMSGSIZE | 数据报太大，不能在缓冲中放下，因此被截断了。
· | WSAECONNABORTED | 由于超时或其它故障使虚电路异常终止。
· | WSAECONNRESET | 远端重置了虚电路。

参数：
lpBuf | 接收输入数据的缓冲。
nBufLen | lpBuf的大小（字节数）。
rSocketAddress | 对CString对象的参考，该对象用于接收点分IP地址。
rSocketPort | 对一个UINT型数变量的参考，该变量记录了端口值。
lpSockAddr | 指向SOCKADDR结构的指针，结构中保存了源地址。
lpSockAddrLen | 指向lpSockAddr中源地址长度（字节数）的指针。
nFlags设置调用的方式。函数的语义由套接字选项和nFlags共同决定。nFlags由下面的任一个值组成，也可用C++的OR操作符组合使用：
· | MSG_PEEK | 把数据拷贝到缓冲，但不从输入队列上移走。
· | MSG_OOB | 处理带外数据（请参阅联机文档“Win32 SDK”中的“Windows套接字编程注意事项”）

说明：
本函数用于接收数据报，并把源地址存在SOCKADDR结构或者rSocketAddress指向的地址中。它读取套接字上的数据（可能是连接上的）并获得发送数据的地址。
对于SOCK_STREAM类型的套接字，返回缓冲中所有不超过缓冲大小的有效数据。如果套接字被设置成在线接收带外数据（套接字选项为SO_OOBINLINE），并且带外数据没有被读取，则仅仅返回带外数据。应用可以使用IOCtl的SIOCATMARK选项或者OnOutOfBandData来检测剩下的未读的带外数据。对于SOCK_STREAM类型的套接字，将忽略参数lpSockAddr和lpSockAddrLen。
对于数据报套接字，本函数从第一个入队的数据报中解出数据，发到缓冲中。如果数据报比缓冲大，则缓冲中仅包含数据报的前一部分，而丢弃其它的数据，ReceiveFrom返回SOCKET_ERROR，错误代码设成WSAEMSGSIZE。
如果lpSockAddr非零，并且套接字是SOCK_STREAM类型的，则发送数据的套接字的网络地址会被拷贝到相应的SOCKADDR结构中。lpSockAddrLen指向的值初始为该结构的大小，在函数返回时修改为所存储的实际地址的大小。如果套接字中读不到数据，并且是成块的，ReceiveFrom就会一直等待数据的到来。此时函数返回SOCKET_ERROR，错误代码被置为WSAEWOULDBLOCK。可以用回调函数OnReceive检测更多数据的到来。
如果套接字是SOCK_STREAM类型的，而远端已经正常地关闭连接，ReceiveFrom就会立即返回，接收的数据为0字节。

请参阅：
CAsyncSocket::AsyncSelect, CAsyncSocket::Create, CAsyncSocket::Receive, CAsyncSocket::Send


 CAsyncSocket::Send

virtual int Send( const void* lpBuf, int nBufLen, int nFlags = 0 );

返回值：
调用成功时，返回发送的字节数（可能比nBufLen要小）。否则返回SOCKET_ ERROR，可以调用GetLastError获得特定的错误代码。此成员函数可用的错误代码有：
· | WSANOTINITIALISED | 在调用本API函数之前，必须已经成功地执行AfxSocketInit。
· | WSAENETDOWN | Windows Sockets检测到网络系统故障。
· | WSAEACCES | 请求的地址是广播地址，但是相应的位没有被设置。
· | WSAEINPROGRESS | 正在进行一个成块的Windows Sockets操作。
· | WSAEFAULT | 参数lpBuf无效，不是用户地址空间中的有效地址。
· | WSAENETRESET | 连接需要重置，因为Windows Sockets的实现删除了连接。
· | WSAENOBUFS | Windows Sockets的实现发现了缓冲的死锁。
· | WSAENOTCONN | 套接字没有连接上。
· | WSAENOTSOCK | 描述符不是一个套接字。
· | WSAEOPNOTSUPP | 设置了MSG_OOB，但套接字不是SOCK_STREAM类型的。
· | WSAESHUTDOWN | 套接字已经关闭，调用ShutDown（参数nHow被设为1或2）后，不能在套接字上调用Send。
· | WSAEWOULDBLOCK | 套接字被标记为非成块的，但请求发送操作将产生成块。
· | WSAEMSGSIZE | 套接字类型为SOCK_DGRAM，数据报大于Windows Sockets实现所支持的最大值。
· | WSAEINVAL | 套接字没有用Bind绑定。
· | WSAECONNABORTED | 由于超时或其它故障使虚电路异常终止。
· | WSAECONNRESET | 远端重置了虚电路。

参数：
lpBuf | 存放待发送数据的缓冲。
nBufLen | lpBuf缓冲中待发送数据的字节数。
nFlags设置函数调用的方式。函数的语义由套接字选项和nFlags共同决定。nFlags由下面的任一个值构成，可用C++的OR操作符组合使用：
· | MSG_DONTROUTE | 表明数据不受路由的限制，WindowsSockets提供者（兼容Windows Sockets的软件厂商）可以忽略这个标志。请参阅联机文档“Win32 SDK”的“Windows套接字编程注意事项”中关于SO_DONTROUTE选项的讨论。
· | MSG_OOB | 处理带外数据（仅用于SOCK_STREAM类型的套接字）。

说明：
本函数用于在一个连接的套接字上发送数据。它可以在流套接字或数据报套接字上写出数据。对数据报型的套接字，注意不要使数据包超出网络支持的最大IP包的大小。这个值由AfxsocketInit返回的WSADATA结构中的成员iMaxUdpDg给出。如果数据超出这个长度，数据将不会发送，错误代码被设置为WSAEMSGSIZE，可以调用GetLastError得到这个错误代码。
注意，对于数据报套接字，Send的成功结束并不意味着数据一定成功地发送到了目的地。
对于SOCK_STREAM类型的CAsyncSocket对象，写出的字节数可以在1和请求发送的字节数之间，它依赖于本地主机和目的主机的缓冲大小。

请参阅：
CAsyncSocket::Create, CAsyncSocket::Receive, CAsyncSocket::ReceiveFrom, CAsyncSocket::SendTo


 CAsyncSocket::SendTo

int SendTo( const void* lpBuf, int nBufLen, UINT nHostPort, LPCTSTR lpszHostAddress = NULL, int nFlags = 0 );
int SendTo( const void* lpBuf, int nBufLen, const SOCKADDR* lpSockAddr,int nSockAddrLen, int nFlags = 0 );

返回值：
调用成功时，返回发送的字节数（可能比nBufLen要小）。否则返回SOCKET_ERROR，可以调用GetLastError获得特定的错误代码。此成员函数可用的错误代码有：
· | WSANOTINITIALISED | 在调用本API函数之前，必须已经成功地执行AfxSocketInit。
· | WSAENETDOWN | Windows Sockets检测到网络系统故障。
· | WSAEACCES | 请求的地址是广播地址，但是相应的位没有被设置。
· | WSAEINPROGRESS | 正在进行一个成块的Windows Sockets操作。
· | WSAEFAULT | 参数lpBuf或lpSockAddr无效，不是用户地址空间中的有效地址。或者因为参数lpSockAddr太小（小于结构SOCKADDR的大小）。
· | WSAEINVAL | 主机名无效。
· | WSAENETRESET | 连接需要重置，因为Windows Sockets的实现删除了连接。
· | WSAENOBUFS | Windows Sockets的实现发现了缓冲的死锁。
· | WSAENOTCONN | 套接字没有连接上（仅用于SOCK_STREAM型的套接字）。
· | WSAENOTSOCK | 描述符不是一个套接字。
· | WSAEOPNOTSUPP | 设置了MSG_OOB，但套接字不是SOCK_STREAM类型的。
· | WSAESHUTDOWN | 套接字已经关闭，调用ShutDown（参数nHow被设为1或2）后，不能在套接字上调用SendTo。
· | WSAEWOULDBLOCK | 套接字被标记为非成块的，但请求发送操作将产生成块。
· | WSAEMSGSIZE | 套接字类型为SOCK_DGRAM，数据报大于Windows Sockets实现支持的最大值。
· | WSAECONNABORTED | 由于超时或其它故障使虚电路异常终止。
· | WSAECONNRESET | 远端重置了虚电路。
· | WSAEADDRNOTAVAIL | 本地机不能存取指定的地址。
· | WSAEAFNOSUPPORT | 这个套接字中不能使用指定地址族中的地址。
· | WSAEDESTADDRREQ | 需要有目标地址。
· | WSAENETUNREACH | 此时网络不能被主机访问。

参数：
lpBuf | 存放待发送数据的缓冲。
nBufLen | lpBuf缓冲中待发送数据的字节数。
nHostPort | 标志套接字的端口。
lpszHostAddress | 连接到的套接字的网络地址：象ftp.microsoft.com这样的机器名或者句点分隔的IP地址“128.56.22.8”。
nFlags设置函数调用的方式。函数的语义由套接字选项和nFlags共同决定。nFlags由下面的任一个值构成，也可用C++的OR操作符组合使用：
· | MSG_DONTROUTE | 表明数据不受路由的限制,WindowsSockets提供者（兼容Windows Sockets的软件厂商）可以忽略这个标志。请参阅联机文档“Win32 SDK”的“Windows套接字编程注意事项”中关于SO_DONTROUTE选项的讨论。
· | MSG_OOB | 处理带外数据（仅用于SOCK_STREAM类型的套接字）

lpScokAddr | 指向SOCKADDR结构的指针，结构中包括了目标套接字的地址。
nSockAddrlen | lpSockAddr中地址的字节数。

说明：
本函数用于向一个指定的地址发送数据。它可以在流套接字或数据报套接字上写出数据。对数据报型的套接字，注意不要使数据包超出网络支持的最大IP包的大小。这个值可以由AfxsocketInit返回的WSADATA结构中的成员iMaxUdpDg给出。待发送数据如果超出这个长度，将不会被发送，并且错误代码被设置为WSAEMSGSIZE，可以调用GetLastError得到这个错误代码。
注意，对于数据报套接字，SendTo的成功结束并不意味着数据一定成功地发送到了目的地。
由参数lpSockAddr指明具体目标套接字发送数据报时，SendTo仅用于SOCK_DGRAM型的套接字。
发送广播数据（仅用于SOCK_DGRAM型的套接字），参数lpSockAddr指明的地址应该由一个特殊的IP地址：INADDR_BROADCAST（它在Windows Sockets的头文件WINSOCK.H中定义）和相应的端口号构成。此外，如果参数lpszHostAddress为NULL，则套接字也用于广播发送。数据报的数据部分不能超过512字节，因此广播的数据报最好不要超过这个数字，以避免数据的分割。

请参阅：
CAsyncSocket::Create, CAsyncSocket::Receive, CAsyncSocket::ReceiveFrom, CAsyncSocket::Send


 CAsyncSocket::SetSockOpt

BOOL SetSockOpt( int nOptionName, const void* lpOptionVlaue, int nOptionLen, int nLevel = SOL_SOCKET );

返回值：
调用成功时，返回非零值，否则为0，并可以调用GetLastError取得特定的错误代码。此成员函数可用的错误代码有：
· | WSANOTINITIALISED | 在调用本API函数之前，必须已经成功地执行AfxSocketInit。
· | WSAENETDOWN | Windows Sockets检测到网络系统故障。
· | WSAEFAULT | lpOptionValue不是进程地址空间中的有效值。
· | WSAEINPROGRESS | 正在执行一个成块的Windows Sockets操作。
· | WSAEINVAL | nLevel无效，或者lpOptionValue中的信息无效。
· | WSAENETRESET | 当设置了SO_KEEPALIVE时，连接超时。
· | WSAENOPROTOOPT | 系统不支持该选项。SOCK_STREAM型的套接字不支持SO_BROADCAST，SOCK_DGRAM型的套接字不支持SO_DONTLINGER，SO_KEEPALIVE，SO_LINGER和SO_OOBINLINE等选项。
· | WSAENOTCONN | 当设置了SO_KEEPALIVE时，连接已经被重置
· | WSAENOTCONN | 套接字没有连接上（仅用于SOCK_STREAM型的套接字）。
· | WSAENOTSOCK | 描述符不是一个套接字。

参数：
nOptionName | 准备设置值的套接字选项。
lpOptionValue | 指向待设置的值所在缓冲的指针。
nOptionLen | lpOptionValue缓冲的字节数。
nLevel | 选项定义所在的级别，系统支持的级别只有SOL_SOCKET和IPPROTO_TCP。

说明：
本函数用于设置套接字的选项。它可以设置任何类型和状态的套接字的选项，改变它们的当前值。虽然选项可以存在于协议的多个级别，本函数只设置协议的最高级别（socket）的选项。选项会影响套接字的操作，例如是否允许在普通数据流中接收快速传输的数据，是否允许在套接字中发送广播消息等等。
套接字选项分为两种：布尔型的选项（允许或者禁止某一功能），整数型或者结构型的选项。要允许某个布尔型的选项，lpOptionVlaue只需指向一个非零整数。禁止该选项时，lpOptionValue就指向一个等于0的整数。对布尔型的选项来说，nOptionLen应该和sizeof(BOOL)相等。对其它的选项来说，lpOptionValue指向包含了选项所需值的整数或者结构，nOptionLen则指明整数类型或者结构的长度。
SO_LINGER用于控制未发送数据在套接字上的排队方式，以及调用Close函数关闭套接字时的行为。要了解更详细的信息，请参阅联机文档“Win32 SDK”中的“Windows套接字编程注意事项”。
缺省时，套接字不能被绑定到一个正在使用的本地地址上。然而，在某些场合，希望能重用这些地址。既然每个连接是由本地地址和远地地址共同来唯一确定的，保持远地地址不同，同时让两个套接字绑定到同一个本地地址是完全可行的。
如果调用Bind时的地址已经被另一个套接字使用， Windows Sockets的实现会禁止这个绑定。为了避免这个情况，从而实现地址的重用，就需要在调用Bind之前，设置套接字选项SO_REUSEADDR。该选项只在调用Bind时才起作用。没有必要把一个没有重用地址的套接字的选项设为SO_REUSEADDR，在调用Bind后设置或者重置这个选项对任何套接字都不会发生影响。
应用可以设置SO_KEEPALIVE选项，从而可以使用Windows Sockets实现所提供的传输控制协议（TCP）的“保持活动”包（关于“keep-alive”包的详细内容，请参阅联机文档“Win32 SDK”中的“Windows套接字编程注意事项”）。Windows Sockets的具体实现不一定要支持“保持活动”包。如果要支持的话，它的精确语义可由实现定义，但必须和RFC1122中4.2.3.6节“Internet主机——通信层需求”阐述的内容一致。如果因为“保持活动”而删除了一个连接，在这个套接字上的任何调用都返回错误代码WSAENETRESET，以后的调用则返回错误代码WSAENOTCONN。
设置TCP_NODELAY选项可以禁止Nagle算法。Nagle算法缓冲主机发送的那些未被确认的小数据包，并组成一个大的数据包，从而减少了发送的数据包个数。然而，对某些应用来说，这样会影响效率，可以设置TCP_NODELAY来禁止Nagle算法。应用编程轻易不要把这个选项设置为TCP_NODELAY，因为它会对网络性能产生较大的负面影响。TCP_NODELAY是支持的唯一一个IPPROTO_TCP级别的套接字选项。Windows Sockets的某些实现可以通过设置SO_DEBUG选项来支持调试信息的输出。

SetSockOpt支持的选项如下表，类型列指的是lpOptionValue指向的数据类型。
值 | 类型 | 含义
SO_BROADCAST | BOOL | 允许在套接字上传输广播消息
SO_DEBUG | BOOL | 记录调试信息
SO_DONTLINGER | BOOL | 不成块等待未发送数据发送完的Close调用；设置本选项和在l_onofff=0时设置SO_LINGER等价
SO_DONTROUTE | BOOL | 不经路由转换：直接把数据发到接口
SO_KEEPALIVE | BOOL | 发送keep_alives
SO_LINGER | struct LINGER | 如果有未发送数据，则在Close时延时等待
SO_OOBINLINE | BOOL | 在普通数据流中接收带外数据
SO_RCVBUF | int | 设置接收数据的缓冲的大小
SO_REUSEADDR | BOOL | 允许套接字绑定到一个已经使用的地址上
SO_SNDBUF | int | 设置发送数据的缓冲的大小
TCP_NODELAY | BOOL | 禁止发送数据时的Nagle算法

SetSockOpt不支持的Berkeley软件发布（BSD）选项有：
值 | 类型 | 含义
SO_ACCEPTCONN | BOOL | 套接字正在监听，允许接收连接
SO_ERROR | int | 返回并清除错误状态
SO_RCVLOWAT | int | 接收最低水准标志
SO_RCVTIMEO | int | 接收到超时消息
SO_SNDLOWAT | int | 发送最低水准标志
SO_SNDTIMEO | int | 发送超时消息
SO_TYPE | int | 设置套接字的类型
IP_OPTIONS | int | 设置IP头上的选项字段

请参阅：
CAsyncSocket::AsyncSelect, CAsyncSocket::Bind, CAsyncSocket::Create, CAsyncSocket::GetSockOpt, CAsyncSocket::IOCtl


 CAsyncSocket::ShutDown

BOOL ShutDown( int nHow = sends );

返回值： 调用成功时返回非零值，否则为0，并且可以调用GetLastError取得特定的错误代码。此成员函数可用的错误代码有：
· | WSANOTINITIALISED | 在调用本API函数之前，必须已经成功地执行AfxSocketInit。
· | WSAENETDOWN | Windows Sockets检测到网络系统故障。
· | WSAEINVAL | 参数nHow的值无效。
· | WSAEINPROGRESS | 正在执行一个成块的Windows Sockets操作。
· | WSAENOTCONN | 套接字没有连接上（仅用于SOCK_STREAM型的套接字）。
· | WSAENOTSOCK | 描述符不是一个套接字描述符。

参数：
nHow说明哪种类型的操作将被禁止的标志，可以使用以下的枚举值：
· | receives = 0
· | sends = 1
· | both = 2

说明：
本函数用于在套接字上禁止发送和（或）接收数据。它可以用在任意类型的套接字上禁止接收、传输或者同时禁止接收和传输。如果nHow为0，将不允许在此套接字上接收数据。本函数的设置对低层协议没有影响。
对传输控制协议（TCP）来说，本函数不会改变TCP窗口，而且将一直接收输入数据（但不确认）直到窗口满。对用户数据报协议（UDP）来说，接收输入的数据报并且入队。任何时候都不会产生ICMP错误包。如果nHow为1，将不允许此后的数据发送。对TCP套接字来说，将会发送FIN。nHow为2时，将同时禁止数据发送和接收。
注意，ShutDown不会关闭套接字，在调用Call之前套接字占用的资源也不会释放。应用不应指望在调用ShutDown后利用套接字占用的资源。特别是，Windows Sockets的实现可以不支持这种套接字上的Connect调用。

请参阅：CAsyncSocket::Connect, CAsyncSocket::Create


 CAsyncSocket::m_hSocket

说明：
CAsyncSocket::m_hSocket中记录了该CAsyncSocket对象中封装的套接字SOCKET句柄。


 CBitmap

CObject
└CGdiObject
└CBitmap

类CBitmap封装了Windows图形设备接口（GDI）中的位图，并且提供了操纵位图的成员函数。使用CBitmap对象之前要先构造CBitmap对象，调用其中的一个初始化成员函数设置位图对象的句柄。此后就可以调用其它成员函数了。要了解有关使用像CBitmap这样的图形对象的详细信息，请参阅联机文档“Visual C++ 程序员指南”中的“图形对象”。
#include <afxwin.h>

CBitmap类的成员

构造函数
CBitmap 构造一个CBitmap对象

初始化函数
LoadBitmap | 从应用的可执行文件中加载一个命名的位图资源来初始化位图对象
LoadOEMBitmap | 加载一个预定义的Windows位图来初始化位图对象
LoadMappedBitmap | 加载一个位图并把它的颜色映射为系统颜色
CreateBitmap | 用一个指定宽度、高度和位图模式的依赖于设备的内存位图初始化位图对象
CreateBitmapIndirect | 用BITMAP结构中给出的宽度、高度和模式（可以不指定）的位图初始化位图对象
CreateCompatibleBitmap | 用一个位图初始化对象使之与指定设备兼容
CreateDiscardableBitmap | 用一个可丢弃的、与指定设备兼容的位图初始化对象

属性
GetBitmap | 用位图信息填充BITMAP结构
operator HBITMAP | 返回CBitmap对象上的Windows句柄

操作
FromHandle | 给出Windows HBITMAP结构的指针时，返回指向CBitmap对象的指针
SetBitmapBits | 把位图的位设为指定的值
GetBitmapBits | 拷贝指定位图的位值到指定的缓冲
SetBitmapDimension | 设置位图的宽度和高度（以0.1毫米为单位）
GetBitmapDimension | 返回位图的宽度和高度。要求已经调用SetBitmapDimension设置位图的宽度和高度


 CBitmap::CBitmap

CBitmap();

说明：
构造一个CBitmap对象。生成的对象必须用下面的一个成员函数进行初始化。

请参阅：
CBitmap::LoadBitmap, CBitmap::LoadOEMBitmap, CBitmap::CreateBitmap, CBitmap::CreateBitmapIndirect, CBitmap::CreateCompatibleBitmap, CBitmap::CreateDiscardableBitmap


 CBitmap::CreateBitmap

BOOL CreateBitmap( int nWidth, int nHeight, UINT nPlanes, UINT nBitcount, const void* lpBits );

返回值：调用成功时返回非零值，否则为0。

参数：
nWidth | 指定位图的宽度（以像素数为单位）。
nHeight | 指定位图的高度（以像素数为单位）。
nPlanes | 指定位图中的彩色位面数。
nBitCount | 指定位图中每个像素颜色的位数。
lpBits | 指向一个短整型数组，数组中记录了位图的初始位值。如果为NULL，则新的位图没有被初始化。

说明：
本函数用指定的宽度、高度和位模式初始化依赖于设备的内存位图。
对彩色位图来说，参数nPlanes和nBitcount要有一个被设置为1。如果二者都被设置为1，则建立一个黑白位图。
虽然不能为显示设备直接选中一个位图，但可以调用CDC::SelectObject把位图置为内存设备上下文（memory device context）的当前位图，然后调用CDC::BitBlt函数把它拷贝到任何兼容的设备上下文中。
终止用CreateBitmap建立的CBitmap对象，先要从设备上下文中移出该位图，然后删除该对象。
要了解有关的更详细信息，请参阅BITMAP结构中对成员bmBits的描述。BITMAP结构在成员函数CBitmap::CreateBitmapIndirect中的说明。

请参阅：
CDC::SelectObject, CGdiObject::DeleteObject, CDC::BitBlt, ::CreateBitmap


 CBitmap::CreateBitmapIndirect

BOOL CreateBitmapIndirect( LPBITMAP lpBitmap );

返回值：调用成功时返回非零值，否则为0。

参数：
lpBitmap 指向包含有关位图信息的BITMAP结构。

说明：
本函数用lpBitmap指向的结构中指定的宽度、高度和位模式（可以不指定）初始化位图对象。虽然显示设备不能直接选中一个位图，但可以调用CDC::Select Object把位图置为内存设备上下文（memory device context）的当前位图，然后调用CDC::BitBlt或CDC::StrechBlt把它拷贝到任何兼容的设备上下文中（CDC::PatBlt 函数能把当前画刷的位图直接拷贝到显示设备的上下文中）。
如果已经调用函数GetObject填充了lpBitmap指向的结构，则位图的位值没有指定，并且位图未被初始化。要初始化该位图，应用可以调用CDC:BitBlt或::SetDIBits把CgdiObject::GetObject函数的第一个参数指定的位图的位值拷贝到CreateBitmapIndirect建立的位图中。
终止用CreateBitmapIndirect建立的CBitmap对象，要先从设备上下文中移出该位图，然后删除该对象。

请参阅：
CDC::SelectObject, CDC::BitBlt, CGdiObject::DeleteObject, CGdiObject::GetObject, ::CreateBitmapIndirect


 CBitmap::CreateCompatibleBitmap

BOOL CreateCompatibleBitmap( CDC* pDC, int nWidth, int nHeight );

返回值：调用成功时返回非零值，否则为0。

参数：
pDC | 指定设备上下文。
nWidth | 指定位图的宽度（以像素数为单位）。
nHeight | 指定位图的高度（以像素数为单位）。

说明：
初始化一个与pDC指定的设备上下文兼容的位图。位图与指定的设备上下文具有相同的颜色位面数或相同的每个像素的位数。任何与pDC指定的设备兼容的内存设备都可以选择它作为当前位图。
如果pDC指向的是内存设备上下文，则返回的位图与设备上下文中当前选中的位图具有相同的格式。“内存设备上下文”是一块表示一块显示区域的内存，它可以把图像存储在内存中，以备拷贝到兼容设备的真实显示区域中。
建立一个内存设备上下文时，GDI自动地为它选择一个黑白原始位图。既然彩色内存设备上下文的当前位图既可以是彩色的也可以是黑白的，CreateCompatibleBitmap返回的位图就不一定是相同的格式设置。但是，非内存设备上下文的兼容位图的格式总是和设备的格式一致。
终止用CreateCompatibleBitmap建立的CBitmap对象，要先从设备上下文中移出位图，然后删除该对象。

请参阅：::CreateCompatibleBitmap, CGdiObject::DeleteObject


 CBitmap::CreateDiscardableBitmap

BOOL CreateDiscardableBitmap( CDC* pDC, int nWidth, int nHeight );

返回值：调用成功时返回非零值，否则为0。

参数：
pDC | 指定设备上下文。
nWidth | 指定位图的宽度（以像素数为单位）。
nHeight | 指定位图的高度（以像素数为单位）。

说明：
本函数初始化一个与pDC指定的设备上下文兼容的可丢弃的位图。位图与指定的设备上下文具有相同的颜色位面数或相同的每个像素的位数。任何与pDC指定的设备兼容的内存设备都可以选择它作为当前位图。
应用没有把该函数建立的位图选到某个显示上下文中时，Windows可以丢弃该位图。如果在Windows丢弃了该位图之后，应用又试图选中该位图，函数CDC::SelectObject将返回NULL。
终止用CreateDiscardableBitmap建立的CBitmap对象，要先从设备上下文中移出该位图，然后删除该对象。

请参阅：::CreateDiscardableBitmap, CGdiObject::DeleteObject


 CBitmap::FromHandle

static CBitmap* PASCAL FromHandle( HBITMAP hBitmap );

返回值：调用成功时返回一个指向CBitmap对象的指针，否则返回NULL。

参数：
hBitmap 指定一个Windows GDI 位图的句柄。

说明：
本函数在调用时指定一个Windows GDI 位图的句柄，返回一个指向CBitmap对象的指针。如果该句柄上没有相联系的CBitmap对象，则为该句柄建立一个临时CBitmap对象。该临时CBitmap对象保持有效，直到应用在它的事件循环中出现空闲时间，此时Windows会删除所有的临时图形对象。换句话说，临时对象仅在一个Windows消息的处理过程中有效。


 CBitmap::GetBitmap

int GetBimap( BITMAP* pBitMap );

返回值：调用成功时返回非零值，否则为0。

参数：
pBitMap 指向BITMAP结构的一个指针，不能为NULL。

说明：
本函数用于查看CBitmap对象的信息。返回的信息存放在pBitMap指向的BITMAP结构中。

请参阅：BITMAP


 CBitmap::GetBitmapBits

DWORD GetBitmapBits( DWORD dwCount, LPVOID lpBits ) const;

返回值：调用成功时返回位图的实际字节数，否则为0。

参数：
dwCount | 指定要拷贝的字节数。
lpBits | 指向接收位图内容的缓冲。位图用字节数组表示，该数组与一个由很多双字节（16位）组成的结构等价。

说明：
本函数把CBitmap对象的位模式拷贝到lpBits指向的缓冲中。参数dwCount指定待拷贝的字节数。可以调用函数CgdiObject::GetObject得到指定位图的正确dwCount值。

请参阅：CGdiObject::GetObject, ::GetBitmapBits


 CBitmap::GetBitmapDimension

CSize GetBitmapDimension( ) const;

返回值：
返回位图的宽度和高度，以0.1毫米为单位。位图高度存放在Csize对象的成员cy中，宽度存放在成员cx中。如果没有调用SetBitmapDimension设置位图的宽度和高度，函数将返回0。

说明：
本函数返回位图的宽度和高度。调用之前应已经调用SetBitmapDimension设置位图的宽度和高度。

请参阅：CBitmap::SetBitmapDimension


 CBitmap::LoadBitmap

BOOL LoadBitmap( LPCTSTR lpszRecourceName );
BOOL LoadBitmap( UINT nIDResource );

返回值：调用成功时返回非零值，否则为0。

参数：
lpszResourceName | 指向一个包含了位图资源名字的字符串（该字符串以null结尾）。
nIDResource | 指定位图资源中资源的ID号。

说明：
本函数从应用的可执行文件中加载由lpszResourceName指定名字或者由nIDResource指定的ID号标志的位图资源。加载的位图被附在CBitmap对象上。
如果由lpszResourceName指定名字的对象不存在，或者没有足够的内存加载位图，函数将返回0。
可以调用函数CgdiObject::DeleteObject删除由LoadBitmap加载的位图，否则CBitmap的析构函数将删除该位图对象。
警告：在删除位图对象之前，要保证它没有被选到设备上下文中。
在Windows3.1以及以后的版本中，增加了如下的位图：
OBM_UPARROWI
OBM_DNARROWI
OBM_RGARROWI
OBM_LFARROWI
在Windows3.0或者更早版本的设备驱动程序中不支持这些位图。位图的完整列表和图形请参阅“Win32程序员参考”。

请参阅：
CBitmap::LoadOEMBitmap, ::LoadBitmap, CGdiObject::DeleteObject


 CBitmap::LoadMappedBitmap

BOOL LoadmappedBitmap(
UINT nIDBitmap,
UNIT nFlags = 0,
LPCOLORMAP lpColorMap = NULL,
int nMapSize = 0
);

返回值：调用成功时返回非零值，否则为0。

参数：
nIDBitmap | 位图资源的ID号。
nFlags | 位图的标记。可以是0或者CMB_MASKED。
lpColorMap | 指向COLORMAP结构的一个指针。结构中记录了映射位图所需的颜色信息。如果本参数为NULL，函数将使用缺省的颜色映射。
nMapsize | 由lpColorMap指向的颜色映射的数目。

说明：
本函数加载一个位图并把它的颜色映射为当前系统颜色。缺省时LoadMapped Bitmap将映射通常在按钮图形中采用的颜色。
要建立一个映射的位图，请参阅“Win32 程序员参考”中的Windows函数::CreateMappedBitmap以及COLORMAP结构。

请参阅：::LoadBitmap, ::CreateMappedBitmap


 CBitmap::LoadOEMBitmap

BOOL LoadOEMBitmap( UINT nIDBitmap );

返回值：调用成功返回非零值，否则为0。

参数：
nIDBitmap预定义的Windows位图的ID号。具体定义在头文件WINDOWS.H中。可用的值如下：
OBM_BTNCORNERS | OBM_OLD_RESTORE
OBM_BTSIZE | OBM_OLD_RGARROW
OBM_CHECK | OBM_OLD_UPARROW
OBM_CHECKBOXES | OBM_OLD_ZOOM
OBM_CLOSE | OBM_REDUCE
OBM_COMBO | OBM_REDUCED
OBM_DNARROW | OBM_RESTORE
OBM_DNARROWD | OBM_RESTORED
OBM_DNARROWI | OBM_RGARROW
OBM_LFARROW | OBM_RGARROWD
OBM_LFARROWD | OBM_RGARROWI
OBM_LFARROWI | OBM_SIZE
OBM_MNARROW | OBM_UPARROW
OBM_OLD_CLOSE | OBM_UPARROWD
OBM_OLD_DNARROW | OBM_UPARROWI
OBM_OLD_LFARROW | OBM_ZOOM
OBM_OLD_REDUCE | OBM_ZOOMD

说明：
本函数用于加载一个Windows预定义的位图。以OBM_OLD开头的位图名表示它们是在Windows3.0之前的版本采用的。
使用不是以OBM_OLD开头的常量，需要在包括头文件WINDOW.H之前定义常量OEMRESOURCE。

请参阅：CBitmap::LoadBitmap, ::LoadBitmap


 CBitmap::SetBitmapBits

DWORD SetBitmapBits( DWORD dwCount, const void* lpBits );

返回值：调用成功时返回设置位图位值的字节数，否则为0。

参数：
dwCount | 指定由lpBits指向的字节数。
lpBits | 指向一个BYTE类型的数组，数组中记录了要拷贝到CBitmap对象的位值。

说明：本函数用lpBits指定的位值设置位图的位值。

请参阅：::SetBitmapBits


 CBitmap::SetBitmapDimension

CSize SetBitmapDimension (int nWidth, int nHeight);

返回值：
返回前一个位图的维数。高度存放在CSize对象的成员cy中，宽度存放在成员cx中。

参数：
nWidth | 指定位图的宽度（以0.1毫米为单位）。
nHeight | 指定位图的高度（以0.1毫米为单位）。

说明：
本函数用于设置位图的高度和宽度。GDI一般不用这些数字，除非应用调用成员函数GetBitmapDimension来获取它们。

请参阅：CBitmap::GetBitmapDimension


 CBitmap::operator HBITMAP

operator HBITMAP( ) const;

返回值：
调用成功时返回一个由CBitmap对象表示的Windows GDI对象的句柄，否则返回NULL。

说明：
本操作符用于取得CBitmap对象上的Windows GDI对象句柄。这是一个校验性操作符，可直接参考HBITMAP对象。
要了解有关使用图形对象的更详细的信息，请参阅“Win32 程序员参考中的“图形对象”。


 CBitmapButton

CObject
└CCmdTarget
└CWnd
└CButton
└CBitmapButton

类CBitmapButton用于创建用位图而不是文本做标签的按钮控件。CBitmapButton对象最多可包括4个位图，分别代表按钮所处的不同状态：未按下（或正常）、按下（或选中）、获得焦点和被禁止存取。只有第一个位图是必须的，其它三个可以不提供。
位图按钮图像包括图像本身以及图像的边框。边框在表示按钮的不同状态时很有用。例如，按钮获得焦点时的位图与未按下（或正常）状态的位图相同，但是在边框中要么嵌入了由间断线组成的矩形，要么嵌入了由粗实线组成的矩形。禁止存取状态的按钮的位图通常和正常状态的一样，但是颜色的对比度较小，就象变灰的菜单选项一样。
这些位图的尺寸可以不同，但都当成和正常状态下位图一样的大小处理。
不同的应用对位图有不同的组合应用。如下所示：
未按下 | 按下 | 获得焦点 | 禁止存取 | 应用
ⅹ |  |  |  | 类Bitmap
ⅹ | ⅹ |  |  | 没有设置WS_TABSTOP的按钮
ⅹ | ⅹ | ⅹ | ⅹ | 带有所有状态的对话框按钮
ⅹ | ⅹ | ⅹ |  | 设置WS_TABSTOP风格的对话框按钮

在创建一个位图按钮控件时，设置BS_OWNERDRAW则指明按钮是自定义的（用户自己绘制的）。这样，Windows就会为该按钮发送WM_MEASUREITEM和WM_DRAWITEM消息，由框架处理这些消息并维护按钮的外观。
在窗口的客户区创建一个位图按钮的步骤如下：
1. | 为按钮创建1到4个位图。
2. | 构造CBitmapButton对象。
3. | 调用Create函数创建Windows按钮控件，并把它加到CBitmapButton对象上。
4. | 调用成员函数LoadBitmaps加载位图资源。
在对话框控件中包含位图按钮的步骤如下：
1. | 为按钮创建1到4个位图。
2. | 创建一个对话框模板，其中有一个自定义的按钮放在需要位图按钮的位置。模板中按钮的大小无关紧要。
3. | 把按钮的标题设置为“MYIMAGE”一类的字符串，并为按钮定义一个类似于IDC_MYIMAGE的代号。
4. | 在应用的资源脚本中，分别为每个给该按钮创建的图像一个ID，ID的值为在步骤3中的标题后加上如下的一个字母——U、D、F或X，分别代表正常、按下、获得焦点和禁止存取状态下的按钮。例如，标题设为“MYIMAGE”时，ID就应该是字符串("MYIMAGEU"、"MYIMAGED"、"MYIMAGEF"和"MYIMAGEX")。位图的ID必须用引号括起来，否则资源编辑器就会为资源赋上一个整数值，MFC在加载图像时就会失败。
5. | 在应用的对话框类（从类CDialog继承而来）中加上一个CBitmapButton成员对象。
6. | 在CDialog对象的OnInitDialog例程中调用CBitmapButton对象的AutoLoad函数，参数是按钮的ID和CDialog对象的this指针。
如果想处理Windows的通知消息，如位图按钮控件发给它的父对象（通常是从CDialog继承来的）的BN_CLICKED消息，就要在从CDialog继承来的对象中加入消息映射入口以及处理每个消息的成员函数。CBitmapButton对象发出的通知和CButton对象发出的通知一样。
类CToolBar对位图对象的实现有些不同。
要了解有关CBitmapButton的更详细信息，请参阅联机文档“Visual C++程序员指南”的“控件主题”部分。
#include <afxext.h>

CBitmapButton类的成员

构造函数
CBitmapButton | 构造一个CBitmapButton对象
LoadBitmaps | 从应用的资源文件中加载一个或多个命名的位图初始化对象，并把位图加到对象上
AutoLoad | 把对话框中的一个按钮与一个CBitmapButton对象联系上，加载位图并调整按钮的大小以放下位图

操作
SizeToContent 调整按钮的大小以放下整个位图


 CBitmapButton::AutoLoad

BOOL AutoLoad ( UINT nID, CWnd* pParent );

返回值：调用成功时返回非零值，否则为0。

参数：
nID | 按钮的控制ID号。
pParent | 指向拥有此按钮的对象的指针。

说明：
本函数把对话框中的一个按钮与一个CBitmapButton对象联系上，加载位图并调整按钮的大小以放下位图。
调用AutoLoad函数可以初始化对话框中的自定义按钮为位图按钮。使用此函数的注意事项请参阅类CBitmapButton的说明部分。

请参阅：CBitmapButton::LoadBitmaps, CBitmapButton::SizeToContent


 CBitmapButton::CBitmapButton

CBitmapButton( );

说明：
创建一个CBitmapButton对象。
在创建这个C++对象之后，可以调用CButton::Create来创建Windows按钮控件并且把它加到CBitmapButton对象中。

请参阅：
CBitmapButton::LoadBitmaps, CBitmapButton::AutoLoad, CBitmapButton::SizeToContent, CButton::Create


 CBitmapButton::LoadBitmaps

BOOL LoadBitmaps(
LPCTSTR lpszBitmapResource,
LPCTSTR lpszBitmapResourceSel = NULL,
LPCTSTR lpszBitmapResourceFocus = NULL,
LPCTSTR lpszBitmapResourceDisabled = NULL
);

BOOL LoadBitmaps(
UINT nIDBitmapResource,
UINT nIDBitmapResourceSel = 0,
UINT nIDBitmapResourceFocus = 0,
UINT nIDBitmapResourceDisabled = 0
);

返回值：调用成功时返回非零值，否则为0。

参数：
lpszBitmapResource | 指向一个以null结尾的字符串，字符串中包含了位图按钮正常（未按下）状态下的位图名称。该参数是必须的。
lpszBitmapResourceSel | 指向一个以null结尾的字符串，字符串中包含了位图按钮选中（按下）状态下的位图的名字。该参数可以为NULL。
lpszBitmapResourceFocus | 指向一个以null结尾的字符串，字符串中包含了位图按钮在获得焦点状态下的位图的名字。该参数可以为NULL。
lpszBitmapResourceDisabled | 指向一个以null结尾的字符串，字符串中包含了位图按钮在禁止存取状态下的位图的名字。该参数可以为NULL。
nIDBitmapResource | 指定位图按钮在正常（未按下）状态下对应的位图资源的中的位图的ID号。该参数是必须的。
nIDBitmapResourceSel | 指定位图按钮在选中（按下）状态下对应的位图资源的中的位图的ID号。该参数可以为0。
nIDBitmapResourceFocus | 指定位图按钮在获得焦点状态下对应的位图资源的中的位图的ID号。该参数可以为0。
nIDBitmapResourceDisabled | 指定位图按钮在禁止存取状态下对应的位图资源的中的位图的ID号。该参数可以为0。

说明：
本函数用于加载位图图像，参数为资源的名字或ID号。尤其是在不能调用AutoLoad函数加载位图资源时（例如在创建一个不是对话框一部分的位图按钮时）使用。

请参阅：
CBitmapButton::AutoLoad, CBitmapButton::SizeToContent, CButton::Create, CBitmap::LoadBitmap


 CBitmapButton::SizeToContent

void SizeToContent( );

说明：
本函数用于调整位图按钮的大小以适应位图的大小。

请参阅：CBitmapButton::LoadBitmaps, CBitmapButton::AutoLoad


 CBrush

CObject
└CGdiObject
└CBrush

类CBrush封装了Windows图形设备接口（GDI）中的画刷。使用CBrush对象之前要构造它，然后传给需要画刷的CDC成员函数。画刷可以是实线的、阴影线的或图案的。要了解有关画刷的更详细信息，请参阅联机文档“Visual C++程序员指南”中的“图形对象”部分。
#include <afxwin.h>
请参阅：CBitmap, CDC

CBrush类的成员

构造函数
CBrush 构造一个CBrush对象

初始化函数
CreateSolidBrush | 用指定的实线初始化画刷
CreateHatchBrush | 用指定的阴影线初始化画刷
CreateBrushIndirect | 用结构LOGBRUSH中指定的风格、颜色和模式初始化画刷
CreatePatternBrush | 用位图指定的模式初始化画刷
CreateDIBPatternBrush | 用独立于设备的位图（DIB）初始化画刷
CreateSysColorBrush | 创建一个使用系统缺省颜色的画刷

操作
FromHandle 给出一个Windows HBRUSH对象句柄时，返回一个指向CBrush对象的指针

属性
GetLogBrush | 取得一个LOGBRUSH结构
operator HBRUSH | 返回CBrush对象上的Windows句柄


 CBrush::CBrush

CBrush( );
CBrush( COLORREF crColor );
throw( CResouceException );
CBrush( int nIndex, COLORREF crColor );
throw( CResouceException );
CBrush( CBitmap* pBitmap );
throw( CResouceExecption );

参数：
crColor | 指定画刷的前景色（RGB方式）。如果画刷是阴影线型的，则指定阴影线的颜色。
nIndex指定画刷阴影线采用的风格，取值如下：
· | HS_BDIAGONAL | 45度的向下影线（从左到右）
· | HS_CROSS | 水平和垂直方向以网格线作出阴影
· | HS_DIAGCROSS | 45度的网格线阴影
· | HS_FDIAGONAL | 45度的向上阴影线（从左到右）
· | HS_HORIZONTAL | 水平的阴影线
· | HS_VERTICAL | 垂直的阴影线
pBitmap | 指向CBitmap对象的指针，该对象指定了画刷要绘制的位图。

说明：
类CBrush一共有四个覆盖的构造函数。不带参数的那个构造函数构造一个未初始化的CBrush对象，在使用该对象之前需要另外初始化。
如果使用了不带参数的那个构造函数，则必须用CreateSolidBrush、CreateHatchBrush、CreateBrushIndirect、CreatePatternBrush或CreateDIBPatternBrush来初始化返回的CBrush对象。如果使用了带参数的构造函数，则不再需要初始化CBrush对象。带参数的构造函数在出错时会产生一个异常，而不带参数的构造函数总是成功返回。
只带有一个参数COLORREF的构造函数用指定的颜色构造一个实线型的画刷。颜色是一个RGB值，可以用WINDOWS.H中的宏RGB构造出来。
带两个参数的构造函数构造一个阴影线型的画刷，参数：nIndex指定了阴影线模式的指数（index）。参数：
crColor指定了画刷的颜色。
带有一个CBitmap型参数的构造函数构造一个模式化的画刷。参数指定一个位图。该位图应该是已经用CBitmap::CreateBitmap、CBitmap::CreateBitmapIndirect、CBitmap::LoadBitmap或CBitmap::CreateCompatiableBitmap建立或加载的位图。填充模式下的位图的最小尺寸为8像素×8像素。

请参阅：
CBrush::CreateSolidBrush, CBrush::CreateHatchBrush, CBrush::CreateBrushIndirect, CBrush::CreatePatternBrush, CBrush::CreateDIBPatternBrush, CGdiObject::CreateStockObject


 CBrush::CreateBrushIndirect

BOOL CreateBrushIndirect( const LOGBRUSH* lpLogBrush ):

返回值：调用成功时返回非零值，否则为0。

参数：
lpLogBrush 指向LOGBRUSH结构的指针，结构中记录了画刷的相关信息。

说明：
本函数用结构LOGBRUSH中指定的风格、颜色和模式初始化画刷。以后，该画刷可以被选为任何设备上下文的当前画刷。采用黑白位图（1位面、每像素1位）创建的画刷使用当前的文本颜色和背景色。位值置为0的像素点将用当前的文本颜色绘制。位值置为1的像素点将用当前的背景色绘制。

请参阅：
CBrush::CreateDIBPatternBrush, CBrush::CreatePatternBrush, CBrush::CreateSolidBrush, CBrush::CreateHatchBrush, CGdiObject::DeleteObject, ::CreateBrushIndirect, CGdiObject::CreateStockObject,


 CBrush::CreateDIBPatternBrush

BOOL CreateDIBPatternBrush( HGLOBAL hPackedDIB, UINT nUsage );
BOOL CreateDIBPatternBrush( const void* lpPackedDIB, UINT nUsage );

返回值：调用成功时返回非零值，否则为0。

参数：
hPackedDIB | 指定一个全局内存对象，其中包含了一个压缩的独立于设备的位图（DIB）
nUsage指明BITMAPINFO数据结构（压缩的DIB中的一部分）的bmiColors[]成员是否包含明确的RGB值或指向当前逻辑调色板的索引值。参数必须取以下值之一：
· | DIB_PAL_COLORS | 颜色表由一个16位的索引数组组成。
· | DIB_RGB_COLORS | 颜色表中包含字母式的RGB颜色值。下面这个值只在第二个函数中有效：
· | DIB_PAL_INDICES | 未提供颜色表。位图中包含了指向画刷选中的设备上下文的逻辑调色板的索引。
lpPackedDIB | 指向一个包括了BITMAPINFO结构的压缩的DIB。BITMAPINFO结构后紧跟着的是定义位图像素的字节数组。

说明：
本函数用DIB指定的模式初始化画刷。画刷随后就可以被任何支持光栅操作的设备上下文选中。
CreateDIBPatternBrush函数的两个版本在处理DIB时有些不同：
· | 在前一个函数中，取得DIB的句柄需要调用Windows函数::GlobalAlloc来分配内存，然后用DIB填充这块内存。
· | 在后一个函数中，不再需要调用函数::GlobalAlloc为压缩的DIB分配内存。
一个压缩的DIB由一个BITMAPINFO结构和紧跟着的一个字节数组（该数组定义了位图的像素）构成。用作填充模式的位图应该是8像素×8像素的。如果位图太大，Windows将用该位图的左上角的8行8列的像素来创建填充模式。
当应用选择一个两种颜色的DIB模式到一个黑白的设备上下文中时，Windows将忽略DIB中指定的颜色，而用该设备上下文中当前文本的颜色和背景色显示模式画刷。DIB中对应于第一种颜色的像素（在DIB颜色表偏移为0处）将采用文本的颜色显示。DIB中对应于第二种颜色的像素（在DIB颜色表偏移为1处）将采用背景色显示。
要了解有关使用以下的Windows函数的更详细的信息，请参阅联机文档“Win32 SDK程序员参考”。
· | ::CreateDIBPatternBrush（本函数是为了兼容Windows3.0之前的应用而提供的，对于Win32应用，请用函数::CreateDIBPatternBrushPt）
· | ::CreateDIBPatternBrushPt（本函数只用于基于Win32的应用）
· | ::GlobalAlloc

请参阅：
CBrush::CreatePatternBrush, CBrush::CreateBrushIndirect, CBrush::CreateSolidBrush, CBrush::CreateHatchBrush, CGdiObject::CreateStockObject, CDC::SelectObject, CGdiObject::DeleteObject, CDC::GetBrushOrg, CDC::SetBrushOrg


 CBrush::CreateHatchBrush

BOOL CreateHatchBrush( int nIndex, COLORREF crColor );

返回值：调用成功时返回非零值，否则为0。

参数：
nIndex指定画刷的阴影线风格。可取的值如下：
· | HS_BDIAGONAL | 45度的向下影线（从左到右）
· | HS_CROSS | 水平和垂直方向以网格线作出阴影
· | HS_DIAGCROSS | 45度的网格线阴影
· | HS_FDIAGONAL | 45度的向上阴影线（从左到右）
· | HS_HORIZONTAL | 水平的阴影线
· | HS_VERTICAL | 垂直的阴影线
crColor 指定画刷的前景色（RGB形式的值），就是阴影的颜色。要了解更详细的信息，请参阅联机文档“Win32 SDK”中关于COLORREF的描述。

说明：
本函数用指定的阴影模式和颜色初始化画刷。随后该画刷就可以被选为任何设备上下文的当前画刷了。

请参阅：
CBrush::CreateBrushIndirect, CBrush::CreateDIBPatternBrush, CBrush::CreatePatternBrush, CBrush::CreateSolidBrush, CGdiObject::CreateStockObject, ::CreateHatchBrush


 CBrush::CreatePatternBrush

BOOL CreatePatternBrush( CBitmap* pBitmap );

返回值：调用成功时返回非零值，否则为0。

参数：
pBitmap 指定一个位图。

说明：
本函数用位图指定的模式初始化画刷。此画刷随后就可用于任何支持光栅操作的设备上下文。由bBitmap指定的位图一般用以下的函数初始化：CBitmap::CreateBitmap、CBitmap::CreateBitmapIndirect、CBitmap::LoadBitmap或Cbitmap::CreateCompatibleBitmap。用作填充模式的位图应该是8像素×8像素的。如果位图太大，Windows将用该位图的左上角的8行8列的像素来创建填充模式。
删除模式画刷时不会影响相关的位图。这意味着可以用一个位图来创建任意个模式画刷。
采用黑白位图（1位面、每像素1位）创建的画刷使用当前的文本颜色和背景色。位值置为0的像素点将用当前的文本颜色绘制，位值置为1的像素点将用当前的背景色绘制。
要了解有关使用Windows函数::CreatePatternBrush的更详细信息，请参阅联机文档“Win32 SDK 程序员参考”。

请参阅：
CBitmap, CBrush::CreateBrushIndirect, CBrush::CreateDIBPatternBrush, CBrush::CreateHatchBrush, CBrush::CreateSolidBrush, CGdiObject::CreateStockObject


 CBrush::CreateSolidBrush

BOOL CreateSolidBrush( COLORREF crColor );

返回值：调用成功时返回非零值，否则为0。

参数：
crColor 指定画刷颜色的一个COLORREF结构。该颜色指定了一个RGB颜色值，可以用头文件WINDOWS.H中的宏RGB生成。

说明：
本函数用指定的颜色初始化画刷。随后该画刷就可用于任何设备上下文的当前画刷。
当应用使用完CreateSolidBrush创建的画刷之后，应该从设备上下文中移出该画刷。

请参阅：
CBrush::CreateBrushIndirect, CBrush::CreateDIBPatternBrush, CBrush::CreateHatchBrush, CBrush::CreatePatternBrush, ::CreateSolidBrush, CGdiObject::DeleteObject


 CBrush::CreateSysColorBrush

BOOL CreateSysColorBrush( int nIndex );

返回值：调用成功时返回非零值，否则为0。

参数：
nIndex指定阴影线画刷的风格。可能的取值如下：
· | HS_BDIAGONAL | 45度的向下影线（从左到右）
· | HS_CROSS | 水平和垂直方向以网格线作出阴影
· | HS_DIAGCROSS | 45度的网格线阴影
· | HS_FDIAGONAL | 45度的向上阴影线（从左到右）
· | HS_HORIZONTAL | 水平的阴影线
· | HS_VERTICAL | 垂直的阴影线

说明：
本函数初始化画刷的颜色。随后该画刷就可用于任何设备上下文的当前画刷。
当应用使用完CreateSysColorBrush创建的画刷之后，应该从设备上下文中移出该画刷。

请参阅：
CBrush::CreateBrushIndirect, CBrush::CreateDIBPatternBrush, CBrush::CreateHatchBrush, CBrush::CreatePatternBrush, CBrush::CreateSolidBrush, ::GetSysColorBrush, ::CreateSolidBrush, CGdiObject::DeleteObject


 CBrush::FromHandle

static CBrush* PASCAL FromHandle( HBRUSH hBrush );

返回值：调用成功时返回一个指向CBrush对象的指针，否则返回NULL。

参数：
hBrush 指向一个Windows GDI画刷的句柄。

说明：
本函数返回一个指向CBrush对象的指针，所需参数为一个指向一个Windows GDI画刷的句柄。如果该CBrush对象没有应用到句柄上，则创建一个临时的CBrush对象并应用它。该临时CBrush对象保持有效，直到应用在它的事件循环中出现空闲时间，此时Windows会删除所有的临时图形对象。换句话说，临时对象仅在一个Windows消息的处理过程中有效。
要了解有关使用图形对象的更详细信息，请参阅联机文档“Win32 SDK程序员参考”中的“图形对象”部分。


 CBrush::GetLogBrush

int GetLogBrush( LOGBRUSH* pLogBrush );

返回值：
调用成功且参数pLogBrush有效时，返回存到缓冲区中的字节数。
调用成功但参数pLogBrush为NULL时，返回为了保存数据到缓冲区所需的字节数。否则，返回0。

参数：
pLogBrush 指向一个LOGBRUSH结构的指针，结构中包含了画刷的有关信息。

说明：
本函数用于检索LOGBRUSH结构中的信息。该结构定义了画刷的风格、颜色和模式。
例如，调用本函数来取得某个位图的颜色和模式。

示例：
LOGBRUSH logbrush;
brushExisting.GetLogBrush( &logbrush );
CBrush brushOther ( logbrush,lbColor );

请参阅：LOGBRUSH, ::GetObject


 CBrush::operator HBRUSH

operator HBRUSH( ) const;

返回值：
调用成功时返回一个指向Windows GDI对象的句柄，该句柄表示一个CBrush对象。否则返回NULL。

说明：
本操作符用于取得某个CBrush对象上的Windows GDI对象句柄。这是一个校验性操作符，可直接参考HBRUSH对象。
要了解有关使用图形对象的更详细信息，请参阅联机文档“Win32 SDK程序员参考”中的“图形对象”部分。


 CButton

CObject
└CCmdTarget
└CWnd
└CButton

类CButton提供了对Windows按钮控件的操作。按钮控件是一个小的矩形子窗口，可以通过单击选中（按下）或不选中。按钮可以单独使用，也可以成组使用，它还可以具有文本标题。在用户单击它的时候，按钮通常要改变显示外观。
典型的按钮控件有：复选框、单选钮和下压式按钮（push button）。一个CButton对象可以是它们中的一种，这由它的按钮风格和成员函数Create的初始化决定。
此外，类CButtonBitmap是从类CButton继承而来的，不过它支持按钮的图像标签。一个CButtonBitmap对象可以分别为它的四种状态（未按下、按下、获得焦点和禁止存取）设置不同的位图。
既可以从对话框模板中创建一个按钮控件，也可以直接在代码中创建。
无论哪种情况，都要先调用构造函数CButton构造一个CButton对象，然后调用成员函数Create创建Windows按钮控件并应用到CButton对象上。
在一个从类CButton派生出来的类中，构造可以一步完成。程序员可以为这个派生类编写一个构造函数，并在其中调用Create函数。
如果想处理Windows的通知消息，如位图按钮控件发给它的父对象（通常是从CDialog继承来的）的消息，就要在父对象中加入消息映射入口以及处理每个消息的成员函数。
每个消息映射入口的格式如下：
ON_Notification(id, memberFxn)
其中id指定了发送通知的控件的子窗口的ID，而memberFxn指定了处理该通知的父对象中的成员函数名。
父对象的函数原型格式如下：
afx_msg void memberFxn( );
可能的消息映射入口如下：

映射入口 | 何时向父对象发送消息
ON_BN_CLICKED | 用户单击按钮时
ON_BN_DOUBLECLICKED | 用户双击按钮时

如果在对话框资源中创建了CButton对象，则在用户关闭该对话框时会自动撤消这个CButton对象。如果在窗口中创建了CButton对象，就可能需要自己撤消它。如果是用new函数在内存的堆中创建该对象的，则在用户关闭该窗口按钮控件时，必须用delete函数撤消它。如果在堆栈中创建了该对象，或者它嵌入在父对话框对象中，系统会自动撤消它。
#include <afxwin.h>

请参阅：
CWnd, CComboBox, CEdit, CListBox, CScrollBar, CStatic, CBitmapButton, CDialog

CButton类的成员

构造函数
CButton 构造一个CButton对象

初始化函数
Create 创建Windows按钮控件并在CButton对象上应用

操作
GetState | 检索按钮控件的选中状态、加亮状态和获得焦点状态
SetState | 设置按钮控件的加亮状态
GetCheck | 检索按钮控件的选中状态
SetCheck | 设置按钮控件的选中状态
GetButtonStyle | 检索按钮控件的风格
SetButtonStyle | 设置按钮控件的风格
GetIcon | 检索此前调用SetIcon设置的图标句柄
SetIcon | 指定一个在按钮上显示的图标
GetBitmap | 检索此前调用SetBitmap设置的位图的句柄
SetBitmap | 设置在按钮上显示的位图
GetCursor | 检索此前调用SetCursor设置的光标图像的句柄
SetCursor | 设置在按钮上显示的光标图像

可覆盖的函数
DrawItem 可以覆盖它来绘制自定义的CButton对象


 CButton::CButton

CButton( );

说明：本函数用于构造一个CButton对象。

请参阅：CButton::Create


 CButton::Create

BOOL Create(
LPCTSTR lpszCaption,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID
);

返回值：调用成功时返回非零值，否则为0。

参数：
lpszCaption | 指定按钮控件上的文本。
dwStyle | 指定按钮控件的风格。可以采用控件风格的各种组合。
rect | 指定按钮控件的大小和位置。既可以是一个CRect对象，也可以是一个RECT结构。
pParentWnd | 指定按钮控件的父窗口，通常是一个CDialog对象。注意不能为NULL。
nID | 指定按钮控件的ID号。

说明：
构造一个CButton对象需要两步：首先调用构造函数，然后调用Create函数创建Windows按钮控件并在CButton对象上应用它。
如果设置了WS_VISIBLE风格，Windows将向该按钮控件发送所有用来激活和显示该按钮的消息。
按钮控件上可用的窗口风格如下：
· | WS_CHILD | 总是设置
· | WS_VISIBLE | 通常要设置
· | WS_DISABLED | 很少使用
· | WS_GROUP | 成组按钮
· | WS_TABSTOP | 按钮按制表键次序排列

请参阅：CButton::CButton, 按钮风格


 CButton::DrawItem

virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );

参数：
lpDrawItemStruct 指向结构DRAWITEMSTRUCT的一个长指针。结构中记录了要绘制的项的信息以及绘制的风格。

说明：
当自定义按钮的可视属性发生变化时，由框架调用本函数。自定义的按钮的风格设置为BS_OWNERDRAW。可以覆盖本函数以实现自己的绘制函数。在此成员函数终止之前，应用必须重置lpDrawItemStruct中的所有显示上下文选中的GDI对象。
也可参阅BS_style的值。

请参阅：CButton::SetButtonStyle, WM_DRAWITEM


 CButton::GetBitmap

HBITMAP GetBitmap( ) const;

返回值：
调用成功时返回位图的句柄。如果此前没有指定位图，则返回NULL。

说明：
调用本成员函数可以取得此前调用SetBitmap为按钮指定的位图的句柄。

请参阅：
CButton::SetBitmap, CBitmapButton::LoadBitmaps, Bitmaps


 CButton::GetButtonStyle

UINT GetButtonStyle( ) const;

返回值：返回CButton对象的按钮风格。

说明：
本函数只返回BS_style的值，而不返回任何其它窗口风格的值。

请参阅：CButton::SetButtonStyle, ::GetWindowLong


 CButton::GetCheck

int GetCheck( ) const;

返回值：
对于采用BS_AUTOCHECKBOX、BS_AUTORADIOBUTTON、BS_AUTO3STATE、BS_CHECKBOX、BS_RADIOBUTTON或BS_3STATE风格建立的按钮，返回值为下列之一：
值 | 含义
0 | 按钮处于未选中状态
1 | 按钮处于选中状态
2 | 按钮状态不定（仅当按钮风格为BS_3STATE或BS_AUTO3STATE时）如果按钮是其它风格，则返回0。

说明：本函数用于检测单选钮或复选框的选中状态。

请参阅：
CButton::GetState, CButton::SetState, CButton::SetCheck, BM_GETCHECK


 CButton::GetCursor

HCURSOR GetCursor( );

返回值：
调用成功时返回一个指向光标图像的句柄，如果此前没有设置相应的光标图像，则返回NULL。

说明：
本函数用于取得此前用SetCursor在按钮上设置的光标的句柄。

请参阅：
CButton::SetCursor, CBitmapButton::LoadBitmaps, Bitmaps


 CButton::GetIcon

HICON GetIcon( ) const;

返回值：
返回图标的句柄。如果此前没有设置图标，则返回NULL。

说明：
本函数用于取得此前调用SetIcon在按钮上设置的图标的句柄。

请参阅：
CButton::SetIcon, CBitmapButton::LoadBitmaps, Bitmaps


 CButton::GetState

UINT GetState() const;

返回值：
返回按钮控件的当前状态。可以使用以下的掩码取得所需的具体状态信息。
掩码 | 含义
0x0003 | 指定选中状态（选中与否，仅用于单选钮和复选框）。返回0表明未选中，1表明已选中。单选钮在选中时有一个黑圈。复选框选中时则有一个“ⅹ”号。返回2表明选中状态不定（仅用于有三种状态的复选框）。有三种状态的复选框如果处于半色调模式（halftone pattern），就是处于不确定状态
0x0004 | 指定按钮的加亮状态。非零值表明按钮处于加亮状态。用户单击并且保持鼠标左键于按下状态时，按钮是加亮的。在用户放开鼠标按钮时，加亮状态就不复存在了
0x0008 | 是否处于获得焦点状态。返回非零值表明按钮正获得焦点

说明：本函数用于检索单选钮或者复选框的状态。

请参阅：
CButton::GetCheck, CButton::SetCheck, CButton::SetState, BM_GETSTATE


 CButton::SetBitmap

HBITMAP SetBitmap( HBITMAP hBitmap );

返回值：返回此前在按钮上设置的位图的句柄。

参数：
hBitmap 位图的句柄

说明：
本函数用于为按钮设置一个新的位图。
位图将会被自动地放到按钮的表面，缺省时居中放置。如果位图太大，则会被剪裁。可以选择的对齐方式有：
· | BS_TOP
· | BS_LEFT
· | BS_RIGHT
· | BS_CENTER
· | BS_BOTTOM
· | BS_VCENTER
CBitmapButton对象可以有四个位图，而SetBitmap只为每个按钮设置一个位图。在按钮被按下时，位图也被向右下角按下了。

请参阅：
CButton::GetBitmap, CBitmapButton, CBitmapButton::LoadBitmaps, Bitmaps


 CButton::SetButtonStyle

void SetButtonStyle( UINT nStyle, BOOL bRedraw = TRUE );

参数：
nStyle | 指定按钮的风格。
bRedraw | 指明按钮是否需要重绘。非零值表示需要重绘，0表示不需要重绘。缺省时需要重绘。

说明：
本函数用于改变按钮的风格。
函数GetButtonStyle用于取得按钮的风格。按钮风格的完整名称中的小写单词指明了与具体按钮相关的风格。

请参阅：CButton::GetButtonStyle, BM_SETSTYLE


 CButton::SetCheck

void SetCheck( int nCheck );

参数：
nCheck指定按钮控件的选中状态。可能的取值如下：
值 | 含义
0 | 把按钮设为未选中状态
1 | 把按钮设为选中状态
2 | 把按钮设为不确定状态。仅当按钮的风格是BS_3STATE或BS_AUTO3STATE时有效

说明：
本函数用于设置或者重置单选钮和复选框的状态。它对一般的按钮没有影响。

请参阅：
CButton::GetCheck, CButton::GetState, CButton::SetState, BM_SETCHECK


 CButton::SetCursor

HCURSOR SetCursor( HCURSOR hCursor );

返回值：返回此前在按钮上设置的光标的句柄。

参数：
hCursor 光标的句柄。

说明：
本函数用于设置按钮的光标。
光标将会被自动地放到按钮上，缺省时居中放置。如果光标太大，则会自动剪裁。可以选择的对齐方式有：
· | BS_TOP
· | BS_LEFT
· | BS_RIGHT
· | BS_CENTER
· | BS_BOTTOM
· | BS_VCENTER
CBitmapButton对象可以用四个位图，而SetCursor只为每个按钮设置一个光标。在按钮被按下时，光标看起来也向右下角倾斜。

请参阅：
CButton::GetCursor, CBitmapButton::LoadBitmaps, Bitmaps


 CButton::SetIcon

HICON SetIcon( HICON hIcon );

返回值：返回此前在按钮上设置的图标的句柄。

参数：
hIcon 图标的句柄。

说明：
本成员函数用于设置按钮的图标。
图标将会被自动地放到按钮的上面，缺省时居中放置。如果图标太大，则会自动剪裁。可以选择的对齐方式有：
· | BS_TOP
· | BS_LEFT
· | BS_RIGHT
· | BS_CENTER
· | BS_BOTTOM
· | BS_VCENTER
CBitmapButton对象可以用四个位图，而SetIcon只为每个按钮设置一个图标。在按钮被按下时，图标看起来也向右下角倾斜。

请参阅：
CButton::GetIcon, CBitmapButton::LoadBitmaps, Bitmaps


 CButon::SetState

void SetState( BOOL bHighlight)

参数：
bHighlight 指定按钮是否被加亮显示。非零值将加亮显示按钮，0将不加亮显示。

说明：
本函数用于设置是否加亮显示按钮。
加亮显示影响控件的外观，但对单选钮和复选框控件的选中状态没有影响。
当用户单击并且保持鼠标左键为按下状态时，按钮控件自动地加亮显示。当用户放开鼠标按钮时，按钮控件将不再加亮显示。

请参阅：
CButton::GetState, CButton::SetCheck, CButton::GetCheck, BM_SETSTATE


 CByteArray

CObject
└CByteArray

类CByteArray支持以字节为单位动态建立数组。
类CByteArray的成员函数与类CObArray的成员函数类似。因此，也可以参考类CObArray的文档。只需把函数参数或返回值中出现的CObject指针换成BYTE就可以了。例如，类CObArray中的函数：
CObject* CObArray::GetAt( int ) const;
在类CByteArray中对应的就是
BYTE* CByteArray::GetAt( int ) const;
CByteArray中包含了宏IMPLEMENT_SERIAL，以支持对象的串行化和转储。如果字节数组被存到了档案中，不管使用覆盖的操作符“<<”或成员函数Serialize，则其中的元素被串行化。
注意：
在使用数组之前，要调用SetSize设置它的大小并分配内存。如果没有使用SetSize，在数组中增加元素会引起数组内存空间频繁的重新分配以及数据拷贝。内存频繁的重新分配和数据拷贝会影响性能并造成内存碎片。
如果需要对数组中每个元素的输出调试信息，就要把CDumpContext对象的深度设置为1或更大。
要了解有关使用CByteArray的更详细信息，请参阅联机文档“Visual C++程序员指南”中的“收集”部分。
#include <afxcoll.h>

请参阅：CObArray

CByteArray类的成员

构造函数
CByteArray 构造一个空的字节数组

边界
GetSize | 取数组中元素的个数（数组大小）
GetUpperBound | 返回数组的最大有效下标
SetSize | 设置数组元素的个数（数组大小）

操作
FreeExtra | 释放数组中当前已有数据的最大上界后所有未占用的内存
RemoveAll | 删除数组中所有的元素

元素存取
GetAt | 返回指定下标处的数组元素的值
SetAt | 给数组中指定下标的元素赋值，但不能动态增长数组（指定的下标不能越界）
ElementAt | 返回对数组中某个字节的临时参考
GetData | 允许访问数组中的元素。可以为NULL

数组增长
SetAtGrow | 给数组中指定下标的元素赋值，在下标越界时动态增长数组
Add | 在数组末尾增添一个元素，必要时增长数组
Append | 在数组末尾接上另一个数组，必要时增长数组
Copy | 把另一个数组的内容拷贝到本数组，必要时增长数组

插入/删除
InsertAt | 在指定的下标处插入元素（或另外一个数组的内容）
RemoveAt | 删除指定下标处的一个元素

操作符
operator [] 取指定下标处元素的值，或者给其赋值


 CCachedDataPathProperty

CObject
└CFile
└COleStreamFile
└CMonikerFile
└CAsyncMonikerFile
└CDataPathProperty
└CCachedDataPathProperty

类CCachedDataPathProperty实现了异步传输并在内存文件中缓冲的OLE控件属性。内存文件存储在RAM而不是磁盘中，这有利于快速的临时数据传送。
同CAsyncMonikerFile和CDataPathProperty一样，类CCachedDataPathProperty也支持OLE控件中的异步标识（moniker）功能。采用CCachedDataPathProperty对象可以异步地从一个URL或文件传送数据并通过公有变量m_Cache存在内存文件中。所有的数据都存在内存文件中，如果不需要查看通知和接收方的响应，就不需要覆盖OnDataAvailable。例如，在传送一个大的GIF文件时，想通知控件有新数据到达，并告诉它需要刷新。这时就可以覆盖OnDataAvailable实现这个通知。
类CCachedDataPathProperty是从类CDataPathProperty派生出来的。
要了解有关如何在Internet应用中使用异步标识功能和ActiveX控件的更详细信息，请参阅联机文档“Visual C++程序员指南”中的以下主题：
· | “Internet第一步：ActiceX控件”
· | “Internet第一步：异步标识”
#include <afxctl.h>
请参阅：CDataPathProperty

CCachedDataPathProperty类的成员

数据成员
m_Cache 缓冲数据的CMemFile对象

构造
CCachedDataPathProperty 构造一个CCachedDataPathProperty对象。


 CCachedDataPathProperty::CCachedDataPathProperty

CCachedDataPathProperty( COleControl* pControl = NULL );
CCachedDataPathProperty( LPCTSTR lpszPath, COleControl* pControl = NULL );

参数：
pControl | 与该CCachedDataPathProperty对象相关的ActiveX控件对象指针。
lpszPath | 用于创建参考特性实际绝对位置的异步标识的路径，可能是绝对的或相对的。CDataPathProperty使用URL而不是文件名。如果需要文件的CDataPathProperty对象，可在路径前面附加“file://”。

说明：
构造一个CCachedDataPathProperty对象。
由pControl指向的COleControl对象由Open使用并可被派生的对象获取。
如果pControl为NULL，Open使用的控件应该用SetControl设置。
如果lpszPath为NULL，可以通过Open在路径中传递或者用SetPath设置。


 CCachedDataPathProperty::m_Cache

CMemFile m_Cache;

说明：
缓存数据的内存文件的类名。内存文件存放在RAM而不是磁盘上。

请参阅：CDataPathProperty


 CCheckListBox

CObject
└CCmdTarget
└CWnd
└CListBox
└CCheckListBox

类CCheckListBox实现了Windows复选列表框。复选列表框显示项的一个列表，例如文件名列表。列表中的每项都有一个复选框。
CCheckListBox只用于自定义的控件，列表中不仅仅包含字符串文本。
当然简单的复选列表框可以只有字符串文本和相应的复选框。实际上也可以没有文本。例如可以是一个位图以及相应于复选框的列表。
创建自己的复选列表框，要从类CCheckListBox派生一个子类。然后为它写一个构造函数，并调用成员函数Create。
如果复选列表框是缺省形式的（由左边带有固定大小的复选框的字符串组成），就可以用缺省的CCheckListBox::DrawItem函数绘制复选列表框。否则就要覆盖函数CListBox::CompareItem、CCheckListBox::DrawItem以及CCheckListBox::Meas-ureItem。
可以在对话框模板或程序代码中直接创建一个复选列表框。
#include <afxwin.h>
请参阅：CListBox

CCheckListBox类的成员

构造函数
CCheckListBox | 构造一个CCheckListBox对象
Create | 创建Windows复选列表框并应用到CCheckListBox对象上

属性函数
SetCheckStyle | 设置控件的复选框的风格
GetCheckStyle | 获取控件的复选框的风格
SetCheck | 设置某个项的复选框的状态
GetCheck | 取得某个项的复选框的状态
Enable | 允许或禁止存取某个项
IsEnabled | 检测某个项是否允许存取
OnGetCheckPosition | 由框架调用，取得某个项的复选框的状态

可覆盖的函数
DrawItem | 当自定义的列表框的某个可视属性改变时由框架调用
MeasureItem | 当自定义的列表框的风格改变时由框架调用


 CCheckListBox::CCheckListBox

CCheckListBox( );

说明：
构造一个CCheckListBox对象。
构造一个CCheckListBox需要两步：首先，定义一个从类CCheckListBox派生出来的子类，然后调用函数Create初始化Windows复选列表框并在CCheckListBox对象上应用它。例如：
class CMyCheckListBox : public CCheckListBox
{
DECLARE_DYNAMIC(CMyCheckListBox)
//Constructors

public:
CMyCheckListBox( );
BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );
//...
}

请参阅：CCheckListBox::Create


 CCheckListBox::Create

BOOL Create( DWORD dwStyle, CONST RECT& rect, CWnd* pParentWnd, UINT nID );

返回值：调用成功时返回非零值，否则为0。

参数：
dwStyle | 指定复选列表框的风格。取值为LBS_OWNERDRAWFIXED（列表中的所有项的高度都相同）或LBS_OWNERDRAWVARIABLE（列表中项的高度各不相同）。 这个风格参数可以和别的列表框风格组合使用。
rect | 指定复选列表框的大小和位置。可以是一个CRect对象或者一个RECT结构。
pParentWnd | 指定复选列表框所在的父窗口（通常是一个CDialog对象）。此值不能为NULL。
nID | 指定复选列表框的控制ID号。

说明：
构造一个CCheckListBox对象需要两步：首先，定义一个从类CCheckListBox派生出来的子类，然后调用函数Create初始化Windows复选列表框并在CCheckListBox对象上应用它。参阅CCheckListBox::CCheckListBox的例子。
在执行Create时，Windows向复选列表框控件发送如下消息：WM_NCCREATE、WM_CREATE、WM_NCCALCSIZE和WM_GETMINMAXINFO。
缺省时，这些消息分别由基类CWnd的成员函数OnNcCreate、OnCreate、OnNcCalcSize和OnGetMinMaxInfo处理。要扩展缺省的消息处理功能，可以在派生出的类中加入一个消息映射并覆盖这些消息处理函数。例如，可以覆盖函数OnCreate进行一些初始化工作。
复选列表框上可用的窗口风格有：
· | WS_CHILD | 总是设置
· | WS_VISIBLE | 通常要设置
· | WS_DISABLED | 很少使用
· | WS_VSCROLL | 增加一个垂直滚动条
· | WS_HSCROLL | 增加一个水平滚动条
· | WS_GROUP | 用来成组控件
· | WS_TABSTOP | 允许控件接收制表键焦点

请参阅：CCheckListBox::CCheckListBox


 CCheckListBox::DrawItem

virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );

参数：
lpDrawItemStruct 指向结构DRAWITEMSTRUCT的长指针，该结构中包含了绘制控件所需的信息。

说明：
本函数在自定义的复选列表框的某个可视属性发生改变时，由框架调用。结构DRAWITEMSTRUCT中的成员itemAction和itemState指明了要进行的绘制动作。
缺省时，此函数绘制一个缺省的复选列表框，它由字符串组成，每个字符串的左边都有一个缺省大小的复选框。复选列表框的大小在Create 时指定。
覆盖此函数可以实现对非缺省状态的自定义复选列表框的绘制。例如列表中不是字符串、项的高度各不相同或是复选框不在左边等等。在此成员函数终止之前，应用必须重置所有为lpDrawItemStruct中的显示上下文所选中的GDI对象。
如果复选列表框中项的高度不完全一样，则它的风格（在调用Create时指定）必须为LBS_OWNERVARIABLE，函数MeasureItem也必须覆盖。

请参阅：CCheckListBox::Create, CCheckListBox::MeasureItem


 CCheckListBox::Enable

void Enable( int nIndex, BOOL bEnabled = TRUE );

参数：
nIndex | 允许的复选列表框项的下标。
bEnabled | 指定是否允许存取。

说明：本函数用于设置复选列表框中项的是否允许。

请参阅：CCheckListBox::IsEnabled


 CCheckListBox::GetCheck

int GetCheck( int nIndex );

返回值：
项未选中时返回0，选中时返回1，不确定时返回2。

参数：
nIndex 待检测选中状态的项的下标。

说明：本函数用于检测复选列表框中项的选中状态。

请参阅：
CCheckListBox::OnGetCheckPosition, CCheckListBox::SetCheck, CCheckListBox::SetCheckStyle, CCheckListBox::GetCheckStyle


 CCheckListBox::GetCheckStyle

UINT GetCheckStyle( );

返回值：返回控件的复选框的风格。

说明：
本函数用于取得复选列表框的风格。有关可能出现的风格，请参阅SetCheck Style。

请参阅：
CCheckListBox::OnGetCheckPosition, CCheckListBox::SetCheck, CCheckListBox::SetCheckStyle, CCheckListBox::GetCheck


 CCheckListBox::IsEnabled

BOOL IsEnabled( int nIndex );

返回值：
如果待检测的项被设置为允许存取，则返回非零值。否则为0。

参数：
nIndex 待检测项的下标。

说明：本函数用于检测项是否允许。

请参阅：CCheckListBox::Enable


 CCheckListBox::MeasureItem

virtual void MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct );

参数：
lpMeasureItemStruct 指向结构MEASUREITEMSTRUCT的长指针。

说明：
本函数在创建一个不是缺省设置的复选列表框时由框架调用。
缺省时，本成员函数什么也不做。可以覆盖本函数并填充MEASUREITEMSTRUCT结构以告知Windows复选列表框项的维数。
如果复选列表框是以LBS_OWNERDRAWITEMVARIABLE风格建立的，框架需要为每个项调用本函数。否则，此函数只需调用一次。

请参阅：CCheckListBox::Create, CCheckListBox::DrawItem


 CCheckListBox::OnGetCheckPosition

virtual CRect OnGetCheckPosition( CRect rectItem, CRect rectCheckBox );

返回值：返回某个项的复选框的位置和大小。

参数：
rectItem | 列表项的位置和大小。
rectCheckBox | 项的复选框的缺省位置和大小。

说明：
本函数由框架调用以取得某个项的复选框的位置和大小。
缺省实现只返回复选框的缺省位置和大小（在rectCheckBox中）。缺省时，复选框在项的左上角和它对齐并具有缺省的大小。应用有时可能需要复选框在项的右边，或者要求它大一些或小一些。这时可以覆盖本函数来改变项中的复选框的位置和大小。
例如，下面的函数就覆盖了缺省的实现，把复选框放在项的右边，并使它和项一样高（减去上下各一个像素的位置），并把宽度设为标准复选框的宽度。
CRect CMyCheckListBox::OnGetCheckPosition( CRect rectItem, CRect rectCheckBox )
{
CRect rectCMyCheckBox;
rectCMyCheckBox.top = rectItem.top - 1;
rectCMyCheckBox.bottom = rectItem.bottom - 1;
rectCMyCheckBox.right = rectItem.right - 1;
rectCMyCheckBox.left = rectItem.right - 1 - rectCheckBox.Width( );
return rectCMyCheckBox;
}

请参阅：
CCheckListBox::SetCheck, CCheckListBox::SetCheckStyle, CCheckListBox::GetCheck, CCheckListBox::GetCheckStyle


 CCheckListBox::SetCheck

void SetCheck( int nIndex, int nCheck ) ;

参数：
nIndex | 待设置的复选框所在的项的下标。
nCheck | 复选框的状态。0表示未选中，1表示选中，2表示不确定。

说明：本函数用于设置项的复选框的状态。

请参阅：
CCheckListBox::SetCheckStyle, CCheckListBox::GetCheck, CCheckListBox::GetCheckStyle


 CCheckListBox::SetCheckStyle

void SetCheckStyle( UNIT nStyle );

参数：
nStyle 存放取出的复选列表框中复选框的风格。

说明：
本函数用于设置复选列表框中复选框的风格。风格的有效取值如下：
· | BS_CHECKBOX
· | BS_AUTOCHECKBOX
· | BS_AUTO3STATE
· | BS_3STATE
要了解有关这些风格的更详细信息，请参阅“按钮风格”。

请参阅：
CCheckListBox::SetCheck, CCheckListBox::GetCheck, CCheckListBox::GetCheckStyle


 CClientDC

CObject
└CGdiObject
└CClientDC

类CClientDC派生于CDC，在构造时调用了Windows函数GetDC，在析构时调用了ReleaseDC。这意味着和CClientDC对象相关的设备上下文是窗口的客户区。
要了解有关CClientDC的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“设备上下文”部分。
#include <afxwin.h>

请参阅：CDC

CClientDC类的成员

构造函数
CClientDC 构造一个连接到CWnd上的CClientDC对象

数据成员
m_hWnd CClientDC所在的有效窗口的HWND


 CClientDC::CClientDC

CClientDC( CWnd* pWnd );
throw( CResourceException );

参数：
pWnd 设备上下文将要存取的客户区所在的窗口。

说明：
本函数构造一个CClientDC对象,它将存取pWnd指向的CWnd的客户区。此构造函数调用了Windows函数GetDC。
如果Windows函数GetDC调用失败，则产生一个CResourceException类型的异常。如果Windows已经分配出了所有可用的设备上下文，则没有新的设备上下文可用。无论何时，应用总在竞争使用Windows提供的五个公共显示上下文。


 CClientDC::m_hWnd

说明：
m_hWnd是一个保护的变量，是用来构造m_hWnd对象的CWnd指针的HWND。


 CCmdTarget

CObject
└CCmdTarget

类CCmdTarget是MFC类库中消息映射体系的一个基类。消息映射把命令或消息引导给用户为之编写的响应函数（命令是由菜单项、命令按钮或者加速键产生的消息）。
从CCmdTarget继承来的按键框架类包括：CView、CWinApp、CDocument、CWnd和CFrameWnd。如果想生成一个处理按键消息的类，可以选择其中的一个派生一个子类。很少需要直接从CCmdTarget派生类。
相关的命令目标和OnCmdMsg例程的其它信息，请参阅联机文档“VisualC++程序员指南”中的“命令目标”、“命令路由”和“映射消息”部分。
类CmdTarget包括了处理沙漏形光标显示的成员函数。当某个命令的执行时间比较长时，可以显示沙漏标提示用户命令正在执行。
和消息映射类似，分派映射用于列出OLE自动的IDispatch功能。列出这个接口后，其它的应用（如VB）就能调用这个应用了。有关IDispatch接口的更详细的信息，请参阅“Win32 SDK OLE程序员参考”中的“创建IDPatch接口”和“分派接口与API函数”。
#include <afxwin.h>

请参阅：
CCmdUI, CDocument, CDocTemplate, CWinApp, CWnd, CView, CFrameWnd, COleDispatchDriver

CCmdTarget类的成员

属性
FromIDispatch | 返回一个指向CCmdTarget对象的指针，该对象与IDispatch相联系
GetIDispatch | 返回一个指向IDispatch对象的指针，该对象与CCmdTarget对象相关
IsResultExpected | 如果自动函数要返回一个值，则返回非零值

操作
BeginWaitCursor | 显示沙漏标
EnableAutomation | 允许CCmdTarget对象的OLE自动函数
EndWaitCursor | 返回到前一个光标
RestoreWaitCursor | 重置沙漏标

可覆盖的函数
OnCmdMsg | 分派命令消息
OnFinalRelease | 在最后一个OLE对象参考被释放时清除环境


 CCmdTarget::BeginWaitCursor

void BeginWaitCursor( );

说明：
本函数用于显示沙漏标（通常在命令执行时间较长时采用）。框架调用本函数显示沙漏标，告诉用户系统忙，例如在加载一个CDocument对象或把它保存到文件时。
在不是处理单个消息时，BeginWaitCursor可能不象其它函数那样有效，例如OnSetCursor的处理也能改变光标形状。调用函数EndWaitCursor可以恢复此前的光标。

示例：
//The following example illustrates the most common case
//of displaying the hourglass cursor during some lengthy
//processing of a command handler implemented in some
//CCmdTaget-derived class,such as a document or view.
void CMyView::OnSomeCommand( )
{
BeginWaitCursor( ); //display the hourglass cursor

//do some lengthy processing

EndWaitCursor( ); //remove the hourglass cursor
}

//The next example illustrates RestoreWaitCursor
void CMyView::OnSomeCommand( )
{
BeginWaitCursor( ); //display the hourglass cursor

//do some lengthy processing
// The dialog box will normally change the cursor to
// the standard arrow cursor,and leave the cursor in
// as the standard arrow cursor when the dialog box is
//closed.
CMyDialog dlg;
dlg.DoModal( );

// It is necessary to call RestoreWaitCursor here in order
// to change the cursor back to the hourglass cursor.
RestoreWaitCursor( );
// do some more lengthy processing
EndWaitCursor( ); //remove the hourglass cursor
}

// In the above example,the dialog was clearly invoked between
// the pair of calls to BeginWaitCursor and EndWaitCursor.
// Sometimes it may not be clear whether the dialog is invoked
// in between a pair of calls to BeginWaitCursor and EndWaitCursor.
// It is permissable to call RestoreWaitCursor,even if
// BeginWaitCursor was not previously called.This case is
// illustrated below,where CMyView::AnotherFunction does not
// need to know whether it was called in the context of an
// hourglass cursor.
void CMyView::AnotherFunction( )
{
// some processing...
MyDialog dlg;
dlg.DoModal( );
RestoreWaitCursor( );

//some more processing
}

// If the dialog is invoked from a member function of
// some non-CCmdTarget,the you call CWinApp::DoWaitCursor
// with a 0 parameter value to restore the hourglass cursor.
void CMyObject::AnotherFunction( )
{
CMyDialog dlg;
dlg.DoModal( );
AfxGetApp( )->DoWaitCursor(0); //same as CCmdTarget::RestoreWaitCursor
}

请参阅：
CWaitCursor, CCmdTarget::EndWaitCursor, CCmdTarget::RestoreWaitCursor, CWinApp::DoWaitCursor


 CCmdTarget::EnableAutomation

void EnableAutomation( );

说明：
本函数设置对象的OLE自动功能。一般在对象的构造函数里调用。调用时要保证已经为类声明了分派映射。有关自动功能的更详细信息，请参阅联机文档“Visual C++程序员指南”中的“自动客户”和“自动服务器”。

请参阅：DECLARE_DISPATCH_MAP, DECLARE_OLECREATE


 CCmdTarget::EndWaitCursor

void EndWaitCursor( );

说明：
本函数在BeginWaitCursor之后调用。它用于撤消沙漏标，并恢复以前的光标。框架在调用沙漏标之后也调用本函数。

示例：
// The following example illustrates the most common case
// of displaying the hourglass cursor during some lengthy
// processing of a command handler implemented in some
// CCmdTarget-derived class,such as a document or view.
void CMyView::OnSomeCommand( )
{
BeginWaitCursor( ); // display the hourglass cursor

// do some lengthy processing

EndWaitCursor( ); // remove the hourglass cursor
}
// The next example illustrates RestoreWaitCursor
void CMyView::OnSomeCommand( )
{
BeginWaitCursor( ); // display the hourglass cursor

// do some lengthy processing

// The dialog box will normally change the cursor to
// the standard arrow cursor,and leave the cursor in
// as the standard arrow cursor when the dialog box is
// closed.
CMyDialog dlg;
dlg.DoModal( );

// It is necessary to call RestoreWaitCursor here in order
// to change the cursor back to the hourglass cursor.
RestoreWaitCursor( );

// do some more lengthy processing

EndWaitCursor( ); // remove the hourglass cursor
}

// In the above example,the dialog was clearly invoked between
// the pair of calls to BeginWaitCursor and EndWaitCursor.
// Sometimes it may not be clear whether the dialog is invoked
// in between a pair of calls to BeginWaitCursor and EndWaitCursor.
// It is permissable to call RestoreWaitCursor,even if
// BeginWaitCursor was not previously called.This case is
// illustrated below,where CMyView::AnotherFunction does not
// need to know whether it was called in the context of an
// hourglass cursor.
void CMyView::AnotherFunction( )
{
// some processing...
MyDialog dlg;
dlg.DoModal( );
RestoreWaitCursor( );

// some more processing ...
}
// If the dialog is invoked from a member function of
// some non-CCmdTarget,the you call CWinApp::DoWaitCursor
// with a 0 parameter value to restore the hourglass cursor.
void CMyObject::AnotherFunction( )
{
CMyDialog dlg;
dlg.DoModal( );
AfxGetApp( )->DoWaitCursor(0); // same as CCmdTarget::RestorWaitCursor
}

请参阅：
CWaitCursor, CCmdTarget::BeginWaitCursor, CCmdTarget::RestoreWaitCursor, CWinApp::DoWaitCursor


 CCmdTarget::FromIDispatch

static CCmdTarget* FromIDispatch( LPDISPATCH lpDispatch );

返回值：
返回一个和lpDistpatch相关的CCmdTarget对象的指针。如果该IDistpatch对象不是一个MFC IDistpatch对象，则返回NULL。

参数：
lpDispatch 指向IDistpatch对象的指针。

说明：
本函数把从类的自动成员函数中得到的一个IDistpatch指针映射到一个实现了IDistpatch对象接口的CCmdTarget对象。
函数的结果与调用函数GetIDispatch的结果相反。

请参阅：CCmdTarget::GetIDispatch, COleDispatchDriver


 CCmdTarget::GetIDispatch

LPDISPATCH GetIDispatch( BOOL bAddRef );

返回值：返回一个和该对象相关的IDistpatch指针。

参数：
bAddRef 指明是否增加对该对象的参考记数。

说明：
本成员函数用于检索一个自动方法的IDistpatch指针，该自动方法返回一个IDistpatch指针或参考一个IDistpatch指针。
对于那些在构造函数中调用了EnableAutomation的对象，本函数使它们自动激活，并返回一个指向IDistpatch在MFC中的实现的指针。该IDistpatch被那些通过IDistpatch接口通信的客户所使用。本函数的调用自动增加一个对该指针的参考，因而不需要调用IUnknow::AddRef。

请参阅：
CCmdTarget::EnableAutomation, COleDispatchDriver, IUnknow::Release


 CCmdTarget::IsResultExpected

BOOL IsResultExpected( );

返回值：如果自动函数要返回一个值，则返回非零值。否则为0。

说明：
本函数确定客户是否期待从它对自动函数的调用中返回一个值。OLE接口告诉MFC客户是使用了还是忽略了调用返回值。MFC则使用这些信息决定IsResultExpected的返回值。如果返回值的计算比较耗费时间或其它资源，可以在计算返回值之前调用本函数以提高效率。
本函数只返回一次0，这样，如果在一个已被客户端调用的自动函数中调用了其它的自动函数，就可以获得有效的返回值。
如果在没有进行自动函数调用时调用本函数，将返回非零值。

请参阅：
CCmdTarget::GetIDispatch, CCmdTarget::EnableAutomation


 CCmdTarget::OnCmdMsg

virtual BOOL OnCmdMsg(
UINT nID,
int nCode,
void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo
);

返回值：如果消息被处理了，则返回非零值；否则为0。

参数：
nID | 命令的ID。
nCode | 命令的通知代码。
pExtra | 根据nCode的值使用。
pHandlerInfo | 如果非空，OnCmdMsg将填充pHandlerInfo 结构的pTarget和pmf成员，而不是分派该命令。此参数通常为NULL。

说明：
本函数由框架来调用，它分派命令并处理那些提供了命令用户接口的对象的更新。这是框架的命令体系中实现的一个主要例程。
在运行时，OnCmdMsg把命令分派到其它对象上或者调用CCmdTarget::OnCmdMsg（此函数进行真正的消息映射查找）自己处理命令。有关这个缺省命令例程的完整描述，请参阅联机文档“Visual C++程序员指南”中的“消息处理”和“映射主题”部分。
偶尔需要覆盖本函数以扩展MFC框架的标准命令例程。有关命令例程体系中的更多细节，请参阅联机文档中的“技术指南21”。

示例：
//This example illustrates extending the framework's standard command
//route from the view to objects managed by the view. This example
//is from an object-oriented drawing application, similar to the
//DRAWCLI sample application, which draws and edits "shapes".
BOOL CMyView::OnCmdMsg(UINT nID, int nCode, void* pExtra,
AFX_CMDHANDLERINFO* pHandlerInfo )
{
//Extend the framework's command route from the view to
//the application-specific CMyShape that is currently selected.
//in the view. m_pActiveShape is NULL if no shape object
//is currently selected in the view.
if( (m_pActiveShape!=NULL)&&
m_pActiveShape->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo
) )
return TRUE;

//If the object(s) in the extended command route don't handle
//the command, then let the base class OnCmdMsg handle it.
return CView::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo );
}

//The command handler for ID_SHAPE_COLOR (menu command used to change
//the color of the currently selected shape ) was added to
//the message map of CMyShape (note, not CMyView ) using ClassWizzard.
//The menu item will be automatically enabled or disabled, depending
//on whether a CMyShape is currently selected in the view, that is
//depending on whether CMyView::m_pActiveView is NULL. It is not
//necessary to implement an ON_UPDATE_COMMAND_UI handler to enable
//or disable the menu item.
BEGIN_MESSAGE_MAP( CMyShape, CCmdTarget )
//{{AFX_MSG_MAP( CMyShape )
ON_COMMAND( ID_SHAPE_COLOR, OnShapeColor )
//}}AFX_MSG_MAP( )
END_MESSAGE_MAP( )

请参阅：CCmdUI


 CCmdTarget::OnFinalRelease

virtual void OnFinalRelease( );

说明：
本函数在对对象的最后一个OLE参考或对象对别人的后一个OLE参考被释放时，由框架调用。可以覆盖它以进行所需的处理。缺省的实现是删除该对象。

请参阅：COleServerItem


 CCmdTarget::RestoreWaitCursor

void RestoreWaitCursor( );

说明：
本函数用于在系统光标改变后重置沙漏标（例如，在一个耗时操作的过程中打开一个消息窗口而后又关闭它。）

示例：
// The following example illustrates the most common case
// of displaying the hourglass cursor during some lengthy
// processing of a command handler implemented in some
// CCmdTarget-derived class,such as a document or view.
void CMyView::OnSomeCommand( )
{
BeginWaitCursor( ); // display the hourglass cursor

// do some lengthy processing

EndWaitCursor( ); // remove the hourglass cursor
}

// The next example illustrates RestoreWaitCursor
void CMyView::OnSomeCommand( )
{
BeginWaitCursor( ); // display the hourglass cursor

// do some lengthy processing
// The dialog box will normally change the cursor to
// the standard arrow cursor,and leave the cursor in
// as the standard arrow cursor when the dialog box is
// closed.
CMyDialog dlg;
dlg.DoModal( );

// It is necessary to call RestoreWaitCursor here in order
// to change the cursor back to the hourglass cursor.
RestoreWaitCursor( );
// do some more lengthy processing
EndWaitCursor( ); // remove the hourglass cursor
}

// In the above example,the dialog was clearly invoked between
// the pair of calls to BeginWaitCursor and EndWaitCursor.
// Sometimes it may not be clear whether the dialog is invoked
// in between a pair of calls to BeginWaitCursor and EndWaitCursor.
// It is permissable to call RestoreWaitCursor,even if
// BeginWaitCursor was not previously called.This case is
// illustrated below,where CMyView::AnotherFunction does not
// need to know whether it was called in the context of an
// hourglass cursor.
void CMyView::AnotherFunction( )
{
// some processing...
CMyDialog dlg;
dlg.DoModal( );
RestoreWaitCursor( );

// some more processing...
}

// If the dialog is invoked from a member function of
// some non-CCmdTarget,the you call CWinApp::DoWaitCursor
// with a 0 parameter value to restore the hourglass cursor.
void CMyObject::AnotherFunction( )
{
CMyDialog dlg;
dlg.DoModal( );
AfxGetApp( )->DoWaitCursor(0); // same as CCmdTarget::RestorWaitCursor
}

请参阅：
CWaitCursor, CCmdTarget::EndWaitCursor, CCmdTarget::BeginWaitCursor, CWinApp::DoWaitCursor


 CCmdUI

CCmdUI没有基类。
它仅在一个CCmdTarget派生类的ON_UPDATE_COMMAND_UI处理程序中使用。
当用户在应用的下拉菜单时，要确定每个菜单项的显示状态——允许存取或禁止存取。菜单命令的目标通过实现一个ON_UPDATE_COMMAND_UI处理来提供这些信息。可以使用ClassWizard来浏览定位应用中的命令用户接口对象，然后为它建立一个消息映射入口，并为每个消息处理函数提供函数原型。
当菜单被下拉时，框架搜索并调用每个ON_UPDATE_COMMAND_UI处理，每个处理调用Enable和Check之类的成员函数，相应地，框架就可以正确地显示每个菜单项了。
菜单项可以用控件条按钮或者其它的命令用户接口对象替换，而在ON_UPDATE_COMMAND_UI处理中的代码不需要改动。
下表列出了各种命令用户接口上的CCmdGUI的成员函数。
用户接口项 | Enable | SetCheck | SetRadio | SetText
菜单项 | 允许或禁止存取该项 | 选中(ⅹ)或未选中 | 选中（有黑点） | 设置项的文本
工具条按钮 | 允许或禁止存取该项 | 选中、未选中或不定 | （不可用） | 与SetChec相同
状态条状态提示 | 文本可见或不可见 | 设置凸出或正常边框 | 与SetCheck相同 | 设置状态条的提示文本
CDialogBar中的普通按钮 | 允许或禁止存取该项 | 复选框选中或未选中 | 与SetCheck相同 | 设置按钮的文本
CDialogBar中的普通按钮 | 允许或禁止存取该项 | （不可用） | （不可用） | 设置窗口中的文本
有关使用类CCmdGUI的更详细信息，请参阅联机文档“Visual C++教程”中的“构造用户界面”部分和联机文档“Visual C++程序员指南”中的“如何更新用户界面对象”部分。
#include <afxwin.h>

请参阅：CCmdTarget

CCmdUI类的成员

数据成员
m_nID | 用户接口对象的ID
m_nIndex | 用户接口对象的下标
m_pMenu | 指向CCmdUI对象代表的菜单
m_pSubMenu | 指向CCmdUI对象代表的菜单的子菜单
m_pOther | 指向发送通知的窗口对象

操作
Enable | 允许或禁止本命令存取用户接口对象
SetCheck | 为本命令设置用户接口对象的选中状态
SetRadio | 与成员函数SetCheck类似，作用于单选钮组
SetText | 为本命令设置用户接口对象的文本
ContinueRouting | 通知命令路由机制继续沿处理链传送当前消息


 CCmdUI::ContinueRouting

void ContinueRouting( );

说明：
本函数通知路由机制继续沿处理链传送当前消息。
本函数应该和一个返回FALSE的ON_COMMAND_EX处理函数联合使用。有关更详细的信息，请参阅“技术指南21”。


 CCmdUI::Enable

virtual void Enable( BOOL bOn = TRUE );

参数：
bOn 如果为TRUE，则把该项设置为允许存取；为FALSE，则设置为禁止存取。

说明：本函数用来设置一个命令是否可以存取用户接口项。

请参阅：CCmdUI::SetCheck


 CCmdUI::SetCheck

virtual void SetCheck( int nCheck = 1 );

参数：
nCheck 指定要设置的选中状态。0表示设置为未选中状态，1表示选中，2表示不确定。

说明：
本函数为命令设置用户接口项相应的选中状态。它对菜单项和工具条按钮起作用。不确定状态只适用于工具条按钮。

请参阅：CCmdUI::SetRadio


 CCmdUI::SetRadio

virtual void SetRadio( BOOL bOn = TRUE );

参数：
bOn 如果为TRUE，则把项设置为允许存取；为FALSE，则设置为禁止存取。

说明：
本函数用于为命令设置用户接口项的状态。作用类似于SetCheck，但对单选钮组中的成员起作用。不会自动清除组中其它项的选中状态，除非这些项自己维护了组的行为。

请参阅：CCmdUI::SetCheck


 CCmdUI::SetText

virtual void SetText( LPCTSTR lpszText );

参数：
lpszText 指向字符串的指针。

说明：本函数为命令设置用户接口项中的文本。

请参阅：CCmdUI::Enable


 CCmdUI::m_nID

说明：
m_nID是由CCmdUI对象代表的菜单项、工具条或者其它用户接口对象的ID。


 CCmdUI::m_nIndex

说明：
m_nIndex是由CCmdUI对象代表的菜单项、工具条或者其它用户接口对象的下标。


 CCmdUI::m_pMenu

说明：
m_pMenu指向由CCmdUI对象代表的菜单指针（类型为CMenu）。如果此项不是菜单，则设置为NULL。

请参阅：CMenu


 CCmdUI::m_pOther

说明：
m_pOther是一个指向工具条、状态条等发送通知的窗口对象的指针(CWnd类型)。如果项是菜单或不是CWnd对象，则为NULL。

请参阅：CWnd


 CCmdUI::m_pSubMenu

说明：
m_pSubMenu指向由CCmdUI对象代表的菜单的子菜单指针（类型为CMenu）。如果项不是菜单，则设置为NULL。如果子菜单是弹出式的，m_nID包含了弹出菜单中的第一项。
要了解有关更详细的信息，请参阅“技术指南21”。

请参阅：CMenu


 CColorDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog
└CColorDialog

类CColorDialog支持在应用中使用颜色选择对话框。CColorDialog对象是一个拥有一个颜色列表的对话框。用户可以在列表中选择一种颜色，也可以定制颜色，在退出该对话框时，向应用告知选中的颜色。
构造一个CColorDialog对象可以使用类中的构造函数，也可以从类CColorDialog派生一个子类，然后定义自己的构造函数。
在构造了CColorDialog对象后，可以设置或者修改m_cc结构中的任一个值以初始化对话框控件的值。m_cc是一个CHOOSECOLOR类型的结构。
初始化对话框控件之后，就可以调用成员函数DoModal来显示对话框并允许用户选择颜色了。DoModal返回用户对按钮OK或Cancel的选择（返回值依次为IDOK，IDCANCEL）。
如果DoModal返回了IDOK，则可以调用CColorDialog的一个成员函数来检索用户选择的颜色信息。
可以使用Windows函数CommDlgExtendedError来检测对话框初始化时是否发生了错误，并取得错误的相关信息。
类CColorDialog需要使用Windows3.1或更高版本提供的COMMDLG.DLL文件。
定制对话框，可以从CColorDialog派生一个子类，提供一个定制的对话框模板，并增加一个消息映射来处理扩展的控件发来的通知。所有悬挂的消息将被送到基类。
不需要定制钩子函数。
注意：
在某些版本中，如果在框架中使其它的CDialog对象变灰色，CColorDialog对象将不会以灰色背景显示。
要了解有关使用类CColorDialog的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“通用对话框类”部分。
#include <afxdlgs.h>

CColorDialog类的成员

数据成员
m_cc 用于定制对话框设置的一个结构

构造函数
CColorDialog 构造一个CColorDialog对象

操作
DoModal | 显示对话框，并接收用户的选择
GetColor | 返回一个包含了选中的颜色的值的COLORREF结构
GetSavedCustomColors | 检索用户定制的颜色
SetCurrentColor | 设置当前选中的颜色

可覆盖的函数
OnColorOK 覆盖它来检验对话框中输入颜色的有效性


 CColorDialog::CColorDialog

CColorDialog( COLORREF clrInit = 0, DWORD dwFlags = 0, CWnd* pParentWnd = NULL );

参数：
clrInit | 缺省时选择的颜色。如果没有设置，缺省为RGB（0，0，0）（黑色）。
dwFlags | 定制函数和对话框外观的一组标志。要了解更详细的信息，请参阅联机文档“Win32 SDK”中的COLORREF结构。
pParentWnd | 指向对话框的父窗口或者所有者窗口的指针。

说明：本函数构造一个CColorDialog对象。

请参阅：CDialog::DoModal


 CColorDialog::DoModal

virtual int DoModal( );

返回值：
IDOK或者IDCANCEL。如果返回了IDCANCEL，则可以调用Windows函数CommDlgExtendedError来检测是否发生了错误。

说明：
本函数用于显示Windows通用颜色对话框并接收用户的选择。
如果想通过设置m_cc结构的各个成员来初始化不同的颜色对话框，应在对话框对象构造之后，调用DoModal之前进行。
在调用DoModal之后，可以调用其它的成员函数检索设置信息和用户输入的信息。

请参阅：CDialog::DoModal, CColorDialog::CColorDialog


 CColorDialog::GetColor

COLORREF GetColor( ) const;

返回值：
返回一个COLORREF结构，其中包含了对话框中选中的颜色的RGB颜色值。

说明：
本函数用于检索用户在对话框中选中的颜色。必须在DoModal之后调用。

请参阅：CColorDialog::SetCurrentColor


 CColorDialog::GetSavedCustomColors

static COLORREF* GetSavedCustomColors( );

返回值：
返回一个指向有16成员的RGB颜色数组的指针，数组中记录了用户定义的颜色。

说明：
CColorDialog对象最多允许用户建立16种自定义颜色。成员函数GetSaved CustomColors提供了对这些颜色的存取。在DoModal调用返回IDOK后可以检索这些信息。
返回的数组中的每个RGB值都被初始化为RGB（255，255，255）（白色）。用户选中的自定义颜色仅在同一应用中对话框的两次激活之间保存。如果想在应用运行后还保存这些颜色，就必须采用别的方法（例如放在一个.INI文件中）。

请参阅：CColorDialog::GetColor


 CColorDialog::OnColorOK

virtual BOOL OnColorOK( );

返回值：
如果不应撤消对话框，则返回非零值。否则为0以备以后接收选中的颜色。

说明：
如果想提供对对话框中输入的颜色的有效性检查，可以覆盖此函数。可以用本函数拒绝用户在通用颜色对话框中输入的颜色。通常不需要使用此函数，因为框架已提供了对颜色的缺省的有效性检查。
可以调用成员函数GetColor取得选中的颜色的RGB值。
如果返回0，则仍然显示该对话框，等待用户输入文件名。


 CColorDialog::SetCurrentColor

void SetCurrentColor( COLORREF clr);

参数：
clr 一个RGB颜色值。

说明：
本函数在调用DoModal之后调用，把选中的颜色设置为clr指定的RGB值。一般在一个消息处理过程中或者OnColorOK中调用。对话框将自动地根据参数clr的值改变选中的颜色。

请参阅：CColorDialog::GetColor, CColorDialog::OnColorOK


 CColorDialog::m_cc

CHOOSECOLOR m_cc

说明：
m_cc是一个CHOOSECOLOR类型的结构，它的成员记录了对话框的特性和值。在构造一个CColorDialog对象之后调用DoModal之前，可以使用m_cc设置对话框的属性。


 CComboBox

CObject
└CCmdTarget
└CWnd
└CComboBox

类CComboBox封装了Windows组合框。组合框由一个列表框和一个静态控件（或编辑控件）组成。列表框部分可以是一直显示的，也可以是隐藏的，在用户单击编辑控件边上的按钮（下拉箭头）时下拉该列表框。列表框中当前选中的项（如果有的话）显示在静态控件或编辑控件中。如果组合框带有下拉风格，则当用户在编辑框中输入列表项的开始字符时，对应项（如果有的话）中的第一个将会加亮显示。
下表列出了组合框的三种风格：
风格 | 列表框何时可见 | 静态控件还是编辑控件
Simple | 总是可见 | 编辑控件
Drop-down | 当用户单击控件边上的下拉箭头时 | 编辑控件
Drop-downlist | 当用户单击控件边上的下拉箭头时 | 静态控件

可以从对话框模板中建立一个CComboBox对象，也可以直接在代码中创建。无论采用哪种方法，都要先调用CComboBox的构造函数构造一个CComboBox对象，然后调用成员函数Create创建控件并在CComboBox对象上应用它。
消息映射入口的格式如下：
ON_Notification( id, memberFxn )
其中id指定了发送通知的组合框控件的子窗口ID，而memberFxn是用于处理该通知的父成员函数的名字。
父窗口的函数原型的格式如下:
afx_msg void memberFxn( );
通知发送的次序是不能预先确定的。例如，通知CBN_SELCHANGE既可能在CBN_CLOSEUP之前也可能在它之后出现。
可能的消息映射入口如下：
· | ON_CBN_CLOSEUP | (Windows 3.1及更高版本)组合框的列表已被关闭。对于风格为CBS_SIMPLE的组合框来说，不会发送该通知消息。
· | ON_CBN_DBCLICK | 用户双击了列表框中的一个字符串。只对风格为CBS_SIMPLE的组合框发送。对于风格为CBS_DROPDOWN或CBS_DROPDOWNLIST的组合框来说，不会出现双击的消息，因为一次单击就会使下拉列表隐藏或显示了。
· | ON_CBN_DROPDOWN | 下拉出下拉列表（变为可见）。只对风格为CBS_DROPDOWN或CBS_DROPDOWNLIST的组合框起作用。
· | ON_CBN_EDITCHANGE | 用户发出了一个可能改变编辑控件中文本的动作。与消息CBN_EDITUPDATE不同，本消息是在Windows刷新屏幕之后发出的。风格为CBS_DROPDOWNLIST的组合框没有该通知。
· | ON_CBN_EDITUPDATE | 编辑控件部分将显示变化了的文本。本通知消息在控件已经格式化了文本但没有显示时发送。风格为CBS_DROPDOWNLIST的组合框没有该通知。
· | ON_CBN_ERRSPACE | 不能为组合框分配足够的内存进行响应某个请求。
· | ON_CBN_SELENDCANCEL | (Wndows 3.1及更高版本)表明用户的选择将被忽略。用户在单击了一个项之后，又单击了另外一个窗口或控件隐藏了组合框的下拉列表。此通知消息在CBN_CLOSEUP消息之前发送，以表明用户的选择将被忽略。即使没有发送CBN_CLOSEUP通知消息，也会发送CBN_SELENDCANCEL或CBN_SELENDOK消息（例如风格为CBS_SIMPLE的组合框）。
· | ON_CBN_SELENDOK | 用户在选择了一项以后，要么按了ENTER键，要么按了向下箭头键，从而隐藏了组合框的列表。此通知消息在CBN_CLOSEUP之前发送，表明用户的选择将不被认为是有效的。即使没有发送CBN_CLOSEUP通知消息，也会发送CBN_SELENDCANCEL或CBN_SEL-ENDOK消息（例如风格为CBS_SIMPLE的组合框）。
· | ON_CBN_KILLFOCUS | 组合框将失去输入焦点。
· | ON_CBN_SELCHANGE | 用户在列表中单击或者利用箭头键选择了另一个项，从而引起了选中项的改变。在处理此消息时，编辑控件中的文本只能通过GetLBText或者类似的某个函数存取。不能使用GetWindowText函数。
· | ON_CBN_SETFOCUS | 组合框获得输入焦点。
如果在对话框中创建了一个CComboBox对象，在关闭对话框时该CComboBox对象将自动撤消。
如果在另外一个窗口对象中嵌入了一个CComboBox对象，不需要显式地撤消它。如果在堆栈中创建了一个CComboBox对象，它也会被自动地撤消。如果采用new在内存堆中创建了一个CComboBox对象，则必须调用delete来撤消它。
#include <afxwin.h>

请参阅：
CWnd, CButton, CEdit, CListBox, CScrollBar, CStatic, CDialog

CComboBox类的成员

构造函数
CComboBox 构造一个CComboBox对象

初始化函数
Create | 创建一个组合框并应用到CComboBox对象上
InitStorage | 预先为组合框的列表框中的项和字符串分配内存

通用操作
GetCount | 取得组合框的列表框中项的个数
GetCurSel | 取得组合框的列表框中当前选中项（如果有的话）的下标
SetCurSel | 在组合框的列表框中选择一个字符串
GetEditSel | 取得组合框的编辑控件中当前选项的起止字符位置
SetEditSel | 选中组合框的编辑控件中的字符
SetItemData | 设置组合框中指定项的32位值
SetItemDataPtr | 把组合框中指定项的32位值设置成一个指定的void型指针
GetItemData | 检索应用为组合框的项提供的32位值
GetItemDataPtr | 检索应用为组合框的项提供的32位值，返回一个void型指针
GetTopIndex | 返回组合框中列表框的第一个可见项的下标
SetTopIndex | 让组合框的列表框显示指定下标所在的项
SetHorizontalExtent | 设置组合框中列表框的水平宽度（以像素为单位），如果列表超过该宽度，将需要用滚动条
GetHorizontalExtent | 返回组合框中列表框的水平宽度（以像素为单位）
SetDroppedWidth | 设置组合框中下拉列表允许的最小宽度
GetDroppedWidth | 返回组合框中下拉列表允许的最小宽度
Clear | 删除编辑控件中的当前选择（如果有的话）
Copy | 以CF_TEXT格式拷贝编辑控件中的当前选择（如果有的话）到剪贴板
Cut | 删除编辑控件中的选择项（如果有的话），并把删除的内容以CF_TEXT格式拷贝到剪贴板
Paste | 在编辑控件中的当前位置粘贴剪贴板中的内容。仅当剪贴板中的数据是CF_TEXT格式的才会真正插入
LimitText | 设置用户可以在组合框的编辑控件中输入的文本的最大长度
SetItemHeight | 设置组合宽中列表框的项的高度或编辑控件（或静态控件）中文本的高度
GetItemHeight | 取得组合框中列表项的高度
GetLBText | 从组合框的列表框中取得一个字符串
GetLBTextLen | 取得组合框的列表框中某个字符串的长度
ShowDropDown | 显示或者隐藏风格为CBS_DROPDOWN或CBS_DROPDOWNLIST的组合框的列表框
GetDroppedControlRect | 取得组合框中可见（已经下拉）的列表框的屏幕坐标
GetDroppedState | 检测组合框的列表框是否可见（是否已经下拉）
SetExtendedUI | 选择风格为CBS_DROPDOWN或CBS_DROPDOWNLIST的组合框中的列表框的缺省用户接口或扩展用户接口
GetExtendedUI | 检测组合框的用户接口是缺省的还是扩展的
GetLocale | 取得组合框的定位标记
SetLocale | 设置组合框的定位标记

字符串操作
AddString | 在组合框的列表框的列表末尾添加一个字符串，或在具有CBS_SORT风格的的列表框中按次序所在的位置插入一个字符串
DeleteString | 删除组合框中的列表框中的一个字符串
InsertString | 在组合框的列表框中插入一个字符串
ResetContent | 删除组合框的列表框和编辑控件中的所有项
Dir | 在组合框的列表框中添加文件名的列表
FindString | 在组合框的列表框中查找具有指定前缀的第一个字符串
FindStringExact | 在组合框的列表框中查找具有与指定字符串完全匹配的第一个字符串
SelectString | 在组合框的列表框中查找字符串，找到后选中它，并把它拷贝到编辑控件中

可覆盖的函数
DrawItem | 当自定义的组合框的某个可视特性改变时，由主程序调用
MeasureItem | 当创建一个自定义的组合框时，由主程序调用以检测组合框的维数
CompareItem | 由主程序调用以检测在有序的自定义组合框中新项所在的位置
DeleteItem | 从自定义的组合框中删除一个列表项时，由主程序调用


 CComboBox::AddString

int AddString( LPCTSTR lpszString );

返回值：
返回值大于等于0时，是列表中项的下标。出错时，返回CB_ERROR，没有足够的空间存放新的字符串时返回CB_ERRSPACE。

参数：
lpszString 指向将要添加的字符串（以null结尾）的指针。

说明：
本函数在组合框中的列表框中添加一个字符串。如果列表框的风格不是CBS_SORT的，则在列表的末尾添加该字符串。否则，该字符串按照排序的次序插入到列表中。
在列表的指定位置插入一项，需使用成员函数InsertString。

请参阅：
CComboBox::InsertString, CComboBox::DeleteString, CB_ADDSTRING


 CComboBox::CComboBox

CComboBox( );

说明：本函数构造一个CComboBox对象。

请参阅：CComboBox::Create


 CComboBox::Clear

void Clear( );

说明：
删除组合框的编辑控件的当前选择（如果有的话）。
要想删除当前的选择并把它放到剪贴板中，请使用成员函数Cut。

请参阅：
CComboBox::Copy, CComboBox::Cut, CComboBox::Paste, WM_CLEAR


 CComboBox::CompareItem

virtual int CompareItem( LPCOMPAREITEMSTRUCT lpCompareItemStruct );

返回值：
返回LPCOMPAREITEMSTRUCT结构中描述的两个项的相对位置。可能的取值为：
返回值 | 含义
-1 | 项1排在项2之前
0 | 项1与项2排在同一位置
1 | 项1排在项2之后
有关结构LPCOMPAREITEMSTRUCT的说明，请参阅CWnd::OnCompareItem。

参数：
lpCompareItemStruct 指向一个LPCOMPAREITEMSTRUCT结构的长指针。

说明：
本函数由框架调用，可取得排序的自定义组合框中列表框中某个新项的相对位置。缺省时，此函数什么也不做。如果用LBS_SORT风格建立了一个自定义的组合框，就必须覆盖此函数来处理对新加入到列表的项的排序。

请参阅：
WM_COMPAREITEM, CComboBox::DrawItem, CComboBox::MeasureItem, CComboBox::DeleteItem


 CComboBox::Copy

void Copy( );

说明：
把组合框中编辑控件中的选择项（如果有的话）以CF_TEXT格式拷贝到剪贴板。

请参阅：
CComboBox::Clear, CComboBox::Cut, CComboBox::Paste, WM_COPY


 CComboBox::Create

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

返回值：调用成功时，返回非零值，否则为0。

参数：
dwStyle | 指定组合框的风格。可在组合框上应用各种组合框风格的组合。
rect | 设置组合框的位置和大小。可以是RECT结构或CRect对象。
pParentWnd | 指定组合框所在的父窗口（通常是CDialog类型的）。不能为NULL。
nID | 指定组合框的控制ID号。

说明：
构造一个CComboBox对象需要两步：首先调用构造函数，然后调用Create创建Windows组合框并与该CComboBox对象相联系。
在执行Create时，Windows向组合框发送以下消息：WM_NCCREATE、WM_CREATE、WM_NCCALCSIZE和WM_GETMINMAXINFO。
缺省时，这些消息分别由基类CWnd的成员函数OnNcCreate、OnCreate、OnNcCaclSize和OnGetMinMaxInfo处理。要扩展缺省的消息处理功能，可以在CComboBox的派生类中加入一个消息映射并覆盖这些消息处理函数。例如，可以覆盖函数OnCreate进行新类的初始化工作。
组合框控件上可用的窗口风格有：
· | WS_CHILD | 总是设置
· | WS_VISIBLE | 通常要设置
· | WS_DISABLED | 很少使用
· | WS_VSCROLL | 增加一个垂直滚动条
· | WS_HSCROLL | 增加一个水平滚动条
· | WS_GROUP | 用来成组控件
· | WS_TABSTOP | 组合框按制表键次序排列

请参阅：CComboBox::CComboBox, 组合框风格


 CComboBox::Cut

void Cut( );

说明：
本函数删除组合框中编辑控件中当前选中的内容（如果有的话），然后以CF_TEXT格式拷贝到剪贴板。
如果仅仅删除组合框中编辑控件中当前选中的内容而不拷贝到剪贴板中，可调用成员函数Clear。

请参阅：
CComboBox::Clear, CComboBox::Copy, CComboBox::Paste, WM_CUT


 CComboBox::DeleteItem

virtual void DeleteItem( LPDELTEITEMSTRUCT lpDeleteItemStruct );

参数：
lpDeleteItemStruct 指向一个Windows DELTEITEMSTRUCT结构的长指针，该结构中记录了被删除的项的信息。有关此结构的描述，请参阅CWnd::OnDeleteItem。

说明：
本函数在用户在自定义的组合框中删除一个项或撤消组合框时，由框架调用。缺省的实现什么都不做。需要时可以覆盖此函数重绘组合框。

请参阅：
CComboBox::CompareItem, CComboBox::DrawItem, CComboBox::MeasureItem, WM_DELETEITEM


 CComboBox::DeleteString

int DeleteString( UINT nIndex );

返回值：
大于等于0时，是列表中剩下的字符串的个数。如果nIndex指定的下标大于列表中项的总数，则返回CB_ERROR。

参数：
nIndex 指定待删除的字符串的下标。

说明：
本函数删除组合框的列表中的一个字符串。

请参阅：
CComboBox::InsertString, CComboBox::AddString, CB_DELETESTRING


 CComboBox::Dir

int Dir( UINT attr, LPCTSTR lpszWildCard );

返回值：
大于等于0时，是添加到列表最后的文件名的下标。出错时返回CB_ERROR；没有足够的空间存放新的字符串时返回CB_ERRSPACE。

参数：
attr可以是CFile::GetStatus中定义的枚举值的组合或以下值的组合：
· | DDL_READWRITE | 文件可以读写。
· | DDL_READONLY | 文件只读。
· | DDL_HIDDEN | 隐藏文件，在目录列表中看不到。
· | DDL_SYSTEM | 系统文件。
· | DDL_DIRECTORY | lpszWildCard指定的名字是一个目录。
· | DDL_ARCHIVE | 档案文件。
· | DDL_DRIVES | 包括所有匹配lpszWildCard指定的名字的驱动器。
· | DDL_EXCLUSIVE | 独占标志。如果置了独占标志，则只列出指定的文件；否则指定的文件在正常文件之后与之一起列出。

lpszWildCard 指向一个指定文件名的字符串。字符串中可以包括通配符（例如*.*）。

说明：
在组合框的列表中增添文件名的列表或者驱动器列表。

请参阅：
CWnd::DlgDirList, CB_DIR, CFile::GetStatus


 CComboBox::DrawItem

virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );

参数：
lpDrawItemStruct 指向一个LPDRAWITEMSTRUCT结构的指针，结构中包含了有关项的绘制的信息。

说明：
本函数在自定义的组合框的某个可视属性发生改变时由框架调用。结构DRAWITEMSTRUCT中的成员itemAction指明了要进行的绘制动作。
缺省时，此函数什么也不做。可以覆盖此函数以实现对自定义组合框的绘制。在此成员函数终止之前，应用必须重设置所有为lpDrawItemStruct中的显示上下文选中的GDI对象。

请参阅：
CComboBox::CompareItem, WM_DRAWITEM, CComboBox::MeasureItem, CComboBox::DeleteItem,


 CComboBox::FindString

int FinsString( int nStartAfter, LPCTSTR lpszString ) const;

返回值：
大于等于0时，是找到的匹配字符串的下标。查找未命中时返回CB_ERR。

参数：
nStartAfter | 指定了查找开始的下标。当查到列表的结尾处时，又继续找到它标志的位置。如果设为－1，则从列表的开始处开始查找匹配的串。
lpszString | 指向一个以null结尾的字符串，该字符串就是待查找的匹配前缀。查找过程是不区分大小写的。

说明：
查找组合框的列表中匹配指定前缀的第一个字符串，但不把它选为当前项。

请参阅：
CComboBox::SelectString, CComboBox::SetCurSel, CB_FINDSTRING


 CComboBox::FindStringExact

int FindStringExact( int nIndexStart, LPCTSTR lpszFind ) const;

返回值：
返回匹配的项的下标。未查找到匹配串时返回CB_ERR。

参数：
nIndexStart | 指定了查找开始的下标。当查到列表的结尾处时，又继续找到它标志的位置。如果设为－1，则从列表的开始处开始查找匹配的串。
lpszFind | 指向一个以null结尾的字符串，该字符串中可以包括完整的文件名（包括扩展名）。查找过程是不区分大小写的。

说明：
本函数用于查找组合框的列表中匹配指定字符串的第一个项，但不把它选为当前项。
如果组合框是自定义的，但未设置CBS_HASSTRING风格，FindStringExact会试图匹配双字值。

请参阅：CComboBox::FindString, CB_FINDSTRINGEXACT


 CComboBox::GetCount

int GetCount( ) const;

返回值：
返回项的个数。该值比最后一项的下标要大1（因为下标是从0开始计算的）。出错时返回CB_ERR。

说明：
本函数用于取得组合框中列表框中项的个数。

请参阅：CB_GETCOUNT


 CComboBox::GetCurSel

int GetCursor( ) const;

返回值：
返回组合框中列表框中当前选中的项的下标。如果没有选中项，则返回CB_ERR。

说明：
本函数用于取得组合框中当前选中的项的下标。

请参阅：CComboBox::SetCurSel, CB_GETCURSEL


 CComboBox::GetDroppedControlRect

void GetDroppedControlRect( LPRECT lprect ) const;

参数：
lprect 指向RECT结构的一个指针，该结构用于接收取得的坐标。

说明：
本函数用于取得下拉组合框中可见（已经下拉）的列表框的屏幕坐标。

请参阅：CB_GETDROPPEDCONTROLRECT


 CComboBox::GetDroppedState

BOOL GetDroppedState( ) const;

返回值：列表框可见时返回非零值，否则为0。

说明：
本函数用于判断下拉组合框的列表框是否可见（是否已经下拉）。

请参阅：CB_SHOWDROPDOWN, CB_GETDROPPEDSTATE


 CComboBox::GetDroppedWidth

int GetDroppedWidth( ) const;

返回值：
调用成功时，返回允许的最小宽度，否则返回CB_ERR。

说明：
本函数用于取得组合框中的列表框所允许的最小宽度（以像素为单位）。它只对风格为CBS_DROPDOWN或CBS_DROPDOWNLIST的组合框有效。
缺省时，下拉列表框允许的最小宽度为0。可以调用函数SetDroppedWidth来设置这个值。当组合框的列表框部分显示时，它的宽度是二者中大的那个或组合框的宽度。

请参阅：
CComboBox::SetDroppedWidth, CB_GETDROPPEDWIDTH


 CComboBox::GetEditSel

DWORD GetEditSel( ) const;

返回值：
返回一个32位的值。低字记录了编辑控件中选中的字符串中起始位置，高字记录了紧接着选中的字符串的第一个字符的位置。如果组合框上没有编辑控件，则返回CB_ERR。

说明：
本函数取得组合框的编辑控件中当前被选中的字符串的起止位置。

请参阅：CComboBox::SetEditSel, CB_GETEDITSEL


 CComboBox::GetExtendedUI

BOOL GetExtendedUI( ) const;

返回值：
如果组合框有扩展的用户接口，则返回非零值，否则为0。

说明：
调用GetExtendedUI成员函数，确定组合框是具有缺省用户界面，还是扩展的用户界面。扩展的用户界面可用下列方法指定：
· | 单击组合框的静态控件（只适用于CBS_DROPDOWNLIST风格的组合框）。
· | 按向下的箭头以显示列表框（功能键F4被禁止了）。
当项的列表不可见时，是不能在静态控件中滚动的（箭头键被禁止了）。

请参阅：CComboBox::SetExtendedUI, CB_GETEXTENDEDUI


 CComboBox::GetHorizontalExtent

UINT GetHorizontalExtent( ) const;

返回值：
返回组合框中列表框的可滚动部分的宽度（以像素为单位）。

说明：
本函数取得组合框中列表框的可水平滚动部分的宽度。仅当组合框的列表框有水平滚动条时有效。

请参阅：
CListBox::SetHorizontalExtent, CB_GETHORIZONTALEXTENT


 CComboBox::GetItemData

DWORD GetItemData( int nIndex ) const;

返回值：
返回项上的32位值。出错时返回CB_ERR。

参数：
nIndex 组合框中列表框的某个项的下标。

说明：
本函数返回组合框中指定项上由应用提供的一个32位值。此值可以用成员函数SetItemData的dwItemData参数进行设置。如果检索的是一个32位的指针，请用函数GetItemDataPtr。

请参阅：
CComboBox::SetItemData, CComboBox::GetItemDataPtr, CComboBox::SetItemDataPtr, CB_GETITEMDATA


 CComboBox::GetItemDataPtr

void* GetDataItemPtr( int nIndex ) const;

返回值：
调用成功时返回一个指针，否则返回-1。

参数：
nIndex 组合框的列表框中某个项的下标。

说明：
本函数取得组合框中指定项的一个32位值（由应用提供），类型为void*。

请参阅：
CComboBox::SetItemDataPtr, CComboBox::GetItemData, CComboBox::SetItemData, CB_GETITEMDATA


 CComboBox::GetItemHeight

int GetItemHeight( int nIndex ) const;

返回值：
返回组合框中指定项的高度（以像素为单位）。出错时返回CB_ERR。

参数：
nIndex 指定组合框中待查找高度的组件的下标。如果为-1，则检索组合框中编辑控件（或静态控件）的高度。如果组合框的风格为CBS_OWNERDRAWVARI-ABLE，nIndex就指定了要检索的列表项的下标。否则nIndex被设为0。

说明：本函数用于取得组合框中列表项的高度。

请参阅：
CComboBox::SetItemHeight, WM_MEASUREITEM, CB_GETITEMHEIGHT


 CComboBox::GetLBText

int GetLBText( int nIndex, LPTSTR lpszText ) const;
void GetLBText(int nIndex, CString& rString ) const;

返回值：
返回字符串的字节数，不包括终结符null。如果nIndex指定的值无效，则返回CB_ERR。

参数：
nIndex | 指明列表框中待拷贝的字符串的下标。
lpszText | 指向接收字符串的缓冲。缓冲必须能够容纳下待拷贝的字符串及其终结符null。
rString | 对CString对象的一个参考。

说明：
本函数用于从组合框的列表中拷贝一个字符串。第二种实现方式用拷贝来的文本填充一个CString对象。

请参阅：CComboBox::GetLBTextLen, CB_GETLBTEXTLEN


 CComboBox::GetLBTextLen

int GetLBTextLen( int nIndex ) const

返回值：
返回字符串的长度（字节数）。不包括终结符null。如果nIndex指定的值无效，则返回CB_ERR。

参数：
nIndex 指明列表框中待拷贝的字符串的下标。

说明：
本函数取得组合框的列表中某个字符串的长度。

请参阅：CComboBox::GetLBText, CB_GETLBTEXTLEN


 CComboBox::GetLocale

LCID GetLocale( ) const;

返回值：
返回组合框中字符串的定位标志值（LCID）。

说明：
本函数取得组合框中的定位标志。例如，定位标志用来决定排序的组合框中字符串的排序次序。

请参阅：
CComboBox::SetLocale, ::GetStringTypeW, ::GetSystemDefaultLCID, ::GetUserDefaultLCID


 CComboBox::GetTopIndex

int GetTopIndex( ) const;

返回值：
调用成功时返回组合框的列表中的第一个可见的项的下标，否则返回CB_ERR。

说明：
本函数取得组合框的列表中的第一个可见的项的下标。开始时，下标为0的项是第一个可见的项，但在滚动列表后就不一定了。

请参阅：CComboBox::SetTopIndex, CB_GETTOPINDEX


 CComboBox::InitStorage

int InitStorage( int nItems, UINT nBytes );

返回值：
调用成功时，返回不需要进行内存重分配时组合框中的列表就可容纳的项的个数。否则返回CB_ERR告知内存不足。

参数：
nItems | 指定要添加的项的个数。
nBytes | 指定需要增加的内存的字节数。

说明：
本函数为组合框的列表的项分配内存。在组合框的列表中添加很多项之前最好调用本函数。
只用于Windos 95：参数wParam被限制为16位。因此列表框中的项最多不能超过32767个。每个项的大小仅受可用内存的限制。
本函数有助于加快有很多项的列表框的初始化（如超过100项）。它预先为待添加的项分配内存，随后调用AddString、InsertString和Dir函数就不再动态分配内存，这样就节约了时间。但是列表中的项的个数需要预先估计，如果估计得多了，就会浪费一部分内存；估计得少了，此后再添加项就需要动态申请内存。

请参阅：
CComboBox::CComboBox, CComboBox::Create, CComboBox::ResetContent, CB_INITSTORAGE


 CComboBox::InsertString

int InsertString( int nIndex, LPCTSTR lpszString );

返回值：
返回插入项的下标。出错时返回CD_ERR。如果没有足够的内存插入项，则返回CB_ERRSPACE。

参数：
nIndex | 指定项的插入位置（下标），如果为―1，则在列表的末尾插入该项。
lpszString | 指向待插入的字符串（以null结尾）。

说明：
本函数在组合框的列表框中插入一个字符串。与成员函数AddString不同，它不会引起CBS_SORT风格的列表重新排序。

请参阅：
CComboBox::AddString, CComboBox::SelectString, CComboBox::ResetContent, CB_INSERTSTRING


 CComboBox::LimitText

BOOL Limittext( int nMaxChars );

返回值：
调用成功时返回非零值。对于风格为CBS_DROPDOWNLIST的组合框或一个没有编辑控件的组合框，此函数返回CB_ERR。

参数：
nMaxChars 指定用户可以输入的文本的最大长度（字节数）。如果为0，文本的最大长度为65,535字节。

说明：
本函数设置用户可以在组合框的编辑控件中输入的文本的最大长度。如组合框的风格不是CBS_AOTUSCROLL，把文本的最大长度设得比编辑控件的大小更大是不起作用的。
本函数只限制用户输入文本的最大长度。对那些在调用它之前已经在编辑控件中的文本没有影响，对那些从列表中选中然后被拷贝到编辑控件中的文本也不起作用。

请参阅：CB_LIMITTEXT


 CComboBox::MeasureItem

virtual void MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct );

参数：
lpMeasureItemStruct 指向一个LPMEASUREITEMSTRUCT结构的长指针。

说明：
当创建一个具有自定义风格的组合框时，由主程序调用。
缺省时此函数什么都不做。可以覆盖它并填充MEASUREITEMSTRUCT结构通知Windows组合框中列表框的维数。如果组合框是CBS_OWNERDRAWVARIABLE风格的，主程序需要为列表框中的每个项调用此函数。否则，此函数只需调用一次。
用CWnd的成员函数SubclassDlgItem创建一个具有CBS_OWNERDRAWFIXED风格的自定义组合框要考虑其它的一些编程细节。参阅“技术指南14”。
关于结构MEASUREITEMSTRUCT，请参阅CWnd::OnMeasureItem。

请参阅：
CComboBox::CompareItem, CComboBox::DrawItem, WM_MEASUREITEM, CComboBox::DeleteItem


 CComboBox::Paste

void Paste( );

说明：
本函数把剪贴板中的数据插入到组合框中编辑控件当前光标位置。剪贴板中的数据必须是CF_TEXT格式的。

请参阅：
CComboBox::Clear, CComboBox::Copy, CComboBox::Cut, WM_PASTE


 CComboBox::ResetContent

void ResetContent( );

说明：
本函数删除组合框中列表和编辑控件中的所有项。

请参阅：CB_RESETCONTENT


 CComboBox::SelectString

int SelectString( int nStartAfter, LPCTSTR lpszString );

返回值：
找到相应的字符串时，返回它的下标。没有找到时，返回CB_ERR，并且当前的选择不变。

参数：
nStartAfter | 指定了查找开始的下标。当查到列表的结尾处时，又继续找到它标志的位置。如果设为－1，则从列表的开始处开始查找匹配的串。
lpszString | 指向一个以null结尾的字符串，该字符串就是待查找的匹配前缀。查找过程是不区分大小写的。

说明：
查找组合框的列表中匹配指定前缀的第一个字符串，如果找到则把它选为当前项，并把它拷贝到编辑控件中。
注意，成员函数SelectString和FindString都是查找字符串，但是SelectString同时也把找到的字符串作为当前选中的项。

请参阅：CComboBox::FindString, CB_SELECTSTRING


 CComboBox::SetCurSel

int SetCurSel( int nSelect );

返回值：
调用成功时返回选中的项的下标。如果nSelect大于列表中项的个数，则返回CB_ERR。如果nSelect为-1，则清除当前的选择并返回CB_ERR。

参数：
nSelect 指定要选中的字符串的下标。如果为-1，则清除当前的选择，编辑控件中的内容设置为空。

说明：
本函数在组合框的列表框中选择一个字符串。必要时列表框会滚动，以使该字符串在列表的可视区内（列表是可见的时）。编辑控件中的文本将相应地变为选中的字符串。此前在列表框中的选择将不复存在。

请参阅：CComboBox::GetCurSel, CB_SETCURSEL


 CComboBox::SetDroppedWidth

int SetDroppedWidth( UINT nWidrh );

返回值：
调用成功时，返回列表框的新宽度。否则返回CB_ERR。

参数：
nWidth 组合框的列表框所允许的最小宽度（以像素为单位）。

说明：
本函数用于设置组合框中列表框所允许的最小宽度。只对风格为CBS_DROPD-OWN或CBS_DROPDOWNLIST的组合框有效。
缺省时，下拉列表框所允许的最小宽度为0。显示组合框的列表部分时，它的真正宽度是设置的最小宽度和组合框的宽度二者中较大的一个。

请参阅：
CComboBox::GetDroppedWidth, CB_SETDROPPEDWIDTH


 CComboBox::SetEditSel

BOOL SetEditSel( int nStartChar , int nEndChar );

返回值：
调用成功时返回非零值，否则为0。如果CComboBox的风格为CBS_DROPD-OWNLIST或没有列表框，则返回CB_ERR。

参数：
nStartChar | 指定起始位置。如果为-1，则清除当前的选择。
nEndChar | 指定结束位置。如果为-1，则选中编辑控件中从开始位置到最后的所有字符。

说明：
本函数用来选中编辑控件中的部分字符串。
位置是从0开始计算的。要选中编辑控件中的第一个字符，开始位置要设为0。结束位置指的是紧跟着要选择的字符串的最后一个字符的那个位置。例如，选中编辑控件中的前四个字符，需要把开始位置设为0，结束位置设为4（而不是3）。

请参阅：CComboBox::GetEditSel, CB_SETEDITSEL


 CComboBox::SetExtendedUI

int SetExtendedUI(BOOL bExtended = TRUE );

返回值：
调用成功时返回CB_OKAY，否则返回CB_ERR。

参数：
bExtended 指定组合框是采用扩展的用户接口，还是采用缺省的用户接口。为TRUE时采用扩展的用户接口，FALSE时采用标准的用户接口（缺省的）。

说明：
本函数用于为风格为CBS_DROPDOWN或CBS_DROPDOWNLIST的组合框设置使用用户接口的方式。
扩展的用户接口可以用以下步骤确认：
· | 单击组合框的静态控件（只适用于CBS_DROPDOWNLIST风格的组合框）；
· | 按向下的箭头以显示列表框（功能键F4被禁止了）。
当项的列表不可见时，是不能在静态控件中滚动的（箭头键被禁止了）。

请参阅：CComboBox::GetExtendedUI, CB_SETEXTENDEDUI


 CComboBox::SetHorizontalExtent

void SetHorizontalExtent( UINT nExtent );

参数：
nExtent指定组合框中列表框能够水平滚动的像素数。

说明：
本函数设置组合框中的列表框所能水平滚动的宽度。如果列表框的宽度比这个值要小，则水平滚动条将水平地滚动列表中的项。如果列表框的宽度与它相等或比它大，则水平滚动条将被隐藏（组合框的风格为CBS_DISABLEN-OSCROLL，则会禁止水平滚动条）。

请参阅：
CComboBox::GetHorizontalExtent, CB_SETHORIZONTALEXTENT


 CComboBox::SetItemData

int SetItemData( int nIndex, DWORD dwItemData );

返回值：出错时返回CB_ERR。

参数：
nIndex | 指定待设置的项的下标。
dwItemData | 指定待设置的项的新值。

说明：
给组合框中某个项设置一个32位的值。如果是一个指针，则可以用SetItemDataPtr函数进行设置。

请参阅：
CComboBox::GetItemData, CComboBox::GetItemDataPtr, CComboBox::SetItemDataPtr, CB_SETITEMDATA, CComboBox::AddString, CComboBox::InsertString


 CComboBox::SetItemDataPtr

int SetItemDataPtr( int nIndex, void* pData );

返回值：出错时返回CB_ERR。

参数：
nIndex | 指定待设置的项的下标。
pData | 项的新值的指针。

说明：
给组合框中某个项设置一个32位的值（是一个void类型的指针）。即使因为增减列表中项的数目而使该项移动了位置，此指针在组合框的生命周期内也一直有效。此外，该项在列表中的下标会变化，但是该指针保持不变。

请参阅：
CComboBox::GetItemData, CComboBox::GetItemDataPtr, CComboBox::SetItemData, CB_SETITEMDATA, CComboBox::AddString, CComboBox::InsertString


 CComboBox::SetItemHeight

int SetItemHeight( int nIndex, UINT cyItemHeight );

返回值：
如果下标或高度值无效，则返回CB_ERR。否则为0。

参数：
nIndex | 指明要设置的是组合框中列表项的高度还是编辑控件（或静态文本）的高度。 如果组合框的风格是CBS_OWNERDRAWVARIABLE，nIndex指定了列表中待设置高度的项的下标。否则nIndex必须为0，而且要设置的是所有列表项的高度（它们的高度相同）。 如果nIndex为-1，则将设置组合框中编辑控件或者静态文本的高度。
cyItemHeight | 指定待设置对象的高度（以像素为单位）。

请参阅：
CComboBox::GetItemHeight, WM_MEASUREITEM, CB_SETITEMHEIGHT


 CComboBox::SetLocale

LCID SetLocale( LCID nNewLocate );

返回值：
返回组合框的在此前的局部标志（LCID）。

参数：
nNewLocate 组合框的新LCID。

说明：
本函数用于设置组合框的LCID。如果没有调用SetLocale，由系统提供缺省的LCID。可以在控制面板中的地区（或国际）中修改系统的缺省LCID。

请参阅：CComboBox::GetLocale


 CComboBox::SetTopIndex

int SetTopIndex( int nIndex );

返回值：
调用成功时返回0，否则返回LB_ERR。

参数：
nIndex 指定列表项的下标。

说明：
本函数用来使组合框的列表框中的某个项是可见的。必要时，系统会滚动列表框使指定的项显示在列表的可视区域的最上面，或者滚动到不能滚动为止。

请参阅：
CComboBox::GetTopIndex, CB_SETTOPINDEX


 CComboBox::ShowDropDown

void ShowDropDown( BOOL bShowIt = TRUE );

参数：
bShowIt 指明是否显示下拉列表框。为TRUE时显示它，为FALSE时隐藏。

说明：
本函数用于显示或隐藏具有CBS_DROPDOWN或CBS_DROPDOWNLIST风格的组合框中的列表框。缺省时，这样的组合框是要显示列表框的。
本函数对CBS_SIMPLE风格的组合框没有影响。

请参阅：CB_SHOWDROPDOWN


 CComboBoxEx

CObject
└CCmdTarget
└CWnd
└CComboBox
└CComboBoxEx

类CComboBoxEx扩展了类CComboBox，支持图像列表。使用CComboBoxEx创建组合框控件不需要书写绘制图像的代码，就可以直接存取图形列表中的图像。

对图形列表的支持
在标准的CComboBox中，绘制图像需要程序员把组合框控件设为自定义风格。在使用CComboBoxEx时，不再需要把组合框的风格设置为CBS_OWNERDRAWFIXED以及CBS_HASSTRINGS，因为类中已经实现了处理图像的功能。在CComboBoxEx控件中，每项最多可有3个图像：一个代表选中状态，一个代表未选中状态，另一个代表覆盖的图像。

风格
CComboBoxEx支持四种风格：CBS_SIMPLE、CBS_DROPDOWN、CBS_DROPDOWNLIST和WS_CHILD。创建窗口时提供了其它的风格时，控件都会忽略它。窗口创建完成之后，可以调用成员函数SetExtendedStyle把组合框设置成其它的风格。采用这些风格，可以：
· | 在列表中查找字符串可以设置成大小写敏感的；
· | 创建一个使用斜线（/）、反斜线（\）和句点（.）作为单词的分隔符的组合框控件；
· | 让组合框控件显示或隐藏图像。如果没有显示图像，组合框可以取消那些为适应图像的显示而进行的缩进；
· | 创建一个狭窄的组合框，可以调整它的大小使它所包括的大组合框被剪裁缩小。
这些风格的描述在联机文档“Visual C++程序员指南”中的“使用CComboBoxEx”部分。

项的保留和和回调项属性
项的信息，例如项的下标、图像、缩进值和文本字符串，保存在Win32结构COMBOBOXEXITEM中，该结构在联机文档“平台SDK”中说明。结构中也包括了记录回调标记的成员。
要了解有关概念的更详细的说明，请参阅联机文档“Visual C++程序员指南”中的“使用ComboBoxEx”。
#include <afxcmn.h>
请参阅：CComboBox

CComboBoxEx类的成员

构造函数
CComboBoxEx 构造一个CComboBoxEx对象

初始化函数
Create 创建组合框并和CComboBoxEx对象相联系

操作符
DeleteItem | 从组合框控件中删除一个项
GetItem | 检索组合框中某个项的相关信息
InsertItem | 在组合框控件中插入一项
SetItem | 设置组合框中某个项的属性

属性
HasEditChanged | 检测用户是否改变了组合框中编辑控件的内容
GetExtendedStyle | 检索在组合框上采用的扩展风格
GetExtendedStyle | 设置组合框的扩展风格
GetEditCtrl | 检索组合框中编辑控件的句柄
GetComboBoxCtrl | 取得指向子组合框控件的指针
GetImageList | 取得指向在组合框控件中图像列表的指针。
SetImageList | 为组合框控件设置一个图像列表。


 CComboBoxEx::CComboBoxEx

CComboBoxEx( );

说明：本函数创建一个CComboBoxEx对象。

请参阅：CComboBoxEx::Create, CComboBox


 CComboBoxEx::Create

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

返回值：对象创建成功时返回非零值，否则为0。

参数：
dwStyle | 指定在组合框上应用的风格的组合。参阅下面的说明部分。
rect | 对一个CRect对象的或RECT结构的参考，其中记录了组合框的位置和大小。
pParentWnd | 指向一个CWnd对象，该对象是组合框的父窗口（通常是一个CDialog对象）。不能为NULL。
nID | 指定组合框的控制ID。

说明：
创建一个CComboBoxEx对象需要两步：
1. | 调用构造函数CComboBoxEx构造一个CComboBoxEx对象；
2. | 调用成员函数Create创建扩展的Windows组合框并且使它与CComboBoxEx对象相联系。 调用Create时，MFC对通用控件进行初始化。 创建组合框时，可指定的风格有：
·CBS_SIMPLE
·CBS_DROPDOWN
·CBS_DROPDOWNLIST
·WS_CHILD
创建窗口时传送的其它风格都被忽略。CComboBoxEx控件也支持扩展风格，它们提供一些附加特征。这些风格在联机文档“平台SDK”的“CComboBoxEx控件扩展风格”中说明。可以调用函数SetExtendedStyle设置扩展风格。

请参阅：CComboBoxEx::CComboBoxEx


 CComboBoxEx::DeleteItem

int DeleteIten( int iIndex );

返回值：
调用成功时返回组合框控件中剩下的项数。如果nIndex无效，则返回CB_ERR。

参数：
nIndex 指定待删除的项的下标。

说明：
本函数是对通知消息CBEM_DELETEITEM的实现，有关的说明可参阅联机文档“平台SDK”。在调用DeleteItem时，将会向父窗口发送通知CBEM_DELETEITEM和消息WM_NOTIFY。


 CComboBoxEx::GetComboBoxCtrl

CComboBox* GetComboBoxCtrl( );

返回值：返回一个CComboBox对象指针。

说明：
本函数用于取得CComboBoxEx对象中组合框控件的指针。此CComboBoxEx控件有一个父窗口，该窗口中实现了一个CComboBox。返回值指向的CComboBox对象是一个临时对象，系统将在下一个空闲的处理时间中删除它。

请参阅：CComboBoxEx::GetEditCtrl


 CComboBoxEx::GetEditCtrl

CEdit* GetEditCtrl( );

返回值：返回一个CEdit对象指针。

说明：
本函数用于取得组合框中编辑控件的指针。组合框控件在以CBS_DROPDOWN风格创建时会有一个编辑控件。
返回值指向的CEdit对象是一个临时对象，系统将在下一个空闲的处理时间中删除它。

请参阅：CComboBoxEx::Create


 CComboBoxEx::GetExtendedStyle

DWORD GetExtendedStyle( ) const;

返回值：
返回的DWORD类型的值中包含了组合框控件采用的扩展风格。

说明：
本函数用于取得CComboBoxEx控件采用的扩展风格。有关更详细的信息，请参阅联机文档“平台SDK”的“CComboBoxEx扩展风格”。

请参阅：CComboBoxEx::SetExtendedStyle


 CComboBoxEx::GetImageList

CImageList* GetImageList( ) const;

返回值：
返回一个CImageList对象指针。如果失败，则返回NULL。

说明：
本函数用于取得CComboBoxEx控件使用的图像列表的指针。
返回值指向的CImageList对象是一个临时对象，系统将在下一个空闲的处理时间中删除它。

请参阅：CComboBoxEx::SetImageList, COMBOBOXEXITEM


 CComboBoxEx::GetItem

BOOL GetItem( COMBOBOXEXITM* pCBItem );

返回值：调用成功时返回非零值，否则为0。

参数：
pCBItem 用来存放项信息的COMBOBOXEXITM结构的指针。

说明：
本函数是对消息CBEM_GETITEM的实现，参阅联机文档“平台SDK”。

请参阅：CComboBoxEx::SetItem, CComboBoxEx::InsertItem


 CComboBoxEx::HasEditChanged

BOOL HasEditChanged( );

返回值：
如果用户在编辑框中输入了字符，则返回非零值，否则为0。

说明：
本函数实现了消息CBEM_HASEDITCHANGED，参阅联机文档“平台SDK”。


 CComboBoxEx::InsertItem

int InsertItem( const COMBOBOXEXITEM* pCBItem );

返回值：调用成功时返回插入项的下标，否则返回-1。

参数：
pCBItem 一个指向COMBOBOXEXITEM结构的指针，该结构用于接收项的信息。该结构中也包含了项的回调标志值。

说明：
调用本函数时，将会向父窗口发送一个WM_NOTIFY消息和一个CBEM_IN-SERTITEM通知。

请参阅：CComboBoxEx::GetItem, CComboBoxEx::SetItem


 CComboBoxEx::SetExtendedStyle

DWORD SetExtendedStyle( DWORD dwExMask, DWORD dwExStyle );

返回值：
返回一个DWORD类型的值，其中记录了控件在此前设置的扩展风格。

参数：
dwExMask | 是一个DWORD类型的值，指明了dwExStyles中的那些风格将要改动。只有那些在dwExMask中的扩展属性会被改动。如果此参数为0，则dwExStyles中所有的风格都会被改动。
dwExStyles | 一个DWORD类型的值，其中包含了将设置的组合框控件的扩展属性。

说明：
本函数用于设置组合框扩展控件的扩展风格。有关组合框扩展风格的详细信息，请参阅联机文档“平台SDK”的“CComboBoxEx扩展风格”。

请参阅：CComboBoxEx::GetExtendedStyle


 CComboBoxEx::SetImageList

CImageList* SetImageList( CImageList* pImageList );

返回值：
返回一个CImageList对象指针，指明此前CComboBoxEx控件采用的图像列表。如果此前没有设置图像列表，则返回NULL。

参数：
pImageList CImageList对象指针，指明待设置的图像列表。

说明：
本函数是对消息CBEM_SETIMAGELIST的实现，参阅联机文档“平台SDK”。
如果改变了编辑控件的缺省高度，在调用SetImageList以后需要用Win32函数SetWindowPos来改变控件的大小，否则它的显示是不对的。
返回值指向的CImageList对象是一个临时对象，系统将在下一个空闲的处理时间中删除它。

请参阅：CComboBoxEx::GetImageList


 CComboBoxEx::SetItem

BOOL SetItem( const COMBOBOXEXITEM* pCBItem );

返回值：调用成功时，返回非零值，否则为0。

参数：
pCBItem 指向结构COMBOBOXEXITEM的一个指针，该结构用于存放项的信息。

说明：
本函数是对消息CBEM_SETITEM的实现。参阅联机文档“平台SDK”。

请参阅：CComboBoxEx::GetItem, CComboBoxEx::InsertItem


 CCommandLineInfo

CObject
└CCommandLineInfo

类CCommandLineInfo用于分析启动应用时的命令行参数。
MFC应用一般都会在它的应用对象中使用函数InitInstance创建这个类的一个本地实例。然后把该对象传给CWinApp::ParseCommandLine，ParseCommandLine又重复调用ParseParam填充CCommandLineInfo对象。最后，CCommandLineInfo对象被传给CWinApp::ProcessShellCommand来处理命令行参数和选项。
类CCommandLineInfo可以用来封装以下的命令行选项和参数：
命令行参数 | 执行的命令
app | 建立新文件
app 文件名 | 打开文件
app /p 文件名 | 在缺省打印机上打印文件
app /pt 文件名 打印机 驱动程序 打印端口 | 在指定的打印机上打印文件
app /dde | 启动程序并等待DDE命令
app /Automation | 启动为一个OLE自动服务器
app /Embedding | 启动来编辑嵌入的OLE项
要处理其它的选项，可以从类CCommandLineInfo派生一个子类，然后覆盖函数ParseParam进行相应的处理。
#include <afxwin.h>

请参阅：CWinApp::ParseCommandLine, CWinApp::ProcessShellCommand

CCommandLineInfo类的成员

构造函数
CCommandLineInfo 构造一个缺省的CCommandLineInfo对象

操作
ParseParam 可以覆盖这个回调函数以分析命令行参数

数据成员
m_bShowSplash | 指明是否显示飞溅型的屏幕
m_bRunEmbedded | 指明是否在命令行找到了/Embedding选项
m_bRunAutomated | 指明是否在命令行找到了/Automation选项
m_nShellCommand | 要执行的命令
m_strFileName | 待打开或打印的文件名，在命令为New或DDE时为空
m_strPrinterName | 命令为Print To时指明打印机名；否则为空
m_strDriverName | 命令为Print To时指明驱动程序名；否则为空
m_strPortName | 命令为Print To时指明打印端口名；否则为空


 CCommandLineInfo::CCommandLineInfo

CCommandLineInfo( );

说明：
本构造函数采用缺省值创建一个CCommandLineInfo对象。缺省时显示飞溅型的屏幕（m_bShowSplash=TRUE）并且执行File菜单上的New命令（m_nShellCommand = NewFile ）。
应用调用ParseParam来填充此对象的数据成员。

请参阅：CCommandLineInfo::ParseParam


 CCommandLineInfo::ParseParam

virtual void ParseParam( LPCTSTR lpszParam, BOOL bFlag, BOOL bLast );

参数：
lpszParam | 命令行参数或选项。
bFlag | 指明lpszParam是参数还是选项。
bLast | 是否为命令行中的最后一个参数或选项。

说明：
框架调用此函数来分析解释命令行中的每个输入参数。CWndApp::ParseCommand调用为命令行中的每个参数或选项调用一次ParseParam，然后把它传给lpszParam。如果输入参数的头一个字符为“-”或“/”，则删除它，并把bFlag设置为TRUE。在分析到最后一个输入参数时，把bLast设置为TRUE。
缺省时，本函数可以识别出以下的选项：/p, /pt, /dde/ /Automation和/Embedding。如下表所示：
命令行参数 | 执行的命令
app | 建立新文件
app 文件名 | 打开文件
app /p 文件名 | 在缺省打印机上打印文件
app /pt 文件名 打印机 驱动程序 打印端口 | 在指定的打印机上打印文件
app /dde | 启动程序并等待DDE命令
app /Automation | 启动为一个OLE自动服务器
app /Embedding | 启动来编辑嵌入的OLE项
这些信息存放在m_bRunAutomated、m_bRunEmbedded和m_nShellCommand中，选项以“-”或者“/”打头。
缺省时，本函数把不是选项的输入参数放到m_strFileName中。遇到选项/pt时，把第二、三、四个不是选项的参数分别传给m_strPrinterName、m_strDriverName和m_strPortName。
在缺省实现中，仅当新建文件时把m_bShowSplash设置为TRUE。新建一个文件时，用户的动作就包括了应用本身。在其它情况下，例如用外壳（shell）打开一个现存的文件，用户的动作只是直接包括了文件。以一种以文档为中心的观点来看，飞溅型窗口不需要宣布应用的启动。
可以覆盖此函数处理其它的选项和参数值。

请参阅：CWinApp::ParseCommandLine


 CCommandLineInfo::m_bRunAutomated

说明：
指明命令行中是否找到了/Automation选项。如果为TRUE，则说明作为OLE自动服务器启动。

请参阅：CCommandLineInfo::ParseParam, CWinApp::ProcessShellCommand


 CCommandLineInfo::m_bRunEmbedded

说明：
指明命令行中是否找到了/Embedding选项。如果为TRUE，则说明启动为编辑嵌入的OLE项启动。

请参阅：CCommandLineInfo::m_bShowSplash, CWinApp::ProcessShellCommand


 CCommandLineInfo::m_bShowSplash

说明：
指明是否显示飞溅型的屏幕。如果为TRUE，则在启动应用时显示飞溅型的屏幕。如果m_nShellCommand等于CComandLineInfo::FileNew，则ParseParam把它设置为TRUE。

请参阅：
CCommandLineInfo::m_bRunAutomated, CCommandLineInfo::m_bRunEmbedded, CCommandLineInfo::m_nShellCommand, CCommandLineInfo::ParseParam, CWinApp::ProcessShellCommand


 CCommandLineInfo::m_nShellCommand

说明：
指明应用实例的外壳命令。
它的数据类型可以是在CCommandLineInfo中定义的以下枚举值：
enum
{
Filenew,
FileOpen,
FilePrint,
FilePrintTo,
FileDDE,
FileNothing =-1
};
下面是这些值的详细说明：
· | CCommandLineInfo::FileNew | 命令行参数中没有发现文件名。
· | CCommandLineInfo::FileOpen | 命令行参数中有文件名，但是没有下面的选项：/p，/pt，/dde。
· | CCommandLineInfo::FilePrint | 命令行参数中有选项/p。
· | CCommandLineInfo::FilePrintTo | 命令行参数中有选项/pt。
· | CCommandLineInfo::FileDDE | 命令行参数中有选项/dde。
· | CCommandLineInfo::FileNothing | 不在启动时显示一个新的MDI子窗口。AppWizard在生成的MDI应用在启动时是要显示一个新子窗口的。应用在调用ProcessShellCommand时用CCommandLineInfo::FileNothing作为外壳命令就可以关闭这个选项。所有从类CWinApp派生出的类的InitInstance函数都会调用ProcessShellCommand。

示例：
BOOL CMyWinApp::InitInstance( )
{
// Parse command line for standard shell command,DDE,file open
CCommandLineinfo cmdInfo;
ParseCommandLine( cmdinfo );
// DON'T display a new MDI child window during startup!!!
cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
// Dispatch commands specified on the command line
if( !ProcessShellCommand( cmdInfo )) return FALSE;
//...
}

请参阅：
CCommandLineInfo::m_strFilename, CCommandLineInfo::m_strPrinterName, CCommandLineInfo::m_strDriverName, CCommandLineInfo::m_strPortName, CWinApp::ProcessShellCommand


 CCommandLineInfo::m_strDriverName

说明：
记下命令行参数中的第三个不是选项的参数。一般应是Print To外壳命令需要的打印驱动程序。ParseParam的缺省实现只在命令行中出现/pt选项时设置该数据成员。

请参阅：
CCommandLineInfo::m_strFilename, CCommandLineInfo::m_strPrinterName, CCommandLineInfo::m_strPortName, CWinApp::ProcessShellCommand


 CCommandLineInfo::m_strFilename

说明：
记下命令行参数中的第一个不是选项的参数。一般应要打开的文件的名字。

请参阅：
CCommandLineInfo::m_strPrinterName, CCommandLineInfo::m_strDriverName, CCommandLineInfo::m_strPortName, CWinApp::ProcessShellCommand


 CCommandLineInfo::m_strPortName

说明：
记下命令行参数中的第四个不是选项的参数。一般应是Print To外壳命令需要的打印端口。ParseParam的缺省实现只在命令行中出现/pt选项时设置该数据成员。

请参阅：
CCommandLineInfo::m_strFilename, CCommandLineInfo::m_strPrinterName, CCommandLineInfo::m_strPortName, CWinApp::ProcessShellCommand


 CCommandLineInfo::m_strPrinterName

说明：
记下命令行参数中的第二个不是选项的参数。一般应是Print To外壳命令需要的打印机名。ParseParam的缺省实现只在命令行中出现/pt选项时设置该数据成员。

请参阅：
CCommandLineInfo::m_strFilename, CCommandLineInfo::m_strDriverName, CCommandLineInfo::m_strPortName, CWinApp::ProcessShellCommand


 CCommonDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog

类CCommonDialog是所有封装了Windows通用对话框的类的基类。封装了Windows通用对话框的类如下：
·CFileDialog
·CFontDialog
·CColorDialog
·CPageSetupDialog
·CPrintDialog
·CFindReplaceDialog
·COleDialog
#include <afxdlgs.h>

请参阅：
CFileDialog, CFontDialog, CColorDialog, CPageSetupDialog, CPrintDialog, CFindReplaceDialog, COleDialog

CCommonDialog类的成员

构造函数
CCommonDialog 构造一个CCommonDialog对象


 CCommonDialog::CCommonDialog

CCommonDialog( CWnd* pPArentWnd );

参数：
pParentWnd 指明对话框所属的父对象或属主窗口对象。如果为NULL，则对话框的主窗口是应用的主窗口。

说明：
本函数用于CCommonDialog对象。更完整的信息请参阅CDialog::CDialog。

请参阅：CDialog::CDialog


 CConnectionPoint

CObject
└CCmdTarget
└CConnectionPoint

类CConnectionPoint定义了与OLE对象通信的一类特殊接口，它称为“连接点”（Connection Point）。一般的OLE接口实现并向外提供OLE控件的功能，而连接点则实现了外向的接口，从而能初始化其它对象的动作，如激活事件并改变通知。
一个连接由两部分组成：调用接口的对象，称为源端；实现接口的对象，称为接收端（槽）。源端提供连接点使接收端和它建立连接。通过连接点机制，源对象可以取得接收端对一些成员函数的实现的指针。例如，要激活一个由接收端实现的事件，源端可以调用接收端的相应实现。
缺省时，从类COleControl派生出的类实现了两个连接点：一个用于事件，一个用于属性变化通知。它们分别用于激活事件和通知接收端（如控件的包容器）属性发生了变化。MFC也为实现更多的连接点提供了支持。在用户派生的控制类中的每个附加的连接点，都必须声明一个“连接部分”（connection part）来实现连接点。实现附加连接点，也需要在控制类中声明一个“连接映射”（connection map）。
下面的例子实现了Sample OLE控件上一个简单的连接映射和连接点，它包括两部分代码：第一部分声明了连接映射和连接点；第二部分实现了该映射和连接点。第一部分要插入到控件类protected部分下的声明中：
// Connection point for ISample interface
BEGIN_CONNECTION_PART( CSampleCtrl, SampleConnPt )
CONNECTION_IID( IID_ISampleSink )
END_CONNECTION_PART( SampleConnPt )

DECLARE_CONNECTION_MAP( )
宏BEGIN_CONNECTION_PART和END_CONNECTION_PART声明了一个嵌入类XSampleConnPt（从CConnectionPoint继承来），该类实现了这个连接点。如果想覆盖CConnectionPoint的成员函数或者增加新的成员函数，要在这两个宏之间声明。例如，上例中的宏CONNECTION_IID覆盖了CConnectionPoint::GetIID。
代码的第二部分要插入到控制类的实现文件（.CPP）中。它实现了连接映射，包括附加的连接点SampleConnPt：
BEGIN_CONNECTION_MAP( CSampleCtrl, COleControl )
CONNECTION_PART( CSampleCtrl, IID_SampleSink, SampleConnPt )
END_CONNECTION_MAP( )
插入这些代码之后，Sample OLE控件就为接口ISampleSink提供了一个连接点。
典型地，连接点支持多播，即向连接到同一个接口的多个接收端广播。下面的例子通过向每个接收端发送实现多播。
void CSampleCrtl::CallSinkFunc( )
{
const CPtrArray* pConnections = m_xSampleConnPt.GetConnections( );
ASSERT( pConnections !=NULL );
int cConnections = pConnections->GetSize( );
ISampleSink* pSampleSink;
for( int i=0 ; i<cConnections; i++)
{
pSampleSink = (ISampleSink*)(pConnections->GetAt(i));
ASSERT(pSamplesink != NULL);
pSampleSink->SinkFunc( );
}
}
在本例中使用CConnectionPoint::GetConnections检索SampleConnPt连接点上的所有连接。然后对每个活动的连接调用ISampleSink::SinkFunc。
要了解有关使用CConnectionPoint的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“连接点”部分。
#include <afxctl.h>

CConnectionPoint类的成员

操作
GetConnections 检索连接映射中的所有连接点

可覆盖的函数
GetContainer | 检索控件的包容器，其中包括了连接映射
GetIID | 检索连接点的接口ID
GetMaxConnections | 检索连接点支持的最大连接点个数
OnAdvise | 设置或中断连接时由主程序调用


 CConnectionPoint::GetConnections

const CPtrArray* GetConnections( );

返回值：
返回一个指针数组，数组中记录了接收端的活动连接。数组中的每个指针都可以通过强制转换变成一个指向接收端接口的指针。

说明：
本函数用于检索连接映射中的所有连接点。

请参阅：CConnectionPoint::GetMaxConnections


 CConnectionPoint::GetContainer

virtual LPCONNECTIONPOINTCONTAINER GetContainer( ) = 0;

返回值：
调用成功时返回一个指向包容器的指针，否则返回NULL。

说明：
本函数由主程序调用检索IConnectionPointContainer对象中的连接点。一般由宏BEGIN_CONNECTION_PART实现。

请参阅：BEGIN_CONNECTION_PART


 CConnectionPoint::GetIID

virtual REFIID GetIID( ) = 0;

返回值：返回对连接点接口ID的参考。

说明：
本函数由框架调用，取得连接点的接口ID。
可以覆盖此函数返回连接点的接口ID。

请参阅：CONNECTION_IID


 CConnectionPoint::GetMaxConnections

virtual int GetMacConnections( );

返回值：
返回控件支持的最大连接数目，如果没有限制，则返回-1。

说明：
本函数由框架调用以取得连接点支持的最大连接数目。缺省的实现中返回-1，即对连接的最大数目没有限制。
可以覆盖此函数来限制连接到控件的最大连接端个数。

请参阅：CConnectionPoint::GetConnections


 CConnectionPoint::OnAdvise

virtual void OnAdvise( BOOL bAdvie );

参数：
bAdvise 如果已经设置了连接，则返回TRUE；否则返回FALSE。

说明：
载建立或者中断连接时，由框架调用。缺省的实现什么都不做。
可以覆盖此函数以载建立连接或中断连接时发出通知。


 CControlBar

CObject
└CCmdTarget
└CWnd
└CControlBar

类CControlBar是所有控件条类（CStatusBar、CToolBar、CDialogBar、CReBar和COleResizeBar）的基类。控件条一般是一个在框架窗口左边或右边的窗口。它可以包括子项，如基于HWND的控件（生成和响应消息的Windows窗口）和非基于HWND的控件（不是窗口，由应用代码或框架代码处理）。列表框和编辑控件就是基于HWND的，而状态条面板和位图按钮就不是基于HWND的。
控件条窗口通常是父框架窗口的子窗口，并属于框架窗口的客户视图区或MDI客户。CControlBar对象采用父窗口客户矩形区的参数来定位。它会通知父窗口客户区中还有多少未占用的空间。
要了解有关CControlBar的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“控件条主题”和联机文档中的“技术指南31，控件条”。
#include <afxext.h>
请参阅：CToolBar, CDialogBar, CStatusBar, CReBar

CControlBar类的成员

数据成员
m_bAutoDelete 非零时，在撤消Windows控件条时删除CControlBar对象

属性
GetBarStyle | 取状态条的风格设置
SetBarStyle | 修改状态条的风格设置
GetBorders | 取状态条的边框值
SetBorders | 设置状态条的边框值
GetCount | 返回状态条中非HWND成员的个数
GetDockingFrame | 返回状态条所在的主窗口的指针
IsFloating | 如果状态条是浮动型，返回非零值
CalcFixedLayout | 以CSize对象返回控件条的大小
CalcDynamicLayout | 以CSize对象返回动态控件条的大小

可覆盖的函数
OnUpdateCmdUI 调用命令UI处理函数

操作
EnableDocking 设置状态条为停靠状态或浮动状态


 CControlBar::CalcDynamicLayout

virutal CSize CalcDynamicLayout( int nLength, DWORD dwMode );

返回值：
返回控件条的大小（以像素为单位），记录在一个CSize对象中。

参数：
nLength 存放控件条宽度或高度所需要的大小（由dwMode确定）。
dwMode下面的标志用于设定控件条的宽度和高度，可以用OR操作（|）组合使用。
布局标志 | 含义
LM_STRECTH | 指明是否伸展控件条以适应框架窗口的大小。如果不允许停靠，则设置它；当控件条处于停靠状态或浮动状态时，不需要设置它。设置了LM_STRECTH后，将忽略nLength并根据LM_HORZ的状态返回维数。此参数与Calc FixedLayout中参数bStretch作用类似
LM_HORZ | 指明控件条是水平放置还是垂直放置的。水平放置时设置此参数。此参数与CalcFixedLayout中参数bHorz作用类似
LM_MRUWIDTH | 最近最多使用的动态宽度。忽略参数nLength，并采用记录的最近最多使用的值
LM_HORZDOCK | 水平停靠的维数。忽略参数nLength并返回最大的宽度作为动态大小
LM_VERTDOCK | 垂直停靠的维数。忽略参数nLength并返回最大的高度作为动态大小
LM_LENGTHY | 在nLength指的是高度而不是宽度时设置
LM_COMMIT | 重置LM_MRUWIDTH为当前浮动的控件条的宽度

说明：
本函数用于计算动态工具条的维数。
可以在派生类中覆盖此函数以提供自定义的动态布局信息。从CControlBar派生的类（如CToolbar）覆盖了该函数。

请参阅：CControlBar::CalcFixedLayout, CToolBar


 CControlBar::CalcFixedLayout

virtual CSize CalcFixedLayout( BOOL bStretch , BOOL bHorz );

返回值：
返回控件条的大小（以像素为单位），存储在一个CSize对象中。

参数：
bStretch | 指明是否伸展控件条以适应框架窗口的大小。如果不是一个可停靠的控件条，为非零值。当控件条处于停靠状态或浮动状态时，为0。
bHorz | 指明控件条是水平放置还是垂直放置的。水平放置时为非零值，否则为0。

说明：
本函数用于计算控件条的水平大小。
象工具条那样的控件条可以水平或垂直扩展以显示其中的按钮。如果bStretch为TRUE，则在bHorz提供的方向上扩展。下表列出了可能的排列：
bStretch | BHorz | 伸展与否 | 方向 | 是否停靠
TRUE | TRUE | 水平伸展 | 水平 | 否
TRUE | FALSE | 垂直伸展 | 垂直 | 否
FALSE | TRUE | 不伸展 | 水平 | 是
FALSE | FALSE | 不伸展 | 垂直 | 是

请参阅：CControlBar::CalcDynamicLayout


 CControlBar::EnableDocking

void EnableDocking( DWORD dwStyle );

参数：
dwStyle指定是否允许控件条处于停靠状态和它在父窗口中停靠的位置。停靠位置参数如下：
· | CBRS_ALIGN_TOP | 允许停靠在客户区的上方。
· | CBRS_ALIGN_BOTTOM | 允许停靠在客户区的下方。
· | CBRS_ALIGN_LEFT | 允许停靠在客户区的左边。
· | CBRS_ALIGN_RIGHT | 允许停靠在客户区的右边。
· | CBRS_ALIGN_ANY | 允许停靠在客户区的任意一边
· | CBRS_FLOAT_MULTI | 允许在一个小的框架窗口中浮动有多个控件条。
为0时（即没有指明标志）不允许停靠控件条。

说明：
本函数设置是否允许控件条处于停靠状态。可以给控件条指定停靠位置。

请参阅：
CFrameWnd::EnableDocking, CFrameWnd::DockControlBar, CFrameWnd::FloatControlBar, CControlBar::SetBarStyle


 CControlBar::GetBarStyle

DWORD GetBarStyle( ):

返回值：
返回控件条当前的CBRS_设置值。参阅CControlBar::SetBarStyle。

说明：
本函数用于取得当前对控件条的CBS_设置（控件条风格）。但不处理WS_设置（窗口风格）。

请参阅：CControlBar::SetBarStyle


 CControlBar::GetBorders

CRect GetBorders ( ) const;

返回值：
返回一个CRect类型的对象，其中记录了控件条对象的每一边的宽度（以像素为单位）。例如，它的成员left就记录了左边框的宽度。

说明：本函数返回控件条的当前边框值。

请参阅：CControlBar::SetBorders


 CControlBar::GetCount

int GetCount( ) const;

返回值：
返回CControlBar对象中的非HWND型的项的个数。对于CDialogBar对象来说，返回0。

说明：
本函数返回CControlBar对象中的非HWND型的项的个数。项的类型取决于派生对象：CStatusBar对象对应于面板，CToolBar对象对应于按钮和分隔符。

请参阅：
CToolBar::SetButtons, CStatusBar::SetIndicators, CStatusBar, CToolBar, CDialogBar


 CControlBar::GetDockingFrame

CFrameWnd* GetDockingFrame( ) const;

返回值：
调用成功时返回一个指向框架窗口的指针，否则返回NULL。

说明：
本函数用于取得控件条停靠的当前框架窗口的指针。
要了解有关可停靠的控件条的更详细的信息，请参阅CcontrolBar::EnableDocking和CFrameWnd::DockControlBar。

请参阅：
CControlBar::EnableDocking, CFrameWnd::DockControlBar


 CControlBar::IsFloating

BOOL IsFloating( ) const;

返回值：
如果控件条是浮动的，则返回非零值，否则为0。

说明：
本函数用于判断控件条是处于浮动状态的还是停靠状态。
要把控件条从停靠状态改成浮动状态，可以调用函数CFrameWnd::Float-ControlBar。

请参阅：CFrameWnd::FloatControlBar


 ControlBar::OnUpdateCmdUI

virtual void OnUpdateCmdUI( CFrameWnd* pTarget, BOOL bDisableIfNoHndler ) = 0;

参数：
pTarget | 指向应用主框架窗口的指针。该指针用于确定更新消息的路由。
bDisableIfNoHndler | 是一个标志。指明没有更新句柄的控件是否该自动地显示为禁止存取状态。

说明：
本成员函数由框架调用，更新工具条或状态条的状态。
要更新单个按钮或面板，可以在消息映射中使用宏ON_UPDATE_COMMAND_UI来设置更新处理函数的句柄。参阅ON_UPDATE_COMMAND_UI。
应用在空闲时调用OnUpdateCmdUI。待更新的框架窗口必须是一个可视框架窗口的子窗口。OnUpdateCmdUI是可以覆盖的。

请参阅：
ON_UPDATE_COMMAND_UI, “技术指南31:控件条”


 CControlBar::SetBarStyle

void SetBarStyle( DWORD dwStyle );

参数：
dwStyle控件条的风格。可能的取值如下：
· | CBRS_ALIGN_TOP | 允许停靠在框架窗口的客户区的上方。
· | CBRS_ALIGN_BOTTOM | 允许停靠在客户区的下方。
· | CBRS_ALIGN_LEFT | 允许停靠在客户区的左边。
· | CBRS_ALIGN_RIGHT | 允许停靠在客户区的右边。
· | CBRS_ALIGN_ANY | 允许停靠在客户区的任意一边。
· | CBRS_BORDER_TOP | 在控件条变为可视时，在它的上边绘制一个边框。
· | CBRS_BORDER_BOTTOM | 在控件条变为可视的时，在它的下边绘制一个边框。
· | CBRS_BORDER_LEFT | 在控件条变为可视的时，在它的左边绘制一个边框。
· | CBRS_BORDER_RIGHT | 在控件条变为可视的时，在它的右边绘制一个边框。
· | CBRS_FLOAT_MULTI | 允许在一个小的框架窗口中浮动有多个控件条
· | CBRS_TOOLTIPS | 显示控件条的工具提示。
· | CBRS_FLYBY | 让消息文本和工具条提示同时更新。
· | CBRS_GRIPPER | 为任何派生于CControlBar的类绘制一个夹子（grippper）。

说明：
本函数用于设置控件条的CBRS_风格。但不影响WS_型风格的设置。

请参阅：CControlBar::GetBarStyle


 CControlBar::SetBorders

void SetBorder( int cxLeft, int cyTop, int cxRight, int cyBottom );
void SetBorder( LPCRECT lpRect );

参数：
cxLeft | 控件条左边界的宽度（以像素为单位）。
cyTop | 控件条上边界的高度。
cxRight | 控件条右边界的宽度。
cyBottom | 控件条下边界的高度。
lpRect | CRect对象的指针。该对象中记录了控件条对象每边的宽度（以像素为单位）。

说明：
本函数用于设置控件条边界的大小。例如，下面的例子把控件条的上边框和下边框分别设为5个像素点，把左边框和右边框设为2个像素点。
m_myControlBar.SetBorders(2, 5, 2, 5);

请参阅：CControlBar::GetBorders


 CControlBar::m_bAutoDelete

说明：
m_bAutoDelete是一个BOOL类型的公有变量。如果在撤消Windows控件条对象时非零，则删除CControlBar对象。
控件条对象通常嵌入在一个主框架窗口中。此时m_bAutoDelete为0，因为当框架窗口撤消时会自动地撤消控件条对象。
如果在堆中分配了一个CControlBar对象又不想用delete删除它，则把这个变量设为非零值。

请参阅：CWnd::DestroyWindow


 CCreateContext

CCreateContext没有基类。
在主程序创建框架窗口、以及文档相关的视图时，会使用CCreateContext结构。建立窗口时，此结构中的值用于连接构成文档的组件和文档数据的视图。仅当覆盖了创建过程时才需要使用CCreateContext。
CCreateContext结构包含了指向文档、框架窗口和文档模板的指针，包括了一个CRuntimeClass指针，CRuntimeClass标志了待创建的视图的类型。运行时类信息和当前文档指针用于动态地创建视图。下表列出了CCreateContext的每个成员的用法：
成员 | 用途
m_pNewViewClass | 待创建的视图的CRuntimeClass
m_pCurrentDoc | 将在其上创建视图的文档
m_pNewDocTemplate | 待创建的新MDI框架窗口的文档模板
m_pLastView | 待创建视图所依据的原始视图，例如在创建分裂窗口的视图或文档的第二个框架窗口时
m_pCurrentFrame | 待创建框架窗口所依据的框架窗口，例如在文档上创建第二个框架窗口时

当在文档模板上创建一个文档及其相关的组件时，它检查存储在CCreateContext结构中的信息的有效性。例如，不能在一个不存在的文档上建立视图。
注意：
CCreateContext结构中的所有指针都是可选的，在不需要或者未知时可设为NULL。
“请参阅”部分列出的函数会用到CCreateContext结构。在覆盖这些函数之前，最好看以下对它们的详细说明。
以下是一些通用的指导原则：
· | CCreateContext作为创建窗口时的参数，如CWnd::Create、CFrameWnd:Create和CFrameWnd::LoadFrame，CCreateContext指定了新窗口应连接到的地方。对多数窗口来说，整个结构都是可选的，可传递一个NULL指针。
· | 对于可覆盖的函数，例如CFrameWnd::OnCreateClient，参数CCreateContext也是可选的。
· | 对那些在创建视图时使用的函数来说，必须在调用时提供足够的信息以建立视图。例如，对分裂窗口中的第一个视图，必须提供视图的类信息和当前的文档。
一般说来，如果使用了框架的缺省设置，就可以忽略CCreateContext结构。如果想进行一些高级的修改，MFC类库源代码或例子程序（如VIEWEX）可以提供参考。如果记不清参数的使用，框架中提供的断言将有助于发现参数使用的错误。
要了解有关CCreateContext的更详细的信息，请参阅MFC的例子VIEWEX。
#include <afxext.h>

请参阅：
CFrameWnd::Create, CFrameWnd::LoadFrame, CFrameWnd::OnCreateClient, CSplitterWnd::Create, CSplitterWnd::CreateView, CWnd::Create


 CCriticalSection

CObject
└CSyncObject
└CCriticalSection

类CCriticalSection的对象表示一个“临界区”，它是一个用于同步的对象，同一时刻只允许一个线程存取资源或代码区。临界区在控制一次只有一个线程修改数据或其它的控制资源时非常有用。例如，在链表中增加一个结点就只允许一次一个线程进行。通过使用CCriticalSection对象来控制链表，就可以达到这个目的。
在运行性能比较重要而且资源不会跨进程使用时，建议采用临界区代替信号灯。有关在MFC中使用信号灯的详细信息，请参阅CMutex。使用CCriticalSection对象之前，需要构造它。在构造函数返回后，就可以使用临界区了。在使用完之后要调用UnLock函数。
存取由CCriticalSection控制的资源时，要在资源的存取函数中定义一个CSingleLock型的变量。然后调用加锁对象的Lock成员函数（如CSingleLock::Lock）。此时，调用的线程要么获得对资源的存取权，要么等待他人释放资源等待加锁，或者等待他人释放资源，但又因为超时而加锁失败。这样就保证了一次只有一个线程在存取临界资源。释放资源只需调用成员函数UnLock（例如CSingleLock:Unlock），或让锁对象在作用范围之外。
此外，可以单独地建立一个CCriticalSection对象，并在存取临界资源之前显式地存取它。这种方式有助于保持代码的清晰，但是更容易出错，因为程序员要记住在存取临界资源前加锁，存取之后开锁。
要了解有关使用CCriticalSection对象的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“多线程：如何使用同步类”。
#include <afxmt.h>
请参阅：CMutex

CCriticalSection类的成员

构造函数
CCriticalSection 构造一个CCriticalSection对象

方法
UnLock | 释放CCriticalSection对象上的锁
Lock | 在CCriticalSection对象上加锁


 CCriticalSection::CCriticalSection

CCriticalSection( );

说明：
构造一个CCriticalSection对象。存取或者释放一个CCriticalSection对象，要先建立一个CSiingleLock对象，并调用它的Lock和UnLock成员函数。如果CCriticalSection对象是独占使用的，需要调用它的UnLock成员函数以释放对它的占用。


 CCriticalSection::Lock

BOOL Lock( );
BOOL Lock( DWORD dwTimeout );

返回值：调用成功时返回非零值，否则为0。

参数：
dwTimeoutLock 忽略此参数的值。

说明：
本函数用于取得对临界区对象的存取权。Lock是一个成块性的操作，直到取得临界区对象的存取权才返回。
如果需要设置加锁的超时时间，可以用CMutex来代替CCriticalSection对象。

请参阅：CSingleLock::Lock


 CCriticalSection::UnLock

virtual BOOL UnLock( );

返回值：
如果临界区是被本线程占用的并且开锁成功，则返回非零值。否则为0。

说明：
本函数释放线程占用的CCriticalSection对象。如果CCriticalSection是单独使用的，在独占使用完临界资源以后，应尽快调用UnLock开锁。
如果使用了CSingleLock对象，CCriticalSection::Unlock将会在它的成员函数Unlock中调用。


 CCtrlView

CObject
└CCmdTarget
└CWnd
└CView
└CCtrlView

类CCtrlView和它的派生类CEditView，CListView，CTreeView和CRichEditView，使文档视图结构适应于Windows 95和Windows NT 3.51及更高版本中新的通用控件。
要了解有关文档视图结构的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“文档/视图体系结构主题”。
#include <afxwin.h>

请参阅：CTreeView, CListView, CRichEditView

CCtrlView类的成员

构造函数
CCtrlView 构造一个CCtrlView对象

数据成员
m_strClass | 包含了视图类的Windows类名
m_dwDefaultStyle | 包含了视图类的缺省风格


 CCtrlView::CCtrlView

CCtrlView( LPCTSTR lpszClass, DWORD dwStyle );

参数：
lpszClass | 视图类的Windows类名。
dwStyle | 视图类的风格。

说明：
本函数构造一个CCtrlView对象。创建一个新框架窗口或者分裂窗口时由主程序调用。可以覆盖CView::OnInitialUpdate在附加文档之后初始化视图。可以调用CWnd::Create或CWnd::CreateEx创建Windows对象。

请参阅：CWnd::PreCreateWindow


 CCtrlView::m_dwDefaultStyle

DWORD m_dwDefaultStyle

说明：
m_dwDefaultStyle包含了视图类的缺省风格。创建窗口时适用此风格。

请参阅：CCtrlView::m_strClass


 CCtrlView::m_strClass

CString m_strClass

说明：m_strClass包含了视图类的Windows类名。

请参阅：CCtrlView::m_dwDefaultStyle


 CDaoDatabase

CObject
└CDaoDatabase

类CDaoDatabase代表了一个数据库连接。使用它可以操纵数据库中的数据。有关支持的数据库格式，请参阅成员函数GetName。在一个给定工作区（由CDaoWorspace对象代表）中，同时可以有多个活动的CDaoDatabase对象。工作区维护了一组开放数据库对象——数据库连接。
注意：
MFC DAO数据库类与那些基于ODBC的MFC数据库类是不同的。所有的DAO数据库类的名字都有CDao前缀。类CDaoDatabase提供了一个类似于ODBC类CDabase的接口。二者主要的不同在于：CDatabse是通过ODBC和ODBC驱动程序存取数据库的，而CDaoDatabase则是通过数据存取对象（Data Acess Object，DAO）存取数据库的。DAO基于Microsoft Jet数据库引擎。一般说来，基于DAO的MFC类比基于ODBC的类处理能力更强。基于DAO的类可以通过ODBC驱动也可以经由自己的数据库引擎存取数据。基于DAO的类也支持数据定义操作（DDL），比如不用直接调用DAO而通过类建立表。

用法
在创建记录集时，可以隐式地建立数据库对象，也可以显式地创建数据库对象。要显式地通过CDaoDatabase利用现有的数据库，只需：
· | 构造一个CDaoDatabase对象，向打开的CDaoWorkspace对象传送它的指针。
· | 或者不指定工作区而构造一个CDaoDatabase对象（MFC会建立一个临时的工作区）。
建立一个新的Microft Jet数据库（.MDB），要构造一个CDaoDatabase对象并且调用它的成员函数Create。 在调用Create之后不要再调用Open。
打开一个现有的数据库，要构造一个CDaoDatabase对象并且调用它的成员函数Open。
上面的这些方法都把DAO数据库对象添加到工作区的Databases集合中，并在数据上建立一个连接。以后需要构造CDaoRecordset，CDaoTableDef或CDaoQueryDef来操纵连接上的数据库，要向它们的构造函数传送CDaoDatabase对象的指针。使用完连接之后，要调用成员函数Close并撤消CDaoDatabase对象。Close会关闭所有没有关闭的记录集。

事务
在工作区级支持数据库的事务处理。参阅类CDaoWorkspace的成员函数BeginTrans，CommuitTrans和Rollback。有关更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DaoWorkspace：管理事务”。

ODBC连接
建议在使用ODBC数据源时把外部表连到一个Microsoft Jet数据库（.MDDB）。有关更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO扩展：处理外部数据源”。

收集
每个数据库都拥有自己的表定义、查询定义、记录集和关系对象的收集。类CDaoDatabase提供了操纵这些对象的成员函数。
注意：
上述对象存储在DAO中，而不是存储在ODBC对象中。MFC提供了支持表定义、查询定义和记录集对象的类，但没有支持关系对象的类。
要了解有关CDaoDatabase的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO 数据库”。
#include <afxdao.h>

请参阅：
CDaoWorkspace, CDaoRecordset, CDaoTableDef, CDaoQueryDef, CDatabase, CDaoException

CDaoDatabase类的成员

数据成员
m_pWorkspace | 包含了数据库并定义了事务空间的CDaoWorkspace对象的指针
m_pDAODatabase | 所属的DAO数据库对象的指针

构造函数
CDaoDatabase 构造一个CDaoDatabase对象。调用Open可以与数据库建立连接

属性
CanTransact | 如果数据库支持事务，则返回非零值
CanUpdate | 如果CDaoDatabase对象是可更新的，返回非零值
GetConnect | 返回连接数据库的连接参数（连接字符串）。用于ODBC
GetName | 返回当前使用的数据库的名字
GetQueryTimeout | 返回对数据库查询操作设置的超时时间（以秒为单位）。影响随后的打开、增加、更新和编辑操作以及ODBC数据源上的其它操作（如Execute调用）
GetRecordsAffected | 返回最后一次更新、编辑、增加操作或Execute调用所影响的记录数
GetVersion | 返回与数据库相关的数据库引擎的版本
IsOpen | 如果CDaoDatabase对象正连接到数据库上，则返回非零值
SetQueryTimeout | 设置数据库查询操作的超时时间（以秒为单位）。仅用于ODBC数据源。影响随后所有的打开、添加、更新和删除操作

操作
Close | 关闭数据库连接。
Create | 创建下面的DAO数据库对象并初始化CDaoDatabase对象
CreateRelation | 在数据库中的表之间定义一个新的联系
DeleteQueryDef | 删除数据库的QueryDefs集合中的一个查询定义对象
DeleteRelation | 删除数据库中表之间的一个联系
DeleteTableDef | 删除数据库中某个表定义。将删除表定义和表中的数据
Execute | 执行一个查询。为查询调用Execute可以返回结果，在出错时会产生异常
GetQueryDefCount | 返回数据库中查询的个数
GetQueryDefInfo | 返回数据库中指定查询的定义信息
GetRelationCount | 返回数据库中表之间定义的联系的个数
GetRelationInfo | 返回数据库中指定的表间联系的信息
GetTableDefCount | 返回数据库中表的个数
GetTableDefInfo | 返回数据库中指定表的信息
Open | 建立一个数据库连接


 CDaoDatabase::CanTransact

BOOL CanTransact( );
throw( CDaoExeception, CMemoryException );

返回值：
如果数据库支持事务，则返回非零值，否则为0。

说明：
本函数用于检测数据库是否支持事务。事务在数据库的工作区中处理。有关事务的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO工作区：管理事务”。

请参阅：
CDaoWorkspace::BeginTrans, CDaoWorkspace::CommitTrans, CDaoWorkspace::Rollback


 CDaoDatabase::CanUpdate

BOOL CanUpdate( );
throw( CDaoException, CMemoryException );

返回值：
如果CDaoDatabase对象允许更新，则返回非零值，否则为0，说明在打开CDaoDatabase对象时bReadOnly为TRUE，或者数据库本来就是只读的。参阅Open。

说明：
本函数用于检测CDaoDatabase对象是否允许更新。有关数据库是否可以更新的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集操作”和DAO帮助中的“可更新的特性”。


 CDaoDatabase::CDaoDatabase

CDaoDatabase::(CDaoWorkspace* pWorkspace = NULL );

参数：
pWorkspace 一个CDaoWorkspace指针。将记下新创建的数据库对象。如果使用了缺省值NULL，本构造函数将创建一个使用缺省的工作区的临时CDaoWorkspace对象。可以通过数据成员m_pWorkspace获得工作区对象的指针。

说明：
本函数构造一个CDaoDatabase对象。在构造该对象之后，如要建立一个新的Microsoft Jet数据库，可以调用它的成员函数Create。如果是打开一个现有的数据库，则调用成员函数Open。
当使用完该对象之后，需要调用它的Close函数并随后撤消它。
有时在文档类中嵌入CDaoDatabase对象很有用。
注意：
如果在打开CDaoRecordset对象时没有指定一个CDaoDatabase对象指针，也会隐式地建立一个CDaoDatabase对象。在关闭该记录集时也就关闭了这个CDaoDatabase对象。
要了解有关工作区的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO工作区”。有关使用CDaoDatabase对象的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO 数据库”。


 CDaoDatabase::Close

virtual void Close( );

说明：
本函数将断开与数据库的连接并关闭该数据库的所有记录集、表定义和查询定义。最好在调用本函数之前自己关闭这些对象。关闭CDaoDatabase对象就是在工作区中的数据库集合里删除它。但是Close并不会撤消该对象，此后还可以再用它来打开数据库。
警告：
如果有没有真正提交的编辑操作，关闭数据库之前要调用Update和所有打开的记录集上的Close函数。在退出一个在堆栈中创建CDaoRecordset或CDaoDatabase对象的函数时，将关闭数据库，将丢失所有未保存的修改，所有未提交的事务都会回滚，所有未提交的修改将丢失。
警告：
如果在还有打开的记录集对象时试图关闭数据库，或者在工作区中还有打开的数据库时关闭该工作区，未关闭的记录集将会被关闭，而所有未提交的修改将被回滚。
如果在关闭工作区对象时还有打开的数据库对象，则在关闭工作区的同时也会关闭这些数据库对象，从而也关闭那些没有关闭的记录集对象。如果没有关闭数据库对象，在MFC的调试状态下会报告一个断言失败错误。
如果数据库对象是在函数之外定义的，而在退出函数时没有关闭它，数据库对象将一直保持打开，直到显式地关闭它或者它所在的模块不再有效了。
要了解有关CDaoDatabase对象的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO 数据库”。相关信息，可以参阅DAO帮助中的“Close方法”。

请参阅：
CDaoDatabase::Open, CDaoRecordset::Close, CDaoWorkspace::Close, CDaoQueryDef::Close, CDaoTableDef::Close


 CDaoDatabase::Create

virtual void Create( LPCTSTR lpszName, LPCTSTR lpszLocale = dbLangGeneral, int dwOptions = 0 );
throw( CDaoException, CMemoryException );

参数：
lpszName 字符串表达式，指明待创建的数据库文件的名字。可以带全路径名，如“C:\\MYDB.MDB”。文件名不能省略，但可以省略扩展名。缺省的扩展名为.MDB。如果网络支持唯一命名约定（Uniform NamingConvention，UNC），那么也可以使用网络路径，如“\\\\MYSERVER\\MYSHARE\\MYDIR\\MYDB”。此成员函数只能创建Microsoft Jet(.MDB)数据库文件（文件路径表达式中要采用双反斜杠“\\”，因为反斜杠“\”是C++中的控制符。）
lpszLocale字符串表达式。用于指定创建数据库时的理序。缺省值为dbLangGeneral。可能的取值如下：
· | dbLangGeneral | 英语、德语、法语、葡萄牙语、意大利语和现代西班牙语
· | dbLangArabic | 阿拉伯语
· | dbLangCyrillic | 俄语
· | dbLangCzech | 捷克语
· | dbLangDutch | 荷兰语
· | dbLangGreek | 希腊语
· | dbLanghebrew | 希伯莱语
· | dbLangHungarian | 匈牙利语
· | dbLangIcelandic | 冰岛语
· | dbLangNordic | 北欧语（仅有Microsoft Jet数据库引擎1.0版支持）
· | dbLangNorwdan | 挪威语
· | dbLangPolish | 波兰语
· | dbLangSpanish | 传统西班牙语
· | dbLangSwedfin | 瑞典语和芬兰语
· | dbLangTurkish | 土耳其语
dwOptions一个标识了一个或多个选项的整数。可能的值如下：
· | dbEncrypt | 创建一个加密的数据库
· | dbVersion10 | 创建Microsoft Jet数据库1.0版的数据库
· | dbVersion11 | 创建Microsoft Jet数据库1.1版的数据库
· | dbVersion20 | 创建Microsoft Jet数据库2.0版的数据库
· | dbVersion30 | 创建Microsoft Jet数据库3.0版的数据库
如果忽略了加密常量，则创建的是未加密的数据库。与版本有关的常量只能指定其中的一个。缺省的版本是Microsoft Jet数据库3.0版。
警告：
如果数据库没有加密，即使设置了用户/口令，用户也可以通过操作系统直接读写数据库对应的磁盘文件。

说明：
在构造了一个CDaoDatabase对象之后，就可以调用此函数创建一个新的Microsoft Jet数据库。它创建数据库文件以及其下的DAO数据库对象，并初始化该C++对象。该DAO数据库对象被添加到相应工作区中的Databases集合中。此时数据库对象已经处于打开状态了，在调用Create后不需要再调用Open来打开数据库对象。
注意：
使用此函数只能创建Microsoft Jet数据库（.MDB)，而不能创建ISAM数据库或ODBC数据库。
要了解有关数据库的更详细的信息，请参阅参阅联机文档“Visual C++程序员指南”中的“DAO 数据库”。相关信息，可以参阅DAO帮助中的“CreateDatabase方法”。

请参阅：CDaoDatabase::CDaoDatabase


 CDaoDatabase::CreateRelation

void CreateRelation( LPCTSTR lpszName,
LPCTSTR lpszTable,
LPCTSTR lpszForeignTable,
long lAttributes,
LPCTSTR lpszField,
LPCTSTR lpszForeignField
);
throw( CDaoException, CMemoryException );

void CreateRelation( CDaoRelationInfo& relinfo );
throw( CDaoException,CMemoryException );

参数：
lpszName | 关系对象的唯一命名。名字必须以字母打头，最多可以有40个字符。可以有数字和下划线，但不能包含标点符号和空格。
lpszTable | 关系中主表的名字。如果指定的表不存在，MFC会产生一个CDaoExecption类型的异常。
lpszForeignTable | 关系中外表的名字。如果指定的表不存在，MFC会产生一个CDaoExecption类型的异常。
lAttributes关系的类型。是一个long型值。可以用它来增强参照完整性。可以使用位操作OR（|）组合下面的值（只要该组合是有意义的）。
· | dbRelationUnique | 一对一的关系。
· | dbRelationDontEnforce | 非强制关系（没有参照完整性限制）。
· | dbRelationInherited | 关系的两个表不在当前数据库中。
· | dbRelationUpdateCacade | 级联更新（参阅说明部分对级联更新的解释）。
· | dbRelationDeleteCacade | 级联删除。
lpszField | 指向字符串（以null结尾）的指针。字符串中包含了主表（由lpszTable指定）的字段名。
lpszForeignField | 指向字符串（以null结尾）的指针。字符串中包含了外表（由lpszForeignTable指定）的字段名。
rRefinfo | 对一个CDaoRelationInfo对象的参考。该对象包含了待创建的关系的有关信息。

说明：
本函数用于在主表的一个或多个字段与外表的一个或多个字段间建立一个关系。关系不能用于查询或从外部数据库来的表。
如果两个表都只用一个字段，则可以采用本函数的第一个版本。否则就使用第二个版本。单个关系中使用的字段的最大个数为14。
本函数创建了一个DAO关系对象，但这是MFC的实现细节，因为MFC在类CDaoDatabase中实现了对关系对象的封装。MFC未提供关系类。
如果关系对象的属性设置允许级联操作，在关系的主表的记录改变或删除时，数据库引擎就会自动地更新或删除一个或多个相关表中的相关记录。
例如，假设在Customers表和Orders表之间建立了一个允许级联删除的关系。在Customers表中删除记录时，Orders表中与被删除记录相关的记录也会被删除。此外，如果在Orders表与其它的表之间也建立了允许级联删除的关系，则在Customers表中删除记录时，那些表的相关记录也会被删除。
更详细的信息，请参阅DAO帮助中的“CreateRelation方法”。

请参阅：CDaoDatabase::DeleteRelation


 CDaoDatabase::DeleteQueryDef

void DeleteQueryDef( LPCTSTR lpszName );
throw( CDaoException, CMemorryException );

参数：
lpszName 待删除的查询名。

说明：
本函数用于从CDaoDatabase对象的QueryDefs集合中删除一个指定的查询定义——保存起来的查询。此后，该查询就不在数据库中了。
要了解有关创建查询定义对象的信息，请参阅类CDaoQueryDef。如果在构造CDaoQueryDef对象时给构造函数传递了数据库对象的指针，则构造出来的查询定义对象就与该CDaoDatabase对象相联系了。
要了解有关查询定义的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。相关信息，可以参阅DAO 帮助中的“Delete方法”。

请参阅：
CDaoQueryDef::Create, CDaoDatabase::CreateRelation, CDaoTableDef::Create


 CDaoDatabase::DeleteRelation

void DeleteRelation( LPCTSTR lpszName );
throw( CDaoException, CMemoryException );

参数：
lpszName 待删除的关系名。

说明：
本函数从数据库对象的关系集合中删除一个关系。此后该关系就不存在了。
相关信息，请参阅DAO帮助中的“Delete方法”。

请参阅：
CDaoDatabase::CreateRelation, CDaoTableDef::Create, CDaoQueryDef::Create


 CDaoDatabase::DeleteTableDef

void DeleteTableDef( LPCTSTR lpszName );
throw( CDaoException, CMemoryException );

参数：
lpszName 待删除的表定义的名字。

说明：
本函数从数据库对象的TableDefs集合中删除指定的表及其数据。此后该表就不在数据库中了。
警告：千万不要删除系统表。
要了解有关创建表定义对象的信息，请参阅类CDaoTableDef。如果在构造CDaoTableDef对象时给构造函数传递了数据库对象的指针，则构造出来的表定义对象就与该CDaoDatabase对象相关系了。
要了解有关表定义的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO TableDef”。相关信息，可以参阅DAO 帮助中的“Delete方法”。

请参阅：
CDaoTableDef::Create, CDaoQueryDef::Create, CDaoDatabase::CreateRelation


 CDaoDatabase::Execute

void Execute( LPCTSTR lpszSQL, int nOptions = 0);
throw( CDaoException,CMemoryException );

参数：
lpszSQl 指向一个以null结尾的字符串。该字符串是一个待执行的有效SQL语句。
nOptions一个指定查询完整性选项的整数。可以使用位操作OR（|）组合下述的常量（假设该组合是有意义的——例如，不能组合使用dbInconsistent和dbConsistent）。
· | dbDenyWrite | 不允许其它用户同时在写。
· | dbInconsistent | （缺省设置）不一致更新。
· | dbConsistent | 一致更新。
· | dbSQLPassThrough | 传送SQL语句。即把SQL语句传送给ODBC数据源处理。
· | dbFailOnError | 出错时回滚更新。
· | dbSeeChanges | 其它用户正在改变本用户正编辑的数据，则产生运行时错误。
注意：
如果dbInconsistent和dbConsistent都被选中，或者都没有选中，则采用缺省设置dbInconsistent。有关这些常量的解释，请参阅DAO帮助中的“Execute方法”。

说明：
本函数用于在数据库上执行动作查询或SQL命令。它只用于不返回结果的动作查询和SQL命令。它不能用于选择查询，因为选择查询会返回结果。
要了解有关动作查询的定义，请参阅DAO帮助中的“动作查询”和“Execute方法”。
提示：
在给出了语法上正确的SQL语句并有相应的权限，Execute可以同时修改或删除多行。不过，在使用Execute进行更新或删除时，最好使用dbFailOnError选项。设置了该选项后，如果有的待更新或删除的记录被别的用户上了锁，MFC就会产生一个CDaoException类型的异常并回滚此调用中所有成功的修改。总可以调用GetRecordsAffected来查看Execute调用影响到的记录数。调用GetRecordsAffected可以查看最近的Execute调用影响到的记录数。例如，它可以返回一次动作查询中删除、更新或插入的记录数。注意，返回的数目没有反映级联更新或级联删除的效应。
Execute函数不返回记录集。如果使用它执行一个要返回记录集的查询，MFC将会产生一个CDaoException类型的异常（没有对应于CDatabase::ExecuteSQL的ExecuteSQL成员函数）。
要了解有关使用Execute函数的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO QueryDef:使用查询定义”


 CDaoDatabase::GetConnect

CString GetConnect( );
throw( CDaoException, CMemoryException );

返回值：
如果此前在ODBC数据源上已成功地调用Open函数，则返回连接（字符）串。否则，返回空串。对于Microsoft Jet数据库来说，通常返回的都是空串；除非在使用Execute的选项dbSQLPassThrough时设置了它，或者是在打开记录集时使用了它。

说明：
本函数返回把CDaoDatabase对象连接到一个ODBC数据源或ISAM数据库时使用的连接串。连接串提供了开放数据库的数据源的信息或在传送式查询中使用的数据库的信息。它由数据库类型描述符由0个或多个由分号隔开的参数组成。有关DAO中的连接串的更详细的信息，请参阅DAO帮助中的“Connect属性”部分。
重点：
采用MFC的DAO类通过ODBC连接到数据源比用附加表（attachedtable）连接效率要低一些。要了解更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO 扩展: 使用外部数据源”。
注意：
连接串用于在必要时向ODBC或ISAM驱动程序传送附加的信息。对于.MDB数据库来说是不必要的。对Microsoft Jet数据库中的基表，连接串为空串，除非在SQL传送型查询中使用了它（参阅上面的“返回值”部分）。
至于连接串是如何创建的，请参阅Open函数。一旦在Open调用中设置了连接串，以后就可以用它来检查设置，判断数据库的类型、路径、用户ID、口令及ODBC数据源。
要了解有关连接串的语法，请参阅DAO帮助中的“Connect特性”。


 CDaoDatabase::GetName

CString GetName( );
throw( CDaoException, CMemoryException );

返回值：
调用成功时返回数据库文件的全路径和文件名。否则返回一个空的CString对象。

说明：
本函数用来取得当前打开的数据库的名字，即数据库文件的名字或注册的ODBC数据源的名字。如果网络支持唯一命名约定（Uniform NamingConvention，UNC），那么也可以使用网络路径，如“\\\\MYSERVER\\MYSHARE\\MYDIR\\MYDB”。（文件路径表达式中要采用双反斜杠“\\”，因为反斜杠“\”是C++中的控制符。）
取出的数据库名可以用作标题。如果函数出错，则产生一个CDaoException类型的异常。
重点：
在存取外部数据库时，为提高效率，建议把外部数据库的表附加到一个Microsoft Jet引擎数据库，而不要直接地连接到该数据源。
数据库类型由路径中的目录名或文件名指明，如下：
路径名指向 | 数据库类型
MDB文件 | Microsoft Jet 数据库（Microsoft Access）
包含.DBF文件的目录 | dBASE数据库
包含.XLS文件的目录 | Microsoft Excel数据库
包含.DBF文件的目录 | Microsoft Foxpro数据库
包含.PDX文件的目录 | Paradox数据库
包含相应格式的文本数据库文件的目录 | 文本格式的数据库
对于ODBC数据库，如Microsoft SQL Server和Oracle，数据库连接串标志了一个在ODBC中注册了的数据源名字（Data Source Name，DSN）。要了解有关附加外部表的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO扩展：附加外部表”。

请参阅：CDatabase::Open, CDatabase::GetConnect


 CDaoDatabase::GetQueryDefCount

short GetQueryDefCount( );
throw( CDaoException, CMemoryException );

返回值：返回数据库中定义的查询的个数。

说明：
本函数返回数据库对象的QueryDefs集合中定义的查询的个数。在需要使用QueryDefs中的每个查询定义时，调用此函数很有用。取得指定查询的信息，可以调用函数GetQueryDefInfo。
要了解有关查询和查询定义对象的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO 查询”和”DAO查询定义”。


 CDaoDatabase::GetQueryDefInfo

void GetQueryDefInfo( int nIndex, CDaoQueryDefInfo& querydefinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );
throw( CDaoException, CMemoryException );
void GetQueryDefInfo( LPCTSTR lpszName ,CDaoQueryDefInfo& querydefinfo , DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );
throw( CDaoException, CMemoryException );

参数：
nIndex | 在数据库的QueryDefs集合中定义的查询的索引（下标）。
querydefInfo | 对CDaoQueryDefInfo对象的一个参考。该对象记录了返回的信息。
dwinfoOptions指定从记录集中检索什么信息的选项。可用的选项如下：
· | AFX_DAO_PRIMARY_INFO | （缺省）名字，类型
· | AFX_DAO_SECONDARY_INFO | 名字、类型加上创建日期、最后修改日期、返回的记录数和是否允许更新
· | AFX_DAO_ALL_INFO | 上面的两种设置中的信息加上SQL语句、连接和ODBC超时设置
lpszName | 字符串。包含了数据库中定义的查询的名字，用于按名查找。

说明：
本函数用于获取数据库中定义的某个查询的各种信息。本函数的两个版本分别用于按数据库中QueryDefs集合中查询的索引查找和按名查找。
要了解有关在querydefinfo中返回的信息的说明，请参阅CDaoQueryDefInfo结构。该结构中有与上面对dwInfoOptions的描述中列出的信息项对应的成员。请求某一层次的信息，就包括了上一层次的信息（如设置AFX_DAO_SECONDARY_INFO时取得的信息包括了设置AFX_DAO_PRIMARY_INFO时取得的信息）。
要了解有关查询和查询定义对象的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询”和”DAO查询定义”。

请参阅：CDaoDatabase::GetQueryDefCount


 CDaoDatabase::GetQueryTimeOut

short GetQueryTimeOut( );
throw( CDaoException, CMemoryException );

返回值：
返回一个短整数。记录了以秒为单位的超时时间设置。

说明：
本函数返回在数据库上进行操作所设置的超时时间（以秒为单位）。操作超时可能是因为网络存取问题、查询处理的时间太长等等。超时设置影响所有在CDaoDatabase对象相关的记录集上的打开、增添、更新和删除操作。可以调用SetQueryTimeout更改当前的超时设置。在记录集打开之后改变超时设置，不会影响记录集采用的超时时间值。例如，随后的Move操作不会使用新设置的值。缺省值在数据库引擎初始化时进行初始化。
查询超时设置的缺省值在Windows注册表中取得。如果注册表中没有设置，则缺省值取60秒。但是并非所有的数据库都支持查询的超时设置。如果把查询的超时设置为0，就不会发生任何超时；与数据库的通信会挂起。在开发的过程中这是很有用的。如果调用本函数失败，MFC会产生一个CDaoExecption类型的异常。
要了解有关数据库对象的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO 数据库”。相关信息，请参阅DAO帮助中的“QueryTimeout特性”。

请参阅：CDaoWorkspace::SetLoginTimeout


 CDaoDatabase::GetRecordsAffected

long GetRecordsAffected( );
throw( CDaoException, CMemoryException );

返回值：
一个long型整数。记录了受影响的记录数。

说明：
本函数用于检测最近一次Execute调用所影响的记录数。返回值包括了由Execute执行的查询中删除、更新或插入的记录数。在使用级联规则时级联更新或删除的相关表的记录不计在内。
要了解有关数据库对象的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO数据库”相关信息。与本函数有关的信息，请参阅DAO帮助中的“RecordsAffected特性”。


 CDaoDatabase::GetRelationCount

short GetRelationCount( );
throw( CDaoException, CMemoryException );

返回值：
返回在数据库中定义的表间关系的个数。

说明：
本函数用于取得数据库中定义的表间关系的个数。在需要使用数据库的Releations集合中的每个关系的定义时，调用此函数很有用。调用函数GetRelationInfo可以取得指定关系的信息。
为考察关系这个概念，考虑表Suppliers和表Products，它们之间具有一对多的关系。在这个关系中，一个供应者可以供应一种或多种产品。此外的两种关系是一对一和多对多。
要了解有关数据库对象的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO数据库”。


 CDaoDatabase::GetRelationInfo

void GetRelationInfo(int nIndex, CDaoRelationInfo& relinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );
throw( CDaoException, CMemoryException );
void GetRelationInfo( LPCTSTR lpszName, CDaoRelationInfo& relinfo,DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );
throw( CDaoException, CMemoryException );

参数：
nIndex | 关系在数据库的Relations集合中的索引。用于按索引查找。
refinfo | 对一个CDaoRelationInfo对象的参考，记录了函数调用返回的信息。
dwInfoOptions指定从关系中检索哪些信息的选项。可用的选项如下：
· | AFX_DAO_PRIMARY_INFO | （缺省）名字、表和外表
· | AFX_DAO_SECONDARY_INFO | AFX_DAO_PRIMARY_INFO指定的信息加上属性和字段信息
字段信息是一个CDaoRelationFieldInfo对象，记录了关系的主表的字段。
lpszName | 字符串。包含了关系对象的名字，用于按名查找。

说明：
本函数用于取得数据库中指定关系的有关信息。它的两个版本分别用于按名检索和按索引检索。有关在refinfo中返回的信息的说明，请参阅结构CDaoRelationInfo。该结构中有对应于上面所述的dwInfoOptions选项的成员。
注意：
如果把关系对象的级联操作设成了活动状态，则在改变关系的主表中的记录时，Microsoft Jet数据库引擎会自动地更新或删除一个或多个相关表中的记录。例如，假设在Customers表和Orders表之间建立了一个允许级联删除的关系。在Customers表中删除记录时，Orders表中与被删除记录相关的记录也会被删除。此外，如果在Orders表与其它的表之间也建立了允许级联删除的关系，则在Customers表中删除记录时，那些表的相关记录也会被删除。
要了解有关数据库对象的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO数据库”。

请参阅：CDaoDatabase::GetRelationCount


 CDaoDatabase::GetTableDefCount

short GetTableDefCount();
throw( CDaoException, CMemoryException );

返回值：
返回在数据库中定义的表定义的个数。

说明：
本函数用于检索数据库中定义的表的个数。如果要对数据库的TableDefs集合中的所有表定义进行操作，调用本函数很有用。要取得指定表的信息，请参阅GetTableDefInfo。
要了解有关表和表定义的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO TableDef”。


 CDaoDatabase::GetTableDefInfo

void GetTableDefInfo ( int nIndex, CDaoTableDefInfo& tabledefinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );
throw( CDaoException, CMemoryException );
void GetTableDefInfo ( LPCTSTR lpszName, CDaoTableDefInfo& tabledefinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );
throw( CDaoException, CMemoryException );

参数：
nIndex | 数据库中TableDefs集合中表定义的索引，用于按索引查找。
tabledefinfo | 对一个CDaoTableDefInfo结构的参考，记录了返回的信息。
dwinfoOptions指定从表定义中检索哪些信息的选项。可用的选项如下：
· | AFX_DAO_PRIMARY_INFO | （缺省设置）名字、是否允许更新和属性
· | AFX_DAO_SECONDARY_INFO | AFX_DAO_PRIMARY_INFO指定的信息加上：创建日期、最后修改日期、源表名和连接
· | AFX_DAO_ALL_INFO | AFX_DAO_SECONDARY_INFO指定的信息加上有效性规则、有效性规则文本和记录数
lpszName | 指明表定义对象的名字的字符串，用于按名查找。

说明：
本函数用于取得数据库中某个表定义的信息。它的两个版本分别用于按名检索和按索引检索。
要了解有关在tabledefinfo中返回的信息的说明，请参阅结构CDaoTableDefInfo。该结构中有对应于上面所述的dwInfoOptions选项的成员。
警告：
设置选项AFX_DAO_ALL_INFO获取信息可能会比较慢。因为计算表中的元组数在表中元组很多时是比较耗时的。
要了解有关表和表定义对象的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO TableDef”。

请参阅：CDaoDatabase::GetTableDefCount


 CDaoDatabase::GetVersion

CString GetVersion( );
throw( CDaoException, CMemoryException );

返回值：
返回一个CString对象，其中记录了数据库对象相关的数据库文件的版本。

说明：
本函数用于检测Microsoft Jet数据库文件的版本。返回值以“主版本号．次版本号”的形式表示取得的版本（如3.0）。产品版本号由版本号（如3）、句点（.）和发行版本号（如0）组成。目前支持的版本有：1.0、2.0和3.0。
要了解有关数据库对象的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO数据库”。

请参阅：CDaoDatabase::Open


 CDaoDatabase::IsOpen

BOOL IsOpen( ) const;

返回值：
如果CDaoDatabase对象已经打开，则返回非零值，否则为0。

说明：
本函数用于检测某个CDaoDatabase对象当前是否处于打开状态。
要了解有关数据库对象的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO数据库”。

请参阅：CDatabase::Open


 CDaoDatabase::Open

virtual void Open( LPCTSTR lpszName, BOOL bExclusive = FALSE, BOOL bReadOnly = FALSE, LPCTSTR lpszConnect = _T(""));
throw( CDaoException, CMemoryException );

参数：
lpszName指定Microsoft Jet数据库文件名的字符串。如果该文件带有扩展名，也需要写上。如果用户的网络支持唯一命名约定（UNC），则也可以使用网络路径，例如“\\\\MYSERVER\\MYSHARE\\MYDIR\\MYDB”（文件路径表达式中要采用双反斜杠“\\”，因为反斜杠“\”是C++中的控制符）。
使用lpszName时有些需要注意的地方：
· | 如果指定的数据库文件已经被其它用户独占使用，则MFC会产生一个CDaoException类型的异常。可以捕获该异常以通知用户该数据库不可用。
· | 如果指定的是一个空串（“”），并且lpszConnect是“ODBC”，则会显示一个对话框，列出所有注册的ODBC数据源的名字，用户可以在列表中选择一个数据源。编程时最好避免直接地连接数据源，而采用关联表。要了解更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO 扩展: 使用外部数据源”
· | 如果参考的数据库不存在或者ODBC数据源无效，MFC会产生一个CDaoException类型的异常。
注意：
DAO的错误代码，请参阅头文件DAOERR.H。相关的文档有DAO帮助中的“可捕获的数据访问错误”

bExclusive | 一个布尔值，独占打开数据库时设置为TRUE，否则设置为FALSE（共享打开）。该参数未设置时，默认为共享打开方式。
bReadOnly | 一个布尔值。如果以只读方式打开数据库，则设置为TRUE，否则设置为FALSE（以读/写方式打开）。未设置该参数时，数据库以读/写方式打开。所有相关的记录集继承这个设置。
lpszConnect | 用于打开数据库的字符串。该字符串构成了ODBC连接的参数。必须指定独占的和只读参数以提供源字符串。相关语法，请参阅DAO帮助中的“Connect 特性”。如果待连接的数据库是一个Microsoft Jet数据库（.MDB），这个串为空（“”）。缺省值的语法_T（“”）同时提供了对Unicode和ANSI字符集的支持。

说明：
必须调用本函数对一个代表某个现存数据库的CDatabase对象进行初始化。它建立数据库和其下的DAO对象的联系。在初始化数据库对象之前是不能用它来构造记录集、表定义或查询对象的。本函数会把数据库对象添加到相关工作区的Databases集合中。
使用参数应该注意的地方：
·如果要打开的是一个Microsoft Jet数据库，用lpszName指定数据库文件的名字，lpszConnect只需传一个空串或者用户口令（格式为“；PWD=password”，仅当数据库设置了口令才行，并且只用于MDB数据库）。
·如果待打开的是一个ODBC数据源，需要在lpszConnect中传送一个有效的ODBC连接串，而把lpszName设为空串。 相关信息，请参阅DAO帮助中的“OpenDatabse方法”
重点：
为了提高存取外部数据源（包括ISAM和ODBC数据源）的效率，建议使外部数据源与一个Microsoft Jet数相关联，而不要直接连接到数据源。
连接的申请可能会超时，例如DBMS主机不可用了。在连接失败时，MFC会产生一个CDaoException类型的异常。
下面的说明仅适用于ODBC数据源：
如果连接的是一个ODBC数据源，而Open调用却没有连接所需的足够的信息，ODBC驱动程序会打开一个对话框，由用户选择数据源并提供相关的参数信息。在调用Open时，连接串lpszConnect是作为私有变量存储的，可以调用函数GetConnect取得。
也可以在调用Open之前打开一个自己的对话框从用户那里得到连接参数，例如口令等。然后把得到的信息加到连接串中传给Open。也可以保存连接串（例如把它保存到Windows注册文件中）,在下一次调用Open时就可以重用它了。
连接串也可用于多层次的登录授权（每一层次的登录对应于一个CDatabase对象），或转换与其它数据库相关的信息。
要了解有关连接串的信息，请参阅DAO帮助中的“Connect 特性”。

请参阅：CDatabase::CDatabase, CDatabase::Close


 CDaoDatabase::SetQueryTimeOut

void SetQueryTimeOut( short nSeconds );
throw( CDaoException, CMemoryException );

参数：
nSeconds 以秒为单位设置的查询超时时间。

说明：
本函数用于设置在连接的数据库上进行操作的超时时间。操作超时可能是因为网络存取的问题，或查询处理时间过长等等。想改变以后的查询的超时设置，就可以在打开记录集或在调用记录集的AddNew，Update或Delete成员函数之前调用本函数。本函数的超时设置影响此后所有与本CDatabase对象相关的记录集上的Open，AddNew，Update和Delete调用。在打开记录集之后调用本函数设置超时时间不会影响记录集的超时时间。例如，此后的Move操作就不使用设置的新值。
缺省的超时时间是60秒。但是并非所有的数据库都支持超时时间的设置。如果把超时时间设置为0，则实际上不会发生超时；与数据库的通信会被挂起。在开发过程中这可能比较有用。
相关信息，请参阅DAO帮助中的“QueryTimeout特性”。

请参阅：CDaoWorkspace::SetLoginTimeout


 CDaoDatabase::m_pDAODatabase

说明：
m_pDAODatabase包含了一个指向CDatabase对象下的DAO数据库对象的OLE接口的指针。在需要直接存取DAO接口时可以使用该指针。
要了解有关DAO数据库的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO数据库”。有关直接调用DAO的信息，请参阅“技术指南54”。


 CDaoDatabase::m_pWorkspace

说明：
m_pWorkspace包含了一个指向本数据库对象所在的工作区的指针。在需要直接存取工作区时可以使用此指针，例如获得工作区中Databases集合中其它数据库对象的指针。
要了解有关工作区的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO工作区”。


 CDaoException

CObject
└CException
└CDaoException

CDaoException对象表示了一个由MFC中基于DAO的数据库类产生的异常条件。类CDaoException包含了可用于检测异常原因的公有属性。CDaoException对象由DAO数据库类的成员函数构造和产生。
注意：
DAO数据库类和MFC中基于ODBC的数据库类是截然不同的。所有的DAO数据库类的命名中都包括CDao前缀。但仍可以采用DAO数据库类存取ODBC数据源。一般说来，在MFC中，基于DAO的类的处理能力比基于ODBC的类的处理能力要强；基于DAO的类可以通过ODBC数据源对应的数据库引擎存取ODBC数据源。基于DAO的类也支持数据定义语言（DDL）一类的操作，如通过类在数据库中建表，而勿须直接调用DAO。有关ODBC类产生的异常的信息，请参阅“CDBException”。
可以在CATCH表达式内存取处理异常的对象。也可以在应用中利用全局函数AfxThrowException产生自己的CDaoException对象。
在MFC中，所有的DAO错误都是作为异常出现，其类型为CDaoException。在捕获一个CDaoException类型的异常后，可以使用CDaoException的成员函数从存储于数据库引擎的Errors集合中的DAO错误对象中获得相关信息。每个错误发生时，就会把一个或多个错误对象放到Errrors集合中（通常集合中只会有一个错误对象；在使用ODBC数据源时，可能会出现多个错误对象。）在另一个DAO操作产生错误时，Errors集合将被清空，然后记下新的错误对象。那些不产生错误的DAO操作对Errors集合没有影响。
关于DAO错误的代码，请参阅头文件DAOERR.H。相关信息，请参阅DAO帮助中的“可捕获的数据存取错误”部分。
要了解有关异常处理以及CDaoException对象的更详细的信息，请参阅联机文档“Visual C++ 程序员指南”中的“异常”和“异常：数据库异常”。在“异常：数据库异常”中还包括了处理DAO中的异常的例子代码。
#include <afxdao.h>
请参阅：CException

CDaoException类的成员

数据成员
m_scode | 与错误相关的SCODE值
m_nAfxDaoError | 包含了MFC中DAO类的任何错误的扩展代码
m_pErrorInfo | 指向一个CDaoErrorInfo对象的指针，该对象记录了一个DAO错误对象的信息

构造函数
CDaoException 构造一个CDaoException对象

操作
GetErrorCount | 返回数据库引擎的Errors集合中的错误代码
GetErrorInfo | 返回Errors集合中某个错误的错误信息


 CDaoException::CDaoException

CDaoException( );

说明：
本函数构造一个CDaoException对象。通常，框架在它的代码产生一个异常时创建异常对象。很少需要在程序中显式地构造一个异常对象。如果需要在自己的代码中产生一个CDaoException异常，可以调用全局函数AfxThrowDao Exception。
然而，在通过MFC封装的DAO接口指针直接调用DAO时，就可能要显式地创建一个异常对象了。此时可能要从DAO中检索错误信息。假设利用到工作区的Databases集合的DAODatabases接口调用某个DAO方法时在DAO中出错了，可以如下检索错误信息：
1. | 构造一个CDaoException对象。
2. | 调用该异常对象的成员函数GetErrorCount判断在数据库引擎的Errors集合中有多少个错误对象（通常只有一个，但在使用ODBC数据源时会出现多个）。
3. | 调用该异常对象的成员函数GetErrorInfo利用错误在集合中的索引每次检索一个指定的错误对象。可以把该异常对象当作一个DAO错误对象的代理。
4. | 检查GetErrorInfo函数返回后数据成员m_pErrorInfo记录的CDaoErrorInfo结构。它的成员提供了DAO错误的信息。
5. | 如果使用的是ODBC数据源，则在必要时重复步骤3和4，以处理多个错误对象。
6. | 如果异常对象是在内存的堆中创建的，则在最后调用delete操作删除它。
要了解有关在MFC的DAO类中处理错误的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“异常：数据库异常”。


 CDaoException::GetErrorCount

short GetErrorCount( );

返回值：
数据库引擎的Errors集合中记录的DAO错误对象的个数。

说明：
本函数用于检索数据库引擎的Errors集合中记录的DAO错误对象的个数。该信息在检测Errors集合中的每个错误对象的信息时很有用。要通过索引或者错误号检索错误对象，可以调用函数GetErrorInfo。
注意：通常在Errror集合中只有一个错误对象。在使用ODBC数据源时，可能会遇到多个错误对象。


 CDaoException::GetErrorInfo

void GetErrorInfo( int nIndex );

参数：
nIndex 数据库引擎的Errors集合中错误信息的索引，用于按索引查找。

说明：
本函数用于取得异常的如下信息：
·错误代码
·源
·说明：
·帮助文件
·帮助上下文
本函数把取得的信息保存在异常对象的m_pErrorInfo数据对象中。有关返回信息的说明，参阅m_pErrorInfo。在捕获到一个由MFC产生的CDaoException类型的异常时，m_pErrorInfo成员就已经被填充了。如果直接调用了DAO，就必须自己调用本函数来填充m_pErrorInfo。更详细的说明，请参阅结构CDaoErrorInfo。
要了解有关DAO异常的信息和例子的代码，请参阅联机文档“Visual C++程序员指南”中的“异常：数据库异常”；有关如何取得DAO对象集合的信息，请参阅“DAO异常：取得DAO对象的有关信息”。

请参阅：CDaoException::GetErrorCount


 CDaoException::m_nAfxDaoError

说明：
m_nAfxDaoError包含了一个扩展的MFC错误代码。当MFC DAO类的某个特定成分出错时，提供此错误代码。
可能的取值有：
· | NO_AFX_DAO_ERROR | 最近一次操作没有产生MFC扩展错误。但是该操作可能产生了DAO或OLE中的其它错误，因此应该检查m_pErrorInfo甚至m_scode。
· | AFX_DAO_ERROR_ENGINE_INITIALIZATION | MFC不能初始化Microsoft Jet数据库引擎。可能是OLE的初始化出错，或者不能创建DAO数据库引擎对象的实例。这些问题一般是由于DAO或OLE安装不正确引起的。
· | AFX_DAO_ERROR_DFX_BIND | DAO字段交换（DAO record fieldexchange，DFX）函数中使用的一个地址不存在或无效（该地址不是用于绑定数据的）。可能在调用DFX函数时传递了一个错误地址，或是因为该地址在DFX操作间变成无效的了。
· | AFX_DAO_ERROR_OBJECT_NOT_OPEN | 试图打开一个基于视图定义或表定义的记录集，但是视图定义或表定义未打开。
要了解有关DFX的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录字段交换（DFX）”。

请参阅：
CDaoException::GetErrorCount, CDaoException::GetErrorInfo


 CDaoException::m_pErrorInfo

说明：
包含了一个指向一个CDaoErrorInfo结构的指针，该结构提供了最近一次调用GetErrorInfo函数检索的DAO错误对象的信息。包含的信息如下：
CDaoErrorInfo的成员 | 信息 | 含义
m_lErrorCode | 错误代码 | DAO错误的代码
m_strSource | 错误源 | 最初产生该错误的对象或应用的名字
m_strDescription | 说明 | 对错误的说明
m_strHelpFile | 帮助文件 | Windows帮助文件的路径，从该文件中可以得到错误的相关帮助
m_lHelpContext | 帮助上下文 | DAO帮助文件中帮助主题的上下文ID号
有关CDaoErrorInfo对象中包含的完全的信息，请参阅CDaoErrorInfo结构。

请参阅：
CDaoException::m_scode, CDaoException::m_nAfxDaoError


 CDaoException::m_scode

说明：
包含了一个SCODE类型的值，该值说明错误是什么。它是一个OLE代码。很少会用到它，因为在绝大多数情况下，在CDaoException的其它数据成员中都提供了更具体的MFC或DAO错误信息。
要了解有关SCODE的更详细的信息，请参阅“Win32 SDK”、“OLE程序员参考，卷1”中的“OLE错误代码的结构”。数据类型SCODE其实就是HRESULT类型。

请参阅：
CDaoException::m_pErrorInfo, CDaoException::m_nAfxDaoError


 CDaoFieldExchange

类CDaoFieldExchange没有基类。
类CDaoFieldExchange支持DAO数据流库类使用的DAO字段交换（DFX）例程。除非是在为自定义的数据类型写数据交换例程，否则不要直接使用该类。DFX在CDaoRecordset对象的字段数据成员和数据源当前记录的相应字段之间交换数据。DFX能处理双向的数据交换，即从数据源取数据或向数据源写数据。有关书写自己的DFX例程的信息，请参阅“技术指南53”。
注意：
DAO数据库类与基于ODBC的MFC数据库类是截然不同的。所有的DAO数据库类的命名中都包括CDao前缀。但仍可以采用DAO数据库类存取ODBC数据源。一般说来，在MFC中，基于DAO的类的处理能力比基于ODBC的类的处理能力要强；基于DAO的类可以通过ODBC数据源对应的数据库引擎存取ODBC数据源。基于DAO的类也支持数据定义语言（DDL）一类的操作，如通过类在数据库中建表，而不用直接调用DAO。
注意：
DAO记录字段交换（DFX）与基于ODBC的MFC数据库类（CDatabase，CRecordset）中的记录字段交换（RFX）非常类似。如果理解了RFX，DFX也就好理解了。
CDaoFieldExchange对象提供了DAO记录字段交换所必须的上下文信息。CDaoFieldExchange对象支持一组操作，包括绑定参数和字段数据成员并设置当前记录字段上的各种标志。DFX操作在记录集类的由CDaoFieldExchange中的enum FieldType定义类型的数据成员上进行。
可能的FieldType值有：
· | CDaoFieldExchange::outputColumn | 用于字段数据成员。
· | CDaoFieldExchange::param | 用于参数数据成员。
成员函数IsValidOperation用来书写自己的DFX例程。在CDaoRecordset::DoFieldExchange函数中将经常使用函数SetFieldType。有关DFX全局函数的细节信息，请参阅“记录字段交换函数”。有关书写自定义数据类型的DFX例程的信息，参阅“技术指南53”。
要了解有关DFX的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录字段交换（DFX）”。
#include <afxdao.h>
请参阅：CDaoRecordset

CDaoFieldExchange类的成员

数据成员
m_nOperation | 当前对记录集的DoFieldExchange函数的调用所进行的DFX操作
m_prs | 指向DFX操作针对的记录集的指针

成员函数
IsValidOperation | 如果当前操作对将进行更新的该类型字段是适合的，则返回非零值
SetFieldType | 指定记录集数据成员的类型——列或参数——随后对DFX函数的调用都采用这个设置，直到下一次调用SetFieldType


 CDaoFieldExchange::IsValidOperation

BOOL IsValidOperation( );

返回值：
如果当前操作对正在更新的这一类字段是有效的，则返回非零值。

说明：
如果编写了自己的DFX函数，则要在该函数的开始处调用IsValidOperation来检测当前操作能否在某个字段数据成员类型（CDaoFieldExchange::oututColumn或CDaoFieldExchange::param）上进行。DFX机制提供的某些操作只适用于其中的一种字段类型。设计自己的DFX函数也要遵守系统DFX函数的模式。
要了解有关DFX的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录字段交换（DFX）”。有关编写自己的DFX例程的信息，请参阅“技术指南53”。

请参阅：CDaoFieldExchange::SetFieldType


 CDaoFieldExchange::SetFieldType

void SetFieldType( UINT nFieldType );

参数：
nFieldType是一个enum FieldType类型的值，该类在CDaoFieldExchange中定义。可能的取值有：
· | CDaoFieldExchange::outputColumn
· | CDaoFieldExchange::param

说明：
本函数在CDaoRecordset类的成员函数DoFieldExchange的覆盖函数中调用。一般情况下，类向导（ClassWizard）会在生成的代码中调用这个函数。如果设计了自己的函数，又使用类向导设计DoFieldExchange函数，就需要在字段映射之外调用它。如果没有采用类向导，则不会有字段映射。本函数在DFX函数之前调用，对类的每个数据成员分别调用一次，并把字段类型参数设为Cdao FieldExchange::outputColumn。
为了参数化记录集类，就需要为所有的数据参数成员增加DFX调用（在字段映射之外），在这些调用之前，需要调用SetFieldType，参数为CDaoFieldExchange::param。
一般说来，每一组和字段数据成员或参数数据成员相关的DFX函数调用之前，都必须调用SetFieldType。每个调用的参数nFieldType指定了跟在它之后的DFX函数调用表示的数据成员的类型。
要了解有关DFX的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录字段交换（DFX）”。

请参阅：
CDaoFieldExchange::IsValidOperation, CDaoFieldExchange::DoFieldExchange


 CDaoFieldExchange::m_nOperation

说明：
它标志了与字段交换对象相联系的CDaoRecordset对象上进行的操作。CDaoFieldExchange对象为记录集上的不同DFX函数提供了上下文。
注意：
在下面的MarkForAddNew和SetFieldNull操作中

说明：
的PSEUDONULL值用于把字段设置为空值（NULL）。DAO记录字段交换机制采用这个值来检测哪些字段被显式地设成了空值。对ColeDataTime和COleCurrency字段来说PSEUDO NULL是不需要的。
要了解有关DFX和这些操作的更详细的信息，请参阅联机文档“VisualC++程序员指南”中的“DAO记录字段交换（DFX）”。
m_nOperation可能的取值如下：
操作 | 说明
AddToParameterList | 构造SQL语句的PARAMETERS子句
AddToSelectList | 构造SQL语句的SELECT子句
BindField | 在应用中把数据库中的一个字段绑定到一个内存位置
BindParam | 为记录集的查询设置参数值
Fixup | 把字段设置为Null状态
AlocCache | 分配用于检查记录集中“脏”字段的缓存
StoreField | 把当前记录保存到缓存中
LoadField | 从缓存中恢复保存的记录集中的数据成员变量
FreeCache | 释放用于检查记录集中“脏”字段的缓存
SetFieldNull | 把字段设置为Null，值设置为PSEUDO NULL
MarkForAddNew | 如果字段不是PSEUDO NULL就设置为“脏”字段
MarkForEdit | 如果字段的内容与缓存不一致，就设为“脏”字段
SetDirtyField | 把字段值标志为“脏”
DumpField | 导出字段的内容（仅用于调试）
MaxDFXOperation | 用于输入输入数据时的校验

请参阅：
CDaoFieldExchange::IsValidOperation, CDaoFieldExchange::m_prs, CDaoRecordset::DoFieldExchange


 CDaoFieldExchange::m_prs

说明：
一个指向与CDaoFieldExchange对象相联系的CDaoRecordset对象的指针。
要了解有关DFX的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录字段交换（DFX）”。

请参阅：
CDaoFieldExchange::m_nOperation, CDaoRecordset


 CDaoQueryDef

CObject
└CDaoQueryDef

CDaoQueryDef对象表示了一个查询定义（querydef），查询定义通常保存在数据库中。查询定义是一个包含了说明查询的SQL语句极其属性（如创建日期、ODBC超时设置等）的数据存取对象，也可以创建临时的不存储在数据库中的临时查询定义对象，但把那些经常用到的查询定义保存在数据库中能够提高效率。CDaoDatabase对象维护了一个称为QueryDefs的集合，其中就记录了保存下来的查询定义。
注意：
DAO数据库类和MFC中基于ODBC的数据库类是截然不同的。所有的DAO数据库类的命名中都包括CDao前缀。但仍可以采用DAO数据库类存取ODBC数据源。一般说来，在MFC中，基于DAO的类的处理能力比基于ODBC的类的处理能力要强；基于DAO的类可以通过ODBC数据源对应的数据库引擎存取ODBC数据源。基于DAO的类也支持数据定义语言（DDL）一类的操作，如通过类在数据库中建表，而勿须直接调用DAO。

用法
查询定义对象可用来存取当前保存的查询或者创建一个将保存的查询或临时查询。
1. 无论怎么使用，都需要提供一个指向查询所属的数据库对象的指针，并构造一个CDaoQueryDef对象；
2.然后：
· | 如果是使用一个现存的查询，则根据保存的查询的名字调用查询定义对象的成员函数Open。
· | 如果是创建一个新的将保存的查询，则提供新查询的名字，调用查询定义对象的成员函数Create。
· | 如果是创建一个临时查询对象，也要调用Create，不过传递的查询名是一个空字符串。
在使用完查询对象之后，需要调用它的成员函数Close关闭它，然后销毁该对象。
提示：
创建待保存的查询的最简单的办法是采用Microsoft Access创建并把他们保存在数据库中。以后就可以在MFC代码中打开并使用它们了。

目的
查询定义对象可用于以下目的：
· | 创建CDaoResordset对象。
· | 调用该对象的成员函数Execute直接执行动作查询或SQL直通查询。
查询定义对象可用于多种类型的查询，包括选择、动作查询、交叉表（crosstab）、删除、更新、添加、造表、数据定义、SQL直通查询和批量查询等。查询的类型是由SQL语句的内容决定的。有关查询类型的内容，请参阅成员函数Execute和GetType。记录集通常用于返回行的查询，一般是那些使用了SELECT匜ROM的查询。Execute一般用于批量操作。要了解更详细的信息，请参阅Execute和CDaoRecordset的说明。

查询定义和记录集
使用查询定义对象创建CDaoRecordset对象时，一般都是象上面介绍的那样创建和打开一个查询定义对象。然后构造一个记录集对象，在调用CDaoRecordset:: Open时传一个指向查询定义对象的指针。传递的查询定义必须是处于打开状态的。调用Open或Create都会使查询定义对象处于打开状态。

外部数据库
查询定义对象是使用外部数据库引擎本地SQL方言的最好方法。例如，可以创建一个Transact SQL（Microsoft SQL Server中采用了）查询并存在查询定义对象中。在使用一个不是基于Microsoft Jet数据库引擎的SQL查询时，必须提供一个指明外部数据源的连接串。具有有效连接串的查询忽略本地数据库引擎，而直接把查询发送到外部数据库服务器进行处理。
提示：
使用ODBC表时最好的方式是把它们与一个Microsoft Jet数据库联系起来。要了解更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO扩展：使用外部数据源”。
要了解有关查询定义的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。相关信息，请参阅DAO帮助中的“查询定义对象”、“查询定义集合”和“使用DAO存取外部数据库”。
#include <afxdao.h>
请参阅：CDaoRecordset, CDaoDatabase, CDaoTableDef, CDaoException

CDaoQueryDef类的成员

数据成员
m_pDatabase | 指向查询定义相联系的CDatabase对象的指针。查询定义可以存在该数据库中，也可以不存在其中
m_pDaoQueryDef | 指向DAO查询定义对象的OLE接口

构造函数
CDaoQueryDef | 构造一个CDaoQueryDef对象。随后可以调用Open或Create
Create | 创建CDaoQueryDef对象。要么把查询定义对象作为临时查询，要么调用
Append | 把它保存到数据库中Append把查询定义添加到数据库的QueryDefs集合中保存该查询
Open | 打开数据库的QueryDefs集合中保存的一个查询定义
Close | 关闭查询定义对象。在使用完之后销毁该C++对象

属性
CanUpdate | 如果查询可以更新数据库，则返回非零值
GetConnect | 返回与查询定义相关的连接串。连接串标志了数据源（仅用于SQL直通查询，否则返回一个空串）
GetDateCreated | 返回创建该查询的日期
GetDateLastUpdated | 返回最后一次修改该查询的日期
GetName | 返回查询定义的名字
GetODBCTimeout | 返回在执行该查询定义时所用的ODBC超时设置（适用于ODBC查询）超时设置设定了查询执行响应的最长允许时间
GetRecordsAffected | 返回动作查询所影响的记录数
GetReturnsRecords | 返回查询所返回的记录数
GetSQL | 返回查询定义中指定的SQL命令字符串
GetType | 返回查询的类型：删除、更新、添加、造表等等
IsOpen | 如果查询定义已经打开并可以执行，则返回非零值
SetConnect | 设置ODBC数据源上的SQL直通查询的连接串
SetName | 设置保存的查询的名字，替换创建时指定的名字
SetODBCTimeout | 设置ODBC查询的超时时间
SetReturnsRecords | 指定查询定义是否返回记录。把它设置为TRUE只对SQL传输型的查询有效
SetSQL | 设置查询定义中指明查询的SQL语句

操作
Execute | 执行查询定义对象中定义的查询
GetFieldCount | 返回查询定义对象定义的字段数
GetFieldInfo | 返回查询中指定字段的信息
GetParameterCount | 返回为该查询定义的参数个数
GetParameterInfo | 返回查询的指定参数的信息
GetParamValue | 返回查询的指定参数的值
SetParamValue | 设置查询的指定参数的值


 CDaoQueryDef::Append

virtual void Append( );
throw( CDaoException, CMemoryException );

说明：
本函数在调用Create函数创建一个新的查询定义对象之后调用。它把查询定义添加到数据库的QueryDefs集合中，从而保存该查询。也可以不悬挂本函数而把查询定义当作临时对象使用。但如果要持久化，就需要调用本函数。
如果试图添加一个临时查询定义对象，MFC会产生一个CDaoException类型的异常。
要了解有关查询定义的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。


 CDaoQueryDef::CanUpdate

BOOL CanUpdate( );
throw( CDaoException, CMemoryException );

返回值：
如果有修改权限，则返回非零值，否则为0。

说明：
本函数用于检测某个用户是否可以修改查询定义——例如改变名字或SQL命令。修改查询定义需要满足以下条件：
·它所基于的数据库不是以只读方式打开的；
·拥有更新数据库的权限。
这一项决定了用户是否具有适当的安全特性。MFC并不提供安全性支持，程序员必须直接调用DAO或使用Microsoft Access实现安全性管理。参阅DAO帮助中的“Permission特性”。
要了解有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。


 CDaoQueryDef::CDaoQueryDef

CDaoQueryDef(CDaoDatabase* pDatabase);

参数：
pDatabase 指向一个打开的CDaoDatabase对象的指针。

说明：
本函数构造一个CDaoQueryDef对象。该对象可以表示数据库的QueryDefs集合中现存的一个查询定义、将要保存到集合中的一个新查询定义或是一个不打算保存的临时查询。下一步的操作取决于查询定义的类型：
· | 如果该对象表示一个现存的查询定义，则需要调用Open来初始化它；
· | 如果该对象表示一个将要保存的查询定义，则调用成员函数Create把它加到数据库的QueryDefs集合中。然后调用CDaoQueryDef的成员函数来设置对象的属性。最后，调用Append。
· | 如果该对象表示了一个临时查询定义（将不保存在数据库中），则需要调用Create（传递一个空字符串作为查询的名字）。然后直接设置查询定义的属性进行初始化。最后不需要调用Append。
可以使用成员函数SetName、SetSQL、SetConnect、SetODBCTimeout和SetReturnsRecords设置查询定义的属性。
在使用完查询定义对象后，需要调用它的成员函数Close。如果有指向该对象的指针，可以用delete操作符销毁相应的C++对象。
要了解有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。

请参阅：
CDaoQueryDef::GetConnect, CDaoQueryDef::GetDateCreated, CDaoQueryDef::GetDateLastUpdated, CDaoQueryDef::GetName, CDaoQueryDef::GetODBCTimeout, CDaoQueryDef::GetReturnsRecords, CDaoQueryDef::GetSQL


 CDaoQueryDef::Close

virtual void Close( );

说明：
在使用完查询对象后调用本函数。关闭查询定义对象会释放其下的DAO对象，但是不会销毁保存的DAO查询定义对象或相应的C++CDaoQueryDef对象。这与CDaoDatabase::DeleteQueryDef不同，它从DAO中数据库的QueryDefs集合中删除查询定义（如果不是临时查询定义对象）。
要了解有关查询定义的信息，请参阅联机文档“Visual C++ 程序员指南”中的“DAO查询定义”。

请参阅：
CDaoQueryDef::Open, CDaoQueryDef::Create, CDaoQueryDef::CDaoQueryDef


 CDaoQueryDef::Create

virtual void Create( LPCTSTR lpszName = NULL , LPCTSTR lpszSQL = NULL );
throw( CDaoException, CMemoryException );

参数：
lpszName | 保存在数据库的查询的名字。有关名字的具体内容，请参阅DAO帮助中的“CreateQueryDef方法”。缺省值是一个空串，将创建一个临时查询定义对象。临时查询不在数据库的QueryDefs集合中保存。
lpszSQL | 定义该查询的SQL语句。缺省值是NULL，如果调用本函数时采用了这个缺省值，就必须在随后调用SetSQL函数设置SQL语句。否则，查询是没有定义的。但是，可以使用未定义的查询去打开一个记录集，参阅说明部分。在把查询定义添加到数据库的QueryDefs集合之前，需要定义好SQL语句。

说明：
本函数用于创建一个将保存的查询或者临时查询。如果传递了名字lpszName，以后就可以调用Append函数把查询定义添加到数据库的QueryDefs集合中了。否则，它就是一个临时对象，不能保存在数据库中。在两种情况下，查询定义都是处于打开状态的，随后就可以用它创建一个记录集对象或调用Execute来执行查询了。
如果在参数lpszSQL中没有提供SQL语句，就不能立即调用Execute执行查询，但可以创建一个记录集。此时，MFC采用记录集的缺省SQL语句。要了解有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。

请参阅：
CDaoQueryDef::Open, CDaoQueryDef::CDaoQueryDef, CDaoRecordset::GetSQL


 CDaoQueryDef::Execute

virtual void Execute( int nOptions = dbFailOnError );
throw( CDaoException, CMemoryException );

参数：
nOptions指明查询特性的一个整数。相关信息，请参阅DAO帮助中的“Execute方法”。可以使用位或操作符（|）组合下面的常量值：
· | dbDenyWrite | 不允许其它用户写。
· | dbInconsistent | 非不一致性更新。
· | dbConsistent | 一致性更新。
· | dbSQLPassThrough | SQL传输。把SQL语句传送到ODBC数据库进行处理。
· | dbFailOnError | 缺省值。发生错误时回滚更新并向用户报告出错信息。
· | dbSeeChanges | 如果其它用户更新了本用户正在编辑的数据，则返回一个运行时错误。
注意：
术语“一致性”（consistent）和“非一致性”（inconsistent）的含义，请参阅DAO帮助中的“Execute方法”。

说明：
本函数用于执行查询定义对象定义的查询。以这种方式执行的查询只能是如下类型之一：
·动作查询
·SQL直通查询
Execute不能用来处理那些返回记录的查询，如选择型查询。它通常用于批量处理的查询，如UPDATE、INSERT或SELECT INTO，或数据定义型操作（DDL）。
要了解有关动作查询和SQL直通查询的定义，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义：动作查询和SQL直通查询”。
提示：
使用ODBC表时最好的方式是把它们与一个Microsoft Jet数据库联系起来。要了解更详细的信息，请参阅DAO帮助中的“使用DAO存取外部数据库”和联机文档“Visual C++程序员指南”中的“DAO扩展：使用外部数据源”。
可以调用成员函数GetRecordsAffected检测最近一次调用Execute函数所影响的记录数。例如，GetRecordsAffected会返回执行一个动作查询后删除、更新或插入的记录数。但是返回的记录数没有考虑级联更新和级联删除的记录。
如果同时设置了dbInconsistent和dbConsistent或者一个也没有设，结果都取缺省值，即dbInconsistent。
本函数的执行不返回记录集。在一个返回记录集的查询上执行本函数会使MFC产生一个CDaoException类型的异常。
要了解有关使用Execute函数的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义：使用查询定义”。


 CDaoQueryDef::GetConnect

CString GetConnect( );
throw( CDaoException, CMemoryException );

返回值：
返回一个CString类型的值，其中记录了查询定义的连接串。

说明：
本函数用于取得查询定义的数据源对应的连接串。它仅用于ODBC数据源和特定的ISAM驱动程序；而不适于Microsoft Jet数据库。对于Microsoft Jet数据库来说，调用仅返回一个空串。要了解更详细的信息，请参阅SetConnect。
提示：
使用ODBC表时最好的方式是把它们与一个Microsoft Jet数据库联系起来。要了解更详细的信息，请参阅DAO帮助中的“使用DAO存取外部数据库”和联机文档“Visual C++程序员指南”中的“DAO扩展：使用外部数据源”。
要了解有关连接串的更详细的信息，请参阅DAO帮助中的“Connect特性”。有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。


 CDaoQueryDef::GetDateCreated

COleDateTime GetDateCreate( );
throw( CDaoException, CMemoryException );

返回值：
返回一个COleDateTime型的对象，其中记录了查询定义创建的日期和时间。

说明：
本函数用于返回查询定义创建的日期和时间。
要了解有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。相关信息，请参阅DAO帮助中的“DataCreated，LastUpdated特性”。

请参阅：CDaoQueryDef::GetDateLastUpdated


 CDaoQueryDef::GetDateLastUpdated

COleDateTime GetDateLastUpdated( );
throw( CDaoException, CMemoryException );

返回值：
返回一个COleDateTime型的对象，其中记录了查询定义最近一次修改的日期和时间。

说明：
本函数用于取得查询定义最近一次被修改（某个属性被修改，如名字、SQL字符串或连接串等）的日期和时间。
要了解有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。相关信息，请参阅DAO帮助中的“DataCreated，LastUpdated特性”。

请参阅：CDaoQueryDef::GetDateCreated


 CDaoQueryDef::GetFieldCount

short GetFIeldCount( );
throw( CDaoException, CMemoryException );

返回值：返回查询中定义的字段数。

说明：
本函数用于检索查询中的字段数。它在循环处理查询定义中的每一个字段时很有用，一般会与GetFieldInfo联合使用。
要了解有关查询定义字段的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO集合：获取关于DAO对象的信息”。相关信息，请参阅DAO帮助中的“DataCreated，LastUpdated特性”。


 CDaoQueryDef::GetFieldInfo

void GetFieldInfo( int nIndex, CDaoFieldInfo& fieldinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );
throw( CDaoException, CMemoryException );
void GetFieldInfo( LPCTSTR lpszName, CDaoFieldInfo& fieldinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO );
throw( CDaoException, CMemoryException );

参数：
nIndex | 字段在查询定义的Fields集合中的索引下标（从0开始计算），用于按下标查找。
fieldInfo | 对CDaoFieldInfo对象的参考，记录返回的字段信息。
dwInfoOptions指定取得字段的那些信息的选项。可用的选项如下：
· | AFX_DAO_PRIMARY_INFO | （缺省设置）字段的名字、类型、大小和属性。
· | AFX_DAO_SECONDARY_INFO | AFX_DAO_PRIMARY_INFO取得的信息加上：顺序位置、必须的、允许0的长度、源字段、别名、源表和核对序。
· | AFX_DAO_ALL_INFO | AFX_DAO_SECONDARY_INFO取得的信息加上：缺省值、有效性规则的文本、有效性规则。

lpszName 包含了字段名的一个字符串，用于按名查找。也可以用CString类型。

说明：
本函数用于取得查询定义中字段的各种信息。有关在fieldinfo返回的信息的说明，请参阅结构CDaoFieldInfo。该结构有和上面dwInfoOptions下描述信息对应的成员。
要了解有关获取字段信息的更详细的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO集合：获取DAO对象的有关信息”。

请参阅：CDaoQueryDef::GetFieldCount


 CDaoQueryDef::GetName

CString GetName();
throw(CDaoException,CMemoryException);

返回值：查询的名字。

说明：
调用这个成员函数，可以获取由查询定义表示的查询名字。
查询定义名字是唯一由用户定义的名字。有关查询定义名字的详细信息，请参阅DAO帮助中的“Name 特性”。
有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。

请参阅：
CDaoQueryDef::SetName, CDaoQueryDef::GetSQL, CDaoQueryDef::GetReturnsRecords, CDaoQueryDef::GetODBCTimeout


 CDaoQueryDef::GetODBCTimeout

short GetODBCTimeout();
throw(CDaoException,CMemoryException);

返回值：查询超时前的秒数。

说明：
调用这个成员函数，可以获取一个查询到ODBC数据源超时前的当前时间限制。有关这个时间限制的信息，请参阅DAO帮助中的“ODBCTimeout特性”。
提示：
处理ODBC表的好方法是把它们和一个Microsoft Jet数据库引擎关联。有关详细信息，请参阅DAO帮助中的“用DAO访问外部数据库”和联机文档“Visual C++程序员指南”中的“DAO扩展：使用外部数据源”。
有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。

请参阅：
CDaoQueryDef::SetODBCTimeout, CDaoQueryDef::GetName, CDaoQueryDef::GetSQL, CDaoQueryDef::GetReturnsRecords


 CDaoQueryDef::GetParameterCount

short GetParameterCount();
throw(CDaoException,CMemoryException);

返回值：查询中定义的参数个数。

说明：
调用这个成员函数，可以获取存储的查询中参数的个数。GetParameterCount在遍历查询定义中全部参数时有用。为此要使用GetParameterCount与GetParameterInfo连接。
有关参数化查询的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询：过滤和参数化查询”。有关信息，请参阅DAO帮助中的“参数对象”、“参数收集”和“参数声明（SQL）”。

请参阅：
CDaoQueryDef::GetParamValue, CDaoQueryDef::SetParamValue


 CDaoQueryDef::GetParameterInfo

void GetParameterInfo(int nIndex, CDaoParameterInfo& paraminfo,DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
throw(CDaoException,CMemoryException);
void GetParameterInfo(LPCTSTR lpszName,CDaoParameterInfo& paraminfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
throw(CDaoException,CMemoryException);

参数：
nIndex | 查询定义的参数收集中期望参数的基于0的索引，用于按索引查找。
paraminfo | CDaoParameterInfo对象的一个参考，返回需要的信息。
dwInfoOptions指定要获取参数的有关信息的选项。这里列出有效选项以及导致函数要返回的内容：
·AFX_DAO_PRIMARY_INFO（缺省）名字，类型lpszName包含期望参数的一个字符串，用于按名字查找，可以使用一个CString。

说明：
关于查询定义中定义的参数信息。有关paraminfo中返回的信息描述，请参阅CDaoParameterInfo结构。这个结构包含一些成员，对应于上面dwInfoOptions下的描述性信息。
要获得更多的参数信息，请参阅“DAO收集：获取关于DAO对象的信息”。有关参数化查询的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询：过滤和参数化查询”。有关信息，请参阅DAO帮助中的“参数对象”、“参数收集”和“参数声明（SQL）”。

请参阅：CDaoQueryDef::GetParameterCount


 CDaoQueryDef::GetParamValue

virtual COleVariant GetParamValue(LPCTSTR lpszName);
throw(CDaoException,CMemoryException);
virtual COleVariant GetParamValue(int nIndex);
throw(CDaoException,CMemoryException);

返回值：
包含这个参数值的类COleVariant的一个对象。

参数：
lpszName | 参数值的名字，用于按名字查找。
nIndex | 查询定义的参数收集中期望参数的基于0的索引，用于按索引查找。可以通过调用GetParameterCount和GetParameterInfo获取这个值。

说明：
调用这个成员函数，可以获取查询定义参数收集中存储的指定参数的当前值，可以用名字或者它在收集中的序号位置访问这个参数。
有关实例和关于参数化查询的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询：过滤和参数化查询”。有关信息，请参阅DAO帮助中的“参数对象”、“参数收集”和“参数声明（SQL）”。

请参阅：CDaoQueryDef::SetParamValue


 CDaoQueryDef::GetRecordsAffected

long GetRecordsAffected();
throw(CDaoException,CMemoryException);

返回值：受影响的记录个数。

说明：
调用这个成员函数，可以确定执行的最后一次调用影响了多少个记录。在级联更新或者删除有效时，返回的数字不会影响有关表中的变化。
有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。
有关信息，请参阅DAO帮助中的“RecordsAffected特性”。

请参阅：CDaoQueryDef::SetParamValue


 CDaoQueryDef::GetReturnsRecords

BOOL GetReturnsRecords();
throw(CDaoException,CMemoryException);

返回值：
如果查询定义基于一个返回记录的查询，则非零，否则为0。

说明：
调用这个成员函数，可以确定查询定义是否基于返回记录的一个查询。这个成员函数仅用于SQL遍历查询。有关SQL查询的更多信息，请参阅Execute成员函数。有关处理SQL遍历查询的更多信息，请参阅SetReturnsRecords成员函数。
有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。有关信息，请参阅DAO帮助中的“ReturnsRecords特性”。

请参阅：
CDaoQueryDef::GetName, CDaoQueryDef::GetSQL, CDaoQueryDef::GetODBCTimeout


 CDaoQueryDef::GetSQL

CString GetSQL();
throw(CDaoException,CMemoryException);

返回值：
SQL语句，定义了查询定义所基于的查询。

说明：
调用这个成员函数，可以获取定义所基于的查询的SQL语句。然后可以对这个字符串进行关键字、表名等的文法分析。
有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。有关信息，请参阅DAO帮助中的“SQL特性”、“Microsoft Jet数据库引擎SQL与ANSI SQL的比较”和“用SQL代码查询数据库”。

请参阅：
CDaoQueryDef::SetSQL, CDaoQueryDef::GetName, CDaoQueryDef::GetReturnsRecords, CDaoQueryDef::GetODBCTimeout


 CDaoQueryDef::GetType

short GetType();
throw(CDaoException,CMemoryException);

返回值：
由查询定义所定义的查询类型。关于取值，请参阅说明。

说明：
调用这个成员函数，可以确定查询定义的查询类型。查询类型是在创建查询定义或者调用现存查询定义的SetSQL成员函数时，根据在查询定义的SQL字符串中指定的内容设置的。这个函数返回的查询类型可以是下列值之一：
· | dbQSelect | 选择
· | dbQAction | 动作
· | dbQCrossTab | 交叉表
· | dbQDelete | 删除
· | dbQUpdate | 更新
· | dbQAppend | 附加
· | dbQMakeTable | Make-表
· | dbQDDL | 数据定义
· | dbQSQLPassThrough | 遍历
· | dbQSetOperation | 联合
· | dbQSPTBulk | 和dbQSQLPassThrough一起使用，指定不返回记录的查询。
注意：
要创建一个SQL遍历查询，不要把dbQSQLPassThrough设置为常数。在创建查询定义对象或者设置连接字符串时，由MicrosoftJet数据库引擎自动设置。
有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。


 CDaoQueryDef::IsOpen

BOOL IsOpen() const;

返回值：
CDaoQueryDef对象当前是打开的，则返回非零值，否则为0。

说明：
调用这个成员函数，可以确定CDaoQueryDef对象当前是否打开。在调用Execute或者创建一个CDaoRecordset对象之前，一个查询定义必须处于打开状态。要设置查询定义为打开状态，可以调用Create（对一个新查询定义）或者Open（对一个已存在的查询定义）。
有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。


 CDaoQueryDef::Open

virtual void Open(LPCTSTR lpszName=NULL);
throw(CDaoException,CMemoryException);

参数：
lpszName 包含要打开的保存的查询定义名字的一个字符串，可以使用一个CString。

说明：
调用这个成员函数，可以打开先前在数据库查询定义的收集中保存的一个查询定义。查询定义打开之后，可以调用其Execute成员函数或者使用查询定义来创建一个CDaoRecordset对象。
有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。

请参阅：
CDaoQueryDef::IsOpen, CDaoQueryDef::Close, CDaoQueryDef::SetName, CDaoQueryDef::Create


 CDaoQueryDef::SetConnect

void SetConnect(LPCTSTR lpszConnect);
throw(CDaoException,CMemoryException);

参数：
lpszConnect 一个字符串，包含用于对应CDaoDatabase对象的连接字符串。

说明：
调用这个成员函数，可以设置查询定义对象的连接字符串。这个连接字符串用来在需要时向ODBC或指定ISAM驱动器传送附加信息。它不适用于Microsoft Jet(.MDB)数据库。
提示：
处理ODBC表的好方法是把它们和.MDB数据库关联起来。有关的更多信息，请参阅DAO帮助中的“用DAO访问外部数据库”和联机文档“Visual C++程序员指南”中的“DAO扩展：使用外部数据源”。
在执行表示一个向ODBC数据源的SQL遍历查询的查询定义之前，用SetConnect连接字符串并调用SetReturnsRecords，以指明这个查询是否返回记录。
关于连接字符串结构和连接字符串组件实例的更多信息，请参阅DAO帮助中的“Connect属性”。有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。


 CDaoQueryDef::SetName

void SetName(LPCTSTR lpszName);
throw(CDaoException,CMemoryException);

参数：
lpszName 一个字符串，包含对应的CDaoDatabase对象中用于非临时查询的新名字。

说明：
如果想改变非临时查询定义的名字，可以调用这个成员函数。查询定义名字是唯一的用户定义的名字。在查询定义对象附加到查询定义收集之前，可以调用SetName。
有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。关于查询定义名字的更多信息，请参阅DAO帮助中的“Name特性”。

请参阅：
CDaoQueryDef::GetName, CDaoQueryDef::SetSQL, CDaoQueryDef::SetConnect, CDaoQueryDef::SetODBCTimeout, CDaoQueryDef::SetReturnsRecords


 CDaoQueryDef::SetODBCTimeout

void SetODBCTimeout(short nODBCTimeout);
throw(CDaoException,CMemoryException);

参数：
nODBCTimeout 一个查询超时前的秒数。

说明：
调用这个成员函数，可以设置对ODBC数据源“超时”查询前的时间限制。
提示：
处理ODBC表的好方法是把它们和Microsoft Jet(.MDB)数据库关联起来。更多的信息请参阅DAO帮助中的“用DAO访问外部数据库”和联机文档“Visual C++ 程序员指南”中的“DAO扩展：使用外部数据源”。
该成员函数可在联接数据源“超时”的后序操作之前覆盖缺省秒数。操作可能由于网络访问问题、超额查询处理时间等超时。如果想改变查询时间值，则在执行查询之前调用SetODBCTimeout（ODBC重用连接时，对同一个连接上的所有客户超时值相同）。
查询超时缺省值为60秒。
有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。有关信息，请参阅DAO帮助中的“ODBCTimeout特性”。

请参阅：
CDaoQueryDef::GetODBCTimeout, CDaoQueryDef::SetName, CDaoQueryDef::SetSQL, CDaoQueryDef::SetConnect, CDaoQueryDef::SetReturnsRecords


 CDaoQueryDef::SetParamValue

void SetParamValue(LPCTSTR lpszName, const COleVariant& varValue);
throw(CDaoException,CMemoryException);
void SetParamValue(int nOrdinal, const COleVariant& varValue);
throw(CDaoException,CMemoryException);

参数：
lpszName | 设置参数值的参数名字。
varValue | 要设置的值，请参阅说明。
nOrdinal | 参数定义的参数收集中的参数序数位置，可以通过调用GetParameterCount和GetParameterInfo获取这个值。

说明：
调用这个成员函数，可以在运行时设置查询定义中的参数值。这个参数已经作为查询定义的SQL字符串的一部分而建立。可以按名字或者它在收集中的序号位置访问这个参数。
指定一个值设置为COleVariant对象。关于在COleVariant对象中设置期望的值和类型，请参阅类COleVariant。
有关参数化查询的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询：过滤和参数化查询”。有关信息，请参阅DAO帮助中的“参数对象”、“参数收集”和“参数声明（SQL）”。

请参阅：CDaoQueryDef::GetParamValue


 CDaoQueryDef::SetReturnsRecords

void SetReturnsRecords(BOOL bReturnsRecords);
throw(CDaoException, CMemoryException);

参数：
bReturnsRecords 如果外部数据库上的查询返回值，则返回TRUE；否则为FALSE。

说明：
可作为建立向外部数据库的SQL遍历查询过程的一部分，调用这个成员函数。这时必须使用其它CDaoQueryDef成员函数创建查询定义并设置其属性。
有关外部数据库的描述，请参阅“DAO查询定义”。有关外部数据源的信息，请参阅“DAO扩展：使用外部数据源”，均在联机文档“Visual C++程序员指南”中。有关信息，请参阅DAO帮助中的“ReturnsRecords特性”。

请参阅：
CDaoQueryDef::GetReturnsRecords, CDaoQueryDef::SetName, CDaoQueryDef::SetSQL, CDaoQueryDef::SetConnect, CDaoQueryDef::SetODBCTimeout


 CDaoQueryDef::SetSQL

void SetSQL(LPCTSTR lpszSQL);
throw(CDaoException,CMemoryException);

参数：
lpszSQL 一个包含一条完整SQL语句的字符串可以执行。这个字符串的语法取决于查询所面向的DBMS。关于对Microsoft Jet数据库引擎中使用的语法的讨论，请参阅DAO帮助中的“用代码创建SQL语句”。

说明：
调用这个成员函数，可以设置查询定义执行的SQL语句。SetSQL的一个典型用途是建立SQL遍历查询中使用的查询定义对象（关于目标DBMS上SQL遍历查询的语法，请参阅DBMS文档）。
有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。有关SQL的更多信息，请参阅DAO帮助中的“参数对象”、“参数收集”和“参数声明（SQL）”。

请参阅：
CDaoQueryDef::GetSQL, CDaoQueryDef::GetName, CDaoQueryDef::SetConnect, CDaoQueryDef::SetODBCTimeout, CDaoQueryDef::SetReturnsRecords


 CDaoQueryDef::m_pDAOQueryDef

说明：
包含用于构成DAO查询定义对象的指向OLE接口的一个指针。提供这个指针用于同其它类的完成和一致。不过由于MFC几乎完全包含DAO查询定义，可能不会需要它。如果确实需要，使用时要谨慎──特别是不要改变指针值，除非你知道你在干什么。
有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。


 CDaoQueryDef::m_pDatabase

说明：
包含与查询定义对象对应的指向CDaoDatabase对象的一个指针，需要直接访问数据库时使用这个指针──例如，要获取数据库收集中指向其它查询定义或者记录集对象的指针。
有关查询定义的信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询定义”。


 CDaoRecordset

CObject
└CDaoRecordset

一个CDaoRecordset对象表示从数据源中选择的一组记录。作为“记录集”，CDaoRecordset对象在以下三种窗体中有效：
· | 表型记录集表示一个基本表，可以用它从单个数据库表中检查、添加、改变或删除记录。
· | 动态集型记录是一个查询的结果，可以包含可更新的记录。这个数据集是一组记录，可以用它从一个或多个基本数据库表中检查、添加、改变或删除记录。动态集型记录集包含来自一个数据库中一个或多个表的字段。
· | 快照型记录集是一组记录的一个静态拷贝，可以用它查找数据或生成报表。这些记录集可以包含来自一个数据库中一个或多个表的字段，不过不可更新。
记录集的每个窗体表示记录集在打开时所固定的一组记录。在表型记录集或动态集型记录集中滚动到一个记录时，它反映了记录集打开后，由其它用户或者应用中其它记录集对记录所做的改动（快照型记录集不可更新）。可以直接使用CDaoRecordset，也可以从CDaoRecordset派生出一个应用指定记录集。然后可以：
· | 在记录集中滚动。
· | 设置索引并使用Seek快速查找记录（只对表型记录集）。
· | 基于字符串比较：“<”，“<=”，“=”，“>=”或“>”的记录查找（对动态集型和快照型记录集）。
· | 更新记录并指定一种封锁模式（除了数据源中选择的记录）。
· | 过滤数据集，以限制它从有效数据源中选择的记录。
· | 排序记录集。
· | 参数化记录集，按运行时才知道的信息定制选择。
类CDaoRecordset提供了接口与类CRecordSet类似，主要区别在于类CDaoRecordset通过基于OLE的数据访问对象（DAO）访问数据。类CRecordSet通过开放数据库连接（ODBC）和适用于此DBMS的ODBC驱动程序访问DBMS。
注意：
DAO数据库类与基于开放数据库连接（ODBC）的MFC数据库类截然不同。所有DAO数据库类名均以“CDao”作前缀。你仍然可以用DAO类访问ODBC数据源；由于DAO类指定于Microsoft Jet数据库引擎，它们通常提供了超强的功能。
既可以直接使用CDaoRecordset，也可以由CDaoRecordset派生出一个类。两种情况下，要使用记录集类，需打开一个数据库并构造记录集对象，向构造程序传送一个指向CDaoDatabase对象的指针。接下来调用记录集的Open成员函数，指定对象是表型、动态集型还是快照型记录集。调用Open，从数据库中选择数据并获取第一条记录。
使用对象的成员函数和数据成员，可以滚动并操纵记录。操作有效性取决于对象是表型记录集、动态集型记录集还是快照型记录集，并且它是可更新的还是只读的──这依赖于数据库或开放数据库连接（ODBC）数据源的功能。要更新Open调用之后可能已改变或添加的记录，需调用对象的Requery成员函数。结束时调用对象的Close成员函数并销毁这个对象。
CDaoRecordset使用DAO记录字段交换（DFX），以支持通过CDaoRecordset或CDaoRecordset派生类的安全型C++成员对记录字段的读取更新。利用GetFieldValue和SetFieldValue，也可以不用DFX机制而实现对数据库列的动态绑定。
有关记录集的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：记录集的结构”。有关信息，请参阅DAO帮助中的“记录集对象”。
#include <afxdao.h>

请参阅：
CDaoTableDef, CDaoWorkspace, CDaoDatabase, CDaoQueryDef

CDaoRecordset类成员

数据成员
m_bCheckCacheForDirtyFields | 包含一个标记，指示字段在改变时是否自动作记号
m_pDAORecordset | 指向记录集对象基础上的DAO接口的一个指针
m_nFields | 包含从数据源中由记录集选择的记录集类中字段的数据成员数量和列数
m_nParams | 包含记录集类中参数数据成员数量──由记录集查询传递的参数数量
m_pDatabase | 用于这个结果集的源数据库。包含一个CDaoDatabase对象的指针
m_strFilter | 包含用于构造SQL WHERE语句的一个字符串
m_strSort | 包含用于构造ORDER BY语句的一个字符串

构造函数
CDaoRecordset | 构造一个CDaoRecordset对象
Close | 关闭记录集
Open | 从一个表、动态集或快照创建一个新记录集

属性
CanAppend | 如果可以通过AddNew成员函数把新记录添加到记录集，则返回非零
CanBookmark | 如果记录集支持书签，则返回非零
CanRestart | 如果可以调用Requery再次运行记录集查询，则返回非零
CanScroll | 如果可以在记录中滚动，则返回非零
CanTransact | 如果数据源支持事务，则返回非零
CanUpdate | 如果记录集可更新，则返回非零（可以添加、更新或删除记录）
GetCurrentIndex | 返回一个CString，包含在具有索引的表型CDaoRecordset上最近使用的索引名
GetDateCreated | 返回CDaoRecordset对象基础上创建基本表的日期和时间
GetDateLastUpdated | 返回对CDaoRecordset对象基础上基本表设计最近改变的日期和时间
GetEditMode | 返回指示当前记录编辑状态的一个值
GetLastModifiedBookmark | 用于确定最近添加或更新的记录
GetName | 返回包含记录集名字的一个CString
GetParamValue | 获取在基本DaoParameter对象中存储的指定参数当前值
GetRecordCount | 返回在一个记录集对象中访问的记录数
GetSQL | 获取用于从记录集选择记录的SQL字符串
GetType | 调用以确定记录集的类型：表型、动态集型或快照型
GetValidationRule | 返回包含使输入字段的数据有效的CString值
GetValidationText | 获取有效性规则未满足时显示的文本
IsBOF | 如果记录集定位在第一条记录之前，则返回非零。不存在当前记录
IsDeleted | 如果记录集定位在一个删除的记录上，则返回非零
IsEOF | 如果记录集定位在最后一条记录上，则返回非零
IsFieldDirty | 如果当前记录中指定字段发生变化，则返回非零
IsFieldNull | 如果当前记录中指定字段置为NULL（不含任何值），则返回非零
IsFieldNullable | 如果当前记录中指定字段可以置为NULL（不含任何值），则返回非零。
IsOpen | 如果以前调用过Open，则返回非零。
SetCurrentIndex | 调用以设置在表型记录集上的索引。
SetParamValue | 设置基本DAOParameter对象中保存的指定参数的当前值。
SetParamValueNull | 设置指定参数的当前值为NULL（不含任何值）。

记录集更新操作
AddNew | 准备添加一条新记录，调用Update以完成添加
CancelUpdate | 取消由Edit或AddNew操作进行的任何以前的更新
Delete | 从记录集删除当前记录，删除后必须明确地滚动到第一条记录
Edit | 准备改变当前记录。调用Update以完成添加
Update | 在数据源存储新的或编辑过的数据以完成AddNew或Edit操作

记录集导航操作
Find | 在满足指定条件动态集型记录集中，定位满足条件的第一个、下一个、上一个或最后一个位置，并使那条记录成为当前记录
FindFirst | 在满足指定条件动态集型记录集中，定位满足条件的第一条记录，并使那条记录成为当前记录
FindLast | 在满足指定条件动态集型记录集中，定位满足条件的最后一条记录，并使那条记录成为当前记录
FindNext | 在满足指定条件动态集型记录集中，定位满足条件的下一条记录，并使那条记录成为当前记录
FindPrev | 在满足指定条件动态集型记录集中，定位满足条件的上一条记录，并使那条记录成为当前记录
GetAbsolutePosition | 返回记录集对象当前记录的记录数
GetBookmark | 返回一个值，表示记录上的书签
GetPercentPosition | 以占记录总数百分比的形式，返回当前记录的位置
Move | 在任意方向上，把记录集从当前位置移到一个指定的记录号
MoveFirst | 在记录集中，把当前记录置为第一条记录
MoveLast | 在记录集中，把当前记录置为最后一条记录
MoveNext | 在记录集中，把当前记录置为下一条记录
MovePrev | 在记录集中，把当前记录置为上一条记录
Seek | 按照当前索引，在满足指定条件的建立索引的表型记录集对象中定位记录，并使那条记录成为当前记录
SetAbsolutePosition | 设置记录集对象当前记录的记录数
SetBookmark | 把记录集定位在包含指定书签的一个记录上
SetPercentPosition | 把当前记录的位置设置在对应于记录集中记录总数百分比的位置

其它记录集操作
FillCache | 对包含来自ODBC数据源的数据的记录集对象，填充全部或一部分局部缓存
GetCacheSize | 返回一个值，指定动态集型记录集中记录数，包含局部缓存中来自ODBC数据源的数据
GetCacheStart | 返回一个指定要缓存的记录集中第一条记录的书签
GetFieldCount | 返回表示记录集中字段数量的一个值
GetFieldInfo | 返回记录集中关于字段的指定类型信息
GetFieldValue | 返回记录集中一个字段的值
GetIndexCount | 获取记录集基础上的一个表中的索引数量
GetIndexInfo | 返回有关索引的各种信息
GetLockingMode | 返回一个值，表示编辑期间生效的封锁类型
Requery | 再次运行记录集查询以更新选择的记录
SetCacheSize | 设置一个值，指定记录集中的一定数目的数据从ODBC数据源中读取时被局部缓存
SetCacheStart | 设置一个值，指定记录集中的第一个记录的书签要被缓存
SetFieldDirty | 在当前记录改变时对指定字段做记号
SetFieldNull | 把当前记录中指定字段的值设置为NULL（不含任何值）
SetFieldValue | 设置记录集中一个字段的值
SetFieldValueNull | 把记录集中一个字段的值设置为NULL（不含任何值）
SetLockingMode | 设置一个值，表示编辑期间生效的封锁类型

可覆盖的函数
DoFieldExchange | 调用以在记录集的字段数据成员和数据源上相应记录之间交换数据（双向），实现DAO记录字段交换（DFX）
GetDefaultDBName | 返回缺省数据源的名字
GetDefaultSQL | 调用以返回要执行的缺省SQL字符串


 CDaoRecordset::AddNew

virtual void AddNew();
throw(CDaoException, CMemoryException);

说明：
调用这个成员函数，可以把一个新记录添加到表型或动态集型记录集中。记录字段初始为Null（数据库术语中，Null表示“不含任何值”，与C++中的NULL不同）。要完成这个操作，必须调用Update成员函数。Update把改动保存到数据源。
警告：
如果编辑了一条记录，然后未调用Update就滚动到另一条记录，虽然没有警告，也会丢失改动的结果。
如果通过调用AddNew把一条记录添加到动态集型记录集中，则这条记录在记录集中是可视的，并且包含在基础表中。在这里它对所有新CDaoRecordset对象均为可见的。
新记录的位置取决于记录集的类型：
· | 动态集型记录集中，不保证新记录的插入位置。这是由于性能和并行的原因，在Microsoft Jet 3.0中改变的。如果想使新添加的记录成为当前记录，应该获取最后更新的记录的书签，然后移动到那个书签： rs.SetBookmark(rs.GetLast MidifiedBookmark());
· | 在已经指定了索引的表型记录集中，记录按排序顺序返回到它们的正确位置。如果未指定索引，新记录返回到记录集末尾。
使用AddNew之前的当前记录保持为当前记录。如果想使新记录成为当前的并且记录集支持书签，则把SetBookmark调用到支持由基本DAO记录集对象的LastModified特性设置标识的书签。这样做对确定计数（自动增加）字段在添加记录中的值是有用的。有关的更多信息，请参阅GetLastMidifiedBookmark。
如果数据库支持事务，可以使AddNew调用成为事务的一部分。有关事务的更多信息，请参阅CDaoWorkspace。注意，应该在调用AddNew之前先调用CDaoWorkspace::BeginTrans。
对没有调用过Open成员函数的记录集，调用AddNew是不合法的。如果对不能附加的记录集调用AddNew，将产生一个CDaoException。可以通过调用CanAppend确定记录集是否可更新。
框架对字段数据成员作记号，保证能够通过DAO记录字段交换（DFX）机制把它们写进数据源上的记录。改变字段值通常会自动把这个字段设置为脏的，因此几乎不需要调用SetFieldDirty，但有时想确保列被明确更新或插入，不管字段数据成员中是些什么值。DFX机制也采用PSEUDONULL。有关的更多信息，请参阅CDaoFieldExchange::m_nOperation。
如果没有使用双缓存机制，字段值的改变将不会把这个字段设置为脏的。这种情况下，有必要明确设置这个字段脏。m_bCheckCacheForDirtyFields中包含的标记控制这个自动字段检查。
注意：
如果双缓存记录（即自动字段检查有效），则调用CancelUpdate将把成员变量恢复到调用AddNew或Edit之前的值。
有关更新记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集操作”。有关信息，请参阅DAO帮助中的“AddNew方法”、“CancelUpdate方法”、“LastModified方法”和“EditMode特性”。

请参阅：
CDaoRecordset::CanUpdate, CDaoRecordset::CancelUpdate, CDaoRecordset::Delete, CDaoRecordset::Edit, CDaoRecordset::Update, CDaoRecordset::CanTransact


 CDaoRecordset::CanAppend

BOOL CanAppend() const;

返回值：
如果记录集允许添加新记录，则返回非零值，否则为0。如果以只读方式打开记录集，则CanAppend返回0。

说明：
调用这个成员函数，可以确定你以前打开的记录集是否允许通过调用AddNew成员函数添加新记录。
有关更新记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集操作”。有关信息，请参阅DAO帮助中的“Append方法”。

请参阅：
CDaoRecordset::CanBookmark, CDaoRecordset::CanRestart, CDaoRecordset::CanScroll, CDaoRecordset::CanTransact, CDaoRecordset::CanUpdate


 CDaoRecordset::CanBookmark

BOOL CanBookmark() const;
throw(CDaoException, CMemoryException);

返回值：
如果记录集支持书签，则返回非零值，否则为0。

说明：
调用这个成员函数，可以确定你以前打开的记录集是否允许分别对使用了书签的记录作记号。如果使用的记录集完全基于Microsoft Jet数据库引擎表，则除了标记只能前滚记录集的快照型记录集外，都可以使用书签。其它数据库产品（外部ODBC数据源）可能不支持书签。
有关记录集导航的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“Bookmarkable特性”。

请参阅：
CDaoRecordset::CanAppend, CDaoRecordset::CanRestart, CDaoRecordset::CanScroll, CDaoRecordset::CanTransact, CDaoRecordset::CanUpdate


 CDaoRecordset::CancelUpdate

virtual void CancelUpdate();
throw(CDaoException, CMemoryException);

说明：
CancelUpdate成员函数取消由Edit或AddNew操作所作的任何以前的更新。例如，如果应用调用了Edit或AddNew成员函数并且没有调用Update，CancelUpdate将取消Edit或AddNew调用之后的任何改动。
注意：
如果双缓存记录（即自动字段检查有效），则调用CancelUpdate将把成员变量恢复到调用AddNew或Edit之前的值。
如果没有Edit或AddNew操作等待，CancelUpadate引起MFC给出一个异常。调用GetEditMode成员函数以确定是否有一个等待的操作可以被删除。
有关更新记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集操作”。有关信息，请参阅DAO帮助中的“CancelUpdate方法”。

请参阅：
CDaoRecordset::AddNew, CDaoRecordset::Delete, CDaoRecordset::Edit, CDaoRecordset::Update, CDaoRecordset::CanTransact


 CDaoRecordset::CanRestart

BOOL CanRestart();
throw(CDaoException, CMemoryException);

返回值：
如果可以调用Requery，再运行记录集查询，则返回非零值，否则为0。

说明：
调用这个成员函数，可以确定记录集是否允许通过调用Requery成员函数重新启动它的查询（以更新它的记录）。表型记录集不支持Requery。
如果不支持Requery，调用Close，然后调用Open来更新数据。在参数值已经改变之后，可以调用Requery以更新记录集对象的基本参数查询。
有关DAO对象的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。有关信息，请参阅DAO帮助中的“Restartable方法”。

请参阅：
CDaoRecordset::CanAppend, CDaoRecordset::CanBookmark, CDaoRecordset::CanScroll, CDaoRecordset::CanTransact, CDaoRecordset::CanUpdate


 CDaoRecordset::CanScroll

BOOL CanScroll() const;

返回值：
如果可以在记录中滚动，则返回非零值，否则为0。

说明：
调用这个成员函数，可以确定记录集是否允许滚动，如果以dbForwordOnly调用Open，则记录集只能前滚。
有关记录集导航的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“用DAO定位当前记录指针”。

请参阅：
CDaoRecordset::CanAppend, CDaoRecordset::CanBookmark, CDaoRecordset::CanRestart, CDaoRecordset::CanTransact, CDaoRecordset::CanUpdate, CDaoRecordset::Open


 CDaoRecordset::CanTransact

BOOL CanTransact() const;
throw(CDaoException, CMemoryException);

返回值：
如果基本数据源支持事务，则返回非零值，否则为0。

说明：
调用这个成员函数，可以确定记录集是否允许事务。
有关更新记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集操作”。有关信息，请参阅DAO帮助中的“Transactions属性”。

请参阅：
CDaoRecordset::AddNew, CDaoRecordset::CanAppend, CDaoRecordset::CancelUpdate, CDaoRecordset::CanScroll, CDaoRecordset::CanRestart, CDaoRecordset::CanUpdate, CDaoRecordset::Delete, CDaoRecordset::Edit, CDaoRecordset::Update


 CDaoRecordset::CanUpdate

BOOL CanUpdate() const;
throw(CDaoException, CMemoryException);

返回值：
如果记录可更新（添加、更新和删除记录），则返回非零值，否则为0。

说明：
调用这个成员函数，可以确定记录集是否可以更新。如果基础数据源只读，或者在调用Open时对记录集的nOptions指定了dbReadOnly，则记录集可能为只读的。
有关更新记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集操作”。有关信息，请参阅DAO帮助中的“AddNew方法”、“Edit方法”、“Delete”、“Update方法”、“Updatable特性”。

请参阅：
CDaoRecordset::CanAppend, CDaoRecordset::CanBookmark, CDaoRecordset::CanScroll, CDaoRecordset::CanRestart, CDaoRecordset::CanTransact


 CDaoRecordset::CDaoRecordset

CDaoRecordset(CDaoRecordset* pDatabase=NULL);

参数：
pDatabase 包含指向CDaoDatabase对象的一个指针或NULL值。如果不是NULL，并且没有调用CDaoDatabase对象Open成员函数来连接它与数据源。记录集试图在它自己的Open调用期间打开它。如果传递NULL，若从CDaoDatabase派生记录集，则使用指定的数据源信息构造和连接CDaoDatabase对象。

说明：
构造一个CDaoRecordset对象。你既可以直接使用CDaoRecordset，也可以由CDaoRecordset派生出一个应用指定类。可以使用ClassWizard派生记录集类。
注意：
如果派生CDaoRecordset类，派生类必须提供自己的构造程序。在派生类构造程序中，调用构造程序CDaoRecordset：：CDaoRecordset，并随着它传递适当的参数。
向记录集构造程序传递NULL，将自动构造和连接CDaoDatabase对象。这是一个有用的快捷方式，允许不必在构造记录集之前，构造和连接一个CDaoDatabase对象。如果没有打开CDaoDatabase对象，则也创建一个使用缺省工作区的CDaoDatabase对象。有关的更多信息，请参阅CDaoDatabase：CDaoDatabase。
有关构造记录集的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。

请参阅：
CDaoRecordset::GetDefaultDBName, CDaoRecordset::GetDefaultSQL, CDaoRecordset::GetDateCreated, CDaoRecordset::GetDateLastUpdated


 CDaoRecordset::Close

virtual void Close();
throw(CDaoException);

说明：
关闭CDaoRecordset对象，把它从对应的数据库中打开记录集收集中删除。在Close未销毁CDaoRecordset对象之前，通过在同一个数据源或不同数据源上调用Open，可以重新使用这个对象。
所有以前的AddNew或Edit语句将取消，以前的事务将回滚。如果想保留以前的添加或编辑，在对各记录集调用Close之前先调用Update。
调用Close之后可以再次调用Open。这将使你重新使用这个记录集对象。如果可能，更好的替换方法是调用Requery。
有关处理记录集的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。有关信息，请参阅DAO帮助中的“Close方法”。

请参阅：CDaoRecordset::Open, CDaoRecordset::CDaoRecordset


 CDaoRecordset::Delete

virtual void Delete();
throw(CDaoException, CMemoryException);

说明：
调用这个成员函数，可以在打开的动态集型或者表型记录集对象中删除当前记录。成功删除之后，记录集的字段数据成员设置为Null值，为了把删除记录移去，必须显示调用一个记录集导航成员函数（Move,Seek,SetBookmark等）。从记录集删除记录时，在调用Delete之前，记录集中必须存在一个当前记录；否则MFC会产生异常。
Delete移去当前记录并使它不可访问。虽然你不编辑或者使用已删除记录，它仍然是当前记录。不过一旦移到另一条记录，就不能再使它成为当前记录。
警告：
调用Delete时，记录集必须是可更新的，并且记录集中必须存在一个有效当前记录。例如，如果删除了一条记录，在再次调用Delete之前，没有滚动到一条新记录，则Delete产生一个CDaoException。
如果使用事务，可以撤销对一条记录的删除，并且可以调用CDaoWorksp-ace::Rollback成员函数。如果基本表是级联删除关系中的主表，删除当前记录可能会删除外部表中的一条或多条记录。有关的更多信息，请参阅DAO帮助中的“级联删除”定义。
与AddNew和Edit不同，Delete调用没有Update调用跟随其后。
有关更新记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集操作”。

请参阅：
CDaoRecordset::AddNew, CDaoRecordset::CancelUpdate, CDaoRecordset::Edit, CDaoRecordset::Update, CDaoRecordset::CanTransact


 CDaoRecordset::DoFieldExchange

virtual void DoFieldExchange(CDaoFieldExchange* pFX);
throw(CDaoException, CMemoryException);

参数：
pFX 包含指向CDaoFieldExchange对象的一个指针。框架已经建立了这个对象，以便对字段交换操作指定上下文。

说明：
框架调用这个成员函数，可以自动交换记录集对象的字段数据成员和数据源当前记录对应之间的数据。如果有的话，它还把参数数据成员绑定在用于记录集选择的SQL语句字符串中的参数位置标记符。这个称为DAO记录字段交换（DFX）的字段数据交换在两个方向起作用：从记录集对象的字段数据成员到数据源上的记录字段以及从数据源上的记录到记录集对象。如果在动态绑定列，则不需实现DoFieldExchange。
派生的记录集类实现DoFieldExchange所必须采取的唯一措施是，用ClassWizard创建类并指定字段数据成员的名字和数据类型。可能还把代码加到ClassWizard写的内容中以指定参数数据成员。如果要动态绑定所有字段，除非指定参数数据成员，否则这个函数将无效。有关的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：动态绑定记录”。
在声明用ClassWizard派生的记录集类时，向导将写入一个DoFieldExchange覆盖，它与下例类似：
void CCustSet::DoFieldExchange(CDaoFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CCustSet)
pFX->SetFieldType(CDaoFieldExchange::outputColumn);
DFX_Text(pFX, "Name", m_strName);
DFX_Short(pFX, "Age", m_wAge);
//}}AFX_FIELD_MAP
}
有关记录字段交换的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录字段交换（DFX）”。

请参阅：CDaoException


 CDaoRecordset::Edit

virtual void Edit();
throw(CDaoException, CMemoryException);

说明：
调用这个函数，可以改变当前记录。
一旦调用了Edit成员函数，对当前记录字段的变化将拷贝到拷贝缓存中。在对记录进行希望的改动后，调用Update保存所做改动。Edit保存记录集数据成员的值。如果调用Edit，修改并再调用Edit，记录值将恢复为第一次Edit调用前的值。
警告：
如果编辑了一条记录，然后未调用Update就滚动到另一条记录，虽然没有警告，也会丢失改动的结果。
有时想通过置为Null（不包含数据）来更新一个列。为此调用带参数TRUE的SetFieldNull来为字段作Null记号。这也引起要更新的列，如果想把值没有改变的字段写入数据源，调用带参数TRUE的SetFieldDirty。即使这个字段原来为Null值也是有效的。
框架对字段数据成员作记号，保证能够通过DAO记录字段交换（DFX）机制把它们写进数据源上的记录。改变字段值通常会自动把这个字段设置为脏的，因此几乎不需要调用SetFieldDirty，但有时想确保列被明确更新或插入，不管字段数据成员中是些什么值。DFX机制也采用PSEUDONULL。有关的更多信息，请参阅CDaoFieldExchange::m_nOperation。
如果没使用双缓存机制，字段值的改变将不会把这个字段设置为脏的。
这种情况下，有必要明确设置这个字段脏。m_bCheckCacheForDirtyFields中包含的标记控制这个自动字段检查。
在多用户环境中，如果对记录集对象被动封锁，则从使用Edit时起直到完成更新，记录将保持封锁。如果对记录集对象主动封锁，则只在更新到数据库之前封锁记录并与以前编辑的记录作比较。如果调用Edit之后记录不变化，Update操作失败，MFC产生一个异常。可以用SetLockingMode改变封锁模式。
注意：
主动封锁总是用于外部数据格式，例如ODBC和可安装的ISAM。
调用Edit之后当前记录保持为当前记录。要调用Edit，必须存在一个当前记录。如果不存在当前记录或者没有打开的表型或动态集型记录集对象的参考，将产生异常。下列情况下调用Edit会导致产生一个CDaoException：
·不存在当前记录
·数据库或记录集只读
·记录中的字段不可更新
·数据库或记录集由其它用户以独占方式打开
·其它用户封锁了包含记录的页面
如果数据源支持事务，可以使Edit调用成为事务的一部分。注意在调用Edit之间和打开记录集之后，应该调用CDaoWorkspace::BeginTrans。还要注意到调用Workspace::CommitTrans并不能取代调用Update来完成Edit操作。有关事务的更多信息，请参阅CDaoWorkspace。
有关更新记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集操作”。有关信息，请参阅DAO帮助中的“AddNew方法”、“Edit方法”、“Delete”、“Update方法”、“Updatable特性”。

请参阅：
CDaoRecordset::AddNew, CDaoRecordset::CancelUpdate, CDaoRecordset::CanTransact, CDaoRecordset::Delete, CDaoRecordset::Update


 CDaoRecordset::FillCache

void FillCache(long* pSize = NULL, COleVariant* pBookmark=NULL);
throw(CDaoException, CMemoryException);

参数：
pSize | 指定要填充缓存的行数。如果省略此参数，这个值将由基本FAO对象的CacheSize特性设置来确定。
pBookmark | 指定一个书签的COleVariant。由这个书签指示记录开始填充缓存。如果省略此参数，缓存将由基本DAO对象的CacheStart特性指示的记录开始填充。

说明：
调用这个成员函数，可以缓存来自记录集的指定数量的记录。缓存增强了应用从远程服务器获取数据的性能。缓存是本地内存的一块，保存从服务器取得的最近数据，假定在程序运行期间会需要这些数据。需要数据时，Microsoft Jet数据库引擎首先检查缓存数据，而不是从服务器获取，那样会花更多时间。在非ODBC数据源上使用缓存无效，原因是数据不保存在缓存中。
除了等待缓存在取数据时再填充，可以通过调用FillCache成员函数在任何时间明确填充缓存。这种填充缓存的途径更快，因为FillCache一次取几条记录而不是一次一条。例如在显示每屏的记录时，可以让应用调用FillCache获取下一屏的记录。
任何用记录集对象访问的ODBC数据库都可以有一个本地缓存。为创建缓存，从远端数据源打开记录集对象，然后调用记录集的SetCacheSize和SetCacheStart成员函数。如果lSize和lBookmark创建的范围部分地或全部超出由SetCacheSize和SetCacheStart指定的范围，将忽略范围以外的那部分记录集，不加载到缓存。如果FillCache比保留在远程数据源中需要更多条记录，则只取到剩余记录，不发生异常。
从缓存取得的记录不影响其它用户对源数据的并发改变。
FillCache只取没有缓存的记录。为强行更新所有缓存数据，调用带lSize参数等于0的SetCacheSize成员函数，调用带lSize参数等于你最初需要的缓存大小的SetCacheSize，然后调用FillCache。
有关缓存记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO扩展：使用外部数据源增强性能”。有关信息，请参阅DAO帮助中的“FillCache方法”。

请参阅：
CDaoRecordset::GetCacheSize, CDaoRecordset::GetCacheStart, CDaoRecordset::SetCacheSize, CDaoRecordset::SetCacheStart


 CDaoRecordset::Find

virtual BOOL Find(long lFindType, LPCTSTR lpszFilter);
throw(CDaoException, CMemoryException);

返回值：
如果找到匹配记录，则返回非零值，否则为0。

参数：
lFindType指示期望的Find操作类型的一个值。可能值为：
· | AFX_DAO_NEXT | 查找匹配字段串的下一个位置。
· | AFX_DAO_PREV | 查找匹配字段串的上一个位置。
· | AFX_DAO_FIRST | 查找匹配字段串的第一个位置。
· | AFX_DAO_LAST | 查找匹配字段串的最后一个位置。

lpszFilter用于定位记录的一个字符串表达式（类似于不加WHERE的SQL语句中的WHERE子句）。例如：
Find(AFX_DAO_FIRST, "colRecID = 7")
Find(AFX_DAO_NEXT, "customerName = 'Jones'")

说明：
调用这个成员函数，可以使用比较操作符在动态集或快照型记录集中定位一个特殊字符串。可以查找这个字符串的第一个、下一个、上一个或最后一个实例。Find是一个虚拟函数，所以可以覆盖它并增加自己的工具。FindFirst，FindLast，FindNext和FindPrev成员调用Find成员函数，所以可以使用Find控制所有Find操作的行为。
要在表型记录集中定位记录，调用Seek成员函数。
提示：
记录集合越小，Find效率越高。通常情况下，尤其对ODBC数据，更好的方法是创建只获取需要记录的一个新查询。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“FindFirst，FindLast，FindNext，FindPrevious方法”。

请参阅：
CDaoRecordset::FindFirst, CDaoRecordset::FindLast, CDaoRecordset::FindNext, CDaoRecordset::FindPrev


 CDaoRecordset::FindFirst

BOOL FindFirst(LPCTSTR lpszFilter);
throw(CDaoException, CMemoryException);

返回值：
如果找到匹配记录，则返回非零值，否则为0。

参数：
lpszFilter 用于定位记录的一个字符串表达式（类似于不加WHERE的SQL语句中的WHERE子句）。

说明：
调用这个成员函数，可以查找与指定条件匹配的第一条记录。FindFirst成员函数从记录集开头查找，直到记录集末尾。
如果在查找中想包括所有记录（不是只满足一个指定条件），使用一个Move操作在记录之间移动。要在表型记录集中定位记录，调用Seek成员函数。
如果未找到匹配条件的记录，则不能确定当前记录指针，FindFirst返回0。如果记录集中包含一个以上满足条件的记录，FindFirst定位在第一次出现时，FindNext定位在第二次，依此类推。
警告：
如果编辑了一条记录，然后未调用Update就滚动到另一条记录，虽然没有警告，也会丢失改动的结果。
Find成员函数从下列表中指定的地点并根据其方向搜索：
Find操作 | 开头 | 搜索方向
FindFirst | 记录集开头 | 记录集末尾
FindLsat | 记录集末尾 | 记录集开头
FindNext | 当前记录 | 记录集末尾
FindPrevious | 当前记录 | 记录集开头
重点：
调用FindLast时，如果以前没有对记录集计数，Microsoft Jet数据库引擎将在开始搜索前进行。第一次搜索会比以后搜索花的时间长些。
不过，使用一个Find操作符与调用MoveFirst或MoveNext不同，后者只是简单地使第一条或者最后一条记录成为当前的，不指定任何条件。
可以让Move操作跟在Find操作后面。
使用Find操作时牢记以下几点：
· | 如果Find返回非零，则未定义当前记录。这时必须回头把当前记录指针定位到有效记录。
· | 不能对只能前滚的快照型记录集使用Find操作。
· | 搜索包含日期的字段时，即使Microsoft Jet数据库引擎未使用U.S.版本，也应该使用U.S.日期格式（月-日-年），否则找不到匹配记录。
· | 处理ODBC数据库和大型动态集时，尤其对后者，会发现使用Find操作速度慢。通过使用带定制ORDER BY或WHERE子句的SQL查询、参数查询或者获取指定带索引记录的CDaoQueryDef，可以改善其性能。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“FindFirst，FindLast，FindNext，FindPrevious方法”。

请参阅：
CDaoRecordset::FindFirst, CDaoRecordset::FindLast, CDaoRecordset::FindNext, CDaoRecordset::FindPrev


 CDaoRecordset::FindLast

BOOL FindLast(LPCTSTR lpszFilter);
throw(CDaoException, CMemoryException);

返回值：
如果找到匹配记录，则返回非零值，否则为0。

参数：
lpszFilter 用于定位记录的一个字符串表达式（类似于不加WHERE的SQL语句中的WHERE子句）。

说明：
调用这个成员函数，可以查找与指定条件匹配的最后一条记录。FindLast成员函数从记录集开头查找，直到记录集开头。
如果在查找中想包括所有记录（不是只满足一个指定条件），使用一个Move操作在记录之间移动。要在表型记录集中定位记录，调用Seek成员函数。
如果未找到匹配条件的记录，则不能确定当前记录指针，FindLast返回0。如果记录集中包含一个以上满足条件的记录，FindFirst定位在第一次出现时，FindNext定位在第二次，依此类推。
警告：
如果编辑了一条记录，然后未调用Update就滚动到另一条记录，虽然没有警告，也会丢失改动的结果。
不过，使用一个Find操作符与调用MoveFirst或MoveNext不同，后者只是简单地使第一条或者最后一条记录成为当前的，不指定任何条件。
可以让Move操作跟在Find操作后面。
使用Find操作时牢记以下几点：
· | 如果Find返回非零，则未定义当前记录。这时必须回头把当前记录指针定位到有效记录。
· | 不能对只能前滚的快照型记录集使用Find操作。
· | 搜索包含日期的字段时，即使Microsoft Jet数据库引擎未使用U.S.版本，也应该使用U.S.日期格式（月-日-年）；否则找不到匹配记录。
· | 处理ODBC数据库和大型动态集时，尤其对后者，会发现使用Find操作速度慢。通过使用带定制ORDER BY或WHERE子句的SQL查询、参数查询或者获取指定带索引记录的CDaoQueryDef，可以改善其性能。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“FindFirst，FindLast，FindNext，FindPrevious方法”。

请参阅：
CDaoRecordset::Find, CDaoRecordset::FindFirst, CDaoRecordset::FindNext, CDaoRecordset::FindPrev


 CDaoRecordset::FindNext

BOOL FindNext(LPCTSTR lpszFilter);
throw(CDaoException, CMemoryException);

返回值：
如果找到匹配记录，则返回非零值，否则为0。

参数：
lpszFilter 用于定位记录的一个字符串表达式（类似于不加WHERE的SQL语句中的WHERE子句）。

说明：
调用这个成员函数，可以查找与指定条件匹配的下一条记录。FindNext成员函数从记录集开头查找，直到记录集末尾。
如果在查找中想包括所有记录（不是只满足一个指定条件），使用一个Move操作在记录之间移动。要在表型记录集中定位记录，调用Seek成员函数。
如果未找到匹配条件的记录，则不能确定当前记录指针，FindNext返回0。如果记录集中包含一个以上满足条件的记录，FindFirst定位在第一次出现时，FindNext定位在第二次，依此类推。
警告：
如果编辑了一条记录，然后未调用Update就滚动到另一条记录，虽然没有警告，也会丢失改动的结果。
不过，使用一个Find操作符与调用MoveFirst或MoveNext不同，后者只是简单地使第一条或者最后一条记录成为当前的，不指定任何条件。
可以让Move操作跟在Find操作后面。
使用Find操作时牢记以下几点：
· | 如果Find返回非零，则未定义当前记录。这时必须回头把当前记录指针定位到有效记录。
· | 不能对只能前滚的快照型记录集使用Find操作。
· | 搜索包含日期的字段时，即使Microsoft Jet数据库引擎未使用U.S.版本，也应该使用U.S.日期格式（月-日-年）；否则找不到匹配记录。
· | 处理ODBC数据库和大型动态集时，尤其对后者，会发现使用Find操作速度慢。通过使用带定制ORDER BY或WHERE子句的SQL查询、参数查询或者获取指定带索引记录的CDaoQueryDef，可以改善其性能。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“FindFirst，FindLast，FindNext，FindPrevious方法”。

请参阅：
CDaoRecordset::Find, CDaoRecordset::FindFirst, CDaoRecordset::FindLast, CDaoRecordset::FindPrev


 CDaoRecordset::FindPrev

BOOL FindPrev(LPCTSTR lpszFilter);
throw(CDaoException, CMemoryException);

返回值：
如果找到匹配记录，则返回非零值，否则为0。

参数：
lpszFilter 用于定位记录的一个字符串表达式（类似于不加WHERE的SQL语句中的WHERE子句）。

说明：
调用这个成员函数，可以查找与指定条件匹配的上一条记录。FindPrev成员函数从当前记录集开始查找，直到记录集开头。
如果在查找中想包括所有记录（不是只满足一个指定条件），使用一个Move操作在记录之间移动。要在表型记录集中定位记录，调用Seek成员函数。
如果未找到匹配条件的记录，则不能确定当前记录指针，FindPrev返回0。如果记录集中包含一个以上满足条件的记录，FindFirst定位在第一次出现时，FindNext定位在第二次，依此类推。
警告：
如果编辑了一条记录，然后未调用Update就滚动到另一条记录，虽然没有警告，也会丢失改动的结果。
不过，使用一个Find操作符与调用MoveFirst或MoveNext不同，后者只是简单地使第一条或者最后一条记录成为当前的，不指定任何条件。
可以让Move操作跟在Find操作后面。
使用Find操作时牢记以下几点：
· | 如果Find返回非零，则未定义当前记录。这时必须回头把当前记录指针定位到有效记录。
· | 不能对只能前滚的快照型记录集使用Find操作。
· | 搜索包含日期的字段时，即使Microsoft Jet数据库引擎未使用U.S.版本，也应该使用U.S.日期格式（月-日-年）；否则找不到匹配记录。
· | 处理ODBC数据库和大型动态集时，尤其对后者，会发现使用Find操作速度慢。通过使用带定制ORDER BY或WHERE子句的SQL查询、参数查询或者获取指定带索引记录的CDaoQueryDef，可以改善其性能。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“FindFirst，FindLast，FindNext，FindPrevious方法”。

请参阅：
CDaoRecordset::Find, CDaoRecordset::FindFirst, CDaoRecordset::FindLast, CDaoRecordset::FindNext


 CDaoRecordset::GetAbsolutePosition

long GetAbsolutePosition();
throw(CDaoException, CMemoryException);

返回值：
一个由0到记录集中记录数的整数，对应于记录集中当前记录的序数位置。

说明：
返回记录集对象当前记录的记录号。基础DAO对象的AbsolutePosition特性值是基于零的；设置0表示记录集的第一条记录。可以通过调用GetRecordCount确定记录总数。由于要访问所有记录来确定数量，GetRecordCount可能会花一些时间。
如果没有当前记录，和在记录集中没有记录一样，会返回-1。如果删除了当前记录，则未定义AbsolutePosition特性值，如果参考MFC将产生一个异常。对于动态集型记录集，新记录附加到最后面。
注意：
不提倡用这个特性作为代用记录数。书签仍然是保持和返回到指定位置的推荐方式，并且是到达各种记录集对象当前记录位置的唯一方式。尤其在前面记录已删除时给定记录的位置发生了变化。由于不能保证记录集内各个记录的顺序，除非它是用带ORDERBY子句的SQL语句创建的。在重新创建记录集时，也不能保证给定记录集有相同的绝对地址。
注意：
这个成员函数只对动态集型和快照型记录集有效。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“AbsolutePosition特性”。

请参阅：CDaoRecordset::SetAbsolutePosition


 CDaoRecordset::GetBookmark

COleVariant GetBookmark();
throw(CDaoException, CMemoryException);

返回值：返回表示当前记录上书签的一个值。

说明：
调用这个成员函数，可以获取特殊记录中的书签值。创建或打开记录集对象时，如果支持书签，它的每个记录都已经有唯一的一个书签。调用CanBookmark以确定记录集是否支持书签。
通过把书签值分配到COleVariant对象，可以为当前记录保存书签。在移向不同记录，想在任何时候快速返回那条记录时，调用带有与那个COleVariant对象值对应参数的SetBookmark。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“Bookmark特性”。

请参阅：
CDaoRecordset::SetBookmark, CDaoRecordset::CanBookmark


 CDaoRecordset::GetCacheSize

long GetCacheSize();
throw(CDaoException, CMemoryException);

返回值：
指定动态集型记录集中记录数的一个值，包含要局部缓存的来自ODBC数据源的数据。

说明：
调用这个成员函数，可以获取缓存的记录数。数据缓存增强了应用通过动态集型记录集对象从远程服务器获取数据的性能。缓存是本地内存的一块，保存从服务器取得的最近数据，假定在程序运行期间会需要这些数据。需要数据时，Microsoft Jet数据库引擎首先检查缓存数据，而不是从服务器获取，那样会花更多时间。不是来自ODBC数据源的数据不保存在缓存中。
任何附加表之类的ODBC数据库都可以有一个本地缓存。
有关缓存记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO扩展：使用外部数据源增强性能”。有关信息，请参阅DAO帮助中的“Cache Size, CacheStart方法”。

请参阅：
CDaoRecordset::FillCache, CDaoRecordset::GetCacheStart, CDaoRecordset::SetCacheSize, CDaoRecordset::SetCacheStart


 CDaoRecordset::GetCacheStart

COleVariant GetCacheStart();
throw(CDaoException, CMemoryException);

返回值：
指定要在记录集中缓存的第一条记录的书签的一个COleVariant。

说明：
调用这个成员函数，可以获取第一条记录在要缓存的记录集中的书签值，Microsoft Jet数据库引擎从缓存查询缓存范围内的记录，从服务器查询缓存范围外的记录。
注意：从缓存取得的记录不影响其它用户对源数据的并发改动。
有关缓存记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO扩展：使用外部数据源增强性能”。有关信息，请参阅DAO帮助中的“Cache-Size,CacheStart方法”。

请参阅：
CDaoRecordset::FillCache, CDaoRecordset::GetCacheSize, CDaoRecordset::SetCacheSize, CDaoRecordset::SetCacheStart


 CDaoRecordset::GetCurrentIndex

CString GetCurrentIndex();
throw(CDaoException, CMemoryException);

返回值：
包含当前表型记录集正在使用的索引名字的CString。如果未设索引，则返回一个空字符串。

说明：
调用这个成员函数，可以确定在索引表型CDaoRecordset对象中当前使用的索引。这个索引是表型记录集中记录排序的基础，由Seek成员函数用来定位记录。
CDaoRecordset对象可以有多于一个的索引，在一个时间只能使用一个（尽管CDaoTableDef对象可能有几个在它上面定义的索引）。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“Index对象”和“当前索引”的定义。

请参阅：CDaoRecordset::SetCurrentIndex


 CDaoRecordset::GetDateCreated

COleDateTime GetDateCreated();
throw(CDaoException, CMemoryException);

返回值：
包含创建基本表日期和时间的COleDateTime对象。

说明：
调用这个成员函数，可以获取基本表创建的日期和时间。日期和时间是由计算机在创建基本表时派生出的。
有关创建记录集的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。有关信息，请参阅DAO帮助中的“DataCreated,LastUpdated特性”。

请参阅：CDaoRecordset::GetDateLastUpdated


 CDaoRecordset::GetDateLastUpdated

COleDateTime GetDateLastUpdated();
throw(CDaoException, CMemoryException);

返回值：
包含最近更新基本表日期和时间的COleDateTime对象。

说明：
调用这个成员函数，可以获取模式最后修改的日期和时间。日期和时间设置是由计算机在最近更新基本表结构（模式）时派生出的。
有关创建记录集的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。有关信息，请参阅DAO帮助中的“DataCreated,LastUpdated特性”。

请参阅：CDaoRecordset::GetDateCreated


 CDaoRecordset::GetDefaultDBName

virtual CString GetDefaultDBName();

返回值：
包含派生记录集的数据库路径和名字的CString。

说明：
调用这个成员函数，可以确定用于这个记录集的数据库名字。如果创建的记录集没有指向CDaoDatabase的指针，则记录集使用这条路径来打开缺省数据库。缺省情况下，这个函数返回空字符串。ClassWizard从CDaoRecordset派生一个新记录集时，它将创建这个函数。
下例表示在字符串中双反斜线（\\）的使用，需要正确解释的字符串有此要求：
CString CMyRecordset::GetDefaultDBName(void)
{
return _T("c:\\mydir\\datasrc.mdb");
}
有关与数据库连接的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。

请参阅：
CDaoRecordset::GetDefaultSQL, CDaoRecordset::GetName, CDaoRecordset::GetSQL, CDaoRecordset::GetType


 CDaoRecordset::GetDefaultSQL

virtual CString GetDefaultSQL();

返回值：包含缺省SQL语句的一个CString。

说明：
框架调用这个成员函数，可以得到记录集基于的缺省SQL语句。它可能是一个表的名字或一条SQL SELECT语句。
通过用ClassWizard声明记录集类，间接定义了缺省SQL语句，ClassWizard执行此项任务。
如果对Open传递一个空SQL字符串，则调用这个函数可以确定用于记录集的表名和SQL。
有关与数据库连接的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。

请参阅：
CDaoRecordset::GetDefaultDBName, CDaoRecordset::GetName, CDaoRecordset::GetSQL, CDaoRecordset::GetType


 CDaoRecordset::GetEditMode

short GetEditMode();
throw(CDaoException, CMemoryException);

返回值：返回一个值，指示当前记录的编辑状态。

说明：
调用这个成员函数，可以确定编辑状态。它是下列值之一：
值 | 描述
dbEditNone | 没有正在处理中的编辑操作
dbEditInProgress | 已经调用了Edit
dbEditAdd | 已经调用了AddNew
有关更新记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集操作”。有关信息，请参阅DAO帮助中的“EditMode特性”。


 CDaoRecordset::GetFieldCount

short GetFieldCount();
throw(CDaoException, CMemoryException);

返回值：记录集中的字段数量。

说明：
调用这个成员函数，可以获取记录集中定义的字段（列）数。
有关创建记录集的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。有关信息，请参阅DAO帮助中的“Count特性”。

请参阅：
CDaoRecordset::GetFieldInfo, CDaoRecordset::GetFieldValue, CDaoRecordset::GetIndexCount, CDaoRecordset::GetIndexInfo


 CDaoRecordset::GetFieldInfo

void GetFieldInfo(int nIndex, CDaoFieldInfo& fieldinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
throw(CDaoException, CMemoryException);
void GetFieldInfo(LPCTSTR lpszName, CDaoFieldInfo& fieldinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
throw(CDaoException, CMemoryException);

参数：
nIndex | 记录集Fields收集中预先定义字段的基于0的索引，用于按索引查找。
fieldinfo | CDaoFieldInfo结构的一个参考。
dwInfoOptions指定要获取的有关记录集信息的选项。按照它们引起的返回函数，有效选项在这里列出来。为获得最佳性能，只获取需要的信息级别：
· | AFX_DAO_PRIMARY_INFO | （缺省）Name, Type, Size, Attributes
· | AFX_DAO_SECONDARY_INFO | 基本信息再加上：OrdinalPosition, Required, Allow Zero Length, Collating Order, ForeignName, Source Field, Source Table
· | AFX_DAO_ALL_INFO | 基本和辅助信息再加上：Default Value,Validation Rule, Validation Text
lpszName | 字段名。

说明：
调用这个成员函数，可以获取记录集中有关的字段信息。这个函数的一个版本允许按索引查找字段。另一个版本允许按名字查找。
对返回信息的描述请参阅CDaoFieldInfo结构。这个结构中有对应于在上面dwInfoOptions描述所列信息的项目的成员。在一个级别上查询信息时，同时得到任何低级别的信息。
有关创建记录集的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。有关信息，请参阅DAO帮助中的“Attribute特性”。

请参阅：
CDaoRecordset::GetFieldCount, CDaoRecordset::GetFieldValue, CDaoRecordset::GetIndexCount, CDaoRecordset::GetIndexInfo


 CDaoRecordset::GetFieldValue

virtual void GetFieldValue(LPCTSTR lpszName, COleVariant& varValue);
throw(CDaoException, CMemoryException);
virtual void GetFieldValue(int nIndex, COleVariant& varValue);
throw(CDaoException, CMemoryException);
virtual COleVariant GetFieldValue(LPCTSTR lpszName);
throw(CDaoException, CMemoryException);
virtual COleVariant GetFieldValue(int nIndex);
throw(CDaoException, CMemoryException);

返回值：
有返回值的两种版本的GetFieldValue返回包含字段值的一个COleVariant对象。

参数：
lpszName | 指向包含字段名的字符串的一个指针。
varValue | 要存储字段值的COleVariant对象的一个参考。
nIndex | 记录集Fields收集中预先定义字段的基于0的索引，用于按索引查找。

说明：
调用这个成员函数，可以获取记录集中的数据。可以按名字或序数位置查找一个字段。
注意：
与调用返回COleVariant对象的版本相比，这个把COleVariant对象参考作为一个参数的成员函数版本效率更高。
使用GetFieldValue和SetFieldValue以在运行期间动态绑定字段，而不是用DoFieldExchange机制静态绑定列。
GetFieldValue和DoFieldExchange机制可以联合起来改善性能。例如，使用GetFieldValue获取正需要的值，把这个调用分派给界面中的“详细信息”按钮。
有关动态绑定字段的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：动态绑定字段”。有关信息，请参阅DAO帮助中的“Field对象”和“Value特性”。

请参阅：CDaoRecordset::SetFieldValue


 CDaoRecordset::GetIndexCount

short GetIndexCount();
throw(CDaoException, CMemoryException);

返回值：表型记录集中的索引数。

说明：
调用这个成员函数，可以确定表型记录集上有效的索引数量。在遍历记录集中所有索引时，GetIndexCount是有用的。为此把GetIndexCount和GetIndexInfo连接起来使用。如果在动态集型或快照型记录集上调用这个成员函数，MFC将产生一个异常。
有关创建记录集的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。有关信息，请参阅DAO帮助中的“Attribute特性”。

请参阅：
CDaoRecordset::GetFieldCount, CDaoRecordset::GetFieldInfo, CDaoRecordset::GetIndexInfo


 CDaoRecordset::GetIndexInfo

void GetIndexInfo(int nIndex, CDaoIndexInfo& indexinfo,DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
throw(CDaoException, CMemoryException);
void GetIndexInfo(LPCTSTR lpszName, CDaoIndexInfo& indexinfo,DWORD dwInfoOptions=AFX_DAO_PRIMARY_INFO);
throw(CDaoException, CMemoryException);

参数：
nIndex | 记录集Fields收集中预先定义字段的基于0的索引，用于按数字位置查找。
indexinfo | 对CDaoIndexInfo结构的一个参考。
dwInfoOptions指定要获取的有关索引信息的选项。按照它们引起的返回函数，有效选项在这里列出来。为获得最佳性能，只获取需要的信息级别：
· | AFX_DAO_PRIMARY_INFO | （缺省）Name, Field Info, Fields
· | AFX_DAO_SECONDARY_INFO | 基本信息再加上：Primary,Unique, Clustered, IgnoreNulls, Required, Foreign
· | AFX_DAO_ALL_INFO | 基本和辅助信息再加上：Distinct Count
lpszName | 指向索引对象名字的一个指针，用于按名字查找。

说明：
调用这个成员函数，可以获取在记录集基础上，基本表中定义的索引的各种信息。这个函数的一个版本允许按在收集中的位置查找索引。另一个版本允许按名字查找。
对返回信息的描述请参阅CDaoFieldInfo结构。这个结构中有对应于在上面dwInfoOptions描述所列信息的项目的成员。在一个级别上查询信息时，同时得到任何低级别的信息。
有关创建记录集的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。有关信息，请参阅DAO帮助中的“Attribute特性”。

请参阅：
CDaoRecordset::GetFieldCount, CDaoRecordset::GetFieldInfo, CDaoRecordset::GetIndexCount, CDaoRecordset::GetLastModifiedBookmark


 CDaoRecordset::GetLastModifiedBookmark

COleVariant GetLastModifiedBookmark();
throw(CDaoException, CMemoryException);

返回值：
包含指示最近添加或改变的记录的书签COleVariant。

说明：
调用这个成员函数，可以获取最近添加或更新记录的书签。创建或打开记录集对象时，如果支持书签，它的每个记录都已经有唯一的一个书签。调用CanBookmark以确定记录集是否支持书签。如果记录集不支持书签，则产生CDaoException。
添加记录时，它出现在记录集末尾而不是当前记录。要使新记录成为当前的，需调用GetLastModifiedBookmark，然后调用SetBookmark以返回新添加的记录。
有关记录集中导航的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“LastModified特性”。

请参阅：CDaoRecordset::GetBookmark, CDaoRecordset::SetBookmark


 CDaoRecordset::GetLockingMode

BOOL GetLockingMode();
throw(CDaoException, CMemoryException);

返回值：
如果是被动封锁类型，则返回非零值；否则对主动记录封锁返回0。

说明：
调用这个成员函数，可以确定对记录集有效的封锁类型。被动封锁有效时，只要调用Edit成员函数，就封锁包含正在编辑的记录数据页面。调用Update或Close成员函数，或者任何Move或Find操作时解除封锁。
主动封锁有效时，只有在用Update成员函数更新记录时才封锁包含记录的数据页面。
处理ODBC数据源时，封锁模式总是主动的。
有关更新记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集操作”。有关信息，请参阅DAO帮助中的“LockEdits特性”和“多用户应用中的封锁行为”。

请参阅：CDaoRecordset::SetLockingMode


 CDaoRecordset::GetName

CString GetName();
throw(CDaoException, CMemoryException);

返回值：包含记录集名字的一个CString。

说明：
调用这个成员函数，可以获取记录集名字。记录集的名字必须以字母打头，最多包含40个字符。它可以包括数字和下划线，但不能有标点符号或空格。
有关创建记录集的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。有关信息，请参阅DAO帮助中的“Name特性”。

请参阅：
CDaoRecordset::GetDefaultDBName, CDaoRecordset::GetDefaultSQL, CDaoRecordset::GetSQL, CDaoRecordset::GetType


 CDaoRecordset::GetParamValue

virtual COleVariant GetParamValue(int nIndex);
throw(CDaoException, CMemoryException);
virtual COleVariant GetParamValue(LPCTSTR lpszName);
throw(CDaoException, CMemoryException);

返回值：
包含参数值的一个类COleVariant的对象。

参数：
nIndex | 基本DAOParameter对象中参数的数字位置。
lpszName | 想获得参数值的参数名字。

说明：
使用这个成员函数，可以获取基础DAOParameter对象中有的指定参数当前值。可以使用名字或收集中的数字位置访问这个参数。
有关参数的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询：过滤和参数化查询”。有关信息，请参阅DAO帮助中的“Parameter对象”。

请参阅：CDaoRecordset::SetParamValue, CDaoRecordset::m_nParams


 CDaoRecordset::GetPercentPosition

float GetPercentPosition();
throw(CDaoException, CMemoryException);

返回值：
0和100间的一个数，指示基于记录集中记录的百分比，当前记录在记录集中的大概位置。

说明：
处理动态集型或快照型记录集时，如果在全面对记录集计数之前调用GetPercentPosition，移动的数量相对于由调用GetRecordCount指示时访问的记录数。通过调用MoveLast，可以移到最后一条记录，完成对所有记录集数量合计，但这需要相当长的时间。
可以对包括无索引的表在内的所有三种记录集对象调用GetPercentPosition。但是在只能前滚的快照上，或者由遍历查询从外部数据源打开的记录集上，不能调用GetPercentPosition。如果不存在当前记录或者当前记录已被删除，则产生CDaoException。
有关记录集中导航的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“PercentPosition特性”。

请参阅：CDaoRecordset::SetPercentPosition


 CDaoRecordset::GetRecordCount

long GetRecordCount();
throw(CDaoException, CMemoryException);

返回值：返回记录集中的记录数量。

说明：
调用这个成员函数，可以找出已经在记录集中访问了多少记录。除非所有记录都访问过了，否则GetRecordCount不会暗示动态集型或快照型记录集中有多少条记录。这个成员函数调用的完成需要大量时间。
一旦访问了最后一条记录，返回值表示记录集中未删除记录的总数。要强制访问最后一条记录，需对记录集调用MoveLast或FindLast成员函数。还可以使用SQL Count来确定查询要返回的记录大概数量。
应用删除动态集记录集中的记录时，GetRecordCount的返回值减少。但是除非当前记录定位到一条删除记录时，GetRecordCount不会反映由其他用户删除的记录。如果执行了一条影响记录计数的事务，然后回滚这条事务，GetRecordCount不会影响剩余记录的实际数量。
快照型记录集的GetRecordCount值不受基础表中变化的影响。
表型记录集的GetRecordCount值反映表中记录的大约数量。并且在添加或删除表记录时立即受到影响。
没有记录的记录集返回值为0。在处理附加表或者ODBC数据库时，GetRecordCount总返回-1。在记录集上调用Requery成员函数将重设置GetRecordCount的值，就像重新执行这条查询一样。
有关记录集中导航的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“RecordCount特性”。

请参阅：
CDaoRecordset::GetFieldCount, CDaoRecordset::GetFieldInfo, CDaoRecordset::GetIndexCount, CDaoRecordset::GetIndexInfo


 CDaoRecordset::GetSQL

CString GetSQL() const;

返回值：包含SQL语句的一个CString。

说明：
调用这个成员函数，可以获取在记录集打开时，用于选择其中记录的SQL语句。通常这是一条SQL SELECT语句。
由GetSQL返回的字符串与向记录集传递的带有lpszSQL参数的Open成员函数的任何字符串有典型的不同。这是因为记录集在向Open传递的内容。用ClassWizard指定的内容和可能在m_strFilter和m_strSort数据成员中指定的内容基础上构造完整的SQL语句。
重点：只有调用Open之后才能调用这个成员函数。
有关创建记录集的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。有关信息，请参阅DAO帮助中的“SQL特性”。

请参阅：
CDaoRecordset::GetDefaultSQL, CDaoRecordset::GetDefaultDBName, CDaoRecordset::GetName, CDaoRecordset::GetType


 CDaoRecordset::GetType

short GetType();
throw(CDaoException, CMemoryException);

返回值：
表示记录集类型的下列值之一：
· | dbOpenTable | 表型记录集
· | dbOpenDynaset | 动态集型记录集
· | dbOpenSnapshot | 快照型记录集

说明：
打开数据集后调用这个函数，可以确定记录集对象的类型。
有关创建记录集的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。有关信息，请参阅DAO帮助中的“Type特性”。

请参阅：
CDaoRecordset::GetDefaultSQL, CDaoRecordset::GetDefaultDBName, CDaoRecordset::GetName, CDaoRecordset::GetSQL


 CDaoRecordset::GetValidationRule

CString GetValidationRule();
throw(CDaoException, CMemoryException);

返回值：
改变记录或向表中添加记录时，包含记录中的数据有效值的一个CString对象。

说明：
调用这个函数，可以确定用于有效数据的规则。这个规则是基于文本的，每次基础表变化时应用。如果数据不合法，MFC产生一个异常。如果指定返回的错误消息是基础字段对象的ValidationText特性的文本，或者是由基础字段对象的ValidationRule指定的表达式文本，可以调用GetValidationText以获取错误消息的文字。
例如，记录中需要月份中日子的字段可能有“DAY BETWEEN 1 AND31”之类的有效性规则。
有关创建记录集的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。有关信息，请参阅DAO帮助中的“ValidationRule特性”。

请参阅：CDaoRecordset::GetValidationText


 CDaoRecordset::GetValidationText

CString GetValidationText();
throw(CDaoException, CMemoryException);

返回值：
包含消息文本的一个CString对象，如果字段值不满足基本字段对象的有效性规则，将显示这个文本。

说明：
调用这个成员函数，可以获取基础字段对象的ValidationText的特性文本。
有关创建记录集的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。有关信息，请参阅DAO帮助中的“ValidationText特性”。

请参阅：CDaoRecordset::GetValidationRule


 CDaoRecordset::IsBOF

BOOL IsBOF() const;
throw(CDaoException, CMemoryException);

返回值：
记录集不包含记录，或者在第一条记录之前向前滚动时返回非零值，否则为0。

说明：
在记录间滚动之前，调用这个成员函数，可以确定是否走到记录集的第一条记录之前。还可以和IsEOF一起调用IsBOF，用来确定记录集中有无记录。如果记录集不包含记录，则调用Open之后IsEOF立即返回非零。打开至少有一条记录的记录集时，第一条记录成为当前记录并且IsBOF返回0。
如果第一条记录是当前记录并且调用了MovePrev，接下来的IsBOF返回非零。如果IsBOF返回非零并且调用了MovePrev，则产生一个异常。如果IsBOF返回非零，则未定义当前记录，并且查询当前记录的任何动作将返回一个异常。
某些方法对IsBOF和IsEOF设置的效果：
· | 通过调用MoveFirst，内部调用Open使记录集中第一条记录成为当前记录。因此在空记录集上调用Open将导致IsBOF和IsEOF返回非零（请参阅下表，它是关于失败的MoveFirst或MoveLast调用行为的）。
· | 所有成功定位记录的Move操作导致IsBOF和IsEOF返回0。
· | 由Update紧跟其后的AddNew成功地插入一条新记录，将导致IsBOF返回0，但除非IsEOF已经非零，IsEOF的状态将总是保持不变。与Microsoft Jet数据库引擎定义的相同，空记录集的当前记录指行位于文件末尾，因此在当前记录后插入新记录。
· | 任何Delete调用，即使它从记录集中移去唯一剩余的记录，都不会改变IsBOF或IsEOF的值。
这个表表示不同的IsBOF/IsEOF组合所允许的Move操作：
 | MoveFirst,MoveLast | MovePrev,Move < 0 | Move 0 | MoveNext,Move > 0
IsBOF=非零,IsEOF=0 | 允许 | 异常 | 异常 | 允许
IsBOF=0,IsEOF=非零 | 允许 | 允许 | 异常 | 异常
都为非零 | 异常 | 异常 | 异常 | 异常
都为零 | 允许 | 允许 | 允许 | 允许
允许Move操作并非表示这个操作将成功定位一条记录。它只表示允许试着执行指定Move操作，并且不会产生异常。IsBOF和IsEOF成员函数的值可能随试图移动的结果变化。
不定位记录的Move操作对IsBOF和IsEOF值的作用如下表所示：
 | IsBOF | IsEOF
MoveFirst,MoveLast | 非零 | 非零
Move 0 | 不变 | 不变
MovePrev,Move<0 | 非零 | 不变
MoveNext,Move>0 | 不变 | 非零
有关记录集中导航的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“BOF,EOF特性”。

请参阅：CDaoRecordset::IsEOF


 CDaoRecordset::IsDeleted

BOOL IsDeleted() const;

返回值：
如果记录集位置在已删除的记录上，则返回非零值，否则为0。

说明：
调用这个成员函数，可以确定是否已删除当前记录。如果滚动到一条记录并且IsDeleted返回TRUE（非零），然后必须在执行任何其它记录集操作之前滚动到另一条记录。
注意：
不需要检查快照或表型记录集中记录的删除状态，因为不能从快照中删除记录，所以无需调用IsDeleted。对于表型记录集，删除的记录实际从记录集中移去。一旦已经删除一条记录，不管由你或其它用户，还是在其它记录集中，都不能回滚到那条记录。因此不用调用IsDeleted。
以动态集删除记录时，它由记录集中移去并且不能回滚到那条记录。但是如果由其它用户或在基于相同表的其它记录集中删除动态集中的记录，在以后回到那条记录时IsDeleted将返回TRUE。
有关记录集中导航的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“Delete方法”、“LastModified特性”和“EditMode特性”。

请参阅：
CDaoRecordset::Delete, CDaoRecordset::IsBOF, CDaoRecordset::IsEOF


 CDaoRecordset::IsEOF

BOOL IsEOF() const;
throw(CDaoException, CMemoryException);

返回值：
记录集不包含记录，或者在最后一条记录之后向后滚动时返回非零值，否则为0。

说明：
在记录间滚动之前，调用这个成员函数，可以确定是否走到记录集的最后一条记录之后。还可以调用IsEOF，用来确定记录集中有无记录。如果记录集不包含记录，则调用Open之后IsEOF立即返回非零。打开至少有一条记录的记录集时，第一条记录成为当前记录并且IsBOF返回0。如果调用MoveNext时最后一条记录是当前记录，接下来的IsEOF返回非零。如果IsEOF返回非零并且调用了MoveNext，则产生一个异常。
如果IsEOF返回非零，则未定义当前记录，并且查询当前记录的任何动作将返回一个异常。
某些方法对IsBOF和IsEOF设置的效果：
· | 通过调用MoveFirst，内部调用Open使记录集中第一条记录成为当前记录。因此在空记录集上调用Open将导致IsBOF和IsEOF返回非零（请参阅下表，是关于失败的MoveFirst或MoveLast调用行为的）。
· | 所有成功定位记录的Move操作导致IsBOF和IsEOF返回0。
· | 由Update紧跟其后的AddNew成功地插入一条新记录，将导致IsBOF返回0，但除非IsEOF已经非零，IsEOF的状态将总是保持不变。与Microsoft Jet数据库引擎定义的相同，空记录集的当前记录指行位于文件末尾，因此在当前记录后插入新记录。
· | 任何Delete调用，即使它从记录集中移去唯一剩余的记录，都不会改变IsBOF或IsEOF的值。
这个表表示不同的IsBOF/IsEOF组合所允许的Move操作。
 | MoveFirst,MoveLast | MovePrev,Move<0 | Move 0 | MoveNext,Move>0
IsBOF=非零,IsEOF=0 | 允许 | 异常 | 异常 | 允许
IsBOF=0,IsEOF=非零 | 允许 | 允许 | 异常 | 异常
都为非零 | 异常 | 异常 | 异常 | 异常
都为零 | 允许 | 允许 | 允许 | 允许
允许Move操作并非表示这个操作将成功定位一条记录。它只表示允许试着执行指定Move操作，并且不会产生异常。IsBOF和IsEOF成员函数的值可能随试图移动的结果变化。
不定位记录的Move操作对IsBOF和IsEOF值的作用如下表所示：
 | IsBOF | IsEOF
MoveFirst,MoveLast | 非零 | 非零
Move 0 | 不变 | 不变
MovePrev,Move<0 | 非零 | 不变
MoveNext,Move>0 | 不变 | 非零
有关记录集中导航的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“BOF,EOF特性”。

请参阅：CDaoRecordset::IsBOF


 CDaoRecordset::IsFieldDirty

BOOL IsFieldDirty(void* pv) const;
throw(CDaoException, CMemoryException);

返回值：
如果指定字段数据成员标记为脏，则返回非零值，否则为0。

参数：
pv 指向想检查其状态的字段数据成员的一个指针，或者为NULL，用来确定是否有字段是脏的。

说明：
调用这个成员函数，可以确定动态集的指定字段数据成员是否标记为“脏”（有改动）。调用CDaoRecordset的Update成员函数之后（跟在Edit或AddNew调用之后），更新当前记录时，所有脏字段数据成员的数据都要传递到数据源的记录上。有了这些知识，你就可以采取进一步措施，例如取消对字段数据成员列所作标记，这样就不会写到数据源去。有关脏标记的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：缓存多记录”。
IsFieldDirty通过DoFieldExchange实现。
有关记录字段交换的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录字段交换（DFX）”。

请参阅：CDaoRecordset::IsFieldNull, CDaoRecordset::IsFieldNullable


 CDaoRecordset::IsFieldNull

BOOL IsFieldNull(void* pv) const;
throw(CDaoException, CMemoryException);

返回值：
如果指定字段数据成员标记为NULL，则返回非零值，否则为0。

参数：
pv 指向想检查其状态的字段数据成员的一个指针，或者为NULL，用来确定是否有字段是Null。

说明：
调用这个成员函数，可以确定记录集的指定字段数据成员是否标记为Null(在数据库术语中，Null表示“不含任何值”，与C++中的NULL不同)。如果一个字段数据成员标记为Null，则解释为不含任何值的当前记录的一个字段。
注意：
在有些情况下，使用IsFieldNull可能无效，就像下面代码实例表示的那样：
COleVariant varValue;
int nField;

// this code is inefficient because data
// must be retrieved for both IsFieldNull
// and GetFieldValue
if ( !rs.IsFieldNull( pField ) )
rs.GetFieldValue( nField, varValue );

// this code is more efficient
rs.GetFieldValue( nField, varValue );
if ( varValue.vt == VT_NULL )
// do something
注意：
如果正在使用动态记录绑定而没有由CDaoRecordset派生，应保证使用例子中所示的VT_NULL。

请参阅：CDaoRecordset::IsFieldDirty, CDaoRecordset::IsFieldNullable


 CDaoRecordset::IsFieldNullable

BOOL IsFieldNullable(void* pv);
throw(CDaoException, CMemoryException);

返回值：
如果指定字段数据成员可以标记为NULL，则返回非零值，否则为0。

参数：
pv 指向想检查其状态的字段数据成员的一个指针，或者为NULL，用来确定是否有字段是Null。

说明：
调用这个成员函数，可以确定指定字段数据成员是否“可为空值”（可以设置为Null；C++的NULL与Null不同，它在数据库术语中是“不含任何值”的意思）。
不能为Null的字段必须有一个值。添加或者更新记录时，如果试图设置这种字段为Null，数据源将拒绝添加或删除，Update产生一个异常。异常在调用Update时发生，而非调用SetFieldNull时。

请参阅：CDaoRecordset::IsFieldDirty, CDaoRecordset::IsFieldNull


 CDaoRecordset::IsOpen

BOOL IsOpen()const;

返回值：
如果以前调用过记录集对象的Open或Requery成员函数并且记录集还没有关闭，则返回非零值，否则为0。

说明：
调用这个成员函数，可以确定记录集是否打开。
有关创建记录集的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO：创建、打开和关闭DAO对象”。

请参阅：CDaoRecordset::Open, CDaoRecordset::Close


 CDaoRecordset::Move

virtual void Move(long lRows);
throw(CDaoException, CMemoryException);

参数：
lRows 前移或后移的记录数。正值前移，朝着记录集尾。负值后移，朝着记录集开头。

说明：
调用这个成员函数，可以定位记录集的lRows记录成为当前记录。可以向前或向后移动。move(1)等价于MoveNext，move(-1)等价于MovePrev。
警告：
如果记录集中没有记录，调用任何Move函数将产生一个异常。通常要在Move操作前调用IsBOF和IsEOF以确定记录集中是否含有记录。调用Open或Requery后，调用IsBOF或IsEOF。
如果滚动越过了记录集的开头或末尾（IsBOF或IsEOF返回非零），则对Move的调用会产生CDaoException。
正在更新或添加当前记录时调用任何Move函数，更新将丢失，并且没有任何警告。
在只能前滚快照上调用Move时，lRow参数必须是一个正整数，并且不允许书签，所以只能向前移动。
要在记录集中移动到当前记录的第一条、最后一条、下一条或上一条记录，调用MoveFirst，MoveLast，MoveNext或MovePrev成员函数。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“Move方法”和“MoveFirst，MoveLast，MoveNext，MovePrev特性”。

请参阅：
CDaoRecordset::MoveFirst, CDaoRecordset::MoveLast, CDaoRecordset::MoveNext, CDaoRecordset::MovePrev


 CDaoRecordset::MoveFirst

void MoveFirst();
throw(CDaoException, CMemoryException);

说明：
调用这个成员函数，可以使记录集的第一条记录（如果有的话）成为当前记录。打开记录集后不必立即调用MoveFirst，那时第一条记录（如果有的话）自动为当前记录。
警告：
如果记录集中没有记录，调用任何Move函数将产生一个异常。通常要在Move操作前调用IsBOF和IsEOF以确定记录集中是否含有记录。调用Open或Requery后，调用IsBOF或IsEOF。如果滚动越过了记录集的开头或末尾（IsBOF或IsEOF返回非零），则对Move的调用会产生CDaoException。
使用Move函数，可以不带条件地在记录之间移动。使用Find操作在动态集型或快照型记录集对象中定位满足指定条件的记录。在表型记录集对象中定位记录要调用Seek。
如果记录集参考表型记录集，则移动按照表的当前索引。可以利用基础DAO对象的Index特性设置当前索引。如果不设置当前索引，则未定义返回记录的顺序。
如果在基于SQL查询或查询定义的记录集对象上调用MoveLast，则强制完成查询并且对记录集对象完全计数。
对只能前滚的快照不能调用MoveFirst或MovePrev成员函数。
要使记录集对象中当前记录的位置向前或向后移动指定数量的记录需调用Move。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“Move方法”和“MoveFirst，MoveLast，MoveNext，MovePrev特性”。

请参阅：
CDaoRecordset::Move, CDaoRecordset::MoveLast, CDaoRecordset::MoveNext, CDaoRecordset::MovePrev


 CDaoRecordset::MoveLast

void MoveLast();
throw(CDaoException, CMemoryException);

说明：
调用这个成员函数，可以使记录集的最后一条记录（如果有的话）成为当前记录。
警告：
如果记录集中没有记录，调用任何Move函数将产生一个异常。通常要在Move操作前调用IsBOF和IsEOF以确定记录集中是否含有记录。调用Open或Requery后，调用IsBOF或IsEOF。如果滚动越过了记录集的开头或末尾（IsBOF或IsEOF返回非零），则对Move的调用会产生CDaoException。
使用Move函数，可以不带条件地在记录之间移动。使用Find操作在动态集型或快照型记录集对象中定位满足指定条件的记录。在表型记录集对象中定位记录要调用Seek。
如果记录集参考表型记录集，则移动按照表的当前索引。可以利用基础DAO对象的Index特性设置当前索引。如果不设置当前索引，则未定义返回记录的顺序。
如果在基于SQL查询或查询定义的记录集对象上调用MoveLast，则强制完成查询并且对记录集对象完全计数。
对只能前滚的快照不能调用MoveFirst或MovePrev成员函数。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“Move方法”和“MoveFirst，MoveLast，MoveNext，MovePrev特性”。

请参阅：
CDaoRecordset::Move, CDaoRecordset::MoveFirst, CDaoRecordset::MoveNext, CDaoRecordset::MovePrev


 CDaoRecordset::MoveNext

void MoveNext();
throw(CDaoException, CMemoryException);

说明：
调用这个成员函数，可以使记录集的下一条记录成为当前记录。在试图移动到上一条记录之前推荐先调用IsBOF。如果IsBOF返回0，调用MovePrev将产生CDaoException，表示或者已经滚动到第一条记录之前，或者记录集没有选择记录。打开记录集后不必立即调用MoveFirst，那时第一条记录（如果有的话）自动为当前记录。
警告：
如果记录集中没有记录，调用任何Move函数将产生一个异常。通常要在Move操作前调用IsBOF和IsEOF以确定记录集中是否含有记录。调用Open或Requery后，调用IsBOF或IsEOF。如果滚动越过了记录集的开头或末尾（IsBOF或IsEOF返回非零），则对Move的调用会产生CDaoException。
使用Move函数，可以不带条件地在记录之间移动。使用Find操作在动态集型或快照型记录集对象中定位满足指定条件的记录。在表型记录集对象中定位记录要调用Seek。
如果记录集参考表型记录集，则移动按照表的当前索引。可以利用基础DAO对象的Index特性设置当前索引。如果不设置当前索引，则未定义返回记录的顺序。
要使记录集对象中当前记录的位置向前或向后移动指定数量的记录，需调用Move。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“Move方法”和“MoveFirst，MoveLast，MoveNext，MovePrev特性”。

请参阅：
CDaoRecordset::Move, CDaoRecordset::MoveFirst, CDaoRecordset::MoveLast, CDaoRecordset::MovePrev


 CDaoRecordset::MovePrev

void MovePrev();
throw(CDaoException, CMemoryException);

说明：
调用这个成员函数，可以使记录集的上一条记录成为当前记录。
在试图移动到上一条记录之前推荐先调用IsBOF。如果IsBOF返回非0，调用MovePrev将产生CDaoException，表示或者已经滚动到第一条记录之前，或者记录集没有选择记录。
警告：
如果记录集中没有记录，调用任何Move函数将产生一个异常。通常要在Move操作前调用IsBOF和IsEOF以确定记录集中是否含有记录。调用Open或Requery后，调用IsBOF或IsEOF。
如果滚动越过了记录集的开头或末尾（IsBOF或IsEOF返回非零），则对Move的调用会产生CDaoException。
使用Move函数，可以不带条件地在记录之间移动。使用Find操作在动态集型或快照型记录集对象中定位满足指定条件的记录。在表型记录集对象中定位记录要调用Seek。
如果记录集参考表型记录集，则移动按照表的当前索引。可以利用基础DAO对象的Index特性设置当前索引。如果不设置当前索引，则未定义返回记录的顺序。
对只能前滚的快照不能调用MoveFirst或MovePrev成员函数。
要使记录集对象中当前记录的位置向前或向后移动指定数量的记录，需调用Move。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“Move方法”和“MoveFirst，MoveLast，MoveNext，MovePrev特性”。

请参阅：
CDaoRecordset::Move, CDaoRecordset::MoveFirst, CDaoRecordset::MoveLast, CDaoRecordset::MoveNext


 CDaoRecordset::Open

virtual void Open(int nOpenType = AFX_DAO_USE_DEFAULT_TYPE, LPCTSTR lpszSQL = NULL, int nOptions=0);
throw(CDaoException, CMemoryException);
virtual void Open(CDaoTableDef* pTableDef, int nOpenType = dbOpenTable, int nOptions=0);
throw(CDaoException, CMemoryException);
virtual void Open(CDaoQueryDef* pQueryDef, int nOpenType = dbOpenDynaset, int nOptions=0);
throw(CDaoException, CMemoryException);

参数：
nOpenType下列值之一：
· | dbOpenDynaset | 具有双向滚动的动态集型记录集。这是缺省值。
· | dbOpenTable | 具有双向滚动的表型记录集。
· | dbOpenSnapshot | 具有双向滚动的快照型记录集。
lpszSQL包含下列之一的一个字符串指针：
· | NULL指针
· | 一个或多个表定义和/或查询定义（用逗号分隔）的名字。
· | 一条SQL SELECT语句（任选SQL WHERE或ORDER BY子句）。
· | 一个遍历查询
nOptions下面列出的一个或多个选项，缺省值为0，可能值如下：
· | dbAppendOnly | 只能附加新记录（仅对动态集型记录集）。这个选项的字面含意是只能附加记录。MFC ODBC数据库类有一个只附加选项，允许获取和附加记录。
· | dbForwardOnly | 记录集是只能向前滚动的快照。
· | dbSeeChanges | 如果其它用户正在修改你在编辑的数据，产生一个异常。
· | dbDenyWrite | 其它用户不能修改或添加记录。
· | dbDenyRead | 其它用户不能查找记录（仅对表型记录集）。
· | dbReadOnly | 只能查找记录，其它用户可以修改它们。
· | dbInconsistent | 允许不一致更新（仅对动态集型记录集）。
· | dbConsistent | 只允许一致更新（仅对动态集型记录集）。
注意：常量dbConsistent和dbInconsistent相互排斥。可以使用任何一个，但不能在Open的给定实例中使用两个。
pTableDef | 指向CDaoTableDef对象的一个指针。这个版本只对表型记录集有效。使用这个选项时，不使用用于构造CDaoRecordset的CDaoDatabase指针，而使用表定义所在的数据库。
pQueryDef | 指向CDaoQueryDef对象的一个指针。这个版本只对动态集型和快照型记录集有效。使用这个选项时，不使用用于构造CDaoRecordset的CDaoDatabase指针，而使用查询定义所在的数据库。

说明：
必须调用这个成员函数来获取记录集记录。调用Open之前必须构造记录集对象。
这里有几种方法实现此点：
· | 构造记录集对象时，向已经打开的CDaoDatabase对象传递一个指针。
· | 构造记录集对象时，向未打开的CDaoDatabase对象传递一个指针。记录集打开CDaoDatabase对象，但在记录集对象关闭时并不关闭它。
· | 构造记录集对象时，传递一个NULL指针。记录集对象调用GetDefaultDBName获取要打开的Microsoft Access .MDB文件名。然后记录集打开CDaoDatabase对象并在记录集打开期间保持它打开。在记录集上调用Close时，CDaoDatabase对象也将关闭。
注意：
记录集打开CDaoDatabase对象时，它以非独占访问方式打开数据源。
对使用lpszSQL参数的Open版本，一旦打开记录集，可以以几种方式之一获取记录。第一个选项是在DoFieldExchange中有DFX函数。第二个选项是通过调用GetFieldValue成员函数使用动态绑定。这些选项可以分别实现或联合实现。如果联合，必须传递Open调用上自己的SQL语句。有关动态绑定的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：动态绑定记录”。
在使用Open的第二个版本时，要传递给CDaoTableDef对象，所得列可以让你用于通过DoFieldExchange和DFX机制绑定和/或通过GetFieldValue动态绑定。
注意：只能对表型记录集用CDaoTableDef调用Open。
在使用Open的第三个版本时，要传递给CDaoQueryDef对象，将执行查询，所得列可以让你通过DoFieldExchange和DFX机制绑定和/或通过GetFieldValue动态绑定。
注意：
只能对动态集型和快照型记录集用CDaoQueryDef调用Open。
对使用lpszSQL参数的第一个Open版本，基于下表中所列条件选择记录：
LpszSQL参数值 | 确定的选择记录条件 | 实例
NULL | GetDefaultSQL返回的字符串 |
一个或多个表定义和/或查询定义名字的用逗号分隔的列 | DoFieldExchange表示的所有列 | "Customer"
SELECT列列表FROM表列表 | 来自指定表定义和/或查询定义的指定列 | "SELECT CustID,CustName FROMCustomer"
通常过程是向Open传递NULL；这时Open调用GetDefaultSQL，它是创建CDaoRecordset派生类时ClassWizard生成的覆盖成员函数。它的值给出你在ClassWizard中定义的表定义和/或列定义名字。可以替换指定lpszSQL参数中的其它信息。
不论传递何值，Open为查询创建最终SQL字符串（字符串必须有SQLWHERE和ORDER BY子句附加在传递的lqszSQL字符中后面），然后执行这个查询。在调用Open后，通过调用GetSQL可以检查构造的字符串。
记录集类的字段数据成员受选择数据列的绑定。如果返回任何记录，第一条记录成为当前记录。
如果想为记录集设置选项，例如过滤器或者排序，要在构造记录集对象之后和调用Open之前设置m_strSORT或m_strFilter。如果打开记录集后想更新记录集中的记录，要调用Requery。
如果在动态集型或快照型记录集上调用Open，或者数据源参考表示附加表的SQL语句或表定义，则不能为这种参数使用dbOpenType；如果这样做，MFC会产生一个异常。为确定表定义对象是否表示一个附加列，要创建CDaoTableDef对象并调用它的GetConnect成员函数。
在编辑删除相同记录时，如果想跟踪其它用户或者机器上另一个程序所做的变化，使用dbSeeChanges标记。例如两个用户开始编辑同一条记录，第一个用户调用Update成员函数成功。第二个用户调用Update时产生CDaoException。类似地，如果第二个用户想调用Delete删除这条记录，而它已经由第一个用户改变了，则产生CDaoException。
典型地，如果用户在更新时得到这个CDaoException，代码应该更新字段内容并获取最近更新值。如果在删除过程中出现异常，代码能够向用户显示新记录数据和表示数据近期被改变的消息。在这一点，代码能够请求确认用户是否仍然想删除此记录。
提示：
在应用对由ODBC数据源打开的记录集遍历时，使用只能前滚选项（dbForwardOnly）来改善性能。
有关打开记录集的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：创建记录集”。有关信息，请参阅DAO帮助中的“OpenRecordset方法”。

请参阅：CDaoRecordset::Close, CDaoRecordset::CDaoRecordset


 CDaoRecordset::Requery

virtual void Requery();
throw(CDaoException, CMemoryException);

说明：
调用这个成员函数，可以重建（更新）记录集。如果返回任何记录，第一条记录成为当前记录。
为使记录集反映你或其它用户对数据源的添加或删除，必须调用Requery重建记录集。如果记录集是动态集，它会自动反映你或其它用户对现有记录所作更新（但不是添加）。如果记录集是快照，必须调用Requery来反映其它用户所作的编辑以及添加删除。
对动态集或快照，在任何想重建记录集时用参数值调用Requery。调用Requery之前通过设置m_strFilter和m_strSort设置新过滤器。调用Requery之前通过向参数数据成员分配新值设置新参数。
如果重建记录集的努力失败，将关闭记录集。调用Requery之前，可以通过CanRestart成员函数确定能否重新查询记录集。CanRestart不保证Requery会成功。
警告：只在调用Open之后调用Requery。
如果调用CanRestart返回0，则不能在动态集型和快照型记录集上调用Requery，也不能在表型记录集上使用它。
如果调用Requery之后IsBOF和IsEOF均返回非零，则查询不返回任何记录，记录集中不含有数据。
有关更新数据的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集操作”。有关信息，请参阅DAO帮助中的“Requery方法”。

请参阅：CDaoRecordset::CanRestart


 CDaoRecordset::Seek

BOOL Seek(LPCTSTR lpszComparison, COleVariant* pKey1, COleVariant* pKey2 = NULL, COleVariant* pKey3=NULL);
throw(CDaoException, CMemoryException);
BOOL Seek(LPCTSTR lpszComparison, COleVariant* pKeyArray, WORD nKeys);
throw(CDaoException, CMemoryException);

返回值：
如果找到匹配记录，则返回非零值，否则为0。

参数：
lpszComparison | 下列字符串表达式之一：“<”、“<=”、“=”、“>=”或“>”。
pKey1 | 指向COleVariant的一个指针，它的值对应于索引中的第一条记录。它是必需的。
pKey2 | 指向COleVariant的一个指针，它的值对应于索引中的第二条记录。
pKey3 | 指向COleVariant的一个指针，如果存在，它的值对应于索引中的第三条记录。缺省为NULL。
pKeyArray | 指向变量数组的一个指针。数组大小对应于索引中的字段数。
nKeys | 对应于数组大小的一个整数，其值是索引中的字段数。 注意：不要在键中指定通配符。通配符会使Seek返回没有匹配的记录。

说明：
调用这个成员函数，可以在索引表型记录集对象中定位满足当前索引指定条件的记录，并使它成为当前记录。使用Seek的第二个版本（数组）处理四个或更多字段。
Seek使在表型记录集上高性能索引搜索成为有效。调用Seek之前必须通过调用SetCurrentIndex设置当前索引。如果索引标识非唯一码字段，Seek定位于满足条件的第一条记录。如果不设置索引将产生一个异常。
注意到如果没有创建一个UNICODE记录集，COleVariant对象必须明确声明为ANSI。通过vtSrc设置为VT_BSTRT(ANSI)构造程序的COleVariant::ColeVariant(lpszSrc,vtSrc)格式，或者使用vtSrc设置为VT_BSTRT的COleVariant函数SetString(lpszSrc,vtSrc)可以做到这一点。调用Seek时，传递了一个或多个关键值和比较操作符（“<”，“<=”，“=”，“>=”或“>”）。Seek在指定码字段搜索，并定位于满足由lpszComparison和pKey1指定的条件的第一条记录。如果在定位匹配中Seek失败，Seek返回0，并且未定义当前记录。直接使用DAO时，必须明确检查NoMatch特性。
如果lpszComparison是“=”，“>=”或“>”，Seek从索引头开始。如果lpszComparison是“<”或“<=”，Seek从索引尾开始并向后搜索，除非末尾存在双重索引入口。这时Seek在索引末尾的双重索引入口之间的特定入口处开始。
使用Seek时不需有当前记录。
要在动态集型或快照型记录集中定位满足指定条件的记录，使用Find操作。为包括所有记录而不只是满足某个指定条件的记录，使用Move操作在记录之间移动。
在任何类型的附加表上均不能调用Seek，原因是附加表必须作为动态集型或快照型记录集打开。但是，如果调用CDaoDatabase::Open直接打开一个可安装ISAM数据库，可以在那个数据库的表上调用Seek，不过性能可能较低。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“Seek方法”。

请参阅：
CDaoRecordset::FindFirst, CDaoRecordset::FindLast, CDaoRecordset::FindNext, CDaoRecordset::FindPrev, CDaoRecordset::Move, CDaoRecordset::MoveFirst, CDaoRecordset::MoveLast, CDaoRecordset::MoveNext, CDaoRecordset::MovePrev, COleVariant::COleVariant, COleVariant::SetString


 CDaoRecordset::SetAbsolutePosition

void SetAbsolutePosition(long lPosition);
throw(CDaoException, CMemoryException);

参数：
lPosition 对应于记录中当前记录的序数位置。

说明：
设置记录集对象当前记录的相对记录数。调用SetAbsolutePosition使你能在动态集或快照型记录集中按顺序把当前记录指针定位在指定记录。还可以通过调用GetAbsolutePosition确定当前记录数。
注意：这个成员函数只对动态集型和快照型记录集有效。
基础DAO对象的AbsolutePosition特性值是基于零的；设置0表示记录集的第一条记录。设置的值如果比记录总数大会引起MFC产生异常。通过调用GetRecordCount成员函数，可以确定记录集中的记录总数。
如果删除了当前记录，AbsolutePosition特性值没有定义，并且在参考它时MFC将产生一个异常。新记录添加到序列末尾。
注意：
不提倡用这个特性作为代用记录数。书签仍然是保持和返回到指定位置的推荐方式，并且是到达各种记录集对象当前记录位置的唯一方式。尤其在前面记录已删除时给定记录的位置发生了变化。由于不能保证记录集内各个记录的顺序，除非它是用带ORDERBY子句的SQL语句创建的。在重新创建记录集时，也不能保证给定记录集有相同的绝对地址。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“AbsolutePosition特性”。

请参阅：CDaoRecordset::GetAbsolutePosition


 CDaoRecordset::SetBookmark

void SetBookmark(COleVariant varBookmark);
throw(CDaoException, CMemoryException);

参数：
varBookmark 包含用于指定记录书签值的一个COleVariant对象。

说明：
调用这个成员函数，可以把记录集定位于包含指定书签的记录上。创建或打开记录集对象时，每个记录都有唯一的书签。通过调用GetBookmark可以获取当前记录的书签并把值保存到COleVariant对象。以后可以通过调用使用保存书签值的SetBookmark返回到那条记录。
注意到如果没有创建一个UNICODE记录集，COleVariant对象必须明确声明为ANSI。通过vtSrc设置为VT_BSTRT(ANSI)构造程序的COleVariant::ColeVariant (lpszSrc,vtSrc)格式，或者使用vtSrc设置为VT_BSTRT的COleVariant函数SetString(lpszSrc,vtSrc)可以做到这一点。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“Bookmark特性”和“Bookmarkable特性”。

请参阅：CDaoRecordset::GetBookmark


 CDaoRecordset::SetCacheSize

void SetCacheSize(long lSize);
throw((CDaoException, CMemoryException);

参数：
lSize 指定记录数量，典型值为100。设置为0将关闭缓存。设置必须在5到1200个记录之间。缓存可能会使用相当大量内存。

说明：
调用这个成员函数，可以设置要缓存的记录数。缓存是本地内存的一块，保存从服务器取得的最近数据，假定在程序运行期间会需要这些数据。需要数据时，Microsoft Jet数据库引擎首先检查缓存数据，而不是从服务器获取，那样会花更多时间。在非ODBC数据源上使用数缓存无效，原因是数据不保存在缓存中。
任何附加表之类的ODBC数据源打开记录集对象，调用SetCacheSize和SetCacheStart成员函数，然后调用FillCache成员函数或者通过使用一个Move操作进入记录。SetCacheSize成员函数的lSize参数可以基于应用能同时处理的记录数。例如，如果使用的记录集作为在屏幕上显示的数据源，可以传递lSize为20的参数给SetCacheSize，这样一次将显示20条记录。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“CacheSize,CacheStart特性”。

请参阅：
CDaoRecordset::FillCache, CDaoRecordset::GetCacheSize, CDaoRecordset::GetCacheStart, CDaoRecordset::SetCacheStart


 CDaoRecordset::SetCacheStart

void SetCacheStart(COleVariant varBookmark);
throw(CDaoException, CMemoryException);

参数：
varBookmark 指定要缓存的记录集中第一条记录书签的COleVariant对象。

说明：
调用这个成员函数，可以指定第一条记录要在记录集中缓存的书签。可以对SetCacheStart成员函数的varBookmark参数使用任何记录的书签值。把想开始缓存的记录置为当前记录，用SetBookmark为那条记录建立书签，然后传递书签作为SetCacheStart成员函数的参数。
Microsoft Jet数据库引擎从缓存中查询缓存范围内的记录，从服务器中查询缓存范围外的记录。
从缓存中获取的记录不反映其它用户同时对源数据所做的改变。
为强制更新所有缓存数据，要传递lSize参数0给SetCacheSize，以最初要求的缓存大小再次调用SetCacheSize，然后调用FillCache成员函数。
注意到如果没有创建一个UNICODE记录集，COleVariant对象必须明确声明为ANSI。通过vtSrc设置为VT_BSTRT(ANSI)构造程序的COleVariant::ColeVariant (lpszSrc,vtSrc)格式，或者使用vtSrc设置为VT_BSTRT的COleVariant函数SetString(lpszSrc,vtSrc)可以做到这一点。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“CacheSize,CacheStart特性”。

请参阅：
CDaoRecordset::FillCache, CDaoRecordset::GetCacheSize, CDaoRecordset::GetCacheStart, CDaoRecordset::SetCacheSize


 CDaoRecordset::SetCurrentIndex

void SetCurrentIndex(LPCTSTR lpszIndex);
throw(CDaoException, CMemoryException);

参数：
lpszIndex 包含要设置的索引名的一个指针。

说明：
调用这个成员函数，可以设置表型记录集上的索引。基本表中的记录不以任何特殊顺序存储。设置索引会改变从数据库返回的记录顺序，但并不影响记录保存的顺序。指定索引必须已经定义。如果想使用一个并不存在的索引，或者在调用Seek时索引未设置，MFC将产生一个异常。
通过调用CDaoTableDef::CreateIndex，并通过调用CDaoTableDef::Append把新索引附加到基础表定义的索引收集中，然后重新打开记录集，可以为表创建新索引。
从表型记录集返回的记录只能以基础表定义中定义的索引排序。要以其它顺序排序，可以使用存储在CDaoRecordset::m_strSort中的SQL ORDERBY子句打开动态集型或者快照型记录集。
有关查找记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“Index对象”和“当前索引”定义。

请参阅：CDaoRecordset::GetCurrentIndex


 CDaoRecordset::SetFieldDirty

void SetFieldDirty(void* pv, BOOL bDirty=TRUE);
throw(CDaoException, CMemoryException);

参数：
pv | 包含记录集中字段数据成员的地址或者为NULL。如果是NULL则对记录集中所有字段数据成员作标记（C++中的NULL与数据库术语中的Null不同，意思是“不含任何值”）。
bDirty | 如果在“脏”（改变了）时，对字段数据成员作标记则为TRUE。否则如果在“干净”（未改变）时对字段数据成员作标记则为FALSE。

说明：
调用这个成员函数，可以把记录集的字段数据成员在改变或未改变时作记号。没有改变时作记号的字段保证字段没有更新过。
框架对改变的字段数据成员作记号，以保证将通过DAO记录字段交换（DFX）机制把它们写到数据源上的记录中。改变字段值通常会自动把这个字段设置为脏，因此很少需要调用SetFieldDirty，但有时想保证这些列有明确更新或插入，而不管字段数据成员中有什么值。DFX机制还采用PSEUDO NULL。有关的更多信息，请参阅CDaoFieldExchange::m_nOperation。
如果未使用双缓存机制，字段值的改变将不会把这个字段设置为脏的。
这种情况下，有必要明确设置这个字段脏。m_bCheckCacheForDirtyFields中包含的标记控制这个自动字段检查。
重点：只能在调用Edit或AddNew之后调用这个成员函数。
对这个函数的第一个参数使用NULL将把它应用到所有outputColumns，而不是CDaoFieldExchange中的params。例如调用
SetFieldDirty(NULL);
将只把outputColumns设置为NULL。params的值不受影响。
要对params生效，必须提供想作用的单独param的实际地址，例如：
SetFieldDirty(&m_strParam);
这表示不能把所有params设置为NULL，而为outputColumns则可以。SetFieldDirty是通过DoFieldExchange实现的。
有关记录字段交换的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录字段交换（DFX）”和“DAO记录集：动态绑定记录”。

请参阅：CDaoRecordset::SetFieldNull, CDaoRecordset::SetFieldValue


 CDaoRecordset::SetFieldNull

void SetFieldNull(void* pv, BOOL bNull=TRUE);
throw(CDaoException, CMemoryException);

参数：
pv | 包含记录集中字段数据成员的地址或者为NULL。如果是NULL，则对记录集中所有字段数据成员作标记（C++中的NULL与数据库术语中的Null不同，意思是“不含任何值”）。
bNull | 如果在没有值（NULL）时对字段数据成员作标记则为TRUE。否则如果在非NULL时对字段数据成员作标记，则为FALSE。

说明：
调用这个成员函数，可以把记录集的字段数据成员在Null或者非Null时作记号。SetFieldNull用于受DoFieldExchange机制绑定的字段。
在向记录集添加新记录时，最初所有字段数据成员都设置为Null值并标记为“脏”（改变）。从数据源获取记录时，它的列或者已经有值或者为Null。如果不能把字设置为Null,将产生CDaoException。
如果使用双缓存机制，例如，如果特别想在没有值时标明当前记录的字段，调用bNull设置TRUE的SetFieldNull把它标记为Null。如果字段以前有Null记号，现在想给它一个值，只要把它设置为新值即可，不必用SetFieldNull移去Null标记。为确定字段是否允许为Null，调用IsFieldNull。
如果未使用双缓存机制，字段值的改变将不会把这个字段设置为脏的。
这种情况下，有必要明确设置这个字段脏。m_bCheckCacheForDirtyFields中包含的标记控制这个自动字段检查。
DFX机制还采用PSEUDO NULL。有关的更多信息，请参阅CDaoFieldExch-ange::m_nOperation。
重点：只能在调用Edit或AddNew之后调用这个成员函数。
对这个函数的第一个参数使用NULL将把它应用到所有outputColumns，而不是CDaoFieldExchange中的params。例如调用
SetFieldNull(NULL);
将只把outputColumns设置为NULL。params的值不受影响。
有关记录字段交换的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录字段交换（DFX）”和“DAO记录集：动态绑定记录”。

请参阅：CDaoRecordset::SetParamValue


 CDaoRecordset::SetFieldValue

void SetFieldValue(LPCTSTR lpszName, const COleVariant& varValue);
throw(CDaoException, CMemoryException);
void SetFieldValue(int nOrdinal, const COleVariant& varValue);
throw(CDaoException, CMemoryException);

void SetFieldValue(LPCTSTR lpszName, LPCTSTR lpszValue);
void SetFieldValue(int nOrdinal, LPCTSTR lpszValue);

参数：
lpszName | 指向包含字段名字符串的一个指针。
varValue | 包含字段内容的COleVariant对象的一个参考。
nOrdinal | 表示字段在记录含有Fields收集（基于0的）中序数位置的一个整数。
lpszValue | 指向包含字段内容值的一个指针。

说明：
调用这个成员函数，可以按序数顺序或者字符串的变化值设置字段值。使用SetFieldValue和GetFieldValue在运行时动态绑定字段，而不是使用DoField Exchange机制静态绑定列。
注意到如果没有创建一个UNICODE记录集，COleVariant对象必须明确声明为ANSI。通过vtSrc设置为VT_BSTRT(ANSI)构造程序的COleVariant::ColeVariant (lpszSrc,vtSrc)格式，或者使用vtSrc设置为VT_BSTRT的COleVariant函数SetString(lpszSrc,vtSrc)可以做到这一点。
有关记录字段交换的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录字段交换（DFX）”和“DAO记录集：动态绑定记录”。

请参阅：
CDaoRecordset::GetFieldValue, CDaoRecordset::m_nParams, CDaoRecordset::SetFieldValueNull, COleVariant::COleVariant, COleVariant::SetString


 CDaoRecordset::SetFieldValueNull

void SetFieldValueNull(short nIndex);
throw(CDaoException, CMemoryException);
void SetFieldValueNull(LPCTSTR lpszName);
throw(CDaoException, CMemoryException);

参数：
nIndex | 记录集中的字段索引，用于按基于0的索引查找。
lpszName | 记录集中的字段名字，用于按名字查找。

说明：
调用这个成员函数，可以把字段设置为Null。C++中NULL与这个Null含义不同，在数据库术语中表示“不含任何值”。
有关记录字段交换的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录字段交换（DFX）”和“DAO记录集：动态绑定记录”。

请参阅：CDaoRecordset::SetFieldValue


 CDaoRecordset::SetLockingMode

void SetLockingMode(BOOL bPessimistic);
throw(CDaoException, CMemoryException);

参数：
bPessimistic 表示封锁类型的一个标记。

说明：
调用这个成员函数，可以为记录集设置封锁类型。被动封锁有效时，只要调用Edit成员函数，就封锁包含正在编辑的记录数据2K页面。调用Update或Close成员函数，或者任何Move或Find操作时解除封锁。
主动封锁有效时，只有在用Update成员函数更新记录时才封锁包含记录的数据2K页面。
封锁页面后任何用户不能编辑这个页面的记录。如果调用SetLockingMode，传递一个非零值，而其它用户已经把这个页面封锁了，调用Edit时会产生一个异常。其它用户可以从封锁页面读数据。
如果调用空值的SetLockingMode，然后在其它用户封锁该页面时调用Update，将产生一个异常。要看另一个用户时记录所作改动（将丢失改动），调用带有当前记录书签值的SetBookmark成员函数。
处理ODBC数据源时，封锁模式总是主动的。
有关更新记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集操作”。有关信息，请参阅DAO帮助中的“LockEdits特性”、“EditMode特性”和“多用户应用中的封锁行为”。

请参阅：CDaoRecordset::GetLockingMode


 CDaoRecordset::SetParamValue

virtual void SetParamValue(int nIndex, const COleVariant& var);
throw(CDaoException, CMemoryException);
virtual void SetParamValue(LPCTSTR lpszName, const COleVariant& var);
throw(CDaoException, CMemoryException);

参数：
nIndex | 参数在查询定义Parameters收集中的数字位置。
var | 要设置的值，请参阅说明。
lpszName | 想设置参数值的参数名字。

说明：
调用这个成员函数，可以在运行时设置记录集中的参数值。参数必须已经作为记录集SQL字符串的一部分建立起来。可以用名字或者在收集中的索引位置访问这个参数。
指定要设置为COleVariant对象的值。有关设置期望值和在COleVariant对象中输入的更多信息，请参阅类COleVariant。注意到如果没有创建一个UNICODE记录集，COleVariant对象必须明确声明为ANSI。通过vtSrc设置为VT_BSTRT(ANSI)构造程序的COleVariant::COleVariant(lpszSrc,vtSrc)格式，或者使用vtSrc设置为VT_BSTRT的COleVariant函数SetString(lpszSrc,vtSrc)可以做到这一点。有关更新数据的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集操作”。有关信息，请参阅DAO帮助中的“Parameter对象”。

请参阅：
CDaoRecordset::GetParamValue, CDaoRecordset::m_nParams, CDaoRecordset::SetParamValueNull


 CDaoRecordset::SetParamValueNull

void SetParamValueNull(short nIndex);
throw(CDaoException, CMemoryException);
void SetParamValueNull(LPCTSTR lpszName);
throw(CDaoException, CMemoryException);

参数：
nIndex | 记录集中的字段索引，用于按基于0的索引查找。
lpszName | 记录集中的字段名字，用于按名字查找。

说明：
调用这个成员函数，可以把参数设置为Null值。C++中NULL与这个Null含义不同，在数据库术语中表示“不含任何值”。
有关更新数据的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集操作”。


 CDaoRecordset::SetPercentPosition

void SetPercentPosition(float fPosition);
throw(CDaoException, CMemoryException);

参数：
fPosition 0到100之间的一个数字。

说明：
调用这个成员函数，可以在记录集中记录百分比的基础上，设置当前记录在记录集对象中大概位置的变化值。
处理动态集型或快照型记录集时，在调用SetPercentPosition前，首先通过移动到最后一条记录计算记录集数量。如果在全面计数记录集前调用SetPercentPosition，移动量将相对于GetRecordCount值指示的访问记录数。可以通过调用MoveLast移到最后一条记录。
一旦调用了SetPercentPosition，与那个值对应的大概位置处的记录成为当前记录。
注意：
不推荐调用SetPercentPosition来把当前记录移动到记录集中指定记录，而应调用SetBookmark成员函数。
有关记录集中导航的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集导航”。有关信息，请参阅DAO帮助中的“PercentPosition对象”。

请参阅：CDaoRecordset::GetPercentPosition


 CDaoRecordset::Update

virtual void Update();
throw(CDaoException, CMemoryException);

说明：
调用AddNew或Edit成员函数之后调用这个成员函数。需要这个调用完成AddNew或Edit操作。
AddNew和Edit都准备了一个编辑缓冲区，添加的或编辑的数据放在其中，用来向数据源保存。Update保存这些数据。只更新那些在改动时标记的或侦测到的字段。
如果数据源支持事务，可以使Update调用（以及对应的AddNew或Edit调用）成为事务的一部分。有关事务的更多信息，请参阅联机文档“VisualC++程序员指南”中的“DAO工作区：管理事务”。
警告：
如果未首先调用AddNew或Edit就调用Update,Update产生一个CDaoException。如果调用了AddNew或Edit，则在调用MoveNext或者关闭记录集或数据源连接之前，必须调用Update，否则改动将无任何提示就丢失了。
在多用户环境中被动封锁记录集对象时，则从使用Edit时起一直到完成更新，记录保持被封锁。如果主动封锁记录集，则只在更新到数据库前封锁记录并与以前编辑的记录作对比。如果调用Edit以来记录有改动，Update操作失败，MFC产生一个异常。可以用SetLockingMode改变封锁模式。
注意：外部数据库格式上总使用主动封锁，例如ODBC和可安装ISAM。
有关更新记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：记录集操作”。有关信息，请参阅DAO帮助中的“AddNew方法”、“CancelUpdate方法”、“Delete方法”、“LastModified方法”、“Update方法”和“EditMode特性”。

请参阅：
CDaoRecordset::AddNew, CDaoRecordset::CancelUpdate, CDaoRecordset::Delete, CDaoRecordset::Edit, CDaoRecordset::CanTransact


 CDaoRecordset::m_bCheckCacheForDirtyFields

说明：
包含指示是否自动把缓存的字段作脏（改变）和Null记号的标记。标记缺省为TRUE。这个数据字段的设置控制整个双缓存机制。如果把标记设为TRUE，可以关闭在按字段基础上使用DFX机制的缓存。如果把标记设为FALSE，必须亲自调用SetFieldDirty和SetFieldNull。
调用Open前设置这个数据成员。这个机制主要是为了使用方便。由于发生变化时字段的双缓存，性能可能较低。
有关动态绑定记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录集：动态绑定记录”。

请参阅：
CDaoRecordset::SetFieldNull, CDaoRecordset::IsFieldNull, CDaoRecordset::IsFieldDirty, CDaoRecordset::SetFieldDirty


 CDaoRecordset::m_nFields

说明：
包含记录集类中字段数据成员数量和由记录集从数据源选择的列数。记录集类的构造程序必须用静态绑定字段的正确数量初始化m_nFields。使用它声明记录集内时，ClassWizard写入这个初始值。也可以手工写入。
框架使用这个数字管理字段数据成员和数据源上当前记录参数列之间的交互。
注意：这个数字必须对应于带参数的CDaoFieldExchange::outputColumn的SetFieldType调用之后，在DoFieldExchange中登记的输出列数。
在文章“DAO记录集：动态绑定记录”中说到，可以用CDaoRecordset::SetFieldValue和CDaoRecordset::GetFieldValue动态绑定列。如果这样做，不需要在m_nFields中增加计数，来反映DoFieldExchange成员函数中DFX函数调用的数量。
有关的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO记录字段交换（DFX）”。

请参阅：
CDaoRecordset::SetFieldValue, CDaoRecordset::GetFieldValue


 CDaoRecordset::m_nParams

说明：
包含记录集类中参数数据成员的数量──记录集查询时传递的参数数量。如果记录集类中有任何参数数据成员，类构造程序必须用正确数量初始化m_nParams。m_nParams值缺省为0。如果添加参数数据成员──这必须手工实现──还必须在类构造程序中手工添加初始化值来反映参数的数量（最少和m_strFilter或m_strSort字符串中“？”通配符的数量一样）。
框架在参数化记录集查询时使用这个数字。
重点：
这个数字必须对应于带参数CFieldExchange::param的SetFieldType调用之后，在DoFieldExchange中登记的“params”数目。
有关选择记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询：过滤和参数化查询”。有关信息，请参阅DAO帮助中的“Parameter对象”。


 CDaoRecordset::m_pDAORecordset

说明：
包含指向基础CDaoRecordset对象的DAO记录集对象的OLE接口的指针。需要直接访问DAO接口时使用这个指针。
有关访问基础DAO对象的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO收集：获取有关DAO对象的信息”。有关信息，请参阅DAO帮助中的“Recordset对象”。

请参阅：CDaoRecordset::m_pDatabase


 CDaoRecordset::m_pDatabase

说明：
包含指向CDaoDatabase对象的一个指针，记录集通过它与数据源连接。
这个变量以两种方式设置。典型的为在构造记录集对象时，向已经打开的CDaoDatabase对象传递一个指针。如果传递了NULL作为替换，CDaoDatabase创建一个CDaoDatabase对象并打开它。另一种情况中CDaoDatabase在这个变量中存放这个指针。
通常不直接需要使用m_pDatabase中存放的这个指针。但是，如果向CDaoDatabase写入自己的扩展名，就可能需要这个指针。例如在产生自己的CDaoException时可能需要它。
有关选择记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询：过滤和参数化查询”。有关信息，请参阅DAO帮助中的“Database对象”。

请参阅：CDaoRecordset::m_pDAORecordset


 CDaoRecordset::m_strFilter

说明：
包含用于构造SQL语句WHERE子句的字符串。它不包含过滤记录集的保留字WHERE。这个数据成员不适用于表型记录集。用CDaoQueryDef指针打开记录集时m_strFilter无效。
过滤包含日期的字段时使用U.S.日期格式（月-日-年），即使没有使用Microsoft Jet数据库引擎的U.S.版本；否则不会如你期望地过滤数据。
有关选择记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询：过滤和参数化查询”。有关信息，请参阅DAO帮助中的“Filter特性”。

请参阅：CDaoRecordset::m_strSort


 CDaoRecordset::m_strSort

说明：
包含不带ORDER BY保留字的SQL语句ORDER BY子句的字符串。可以对快照和动态集型记录集对象排序。
不能对表型记录集对象排序。为确定表型记录集的排序顺序，调用SetCurrentIndex。
用CDaoQueryDef指针打开记录集时m_strSort无效。
有关选择记录的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO查询：过滤和参数化查询”。有关信息，请参阅DAO帮助中的“Sort特性”。

请参阅：CDaoRecordset::m_strFilter


 CDaoRecordView

CObject
└CCmdTarget
└CWnd
└CView
└CScrollView
└CFormView
└CDaoRecordView

CDaoRecordView对象是显示控件中数据库记录的一个视图。这个视图是与CDaoRecordset对象直接关联的窗体视图。这个视图由对话模板资源创建，显示对话模板控件中CDaoRecordset对象的字段。CDaoRecordset对象使用对话数据交换（DDX）和DAO记录字段将近（DFX），使窗体上控件和记录集字段之间数据的移动自动化。CDaoRecordView还为移动到第一条、下一条、上一条或最后一条记录提供了缺省工具和更新视图中当前记录的界面。
注意：
DAO数据库类与基于开放数据库连接（ODBC）的MFC数据库类截然不同。所有DAO数据库类名都有“CDao”前缀。也可以通过DAO类访问ODBC数据源；由于使用Microsoft Jet数据库引擎，DAO类通常提供了高级功能。
创建记录视图的最普通方式是使用AppWizard。AppWizard同时创建记录视图类和对应记录集类作为轮廓启动应用的一部分。
如果只需要单个窗体，AppWizard方法更容易。ClassWizard需要在开发过程后期使用记录视图。如果不用AppWizard创建记录视图类，可以在以后用ClassWizard创建它。使用ClassWizard分别创建记录视图和记录集然后连接它们。这是最灵活的方法，原因是它给你更多的对命名记录集类和它的.H/.CPP文件的控制。这个方法还允许同一个记录集类上有多个记录视图。
为使终端用户容易在记录视图中记录之间移动，AppWizard创建菜单（和任选工具条）资源，用于移至第一条、上一条、下一条或最后一条记录。如果用ClassWizard创建记录视图类，需要用菜单和位图编辑器亲自创建这些资源。有关这些资源的更多信息，请参阅“概述：创建一个支持数据库的程序”和“ClassWizard：创建数据库窗体”。
关于在记录间移动的缺省工具的信息，请参阅IsOnFirstRecord和IsOnLastRecord以及 “记录视图：使用记录视图”，它同时适用于CRecordView和CDaoRecordView。
CDaoRecordView保持跟踪用户在记录集中的位置，以便记录视图能更新用户界面。用户移到记录集任何一端时，记录视图使用户界面对象无效──例如菜单项或工具条按钮──以便移到同一方向更远的地方。
有关声明和使用记录视图与记录集类的更多信息，请参阅“记录视图”中的“设计和创建记录视图”。有关记录集如何工作和使用它们的更多信息，请参阅“记录视图：使用记录视图”。上面提到的介绍都适用于CRecordView和CDaoRecordView，可以在联机文档“Visual C++程序员指南”中找到。
#include <afxdao.h>

请参阅：
CDaoRecordset, CDaoTableDef, CDaoQueryDef, CDaoDatabase, CDaoWorkspace, CFormView

CDaoRecordView的类成员

构造函数
CDaoRecordView 构造一个CDaoRecordView对象

属性
OnGetRecordset | 返回指向由CDaoRecordset派生的类对象的指针。ClassWizard在必要时覆盖此函数并创建记录集
IsOnLastRecord | 如果当前记录是对应记录集中最后一条记录，则返回非零
IsOnFirstRecord | 如果当前记录是对应记录集中第一条记录，则返回非零

操作
OnMove 如果当前记录有变化，在数据源上更新它，然后移到指定记录（下一条、上一条、第一条或最后一条）


 CDaoRecordView::CDaoRecordView

CDaoRecordView(LPCSTR lpszTemplateName);
CDaoRecordView(UINT nIDTemplate);

参数：
lpszTemplateName | 包含一个空终止字符串，是对话模板资源的名字。
nIDTemplate | 包含对象模板资源的ID号。

说明：
在创建由CMyRecordView派生的类型对象时，调用任何构造程序窗体以初始化视图对象，标记视图基于的对话资源。可以通过名字（传递字符串参数给构造程序）或它的ID（传递无符号整数作为参数）标识资源。推荐使用资源ID。
注意：
派生类必须支持自己的构造程序。在派生类构造程序中，调用带资源名或ID作为参数的构造程序CDaoRecordView::CDaoRecordView。
CDaoRecordView::OnInitialUpdate调用CWnd::UpdateData，它调用CWnd::DoDataExchange。对DoDataExchange的初始调用连接CDaoRecordView控件（间接）和由ClassWizard创建的CDaoRecordset字段数据成员。在调用基本类CFormView::OnInitialUpdate成员函数之前，这些数据成员不能使用。
注意：
如果使用ClassWizard，向导将定义一个enum值CDaoRecordView::IDD，在看到IDD_MYFORM的构造程序中把它指定到成员初始值列表中。
CMyRecordView::CMyRecordView() : CDaoRecordView(IDD_MYFORM)
{
//{{AFX_DATA_INIT(CMyRecordView)
//NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Other construction code, such as data initialization
}

请参阅：CWnd::UpdateData, CWnd::DoDataExchange


 CDaoRecordView::IsOnFirstRecord

BOOL IsOnFirstRecord();

返回值：
如果当前记录是对应记录集中第一条记录，则返回非零值，否则为0。

说明：
调用这个成员函数，可以确定当前记录是否是与记录视图对应的记录集对象中的第一条记录。在编写由ClassWizard写的缺省命令更新句柄的自己的工具时，这个函数是有用的。
如果用户移至第一条记录，框架使你拥有的用户界面对象无效（例如菜单项和工具条按钮），以便移动到第一条或上一条记录。

请参阅：CDaoRecordView::IsOnLastRecord


 CDaoRecordView::IsOnLastRecord

BOOL IsOnLastRecord();

返回值：
如果当前记录是对应记录集中最后一条记录，则返回非零值，否则为0。

说明：
调用这个成员函数，可以确定当前记录是否是与记录视图对应的记录集对象中的最后一条记录。在编写由ClassWizard写的缺省命令更新句柄的自己的工具，以支持在记录间移动时，这个函数是有用的。
警告：
除非用户移动超过了纪录集末尾，视图可能不能预测到这一点，除此以外，这个函数的结果可靠。在记录视图能够告诉它会使用户界面对象无效以移至下一条或最后一条记录以前，用户可能必须移动到最后记录前。如果用户移动超过最后一条记录，然后又移回来（或在最后一条记录之前），记录视图可以跟踪用户在记录集中的位置，并正确地使用户界面对象无效。

请参阅：CDaoRecordView::IsOnFirstRecord


 CDaoRecordView::OnGetRecordset

virtual CDaoRecordset* OnGetRecordset()=0;

返回值：
如果成功创建对象，返回指向CDaoRecordset派生对象的指针；否则返回NULL指针。

说明：
必须覆盖这个成员函数以构造或者获取记录集对象，并返回指向它的指针。如果用ClassWizard声明了记录视图类，向导将编写一个缺省覆盖。
如果存在，ClassWizard的缺省工具返回存储在记录视图中的记录指针。
如果不存在，它将构造用ClassWizard指定的记录集类型对象，并调用Open成员函数打开表或运行查询，然后返回指向此对象的指针。
有关的更多信息和实例，请参阅联机文档“Visual C++程序员指南”中的“记录视图：使用记录视图”。

请参阅：CDaoRecordset, CDaoRecordset::Open


 CDaoRecordView::OnMove

virtual BOOL OnMove(UINT nIDMoveCommand);

返回值：
移动成功返回非零值；否则如果拒绝移动请求，返回0。

参数：
nIDMoveCommand下列标准命令ID值之一：
· | ID_RECORD_FIRST | 移至记录集中第一条记录。
· | ID_RECORD_LAST | 移至记录集中最后一条记录。
· | ID_RECORD_NEXT | 移至记录集中下一条记录。
· | ID_RECORD_PREV | 移至记录集中上一条记录。

说明：
调用这个成员函数，可以移动到记录集中的一条不同记录，并显示在记录视图的控件中的字段。缺省工具调用与记录视图对应的CDaoRecordset对象的适当Move成员函数。
缺省情况下，如果用户在记录视图中作了改变，OnMove将更新在数据源上的当前记录。
AppWizard创建一个带有第一条记录、最后一条记录、下一条记录和上一条记录的菜单资源。如果选择Initial Toolbar选项，AppWizard还创建一个与这些命令对应的带按钮工具条。
如果移动超过了记录集中最后一条记录，记录视图继续显示最后一条记录。如果在第一条记录之后向后移动，记录视图继续显示第一条记录。
警告：
如果记录集不含记录，调用OnMove会产生一个异常。在相应的移动操作之前，调用OnUpdateRecordFirst，OnUpdateLast，OnUpdateNext，OnUpdatePrev这些合适用户界面更新句柄函数，可以确定记录集中是否有记录。
有关更新句柄的更多信息，请参阅联机文档“Visual C++程序员指南”中的“概述：创建支持数据库的程序”。

请参阅：CDaoRecordset::Move


 CDaoTableDef

CObject
└CDaoTableDef

CDaoTableDef表示基本表或附加表的存储定义。每个DAO数据库对象包含一个称为TableDef的收集，包含所有存储的DAO表定义对象。使用CDaoTableDef操纵表定义。例如，可以：
· | 检查数据库中任何本地、附加或外部表的字段和索引结构。
· | 对附加表调用SetConnect和SetSourceTableName成员函数，并使用RefreshLink成员函数更新到附加表的连接。
· | 调用CanUpdate成员函数，确定是否可以编辑表中的字段定义。
· | 使用GetValidationRule和SetValidationRule以及GetValidationText和SetValidationText，获取或设置有效性条件。
· | 使用Open成员函数创建表型、动态集型或快照型CDaoRecordset对象。
注意：
DAO数据库类与基于开放数据库连接（ODBC）的MFC数据库类截然不同。所有DAO数据库类名均以“CDao”作前缀。你仍然可以用DAO类访问ODBC数据源；由于DAO类指定于Microsoft Jet数据库引擎，它们通常提供了超强的功能。
使用表定义对象可以处理现有表，也可以创建新表：
1. 所有情况下，首先构造一个CDaoTableDef对象，提供指向表所属的CDaoDatabase对象的指针。
2.根据需要进行以下操作：
· | 要使用现有保存的表，调用表定义对象的Open成员函数，提供保存表的名字。
· | 要创建新表，调用表定义对象的Create成员函数，调用CreateField和CreateIndex向表添加字段和索引。
· | 调用Append，通过把它附加到数据库TableDef收集后面，来保存这个表。Create把表定义设置为打开状态，所以调用Create之后不用Open。
提示：
创建保存表的最容易的方法是用Microsoft Access创建它们并存储到数据库中。然后可以用MFC代码打开和使用它们。
为使用已经打开或创建的表定义，创建和打开一个CDaoRecordset对象，用带nOpenType参数的dbOpenTable值指定表定义的名字。
为使用表定义对象创建CDaoRecordset对象，可创建或打开上述表定义，然后构造一个记录集对象，在CDaoRecordset::Open时传递指向表定义对象的指针。传递的表定义必须处于打开状态。有关的更多信息，请参阅CDaoRecordset。
完成使用表定义对象后，调用它的Close成员函数；然后销毁表定义对象。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。
#include <afxdao.h>
请参阅：CDaoDatabase, CDaoRecordset

CDaoTableDef类成员

数据成员
m_pDatabase | 用于这个表的源数据库
m_pDAOTableDef | 指向基础表定义对象的DAO接口的指针

构造函数
Append | 向数据库添加新表
CDaoTableDef | 构造CDaoTableDef对象
Close | 关闭打开的表定义
Create | 创建可以用Append添加到数据库的表
Open | 打开数据库TableDef收集中存储的现有表定义

属性
CanUpdate | 如果表可以更新（可以修改字段定义或表特性），则返回非零
GetAttributes | 返回表示CDaoTableDef对象一个或多个特征的值
GetConnect | 返回一个值，提供有关表源的信息
GetDateCreated | 返回表示创建基础CdaoTableDef对象的基本表的日期和时间
GetDateLastUpdated | 返回最近改动基本表设计的日期和时间
GetFieldCount | 返回表示表中字段数量的一个值
GetFieldInfo | 返回表中关于字段的指定类型的信息
GetIndexCount | 返回表示表中索引数量的一个值
GetIndexInfo | 返回表中关于索引的指定类型的信息
GetName | 返回表的用户定义名字
GetRecordCount | 返回表中记录数量
GetSourceTableName | 返回指定源数据库中附加表名字的值
GetValidationRule | 返回一个值，验证字段中的数据在改变或添加到表时的有效性
GetValidationText | 返回一个值，如果Field对象值不满足指定有效性规则时，指定应用显示的消息文字
IsOpen | 如果表处于打开状态，返回非零
SetAttributes | 设置表示CDaoTableDef对象一个或多个特征的值
SetConnect | 设置提供有关表信息的一个值
SetName | 设置表名字
SetSourceTableName | 设置一个值，指定源数据库中附加表的名字
SetValidationRule | 设置一个值，对字段中的数据改变或添加到表时验证有效性
SetValidationText | 设置一个值，如果Field对象值不满足指定有效性规则时，指定应用显示的消息文字

操作
CreateField | 调用以创建表的字段
CreateIndex | 调用以创建表的索引
DeleteField | 调用以从表中删除一个字段
DeleteIndex | 调用以从表中删除一个索引
RefreshLink | 对附加表更新连接信息


 CDaoTableDef::Append

virtual void Append();
throw(CDaoException,CMemoryException);

说明：
调用Create创建表定义对象之后，调用这个成员函数可以把表定义保存到数据库中。这个函数把对象附加到数据库的TableDefs收集后面。如果采用不附加的方法定义它，可以把表定义用作临时对象，但如果想保存和使用它就必须调用Append。
注意：
如果试图附加一个未命名表定义（包含空字符串），MFC将产生一个异常。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“Append方法”。

请参阅：CDaoTableDef::Create


 CDaoTableDef::CanUpdate

BOOL CanUpdate();
throw(CDaoException,CMemoryException);

返回值：
如果表结构（模式）可以修改（添加或者删除字段和索引），则返回非零值，否则为0。

说明：
调用这个成员函数，可以确定基础CDaoTableDef对象的表定义是否可以改变。
缺省情况下，基础CDaoTableDef对象的新建表可以更新。基础CDaoTableDef对象的附加表不可更新。即使结果记录集不可更新，CDaoTableDef对象是可更新的。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“Updatable特性”。

请参阅：CDaoTableDef::GetDateLastUpdated


 CDaoTableDef::CDaoTableDef

CDaoTableDef(CDaoDatabase* pDatabase);

参数：
pDatabase 指向CDaoDatabase对象的一个指针。

说明：
构造一个CDaoTableDef对象。构造之后必须调用Create或Open成员函数，处理对象后必须调用Close成员函数并销毁CDaoTableDef对象。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。

请参阅：
CDaoTableDef::Open, CDaoTableDef::Close, CDaoTableDef::Create, CDaoDatabase


 CDaoTableDef::Close

virtual void Close();
throw(CDaoException,CMemoryException);

说明：
调用这个成员函数，可以关闭并释放表定义对象。通常调用Close后，如果表定义对象由new分配，则必须删除它。
可以在调用Close之后再次调用Open。可以重用表定义对象。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“Close方法”。

请参阅：CDaoTableDef::Open, CDaoTableDef::Create


 CDaoTableDef::Create

virtual void Create(LPCTSTR lpszName, long lAttributes = 0, LPCTSTR lpszSrcTable=NULL, LPCTSTR lpszConnect = NULL);
throw(CDaoException,CMemoryException);

参数：
lpszName 指向包含表名的字符串的指针。
lAttributes对应于由表定义对象表示的表特征的一个值。
可以用位操作OR合并任何下列常数：
常数 | 描述
dbAttachExclusive | 对使用Microsoft Jet的数据库引擎，指示这个表是为独占使用而打开的附加表
dbAttachSavePWD | 对使用Microsoft Jet的数据库引擎，指示用于附加表的用户ID和密码与连接信息一起保存
dbSystemObject | 指示表是由Microsoft Jet数据库引擎提供的系统表
dbHiddenObject | 指示表是由Microsoft Jet数据库引擎提供的隐藏表

lpszSrcTable | 指向包含源表名的字符串的指针。缺省情况下这个值初始化为NULL。
lpszConnect | 指向包含缺省连接字符串的字符串的指针。缺省情况下这个值初始化为NULL。

说明：
调用这个成员函数，可以创建一个新保存表。一旦命名表定义后，就可以调用Append在数据库的TableDef收集中保存这个表定义。调用Append之后，表定义处于打开状态，可以用它创建CDaoRecordset对象。有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“CreateTableDef方法”。

请参阅：
CDaoTableDef::Open, CDaoTableDef::Close, CDaoRecordset


 CDaoTableDef::CreateField

void CreateField(LPCTSTR lpszName, short nType, long lSize, long lAttributes = 0);
throw(CDaoException,CMemoryException);
void CreateField(CDaoFieldInfo& fieldinfo);
throw(CDaoException,CMemoryException);

参数：
lpszName 指向指定这个字段名的字符串表达式的指针。
nType指示字段数据类型的一个值。设置可以为下列值之一：
类型 | 大小（字节） | 描述
dbBoolean | 1 byte | BOOL
dbByte | 1 | BYTE
dbInteger | 2 | int
dbLong | 4 | long
dbCurrency | 8 | 货币(COleCurrency)
dbSingle | 4 | float
dbDouble | 8 | double
dbDate | 8 | 日期/时间(COleDateTime)
dbText | 1–255 | Text (CString)
dbLongBinary | 0 | 长二进制(OLE 对象), CLongBinary或CByteArray
dbMemo | 0 | Memo(CString)

lSize 以字节表示包含文本字段最大大小或者包含文本或数字值的字段固定大小的一个值。除文本字段外所有都将忽略lSize参数。
lAttributes对应于字段特征并能用位操作OR合并的一个值。
常数 | 描述
dbFixedField | 字段大小固定（为Numeric字段缺省）
dbVariableField | 字段大小可变化（只对Text字段）
dbAutoIncrField | 自动对新记录的字段值增加一个不可改变的唯一长整数。只有Microsoft Jet数据库表支持
dbUpdatableField | 字段值可以改变
dbDescending | 字段以下降（Z-A或100-0）顺序排序（只适用于Index对象Fields收集中的Field对象）。如果省略此常数，字段将以上升（A-Z或0-100）顺序排序（缺省）

fieldinfo 对CDaoFieldInfo结构的参考。

说明：
调用这个成员函数，可以把记录添加到表。创建一个CDaoField(OLE)CDaoTableDef对象并把它附加到DAOTableDef（OLE）对象的Fields收集。除了用于检查对象特性外，还可以用CDaoFieldInfo为在表定义中创建新字段构造一个输入参数。CreateField的第一个版本容易使用，但要想更好地控制，需使用带CDaoFieldInfo参数的CreateField第二个版本。
如果使用带CDaoFieldInfo参数的CreateField版本，必须小心设置CDaoFieldInfo结构的下列成员：
·m_strName
·m_nType
·m_lSize
·m_lAttributes
·m_bAllowZeroLength
CDaoFieldInfo的其余成员应设置为适合该成员的0，FALSE或空字符串，否则会产生CDaoException。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“CreateField方法”。

请参阅：
CDaoTableDef::DeleteField, CDaoTableDef::CreateIndex, CDaoTableDef::DeleteIndex


 CDaoTableDef::CreateIndex

void CreateIndex(CDaoIndexInfo& indexinfo);
throw(CDaoException,CMemoryException);

参数：
indexinfo 对CDaoIndexInfo结构的参考。

说明：
调用这个成员函数，可以为表添加索引。索引指定从数据库表访问记录的顺序以及是否接受复制记录。索引还提供了高效访问数据的功能。对表创建索引不是必需的，但对大型无索引表来说，访问指定记录或者创建记录集会花很长时间。另一方面，创建太多的索引由于它们都要更新，也会降低更新、附加和删除操作的速度。决定创建哪个索引时考虑这些因素。
必须设置CDaoIndexInfo结构的下列成员：
· | m_strName | 必须提供一个名字。
· | m_pFieldInfos | 必须指向CDaoIndexFieldInfo结构的一个数组。
· | m_nFields | 必须指定CDaoFieldInfo数组中的字段数。
其余成员如设置为FALSE将被忽略。另外在索引创建期间忽略m_IDistinctCount成员。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“CreateIndex方法”。

请参阅：
CDaoTableDef::DeleteIndex, CDaoTableDef::CreateField, CDaoTableDef::DeleteField, CDaoIndexInfo


 CDaoTableDef::DeleteField

void DeleteField(LPCTSTR lpszName);
throw(CDaoException,CMemoryException);
void DeleteField(int nIndex);
throw(CDaoException,CMemoryException);

参数：
lpszName | 指向现有字段名字的字符串表达式的指针。
nIndex | 表的基于零的Fields收集中字段的索引，用于按索引查找。

说明：
调用这个成员函数，可以移去一个字段并使它不可访问。可以在没有附加到数据库的新对象或CanUpdate返回0时使用这个成员函数。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“Delete方法”。

请参阅：
CDaoTableDef::CreateField, CDaoTableDef::CreateIndex, CDaoTableDef::DeleteIndex


 CDaoTableDef::DeleteIndex

void DeleteIndex(LPCTSTR lpszName);
throw(CDaoException,CMemoryException);
void DeleteIndex(int nIndex);
throw(CDaoException,CMemoryException);

参数：
lpszName | 指向现有索引名字的字符串表达式的指针。
nIndex | 数据库的基于零的TableDefs收集中索引对象的数组，用于按索引查找。

说明：
调用这个成员函数，可以删除基础表中的索引。可以在没有附加到数据库的新对象或CanUpdate返回0时使用这个成员函数。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“Delete方法”。

请参阅：
CDaoTableDef::CreateIndex, CDaoTableDef::CreateField, CDaoTableDef::DeleteField


 CDaoTableDef::GetAttributes

long GetAttributes();
throw(CDaoException,CMemoryException);

返回值：
返回表示CDaoTableDef对象一个或多个特征的值。

说明：
对于CDaoTableDef对象，返回值指定由CDaoTableDef表示的表特征，可以是这些常数的组合。
常数 | 描述
dbAttachExclusive | 对使用Microsoft Jet的数据库引擎，指示这个表是为独占使用而打开的附加表
dbAttachSavePWD | 对使用Microsoft Jet的数据库引擎，指示用于附加表的用户ID和密码与连接信息一起保存
dbSystemObject | 指示表是由Microsoft Jet数据库引擎提供的系统表
dbHiddenObject | 指示表是由Microsoft Jet数据库引擎提供的隐藏表
dbAttachedTable | 表示表是来自Paradox数据库等非ODBC数据库的附加表
dbAttachedODBC | 表示表是Microsoft SQL Server等ODBC数据库的附加表
系统表是由Microsoft Jet数据库引擎创建的表，包含各种内部信息。
隐藏表是由Microsoft Jet数据库引擎创建的临时使用的表。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“Attributes特性”。

请参阅：CDaoTableDef::SetAttributes


 CDaoTableDef::GetConnect

CString GetConnect();
throw(CDaoException,CMemoryException);

返回值：
包含用于表的路径和数据库类型的一个CString对象。

说明：
调用这个成员函数，可以获取由于数据源的连接字符串。对代表附加表的CDaoTableDef对象，CString由一或两部分组成（数据库类型标识符和到数据库的路径）。
下表所示路径是包含数据库文件的目录的全路径，必须由标识符“DATABASE=.”开头。有时（如Microsoft Jet和Microsoft Excel数据库），指定文件名包括在数据库路径参数中。
CDaoTableDef::SetConnect中的表显示可能的数据库类型和它们对应的数据库标识符和路径：
对Microsoft Jet数据库基本表，标识符是空字符串（“”）。
需要密码但没有提供时，ODBC驱动程序在表首次访问时显示一个登录对话框，关闭连接然后再打开时再次显示。如果附加表有dbAttachSavePWD属性，表重新打开时不出现登录提示符。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“Connect特性”。

请参阅：CDaoTableDef::SetConnect


 CDaoTableDef::GetDateCreated

COleDateTime GetDateCreated();
throw(CDaoException,CMemoryException);

返回值：
包含创建基础CDaoTableDef对象的表的日期和时间的一个值。

说明：
调用这个成员函数，可以确定基础CDaoTableDef对象的表创建日期和时间。
日期和时间设置由基本表创建或最后更新的计算机派生。在多用户环境中，用户应该直接从文件服务器得到这些设置以避免不一致；也就是说，所有客户应该使用一个“标准”时间源──可以来自一个服务器。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“DateCreated, LastUpdated特性”。

请参阅：CDaoTableDef::GetDateLastUpdated


 CDaoTableDef::GetDateLastUpdated

COleDateTime GetDateLastUpdated();
throw(CDaoException,CMemoryException);

返回值：
包含最近更新基础CDaoTableDef对象的表的日期和时间的一个值。

说明：
调用这个成员函数，可以确定基础CDaoTableDef对象的表最后更新的日期和时间。
日期和时间设置由基本表创建或最后更新的计算机派生。在多用户环境中，用户应该直接从文件服务器得到这些设置以避免不一致；也就是说，所有客户应该使用一个“标准”时间源──可以来自一个服务器。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“DateCreated, LastUpdated特性”。

请参阅：CDaoTableDef::GetDateCreated


 CDaoTableDef::GetFieldCount

short GetFieldCount();
throw(CDaoException,CMemoryException);

返回值：表中的字段数。

说明：
调用这个成员函数，可以获取表中定义的字段数量。如果它的值为0，则收集中没有对象。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“Count特性”。

请参阅：
CDaoTableDef::GetFieldInfo, CDaoTableDef::GetIndexInfo, CDaoTableDef::GetIndexCount


 CDaoTableDef::GetFieldInfo

void GetFieldInfo(int nIndex, CDaoFieldInfo& fieldinfo, DWORD dwInfoOption = AFX_DAO_PRIMARY_INFO);
throw(CDaoException,CMemoryException);
void GetFieldInfo(LPCTSTR lpszName, CDaoFieldInfo& fieldinfo,DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
throw(CDaoException,CMemoryException);

参数：
nIndex | 表基于零的Fields收集中字段的索引，用于按索引查找。
fieldinfo | 对CDaoFieldInfo结构的参考。
dwInfoOptions指定获取字段哪些信息的选项。有效选项和函数的返回值如下：
· | AFX_DAO_PRIMARY_INFO | （缺省）Name, Type, Size,Attributes。使用这个选项以获取最佳性能。
· | AFX_DAO_SECONDARY_INFO | 主信息再加上：Ordinal Position,Required, Allow Zero Length, Collating Order, Foreign Name,Source Field, Source Table
· | AFX_DAO_ALL_INFO | 主信息和辅助信息再加上：ValidationRule, Validation Text, Default Value
lpszName | 指向字段对象名字的指针，用于按名字查找。名字是唯一命名这个字段的字符串，最大64个字符。

说明：
调用这个成员函数，可以获取有关表中定义时字段的各种信息。这个函数的一个版本让你按索引查找字段。另一个版本让你按名字查找字段。
有关返回信息的描述请参阅CDaoFieldInfo结构。这个结构包含对应于dwInfoOptions描述上面列出的信息项的成员。查询一个级别的信息时，你还将得到所有低级别的信息。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“Attributes特性”。

请参阅：
CDaoTableDef::GetIndexInfo, CDaoTableDef::GetIndexCount, CDaoTableDef::GetFieldCount


 CDaoTableDef::GetIndexCount

short GetIndexCount();
throw(CDaoException,CMemoryException);

返回值：表中的索引数。

说明：
调用这个成员函数，可以获取类的索引数量。如果值为0，则收集中没有索引。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“Count特性”。

请参阅：
CDaoTableDef::GetIndexInfo, CDaoTableDef::GetFieldInfo, CDaoTableDef::GetFieldCount


 CDaoTableDef::GetIndexInfo

void GetIndexInfo(int nIndex, CDaoIndexInfo& indexinfo, DWORD dwInfoOption = AFX_DAO_PRIMARY_INFO);
throw(CDaoException,CMemoryException);
void GetIndexInfo(LPCTSTR lpszName, CDaoIndexInfo& indexinfo,DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
throw(CDaoException,CMemoryException);

参数：
nIndex | 基于零的Indexes收集中Index对象的数字索引，用于按在收集中的位置查找。
indexinfo | 对CDaoIndexInfo结构的参考。
dwInfoOptions指定要获取的有关索引信息的选项。按照它们引起的返回函数，有效选项在这里列出来：
· | AFX_DAO_PRIMARY_INFO | （缺省）Name, Field Info, Fields。为获得最佳性能使用此选项。
· | AFX_DAO_SECONDARY_INFO | 基本信息再加上：Primary,Unique, Clustered, IgnoreNulls, Required, Foreign
· | AFX_DAO_ALL_INFO | 基本和辅助信息再加上：Distinct Count
lpszName | 指向索引对象名字的指针，用于按名字查找。

说明：
调用这个成员函数，可以获取有关表中定义时索引的各种信息。这个函数的一个版本让你按它在收集中的位置查找索引。另一个版本让你按名字查找索引。
有关返回信息的描述请参阅CDaoIndexInfo结构。这个结构包含对应于dwInfoOptions描述上面列出的信息项的成员。查询一个级别的信息时，还将得到所有低级别的信息。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“Attributes特性”。

请参阅：
CDaoTableDef::GetFieldInfo, CDaoTableDef::GetIndexCount, CDaoTableDef::GetFieldCount


 CDaoTableDef::GetName

CString GetName();
throw(CDaoException,CMemoryException);

返回值：用户定义的表名。

说明：
调用这个成员函数，可以获取用户定义的基础表名。这个名字以字母打头，最多包含64个字符。它可以包括数字和下划线但不能有标点和空格。有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“Name特性”。

请参阅：
CDaoTableDef::SetName, CDaoTableDef::GetConnect, CDaoTableDef::SetConnect


 CDaoTableDef::GetRecordCount

long GetRecordCount();
throw(CDaoException,CMemoryException);

返回值：表定义对象中访问的记录数。

说明：
调用这个成员函数，可以找到CDaoTableDef对象中有多少记录。
对表型CDaoTableDef对象调用GetRecordCount，反映表中记录的大概数量，在表记录添加或删除时立即受到影响。回滚事务将作为部分记录计数出现，除非调用了CDaoWorkspace::CompactDatabase。不含记录的CDaoTableDef对象其记录计数特性设置为0。处理附加表或者ODBC数据库时，GetRecordCount总是返回-1。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“RecordCount特性”。

请参阅：
CDaoTableDef::GetSourceTableName, CDaoTableDef::SetSourceTableName


 CDaoTableDef::GetSourceTableName

CString GetSourceTableName();
throw(CDaoException,CMemoryException);

返回值：
指定附加表的源名字的CString对象，如果是主数据表，则返回空字符串。

说明：
调用这个成员函数，可以获取源数据库附加表的名字。附加表是与Microsoft Jet数据库链接的另一个数据库。附加表的数据仍然在外部数据库中，可以由其它应用操纵。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“SourceTableName特性”。

请参阅：
CDaoTableDef::GetRecordCount, CDaoTableDef::SetSourceTableName


 CDaoTableDef::GetValidationRule

CString GetValidationRule();
throw(CDaoException,CMemoryException);

返回值：
在字段中的数据改变或者添加到表时验证有效性的CString对象。

说明：
调用这个成员函数，可以获取用于表定义的有效性规则。有效性规则用于与更新操作的连接中。如果表定义包含一个有效性规则，寻那个表定义的更新在改变数据之前必须匹配预先确定的条件。如果改动不匹配条件则产生一个包含GetValidationText的异常。对于CDaoTableDef对象，这个CString对附加表只读，对基本表允许读/写。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“ValidationRule特性”。

请参阅：
CDaoTableDef::SetValidationRule, CDaoTableDef::GetValidationText, CDaoTableDef::SetValidationText


 CDaoTableDef::GetValidationText

CString GetValidationText();
throw(CDaoException,CMemoryException);

返回值：
用户输入不匹配有效性规则的数据时，指定显示文本的一个CString对象。

说明：
调用这个成员函数，可以获取用户输入的数据不匹配有效性规则时显示的字符串。对于CDaoTableDef对象，这个CString对附加表只读，对基本表允许读/写。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“ValidationText特性”。

请参阅：
CDaoTableDef::SetValidationRule, CDaoTableDef::SetValidationText, CDaoTableDef::GetValidationRule


 CDaoTableDef::IsOpen

BOOL IsOpen() const;
throw(CDaoException,CMemoryException);

返回值：
如果CDaoTableDef打开，则返回非零值，否则为0。

说明：
调用这个成员函数，可以确定CDaoTableDef对象当前是否打开。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。

请参阅：CDaoTableDef::Open


 CDaoTableDef::Open

virtual void Open(LPCTSTR lpszName);
throw(CDaoException,CMemoryException);

参数：
lpszName 指向指定表名字符串的指针。

说明：
调用这个成员函数，可以打开以前在数据库的TableDef收集中保存的表定义。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。

请参阅：
CDaoTableDef::IsOpen, CDaoTableDef::Create, CDaoTableDef::Close


 CDaoTableDef::RefreshLink

void RefreshLink();
throw(CDaoException,CMemoryException);

说明：
调用这个成员函数，可以对附加表更新连接信息。通过在相应CDaoTableDef对象上调用SetConnect，然后使用RefreshLink成员函数来更新，可以改变附加表的连接信息。调用RefreshLink时不改变附加表的特性。
为强制修改的连接信息生效，必须关闭所有基于这个表定义的打开的CDaoRecordset对象。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“RefreshLink方法”。

请参阅：CDaoTableDef::SetConnect


 CDaoTableDef::SetAttributes

void SetAttributes(long lAttributes);
throw(CDaoException,CMemoryException);

参数：
lAttributes对应于由表定义对象表示的表特征的一个值。
可以用位操作OR合并任何下列常数：
常数 | 描述
dbAttachExclusive | 对使用Microsoft Jet的数据库引擎，指示这个表是为独占使用而打开的附加表
dbAttachSavePWD | 对使用Microsoft Jet的数据库引擎，指示用于附加表的用户ID和密码与连接信息一起保存
dbSystemObject | 指示表是由Microsoft Jet数据库引擎提供的系统表
dbHiddenObject | 指示表是由Microsoft Jet数据库引擎提供的隐藏表

说明：
设置多个属性时，可以用位操作OR操作符对适当常数加和的方法合并它们。在非附加表上设置dbAttachExclusive会产生一个异常。合并下列值也将产生异常：
·dbAttachExclusive|dbAttachedODBC
·dbAttachSavePWD|dbAttachedTable
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“Attributes特性”。

请参阅：CDaoTableDef::SetConnect


 CDaoTableDef::SetConnect

void SetConnect(LPCTSTR lpszConnect);
throw(CDaoException,CMemoryException);

参数：
lpszConnect 指向指定额外参数的字符串表达式的指针，用于向ODBC或可安装的ISAM驱动程序传递。

说明：
对代表附加表的CDaoTableDef对象，CString由一或两部分组成（数据库类型标识符和到数据库的路径）。
下表所示路径是包含数据库文件的目录的全路径，必须由标识符“DATABASE=.”开头。有时（如Microsoft Jet和Microsoft Excel数据库），指定文件名包括在数据库路径参数中。
注意：
格式“DATABASE = drive:\\path.”的路径语句的等号周围不能包括空格。这会产生一个异常和连接失败。
下表列出可能的数据库类型和它们相应的数据库标识符和路径：
数据库类型 | 标识符 | 路径
使用Jet数据库引擎的数据库 | "[database];" | "drive:\\path\\filename.MDB"
dBASE III | "dBASE III;" | "drive:\\path"
dBASE IV | "dBASE IV;" | "drive:\\path"
dBASE 5 | "dBASE 5.0;" | "drive:\\path"
Paradox 3.x | "Paradox 3.x;" | "drive:\\path"
Paradox 4.x | "Paradox 4.x;" | "drive:\\path"
Paradox 5.x | "Paradox 5.x;" | "drive:\\path"
Excel 3.0 | "Excel 3.0;" | "drive:\\path\\filename.XLS"
Excel 4.0 | "Excel 4.0;" | "drive:\\path\\filename.XLS"
Excel 5.0 or Excel 95 | "Excel 5.0;" | "drive:\\path\\filename.XLS"
Excel 97 | "Excel 8.0;" | "drive:\\path\filename.XLS"
HTML Import | "HTML Import;" | "drive:\\path\filename"
HTML Export | "HTML Export;" | "drive:\\path"
文本 | "Text;" | "drive:\\path"
ODBC"ODBC;
DATABASE = database;
UID = user;
PWD = password;
DSN = datasourcename;
LOGINTIMEOUT = seconds;"
(这可能不是适用所有服务器的完整连接字符串；
它只是一个例子。参数之间不要有空格这一点很重要)		无
Exchange"Exchange;
MAPILEVEL = folderpath;
[TABLETYPE={ 0 | 1 };]
[PROFILE=profile;]
[PWD=password;]
[DATABASE=database;]"		"drive:\\path\\filename.MDB"
注意：DAO 3.5不再支持Btrieve。
在连接字符串中必须使用双反斜线（\\）。如果已经用SetConnect修改了现有连接的特性，接下来必须调用RefreshLink。如果用SetConnect初始化连接特性，则不需调用RefreshLink，但如果选择这样，首先附加表定义。
如果需要密码但没有提供，ODBC驱动程序在首次访问表时显示一个登录对话框，若关闭连接然后再打开将再次显示。
通过为Create成员函数提供源参数，可以为CDaoTableDef对象设置连接字符串。可以检查这个设置，确定数据库的类型、路径、用户ID、密码或ODBC数据源。有关的更多信息，请参阅指定驱动程序的文档。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“Connect特性”。

请参阅：CDaoTableDef::RefreshLink, CDaoTableDef::SetAttributes


 CDaoTableDef::SetName

void SetName(LPCTSTR lpszName);
throw(CDaoException,CMemoryException);

参数：
lpszName 指向指定表名字字符串的指针。

说明：
调用这个成员函数，可以设置用户定义的表名。这个名字必须以字母开头，最多包含64个字符。它可以包括数字和下划线，但不能有标点或空格。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“Name特性”。

请参阅：CDaoTableDef::RefreshLink, CDaoTableDef::SetConnect


 CDaoTableDef::SetSourceTableName

void SetSourceTableName(LPCTSTR lpszsreTableName);
throw(CDaoException,CMemoryException);

参数：
lpszsreTableName 指向外部数据库中指定表名的字符串表达式的指针。对于基本表，这个设置为空字符串（“”）。

说明：
调用这个成员函数，如果在原始数据源中存在，可以指定CDaoTableDef基于的表名或者附加表名。接下来必须RefreshLink。对基本表和附加表的读写或者未附加到收集的对象，这个特性设置是空的。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“SourceTableName特性”。

请参阅：CDaoTableDef::RefreshLink, CDaoTableDef::GetSourceTableName


 CDaoTableDef::SetValidationRule

void SetValidationRule(LPCTSTR lpszValidationRule);
throw(CDaoException,CMemoryException);

参数：
lpszValidationRule 指向验证操作有效性的字符串表达式的指针。

说明：
调用这个成员函数，可以对表定义设置有效性规则。有效性规则用于和更新操作的连接中。如果表定义包含有效性规则，则对表定义的更新必须匹配改变表前预先确定的条件。如果变化不匹配条件，则显示包含ValidationText文本的异常。
只有使用Microsoft Jet数据库引擎的数据库支持有效性，表达式不能参考用户定义的函数、域集成函数、SQL集成函数或查询。对CDaoTableDef对象的有效性规则可以参考对象中的多个字段。
例如对于hire_date和termination_date字段，有效性规则可能是：
CString strRule = _T("termination_date>hire_date");
MyRs.SetValidationRule(strRule);
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“ValidationRule特性”。

请参阅：
CDaoTableDef::GetValidationText, CDaoTableDef::SetValidationText, CDaoTableDef::GetValidationRule


 CDaoTableDef::SetValidationText

void SetValidationText(LPCTSTR lpszValidationText);
throw(CDaoException,CMemoryException);

参数：
lpszValidationText 输入数据无效时，指向指定显示文本的字符串表达式的指针。

说明：
调用这个成员函数，可以为带有Microsoft Jet数据库引擎支持的基本表的CDaoTableDef对象设置有效性规则的异常文本。不能对附加表设置有效性文本。
有关表定义的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO表定义”和“DAO表定义：使用表定义”。有关信息，请参阅DAO帮助中的“ValidationText特性”。

请参阅：
CDaoTableDef::SetValidationRule, CDaoTableDef::GetValidationText, CDaoTableDef::GetValidationRule


 CDaoTableDef::m_pDAOTableDef

说明：
包含指向基础CDaoTableDef对象的DAO表定义对象OLE接口的指针。如果需要直接访问DAO接口时，可使用这个指针。
有关访问基础DAO对象的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO收集：获取有关DAO对象的信息”。

请参阅：CDaoTableDef::m_pDatabase


 CDaoTableDef::m_pDatabase

说明：
包含指向这个表CDaoDatabase对象的指针。
有关访问基础DAO对象的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO收集：获取有关DAO对象的信息”。

请参阅：CDaoTableDef::m_pDAOTableDef


 CDaoWorkspace

CObject
└CDaoWorkspace

CDaoWorkspace对象可让一个用户管理从登录到离开期间，指定的密码保护的数据库会话全过程。大多数情况下不需要多个工作区，也不需创建明确的工作区对象；在打开数据库和记录集对象时，它们使用DAO缺省工作区。但是如果需要，可以通过创建额外工作区对象同时运行多个会话。每个工作区对象可以包含它自己的Database收集中的多个打开的数据库对象。MFC中工作区主要是一个事务管理器，指定全部在同一个“事务区”内的一系列打开数据库。
注意：
DAO数据库类与基于开放数据库连接（ODBC）的MFC数据库类截然不同。所有DAO数据库类名都有“CDao”前缀。通常基于DAO的MFC类比基于ODBC的MFC类功能更强。基于DAO的类通过Microsoft Jet数据库引擎访问数据，包括ODBC驱动程序。它们还支持数据定义语言（DDL）操作，例如通过类创建数据库、添加表和字段，而不必直接调用DAO。

功能
类CDaoWorkspace提供以下几点功能：
· | 如果需要，由初始化数据库引擎创建，明确访问缺省工作区。通常通过创建数据库和记录集对象隐式地使用DAO缺省工作区。
· | 事务应用工作区中打开的所有数据库的事务区。可以创建额外的工作区管理单独的事务区。
· | 到基础Microsoft Jet数据库引擎的许多特性的接口（请参阅静态成员函数）。打开或创建工作区，或者在打开或创建之前调用静态成员函数、初始化数据库引擎。
· | 访问数据库引擎的Workspace收集，存储所有已经附加其后的活动工作区。还可以不把它们附加到收集中创建和处理工作区。

安全性
MFC不实现DAO中用于安全性控制的Users和Groups收集。如果需要DAO的这些特征，必须通过直接调用DAO接口亲自对它们编程。有关信息，请参阅“技术指南54”。

用途
可以用类CDaoWorkspace来：
· | 显式打开缺省工作区。 通常对缺省工作区的使用是隐式的──在打开新CDaoDatabase或Cdao Rec-ordset对象时。但是也不可能需要显式访问它──例如要访问数据库引擎特性或Workspace收集。有关“隐式使用缺省工作区”，请参阅下面的内容。
· | 创建新工作区。如果想把它们添加到Workspaces收集中，则调用Append。
· | 打开工作区收集中现有的工作区。
创建Workspace收集中存在的新工作区在下面的Create成员函数中描述。工作区对象不支持数据库引擎会话之间的任何方法。如果应用静态链接MFC，结束程序不会初始化数据库引擎。如果应用动态链接MFC，MFCDLL卸载时不初始化数据库引擎。
只在专业版和企业版中具有的特征：对MFC的静态链接，只有Visual C++专业版和企业版中支持。
显式打开缺省工作区或者打开Workspaces收集中已有工作区，都在下面的Open成员函数中描述。
通过用Close成员函数关闭工作区来结束工作区会话。Close关闭以前没关闭的任何数据库，回滚任何未提交事务。

事务
DAO在工作区级上管理事务；因此，有多个打开数据库的工作区上的事务适用于所有数据库。例如两个数据库有未提交的更新，然后调用CommitTrans，则提交所有更新。如果想把事务限制于单个数据库，则需要为它的单独工作区对象。

隐式使用缺省工作区
在以下环境中MFC隐式使用DAO缺省工作区：
· | 如果创建一个新CDaoDatabase对象，但并不是通过现有CDaoWorkspace对象这样做的，则MFC创建一个对应于DAO缺省工作区的临时工作区对象。如果对多个数据库进行这样的操作，则所有数据库对象都对应于缺省工作区。可以通过CDaoDatabase数据成员访问数据库的工作区。
· | 类似的，如果创建CDaoRecordset对象而不提供指向CDaoDatabase对象的指针，则MFC创建临时数据库对象和扩展后的临时工作区对象。通过一个Cdao Recordset数据成员，可以访问记录集的数据库，以及间接访问它的工作区。

其它操作
还提供了像修复损坏的数据库或压缩数据库等其它数据库操作。
有关CDaoWorkspace的更多信息，请参阅“DAO工作区”。有关直接调用DAO和关于DAO安全性的信息，请参阅“技术指南54”。有关通过DAO处理ODBC数据源的更多信息，请参阅“DAO扩展：使用外部数据源”。有关数据库引擎的信息，请参阅“DAO工作区：数据库引擎”。
所有文章都在联机文档“Visual C++程序员指南”中。MFC数据库样本DAOVIEW图解使用CDaoWorkspace。
#include <afxdao.h>

请参阅：
CDaoDatabase, CDaoRecordset, CDaoTableDef, CDaoQueryDef, CDaoException

CDaoWorkspace类的成员

数据成员
m_pDAOWorkspace 指向基础DAO工作区对象

构造函数
CDaoWorkspace 构造一个工作区对象。然后调用Create或Open

属性
GetIsolateODBCTrans | 返回一个值，表示是否通过强制到数据源的多个连接分隔包含相同ODBC数据源的多个事务
GetName | 返回用于工作区对象的用户定义名字
GetUserName | 返回创建工作区时指定的用户名。这是工作区所有者的名字
IsOpen | 如果工作区打开，则返回非零
SetIsolateODBCTrans | 指定是否通过强制到数据源的多个连接分隔包含相同ODBC数据源的多个事务

操作
Append | 把新创建的工作区附加到数据库引擎的Workspaces收集
BeginTrans | 开始新事务，应用于工作区打开的所有数据库
Close | 关闭工作区和它包含的所有对象。未完成事务回滚
CommitTrans | 完成当前事务并保存变化
CompactDatabase | 压缩（或复制）数据库
Create | 创建一个新DAO工作区对象
GetDatabaseCount | 返回工作区的Databases收集中的DAO数据库对象数量
GetDatabaseInfo | 返回有关工作区的Databases收集中定义的指定DAO数据库的信息
GetWorkspaceCount | 返回数据库引擎的Workspaces收集中DAO工作区对象数量
GetWorkspaceInfo | 返回有关数据库引擎的Workspaces收集中定义的指定DAO工作区的信息
Open | 显式打开DAO缺省工作区对应的工作区对象
RepairDatabase | 试图修复销毁的数据库
Rollback | 结束当前事务并不保存变化
Idle | 允许数据库引擎执行后台任务

数据库引擎特性
GetVersion | 返回一个字符串，包含对应于工作区的数据库引擎版本
GetIniPath | 返回Windows登记中Microsoft Jet数据库引擎的初始化设置的位置
GetLoginTimeout | 返回用户试图登录到ODBC数据库时发生错误之前的秒数
SetDefaultPassword | 不带指定密码的工作区对象创建时，设置数据库引擎使用的密码
SetDefaultUser | 不带指定用户名的工作区对象创建时，设置数据库引擎使用的用户名
SetIniPath | 设置Windows登记中Microsoft Jet数据库引擎的初始化设置的位置
SetLoginTimeout | 设置用户试图登录到ODBC数据库时发生错误之前的秒数


 CDaoWorkspace::Append

void Append();
throw(CDaoException,CMemoryException);

说明：
调用Create后调用这个成员函数。Append把新创建的工作区对象附加到数据库引擎的Workspaces收集。工作区不在数据库引擎会话之间支持；它们只在内存而不是在磁盘中存储。你不必附加工作区；即使没有也可以使用它。
在调用它的Close成员函数之前，附加工作区以活动打开状态保持在Workspaces收集中。
有关工作区的更多信息，请参阅“DAO工作区”。有关数据库引擎的更多信息，请参阅“DAO工作区：数据库引擎”。这两者都在联机文档“VisualC++程序员指南”中。有关信息，请参阅DAO帮助中的“Append方法”。


 CDaoWorkspace::BeginTrans

void BeginTrans();
throw(CDaoException,CMemoryException);

说明：
调用这个成员函数，可以启动一个事务。调用BeginTrans之后，在提交事务时，对数据或数据库结构所做改动生效。因为工作区定义单个事务空间，事务应用于工作区中所有打开的数据库。有两种途径完成事务：
· | 调用CommitTrans成员函数提交事务并把变化保存到数据源。
· | 或者调用Rollback函数取消事务。
在事务未完成期间关闭工作区对象或数据库对象将回滚所有未完成事务。
如果需要把一个ODBC数据源上的事务与另一个ODBC数据源上的分离出来，请参阅SetIsolateODBCTrans成员函数。
有关事务的更多信息，请参阅“DAO工作区：管理事务”；有关工作区的更多信息，请参阅“DAO工作区”。两者都在联机文档“Visual C++程序员指南”中。

请参阅：
CDaoWorkspace::GetIsolateODBCTrans, CDaoWorkspace::CommitTrans, CDaoWorkspace::Rollback


 CDaoWorkspace::CDaoWorkspace

CDaoWorkspace();

说明：
构造一个CDaoWorkspace对象。构造C++对象后有两种选项：
· | 调用对象的Open成员函数打开缺省工作区对象或者打开Workspaces收集中已有对象。
· | 或者调用对象的Create成员函数创建一个新DAO工作区对象。这将明确启动一个新工作区会话，可以通过CDaoWorkspace对象参考它。调用Create后，如果想把工作区附加到数据库引擎的Workspaces收集中，则调用Append。
有关何时需要明确创建CDaoWorkspace对象的信息，请参阅CDaoWorkspace类的概述。通常在打开CDaoDatabase对象但不指定工作区，或者打开CDaoRecordset对象但不指定数据库对象时，使用隐式创建的工作区。用这种方式创建的MFC DAO对象使用DAO缺省工作区，它创建一次，多次重用。
有关工作区的更多信息，请参阅“DAO工作区”；有关隐式工作区创建的更多信息，请参阅“DAO：文章隐式MFC DAO对象”。这两者都在联机文档“Visual C++程序员指南”中。


 CDaoWorkspace::Close

virtual void Close();
throw(CDaoException,CMemoryException);

说明：
调用这个成员函数，可以关闭工作区对象。关闭打开的工作区对象将释放基础DAO对象，如果工作区是Workspaces收集的一个成员，还将从收集中移去。调用Close是一种良好的编程技术。
警告：
关闭工作区对象将关闭工作区中任何打开的数据库。这导致同时关闭数据库中打开的任何记录集，并且没完成的编辑或更新回滚。有关信息，请参阅CDaoDatabase::Close，CDaoRecordset::Close，CDaoTableDef:: Close，CDaoQueryDef::Close成员函数。
工作区对象不是永久的；它们只在对它们参考时存在。这意味着数据库引擎会话结束时，工作区和它的Databases收集不再支持。必须通过再次打开工作区和数据库更新为下一个会话创建它们。
有关工作区的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO工作区”。有关信息，请参阅DAO帮助中的“Close方法”。

请参阅：CDaoWorkspace::Open


 CDaoWorkspace::CommitTrans

void CommitTrans();
throw(CDaoException,CMemoryException);

说明：
调用这个成员函数，可以提交一个事务──保存一组编辑和更新到工作区中一个或多个数据库。事务包含从调用BeginTrans开始时对数据库数据或它的结构所做的一系列改动。完成事务时可以提交它或者用Rollback回滚（取消改动）。缺省情况下没有事务时，立即提交对记录的更新。调用BeginTrans导致更新的提交延迟到调用CommitTrans时。
警告：
在一个工作区内，事务对工作区总是全局的而不局限在仅仅一个数据库或记录集。如果在工作区事务内执行一个以上数据库或记录集操作，CommitTrans提交所有未完成更新，Rollback恢复这些数据库和记录集上的所有操作。
在关闭有未完成事务的数据库或工作区时，事务全部回滚。
注意：
这不是两段式提交机制。如果一个更新提交失败，其它的仍然提交。
有关工作区的更多信息，请参阅“DAO工作区”；有关事务包括单独事务区的更多信息，请参阅“DAO工作区：管理事务”。这两者都在联机文档“Visual C++程序员指南”中。


 CDaoWorkspace::CompactDatabase

static void PASCAL CompactDatabase(LPCTSTR lpszSrcName,
LPCTSTR lpszDestName,
LPCTSTR lpszLocale = dbLangGeneral,
int nOptions = 0
);
throw(CDaoException,CMemoryException);

static void PASCAL CompactDatabase(LPCTSTR lpszSrcName,
LPCTSTR lpszDestName,
LPCTSTR lpszLocale,
int nOptions,
LPCTSTR lpszPassword
);
throw(CDaoException,CMemoryException);

参数：
lpszSrcName | 现有关闭的工作区名字。它可以是一个完整的路径和文件名，例如“C:\\MYDB.MDB”。如果文件名有扩展名，则必须指定它。如果网络支持统一命名规则（UNC），还可以指定网络路径，例如“\\\\MYSERVER\\ MYSHARE\\MYDIR\\MYDB.MDB”（因为“\”在C++中是脱离字符，路径字符串中需要双反斜线）。
lpszDestName | 创建的压缩数据库的完整路径。还可以像lpszSrcName那样指定网络路径。不能使用lpszDestName参数指定与lpszSrcName相同的数据库文件。
lpszPassword | 想压缩密码保护的数据库时使用的密码。注意到使用采取密码的CompactDatabase版本时，必须提供所有参数。同样地，因为这是一个连接参数，它需要下面的特殊格式：;PWD =lpszPassword。例如：;PWD =“Happy”（开头的分号必需）。
lpszLocale用来指定创建lpszDestName所需的对照顺序。如果接受缺省dbLangGeneral值（见下面），新数据库的位置与旧数据库的相同。
可能的取值为：
· | dbLangGeneral | 英语、德、法、葡萄牙、意大利、现代西班牙语
· | dbLangArabic | 阿拉伯语
· | dbLangRussian | 俄语
· | dbLangCzech | 捷克语
· | dbLangDutch | 荷兰语
· | dbLangGreek | 希腊语
· | dbLangHebrew | 希伯来语
· | dbLangHungarian | 匈牙利语
· | dbLangIceLandic | 冰岛语
· | dbLangNordic | 北欧语言（只对Microsoft Jet数据库引擎1.0版）
· | dbLangNorwdan | 挪威和丹麦语
· | dbLangPolish | 波兰语
· | dbLangSpanish | 传统西班牙语
· | dbLangSwedfin | 瑞典和芬兰语
· | dbLangTurkish | 土耳其语
nOptions表示用于目标数据库lpszDestName的一个或多个选项。如果接受缺省值省略此参数，lpszDestName将具有与lpszSrcName相同的加密和版本。可以使用位操作OR操作符合并dbEncrypt或dbDecrypt与一个版本选项。指定数据库格式而非数据库引擎版本的可能值是：
· | dbEncrypt | 压缩时加密数据库
· | dbDecrypt | 压缩时解密数据库
· | dbVersion10 | 压缩时使用Microsoft Jet数据库引擎1.0版创建数据库。
· | dbVersion11 | 压缩时使用Microsoft Jet数据库引擎1.1版创建数据库。
· | dbVersion20 | 压缩时使用Microsoft Jet数据库引擎2.0版创建数据库。
· | dbVersion30 | 压缩时使用Microsoft Jet数据库引擎3.0版创建数据库。
可以使用选项参数中的dbEncrypt或dbDecrypt指定是否在压缩期间加密或解密数据库。如果省略加密常数或者同时包括dbDecrypt和dbEncrypt，lpszDestName将具有与lpszSrcName相同的加密。可以使用选项参数中的一个版本常数对压缩数据库指定数据格式版本。
这个常数只影响lpszDestName的数据格式版本。可以只指定一个版本常数。如果省略版本常数，lpszDestName将具有和lpszSrcName相同的版本。可以只把lpszDestName压缩为与lpszSrcName相同或晚些的版本。
警告：
如果数据库未加密，即使实现了用户/密码安全性，仍然有可能直接读取组成数据库的二进制磁盘文件。

说明：
调用这个成员函数，可以压缩指定的Microsoft Jet（.MDB）数据库。改变数据库中的数据时，数据库文件被分为片段，使用超过必需的更多磁盘空间。应该周期性压缩数据库以消除数据库文件碎片。压缩后的数据库通常较小。在拷贝和压缩数据库期间，还可以选择改变对照顺序、加密或数据格式版本。
警告：
CompactDatabase成员函数不能正确地转换完整的MicrosoftAccess数据库版本。只有数据格式发生转换，像表格和报表等Microsoft Access定义对象都不能转换。但是数据得到正确转换。
提示：还可以使用CompactDatabase拷贝数据库文件。
有关工作区的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO工作区”。有关信息，请参阅DAO帮助中的“CompactDatabase方法”。

请参阅：CDaoWorkspace::RepairDatabase


 CDaoWorkspace::Create

virtual void Create(LPCTSTR lpszName, LPCTSTR lpszUserName, LPCTSTR lpszPassword);
throw(CDaoException,CMemoryException);

参数：
lpszName | 至多14个字符的字符串，唯一命名了新工作区对象。必须提供一个名字。有关信息，请参阅DAO帮助中的“Name特性”。
lpszUserName | 工作区所有者的用户名。有关需求请参阅SetDefaultUser成员函数的lpszDefaultUser参数。有关信息，请参阅DAO帮助中的“UserName特性”。
lpszPassword | 用于新工作区对象的密码。密码最长为14个字符，可以包含除ASCII0（空）以外的任何字符。密码对大小写敏感。有关信息，请参阅DAO帮助中的“Password特性”。

说明： 调用这个成员函数，可以创建一个新DAO工作区并把它与MFCCDaoWorkspace对象相对应。整个创建过程是：
· | 构造一个CDaoWorkspace对象
· | 调用对象的Create成员函数，创建基础DAO工作区。必须指定一个工作区名字。
· | 作为任选，如果想把工作区添加到数据库引擎的Workspaces收集，则调用Append。不附加工作区也可以处理它。
调用Create之后工作区对象处于打开状态，等待使用。调用Create之后不调用Open。如果工作区已经在Workspaces收集中存在，则不要调用Create。如果还没有为应用初始化，Create初始化数据库引擎。
有关工作区的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO工作区”。

请参阅：
CDaoWorkspace::CDaoWorkspace, CDaoWorkspace::Close, CDaoWorkspace::Open


 CDaoWorkspace::GetDatabaseCount

short GetDatabaseCount();
throw(CDaoException,CMemoryException);

返回值：工作区中打开的数据库数量。

说明：
调用这个成员函数，可以获取工作区的Databases收集中DAO数据库对象数量──工作区中打开的数据库数量。如果需要遍历工作区Databases收集中所有定义的数据库，则GetDatabaseCount有用。要获取有关收集中给定数据库的信息，请参阅GetDatabaseInfo。典型用途是调用GetDatabaseCount得到打开的数据库数量，然后使用这个数量作为循环索引，重复调用GetDatabaseInfo。
有关获取数据库信息的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO收集：获取有关DAO对象的信息”。


 CDaoWorkspace::GetDatabaseInfo

void GetDatabaseInfo(int nIndex, CDaoDatabaseInfo& dbinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
throw(CDaoException,CMemoryException);
void GetDatabaseInfo(LPCTSTR lpszName, CDaoDatabaseInfo& dbinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
throw(CDaoException,CMemoryException);

参数：
nIndex | 工作区的Databases收集中数据库对象基于零的索引，用于按索引查找。
dbinfo | 对返回要求信息的CDaoDatabase对象的参考。
dwInfoOptions指定获取数据库哪些信息的选项。有效选项和函数的返回值在这里列出：
· | AFX_DAO_PRIMARY_INFO | （缺省）Name, Updatable,Transactions
· | AFX_DAO_SECONDARY_INFO | 主要信息加：Version, CollatingOrder, Query Timeout
· | AFX_DAO_ALL_INFO | 主要和辅助信息加上：Connect
lpszName | 数据库对象的名字，用于按名字查找。这个名字是最多为14个字符的字符串，唯一命名新工作区对象。

说明：
调用这个成员函数，可以获取工作区中打开数据库的各种信息。函数的一个版本允许按索引查找数据库。另一个版本允许按名字查找数据库。有关dbinfo中返回的信息的描述，请参阅CDaoDatabaseInfo结构。这个结构具有对应于上面列出的dwInfoOptions描述中的信息项的成员。查询一个级别上的信息时同时获取任何低级信息。
有关获取数据库信息的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO收集：获取有关DAO对象的信息”。

请参阅：CDaoWorkspace::GetDatabaseCount


 CDaoWorkspace::GetIniPath

static CString PASCAL GetIniPath();
throw(CDaoException,CMemoryException);

返回值：包含登记位置的CString。

说明：
调用这个成员函数，可以获取Microsoft Jet数据库引擎的初始化设置在Windows登记中的位置。可以使用这个位置得到有关数据库引擎设置的信息。返回信息实际上是登记子码的名字。
有关数据库引擎的更多信息，请参阅联机文档“Visual C++程序员指南”中的“DAO工作区：数据库引擎”。有关信息，请参阅DAO帮助中的“IniPath特性”。

请参阅：CDaoWorkspace::SetIniPath, CDaoWorkspace::GetVersion


 CDaoWorkspace::GetIsolateODBCTrans

BOOL GetIsolateODBCTrans();
throw(CDaoException,CMemoryException);

返回值：
如果隔离ODBC事务，则返回非零值，否则为0。

说明：
调用这个成员函数，可以对工作区得到DAO IsolateODBCTrans特性的当前值。有些情况下，可能需要同一个ODBC数据库上进行多个并发事务。为此需要对每个事务打开一个单独工作区。牢记尽管每个工作区可以有自己的到数据库的ODBC连接，但这会降低系统性能。因为一般不需要事务隔离，缺省情况下共享同一个用户对多个工作区对象打开的ODBC连接。
像Microsoft SQL Server等一些ODBC服务器，不允许单个连接上的并发事务。如果需要在同一时间对一个数据库有多于一个未完成事务，在打开每个工作区时设置IsolateODBCTrans特性为TRUE。这强制对每个工作区的单独ODBC连接。
有关工作区的更多信息，请参阅“DAO工作区”；有关通过DAO处理ODBC数据的更多信息，请参阅“DAO扩展：使用外部数据源”。这两者都在联机文档“Visual C++程序员指南”中。有关信息，请参阅DAO帮助中的“IsolateODBCTrans特性”。

请参阅：CDaoWorkspace::SetIsolateODBCTrans


 CDaoWorkspace::GetLoginTimeout

static short PASCAL GetLoginTimeout();
throw(CDaoException,CMemoryException);

返回值：
试图登录ODBC数据库时发生错误前的秒数。

说明：
调用这个成员函数，可以为工作区得到DAO LoginTimeout特性的当前值。这个值表示试图登录ODBC数据库时发生错误前的秒数。缺省LoginTimeout设置为20秒。LoginTimeout为0秒时，不出现超时，与数据源的通讯将挂起。
试图登录到Microsoft SQL Server等ODBC数据库时，可能由于网络错误或者服务器未运行而发生连接错误。除了等待缺省20秒来连接外，可以在数据库引擎和发生错误之前指定等待时间。登录服务器作为许多不同事件的一部分隐式发生，例如在外部服务器数据库上运行查询。
有关工作区的更多信息，请参阅“DAO工作区”；有关通过DAO处理ODBC数据的更多信息，请参阅“DAO扩展：使用外部数据源”。这两者都在联机文档“Visual C++程序员指南”中。有关信息，请参阅DAO帮助中的“LoginTimeout特性”。

请参阅：CDaoWorkspace::SetLoginTimeout


 CDaoWorkspace::GetName

CString GetName();
throw(CDaoException,CMemoryException);

返回值：
包含用户定义的DAO工作区对象名的CString。

说明：
调用这个成员函数，可以得到基础CDaoWorkspace对象的DAO工作区对象的用户定义名。按名字访问数据库引擎Workspaces收集中的DAO工作区对象时，这个名字有用。
关于工作区的更多信息参见联机文档“Visual C++程序员指南”中的“DAO工作区”。相关信息请参见DAO帮助中的“命名属性”。


 CDaoWorkspace::GetUserName

CString GetUserName();
throw(CDaoException,CMemoryException);

返回值：
表示工作区对象所有者的CString。

说明：
调用这个成员函数，可以得到工作区对象所有者的名字。
要获取或设置对工作区所有者的权限，直接调用DAO检查Permissions特性设置；这确定用户有什么权限。要处理权限，需要有SYSTEM.MDA文件。
有关工作区的更多信息，请参阅“DAO工作区”。有关直接调用DAO的信息，请参阅“技术指南54”。有关信息，请参阅DAO帮助中的“UserName特性”。

请参阅：CDaoWorkspace::SetDefaultUser


 CDaoWorkspace::GetVersion

static CString GetVersion();
throw(CDaoException,CMemoryException);

返回值：
表示对象对应的数据库引擎版本的CString。

说明：
调用这个成员函数，可以确定使用的Microsoft Jet 数据库引擎的版本。返回值表示“大.小”格式的版本号；例如“3.0”。产品版本号（例如3.0）包含版本号（3）、句点和子版本号（0）。
有关工作区的更多信息，请参阅“DAO工作区”。有关信息，请参阅DAO帮助中的“Version特性”。

请参阅：CDaoDatabase::GetVersion


 CDaoWorkspace::GetWorkspaceCount

short GetWorkspaceCount();
throw(CDaoException,CMemoryException);

返回值：
Workspaces收集中的打开数据库数量。

说明：
调用这个成员函数，可以获取数据库引擎的Workspaces收集中DAO工作区对象数量。这个数字不包括未附加到收集中的任何打开工作区。如果需要遍历Workspaces收集中的所有定义工作区，则GetWorkspaceCount有用。为获取收集中给定工作区的有关信息，请参阅GetWorkspaceInfo。典型使用是调用GetWor-kspaceCount得到打开工作区数量，然后用这个数量作为循环索引，重复调用GetWorkspaceInfo。
有关工作区的更多信息，请参阅联机文档“Visual C++程序员指南”的“DAO Collections:Obtaining Information About DAO Objects”。


 CDaoWorkspace::GetWorkspaceInfo

void GetWorkspaceInfo(int nIndex, CDaoWorkspaceInfo& wkspcinfo, DWORD dwInfoOptions = AFC_DAO_PRIMARY_INFO);
throw(CDaoException,CMemoryException);
void GetWorkspaceInfo(LPCTSTR lpszName, CDaoWorkspaceInfo& wkspcinfo, DWORD dwInfoOptions = AFX_DAO_PRIMARY_INFO);
throw(CDaoException,CMemoryException);

参数：
nIndexWorkspaces | 收集中数据库对象基于零的索引，用于按索引查找。
wkspcinfo | 对返回要求信息的CDaoWorkspaceInfo对象的参考。
dwInfoOptions指定获取工作区哪些信息的选项。有效选项和函数的返回值在这里列出：
· | AFX_DAO_PRIMARY_INFO | （缺省）Name
· | AFX_DAO_SECONDARY_INFO | 主要信息加：User Name
· | AFX_DAO_ALL_INFO | 主要和辅助信息加上：IsolateODBCTrans
lpszName | 工作区对象的名字，用于按名字查找。这个名字是最多为14个字符的字符串，唯一命名新工作区对象。

说明：
调用这个成员函数，可以获取会话中打开工作区的各种信息。有关wkspcinfo中返回的信息的描述，请参阅CDaoWorkspaceInfo结构。这个结构具有对应于上面列出的dwInfoOptions描述中的信息项的成员。查询一个级别上的信息时同时获取任何低级信息。
有关工作区的更多信息，请参阅“DAO工作区”。

请参阅：CDaoWorkspace::GetWorkspaceCount


 CDaoWorkspace::Idle

static void PASCAL Idle(int nAction = dbFreeLocks);
throw(CDaoException,CMemoryException);

参数：
nAction 空闲处理期间采取的动作。当前唯一有效动作是dbFreeLocks。

说明：
调用Idle，可以为数据库引擎提供执行后台任务的机会，由于频繁的数据处理，这可能不是最新的。它经常在多用户多任务环境中发生，这时没有足够的后台处理时间保持记录集中所有记录为当前。
重点：
对用Microsoft Jet数据库引擎3.0创建的数据库没有必要调用Idle。只对用早些版本创建的数据库使用Idle。
通常只有在不发生其它动作（包括鼠标移动）时，才会移去读封锁和更新本地动态集型记录集对象中的数据。如果周期性调用Idle，则通过释放不需要的读封锁，为数据库提供了时间，以赶上后台处理任务。指定作为常数的dbFreeLocks常数，将把处理延迟到释放所有读封锁后。
单用户环境中不需要这个成员函数，除非运行一个应用的多个实例中。Idle成员函数可能增强多用户环境中的性能，原因是它强制数据库引擎把数据卸载到磁盘，释放内存上的封锁。还可以通过使操作成为部分事务来释放读封锁。
有关工作区的更多信息，请参阅“DAO工作区”。有关信息，请参阅DAO帮助中的“Idle特性”。


 CDaoWorkspace::IsOpen

BOOL IsOpen() const;

返回值：
如果工作区对象打开，则返回非零值，否则为0。

说明：
调用这个成员函数，可以确定CDaoWorkspace对象是否调用过Open或Create初始化MFC对象。可以调用打开状态的工作区的任何成员函数。有关工作区的更多信息，请参阅“DAO工作区”。


 CDaoWorkspace::Open

virtual void Open(LPCTSTR lpszName = NULL);
throw(CDaoException,CMemoryException);

参数：
lpszName 要打开的DAO工作区对象的名字──最多14个字符，唯一命名工作区。接受缺省值NULL，可以显式打开缺省工作区。有关命名的要求，请参阅Create的lpszName参数。有关信息，请参阅DAO帮助中的“Name特性”。

说明：
构造CDaoWorkspace对象之后，调用这个成员函数可以做下列操作之一：
· | 显式打开缺省工作区。对lpszName传递NULL。
· | 按名字打开Workspaces收集中一个成员，现有的CDaoWorkspace对象。对现存工作区对象传递一个有效名字。
Open把工作区对象置为打开状态，同时如果尚未对应用初始化，则初始化数据库引擎。
虽然只能在工作区打开后，许多CDaoWorkspace成员函数才能调用，但下列在数据库引擎上操作的成员函数在构造C++对象之后、调用Open之前有效：

Create | GetVersion | SetDefaultUser
GetIniPath | Idle | SetIniPath
GetLoginTimeout | SetDefaultPassword | SetLoginTimeout

有关工作区的更多信息，请参阅“DAO工作区”。

请参阅：
CDaoWorkspace::IsOpen, CDaoWorkspace::CDaoWorkspace, CDaoWorkspace::Create, CDaoWorkspace::Close


 CDaoWorkspace::RepairDatabase

static void PASCAL RepairDatabase(LPCTSTR lpszName);
throw(CDaoException,CMemoryException);

参数：
lpszName 现有Microsoft Jet引擎数据库文件的路径和文件名。如果省略这个路径，则只查找当前目录。如果系统支持统一命名规则（UNC），还可以指定网络路径，例如“\\\\MYSERVER\\MYSHARE\\MYDIR\\MYDB.MDB”（因为“\”在C++中是脱离字符，路径字符串中需要双反斜线）。

说明：
如果需要尝试修复一个访问Microsoft Jet数据库引擎的销毁的数据库，则调用此成员函数。在修复之前必须关闭由lpszName指定的数据库。在多用户环境中其它用户不能在修复期间打开lpszName。如果lpszName未关闭或者独占使用无效，则出现一个错误。
这个成员函数试图通过不完整的写操作，修复作了可能损坏记号的数据库。由于电源断电或计算机硬件问题，如果使用Microsoft Jet数据库引擎的应用意料外关闭，这有可能发生。如果完成了操作并调用Close成员函数，或者以正常途径退出应用，则不对数据库作可能损坏记号。
注意：
修复数据库后，调用CompactDatabase成员函数压缩以清除文件碎片和恢复磁盘空间，仍然不失为一个好方法。
有关工作区的更多信息，请参阅“DAO工作区”。有关信息，请参阅DAO帮助中的“RepairDatabase方法”。


 CDaoWorkspace::Rollback

void Rollback();
throw(CDaoException,CMemoryException);

说明：
调用这个成员函数，可以结束当前事务，并把工作区中所有数据库恢复到事务开始前的状况。
警告：
在一个工作区对象内，事务对工作区总是全局的，不仅仅局限于一个数据库或记录集。在一个工作区事务中，如果在多于一个数据库或记录集执行操作，Rollback恢复所有数据库和记录集上的所有操作。
如果关闭工作区对象时未保存或回滚了任何未完成事务，则事务自动回滚。如果调用CommitTrans或Rollback之前未调用BeginTrans，则产生错误。
注意：
开始事务时，数据库引擎在工作站上由TEMP环境变量指定的目录中保存的一个文件里记录它的操作。如果事务日志文件超过了TEMP驱动器上有效存储，则数据库引擎会引起MFC产生CDaoException（DAO错误2004）。在这点上，如果调用CommitTrans，会提交一个不确定数量的事务但丢失不完整事务，并且必须重启操作。调用Rollback释放日志，并回滚事务中的所有操作。
有关事务的更多信息，请参阅“DAO工作区：管理事务”。有关工作区的更多信息，请参阅“DAO工作区”。这两者都在联机文档“Visual C++程序员指南”中。

请参阅：CDaoRecordset


 CDaoWorkspace::SetDefaultPassword

static void PASCAL SetDefaultPassword(LPCTSTR lpszPassword);
throw(CDaoException,CMemoryException);

参数：
lpszPassword 缺省密码。密码最长为14个字符，可以包含除ASCII 0（空）以外的任何字符。密码是大小写敏感的。

说明：
调用这个成员函数，可以在创建没有指定密码的工作区对象时，设置数据库引擎使用的缺省密码。设置的缺省密码应用于这次调用后创建的新工作区。创建以后的工作区时，不需在Create调用中指定一个密码。
要使用这个成员函数：
1. | 构造CDaoWorkspace对象但不调用Create。
2. | 调用SetDefaultPassword，如果喜欢，再调用SetDefaultUser。
3. | 不指定密码，对这个工作区对象和以后的对象调用Create。
缺省情况下，DefaultUser特性设置为“admin”，DefaultPassword特性设置为空字符串（“”）。
有关工作区的更多信息，请参阅“DAO工作区”。有关安全性的信息，请参阅DAO帮助中的“Permissions特性”。有关信息，请参阅DAO帮助中的“DefaultPassword特性”和“DefaultUser特性”。


 CDaoWorkspace::SetDefaultUser

static void PASCAL SetDefaultUser(LPCTSTR lpszDefaultUser);
throw(CDaoException,CMemoryException);

参数：
lpszDefaultUser 缺省用户名。用户名可以为1到达0个字符长，包括除"（引号）、/（前斜线）、\（反斜线）、[ ]（括号）、：（冒号）、|（管道）、<（大于号）、>（小于号）、+（加号）、=（等号）、;（分号）、,（逗号）、?（问号）、*（星号）、空格开头和控制字符（ASCII 0到ASCII 31）以外的字母字符、强调字符、数字、空格和标点。有关信息，请参阅DAO帮助中的“UserName特性”。

说明：
调用这个成员函数，可以在创建没有指定用户名的工作区对象时，设置数据库引擎使用的缺省值。设置的缺省用户名应用于这次调用后创建的新工作区。创建以后的工作区时，不需在Create调用中指定一个用户名。为使用这个成员函数：
1. | 构造CDaoWorkspace对象组但不调用Create。
2. | 调用SetDefaultUser，如果喜欢再调用SetDefaultPassword。
3. | 不指定用户名，对这个工作区对象和以后的对象调用Create。
缺省情况下，DefaultUser特性设置为“admin”，DefaultPassword特性设置为空字符串（""）。
有关工作区的更多信息，请参阅“DAO工作区”。有关安全性的信息，请参阅DAO帮助中的“Permissions特性”。有关信息，请参阅DAO帮助中的“DefaultPassword特性”和“DefaultUser特性”。


 CDaoWorkspace::SetIniPath

static void PASCAL SetIniPath(LPCTSTR lpszRegistrySubkey);
throw(CDaoException,CMemoryException);

参数：
lpszRegistrySubkey 用于可安装ISAM数据库所需Microsoft Jet数据库引擎或参数位置的字符串，包含Windows登记子码名字。

说明：
调用这个成员函数，可以指定为Microsoft Jet数据库引擎的Windows登记设置的位置。只存在需要指定特殊设置时调用SetIniPath。有关的更多信息，请参阅DAO帮助中的“IniPath特性”。
重点：
在程序安装期间而不是运行时调用SetIniPath。必须在打开任何工作区、数据库或记录集前调用SetIniPath；否则MFC产生一个异常。
可以使用这个机制把数据库引擎配置为用户提供的登记设置。这个属性的范围限定为应用，并且不重启动应用不能改动。
有关工作区的更多信息，请参阅“DAO工作区”。


 CDaoWorkspace::SetIsolateODBCTrans

void SetIsolateODBCTrans(BOOL bIsolateODBCTrans);
throw(CDaoException,CMemoryException);

参数：
bIsolateODBCTrans 如果想开始隔离ODBC事务，则传递TRUE；如果想停止隔离ODBC事务，则传递FALSE。

说明：
调用这个成员函数，可以对工作区得到DAO IsolateODBCTrans特性的当前值。有些情况下，可能需要同一个ODBC数据库上进行多个并发事务。为此需要对每个事务打开一个单独工作区。牢记尽管每个工作区可以有自己的到数据库的ODBC连接，但这会降低系统性能。因为一般不需要事务隔离，缺省情况下共享同一个用户对多个工作区对象打开的ODBC连接。
像Microsoft SQL Server等一些ODBC服务器，不允许单个连接上的并发事务。如果需要在同一时间对一个数据库有多于一个未完成事务，在打开每个工作区时设置IsolateODBCTrans特性为TRUE。这强制对每个工作区的单独ODBC连接。
有关工作区的更多信息，请参阅“DAO工作区”。有关事务的更多信息，请参阅“DAO工作区：管理事务”。有关通过DAO处理ODBC数据的更多信息，请参阅“DAO扩展：使用外部数据源”。它们都在联机文档“Visual C++程序员指南”中。

请参阅：CDaoWorkspace::GetIsolateODBCTrans


 CDaoWorkspace::SetLoginTimeout

static void PASCAL SetLoginTimeout(short nSeconds);
throw(CDaoException,CMemoryException);

参数：
nSeconds 试图登记ODBC数据库时发生错误前的秒数。

说明：
调用这个成员函数，可以为工作区设置DAO LoginTimeout特性的当前值。这个值表示试图登录ODBC数据库时发生错误前的秒数。缺省LoginTimeout设置为20秒。LoginTimeout为0秒时，不出现超时，与数据源的通讯将挂起。
试图登录到Microsoft SQL Server等ODBC数据库时，可能由于网络错误或者服务器未运行而发生连接错误。除了等待缺省20秒来连接外，可以在数据库引擎和发生错误之前指定等待时间。登录服务器作为许多不同事件的一部分隐式发生，例如在外部服务器数据库上运行查询。
有关工作区的更多信息，请参阅“DAO工作区”。有关通过DAO处理ODBC数据的更多信息，请参阅“DAO扩展：使用外部数据源”。这两者都在联机文档“Visual C++程序员指南”中。有关信息，请参阅DAO帮助中的“LoginTimeout特性”。

请参阅：CDaoWorkspace::GetLoginTimeout


 CDaoWorkspace::m_pDAOWorkspace

说明：
指向基础DAO工作区对象的指针。如果需要直接访问基础DAO对象，则使用这个数据成员。可以通过这个指针调用DAO对象的接口。
有关直接访问DAO对象的信息，请参阅“技术指南54”。


 CDatabase

CObject
└CDatabase

CDatabase对象表示到数据源的连接，通过它可以操作数据源。数据源是位于一些数据库管理系统（DBMS）的数据的指定实例，包括MicrosoftSQL Server，Microsoft Access，Borland dBASE和xBASE。在应用中可以同时使一个或多个CDatabase对象活动。
注意：
如果在处理数据访问对象（DAO）类而不是开放数据库连接（ODBC）类，可使用类CDaoDatabase。有关的更多信息，请参阅联机文档“Visual C++程序员指南”中的“数据库主题（通用）”与“DAO和MFC”。
为使用CDatabase，构造一个CDatabase对象并调用它的OpenEx成员函数。这打开了一个连接。在接着构造CRecordset对象以操纵连接的数据源时，向CDatabase对象传递记录集构造程序指针。完成使用连接时调用Close成员函数并销毁CDatabase对象。Close关闭以前没有关闭的任何记录集。
有关CDatabase的更多信息，请参阅联机文档“Visual C++程序员指南”中的“数据源（ODBC）”和“数据库主题（通用）”。
#include <afxdb.h>
请参阅：CRecordset

CDatabase类成员

数据成员
m_hdbc 对数据源的开放数据库连接（ODBC）连接句柄。类型HDBC

构造函数
CDatabase | 构造一个CDatabase对象。必须通过调用OpenEx或Open初始化这个对象
Open | 建立到数据源的一个连接（通过ODBC驱动程序）
OpenEx | 建立到数据源的一个连接（通过ODBC驱动程序）
Close | 关闭数据源连接

数据库属性
GetConnect | 返回用于连接CDatabase对象和数据源的ODBC连接字符串
IsOpen | 如果CDatabase对象当前与数据源连接，则返回非零
GetDatabaseName | 返回当前使用的数据库名字
CanUpdate | 如果CDatabase可更新（不是只读的），则返回非零
CanTransact | 如果数据源支持事务，则返回非零
SetLoginTimeout | 设置数据源连接试图超时的秒数
SetQueryTimeout | 设置数据库查询操作超时的秒数。影响以后的所有记录集调用：Open，AddNew，Edit和Delete
GetBookmarkPersistence | 标识记录集对象上书签持久化操作
GetCursorCommitBehavior | 标识在打开的记录集对象上提交事务的效果
GetCursorRollbackBehavior | 标识在打开的记录集对象上回滚事务的效果

数据库操作
BeginTrans | 在连接的数据源上开始“事务”──类CRecordset的一系列可回滚的AddNew，Edit，Delete和Update成员函数调用。数据源必须支持事务才能使BeginTrans有效
BindParameters | 允许在调用CDatabase::ExecuteSQL前绑定参数
CommitTrans | 完成由从BeginTrans开始的事务。执行这个事务中改变数据源的命令
Rollback | 回滚当前事务期间所做变化，数据源返回到BeginTrans调用时定义的未改变的以前状况
Cancel | 取消第二个线程的异步操作或处理
ExecuteSQL | 执行一条SQL语句。不返回数据记录

数据库覆盖
OnSetOptions 框架调用以设置标准连接选项。缺省实现设置查询超时值。可以通过调用SetQueryTimeout提前建立这些选项


 CDatabase::BeginTrans

BOOL BeginTrans();

返回值：
如果调用成功并且只手工提交改变，则返回非零值，否则为0。

说明：
调用这个成员函数，可以开始连接数据源的事务。一个事务包含一个或更多的CRecordset对象的AddNew，Edit，Delete和Update成员函数。
开始事务之前，CDatabase对象必须已经通过调用OpenEx或Open成员函数与数据源相连接。要结束事务，可调用CommitTrans接受对数据源的所有变化（并且执行它们），或者调用Rollback中止整个事务。在打开事务中包括的所有记录集后调用BeginTrans，并且尽可能接近实际更新操作。
警告：
依赖于使用的ODBC驱动程序，调用Rollback时，在调用BeginTrans之前记录集可能出现问题。应该检查使用的指定驱动程序。例如使用Microsoft ODBC Desktop Driver Pack 3.0包括的Microsoft Access驱动程序时，必须说明Jet数据库引擎的要求，不应该在有打开的游标的任何数据库上开始事务。在MFC数据库类中，打开的光标意味着一个打开的CRecordset对象。有关的更多信息，请参阅“技术指南68”。
根据要求的并发性和数据源的功能，BeginTrans还可能封锁服务器上的数据记录。有关封锁数据的信息，请参阅联机文档“Visual C++程序员指南”中的“记录集：封锁记录（ODBC）”。
联机文档“Visual C++程序员指南”中的“事务（ODBC）”解释用户定义的事务。
BeginTrans建立了以后事务可以回滚（翻转）的状态。要建立回滚的新状态，可确认任何当前事务，然后再次调用BeginTrans。
警告：
没有调用CommitTrans或Rollback就再调用BeginTrans是一个错误。
调用CanTransact成员函数，可以确定驱动程序是否支持给定数据库的事务。你还应该调用GetCursorCommitBehavior和GetCursorRollbackBehavior来确定对游标保留的支持。
有关事务的更多信息，请参阅联机文档“Visual C++程序员指南”中的“事务（ODBC）”。

示例：
请参阅联机文档“Visual C++程序员指南”中的“事务：执行记录集中的事务（ODBC）”。

请参阅：
CDatabase::CommitTrans, CDatabase::Rollback, CRecordset::CanTransact


 CDatabase::BindParameters

virtual void BindParameters(HSTMT hstmt);

参数：
htsmt 用于想绑定参数的ODBC语句句柄。

说明：
调用CDatabase::ExecuteSQL之前，需要绑定参数，则覆盖BindParameters。在不需要存储过程的结果集时这个方法有用。
在覆盖函数中，调用SQLBindParameters和相关ODBC函数以绑定参数。MFC在调用ExecuteSQL前调用覆盖函数。不需要调用SQLPrepare；ExecuteSQL调用SQLExecDirect并销毁这个只使用一次的hsmt。


 CDatabase::Cancel

void Cancel();

说明：
调用这个成员函数，可以查询数据源取消处理中的一个异步操作还是第二线程的一个过程。注意到MFC ODBC类不再使用异步处理；要执行异步操作，必须直接调用ODBC API函数SQLSetConnectOption。有关的更多信息，请参阅联机文档“ODBC SDK程序员指南”中的“异步执行函数”。


 CDatabase::CanTransact

BOOL CanTransact() const;

返回值：
如果使用这个CDatabase对象的记录集允许事务，则返回非零值，否则为0。

说明：
调用这个成员函数，可以确定数据库是否支持事务。有关事务的更多信息，请参阅联机文档“Visual C++程序员指南”中的“事务（ODBC）”。

请参阅：
CDatabase::BeginTrans, CDatabase::CommitTrans, CDatabase::Rollback


 CDatabase::CanUpdate

BOOL CanUpdate() const;

返回值：
CDatabase对象允许更新，则返回非零值，否则为0，表示或者在打开CDatabase对象时传递bReadOnly中的TRUE，或者数据源本身是只读的。如果以SQL_DATASOURCE_READ_ONLY调用ODBC API函数::SQLGetInfo返回“y”，则数据源是只读的。

说明：
调用这个成员函数，可以确定CDatabase对象是否允许更新。并非所有驱动程序都支持更新。


 CDatabase::CDatabase

CDatabase();

说明：
构造一个CDatabase对象。构造这个对象后，必须调用它的OpenEx或Open成员函数以建立到指定数据源的连接。
你可能发现把CDatabase对象嵌入文档类比较方便。

示例：
//This example illustrates using CDatabase
//in a CDocument-derived class
class CMyDocument : public CDocument
{
public:
//Declare a CDatabase embedded in the document
CDatabase m_dbCust;
//...
};

//...

//Initialize when needed
CDatabase* CMyDocument::GetDatabase( )
{
//Connect the object to a data source
if (!m_dbCust.IsOpen() && !m_dbCust.OpenEx(NULL)) return NULL;
return &m_dbCust;
}

请参阅：CDatabase::OpenEx, CDatabase::Open


 CDatabase::Close

virtual void Close();

说明：
如果想切断与数据源的连接，则调用这个成员函数。在调用之前必须关闭与CDatabase对象对应的任何记录集。因为Close不销毁CDatabase对象，通过打开到同一个或不同数据源的新连接，可以重使用这个对象。
所有使用这个数据库的记录集的未完成AddNew或Edit语句将被取消，所有未完成事务将回滚。任何依赖于CDatabase对象的记录集留在未定义状态。

示例：
//Close the current connection
m_dbCust.Close();
//Perhaps connect the object to a
//different data source
m_dbCust.OpenEx("DSN=MYDATASOURCE; UID=JOES");

请参阅：CDatabase::OpenEx, CDatabase::Open


 CDatabase::CommitTrans

BOOL CommitTrans();

返回值：
如果成功提交更新，则返回非零值，否则为0。如果CommitTrans失败，则数据源状态未知。必须检查数据以确定其状态。

说明：
完成事务的基础上调用这个成员函数。一个事务包含由调用BeginTrans成员函数开始的，一系列CRecordset对象的AddNew，Edit，Delete和Update成员函数的调用。CommitTrans提交事务。缺省情况下更新立即提交；调用BeginTrans导致对更新的提交延迟到调用CommitTrans时。
直到调用CommitTrans结束事务之前，可以调用Rollback成员函数中止事务，把数据源保留在原始状态。要开始新事务需再次调用BeginTrans。
有关事务的更多信息，请参阅联机文档“Visual C++程序员指南”中的“事务（ODBC）”。

示例：
请参阅联机文档“Visual C++程序员指南”中的“事务（ODBC）”。

请参阅：CDatabase::BeginTrans, CDatabase::Rollback


 CDatabase::ExecuteSQL

void ExecuteSQL(LPCSTR lpszSQL);
throw(CDBException);

参数：
lpszSQL 指向包含一条要执行的有效SQL命令的空终止字符串。可以传递一个CString。

说明：
需要直接执行一条SQL时调用这个成员函数。创建作为空终止字符串的命令。ExecuteSQL不返回数据记录。如果想操纵记录，则需使用记录集对象。
对数据源的大多数命令通过记录集对象提出，支持的命令有选择数据、插入新记录、删除记录和编辑记录。但是数据库类并不直接支持所有的ODBC功能，所以有时可能需要调用ExecuteSQL直接使用SQL。

示例：
CString strCmd = "UPDATE Taxes SET Federal = 36%";

TRY
{
m_dbCust.ExecuteSQL(strCmd);
}
CATCH(CDBException, e)
{
//The error code is in e->m_nRetCode
}
END_CATCH

请参阅：CDatabase::SetLoginTimeout, CRecordset


 CDatabase::GetBookmarkPersistence

DWORD GetBookmarkPersistence() const;

返回值：
书签保持在记录集对象上所依赖操作的位屏蔽。有关详细情况，请参阅说明。

说明：
调用这个成员函数，可以确定某些操作后书签是否保持在记录集对象上。例如，如果调用CRecordset::GetBookmark然后调用CRecordset::Requery，从GetBoo-kmark得到的书签可能将不再有效。应该在调用CRecordset::Setbookmark前调用GetBookmarkPersistence。
下表列出了可以用于GetBookmarkPersistence返回值的组合位屏蔽值。
位屏蔽值 | 书签支持
SQL_BP_CLOSE | Requery操作后书签有效
SQL_BP_DELETE | 对行的书签在Delete操作该行后有效
SQL_BP_DROP | Close操作后书签有效
SQL_BP_SCROLL | 任何Move操作后书签有效。这只是标识记录集上是否支持书签，像CRecordset::CanBookmark返回的一样
SQL_BP_TRANSACTION | 提交或回滚事务后书签有效
SQL_BP_UPDATE | 对行的书签在Update操作该行后有效
SQL_BP_OTHER_HSTMT | 与一个记录集对象对应的书签在第二个记录集上有效
有关这个返回值的更多信息，请参阅联机文档“ODBC SDK程序员指南”中的ODBC API函数SQLGetInfo。有关书签的更多信息，请参阅联机文档“Visual C++程序员指南”中的“记录集：书签和绝对位置（ODBC）”。

请参阅：
CRecordset, CRecordset::CanBookmark, CRecordset::GetBookmark, CRecordset::SetBookmark


 CDatabase::GetConnect

const CString& GetConnect() const;

返回值：
如果调用了OpenEx或Open，则是对包含连接字符串CString的const参考，否则为空字符串。

说明：
调用这个成员函数，可以获取调用OpenEx或Open期间使用的连接字符串，把CDatabase对象与数据源连接起来。请参阅CDatabase::Open中如何创建连接字符串的描述。

请参阅：CDatabase::OpenEx, CDatabase::Open


 CDatabase::GetCursorCommitBehavior

int GetCursorCommitBehavior() const;

返回值：
指示事务对打开记录集对象所起作用的一个值。有关详细情况，请参阅说明。

说明：
调用这个成员函数，可以确定CommitTrans操作如何影响打开记录集对象上的游标。
下表列出对GetCursorCommitBehavior可能的返回值及对打开记录集相应的作用。
返回值 | 对CRecordset对象的作用
SQL_CB_CLOSE | 事务提交之后立即调用CRecordset::Requery
SQL_CB_DELETE | 事务提交之后立即调用CRecordset::Close
SQL_CB_PRESERVE | 正常进行CRecordset操作
有关这个返回值的更多信息，请参阅联机文档“ODBC SDK程序员指南”中的ODBC API函数SQLGetInfo。有关事务的更多信息，请参阅联机文档“Visual C++程序员指南”中的“事务（ODBC）”。

请参阅：
CDatabase::GetCursorRollbackBehavior, CDatabase::CanTransact, CDatabase::BeginTrans, CDatabase::CommitTrans, CDatabase::Rollback, CRecordset


 CDatabase::GetCursorRollbackBehavior

int GetCursorRollbackBehavior() const

返回值：
指示事务对打开记录集对象所起作用的一个值。有关详细情况，请参阅说明。

说明：
调用这个成员函数，可以确定Rollback操作如何影响打开记录集对象上的游标。
下表列出对GetCursorRollbackBehavior可能的返回值以及对打开记录集相应的作用：
返回值 | 对CRecordset对象的作用
SQL_CB_CLOSE | 事务提交之后立即调用CRecordset::Requery
SQL_CB_DELETE | 事务提交之后立即调用CRecordset::Close
SQL_CB_PRESERVE | 正常进行CRecordset操作
有关这个返回值的更多信息，请参阅联机文档“ODBC SDK程序员指南”中的ODBC API函数SQLGetInfo。有关事务的更多信息，请参阅联机文档“Visual C++程序员指南”中的“事务（ODBC）”。

请参阅：
CDatabase::GetCursorCommitBehavior, CDatabase::CanTransact, CDatabase::BeginTrans, CDatabase::CommitTrans, CDatabase::Rollback, CRecordset


 CDatabase::GetDatabaseName

CString GetDatabaseName() const;

返回值：
如果成功，则返回包含数据库名字的CString；否则为空CString。

说明：
调用这个成员函数，可以获取当前连接的数据库名字（数据源提供的定义称为“数据库”的命名对象）。这与OpenEx或Open调用中指定的数据源名字（DSN）不同。GetDatabaseName返回内容取决于ODBC。通常数据库是表的收集。如果这个实体有名字，则GetDatabaseName返回它。
例如可能想在标题头显示这个名字。如果从ODBC获取名字时出现错误，则GetDatabaseName返回一个空CString。

请参阅：
CDatabase::OpenEx, CDatabase::Open, CDatabase::GetConnect


 CDatabase::IsOpen

BOOL IsOpen() const

返回值：
如果CDatabase对象当前连接上，则返回非零值，否则为0。

说明：
调用这个成员函数，可以确定CDatabase对象当前是否连接到一个数据源上。

请参阅：CDatabase::OpenEx, CDatabase::Open


 CDatabase::OnSetOptions

virtual void OnSetOptions(HSTMT hstmt);

参数：
hstmt 要设置选项的ODBC语句句柄。

说明：
直接用ExecuteSQL成员函数执行SQL语句时，框架调用这个成员函数。CRecordset::OnSetOptions也调用这个成员函数。
OnSetOptions设置登录超时值。如果以前调用过SetQueryTimeout和成员函数，则OnSetOptions影响当前值；否则设置缺省值。
注意：
在MFC 4.2前，OnSetOptions还把处理模式设置为同步或异步。从MFC 4.2开始，所有操作为同步。要执行异步操作，应直接调用ODBC API函数SQLSetPos。
不必覆盖OnSetOptions以改变超时值。相反，要定制查询超时值，可在创建记录集前调用SetQueryTimeout；OnSetOptions将使用新值。设置的值适用于以后对所有记录集的操作或者直接SQL调用。
如果想设置额外信息则覆盖OnSetOptions。覆盖函数应该在调用ODBCAPI函数::SQLSetStmtOption前后调用基本类OnSetOptions。按照OnSetOptions的框架缺省实现中表示的方法。

请参阅：
CDatabase::ExecuteSQL, CDatabase::SetQueryTimeout, CRecordset::OnSetOptions


 CDatabase::Open

virtual BOOL Open(LPCTSTR lpszDSN,
BOOL bExclusive = FALSE,
BOOL bReadOnly = FALSE,
LPCTSTR lpszConnect = _T("ODBC;"),
BOOL bUseCursorlib = TRUE
);
throw(CDBException,CMemoryException);

返回值：
如果成功形成连接，则返回非零值；否则如果在出现要求更多连接信息的对话框时用户选择Cancel，则为0。在其它所有情况下框架产生一个异常。

参数：
lpszDSN | 指定一个数据源名字──通过ODBC管理程序登记的名字。如果在lpszConnect中指定了DSN值（以“DSN = <数据-源>”格式），则不能再在lpszDSN中指定。这时lpszDSN应为NULL。否则，如果想为用户提供一个数据源对话框，用户可以从中选择数据源，则可以传递NULL。有关详细信息，请参阅说明。
bExclusive | 这个版本类库中不支持。当前如果这个参数为TRUE，则断言失败。数据源总以共享形式（非独占）打开。
bReadOnly | 如果想让连接只读或者禁止对数据源的更新，则为TRUE。所有相关记录集继承这个属性。缺省值为FALSE。
lpszConnect | 指定一个连接字符串。连接字符串连接一串信息，可能包括数据源名字、数据源上的用户ID、用户认证字符串（如果数据源需要的密码）和其它信息。整个连接字符串必须以字符串“ODBC;”作前缀（大写或小写）。“ODBC;”字符串用来表示这是到ODBC数据源的连接；类库的以后版本可能支持非ODBC数据源，这是向上兼容的。
bUseCursorLib | 如果想装入ODBC游标库DLL，则为TRUE。光标掩盖了基础ODBC驱动程序的一些功能，有效地阻止使用动态集（如果驱动程序支持它们）。如果装入游标库，支持的唯一光标是静态快照和只能向前游标。缺省值为TRUE。如果计划从CRecordset直接创建一个记录集对象而不派生，则不应装入游标库。

说明：
调用这个成员函数，可以初始化一个新构造的CDatabase对象。必须在用来构造记录集对象前初始化数据库对象。
注意：
调用OpenEx成员函数是连接到数据源和初始化数据库对象的优先途径。
如果Open调用中的参照不包含形成连接的足够信息，则ODBC驱动程序打开一个对话框，从用户那里得到必要信息。如果调用Open，连接字符串lpszConnect自己存放在CDatabase对象中，并且可以通过调用GetConnect成员函数成为有效。
如果需要的话，可以在调用Open之前打开你自己的对话框，从用户处获取密码等信息，然后把那些信息加到传递到Open的连接字符串中。
或者有可能想保存传递的连接字符串，这样在应用等到下次调用Open时可以在CDatabase对象上重用它。
还可以把连接字符串用于多个登录授权级别（每个用于不同的CDatabase对象），或者传送其它数据源指定信息。有关连接字符串的更多信息，请参阅联机文档“ODBC SDK程序员参考”中第5章。
连接有可能试图超时，例如DBMS主机无效时。如果连接试图失败，则Open产生CDBException。

示例：
//Embed a CDatabase object
//in your document class
CDatabase m_dbCust( );

//Connect the object to a
//data source(no password)
//the ODBC connection dialog box
//will always remain hidden
m_dbCust.Open( _T("MYDATASOURCE"), FALSE, FALSE, _T("ODBC;UID=JOES");
//...Or, query the user for all
//connection information
m_dbCust.Open(NULL);

请参阅：
CDatabase::OpenEx, CDatabase::CDatabase, CDatabase::Close, CDBException, CRecordset::Open


 CDatabase::OpenEx

virtual BOOL OpenEx(LPCTSTR lpszConnectString, DWORD dwOptions = 0);
throw(CDBException,CMemoryException);

返回值：
如果成功形成连接，则返回非零值；否则如果在出现要求更多连接信息的对话框时，用户选择Cancel，则为0。在其它所有情况下框架产生一个异常。

参数：
lpszConnectString 指定一个ODBC连接字符串。这包括数据源名字和用户ID与密码等其它任选信息。例如“DSN = SQLServer_Source; UID = SA; PWD =abc123”是一个可能的连接字符串。注意到如果为lpszConnectString传递NULL，则将出现数据源对话框，提示用户选择一个数据源。
dwOptions指定下列值一种组合的位屏蔽。缺省值0表示以共享方式打开数据库，带有写访问，不装入ODBC游标库DLL，并且只有在没有足够信息形成连接时显示ODBC连接对话框。
· | CDatabase::openExclusive | 此类库版本不支持。为共享（非排它）数据源总是打开的。如果选定此选项，断言失败。
· | CDatabase::UseCursorLib | 装入ODBC游标库DLL。游标掩盖了基础ODBC驱动程序的一些功能，有效地阻止使用动态集（如果驱动程序支持它们）。如果装入游标库，支持的唯一游标是静态快照和只能向前游标。缺省值为TRUE。如果计划从CRecordset直接创建一个记录集对象而不派生，则不应装入游标库。
· | CDatabase::noOdbcDialog | 不管是否提供了足够的连接信息，不显示ODBC连接对话框。
· | CDatabase::forceOdbcDialog | 总是显示ODBC连接对话框。

说明：
调用这个成员函数，可以初始化一个新构造的CDatabase对象。必须在用来构造记录集对象前初始化数据库对象。
如果OpenEx调用中的lpszConnectString参数不包含形成连接的足够信息，则ODBC驱动程序打开一个对话框，从用户那里得到必要信息。假设你没有在dwOptions选择中设置CDatabase::noOdbcDialog或CDatabase::forceOdbcDialog。调用OpenEx时，连接字符串lpszConnectString自己存放在CDatabase对象中，并且可以通过调用GetConnect成员函数成为有效。
如果需要的话，可以在调用OpenEx之前打开自己的对话框，从用户处获取密码等信息，然后把那些信息加到传递到OpenEx的连接字符串。
或者有可能想保存传递的连接字符串，这样在应用等到下次调用OpenEx时可以在CDatabase对象上重用它。
还可以把连接字符串用于多个登录授权级别（每个用于不同的CDatabase对象），或者传送其它数据源指定信息。有关连接字符串的更多信息，请参阅联机文档“ODBC SDK程序员参考”中的第5章。
连接有可能试图超时，例如DBMS主机无效时。如果连接试图失败，则OpenEx产生CDBException。

示例：
//Embed a CDatabase object
//in your document class
CDatabase m_dbCust( );

//Connect the object to a
//read-only data source where
//the ODBC connection dialog box
//will always remain hidden
m_dbCust.OpenEx( _T("DSN=MYDATASOURCE;UID=JOES"), CDatabase::openReadOnly | CDatabase::noOdbcDialog));

请参阅：
CDatabase::Open, CDatabase::CDatabase, CDatabase::Close, CDBException, CRecordset::Open


 CDatabase::Rollback

BOOL Rollback();

返回值：
成功回滚事务，则返回非零值，否则为0。如果Rollback调用失败，则数据源和事务状况未知。如果Rollback返回0，则必须检查数据源以确定其状态。

说明：
调用这个成员函数，可以回滚事务期间所做的改动。所有自上次BeginTrans以来的CRecordset AddNew，Edit，Delete和Update调用都回滚到调用时存在的状态。
调用Rollback后，事务结束，必须为另一个事务再次调用BeginTrans。
调用BeginTrans前为当前的记录在Rollback后又成为当前记录。
回滚以后，在回滚前为当前的记录保持为当前。有关记录集状态和回滚的数据源的详细情况，请参阅联机文档“Visual C++程序员指南”中的“事务（ODBC）”。

示例：
请参阅联机文档“Visual C++程序员指南”中的“事务：执行记录集中的事务（ODBC）”。

请参阅：CDatabase::BeginTrans, CDatabase::CommitTrans


 CDatabase::SetLoginTimeout

void SetLoginTimeout(DWORD dwSeconds);

参数：
dwSeconds 连接试图超时前允许的秒数。

说明：
调用OpenEx或Open之前调用这个成员函数，可以覆盖试图的数据源连接超时前允许的缺省秒数。连接试图有可能超时，例如DBMS无效。在创建未初始化CDatabase对象之后但在调用OpenEx或Open之前调用SetLoginTimeout。
登录超时的缺省值为15秒，并非所有数据源支持指定登录超时值的能力。如果数据源不支持超时，将得到轨迹输出但不是一个异常。值0表示“无限”。

请参阅：CDatabase::OnSetOptions, CDatabase::SetQueryTimeout


 CDatabase::SetQueryTimeout

void SetQueryTimeout(DWORD dwSeconds);

参数：
dwSeconds 查询试图超时前允许的秒数。

说明：
调用这个成员函数，可以覆盖以后对连接的数据源操作超时前允许的缺省秒数。一个操作可能由于网络访问问题、过量查询处理时间等超时。
如果想改变查询超时值，应在打开记录集或调用记录集的AddNew，Update或Delete成员函数前调用SetQueryTimeout。设置影响以后对相应于这个CDatabase对象所有记录集的Open，AddNew，Update和Delete调用。打开之后改变记录集的查询超时值不会改变记录集的值。例如，以后的Move操作不使用新值。
查询超时的缺省值是15秒。并非所有数据源支持指定查询超时的能力。
如果设置查询超时值为0则不出现超时；到数据源的通讯将挂起。开发期间这个功能可能有用。如果数据源不支持超时，将得到轨迹输出而不是一个异常。

请参阅：CDatabase::SetLoginTimeout


 CDatabase::m_hdbc

说明：
包含到ODBC数据源连接的一个公共句柄──“连接句柄”。通常不必直接访问这个成员变量，而在调用OpenEx或Open时框架分配这个句柄。在CDatabase对象上调用Delete操作时，框架取消对句柄的分配。注意到Close成员函数不取消句柄的分配。
但是在一些情况下，可能需要直接使用这个句柄。例如，如果需要直接调用ODBC API函数而不通过CDatabase，则可能需要一个连接句柄作为参数传递。请参阅下面的代码实例。

示例：
//Using m_hdbc for a direct ODBC API call.
//m_db is the CDatabase object; m_hdbc is
//its HDBC member variable
nRetcode = ::SQLGetInfo( m_db.m_hdbc, SQL_ODBC_SQL_CONFORMANCE, &nValue, sizeof(nValue), &cbValue );

请参阅：
CDatabase::OpenEx, CDatabase::Open, CDatabase::Close


 CDataExchange

CDataExchange没有基类。
CDataExchange支持Microsoft基本类使用的对话数据交换（DDX）和对话数据有效性（DDV）例程。如果在为客户数据类型或控件写数据交换例程，或者编写自己的数据有效性例程时，可使用这个类。有关编写自己的DDX和DDV例程的更多信息，请参阅“技术指南26”。有关DDX和DDV概况请参阅联机文档“Visual C++程序员指南”中的“对话数据交换”和“有效性和对话框主题”。
CDataExchange对象提供了发生DDX和DDX所需要的上下文信息。DDX用于填充来自数据成员对话控件的初始值时，标记m_bSaveAndValidate为FALSE。如果DDX用来设置对话控件的当前值到数据成员并且用DDV验证数据值有效性，标志m_bSaveAndValidate为TRUE。如果DDV有效性失败，DDV过程将显示解释输入错误的消息框。然后DDV调用Fail重设置到违规控件的焦点，并产生一个异常终止有效性过程。
#include <afxwin.h>
请参阅：CWnd::DoDataExchange, CWnd::UpdateData

CDataExchange类成员

数据成员
m_bSaveAndValidate | DDX和DDV方向标记
m_pDlgWnd | 发生数据交换的对话框或窗口

操作
PrepareCtrl | 对数据交换或有效性准备指定控件。用于非编辑控件
PrepareEditCtrl | 对数据交换或有效性准备指定编辑控件
Fail | 有效性失败时调用。重设置到以前控件的焦点并产生一个异常


 CDataExchange::Fail

void Fail();
throw(CUserException);

说明：
对话数据有效性（DDV）操作失败时，框架调用这个成员函数。Fail恢复有效性失败的控件的焦点和选择（如果有要恢复的控件）。然后Fail产生CUserException型异常来终止有效性过程。异常引起一个解释错误的消息框显示。DDV有效性失败后，用户可以在违规的控件中再输入数据。通常DDV的实现程序可以在有效性失败时从它们的例程中调用Fail。
有关编写自己的DDX和DDV规则的更多信息，请参阅“技术指南26”。有关DDX和DDV概况请参阅联机文档“Visual C++程序员指南”中的“对话数据交换”和“有效性和对话框主题”。

请参阅：
CDataExchange::PrepareCtrl, CDataExchange::PrepareEditCtrl


 CDataExchange::PrepareCtrl

HWND PrepareCtrl(int nIDC);
throw(CNotSupportedException);

返回值：为DDX或DDV预备的控件HWND。

参数：
nIDC 为DDX或DDV预备的控件ID。

说明：
框架调用这个成员函数，可以为对话数据交换（DDX）和有效性（DDV）准备指定控件。对编辑控件使用PrepareCtrl；对其它所有控件使用这个成员函数。
准备包含在CDataExchange类中保存控件的HWND。在DDX或DDV失败的事件中，框架用这个句柄恢复到以前有焦点控件的焦点。通常DDX或DDV实现程序应该对所有非编辑控件调用PrepareCtrl，用于通过DDX交换数据或通过DDV验证数据有效性。
有关编写自己的DDX和DDV例程的更多信息，请参阅“技术指南26”。
有关DDX和DDV概况，请参阅联机文档“Visual C++程序员指南”中的“对话数据交换”和“有效性和对话框主题”。

请参阅：CDataExchange::Fail


 CDataExchange::PrepareEditCtrl

HWND PrepareEditCtrl(int nIDC);
throw(CNotSupportedException);

返回值：为DDX或DDV预备的编辑控件HWND。

参数：
nIDC 为DDX或DDV预备的控件ID。

说明：
框架调用这个成员函数，可以为对话数据交换（DDX）和有效性（DDV）准备指定编辑控件。对非编辑控件使用PrepareCtrl代替。
准备工作包含两件事。首先PrepareEditCtrl在CDataExchange类中保存控件的HWND。在DDX或DDV失败的事件中，框架用这个句柄恢复到以前有焦点控件的焦点。其次，PrepareEditCtrl在CDataExhange类中设置一个标记，表示被交换或有效性验证的数据所在控件是一个编辑控件。
通常DDX或DDV实现程序应该对所有编辑控件调用PrepareEditCtrl，用于通过DDX交换数据或通过DDV验证数据有效性。
有关编写自己的DDX和DDV例程的更多信息，请参阅“技术指南26”。
有关DDX和DDV概况，请参阅联机文档“Visual C++程序员指南”中的“对话数据交换”和“有效性和对话框主题”。

请参阅：CDataExchange::Fail


 CDataExchange::m_pDlgWnd

说明：
包含用于发生对话数据交换（DDX）或有效性（DDV）的指向CWnd对象的指针。这个对象通常是CDialog对象。通常DDX或DDV实现程序能够用这个指针获取对正在处理的控件的对话窗口的访问。
有关编写自己的DDX和DDV常规的更多信息，请参阅“技术指南26”。
有关DDX和DDV概况，请参阅联机文档“Visual C++程序员指南”中的“对话数据交换”和“有效性和对话框主题”。


 CDataExchange::m_bSaveAndValidate

说明：
这个标记表示对话数据交换（DDX）操作的方向。如果在用户编辑控件之后，使用CDataExchange对象把对话控件的数据移动到对话类数据成员，这个标记非零。如果对象正用于初始化来自对话类数据成员的对话控件，则标记为零。对话数据有效性（DDV）期间标记为非零。
有关编写自己的DDX和DDV例程的更多信息，请参阅“技术指南26”。有关DDX和DDV概况，请参阅联机文档“Visual C++程序员指南”中的“对话数据交换”和“有效性和对话框主题”。


 CDataPathProperty

CObject
└CFile
└COleStreamFile
└CMonikerFile
└CAsyncMonikerFile
└CDataPathProperty

类CDataPathProperty实现可以异步装入的OLE控件特性。异步特性在同步初始之后装入。
类CDataPathProperty由CAsyncMonikerFile派生而来。为在OLE控件中实现异步特性，可从CDataPathProperty派生一个类并覆盖OnDataAvailable。
有关如何在Internet中使用异步标识和ActiveX控件的更多信息，请参阅联机文档“Visual C++程序员指南”中的下列内容：
· | “Internet初步：ActiveX控件”。
· | “Internet初步：异步标识”。

请参阅：CAsyncMonikerFile

CDataPathProperty类成员

构造函数
CDataPathProperty 构造一个CDataPathProperty对象

操作
GetControl | 获取对应于CDataPathProperty对象的异步OLE控件
GetPath | 获取特性路径名
Open | 为关联ActiveX(OLE)控件装入初始异步特性。
ResetData | 调用CAsyncMonikerFile::OnDataAvailable。通告控件特性发生变化的包容器
SetControl | 设置与特性关联的异步ActiveX(OLE)控件
SetPath | 设置特性路径名


 CDataPathProperty::CDataPathProperty

CDataPathProperty(COleControl* pControl);
CDataPathProperty(LPCTSTR lpszPath, COleControl* pControl);

参数
pControl | 指向关联于这个CDataPathProperty对象的OLE控件对象的指针。
lpszPath | 用于创建参考特性实际绝对位置的异步标识的路径，可能是绝对的或相对的。CDataPathProperty使用URL而不是文件名。如果需要文件的CDataPathProperty对象，可在路径前面附加“file://”。

说明：
构造一个CDataPathProperty对象。
由pControl指向的COleControl对象由Open使用并可被派生的对象获取。如果pControl为NULL，Open使用的控件应该用SetControl设置。如果lpszPath为NULL，可以通过Open在路径中传递或者用SetPath设置。

请参阅：
CDataPathProperty::Open, CDataPathProperty::SetControl


 CDataPathProperty::GetControl

COleControl* GetControl();

返回值：
返回与CDataPathProperty对象关联的指向OLE控件的指针。如果无关联控件，则为NULL。

说明：
调用这个成员函数，可以获取与CDataPathProperty对象关联的COleControl对象。

请参阅：CDataPathProperty::SetControl


 CDataPathProperty::GetPath

CString GetPath() const;

返回值：
返回到特性本身的路径名。如果未指定路径，则可以为空。

说明：
调用这个成员函数，可以获取构造CDataPathProperty对象时设置的、Open指定的或以前调用SetPath成员函数时指定的路径。

请参阅：
CDataPathProperty::SetPath, CDataPathProperty::Open, CDataPathProperty::CDataPathProperty


 CDataPathProperty::Open

virtual BOOL Open(COleControl* pControl, CFileException* pError = NULL);
virtual BOOL Open(LPCTSTR lpszPath, COleControl* pControl, CFileException* pError = NULL);
virtual BOOL Open(LPCTSTR lpszPath, CFileException* pError = NULL);
virtual BOOL Open(CFileException* pError = NULL);

返回值：成功则非零，否则为0。

参数：
pControl | 指向对应于这个CDataPathProperty对象的OLE控件对象的指针。
pError | 指向文件异常的指针。在出错事件中将设置为原因。
lpszPath | 用于创建参考特性实际绝对位置的异步标识的路径，可能是绝对的或相对的。CDataPathProperty使用URL而不是文件名。如果需要文件的CDataPathProperty对象，可在路径前面附加file://。

说明：
调用这个成员函数，可以初始对关联控件的异步特性装入。这个函数试图从控件获取IBindHost接口。
调用不带路径的Open之前，必须设置特性的路径值。这可以在构造对象时或调用SetPath成员函数完成。调用不带控件的Open之前，一个ActiveX控件（以前是OLE控件）可以与这个对象关联。这可以在构造对象时或调用SetControl完成。
所有CAsyncMonikerFile::Open重载也对CDataPathProperty有效。

请参阅：
CDataPathProperty::SetControl, CDataPathProperty::CDataPathProperty, CAsyncMonikerFile::Open


 CDataPathProperty::ResetData

virtual void ResetData();

说明：
调用这个成员函数，可以获取CAsyncMonikerFile::OnDataAvailable，通知控件特性变化了的包容器，异步装入的所有信息不再有用，应该重新开始打开。对不同缺省情况，派生类可以覆盖这个函数。

请参阅：
CAsyncMonikerFile::OnDataAvailable, CDataPathProperty::Open


 CDataPathProperty::SetControl

void SetControl(COleControl* pControl);

参数：
pControl 指向关联于这个CDataPathProperty对象的OLE控件对象的指针。

说明：
调用这个成员函数，可以使异步OLE控件与CDataPathProperty对象相关联。

请参阅：
CDataPathProperty::GetControl, CDataPathProperty::SetPath, CDataPathProperty::CDataPathProperty


 CDataPathProperty::SetPath

void SetPath(LPCTSTR lpszPath);

参数：
lpszPath 正在异步装入的特性的路径。CDataPathProperty使用URL而不是文件名。如果需要文件的CDataPathProperty对象，可在路径前面附加file://。

说明：
调用这个成员函数，可以设置特性的路径名。

请参阅：
CDataPathProperty::GetPath, CDataPathProperty::SetControl, CDataPathProperty::CDataPathProperty


 CDateTimeCtrl

CObject
└CCmdTarget
└CWnd
└CDateTimeCtrl

CDateTimeCtrl对象包括日期和时间拾取控件的功能。日期和时间拾取控件（DTP控件）提供了与用户交换日期和时间信息的简单接口。这个接口包括字段、每个显示控件中保存的一部分日期和时间信息。通过改变给定字段中的字符串内容，用户可以改变控件中存放的信息。用户可以用鼠标或键盘在字段之间移动。
通过在创建时对对象应用不同的风格，可以定制日期和时间拾取控件。有关日期和时间拾取控件风格的更多信息，请参阅联机文档“平台SDK”中的“日期和时间拾取控件风格”。可以用格式风格设置DTP控件的显示格式。联机文档“平台SDK”中预设DTP显示格式中描述了这些格式风格。
日期和时间拾取控件还使用通告和回调，联机文档“Visual C++程序员指南”中“使用CDateTimeCtrl”中有所描述。
#include <afxdtctl.h>
请参阅：CMonthCalCtrl

CDateTimeCtrl类成员

构造函数
CDateTimeCtrl | 构造一个CDateTimeCtrl对象
Create | 创建日期和时间控件并把它附加到CDateTimeCtrl控件

属性
GetMonthCalColor | 获取日期和时间拾取控件内月历给定部分的颜色
SetMonthCalColor | 设置日期和时间拾取控件内月历给定部分的颜色
SetFormat | 设置基于给定格式字符串的日期和时间拾取控件的显示
GetMonthCalCtrl | 获取日期和时间拾取的子月历控件
GetMonthCalFont | 获取日期和时间拾取的子月历控件当前使用的字体
SetMonthCalFont | 设置获取日期和时间拾取的子月历控件使用的字体。
SetRange | 为日期和时间拾取控件设置最小和最大允许的系统次数。
GetRange | 为日期和时间拾取控件获取最小和最大允许的系统次数。

操作
SetTime | 设置日期和时间拾取控件中的时间
GetTime | 获取从日期和时间拾取控件当前选取的时间，并把它放在指定的SYSTEMTIME结构


 CDateTimeCtrl::CDateTimeCtrl

CDateTimeCtrl();

说明：
调用这个成员函数，可以构造一个CDateTimeCtrl对象。

请参阅：CDateTimeCtrl::Create


 CDateTimeCtrl::Create

BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

返回值：创建成功，则返回非零值，否则为0。

参数：
dwStyle | 指定时间日期控件风格的合并。有关日期和时间拾取控件风格的更多信息，请参阅联机文档“平台SDK”中的“日期和时间拾取控件风格”。
rect | 到RECT结构的参考，它是日期时间拾取控件的位置和大小。
pParentWnd | 指向日期和时间拾取控件父窗口的CWnd对象的指针。它不能为NULL。
nID | 指定日期和时间拾取控件的控件ID。

说明：
按以下两步创建日期和时间拾取控件：
1. | 调用CDateTimeCtrl构造一个CDateTimeCtrl对象。
2. | 调用这个成员函数，创建Windows日期和时间拾取控件并把它附加到CDateTimeCtrl对象。
调用Create时初始化普通控件。


 CDateTimeCtrl::GetMonthCalColor

COLORREF GetMonthCalColor(int iColor) const;

返回值：
如果成功，返回表示对月历控件指定部分表示颜色设置的COLORREF值；如果不成功，函数返回-1。

参数：
iColor 指定要获取月历颜色区域的int值。有关值列表，请参阅SetMonthCalColor的iColor参数。

说明：
与联机文档“平台SDK”中描述的一样，这个成员函数实现Win32消息DTM_ GETMCCOLOR的功能。

请参阅：CDateTimeCtrl::SetMonthCalColor


 CDateTimeCtrl::GetMonthCalCtrl

CMonthCalCtrl* GetMonthCalCtrl() const;

返回值：
指向CMonthCalCtrl对象的指针，如果不成功或窗口不可见，则为NULL。

说明：
调用这个成员函数，可以获取与日期和时间拾取控件关联的CMonthCalCtrl对象。用户单击下箭头时，日期和时间拾取控件创建一个子月历控件。不再需要CMonthCalCtrl对象时将销毁它，因此应用一定不能依赖于存储的表示日期时间拾取控件的子月历的对象。


 CDateTimeCtrl::GetMonthCalFont

CFont* GetMonthCalFont() const;

返回值：
指向CFont对象的指针，如果不成功则为NULL。

说明：
调用这个成员函数，可以获取日期和时间拾取控件的月历控件当前使用的字体。返回值指向的CFont对象是临时对象，并在下次空闲处理时销毁。

请参阅：CDateTimeCtrl::SetMonthCalFont


 CDateTimeCtrl::GetRange

DWORD GetRange(COleDateTime* pMinRange, COleDateTime*pMaxRange) const;
DWORD GetRange(CTime* pMinRange, CTime* pMaxRange) const;

返回值：包含指示设置范围的标记的DWORD值。

参数：
pMinRange | 指向包含CDateTimeCtrl对象中允许的最早时间的CTime对象或COleDateTime对象的指针。
pMaxRange | 指向包含CDateTimeCtrl对象中允许的最晚时间的CTime对象或COleDateTime对象的指针。

说明：
与联机文档“平台SDK”中描述的一样，这个成员函数实现Win32消息DTM_ GETRANGE的功能。
在MFC实现中可以指定COleDateTime或CTime的用途。

请参阅：CDateTimeCtrl::SetRange


 CDateTimeCtrl::GetTime

BOOL GetTime(COleDateTime& timeDest) const;
DWORD GetTime(CTime& timeDest) const;
DWORD GetTime(LPSYSTEMTIME pTimeDest) const;

返回值：
第一个版本中，如果写COleDateTime对象成功，则返回非零值，否则为0。在第二和第三个版本中，DWORD值等于NMDATETIME CHANGE结构中设置的dwFlag成员。有关的更多信息，请参阅下面的说明。

参数：
timeDest | 第一个版本中是对接收系统时间信息的COleDateTime对象的参考。第二个版本中是对接收系统时间信息的CTime对象的参考。
pTimeDest | 指向接收系统时间信息的SYSTEMTIME结构的指针。不能为NULL。

说明：
与联机文档“平台SDK”中描述的一样，这个成员函数实现Win32消息DTM_GETSYSTEMTIME的功能。
在MFC GetTime实现中，可以使用COleDateTime或CTime类，或者使用SYSTEMTIME结构保存时间信息。
上面第二和第三个版本中的返回值DWORD表示日期和时间拾取控件是否设置为“无日期”状态，这和NMDATETIMECHANGE结构成员dwFlags中表示的一样。如果返回值等于GDT_NONE，则控件设置为“无日期”状态，并使用DTS_SHOWNONE类型。如果返回值等于GDT_VALID，则系统时间成功存储到目标位置中。

请参阅：CDateTimeCtrl::SetTime


 CDateTimeCtrl::SetFormat

BOOL SetFormat(LPCTSTR pstrFormat);

返回值：如果成功，则返回非零值，否则为0。

参数：
pstrFormat 指向定义希望显示的空终止格式字符串的指针。这个参数设置为NULL将把控件重设置为当前风格的缺省格式字符串。

说明：
与联机文档“平台SDK”中描述的一样，这个成员函数实现Win32消息DTM_SETFORMAT的功能。


 CDateTimeCtrl::SetMonthCalColor

COLORREF SetMonthCalColor(int iColor, COLORREF ref);

返回值：
如果成功，返回对月历控制指定部分表示以前颜色设置的COLORREF值。否则返回-1。

参数：
iColor指定要获取月历颜色区域的int值。这个值是下列之一：
值 | 含义
MCSC_BACKGROUND | 设置月之间显示的背景色
MCSC_MONTHBK | 设置一个月内显示的背景色
MCSC_TEXT | 设置一个月内用于显示的文本的颜色
MCSC_TITLEBK | 设置日历标题中显示的背景色
MCSC_TITLETEXT | 设置日历标题内用于显示文本的颜色
MCSC_TRAILINGTEXT | 设置用于显示天文本的颜色。开始和结果天是显示在当前日历上的前后月份的天数

ref 表示要对月历指定区域设置的颜色的COLORREF值。

说明：
与联机文档“平台SDK”中描述的一样，这个成员函数可以实现Win32消息DTM_ SETMCCOLOR的功能。

请参阅：CDateTimeCtrl::GetMonthCalColor


 CDateTimeCtrl::SetMonthCalFont

void SetMonthCalFont(HFONT hFont, BOOL bRedraw = TRUE);

参数：
hFont | 要设置的字体的句柄。
bRedraw | 指定控件是否立即在设置字体时重新绘制。这个参数设置为TRUE引起控件重画自身。

说明：
与联机文档“平台SDK”中描述的一样，这个成员函数实现Win32消息DTM_SETMCFONT的功能。

示例：
// The following code example creates a font
// (Arial, 10 pixels high) and if successful,
// stores the result in m_pMonthFont. SetMonthCalFont
// is then called passing in the new font, causing
// the month calendar control to display all
// text and dates with an Arial font.

BOOL CYourDialog::OnInitDialog()
{
CDialog::OnInitDialog();

// ... other code here ...

//initializing the necessary members of the LOGFONT
// structure

m_pMonthFont = new CFont;
LOGFONT lf;
memset(&lf, 0, sizeof(lf));
lf.lfHeight = 10;
strcpy(lf.lfFaceName, "Arial");

if (m_pMonthFont->CreateFontIndirect(&lf))
{
// if successful, grab the month calendar control from
// our dialog and set the font

CMonthCalCtrl* pCtrl = (CMonthCalCtrl*) GetDlgItem(IDC_DATETIME1);
ASSERT(pCtrl != NULL);
pCtrl->SetMonthCalFont(m_pMonthFont);
}
else
{
// if not successful, clean up the font pointer and
// set equal to NULL

delete m_pMonthFont;
m_pMonthFont = NULL;
}

// ... other code here ...
}

CYourDialog::CYourDialog(CWnd* pParent /*=NULL*/) : CDialog(CYourDialog::IDD, pParent)
{
// ... other code here ...
m_pMonthFont = NULL;
// ... other code here ...
}

CYourDialog::~CYourDialog()
{
// ... other code here ...
delete m_pMonthFont;
// ... other code here ...
}

注意：
如果使用这段代码，可以产生CFont类型的m_pMonthFont，是一个CDialog派生类的成员。

请参阅：CDateTimeCtrl::GetMonthCalFont


 CDateTimeCtrl::SetRange

BOOL SetRange(const COleDateTime* pMinRange, const COleDateTime* pMaxRange);
BOOL SetRange(const CTime* pMinRange, const CTime* pMaxRange);

返回值：如果成功，则返回非零值，否则为0。

参数：
pMinRange | 指向包含CDateTimeCtrl对象中允许的最早时间的CTime对象或COleDateTime对象的指针。
pMaxRange | 指向包含CDateTimeCtrl对象中允许的最晚时间的CTime对象或COleDateTime对象的指针。

说明：
与联机文档“平台SDK”中描述的一样，这个成员函数实现Win32消息DTM_SETRANGE的功能。
MFC实现中可以指定COleDateTime或CTime用途。如果COleDateTime对象有NULL状态，将移去这个范围。如果CTime指针或COleDateTime指针为NULL，将移去这个范围。

请参阅：CDateTimeCtrl::GetRange


 CDateTimeCtrl::SetTime

BOOL SetTime(const COleDateTime& timeNew);
BOOL SetTime(const Ctime* pTimeNew);
BOOL SetTime(LPSYSTEMTIME pTimeNew = NULL);

返回值：如果成功，则返回非零值，否则为0。

参数：
timeNew | 对包含要设置控件时间的COleDateTime对象参考。
pTimeNew | 在上面第二个版本中是指向包含要设置控件时间的CTime对象的指针。在上面第三个版本中是指向包含要设置控件时间的SYSTEMTIME结构。

说明：
与联机文档“平台SDK”中描述的一样，这个成员函数实现Win32消息DTM_SETSYSTEMTIME的功能。
在MFC SetTime实现中，可以使用COleDateTime或CTime类，或者使用SYSTEMTIME结构来设置时间信息。

请参阅：CDateTimeCtrl::GetTime


 CDBException

CObject
└CException
└CDBException

CDBException对象表示数据库类引起的异常条件。这个类包括两个公用数据成员，可以用来确定异常原因或者显示描述异常的消息。CDBException对象由数据库类成员函数构造和产生。
注意：
这个类是MFC开放数据库连接（ODBC）类之一。如果用较新的数据访问对象（DAO）类代替，则使用CdaoException代替。所有DAO类名字都有“CDao”前缀。有关的更多信息，请参阅联机文档“Visual C++程序员指南”中的“数据库主题（通用）”与“DAO和MFC”。
异常是包括程序控制外部条件在内的异常执行的情况，例如数据源或网络I/O错误。执行程序的正常过程中预计会看到的错误通常不认为是异常。
可以访问CATCH表达式范围内的这些对象。还可以用AfxThrowDBException全局函数从自己的代码产生CDBException对象。有关通常处理异常或者CDBException对象，请参阅联机文档“Visual C++程序员指南”中的“异常”和“异常：数据库异常”。
#include <afxdb.h>

请参阅：
CDatabase, CRecordset, CFieldExchange, AfxThrowDBException, CRecordset::Update, CRecordset::Delete, CException

CDBException类成员

数据成员
m_nRetCode | 包含RETCODE型的开放数据库连接（ODBC）返回代码
m_strError | 包含描述字母数字项中错误的字符串
m_strStateNativeOrigin | 包含描述有关ODBC返回错误代码的错误字符串


 CDBException::m_nRetCode

说明：
包含由ODBC应用接口（API）函数返回的RETCODE型ODBC错误代码。这个类型包括由ODBC定义的SQL前缀代码和由数据库类定义的AFX_SQL前缀代码。对于CDBException，这个成员可能包含下列值之一：
· | AFX_SQL_ERROR_API_CONFORMANCE | 对CDatabase::OpenEx或CDatabase::Open调用的驱动程序不符合要求的ODBC API一致级别1（SQL_OAC_ LEVEL1）。
· | AFX_SQL_ERROR_CONNECT_FAIL | 到数据源的连接失败。向记录集构造程序传递一个NULL CDatabase指针，接下来试图创建基于GetDefaultConnect的连接失败。
· | AFX_SQL_ERROR_DATA_TRUNCATED | 需要的数据比提供使用的存储空间要多。有关对CString或CByteArray数据类型增加提供了数据存储的信息，请参阅RFX_Text的mMaxLength参数和“宏和全局量”下的RFX_Binary。
· | AFX_SQL_ERROR_DYNASET_NOT_SUPPORTED | 询问动态集的CRecordset::Open调用失败。驱动程序不支持动态集。
· | AFX_SQL_ERROR_EMPTY_COLUMN_LIST | 试图打开一个表（或者所给内容不能标识为过程调用或SELECT语句），但DoFieldExchange覆盖中记录字段交换（RFX）函数调用没有标识列。
· | AFX_SQL_ERROR_FIELD_SCHEMA_MISMATCH | DoFieldExchange覆盖中的RFX函数类型与记录集中的列数据类型不匹配。
· | AFX_SQL_ERROR_ILLEGAL_MODE | 在调用CRecordset::Update之前没调用CRecordset::AddNew或CRecordset::Edit。
· | AFX_SQL_ERROR_LOCK_MODE_NOT_SUPPORTED | 对更新封锁记录的要求由于ODBC驱动程序不支持封锁而失败。
· | AFX_SQL_ERROR_MULTIPLE_ROWS_AFFECTED | 对没有唯一码的表调用CRecordset::Update或Delete，并改变了多条记录。
· | AFX_SQL_ERROR_NO_CURRENT_RECORD | 试图编辑或删除一条以前已删除的记录。删除之后必须滚动到一条新的当前记录。
· | AFX_SQL_ERROR_POSITIONED_UPDATES | 对动态集的要求由于ODBC驱动程序不支持定位更新而失败。
· | AFX_SQL_ERROR_NO_ROWS_AFFECTED | 调用了CRecordset::Update或Delete，但操作开始时找不到记录。
· | AFX_SQL_ERROR_ODBC_LOAD_FAILED | 试图装入ODBC.DLL失败；Windows找不到或不能装入这个DLL。这个错误是致命的。
· | AFX_SQL_ERROR_ODBC_V2_REQUIRED | 对动态集的请求由于需要2级适配ODBC驱动程序而失败。
· | AFX_SQL_ERROR_RECORDSET_FORWARD_ONLY | 试图滚动失败，因为数据源不支持向后滚动。
· | AFX_SQL_ERROR_SNAPSHOT_NOT_SUPPORTED | 请求快照的CRecordset::Open调用失败。驱动程序不支持快照（只有在ODBC游标库ODBCCURS.DLL没有时出现这个错误）。
· | AFX_SQL_ERROR_SQL_CONFORMANCE | 用于CRecordset::OpenEx或CRecordset::Open调用的驱动程序不符合需要的“最小”ODBC SQL一致级别（SQL_OSC_MININUM）。
· | AFX_SQL_ERROR_SQL_NO_TOTAL | ODBC驱动程序不能指定Clong Binary数据值总大小。由于全局内存块不能预分配，操作很可能失败。
· | AFX_SQL_ERROR_RECORDSET_READONLY | 试图更新只读记录集或者数据源是只读的。对记录集或它对应的CDatabase对象不能执行任何更新操作。
· | SQL_ERROR | 函数失败。由::SQLError返回的错误消息存放在m_strError数据成员中。
· | SQL_INVALID_HANDLE | 由于无效环境句柄、连接句柄或语句句柄造成函数失败。这表示有程序错误。::SQLError没有有效的附加信息。
SQL前缀代码由ODBC定义。AFX前缀代码在MFC\INCLUDE中的AFXDB.H内定义。

请参阅：CDatabase, CLongBinary, CRecordset


 CDBException::m_strError

说明：
包含导致异常的错误描述字符串。字符串以字母数字术语描述错误。有关详细信息和实例，请参阅m_strStateNativeOrigin。

请参阅：CDBException::m_strStateNativeOrigin


 CDBException::m_strStateNativeOrigin

说明：
包含导致异常的错误描述字符串。字符串为“状态：%s，主要：%ld，源：%s”形式，其中格式代码按顺序被下列描述值代替：
· | SQLSTATE，是::SQLError函数的szSqlState参数中返回的包含五个字符错误代码的空终止字符串。SQLSTATE的值在联机文档“ODBCSDK程序员参考”的附录A“ODBC错误代码”中列出。例如：S0022。
· | 主要错误代码，指定数据源，由::SQLError函数的pfNativeError参数返回。例如：207。
· | ::SQLError函数的szErrorMsg参数中返回的错误消息文本。这个消息包含几个括号名。错误由源向用户传递时，每个ODBC部件（数据源、驱动程序、驱动程序管理器）附加上自己的名字。这条信息有助于指出错误源。例如：[Microsoft][ODBC SQL Server Driver][SQL Server]。
框架解释错误字符串，并把它的部件放到m_strStateNativeOrigin；如果m_strStateNativeOrigin包含的信息是多于一个错误的，这些错误以换新行分隔。框架把字母数字错误文本放到m_strError中。
有关用来构成这个字符的代码的额外信息，请参阅联机文档“ODBC SDK程序员指南”中的::SQLError函数。

示例：
ODBC：“状态：S0022，主要：207，源：[Microsoft][ODBC SQL ServerDriver][SQL Server]无效列名‘ColName’。”
在m_strStateNativeOrigin中：“状态：S0022，主要：207，源：[Microsoft][ODBC SQL Server Driver][SQL Server]。
在m_strError中：“无效列名‘ColName’。”

请参阅：CDBException::m_strError


 CDBVariant

CDBVariant没有基类。
CDBVariant对象表示用于MFC ODBC类的可变数据类型。CDBVariant与COleVariant类似；不过CDBVariant不使用OLE。CDBVariant允许存储值而不必关心值的数据类型。CDBVariant跟踪保存在一个联合中的当前值数据类型。
类CRecordset在三个成员函数中利用CDBVariant对象：GetFieldValue，GetBookmark和SetBookmark。例如GetFieldValue允许动态取一个列中的数据。因为运行时可能不知道列的数据类型，GetFieldValue使用一个CDBVariant对象来存储列的数据。
#include <afxdb.h>

请参阅：
CRecordset, CRecordset::GetFieldValue, CRecordset::GetBookmark, CRecordset::SetBookmark

CDBVariant类成员

数据成员
m_dwType | 包含当前存储值的数据类型。DWORD型
m_boolVal | 包含一个BOOL型值
m_chVal | 包含一个unsigned char型值
m_iVal | 包含一个short型值
m_lVal | 包含一个long型值
m_fltVal | 包含一个float型值
m_dblVal | 包含一个double型值
m_pdate | 包含指向TIMESTAMP_STRUCT型对象的指针
m_pstring | 包含一个CString型值
m_pbinary | 包含一个CLongBinary型值

构造函数
CDBVariant 构造一个CDBVariant对象

操作
Clear 清除CDBVariant对象


 CDBVariant::CDBVariant

CDBVariant();

说明：
创建一个NULL CDBVariant对象。对m_dwType数据成员设置为DBVT_NULL。

请参阅：CDBVariant::m_dwType


 CDBVariant::Clear

void Clear();

说明：
调用这个成员函数，可以清除CDBVariant对象。如果m_dwType数据成员的值是DBVT_DATE，DBVT_STRING或DBVT_BINARY，Clear释放与联合指针成员对应的内存。Clear把m_dwType设置为DBVT_NULL。
CDBVariant析构程序调用Clear。

请参阅：CDBVariant::m_dwType


 CDBVariant::m_boolVal

说明：
存储一个BOOL型值。m_boolVal数据成员属于一个联合。访问m_boolVal之前首先检查CDBVariant::m_dwType的值。如果m_dwType设置为DBVT_BOOL，则m_boolVar包含一个有效值；否则访问m_boolVal将产生不可靠结果。

请参阅：CDBVariant::m_dwType


 CDBVariant::m_chVal

说明：
存储一个unsigned char型值。m_chVal数据成员属于一个联合。访问m_chVal之前首先检查CDBVariant::m_dwType的值。如果m_dwType设置为DBVT_ UCHAR，则m_chVal包含一个有效值；否则访问m_chVal将产生不可靠结果。


 CDBVariant::m_dblVal

说明：
存储一个double型值。m_dblVal数据成员属于一个联合。访问m_dblVal之前首先检查CDBVariant::m_dwType的值。如果m_dwType设置为DBVT_DOUBLE，则m_dblVal包含一个有效值；否则访问m_dblVal将产生不可靠结果。

请参阅：CDBVariant::m_dwType


 CDBVariant::m_dwType

说明：
这个数据成员包含用于当前在CDBVariant对象的联合数据成员中存储的值的数据类型。访问这个联合之前必须检查m_dwType的值，以确定要访问哪个联合数据成员。下表列出m_dwType的可能值和相应的联合数据成员。
m_dwType | 联合数据成员
DBVT_NULL | 没有联合成员对访问有效
DBVT_BOOL | m_boolVal
DBVT_UCHAR | m_chVal
DBVT_SHORT | m_iVal
DBVT_LONG | m_lVal
DBVT_SINGLE | m_fltVal
DBVT_DOUBLE | m_dblVal
DBVT_DATE | m_pdate
DBVT_STRING | m_pstring
DBVT_BINARY | m_pbinary


 CDBVariant::m_fltVal

说明：
存储一个float型值。m_fltVal数据成员属于一个联合。访问m_fltVal之前首先检查CDBVariant::m_dwType的值。如果m_dwType设置为DBVT_DOUBLE，则m_fltVal包含一个有效值；否则访问m_fltVal将产生不可靠结果。

请参阅：CDBVariant::m_dwType


 CDBVariant::m_iVal

说明：
存储一个short型值。m_iVal数据成员属于一个联合。访问m_iVal之前首先检查CDBVariant::m_dwType的值。如果m_dwType设置为DBVT_SHORT，则m_iVal包含一个有效值；否则访问m_iVal将产生不可靠结果。

请参阅：CDBVariant::m_dwType


 CDBVariant::m_lVal

说明：
存储一个long型值。m_lVal数据成员属于一个联合。访问m_lVal之前首先检查CDBVariant::m_dwType的值。如果m_dwType设置为DBVT_LONG，则m_lVal包含一个有效值；否则访问m_lVal将产生不可靠结果。

请参阅：CDBVariant::m_dwType


 CDBVariant::m_pbinary

说明：
存储指向CLongBinary型对象的一个指针。m_pbinary数据成员属于一个联合。访问m_pbinary之前首先检查CDBVariant::m_dwType的值。如果m_dwType设置为DBVT_BINARY，则m_pbinary包含一个有效值；否则访问m_pbinary将产生不可靠结果。

请参阅：CDBVariant::m_dwType


 CDBVariant::m_pdate

说明：
存储指向TIMESTAMP_STRUCT型对象的一个指针。m_pdate数据成员属于一个联合。访问m_pdate之前首先检查CDBVariant::m_dwType的值。如果m_dwType设置为DBVT_DATE，则m_pdate包含一个有效值；否则访问m_pdate将产生不可靠结果。
有关TIMESTAMP_STRUCT数据类型更多信息，参见联机“ODBC SDK程序员参考手册”附录D中的“C Data Type”。

请参阅：CDBVariant::m_dwType


 CDBVariant::m_pstring

说明：
存储指向CString型对象的一个指针。m_pstring数据成员属于一个联合。访问m_pstring之前首先检查CDBVariant::m_dwType的值。如果m_dwType设置为DBVT_STRING，则m_pstring包含一个有效值；否则访问m_pstring将产生不可靠结果。

请参阅：CDBVariant::m_dwType


 CDC

CObject
└CDC

CDC类定义的是设备上下文对象的类。
CDC对象提供处理显示器或打印机等设备上下文的成员函数，以及处理与窗口客户区对应的显示上下文的成员。
通过CDC对象的成员函数进行所有的绘图。
类对设备上下文操作提供了成员函数，处理绘图工具。安全型图形设备接口（GDI）对象收集，以及处理颜色和调色板。
它还为获取和设置绘图属性、映射，处理视点、窗口扩展、转换坐标，处理区域、剪贴、绘制直线及绘制简单椭圆和多边形等形状提供了成员函数。
另外还为绘制文本、处理字体，使用打印机跳转，滚动和播放元文件提供成员函数。
使用CDC对象时要构造它，然后调用与它平等的、使用设备上下文的Windows函数的成员函数。

注意：
Windows 95下所有屏幕坐标限制在16位以内。因此向CDC成员函数传递的int必须在-32768至32767之间。

为了特定用途，Microsoft基本类库提供了几个CDC派生类。
CPaintDC | 包括BeginPaint和EndPaint调用。
CClientDC | 管理窗口用户区对应的显示上下文。
CWindowDC | 管理与整个窗口对应的显示上下文，包括它的结构和控件。
CMetaFileDC | 与带元文件的设备上下文对应。

CDC包含m_hDC和m_hAttribDC两个设备上下文，它们在CDC对象创建时参考同一个设备。
CDC指导所有对m_hDC的输出GDI调用以及对m_hAttribDC的大部分属性GDI调用（GetTextColor是属性调用的例子，而SetTextColor是一个输出调用）。
例如框架使用这两个设备上下文实现CMetaFileDC对象，在从物理设备读取属性期间向元文件发送输出。
打印预览以相同风格在框架中实现。还可以以相似方法在特殊应用代码中使用这两个设备上下文。
可能多次需要来自m_hDC和m_hAttribDC设备上下文的文本度量信息。
以下几对函数提供了这项功能：
使用m_hAttribDC | 使用m_hDC
GetTextExtent | GetOutputTextExtent
GetTabbedTextExtent | GetOutputTabbedTextExtent
GetTextMetrics | GetOutputTextMetrics
GetCharWidth | GetOutputCharWidth

有关CDC的更多信息，请参阅联机文档“Visual C++程序员指南”中的“设备上下文”。
#include <afxwin.h>
请参阅：CPaintDC, CClientDC, CWindowDC, CMetaFileDC

CDC类成员

数据成员
m_hDC | CDC对象使用的输出设备上下文
m_hAttribDC | CDC对象使用的输出属性上下文

构造函数
CDC 构造一个CDC对象

初始化
CreateDC | 为指定设备创建设备上下文
CreateIC | 为指定设备创建信息上下文。这提供了一种不创建设备上下文即获取有关设备信息的快速方式
CreateCompatibleDC | 创建内存设备上下文，与另一个设备上下文匹配。可以用它在内存中准备图像
DeleteDC | 删除CDC对象对应的Windows设备上下文
FromHandle | 给定设备上下文句柄时，返回指向CDC对象的指针。如果CDC对象未附加到句柄，则创建并附加一个临时CDC对象
DeleteTempMap | 由CWinApp空闲时间句柄调用，删除FromHandle创建的临时CDC对象。同时分离设备上下文
Attach | 把Windows设备上下文附加到这个CDC对象
Detach | 从CDC对象分离Windows设备上下文.
SetAttribDC | 设置属性设备上下文m_hAttribDC
SetOutputDC | 设置输出设备上下文m_hDC
ReleaseAttribDC | 释放属性设备上下文m_hAttribDC
ReleaseOutputDC | 释放输出设备上下文m_hDC
GetCurrentBitmap | 返回指向当前选择的CBitmap对象的指针
GetCurrentBrush | 返回指向当前选择的CBrush对象的指针
GetCurrentFont | 返回指向当前选择的CFont对象的指针
GetCurrentPalette | 返回指向当前选择的CPalette对象的指针
GetCurrentPen | 返回指向当前选择的CPen对象的指针
GetWindow | 返回显示设备上下文对应的窗口

设备上下文函数
GetSafeHdc | 返回输出设备上下文m_hDC
SaveDC | 保存设备上下文当前状态
RestoreDC | 恢复SaveDC保存的设备上下文以前状态
ResetDC | 更新m_hAttribDC设备上下文
GetDeviceCaps | 获取有关给定显示设备功能的指定类型指定设备信息
IsPrinting | 确定正在使用的设备上下文是否用于打印

安全型选择帮助器
GetBrushOrg | 获取当前画刷的起点
SetBrushOrg | 指定选入设备上下文的下一个画刷的起点
EnumObjects | 枚举设备上下文中有效的笔和画刷

颜色和颜色调色板函数
SelectObject | 选择笔等GDI绘图对象
SelectStockObject | 选择Windows提供的预定义的一个笔、画刷或字体

绘图工具函数
GetNearestColor | 获取与给定设备能显示的指定逻辑颜色最接近的逻辑色
SelectPalette | 选择逻辑调色板
RealizePalette | 把当前逻辑调色板中的调色板入口映射到系统调色板
UpdateColors | 通过客户区当前颜色在像素基础上与系统调色板的匹配，更新设备上下文的客户区
GetHalftoneBrush | 获取半色调画刷

绘图属性函数
GetBkColor | 获取当前背景色
SetBkColor | 设置当前背景色
GetBkMode | 获取背景模式
SetBkMode | 设置背景模式
GetPolyFillMode | 获取当前多边形填充模式
SetPolyFillMode | 设置多边形填充模式
GetROP2 | 获取当前绘图模式
SetROP2 | 设置当前绘图模式
GetStretchBltMode | 获取当前位图拉伸模式
SetStretchBltMode | 设置位图拉伸模式
GetTextColor | 获取当前文本颜色
SetTextColor | 设置文本颜色
GetColorAdjustment | 获取用于设备上下文的颜色调整值
SetColorAdjustment | 使用指定值设置设备上下文的颜色调整值

映射函数
GetMapMode | 获取当前映射模式
SetMapMode | 设置当前映射模式
GetViewportOrg | 获取视区起点的X和Y坐标
SetViewportOrg | 设置视区起点
OffsetViewportOrg | 相对于当前视区起点坐标修改视区起点
GetViewportExt | 获取视区X和Y范围
SetViewportExt | 设置视区X和Y范围
ScaleViewportExt | 相对于当前值修改视区范围
GetWindowOrg | 获取参应窗口起点的X和Y坐标
SetWindowOrg | 设置设备上下文的窗口起点
OffsetWindowOrg | 相对于当前窗口起点的坐标修改窗口起点
GetWindowExt | 获取对应窗口的X和Y坐标
SetWindowExt | 设置对应窗口的X和Y坐标
ScaleWindowExt | 相对于当前值修改窗口范围

坐标函数
DPtoHIMETRIC | 设备单位转换为HIMETRIC单位
LPtoHIMETRIC | 逻辑单位转换为HIMETRIC单位
DPtoLP | 设备单位转换为逻辑单位
LPtoDP | 逻辑单位转换为设备单位
HIMETRICtoDPHIMETRIC | 单位转换为设备单位
HIMETRICtoLPHIMETRIC | 单位转换为逻辑单位

区域函数
FillRgn | 用指定画刷填充指定区域
FrameRgn | 用画刷在指定区域周围绘制边线
InvertRgn | 反转区域中的颜色
PaintRgn | 用选取的画刷填充区域

剪切函数
SetBoundsRect | 控制指定设备上下文绑定的矩形信息的累计
GetBoundsRect | 返回到设备上下文当前累计的绑定矩形
GetClipBox | 获取当前剪切边界周围最紧绑定矩形的维数
SelectClipRgn | 使用指定模式合并给定区域和当前剪切区域
ExcludeClipRect | 创建包含现有剪切区域减掉指定矩形的一个新剪切区域
ExcludeUpdateRgn | 通过从剪切区域排除窗口中的更新区域，防止在窗口的无效区域中绘图
IntersectClipRect | 通过构成当前区域和矩形的交集创建一个新的剪切区域
OffsetClipRgn | 移动给定设备的剪切区域
PtVisible | 确定给定点是否在剪切区域内
RectVisible | 确定给定矩形的任何部分是否在剪切区域内

线输出函数
GetCurrentPosition | 获取笔的当前位置（以逻辑坐标表示）
MoveTo | 移动当前位置
LineTo | 从当前位置到一点画直线，但不包括那个点
Arc | 画一段椭圆弧
ArcTo | 画一段椭圆弧。除了更新当前位置以外，这个函数与Arc类似
AngleArc | 画一条线段和圆弧，把当前位置移到圆弧终点
GetArcDirection | 对设备上下文返回当前圆弧方向
SetArcDirection | 设备圆弧和矩形函数要用到的绘图方向
PolyDraw | 画一组线段和Bezier样条。这个函数更新当前位置Polyline画一组与指定点连接的线段
PolyPolyline | 画多组相连线段。这个函数不使用也不更新当前位置
PolylineTo | 画一条或多条直线，并把当前位置移到最后一条直线的终点
PolyBezier | 画一条或多条Bezier样条。不使用也不更新当前位置
PolyBezierTo | 画一条或多条Bezier样条，并把当前位置移到最后一条Bezier样条的终点

简单绘图函数
FillRect | 用指定画刷填充给定矩形
FrameRect | 在矩形周围绘制边界
InvertRect | 反转矩形内容
DrawIcon | 绘制图标
DrawDragRect | 拖拽矩形时擦除并重绘它
FillSolidRect | 用实颜色填充矩形
Draw3Drect | 绘制三维矩形
DrawEdge | 绘制矩形边
DrawFrameControl | 绘制帧控件
DrawState | 显示图像并应用可视化效果来表示一个状态

椭圆和多边形函数
Chord | 绘制椭圆弧（椭圆和一条线段相交围成的闭合图形）
DrawFocusRect | 绘制用于表示焦点的风格的矩形
Ellipse | 绘制椭圆
Pie | 绘制饼形图
Polygon | 绘制多边形，包含由线段连接的一个或多个点（顶点）
PolyPolygon | 创建使用当前多边形填充模式的两个或多个多边形，多边形可以相互分开或叠加
Polyline | 绘制多边形，包含连接指定点的一组线段
Rectangle | 使用当前笔绘制矩形，用当前画刷填充
RoundRect | 使用当前笔绘制圆角矩形，用当前画刷填充

位图函数
PatBlt | 创建位特征
BitBlt | 从指定设备上下文拷贝位图
StretchBlt | 把位图由源矩形和设备移动到目标矩形，必要时拉伸或压缩位图以适合目标矩形的维数
GetPixel | 获取指定点像素的RGB颜色值
SetPixel | 设置指定点像素为最接近指定色的近似值
SetPixelV | 设置指定点坐标为最接近指定色的近似值。SetPixelV比SetPixel快，原因是它不用返回实际绘制点的颜色值
FloodFill | 用当前画刷填充区域
ExtFloodFill | 用当前画刷填充区域。比FloodFill成员函数提供更多灵活性
MaskBlt | 使用给定屏蔽和光栅操作对源和目标位图合并颜色数据
PlgBlt | 从源设备上下文的指定矩形到给定设备上下文中指定平行多边形，执行颜色数据位的位块传递

文本函数
TextOut | 用当前选取字体在指定位置写字符串
ExtTextOut | 用当前选取字体在矩形区域写字符串
TabbedTextOut | 在指定位置写字符串，制表符扩展为制表符停止位置数组中指定值
DrawText | 在指定矩形内绘制格式化文本
GetTextExtent | 使用当前字体在属性设备上下文上计算文本行的宽度和高度，确定维数
GetOutputTextExtent | 使用当前字体在输出设备上下文上计算文本行的宽度和高度，确定维数
GetTabbedTextExtent | 使用当前字体在属性设备上下文上计算字符串的宽度和高度
GetOutputTabbedTextExtent | 使用当前字体在输出设备上下文上计算字符串的宽度和高度
GrayString | 在给定位置绘制暗（灰色）文本
GetTextAlign | 获取文本对齐标记
SetTextAlign | 设置文本对齐标记
GetTextFace | 以空终止字符串形式把当前字体字样名拷贝到缓冲区
GetTextMetrics | 从属性设备上下文为当前字体获取度量
GetOutputTextMetrics | 从输出设备上下文为当前字体获取度量
SetTextJustification | 把空格添加到字符串的中断字符
GetTextCharacterExtra | 对字符间空格数量获取当前设置
SetTextCharacterExtra | 设置字符间空格数量

字体函数
GetFontData | 从比例字体文件获取字体度量信息。获取的信息通过指定字体文件与返回信息长度的偏移量标识
GetKerningPairs | 获取指定设备上下文中当前选取的字体字符实对
GetOutlineTextMetrics | 获取用于TrueType字体的字体度量信息
GetGlyphOutline | 获取用于当前字体中外线字符串的外线曲线或位图
GetCharABCWidths | 从当前字体获取给定范围相继字符以逻辑单位计数的宽度
GetCharWidth | 从当前字体获取给定范围相继字符的分数宽度
GetOutputCharWidth | 从使用输出设备上下文的当前字体获取相继字符组中各个字符的宽度
SetMapperFlags | 改变字体映射表在从逻辑字体到物理字符映射时使用的算法
GetAspectRatioFilter | 获取当前长宽比过滤器的设置

打印机跳离函数
QueryAbort | 对打印应用调用AbortPro回滚函数，询问打印是否应终止
Escape | 允许应用访问不能通过GDI直接使用的特殊设备的功能。同时允许访问Windows跳离函数。应用调用的Escape调用经翻译传送到设备驱动程序
DrawEscape | 访问通过图形设备接口（GDI）不能直接使用的视频显示器的绘图功能
StartDoc | 通告设备驱动程序开始一项新打印作业
StartPage | 通告设备驱动程序开始新页
EndPage | 通告设备驱动程序页结束
SetAbortProc | 如果打印作业必须终止，设置Windows调用的由程序员提供的回滚函数
AbortDoc | 终止当前打印任务，擦除自上次调用StartDoc成员函数以来应用写入设备的任何内容
EndDoc | 结束由StartDoc成员函数启动的打印作业

滚动函数
ScrollDC 水平和垂直滚动位矩形

元文件函数
PlayMetaFile | 在给定设备上播放指定元文件类型。增强版本的PlayMetaFile显示以增强格式元文件保存的图片。元文件可以播放任意次数
AddMetaFileComment | 从缓冲区把注释拷贝到指定增强格式元文件

路径函数
AbortPath | 关闭并拒绝设备上下文中任何路径
BeginPath | 打开设备上下文中一个路径括号
CloseFigure | 关闭路径中一个打开的图表
EndPath | 关闭一个路径括号，并把括号定义的路径选择到设备上下文
FillPath | 关闭当前路径中任何打开的图表，并用当前画刷和多边形填充模式填充路径内部
FlattenPath | 变形选取到当前设备上下文路径中的任何曲线，把曲线变成一系列直线
GetMiterLimit | 返回用于设备上下文的限制
GetPath | 获取定义直线端点和从选择到设备上下文路径中找到的曲线控制点的坐标
SelectClipPath | 对设备上下文选择当前路径作为剪切区域，通过使用指定模式合并新区域和任何现有剪切区域
SetMiterLimit | 设备用于设备上下文的连接长度限制
StrokeAndFillPath | 关闭路径中任何打开的图表，使用当前笔点路径外线，使用当前画刷填充它内部
StrokePath | 使用当前笔描绘指定路径
WidenPath | 如果路径使用过了当前选取到设备上下文中的笔点，重新定义当前路径为要画的区域


 CDC::AbortDoc

int AbortDoc();

返回值：
如果成功，则大于或等于零；如果出现错误，则为负值。
下表列出普通错误值及其含义：
SP_ERROR | 一般错误
SP_OUTOFDISK | 当前缓冲池没有足够的磁盘空间，并且没有更多的空间可用。
SP_OUTOFMEMORY | 没有足够的内存用作缓冲池。
SP_USERABORT | 用户通过打印管理器终止作业。

说明：
终止当前打印任务，擦掉自上次调用StartDoc成员函数以来应用写入设备的任何内容。
这个成员函数代替ABORTDOC打印机跳离。
AbortDoc应该用于终止以下：
· | 没有用SetAbortDoc指定失败功能的打印操作。
· | 未到达首次NEWFRAME或NEXTBAND跳离调用的打印操作。
如果应用遇到打印错误或取消打印操作，它必须不试图使用CDC类的EndDoc或AbortDoc成员函数终止操作。在返回错误值之前，GDI自动终止操作。
如果应用显示对话框，允许用户取消打印操作，它必须在销毁这个对话框之前调用AbortDoc。如果使用打印管理器启动打印任务，调用AbortDoc会擦除全部缓冲池作业──打印机接收不到内容。如果使用打印管理器启动打印任务，则在AbortDoc调用之前数据可能已经送到打印机。这时打印驱动程序必须重设打印机（可能时）并关闭打印作业。

请参阅：CDC::StartDoc, CDC::EndDoc, CDC::SetAbortProc


 CDC::AbortPath

BOOL AbortPath();

返回值：函数成功，返回非零值，否则为0。

说明：
关闭并拒绝设备上下文中任何路径。如果设备上下文中有一个打开的路径，则关闭路径并拒绝路径。如果在上下文中有关闭的路径，则拒绝此路径。

请参阅：CDC::BeginPath, CDC::EndPath


 CDC::AddMetaFileComment

BOOL AddMetaFileComment(UINT nDataSize, const BYTE* pCommentData);

返回值：函数成功，返回非零值，否则为0。

参数：
nDataSize | 以字节计的注释缓冲区长度。
PCommentData | 指向包含注释的缓冲区。

说明：
把注释从缓冲区拷贝到指定增强格式的元文件。注释可以包含任何私有信息揪例如图片源和创建日期。注释应该以应用符号开头，后面是数据。注释不应含有特殊位置的数据。特殊位置的数据指定记录位置，由于元文件可能嵌入另一个元文件中，所以不应包括在内。这个函数只能用于增强元文件。

请参阅：CMetaFileDC::CreateEnhanced, ::GdiComment


 CDC::AngleArc

BOOL AngleArc(int x, int y, int nRadius, float fSartAngle, float fSweepAngle);

返回值：函数成功，返回非零值，否则为0。

参数：
x | 指定圆心逻辑X坐标。
y | 指定圆心逻辑Y坐标。
nRadius | 以逻辑单位指定圆半径。这个值必须为正数。
fStartAngle | 以弧度计相对于X轴的开始角度。
fSweepAngle | 以弧度计相对于开始角度的扫描角度。

说明：
画线段和弧。线段从当前点到圆弧。圆弧是沿给定半径和圆心的圆周。圆弧长度由给定起始和扫描角度定义。
AngleArc把当前位置移到圆弧末端。根据当前变换和映射模式，用这个函数画的圆弧看上去是椭圆形的。通过构造带有指定圆心周围的指定半径的假想圆来画这个弧。弧起点由测量圆圈X轴逆时针起始角度数确定。类似的，通过测量从起点逆时针扫描角度数确定终点。
如果扫描角度超过360度，圆弧扫描多次。这个函数用当前笔画直线，图形不填充。

请参阅：CDC::Arc, CDC::ArcTo, CDC::MoveTo, ::AngleArc


 CDC::Arc

BOOL Arc(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
BOOL Arc(LPCRECT lpRect, POINT ptStart, POINT ptEnd);

返回值：函数成功，返回非零值，否则为0。

参数：
x1 | 指定绑定矩形左上角X坐标（逻辑单位）。
y1 | 指定绑定矩形左上角Y坐标（逻辑单位）。
x2 | 指定绑定矩形右下角X坐标（逻辑单位）。
y2 | 指定绑定矩形右下角Y坐标（逻辑单位）。
x3 | 指定定义圆弧起点的点的X坐标（逻辑单位）。这个点不一定正好在圆弧上。
y3 | 指定定义圆弧起点的点的Y坐标（逻辑单位）。这个点不一定正好在圆弧上。
x4 | 指定定义圆弧终点的点的X坐标（逻辑单位）。这个点不一定正好在圆弧上。
y4 | 指定定义圆弧终点的点的Y坐标（逻辑单位）。这个点不一定正好在圆弧上。
lpRect | 指定绑定矩形（逻辑单位）。可以对这个参数传递LPRECT或CRect对象。
ptStart | 指定圆弧起点的点的X和Y坐标（逻辑单位）。这个点不一定正好在圆弧上。可以对这个参数传递POINT结构或CPoint对象。
ptEnd | 指定圆弧终点的点的X和Y坐标（逻辑单位）。这个点不一定正好在圆弧上。可以对这个参数传递POINT结构或CPoint对象。

说明：
画一条椭圆弧。用这个函数画的弧是由指定绑定矩形定义的一段椭圆。弧实际起点是从绑定矩形中心通过指定开始点的线与椭圆的相交点。弧实际终点是从绑定矩形中心通过指定终点的线与椭圆的相交点。以逆时针方向画弧。由于弧不是闭合图形，所以并不填充。矩形的宽度和长度要大于2单位，小于32767单位。

请参阅：CDC::Chord, ::Arc, POINT, RECT


 CDC::ArcTo

BOOL Arc TO(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
BOOL Arc To(LPCRECT lpRect, POINT ptStart, POINT ptEnd);

返回值：函数成功，返回非零值，否则为0。

参数：
x1 | 指定绑定矩形左上角X坐标（逻辑单位）。
y1 | 指定绑定矩形左上角Y坐标（逻辑单位）。
x2 | 指定绑定矩形右下角X坐标（逻辑单位）。
y2 | 指定绑定矩形右下角Y坐标（逻辑单位）。
x3 | 指定定义圆弧起点的点的X坐标（逻辑单位）。这个点不一定正好在圆弧上。
y3 | 指定定义圆弧起点的点的Y坐标（逻辑单位）。这个点不一定正好在圆弧上。
x4 | 指定定义圆弧终点的点的X坐标（逻辑单位）。这个点不一定正好在圆弧上。
y4 | 指定定义圆弧终点的点的Y坐标（逻辑单位）。这个点不一定正好在圆弧上。
lpRect | 指定绑定矩形（逻辑单位）。可以对这个参数传递RECT数据结构或CRect对象。
ptStart | 指定圆弧起点的点的X和Y坐标（逻辑单位）。这个点不一定正好在圆弧上。可以对这个参数传递POINT结构或CPoint对象。
ptEnd | 指定圆弧终点的点的X和Y坐标（逻辑单位）。这个点不一定正好在圆弧上。可以对这个参数传递POINT结构或CPoint对象。

说明：
画一条椭圆弧。除了更新当前点外，这个函数与CDC::Arc类似。点（x1,y1）和（x2,y2）指定绑定矩形。给定绑定矩形构成的椭圆定义圆弧曲线。弧从它与绑定矩形中心到（x3,y3）的放射线相交点沿逆时针（缺省弧方向）延伸。弧结束于它与绑定矩形中心到（x4,y4）的放射线相交点。如果开始点与结束点重合，则绘制一个完整的椭圆。从当前位置到弧起始点画一条直线。如果没出现错误，当前位置设置为弧终点。弧使用当前笔绘制；它不被填充。

请参阅：CDC::AngleArc, CDC::Arc, CDC::SetArcDirection, ::ArcTo


 CDC::Attach

BOOL Attach(HDC hDC);

返回值：函数成功，返回非零值，否则为0。

参数：
hDC Windows设备上下文。

说明：
使用这个函数把hDC附加到CDC对象。HDC同时存放在输出设备上下文m_hDC和属性设备上下文m_hAttribDC中。

请参阅：CDC::Detach, CDC::m_hDC, CDC::m_hAttribDC


 CDC::BeginPath

BOOL BeginPath();

返回值：函数成功，返回非零值，否则为0。

说明：
打开设备上下文中的路径。打开之后，应用可以调用GDI绘图。函数来定义路径中的点。应用可能通过调用EndPath成员函数关闭和打开路径。应用调用BeginPath时拒绝以前的路径。
请参阅联机文档“平台SDK”中的BeginPath，其中的绘图函数列表定义了Windows NT和Windows 95路径中的点。

请参阅：
CDC::EndPath, CDC::FillPath, CRgn::CreateFromPath, CDC::SelectClipPath, CDC::StrokeAndFillPath, CDC::StrokePath, CDC::WidenPath


 CDC::BitBlt

BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop );

返回值：函数成功，返回非零值，否则为0。

参数：
x | 指定目标矩形左上角的逻辑x坐标。
y | 指定目标矩形左上角的逻辑y坐标。
nWidth | 指定目标矩形和源位图的宽度（逻辑单位）。
nHeight | 指定目标矩形和源位图的高度（逻辑单位）。
pSrcDC | 指向CDC对象的指针，标识待拷贝位图的设备上下文。如果dwRop指定不包括源的光栅操作，则它必须为NULL。
xSrc | 指定源位图左上角的逻辑X坐标。
ySrc | 指定源位图左上角的逻辑Y坐标。
dwRop指定要执行的光栅操作。光栅操作代码定义GDC如何合并输出操作中的颜色，包括当前画刷、可能的源位图和目标位图。
下面对dwRop列出光栅操作代码及其描述：
BLACKNESS | 所有输出变黑。
DSTINVERT | 反转目标位图。
MERGECOPY | 使用布尔AND操作符合并特征与源位图。
MERGEPAINT | 使用布尔OR操作符合并特征与源位图。
NOTSRCCOPY | 拷贝反转源位图到目标。
NOTSRCERASE | 反转使用布尔OR操作符合并源和目标位图的结果。
PATCOPY | 拷贝特征到目标位图。
PATINVERT | 使用布尔XOR操作符合并目标位图和特征。
PATPAINT | 使用布尔OR操作符合并反转源位图和特征。用布尔OR操作符合并这项操作结果与目标位图。
SRCAND | 使用布尔AND操作符合并目标像素和源位图。
SRCCOPY | 拷贝源位图到目标位图。
SRCERASE | 反转目标位图并用布尔AND操作符合并这个结果和源位图。
SRCINVERT | 使用布尔XOR操作符合并目标像素和源位图。
SRCPAINT | 使用布尔OR操作符合并目标像素和源位图。
WHITENESS | 所有输出变白。
有关光栅操作代码的完整列表，请参阅联机文档“Win32 SDK程序员参考”附录节中的“关于光栅操作代码”。

说明：
从源设备上下文拷贝位图到这个当前设备上下文。
应用可以在字节边界上对齐窗口或客户区域，保证BitBlt操作发生在以字节对齐的矩形上（登记窗口类时设置设备CS_BYTEALLGNWINDOW或CS_BYTEALIGHCLIENT标记）。
在字节对齐矩形上的BitBlt操作比未经字节对齐的矩形上的BitBlt操作快许多。如果想对自己的设备上下文指定字节对齐类风格，必须登记窗口类而不要依赖Microsoft基本类。可使用全局函数AfxRegisterWndClass。
一旦使用目标设备上下文和使用源设备上下文，GDI变形nWidth和nHeight。如果结果延伸不匹配，必要时GDI使用Windows StretchBlt函数压缩或拉伸源位图。
如果目标、源和特征位图颜色格式不同，BitBlt转换源和特征位图以匹配目标。转换中使用目标位图的前景和背景色。
BitBlt函数把单色位图转换为彩色时，它设置白色（1）为背景色，黑色（0）作为前景色。使用目标设备上下文的背景和前景色。要把彩色转换为单色，BitBlt把与背景色匹配的像素设置为白色，其余所有像素设置为黑色。在从彩色到单色的转换中，BitBlt使用彩色设备上下文的前景和背景色。
注意，并非所有的设备上下文都支持BitBlt。为检查给定设备上下文是否支持BitBlt，使用GetDeviceCaps成员函数并指定RASTERCAPS索引。

请参阅：
CDC::GetDeviceCaps, CDC::PatBlt, CDC::SetTextColor, CDC::StretchBlt, ::StretchDIBits, ::BitBlt


 CDC::CDC

CDC();

说明：构造一个CDC对象。

请参阅：CDC::CreateDC, CDC::CreateIC, CDC::CreateCompatibleDC


 CDC::Chord

BOOL Chord(int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4);
BOOL Chord(LPCRECT lpRect, POINT ptStart, POINT ptEnd);

返回值：函数成功，返回非零值，否则为0。

参数：
x1 | 指定弦绑定矩形左上角的X坐标（逻辑单位）。
y1 | 指定弦绑定矩形左上角的Y坐标（逻辑单位）。
x2 | 指定弦绑定矩形右下角的X坐标（逻辑单位）。
y2 | 指定弦绑定矩形右下角的Y坐标（逻辑单位）。
x3 | 指定定义弦起点的点的X坐标（逻辑单位）。
y3 | 指定定义弦起点的点的Y坐标（逻辑单位）。
x4 | 指定弦终点的X逻辑坐标。
y4 | 指定弦终点的Y逻辑坐标。
lpRect | 指定范围内的矩形（逻辑单位），可以为该参数传递LPRECT或CRect对象。
ptStart | 指定弦起点的X和Y逻辑坐标，该点不必在弦上，可以为该参数传递POINT结构或CPoint对象。
ptEnd | 指定弦终点的X和Y逻辑坐标，该点不必在弦上，可以为该参数传递POINT结构或CPoint对象。

说明：
绘制弦(由椭圆和线段相交而形成的闭合图形)。(x1,y1)和(x2,y2)分别代表椭圆外接矩形的左上角和右下角坐标。(x3,y3)和(x4,y4)分别代表截取椭圆的直线的端点坐标。该弦用指定的画笔绘制和画刷填充。
由Chord函数绘制的图形可以扩充到但并不包括右边和底部坐标。这表明图形高度是y2-y1，宽度是x2-x1。

请参阅：CDC::Arc, ::Chord, POINT


 CDC::CloseFigure

BOOL CloseFigure()

返回值：如果成功，则返回非零值，否则为0。

说明：
关闭路径中打开的图形，该函数绘制当前点到图形起点的直线，从而关闭图形（通常，点是由最近调用MoveTo成员函数指定的）并且使用线连接风格连接线。如果图形是由LineTo成员函数而非CloseFigure关闭的，端部将形成一个角而不是一个连接，CloseFigure在设备上下文中存在开放路径时才被调用。
图形在路径中是打开的，除非它已被函数明确地关闭（图形能够被打开，即使当前点与图形起始点是同一点）。在CloseFigure后加到路径中的任何直线或曲线将开始一个新图形。

请参阅：CDC::BeginPath, CDC::EndPath, CDC::MoveTo, ::CloseFigure


 CDC::CreateCompatibleDC

virtual BOOL CreateCompatibleDC(CDC* pDC)

返回值：如果成功，则返回非零值，否则为0。

参数：
pDC 设备上下文的指针。如果pDC为NULL，函数将产生与系统显示兼容的内存设备上下文。

说明：
产生与pDC指定设备兼容的设备上下文内存，设备上下文内存包含显示表面的信息，它用于在向实际的兼容设备表面发送图象之前在内存中作好准备。
当创建设备内存上下文时，GDI自动选择单色存储位图格式。只有在位图已被创建并被选入设备上下文之中时，才使用GDI输出函数。
该函数仅用于创建与支持光栅操作的设备上下文。可参阅 CDC::BitBlt成员函数，了解设备上下文之间的位块传输。要决定设备是否支持光栅操作，可参阅成员函数CDC::GetDeviceCaps 中RC_BITBLT的光栅兼容性。

请参阅：
CDC::CDC, CDC::GetDeviceCaps, ::CreateCompatibleDC, CDC::BitBlt, CDC::CreateDC, CDC::CreateIC, CDC::DeleteDC


 CDC::CreateDC

virtual BOOL CreateDC(
LPCTSTR lpszDriverName,
LPCTSTR lpszDeviceName,
LPCTSTR lpszOutput,
const void* lpInitData
)

返回值：如果成功，则返回非零值，否则为0。

参数：
lpszDriverName | 指向空终止字符串的指针，字符串为设备驱动程序的文件名（不带扩展名，例如：“EPSON”）。 也可以为该参数传递CString对象。
lpszDeviceName | 指向空终止字符串的指针，字符串为支持特定设备的文件名（例如：“EPSON FX-80”）。如果模块支持不只一个设备，使用lpszDeviceName参数，也可以为该参数传递CString对象。
lpszOutput | 指向空终止字符串的指针，字符串为指定了物理输出媒介的文件和设备名（文件或输出端口）。也可以为该参数传递CString对象。
lpInitData | 指向DEVMODE结构的指针，该结构包含有指定设备驱动程序的初始数据，Windows的DocumentProperties函数从该结构中获得指定设备的信息。如果设备驱动程序使用用户在控制面板设定的缺省值，lpInitData参数一定要设置为NULL。

说明：
为指定的设备创建设备上下文。
如果使用DEVMODE 结构，就需要PRINT.H 头文件。
设备名字遵从以下规范：建议使用（：）结束，Windows 废除了中止冒号，使以冒号结尾的设备名字与没有冒号的同名的端口相对应。驱动程序和端口绝不能有前导或结尾空格，GDI输出函数不能在信息相关中使用。

请参阅：
::DocumentProperities, ::CreateDC, CDC::DeleteDC, CDC::CreateIC


 CDC::CreateIC

virtual BOOL CreateIC(
LPCTSTR lpszDriverName,
LPCTSTR lpszDeviceName,
LPCTSTR lpszOutput,
const void* lpInitData
)

返回值：如果成功，则返回非零值，否则为0。

参数：
lpszDriverName | 指向空终止字符串的指针，字符串为设备驱动程序的文件名（不带扩展名，例如：“EPSON”）。也可以为该参数传递CString对象。
lpszDeviceName | 指向空终止字符串的指针，字符串为支持特定设备的文件名（例如：“EPSON FX-80”）。如果模块支持不只一个设备，使用lpszDeviceName参数，也可以为该参数传递CString对象。
lpszOutput | 指向空终止字符串的指针，字符串为指定了物理输出媒介的文件和设备名（文件或输出端口）。也可以为该参数传递CString对象。
lpInitData | 指向包含指定设备初始数据的点。如果设备驱动程序使用用户在控制面板设定的缺省值，lpInitData一定要为NULL。要了解特定设备初始数据格式，可参阅CreateDC。

说明：
创建指定设备的信息相关。信息相关可以快速获取设备信息，而无需设备上下文。
设备名字遵从以下规范：建议使用（：）结束，Windows废除了中止冒号，使以冒号结尾的设备名字与没有冒号的同名的端口相对应。驱动程序和端口绝不能有前导或结尾空格，GDI输出函数不能与信息上下文一起使用。

请参阅：CDC::CreateDC, ::CreateIC, CDC::DeleteDC


 CDC::DeleteDC

virtual BOOL DeleteDC()

返回值：如果成功，则返回非零值，否则为0。

说明：
通常不调用该函数而使用析构程序。DeleteDC成员函数删除和当前CDC对象中的m_hDC有联系的Windows设备上下文。如果该CDC对象是给定设备的最后一个活动设备上下文，该设备将被告知，所有内存和设备所占资源获得释放。
如果对象已被选入设备上下文之中，应用不得调用DeleteDC。在删除之前，应将选进设备上下文的对象挑出。
如果通过调用CWnd::GetDC获得设备上下文的句柄，那么应用不得删除该设备上下文。应该调用CWnd::ReleaseDC释放设备上下文，CClientDC和CWindowDC类可以提供这些功能。
DeleteDC函数通常删除由CreateDC，CreateIC或CreateCompatibleDC创建的设备上下文。

请参阅：
CDC::CDC, ::DeleteDC, CDC::CreateDC, CDC::CreateIC, CDC::CreateCompatibleDC, CWnd::GetDC, CWnd::ReleaseDC


 CDC::DeleteTempMap

static void PASCAL DeleteTempMap()

说明：
由CWinApp的空闲处理程序自动调用。
DeleteTempMap删除由FromHandle创建的任何临时CDC对象，但不能破坏与CDC暂时联系的设备上下文的句柄。

请参阅：CDC::Detach, CDC::FromHandle, CWinApp::OnIdle


 CDC::Detach

HDC Detach();

返回值：Windows设备上下文。

说明：
调用该函数将m_hDC（输出设备上下文）从CDC对象中分离，并将m_hDC与m_hAttribDC设置为NULL。

请参阅：CDC::Attach, CDC::m_hDC, CDC::m_hAttribDC


 CDC::DPtoHIMETRIC

void DPtoHIMETRIC(LPSIZE lpSize) const

参数：
lpsize 指向SIZE结构或CSize对象的指针。

说明：
在将HIMETRIC 尺寸传给OLE时使用该函数，将像素转为HIMETRIC。
如果设备上下文对象的映射模式是MM_LOENGLISH，MM_HIENGLISH，MM_LOMETRIC或MM_HIMETRIC，那么转换基于用物理英寸表示的像素数目。如果映射模式是其它非受限模式的一种（如MM_TEXT），那么转换基于用逻辑英寸表示的像素数目。

请参阅：
CDC::DPtoLP, CDC::LPtoDP, CDC::HIMETRICtoLP, CDC::HIMETRICtoDP, CDC::LPtoHIMETRIC


 CDC::DptoLP

void DptoLP(LPPOINT lpPoints, int nCount = 1) const;
void DptoLP(LPRECT lpRect) const;
void DptoLP(LPSIZE lpSize) const;

参数：
lpPoints | 指向POINT结构的数组或CPoint对象的指针。
nCount | 数组中的指针数目。
lpRect | 指向RECT结构或CRect对象的指针。该参数用于将矩形从设备指针转为逻辑指针的简单情形。
lpSize | 指向SIZE结构或CSize对象的指针。

说明：
将设备单位转换为逻辑单位。该函数将每一点的坐标或尺寸，从设备坐标系统转换成GDI的逻辑坐标系统，该转换取决于当前的映射模式、原先的设置以及设备窗口和视图的扩展。

请参阅：
CDC::LPtoDP, CDC::HIMETRICtoDP, ::DPtoLP, POINT, RECT, CDC::GetWindowExt, CDC::GetWindowOrg


 CDC::Draw3dRect

void Draw3dRect(LPCRECT lpRect, COLORREF clrTopLeft, COLORREF clrBottomRight);
void Draw3dRect(int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight)

参数：
lpRect | 指定限定范围内的矩形（逻辑单位），可将RECT或CRect对象的指针传递给该参数。
clrTopLeft | 指定三维矩形顶部和左侧的颜色。
clrBottomRight | 指定三维矩形底部和右侧的颜色。
x | 指定三维矩形左上角的X逻辑坐标。
y | 指定三维矩形左上角的Y逻辑坐标。
cx | 指定三维矩形的宽度。
cy | 指定三维矩形的高度。

说明：
调用该成员函数绘制三维矩形。该矩形的顶部、左侧颜色由clrTopLeft指定，底部和右侧颜色由clrBottomRight指定。

请参阅：RECT, CRect


 CDC::DrawDragRect

void DrawDragRect(
LPCRECT lpRect,
SIZE size,
LPCRECT lpRectLast,
SIZE sizeLast,
CBrush* pBrush = NULL,
CBrush* pBrushLast = NULL
);

参数：
lpRect | 指向RECT结构或CRect对象的指针。它包含指定矩形的逻辑坐标--在此情况下，矩形的端点位置将被重新绘制。
size | 指定矩形外边界的左上角与内边界的左上角的偏移量（即边界的厚度）。
lpRectLast | 指向RECT结构或CRect对象的指针。它包含指定矩形的逻辑坐标棗在此情况下，矩形的原始位置处于重新绘制状态。
sizeLast | 指定重新绘制的矩形的外边界的左上角与内边界的左上角的偏移量（即边界的厚度）。
pBrush | 指向画刷的指针。设置为NULL时，使用缺省的黑白画刷。
pBrushLast | 指向最近使用的画刷指针。

说明：
反复调用该成员函数以重新绘制一个拖动的矩形。为得到视觉反馈，可以在指定鼠标位置后循环调用该函数。当调用DrawDragRect后，前一个矩形被抹去而重新绘制一个新矩形。例如，当用户在屏幕上拖动矩形时，DrawDragRect将抹去先前的一个，而在新位置上重新绘制。缺省地，DrawDragRect用黑白画刷绘制矩形，创建一个平滑移动的矩形。当第一次调用DrawDragRect时，lpRectLast参数应设置为NULL。

请参阅：RECT, CRect, CDC::GetHalftoneBrush


 CDC::DrawEdge

BOOL DrawEdge(LPRECT lpRect, UNIT nEdge, UNIT nFlags);

返回值：如果成功，则返回非零值，否则为0。

参数：
lpRect | 指向包含有逻辑坐标矩形的RECT结构的指针。
nEdge | 指定矩形内外边界的类型。该参数是内边界标志和外边界标志的集合。请参阅说明中该参数的类型。
nFlags | 指定绘制边界的类型，请参阅说明中该参数的类型。

说明：
调用该成员函数，绘制指定风格和类型的矩形。
内外边界标志如下：
内边界标志：
· | BDR_RAISEDINNER | 内边界凸出。
· | BDR_SUNKENINNER | 内边界凹下。
外边界标志：
· | BDR_RAISEDOUTER | 外边界凸出。
· | BDR_SUNKENOUTER | 外边界凹下。

nEdge参数必须是内边界标志和外边界标志的组合。可以为以下值之一：
EDGE_BUMP | BDR_RAISEDOUTER和BDR_SUNKENINNER的组合。
EDGE_ETCHED | BDR_SUNKENOUTER和BDR_RAISEDINNER的组合。
EDGE_RAISED | BDR_REISEDOUTER和BDR_RAISEDINNER的组合。
EDGE_SUNKEN | BDR_SUNKENOUTER和BDR_SUNKENINNER的组合。

nFlags参数的类型如下：
BF_RECT | 矩形的四周边界。
BF_LEFT | 矩形的左边界。
BF_BOTTOM | 矩形的底部边界。
BF_RIGHT | 矩形的右边界。
BF_TOP | 矩形的顶部边界。
BF_TOPLEFT | 矩形的左、底部边界。
BF_TOPRIGHT | 矩形的右、顶部边界。
BF_BOTTOMLEFT | 矩形的左、底部边界。
BF_BOTTOMRIGHT | 矩形的右、底部边界。

对于对角线，BF_RECT标志指定了矢量终点：
BF_DIAGONAL_ENDBOTTOMLEFT | 对角线边界。终点为矩形的左下角，始点为右上角。
BF_DIAGONAL_ENDBOTTOMRIGHT | 对角线边界。终点为矩形的右下角，始点为左下角。
BF_DIAGONAL_ENDTOPLEFT | 对角线边界。终点为矩形的左上角，始点为右下角。
BF_DIAGONAL_ENDTOPRIGHT | 对角线边界。终点为矩形的右上角，始点为左下角。

请参阅：::DrawEdge


 CDC::DrawEscape

int DrawEscape(int nEscape, int nInputSize, LPCSTR lpszInputData);

返回值：
指定函数结果。成功，则返回值大于零，用QUERYESCSUPPORT绘制脱离除外，它只用来检查实现。
如果没有完成绘制，则返回0。如果出错，则返回值小于零。

参数：
nEscape | 指定要执行的脱离函数。
nInputSize | 指定lpszInputData参数指向的数据的字节数。
lpszInputData | 指向特定脱离需要的输入结构的指针。

说明：
通过GDI不能直接获得对视频显示的绘制能力。当应用调用DrawEscape时，由nInputSize和lpszInputData标识的数据直接传递给指定的显示驱动程序。

请参阅：CDC::Escape, ::DrawEscape


 CDC::DrawFocusRect

void DrawFocusRect(LPCRECT lpRect);

参数：
lpRect 指向RECT结构或CRect对象的指针，它指定了将要绘制的矩形的逻辑坐标。

说明：
绘制具有焦点的矩形。
因为该函数是布尔XOR函数，对同一矩形第二次调用该函数将不再显示该矩形。利用该函数绘制的矩形不能被滚动，要使带有该函数绘制的矩形的区域滚动，应先调用DrawFocusRect 从显示中将其清除，滚动该区域后再调用DrawFocusRect在新的位置上重新绘制该矩形。

请参阅：CDC::FrameRect, ::DrawFocusRect, RECT


 CDC::DrawFrameControl

BOOL DrawFrameControl(LPRECT lpRect, UNIT nType, UNIT nState);

返回值：如果成功，则返回非零值，否则为0。

参数：
lpRect | 指向包含有逻辑坐标的矩形的RECT结构。
nType指定绘制的框架类型。该参数有以下值：
· | DFC_BUTTON | 标准按钮
· | DFC_CAPTION | 标题条
· | DFC_MENU | 菜单
· | DFC_SCROLL | 滚动条
nState | 指定框架控件的初始状态。可参阅说明中该参数的值列表。

说明：
调用该成员函数绘制指定风格和类型的框架控件。
设置nState值为DFCS_ADJUSTRECT，可使外接矩形与下压按钮的周边分离。可使用以下一到多个值来设定绘制控件的状态：
DFCS_CHECKED | 按钮被选中
DFCS_FLAT | 按钮具有平面边界
DFCS_INACTIVE | 按钮灰显（不活动）
DFCS_MONO | 按钮具有单色边界
DFCS_PUSHED | 按钮被按下

在许多情况下，nState取决于nType参数。下面列出了二者的关系：
DFC_BUTTON
· | DFCS_BUTTON3STATE | 3态按钮
· | DFCS_BUTTONCHECK | 复选框
· | DFCS_BUTTONPUSH | 下压按钮
· | DFCS_BUTTONRADIO | 单选钮
· | DFCS_BUTTONRADIOIMAGE | 单选钮的图象
· | DFCS_BUTTONRADIOMASK | 单选钮掩码
DFC_CAPTION
· | DFCS_CAPTIONCLOSE | Close按钮
· | DFCS_CAPTIONHELP | Help按钮
· | DFCS_CAPTIONMAX | Maximize按钮
· | DFCS_CAPTIONMIN | Minimize按钮
· | DFCS_CAPTIONRESTORE | Restore按钮
DFC_MENU
· | DFCS_MENUARROW | 子菜单箭头
· | DFCS_MENUBULLET | 项目符号
· | DFCS_MENUCHECK | 选中符号
DFC_SCROLL
· | DFCS_SCROLLCOMBOBOX | 组合框滚动条
· | DFCS_SCROLLDOWN | 滚动条的下箭头
· | DFCS_SCROLLLEFT | 滚动条的左箭头
· | DFCS_SCROLLRIGHT | 滚动条的右箭头
· | DFCS_SCROLLSIZEGRIP | 窗口右下角的尺寸区
· | DFCS_SCROLLUP | 滚动条的上箭头
关于Windows API DrawFrameControl的更多信息，请参阅联机文档“Win32 SDK程序员参考”中的::DrawFrameControl。

请参阅：::DrawFrameControl


 CDC::DrawIcon

BOOL DrawIcon(int x, int y, HICON hIcon);
BOOL DrawIcon(POINT point, HICON hIcon);

返回值：如果成功，则返回非零值，否则为0。

参数：
x | 指定图标左上角的X逻辑坐标。
y | 指定图标左上角的Y逻辑坐标 。
hIcon | 要绘制的图标的句柄标识。
point | 指定图标左上角的X或Y逻辑坐标。可以为该参数传递POINT结构或CPoint对象。

说明：
在当前CDC对象的设备上绘制图标。该函数将图标左上角置于x和y参数确定的坐标上，位置受到设备上下文的当前映射模式的影响。图标资源必须已由函数CWinApp::LoadIcon，CWinApp::LoadStandardIcon，或CWinApp::LoadOEMIcon预装，使用本函数应优先选择MM_TEXT映射模式。

请参阅：
CWinApp::LoadIcon, CWinApp::LoadStandardIcon, CWinApp::LoadOEMIcon, CDC::GetMapMode, CDC::SetMapMode, ::DrawIcon, POINT


 CDC::DrawState

BOOL DrawState(CPoint pt, CSize size, HBITMAP hBitmap, UINT nFlags, HBRUSH hBrush = NULL);
BOOL DrawState(CPoint pt, CSize size, CBitmap* pBitmap, UINT nFlags, HBRUSH* hBrush = NULL);
BOOL DrawState(CPoint pt, CSize size, HICON hIcon, UINT nFlags, HBRUSH hBrush = NULL);
BOOL DrawState(CPoint pt, CSize size, HICON hIcon, UINT nFlags, CBrush* pBrush = NULL);
BOOL DrawState(CPoint pt, CSize size, LPCTSTR lpszText, UNIT nFlags, BOOL bprefixText = TURE, int nTextLen = 0, HBRUSH hBrush = NULL);
BOOL DrawState(CPoint pt, CSize size, LPCTSTR lpszText, UNIT nFlags, BOOL bPrefixText = TURE, int nTextLen = 0, CBrush* pBrush = NULL);
BOOL DrawState(CPoint pt, CSize size, DRAWSTATEPROC lpDrawproc, LPARAM lData, UINT nFlags, HBRUSH hBrush = NULL);
BOOL DrawState(CPoint pt, CSize size, DRAWSTATEPROC lpDrawproc, LPARAM lData, UINT nFlags, CBrush* pBrush = NULL);

返回值：如果成功，则返回非零值，否则为0。

参数：
pt | 指定图象位置。
size | 指定图象大小。
hBitmap | 位图句柄。
nFlags | 指定图象类型和状态的标志。请参阅说明中的nFlags可能的类型和状态。
hBrush | 画刷句柄。
pBitmap | 指向CBitmap对象的指针。
pBrush | 指向CBrush对象的指针。
hIcon | 图标句柄。
lpszText | 指向文本的指针。
bPrefixText | 包含助记符的文本。lData参数指定该字符串的地址，nTextLen 参数指定长度，如果nTextLen 为0，该字符串被认为是以空终止的。
nTextLen | 由lpszText指向的字符串的长度，如果nTextLen 为0，字符串被认为是空终止的。
lpDrawProc | 渲染图像使用的回调函数指针。如果图象类型是DST_COMPLEX ，该参数是必需的。如果是DST_TEXT，该参数是可选的，也可以是NULL值。对其它类型的图象该参数可忽略。关于回调函数，请参阅联机文档“Win32 SDK程序员参考”中的::DrawStateProc函数。
lData | 指定图象信息，该参数的意义取决于图象类型。

说明：
调用该成员函数来显示图象，并将视觉效果表示状态，例如无效或缺省状态。
nFlags类型可以设置为以下值之一：
DST_BITMAP | 图象是位图。lData参数的低位字是位图句柄。
DST_COMPLEX | 图象是应用定义的。要渲染该图象，DrawState调用了由lpDrawProc参数指定的回调函数。
DST_ICON | 图象是图标。lData的低位字是位图句柄。
DST_PREFIXTEXT | 图象可以是包含助记符的文本。将前缀字符&理解成将后一字符添加下划线，lData指定了该字符串的地址。
DST_TEXT | 图象是文本，lData参数指定该字符串的地址。

nFlag参数的状态可设置为以下值之一：
DSS_NORMAL | 不作任何修改绘制图象。
DSS_UNION | 抖动图象。
DSS_DISABLED | 该图象具有浮雕花纹。
DSS_DEFAULT | 图象粗体显示。
DSS_MONO | 按hBrush和pBrush参数值绘制图象。
注意：在除DSS_NORMAL外所有的nFlag状态下，在视觉效果产生之前，图象转换成单色。
关于Windows API DrawState的更多信息，请参阅联机文档“Win32 SDK程序员参考”的::DrawState。

请参阅：::DrawState, ::DrawStateProc


 CDC::DrawText

virtual int DrawText(LPCTSTR lpszString, int nCount, LPRECT lpRect, UINT nFormat);
int DrawText(const CString& str, LPRECT lpRect, UNIT nFormat);

返回值：如果成功，则返回文本高度。

参数：
lpszString | 指向要绘制的文本的指针。如果nCount是-1，该字符串必须是空终止的。
nCount | 字符串中字符数目。如果为-1，lpszString被认为是一个指向空终止的字符串的长指针。DrawText自动计算字符数目。
lpRect | 指向RECT结构或CRect对象的指针，结构（或对象）中包含有矩形（逻辑单位表示），其中的文本带有格式。
str | 含有要被绘制的文本的CString对象。
nFormat指定格式化文本的方法。它可以是下列值的组合（可用运算符或位操作符进行组合）：
DT_BOTTOM | 底部对齐的文本。该值必须同DT_SINGLELINE组合使用。
DT_CALCRECT | 决定矩形的宽度和高度，如果是多行文字，DrawText将会使用lpRect指向的矩形，并扩展矩形以容纳文本。如果是单行文本，DrawText将会调整矩形的右边以便容纳该行文字。两种情况下，DrawText都返回格式化文本的高度，但并不绘制它们。
DT_CENTER | 将文本水平居中。
DT_END_ELLIPSIS或DT_PATH_ELLIPSIS | 如果必要，将用椭圆替代部分指定的文本，以便适合给定的矩形。除非指定DT_MODIFYSTRING 标志，否则给定的字符串不会被修改。可以指定DT_END_ELLIPSIS在字符串末端替代字符，或者指定DT_PATH_ELLIPSIS在字符串中间替代字符。如果字符串中含有反斜杠（\），DT_PATH_ELLIPSIS将尽可能保存在最后一个反斜杠后的文本。
DT_EXPANDTABS | 扩展制表符，每一制表符所含字符的缺省数目是8。
DT_EXTERNALLEADING | 包括在行高中的字体外部间隔。通常外部间隔不包括在一行文本的高度之中。
DT_LEFT | 文本左对齐。
DT_MODIFYSTRING | 修正给定字符串以便与显示文本匹配。只有在指定了DT_END_ELLIPSIS 或DT_PATH_ELLIPSIS 标志时，该标志才起作用。 注意：某些uFormat标志组合能导致传递的字符串受到修改。DT_MODIFYSTRING同DT_END_ELLIPSIS 或DT_PATH_ELLIPSIS 一起使用会导致字符串修改，导致在CString覆盖中插入断言。
DT_NOCLIP | 绘制但不剪切， DrawText在使用DT_NOCLIP后总能运行得快一些。
DT_NOPREFIX | 关闭前缀字符，通常DrawText将助记前缀&理解为其后字符加上下划线，&&前缀符表示显示一个&字符，指定DT_NOPREFIX后，也关闭了这种处理。
DT_PATH_ELLIPSIS
DT_RIGHT | 文本右对齐。
DT_SINGLELING | 指定单行，回车与换行不会中断该行。
DT_TABSTOP | 设置制表位，nFormat的高位字节即为每一制表符所含字符的数目，缺省值为8。

说明：
在给定的矩形内调用该成员函数格式化文本。通过将制表值扩展到适当大小，使文本在给定矩形内左对齐、右对齐或居中，使文本断成多行以适应给定矩形来格式化文本，格式类型由nFormat指定。
该成员函数适应设备上下文中选取的字体、文本颜色、背景色来显示文本。在采用DT_NOCLIP格式时，DrawText剪切不会使文本显示超过矩形范围，除非选择DT_SINGLELINE格式，所有格式都认为适用于多行文本。
如果所选字体相对于矩形范围过大，DrawText成员函数并不用较小的字体来代替。
如果指定了DT_CALCRECT标志，由lpRect 指定的矩形将会更新，以反映显示文本需要的高度和宽度。
如果TA_UPDATECP文本对齐标志已经设置（见CDC::SetTextAlign），DrawText将在当前位置开始显示文本，而不是在矩形的左边。DrawText在TA_UPDATECP标志已经设置的情况下不会折行（即DT_WORDBREAK标志不起作用）。
文本颜色由CDC::SetTextColor设置。

请参阅：
CDC::SetTextColor, CDC::ExtTextOut, CDC::TabbedTextOut, CDC::TextOut, ::DrawText, RECT, CDC::SetTextAlign


 CDC::Ellipse

BOOL Ellipse(int x1, int y1, int x2,int y2);
BOOL Ellipse(LPCRECT lpRect);

返回值：如果成功，则返回非零值，否则为0。

参数：
x1 | 指定椭圆外接矩形左上角的X逻辑坐标。
y1 | 指定椭圆外接矩形左上角的Y逻辑坐标。
x2 | 指定椭圆外接矩形右下角的X逻辑坐标。
y2 | 指定椭圆外接矩形右下角的Y逻辑坐标。
lpRect | 指定椭圆外接矩形时，可以将CRect对象传递给该参数。

说明：
绘制椭圆。椭圆与其外接矩形的中心由 x1，y1，x2，y2 或lpRect指定，椭圆由当前画笔绘制，内部由当前画刷填充。
该函数绘制的图形可以扩充到但并不包括右边及底部坐标，亦即图形的高度是y2-y1，宽度是x2-x1。如果外接椭圆的宽度或高度是0，则不绘制椭圆。

请参阅：CDC::Arc, CDC::Chord, ::Ellipse


 CDC::EndDoc

int EndDoc();

返回值：
如果成功，则返回值大于或等于零，出错则返回值小于零。下面列出了一般的错误类型：
SP_ERROR | 一般错误。
SP_OUTOFDISK | 假脱机所需的磁盘空间不足，没有其它可用的磁盘空间。
SP_OUTOFMEMORY | 假脱机所需的内存不足。
SP_USERABORT | 用户在打印管理中中止作业。

说明：
中止由StartDoc成员函数调用的打印作业。该函数代替了EndDoc打印程序脱离，在成功完成打印作业后应立即调用。
如果应用遇到打印错误或取消的打印操作，决不可用EndDoc或AbortDoc去中止操作，GDI在返回错误值之前自动中止操作。
该函数不能在元文件中使用。

请参阅：CDC::AbortDoc, CDC::Escape, CDC::StartDoc


 CDC::EndPage

int EndPage();

返回值：如果成功，则返回值大于或等于零，否则为出错值。下面列出了一般的错误类型：
SP_ERROR | 一般错误。
SP_APPABORT | 应用的调用函数返回0，作业终止。
SP_USERABORT | 用户在打印管理中中止作业。
SP_OUTOFDISK | 假脱机所需的磁盘空间不足，没有其它可用的磁盘空间。
SP_OUTOFMEMORY | 假脱机所需的内存不足。

说明：
通知设备应用已经写完一页。该成员函数常用在引导设备驱动程序开始新的一页。
该成员函数替代NEWFRAME打印机脱离程序。与NEWFRAME不同，该函数总是在打印页后被调用。

请参阅：CDC::StartPage, CDC::StartDoc, CDC::Escape


 CDC::EndPath

BOOL EndPath();

返回值：如果成功，则返回非零值，否则为0。

说明：关闭路径，并将括号定义的路径写入设备上下文中。

请参阅：CDC::BeginPath


 CDC::EnumObjects

int EnumObjects(int nObjectType,int (CALLBACKEXPORT* lpfn)(LPVOID,LPARAM),LPARAM lpData);

返回值：指定由调用函数返回的最后的值。其意义由用户定义。

参数：
nObjectType | 指定对象类型。可取的值有OBJ_BRUSH或OBJ_PEN。
lpfn | 应用调用函数的例程地址。请参阅说明部分。
lpData | 指向应用提供的数据指针。该数据同对象信息一起传递给调用函数。

说明：
枚举设置设备上下文中的画笔和画刷。对给定类型的每一对象，所传递的调用函数与此对象的信息一起被传递。系统调用回调函数，直到没有对象或调用函数返回0。
要注意Microsoft Visual C++的一个新特点是当把函数传递给EnumObjects时仍可使用普通函数。传递给EnumObjects的地址是一个指向由EXPORT产生的函数的指针，并带有Pascal调用约定。在保护模式下，不必用Windows MakeProcInstance来创建函数或由FreeProcInstance函数来释放它。
也不必在应用模块定义文件的EXPORT语句中列出输出的函数，但可使用EXPORT函数修饰符，如：
int CALLBACK EXPORT Afunction (LPSTR,LPSTR);
使编译器产生适当的记录用于按名称而不是别名输出。这可满足大部分需要。在某些特定情况下，例如通过普通或带别名的输出，仍需要模块定义文件中的EXPORT语句。
要编译Microsoft Foundation 程序，一般使用/GA和/Ges编译程序选项。/GW编译程序选项不为Microsoft Foundation类使用（如果要使用Windows 的MakeProcInstance，应当将调用的函数指针从FARPROC移到API需要的类型去）。调用登记的接口现在是类型安全的（必须传递一个函数指针，它指向用于特定调用的函数）。
在返回Windows时，还应注意到所有的调用函数必须捕获到Microsoft Foundation异常，因为异常仍在调用函数范围之内。关于异常的更多信息，请参阅联机文档“Visual C++程序员指南”中的“异常”。

请参阅：::EnumObject


 CDC::Escape

virtual int Escape(int nEscape, int nCount, LPCSTR lpszInData, LPVOID lpOutData);
int Escape(int nEscape, int nInputSize, LPCSTR lpszInputData, int nOutputSize, LPSTR lpszOutputData);

返回值：
如果成功，则返回正值；但如果是QUERYESCSUPPORT脱离，也为正值，它仅检验实现的情况。当脱离未能实现时，则返回0；出错则为负值。
下面是一般错误列表：
SP_ERROR | 一般错误。
SP_OUTOFDISK | 假脱机所需的磁盘空间不足，没有其它可用的磁盘空间。
SP_OUTOFMEMORY | 假脱机所需的内存不足。
SP_USERABORT | 用户在打印管理中中止作业。

参数：
nEscape | 指定将要执行的脱离函数。脱离函数的完整列表，请参阅“Windows软件开发工具”文档中关于打印机脱离的信息。
nCount | 由lpszInData指向的数据的字节数。
lpszInData | 指向脱离函数需要的输入数据结构的指针。
lpOutData | 指向接收脱离输出的结构的指针。如果无数据返回，lpOutData为NULL。
nInputSize | 由参数lpszInputData指向的数据的字节数。
lpszInputData | 指向特定脱离所需要的输入结构的指针。
nOutputSize | 由参数lpszOutputData指向的数据的字节数。
lpszOutputData | 指向接收脱离程序输出的结构的指针。如果无数据返回，lpszOutputData为NULL。

说明：
使应用从特定设备获得不能直接从GDI获得的访问功能。利用Escape的第一种形式将驱动程序定义的脱离值传递给设备，利用Escape的第二种形式将Windows 定义的一个脱离值传递给设备。应用实现的调用将得到解释并传给设备驱动程序。
指定将要执行的脱离函数，其可能的取值，请参阅联机文档“WindowsSDK?中打印机脱离的信息。

请参阅：
CDC::StartDoc, CDC::StartPage, CDC::EndPage, CDC::SetAbortProc, CDC::AbortDoc, CDC::EndDoc, CDC::GetDeviceCaps, ::ExtEscape, ::Escape


 CDC::ExcludeClipRect

virtual int ExcludeClipRect(int x1, int y1, int x2, int y2);
virtual int ExcludeClipRect(LPCRECT lpRect);

返回值：指定新的剪切区域类型，可为下列值之一：
COMPLEXREGION | 该区域有覆盖边界。
ERROR | 没有创建区域。
NULLREGION | 区域为空。
SIMPLEREGION | 该区域无覆盖边界。

参数：
x1 | 指定矩形左上角的X逻辑坐标。
y1 | 指定矩形左上角的Y逻辑坐标。
x2 | 指定矩形右下角的X逻辑坐标。
y2 | 指定矩形右下角的Y逻辑坐标。
lpRect | 指定矩形，也可以是一个CRect对象。

说明：
创建一个新的剪切区，包括已存在的剪切区，不含指定的矩形。
矩形宽度由绝对值x2-x1表示，不能超过32，767单位。这一限制同样适于矩形高度。

请参阅：CDC::ExcludeUpdateRgn, ::ExcludeClipRect


 CDC::ExcludeUpdateRgn

int ExcludeUpdateRgn(CWnd* pWnd);

返回值：排除的区域类型，可为以下值之一：
COMPLEXREGION | 该区域有覆盖的边界。
ERROR | 没有创建区域。
NULLREGION | 区域为NULL。
SIMPLEREGION | 该区域无覆盖边界。

参数
pWnd 指向被更新的Windows对象的指针。

说明：通过排除窗口中的更新区域来防止在窗口中的无效区域绘图。

请参阅：CDC::ExcludeClipRect, ::ExcludeUpdateRgn


 CDC::ExtFloodFill

BOOL ExtFloodFill(int x, int y, COLORREF crColor, UINT nFillType);

返回值：
如果成功，则返回非零值；否则如果填充未能完成，或给定点具有由crColor（如果用到了FLOODFILLBORDER）指定的边界的颜色，或给定点不具有由crColor（如果用到了FLOODFILLSURFACE）指定的颜色，或者点在剪切区之外，则返回0。

参数：
x | 指定填充起点的X逻辑坐标。
y | 指定填充起点的Y逻辑坐标。
crColor | 指定要填充的边界区域颜色，对crColor的解释取决于nFillType的值。
nFillType指定填充区域，可以为以下值之一：
FLOODFILLBORDER | 填充区域颜色由crColor指定，该风格与FloodFill的填充风格不同。
FLOODFILLSURFACE | 填充区域颜色由crColor指定，只要遇到该颜色，填充就持续向四周进行。这种风格适用于填充多种颜色边界的区域。

说明：
利用当前画笔填充显示表面区域。由于可在nFillType中选择填充类型，这个成员函数比FloodFill有更大的灵活性。
如果nFillType设置为FLOODFILLBORDER，该区域被认为完全由crColor指定的颜色包围着。该函数由x,y指定的点出发，朝颜色边界的各个方向填充。
如果nFillType为FLOODFILLSURFACE，该函数由x,y指定点开始，沿各个方向填充，包含所有相邻的crColor指定颜色的区域。
只有内存设备上下文和支持光栅显示的设备支持ExtFloodFill。要了解更多的信息，请参阅GetDeviceCaps 成员函数。

请参阅：CDC::FloodFill, CDC::GetDeviceCaps, ::ExtFloodFill


 CDC::ExtTextOut

virtual BOOL ExtTextOut(int x, int y, UINT nOptions, LPCRECT lpRect, LPCTSTR lpszString, UINT nCount, LPINT lpDxWidths);
BOOL ExtTextOut(int x, int y, UNIT nOptions, LPCRECT lpRect, const CString& str, LPINT lpDxWidths);

返回值：如果成功，则返回非零值，否则为0。

参数：
x | 指定字符串首字符单元的X逻辑坐标。
y | 指定字符串首字符单元的Y逻辑坐标。
nOptions指定矩形类型，其值可为下列值之一，或全部，或没有：
· | ETO_CLIPPED | 指定将文本剪切置入矩形。
· | ETO_OPAQUE | 由背景色填充矩形（可用SetBkColor和GetBkColor成员函数设置和访问当前背景色）。
lpRect | 指向决定矩形尺寸信息的RECT结构的指针，可设置为NULL。可以为该参数传递CRect对象。
lpszString | 将要绘制的字符指针。可以为该参数传递CString对象。
nCount | 指定字符串的字符数。
lpDxWidths | 表示初始字符与相邻字符单元距离的数组的指针。例如lpDxWidths [I]表示I 字符与I+1 字符单元的分隔距离。如果lpDxWidths为NULL，ExtTextOut使用缺省值。
str | 包含要绘制的字符的CString对象。

说明：
调用该成员函数使用当前字体在矩形内书写字符串，矩形区域可以是透明的（用当前背景色填充），也可以是一个剪切区域。
如果 nOptions为0且lpRect为NULL，函数在向设备上下文书写文本时不需要矩形区域。缺省地，当前位置不会被函数使用或更新。如果当调用ExtTextOut时，应用需要更新当前值，应用会调用将nFlag设置为TA_UPDATECP的CDC成员函数SetTextAlign。当该标志已设定时，Windows 在ExtTextOut随后的调用中会覆盖x和y，而使用当前位置。当使用TA_UPDATECP更新当前位置时，ExtTextOut把上一行文字末尾或lpDxWidths数组的末元素指定的位置设置为当前位置，具体看哪一个大一些。

请参阅：
CDC::SetTextAlign, CDC::TabbedTextOut, CDC::TextOut, CDC::GetBkColor, CDC::SetBkColor, CDC::SetTextColor, ::ExtTextOut, RECT


 CDC::FillPath

BOOL FillPath();

返回值：如果成功，则返回非零值，否则为0。

说明：
在当前路径中关闭所有已打开的图形，并使用当前画刷和多边形填充模式填充路径内部。当路径内部填充以后，设备上下文放弃该路径。

请参阅：
CDC::BeginPath, CDC::SetPolyFillMode, CDC::StrokeAndFillPath, CDC::StrokePath, ::FillPath


 CDC::FillRect

void FillRect(LPCRECT lpRect,CBrush* pBrush);

参数：
lpRect | 指向RECT结构的指针，包含被填充的矩形的逻辑坐标，可以为该参数传递CRect对象。
pBrush | 标识填充矩形的画刷。

说明：
调用该成员函数使用指定的画刷填充给定的矩形。函数将完全填充矩形，包括左边界和顶部边界，但不包括右边和底部。
画刷需要用CBrush成员函数CreateHatchBrush, CreatePaletteBrush,CreateSolidBrush创建，或用Windows 函数::GetStockObject获得。
当填充矩形时，FillRect并不包括矩形的右边和底部。GDI填充到但并不包括右边和底部。不管是在何种模式下，FillRect比较top，bottom，left和right 成员的值。如果bottom小于或等于top，或者right小于等于left，那么矩形将不会被画出。
FillRect与CDC::FillSolidRect类似，但FillRect带有画刷，因此可以为矩形填充固体色、抖动色、阴影或使用调色板。FillSolidRect只能使用固体色（由COLORREF参数决定）。FillRect通常比FillSolidRect慢。

请参阅：
CBrush::CreateHatchBrush, CBrush::CreatePatternBrush, CBrush::CreateSolidBrush, ::FillRect, ::GetStorkObject, RECT, CBrush, CDC::FillSolidRect


 CDC::FillRgn

BOOL FillRgn(CRgn* pRgn,CBrush* pBrush);

返回值：如果成功，则返回非零值，否则为0。

参数：
pRgn | 被填充区域的指针，该区域的坐标指定为设备单位。
pBrush | 标识填充区域使用的画刷。

说明：
利用pBrush指定的画刷填充pRgn指定的区域。
画刷需要用CBrush成员函数CreateHatchBrush,CreatePatternBrush,CreateSolidBrush创建，或用GetStockObject获得。

请参阅：CDC::PaintRgn, CDC::FillRect, CBrush, CRgn, ::FillRgn


 CDC::FillSolidRect

void FillSolidRect(LPCRECT lpRect,COLORREF clr);
void FillSolidRect(int x,int y,int cx,int cy,COLORREF clr);

参数：
lpRec | 指向RECT数据结构的指针，包含被填充的矩形的逻辑坐标，可以为该参数传递RECT数据结构或CRect对象的指针。
clr | 指定填充矩形使用的颜色。
x | 矩形左上角的X逻辑坐标。
y | 矩形左上角的Y逻辑坐标。
cx | 指定矩形的宽度。
cy | 指定矩形的高度。

说明：
调用该成员函数用指定的固体色填充矩形。
FillSolidRect与CDC::FillRect类似，FillSolidRect只能使用固体色（由COLORREF参数决定）。但FillRect带有画刷，因此可以为矩形填充固体色、抖动色、阴影或使用调色板。FillRect通常比FillSolidRect慢。
注意：调用FillSolidRect时，以前用SetBkColor设置的背景色，被设置为clr指定的颜色。

请参阅：RECT, CRect, CDC::FillRect


 CDC::FlattenPath

BOOL FlattenPath();

返回值：如果成功，则返回非零值，否则为0。

说明：将当前设备上下文的路径中的曲线进行形式转换，把曲线转换为连续线段。

请参阅：CDC::WidenPath


 CDC::FloodFill

BOOL FloodFill(int x, int y, COLORREF crColor);

返回值：
如果成功，则返回非零值，否则如果填充未能完成，给定点是由crColor指定的边界色，或者点在剪切区之外，则返回0。

参数：
x | 开始填充时点的X逻辑坐标。
y | 开始填充时点的Y逻辑坐标。
crColor | 指定边界色。

说明：
使用当前画刷填充显示表面区域。该区域被认为是由crColor指定的边界色包围的。FloodFill由x和y指定的点开始，沿所有方向到达颜色边界。
只有内存设备上下文和支持光栅显示技术的设备支持FloodFill成员函数，关于RC_BITBLT的功能，请参阅GetDeviceCaps成员函数。ExtFloodFill函数与其相似，但更具有灵活性。

请参阅：CDC::ExtFloodFill, CDC::GetDeviceCaps, ::FloodFill


 CDC::FrameRect

void FrameRect(LPCRECT lpRect, CBrush* pBrush);

参数：
lpRect | 指向包含有矩形左上角和右下角逻辑坐标的RECT结构或CRect对象的指针，也可以为该参数传递CRect对象。
pBrush | 标识矩形框架化所使用的画刷。

说明：
为lpRec指定的矩形绘制边界。此函数使用给定的画刷绘制边界，其宽度与高度均为逻辑单位。
如果矩形的bottom坐标小于或等于top，或者right小于等于left，那么矩形将不会被画出。
FrameRect绘制的边界与在同一位置有Rectangle成员函数绘制的边界一样（如果Rectangle使用1逻辑单位宽的画笔）。FrameRect不会填充矩形内部。

请参阅：CBrush, ::FrameRect, CDC::Rectangle, CDC::FrameRgn, RECT


 CDC::FrameRgn

BOOL FrameRgn(CRgn* pRgn,CBrush* pBrush ,int nWidth,int nHeight);

返回值：如果成功，则返回非零值，否则为0。

参数：
pRgn | 指向CRgn对象的指针，该对象标识了被边界包围的区域。给定区域的坐标指定为设备单位。
pBrush | 指向CBrush对象的指针，该对象标识了用于绘制边界的画刷。
nWidth | 用设备单位表示的在垂直方向上画刷一次动作绘制的边界宽度。
nHeight | 用设备单位表示的在水平方向上画刷一次动作绘制的边界高度。

说明：使用pBrush指定的画刷为pRgn指定的区域绘制边界。

请参阅：CDC::Rectangle, CDC::FrameRect, CBrush, CRgn, ::FrameRgn


 CDC::FromHandle

static CDC* PASCAL FromHandle(HDC hDC);

返回值：用于立即使用的临时指针。

参数
hDC Windows设备上下文的句柄。

说明：
当给定设备上下文的指针时，则返回CDC对象的指针。如果CDC对象未与句柄相连，将创建一个临时CDC对象并与之相连。

请参阅：CDC::DeleteTempMap


 CDC::GetArcDirection

int GetArcDirection() const;

返回值：
如果成功，则指定当前的弧的方向。以下为返回值：
· | AD_COUNTERCLOCKWISE | 弧与矩形按逆时针方向绘制。
· | AD_CLOCKWISE | 弧与矩形按顺时针方向绘制。
如果出错，则返回0。

说明：为设备上下文返回当前弧的方向，由弧与矩形函数使用。

请参阅：CDC::SetArcDirection, ::GetArcDirection


 CDC::GetAspectRatioFilter

CSize GetAspectRatioFilter()const;

返回值：CSize对象，是当前方向比率过滤器使用的方向比率。

说明：
获得当前方向比率过滤器的设置。方向比率由设备像素的宽度与高度生成。设备的方向比率用于字体的创建、选择和显示。Windows提供了特殊的方向比率过滤器，从所有字体中选择适合特定方向比率的字体。过滤器使用由SetMapperFlag成员函数指定的方向比率。

请参阅：CDC::SetMapperFlags, CSize


 CDC::GetBkColor

COLORREF GetBkColor()const;

返回值：RGB颜色。

说明：
返回当前背景色。如果背景是不透明模式，系统在行间字符单元背景中使用背景色进行填充。当在彩色与黑白设备上下文之间转换位图时，系统也使用背景色。

请参阅：CDC::GetBkMode, CDC::SetBkColor, CDC::SetBkMode, ::GetBkColor


 CDC::GetBkMode

int GetBkMode() const;

返回值：当前背景模式，可以是透明模式或不透明模式。

说明：返回当前背景模式。背景模式决定了在书写文本、直线时是否将已存在的背景色覆盖。

请参阅：CDC::GetBkColor, CDC::SetBkColor, CDC::SetBkMode, ::GetBkColor,


 CDC::GetBoundsRect

UINT GetBoundsRect(LPRECT lpRectBounds,UINT flags);

返回值：
如果成功，则返回外接矩形的当前状态。可以是以下值的组合：
DCB_ACCUMULATE | 出现外接矩形聚集。
DCB_RESET | 外接矩形为空。
DCB_SET | 外接矩形非空。
DCB_ENABLE | 显示外接矩形。
DCB_DISABLE | 不显示外接矩形。

参数：
lpRectBounds 指向缓冲区的指针。该缓冲区接收当前的外接矩形，矩形用逻辑坐标表示。
flags指定当外接矩形返回后是否被清除，可以为下列值之一：
· | DCB_RESET | 返回后被清除。
· | DCB_WINDOWMGR | 查询Windows而非应用的外接矩形。

说明：为指定设备上下文返回当前聚集的外接矩形。

请参阅：CDC::SetBoundsRect, ::GetBoundsRect


 CDC::GetBrushOrg

CPoint GetBrushOrg() const;

返回值：返回作为CPoint对象的画刷的当前位置（设备单位）。

说明：
获得设备上下文中当前画刷的位置（设备单位）。
初始画刷位置在客户区域的（0，0），则返回值指定了用设备单位表示的相对于桌面的位置。

请参阅：CDC::SetBrushOrg, CPoint


 CDC::GetCharABCWidths

BOOL GetCharABCWidths(UNIT nFirstChar,UNIT nLastChar,LPABC lpabc) const;
BOOL GetCharABCWidths(UNIT nFirstChar,UNIT nLastChar,LPABCFLOAT lpABCF) const;

返回值：如果成功，则返回非零值，否则为0。

参数：
nFirstChar | 从已返回字体宽度的当前字体的字符集中指定首字符。
nLastChar | 从已返回字体宽度的当前字体的字符集中指定末字符。
lpabc | 函数返回时，指向接收字符宽度的ABC结构的数组的指针。该数组包含的ABC结构绝不能少于由nFirstChar与nLastChar确定的范围。
lpABCF | 带有应用提供的缓冲区中的ABCFLOAT结构的指针，当函数返回时，该结构接收字符宽度。函数返回的宽度以IEEE的浮点格式表示。

说明：
从当前指定的TrueType字体的连续字符中获得宽度值。宽度值用逻辑单位表示，该函数只用于TrueType字体。
TrueType光栅器在选定点尺寸后能提供“ABC”字符间距，“A”间距是在放入字符前在当前位置添加的距离，“B”间距是字符黑体部分的宽度，“C”间距是在当前位置上添加，用来作为字符右边空白空间的，总共宽度是A+B+C。
当GetCharABCWidths函数获得字符的A或C为负时，该字符可能还没有显示或已经被挂起。
要将ABC宽度值转为字体设计单位，应用应创建字体，使其高度（有LOGFONT结构的lfHeight成员指定）与存储在NEWTEXTMETRIC结构中ntmSizeEM成员的值相等（ntmSizeEM成员的值可通过调用Windows EnumFontFamilies函数得到）。
缺省字符的ABC宽度值用于当前选定字体中的其它超出选定范围的字符。
要获得非TrueType字体的字符宽度，应用应调用GetCharABCWidths成员函数。

请参阅：
::EnumFontFamilies, CDC::GetCharWidth, ::GetCharABCWidth, ::GetCharABCWidthFloat, ::GetCharWidthFloat


 CDC::GetCharWidth

BOOL GetCharWidth(UINT nFirstChar,UINT nLastChar,LPINT lpBuffer)const;
BOOL GetCharWidth(UINT nFirstChar,UINT nLastChar,float* lpFloatBuffer) const;

返回值：如果成功，则返回非零值，否则为0。

参数：
nFirstChar | 指定当前字体的一组连续字符的首字符。
nLastChar | 指定当前字体的一组连续字符的末字符。
lpBuffer | 指向缓冲区的指针。缓冲区接收了使用当前字体的一组连续字符的宽度值。
lpFloatBuffer | 接收字符宽度的缓冲区的值。宽度值使用IEEE32位浮点格式（宽度沿字符的基线测量）。

说明：
使用 m_hAttribDC从当前字体的一组连续字符中获得个别字符的宽度。例如：如果nFirstChar标记字母“a”，nLastChar标记字母“z”，函数将获得所有小写字符的宽度。函数存储了lpBuffer指向的缓冲区的值。该缓冲区必须足够大以容纳所有的宽度值。即，在上例中至少应有26个入口。如果连续字符组中的一个字符在某字体中不存在，则将缺省的字符宽度赋给它。

请参阅：
CDC::GetOutputCharWidth, CDC::m_hAttribDC, CDC::m_hDC, CDC::GetCharABCWidths, ::GetCharWidth, ::GetCharABCWidths, ::GetCharABCWidthsFloat, ::GetCharWidthFloat


 CDC::GetClipBox

virtual int GetClipBox(LPRECT lpRect ) const;

返回值：剪切区类型。可以取下列值：
COMPLEXREGION | 剪切区有覆盖的边界。
ERROR | 设备上下文无效。
NULLREGION | 剪切区为空。
SIMPLEREGION | 剪切区无覆盖边界。

参数
lpRect 接收矩形尺寸信息的RECT结构或CRect对象的指针。

说明：获得围绕剪切区边界的外接矩形的尺寸信息。信息将拷贝到lpRect指向的缓冲区。

请参阅：CDC::SelectClipRgn, ::GetClipBox, RECT


 CDC::GetColorAdjustment

BOOL GetColorAdjustment(LPCOLORADJUSTMENT lpColorAdjust)const;

返回值：如果成功，则返回非零值，否则为0。

参数
lpColorAdjust 接收颜色调整值的COLOADJUSTMENT数据结构的指针。

说明：为设备上下文获得颜色调整值。

请参阅：CDC::SetColorAdjustment


 CDC::GetCurrentBitmap

CBitmap* GetCurrentBitmap() const;

返回值：如果成功，则返回CBitmap的指针，否则返回NULL。

说明：返回当前选中CBitmap对象的指针，该成员函数返回临时对象。

请参阅：CDC::SelectObject, ::GetCurrentObject


 CDC::GetCurrentBrush

CBrush* GetCurrentBrush() const;

返回值：如果成功，则返回CBrush的指针，否则返回NULL。

说明：返回当前选中CBrush对象的指针，该成员函数返回临时对象。

请参阅：CDC::SelectObject, ::GetCurrentObject


 CDC::GetCurrentFont

CFont* GetCurrentFont() const;

返回值：如果成功，则返回CFont的指针，否则返回NULL。

说明：返回当前选中CFont对象的指针，该成员函数返回临时对象。

请参阅：CDC::SelectObject, ::GetCurrentObject


 CDC::GetCurrentPalette

CPalette* GetCurrentPalette() const;

返回值：如果成功，则返回CPalette的指针，否则返回NULL。

说明：返回当前选中CPalette对象的指针，该成员函数返回临时对象。

请参阅：CDC::SelectObject, ::GetCurrentObject


 CDC::GetCurrentPen

CPen* GetCurrentPen() const;

返回值：如果成功，则返回CPen的指针，否则返回NULL。

说明：返回当前选中CPen对象的指针，该成员函数返回临时对象。

请参阅：CDC::SelectObject, ::GetCurrentObject


 CDC::GetCurrentPosition

CPoint GetCurrentPosition() const;

返回值：如果成功，则返回CPoint的指针，否则返回NULL。

说明：返回当前选中CPoint对象的指针，该成员函数返回临时对象。

请参阅：CDC::MoveTo, CPoint


 CDC::GetDeviceCaps

int GetDeviceCaps(int nIndex) const;

返回值：如果成功，则返回所需要的能力值。

参数：
nIndex指定返回信息类型，可为下列值之一：
·DRIVERVERSION版本号，例如：0x100表示1.0版
·TECHNOLOGY设备技术，可为下列值之一：
值 | 含义
DT_PLOTTER | 矢量绘图机
DT_RASDISPLAY | 光栅显示
DT_RASPRINTER | 光栅打印机
DT_RASCAMERA | 光栅照相机
DT_CHARSTREAM | 字符流
DT_METAFILE | 元文件
DT_DISPFILE | 显示文件
·HORZSIZE物理显示宽度（以毫米为单位）。
·VERTSIZE物理显示高度（以毫米为单位）。
·HORZRES显示宽度（用像素表示）。
·VERTRES显示高度（用光栅线表示）。
·LOGPIXELSX沿显示宽度方向，每一逻辑单位的像素数。
·LOGPIXELSY沿显示高度方向，每一逻辑单位的像素数。
·BITPIXEL每一像素的颜色字节数。
·PLANES颜色位面数。
·NUMBRUSHES指定设备的画刷数目。
·NUMPENS指定设备的画笔数目。
·NUMFONTS指定设备的字体数目。
·NUMCOLORS设备颜色表的入口数目。
·ASPECTX用于描线的设备像素的相对宽度。
·ASPECTY用于描线的设备像素的相对高度。
·ASPECTXY用于描线的设备像素的对角线宽度。
·PDEVICESIZEPDEVICE内部数据结构的尺寸。
·CLIPCAPS设备的剪切能力。可以为以下值之一：
值 | 含义
CP_NONE | 输出不被剪切
CP_RECTANGLE | 输出被剪切到矩形
CP_REGION | 输出被剪切到区域
·SIZEPALETTE系统调色板的入口数。只有设置驱动程序在RASTERCAPS索引中设置了RC_PALETTE，该参数才有效。
·NUMRESERVER系统调色板的保留的入口数。只有设置驱动程序在RASTERCAPS索引中设置了RC_PALETTE，该参数才有效。
·COLORRES设备实际的颜色分辨率，用位/像素表示。只有设置驱动程序在RASTERCAPS索引中设置了RC_PALETTE，该参数才有效。
·RASTERCAPS表示设备光栅能力的值。可以为以下值的组合：
值 | 含义
RC_BANDING | 需要绑定支持
RC_BIGFONT | 支持大于64K的字体
RC_BITBLT | 具有传输位图的能力
RC_BITMAP64 | 支持大于64K的位图
RC_DEVBITS | 支持设备位图
RC_DI_BITMAP | 具有支持SetDIBits和GetDIBits Windows 函数的能力
RC_DIBTODEV | 具有支持SetDIBitsToDevice Windows 函数的能力
RC_FLOODFILL | 具有全面填充能力
RC_GD120_OUTPUT | 支持Windows 2.0RC_GD120_STATE设备上下文中包括状态块
RC_NONE | 不支持光栅操作
RC_OP_DX_OUTPUT | 支持设备白底和DX数组
RC_PALETTE | 指定基于调色板的设备
RC_SAVEBITMAP | 支持在本地保存位图的能力
RC_SCALING | 具有缩放能力
RC_STRETCHBLT | 能执行StretchBlt成员函数
RC_STRETCHDIB | 能执行Windows StretchDIBits函数
·CURVECAS设备的曲线能力。可为以下值的组合：
值 | 含义
CC_NONE | 支持曲线
CC_CIRCLES | 支持圆
CC_PIE | 支持饼图
CC_CHORD | 支持弧
CC_ELLIPSES | 支持椭圆
CC_WIDE | 支持宽边界
CC_STYLED | 支持边界风格
CC_WIDESTYLED | 支持加宽的边界风格
CC_INTERIORS | 支持内部功能
CC_ROUNDRECT | 支持圆角矩形
·LINECAPS设备的绘制直线能力。可为以下值的组合：
值 | 含义
LC_NONE | 不支持直线
LC_POLYLINE | 支持多直线
LC_MARKER | 支持标记
LC_POLYMARKER | 支持多标记
LC_WIDE | 支持加宽直线
LC_STYLED | 支持直线风格
LC_WIDESTYLED | 支持加宽的直线风格
LC_INTERIORS | 支持内部功能
·POLYGONALCAPS设备绘制多边形的能力。可为以下值的组合：
值 | 含义
PC_NONE | 不支持多边形
PC_POLYGON | 支持多边形
PC_RECTANGLE | 支持矩形
PC_WINDPOLYGON | 支持多边形的弯曲数目
PC_SCANLINE | 支持扫描直线
PC_WIDE | 支持加宽边界
PC_STYLED | 支持边界风格
PC_WIDESTYLED | 支持加宽的直线风格
PC_INTERORS | 支持内部功能
·TEXTCAPS设备绘制文本的能力。可为以下值的组合：
值 | 含义
TC_OP_CHARACTER | 支持字符精确输出，设备可将设备字体置于任何像素位置。这要求设备带有设备字体
TC_OP_STROKE | 支持笔画精确输出，设备可覆盖设备字体的重复动作
TC_CP_STROKE | 支持笔画剪切输出，设备可在像素边界剪切设备字体
TC_CR_90 | 支持90度的字符旋转，设备一次只能旋转字符90度
TC_CR_ANY | 支持任意角度的字符旋转
TC_SF_X_YINDEP | 支持x,y方向上的独立度量，设备可以分别从x,y方向上度量设备字体
TC_SA_DOUBLE | 支持度量倍增字符，设备可将设备字体放大一倍
TC_SA_INTEGER | 支持整数倍度量。设备可将设备字体放大至任意整数倍
TC_SA_CONTIN | 支持任意倍度量。设备可将设备字体放大至任意倍。但仍保持X和Y的比率
TC_EA_DOUBLE | 支持字符重量加倍，设备字体可设置为粗体。如果此位没有设置打印驱动程序。GDI将通过两次打印的方法创建粗体的设备字体
TC_IA_ABLE | 支持斜体字符，设备字体可设置为斜体。如果此位没有设置，GDI认为不能得到斜体
TC_UA_ABLE | 支持下划线，设备字体可设置为下划线。如果此位没有设置，GDI为设备字体创建下划线
TC_SO_ABLE | 支持空心字符，设备字体可设置为空心。如果此位没有设置，GDI为设备字体创建空心
TC_RA_ABLE | 支持光栅字体，GDI应为设备列举可用的光栅或TrueType字体，以便对EnumFonts或EnumFontFamilies函数的调用作出反应。如果此位没有设置，当这些函数调用时，光栅或字体不会加以列举
TC_VA_ABLE | 支持矢量字体，GDI应为设备列举可用的矢量或TrueType字体，以便对EnumFonts或EnumFontFamilies函数的调用作出反应。这对矢量设备很重要（如绘图机），显示程序（它们必须使用光栅字体）和光栅打印驱动程序列举矢量字体，因为GDI在将矢量字体送到驱动程序之前要将其进行光栅处理
TC_RESERVED | 反转，必须设置为0

说明：检取有关显示设备的特殊设备宽列信息。

请参阅：::GetDeviceCaps


 CDC::GetFontData

DWORD GetFontData( DWORD dwTable,DWORD dwOffset,LPVOID lpData,DWORD cbData ) const;

返回值：如果成功，则返回lpData指向的缓冲区的字节数；否则返回-1。

参数：
dwTable | 指定返回的计量单位表名字。可以是由Microsoft Corporation公司制定的TrueType字体文件规范中列出的计量单位表之一。如果参数值为0，信息从文件中开始处获得。
dwOffset | 制定从表中开始获取信息处与表头的偏移量。如果值为0，表示将从dwTable指定的表头处开始获取信息。如果值大于或等于表的长度, GetFontData返回0。
lpData | 接收字体信息的缓冲区的指针。如果值为NULL，函数返回dwTable指定的字体数据所需要的缓冲区大小。
cbData | 用字节数表示的获取信息的长度。如果值为0，GetFontData返回dwTable指定的数据大小。

说明：
从缩放字体文件中获取字体单位信息。获取的信息由指定的字体文件偏移量和信息长度加以标识。应用有时利用GetFontData成员函数将TrueType字体存入文件。这样做使应用通过将dwTable, dwOffset, cbData设置为0来决定字体是否能被嵌入，并获取整个字体文件。应用通过检验OUTLINETEXTMETRIC结构的otmfsType成员，从而决定字体能否被嵌入。如果otmfsType设备设置为bit 1，字体嵌入则不允许；如果bit 1被清除，则可实现嵌入；如果为bit 2，则嵌入是只读的。如果应用利用该函数获取非TrueType字体信息，GetFontData成员函数返回-1。

请参阅：CDC::GetOutlineTextMetrics, ::GetFontData, OUTLINETEXTMETRIC


 CDC::GetGlyphOutline

DWORD GetGlyphOutline(UINT nChar,UINT nFormat,LPGLYPHMETRIC lpgm,DWORD cbBuffer,LPVOID lpBuffer,const MAT2 FAR* lpmat2) const;

返回值：
如果cbBuffer为0或lpBuffer为NULL，则返回获取信息所需的缓冲区的大小和字节数。否则，成功返回正值；如果为-1，表示出错。

参数：
nChar | 指定字符，表明返回的信息。
nFormat | 指定函数返回信息的格式，它应为下列值之一，或为0：
值 | 含义
GGO_BITMAP | 返回字符位图。当函数返回时，lpBuffer指向的缓冲区包含1位/像素的位图，其行始于双倍字长的边界。
GGO_NATIVE | 返回使用设备单位的，用扫描的格式表示的曲线数据。指定值后，lpmat2指定的任何转换将被覆盖。当nFonmat值设置为0,函数填充GLYPHMETRICS结构但不返回边框符号数据。

lpgm | 在字符单元中描述字符放置情况的GLYPHMETRIC的指针。
cbBuffer | 含有函数拷贝的轮廓字符信息的缓冲区大小。如果值为0，且nFormat为GGO_BITMAP或GGO_NATIVE ，函数返回缓冲区需要的大小。
lpBuffer | 含有函数拷贝的轮廓字符信息的缓冲区指针。如果nFormat为GGO_NATIVE，在信息拷贝在TTPOLYGONHEADER和TTPOLYCURVE结构之中。如果值为0，且nFormat为GGO_BITMAP或GGO_NATIVE ，函数返回缓冲区需要的大小。
lpmat2 | 包含有字符转换矩阵的MAT2结构的之中。该函数不能为NULL，即使nFormat已被设置为GGO_NATIVE

说明：
从当前字体中轮廓字符中获取轮廓字符曲线或位图。应用通过在lpmat2指向的结构中指定一个2维矩阵，使位图格式中的字符能够旋转。字符外形以一组轮廓返回。每一轮廓由TTPOLYGONHEADER结构描述，并带有足够多的TTPOLYCURVE结构来描述。所有点都以POINTFX结构返回，并用绝对位置的非相对运动来表示。有TTPOLYGONHEADER结构的成员函数pfxStart给定的起点，也是轮廓的起点。TTPOLYCURVE结构可以是多线记录或样条记录。多线记录是一系列点，点之间的连线描述了字符外形。样条记录是TrueType所使用的四边曲线。

请参阅：
CDC::GetOutlineTextMetrics, ::GetGlyphOutLine, GLYPHMETRICS, TTPOLYGONHEADER, TTPOLYCURVE


 CDC::GetHalftoneBrush

static CBrush* PASCAL GetHalftoneBrush();

返回值：如果成功，则返回CBrush对象的指针，否则返回NULL。

说明：
调用该函数获得半色调画刷。半色调画刷使像素颜色在前景色与背景色之间交替，从而形成抖动色调色板。
下面就是半色调画刷创建的抖动色调色板的例子。

请参阅：CBrush


 CDC::GetKerningPairs

int GetKerningPairs(int nPairs,LPKERNINGPAIR lpkrnpair) const;

返回值：
如果成功，则返回字体中字距核心对数目或获取字距核心对数目。如果函数失败或字体无字距调整，则返回0。

参数：
nPairslpkrnpair | 指向的KERNINGPAIR结构的数目。函数不拷贝超过nPairs指定的字距核心对数目。
lpkrnpair | 函数返回时，接收字距核心对的KERNINGPAIR结构的数组的指针，数组应至少含有nPairs指定数目的结构。如果参数为NULL，函数返回字体中所有的字距核心对数目。

说明：获取指定设备上下文的当前字体中的字符字距核心对。

请参阅：::GetKerningPairs, KERNINGPAIR


 CDC::GetMapMode

int GetMapMode() const;

返回值：映射模式。

说明：获得当前映射模式。映射模式的描述，可参阅SetMapMode函数。

请参阅：CDC::SetMapMode, ::GetMapMode


 CDC::GetMiterLimit

float GetMiterLimit() const;

返回值：如果成功，则返回非零值，否则为0。

说明：返回设备上下文的斜角限制，在绘制具有斜角连接的几何直线时会用到斜角限制。

请参阅：CDC::SetMiterLimit, ::GetMiterLimit


 CDC::GetNearestColor

COLORREF GetNearestColor(COLORREF crColor) const;

返回值：设备能显示的离crColor最近的固体色的RGB值。

参数
crColor 指定要匹配的颜色。

说明：返回能最好地匹配给定逻辑色的固体色。给定设备必须能代表此颜色。

请参阅：::GetNearestColor, CPalette::GetNearestPaletteIndex


 CDC::GetOutlineTextMetrics

UNIT CDC::GetOutlineTextMetrics( UNITcbData,LPOUTLINETEXTMETRIC lpotm) const;

返回值：如果成功，则返回非零值，否则为0。

参数：
cbData | 指定包含返回信息的缓冲区的大小，用字节表示。
lpotm | OUTLINETEXTMETRIC结构数组的指针。如果为NULL，函数返回获取计量单位数据需要的缓冲区的大小。

说明：
获取TrueType字体的计量单位信息。OUTLINETEXTMETRIC结构包含大部分TrueType格式提供的字体计量单位信息。包括TEXTMETRIC结构。OUTLINETEXTMETRIC结构的最末4位成员是指向字符串的指针。应用应在其它成员需要的空间之外额外对这些字符串分配空间。因为系统没有为字符串的大小规定限制。分配存储空间最简单的方式是通过在第一次调用GetOutlineMetric时将lpotm设置为NULL，从而获得所需要的空间大小。

请参阅：::GetTextMetric, ::GetOutlineTextMetrics, CDC::GetTextMetrics


 CDC::GetOutputCharWidth

BOOL GetOutputCharWidth(UNIT nFirstChar,UNIT nLastChar,LPINT lpBuffer) const;

返回值：如果成功，则返回非零值，否则为0。

参数：
nFirstChar | 指定当前字体的一组连续字符的首字符。
nLastChar | 指定当前字体的一组连续字符的末字符。
lpBuffer | 指向缓冲区的指针，该缓冲区将接收使用当前字体的一组连续字符的宽度值。

说明：
使用输出设备上下文m_hDC，从当前字体中获取连续字符中个别字符宽度。例如：如果nFirstChar标记字母“a”， nLastChar标记字母“z”，函数将获得所有小写字符的宽度。函数存储了lpBuffer指向的缓冲区的值。该缓冲区必须足够大以容纳所有的宽度值。即是说，在上例中至少应有26个入口。如果连续字符组中的一个字符在某字体中不存在，则将缺省的字符宽度赋给它。

请参阅：CDC::GetCharWidth, CDC::m_hAttribDC, CDC::m_hDC, ::GetCharWidth


 CDC::GetOutputTabbedTextExtent

CSize GetOutputTabbedTextExtent(LPCTSTR lpszString,int nCount,int nTabPositions,LPINT lpnTabStopPositions) const ;
CSize GetOutputTabbedTextExtent( const CString& str, int nTabPositions,LPINT lpnTabStopPositions) const ;

返回值：CSize对象中字符串的尺寸信息（逻辑单位） 。

参数：
lpszString | 被测量的字符的指针。可以为该参数传递CString对象。
nCount | 字符串中的字符数。如果为-1，则计算其长度。
nTabPositions | lpnTabStopPositions指向的数组中的制表键停顿位置的数目。
lpnTabStopPositions | 指向整数数组的指针。该数组包含用逻辑单位表示的制表键停顿位置，制表键停顿必须按升序排列，最小的X值在数组中应列为第一位，不允许向后的制表键。
str | 包含待测量的字符串的CString 对象。

说明：
调用该成员函数来计算使用输出设备上下文m_hDC的字符串的宽度和高度。如果串中包含一到多个制表符，字符串宽度基于由lpnTabStopPositions指定的制表键停顿。函数使用当前被选用的字体来计算字符串的尺寸信息。当前剪切区域对于GetOutputTabbedTextExtent函数返回的宽度和高度不会发生偏移。某些设备不将字符放入规定的单元数组中。这样，串中字符扩展的数目有可能不等于字符串的扩展数目。如果nTabPositions为0且lpnTabStopPositions为NULL，制表键可扩展到8个平均字符宽度。如果nTabPositions为1，制表键停顿就会受到隔离，其距离是由lpnTabStopPositions指向的数组中的第一个值所指定的。如果lpnTabStopPositions指向多个值，在数组中为每一个值设置一个制表键停顿，一直到nTabPositions指定的数目为止。

请参阅：
CDC::GetTextExtent, CDC::m_hAttribDC, CDC::m_hDC, CDC::GetTabbedTextExtent, CDC::GetOutputTextExtent, CDC::TabbedTextOut, ::GetTabbedTextExtent, CSize


 CDC::GetOutputTextExtent

CSize GetOutputTextExtent (LPCTSTR lpszString , int nCount )const;
CSize GetOutputTextExtent (const CString& str) const;

返回值：CSize对象中字符串的尺寸信息（逻辑单位） 。

参数：
lpszString | 被测量的字符的指针。可以为该参数传递CString对象。
nCount | 字符串中的字符数。如果为-1，则计算其长度。
str | 包含待测量的字符串的CString 对象。

说明：
调用该成员函数 使用输出设备上下文m_hDC，并计算使用当前字体的一行文本的宽度和高度。当前剪切区域不会影响GetOutputTextExtent函数返回的宽度和高度。某些设备不将字符放入规定的单元数组中。这样，串中字符扩展的数目有可能不等于字符串的扩展数目。

请参阅：
CDC::GetTabbedTextExtent, CDC::GetOutputTabbedTextExtent, CDC::m_hAttribDC, CDC::m_hDC, CDC::GetTextExtent, CDC::SetTextJustification, CSize


 CDC::GetOutputTextMetrics

BOOL GetOutputTextMetrics(LPTEXTMETRIC lpMetric) const;

返回值：如果成功，则返回非零值，否则为0。

参数
lpMetric 接收计量单位信息的TEXTMETRIC结构的指针。

说明：使用输出设备上下文m_hDC获得当前字体的计量信息。

请参阅：
CDC::GetTextAlign, CDC::m_hAttribDC, CDC::m_hDC, CDC::GetTextMetrics, CDC::GetTextExtent, CDC::GetTextFace, CDC::SetTextJustification, ::GetTextMetrics


 CDC::GetPath

int GetPath(LPOINT lpPoints,LPBYTE lpTypes,int nCount) const;

返回值：
如果nCount参数非零，则返回列出的点数目。如果nCount为零，则返回路径中的点总数（要求GetPath没有向缓冲区中写入）。如果nCount非零且小于路径中的点数，则返回-1。

参数：
lpPoint | 含有直线端点和曲线控制点的POINT数据结构或CPoint对象的指针。
lpType | 放置顶点类型数组的指针。可取下列值之一：
PT_MOVETO | lpPoints中的对应点，开始分解图形。
PT_LINETO | 指定前一点，lpPoints中的对应点为直线的终点。
PT_BEZIERTO | lpPonits中的对应点为曲线的控制点或终点。PT_BEZIERTO类型总是三个一组地出现。路径中的点作为Bezier曲线的起点，前两个PT_BEZIERTO作为控制点，第三个PT_BEZIERTO作为终点。A PT_LINETO或PT_BEZIERTO类型可以用标记符号（如使用位运算符OR）加以联合，表示相应点是图形的最终点，且图形是闭合的。
PT_CLOSEFIGURE | 当对应直线或曲线绘制完成后，图形自动闭合。通过从直线或曲线终点到最后一个PT_MOVETO的对应点画线段的方法来关闭图形。

nCount 指定可能放在lpPoint数组中的POINT数据结构的总数。其值与可能放在lpType数组中的字节总数相同。

说明：
获得路径中直线终点和曲线控制点的坐标值，该路径在设备上下文内。设备上下文必须包含一个封闭的路径，路径中的点以逻辑坐标返回。在路径中，点以设备坐标形式存储，因此GetPath用相反的转换方法将设备坐标转换成逻辑坐标，在GetPath之前先调用FlattenPath成员函数，将曲线变成线段。

请参阅：CDC::FlattenPath, CDC::PolyDraw, CDC::WidenPath


 CDC::GetPixel

COLORREF GetPixel(int x,int y) const;
COLORREF GetPixel(POINT point) const;

返回值：对于函数的两种形式，则返回给定点的RGB值。如果不能在剪切区指定点的坐标，则返回-1。

参数：
x | 待检验的点的X逻辑坐标。
y | 待检验的点的Y逻辑坐标。
point | 待检验的点的X和Y逻辑坐标。

说明：
获得X，Y指定的像素的RGB值。该点必须在剪切区内。如果不在剪切区内，函数不起作用并返回-1。不是所有的设备都支持GetPixel函数。要了解更多的信息，请参阅GetDeviceCaps成员函数下RC_BITBLT的光栅能力。GetPixel成员函数有两种形式。第一种带两个坐标值；第二种带POINT结构或CPoint对象。

请参阅：CDC::GetDeviceCaps, CDC::SetPixel, ::GetPixel, POINT, CPoint


 CDC::GetPolyFillMode

int GetPolyFillMode() const;

返回值：如果函数成功，则返回多边形填充模式，ALTERNATE或WINDING。

说明：
获得当前多边形填充模式。关于多边形填充模式的描述，请参阅SetPolyFillMode成员函数。

请参阅：CDC::SetPolyFillMode, ::GetPolyFillMode


 CDC::GetROP2
int GetROP2() const;

返回值：绘图模式。模式值列表见SetROP2成员函数。

说明：
获得当前绘图模式。绘图模式指定了画笔的颜色和内部填充的对象与显示表面颜色是怎样组合的。

请参阅：CDC::GetDeviceCaps, CDC::SetROP2, ::GetROP2


 CDC::GetSafeHdc

HDC GetSafeHdc() const;

返回值：设备上下文的句柄。

说明：调用该成员函数得到输出设备上下文m_hDC，该成员函数可使用空指针。


 CDC::GetStretchBltMode

int GetStretchBltMode() const;

返回值：
如果成功，则返回当前位图的扩展模式STRETCH_ANDSCANS，STRETCH_DELETESCANS 或STRETCH_ORSCANS。

说明：
获得当前位图扩展模式。位图扩展模式定义了利用成员函数进行扩展、压缩时，位图信息是如何丢失的。STRETCH_ANDSCANS和STRETCH_ORSCANS模式典型应用于在黑白位图中保存前景像素。STRETCH_DELETESCANS则保留彩色位图中的颜色。

请参阅：CDC::StretchBlt, CDC::SetStretchBltMode, ::GetStretchBltMode


 CDC::GetTabbedTextExtent

CSize GetTabbedTextExtent(LPCTSTR lpszString,int nCount,intnTabPosition,LPINT lpnTabStopPosition) const;
CSize GetTabbedTextExtent(const CString& str,int nTabPosition,LPINTlpnTabStop Position) const;

返回值：CSize对象中字符串的尺寸信息。

参数：
lpszString | 字符串指针。可以为该参数传递CString对象。
nCount | 字符串中的字符数。如果为-1，则计算其长度。
nTabPositions | lpnTabStopPositions指向的数组中的制表键停顿位置的数目。
lpnTabStopPositions | 指向整数数组的指针。该数组包含用逻辑单位表示的制表键停顿位置，制表键停顿必须按升序排列，最小的X值在数组中应列为第一位，不允许向后的制表键。
str | 包含待绘制的字符串的CString 对象。

说明：
调用该成员函数来计算使用属性设备上下文m_hAttribDC的字符串的宽度和高度。如果串中包含一到多个制表符，字符串宽度基于由lpnTabStopPositions指定的制表键停顿。函数使用当前被选用的字体来计算字符串的尺寸信息。当前剪切区域对于GetOutputTabbedTextExtent函数返回的宽度和高度不会发生偏移。某些设备不将字符放入规定的单元数组中。这样，串中字符扩展的数目有可能不等于字符串的扩展数目。如果nTabPositions为0且lpnTabStopPositions为NULL，制表键可扩展到8个平均字符宽度。如果nTabPositions为1，制表键停顿就会受到隔离，其距离是由lpnTabStopPositions指向的数组中的第一个值所指定的。如果lpnTabStopPositions指向多个值，在数组中为每一个值设置一个制表键停顿，一直到nTabPositions指定的数目为止。

请参阅：
CDC::GetTextExtent, CDC::GetOutputTabbedTextExtent, CDC::GetOutputTextExtent, CDC::TabbedTextOut, ::GetTabbedTextExtent, CSize


 CDC::GetTextAlign

UINT GetTextAlign() const;

返回值：文本对齐标志的状态。可为下列值的组合：
· | TA_BASELINE | 指定X轴与外接矩形内选定字体的基线对齐。
· | TA_BOTTOM | 指定X轴与外接矩形的底部对齐。
· | TA_CENTER | 指定Y轴与外接矩形的中间对齐。
· | TA_LEFT | 指定Y轴与外接矩形的左边对齐。
· | TA_NOUPDATECP | 指定当前位置不被更新。
· | TA_RIGHT | 指定Y轴与外接矩形的右边对齐。
· | TA_TOP | 指定X轴与外接矩形的顶部对齐。
· | TA_UPDATECP | 指定当前位置被更新。

说明：
为设备上下文获得文本对齐标志的状态。
文本对齐标记决定了TextOut和ExtTextOut成员函数怎样使用文本对齐方式与字符起点相联系。
文本对齐方式标记不必是位标志，可以为0。
要检验标记是否为0，应用可采取如下步骤：
1.对标记使用位运算符OR，参见下面的组合：
·TA_LEFT,TA_CENTER和TA_RIGHT
·TA_BASELINE,TA_BOTTOM和TA_TOP
·TA_NOUPDATECP和TA_UPDATECP
2.对结果和GetTextAlign的返回值，应用位运算符AND。
3.检验结果与标记的一致性。

请参阅：
CDC::ExtTextOut, CDC::SetTextAlign, CDC::TextOut, ::GetTextAlign


 CDC::GetTextCharacterExtra

INT GetTextCharacterExtra() const;

返回值：字符间距大小。

说明：
获得当前字符间距值的设置。在向设备上下文书写文本时，GDI将其添加到每个字符上，包括中断符。

请参阅：CDC::SetTextCharacterExtra, ::GetTextCharacterExtra


 CDC::GetTextColor

COLORREF GetTextColor() const;

返回值：当前文本的RGB值。

说明：
获得当前文本颜色。文本颜色是字符的前景色，是由GDI文本输出函数TextOut，GetTextOut 和TabbedTextOut绘制的。

请参阅：
CDC::GetBkColor, CDC::GetBkMode, CDC::SetBkMode, CDC::SetTextColor, ::GetTextColor


 CDC::GetTextExtent

CSize GetTextExtent(LPCTSTR lpszString,int nCount) const;
CSize GetTextExtent(const CString& str) const;

返回值：CSize对象中字符串的尺寸信息。

参数：
lpszString | 字符串指针。可以为该参数传递CString对象。
nCount | 字符串中的字符数。
str | 包含指定字符的CString对象。

说明：
调用该成员函数计算使用当前字体的文本的高度与宽度，信息可从属性设备上下文m_nAttribDC处获取。当前剪切区域不会影响GetTextExtent函数返回的宽度和高度。某些设备不将字符放入规定的单元数组中（形成字距调整）。这样，串中字符扩展的数目有可能不等于字符串的扩展数目。

请参阅：
CDC::GetTabbedTextExtent, CDC::m_hAttribDC, CDC::m_hDC, CDC::GetOutputTextExtent, CDC::SetTextJustification, CSize


 CDC::GetTextFace

int GetTextFace(int nCount,LPTSTR lpszFacename) const;
int GetTextFace(CString& rString) const;

返回值：拷贝到缓冲区的字节数，不包括空中止符。如果出错，则返回0。

参数：
nCount | 指定缓冲区大小（以字节表示），如果字体名字长于参数指定的字节数，则对名字作截尾处理。
lpszFacename | 字体名字的缓冲区的指针。
rString | 一个CString对象的参考。

说明：
调用该成员函数将使用当前字体的字体名字拷贝到缓冲区中。字体名字被作为NULL终止字符串拷贝。

参阅CDC::GetTextMetrics,CDC::SetTextAlign,CDC::TextOut, ::GetTextFace


 CDC::GetTextMetrics

BOOL GetTextMetrics(LPTEXTMETRIC lpMetric) const;

返回值：如果成功，则返回非零值，否则为0。

参数
lpMetric 接收计量单位信息的TEXTMETRIC结构的指针。

说明：使用属性设备上下文接收当前字体的计量单位信息。

请参阅：
CDC::GetTextAlign, CDC::m_hAttribDC, CDC::m_hDC, CDC::GetOutputTextMetrics, CDC::GetTextExtent, CDC::GetTextFace, CDC::SetTextJustification, ::GetTextMetrics


 CDC::GetViewportExt

CSize GetViewportExt() const;

返回值：作为CSize对象的x和y扩展（设备单位）。

说明：从设备上下文的视图端口获得x和y扩展值。

请参阅：CDC::SetViewportExt, CSize, CDC::SetWindowExt


 CDC::GetViewportOrg

CPoint GetViewportOrg() const;

返回值：作为CPoint对象的视图端口的原始位置（设备单位）。

说明：获得与设备上下文有关的视图端口原始位置的x和y坐标。

请参阅：CDC::GetWindowOrg, CPoint, CDC::SetViewportOrg


 CDC::GetWindow

CWnd* GetWindow() const;

返回值：如果成功，则返回一个CWnd 对象，否则返回NULL。

说明：
返回与显示设备上下文有关的窗口。这是一个高级函数，例如在打开或打印预览时，成员函数不返回视图窗口，它总是返回与输出有关的窗口，使用给定设备上下文的输出函数。

请参阅：CWnd::GetDC, CWnd::GetWindowDC, ::GetWindow


 CDC::GetWindowExt

CSize GetWindowExt() const;

返回值：作为CSize对象的x和y扩展（逻辑单位）。

说明：获得与设备上下文有关的x和y扩展。

请参阅：CDC::SetWindowExt, CSize, CDC::GetViewportExt


 CDC::GetWindowOrg

CPoint GetWindowOrg() const;

返回值：作为CPoint对象的窗口的原始位置（设备单位） 。

说明：获得与设备上下文有关的窗口原始位置的x和y坐标。

请参阅：CDC::GetViewportOrg, CDC::SetWindowOrg, CPoint


 CDC::GrayString

virtual BOOL GrayString(
CBrush* pBrush,
BOOL(CALLBACK EXPORT* lpfnOutput) (HDC,LPARAM,int),
LPARAM lpData,
int nCount,
int x,
int y,
int nWidth,
int nHight
);

返回值：
如果字符串已经绘制，则返回非零值。否则如果TextOut函数或应用输出函数返回0，或者无足够内存空间来创建灰显位图，则返回0。

参数：
pBrush | 用来灰显的画刷的标识。
lpfnOutput | 指定绘制字符串的应用调用函数的地址。要了解更多的信息，请参阅Windows 的OutputFunc调用函数。如果该参数为NULL，系统使用TextOut函数绘制字符串。假定lpData为指向用于输出的字符串的长指针。
lpData | 传递给输出函数的数据的指针，如果lpfnOutput为NULL，lpData必须为指向用于输出的字符串的长指针。
nCount | 将要输出的字符数目。如果值为0，GrayString计算字符串的长度（假定lpData为该字符串的指针）。如果nCount为-1，lpfnOutput指向的函数返回0，显示图象，但并不变灰。
x | 字符串外接矩形的起始位置的X逻辑坐标。
y | 字符串外接矩形的起始位置的Y逻辑坐标。
nWidth | 指定该字符串外接矩形的宽度（逻辑单位）。如果nWidth为0，GrayString计算该区域的宽度，假定lpData是该字符串的指针。
nHight | 指定该字符串外接矩形的高度（逻辑单位）。如果nHight为0，GrayString计算该区域的高度，假定lpData是该字符串的指针。

说明：
通过将文本写入内存位图使位图变灰，再拷贝显示的方法绘制灰显文本，而不考虑选择的画刷和背景是什么。GrayString函数使用当前选择的字体，使用函数前，必须选择MM_TEXT映射模式。应用在支持固体色变灰的设备上无需调用GrayString成员函数就可绘制灰显文本。系统色COLOR_GRAYTEXT就是绘制无效文本灰显的固体色。应用能够调用GetSysColor函数来获取COLOR_GRAYTEXT的颜色值。如果颜色不是0（黑色），应用能调用SetTextColor成员函数来设定文本颜色，并直接画出字符串，如果获得颜色是黑色，应用必须调用GrayString来使文本灰显。如果lpfnOutput为NULL，GDI使用Windows的TextOut 函数，并假设lpData是指向用于输出的字符串的指针。如果用于输出的文本不能被TextOut成员函数处理（比如：字符串存储在位图中），应用必须提供它的输出函数。在返回Windows时还应注意到所有的调用函数必须捕获Microsoft Foundation异常。因为异常仍在调用函数、范围之内。关于异常的更多信息，请参阅联机文档“Visual C++程序员指南”中的“异常”。传递给GrayString的调用函数必须使用_stdcall调用约定，并使用_declspec进行输出。当框架处于预览模式时，GrayString成员函数调用会转为一个TextOut调用，回调函数不会被调用。

请参阅：::GetSysColor, CDC::SetTextColor, CDC::TextOut, ::GrayString


 CDC::HIMETRICtoDP

void HIMETRICtoDP(LPSIZE lpSize) const;

参数
lpSize 指向SIZE结构和CSize 对象的指针。

说明：
在从OLE中将HIMETRIC尺寸转换为像素时使用本函数。如果设备上下文的映射模式为MM_LOENGLISH,MM_HIENGLISH,MM_LOMETRIC或MM_HIMETRIC ，转换基于用物理英寸表示的像素数目。如果使用其它非受限制的映射模式，例如MM_Text，则转换基于用逻辑英寸表示的像素数目。

请参阅：CDC::LPtoDP, CDC::HIMETRICtoLP


 CDC::HIMETRICtoLP

void HIMETRICtoLP(LPSIZE lpSize) const;

参数
lpSize 指向SIZE结构或CSize 对象的指针。

说明：
调用本函数将HIMETRIC单位转换为逻辑单位，从OLE中获得HIMETRIC尺寸，并希望转换成应用原有的映射模式，可使用本函数。转换首先由HIMETRIC单位到像素，然后再将其转换为在设备上下文当前映射模式下的逻辑单位。注意设备窗口的扩展和视图端口会影响结果。

请参阅：CDC::HIMETRICtoDP, CDC::DPtoLP


 CDC::IntersectClipRect

virtual int IntersectClipRect(int x1,int y1 ,int x2,int y2);
virtual int IntersectClipRect(LPRECT lpRect)

返回值：新剪切区类型，可为下列值的任一种：
· | COMPLEXREGION | 新剪切区有覆盖的边界。
· | ERROR | 设备上下文无效。
· | NULLREGION | 新剪切区为空。
· | SIMPLEREGION | 新剪切区无覆盖边界。

参数：
x1 | 指定矩形左上角的X逻辑坐标。
y1 | 指定矩形左上角的Y逻辑坐标。
x2 | 指定矩形右下角的X逻辑坐标。
y2 | 指定矩形右下角的Y逻辑坐标。
lpRect | 指定矩形。可以为该参数传递RECT结构或CRect对象 。

说明：
通过当前区域和用x1，y1，x2，y2指定的矩形截取形成的新的剪切区。GDI剪切所有随后的输出，使其适合新的边界，宽度和高度不得超过32，767。

请参阅：::IntersectClipRect, CRect, RECT


 CDC::InvertRect

void InvertRect(LPRECT lpRect);

参数
lpRect 包含有用于反转的矩形的逻辑坐标的RECT结构的指针。可以为该参数传递CRect对象。

说明：
反转给定矩形的内容。反转是一个逻辑非操作，在黑白模式下，函数使白像素变黑，黑像素变白。在彩色显示中，反转取决于颜色是怎样形成的。对同一矩形两次调用InvertRect可使其恢复为以前的颜色。如果矩形为空，则不绘制什么。

请参阅：CDC::FillRect, ::InvertRect, CRect, RECT


 CDC::InvertRgn

BOOL InvertRgn(CRgn* pRgn);

返回值：如果成功，则返回非零值，否则为0。

参数
pRgn 含有用于反转的区域标识，该区域的坐标为设备单位。

说明：
反转由pRgn指定的区域颜色。在黑白模式下，函数使白像素变黑，黑像素变白。在彩色显示中，反转取决于颜色是怎样形成的。

请参阅：
CDC::FillRgn, CDC::PaintRgn, CRgn, InvertRgn


 CDC::IsPrinting

BOOL IsPrinting() const;

返回值：如果CDC对象是打印机DC，则返回非零值，否则为0。


 CDC::LineTo

BOOL LineTo(int x,int y );
BOOL LineTo(POINT point)

返回值：如果直线已经绘制，则返回非零值，否则为0。

参数：
x | 直线终点的X逻辑坐标。
y | 直线终点的Y逻辑坐标。
point | 指定直线终点，可以为该参数传递POINT结构或CPoint对象。

说明：
从当前位置开始划线到但并不包括由x和y（或point）指定的点。直线由选定的画笔绘制，当前位置设置为x,y或point。

请参阅：CDC::MoveTo, CDC::GetCurrentPosition, ::LineTo, CPoint, POINT


 CDC::LPtoDP

void LPtoDP(LPPOINT lpPoints,int nCount=1) const;
void LPtoDP(LPRECT lpRect ) const;
void LPtoDP(LPSIZE lpSize ) const;

参数：
lpPoints | 点数组的指针，数组中的每个点是一个POINT结构或CPoint对象 。
nCount | 数组中点的数目。
lpRect | RECT结构或CRect对象的指针，在一般情况下，该参数用于将矩形由逻辑单位向设备单位映射。
lpSize | SIZE结构和CSize对象的指针。

说明：
将逻辑单位转换为设备单位。函数将GDI逻辑坐标系统中的点的坐标或尺寸信息向设备坐标系统映射。转换取决于当前映射模式和设备窗口与视图端口的原始设置与扩展。点的x、y坐标是2位的带符号整数，由-32，768到32，767。在映射模式可能导致大于这些限制的情况下，系统分别将值设置为-32，768和32，767。

请参阅：
CDC::DPtoLP, CDC::HIMETRICtoLP, ::LPtoDP, CDC::GetWindowOrg, CDC::GetWindowExt


 CDC::LPtoHIMETRIC

void LPtoHIMETRIC(LPSIZE lpSize ) const;

参数
lpSize SIZE结构和CSize对象的指针。

说明：
调用该成员函数将逻辑单位转换为HIMETRIC单位。在为OLE对象赋予HIMETRIC尺寸，需要从应用原有映射模式进行转换时，可使用该函数。注意设备窗口和视图端口将影响结果。转换首先由逻辑单位转为设备上下文当前映射模式下的像素，然后再将它们转为HIMETRIC单位。

请参阅：CDC::HIMETRICtoLP, CDC::LPtoDP, CDC::DPtoHIMETRIC


 CDC::MaskBlt

BOOL MaskBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, CBitmap& maskBitmap, int xMask, int yMask, DWORD dwRop );

返回值：如果成功，则返回非零值，否则为0。

参数：
x | 目标矩形的X逻辑坐标。
y | 目标矩形的Y逻辑坐标。
nWidth | 目标矩形和源位图的宽度（逻辑单位）。
nHeight | 目标矩形和源位图的高度（逻辑单位）。
pSrcDC | 拷贝位图的设备上下文标识，如果dwRop参数指定了一个没有源对象的光栅操作，该参数必须设置为0。
xSrc | 源位图左上角的X逻辑坐标。
ySrc | 源位图左上角的Y逻辑坐标。
maskBitmap | 在源设备上下文中黑白掩码位图与彩色位图的标识。
xMaskmask | Bitmap设定的掩码位图的水平像素偏移量。
yMaskmask | Bitmap设定的掩码位图的水平像素偏移量。
dwRop | 指定函数用于控制源数据和目标数据的前景和背景光栅操作代码。背景光栅操作代码存放在该值的高字区的高字节中。前景光栅操作代码存放在该值的低字区的低字节中。宏MAKEROP4实现了背景与前景光栅操作代码的联合。请参阅说明部分对前景和背景的讨论。一般光栅操作代码列表见BitBlt成员函数。

说明：
使用给定的掩码和光栅操作组合源位图和目标位图中的彩色数据。
maskBitmap设置的掩码值为1，表明dwRop指定的前景光栅操作代码应在该位置上得以应用。
maskBitmap设置的掩码值为0，表明dwRop指定的背景光栅操作代码应在该位置上得以应用。
如果光栅操作需要源对象，掩码矩形必须覆盖源矩形，否则会导致失败。如果光栅操作不需要源对象，掩码矩形必须覆盖目标矩形，否则会导致失败。 当调用该函数时，源设备上下文中的旋转和修剪转换能起作用，则出错。但允许其它的类型转换。如果源位图、模式位图和目标位图的格式不一致，函数将使模式或源位图，或使二者都与目标位图格式匹配。如果掩码位图不是黑白位图，则出错。如果源设备上下文中标识了元文件设备上下文，在记录元文件时会出错（此时函数返回0）。不是所有设备都支持MaskBlt，应用可调用GetDeviceCaps来决定是否支持该函数，如果没有提供掩码位图，函数则与BitBlt行为一致，所有前景光栅操作代码。在源设备上下文的位图中，掩码位图的像素偏移与（0，0）点映射。在掩码位图包含一组位图时，这一点很有用。应用通过调整送往MaskBlt的像素偏移和矩形尺寸，就可以很容易地应用任一掩码。

请参阅：
CDC::BitBlt, CDC::GetDeviceCaps, CDC::PlgBlt, CDC::StretchBlt, ::MaskBlt


 CDC::MoveTo

CPoint MoveTo(int x ,int y );
CPoint MoveTo(POINT point );

返回值：返回CPoint 对象的X和Y坐标的前一次取值。

参数：
x | 指定新位置的X逻辑坐标。
y | 指定新位置的Y逻辑坐标。
point | 指定新位置。可以为该参数传递POINT结构或CPoint对象。

说明：移到由x和y或（point）指定的当前位置。

请参阅：CDC::GetCurrentPosition, CDC::LineTo, CPoint, POINT


 CDC::OffsetClipRgn

virtual int OffsetClipRgn(int x ,int y );
virtual int OffsetClipRgn(SIZE size);

返回值：新区域类型。可以为下列值之一：
· | COMPLEXREGION | 剪切区有覆盖的边界。
· | ERROR | 设备上下文无效。
· | NULLREGION | 剪切区为空。
· | SIMPLEREGION | 剪切区无覆盖边界。

参数：
x | 指定向左或右移动的逻辑单位数。
y | 指定向上或下移动的逻辑单位数。
size | 指定偏移量。

说明：在设备上下文的剪切区中移动指定的偏移量。沿X轴移动x单位，沿Y轴移动y单位。

请参阅：CDC::SelectClipRgn, ::OffsetClipRgn


 CDC::OffsetViewportOrg

virtual CPoint OffsetViewportOrg(int nWidth ,int nHeight );

返回值：返回CPoint对象，它是用设备单位表示的视图端口的原始位置。

参数：
nWidth | 在当前位置X坐标上添加的设备单位数目。
nHeight | 在当前位置Y坐标上添加的设备单位数目。

说明：相对于视图端口当前位置调整坐标值。

请参阅：
CDC::GetViewportOrg, CDC::OffsetWindowOrg, CDC::SetViewportOrg, CPoint


 CDC::OffsetWindowOrg

CPoint OffsetWindowOrg(int nWidth ,int nHeight );

返回值：返回CPoint对象的窗口的原始位置，它是用逻辑单位表示的。

参数：
nWidth | 在当前位置X坐标上添加的设备单位数目。
nHeight | 在当前位置Y坐标上添加的设备单位数目。

说明：相对于窗口当前位置调整坐标值。

参阅CDC::GetWindowOrg,CDC::OffsetVewportOrg,CDC::OffsetWindowOrg,CPoint


 CDC::PaintRgn

BOOL PaintRgn(CRgn* pRgn);

返回值：如果成功，则返回非零值，否则为0。

参数
pRgn 用于填充的区域的标识，该区域坐标用设备单位表示。

说明：使用当前画刷填充pRgn指定区域。

请参阅：CDC::SelectObject, CDC::FillRgn, ::PaintRgn, CRgn


 CDC::PatBlt

BOOL PatBlt(int x, int y, int nWidth, int nHeight, DWORD dwRop);

返回值：如果成功，则返回非零值，否则为0。

参数：
x | 即将接收模式的矩形的左上角的X逻辑坐标。
y | 即将接收模式的矩形的左上角的Y逻辑坐标。
nWidth | 即将接收模式的矩形的宽度（逻辑单位）。
nHeight | 即将接收模式的矩形的高度（逻辑单位）。
dwRop指定光栅操作代码。 光栅操作代码描述了GDI是怎样将涉及当前画刷、可能存在的源位图、目标位图的输出操作与颜色组合在一起，参数可以取以下值：
· | PATCOPY | 拷贝模式至目标位图。
· | PATINVERT | 使用布尔XOR运算符组合模式与目标位图。
· | DSTINVERT | 反转目标位图。
· | BLACKNESS | 使所有输出变黑。
· | WHITENESS | 使所有输出变白。

说明：
在设备上创建模式。将设备已有的模式与选择的画刷组合。dwRop 指定的光栅操作代码说明了模式是怎样组合的。本函数列出的光栅操作只是全部256种光栅操作代码的子集。带有源对象的光栅操作代码并不被使用。不是所有的设备上下文支持PatBlt函数。可调用带RASTERCAPS索引的GetDeviceCaps成员函数决定设备上下文是否支持PatBlt，并检验RC_BITBLT标记的返回值。

请参阅：CDC::GetDeviceCaps, ::PatBlt


 CDC::Pie

BOOL Pie(int x1 ,int y1 ,int x2,int y2,int x3 ,int y3 ,int x4 ,int y4);
BOOL Pie(LPRECT lpRect,POINT ptStart ,POINT ptEnd);

返回值：如果成功，则返回非零值，否则为0。

参数：
x1 | 指定外接矩形左上角的X逻辑坐标。
y1 | 指定外接矩形左上角的Y逻辑坐标。
x2 | 指定外接矩形右下角的X逻辑坐标。
y2 | 指定外接矩形右下角的Y逻辑坐标。
x3 | 指定弧起点的X逻辑坐标。
y3 | 指定弧起点的Y逻辑坐标。
x4 | 指定弧终点的X逻辑坐标。
y4 | 指定弧终点的Y逻辑坐标。
lpRect | 指定外接矩形，可以为该参数传递RECT结构或CRect对象。
ptStart | 指定弧起点，可以为该参数传递POINT结构或CPoint对象 。
ptEnd | 指定弧终点，可以为该参数传递POINT结构或CPoint对象。

说明：
画一个饼图。由一段椭圆弧形成，其中心点和两个端点已经用线段连接。弧中心是由x1，y1，x2，y2（或lpRect）指定的外接矩形的中心。弧的起点和终点由x3，y3，x4，y4（或ptStart和 ptEnd）指定。弧由选定笔沿逆时针绘制，另外还有两条从端点到中心点的连线。饼图区域由当前画刷填充。如果x3等于x4且y3等于y4，则结果为一个椭圆。它只有一条中心点与点（x3,y3）或点（x4,y4）的连线。该函数绘制的图形延伸到但不包括右边和底部坐标，即图形高度为y2-y1，宽度为x2-x1，外接矩形的宽度和高度都必须大于2单位且小于32,767单位。

请参阅：CDC::Chord, ::Pie, RECT, POINT, CRect, CPoint


 CDC::PlayMetaFile

BOOL PlayMetaFile(HMETAFILE hMF);
BOOL PlayMetaFile(HENHMETAFILE hEnhMetaFile,LPCRECTlpBounds);

返回值：如果成功，则返回非零值，否则为0。

参数：
hMF | 要播放的元文件。
hEnhMetaFile | 增强元文件的标识。
lpBounds | RECT结构或CRect对象的指针，它们包含用来显示图形的外接矩形坐标，坐标均用逻辑单位表示。

说明：
在设备上下文中播放指定的元文件内容，文件可播放任意次数。PlayMetaFile的第二种版本，可以显示用增强型元文件存储的图片。当应用调用PlayMetaFile的第二种版本时，Windows 使用增强元文件头标中的图片框架，使图片映射到lpBounds所指向的矩形之中（在调用PlayMetaFile之前，该图片可以被选择或剪切），图片包括矩形边界上的点。在播放增强格式元文件之前在输出设备上定义剪切区，可以剪切增强格式元文件。如果增强元文件中包含一个可选用的调色板，这样，在调用PlayMetaFile第二种版本之前，在输出设备上设置调色板，应用便可获得连续色。使用::PlayEnhMetaFile函数可以获得调色板。通过调用PlayMetaFile第二种版本并播放源增强元文件到设备上下文中，可使增强元文件嵌入新创建的增强元文件中。函数保存了输出设备上下文的状态，所有由增强元文件产生但不能由其删除的对象，可以由该函数完成。为停止该函数，应用可以从另一线程中调用::CancelDC函数来中止操作，此情况下，函数返回0。

请参阅：
::CancelDC, ::GetEnhMetaFileHeader, ::GetEnhMetaFilePaletteEntries, ::SetWorldTransform, ::PlayEnhMetaFile, ::PlayMetaFile


 CDC::PlgBlt

BOOL PlgBlt(POINT lpPoint ,CDC* pSrcDC,int xSrc ,int ySrc , intnWidth ,int nHeight, CBitmap& maskBitmap,int xMask ,int yMask);

返回值：如果成功，则返回非零值，否则为0。

参数：
lpPoint | 逻辑空间中包含三个点的数组的指针。它指定了一个目标平行四边形的三个顶点。源矩形的左上角与数组中的第一个点映射，右上角与第二个点映射，第三个点指向左下角。源矩形的右下角与平行四边形未能明确表示的第四点映射。
pSrcDC | 源设备上下文的标识。
xSrc | 用逻辑单位表示的源矩形左上角的X坐标。
ySrc | 用逻辑单位表示的源矩形左上角的Y坐标。
nWidth | 用逻辑单位表示的源矩形的宽度。
nHeight | 用逻辑单位表示的源矩形的高度。
maskBitmap | 标识用以屏蔽源矩形颜色的可选的黑白位图。
xMask | 黑白位图左上角的X坐标。
yMask | 黑白位图左上角的Y坐标。

说明：
对源设备上下文指定的矩形到给定设备上下文中平行四边形的颜色数据实行位块（bit-block）转换。如果位掩码的句柄代表一个有效的位图，函数利用该函数对源矩形的颜色数据位进行屏蔽。平行四边形的第四个顶点（D）是将前三个点（A，B，C）定义为矢量后，经D=B+C-A计算得到。如果存在位掩码1，表示源像素色将会拷贝给目标位图，为0表示目标位图的像素不会被改变。如果掩码矩形小于源矩形和目标矩形，函数将复制掩码模式。在源设备上下文中允许度量形式转换和解释。但不允许选择和剪切转换，掩码位图不是黑白位图，出错。目标设备上下文的扩展模式决定了像素如何被扩展或压缩。如果源设备上下文标识了增强元文件设备上下文，记录增强元文件时，则出错。依据目标设备上下文转换目标坐标，依据源设备上下文转换源坐标。如果源转换中有选择或剪切操作，则返回错误。如果目标和源矩形的颜色格式不一致, PlgBlt将转换源矩形使其与目标矩形匹配。不是所有设备都支持PlgBlt。要了解更多的信息，请参阅CDC::GetDeviceCaps 成员函数中RC_BITBLT光栅能力的描述。如果源设备上下文和目标设备上下文代表的设备不兼容，PlgBlt返回错误。

请参阅：
CDC::BitBlt, CDC::GetDeviceCaps, CDC::MaskBlt, CDC::StretchBlt, ::Set StretchBltMode, ::PlgBlt


 CDC::PolyBezier

BOOL PolyBezier(const POINT* lpPoints ,int nCount);

返回值：如果成功，则返回非零值，否则为0。

参数：
lpPoints | 含有曲线控制点和端点的POINT数据结构或CPoint对象。
nCount | lpPoints数组中点的数目。其值应为曲线数目的3倍以上，因为每条Bezier曲线需要2个控制点和一个终点，初始曲线还需要一个起点。

说明：
绘制一到多条Bezier曲线。使用lpPoints指定的终点和控制点，函数可以画出立体的Bezier曲线。 第一条曲线以第二点和第三点为控制点，将第一点和第四点连接而绘成的。其后每条曲线都需要三个点：以前一条曲线的终点为起点，其后两点为控制点，第三个点则作为终点。PolyBezier函数既不能使用也不能更新当前位置，图形未被填充。函数使用当前画笔绘制直线。

请参阅：CDC::PolyBezierTo, ::PolyBezier


 CDC::PolyBezierTo

BOOL PolyBezierTo(const POINT* lpPoints ,int nCount);

返回值：如果成功，则返回非零值，否则为0。

参数
lpPoints | 含有控制点和端点的POINT数据结构或CPoint对象。
nCount | lpPoints数组中点的数目。其值应为曲线数目的3倍以上，因为每条Bezier曲线需要2个控制点和一个终点。

说明：
绘制一到多条Bezier曲线。使用lpPoints指定的终点和控制点，函数可以画出立体的Bezier曲线。第一条曲线以第二点和第三点为控制点，将第一点和第四点连接而绘成的。其后每条曲线都需要三个点：以前一条曲线的终点为起点，其后两点为控制点，第三个点则作为终点。PolyBezierTo将当前位置移到最后一条Bezier曲线的终点，图形未被填充。函数使用当前画笔绘制直线。

请参阅：CDC::Move, CDC::PolyBezier, ::PolyBezierTo


 CDC::PolyDraw

BOOL PolyDraw(const POINT* lpPoints,const BYTE* lpTypes,int nCount);

返回值：如果成功，则返回非零值，否则为0。

参数：
lpPoint | 指向POINT数据结构或CPoint对象的指针。数组中含有每条线段的终点和Bezier曲线的控制点和终点。
lpTypes | 说明lpPoint数组中各点如何使用数组的指针。可为下列值之一：
PT_MOVETO | 由该点开始一个断开连接的图形，该点变成新的当前位置。
PT_LINETO | 从当前位置到该点绘制直线，然后该点变成新的当前位置。
PT_BEZIERTO | 为Bezier曲线指定控制点或终点。PT_BEZIERTO类型总是三个点一组出现。当前位置作为Bezier曲线的起始点。前两个PT_BEZIERTO点作为控制点，第三点作为终点，并成为新的当前位置。如果没有三个连续的PT_BEZIERTO点，则出现错误。PT_LINETO和PT_BEZIERTO类型可以使用位运算符OR加以联合，表明相应点为图形的最后一点，且图形是闭合的。
PT_CLOSEFIGURE | 具有PT_LINETO或PT_BEZIERTO类型的点经绘制完成后，图形自动闭合。绘制一条从该点到最近一次使用的PT_MOVETO后MoveTo点的直线。使用位运算符OR，该标志与PT_LINETO类型一起用于一条直线，或与PT_BEZIERTO类型的终点一起用于Bezier曲线。将闭合直线的终点改为当前位置。

nCount lpPoint数组的点的总数，与lpTypes数组中的字节数相同。

说明：
绘制一组线段和Bezier锯齿线。此函数可用来绘制分离的图画，而不用连续调用CDC::MoveTo,CDC::LineTo和CDC::PolyBezierTo成员函数。线段和Bezier锯齿线用当前画笔绘制，并且不填充图画。如果通过调用CDC::BeginPath启动一条活动路径，那么PolyDraw将加入此路径中。lpPoints数组和lpTypes中包含的点表明是否每一个点是CDC::MoveTo,CDC::LineTo或CDC::BezierTo操作的一部分。也可以关闭图画。此函数将更新当前位置。

请参阅：
CDC::BeginPath, CDC::EndPath, CDC::LineTo, CDC::MoveTo, CDC::PolyBezierTo, CDC::PolyLine, ::PolyDraw


 CDC::Polygon

BOOL Polygon(LPPOINT lpPoints ,int nCount);

返回值：如果成功，则返回非零值，否则为0。

参数：
lpPoints | 多边形顶点数组的指针。可以为该参数传递POINT结构或CPoint对象。
nCount | 数组中的顶点数目。

说明：
使用当前画笔绘制由直线连接的包含两个以上顶点的多边形。如果有必要，直线连接末顶点与起始顶点，从而自动关闭闭合图形。通过GetPolyFillMode和SetPolyFillMode 成员函数可以获得或设置当前的多边形填充模式。

请参阅：
CDC::GetPolyFillMode, CDC::PolyLine, CDC::PolyPolygon, CDC::SetPolyFillMode, CPoint, ::PolyGon


 CDC::PolyLine

BOOL PolyLine(LPPOINT lpPoints ,int nCount);

返回值：如果成功，则返回非零值，否则为0。

参数：
lpPoints | 用于连接的POINT结构或CPoint对象的指针。
nCount | 数组中的点的数目。其值不小于2。

说明：
绘制连接lpPoints指定点的一组线段。使用当前画笔在起始点与下一点之间绘制直线。与LineTo成员函数不同，PolyLine函数既不使用也不更新当前位置。详情请参阅联机文档“Win32 SDK程序员参考”中的“::PolyLine”。

请参阅：CDC::LineTo, CDC::Polygon, POINT, CPoint


 CDC::PolyLineTo

BOOL PolyLineTo(const POINT* lpPoints ,int nCount );

返回值：如果成功，则返回非零值，否则为0。

参数：
lpPoints | POINT数据结构的数组的指针。数组含有直线顶点。
nCount | 数组中的点的数目。

说明：
画一到多条从lpPoints指定的第一点到当前位置的直线。函数增加的直线是从前一直线的终点与lpPoints指定的下一个点相连而成。PolyLineTo将当前位置移到最后一条直线的终点。如果用该函数绘制的直线形成了一个闭合图形，该图形不会被填充。

请参阅：CDC::LineTo, CDC::PolyLine, CDC::MoveTo, CDC::PolyLineTo


 CDC::PolyPolygon

BOOL PolyPolygon(LPPOINT lpPoints ,LPINT lpPolyCount,int nCount);

返回值：如果成功，则返回非零值，否则为0。

参数：
lpPoints | POINT结构或CPoint对象数组的指针。数组定义了多边形的顶点。
lpPolyCount | 整数数组的指针。代表了lpPoints数组中一个多边形拥有的点数。
nCount | lpPolyCounts数组中的入口数目。它指定了要绘制的多边形的数目，其值不得小于2。

说明：
创建两个以上的使用当前多边形填充模式填充的多边形。这些多边形可能是非连续或是覆盖的。PolyPolygon函数创建的多边形必须是闭合的。与Polygon成员函数创建的多边形不同，PolyPolygon创建的多边形不会自动闭合。函数创建两个以上的多边形。如果只建立一个，应用使用Polygon成员函数。利用GetPolyFillMode和SetPolyFillMode成员函数可以获取或设置当前多边形填充模式。

请参阅：
CDC::GetPolyFillMode, CDC::PolyLine, CDC::Polygon, CDC::SetPolyFillMode, ::PolyPolygon, POINT, CPoint


 CDC::PolyPolyLine

BOOL PolyPolyLine(const POINT* lpPoints ,const DWORD* lpPolyPoints,int nCount );

返回值：如果成功，则返回非零值，否则为0。

参数：
lpPoints | 含有折线的结构数组的指针。折线的指定是连续的。
lpPolyPoints | 变量数组的指针，数组指定了lpPoints数组中相应多边形的点的数目，每个入口数不得小于2。
nCount | lpPolyPoints数组的总数。

说明：
使用当前画笔绘制多组相连的线段。由线段形成的图形不被填充。函数不使用或更新当前位置。

请参阅：CDC::PolyLine, CDC::PolyLineTo, ::PolyPolyLine


 CDC::PtVisible

virtual BOOL PtVisible(int x ,int y ) const;
virtual BOOL PtVisible(POINT point) const;

返回值：如果指定点在剪切区内，则返回非零值，否则为0。

参数：
x | 指定点的X逻辑坐标。
y | 指定点的Y逻辑坐标。
point | 用逻辑坐标指定的点。可以为该参数传递POINT结构或CPoint对象。

说明：决定给定点是否在设备上下文的剪切区内。

请参阅：CDC::RectVisible, CDC::SelectClipRgn, CPoint, ::PtVisible, POINT


 CDC::QueryAbort

BOOL QueryAbort() const;

返回值：
如果打印继续或者没有程序失败，则返回非零值；如果打印作业停止，则返回0。返回值由放弃（abort）函数提供。

说明：为打印应用调用由SetAbortProc成员函数安装的放弃程序，并查询打印是否中止。

请参阅：CDC::SetAbortProc


 CDC::RealizePalette

UNIT RealizePalette();

返回值：
返回逻辑调色板中的入口映射到系统调色板的不同入口数目。它表示从逻辑调色板最近使用以来，该函数重新映射的入口数目。

说明：
从当前逻辑调色板向系统调色板映射的入口数。逻辑调色板在应用和系统之间起缓冲区的作用，允许应用使用所需要的足够多的颜色，而不影响自身显示或其它窗口的显示颜色。当窗口拥有输入焦点并调用RealizePalette时，Windows 保证窗口显示所有需要的颜色，可以达到屏幕可能同时显示的最大数值。Windows 通过与已有颜色的匹配显示窗口调色板中没有的颜色。另外，Windows 调用函数获得尽可能靠近的已有颜色以匹配失效窗口所需的颜色，这在失效窗口中明显减少了不必要的变化。

请参阅：CDC::SelectPalette, CPalette, ::RealizePalette


 CDC::Rectangle

BOOL Rectangle(int x1 ,int y1 ,int x2 ,int y2 );
BOOL Rectangle(LPCRECT lpRect);

返回值：如果成功，则返回非零值，否则为0。

参数：
x1 | 指定矩形左上角的X逻辑坐标。
y1 | 指定矩形左上角的Y逻辑坐标。
x2 | 指定矩形右下角的X逻辑坐标。
y2 | 指定矩形右下角的Y逻辑坐标。
lpRect | 用逻辑单位表示的矩形。可以为该参数传递RECT结构或CRect对象。

说明：
利用当前笔绘制矩形，内部由当前画刷填充。该函数绘制的图形延伸到但不包括右边和底部坐标，即图形高度为y2-y1，宽度为x2-x1，外接矩形的宽度和高度都必须大于2单位且小于32,767单位。

请参阅：::Rectangle, CDC::PolyLine, CDC::RoundRect, RECT, CRect


 CDC::RectVisible

virtual BOOL RectVisible(LPCRECT lpRect) const;

返回值：如果给定矩形的任一部分在剪切区内，则返回非零值，否则为0。

参数
lpRect 包含指定矩形的RECT结构或CRect对象（逻辑单位）的指针。

说明：决定给定矩形的任一部分是否在设备上下文的剪切区内。

请参阅：CDC::PtVisible, CDC::SelectClipRgn, CRect, ::RectVisible, RECT


 CDC::ReleaseAttribDC

virtual void ReleaseAttribDC();

说明：
调用该成员函数设置m_hAttribDC为NULL，这不会导致出现Detach。只有输出设备上下文连接在CDC对象上，也只有它能够与之分离。

请参阅：
CDC::SetOutputDC, CDC::SetAttribDC, CDC::ReleaseOutputDC, CDC::m_hAttribDC


 CDC::ReleaseOutputDC

virtual void ReleaseOutputDC();

说明：
调用该成员函数设置m_hDC成员为NULL，当输出设备上下文连接在CDC对象上，才调用这个成员函数。使用Detach成员函数分离输出设备上下文。

请参阅：
CDC::SetAttribDC, CDC::SetOutputDC, CDC::ReleaseAttribDC, CDC::m_hDC


 CDC::ResetDC

BOOL ResetDC(const DEVMODE* lpDevmode);

返回值：如果成功，则返回非零值，否则为0。

参数
lpDevmode Windows DEVMODE结构指针。

说明：
调用该成员函数更新绑定在CDC对象上的设备上下文。设备上下文由Windows DEVMODE结构指定的信息加以更新。这个成员函数只更新属性设备上下文。应用调用ResetDC成员函数的典型情况是在Windows 在处理一条WM_DEVMODECHANGE信息的时候。也可使用该函数在打印文件时改变纸位或纸箱。不能利用该成员函数改变驱动程序、设备名称和输出端口。当用户改变端口连接或设备名称时，必须删除原始设备上下文并利用新信息创建新的设备上下文。在调用该成员函数之前，必须保证所有选入设备上下文的对象（不包括存储对象）被选出。

请参阅：CDC::m_hAttribDC, ::ResetDC, WM_DEVMODECHANGE, DEVMODE


 CDC::RestoreDC

virtual BOOL RestoreDC(int nSavedDC);

返回值：如果成功，则返回非零值，否则为0。

参数：
nSavedDC 指定用于恢复的设备上下文，可以是前一次SaveDC调用的返回值。如果nSavedDC为-1，最近被保存的设备上下文被恢复。

说明：
将设备上下文恢复为nSavedDC指定的上一次的状态。RestoreDC通过将SaveDC成员函数以前调用生成的状态信息从栈中弹出的方法来恢复设备上下文。栈中可含有多个设备上下文的状态信息。如果nSavedDC指定的设备上下文不在栈顶位置，RestoreDC删除所有栈顶和nSavedDC指定设备上下文之间的状态信息。删除信息丢失。

请参阅：CDC::SaveDC, ::RestoreDC


 CDC::RoundRect

BOOL RoundRect(int x1 ,int y1 ,int x2 ,int y2 ,int x3 ,int y3 );
BOOL RoundRect(LPCRECT lpRect ,POINT point );

返回值：如果成功，则返回非零值，否则为0。

参数：
x1 | 指定矩形左上角的X逻辑坐标。
y1 | 指定矩形左上角的Y逻辑坐标。
x2 | 指定矩形右下角的X逻辑坐标。
y2 | 指定矩形右下角的Y逻辑坐标。
x3 | 用于绘制圆角的椭圆宽度（逻辑单位）。
y3 | 用于绘制圆角的椭圆高度（逻辑单位）。
lpRect | 逻辑单位表示的外接矩形（逻辑单位）。可以为该参数传递RECT结构或CRect对象 。
point | point的X坐标表示绘制圆角的椭圆宽度，point的Y坐标表示绘制圆角的椭圆高度。可以为该参数传递POINT结构或CPoint对象 。

说明：
绘制圆角矩形，内部由当前画刷填充。该函数绘制的图形延伸到但不包括右边和底部坐标，即图形高度为y2-y1，宽度为x2-x1，外接矩形的宽度和高度都必须大于2单位且小于32,767单位。

请参阅：CDC::Rectangle, ::RoundRect, CRect, RECT, POINT, CPoint


 CDC::SaveDC

virtual int SaveDC();

返回值：
表明所保存的设备上下文的整数，如果出错，则返回0。调用RestoreDC恢复设备上下文时要用到这个返回值。

说明：
保存当前的设备上下文信息。将状态（如剪切区、选中的对象、映射模式）拷贝到Windows负责保存的栈中。使用RestoreDC可以恢复保存的设备上下文。

请参阅：CDC::RestoreDC, ::SaveDC


 CDC::ScaleViewportExt

virtual CSize ScaleViewportExt(int xNum , int xDenom ,int yNum ,int yDenom );

返回值：返回一个CSize对象，是用设备单位表示的前一次视图端口扩展。

参数：
xNum | 指定当前X扩展的倍数。
xDenom | 去除xNum参数扩展后的结果的值。
yNum | 指定当前Y扩展的倍数。
yDenom | 去除yNum参数扩展后的结果的值。

说明：
根据当前值调整视图端口扩展。公式如下：xNewVE = ( xOldVE * xNum ) /xDenomyNewVE = ( yOldVE * yNum ) /yDenom新的视图端口扩展值是将当前扩展值乘以分子后除以分母得到的。

请参阅：CDC::GetViewportExt, CSize


 CDC::ScaleWindowExt

virtual CSize ScaleWindowExt(int xNum , int xDenom ,int yNum ,intyDenom );

返回值：返回一个CSize对象，是用设备单位表示的前一次窗口扩展。

参数：
xNum | 指定当前X扩展的倍数。
xDenom | 去除xNum扩展后的结果的值。
yNum | 指定当前Y扩展的倍数。
yDenom | 去除yNum扩展后的结果的值。

说明：
根据当前值调整窗口扩展。公式如下：xNewWE = ( xOldWE * xNum ) /xDenomyNewWE = ( yOldWE * yNum ) /yDenom新的窗口扩展值是将当前扩展值乘以分子后除以分母得到的。

请参阅：CDC::GetWindowExt, CSize


 CDC::ScrollDC

BOOL ScrollDC(int dx,int dy ,LPCRECT lpRectScroll,LPCRECT lpRectClip,CRgn* pRgnUpdate,LPRECT lpRectUpdate );

返回值：如果实现滚动，则返回非零值，否则为0。

参数：
dx | 指定水平滚动单位。
dy | 指定垂直滚动单位。
lpRectScroll | RECT结构或CRect对象的指针，它们含有滚动矩形的坐标值。
lpRectClip | RECT结构或CRect对象的指针，它们含有剪切矩形的坐标值。当该矩形比lpRectScroll指定的矩形小时，则只在较小的矩形内滚动。
pRgnUpdate | 在滚动过程中出现的区域标识。ScrollDC函数定义了该区域，它不必是矩形。
lpRectUpdate | RECT结构或CRect对象的指针。它们接收滚动更新区域的外接矩形的坐标。这是需要重新绘制的最大矩形区域。当函数返回时，结果或对象中的值以客户坐标表示，不论给定设备上下文的映射模式如何。

说明：
水平或垂直滚动矩形。如果lpRectUpdate为NULL，Windows不计算更新的区域；如果lpRectUpdate 和pRgnUpdate都为NULL，Windows不计算更新的区域。如果pRgnUpdate不是NULL，Windows认为它包含一个滚动过程中出现的区域的有效指针（滚动过程由ScrollDC成员函数定义）。如果需要，更新区域用lpRectUpdate返回并能传递给CWnd::InvalidateRgn。当需要滚动窗口的整个客户区时，应用应当使用CWnd 类的ScrollWindows成员函数；否则，应当使用ScrollDC。

请参阅：
CWnd::InvalidateRgn, CWnd::ScrollWindow, ::ScrollDC, CRgn, RECT, CRect


 CDC::SelectClipPath

BOOL SelectClipPath(int nMode);

返回值：如果成功，则返回非零值，否则为0。

参数：
nMode指定使用路径的方式，允许以下值：
· | RGN_AND | 新的剪切区，包括当前剪切区与当前路径的覆盖部分。
· | RGN_COPY | 新的剪切区即为当前路径。
· | RGN_DIFF | 新的剪切区即为当前路径，但不包括当前路径部分。
· | RGN_OR | 新的剪切区，包括当前剪切区的组合区域与当前路径。
· | RGN_XOR | 新的剪切区，包括当前剪切区的组合区域与当前路径，但不包括覆盖部分。

说明：
为设备上下文选择当前路径作为剪切区，并使用指定模式组合新区域与已存在的剪切区。设备上下文必须包含一个闭合路径。

请参阅：CDC::BeginPath, CDC::EndPath


 CDC::SelectClipRgn

virtual int SelectClipRgn(CRgn* pRgn);
int SelectClipRgn(CRgn* pRgn,int nMode);

返回值：区域类型，可为下列值之一：
· | COMPLEXREGION | 剪切区有覆盖的边界。
· | ERROR | 设备上下文无效。
· | NULLREGION | 新剪切区为空。
· | SIMPLEREGION | 剪切区无覆盖边界。

参数：
pRgn表明被选择的区域。
· | 在函数的第一种版本中，如果该值为NULL，整个客户区被选中，输出仍剪切到窗口。
· | 在函数的第二种版本中，只有指定了RGN_COPY时，该句柄才能为NULL。
nMode指定要进行的操作，可为下列值之一：
· | RGN_AND | 新剪切区包含与当前剪切区的覆盖部分，区域由pRgn标识。
· | RGN_COPY | 新剪切区是pRgn标识区域的拷贝，这与SelectClipRgn的第一种版本相同。如果pRgn标识的区域为NULL，则新剪切区成为缺省的剪切区（空区域）。
· | RGN_DIFF | 新剪切区包括当前剪切区和被pRgn标识区域所排除的区域。
· | RGN_OR | 新剪切区包括当前剪切区和pRgn标识区域。
· | RGN_XOR | 新剪切区包括当前剪切区和pRgn标识区域，但不包括覆盖区域。

说明：
为设备上下文选择区域作为当前剪切区。只利用了选定区域的拷贝，函数本身可被其它设备上下文选用，或者被删除。函数假设给定区域的坐标都使用设备坐标。某些打印机为保持文本的精确度，支持用比图形输出更高的分辨率进行文本输出。这些设备在更高的分辨率下报告设备单位，即使用文本单位。然后为图形缩放坐标以便使几个设备单位与1图形单位对应。可以调用使用文本单位的SelectClipRgn函数。在GDI中必须使用图形缩放的应用，可以使用GETSCALINGFACTOR打印程序脱离来决定缩放因子。缩放因子影响剪切。如果某区域用于剪切图形，GDI用缩放因子来分解坐标。如果用于剪切文字，GDI不作缩放调整，缩放因子为1，坐标将被2除；缩放因子为2，坐标将被4除，依此类推。

请参阅：CDC::GetClipBox, CDC::Escape, CRgn, ::SelectClipRgn


 CDC::SelectObject

CPen* SelectObject (CPen* pPen);
CBrush* SelectObject(CBrush* pBrush);
virtual CFont* SelectObject(CFont* pFont);
CBitmap* SelectObject(CBitmap* pBitmap);
int SelectObject (CRgn* pRgn);

返回值：
返回被替代的对象的指针。是由一个CGdiObject类派生出的对象的指针，如CPen ，它取决于使用函数的版本。如果出错，则返回NULL。函数可将返回值传递给一个临时对象，该对象只在处理Windows消息时有效。要了解更多的信息，请参阅CGdiObject::FromHandle 。 带有区域参数的成员函数与SelectClipRgn成员函数执行相同的任务，其返回值可是下列之一：
· | COMPLEXREGION | 剪切区有覆盖的边界。
· | ERROR | 设备上下文无效。
· | NULLREGION | 新剪切区为空。
· | SIMPLEREGION | 新剪切区无覆盖边界。

参数：
pPen | 被选中的CPen对象指针。
pBrush | 被选中的CBrush对象指针。
pFont | 被选中的CFont对象指针。
pBitmap | 被选中的CBitmap对象指针。
pRgn | 被选中的CRgn对象指针。

说明：
将对象选入设备上下文中。CDC类为特定类型的GDI对象提供了五种形式，包括画笔、画刷、字体、位图和区域。最新选中的对象将覆盖同类型的前一个对象。例如，如果SelectObject中通用形式的pObject指向CPen对象，函数将用pObject指定的画笔作为当前画笔。应用只能将位图选入内存设备上下文中，且一次只能放入一个内存设备上下文。位图格式必须为黑白模式或与设备上下文兼容，否则SelectObject返回错误。对Windows 3.1及其以后版本，不论是否在元文件中使用，SelectObject返回相同的值。对于早期版本，SelectObject在元文件使用返回值时，如果成功，则返回非零值；失败则返回0。

请参阅：
CGdiObject::DeleteObject, CGdiObject::FromHandle, CDC::SelectClipRgn, CDC::SelectPalette, ::SelectObject


 CDC::SelectPalette

CPalette* SelectPalette(CPalette* pPalette,BOOL bForceBackground);

返回值：
CPalette 对象的指针，标识被pPalette指定的调色板所覆盖的逻辑调用函数。如果出错，则返回值为NULL。
参数：
pPalette | 标识被选中的逻辑调色板，该调色板必须是已由CPalette成员函数CreatePalette创建的调色板。
bForceBackground | 表明逻辑调色板是否被强制作为背景调色板。如果bForceBackground为非零值，选中的调色板一直作为背景调色板，而不管窗口是否含有输入焦点。如果bForceBackground为0且设备上下文与窗口相连接，则在窗口获得输入焦点时，该调色板作为前景调色板。

说明：
选择由pPalette指定的逻辑调色板作为设备上下文的调色板对象。GDI使用的新调色板作为调色板对象，控制设备上下文的显示颜色并替换前一个调色板。应用可为多个设备上下文选择逻辑调色板，但该逻辑调色板的变化将会影响所有选择它的设备上下文。如果应用为多个设备上下文选择了调色板，这些设备上下文必须使用相同的物理设备。

请参阅：CDC::RealizePalette, CPalette, ::SelectPalette


 CDC::SelectStockObject

virtual CGdiObject* SelectStockObject ( int nIndex );

返回值：
如果成功，则返回被替换的CGdiObject对象指针，实际对象是CPen，CBrush或CFont；否则返回值为NULL。

参数：
nIndex指定需要的库存对象种类，可以为下列值之一：
BLACK_BRUSH | 黑色画刷。
DKGRAY_BRUSH | 深灰色画刷。
GRAY_BRUSH | 灰色画刷。
HOLLOW_BRUSH | 空心画刷。
LTGRAY_BRUSH | 浅灰色画刷。
NULL_BRUSH | 空画刷。
WHITE_BRUSH | 白色画刷。
BLACK_PEN | 黑色画笔。
NULL_PEN | 空笔。
WHITE_PEN | 白色画笔。
ANSI_FIXED_FONT | ANSI固定系统字体。
ANSI_VAR_FONT | ANSI变化系统字体。
DEVICE_DEFAULT_FONT | 依赖设备的字体。
OEM_FIXED_FONT | 依赖OEM的固定字体。
SYSTEM_FONT | 系统字体。缺省地，Windows使用系统字体绘制菜单、对话框控件和其它文本。Windows 3.0及其后版本，系统字体具有比例宽度，早期版本则使用固定宽度的系统字体。
STSTEM_FIXED_FONT | 在早于Windows 3.0的版本中使用的固定宽度系统字体。该对象与Windows 早期版本兼容。
DEFAULT_PALETTE | 缺省彩色调色板，含有系统调色板中的20种静态颜色。

说明：选择一个与预先定义的库存笔、画刷或字体对应的CGdiObject对象。

请参阅：CGdiObject::GetObject


 CDC::SetAbortProc

int SetAbortProc(BOOL (CALLBACK EXPORT* lpfn )(HDC,int));

返回值：
返回SetAbortProc函数的结果。
下列某些值出现的可能性比其它值要高，但它们都有可能出现：
· | SP_ERROR | 一般错误。
· | SP_OUTOFDISK | 假脱机所需的磁盘空间不足，没有其它可用的磁盘空间。
· | SP_OUTOFMEMORY | 假脱机所需的内存不足。
· | SP_USERABORT | 用户在打印管理中中止作业。

参数：
lpfn作为放弃过程安装的放弃函数的指针。
关于调用函数的更多信息，参阅CDC::SetAbortProc 中的“回调函数”。

说明：
如果应用允许在假脱机状态中取消打印作业，它必须在StartsDoc成员函数开始打印作业之前设置放弃函数。打印管理器在假脱机时调用放弃函数，使应用取消打印作业或者处理磁盘空间不足的问题。如果没有设置放弃函数，在没有足够的假脱机磁盘空间时，打印作业失败。注意，Microsoft Visual C++的特点在于简化了传递给SetAbortProc的调用函数的创建。传递给EnumObjects成员函数的地址是函数指针，该函数是用带_declspec（dllexport）输出的，并符合_stdcall调用规范。不必在应用模块定义文件的EXPORTS语句中输出函数名称，可使用EXPORT函数修改程序，如：BOOL (CALLBACK EXPORTAFunction )(HDC,int));使编译器释放适当记录用于输出，使用名字而非别名。这能满足大部分的需要。对于某些特殊情况，如带序数或别名的函数输出，仍可以使用模块定义文件中的EXPORT语句。调用登记的接口现在是安全类型的（必须传递一个函数指针，它指向用于特定调用的函数）。在返回Windows时还应注意到所有的调用函数必须捕获Microsoft Foundation异常。因为异常仍在调用函数、范围之内。关于异常的更多信息，请参阅联机文档“Visual C++程序员指南”中的“异常”。


 CDC::SetArcDirection

int SetArcDirection(int nArcDirection);

返回值：如果成功，则返回弧的方向，否则为0。

参数：
nArcDirection指定新的弧方向，可为下列值之一：
· | AD_COUNTERCLOCKWISE | 图形按逆时针方向绘制。
· | AD_CLOCKWISE | 图形按顺时针方向绘制。

说明：
设置用于矩形和弧的函数的绘制方向。缺省方向是逆时针。SetArcDirection指定了下列函数的作图方向。ArcPieArcToRectangleChordRoundRectEllipse

请参阅：CDC::GetArcDirection, ::SetArcDirection


 CDC::SetAttribDC

virtual void SetAttribDC(HDC hDC);

参数
hDC Windows 设备上下文。

说明：
调用该函数设置属性设备上下文m_hAttribDC，该成员函数不将设备上下文连接到CDC对象上，只有输出设备上下文连接在CDC对象上。

请参阅：CDC::SetOutputDC, CDC::ReleaseAttribDC, CDC::ReleaseOutputDC


 CDC::SetBkColor

virtual COLORREF SetBkColor(COLORREF crColor);

返回值：背景色RGB值的前一次取值。如果出错，则返回0x80000000。

参数
crColor 指定新的背景色。

说明：
把当前背景色设置为指定的颜色。如果背景模式是OPAQUE（不透明），系统使用背景色填充行间和字符单元的背景。当位图在彩色和黑白设备上下文间转换时，系统使用背景色。如果设备不能显示指定颜色，系统将背景色设成与之最相近的物理色。

请参阅：
CDC::BitBlt, CDC::GetBkColor, CDC::GetBkMode, CDC::SetBkMode, CDC::StretchBlt, ::SetBkColor


 CDC::SetBkMode

int SetBkMode(int nBkMode );

返回值：背景模式的前一次取值。

参数：
nBkMode指定要设置的模式，可为下列值之一：
· | OPAQUE | 缺省背景模式。背景在文本、阴影画刷、笔绘制之前用当前背景色填充。
· | TRANSPARENT | 背景在绘图之前不改变。

说明：
设置背景模式。背景模式决定了在绘制文本、阴影画刷、带风格的直线时是否将绘图表面上已存在的背景色覆盖。

请参阅：CDC::GetBkColor, CDC::GetBkMode, CDC::SetBkColor, ::SetBkMode


 CDC::SetBoundsRect

UNIT SetRoundsRect(LPCRECT lpRectBounds ,UNIT flags);

返回值：
如果函数成功，则返回当前外接矩形的状态，可以是以下值的组合：
· | DCB_ACCUMULATE | 外接矩形非空。
· | DCB_DISABLE | 关闭聚集。
· | DCB_ENABLE | 打开聚集。

参数：
lpRectBounds 用于设置外接矩形的RECT结构或CRect对象的指针。矩形尺寸信息由逻辑坐标给定。参数值可为NULL。
flags指定新矩形如何与矩形集组合。可以为下列值的组合：
· | DCB_ACCUMULATE | 将lpRectBounds指定的矩形添加到外接矩形。
· | DCB_DISABLE | 关闭聚集。
· | DCB_ENABLE | 打开聚集（该设置为缺省值）。

说明：
为指定的设备上下文控制外接矩形的聚集信息。Windows 为所有的绘图操作提供外接矩形。该矩形可以为应用查询和重新设置。绘图边界对于使位图缓冲区失效有作用。

请参阅：CDC::GetBoundsRect, ::SetBoundsRect, RECT, CRect


 CDC::SetBrushOrg

CPoint SetBrushOrg(int x ,int y );
CPoint SetBrushOrg(POINT point);

返回值：画刷初始位置的前一次取值（设备单位） 。

参数：
x | 新的初始位置的X坐标（设备单位），值必须在0与7之间。
y | 新的初始位置的Y坐标（设备单位），值必须在0与7之间。
point | 新的初始位置的X和Y坐标，值必须在0与7之间。可以为该参数传递POINT结构或CPoint对象。

说明：
指定GDI将要为下一个画刷分配初始位置。应用把该画刷选入设备上下文中。缺省的画刷初始位置是（0，0）。要改变画刷的初始位置，为CBrush对象调用UnrealizeObject函数。调用SetBrushOrg，再调用SelectObject成员函数就可以将画刷选入设备上下文中。不要对库存CBrush对象使用SetBrushOrg 。

请参阅：
CBrush, CDC::GetBrushOrg, CDC::SelectObject, CGdiObject::UnrealizeObject, POINT, CPoint


 CDC::SetColorAdjustment

BOOL SetColorAdjustment(const COLORADJUSTMENT* lpColorAdjust);

返回值：如果成功，则返回非零值，否则为0。

参数
lpColorAdjust 包含颜色调整值的COLORADJUSTMENT数据结构的指针。

说明：
利用指定值为设备上下文设置颜色调整值。颜色调整值用于调整源位图的输入颜色。在设置HALFTONE模式时，要调用CDC::StretchBlt成员函数。

请参阅：CDC::SetStretchBltMode, CDC::StretchBlt, ::StretchDIBits


 CDC::SetMapMode

virtual int SetMapMode(int nMapMode);

返回值：上一个映射模式。

参数
nMapMode 指定新的映射模式，可为下列值之一：
MM_ANISOTROPIC | 把逻辑单位转换为任意缩放轴上的任意单位。把映射模式设置为MM_ANISOTROPIC并不改变当前窗口或视图端口的设置。要改变单位、方向和缩放，可调用SetViewportExt和SetWindowtExt成员函数。
MM_HIENGLISH | 每一逻辑单位对换0.001英寸，X向右为正，Y向上为正。
MM_HIMETRIC | 每一逻辑单位对换0.001毫米，X向右为正，Y向上为正。
MM_ISOTROPIC | 逻辑单位转换为带有对等缩放轴的任意单位。即X轴1单位与Y轴1单位是相等的。可使用SetViewportExt和SetWindowtExt成员函数，指定需要的单位和轴的方向。GDI修正可以保证X、Y轴的尺寸是一致的。
MM_LOENGLISH | 每一逻辑单位对换0.01英寸，X向右为正，Y向上为正。
MM_LOMETRIC | 每一逻辑单位对换0.1毫米，X向右为正，Y向上为正。
MM_TEXT | 每一逻辑单位对换1设备像素，X向右为正，Y向下为正。
MM_TWIPS | 每一逻辑单位对换1/20个点（1点为1/72英寸，1twip为1/1440英寸）。X向右为正，Y向上为正。

说明：
设置映射模式，映射模式定义了将逻辑单位转换为设备单位的单位量，并定义了X和Y的方向。GDI使用映射模式将逻辑坐标转换为适当的设备坐标。MM_TEXT允许应用使用设备像素，1逻辑单位等于1像素。像素的物理尺寸随设备而异。MM_HIENGLISH,MM_HIMETRIC,MM_LOENGLISH,MM_LOMETRIC和MM_ TWIPS模式对于必须使用具有物理意义单位作图的应用是很有用的（如使用英寸或毫米）。MM_ISOTROPIC 模式保证了1：1的方向比率，可以保存图象的精确形状。MM_ANISOTROPIC模式允许X和Y轴可以独立调用。

请参阅：CDC::SetViewportExt, CDC::SetWindowExt, ::SetMapMode


 CDC::SetMapperFlags

DWORD SetMapperFlags(DWORD dwFlag);

返回值：字体映射标志的前一个取值。

参数：
dwFlag 指定字体映射器是否匹配设备上的字体的宽度和高度。当值为ASPECT_FILTERING时，映射器只选择X向与Y向与指定设备正好匹配的字体。

说明：
当转换逻辑字体为物理字体时，改变字体映射器使用的方法。应用使用SetMapperFlags，可使字体映射器只选择与特定设备方向比率匹配的物理字体。只使用光栅字体的应用可以使用SetMapperFlags函数，以确保字体映射器选择的字体在指定的设备上是只读的。使用缩放字体的应用一般不使用SetMapperFlags。如果没有一种物理字体的方向比率与逻辑字体匹配，GDI选择一个新的方向比率并选择与新比率匹配的字体。

请参阅：::SetMapperFlags


 CDC::SetMiterLimit

BOOL SetMiterLimit(float fMiterLimit);

返回值：如果成功，则返回非零值，否则为0。

参数
fMiterLimit 为设备上下文指定新的斜角限制。

说明：
为设备上下文指定斜角长度限制，斜角长度是指从内部相交点到外部相交点的距离。斜角限制是所能允许的斜角长度与直线宽度的比率的最大值。

请参阅：CDC::GetMiterLimit, ::SetMiterLimit


 CDC::SetOutputDC

virtual void SetOutputDC(HDC hDC);

参数
hDC 一个Windows 设备上下文。

说明：
调用该成员函数设置输出设备上下文m_hDC，只有在设备上下文未与CDC对象连接的情况下才调用该成员函数。该函数设置m_hDC，但并不连接设备上下文与CDC对象。

请参阅：
CDC::SetAttribDC, CDC::ReleaseAttribDC, CDC::ReleaseOutputDC, CDC::m_hDC


 CDC::SetPixel

COLORREF SetPixel(int x ,int y,COLORREF crColor);
COLORREF SetPixel(POINT point,COLORREF crColor);

返回值：
实际绘制的点的RGB值。如果是大致使用crColor指定的颜色，则返回值与这个颜色不相同。如果函数失败（如果点在剪切区外），则返回-1。

参数：
x | 指定点的X逻辑坐标 。
y | 指定点的Y逻辑坐标 。
crColor | 用于描绘点的颜色。
point | 指定点的X、Y逻辑坐标。可以为该参数传递POINT结构或CPoint对象。

说明：
为点上的像素设置与crColor指定值最接近的颜色。点必须在剪切区内，否则函数什么也不做。不是所有的设备都支持SetPixel函数，要判断设备是否支持SetPixel，调用带RASTRCAPS索引的GetDeviceCaps 成员函数，并为RC_BITBLT标志检验返回值。

请参阅：CDC::GetDeviceCaps, CDC::GetPixel, ::SetPixel, POINT, CPoint


 CDC::SetPixelV

BOOL SetPixelV (int x ,int y ,COLORREF crColor );
BOOL SetPixelV (POINT point,COLORREF crColor );

返回值：如果成功，则返回非零值，否则为0。

参数：
x | 指定点的X逻辑坐标 。
y | 指定点的Y逻辑坐标 。
crColor | 用于描绘点的颜色。
point | 指定点的X、Y逻辑坐标。可以为该参数传递POINT结构或CPoint对象。

说明：
为指定坐标上的像素设置与指定颜色最接近的颜色。该点必须在剪切区内设备表面的可视区域之中。不是所有的设备都支持该函数。要了解更多的信息，请参阅CDC::GetDeviceCaps成员函数的RC_BITBLT 。SetPixelV比SetPixel快，因为它不需要返回点实际绘制的颜色值。

请参阅：CDC::GetDeviceCaps, CDC::SetPixel, SetPixelV


 CDC::SetPolyFillMode

int SetPolyFillMode(int nPolyFillMode);

返回值：如果成功，则返回填充模式的前一次取值，否则为0。

参数
pPolyFillMode 指定新的填充区域。可以是ALTERNATE或WINDING。缺省值是ALTERNATE。

说明：
设置多边形填充模式。当多边形填充模式为ALTERNATE时，系统对每条扫描线上的多边形奇数边和偶数边之间的区域进行填充，即系统在第一条和第二条边之间、第三条和第四条之间的区域内填充，依此类推。这是缺省模式。当多边形填充模式为WINDING时，系统利用图形绘制的方向来决定是否填充多边形。多边形中线段方向只有顺时针和逆时针两种。当一条从闭合域开始到图形外部的虚拟直线沿顺时针线段移动时，计数增加。当直线沿逆时针线段移动时，计数减小。如果计数值非零，该区域被填充。

请参阅：CDC::SetPolyFillMode, CDC::PolyPolygon, ::SetPolyFillMode


 CDC::SetROP2

int SetROP2(int nDrawMode);

返回值：绘图模式的前一次取值。可以取联机文档“Windows SDK”中提供的任意值。

参数：
nDrawMode指定新的绘制模式，可以为下列值之一：
· | R2_BLACK | 像素始终为黑色。
· | R2_WHITE | 像素始终为白色。
· | R2_NOP | 像素保持不变。
· | R2_NOT | 像素为屏幕颜色的反色。
· | R2_COPYPEN | 像素为笔的颜色。
· | R2_NOTCOPYPEN | 像素为笔颜色的反色。
· | R2_MERGEPENNOT | 像素为笔颜色或者屏幕颜色反色的组合色。
· | R2_MASKPENNOT | 像素为笔颜色与屏幕颜色反色的组合色。
· | R2_MERGENOTPEN | 像素为笔颜色反色或者屏幕颜色的组合色。
· | R2_MASKNOTPEN | 像素为笔颜色反色与屏幕颜色的组合色。
· | R2_MERGEPEN | 像素为笔颜色或者屏幕颜色的组合色。
· | R2_NOTMERGEPEN | R2_MERGEPEN的反色。
· | R2_MASKPEN | 像素为笔颜色与屏幕颜色的组合色。
· | R2_NOTMASKPEN | R2_MASKPEN的反色。
· | R2_XORPEN | 像素为笔颜色与或者屏幕颜色异或的颜色。
· | R2_NOTXORPEN | R2_XORPEN的反色。

说明：
设置绘图模式。绘图模式指出笔与被填充对象的颜色是怎样同显示表面的颜色组合的。绘图模式只用于光栅设备，不用于矢量设备。绘图模式是双重的光栅操作代码，代表了两个变量所有可能的布尔组合，分别使用AND、OR、XOR（异或）和NOT运算符。

请参阅：CDC::GetDeviceCaps, CDC::GetROP2, SetROP2


 CDC::SetStretchBltMode

int SetStretchBltMode(int nStretchMode);

返回值：扩展模式的前一次取值。可以是STRETCH_ANDSCANS,STRETCH_DELETESCANS或STRETCH_ORSCANS。

参数
nStretchMode指定扩展模式。可为下列值之一：
值 | 描述
BLACKONWHITE | 使用颜色值对已被排除和当前存在的像素进行布尔“与”操作。如果是黑白位图，模式保留黑色像素
COLORONCOLOR | 删除像素。模式删除所有像素，不保留它们的信息
HALFTONE | 将源矩形的像素映射到目标矩形的像素组中。目标像素组的颜色与源像素接近设置了HALFTONE后，应用必须调用Win 32函数::SetBrushOrgEx来设置画刷的初始位置，否则会出现画刷对齐错误
STRETCH_ANDSCANS | Windows 95使用，同BLACKONWHITE
STRETCH_DELETESCANS | Windows 95使用，同COLORONCOLOR
STRETCH_HALFTONE | Windows 95使用，同HALFTONE
STRETCH_ORSCANS | Windows 95使用，同WHITEONBLACK
WHITEONBLACK | 使用颜色值对已被排除和当前存在的像素进行布尔与操作。如果是黑白位图，模式保留白色像素

说明：
为StretchBlt成员函数设置位图扩展模式。模式定义了利用该函数压缩的信息是如何从位图中清除的。BLACKONWHITE(STRETCH_ANDSCANS) 和WHITEONBLACK(STRETCH_ ORSCANS)模式一般用来在黑白位图中保存前景像素。COLORONCOLOR (STRETCH_DELETESCANS)模式用于保存彩色位图中的颜色。HALFTONE模式比其它模式需要对源图象作更多的处理，速度比其它模式慢，但质量更高。还要注意，HALFTONE必须在设置了SetBrushOrgEx之后调用，以避免画刷对齐错误。还可获得其它的扩展模式，取决于设备驱动程序的能力。

请参阅：CDC::GetStretchBltMode, CDC::StretchBlt, ::SetStretchBltMode


 CDC::SetTextAlign

UNIT SetTextAlign(UNIT nFlags);

返回值：
如果成功，则返回文本对齐设置的前一次取值，低位字节包含水平设置，高位字节包含垂直水平设置。否则为0。

参数：
nFlags指定文本对齐标记。标记指定了一个点与文本外接矩形之间的关系。该点可以是当前位置或由文本输入函数指定的坐标。包围文本的矩形框由文本字符串邻接的字符单元来定义。
nFlags参数取值可以是下列三类中的一或多个。每类只能取一个值。第一类在X方向上影响文本对齐方式。
· | TA_CENTER | 使点与外接矩形的中点对齐。
· | TA_LEFT | 使点与外接矩形的左边对齐。这是缺省设置。
· | TA_RIGHT | 使点与外接矩形的右边对齐。第二类在Y方向上影响文本对齐方式。
· | TA_BASELINE | 使点与选定字体的基线对齐。
· | TA_BOTTOM | 使点与外接矩形的底部对齐。
· | TA_TOP | 使点与外接矩形的顶部对齐。第三类决定了当文本被写入时，对齐位置是否被更新。
· | TA_NOUPDATECP | 每次调用文本输出函数后不更新当前位置，为缺省设置。
· | TA_UPDATECP | 每次调用文本输出函数后更新X值，新的位置在外接矩形的右边。设置该标记后，TextOut成员函数指定的坐标被忽略。

说明：
设置文本对齐方式。当输出显示或输出到设备时，TextOut和ExtTextOut成员函数使用这些标记来确定文本位置。标记表明了指定点与文本外接矩形之间的关系。该点坐标作为参数传递给TextOut成员函数，外接矩形由文本字符串的邻接字符单元形式。

请参阅：
CDC::ExtTextOut, CDC::GetTextAlign, CDC::TabbedTextOut, CDC::TextOut, ::SetTextAlign


 CDC::SetTextCharacterExtra

int SetTextCharacterExtra(int nCharExtra);

返回值：字符间距的前一次取值。

参数：
nCharExtra 指定加在每个字符上的额外间隔（逻辑单位）。如果当前映射模式不是MM_TEXT，nCharExtra将转换形式，并向最近邻接的像素靠近。

说明：
设置字符间距。当向设备上下文写入文本时，GDI把该间距加在每个字符之上，包括中断符。缺省字符间距值是0。

请参阅：CDC::GetTextCharacterExtra, ::SetTextCharacterExtra


 CDC::SetTextColor

virtual COLORREF SetTextColor(COLORREF crColor );

返回值：文本颜色值的前一次RGB值。

参数
crColor 指定文本颜色的RGB值。

说明：
将指定颜色用于文本。当向设备上下文写入文本以及在彩色与黑白设备上下文间转换位图时，系统使用文本颜色。如果设备不能显示指定色，系统将设定与之最接近的文本颜色。字符的背景色是由SetBkColor和SetBkMode成员函数指定的。

请参阅：
CDC::GetTextColor, CDC::BitBlt, CDC::SetBkColor, CDC::SetBkMode, ::SetTextColor


 CDC::SetTextJustification

int SetTextJustification(int nBreakExtra,int nBreakCount);

返回值：如果成功，则返回非零值，否则为0。

参数：
nBreakExtra | 指定加在一行文本的额外间隔总量（逻辑单位）。如果当前映射模式不是MM_TEXT ，则该参数的指定值将转换为当前映射模式下的取值，并与最邻近的设备单位靠近。
nBreakCount | 指定在线断开字符串数。

说明：
添加间隔以断开字符串中的字符。应用可以使用GetTextMetrics成员函数来获取字体的中断字符。调用SetTextJustification成员函数后，使用文本输出函数（如TextOut）根据指定的中断符数目平均分配额外空间。中断符通常是空格符（ASCII32），但字符也可定义其它字符。GetTextExtent通常与SetTextJustification一起使用。GetTextExtent在给定对齐方式前计算行的宽度。应用通过减去GetTextExtent在对齐操作之后返回的字符串宽度，从而能够决定在nBreakExtra中指定的间隔量。SetTextJustification函数可用于包含多种字体的行的对齐。这种情况下，行必须通过对齐方式逐步建立。因为在对齐过程中会出现围绕错误，系统保留了说明当前错误的运行错误。当对齐包含多个运行错误时，GetTextExtent自动使用错误记录，计算下一运行错误。这允许输出函数将错误与新错误组合。在各行实现对齐之后，这个错误必须被清除以防止将错误带入下一行。可在调用SetTextJustification时将nBreakExtra设置为0，从而清除错误记录。

请参阅：
CDC::GetMapMode, CDC::GetTextExtent, CDC::GetTextMetrics, CDC::SetMapMode, CDC::TextOut, ::SetTextJustification


 CDC::SetViewportExt

virtual CSize SetViewportExt(int cx ,int cy);
virtual CSize SetViewportExt(SIZE size);

返回值：
CSize对象，是视图端口扩展的前一次取值。出错时，CSize对象返回的X和Y坐标均设置为0。

参数：
cx | 指定视图端口的X扩展（设备单位）。
cy | 指定视图端口的Y扩展（设备单位）。
size | 指定视图端口的X和Y扩展（设备单位）。

说明：
设置视图端口扩展的X和Y扩展。视图端口和设备上下文窗口说明了GDI如何将逻辑坐标中的点映射到实际设备坐标中。换言之，它们说明了GDI如何将逻辑坐标转换为设备坐标。当设置以下映射模式时，对SetWindowExt和SetViewportExt的调用将被覆盖。
· | MM_HIENGLISH
· | MM_HIMETRIC
· | MM_LOENGLISH
· | MM_LOMETRIC
· | MM_TEXT
· | MM_TWIPS
当设置MM_ISOTROPIC时，应用在调用SetWindowExt之前必须调用SetViewportExt函数。

请参阅：CDC::SetWindowExt, CSize, CDC::GetViewportExt


 CDC::SetViewportOrg

virtual CPoint SetViewportOrg(int x ,int y );
virtual CPoint SetViewportOrg (POINT point );

返回值：CPoint对象，是视图端口初始位置的前一次取值（设备单位）。

参数：
x | 指定视图端口初始位置的X坐标（设备单位）。其值必须在设备坐标系统范围内。
y | 指定视图端口初始位置的Y坐标（设备单位）。其值必须在设备坐标系统范围内。
point | 指定视图端口初始位置。其值必须在设备坐标系统范围内。可以为该参数传递POINT结构或CPoint对象。

说明：
设置设备上下文的视图端口初始位置。视图端口和设备上下文窗口说明了GDI如何将逻辑坐标中的点映射到实际设备坐标中。换言之，它们说明了GDI如何将逻辑坐标转换为设备坐标。视图端口初始位置表明在设备坐标系统中的点，GDI将窗口初始位置与该点映射。窗口初始位置是由SetWindowOrg成员函数在逻辑坐标系统中指定的。GDI在映射其它点时遵从同样的过程，这需要窗口初始位置与视图端口初始位置的映射。例如，所有以窗口初始位置为中心的圆周上的点同样是以视图端口初始位置为中心的圆周上的点。同样地，通过窗口初始位置的直线上的所有点也将形成一条通过视图端口初始位置的直线。

请参阅：CDC::SetWindowOrg, CPoint, POINT, CDC::GetViewportOrg


 CDC::SetWindowExt

virtual CSize SetWindowExt(int cx ,int cy);
virtual CSize SetWindowExt(SIZE size);

返回值：CSize对象，是窗口扩展的前一次取值。出错时，CSize对象返回的X，Y坐标均设置为0。

参数：
cx | 指定视图端口的X扩展（逻辑单位）。
cy | 指定视图端口的Y扩展（逻辑单位）。
size | 指定视图端口的X和Y扩展（逻辑单位）。

说明：
设置窗口扩展的X和Y扩展。窗口和设备上下文窗口说明了GDI如何将逻辑坐标中的点映射到实际设备坐标中。
换言之，它们说明了GDI如何将逻辑坐标转换为设备坐标。
当设置以下映射模式时，对SetWindowExt和SetViewportExt的调用将被覆盖。
· | MM_HIENGLISH
· | MM_HIMETRIC
· | MM_LOENGLISH
· | MM_LOMETRIC
· | MM_TEXT
· | MM_TWIPS
当设置MM_ISOTROPIC时，应用在调用SetWindowExt成员函数之前必须调用SetViewportExt函数。

请参阅：CDC::GetWindowExt, CDC::SetViewportExt, CSize


 CDC::SetWindowOrg

CPoint SetWindowOrg(int x ,int y );
CPoint SetWindowOrg(POINT point )

返回值：CPoint对象，是窗口初始位置的前一次取值（逻辑单位）。

参数：
x | 指定窗口初始位置的X逻辑坐标。
y | 指定视图端口初始位置的Y逻辑坐标。
point | 指定窗口初始位置。其值必须在设备坐标系统范围内。可以为该参数传递POINT结构或CPoint对象。

说明：
设置设备上下文的窗口初始位置。它和设备上下文窗口一起说明了GDI如何将逻辑坐标中的点映射到实际设备坐标中。换言之，它们说明了GDI如何将逻辑坐标转换为设备坐标。窗口初始位置表明在设备坐标系统中的点，GDI将视图端口初始位置与该点映射。窗口初始位置是由SetWindowOrg成员函数在逻辑坐标系统中指定的。GDI在映射其它点时遵从同样的过程，这需要窗口初始位置与视图端口初始位置的映射。例如，所有以窗口初始位置为中心的圆周上的点同样是以视图端口初始位置为中心的圆周上的点。同样地，通过窗口初始位置的直线上的所有点也将形成一条通过视图端口初始位置的直线。

请参阅：CPoint, POINT, CDC::GetWindowOrg


 CDC::StartDoc

int StartDoc(LPDOCINFO lpDocInfo);

返回值：如果出错，例如存储空间不足或指定端口无效，则返回-1。否则返回正值。

参数
lpDocInfo DOCINFO结构的指针。该结构包含了文档文件和输出文件的名字。

说明：
通知设备驱动开始一个新的打印作业，其后所有的StartPage和EndPage调用应处于假脱机状态，直至EndDoc调用出现。这确保了长于一页的文档不会被其它作业中断。对于Windows 3.1及其以后版本，这个函数替代了STARTDOC打印程序脱离。这确保了长于一页的文档不会被其它打印作业中断。StartDos不能用于元文件。

请参阅：CDC::Escape, CDC::EndDoc, CDC::AbortDoc


 CDC::StartPage

int StartPage()

说明：
调用该成员函数使打印驱动程序作好接收数据准备。StartPage监督NEWFRAME和BANDINFO脱离。要了解打印调用序列，请参阅 StartDoc成员函数。在StartPage和EndPage调用之间，ResetDC成员函数不起作用。

请参阅：CDC::Escape, CDC::EndPage


 CDC::StretchBlt

BOOL StretchBlt(
int x,
int y,
int nWidth,
int nHeight,
CDC* pSrcDC,
intxSrc,
int ySrc,
int nSrcWidth,
int nSrcHeight,
DWORD dwRop
)

返回值：如果位图已经绘制，则返回非零值，否则为0。

参数：
x | 目标矩形左上角的X逻辑坐标。
y | 目标矩形左上角的Y逻辑坐标。
nWidth | 目标矩形的宽度（逻辑单位）。
nHeight | 目标矩形的高度（逻辑单位）。
pSrcDC | 指定源设备上下文。
xSrc | 源矩形左上角的X逻辑坐标。
ySrc | 源矩形左上角的Y逻辑坐标。
nSrcWidth | 源矩形的宽度（逻辑单位）。
nSrcHeight | 源矩形的高度（逻辑单位）。
dwRop指定光栅操作。 光栅操作模式说明了GDI是如何组合输出操作中的颜色，包括当前画刷、可能的源位图和目标位图。可以为下列值之一：
· | BLACKNESS | 将所有输出变为黑色。
· | DSTINBERT | 反转目标位图颜色。
· | MERGECOPY | 使用AND运算符组合模板与源位图的颜色。
· | MERGEPAINT | 使用OR运算符组合源位图的反色与目标矩形的颜色。
· | NOTSRCCOPY | 将源位图的反色拷贝到目标矩形中。
· | NOTSRCERASE | 反转使用OR运算符组合源位图与目标矩形后得到的颜色。
· | PATCOPY | 将模板颜色拷贝到目标矩形中。
· | PATINVERT | 使用XOR运算符组合目标矩形与模板颜色。
· | PATPAINT | 使用OR运算符组合模板与源位图的反色。再使用OR运算符将该操作结果与目标矩形组合。
· | SRCAND | 使用AND运算符组合源位图和目标位图的像素。
· | SRCCOPY | 将源位图拷贝到目标位图。
· | SRCERASE | 反转目标矩形的颜色，再使用AND运算符将该结果与源位图组合。
· | SRCINVERT | 使用XOR运算符组合源位图和目标位图的像素。
· | SRCPAINT | 使用OR运算符组合源位图和目标位图的像素。
· | WHITENESS | 使所有输出变成白色。

说明：
将源矩形中的位图拷贝到目标矩形中，如果有必要，可以扩展或压缩该位图使其与目标矩形尺寸吻合。函数使用目标设备上下文（由SetStretchBltMode设置）的扩展模式来决定如何扩展或压缩位图。StretchBlt函数将pSrcDC源设备中的位图移动到目标矩形，该矩形用成员函数正在调用的设备上下文来表示。xSrc，ySrc，nSrcWidth和nSrcHeight 参数定义了源矩形的左上角和尺寸。x，yc，nWidth和nHeight参数定义了目标矩形的左上角和尺寸。dwRop指定的光栅操作模式说明了源位图与目标设备上已经存在的位图是如何组合的。如果nSrcWidth和nWidth或nSrcHeight和nHeight的符号不同，StretchBlt将为位图创建一个镜像。如果nSrcWidth和nWidth符号不同，函数沿X轴创建镜像。如果nSrcHeight和nHeight符号不同，函数沿Y轴创建镜像。StretchBlt函数在内存中对源位图进行扩展或压缩，然后将结果拷贝到目标矩形中。如果模板要与结果组合，则在扩展后的位图拷贝到目标矩形后才组合。如果用到画刷，应使用目标设备上下文中选定的画刷。目标坐标根据目标设备上下文来转换，源坐标根据源设备上下文来转换。如果目标位图、源位图和模板位图的格式不一致，StretchBlt使模板与源位图匹配模板位图格式，转换中会使用到目标设备上下文中的前景色和背景色。如果要将黑白位图转换为彩色位图，它将背景色设置为白位（1），前景色设置为黑位（0）。如果要将彩色位图转换为黑白位图，函数设置与背景色匹配的像素为白（1），其它像素为黑（0），用到了带颜色的设备上下文中的前景色和背景色。不是所有的设备都支持StretchBlt函数。调用带RASTERCAPS索引的GetDeviceCaps 函数来决定是否支持StretchBlt。并检验为返回给RC_STRETCHBLT标记的值。

请参阅：
CDC::BitBlt, CDC::GetDeviceCaps, CDC::SetStretchBltMode, ::StretchBlt


 CDC::StrokeAndFillPath

BOOL StrokeAndFillPath();

返回值：如果成功，则返回非零值，否则为0。

说明：
关闭路径中的开放图形。使用当前画笔描绘路径轮廓，用当前画刷填充内部。设备上下文必须包含一个闭合路径。StrokeAndFillPath成员函数对于路径中所有开放图形的关闭、路径的描绘和填充具有同样的效果。除了填充区域不能被覆盖描绘区域的情况，即使使用了具有一定宽度的画笔。

请参阅：
CDC::BeginPath, CDC::FillPath, CDC::SetPolyFillMode, CDC::StrokePath, ::StrokeAndFillPath


 CDC::StrokePath

BOOL StrokePath();

返回值：如果成功，则返回非零值，否则为0。

说明：使用当前画笔粉刷路径。设备上下文必须包含一个闭合路径。

请参阅：CDC::BeginPath, CDC::EndPath, ::StrokePath


 CDC::TabbedTextOut

virtual CSize TabbedTextOut(
int x,
int y,
LPCTSTR lpszString,
int nCount,
int nTabPosition,
LPINT lpnTabStopPosition,
int nTabOrigin
);

CSize TabbedTextOut(
int x,
int y,
const CString& str,
int nTabPosition,
LPINT lpnTabStopPositions,
int nTabOrigin
);

返回值：返回CSize对象，是用逻辑单位表示的字符串尺寸。

参数：
x | 指定字符串起点的X逻辑坐标。
y | 指定字符串起点的Y逻辑坐标。
lpszString | 要绘制的字符串的指针。可以为该参数传递CString对象数组的指针。
nCount | 指定字符串中的字符数。如果nCount为-1，其长度则可计算。
nTabPositions | 制表键停顿位数组中的个数。
lpnTabStopPosition | 包含制表键停顿位（逻辑单位）的数组指针。
nTabOrigin | 指定tab开始展开点的X 逻辑坐标。
str | 包含指定字符的CString对象。

说明：
调用该成员函数在指定位置上书写字符串并使用制表键停顿位置数组中的值进行展开。文本使用当前选定的字体书写，如果nTabPositions为0且lpnTabStopPositions为NULL，制表键按平均字符宽度的8倍来进行展开。如果nTabPositions为1，制表键停顿就会受到隔离，其距离是由lpnTabStopPositions指向的数组中的第一个值所指定的。如果lpnTabStopPositions指向多个值，在数组中为每一个值设置一个制表键停顿，一直到nTabPositions指定的数目为止。nTabOrigin参数允许应用对一单行多次调用TabbedTextOut函数。如果应用多次调用nTabOrigin设置为同一值的函数，函数将展开所有的制表位，相对位置由nTabOrigin指定。缺省地，函数不使用或更新当前位置。在调用函数时，如果需要更新当前位置，应用调用nFlags设置为TA_UPDATECP的函数。当该标记设定之后，Windows 覆盖随后调用的TabbedTextOut中的x和y参数，而使用当前位置。

请参阅：
CDC::GetTabbedTextExtent, CDC::SetTextAlign, CDC::TextOut, CDC::SetTextColor, ::TabbedTextOut , CSize


 CDC::TextOut

virtual BOOL TextOut(int x ,int y ,LPCSTR lpszString ,int nCount );
BOOL TextOut(int x ,int y ,const CString& str);

返回值：如果成功，则返回非零值，否则为0。

参数：
x | 指定文本起点的X逻辑坐标。
y | 指定文本起点的Y逻辑坐标。
lpszString | 要绘制的字符串的指针。
nCount | 字符串中的字节数。
str | 包含字符的CString对象。

说明：
用当前选定的字体在指定位置上书写文本。字符初始位置在字符单元的左上角。缺省地，函数不使用或更新当前位置。如果应用在调用TextOut时需要更新当前位置。可以调用nFlags设置为TA_UPDATECP的函数。当该标记设定之后，Windows忽略随后调用的TabbedTextOut中的x和y参数，而使用当前位置。

请参阅：
CDC::ExtTextOut, CDC::GetTextExtent, CDC::SetTextAlign, CDC::SetTextColor, CDC::TabbedTextOut, ::TextOut


 CDC::UpdateColors

void UpdateColors();

说明：
更新设备上下文的客户区域，使客户区域的当前颜色与基于像素的系统调色板匹配。在系统调色板发生变化时，非活动调色板可以调用UpdateColors来重新绘制客户区域。关于使用调色板的更多信息，请参阅联机文档揥in32 SDK程序员参考斨械?:UpdateColors。使用UpdateColors成员函数更新客户区域比重新绘制速度要快。但由于在系统调色板变化之前，函数进行的颜色转换是基于每个像素的颜色，所以调用该函数会导致某些颜色准确度丢失。

请参阅：CDC::RealizePalette, CPalette, ::UpdateColors


 CDC::WidenPath

BOOL WidenPath();

返回值：如果成功，则返回非零值，否则为0。

说明：
如果路径使用设备上下文中的当前画笔进行描绘，则在绘图时重新定义当前路径。只有在当前画笔是由CreatePen成员函数的第二种版本创建的几何画笔时，或者是由CreatePen的第一种版本创建的具有大于1的宽度（逻辑单位）的画笔时，函数成功。设备上下文必须包含一个闭合路径。路径中的任一Bezier曲线转换成连续线段，与加宽的曲线类似。这样，在调用WidenPath之后，路径中不再有Bezier曲线。

请参阅：
CDC::BeginPath, CDC::EndPath, CDC::SetMiterLimit, ::WidenPath


 CDC::m_hAttribDC

说明：
CDC 对象的属性设备上下文。缺省地，该设备上下文与m_hDC相同。通常，CDC GDI调用由m_hAttribDC指向的设备上下文的请求信息。请参阅CDC类描述中关于这两个设备上下文的更多信息。

请参阅：CDC::m_hDC, CDC::SetAttribDC, CDC::ReleaseAttribDC


 CDC::m_hDC

说明：
CDC 对象的输出设备上下文。缺省地，该设备上下文与m_hAttribDC相同，其它设备上下文与CDC绑定在一起。通常，CDC GDI调用产生到m_hDC设备上下文的输出。可以为m_hDC和m_hAttribDC指定不同的设备。

请参阅：CDC::m_hAttribDC, CDC::SetOutputDC, CDC::ReleaseOutputDC


 CDialog

CObject
└CCmdTarget
└CWnd
└CDialog

CDialog类是在屏幕上显示的对话框基类。对话框有两类：模态对话框和非模态对话框。模态对话框在应用继续进行之前必须关闭。非模态对话框允许用户执行另外的操作而不必取消或删除该对话框。
一个CDialog对象是对话框模板与一个CDialog派生类的组合。使用对话框编辑器创建对话框并存入资源之中，然后使用ClassWizard创建一个CDialog派生类。
同其它窗口一样，对话框从Windows 中获取信息。在对话框中你会对来自对话框控件的处理消息感兴趣，因为它说明了对话框是如何与用户交互的。ClassWizard观察对话框每个控件可能产生的消息，可以选择你所希望处理的消息。ClassWizard 将适当的消息映射器入口和消息处理成员函数加到一个新类中。你只需为成员函数编写应用的代码。
如果喜欢，在使用ClassWizard时可以编写自己的消息映射器入口和成员函数。
对于大多数普通对话框，可以向对话框派生类中添加成员变量以存储数据。数据是用户向对话框中输入的，或者为用户显示数据。ClassWizard观察对话框中与数据映射的控件并提示为每一控件创建一个成员变量。同时，为每一变量选择变量类型和取值范围。ClassWizard将成员变量加入对话框派生类中。
然后，ClassWizard写入成员函数与对话框控件之间的交换数据自动映射的数据。数据映射使函数可以为对话框控件提供适当的初始值。检索数据并对数据进行有效性检测。
要建立模态对话框，先使用构造程序为对话框派生类构造一个对象。然后调用DoModal创建对话框窗口及其控件。如果要建立非模态对话框，在构造程序中为对话框类调用Create即可。
还可使用DLGTEMPLATE数据结构在内存中建立模板，该结构在联机文档“Win32 SDK”中有描述。当构造了一个CDialog对象之后，调用CreateIndirect创建非模态对话框，或调用InitModalIndirect和DoModal来创建模态对话框。
ClassWizard在覆盖它为新对话框类加入的CWnd::DoDataExchange之后写入交换和有效性规则的数据映射。请参阅CWnd中的DoDataExchange成员函数。
程序和框架都通过调用CWnd::UpdateData间接调用DoDataExchange。当用户单击OK按钮关闭模态对话框时，框架调用UpdateData（如果单击了Cancel按钮，将不能获得数据）。OnInitDialog的缺省方式也是设置控件的初始值。为得到初始控件，通常要覆盖OnInitDialog。在所有对话框控件建立且在对话框显示之前，调用OnInitDialog。
在模态对话框与非模态对话框执行的任意时刻都可以调用CWnd::UpdateData。
如果要手工创建对话框，应为对话框派生类添加必需的成员变量，并添加已获得数据值的成员函数。
关于ClassWizard的更多信息，请参阅联机文档“Visual C++程序员指南”中的“使用 ClassWizard”。
在应用中调用CWinApp::SetDialogBkColor为对话框设置背景色。
当用户按下OK或Cancel按钮，或者调用EndDialog时，模态对话框自动关闭。
当实现一个非模态对话框时，总是覆盖OnCancel函数并从中调用DestroyWindows。不要调用CDialog::OnCancel基类。因为它会调用EndDialog，那会使对话框虽然存在但并不可视。模态对话框还应覆盖PostNcDestory以防止删除自身。模态对话框厂在框架中构造，不需要用PostNcDestory清除。
关于CDialog的更多信息，请参阅联机文档“Visual C++程序员指南”的“对话框主题”。
#include <afxwin.h>

CDialog类的成员

构造函数
CDialog 构造CDialog对象

初始化
Create | 初始化CDialog对象。创建非模态对话框和附在其上的对话框控件
CreateIndirect | 从内存中的对话框模板创建非模态对话框
InitModalIndirect | 从内存中的对话框模板创建模态对话框。保存参数直到调用DoModal函数

操作
DoModal | 调用模态对话框，使用后返回
MapDialogRect | 将对话框的矩形单位转换为屏幕单位
NextDlgCtrl | 在对话框中将焦点移到下一个对话框控件上
PrevDlgCtrl | 在对话框中将焦点移到前一个对话框控件上
GotoDlgCtrl | 在对话框中将焦点移到指定的对话框控件上
SetDefID | 改变对话框的缺省按钮
GetDefID | 获得对话框的缺省按钮
SetHelpID | 为对话框设置上下文的help ID
EndDialog | 关闭模态对话框

可覆盖的函数
OnInitDialog | 覆盖该函数可改变对话框初始设置
OnSetFont | 覆盖该函数可指定在对话框控件中输入文本时使用的字体
OnOK | 覆盖该函数可在对话框中进行OK按钮操作。缺省值是关闭对话框，DoModal返回IDOK
OnCancel | 覆盖该函数可在对话框中进行Cancel按钮操作或按ESC键。缺省值是关闭对话框，DoModal返回IDCANCEL


 CDialog::CDialog

CDialog(LPCSTR lpszTemplateName, CWnd* pParentWnd = NULL);
CDialog(UNIT nIDTemplate, CWnd * pParentWnd = NULL);

参数：
lpszTemplateName | 包含一个对话框模板资源的空终止字符串。
nIDTemplate | 包含对话框模板资源的ID号。
pParentWnd | 包含对话框的父窗口或所有者窗口对象的指针。如果其为NULL，则对话框对象的父窗口设置为主应用程序窗口。

说明：
构造一个基于资源的模态对话框。调用构造程序的窗体，其中一个窗体通过模板便可访问对话框。另一个一般使用带IDD_前缀（如IDD_DIALOG1）的模板ID号实现访问。
从内存中模板来构造模态对话框，首先需要参数和受保护的构造程序，然后调用InitModalIndirect。
使用上述方法之一构造好对话框之后，调用DoModal。
构造非模态对话框，使用CDialog构造程序中受保护的窗体。构造程序受到保护，因为必须从自己的对话框类中派生得到一个非模态对话框。
构造非模态对话框分两步进行：首先调用构造程序，然后调用Create成员函数创建基于资源的对话框，或者从内存模板中调用CreateIndirect来创建对话框。

请参阅：
CDialog::Create, CWnd::DestroyWindow, CDialog::InitModalIndirect, CDialog::DoModal, ::CreateDialog


 CDialog::Create

BOOL Create(LPCSTR lpszTemplateName, CWnd* pParentWnd = NULL);
BOOL Create(UNIT nIDTemplate, CWnd* pParentWnd = NULL);

返回值：
如果对话框创建和初始化成功，则返回非零值，否则为0。

参数：
lpszTemplateName | 包含一个对话框模板资源的空终止字符串。
pParentWnd | 指向含有对话框的父窗口对象的指针。如果为NULL，对话框对象的父窗口设置为应用的主窗口。
nIDTemplate | 包含对话框模板资源的ID数。

说明：
调用Create，使用资源中对话框模板来创建非模态对话框。可将调用置于构造程序内部或者在构造程序启动之后调用。
Create成员函数为访问对话框模板资源提供了两种方法，既可以通过模板名称，也可以模板ID号（如IDD_DIALOG1）。
每种访问方法都会给父窗口传递一个指针。如果pParentWnd为NULL，则应用的主窗口作为其父窗口或所有者窗口来进行创建。
当创建对话框后，Create成员函数应立即返回。
在父窗口中创建之后，如果要求对话框出现，则使用模板中的WS_VISIBLE风格。否则，必须调用ShowWindow。其它对话框风格及应用，请参阅联机文档“Win32 SDK”中的DIGTEMPLATE结构和“Microsoft Visual C++ 6.0 MFC类库参考手册（二）”中的“Windows风格”。使用CWnd::DestroyWindow函数来删除由Create函数创建的对话框。

请参阅： CDialog::CDialog, CWnd::DestroyWindow, CDialog::InitModalIndirect, CDialog::DoModal,::CreateDialog


 CDialog::CreateIndirect

BOOL CreateIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd = NULL);
BOOL CreateIndirect(HGLOBAL hDialogTemplate, CWnd* pParentWnd = NULL);

返回值：
如果对话框创建和初始化成功，则返回非零值，否则为0。

参数：
lpDialogTemplate | 包含用于创建对话框的对话框模板的指针。该模板位于DLGTEMPLATE结构和控件信息表单中。有关该结构的更多信息，请参阅联机文档“Win32 SDK”。
pParentWnd | 指向含有对话框的父窗口对象的指针。如果为NULL，对话框对象的父窗口设置为应用的主窗口。
hDialogTemplate | 包含对话框模板的全局内存的句柄。模板使用DLGTEMPLATE结构的形式。

说明：
调用该成员函数从对话框模板中创建一个非模态对话框。
当创建对话框后，CreateIndirect成员函数立即返回。
在父窗口中创建之后，如果要求对话框出现，则使用模板中的WS_VISIBLE风格。否则，必须调用ShowWindow。其它对话框风格及应用，请参阅联机文档“Win32 SDK”中的DIATEMPLATE结构和“Microsoft Visual C++ 6.0 MFC类库参考（二）”中的“Windows风格”。使用CWnd::DestroyWindow函数删除由CreateIndirect创建的对话框。

请参阅：
CDialog::CDialog, CWnd::DestroyWindow, CDialog::Create, ::CreateDialogIndirect


 CDialog::DoModal

virtual int DoModal();

返回值：
整数值，指定了传递给CDialog::EndDialog 的nResult参数值。该函数用于关闭对话框。如果函数不能创建对话框，则返回-1；如果出现其它错误，则返回IDABORT。

说明：
调用该成员函数使用模态对话框并返回对话框结果。当对话框处于活动状态时，该函数处理与用户的交互。这使得对话框是模态的，使用户在关闭对话框之前不能与其它窗口交互。
如果用户单击了对话框中的按钮，如OK或Cancel，那么消息处理函数如OnOK或OnCancel被调用，从而关闭对话框。缺省的OnOK成员函数会对对话框数据进行有效性检验和更新，并关闭它得到结果IDOK。缺省OnCancel函数关闭对话框得到结果IDCANCEL，而不对对话框数据检验或更新，可以覆盖这些消息函数并改变它们的行为。注意 目前PreTransMessage被调用来处理模态对话框的消息。

请参阅：::DialogBox, CWnd::IsDialogMessage


 CDialog::EndDialog

void EndDialog(int nResult);

参数：
nResult 对话框返回的值，用于调用者DoModal。

说明：
调用该成员函数来中止一个模态对话框。该函数返回nResult。无论模态对话框是何时被创建的，必须使用EndDialog来结束处理。
可以随时调用EndDialog，即使在使用OnInitDialog时，即在对话框显示或获得输入焦点之前就关闭它。
EndDialog不会立即关闭对话框。它设置了一个标记，用以指定在当前消息处理程序返回时就关闭对话框。

请参阅：
CDialog::DoModal, CDialog::OnOK, CDialog::OnCancel


 CDialog::GetDefID

DWORD GetDefID() const;

返回值：
32位值（DWORD）。如果缺省按钮具有ID值，则高位字包括DC_HASDEFID ，低位字包含ID值。如果缺省按钮不具有ID值，则返回0。

说明：
调用该GetDefID成员函数获得对话框缺省按钮的ID值。通常是一个OK按钮。

请参阅：CDialog::SetDefID, DM_GETDEFID


 CDialog::GotoDlgCtrl

void GotoDlgCtrl(CWnd* pWndCtrl);

参数：
pWndCtrl 接收焦点的窗口（控件）标识。

说明：
在对话框内移动焦点至指定的控件。
要得到作为pWndCtrl传递的控件（子窗口）的指针。调用CWnd::GetDlgItem成员函数，它返回一个CWnd 对象指针。

请参阅：
CWnd::GetDlgItem, CDialog::PrevDlgCtrl, CDialog::NextDlgCtrl


 CDialog::InitModalIndirect

BOOL InitModalIndirect(LPCDLGTEMPLATE lpDialogTemplate, CWnd* pParentWnd = NULL);
BOOL InitModalIndirect(HGLOBAL hDialogTemplate, CWnd* pParentWnd = NULL);

返回值：
如果对话框对象创建和初始化成功，则返回非零值，否则为0。

参数：
lpDialogTemplate | 包含用于创建对话框的对话框模板的指针。该模板位于DLGTEMPLATE结构和控件信息表单中。有关该结构的更多信息，请参阅联机文档“Win32 SDK”。
hDialogTemplate | 包含对话框模板的全局内存的句柄。模板使用DLGTEMPLATE结构的形式。
pParentWnd | 指向含有对话框的父窗口和所有者窗口（CWnd类型）的指针。如果其为NULL，对话框对象的父窗口设置为主应用程序窗口。

说明：
调用该成员函数，使用内存中构造的对话框模板初始化模态对话框。
要间接创建一个模态对话框，首先应分配一块全局内存用于存放对话框模板，然后调用空的CDialog构造程序构造对话框对象，再调用InitModalIndirect将句柄存入内存中的对话框模板。当调用DoModal成员函数后，Windows 对话框被创建并显示。

请参阅：
::DialogBoxIndirect, CDialog::DoModal, ::CDialogCWnd::DestroyWindow CDialog


 CDialog::MapDialogRect

void MapDialogRect(LPRECT lpRect) const;

参数：
lpRect RECT结构或CRect对象的指针，包含有用于转换的对话框的逻辑坐标。

说明：
将对话框单位转换为屏幕单位。对话框单位是用当前对话框基本单位表示的。基本单位是从对话框文本的字符平均高度和宽度得到的。1个水平单位是1/4个对话框基本宽度单位，1个垂直单位是1/4个对话框基本高度单位。
GetDialogBaseUnits 返回系统字体的尺寸信息，但如果在资源定义文件中使用了DS_SETFONT风格，便可以为每个对话框指定不同的字体。MapDialogRect函数对话框使用适当的字体。
MapDialogRect用屏幕单位（像素）替代了lpRect中的对话框单位，以便矩形能用于创建对话框或者在框内为控件确定位置。

请参阅：::GetDialogBaseUnits, ::MapDialogRect, WM_SETFONT


 CDialog::NextDlgCtrl

void NextDlgCtrl() const;

说明：
在对话框内将焦点移到下一个控件。如果焦点位于最后一个控件，则移到第一个控件上。

请参阅：CDialog::PrevDlgCtrl, CDialog::GotoDlgCtrl


 CDialog::OnCancel

virtual void OnCancel();

说明：
当用户在模态对话框或非模态对话框内单击Cancel按钮或按ESC键时，窗体调用这个成员函数。
覆盖该成员函数，执行Cancel按钮动作，缺省方式是调用EndDialog来简单中止模态对话框，并使DoModal 返回IDCANCEL。
如果在非模态对话框中实现Cancel按钮，必须覆盖OnCancel成员函数，并在其中调用DestoryWindow。不能调用基类成员函数，那将会调用EndDialog，使对话框虽然存在但不可视。

请参阅：CDialog::OnOK, CDialog::EndDialog


 CDialog::OnInitDialog

virtual BOOL OnInitDialog();

返回值：
指定对话框是否对它的一个控件设置输入焦点。如果OnInitDialog返回非零值，Windows将输入焦点设在对话框的第一个控件上，只有在对话框明确将输入焦点设在某控件上，应用返回0。

说明：
调用这个成员函数是对WM_INITDIALOG消息作出的反应。这条消息是在对话框即将显示之前，在Create ，CreateIndirect或DoModal调用期间发出的。
如果在对话框初始化后需要执行特别处理，覆盖该函数。首先调用基类OnInitDialog，但不考虑其返回值。正常情况下，覆盖的函数返回TRUE。Windows调用OnInitDialog函数是通过标准的全局对话框过程（它们对于所有的Microsoft基础类库的对话框是通用的），而不是通过消息映射。因此该函数不需要消息映射入口。

请参阅：
CDialog::Create, CDialog::CreateIndirect, WM_INITDIALOG


 CDialog::OnOK

virtual void OnOK();

说明：
当用户按OK按钮（ID是IDOK）时调用。
覆盖该函数执行OK按钮动作。如果对话框包括自动数据检验和交换，缺省方式是对应用的某些变量进行数据的检验和更新。
如果在非模态对话框中实现OK按钮，必须覆盖OnOK成员函数，并在其中调用DestoryWindow。不能调用基类成员函数，那将会调用EndDialog，使对话框虽然存在但不可视。

请参阅：CDialog::OnCancel, CDialog::EndDialog


 CDialog::OnSetFont

virtual void OnSetFont(CFont* pFont);

参数：
pFont 字体指针。用作对话框中所有字体使用的缺省值。

说明：
书写文本时为对话框控件指定字体。对话框控件使用指定字体作为所有对话框控件的缺省值。
对话框编辑器设置字体，将其作为对话框模板资源的一部分。

请参阅：WM_SETFONT, CWnd::SetFont


 CDialog::PrevDlgCtrl

void PrevDlgCtrl() const;

说明：
把对话框中的焦点移到前一个控件。如果焦点在第一个控件上，则移到对话框中最后一个控件上。

请参阅：CDialog::NextDlgCtrl, CDialog::GotoDlgCtrl


 CDialog::SetDefID

void SetDefID(UNIT nID);

参数：
nID 指定用作缺省按钮的按钮控件的ID。

说明：为对话框改变缺省按钮。

请参阅：CDialog::GetDefID


 CDialog::SetHelpID

void SetHelpID(UNIT nIDR);

参数：
nIDR 指定上下文帮助ID。

说明：为对话框指定上下文帮助ID。


 CDialogBar

CObject
└CCmdTarget
└CWnd
└CControlBar
└CDialogBar

CDialogBar类在控件条中提供Windows非模态对话框。对话条与对话框类似，包含有标准Windows控件。另一个相似点是能够创建对话模板来表示对话条。
创建和使用对话条与创建和使用CFormView对象类似。首先使用对话编辑器（在“Visual C++用户指南”中有描述）定义一个带有WS_CHILD风格而没有其它风格的对话模板。模板决不能包含WS_VISIBLE风格。在应用代码中调用构造程序来构造CDialogBar对象，再调用Create创建对话条窗口，并将其加在CDialogBar对象中。
关于CDialogBar的更多信息，请参阅联机文档“Visual C++程序员指南”中的“对话条主题”，以及联机文档Visual C++中的“技术指南31 ,控件条”。
#include <afxext.h>
请参阅：CFormView, CControlBar

CDialogBar类的成员

构造函数
CDialogBar | 构造一个CDialogBar对象
Create | 创建与CDialogBar对象相连的Windows对话条


 CDialogBar::CDialogBar

CDialogBar();

说明：构造一个CDialogBar对象。

请参阅：CControlBar


 CDialogBar::Create

BOOL Create(CWnd* pParentWnd, LPCSTR lpszTemplateName, UNIT nStyle, UNIT nID);
BOOL Create(CWnd* pParentWnd, UNIT nIDTemplate, UNIT nStyle, UNIT nID);

返回值：如果成功，则返回非零值，否则为0。

参数：
pParentWnd | 指向CWnd对象的指针。
lpszTemplateName | 指向CDialogBar对象的对话框资源模板名字的指针。
nStyle对话条的对齐方式。可以为下列值：
· | CBRS_TOP | 控件条在框架窗口的顶部。
· | CBRS_BOTTOM | 控件条在框架窗口的底部。
· | CBRS_NOALIGN | 当父窗口重新设置尺寸时，控件条不重新设置位置。
· | CBRS_LEFT | 控件条在框架窗口的左边。
· | CBRS_RIGHT | 控件条在框架窗口的右边。
nID | 对话条的控制ID。
nIDTemplate | CDialogBar对象的对话框模板的资源ID。

说明：
装入由lpszTemplateName或nIDTemplate指定的对话框资源模板的创建的对话条窗口。设置风格并将其与CDialogBar对象相联系。
如果指定CBRS_TOP或CBRS_BOTTOM对齐方式，对话条宽度为窗口宽度，高度由nIDTemplate指定的资源确定。如果指定CBRS_LEFT或CBRS_RIGHT对齐方式，对话条高度为窗口宽度，高度由nIDTemplate指定的资源确定。

请参阅：CDialogBar::CDialogBar


 CDocItem

CObject
└CCmdTarget
└CDocItem

CDocItem是文档项的基类，是文档数据的一部分。CDocItem对象用于表示客户和服务器文档中的OLE项。
关于CDocItem的更多信息，请参阅联机文档“Visual C++程序员指南”中的“包容器：实现一个包容器”。
#include <afxole.h>
请参阅：COleDocument, COleServerItem, COleClientItem

CDocItem类的成员

操作
GetDocument 返回包含项的文档

可覆盖的函数
IsBlank 决定项中是否包含信息


 CDocItem::GetDocument

CDocument* GetDocument() const;

返回值：包含项的文档指针。如果项不是文档的一部分，则返回NULL。

说明：
调用该函数获得包含项的文档。
该函数在COleClientItem和COleServerItem的子类中被覆盖，则返回一个指向COleDocument ，COleLinkingDoc或COleServerDoc对象的指针。

请参阅：
COleDocument, COleLinkingDoc, COleServerDoc, COleClientItem, COleServerItem


 CDocItem::IsBlank

virtual BOOL IsBlank() const;

返回值：如果项中无信息，则返回非零，否则为0。

说明：
出现缺省串行化时，窗口调用该函数。
缺省地，CDocItem非空。COleClientItem对象有时为空是因为它们直接由CDocItem派生的。然而，COleServerItem对象总是为空。缺省地，含有无X或Y扩展的COleClientItem对象的应用是串行化的。当项没有X或Y扩展时，通过覆盖IsBlank可返回TRUE。如果串行化期间要实现其它动作，应覆盖本函数。

请参阅：CObject::Serialize


 CDockState

CObject
└CDockState

CDockState是串行化的CObject类，装载、卸载或清除文件中多个控件条的状态。停靠状态包括条的尺寸和位置，以及它是否被停靠。当检索存放的停靠状态时，CDockState检查条的位置。如果条在当前屏幕设置下不可视，CDockState安排条的位置使其可视。CDockState的主要目的是掌握多个控件条的全部状态，并允许状态被注册表、应用的.INI文件保存和装载。
条可以是任何可停靠的控件条，包括工具条、状态条、对话条等。CDockState对象通过 CArchive对象写入文件或从文件中读出。
CFrameWnd::GetDockState 获得所有窗体的CControlBar对象的状态信息，并将其装入CDockState对象。可使用串行化或CDockState 存储CDockState的内容。如果要恢复框架窗口中的控件条，可以用串行化或CDockState 装入状态值，再使用CFrameWnd::SetDockState 将保存的状态用于框架的控件条。
关于CDockState的更多信息，请参阅联机文档“Visual C++程序员指南”中的“框架窗口主题”、“控件条主题”和“工具条：停靠与浮动”。
#include <afxadv.h>

CDockState类的成员

数据成员
m_arrBarInfo 存放每个控件条的停靠状态值的指针数组

构造函数
CDockState 构造一个CDockState对象

操作
Clear | 清除停靠状态信息
GetVersion | 获得存储的控件条的版本号
LoadState | 从注册表或.INI文件中获取状态信息
SaveState | 将状态信息保存在注册表或INI文件中


 CDockState::CDockState

CDockState();

说明：构造一个CDockState对象。

请参阅：
CDockState::Clear, CDockState::GetVersion, CDockState::LoadState, CDockState::SaveState, CFrameWnd::GetDockState, CFrameWnd::SetDockState


 CDockState::Clear

void Clear();

说明：
调用该函数来清除CDockState对象保存的所有停靠信息。不仅包含条是否被停靠，还有条的尺寸、位置以及是否可视等信息。

请参阅：
CDockState::LoadState, CDockState::SaveState, CDockState::GetVersion, CFrameWnd::GetDockState, CFrameWnd::SetDockState


 CDocState::GetVersion

DWORD GetVersion();

返回值：
如果存放条信息比当前条状态旧，则值为1；如果存放条信息与当前条状态一样，则值为2。

说明：
调用该成员函数来获取存放条状态的版本的数目。版本信息使一个改进的条能添加新的属性，并仍能被早期版本的条检测和装载。

请参阅：
CDockState::LoadState, CDockState::SaveState, CDockState::Clear, CFrameWnd::GetDockState, CFrameWnd::SetDockState


 CDockState::LoadState

void LoadState( LPCTSTR lpszProfileName );

参数：
lpszProfileName 空终止字符串的指针。代表初始文件中某部分或者是存放状态信息的Windows注册表的一个关键字。

说明：
调用该成员函数从注册表或.INI文件中获取状态信息。描述文件的名字是应用.INI文件或者包含条状态信息的注册表的一部分。可以通过SaveState将控件条的状态信息保存到注册表或.INI文件中。

请参阅：
CDockState::SaveState, CDockState::GetVersion, CFrameWnd::GetDockState, CFrameWnd::SetDockState


 CDockState::SaveState

void SaveState ( LPCTSTR lpszProfileName );

参数：
lpszProfileName 空终止字符串的指针。代表初始文件中某部分或者是存放状态信息的Windows注册表的一个关键字。

说明：
调用该成员函数将状态信息存入注册表或.INI文件中。描述文件的名字是应用.INI文件或者包含条状态信息的注册表的一部分。SaveState还保存当前屏幕尺寸。可以获取LoadState保存在注册表或.INI文件中的控件条的信息。

请参阅：
CDockState::LoadState, CDockState::GetVersion, CDockState::Clear, CFrameWnd::GetDockState, CFrameWnd::SetDockState


 CDockState::m_arrBarInfo

说明：
一个CPtrArray对象是一个指针数组，指向每个控件条保存的信息，状态信息将在CDockState对象中。

请参阅：
CDockState::LoadState, CDockState::SaveState, CDockState::Clear, CFrameWnd::GetDockState, CFrameWnd::SetDockState


 CDocObjectServer

CObject
└CCmdTarget
└CDocObjectServer

CDocObjectServer类实现了附加的OLE接口。一个普通的COleDocument服务器成为完全的DocObject服务器需要它们：IOleDocument，IOleDocumentView，IOleCommandTarget和IPrint。CDocObjectServer由CCmdTarget派生，并与COleServerDoc组合以便打开接口。
一个DocObject服务器文档包括CDocObjectServerItem对象，它表示DocObject项的服务器界面。
要定制自己的DocObject服务器，从CDocObjectServer派生一个类，并覆盖它的启动函数OnActivateView，OnApplyViewState和OnSaveStateViewState。还需要类的一个实例以便对窗口调用作出反应。
关于DocObjects的更多信息，请参阅CDocObjectServerItem ,COleCmdUI和 “Visual C++程序员指南”中的“Internet初步：活动文档” 和“活动文档”。
#include <afxdocobj.h>
请参阅：CDocObjectServerItem

CDocObjectServer类的成员

构造函数
CDocObjectServer 构造一个CDocObjectServerItem对象

操作
ActivateDocObject 激活文档对象服务器，但并不显示它

可覆盖的函数
OnActivateView | 显示DocObject视图
OnApplyViewState | 恢复DocObject视图的状态
OnSaveViewState | 保存DocObject视图的状态


 CDocObjectServer::ActivateDocObject

void ActivateDocObject();

说明：
调用该成员函数来激活（但不显示）文档对象服务器。
ActivateDocObject调用IOleDocument的 ActivateMe方法，但并不显示视图，它需要等待由CDocObjectServer::OnActivateView调用提供的如何启动并显示视图的指令。
ActivateDocObject与OnActivateView一起激活并显示DocObject视图。
DocObject激活与其它类型的OLE的激活不同。DocObject激活覆盖显示阴影边界和对象装饰（如尺寸句柄），忽略对象扩展函数，并在视图矩形内部绘制滚动条，而不是在矩形外部（普通激活采用）。

请参阅：CDocObjectServerItem


 CDocObjectServer::CDocObjectServer

CDocObjectServer(COleServerDoc* pOwner,LPOLEDOCUMENTSITE pDocSize= NULL);

参数：
pOwner | 客户文档的指针。以DocObject为服务器。
pDocSize | 由包容器实现的IOleDocument接口的指针。

说明：
构造并初始化一个CDocObjectServer对象。
当DocObject活动时，客户OLE接口（IOleDocumentSite）允许DocObject服务器与其客户（包容器）通信。
DocObject服务器被激活时，它首先检测包容器是否实现了IOleDocumentSite接口。如果是，调用COleServerDoc::GetDocObjectServer来观察包容器是否支持DocObjects。缺省地，GetDocObjectServer 返回空。必须覆盖ColeServer-Doc::GetDocObjectServer来构造新的CDocObjectServer对象或者从已有对象中派生。COleServerDoc 包容器的指针和IOleDocument Site接口作为参数传递给构造程序。

请参阅：
CDocObjectServerItem, COleServerDoc::GetDocObjectServer


 CDocObjectServer::OnActivateView

virtual HRESULT OnActivateView();

返回值：
返回错误值或警告值。缺省地，如果成功，则返回NOERROR，否则返回E_FAIL。

说明：
调用该函数来显示DocObject视图。该函数创建一个框架窗口，可在视图内画出滚动条，建造与服务器共享的菜单条，添加框架控制，设置活动对象，还能显示框架窗口和设定焦点。

请参阅：CDocObjectServer::OnApplyViewState


 CDocObjectServer::OnApplyViewState

virtual void OnApplyViewState(CArchive& ar);

参数：
ar CArchive对象，它对视图状态进行串行化。

说明：
覆盖该函数恢复DocObject视图的状态。
当视图第一次显示时调用该函数，OnApplyViewState建议对视图重新初始化，根据OnSaveViewState保存在CArchive 中的值进行。视图必须检验Carchive对象中的数据，因为包容器不会对视图状态数据进行解释。
可以使用OnSaveViewState保存视图特定状态的连续信息。如果覆盖On-SaveViewState保存信息，将要覆盖OnApplyViewState来阅读信息，并在新的激活中将其用于视图。

请参阅：CDocObjectServer::OnSaveViewState


 CDocObjectServer::OnSaveViewState

virtual void OnSaveViewState(CArchive& ar);

参数：
ar CArchive对象，它对视图状态进行串行化。

说明：
覆盖该函数保存DocObject视图的状态。
视图状态可能包括视图类型、放大因子、插入点和选取点等属性。包容器一般在视图失去活动能力时调用该函数保存的状态信息，可由OnApplyViewState恢复。
可以使用OnSaveViewState保存视图特定状态的连续信息。如果覆盖OnSaveViewState保存信息，将要覆盖OnApplyViewState来阅读信息，并在新的激活中将其用于视图。

请参阅：CDocObjectServer::OnApplyViewState


 CDocObjectServerItem

CObject
└CCmdTarget
└CDocItem
└COleServerItem
└CDocObjectServerItem

CDocObjectServerItem由COleServerItem派生得到，实现了OLE服务器为CDocObject服务器指定的动作。
CDocObjectServerItem定义了可以覆盖的成员函数：OnHide，OnOpen，OnShow。
要使用CDocObjectServerItem，应确保COleSeverDoc派生类覆盖的OnGetEmbeddedItem返回一个新的CDocObjectServerItem对象。如果需要改变函数功能，可以为自己的CDocObjectServerItem派生类创建一个新的实例。
关于CDocObjects的更多信息，请参阅CDocObjectServer, COleCmdUI和联机“Visual C++程序员指南”中的“Internet初步：活动文档” 和“活动文档”
#include <afxdocobj.h>
请参阅：CDocObjectServer, COleDocObjectItem

CDocObjectServerItem类的成员

构造函数
CDocObjectServerItem 构造一个CDocObjectServerItem对象

可覆盖的函数
OnHide | 如果框架要隐藏一个DocObject对象，产生异常
OnOpen | 由框架调用，使DocObject项在框架内是活动的。如果项不是DocObject对象，调用COleServerItem::OnOpen
OnShow | 由框架调用，使DocObject项在框架内是活动的。如果项不是DocObject对象，调用COleServerItem::OnShow


 CDocObjectServerItem::CDocObjectServerItem

CDocObjectServerItem(COleServerDoc* pServerDoc, BOOL bAutoDelete);

参数：
pServerDoc | 包含新的DocObject项的文档指针。
bAutoDelete | 当链接释放时决定对象是否被删除。如果CDocObjectServerItem是文档的一部分，该参数为FALSE。如果CDocObjectServerItem对象是一个次级结构，用来标识文档数据的范围，数据能被框架删除，则返回TRUE。

说明：构造一个CDocObjectServerItem对象。

请参阅：CDocObjectServer


 CDocObjectServerItem::OnHide

virtual void OnHide();

说明：
由框架调用来隐藏项，缺省实现方式是产生异常。如果项为DocObject对象指针，不能隐藏一个活动的DocObject项。必须使其失去活动能力才能使其消失。如果该项不是DocObject对象，缺省动作是调用COleServerItem::OnHide。

请参阅：
CDocObjectServerItem::OnOpen, CDocObjectServerItem::OnShow


 CDocObjectServerItem::OnOpen

virtual void OnOpen();

说明：
由框架调用，服务器应用使框架内的DocObject对象活动。如果该项不是DocObject对象，缺省动作是调用COleServerItem:: OnOpen。如果在打开DocObject项时要进行特别处理，覆盖该函数。

请参阅：
CDocObjectServerItem::OnHide, CDocObjectServerItem::OnShow


 CDocObjectServerItem::OnShow

virtual void OnShow();

说明：
由框架调用，服务器应用使框架内的DocObject对象活动。如果该项不是DocObject对象，缺省动作是调用COleServerItem:: OnShow。如果在打开DocObject项时要进行特别处理，覆盖该函数。

请参阅：
CDocObjectServerItem::OnOpen, CDocObjectServerItem::OnOpen


 CDocTemplate

CObject
└CCmdTarget
└CDocTemplate

CDocTemplate是抽象的基类，它定义了文档模板的基本函数功能。通常通过应用的InitInstance函数来实现创建一或多个文档模板。文档模板定义了三个类之间的关系。
· | 文档类 | 由CDocument派生得到。
· | 视图类 | 显示文档类的数据，可从CView,CScrollView, CFormView或CEditView中派生得到（可直接使用CEditView）。
· | 框架窗口类 | 含有视图，对SDI应用，由CFrameWnd派生得到；对MDI，由CMDIChildWnd派生得到。如果无需定制框架窗口的行为，可直接使用CMDIChildWnd或CFrameWnd。
应用对它支持的每一类文档都提供了一个文档模板。例如，如果应用支持工作表和文本文档，则应用有两个文档模板对象。每个文档模板负责建立与管理该类型的文档。
文档模板将文档、视图和框架窗口类的指针保存在CRuntimeClass 对象中。当构造文档模板时，指定了CRuntimeClass对象。
文档模板包括文档类型（如菜单、图标、资源加速符号表）使用的资源ID，还含有文档类型的更多信息，包括文档类型名称（如WorkSheet）文件扩展名（如.xls）。有的还包括应用的用户界面、Windows 文件管理器和OLE支持等。
如果应用是一个OLE包容器与/或服务器，文档模板还说明了在激活时使用的菜单ID。如果应用是ID服务器，文档模板定义了在激活时使用的工具条ID。通过SetContainerInfo和SetServerInfo来指定这些OLE资源。
CDocTemplate是抽象类，不能直接使用，通常应用使用Microsoft基础类库提供的两种CDocTemplate派生类之一：CSingleDocTemplate用于SDI，CMultiDocTemplate用于MDI。使用文档模板时要参阅更多信息。如果应用需要变化的用户界面，这与SDI与MDI有根本不同，可以从CDocTemplate中派生出自己的类。
关于CDocTemplate的更多信息，请参阅联机文档“Visual C++程序员指南”中的“文档摸板和文档/视图创建进程”。
#include <afxwin.h>

请参阅：
CSingleDocTemplate, CMultiDocTemplate, CDocument, CView, CScrollView, CEditView, CFormView, CFrameView, CMDIChildWnd

CDocTemplate类的成员

构造函数
CDocTemplate 构造一个CDocTemplate对象

属性
SetContainerInfo | 决定在编辑内部OLE项时使用的OLE资源
SetServerInfo | 决定在编辑或嵌入服务器文档时的资源和类
GetFirstDocPosition | 获得与模板相连的第一个文档的位置
GetNextDoc | 获得下一个文档及其位置
LoadTemplate | 为CDocTemplate及其派生类装载资源

操作
AddDocument | 向模板中添加文档
RemoveDocument | 将文档从模板中移去
GetDocString | 获得与文件类型相关的字符串
CreateOleFrame | 创建具有OLE能力的框架窗口

可覆盖的函数
MatchDocType | 决定文档类型与模板匹配的程度
CreateNewDocument | 创建新文档
CreateNewFrame | 创建包含一个文档和视图的框架窗口
InitialUpdateFrame | 初始化框架窗口，可以将其设置为可视
SaveAllModified | 保存与模板相关的所有修改过的文档
CloseAllDocuments | 关闭所有与模板相关的文档
OpenDocumentFile | 打开路径名指定的文件
SetDefaultTitle | 在文档窗口的标题条中显示标题


 CDocTemplate::AddDocument

virtual void AddDocument(CDocument* pDoc);

参数：
pDoc 被用于添加的文档的指针。

说明：
使用该函数添加文档到模板上。派生类CSingleDocTemplate和CMultiDocTemplate覆盖该函数。如果要从CDocTemplate中派生得到自己的文档模板类，则派生类必须覆盖这个函数。

请参阅：
CDocTemplate::RemoveDocument, CMultiDocTemplate, CSingleDocTemplate


 CDocTemplate::CDocTemplate

CDocTemplate(UINT nIDResource,
CRuntimeClass* pDocClass,
CRuntimeClass* pFrameClass,
CRuntimeClass* pViewClass
);

参数：
nIDResource 指定带有文档类型的资源ID。可以包括菜单、图标、加速符号表和字符串资源等。
字符串资源包括由“\n”字符分隔的子串，最多可有7个子串（当子串不能被包括时，需要使用“\n”作为占位符，但是以“\n”结尾的不是必需的）。这些子串描述了文档类型。要了解子串的信息，请参阅GetDocString。字符串资源在应用的资源文件中可以找到。如：
//MYCALC.RC
STRINGTABLE PRELOAD DISCARDABLE
BEGIN
IDR_SHEETTYPE"\nSheet\nWorksheet\nWorksheets
∑(*.myc)\n.myc\n MyCalcSheet\nMyCalc Worksheet"
END
注意字符串以“\n”字符开始，这是因为第一个子串不用于MDI应用，所以没有包括进去。可使用字符串编辑器编辑该串。在编辑器中，整个字符串作为一个字符串输入，而不是7个被分隔的字符串。
要了解资源类型的更多信息，请参阅“Visual C++用户指南”。
pDocClass文档类的CRuntimeClass 对象的指针。该类是从CDocument 类派生得到的，用来定义文档。pFrameClass框架窗口类的CRuntimeClass 对象的指针。该类是从CFrameWnd类派生得到的，如果需要主框架窗口的缺省行为，也可以是CFrameWnd本身。pViewClass视图类的CRuntimeClass 对象的指针。该类是从CView类派生得到的，用来显示文档。

说明：
该成员函数构造一个CDocTemplate对象。可在应用类的InitInstance成员函数中动态分配CDocTemplate对象，将其传递给CwinApp::AddDocTemplate。

请参阅：
CDocTemplate::GetDocString, CWinApp::AddDocTemplate, CWinApp::InitInstance, CRuntimeClass


 CDocTemplate::CloseAllDocuments

virtual void CloseAllDocument(BOOL bEndSession);

参数：
bEndSession 指定会话是否结束，结束为TRUE，否则为FALSE。

说明：
调用该成员函数来关闭所有打开的文档。常用作FileExit命令的一部分。缺省行为是调用CDocument::DeleteContents 成员函数来删除文档数据，然后关闭框架窗口与所有与该文档连接的视图。

请参阅：
CDocTemplate::OpenDocumentFile, CDocTemplate::SaveAllModified


 CDocTemplate::CreateNewDocument

virtual CDocument* CreateNewDocument();

返回值：新创建文档的指针。如果出错，则返回NULL。

说明：调用该成员函数创建该文档模板类型的文档。

请参阅：CDocTemplate::CreateNewFrame


 CDocTemplate::CreateNewFrame

virtual CFrameWnd* CreateNewFrame(CDocument* pDoc, CFrameWnd* pOther);

返回值：新创建框架窗口的指针。如果出错，则返回NULL。

参数：
pDoc | 新框架窗口所参照的文档，可取NULL值。
pOther | 用于放置新框架窗口的框架窗口，可取NULL值。

说明：
CreateNewFrame使用传递给构造函数的CRuntimeClass 对象来创建新的框架窗口，并附加有文档和视图。如果pDoc为NULL，框架输出TRACE消息。
pOther参数用于实现Window的New命令。它提供了新框架窗口所基于的模式，新框架窗口通常是可视的。调用这个函数创建框架窗口而不用框架的File New和File Open实现。

请参阅：
CCreateContext, CFrameWnd::LoadFrame, CDocTemplate::InitialUpdateFrame


 CDocTemplate::CreateOleFrame

CFrameWnd* CreateOleFrame(CWnd* pParentWnd, CDocument* pDoc,BOOL bCreateView);

返回值：如果成功，则返回框架窗体的指针；否则返回NULL。

参数：
pParentWnd | 框架父窗口的指针。
pDoc | 指向文档的指针，该文档是新OLE框架窗口的参考。
bCreateView | 决定是否利用该框架创建视图。

说明：创建OLE框架窗口。如果bCreateView为0，创建一个空的框架。

请参阅：
CDocTemplate::CreateNewFrame, COleDocument, COleIPFrameWnd


 CDocTemplate::GetDocString

virtual BOOL GetDocString(CString& rString, enum DocStringIndex index)const;

返回值：如果找到指定的子串，则返回非零值，否则为0。

参数：
rString 函数返回时，包含字符串的CString对象的一个参考。
index描述文档模板的字符串的子串索引，可取下列值之一：
· | CDocTemplate::WindowTitle | 窗口标题条上出现的名字（如：“Microsoft Excel”），只有在SDI应用的文档模板中出现。
· | CDocTemplate::DocName | 缺省文档名称（如：“Sheet”）。该名称加上一个数字一起作为该类型新文档的缺省名字，不论用户何时选择File菜单中的New 命令（如：“Sheet 1”或“Sheet 2”）。如果未指定，使用“Untitled”作为缺省值。
· | CDocTemplate::FileNewName | 文档类型名字。如果应用支持多个文档类型，则该字符串显示在File New对话框中（如：“WorkSheet”）。如果未指定，使用File New命令访问不到文档类型。
· | CDocTemplate::FilterName | 与文档类型匹配的文档类型各过滤器的描述。该字符串显示在File Open对话框的文件类型下拉列表中（如：“WorkSheet”(*.xls)）。如果未指定，使用File Open命令得不到文档类型。
· | CDocTemplate::FilterExt | 文档类型的扩展名（如：“.xls”）。如果未指定，使用File Open命令访问不到文档类型。
· | CDocTemplate::RegFileTypeID | 保存在Windows 的注册数据库中的文档类型的标识。该字符串只用于模板使用（如：“ExcelWorkSheet”）。如果未指定，Windows 文件管理器将不登记该类型。
· | CDocTemplate::RegFileTypeName | 注册库中保存的文档类型名称。在访问注册库的应用的对话框中会得到显示（如：“Microsoft Excel WorkSheet”）。

说明：
调用该成员函数获得描述文档类的子串信息。含有子串字符串保存在文档模板中并由资源文件中的字符串派生得到。框架调用该函数获得应用的用户界面所需的字符串。如果应用文档指定文档扩展名，在向Windows注册库添加入口时，框架也会调用该函数，这就允许在Windows 文件管理器中打开文档。
如果从CDocTemplate中导出自己的类，则调用该函数。

请参阅：
CMultiDocTemplate::CMultiDocTemplate, CSingleDocTemplate::CSingleDocTemplate, CWinApp::RegisterShellFileTypes


 CDocTemplate::GetFirstDocPosition

virtual POSITION GetFirstDocPosition() const = 0;

返回值：
POSITION值，用来迭代查找与文档模板相联系的文档列表。如果该表为空，则返回NULL。

说明：
使用该函数获得与文档模板相联系的文档列表的位置，将POSITION值作为参数传递给CDocTemplate::GetwextDoc，用以迭代查找文档列表。CSingleDocTemplate 和CMultiDocTemplate都覆盖这个纯粹虚拟的函数，由CDocTemplate派生得到的类也必须覆盖该函数。

请参阅：
CDocTemplate::GetNextDoc, CSingleDocTemplate, CMultiDocTemplate


 CDocTemplate::GetNextDoc

virtual CDocument * GetNextDoc(POSITION& rPos) const = 0;

返回值：
下一个文档指针。文档在与文档模板相联系的文档列表之中。

参数：
rPos POSITION值的一个参考。该值由前一次调用GetFirstDocPosition或GetNextDoc返回得到。

说明：
获得由rPos标识的列表元素，并将rPos设置为列表中下一个入口的POSITION值。如果获得的是列表最后一个元素，则rPos的新值设置为NULL。
如果使用GetFirstDocPosition建立了一个初始位置，可使用GetNextDoc进行向前的迭代循环。
必须确保POSITION值代表的是一个有效的列表位置。如果无效，则产生Microsoft基础类库调试版本的断言。

请参阅：CDocTemplate::GetFirstDocPosition


 CDocTemplate::InitialUpdateFrame

virtual void InitialUpdateFrame(CFrameWnd* pFrame, CDocument* pDoc,BOOL bMakeVisible = TRUE);

参数：
pFrame | 需要初始更新的框架窗口。
pDoc | 与框架相联系的文档，可为NULL值。
bMakeVisible | 标识框架是否应为可视及处于活动状态。

说明：
在使用CreateNewFrame创建框架后调用InitialUpdateFrame，调用该函数使框架窗口中的视图接收它们的OnInitialUpdate调用。如果之前没有活动视图，则框架窗口的主视图被设置为活动状态。主视图是带有AFX_IDW_PANT_FIRST子ID的视图。最后如果bMakeVisible为非零值，则框架窗口为可视的。如果bMakeVisible为0，框架窗口的当前焦点和可视状态不发生变化。
当使用框架的File New 和File Open操作时，没有必要调用本函数。

请参阅：
CView::OnInitialUpdate, CFrameWnd::SetActiveView, CDocTemplate::CreateNewFrame


 CDocTemplate::LoadTemplate

virtual void LoadTemplate();

说明：
该函数由框架调用，为指定的CDocTemplate或其派生类装载资源。通常函数在构造期间被调用，除了在构造全局模块时以外。该情况下对LoadTemplate的调用被延迟，直到CWinApp::AddDocTemplate被调用。

请参阅：CWinApp::AddDocTemplate


 CDocTemplate::MatchDocType

virtual Confidence MatchDocType(LPCTSTR lpszPathName, CDocument& rpDocMatch );
virtual Confidence MatchDocType(LPCTSTR lpszPathName, DWORD dwFileType, CDocument& rpDocMatch );

返回值：
Confidence枚举的值，如下：
enum Confidence
{
noAttempt,
maybeAttemptForeign,
yesAttemptNative,
yesAttemptNative,
yesAlreadyOpen
};

参数：
lpszPathName | 文件路径名字。
rpDocMatch | 如果lpszPathName指定的文件已经打开，则为用于匹配文档模板的文档的指针。
dwFileType | 文档类型。

说明：
使用该函数来定义用于打开文件的文档模板类型。如果应用支持多种文件类型，可使用该函数来确定文件适当的模板。文件由依次对每个模板调用MatchDocType来指定，并根据返回的Confidence值来选择模板。如果lpszPathName指定的文件已经打开，函数返回CDocTemplate::yesAlready-Open ，并将文件的CDocument对象拷贝到rpDocMatch。
如果文件未被打开，但其扩展名与CDocTemplate::filterExt指定的扩展名匹配（或与Macintosh文件类型匹配）。函数返回CDocTemplate::yesAttemptNative，并设置rpDocMatch为NULL。要了解CDocTemplate::filterExt的更多信息，请参阅CDocTemplate::GetDocString。
如果不是以上两种情况之一，函数返回CDocTemplate::yesAttempForeign。
缺省实现方式是不返回CDocTemplate::maybeAttemptForeign或CDocTemplate::maybeAttemptNative。可覆盖该函数去实现适合你的应用的类型匹配，有可能用到Confidence枚举的两个值。

请参阅：CDocTemplate::GetDocString


 CDocTemplate::OpenDocumentFile

virtual CDocument* OpenDocumentFile(LPCTSTR lpszPathName,BOOL bMakeVisible = TRUE) = 0;

返回值：
返回由lpszPathName命名的文档的指针。如果不成功，则返回NULL。

参数：
lpszPathName | 包含将被打开的文件的路径名的指针。
bMakeVisible | 决定包含文档的窗口是否为可视。

说明：
打开由lpszPathName指定的路径名的文档。如果lpszPathName为NULL，则一个新文档被创建。该文档类型与这个模板相联系。

请参阅：CDocTemplate::CloseAllDocuments


 CDocTemplate::RemoveDocument

virtual void RemoveDocument(CDocument *pDoc);

参数：
pDoc 被删除的文档的指针。

说明：
删除由pDoc指向的文档，它来自于与这个模板相关的文档列表。派生类CMultiDocTemplate与CSingleDocTemplate 覆盖该函数。如果从CDocTemplate派生得到自己的文档类，则必须覆盖该函数。

请参阅：
CDocTemplate::AddDocument, CMultiDocTemplate, CSingleDocTemplate


 CDocTemplate::SaveAllModified

virtual BOOL SaveAllModified();

返回值：如果成功，则返回非零值，否则为0。

说明：保存所有已被修改的文档。

请参阅：
CDocTemplate::OpenDocumentFile, CDocTemplate::CloseAllDocuments


 CDocTemplate::SetContainerInfo

void SetContainerInfo(UNIT nIDOleInPlaceContainer);

参数：
nIDOleInPlaceContainer 嵌入对象被激活时所使用的资源ID。

说明：
调用该函数在OLE2对象被内部激活时设置所使用的资源。资源包括菜单和加速符号表。函数常在应用的CWinApp::InitInstance中被调用。
与nIDOleInPlaceContainer相联系的菜单含有分隔符，允许激活的项的菜单与应用包容器菜单组合。关于组合服务器与包容器菜单的更多信息，请参阅联机文档“Visual C++程序员指南”中的“菜单和资源(OLE)”。

请参阅：
CDocTemplate::SetServerInfo, CWinApp::InitInstance, CMultiDocTemplate::CMultiDocTemplate


 CDocTemplate::SetDefaultTitle

virtual void SetDefaultTitle(CDocument* pDocument) = 0;

参数：
pDocument 要设置标题的文档的指针。

说明：
调用该函数来装载文档缺省标题，并将其显示在文档标题栏上。关于缺省标题的信息，请参阅CDocTemplate::GetDocString中的CDocTemplate::DocName。

请参阅：CDocTemplate::GetDocString


 CDocTemplate::SetServerInfo

void SetServerInfo(
UNIT nIDOleEmbedding,
UNIT nIDOleInPlaceServer = 0,
CRuntimeClass* pOleFrameClass = NULL,
CRuntimeClass* pOleViewClass = NULL
);

参数：
nIDOleEmbedding | 当在单独窗口中嵌入的对象被打开时，所使用的资源ID。
nIDOleInPlaceServer | 当嵌入对象被内部激活时，所使用的资源ID。
pOleFrameClass | CRuntimeClass 结构的指针。包含当内部激活时框架窗口对象的类信息。
pOleViewClass | CRuntimeClass 结构的指针。包含当内部激活时视图对象的类信息。

说明：
调用该成员函数来标识资源。资源在用户要求激活嵌入对象时由服务器应用使用，资源包括菜单和加速符号表。函数常在应用的InitInstance中被调用。
与nIDOleInPlaceServer相联系的菜单含有分隔符，允许激活的项的菜单与应用服务器菜单组合。关于组合服务器与包容器菜单的更多信息，请参阅联机文档“Visual C++程序员指南”中的“菜单和资源(OLE)”。

请参阅：
CMultiDocTemplate::CMultiDocTemplate, CDocTemplate::SetContainerInfo, CWinApp::InitInstance


 CDocument

CObject
└CCmdTarget
└CDocument

CDocument类为用户定义的文档类提供了基本的函数功能。文档类表示了通常用于File Open命令打开和使用File Save命令保存的数据。
CDocument支持标准操作，如创建、装载、保存等。框架用CDocument定义的界面来操作文档。
应用可支持多种文档，例如文本文档和工作表。每种类型都有一个相关的文档模板。文档模板指定该类文档所使用的资源（如菜单、图标和加速符号表）。每个文档还含有一个CDocTemplate对象指针。
用户通过与文档相联系的CView对象来与之交互。视图在框架窗口内生成一个文档图象，并解释作用于该文档之上的用户输入。一份文档可以有多个相关的视图，当用户在文档上打开一个窗口时，框架创建一个视图并将其与文档连接。文档模板为每类文档指定了用于显示的视图类型和框架窗口。
文档作为窗口标准命令例程的一部分，接收标准用户界面组件（如FileSave菜单项）的命令。文档在活动视图之后接收命令。如果文档未能处理指定的命令，则将其交给管理它的文档模板。
当文档数据被修改时，各个视图都必须反应这些修改。CDocument提供了UpdateAllViews成员函数为视图通知这些变化。框架在关闭之前会提示用户必须存储修改后的文件。
在一个典型的应用中生成一个文档，必须做到以下几点：
·为每种类型的文档从CDocument中派生一个类。
·添加保存在文档数据的成员变量。
·为阅读和修改文档数据提供成员函数，文档的视图是这些成员函数最重要的用户。
·在文档类中覆盖CObject::Serialize成员函数，从磁盘读取文档数据或将其写入磁盘。
CDocument支持通过邮件发送文档，如果存在邮件支持（MAPI）的话。关于CDocument的更多信息，请参阅联机文档“Visual C++程序员指南”中的“串行化(对象持久化)”，“文档/视图结构主题”和“文档/视图创建”。
#include <afxwin.h>
请参阅：CCmdTarget, CView, CDocTemplate

CDocument类的成员

构造函数
CDocument 构造一个CDocument对象

操作
AddView | 将视图添加到文档中
GetDocTemplate | 活动描述文档类型的文档模板的指针
GetFirstViewPosition | 返回文档列表的第一个位置，用作迭代查找的开始
GetNextView | 通过与文档相联系的文档列表迭代
GetPathName | 返回文档数据文件的路径名
GetTitle | 返回文档的标题
IsModified | 标识文档从最近一次保存以来是否被修改过
RemoveView | 将视图与文档分离
SetModifiedFlag | 为文档从最近一次保存以来所作的修改设置标识
SetPathName | 为文档使用的数据文件设置路径
SetTitle | 设置文档标题
UpdateAllViews | 通知所有视图文档已被修改的消息

可覆盖的函数
CanCloseFrame | 高级函数覆盖。由框架窗口在观察文档之前调用
DeleteContents | 在清除文档时调用
OnChangedViewList | 在视图往文档中添加或从其中删除之后调用
OnCloseDocument | 关闭文档时调用
OnNewDocument | 创建文档时调用
OnOpenDocument | 打开已存在的文档时调用
OnSaveDocument | 保存文档到磁盘时调用
ReportSaveLoadException | 高级函数覆盖。在由于异常而不能打开或保存时调用
GetFile | 返回所需要的CFile对象指针
ReleaseFile | 释放文件使其为其它应用使用
PreCloseFrame | 在框架窗口关闭之前调用
SaveModified | 高级函数覆盖。在询问用户是否保存文档时调用

邮件函数
OnFileSendMail | 发送带有文档的邮件信息
OnUpdateFileSendMail | 如果存在邮件支持，使Send Mail命令有效


 CDocument::AddView

void AddView(CView* pView);

参数：
pView 被添加的视图指针。

说明：
调用该成员函数将视图添加到文档中。该函数将指定视图加入与文档相联系的视图列表之中。函数还设置指向文档的视图指针。当添加一个新创建的视图对象到文档时，框架调用该函数。这是对File Open，FileNew，新的Windows 或窗口被分隔等作出的反应。
仅在手工创建和添加视图时调用该函数。通常通过定义与文档类、视图类和框架窗口类相联系的CDocTemplate对象来连接框架窗口与视图、文档。

示例：
// The following example toggle two views in an SDI(single document
// interface) frame window.A design decision must be made as to
// whether to leave the inactive view connected to the document,
// such that the inactive view continues to receive OnUpdate
// keep the inactive view continuously in sync with the document,even
//though it is inactive However,doing so incurs a performance cost,
// as well as the programming cost of implementing OnUpdate hints.It may be less expensive,in terms of performance and/or programming,
// to re-sync the inactive view with the document only with it is
// reactivated. This example illustrates this latter approach,by
// reconnecting the newly active view and disconnecting the newly
// inactive view,via calls to CDocument::AddView and RemoveView.
BOOL CMainFrame::OnViewChange(UNIT nCmdID)
{
CView* pViewAdd;CView* pViewRemove;
CDocument* pDoc = GetActiveDocument();
UNIT nCmdID;nCmdID = LOWORD(GetCurrentMessage()->wParam);
if ((nCmdID = = ID_VIEW_VIEW1)&&(m_currentView = =1)) return;
if ((nCmdID = = ID_VIEW_VIEW2)&&(m_currentView = =2))return;
if (nCmdID = = ID_VIEW_VIEW2)
{
if (m_pView2 = = NULL)
{
m_pView1 = GetActiveView();
m_pView2 = new CMyView2;
//Note that if onSize has beenoverridden in CMy View2
//and GetDoument()is used in this overrideit can
//cause assertions and,if theassertions are ignored,
//cause access violation.
m_pView2->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW, rectDefault,
this, AFX_IDW_PANE_FIRST+1, NULL
);
}

pViewAdd = m_pView2;pViewRemove = m_pView1;
m_currentView = 2
}
else
{
pViewAdd = m_pView1;
pViewRemove = m_pView2;
m_currentView = 1;
}
// Set the child i.d. of the active view to AFX_IDW_PANE_FIRST,
// so that CFrameWnd::RecalcLayout will allocate to this
// "first pane" that portion of the frame window's client area
// not allocated to control bars.Set the child i.d. of the
// other view to anything other than AFX_IDW_PANE_FIRST;this
// examples switches the child id's of the two views.

int nSwitchChildID = pViewAdd->GetDlgCtrlID();
pViewAdd->SetDlgCtrlID(AFX_LDW_PANE_FIRST);
pViewRemove->SetDlgCtrlID(nSwitchChildID);

// Show the newly active view and hide the inactive view.

pViewAdd->ShowWindow(SW_SHOW);
pViewRemove->ShowWindow(SW_HIDE);

// Connect the newly active view to the document,and
// disconnect the inactive view.

pDoc->AddView(pViewAdd);
pDoc->RemoveView(pViewRemove);
SetActiveView(pViewAdd);
RecalcLayout();
}

请参阅：
CDocTemplate, CDocument::GetFirstViewPosition, CDocument::GetNextView, CDocument::RemoveView, CView::GetDocument


 CDocument::CanCloseFrame

virtual BOOL CanCloseFrame(CFrameWnd* pFrame);

返回值：
如果能安全关闭框架窗口，则返回非零值，否则为0。

参数：
pFrame 框架窗口的指针，框架窗口包含有附加视图的文档。

说明：
在显示文档的框架窗口关闭之前由框架调用。缺省方式是检验是否有其它正在显示文档的框架窗口。如果指定框架窗口是显示该文档的最后一个框架窗口，函数提示用户保存文档（如果文档被修改）。如果在关闭框架窗口时要执行特别的处理，可覆盖本函数。这是一个高级函数覆盖。

请参阅：CDocument::SaveModified


 CDocument::CDocument

CDocument ();

说明：
构造一个CDocument对象。由框架负责创建文档。覆盖OnNewDocument进行文档初始化，这在SDI应用中特别重要。

请参阅：
CDocument::OnNewDocument, CDocument::OnOpenDocument


 CDocument::DeleteContents

virtual void DeleteContents();

说明：
由框架调用来删除文档数据而不删除CDocument对象本身。在文档被删除之前调用。它还被调用来确保在重新使用文档之前该文档为NULL。这对SDI应用尤其重要。因为它只使用一个文档。无论用户是何时创建和打开文档的，文档都可以被再次使用。调用这个函数来实现“Edit Clear All”或类似命令将文档数据全部删除。缺省方式是函数什么也不做。覆盖该函数来删除文档中的数据。

示例：
// This example is the handler for an Edit Clear All Command.
void CMyDoc::OnEditClearAll()
{
DeleteContents();
UpdateAllViews(NULL);
}

void CMyDoc::DeleteContents()
{
// Reinitialize document data here.
}

请参阅：
CDocument::OnNewDocument, CDocument::OnOpenDocument, CDocument::OnCloseDocument


 CDocument::GetDocTemplate

CDocTemplate* GetDocTemplate() const;

返回值：
返回该文档类型模板的指针。如果文档不由该文档模板管理，则返回NULL。

说明：
调用该函数为文档类型的文档模板获取指针。

示例：
// This example accesses the doc template object to construct
// a default document name such as SHEET.XLS,where "sheet"
// is the base document name and *.xls* is the file extension
// for the document type.
CString strDefaultDocName, strBaseName, strExt;
CDocTemplate* pDocTemplate = GetDocTemplate();
if (!pDocTemplate->GetDocString(strBaseName,CDocTemplate::docName) ||
!pDocTemplate->GetDocString(strExt, CDocTemplate::filterExt)
)
{
AfxThrowUserException();
// These doc template strings will
// be available if you created the application using AppWizard
// and specified the file extension as an option for
// the document class produced by AppWizard.
}
strDefaultDocName = strBaseName + strExt;

请参阅：CDocTemplate


 CDocument::GetFile

virtual CFile* GetFile(LPCTSTR lpszFileName,UNIT nOpenFlags,CFileException* pError);

返回值：指向CFile对象的指针。

参数：
lpszFileName | 所需要的文件的路径的字符串。该路径可为相对路径或绝对路径。
pError | 已经存在的文件异常对象的指针，该对象表明操作的进行状态。
nOpenFlags | 共享和访问模式。在打开文件时指定要进行的动作。可使用位操作符OR来组合在CFile构造程序CFile::CFile列出的选项,需要一个访问许可和一个共享选项。modeCreate和modeNoInherit模式是可选的。

说明：调用该函数为CFile对象获得指针。

请参阅：CDocTemplate


 CDocument::GetFirstViewPosition

virtual POSITION GetFirstViewPosition() const;

返回值：
返回POSITION值，它用于GetNextView成员函数的迭代。

说明：
调用该函数获得与文档相关的视图列表中的第一个视图。

示例：
// To get the first view in the list of views:
POSITION pos = GetFirstViewPositon ();
CView* pFirstView = GetNextView( pos );
// This example uses CDocument::GetFirstViewPosition
// and GetNextView to repaint each view.
void CMyDoc::OnRepaintAllViews()
{
POSITION pos = GetFirstViewPosition();
while (pos != NULL)
{
CView* pView = GetNextView(pos);
pView->UpdateWindow();
}
}
// An easier way to accomplish the same result is to call
// UpdateAllViews(NULL);

请参阅：CDocument::GetNextView


 CDocument::GetNextView

virtual CView* GetNextView (POSITION& rPosition) const;

返回值：返回由rPosition标识的视图指针。

参数：
rPosition POSITION值的一个参考。它是由前一次调用GetNextView和GetFirstViewPosition成员函数返回得到的。其值不能为NULL。

说明：
调用该函数来迭代所有的文档视图。函数通过rPosition返回视图，并将rPosition设置为列表中下一个视图的POSITION值。如果获得的视图是列表中的最后一个，则设置rPosition为NULL。

示例：
// This example uses CDocument::GetFirstViewPosition
// and GetNextView to repaint each view.
void CMyDoc::OnRepaintAllViews()
{
POSITION pos = GetFirstViewPosition();
while (pos != NULL)
{
CView* pView = GetNextView(pos);
pView->UpdateWindow();
}
}
// An easier way to accomplish the same result is to call
// UpdateAllViews(NULL);

请参阅： CDocument::AddNew,CDocument::GetFirstViewPosition,CDocument::RemoveView,CDocument::UpdateAllViews


 CDocument::GetPathName

const CString& GetPathName() const;

返回值：
返回文档全限定路径。如果文档不是保存在磁盘文件中或不与其相关，则返回空。

说明：调用该函数获得文档的磁盘路径。

请参阅：CDocument::SetPathName


 CDocument::GetTitle

const CString& GetTitle() const;

返回值：文档标题。

说明：调用该函数获得文档标题，它常由文档文件名派生出。

请参阅：CDocument::SetTitle


 CDocument::IsModified

BOOL IsModified();

返回值：
如果自从上一次保存以来被修改过，则返回非零值，否则为0。

说明：
调用该成员函数判断文档自从上一次保存以来是否被修改过。

请参阅：
CDocument::SetModifiedFlag, CDocument::SaveModified


 CDocument::OnChangedViewList

virtual void OnChangedViewList();

说明：
在往文档中添加或移去视图后，由框架调用该函数。缺省方式是函数检查最后一个视图是否被移去，如果是，则删除该文档。如果要在框架添加/移去视图时进行特别的处理，覆盖该函数。例如，要一份文档保持打开，即使已没有与之相连的视图，则可覆盖该函数。

请参阅：
CDocument::AddView, CDocument::RemoveView


 CDocument::OnCloseDocument

virtual void OnCloseDocument();

说明：
在文档关闭时被框架调用，通常作为File Close命令的一部分。缺省方式是函数删除所有用于观察该文档的框架，关闭视图，清除文档内容，然后调用DeleteContents成员函数删除文档数据。如果框架关闭文档时需要进行特别清除处理，覆盖此函数。例如，如果文档表示数据库中的一个记录，用户可能需要覆盖该函数来关闭数据库。应从函数覆盖中调用这个函数的基类。

请参阅：
CDocument::DeleteContents, CDocument::OnNewDocument, CDocument::OnOpenDocument


 CDocument::OnFileSendMail

void OnFileSendMail();

说明：
通过常驻邮件主机将文档作为附件来发送消息。OnFileSendMail调用OnSave-Document将未命名的和修改的文档串行化（保存）为临时文件，然后由电子邮件发送。如果文档未被修改，则不需要临时文件发送原始文档。如果没有装入MAPI32. DLL，OnFileSendMail装入它。
COleDocument使用的OnFileSendMail需要正确地组合文件。
如果有邮件支持，OnFileSendMail通过邮件发送文档。
要了解更多的详细信息，请参阅联机文档“Visual C++程序员指南”中的“MFC中的MAPI支持”。

请参阅：
CDocument::OnUpdateFileSendMail, COleDocument::OnFileSendMail, CDocument::OnSaveDocument


 CDocument::OnNewDocument

virtual BOOL OnNewDocument();

返回值：如果文档初始化成功，则返回非零值，否则为0。

说明：
由框架调用，作为File New命令的一部分。缺省实现方式是调用该函数确保文档为空，并标明新文档是未被修改的。覆盖该函数进行新文档数据结构的初始化，应从函数覆盖中调用该函数的基类版本。
如果用户在SDI应用中选择了File New命令，框架使用该函数对存在的文档进行重新初始化，而不是创建一个新的文档。如果用户在MDI应用中选择了File New命令，框架每次建立一个新的文档并调用该函数来进行初始化。必须将初始化代码放在这个函数中而不是放在FileNew命令的构造程序中，该程序在SDI应用中有效。

示例：
// The following examples illustrate alternative methods of
// initializing a document object.
// Method 1: In an MDI application,the simplest place to do
// initialization is in the document constructor.The framework
// always creates a new document object for File New or File Open.
CMyDoc::CMyDoc()
{
// Do initialization of MDI document here.
// ...
}

// Method 2: In an SDI or MDI application,do all initialization
// in an override of OnNewDocument,if you are certain that
// the initialization is effectively saved upon File Save
// and fully restored upon File Open,via serialization.
BOOL CMyDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument()) return FALSE;
// Do initialization of new document here.
return TRUE;
}

// Method 3: If the initialization of your document is not
// effectively saved and restored by serialization(during File Save
// and File Open),the implement the initialization in single
// function(named InitMyDocument in this example).Call the
// shared initialization function from override of both
// OnNewDocument and OnOpenDocument.
BOOL CMyDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument()) return FALSE;
InitMyDocument(); //call your shared initialization function
// If your new document object requires additional initialization
// not necessary when the document is deserialized via File Open,
// then perform that additional initialization here.
return TRUE;
}

请参阅：
CDocument::CDocument, CDocument::DeleteContents, CDocument::OnCloseDocument, CDocument::OnOpenDocument, CDocument::OnSaveDocument


 CDocument::OnOpenDocument

virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);

返回值：如果文档装载成功，则返回非零值，否则为0。

参数：
lpszPathName 指向打开的文档的路径的指针。

说明：
由框架调用该函数，作为File Open命令的一部分。缺省实现方式是打开指定文件，调用DeleteContents来确保文档是空的，调用CObject::Serialize阅读文件内容，然后标明文档未被修改。如果不使用归档机制或文件机制，则覆盖该函数。例如，应用中的文档表示一个数据库的记录而非文件。
如果用户在SDI应用中选择了File Open命令，框架使用该函数对CDocument对象进行重新初始化，而不是创建一个新的文档。如果用户在MDI应用中选择了File Open命令，框架每次建立一个新的CDocument对象并调用该函数来进行初始化。必须将初始化代码放在这个函数中而不是放在File Open命令的构造程序中，该程序在SDI中有效。

示例：
// The following examples illustrate alternative methods of
// initializing a document object.
// Method 1: In an MDI application,the simplest place to do
// initialization is in the document constructor.The framework
// always creates a new document object for File New or File Open.
CMyDoc::CMyDoc()
{
// Do initialization of MDI document here.
// ...
}

// Method 2: In an SDI or MDI application,do all initialization
// in an override of OnNewDocument,if you are certain that
// the initialization is effectively saved upon File Save
// and fully restored upon File Open,via serialization.
BOOL CMyDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument()) return FALSE;
// Do initialization of new document here.
return TRUE;
}

// Method 3: If the initialization of your document is not
// effectively saved and restored by serialization(during File Save
// and File Open),the implement the initialization in single
// function(named InitMyDocument in this example).Call the
// shared initialization function from overrides of both
// OnNewDocument and OnOpenDocument.
BOOL CMyDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument()) return FALSE;
InitMyDocument(); //call your shared initialization function
// If your new document object requires additional initialization
// not necessary when the document is deserialized via File Open,
// then perform that additional initialization here.
return TRUE;
}

请参阅：
CDocument::DeleteContents, CDocument::OnCloseDocument, CDocument::OnNewDocument, CDocument::OnSaveDocument, CDocument::ReportSaveLoadException, CObject::Serialize


 CDocument::OnSaveDocument

virtual BOOL OnSaveDocument(LPCTSTR lpszPathName);

返回值：如果文档保存成功，则返回非零值，否则为0。

参数：
lpszPathName 用于保存文件的全限定路径指针。

说明：
由框架调用该函数作为File Save或File Save As命令的一部分。缺省实现方式是打开指定文件，调用CObject::Serialize将文档数据写入文件，然后标识文档是未被修改的。如果在框架中保存文档时要进行特别的处理，覆盖该函数。例如，可以用应用中的文档表示一个数据库的记录而非文件。

请参阅：
CDocument::OnCloseDocument, CDocument::OnNewDocument, CDocument::OnOpenDocument, CDocument::ReportSaveLoadException, CObject::Serialize


 CDocument::OnUpdateFileSendMail

void OnUpdateFileSendMail(CCmdUI* pCmdUI);

参数：
pCmdUI 与ID_FILE_SEND_MAIL命令相联系的CCmdUI对象的指针。

说明：
如果有邮件支持（MAPI），则使ID_FILE_SEND_MAIL有效。否则函数将ID_FILE_SEND_MAIL从菜单中移去，包括该菜单项上方或下方的分隔符。如果路径中有 MAPI32.DLL ，且在文件的[Mail]中MAPI=1时，MAPI 才有效。大多数应用将该命令置于File菜单。
如果有邮件支持，OnFileSendMail通过邮件发送文档。详情请参阅联机文档“Visual C++程序员指南”中的“MFC中的MAPI支持”。

请参阅：CDocument::OnFileSendMail


 CDocument::PreCloseFrame

virtual void PreCloseFrame(CFrameWnd*pFrame);

参数：
pFrame 含有CDocument对象的CFrameWnd的指针。

说明：
在框架窗口被删除前由框架调用该成员函数。它可以被覆盖以提供定制的清除，但要保证基类也被调用。
缺省地，PreCloseFrame在CDocument中什么也不做。CDocument派生类COleDocument和CRichEditDoc使用该函数。


 CDocument::ReleaseFile

virtual void ReleaseFile(CFile* pFile,BOOL bAbort);

参数：
pFile | 将要释放的CFile对象的指针。
bAbort | 指定是否用CFile::Close 或CFile::Abort来释放文件。如果使用CFile::Close来释放文件，则返回FALSE；如果使用CFile::Abort ，则返回FALSE。

说明：
成员函数调用来释放文件，使其可以为其它应用使用。如果bAbort为TRUE，ReleaseFile调用CFile::Abort，并释放文件。CFile::Abort不产生异常。如果bAbort为FALSE，ReleaseFile调用CFile::Close ，并释放文件。
在文件释放之前需要用户动作时，覆盖该函数。

请参阅：
CDocTemplate, CFile::Close, CFile::Abort


 CDocument::RemoveView

void RemoveView(CView* pView);

参数：
pView 被移去的视图指针。

说明：
调用该成员函数使视图与文档分离。函数将与文档相关的视图列表中的特定视图移去。同时设置该视图的文档指针为NULL。当框架窗口关闭或一块被拆分的窗口关闭关闭时，由框架调用该函数。
只有在人工分离视图时才调用该函数。函数定义与文档类、视图类和框架窗口类相关的CDocTemplate对象，使框架与文档和视图分离。

请参阅：
CDocument::AddView, CDocument::GetFirstViewPosition, CDocument::GetNextView


 CDocument::ReportSaveLoadException

virtual void ReportSaveLoadException(
LPCTSTR lpszPathName,
CException* e,
BOOL bSaving,
UNIT nIDPDefault
);

参数：
lpszPathName | 正在被保存或装载的文档名字的指针。
e | 产生的异常的指针，可以为NULL。
bSaving | 操作进展的标记。如果文档被保存，则返回非零值，否则为0。
nIDPDefault | 如果函数不能指定一个更明确的错误消息，该参数显示错误消息的标识。

说明：
在保存或装载文档期间发生异常时（通常是一个CFileException 或CArchive-Exception），调用该成员函数。缺省方式是检查异常对象并寻找描述异常原因的错误消息。如果没有找到该消息或者如果e为NULL，则使用nIDPDefault 指定的通用消息。函数在消息框中显示错误消息。如果要提供另外定制的失败消息，可覆盖该函数。这是一个高级函数覆盖。

请参阅：
CDocument::OnOpenDocument, CDocument::OnSaveDocument, CFileException, CArchiveException


 CDocument::SaveModified

virtual BOOL SaveModified();

返回值：
如果安全地继续并关闭文档，则返回非零值；如果不能关闭文档，则返回0。

说明：
在被修改的文档关闭之前由框架调用。缺省方式是如果文档作了修改，函数显示消息框，询问用户是否保存了文档变化。如果程序需要不同的提示程序，则覆盖该函数。这是一个高级函数覆盖。

请参阅：
CDocument::OnOpenDocument, CDocument::OnSaveDocument, CDocument::CanCloseFrame, CDocument::IsModified, CDocument::OnNewDocument,


 CDocument::SetModifiedFlag

void SetModifiedFlag(BOOL bModified = TRUE);

参数：
bModified 文档是否被修改的标记。

说明：
在对文档作了修改之后调用该函数。连续调用以确保在关闭之前框架提示用户保存这些变化。通常使用bModified参数的缺省值TRUE。要标记文档是未被修改的，调用带FALSE值的函数。

请参阅：
CDocument::IsModified, CDocument::SaveModified


 CDocument::SetPathName

virtual void SetPathName(LPCTSTR lpszPathName ,BOOL bAddToMRU = TRUE);

参数：
lpszPathName | 用作文档路径的字符串的指针。
bAddToMRU | 决定文件名是否加在MRU文件列表中，如果为TRUE，则表示加入；如果为FALSE，表示不加入。

说明：
调用该函数为文档的磁盘文件指定全限定路径。路径是否添加到应用的MRU列表上，取决于bAddToMRU 的取值。要注意某些文档并未与磁盘文件相联系。只有在覆盖窗口所使用的缺省打开方式时，才调用该函数。

请参阅：
CDocument::GetPathName, CWinApp::AddToRecentFileList


 CDocument::SetTitle

virtual void SetTitle(LPCTSTR lpszTitle);

参数：
lpszTitle 用作文档标题的字符串的指针。

说明：
调用该函数来指定文档标题（显示在框架窗口的标题栏上）。调用该函数更新所有显示该文档的框架窗口标题。

请参阅：CDocument::GetTitle


 CDocument::UpdateAllViews

void UpdateAllViews(CView* pSender,LPARAM lHint = 0L,CObject* pHint = NULL);

参数：
pSender | 修改文档的视图的指针。如果所有视图都被更新，则返回NULL。
lHint | 包含修改的信息。
pHint | 包含修改信息的对象指针。

说明：
在文档修改之后调用这个函数。应在调用SetModifiedFlag之后调用。除了pSender指定的视图之外，函数通知与文档连接的各个视图文档已被修改的消息。通常在用户通过视图改动文档后调用该函数。
除了发送视图外，这个函数为每个文档视图调用CView::OnUpdate ，并传递lHint和pHint值，使用这些参数将文档的修改情况传递给视图。可以使用lHint为信息编码，（或者）定义一个CObject派生类保存修改信息，并使用pHint传递一个该类对象。为优化视图更新，在CView派生类中可覆盖CView::OnUpdate成员函数。

请参阅：
CDocument::SetModifiedFlag, CDocument::GetFirstViewPosition, CDocument::GetNextView, CView::OnUpdate


 CDragListBox

CObject
└CCmdTarget
└CWnd
└CListBox
└CDragListBox

在提供了Windows 列表框的函数功能之外，CDragListBox类允许用户移动列表项，比如在列表框内移动文件名。具有这种能力的列表框使得用户可以在框内对项排序，以获得最有用的排列方式。缺省地，列表框将项移动到框的新位置上。CDragListBox对象能被定制，可以对项进行拷贝而不仅是移动。
与CDragListBox类相关的列表框绝不能具有LBS_SORT或LBS_MULTIPLESELECT风格。关于列表框风格的描述，请参阅“列表框风格”。
要在应用对话框中使用可拖拉的列表框，先在对话框编辑器中往对话框模板添加列表框控件，并为其分配一个与模板列表框控件对应的成员变量Category Control和变量类型CDragListBox。
关于将控件分配给成员变量的更多信息，请参阅联机文档“Visual C++程序员指南”中的“定义对话控件的成员变量的快捷键”。
#include <afxcmn.h>
请参阅：CListBox

CDragListBox类的成员

属性
ItemFromPt 返回被拖动的项的坐标

构造函数
CDragListBox 构造一个CDragListBox对象

操作
DrawInsert 绘制拖拉对话框中的插入点

可覆盖的函数
BeginDrag | 当拖动操作开始时由框架窗口调用
CancelDrag | 当拖动操作被取消时由框架窗口调用
Dragging | 在拖动操作过程中由框架窗口调用
Dropped | 在列表项放下时由框架窗口调用


 CDragListBox::BeginDrag

virtual BOOL BeginDrag(CPoint pt);

返回值：
如果允许拖动，则返回非零值，否则为0。

参数：
pt 包含被拖动列表项的坐标的CPoint对象。

说明：
当开始拖动操作的文件出现时由框架窗口调用该函数。如果要控制何时开始一个拖动操作，可覆盖该函数。缺省方式是捕获鼠标，并保持拖动方式，直到用户单击鼠标左按钮或右按钮，或按ESC键，这时拖动操作被取消。

请参阅：CDragListBox::CancelDrag, CDragListBox::Dragging


 CDragListBox::CancelDrag

virtual void CancelDrag(CPoint pt));

参数：
pt 包含被拖动列表项的坐标的CPoint对象。

说明：
当拖动操作被取消时由框架窗口调用。要执行列表框控件的特别处理，可覆盖该函数。

请参阅：CDragListBox::BeginDrag, CDragListBox::Dragging


 CDragListBox::CDragListBox

CDragListBox();

说明：构造一个CDragListBox对象。

请参阅：CListBox::Create


 CDragListBox::Dragging

virtual UNIT Dragging(CPoint pt);

返回值：
将要显示的光标资源ID。可以为下列值：
· | DL_COPYCURSOR | 表明此项将被拷贝。
· | DL_MOVECURSOR | 表明此项将被移走。
· | DL_STOPCUTSOR | 表明当前删除的目标不可接受。

参数：
pt 包含光标的X和Y屏幕坐标的CPoint对象。

说明：
当在CDragListBox对象内拖动列表项时，框架调用该函数。缺省行为是返回DL_MOVECURSOR。如果要提供额外的函数功能，可覆盖该函数。

请参阅：CDragListBox::BeginDrag, CDragListBox::CancelDrag


 CDragListBox::DrawInsert

virtual void DrawInsert(int nItem);

参数：
nItem 插入点的基于0的索引。

说明：
在索引指示的项之前由框架调用来绘制插入向导。值-1表示清除插入向导，覆盖该函数以修改插入向导的行为或外观。


 CDragListBox::Dropped

virtual void Dropped(int nSrcIndex, CPoint pt);

参数：
nSrcIndex | 指定落下字符串的基于0的索引。
pt | 包含落下位置坐标的CPoint对象。

说明：
当在CDragListBox对象内落下某项时由框架调用该函数。缺省行为是在新位置上拷贝列表框项及其数据，然后删除原始项。覆盖它以定制缺省行为，如使拖动到列表其它位置上的列表项的拷贝生效。

请参阅：CDragListBox::BeginDrag


 CDragListBox::ItemFromPt

int ItemFromPt(CPoint pt, BOOL bAutoScroll=TRUE);

返回值：拖动列表框项的基于0的索引。

参数：
pt | 包含在列表框中点的坐标的CPoint对象。
bAutoScroll | 如果允许滚动，则返回非零值，否则为0。

说明：
调用该函数获得在pt处的列表框项的基于0的索引。


 CDumpContext

CDumpContext没有基类。
CDumpContext类支持采用人工可读的文本进行基于流的诊断输出。可以为大部分堆使用预先声明的CDumpContext对象afxDump 。afxDump对象仅在Microsoft基础类库版本中有效。
一些存储诊断函数将afxDump用于它们的输出。
在Windows 环境下，预定义的afxDump对象的输出，在原理上与cerr流类似。通过Windows 函数OutputDebugString输送到调试程序。
CDumpContext类对于堆对象数据的CObject指针插入操作符（<<）。如果需要定制一个派生对象的堆格式，覆盖CObject::Dump。许多MicrosoftFoundation 类都实现了函数覆盖Dump成员函数。
CString，CTime和CTimeSpan等不是从CObject派生的类拥有它们自己的装载CDumpContext插入符，同经常使用的CFileStatus，CPoint和CRect等结构一样。
如果在类实现过程中使用了IMPLEMTNT_DYNAMIC或IMPLEMTNT_SERIAL宏，CObject::Dump将打印CObject派生类的名字，否则，它将打印CObject。
CDumpContext类在库的Debug和Release中有效，但Dump成员函数仅在Debug版本中被定义。使用#ifdef_DEBUG/#endif声明包括诊断代码，包括定制的Dump成员函数。
在创建自己的CDumpContext对象之前，必须创建一个CFile对象作为堆目的地。
关于CDumpContext的更多信息，请参阅联机文档“Visual C++程序员指南”中的“MFC调试支持”。
#define_DEBUG
#include <afx.h>
请参阅：CFile, CObject

CDumpContext类的成员

构造函数
CDumpContext 构造一个CDumpContext对象

基本输入/输出
Flush | 从堆上下文缓冲区中取出数据
operater << | 向堆上下文中插入变量和对象
HexDump | 以十六进制格式堆

状态
GetDepth | 获得与堆深度对应的整数
SetDepth | 设置堆深度


 CDumpContext::CDumpContext

CDumpContext(CFile* pFile);
throw(CMemoryException,CFileException);

参数：
cFile 作为堆目的地的CFile对象的指针。

说明：
构造一个CDumpContext类对象，afxDump类被自动构造。
在堆上下文处于活动状态时，不要向底部的CFile 写入，否则将会阻碍堆。在Windows 环境下，输出通过Windows 函数OutputDebugString 通向调试程序。

示例：
//example for CDumpContext::CDumpContext
CFile f;
if( !f.Open( "dump.txt", CFile::modeCreate | CFile::modeWrite ) )
{
afxDump << "Unable to open file" << "\n";
exit(1);
}
CDumpContext dc( &f );


 CDumpContext::Flush

void Flush();
throw(CFileException);

说明：
强制数据保留在缓冲区内，数据将写入与堆上下文连接的文件中。

示例：
// example for CDumpContext::Flush
afxDump.Flush();


 CDumpContext::GetDepth

int GetDepth() const;

返回值：由SetDepth设置的堆深度。

说明：决定进行深或浅转储。

请参阅：CDumpContext::SetDepth


 CDumpContext::HexDump

void HexDump(LPCTSTR lpszLine,BYTE* pby,int nBytes,int nWidth);
throw(CFileException);

参数：
lpszLine | 在新行起点处输出的字符串。
pby | 包含堆字节的缓冲区的指针。
nBytes | 堆字节数。
nWidth | 每行能够转储的最大字节数（不是输出行的宽度）。

说明：堆十六进制格式的字节。

示例：
//example for CDumpContext::HexDump
char test[] = "This is a test of CDumpContext::HexDump\n";
afxDump.HexDump( ".", (BYTE*) test, sizeof test, 20 );

程序输出：
. 54 68 69 73 20 69 73 20 61 20 74 65 73 74 20 6F 66 20 43 44
. 75 6D 70 43 6F 6E 74 65 78 74 3A 3A 48 65 78 44 75 6D 70 0A
. 00


 CDumpContext::SetDepth

void SetDepth(int nNewDepth);

参数：
nNewDepth 新的深度值。

说明：
设置堆深度。如果转储一个原始类或简单的CObject，其中不包含其它对象指针，那么值为0表示深度足够。大于0的值则指定一个深度堆，所有的对象将被再次转储。例如一个收集(collection)的深度堆将会转储该收集内的所有元素。可以在派生类中使用给定的深度值。
注意：循环引用不以堆深检测，并导致无限循环。

示例：
//example for CDumpContext::SetDepth
afxDump.SetDepth( 1 ); // Specifies deep dump
ASSERT( afxDump.GetDepth() == 1 );


 CDumpContext::operator <<

CDumpContext& operator <<(const CObject* pOb);
throw(CFileException);
CDumpContext& operator <<(const CObject* Ob);
throw(CFileException);
CDumpContext& operator <<(LPCTSTR lpsz);
throw(CFileException);
CDumpContext& operator <<(const void* lp);
throw(CFileException);
CDumpContext& operator <<(BYTE by);
throw(CFileException);
CDumpContext& operator <<(WORD w);
throw(CFileException);
CDumpContext& operator <<(DWORD dw);
throw(CFileException);
CDumpContext& operator <<(int n);
throw(CFileException);
CDumpContext& operator <<(double d);
throw(CFileException);
CDumpContext& operator <<(float f);
throw(CFileException);
CDumpContext& operator <<(LONG l);
throw(CFileException);
CDumpContext& operator <<(UNIT u);
throw(CFileException);
CDumpContext& operator <<(LPCWSTR lpsz);
throw(CFileException);
CDumpContext& operator <<(LPCSTR lpsz);
throw(CFileException);

返回值：
一个CDumpContext参考。使用返回值，可以在源代码的单行中写入多个插入点。

说明：
输出指定数据到堆上下文中。
CObject指针的装载插入操作符也适合于大多数原始类型。字符指针会产生字符串堆，void的指针将产生堆十六进制的地址。
如果在类实现过程中使用了IMPLEMTNT_DYNAMIC或IMPLEMTNT_SERIAL宏，CObject:: Dump将打印CObject派生类的名字，否则，它将打印CObject 。如果覆盖了Dump函数，那么就可以提供一个更有意义的对象内容输出，而不是一个十六进制的堆。

示例：
//example for CDumpContext::operator <<
extern CObList li;
CString s = "test";
int i = 7;
long lo = 1000000000L;
LONGLONG lolo = 12345678901234i64;
afxDump << "list=" << &li << "string="
<< s << "int=" << i << "long=" << lo << "LONGLONG=" << lolo << "\n";


 CDWordArray

CObject
└CDWordArray

CDWordArray类支持32位的双字数组。
CDWordArray的成员函数与CObArray类似。因为这个相似性，可以为指定的成员函数使用CObArray参考。无论在何处见到一个作为函数参数或返回值的CObject指针，可用一个DWORD取代。
CObject* CObArray::GetAt( int <nIndex> ) const;
例如，可转换为：
DWORD CDWordArray::GetAt( int <nIndex> ) const;
CDWordArray与IMPLEMENT_SERIAL宏组合能支持对其元素进行串行化和转储。如果一个双字数组保存在归档文件中，使用装载插入操作符（<<）或Serialize成员函数可依次为每个元素串行化。
注意：
在使用数组前，使用SetSize来规定其大小，并分配存储空间。如果不使用SetSize，往数组中添加元素会导致频繁分配和转储，这会降低效率并出现内存碎片。
如果需要数组中单个元素的调试输出，必须设置CDumpContext的深度值为1或更大。
关于使用CDWordArray的更多信息，请参阅联机文档“Visual C++程序员指南”中的“Collections”。
#include <afxcoll.h>
请参阅：CObArray

CDWordArray类的成员

构造函数
CDWordArray 构造一个空的双字数组

范围
GetSize | 获得数组中的元素数目
GetUpperBound | 返回最大的有效索引
SetSize | 规定数组中包含的元素数目

操作
FreeExtra | 释放所有在当前上限之上的内存
RemoveAll | 清除数组中的所有元素

元素访问
GetAt | 返回给定索引的值
SetAt | 在给定索引处设置值，数组不允许扩充
ElementAt | 返回数组中双字的一个临时参考
GetData | 允许访问数组中的元素，可以为NULL

扩充数组
SetAtGrow | 为某值设置给定的索引。如果有必要，数组允许扩充
Add | 在数组尾部添加元素。如果有必要，数组允许扩充
Append | 可以向数组后添加新的数组。如果有必要，数组允许扩充
Copy | 拷贝数组到另一数组中。如果有必要，数组允许扩充

插入/移去
InsertAt | 在指定索引处插入元素（或另一数组中的所有元素）
RemoveAt | 在指定索引处清除元素

操作符
operator [] 在指定索引处设置或获得元素


 CEdit

CObject
└CCmdTarget
└CWnd
└CEdit

CEdit类提供了Windows编辑控件中的功能。编辑控件是一个子窗口矩形，用户可以向其中输入文本。
可以通过对话模板或直接从代码中创建一个编辑控件。在两种情形下，首先调用CEdit构造程序构造CEdit对象，再调用Create成员函数创建Windows编辑控件并将其与CEdit对象连接。
构造在CEdit的派生类中可以单步实现。为派生类编写构造程序并从构造程序中调用Create。
CEdit从CWnd继承了重要的功能，要在CEdit对象中设置或获取文本，使用CWnd成员函数SetWindowText和GetWindowText，可以设置和得到编辑控件的全部内容，即使它是一个多行控件。如果编辑控件是多行的，使用CEdit成员函数GetLine，GetSel，GetSel和ReplaceSel来获取和写入控件的部分文本。
如果要处理编辑控件发往其父类（通常是一个CDialog派生类）的通知消息，则向父类中为每一消息添加一个消息映射入口和消息处理成员函数。
各消息映射入口可采用如下形式：
ON_Notification(id,memberFxn)
其中id指定了发送通知的编辑控件的子窗口ID，memberFxn为你写好的处理通知的父成员函数的名字。
父函数形式如下：
afx_msg void memberFxn();
下面是一组可能的消息映射入口，以及在何种情况下向父类发送的描述：
· | ON_EN_CHANGE | 用户采取的行动可能会改变编辑控件的文本。与EN_UPDATE通知消息不同，该通知是在Windows更新显示之后发送的。
· | ON_EN_ERRSPACE | 编辑控件不能为特定请求分配足够的空间。
· | ON_EN_HSCROLL | 用户单击了编辑控件中的水平滚动条，父窗口在屏幕更新之前被通知。
· | ON_EN_KILLFOCUS | 编辑控件失去输入焦点。
· | ON_EN_MAXTEXT | 当前输入超过了为编辑控件指定的数目，并作截尾处理。当编辑控件不具有ON_EN_HSCROLL风格且要输入的字符会超过编辑控件的宽度时，发送消息。当编辑控件不具有ON_EN_VSCROLL风格且要输入的字符会超过编辑控件的高度时，也会发送消息。
· | ON_EN_SETFOCUS | 编辑控件获得焦点。
· | ON_EN_UPDATE | 编辑控件将要显示变动的文本。在控件对文本格式化之后但在显示文本之前发送消息，以便在必要时改变窗口尺寸。
· | ON_EN_VSCROLL | 用户单击了编辑控件中的垂直滚动条，父窗口在屏幕更新之前被通知。
如果在对话框内创建CEdit对象，CEdit对象在用户关闭对话框时自动被删除。
如果使用对话框编辑器从对话资源中创建CEdit对象，CEdit对象在用户关闭对话框时自动被删除。
如果在窗口内创建CEdit对象，也需要删除它。如果在栈上创建CEdit对象，它被自动删除。如果使用new函数在堆上创建CEdit对象，在用户中止编辑控件时，必须对其调用delete来删除它。如果在CEdit对象中分配存储空间，覆盖CEdit析构程序来处理分配情况。
关于CEdit的更多信息，请参阅联机文档“Visual C++程序员指南”中的“控件主题”。
#include <afxwin.h>

请参阅：
CWnd, CButton, CComboBox, CListBox, CScrollBar, CStatic, CDialog

CEdit类的成员

构造函数
CEdit | 构造一个CEdit控件对象
Create | 创建一个Windows编辑控件，并将其与CEdit对象连接

属性
CanUndo | 决定一个编辑控件操作是否能够被撤销
GetLineCount | 获得多行编辑控件中的行数
GetModify | 决定编辑控件的内容是否被修改
SetModify | 为编辑控件设置或清除修改标记
GetRect | 为编辑控件获取格式化的矩形
GetHandle | 获得为当前多行编辑控件分配的内存的句柄
SetHandle | 设置为多行编辑控件使用的本地内存的句柄
SetMargins | 为CEdit设置左边和右边的空白边界
GetMargins | 获得为CEdit设置左边和右边的空白边界
SetLimitText | 设置CEdit能够容纳的文本的最大量
GetLimitText | 获得CEdit能够容纳的文本的最大量
PosFromChar | 获得指定字符索引的左上角的坐标
CharFromPos | 获得最靠近指定位置的字符的行和字符索引
GetLine | 从编辑控件中获得一行文本
GetPasswordChar | 获得当用户输入文本时在编辑控件中显示的口令
GetFirstVisibleLeLine | 决定在编辑控件中最顶部的可视的行

操作
EmptyUndoBuffer | 重新设置（清除）编辑控件的撤销标记
FmtLines | 设置在多行编辑控件中的软回车打开或关闭
LimitText | 用户在输入文本时的文本长度限制
LineFromChar | 获得包含指定字符索引的行的数目
LineIndex | 获得在多行编辑控件中的某行的字符索引
LineLength | 获得编辑控件中的行的长度
LineScroll | 在多行编辑控件中滚动文本
ReplaceSel | 用指定文本覆盖编辑控件中当前被选中的文本
SetPasswordChar | 设置或清除当用户输入文本时在编辑控件中显示的口令
SetRect | 设置多行编辑控件的带格式的矩形，并更新该控件
SetRectNP | 设置多行编辑控件的带格式的矩形，而不必重新绘制
SetSel | 在编辑控件中选定文本SetTabStops设置多行编辑控件的制表键停顿位
SetReadOnly | 为编辑控件设置只读状态

剪贴板操作
Undo | 撤销上一次的编辑控件操作
Clear | 删除（清除）编辑控件中当前选中的文本
Copy | 将编辑控件中的当前选中文本以CF_TEXT格式拷贝到剪贴板中
Cut | 删除编辑控件中当前选中的文本，并将删除的文本以CF_TEXT格式拷贝到剪贴板中
Paste | 在当前光标位置插入剪贴板内的文本。只有在剪贴板数据为CF_TEXT格式时才进行插入


 CEdit::CanUndo

BOOL CanUndo() const;

返回值：
如果上一次编辑操作可以用Undo成员函数撤销，则返回非零值，否则为0。

说明：
调用该函数来决定上一次编辑操作是否可以撤销。
要了解更多信息，请参阅Win 32文档中的EM_CANUNDO 。

请参阅：CEdit::Undo, CEdit::EmptyUndoBuffer


 CEdit::CEdit

CEdit();

说明：
构造一个CEdit对象。使用Create来创建Windows编辑控件。

请参阅：CEdit::Create


 CEdit::CharFromPos

int CharFromPos(CPoint pt) const;

返回值：
返回WORD低位的字符索引，以及WORD高位的行索引。

参数：
pt 在客户区域中的CEdit对象的点的坐标。

说明：
调用该函数来获取基于0索引的行和最接近CEdit控件中指定点的字符索引。
注意：该成员函数在Windows 95和Windows NT 4.0中有效。
要了解更多的信息，请参阅Win 32文档中的EM_CHARFROMMOPS。

请参阅：CEdit::PosFromChar


 CEdit::Clear

void Clear();

说明：
调用该函数来删除（清除）编辑控件中当前选中的文本。
由Clear进行的操作可以通过调用Undo成员函数撤销。
要删除当前选定文本并将其拷贝到剪贴板上，调用Cut成员函数。要了解更多的信息，请参阅Win 32文档中的WM_CLEAR。

请参阅：
CEdit::Undo, CEdit::Copy, CEdit::Cut, CEdit::Paste


 CEdit::Copy

void Copy();

说明：
调用该函数将编辑控件中的当前选中文本以CF_TEXT格式拷贝到剪贴板中。
要了解更多的信息，请参阅Win 32文档中的WM_COPY。

请参阅：CEdit::Clear, CEdit::Cut, CEdit::Paste


 CEdit::Create

BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,UNIT nID);

返回值：初始化成功，则返回非零值，否则为0。

参数：
dwStyle | 指定编辑控件的风格。可以组合使用控件的编辑风格。
rect | 指定控件的尺寸和位置。可以是RECT结构或CRect对象。
pParentWnd | 指定编辑控件的父窗口（通常使用CDialog ）。其值不能为NULL。
nID | 指定编辑控件的ID。

说明：
构造CEdit对象分两步。首先调用CEdit构造程序，再调用Create，这样就创建了一个Windows 编辑控件，并将其与CEdit对象连接。当执行Create时，Windows 发送WM_NCCREATE ，WM_NCCALCSIZE ，WM_CREATE 和WM_GETMINMAXINFO 消息到编辑控件。
缺省地，这些消息由CWnd 基类中的OnNcCalcSize，OnCreate，OnNcCreate和OnGetMinMaxInfo成员函数处理。要扩展缺省的消息处理，先从CEdit派生一个类，为新类添加消息映射并覆盖上述消息处理成员函数。例如，覆盖OnCreate为新类执行所需要的初始化操作。
可以为编辑控件应用如下的风格：
· | WS_CHILD | 总是采用
· | WS_VISIBLE | 经常采用
· | WS_DISABLED | 很少采用
· | WS_GROUP | 组合控件
· | WS_TABSTOP | 按制表键次序包含编辑控件

请参阅：CEdit::CEdit


 CEdit::Cut

void Cut();

说明：
调用该函数来删除（剪切）在编辑控件中的当前选定文本，并将其用CF_TEXT格式拷贝到剪贴板中。
由Cut执行的删除可以由Undo成员函数来撤销。
删除当前选定部分而不将已删除文本置于剪贴板，调用Clear成员函数。要了解更多的信息，请参阅Win 32文档中的WM_CUT。

请参阅：
CEdit::Undo, CEdit::Clear, CEdit::Copy, CEdit::Paste


 CEdit::EmptyUndoBuffer

void EmptyUndoBuffer();

说明：
调用此成员函数重新设置（清除）一个编辑控件中的撤消标记，使编辑控件不可撤消最近一次操作。撤消标记在编辑控件的某个操作可以撤消时建立。
当调用SetWindows 或SetHandle CWnd成员函数时，撤消标记自动被清除。
要了解更多的信息，请参阅Win32文档中的EM_EMPTYUNDOBUFFER。

请参阅：
CEdit::CanUndo, CEdit::SetHandle, CEdit::Undo, CWnd::SetWindowText


 CEdit::FmtLines

BOOL FmtLines(BOOL bAddEOL);

返回值：如果发生格式化，则返回非零值，否则为0。

参数：
bAddEOL 指定是否要插入软断行符，值为True时插入软断行符，为False时去掉软断行符。

说明：
调用此成员函数用于设置在一个多行编辑控件中是否包含软断行符。一个软断行符包含在断行行末插入两个回车和一个换行，这是因为一行可容纳的文字有限。而一个硬断行符包含一个回车和一个断行。以硬断行符结束的行不受FmtLines的影响。
仅在CEdit对象是一个多行编辑控件时Windows才响应此命令。
FmtLines仅影响GetHandle返回的缓冲区和WM_GETTEXT返回的文本，而对编辑控件中的显示无影响。
要了解更多信息，请参阅Win32文档中的EM_FMTLINES。

请参阅：CEdit::GetHandle, CWnd::GetWindowText


 CEdit::GetFirstVisibleLine

int GetFirstVisibleLine()const;

返回值：
可视的最顶端行的行号（行号由0开始），对单行编辑控件来说，返回值为0。

说明：
调用此成员函数决定编辑控件中可视的最顶端行的行号。
要了解更多信息，请参阅Win32文档中的EM_GETFIRSTVISIBLELINE。

请参阅：CEdit::GetLine


 CEdit::GetHandle

HLOCAL GetHandle() const;

返回值：
一个用于标识编辑控件内容的局部内存句柄。如果发生错误，例如发送信息到一个单行编辑控件，则返回值为0。

说明：
调用此成员函数来获取一个多行编辑控件中当前分配的内存句柄。此句柄是一个局部内存句柄，可被任何局部Windows存储函数作为一个参数来获得。
GetHandle仅仅被多行编辑控件处理。
在一个多行编辑控件的对话框中调用此成员函数时，对话框必须由DS_LOCALEDIT的样式标志集生成。如果不是，虽然也可以得到一个非零的返回值，但此返回值不可被使用。
注意：
GetHandle不可在Windows 95下运行。如果在Windows 95下调用，会返回NULL。GetHandle可在Windows NT 3.51版及以上使用。
要了解有关的更多信息，请参阅Win32文档中的EM_GETHANDLE。

请参阅：CEdit::SetHandle


 CEdit::GetLimitText

UINT GetLimitText() const;

返回值：对当前CEdit对象的文本大小限制，以字节计算。

说明：
调用此成员函数来获取该CEdit对象的文本大小限制，文本限制是此编辑控件可以接收的文本的最大长度（以字节计算）。
注意：此成员函数仅在Windows 95和Windows NT 4.0以上版本中可用。
要了解更多信息，请参阅Win32文档中的EM_GETLIMITTEXT。

请参阅：CEdit::SetLimitText, CEdit::LimitText


 CEdit::GetLine

int GetLine(int nIndex, LPCTSTR lpszBuffer) const;
int GetLine(int nIndex, LPCTSTR lpszBuffer, int nMaxLength) const;

返回值：
实际拷贝的字节数。如果由nIndex指定的行号大于此编辑控件的行数，则返回值为0。

参数：
nIndex | 指定从多行编辑控件中检索的行的行号，行号由0指定。对单行编辑控件，此参数被忽略。
lpszBuffer | 指向获取此行备份的缓冲区。缓冲区的第一个字必须指定能被拷贝到缓冲区的最大字节数。
nMaxLength | 指定能被拷贝到缓冲区的最大字节数，GetLine在调用Windows之前将此值放置到lpszBuffer的第一个字中。

说明：
调用此成员函数从编辑控件中获取文本的一行并将其放置到lpszBuffer缓冲区。
被拷贝的行不包括空终止符。
要了解更多信息，请参阅Win32文档中的EM_GETLINE。

请参阅：CEdit::LineLength, CWnd::GetWindowText


 CEdit::GetLineCount

int GetLineCount()const;

返回值：
在多行编辑控件中的包含的一个整数总行数。如果没有向控件输入任何文本，则返回值为1。

说明：
调用此成员函数获取一个多行编辑控件中的总行数。
此函数仅应用于多行编辑控件。
要了解更多信息，请参阅Win32文档中的EM_GETLINECOUNT。


 CEdit::GetMargins

DWORD GetMargins()const;

返回值：双字的低字位为左边距，高字位为右边距。

说明：
调用此成员函数获取编辑控件的左右边距，以像素表示。
注意：此成员函数仅在Windows 95和Windows NT 4.0以上版本中可用。
要了解更多信息，请参阅Win32文档中的EM_GETMARGINS。

请参阅：CEdit::SetMargins


 CEdit::GetModify

BOOL GetModify()const

返回值：
如果编辑控件的内容被改变，则返回值为非零，否则为0。

说明：
调用此成员函数测试编辑控件的内容是否被改变。Windows有一个内部标记来表明编辑控件的内容是否被改变。当编辑控件首次被创建时此标记被清除，在调用SetModify成员函数时也被清除。
要了解更多信息，请参阅Win32文档中的EM_GETMODIFY。

请参阅：CEdit::SetModify


 CEdit::GetPasswordChar

TCHAR GetPasswordChar()const;

返回值：
指定在用户输入字符处显示的字符。如果无密码，则返回NULL。

说明：
调用此成员函数获取在用户输入密码时所显示的密码字符。
如果编辑控件是用ES_PASSWORD风格建立的，则缺省的密码字符为一个星号（* ）。
要了解更多信息，请参阅Win32文档中的EM_GETPASSWORDCHAR。

请参阅：CEdit::SetPasswordChar


 CEdit::GetRect

void GetRect(LPRECT lpRect)const;

参数：
lpRect 指向RECT结构以接收格式化矩形。

说明：
调用此成员函数获取一个编辑控件的格式化矩形。此格式化矩形为文本的边界矩形，与编辑控件窗口的大小无关。
多行编辑控件的格式化矩形可以被SetRect和SetRectNP成员函数改变。
要了解更多信息，请参阅Win32文档中的EM_GETRECT。

请参阅：CEdit::SetRect, CEdit::SetRectNP


 CEdit::GetSel

DWORD GetSel()const;
void GetSel(int& nStartChar,int& nEndChar)const;

返回值：
此版本返回一个双字，其低位字为起始位置，高位字为第一个未被选中的字符的位置。

参数：
nStartChar | 指向当前选中部分的第一个字符位置，用整数表示。
nEndChar | 指向第一个未被选中的字符的位置，用整数表示。

说明：
调用此成员函数获取一个编辑控件中当前被选中部分（如果有）的起始和结束位置，可用参数也可用返回值。
要了解更多信息，请参阅Win32文档中的EM_GETSEL。

请参阅：CEdit::SetSel


 CEdit::LimitText

void LimitText(int nChars=0);

参数：
nChars 指定用户可以输入的文本的长度（以字节枚举）。如果参数为0，则长度设置为UINT_MAX个字节，这是缺省情况。

说明：
调用此成员函数限定用户可以向编辑控件中输入的文本的长度。
改变文本限定使用户能输入的文本受到限制，而对已在编辑控件中的文本没有影响，也不影响用CWnd中的SetWindowText成员函数能拷贝到编辑控件中的文本的长度。如果用SetWindowText函数输入的文本超过调用LimitText函数所指定的值，则用户可以在编辑控件中删除任何文本，但文本限制会禁止用户将已存在的文本替换为新文本，直到删除当前所选文本而使文本大小降至限制以内。
注意：在Win32(Windows95和Windows NT)中，SetLimitText代替此函数。
要了解更多信息，请参阅Win32文档中的EM_LIMITTEXT。

请参阅：
CWnd::SetWindowText, CEdit::GetLimitText, CEdit::SetLimitText


 CEdit::LineFromChar

int LineFromChar(int nIndex=-1)const;

返回值：
返回由nIndex指定的字符索引的行号，此行号从0开始。如果nIndex为-1，则返回所选部分第一个字符的行号，如果无选定部分，则返回当前行号。

参数：
nIndex 包含编辑控件文本中所需字符的基于0的索引值，或者包含-1。如果为-1则指定为当前行，即包含脱字符的行。

说明：
调用此成员函数获取包含指定字符索引的行的行号，字符索引指编辑控件中从开始到指定字符的字符数。
此成员函数仅适用于多行编辑控件。
要了解更多信息，请参阅Win32文档中的EM_LINEFROMCHAR。

请参阅：CEdit::LineIndex


 CEdit::LineIndex

int LineIndex(int nLine = -1)const;

返回值：
nLine所指定的行的字符索引。如果指定的行号大于编辑控件的行数，则返回-1。

参数：
nline 包含编辑控件文本中所需字符的索引值（此索引由0开始），如果为-1则指定为当前行，即包含脱字符的行。

说明：
调用此成员函数获取多行编辑控件中一行的字符索引，字符索引指从文本控件中文本开头到指定行的字符数。
此成员函数仅适用于多行编辑控件。
要了解更多信息，请参阅Win32文档中的EM_LINEINDEX。

请参阅：CEdit::LineFromChar


 CEdit::LineLength

int LineLength(int nLine = -1)const;

返回值：
当函数由多行编辑控件调用时，返回由nLine所指定的行的长度（以字节数表示）;当函数由单行编辑控件调用时，返回编辑控件中文本的长度（以字节数表示）。

参数：
nLine 指定要获取长度的行的字符索引。如果参数值为-1，表示当前行（即包含脱字符的行），不包括此行中被选中的部分文本的长度。LineLength在单行编辑控件调用时是被忽略的。

说明：
调用此成员函数获取在编辑控件中一行的字符长度。
调用此成员函数在多行编辑控件中获取一个指定了行号的行的字符索引。
要了解更多信息，请参阅Win32文档中的EM_LINELENGTH。

请参阅：CEdit::LineIndex


 CEdit::LineScroll

void LineScroll(int nLine,int nChars = 0);

参数：
nLine | 指定纵向滚动的行数。
nChars | 指定水平滚动的字符数。如果编辑控件使用ES_RIGHT或ES_CENTER风格，此值无效。

说明：
调用此成员函数滚动多行编辑控件的文本。
此成员函数仅用于多行编辑控件。
编辑控件的纵向滚动不能超过该文本的最后一行，如果当前行号加上由nLines指定的行数超过编辑控件中的总行数，则它的值被调整而使得文本的最后一行滚动达到编辑控件窗口的顶端。
此函数可以水平滚动经过每行的最后一个字符。
要了解更多信息，请参阅Win32文档中的EM_LLNESCROLL。

请参阅：CEdit::LineIndex


 CEdit::Paste

void Paste();

说明：
调用此成员函数将剪贴板上的数据插入CEdit的插入点，仅在剪贴板上的数据具有CF_TEXT格式时数据才可以被插入。
要了解更多信息，请参阅Win32文档中的WM_PASTE。

请参阅：
CEdit::Clear, CEdit::Copy, CEdit::Cut


 CEdit::PosFromChar

CPoint PosFromChar(UINT nChar)const;

返回值：由nChar指定的字符的左上角坐标。

参数：
nChar 指定字符的索引（从0开始）。

说明：
调用此成员函数获取此CEdit对象中一个指定字符的位置（左上角），此字符由它的索引值给定。如果nChar大于此CEdit对象中最后一个字符的索引，则返回CEdit对象中经过最后一个字符后的坐标位置。
注意：此成员函数仅适用于以Windows 95和Windows NT开始的版本。
要了解更多信息，请参阅Win32文档中的EM_POSFROMCHAR。

请参阅：CEdit::CharFromPos


 CEdit::ReplaceSel

void ReplaceSel(LPCTSTR lpszNewText,BOOL bCanUndo=False);

参数：
lpszNewText | 指向一个以空终止的替换字符串。
bCanUndo | 如果指定此替代可以被撤消，则将此参数设置为TRUE。缺省值为FALSE。

说明：
调用此成员函数将编辑控件中的当前选定部分替换为由lpszNewText指定的文本。仅替换编辑控件中文本的一部分。如果要替换全部文本，请使用CWnd::SetWin-dow Text成员函数。如果当前未选定文本，则将文本插入当前光标位置。要了解更多信息，请参阅Win32文档中的EM_REPLACESEL。

请参阅：CWnd::SetWindowText


 CEdit::SetHandle

void SetHandle(HLOCAL hBuffer);

参数：
hBuffer 包含一个指向局部内存的句柄。此句柄必须已由LocalAlloc Windows函数使用 LMEM_MOVEABLE标记创建。该存储区被认为包含一个带空终止符的字符串，如果不是这样，则缓冲区的第一个字符应被设置为0。

说明：
调用此成员函数设置一个可被多行编辑控件使用的局部内存句柄。编辑控件便可以使用此缓冲区来存储当前显示的文本，而不必分配自己的缓冲区。
此函数仅对多行编辑控件有效。
当应用设置一个新的存储句柄时，应使用GetHandle成员函数获取一个当前缓冲内存句柄，并使用LocalFree Windows函数释放此缓冲区。
此函数清除撤消缓冲区（CanUndo成员函数返回0）和内部修改标记（GetModify成员函数返回0），编辑控件被重新设置。
仅在使用DS_LOCALEDIT风格标志设置构造一个多行编辑控件对话框后，才可以在此对话框中使用此成员函数。
注意：
此函数不可在Windows 95中使用，如果在Windows 95中使用GetHandle会返回NULL。此函数仅在Windows NT 3.51以上的版本中使用。
要了解更多信息，请参阅Win32文档中的EM_SETHANDLE，LocalAlloc，LocalFree。

请参阅：
CEdit::CanUndo, CEdit::GetHandle, CEdit::GetModify


 CEdit::SetLimitText

void SetLimitText(UNIT nMax);

参数：
nMax 新的文本限制，以字节计算。

说明：
调用此成员函数设置编辑控件中的文本的长度限制。此限制是编辑控件可以接收的以字节形式表示的文本大小。
改变文本限定仅使用户能输入的文本受到限制，而对已在编辑控件中的文本没有影响，也不影响用CWnd中的SetWindowText成员函数能拷贝到编辑控件中的文本的长度。如果用SetWindowText函数输入的文本超过调用LimitText函数所指定的值，则用户可以在编辑控件中删除任何文本，但文本限制会禁止用户将已存在的文本替换为新文本，直到删除当前所选文本而使文本大小降至限制以内。
在Win32中，SetLimitText代替此函数。
要了解更多信息，请参阅Win32文档中的EM_SETLIMITTEXT。

请参阅：
CEdit::GetLimitText, CEdit::LimitText


 CEdit::SetMargins

void SetMargins(UINT nLeft,UINT nRight);

参数：
nLeft | 以像素表示的新的文本左边距宽度。
nRight | 以像素表示的新的文本右边距宽度。

说明：
调用此成员函数设置编辑控件的左右边距。
注意：此成员函数仅在Windows 95和Windows NT 4.0以上版本中可用。
要了解更多信息，请参阅Win32文档中的EM_SETMARGINS。

请参阅：CEdit::GetMargins


 CEdit::SetModify

void SetModify(BOOL bModified=TRUE);

参数：
bModified TRUE表示文本被改变了，FALSE表示没有改变，缺省情况下设定了改变标志。

说明：
调用此成员函数设置或清除编辑控件的改变标志。改变标记表明文本是否被改变。当用户改变文本时，此标志被自动设置，它的值在调用GetModify成员函数时获取。
要了解更多信息，请参阅Win32文档中的EM_SETMODIFY。

请参阅：CEdit::GetModify


 CEdit::SetPasswordChar

void GetPasswordChar(TCHAR ch);

参数：
ch 指定在用户输入字符处显示的字符。如果值为0，则显示输入的实际字符。

说明：
调用此成员函数在编辑控件中设置或清除用户输入文本时所显示的密码字符。
此成员函数对多行编辑控件无效。
当调用SetPasswordChar成员函数时，CEdit将用ch所指定的字符替代所有可视的字符。
如果编辑控件是用ES_PASSWORD风格建立的，则缺省的密码字符被设置为一个星号（* ）。此风格在SetPasswordChar以ch=0调用时删除。
要了解更多信息，请参阅Win32文档中的ES_SETPASSWORDCHAR。

请参阅：CEdit::GetPasswordChar


 CEdit::SetReadOnly

BOOL SetReadOnly(BOOL bReadOnly = TRUE);

返回值：
操作成功，则返回非零值；当发生错误时为0。

参数：
bReadOnly 指定设置还是去掉编辑控件的只读状态。如果为TRUE值，则设置为只读状态；如果为FALSE值，则设置为可读写状态。

说明：
调用此成员函数设置编辑控件的只读状态。当前的只读状态可由CWnd::GetStyle的返回值的ES_READONLY标志测出。要了解更多信息，请参阅Win32文档中的EM_SETREADONLY。

请参阅：CWnd::GetStyle


 CEdit::SetRect

void GetRect(LPRECT lpRect);

参数：
lpRect 指向RECT结构或CRect对象的指针，指定格式化矩形的新的尺寸。

说明：
调用此成员函数用指定坐标设置一个编辑控件的矩形的尺寸。此成员函数仅对多行编辑控件有效。
使用SetRect函数设置一个对多行编辑控件的格式化矩形。此格式化矩形为文本的边界矩形，与编辑控件窗口的大小无关。当编辑控件首次被创建时，格式化矩形与用户的编辑控件窗口区一样。使用SetRect成员函数后，应用程序可以使格式化矩形大于或小于编辑控件窗口。
如果编辑控件没有滚动条，在格式化矩形大于窗口时，文本将被剪切而不是被覆盖。如果编辑控件包括一个边界，则格式化矩形的大小将被边界的大小变低。如果用GetRect成员函数的返回值来调整矩形的大小，在传递矩形之前应去掉边界大小。
调用SetRect函数时，编辑控件的文本格式和显示方式将被重新设置。
要了解更多信息，请参阅Win32文档中的EM_SETRECT。

请参阅：
CRect::CRect, CRect::CopyRect, CRect::operator =, CRect::SetRectEmpty, CEdit::GetRect, CEdit::SetRectNP


 CEdit::SetRectNP

void GetRectNP(LPRECT lpRect);

参数：
lpRect 指向RECT结构或CRect对象的指针，指定格式化矩形的新的大小。

说明：
调用此成员函数用一个多行编辑控件设置格式化矩形。此格式化矩形为文本的边界矩形，与编辑控件窗口的大小无关。
除了编辑控件窗口不被重新设置外，SetRectNP与SetRect成员函数一致。
当编辑控件首次被创建时格式化矩形与用户的编辑控件窗口区一样。使用SetRect NP成员函数后，应用程序可以使格式化矩形大于或小于编辑控件窗口。
如果编辑控件没有滚动栏，在格式化矩形大于窗口时，文本将被剪切而不是被覆盖。
此成员函数仅对多行编辑控件有效。
要了解更多信息，请参阅Win32文档中的EM_SETRECTNP。

请参阅：
CRect::CRect, CRect::CopyRect, CRect::operator =, CRect::SetRectEmpty, CEdit::GetRect, CEdit::SetRect


 CEdit::SetSel

void SetSel(DWORD dwSelection, BOOL bNoScroll = FALSE);
void SetSel(int nStartChar, int nEndChar, BOOL bNoScroll = False);

参数：
dwSelection | 低位字指定起始位置，高位字为结束位置。如果低位为0，高位为-1，则编辑控件中的全部文本被选中；如果低位字为-1，则任何当前选定内容被去掉选定状态。
bNoScroll | 指示是否显示脱字符是滚动可见的。如果值为FALSE，则显示，TRUE不显示。
nStartChar | 指出当前选中部分的开始位置。如果nStartChar=0且nEndChar=-1，则编辑控件的文本被全选；如果nStartChar=-1，则任何当前选定内容被去掉选定状态。
nEndChar | 指出结束位置。

说明：
调用此成员函数在一个编辑控件中选择一定范围的字符。
要了解更多信息，请参阅Win32文档中的EM_SETSEL。

请参阅：CEdit::GetSel, CEdit::ReplaceSel


 CEdit::SetTabStops

void SetTabStops();
BOOL SetTabStops(const int& cxEachStop);
BOOL SetTabStops(int nTabStops,LPINT rgTabStops);

返回值：如果制表键被设置，则返回非零值，否则为0。

参数：
cxEachStop | 指定在每个cxEachStop对话单位设置制表键停止。
nTabStops | 指定包含在rgTabStops中的制表键停止个数。此个数必须大于1。
rgTabStops | 是一个指向无符号整数数组的指针，此数组指定了对话单位的制表键停止个数。一个制表键单元是一个水平或垂直距离，一个水平制表键单元等于宽度相同的当前对话框的四分之一，一个垂直制表键单元等于高度相同的当前对话框的八分之一，对话基本单元是基于当前系统字体的高度和宽度计算的，WindowsGetDialogBaseUnits函数以像素形式返回当前对话基本单元。

说明：
调用此成员函数在一个多行编辑控件中设置制表键停止。当文本被拷贝到多行编辑控件时，文本中的任何制表键之间均会产生一段空白。
要将缺省的制表键大小为32个对话单位，可不带参数调用此成员函数。如果大小比32大，用cxEachStop作参数调用；设置一个数组形式的制表键停止，可使用双参数调用。
此成员函数仅适用于多行编辑控件。
SetTabStops不会自动重画编辑窗口。如果要改变已在文本控件中的文本的制表键停止，应调用CWnd::InvalidateRect来重画编辑窗口。
要了解更多信息，请参阅Win32文档中的EM_SETTABSTOPS。

请参阅：CWnd::InvalidateRect


 CEdit::Undo

BOOL Undo();

返回值：
对于单行编辑控件总是返回非零值。对于多行编辑控件，如果操作成功，则返回非零值，失败则返回0。

说明：
调用此成员函数撤消编辑控件的最后一次操作。
撤销操作也可以被撤消。例如，可以第一次调用撤销来保存被删文本，在没有别的操作发生时，可以再次调用撤消操作将文本删除。
要了解更多信息，请参阅Win32文档中的EM_UNDO。

请参阅：CEdit::CanUndo


 CEditView

CObject
└CCmdTarget
└CWnd
└CView
└CCtrlView
└CEditView

像CEdit类一样，CEditView对象是一个视图，它提供窗口编辑控制功能，可以用来执行简单文本编辑功能。CEditView类提供以下附加功能：
·打印
·查找并替换
因为CEditView类是CView类的派生，CEditView的对象可以和文档及文档模板同时使用。
每个CEditView控件的文本存放到其全局存储对象，应用程序能拥有任意多个CEditView对象。
如果希望有一个具有附加功能的编辑窗口，或者希望有简单编辑功能，你可以构造一个CEditView类型的对象。一个CEditView对象可以占有一个窗体的整个用户区。从CEditView中派生自己的类来增加或改变基本功能，或声明能加入到文档模板中的类。
CEditView类的缺省实现可处理以下命令：
IN_EDIT_SELECT_ALL, ID_EDIT_FIND, ID_EDIT_REPLACE,ID_EDIT_REPEAT,和ID_FILE_PRINT。
CEditView类型的对象（或CEditView派生出的类型）有以下限制：
· | CEditView不真具有所见即所得编辑功能。在屏幕可读性与打印输出之间作选择的话，CEditView应为屏幕可读。
· | CEditView只能将文本作单一字体的显示，不支持特殊格式的字符。请参阅CRichEditView的更强大的功能。
· | CEditView可以容纳的文本总数有限。这与CEdit控件是一样的。
要了解有关CEditView的更多信息，请参阅联机文档“Visual C++程序员指南”中的“派生视图类”。
#include <afxext.h>

请参阅：
CEdit, CDocument, CDocTemplate, CCtrlView, CRichEditView

CEditView类的成员

数据成员
dwStyleDefault CEditView类型对象的缺省风格

构造函数
CEditView 构造一个CEditView类型的对象

属性
GetEditCtrl | 提供对CEditView对象的CEdit的访问（Windows编辑控件）
GetPrinterFont | 获取预设打印机字体
GetSelectedText | 获取当前被选文本
LockBuffer | 封锁缓冲区
Unlockbuffer | 解锁缓冲区
Getbufferlength | 获取字符缓冲区的长度
SetPrinterFont | 设置新的打印机字体
SetTabStops | 为屏幕显示和打印机设置制表键停止

操作
FindText | 在文本中查找一个串
PrintInsideRect | 在一个指定的矩形中打印文本
SerializeRaw | 将CEditView对象串行化存盘为纯文本

可覆盖的函数
OnFindNext | 查找下一个出现的文本串
OnReplaceAll | 将文本中所有给定的串替换为新串
OnReplaceSel | 替换选定文本
OnTextNotFound | 查不到匹配文本时调用


 CEditView::CEditView

CEditView();

说明：
构造一个CEditView类型的对象。在构造此对象后，在编辑控件使用它之前必须调用CWnd::Create。如果从CEditView派生出一个类并用CwndApp::Add-DocTemplate把它加入模板，此结构调用此构造函数和Create函数。

请参阅：CWnd::Create, CWinApp::AddDocTemplate


 CEditView::FindText

BOOL FindText(LPCTSTR lpszFind, BOOL bNext = TRUE, BOOL bCase = TRUE);

返回值：如果找到，则返回非零值，否则为0。

参数：
lpszFind | 要查找的文本。
bNext | 指定查找方向。如果为TRUE，则从缓冲区向后查找；如果为FALSE，则从缓冲区向前查找。
bCase | 指定查找时的大小写敏感。如果为TRUE，则查找是大小写敏感的，如果为FALSE，则不敏感。

说明：
调用此成员函数查找CEditView对象的文本缓冲区。此函数在缓冲区内从当前选定处起查找由lpszFind指定的文本，方向由bNext指定。大小写敏感由bCase指定。如果文本被找到，就将找到的文本选中并返回一个非零值;如果没有找到，则返回0。
通常，如果在不覆盖OnFindNext时，不必调用FindText函数。

请参阅：
CEditView::OnFindNext, CEditView::OnReplaceAll, CEditView::OnReplaceSel, CEditView::OnTextNotFound


 CEditView::GetBufferLength

UINT GetBufferLength()const;

返回值：缓冲区内字符串的长度。

说明：
调用此成员函数获得当前编辑控件缓冲区内的字符数，不包括空终止符。

请参阅：CEditView::LockBuffer, CEditView::UnLockBuffer


 CEditView::GetEditCtrl

CEdit& GetEditCtrl()const;

返回值：一个CEdit对象的参考。

说明：
调用GetEditCtrl成员函数得到一个被CEditView使用的编辑控件的参考，此控件的类型为CEdit。所以可以直接用CEdit成员函数来操纵此Windows编辑控件。
警告：
使用CEdit对象会改变下面的Windows编辑控件的状态。例如，不能用CEdit::SetTabStops函数来改变制表设置，因为CEditView在编辑控件中和打印中的设置相冲突。此时应使用CEditView::SetTabStops。

请参阅：CEdit, CEditView::SetTabStops


 CEditView::GetPrinterFont

CFont* GetPrinterFont() const;

返回值：
一个指定预设打印机字体的CFont对象的指针。如果打印机字体未被设置，则返回值为NULL，此指针是临时的，不能被保存供以后使用。

说明：
调用此GetPrintFont成员函数获取一个指向CFont对象的指针，此指针描述了预设打印机字体。如果打印机字体还未被设置，CEditView缺省的打印机动作是用与显示的字体相同的字体打印。
用此函数决定预设打印机字体。如果不是所要的字体，用CEditView::SetPrinterFont来改变它。

请参阅：CEditView::SetPrinterFont


 CEditView::GetSelectedText

void GetSelectedText(CString& strResult)const;

参数：
strResult 一个接收被选文本的CString对象参考。

说明：
调用此成员函数将被选文本拷贝到一个CString对象，直到所选文本的最后一个字符或所选文本的第一个回车换行符之前的字符。

请参阅：CEditView::OnReplaceSel


 CEditView::LockBuffer

LPCTSTR LockBuffer() const;

返回值：指向编辑控件缓冲区的指针。

说明：
调用此成员函数获取一个缓冲区指针，此缓冲区不能被改变。

请参阅：CEditView::UnLockBuffer, CEditView::GetBufferLength


 CEditView::OnFindNext

virtual void OnFindNext(LPCTSTR lpszFind, BOOL bNext, BOOL bCase);

参数：
lpszFind | 要查找的文本。
bNext | 指定查找方向。如果为TRUE，则从缓冲区向后查找；如果为FALSE，则从缓冲区向前查找。
bCase | 指定查找时的大小写敏感。如果为TRUE，则查找是大小写敏感的；如果为FALSE，则不敏感。

说明：
此函数在缓冲区内查找由lpszFind指定的文本，方向由bNext指定。大小写敏感由bCase指定。查找自当前选定部分开始，通过调用FindNext通查全文。缺省的情况下，如果文本未被找到，OnFindNext就调用TextNotFind。
可以覆盖OnFindNext来改变CEditView派生对象查找文本的方式。当用户在标准查找对话框中选择FindNext按钮时，CEditView调用OnFindNext。

请参阅：
CEditView::OnTextNotFound, CEditView::FindText, CEditView::OnReplaceAll, CEditView::OnReplaceSel


 CEditView::OnReplaceAll

virtual void OnReplaceAll(LPCTSTR lpszFind, LPCTSTR lpszReplace, BOOL bCase);

参数：
lpszFind | 要查找的文本。
lpszReplace | 替换原文本的新文本。
bCase | 指定查找时的大小写敏感。如果为TRUE，则查找是大小写敏感的，如果为FALSE，则不敏感。

说明：
当用户在标准替换对话框中选择全部替换按钮时，CEdit Yiew调用此OnReplace-All成员函数。此函数在缓冲区内查找由lpszFind指定的文本，大小写敏感由bCase指定。查找自当前选定部分开始，每当找到此文本后，就用lpszReplace指定的新文本替换原文本。通过调用FindNext通查全文。缺省的情况下，如果文本未被找到，就调用OnTextNotFound。如果当前所选与lpszFind不匹配，被选部分就被更新为由lpszFind指定的文本的第一次出现，替换并不执行，这使用户确认所选部分与文本不匹配时想做什么。
可以覆盖OnReplaceAll来替换CEditView派生对象查找文本的方式。

请参阅：
CEditView::OnFindNext, CEditView::OnTextNotFound, CEditView::FindText, CEditView::OnReplaceSel


 CEditView::OnReplaceSel

virtual void OnReplaceSel(LPCTSTR lpszFind, BOOL bNext, BOOL bCase, LPCTSTR lpszReplace);

参数：
lpszFind | 要查找的文本。
bNext | 指定查找方向。如果为TRUE，则从缓冲区向后查找；如果为FALSE，则从缓冲区向前查找。
bCase | 指定查找时的大小写敏感。如果为TRUE，则查找是大小写敏感的，如果为FALSE，则不敏感。
lpszReplace | 替换原文本的新文本。

说明：
当用户在标准替代对话框中选择Replace按钮时，CEditView 调用OnReplaceSel。
此函数在缓冲区内查找由lpszFind指定的文本，大小写敏感由bCase指定。查找自当前选定部分开始，每当找到此文本后，就用lpszReplace指定的新文本替换原文本。通过调用FindNext通查全文。缺省的情况下，如果文本未被找到，就调用OnTextNotFound。
可以覆盖OnReplaceAll来替换CEditView派生对象查找文本的方式。

请参阅：
CEditView::OnFindNext, CEditView::OnTextNotFound, CEditView::FindText, CEditView::OnReplaceAll


 CEditView::OnTextNotFound

virtual void OnTextNotFound(LPCTSTR lpszFind);

参数：
lpszFind 要查找的文本。

说明：
可以覆盖此函数，改变其缺省实现。缺省时，它调用Windows函数MessageBeep。

请参阅：
CEditView::FindText, CEditView::OnFindNext, CEditView::OnReplaceAll, CEditView::OnReplaceSel


 CEditView::PrintInsideRect

UINT PrintInsideRect(CDC* pDC, RECT& rectLayout, UINT nIndexStart, UINT nIndexStop);

返回值：
下一个要打印的字符的索引（即已被打印的最后一个字符的下一字符）。

参数：
pDC | 指向打印设备上下文的指针。
rectLayout | 指定文本输出到的矩形的CRect对象或Rect结构的参考。
nIndexStart | 缓冲区中待打印的第一个字符的索引。
nIndexStop | 缓冲区中下一个要打印字符的索引。

说明：
调用此PrintInsideRect成员函数在一个由rectLayout指定的矩形内打印文本。
如果CEditView控件不具有ES_AUTOHSCROLL风格，文本将在此矩形中覆盖打印。如果CEditView控件具有ES_AUTOHSCROLL风格，文本将在此矩形的右边界被剪切。
rectLayout对象的rect.bottom元素会被改变，以使矩形定义出文本占用的原始矩形的大小。

请参阅：CEditView::SetPrinterFont, CEditView::GetPrinterFont


 CEditView::SerializeRaw

void SerializeRaw(CArchive& ar);

参数：
ar 存储纯文本的CArchive对象的参考。

说明：
调用此Serialize成员函数使用一个CArchive对象将CEditView对象中的文本读或写为纯文本文件。SerializeRaw与CEditView的内部实现Serialize的区别在于：它仅读或写文本，不前置对象描述数据。

请参阅：CArchive, CObject::Serialize


 CEditView::SetPrinterFont

void SetPrinterFont(CFont* pFont)const;

参数：
pFont 一个CFont类型的指针。如果为NULL，则打印字体基于显示的字体。

说明：
调用此SetPrinterFont成员函数，设置一个由pFont指定打印字体。
如果希望视图总是以一种特殊字体打印，则应调用OnPreparePrinting 函数类中的SetPrinterFont。此虚函数在打印发生之前调用，因此字体在视图内容打印之前改变。

请参阅：
CWnd::SetFont, CFont, CView::OnPreparePrinting


 CEditView::SetTabStops

void SetTabStops(int nTabStops);

参数：
nTabStops 以对话单位表示的每个制表键停止的宽度。

说明：
调用此成员函数设置显示或打印的制表键停止。仅支持单行制表键停止宽度（CEdit支持多行）。制表键停止宽度以对话单位表示，对话单位宽度相当于当前使用的打印或显示的字符字体平均宽度的四分之一(仅按照字符字母顺序)。因为CEditView要缓存制表键停止值，故不可使用CEdit::SetTabStops。
此函数仅改变所调用对象的制表键。如果想改变应用中每个CEditView对象的制表终止符，可调用SetTabStops函数。

请参阅：CWnd::SetFont, CEditView::SetPrinterFont


 CEditView::UnLockBuffer

void UnLockBuffer()const;

说明：
调用此成员函数解锁缓冲区。当使用完毕由LockBuffer返回的指针后调用此成员函数。

请参阅：CEditView::LockBuffer, CEditView::GetBufferLength


 CEditView::dwStyleDefault

说明：
传递此静态成员作为Create函数的dwStyle参数，以获取CEditView对象的缺省风格，dwStyleDefault是DWORD类型的公共成员。


 CEvent

CObject
└CSyncObject
└CEvent

CEvent类的一个对象，表示一个“事件”——一个允许一个事件发生时线程通知另一个线程的同步对象。在一个线程需要了解何时执行任务时，事件是十分有用的。例如，拷贝数据到数据文档时，线程应被通知何时数据是可用的。当新数据可用时，通过运用CEvent对象来通知拷贝线程，线程才可能尽快地执行。
CEvent对象有两种类型：自动和手工。一个手工CEvent对象存在于由ResetEvent 或SetEvent设置的状态中，直到另一个函数被调用。一个自动CEvent对象在至少一个线程被释放后自动返回一个无标记（无用的）状态。
要使用一个CEvent对象，应在需要时构造一个CEvent对象。指定要等待的事件，应用应拥有它，就可以在构造函数返回时访问事件。调用SetEvent标记（使可用）事件对象，然后当访问完控制资源时，调用Unlock函数。
另一个使用CEvent对象的方法是添加一个CEvent类型的变量，使之成为希望控制的类的一个数据成员。在控制对象被构造期间，可调用CEvent数据成员的构造函数，它指明时间是否是最初就被标记、需要的事件对象类型、事件名称（如果在进程中要使用）和所希望的安全属性。
按以下方式访问一个被CEvent对象控制的资源：首先创建在资源访问成员函数中构造一个CSingleLock或CMultiLock类型的变量，然后调用封锁对象的Lock成员函数（如CMultiLock::Lock）。此时，线程要么可以访问资源，等待资源释放后访问；要么等待资源释放而超时，访问资源失败。在各种情况下，资源都被以线程安全方式访问。要释放资源，可调用SetEvent来标识一个事件对象，然后使用封锁对象的Unlock成员函数（如CMultiLock::UnLock）成员函数，或允许封锁对象超过范围。要获得更多使用CEvent对象的更多信息，请参阅联机文档“Visual C++程序员指南”中的“多线程：如何使用同步类”。
#include <afxmt.h>

CEvent类的成员

构造函数
CEvent 构造一个CEvent对象

方法
SetEvent | 设置一个事件可用（有标记）并释放某些等待线程
PulseEvent | 设置一个事件可用（有标记），并释放某些等待线程，设置该事件无效（无标记）
ResetEvent | 设置事件无效（无标记）
Unlock | 释放事件对象


 CEvent::CEvent

CEvent( BOOL bInitiallyOwn = FALSE,
BOOL bManualReset = FALSE,
LPCTSTR lpszName = NULL,
LPSECURITY_ATTRIBUTES lpsaAttribute = NULL
);

参数：
bInitiallyOwn | 如果为TRUE，CMultilock或CSingleLock对象的线程可用；如果为FALSE，所有要访问资源的线程必须等待。
bManualReset | 如果为TRUE，指定事件是一个手工事件，否则事件是一个自动事件。
lpszName | CEvent事件的名字。如果事件越过进程边界，就必须提供名字。如果名字与一个已存在的事件名一样，则构造函数构造一个新的CEvent事件，此对象参考该事件建立。如果名字与一个已存在的非事件对象名一样，则构造函数失败，名字为空。
lpsaAttribute | 事件对象的安全属性。对此构造函数的详细描述，请参阅联机文档“Win32 SDK程序员参考”中的“SECURITY_ATTRIBUTES”

说明：
调用此成员函数构造一个已命名或未命名的CEvent对象。要访问或释放一个CEvent对象，可建立一个CSingleLock或CMultiLock对象并调用其Lock和Unlock成员函数。
要将CEvent对象的状态改为已标记（无须等待的线程），可调用SetEvent或PulseEvent。要设置一个CEvent对象为无标记（必须等待的线程），可调用ResetEvent。


 CEvent::PulseEvent

BOOL PulseEvent();

返回值：如果操作成功，则返回非零值，否则为0。

说明：
将CEvent对象的状态设置为已标记（可用），释放所有等待线程，并自动设置为无标记（无效）。如果事件是手工的，所有等待线程都被释放，事件被设置为无标记，PulseEvent返回。
如果事件是自动的，释放一个线程，事件被设置为无标记，PulseEvent返回。如果没有线程等待，或没有能立即被释放的线程，PulseEvent将事件状态设置为无标记并返回。


 CEvent::ResetEvent

BOOL ResetEvent();

返回值：如果操作成功，则返回非零值，否则为0。

说明：
设置事件的状态为无标记，直到被SetEvent把它强制设置为有标记。这使所有想访问此事件的线程等待。
此成员函数不可被自动事件使用。


 CEvent::SetEvent

BOOL SetEvent();

返回值：如果操作成功，则返回非零值，否则为0。

说明：
设置事件的状态为有标记，释放任意等待线程。如果事件是手工的，此事件将保持有标记直到调用ResetEvent。这种情况下将释放多个线程，如果事件是自动的，此事件将保持有标记，直到一个线程被释放，系统将设置事件的状态为无标记。如果没有线程在等待，则此事件将保持有标记，直到一个线程被释放。


 CEvent::Unlock

virtual BOOL Unlock();

返回值：
如果线程拥有事件对象并且事件为自动事件，返回非零值，否则为0。

说明：
释放事件对象。此成员函数被当前拥有一个自动事件的线程调用，并在完成之后释放。如果它们封锁的对象要被再用，此函数将被封锁对象的构造函数调用。


 CException

CObject
└CException

CException是Microsoft基本类库中处理各种异常的基础库。其派生库及描述如下：
CMemoryException | 内存不够
CNotSupportedException | 请求不支持的操作
CArchiveException | 文档指定异常
CFileException | 文件指定异常
CResourceException | Windows资源未找到或不可创建
COleException | OLE异常
CDBException | 数据库异常（即基于开放数据库连接的MFC数据库类出现异常）
COleDispatchException | OLE发送（自动）异常
CUserException | 资源无法找到
CDaoException | 数据访问对象异常（即DAO类出现异常）
CInternetException | Internet异常（即Internet类出现异常）

这些异常经常使用THROW，THROW_LAST，TRY，CATCH，AND_CATCH，END_CATCH宏。要了解有关异常的更多信息，请参阅联机文档“Visual C++程序员指南”中的“异常”或“异常处理”。
要获取指定的异常，可使用相对应的派生库。要获取所有异常的类型，可调用CException，然后用CObject::IsKindOf来区分CException派生类。注意CObject::IsKindOf仅对由IMPLEMENT-DANAMIC宏定义的类有效，以便得到动态类型检查带来的好处。任何CException派生类都应由IMPLEMENTDANAMIC宏创建。
可以调用GetErrorMessage或ReportError来向用户报告异常的详细情况。这两个派生类适用于任何CException派生类。
如果一个宏获取异常，CException对象会被自动删除，无须用户删除。
如果Catch关键字得到异常，则不会自动删除。请参阅联机文档“Visual C++程序员指南”中的“异常”，以了解有关何时删除一个异常对象的更多信息。
CException是一个抽象基类，不可构造一个CException对象。如果想创建自己的CException类型，可参照上述派生类。注意派生类也使用了IMPLEMENTDANAMIC。
#include <afx.h>
请参阅：异常处理

CException类的成员

操作
CException | 构造一个CException对象
Delete | 删除一个CException对象
GetErrorMessage | 获取异常描述信息
ReportError | 在消息框中向用户报告一个错误信息


 CException::CException

CException (BOOL bAutoDelete);

参数：
bAutoDelete 如果CException对象被设置到堆顶存储区，则定义为TRUE。这使得当Delete成员函数调用来删除异常时，此CException对象能被自动删除。如果CException对象被设置到栈存储区或作为一个全局变量则定义为FALSE，这使得当Delete成员函数调用来删除异常时，此CException对象不能被自动删除。

说明：
调用此成员函数构造一个CException对象。不可使用New直接构造一个CException对象。当你从CException派生出一个类时，可使用该构造函数。


 CException::Delete

void CException::Delete();

说明：
此函数检查CException对象是否在堆顶建立，如果在堆顶建立，对该对象做删除操作。当删除该CException对象后，使用Delete成员函数删除异常。不要直接使用删除操作，因为CException对象可能是一个全局对象或者是在栈中创建的。
你可以指定当对象被创建时是否应被删除。要了解更多信息，请参阅CException::CException。
如果使用C++“试抓”（try-catch）机制，只需调用Delete。如果使用MFC的TRY和CATCH宏，这些宏会自动调用此成员函数。


 CException::GetErrorMessage

virtual BOOL GetErrorMessage(LPTSTR lpszError, UINT nMaxError, PUINT pnHelpContext = NULL);

返回值：
如果函数成功，则返回非零值；如果无错误信息文本，则返回0。

参数：
lpszError | 获取错误信息的缓冲区指针。
nMaxError | 缓冲区最多可以容纳的字符数（包括NULL终止符）。
pnHelpContext | 一个UINT地址，用于接收帮助文本上下文ID；如果为NULL，则不返回ID。

说明：
调用此成员函数提供有关所发生的错误的更多信息文本。例如，获取一个描述产生MFC在写一个CFile对象时出现CFileException异常的字符串。
注意：
此函数会拷贝多于nMaxError-1个字符到缓冲区，通常加一个空字符到结尾。如果缓冲区太小，错误信息将被截取。

示例：
以下是一个使用此成员函数的例子：
CFile fileInput;
CFileException ex;

// try to open a file for reading.
// The file will certainly not
// exist because there are too many explicit
// directories in the name.

// if the call to Open() fails, ex will be
// initialized with exception
// information. the call to ex.GetErrorMessage()
// will retrieve an appropriate message describing
// the error, and we'll add our own text
// to make sure the user is perfectly sure what
// went wrong.

if (!fileInput.Open("\\Too\\Many\\Bad\\Dirs.DAT", CFile::modeRead, &ex))
{
TCHAR szCause[255];
CString strFormatted;

ex.GetErrorMessage(szCause, 255);

// (in real life, it's probably more
// appropriate to read this from
// a string resource so it would be easy to
// localize)

strFormatted = _T("The data file could not be opened because of this error: ");
strFormatted += szCause;

AfxMessageBox(strFormatted);

else
{
// the file was opened, so do whatever work
// with fileInput
// we were planning...
// :

fileInput.Close();
}

请参阅：CException::ReportError


 CException::ReportError

virtual int ReportError(UINT nType = MB_OK, UINT nMessageID = 0);

返回值：
一个AfxMessage值。如果没有足够的内存来显示消息框，则返回0。请参阅AfxMessageBox，了解可能的返回值。

参数：
nType | 指定消息框的风格。把消息框风格应用在框上。如果不指定此参数，缺省为MB_OK。
nMessageID | 如果异常对象没有错误消息，指定要显示的消息资源的ID（字符串表入口）。如果为0，显示“没有可用的错误消息”。

说明：
调用此成员函数在消息框中向用户报告出错文本。

示例：
以下是一个使用此函数的例子：
CFile fileInput;
CFileException ex;

// try to open a file for reading.
// The file will certainly not
// exist because there are too many explicit
// directories in the name.

// if the call to Open() fails, ex will be
// initialized with exception
// information. the call to ex.ReportError() will
// display an appropriate
// error message to the user, such as
// "\Too\Many\Bad\Dirs.DAT contains an
// invalid path." The error message text will be
// appropriate for the
// file name and error condition.

if (!fileInput.Open("\\Too\\Many\\Bad\\Dirs.DAT", CFile::modeRead, &ex))
{
ex.ReportError();
}
else
{
// the file was opened, so do whatever work
// with fileInput we were planning...
// :

fileInput.Close();
}

请参阅：AfxMessageBox, CException::GetErrorMessage


 CFieldExchange

CFieldExchange没有基类。
CFieldExchange类支持记录字段交换（RFX）和批量记录字段交换(BulkRFX)例程，常被数据库类使用。如果要对自定义数据类型编写数据交换例程，或批量取数据行，可以直接调用此类。RFX和Bulk RFX在记录集对象的字段数据成员和数据资源的当前记录的相关字段之间交换数据。
注意：
如果对数据访问对象类而不是对开放数据库连接类做操作，就应使用CDaoFieldExchange。要了解更多信息，请参阅联机文档“Visual C++程序员指南”中的“数据库主题（一般）”和“DAO与MFC”。
CFieldExchange对象提供记录字段交换和批量记录字段交换发生时的相关信息。CfieldExchange对象支持包括对当前记录约束参数和字段数据成员，设置变量标志位等操作。RFX和Bulk RFX操作在记录集的由enumFieldType的CFieldExchange定义了类型的类数据成员上执行，可能的FieldType值为：
· | 字段数据成员的CFieldExchange::outputColumn。
· | 输入参数数据成员的CFieldExchange::inputParam 或CFieldExchange::param。
· | 输出参数数据成员的CFieldExchange::outputParam
· | 输入/输出参数数据成员的CFieldExchange::inoutParam
大多数类成员函数和数据成员用于编写定制的RFX例程，你会经常使用SetFieldType。要了解更多信息，可参阅联机文档“Visual C++程序员指南”中的“记录字段交换（RFX）”和“记录集（ODBC）”。要了解有关批量数据传输的更多信息，可参阅联机文档“Visual C++程序员指南”中的“记录集：批量记录传输（ODBC）”。要了解有关RFX和批量Bulk RFX全局函数的细节，请参阅本参考书的宏和全局量部分的“记录字段交换函数”。
#include <afxdb.h>
请参阅：CRecordset

CFieldExchange类的成员

操作
IsFieldType | 如果当前操作适用于被更新的字段类型，则返回非零值
SetFieldType | 指定记录集由所有以下RFX函数调用返回的数据成员——列或参数，直到下一次调用此函数


 CFieldExchange::IsFieldType

BOOL IsFieldType(UINT* pnField);

返回值：
如果当前操作可以在当前字段或参数类型上使用，则返回非零值。

参数：
pnField 字段或参数数据成员的顺序值返回到此参数。此数据与CRecordset::DoFieldExchange 或CRecordset::DoBulkFieldExchange函数中的数据成员顺序相一致。

说明：
如果编写自己的RFX函数，则在函数开始时调用此成员函数来决定当前操作是否可以在一个指定的字段或参数数据成员类型上执行（CFieldExchange::output-Column，CFieldExchange::inputParam，CFieldExchange::param，CFieldExchange::outputParam或CFieldExchange::inoutParam）。应按照现有的RFX函数原型。


 CFieldExchange::SetFieldType

void SetFieldType(UINT nFieldType);

参数：
nFieldTypeenum FieldType值，在CFieldExchange中声明。可以为下列值之一：
·CFieldExchange::outputColumn
·CFieldExchange::inputParam
·CFieldExchange::param
·CFieldExchange::outputParam
·CFieldExchange::inoutParam

说明：
在记录集类的DoFieldExchange或DoBulkFieldExchange覆盖中调用此成员函数。对字段数据成员来说，必须以CFieldExchange::outputColumn参数调用该函数，然后调用RFX或BulkRFX函数。如果没有批量记录传递，ClassWizard在DoFieldExchange的字段映射部分调用此SetFieldType成员函数。
如果将记录集类当作参数，必须在对所有参数数据成员调用RFX之后，在字段映射部分再次调用此成员函数。每个参数数据成员的类型必须有自己的SetFieldType调用，下表区分了可传递给SetFieldType的不同值，代表类的参数数据成员：
SetFieldType参数值 | 参数数据成员的类型
CFieldExchange::inputParam | 输入参数，传递到记录集查询或存储进程的值
CFieldExchange::param | 同CFieldExchange::inputParam
CFieldExchange::outputParam | 输出参数，记录集存储进程的返回值
CFieldExchange::inoutParam | 输入/输出参数，传递到记录集存储进程或返回记录集存储进程的值
通常，每个与字段数据成员或参数数据成员相关联的RFX函数调用之前必须调用SetFieldType，每个SetFieldType调用的nFieldType参数指明了由RFX函数调用提供的数据成员的类型。
要了解有关处理输出和输入/输出参数的更多信息，请参阅CRecordset成员函数FlushResultSet。要了解有关RFX和批量RFX函数的更多信息，请参阅“记录字段交换函数”。要了解相关的信息，请参阅联机文档“Visual C++程序员指南”中的“记录字段交换（RFX）”和“记录集（ODBC）”。

示例：
此例显示了和SetFieldType调用一起调用许多RFX函数的情况。注意通过pFX指针指向一个CFieldExchange 来调用SetFieldType函数。
void CSections::DoFieldExchange( CFieldExchange* pFX )
{
//{{AFX_FIELD_MAP(CSections)
pFX->SetFieldType( CFieldExchange::outputColumn );
RFX_Text( pFX, "CourseID", m_strCourseID );
RFX_Text( pFX, "InstructorID", m_strInstructorID );
RFX_Text( pFX, "RoomNo", m_strRoomNo );
RFX_Text( pFX, "Schedule", m_strSchedule );
//}}AFX_FIELD_MAP

// output parameter
pFX->SetFieldType( CFieldExchange::outputParam );
RFX_Long( pFX, "Instructor_Count", m_nCountParam );

// input parameter
pFX->SetFieldType( CFieldExchange::inputParam );
RFX_Text( pFX, "Department_Name", m_strNameParam );
}

请参阅：
CRecordset::DoFieldExchange, CRecordset::DoBulkFieldExchange, CRecordset::FlushResultSet,记录字段交换函数


 CFile

CObject
└CFile

CFile是MFC文件类的基类，它直接提供非缓冲的二进制磁盘输入/输出设备，并直接地通过派生类支持文本文件和内存文件。CFile与CArchive类共同使用，支持MFC对象的串行化。
该类与其派生类的层次关系让程序通过多形CFile接口操作所有文件对象。例如，一个内存文件相当一个磁盘文件。
使用CFile及其派生类进行一般目的的磁盘I/O，使用ofstream或其它Microsoft输入输出流类将格式化文本送到磁盘文件。
通常，一个磁盘文件在CFile构造时自动打开并在析构时关闭。静态成员函数使你可以在不打开文件的情况下检查文件状态。
要了解关于使用CFile的更多信息，可参阅联机文档“Visual C++程序员指南”中的“MFC中的文件”和“Microsoft Visual C++ 6.0 运行库参考”中的“文件处理”。
#include <afx.h>

请参阅：CStdioFile, CMemFile

CFile类的成员

数据成员
m_hFile 常包含操作系统文件句柄

构造函数
CFile | 从一个路径或文件句柄构造一个CFile对象
Abort | 不管任何警告和错误，关闭一个文件
Duplicate | 构造一个基于该文件的副本
Open | 带错误检验选项，安全打开一个文件
Close | 关闭文件，删除对象

输入/输出
Read | 从文件的当前位置读数据
ReadHuge | 可从文件的当前位置读取大于64K数据，在32位编程中废弃了，见Read
Write | 将文件数据写入当前文件位置
WriteHuge | 可将文件的大于64K数据写到当前文件位置，在32位编程中废弃了，见Write
Flush | 溢去未被写入的任何数据

定位
Seek | 定位于当前文件指针
SeekToBegin | 定位当前文件指针到文件开头
SeekToEnd | 定位当前文件指针到文件尾
GetLength | 获取文件长度
SetLength | 改变文件长度

封锁
LockRange | 在文件中封锁一定范围内的字节
UnlockRange | 解锁一定范围内的字节

状态
GetPosition | 获取当前文件指针
GetStatus | 获取打开文件的状态
GetFileName | 获取被选文件的文件名
GetFileTitle | 获取被选文件的标题
GetFilePath | 获取被选文件的完整路径
SetFilePath | 设置被选文件的完整路径

静态
Rename | 改名指定文件（静态函数）
Remove | 删除指定文件（静态函数）
GetStatus | 获取指定文件的状态（静态，虚函数）
SetStatus | 设置指定文件的状态（静态，虚函数）


 CFile::Abort

virtual void Abort( ):

说明：
关闭与此对象相关联的文件并使文件不可读、写，如果在析构此对象时未关闭文件，则构造函数关闭它。
在处理异常时，CFile::Abort与CFile::Close有两大区别。首先，Abort函数不会因失败产生异常值，因为Abort忽略失败；其次，如果文件未被打开或已经关闭，Abort不会插入断言。
如果用new把CFile对象分配在堆顶，在关闭文件后你必须删除它。Abort设置m_hFile为CFile::hFileNull。

示例：
// Example for CFile::Abort
CStdioFile fileTest;
Char* pFileName = "test.dat";
TRY
{
// do stuff that may throw exceptions
fileTest.Open(pFileName,CFile::modewrite);
}

CATCH_ALL(e)
{
fileTest.Abort( ); // close File safely and quietly
THROW_LAST ( );
}

END_CATCH_ALL

请参阅：CFile::Close, CFile::Open


 CFile::CFile

CFile( );
CFile(int hFile);
CFile(LPCTSTR lpszFileName,UINT nOpenFlags);
throw(CFileException);

参数：
hFile | 已打开的文件句柄。
lpszFileName | 所需文件的路径字符串，此路径可为相对的也可为绝对的路径。
nOpenFlags共享和访问模式，指定当打开文件时进行的动作，可以将以下所列用OR(|)操作符联起来。至少应有一个访问权限和一个共享选项，modeCreate和modeNoInherit是可选的。值如下所示：
· | CFile::modeCreate | 调用构造函数构造一个新文件，如果文件已存在，则长度变成0。
· | CFile::modeNoTruncate | 此值与modeCreate组合使用。如果所创建的文件已存在则其长度不变为0。因而此文件被打开，或者作为一个新文件或者作为一个已存在的文件。这将是很有用的，例如当打开一个可能存在也可能不存在的文件时。这个选项也可用于CStdioFile.
· | CFile::modeRead | 打开文件仅供读。
· | CFile::modeReadWrite | 打开文件供读写。
· | CFile::modeWrite | 打开文件仅供写。
· | CFile::modeNoInherit | 阻止文件被子进程继承。
· | CFile::ShareDenyNone | 不禁止其它进程读或写访问，打开文件。如果文件已被其它进程以兼容模式打开，则Create失败。
· | CFile::ShareDenyRead | 打开文件，禁止其它进程读此文件。如果文件已被其它进程以兼容模式打开，或被其它进程读，则Create失败。
· | CFile::ShareDenyWrite | 打开文件，禁止其它进程写此文件。如果文件已被其它进程以兼容模式打开，或被其它进程写，则Create失败。
· | CFile::ShareExclusive | 以独占模式打开文件，禁止其它进程对文件的读写。如果文件已经以其它模式打开读写（即使被当前进程），则构造失败。
· | CFile::ShareCompat | 此标志在32位MFC中无效。此标志在使用CFile::Open时映射为CFile::ShareExclusive。
· | CFile::typeText | 对回车换行设置特殊进程（仅用于派生类）。
· | CFile::typeBinary | 设置二进制模式（仅用于派生类）。

说明：
缺省的构造函数不打开文件，而是将m_hFile设置为CFile::hFileNull。因为此构造函数不产生异常，故不使用TRY/CATCH逻辑操作。使用Open成员函数，然后直接测试异常状态。有关异常处理的策略，可参阅联机文档“Visual C++程序员指南”中的“异常”。
带一个参数的构造函数构造一个CFile对象，对应于由hFile标识的操作系统文件。对访问模式或文件类型不作检查。当CFile对象被析构时，操作系统文件不会关闭，必须手工关闭它。
带两个参数的构造函数构造一个CFile对象，并打开给定路径的相对应的操作系统文件。构造函数将第一个构造函数和Open成员函数组合起来。当打开文件出错时产生一个异常。通常这说明这种错误不可解决，用户将被警告。

示例：
// example for CFile::CFile
char* pFileName = "test.dat";
TRY
{
CFile f(pFileName, CFile::modeCreate | CFile::modeWrite);
}

CATCH(CFileException,e)
{
#ifdef _DEBUG
afxDump<<"File could not be opened"<<e->m_cause<<"\n";
#endif
}

END_CATCH


 CFile::Close

virtual void Close( );
throw(CFileException);

说明：
关闭与该对象有关的文件并使之不可读写。当析构一个对象时未关闭文件，则构造函数关闭它。
如果用new操作放置CFile对象到堆顶，在关闭文件后必须删除它，Close设置m_hFile为CFile::hFileNull。

请参阅：CFile::Open


 CFile::Duplicate

virtual CFile* Duplicate( ) const;
throw(CFileException);

返回值：指向一个备份CFile对象。

说明：
为给定文件构造一个备份CFile对象，等价于C运行函数_dup。


 CFile::Flush

virtual void Flush( )
throw( CFileException );

说明：
强制滞留在缓冲区的数据写入文件。
使用Flush不能保证CArchive缓冲区的被清空。如果正在使用一个档案，可先调用CArchive::Flush。


 CFile::GetFileName

virtual CString GetFileName( )const;

返回值：文件名。

说明：
调用此成员函数获取一个指定文件的文件名。例如当你调用GetFileName来产生一个关于文件c:\windows\write\myfile.wri的消息给用户时，文件名myfile.wri被返回。
要返回文件的完整路径及文件名，可调用GetFilePath；要得到文件标题（myfile），可调用GetTitle。

请参阅：
CFile::GetFilePath, CFile::GetFileTitle


 CFile::GetFilePath

virtual CString GetFilePath( )const;

返回值：指定文件的完整路径。

说明：
调用此成员函数获取指定文件的全路径。例如当你调用GetFilePath来产生一个关于文件c:\windows\write\myfile.wri的消息给用户时，文件路径c:\windows\write\myfile.wri被返回。
要返回文件名（myfile.wri）,可调用GetFileName；要返回文件标题（myfile），可调用GetFileTitle。

请参阅：
CFile::SetFilePath, CFile::GetFileTitle, CFile::GetFileName


 CFile::GetFileTitle

virtual CString GetFileTitle( )const;

返回值：指定的文件的标题

说明：
调用此成员函数获取指定文件的标题，例如，当你调用GetFileTitle产生一个关于文件c:\windows\write\myfile.wri的消息给用户时，文件标题myfile被返回。
注意：在Windows95中，文件标题不包括扩展名，其解释见Win32文档中的GetFileTitle。
要返回文件的全路径及文件名，可调用GetFilePath；要返回文件名（myfile.wri），可调用GetFileName。

请参阅：
CFile::GetFileName, CFile::GetFilePath, CFile::GetFileTitle


 CFile::GetLength

virtual DWORD GetLength( ) const;
throw( CFileException );

返回值：文件长度。

说明：获取文件的当前逻辑长度，以字节表示。

请参阅：CFile::SetLength


 CFile::GetPosition

virtual DWORD GetPosition ( )const;
throw (CFileException)

返回值：32位双字文件指针。

说明：获取文件指针的当前值，可用于以后的Seek调用。

示例：
// example for CFile::GetPosition
extern CFile cfile;
DWORD dwPosition = cfile.GetPosition( );


 CFile::GetStatus

BOOL GetStatus(CFileStatus& rStatus)const;
static BOOL PASCAL GetStatus(LPCSTR lpszFileName, CFileStatus& rStatus);

返回值：如果指定文件的状态信息成功获取，则为TRUE，否则为FALSE。

参数：
rStatus用户提供的CFileStatus结构的参考，用来接收状态信息。CFileStatus结构有以下字段：
· | CTime m_ctime | 文件创建的时间。
· | CTime m_mtime | 文件最后一次修改的时间。
· | CTime m_atime | 最后一次访问文件并读取的时间。
· | LONG m_size | 文件逻辑长度，以字节数表示，如同DIR命令报告的那样。
· | BYTE m_attribute | 文件属性字节。
· | Char m_szFullName[_MAX_PATH] | Windows字符集表示的全文件名。

lpszFileName Windows字符集表示的文件路径，此路径可为绝对的或为相对的，但不包含网络名。

说明：
GetStatus的虚拟版本获取与CFile对象有关的文件的状态，不把值插入到m_szFullName结构成员中。
静态版本获取文件状态并把文件名拷入m_szFullName。此函数从文件目录入口获取文件状态而不打开文件，这对于测试已存在和访问权限十分有用。
m_attribute是文件属性，MFC提供一个enum类型的属性，这样就可以用符号指定属性：
enum Attribute
{
normal = 0x00,
readOnly = 0x01,
hidden = 0x02,
system = 0x04,
volume = 0x08,
directory = 0x10,
archive = 0x20
};

示例：
// example for CFile::GetStatus
CFileStatus status;
Extern CFile cfile;
If(cfile.GetStatus(status)) // virtual member function
{
#ifdef _DEBUG
afxDump<<"File size ="<<status.m_size<<"\n";
#endif
}

char* pFileName ="test.dat";

if(CFile::GetStatus(pFileName,status)) // status function
{
#ifdef _DEBUG
afxDump<<"Full File name ="<<status.m_szFullName <<"\n";
#endif
}

请参阅：CFile::SetStatus, CTime


 CFile::LockRange

virtual void LockRange(DWORD dwPos,DWORD dwCount);
throw ( CFileExcepition ) ;

参数：
dwPos | 封锁字符中从开始字节计算的偏移量。
dwCount | 封锁范围的字节数。

说明：
在一个打开文件中封锁一定范围内的字节。如果文件已封锁，则产生一个异常。在一个文件中封锁字节禁止其它进程输入到这些字节中。可以封锁一个以上的文件范围，但不可重叠。
当解锁一定范围时，可使用UnlockRange成员函数。其字节范围必须与以前封锁的范围相符合。LockRange不连接相邻范围，如果两个相连区域被封锁，则应分别解锁。
注意：此函数不适用于CMemFile派生类。

示例：
// example for CFile::LockRange
extern DWORD dwPos;
extern DWORD dwCount;
extern CFile cfile;
cfile.LockRange(dwPos,dwCount);

请参阅：CFile::UnlockRange


 CFile::Open

virtual BOOL Open(LPCTSTR lpszFileName, UINT nOpenFlags, CFileException* pError = NULL);

返回值：
如果成功打开，则返回非零值，否则为0。pError参数仅在返回0时才有意义。

参数：
lpszFileName | 待打开文件的路径，路径可为绝对、相对或网络名（UNC）。
nOpenFlags | 一个定义了文件的共享和访问模式的UINT。它指定了打开文件后的动作，可以用OR（|）操作符将选项组合起来，至少应有一个访问权限和一个共享选项，modeCreate和modeNoInherit模式是可选的。可参阅CFile 构造函数中模式选项的列表。
pError | 指向一个存在的文件异常对象，获取失败操作的状态。

说明：
Open是设计来和缺省CFile构造函数共同使用的。这两个函数形成一个安全方式打开文件，此时失败是通常的、可预料的情况。
CFile构造函数会在出错时产生一个异常，Open在出错时返回FALSE。Open也可以初始化一个CFileException对象来描述一个错误，但是如果你不提供pError参数或将NULL传递给pError，Open将返回FALSE而不产生一个CFileException。如果传递一个指针到一个存在的CFileException，Open会遇到错误，函数将用出错信息描述填充它。两种情况下Open都不产生异常。
下表描述了Open的可能结果：
pError
是否是遇到错误？
返回值
CFileException内容
NULL | No | TRUE | n/a
ptr 指向CFileException | No | TRUE | 不变
NULL | Yes | FALSE | n/a
ptr 指向CFileException | Yes | FALSE | 被初始化，用来描述错误

示例：
// example for CFile::Open
CFile f;
CFileException e;
char* pFileName = "test.dat";
if(!f.Open(pFileName, CFile::modeCreate | CFile::modeWrite,&e))
{
#ifdef _DEBUG
afxDump<<"File could not be opened"<<e.m_cause<<"\n";
#endif
}

请参阅：CFile::CFile, CFile::Close


 CFile::Read

virtual UINT Read (void* lpBuf,UINT nCount);
throw(CFileException);

返回值：
传输到缓冲区的字节数。注意对所有CFile类，如果到达文件尾，则返回值可能比nCount小。

参数：
lpBuf | 指向用户提供的缓冲区以接收从文件中读取的数据。
nCount | 可以从文件中读出的字节数的最大值。对文本模式的文件，回车换行作为一个字符。

说明：从与CFile对象相关联的文件读数据到缓冲区。

示例：
// example for CFile::Read
extern CFile cfile;
char pbuf[100];
UINT nBytesRead = cfile.Read(pbuf,100);


 CFile::ReadHuge

DWORD ReadHuge(void* lpBuffer,DWORD dwCount);
throw(CFileException);

返回值：
传输到缓冲区的字节数。注意对所有CFile对象，如果达到文件末尾，则返回值可能要比dwCount小。

参数：
lpBuf | 指向用户提供的缓冲区，以接收文件读入的数据。
dwCount | 可从文件中读取的字节数的最大值。对文本模式的文件，回车换行作为一个字符。

说明：
从与CFile对象相关联的文件中读数据到缓冲区。
此函数与Read的区别在于：大于64K-1字节数的数据可以被读入ReadHuge。此函数可被CFile派生的任何对象使用。
注意：ReadHuge仅提供向后兼容，Win32下的ReadHuge与Read有相同的语义。

请参阅：
CFile::Write, CFile::WriteHuge, CFile::Read


 CFile::Remove

static void PASCAL Remove(LPCTSTR lpszFileName);
throw(CFileException);

参数：
lpszFileName 表示所需文件的路径字符串。路径可为相对或绝对，但不可包含网络名。

说明：
此静态函数删除由路径指定的文件，但不可移去一个目录。
如果相关联的文件打开或文件不可移去，则函数产生一个异常，它等价于DEL命令。

示例：
// example for CFile::Remove
char* pFileName ="test.dat";
TRY
{
CFile::Remove(pFileName);
}

CATCH(CFileException,e)
{
#ifdef _DEBUG
afxDump <<"File"<<pFileName<<"cannot be removed\n";
#endif
}
END_CATCH


 CFile::Rename

static void PASCAL Rename(LPCTSTR lpszOldName,LPCTSTR lpszNewName);
throw(CFileException);

参数：
lpszOldName | 原路径。
lpszNewName | 新路径。

说明：
此函数改名一个指定文件。目录不可改名，这个函数等价于REN命令。

示例：
// example for CFile::Rename
extern char* pOldName;
extern char* pNewName;
TRY
{
CFile::Rename(pOldName,pNewName);
}

CATCH(CFileException,e)
{
#ifdef _DEBUG
afxDump << "File" << pOldName << "not found,cause =" << e->m_cause <<"\n";
#endif
}
END_CATCH


 CFile::Seek

virtual LONG Seek(LONG lOff,UINT nFrom);
throw(CFileException);

返回值：
如果要求的位置合法，则Seek返回从文件开始起的新字节偏移量。否则值未定义并产生CFileException异常。

参数：
lOff 指针移动的字节数。
nFrom指针移动的模式，可为以下值之一：
· | CFile::begin | 从文件开始，把指针向后移动lOff字节。
· | CFile::current | 从当前位置开始，把指针向后移动lOff字节。
· | CFile::end | 从文件尾开始，把指针向前移动lOff字节。注意必须移动到存在的文件中，因而lOff应为负。如果为正值，则超出文件尾。

说明：
在以前打开的文件中重新定位一个指针。Seek函数使我们可以随机访问一个文件的内容，这是通过指针移动一定量完成的，指针的移动可为绝对或相对。在查找时没有实际读文件。
当文件打开时，文件指针为偏移量0处，即文件开始处。

示例：
// example for CFile::Seek
extern CFile cfile;
LONG lOffset = 1000;
LONG lActual = cfile.Seek(lOffset, CFile::begin);


 CFile::SeekToBegin

void SeekToBegin( );
throw(CFileException);

说明：
将文件指针指向文件开始处，等价于Seek(0L, CFile::begin)。

示例：
// example for CFile::SeekToBegin
extern CFile cfile;
cfile.SeekToBegin( );


 CFile::SeekToEnd

DWORD SeekToEnd( );
throw(CFileException);

返回值：文件长度（字节数）。

说明：
将文件指针指向文件逻辑尾部，等价于CFile::Seek( 0L, CFile::End);

示例：
// example for CFile::SeekToEnd
extern CFile cfile;
DWORD dwActual = cfile.SeekToEnd( );

请参阅：
CFile::GetLength, CFile::Seek, CFile::SeekToBegin


 CFile::SetFilePath

virtual void SetFilePath(LPCTSTR lpszNewName);

参数：
lPszNewName 指向指定新文件的路径字符串。

说明：
调用此成员函数指定文件路径。例如当构造一个CFile对象而文件的路径无效时，可调用此成员函数提供路径。
注意：SetFilePath不打开或创建文件，只将CFile对象和路径名联系起来，然后即可使用。

请参阅：CFile::GetFilePath, CFile::CFile


 CFile::SetLength

virtual void SetLength(DWORD dwNewLen);
throw(CFileException);

参数：
dwNewLen 以字节指定文件的长度。此值可比当前文件大或小，此文件将按需要被扩展或截取。

说明：
调用此成员函数改变文件长度。
注意：和CMemFile一起使用,此函数可能产生一个CMemeryException对象。

示例：
// example for CFile::SetLength
extern CFile cfile;
DWORD dwNewLength = 10000;
cfile.SetLength(dwNewLength);


 CFile::SetStatus

static void SetStatus(LPCTSTR lpszFileName,const CFileStatus& status);
throw (CFileException);

参数：
lpszFileName | 所需文件的路径字符串。此路径可为相对的或为绝对的，但不可为网络名。
status | 包含新状态信息的缓冲区。调用此成员函数用当前值预先填充CFileStatus结构，然后用要求的值改变它。如果值为0，则相对应的状态项均不更新。可参阅GetStatus成员函数关于CFileStatus结构的描述。

说明：
设置与此文件位置有关的状态。
要设置时间，可改变Status的m_mtime字段。
注意，当调用SetStatus仅希望改变文件属性并且文件状态结构的成员m_mtime非零，属性也会受到影响（改变时间项也会对属性产生负作用）。如果希望仅改变文件属性，先设置文件状态结构的成员m_mtime为0，然后调用SetStatus。

示例：
// example for CFile::SetStatus
char* pFileName ="test.dat";
extern BYTE newAttribute;
CFile::Status Status;
CFile::GetStatus (pFileName,status);
status.m_attribute = newAttribute;
CFile::SetStatus(pFileName,status);

请参阅：CFile::GetStatus


 CFile::UnlockRange

virtual void UnlockRange(DWORD dwPos,DWORD dwCount);
throw(CFileExcrption);

参数：
dwPos | 解锁范围开始处的字节偏移量。
dwCount | 解锁范围的字节数。

说明：
在一个打开文件中解锁一定范围的字节。可参阅LockRange成员函数的描述了解细节。
注意：此函数对CMemFile派生类无效。

示例：
// example for CFile::UnlockRange
extern DWORD dwPos;
extern DWORD dwCount;
extern CFile cfile;
cfile.UnlockRange(dwPos,dwCount);

请参阅：CFile::LockRange


 CFile::Write

virtual void Write(const void* lpBuf,UINT nCount);
throw (CFileException);

参数：
lpBuf | 指向用户提供的缓冲区，包含将写入文件中的数据。
nCount | 从缓冲区内传输的字节数。对文本模式的文件，回车换行作为一个字符。

说明：
将数据从缓冲区写入与CFile对象相关联的文件。
Write在几种情况下均产生异常，包括磁盘满的情况。

示例：
// example for CFile::Write
extern CFile cfile;
char pbuf[100];
cfile.Write(pbuf,100);

请参阅：CFile::Read, CStdioFile::WriteString


 CFile::WriteHuge

void WriteHuge(const void* lpBuf,DWORD dwCount);
throw(CFileExcePtion);

参数：
lpBuf | 指向用户提供的缓冲区，此缓冲区包含写入文件的数据。
dwCount | 从缓冲区传输的字节数。对文本模式文件，回车换行作为一个字符。

说明：
将数据从缓冲区写入与CFile对象相关联的文件中。WriteHuge在几种情况下产生异常，包括磁盘满的情况。
此函数与Write的区别在于：大于64K-1字节的数据可由WriteHuge写入。此函数可被任意CFile派生对象使用。
注意：WriteHuge仅提供向后兼容，在Win32下WriteHuge与Write语义相同。

请参阅：
CFile::Read, CFile::ReadHuge, CFile::Write, CStdioFile::WriteString


 CFile::m_hFile

说明：
包含一个打开文件的操作系统文件句柄。m_hFile是一个UINT类型的公共变量，如果句柄未被分配，则它包含CFile::hFileNull（一个与操作系统无关的空文件标识符）。
不推荐使用m_hFile，因为此成员依赖于派生类。m_hFile被作为一个公共成员来支持类的非复式使用。


 CFileDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog
└CFileDialog

CFileDialog类封装了Windows常用的文件对话框。常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能。
可以用构造函数提供的方式使用CFileDialog，也可以从CFileDialog派生出自己的对话类并编写一个构造函数来适应你的需要。每种情况下，对话框都与标准MFC对话框一样工作。因为它们都是CCommonDialog类的派生类。
要使用CFileDialog，先用CFileDialog构造函数构造一个对象，当创建了一个对话框后，可以设置或修改m_ofn结构中的任何值，以初始化对话框控件的值或状态。m_ofn结构是OPENFILENAME类型的。要了解更多信息，可参阅联机文档“Win32 SDK”中的OPENFILENAME结构。
初始化对话框控件后，调用DoModal成员函数显示对话框并使用户输入路径和文件。DoModal返回不论是用户选择了OK（IDOK）还是取消（IDCANCEL）按钮。
当DoModal返回IDOK，可以使用某一个CFileDIalog的公共成员函数获取用户输入的信息。
CFileDIalog包含许多保护成员，使你可以处理常用的共享冲突、文件名合法性检查、列表框改变通知。这些保护成员对许多应用来说用处不大，因为缺省处理是自动的。对这些函数来说，消息映射入口是不必要的，因为它们是标准虚函数。
可以使用Windows CommDlgExtendError函数判断在初始化对话框时是否是发生了错误，并获取关于错误的更多信息。
析构一个CFileDialog对象是自动，无须调用CDialog::EndDialog。
要使用户选用多个文件，可在调用DoModal之前设置OFN_ALLOWMULTISELECT标志。你应提供文件名缓冲区来放置返回的多个文件名的列表，这通过用一个分配了的缓冲区指针替换m_ofn.lpstrFile来实现，要在创建了CFileDialog之后调用DoModal之前进行此操作。另外，必须用m_ofn.lpstrFile指向的缓冲区字节数来设置m_ofn.nMaxFile。
CFileDialog依赖于Windows3.1及以后版本中的COMMDLG.DLL。
如果从CFileDialog中派生出一个新类，可用消息映射处理。要扩展消息处理，从CWnd中派生一个类，向新类中加入一个消息映射并为新消息提供成员函数，无须提供一个钩子函数来定制对话框。
要定制对话框，从CFileDialog中派生一个对象，提供一个定制对话模板，从扩展控件中加入一个消息映射，处理通知消息。任意未处理的消息将传递给基类。
无须定制钩子函数。
要了解有关使用CFileDialog的信息，可参阅联机文档“Visual C++程序员指南”中的“常用对话类”。
#include <afxdlgs.h>

CFileDialog类的成员

数据成员
m_ofn Windows OPENFILENAME结构，提供对基本文件对话框参数的访问

构造函数
CFileDialog | 构造一个CFileDialog对象操作
DoModal | 显示对话框并使用户可以进行选择
GetPathName | 返回选定文件的完整路径
GetFileName | 返回选定文件的文件名
GetFileExt | 返回选定文件的扩展文件名
GetFileTitle | 返回选定文件的标题
GetNextPathName | 返回下一个选定文件的完整路径
GetReadOnlyPref | 返回选定文件的只读状态
GetStartPosition | 返回文件名列表的第一个元素位置

可覆盖的函数
OnShareViolation | 发生共享冲突时调用
OnFileNameOK | 确认键入对话框中的文件名
OnLBSelChangedNotify | 当列表框选择改变时调用
OnInitDone | 处理WM_NOTIFY CDN_INITDONE消息
OnFileNameChange | 处理WM_NOTIFY CDN_SELCHANGE消息
OnFolderChange | 处理WM_NOTIFY CDN_FOLDERCHANGE消息
OnTypeChange | 处理WM_NOTIFY CDN_TYPECHANGE消息


 CFileDialog::CFileDialog

CFileDialog(BOOL bOpenFileDialog,
LPCTSTR lpszDefExt = NULL,
LPCTSTR lpszFileName = NULL,
DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
LPCTSTR lpszFilter = NULL,
CWnd* pParentWnd = NULL
);

参数：
bOpenFileDialg | 如果为TRUE， 则创建文件打开对话框；如果为FALSE，则构造一个File Save As(另存为)对话框。
lpszDefExt | 缺省文件扩展名，如果用户在文件名编辑框中不包含扩展名，则lpszDefExt定义的扩展名自动加到文件名后。如果为NULL，则不添加扩展名。
lpszFileName | 初始显示于文件名编辑框中的文件名，如果为NULL，则不显示初始文件名。
dwFlags | 一个或多个标志的组合，使你可定制对话框。要了解这些标志的描述，可参阅联机文档“Win32 SDK”中的OPENFILENAME结构。如果你改变m_ofn.Flags结构成员，在改变中用OR操作保持缺省行为完整。
lpszFilter | 一列字符串对，指定可以应用到文件的过滤器。如果指定过滤器，仅被选择的文件显示于文件列表框中。请参阅说明部分，了解如何使用过滤器。
pParentWnd | 指向文件对话框对象的父窗口或拥有者窗口。

说明：
调用此成员函数构造一个标准Windows文件对话框对象，或构造一个打开对话框或构造一个存盘对话框，根据bOpenFileDialog的值决定。
OFN_ALLOWMULTISELECT标志。你应提供文件名缓冲区来放置返回的多个文件名的列表，这通过用一个分配了的缓冲区指针替换m_ofn.lpstrFile来实现，要在创建了CFileDialog之后调用DoModal之前进行此操作。另外，必须用m_ofn.lpstrFile指向的缓冲区字节数来设置m_ofn.nMaxFile。
为使用户用鼠标或键盘改变一个Explorer风格对话框的大小，设置OFN_ENABLESIZING标志，这仅当你提供一个钩子进程或定制模板时才有必要设置。此标志仅与一个Explorer风格的对话框一起工作，旧风格的对话框不可改变大小。
lpszFilter参数用于判断文件名类型及文件列表框中哪些可被显示。双字符串的第一个字符串描述过滤器，第二个串表明使用的文件扩展名，多重扩展可用“;”来指定。字符串由两个“|”字符结尾，最后是一个NULL。也可使用CString对象作为参数。
例如，Mirosoft Excel 允许用户用.XLC扩展名（表）或.XLS（工作表）打开文件，Excel过滤器应如下：
static char BASED_CODE szFilter[] =
"Chart Files (*.xlc)|*.xlc|Worksheet Files (*.xls)|*.xls|Data Files (*.xlc;*.xls)|*.xlc; *.xls|All Files (*.*)|*.*||";

请参阅：
CFileDialog::DoModal, ::GetOpenFileName, ::GetSaveFileName, OPENFILENAME


 CFileDialog::DoModal

virtual int DoModal( );

返回值：
IDOK或IDCANCEL。如果返回IDCANCEL，调用CommDlgExtendedError函数来判断是否是发生错误。
IDOK或IDCANCEL是表明用户选择了OK还是Cancel按钮的常数。

说明：
调用此成员函数前显示一个Windows常用文件对话框，使用户浏览文件和目录并输入一个文件名。
如果想通过设置m_ofn结构的成员来初始化各种文件对话框选项，则应在调用DoModal之前，创建对话对象之后进行。
当用户单击对话框的OK或Cancel按钮或选择对话框控件菜单中的关闭，则控件返回你的应用，然后可以调用其它成员函数获取用户输入对话框中的更多信息和设置。
DoModal是从CDialog类覆盖得到的虚函数。

请参阅：CDialog::DoModal, CFileDialog::CFileDialog


 CFileDialog::GetFileExt

CString GetFileExt( )const;

返回值：文件名的扩展名。

说明：
调用此成员函数获取输入对话框的文件名的扩展名。例如，如果输入的文件名为DATA.TXT，则返回“TXT”。
如果m_ofn.Flags具有OFN_ALLOWMULTISELECT标志设置，则此字符串包含一系列以空终止符结束的字符串。第一个串是所选文件的目录路径，然后是用户选择的文件名。要获取文件路径名，可使用GetStartPosition 和GetNextPathName成员函数。

请参阅：
CFileDialog::GetPathName, CFileDialog::GetFileName, CFileDialog::GetFileTitle


 CFileDialog::GetFileName

CString GetFileName( )const;

返回值：文件名。

说明：
调用此成员函数获取输入对话框中的文件名，文件名包括主文件名和扩展名。例如，对于文件C:\FILES\TEXT.DAT，GetFileName会返回TEXT.DAT。
如果m_ofn.Flags具有OFN_ALLOWMULTISELECT标志设置，则应用GetStart-Position 和GetNextPathName成员函数获取一个文件路径名。

请参阅：
CFileDialog::GetPathName, CFileDialog::GetStartPosition, CFileDialog::GetFileTitle


 CFileDialog::GetFileTitle

CString GetFileTitle() const;

返回值：文件的题目。

说明：
调用此函数检取输入对话框中的文件主题。文件题目只包括它的词头，并不含有路径和扩展名。例如：对文件以c:\FILES\TEXT.DAT,GetFileTitle将返回“TEXT”。
如果m_ofn.Flags具有OFN_ALLOWMULTISELECT标志设置，则此字符串包含一系列以空终止符结束的字符串。第一个字符串是所选文件的目录路径，然后是用户选择的所有文件名。因此，可以用GetStartPosition和GetNext-PathName成员函数检取列表中的下一个文件名。

请参阅：
CFileDialog::GetPathName, CFileDialog::GetFileName, CFileDialog::GetFileExt, ::GetFileTitle


 CFileDialog::GetNextPathName

CString GetNextPathName(POSITION& pos)const;

参数：
pos 由前面GetNextPathName或GetStartPosition 函数调用返回的一个POSITION值的参考。如果达到列表尾，则为NULL。

返回值：文件的完整路径。

说明：
调用此成员函数从对话框所选的组中获取下一个文件名，文件名路径包括文件标题加上整个目录路径。如果对文件“C:\FILES\TEXT.DAT”函数返回“C:\FILES\TEXT.DAT”。如果你用GetStartPosition建立了初始位置，则可用此函数向前循环查找。
如果被选择的仅有一个文件，则返回文件名。

请参阅：
CFileDialog::GetFileName, CFileDialog::GetStartPosition


 CFileDialog::GetPathName

CString GetPathName( )const;

返回值：文件的全路径。

说明：
调用此成员函数获取输入到对话框中文件的全路径，路径包括文件标题和文件的全部目录路径。如果对文件“C:\FILES\TEXT.DAT”调用此成员函数，GetRathMane则会返回“C:\FILES\TEXT.DAT”。
如果m_ofn.Flags具有OFN_ALLOWMULTISELECT标志设置，则此字符串包含一系列以空终止符结束的字符串，第一个为选中文件组的目录路径，然后是用户选中的文件。因此，可以用GetStartPosition和GetNextPathName成员函数获取列表中的下一个文件名。

请参阅：
CFileDialog::GetFileName, CFileDialog::GetFileExt, CFileDialog::GetFileTitle


 CFileDialog::GetReadOnlyPref

BOOL GetReadOnlyPref( )const;

返回值：
如果对话框中Read Only 选项框被选择，则返回非零值，否则为0。

说明：
调用此成员函数判断在一个Windows标准的文件打开和文件存盘对话框中只读复选框是否被选择。只读复选框可通过在CFileDialog构造函数中设置OFN_HI-DEREADONLY风格来隐藏。

请参阅：
CFileDialog::CFileDialog, CFileDialog::GetPathName, CFileDialog::GetFileExt


 CFileDialog::GetStartPosition

POSITION GetStartPosition( )const;

返回值：
一个用于循环的POSITION值。如果文件列表为空，则为NULL。

说明：
当m_ofn.Flags设置了OFN_ALLOWMULTISELECT标志时，调用此成员函数获取列表中第一个文件路径名的位置。

请参阅：
CFileDialog::GetFileName, CFileDialog::GetNextPathName


 CFileDialog::OnFileNameChange

virtual void OnFileNameChange( );

说明：
覆盖此函数来处理WM_NOTIFYCDN_SELCHANGE消息。当用户在打开或存盘对话框中的文件列表里选择了一个新文件或文件夹时，发出通知消息。
仅在使用OFN_EXPLORER风格创建对话框时才发出通知。要了解更多信息，请参阅CDN_SELCHANGE。要了解有关OFN_EXPLORER风格的信息，请参阅OPENFILENAME结构和打开、存盘对话框。

请参阅：CFileDialog::OnFolderChange


 CFileDialog::OnFileNameOK

virtual BOOL OnFileNameOK( );

返回值：
如果文件名不是一个可用文件名，则为1，否则为0。

说明：
仅当希望对输入通用文件对话框中的文件名定制验证时，才覆盖此函数。此函数可使你拒绝一个因任何应用指定原因产生错误的文件名。通常你无需使用此函数，因为框架提供缺省的文件名验证，并在无效的函数名称输入后，显示一个消息框。
如果返回1，对话框仍显示，以供用户输入另一个文件名。如果返回0，则此对话进程退出。其余非零值目前备用，因而无效。

请参阅：OPENFILENAME


 CFileDialog::OnFolderChange

virtual void OnFolderChange( );

说明：
覆盖此函数来处理WM_NOTIFY CDN_FOLDERCHANGE消息。此消息在打开或存储对话框中打开一个新文件夹时发生。
仅当使用OFN_EXPLORER风格创建对话框时才发出通知。要了解有关通知的信息，可参阅CDN_FOLDERCHANGE。要了解有关OFN_EXPLORER风格的信息，可参阅OPENFILENAME结构和打开、存储对话框。

请参阅：CFileDialog::OnFileNameChange


 CFileDialog::OnInitDone

virtual void OnInitDone( );

说明：
覆盖此函数处理WM_NOTIFY CDN_INITDONE消息。此通知在系统已完成在打开或存储对话框中排列控件，为子对话框的控件腾出空间。
仅在使用OFN_EXPLORER风格创建对话框时才发出通知。要了解有关通知的信息，可参阅CDN_INITDONE。要了解有关OFN_EXPLORER风格的更多信息，请参阅OPENFILENAME结构和打开、存储对话框。


 CFileDialog::OnLBSelChangedNotify

virtual void OnLBSelChangedNotify(UINT nIDBox,UINT iCurSel,UINT nCode);

参数：
nIDBox | 列表框的ID，在此框中发生选择。
iCurSel | 当前选择的索引。
nCode控件通知代码，此参数必须为以下值之一：
· | CD_LBSELCHANGE | 指定iCurSel是单选项列表框里的选中项目。
· | CD_LBSELSUB | 指定iCurSel在多选项列表框中不再被选择。
· | CD_LBSELADD | 指定iCurSel在多选项列表框中被选中。
· | CD_LBSELNOITEMS | 指定在多选项列表框中没有选中的。 要了解更多信息，可参阅联机文档“Win32 SDK”中的“关于常用对话框”。

说明：
此函数在列表框的选择被改变时调用。覆盖此函数，提供列表框中选项改变的常用处理。例如，可以使用此函数显示用户选择的每个文件的权限或最后一次改变的时间。


 CFileDialog::OnShareViolation

virtual UINT OnShareViolation(LPCTSTR lpszPathName);

返回值：
以下值之一：
· | OFN_SHAREFALLTHROUGH | 文件名由对话框返回。
· | OFN_SHARENOWARN | 无须进行更多动作。
· | OFN_SHAREWARN | 用户接收此错误的标准警告消息。

参数：
lpszPathName 当发生共享冲突时的文件路径。

说明：
调用此成员函数为共享冲突提供常用处理。通常无须调用此成员函数，因为框架为共享冲突提供缺省检查并在发生共享冲突时显示一个消息框。
如果想使共享冲突检查无效，可用OR操作将OFN_SHAREAWARE和m_ofn.flags组合使用。

请参阅：CFileDialog::OnFileNameOK


 CFileDialog::OnTypeChange

virtual void OnTypeChange( );

说明：
覆盖此函数来处理WM_NOTIFY CDN_TYPECHANGE消息。此消息在打开或存储对话框中从文件类型列表中选择一个新文件类型时发出。
仅当使用OFN_EXPLORER风格创建对话框时才发出通知。要了解更多有关通知的信息，请参阅CDN_TYPECHANGE。要了解有关OFN_EXPLORER风格的信息，请参阅OPENFILENAME结构和打开、存盘对话框。

请参阅：CFileDialog::OnFileNameChange


 CFileDialog::m_ofn

说明：
m_ofn是OPENFILENAME类型的结构。使用此结构，在创建之后、用DoModal成员函数显示之前初始化文件打开和存盘对话框的外表。例如，可设置m_ofn的lpstrTitle成员为希望的对话框标题。
要了解更多信息，可参阅联机文档“Win32 SDK”中的OPENFILENAME结构。

请参阅：CHotKeyCtrl::GetHotKey, CHotKeyCtrl::SetHotKey


 CFileException

CObject
└CException
└CFileException

一个CFileException对象代表了与文件相关的异常。CFileException类包括有可移植的原因代码和操作系统指定错误值等公共数据成员。此类也提供产生文件异常的静态成员函数，返回操作系统和C运行中的错误原因代码。
CFileException对象在CFile成员函数中被创建和产生，也可在派生类成员函数中创建或产生。可在CATCH表达式范围内访问这些对象。因为可移植，可以仅用出错代码获取异常的原因。要了解关于异常的更多信息，可参阅联机文档“Visual C++程序员指南”中的“异常”。
#include <afx.h>
请参阅：异常处理

CFileException类的成员

数据成员
m_cause | 包含异常原因相对应的可移植代码
m_IosError | 包含相关操作系统错误代码
m_strFileName | 包含异常的文件名

构造函数
CFileException 构造一个CFileException对象

代码转换
OsErrorToException | 返回与操作系统错误值相对应的出错原因代码
ErrnoToException | 返回与运行错误值相对应的出错原因代码

帮助函数
ThrowOsError | 返回一个基于操作系统错误值相对应的出错原因代码
ThrowErrno | 产生一个基于运行错误值的文件异常


 CFileException::CFileException

CFileException(int cause = CFileException::none,LONG lOsError = -1);

参数：
cause | 一个枚举类型变量，标明异常原因。可参阅CFileException::m_cause，了解可能值的列表。
lOsError | 可能的话，是异常的操作系统指定原因。lOsError参数提供比cause更多的信息。

说明：
构造一个CFileException对象，存储出错代码和对象中的操作系统代码。
不要直接使用此构造函数，而应调用全局函数AfxThrowFileException。
注意：
变量lOsError仅可应用于CFile和CStdioFile对象，CMemFile类不处理此错误代码。

请参阅：AfxThrowFileException


 CFileException::ErrnoToException

static int PASCAL ErrnoToException(int nErrno);

返回值：与给定运行库错误值相对应的枚举值。

参数：
nErrno 包含文件ERRNO.H，在运行时定义的一个整数出错代码。

说明：
将一个给定的运行库错误值转化为一个CFileException枚举错误值。可参阅CFileException:: m_cause，了解可能的枚举值的列表。

示例：
// example for CFileException::ErrnoToException
#include <errno.h>
ASSERT(CFileException::ErrnoToException(EACCES) == CFileException::accessDenied );

请参阅：CFileException::OsErrorToException


 CFileException::OsErrorToException

static int PASCAL OsErrorToException(LONG lOsError);

返回值：给定操作系统错误值相对应的枚举值。

参数：
lOsError 一个操作系统指定的错误代码。

说明：
返回一个给定lOsError值相对应的枚举值。如果出错代码未知，则函数返回CFileException::generic。

示例：
// example for CFileException::OsErrorToException
ASSERT(CFileException::OsErrorToException(5) == CFileException::accessDenied);

请参阅：CFileException::ErrnoToException


 CFileException::ThrowErrno

static void PASCAL ThrowErrno(int nErrno);

参数：
nErrno 给文件ERRNO.H，在运行时定义的一个整数出错代码。

说明：
构造一个对应于给定nErrno值的CFileException对象，然后产生一个异常。

示例：
// example for CFileException::ThrowErrno
#include <errno.h>
CFileException::ThrowErrorErrno(EACCES); //"access denied"

请参阅：CFileException::ThrowOsError


 CFileException::ThrowOsError

static void PASCAL ThrowOsError(LONG lOsError, LPCTSTR lpszFileName = NULL);

参数：
lOsError | 一个操作系统指定的错误代码。
lpszFileName | 如果可用，指向一个包含产生异常的文件名的指针。

说明：
产生一个与给定lOsError值相对应的CFileException。如果错误代码未知，则函数产生一个CFileException::generic的异常代码。

示例：
// example for CFileException::ThrowOsError
CFileException::ThrowOsError(5); // "access denied"

请参阅：CFileException::ThrowErrno


 CFileException::m_cause

说明：
包含由CFileException枚举类型定义的值。此数据成员是一个公共的int类型变量，枚举符与含义如下：
· | CFileException::none | 无错误发生。
· | CFileException::generic | 发生未指定错误。
· | CFileException::FileNotFound | 不可定位的文件。
· | CFileException::badPath | 全部或部分路径无效。
· | CFileException::tooManyOpenFiles | 超过允许打开的文件数。
· | CFileException::accessDenied | 文件不可访问。
· | CFileException::invalidFile | 想使用一个无效的文件句柄。
· | CFileException::removeCurrentDir | 当前工作目录不能被移走。
· | CFileException::directoryFull | 再无目录可访问。
· | CFileException::badSeek | 设置文件指针出错。
· | CFileException::hardIO | 硬件错误。
· | CFileException::sharingViolation | 未加载SHARE.EXE或共享区被锁。
· | CFileException::lockViolation | 企图封锁一个已封锁的区域。
· | CFileException::diskFull | 磁盘满。
· | CFileException::endOfFile | 已达文件末尾。
注意：
这些CFileException原因枚举符与CArchiveException原因枚举符不一样。

示例：
// example for CFileException::m_cause
extern char* pFileName
TRY
{
CFile f(pFileName,CFile::modeCreate | CFile::modeWrite);
}
CATCH (CFileException,e)
{
if(e->m_cause == CFileException::FileNotFound)
printf("ERROR：File not found\n";
}
END_CATCH


 CFileException::m_IOsError

说明：
包含此异常的操作系统错误代码。可参阅操作系统技术手册，得到错误代码列表。此数据成员是LONG类型的公共变量。


 CFileException::m_strFileName

CString m_strFileName;

说明：包括发生此异常的文件名。


 CFileFind

CObject
└CFileFind

MFC类CFileFind执行本地文件查找，是CGopherFileFind和CFtpFileFind的基类；后两类用于Internet文件查找。CFileFind包括的成员函数有开始查找、定位文件、返回标题名或路径。对于Internet查找来说，GetFileURL返回文件的URL。
CFileFind是为另两类查找特殊服务器设计的MFC类的基类，CGopherFileFind在Gopher服务器上工作，CFtpFileFind在FTP服务器上工作，这些类为用户查找文件提供了一种无缝机制，与服务器协议、文件类型、地点、本地机器或远程服务器无关。
以下代码将当前目录下的文件枚举出来并打印每个文件名：
CFileFind finder
BOOL bWorking = finder.FindFile("*.*");
while(bWorking)
{
bWorking = finder.FindNextFile( );
cout <<(LPCTSTR) finder.GetFileName( ) <<endl;
}
为使示例简单，此代码使用标准C++库函数cout类，cout行可由调用CListBox::AddString来代替。
要了解有关CFileFind和其它WinInet类共同使用的情况，请参阅联机文档“Visual C++程序员指南”中的“用WinInet设计Internet程序”。
#include <afx.h>

请参阅：
CFtpFileFind, CGopherFileFind, CInternetFile, CGopherFile, CHttpFile

CFileFind类的成员

构造函数
CFileFind 构造一个CFileFind对象。

属性
GetLength | 获取找到文件的长度，以字节为单位
GetFileName | 获取找到文件的名字
GetFilePath | 找到文件的全路径
GetFileTitle | 获取找到文件的标题，标题不包括扩展内容
GetFileURL | 获取找到文件的URL，包括文件路径
GetRoot | 获取找到文件根目录
GetCreationTime | 获取文件创建时间
GetLastAccessTime | 获取文件最后一次打开的时间
GetLastWriteTime | 文件最后改变和存储的时间
MatchesMask | 指定要找的文件的属性
IsDots | 查看文件名是否是包含"."或".."，以表明它的确是一个目录
IsReadOnly | 文件是否是只读
IsDirectory | 文件是否是目录
IsCompressed | 文件是否是压缩
IsSystem | 文件是否是系统文件
IsHidden | 文件是否是隐藏
IsTemporary | 文件是否是临时的
IsNormal | 文件是否是常规的（无其它属性）
IsArchived | 文件是否是档案

操作
Close | 关闭查找请求
FindFile | 查找一个目录中的指定文件
FindNextFile | 从FindFile以前调用开始继续下一查找


 CFileFind::CFileFind

CFileFind( );

说明：当构造一个CFileFind对象后，调用此成员函数。

请参阅：CGopherFileFind, CFtpFileFind


 CFileFind::Close

void Close( );

说明：
调用此成员函数结束查找、重新设置背景、释放资源。调用Close后，在调用FindFile开始新查找之前无须立即构造一个新CFileFind对象。


 CFileFind::FindFile

virtual BOOL FindFile(LPCTSTR pstrName = NULL, DWORD dwUnused = 0);

返回值：
如果成功，则返回非零值，否则为0。如果失败，可调用Win32函数GetLastError获取出错原因。

参数：
pstrName | 指向待找文件名字符串，如果为NULL，则查找以*.*形式进行。
dwUnused | 保留，以使FindFile在派生类多形，必须为0。

说明：
调用此成员函数打开一个文件查找。
当调用FindFile开始查找后，调用FindNextFile获取下一个文件。
你必须在调用下列属性函数之前调用一次FindNextFile：
· | GetCreationTime
· | GetFileName
· | GetFileTitle
· | GetFilePath
· | GetFileURL
· | GetLastAccessTime
· | GetLastWriteTime
· | GetLength
· | GetRoot

请参阅：CFileFind::FindNextFile


 CFileFind::FindNextFile

virtual BOOL FindNextFile( );

返回值：
如果还有文件，则返回非零值；如果为最后一个文件，则为0，以前对FindFile或FindNextFile调用均返回0。要了解更多信息，请参阅Win32函数GetLastError。

说明：
调用此成员函数，从以前对FindFile的调用开始继续查找。你必须在调用下列属性函数之前调用一次FindNextFile：
· | GetCreationTime
· | GetFileName
· | GetFile Title
· | GetFilePath
· | GetFileURL
· | GetLastAccessTime
· | GetLastWriteTime
· | GetLength
· | GetRoot
FindNextFile包含了Win32函数GetLastError。


 CFileFind::GetCreationTime

virtual BOOL GetCreationTime (FILETIME* pFileTime)const;
virtual BOOL GetCreationTime (CTime& refTime)const;

返回值：
如果成功，则返回非零值，否则为0。仅在此CFileFind对象从未调用过FindNextFile时，函数才返回0。

参数：
pFileTime | 指向文件创建时间的FILETIME结构。
refTimeCTime | 对象的参考。

说明：
调用此成员函数获取指定对象的创建时间。
调用此GebCreationTime成员函数之前必须至少调用一次FindNextFile。
注意：
不是所有的系统使用相同的语义实现此函数返回的时间戳。如果支撑的文件系统或服务器不支持保持时间属性，则此函数会返回与其它时间函数相同的值。可参阅Win32_FIND_DATA结构了解时间格式信息。有些操作系统中，返回时间是依文件所在地的时区来决定的，请参阅Win32“FileTimeToLocalFileTimeAPI”了解更多的信息。


 CFileFind::GetFileName

virtual CString GetFileName( )const;

返回值：最近找到的文件的文件名。

说明：
获取找到文件的文件名，调用之前必须至少调用一次FindNextFile。GetFileName是CFileFind成员函数中返回某种形式的文件名的函数。下面的列表描述了这三个函数及其区别：
· | GetFileName | 返回文件名，包括扩展文件名。例如，调用GetFileName来产生一个关于文件c:\myhtml\myfile.txt的用户信息，将会返回文件名myfile.txt。
· | GetFilePath | 返回全部文件的路径。例如，调用GetFilePath用于产生一个关于文件c:\myhtml\myFile.txt的用户消息，将会返回文件路径c:\myhtml\myfile.txt。
· | GetFileTitle | 返回文件名，不包括扩展名。例如，调用GetFileTitle来产生一个关于文件c:\myhtml\myfile.txt的用户消息，将会返回文件标题myfile。

请参阅：CFileFind::FindFile


 CFileFind::GetFilePath

virual CString GetFilePath( )const;

返回值：指定文件的路径。

说明：
获取指定文件的全路径，调用此成员函数前必须至少调用一次FindNextFile。
GetFilePath是CFileFind三种成员函数中返回不同形式文件名的函数之一，下面的列表描述了这三个函数及其区别：
· | GetFileName | 返回文件名，包括扩展文件名。例如，调用GetFileName来产生一个关于文件c:\myhtml\myfile.txt的用户信息，将会返回文件名myfile.txt。
· | GetFilePath | 返回全部文件的路径。例如，调用GetFilePath用于产生一个关于文件c:\myhtml\myFile.txt的用户消息，将会返回文件路径c:\myhtml\myfi-le.txt。
· | GetFileTitle | 返回文件名，不包括扩展名。例如，调用GetFileTitle来产生一个关于文件c:\myhtml\myfile.txt的用户消息，将会返回文件标题myfile。

请参阅：CFileFind::FindFile


 CFileFind::GetFileTitle

virtual CString GetFileTitle ( )const;

返回值：文件标题。

说明：
调用此成员函数获取查找文件的标题，调用之前必须至少调用一次FindNextFile。
GetFileTitle是CFileFind三种成员函数中返回不同形式文件名的函数之一，下面的列表描述了这三个函数及其区别：
· | GetFileName | 返回文件名，包括扩展文件名。例如，调用GetFileName来产生一个关于文件c:\myhtml\myfile.txt的用户信息，将会返回文件名myfile.txt。
· | GetFilePath | 返回全部文件的路径。例如，调用GetFilePath用于产生一个关于文件c:\myhtml\file.txt的用户消息，将会返回文件路径c:\myhtml\myfile.txt。
· | GetFileTitle | 返回文件名，不包括扩展名。例如，调用GetFileTitle来产生一个关于文件c:\myhtml\myfile.txt的用户消息，将会返回文件标题myfile。

请参阅：CFileFind::FindFile


 CFileFind::GetFileURL

virtual CString GetFileURL( )const;

返回值：完整的URL。

说明：
调用此成员函数获得指定的URL，调用之前必须至少调用一次FindNextFile。
GetFileURL与GetFilePath基本一样，但URL的形式为 file:// path。例如，调用GetFileURL获取myfile.txt完整的URL，将返回URL：file://c:\myhtml\myfile.txt。

请参阅：CFileFind::FindFile


 CFileFind::GetLastAccessTime

virtual BOOL GetLastAccessTime(CTime& refTime)const;
virtual BOOL GetLastAccessTime(FILETIME* pFileTime)const;

返回值：
如果成功，则返回非零值，否则为0。仅在此CFileFind对象从未调用过FindNextFile时，该函数才返回0。

参数：
pFileTime | 包含最后一次访问文件的时间的FILETIME结构指针。
refTime | CTime对象的参考。

说明：
调用此成员函数获得最后一次访问文件的时间。
调用此GetlastAccessTime成员函数之前必须至少调用一次FindNextFile。
注意：
不是所有的系统使用相同的语义实现此函数返回的时间戳。如果支撑的文件系统或服务器不支持保持时间属性，则此函数会返回与其它时间函数相同的值。可参阅Win32_FIND_DATA结构了解时间格式信息。有些操作系统中，返回时间是依文件所在地的时区来决定的，请参阅Win32“FileTimeToLocalFileTimeAPI”了解更多的信息。


 CFileFind::GetLastWriteTime

virtual BOOL GetLastWriteTime(FILETIME* pFileTime)const;
virtual BOOL GetLastWriteTime(CTime& refTime)const;

返回值：
如果成功，则返回非零值，否则为0。仅在此CFileFind对象从未调用过FindNextFile时，函数才返回0。

参数：
pFileTime | 指向包含最后一次写文件的时间的FILETIME结构。
refTime | CTime对象的参考。

说明：
调用此成员函数获得最后一次改变文件的时间。
调用GetLastWriteTime之前必须至少调用一次FindNextFile。
注意：
不是所有的系统使用相同的语义实现此函数返回的时间戳。如果支撑的文件系统或服务器不支持保持时间属性，则此函数会返回与其它时间函数相同的值。可参阅Win32_FIND_DATA结构了解时间格式信息。有些操作系统中，返回时间是依文件所在地的时区来决定的，请参阅Win32“FileTimeToLocalFileTimeAPI”了解更多的信息。


 CFileFind::GetLength

DWORD GetLength( )const;

返回值：找到文件的长度，以字节为单位。

说明：
获取找到文件的字节长度。调用之前必须至少调用一次FindNextFile。
GetLength用Win32结构WIN32_FIND_DATA的nFileSizeLow成员来获取并返回文件长度的低位字。如果文件长于4G，则使用GetLength64成员函数。


 CFileFind::GetRoot

virtual CString GetRoot( )const;

返回值：正在活动的查找的根。

说明：
调用此成员函数获取找到的文件的根，调用之前必须至少调用一次FindNextFile。
此成员函数返回开始查找使用的指定驱动器和路径名。例如，用*.dat调用FindFile::GetRoot返回一个空字符串。传递一个路径如c:\windows\system\*.dll，则GetRoot返回c:\windows\system\。


 CFileFind::IsArchived

BOOL IsArchived( )const;

返回值：如果成功，则返回非零值，否则为0。

说明：
调用此成员函数判断找到文件是否是档案类型。应用为一个可备份和移动的档案文件标记一个FILE_ATTRIBUTE_ARCHIVE类型，此类型由WIN32_FIND _DATA指定。
请参阅成员函数MatchesMask，了解文件属性的完整列表。


 CFileFind::IsCompressed

BOOL IsCompressed( )const;

返回值：如果成功，则返回非零值，否则为0。

说明：
调用此成员函数判断找到的文件是否是压缩文件。压缩文件用WIN32_FIND_ DATA结构的文件属性标识FILE_ATTRIBUTE_COMPRESSED标识。对于一个文件来说，压缩属性表明文件中所有的数据都是压缩的。对一个目录来说，新创建的文件和子目录都使用这个缺省的压缩属性。请参阅成员函数MatchesMask，了解文件属性的完整列表。


 CFileFind::IsDirectory

BOOL IsDirectory( ) const;

返回值：如果成功，则返回非零值，否则为0。

说明：
调用此成员函数判断找到的文件是否是一个目录。目录文件用WIN32_FIND_DATA结构的文件属性标识FILE_ATTRIBUTE_DIRECTORY标识。
请参阅成员函数MatchesMask，了解文件属性的完整列表。


 CFileFind::IsDots

virtual BOOL IsDots( )const;

返回值：
如果找到文件的文件名包含“.”或“..”，表明找到的文件实际是一个目录，则返回非零值，否则为0。

说明：
调用此成员函数循环遍历文件，测试当前目录和父目录标记。

请参阅：CFileFind::IsDirectory


 CFileFind::IsHidden

BOOL IsHidden ( )const;

返回值：如果成功，则返回非零值，否则为0。

说明：
调用此成员函数判断找到的文件是否是隐藏文件。隐藏文件用WIN32_FIND_DATA结构的文件属性标识FILE_ATTRIBUTE_HIDDEN标识，它不包含在常用的文件列表中。请参阅成员函数MatchesMask，了解文件属性的完整列表。


 CFileFind::IsNormal

BOOL IsNormal( )const;

返回值：如果成功，则返回非零值，否则为0。

说明：
调用此成员函数判断找到的文件是否是一个常规文件。常规文件用WIN32_FIND_DATA结构的文件属性标识FILE_ATTRIBUTE_NORMAL标识，一个常规文件不包括其它属性设置，所有其它属性覆盖此属性。
请参阅成员函数MatchesMask，了解文件属性的完整列表。


 CFileFind::IsReadOnly

BOOL IsReadOnly( )const;

返回值：如果成功，则返回非零值，否则为0。

说明：
调用此成员函数判断找到的文件是否是只读文件。一个只读文件用WIN32_FIND_DATA结构的文件属性FILE_ATTRIBUTE_标识，应用可以读此类文件但不可写或删除此文件。
请参阅成员函数MatchesMask，了解文件属性的完整列表。


 CFileFind::IsSystem

BOOL IsSystem( )const;

返回值：如果成功，则返回非零值，否则为0。

说明：
调用此成员函数判断找到的文件是否是系统文件，系统文件用WIN32_FIND_DATA结构的文件属性标识FILE_ATTRIBUTE_SYSTEM来标识，系统文件是操作系统的一部分或专用于操作系统。
请参阅成员函数MatchesMask，了解文件属性的完整列表。


 CFileFind::IsTemporary

BOOL IsTemporary( )const;

返回值：如果成功，则返回非零值，否则为0。

说明：
调用此成员函数判断找到的文件是否是临时文件。一个临时文件用WIN32_FIND_DATA结构的文件属性FILE_ATTRIBUTE_TEMPORARY标识。临时文件用于临时存储，应用只有在完全必要时才写文件，大多数文件的数据保留于存储区而不存入介质，因为文件将很快被删除。
请参阅成员函数MatchesMask，了解文件属性的完整列表。


 CFileFind::MatchesMask

virtual BOOL MatchesMask(DWORD dwMask)const;

返回值：
如果成功，则返回非零值，否则为0。要得到更多的出错信息，可调用Win32函数GetLastError。

参数：
dwMask指定找到文件的一个或多个属性，由WIN32_FIND_DATA结构标识。为查找多重属性，可用OR（|）操作符，以下为可接收的属性：
· | FILE_ATTRIBUTE_ARCHIVE | 文件为档案文件。应用使用此属性标明文件可以备份和移动。
· | FILE_ATTRIBUTE_COMPRESSED | 文件或目录为压缩。对文件来说，表明文件中的所有数据都是压缩的；如果为目录，表示新建文件和子目录缺省为压缩的。
· | FILE_ATTRIBUTE_DIRECTORY | 文件为目录。
· | FILE_ATTRIBUTE_NORMAL | 文件没有其它属性设置，此属性仅可单独使用，任何其它属性覆盖此属性。
· | FILE_ATTRIBUTE_HIDDEN | 文件隐藏，不包含在通常的目录列表。
· | FILE_ATTRIBUTE_READONLY | 文件只读，应用可读出文件但不可写、删文件。
· | FILE_ATTRIBUTE_SYSTEM | 文件是操作系统的一部分或为操作系统专用。
· | FILE_ATTRIBUTE_TEMPORARY | 文件用于临时存储。只有在完全必要时应用才写文件，大多数文件数据存储于存储区而不存入介质，因为文件将很快被删除。

说明：调用此成员函数测试找到的文件的属性。

请参阅：
CFileFind::IsDots, CFileFind::IsReadOnly, CFileFind::IsDirectory, CFileFind::IsCompressed, CFileFind::IsSystem, CFileFind::IsHidden, CFileFind::IsTemporary, CFileFind::IsNormal, CFileFind::IsArchived


 CFindReplaceDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog
└CFindReplaceDialog

CFindReplaceDialog类在应用中实现标准字符串查找/替换对话框。不像其它普通的Windows对话框，CFindReplaceDialog对象是非模态的，允许用户与屏幕上的窗口进行交互。有两种CFindReplaceDialog对象：查找对话框和查找/替换对话框。尽管对话框允许用户输入查找/替换对话框，它们并不进行查找或替换，必须在应用中添加。
要构造一个CFindReplaceDialog，可调用提供的构造函数（无参的），因为它是非模态的，用new操作符把它放于堆顶而不放于栈中。
当一个CFindReplaceDialog被构造后，必须调用Create成员函数构造并显示一个对话框。
调用Create之前，用m_fr结构初始化对话框。m_fr的类型为FINDREPLACE。要了解有关此结构的更多信息，可参阅联机文档“Win32 SDK”。
为使父窗口被通知查找/替换请求，必须在框架窗口使用WindowsRegister-WindowMessage 函数并使用ON_REGISTERED_MESSAGE消息映射宏处理登记消息。你可以从框架窗口的回调函数中调用CFindReplaceDialog类成员表中列出的任何成员函数。
可以使用IsTerminating判断用户是否是决定终止对话框。
CFindReplaceDialog依赖Windows3.1以上版本的文件COMMDLG.DLL。
要定制对话框，可从CFindReplaceDialog派生出一个类，提供一个定制对话框模板，加入一个消息映射，从扩展控件中获取通知消息。其它未处理的消息应被传递给基类。
无须定制钩子函数。
要获取关于使用CFindReplaceDialog的更多信息，可参阅联机文档“Visual C++程序员指南”中的“常用对话框类”。
#include <afxdlgs.h>

CFindReplaceDialog类的成员

数据成员
m_fr 定制CFindReplaceDialog对象的结构

构造函数
CFindReplaceDialog | 构造一个CFindReplaceDialog对象
Create | 创建并显示一个CFindReplaceDialog对话框

操作
FindNext | 调用此成员函数决定用户是否想继续查找下一字符串
GetNotifier | 调用此成员函数在登记消息句柄中获得FINDREPLACE结构
GetFindString | 调用此成员函数获得当前找到的字符串
GetReplaceString | 调用此成员函数获得当前替换字符串
IsTerminating | 调用此成员函数决定对话框是否终止
MatchCase | 调用此成员函数决定用户是否想查找完全匹配的字符串
MatchWholeWord | 调用此成员函数决定用户是否只想查找与整个字相匹配的串
ReplaceAll | 调用此成员函数决定用户是否替换所有串
ReplaceCurrent | 调用此成员函数决定用户是否替换当前串
SearchDown | 调用此成员函数决定是否向下查找


 CFindReplaceDialog::CFindReplaceDialog

CFindReplaceDialog( );

说明：
构造一个CFindReplaceDialog对象，CFindReplaceDialog对象用new操作符在堆顶。
要了解有关构造CFindReplaceDialog对象的更多信息，请参阅CFindReplaceDialog的概述。可使用Create显示对话框。

请参阅：CFindReplaceDialog::Create


 CFindReplaceDialog::Create

BOOL Create(BOOL bFindDialogOnly,
LPCTSTR lpszFindWhat,
LPCTSTR lpszReplaceWith = NULL,
DWORD dwFlags = FR_DOWN,
CWnd* pParentWnd = NULL
);

返回值：
如果对话框对象成功构造，则返回非零值，否则为0。

参数：
bFindDialogOnly | 将参数设置为TRUE，显示标准查找对话框，FALSE显示查找/替换对话框。
lpszFindWhat | 指定要查找的字符串。
lpszReplaceWith | 指定替换找到的字符串的缺省字符串。
dwFlags | 用一个或多个标志的组合及联合按位OR操作符来定制一个对话框的设置。缺省为FR_DOWN，指定查找方向是向下的。可参阅联机文档“Win32 SDK”中的FINDREPLACE结构，了解有关此标志的更多信息。
pParentWnd | 指向对话框的父窗口或拥有者窗口。此窗口是将接收对话框中查找/替换动作信息的窗口。如果为NULL，则应用的主窗口被使用。

说明：
创建并显示一个查找或查找/替换对话框（由bFindDialogOnly指定）。为了使父窗口知道查找/替换请求，必须使用Windows RegisterWindowMessage函数，它的返回值是应用实例唯一的消息号。框架窗口必须有一个消息映射入口，以声明回调函数（如下例中的OnFindReplace）来处理登记消息。
以下代码段是对一个CMyFrameWnd框架窗口类作此操作的示例：
class CmyFrameWnd : public CFrameWnd
{
protected:
afx_msg LONG OnFindReplace(WPARAM wParam, LPARAM 1Param);
DECLARE_MESSAGE_MAP( )
};

static UINT WM_FINDREPLACE = ::RegisterWindowMessage(FINDMSGSTRING);
BEGIN_MESSAGE_MAP(CMyFrameWnd, CFrameWnd)
// Normal message map entries here.
ON_REGISTERED_MESSAGE(WM_FINDREPLACE,OnFindReplace)
END_MESSAGE_MAP
在OnFindReplace函数中，解释了用户的意图并创建了查找/替换操作的代码。

请参阅：CFindReplaceDialog::CFindReplaceDialog


 CFindReplaceDialog::FindNext

BOOL FindNext( )const;

返回值：
如果用户想查找下一个出现的字符串，则返回非零值，否则为0。

说明：
从回调函数中调用此成员函数，决定是否想查找下一个出现的字符串。

请参阅：
CFindReplaceDialog::GetFindString, CFindReplaceDialog::SearchDown


 CFindReplaceDialog::GetFindString

CString GetFindString ( )const;

返回值：查找的缺省字符串。

说明：
从回调函数中调用此成员函数，获得查找到的缺省字符串。

请参阅：
CFindReplaceDialog::FindNext, CFindReplaceDialog::GetReplaceString


 CFindReplaceDialog::GetNotifier

static CFindReplaceDialog* PASCAL GetNotofier(LPARAM lParam);

返回值：指向当前对话框的指针。

参数：
lParam 传递到框架窗口的OnFindReplace成员函数的lparam值。

说明：
调用此成员函数，获取一个指向当前对话框的指针。它应在回调函数中使用，来获得一个当前对话框入口，调用它的成员函数并访问m_fr结构。


 CFindReplaceDialog::GetReplaceString

CString GetReplaceString( ) const;

返回值：替换找到字符串的缺省字符串。

说明：调用此成员函数获取当前替换字符串。

请参阅：CFindReplaceDialog::GetFindString


 CFindReplaceDialog::IsTerminating

BOOL IsTerminating( )const;

返回值：如果用户决定终止对话框，则为非零值，否则为0。

说明：
在回调函数中调用此成员函数，决定用户是否要终止对话框。如果返回非零值，则应调用当前对话框的DestroyWindow成员函数并设置任意对话框指针变量为NULL。另外，也可以将最后输入的查找/替换文本存储起来，初始化查找/替换对话框。


 CFindReplaceDialog::MatchCase

BOOL MatchCase( )const;

返回值：
如果用户希望查找的字符与指定字符大小写匹配，则返回非零值，否则为0。

说明：
调用此成员函数决定用户是否是希望查找的字符大小写匹配。

请参阅：CFindReplaceDialog::MatchWholeWord


 CFindReplaceDialog::MatchWholeWord

BOOL MatchWholeWord( )const;

返回值：
如果用户希望查找字符整个字与之匹配，则返回非零值，否则为0。

说明：
调用此成员函数决定用户是否是希望仅与整个字相匹配。

请参阅：CFindReplaceDialog::MatchCase


 CFindReplaceDialog::ReplaceAll

BOOL ReplaceAll( )const;

返回值：
如果用户希望所有匹配字符串均被替换，则返回非零值，否则为0。

说明：
调用此成员函数决定是否替换所有匹配字符串。

请参阅：CFindReplaceDialog::ReplaceCurrent


 CFindReplaceDialog::ReplaceCurrent

BOOL ReplaceCurrent( )const;

返回值：
如果用户希望替换当前选中的字符串，则为非零值，否则为0。

说明：
调用此成员函数决定用户是否替换当前字符串。

请参阅：CFindReplaceDialog::ReplaceAll


 CFindReplaceDialog::SearchDown

BOOL SearchDown( )const;

返回值：
如果用户希望查找时的顺序是向下的，则为非零值。如果用户希望向上查找，则为0。

说明：
调用此成员函数决定用户是否希望向下查找。


 CFindReplaceDialog::m_fr

说明：
m_fr是一个FINDREPLACE类型的结构，它存储对话框对象的特性。构造一个CFindReplaceDialog对象后，可用m_fr改变对话框中的变量值。
要了解有关此结构的更多信息，可参阅联机文档“Win32 SDK”中的FINDREPLACE结构。


 CFont

CObject
└CGdiObject
└CFont

CFont类封装了一个Windows图形设备接口（GDI）字体并提供管理字体的成员函数。为使用一个CFont对象，可构造一个CFont对象并用CreatFont，CreateFontIndirect，CreatePointFont或CreatePointFontIndirect将一个Windows字体附加给它，然后用对象的成员函数操纵字体。
CreatePointFont和CreatePointFontIndirect常比使用CreateFontIndirect更容易，因为它们自动将字体高度从点大小变为逻辑单位。要了解有关CFont的更多信息，请参阅“Visual C++ 程序员指南”中的“图形对象”。
#include <afxwin.h>

CFont类的成员

构造函数
CFont 构造一个CFont对象

初始化
CreateFontIndirect | 初始化一个由LOGFONT结构给出其特征的CFont对象
CreateFont | 初始化用指定特性定义的CFont对象
CreatePointFont | 用指定高度（用0.1点）和字体初始化一个CFont对象
CreatePointFontIndirect | 与CreateFontIndirect相似，但字体高度用0.1点定义而不用逻辑单位定义

操作
FromHandle 当给定一个Windows HFONT时，返回一个指向CFont对象的指针

属性
operator HFONT | 返回附加给CFont对象的Windows GDI字体句柄
GetLogFont | 用附加给CFont对象的逻辑字体信息填充一个LOGFONT


 CFont::CFont

CFont( );

说明：
构造一个CFont对象，在结果对象被使用之前必须先用CreateFont,CreateFontIndirect,CreatePointFont或CreatePointFontIndirect初始化。

请参阅：
CFont::CreateFontIndirect, CFont::CreateFont, CFont::CreatePointFont, CFont::CreatePointFontIndirect, ::EnumFonts


 CFont::CreateFont

BOOL CreateFont(
int nHeight,
int nWidth,
int nEscapenment,
intnOrientation,
int nWeight,
BYTE bItalic,
BYTE bUnderline,
BYTE cStrikeOut,
BYTE nCharset,
BYTE nOutPrecision,
BYTE nClipPrecision,
BYTE nQuality,
BYTE nPitchAndFamily,
LPCTSTR lpszFacename
);

返回值：如果成功，则返回非零值，否则为0。

参数：
nHeight以逻辑单位方式指定字体的高度，字体高度可为以下值之一：
· | 大于0，此时高度被转化为设备单位，与可用字体的网格高度相比较。
· | 等于0，此时使用合理的缺省大小。
· | 小于0，此时高度被转化为设备单位，而绝对值与可用字体的字符高度相比较。
nHeight绝对值在转化后不可超过16,384设备单位。在所有的高度对比中，如果字体超过所要求的值，则字体映像器中大字体不会超过所需大小，小字体也不会超过。
nWidth | 指定字体中字符平均宽度（用逻辑单位）。如果为0，设备方向比率与可用字体的数字方向比率相比较，找一个最近的匹配，它由值的差的绝对值决定。
nEscapement | 指定偏离垂线与x轴在显示面上的夹角（用0.1度单位）。偏离垂线时从一行中开始一个字符到最后一个字符的线，此角从x轴逆时针方向度量。
nOrientation | 指定字符基线和x轴之间的夹角（用0.1度单位）。此度数在座标轴中由x轴逆时针方向度量时坐标系中y轴向下，顺时针方向从x轴旋转时，y轴向上。
nWeight指定字体磅数（用每1000点中墨点像素数计）。尽管nWeight可为0到1000中的任意整数值，常用值和常数如下：
常数 | 值
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
以上各值是大约数，实际外观依赖字体大小，有的字体仅有FW_NORMAL，FW_REGULAR，FW_BOLD磅数。如果FW_DONTCARE被指定，则使用缺省磅数。
bItalic | 指定字体是否为斜体。
bUnderline | 指定字体是否带下划线。
bStrikeOut | 指定是否是字体字符突出。如果设置为非零，则突出。
nCharSet指定字体的字符集，以下是预定义的常数和值：
常数 | 值
ANSI_CHARSET | 0
DEFAULT_CHARSET | 1
SYMBOL_CHARSET | 2
SHIFTJIS_CHARSET | 128
OEM_CHARSET | 255
OEM字符集依赖于系统。
具有其它字符集的字体可能存在于系统之中。一个使用未知字符集字体的应用不能翻译或解释一个以此字符集着色的字符串，相反，应将字符串直接输入到设备驱动。
字体映射器不使用DEFAULT_CHARSET值，一个应用可以使用此值让字体名和大小完全描述逻辑字体。如果指定的名字不存在，为避免不可预料的结果，应用应谨慎地使用 DEFAULT_CHARSET。
nOutPrecision指定所需的输出精度。输出精度定义输出与需要的字体高度、宽度，字符方向、走格、间距之间的接近程度，可以为以下值之一：
OUT_CHARACTER_PRECIS | OUT_STRING_PRECIS
OUT_DEFAULT_PRECIS | OUT_STROKE_PRECIS
OUT_DEVICE_PRECIS | OUT_TT_PRECIS
OUT_RASTER_PRECIS |
应用在系统包含多个给定名字的字体时，可用OUT_DEVICE_PRECIS，OUT_RASTER_PRECIS和OUT_TT_PRECIS值控制一个字体映射器如何选择一种字体。例如，如果一个系统包含一个名叫Symbol的字体，以光栅和TrueType形式存在，指定OUT_TT_PRECIS使字体映射器选择TrueType类型（指定OUT_TT_PRECIS强制字体映射器选择TrueType字体（当指定字体名与一个设备或光栅字体相匹配），即使没有同名的TrueType字体。
nClipPrecision指定所需的剪贴精度。剪贴精度定义了如何剪贴部分超过剪贴范围的字符，可为以下值之一：
CLIP_CHARACTER_PRECIS | CLIP_MASK
CLIP_DEFAULT_PRECIS | CLIP_STROKE_PRECIS
CLIP_ENCAPSULATE | CLIP_TT_ALWAYS
CLIP_LH_ANGLES |
要使用插入的只读字体，应用必须指定CLIP_ENCAPSULATE。要建立设备旋转、TrueType和矢量字库，应用可以用OR操作符将CLIP_LH_ANGLES值与其它nClipPrecision值组合。如果CLIP_LH_ANGLES位被设置，所有字体的旋转都依赖于坐标系的定位是左手方向还是右手方向（要了解有关坐标轴定位的更多信息，请参阅nOrientation参数的描述）。如果CLIP_LH_ANGLES未被设置，设置字体常逆时针方向旋转，但其它字体的旋转依赖于坐标系的旋转定位。
nQuality指示字体的输出质量，定义了GDI必须使逻辑字体特性和物理字体特性相匹配的程度。可为以下值之一：
DEFAULT_QUALITY | 字体的外观无关紧要。
DRAFT_QUALITY | 当PROOF_QUALITY使用时，字体的外观不太重要。对GDI光栅字体来说，允许缩放。黑体、斜体、下划线、突出字体和综合处理在需要时可用。
PROOF_QUALITY | 字体的字符质量比精确的逻辑字体特性的匹配更重要。对GDI光栅字体，缩放无效，大小最接近的字体被选用。黑体、斜体、下划线、突出和综合处理在需要时可用。
nPitchAndFamily指定字体的间距和家族。两个低位指定字体的间距，可为以下值之一：
DEFAULT_PITCH、VARIABLE_PITCH、FIXED_PITCH
应用可以将T\MPF_TRUETYPE加到nPitchAndFamily参数中来选择一个TrueType字体。高四位指定字体家族，可为以下值之一：
· | FF_DECORATIVE | 新奇字体，如以前英格兰的字体。
· | FF_DONTCARE | 不在意或不知道。
· | FF_MODERN | 笔型宽度不变的字体，有或无衬线。固定斜度的字体常是现代风格的，如Pica,Elite和Courier New。
· | FF_ROMAN | 笔划宽度可变（接比例调整空间）及有衬线字体。如Times New Roman和Century Schoolbook。
· | FF_SCRIPT | 与手写体相似的字体，如Script和Cursive。
· | FF_SWISS | 笔划宽度可变（接比例调整空间）及不带有衬线字体，如MS Sans Serif。
一个应用可用布尔操作OR指定一个nPithAndFamily值以组合一个斜体和一个家族常数。
字体家族用普通方式描述了字体的外观，它们在所需铅字体无效时用于定义指定的字体。
lpszFacenameCString | 或指向一个以空终止字符串的指针，字符串指定字体字样的名字。此字符串的长度不能长于30个字符，WindowsEnumFontFamilies函数可用于枚举所有当前可用字体。如果为NULL，则GDI使用一个不依赖设备的字体。

说明：
用指定的特征初始化一个CFont对象。此字体可被选作任何设备上下文的字体。CreateFont函数不创建一个新Windows GDI字体，只是从GDI物理字体库选择最相近的匹配字体。当构造一个逻辑字体时，应用可以为这些参数的大部分使用缺省设置。参数经常应被给定的特定值是nHeight和lpszFaceName。如果应用没有给定nHeight和lpszFace Name，则逻辑字体是与设备有关的。当用CreateFont函数完成了一个CFont对象的创建时，先从设备上下文中选择字体，然后删除CFont对象。

请参阅：
CFont::CreateFontIndirect, CFont::CreatePointFont, ::CreateFont, ::EnumFontFamilies, ::EnumFonts


 CFont::CreateFontIndirect

BOOL CreateFontIndirect(const LOGFONT* lpLogFont);

返回值：如果成功，则返回非零值，否则为0。

参数：
lpLogFont 指向一个定义逻辑字体的特征的LoGFont结构。

说明：
用lpLogFont指向的LOGFONT结构定义的特征初始化一个CFont对象，之后此字体即可被任何设备选作当前字体。
此字体具有LOGFONT结构定义的特征。当使用CDC::SelectObject成员函数选择时，GDI字体映射器将努力将逻辑字体和已存在的物理字体相匹配。如果找不到匹配的逻辑字体，则尽可能找与之特性匹配最多的字体替代。
当你用CreateFontIndirect函数完成CFont对象的创建后，先在设备上下文中选择字体，然后删除CFont对象。

请参阅：
CFont::CreateFont, CFont::CreatePointFontIndirect, CDC::SelectObject, CGdiObject::DeleteObject, ::CreateFontIndirect


 CFont::CreatePointFont

BOOL CreatePointFont(int nPointSize, LPCTSTR lpszFaceName, CDC* pDC = NULL);

返回值：如果成功，则返回非零值，否则为0。

参数：
nPointSize | 所需字体高度（用0.1点表示，例如，传递120表示12点字体）。
lpszFaceName | 一个CString或指向一个以空终止符结尾的字符串，定义字体名称。此字符串长度不应超过30个字符。Windows EnumFontFamilies函数可用于计算当前可用字体的总数。如果为NULL，则GDI使用与设备无关的字体。
pDC | 指向CDC对象，将nPointSize中的高度转化为逻辑单位。如果为NULL，则屏幕设备上下文用于转换。

说明：
此函数提供了一种创建指定字体和点大小的字体对象的方法，它自动将nPointSize中的高度转化为逻辑单位，这是使用由pDC指向的CDC对象实现的。
当完成用CreatePointFont函数创建CFont对象后，从设备上下文中选择字体，然后删除CFont对象。

请参阅：CFont::CreatePointFontIndirect, CFont::CreateFont


 CFont::CreatePointFontIndirect

BOOL CreatePointFontIndirect(const LOGFONT* lpLogFont, CDC* pDC = NULL);

返回值：如果成功，则返回非零值，否则为0。

参数：
lpLogFont | 指向LOGFONT结构，定义逻辑字体特征。LOGFONT的lfHeight成员用0.1点计算而不用逻辑单位（如果设置lfHeight为120，则要求12点字体）。
pDC | 指向CDC对象，用于将lfHeight中的高度转化为逻辑单位。如果为NULL，屏幕设备上下文用于转换。

说明：
此函数与CreateFontIndirect相似，但LOGFONT的lfHeight成员由0.1点表示而不是用设备单位表示。在传递LOGFONT结构到Windows之前，pDC指向的CDC对象自动使函数的lfHeight中的高度转化为逻辑单位。
当完成由CreatePointFontIndirect函数创建的CFont对象之后，先选择设备上下文字体，然后删去CFont对象。

请参阅：
CFont::CreatePointFont, CFont::CreateFontIndirect


 CFont::FromHandle

static CFont* PASCAL FromHandle (HFONT hFont);

返回值：如果成功，则指向CFont对象的指针，否则为NULL。

参数：
hFontWindows 字体中的HFONT句柄。

说明：
当给定一个Windows GDI字体对象的HFONT句柄时，返回一个指向CFont对象的指针。如果CFont对象还未附加给句柄，一个临时CFont对象被创建并附加，此临时CFont对象仅在应用在事件循环中有空闲时才可用，此时临时图形对象被删除。另一种说法是临时对象仅在一个窗口消息进程中才可用。


 CFont::GetLogFont

int GetLogFont(LOGFONT* pLogFont);

返回值：如果成功，则返回非零值，否则为0。

参数：
pLogFont 指向LOGFONT结构以接收字体信息。

说明：调用此成员函数获取一个CFont的LOGFONT结构的拷贝。

请参阅：LOGFONT, ::GetObject


 CFont::operator HFONT

operator HFONT( )const;

返回值：
如果成功，则返回附加给CFont的Windows GDI字体对象句柄，否则为NULL。

说明：
用此操作获取附加给CFont的Windows GDI字体对象句柄。
由于操作自动将CFont转换为字体和文本，可以将CFont对象传递到除HFONT以外的函数。
要获取有关图形对象的更多信息，可参阅联机文档“Win32 SDK”中的“图形对象”。


 CFontDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog
└CFontDialog

CFontDialog可以使你向应用添加一个字体选择对话框。一个CFontDialog对象是一个带有当前安装到系统的字体列表对话框，用户可从列表中选择一种字体并将选择传递给应用。
要构造一个CFontDialog对象，用提供的构造函数或派生一个新的子类并使用自己定制的构造函数。
一旦CFontDialog对象被创建，可用m_cf结构来初始化对话框中控件的状态或值。m_cf结构是CHOOSEFONT类型的。要了解有关此结构的信息，可参阅联机文档“Win32 SDK”。
当初始化了对话对象的控件后，调用DoModal成员函数来显示对话框并使用户选择字体。DoModal返回不管用户选择了OK（IDOK）还是取消（IDCANCEL）按钮。
如果DoModal返回IDOK，可以使用CFontDialog的某一成员函数获取用户输入的更多信息。
可使用Windows CommDlgExtendedError函数来判断初始化对话框时是否是发生了错误并获取错误的更多消息。要了解更多信息，可参阅联机文档“Win32 SDK”。
CFontDialog需要Windows3.1以上版本的COMMDLG.DLL文件支持。要定制对话框，可从CFontDialog派生一个类，提供一个定制模板，加入消息映射来扩展控件的消息通知，任何不处理的消息均应传递给基类。
无须定制钩子函数。
要了解有关使用CFontDialog的信息，可参阅联机文档“Visual C++程序员指南”中的“常用对话类”。
#include <afxdlgs.h>

CFontDialog类的成员

数据成员
m_cf 一个用于定制CFontDialog对象的结构

构造函数
CFontDialog | 构造一个CFontDialog对象操作
DoModal | 显示对话框并使用户选择
GetCurrentFont | 获取当前选定字体的名字
GetFaceName | 返回选择字体的字样名称
GetStyleName | 返回选择字体的风格名称
GetSize | 返回选择字体的点大小
GetColor | 返回选择字体的颜色
GetWeight | 返回选择字体的磅数
IsStrikeOut | 判断字体是否是突出
IsUnDerline | 判断字体是否是下划线
IsBold | 判断字体是否是黑体IsItalic判断字体是否是斜体


 CFontDialog::CFontDialog

CFontDialog(LPLOGFONT lplfInitial = NULL,
DWORD dwFlags = CF_EFFECTS | CF_SCREENFONTS,
CDC* pdcPrinter = NULL,
CWnd* pParentWnd = NULL
);

参数：
lplfInitial | 指向LOGFONT数据结构，使你可以设置某些字体特征。
dwFlags | 指定一个或多个选择字体标志，可用按位OR算符将一个或多行预设置组合起来。如果改变了m_cf.Flags结构，一定要使用按位OR来改变以保持缺省行为的完整性。要了解每个标志的细节，可参阅联机文档“Win32 SDK”中的CHOOSEFONT结构。
pdcPrinter | 指向打印机设备上下文。如果提供，则此参数指向选择字体的打印机设备上下文。
pParentWnd | 指向字体对话框的父窗口或所有者窗口。

说明：
构造一个CFontDialog对象，注意此构造函数自动填充CHOOSEFONT结构的成员，仅在希望一个字体对话框不同于缺省时才改变它们。

请参阅：CFontDialog::DoModal


 CFontDialog::DoModal

virtual int DoModal( );

返回值：
IDOK或IDCANCEL。如果返回IDCANCEL，则调用WindowsCommDlgExtendedError函数判断是否发生了错误。
IDOK或IDCANCEL是表明用户选择了OK还是Cancel按钮的常数。

说明：
调用此成员函数显示一个Windows通用字体对话框，并允许用户选择一种字体。
如果想用设置m_cf结构成员的方法初始化各种字体对话控件，则应在调用DoModal之前，及创建了对话对象之后进行。
如果DoModal返回IDOK，可用其它成员函数获得用户输入对话框的设置或信息。

请参阅：CDialog::DoModal, CFontDialog::CFontDialog


 CFontDialog::GetColor

COLORREF GetColor( )const;

返回值：选定字体的颜色。

说明：调用此成员函数获取选定字体的颜色。

请参阅：CFontDialog::GetCurrentFont


 CFontDialog::GetCurrentFont

void GetCurrentFont(LPLOGFONT lplf);

参数：
lplf 指向LOGFONT结构的指针。

说明：
调用此成员函数，将当前选定字体的特征分配给各个LOGFONT结构的成员。其它CFontDialog成员函数访问当前字体的单个特征。
如果在调用DoModal时调用此成员函数，则返回当前选定部分（用户见到的或已被改变的）。如果在DoModal之后调用此成员函数（仅当DoModal返回IDOK时），则返回用户实际选择的部分。

请参阅：CFontDialog::GetFaceName, CFontDialog::GetStyleName


 CFontDialog::GetFaceName

CString GetFaceName ( ) const;

返回值：
在CFontDialog对话框中选择字体的字样名称。

说明：调用此成员函数获取选择的字体字样名称。

请参阅：CFontDialog::GetCurrentFont, CFontDialog::GetStyleName


 CFontDialog::GetSize

int GetSize( )const;

返回值：字体大小，以0.1点表示。

说明：调用此成员函数获取选定字体的大小。

请参阅：CFontDialog::GetWeight, CFontDialog::GetCurrentFont


 CFontDialog::GetStyleName

CString GetStyleName( )const;

返回值：字体的风格名称。

说明：调用此成员函数获取选定字体的风格名称。

请参阅：CFontDialog::GetFaceName, CFontDialog::GetCurrentFont


 CFontDialog::GetWeight

int GetWeight( )const;

返回值：选定字体的磅数。

说明：
调用此成员函数获取选定字体的磅数。要了解有关字体磅数的更多信息，请参阅CFont::CreateFont。

请参阅：CFontDialog::GetCurrentFont, CFontDialog::IsBold


 CFontDialog::IsBold

BOOL IsBold( )const;

返回值：
如果选定字体具有黑体特征，则返回非零值，否则为0。

说明：调用此成员函数判断所选字体是否是黑体。

请参阅：CFontDialog::GetCurrentFont


 CFontDialog::IsItalic

BOOL IsItalic( )const;

返回值：
如果被选字体具有斜体特性，则返回非零值，否则为0。

说明：调用此成员函数判断所选字体是否是斜体。

请参阅：CFontDialog::GetCurrentFont


 CFontDialog::IsStrikeOut

BOOL IsStrikeOut ( )const;

返回值：
如果被选字体具有突出特征，则返回非零值，否则为0。

说明：
调用此成员函数判断显示的被选字体是否是突出。

请参阅：CFontDialog::GetCurrentFont


 CFontDialog::IsUnderline

BOOL IsUnderline( )const;

返回值：
如果被选字体具有下划线特征，则返回非零值，否则为0。

说明：调用此成员函数决定选定字体是否是有下划线。

请参阅：CFontDialog::GetCurrentFont


 CFontDialog::m_cf

说明：
保存对话框对象特征的结构。当构造一个CFontDialog对象后，可用m_cf改变对话框的某些特征，这些在DoModal成员函数调用之前进行。要了解有关此结构的更多信息，可参阅联机文档“Win32 SDK”中的CHOOSEFONT。


 CFontHolder

CFontHolder没有基类。
CFontHolder类封装了Windows字体对象和IFont接口，用于存储字体特性。使用此类为你的控件配置常用的字体特性。要了解有关创建这类特性的更多信息，可参阅联机文档“Visual C++程序员指南”中的“ActiveX控件：在ActiveX控件中使用字体”。
#include <afxctl.h>
请参阅：CPropExchange

CFontHolder类的成员

数据成员
m_pFont 指向CFontHolder对象的IFont接口的指针

构造/析构函数
CFontHolder 构造一个CFontHolder对象

操作
GetFontDispatch | 返回字体的IDispatch接口
GetDisplayString | 获取在包容器的特性浏览器中显示的字符串
GetFontHandle | 返回一个Windows字体句柄
InitializeFont | 初始化一个CFontHolder对象
ReleaseFont | 从IFont和IFontNotification接口中解除CFontHolder对象的连接
Select | 选择一个字体资源到设备上下文中
SetFont | 将CFontHolder对象连入一个IFont接口


 CFontHolder::CFontHolder

CFontHolder(LPPROPERTYNOTIFYSINR pNotify);

参数：
pNotify 指向字体的IPropertyNotifySink接口的指针。

说明：
构造一个CFontHolder对象，在使用之前必须调用Initialize来初始化其产生的对象。

请参阅：CFontHolder::InitializeFont


 CFontHolder::GetDisplayString

BOOL GetDisplayString(CString& strValue);

返回值：
如果获得字符串成功，则返回非零值，否则为0。

参数：
strValue 保留显示字符串CString的参考。

说明：获取可以在一个包容器特性浏览器中显示的字符串。


 CFontHolder::GetFontDispatch

LPFONTDISP GetFontDispatch( );

返回值：
指向CFontHolder对象的IFontDisp接口的指针。注意此函数调用时，必须对此接口指针调用IUnkown::Release。

说明：
调用此成员函数获取一个指向字体的发送接口的指针，在调用此成员函数前调用InitializeFont。

请参阅：CFontHolder::InitializeFont


 CFontHolder::GetFontHandle

HFONT GetFontHandle( );
HFONT GetFontHandle(long cyLogical, long cyHimeTric);

返回值：一个字体对象句柄，否则为NULL。

参数：
cyLogical | 逻辑单位的矩形高度，在此矩形中画出控件。
cyHimetric | MM_HIMETRIC单位的控件的高度。

说明：
调用此成员函数获取一个Windows字体句柄。
cyLogical和cyHimetric的比例用于计算显示大小，以逻辑单位计算，MM_HI-METRIC单元为字体的点大小：
显示大小 = ( cyLogical / cyHimetric )×字体大小。
无参数返回屏幕上的字体大小句柄。


 CFontHolder::InitializeFont

void InitilizeFont(const FONTDESC FAR* pFontDesc = NULL, LPDISPATCH pFontDispAmbient = NULL);

参数：
pFontDesc | 指向字体描述结构（FONTDESC）以指定字体特征。
pFontDispAmbient | 指向包容器环境字体特性。

说明：
初始化一个CFontHolder对象。
如果pFontDispAmbient不为NULL，CFontHolder对象被连接到一个被包容器环境字体特征使用的IFont接口的复制。
如果pFontDispAmbient为NULL，将创建一个新的字体对象，或从pFontDesc指向的字体描述，或在pFontDesc为NULL时，从一个缺省描述创建。
在创建了一个CFontHolder对象后调用此成员函数。

请参阅：CFontHolder::CFontHolder


 CFontHolder::ReleaseFont

void ReleaseFont( );

说明：
此函数解除一个CFontHolder对象与它的IFont接口的连接。

请参阅：CFontHolder::SetFont


 CFontHolder::Select

CFont* Select(CDC* pDC, long cyLogical, long cyHimetric);

返回值：指向被替换的字体。

参数：
pDC | 字体被选入的设备上下文。
cyLogical | 逻辑单位的矩形高度，在此矩形中画出控件。
cyHimetric | MM_HIMETRIC单位的控件的高度。

说明：
调用此函数，将控件中的字体选入指定的设备上下文。

请参阅：cyLogical和cyHimetric参数中的GetFontHandle。


 CFontHolder::SetFont

void SetFont(LPFONT pNewFont);

参数：
pNewFont 指向新的IFont接口。

说明：
释放任意存在的字体，并将CFontHolder对象连接到一个IFont接口。

请参阅：CFontHolder::ReleaseFont


 CFontHolder::m_pFont

说明：指向CFontHolder对象的IFont接口。

请参阅：CFontHolder::SetFont


 CFormView

CObject
└CCmdTarget
└CWnd
└CView
└CScrollView
└CFormView

CFormView类是用于窗体视图的基类。一个窗体视图是包含控件的基本视图，这些控件以对话模板资源为基础被放置好。如果在应用中想使用窗体，则可用CFormView。这些视图使用CScrollView的功能，支持滚动。
当使用MFC AppWizard构造一个应用时，可以将其视图类建于CFormView之上，使之成为一个基于窗体的应用。
也可以将新窗体插入基于文档视图的应用中，即使你的应用没有初始化支持窗体。当你插入一个新窗体时，Visual C++将增加这种支持。
MFC AppWizard和NewForm命令是创建基于窗体的应用的更好方法。如果想构造一个基于窗体的应用而不使用这些方法，可参阅“基于窗体的应用”。
#include <afxext.h>

请参阅：
CDialog, CScrollView, CView::OnUpdate, CView::OnInitialUpdate, CView::OnPrint, CWnd::OnPrint, CWnd::UpdateData, CScrollView::ReaizeParentToFit

CFormView类的成员

构造函数
CFormView 构造一个CFormView对象


 CFormView::CFormView

CFormView(LPCTSTR lpszTemplateName);
CFormView(UINT nIDTemplate);

参数：
lpszTemplateName | 一个以空终止符结束的字符串，此字符串为对话模板资源的名称。
nIDTemplate | 对话模板资源的ID值。

说明：
当构造一个CFormView派生类型的对象时，可请求构造函数构造一个视图对象并标识此视图基于的对话资源。可以用名字(把字符串作为一个变元传送到构造器)或ID来标识此资源（把未标识的整数作为一个变元传送）。
窗体视图窗口和子控件在调用CWnd::Create之前不可创建。CWnd::Create被框架调用作为文档和视图创建进程的一部分，由文档模板驱动。

注意：
你的派生类必须提供其构造函数。在构造函数中，可调用CFormView::CFormView构造函数，以资源名称或ID作为参数，如前面类概述中所述。

请参阅：CWnd::Create


 CFrameWnd

CFrameWnd类提供Windows单文档界面重叠或弹出式框架窗口，以及管理窗口的成员。

CObject
└CCmdTarget
└CWnd
└CFrameWnd

要为应用构造有用的框架窗口，可从CFrameWnd中派生类。向派生类加入成员变量，以便存储指定给应用的数据。在派生类中实现消息处理成员函数和消息映射，指定当消息指向窗口时的动作。
有三种方法可以构造一个框架窗口：
· | 用Create直接构造。
· | 用LoadFrame直接构造。
· | 用文档模板间接构造。
当调用Create和LoadFrame时，必须在堆中构造一个框架窗口（使用C++ New操作）。调用Create之前，也可以用AfxRegisteerWndClass全局函数登记一个窗口类来设置框架的图表和类风格。
使用Create成员函数传递框架构造参数作为立即参数。
LoadFrame需要比Create少的参数，而从资源中获取大多数缺省值，例如框架标题，图标、加速表、菜单。为了能被LoadFrame访问，所有的资源必须有相同的ID（例如，IDR_MAINFRAME）。
当一个CFrameWnd对象包含视图和文档时，它们由框架间接构造而不是直接由程序员直接构造。CDocTemplate对象将框架构造、包含视图的构造、视图与文档相连接等混在一起。CDocTemplate构造函数的参数指定了三种类（文档、框架、视图）的CRuntimeClass。当用户指定新框架时（例如，使用File New命令或MDI Windows New 命令），CRuntimeclass对象被框架用于动态建立新的框架。
一个从CFrameWnd中派生出的框架窗口类必须由DECLARE_DYNCREATE声明以使上面的RUNTIME_CLASS机制正确运行。
CFrameWnd包含缺省实现，用来执行Windows典型应用的主窗口的以下功能：
· | 一个CFrameWnd框架窗口追踪一个与Windows活动窗口无关的窗口或当前输入焦点。当框架再次被激活时，活动视图通过CView::OnActivateView得到通知。
· | 命令消息和一些常用框架通知消息由一个CFrameWnd框架发送到当前活动视图，包括CWnd中由OnSetFocus，OnHScroll，OnVScroll管理的消息。
· | 当前活动窗口（或在MDI框架中当前活动的MDI子框架窗口）可以判断框架窗口的标题，这种特征可以由关闭框架窗口的FMS_ADDTOTITLE风格位使之无效。
· | CFrameWnd框架窗口管理控件条、视图、框架窗口用户区的其它子窗口的位置。一个框架窗口也更新工具条和其它控件条按钮。CFrameWnd框架窗口也有缺省命令功能来打开和关闭工具条和状态条。
· | CFrameWnd框架窗口管理主菜单条。当一个弹出式菜单条显示时，框架 窗口使用UPDATE_COMMAND_UI机制来决定哪一菜单项目可用、无效、复选。当用户选择了菜单项目时，框架窗口用那个命令的消息字符串更新状态条。
· | CFrameWnd框架窗口有可选的加速器表格来自动译出键盘加速器。
· | CFrameWnd框架窗口有一个与LoadFrame一起设置的可选帮助ID，用于上下文敏感帮助。一个框架窗口是一个象上下文敏感帮助（SHIFT+F1）和打印预览模式那样的半模态的乐队。
· | CFrameWnd框架窗口可以打开一个从文件管理器拖出的文件并放置在框架窗口上。如果一个文件扩展名被登记并与应用有关，框架窗口应对动态数据交换（DDE）开放请求作出应答，此请求在用户从文件管理器中打开一个文件或调用ShellExecute函数时发生。
· | 如果框架窗口是应用的主窗口（即CWinThread::m_pMainWnd），当用户关闭应用时，框架窗口让用户存储改变过的文档（用OnClose和OnQueryEndSession）。
· | 如果框架窗口是应用的主窗口，框架窗口是运行WinHelp的上下文。关闭框架窗口时，如果它是为应用提供帮助，则会关闭WINHELP.EXE。
不要使用C++ delete操作析构一个框架窗口，而应该用CWnd::DestroyWindow。CFrameWnd实现的PostNcDestroy会在窗体被析构时删除C++对象。当用户关闭框架窗口时，缺省OnClose处理会调用DestroyWindow。
要了解有关CFrameWnd的更多信息，可参阅联机文档“Visual C++程序员指南”中的“框架窗口主题”。
#include <afxwin.h>
参阅：
CWnd, CMDIFrameWnd, CMIDChildWnd, CView, CDocTemplate, CRuntimeClass

CFrameWnd类成员

数据成员
m_bAutoMenuEnable | 自动控制使菜单项目可用或无效
rectDefault | 当构造一个CFrameWnd对象时传递此静态CRect作为参数，使Windows选择窗体的初始大小和位置

构造函数
CFrameWnd 构造一个CFrameWnd对象

初始化
Create | 调用以构造和初始化一个与CFrameWnd对象有关的Windows框架窗口
LoadFrame | 调用以从资源信息中动态构造一个框架窗口
LoadAccelTable | 装入一个加速器表格
LoadBarState | 复位控件条设置
SaveBarState | 存储控件条设置
ShowControlBar | 显示控件条
SetDockState | 在主窗口中停靠框架窗口
GetDockState | 获取框架窗口的停靠状态

操作
ActivateFrame | 使框架对用户可视并可用
InitialUpdateFrame在 | 调用的框架窗中使OnInitialUpdate成员函数属于所有视图
GetActiveFrame | 返回活动CFrameWnd对象
SetActiveView | 设置活动CView对象
GetActiveView | 返回活动CView对象
CreateView | 在框架中构造一个非CView派生的视图
GetActiveDocument | 返回活动CDowment对象
GetControlBar | 返回控件条
GetMessageString | 获得与命令ID相符的消息
IsTracking | 确定分隔条是否正在移动
SetMessageText | 设置标准状态条的文本
EnableDocking | 允许一个控件条停靠
DockControlBar | 停靠一个控件条
FloatControlBar | 浮动一个控件条
BeginModalState | 将框架窗口设置为模态
EndModalState | 结束框架窗口的模态状态，用BeginModalState使无效的窗口可用
InModalState | 返回一个表明框架窗口是否处于模态状态
ShowOwnedWindows | 显示所有CFrameWnd对象的后代窗口
RecalcLayout | 重新设置CFrameWnd对象的控件条的位置

可重载函数
OnCreateClient | 为框架构造一个用户窗口
OnSetPreviewMode | 设置应用的主框架成为或退出预打印模式
GetMessageBar | 返回一个属于框架窗口的状态条指针
NegotiateBorderSpace | 调整框架窗口中的边框空白

命令处理
OnContextHelp 处理相应项的SHIFT+F1帮助


 CFrameWnd::ActivateFrame

virtual void ActivateFrame (int nCmdShow = -1);

参数：
nCmdShow 指定传递到CWnd::ShowWindow的参数，缺省时此框架被显示并正确复位。

说明：
调用此成员函数激活并复位一个框架窗口以使之对用户可视、可用。此函数通常在一个无用户接口事件如DDE，OLE或其它将框架窗口或其内容显示给用户的事件之后调用。缺省实现激活框架并把它设置到Z-序的顶部，在需要时执行程序主框架窗口的上述操作。覆盖此成员函数来改变此框架激活的方式，可强制MDI子窗口最大化。加上恰当的功能，然后以显式的nCmdShow调用基类。


 CFrameWnd::BeginModalState

virtual void BeginModelState();

说明：
调用此成员函数来建一个框架窗口模态。
virtual void BeginModelState();


 CFrameWnd::CFrameWnd

CFrameWnd( )

说明：构造一个CFrameWnd对象，但不构造可视框架窗口。调用Create构造可视窗口。

请参阅：
CFrameWnd::CreateView, CFrameWnd::LoadFrame


 CFrameWnd::Create

BOOL Create(
LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle = WS_OVERLAPPEDWINDOW,
const RECT &rect = rectDefault,
CWnd* pParentWnd = NULL,
LPCTSTR lpszMenuName = NULL,
DWORD dwExStyle = 0,
CCreateContext* pContext = NULL
);

返回值：如果初始化成功，则返回非零值，否则为0。

参数：
lpszClassName | 指向一个用于命名Windows类的以空终止的字符串。类名可以是任何以AfxRegisterJWndClass全局函数登记或RegisterClassWindows函数登记的名。如果为NULL，使用预定义的缺省CFrameWnd属性。
lpszWindowName | 指向代表窗口名的以空终止的字符串，用作标题条的文本。
dwStyle | 指定窗口风格属性。如果想标题条自动显示窗口代表的文档名，则应包含FWS_ADDTOTITLE风格。
rect | 定义窗口大小和位置。rectDefault值使Windows为一个新窗口指定大小和位置。
pParentWnd | 指定框架窗口的父窗口，对最高层框架窗口来说应为NULL。
lpszMenuName | 指定与窗口一起使用的菜单资源名。如果菜单有一个整数ID而不是字符串ID，则使用MAKEINTRESOURCE。此参数可为NULL。
dwExStyle | 指定窗口扩展的风格属性。
pContext | 指向CCreateContext结构的指针。可为NULL。

说明：
分两步构造一个CFrameWnd对象。首先调用构造函数来构造CFrameWnd对象，然后调用Create来构造Windows框架窗口并把它附加给CFrameWnd对象，Create初始化窗口的类名、窗口名，登记它的风格、父窗口和相关菜单的缺省值。
使用LoadFrame而不用Create来从资源而不是指定其参数加载一个框架窗口。

请参阅：
CFrameWnd::CFrameWnd, CFrameWnd::LoadFrame, CCreateContext, CWnd::Create, CWnd::PreCreateWindow


 CFrameWnd::CreateView

CWnd* CreateView(CCreateConteat* pContext , UINT nID = AFX_IDW_PANE_FIRST);

返回值：如果成功，则指向一个CWnd对象，否则为NULL。

参数：
pContext | 定义视图和文档风格。
nID | 视图的ID值。

说明：
调用CreateView在一个框架内构造一个视图，此函数构造非CView派生的视图。调用后必须手工设置视图活动和可视，这些功能不是由CreateView自动执行的。
注意 MFC高级概念的示例COLLECT用CreateView获取Windows 95中正确的3D效果。


 CFrameWnd::DockControlBar

void DockControlBar(CControlBar* pBar, UINT nDockBarID=0, LPCRECT lpRect = NULL);

参数：
pBar | 指向将停靠的控件条。
nDockBarID决定框架窗口的哪一边用于停靠，可为0或以下之中的一个或多个：
· | AFX_IDW_DOCKBAR_TOP | 停靠到框架窗口的顶部。
· | AFX_IDW_DOCKBAR_BOTTOM | 停靠到框架窗口底部。
· | AFX_IDW_DOCKBAR_LEFT | 停靠到框架窗口左边。
· | AFX_IDW_DOCKBAR_RIGHT | 停靠到框架窗口右边。
如果为0，控件条可以在目标框架窗口中任意可停靠的地方停靠。
lpRect | 以屏幕坐标表示目标框架窗口非用户区中可被控件条停靠的位置。

说明：
使一个控件条停靠于框架窗。控件条可被停靠于框架窗口中由CControlBar::EnableDocking和CFrameWnd::EndbleDocking调用指定的一边，此边由nDock-BarID指定。

请参阅：CFrameWnd::FloatControlBar


 CFrameWnd::EnableDocking

void EnableDocking(DWORD dwDockStyle);

参数：
dwDockStyle 指定框架窗口的哪一边可作为控件条的停靠点，可为以下之中的一个或几个：
· | CBRS_ALIGN_TOP | 允许停靠到用户区的顶部。
· | CBRS_ALIGN_BOTTOM | 允许停靠到用户区底部。
· | CBRS_ALIGN_LEFT | 允许停靠到用户区左边。
· | CBRS_ALIGN_RIGHT | 允许停靠到用户区右边。
· | CBRS_ALIGN ANY | 允许停靠到用户区任意一边。

说明：
调用此成员函数使框架窗口中的可停靠控件条可用。缺省时，控件条会以下面顺序停靠于框架窗口中：顶部、底部、左部、右部。

请参阅：
CControlBar::EnableDocking, CFrameWnd::DockControlBar, CFrameWnd::FloatControlBar


 CFrameWnd::EndModalState

virtual void EndModalState( );

说明：
调用此成员函数将一个框架窗口由模态转为非模态。
EndModalState使任何由BeginModalState变为无效的窗口可用。


 CFrameWnd::FloatControlBar

CFrameWnd* FloatControlBar（CControlBar* pBar , CPoint point, DWORD dwStyle = CBRS_ALIGN_TOP）;

返回值：指向当前框架窗口的指针。

参数：
pBar | 指向浮动的控件条。
point | 指向以屏幕坐标表示的控件条的左上角位置。
dwStyle | 在控件条的新框架窗口中如何排列控件条（水平或垂直），可为以下值之一：
· | CBRS_ALIGN_TOP | 控件条垂直。
· | CBRS_ALIGN_BOTTOM | 控件条垂直。
· | CBRS_ALIGN_LEFT | 控件条水平。
· | CBRS_ALIGN_RIGHT | 控件条水平。
如果风格同时被指定为水平和垂直定位，则控件条定位为水平。

说明：
调用此成员函数使控件条不停靠于框架窗口。典型地，此动作在程序复位设置的开始时发生。
此函数在用户以释放鼠标左键以拖动控件条到一个不可停靠点时，由框架调用。

请参阅：CFrameWnd::DockControlBar


 CFrameWnd::GetActiveDocument

virtual CDocument* GetActiveDocument( );

返回值：指向当前CDocument，如果无当前文档，则返回NULL。

说明：获取一个指向附加给当前视图的当前CDocument。

请参阅：CFrameWnd::GetActiveView


 CFrameWnd::GetActiveFrame

virtual CFrameWnd* GetActiveFrame( );

返回值
指向活动的MDI子窗口。如果程序是一个SDI应用或MDI框架窗口没有活动文档，则返回this指针。

说明：
调用此成员函数获取一个指向MDI框架窗口的活动多文档界面（MDI）子窗口的指针。
如果没有活动MDI子窗口或应用是一个单文档界面（SDI），则强制返回this指针。

请参阅：
CFrameWnd::GetActiveView, CFrameWnd::GetActiveDocument, CMDIFrameWnd


 CFrameWnd::GetActiveView

CView* GetActiveView( )const;

返回值：指向当前CView的指针，如果无当前视图，则返回NULL。

说明：
调用此成员函数获取一个附加给框架窗口（CFrameWnd）的活动视图（如果有）指针。
此函数返回值在一个MDI主框架窗口（CMDIFrameWnd）时为NULL。
在一个MDI应用中，MDI主框架窗口没有与之相关的视图，相反，每个子视图（CMDIChildWnd）都有一个或几个与之相关的视图。MDI应用中的活动视图可先查找活动MDI子窗口，再查找这些子窗口的活动视图。活动MDI子窗口可由调用函数MDIGetActive或GetActiveFrame找到，示例如下：
CMDIFrameWnd* pFrame = (CMDIFrameWnd* )AfxGeteApp( )->m_pMainWnd;

// Get the active MDI child window .
CMDIChildWnd* pChild = (CMDIChildWnd* )pFrame->GetActiveFrame( );

// or CMDIChildWnd* pChild = pFrame->MDIGetsActive( );

// Get the active view attached to the active MDI child windows.
CMyView * pView = (CMyView * ) pChild->GetActiveView( );

请参阅：
CFrameWnd::SetActiveView, CFrameWnd::GetActiveDocument


 CFrameWnd::GetControlBar

CContrdBar* GetControlBar(UINT nID);

返回值：与ID相关联的控件条指针。

参数：
nID 控件条的ID值。

说明：
调用此成员函数获取对ID相关联的控件条的访问。
即使控件条浮动而不是框架的当前子窗口，此函数也可返回控件条。


 CFrameWnd::GetDockState

void GetDockState(CDockState&state)const;

参数：
state 包含框架窗口控件条的当前状态。

说明：
调用此成员函数存储CDockState对象中关于框架窗口控件条的状态信息。
可以用CDockState::SaveState或Serialize将CDockState的内容写入存储中。如果以后想将控件条复位为以前状态，可用CDockState::LoadState或Serialize加载状态，然后调用SetDockState来将当前状态应用到框架窗口的控件条中。

请参阅：
CFrameWnd::SetDockState, CDockState, CDockState::SaveState, CObject::Serialize


 CFrameWnd::GetMessageBar

virtual CWnd* GetMessageBar( );

返回值：指向状态条窗口的指针。

说明：调用成员函数获取一个状态条指针。


 CFrameWnd::GetMessageString

virtual void GetMessageString (UINT nID , CString&rMessage)const;

参数：
nID | 所需消息的资源ID。
rMessage | 放置消息的CString对象。

说明：
覆盖此函数为命令ID提供定制的字符串。缺省实现仅加载资源文件中由nID指定的字符串。此函数在状态条中的字符串需更新时，由框架调用。

请参阅：
CFrameWnd::SetMessageText


 CFrameWnd::InitialUpdateFrame

void InitialUpdateFrame(CDocument* pDoc , BOOL bMakeVisible);

参数：
pDoc | 指向与框架窗口相关联的文档。可为NULL。
bMakeVisible | 如果为TRUE，框架可以成为可视的和活动的。如果为FALSE，其后代不可视。

说明：
当用Create构造一个新框架后调用InitialUpdateFrame，这使框架窗口中的每一视图接收它们的OnInitialUpdate调用。如果当前无活动视图，框架窗口的基本视图被激活。基本视图是一个有AFX_IDW_PANE_FIRST子ID的视图。如果bMakeVisible为非0，则框架窗口为可视。如果bMakeVisible为0，框架窗口的当前焦点和可视状态不变。当使用框架的File New和File Open实现时，无须调用此成员函数。

请参阅：
CView::OnInitialUpdate, CFrameWnd::SetActiveView, CDocTemplate::CreateNewFrame


 CFrameWnd::InModalState

BOOL InModalState( )const;

返回值：如果是，则返回非零值，否则为0。

说明：调用此成员函数复选框架窗口是否是模态。


 CFrameWnd::IsTracking

BOOL IsTracking( )const;

返回值：如果分离在进行，则返回非零值，否则为0。

说明：调用此成员函数判断窗口中的分离条是否正在移动。


 CFrameWnd::LoadAccelTable

BOOL LoadAccelTable(LPCTSTR lpszResourceName);

返回值：如果加速器表正确加载，则返回非零值，否则为0。

参数：
lpszResourceName 指定加速器资源名，如果资源用整数ID标明，则使用MAKEINTRESOURCE。

说明：
加载指定加速器表，一次仅可加载一个表。
当应用终止时，加速器表装载的资源会自动释放。如果调用LoadFrame构造框架窗口，则框架与菜单和图标资源一起加载一个加速器表，这样连续调用此成员函数就是不必要的。

请参阅：
CFrameWnd::LoadFrame, ::LoadAccelerators


 CFrameWnd::LoadBarState

void LoadBarState(LPCTSTR lpszProFileName);

参数：
lpszProFileName 初始文件中的节或状态信息所在的Windows登记表中的键的名称。

说明：
调用此成员函数复位每个由框架窗口拥有的控件条的设置。此信息用SaveBarState写入初始文件。复位信息包括可视性、水平/垂直定位、停靠点和控件条位置。

请参阅：
CFrameWnd::SaveBarState, CWinApp::SetRegistryKey, CWinApp::m_pszProfileName


 CFrameWnd::LoadFrame

virtual BOOL LoadFrame(
UINT nIDResource,
DWORD dwDefaultStyle = WS_OVERLAPPEDWINDOW | FWS_ADDTOTITLE,
CWnd*pParentWnd = NULL,
CCreateContext* pContext = NULL
);

参数：
nIDResource | 与框架窗口有关的共享资源ID。
dwDefaultStyle | 框架的风格。如果想窗口的文档在标题条自动显示，则应包含FWS_ADDTOTITLE风格。
pParentWnd | 指向框架的父窗口的指针。
pContext | 指向CCreateContext结构，可为NULL。

说明：
分两步构造一个CFrameWnd对象。首先调用构造函数构造CFrameWnd对象，然后调用LoadFrame加载Windows框架窗口和相关资源，并将框架窗口附加给CFrameWnd对象。
当希望指定所有框架窗口的构造参数时，应该用Create成员函数而不用LoadFrame。
当用文档模板对象构造一个框架窗口时，框架调用LoadFrame。
框架用pContext参数指定要与框架窗口相连的对象，包含任何包容视图对象。可以在调用LoadFrame时设置pContext为NULL。

请参阅：
CDocTemplate, CFrameWnd::Create, CFrameWnd::CFrameWnd, CWnd::PreCreateWindow


 CFrameWnd::NegotiateBorderSpace

virtual BOOL NegotiateBorderSpace(UINT nBorderCmd, LPRECT lpRectBorder);

返回值：如果成功，则返回非零值，否则为0。

参数：
nBorderCmd | 包含enum BorderCmd中的某个值： ·borderGet = 1 ·borderRequest = 2 ·borderSet = 3
lpRectBorder | 指向一个RECT结构或一个CRect对象，指定边界的坐标。

说明：
调用此成员函数在OLE激活的框架窗口中确定边界空白，此成员函数是确定OLE边界空白的一个实现。

请参阅：IOleInPlaceUIWindow


 CFrameWnd::OnContextHelp

afx_msg void OnContextHelp( );

说明：
为使上下文敏感帮助可用，必须加入
ON_COMMAND(ID_CONTEXT_HELP,OnContextHelp)
到CFrameWnd类消息映射，同时也加入一个加速器表入口，典型地用SHIFT+F1使此函数可用。
如果应用是一个OLE包容器，OnContextHelp把框架窗口中包含的项目对象加入Help模式。光标变为箭头和一个问号，用户可以移动鼠标光标并按左键选择一个对话框、窗口、菜单或命令钮。此成员函数对光标下的对象的Help上下文调用Windows函数WinHelp。

请参阅：
CWinApp::OnHelp, CWinApp::WinHelp


 CFrameWnd::OnCreateClient

virtual BOOL OnCreateClient(LPCREATESTRUCT lpcs,CCreateContext*pContext);

返回值：如果成功，则返回非零值，否则为0。

参数：
lpcs | 指向Windows CREATESTRUCT结构对象的指针。
pContext | 指向CCreateContext结构的指针。

说明：
执行OnCreate时由框架调用。不用调用此成员函数。
缺省实现是从pContext提供的信息构造一个CView对象（如果可能）。
覆盖此函数，可覆盖CCreateContext对象传递的参数或改变框架窗口的主客户区控件的构造方式。你可以覆盖的CCreateContext 成员在CCreateContext类中有描述。

注意 不要改变CREATESTRUCT结构传递的值。它们仅用于传递信息。如果想覆盖初始窗口矩形，则可覆盖CWnd的成员函数PreCreateWindows。


 CFrameWnd::OnSetPreviewMode

virtual void OnSetPreviewMode(BOOL bPreview,CPrintPreviewState*pModeStuff);

参数：
bPreview | 指定是否将应用设置为预打印模式。设置为TRUE表示预打印模式，设置为FALSE表示取消预打印模式。
pModeStuff | 指向CPrintPreviewState结构的指针。

说明：
调用此成员函数设置应用的主框架窗口是或不是预打印模式。
缺省实现是使用所有标准工具条无效、主菜单隐藏、主客户窗口隐藏，这让MDI框架窗口转化为临时的SDI框架窗口。
覆盖此函数，可在预打印时隐藏和显示控件条和其它框架窗口成分。在覆盖函数中调用基类实现。


 CFrameWnd::RecalcLayout

virtual void RecalcLayout（BOOL bNotify = TRUE）;

参数：
bNotify 决定活动的项目是否接收布局改变通知。如果为TRUE，则此项被通知，否则不通知。

说明：
当标准控件条正在开／关或框架窗口重新设置大小时，由框架调用。此成员函数的缺省实现调用CWnd的成员函数RepositionBars来在框架和主客户窗口中重新定位各种控件条，主客户窗口通常是CView或MDICLIENT。
覆盖此函数，在框架窗口设计改变时控制外观形式和动作。例如在使控件条开或闭或加入另一个控件条时调用它。

请参阅：CWnd::RepositionBars


 CFrameWnd::SaveBarState

void SaveBarState(LPCTSTR lpszProFileName)const;

参数：
lpszProFileName 初始文件中的节或状态信息所在的Windows登记表中的键的名称。

说明：
调用此成员函数复位每个由框架窗口拥有的控件条的设置。此信息用SaveBarState写入初始文件。复位信息包括可视性、水平/垂直定位、停靠点和控件条位置。

请参阅：
CFrameWnd::LoadBarState, CWinApp::SetRegistryKey, CWinApp::m_pszProfileName


 CFrameWnd::SetActiveView

void SetActiveView(CView* pViewNew,BOOL bNotify = TRUE);

参数：
pViewNew | 指向CView对象，如果无活动视图，则为NULL。
bNotify | 指定视图是否被通知激活。如果为TRUE，则从新视图调用OnActiveView；如果为FALSE，则不会。

说明：
调用此成员函数设置活动视图。当用户在框架窗口中改变焦点时，框架会调用此成员函数。你可以强制调用SetActiveView改变指定视图的焦点。

请参阅：
CFrameWnd::GetActiveView, CView::OnActivateView, CFrameWnd::GetActiveDocument


 CFrameWnd::SetDockState

void SetDockState(const CDockState&state);

参数：
state 把存储的状态设置给框架窗口的控件条。

说明：
调用此成员函数将CDockState对象中存放的状态应用到框架窗口的控件条。要复位控件条的当前状态，可以用CDockState::LoadState或Serialize加载存储的状态，然后用SetDockState来将它用于框架窗口控件条。当前状态用GetDockState存放在CDockState对象中。

请参阅：
CFrameWnd::GetDockState, CDockState, CDockState::LoadState, CObject::Serialize


 CFrameWnd::SetMessageText

void SetMessageText(LPCTSTR lpszText);
void SetMessageText(UINT nID);

参数：
lpszText | 指向将被设置到状态条的字符串。
nID | 将被设置到状态条上的字符串资源的ID。

说明：
调用此成员函数将一个字符串放在ID为0的状态条上，这是典型的最左边最长的状态条面板。

请参阅：CStatusBar


 CFrameWnd::ShowControlBar

void ShowControlBar(CControlBar* pBar,BOOL bShow,BOOL bDelay);

参数：
pBar | 指向将显示或隐含的控件条。
bShow | 如果为TRUE，则指定控件条将被显示；如果为FALSE，则隐藏。
bDelay | 如果为TRUE，则延迟显示控件条；如果为FALSE，则立即显示。

说明：调用此成员函数显示或隐藏一个控件条。


 CFrameWnd::ShowOwnedWindows

void ShowOwnedWindows(BOOL bShow);

参数：
bShow 指定拥有的窗口显示或隐藏。

说明：调用此成员函数显示或隐藏所有CFrameWnd对象的后代窗口。


 CFrameWnd::m_bAutoMenuEnable

说明：
当此成员是可用的（缺省），用户下拉一个菜单时，没有ON_COMMAND或ON_UPDATE_COMMAND_UI处理程序的菜单项目将被自动设置为无效。
具有ON_COMMAND处理程序而无ON_UPDATE_COMMAND_UI处理程序的菜单项目将被自动设置为可用。
当数据成员被设置时，菜单条与工具条按钮一样的方式被可用。
此数据成员简化了基于当前选择的最优命令的实现，并减少为可用与无效菜单项目编写ON_UPDATE_COMMAND_UI处理程序的应用需求。

请参阅：CCmdUI, CCmdTarget


 CFrameWnd::rectDefault

说明：
当构造一个窗口时，传递CRect静态作为参数，使Windows选择窗口初始大小和位置。


 CFtpConnection

CObject
└CInternetConnection
└CFtpConnection

MFC类FtpConnection管理与Internet服务器的FTP连接并允许直接操纵服务器中的目录和文件。FTP是由MFC WinInet类识别的三种Internet服务器之一。
为了与FTP Internet服务器通讯，必须先创建一个CInternetSession实例，然后创建CFtpConnection对象。创建CFtpConnection对象不采用直接方式，而是调用CInternetSession::GetFtpConnertion来创建并返回一个指向它的指针。
要了解CInternetSession与其它MFC Internet类共同工作的情况，可参阅联机文档“Visual C++程序员指南”中的“用WinInet编写Internet程序”。要了解它与其它两种支持服务HTTP和Gopher服务器的通讯，请参阅CHttpConnection和CGopherConnection类。
#include <afxinet.h>
请参阅：CInternetConnection, CInternetSession

CFtpConnection类的成员

构造函数
CFtpConnection 构造一个CFtpConnection对象

操作
SetCurrentDirectory | 设置当前FTP目录
GetCurrentDirectory | 获取此次连接的当前目录
GetCurrentDirectoryAsURL | 获取作为URL的此次连接的当前目录
RemoveDirectory | 从服务器移去指定目录
CreateDirectory | 在服务器上构造一个目录
Rename | 将服务器上的文件改名
Remove | 从服务器上移去一个文件
PutFile | 将一个文件放到服务器上
GetFile | 从连接的服务器上获取一个文件
OpenFile | 在连接的服务器上打开一个文件
Close | 关闭与服务器的连接


 CFtpConnection::CFtpConnection

CFtpConnection( CInternetSession* pSession,
HINTERNET hConnected,
LPCTSTR pstrServer,
DWORD_PTR dwContext
);

CFtpConnection( CInternetSession* pSession,
LPCTSTR pstrServer,
LPCTSTR pstrUserName = NULL,
LPCTSTR pstrPassword = NULL,
DWORD_PTR dwContext = 0,
INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER,
BOOL bPassive = FALSE
);

参数：
pSession | 相关联的CInternetSession对象指针。
hConnected | 当前网络会议的Windows句柄。
pstrServer | 包含FTP服务器名称的字符串指针。
dwContext操作的设备上下文标识符。DwContext识别由CInternetSession::OnStatusCallback返回的操作状况信息。
默认设置为1；但你也可以为操作分配一个特定的设备上下文ID。该对象和其所有工作将和这个设备场景ID相关联。
pstrUserName | 指向一个NULL结尾的字串，指定了要登陆的用户名称。若为NULL，默认为匿名。
pstrPassword一个NULL结尾的字串指针，指定了要登陆的用户密码。若pstrPassword和pstrUserName都为NULL，默认匿名密码为该用户的email名称。若pstrPassword为NULL(或一个空字符串)，而pstrUserName不是NULL，则使用一个空密码。
下表描述四种pstrUserName和pstrPassword的可能设置产生的行为：
pstrUserName | pstrPassword | 发送到FTP服务器的用户名 | 发送到FTP服务器的密码
NULL或" " | NULL或" " | "anonymous" | 用户的email名称
非NULL字符串 | NULL或" " | pstrUserName | " "
NULL | 非NULL字符串 | ERROR | ERROR
非NULL字符串 | 非NULL字符串 | pstrUserName | pstrPassword

nPort | 服务器上使用的TCP/IP端口的数量。
bPassive | 指定该FTP会议是被动还是主动模式。若设为TRUE，则将Win32 API的dwFlag设置为INTERNET_FLAG_PASSIVE。

说明：
构造一个CFtpConnection对象。不可直接构造一个CFtpConnection对象，而是调用CInternetSession::GetFtpConnection来创建。

请参阅：
CInternetSession::GetFtpConnection, CFtpFileFind, CGopherConnection, CHttpConnection, CInternetConnection


 CFtpConnection::Close

virtual void Close( );

说明：
关闭与服务器的连接，连接会由CFtpConnection对象的析构程序所关闭，但你必须显式关闭连接而避免诊断信息。

请参阅：
CFtpFileFind, CGopherConnection, CHttpConnection, CInternetConnection


 CFtpConnection::CreateDirectory

BOOL CreateDirectory(LPCTSTR pstrDirName);

返回值：
如果成功，则返回非零值，否则为0。在调用失败时，调用Windows函数GetLastError来判断错误原因。

参数：
pstrDirName 指向包含将创建的目录名的字符串。

说明：
调用此成员函数在连接服务器上创建一个目录。
使用GetCurrentDirectory来判断当前与服务器连接的工作目录，不要假设远程系统把你与根目录相连接。
pstrDirName可为部分或完整的与当前目录相关的可用文件名。目录分隔可以使用反斜线（\）和斜线（/）。使用之前，CreateDirectory将目录名分隔符转化为恰当的字符。

请参阅：CInternetConnection


 CFtpConnection::GetCurrentDirectory

BOOL GetCurrentDirectory(CString& strDirName) const;
BOOL GetCurrentDirectory(LPTSTR pstrDirName, LPDWORD lpdwLen) const;

返回值：
如果成功，则返回非零值，否则为0。如果失败，则调用Win32函数GetLastError判断出错原因。

参数：
strDirName | 接收目录名的字符串参考。
pstrDirName | 接收目录名的字符串指针。
lpdwLen指向一个DWORD，此双字包含下列信息：
入口处 | pstrDirName指向的缓冲区大小
返回时 | 存放在pstrDirName中的字符数。如果成员函数失败并返回ERROR_INSUFFICIENT_BUFFER，则lpdwLen包含应用必须为接收字符串分配的字节数

说明：
调用此成员函数获取当前目录名。要获取一个作为URL的目录名，可调用GetCurrentDirectoryAsURL。
参数pstrDirName或strDirName可为部分或完整的当前目录的可用文件名。目录分隔符可以使用及斜线（\）和斜线（/），使用之前，CreateDirectory将目录名分隔符转化为适当的字符。

请参阅：
CFtpConnection::GetCurrentDirectoryAsURL, CInternetConnection


 CFtpConnection::GetCurrentDirectoryAsURL

BOOL GetCurrentDirectoryAsURL(CString& strDirName) const;
BOOL GetCurrentDirectoryAsURL(LPCTSTR pstrDirName,LPDWORD lpdwLen) const;

返回值：
如果成功，则返回非零值，否则为0。如果失败，则调用Win32函数GetLastError返回出错原因。

参数：
strDirName | 接收目录名的字符串参考。
pstrDirName | 指向接收目录名的字符串的指针。
lpdwLen指向DWORD，此双字节包含以下的更多信息。
入口处 | pstrDirName指向的缓冲区大小。
返回时 | 存放在pstrDirName中的字符数。如果成员函数失败并返回ERROR_INSUFFICIENT_BUFFER，则lpdwLen包含应用必须为接收字符串分配的字节数。

说明：
调用此成员函数获取一个作为URL的当前目录名，GetCurrentDirectoryAsURL与GetCurrentDirectory功能相同。
参数strDirName可为部分或完整的与当前目录相关的可用文件名。目录分隔符可为反斜线（\）和斜线（/），使用之前，GetCurrentDirectoryAsURL将目录名分隔符转化为适当的字符。

请参阅：
CFtpConnection::GetCurrentDirectory, CInternetConnection


 CFtpConnection::GetFile

BOOL GetFile(LPCTSTR pstrRemoteFile,
LPCTSTR pstrLocalFile,
BOOL bFailIfExists = TRUE,
DWORD dwAttributes = FILE_ATTRIBUTE_NORMAL,
DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY,
DWORD dwContext = 1
);

返回值：
如果成功，则返回非零值，否则为0。如果失败，则调用Win32函数GetLastError返回出错原因。

参数：
pstrRemoteFile | 指向以空终止符结束的字符串，包含从FTP服务器获取的文件名。
pstrLocalFile | 指向以空终止符结束的字符串，包含在本地系统创建的文件名。
bFailIfExists | 说明文件名是否被已存在的文件使用。如果本地文件名已存在并且参数为TRUE，则GetFile失败。否则GetFile会删除已存在的文件的拷贝。
dwAttributes指定文件属性，可为以下FILE_ATTRIBUTE_* 标记的组合：
· | FILE_ATTRIBUTE_ARCHIVE | 文件为档案文件。应用使用此属性标明文件可以备份和移动。
· | FILE_ATTRIBUTE_COMPRESSED | 文件或目录为压缩。对文件来说，表明文件中的所有数据都是压缩的；如果为目录，表示新建文件和子目录缺省为压缩的。
· | FILE_ATTRIBUTE_DIRECTORY | 文件为目录。
· | FILE_ATTRIBUTE_NORMAL | 文件没有其它属性设置，此属性仅可单独使用，任何其它属性覆盖此属性。
· | FILE_ATTRIBUTE_HIDDEN | 文件隐藏，不包含在通常的目录列表。
· | FILE_ATTRIBUTE_READONLY | 文件只读，应用可读出文件但不可写、删文件。
· | FILE_ATTRIBUTE_SYSTEM | 文件是操作系统的一部分或为操作系统专用。
· | FILE_ATTRIBUTE_TEMPORARY | 文件用于临时存储。只有在完全必要时应用才写文件，大多数文件数据存储于存储区而不存入介质，因为文件将很快被删除。
dwFlags | 指定传输发生的条件，此参数可以为联机文档“平台SDK在线”中的FtpGetFile中描述的任何dwFlags值。
dwContext | 表示获取文件的上下文标识符，请参阅说明，了解有关dwContext的更多信息。

说明：
调用此成员函数从FTP服务器中获得一个文件并把它存到本地机器。GetFile是一个高级例程，处理所有从FTP服务器读文件存入本地相关的操作。应用如果只想获取文件数据或在文件传输中加强控制，则应使用OpenFile和CInternetFile::Read。
如果dwFlags是FILE_TRANSFER_TYPE_ASCII，文件数据翻译器将控件和格式化字符转换到Windows中。缺省转换为二进制，下载文件与服务器上的存储方式一样。
pstrRemoteFile和pstrLocalFile可为与当前目录相关的部分或全部可用文件名。文件名分隔符可为反斜线（\）或斜线（/），使用之前GetFile把它转化为适当的字符。
覆盖缺省的dwContext可设置选择值。此上下文标识符与由CInternetSession对象创建的CFtpConnection对象的指定操作相关联，值返回给Cinternet-Session::OnStatusCallback，提供被标识的操作状态。要了解更多信息，可参阅联机文档“Visual C++程序员指南”中的“Internet初步：WinInet”。

请参阅：CInternetConnection


 CFtpConnection::OpenFile

CInternetFile* OpenFile(LPCTSTR pstrFileName,
DWORD dwAccess = GENERIC_READ,
DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY,
DWORD dwContext= 1
);

返回值：指向CInternet对象的指针。

参数：
pstrFileName | 包含要打开文件的文件名的字符串指针。
dwAccess | 判断文件的访问方式。可以为GENERIC_READ或GENERIC_WRITE，但不能同时使用。
dwFlags指定连续转化发生的条件，可为以下FTP_TRANSFER_* 常数：
· | FTP_TRANSFER_TYPE_ASCII | 文件转换采用FTP ASCII（类型A）转换方法，将控件和格式化信息转化为本地等同信息。
· | FTP_TRANSFER_TYPE_BINARY | 文件数据转换采用FTP的图象（类型I）转换方式，文件数据不加转变地以存在方式转换，这是缺省的方法。
dwContext | 打开文件的上下文标识符。请参阅说明，了解有关dwContext的更多信息。

说明：
调用此成员函数打开一个FTP服务器上的文件供读或写。OpenFile可在下列情况下使用：
· | 一个应用需要在FTP服务器上发送或创建的文件数据，但数据不在一个本地文件中。当OpenFile打开一个文件时，应用使用CInternetFile::Write将FTP文件数据发送给服务器。
· | 一个应用必须从服务器上获取一个文件并放到应用控制的存储区而不是写到磁盘。当用OpenFile打开文件后，应用使用CInternetFile::Read。
· | 一个应用需要一个文件转换高级控件，例如，应用可能显示一个进程控件，表示下载文件的文件转换进程的状态。
调用OpenFile后到调用Close之前，应用只可调用CInternetFile::Read，CInternetFile::Write或CFtpFileFind::FindFile。在同样的FTP会话中调用其它FTP函数会失败，并将出错代码设置到FTP_ETRANSFER_IN_PROGRESS。
pstrFileName参数与当前目录相关的部分或全部可用文件名，文件名分隔符可为反斜线（\）或斜线（/），使用之前OpenFile把它转化为适当的字符。
覆盖缺省的dwContext，设置选择值的标识符。此标识符与由CInternetSession对象创建的CFtpConnection对象的指定操作相关联，值返回到Cinternet-Session::OnStatusCallback，以提供标识的操作的状态。要了解有关上下文标识符的更多信息，可参阅联机文档“Visual C++程序员指南”中的“Internet初步：WinInet”。

请参阅：
CInternetConnection, CFtpConnection::GetFile, CGopherConnection::OpenFile, CInternetFile::Write, CInternetFile::Read


 CFtpConnection::PutFile

BOOL PutFile(LPCTSTR pstrLocalFile,
LPCTSTR pstrRemoteFile,
DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY,
DWORD dwContext = 1
);

返回值：
如果成功，则返回非零值，否则为0。如果失败，则调用Win32函数GetLastError返回出错原因。

参数：
pstrLocalFile | 指向包含从本地系统发送的文件名字符串。
pstrRemoteFile | 指向将在FTP服务器上创建的文件的文件名字符串。
dwFlags | 指定转换文件发生时的条件，可为OpenFile中描述的常数FTP_TRANSFER_*的任意项。
dwContext | 放置文件的上下文标识符，请参阅说明，了解有关dwContext的更多信息。

说明：
调用此成员函数在FTP服务器上存放一个文件。
PutFile是一个高级例程，处理所有在一个FTP服务器上存放文件的相关操作。如果应用仅发送数据或在文件转换中需要加强控制，应使用OpenFile和CInternetFile::Write。覆盖缺省的dwContext，设置选择值的标识符。此标识符与由CInternetSession对象创建的CFtpConnection对象的指定操作相关联，值返回到Cinternet-Session::OnStatusCallback，以提供标识的操作的状态。要了解有关上下文标识符的更多信息，可参阅联机文档“Visual C++程序员指南”中的“Internet初步：WinInet”。

请参阅：CInternetSession


 CFtpConnection::Remove

BOOL Remove(LPCTSTR pstrFileName);

返回值：
如果成功，则返回非零值，否则为0。如果失败，则调用Win32函数GetLastError返回出错原因。

参数：
pstrFileName 指向包含移去的文件名的字符串指针。

说明：
调用此成员函数从连接的服务器上删除指定文件。
pstrFileName可为与当前目录有关的部分或全部可用文件名，目录分隔符可为反斜线（\）或斜线（/），使用之前，Remove函数把它转化为适当的字符。

请参阅：CInternetConnection


 CFtpConnection::RemoveDirectory

BOOL RemoveDirectory(LPCTSTR pstrDirName);

返回值：
如果成功，则返回非零值，否则为0。如果失败，则调用Win32函数GetLastError返回出错原因。

参数：
pstrDirName 将被移去的目录的字符串指针。

说明：
调用此成员函数从连接的服务器移去指定目录。
用GetCurrentDirectory判断服务器当前工作目录，不要假设远程系统将你与根目录相连接。
pstrDirName可为与当前目录相关的部分或全部可用文件名，目录分隔符可为反斜线（\）或斜线（/），使用前，RemoveDirectory把它转化为适当的字符。

请参阅：CInternetConnection


 CFtpConnection::Rename

BOOL Rename(LPCTSTR pstrExisting,LPCTSTR pstrNew);

返回值：
如果成功，则返回非零值，否则为0。如果失败，则调用Win32函数GetLastError返回出错原因。

参数：
pstrExisting | 指向将被改名的文件名字符串。
pstrNew | 指向新文件名字符串。

说明：
调用此成员函数改变连接的服务器中指定的文件名。
pstrDirName与pstrNew参数可为与当前目录有关的部分或全部可用文件名，目录分隔符可为反斜线（\）或斜线（/），使用之前，Rename把它转化为适当的字符。

请参阅：CInternetConnection


 CFtpConnection::SetCurrentDirectory

BOOL SetCurrentDirectory(LPCTSTR pstrDirName);

返回值：
如果成功，则返回非零值，否则为0。如果失败，则调用Win32函数GetLastError返回出错原因。

参数：
pstrDirName 指向目录名字符串。

说明：
调用此成员函数改变FTP服务器名。
pstrDirName参数可为与当前目录相关的部分或全部可用文件名，目录分隔符可为反斜线（\）或斜线（/），使用之前SetCurrentDirectory把它转化为适当的字符。
用GetCurrentDirectory判断服务器的当前工作目录，不要假设远程系统将你与根目录相连接。

请参阅：CInternetConnection


 CFtpFileFind

CObject
└CFileFind
└CFtpFileFind

CFtpFileFind类帮助FTP服务器查找Internet文件。CFtpFileFind包括成员函数，有开始查找、定位文件、返回URL或其它文件描述信息。其它为设计Internet和局部文件查找的类包括CGopherFileFind和CFileFind。与CFtpFileFind一起，这些类提供给用户无缝机制，查找指定文件而不论服务器协议和文件类型（本地机器或远程服务器）。注意HTTP服务器没有查找的MFC类，因为HTTP不支持查找所需的目录文件操作。要了解更多关于使用CFtpFileFind及其它WinInet类的信息，请参阅“Visual C++程序员指南”中的“用WinInet设计Internet程序”。
#include <afxinet.h>

请参阅：
CGopherFileFind, CInternetFile, CGopherFile, CHttpFile

CFtpFileFind类的成员

构造函数
CFtpFileFind 构造一个CFtpFileFind对象

操作
FindFile | 在FTP服务器上查找一个文件
FindNextFile | 从以前调用FindFile处开始继续查找下一个文件
GetFileURL | 获取找到文件的URL，包括路径


 CFtpFileFind::CFtpFileFind

CFtpFileFind( CFtpConnection* pConnection, DWORD dwContext = 1 );

参数：
pConnection | 指向CFtpConnection对象的指针。可通过调用CInternetSession::GetFtpConnection获取一个FTP连接。
dwContext | CFtpFileFind对象的上下文标识符，请参阅说明部分，了解更多有关此参数的信息。

说明：
调用此成员函数构造一个CFtpFileFind对象。
dwContext的缺省值由MFC从创建CFtpFileFind对象的CInternetSession对象传到CFtpFileFind对象。可以覆盖此函数设置你的选择值，此标识由CInternetSession::OnStatusCallback返回，提供它标识的对象的状态。要了解有关dwContext标识符的更多信息，可参阅联机文档“Visual C++程序员指南”中的“Internet初步：WinInet”。

请参阅：CGopherFileFind, CFileFind


 CFtpFileFind::FindFile

virtual BOOL FindFile(LPCTSTR pstrName = NULL, DWORD dwFlags = INTERNET_FLAGS_RELOAD );

返回值：
如果成功，则返回非零值，否则为0。要了解扩展的错误信息，可调用Win32函数GetLastError。

参数：
pstrName 指向查找的文件名字符串的指针。如果为NULL，则执行通配符（*）形式的查找。
dwFlags此标志描述如何处理此会话。此标志可为以下值的组合（用按位OR操作（|））：
· | INTERNET_FLAG_RELOAD | 即使在本地缓存也从网络中获取数据，这是缺省标志。
· | INTERNET_FLAG_DONT_CACHE | 不缓存数据，本地或网关都不缓存。
· | INTERNET_FLAG_RAW_DATA | 覆盖此缺省值，返回原始数据 (FTP的WIN32_FIND-DATA结构)。
· | INTERNET_FLAG_SECURE | 用安全插座层或PCT实现网络安全传输。此标志仅对HTTP请求可用。
· | INTERNET_FLAG_EXISTING_CONNECT | 如果可能，新的FindFile请求重用服务器已有的连接，而不对每个请求创建新会话。

说明：
调用此成员函数查找一个FTP文件。
当调用FindFile获取第一个FTP文件后，可调用FindNextFile获取下一个FTP文件。

请参阅：CFtpFileFind::FindNextFile, CFileFind


 CFtpFileFind::FindNextFile

virtual BOOL FindNextFile( );

返回值：
如果还有文件，则返回非零值；如果文件为最后一个，则返回0。FindFile和Fi-ndNextFile的以前调用均返回非零值。要了解扩展的错误信息，可调用Win32函数GetLastError。

说明：
调用此成员函数从FindFile开始继续查找下一个文件。必须至少调用此成员函数一次后，才可以调用某一个属性函数。
FindNextFile包含Win32函数FindNextFile。

请参阅：CFileFind


 CFtpFileFind::GetFileURL

CString GetFileURL( ) const;

返回值：URL的文件和路径。

说明：
调用此成员函数获取指定文件的URL。
GetFileURL与成员函数CFileFind::GetFilePath类似，只是它返回ftp://moose/dir/File.txt形式的URL。

请参阅：CFtpFileFind::FindFile, CFileFind


 CGdiObject

CObject
└CGdiObject

CGdiObject类为各种Windows图形设备接口（GDI）对象，如位图、区域、画刷、画笔、调色板、字体等提供了一些基本类。我们不会直接构造一个CGdiObject对象，而是使用某一个派生类如CPen或CBrush创建。
要了解有关CGdiObject的更多信息，可参阅联机文档“Visual C++程序员指南”中的“图形对象”。
#include <afxwin.h>

请参阅：CBitmap, CBrush, CFont, CPalette, CPen, CRgn

CGdiObject类的成员

数据成员
m_hObject 包含附加给对象的HBITMAP，HPALETTE，HRGN，HBRUSH，HPEN或HFONT的句柄

构造函数
CGdiObject 构造一个CGdiObject对象

操作
GetSafeHandle | 如果this不是NULL，则返回m_hObject，否则返回NULL
FromHandle | 返回指向给定了Windows GDI对象句柄的CGdiObject对象指针
Attach | 将一个Windows GDI对象附加给一个CGdiObject对象
Detach | 将一个Windows GDI对象从CGdiObject对象上拆下，并返回Windows GDI对象的句柄
DeleteObject | 从内存中删除附加给CGdiObject的Windows GDI对象，释放与此对象相关的系统存储空间
DeleteTempMap | 删去所有FromHandle建立的临时CGdiObject对象
GetObject | 把描述了将Windows GDI对象附加给CGdiObject对象的数据填充到缓冲区
CreateStockObject | 获取一个Windows标准的预定义画笔、画刷或字体的句柄
UnrealizeObject | 重新设置一个画刷或重新设置一个逻辑调色板
GetObjectType | 获取GDI对象的类型


 CGdiObject::Attach

BOOL Attach(HGDIOBI hobject);

返回值：如果附加成功，则返回非零值，否则为0。

参数：
hObject 一个Windows GDI对象（如HPEN，HBRUSH）的句柄。

说明：将一个Windows GDI对象附加给CGdiObject对象。

请参阅：CGdiObject::Detach


 CGdiObject::CGdiObject

CGdiObject( );

说明：
构造一个CGdiObject对象。我们从不直接构造一个CGdiObject，而是由派生类构造一个对象，例如CPen或CBrush。

请参阅：CPen, CBrush, CFont, CBitmap, CRgn, CPalette


 CGdiObject::CreateStockObject

BOOL CreateStockObject(int nIndex);

返回值：如果成功，则返回非零值，否则为0。

参数：
nIndex 一个定义了标准对象类的常量，请参阅联机文档“Win32 SDK”中GetStockObject的参数fnObject的描述。

说明：
获取一个Windows标准的预定义画笔、画刷或字体的句柄，以将一个GDI对象附加给一个CGdiObject对象。可与某个派生类同时调用此成员函数，应使派生类与Windows GDI对象的类型相对应，例如，CPen是标准画笔。

请参阅：
CPen::CPen, CBrush::CBrush, CFont::CFont, CPalette::CPalette


 CGdiObject::DeleteObject

BOOL DeleteObject( );

返回值：如果GDI对象被成功删除，则返回非零值，否则为0。

说明：
通过释放附加的GDI对象占有的系统存储来删除它们。与CGdiObject对象有关的存储不受此调用的影响。如果CGdiObject对象正被选入设备上下文中,则应用不可对此对象调用DeleteObject。
当一个模式画刷被删除时，与之相关联的位图不被删除。位图必须被独立删除。

请参阅：CGdiObject::Detach


 CGdiObject::DeleteTempMap

static void PASCAL DeleteTempMap( );

说明：
由CwinApp空闲时间句柄自动调用。DeleteTempMap删除任意由FromHandle创建的临时CGdiObject对象。在删除CGdiObject对象之前，同时解除附加给此CGdiObject对象的所有Windows GDI对象。

请参阅：CGdiObject::Detach, CGdiObject::FromHandle


 CGdiObject::Detach

HGDIOBJ Detach ( );

返回值：
一个被解除的Windows GDI对象的句柄。如果没有附加GDI对象，则返回NULL。

说明：
解除一个CGdiObject对象的Windows GDI对象并返回其句柄。

请参阅：CGdiObject::Attach


 CGdiObject::FromHandle

static CGdiobject* PASCAL FromHandle(HGDIOBJ hObject);

返回值：一个指向CGdiObject对象的临时或永久性指针。

参数：
hObject 一个Windows GDI对象的句柄。

说明：
返回一个给出了句柄的CGdiObject对象指针给Windows GDI对象。如果一个CGdiObject对象还未附加给Windows GDI对象，则一个临时CGdiObject对象被创建并被附加。
直到下次应用在其事件循环中有空闲时间时，临时CGdiObject对象才是可用的。此时所有临时图形对象均被删除。或者说仅在处理一个Windows消息时，临时对象才是可用的。

请参阅：CGdiObject::DeleteTempMap


 CGdiObject::GetObject

int GetObject(int nCount,LPVOID lpObject)const;

返回值：获取的字节数。如果发生错误，则返回0。

参数：
nCount | 指定要拷贝到lpObject缓冲区的字节数。
lpObject | 指向用户应用缓冲区的指针以接收信息。

说明：
用定义指定对象的数据填充缓冲区。函数获得一个类型由图象对象决定的数据结构，列表如下所示：
对象 | 缓冲区类型
CPen | LOGPENC
Brush | LOGBRUSH
CFont | LOGFONT
CBitmap | BITMAP
CPalette | WORD
CRgn | Not supported（不支持）
如果对象是一个CBitmap对象，则函数仅返回宽度、高度和颜色格式，实际位值可由CBitmap::GetBitmapBits获得。
如果对象是一个CPalette对象，函数会返回一个字，此字指定了调色板中入口的个数而不是定义调色板的LOGPALETTEJIE结构。一个应用可以通过调用CPalette::GetPaletteEntries来获得调色板入口的更多信息。

请参阅：
CBitmap::GetBitmapBits, CPalette::GetPaletteEntries


 CGdiObject::GetObjectType

UINT GetObjectType( )const;

返回值：如果成功，则返回对象类型，否则为0，可能的值如下：
OBJ_BITMAP | 位图
OBJ_BRUSH | 画刷
OBJ_FONT | 字体
OBJ_PAL | 调色板
OBJ_PEN | 画笔
OBJ_EXTPEN | 扩展画笔
OBJ_REGION | 区域
OBJ_DC | 设备上下文
OBJ_MEMDC | 存储设备上下文
OBJ_METAFILE | 元文件
OBJ_METADC | 元文件设备上下文
OBJ_ENHMETAFILE | 扩展元文件
OBJ_ENHMATADC | 扩展元文件设备上下文

说明：获取GDI对象的类型。

请参阅：CGdiObject::GetObject, CDC::SelectObject


 CGdiObject::GetSafeHandle

HGDIOBJ GetSafeHandle( )const;

返回值：一个附加的Windows GDI对象句柄。如果无附加对象，则返回0。

说明：
如果m_hObject不是NULL，则返回m_hObject，否则返回NULL。这是一般句柄接口的一部分，当NULL是合法的或句柄的可用特殊值时十分有用。


 CGdiObject::UnrealizeObject

BOOL UnrealizeObject( );

返回值：如果成功，则返回非零值，否则返回零。

说明：
重新设置画刷资源或重新设置逻辑调色板。因为它是CGdiObject类的一个成员函数，所以它仅能为CBrush或CPalette对象所使用。
对于CBrush对象来说，UnrealizeObject指定系统在下一次选择设备上下文时重新设置给定的画刷；如果对象是CPalette对象，它指定系统识别该调色板，即使以前调色板未被识别。当下一次应用调用CDC::RealizePalette函数时，系统完全重新映射逻辑调色板为系统调色板。
此函数不可与存储对象一起使用。当一个新的画刷资源被设置（用CDC:: SetBrushOrg函数）时，必须调用此成员函数。UnrealizeObject函数不可被当前选用的画刷或调色板的任何显示上下文调用。


 CGdiObject::m_hObject

说明：
一个包含附加给对象的HBITMAP，HRGN，HBRUSH，HPEN，HPALETTE或HFONT的句柄。


 CGopherConnection

CObject
└CInternetConnection
└CGopherConnection

MFC类的CGopherConnection管理与Gopher Internet服务器的连接。Gopher服务器是由MFC WinInet类识别的三种 Internet服务器之一。CGopherConnection包含一个构造函数和三个附加成员函数，用于管理Gopher服务器：OpenFile，CreateLocator和GetAttribute。
为与一个Gopher Internet服务器相连接，必须首先建立一个CInternetSession实例，然后调用CInternetSession::GetGophConnection来构造一个CGopherConnection对象并返回一个指向它的指针。不可直接创建一个CGopherConnection对象。
要了解有关CGopherConnection如何与其它MFC Internet类共同工作，可参阅联机文档“Visual C++程序员指南”中的“用WinInet编写 Internet程序设计”。要了解有关另两种支持 的Internet的服务，FTP和HTTP，请参阅CHttpConnection和CFtpConnection。
#include <afxinet.h>

请参阅：
CFtpConnection, CHttpConnection, CInternetConnection, CGopherLocator, CGopherFile, CInternetSession

CGopherConnection类的成员

构造函数
CGopherConnection 构造一个CGopherConnection对象

操作
OpenFile | 打开一个Gopher文件
CreateLocator | 建立一个CGopherConnection对象以直接查找Gopher服务器上的文件
GetAttribute | 获取关于Gopher对象的属性信息


 CGopherConnection::CGopherConnection

CGopherConnection( );

说明：
此成员函数用于构造一个CGopherConnection对象。不可直接构造一个CgopherConnection对象，而是使用CInternetSession::GetgopherConnection来构造Cgop-herConnection对象并返回一个指针。

请参阅：
CFtpConnection, CHttpConnection, CInternetConnection


 CGopherConnection::CreateLocator

CGopherLocator CreateLocator( LPCTSTR pstrDisplayString, LPCTSTR pstrSelectorString, DWORD dwGopherType );

static CGopherLocator CreateLocator( LPCTSTR pstrLocator );

static CGopherLocator CreateLocator( LPCTSTR pstrServerName,
LPCTSTR pstrDisplayString,
LPCTSTR pstrSelectorString,
DWORD dwGopherType,
INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER
);

返回值：一个CGopherLocator对象。

参数：
pstrDisplayString | 指向一个包含要获得的Gopher文档或路径（目录）名的字符串。如果为NULL，则返回Gopher服务器的缺省目录。
pstrSelectorString | 指向将被送到Gopher服务器的选择器字符串的指针，以获取一个项目。pstrSelectorString可以为NULL。
dwGopherType | 指定pstrSelectorString表示一个目录还是表示一个文档，请求是Gopher还是Gopher+。请参阅联机文档“ActiveX SDK”中的GOPHER_FIND_DATA结构的属性。
pstrLocator | 一个指向标识待打开文件的字符串的指针。一般来说此字符串通过调用CGopherFileFind::GetLocator返回。
pstrServerName | 指向包含Gopher服务器名称的字符串指针。
nPort | 标识Internet连接端口的数字。

说明：
调用此成员函数构造一个Gopher定位器，查找或标识Gopher服务器上的文件。静态版本的成员函数需要指定一个服务器，而非静态版本使用连接对象的服务器名。
为了从Gopher服务器获得信息，应用必须首先获得一个Gopher定位器，然后应用必须把定位器作为一个不透明标号（即应用必须使用此定位器，但不可直接操纵或比较它）。通常应用使用定位器来调用CGopherFileFind::FindFile成员函数，获取一条指定信息。

请参阅：
CFtpConnection, CHttpConnection, CInternetConnection, CGopherLocator, CGopherFileFind


 CGopherConnection::GetAttribute

BOOL GetAttribute(LPGOPHER_ATTRIBUTE_TYPE& lpType, CString strRequestedAttributes, CGopherLocator& refLocator );

返回值：
如果成功，则返回非零值，否则为0。如果调用失败，则调用Win32函数GetLastError，以得到错误原因。

参数：
lpType | 指向GOPHER_ATTRIBUTE_TYPE结构的指针。请参阅联机文档“ActiveX SDK”，了解关于此结构的更多信息。
strRequestedAttributes | 空格分隔的字符串，指定所需类型的名字。
refLocator | 一个CGopherLocator对象的参考。

说明：
调用此成员函数，获取一个从Gopher服务器得到的项目的指定属性信息。

请参阅：
CFtpConnection, CHttpConnection, CInternetConnection, CGopherLocator


 CGopherConnection::OpenFile

CGopherFile* OpenFile( CGopherLocator& refLocator, DWORD dwFlags = 0, LPCTSTR pstrView = NULL, DWORD dwContext = 1 );

返回值：将被打开的CGopherFile对象的指针。

参数：
refLocator | 一个CGopherLocator对象的参考。
dwFlags | INTERNET_FIAG_* flags的任意结合，可参阅CInterenetSession::OpenUrl，了解有关INTERNET_FLAGS_* flags的更多信息。
pstrView | 指向文件视图字符串的指针。如果服务器存在多个文件的视图，则此参数指定要打开的那个文件视图。如果pstrView为NULL，则使用缺省的文件视图。
dwContext | 将被打开的文件的上下文ID，请参阅部分Remarks，了解更多有关dwContext的信息。

说明：
调用此成员函数打开Gopher服务器上的一个文件。
覆盖dwContext缺省值来设置你选择的值为上下文标识符。上下文标识符与CGopherConnection的CInternetSession对象创建的CGopherConnection对象操作相关联。值返回到CInternetSession::OnStatusCallback，提供它标识的操作的状态。请参阅 联机文档“Visual C++程序员指南”中的“ Internet初步：WinInet”，以了解有关上下文标识符的更多信息。

请参阅：
CFtpConnection, CHttpConnection, CInternetConnection, CGopherFile, CGopherLocator, CInternetSession


 CGopherFile

CObject
└CFile
└CStdioFile
└CInternetFile
└CGopherFile

MFC类的CGopherFile提供了在一个Gopher服务器中查找和读文件的功能。
Gopher服务不允许用户写数据到一个Gopher文件，因为此服务函数主要是作为一个查找信息的菜单驱动接口。CGopherFile成员函数Write，WriteString和Flush均对CGopherFile无效。对CGopherFile对象调用这些函数时，返回CNotSupportedException。
要了解有关CGopherFile与其它MFC Internet类一起工作的更多信息，请参阅“Visual C++程序员指南”中的“用WinInet编写Internet程序”。
#include <afxinet.h>

请参阅：
CInternetFile, CGopherLocator, CGopherFileFind, CGopherConnection

CGopherFile类的成员

构造函数
CGopherFile 构造一个CGopherFile对象

操作
Close 关闭与Gopher服务器的连接


 CGopherFile::CGopherFile

CGopherFile( HINTERNET hFile, CGopherLocator& refLocator, CGopherConnection* pConnection );

参数：
hFile | 一个HINTERNET文件的句柄。
refLocator | 一个CGopherLocator对象的参考。
pConnection | 一个指向CGopherConnection的指针。

说明：
调用此成员函数构造一个CGopherFile对象。
在Gopher Internet会话中，需要一个CGopherFile对象从文件中读取数据。
不能直接构造一个CGopherFile对象，而是在一个Gopher服务器上调用CGopherConnection::OpenFile来打开一个文件。

请参阅：
CInternetFile, CGopherLocator, CGopherFileFind, CGopherConnection


 CGopherFile::Close

virtual void Close( );

说明：调用此成员函数来关闭一个Gopher文件。

请参阅：
CInternetFile, CGopherLocator, CGopherFileFind, CGopherConnection


 CGopherFileFind

CObject
└CFileFind
└CGopherFileFind

CGopherFileFind类帮助Gopher服务器查找Internet文件。
CGopherFileFind包括开始查找、定位一个文件、返回文件的URL等成员函数。
其它为Internet和本地文件查找设计的MFC类包括CFtpFileFind和CFileFind。与CGopherFileFind一起，这些类提供了无缝机制以方便用户查找指定文件，而不管服务器协议、文件类型或地点（本地机或远程服务器）。注意没有查找HTTP服务器的MFC类，因为HTTP不支持查找所需的直接文件操作。
注意：CGopherFileFind不支持以下基类CFileFind的成员函数：
·GetRoot
·GetFileName
·GetFilePath
·GetFileTitle
·GetFileURL
另外，与CGopherFileFind一起使用时，CFileFind成员函数IsDots为FALSE。
为了解有关使用CGopherFileFind和其它WinInet类的更多信息，请参阅联机文档“Visual C++程序员指南”中的“用WinInet编写Internet程序”。
#include <afxinet.h>

请参阅：
CFtpFileFind, CFileFind, CInternetFile, CGopherFile, CHttpFile

CGopherFileFind类的成员

构造函数
CGopherFileFind 构造一个CGopherFileFind对象

属性
FindFile | 在Gopher服务器上查找一个对象
FindNextFile | 从以前FindFile调用处继续查找文件
GetLocator | 获取一个CGopherLocaTor对象
GetScreenName | 获取一个Gopher屏幕名
GetLength | 获取找到的文件的长度，以字节为单位


 CGopherFileFind::CGopherFileFind

CGopherFileFind( CGopherConnection* pConection, DWORD dwContext = 1 );

参数：
pConnection | 指向CGopherConnection对象的指针。
dwContext | 操作的上下文标识符。请参阅说明部分，了解有关dwContext的更多信息。

说明：
调用此成员函数构造一个CGopherFileFind对象。
dwContext的缺省值由MFC从创建CGopherFileFind对象的CInternetSession对象传到CGopherFileFind对象。可以覆盖此函数设置你的选择值，此标识由CInternetSession::OnStatusCallback返回，提供它标识的对象的状态。要了解有关dwContext标识符的更多信息，可参阅联机文档“Visual C++程序员指南”中的“Internet初步：WinInet”。

请参阅：CFtpFileFind, CFileFind


 CGopherFileFind::FindFile

virtual BOOL FindFile(CGopherLocator& refLocator, LPCTSTR pstrString, DWORD dwFlags = INTERNET_FLAGS_RELOAD);
virtual BOOL FindFile(LPCTSTR pstrString, DWORD dwFlags = INTERNET_FLAGS_RELOAD);

返回值：
如果成功，则返回非零值，否则为0。要了解有关出错的更多信息，可调用Win32函数GetLastError。

参数：
refLocator | 一个CGopherLocator对象的参考。
pstrString | 指向包含文件名的字符串指针。
dwFlags描述如何处理会话的标志，可用的标志有：
· | INTERNET_FLAG_RELOAD | 即使在本地缓存也从网络中获取数据。
· | INTERNET_FLAG_DONT_CACHE | 不缓存数据，本地或网关都不缓存。
· | INTERNET_FLAG_SECURE | 用安全插座层或PCT实现网络安全传输。此标志仅对HTTP请求可用。
· | INTERNET_FLAG_USE_EXISTING | 如果可能，新的FindFile请求重用与服务器已有的连接，而不对每个请求创建新会话。

说明：
调用此成员函数查找一个Gopher文件。
在调用FindFile获得第一个Gopher对象之后，可以调用FindNextFile获取下一个Gopher文件。

请参阅：CFileFind::FindFile


 CGopherFileFind::FindNextFile

virtual BOOL FindNextFile( );

返回值：
如果有更多文件，则返回非零；如果为最后一个文件，则返回0。
以前对FindFile或FindNextFile的调用均返回非零值。要了解更多的错误信息，可调用Win32函数GetLastError。

说明：
调用此成员函数，从CGopherFileFind::FindFile开始继续查找下一个文件。

请参阅：CFileFind::FindNextFile


 CGopherFileFind::GetLength

virtual DWORD GetLength( ) const;

返回值：所找到文件的长度（以字节表示）。

说明：
调用此成员函数获取找到的文件的长度。
GetLength使用Win32结构WIN32_FIND_DATA的nFileSizeLow成员来获得DWORD的低位字的文件的字节长度。如果文件大于4G，则使用GetLength64成员。

请参阅：CFileFind


 CGopherFileFind::GetLocator

CGopherLocator GetLocator( )const;

返回值：一个CGopherLocator对象。

说明：
调用此成员函数获取一个CGopherLocator对象，供FindFile使用来查找Gopher文件。

请参阅：CGopherConnection::CreateLocator


 CGopherFileFind::GetScreenName

CString GetSCreenName( ) const;

返回值：Gopher屏幕名。

说明：调用此成员函数获取Gopher屏幕名。


 CGopherLocator

CObject
└CGopherLocator

CGopherLocator类从Gopher服务器获取一个Gopher“定位器”，确定定位器的类型，并使定位器可用于CGopherFileFind。
一个应用必须在获取服务器信息前获取Gopher服务器的定位器。当它有了定位器后，它将定位器作为一个不透明的记号。
每个Gopher定位器有表示找到的文件或服务器的属性，可参阅GetLocatorType，查看Gopher定位器类型值的列表。
应用通常在调用CGopherFile:FindFile获取指定的信息时使用定位器。
要了解有关CGopherLocator与其它MFC Internet类共同工作的更多信息，请参阅联机文档“Visual C++程序员指南”中的“用WinInet编写Internet程序”。
#include <afxinet.h>
请参阅：CGopherFileFind

CGopherLocator类的成员

构造函数
CGopherLocator 构造一个CGopherLocator对象

属性
GetLocatorType 分析一个Gopher定位器并确定其属性

操作符
operator LPCTSTR 以C字符形式，直接访问存放在CGopherLocator对象的字符


 CGopherLocator::CGopherLocator

CGopherLocator(const CGopherLocator& ref);

参数：
ref 一个常量CGopherLocator对象的参考。

说明：
调用此成员函数构造一个CGopherLocator对象。一般不直接构造一个CGopherLocator对象，而是调用CGopherConnection::CreateLocator来创建并向CGopherLocator对象返回一个指针。

请参阅：CGopherFileFind, CGopherConnection


 CGopherLocator::GetLocatorType

BOOL GetLocatorType(DWORD& dwRef) const;

返回值：
如果成功，则返回非零值，否则为0。如果调用失败，可调用Win32的GetLastError函数确定出错原因。

参数：
dwRef 获取定位器类型的DWORD参考，请参阅说明部分，了解定位器类型列表。

说明：
调用此成员函数获取定位器类型，可能的类型如下：
值 | 含义
GOPHER_TYPE_TEXT_FILE | 一个ASCII文本文件
GOPHER_TYPE_DIRECTORY | 一个附加Gopher项目的目录
GOPHER_TYPE_CSO | 一个CSO电话簿服务器
GOPHER_TYPE_ERROR | 标明一个错误条件
GOPHER_TYPE_MAC_BINHEX | 一个BINHEX格式的Macintosh文件
GOPHER_TYPE_DOS_ARCHIVE | 一个DOS档案文件
GOPHER_TYPE_UNIX_UUENCODED | 一个UUENCODED文件
GOPHER_TYPE_INDEX_SERVER | 一个索引服务器
GOPHER_TYPE_TELNET | 一个Telnet服务器
GOPHER_TYPE_BINARY | 一个二进制文件
GOPHER_TYPE_REDUNDANT | 一个复制服务器。所含信息时一个主服务器的副本，主服务器是不具有GOPHER_TYPE_REDUNDANT类型的最后一个目录入口
GOPHER_TYPE_TN3270 | 一个TN3270服务器
GOPHER_TYPE_GIF | 一个GIF图形文件
GOPHER_TYPE_IMAGE | 一个图象文件
GOPHER_TYPE_BITMAP | 一个位图文件
GOPHER_TYPE_MOVIE | 一个电影文件
GOPHER_TYPE_SOUND | 一个声音文件
GOPHER_TYPE_HTML | 一个HTML文档
GOPHER_TYPE_PDF | 一个PDF文件
GOPHER_TYPE_CALENDAR | 一个日历文件
GOPHER_TYPE_INLINE | 一个内部文件
GOPHER_TYPE_UNKNOWN | 项目类型未知
GOPHER_TYPE_ASK | 一个Ask+项目
GOPHER_TYPE_GOPHER_PLUS | 一个Gopher+项目

请参阅：CGopherFileFind, CGopherConnection


 CGopherLocator::operator LPCTSTR

operator LPCTSTR( )const;

返回值：一个指向字符串数据的字符指针。

说明：
这个有用的操作符提供了一个有效访问包含CGopherLocator对象的以空终止符结尾的C字符串的方法。它不拷贝字符，只返回一个指针。


 CHeaderCtrl

CObject
└CCmdTarget
└CWnd
└CHeaderCtrl

“标头控件”是一个窗口，通常在文本或数据顶部。它包含列名字，可以被拆分。用户可以拖动分隔线来分开各个部分，以设置各列的宽度。
CHeaderCtrl提供了Windows基本标头控件功能。此控件（以及CHeaderCtrl类）仅对运行于Windows 95，Windows NT 3.51版及以上的程序有效。
对IE 4.0的附加控件添加的功能包括：
· | 标头项目的定制排序。
· | 标头项目的拖放，直接重新设置标头项目。创建CHeaderCtrl对象时采用HDS_DRAGDROP风格。
· | 在列大小改变时一直保持标头项目文本可视。创建CHeaderCtrl对象时采用HDS_DRAGDROP风格。
· | 标头热追踪。当指针停留在标头项目之上时，标头项目高亮度显示。创建CHeaderCtrl对象时采用HDS_DRAGDROP风格。
· | 支持图象列表。标头项目可以包含存放在CImageList对象中的图象。
要了解有关使用CHeaderCtrl的更多信息，可参阅联机文档的“VisualC++程序员指南”中的“控件主题”和“使用CHeaderCtrl”。
#include <afxcmn.h>
请参阅：CTabCtrl, CListCtrl, CImageList

CHeaderCtrl类的成员

构造函数
CHeaderCtrl | 构造一个CHeaderCtrl对象
Create | 创建一个标头控件并把它附加给CHeaderCtrl对象

属性
GetItemCount | 获取一个标头控件下的项目总数
GetItem | 获取一个标头控件中项目的更多信息
SetItem | 设置一个标头控件中指定项目的属性
GetImageList | 获取在标头控件中画标头项目的图象列表的句柄
SetImageList | 将一个图象列表在标头控件中排列
GetItemRect | 获取一个标头控件中给定控件的有界矩形
GetOrderArray | 获取一个标头控件中自左至右的顺序排列的项目
SetOrderArray | 在一个标头控件中设置自左至右的项目顺序
OrderToIndex | 获得一个标头控件中依项目顺序排列的项目的索引值

操作
InsertItem | 在一个标头控件中添加一个项目
DeleteItem | 从一个标头控件中删除一个项目
Layout | 在一个给定矩形中获取一个标头控件的大小和位置
CreateDragImage | 创建一个项目的图象的透明形式
SetHotDivider | 改变在标头项目之间的分隔线来显示一个标头项目的人工拖放

可覆盖的函数
DrawItem 绘制一个标头控件中的指定项目


 CHeaderCtrl::CHeaderCtrl

CHeaderCtrl( );

说明：构造一个CHeaderCtrl对象。

请参阅：CHeaderCtrl::Create


 CHeaderCtrl::Create

BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

返回值：
如果初始化成功，则返回非零值，否则为0。

参数：
dwStyle | 指定标头控件的风格，使用控件需要的任意标头控件风格的结合。
rec | 指定标头控件的大小与位置，或者是一个CRect对象或者是一个RECT结构。
pParentWnd | 指定标头控件的父窗口，通常是一个CDialog，不能为NULL。
nID | 指定标头控件的ID。

说明：
分两步建立一个CHeaderCtrl对象。首先调用构造函数，然后调用Create来创建标头控件并把它附加给CHeaderCtrl对象。
以下风格可被用于标头控件（见联机文档“平台SDK”中的“关于标头控件风格”）：
· | HDS_HOTTRACK | 当指针停留在标头项目时，此项目高亮度显示。
· | HDS_DRAGDROP | 标头控件可以被拖放，以实现重排序。
· | HDS_FULLDRAG | 当用户改变列大小时，标头控件显示列内容。
· | HDS_BUTTONS | 标头控件与按钮一样。
· | HDS_HORZ | 标头控件水平。
· | HDS_VERT | 标头控件垂直（此风格当前不采用）。
· | HDS_HIDDEN | 标头控件在详细模式下不可见。
另外，可以使用以下常用控件风格来确定标头控件自己的大小和位置（见“平台SDK”中的“常用控件风格”）。
· | CCS_BOTTOM | 使控件自身排列在父窗口用户区的底部并设置其宽度与父窗口的宽度一样。
· | CCS_NODIVIDER | 禁止在控件顶部画一个二像素高亮度显示。
· | CCS_NOHILITE | 禁止在控件顶部画一个一像素高亮度显示。
· | CCS_NOMOVEY | 使控件自己水平改变大小及移动而不垂直移动，响应WM_SIZE消息。如果使用CCS_NORESET风格，则此风格无效。标头控件缺省时具有此风格。
· | CCS_NOPARENTALIGN | CCS_TOP CCS_BOTTOM禁止对象在父窗口顶部或底部自动移动。尽管父窗口大小改变了，控件仍在父窗口中保持其位置。如果CCS_TOP或CCS_BOTTOM风格也被使用，则缺省调整高度，但位置与宽度不变。
· | CCS_NORESIZE | 禁止控件在初始化或新大小设置时使用缺省宽度与高度，而是用创建或新设请求时指定的宽度和高度。
· | CCS_TOP | 使控件定位于父窗口用户区的顶部并使其宽度与父窗口一样。
也可以对一个标头控件使用以下窗口风格（见“MFC库参考，第二部分”中的“Windows风格”）：
· | WS_CHILD | 构造一个子窗口，不可与WS_POPUP风格同时使用。
· | WS_VISIBLE | 构造一个初始可见的窗口。
· | WS_DISABLED | 构造一个初始不可见的窗口。
· | WS_GROUP | 指定一组控件中的第一个可以用箭头从一个控件移到另一个控件的控件。从第一个开始，所有的用WS_GROUP风格定义均属于同一组。下一个用WS_GROUP风格结束的控件结束了此组并开始一个新组（即：下一个开始时，上一个便结束）。
· | WS_TABSTOP | 指定了控件的任意一个，通过它用户可以用TAB键移动。TAB键使用户访问由WS_TABSTOP风格指定的另一个控件。

请参阅：CHeaderCtrl::CHeaderCtrl


 CHeaderCtrl::CreateDragImage

CImageList* GreateDragImage(int nIndex);

返回值：
如果成功，则返回一个指向CImageList对象的指针，否则为NULL。返回的列表仅包含一个图象。

参数：
nIndex 标头控件内项目的基于0的索引。分配给此项目的图象是透明图象的基础。

说明：
此成员函数执行Win32的消息HDM_CREATEDRAGIMAGE的动作，可参阅联机文档“平台SDK”中的叙述。它提供了对项目拖放的支持。
返回的指向的CImageList对象指针是一个临时对象，当下一个空闲时间运行时即被删除。

请参阅：
CHeaderCtrl::GetImageList, CHeaderCtrl::SetImageList


 CHeaderCtrl::DeleteItem

BOOL DeleteItem(int nPos);

返回值：如果成功，则返回非零值，否则为0。

参数：
nPos 要删除的项目的基于0的索引。

说明：从一个标头控件中删去一个项目。

请参阅：CHeaderCtrl::InsertItem


 CHeaderCtrl::DrawItem

void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);

参数：
lpDraWItemStruct 指向描述着色项目DRAWITEMSTRUCT结构的指针。

说明：
当拥有者绘制的标头控件的可视背景改变时，由框架调用。ItemAction成员的DRAWITEMSTRUCT结构定义了将要进行的绘画动作。
缺省时，此成员函数不做任何事情。覆盖此函数，可绘制拥有者的CHeaderCtrl对象。在此成员函数终止之前，应用应存储所有由lpDrawItemStruct提供的、用于显示上下文的图形设备接口对象。

请参阅：CWnd::OnDrawItem


 CHeaderCtrl::GetImageList

CImageList* GetImageList( ) const;

返回值：一个指向CImageList对象的指针。

说明：
此成员函数实现Win32消息HDM_GETIMAGELIST的功能，可参阅联机文档“平台SDK”。
指向CImageList对象的返回指针是一个临时对象指针，当下一个空闲时间运行时被删除。

请参阅：CHeaderCtrl::SetImageList, CHeaderCtrl::CreateDragImage


 CHeaderCtrl::GetItem

BOOL GetItem(int nPos, HDITEM* pHeaderItem) const;

返回值：如果成功，则返回非零值；否则为0。

参数：
nPos | 指定要获取的项目的基于0的索引。
pHeaderItem | 指向接收新项目的HDITEM结构的指针，此结构与InsertItem和SetItem成员函数一起使用。
mask | 元素中的标志设置保证对应元素中的值被返回值正确填充。如果mask元素被设置为0，则其它结构元素无意义。

说明：获取关于标头控件项目的信息。

请参阅：CHeaderCtrl::SetItem


 CHeaderCtrl::GetItemCount

int GetItemCount( ) const;

返回值：
如果成功，则返回标头控件项目的个数，否则为-1。

说明：获取标头控件中的项目的个数。

请参阅：CHeaderCtrl::GetItem, CHeaderCtrl::SetItem


 CHeaderCtrl::GetItemRect

BOOL GetItemRect(int nIndex, LPRECT lpRect) const;

返回值：如果成功，则返回非零值，否则为0。

参数：
nIndex | 标头控件项目基于0的索引。
lpRect | 指向RECT项目地址的指针，以接收有界矩形的更多信息。

说明：
此函数实现Win32消息HDM_GETITEMRECT的功能，可参阅联机文档“平台SDK”。


 CHeaderCtrl::GetOrderArray

BOOL GetOrderArray(LPINT piArray, int iCount = -1);

返回值：如果成功，则返回非零值，否则为0。

参数：
piArray | 指向缓冲区地址的指针，以接收标头控件项目值的索引，按它们从左到右的显示顺序。
iCount | 标头控件的项目数。

说明：
此成员函数实现Win32消息HDM_GETORDERARRAY的功能，可参阅联机文档“平台SDK”。它提供对标头项目排序的支持。
如果使用iCount的缺省值，则GetOrderArray使用GetItemCount填充参数。

请参阅：
CHeaderCtrl::SetOrderArray, CHeaderCtrl::OrderToIndex


 CHeaderCtrl::InsertItem

int InserItem(int nPos, HDITEM* phdi);

返回值：如果成功，则返回新项目索引，否则为-1。

参数：
nPos | 插入项目的基于0的索引。如果为0，则此项目插入标头控件的开始处；如果此值大于最大值，则此项目插入标头控件末尾。
phdi | 指向一个包括被插入项目信息的HDITEM结构的指针。

说明：插入一个指定的索引的项目到标头控件。

请参阅：CHeaderCtrl::DeleteItem, CHeaderCtrl::GetItem


 CHeaderCtrl::Layout

BOOL Layout(HDLAYOUT* pHeaderLayout);

返回值：如果成功，则返回非零值，否则为0。

参数：
pHeaderLayout 指向一个HDLAYOUT结构的指针，包含标头控件的大小和位置信息。

说明：
获取在一个指定矩形内的标头控件的大小和位置。此函数用于指定占用给定矩形的新标头控件的属性情况。


 CHeaderCtrl::OrderToIndex

int OrderToIndex(int nOrder) const;

返回值：
项目索引，基于标头控件中项目的顺序。索引自左到右由0开始。

参数：
nOrder 项目在标头控件从左到右显示时的基于0的顺序值。

说明：
此成员函数实现Win32的宏HDM_ORDERTOINDEX的功能，可参阅联机文档“平台SDK”。
它提供对标头排序的支持。

请参阅：
CHeaderCtrl::GetOrderArray, CHeaderCtrl::SetOrderArray


 CHeaderCtrl::SetHotDivider

int SetHotDivider(CPoint pt);
int SetHotDivider(int nIndex);

返回值：高亮度分隔符的索引。

参数：
pt | 指针位置。标头控件按指针位置，高亮度显示分隔符索引。
nIndex | 高亮度分隔符的索引。

说明：
此成员函数实现Win32消息HDM_SETHOTDIVIDER的功能，可参阅联机文档“平台SDK”。它提供对标头项目的拖放。


 CHeaderCtrl::SetImageList

CImageList* SetImageList(CImageList* pImageList);

返回值：
以前分配给标头控件的CImageList对象的指针。

参数：
pImageList 指向CImageList对象，此对象包含将被分配给标头控件的图象列表。

说明：
此成员函数实现Win32消息HDM_SETIMAGELIST的功能，可参阅联机文档“平台SDK”。返回指针指向的CImageList对象是一个临时对象，在下一空闲时间运行时被删除。

请参阅：
CHeaderCtrl::GetImageList, CHeaderCtrl::CreateDragImage


 CHeaderCtrl::SetItem

BOOL SetItem(int nPos,HDITEM* pHeaderItem);

返回值：如果成功，则返回非零，否则为0。

参数：
nPos | 被操纵的项目的基于0的索引。
pHeaderItem | 指向HDITEM结构的指针，此结构包含新项目的信息。

说明：设置标头控件中项目的属性。

请参阅：
CHeaderCtrl::GetItem, CHeaderCtrl::GetItemCount


 CHeaderCtrl::SetOrderArray

BOOL SetOrderArray(int iCount,LPINT piArray);

返回值：如果成功，则返回非零值，否则为0。

参数：
iCount | 标头控件的项目数。
piArray | 指向缓冲区地址的指针，按其由左到右的显示顺序，接收标头控件中项目的索引值。

说明：
此成员函数实现Win32的宏HDM_SETORDERARRAY的功能，可参阅联机文档“平台SDK”。它提供对标头项目排序的支持。

请参阅：
CHeaderCtrl::GetOrderArray, CHeaderCtrl::OrderToIndex


 CHotKeyCtrl

CObject
└CCmdTarget
└CWnd
└CHotKeyCtrl

一个“热键控件”是使用户创建热键的窗口。热键是用户快速执行一个动作的键的组合（例如，一个用户可以构造一个热键以激活一个窗口，并把它设置到Z顺序的上方）。热键控件显示用户的选择并确信用户选择了一个可用的热键。
CHotKeyCtrl类提供了Windows常用的热键控件功能，此控件（也即CHotKeyCtrl类）仅对Windows95，WindowsNT3.51以上版本的程序可用。
当用户选择了一个键组合，应用就可以获取控件指定的键组合并在系统中用WM_SETHOTKEY消息建立热键。以后如果用户按下热键，无论在系统的那一部分，由WM_SETHOTKEY指定的窗口的消息会接收由SC_HOTKEY指定的一个WM_SYSCOMMAND消息，此消息激活接收它的窗口。当调用WM_SETHOTKEY的应用退出之前，热键有效。
这种机制有别于WM_HOTKEY消息和Windows RegisterHotKey与UnregisterHotKey函数对热键的支持方式。
要了解使用CHotKeyCtrl的更多信息，可参阅联机文档“Visual C++程序员指南”中的“控件主题”和“使用CHotKeyCtrl”。
#include <afxcmn.h>

CHotKeyCtrl类的成员

构造函数
CHotKeyCtrl | 构造一个CHotKeyCtrl对象
Create | 构造一个热键控件并附加给一个CHotKeyCtrl对象

属性
SetHotKey | 对一个热键控件设置热键组合
GetHotKey | 从热键控件中获取虚拟键代码和缺省修正符标志

操作
SetRules 定义热键控件的不可用组合和缺省的修正符组合


 CHotKeyCtrl::CHotKeyCtrl

CHotKeyCtrl( );

说明：构造一个CHotKeyCtrl对象。

请参阅：CHotKeyCtrl::Create


 CHotKeyCtrl::Create

BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

返回值：
如果初始化成功，则返回非零值，否则为0。

参数：
dwStyle | 指定热键控件的风格。适用于任何控件风格的组合。
rect | 指定热键控件的大小和位置，可为CRect或为RECT结构。
pParentWnd | 指定热键控件的父窗口，通常为CDialog，不能为NULL。
nID | 指定热键控件的ID。

说明：
通过两步构造一个CHotKeyCtrl对象。首先调用构造函数，然后调用Create来构造一个热键控件并把它附加给一个CHotKeyCtrl对象。

请参阅：CHotKeyCtrl::CHotKeyCtrl


 CHotKeyCtrl::GetHotKey

DWORD GetHotKey( ) const;
void GetHotKey(WORD &wVirtualKeyCode, WORD &wModifiers) const;

返回值：
在上述第一个用法中，DWORD包含虚拟键代码及修正符标志。低位字是虚拟键代码，高位字是修正符标志。32位值的HIWORD和LOWORD可以在SetHotKey成员函数中被用作参数。

参数：
wVirtualKeyCode | 热键的虚拟键代码。
wModifiers | 修正符标志。当与wVirtualKeyCode组合使用时，定义一个热键组合。

说明：
调用此成员函数从一个热键控件中获取一个虚拟键代码和修正符标志。
修正符标志可以为以下值的组合：
· | HOTKEYF_ALT | ALT键
· | HOTKEYF_CONTROL | CTRL键
· | HOTKEYF_EXT | 扩展键
· | HOTKEYF_SHIFT | SHIFT键

请参阅：CHotKeyCtrl::SetHotKey


 CHotKeyCtrl::SetHotKey

void SetHotKey(WORD wVirtualKeyCode, WORD wModifiers);

参数：
wVirtualKeyCode | 热键的虚拟键代码。
wModifiers | 修正符标志。当与wVirtualKeyCode组合使用时，定义一个键组合。要了解修正符标志的更多信息，请参阅GetHotKey。

说明：
调用此成员函数为一个热键控件设置一个组合。

请参阅：CHotKeyCtrl::GetHotKey


 CHotKeyCtrl::SetRules

void SetRules(WORD wInvalidComb, WORD wModifiers);

参数：
wInvalidComb指定无效键组合的标志数组，可为以下值的组合：
· | HKCOMB_A | ALT
· | HKCOMB_C | CTRL
· | HKCOMB_CA | CTRL+ALT
· | HKCOMB_NONE | 未修正的键
· | HKCOMB_S | SHIFT
· | HKCOMB_SA | SHIFT+ALT
· | HKCOMB_SC | SHIFT+CTRL
· | HKCOMB_SCA | SHIFT+CTRL+ALT
wModifiers 当用户访问一个无效组合时，指定使用的键组合标志数组。要了解更多信息，请参阅GetHotKey。

说明：
调用此函数，为一个热键控件定义无效组合和缺省修正符组合。当用户访问一个无效键组合时（由wInvalidComb定义），系统用OR操作将这些键与由wModifiers指定的标志组合。产生的键组合被转化成一个字符串，然后显示在热键控件中。


 CHtmlStream

CHtmlStream没有基类。
CHtmlStream是管理内存中的HTML的类。HTML内存文件对临时存储原始字节或串行化对象十分有用。尽管它不是由CFile派生，但CHtmlStream与CFile派生类CMemFile相似，只是CHtmlStream用于存储临时缓冲区中的数据，且CHtmlStream内存文件的数据不可读。
CHtmlStream对象常自动创建，并通过CHttpServer::ConstructStream变成可用。但也可覆盖CHttpServer::ConstructStream并提供特殊的功能。
CHtmlStream对象可自动分配内存或调用Attach将自己的内存块附加给CHtmlStream对象。无论那种情况，如果nGrowBytes不为0，则文件内存区被自动分配在以nGrowBytes为大小的增加区内，可将nGrowBytes设置为构造函数的一个参数。
如果内存原来由CHtmlStream对象占用，当此对象被析构时，内存自动被删除。否则，你应释放对象的内存区。
CHtmlStream使用实时库函数分配、重新分配、释放并分配，解配内存。在增长的缓冲区内，拷入内存块。要在CHtmlStream增加一个文件时改变此功能，应从CHtmlStream派生自己的类，并覆盖相应的函数。
#include <afxisapi.h>
请参阅：CHttpServer, CHttpFilter

CHtmlStream类的成员

数据成员
m_nStreamSize 包含流的长度

构造函数
CHtmlStream 构造一个CHtmlStream对象

操作
Attach | 将一个内存块附加给CHtmlStream
GetStreamSize | 获取CHtmlStream的大小
Close | 关闭流，释放缓冲区
InitStream | 初始化一个与CHtmlStream对象相关联的流

可覆盖的函数
Abort | 结束一个流，忽略错误与警告
Reset | 清空一个CHtmlObject对象
Alloc | 在一个CHtmlStream对象中分配内存
Realloc | 在一个CHtmlStream中重新分配内存
Memcpy | 拷贝内存到CHtmlStream中
Free | 释放CHtmlStream对象的内存
Detach | 关闭CHtmlStream
GrowStream | 增加一个CHtmlStream对象
Write | 从内存区写数据到当前流

操作符
operator << 写数据到流中


 CHtmlStream::Abort

virtual void Abort( );

说明：
由框架调用，结束一个流并使CHtmlStream不可写。
使用此函数在重大错误后清除一个流。使用Reset在想在向里写时清除流的内容。
覆盖此成员函数来实现定制的清除操作。

请参阅：CHtmlStream::Reset, CHtmlStream::Close


 CHtmlStream::Alloc

virtual BYTE* Alloc(DWORD nBytes);

返回值：
指向分配的内存块的指针；如果分配失败，则为NULL。

参数：
nBytes 被分配的内存的字节数。

说明：
被结构调用以分配内存。覆盖此函数来执行常用的内存分配。如果覆盖此函数，也应将Free覆盖。
缺省实现时，用运行库函数malloc分配内存。

请参阅：CHtmlStream::Realloc


 CHtmlStream::Attach

void Attach(BYTE* lpBuffer, UINT nBufferSize, UINT nGrowByte = 0);

参数：
lpBuffer | 指向将被附加给CHtmlStream的缓冲区的指针。
nBufferSize | 以字节数表示的内存大小的整数值。
nGrowBytes | 以字节表示的内存分配增量。

说明：
调用此成员函数将一个内存块附加给CHtmlStream，这使CHtmlStream将此内存块作为内存文件。
如果nGrowBytes为0，则CHtmlStream将文件长度赋给nBufferSize，这意味着内存中将附加给CHtmlStream的数据内存块作为文件数据，以这种方式建立的内存文件不可增长。
因为此文件不可增长，注意不要使CHtmlStream增加文件，也不要使用操作符<<增加数据。

请参阅：CHtmlStream::Detach


 CHtmlStream::CHtmlStream

CHtmlStream(UINT nGrowBytes = 4096);
CHtmlStream(BYTE* lpBuffer, UINT nBufferSize, UINT nGrrowBytes = 0);

参数：
nGrowBytes | 以字节表示的内存分配增量。
lpBuffer | 指向由nBufferSize指定大小的内存区，用来接收信息。
nBufferSize | 以字节表示的缓冲区大小。

说明：
在创建CHtmlStream对象时由框架调用。
通常，一个CHtmlStream对象自动创建，并由CHttpServer::ConstructStream传送给你。可以覆盖CHttpServer::ConstructStream，改变与CHttpServerContext对象相关联的CHttpStream对象的功能。例如，你可能想将nGrowBytes设置为一个指定值。设置时，你应小心，因为这将影响代码的执行效率。nGrowBytes参数告诉MFC，以多快的速度增加与流相关联的内存块。如果此值过大，代码将加快但会浪费内存；如果值太小，内存占用较少，但由于要经常分配内存，从而浪费时间。

请参阅：
CHtmlStream::InitStream, CHtmlStream::Attach, CHtmlStream::Alloc


 CHtmlStream::Close

virtual void Close( );

说明：
由框架调用此成员函数，关闭一个HTML流并将释放缓冲区。
在HTML流关闭之前，覆盖此成员函数来执行某个操作。

请参阅：CHtmlStream::Abort, CHtmlStream::Reset


 CHtmlStream::Detach

BYTE* Detach( );

返回值：指向包含HTML流内容的内存块指针。

说明：
调用此成员函数，获取一个被CHtmlStream使用的内存块指针。
调用此成员函数也关闭CHtmlStream。可调用Attach重新将内存块附加给CHtmlStream。如果想重新附加文件并使用其内容，应在调用之前先使用GetStreamSize获取文件长度。注意，如果你将一个内存块附加给CHtmlStream并可使用其数据（nGrowBytes==0）,则不可增加内存。

请参阅：CHtmlStream::Attach


 CHtmlStream::Free

virtual void Free(BYTE* lpMem);

参数：
lpMem 指向将被解除分配的内存。

说明：
由框架调用以释放内存。覆盖此函数，执行常用的内存释放功能。如果覆盖了此函数，则Alloc和Realloc也应被覆盖。

请参阅：CHtmlStream::Alloc, CHtmlStream::Realloc


 CHtmlStream::GetStreamSize

DWORD GetStreamSize( ) const;

返回值：文件长度。

说明：
调用此成员函数，获取HTML流的字节长度。

请参阅：CHtmlStream::m_nStreamSize, CHtmlStream::GrowStream


 CHtmlStream::GrowStream

virtual void GrowStream(DWORD dwNewLen);

参数：
dwNewLen 内存文件的新大小。

说明：
框架调用此成员函数来扩展内存。如果想改变CHtmlStream扩展内存的方式，可以覆盖它。缺省时调用Realloc来增加一个已存在的块（或用Alloc来构造一个内存块）。
分配一个由构造函数或Attach调用指定nGrowBytes值大小的内存。

请参阅：CHtmlStream::m_nStreamSize, CHtmlStream::GetStreamSize


 CHtmlStream::InitStream

virtual void InitStream( );

说明：
框架调用此成员函数初始化一个CHtmlStream。覆盖此函数进行各种初始化，例如覆盖它，指定常用的HTML标头。

请参阅：CHtmlStream::CHtmlStream


 CHtmlStream::Memcpy

virtual BYTE* Memcpy(BYTE* lpMemTarget, const BYTE* lpMemSource, UINT nBytes);

返回值：lpMemTarget的备份。

参数：
lpMemTarget | 资源内存被拷贝到的内存块的指针。
lpMemSource | 资源内存块指针。
nBytes | 被拷贝的字节数。

说明：
用于从流中传送数据。如果想改变CHtmlStream进行内存拷贝的方式，可覆盖此成员函数。


 CHtmlStream::Realloc

virtual BYTE* Realloc( BYTE* lpMem, DWORD nBytes );

返回值：
一个指向被重新分配（同时也可能被移动）的内存块的指针，或者如果重新分配失败，则为NULL。

参数：
lpMem | 一个指向将被重新分配的内存块的指针。
nBytes | 新的内存块大小。

说明：
被框架调用，用以重新分配内存。覆盖该函数以实现定制的内存重新分配。如果覆盖该函数，有可能也要覆盖 Alloc和Free。

请参阅：CHtmlStream::Free, CHtmlStream::Alloc


 CHtmlStream::Reset

virtual void Reset( );

说明：
被框架调用，用以清空某一先前初始化的CHtmlStream对象。覆盖此成员函数，用以在清空某一CHtmlStream对象之前指定一个特殊的操作。

请参阅：CHtmlStream::Close, CHtmlStream::Abort


 CHtmlStream::Write

virtual void Write( const void* lpBuf, UINT nCount );

参数：
lpBuf | 一个指向用户提供的包含将要被写入流中的数据的缓冲区的指针。
nCount | 将从缓冲区传输出的字节数。

说明：
被框架调用，用来从一个缓冲区写数据到与CHtmlStream对象相关联的流之中。

请参阅：CHtmlStream::operator <<


 CHtmlStream::m_nStreamSize

说明：
包含一个HTML流的大小。m_nStreamSize是一个UINT类型的保护变量。当需要覆盖一些函数，如Alloc，Free和GrowStream时，只需参考该变量。

请参阅：CHtmlStream::GetStreamSize, CHtmlStream::GrowStream


 CHtmlStream::operator <<

CHtmlStream& operator<<( LPCTSTR psz );
CHtmlStream& operator<<( short int w );
CHtmlStream& operator<<( long int dw );
CHtmlStream& operator<<( const CHtmlStream& stream);
CHtmlStream& operator<<( double d );
CHtmlStream& operator<<( float f );
CHtmlStream& operator<<( const CByteArray& array );
CHtmlStream& operator<<( const CLongBinary& blob );

说明：
CHtmlStream的插入(<<)操作符将指定的字符串或整数写入HTML流中。该操作符将字符串不作任何更改地写入。而对整数覆盖，则在写入前将之转化为十进制形式。
可以使用CHtmlStream&覆盖该函数，从而将一个HTML流的内容添加到另一个中。

请参阅：CHtmlStream::Write


 CHtmlView

CObject
└CCmdTarget
└CWnd
└CView
└CScrollView
└CFormView
└CHtmlView

CHtmlView类在文档/视图结构的上下文中提供WebBrowser控件的功能。WebBrowser控件是客户可浏览网址以及本地文件系统和网络文件夹的窗口。WebBrowser控件支持超级链接、统一资源定位符（URL）导航器并维护一张历史列表。

在MFC应用中使用CHtmlView类
在标准框架应用中（基于SDI或MDI），视图对象通常由指定的系列的类派生。这些类都由CView派生，提供高于CView提供的指定功能。
基于CHtmlView的应用视图类用WebBrowser控件提供视图。这使此应用成为一个网络浏览器。创建网络浏览器的更好方法是使用MFC AppWizard，并将CHtmlView指定为视图类。要了解在MFC应用中实现和使用WebBrowser控件的信息，请参阅“WebBrowser风格的应用”。CHtmlView的功能是为访问网络（和/或HTML文件）的应用而设计的。下列CHtmlView成员函数只适用于Internet Explorer应用。这些函数可以替代WebBrowser控件，但它们无可见的效果。
·GetAddressBar
·GetFullName
·GetStatusBar
·SetAddressBar
·SetFullScreen
·SetMenuBar
·SetStatusBar
·SetToolBar
#include <afxhtml.h>
请参阅：联机文档“平台SDK”中的IWebBrowser2。

CHtmlView类的成员

属性
GetType | 获取文档对象的类型名
GetLeft | 获取Internet Explorer 主窗口的左边缘的屏幕坐标
SetLeft | 设置Internet Explorer 主窗口的水平位置
GetTop | 获取Internet Explorer 主窗口的上边缘的屏幕坐标
SetTop | 设置Internet Explorer 主窗口的垂直位置
GetHeight | 获取Internet Explorer 主窗口的高度
SetHeight | 设置Internet Explorer 主窗口的高度
SetVisible | 设置表示对象是可见还是隐藏的值
GetVisible | 获取表示对象是可见还是隐藏的值
GetLocationName | 获取WebBrowser当前显示的资源名
GetReadyState | 获取WebBrowser的就绪状态
GetOffline | 获取确定控件是否离线的值
SetOffline | 设置确定控件是否离线的值
GetSilent | 指示所有对话框是否能显示出来
SetSilent | 设置确定控件是否显示在对话框的值
GetTopLevelContainer | 获取指示当前对象是否是WebBrowser控件的顶级包容器的值
GetLocationURL | 获取WebBrowser当前显示的资源的URL
GetBusy | 获取指示是否下载或其它活动仍在处理中的值
GetApplication | 获取代替包含当前Internet Explorer应用实例的应用的应用对象
GetParentBrowser | 获取指向Idispatch界面的指针
GetContainer | 获取WebBrowser控件的包容器
GetHtmlDocument | 获取活动的HTML文档
GetFullName | 获取显示在WebBrowser中（忽略WebBrowser，只考虑Internet Explorer）的资源的全名，包括路径
GetToolBar | 获取确定工具条是否可见的值
SetToolBar | 设置确定工具条是否可见的值（忽略WebBrowser，只考虑Internet Explorer）
GetMenuBar | 获取确定菜单条是否可见的值
SetMenuBar | 设置确定菜单条是否可见的值（忽略WebBrowser，只考虑Internet Explorer）
GetFullScreen | 指示WebBrowser控件正操作在全屏模式还是普通窗口模式
SetFullScreen | 设置指示WebBrowser控件正操作在全屏模式还是普通窗口模式的值（忽略WebBrowser，只有Internet Explorer）
QueryStatusWB | 对正由WebBrowser控件执行的命令的状态的查询
GetRegisterAsBrowser | 指示是否WebBrowser控件为目标名字的分解而登录为一个顶级浏览器
SetRegisterAsBrowser | 设置指示是否WebBrowser控件为目标名字的分解而登录为一个顶级浏览器的值
GetRegisterAsDropTarget | 指示是否WebBrowser控件为导航登录为一个落放目标
SetRegisterAsDropTarget | 设置指示是否WebBrowser控件为导航登录为一个落放目标的值
GetTheaterMode | 指示WebBrowser控件是否为影院模式
SetTheaterMode | 设置指示WebBrowser控件是否为影院模式的值
GetAddressBar | 确定Internet Explorer对象地址条是否可见（忽略WebBrowser，只考虑Internet Explorer）
SetAddressBar | 显示或隐藏Internet Explorer对象地址条（忽略WebBrowser，只考虑Internet Explorer）
GetStatusBar | 指示Internet Explorer对象地址条是否可见（忽略WebBrowser，只考虑Internet Explorer）
SetStatusBar | 设置指示Internet Explorer对象地址条是否可见的值（忽略WebBrowser，只考虑Internet Explorer）

操作
GoBack | 导航到历史列表的前一项
GoForward | 导航到历史列表的下一项
GoHome | 导航到当前主页或起始页
GoSearch | 导航到当前查找页
Navigate | 导航到由URL标识的资源
Navigate2 | 导航到由URL标识的资源，或由完整路径标识的文件
Refresh | 重载当前文件
Refresh2 | 重载当前文件并避免“pragma:nocache”标题被发送
Stop | 停止打开文件
PutProperty | 设置与指定对象有关的特性值
GetProperty | 获取与指定对象有关的特性的当前值
ExecWB | 执行一个命令
LoadFromResource | 装载WebBrowser控件中的资源

可覆盖的函数
OnDraw | 调用使一个图象屏幕显示打印或者打印先前值。需要实现
Create | 创建WebBrowser控件
OnNavigateComplete2 | 在到一个超级链接的导航完成后调用（窗口或框架元素）
OnBeforeNavigate2 | 在导航发生在指定WebBrowser中之前调用（窗口或框架元素）
OnStatusTextChange | 调用以通知一个应用：与WebBrowser控件有关的状态条文本已改变
OnProgressChange | 调用以通知一个应用：下载操作的过程被更新
OnCommandStateChange | 调用以通知一个应用：WebBrowser控件的有效状态被改变
OnDownloadBegin | 调用以通知一个应用：导航操作开始了
OnDownloadComplete | 当导航操作结束、中断或失败时调用
OnTitleChange | 调用以通知一个应用：是否WebBrowser控件的文档标题有效或改变
OnPropertyChange | 调用以通知一个应用：PutProperty方法已经改变了特性的值
OnNewWindow2 | 当新窗口被创建来显示资源时被调用。
OnDocumentComplete | 调用以通知一个应用：文档已达到READYSTATE_COMPLETE状态
OnQuit | 调用以通知一个应用：Internet Explorer 应用准备退出（只适用于Internet Explorer）
OnVisible | 当WebBrowser控件窗口应被显示/隐藏时调用
OnToolBar | 当ToolBar特性改变时被调用
OnMenuBar | 当MenuBar特性改变时被调用
OnStatusBar | 当StatusBar特性改变时被调用
OnFullScreen | 当FullScreen特性改变时被调用
OnTheaterMode | 当TheaterMode特性改变时被调用


 CHtmlView::Create

virtual BOOL Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID,
CCreateContext* pContext = NULL
);

参数：
lpszClassName | 指向命名Windows类的空终止字符串。类名可为任意用AfxRegisterWndClass全局函数或RegisterClass Windows函数登记的名称。如果为NULL，则使用预定义的缺省CFrameWnd属性。
lpszWindowName | 指向代表窗口名的空终止字符串。
dwStyle | 确定窗口风格属性。缺省时，WS_VISIBLE和WS_CHILD Windows被设置。
rect | 确定窗口大小和位置的RECT结构的参考。
rectDefault | 值允许Windows确定新窗口的大小和位置。
pParentWnd | 指向控件的父窗口。
nID | 视图的ID号。缺省设置为AFX_IDW_PANE_FIRST。
pContext | 指向CCreateContext的指针。缺省为NULL。

说明：
调用此成员函数创建Internet Explorer可执行的WebBrowser控件或包容器。


 CHtmlView::ExecWB

void ExecWB( OLECMDID cmdID, OLECMDEXECOPT cmdexecopt, VARIANT* pvaIn, VARIANT* pvaOut);

参数：
cmdID | 执行的命令。
cmdexecopt | 执行此命令的选项设置。
pvaIn | 用于确定命令输入参数的变量。
pvaOut | 用于确定命令输出参数的变量。

说明：
调用此成员函数以执行Internet Explorer或WebBrowser的命令。请参阅联机文档“平台SDK”中的IWebBrowser2::ExecWB。

请参阅：CHtmlView::Stop


 CHtmlView::GetAddressBar

BOOL GetAddressBar() const;

返回值：
如果地址条可见，则返回非零值，否则为0。

说明：
调用此成员函数以获得Internet Explorer的地址条。
适用于Internet Explorer。如果与一个WebBrowser控件一起使用此调用，则不返回错误，但它将忽略此调用。

请参阅：
CHtmlView::SetAddressBar, IWebBrowser2::get_AddressBar


 CHtmlView::GetApplication

LPDISPATCH GetApplication() const;

返回值：
指向活动的文档对象的IDispatch界面的指针。

说明：
调用此成员函数以获得由包含WebBrowser控件的应用支持的自动生成的对象。
适用于Internet Explorer和WebBrowser。

请参阅：IWebBrowser2::get_Application


 CHtmlView::GetBusy

BOOL GetBusy()const;

返回值：
如果WebBrowser忙，则返回非零值，否则为0。

说明：
调用此成员函数以Internet Explorer或WebBrowser决定WebBrowser控件是否正忙于导航或下载操作。
适用于Internet Explorer和WebBrowser。

请参阅：IWebBrowser2::get_Busy


 CHtmlView::GetContainer

LPDISPATCH GetContainer() const;

返回值：
指向活动的文档对象的IDispatch界面的指针。

说明：
调用此成员函数以获得WebBrowser包容器赋值的对象。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::GetTopLevelContainer, IWebBrowser2::get_Container


 CHtmlView::GetFullName

CString GetFullName() const;

返回值：
一个CString对象，包含当前显示文件的路径和名字。如果无路径和文件名称存在，则GetFullName返回空的CString。

说明：
调用此成员函数以获得Internet Explorer当前显示的文件的全路径。
适用于Internet Explorer。如果与一个WebBrowser控件一起使用此调用，则不返回错误，但它将忽略此调用。

请参阅：IWebBrowser2::get_FullName


 CHtmlView::GetFullScreen

BOOL GetFullScreen() const;

返回值：
如果WebBrowser正运行于全屏模式，则返回非零值，否则为0。

说明：
调用此成员函数以决定WebBrowser正运行于全屏模式还是普通窗口模式。在全屏模式下，Internet Explorer主窗口最大化、状态条、工具条、菜单条和标题条被隐藏。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::SetFullScreen, IWebBrowser2::get_FullScreen, FullScreen property


 CHtmlView::GetHeight

long GetHeight() const;

返回值：控件的框架窗口高度，以像素为单位。

说明：
调用此成员函数以获得WebBrowser控件的框架窗口高度，以像素为单位。

请参阅：CHtmlView::SetHeight


 CHtmlView::GetHtmlDocument

LPDISPATCH GetHtmlDocument() const;

返回值：
指向活动的文档对象的IDispatch界面的指针。

说明：
调用此成员函数以获得活动文档的HTML文档。
适用于Internet Explorer和WebBrowser。

请参阅：IWebBrowser2::get_Document


 CHtmlView::GetLeft

long GetLeft() const;

返回值：用像素表示的左边距。

说明：
调用此成员函数以获得内部的WebBrowser控件及其包容器的左边缘之间的距离。
适用于Internet Explorer和WebBrowser。

请参阅：CHtmlView::SetLeft, IWebBrowser2::get_Left


 CHtmlView::GetLocationName

CString GetLocationName() const;

返回值：
一个CString对象，包含当前显示在WebBrowser中的资源名。

说明：
调用此成员函数以获得当前显示在WebBrowser中的资源名。如果资源为World Wide Web的HTML页，名字就为此页的标题。如果资源为网络或当地计算机的文件夹或文件，名字就为UNC或者文件夹或文件的全名。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::GetLocationURL, IWebBrowser2::get_LocationName


 CHtmlView::GetLocationURL

CString GetLocationURL() const;

返回值：
一个CString对象，包含当前显示在WebBrowser中的资源的URL。

说明：
调用此成员函数以获得当前显示在WebBrowser中的资源的URL。如果资源为网络或当地计算机的文件夹或文件，名字就为UNC或者文件夹或文件的全名。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::GetLocationName, IWebBrowser2::get_LocationURL


 CHtmlView::GetMenuBar

BOOL GetMenuBar() const;

返回值：如果菜单条可见，则返回非零值，否则为0。

说明：
调用此成员函数以确定菜单条是否可见。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::SetMenuBar, IWebBrowser2::get_MenuBar


 CHtmlView::GetOffline

BOOL GetOffline() const;

返回值：
如果WebBrowser当前离线，则返回非零值，否则为0。

说明：
调用此成员函数以确定WebBrowser是否正离线操作。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::SetOffline, IWebBrowser2::get_Offline


 CHtmlView::GetParentBrowser

LPDISPATCH GetParentBrowser() const;

返回值：
指向WebBrowser控件的父对象的IDispatch界面的指针。

说明：
调用此成员函数以获得指向WebBrowser控件的父对象的指针。
适用于Internet Explorer和WebBrowser。

请参阅：IWebBrowser2::get_Parent


 CHtmlView::GetProperty

BOOL GetProperty(LPCTSTR lpszProperty, CString& strValue);
COleVariant GetProperty( LPCTSTR lpsz);

返回值：
在第一个版本中，若成功结束，则为非零值，否则为0。在第二个版本里，是COleVariant对象。

参数：
lpszProperty | 指向包含所获得特性的字符串的指针。
strValue | 接收特性的当前值的CString对象的参考。
lpsz | 指向包含所获得特性的字符串的指针。

说明：
调用此成员函数以获得当前与控件有关的特性值。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::PutProperty, IWebBrowser2::Get_Property


 CHtmlView::GetReadyState

READYSTATE GetReadyState() const;

返回值：
一个联机文档“平台SDK”中描述的READYSTATE值。

说明：
调用此成员函数以获得WebBrowser对象的就绪状态。
适用于Internet Explorer和WebBrowser。

请参阅：IWebBrowser2::get_ReadyState


 CHtmlView::GetRegisterAsBrowser

BOOL GetRegisterAsBrowser() const;

返回值：
如果浏览器注册为顶级浏览器，则返回非零值，否则为0。

说明：
调用此成员函数来确定WebBrowser对象是否注册为顶级浏览器以解决目标名。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::SetRegisterAsBrowser, IWebBrowser2::get_RegisterAsBrowser


 CHtmlView::GetRegisterAsDropTarget

BOOL GetRegisterAsDropTarget() const;

返回值：
如果浏览器注册为落放目标，则返回非零值，否则为0。

说明：
调用此成员函数来确定WebBrowser控件是否注册为导航的落放目标。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::SetRegisterAsDropTarget, IWebBrowser2::get_RegisterAsDropTarget


 CHtmlView::GetSilent

BOOL GetSilent() const;

返回值：
如果对话框不能从WebBrowser控件中显示，则返回非零值，否则为0。

说明：
调用此成员函数以确定是否有对话框能在WebBrowser控件中显示。
适用于Internet Explorer和WebBrowser。

请参阅：CHtmlView::SetSilent, IWebBrowser2::get_Silent


 CHtmlView::GetStatusBar

BOOL GetStatusBar() const;

返回值：
如果状态条能显示，则返回非零值，否则为0。

说明：
调用此成员函数以确定WebBrowser控件是否显示状态条。
适用于Internet Explorer。如果将此调用与WebBrowser控件一起使用，则不返回错误，但它将忽略此调用。

请参阅：
CHtmlView::SetStatusBar, IWebBrowser2::get_StatusBar


 CHtmlView::GetTheaterMode

BOOL GetTheaterMode() const;

返回值：
如果Web浏览器是影院模式，则返回非零值，否则为0。

说明：
调用此成员函数以确定Web浏览器是否为影院模式。当Web浏览器为影院模式，浏览器主窗口充满全屏，工具条和导航工具的最小设置出现，状态条出现在屏幕的右上角。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::SetTheaterMode, CHtmlView::SetFullScreen, IWebBrowser2::get_TheaterMode


 CHtmlView::GetToolBar

int GetToolBar() const;

返回值：
指示工具条是否是可见的值。如果工具条可见，则返回非零值，否则为0。

说明：
调用此成员函数以确定工具条是否可见。

请参阅：
CHtmlView::SetToolBar, IWebBrowser2::get_ToolBar


 CHtmlView::GetTop

long GetTop() const;

返回值：
接收主窗口上边缘的屏幕坐标的变量地址。

说明：
调用此成员函数以获得WebBrowser控件主窗口上边缘的屏幕坐标。
适用于Internet Explorer和WebBrowser。

请参阅：CHtmlView::SetTop


 CHtmlView::GetTopLevelContainer

BOOL GetTopLevelContainer() const;

返回值：
如果包容器是顶级包容器，则返回非零值，否则为0。

说明：
调用此成员函数以确定Internet Explorer是否为WebBrowser控件的顶级包容器。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::GetContainer, IWebBrowser2::get_TopLevelContainer


 CHtmlView::GetType

CString GetType() const;

返回值：
包含着有所包含的活动文档的类型名的CString对象。

说明：
调用此成员函数以获得所包含的活动文档的类型名。
适用于Internet Explorer和WebBrowser。

请参阅：IWebBrowser2::get_Type


 CHtmlView::GetVisible

BOOL GetVisible() const;

返回值：
如果对象可见，则返回非零值，否则为0。

说明：
调用此成员函数以确定所包含的对象是否可见。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::SetVisible, IWebBrowser2::get_Visible


 CHtmlView::GoBack

void GoBack() ;

说明：
在历史列表中向后导航一项。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::GoForward, CHtmlView::GoHome, IWebBrowser2::GoBack


 CHtmlView::GoForward

void GoForward();

说明：在历史列表中向前导航一项。
请参阅：
CHtmlView::GoBack, CHtmlView::GoHome, IWebBrowser2::GoForward


 CHtmlView::GoHome

void GoHome() ;

说明：
导航到当前或起始页，这是Internet Explorer Internet Options对话框或Internet Properties对话框中指定的，可从Control Panel中访问。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::GoForward, CHtmlView::GoBack, IWebBrowser2::GoHome


 CHtmlView::GoSearch

void GoSearch() ;

说明：
导航到当前查找页，这是Internet Explorer Internet Options对话框或Internet Properties对话框中指定的，可从Control Panel中访问。
适用于Internet Explorer和WebBrowser。

请参阅：CHtmlView::GoHome, IWebBrowser2::GoSearch


 CHtmlView::LoadFromResource

BOOL LoadFromResource(LPCTSTR lpszResource);
BOOL LoadFromResource(UINT nRes);

返回值：如果成功，则返回非零值，否则为0。

参数：
lpszResource | 指向包含要装载的资源名的字符串的指针。
nRes | 包含装载的资源名的缓冲区的ID。

说明：
调用此成员函数以向WebBrowser控件装载指定的资源。
适用于Internet Explorer和WebBrowser。


 CHtmlView::Navigate

void Navigate(LPCTSTR URL,
DWORD dwFlags = 0,
LPCTSTR lpszTargetFrameName = NULL,
LPCTSTR lpszHeaders = NULL,
LPVOID lpPostData = NULL,
DWORD dwPostDataLen = 0
);

参数：
URL | 包含要导航到的URL，或包含要显示的文件全路径的调用者重新分配字符串。
dwFlags | 确定是否添加资源到历史列表，是否从缓存读或写，是否在新窗口中显示资源的变量标记。此变量可是由BrowserNavConstants枚举值定义的值的组合。
lpszTargetFrameName | 指向包含显示资源框架名字的字符串的指针。
lpszHeaders | 指向确定发送到服务器的HTTP标题的值的指针。这些标题添加到缺省的Internet Explorer标题中。这些标题能确定服务器所需的操作，传递到服务器的数据类型或状态代码。如果URL不是HTTPURL，此参数被忽略。
lpvPostData | 指向与HTTP POST事务一起发送的数据的指针。例如，POST事务用于发送由HTML表格收集的数据。如果此参数不确定任何邮递数据，Navigate发布一个HTTP GET 事务。如果URL不是HTTPURL，此参数被忽略。
dwPostDataLen | 与HTTP POST事务一起发送的数据。例如，POST事务用于发送由HTML表格收集的数据。如果此参数不确定任何邮递数据，Navigate发布一个HTTP GET 事务。如果URL不是HTTP URL，此参数被忽略。

说明：
调用此成员函数以导航到由URL确定的资源。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::Navigate2, IWebBrowser2::Navigate


 CHtmlView::Navigate2

void Navigate2(LPITEMIDLIST plDL, DWORD dwFlags = 0, LPCTSTR lpszTargetFrameName = NULL);
void Navigate2(LPCTSTR lpszURL,
DWORD dwFlags = 0,
LPCTSTR lpszTargetFrameName = NULL,
LPCTSTR lpszHeaders = NULL,
LPVOID lpvPostData = NULL,
DWORD dwPostDataLen = 0
);
void Navigate2(LPCTSTR lpszURL,
DWORD dwFlags,
CByteArray& baPostedData,
LPCTSTR lpszTargetFrameName = NULL,
LPCTSTRlpszHeader = NULL
);

参数：
pIDL | 指向ITEMIDLIST结构的指针。
dwFlags | 确定是否添加资源到历史列表，是否从缓存读或写，是否在新窗口中显示资源的变量标记。此变量可是由BrowserNavConstants枚举值定义的值的组合。
lpszTargetFrameName | 指向包含显示资源的框架的名字的字符串的指针。
lpszURL | 指向包含URL字符串的指针。
lpvPostData | 指向与HTTP POST事务一起发送的数据的指针。例如，POST事务用于发送由HTML表格收集的数据。如果此参数不确定任何邮递数据，Navigate发布一个HTTP GET 事务。如果URL不是HTTPURL，此参数被忽略。
dwPostDataLen | 由lpvPostData参数指向的数据的字节长。
lpszHeaders | 指向确定发送到服务器的HTTP标题的值的指针。这些标题添加到缺省的Internet Explorer标题中。这些标题能确定服务器所需的操作，传递到服务器的数据类型或状态代码。如果URL不是HTTPURL，此参数被忽略。
BaPostedData | CByteArray对象的参考。

说明：
调用此成员函数以导航到由URL确定的资源，或由全路径确定的文件。此成员函数通过支持浏览由参数pIDL替代的指定文件夹，如Desktop和My Computer来扩展Navigate成员功能。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::Navigate, IWebBrowser2::Navigate2


 CHtmlView::OnBeforeNavigate2

virtual OnBeforeNavigate2(LPCTSTR lpszURL,
DWORD nFlags,
LPCTSTR lpszTargetFrameName,
CByteArray& baPostedData,
LPCTSTR lpszHeaders,
BOOL* pbCancel
);

参数：
lpszURL | 指向包含导航到的URL的字符串的指针。
nFlags | 保留以备用。
lpszTargetFrameName | 包含显示资源的框架名的字符串，或者，若没有命名了的框架作为资源的目标，则为NULL。
baPostedData | 如果HTTP POST事务正被使用，为包含发送到服务器的数据的CByteArray对象的参考。
lpszHeaders | 指向包含发送到服务器（只有HTTP URL）的附加HTTP标题的字符串的指针。标题可确定服务器所需的操作，正传递给服务器的数据类型或状态代码。
pbCancel | 指向忽略标记的指针。一个应用可设置此参数为非零以忽略导航操作，或为0以允许其进行。

说明：
此成员函数被框架调用，在导航发生在Web浏览器之前激活失败事件。

请参阅：
CHtmlView::Navigate, CHtmlView::Navigate2, DWebBrowserEvents2::BeforeNavigate2


 CHtmlView::OnCommandStateChange

virtual OnCommandStateChange(long nCommand, BOOL bEnable);

参数：
nCommand | 有效状态被改变了的命令标识符。
bEnable | 有效状态。如果命令有效则此参数，则为非零值，否则为0。

说明：
此成员函数被框架调用，通知应用此Web浏览器命令的有效状态被改变。

请参阅：
CHtmlView::GetReadyState, DWebBrowserEvents2::CommandStateChange


 CHtmlView::OnDocumentComplete

virtual void OnDocumentComplete(LPCTSTR lpszURL);

参数：
lpszURL 指向相当于导航到的URL，UNC文件名称或PIDL（指向项标识符列表的指针）的字符串的指针。

说明：
此成员函数被框架调用，通知应用一个文档已达到READYSTATE_COMPLETE状态。
不是所有框架都可激活此事件，但每个产生OnDownloadBegin事件的框架将激活，相应的OnDocumentComplete事件。
由lpszURL指示的URL可以与浏览器导航到的URL不同，因为此URL是标准授权的URL。例如，若一个应用在对Navigate或Navigate2确定一个"www. microsoft.com"的URL，由OnNavigateComplete2传递的URL将为"http://www. microsoft.com/"。而且，若服务器已使浏览器指向不同的URL，此重指向的URL将映射到这里。请参阅CHtmlView::GetHtmlDocument, DWebBrowserEvents2::DocumentComplete


 CHtmlView::OnDownloadBegin

virtual void OnDownloadBegin();

说明：
此成员函数被框架调用，开始下载一个文档。此事件在OnBeforeNavigate2事件后不久被激活，除非导航取消。任何包容器需要显示的动画或“busy”指示应与此事件联系。

请参阅：
CHtmlView::OnDownloadComplete, CHtmlView::Navigate, CHtmlView::Navigate2, DWebBrowserEvents2::DownloadBegin


 CHtmlView::OnDownloadComplete

virtual void OnDownloadComplete();

说明：
此成员函数被框架调用，指示导航操作结束、中断或失败。请参阅CHtmlView::OnDownloadBegin, DWebBrowserEvents2::DownloadComplete


 CHtmlView::OnDraw

virtual void OnDraw(CDC* pDC);

参数：
pDC 指向用于播放图象的设备上下文的指针。

说明：
此成员函数被框架调用以绘制视图。
适用于Internet Explorer和WebBrowser。


 CHtmlView::OnFullScreen

virtual void OnFullScreen(BOOL bFullScreen);

参数：
bFullScreen 如果Internet Explorer为全屏模式，则为非零值，否则为0。

说明：
当全屏特性改变时，此成员函数被框架调用。

请参阅：
CHtmlView::GetFullScreen, CHtmlView::SetFullScreen, DWebBrowserEvents2::OnFullScreen


 CHtmlView::OnMenuBar

virtual void OnMenuBar(BOOL bMenuBar);

参数：
bMenuBar 如果Internet Explorer菜单条可见，则为非零值，否则为0。

说明：
当菜单条特性被改变时，此成员函数被框架调用。

请参阅：
CHtmlView::GetMenuBar, CHtmlView::SetMenuBar, DWebBrowserEvents2::OnMenuBar


 CHtmlView::OnNavigateComplete2

virtual void OnNavigateComplete2(LPCTSTR strURL);

参数：
strURL 相当于导航到的URL，UNC文件名称或PIDL（指向项标识符列表的指针）的字符串表达式。

说明：
当到超级链接的导航结束后（窗口或框架元素），此成员函数被框架调用。
如果外壳命名为无URL表示的空间实体，URL参数可以是PIDL。注意，包含在strURL中的URL可以与浏览器导航到的URL不同，因为此URL 是标准的授权的URL。例如，若一个应用在对Navigate或Navigate2确定一个“www.microsoft.com”的URL，由OnNavigateComplete2传递的URL 将为“http://www.microsoft.com/”。而且，若服务器已使浏览器指向不同的URL，此重指向的URL将映射到这里。

请参阅：DWebBrowserEvents2::NavigateComplete2


 CHtmlView::OnNewWindow2

virtual void OnNewWindow2(LPDISPATCH* ppDisp, BOOL* Cancel);

参数：
ppDisp | 指向界面指针的指针，任选地接收新的WebBrowser或InternetExplorer的IDispatch界面指针。
Cancel | 指向一个取消标记的指针。应用可设置此参数为非零来取消导航操作，或设置为0来允许其进行。

说明：
当新窗口被创建来显示资源时，此成员函数被框架调用。此事件从WebBrowser中创建新的窗口。

请参阅：DWebBrowserEvents2::NewWindow2


 CHtmlView::OnProgressChange

virtual void OnProgressChange(long nProgress, long nProgressMax);

参数：
nProgress | 显示的总进度量，当进度完成时，为-1。
nProgressMax | 最大进度值。

说明：
此成员函数被框架调用来通知应用：下载操作进度已被更新。
包容器可使用此事件提供的信息来显示下载的字节数或更新进度指示器。

请参阅：
CHtmlView::GetBusy, DWebBrowserEvents2::ProgressChange, CProgressCtrl


 CHtmlView::OnPropertyChange

virtual void OnPropertyChange(LPCTSTR lpszProperty);

参数：
lpszProperty 指向包含特性名的字符串的指针。

说明：
此成员函数被框架调用来通知应用：PutProperty已改变了特性值。

请参阅：
CHtmlView::GetProperty, DWebBrowserEvents2::PropertyChange


 CHtmlView::OnQuit

virtual void OnQuit();

说明：
此成员函数被框架调用来通知应用：Internet Explorer应用准备退出。

请参阅：DWebBrowserEvents2::OnQuit


 CHtmlView::OnStatusBar

virtual void OnStateBar(BOOL bStatesBar);

参数：
bStatesBar 如果Internet Explorer状态条可见，则为非零值，否则为0。

说明：
当SetStatusBar特性已改变时，此成员函数被框架调用。

请参阅：
CHtmlView::GetStatusBar, CHtmlView::SetStatusBar, DWebBrowserEvents2::OnStateBar


 CHtmlView::OnStatusTextChange

virtual void OnStatusTextChange(LPCTSTR lpszText);

参数：
lpszText 包含状态条主题的字符串。

说明：
此成员函数被框架调用来通知应用：与WebBrowser控件有关的状态条主题已被改变。

请参阅：DWebBrowserEvents2::StatusTextChange


 CHtmlView::OnTheaterMode

virtual void OnTheaterMode(BOOL bTheaterMode);

参数：
bTheaterMode 如果Internet Explorer是影院模式，则为非零值，否则为0。

说明：
当TheaterMode特性已被改变时，此成员函数被框架调用。

请参阅：
CHtmlView::GetTheaterMode, CHtmlView::SetTheaterMode, DWebBrowserEvents2::OnTheaterMode


 CHtmlView::OnTitleChange

virtual void OnTitleChange(LPCTSTR lpszText);

参数：
lpszText 新的文件标题。

说明：
此成员函数被框架调用来通知应用是否WebBrowser控件中的文档标题变得有效或改变。
对HTML标题可能改变；当HTML仍在下载，文档的URL设置为标题。当真正的标题（若存在）从HTML文法分析映射出来后，此标题被改变以反映真正的标题。

请参阅：DWebBrowserEvents2::TitleChange


 CHtmlView::OnToolBar

virtual void OnToolBar(BOOL bToolBar);

参数：
bToolBar 如果Internet Explorer工具条可见，则为非零值，否则为0。

说明：
当工具条特性已改变时，此成员函数被框架调用。

请参阅：
CHtmlView::GetToolBar, CHtmlView::SetToolBar, DWebBrowserEvents2::OnToolBar


 CHtmlView::OnVisible

virtual void OnVisible(BOOL bVisible);

参数：
bVisible 如果对象可见，则为非零值，否则为0。

说明：
当WebBrowser窗口应被显示或隐藏时，此成员函数被框架调用。这允许对象控件主窗口的行为方式与Internet Explorer一样。

请参阅：
CHtmlView::SetVisible, CHtmlView::GetVisible, DWebBrowserEvents2::OnVisible


 CHtmlView::PutProperty

void PutProperty(LPCTSTR lpszProperty, const VARIANT& vtValue);
void PutProperty(LPCTSTR lpszPropertyName, double dValue);
void PutProperty(LPCTSTR lpszPropertyName, long lValue);
void PutProperty(LPCTSTR lpszPropertyName, LPCTSTR lpszValue);
void PutProperty(LPCTSTR lpszPropertyName, short nValue);

参数：
lpszProperty | 包含所设置特性的字符串。
vtValue | 由lpszProperty指示的特性的新值。
lpszPropertyName | 指向包含所设置特性名的字符串的指针。
dValue | 特性的新值。
lValue | 特性的新值。
lpszValue | 指向包含特性新值的字符串的指针。
nValue | 特性的新值。

说明：
调用此成员函数来设置与指定对象有关的特性。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::GetProperty, IWebBrowser2::PutProperty


 CHtmlView::QueryStatusWB

OLECMDF QueryStatusWB(OLECMDID cmdID) const;

返回值：接收了命令状况的OLECMDF地址。

参数：
cmdID 接收命令状态的OLECMDF值的地址。

说明：
调用此成员函数来查询命令状态。QueryStatusWB实现IOleCommandTtarget::QueryStatus方法的行为。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::ExecWB, IWebBrowser2::QueryStatusWB


 CHtmlView::Refresh

void Refresh();

说明：
重载WebBrowser当前显示的URL或文件。Refresh不包含设置刷新级的参数。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::Refresh2, IWebBrowser2::Refresh


 CHtmlView::Refresh2

void Refresh2(int nLevel);

参数：
nLevel 确定刷新级变量的地址。可能的变量定义在联机文档的“平台SDK”中的RefreshConstants中。

说明：
重载Internet Explorer当前显示的文件。与Refresh不同，Refresh2包含确定刷新级的参数。
适用于Internet Explorer和WebBrowser。

请参阅：IWebBrowser2::Refresh2


 CHtmlView::SetAddressBar

void SetAddressBar(BOOL bNewValue);

参数：
bNewValue 如果显示地址条，则为非零值，否则为0。

说明：
调用此成员函数显示或隐藏Internet Explorer对象的地址条。
适用于Internet Explorer。如果与WebBrowser一起使用此调用，则不返回错误，但它将忽略此调用。

请参阅：
CHtmlView::GetAddressBar, IWebBrowser2::put_AddressBar


 CHtmlView::SetFullScreen

void SetFullScreen(BOOL bNewValue);

参数：
bNewValue 如果是全屏模式，则为非零值，否则为0。

说明：
调用此成员函数设置Internet Explorer为全屏或普通窗口模式。在全屏模式，Internet Explorer主窗口最大化、状态条、工具条、菜单条和标题条被隐藏。
适用于Internet Explorer。如果与WebBrowser一起使用此调用，则不返回错误，但它将忽略此调用。

请参阅：
CHtmlView::GetFullScreen, CHtmlView::SetTheaterMode, IWebBrowser2::put_FullScreen, FullScreen property


 CHtmlView::SetHeight

void SetHeight(long bNewValue);

参数：
bNewValue 主窗口的高度，用像素表示。

说明：
调用此成员函数设置Internet Explorer主窗口的高度。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::GetHeight, IWebBrowser2::put_Height


 CHtmlView::SetLeft

void SetLeft(long bNewValue);

参数：
bNewValue 对齐主窗口左边缘的屏幕。

说明：设置Internet Explorer主窗口的水平位置。

请参阅：
CHtmlView::GetLeft, IWebBrowser2::put_Left


 CHtmlView::SetMenuBar

void SetMenuBar(BOOL bNewValue);

参数：
bNewValue 如果显示菜单条，则为非零值，否则为0。

说明：
调用此成员函数显示或隐藏Internet Explorer菜单条。
适用于Internet Explorer。如果与WebBrowser一起使用此调用，则不返回错误，但它将忽略此调用。

请参阅：
CHtmlView::GetMenuBar, IWebBrowser2::put_MenuBar


 CHtmlView::SetOffline

void SetOffline(BOOL bNewValue);

参数：
bNewValue 从本地缓存中读取，则为非零值，否则为0。

说明：
调用此成员函数设置一个值，指示WebBrowser控件当前是否运行于离线模式。在离线模式下，浏览器从本地缓存而不是源文档中读取HTML页。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::GetOffline, IWebBrowser2::put_Offline


 CHtmlView::SetRegisterAsBrowser

void SetRegisterAsBrowser(BOOL bNewValue);

参数：
bNewValue 确定Internet Explorer是否注册为顶级浏览器。如果非零，WebBrowser注册为顶级浏览器；如果为0，就不是顶级浏览器。缺省值为0。

说明：
调用此成员函数设置一个值，指示WebBrowser控件是否为解决目标名注册为顶级浏览器。顶级浏览器是作为缺省浏览器设置在注册处的浏览器。
适用于Internet Explorer和WebBrowser。请参阅CHtmlView::GetRegisterAsBrowser, IWebBrowser2::put_RegisterAsBrowser


 CHtmlView::SetRegisterAsDropTarget

void SetRegisterAsDropTarget(BOOL bNewValue);

参数：
bNewValue 确定WebBrowser控件是否注册为导航的落放目标。如果为非零值，对象注册为落放目标；如果为0，就不是落放目标。

说明：
调用此成员函数设置一个值，指示WebBrowser控件是否被导航注册为落放目标。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::GetRegisterAsDropTarget, IWebBrowser2::put_RegisterAsDropTarget


 CHtmlView::SetSilent

void SetSilent(BOOL bNewValue);

参数：
bNewValue 如果非零，对话框将不显示；如果为0，对话框将显示。缺省值为0。

说明：
调用此成员函数设置一个值，指示对话框是否显示。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::GetSilent, IWebBrowser2::put_Silent


 CHtmlView::SetStatusBar

void SetStatusBar(BOOL bNewValue);

参数：
bNewValue 如果状态条可见，则为非零值，否则为0。

说明：
调用此成员函数显示状态条。
适用于Internet Explorer。如果与WebBrowser一起使用此调用，则不返回错误，但它将忽略此调用。

请参阅：
CHtmlView::GetStatusBar, IWebBrowser2::put_StatusBar


 CHtmlView::SetTheaterMode

void SetTheaterMode(BOOL bNewValue);

参数：
bNewValue 设置WebBrowser控件为影院模式时，则为非零值，否则为0。缺省值为0。

说明：
调用此成员函数设置一个值，指示WebBrowser控件是否为影院模式。当WebBrowser为影院模式时，浏览器主窗口充满整个屏幕，工具条和最小化的导航工具出现，状态条出现在屏幕的右上角。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::GetTheaterMode, CHtmlView::GetFullScreen, CHtmlView::SetFullScreen


 CHtmlView::SetToolBar

void SetToolBar(int bNewValue);

参数：
bNewValue 指示是否显示工具条。如果工具条将被显示，则为非零值，否则为0。

说明：
调用此成员函数以显示或隐藏Internet Explorer工具条。
适用于Internet Explorer。如果与WebBrowser一起使用此调用，则不返回错误，但它将忽略此调用。

请参阅：
CHtmlView::GetToolBar, IWebBrowser2::put_ToolBar


 CHtmlView::SetTop

void SetTop(long bNewValue);

参数：
bNewValue 与主窗口上边缘对齐的屏幕。

说明：
调用此成员函数设置内部的WebBrowser控件及其包容器上边缘之间的距离。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::GetTop, IWebBrowser2::put_Top


 CHtmlView::SetVisible

void SetVisible(BOOL bNewValue);

参数：
bNewValue 如果控件可见，则为非零值，否则为0。

说明：
调用此成员函数来设置WebBrowser控件的可见性状态。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::GetVisible, IWebBrowser2::put_Visible


 CHtmlView::Stop

void Stop();

说明：
调用此成员函数取消任意挂起的导航或下载操作并停止动态页元素，如背景声音和动画。
适用于Internet Explorer和WebBrowser。

请参阅：
CHtmlView::ExecWB, IWebBrowser2::Stop


 CHttpConnection

CObject
└CInternetConnection
└CHttpConnection

MFC类CHttpConnection管理与HTTP服务器的连接。HTTP是用MFCWinInet类实现的三个Internet服务器协议之中的一个。
类CHttpConnection包含一个构造函数和一个成员函数OpenRequest，使用HTTP协议来管理与服务器的连接。
要与一个HTTP服务器通讯，必须先构造一个CInternetSession的实例，然后构造一个CHttpConnection对象。不能直接构造一个CHttpConnection对象，而是调用CInternetSession::GetHttpConnection，创建CHttpConnection对象并返回其指针。
要了解更多关于CHttpConnection是如何与其它MFC Internet类工作的，请参阅联机文档“Visual C++程序员指南”中的“使用WinInet编写Internet程序”。要了解更多的使用另两个支持Internet的协议:Gopher和FTP来与服务器连接的信息，请参阅类CGopherConnection和CFtpConnection。
#include <afxinet.h>
请参阅：CInternetConnection, CHttpFile, CFtpConnection, CGopherConnection, CInternetConnection

CHttpConnection类的成员

构造函数
CHttpConnection 创建CHttpConnection对象

操作
OpenRequest 打开一个HTTP请求


 CHttpConnection::CHttpConnection

CHttpConnection( );

说明：
调用该成员函数来构造一个CHttpConnection对象。不能直接构造一个CHttpConnection。但是，可以通过调用CInternetSession::GetHttpConnection来构造一个对象。

请参阅：
CInternetSession::GetHttpConnection, CFtpConnection, CGopherConnection, CInternetConnection


 CHttpConnection::OpenRequest

CHttpFile* OpenRequest( LPCTSTR pstrVerb,
LPCTSTR pstrObjectname,
LPCTSTR pstrReferer = NULL,
DWORD dwContext = 1,
LPCTSTR* pstrAcceptTypes = NULL,
LPCTSTR pstrVersion = NULL,
DWORD dwFlags = INTERNET_FLAG_EXISTING_CONNECT
);
CHttpFile* OpenRequest( int nVerb,
LPCTSTR pstrObjectName,
LPCTSTR pstrReferer = NULL,
DWORD dwContext = 1,
LPCTSTR* pstrAcceptTypes = NULL,
LPCTSTR pstrVersion = NULL,
DWORD dwFlags = INTERNET_FLAG_EXISTING_CONNECT
);

返回值：
一个指向所需的CHttpFile对象的指针。

参数：
pstrVerb | 一个指向某个包含在请求中要用的动词的字符串指针。如果为NULL，则使用“GET”。
pstrObjectName | 一个指向某个包含特殊动词的目标对象的字符串的指针。通常为文件名称、可执行模块或者查找标识符。
pstrReferer | 一个指向指定了包含着所需的URL (pstrObjectName)的文档地址（URL)的指针。如果为NULL，则不指定HTTP头。
dwContext | OpenRequest操作的上下文标识符。请参阅说明部分，以了解更多的关于dwContext的信息。
pstrAcceptTypes | 一个指向某空终止符的字符串的指针，该字符串表示客户接受的内容类型。如果该字符串为NULL，服务器认为客户接受“text/*”类型的文档 (也就是说，只有纯文本文档，并且不是图片或其它二进制文件)。内容类型与CGI变量CONTENT_TYPE相同，该变量确定了要查询的含有相关信息的数据的类型，如HTTP POST和PUT。
pstrVersion | 一个指向定义HTTP版本的字符串的指针。如果为NULL，则使用“HTTP/1.0”。dwFlags任意INTERNET_FLAG_*标记的组合。请参阅说明部分，以了解可能的dwFlags值的细节。
nVerb与HTTP请求类型有关的数字。可能为以下值之一：
HTTP请求类型 | nVerb值
HTTP_VERB_POST | 0
HTTP_VERB_GET | 1
HTTP_VERB_HEAD | 2
HTTP_VERB_PUT | 3
HTTP_VERB_LINK | 4
HTTP_VERB_DELETE | 5
HTTP_VERB_UNLINK | 6

说明：
调用该成员函数，用以打开一个HTTP连接。
dwFlags可能为以下值之一：
Internet标记 | 描述
INTERNET_FLAG_RELOAD | 强行从资源服务器下载所需的文件、对象或路径列表，而不是从缓存中
INTERNET_FLAG_DON'T_CACHE | 不向缓存添加返回的实体
INTERNET_FLAG_MAKE_PERSISTENT | 将返回实体作为永久性实体添加到缓存中，这表示标准缓存清空，相容性检查或
INTERNET_FLAG_SECURE | 者垃圾回收都不能从缓存中移出该项使用安全事务语义。使用SSL/PCT的说明只在HTTP请求中才有意义
INTERNET_FLAG_NO_AUTO_REDIRECT | 只与HTTP一起使用，表示改变路径不能在CHttpFile::SendRequest中被自动处理
覆盖dwContext 缺省值，为你所选的值设置一个上下文标识符。上下文标识符与用CInternetSession对象创建的CHttpConnection对象的指定的操作相关联。
该值被返回到CInternetSession::OnStatusCallback中，用以提供其所确定的操作状态。请参阅“Internet初步：WinInet”，以了解有关上下文标识符的更多信息。

请参阅：
CHttpFile, CInternetSession, CFtpConnection, CGopherConnection, CInternetConnection


 CHttpFile

CObject
└CFile
└CStdioFile
└CInternetFile
└CHttpFile

CHttpFile提供向HTTP服务器中请求和读取的功能。
如果Internet会话要从一个HTTP服务器中读取数据，则必须构造一个CHttpFile实例。
要了解CHttpFile如何与其它MFC Internet类一起工作，请参阅联机文档“Visual C++程序员指南”中的“使用WinInet编写Internet程序”。
#include <afxinet.h>
请参阅：CInternetFile, CGopherFile, CHttpConnection

CHttpFile类的成员

构造函数
CHttpFile 构造一个CHttpFile对象

操作
AddRequestHeaders | 添加发往HTTP服务器的请求头
SendRequest | 向HTTP服务器发送请求
SendRequestEx | 利用CInternetFile的Write或WriteString方法向HTTP服务器发送请求
EndRequest | 利用EndRequestEx的成员函数结束HTTP服务器的请求
QueryInfo | 返回来自HTTP服务器的回答或请求头
QueryInfoStatusCode | 获取与HTTP请求相关联的状态号，并将其放到提供的dwStatusCode 参数中
GetVerb | 获取用于对HTTP服务器的请求的动词
GetObject | 获取对HTTP服务器的请求中的动词的目标对象
GetFileURL | 获取指定文件的URL
Close | 关闭CHttpFile并释放其资源


 CHttpFile::AddRequestHeaders

BOOL ADDRequestHeaders( LPCTSTR pstrHeaders, DWORD dwFlags = HTTP_ADDREQ_FLAG_ADD_IF_NEW, int dwHeadersLen = -1 );
BOOL ADDRequestHeaders( CString& str, DWORD dwFlags = HTTP_ADDREQ_FLAG_ADD_IF_NEW );

返回值：
如果成功，则返回非零值，否则为0。如果该调用失败，Win32的函数GetLastError 会被调用，确定失败的原因。

参数：
pstrHeaders | 一个指向某字符串的指针，该字符串包含添加到请求中的头。每个头都必须以CR/LF结束。
dwFlags修改新头部的语义。可能为以下几种之一：
· | HTTP_ADDREQ_FLAG_COALESCE | 利用标记来添加后续头部的第一个头部，从而合并相同名字的头部。例如，“Accept:audio/*”后的“Accept: text/*”导致形成一个唯一的头部“Accept:text/*，audio/*”。考虑到从与合并或独立头一起发送的请求中收到的数据，要靠调用应用来保证一个有内聚力的体制。
· | HTTP_ADDREQ_FLAG_REPLACE | 执行移动和添加，替换当前头。头名称将被用于移动当前头，全值将被用于添加新头。如果头部值为空且头已被找到，则移走它。如果不为空，则头值被替换。
· | HTTP_ADDREQ_FLAG_ADD_IF_NEW | 如果不存在，则只需添加头；如果有一个存在，则出错返回。
· | HTTP_ADDREQ_FLAG_ADD | 与REPLACE一起使用。如果不存在，则添加头。
dwHeadersLen | pstrHeaders的长度，以字符计算。如果为-1L，则pstrHeaders被假定为是空终止的，且长度已被计算出来了。
str | 一个CString对象的参考，包含请求头或者将被添加的头。

说明：
调用该成员函数，用来对HTTP请求操作添加一个或多个请求头。AddRequestHeaders 增加附加的、形式自由的头到HTTP请求操作中。其往往被高级客户使用，他们需要对发往HTTP服务器的指定的请求进行具体控制。
注意：
对于使用HTTP_ADDREQ_FLAG_ADD或者HTTP_ADDREQ_FLAG_ADD_IF_NEW对AddRequestHeaders的调用，应用可在pstrHeaders 或str中，一次传递多个头。如果应用试图使用HTTP_ADDREQ_FLAG_REMOVE或HTTP_ADDREQ _FLAG_REPLACE来移动或替换一个头，则lpszHeaders中只能提供一个头。

请参阅：CInternetFile


 CHttpFile::CHttpFile

CHttpFile( HINTERNET hFile, HINTERNET hSession, LPCTSTR pstrObject, LPCTSTR pstrServer, LPCTSTR pstrVerb, DWORD dwContext );
CHttpFile( HINTERNET hFile, LPCTSTR pstrVerb, LPCTSTR pstrObject, CHttpConnection* pConnection );

参数：
hFile | Internet文件的句柄。
hSession | Internet会话的句柄。
pstrObject | 一个指向包含CHttpFile对象名称的字符串的指针。
pstrServer | 一个指向包含服务器名称的字符串的指针。
pstrVerb | 一个指向某字符串的指针，该字符串包含在发送请求时将要使用的方法，可能为POST，HEAD或GET。
dwContext | 一个CHttpFile对象的上下文标识符。请参阅说明，以了解有关该参数的更多信息。
pConnection | 一个指向CHttpConnection对象的指针。

说明：
调用该成员函数来构造一个CHttpFile对象。
不能直接构造一个CHttpFile对象，但可以调用CInternetSession::OpenURL 或CHttpConnection::OpenRequest。
dwContext的缺省值由MFC从创建此CHttpFile对象的CInternetSession对象发送到CHttpFile对象。当调用CInternetSession::OpenURL 或CHttpConnection 来构造一个CHttpFile对象时，可覆盖此缺省值，来设置你所选择的值的上下文标识符。上下文标识符返回到CInternetSession::OnStatusCallback ，提供其所代表的对象状态。请参阅联机文档“Visual C++程序员指南”中的“Internet初步：WinInet”，以了解有关上下文标识符的更多信息。

请参阅：CInternetFile


 CHttpFile::Close

virtual void Close( );

说明：
关闭CHttpFile 并释放其资源。只有在对SendRequest的成功调用或者一个CHttpFile对象被 OpenURL成功创建后，才能使用该成员函数。

请参阅：CInternetFile


 CHttpFile::EndRequest

BOOL EndRequest(DWORD dwFlags = 0, LPINTERNET_BUFFERS lpBuffln = NULL, DWORD dwContext = 1);
throw(CInternetException);

返回值：
如果成功，则返回非零值，否则为0。如果此调用失败，可通过检查产生的CInternetException对象来确定错误原因。

参数：
dwFlags | 描述此操作的标记。要了解适当标记的列表，请参阅联机文档“平台SDK”中的HttpEndRequest。
lpBuffIn | 指向描述此操作的输入缓冲区的初始INTERNET_BUFFERS的指针。
dwContext | CHttpFile操作的上下文标识符。请参阅说明，以了解此参数的更多信息。

说明：
调用此成员函数来结束用成员函数发送HTTP服务器的请求。
dwContext的缺省值由MFC从创建此CHttpFile对象的CInternetSession对象发送到CHttpFile对象。当调用CInternetSession::OpenURL 或CHttpConnection 来构造一个CHttpFile对象时，可覆盖此缺省值，来设置你所选择的值的上下文标识符。上下文标识符返回到CInternetSession::OnStatusCallback ，提供其所代表的对象状态。请参阅联机文档“Visual C++程序员指南”中的“Internet初步：WinInet”，以了解有关上下文标识符的更多信息。

请参阅：CInternetFile


 CHttpFile::GetFileURL

virtual CString GetFileURL( ) const;

返回值：
一个CString对象，包含一个参照与本文件相关联资源的URL。

说明：
调用该成员函数，得到以URL表示的HTTP文件的名字。只有在对SendRequest的成功调用或者一个CHttpFile对象被OpenURL成功创建后，才能使用该成员函数。

请参阅：CInternetFile


 CHttpFile::GetObject

CString GetObject( ) const;

返回值：一个包含对象名称的CString对象。

说明：
调用该成员函数以了解与此CHttpFile相关联的对象名称。只有在对SendRequest的成功调用或者一个CHttpFile对象被OpenURL成功创建后，才能使用该成员函数。

请参阅：CInternetFile


 CHttpFile::GetVerb

CString GetVerb( ) const;

返回值：一个包含HTTP动词名的CString对象。

说明：
调用该成员函数以了解与此CHttpFile相关联的HTTP动词。只有在SendRequest 被成功调用或者一个CHttpFile对象被 OpenURL成功创建后，才能使用该成员函数。

请参阅：CInternetFile


 CHttpFile::QueryInfo

BOOL QueryInfo( DWORD dwInfoLevel, LPVOID lpvBuffer, LPDWORD lpdwBufferLength, LPDWORD lpdwIndex = NULL ) const;
BOOL QueryInfo( DWORD dwInfoLevel, CString& str, LPDWORD dwIndex = NULL) const;
BOOL QueryInfo( DWORD dwInfoLevel, SYSTEMTIME* pSysTime, LPDWORD dwIndex = NULL ) const;

返回值：
如果成功，则返回非零值，否则为0。如果此调用失败，可通过调用Win32的函数GetLastError来确定错误原因。

参数：
dwInfoLevel查询属性和下列指定所须信息标志的组合：
· | HTTP_QUERY_CUSTOM | 查找头名称并在输出中返回lpvBuffer中的值。如果未找到，HTTP_QUERY_CUSTOM 产生断言。
· | HTTP_QUERY_FLAG_REQUEST_HEADERS | 是典型的，此应用查询请求头，但一个应用也可通过使用此标记查询请求头。
· | HTTP_QUERY_FLAG_SYSTEMTIME | 对于那些值为日期/时间字符串的头，如“Last-Modified-Time”，此标记返回如标准Win32SYSTEMTIME结构的头值，而不需应用对数据进行文法分析映射。如果使用了此标记，你可能要使用SYSTEMTIME 覆盖此函数。
· | HTTP_QUERY_FLAG_NUMBER | 对于那些值为数字的头，如状态号，此标记返回一个32位的数据。
请参阅说明部分以了解可能值的列表。
lpvBuffer | 一个指向用于接收信息的缓冲区的指针。
lpdwBufferLength | 在入口处，这是指向一个用字节或位表示的包含数据缓冲区长度的值。请参阅说明部分以了解此参数的详细信息。
lpdwIndex | 一个指向基于零的头索引的指针。可以为NULL。使用此标记来枚举同名的多个头。对于输入，lpdwIndex表示返回的指定的头的索引。对于输出，lpdwIndex 表示下一个头的索引。如果此索引找不到，则返回ERROR_HTTP_HEADER_NOT_FOUND。
str | 接收返回信息的CString对象的参考值。
dwIndex | 一个索引值。请参阅lpdwIndex。
pSysTime | 一个指向Win32 SYSTEMTIME结构的指针。

说明：
调用此成员函数返回HTTP请求中的回答或请求头。只有在SendRequest被成功调用或者一个CHttpFile对象被 OpenURL成功创建后，才能使用该成员函数。
你可从QueryInfo中获取以下数据类型：
· | strings (缺省)
· | SYSTEMTIME (对于“Data:”“Expires:”等)
· | DWORD (对于 STATUS_CODE,CONTENT_LENGTH等等)
当一个字符串被写入缓冲区，且成员函数成功时，lpdwBufferLength 包含字符串的字节长减一，去掉结束NULL字符的长度。
可能的dwInfoLevel值包括：
· | HTTP_QUERY_MIME_VERSION
· | HTTP_QUERY_CONTENT_TYPE
· | HTTP_QUERY_CONTENT_TRANSFER_ENCODING
· | HTTP_QUERY_CONTENT_ID
· | HTTP_QUERY_CONTENT_DESCRIPTION
· | HTTP_QUERY_CONTENT_LENGTH
· | HTTP_QUERY_ALLOWED_METHODS
· | HTTP_QUERY_PUBLIC_METHODS
· | HTTP_QUERY_DATE
· | HTTP_QUERY_EXPIRES
· | HTTP_QUERY_LAST_MODIFIED
· | HTTP_QUERY_MESSAGE_ID
· | HTTP_QUERY_URI
· | HTTP_QUERY_DERIVED_FROM
· | HTTP_QUERY_LANGUAGE
· | HTTP_QUERY_COST
· | HTTP_QUERY_WWW_LINK
· | HTTP_QUERY_PRAGMA
· | HTTP_QUERY_VERSION
· | HTTP_QUERY_STATUS_CODE
· | HTTP_QUERY_STATUS_TEXT
· | HTTP_QUERY_RAW_HEADERS
· | HTTP_QUERY_RAW_HEADERS_CRLF

请参阅：
CInternetFile, CHttpConnection::OpenRequest, CFtpConnection, CGopherConnection, CInternetConnection


 CHttpFile::QueryInfoStatusCode

BOOL QueryInfoStatusCode( DWORD& dwStatusCode ) const;

返回值：
如果成功，则返回非零值，否则为0。如果此调用失败，可通过调用Win32的函数GetLastError来确定错误原因。

参数：
dwStatusCode 状态号的参考值。状态号标识请求事件是成功还是失败。请参阅说明部分，以了解状态号的细节。

说明：
调用此成员函数以获得HTTP请求相关联的状态号并将其放到所提供的dwStatusCode 参数中。只有在SendRequest 被成功调用或者一个CHttpFile对象被 OpenURL成功创建后，才能使用该成员函数。
分组的HTTP 状态号标识请求的成功或失败。以下列表列出了状态号组及大部分常用状态号。
分组 | 含义
200-299 | 成功
300-399 | 信息
400-499 | 请求错误
500-599 | 服务器错误
常用的HTTP状态号：
状态号 | 含义
200 | URL定位，接着传输
400 | 不可理解的请求
404 | 所请求的URL未找到
405 | 服务器不支持所请求的方法
500 | 未知的服务器错误
503 | 已达到服务器容量

请参阅：CInternetFile


 CHttpFile::SendRequest

BOOL SendRequest( LPCTSTR pstrHeaders = NULL, DWORD dwHeadersLen = 0, LPVOID lpOptional = NULL, DWORD dwOptionalLen= 0 );
throw(CInternetException);
BOOL SendRequest( CString& strHeaders, LPVOID lpOptional = NULL, DWORD dwOptionalLen = 0 );
throw(CInternetException);

返回值：
如果成功，则返回非零值，否则为0。如果此调用失败，可通过检查产生的CInternetException对象来确定错误原因。

参数：
pstrHeaders | 一个指向包含着要发送的头名称的字符串的指针。
dwHeadersLen | 由pstrHeaders指定的头的长度。
lpOptional | 在请求头后立即发送的任意选项数据。通常用于POST和PUT操作。如果没有待发送的选项数据，则可能为NULL。
dwOptionalLen | lpOptional的长度。
strHeaders | 一个包含着正被发送的请求的头名称的字符串。

说明：调用此成员函数以向HTTP服务器发送请求。

请参阅：CInternetFile, CHttpFile::SendRequestEx


 CHttpFile::SendRequestEx

BOOL SendRequestEx(DWORD dwTotalLen, DWORD dwFlags = HSR_INITIATE, DWORD dwContext = 1);
throw(CInternetException);
BOOL SendRequestEx(LPINTERNET_BUFFERS lpBuffIn, LPINTERNET_BUFFERS lpBuffOut, DWORD dwFlags = HSR_INITIATE, DWORD dwContext = 1);
throw(CInternetException);

返回值：
如果成功，则返回非零值，否则为0。如果此调用失败，可通过检查产生的CInternetException对象来确定错误原因。

参数：
dwTotalLen | 请求中将被发送的字节数。
dwFlags | 描述操作的标记。要了解适当标记的列表，请参阅联机文档“平台SDK”中的HttpSendRequstEx。
dwContext | CHttpFile操作的上下文标识符。请参阅说明部分关于此参数的更多信息。
lpBuffIn | 一个指向描述操作中用到的输入缓冲区的初始化了的INTERNET_BUFFERS的指针。
lpBufferOut | 一个指向描述操作中用到的输出缓冲区的初始化了的INTERNET_BUFFERS的指针。

说明：
调用此成员函数来向一个HTTP 服务器发送请求。此函数允许应用使用CInternetFile的Write和WriteString 来发送数据。在调用任一此函数的覆盖前，必须知道发送的数据长度。第一个覆盖允许确定你要发送的数据长度。第二个覆盖接收指向INTERNET_BUFFERS结构的指针，它可以用来详细地描述缓冲区。
当内容已被写入文件时，调用EndRequest来结束此操作。
dwContext的缺省值由MFC从创建此CHttpFile对象的CInternetSession对象发送到CHttpFile对象。当调用CInternetSession::OpenURL 或CHttpConnection 来构造一个CHttpFile对象时，可覆盖此缺省值，来设置你所选择的值的上下文标识符。上下文标识符返回到CInternetSession::OnStatusCallback ，提供其所代表的对象状态。请参阅联机文档“Visual C++程序员指南”中的“Internet初步：WinInet”，以了解有关上下文标识符的更多信息。

示例：
此代码段发送一个字符串的内容到名为ISAPI的DLL 中，DLL在服务器中为MOOSEBOY。此示例对WriteString的调用只有一个，但可以使用多个来发送成块数据。
CString strData = "Some very long data to be POSTed here!";
pServer = sess.GetHttpConnection("mooseboy");
pFile = pServer->OpenRequest(CHttpConnection::HTTP_VERB_POST, "/isapi.dll?");
pFile->SendRequestEx(strData.GetLength());
pFile->WriteString(strData);
pFile->EndRequest();

请参阅：CInternetFile, CHttpFile::SendRequest


 CHttpFilter

CHttpFilter没有基类。
CHttpFilter与CHttpFilterContext一起，创建并管理超文本传输协议(HTTP)过滤器对象。一个HTTP过滤器是一个可替换的动态链接库(DLL)，服务器对任意HTTP请求调用。当过滤器被装载时，它向服务器说明了它对何种通知感兴趣。此后，无论何种选择的事件发生，过滤器就被调用并提供执行事件的条件。
ISAPI (Internet Server API)过滤器功能极强，有以下应用：
1.定制的鉴定策略
2.压缩
3.加密
4.登录
5.流量分析或其它分析
可安装多个过滤器。通知次序基于由过滤器确定的优先级及任意联系的登录的装载命令。可查看滤器的文档，看看如何安装过滤器。
注意：
一旦过滤器开始执行一个请求，则不管是对文件还是ISAPI应用，它都将接收数据。
过滤器应用于面向客户的网络连接和HTTP服务器之间。依赖于过滤器所选择的选项，它可以参与多种服务器活动，包括从客户机读取原始数据、处理头、通过安全端口通信(PCT——个人通信技术，SSL——安全套接字子层，以及其它)、或者HTTP请求处理的一些其它阶段。
设置过滤器所用的过滤器通知，请参阅 GetFilterVersion。
要了解有关Internet 过滤器的更多信息，请参阅联机文档“Visual C++程序员指南”中的“ISAPI扩展：过滤器”。至于用ISAPI Extension Wizard创建Internet过滤器，请参阅联机文档“Visual C++程序员指南”中的“构造一个典型的ISAPI过滤器”。
#include <afxisapi.h>
请参阅：CHttpFilterContext, CHttpServer, CHttpServerContext

CHttpFilter类的成员

构造函数
CHttpFilter 构造一个CHttpFilter对象

属性
GetFilterVersion 在CHttpFilter对象被构造后，得到过滤器的版本

可覆盖的函数
OnReadRawData | 允许查阅原始数据。返回的数据将包含标题和数据
OnPreprocHeaders | 提示客户：服务器已预处理过客户标题
OnAuthentication | 鉴定客户OnUrlMap当服务器正将一个逻辑URL映射到物理路径上时，提醒客户
OnSendRawData | 从服务器发送原始数据到客户机
OnLog | 向服务器文件登录信息
OnEndOfNetSession | 提示客户，进程结束

操作
HttpFilterProc 返回消息，指示通过过滤器的事件如何被执行。发生一个事件就调用一次


 CHttpFilter::CHttpFilter

CHttpFilter( );

说明：
在构造一个CHttpFilter对象的过程中，成员函数被框架调用。


 CHttpFilter::GetFilterVersion

virtual BOOL GetFilterVersion( PHTTP_FILTER_VERSION pVer );

返回值：
如果过滤器装载正常，则为非零。如果过滤器返回0，那么此过滤器未被装入，不能接收任何通知。

参数：
pVer一个指向HTTP_FILTER_VERSION结构的指针，此结构包含服务器的版本信息及过滤器的字段，用于指明版本号和通知。此过滤器应用还包括登录其自身描述的空间。缺省实现时，以下两个标记设置在结构中：
· | dwFlags | 优先级通知标记，SF_NOTIFY_ORDER_DEFAULT，缺省设置。请参阅说明部分，以了解通知标记及其细节的列表。
· | dwFilterVersion | TTP_FILTER_REVISION 缺省设置。此标记指示了服务器所使用的说明的版本。

说明：
此成员函数被Internet服务器调用，以获得pVer指示的过滤器版本。
在CHttpFilter对象被构造后，它只能调用一次。
使用dwFlags来确定你的服务器感兴趣的pVer成员的通知。下面是dwFlags有效标记的列表：
· | SF_NOTIFY_ORDER_DEFAULT | 在缺省优先级下装载过滤器。推荐使用该值，因为其它优先级通知对性能和调节有很大的影响。
· | SF_NOTIFY_ORDER_LOW | 以低的优先级装载过滤器。
· | SF_NOTIFY_ORDER_MEDIUM | 以中等优先级装载过滤器。
· | SF_NOTIFY_ORDER_HIGH | 以高的优先级装载过滤器。
· | SF_NOTIFY_SECURE_PORT | 提示此应用正通过一个安全端口传送数据。
· | SF_NOTIFY_NONSECURE_PORT | 提示此应用正通过一个不安全的端口传送数据。 注意： 当设置的既不是SF_NOTIFY_NONSECURE_PORT又不是SF_NOTIFY_SECURE _PORT时，服务器将两个均作为缺省值，允许通过任何端口处理数据。
· | SF_NOTIFY_READ_RAW_DATA | 允许查阅原始数据。返回给客户的数据将同时包含标题和数据。
· | SF_NOTIFY_PREPROC_HEADERS | 服务器已预处理了标题。
· | SF_NOTIFY_AUTHENTICATION | 服务器鉴定客户。
· | SF_NOTIFY_URL_MAP | 服务器将逻辑URL映射为物理路径。
· | SF_NOTIFY_SEND_RAW_DATA | 服务器正给客户机发回数据。
· | SF_NOTIFY_LOG | 服务器正往服务器日志中写信息。
· | SF_NOTIFY_END_OF_NET_SESSION | 与客户的会话完毕。

请参阅：HTTP_FILTER_VERSION, CHttpFilter::HttpFilterProc


 CHttpFilter::HttpFilterProc

virtual DWORD HttpFilterProc( PHTTP_FILTER_CONTEXT pfc, DWORD NotificationType, LPVOID pvNotification );

返回值：
指示此应用对事件的处理，由一个dwFlags值表示;请参阅GetFilterVersion的说明，以了解这些值的列表。

参数：
pfc | 一个指向HTTP_FILTER_CONTEXT结构的指针。此参数指向的该HTTP_FILTER_CONTEXT结构包含与上下文的信息。该pfc结构的成员可被过滤器使用，以把任意的上下文的信息与HTTP请求合并。SF_NOTIFY_END_OF_NET_SESSION 通知可被用于释放任何这样的上下文信息。
NotificationType | 标识正被处理的事件类型。有效类型列在GetFilterVersion中。
pvNotification一个通知指定的结构。
通知类型 | pvNotification指向 | MFC调用
SF_NOTIFY_READ_RAW_DATA | HTTP_FILTER_RAW_DATA | OnReadRawData
SF_NOTIFY_SEND_RAW_DATA | HTTP_FILTER_RAW_DATA | OnSendRawData
SF_NOTIFY_PREPROC_HEADERS | HTTP_FILTER_PREPROC_HEADERS | OnPreprocHeaders
SF_NOTIFY_AUTHENTICATION | HTTP_FILTER_AUTHENT | OnAuthentication
SF_NOTIFY_URL_MAP | HTTP_FILTER_URL_MAP | OnUrlMap
SF_NOTIFY_LOG | HTTP_FILTER_LOG | OnLog

说明：
每次通过过滤器时，此成员函数被框架调用来处理数据。HttpFilterProc是否调用适当的CHttpFilter成员函数，取决于指定的通知类型。例如，HttpFilterProc将调用OnPreprocHeaders，如果通知类型为SF_NOTIFY_PREPROC_HEADERS。
HttpFilterProc是ISAPI过滤器进行核心工作的地方。pvNotification指向的各种结构 (列在上面表格中)包含指向这些操作的数据和函数指针。请参阅此结构的细节，以进一步了解数据是如何被HttpFilterProc结构处理的。
可覆盖单个处理(列在上面表格中)，以改变数据在相关结构中被处理的方式。

请参阅：
HTTP_FILTER_CONTEXT, HTTP_FILTER_PREPROC_HEADERS, HTTP_FILTER_RAW_DATA, HTTP_FILTER_URL_MAP, HTTP_FILTER_LOG


 CHttpFilter::OnAuthentication

virtual DWORD OnAuthentication (CHttpFilterContext* pfc, PHTTP_FILTER_AUTHENT pAuthent );

返回值：
以下通知类型中的一个：
· | SF_STATUS_REQ_FINISHED | 过滤器已处理了HTTP请求，服务器应释放会话连接。
· | SF_STATUS_REQ_FINISHED_KEEP_CONN | 与SF_STATUS_REQ_FINISHED相同，除了当选项已协商好时，服务器应保持TCP会话打开。
· | SF_STATUS_REQ_NEXT_NOTIFICATION | 通知链表中的下一个过滤器应被调用。
· | SF_STATUS_REQ_HANDLED_NOTIFICATION | 此过滤器处理通知。对于这个特殊通知没有其它处理能被调用。
· | SF_STATUS_REQ_ERROR | 出错。服务器应用Win32 API SetLastError来向客户指出错误。
· | SF_STATUS_REQ_READ_NEXT | 此过滤器是一个不透明的流过滤器；协商会话参数。只对原始可读通知有效。
如果未成功，则应返回通知类型SF_STATUS_REQ_ERROR。此时，服务器应使用Windows函数SetLastError并向客户指出错误。

参数：
pfc | 一个CHttpFilterContext对象，包含上下文的信息。CHttpFilterContext对象可被过滤器使用，以将上下文的信息与HTTP 请求合并。
pAuthent | 一个指向HTTP_FILTER_AUTHENT结构的指针。

说明：
此成员函数被框架调用以鉴定客户。
覆盖此成员函数以实现你自己的鉴定。缺省实现什么也不做。

请参阅：
CHttpFilter::HttpFilterProc, HTTP_FILTER_AUTHENT, CHttpFilterContext


 CHttpFilter::OnEndOfNetSession

virtual DWORD OnEndOfNetSession( CHttpFilterContext* pfc );

返回值：
以下通知类型中的一个：
· | SF_STATUS_REQ_FINISHED | 过滤器已处理了HTTP请求，服务器应释放会话连接。
· | SF_STATUS_REQ_FINISHED_KEEP_CONN | 与SF_STATUS_REQ_FINISHED 相同，除了当选项已协商好时，服务器应保持TCP会话打开。
· | SF_STATUS_REQ_NEXT_NOTIFICATION | 通知链表中的下一个过滤器应被调用。
· | SF_STATUS_REQ_HANDLED_NOTIFICATION | 此过滤器处理通知。对于这个特殊通知没有其它处理能被调用。
· | SF_STATUS_REQ_ERROR | 出错。服务器应用Win32 API SetLastError来向客户指出错误。
· | SF_STATUS_REQ_READ_NEXT | 此过滤器是一个不透明的流过滤器，协商会话参数。只对原始可读通知有效。如果未成功，则应返回通知类型SF_STATUS_REQ_ERROR。此时，服务器应使用Windows函数SetLastError并向客户指出错误。

参数：
pfc 一个CHttpFilterContext对象，包含上下文的信息。CHttpFilterContext对象可被过滤器使用，以将上下文的信息与HTTP请求合并。

说明：
此成员函数被框架调用，以通知客户会话结束。
覆盖此成员函数以实现你自己的会话结束。缺省实现什么也不做。

请参阅：
CHttpFilter::HttpFilterProc, CHttpFilterContext


 CHttpFilter::OnLog

virtual DWORD OnLog( CHttpFilterContext* pfc, PHTTP_FILTER_LOG pLog );

返回值：
以下通知类型中的一个：
· | SF_STATUS_REQ_FINISHED | 过滤器已处理了HTTP请求，服务器应释放会话连接。
· | SF_STATUS_REQ_FINISHED_KEEP_CONN | 与SF_STATUS_REQ_FINISHED 相同，除了当选项已协商好时，服务器应保持TCP会话打开。
· | SF_STATUS_REQ_NEXT_NOTIFICATION | 通知链表中的下一个过滤器应被调用。
· | SF_STATUS_REQ_HANDLED_NOTIFICATION | 此过滤器处理通知。对于这个特殊通知没有其它处理能被调用。
· | SF_STATUS_REQ_ERROR | 出错。服务器应用Win32 API SetLastError来向客户指出错误。
· | SF_STATUS_REQ_READ_NEXT | 此过滤器是一个不透明的流过滤器，协商会话参数。只对原始可读通知有效。如果未成功，则应返回通知类型SF_STATUS_REQ_ERROR。此时，服务器应使用Windows函数SetLastError并向客户指出错误。

参数：
pfc | 一个CHttpFilterContext对象，包含上下文的信息。CHttpFilterContext对象可被过滤器使用，以将上下文的信息与HTTP请求合并。
pLog | 一个指向HTTP_FILTER_LOG结构的指针。

说明：
此成员函数被框架调用以在服务器写信息到服务器日志中时通知过滤器。
覆盖此成员函数以提供你自己的向服务器文件中记录日志信息的方法。缺省实现什么也不做。

请参阅：
CHttpFilter::HttpFilterProc, HTTP_FILTER_LOG, CHttpFilterContext


 CHttpFilter::OnPreprocHeaders

virtual DWORD OnPreprocHeaders(CHttpFilterContext* pfc, PHTTP_FILTER_PREPROC_HEADERS pHeaders);

返回值：
以下通知类型中的一个：
· | SF_STATUS_REQ_FINISHED | 过滤器已处理了HTTP请求，服务器应释放会话连接。
· | SF_STATUS_REQ_FINISHED_KEEP_CONN | 与SF_STATUS_REQ_FINISHED 相同，除了当选项已协商好时，服务器应保持TCP会话打开。
· | SF_STATUS_REQ_NEXT_NOTIFICATION | 通知链表中的下一个过滤器应被调用。
· | SF_STATUS_REQ_HANDLED_NOTIFICATION | 此过滤器处理通知。对于这个特殊通知没有其它处理能被调用。
· | SF_STATUS_REQ_ERROR | 出错。服务器应用Win32 API SetLastError来向客户指出错误。
· | SF_STATUS_REQ_READ_NEXT | 此过滤器是一个不透明的流过滤器，协商会话参数。只对原始可读通知有效。 如果未成功，则应返回通知类型SF_STATUS_REQ_ERROR。此时，服务器应使用Windows函数SetLastError并向客户指出错误。

参数：
pfc | 一个CHttpFilterContext对象，包含上下文的信息。CHttpFilterContext对象可被过滤器使用，以将上下文的信息与HTTP请求合并。
pHeaders | 一个指向HTTP_FILTER_PREPROC_HEADERS结构的指针。

说明：
此成员函数被框架调用，以通知客户服务器已预处理了客户标题。
覆盖此成员函数以提供你自己的处理客户标题的方法。缺省实现什么也不做。

请参阅：
CHttpFilter::HttpFilterProc, HTTP_FILTER_PREPROC_HEADERS, CHttpFilterContext


 CHttpFilter::OnReadRawData

virtual DWORD OnReadRawData( CHttpFilterContext* pfc, PHTTP_FILTER_RAW_DATA pRawData );

返回值：
以下通知类型中的一个：
· | SF_STATUS_REQ_FINISHED | 过滤器已处理了HTTP请求，服务器应释放会话连接。
· | SF_STATUS_REQ_FINISHED_KEEP_CONN | 与SF_STATUS_REQ_FINISHED 相同，除了当选项已协商好时，服务器应保持TCP会话打开。
· | SF_STATUS_REQ_NEXT_NOTIFICATION | 通知链表中的下一个过滤器应被调用。
· | SF_STATUS_REQ_HANDLED_NOTIFICATION | 此过滤器处理通知。对于这个特殊通知没有其它处理能被调用。
· | SF_STATUS_REQ_ERROR | 出错。服务器应用Win32 API SetLastError来向客户指出错误。
· | SF_STATUS_REQ_READ_NEXT | 此过滤器是一个非透明的流过滤器，协商会话参数。只对原始可读通知有效。 如果未成功，则应返回通知类型SF_STATUS_REQ_ERROR。此时，服务器应使用Windows函数SetLastError并向客户指出错误。

参数：
pfc | 一个CHttpFilterContext对象，包含上下文的信息。CHttpFilterContext对象可被过滤器使用，以将上下文的信息与HTTP请求合并。
pRawData | 一个指向HTTP_FILTER_RAW_DATA结构的指针。

说明：
此成员函数被框架调用以允许查阅原始数据。
覆盖此成员函数以另外处理原始数据。缺省实现什么也不做。

请参阅：
CHttpFilter::HttpFilterProc, HTTP_FILTER_RAW_DATA, CHttpFilterContext, CHttpFilter::OnSendRawData


 CHttpFilter::OnSendRawData

virtual DWORD OnSendRawData( CHttpFilterContext* pfc, PHTTP_FILTER_RAW_DATA pRawData );

返回值：
如果成功，则返回通知类型SF_STATUS_REQ_NEXT_NOTIFICATION。调用通知链表中的下一个过滤器。
如果未成功，则应返回通知类型SF_STATUS_REQ_ERROR。此时，服务器应使用Windows函数SetLastError 并向客户指出错误。

参数：
pfc | 一个CHttpFilterContext对象，包含上下文的信息。CHttpFilterContext对象可被过滤器使用，以将上下文的信息与HTTP请求合并。SF_NOTIFY_END_ OF_NET_SESSION可被用于释放任何此类上下文信息。
pRawData | 一个指向HTTP_FILTER_RAW_DATA结构的指针。

说明：
此成员函数被框架调用，以通知客户服务器正发送原始数据给客户。覆盖此成员函数，只用于改变HttpFilterProc使用的缺省通知处理和另外处理原始数据。

请参阅：
CHttpFilter::HttpFilterProc, HTTP_FILTER_RAW_DATA, CHttpFilterContext, CHttpFilter::OnReadRawData


 CHttpFilter::OnUrlMap

virtual DWORD OnUrlMap( CHttpFilterContext* pfc, PHTTP_FILTER_URL_MAP pUrlMap );

返回值：
以下通知类型中的一个：
· | SF_STATUS_REQ_FINISHED | 过滤器已处理了HTTP请求，服务器应释放会话连接。
· | SF_STATUS_REQ_FINISHED_KEEP_CONN | 与SF_STATUS_REQ_FINISHED相同，除了当选项已协商好时，服务器应保持TCP会话打开。
· | SF_STATUS_REQ_NEXT_NOTIFICATION | 通知链表中的下一个过滤器应被调用。
· | SF_STATUS_REQ_HANDLED_NOTIFICATION | 此过滤器处理通知。对于这个特殊通知没有其它处理能被调用。
· | SF_STATUS_REQ_ERROR | 出错。服务器应用Win32 API SetLastError来向客户指出错误。
· | SF_STATUS_REQ_READ_NEXT | 此过滤器是一个非透明的过滤器，协商会话参数。只对原始可读通知有效。 如果未成功，则应返回通知类型SF_STATUS_REQ_ERROR。此时，服务器应使用Windows函数SetLastError，并向客户指出错误。

参数：
pfc | 一个CHttpFilterContext对象，包含上下文的信息。CHttpFilterContext对象可被过滤器使用，以将上下文的信息与HTTP请求合并。
pUrlMap | 一个指向HTTP_FILTER_URL_MAP结构的指针。

说明：
当服务器将URL映射到物理路径时，此成员函数被框架调用。
覆盖此成员函数以另外处理URL映射。缺省实现什么也不做。

请参阅：
CHttpFilter::HttpFilterProc, HTTP_FILTER_URL_MAP, CHttpFilterContext


 CHttpFilterContext

CHttpFilterContext没有基类。
CHttpFilterContext提供CHttpFilter对象所需的、处理通过过滤器的数据的工具。当过滤器收到一个请求，一个CHttpFilter对象被创建并初始化，一个CHttpFilterContext对象被创建。过滤器处理请求时，使用CHttpFilterContext成员函数来执行任务。CHttpFilterContext对象独立于CHttpFilter对象而存在，从而允许多线程。一个模块中只能由一个CHttpFilter对象存在，但一个过滤器可能需要同时处理多客户请求。
CHttpFilter将为每个请求构造一个CHttpFilterContext以处理多种请求。一个CHttpFilter 使用多个CHttpFilterContext对象来实行单线程运行。这种设计允许通过不同客户连接对CHttpFilter对象进行同步的多个调用。
调用扩展 DLL (ISA)时，成员函数ServerSupportFunction 提醒服务器向客户提供一般的ISA信息。
如果过滤器必须立即传送些什么——例如，一个错误——给客户，则调用WriteClient。
#include <afxisapi.h>
请参阅：CHttpServer, CHttpFilter, HTTP_FILTER_CONTEXT

CHttpFilterContext类的成员

数据成员
m_pFC 一个指向HTTP_FILTER_CONTEXT结构的指针

构造函数
CHttpFilterContext 构造一个CHttpFilterContext对象

属性
GetServerVariable | 拷贝与HTTP或服务器自身有关的信息到调用者所提供的缓冲区中
AddResponseHeaders | 往HTTP回答中添加标题
WriteClient | 立即向客户机写入原始数据
AllocMem | 在缓冲区中分配内
ServerSupportFunction | 提供通常的ISA信息给客户


 CHttpFilterContext::AddResponseHeaders

BOOL AddResponseHeaders(LPTSTR lpszHeaders, DWORD dwReserved = 0);

返回值：如果成功，则返回非零值，否则为0。

参数：
lpszHeaders | 一个指向包含要添加标题的字符串的指针。
dwReserved | 保留以备用。必须为0。

说明：
调用此成员函数以在HTTP回答中添加标题，此标题串包含在lpszHeaders中。请参阅CHttpServerContext::ServerSupportFunction主题中描述的HSE_REQ_SEND_RESPONSE_HEADER值，以了解CHttpServer对象是如何传送HTTP 服务器回答标题的信息。


 CHttpFilterContext::AllocMem

LPVOID AllocMem( DWORD cbSize, DWORD dwReserved );

返回值：
一个指向缓冲区的指针，出错时为NULL。

参数：
cbSize | 确定分配的内存缓冲区大小，用字节表示。
dwReserved | 保留以备用。

说明：
调用此成员函数以重新分配在与客户的通讯终止时自动释放的内存。
如果一个过滤器被登录，它通常是为一个网络会话结束事件而登录的。
此事件是回收被客户请求使用的缓冲区的大好时机。由于性能原因，许多过滤器有可能保持一个过滤器缓冲区的储备区，并且当储备区变空或太大而不能在内存管理之上保存时，只重新分配或释放一个缓冲区。调用AllocMem可能对执行产生负面作用，但只要小心使用，这是很有用的工具。
用AllocMem重新分配的内存块不能由普通的C运行或Windows API内存管理函数来管理。


 CHttpFilterContext::CHttpFilterContext

CHttpFilterContext( PHTTP_FILTER_CONTEXT pfc );

参数：
pfc 一个指向HTTP_FILTER_CONTEXT结构的指针。

说明：
在构造一个CHttpFilterContext对象时，该成员函数被框架调用。

请参阅：HTTP_FILTER_CONTEXT


 CHttpFilterContext::GetServerVariable

BOOL GetServerVariable( LPTSTR lpszVariableName, LPVOID lpvBuffer, LPDWORD lpdwSize );

返回值：
如果成功，则返回非零值，否则为0。Win32 API 调用GetLastError可被用来确定为何调用失败。可能的错误值包括：
值 | 含义
ERROR_INVALID_PARAMETER | 坏的连接操作
ERROR_INVALID_INDEX | 坏的或不支持的变量标识符
ERROR_INSUFFICIENT_BUFFER | 缓冲区太小，在lpdwSize返回所需大小
ERROR_MORE_DATA | 缓冲区太小，只有部分数据返回。整个的数据大小未返回
ERROR_NO_DATA | 所请求的数据无效

参数：
lpszVariableName | 空终止符的字符串，指出哪个变量被请求。请参阅以下说明部分，选择一个可能的名字。所有变量名与定义在位于http://hoohoo.ncsa.uiuc.edu/cgi/env.html的CGI说明中的一样。
lpvBuffer | 一个指向接收请求信息的缓冲区的指针。
lpdwSize | 指向DWORD的指针，指出缓冲区中有效的字节数。对于成功结束，DWORD包含传输到缓冲区的字节数(包括空终止符字节)。

说明：
该成员函数被框架调用，拷贝HTTP连接或服务器自身有关的信息到调用者提供的缓冲区中。可能的lpszVariableNames包括：
值 | 含义
ALL_HTTP | 未被文法分析映射成为某个上述变量的HTTP头。 这些变量的形式为HTTP_<头名称>
AUTH_TYPE | 包含鉴定使用的类型。例如，若Basic鉴定被使用，此字符串将为“Basic”。对于Windows NT Challenge回答，将为“NTLM”。其它鉴定有别的字符串。由于新的鉴定类型可被添加到Internet Server中，故不可能列出所有可能的字符串。如果字符串为空，则未使用鉴定
CONTENT_LENGTH | 可从客户那里收到的脚本的字节数
CONTENT_TYPE | 由POST主体提供的信息的内容类型
GATEWAY_INTERFACE | 服务器所遵守的CGI鉴定的修订本。当前版本是CGI/1.1
HTTP_ACCEPT | 特殊的HTTP标题。Accept: 字段的值是连接的，用“,”隔开。例如，下面几行为HTTP标题的一部分： accept: */*;q=0.1 accept: text/html accept: image/jpeg 然后，HTTP_ACCEPT变量将有一个值： */*;q=0.1，text/html，image/jpeg
PATH_INFO | 附加的路径信息，如由客户指定的。它比较脚本名字之后，查询字符串之前的URL的标头部分(如果有的话)
PATH_TRANSLATED | 这是PATH_INFO值，但还有扩展到指定的目录的虚路径名
QUERY_STRINGURL | 中“?”后的参考此脚本的信息
REMOTE_ADDR | 客户的IP地址
REMOTE_HOST | 客户的用户名
REMOTE_USER | 包含由客户提供的和由服务器鉴定的用户名
REQUEST_METHODHTTP | 请求方法
SCRIPT_NAME | 正执行的脚本程序名
SERVER_NAME | 将出现在自参考URL中的服务器的用户名(或IP地址)
SERVER_PORT | 接收请求的TCP/IP端口
SERVER_PROTOCOL | 与此请求有关的信息获取协议的名称和版本，通常为HTTP/1.0
SERVER_SOFTWARE | CGI程序运行的网络服务器的名称和版本


 CHttpFilterContext::ServerSupportFunction

BOOL ServerSupportFunction(enum SF_REQ_TYPE sfReq, PVOID pvData, LPDWORD lpdwSize, LPDWORD lpdwDataType )

返回值：如果成功，则返回非零值，否则为0。

参数：
sfReq | 服务器请求类型。请参阅说明部分，以了解可能值的列表。
pvData | 一个指向空终止字符串的指针。其值指定为sfReq的扩展。当与SF_REQ_SEND_RESPONSE_HEADER一起使用时，它是可选的、空终止状态的字符串(例如，“401 Access Denied”)或者对于“200OK”的缺省回答，为NULL。当与SF_REQ_ADD_HEADERS_ON_DENIAL一起使用，它是空终止字符串，指向一个或多个以“\r\n”结束的标题行。
lpdwSize | 空终止字符串。其值指定为扩展部分。当与SF_REQ_SEND_RESPONSE_在HEADER一起使用，它是空终止字符串，指向将被添加的可选数据且与标题一起设置。如果为NULL，标题将以空行结束。当与SF_REQ_ADD_ HEADERS_ON_DENIAL一起使用，它是下一次读取的字节大小。
lpdwDataType | 空终止字符串，指向将被与标题一起添加和发送的可选标题或数据。如果为NULL，标题将以“\r\n”对结束。

说明：
调用此成员函数来扩展ISA API。
HTTP服务器的扩展值以sfReq代表，可能为：
· | SF_REQ_SEND_RESPONSE_HEADER | 发送一个完整的HTTP回答标题，包括状态、服务器版本、消息时间及MIME版本。服务器应在尾部添加其他信息，如Content-type，Content-length等等，后面跟着特殊的“\r\n”。
· | SF_REQ_ADD_HEADERS_ON_DENIAL | 如果服务器拒绝HTTP请求，就添加指定的标题到服务器错误回答中。 这允许一个鉴定过滤器广告其服务，无须过滤每个请求。通常，标题将为WWW-Authenticate标题，使用定制的鉴定策略，但没有限制应确定什么标题。
· | SF_REQ_SET_NEXT_READ_SIZE | 只用于原始数据过滤器，返回SF_STATUS_READ_NEXT。


 CHttpFilterContext::WriteClient

BOOL WriteClient( LPVOID lpvBuffer, LPDWORD lpdwBytes, DWORD dwReserved = 0 );

返回值：
如果成功，则返回非零值，否则为0。如果为0，可使用Windows函数GetLastError 来确定错误原因。

参数：
lpvBuffer | 一个指向包含数据的缓冲区的指针。
lpdwBytes | 一个指向包含从缓冲区写入的字节数的DWORD的指针。
dwReserved | 保留以备用。必须为0。

说明：
调用该成员函数立即发送原始数据回客户机。

请参阅：
HTTP_FILTER_CONTEXT, CHttpServerContext::WriteClient


 CHttpFilterContext::m_pFC

说明：
m_pFC的数据成员是一个指向HTTP_FILTER_CONTEXT结构的指针。该指针指向传递给CHttpFilter::HttpFilterProc的同样结构。

请参阅：HTTP_FILTER_CONTEXT


 CHttpServer

CHttpServer没有基类。
类CHttpServer与CHttpServerContext 一起提供扩展ISAPI兼容的HTTP服务器功能的方法。类CHttpServer 包括Internet Server API (ISAPI)功能，可以处理各种类型的客户请求，包括扩展 DLL。CHttpServer 不能处理来自CGI执行的请求。这些扩展DLL 有时被 Internet ServerApplications调用;然而，它们是DLL，而不是EXE。为了简短，我们将扩展DLL 称为ISA。
要想了解CGI和ISA的区别，请参阅联机文档“Visual C++程序员指南”中的“Internet Server API(ISAPI)扩展”。
当ISAPI HTTP服务器收到客户浏览器的请求时，一个CHttpServer对象被创建并初始化，同时一个CHttpServerContext对象被创建。每个模块中只能有一个CHttpServer 实例存在；但是，对服务器的每一次调用，都有一个ChttpServer-Context对象被创建。一个CHttpServer对象使用多个CHttpServerContext对象，以独立线程运行。此设计允许使用不同的客户连接对CHttpServer对象进行同时的多个调用。CHttpServer对象通过 CHttpServerContext对象与客户或服务器自身进行通讯。
当服务器装载ISA时，它在入口点GetExtensionVersion 调用ISA，获得扩展所基于的指定的版本号。对每个客户请求，HttpExtensionProc成员函数被调用。HttpExtensionProc的缺省 (推荐)实现将读取客户数据并决定要采取什么操作。你可覆盖此成员函数以定制该实现。
其它CHttpServer成员函数处理客户请求、格式化回答并与客户联系。
当一个CHttpServer对象收到客户命令时，文法分析映射将此命令与其类成员函数和参数关联。对每个CHttpServer对象，只有一个文法分析映射被创建。
请参阅“Internet服务器API (ISAPI)文法分析映射”以了解使用文法分析映射宏指令的一般信息。请参阅：BEGIN_PARSE_MAP和END_PARSE_MAP以了解如何创建文法分析映射及处理客户命令的信息。
请参阅下列宏指令介绍，以了解客户命令是如何与成员函数及其参数映射的信息：
·ON_PARSE_COMMAND
·ON_PARSE_COMMAND_PARAMS
·DEFAULT_PARSE_COMMAND
要了解有关使用文法分析映射处理客户命令的信息，请参阅联机文档“Visual C++程序员指南”中的“ISAPI扩展：文法分析映射”。
要了解调试Internet扩展DLL的信息，请参阅“技术指南63”。
#include <afxisapi.h>
请参阅：CHtmlStream, CHtmlStream, CHttpServerContext

CHttpServer类的成员

构造函数
CHttpServer 构造一个CHttpServer对象

可覆盖的函数
CallFunction | 在URL中查找并执行与命令有关的适当函数
OnParseError | 构造返回给客户的错误描述
OnWriteBody | 向客户机写数据
HttpExtensionProc | 使用回调函数读取客户数据并决定采取什么操作
GetExtensionVersion | 获取DLL所基于的版本号
ConstructStream | 构造一个CHtmlStream对象
TerminateExtension | 提供一种安全的方法，清除线程并完成其它关机动作

属性
StartContent | 将HTML标记插入到返回给客户的CHtmlStream对象中。覆盖以改变或省略缺省标记
EndContent | 将HTML标记插入到返回给客户的CHtmlStream对象中。覆盖以改变或省略缺省标记
WriteTitle | 在返回给客户的CHtmlStream对象中的适当HTML标记之间插入标题。覆盖以提供不同标题
GetTitle | 获取发送给客户的HTML的标题
AddHeader | 在回答发送给服务器之前添加标题
InitInstance | 初始化CHttpServer对象


 CHttpServer::AddHeader

void AddHeader(CHttpServerContext* pCtxt, LPCTSTR pszString) const;

参数：
pCtxt | 一个指向CHttpServerContext对象的指针。
pszString | 一个指向字符串的指针。

说明：
调用此成员函数，在回答发送给服务器之前往回答中添加标题。当它收到CHt-tpServerContext::ServerSupportFunctionHSE_REQ_SEND_RESPONSE_HEADERS时，使用AddHeader 来往服务器提供的标题中添加你自己的标题。特殊标题将给客户提供更多的信息。
例如，调用AddHeader来确定你自己的“内容类型”，然后调用它来确定编码，然后再调用一次来插入“内容长度”标题。当已调用完你所需次数的AddHeader后，使用<<来将输出组织为流，直到你做完为止。
注意：
一旦你已往服务器上下文的HTML流中输了数据，就不能再次调用AddHeader。如果这样，你的HTML流将不能正常工作。

示例：
The following code demonstrates how to use AddHeader to add a customer header.
In this instance customer headers represents a cookie.
szCookie is supplied in the request in following fashion:

http://server/scripts/MfcCookie.dll?SetCookie?cookie=Hello

BEGIN_PARSE_MAP(CMfcCookieExtension, CHttpServer)
...
ON_PARSE_COMMAND(SetCookie, CMfcCookieExtension, ITS_PSTR)
ON_PARSE_COMMAND_PARAMS ("cookie")
...
END_PARSE_MAP(CMfcCookieExtension)

void CMfcCookieExtension::SetCookie(CHttpServerContext* pCtxt, LPCTSTR szCookie)
{
char szHeader[256];
StartContent(pCtxt);
wsprintf (szHeader, "Set-Cookie: LeonBrCookie=%s;"
" expires=Friday, 22-May-99 13:00:00 GMT; path=/;\r\n", szCookie);
AddHeader(pCtxt, szHeader);
AddHeader(pCtxt, "Expires: 0\r\n");
*pCtxt <<"Cookie name/value: <b>"<< szHeader <<"</b> is set <br>";
EndContent(pCtxt);
}

下面是构造一个Web页面的函数示例：
void CHelloExtension::Default(CHttpServerContext* pCtxt)
{
AddHeader(pCtxt, "Content-type = text/plain\r\n");
(*pCtxt) << "Hello world!\r\n";
}

请参阅：
CHttpServerContext, CHttpServerContext::ServerSupportFunction


 CHttpServer::CallFunction

virtual int CallFunction(CHttpServerContext* pCtxt, LPTSTR pszQuery, LPTSTR pszCommand);

返回值：
下列某个枚举类型中的一个值：
枚举值 | 描述
CallOK | 函数调用成功
CallParamRequired | 所需参数丢失
CallBadParamCount | 参数太多或太少
CallBadCommand | 命令名未找到
CallNoStackSpace | 无有效栈空间
CallNoStream | 无有效CHtmlStream
CallMissingQuote | 某参数格式错误
CallMissingParams | 无有效参数
CallBadParam | 某参数有错误格式（如，只有一个引号）

参数：
pCtxt | 一个指向CHttpServerContext对象的指针。
pszQuery | 指向某查询的指针。由收到的客户命令类型确定。请参阅说明部分，以了解更多信息。
pszCommand | 指向某查询的指针或NULL。由收到的客户命令类型确定。请参阅说明部分，以了解更多信息。

说明：
被框架调用以查找并执行与URL中命令有关的适当函数。
下面是收到的方法类型与参数之间的分解：
方法类型 | pszQuery | pszCommand
GET | 一个指向EXTENSION_CONTROL_BLOCK结构查询字符串的指针 | NULL
POST | 一个指向在命令体内发送的查询的指针 | 指向EXTENSION_CONTROL_BLOCK结构查询字符串的指针
注意：
建议填充表格的作者使用POST方法，因为浏览器不一致，而且GET方法局限于1024字节的缓冲区。在为ISAPI编写表格时，要么只使用 POST 方法，要么设计ISA使得只有缺省函数处理表格。
例如，一些浏览器通过GET，使用下列操作发送表格：
TestLet.DLL?Command
将截取命令并发送：
TestLet.DLL?name=value
而不是正确的命令：
TestLet.DLL?Command?name=value
通过截取Command，浏览器将关联移到映射请求所需的ISA函数中。
除非函数Command是缺省函数，否则表格将不能正确处理。
如果要亲自处理EXTENSION_CONTROL_BLOCK结构函数lpszQueryString的文法分析映射，请覆盖 CallFunction 而不要使用PARSE_MAP 宏指令。请参阅联机文档“Visual C++程序员指南”中的“Internet服务器API(ISAPI)文法分析映射”，以了解使用文法分析映射宏指令的更多信息。

请参阅：
CHttpServerContext, Internet Server API (ISAPI) Parse Maps


 CHttpServer::CHttpServer

CHttpServer(TCHAR cDelimiter);

参数：
cDelimiter 标志记号限制符的字符。缺省的限制符为“&”。

说明：
在构造一个CHttpServer对象时，调用此函数。对于每个模块，只能有一个CHttpServer 实例存在。一旦一个CHttpServer对象被创建，它就可用InitInstance初始化。
当ISA已被客户命令初始化且在服务器上运行后，客户会收到一个回送URL的cDelimiter参数的回答页。此cDelimiter参数区分了由文法分析映射宏指令ON_PARSE_COMMAND和ON_PARSE_COMMAND_PARAMS进行文法分析映射的命令的参数。

CDelimiter的示例：
如果客户初始化一个ISA来观看URL“http://www.jungle.org/”的彩色JPEG图象，发送给服务器的命令可以是：
http://www.jungle.org/scripts/Apes.dll?Colorize
在此处，Colorize是初始化Colorize函数的命令。
服务器返回给客户的URL 可以是：
http://www.jungle.org/scripts/Apes.dll?Colorize?Target=Picture&Format=JPEG
cDelimiter缺省记号限制符“&”出现在客户的URL中，在函数Colorize的参数Picture和Format之间。请参阅ON_PARSSE_COMMAND和ON_PARSE_COMMAND_PARAMS，以了解文法分析映射命令的更多信息。


 CHttpServer::ConstructStream

virtual CHtmlStream* ConstructStream( );

返回值：一个指向CHtmlStream对象的指针。

说明：
此成员函数被框架调用来构造一个CHtmlStream对象。可覆盖此成员函数以创建你自己类的实例，使其与缺省具有不同的功能。
请参阅构造函数CHtmlStream::CHtmlStream以了解为什么应该覆盖Construct-Stream并为CHtmlStream对象提供特殊功能。


 CHttpServer::EndContent

virtual void EndContent( CHttpServerContext* pCtxt ) const;

参数：
pCtxt一个指向CHttpServerContext对象的指针。不能为NULL。

说明：
此成员函数被框架调用来插入关闭HTML标记“</Body>”和“</HTML>”到返回给客户的HTML文档中。
覆盖此成员函数以实现不同于缺省的功能。例如，当返回一个流类型而非一个HTML 流(如一个JPEG图象)时，可覆盖它。

请参阅：CHttpServer::StartContent


 CHttpServer::GetExtensionVersion

virtual BOOL GetExtensionVersion(HSE_VERSION_INFO* pVer);

返回值：如果成功，则返回非零值，否则为0。

参数：
pVer 指向HSE_VERSION_INFO结构的指针。该结构包含服务器的版本信息及为客户指示版本号，通知和优先级的字段。还有为过滤器应用登录其自身少量说明的空间。

说明：
此成员函数被框架在装载ISA时调用。GetExtensionVersion取得DLL扩展所基于的说明的版本号。它还为服务器管理提供一小段描述。
GetExtensionVersion是ISA的两个必需入口点中的一个。第二个所需的入口点是函数HttpExtensionProc。它们都由MFC提供并缺省实现。
调用缺省实现来设置版本，然后覆盖它，用你自己的简短描述替换缺省文本串。

请参阅：
HSE_VERSION_INFO, CHttpServer::HttpExtensionProc


 CHttpServer::GetTitle

virtual LPCTSTR GetTitle( ) const;

返回值：一个指向包含标题的字符串的指针。

说明：
此成员函数被框架调用，以获得发送给客户的HTML文档的标题。
可覆盖它，提供你自己的标题。


 CHttpServer::HttpExtensionProc

virtual DWORD HttpExtensionProc(EXTENSION_CONTROL_BLOCK* pECB);

返回值：
下列某个HTTP服务器扩展消息：
· | HSE_STATUS_SUCCESS | ISA已结束处理，服务器可释放连接并释放分配的资源。
· | HSE_STATUS_SUCCESS_AND_KEEP_CONN | ISA已结束处理，若客户机支持永久性连接，服务器应等待下一个HTTP请求。如果可以发送正确内容长度的标题给客户，则只能返回此值。服务器无须保持此会话打开。
· | HSE_STATUS_PENDING | ISA已将请求放到队列来处理，结束时不会通知服务器。请参阅CHttpServerContext::ServerSupport函数下的HSE_REQ_DONE_WITH_SESSION。
· | HSE_STATUS_ERROR | ISA在处理请求时遇到错误，服务器可释放连接并释放分配的资源。

参数：
pECB 一个指向EXTENSION_CONTROL_BLOCK结构的指针。

说明：
此成员函数被每个请求ISA的框架调用。HttpExtensionProc 使用此回调函数来读取数据并决定采取什么操作。在返回给服务器之前，一个适当格式化了的回答必须通过CHttpServerContext::WriteClient或CHttpServerContext::ServerSupportFunction成员函数发送给客户。
推荐使用HttpExtensionProc的缺省实现；但是，你可覆盖此成员函数来定制实现。

请参阅：
CHttpServerContext::WriteClient, CHttpServerContext::ServerSupportFunction


 CHttpServer::InitInstance

virtual BOOL InitInstance(CHttpServerContext* pCtxt);

返回值：
如果初始化成功，则返回非零值，否则为0。

参数：
pCtxt 一个指向CHttpServerContext对象的指针。

说明：
此成员函数被框架调用来初始化一个CHttpServer对象。InitInstance在CHttpServer::HttpExtensionProc中被调用，后者被每个ISA的框架调用。可覆盖此成员函数以提供CHttpServer的定制初始化。


 CHttpServer::OnParseError

virtual BOOL OnParseError( CHttpServerContext* pCtxt, int nCause );

返回值：
如果错误已被成功分析，则返回非零值，否则为0。

参数：
pCtxt一个指向CHttpServerContext对象的指针。此对象包含一个EXTENSION_ CONTROL_BLOCK结构函数dwHttpStatusCode。这些状态值是：
·HTTP_STATUS_BAD_REQUEST
·HTTP_STATUS_AUTH_REQUIRED
·HTTP_STATUS_FORBIDDEN
·HTTP_STATUS_NOT_FOUND
·HTTP_STATUS_SERVER_ERROR
·HTTP_STATUS_NOT_IMPLEMENTED

nCause出错原因。可能为以下值之一：
枚举类型 | 描述
CallOK | OnParseError已处理此错误
CallParamRequired | 某个所需参数丢失
CallBadParamCount | 参数太多或太少
CallBadCommand | 命令名未找到
CallNoStackSpace | 无有效栈空间
CallNoStream | 无有效CHtmlStream
CallMissingQuote | 某参数格式错误
CallMissingParams | 无有效参数
CallBadParam | 某参数有错误格式

说明：
被框架调用来分析错误。一旦确定错误，与出错原因有关的消息在HTML流或CHttpServerContext::WriteClient消息中返回给客户。
覆盖此成员函数以定制错误分析。


 CHttpServer::OnWriteBody

BOOL OnWriteBody(CHttpServerContext* pCtxt, LPBYTE pbData, LPDWORD dwWrite, DWORD dwReserved = 0);

返回值：如果失败，则为0，成功则为非零。

参数：
pCtxt | 一个指向CHttpServerContext对象的指针。
pbData | 将写入客户机的数据。
dwWrite | 写入客户机的字节数。
dwReserved | 保留以备用；必须为0。

说明：
覆盖此函数以将数据写回服务器。只有当所有下列情况为真时，MFC才调用此函数：
· | 已将与CHttpServerContext对象关联的CHtmlStream的数据组织为流。
· | 未将CHttpServerContext::m_bSendHeaders设置为FALSE。
· | 在处理请求时没有其它错误发生。
此函数通过调用CHttpServerContext::WriteClient来将数据写回客户机。如果CHttpServerContext对象已被设置的尺寸太大，将会有对CHttpServerContext:: WriteClient的多次调用。

请参阅：
CHttpServerContext::SetChunkSize, CHttpServerContext::GetChunkSize


 CHttpServer::StartContent

virtual void StartContent( CHttpServerContext* pCtxt ) const;

参数：
pCtxt 一个指向CHttpServerContext对象的指针。

说明：
此成员函数被框架调来将开始的HTML 标记 “<Body>”和“<HTML>”插入到将返回给客户的HTML文档中。
覆盖此成员函数来实现不同于缺省的功能。例如，当返回除HTML流(象JPEG 图象)外的流类型时，可覆盖它。

请参阅：CHttpServer::EndContent


 CHttpServer::TerminateExtension

BOOL TerminateExtension (DWORD dwFlags);

返回值：
如果dwFlags设置为HSE_TERM_ADVISORY_UNLOAD，此函数的覆盖会返回TRUE，表示可安全退出；或返回FALSE，表示未准备好卸载。如果dwFlags设置为HSE_TERM_MUST_UNLOAD，则服务器正强行扩展，超出内存，返回值被忽略。

参数：
dwFlags一个位字段，包括下列值：
· | HSE_TERM_ADVISORY_UNLOAD | 服务器想卸载扩展。如果可以卸载，扩展返回TRUE；若服务器不应卸载扩展，则返回FALSE。
· | HSE_TERM_MUST_UNLOAD | 服务器指示扩展将被卸载，不可拒绝扩展；返回值会被忽略。

说明：
TerminateExtension给你一个安全的方法来清空线程并完成其它关闭活动。


 CHttpServer::WriteTitle

virtual void WriteTitle( CHttpServerContext* pCtxt ) const;

参数：
pCtxt 一个指向CHttpServerContext对象的指针。

说明：
此成员函数被框架调用，写入标题，插入传输回客户机的文档的适当HTML标记之间。
缺省实现将从GetTitle返回的标题写入HTML标记“<Title>”和“</Title>”之间。可覆盖此成员函数以提供一个不同的标题。

请参阅：CHttpServer::GetTitle


 CHttpServerContext

CHttpServerContext没有基类。
CHttpServerContext提供CHttpServer对象所需的工具，处理客户发送给HTTP服务器的数据。当Microsoft Internet Information Server (MIIS)收到客户浏览器发来的请求时，一个CHttpServer对象被创建并初始化，同时一个CHttpServerContext对象被创建。当服务器扩展DLL处理请求时，它使用CHttpServerContext成员函数来执行任务。
CHttpServerContext对象独立于CHttpServer对象而存在，以允许多线程。一个模块中只能有一个CHttpServer存在，但服务器可能需要同步处理多个客户请求。
处理多个请求时，CHttpServer为每个请求创建一个CHttpServerContext。一个CHttpServer对象使用多个CHttpServerContext对象，以独立线程运行。此设计允许使用不同的客户连接对CHttpServer对象进行同时的、多个调用。
当一个扩展DLL(ISA)被调用时，成员函数ServerSupportFunction为ISA提供一些普通用途的函数，以及HTTP服务器实现的指定的函数。
如果服务器必须将某些东西——例如，一个错误——立即传给客户，请调用WriteClient。否则，服务器应输出一个消息到客户机的由pCtxt 参数传递的m_pStream数据成员。
#include <afxisapi.h>
请参阅：CHttpServer

CHttpServerContext类的成员

数据成员
m_bSendHeaders | 一个标记，控制标题是否包含在HTTP请求中
m_pECB | 一个指向EXTENSION_CONTROL_BLOCK结构的指针
m_pStream | 一个指向CHtmlStream的指针

构造函数
CHttpServerContext 构造一个CHttpServerContext对象

操作
GetServerVariable | 拷贝与HTTP连接或服务器自身有关的信息到所提供的缓冲区中
WriteClient | 立即发送信息给HTTP客户
ReadClient | 发送来自网络客户的HTTP请求体到调用者提供的缓冲区中
ServerSupportFunction | 为ISA提供一些普通用途的函数，以及HTTP服务器实现的指定的函数
TransmitFile | 发送服务器文件中的数据给请求者
GetChunkSize | 获得当前的块大小
SetChunkSize | 获得当前上下文的块大小

操作符
operator << 向流中写数据


 CHttpServerContext::CHttpServerContext

CHttpServerContext(EXTENSION_CONTROL_BLOCK* pECB);

参数：
pECB 一个指向EXTENSION_CONTROL_BLOCK数据结构的指针。

说明：
此成员函数在构造一个CHttpServerContext对象时被框架调用。


 CHttpServerContext::GetChunkSize

DWORD SetChunkSize() const;

返回值：块大小。

说明：调用此成员函数以获得当前块的大小。

请参阅：
CHttpServerContext::SetChunkSize, CHttpServer::OnWriteBody


 CHttpServerContext::GetServerVariable

BOOL GetServerVariable(LPTSTR lpszVariableName, LPVOID lpvBuffer, LPDWORD lpdwSize);

返回值：
如果成功，则返回非零值，否则为0。如果调用失败，Windows函数GetLastError被调用，以确定错误原因。可能的错误值包括：
值 | 含义
ERROR_INVALID_PARAMETER | 错误连接句柄
ERROR_INVALID_INDEX | 错误或不支持的变量标识符
ERROR_INSUFFICIENT_BUFFER | 缓冲区太小，需要*lpdw中返回的大小
ERROR_MORE_DATA | 缓冲区太小，只有部分数据返回。整个数据大小未返回
ERROR_NO_DATA | 所请求的数据无效

参数：
lpszVariableName | 空终止符的字符串，指示正请求哪个变量。请参阅说明部分，以了解当前变量的列表。
lpvBuffer | 指向接收请求信息的缓冲区的指针。
lpdwSize | 指向DWORD，指示缓冲区中有效的字节数。正确结束时，DWORD包含传输入缓冲区的字节数（包括空终止符）。

说明：
此函数拷贝HTTP连接或服务器自身有关的信息到调用者提供的缓冲区中。
可能的lpszVariableNames值包括：
值 | 含义
AUTH_TYPE | 包含使用的鉴定类型。例如，若Basic鉴定被使用，则此字符串将为“Basic”。对于Windows NT Challenge-response，将为“NTLM”。其它鉴定有另外的字符串。由于新的鉴定类型可被添加到Internet Server中，故不可能列出所有可能的字符串。如果字符串为空，则未使用鉴定
CONTENT_LENGTH | 可从客户那里收到的脚本的字节数
CONTENT_TYPE | 由POST主体提供的信息的内容类型
GATEWAY_INTERFACEPATH_INFO | 服务器所遵守的CGI说明的修订本。当前版本是CGI/1.1附加的路径信息，如由客户指定的。它比较扩展DDL（脚本）名之后，查询字符串之前的URL的调试部分(如果有的话)
PATH_TRANSLATED | 这是PATH_INFO的值，但还有扩展到指定的目录的虚路径名
QUERY_STRING | URL中“?”后的参考此扩展DDL的信息
REMOTE_ADDR | 客户的IP地址
REMOTE_HOST | 客户的用户名
REMOTE_USER | 包含由客户提供的和由服务器鉴定的用户名
REQUEST_METHOD | HTTP请求方法
SCRIPT_NAME | 正在执行的脚本程序名
SERVER_NAME | 将出现在自参考URL中的服务器的用户名(或IP地址)
SERVER_PORT | 接收请求的TCP/IP端口
SERVER_PROTOCOL | 与此请求有关的信息获取协议的名称和版本，通常为HTTP/1.0
SERVER_SOFTWARE | ISA或服务器扩展DLL程序运行的网络服务器的名称和版本
ALL_HTTP | 未被文法分析映射成为某个上述变量的HTTP标题
HTTP_ACCEPT | 特殊的HTTP标题。Accept: 字段的值是连接的，用“，”隔开。例如，下面几行为HTTP标题的一部分: accept: */*;q=0.1 accept: text/html accept: image/jpeg 然后，HTTP_ACCEPT 变量将有一个值： */*;q=0.1，text/html，image/jpeg


 CHttpServerContext::ReadClient

BOOL ReadClient( LPVOID lpvBuffer, LPDWORD lpdwSize );

返回值：
如果成功，则返回非零值，否则为0。如果服务器用来侦听客户的套接字关闭，将返回非零值，但读取零字节。
如果调用失败，则Windows函数GetLastError被调用，确定出错原因。

参数：
lpvBuffer | 指向接收请求信息的缓冲区区域的指针。
lpdwSize | 指向DWORD的指针，提示缓冲区中的有效字节数。返回的*lpdwSize将包含实际传输到缓冲区的字节数。

说明：
调用此成员函数从Web 客户 HTTP 请求中读取信息到调用者提供的缓冲区中。ReadClient可用来从使用POST方法的HTML表格中读取数据。如果如今有多于*lpdwSize字节的数据可被读取，ReadClient 将在传输完这么多的数据进缓冲区后返回。否则将输入数据组织成块，并等待有够用的缓冲区空间。

请参阅：CHttpServerContext::WriteClient


 CHttpServerContext::ServerSupportFunction

BOOL ServerSupportFunction( DWORD dwHSERRequest, LPVOID lpvBuffer, LPDWORD lpdwSize, LPDWORD lpdwDataType );

返回值：
如果成功，则返回非零值，否则为0。

参数：
dwHSERRequest | 一个HTTP服务器扩展值。请参阅说明部分以了解所支持值的列表。
lpvBuffer | 与HSE_REQ_SEND_RESPONSE_HEADER一起使用时，它表示一个空终止的状态字符串（例如，“401 Access Denied”)。如果缓冲区为空，此函数将发送缺省回答“200 OK”。当与HSE_REQ_DONE_WITH_SESSION一起使用时，它表示DWORD，指示请求的状态号。
lpdwSize | 当与HSE_REQ_SEND_RESPONSE_HEADER一起使用时，它表示缓冲区lpdwDataType的大小。
lpdwDataType | 当与HSE_REQ_SEND_RESPONSE_HEADER一起使用时，这是一个空终止字符串，表示可选标题或数据将被添加并与标题一起发送。如果为NULL，标题将以“\r\n”结束。
注意：
一般用途的函数有一个比HSE_REQ_END_RESERVED大的dwHSERRequest值。比HSE_REQ_END_RESERVED大的值是为强制的ServerSupportFunctions 保留的，不能使用。

说明：
调用此成员函数以给ISA提供一般用途的函数以及HTTP服务器实现的指定的函数。
HTTP服务器扩展值被dwHSERRequest代替，可能为：
· | HSE_REQ_SEND_URL_REDIRECT_RESP | 发送302(URL Redirect)消息给客户。此调用后无须进一步处理。此操作相当于CGI脚本标题中的“URI: ”。变量lpvBuffer 表示一个空终止字符串。变量lpdwSize与lpvBuffer一样大小。变量lpdwDataType被忽略。
· | HSE_REQ_SEND_URL | 发送由URL确定的数据给客户，若客户请求了该URL。由lpvBuffer表示的空终止URL必须在服务器上，且不能规定协议信息（例如，必须以‘/’开始）。此调用后无须进一步处理。DWORD的变量lpdwSize与lpvBuffer大小一样。变量lpdwDataType被忽略。
· | HSE_REQ_SEND_RESPONSE_HEADER | 发送一个完整的HTTP服务器回答，包括状态、服务器版本、消息时间和MIME 版本。ISA 或服务器扩展应在末尾增加HTTP标题，例如Content-Type，Content-Length等等，以特殊的“\r\n”结束。
· | HSE_REQ_DONE_WITH_SESSION | 如果ISA或服务器扩展因由扩展处理请求而想保持会话，则需告诉服务器会话何时结束以使服务器能关闭并释放有关结构。变量lpvBuffer，lpdwSize和lpdwDataType均被忽略。
· | HSE_REQ_END_RESERVED | 比此值高的函数是服务器指定的，并不对所有支持ISAPI的服务器均有效。
· | HSE_REQ_MAP_URL_TO_PATH | lpvBuffer参数是指向缓冲区的指针，此缓冲区包含逻辑入口路径和退出的物理路径。lpdwSize参数是一个指向DWORD的指针，它包含进入时lpvBuffer 传递的缓冲区大小和退出时缓冲区中放入的字节数。lpdwDataType 参数被忽略。它是一个Microsoft的指定的扩展。
· | HSE_REQ_GET_SSPI_INFO | lpvBuffer与上下文的句柄一起加入，而 *lpdwDataType 与证明书句柄一起加入。上下文的句柄确定指针类型和类型标识符。证明书的句柄确定证明有效和授权。
· | HSE_REQ_TRANSMIT_FILE | 请参阅TransmitFile以了解传输文件给请求者的一种更简单的方法。
注意：
服务器不保证加入此处理前缓冲区足够大，lpdwSize未被更新以反映拷贝入lpvBuffer 缓冲区的数据总量。因为是固定大小的结构，所以认为传来的指针是指向结构的指针,且必须与请求的结构一样大。

请参阅：
CHttpFilterContext::ServerSupportFunction, CHttpServerContext::TransmitFile


 CHttpServerContext::SetChunkSize

DWORD SetChunkSize(DWORD dwNewSize);

返回值：前一个块的大小。

参数：
dwNewSize 新的块的大小。

说明：
调用此成员函数为当前的上下文设置块的大小。块的大小是一个独立写操作中写数据时MFC 将发送回的字节数，从CHttpServerContext对象的流主体到客户。块的大小在上下文被创建时初始化为0。为0的块大小表示MFC试图在一次操作中写入完整的流。其它值导致框架将回答主体分为不大于指定大小的块。
设置一个块的大小并不必需，但它在你使用HTTPS时是需要的，因为HTTPS每次操作最多只能写入14千字节。HTTPS是HTTP协议的一个变形，对传输协议使用安全套接子层。

请参阅：
CHttpServerContext::GetChunkSize, CHttpServer::OnWriteBody


 CHttpServerContext::TransmitFile

BOOL TransmitFile( HANDLE hFile,
DWORD dwFlags = HSE_IO_DISCONNECT_AFTER_SEND,
LPVOID pstrHeader = NULL,
DWORD dwHeaderLen = 0,
LPVOID pstrTrailer = NULL,
DWORD dwTrailerLen = 0
);

返回值：
如果文件数据已发送，则为TRUE，否则为FALSE。要得到扩展的错误信息，请调用GetLastError。如果一个I/O操作在TransmitFile返回前未完成，函数返回FALSE。此时，GetLastError返回ERROR_IO_PENDING。

参数：
hFile | 对包含传送数据的文件的处理。此文件必须已用FILE_FLAG_SEQUENTIAL_SCAN和FILE_FLAG_OVERLAPPED打开过。
dwFlags | 与文件相关的属性。缺省为HSE_IO_DISCONNECT_AFTER_SEND。请参阅联机文档“平台SDK”中的ServerSupportFunction， 以了解可能的属性的列表。
pstrHeader | 一个指向包含传送文件数据前的标题的字符串的指针。此标题将发送的数据类型及其应如何显示的信息传给接收浏览器。如果为NULL，则标题未发送。
dwHeaderLen | 标题长度。缺省为0，pPstrHeader不为NULL，而dwHeaderLen为0，此函数将使用Win32的函数Istrlen来查找尾串长（此时，必须为空终止字符串）。
pstrTrailer | 一个指向包含传送完文件数据后的调试字符串的指针。如果为NULL，尾串未发送。
dwTrailerLen | 尾串长。缺省为0。如果pstrTrailer不为NULL，而dwTrailerLen为0，此函数将使用Win32的函数Istrlen来查找调试串（此时，必须为空终止字符串）。

说明：
调用此成员函数来传送一个文件给请求者。此成员函数执行操作Server-SupportFunction命令标记HSE_REQ_TRANSMIT_FILE。服务器异步执行此操作。服务器提交此操作到其内部I/O队列并返回给调用者。MFC改变上下文对象来返回HSE_STATUS_PENDING，并在调用指示I/O完成时使用HSE_DONE_WITH_SESSION。MFC 还将上下文对象的m_bSendHeaders设置为FALSE，因为被自动发送。

请参阅：CHttpFilterContext::ServerSupportFunction


 CHttpServerContext::WriteClient

BOOL WriteClient( LPVOID lpvBuffer, LPDWORD lpdwBytes, DWORD dwReserved = 0 );

返回值：
如果成功，则返回非零值，否则为0。如果调用失败，Windows函数GetLastError 将被调用来确定出错原因。

参数：
lpvBuffer | 指向数据将被写入的缓冲区的指针。
lpdwBytes | 指向DWORD的指针，它含有参考Buffer的从缓冲区写入的字符数。
dwReserved | 保留以备用。

说明：
调用此成员函数以立即发送信息给HTTP 客户。例如，使用WriteClient来发送错误消息。

请参阅：CHttpServerContext::ReadClient


 CHttpServerContext::m_bSendHeaders

说明：
一个布尔标记，控制MFC是否自动发送HTTP回答中的标题。当MFC构造一个CHttpServerContext时，它将m_bSendHeaders设置为TRUE。如果将m_bSendHeaders设置为FALSE，则不发送标题。如果要保持一个连接或使用CHttpServer::AddHeader构造你自己的标题，那么限制自动标题是很有用的。

请参阅：CHttpServer::AddHeader


 CHttpServerContext::m_pECB

说明：
一个指向EXTENSION_CONTROL_BLOCK结构的指针。此结构包含描述引发此服务器扩展命令的客户和服务器之间的连接。请参阅EXTENSION_CONTROL_BLODK结构，以了解个别成员的描述。

请参阅：EXTENSION_CONTROL_BLOCK


 CHttpServerContext::m_pStream

说明：
此m_pStream数据成员是指向初始化了的CHtmlStream的指针，你的服务器可使用它来与客户通讯。多数扩展将在它们工作时往此流中写数据。在函数返回时，MFC 将把所有流中的数据写入客户机。如果函数执行时间很长，可使用WriteClient函数将数据立即发送给客户，甚至在函数结束之前。

请参阅：CHtmlStream


 CHttpServerContext::operator <<

void operator <<( LPCTSTR psz );
void operator <<( long int dw );
void operator <<( short int w );
void operator <<( const CHtmlStream& Stream);
void operator <<( double d );
void operator <<( float f );
CHttpServerContext& operator <<( const CLongBinary& blob );
CHttpServerContext& operator <<( const CByteArray& array );

说明：
CHttpServerContext插入(<<)操作符将指定的字符串或整数写入CHttpServer-Context对象的HTML流中。此操作符的字符串版本将字符串不作更改地写入。整数覆盖在写入前将值转化为十进制形式。
此操作符参数直接与你能在ISAPI文法分析映射中使用的ITS_types相符合。

请参阅：
Internet Server API (ISAPI) Parse Maps, ISAPI Extensions: ParseMaps


 CImageList

CObject
└CImageList

一个“图象列表”是相同大小图象的集合，每个图象都可由其基于零的索引来参考。图象列表用于高效管理大量的图标或位图。图象列表中的所有图象都包含在屏幕设备格式的一个简单的、宽的位图中。一个图象列表还可能包括一个包含用于透明地绘图的掩码的单色位图（图标风格）。Microsoft Win32应用编程接口(API)提供图象列表函数，可以绘图、创建和销毁图象列表、添加和删除图象、替代图象、合并图象和拖动图象。
CImageList 类提供Windows普通图象列表控件的功能。此控件(为此CImageList 类)只对运行在Windows 95和Windows NT 3.51以上的版本的程序有效。
要了解使用CImageList的更多信息，请参阅 “Visual C++程序员指南”中的“控件主题”和“使用CImageList”。
#include <afxcmn.h>

请参阅：CListCtrl, CTabCtrl

CImageList类的成员

数据成员
m_hImageList 包含附加给此对象关联的图象列表的句柄

构造函数
CImageList | 构造一个CImageList对象
Create | 初始化一个图象列表并把它附加给一个CImageList对象

属性
GetSafeHandle | 获取m_hImageList
operator HIMAGELIST | 返回附加给CImageList的HIMAGELIST
FromHandle | 在给设备一个上下文的句柄时，返回指向CImageList对象的指针。如果无CImageList对象附加给句柄，则临时CImageList对象被创建和附加
FromHandlePermanent | 在给图象列表一个句柄时，返回指向CImageList对象的指针。如果无CImageList对象附加给句柄，则返回NULL
DeleteTempMap | 被CWinApp闲置处理程序调用，删除一个由FromHandle创建的临时CImageList对象
GetImageCount | 获取图象列表中的图象数
SetBkColor | 设置图象列表的背景色
GetBkColor | 获取图象列表的当前背景色
GetImageInfo | 获取图象信息

操作
Attach | 将一个图象列表附加给一个CImageList对象
Detach | 分离某图象列表对象与某CImageList对象并返回图象列表的句柄
DeleteImageList | 删除一个图象列表
SetImageCount | 重新设置图象列表中的图象数
Add | 添加一个或多个图象到图象列表中
Remove | 从图象列表中移走一个图象
Replace | 用新图象替代图象列表中的图象
ExtractIcon | 构造一个基于某图象的图标的图象列表或掩码
Draw | 绘制在某拖拉操作中正被拖动的图象
SetOverlayImage | 添加一个图象基于零的索引到将被用于覆盖掩码的图象列表中
Copy | 拷贝CimageList对象中的图象
DrawIndirect | 绘制图象列表中的图象
SetDragCursorImage | 创建一个新的拖动图象
GetDragImage | 取得用于拖动的临时图象列表
Read | 从归档文件中读取图象列表
Write | 往归档文件中写图象列表
BeginDrag | 开始拖动图象
DragEnter | 在拖动操作中封锁更新并在确定位置显示拖动图象
EndDrag | 结束一个拖动操作
DragLeave | 解冻窗口并隐藏拖动图象，使窗口能被更新
DragMove | 移动正在拖放操作中被拖动的图象
DragShowNolock | 在一个拖动操作中显示或隐藏拖动图象，不封锁窗口


 CImageList::Add

int Add( CBitmap* pbmImage, CBitmap* pbmMask );
int Add( CBitmap* pbmImage, COLORREF crMask );
int Add( HICON hIcon );

返回值：
如果成功，则为第一个新图象的基于零的索引，否则为-1。

参数：
pbmImage | 指向包含一个或多个图象的位图的指针。图象数由位图宽推断。
pbmMask | 指向包含掩码的位图的指针。如果无掩码与图象列表一起使用，则此参数被忽略。
crMask | 生成掩码的颜色。指定位图中的此颜色的每个像素被改为黑色，掩码中的相应位数被设置为1。
hIcon | 包含新图象的位图和掩码的图标的句柄。

说明：
调用此函数来添加一个或多个图象或图标到图象列表中。

请参阅：
CImageList::Remove, CImageList::Replace, COLORREF


 CImageList::Attach

BOOL Attach( HIMAGELIST hImageList );

返回值：如果附加成功，则返回非零值，否则为0。

参数：
hImageList 一个图象列表的句柄。

说明：调用此函数将某图象列表附加给一个CImageList对象。

请参阅：
CImageList::Detach, CImageList::GetSafeHandle


 CImageList::BeginDrag

BOOL BeginDrag( int nImage, CPoint ptHotSpot );

返回值：如果成功，则返回非零值，否则为0。

参数：
nImage | 拖动的图象的基于零的索引。
ptHotSpot | 开始拖动处的光标（典型地，光标位置处）。坐标相对于图象的左上角。

说明：
调用此函数开始拖动一个图象。此函数构造一个用于拖动的临时图象列表。此图象靠在当前光标处组合指定的图象及其掩码。回答下面的WM_MOUSEMOVE消息时，可使用DragMove成员函数移动拖动图象。你可使用EndDrag成员函数结束此拖动操作。

请参阅：
CImageList::Draw, CImageList::EndDrag, CImageList::DragMove


 CImageList::CImageList

CImageList( );

说明：构造一个CImageList对象。

请参阅：CImageList::Create


 CImageList::Copy

BOOL Copy( int iDst,int iSrc,UINT uFlags = ILCF_MOVE);
BOOL Copy( int iDst,CImageList* pSrc,int iSrc,UINT uFlags = ILCF_MOVE );

返回值：如果成功，则返回非零值，否则为0。

参数：
iDst | 用作拷贝操作目标的图象的基于零的索引。
iSrc | 用作拷贝操作源的图象的基于零的索引。
uFlags确定拷贝操作类型的位标记值。此参数可能为以下值之一：
值 | 含义
ILCF_MOVE | 拷贝到目标图象索引的源图象。此操作产生指定图象的多个实例。
ILCF_MOVE | 是缺省的ILCF_SWAP图象列表中的源图象和目标图象交换位置

pSrc 指向作为拷贝操作目标的CImageList对象的指针。

说明：
此成员函数实现Win32函数ImageList_Copy的功能，如同联机文档“Platform SDK”所描述的。


 CImageList::Create

BOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow );
BOOL Create( UINT nBitmapID, int cx, int nGrow, COLORREF crMask );
BOOL Create( LPCTSTR lpszBitmapID, int cx, int nGrow, COLORREFcrMask );
BOOL Create( CImageList& ImageList1, int nImage1, CImageList& ImageList2, int nImage2, int dx, int dy );

返回值：如果成功，则返回非零值，否则为0。

参数：
cx | 每个图象的尺寸，以像素为单位。
cy | 每个图象的尺寸，以像素为单位。
nFlags确定创建的图象列表类型。此参数可能为以下值的组合，但只能有一个ILC_COLOR值。
值 | 含义
ILC_COLOR | 如果没有其它ILC_COLOR* 标记被确定，则使用缺省行为。典型地，缺省为ILC_COLOR4;但对于旧的显示驱动程序，缺省为ILC_COLORDDB
ILC_COLOR4 | 使用4位（16色）设备独立位图(DIB)部分作为图象列表的位图
ILC_COLOR8 | 使用8位DIB部分。彩色表格使用的颜色与半色调调色板的一样
ILC_COLOR16 | 使用16位（32/64K色）DIB部分
ILC_COLOR24 | 使用24位DIB部分
ILC_COLOR32 | 使用32位DIB部分
ILC_COLORDDB | 使用设备独立位图
ILC_MASK | 使用掩码。图象列表包含两个位图，其中一个是用做掩码的位图。如果不包括此值，图象列表只包含一个位图
nInitial | 图象列表最初包含的图象数。
nGrow | 当系统需要改变列表为新图象准备空间时，图象列表可生成的图象数。此参数替代改变的图象列表所能包含的新图象数。
nBitmapID | 与图象列表联系的位图的源ID。
crMask | 用于生成一个掩码的颜色。此指定的位图中的颜色的每个像素变为黑色，掩码中相应位设置为1。
lpszBitmapID | 包含图象的源ID的字符串。
ImageList1 | CImageList对象的参考。
nImage1 | 第一个存在的图象的索引。
ImageList2 | CImageList对象的参考。
nImage2 | 第二个存在的图象的索引。
dx | 每个图象的尺寸，用像素表示。
dy | 每个图象的尺寸，用像素表示。

说明：
需要两步构造一个CImageList。首先调用构造函数，然后调用Create，创建图象列表并附加给CImageList对象。

请参阅：CImageList::CImageList, COLORREF


 CImageList::DeleteImageList

BOOL DeleteImageList( );

返回值：如果成功，则返回非零值，否则为0。

说明：调用此函数删除一个图象列表。

请参阅：CImageList::Detach


 CImageList::DeleteTempMap

static void PASCAL DeleteTempMap();

说明：
被CWinApp闲置时间处理程序自动调用，DeleteTempMap删除任何由FromHandle创建的临时CImageList对象，但不毁弃任何与临时对象有关的句柄(hImageList)。


 CImageList::Detach

HIMAGELIST Detach( );

返回值：一个图象列表对象的句柄。

说明：
调用此函数把一个图象列表与一个CImageList对象分离。此函数返回图象列表对象的句柄。

请参阅：
CImageList::Attach, CImageList::DeleteImageList


 CImageList::DragEnter

static BOOL DragEnter( CWnd* pWndLock, CPoint point );

返回值：如果成功，则返回非零值，否则为0。

参数：
pWndLock | 指向拥有拖动图象的窗口的指针。
point | 显示拖动图象的位置。坐标相对于左上角窗口（而非客户域）。

说明：
拖动操作中，封锁对pWndLock确定的窗口的更新，在由point确定的位置显示拖动图象。
坐标相对于左上角窗口，因此必须在确定坐标时补偿窗口元素的宽度，如边界、标题条、菜单条。
如果pWndLock为NULL，此函数在与桌面窗口有关的上下文中绘制图象，坐标相对于屏幕左上角。
此函数在拖动操作中封锁所有其它对指定窗口的更新。如果要在拖动操作中进行绘图，如高亮显示一个拖放操作的目标，可通过使用CImageList::DragLeave函数临时隐藏拖动了的图象。

请参阅：
CImageList::BeginDrag, CImageList::EndDrag, CImageList::DragMove, CImageList::DragLeave


 CImageList::DragLeave

static BOOL DragLeave( CWnd* pWndLock );

返回值：如果成功，则返回非零值，否则为0。

参数：
pWndLock 指向拥有拖动图象的窗口。

说明：
解锁由pWndLock确定的窗口并隐藏拖动图象，允许窗口更新。

请参阅：
CImageList::BeginDrag, CImageList::EndDrag, CImageList::DragMove, CImageList::DragEnter


 CImageList::DragMove

static BOOL DragMove( CPoint pt );

返回值：如果成功，则返回非零值，否则为0。

参数：
pt 新的拖动位置。

说明：
调用此函数移动在拖放操作中正被拖动的图象。此函数典型地被调用来回答 WM_MOUSEMOVE消息。开始拖动操作，请使用BeginDrag成员函数。

请参阅：
CImageList::BeginDrag, CImageList::EndDrag, CImageList::Draw


 CImageList::DragShowNoLock

static BOOL DragShowNoLock( BOOL bShow );

返回值：如果成功，则返回非零值，否则为0。

参数：
bShow 确定是否显示拖动图象。

说明：
在拖动操作中显示或隐藏图象，无须封锁窗口。
CImageList::DragEnter函数封锁所有拖动操作中的更新。但此函数不封锁窗口。

请参阅：
CImageList::BeginDrag, CImageList::EndDrag, CImageList::DragEnter, CImageList::DragLeave, CImageList::Draw


 CImageList::Draw

BOOL Draw( CDC* pdc, int nImage, POINT pt, UINT nStyle );

返回值：如果成功，则返回非零值，否则为0。

参数：
pdc | 指向目标设备上下文的指针。
nImage | 所绘制图象的基于零的索引。
pt | 在确定设备上下文绘图的位置。
nStyle确定绘图风格的标记。可能为下列值中的一个或多个：
值 | 含义
ILD_BLEND25，ILD_FOCUS | 绘制图象，混合系统高亮色的25%。如果图象列表不包含掩码，此值无效
ILD_BLEND50，ILD_SELECTED，ILD_BLEND | 绘制图象，混合系统高亮色的50%。如果图象列表不包含掩码，此值无效
ILD_MASK | 绘制掩码
ILD_NORMAL | 使用图象列表的背景色绘制图象。如果背景色为CLR_NONE值，此图象用掩码透明地绘制而成
ILD_TRANSPARENT | 使用掩码绘制图象，不考虑背景色

说明：调用此函数绘制在拖放操作中正在被拖动的图象。

请参阅：
CImageList::BeginDrag, CImageList::EndDrag, CImageList::DragMove


 CImageList::DrawIndirect

BOOL DrawIndirect( IMAGELISTDRAWPARAMS* pimldp);
BOOL DrawIndirect( CDC* pDC,
int nImage,
POINT pt,
SIZE sz,
POINT ptOrigin,
UINT fStyle = ILD_NORMAL,
DWORD dwRop = SRCCOPY,
COLORREF rgbBack = CLR_DEFAULT,
COLORREF rgbFore = CLR_DEFAULT
);

返回值：如果图象成功绘制，则为TRUE，否则为FALSE。

参数：
pimldp | 指向包含拖动操作信息的IMAGELISTDRAWPARAMS的指针。
pDC | 指向目标设备上下文的指针。此时必须删除此CDC对象。
nImage | 所绘制图象的基于零的索引。
pt | 一个POINT结构，包含图象将被绘制的图象的X和Y 坐标。
sz | 一个SIZE结构，表示所绘制图象的大小。
ptOrigin | 一个POINT结构，包含按照图象自身确定的拖动操作的左上角X和Y坐标。图象左X坐标和上Y坐标像素未绘制。
fStyle标记，确定绘图风格和图象覆盖。请参阅说明部分得到覆盖图象的信息。MFC的缺省实现ILD_NORMAL使用图象列表的背景色绘制图象。如果背景色为CLR_NONE值，图象使用掩码绘制。
其它可能的风格描述在IMAGELISTDRAWPARAMS结构的fStyle成员里。
dwRop确定光栅操作代码的值。此代码定义了源矩形颜色数据如何与目标矩形颜色数据组合以获得最终颜色。MFC的缺省实现，SRCCOPY直接拷贝源矩形到目标矩形。如果fStyle参数不包括在ILD_ROP标记中，此参数被忽略。
其它可能的值描述在IMAGELISTDRAWPARAMS结构的dwRop成员里。
rgbBack图象背景色，缺省为CLR_DEFAULT。此参数可为应用定义RGB值或下列值中的一个：
值 | 含义
CLR_DEFAULT | 缺省背景色。使用图象列表背景色绘制图象
CLR_NONE | 无背景色。图象透明地绘制

rgbFore图象前景色，缺省为CLR_DEFAULT。此参数可为应用定义RGB值或下列值中的一个：
值 | 含义
CLR_DEFAULT | 缺省前景色。使用系统高亮色作为前景色绘制图象
CLR_NONE | 无混合色。此图象与目标设备上下文的颜色混合 当fStyle包含ILD_BLEND25和ILD_BLEND50标记时，才使用此参数。

说明：
调用此成员函数从图象列表中绘制图象。如果要自己填入Win32结构，请使用第一个版本。如果要利用一个或更多的MFC缺省参数或避免管理结构，请使用第二个版本。
覆盖图象绘制在基本图象顶部，由此成员函数的nImage参数确定。使用成员函数与由使用INDEXTOOVERLAYMASK宏确定的覆盖掩码的基于零的索引来绘制覆盖掩码。

请参阅：CImageList::SetOverlayImage


 CImageList::EndDrag

static void EndDrag( );

说明：
调用此函数结束拖动操作。使用BeginDrag成员函数开始一个拖动操作。

请参阅：
CImageList::BeginDrag, CImageList::Draw, CImageList::DragMove


 CImageList::ExtractIcon

HICON ExtractIcon( int nImage );

返回值：如果成功，则为图标句柄，否则为NULL。

参数：
nImage 图象基于零的索引。

说明：
调用此函数来创建一个基于某图象的图标及其图象列表中的相关掩码。

请参阅：CImageList::Replace


 CImageList::FromHandle

static CImageList* PASCAL FromHandle( HIMAGELIST hImageList);

返回值：如果成功，则为指向CImageList对象的指针，否则为NULL。

参数：
hImageList 指定图象列表。

说明：
指定图象列表句柄时，返回指向CImageList对象的指针。如果CImageList没有附加给句柄，则CImageList对象被创建和附加。此临时CImageList对象只有在事件循环中下一次应用有闲置时间时才有效，此时所有临时对象都已删除。

请参阅：CImageList::FromHandlePermanent


 CImageList::FromHandlePermanent

static CImageList* PASCAL FromHandlePermanent( HIMAGELIST hImageList);

返回值：
如果成功，则为指向CImageList对象的指针，否则为NULL。

参数：
hImageList 指定图象列表。

说明：
指定图象列表句柄时，返回指向CImageList对象的指针。如果CImageList对象未附加给句柄，则返回NULL。

请参阅：CImageList::FromHandle


 CImageList::GetBkColor

COLORREF GetBkColor( ) const;

返回值：CImageList对象背景色的RGB值。

说明：调用此函数来获取图象列表的当前背景色。

请参阅：CImageList::SetBkColor, COLORREF


 CImageList::GetDragImage

static CImageList* GetDragImage( LPPOINT lpPoint, LPPOINT lpPointHotSpot );

返回值：
如果成功，则为指向用于拖动的临时图象的指针，否则为NULL。

参数：
lpPoint | 接收当前拖动位置的POINT结构的地址。
lpPointHotSpot | POINT结构的地址，接收相对于拖动位置的拖动图象的偏移量。

说明：获得用于拖动的临时图象列表。

请参阅：CImageList::SetDragCursor


 CImageList::GetImageCount

int GetImageCount( ) const;

返回值：图象数。

说明：调用此函数以获取图象列表中的图象数。

请参阅：CImageList::GetImageInfo


 CImageList::GetImageInfo

BOOL GetImageInfo( int nImage, IMAGEINFO* pImageInfo ) const;

返回值：如果成功，则返回非零值，否则为0。

参数：
nImage | 图象的基于零的索引。
pImageInfo | 指向接收图象信息的IMAGEINFO结构的指针。结构中的信息用于直接为图象操作位图。

说明：
调用此函数以获取有关图象的信息。
IMAGEINFO结构包含图象列表中图象的信息。

请参阅：CImageList::GetImageCount


 CImageList::GetSafeHandle

HIMAGELIST GetSafeHandle( ) const;

返回值：
附加图象列表的句柄。否则，如果没有附加对象，则为NULL。

说明：调用此函数以获取m_hImageList数据成员。

请参阅：
CImageList::Attach, CImageList::Detach, CImageList::m_hImageList


 CImageList::Read

BOOL Read( CArchive* pArchive );

返回值：如果成功，则返回非零值，否则为0。

参数：
pArchive 指向CArchive对象的指针，通过它读取图象列表。

说明：调用此函数从归档文件中读取图象列表。

请参阅：CImageList::Write


 CImageList::Remove

BOOL Remove( int nImage );

返回值：如果成功，则返回非零值，否则为0。

参数：
nImage 要移走的图象的基于零的索引。

说明：调用此函数从图象列表对象中移走一个图象。

请参阅：CImageList::DeleteImageList


 CImageList::Replace

BOOL Replace( int nImage, CBitmap* pbmImage, CBitmap* pbmMask );
int Replace( int nImage, HICON hIcon );

返回值：
如果成功，则BOOL的版本返回非零值，否则为0。如果成功，则int的版本返回图象基于零的索引，否则为-1。

参数：
nImage | 要替换的图象的基于零的索引。
pbmImage | 指向包含图象的位图的指针。
pbmMask | 指向包含掩码的位图的指针。如果无掩码与图象列表一起使用，此参数被忽略。
hIcon | 包含新图象的位图和掩码的图标的句柄。

说明：
调用此函数，用新图象替换图象列表中的一个图象。
调用SetImageCount后，调用此成员函数来指派新的、有效的图象到占位符图象索引数值中。

请参阅：CImageList::Remove


 CImageList::SetBkColor

COLORREF SetBkColor( COLORREF cr );

返回值：如果成功，则为先前的背景色，否则为CLR_NONE。

参数：
cr 设置的背景色，可为CLR_NONE。此时图象用掩码透明地绘制。

说明：调用此函数设置图象列表的背景色。

请参阅：CImageList::GetBkColor, COLORREF


 CImageList::SetDragCursor

ImageBOOL SetDragCursorImage( int nDrag, CPoint ptHotSpot);

返回值：如果成功，则返回非零值，否则为0。

参数：
nDrag | 与拖动图象组合的新图象的索引。
ptHotSpot | 新图象中激活点的位置。

说明：
通过组合指定图象（典型地，如鼠标光标图象）与当前拖动图象来构造一个新的拖动图象。
由于拖动函数在拖动操作中使用新图象，你应该在调用了CImageList::Set-DragCursorImage后使用Windows ShowCursor函数来隐藏实际的鼠标光标。否则，在拖动过程中，系统可能出现两个鼠标光标。

请参阅：
CImageList::BeginDrag, CImageList::EndDrag, CImageList::GetDragImage


 CImageList::SetImageCount

BOOL SetImageCount( UINT uNewCount);

返回值：如果成功，则返回非零值，否则为0。

参数：
uNewCount 指定图象列表中图象总数的值。

说明：
调用此成员函数来重新设置CImageList对象的图象数。
如果调用此成员函数来提高图象列表中的图象数，然后对每个附加图象调用来指定有效图象的新索引。如果指定有效图象的新索引失败，创建新图象的绘图操作将不可预知。
如果使用此函数来减少图象列表大小，截断了的图象将被释放。


 CImageList::SetOverlayImage

BOOL SetOverlayImage( int nImage, int nOverlay );

返回值：如果成功，则返回非零值，否则为0。

参数：
nImage | 用作覆盖掩码的图象的基于零的索引。
nOverlay | 覆盖掩码的基于零的索引。

说明：
调用此函数添加图象的基于零的索引到用做覆盖掩码的图象列表中。最多添加四个索引到图象列表中。
覆盖掩码是透明地绘制与另一个图象的图象。利用INDEXTOOVERLAYMASK宏确定的以1为基数的覆盖掩码的CImageList::Draw成员函数，在一个图象上绘制覆盖掩码。

请参阅：CImageList::Add


 CImageList::Write

BOOL Write( CArchive* pArchive );

返回值：如果成功，则返回非零值，否则为0。

参数：
pArchive 指向存储图象列表的CArchive对象的指针。

说明：调用此函数将图象列表对象写入归档文件中。

请参阅：CImageList::Read


 CImageList::m_hImageList

HIMAGELIST m_hImageList;

说明：
附加给此对象的图象列表的句柄。m_hImageList数据成员是类HIMAGELIST的公共变量。

请参阅：
CImageList::Attach, CImageList::Detach, CImageList::Attach


 CImageList::operator HIMAGELIST

operator HIMAGELIST () const;

返回值：如果成功，则返回以CImageList对象表示的图象列表的句柄。

说明：
使用此操作符获得附加的CImageList对象句柄。此操作符是校验操作符，支持直接使用HIMAGELIST对象。


 CInternetConnection

CObject
└CInternetConnection

MFC类CInternetConnection管理与Internet服务器的连接。它是MFC类CFtpConnection，CHttpConnection以及 CGopherConnection的基类。每一个这样的类提供与各自的FTP，HTTP或Gopher服务器通讯的附加功能。
直接与Internet服务器通讯，必须有一个CInternetSession对象和一个CInternetConnection对象。
要了解关于WinInet类如何工作的更多信息，请参阅联机文档“Visual C++程序员指南”中的“使用WinInet编写Internet程序”。
#include <afxinet.h>

CInternetConnection类的成员

构造函数
CInternetConnection 构造一个CInternetConnection对象

操作
GetContext | 获取连接对象的上下文ID
GetSession | 获取指向与连接相关的CInternetSession对象的指针
GetServerName | 获取与连接有关的服务器名

操作符
operator HINTERNET Internet会话的句柄


 CInternetConnection::CInternetConnection

CInternetConnection( CInternetSession* pSession,
LPCTSTR pstrServer,
INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER,
DWORD dwContext = 1
);

参数：
pSession | 指向CInternetSession对象的指针。
pstrServer | 指向包含服务器名的字符串的指针。
nPort | 标识此连接的Internet端口的数目。
dwContext | CInternetConnection对象的上下文标识符。请参阅说明部分，以了解有关dwContext的更多信息。

说明：
此成员函数在一个CInternetConnection对象被创建时调用。
不能自己调用CInternetConnection，而是根据要建立的连接类型调用CInternet-Session成员函数：
·CInternetSession::GetFtpConnection
·CInternetSession::GetHttpConnection
·CInternetSession::GetGopherConnection
dwContext的缺省值由MFC从创建InternetConnection派生对象的CInternetSession对象传送到CInternetConnection派生对象。缺省设置为1；但是，你可为连接明确指定一个CInternetSession构造函数中的上下文标识符。此对象及其所做工作将与上下文ID相关联。上下文标识符返回到CInternetSession::OnStatusCallback，以提供其所标志的对象状态。请参阅 “Visual C++程序员指南”中的“使用Internet初步：WinInet”，以了解有关上下文标识符的更多信息。

请参阅：
CInternetSession, CGopherConnection, CFtpConnection, CHttpConnection


 CInternetConnection::GetContext

DWORD GetContext( ) const;

返回值：应用指定的上下文ID。

说明：
调用此成员函数以获得此会话的上下文ID。上下文ID最初在CInternetSession 中确定，并传播到CInternetConnection和CInternetFile派生类中，除非是在打开连接的函数的调用中确定的。上下文ID与任何指定对象的操作相关，并标识由CInternetSession::OnStatusCallback返回的操作状态信息。
要了解GetContext如何与其它WinInet类一起工作，并给用户提供状态信息的更多信息，请参阅“Visual C++程序员指南”中的“Internet初步：WinInet”，以了解有关上下文标识符的更多信息。

请参阅：CInternetSession::EnableStatusCallback


 CInternetConnection::GetServerName

CString GetServerName( ) const;

返回值：连接对象所工作的服务器名。

说明：
调用此成员函数，获得与此Internet连接有关的服务器名。

请参阅：
CInternetSession, CGopherConnection, CFtpConnection, CHttpConnection


 CInternetConnection::GetSession

CInternetSession* GetSession( ) const;

返回值：
指向与此Internet连接对象有关的CInternetSession对象的指针。

说明：
调用此成员函数以获得与此连接有关的CInternetSession对象。

请参阅：
CInternetSession, CGopherConnection, CFtpConnection, CHttpConnection


 CInternetConnection::operator HINTERNET

operator HINTERNET( ) const;

说明：
使用此操作符以获得当前Internet会话的API级句柄。

请参阅：
CInternetSession, CGopherConnection, CFtpConnection, CHttpConnection


 CInternetException

CObject
└CException
└CInternetException

CInternetException对象代表一个与Internet操作有关的异常情况。
CInternetException 类包括两个公共数据成员：一个保存与异常有关的错误代码，另一个保存与错误有关的Internet应用的上下文标识符。
要了解Internet应用的上下文的更多信息，请参阅联机文档“Visual C++程序员指南”中的“使用WinInet编写Internet程序”。
#include <afxinet.h>
请参阅：CException

CInternetException类的成员

构造函数
CInternetException 构造一个CInternetException对象

数据成员
m_dwError | 导致异常的错误
m_dwContext | 与导致异常的操作有关的上下文的值


 CInternetException::CInternetException

CInternetException(DWORD dwError);

参数：
dwError 导致异常的错误。

说明：
当一个CInternetException对象被创建时，此成员函数被调用。要产生CInternetException，可调用MFC全局函数AfxThrowInternetException。

请参阅：CException


 CInternetException::m_dwContext

说明：
与Internet操作有关的上下文的值。上下文标识符最初在CInternetSession 中确定，并由MFC传播到CInternetConnection和CInternetFile派生类中。你可覆盖此缺省值并指定任意dwContext参数一个你选择的值。dwContext与指定对象的任意操作有关。dwContext标志由CInternetSession::OnStatusCallback返回的操作状态信息。

请参阅：CException


 CInternetException::m_dwError

说明：
导致异常的错误。此错误值可能为一个系统错误代码（可在WINERROR.H中找到），或者WININET.H中的错误值。要了解Win32错误代码的列表，请参阅Win32 SDK中的“错误代码”。要了解Internet特有的错误代码，请参阅联机文档“ActiveX SDK”。

请参阅：CException


 CInternetFile

CObject
└CFile
└CStdioFile
└CInternetFile

MFC类CInternetFile为CHttpFile和CGopherFile文件类提供基类。CInternetFile 及其派生类允许对使用Internet协议的远端系统文件的访问。不能直接构造一个CInternetFile对象，而是通过调用CGopherConnection::OpenFile或ChttpConn-ection::OpenRequest来创建其派生类中的一个对象。还可通过调用CFtpConnection::OpenFile构造一个CInternetFile对象。
CInternetFile成员函数Open，LockRange，UnLockRange，Duplicate不是为CInternetFile而实现的。如果对一个CInternetFile对象调用这些函数，你将得到一个CNotSupportedException。
要了解CInternetFile如何与其它MFC Internet类工作的更多信息，请参阅联机文档“Visual C++程序员指南”中的“使用WinInet编写Internet程序”。
#include <afxinet.h>
请参阅：CInternetConnection

CInternetFile类的成员

构造函数
CInternetFile 构造一个CInternetFile对象

操作
SetWriteBufferSize | 设置数据将被写入的缓冲区大小
SetReadBufferSize | 设置数据将被读取的缓冲区大小

可覆盖的函数
Seek | 指针在打开文件中的位置
Read | 读取指定的字节的数目
Write | 写入指定的字节的数目
Abort | 关闭文件，忽略所有警告和错误
Flush | 冲掉写缓冲区的内容，确认内存中的数据写入了目标机器
Close | 关闭CInternetFile并释放其资源
ReadString | 读取字符流
WriteString | 写空终止字符串到文件中

数据成员
m_hFile 文件的句柄

操作符
operator HINTERNET Internet句柄的校验操作符


 CInternetFile::Abort

virtual void Abort( );

说明：
关闭与对象有关的文件，使此对象读取或写入无效。如果毁弃该对象没有前关闭文件，则析构函数将关闭它们。
处理异常时，Abort与Close在两个重要方面上有所不同。首先，Abort函数并不对失败产生一个异常，因为它忽略失败。其次，如果文件未被预先打开或关闭，Abort并不发出错误警告。


 CInternetFile::CInternetFile

CInternetFile( );

说明：
当一个CInternetFile对象被创建时，此成员函数被调用。
不能直接创建一个CInternetFile对象。但是可通过调用CGopherConnection:: OpenFile 或CHttpConnection::OpenRequest来创建其派生类的一个对象。还可通过调用CFtpConnection::OpenFile来创建一个CInternetFile对象。

请参阅：
CInternetConnection, CHttpFile, CGopherFile


 CInternetFile::Close

virtual void Close( );
throw(CInternetException);

说明：
关闭 CInternetFile并释放其资源。如果文件为写入打开，则有一个明确的对Flush的调用，保证所有缓存数据写入了主机。当结束使用一个文件时，你应调用Close。


 CInternetFile::Flush

virtual void Flush( );
throw(CInternetException);

说明：
调用此成员函数以冲掉写缓冲区的内容。使用Flush确保所有内存中的数据已确实写入了目标机器，确保你与主机的事务已完成。Flush 只对为写入打开的CInternetFile对象有用。


 CInternetFile::Read

virtual UINT Read( void* lpBuf, UINT nCount );
throw(CInternetException);

返回值：
传输到缓冲区的字节数。如果已到达文件尾，返回值可能比nCount 少。

参数：
lpBuf | 指向文件数据被读取的内存地址的指针。
nCount | 将写入的字节数。

说明：
调用此成员函数读取指定内存，从lpvBuf开始的nCount确定的字节数。函数返回实际读取的字节数。若文件结束，则可能比nCount小。如果当读取文件时出错，函数产生一个CInternetException对象以描述错误。注意越过文件尾读取不是错误，不引发异常。


 CInternetFile::ReadString

virtual BOOL ReadString( CString& rString );
throw(CInternetException);
virtual LPTSTR ReadString( LPTSTR pstr, UINT nMax );
throw(CInternetException);

返回值：
指向包含文本数据的缓冲区的指针。如果文件尾在未读取任何数据时就到达，则为NULL。如果为布尔型，若文件尾在未读取任何数据时就到达，则为FALSE。

参数：
pstr | 指向将接收所读行的字符串的指针。
nMax | 读取的最大字符数。
rString | 接收读取行的CString对象的参考。

说明：
调用此成员函数读取字符函数流，直到它发现新行的字符。参考pstr参数，函数将此行放入内存。当到达由nMax确定的最大字符数时，它停止读取字符。缓冲区经常接收空终止字符。
如果未曾调用SetReadBufferSize就调用ReadString，你将得到4096字节的缓冲区。


 CInternetFile::Seek

virtual LONG Seek( LONG lOffset, UINT nFrom );
throw(CInternetException);

返回值：
如果所请求位置的合法，则为从文件开始处的新的字节偏移量。否则，此值未定义，并产生一个CInternetException对象。

参数：
lOffset 移动文件中读写指针的字节偏移量。
nFrom偏移量的相对参考。必须为以下值之一：
· | CFile::begin | 从文件开始处向前移动文件指针lOff 字节。
· | CFile::current | 从文件当前位置移动文件指针lOff 字节。
· | CFile::end | 从文件末尾移动文件指针lOff字节。lOff必须为负值，才能在存在的文件中查找；如果为正值，则越过文件末查找。

说明：
调用此成员函数在先前打开的文件中重置指针。Seek函数允许通过绝对或相对移动指针来随机读取一定量的文件内容。在查找过程中并未真正读取数据。
此时，对此成员函数的调用只支持与CHttpFile对象有关的数据。它不支持FTP或Gopher请求。如果为一个这样的不支持的服务调用Seek，它将返回Win32错误代码ERROR_INTERNET_INVALID_OPERATION。
文件打开时，文件指针在文件头偏移量为0处。
注意：使用Seek可能导致对Flush的隐含调用。


 CInternetFile::SetReadBufferSize

BOOL SetReadBufferSize( UINT nReadSize );

返回值：
如果成功，则返回非零值，否则为0。如果调用失败，Win32函数GetLastError可能被调用，以确定出错原因。

参数：
nReadSize 所请求的缓冲区字节大小。

说明：
调用此成员函数设置由CInternetFile派生对象使用的临时的读缓冲区的大小。其中的WinInet API不能实现缓冲，所以选择允许的应用高效读取数据的缓冲区大小，不管读取的数据总量。如果每个对Read的调用通常包括大量的数据（例如，4千字节或更多），你就不需缓冲区了。
然而，若调用Read来获得小块数据，或你每次使用ReadString来读取个别行，那么读缓冲区提高了应用的性能。
缺省时，CInternetFile对象不提供读取的任何缓冲区。如果调用此成员函数，必须保证文件是为读取访问打开的。
可以随时增加缓冲区大小，但缩小缓冲区是无效的。如果不先调用SetReadBufferSize就调用ReadString，你将得到4096字节的缓冲区。


 CInternetFile::SetWriteBufferSize

BOOL SetWriteBufferSize( UINT nWriteSize );

返回值：
如果成功，则返回非零值，否则为0。如果调用失败，Win32函数GetLastError可能被调用，以确定出错原因。

参数：
nWriteSize 缓冲区字节大小。

说明：
调用此成员函数设置由CInternetFile派生对象使用的临时的写缓冲区的大小。其中的WinInet API不能实现缓冲，所以选择允许的应用高效写入数据的缓冲区大小，不管写入的数据总量。如果每个对Write的调用通常包括大量的数据（例如，4千字节或更多），你就不需缓冲区了。
然而，若调用Write来写入小块数据，那么写缓冲区提高了应用的性能。缺省时，CInternetFile对象不提供读取的任何缓冲区。如果调用此成员函数，必须保证文件是为写入访问打开的。
可在任意时刻改变写入缓冲区的大小，但这样会导致对Flush的隐含调用。


 CInternetFile::Write

virtual void Write( const void* lpBuf, UINT nCount );
throw CInternetException( );

参数：
lpvBuf | 指向将写入的第一个字节的指针。
nCount | 确定将写入的字节数。

说明：
调用此成员函数以将nCount确定的字节数写入指定内存lpvBuf。如果写数据的时候出错，函数产生CInternetException来描述错误。


 CInternetFile::WriteString

virtual void WriteString( LPCTSTR pstr );
throw(CInternetException);

参数：
pstr 指向包含写入内容的字符串的指针。

说明：此函数写一个空终止字符串到有关文件中。


 CInternetFile::m_hFile

HINTERNET m_hFile;

说明：与此对象有关的文件的句柄。


 CInternetFile::operator HINTERNET

operator HINTERNET( ) const;

说明：
使用此操作符来获得当前Internet会话的Windows句柄。


 CInternetSession

CObject
└CInternetSession

使用类CInternetSession 创建并初始化一个或多个同时的Internet 会话。如果需要，还可描述与代理服务器的连接。如果Internet连接必须在应用过程中保持着，可创建一个类CWinApp的CInternetSession成员。一旦已建立起Internet 会话，就可调用OpenURL。CInternetSession会通过调用全局函数AfxParseURL来为分析映射URL。无论协议类型如何，CInternetSession 解释URL并管理它。它可处理由URL资源“file://”标志的本地文件的请求。如果传给它的名字是本地文件，OpenURL 将返回一个指向CStdioFile对象的指针。
如果使用OpenURL在Internet服务器上打开一个URL，你可从此处读取信息。如果要执行定位在服务器上的指定的服务(例如，HTTP，FTP或Gopher)行为，必须与此服务器建立适当的连接。直接打开与指定的服务器的指定的类型的连接，请使用下列成员函数：
·GetGopherConnection | 打开与Gopher服务的连接。
·GetHttpConnection | 打开与HTTP服务的连接。
·GetFtpConnection | 打开与FTP服务的连接。
QueryOption和SetOption允许设置会话的查询选项，如超时值、再试次数等等。
Internet会话过程中，象查找或数据下载这样的事务处理会占用一定的时间。使用者可能想继续工作，或获得事务处理进程的状态信息。为解决这个问题，CInternetSession可以让查找和数据传输异步发生，允许使用者在传输结束时进行其它任务。如果要为使用者提供状态信息，或异步处理任意操作，必须设置三个条件：
· | 在构造函数中，dwFlags必须包括INTERNET_FLAG_ASYNC。
· | 在构造函数中，dwContext必须设置为1。
· | 必须通过调用EnableStatusCallback来建立回调函数。
使用覆盖成员函数OnStatusCallback来获得异步获取的状态信息。使用此覆盖成员函数，必须从CInternetSession派生你自己的类。
要了解异步操作的更多信息，请参阅联机文档“Visual C++程序员指南”中的“Internet初步：WinInet”。要了解使用MFC WinInet 类的一般信息，请参阅联机文档“Visual C++程序员指南”中的“使用WinInet编写Internet程序”。
注意：
CInternetSession将为不支持的服务类型产生一个AfxThrowNotSupportedException。当前只支持下列服务类型：FTP，HTTP，Gopher和文件。
#include <afxinet.h>

请参阅：
CInternetConnection, CHttpConnection, CFtpConnection, CGopherConnection

CInternetSession类的成员

构造函数
CInternetSession 构造一个CInternetSession对象

属性
QueryOption | 为错误检查提供可能的断言
SetOption | 为Internet会话设置选项
OpenURL | 文法分析映射并打开一个URL
GetFtpConnection | 打开一个与服务器的FTP会话。写入用户日志
GetHttpConnection | 为试图打开连接的应用打开一个HTTP服务器
GetGopherConnection | 为试图打开连接的应用打开一个Gopher服务器
EnableStatusCallback | 建立一个状态回调例程。异步操作需要EnableStatusCallback
ServiceTypeFromHandle | 从Internet句柄中得到服务器类型

操作
GetContext | 为Internet或应用会话获得上下文的值
Close | 当Internet会话终止时关闭Internet连接
SetCookie | 为指定的URL设置小程序
GetCookie | 返回指定的URL的小程序及其所有父URL
GetCookieLength | 获取确定存储在缓冲区的小程序的长度的变量

可覆盖的函数
OnStatusCallback 当状态回调有效时，更新操作状态

操作符
operator HINTERNET 当前Internet会话的句柄


 CInternetSession::CInternetSession

CInternetSession(LPCTSTR pstrAgent = NULL,
DWORD dwContext = 1,
DWORD dwAccessType = INTERNET_OPEN_TYPE_PRECONFIG,
LPCTSTR pstrProxyName = NULL,
LPCTSTR pstrProxyBypass = NULL,
DWORD dwFlags = 0
);

参数：
pstrAgent | 指向字符串的指针，标识调用Internet函数应用或入口名（例如，“Microsoft Internet Browser”)。如果 pstrAgent 为NULL (缺省)，框架调用全局函数AfxGetAppName，返回一个包含应用名的空终止字符串。一些协议使用此字符串来对服务器标识应用。
dwContext | 操作的上下文标识符。dwContext标识由CInternetSession::OnStatusCallback返回的状态信息。缺省设置为1；但是，你可为操作明确指定一个指定的上下文ID。对象及其所做的任何工作将与此上下文ID有关。如果dwFlags包括INTERNET_FLAG_ASYNC，由此对象创建的对象在状态回调例程注册后即具备异步行为。为了使一个函数同步结束，dwContext必须为此调用设置为0。
dwAccessType访问所需的类型。下列值是有效值，仅仅提供其中一个：
· | INTERNET_OPEN_TYPE_PRECONFIG | 预配置（登录时）。此访问类型设作缺省的。
· | INTERNET_OPEN_TYPE_DIRECT | 直接面向Internet。
· | INTERNET_OPEN_TYPE_PROXY | 通过CERN代理。
pstrProxyName | 若dwAccessType设置为INTERNET_OPEN_TYPE_PROXY，建议的CERN代理名。缺省为NULL。
pstrProxyBypass | 指向包含服务器地址选项列表的字符串的指针。使用代理访问时，这些地址可能会被忽略。如果提供NULL值，忽略列表将从登录中读取。此参数只在dwAccessType设置为INTERNET_OPEN_TYPE_PROXY时才有意义。
dwFlags指示不同的选项，如缓存和异步行为。缺省设置为0。可能值包括：
· | INTERNET_FLAG_DONT_CACHE | 不缓存数据，既在本地，也不在任何网关服务器中。
· | INTERNET_FLAG_ASYNC | 将来对此对象的操作可能失败，返回ERROR_IO_PENDING。操作结束时，状态回调将与INTERNET_STATUS_ REQUEST_COMPLETE一起生成。此回调是线程的，而不是某个原始请求。必须调用EnableStatusCallback来建立一个状态回调例程，否则函数将同步完成。
· | INTERNET_FLAG_OFFLINE | 下载操作只适用于永久性缓存。如果此项不存在于缓存中，将返回适当的错误代码。此标记可能用位或OR(|)操作符组合。

说明：
当一个CInternetSession对象被创建时，此成员函数被调用。
CInternetSession是被应用调用的第一个Internet函数。它初始化内部数据结构并为将来来自应用的调用做准备。
如果dwFlags包括INTERNET_FLAG_ASYNC，由此对象创建的对象在状态回调例程注册后即具备异步行为。
如果没有Internet连接能被打开，则CInternetSession产生一个AfxThrowInternetException。

请参阅：
CInternetSession::Close, CInternetSession::EnableStatusCallback, CInternetSession::GetContext


 CInternetSession::Close

virtual void Close( );

说明：
当应用结束使用CInternetSession对象时，调用此成员函数。

请参阅：CInternetSession::CInternetSession


 CInternetSession::EnableStatusCallback

BOOL EnableStatusCallback( BOOL bEnable = TRUE );
throw(CInternetException);

返回值：
如果成功，则返回非零值，否则为0。如果调用失败，可通过检查产生的CInternetException对象确定出错原因。

参数：
bEnable 指定回调是有效还是无效的。缺省为TRUE。

说明：
调用此成员函数来使状态回调有效。处理状态回调时，可在应用的状态条提供操作进程的状态（如分解名字、连接服务器等等）。显示操作状态在长期操作中尤其需要。
可为同步操作设置回调例程；然而，必须为异步操作建立一个回调例程，因为异步API会调用INTERNET_STATUS_REQUEST_COMPLETE来指示请求已完成。
对异步操作的调用将是线程的，而不是某个原始请求。如果请求在状态回调发生时未完成，调用将产生ERROR_IO_PENDING错误。此调用将被不同于初始化请求的上下文的线程调用。
由于调用在请求进程中发生，应用应在调用中尽量少费时间，以免网络数据流量降低。例如，在调用中弹出对话框可能是一个漫长的操作，服务器会终止请求。
状态回调不能被移动象任何调用或异步函数挂起一样的时间。
注意：异步处理任何操作，必须设置三个条件：
· | 在构造函数中，dwFlags必须包括INTERNET_FLAG_ASYNC。
· | 在构造函数中，dwContext必须设置为1。
· | 必须通过调用EnableStatusCallback建立一个回调函数。
要了解异步操作的更多信息，请参阅联机文档“Visual C++程序员指南”中的“Internet初步：WinInet”。

请参阅：CInternetSession::CInternetSession


 CInternetSession::GetContext

DWORD GetContext( ) const;

返回值：应用定义的上下文标识符。

说明：
调用此成员函数来为一个特殊应用会话获得上下文的值。OnStatusCallback使用由GetContext上下文ID来报告特殊应用的状态。例如，当用户激活包含返回状态信息的Internet请求时，状态回调使用上下文ID来报告特殊应用的状态。如果用户激活两个包含返回信息的独立的Internet请求时，OnStatusCallback使用上下文标识符来返回有关相关请求的状态。接下来，上下文标识符用于任何状态回调操作，且一直与会话联系到会话结束。
要了解异步操作的更多信息，请参阅联机文档“Visual C++程序员指南”中的“Internet初步：WinInet”。

请参阅：
CInternetConnection, CInternetSession::EnableStatusCallback, CInternetSession::OnStatusCallback


 CInternetSession::GetCookie

static BOOL GetCookie(LPCSTR pstrUrl, LPCSTR pstrCookieName, LPTSTR pstrCookieData, DWORD dwBufLen);
static BOOL GetCookie(LPCSTR pstrUrl, LPCSTR pstrCookieName, LPTSTR pstrCookieData);

说明：
如果成功，则返回TRUE，否则返回FALSE。如果调用失败，可调用Win32函数GetLastError来确定出错原因。有下列错误值：
· | ERROR_NO_MORE_ITEMS | 对指定的URL及其父URL没有小程序。
· | ERROR_INSUFFICIENT_BUFFER | 在dwBufLen中传递的值不足以拷贝所有小程序数据。dwBufLen中的返回值是获取所有数据所需的缓冲区的大小。

参数：
pstrUrl | 指向包含URL字符串的指针。
pstrCookieName | 指向包含为指定的URL获取的小程序名字的字符串的指针。
pstrCookieData | 在第一个重载中，是指向包含接收小程序数据的缓冲区地址的字符串的指针。此值可为NULL，在第二个重载中，是接收小程序数据的CString对象的参考。
dwBufLen | 确定pstrCookieData缓冲区大小的变量。如果函数成功，则缓冲区接收拷贝到pstrCookieData缓冲区中的数据总量。如果pstrCookieData为NULL，此参数接收确定拷贝所有小程序数据所需的缓冲区的大小值。

说明：
此成员函数实现Win32函数InternetGetCookie的功能，如同在联机文档“平台SDK”中描述的。
在第二个重载中，MFC获取小程序数据到提供的CString对象中。

请参阅：
CInternetSession::GetCookieLength, CInternetSession::SetCookie


 CInternetSession::GetCookieLength

static DWORD GetCookieLength(LPTSTR pstrUrl, LPTSTR pstrCookieName);

返回值：
一个DWORD值，提示存储在缓冲区中的小程序长度。如果名字由pstrCookieName指示的小程序存在，返回0。

参数：
pstrUrl | 指向包含URL的字符串的指针。
pstrCookieName | 指向包含小程序名字的字符串的指针。

说明：
调用此成员函数以获得存储在缓冲区中的小程序的长度。此值由GetCookie使用。

请参阅：CInternetSession::SetCookie


 CInternetSession::GetFtpConnection

CFtpConnection* GetFtpConnection(LPCTSTR pstrServer,
LPCTSTR pstrUserName = NULL,
LPCTSTR pstrPassword = NULL,
INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER,
BOOL bPassive = FALSE
);
throw(CInternetException);

返回值：
指向CFtpConnection对象的指针。如果调用失败，可通过检查产生的CInternetException对象来确定出错类型。

参数：
pstrServer | 指向包含FTP服务器的字符串的指针。
pstrUserName | 指向确定记入日志的用户名的空终止字符串的指针。如果为NULL，缺省为匿名。
pstrPassword指向确定用于登录的口令的空终止字符串的指针。如果pstrPassword和pstrUserName都为NULL，缺省匿名口令为用户email名字。如果pstrPassword为NULL(或空字符串)而pstrUserName不为NULL，可用空白口令。下列表格描述pstrUserName和pstrPassword四个可能设置的行为：
pstrUserName | pstrPassword | 发送到FTP服务器的用户名 | 发送到FTP服务器的口令
NULL或" " | NULL或" " | "anonymous" | 用户的e-mail名字
非NULL字符串 | NULL或" " | pstrUserName | ""
NULL | 非NULL字符串 | ERROR | ERROR
非NULL字符串 | 非NULL字符串 | pstrUserName | pstrPassword

nPort | 一个表示服务器上使用的TCP/IP端口的数字。
bPassive | 指定此FTP会话的被动或主动模式。如果设置为TRUE，它将Win32API dwFlag设置为INTERNET_FLAG_PASSIVE。

说明：
调用此成员函数来建立一个FTP连接并获取指向CFtpConnection对象的指针。
GetFtpConnection连接到一个FTP服务器，创建并返回指向CFTPConnection对象的指针。它不执行服务器的指定操作。例如，如果要读取或写入文件，必须分步执行那些操作。请参阅类CFtpConnection和CFtpFileFind以了解查找文件、打开文件和读取或写入文件的信息。
请参阅联机文档“Visual C++程序员指南”中的“使用WinInet编写Internet程序”，以了解执行一般FTP连接任务的步骤。

请参阅：
CFtpConnection, CInternetSession::GetGopherConnection, CInternetSession::GetHttpConnection, CInternetSession::OpenURL


 CInternetSession::GetGopherConnection

CGopherConnection* GetGopherConnection(LPCTSTR pstrServer,
LPCTSTR pstrUserName = NULL,
LPCTSTR pstrPassword = NULL,
INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER
);
throw(CInternetException);

返回值：
指向CGopherConnection对象的指针。如果调用失败，可通过检查产生的CInternetException对象来确定失败原因。

参数：
pstrServer | 指向包含Gopher服务器名的字符串的指针。
pstrUserName | 指向包含用户名的字符串的指针。
pstrPassword | 指向包含访问口令的字符串的指针。
nPort | 指示服务器所用的TCP/IP端口的数字。

说明：
调用此成员函数建立一个新的Gopher连接并获取指向CGopherConnection对象的指针。
GetGopherConnection连接到一个Gopher服务器，创建并返回指向Cgopher-Connection对象的指针。它不执行服务器的指定操作。例如，如果要读取或写入文件，必须分步执行那些操作。请参阅类CGopherConnection，CGopherFile和CGopherFileFind 以了解查找文件、打开文件和读取或写入文件的信息。要了解有关浏览FTP网址的信息，请参阅成员函数OpenURL。请参阅“Visual C++程序员指南”中的“使用WinInet编写Internet程序”，以了解执行一般Gopher连接任务的步骤。

请参阅：
CGopherConnection, CInternetSession::GetFtpConnection, CInternetSession::GetHttpConnection, CInternetSession::OpenURL


 CInternetSession::GetHttpConnection

CHttpConnection* GetHttpConnection(LPCTSTR pstrServer,
INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER,
LPCTSTR pstrUserName = NULL,
LPCTSTR pstrPassword = NULL
);
throw(CInternetException);

ChttpConnection* GetHttpConnection(LPCTSTR pstrServer,
DWORD dwflags,
INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER,
LPCTSTR pstrUserName = NULL,
LPCTSTR pstrPassword = NULL
);
throw(CInternetException);

返回值：
指向CHttpConnection对象的指针。如果调用失败，可通过检查产生的Cinternet-Exception对象来确定失败原因。

参数：
pstrServer | 指向包含HTTP服务器名的字符串的指针。
nPort | 指示服务器所用的TCP/IP端口的数字。
pstrUserName | 指向包含用户名的字符串的指针。
pstrPassword | 指向包含访问口令的字符串的指针。
dwflags | 任何INTERNET_ FLAG_*选项的组合。请参阅CHttpConnection::OpenRequest的说明部分中的描述dwflags值的表

说明：
调用此成员函数建立一个新的HTTP连接并获取指向CHttpConnection对象的指针。
GetHttpConnection 连接到一个HTTP服务器，创建并返回指向CHttpConnection对象的指针。它不执行服务器的指定操作。例如，如果要读取或写入文件，必须分步执行那些操作。请参阅类CHttpConnection和CHttpFile以了解查找文件、打开文件和读取或写入文件的信息。要了解有关浏览HTTP网址的信息，请参阅成员函数OpenURL。请参阅“Visual C++程序员指南”中的“使用WinInet编写Internet程序”，以了解执行一般HTTP连接任务的步骤。

请参阅：
CHttpConnection, CInternetSession::GetGopherConnection, CInternetSession::GetFtpConnection, CInternetSession::OpenURL


 CInternetSession::OnStatusCallback

virtual void OnStatusCallback(DWORD dwContext,
DWORD dwInternetStatus,
LPVOID lpvStatusInformation,
DWORD dwStatusInformationLength
);

参数：
dwContext | 由应用提供的上下文的值。
dwInternetStatus | 指示为何调用的状态代码。请参阅说明部分，以了解可能值的列表。
lpvStatusInformation | 指向包含有关此调用的信息的缓冲区的指针。
dwStatusInformationLength | lpvStatusInformation的大小。

说明：
此成员函数被框架调用，在状态回调有效且操作挂起时更新状态。必须首先调用EnableStatusCallback来利用状态回调。
dwInternetStatus参数指示正被执行的操作，确定lpvStatusInformation将有的内容。dwStatusInformationLength指示包括在lpvStatusInformation中的数据长度。dwInternetStatus的状态值定义如下：
值 | 含义
INTERNET_STATUS_RESOLVING_NAME | 查找包含在lpvStatusInformation中的名字的IP地址
INTERNET_STATUS_NAME_RESOLVED | 成功找到包含在lpvStatusInformation中的名字的IP地址
INTERNET_STATUS_CONNECTING_TO_SERVER | 连接到由lpvStatusInformation指向的套接字地址(SOCKADDR)
INTERNET_STATUS_CONNECTED_TO_SERVER | 成功连接到由lpvStatusInformation指向的套接字地址(SOCKADDR)
INTERNET_STATUS_SENDING_REQUEST | 发送information请求到服务器。lpvStatusInformation参数为NULL
INTERNET_STATUS_REQUEST_SENT | 成功发送inFormation请求到服务器。lpvStatusInformation参数为NULL
INTERNET_STATUS_RECEIVING_RESPONSE | 等待服务器回答请求。lpvStatusInformation参数为NULL
INTERNET_STATUS_RESPONSE_RECEIVED | 成功接收服务器的回答。lpvStatusInformation参数为NULL
INTERNET_STATUS_CLOSING_CONNECTION | 关闭与服务器的连接。lpvStatusInformation参数为NULL
INTERNET_STATUS_CONNECTION_CLOSED | 成功关闭与服务器的连接。lpvStatusInformation参数为NULL
INTERNET_STATUS_HANDLE_CREATED | 由Win32 API函数InternetConnect调用来指示已创建了新句柄。这使得若连接耗时太长，应用从另一个线程调用Win32函数InternetCloseHandle。请参阅联机文档“ActiveX SDK”以了解这些函数的更多信息
INTERNET_STATUS_REQUEST_COMPLETE | 成功完成异步操作。请参阅CInternetSession构造函数以了解INTERNET_FLAG_ASYNC的细节。lpvStatusInformation参数将为NULL，且dwStatusInformationLength包含异步函数的最终结束状态。如果为ERROR_INTERNET_EXTENDED_ERROR，则应用可通过使用Win32函数InternetGetLastResponseInfo获取服务器错误信息。请参阅联机文档“ActiveX SDK”以了解此函数的更多信息
在INTERNET_STATUS_REQUEST_COMPLETE的情况下，lpvStatusInformation 指向INTERNET_ASYNC_RESULT结构，定义为：
· | DWORD dwResult | 从操作返回的代码。
· | DWORD dwError | 若dwResult指示操作失败，则此成员包含错误代码。如果操作成功，则此成员通常包含ERROR_SUCCESS。
覆盖此成员函数以在状态回调例程执行前请求一些操作。
注意：
状态回调需要线程状态保护。如果在共享库中使用MFC，添加下列行到覆盖函数的开始处：
AFX_MANAGE_STATE(AfxGetAppModuleState( ));
要了解异步操作的更多信息，请参阅联机文档“Visual C++程序员指南”中的“Internet初步：WinInet”。

请参阅：
CInternetSession::EnableStatusCallback, CInternetSession::GetContext


 CInternetSession::OpenURL

CStdioFile* OpenURL(LPCTSTR pstrURL,
DWORD dwContext = 1,
DWORD dwFlags = INTERNET_FLAG_TRANSFER_ASCII,
LPCTSTR pstrHeaders = NULL,
DWORD dwHeadersLength = 0
);
throw(CInternetException);

返回值：
只返回FTP，GOPHER，HTTP和FILE类型Internet服务的文件句柄。如果文法分析映射不成功，则返回NULL。
OpenURL返回的指针取决于pszURL的服务类型。下列表格表示了OpenURL返回的可能指针。
URL类型 | 返回
file:// | CStdioFile*
http:// | CHttpFile*
Gopher:// | CGopherFile*
ftp:// | CInternetFile*

参数：
pstrURL | 指向开始读取的URL名字的指针。只有以file:，ftp:，Gopher:或http:开始的URL才被支持。如果pszURL为NULL，则为ASSERTS。
dwContext | 在调用中与返回句柄一起传递的应用定义的值。
dwFlags描述如何处理此连接的标记。可用位或OR操作符(|)组合的有效标记是：
· | INTERNET_FLAG_TRANSFER_ASCII | 缺省值。以ASCII文本传输文件。
· | INTERNET_FLAG_TRANSFER_BINARY | 以二进制形式传输文件。
· | INTERNET_FLAG_RELOAD | 从网上获得数据，即使是本地缓存的。
· | INTERNET_FLAG_DONT_CACHE | 不缓存数据，无论是本地的还是网关的。
· | INTERNET_FLAG_SECURE | 此标记只用于HTTP 请求。它使用安全套接字子层或PCT请求网上安全事务处理。
· | INTERNET_OPEN_FLAG_USE_EXISTING_CONNECT | 如果可能，对于由OpenUrl生成的新的请求，仍使用已存在的连接，而不是为每个连接请求创建一个新的会话。
· | INTERNET_FLAG_PASSIVE | 用于得到FTP位置。使用被动FTP语义。与OpenURL的CInternetConnection一起使用。
pstrHeaders | 指向包含发送到HTTP服务器的标题的字符串的指针。
dwHeadersLength | 附加标题的长度，以字符表示。如果其为-1L且pstrHeaders为非NULL，那么pstrHeaders被认为是空终止的且长度已计算。

说明：
调用此成员函数发送指定的请求到HTTP服务器，允许客户指定附加的RFC822，MIME或者HTTP标题与请求一起发送。
参数dwFlags必须包括INTERNET_FLAG_TRANSFER_ASCII或INTERNET_ FLAG_TRANSFER_BINARY，但不能两个都有。剩下的标记可用位或OR操作符(|)组合。
与Win32函数InternetOpenURL捆绑的OpenURL，只允许下载、获得或读取来自Internet服务器的数据。OpenURL不允许文件在远端操纵，所以它不需要CInternetConnection对象。
使用指定的连接(也即，指定的协议)函数，如写文件，必须打开一个会话，然后打开一个指定连接，再使用此连接来打开所需模式的文件。请参阅 Cinternet-Connection ，以了解有关连接指定函数的更多信息。

请参阅：
CInternetConnection, CGopherConnection, CInternetSession::GetFtpConnection, CInternetSession::GetHttpConnection


 CInternetSession::QueryOption

BOOL QueryOption( DWORD dwOption, LPVOID lpBuffer, LPDWORD lpdwBufLen ) const;
BOOL QueryOption( DWORD dwOption, DWORD& dwValue ) const;

返回值：
如果操作成功，则返回TRUE。如果出错，则返回FALSE。如果调用失败，Win32函数GetLastError被调用以确定出错原因。

参数：
dwOption | 查询的Internet选项。请参阅说明部分，以了解可能选项的列表。
lpBuffer | 接收选项设置的缓冲区。
lpdwBufLen | 指向包含lpBuffer长度的DWORD的指针。返回时，它包含放入lpBuffer的数据长度。
dwValue | 代替lpBuffer发送到QueryOption。

说明：
提供五个基本错误检查的可能断言。
请参阅CInternetSession::SetOption来选择并设置指定的查询选项。
可能的INTERNET_OPTION_HANDLE_TYPE设置包括：
·INTERNET_HANDLE_TYPE_INTERNET
·INTERNET_HANDLE_TYPE_CONNECT_FTP
·INTERNET_HANDLE_TYPE_CONNECT_GOPHER
·INTERNET_HANDLE_TYPE_CONNECT_HTTP
·INTERNET_HANDLE_TYPE_FTP_FIND
·INTERNET_HANDLE_TYPE_FTP_FIND_HTML
·INTERNET_HANDLE_TYPE_FTP_FILE
·INTERNET_HANDLE_TYPE_FTP_FILE_HTML
·INTERNET_HANDLE_TYPE_GOPHER_FIND
·INTERNET_HANDLE_TYPE_GOPHER_FIND_HTML
·INTERNET_HANDLE_TYPE_GOPHER_FILE
·INTERNET_HANDLE_TYPE_GOPHER_FILE_HTML
·INTERNET_HANDLE_TYPE_HTTP_REQUEST

请参阅：
CInternetSession::ServiceTypeFromHandle, CInternetSession::SetOption


 CInternetSession::ServiceTypeFromHandle

DWORD ServiceTypeFromHandle( HINTERNET hQuery );

返回值：
Internet服务类型。请参阅说明部分，以了解可识别的服务类型的列表。

参数：
hQueryInternet 查询的句柄。

说明：
调用此成员函数以从Internet句柄获得服务类型。MFC推荐下列服务器类型：
服务类型 | 返回值
FTP | INTERNET_SERVICE_FTP
HTTP | INTERNET_SERVICE_HTTP
Gopher | INTERNET_SERVICE_GOPHER
File | AFX_INET_SERVICE_FILE
CInternetSession将为不支持的服务类型产生AfxThrowNotSupportedException。
注意：
返回值AFX_INET_SERVICE_FILE只由MFC使用，不被Win32识别。此功能允许客户象访问Internet服务一样访问本地文件。

请参阅：
CInternetSession::QueryOption, CInternetSession::operator HINTERNET


 CInternetSession::SetCookie

static BOOL SetCookie(LPCSTR pstrUrl,LPCTSTR pstrCookieName, LPCTSTR pstrCookieData);

返回值：
如果成功，则返回TRUL，否则为FALSE。要得到指定的错误代码，请调用GetLastError。

参数：
pstrUrl | 指向确定为小程序设置的URL的空终止字符串的指针。
pstrCookieName | 指向包含小程序名的字符串的指针。
pstrCookieData | 指向包含与URL有关的实际字符串数据的字符串的指针。

说明：
此成员函数实现Win32函数InternetSetCookie的功能，如同在联机文档“平台SDK”中描述的。

请参阅：
CInternetSession::GetCookieLength, CInternetSession::GetCookie


 CInternetSession::SetOption

BOOL SetOption( DWORD dwOption, LPVOID lpBuffer, DWORD dwBufferLength );
BOOL SetOption( DWORD dwOption, DWORD dwValue );

返回值：
如果操作成功，则返回一个TRUE值。如果出错，返回一个FALSE值。如果调用失败，Win32函数GetLastError将被调用，以确定出错原因。

参数：
dwOption | 请参阅CInternetSession::QueryOption得到可能值的列表。
lpBuffer | 包含选项设置的缓冲区。
dwBufferLength | lpBuffer长度或dwValue大小。
dwValue | 包含选项设置的DWORD。

说明：
调用此成员函数以设置Internet会话的选项。

请参阅：
CInternetSession::ServiceTypeFromHandle, CInternetSession::QueryOption


 CInternetSession::operator HINTERNET

operator HINTERNET( ) const;

说明：
使用此操作符来获得当前Internet会话的Windows句柄。


 CIPAddressCtrl

CObject
└CCmdTarget
└CWnd
└CIPAddressCtrl

IP地址控件类似于编辑控件，允许进入并操作一个Internet Protocol(IP)格式的数字地址。

CIPAddressCtrl类提供Windows普通IP地址协议的功能。此控件（以及CIPAddressCtrl类）只适用于运行在Microsoft Internet Explorer 4.0及更高版本的程序中。它们在Windows和Windows NT的将来版本中也适用。
要了解IP地址控件的一般信息，请参阅联机文档“平台SDK”中的“关于IP地址控件”。
#include <afxcmn.h>

CIPAddressCtrl类的成员

构造函数
CIPAddressCtrl | 构造一个CIPAddressCtrl对象
Create | 创建一个IP地址控件并将其附加给一个CIPAddressCtrl对象

属性
IsBlank | 确定是否IP地址控件中的所有域都为空
ClearAddress | 清空IP地址控件的内容
GetAddress | 获取IP地址控件中所有四个域的地址值
SetAddress | 设置IP地址控件中所有四个域的地址值
SetFieldFocus | 设置键盘焦点到IP地址控件中的指定的域
SetFieldRange | 设置IP地址控件中指定域的范围


 CIPAddressCtrl::CIPAddressCtrl

CIPAddressCtrl();

说明：创建一个CIPAddressCtrl对象。

请参阅：CIPAddressCtrl::Create


 CIPAddressCtrl::ClearAddress

void ClearAddress();

说明：
此成员函数实现Win32消息IPM_CLEARADDESS的功能，如同在联机文档“平台SDK”中描述的。

请参阅：
CIPAddressCtrl::GetAddress, CIPAddressCtrl::SetAddress


 CIPAddressCtrl::Create

BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

返回值：
如果初始化如果成功，则返回非零值，否则为0。

参数：
dwStyle | IP地址控件的风格。使用窗口风格的组合。必须包括WS_CHILD风格，因为控件必须为子窗口。
rect | IP地址控件的大小和位置的参考。可以为CRect对象或RECT结构。
pParentWnd | 指向IP地址控件的父窗口的指针。不能为NULL。
nID | IP地址控件的ID。

说明：
分两步来构造一个CIPAddressCtrl对象：
·调用构造函数，构造创建CIPAddressCtrl对象。
·调用Create，创建IP地址控件。

请参阅：CIPAddressCtrl::CIPAddressCtrl


 CIPAddressCtrl::GetAddress

int GetAddress(BYTE& nField0, BYTE& nField1, BYTE& nField2, BYTE&nField3);
int GetAddress(DWORD& dwAddress);

返回值：IP地址控件中非空域的数目。

参数：
nField0 | 来自打包的IP地址的关于域0值的参考。
nField1 | 来自打包的IP地址的关于域1值的参考。
nField2 | 来自打包的IP地址的关于域2值的参考。
nField3 | 来自打包的IP地址的关于域3值的参考。
dwAddress | 接收IP地址的DWORD值的地址的参考。请参阅说明，以了解如何填充dwAddress的表格。

说明：
此成员函数实现Win32消息IPM_GETADDESS的功能，如同在联机文档“平台SDK”中描述的。
在上面第一个原型中，控件中从域0到域3的数，从左到右读取，分别放入四个参数中。在上面第二个原型中，dwAddress如下设置：
域 | 包含域值的位
0 | 24到31
1 | 16到23
2 | 8到15
3 | 0到7

请参阅：CIPAddressCtrl::SetAddress


 CIPAddressCtrl::IsBlank

BOOL IsBlank() const;

返回值：
如果所有IP地址控件域为空，则返回非零值，否则为0。

说明：
此成员函数实现Win32消息IPM_ISBLANK的功能，如同在联机文档“平台SDK”中描述的。


 CIPAddressCtrl::SetAddress

void SetAddress(BYTE& nField0, BYTE& nField1, BYTE nField2, BYTE nField3);
void SetAddress(DWORD dwAddress);

参数：
nField0 | 来自打包的IP地址的域0值。
nField1 | 来自打包的IP地址的域1值。
nField2 | 来自打包的IP地址的域2值。
nField3 | 来自打包的IP地址的域3值。
dwAddress | 包含新IP地址的DWORD值。请参阅Remarks以了解，如何填充DWORD值的表格。

说明：
此成员函数实现Win32消息IPM_SETADDESS的功能，如同在联机文档“平台SDK”中描述的。
在上面第一个原型中，控件中从域0到域3的数，从左到右读取，分别放入四个参数中。在上面第二个原型中，dwAddress如下设置：
域 | 包含域值的位
0 | 24到31
1 | 16到23
2 | 8到15
3 | 0到7

请参阅：
CIPAddressCtrl::GetAddress, CIPAddressCtrl::ClearAddress


 CIPAddressCtrl::SetFieldFocus

void SetFieldFocus(WORD nField);

参数：
nField 焦点将被设置的基于零的域的索引。如果此值比域的数目大，焦点设置在第一个空白域中。如果所有域非空，焦点设置在第一个域中。

说明：
此成员函数实现Win32消息IPM_SETFOCUS的功能，如同在联机文档“平台SDK”中描述的。

请参阅：CIPAddressCtrl::SetFieldRange


 CIPAddressCtrl::SetFieldRange

void SetFieldRange(int nField, BYTE nLower, BYTE nUpper);

参数：
nField | 应用的范围的基于零的域索引。
nLower | 接收IP地址控件中指定域的下限的整数的参考。
nUpper | 接收IP地址控件中指定域的上限的整数的参考。

说明：
此成员函数实现Win32消息IPM_SETRANGE的功能，如同在联机文档“平台SDK”中描述的。
使用两个参数nLower和nUpper来指示域的上限和下限，而不是Win32所用的wRange参数。

请参阅：CIPAddressCtrl::SetFieldFocus


 CList

CObject
└CList

template < class TYPE, class ARG_TYPE > class CList : public CObject

参数：
TYPE | 存储在列表中的对象类型。
ARG_TYPE | 用于参考存储在列表中的对象的类型。可以是一个参考。

说明：
类CList支持可按顺序或按值访问的非唯一对象的有序列表。CList 列表与双链接列表行为相似。
类型POSITION的变量是列表的关键字。可使用POSITION变量作为循环因子来顺序遍历列表，作为书签来保存位置。然而，位置不同于索引。
元素插入在列表的标题、在末尾和已知的POSITION时非常快。按值或索引来查找一个元素，需要顺序查找。如果列表太长，此查找可能较慢。如果需要转储列表中的个别元素，必须设置转储上下文的深度为1或更大。
此类的一些成员函数调用为CList类定制的全局帮助函数。请参阅“宏和全局量”部分的“收集类的帮助程序”。
要了解使用CList的更多信息，请参阅“Visual C++程序员指南”中的“收集”。
#include <afxtempl.h>
请参阅：CMap, CArray

CList类的成员

构造函数
CList 构造一个空的有序列表

标题/末尾访问
GetHead | 返回列表的标题元素（不能为空）
GetTail | 返回列表的末尾元素（不能为空）

操作
RemoveHead | 从列表标题中移走元素
RemoveTail | 从列表末尾移走元素
AddHead | 添加一个元素（或另一个列表的所有元素）到列表标题（生成新的标题）
AddTail | 添加一个元素（或另一个列表的所有元素）到列表尾部（生成新的尾部）
RemoveAll | 从列表中移走所有元素

循环
GetHeadPosition | 返回列表标题元素的位置
GetTailPosition | 返回列表尾部元素的位置
GetNext | 获取用于遍历下一个元素
GetPrev | 获取用于遍历的前一个元素

获取/修改
GetAt | 在指定位置上获得元素
SetAt | 在指定位置上设置元素
RemoveAt | 从列表中删除一个由位置确定的元素

插入
InsertBefore | 在指定位置前插入一个新的元素
InsertAfter | 在指定位置后插入一个新的元素

查找
Find | 获得由指针值确定的元素位置
FindIndex | 获得由基于零的索引指定的元素位置

状态
GetCount | 返回此列表中的元素数
IsEmpty | 检测空列表的情况（没有元素）


 CList::AddHead

POSITION AddHead( ARG_TYPE newElement );
void AddHead( CList* pNewList );

返回值：
第一个版本返回新插入元素的POSITION值。

参数：
ARG_TYPE | 确定列表元素类型的参数（可能为参考）。
newElement | 新元素。
pNewList | 指向另一个CList列表的指针。pNewList中的元素将被添加到此列表中。

说明：
添加一个新元素或元素列表到此列表的标题前面。操作前此列表可能为空。

请参阅：CList::GetHead, CList::RemoveHead


 CList::AddTail

POSITION AddTail( ARG_TYPE newElement );
void AddTail( CList* pNewList );

返回值：
第一个版本返回新插入元素的POSITION值。

参数：
ARG_TYP | E确定列表元素类型的参数（可能为参考）。
newElement | 新元素。
pNewList | 指向另一个CList列表的指针。pNewList中的元素将被添加到此列表中。

说明：
添加一个新元素或元素列表到此列表的标题后面。操作前此列表可能为空。

请参阅：CObList::GetTail, CObList::RemoveTail


 CList::CList

CList( int nBlockSize = 10 );

参数：
nBlockSize 扩展列表的内存分配单位尺寸。

说明：
构造一个空的有序列表。增大列表时，内存以nBlockSize为单位分配。


 CList::Find

POSITION Find( ARG_TYPE searchValue, POSITION startAfter = NULL ) const;

返回值：
一个可用于循环的POSITION值或获取对象的指针。如果对象未找到，则为NULL。

参数：
ARG_TYPE | 指定列表元素类型的模板参数（可能是一个参考）。
searchValue | 列表中找到的值。
startAfter | 查找的起始位置。

说明：
顺序查询列表来找到匹配指定的searchValue的第一个元素。注意，比较的是指针值，不是对象的内容。

请参阅：CList::GetNext, CList::GetPrev


 CList::FindIndex

POSITION FindIndex( int nIndex ) const;

返回值：
一个可用于循环的POSITION值或获取对象的指针。如果nIndex为负或太大，则为NULL。

参数：
nIndex 要查找的列表元素的基于零的索引。

说明：
使用nIndex值作为列表索引。它从头开始顺序扫描，停止于第几个元素。

请参阅：
CObList::Find, CObList::GetNext, CObList::GetPrev


 CList::GetAt

TYPE& GetAt( POSITION position );
TYPE GetAt( POSITION position ) const;

返回值：请参阅GetHead的返回值描述。

参数：
TYPE | 指定列表对象类型的模板参数。
position | 由前一个GetHeadPosition或Find成员函数调用返回的POSITION值。

说明：
类型POSITION的变量是列表的关键字。它不同于索引，不能自己操作POSITION值。GetAt返回与指定位置有关的元素(或参考元素)。
必须保证你的POSITION值代表列表中的一个有效位置。如果无效，则插入MFC库的调试版本断言。

请参阅：
CList::Find, CList::SetAt, CList::GetNext, CList::GetPrev, CList::GetHead


 CList::GetCount

int GetCount() const;

返回值：包含元素数目的整数。

说明：获得此列表中的元素数目。

请参阅：CList::IsEmpty


 CList::GetHead

TYPE& GetHead( );
TYPE GetHead( ) const;

返回值：
如果列表为const，GetHead返回列表标题元素的拷贝。这允许函数只用于赋值语句的右边，避免列表被更改。
如果列表不是const，GetHead返回列表元素的参考。这允许函数用于赋值语句的两边，从而允许更改列表入口。

参数：
TYPE 指定列表对象类型的模板参数。

说明：
获得列表的标题元素（或标题元素的参考）。
必须保证你的POSITION值代表列表中的一个有效位置。如果无效，则插入MFC库的调试版本断言。可使用IsEmpty来检验列表是否包含元素。

请参阅：
CList::GetTail, CList::GetTailPosition, CList::AddHead, CList::RemoveHead


 CList::GetHeadPosition

POSITION GetHeadPosition( ) const;

返回值：
一个可用于循环的POSITION值或获取对象的指针。如果列表为空，则为NULL。

说明：获得列表标题元素的位置。

请参阅：CList::GetTailPosition


 CList::GetNext

TYPE& GetNext( POSITION& rPosition );
TYPE GetNext( POSITION& rPosition ) const;

返回值：
如果列表为const，GetNext返回列表标题元素的拷贝。这允许函数只用于赋值语句的右边，避免列表被更改。
如果列表不是const，GetNext返回列表元素的参考。这允许函数用于赋值语句的两边，从而允许更改列表入口。

参数：
TYPE | 指定列表对象类型的模板参数。
rPosition | 由前一个GetNext，GetHeadPosition或其它成员函数调用返回的POSITION值的参考。

说明：
获得由rPosition标志的列表元素，然后设置rPosition 为列表下一个入口的POSITION值。如果用GetHeadPosition或Find调用建立初始位置，你可使用向前遍历循环的GetNext。
必须保证你的POSITION值代表列表中的一个有效位置。如果无效，则插入MFC库的调试版本断言。
如果获取的元素是列表中最后一个，那么rPosition的新值设置为NULL。

请参阅：
CList::Find, CList::GetHeadPosition, CList::GetTailPosition, CList::GetPrev, CList::GetHead


 CList::GetPrev

TYPE& GetPrev( POSITION& rPosition );
TYPE GetPrev( POSITION& rPosition ) const;

返回值：
如果列表为const，GetPrev返回列表标题元素的拷贝。这允许函数只用于赋值语句的右边，避免列表被更改。
如果列表不是const，GetPrev返回列表元素的参考。这允许函数用于赋值语句的两边，从而允许更改列表入口。

参数：
TYPE | 指定列表对象类型的模板参数。
rPosition | 由前一个GetPrev或其它成员函数调用返回的POSITION值的参考。

说明：
获得由rPosition标志的列表元素，然后设置rPosition 为列表下一个入口的POSITION值。如果用GetTailPosition或Find调用建立初始位置，可使用反向循环的GetPrev。
必须保证你的POSITION值代表列表中的一个有效位置。如果无效，则插入MFC库的调试版本断言。
如果获取的元素是列表中最后一个，那么rPosition的新值设置为NULL。

请参阅：
CList::Find, CList::GetTailPosition, CList::GetHeadPosition, CList::GetNext, CList::GetHead


 CList::GetTail

TYPE& GetTail( );
TYPE GetTail() const;

返回值：请参阅GetHead的返回值描述。

参数：
TYPE 指定列表对象类型的模板参数。

说明：
获得代表列表尾部元素的CObject指针。
必须保证在调用GetTail前列表不为空。如果列表为空，则插入MFC库的调试版本断言。可使用IsEmpty来检验列表是否包含元素。

请参阅：
CList::AddTail, CList::AddHead, CList::RemoveHead, CList::GetHead


 CList::GetTailPosition

POSITION GetTailPosition( ) const;

返回值：
一个可用于循环的POSITION值或获取对象的指针。如果列表为空，则为NULL。

说明：
获得此列表尾部元素的位置；如果列表为空，则为NULL。

请参阅：CList::GetHeadPosition, CList::GetTail


 CList::InsertAfter

POSITION InsertAfter(POSITION position, ARG_TYPE newElement);

返回值：
一个可用于循环的POSITION值或获取对象的指针。

参数：
position | 由前一个GetNext，GetPrev或Find成员函数调用返回的POSITION值的参考。
ARG_TYPE | 指定列表对象类型的模板参数。
newElement | 添加到此列表的元素。

说明：
在指定位置的元素后添加一个元素到列表中。

请参阅：CList::Find, CList::InsertBefore


 CList::InsertBefore

POSITION InsertBefore(POSITION position, ARG_TYPE newElement);

返回值：
一个可用于循环的POSITION值或获取对象的指针。

参数：
position | 由前一个GetNext，GetPrev或Find成员函数调用返回的POSITION值的参考。
ARG_TYPE | 指定列表对象类型的模板参数。
newElement | 添加到此列表的元素。

说明：
在指定位置的元素前添加一个元素到列表中。

请参阅：CList::Find, CList::InsertAfter


 CList::IsEmpty

BOOL IsEmpty( ) const;

返回值：
如果列表为空，则返回非零值，否则为0。

说明：指示此列表是否包含元素。

请参阅：CList::GetCount


 CList::RemoveAll

void RemoveAll( );

说明：
从此列表中删除所有元素并释放相关的内存。如果列表已经是空的，则不会出错。

请参阅：CList::RemoveAt


 CList::RemoveAt

void RemoveAt( POSITION position );

参数：
position 从列表中删除的元素的位置。

说明：
从列表中删除指定的元素。
必须保证你的POSITION值代表列表中的一个有效位置。如果无效，则插入MFC库的调试版本断言。

请参阅：CList::RemoveAll


 CList::RemoveHead

TYPE RemoveHead( );

返回值：以前在列表头的元素。

参数：
TYPE 指定列表对象类型的模板参数。

说明：
从列表头删除元素并返回其指针。
必须保证在调用RemoveHead前列表不为空。如果列表为空，则插入MFC库的调试版本断言。可使用IsEmpty来检验列表是否包含元素。

请参阅：CList::GetHead, CList::AddHead


 CList::RemoveTail

TYPE RemoveTail( );

返回值：列表尾部的元素。

参数：
TYPE 指定列表对象类型的模板参数。

说明：
从列表尾删除元素并返回其指针。
必须保证在调用RemoveTail前列表不为空。如果列表为空，则插入MFC库的调试版本断言。可使用IsEmpty来检验列表是否包含元素。

请参阅：CList::GetTail, CList::AddTail


 CList::SetAt

void SetAt( POSITION pos, ARG_TYPE newElement );

参数：
pos | 设置的元素的POSITION。
ARG_TYPE | 指定列表对象类型的模板参数。
newElement | 添加到此列表的元素。

说明：
类型POSITION的变量是列表的关键字。它不同于索引，不能自己操作POSITION值。SetAt将元素写入列表的指定位置。
必须保证你的POSITION值代表列表中的一个有效位置。如果无效，则插入MFC库的调试版本断言。

请参阅：
CList::Find, CList::GetAt, CList::GetNext, CList::GetPrev


 CListBox

CObject
└CCmdTarget
└CWnd
└CListBox

CListBox类提供Windows列表框的功能。列表框显示项的列表，如用户可以见到和选择的文件名称。
在单选列表框里，用户只可选择一个项。在多选列表框里，可选择许多项。当用户选择某项时，其高亮显示且列表框给父窗口发送一个通知消息。
可从对话模板或直接在你的代码中创建列表框。直接创建时，构造CListBox对象，再调用Create成员函数创建Windows列表框控件并将其附加给CListBox对象。要在对话模板中使用列表框，可在对话框类中声明一个CListbox 变量，再在对话框类的DoDataExchange中使用DDX_Control连接成员变量到此控件(当向对话框类中添加控件变量时，ClassWizard自动为你实现）。
构造函数可以是从CListBox派生的类的一个单步进程。为派生类写构造函数并从中调用Create。
如果要处理由列表框发送到其父亲（通常为从CDialog派生的类）的Windows通知消息，为每个消息添加消息映射入口和消息处理成员函数到父类。
每个消息映射入口有以下形式：
ON_Notification( id，memberFxn )
id 指定发送通知的列表框控件的子窗口，memberFxn 是编写处理通知的父成员函数名的地方。
父函数原型如下：
afx_msg void memberFxn( );
下面是可能的消息映射入口列表和描述它们可能被发送到父亲的情况：
ON_LBN_DBLCLK | 用户双击列表框中的字符串。只有LBS_NOTIFY风格的列表框才会发送此通知消息。
ON_LBN_ERRSPACE | 列表框不能重新分配足够的内存来满足请求。
ON_LBN_KILLFOCUS | 列表框正失去输入焦点。
ON_LBN_SELCANCEL | 当前列表框选择被取消。此消息只有在列表框是LBS_NOTIFY风格时才发送。
ON_LBN_SELCHANGE | 列表框中的选择可能改变。如果选择被CListBox::SetCurSel成员函数改变，则通知不发送。此通知只适用于LBS_NOTIFY风格的列表框。无论何时用户按下箭头键，即使选择未改变，LBN_SELCHANGE通知消息都被发送给多选列表框。
ON_LBN_SETFOCUS | 列表框正在接收输入焦点。
ON_WM_CHARTOITEM | 一个无字符串的自绘制列表接受WM_CHAR消息。
ON_WM_VKEYTOITEM | LBS_WANTKEYBOARDINPUT风格的列表框接受WM_KEYDOWN消息。
如果在对话框中构造一个CListBox对象（通过对话资源），当用户关闭对话框时，CListBox对象自动毁弃。
如果在窗口中构造一个CListBox对象，可能需要毁弃CListBox对象。如果在栈上创建CListBox对象，它会自动毁弃。如果使用new函数在堆上创建CListBox对象，必须对此对象调用delete来在用户关闭父窗口时毁弃它。
如果在CListBox对象中分配内存，可覆盖CListBox析构程序释放分配的内存。
#include <afxwin.h>
请参阅：CWnd, CButton, CComboBox, CEdit, CScrollBar, CStatic

CListBox类的成员

构造函数
CListBox 构造一个CListBox对象

初始化
Create | 创建Windows列表框并附加给CListBox对象
InitStorage | 为列表框的项和字符串预分配内存块

一般操作
GetCount | 返回列表框中的字符串数目
GetHorizontalExtent | 返回列表框的水平宽度，用像素表示
SetHorizontalExtent | 设置列表框的水平宽度，用像素表示
GetTopIndex | 返回列表框中第一个可见字符串的索引
SetTopIndex | 设置列表框中第一个可见字符串的基于零的索引
GetItemData | 返回与列表框有关的32位值
GetItemDataPtr | 返回指向列表框的指针
SetItemData | 设置列表框有关的32位值
SetItemDataPtr | 设置指向列表框的指针
GetItemRect | 返回当前显示的列表框项的相应矩形
ItemFromPoint | 返回与某点最近的列表框项的索引
SetItemHeight | 设置列表框中项的高度
GetItemHeight | 确定列表框中项的高度
GetSel | 返回列表框某项的选择
GetText | 拷贝某列表框项到缓冲区
GetTextLen | 返回列表框的字节长
SetColumnWidth | 设置多列列表框的列宽
SetTabStops | 设置列表框制表键停止位置
GetLocale | 获取列表框的地点标识符
SetLocale | 设置列表框的地点标识符

单选操作
GetCurSel | 返回列表框中当前选择串的基于零的索引
SetCurSel | 选择一个列表框字符串

多选操作
SetSel | 在多选列表框中选择或不选某个列表框项
GetCaretIndex | 确定在多选列表框中有焦点矩形的项的索引
SetCaretIndex | 设置焦点矩形到多选列表框中的指定的索引项
GetSelCount | 返回多选列表框中当前选择的字符串的数目
GetSelItems | 返回列表框中当前选择的字符串的索引
SelItemRange | 选择/不选多选列表框中的一些字符串
SetAnchorIndex | 设置多选列表框的锚点以开始扩展选择
GetAnchorIndex | 获取列表框当前锚点项的基于零的索引

字符串操作
AddString | 添加一个字符串到列表框中
DeleteString | 从列表框中删除一个字符串
InsertString | 在列表框中指定位置插入一个字符串
ResetContent | 清空列表框所有入口
Dir | 从当前目录添加文件名称到列表框中
FindString | 在列表框中查找一个字符串
FindStringExact | 查找与指定的字符串匹配的第一个列表框字符串
SelectString | 查找并选择单选列表框中的一个字符串

可覆盖的函数
DrawItem | 当自绘制列表框的一个可视部分改变时，被框架调用
MeasureItem | 当自绘制列表框创建时，被框架调用来确定列表框维数
CompareItem | 被框架调用以确定一系列列表框中某新项的位置
DeleteItem | 当用户从自绘制列表框中删除某项时，被框架调用
VKeyToItem | 覆盖以提供LBS_WANTKEYBOARDINPUT风格列表框的设置所需的定制WM_KEYDOWN
CharToItem | 覆盖以提供不含字符串的自绘制列表框定制WM_CHAR


 CListBox::AddString

int AddString( LPCTSTR lpszItem );

返回值：
列表框中字符串的基于零的索引。如果出错，则返回LB_ERR;如果没有足够的有效空间存储新字符串，则为LB_ERRSPACE。

参数：
lpszItem 指向将被添加的空终止字符串的指针。

说明：
调用此成员函数添加一个字符串到列表框中。如果列表框未被创建为LBS_SORT风格，则字符串被添加到列表末尾。否则，字符串被插入到列表中，并把列表排序。如果列表被创建为LBS_SORT 风格而不是LBS_HASSTRINGS风格，则框架通过对CompareItem成员函数的一个或多个调用来排序列表。
使用InsertString插入一个字符串到列表框的指定位置。

请参阅：CListBox::InsertString, CListBox::CompareItem, LB_ADDSTRING


 CListBox::CharToItem

virtual int CharToItem( UINT nKey, UINT nIndex );

返回值：
返回-1或-2表示无进一步操作，或非负数列表框项的索引，执行响应击键的缺省操作。缺省实现返回-1。

参数：
nKey | 用户键入字符的ANSI代码。
nIndex | 列表框脱字符的当前位置。

说明：
当列表框的父窗口从列表框接收到一个WM_CHARTOITEM消息时，此函数被框架调用。列表框收到WM_CHAR消息时,发送WM_CHARTOITEM消息，但仅当列表框符合所有下列限制：
· | 是自绘制列表框。
· | 没有LBS_HASSTRINGS风格设置。
· | 至少有一项。
不能自己调用此函数。覆盖此函数以提供对键盘消息的定制处理。
在覆盖函数中，必须返回一个值，通知框架执行的操作。返回值-1或-2表示你处理选择项的所有方面，无须列表框的进一步操作。在返回-1或-2 之前，可以设置选择或移动脱字符，或两者同时。使用SetCurSel或SetSel设置选择，使用SetCaretIndex移动脱字符。
0或更大的返回值标识列表框中项的索引，并指示列表框应为指定项的击键动作执行缺省操作。

请参阅：
CListBox::VKeyToItem, CListBox::SetCurSel, CListBox::SetSel, CListBox::SetCaretIndex, WM_CHARTOITEM


 CListBox::CListBox

CListBox( );

说明：
分两步构造一个CListBox对象。首先调用构造函数CListBox，再调用Create，初始化Windows列表框并将其附加给CListBox。

请参阅：CListBox::Create


 CListBox::CompareItem

virtual int CompareItem( LPCOMPAREITEMSTRUCT lpCompareItemStruct );

返回值：
表示由COMPAREITEMSTRUCT结构描述的两项的相对位置。可能为以下值：
值 | 含义
-1 | 项1 排在项2前
0 | 项1与项2排得一样
1 | 项1排在项2后
请参阅：CWnd::OnCompareItem以了解COMPAREITEMSTRUCT结构的介绍。

参数：
lpCompareItemStruct 指向COMPAREITEMSTRUCT结构的长型指针。

说明：
被框架调用，确定排序了的自绘制列表框中新项的相对位置。缺省时，此成员函数什么也不做。如果创建LBS_SORT风格的自绘制列表框，必须覆盖此成员函数来帮助框架排序添加到列表框中的新项。

请参阅：
WM_COMPAREITEM, CWnd::OnCompareItem, CListBox::DrawItem, CListBox::MeasureItem, CListBox::DeleteItem


 CListBox::Create

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd,UINT nID );

返回值：如果成功，则返回非零值，否则为0。

参数：
dwStyle | 指定列表框风格。适用于列表框风格的任意组合。
rect | 指定列表框大小及位置。可以是CRect对象或RECT结构。
pParentWnd | 指定列表框的父窗口(通常为CDialog对象)。不能为NULL。
nID | 指定列表框的控件ID。

说明：
分两步构造一个CListBox对象。首先调用构造函数，再调用Create，初始化Windows 列表框并将其附加给ClistBox对象。
执行Create时，Windows发送WM_NCCREATE，WM_CREATE，WM_NCCA-LCSIZE和WM_GETMINMAXINFO消息到列表框控件。
这些消息由CWnd基类的OnNcCreate，OnCreate，OnNcCalcSize和OnGetMin-MaxInfo成员函数缺省处理。扩展缺省消息处理，请从CListBox派生一个类，添加消息到新类中，覆盖下一个消息处理成员函数。例如，覆盖 OnCreate来执行新类所需的初始化。
在列表框控件中应用下列窗口风格：
WS_CHILD | 总是
WS_VISIBLE | 通常
WS_DISABLED | 很少
WS_VSCROLL | 添加垂直滚动条
WS_HSCROLL | 添加水平滚动条
WS_GROUP | 控件分组
WS_TABSTOP | 允许按制表键跳到此控件

请参阅：CListBox::CListBox


 CListBox::DeleteItem

virtual void DeleteItem( LPDELTEITEMSTRUCT lpDeleteItemStruct );

参数：
lpDeleteItemStruct 指向Windows DELETEITEMSTRUCT结构的长型指针，包含删除项的信息。

说明：
当用户从自绘制的CListBox对象中删除一项或删除列表框时，被框架调用。此函数的缺省实现什么也不做。覆盖此函数以绘制需要的自绘制列表框。请参阅CWnd::OnDeleteItem以了解DeleteItemSTRUCT结构的介绍。

请参阅：
CListBox::CompareItem, CWnd::OnDeleteItem, CListBox::DrawItem, CListBox::MeasureItem, ::DeleteItem


 CListBox::DeleteString

int DeleteString( UINT nIndex );

返回值：
留在列表中的字符串数目。如果nIndex指定一个比列表项的数目大的索引时，返回值为LB_ERR。

参数：
nIndex 指定将被删除的字符串的基于零的索引。

说明：从列表框中删除一项。

请参阅：
LB_DeleteString, CListBox::AddString, CListBox::InsertString


 CListBox::Dir

int Dir( UINT attr, LPCTSTR lpszWildCard );

返回值：
添加到列表中的上一个文件名称的基于零的索引。如果出错，则返回LB_ERR;如果没有足够有效空间存储新字符串，则返回LB_ERRSPACE。

参数：
attr可以是CFile::GetStatus中描述的枚举值的组合，或下列值的组合：
值 | 含义
0x0000 | 可读取或写入的文件
0x0001 | 可读取但不可写入的文件
0x0002 | 隐藏文件，不在目录列表中出现
0x0004 | 系统文件
0x0010 | 由lpszWildCard指定的名字，指定一个目录
0x0020 | 已归档的文件
0x4000 | 包括匹配由lpszWildCard确定的名字的所有驱动器
0x8000 | 独有标记。如果设置了独有标记，只有指定类型的文件列出来否则，指定类型的文件与"normal" 文件都列出来

lpszWildCard 指向文件说明字符串的指针。此字符串可包含通配符。

说明：添加文件名称和/或驱动器列表到列表框中。

请参阅：CWnd::DlgDirList, LB_DIR, CFile::GetStatus


 CListBox::DrawItem

virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );

参数：
lpDrawItemStruct 指向DRAWITEMSTRUCT结构的长型指针，包含所需的绘图类型信息。

说明：
当自绘制列表的可视部分改变时被框架调用。DRAWITEMSTRUCT结构的ItemAction和ItemState成员定义执行的绘图操作。
缺省时，此成员函数什么也不做。覆盖此成员函数以实现自绘制CListBox对象的绘制。应用需恢复所有为上下文的显示选择的图表设备接口(GDI)对象，在此成员函数结束前在lpDrawItemStruct中给出。
请参阅CWnd::OnDrawItem以了解DrawItemSTRUCT结构的介绍。

请参阅：
CListBox::CompareItem, CWnd::OnDrawItem, WM_DRAWITEM, CListBox::MeasureItem, CListBox::DeleteItem


 CListBox::FindString

int FindString( int nStartAfter, LPCTSTR lpszItem ) const;

返回值：匹配项的基于零的索引，如果查找不成功，则为LB_ERR。

参数：
nStartAfter | 包含第一个查找项前面的项的基于零的索引。当查找到达列表框的底部，它从列表框顶部回到由nStartAfter指定的项。如果nStartAfter为-1，从头查找整个列表框。
lpszItem | 指向包含查找的前缀的空终止字符串的指针。查找是大小写敏感的，所以此字符串可包含任意个大写或小写字母。

说明：
查找列表框中包含指定前缀的第一个字符串，而不改变列表框选择。使用SelectString成员函数来查找和选择一个字符串。

请参阅：
CListBox::SelectString, CListBox::AddString, CListBox::InsertString, LB_FINDString


 CListBox::FindStringExact

int FindStringExact( int nIndexStart, LPCTSTR lpszFind ) const;

返回值：匹配项的索引，如果查找不成功，则为LB_ERR。

参数：
nIndexStart | 包含第一个查找项前面的项的基于零的索引。当查找到达列表框的底部，它从列表框顶部回到由nIndexStart指定的项。如果nIndexStart为-1，从头查找整个列表框。
lpszFind | 指向查找的空终止字符串的指针。此字符串可包含完整的文件名称，包括扩展名。查找是大小写敏感的，所以字符串可包含任意个大写和小写字母。

说明：
应用调用FindStringExact成员函数来查找匹配lpszFind指定的字符串的第一个列表框字符串。如果列表框创建为自绘制风格而不是LBS_HASStringS风格，则FindStringExact成员函数试图匹配lpszFind值的双字值。

请参阅：
CListBox::FindString, LB_FINDString, LB_FINDStringEXACT


 CListBox::GetAnchorIndex

int GetAnchorIndex( ) const;

返回值：如果成功，则为当前锚点的索引，否则为LB_ERR。

说明：
获取列表框中当前锚点的基于零的索引。在多选框中，锚点是选项块的第一个或最后一项。

请参阅：CListBox::SetAnchorIndex


 CListBox::GetCaretIndex

int GetCaretIndex() const;

返回值：
列表框中具有矩形焦点的项基于零的索引。如果列表框是单选框，则返回值是选择项的索引。

说明：
应用调用SetCaretIndex成员函数确定在多选框中具有焦点矩形的项的索引。项是选择的或未选择的。

请参阅：
CListBox::GetCaretIndex, LB_SETCARETINDEX


 CListBox::GetCount

int GetCount( ) const;

返回值：列表框中的项的数目，出错时为LB_ERR。

说明：
获取列表框中项的数目。
返回数比最后一项的索引值大1（索引是基于零的）。

请参阅：CLB_GETCOUNT


 CListBox::GetCurSel

int GetCurSel( ) const;

返回值：
当前选择项基于零的索引。如果当前无选择项或列表框是多选框时，为LB_ERR。

说明：
获取当前选择项基于零的索引，若有，则在单选列表框中。
GetCurSel不应为多选列表框调用。

请参阅：LB_GETCURSEL, CListBox::SetCurSel


 CListBox::GetHorizontalExtent

int GetHorizontalExtent( ) const;

返回值：列表框的可滚动宽度，用像素表示。

说明：
从列表框中获取列表框可水平滚动的用像素表示的宽度。只有在列表框有水平滚动条时才适用。

请参阅：
CListBox::SetHorizontalExtent, LB_GETHORIZONTALEXTENT


 CListBox::GetItemData

DWORD GetItemData( int nIndex ) const;

返回值：与项相关的32位值，出错时为LB_ERR。

参数：
nIndex 指定列表框中项的基于零的索引。

说明：
获取与指定列表框项相关的应用提供的双字值。
双字值是SetItemData调用的dwItemData 参数。

请参阅：
CListBox::AddString, CListBox::GetItemDataPtr, CListBox::SetItemDataPtr, CListBox::InsertString, CListBox::SetItemData, LB_GETITEMDATA


 CListBox::GetItemDataPtr

void* GetItemDataPtr( int nIndex ) const;

返回值：获取指针，出错时为-1。

参数：
nIndex 指定列表框中项的基于零的索引。

说明：
获取与指定列表框项相关的应用提供的双字值作为指针（void*）。

请参阅：
CListBox::AddString, CListBox::GetItemData, CListBox::InsertString, CListBox::SetItemData, LB_GETITEMDATA


 CListBox::GetItemHeight

int GetItemHeight( int nIndex ) const;

返回值：
列表框项的高度，用像素表示。如果列表框具有LBS_OWNERDRAWVARIABLE风格，返回值是由nIndex指定的项的高度。如果出错，返回值为LB_ERR。

参数：
nIndex 指定列表框中项的基于零的索引。此参数只用于LBS_OWNERDRAWVARIABLE风格的列表框，否则，应设置为0。

说明：应用调用GetItemHeight成员函数来指定列表框中项的高度。

请参阅：LB_GETITEMHEIGHT, CListBox::SetItemHeight


 CListBox::GetItemRect

int GetItemRect( int nIndex, LPRECT lpRect ) const;

返回值：如果出错，则为LB_ERR。

参数：
nIndex | 确定项的基于零的索引。
lpRect | 指定指向RECT结构的长型指针，接收项的列表框客户区坐标。

说明：获取当前显示在列表框窗口，邻接列表框项的矩形的维数。

请参阅：LB_GETITEMRECT


 CListBox::GetLocale

LCID GetLocale( ) const;

返回值：列表框中字符串的地点标识符(LCID)值。

说明：
获取列表框使用的地点。例如，地点用于确定有序列表框中字符串序列。

请参阅：
CListBox::SetLocale, ::GetStringTypeW, ::GetSystemDefaultLCID, ::GetUserDefaultLCID


 CListBox::GetSel

int GetSel( int nIndex ) const;

返回值：
如果选择了指定项，则为正数，否则为0。如果出错，则返回LB_ERR。

参数：
nIndex 指定项的基于零的索引。

说明：获取项的选择状态。此成员函数可工作于单选或多选列表框。

请参阅：LB_GETSEL, CListBox::SetSel


 CListBox::GetSelCount

int GetSelCount( ) const;

返回值：
列表框中的选择项数。如果列表框为单选框，返回LB_ERR。

说明：获取多选列表框中的选择项总数。

请参阅：CListBox::SetSel, LB_GETSELCOUNT


 CListBox::GetSelItems

int GetSelItems( int nMaxItems, LPINT rgIndex ) const;

返回值：
放在缓冲区中的项的确切数目。如果列表框是单选框，返回LB_ERR。

参数：
nMaxItems | 确定所选择的项，即项数目将被放入缓冲区的项的最大数目。
rgIndex | 指定长型指针，指向可放置由nMaxItems指定的整数数目的项缓冲区。

说明：用指定多选框中所选择项的数目的整数序列来填入缓冲区。

请参阅：LB_GETSELITEMS


 CListBox::GetText

int GetText( int nIndex, LPTSTR lpszBuffer ) const;
void GetText( int nIndex, CString& rString ) const;

返回值：
字符串长度，不包括空终止字符。如果nIndex不是指定的有效索引，则返回LB_ERR。

参数：
nIndex | 指定获取的字符串的基于零的索引。
lpszBuffer | 指向接收字符串的缓冲区的指针。缓冲区必须有足够的空间来存储字符串和终止字符。字符串大小可以通过调用GetTextLen成员函数提前指定。
rString | CString对象的参考。

说明：
从列表框中获得字符串。此成员函数的第二种形式以字符串文本填充一个CString对象。

请参阅：CListBox::GetTextLen, LB_GETTEXT


 CListBox::GetTextLen

int GetTextLen( int nIndex ) const;

返回值：
字符串的字节长，不包括空终止符。如果nIndex不是指定的有效索引，则返回LB_ERR。

参数：
nIndex 指定获取的字符串的基于零的索引。

说明：获得列表框项中字符串的长度。

请参阅：CListBox::GetText, LB_GETTEXTLEN


 CListBox::GetTopIndex

int GetTopIndex( ) const;

返回值：
如果成功，则为列表框中第一个可见项的基于零的索引，否则为LB_ERR。

说明：
获取列表框中第一个可见项的基于零的索引。开始时，项0在列表框顶部，但如果列表框滚动，则另一项将在顶部。

请参阅：CListBox::SetTopIndex, LB_GETTOPINDEX


 CListBox::InitStorage

int InitStorage( int nItems, UINT nBytes );

返回值：
如果成功，则为列表框可在需要内存重新分配前存储的最大项数。否则为LB_ERRSPACE，表示无足够有效内存。

参数：
nItems | 指定添加的项的数目。
nBytes | 指定分配给项字符串的内存量，用字节表示。

说明：
为存储列表框项分配内存。在添加许多项到CListBox前调用此函数。
此函数帮助加快有大量项（多于100）的列表框的初始化。它预分配定量的内存，使下面的AddString，InsertString和Dir函数用时最短。你可估计此参数，如果过高估计，则分配用不到内存；如果过低估计，则对超出预分配的项使用常规分配。
仅对Windows 95 : nItems参数限制为16位值。这表示列表框不能包含多于32,767 项。尽管项的数量受限制，但列表框中项的总大小只受有效内存的限制。

请参阅：
CListBox::CListBox, CListBox::Create, CListBox::ResetContent, LB_INITSTORAGE


 CListBox::InsertString

int InsertString( int nIndex, LPCTSTR lpszItem );

返回值：
字符串被插入位置的基于零的索引。如果出错，则返回LB_ERR；如果无足够有效空间来存储新字符串，则返回LB_ERRSPACE。

参数：
nIndex | 指定插入字符串的基于零的索引。如果此参数为-1，则字符串添加到列表末尾。
lpszItem | 指向插入的空终止字符串的指针。

说明：
插入字符串到列表框中。与AddString成员函数不同，InsertString不会使LBS_SORT 风格的列表被排序。

请参阅：CListBox::AddString, LB_INSERTSTRING


 CListBox::ItemFromPoint

UINT ItemFromPoint( CPoint pt,BOOL& bOutside) const;

返回值：与pt指定的点最近项的索引。

参数：
pt | 最靠近查找项的点，相对于列表框客户区的左上角。
bOutside | BOOL变量的参考，如果pt在客户区外，则为TRUE；如果pt在客户区内，则为FALSE。

说明：
调用此成员函数，确定与pt指定的点最近的列表框项。可以用此函数确定鼠标光标所在的项。
注意：
因为Win 32消息LB_ITEMFROMPOINT只能用于Windows 95，这样，ItemFromPoint替代Win32消息，也只能用于Windows 95。

请参阅：CListBox::GetItemRect, LB_ITEMFROMPOINT


 CListBox::MeasureItem

virtual void MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct );

参数：
lpMeasureItemStruct 指向MEASUREITEMSTRUCT结构的长型指针。

说明：
当自绘制风格的列表框创建时，被框架调用。
缺省时，此成员函数什么也不做。覆盖此成员函数并填入到MEASUREITEMSTRUCT结构中，通知Windows列表框维数。如果列表框被创建为LBS_OWNERDRAWVARIABLE风格，则框架为列表框中每一项调用此成员函数。否则，此成员只被调用一次。
要了解在由SubclassDlgItem成员函数创建的自绘制的列表框中使用LBS_ OWNERDRAWFIXED风格的更多信息，请参阅“技术指南14”中的讨论。
请参阅 CWnd::OnMeasureItem以了解MEASUREITEMSTRUCT结构的介绍。

请参阅：
CListBox::CompareItem, CWnd::OnMeasureItem, CListBox::DrawItem, CListBox::DeleteItem


 CListBox::ResetContent

void ResetContent( );

说明：从列表框中删除所有项。

请参阅：LB_RESETCONTENT


 CListBox::SelectString

int SelectString( int nStartAfter, LPCTSTR lpszItem );

返回值：
如果查找成功，则为所选项的索引。如果不成功，则返回值为LB_ERR，当前选择不变。

参数：
nStartAfter | 包含查找第一项前的项的基于零的索引。当查找已到达列表框底部，则从列表框顶部回到由nStartAfter指定的项。如果nStartAfter为-1，整个列表框从头查找。
lpszItem | 指向包含查找的前缀的空终止字符串的指针。查找是大小写敏感的，所以此字符串可以包含任意个大写或小写字母。

说明：
查找列表框项，匹配指定的字符串，且若匹配项找到，就选择该项。如果需要，滚动列表框使所选项进入视图。
此成员函数不能用于 LBS_MULTIPLESEL风格的列表框。
只有其最初的字符（从开始处）匹配由lpszItem确定字符串的字符，才选择一项。
使用FindString成员函数查找字符串而不选择该项。

请参阅：CListBox::FindString, LB_SELECTSTRING


 CListBox::SelItemRange

int SelItemRange( BOOL bSelect, int nFirstItem, int nLastItem );

返回值：如果出错，则为LB_ERR。

参数：
bSelect | 指定如何设置选择。如果bSelect为TRUE，则字符串被选择并高亮显示；如果为FALSE，高亮显示撤消，字符串不再被选择。
nFirstItem | 指定设置的第一项的基于零的索引。
nLastItem | 指定设置的最后一项的基于零的索引。

说明：
在多选列表框中选择多个连续的项。
只对多选列表框使用此成员函数。如果只需在多选列表框中选择一项，也就是，若nFirstIem等于nLastItem则调用SetSel成员函数。

请参阅：LB_SELITEMRANGE, CListBox::GetSelItems


 CListBox::SetAnchorIndex

void SetAnchorIndex( int nIndex );

参数：
nIndex 指定将作为锚点的列表框项的基于零的索引。

说明：
在多选列表框中设置锚点来开始扩展选择。在多选列表框中，锚点是连续选择项中的第一项或最后一项。

请参阅：CListBox::GetAnchorIndex


 CListBox::SetCaretIndex

int SetCaretIndex( int nIndex, BOOL bScroll = TRUE );

返回值：如果出错，则返回LB_ERR。

参数：
nIndex | 指定项的基于零的索引，接收列表框中的焦点矩形。
bScroll | 如果值为0，项滚动到完全可见。否则，项至少滚动到部分可见。

说明：
应用调用SetCaretIndex成员函数来设置焦点矩形到多选列表框中指定索引的项。如果项不可见，它滚动进入视图。

请参阅：CListBox::GetCaretIndex, LB_SETCARETINDEX


 CListBox::SetColumnWidth

void SetColumnWidth( int cxWidth );

参数：
cxWidth 指定总列宽，用像素表示。

说明：
在多选列表框（创建为LBS_MULTICOLUMN风格）中设置总列宽，用像素表示。

请参阅：LB_SETCOLUMNWIDTH


 CListBox::SetCurSel

int SetCurSel( int nSelect );

返回值：如果出错，则返回LB_ERR。

参数：
nSelect 指定选择的字符串的基于零的索引。如果nSelect为-1，列表框设置为无选择。

说明：
如果需要，选择一个字符串并将其滚动到视图。当新字符串被选择，列表框将前一个选择的字符串去掉高亮显示。
只对单选列表框使用此成员函数。它不能用来设置或删除多选框中的选择。

请参阅：LB_SETCURSEL, CListBox::GetCurSel


 CListBox::SetHorizontalExtent

void SetHorizontalExtent( int cxExtent );

参数：
cxExtent 指定列表框可水平滚动的像素数。

说明：
设置列表框可水平滚动的宽度，用像素表示。如果列表框大小小于此值，水平滚动条将水平滚动列表框中的项。如果列表框与此值一样大或更大，水平滚动条被隐藏。
回应对SetHorizontalExtent的调用，列表框必须定义为WS_HSCROLL风格。
此成员函数对多列的列表框有用。对多列列表框调用SetColumnWidth成员函数。

请参阅：
CListBox::GetHorizontalExtent, CListBox::SetColumnWidth, LB_SETHORIZONTALEXTENT


 CListBox::SetItemData

int SetItemData( int nIndex, DWORD dwItemData );

返回值：如果出错，则返回LB_ERR。

参数：
nIndex | 指定项的基于零的索引。
dwItemData | 指定与项相关的值。

说明：设置与列表框中指定项相关的32位值。

请参阅：
CListBox::SetItemDataPtr, CListBox::GetItemData, LB_SETITEMDATA


 CListBox::SetItemDataPtr

int SetItemDataPtr( int nIndex, void* pData );

返回值：如果出错，则为LB_ERR。

参数：
nIndex | 指定项的基于零的索引。
pData | 指定与项相关的指针。

说明：
设置列表框中指定项相关的32 位值为指定的指针(void*)。此指针在列表框生命期间有效，即使项在列表框中的相对位置可能在添加或删除项时改变。从而，项在框中的索引可改变，但指针不变。

请参阅：
CListBox::SetItemData, CListBox::GetItemData, CListBox::GetItemDataPtr, LB_SETITEMDATA


 CListBox::SetItemHeight

int SetItemHeight( int nIndex, UINT cyItemHeight );

返回值：如果索引或高度无效，则返回LB_ERR。

参数：
nIndex | 指定列表框中项的基于零的索引。此参数只用于LBS_OWNERDRAWVARIABLE 风格的列表框，否则，应被设置为0。
cyItemHeight | 指定项的高度，用像素表示。

说明：
应用调用SetItemHeight成员函数来设置列表框项的高度。如果列表框具有LBS_OWNERDRAWVARIABLE风格，此函数设置由nIndex指定的项的高度。否则，此函数设置列表框中所有项的高度。

请参阅：CListBox::GetItemHeight, LB_SETITEMHEIGHT


 CListBox::SetLocale

LCID SetLocale( LCID nNewLocale );

返回值：此列表框的前一个地点标识符(LCID)值。

参数：
nNewLocale 为列表框设置的新的地点标识符(LCID)值。

说明：
为此列表框设置地点标识符。如果SetLocale未被调用，缺省地点从系统取得。系统缺省地点可以用控制面板区域(或International)应用更改。

请参阅：CListBox::GetLocale


 CListBox::SetSel

int SetSel( int nIndex, BOOL bSelect = TRUE );

返回值：如果出错，则为LB_ERR。

参数：
nIndex | 包含设置的字符串的基于零的索引。如果为-1，选择从所有字符串添加或删除，取决于bSelect值。
bSelect | 指定如何设置选择。如果bSelect为TRUE，字符串被选择并高亮显示；如果为FALSE，高亮显示被去掉且字符串不再被选择。缺省时，指定的字符串被选择并高亮显示。

说明：
在多选列表框中选择一个字符串。
只能对多选列表框使用此成员函数。

请参阅：CListBox::GetSel, LB_SETSEL


 CListBox::SetTabStops

void SetTabStops( );
BOOL SetTabStops( const int& cxEachStop );
BOOL SetTabStops( int nTabStops, LPINT rgTabStops );

返回值：如果设置了所有制表键，则返回非零值，否则为0。

参数：
cxEachStop | 在每个cxEachStop对话单位设置了制表键停止。请参阅rgTabStops得到对话单位的细节。
nTabStops | 指定列表框中的制表键停止数。
rgTabStops | 指向整数序列的第一个成员，包含对话单位中制表键停止位置。一个对话单位是一个水平或垂直距离。一个水平对话单位等于当前对话基本宽单位的四分之一，一个垂直对话单位等于当前对话基本宽单位的八分之一。对话基本单位是基于当前系统原高和宽计算的。Windows GetDialogBaseUnits函数以像素返回当前对话基本单位。制表键停止必须排为升序；不允许后向制表键。

说明：
设置列表框的制表键停止位置。
设置制表键停止为缺省大小2对话单位，调用此成员函数的无参数版本。设置不为2的制表键停止，调用cxEachStop主题的版本。
设置制表键为一个序列大小，使用带rgTabStops和nTabStops参数的版本。制表键停止将为rgTabStops中多达由nTabStops指定的数的每个值设置。
回应对SetTabStops成员函数的调用，列表框必须创建为LBS_USETABSTOPS 风格。

请参阅：LB_SETTABSTOPS, ::GetDialogBaseUnits


 CListBox::SetTopIndex

int SetTopIndex( int nIndex );

返回值：如果成功，则为0；若出错，则为LB_ERR。

参数：
nIndex 指定列表框项的基于零的索引。

说明：
保证某个列表框项可见。
系统滚动列表框，直到由nIndex 指定的各项出现在列表框顶部或到达最大滚动范围。

请参阅：CListBox::GetTopIndex, LB_SETTOPINDEX


 CListBox::VKeyToItem

virtual int VKeyToItem( UINT nKey, UINT nIndex );

返回值：
对没有进一步操作返回-2，对缺省操作返回-1，对指定执行击键缺省操作的列表框索引返回非零值。

参数：
nKey | 用户所按键的虚键代码。
nIndex | 列表框脱字符的当前位置。

说明：
当列表框的父窗口接受来自列表框的WM_VKEYTOITEM消息时，此函数被框架调用。当列表框接收一个WM_KEYDOWN消息时，WM_VKEYTOITEM消息由列表框发送，但只能是列表框满足下列两条件：
· | 具有LBS_WANTKEYBOARDINPUT 风格设置。
· | 至少有一项。
不能自己调用此函数。覆盖此函数以提供对键盘消息的处理。必须返回一个值通知框架你的覆盖执行了什么操作。返回值-2表示应用处理了选项的所有方面，无须列表框的进一步操作。返回-2前，你可以设置选择或移动脱字符或两者都有。设置选择，请使用SetCurSel 或SetSel。移动脱字节，请使用SetCaretIndex。
返回值-1表示列表框应执行回应关键步骤的缺省操作。缺省实现返回-1。
0或更大的返回值指定列表框中项的索引并指示列表框应在指定项上为击键执行缺省操作。

请参阅：
CListBox::CharToItem, CListBox::SetCurSel, CListBox::SetSel, CListBox::SetCaretIndex


 CListCtrl

CObject
└CCmdTarget
└CWnd
└CListCtrl

CListCtrl类封装“列表视图控件”功能，显示每个包含图标（列表视图中）和标签的收集。除图标和标签外，每一项还能有显示在图标和标签的右边的列中的信息。此控件（以及CListCtrl类）只适用于运行于Windows 95和Windows NT 3.51及更高版本的程序。
下面是CListCtrl类的主要概况。对于详细的、概念性的讨论，请参阅联机文档“Visual C++程序员指南”中的“使用ClistCtrl”和“控件主题”。

视图
列表视图控件可用四种不同方式显示其内容，称为“视图”。
· | 图标视图 每一项以全尺寸图标（32×32像素）出现，下面有一个标签。用户可在列表视图窗口拖动项到任意位置。
· | 小图标 视图每一项以小图标（16×16像素）出现，右边有一个标签。用户可在列表视图窗口拖动项到任意位置。
· | 列表视图 每一项以小图标出现，下面有一个标签。项按列排列，不能拖动到列表视图窗口的任何位置。
· | 报表视图 每一项在本行上出现，右边有排列成列的附加信息。最左边的列包含小图标和标签，下一列包含应用指定的子项。嵌入标题控件实现这些列。要了解报表视图标题控件和列的更多信息，请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:给控件添加列(报表视图)”。
控件的当前列表视图风格指定当前视图。要了解这些风格及其用法的更多信息，请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:改变列表控件风格”。

扩展风格
除了标准列表风格，类CListCtrl支持一系列提供丰富功能的扩展风格。此功能的一些示例包括：
· | 逗留选择 有效时，若光标保持在某项上一段时间，则允许自动选择该项。
· | 虚列表视图 如果有效，允许控件支持DWORD项。通过把管理应用项数据放在最顶上而成为可能。除了项选择和焦点信息，所有项信息必须由应用管理。要了解更多信息，请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:虚列表控件”。
· | 单击或双击激活 如果有效，允许热跟踪（项文本自动高亮显示）和高亮显示项的单击和双击激活。
· | 拖放列表命令 如果有效，允许拖放列表视图控件中列的记录。只对报表视图有效。
要了解使用新扩展风格的更多信息，请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:改变列表控件风格”。

项和子项
列表视图控件中的每一项含有一个图标、一个标签、一个当前状态和应用定义值（称为“项数据”）。一个或更多子项还可与每一项联系。一个“子项”是一个字符串，在报表视图中可显示在项图标和标签右边的列里。列表视图控件中的每一项都必须与子项数目相同。
类CListCtrl提供一些函数来插入、删除、查找和更改这些项。要了解更多信息，请参阅“Visual C++程序员指南”中的“使用CListCtrl:列表控件中的滚动、排列、排序和查找”。同时请参阅CListCtrl::GetItem，CListCtrl::InsertItem和CListCtrl::FindItem。
缺省时，列表视图控件负责存储一个项的图标和文本属性。然而，除了这些项类型外，类CListCtrl支持“回调项”。一个“回调项”是一个列表视图项，每个应用棗而不是控件棗存储文本，图标或两者。回调掩码用于指定哪个项的属性（文本和/或图标）由应用提供。如果应用使用回调项，它必须可以提供按需要提供文本和/或图标属性。回调项在你的应用已有部分这种信息时很有帮助。要了解更多信息，请参阅CListCtrl::GetCallBackMask和“使用CListCtrl：回调项和回调掩码”。

图象列表
图标、标题项图象和应用定义的列表视图项状态包含在一些图象列表中（由类CImageList实现），可创建和指派到列表视图控件中。每个列表视图控件可有四个以上的图象列表类型：
· | 大图标 在图标视图中使用，得到全尺寸图标。
· | 小图标 用于小图标、列表和报表视图中，得到图标视图中使用的小版本的图标。
· | 应用定义的状态 包含状态图象，在项图标旁显示以指示一个应用定义状态。
· | 标题项 用于在报表视图中，得到出现在每个标题控件项中的小图象。
缺省时，列表视图控件删除指派给它的图象列表（当它删除时）；然而，开发者可通过删除由应用定义的不再使用的图象列表。要了解更多信息，请参阅联机文档“Visual C++程序员指南”中的“使用CListCtrl:列表项和图象列表”。
#include <afxcmn.h>

请参阅：CImageList

CListCtrl类的成员

构造函数
ClistCtrl | 构造一个CListCtrl对象
Create | 创建列表控件并将其附加给CListCtrl对象

属性
GetBkColor | 获取列表视图控件的背景色
SetBkColor | 设置列表视图控件的背景色
GetImageList | 获取用于绘制列表视图项的图象列表的句柄
SetImageList | 指定一个图象列表到列表视图控件
GetItemCount | 获取列表视图控件中的项的数量
GetItem | 获取列表视图项的属性
GetCallbackMask | 获取列表视图控件的回调掩码
SetCallbackMask | 设置列表视图控件的回调掩码
GetNextItem | 查找指定特性和指定指定项关系的列表视图项
GetFirstSeletedItemPosition | 在列表视图控件中获取第一个选择的列表视图项的位置
GetNextSeletedItem | 为重复而获取下一个选择的列表视图
GetItemRect | 获取项的有界矩形
SetItemPosition | 在列表视图控件中移动一项到指定位置
GetItemPosition | 获取列表视图项的位置
GetStringWidth | 指定需要显示所有指定字符串的最小列宽
GetEditControl | 获取用于编辑一个项文本的编辑控件的句柄
GetColumn | 获取控件的列的属性
SetColumn | 设置列表视图列的属性
GetColumnWidth | 获取报表视图或列表视图中的列的宽度
SetColumnWidth | 改变报表视图或列表视图中的列的宽度
GetCheck | 获取与某项相关的状态图象的当前显示状态
SetCheck | 设置与某项相关的状态图象的当前显示状态
GetViewRect | 获取列表视图控件中所有项的有界矩形
GetTextColor | 获取列表视图控件的文本颜色
SetTextColor | 设置列表视图控件的文本颜色
GetTextBkColor | 获取列表视图控件的文本背景色
SetTextBkColor | 设置列表视图控件的文本背景色
GetTopIndex | 获取最高级项的索引
GetCountPerPage | 计算可正好垂直放入列表视图控件中的项的数目
GetOrigin | 获取列表视图控件的最初的当前视图
SetItemState | 改变列表视图控件的项的状态
GetItemState | 获取列表视图控件的项的状态
GetItemText | 获取列表视图项或子项的文本
SetItemText | 设置列表视图项或子项的文本
SetItemCount | 准备一个列表视图控件以添加大量的项
GetItemData | 获取与某项相关的应用所指定的值
SetItemData | 设置项的应用指定的值
GetSelectedCount | 获取列表视图控件中选择项的数量
SetColumnOrderArray | 设置列表视图控件的列序（左或右）
GetColumnOrderArray | 获取列表视图控件的列序（左或右）
SetIconSpacing | 设置列表视图控件中的图标的距离
GetHeaderCtrl | 获取列表视图控件的标题控件
GetHotCursor | 获取在热调试对列表视图控件有效时使用的游标
SetHotCursor | 设置在热调试对列表视图控件有效时使用的游标
GetSubItemRect | 获取列表视图控件中某项的有界矩形
GetHotItem | 获取当前在游标下的列表视图项
SetHotItem | 设置列表视图控件的当前热项
GetSelectionMark | 获取列表视图控件的选择屏蔽
SetSelectionMark | 设置列表视图控件的选择屏蔽
GetExtendedStyle | 获取列表视图控件的当前扩展风格
SetExtendedStyle | 设置列表视图控件的当前扩展风格
SubItemHitTest | 指定哪个列表视图项在指定位置，若存在
GetWorkAreas | 获取列表视图控件的当前工作区
GetNumberOfWorkAreas | 获取列表视图控件的当前工作区数量
SetItemCountEx | 设置虚列表视图控件的项的数量
SetWorkAreas | 设置列表视图控件中图标可以显示的区域
ApproximateViewRect | 指定显示列表视图控件项所需的宽度和高度
GetBkImage | 获取列表视图控件的当前背景图象
SetBkImage | 设置列表视图控件的当前背景图象
GetHoverTime | 获取列表视图控件的当前逗留时间
SetHoverTime | 设置列表视图控件的当前逗留时间

操作
InsertItem | 在列表视图控件中插入一个新项
DeleteItem | 从控件中删除一项
DeleteAllItems | 从控件中删除所有项
FindItem | 查找具有指定的字符的列表视图项
SortItems | 使用应用定义的比较函数排序列表视图项
HitTest | 指定哪个列表视图在指定的位置上
EnsureVisible | 保证项是可见的
Scroll | 滚动列表视图控件的内容
ReDrawItems | 强迫列表视图控件刷新一些项
Update | 强迫控件刷新一个指定的项
Arrange | 调整一栏里的项
EditLabel | 开始项文本该处编辑
InsertColumn | 插入列表视图控件中的新列
DeleteColumn | 从列表视图控件中删除一列
CreateDragImage | 为指定的项构造一个拖动图象列表

可覆盖的函数
DrawItem 当自绘制控件的可视部分改变时被调用


 CListCtrl::ApproximateViewRect

CSize ApproximateViewRect(CSize sz = CSize(-1,-1),int iCount = -1) const;

返回值：
一个包含显示项所需的近似的宽度和高度的CSize对象，以像素为单位。

参数：
sz | 控件建议的维数，以像素为单位。如果没有指定维数，那么框架将使用控件的当前的宽度和高度值。
iCount | 在控件中被显示的项数。如果该参数等于-1，那么框架将使用当前控件中所有的项。

说明：
该成员函数实现了Win32宏ListView_ApproximateViewRect的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CListCtrl::GetViewRect


 CListCtrl::Arrange

BOOL Arrange(UNIT nCode)

返回值：如果成功，则返回非零值，否则为0。

参数：
nCode指定项的对齐方式。它可为下列值之一：
· | LVA_ALLIGNLEFT | 使项沿着窗口的左边界对齐。
· | LVA_ALLIGNTOP | 使项沿着窗口的顶端对齐。
· | LVA_DEFAULT | 使项按照列表显示的当前对齐方式（即缺省值）对齐。
· | LVA_SNAPTOGRID | 使所有图标到最近的网格位置。

说明：
调用该函数来重新安排在图标视图中项的位置，以便它们能够在网格中对齐。参数nCode 指定了对齐方式。

请参阅：CListCtrl::EnsureVisible


 CListCtrl::CListCtrl

CListCtrl()

说明：构造一个CListCtrl对象。

请参阅：CListCtrl::Create


 CListCtrl::Create

BOOL Create(DWORD dwStyle,const RECT& rect,CWnd* pParentWnd,UINT nID)

返回值：如果成功，则返回非零值，否则为0。

参数：
dwStyle | 为列表中的控件指定其风格。可为控件使用控件风格列表中的任意组合。请参阅说明以了解各种可能的风格。
rect | 为列表中的控件指定其大小和位置。它既可以是一个CRect对象,也可以是一个Rect结构。
pParentWnd | 为列表中的控件指定其父窗口，通常为CDialog。它不应当为空。
nID | 为列表中的控件指定其ID号。

说明：
可以用两步来构造一个CListCtrl。首先调用构造函数，然后调用Create函数。这样将创建一个列表视图控件，并将附加给CListCtrl对象。
参数dwStyle可以是以下值的组合：
· | LVS_ALIGNLEFT | 在图标和小图标视图中指定项左对齐。
· | LVS_ALIGNTOP | 在图标和小图标视图中指定项在控件的顶端对齐。
· | LVS_AUTOARRANGE | 在图标或小图标视图中指定图标自动保持对齐。
· | LVS_EDITABELS | 允许项文本能够适本地进行编辑。父窗口必须运行了LVN_ENDLABLEDIT通知消息。
· | LVS_ICON | 指定为图标视图。
· | LVS_LIST | 指定为列表视图。
· | LVS_NOCOLUMNHEADER | 指定在报表视图中不显示列标题。缺省时，在报表视图中列有标题。
· | LVS_NOLABELWRAP | 在图标视图的单行中显示项文本，缺省时，在图标视图中项文本有可能被遮住。
· | LVS_NOSCROLL | 不允许滚动，所有项都必须在客户可视的区域内。
· | LVS_NOSORTHEADER | 指定列标题不象按钮那样工作。这种风格是有用的，例如，当在报表视图中单击列标题，将不会带来例如排序那样的动作。
· | LVS_OWNERDRAWFIXED | 在报表视图中允许所有者窗口为项着色。列表视图控件发送一条WM_DRAWITWM 消息来为每一项着色；但它不为每一子项发送独立的消息。DRAWITEMSTRUCT结构中的itemDate成员则包含了指定列表视图项的项数据。
· | LVS_REPORT | 指定报表视图。
· | LVS_SHAREIMAGELISTS | 指定控件没有归属于它的图象列表的所有权（也就是说，当控件被销毁后，图象列表不会被销毁）。该风格能够是同一个图象列表用于多个列表视图控件中。
· | LVS_SHOWSELALWAYS | 总是显示选择框，即使任何控件都没有焦点。
· | LVS_SINGLESEL | 允许每次只能选择一个项。缺省时，同时能选择多项。
· | LVS_SMALLICON | 指定为小图标视图。
· | LVS_SORTASCENDING | 使项按照项文本的升序方式排列。
· | LVS_SORTDESCENDING | 使项按照项文本的降序方式排列。

请参阅：CListCtrl::CListCtrl


 CListCtrl::CreateDragImage

CImageList* CreateDragImage(int nItem, LPPOINT lpPoint)

返回值：
如果成功，则返回指向拖拉图象列表的指针，否则为空。

参数：
nItem | 将要创建的拖拉图象列表项的索引。
lpPoint | POINT结构的地址，在视图坐标中，将决定图象的左上角的初始位置。

说明：
调用该函数为项创建拖拉图象列表须指定nItem。但CImageList对象是永久的，当用完后，必须删除它。例如：
CImageList* pImageList = MyListCtrl.CreateDragImage(nItem,&point);
...
...
delete pImageList;

请参阅：CImageList, CListCtrl::GetImageList


 CListCtrl::DeleteAllItems

BOOL DeleteAllItems()

返回值：如果成功，则返回非零值，否则为0。

说明：
调用该函数将从列表视图控件中删除所有的项。

请参阅：CListCtrl::InsertItem, CListCtrl::DeleteItem


 CListCtrl::DeleteColumn

BOOL DeleteColumn (int nCol)

返回值：如果成功，则返回非零值，否则为0。

参数：
nCol 将要被删除列的索引值。

说明：调用该函数，从列表视图控件中删除某一列。

请参阅：CListCtrl::InsertColumn, CListCtrl::DeleteAllItems


 CListCtrl::DeleteItem

BOOL DeleteItem (int nItm)

返回值：如果成功，则返回非零值，否则为0。

参数：
nItem 指定将要被删除项的索引值。

说明：
调用该函数将从列表视图控件中删除某一项。

请参阅：CListCtrl::InsertItem, CListCtrl::DeleteAllItems


 CListCtrl::DrawItem

virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)

参数：
lpDrawItemStruct 一个指向DRAWITEMSTRUCT结构的长指针，其中包含绘图类型的信息。

说明：
当图画所有者的列表视图控件的视觉比例发生改变时，由框架调用。DRAWITEMSTRUCT结构的itemAction 成员定义了将要进行的绘图动作。
缺省时，该成员函数毫无作用。可覆盖此函数，实现拥有者绘制的CListCtrl对象的绘图操作。
应用也将在该成员函数终止前，恢复所有被选择的用于支持lpDrawItemStruct的显示内容的图形设备界面（GDI）对象。

请参阅：CWnd::OnDrawItem


 CListCtrl::EditLabel

CEdit* EditLabel(int nItem)

返回值：
如果成功，则返回一个指向用于编辑项文本CEdit对象的指针，否则为NULL。

参数：
nItem 被编辑的列表视图项的索引值。

说明：
一个拥有LVS_EDITLABELS窗口风格的列表视图控件将允许用户就地编辑项标签。用户能够通过单击项的标签开始编辑。
使用该函数能够在列表视图项的文本中进行就地编辑。

请参阅：CListCtrl::GetEditControl


 CListCtrl::EnsureVisible

BOOL EnsureVisible(int nItem,BOOL bPartialOK)

返回值：如果成功，则返回非零值，否则为0。

参数：
nItem | 将可视的列表视图项的索引值。
bPartialOK | 指定是否部分可视是可以接受的。

说明：
调用该函数将使列表视图项至少部分可视。如果必要，可以滚动列表视图控件。同时，如果参数bPartialOK等于零，那么当项部分可视时，将不发生滚动。

请参阅：CListCtrl::Scroll


 CListCtrl::FindItem

int FindItem(LVFINDFO* pFindInfo,int nStart = -1) const

返回值：如果成功，则返回项的索引值，否则为-1。

参数：
pFindInfo | 一个指向包含被搜索项有关信息的LVFINDFO结构的指针。
nStart | 搜索开始项的索引值。如果等于-1， 则从头进行搜索。否则，那么第nStart项包括在搜索范围内。

说明：
使用该函数来搜索列表视图项中是否含有指定的字符。
参数pFindInfo指向一个包含用于搜索列表视图项信息的LVFINDFO结构。

请参阅：CListCtrl::SortItems


 CListCtrl::GetBkColor

COLORREF GetBkColor() const

返回值：一个用于指定RGB颜色的32位数值。

说明：获取列表视图控件的背景色。

请参阅：CListCtrl::SetBkColor, COLORREF


 CListCtrl::GetBkImage

BOOL GetBkImage(LVBKIMAGE* plvbkImage) const

返回值：如果成功，则返回非零值，否则为0。

参数：
plvbkImage 一个指向列表视图中包含当前图象背景的LVBKIMAGE结构。

说明：
该成员函数实现了Win32宏ListView_GetBkImage的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CListCtrl::SetBkImage


 CListCtrl::GetCallbackMask

UNIT GetCallbackMask() const

返回值：列表视图控件的回调掩码。

说明：
获取列表视图控件的回调掩码。
“回调项”是应用，而不是为控件存储文本、图表或两者的列表视图项。尽管列表视图控件能够存储这些属性，然而假如应用已经维护了某些信息，你可能希望使用回调项。调用掩码指定了被应用维护的项的状态位，并且它被应用于整个控件，而不是某个特定的项。缺省时，回调掩码为零，这意味着控件将追踪项的所有状态。如果应用使用了回调项，或指定了非零回调掩码，那么它必须能够支持所需的列表视图项的属性。

请参阅：CListCtrl::SetCallbackMask


 CListCtrl::GetCheck

BOOL GetCheck(int nItem) const

返回值：如果成功，则返回非零值，否则为0。

参数：
nItem 返回以0为基数的列表控件项的索引值。

说明：
该成员函数实现了Win32宏ListView_GetCheckState的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CListCtrl::SetCheck


 CListCtrl::GetColumn

BOOL GetColumn(int nCol,LVCOLUMN* pColumn) const

返回值：如果成功，则返回非零值，否则为0。

参数：
nCol | 要获取属性的列的索引值。
pColumn | 指定要获取的和已经得到有关列的信息的LVCOLUMN结构的地址。mask成员指定了要获取的列属性。如果任务成员指定了LVCF_TEXT的值，那么pszText成员必须包含要接受项文本的缓冲区的地址，并且cchTextMax成员必须指定缓冲区的大小。

说明：
获取列表视图控件的属性。
LVCOLUMN结构包含了报表视图中有关列的信息。

请参阅：CListCtrl::SetColumn, CListCtrl::GetColumnWidth


 CListCtrl::GetColumnOrderArray

BOOL GetColumnOrderArray(LPINT piArray,int iCount=-1)

返回值：如果成功，则返回非零值，否则为0。

参数：
piArray | 一个指向包含列表视图控件中列的索引值的缓冲区的指针。该缓冲区必须有足够的空间，足以包含列表视图控件中列的总数。
iCount | 列表视图控件中列的总数。如果该参数等于-1，那么列数通过框架自动获取。

说明：
该成员函数实现了Win32宏ListView_GetColumnOrderArray的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CListCtrl::SetColumnOrderArray


 CListCtrl::GetColumnWidth

int GetColumnWidth(int nCol) const

返回值：通过nCol指定的以像素为单位的列宽。

参数：
nCol 指定要获取列宽的列的索引值。

说明：在报表视图或列表视图中获取列的宽度。

请参阅：CListCtrl::SetColumnWidth, CListCtrl::GetColumn


 CListCtrl::GetCountPerPage

int GetCountPerPage() const

返回值：
当在列表视图或报表视图中，能够在垂直方向适合列表视图控件的项数。

说明：
当在列表视图或报表视图中，计算能够在垂直方向适合列表视图控件的项数。

请参阅：CListCtrl::GetTopIndex


 CListCtrl::GetEditControl

CEdit* GetEditControl() const

返回值：
如果成功，则返回一个指向用于编辑项文本的CEdit对象，否则为NULL。

说明：
获取用于编辑列表视图的项文本的编辑控件的句柄。

请参阅：CListCtrl::EditLabel


 CListCtrl::GetExtendedStyle

DWORD GetExtendedStyle()

返回值：
当前在列表视图中使用的扩展风格的组合。对于这些扩展风格的描述，请参阅联机文档“平台SDK”中的“扩展列表视图风格”

说明：
该成员函数实现了Win32宏ListView_GetExtendedListViewStyle的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CListCtrl::SetExtendedStyle


 CListCtrl::GetFirstSelectedItemPosition

POSITION GetFirstSelectedItemPosition()

返回值：
返回一个用于迭代或获取对象指针的POSITION值；如果没有选择任何项，那么将返回NULL。

说明：
在列表视图控件中获取第一个选择项的位置。

示例：
下列代码演示了该函数的用法。
CListCtrl* pListCtrl=( CListCtrl* )GetDlgItem(IDC_YOURLISTCONTROL);
ASSERT(pListCtrl !=NULL)
POSITION pos = pList->GetFirstSelectedItemPosition();
if (pos==NULL) TRACE0("No items were selected!\n")
else
{
while (pos)
{
int nItem=pList->GetNextSelectedItem(pos);
TRACE1("item %d was Selected!\n",nItem);
//you could do your processing on nItem here
}
}

请参阅：CImageList, CListCtrl::GetNextSelectedItem


 CListCtrl::GetHeaderCtrlCheader

Ctrl* GetHeaderCtrl()

返回值：
返回一个指向标题控件的指针，该指针将为列表视图控件所使用。

说明：
该成员函数实现了Win32宏ListView_GetHeader的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CHeaderCtrl


 CListCtrl::GetHotCursor

HCURSOR GetHotCursor()

返回值：
返回被当前列表视图控件所使用的热图标资源的句柄。

说明：
该成员函数实现了Win32宏ListView_GetHotCursor的功能，如同联机文档“平台SDK”中所描述的。
热图标，仅仅在能进行逗留选择时可视，在图标经过任何列表视图项的时候出现。进行逗留选择是通过设置LVS_EX_TRACKSELECT 扩展风格来实现的。

请参阅：CListCtrl::SetHotCursor, CListCtrl::GetHotItem


 CListCtrl::GetHotItem

int GetHotItem()

返回值：列表视图控件的热项的索引值。

说明：
该成员函数实现了Win32宏ListView_GetHotItem的功能，如同联机文档“平台SDK”中所描述的。
当允许热跟踪（及逗留选择）时，热项被定义当前被选择的项。
如果实现了热跟踪，那么当用户在列表视图项上暂停时，项标签将自动高亮度显示，但使用鼠标键。

请参阅：CListCtrl::GetHotCursor


 CListCtrl::GetHoverTime

DWORD GetHoverTime() const

返回值：
返回鼠标指针在选择某项前停留在该项的延迟毫秒数。如果返回值为-1 ，那么停留时间则是缺省的停留时间。

说明：
该成员函数实现了Win32宏ListView_GetHoverTime的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CListCtrl::SetHoverTime, CListCtrl::GetHotCursor


 CListCtrl::GetImageList

CImageList* GetImageList(int nImageList) const

返回值：
返回一个用于描绘列表视图项的图象列表的指针。

参数：
nImageList指定要获取的图象列表的值。它可以为下列值之一：
· | LVSIL_NORMAL | 有大图标的图象列表。
· | LVSIL_SMALL | 有小图标的图象列表。
· | LVSIL_STATE | 有状态图象的图象列表。

说明：获取用于描绘列表视图项的图象列表的句柄。

请参阅：CImageList, CListCtrl::SetImageList


 CListCtrl::GetItem

BOOL GetItem(LVITEM* pItem) const

返回值：如果成功，则返回非零值，否则为0。

参数：
pItem 返回一个指向接受项属性的LVITEM结构的指针。

说明：
获取某些或全部列表视图项的属性。
LVITEM结构指出或接受列表视图项的属性。

请参阅：CListCtrl::SetItem


 CListCtrl::GetItemCount

int GetItemCount()

返回值：列表视图控件中项的数目。

说明：获取列表视图控件项的数目。

请参阅：CListCtrl::SetItemCount, CListCtrl::GetSelectedCount


 CListCtrl::GetItemData

DWORD GetItemData(int nItem) const

返回值：与指定项相关的32位应用指定的值。

参数：
nItem 要获取数据的列表项的索引值。

说明：
该成员函数能够通过nItem来获取与指定项相关的32位应用指定的值。这个值是LVITEM结构中的lParam成员，如同联机文档“平台SDK”中所描述的。

请参阅：CListCtrl::SetItemData


 CListCtrl::GetItemPosition

BOOL GetItemPosition(int nItem,LPPOINT lpPoint) const

返回值：如果成功，则返回非零值，否则为0。

参数：
nItem | 要获取位置的项的索引值。
lpPoint | 在视图坐标中接受项左上角位置POINT结构的地址，按视图坐标。

说明：获取列表视图项的位置。

请参阅：CListCtrl::SetItemPosition, CListCtrl::GetOrigin


 CListCtrl::GetItemRect

BOOL GetItemRect(int nItem,LPRECT lpRect,UNIT nCode) const

返回值：如果成功，则返回非零值，否则为0。

参数：
nItem | 要获取位置的项的索引值。
lpRect | 接受绑定矩形的RECT结构的地址。
nCode要获取绑定矩形的列表视图项的部分。它可为下列值之一：
· | LVIR_BOUNDS | 返回整个项的绑定矩形，包括图标和标签。
· | LVIR_ICON | 返回图标或小图标的绑定矩形。
· | LVIR_LABEL | 返回项文本的绑定矩形。

说明：
在当前视图中获取某项的全部或部分的绑定矩形。

请参阅：
CListCtrl::GetItemPosition, CListCtrl::SetItemPosition, CListCtrl::GetOrigin


 CListCtrl::GetItemState

UNIT GetItemState(int nItem,UNIT nMask) const

返回值：指定列表视图项的状态标志。

参数：
nItem | 要获取的状态的项的索引值。
nMask | 被指定的要返回项的状态标志掩码。

说明：
获取列表视图项的状态。
项的状态被LVITEM结构的state成员所指定，如同联机文档“平台SDK”中所描述的。当指定或更改一个项的状态后，stateMask成员指定希望更改的状态位。

请参阅：CListCtrl::SetItemState, CListCtrl::GetItem


 CListCtrl::GetItemText

int GetItemText(int nItem,int nSubItem,LPTSTR lpszText,int nLen) const
CString GetItemText(int nItem,int nSubItem) const

返回值：
返回int的版本返回获取字符串的长度。
返回CString的版本返回项文本。

参数：
nItem | 要获取文本的项的索引值。
nSubItem | 指定要获取文本的子项。
lpszText | 指向接受项文本的字符串的指针。
nLen | 被lpszText 指定的缓冲区的长度。

说明：
获取列表视图项或子项的文本。如果nSubItem等于零，那么该函数将获取项标签，否则，它将获取子项的文本。对于子项参数的进一步讨论，请参阅联机文档“平台SDK”中有关LVITEM结构的讨论。

请参阅：CListCtrl::GetItem


 CListCtrl::GetNextItem

int GetNextItem(int nItem,int nFlags) const

返回值：
如果成功，则返回下一项的索引值，否则返回-1。

参数：
nItem 搜索开始项的索引。如果它等于-1，则从第一项开始匹配指定的标志。不过，指定项本身不包括在搜索范围之内。
nFlags所需项与指定项的位置关系，以及所需项的状态。这些位置关系为下列值之一：
· | LVNI_ABOVE | 在指定项之上查找某项。
· | LVNI_ALL | 通过索引（为缺省值）查找随后的项。
· | LVNI_BELOW | 在指定项之下查找某项。
· | LVNI_TOLEFT | 在指定项的左面查找某项。
· | LVNI_TORIGHT | 在指定项的右面查找某项。状态可以为零，也可以为下列值：
· | LVNI_DROPHILITED | 设置了LVIS_DROPHILITED状态标志的项。
· | LVNI_FOCUSED | 设置了LVIS_FOCUSED状态标志的项。
· | LVNI_SELECTED | 设置了LVIS_SELECTED状态标志的项。 如果项没有设置任何的状态标志，那么搜索将从下一项开始。

说明：
查找指定特性或查找与给定项有指定关系的列表视图项。

请参阅：CListCtrl::GetItem


 CListCtrl::GetNextSelectedItem

int GetNextSelectedItem(POSITION& pos) const

返回值：返回列表视图控件中被选择的下一项的索引值。

参数：
pos 通过前面调用GetNextSelectedItem函数或GetFirstSelectedItemPosition函数返回的POSITION值的参考。通过这次调用，它将更新为下一个位置值。

说明：
获得通过pos标识的列表项的索引，然后将pos设置为POSITION 值。如果已经通过调用GetFirstSelectedItemPosition函数得到了初始位置，那么可以在不断的循环中使用GetNextSelectedItem函数。
在此，必须确保POSITION值是有效的。否则，将插入Microsoft Foundation Class Library(Microsoft基础类库)的调试版的断言。

示例：下列代码演示了该函数的用法。
CListCtrl* pListCtrl=( CListCtrl* )GetDlgItem(IDC_YOURLISTCONTROL);
ASSERT(pListCtrl !=NULL)
POSITION pos=pList->GetFirstSelectedItemPosition();
if (pos==NULL) TRACE0("No items were selected!\n")
else
{
while (pos)
{
int nItem=pList->GetNextSelectedItem(pos);
TRACE1("Item %d was Selected!\n",nItem);
//you could do your own processing on nItem here
}
}

请参阅：
CImageList, CListCtrl::GetFirstSelectedItemPosition


 CListCtrl::GetNumberOfWorkAreas

UNIT GetNumberOfWorkAreas() const

返回值：此次返回值无用。

说明：
该成员函数实现了Win32宏ListView_GetNumberOfWorkArea的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CListCtrl::GetWorkAreas


 CListCtrl::GetOrigin

BOOL GetOrigin(LPPOINT lpPoint) const

返回值：
如果成功，则返回非零值，否则为0。不过在报表视图中，返回值总等于0。

参数：
lpPoint 接受视图原点的POINT结构的地址值。

说明：获取列表视图控件中当前视图的原点。

请参阅：
CListCtrl::GetItemPosition, CListCtrl::SetItemPosition


 CListCtrl::GetSelectedCount

UNIT GetSelectedCount() const

返回值：返回列表视图控件中被选择的项的数目。

说明：获取列表视图控件中被选择的项的数目。

请参阅：CListCtrl::SetItemCount, CListCtrl::GetItemCount


 CListCtrl::GetSelectionMark

int GetSelectionMark()

返回值：
返回以0为基数的选择标记，如果返回-1，则没有选择记号。

说明：
该成员函数实现了Win32宏ListView_GetSelectionMask的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CListCtrl::SetSelectionMark


 CListCtrl::GetStringWidth

int GetStringWidth(LPCTSTR lpsz) const

返回值：
通过参数lpsz指向的字符串的宽度，以像素为单位。

参数：
lpsz 已经确定了宽度且以空终止符的字符串的地址。

说明：
决定显示所有给定字符串所必须的最小列宽。
返回的宽度考虑了控件当前的字体和列边界，而没有小图标的宽度。

请参阅：CListCtrl::GetColumnWidth


 CListCtrl::GetSubItemRect

BOOL GetSubItemRect(int iItem, int iSubItem, int nArea, CRect& ref)

返回值：如果成功，则返回非零值，否则为0。

参数：
iItem | 子项的父项的索引值。
iSubItem | 以1为基数的子项的索引。
nArea决定要获取的列表视图子项的绑定矩形的部分。通过应用位或运算一个或多个下列值，以指定绑定矩形的部分（图表、标签或两者）：
· | LVIR_BOUNDS | 返回整个项的绑定矩形，包括图标和标签。
· | LVIR_ICON | 返回图标或小图标的绑定矩形。
· | LVIR_LABEL | 返回整个项的绑定矩形，包括图标和标签。它与LVIR_BOUNDS相同。
ref | 包含子项绑定矩形坐标的CRect对象的参考。

说明：
该成员函数实现了Win32宏ListView_GetSubItemRect的功能，如同联机文档“平台SDK”中所描述的。


 CListCtrl::GetTextBkColor

COLORREF GetTextBkColor() const

返回值：一个用于指定RGB颜色的32位值。

说明：获取列表视图控件的文本框的背景色。

请参阅：
CListCtrl::SetTextBkColor, CListCtrl::GetTextColor, COLORREF


 CListCtrl::GetTextColor

COLORREF GetTextColor() const

返回值：一个用于指定RGB颜色的32位值。

说明：获取列表视图控件的文本的颜色。

请参阅：
CListCtrl::SetTextColor, CListCtrl::GetTextBkColor, COLORREF


 CListCtrl::GetTopIndex

int GetTopIndex() const

返回值：最高可视项的索引。

说明：获取列表视图或报表视图中最高可视项的索引。

请参阅：CListCtrl::GetCountPerPage


 CListCtrl::GetViewRect

BOOL GetViewRect(LPRECT lpRect) const

返回值：如果成功，则返回非零值，否则为0。

参数：
lpRect RECT结构的地址。

说明：
获取列表视图控件中所有项的绑定矩形。列表视图必须位于图标视图或小图标视图。

请参阅：CListCtrl::GetTopIndex


 CListCtrl::GetWorkAreas

void GetWorkAreas(int nWorkAreas,LPRECT prc) const

参数：
nWorkAreasprc | 数组中的RECT结构的数目。
prc | 指向接受列表视图控件的工作区域的RECT结构（或CRect对象）的个数。这些结构的值按客户坐标计算。

说明：
该成员函数实现了Win32宏ListView_GetWorkArea的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CListCtrl::GetNumberOfWorkAreas


 CListCtrl::HitTest

int HitTest(LVHITTESTINFO* pHitTestInfo) const
int HitTest(CPoint pt,UINT* pFlags=NULL) const

返回值：
返回参数pHitTestInfo指定位置的项的索引，否则为-1。

参数：
pHitTestInfo | 含有要进行击中测试的位置以及接受击中测试有关结果信息的LVHITTESTINFO结构的地址。
pt | 被测试的指针。
pFlags | 指向接受测试结果信息的整数的指针。请参阅联机文档“平台SDK”中有关LVHITTESTINFO结构的flags成员的注解。

说明：
如果有，则决定哪一个列表视图项在指定的位置上。
可以通过使用结构中flags成员的LVHT_ABOVE, LVHT_BELOW,LVHT_TOLEFT以及LVHT_TORIGHT的值来决定是否滚动列表视图控件的内容。上述两种标志可以自由组合，例如，假设其位于客户区域的左上角。
可以通过测试结构中flags成员的LVHT_ONITEM值来决定是否给定的位置位于列表视图项的上方。该数值通过结构flags成员中的LVHT_ONITEMICON，LVHT_ONITEMLABEL,LVHT_ONITEMSTATEICON的值的位或运算而获取。

请参阅：CListCtrl::GetItemPosition


 CListCtrl::InsertColumn

int InsertColumn(int nCol,const LVCOLUMN* pColumn)
int InsertColumn(int nCol,
LPCTSTR lpszColumnHeading,
int nFormat = LVCFMT_LEFT,
int nWidth = -1,
int nSubItem = -1
)

返回值：如果成功，则返回新建列的索引值，否则为-1。

参数：
nCol | 新建列的索引值。
pColumn | 包含新建列属性的LVCOLUMN结构的地址。
lpszcolumnHeading | 包含列标题的字符串的地址。
nFormat | 指定列对齐方式的整数。它为下列值之一：LVCFMT_LEFT，LVCFMT_RIGHT或LVCFMT_CENTER。
nWidth | 以像素为单位的列宽。如果该参数为-1，那么没有设置列宽。
nSubItem | 与列相关联的子项的索引。如果该参数为-1，那么没有子项与列相关。

说明：
在列表视图控件中新插入一列。
LVCOLUMN结构包含了报表视图中列的属性。同时，它也用于接受有关列的信息。这一结构在联机文档“平台SDK”中有所描述。

请参阅：CListCtrl::DeleteColumn


 CListCtrl::InsertItem

int InsertItem(const LVITEM* pItem)
int InsertItem(int nItem,LPCTSTR lpszItem)
int InsertItem(int nItem, LPCTSTR lpszItem,int nImage)
int InsertItem(UINT nMask,
int nItem,
LPCTSTR lpszItem,
UINT nState,
UINT nStateMask,
int nImage,
LPARAM lParam
)

返回值：
如果成功，则返回新建列的索引值，否则为-1。

参数：
pItem | 指向指定项属性LVITEM结构的指针，如联机文档“平台SDK”中所述。
nItem | 被插入项的索引值。
lpszItem | 包含项标签的字符串的地址，或当项为回调项时，该变量为LPSTR_TEXT CALLBACK。要了解更多有关回调项的信息，请参阅CListCtrl::GetCall backMask.
nImage | 项图象的索引值，或当项为回调项时，该变量为I_IMAGECALLBACK。要了解更多有关回调项的信息，请参阅CListCtrl::GetCallbackMask
nMask | 参数nMask指定了哪个项属性作为参数传递是有效的。它可以是联机文档“平台SDK” 中LVITEM结构所描述的一个或多个掩码值。有效的数据能够通过位与运算来组合。
nState | 指示项的状态、状态图象及轮廓图象。请参阅联机文档“平台SDK”中的LVITEM来获取更多信息，并参阅有效标志列表中的列表视图项状态。
nStateMask | 指示状态成员中的哪一位将被获取或修改。请参阅联机文档“平台SDK”中的LVITEM来获取更多信息。
nImage | 图象列表之内项的图象的索引。
lParam | 与项相关联的应用指定的32位值。如果该参数被指定，那么必须设置nMask的属性为LVIF_PARAM。

说明：向列表视图控件中新插入一项。

请参阅：CListCtrl::DeleteItem, CListCtrl::DeleteAllItems


 CListCtrl::RedrawItems

BOOL RedrawItem(int nFirst,int nLast)

返回值：如果成功，则返回非零值，否则为0。

参数：
nFirst | 重新着色的第一项的索引。
nLast | 重新着色的最后一项的索引。

说明：
强迫列表视图控件重新着色某一范围的项。
实际上，直到列表视图窗口接受到WM_PAINT消息后，指定项才重新着色。如果需要立即重新着色，那么在使用该函数后请调用WindowsUpdateWindow函数。

请参阅：CListCtrl::DrawItem


 CListCtrl::Scroll

BOOL Scroll(CSize size)

返回值：如果成功，则返回非零值，否则为0。

参数：
size 以像素为单位，指定了水平或垂直滚动数量的CSize对象。size中y成员被按像素在垂直方向上分割成列表视图控件的水平线，并且，控件按水平线的条数来滚动。

说明：滚动列表视图控件中的内容。

请参阅：CListCtrl::EnsureVisible


 CListCtrl::SetBkColor

BOOL SetBkColor(COLORREF cr)

返回值：如果成功，则返回非零值，否则为0。

参数：
cr 要设置的背景色。若没有背景色，则为CLR_NONE。那些有背景色的列表视图控件重新为本身着色的速度显著快于没有背景色的。要了解更多信息，请参阅联机文档“平台SDK”中的COLORREF。

说明：为列表视图控件设置背景色。

请参阅：CListCtrl::GetBkColor


 CListCtrl::SetBkImage

BOOL SetBkImage(LVBKIMAGE* plvbkImage)
BOOL SetBkImage(HBITMAP hbm,BOOL fTile=TRUE,int xOffsetPercent=0,int yOffsetPercent=0)
BOOL SetBkImage(LPTSTR pszUrl,BOOL fTile=TRUE,int xOffsetPercent=0,int yOffsetPercent=0)

返回值：如果成功，则返回非零值，否则为0。

参数：
plvbkImage | LVBKIMAGE结构的地址，它包含新背景的图象信息。
hbm | 位图的句柄。
pszUrl | 以空字符为终止符，含有背景图象的URL的字符串。
fTile | 如果图象加入了列表视图控件的背景中，该参数为非零，否则为0。
xOffsetPercent | 以像素为单位，从列表视图控件的原点开始到图象左边界的位移。
yOffsetPercent | 以像素为单位，从列表视图控件的原点开始到图象顶端的位移。

说明：
调用该函数来设置列表视图控件的背景图象。

注意：
由于CListCtrl::SetBkImage利用了OLE的COM功能，因此在使用SetBkImage函数之前必须先进行OLE库的初始化。并且最好的方案是在应用开始后将COM库进行初始化，而当应用终止后不进行库的初始化。上述工作在MFC应用利用了ActiveX技术、OLE自动化、OLE连接与嵌入或ODBC/DAO操作后将自动完成。

请参阅：CListCtrl::GetBkImage


 CListCtrl::SetCallbackMask

BOOL SetCallbackMask(UINT nMask)

返回值：如果成功，则返回非零值，否则为0。

参数：
nMask 新的调用掩码值。

说明：设置列表视图控件的调用掩码。

请参阅：CListCtrl::GetCallbackMask


 CListCtrl::SetCheck

BOOL SetCheck(int nItem,BOOL fCheck=True)

返回值：如果成功，则返回非零值，否则为0。

参数：
nItem | 以0为基数的列表控件项的索引。
fCheck | 指定项的状态图象是否应当可视。缺省时，fCheck为TRUE，并且状态图象可视。否则，当fCheck为FALSE时，它不可视。

说明：
该成员函数决定了列表控件项的状态图象是否可视。

请参阅：CListCtrl::GetCheck


 CListCtrl::SetColumn

BOOL SetColumn(int nCol,const LVCOLUMN* pColumn)

返回值：如果成功，则返回非零值，否则为0。

参数：
nCol | 要设置属性的列的索引值。
pColumn | 包含新列属性的LVCOLUMN结构的地址，如联机文档“平台SDK” 中所述。该结构的mask成员指定了要设置属性的列。如果mask成员指定为LVCF_TEXT值，那么该结构的pszText成员则为以空字符为终止符的字符串，并且该结构的cchTextMax成员将被忽略。

说明：设置列表视图列的属性。

请参阅：CListCtrl::GetColumn


 CListCtrl::SetColumnOrderArray

BOOL SetColumnOrderArray(int iCount,LPINT piArray)

返回值：如果成功，则返回非零值，否则为0。

参数：
piArray | 指向包含列表视图控件中列索引值的缓冲区的指针（从左到右），该缓冲区必须有足够的空间，足以容纳列表视图控件中列的总数。
iCount | 列表视图控件中列的总数。

说明：
该成员函数实现了Win32宏ListView_SetColumnOrderArray的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CListCtrl::GetColumnOrderArray


 CListCtrl::SetColumnWidth

BOOL SetColumnWidth(int nCol,int cx)

返回值：如果成功，则返回非零值，否则为0。

参数：
nCol | 要设定宽度的列的索引。在列表视图中，该参数必须等于-1。
cx | 列的新宽度值。既可以为LVSCW_AUTOSIZE，也可以为LVSCW_AUTO SIZE_USE_HEADER，如同联机文档“平台SDK”中描述的LVM_SETCOLU MNWIDTH函数。

说明：改变报表视图或列表视图中的列宽。

请参阅：CListCtrl::GetColumnWidth, CListCtrl::GetStringWidth


 CListCtrl::SetExtendedStyle

DWORD SetExtendedStyle(DWORD dwNewStyle)

返回值：
返回列表视图控件使用的以前扩展风格的组合。

参数：
dwNewStyle 列表视图控件使用的扩展风格的组合。若希望进一步了解这些风格，请参阅联机文档“平台SDK”中的“扩展列表视图风格”

说明：
该成员函数实现了Win32宏ListView_SetExtentedListViewStyle的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CListCtrl::GetExtendedStyle


 CListCtrl::SetHotCursor

HCURSOR SetHotCursor(HCURSOR hc)

返回值：
返回以前的列表视图控件使用的热图标资源的句柄。

参数：
hc 用于替换热图标的图标资源的句柄。

说明：
该成员函数实现了Win32宏ListView_SetHotCursor的功能，如同联机文档“平台SDK”中所描述的。
热图标，仅仅在能进行逗留选择时可视，它在图标经过任何列表视图项的时候出现。逗留选择是通过设置LVS_EX_TRACKSELECT 扩展风格来实现的。

请参阅：CListCtrl::GetHotCursor, CListCtrl::GetHotItem


 CListCtrl::SetHotItem

int SetHotItem(int iIndex)

返回值：返回以0为基数的以前热项的索引值。

参数：
iIndex 以0为基数的要作为热项设置的项的索引。

说明：
该成员函数实现了Win32宏ListView_SetHotItem的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CListCtrl::GetHotCursor, CListCtrl::GetHotItem


 CListCtrl::SetHoverTime

DWORD SetHoverTime(DWORD dwHoverTime = (DWORD)-1))

返回值：返回上次逗留的毫秒数。

参数：
dwHoverTime 鼠标指针在能够进行选择前必须停留在某项的延迟毫秒数。如果使用的是缺省值，那么将设置为缺省的逗留时间。

说明：
该成员函数实现了Win32宏ListView_SetHotHover的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CListCtrl::GetHoverTime


 CListCtrl::SetIconSpacing

CSize SetIconSpacing(int cx,int cy)
CSize SetIconSpacing(CSize size)

返回值：
返回含有图标间隔的前一个值的CSize对象。

参数：
cx | 图标在x轴上的距离，以像素为单位。
cy | 图标在y轴上的距离，以像素为单位。
size | 在x和y轴中指定以像素为单位的图标间距的CSize对象。

说明：
该成员函数实现了Win32宏ListView_SetIconSpacing的功能，如同联机文档“平台SDK”中所描述的。


 CListCtrl::SetImageList

CImageList SetImageList(CImageList* pImageList, int nImageList)

返回值：返回指向上一个图象列表的指针。

参数：
pImageList 指向要设定的图象列表的指针。
nImageList图象列表的类型。它可为下列值之一：
· | LVSIL_NORMAL | 有大图标的图象列表。
· | LVSIL_SMALL | 有小图标的图象列表。
· | LVSIL_STATE | 有状态图象的图象列表。

说明：设定列表视图控件的图象列表。

请参阅：CImageList, CListCtrl::GetImageList


 CListCtrl::SetItem

BOOL SetItem(const LVITEM* pItem)
BOOL SetItem(int nItem,
int nSubItem,
UINT nMask,
LPCTSTR lpszItem,
int nImage,
UINT nState,
UINT nStateMask,
LPARAM lParam
)

返回值：如果成功，则返回非零值，否则为0。

参数：
pItem | 含有新项属性的LVITEM结构的地址，如联机文档“平台SDK”中所述。该结构的iItem及iSubItem成员标识了项及子项，而该结构的mask成员则指定了要设定的属性。如果希望得到mask成员的更多信息，请参阅说明。
nItem | 要设定属性的项的索引值。
nSubItem | 要设定属性的子项的索引值。
nMask | 指定设定哪种属性（请参阅说明）。
lpszItem | 指定了项标签的以空字符为终止符的字符串的地址。
nImage | 图象列表内项图象的索引值
nState | 为要修改的状态指定值（请参阅说明）。
nStateMask | 指定要修改为那种状态（请参阅说明）。
nImage | 图象列表之内项的图象的索引。
lParam | 与项相关联的应用指定的32位值。

说明：
设定某些或所有列表视图项的属性。
LVITEM结构中的iItem和iSubItem成员及参数nItem和nSubItem标识了要设定属性的项和子项。
LVITEM结构中的mask成员及参数nMask指定了要设定的项属性：
· | LVIF_TEXT | pszText成员或参数lpszItem是以空字符为终止的字符串的地址，而cchTextMax成员则被忽略。
· | LVIF_STATE | stateMask成员或参数nStateMask指定了要改变项的状态，而state成员或参数nState则包含了这些状态的值。

请参阅：CListCtrl::GetItem


 CListCtrl::SetItemCount

void SetItemCount(int iCount)

参数：
nItems 控件最终包含项的个数。

说明：
该成员函数实现了Win32宏ListView_SetItemCount的功能，如同联机文档“平台SDK”中所描述的。
要设置有效的列表视图控件的项数，请参阅SetItemCountEx。

请参阅：
CListCtrl::GetItemCount, CListCtrl::GetSelectedCount


 CListCtrl::SetItemCountEx

void SetItemCountEx(int iCount,DWORD dwFlags = LVSICF_NOINVALIDATEALL)

参数：
nItem 控件最终包含项的个数。
dwFlags重新设定项数后指定列表视图控件的行为。该值为下列值的组合：
· | LVSICF_NOINVALIDATEALL | 直到受影响的项为当前项时，列表视图控件才重新刷新。该值为缺省值。
· | LVSICF_NOSCROLL | 当项的个数改变后，列表视图控件将不改变滚动位置。

说明：
该成员函数实现了Win32宏ListView_SetIconCountEx的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CListCtrl::SetItemCount


 CListCtrl::SetItemData

BOOL SetItemData(int nItem,DWORD dwData)

返回值：如果成功，则返回非零值，否则为0。

参数：
nItem | 要设定数据的列表项的索引。
dwData | 与项相关联的32位值。

说明：
该成员函数能够通过nItem来获取与指定项相关的32位应用指定的值。这个值与联机文档“平台SDK”中所描述的LVITEM结构中的lParam成员相同。

请参阅：CListCtrl::GetItemData


 CListCtrl::SetItemPosition

BOOL SetItemPosition(int nItem,POINT pt)

返回值：如果成功，则返回非零值，否则为0。

参数：
nItem | 要设定位置项的索引。
pt | 在视图坐标中指定项左上角新位置的POINT结构值。

说明：
在列表视图控件中将项移动到指定的位置，并且该控件必须位于图标或小图标视图中。
如果列表视图控件拥有LVS_AUTOARRANGE风格，那么列表视图在设定了项的位置后将重新排列。

请参阅：
CListCtrl::GetItemPosition, CListCtrl::GetOrigin


 CListCtrl::SetItemState

BOOL SetItemState(int nItem, LVITEM* pItem)
BOOL SetItemState(int nItem, UINT nState, UINT nMask)

返回值：
如果成功，则返回非零值，否则为0。

参数：
nItem | 要设定状态项的索引。
pItem | LVITEM结构的地址，如联机文档“平台SDK”中所述。该结构的stateMask成员指定了要改变的状态位，并且state成员则包含这些位的新值。另一个成员则被忽略。
nState | 状态位的新值。
nMask | 指定要改变状态位的掩码。

说明：
改变列表视图控件中项的状态。
项的“状态”指指定项有效位的数值，它指示了用户的动作，或其它影响项状态的行为。列表视图控件改变了某些状态位，就如同用户选择了某一项。为了使项失效或隐藏项，或者为了指定覆盖图或状态图，应用必须改变其它的状态位。

请参阅：CListCtrl::GetItemState


 CListCtrl::SetItemText

BOOL SetItemText(int nItem,int nSubItem,LPTSTR lpszText)

返回值：如果成功，则返回非零值，否则为0。

参数：
nItem | 要设定文本项的索引值。
nSubItem | 子项的索引，若为零，则设置项标签。
lpszText | 指向包含新项文本字符串的指针。

说明：改变列表视图项或子项的文本。

请参阅：CListCtrl::GetItemText


 CListCtrl::SetSelectionMark

int SetSelectionMark(int iIndex)

返回值：
返回以前的选择标志，如果没有选择标志,则返回-1。

参数：
iIndex 以0为基数的多项选择第一项的索引。

说明：
该成员函数指出了Win32宏的行为，如同联机文档撈教⊿DK斨兴枋龅腖istView_SetSelectionMark函数。

请参阅：CListCtrl::GetSelectionMark


 CListCtrl::SetTextBkColor

BOOL SetTextBkColor(COLORREF cr)

返回值：如果成功，则返回非零值，否则为0。

参数：
cr 指定新的文本背景色的COLORREF值。要了解更多有关信息，请参阅联机文档“平台SDK”中的COLORREF部分。

说明：设置列表视图控件中文本的背景色。

请参阅：CListCtrl::GetTextBkColor


 CListCtrl::SetTextColor

BOOL SetTextColor(COLORREF cr)

返回值：如果成功，则返回非零值，否则为0。

参数：
cr 指定新的文本前景色的COLORREF值。要了解更多有关信息，请参阅联机文档“平台SDK”中的COLORREF部分。

说明：设置列表视图控件中文本的前景色。

请参阅：CListCtrl::SetTextBkColor


 CListCtrl::SetWorkAreas

void SetWorkAreas(int nWorkAreas,LPRECT lpRect)

参数：
nWorkAreas | 在数组中通过lpRect指定的RECT结构或CRect对象的数目。
lpRect | 在列表视图控件中指定新工作范围的RECT结构或CRect对象的地址。这些范围必须在客户坐标中指定。如果该参数为空，那么工作范围必须设置为控件的工作范围。

说明：
该成员函数实现了Win32宏ListView_SetWorkArea的功能，如同联机文档“平台SDK”中所描述的。


 CListCtrl::SortItems

BOOL SortItems(PFNLVCOMPARE pfnCompare,DWORD dwData)

返回值：
如果成功，则返回非零值，否则为0。

参数：
pfnCompare | 应用定义的比较函数的地址。当需要比较两个列表项的相互关系而进行排序操作时，则调用比较函数。比较函数要么是类的静态成员，要么是不属于任何类的独立函数。
dwData | 应用定义的、传递给比较函数的值。

说明：
使用应用定义的比较函数对列表视图项进行排序。为了影响新的次序，每一项的索引需要做一些改变。
比较函数有下列形式：
int CALLBACK CompareFunc(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort);
如果第一项在第二项之前，则返回一个负值；若第一项在第二项之后，则返回一个正值；如果两者等价；则返回零。
参数lParam1和lParam2指定了要进行比较的两项的数据，而参数lParamSort与dwData值相同。

请参阅：CListCtrl::FindItem


 CListCtrl::SubItemHitTest

int SubItemHitTest(LPLVHITTESTINFO pInfo)

返回值：
返回以0为基数的被测试（如果进行了）的项或子项的索引值，否则为-1。

参数：
pInfo 一个指向LPLVHITTESTINFO结构的指针。

说明：
该成员函数实现了Win32宏ListView_SubItemHitTest的功能，如同联机文档“平台SDK”中所描述的。


 CListCtrl::Update

BOOL Update(int nItem)

返回值：如果成功，则返回非零值，否则为0。

参数：
nItem 更新项的索引值。

说明：
该成员函数能够通过nItem强制列表视图控件将项重新刷新。如果列表视图控件有LVS_AUTOARRANGE风格，那么该函数也将对列表视图控件进行重新排列。

请参阅：CListCtrl::DrawItem


 CListView

CObject
└CCmdTarget
└CWnd
└CView
└CCtrlView
└CListView

CListView类简化了列表控件和CListCtrl的使用。CListCtrl类按照MFC文档或视图结构封装了列表控件的功能。如果要了解这些结构的更多信息，请参阅CView类的概述及交叉参考。
#include <afxview.h>
请参阅：CCtrlView

CListView类成员

构造函数
CListView 构造一个CListView对象

属性
CListCtrl 返回与视图相关联的列表控件


 CListView::CListView

CListView()

说明：构造一个CListView对象。


 CListView::GetListCtrl

CListCtrl& GetListCtrl() const

返回值：
返回与视图相关联的列表控件的参考。

说明：
调用该成员函数来获取与视图相关联的列表控件的参考。

请参阅：CListCtrl


 CLongBinary

CObject
└CLongBinary

CLongBinary类简化了数据库中较大二进位数据对象的工作（譬如经常调用BLOB或“二进位大对象”）。例如，在SQL表中一个记录字段可能包含了代表图形的位图。CLongBinary对象存储了这种对象，并记录了它的大小。
注意：
通常现在更好的办法是使用CByteBinary来与DFX_Binary联系。仍旧可以使用CLongBinary，但是既然不再遇到16位CByteBinary所受到的大小限制，所以CByteBinary提供了Win32下更多的功能。该建议应用于Data Access对象编程，或开放数据库连接（ODBC）。为了使用CLongBinary对象，需要在记录集类中声明CLongBinary类型的字段数据成员。该成员为记录集中被嵌入的成员，并且构造在记录集构造完成后。当CLongBinary对象构造完成后，记录字段交换（RFX）机制从数据资源中当前记录的字段中装入数据对象，并当记录更新后将其存储到记录中。RFX需要二进位大对象的数据资源（如CLongBinary对象的m_hData数据成员）并在m_hData数据中存储HGLOBAL的句柄。而且，RFX也在m_dwDataLength数据成员中存储了数据对象的实际大小。通过m_hData操作对象中的数据，利用了通常使用的相同的技术，操作存储在Windows HGLOBAL句柄中的数据。
当记录集遭到销毁，嵌入的CLongBinary对象也遭到销毁，并且它的析构函数释放了HGLOBAL的数据句柄。
如果要了解大对象或CLongBinary对象的使用说明，请参阅联机文档“Visual C++程序员指南”中的”记录集（ODBC）”及“记录集：处理大数据项（ODBC）”
#include <afxdb.h>
请参阅：CRecordSet

CLongBinary类成员

数据成员
m_dwDataLength | 包含以字节为单位的数据对象的实际大小，其句柄存储在m_hData中
m_hData | 含有实际图象对象的Windows HGLOBAL句柄

构造函数
CLongBinary 构造一个CLongBinary对象


 CLongBinary::CLongBinary

CLongBinary( );

说明：构造一个CLongBinary对象。


 CLongBinary::m_dwDataLength

说明：
存储以字节为单位的存储在m_hData的HGLOBAL句柄中数据的实际大小。该值可能比分配给该数据的内存块小。调用::GlobalSize 来获取分配值的大小。


 CLongBinary::m_hData

说明：
存储实际的二进位大对象数据的Windows HGLOBAL句柄。


 CMap

CObject
└CMap

template <class KEY,class ARG_KEY,class VALUE, class ARG_VALUE> class CMap:public CObject

参数：
KEY | 对象的类，用作映射的关键码。
ARG_KEY | 参数KEY使用的数据类型，通常为KEY的参考。
VALUE | 存储在映射中对象的类。
ARG_VALUE | 参数VALUE使用的数据类型，通常为VALUE的参考。

说明：
CMap是把唯一关键码映射到值的字典收集类。一旦在映射中插入了一个关键码值对（元素），就可以使用这些关键码，有效地获取或删除对。同样，也可以反复使用映射中的所有元素。
POSITION类型变量用于替换所有映射变量的入口。可以使用POSITION来“记忆”入口和映射中的遍历。可能认为这种遍历是通过关键码值来依次进行的，但其实不是。获取元素的次序没有确定。
该类的某些成员函数调用了全局的帮助函数，它们必须定制，以满足CMap类的更多用途。请参阅“Microsoft Visual C++ MFC库参考”中的“宏和全局”部分中的“收集类帮助程序”。
CMap引入了宏IMPLEMENT_SERIAL，支持其元素的串行化和转储。如果映射存储到档案文件中，那么每一元素都可利用加载插入（<<）操作符或Serialize成员函数来依次进行串行化。如果要了解有关在映射中进行个别元素的诊断转储，那么转储内容的深度必须为1或更大。当CMap对象删除或其元素被删除，那么关键码和值都将被删除。映射类的派生与列表的派生相似。请参阅联机文档“Visual C++程序员指南”中的“收集”部分，以进一步了解特殊用途的列表类的派生。
#include <afxtempl.h>

CMap类的成员

构造函数
CMap 构造一个映射关键码为值的收集

操作符
Lookup | 查找与指定关键码对应的值
SetAt | 在映射中插入一个元素，但假如发现了相匹配的关键码，则替换已经存在的元素
operator [] | 在映射中插入一个元素，它是代替SetAt的操作符
RemoveKey | 删除关键码指定的元素
RemoveAll | 删除映射中所有的元素
GetStartPosition | 返回第一个元素的位置
GetNextAssoc | 获取循环中下一个元素
GetHashTableSize | 返回散列表的大小（元素的个数）
InitHashTable | 初始化散列表，并指定其大小

状态
GetCount | 返回映射中元素的个数
IsEmpty | 测试是否为空映射（即没有元素）


 CMap::CMap

CMap(int nBlockSize = 10);

参数：
nBlockSize 为扩展映射而指定的内存分配粒度。

说明：
构造一个空映射。当增大映射时，按照nBlockSize的单位分配内存。


 CMap::GetCount

int GetCount() const

返回值：返回元素的个数。

说明：调用该成员函数来获取映射中元素的个数。

请参阅：CMap::IsEmpty


 CMap::GetHashTableSize

UINT GetHashTableSize() const

返回值：返回散列表中元素的个数。

说明：
调用该成员函数决定映射散列表中的元素个数。

请参阅：CMap::InitHashTable


 CMap::GetNextAssoc

void GetNextAssoc(POSITION& rNextPosition, KEY& rKey, VALUE& rValue) const

参数：
rNextPosition | 指定一个以前GetNextAssoc或GetStartPosition调用返回的POSITION值的参考。
KEY | 指定映射关键码类型的模板参数。
rKey | 指定被获取元素返回的关键码。
VALUE | 指定映射值的类型的模板参数。
rValue | 指定要获取元素的返回值。

说明：
获取rNextPosition位置的映射元素，然后将rNextPosition更新为映射中新的元素。该函数在遍历映射中所有元素时非常重要。
如果获取的元素为映射的最后一项，那么rNextPosition的新值将设置为零。

请参阅：CMap::GetStartPosition


 CMap::GetStartPosition

POSITION GetStartPosition() const

返回值：
返回一个指示映射遍历起始位置的POSITION值，如果映射为空，则返回NULL。

说明：
通过返回一个可传递给GetNextAssoc调用的POSITION值来进行映射遍历。遍历的次序不可预料，因此“映射中的第一项”没有特别的标记。

请参阅：CMap::GetNextAssoc


 CMap::InitHashTable

void InitHashTable(UINT hashSize)

参数：
hashSize 散列表的入口数。

说明：
初始化散列表。对于获得最佳的运行效率，散列表的大小应当是一个主要的数值。为了减少冲突，它的大小应当比最大的估计值大20%左右。

请参阅：CMap::GetHashTableSize


 CMap::IsEmpty

BOOL IsEmpty() const

返回值：
如果映射不含元素，则返回非零值，否则为0。

说明：
调用该函数来确定映射是否为空。示例请参阅CMapStringToOB::RemoveAll的示例。

请参阅：CMap::GetCount


 CMap::Lookup

BOOL Lookup(ARG_KEY key, VALUE& rValue) const

返回值：
如果发现了元素，则返回非零值，否则为0。

参数：
ARG_KEY | 指定关键码值类型的模板参数。
key | 指定标识要查找元素的关键码。
VALUE | 指定要查找值的类型。
rValue | 接受要查找的值。

说明：
Lookup使用了一个散列算法迅速查找关键码与给定关键码恰好匹配映射元素。

请参阅：CMap::operator []


 CMap::RemoveAll

void RemoveAll()

说明：
通过调用全局帮助器函数DestructElements，清除映射中所有的值。
假如映射已经为空，那么该函数正常运行。

请参阅：CMap::RemoveKey, DestructElements


 CMap::RemoveKey

BOOL RemoveKey(ARG_KEY key)

返回值：
如果发现了入口并成功地删除，则返回非零值，否则为0。

参数：
ARG_KEY | 指定关键码值类型的模板参数。
key | 希望被删除元素的关键码。

说明：
查找与提供的关键码对应的映射入口，并在发现该关键码后，删除该入口。

请参阅：CMap::RemoveAll


 CMap::SetAt

void SetAt(ARG_KEY key, ARG_VALUE newValue)

参数：
ARG_KEY | 指定参数key类型的模板参数。
key | 指定新元素的关键码。
ARG_VALUE | 指定参数newValue类型的模板参数。
newValue | 指定新元素的值。

说明：
主要的用途是在映射中插入一个元素。首先，查找关键码，如果发现了该关键码，然后改变对应的值；否则，将创建新的关键码值对。

请参阅：CMap::Lookup, CMap::operator []


 CMap::operator []

VALUE& operator [](ARG_KEY key)

参数：
VALUE | 指定映射值类型的模板参数。
ARG_KEY | 指定参数key类型的模板参数。
key | 用于从映射中获取值的关键码。

说明：
该操作符为SetAt成员函数非常便利的替代。这样，它仅仅用于分配声明的左边（为左值）。如果没有指定关键码的映射元素，那么则创建一个新元素。
没有与该操作符等价的右边值（右值），其原因是在映射中非常可能找不到某个关键码。一般使用Lookup成员函数来查找要获取的元素。

请参阅：CMap::SetAt, CMap::Lookup


 CMapPtrToPtr

CObject
└CMapPtrToPtr

CMapPtrToPtr类支持空指针为关键码的空指针映射。
CMapPtrToPtr的成员函数与CMapStringToOb类的成员函数相似。由于这种相似性，因此可以为指定的成员函数使用CMapStringToOb参考。不管是否将CObject指针看作函数参数，还是返回值，它都会将指针替换为空值。另外，不管是否将一个指向字符的CString指针或常数指针看作函数参数，还是返回值，它都会将指针替换为空值。
BOOL CMapStringToOb::Lookup( const char* <key>, CObject*& <rValue> ) const;
例如, 它可以转换为：
BOOL CMapPtrToPtr::Lookup( void* <key>, void*& <rValue> ) const;
CMapPtrToPtr 引入了宏IMPLEMENT_DYNAMIC来支持运行状态类型的访问，并将其转储为CDumpContext对象。如果需要实现个别映射元素（指针值）的转储，那么必须将转储文本的深度设置为1或更大。指针对指针的映射不可串行化。
当CMapPtrToPtr对象或其元素被删除，那么仅仅是其指针被删除，而它们参考的入口不会被删除。
如果要了解有关CMapPtrToPtr的更多信息，请参阅联机文档“Visual C++程序员指南”中的“收集”。
#include <afxcoll.h>

CMapPtrToPtrl类的成员

构造函数
CMapPtrToPtr 构造一个指向空指针的映射空指针的收集

操作
Lookup | 查找建立在空指针关键码基础上空指针。指针值，而不是它指向的实体，被用于进行关键码比较
SetAt | 在映射中插入一个元素，但假如发现了相匹配的关键码，则替换已经存在的元素
operator [] | 在映射中插入一个元素，它是代替SetAt的操作
RemoveKey | 删除关键码指定的元素
RemoveAll | 删除映射中所有的元素
GetStartPosition | 返回第一个元素的位置
GetNextAssoc | 获取循环中下一个元素

状态
GetCount | 返回映射中元素的个数
IsEmpty | 测试是否为空映射（即没有元素）


 CMapPtrToWord

CObject
└CMapPtrToWord

CMapPtrToWord类支持空指针为关键码的16位字的映射。
CMapPtrToWord的成员函数与CMapStringToOb类的成员函数相似。由于这种相似性，因此可以为指定的成员函数使用CMapStringToOb参考。不管是否将CObject指针看作函数参数，还是返回值，它都会将其替换为WORD。另外，不管是否将一个指向字符的CString指针或常数指针看作函数参数，还是返回值，它都会将指针替换为空值。
BOOL CMapStringToOb::Lookup( const char* <key>, CObject*& <rValue> ) const;
例如,它可以转换为：
BOOL CMapPtrToWord::Lookup( const void* <key>, WORD& <rValue> ) const;
CMapWordToPtr引入了宏IMPLEMENT_DYNAMIC来支持运行状态类型的访问，并将其转储为CDumpContext对象。如果需要实现个别映射元素（指针值）的转储，那么必须将转储文本的深度设置为1或更大。指针对字的映射不可串行化。
当CMapPtrToWord对象或其元素被删除，那么仅仅是其指针及对应的字被删除，而关键指针参考的入口不会被删除。
如果要了解有关CMapPtrToWord的更多信息，请参阅联机文档“Visual C++程序员指南”中的“收集”。
#include <afxcoll.h>

CMapPtrToWord类的成员

构造函数
CMapPtrToWord 构造一个指向16位字的映射空指针的收集

操作
Lookup | 返回一个使用空指针作为关键码的WORD值。指针值，而不是它指向的实体，被用于进行关键码比较
SetAt | 在映射中插入一个元素，但假如发现了相匹配的关键码，则替换已经存在的元素
operator [] | 在映射中插入一个元素，它是代替SetAt的操作
RemoveKey | 删除关键码指定的元素
RemoveAll | 删除映射中所有的元素
GetStartPosition | 返回第一个元素的位置
GetNextAssoc | 获取循环中下一个元素

状态
GetCount | 返回映射中元素的个数
IsEmpty | 测试是否为空映射（即没有元素）


 CMapStringToOb

CObject
└CMapStringToOb

CMapStringToOb是将唯一的CString对象映射为CObject指针的一个字典类。一旦在映射中插入一个CString-CObject* 对或元素，那么可以有效地获取或删除使用字符串或CString值作为关键码的对。同时，也可以在映射中遍历所有元素。
POSITION类型变量用于替换所有映射变量的入口。可以使用POSITION来“记忆”入口后遍历映射。可能认为这种遍历是通过关键码值来依次进行的，但实际不是。
获取元素的次序没有确定。CMapStringToOb引入了宏IMPLEMENT_SERIAL，来支持其元素的串行化和转储。如果映射存储到档案文件中，那么每一元素都可利用加载插入（<<）操作符或Serialize成员函数来依次进行串行化。
如果要了解有关在映射中进行个别元素的诊断转储（CString值或CObject内容），那么转储内容的深度必须为1或更大。
当CMapStringToOb对象或其元素被删除，那么CString值或CObject指针将被删除，而CObject指针参考的对象则不会被销毁。
映射类的派生与列表的派生相似。请参阅联机文档“Visual C++程序员指南”中的“收集”部分，以进一步了解指定用途的列表类的派生。
下列是同CMapStringToOb类成员函数较相似类：
· | CMapPtrToPtr
· | CMapPtrToWord
· | CMapStringToPtr
· | CMapStringToString
· | CMapWordToOb
· | CMapWordToPtr

#include <afxcoll.h>

请参阅：
CMapPtrToPtr, CMapPtrToWord, CMapStringToPtr, CMapStringToString, CMapWordToOb, CMapWordToPtr

CMapStringToOb类的成员

构造函数
CMapStringToOb 构造一个将CObject值映射为CObject指针的收集

操作
Lookup | 返回一个建立在CString值基础上的CObject指针
SetAt | 在映射中插入一个元素，但假如发现了相匹配的关键码，则替换已经存在的元素
operator [] | 在映射中插入一个元素，它是代替SetAt的操作
RemoveKey | 删除关键码指定的元素
RemoveAll | 删除映射中所有的元素
GetStartPosition | 返回第一个元素的位置
GetNextAssoc | 获取循环中下一个元素

状态
GetCount | 返回映射中元素的个数
IsEmpty | 测试是否为空映射（即没有元素）


 CMapStringToOb::CMapStringToOb

CMapStringToOb( int nBlockSize = 10 );

参数：
nBlockSize 为扩展映射而指定的内存分配粒度。

说明：
构造一个空CString-to-CObject* 映射。当映射增大后，内存按nBlockSize入口的单位来进行分配。

示例：
// example for CMapStringToOb::CMapStringToOb
CMapStringToOb map(20); // Map on the stack with blocksize of 20
CMapStringToOb* pm = new CMapStringToOb; // Map on the heap with default blocksize

请参阅：CObList::CObList,了解所有收集示例中使用的CAge类。


 CMapStringToOb::GetCount

int GetCount( ) const;

返回值：返回映射中元素的个数。

说明：
调用该成员函数来确定映射中有多少个元素。

示例：
请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
// example for CMapStringToOb::GetCount
CMapStringToOb map;
map.SetAt( "Bart", new CAge( 13 ) );
map.SetAt( "Homer", new CAge( 36 ) );
ASSERT( map.GetCount() == 2 );

请参阅：CMapStringToOb::IsEmpty


 CMapStringToOb::GetNextAssoc

void GetNextAssoc( POSITION& rNextPosition, CString& rKey, CObject*& rValue ) const;

参数：
rNextPosition | 指定一个以前GetNextAssoc或GetStartPosition函数调用返回的POSITION值的参考。
rKey | 指定被获取元素（字符串）的返回关键码。
rValue | 指定要获取元素（CObject指针）的返回值，请参阅说明以获取该参数的更多信息。

说明：
获取rNextPosition位置的映射元素，然后将rNextPosition更新为映射中新的元素。该函数在遍历映射中所有元素时非常重要。值得注意的是位置次序与关键码值次序不必相同。
如果获取的元素为映射的最后一项，那么rNextPosition的新值将设置为零。
对于参数rValue，要确保将对象类型设置为CObject*&形式，这是编译器所需要的，如下面例子所示：
CMyObject* ob;
map.GetNextAssoc(pos, key, (CObject* &)ob);
这并不是根据模板建立的映射中GetNextAssoc的真实结果。

示例：
请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
//example for CMapStringToOb::GetNextAssoc and CMapStringToOb::GetStartPosition
CMapStringToOb map;
POSITION pos;
CString key;
CAge* pa;

map.SetAt( "Bart", new CAge( 13 ) );
map.SetAt( "Lisa", new CAge( 11 ) );
map.SetAt( "Homer", new CAge( 36 ) );
map.SetAt( "Marge", new CAge( 35 ) );
// Iterate through the entire map, dumping both name and age.
for( pos = map.GetStartPosition(); pos != NULL; )
{
map.GetNextAssoc( pos, key, (CObject*&)pa );
#ifdef _DEBUG
afxDump << key << " : " << pa << "\n";
#endif
}

该程序的运行结果如下：
Lisa : a CAge at $4724 11
Marge : a CAge at $47A8 35
Homer : a CAge at $4766 36
Bart : a CAge at $45D4 13

请参阅：CMapStringToOb::GetStartPosition


 CMapStringToOb::GetStartPosition

POSITION GetStartPosition( ) const;

返回值：
返回指示遍历映射起始位置的POSITION位置，如果映射为空，则返回NULL。

说明：
通过返回一个可传递给GetNextAssoc调用的POSITION值来开始进行映射遍历。遍历的次序不可预料，因此“映射中的第一项”没有特别的标记。


 CMapStringToOb::IsEmpty

BOOL IsEmpty( ) const;

返回值：
如果映射不含元素，则返回非零值，否则为0。

说明：调用该函数来确定映射是否为空。

示例：请参阅RemoveAll的示例。


 CMapStringToOb::Lookup

BOOL Lookup( LPCTSTR key, CObject*& rValue ) const;

返回值：
如果发现了元素，则返回非零值，否则为0。

参数：
key | 指定标识要查找元素的关键码。
rValue | 指定被查找元素的返回值。

说明：
Lookup使用了一个散列算法迅速查找关键码与给定关键码(CString值)恰好匹配的映射元素。

示例：
请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
// example for CMapStringToOb::LookUp
CMapStringToOb map;
CAge* pa;
map.SetAt( "Bart", new CAge( 13 ) );
map.SetAt( "Lisa", new CAge( 11 ) );
map.SetAt( "Homer", new CAge( 36 ) );
map.SetAt( "Marge", new CAge( 35 ) );
ASSERT( map.Lookup( "Lisa", ( CObject*& ) pa ) ); // Is "Lisa" in the map?
ASSERT( *pa == CAge( 11 ) ); // Is she 11?

请参阅：CMapStringToOb::operator []


 CMapStringToOb::RemoveAll

void RemoveAll( );

说明：
删除映射中所有的元素，并销毁CString键对象。不过，每一个键参考的CObject对象不会被销毁。如果没有确保已经销毁了CObject对象，那么RemoveAll函数可能导致内存出现空洞。
如果映射为空，该函数也会正确运行。

示例：
请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
// example for CMapStringToOb::RemoveAll
{
CMapStringToOb map;
CAge age1( 13 ); // Two objects on the stack
CAge age2( 36 );
map.SetAt( "Bart", &age1 );
map.SetAt( "Homer", &age2 );
ASSERT( map.GetCount() == 2 );
map.RemoveAll(); // CObject pointers removed; objects not removed.
ASSERT( map.GetCount() == 0 );
ASSERT( map.IsEmpty() );
} // The two CAge objects are deleted when they go out of scope.

请参阅：CMapStringToOb::RemoveKey


 CMapStringToOb::RemoveKey

BOOL RemoveKey( LPCTSTR key );

返回值：
如果发现了入口并成功地删除，则返回非零值，否则为0。

参数：
key 指定用于查找映射的字符串。

说明：
查找与提供的关键码对应的映射入口，并在发现该关键码后，删除该入口。如果没有在别处删除CObject对象，那么可能导致内存出现空洞。

示例：
请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
// example for CMapStringToOb::RemoveKey
CMapStringToOb map;

map.SetAt( "Bart", new CAge( 13 ) );
map.SetAt( "Lisa", new CAge( 11 ) );
map.SetAt( "Homer", new CAge( 36 ) );
map.SetAt( "Marge", new CAge( 35 ) );
map.RemoveKey( "Lisa" ); // Memory leak: CAge object not deleted.

#ifdef _DEBUG
afxDump.SetDepth( 1 );
afxDump << "RemoveKey example: " << &map << "\n";
#endif

该程序的结果如下：
RemoveKey example: A CMapStringToOb with 3 elements
[Marge] = a CAge at $49A0 35
[Homer] = a CAge at $495E 36
[Bart] = a CAge at $4634 13

请参阅：CMapStringToOb::RemoveAll


 CMapStringToOb::SetAt

void SetAt( LPCTSTR key, CObject* newValue );
throw( CMemoryException );

参数：
key | 指定新元素关键码值的字符串。
newValue | 指定新元素值的CObject指针。

说明：
主要用途是在映射中插入一个元素。首先，查找关键码，如果发现了该关键码，然后改变对应的值；否则，将创建新的关键码值元素。

示例：
请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
//example for CMapStringToOb::SetAt
CMapStringToOb map;
CAge* pa;

map.SetAt( "Bart", new CAge( 13 ) );
map.SetAt( "Lisa", new CAge( 11 ) ); // Map contains 2 elements.
#ifdef _DEBUG
afxDump.SetDepth( 1 );
afxDump << "before Lisa's birthday: " << &map << "\n";
#endif
if( map.Lookup( "Lisa", (CObject *&)pa ) )
{ // CAge 12 pointer replaces CAge 11 pointer.
map.SetAt( "Lisa", new CAge( 12 ) );
delete pa; // Must delete CAge 11 to avoid memory leak.
}
#ifdef _DEBUG
afxDump << "after Lisa's birthday: " << &map << "\n";
#endif

该程序的结果如下：
before Lisa's birthday: A CMapStringToOb with 2 elements
[Lisa] = a CAge at $493C 11
[Bart] = a CAge at $4654 13
after Lisa's birthday: A CMapStringToOb with 2 elements
[Lisa] = a CAge at $49C0 12
[Bart] = a CAge at $4654 13

请参阅：CMapStringToOb::Lookup, CMapStringToOb::operator []


 CMapStringToOb::operator []

CObject*& operator []( LPCTSTR key );

返回值：返回指向CObject对象指针的参考；如果映射为空或关键码值越界则返回NULL。

说明：
该操作为SetAt成员函数非常便利的替代。这样，它仅仅用于分配声明的左边（为左值）。如果没有指定关键码的映射元素，那么则创建一个新元素。
没有与该操作等价的右边值（右值），其原因是在映射中非常可能找不到某个关键码。一般使用Lookup成员函数来查找要获取的元素。

示例：
请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
//example for CMapStringToOb::operator[]
CMapStringToOb map;

map["Bart"] = new CAge( 13 );
map["Lisa"] = new CAge( 11 );
#ifdef _DEBUG
afxDump.SetDepth( 1 );
afxDump << "operator [] example: " << &map << "\n";
#endif

该程序的结果如下：
operator [] example: A CMapStringToOb with 2 elements
[Lisa] = a CAge at $4A02 11
[Bart] = a CAge at $497E 13

请参阅：CMapStringToOb::SetAt, CMapStringToOb::Lookup


 CMapStringToPtr

CObject
└CMapStringToPtr

CMapStringToPtr类支持CString 对象为关键码的空指针映射。
StringToPtr的成员函数与CMapStringToOb类的成员函数相似。由于这种相似性，因此可以为指定的成员函数使用CMapStringToOb参考。不管是否将CObject指针看作函数参数，还是返回值，它都会将指针替换为空值。另外，不管是否将CString指针看作函数参数，还是返回值，它都会将指针替换为空值。
BOOL CMapStringToOb::Lookup( const char* <key>, CObject*& <rValue> ) const;
例如, 它可以转换为：
BOOL CMapStringToPtr::Lookup( void* <key>, void*& <rValue> ) const;
CMapStringToPtr引入了宏IMPLEMENT_DYNAMIC来支持运行状态类型的访问，并将其转储为CDumpContext对象。如果需要实现个别映射元素的转储，那么必须将转储文本的深度设置为1或更大。
字符串对指针的映射不可串行化。
当CMapStringToPtr对象或其元素被删除，那么CString键对象及对应的字被删除。
#include <afxcoll.h>

CMapStringToPtr类的成员

构造函数
CMapStringToPtr 构造一个将CString对象映射为空指针的收集

操作
Lookup | 返回以CString值为基础的空指针
SetAt | 在映射中插入一个元素，但假如发现了相匹配的关键码，则替换已经存在的元素
operator [] | 在映射中插入一个元素，它是代替SetAt的操作
RemoveKey | 删除关键码指定的元素
RemoveAll | 删除映射中所有的元素
GetStartPosition | 返回第一个元素的位置
GetNextAssoc | 获取循环中下一个元素

状态
GetCount | 返回映射中元素的个数
IsEmpty | 测试是否为空映射（即没有元素）


 CMapStringToString

CObject
└CMapStringToString

CMapStringToString类支持CString对象为关键码的CString 对象映射。CMapStringToString的成员函数与CMapStringToOb类的成员函数相似。由于这种相似性，因此可以为指定的成员函数使用CMapStringToOb参考。不管是否将CObject指针看作返回值，还是“输出”函数的参数，它都会将指针替换为字符。另外，不管是否将CString指针看作“输出”函数参数，它都会将指针替换为字符。
BOOL CMapStringToOb::Lookup( const char* <key>, CObject*& <rValue> ) const;
例如，它可以转换为：
BOOL CMapStringToString::Lookup(LPCTSTR <key>, CString& <rValue> ) const;
CMapStringToString 引入了宏IMPLEMENT_SERIAL来支持运行状态类型的访问，并将其转储为CDumpContext对象。如果映射存储到档案文件中，那么每一元素都可利用加载插入(<<)操作符或Serialize成员函数来依次进行串行化。
如果要了解有关实现个别Cstring-CString元素的转储，那么必须将转储文本的深度设置为1或更大。
当CMapStringToString对象或其元素被删除，那么CString对象也将被删除。
如果要了解有关CMapStringToString的更多信息,请参阅联机文档“Visual C++程序员指南”中的“收集”。
#include <afxcoll.h>

CMapStringToString类的成员

构造函数
CMapStringToString 构造一个将CString对象映射为CString对象的收集

操作
Lookup | 返回一个使用CString值作为关键码的CString值
SetAt | 在映射中插入一个元素，但假如发现了相匹配的关键码，则替换已经存在的元素
operator [] | 在映射中插入一个元素，它是代替SetAt的操作
RemoveKey | 删除关键码指定的元素
RemoveAll | 删除映射中所有的元素
GetStartPosition | 返回第一个元素的位置
GetNextAssoc | 获取循环中下一个元素

状态
GetCount | 返回映射中元素的个数
IsEmpty | 测试是否为空映射（即没有元素）
�


 CMapWordToOb

CObject
└CMapWordToOb

CMapWordToOb类支持16位字为关键码的CObject指针的映射。
CMapWordToOb的成员函数与CMapStringToOb类的成员函数相似。由于这种相似性，因此可以为指定的成员函数使用CMapStringToOb参考。不管是否将CObject指针看作函数参数，还是返回值，它都会将其替换为WORD。另外，不管是否将一个指向字符的CString指针或常数指针看作函数参数，还是返回值，它都会将指针替换为WORD字。
BOOL CMapStringToOb::Lookup( const char* <key>, CObject*& <rValue> ) const;
例如，它可以转换为：
BOOL CMapWordToOb::Lookup( const void* <key>, WORD& <rValue> ) const;
CMapWordToOb引入了宏IMPLEMENT_SERIAL来支持运行状态类型的访问，并将其转储为CDumpContext对象。如果映射存储到档案文件中，那么每一元素都可利用加载插入（<<）操作符或Serialize成员函数来依次进行串行化。
如果要了解有关实现个别的WORD元素到CObject元素的转储，那么必须将转储文本的深度设置为1或更大。
当CMapWordToOb对象或其元素被删除，那么CObject对象也将被删除。
如果要了解有关CMapWordToOb的更多信息,请参阅联机文档“Visual C++程序员指南”中的“收集”。
#include <afxcoll.h>

CMapWordToOb类的成员

构造函数
CMapWordToOb 构造一个将字映射为CObject指针的收集

操作
Lookup | 返回一个使用字作为关键码的CObject指针
SetAt | 在映射中插入一个元素，但假如发现了相匹配的关键码，则替换已经存在的元素
operator [] | 在映射中插入一个元素，它是代替SetAt的操作
RemoveKey | 删除关键码指定的元素
RemoveAll | 删除映射中所有的元素
GetStartPosition | 返回第一个元素的位置
GetNextAssoc | 获取循环中下一个元素

状态
GetCount | 返回映射中元素的个数
IsEmpty | 测试是否为空映射（即没有元素）


 CMapWordToPtr

CObject
└CMapWordToPtr

CMapWordToPtr类支持16位字为关键码的空指针的映射。
CMapWordToPtr的成员函数与CMapStringToOb类的成员函数相似。由于这种相似性，因此可以为指定的成员函数使用CMapStringToOb参考。不管是否将CObject指针看作函数参数，还是返回值，它都会将其替换为空指针。另外，不管是否将一个指向字符的CString指针或常数指针看作函数参数，还是返回值，它都会将指针替换为WORD字。
BOOL CMapStringToOb::Lookup( const char* <key>, CObject*& <rValue> ) const;
例如,它可以转换为：
BOOL CMapWordToPtr::Lookup( const void* <key>, WORD& <rValue> ) const;
CMapWordToPtr引入了宏IMPLEMENT_DYNAMIC来支持运行状态类型的访问，并将其转储为CDumpContext对象。如果需要实现个别映射元素的转储，那么必须将转储文本的深度设置为1或更大。
字符串对指针的映射不可串行化。
当CMapWordToPtr对象或其元素被删除，那么字及指针将被删除，而指针参考的入口不会被销毁。
如果要了解有关CMapWordToPtr的更多信息，请参阅联机文档“Visual C++程序员指南”中的“收集”。
#include <afxcoll.h>

CMapWordToPtr类的成员

构造函数
CMapWordToPtr 构造一个将字映射为空指针的收集

操作
Lookup | 返回一个使用字作为关键码的空指针
SetAt | 在映射中插入一个元素，但假如发现了相匹配的关键码，则替换已经存在的元素
operator [] | 在映射中插入一个元素，它是代替SetAt的操作
RemoveKey | 删除关键码指定的元素
RemoveAll | 删除映射中所有的元素
GetStartPosition | 返回第一个元素的位置
GetNextAssoc | 获取循环中下一个元素

状态
GetCount | 返回映射中元素的个数
IsEmpty | 测试是否为空映射（即没有元素）


 CMDIChildWnd

CObject
└CCmdTarget
└CWnd
└CFrameWnd
└CMDIChildWnd

CMDIChildWnd类提供了Windows多文档界面(MDI)子窗口及用于管理窗口的成员。
MDI子窗口与典型的框架窗口非常相似，唯一的区别在于MDI子窗口是出现在MDI框架窗口中，而不是在桌面上。MDI子窗口没有自己的菜单条，不过它可以共享MDI框架窗口。框架自动更改MDI框架的菜单，用于代表当前活动的MDI子窗口。
为了为应用创建有用的MDI子窗口，需要从CMDIChildWnd派生类。
为派生类增添成员变量，从而为应用存储指定的数据。实现消息处理的成员函数，并在派生类中实现消息映射，以便于指出当消息传递给窗口后，将发生什么事情。
构造MDI子窗口有三种途径：
· | 使用Create函数直接构造。
· | 使用LoadFrame函数直接构造。
· | 通过文档模板直接构造。
在调用Create 或 LoadFrame之前，必须使用C++new操作符在堆中构造框架窗口对象。在调用Create函数之前，必须使用AfxRegisterWndClass全局函数来登记窗口类，从而为框架设置图标或类的风格。
使用Create成员函数，用于传递作为即时参数的框架创建参数。
LoadFrame需要的参数比Create少，不过，它需要资源更多的缺省值，包括框架的标题、图标、加速表和菜单。为了LoadFrame函数的使用，所有的资源必须有相同的资源ID号(例如, IDR_MAINFRAME)。
当CMDIChildWnd对象包含视图或文档时，它们都是被框架直接创建的，而不是被编程者创建的。CDocTemplate 对象含有框架的创建，视图的创建以及视图与适当文档的联系。CDocTemplate结构的参数指定了涉及到的三个类（文档，框架，视图）的CRuntimeClass对象。
CRuntimeClass对象被框架所使用，用于用户指定后动态地创建新框架（例如使用File New命令或MDI窗口New命令）。
派生于CMDIChildWnd的框架窗口必须由DECLARE_DYNCREATE来声明，以便于RUNTIME_CLASS机制正常工作。
CMDIChildWnd类从CFrameWnd类中继承了大部分缺省用法。如果需要了解这些功能的详细情况，请参考CFrameWnd类的描述。
CMDIChildWnd拥有下列额外的功能：
· | 与CMultiDocTemplate类相关联，来自于同一文档模板的多个CMDIChildWnd 对象共享同一个菜单，并存储Windows的系统资源。
· | 当前活动的MDI子窗口菜单完全替换了MDI框架窗口的菜单。如果要了解与MDI框架窗口有关的MDI子窗口函数的更多例子，请参阅CMDIFrameWnd类的说明。
最好不要使用C++删除操作来删除框架窗口，而应使用CWnd::DestroyWindow函数。当用户关闭框架窗口时，缺省的OnClose操作将调用DestroyWindow函数。
如果要了解有关CMDIChildWnd函数的更多信息，请参阅联机文档“Visual C++程序员指南”中的“框架窗口主题”。
#include <afxwin.h>
请参阅：CWnd, CMDIFrameWnd

CMDIChildWnd类的成员

构造函数
CMDIChildWnd 构造一个CMDIChildWnd对象

初始化
Create 创建与CMDIChildWnd对象相关联的Windows MDI子窗口

操作
MDIDestroy | 删除MDI子窗口
MDIActivate | 激活MDI子窗口
MDIMaximize | 使MDI子窗口最大化
MDIRestore | 将MDI子窗口从最大化状态或最小化状态恢复为原始尺寸
GetMDIFrame | 返回父亲MDI客户窗口的MDI框架


 CMDIChildWnd::CMDIChildWnd

CMDIChildWnd( );

说明：
调用该成员函数以用于构造一个CMDIChildWnd对象。调用Create来创建可视窗口。

请参阅：CMDIChildWnd::Create


 CMDIChildWnd::Create

BOOL Create(LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_OVERLAPPEDWINDOW,
const RECT& rect = rectDefault,
CMDIFrameWnd* pParentWnd = NULL,
CCreateContext* pContext = NULL
);

返回值：如果成功，则返回非零值，否则为0。

参数：
lpszClassName | 指向命名Windows类（WNDCLASS结构）的以空字符为终止字符的字符串。该类的名字为AfxRegisterWndClass全局函数登记的任何值。对于一个标准的CMDIChildWnd，它应当为空值。
lpszWindowName | 指向代表窗口名称的以空字符为终止字符的字符串。它被作为标题栏的文本。
dwStyle | 指定窗口的类型属性。WS_CHILD风格是必须的。
rect | 包含窗口的大小和位置。rectDefault值使得Windows能够说明新CMDIChildWnd的尺寸和位置
pParentWnd | 说明窗口的父亲。若为NULL, 将使用主应用窗口。
pContext | 说明一个CCreateContext结构。该参数可为NULL。

说明：
调用该函数创建一个Windows MDI子窗口并将它附加到CMDIChildWnd对象中。
当前活动的MDI子框架窗口能够决定父框架出口的标题。当子框架窗口的FWS_ADDTOTITLE风格位关闭时，将不具有该特性。
框架调用该成员函数来响应用户创建子窗口的命令，并使用pContext参数将子窗口和应用建立连接。调用Create时, pContext可以为NULL.

请参阅：CMDIChildWnd::CMDIChildWnd, CWnd::PreCreateWindow


 CMDIChildWnd::GetMDIFrame

CMDIFrameWnd* GetMDIFrame( );

返回值：一个指向MDI父框架窗口的指针。

说明：
调用该函数返回MDI父框架。框架返回的是从CMDIChildWnd删除的父亲，也是管理CMDIChildWnd 对象的类型为MDICLIENT的窗口的父亲。调用GetParent 成员函数返回CMDIChildWnd对象的最近的MDICLIENT父亲作为临时CWnd指针。

请参阅：CWnd::GetParent


 CMDIChildWnd::MDIActivate

void MDIActivate( );

说明：
调用该成员函数来激活一个独立于MDI框架窗口的MDI子窗口。当框架活动时，最后一次被激活的子窗口是活动的。

请参阅：
CMDIFrameWnd::MDIGetActive, CWnd::OnNcActivate, CMDIFrameWnd::MDINext, WM_MDIACTIVATE


 CMDIChildWnd::MDIDestroy

void MDIDestroy( );

说明：
调用该函数销毁一个MDI子窗口。该成员函数从框架窗口中删除子窗口的标题，并将子窗口变成非活动的。

请参阅：WM_MDIDESTROY, CMDIChildWnd::Create


 CMDIChildWnd::MDIMaximize

void MDIMaximize( );

说明：
调用该成员函数，最大化一个MDI子窗口。当一个子窗口最大化时，Windows将使它的客户区充满整个框架窗口的客户区。Windows将子窗口的控件菜单放置在框架的菜单条里，所以用户可以恢复或关闭子窗口，也可以把子窗口的标题添加到框架窗口的标题中。

请参阅：WM_MDIMAXIMIZE, CMDIChildWnd::MDIRestore


 CMDIChildWnd::MDIRestore

void MDIRestore( );

说明：
调用该成员函数将一个MDI子窗口从最大化状态或最小化状态恢复过来。

请参阅：CMDIChildWnd::MDIMaximize, WM_MDIRESTORE


 CMDIFrameWnd

CObject
└CCmdTarget
└CWnd
└CFrameWnd
└CMDIFrameWnd

CMDIFrameWnd类提供了Windows多文档界面(MDI)子窗口的功能和管理窗口的功能。
为了为应用创建有用的MDI子窗口，需要从CMDIFrameWnd派生类。
为派生类增添成员变量，从而为应用存储指定的数据。实现消息处理的成员函数，并在派生类中实现消息映射，以便于指出当消息传递给窗口后，将发生什么事情。
可以通过MDI调用Create函数或CMDIFrameWnd的LoadFrame函数来构造MDI子窗口。
在调用Create或LoadFrame之前，必须使用C++的new操作符在堆中构造框架窗口对象。在调用Create函数之前，必须使用AfxRegisterWndClass全局函数来登记窗口类，从而为框架设置图标或类的风格。
使用Create成员函数，用于传递作为即时参数的框架创建参数。
LoadFrame需要的参数比Create少，不过，它需要资源更多的缺省值，包括框架的标题、图标、加速表和菜单。为了LoadFrame函数的使用，所有的资源必须有相同的资源ID 号(例如, IDR_MAINFRAME)。
尽管MDIFrameWnd由CFrameWnd类派生，但由CMDIFrameWnd派生的框架窗口不必由DECLARE_DYNCREATE来声明。
CMDIFrameWnd类从CFrameWnd类中继承了大部分缺省用法。如果需要这些功能的详细情况，请参考CFrameWnd类的描述。CMDIFrameWnd拥有下列额外的功能：
· | MDI框架窗口用于管理MDICLIENT窗口，并在其与控件栏的结合中复位。MDI客户窗口是MDI子框架窗口的直亲。WS_HSCROLL与WS_VSCROLL窗口风格指定了CMDIFrameWnd将应用于MDI客户窗口，而不是主框架窗口，这样用户就可以滚动MDI 客户区（例如，Windows的程序管理器）。
· | 当没有活动的MDI子窗口时，MDI框架窗口拥有作为菜单条使用的缺省菜单。当有活动的MDI子窗口时，MDI框架窗口的菜单条由MDI子窗口的菜单所替换。
· | 如果有MDI子窗口，那么MDI框架窗口则操作当前的MDI子窗口。例如，命令消息将于MDI框架窗口之前发送到MDI子窗口。
· | MDI框架窗口拥有下列标准Windows菜单命令的缺省句柄： ·ID_WINDOWS_TILE_VERT ·ID_WINDOWS_TILE_HORZ ·ID_WINDOWS_CASCADE ·ID_WINDOWS_ARRANGE
· | MDI框架窗口也有ID_WINDOWS_NEW功能，以用于在当前文档中创建新的框架或视图。应用可以覆盖这些缺省的命令操作，以用于定制 MDI窗口操作。
最好不要使用C++ delete操作符来删除框架窗口，相反，请使用CWnd::DestroyWindow函数。当销毁窗口时，PostNcDestroy的CFrameWnd命令将删除C++对象。当用户关闭框架窗口时，缺省的OnClose操作将调用DestroyWindow函数。
如果要了解有关CMDIChildWnd函数的更多信息，请参阅联机文档“Visual C++程序员指南”中的“框架窗口主题”。
#include <afxwin.h>
请参阅：CWnd, CMDIChildWnd

CMDIFrameWnd类的成员

构造函数
CMDIFrameWnd 构造一个CMDIFrameWnd

操作
MDIActivate | 激活一个不同的MDI子窗口
MDIGetActive | 获取当前活动的MDI子窗口，并得到指示它是否最大化的标志
MDIIconArrange | 重排所有最小化文档子窗口
MDIMaximize | 最大化一个MDI子窗口
MDINext | 激活紧跟在当前活动子窗口之后的子窗口，并把当前活动子窗口放到所有子窗口的最后
MDIRestore | 将一个MDI子窗口从最大化或最小化状态恢复回来
MDISetMenu | 重置一个MDI框架窗口的菜单，Window弹出菜单，或两者都重置
MDITile | 将所有的子窗口以平铺方式排列
MDICascade | 将所有的子窗口以级联方式排列

可覆盖的函数
CreateClient | 为CMDIFrameWnd类创建Windows MDICLIENT窗口。通过CWnd类的OnCreate成员函数来调用
GetWindowMenuPopup | 返回窗口的弹出菜单


 CMDIFrameWnd::CMDIFrameWnd

CMDIFrameWnd();

说明：
调用该函数来构造一个CMDIFrameWnd对象。调用Create或LoadFrame成员函数来创建可视的MDI框架窗口。

请参阅：CFrameWnd::Create, CFrameWnd::LoadFrame


 CMDIFrameWnd::CreateClient

virtual BOOL CreateClient(LPCREATESTRUCT lpCreateStruct, CMemu* pWindowsMenu)

返回值：如果成功，则返回非零值，否则为0。

参数：
lpCreateStruct | 一个指向LPCREATESTRUCT结构的长指针。
pWindowMenu | 一个指向Window弹出菜单的指针。

说明：
创建一个管理CMDIChildWnd对象的MDI客户窗口。

请参阅：CMDIFrameWnd::CMDIFrameWnd


 CMDIFrameWnd::GetWindowMenuPopup

virtual HMENU GetWindowMenuPopup( HMENU hMenuBar );

返回值：
如果存在一个Window弹出菜单，则返回该菜单，否则为NULL。

参数：
hMenuBar 当前的菜单条。

说明：
调用该成员函数，以获取当前名为"Window"的弹出菜单的句柄（针对MDI窗口管理的有菜单项的弹出菜单）。
缺省的命令为查找包含标准的窗口菜单命令（如ID_WINDOW_NEW和ID_WINDOW_TILE_HORZ）的弹出菜单。
如果你有一个没有使用标准菜单命令ID号的Window菜单，那么覆盖该函数。

请参阅：CMDIFrameWnd::MDIGetActive


 CMDIFrameWnd::MDIActivate

void MDIActivate( CWnd* pWndActivate );

参数：
pWndActivate 指向被激活的MDI子窗口。

说明：
调用该成员函数来激活不同的MDI子窗口。该成员函数将给正在被激活的子窗口和以前激活的子窗口发送WM_MDIACTIVATE消息。
如果用户使用鼠标或键盘改变了MDI子窗口的焦点，那么也将发送同一消息。
注意：
MDI子窗口独立于MDI框架窗口而被激活。当框架激活后，最后一个活动的子窗口将发送WM_NCACTIVATE消息，以刷新活动的窗口框架和菜单条，不过它没有接收另一个WM_MDIACTIVATE消息。

请参阅：
CMDIFrameWnd::MDIGetActive, CMDIFrameWnd::MDINext, WM_ACTIVATE, WM_NCACTIVATE


 CMDIFrameWnd::MDICascade

void MDICascade( );
void MDICascade( int nType );

参数：
nType 指定了级联标志。仅仅可以指定下列标志：MDITILE_SKIPDISABLED，它阻止无效的MDI子窗口被级联。

说明：
调用该成员函数以级联格式安排所有的MDI子窗口。
MDICascade的第一版没有参数，它级联所有的MDI子窗口，包括无效的。第二版则可选择地不级联那些无效的MDI子窗口，其条件是为nType参数指定MDITILE_SKIPDISABLED值。

请参阅：
CMDIFrameWnd::MDIIconArrange, CMDIFrameWnd::MDITile, WM_MDICASCADE


 CMDIFrameWnd::MDIGetActive

CMDIChildWnd* MDIGetActive( BOOL* pbMaximized = NULL ) const;

返回值：
返回一个指向活动的MDI子窗口的指针。

参数：
pbMaximized 指向BOOL型返回值的指针。如果窗口为最大化状态，它设置为TRUE，否则为FALSE。

说明：
获取当前活动的MDI子窗口, 以及指示子窗口是否最大化的标志。

请参阅：CMDIFrameWnd::MDIActivate, WM_MDIGETACTIVE


 CMDIFrameWnd::MDIIconArrange

void MDIIconArrange( );

说明：
排列所有的最小化文档子窗口。它将不影响那些非最小化的子窗口。

请参阅：
CMDIFrameWnd::MDICascade, CMDIFrameWnd::MDITile, WM_MDIICONARRANGE


 CMDIFrameWnd::MDIMaximize

void MDIMaximize( CWnd* pWnd );

参数：
pWnd 指定要最大化的子窗口。

说明：
调用该成员函数最大化指定的MDI子窗口。当一个子窗口最大化时，Windows 将使它的客户区充满整个框架窗口的客户区。Windows将子窗口的控件菜单放置在框架的菜单条里，所以用户可以恢复或关闭子窗口，也可以把子窗口的标题添加到框架窗口的标题中。如果当前的活动MDI子窗口为最大化的同时激活了另一个MDI子窗口，那么Windows将恢复当前活动的子窗口，并将新激活的窗口最大化。

请参阅：WM_MDIMAXIMIZE, CMDIFrameWnd::MDIRestore


 CMDIFrameWnd::MDINext

void MDINext( );

说明：
立刻激活当前活动子窗口之后的子窗口，并将当前活动的子窗口放置在所有子窗口之后。如果当前活动的MDI子窗口是最大化的，那么该成员函数将恢复当前活动的子窗口，并将新激活的子窗口最大化。

请参阅：
CMDIFrameWnd::MDIActivate, CMDIFrameWnd::MDIGetActive, WM_MDINEXT


 CMDIFrameWnd::MDIRestore

void MDIRestore( CWnd* pWnd );

参数：
pWnd 指定要恢复大小的窗口。

说明：
将MDI子窗口从最大化或最小化状态恢复为原始尺寸。

请参阅：CMDIFrameWnd::MDIMaximize, WM_MDIRESTORE


 CMDIFrameWnd::MDISetMenu

CMenu* MDISetMenu( CMenu* pFrameMenu, CMenu* pWindowMenu );

返回值：
返回通过该消息替换的框架窗口菜单的指针。该指针为暂时的，不应存储以备后面的使用。

参数：
pFrameMenu | 指定新框架窗口菜单的菜单。如果它为NULL，那么该菜单将不做改变。
pWindowMenu | 指定新Window弹出菜单的菜单。如果它为NULL，那么该菜单将不做改变。

说明：
调用该成员函数以替换MDI框架窗口的菜单或Window弹出菜单。
在调用MDISetMenu函数之后，应用必须调用CWnd类的DrawMenuBar成员函数来更新菜单条。
如果该调用替换了Window弹出菜单，那么MDI子窗口菜单项将从以前的Window菜单中删除，并被添加到新的Window弹出菜单中。
如果MDI子窗口为最大化的，并且该调用替换的是MDI框架窗口菜单，那么控件菜单及恢复控件将从以前的框架窗口菜单中删除，并被添加到新的菜单中。
如果使用了框架来管理MDI子窗口，那么最好不要调用该成员函数。

请参阅：CWnd::DrawMenuBar, WM_MDISETMENU


 CMDIFrameWnd::MDITile

void MDITile( );
void MDITile( int nType );

参数：
nType指定平铺标志。该参数只能为下列值之一：
· | MDITILE_HORIZONTAL | 平铺MDI子窗口，以便一个窗口可以出现在另一个之上。
· | MDITILE_SKIPDISABLED | 阻止无效的MDI子窗口被平铺。
· | MDITILE_VERTICAL | 平铺MDI子窗口以便一个窗口可以出现在另一个的旁边。

说明：
调用该成员函数按平铺格式排列所有的子窗口。
MDITile的第一版没有参数，它在Windows 3.1版及以后版本中垂直地平铺所有的MDI子窗口。第二版则可根据选择nType参数的值垂直或水平地平铺窗口。

请参阅：
CMDIFrameWnd::MDICascade, CMDIFrameWnd::MDIIconArrange, WM_MDITILE


 CMemFile

CObject
└CFile
└CMemFile

CMemFile为支持内存文件的CFile的派生类。内存文件的行为类似于磁盘文件，所不同的是该文件存储在RAM中，而不是磁盘上。内存文件用于快速暂时存储，以及在独立的进程间转换字节或可串行化的对象。
CMemFile对象能够自动地分配它们的内存空间，或通过调用Attach函数为CMemFile对象附加内存块。另一种情形，如果nGrowBytes非零，那么将自动地以nGrowBytes为单位为增加的内存文件分配内存。
可以通过提供的指针访问内存块，此时可以通过调用Detach函数将其从CMemFile对象中分离出来。
CMemFile函数最一般的用途是创建CMemFile对象，并通过调用CFile成员函数来使用它。值得注意的是当创建CMemFile后将自动得打开它：不要调用仅仅用于磁盘文件的CFile::Open函数，其原因在于没有使用数据成员CFile::m_hFile。
CFile成员函数Duplicate, LockRange和UnlockRange对于CMemFile无效。如果在CMemFile对象中调用了这些函数，那么将获得CnotSupported Exception。
CMemFile使用了运行库函数malloc, realloc,和free来分配、重新分配和释放内存，而原有的memcpy函数在进行读写时，可以块拷贝。如果希望改变这种行为或CMemFile增大文件的行为，那么应当从CMemFile中派生自己的类，并辅以适当的函数。
如果要了解有关CMemFile的更多信息，请参阅联机文档“Visual C++程序员指南”中的“MFC中的文件”及“内存管理主题(MFC)”，并参阅联机文档“Microsoft Visual C++运行库参考”中的“文件处理”。
#include <afx.h>

CMemFile类的成员

构造函数
CMemFile 构造一个内存文件对象

操作
Attach | 附加内存块到CMemFile中
Detach | 从CMemFile中分离内存块，并返回被分离的内存块的指针

高级可覆盖的函数
Alloc | 可覆盖以用于修改内存分配行为
Free | 可覆盖以用于修改释放内存行为
Realloc | 可覆盖以用于修改重新分配内存行为
Memcpy | 可覆盖以用于读写时修改内存拷贝行为
GrowFile | 可覆盖以用于修改文件增大时的行为


 CMemFile::Alloc

BYTE* Alloc( DWORD nBytes );

返回值：
返回指向分配的内存块的指针，如果分配失败，则返回NULL。

参数：
nBytes 被分配的内存字节数说明该函数通过调用CMemFile成员函数。可覆盖该函数以实行定制的内存分配。如果已经覆盖了该函数，那么可能也希望覆盖Free和Realloc函数。 缺省的行为是使用运行库函数malloc来分配内存。

请参阅：
CMemFile::Free, CMemFile::Realloc, malloc


 CMemFile::Attach

void Attach(BYTE* lpBuffer,UINT nBufferSize,UINT nGrowBytes = 0 );

参数：
lpBuffer | 指向附加到CMemFile的缓冲区的指针。
nBufferSize | 以字节为单位指定缓冲区大小的整数。
nGrowBytes | 以字节为单位表示的内存分配增量。

说明：
调用该函数，为CMemFile附加内存块。因此导致CMemFile使用内存块作为内存文件。
若nGrowBytes为0,那么CMemFile将使文件的长度设置为nBufferSize。这意味着内存块中的数据在附加给CMemFile之前将被用作文件。这种方式创建的文件不能增大。
既然该文件不能增大，那么需小心，不要使用CMemFile来增大文件。
例如，不要为了在文件尾写而调用CMemFile来覆盖CFile:Write，也不要调用比nBufferSize长度更大的CFile:SetLength。
如果nGrowBytes大于0,那么CMemFile将忽略附加的内存块中的内容。必须将使用CMemFile的覆盖函数CFile::Write抓取的内容写入内存文件中。如果企图在文件尾写或企图调用CMemFile的覆盖函数CFile::SetLength来增大文件，那么CMemFile将增大以nGrowBytes增量表示的内存分配。如果传递给Attach的内存块无法与Alloc共处，那么增大内存分配的努力将失败。为了能与缺省的Alloc操作共处，那么必须使用运行库函数malloc或calloc来分配内存。

请参阅：
CMemFile::CMemFile, CMemFile::Detach, CMemFile::Alloc, CFile::Write, CFile::SetLength


 CMemFile::CMemFile

CMemFile( UINT nGrowBytes = 1024 );
CMemFile( BYTE* lpBuffer,UINT nBufferSize,UINT nGrowBytes = 0 );

参数：
nGrowBytes | 以字节表示的内存分配增量。
lpBuffer | 指向接收nBufferSize大小信息缓冲区的指针。
nBufferSize | 指定以字节表示的文件缓冲区大小的整数值。

说明：
首次加载将打开一个空的内存文件。值得注意的是该文件由构造函数打开，不应调用CFile::Open函数。
第二次加载，其行为如同使用了第一个构造函数，并运用相同的参数立即调用Attach函数。如果要了解更多的信息，请参阅Attach。

示例：
// example for CMemFile::CMemFile
CMemFile f; // Ready to use - no Open necessary.
BYTE* pBuf = (BYTE*)new char [1024];
CMemFile g( pBuf, 1024, 256 );
// same as CMemFile g;
g.Attach( pBuf, 1024, 256 );

请参阅：CMemFile::Attach


 CMemFile::Detach

BYTE* Detach( );

返回值：
返回一个指向包含内存文件内容的内存块指针。

说明：
调用该函数，以获取CMemFile使用的内存块的指针。
调用该函数也关闭了CMemFile。需要调用Attach重新为CMemFile附加内存块。如果希望重新附加该文件，并使用其数据，那么在调用Detach函数之前，应当调用CFile::GetLength以获取文件的长度。要注意的是如果已经为CMemFile附加了内存块，这样就可以使用其数据(nGrowBytes == 0)，同样，也不能增大内存文件。

请参阅：CMemFile::Attach, CFile::GetLength


 CMemFile::Free

void Free( BYTE* lpMem );

参数：
lpMem 指向要释放的内存块的指针。

说明：
该函数由CMemFile成员函数所调用。覆盖该函数以实现用户的内存释放。如果已经覆盖了该函数，那么最好也要覆盖Alloc或Realloc。

请参阅：CMemFile::Alloc, CMemFile::Realloc


 CMemFile::GrowFile

void GrowFile( DWORD dwNewLen );

参数：
dwNewLen 内存文件的新的大小值。说明该函数被几个CMemFile成员函数所调用。可以覆盖它，其目的在于改变CMemFile如何增大文件。缺省的行为是调用Realloc来增大已经存在的内存块（或Alloc来创建内存块），以构造函数或Attach调用指定的nGrowBytes值的倍数来分配内存。

请参阅：
CMemFile::Alloc, CMemFile::Realloc, CMemFile::CMemFile, CMemFile::Attach


 CMemFile::Memcpy

BYTE* Memcpy( BYTE* lpMemTarget, BYTE* lpMemSource, UINT nBytes );

返回值：返回lpMemTarget的拷贝。

参数：
lpMemTarget | 指定哪个源内存将被拷贝的内存块指针。
lpMemSource | 指向源内存块的指针。
nBytes | 被拷贝的字节数。

说明：
该函数通过CMemFile覆盖函数CFile::Read和CFile::Write，将数据从内存文件中转移到另一个内存文件中。如果希望改变CMemFile进行内存拷贝的方式，就要覆盖该函数。

请参阅：CFile::Read, CFile::Write


 CMemFile::Realloc

BYTE* Realloc( BYTE* lpMem, DWORD nBytes );

返回值：
返回一个指向要释放（有可能被移走）的内存块的指针，如果释放失败，则返回NULL。

参数：
lpMem | 指向要释放的内存块的指针。
nBytes | 内存块的新的大小值。

说明：
该函数通过CMemFile成员函数来调用。覆盖该函数以实现用户的内存释放。如果已经覆盖了该函数，那么最好也覆盖Alloc和Free。

请参阅：CMemFile::Alloc, CMemFile::Free


 CMemoryException

CObject
└CException
└CMemoryException

CMemoryException对象代表了内存溢出的异常条件。不需要进一步的条件或可能性。内存异常由new自动产生。如果已经编写了自己的成员函数，例如使用malloc，那么有责任产生内存异常。
如果要了解有关CMemoryException的更多信息，请参阅联机文档“Visual C++程序员指南”中的“异常”。
#include <afx.h>

CMemoryException类的成员

构造函数
CMemoryException 构造一个CMemoryException对象


 CMemoryException::CMemoryException

CMemoryException( );

说明：
构造一个CMemoryException 对象。不要直接使用构造函数，而是调用全局函数AfxThrowMemoryException。该全局函数接替了内存溢出条件，其原因在于它在以前分配的内存中构造了异常对象。如果需要有关异常处理的更多信息，请参阅联机文档“Visual C++程序员指南”中的“异常”。

请参阅：Exception Processing


 CMemoryState

CMemoryState类没有基类。
CMemoryState提供了便利的方式以检测程序中的“内存空洞”。“内存空洞”发生于已经为一个对象分配了内存，而在长期不再需要时也没有释放。这样的内存空洞最终可能导致内存溢出错误。有几种方式来为程序分配或重新分配内存：
· | 使用运行库中的函数的malloc/free家族。
· | 使用Windows API内存管理函数LocalAlloc/LocalFree和GlobalAlloc/Global Free。
· | 使用C++ new和delete操作。
CMemoryState 诊断只能用于帮助检测内存空洞，该空洞的产生是由于使用new操作分配了内存而没有使用delete进行删除。另外两组内存管理函数是针对非C++程序的，不推荐在同一程序中使用new和delete的混合。当需要文件及内存分配的行跟踪，那么提供一个附加的宏DEBUG_NEW来替换new操作。通常，不管是否使用了new操作，都需要使用DEBUG_NEW宏。
与其它诊断相同，CMemoryState诊断也仅仅在程序的调试版中有效。
调试版必须有_DEBUG常量定义。
如果怀疑程序中有内存空洞，那么可以使用Checkpoint, Difference及DumpStatistics 函数来找出程序执行完成后，两个不同点之间内存状态（分配内存的对象）的不同。该信息对于决定函数是否清除了所有分配内存的对象非常有用。
如果仅仅知道当内存分配或内存释放时不均衡发生于何处，它并没有提供足够的信息，因此可以使用DumpAllObjectSince函数来转储自从前一次调用Checkpoint函数以来分配的所有对象。这种转储显示了内存分配次序，源文件及被分配对象所在的行（条件是使用了DEBUG_NEW）以及派生对象、其地址、大小。DumpAllObjectSince对象也调用了每一个对象的Dump函数以提供有关的信息。
如果要了解有关如何使用CMemoryState和其它诊断的信息，请参阅联机文档“Visual C++程序员指南”中的“MFC调试支持”。
注意：
CMemoryState类型的对象声明以及成员函数的调用必须用#ifdefined (_DEBUG)/#endif括起来，以便仅在程序的调试版本中包含内存诊断。

CMemoryState类的成员

构造函数
CMemoryState | 构造一个控制内存检查点的似类结构
Checkpoint | 取得当前内存状态的一个快照或“检查点”

操作
Difference | 计算两个CMemoryState类型的对象之间的差异
DumpAllObjectsSince | 从前一个检查点开始转储所有分配对象的摘要
DumpStatistics | 打印一个CMemoryState 对象的内存分配统计信息


 CMemoryState::Checkpoint

void Checkpoint( );

说明：
对内存进行一次快照并存储到该CMemoryState 对象中。CMemoryState的成员函数Difference和DumpAllObjectsSince将使用这些快照数据。示例请参阅CMemoryState构造函数的例子。


 CMemoryState::CMemoryState

CMemoryState( );

说明：
构造一个空的CMemoryState 对象，该对象必须使用Checkpoint或Difference成员函数来填充。示例请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
// example for CMemoryState::CMemoryState
// Includes all CMemoryState functions
CMemoryState msOld;
msOld.Checkpoint();
CAge* page1 = new CAge( 21 );
CAge* page2 = new CAge( 22 );
msOld.DumpAllObjectsSince();
该程序的结果如下：
Dumping objects ->
{2} a CObject at $190A
{1} a CObject at $18EA
Object dump complete.


 CMemoryState::Difference

BOOL Difference( const CMemoryState& oldState, const CMemoryState& newState );

返回值：
如果两个内存状态是不同的，返回非零值，否则为0。

参数：
oldState | 由一个CMemoryState检查点定义的初始内存状态。
newState | 由一个CMemoryState检查点定义的新内存状态。

说明：
比较两个CMemoryState对象，然后将其间的差异存储到该CMemoryState对象。两个内存状态参数都必须调用Checkpoint进行检查。

示例：
请参阅CMemoryState构造函数的例子。


 CMemoryState::DumpAllObjectsSince

void DumpAllObjectsSince( ) const;

说明：
在对该CMemoryState 对象调用Checkpoint后，为一个从CObject类派生的类型的所有的对象调用该转储函数。
用一个未初始化的CMemoryState对象调用DumpAllObjectsSince将指出当前内存中的所有对象。

示例：
请参阅CMemoryState构造函数的例子。


 CMemoryState::DumpStatistics

void DumpStatistics( ) const;

说明：
打印一个报告CMemoryState 对象的简要内存统计报告，该报告是由Difference 成员函数填充的。这个在afxDump设备上打印的报告包括以下内容：
· | 仍旧分配在堆中的"对象"块数(使用CObject::operator new分配的内存块数)。
· | 仍旧分配在堆中的非对象块数。
· | 同时被程序使用的最大内存（以字节为单位）。
· | 当前被程序使用的总内存（以字节为单位）。
样本报表如下：
0 bytes in 0 Free Blocks
8 bytes in 2 Object Blocks
0 bytes in 0 Non-Object Blocks
Largest number used: 8 bytes
Total allocations: 8 bytes
· | 第一行描述的是如果afxMemDF被设置为delayFreeMemDF，延迟释放的块数。如果要了解更多的信息，请参阅“宏和全局量”章节中的afxMemDF。
· | 第二行描述的是仍旧被分配在堆中的对象块数。
· | 第三行描述的是被分配在堆中没有释放的非对象块数（由new分配的数组及结构数）。
· | 第四行给出了程序同时使用的最大内存数。
· | 最后一行列出了程序使用的总内存数。

示例：
请参阅CMemoryState构造函数的例子。


 CMenu

CObject
└CMenu

CMenu类为Windows HMENU的封装类。它提供了成员函数以用于创建、追踪、更新及销毁菜单。
在本地的堆栈框架中创建一个CMenu对象，然后调用CMenu的成员函数来操纵所需的新菜单。接着，调用CWnd::SetMenu函数为窗口设置菜单。然后立即调用CMenu对象的Detach成员函数。CWnd::SetMenu成员函数将窗口的菜单设置为新菜单，这将导致在窗口刷新后将影响菜单的改变，同时也将菜单的拥有者传递给窗口。调用Detach函数将把HMENU从CMenu对象中分离出来，以便当本地的CMenu变量超出范围后，CMenu对象的构造函数将不会销毁不再拥有的菜单。当窗口销毁后，菜单自动销毁。
可以调用LoadMenuIndirect成员函数在内存中创建来自模板的菜单，不过通过调用LoadMenu创建的菜单更容易维护。并且这种菜单资源本身也可以由菜单编辑器创建或修改。
#include <afxwin.h>

请参阅：CObject

CMenu类的成员

数据成员
m_hMenu 指定附加给CMenu对象的窗口菜单的句柄

构造函数
CMenu 构造一个CMenu对象

初始化
Attach | 附加一个Windows菜单句柄给CMenu对象
Detach | 从CMenu对象中分离Windows菜单的句柄，并返回该句柄
FromHandle | 返回一个指向给定Windows菜单句柄的CMenu对象的指针
GetSafeHmenu | 返回由CMenu对象包含的m_hMenu值
DeleteTempMap | 删除由FromHandle成员函数创建的所有临时CMenu对象
CreateMenu | 创建一个空菜单，并将其附加给CMenu对象
CreatePopupMenu | 创建一个空的弹出菜单，并将其附加给CMenu对象
LoadMenu | 从可执行文件中装载菜单资源，并将其附加给CMenu对象
LoadMenuIndirect | 从内存的菜单模板中装载菜单，并将其附加给CMenu对象
DestroyMenu | 销毁附加给CMenu对象的菜单，并释放菜单占用的内存

菜单操作
DeleteMenu | 从菜单中删除指定的项。如果菜单项与弹出菜单相关联，那么将销毁弹出菜单的句柄，并释放它占用的内存
TrackPopupMenu | 在指定的位置显示浮动菜单，并跟踪弹出菜单的选择项

菜单项操作
AppendMenu | 在该菜单末尾添加新的菜单项
CheckMenuItem | 在弹出菜单的菜单项中放置或删除检测标记
CheckMenuRadioItem | 将单选钮放置在菜单项之前，或从组中所有的其它菜单项中删除单选钮
SetDefaultItem | 为指定的菜单设置缺省的菜单项
GetDefaultItem | 获取指定的菜单缺省的菜单项
EnableMenuItem | 使菜单项有效、无效或变灰
GetMenuItemCount | 决定弹出菜单或顶层菜单的项数
GetMenuItemID | 获取位于指定位置菜单项的菜单项标识
GetMenuState | 返回指定菜单项的状态或弹出菜单的项数
GetMenuString | 获取指定菜单项的标签
GetMenuItemInfo | 获取有关菜单项的信息
GetSubMenu | 获取指向弹出菜单的指针
InsertMenu | 在指定位置插入新菜单项，并顺次下移其它菜单项
ModifyMenu | 改变指定位置的已存在的菜单项
RemoveMenu | 从指定的菜单中删除与弹出菜单相关联的菜单项
SetMenuItemBitmaps | 将指定检测标记的位图与菜单项关联
GetMenuCountextHelpID | 获取与菜单关联的帮助文本的ID号
SetMenuCountextHelpID | 设置与菜单关联的帮助文本的ID号

可覆盖的函数
DrawItem | 通过框架来调用，其发生于拥有者菜单的可视部分有所改变
MeasureItem | 通过框架来调用，用于决定当创建了拥有者菜单时的菜单维数


 CMenu::AppendMenu

BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
BOOL AppendMenu( UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );

返回值：如果成功，则返回非零值，否则为0。

参数：
nFlags | 指定了增加到菜单中的新菜单项状态的有关信息。它包括说明中列出的一个或多个值。
nIDNewItem | 指定了新菜单项的命令ID号，或如果nFlags被设置为MF_POPUP，该参数指定弹出菜单的菜单句柄(HMENU)。如果nFlags被设置为MF_SEPARA-TOR，那么参数NewItem将被忽略。
lpszNewItemlpszNewItem指定了新菜单项的内容。参数nFlags以下列方式解释lpszNewItem：
nFlags | lpszNewItem的解释
MF_OWNERDRAW | 包含一个应用支持的32 位值，应用可以用于维护与菜单项关联的附加数据。当应用进行了WM_MEASUREITEM和WM_DRAWITEM，该32位值有效。这些信息存储在提供这些消息的结构的itemData成员中
MF_STRING | 包含一个指向以空字符终止的字符串的指针。这是它的缺省说明
MF_SEPARATOR | 参数lpszNewItem被忽略
pBmp | 指向将用作菜单项的CBitmap对象。

说明：
在菜单的末尾添加新项。该应用可以通过设置nFlags的值来指定菜单项的状态。若nIDNewItem指定一个弹出菜单，那么它也将成为被添加菜单的一部分。假如菜单被销毁，那么添加的菜单也将被销毁。添加的菜单应当从CMenu 对象中分离出来，以避免产生冲突。要注意MF_STRING和MF_OWNERDRAW对于AppendMenu函数的位图版本无效。

下面列出的是nFlags可以设置的值：
· | MF_CHECKED | 该值的行为如同使用MF_UNCHECKED来作为一个标记，用于替换项前的检测标记。若应用支持检测标记位图（请参阅SetMenuItemBitmaps成员函数），那么将显示“检测标记打开”位图。
· | MF_UNCHECKED | 该值的行为如同使用MF_CHECKED来作为一个标记，用于删除项前的检测标记。若应用支持检测标记位图（请参阅SetMenuItemBitmaps成员函数），那么将显示“检测标记关闭”位图。
· | MF_DISABLED | 使菜单项无效以便它不能被选择，但菜单项不变灰。
· | MF_ENABLED | 使菜单项有效以便它能够被选择，并从灰色状态中恢复原样。
· | MF_GRAYED | 使菜单项无效以便它不能被选择，同时使菜单项变灰。
· | MF_MENUBARBREAK | 在静态菜单里的新行中或弹出菜单的新列中放置菜单项。新的弹出菜单列与老的菜单列将由垂直分割线分开。
· | MF_MENUBREAK | 在静态菜单里的新行中或弹出菜单的新列中放置菜单项。列与列之间没有分割线。
· | MF_OWNERDRAW | 指定菜单项为一个拥有者描绘的项。当菜单首次显示时，拥有该菜单的窗口将接收WM_MEASUREITEM消息，以获取菜单项的高度与宽度。WM_DRAWITEM消息将使属主窗口必须更新菜单项的可视界面。该选择项对于顶层菜单项无效。
· | MF_POPUP | 指定菜单项有与之相关联的弹出菜单。参数ID指定了与项相关联的弹出菜单的句柄。它用于增加顶层弹出菜单项或用于增加弹出菜单项的下一级弹出菜单。
· | MF_SEPARATOR | 绘制一条水平的分割线。它仅仅能用于弹出菜单项。该线不能变灰、无效或高亮度显示。其它的参数将被忽略。
· | MF_STRING | 指定菜单项为一个字符串。

下面列出的各组标志互相排斥，不能一起使用：
· | MF_DISABLED, MF_ENABLED,和 MF_GRAYED
· | MF_STRING, MF_OWNERDRAW, MF_SEPARATOR和位图版本。
· | MF_MENUBARBREAK和MF_MENUBREAK
· | MF_CHECKED 和MF_UNCHECKED
无论何时，当停留在窗口中的菜单发生变化时（不论窗口是否显示），应用都将调用CWnd::DrawMenuBar函数。

请参阅：
CWnd::DrawMenuBar, CMenu::InsertMenu, CMenu::RemoveMenu, CMenu::SetMenuItemBitmaps, CMenu::Detach, ::AppendMenu


 CMenu::Attach

BOOL Attach( HMENU hMenu );

返回值：如果操作成功，则返回非零值，否则为0。

参数：
hMenu 指定了Windows菜单的句柄。

说明：
附加一个已经存在的Windows菜单到CMenu对象中。如果该菜单已经附加给CMenu对象，那么菜单句柄将被存储到m_hMenu数据成员中。若希望操作的菜单已经与窗口相关联，那么使用CWnd::GetMenu函数以获取菜单的句柄。

示例：
CMenu mnu;
HMENU hmnu = pWnd->GetMenu( );
mnu.Attach( hmnu );
// Now you can manipulate the window's menu as a Cmenu
// Object...

请参阅：
CMenu::Detach, CMenu::CMenu, CWnd::GetMenu


 CMenu::CheckMenuItem

UINT CheckMenuItem( UINT nIDCheckItem, UINT nCheck );

返回值：
返回菜单项以前的状态：MF_CHECKED或MF_UNCHECKED。如果该菜单项不存在，那么将返回0xFFFFFFFF。

参数：
nIDCheckItem 指定由nCheck确定的将要检测的菜单项。
nCheck指定如何检测菜单项，并如何决定菜单中菜单的位置。参数nCheck可以是MF_CHECKED或MF_UNCHECKED与 MF_BYPOSITION或MF_BYCOM MAND的组合。这些标志可通过使用位与操作进行组合。它们有下列含义：
· | MF_BYCOMMAND | 指定参数给出已存在菜单项的命令ID号。它为缺省值。
· | MF_BYPOSITION | 指定参数给出已存在菜单项的位置。第一项位于的位置是0。
· | MF_CHECKED | 与MF_UNCHECKED一起用作开关，在菜单项之前放置缺省的检测标记。
· | MF_UNCHECKED | 与MF_CHECKED用作开关，删除菜单项之前的检测标记。

说明：
在弹出菜单中为菜单项增添或删除检测标记。参数nIDCheckItem指定了将要修改的菜单项。
参数nIDCheckItem既可以标识弹出菜单项，也可以标识菜单项。在检测弹出菜单项的时候不需特别的步骤。不能检测顶层菜单。弹出菜单必须通过位置来检测，其原因在于它没有与之相关联的菜单项标识符。

请参阅：
CMenu::GetMenuState, ::CheckMenuItem, CMenu::CheckMenuRadioItem


 CMenu::CheckMenuRadioItem

BOOL CheckMenuRadioItem( UINT nIDFirst, UINT nIDLast, UINT nIDItem, UINT nFlags );

返回值：如果成功，则返回非零值，否则为0。

参数：
nIDFirst | 指定（作为一个ID号或位移量，依赖于nFlags的值)单选钮组中的第一个菜单项的值。
nIDLast | 指定（作为一个ID号或位移量，依赖于nFlags的值)单选钮组中的最后一个菜单项的值。
nIDItem | 指定（作为一个ID号或位移量，依赖于nFlags的值)单选钮组中的被选中的菜单项的值。
nFlags以下列方式指定nIDFirst, nIDLast或nIDItem的解释：
nFlags 解释
MF_BYCOMMAND | 指定参数给出已存在菜单项的命令ID号。若没有设置MF_BYCOMMAND或MF_BYPOSITION，那么该值为缺省值
MF_BYPOSITION | 指定参数给出已存在菜单项的位置。第一项在位置0

说明：
检测一个指定的菜单项，并将其选中。同时，该函数不检测关联组中其它的菜单项，并清除这些项的单选项类型标志。使用单选钮位图而非检测标记位图，将显示被检测的项。

请参阅：
CMenu::CheckMenuItem, CMenu::GetMenuState, ::CheckMenuRadioItem


 CMenu::CMenu

CMenu( );

说明：
直到调用了CMenu的创建或装载成员函数才创建菜单：
·CreateMenu
·CreatePopupMenu
·LoadMenu
·LoadMenuIndirect
·Attach

请参阅：
CMenu::CreateMenu, CMenu::LoadMenu, CMenu::LoadMenuIndirect, CMenu::Attach


 CMenu::CreateMenu

BOOL CreateMenu( );

返回值：
如果成功地创建了菜单，则返回非零值，否则为0。

说明：
创建一个菜单，并附加到CMenu 对象中。
菜单起初为空。可以使用AppendMenu或InsertMenu成员函数增添菜单项。
若菜单指定给窗口，那么当销毁了窗口时，将自动销毁菜单。
在离开之前，若菜单指定给窗口，应用必须释放与菜单相关联的系统资源。

请参阅：
CMenu::CMenu, CMenu::DestroyMenu, CMenu::InsertMenu, CWnd::SetMenu, ::CreateMenu, CMenu::AppendMenu


 CMenu::CreatePopupMenu

BOOL CreatePopupMenu( );

返回值：
若弹出式菜单成功创建返回非零值；否则返回 0。

说明：
创建一个弹出式菜单，并将它连接到CMenu对象。
建立的菜单最初是空的。菜单项可以通过AppendMenu或InsertMenu成员函数添加。
可以将该弹出式菜单添加到一个已存在的菜单或弹出式菜单中。 TrackPopupMenu成员函数可以用来使该菜单像一个浮动菜单一样的显示，并在该弹出式菜单中追踪用户的选择项。
若该菜单被分配给一个窗口，当窗口销毁时该菜单会自动销毁。若该菜单添加进一个已存在的菜单，当该菜单销毁时，它将自动销毁。
若菜单不是分配该一个窗口，在退出前，应用程序必须释放分配给该弹出式菜单的系统资源。应用程序应通过调用DestroyMenu成员函数释放菜单。

示例：请参阅的CMenu::CreateMenu示例。

请参阅：
CMenu::CreateMenu, CMenu::InsertMenu, CWnd::SetMenu, CMenu::TrackPopupMenu, CreatePopupMenu, CMenu::AppendMenu


 CMenu::DeleteMenu

BOOL DeleteMenu( UINT nPosition, UINT nFlags );

返回值：如果成功，则返回非零值，否则为0。

参数：
nPosition 指定由nFlags决定的将要删除的菜单项。
nFlags以下列方式解释nPosition：
nFlags nPosition的解释
MF_BYCOMMAND | 指定参数给出已存在菜单项的命令ID号。如果没有设置MF_BYCOMMAND或MF_BYPOSITION，那么此为缺省值
MF_BYPOSITION | 指定参数给出已存在菜单项的位置。第一项位于位置0

说明：
从菜单中删除某项。若菜单项由与其关联的弹出菜单，DeleteMenu将销毁弹出菜单的句柄，并释放弹出菜单使用的内存。
无论何时停留在窗口中的菜单发生改变时（不管窗口是否显示），应用都必须调用CWnd::DrawMenuBar函数。

请参阅：CWnd::DrawMenuBar, ::DeleteMenu


 CMenu::DeleteTempMap

static void PASCAL DeleteTempMap( );

说明：
通过CWinApp空闲时间句柄自动调用该函数，DeleteTempMap函数将删除所有由FromHandle成员函数创建的临时CMenu 对象。
DeleteTempMap函数在删除CMenu 对象之前，将把附加于临时CMenu对象的Windows菜单对象分离出来。


 CMenu::DestroyMenu

BOOL DestroyMenu( );

返回值：如果菜单被删除，则返回非零值，否则为0。

说明：
删除菜单以及其使用的任何Windows资源。菜单在被删除之前，将从CMenu对象分离出来。Windows DestroyMenu函数在CMenu构造函数内自动调用。

请参阅：::DestroyMenu


 CMenu::Detach

HMENU Detach( );

返回值：
如果成功，则返回HMENU类型的Windows菜单的句柄，否则为NULL。

说明：
从CMenu 对象中分离Windows菜单。m_hMenu数据成员被设置为NULL。

请参阅：CMenu::Attach


 CMenu::DrawItem

virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );

参数：
lpDrawItemStruct 指向包含所需绘图类型有关信息的DRAWITEMSTRUCT结构的指针。

说明：
当一个拥有者绘制的菜单的可视部分发生改变时，通过框架调用该函数。DRAWITEMSTRUCT结构的itemAction成员定义了将要进行的绘制动作。覆盖该函数，为拥有者绘制的CMenu 对象实行绘图。应用在该成员函数终止之前，将恢复lpDrawItemStruct提供显示文本选择的图形设备界面(GDI) 对象。

请参阅：
CWnd::OnDrawItem,了解对DRAWITEMSTRUCT结构的描述。


 CMenu::EnableMenuItem

UINT EnableMenuItem( UINT nIDEnableItem, UINT nEnable );

返回值：
返回以前的状态(MF_DISABLED, MF_ENABLED, 或MF_GRAYED)，如果无效，则返回-1。

参数：
nIDEnableItem 指定由nEnable决定的将要有效的菜单项。该参数既可以指定弹出菜单项，也可以指定标准菜单项。
nEnable指定了将要进行的动作。它可以是MF_DISABLED, MF_ENABLED,或MF_GRAYED与 MF_BYCOMMAND或MF_BYPOSITION的组合。这些值通过位与操作进行组合。这些值有下列含义：
· | MF_BYCOMMAND | 指定参数给出已存在的菜单项的命令ID号。此为缺省值。
· | MF_BYPOSITION | 指定参数给出已存在菜单项的位置。第一项所在的位置是0。
· | MF_DISABLED | 使菜单项无效，以便它不能被选择，但不变灰。
· | MF_ENABLED | 使菜单项有效，以便它能够被选择，并可从变灰的状态中恢复出来。
· | MF_GRAYED | 使菜单项无效，以便它不能被选择并同时变灰。

说明：
使菜单项有效、无效或变灰。CreateMenu,InsertMenu,ModifyMenu和LoadMenuIndirect成员函数同时也设置菜单项的状态（有效、无效、或变灰）。
使用MF_BYPOSITION的值需要应用恰当的CMenu对象。若菜单条的CMenu被使用，那么顶层菜单项（菜单条中的某项）将受影响。如果为了在弹出菜单或嵌套的弹出菜单中通过位置来设置项的状态，那么应用必须指定弹出菜单的CMenu。
当应用指定了MF_BYCOMMAND标志，那么Windows将检测所有的属于CMenu的弹出菜单项。因此，除非当前正在复制菜单项，那么使用菜单条的CMenu是非常有效的。

请参阅：CMenu::GetMenuState, ::EnableMenuItem


 CMenu::FromHandle

static CMenu* PASCAL FromHandle( HMENU hMenu );

返回值：返回一个指向临时或永久的CMenu对象的指针。

参数：
hMenu 菜单的Windows句柄。

说明：
返回一个指向给定菜单的Windows句柄值的指针。如果CMenu对象已经附加给Windows菜单对象，那么将创建临时的CMenu对象，并附加给菜单对象。
该临时的CMenu对象直到应用在其事务循环中有空闲时间、所有的临时对象被删除时一直有效。


 CMenu::GetDefaultItem

UINT GetDefaultItem(UINT gmdiFlags, BOOL fByPos = FAlSE);

返回值：
如果函数成功，那么返回值为菜单项的标识符或位置，否则为-1。

参数：
gmdiFlags该值指定了函数如何来搜索菜单项，该参数可以没有，或为下列值的一个或组合：
值 | 含义
GMDI_GOINTOPOPUPS | 如果缺省的菜单项打开一个子菜单，那么指定函数在相应的子菜单中进行搜索。若子菜单没有缺省项，那么返回值标识了打开的子菜单的项。缺省情况下，不管项是否打开了子菜单，函数都返回指定菜单的第一个缺省项
GMDI_USEDISABLED | 指定函数返回缺省项，不管它是否无效。缺省的情况下，函数将跳过无效或灰色的项

fByPos 该值指定了是否获取菜单项的标识符或位置。若该参数为FALSE，那么返回其标识符，否则为它的位置。

说明：
该成员函数实现了Win32函数GetMenuDefaultItem的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CMenu::SetDefaultItem


 CMenu::GetMenuContextHelpId

DWORD GetMenuContextHelpId() const

返回值：
返回当前与CMenu相关联的文本帮助ID号（如果有的话），否则为0。

说明：
调用该函数以获取与CMenu相关联的文本帮助ID号。

请参阅：CMenu::SetMenuContextHelpId, ::GetMenuContextHelpId


 CMenu::GetMenuItemCount

UINT GetMenuItemCount( ) const;

返回值：如果成功，则返回项数，否则为-1。

说明：决定弹出菜单或顶层菜单的项数。

请参阅：
CWnd::GetMenu, CMenu::GetMenuItemID, CMenu::GetSubMenu, ::GetMenuItemCount


 CMenu::GetMenuItemID

UINT GetMenuItemID(int nPos) const

返回值：
如果成功，则返回弹出菜单中指定项的ID号。若指定项为弹出菜单（对应于弹出菜单内的项），那么返回值为-1。否则如果nPos对应于SEPARATOR菜单项，那么返回值为0。

参数：
nPos 指定将要获取ID号菜单项的位置（以0为基数）。

说明：获取由nPos指定位置的菜单项的菜单项标识符。

请参阅：
CWnd::GetMenu, CMenu::GetMenuItemID, CMenu::GetSubMenu, ::GetMenuItemID


 CMenu::GetMenuItemInfo

BOOL GetMenuItemInfo(UINT nIDItem, LPMENUITEMINFO lpMenuItemInfo, BOOL ByPos=FALSE)

返回值：
如果成功，则返回值为非零，否则为0。如果要获取扩展的错误信息，请使用Win32函数GetLastError，如联机文档“平台SDK” 中所述。

参数：
nIDItem | 要获取信息菜单项的标识符或位置。该参数的意义依赖于ByPos的值。
lpMenuItemInfo | 指向MENUITEMINFO结构的指针，如联机文档“平台SDK”中所述，它包含了菜单的有关信息。
ByPos | 该值指定了nIDItem的意义。缺省情况下，ByPos是FALSE，它指定uItem为菜单项标识符。若ByPos没有设置为FALSE，那么它标识了菜单项的位置。

说明：
该成员函数实现了Win32函数GetMenuItemInfo的功能，如同联机文档“平台SDK”中所描述的。
注意，在GetMenuItemInfo的MFC实现中，没有使用菜单的句柄。

请参阅：
CWnd::GetMenu, CMenu::GetMenuItemCount, CMenu::GetMenuItemID


 CMenu::GetMenuState

UINT GetMenuState( UINT nID, UINT nFlags ) const;

返回值：
若指定的项不存在，则返回值为0xFFFFFFFF。若nId 指定的是弹出菜单，那么高位字节包含了弹出菜单的项数，低位字节则包含与弹出菜单相关联的菜单标志。否则，返回值为下列值的掩码(布尔运算 OR)（该掩码描述了nId指定的菜单项的状态）：
· | MF_CHECKED | 与MF_UNCHECKED一起用作开关，在项前放置缺省的检测标记。当应用支持检测标记位图（请参阅SetMenuItemBitmaps成员函数）时，将显示“检测标记打开”位图。
· | MF_DISABLED | 使菜单项无效，以便它不能被选择，但不变灰。
· | MF_ENABLED | 使菜单项有效，以便它能够被选择，并从变灰的状态中恢复出来。注意该常量的值为0。应用在使用该值时，不应将0作为失败。
· | MF_GRAYED | 使菜单项无效，以便它不能被选择，并将其变灰。
· | MF_MENUBARBREAK | 在静态菜单里的新行中或弹出菜单的新列中放置菜单项。新的弹出菜单列与老的菜单列将由垂直分割线分开。
· | MF_MENUBREAK | 在静态菜单里的新行中或弹出菜单的新列中放置菜单项。列与列之间没有分割线。
· | MF_SEPARATOR | 绘制一条水平的分割线。它仅仅能用于弹出菜单项。该线不能变灰、无效或高亮度显示。其它的参数将被忽略。
· | MF_UNCHECKED | 该值的行为如同使用MF_CHECKED来作为一个标记，用于删除项前的检测标记。若应用支持检测标记位图（请参阅SetMenuItemBitmaps成员函数），那么将显示“检测标记关闭”位图。注意该常量的值为0。应用在使用该值时，不应将0认为是失败。

参数：
nID 指定了由nFlags决定的菜单项ID号。
nFlags指定了nID的特性，它可以为下列值之一：
· | MF_BYCOMMAND | 指定参数给出已存在的菜单项的命令ID号。此为缺省值。
· | MF_BYPOSITION | 指定参数给出已存在菜单项的位置。第一项的位置是0。

说明：返回弹出菜单中指定菜单项的状态或项数。

请参阅：
::GetMenuState, CMenu::CheckMenuItem, CMenu::EnableMenuItem


 CMenu::GetMenuString

int GetMenuString( UINT nIDItem, LPTSTR lpString, int nMaxCount, UINT nFlags ) const;
int GetMenuString( UINT nIDItem, CString& rString, UINT nFlags ) const;

返回值：
指定拷贝到缓冲区实际字节数，不包括空终止符。

参数：
nIDItem | 指定菜单项的整数标识符或菜单中菜单项的位移，这依赖于nFlags的值。
lpString | 指向接收标签的缓冲区。
rString | 接收被拷贝菜单字符的CString对象的参考。
nMaxCount | 指定被拷贝标签的最大长度（以字节表示）。若标签比nMaxCount指定的最大值还大，那么额外的字符将被截取。
nFlags指定参数nIDItem的解释。它可以为下列值之一：
nFlags nPosition的解释
MF_BYCOMMAND | 指定参数给出已存在菜单项的命令ID号。如果没有设置MF_BYCOMMAND或MF_BYPOSITION，那么此为缺省值
MF_BYPOSITION | 指定参数给出已存在菜单项的位置。第一项位于位置0

说明：
将指定菜单项的标签拷贝到指定的缓冲区。
参数nMaxCount必须比标签中的字符数大，以容纳有终止符的字符串中的空字符。

请参阅：
CMenu::GetMenuState, CMenu::ModifyMenu, ::GetMenuString


 CMenu::GetSafeHmenu

HMENU GetSafeHmenu( ) const;

说明：
返回由CMenu 对象封装的HMENU值，或NULL CMenu指针。

请参阅：::GetSubMenu


 CMenu::GetSubMenu

CMenu* GetSubMenu( int nPos ) const;

返回值：
若弹出菜单位于指定的位置，则返回CMenu 对象的指针，其中CMenu对象要包含弹出菜单的句柄；否则为NULL。如果CMenu 对象不存在，那么将创建临时的CMenu 对象。但返回的CMenu指针不应被存储。

参数：
nPos 指定包含在菜单中的弹出菜单的位置。对于第一个菜单项，位置值开始为0。弹出菜单的标识符不能被该函数使用。

说明：获取弹出菜单的CMenu对象。

请参阅：
CWnd::GetMenu, CMenu::GetMenuItemID, ::GetMenuString


 CMenu::InsertMenu

BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
BOOL InsertMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );

返回值：如果成功，则返回非零值，否则为0。

参数：
nPosition指定将要插入的新菜单项前的菜单项。参数nFlags被用于以下列方式解释nPosition：
nflags nPosition的解释
MF_BYCOMMAND | 指定参数给出已存在菜单项的命令ID号。如果没有设置MF_BYCOMMAND或MF_BYPOSITION，那么此为缺省值
MF_BYPOSITION | 指定参数给出已存在菜单项的位置。第一项位于位置0。如果nPosition为-1，那么新菜单项将添加到菜单尾

nFlags | 指定nPosition值如何被解释，并指定要增加到菜单中新菜单项的状态。对于能够被设置的标志，请参阅成员函数AppendMenu。如果需要指定多个值，需使用位与操作来组合MF_BYCOMMAND或MF_BYPOSITION标志。
nIDNewItem | 指定新菜单项的命令ID号，或者，若nFlags被设置为MF_POPUP，则指定为弹出菜单的菜单句柄(HMENU)。若nFlags被设置为MF_SEPARATOR，那么参数nIDNewItem将被忽略。
lpszNewItem指定新菜单项的文本。nFlags被用于以下列方式解释lpszNewItem：
nflags lpszNewltem的解释
MF_OWNERDRAW | 该值含有应用用于包含菜单项附加数据应用提供的32位值。该32位值在由WM_MEASUREITEM和WM_DRAWITEM消息提供的itemData结构成员里对于应用有效。这些消息的发送是在菜单项最初显示或更改时发生
MF_STRING | 包含指向以空格位终止符的字符串指针。它为缺省解释
MF_SEPARATOR | 参数lpszNewltem将被忽略

pBmp 指向将作为菜单项使用的CBitmap 对象。

说明：
在nPosition指定位置插入新的菜单项，并依次下移其它项。应用可以通过设置nFlags的值，来指定菜单项的状态。
无论何时，当停留在窗口的菜单发生改变时（不管窗口是否显示），应用都将调用CWnd::DrawMenuBar函数。
当nIDNewItem指定一个弹出菜单，则它将成为被插入菜单的一部分。若菜单被销毁，那么插入的菜单也将要被销毁。插入的菜单应当从CMenu 对象中分离出来，以避免冲突。
如果活动的多文档界面(MDI)子窗口为最大化，同时应通过调用该函数，将弹出菜单插入到MDI应用的菜单中，并指定了MF_BYPOSITION标志，那么插入的菜单将位于期待位置的左边。其原因在于活动的MDI子窗口控件菜单被插入到MDI框架窗口菜单条的第一个位置。为了正确地放置菜单，应用必须将位置值增加1。应用可以使用WM_MDIGETACTIVE消息来决定当前活动的子窗口是否为最大化。

请参阅：
CMenu::AppendMenu, CWnd::DrawMenuBar, CMenu::SetMenuItemBitmaps, CMenu::Detach, ::InsertMenu


 CMenu::LoadMenu

BOOL LoadMenu( LPCTSTR lpszResourceName );
BOOL LoadMenu( UINT nIDResource );

返回值：如果菜单资源装载成功，则返回非零值，否则为0。

参数：
lpszResourceName | 指向一个空终止的字符串，该字符串包含了要装载的菜单资源名称。
nIDResource | 指定将要装载的菜单资源的菜单ID号。

说明：
从应用的可执行文件中装载菜单资源，并将其附加给CMenu 对象。
如果菜单没有被指定给某一窗口，那么在离开之前，应用必须释放与菜单相关联的系统资源。应通过调用DestroyMenu成员函数来释放菜单。


 CMenu::LoadMenuIndirect

BOOL LoadMenuIndirect( const void* lpMenuTemplate );

返回值：
如果菜单资源装载成功，则返回非零值，否则为0。

参数：
lpMenuTemplate 指向一个菜单模板（它是单一的MENUITEMTEMPLATEHEADER结构以及一个或多个MENUITEMTEMPLATE结构的集合）。如果需要这两个结构的更多信息，请参阅联机文档“Win32 SDK”。

说明：
从菜单模板中装载资源到内存中，并将其附加给CMenu对象。菜单模板为一个标题，它紧跟着一个或多个MENUITEMTEMPLATE结构，其中每个结构都包含一个或多个菜单项或弹出菜单项。
版本号应当为零。
mtOption标志应当包含MF_END值，它代表弹出菜单列表的最后一项或主列表的最后一项。请参阅AppendMenu成员函数以了解其它的标志。当mtOption中指定了MF_POPUP值，MENUITEMTEMPLATE结构必须省略mtId成员
分配给MENUITEMTEMPLATE结构的空间必须足够的大，以使mtString包含菜单项的名称。
如果菜单没有被指定给某一窗口，那么在离开之前，应用必须释放与菜单相关联的系统资源。应用通过调用DestroyMenu成员函数来释放菜单。

请参阅：
CMenu::DestroyMenu, CMenu::LoadMenu, ::LoadMenuIndirect, CMenu::AppendMenu


 CMenu::MeasureItem

virtual void MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct );

参数：
lpMeasureItemStruct 指向MEASUREITEMSTRUCT结构的指针。

说明：
在创建了一个拥有拥有者绘制风格的菜单时，通过框架调用该函数。缺省情况下，该成员函数不做任何工作。可覆盖该函数，并填充MEASUREITEMSTRUCT结构，从而通知Windows菜单的维数。请参阅CWnd::OnMeasureItem以了解MEASUREITEMSTRUCT结构的详细描述。


 CMenu::ModifyMenu

BOOL ModifyMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
BOOL ModifyMenu( UINT nPosition, UINT nFlags, UINT nIDNewItem, const CBitmap* pBmp );

返回值：如果成功，则返回非零值，否则为0。

参数：
nPosition指定将要改变的菜单项。参数nFlags被用于以下列方式解释nPosition：
nFlags nPosition的解释
MF_BYCOMMAND | 指定参数给出已存在菜单项的命令ID号。如果没有设置MF_BYCOMMAND或MF_BYPOSITION，那么此为缺省值
MF_BYPOSITION | 指定参数给出已存在菜单项的位置。第一项位于位置0

nFlags | 指定nPosition值如何被解释，并给定菜单项要进行修改的有关信息。如果需要了解可以被设置的其它标志，请参阅AppendMenu成员函数。
nIDNewItem | 指定将要修改的菜单项的命令ID号，或者，若nFlags被设置为MF_POPUP，则指定为弹出菜单的菜单句柄(HMENU)。若nFlags被设置为MF_SEPARATOR，那么参数nIDNewItem将被忽略。
lpszNewItem指定新菜单项的文本。nFlags被用于以下列方式解释lpszNewItem：
nFlags lpszNewItem的解释
MF_OWNERDRAW | 该值含有应用用于包含菜单项附加数据应用提供的32位值。该32位值在由WM_MEASUREITEM和WM_DRAWITEM消息提供的itemData结构成员里对于应用有效
MF_STRING | 包含指向以空格位终止符的字符串或CString的长指针
MF_SEPARATOR | 参数lpszNewItem将被忽略

pBmp 指向将作为菜单项使用的CBitmap对象。

说明：
修改由nPosition指定位置的菜单项。应用可以通过设置nFlags的值，来指定菜单项的状态。若该函数替换了与菜单项相关联的弹出菜单项，那么它也将销毁老的弹出菜单，并释放弹出菜单使用的内存。
当nIDNewItem指定一个弹出菜单，则它将成为被插入菜单的一部分。若菜单被销毁，那么插入的菜单也将要被销毁。插入的菜单应当从CMenu 对象中分离出来，以避免冲突。
无论何时当停留在窗口的菜单发生改变时（不管窗口是否显示），应用都将调用CWnd::DrawMenuBar函数。如果需要改变已存在的菜单项的属性，那么使用CheckMenuItem或EnableMenuItem成员函数速度更快。

请参阅：
CMenu::AppendMenu, CMenu::InsertMenu, CMenu::CheckMenuItem, CWnd::DrawMenuBar, CMenu::EnableMenuItem, CMenu::SetMenuItemBitmaps, CMenu::Detach, ::ModifyMenu


 CMenu::RemoveMenu

BOOL RemoveMenu( UINT nPosition, UINT nFlags );

返回值：如果成功，则返回非零值，否则为0。

参数：
nPosition指定将要删除的菜单项。参数nFlags被用于以下列方式解释nPosition：
nFlags nPosition的解释
MF_BYCOMMAND | 指定参数给出已存在菜单项的命令ID号。如果没有设置MF_BYCOMMAND或MF_BYPOSITION，那么此为缺省值
MF_BYPOSITION | 指定参数给出已存在菜单项的位置。第一项位于位置0

nFlags 指定如何解释nPosition值。

说明：
从菜单中删除与弹出菜单相关联的菜单项。它将不销毁弹出菜单的句柄，以便菜单可以再利用。在调用该函数之前，应用必须调用GetSubMenu成员函数，以获取可以再利用的弹出CMenu对象。
无论何时当停留在窗口的菜单发生改变时（不管窗口是否显示），应用都将调用CWnd::DrawMenuBar函数。

请参阅：
CWnd::DrawMenuBar, CMenu::GetSubMenu, ::RemoveMenu


 CMenu::SetDefaultItem

BOOL SetDefaultItem(UINT uItem,BOOL fByPos = FALSE);

返回值：
如果函数成功，那么返回值为非零，否则为0。如果要了解扩展的错误信息，请参阅Win32 GetLastError函数，如联机文档“平台SDK”平台SDK。参数uItem新的缺省菜单项的标识符或位置，若没有缺省项，该值为-1。该参数的含义依赖于fByPos的值。fByPos该值指定了uItem的含义。若该参数为FALSE，那么uItem为菜单项的标识符，否则它为菜单项的位置。

说明：
该成员函数实现了Win32函数SetMenuDefaultItem的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CMenu::GetDefaultItem


 CMenu::SetMenuContextHelpId

BOOL SetMenuContextHelpId( DWORD dwContextHelpId );

返回值：如果成功，则返回非零值，否则为0。

参数：
dwContextHelpId 与CMenu相关联的上下文帮助ID号。

说明：
调用该函数将上下文帮助ID号与CMenu相关联。菜单中所有的项都共享该标识符——不可能附加上下文帮助标识符到个别的菜单项。

请参阅：CMenu::GetMenuContextHelpId, ::SetMenuContextHelpId


 CMenu::SetMenuItemBitmaps

BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );

返回值：如果成功，则返回非零值，否则为0。

参数：
nPosition指定将要修改的菜单项。参数nFlags被用于以下列方式解释nPosition：
nFlags nPosition的解释
MF_BYCOMMAND | 指定参数给出已存在菜单项的命令ID号。如果没有设置MF_BYCOMMAND或MF_BYPOSITION，那么此为缺省值
MF_BYPOSITION | 指定参数给出已存在菜单项的位置。第一项位于位置0

nFlags | 指定如何解释nPosition的值。
pBmpUnchecked | 指定位图用于不被检测的菜单项。
pBmpChecked | 指定位图用于将被检测的菜单项。

说明：
将指定的位图与菜单项相关联。无论菜单是否被检测，Windows都将显示紧跟菜单项的适当的位图。
若pBmpUnchecked或pBmpChecked为NULL，那么Windows将不显示相应属性菜单项的任何内容。若这两个参数都为NULL，那么Windows在项被检测时将使用缺省的检测标记，在项不被检测时，就将删除检测标记。
当菜单被销毁后，这些位图将不会被销毁，必须利用应用删除它们。
Windows GetMenuCheckMarkDimensions函数将获取菜单项使用缺省检测标记的维数。应用使用这些值来决定该函数提供的位图的适当大小，获取该大小值，创建自己的位图，然后进行设置。

请参阅：::GetMenuCheckMarkDimensions, ::SetMenuItemBitmaps


 CMenu::TrackPopupMenu

BOOL TrackPopupMenu( UINT nFlags, int x, int y, CWnd* pWnd,LPCRECT lpRect = NULL );

返回值：如果成功，则返回非零值，否则为0。

参数：
nFlags指定屏幕位置标志或鼠标键标志。
屏幕位置标志可以为下列值之一：
· | TPM_CENTERALIGN | 使弹出菜单在水平方向相对于x指定的坐标居中。
· | TPM_LEFTALIGN | 放置弹出菜单，以便弹出菜单在由坐标值x指定的位置左对齐。
· | TPM_RIGHTALIGN | 放置弹出菜单，以便弹出菜单在由坐标值x指定的位置右对齐。

鼠标键标志可以为下列值之一：
· | TPM_LEFTBUTTON | 导致弹出菜单追踪鼠标左键。
· | TPM_RIGHTBUTTON | 导致弹出菜单追踪鼠标右键。

x | 指定弹出菜单屏幕坐标的水平位置。根据参数nFlags的值，该菜单可以左对齐、右对齐或在该位置上居中。
y | 指定弹出菜单屏幕坐标的垂直位置。
pWnd | 标识拥有弹出菜单的窗口。该窗口接收来自菜单的所有WM_COMMAND消息。在Windows 3.1或以后版本中，窗口直到TrackPopupMenu返回才接收WM_COMMAND消息。在Windows 3.0中，窗口在TrackPopupMenu返回之前接收WM_COMMAND消息。
lpRect | 指向RECT结构或包含矩形的屏幕坐标CRect对象，用户在该矩形内部单击鼠标也不会消除弹出菜单。若该参数为NULL ，那么用户在该矩形外部单击鼠标，弹出菜单将消失。对于Windows 3.0，该值必须为NULL。

对于Windows 3.1或更高版本，可以使用下列常量：
·TPM_CENTERALIGN
·TPM_LEFTALIGN
·TPM_RIGHTALIGN
·TPM_RIGHTBUTTON

说明：
在指定位置显示浮动弹出菜单，并追踪弹出菜单中被选择的项。浮动弹出菜单可以出现在屏幕的任何位置。

请参阅：
CMenu::CreatePopupMenu, CMenu::GetSubMenu, ::TrackPopupMenu


 CMenu::m_hMenu

说明：
指定附加到CMenu对象的Windows菜单的HMENU句柄。


 CMetaFileDC

CObject
└CDC
└CMetaFileDC

Windows图元文件包含了一序列图形设备接口(GDI)命令，可以用来创建需要的图像或文本。
为了实现Windows 图元文件，首先要创建一个CMetaFileDC 对象。调用CMetaFileDC构造函数，然后调用Create成员函数，以创建Windows图元文件设备上下文，并将它附加给CMetaFileDC 对象。
下一步将希望重复的CDC GDI命令序列发送给CMetaFileDC 对象。仅仅那些能够创建输出的GDI命令，例如MoveTo或LineTo，才能够使用。
在给图元文件发送了期待的命令后，调用Close成员函数，它将关闭图元文件设备上下文，并返回图元文件的句柄。之后就可以处理CMetaFileDC 对象。
CDC::PlayMetaFile能够使用图元文件的句柄，来重复播放图元文件。这个图元文件也可以由Windows函数，如CopyMetaFile进行操作，它将把图元文件拷贝到磁盘中。
当不再需要图元文件时，使用DeleteMetaFile Windows函数将其从内存中删除。
也可以实现CMetaFileDC 对象，以便它能够处理输出调用及GDI属性调用，如GetTextExtent。这样，图元文件就有更多的弹性，并能够更容易重新使用一般的GDI代码，它经常包含了输出和属性调用的混合。CMetaFileDC类从CDC继承了两个设备上下文，m_hDC和m_hAttribDC。m_hDC设备上下文处理所有的CDC GDI输出调用，而m_hAttribDC设备上下文处理所有的CDC GDI属性调用。一般而言，这两个设备上下文属于同一个设备。在CMetaFileDC情形下，属性DC缺省时设置为NULL。
另创建一个设备上下文，以指向屏幕、打印机或不同于图元文件的其它设备，然后可以调用SetAttribDC成员函数，将新设备上下文与m_hAttribDC相关联。GDI调用的信息将直接发送到新的m_hAttribDC值中，而输出GDI调用也将送给代表图元文件的m_hDC值。
要了解有关CMetaFileDC更多信息，请参阅联机文档“Visual C++程序员指南”中的“设备上下文”。
#include <afxext.h>

CMetaFileDC类的成员

构造函数
CMetaFileDC 构造一个CMetaFileDC对象

初始化
Create | 创建Windows图元文件设备上下文，并将其附加给CMetaFileDC对象
CreateEnhanced | 为增强格式的图元文件创建图元文件设备上下文

操作
Close | 关闭设备上下文，并创建图元文件的句柄
CloseEnhanced | 关闭增强的图元文件设备上下文，并创建增强格式的图元文件


 CMetaFileDC::Close

HMETAFILE Close( );

返回值：如果成功，则返回有效的HMETAFILE值，否则为NULL。

说明：
关闭增强的图元文件设备上下文，并创建Windows图元文件的句柄，使用CDC::PlayMetaFile成员函数播放图元文件。Windows函数，例如CopyMetaFile，可以利用Windows图元文件句柄来操作图元文件。
通过调用Windows DeleteMetaFile函数删除图元文件。

请参阅：
CDC::PlayMetaFile, ::CloseMetaFile, ::CopyMetaFile, ::DeleteMetaFile


 CMetaFileDC::CloseEnhanced

HENHMETAFILE CloseEnhanced( );

返回值：如果成功，则返回增强的图元文件的句柄，否则为NULL。

说明：
关闭增强型图元文件设备上下文，并返回标识增强格式的图元文件句柄。应用可以使用该函数返回的增强型图元文件的句柄，来执行下列任务：
· | 显示存储在增强型图元文件中的图形。
· | 创建增强型图元文件的拷贝。
· | 列举、编辑或拷贝增强型图元文件中个别的记录。
· | 从增强型图元文件标题中获取可选的图元文件上下文的描述。
· | 获取增强型图元文件标题的拷贝。
· | 获取增强型图元文件的二进位拷贝。
· | 列举可选调色板中的色彩。
· | 将增强型图元文件转换为Windows风格的图元文件。
当应用不再需要增强型图元文件的句柄时，应当调用::DeleteEnhMetaFile函数来释放该句柄。

请参阅：
CDC::PlayMetaFile, CMetaFileDC::CreateEnhanced, ::DeleteEnhMetaFile


 CMetaFileDC::CMetaFileDC

CMetaFileDC( );

说明：
构造CMetaFileDC 对象。首先调用CMetaFileDC，然后调用Create，它将创建Windows设备上下文，并将其附加给CMetaFileDC 对象。

请参阅：CMetaFileDC::Create


 CMetaFileDC::Create

BOOL Create( LPCTSTR lpszFilename = NULL );

返回值：如果成功，则返回非零值，否则为0。

参数：
lpszFilename 指向以空字符为终止符的字符串。它指定了将要创建的图元文件的文件名。如果lpszFilename值为NULL，那么将创建新的驻留内存的图元文件。

说明：
构造CMetaFileDC 对象。首先调用CMetaFileDC构造函数，然后调用Create，它将创建Windows设备上下文，并将其附加给CMetaFileDC 对象。

请参阅：
CMetaFileDC::CMetaFileDC, CDC::SetAttribDC, ::CreateMetaFile


 CMetaFileDC::CreateEnhanced

BOOL CreateEnhanced( CDC* pDCRef, LPCTSTR lpszFileName,LPCRECT lpBounds, LPCTSTR lpszDescription );

返回值：如果成功，则返回增强型图元文件的设备上下文，否则为NULL。

参数：
pDCRef | 标识了针对与增强型图元文件参考的设备。
lpszFileName | 指向以空字符为终止符的字符串。它指定了将要创建的图元文件的文件名。如果lpszFilename值为NULL，那么增强型图元文件建立在内存中，当其对象被销毁，或者调用了::DeleteEnhMetaFile函数，其内容将丢失。
lpBounds | 指向RECT数据结构，或指向以HIMETRIC为单位（以.01毫米为增量），存储在增强型图元文件中指定图形维数的CRect 对象。
lpszDescription | 指向以空字符为终止符的字符串。该字符串指定了创建图形的应用名称，也指定了图形的标题。

说明：
为增强型图元文件创建设备上下文。DC能够用于存储不依赖于设备的图形。
Windows通过参数pDCRef使用参考的设备标识符，以记录首次出现图形设备的图形分辨率或单位。若参数pDCRef为NULL，那么使用当前参考的显示设备。
由参数lpBounds指向的RECT数据结构的左边和顶端成员必须比右边和底端成员小。矩形的边界点也包含在图形中。若lpBounds为NULL，那么图形设备界面(GDI)将计算由应用绘制的封装在图形中的最小矩形的维数。参数lpBounds也提供了可能的位置。
由参数lpszDescription指向的字符串在应用名和图形名之间必须包含空字符，并且它必须包含两个空字符为终止符枛柪*"XYZ GraphicsEditor\0Bald Eagle\0 \0,"，其中\0代表空字符。若lpszDescription为NULL，那么在增强型图元文件标题中就没有相应的入口。
应用使用由该函数创建的DC，用于在增强型图元文件中存储一个图形。标识该DC值的句柄可以传递给任何的GDI函数。
在应用在增强型图元文件中存储图形之后，它能够通过调用CDC::PlayMetaFile函数在任何的输出设备中显示图形。当显示图形时，Windows能够使用由参数lpBounds指向的矩形，也可以使用参考设备的图形分辨率来决定图形的位置及比例。由该函数返回的设备上下文包含了与任何新DC值相关联的相同的缺省属性。
应用必须使用::GetWinMetaFileBits函数来转换增强型图元文件为更老的图元文件格式。
增强型图元文件的文件名应当使用.EMF做扩展名。

请参阅：
CMetaFileDC::CloseEnhanced, CDC::PlayMetaFile, ::CloseEnhMetaFile, ::DeleteEnhMetaFile, ::GetEnhMetaFileDescription, ::GetEnhMetaFileHeader, ::GetWinMetaFileBits, ::PlayEnhMetaFile


 CMiniFrameWnd

CObject
└CCmdTarget
└CWnd
└CFrameWnd
└CMiniFrameWnd

CMiniFrameWnd 对象代表了半高的框架窗口，最典型的为浮动工具条。这种小型框架窗口的行为类似于普通的框架窗口，其不同点在于它们没有最小化或最大化按钮，也没有菜单，只有单击系统菜单来关闭它们。
若要使用CMiniFrameWnd对象，首先要调用Create成员函数来显示小型框架窗口。
如果要了解有关如何使用CMiniFrameWnd 对象的更多信息，请参阅联机文档“Visual C++程序员指南”中的“工具条：停靠和浮动”。
#include <afxwin.h>
请参阅：CFrameWnd

CMiniFrameWnd类的成员

构造函数
CMiniFrameWnd | 构造一个CMiniFrameWnd对象
Create | 在构造函数之后创建CMiniFrameWnd对象


 CMiniFrameWnd::CMiniFrameWnd

CMiniFrameWnd( );

说明：
构造一个CMiniFrameWnd对象，但不创建窗口。如果需要创建窗口，请调用CMiniFrameWnd::Create函数。

请参阅：CFrameWnd


 CMiniFrameWnd::Create

BOOL Create(LPCTSTR lpClassName,
LPCTSTR lpWindowName,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd = NULL,
UINT nID = 0
);

返回值：如果成功，则返回非零值，否则为0。

参数：
lpClassName指向命名Windows类以空字符为终止符的字符串。该类名可以为全局AfxRegisterWndClass函数登记的所有名称。若为NULL，那么窗口类必须由框架注册。MFC给出了缺省类的下列风格与属性：
· | 设置风格位CS_DBLCLKS，当用户双击鼠标时，向窗口过程发送双击消息。
· | 设置风格位CS_HREDRAW和CS_VREDRAW，它将导致窗口改变大小后重新刷新客户区的内容。
· | 设置类光标为Windows标准的IDC_ARROW。
· | 设置类背景刷为NULL，这样，窗口将不删除其背景。
· | 设置类图标为标准的浮动旗帜的Windows徽标图标。
· | 设置窗口为Windows指定的缺省大小和位置。
pWindowName | 指向包含窗口名的以空字符为终止符的字符串。
dwStyle指定窗口风格属性。它可以为标准的窗口风格，也可以为下列一种或多种特殊风格：
· | MFS_MOVEFRAME | 允许小型框架窗口的移动方式可以通过单击窗口的边界，而不仅仅是标题。
· | MFS_4THICKFRAME | 使小型框架窗口重新定义大小无效。
· | MFS_SYNCACTIVE | 激活小型框架窗口与激活其父窗口同步。
· | MFS_THICKFRAME | 允许小型框架窗口的大小适合客户区内容的大小。
· | MFS_BLOCKSYSMENU | 使进入系统菜单及控件菜单的入口无效，并将它们转换为标题的一部分（标题栏）。
请参阅CWnd::Create来了解可能的窗口风格值的描述。小型框架窗口使用的典型组合为WS_POPUP|WS_CAPTION|WS_SYSMENU。
rect | 指定期待的窗口维数的RECT结构。
pParentWnd | 指向父窗口。对于顶层窗口使用NULL。
nID | 若小型框架窗口作为子窗口创建的，那么该值为子控件的标识符，否则该值为0。

说明：
创建Windows小型框架窗口，并将其附加给CMiniFrameWnd对象。
Create函数初始化了窗口的类名和窗口名，同时为其风格和父亲注册了缺省值。

请参阅：
CFrameWnd::Create, CWnd::Create, CWnd::CreateEx, CFrameWnd


 CMonikerFile

CObject
└CFile
└COleStreamFile
└CMonikerFile

CMonikerFile对象代表了由IMonike命名的数据流(IStream)。
标识包含的信息如同文件的文件名。若存在指向标识对象Imoniker接口的指针，那么不需知道文件实际存储的位置也可以访问标识的文件。
CMonikerFile从COleStreamFile对象派生，它可以变为一个标识，并绑定到那些名称标识的数据流中。对于数据流可以进行读写。CMonikerFile真正的用途是提供简单的访问由IMonikers命名的IStreams，以便不必自己将其绑定进数据流中，也可拥有数据流的CFile功能。
CMonikerFile不能用于绑定不同于数据流的其它对象。若你希望绑定到存储器或对象中，必须直接使用Imoniker接口。
如果要了解有关数据流和标识的更多信息，请参阅“Microsoft Visual C++ MFC库参考，第二部分”（MFC Class Library Reference）中的“COleStreamFile”部分或“OLE程序员参考”（OLE Programmer's Reference）中的“IStream”和“IMoniker”。
#include <afxole.h>
请参阅：CAsyncMonikerFile

CMonikerFile类的成员

构造函数
CMonikerFile 构造一个CMonikerFile对象

操作
Close | 分离和发布数据流，并发布该标识
Detach | 从CMonikerFile对象中分离Imoniker
GetMoniker | 返回当前标识

可覆盖的函数
CreateBindContext | 包含封装的上下文，或创建缺省的初始化的绑定的上下文
Open | 打开指定要包含数据流的文件


 CMonikerFile::Close

void Close( );

说明：
调用该函数分离和发布数据流，并发布该标识。可以调用没有打开的或已经关闭的数据流。

请参阅：CMonikerFile::Open


 CMonikerFile::CMonikerFile

CMonikerFile( );

说明：构造一个CMonikerFile对象。

请参阅：CAsyncMonikerFile, CMonikerFile::Open


 CMonikerFile::CreateBindContext

virtual IBindCtx* CreateBindContext( CFileException* pError );

返回值：
如果成功，则返回要绑定的绑定内容IBindCtx的指针，否则为NULL。
若由IBindHost接口打开一个实例，那么你将从IBindHost中获取绑定的内容。如果没有IBindHost接口或接口没能返回一个绑定的文本，那么将创建一个绑定的文本。如果需要IBindHost接口的描述，请参阅联机文档“ActiveX SDK”。

参数：
pError 指向文件异常的指针。在有错误的情况下，它将设置为原因。

说明：
调用该函数来创建一个缺省的初始化绑定文本。绑定文本为一个对象，用于存储特定的绑定操作的有关信息。可以覆盖该函数以提供一个用户的绑定文本。


 CMonikerFile::Detach

BOOL Detach( CFileException* pError = NULL );

返回值：如果成功，则返回非零值，否则为0。

参数：
pError 指向文件异常的指针。在有错误的情况下，它将设置为错误原因。

说明：调用该函数关闭数据流。

请参阅：CMonikerFile::Close, CMonikerFile::Open


 CMonikerFile::GetMoniker

IMoniker* GetMoniker( ) const;

返回值：指向当前标识接口(IMoniker)的指针。

说明：
调用该函数，获取指向当前标识的指针。既然CMonikerFile不是一个接口，返回的指针就不是参考数目（由AddRef表示）的增量，并且当发布CMonikerFile 对象的同时，将发布该标识。如果需要自己拥有该标识，那么必须使用AddRef。


 CMonikerFile::Open

BOOL Open( LPCTSTR lpszURL, CFileException* pError = NULL );
BOOL Open( IMoniker* pMoniker, CFileException* pError = NULL );

返回值：如果成功，则返回非零值，否则为0。

参数：
lpszURL | URL或将要打开文件的文件名。
pError | 指向文件异常的指针。在有错误的情况下，它将设置为错误原因。
pMoniker | 指向用于包含数据流的标识接口IMoniker的指针。

说明：
调用该成员函数以打开一个文件或标识对象。
在Macintosh上不能使用参数lpszURL，仅仅能够使用Open函数的pMoniker框架。
可以使用URL或参数lpszURL指定的文件名。例如：
CMyMonFile mymonf;
mymonf.Open(_T("http://www.microsoft.com"));
或者
CMyMonFile mymonf;
mymonf.Open(_T("file:c:\mydata.dat"));

请参阅：CMonikerFile::CMonikerFile, CAsyncMonikerFile::Open


 CMonthCalCtrl

CMonthCalCtrl对象封装了月历控件的功能。月历控件提供给用户一个简易的月历界面，用户可以用于选择日期。用户能够通过下列方式改变其显示：
· | 按月份前滚或后滚。
· | 单击Today文本，显示当天的值（条件是没有使用MCS_NOTODAY）。
· | 从弹出菜单中挑选月份或年份。
可以应用各种风格定制月历控件。这些风格在联机文档“平台SDK”中的“月历控件风格”中有所描述。
月历控件可以显示多个月，同时可以加粗日期，来指定特定的日期（例如，假期）。
如果要了解有关使用月历控件的更多信息,请参阅联机文档“Visual C++程序员指南”中的“使用CMonthCalCtrl”。
#include <afxdtctl.h>
请参阅：CDateTimeCtrl

CMonthCalCtrl类的成员

构造函数
CMonthCalCtrl | 构造一个CMonthCalCtrl对象
Create | 创建一个月历控件，并将其附加给CMonthCalCtrl对象

属性
GetMinReqRect | 获取月历控件显示完整月所需的最小值
SetMonthDelta | 为月历控件设置滚动速率
GetMonthDelta | 获取月历控件的滚动速率
SetFirstDayOfWeek | 在月历的最左边设置要显示的星期值
GetFirstDayOfWeek | 获取月历最左边显示的星期值
GetColor | 获取月历控件指定区域的颜色
SetColor | 查看月历控件指定区域的颜色

操作
SizeMinReq | 刷新月历控件到最小化，只显示一个月
SetToday | 设置月历控件的当天值
GetToday | 获取月历控件指定的作为“今天”的有关日期信息
SetCurSel | 设定月历控件当前选定的日期
GetCurSel | 获取右当前选定日期指定的系统时间
SetDayState | 在月历控件中设置要显示的日期
SetMaxSelCount | 将月历控件中能够被选择的日期值设置为最大
GetMaxSelCount | 获取月历控件中能够被选择的日期最大值
SetRange | 设置月历控件中所许可的最大和最小日期值
GetRange | 获取月历控件中所设置的最大和最小日期值
GetMonthRange | 获取代表月历控件显示的日期上限和下限的有关信息
SetSelRange | 将被选定的月历控件范围设置为给定的日期范围
GetSelRange | 获取代表由用户选定当前日期上限和下限的有关信息
HitTest | 决定月历控件的哪一部分位于屏幕指定的位置


 CMonthCalCtrl::CMonthCalCtrl

CMonthCalCtrl( );

说明：
调用该函数构造一个CMonthCalCtrl对象，并且必须在构造了该对象之后调用Create函数。

请参阅：CMonthCalCtrl::Create


 CMonthCalCtrl::Create

BOOL Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);
BOOL Create(DWORD dwStyle, const POINT& pt, CWnd* pParentWnd, UINT nID);

返回值：
如果初始化成功，则返回非零值，否则为0。

参数：
dwStyle | 指定应用于月历控件的Windows风格的组合。请参阅联机文档“平台SDK”中的“月历控件风格”以了解更多信息。
rect | RECT结构的参考，它包含了月历控件位置及大小值。
pt | 标识月历控件位置的POINT结构的参考。
pParentWnd | 一个指向CWnd对象的指针，该对象为月历控件的父窗口，它不应为NULL。
nID | 指定月历控件的ID号。

说明：
以下列两个步骤创建月历控件：
1. | 调用CMonthCalCtrl，构造一个CMonthCalCtrl对象。
2. | 调用该成员函数，以创建一个月历控件，并将其附加给CMonthCalCtrl对象。
当调用Create函数后，普通的控件将被初始化。Create函数的版本决定了其大小：
· | MFC自动决定控件的大小为一个月，调用参数pt的函数覆盖。
· | 自己手动定义控件的大小。调用参数rect函数覆盖。

请参阅：CMonthCalCtrl::CMonthCalCtrl


 CMonthCalCtrl::GetColor

COLORREF GetColor(int nRegion) const;

返回值：
如果成功，则返回月历控件指定部分颜色的COLORREF值，否则，该成员函数返回-1。

参数：
nRegion 月历控件中要获取颜色部分的区域。对于该值的列表，请参阅SetColor的参数nRegion。

说明：
调用该函数以获取由参数nRegion指定的月历控件区域的颜色。

请参阅：CMonthCalCtrl::SetColor


 CMonthCalCtrl::GetCurSel

BOOL GetCurSel(COleDateTime& refDateTime) const;
BOOL GetCurSel(CTime& refDateTime) const;
BOOL GetCurSel(LPSYSTEMTIME pDateTime) const;

返回值：
如果成功，则返回非零值，否则为0。

参数：
refDateTime | COleDateTime对象或CTime对象的参考。将获取当前的时间。
pDateTime | 接收当前被选日期信息SYSTEMTIME结构的指针。该参数必须为有效的地址值，不能为NULL。

说明：
该成员函数实现了Win32消息MCM_GETCURSEL的功能，如同联机文档“平台SDK”中所描述的。
注意：
若设置了MCS_MULTISELECT风格，那么该函数将失败。
在GetCurSel函数的MFC实现中，可以指定COleDateTime，CTime或SYSTEMTIME结构的用法。

请参阅：CMonthCalCtrl::SetCurSel


 CMonthCalCtrl::GetFirstDayOfWeek

int GetFirstDayOfWeek(BOOL* pbLocal = NULL) const;

返回值：
返回代表一周第一天的整数值。请参阅说明来了解这些整数代表的信息。

参数：
pbLocal 指向BOOL值的指针。若该值非零，那么控件的设置将不匹配控件板中的设置。

说明：
该成员函数实现了Win32消息MCM_GETFIRSTDAYOFWEEK的功能，如同联机文档“平台SDK”中所描述的。
星期的天数由整数值代表，如下所示：
值 | 星期几
0 | Monday（星期一）
1 | Tuesday（星期二）
2 | Wednesday（星期三）
3 | Thursday（星期四）
4 | Friday（星期五）
5 | Saturday（星期六）
6 | Sunday（星期日）

请参阅：CMonthCalCtrl::SetFirstDayOfWeek


 CMonthCalCtrl::GetMaxSelCount

int GetMaxSelCount( ) const;

返回值：
返回一个整数值，它代表能够被控件选择的总天数。

说明：
该成员函数实现了Win32消息MCM_GETMAXSELCOUNT的功能，如同联机文档“平台SDK”中所描述的。
使用该成员函数为控件设置MCS_MULTISELECT风格。

请参阅：CMonthCalCtrl::SetMaxSelCount


 CMonthCalCtrl::GetMinReqRect

BOOL GetMinReqRect(RECT* pRect) const;

返回值：
如果成功，则该成员函数返回非零值，并且lpRect将接收应用的边界信息，否则将返回0。

参数：
pRect 指向接收边界矩形信息的RECT结构。该参数必须为有效的地址值，它不能为NULL。

说明：
该成员函数实现了Win32消息MCM_GETMINREQRECT的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CMonthCalCtrl::SizeMinReq


 CMonthCalCtrl::GetMonthDelta

int GetMonthDelta( ) const;

返回值：
返回月历控件的返回速率。该速率为用户单击滚动按键一次，控件月份值移动的数字。

说明：
该成员函数实现了Win32消息MCM_GETMONTHDELTA的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CMonthCalCtrl::SetMonthDelta


 CMonthCalCtrl::GetMonthRange

int GetMonthRange(COleDateTime& refMinRange, COleDateTime& refMaxRange, DWORD dwFlags) const;
int GetMonthRange(CTime& refMinRange, CTime& refMaxRange, DWORD dwFlags) const;
int GetMonthRange(LPSYSTEMTIME pMinRange, LPSYSTEMTIME pMaxRange, DWORD dwFlags) const;

返回值：
代表月份范围的整数值，上下限在第一版和第二版中由refMinRange和refMax-Range指定，在第三版中由pMinRange和pMaxRange指定。

参数：
refMinRange | 包含最小日期值的COleDateTime对象或CTime对象的参考。
refMaxRange | 包含最大日期值的COleDateTime对象或CTime对象的参考。
pMinRange | 包含指向范围下界的SYSTEMTIME结构的指针。
pMaxRange | 包含指向范围下界的SYSTEMTIME结构的指针。
dwFlags该值指定了要获取范围的上下限。该值必须为下列值之一：
值 | 含义
GMR_DAYSTATE | 包括那些仅仅部分显示的可视部分的首尾月
GMR_VISIBLE | 仅仅包含那些完全显示的月

说明：
该成员函数实现了Win32消息MCM_GETMONTHRANGE的功能，如同联机文档“平台SDK”中所描述的。
在GetMonthRange 函数的MFC实现中，可以指定COleDateTime，CTime或SYSTEMTIME结构的用法。

请参阅：CMonthCalCtrl::GetRange


 CMonthCalCtrl::GetRange

DWORD GetRange(COleDateTime* pMinRange, COleDateTime* pMaxRange) const;
DWORD GetRange(CTime* pMinRange, CTime* pMaxRange) const;
DWORD GetRange(LPSYSTEMTIME pMinRange, LPSYSTEMTIME pMaxRange) const;

返回值：
返回一个DWORD值，它可以为0（没有设置上下限信息），也可以为指定上下限信息的下列值的组合。
值 | 含义
GDTR_MAX | 控件设置的最大值；pMaxRange是有效的，并包含了可用的数据信息
GDTR_MIN | 控件设置的最小值；pMinRange是有效的，并包含了可用的数据信息

参数：
pMinRange | 一个指向包含日期下限的COleDateTime对象、CTime对象或SYSTEMTIME结构的指针。
pMaxRange | 一个指向包含日期上限的COleDateTime对象、CTime对象或SYSTEMTIME结构的指针。

说明：
该成员函数实现了Win32消息MCM_GETRANGE的功能，如同联机文档“平台SDK”中所描述的。
在GetRange函数的MFC实现中，可以指定COleDateTime，CTime或SYSTEMTIME结构的用法。

请参阅：CMonthCalCtrl::SetRange


 CMonthCalCtrl::GetSelRange

BOOL GetSelRange(COleDateTime* refMinRange, COleDateTime* refMaxRange) const;
BOOL GetSelRange(CTime* refMinRange, CTime* refMaxRange) const;
BOOL GetSelRange(LPSYSTEMTIME pMinRange, LPSYSTEMTIME pMaxRange) const;

返回值：
如果成功，则返回非零值，否则为0。

参数：
refMinRange | 包含最小日期值的COleDateTime对象或CTime对象的参考。
refMaxRange | 包含最大日期值的COleDateTime对象或CTime对象的参考。
pMinRange | 包含指向范围下界的SYSTEMTIME结构的指针。
pMaxRange | 包含指向范围上界的SYSTEMTIME结构的指针。

说明：
该成员函数实现了Win32消息MCM_GETSELRANGE的功能，如同联机文档“平台SDK”中所描述的。
若月历控件没有使用MCM_MULTISELECT风格，那么GetSelRange将失败。
在GetSelRange函数的MFC实现中，可以指定COleDateTime，CTime或SYSTEMTIME结构的用法。

请参阅：CMonthCalCtrl::SetSelRange


 CMonthCalCtrl::GetToday

BOOL CMonthCalCtrl::GetToday(COleDateTime* refDateTime) const;
BOOL CMonthCalCtrl::GetToday(CTime* refDateTime) const;
BOOL GetToday(LPSYSTEMTIME pDateTime) const;

返回值：
如果成功，则返回非零值，否则为0。

参数：
refDateTime | 指定当天日期的COleDateTime对象或CTime对象的参考。
pDateTime | 指向接收日期信息的SYSTEMTIME结构的指针。该参数必须为有效的地址值，它不能为NULL。

说明：
该成员函数实现了Win32消息MCM_GETTODAY的功能，如同联机文档“平台SDK”中所描述的。
在GetToday函数的MFC实现中，可以指定COleDateTime，CTime或SYSTEMTIME结构的用法。

请参阅：CMonthCalCtrl::SetToday


 CMonthCalCtrl::HitTest

DWORD HitTest(PMCHITTESTINFO pMCHitTest);

返回值：
一个DWORD值，它等于MCHITTESTINFO结构的uHit成员。

参数：
pMCHitTest 指向包含月历控件中命中测试点的MCHITTESTINFO结构指针。

说明：
调用该函数来决定月历控件是否位于指定位置。
HitTest使用了MCHITTESTINFO结构，用于包含命中测试的有关信息。


 CMonthCalCtrl::SetColor

COLORREF SetColor(int nRegion, COLORREF ref);

返回值：
如果成功，则返回一个代表月历控件指定部分以前设置的颜色的COLORREF值，否则，该消息返回0。

参数：
nRegion指定将要设定的月历控件颜色的整数值。它可为下列值之一：
值 | 含义
MCSC_BACKGROUND | 两个月之间显示的背景色
MCSC_MONTHBK | 同一个月显示的背景色
MCSC_TEXT | 同一个月用于显示文本的颜色
MCSC_TITLEBK | 月历控件标题显示的背景色
MCSC_TITLETEXT | 月历控件标题中用于显示文本的颜色
MCSC_TRAILINGTEXT | 用于显示标题和尾注日期文本的颜色。标题和尾注日期来自于月历控件中显示的前一个月和后一个月

ref 月历控件指定部分将要设置颜色的COLORREF值

说明：
该成员函数实现了Win32消息MCM_SETCOLOR的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CMonthCalCtrl::GetColor


 CMonthCalCtrl::SetCurSel

BOOL SetCurSel(const COleDateTime* refDateTime);
BOOL SetCurSel(const CTime* refDateTime);
BOOL SetCurSel(const LPSYSTEMTIME pDateTime);

返回值：
如果成功，则返回非零值，否则为0。

参数：
refDateTime | 指定当前被选择的月历控件的COleDateTime对象或CTime对象的参考。
pDateTime | 指向包含将要设置的作为当前选择的SYSTEMTIME结构的指针。

说明：
该成员函数实现了Win32消息MCM_SETCURSEL的功能，如同联机文档“平台SDK”中所描述的。
在SetCurSel函数的MFC实现中，可以指定COleDateTime，CTime或SYSTEMTIME结构的用法。

请参阅：CMonthCalCtrl::GetCurSel


 CMonthCalCtrl::SetDayState

BOOL SetDayState(int nMonths, LPMONTHDAYSTATE pStates);

返回值：
如果成功，则返回非零值，否则为0。

参数：
nMonths | 该值指定了pStates指向的数组有多少个元素。
pStates | 一个指向MONTHDAYSTATE数组的指针，该数组定义了月历控件如何绘制它显示的每一天。MONTHDAYSTATE数据类型为一个位字段，每一位（从1到31）都代表了每月每天的状态。若位是打开的，那么对应的天将以黑体表示，否则，将没有特别强调的地方。

说明：
该成员函数实现了Win32消息MCM_SETDAYSTATE的功能，如同联机文档“平台SDK”中所描述的。


 CMonthCalCtrl::SetFirstDayOfWeek

BOOL SetFirstDayOfWeek(int iDay, int* lpnOld = NULL);

返回值：
若一周的第一天被设置给不同于LOCALE_IFIRSTDAYOFWEEK的值，那么返回非零值，否则为0。

参数：
iDay | 代表将要设定为一周第一天的整数值。该值必须为一周中的某天。请参阅GetFirstDayOfWeek以了解其详细描述。
lpnOld | 指向代表以前设定的一周第一天的整数指针。

说明：
该成员函数实现了Win32消息MCM_SETDAYOFWEEK的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CMonthCalCtrl::GetFirstDayOfWeek


 CMonthCalCtrl::SetMaxSelCount

BOOL SetMaxSelCount(int nMax);

返回值：
如果成功，则返回非零值，否则为0。

参数：
nMax 该值将被设定以代表被选日期的最大值。

说明：
该成员函数实现了Win32消息MCM_SETMAXSELCOUNT的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CMonthCalCtrl::GetMaxSelCount


 CMonthCalCtrl::SetMonthDelta

int SetMonthDelta(int iDelta);

返回值：
返回以前的滚动速率。若以前没有设定滚动速率，则返回值为0。

参数：
iDelta 被设置为滚动速率的月数。若该值为0，那么月份值将重设为缺省值，即控件显示的月数。

说明：
该成员函数实现了Win32消息MCM_SETMONTHDELTA的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CMonthCalCtrl::GetMonthDelta


 CMonthCalCtrl::SetRange

BOOL SetRange(const COleDateTime* pMinRange, const COleDateTime* pMaxRange);
BOOL SetRange(const CTime* pMinRange, const CTime* pMaxRange);
BOOL SetRange(const LPSYSTEMTIME pMinRange, const LPSYSTEMTIME pMaxRange);

返回值：
如果成功，则返回非零值，否则为0。

参数：
pMinRange | 包含指向范围下界的COleDateTime对象，CTime对象或SYSTEMTIME结构的指针。
pMaxRange | 包含指向范围上界的COleDateTime对象，CTime对象或SYSTEMTIME结构的指针。

说明：
该成员函数实现了Win32消息MCM_SETRANGE的功能，如同联机文档“平台SDK”中所描述的。
在SetRange函数的MFC实现中，可以指定COleDateTime，CTime或SYSTEMTIME结构的用法。

请参阅：CMonthCalCtrl::GetRange


 CMonthCalCtrl::SetSelRange

BOOL SetSelRange(const COleDateTime& pMinRange, const COleDateTime& pMaxRange);
BOOL SetSelRange(const CTime& pMinRange, const CTime& pMaxRange);
BOOL SetSelRange(const LPSYSTEMTIME pMinRange, const LPSYSTEMTIME pMaxRange);

返回值：
如果成功，返回非0值，否则为0。

参数：
pMinRange | 指向包含在范围下界数据的COleDateTime对象，CTime对象或SYSTEMTIMES结构的指针。
pMaxRange | 指向包含在范围数据的COleDateTime对象。CTime对象或SYSTEMTIMES结构的指针。

说明：
该成员函数实现了Win32消息MCM_SETRANGE的功能，如联机文档“平台SDK”中所描述的。
在SetSelRange的MFC实现中，可以指定COleDateTime，CTime或SYSTEMTIME结构的用法。

请参阅：CMonthCalCtrl::GetSelRange


 CMonthCalCtrl::SetToday

void SetToday(const ColeDateTime& refDateTime);
void SetToday(const CTime* pDateTime);
void SetToday(const LPSYSTEMTIME pDateTime);

参数：
refDateTime | 指定包含当前日期的COleDateTime对象的参考。
pDateTime | 在第二版中，该值为包含当前日期的CTime对象的参考。在第三版中为指向包含当前日期信息的SYSTEMTIME结构的指针。

说明：
该成员函数实现了Win32消息MCM_SETTODAY的功能，如同联机文档“平台SDK”中所描述的。

请参阅：CMonthCalCtrl::GetToday


 CMonthCalCtrl::SizeMinReq

BOOL SizeMinReq(BOOL bRepaint = TRUE);

返回值：
若月历控件的大小被设置为最小值，则返回非零值，否则为0。

参数：
bRepaint 指定控件是否重新刷新。缺省情况下，该值为TRUE。若为FALSE，将不刷新。

说明：
调用该函数使月历控件只显示一个月。若调用SizeMinReq函数成功，将显示一个月的完整月历控件。

请参阅：CMonthCalCtrl::GetMinReqRect


 CMultiDocTemplate

CObject
└CCmdTarget
└CDocTemplate
└CMultiDocTemplate

MultiDocTemplate类定义了实现多文档界面(MDI)的文档模板。MDI应用使用主框架窗口作为工作区，用户能够在其中打开零个或多个文档框架窗口，每个框架窗口都将显示一个文档。如果需要MDI更详细的描述，请参阅“Windows软件设计接口指南”。
一个文档模板定义了三种类型类之间的关系：
· | 从CDocument派生的文档类。
· | 显示上面列出文档类数据的视图类。可以从CView, CScrollView, CFormView,或 CEditView派生该类（也可以直接使用CEditView）。
· | 包含视图的框架窗口类。对于MDI文档模板，可以从CMDIChildWnd中派生该类，或者若不必定制文档框架窗口的行为，可以直接使用CMDIChildWnd而不必派生自己的类。
MDI应用能够支持多种类型的文档，并且可以同时打开不同类型的文档。应用拥有它支持的每种文档类型的文档模板。例如，若MDI应用支持电子表格或文本文档，那么应用就拥有两个CMultiDocTemplate 对象。
当用户创建一个新文档时，应用使用文档模板。若应用支持多种类型的文档，那么框架就将从文档模板中获取所支持的文档类型的名称，并在File New对话框的列表中进行显示。一旦用户选择了一种文档类型，那么应用就将创建一个文档类对象、框架窗口对象和视图对象，并互相附加给对方。
不必调用除构造函数之外的任何CMultiDocTemplate成员函数。框架将在内部处理CMultiDocTemplate 对象。
如果要了解有关CMultiDocTemplate的更多信息，请参阅联机文档“Visual C++程序员指南”中的“文档模板和文档/视图创建过程”。
#include <afxwin.h>
请参阅：CDocTemplate, CSingleDocTemplate, CWinApp

CMultiDocTemplate类的成员

构造函数
CMultiDocTemplate 构造一个CMultiDocTemplate对象


 CMultiDocTemplate::CMultiDocTemplate

CMultiDocTemplate(
UINT nIDResource,
CRuntimeClass* pDocClass,
CRuntimeClass* pFrameClass,
CRuntimeClass* pViewClass
);

参数：
nIDResource 指定文档类型使用的资源ID号。它可包括菜单、图标、加速表以及字符串资源。
字符串资源由七个子串构成，这些子串由'\n'字符分割（若不包括子串，那么'\n'字符需要作为位置占有者；但结尾的'\n'字符不是必要的）。它们描述了文档的类型。如果需要这些子串的信息，请参阅CDocTemplate::GetDocString。可以在应用的资源文件中找到该字符串资源。例如：
// MYCALCRC
STRINGTABLE PRELOAD DISCARDABLE
BEGIN
IDR_SHEETTYPE "\nSheet\nWorksheet\nWorksheets (* .myc)\n.myc\nmyCalcSheet\ nmyCalc Worksheet"
END
注意字符串由'\n'字符开始，其原因在于MDI应用没有使用第一个子串，因此它们没有包含在内。可以使用字符串编辑器来编辑字符串。在String Editor（字符串编辑器）中，完整的字符串将作为一个入口，而不是七个独立的入口。
如果要了解有关这些资源类型的更多信息，请参阅联机文档“Visual C++程序员指南”中的“资源编辑器”。

pDocClass | 指向文档类的CRuntimeClass 对象。该类为CDocument派生的类，可以用于代表自己的文档。
pFrameClass | 指向框架窗口类的CRuntimeClass对象。该类可以为CMDIChildWnd派生的类，或者希望获取文档框架窗口的缺省行为，那么该值为CMDIChildWnd本身。
pViewClass | 指向视图类的CRuntimeClass对象。该类为用户定义显示文档的CView派生的类。

说明：
构造一个CMultiDocTemplate 对象。动态地为应用支持的每种文档类型分配CMultiDocTemplate 对象，并将其中的每一种从应用类的InitInstance成员函数传递给CWinApp::AddDocTemplate。

示例：
//example for CMultiDocTemplate
BOOL CMyApp::InitInstance()
{
// ...
// Establish all of the document types
// supported by the application
AddDocTemplate( new CMultiDocTemplate(
IDR_SHEETTYPE,
RUNTIME_CLASS( CSheetDoc ),
RUNTIME_CLASS( CMDIChildWnd ),
RUNTIME_CLASS( CSheetView )
)
);
AddDocTemplate( new CMultiDocTemplate(
IDR_NOTETYPE,
RUNTIME_CLASS( CNoteDoc ),
RUNTIME_CLASS( CMDIChildWnd ),
RUNTIME_CLASS( CNoteView )
)
);
// ...
}

请参阅：
CDocTemplate::GetDocString, CWinApp::AddDocTemplate, CWinApp::InitInstance, CRuntimeClass


 CMultiLock

CMultiLock类没有基类。
CMultiLock类的对象代表多线程程序中控制资源访问的访问控制机制。若为了使用同步类CSemaphore, CMutex, CCriticalSection和CEvent，可以创建CMultiLock或CSingleLock对象以等待或发行同步对象。若在某个特定的时间希望使用多个对象，就请使用CMultiLock。否则，当仅仅在某时需等候某一对象时，请使用CSingleLock。
若要使用CMultiLock 对象，首先要创建希望等待的同步对象的数组。
然后，调用被控制的资源类成员函数内的CMultiLock对象的构造函数。其后调用Lock成员函数来决定资源是否为有效资源（被标记）。若有，就继续进行该成员函数的操作。否则，要么等待一定的时间，等资源被释放，要么返回失败。在资源完全使用后，要么当再一次使用CMultiLock对象调用Unlock函数，要么允许销毁CMultiLock对象。
CMultiLock对象在线程有大量响应的CEvent对象时非常有用。首先创建一个包含所有CEvent指针的数组，然后调用Lock函数。这将导致线程等待到某个事件被标记。
如果要了解有关如何使用CMultiLock对象的更多信息，请参阅联机文档“Visual C++程序员指南”中的“多线程：如何使用同步类”。
#include <afxmt.h>

CMultiLock类的成员

构造函数
CMultiLock 构造一个CMultiLock对象

方法
IsLocked | 决定数组中指定的同步对象是否被封锁
Lock | 等待同步对象数组
Unlock | 释放所有的被控制的同步对象


 CMultiLock::CMultiLock

CMultiLock( CSyncObject* ppObjects[], DWORD dwCount, BOOL bInitialLock = FALSE );

参数：
ppObjects | 被等待的同步对象的指针数组。它不能为NULL。
dwCount | ppObjects中的对象数。它必须大于0。
bInitialLock | 指定是否首次企图进入任何被提供的对象。

说明：
构造一个CMultiLock对象。在创建了等候的同步对象数组之后调用该函数。通常在线程必须等某个同步对象有效后调用该函数。


 CMultiLock::IsLocked

BOOL IsLocked( DWORD dwObject );

返回值：
如果指定的对象被封锁，则返回非零值，否则为0。

参数：
dwObject 数组中与所要查询状态对象相对应的对象索引。

说明：决定指定的对象是否没做标记（无效）。


 CMultiLock::Lock

DWORD Lock( DWORD dwTimeOut = INFINITE, BOOL bWaitForAll = TRUE, DWORD dwWakeMask = 0 );

返回值：若封锁失败，则返回-1，否则返回下列值之一：
· | WAIT_OBJECT_0和WAIT_OBJECT_0 + (对象数-1)之间。 若bWaitForAll为TRUE，那么所有对象都被标记（有效）。若bWaitForAll为FALSE，那么返回值——WAIT_OBJECT_0 就是对象数组中被标记（或有效）对象的索引。
· | WAIT_OBJECT_0 + (对象的个数)。 在线程输出队列中dwWakeMask 指定的事件有效。
· | WAIT_ABANDONED_0和WAIT_ABANDONED_0 + (对象数-1)之间。 若bWaitForAll为TRUE，那么所有的对象都被标记，并且至少某一对象为被遗弃的mutex对象。若bWaitForAll为FALSE,那么返回值——WAIT_ABANDONED_0就是对象数组中满足等待条件的被遗弃的mutex对象的索引。
· | WAIT_TIMEOUT 等待失败，超过dwTimeOut指定的时间。

参数：
dwTimeOut | 指定等待同步对象有效（被标记）的时间。若该值为INFINITE，那么Lock函数在返回前一直等到对象被标记。
bWaitForAll | 指定返回前是否正在等待的所有对象都必须同时被标记。若该值为FALSE，那么Lock函数将返回任一被标记的被等待的对象。
dwWakeMask | 指定允许中断等待的其它条件。如果需要该参数有效选择项的完整列表，请参阅“Win32程序员参考”中的MsgWaitForMultipleObjects。

说明：
调用该函数获取由提供给CMultiLock构造函数同步对象控制的一个或多个资源的访问。若bWaitForAll为TRUE，那么一旦所有的同步对象同时被标记，则Lock函数将成功返回。否则若bWaitForAll为FALSE，那么一旦一个或多个同步对象被标记，则Lock函数将返回。
若Lock函数不能立即返回，那么在返回前，它等待的时间将不会超过参数dwTimeOut指定的毫秒数。若dwTimeOut为INFINITE，那么直到访问了要获取的对象或遇到了dwWakeMask指定的条件，Lock函数才返回。否则，若Lock函数能够获取一个同步对象，那么它将成功返回。否则，它将返回失败。


 CMultiLock::Unlock

BOOL Unlock( );
BOOL Unlock( LONG lCount, LPLONG lPrevCount = NULL );

返回值：如果成功，则返回非零值，否则为0。

参数：
lCount | 要释放的参考合计数。该值必须大于0。若指定的总数导致对象数超过其最大值，那么该对象数将不做修改，函数将返回FALSE。
lPrevCount | 指向接收同步对象以前数目的变量。若为NULL，则不返回以前的数目。

说明：
释放由CMultiLock拥有的同步对象。通过CMultiLock的构造函数调用该函数。
第一种格式的Unlock试图解锁由CmultiLock控制的同步对象。而第二种格式的Unlock试图解锁由CMultiLock拥有的CSemaphore对象。若CMultiLock没有拥有任何的CSemaphore 对象，那么函数将返回FALSE；否则将返回TRUE。lCount和lpPrevCount恰恰与CSingleLock::Unlock的参数相同。第二种格式的Unlock很少应用于多锁的情况。


 CMutex

CObject
└CSyncObject
└CMutex

CMutex类的对象代表“哑程（mutex）”——它为一个同步对象，允许某线程共同访问同一资源。在仅仅一个线程被允许用于修改数据或其它被控制的资源时，哑程将变得非常有用。例如，给链接的列表增添一个结点就是只允许一个线程的过程。通过使用CMutex对象来控制链接列表，此时只有一个线程能够获得列表的访问权。
若要使用CMutex 对象，首先要构造一个所需的CMutex 对象。然后指定希望等待的哑程的名称，那么应用最初就将拥有它。可以在构造函数返回时，访问哑程。当你已经访问了被控制的资源后，再调用CSyncObject::Unlock函数。
另外一种使用CMutex 对象的方法就是一个CMutex类型的变量，将其作为你希望控制类的数据成员。在被控制对象的构造过程中，若哑程最初拥有了哑程的名称或期待的安全属性，那么就调用CMutex数据成员指定的构造函数，以这种方式访问由CMutex 对象控制的资源，首先要在资源访问的成员函数中创建CSingleLock类型或CMultiLock类型的变量。然后调用封锁对象的Lock成员函数(例如, CSingleLock::Lock)。这样，你的线程要么就获得资源的访问权，以等待将要释放的资源，并获取访问权，要么就等待将要释放的资源，当超时后，返回失败。在任何一种情况下，都可以在线程安全的模式下访问资源。若要释放这些资源，使用封锁对象的Unlock成员函数(例如, CSingleLock::Unlock)，或允许封锁对象越界。如果要了解有关使用CMutex 对象的更多信息，请参阅联机文档“Visual C++程序员指南”中的“多线程：如何使用同步类”。
#include <afxmt.h>

CMutex类的成员

构造函数
CMutex 构造一个CMutex对象


 CMutex::CMutex

CMutex( BOOL bInitiallyOwn = FALSE, LPCTSTR lpszName = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL );

参数：
bInitiallyOwn | 指定是否创建了CMutex对象的线程最初拥有由哑程控制资源的访问权。
lpszNameCMutex | 对象的名称。若其它的哑程由同样的名称，那么必须提供lpszName，以便对象能够通过进程边界。若该值为NULL，那么哑程将没有命名。若该名称匹配已经存在的哑程，那么构造函数将创建一个参考哑程名称的新CMutex对象。若该名称匹配已存在的不是哑程的同步对象，那么构造过程将失败。
lpsaAttribute | 哑程对象的安全性。如果需要该结构的完整描述，请参阅“Win32程序员参考”中的SECURITY_ATTRIBUTES。

说明：
构造一个命名的或未命名的CMutex对象，若要访问或释放CMutex对象，那么请创建CMultiLock或CSingleLock 对象，并调用Lock或Unlock成员函数。若CMutex对象被独占使用，那么调用Unlock成员函数释放它。


 CNotSupportedException

CObject
└CException
└CNotSupportedException

CNotSupportedException对象代表异常事件，它为应用不支持的功能。它不需要更多的限制。
如果要了解有关使用CNotSupportedException的更多信息，请参阅联机文档“Visual C++程序员指南”中的“异常”。
#include <afx.h>

CNotSupportedException类的成员

构造函数
CNotSupportedException 构造一个CNotSupportedException对象


 CNotSupportedException::CNotSupportedException

CNotSupportedException( );

说明：
构造一个CNotSupportedException 对象。
最好不要直接使用该构造函数，而要调用全局函数AfxThrowNotSupportedException。如果需要了解使用CNotSupportedException的更多信息，请参阅联机文档“Visual C++程序员指南”中的“异常”。

请参阅：AfxThrowNotSupportedException


 CObArray

CObject
└CObArray

CObArray类支持CObject指针数组。这些对象数组近似于C中的数组，但不同的是它们可以动态地增减。
数组索引总是开始于位置0。你可以决定是否固定数组上界，或当增加元素超过了当前边界后，是否允许数组扩展。内存分配给数组上界的邻近值，而不管某些元素是否为空。
在Win32下，CObArray对象的大小仅仅受限于有效的内存大小。
与C数组类似，CObArray索引元素的访问时间是一个常量，与数组的大小独立。CObArray对象引入了IMPLEMENT_SERIAL宏，以支持其元素的串行化与转储。若CObject指针数组存储在一个档案文件中，那么或者使用加载插入（<<）操作符，或者使用Serialize成员函数，每个CObject元素都将按其索引依次被串行化。
如果要了解有关实现数组中个别CObject元素的转储，那么必须将CDumpContext 对象的深度设置为1或更大。
当CObArray 对象或其元素被删除，被删除的仅仅是CObject指针，而不是它们参考的对象。
注意：
在使用数组之前，请使用SetSize来建立数组的大小，并为其分配内存。如果没有使用SetSize，那么向数组中增加元素将导致它频繁地重新分配和拷贝。频繁地重新分配和拷贝是没有效率的，并将产生内存碎片。
数组类的派生类似于列表的派生。如果需要指定用途列表类的派生，请参阅联机文档“Visual C++程序员指南”中的“收集”。
注意：如果希望串行化数组，那么在派生类的执行过程中，必须使用IMPLEMENT_SERIAL宏。
#include <afxcoll.h>

请参阅：
CStringArray, CPtrArray, CByteArray, CWordArray, CDWordArray

CObArray类的成员

构造函数
CObArray 为CObject指针构造空数组

约束
GetSize | 获取数组中的元素数
GetUpperBound | 返回最大有效索引
SetSize | 设置数组中包含的元素数

操作
FreeExtra | 释放当前数组上界以上的所有没有使用的内存
RemoveAll | 删除数组中所有元素

元素访问
GetAt | 返回给定索引的值
SetAt | 设定给定索引的值；并且数组不允许扩展
ElementAt | 返回数组内部元素指针的临时参考
GetData | 允许访问数组中的元素，它不能为NULL

扩展数组
SetAtGrow | 设置给定索引的值，如果需要就扩展数组
Add | 在数组尾部增加元素，如果需要就扩展数组
Append | 为该数组附加另一个数组，如果需要就扩展数组
Copy | 拷贝另一个数组到该数组中，如果需要就扩展数组

插入/删除
InsertAt | 在指定索引处插入一个元素（或在另一个数组中插入所有元素）
RemoveAt | 删除指定索引处的数组元素

操作
operator [] 设置或获取指定索引处的元素


 CObArray::Add

int Add( CObject* newElement );
throw( CMemoryException );

返回值：返回新增元素的索引。

参数：
newElement 新增到该数组的CObject指针。

说明：
在数组尾新增一个元素，并使数组增加1。如果SetSize用到的nGrowBy值超过1，那么将分配额外的内存。不过，数组上界将只增加1。
下表列出了类似于CObArray::Add函数的其它成员函数。
类 | 成员函数
CByteArray | int Add( BYTE newElement ) throw( CMemoryException )
CDWordArray | int Add( DWORD newElement ) throw( CMemoryException )
CPtrArray | int Add( void* newElement ) throw( CMemoryException )
CStringArray | int Add( LPCTSTR newElement ) throw( CMemoryException )
CUIntArray | int Add( UINT newElement ) throw( CMemoryException )
CWordArray | int Add( WORD newElement ) throw( CMemoryException )

示例：
请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
// example for CObArray::Add
CObArray array;
array.Add( new CAge( 21 ) ); // Element 0
array.Add( new CAge( 40 ) ); // Element 1
#ifdef _DEBUG
afxDump.SetDepth( 1 );
afxDump << "Add example: " << &array << "\n";
#endif
该程序的结果如下：
Add example: A CObArray with 2 elements
[0] = a CAge at $442A 21
[1] = a CAge at $4468 40

请参阅：
CObArray::SetAt, CObArray::SetAtGrow, CObArray::InsertAt, CObArray::operator []


 CObArray::Append

int Append( const CObArray& src );

返回值：第一个附加元素的索引。

参数：
src 附加到数组中的元素资源。

说明：
调用该成员函数将另一个数组的内容附加到给定数组尾端。这两个数组必须为同一类型。
如果必要，Append函数将分配额外的内存，用于容纳附加到数组的元素。
下表列出了类似于CObArray::Append函数的其它成员函数。
类 成员函数
CbyteArray | int Append( const CByteArray& src );
CDWordArray | int Append( const CDWordArray& src );
CPtrArray | int Append( const CPtrArray& src );
CStringArray | int Append( const CStringArray& src );
CUIntArray | int Append( const CUIntArray& src );
CWordArray | int Append( const CWordArray& src );

请参阅：CObArray::Copy


 CObArray::CObArray

CObArray( );

说明：
构造一个空CObject指针数组。数组一次增长一个元素。
下表显示了类似于CObArray::CObArray函数的其它构造函数。
类 构造函数
CByteArray | CByteArray( );
CDWordArray | CDWordArray( );
CPtrArray | CPtrArray( );
CStringArray | CStringArray( );
CUIntArray | CUIntArray( );
CWordArray | CWordArray( );

示例：
CObArray array; //Array with default blocksize
CObArray* pArray = new CObArray; //Array on the heap with default blocksize

请参阅：CObList::CObList


 CObArray::Copy

void Copy( const CObArray& src );

参数：
src 被拷贝到数组中的元素资源。

说明：
调用该成员函数，利用同一类型的另一个数组中元素覆盖给定数组的元素。
Copy将不释放内存，不过，如果必要，Copy可以分配额外的内存，以容纳拷贝到该数组的元素。
下表列出了类似于CObArray::Copy函数的其它成员函数。
类 成员函数
CByteArray | void Copy( const CByteArray& src );
CDWordArray | void Copy( const CDWordArray& src );
CPtrArray | void Copy( const CPtrArray& src );
CStringArray | void Copy( const CStringArray& src );
CUIntArray | void Copy( const CUIntArray& src );
CWordArray | void Copy( const CWordArray& src );

请参阅：CObArray::Append


 CObArray::ElementAt

CObject& ElementAt( int nIndex );

返回值：返回CObject指针的参考。

参数：
nIndex 返回一个整数索引值，它应大于或等于0，并小于或等于GetUpperBound的返回值。

说明：
返回数组内部元素指针的临时参考。它用于执行数组左边设定的操作。注意这是一个比较高级的用于执行特定的数组操作的函数。
下表列出了类似于CObArray::ElementAt函数的其它成员函数。
类 成员函数
CByteArray | BYTE& ElementAt( int nIndex );
CDWordArray | DWORD& ElementAt( int nIndex );
CPtrArray | void& ElementAt( int nIndex );
CStringArray | CString& ElementAt( int nIndex );
CUIntArray | UINT& ElementAt( int nIndex );
CWordArray | WORD& ElementAt( int nIndex );

请参阅：CObArray::operator []


 CObArray::FreeExtra

void FreeExtra( );

说明：
释放数组增长后分配的任何多余内存。该函数在数组有大小值或上界时无效。
下表列出了类似于CObArray::FreeExtra函数的其它成员函数。
类 成员函数
CByteArray | void FreeExtra( );
CDWordArray | void FreeExtra( );
CPtrArray | void FreeExtra( );
CStringArray | void FreeExtra( );
CUIntArray | void FreeExtra( );
CWordArray | void FreeExtra( );


 CObArray::GetAt

CObject* GetAt( int nIndex ) const;

返回值：索引处当前元素的CObject指针。

参数：
nIndex 一个整数索引值，它应大于或等于0，并小于或等于GetUpperBound的返回值。

说明：
返回指定索引处的数组元素。
注意：传递一个负值，或传递大于GetUpperBound返回值的值，都将导致产生一个错误断言。
下表列出了类似于CObArray::GetAt函数的其它成员函数。
类 成员函数
CByteArray | BYTE GetAt( int nIndex ) const;
CDWordArray | DWORD GetAt( int nIndex ) const;
CPtrArray | void* GetAt( int nIndex ) const;
CStringArray | CString GetAt( int nIndex ) const;
CUIntArray | UINT GetAt( int nIndex ) const;
CWordArray | WORD GetAt( int nIndex ) const;

示例：
请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
// example for CObArray::GetAt
CObArray array;
array.Add( new CAge( 21 ) ); // Element 0
array.Add( new CAge( 40 ) ); // Element 1
ASSERT( * (CAge* )
array.GetAt( 0 ) == CAge( 21 ) );

请参阅：CObArray::SetAt, CObArray::operator []


 CObArray::GetData

const CObject* GetData( ) const;
CObject** GetData( );

返回值：返回指向CObject指针数组的指针。

说明：
使用该函数将获得访问数组中元素的权限。如果没有有效的元素，那么GetData将返回一个空值。
直接访问数组中元素能够帮助你更快捷地工作，不过在调用GetData函数时一定要小心，因为任何错误都将直接影响数组中的元素。
下表列出了类似于CObArray::GetData函数的其它成员函数。
类 成员函数
CByteArrayconst BYTE* GetData( ) const;
BYTE* GetData( );
CDWordArrayconst DWORD* GetData( ) const;
DWORD* GetData( );
CPtrArrayconst void* * GetData( ) const;
void* * GetData( );
CStringArrayconst CString* GetData( ) const;
CString* GetData( );
CUIntArrayconst UINT* GetData( ) const;
UINT* GetData( );
CWordArrayconst WORD* GetData( ) const;
WORD* GetData( );

请参阅：
CObArray::GetAt, CObArray::SetAt, CObArray::ElementAt


 CObArray::GetSize

int GetSize( ) const;

说明：
返回数组的大小。既然索引以0为基数，那么大小值比数组最大索引值大1。
下表列出了类似于CObArray::GetSize函数的其它成员函数。
类 成员函数
CByteArray | int GetSize( ) const;
CDWordArray | int GetSize( ) const;
CPtrArray | int GetSize( ) const;
CStringArray | int GetSize( ) const;
CUIntArray | int GetSize( ) const;
CWordArray | int GetSize( ) const;

请参阅：
CObArray::GetUpperBound, CObArray::SetSize


 CObArray::GetUpperBound

int GetUpperBound( ) const;

返回值：返回以0为基数的上界的索引。

说明：
返回该数组的当前上界。由于数组索引以0为基数，那么该函数返回值将比GetSize返回值小1。
条件 GetUpperBound( ) ==1指出的是数组没有元素。
下表列出了类似于CObArray::GetUpperBound函数的其它成员函数。
类 成员函数
CByteArray | int GetUpperBound( ) const;
CDWordArray | int GetUpperBound( ) const;
CPtrArray | int GetUpperBound( ) const;
CStringArray | int GetUpperBound( ) const;
CUIntArray | int GetUpperBound( ) const;
CWordArray | int GetUpperBound( ) const;

示例：
请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
// example for CObArray::GetUpperBound
CObArray array;
array.Add( new CAge( 21 ) ); // Element 0
array.Add( new CAge( 40 ) ); // Element 1
ASSERT( array.GetUpperBound() == 1 ); // Largest index

请参阅：CObArray::GetSize, CObArray::SetSize


 CObArray::InsertAt

void InsertAt( int nIndex, CObject* newElement, int nCount = 1 );
throw( CMemoryException );
void InsertAt( int nStartIndex, CObArray* pNewArray );
throw( CMemoryException );

参数：
nIndex | 可以比GetUpperBound返回值大的整数索引。
newElement | 该数组中被安置的CObject指针。newElement值允许为NULL。
nCount | 该元素被插入的次数（缺省值为1）。
nStartIndex | 可以比GetUpperBound返回值大的整数索引。
pNewArray | 包含添加到该数组元素的另一个数组。

说明：
第一版本InsertAt在数组指定索引处插入一个元素（或该元素的多个拷贝）。在该过程中，它将依次增加该索引及该索引以上的元素索引值（按照索引的增量）。
第二版本则在nStartIndex位置插入另一个CObArray集合中的所有元素。
相反的是，SetAt函数将替换指定的数组元素，但不移动其它元素。
下表列出了类似于CObArray::InsertAt函数的其它成员函数。
类 成员函数
CByteArrayvoid InsertAt( int nIndex, BYTE newElement, int nCount= 1 );
throw( CMemoryException );
void InsertAt( int nStartIndex, CByteArray* pNewArray );
throw( CMemoryException );
CDWordArrayvoid InsertAt( int nIndex, DWORD newElement, int nCount = 1 );
throw( CMemoryException );
void InsertAt( int nStartIndex, CDWordArray*pNewArray );
throw( CMemoryException );
CPtrArrayvoid InsertAt( int nIndex, void* newElement, int nCount = 1 );
throw( CMemoryException );
void InsertAt( int nStartIndex, CPtrArray* pNewArray );
throw( CMemoryException );
CStringArrayvoid InsertAt( int nIndex, LPCTSTR newElement, int nCount = 1 );
throw( CMemoryException );
void InsertAt(int nStartIndex, CStringArray* pNewArray);
throw( CMemoryException);
CUIntArrayvoid InsertAt(int nIndex,UINT newElement,int nCount =1);
throw( CMemoryException);
void InsertAt( int nStartIndex, CUIntArray* pNewArray);
throw( CMemoryException);
CWordArrayvoid InsertAt(int nIndex,WORD newElement,int nCount= 1);
throw( CMemoryException);
void InsertAt(int nStartIndex, CwordArray* pNewArray);
throw( CMemoryException);

示例：
请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
// example for CObArray::InsertAt
CObArray array;
array.Add( new CAge( 21 ) ); // Element 0
array.Add( new CAge( 40 ) ); // Element 1 (will become 2).
array.InsertAt( 1, new CAge( 30 ) ); // New element 1
#ifdef _DEBUG
afxDump.SetDepth( 1 );
afxDump << "InsertAt example: " << &array << "\n";
#endif
该程序的结果如下：
InsertAt example: A CObArray with 3 elements
[0] = a CAge at $45C8 21
[1] = a CAge at $4646 30
[2] = a CAge at $4606 40

请参阅：CObArray::SetAt, CObArray::RemoveAt


 CObArray::RemoveAll

void RemoveAll( );

说明：
从该数组中删除所有指针，但并不真正地删除CObject 对象。假如该数组已经为空，该函数也仍将有效。
RemoveAll函数将释放所有用于指针存储所占用的内存。
下表列出了类似于CObArray::RemoveAll函数的其它成员函数。
类 成员函数
CByteArray | void RemoveAll( );
CDWordArray | void RemoveAll( );
CPtrArray | void RemoveAll( );
CStringArray | void RemoveAll( );
CUIntArray | void RemoveAll( );
CWordArray | void RemoveAll( );

示例：
请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
// example for CObArray::RemoveAll
CObArray array;
CAge* pa1;
CAge* pa2;
array.Add( pa1 = new CAge( 21 ) ); // Element 0
array.Add( pa2 = new CAge( 40 ) ); // Element 1
ASSERT( array.GetSize() == 2 );
array.RemoveAll(); // Pointers removed but objects not deleted.
ASSERT( array.GetSize() == 0 );
delete pa1;
delete pa2; // Cleans up memory.


 CObArray::RemoveAt

void RemoveAt( int nIndex, int nCount = 1 );

参数：
nIndex | 一个整数索引值，它应大于或等于0，并小于或等于GetUpperBound的返回值。
nCount | 将要删除的元素数。

说明：
删除数组中指定索引开始的一个或多个元素。在这个过程中，它将减少被删除元素以上的所有元素的索引值。同时它将降低数组的下界，但不释放内存。
如果要删除的元素多于数组中删除点以上的元素数，那么将出现库调试版本的断言。
RemoveAt函数从数组中删除CObject指针，但它并不删除对象本身。
下表列出了类似于CObArray::RemoveAt函数的其它成员函数。
类 成员函数
CByteArray | void RemoveAt( int nIndex, int nCount = 1 );
CDWordArray | void RemoveAt( int nIndex, int nCount = 1 );
CPtrArray | void RemoveAt( int nIndex, int nCount = 1 );
CStringArray | void RemoveAt( int nIndex, int nCount = 1 );
CUIntArray | void RemoveAt( int nIndex, int nCount = 1 );
CWordArray | void RemoveAt( int nIndex, int nCount = 1 );

示例：
请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
// example for CObArray::RemoveAt
CObArray array;
CObject* pa;
array.Add( new CAge( 21 ) ); // Element 0
array.Add( new CAge( 40 ) ); // Element 1
if( ( pa = array.GetAt( 0 ) ) != NULL )
{
array.RemoveAt( 0 ); // Element 1 moves to 0.
delete pa; // Delete the original element at 0.
}
#ifdef _DEBUG
afxDump.SetDepth( 1 );
afxDump << "RemoveAt example: " << &array << "\n";
#endif
该程序的结果如下：
RemoveAt example: A CObArray with 1 elements
[0] = a CAge at $4606 40

请参阅：
CObArray::SetAt, CObArray::SetAtGrow, CObArray::InsertAt


 CObArray::SetAt

void SetAt( int nIndex, CObject* newElement );

参数：
nIndex | 一个整数索引值，它应大于或等于0，并小于或等于GetUpperBound的返回值。
newElement | 新插入到该数组的对象指针，允许为空值。

说明：
在指定索引处放置数组元素。SetAt函数将不导致数组增长。如果希望数组自动增长，请使用SetAtGrow函数。
必须确保索引值代表了数组中有效的位置。如果越界，那么将出现库调试版本的断言。
下表列出了类似于CObArray::SetAt函数的其它成员函数。
类 成员函数
CByteArray | void SetAt( int nIndex, BYTE newElement );
CDWordArray | void SetAt( int nIndex, DWORD newElement );
CPtrArray | void SetAt( int nIndex, void* newElement );
CStringArray | void SetAt( int nIndex, LPCTSTR newElement );
CUIntArray | void SetAt( int nIndex, UINT newElement );
CWordArray | void SetAt( int nIndex, WORD newElement );

示例：
请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
// example for CObArray::SetAt
CObArray array;
CObject* pa;
array.Add( new CAge( 21 ) ); // Element 0
array.Add( new CAge( 40 ) ); // Element 1
if( ( pa = array.GetAt( 0 ) ) != NULL )
{
array.SetAt( 0, new CAge( 30 ) ); // Replace element 0.
delete pa; // Delete the original element at 0.
}
#ifdef _DEBUG
afxDump.SetDepth( 1 );
afxDump << "SetAt example: " << &array << "\n";
#endif
该程序的结果如下：
SetAt example: A CObArray with 2 elements
[0] = a CAge at $47E0 30
[1] = a CAge at $47A0 40

请参阅：
CObArray::GetAt, CObArray::SetAtGrow, CObArray::ElementAt, CObArray::operator []


 CObArray::SetAtGrow

void SetAtGrow( int nIndex, CObject* newElement );
throw( CMemoryException );

参数：
nIndex | 大于或等于0的整数索引值。
newElement | 新增到该数组的对象指针，该值允许为空值。

说明：
在指定索引处设定数组元素。如果必要，那么数组将自动增长（也就是说，数组上界将自动调节，以容纳新的元素）。
下表列出了类似于CObArray::SetAtGrow函数的其它成员函数。
类 成员函数
CByteArrayvoid SetAtGrow( int nIndex, BYTE newElement );
throw( CMemoryException );
CDWordArrayvoid SetAtGrow( int nIndex, DWORD newElement );
throw( CMemoryException );
CPtrArrayvoid SetAtGrow( int nIndex, void* newElement );
throw( CMemoryException );
CStringArrayvoid SetAtGrow( int nIndex, LPCTSTR newElement );
throw( CMemoryException );
CUIntArrayvoid SetAtGrow( int nIndex, UINT newElement );
throw( CMemoryException );
CWordArrayvoid SetAtGrow( int nIndex, WORD newElement );
throw( CMemoryException );

示例：
请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
// example for CObArray::SetAtGrow
CObArray array;
array.Add( new CAge( 21 ) ); // Element 0
array.Add( new CAge( 40 ) ); // Element 1
array.SetAtGrow( 3, new CAge( 65 ) ); // Element 2 deliberately // skipped
#ifdef _DEBUG
afxDump.SetDepth( 1 );
afxDump << "SetAtGrow example: " << &array << "\n";
#endif
该程序的结果如下：
SetAtGrow example: A CObArray with 4 elements
[0] = a CAge at $47C0 21
[1] = a CAge at $4800 40
[2] = NULL
[3] = a CAge at $4840 65

请参阅：
CObArray::GetAt, CObArray::SetAt, CObArray::ElementAt, CObArray::operator []


 CObArray::SetSize

void SetSize( int nNewSize, int nGrowBy = -1 );
throw( CMemoryException );

参数：
nNewSize | 数组新的大小值（元素数）。它必须大于或等于0。
nGrowBy | 如果要了解有关增加数组的大小，该值为要分配的元素位置的最小值。

说明：
设置一个空的或已存在的数组的大小值，并在必要的时候分配内存空间。若新值小于老值，那么数组将被截断，并且那些没有使用的内存将被释放。为了提高效率，最好在使用该函数前调用SetSize函数设置数组的大小。那么这将阻止每次增加新项时重新分配内存和拷贝数组。
当数组增长时，参数nGrowBy将影响内部内存分配。它将不影响GetSize和GetUpperBound决定的数组大小。
下表列出了类似于CObArray::SetSize函数的其它成员函数。
类 成员函数
CByteArrayvoid SetSize( int nNewSize, int nGrowBy = -1 );
throw( CMemoryException );
CDWordArrayvoid SetSize( int nNewSize, int nGrowBy = -1);
throw( CMemoryException );
CPtrArrayvoid SetSize( int nNewSize, int nGrowBy = -1);
throw( CMemoryException );
CStringArrayvoid SetSize( int nNewSize, int nGrowBy = -1 );
throw( CMemoryException );
CUIntArrayvoid SetSize( int nNewSize, int nGrowBy = -1 );
throw( CMemoryException );
CWordArrayvoid SetSize( int nNewSize, int nGrowBy =-1 );
throw( CMemoryException );


 CObArray::operator []

CObject& operator []( int nIndex );
CObject* operator []( int nIndex ) const;

说明：
这些下标操作可以便利地替换SetAt和GetAt函数。
第一种操作，调用不是常数的数组，它可以用于指定声明的左边（l值）或右边（r值）。第二种操作，调用的是常数数组，它仅仅可以用在公式的右边。
如果这些声明越界（不论在左边还是右边），都将出现库调试版本的断言。
下表列出了类似于CObArray::operator []操作的其它操作。
类 操作
CByteArrayBYTE& operator []( int nIndex );
BYTE operator []( int nIndex ) const;
CDWordArrayDWORD& operator []( int nIndex );
DWORD operator []( int nIndex ) const;
CPtrArrayvoid* & operator []( int nIndex );
void* operator []( int nIndex ) const;
CStringArrayCString& operator []( int nIndex );
CString operator []( int nIndex ) const;
CUIntArrayUINT& operator []( int nIndex );
UINT operator []( int nIndex ) const;
CWordArrayWORD& operator []( int nIndex );
WORD operator []( int nIndex ) const;

示例：
请参阅CObList::CObList，了解所有收集示例中使用的CAge类。
// example for CObArray::operator []
CObArray array;
CAge* pa;
array.Add( new CAge( 21 ) ); // Element 0
array.Add( new CAge( 40 ) ); // Element 1
pa = (CAge* )array[0]; // Get element 0
ASSERT( * pa == CAge( 21 ) ); // Get element 0
array[0] = new CAge( 30 ); // Replace element 0
delete pa;
ASSERT( * (CAge* )
array[0] == CAge( 30 ) ); // Get new element 0

请参阅：CObArray::GetAt, CObArray::SetAt


 CObject

CObject为Microsoft基础类库中主要的基类。它不仅用作库类，例如CFile和CObList的根，而且也是自己编写的类的根。CObject类提供了基本的服务，其中包括：
· | 支持串行化
· | 运行类信息
· | 对象诊断输出
· | 与收集类兼容
注意：CObject类不支持多继承。派生的类仅仅拥有一个CObject基类，并且CObject在等级体系中必须位于最左边。不过，它也允许在多继承分支的右边有其结构及非CObject派生类。
如果在类的执行与声明过程中使用了可选的宏，那么你将发现CObject派生的主要优点。
第一层次的宏，DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC，允许在等级体系中运行时访问类名及位置。这样，将允许依次地进行有意义的诊断转储。
第二层次的宏，DECLARE_SERIAL和IMPLEMENT_SERIAL，包含了第一层次宏的所有功能，并且能够使对象到“档案”有效地串行化。
如果要了解有关通常条件下派生的Microsoft基础类和C++类，以及如何使用CObject类的更多信息，请参阅联机文档“Visual C++程序员指南”中的“CObject类主题”及“串行化（对象永久化）”。
#include <afx.h>

CObject类的成员

构造函数
CObject | 缺省的构造函数
CObject | 拷贝构造函数
operator new | 特别的new操作
operator delete | 特别的delete操作
operator = | 赋值操作

诊断
AssertValid | 证实该对象的完整性
Dump | 进行该对象的诊断转储

串行化
IsSerializable | 测试该对象是否被串行化
Serialize | 从档案文件中装载或向档案文件中存储某对象

多面性
GetRuntimeClass | 返回对应该对象类的CRuntimeClass结构
IsKindOf | 测试该对象是否与指定类相关联


 CObject::AssertValid

virtual void AssertValid( ) const;

说明：
AssertValid通过检测内部状态，对对象进行有效性检查。在库的调试版本中，AssertValid将产生断言，发出消息，列出断言失败的行数和文件名并终止程序。
当你编写了自己的类后，应当调用覆盖AssertValid函数，来为你自己和使用你的类的用户提供诊断服务。被覆盖的AssertValid在检测对应于派生类的数据成员之前，通常调用它的基类的AssertValid函数。
由于AssertValid为一个常量函数，那么在测试期间，不允许改变对象的状态。自己派生类的AssertValid函数不应当产生异常，而应当断言是否检测到无效的对象数据。
“有效性”的诊断依赖于对象的类。作为规则，函数应当执行“浅度检测”（“shallow check”），也就是说，如果一个对象包含了其它对象的指针，那么它应当进行检测，以查看指针是否为空，而不是对指针指向的对象进行有效性测试。

示例：请参阅CObList::CObList，了解所有CObject示例中使用的CAge类。
// example for CObject::AssertValid
void CAge::AssertValid() const
{
CObject::AssertValid();
ASSERT( m_years > 0 );
ASSERT( m_years < 105 );
}


 CObject::CObject

CObject( );
CObject( const CObject& objectSrc );

参数：
objectSrc 另一个CObject对象的参考。

说明：
上述函数为标准的CObject构造函数。通过派生类的构造函数自动调用该函数的缺省形式。
如果你的类可串行化（它引入了IMPLEMENT_SERIAL宏），那么在类的派生中必须使用缺省的构造函数（即没有参数的构造函数）。若不需要缺省的构造函数，请事先声明私有的和受保护的“空”构造函数。如果需要更多信息，请参阅联机文档“Visual C++程序员指南”中的“CObject类主题”。
标准C++缺省类拷贝构造函数进行的是成员对成员的拷贝。如果需要你自己类的拷贝构造函数但现在没有，那么私有的CObject拷贝构造函数的存在将保证编译器发出错误消息。因此，若你的类需要这种能力，就必须提供拷贝构造函数。


 CObject::Dump

virtual void Dump( CDumpContext& dc ) const;

参数：
dc 用于转储的诊断性转储文本，通常该值为afxDump。

说明：
将对象的内容转储到CDumpContext 对象中。
当编写了自己的类后，应当覆盖Dump函数，来为你自己和使用你的类的用户提供诊断服务。被覆盖的Dump在打印对应于派生类的数据成员之前，通常调用它基类的Dump函数。如果你的类使用了IMPLEMENT_DYNAMIC和IMPLEMENT_SERIAL宏，那么CObject::Dump将打印类名。
注意：Dump函数在输出末尾不应打印换行符。
Dump调用仅仅在Microsoft基础类库的调试版本中有意义。对于有条件的编译，应当使用#ifdef _DEBUG/#endif声明将函数调用、函数声明、及函数执行括起来。
既然Dump为一个常量函数，那么在转储期间不允许改变对象的状态。当插入了CObject指针，CDumpContext插入(<<)操作符将调用Dump函数。
Dump仅仅允许进行对象的“非周期”转储。例如，可以转储一系列对象，但假如其中一个对象就是列表本身，那么最终将导致栈溢出。

示例：请参阅CObList::CObList，了解所有CObject示例中使用的CAge类。
// example for CObject::Dump
void CAge::Dump( CDumpContext &dc ) const
{
CObject::Dump( dc );
dc << "Age = " << m_years;
}


 CObject::GetRuntimeClass

virtual CRuntimeClass* GetRuntimeClass( ) const;

返回值：返回对应于该对象类的CRuntimeClass结构的指针，不会为NULL。

说明：
对于每个CObject派生的类，都有一个CRuntimeClass结构。该结构成员如下：
· | LPCSTR m_lpszClassName | 包含ASCII类名的以空值为终止符的字符串。
· | int m_nObjectSize | 以字节数表示的对象的大小。如果对象有指向分配内存的数据成员，那么将不包括内存的大小。
· | UINT m_wSchema | 图解号（对于非串行化类，该值为-1）。请参阅IMPLEMENT _SERIAL宏以获取图解号的详细描述。
·CObject* ( PASCAL* m_pfnCreateObject )( )
指向缺省构造函数的函数指针，用于创建你自己类的对象（仅仅当类支持动态创建时有效，否则将返回NULL)。

·CRuntimeClass* ( PASCAL* m_pfn_GetBaseClass )( )
如果应用动态链接到MFC的AFXDLL形式，那么将返回基类CRuntimeClass结构的函数指针。

·CRuntimeClass* m_pBaseClass如果应用静态地链接到MFC，那么将返回基类CRuntimeClass结构的指针。
专业和企业版中独有的功能 仅仅Visual C++专业和企业版支持静态地链接到MFC中。如果需要更多信息，请参阅Visual C++ Editions。
该函数在类的执行过程中需要使用IMPLEMENT_DYNAMIC或IMPLEMENT_SERIAL宏，否则，将得不到正确的结果。

示例：请参阅CObList::CObList，了解所有CObject示例中使用的CAge类。
// example for CObject::GetRuntimeClass
CAge a(21);
CRuntimeClass* prt = a.GetRuntimeClass();
ASSERT( strcmp( prt->m_lpszClassName, "CAge" ) == 0 );

请参阅：CObject::IsKindOf, RUNTIME_CLASS


 CObject::IsKindOf

BOOL IsKindOf( const CRuntimeClass* pClass ) const;

返回值：如果对象对应于该类，则返回非零值，否则为0。

参数：
pClass 指向与CObject派生类相关联的CRuntimeClass结构的指针。

说明：
检测pClass来查看：(1)对象是否属于指定的类，(2)对象是否属于指定类派生的类。该函数仅仅当类声明了DECLARE_DYNAMIC或DECLARE_SERIAL宏时有效。
不要过多地使用该函数，其原因在于它破坏了C++多形性功能。相反，请使用虚函数。

示例：请参阅CObList::CObList，了解所有CObject示例中使用的CAge类。
// example for CObject::IsKindOfCAge a(21);
// Must use IMPLEMENT_DYNAMIC or IMPLEMENT_SERIAL
ASSERT( a.IsKindOf( RUNTIME_CLASS( CAge ) ) );
ASSERT( a.IsKindOf( RUNTIME_CLASS( CObject ) ) );

请参阅：
CObject::GetRuntimeClass, RUNTIME_CLASS, CObject Class:Accessing Run-Time Class Information


 CObject::IsSerializable

BOOL IsSerializable( ) const;

返回值：如果该对象可被串行化，则返回非零值，否则为0。

说明：
测试该对象是否有资格被串行化。对于被串行化的类，声明中必须包含DECLARE_SERIAL宏，并且在执行过程中必须包含IMPLEMENT_SERIAL宏。注意：不可覆盖该函数。

示例：请参阅CObList::CObList，了解所有CObject示例中使用的CAge类。
// example for CObject::IsSerializable
CAge a(21);
ASSERT( a.IsSerializable() );

请参阅：CObject::Serialize


 CObject::Serialize

virtual void Serialize( CArchive& ar );
throw( CMemoryException );
throw( CArchiveException );
throw( CFileException );

参数：
ar 被串行化的CArchive对象。

说明：
从档案文件中读取该对象或向档案文件中写入该对象。
必须为希望串行化的每个类覆盖Serialize。被覆盖的Serialize首先必须调用基类的Serialize函数。
在类的声明中必须使用DECLARE_SERIAL宏，并且在类的执行过程中也必须使用IMPLEMENT_SERIAL宏。
使用CArchive::IsLoading或CArchive::IsStoring函数，用于决定是否装载或存储了档案文件。
通过CArchive::ReadObject和CArchive::WriteObject来调用Serialize函数。这些函数与CArchive插入操作符(<<)和抽出操作符(>>)相关联。
如果要了解有关串行化的例子，请参阅联机文档“Visual C++程序员指南” 中的“串行化（对象永久化）”。

示例：请参阅ObList::CObList，了解所有CObject示例中使用的CAge类。
// example for CObject::Serialize
void CAge::Serialize( CArchive& ar )
{
CObject::Serialize( ar );
if( ar.IsStoring() ) ar << m_years;
else ar >> m_years;
}


 CObject::operator =

void operator =( const CObject& src );

说明：
标准C++缺省类赋值的行为是成员对成员的拷贝。如果你没有使用覆盖操作进行赋值，那么这种私有赋值操作将保证编译器发出错误消息。因此，当你要赋值派生类的对象时，必须为派生类提供赋值操作。


 CObject::operator new

void* operator new( size_t nSize );
throw( CMemoryException );
void* operator new( size_t nSize, LPCSTR lpszFileName, int nLine );
throw( CMemoryException );

说明：
对于库的发行版，new操作按类似于malloc的方式进行最佳的内存分配。在调试版中，new操作参与了分配内存的监视，以用于检测内存空洞。
如果你使用了这样一行代码：
#define new DEBUG_NEW
在执行.CPP文件前，将使用第二种形式的new，用于存储后来报告的内存块中的文件名和行数。不必担心如何提供额外的参数，宏将自动完成这个任务。
即便在调试版中没有使用DEBUG_NEW，仍旧可以获得空洞检测，但是在上面描述的报告中没有源文件行数。
注意：如果覆盖了该操作，那么也必须覆盖delete操作。不要使用标准的_new_handler库函数。

请参阅：CObject::operator delete


 CObject::operator delete

void operator delete( void* p );

说明：
对于库的发行版，delete操作仅仅释放由new操作分配的内存。在调试版中，delete操作参与了分配监视计划，以用于检测内存空洞。如果已经覆盖了new和delete操作，那么你将丧失诊断功能。

请参阅：CObject::operator new


 CObList

CObject
└CObList

CObList类支持非唯一的CObject指针，并可顺次访问或通过指针值访问有序列表。CObList列表的行为类似于双向链接列表。
POSITION类型的变量为列表的键。使用POSITION变量，既可以作为列表循环中的循环变量，也可以作为标记某个位置的标签。不过，位置并不等同于索引。
在列表头、列表尾以及在指定的位置上，进行插入元素都非常便捷。一个顺序的搜索对于通过值或索引查找元素非常必要。如果这种列表很长，那么搜索速度将非常慢。
CObList引入了IMPLEMENT_SERIAL宏，从而支持其元素的串行化与转储。如果一系列的CObject指针被存储于档案文件中，那么使用加载插入操作符或使用Serialize成员函数，每个CObject元素都将被串行化。如果需要转储列表中个别CObject元素的转储，那么必须将转储内容的深度设置为1或更大。
当删除了对象或其元素，那么被删除的仅仅是CObject指针，而不是它们参考的对象。
可以从CObList派生自己的类。新的列表类，用于包含从CObject派生对象的指针，它将增添新的数据成员及新的成员函数。注意，结果列表并不是严格的类型安全，其原因在于它允许插入任何的CObject指针。
注意：
如果你希望串行化列表，那么在你自己的类的执行过程中必须使用IMPLEMENT_SERIAL宏。
如果要了解有关使用CObList的更多信息，请参阅联机文档“Visual C++程序员指南”中的“收集”。
下面列出了同CObList类的成员函数较为相似的类：
·CPtrList
·CStringList

#include <afxcoll.h>
请参阅：CStringList, CPtrList

CObList类的成员

构造函数
CObList 为CObject指针构造一个空的列表

首或尾访问
GetHead | 返回列表中的首元素（列表不能为空）
GetTail | 返回列表中的尾元素（列表不能为空）

操作
RemoveHead | 从列表首删除元素
RemoveTail | 从列表尾删除元素
AddHead | 在列表首增加一个元素或另一个列表的所有元素（并产生一个新的列表首）
AddTail | 在列表尾增加一个元素或另一个列表的所有元素（并产生一个新的列表尾）
RemoveAll | 删除列表中所有的元素

循环
GetHeadPosition | 返回列表中首元素的位置
GetTailPosition | 返回列表中尾元素的位置
GetNext | 获取循环遍历中的下一个元素
GetPrev | 获取循环遍历中的前一个元素

检索/修改
GetAt | 获取指定位置的元素
SetAt | 设置指定位置的元素
RemoveAt | 从列表中删除指定位置的元素

插入
InsertBefore | 在给定位置之前新插入一个元素
InsertAfter | 在给定位置之后新插入一个元素

搜索
Find | 获取由指针值指定元素的位置
FindIndex | 获取由以零尾基数索引指定元素的位置

状态
GetCount | 返回列表中的元素数
IsEmpty | 测试是否为空列表（没有元素）


 CObList::AddHead

POSITION AddHead( CObject* newElement );
throw( CMemoryException );
void AddHead( CObList* pNewList );
throw( CMemoryException );

返回值：
第一种版本返回新插入元素的POSITION值。

参数：
newElement | 新插入到该列表的CObject指针。
pNewList | 另一个CObList列表的指针。pNewList中的元素将被添加到列表中。

说明：
在列表头添加一个或一列新元素。在操作前该列表可以为空。

示例：
CObList list;
list.AddHead( new CAge( 21 ) ); // 21 is now at head.
list.AddHead( new CAge( 40 ) ); // 40 replaces 21 at head.
#ifdef _DEBUG
afxDump.SetDepth( 1 );
afxDump << "AddHead example: " << &list << "\n";
#endif

该程序的结果如下：
AddHead example: A CObList with 2 elements
a CAge at $44A8 40
a CAge at $442A 21

请参阅：CObList::GetHead, CObList::RemoveHead


 CObList::AddTail

POSITION AddTail( CObject* newElement );
throw( CMemoryException );
void AddTail( CObList* pNewList );
throw( CMemoryException );

返回值：
第一种版本返回新插入元素的POSITION值。

参数：
newElement | 新插入到该列表的CObject指针。
pNewList | 另一个CObList列表的指针。pNewList中的元素将被添加到列表中。

说明：
在列表尾添加一个新元素或一列新元素。在操作前该列表可以为空。

示例：
CObList list;
list.AddTail( new CAge( 21 ) );
list.AddTail( new CAge( 40 ) ); // List now contains (21, 40).
#ifdef _DEBUG
afxDump.SetDepth( 1 );
afxDump << "AddTail example: " << &list << "\n";
#endif

该程序的结果如下：
AddTail example: A CObList with 2 elements
a CAge at $444A 21
a CAge at $4526 40

请参阅：CObList::GetTail, CObList::RemoveTail


 CObList::CObList

CObList( int nBlockSize = 10 );

参数：
nBlockSize 扩展列表所需的内存分配的粒度大小。

说明：
构造一个空CObject指针列表。当列表增大后，以nBlockSize为单位分配内存。若内存分配失败，那么将产生CMemoryException。

示例：
下面列出CObject派生类CAged，它用于所有收集示例中：
// Simple CObject-derived class for CObList examples
class CAge : public CObject
{
DECLARE_SERIAL( CAge )
private:
int m_years;
public:
CAge() { m_years = 0; }
CAge( int age ) { m_years = age; }
CAge( const CAge& a ) { m_years = a.m_years; } // Copy constructor
void Serialize( CArchive& ar);
void AssertValid() const;
const CAge& operator = ( const CAge& a )
{
m_years = a.m_years; return *this;
}

BOOL operator==(CAge a)
{
return m_years == a.m_years;
}
void* operator new(size_t nSize);
void* operator new(size_t nSize, LPCSTR lpszFileName, int nLine);
void operator delete(void* p);
void operator delete(void* p, LPCSTR lpszFileName, int nLine);

#ifdef _DEBUG
void Dump( CDumpContext& dc ) const
{
CObject::Dump( dc );
dc << m_years;
}
#endif
};

下面为CObList构造函数用法的例子：
CObList list( 20 ); // List on the stack with blocksize = 20.
CObList* plist = new CObList; // List on the heap with default blocksize.


 CObList::Find

POSITION Find( CObject* searchValue, POSITION startAfter = NULL ) const;

返回值：
返回用于循环或对象指针获取的POSITION值，如果没有找到该对象，则返回NULL。

参数：
searchValue | 需要在列表中寻找的对象指针。
startAfter | 用于查询的起始位置。

说明：
顺序搜索列表，以查找第一个与指定CObject指针匹配的CObject指针。注意，进行比较的是指针值，而不是对象的内容。

示例：
CObList list;
CAge* pa1;
CAge* pa2;
POSITION pos;
list.AddHead( pa1 = new CAge( 21 ) );
list.AddHead( pa2 = new CAge( 40 ) ); // List now contains (40, 21).
if( ( pos = list.Find( pa1 ) ) != NULL ) // Hunt for pa1 starting at head by default.
{
ASSERT( *(CAge*) list.GetAt( pos ) == CAge( 21 ) );
}

请参阅：CObList::GetNext, CObList::GetPrev


 CObList::FindIndex

POSITION FindIndex( int nIndex ) const;

返回值：
返回用于循环或对象指针获取的POSITION值，否则nIndex值太大，则返回NULL（如果nIndex值为负值，那么框架将产生断言）。

参数：
nIndex 要查找的以0为基数的列表元素的索引，

说明：
使用nIndex值作为列表的索引。它将从列表首进行顺序扫描，并在第n个元素停止。

示例：
CObList list;
POSITION pos;

list.AddHead( new CAge( 21 ) );
list.AddHead( new CAge( 40 ) ); // List now contains (40, 21).
if( ( pos = list.FindIndex( 0 )) != NULL )
{
ASSERT( *(CAge*) list.GetAt( pos ) == CAge( 40 ) );
}

请参阅：
CObList::Find, CObList::GetNext, CObList::GetPrev


 CObList::GetAt

CObject*& GetAt( POSITION position );
CObject* GetAt( POSITION position ) const;

返回值：请参阅GetHead返回值的描述。

参数：
position 由前一个GetHeadPosition或Find成员函数调用返回的POSITION值。

说明：
POSITION类型的变量为列表的键。它与索引不同，你自己不能操作POSITION值。GetAt函数将获取与给定位置相关联的CObject指针。
必须确保POSITION值代表一个列表中有效位置。若其无效，那么Microsoft基础类库的调试版将发出错误警告。

示例：请参阅FindIndex的例子。

请参阅：
CObList::Find, CObList::SetAt, CObList::GetNext, CObList::GetPrev, CObList::GetHead


 CObList::GetCount

int GetCount( ) const;

返回值：返回包含元素数的整数值。

说明：获取列表中的元素数。

示例：
CObList list;
list.AddHead( new CAge( 21 ) );
list.AddHead( new CAge( 40 ) ); // List now contains (40, 21).
ASSERT( list.GetCount() == 2 );

请参阅：CObList::IsEmpty


 CObList::GetHead

CObject*& GetHead( );
CObject* GetHead( ) const;

返回值：
如果通过指向常量CObList的指针访问列表，那么GetHead将返回一个CObject指针。这将允许函数用于设定赋值的右边，并因此检测修改后的列表。
如果直接访问列表或通过指向CObList的指针进行访问列表，那么GetHead将返回一个CObject指针的参考。它允许函数用于赋值的两边，并因此修改列表入口。

说明：
获取代表列表首元素的CObject指针。
在调用GetHead函数之前，必须确保列表非空。如果列表为空，Microsoft基础类库的调试版将发出错误警告。请使用IsEmpty以证实列表中包含元素。

示例：
下面的例子说明了GetHead在赋值左边的用法。
const CObList* cplist;
CObList* plist = new CObList;
CAge* page1 = new CAge( 21 );
CAge* page2 = new CAge( 30 );
CAge* page3 = new CAge( 40 );
plist->AddHead( page1 );
plist->AddHead( page2 ); // List now contains (30, 21).
// The following statement REPLACES the head element.
plist->GetHead() = page3; // List now contains (40, 21).
ASSERT( *(CAge*) plist->GetHead() == CAge( 40 ) );
cplist = plist; // cplist is a pointer to a const list.
// cplist->GetHead() = page3; // Error: can't assign a pointer to a const list
ASSERT( *(CAge*) plist->GetHead() == CAge( 40 ) ); // OK delete page1;
delete page2;
delete page3;
delete plist; // Cleans up memory.

请参阅：
CObList::GetTail, CObList::GetTailPosition, CObList::AddHead, CObList::RemoveHead


 CObList::GetHeadPosition

POSITION GetHeadPosition( ) const;

返回值：
返回用于循环或使用对象指针获取的POSITION值，如果列表为空，那么返回NULL。

说明：获取该列表首元素的位置。

示例：
CObList list;
POSITION pos;
list.AddHead( new CAge( 21 ) );
list.AddHead( new CAge( 40 ) ); // List now contains (40, 21).
if( ( pos = list.GetHeadPosition() ) != NULL )
{
ASSERT( *(CAge*) list.GetAt( pos ) == CAge( 40 ) );
}

请参阅：CObList::GetTailPosition


 CObList::GetNext

CObject*& GetNext( POSITION& rPosition );
CObject* GetNext( POSITION& rPosition ) const;

返回值：请参阅GetHead函数返回值的描述。

参数：
rPosition 由前一个GetNext，GetHeadPosition或其它成员函数调用返回的POSITION值的参考。

说明：
获取由rPosition标识的列表元素，然后将rPosition设置为列表下一个入口的POSITION值。可以在前向遍历中使用GetNext函数，其条件是调用GetHeadPosition或Find函数建立初始位置。
必须确保POSITION值代表列表中的一个有效位置，否则，在Microsoft基础类库的调试版将发出错误警告。
如果要获取的元素是列表中最后一个，那么rPosition的新值将被设置为空。
在进行循环的过程中也有可能删除某些元素。请参阅RemoveAt的例子。

示例：
CObList list;
POSITION pos;
list.AddHead( new CAge( 21 ) );
list.AddHead( new CAge( 40 ) ); // List now contains (40, 21).
// Iterate through the list in head-to-tail order.
#ifdef _DEBUG
for( pos = list.GetHeadPosition(); pos != NULL; )
{
afxDump << list.GetNext( pos ) << "\n";
}
#endif

该程序的结果如下：
a CAge at $479C 40
a CAge at $46C0 21

请参阅：
CObList::Find, CObList::GetHeadPosition, CObList::GetTailPosition, CObList::GetPrev, CObList::GetHead


 CObList::GetPrev

CObject*& GetPrev( POSITION& rPosition );
CObject* GetPrev( POSITION& rPosition ) const;

返回值：请参阅GetHead函数返回值的描述。

参数：
rPosition 返回通过前一个GetPrev函数或其它成员函数调用返回的POSITION值的参考。

说明：
获取由rPosition标识的列表元素，然后将rPosition设置为列表下一个入口的POSITION值。你可以在后向循环中使用GetPrev函数，其条件是调用GetHeadPosition或Find函数建立初始位置。
必须确保POSITION值代表列表中的一个有效的位置，否则，在Microsoft基础类库的调试版将发出错误警告。
如果要获取的元素是列表中第一个，那么rPosition的新值将被设置为NULL。

示例：
CObList list;
POSITION pos;

list.AddHead( new CAge(21) );
list.AddHead( new CAge(40) ); // List now contains (40, 21).
// Iterate through the list in tail-to-head order.
for( pos = list.GetTailPosition(); pos != NULL; )
{
#ifdef _DEBUG
afxDump << list.GetPrev( pos ) << "\n";
#endif
}

该程序的结果如下：
a CAge at $421C 21
a CAge at $421C 40

请参阅：
CObList::Find, CObList::GetTailPosition, CObList::GetHeadPosition, CObList::GetNext, CObList::GetHead


 CObList::GetTail

CObject*& GetTail( );
CObject* GetTail( ) const;

返回值：请参阅GetHead函数返回值的描述。

说明：
获取代表列表尾元素的CObject指针。
在调用GetHead函数之前，必须确保列表非空。如果列表为空，在Microsoft基础类库的调试版将发出错误警告。请使用IsEmpty以证实列表中包含元素。

示例：
CObList list;
list.AddHead( new CAge( 21 ) );
list.AddHead( new CAge( 40 ) ); // List now contains (40, 21).
ASSERT( *(CAge*) list.GetTail() == CAge( 21 ) );

请参阅：
CObList::AddTail, CObList::AddHead, CObList::RemoveHead, CObList::GetHead


 CObList::GetTailPosition

POSITION GetTailPosition( ) const;

返回值：
返回用于循环遍历或使用对象指针获取的POSITION值，如果列表为空，那么返回NULL。

说明：
获取该列表尾元素的位置。如果列表为空，那么返回NULL。

示例：
CObList list;
POSITION pos;
list.AddHead( new CAge( 21 ) );
list.AddHead( new CAge( 40 ) ); // List now contains (40, 21).
if( ( pos = list.GetTailPosition() ) != NULL )
{
ASSERT( *(CAge*) list.GetAt( pos ) == CAge( 21 ) );
}

请参阅：CObList::GetHeadPosition, CObList::GetTail


 CObList::InsertAfter

POSITION InsertAfter( POSITION position, CObject* newElement );
throw( CMemoryException );

参数：
position | 由前面调用的GetNext, GetPrev或 Find 等成员函数返回的POSITION值。
newElement | 指向要添加到该列表的对象指针。

说明：
在指定位置的元素后添加一个元素到列表中。

示例：
CObList list;
POSITION pos1, pos2;
list.AddHead( new CAge( 21 ) );
list.AddHead( new CAge( 40 ) ); // List now contains (40, 21).
if( ( pos1 = list.GetHeadPosition() ) != NULL )
{
pos2 = list.InsertAfter( pos1, new CAge( 65 ) );
}
#ifdef _DEBUG
afxDump.SetDepth( 1 );
afxDump << "InsertAfter example: " << &list << "\n";
#endif

该程序的结果如下：
InsertAfter example: A CObList with 3 elements
a CAge at $4A44 40
a CAge at $4A64 65
a CAge at $4968 21

请参阅：CObList::Find, CObList::InsertBefore


 CObList::InsertBefore

POSITION InsertBefore( POSITION position, CObject* newElement );
throw( CMemoryException );

返回值：
可用于迭代或对象指针检索的 POSITION 值。若列表为空，则返回NULL 。

参数：
position | 由前面调用的GetNext, GetPrev或Find等成员函数返回的POSITION值。
newElement | 指向要添加到该列表的对象指针。

说明：
在指定位置的元素前添加一个元素到列表中。

示例：
CObList list;
POSITION pos1, pos2;
list.AddHead( new CAge( 21 ) );
list.AddHead( new CAge( 40 ) ); // List now contains (40, 21).
if( ( pos1 = list.GetTailPosition() ) != NULL )
{
pos2 = list.InsertBefore( pos1, new CAge( 65 ) );
}
#ifdef _DEBUG
afxDump.SetDepth( 1 );
afxDump << "InsertBefore example: " << &list << "\n";
#endif

该程序的结果如下：
InsertBefore example: A CObList with 3 elements
a CAge at $4AE2 40
a CAge at $4B02 65
a CAge at $49E6 21

请参阅：CObList::Find, CObList::InsertAfter


 CObList::IsEmpty

BOOL IsEmpty( ) const;

返回值：若列表为空，则返回非零值；否则为0。

说明：指示该列表是否为空。

示例：请参阅RemoveAll的示例。

请参阅：CObList::GetCount


 CObList::RemoveAll

void RemoveAll( );

说明：
从该列表中删除所有元素并释放与CObList关联的内存。若列表已经为空，也不产生错误。
当从CObList中删除元素时, 仅从列表中删除对象指针，对象本身得由自己删除。

示例：
CObList list;
CAge* pa1;
CAge* pa2;
ASSERT( list.IsEmpty()); // Yes it is.
list.AddHead( pa1 = new CAge( 21 ) );
list.AddHead( pa2 = new CAge( 40 ) ); // List now contains (40, 21).
ASSERT( !list.IsEmpty()); // No it isn't.
list.RemoveAll(); // CAge's aren't destroyed.
ASSERT( list.IsEmpty()); // Yes it is.
delete pa1; // Now delete the CAge objects.
delete pa2;


 CObList::RemoveAt

void RemoveAt( POSITION position );

参数：
position 要从列表中删除的元素的位置。

说明：
从列表中删除指定的元素。
当从CObList中删除元素时, 仅从列表中删除对象指针。对象本身得由自己删除。
必须保证所给的POSITION 值指向列表的一个有效的位置。若位置值无效，则MFC库（Microsoft Foundation Class Library）的调试版本将就此给出警告声明。

示例：
在列表迭代过程中删除一元素时要特别注意。下面的示例给出了能确保GetNext取到一个有效的POSITION值的删除技术。
CObList list;
POSITION pos1, pos2;
CObject* pa;

list.AddHead( new CAge( 21 ) );
list.AddHead( new CAge( 40 ) );
list.AddHead( new CAge( 65 ) ); // List now contains (65 40, 21).
for( pos1 = list.GetHeadPosition(); ( pos2 = pos1 ) != NULL; )
{
if( *(CAge*) list.GetNext( pos1 ) == CAge( 40 ) )
{
pa = list.GetAt( pos2 ); // Save the old pointer for deletion.

list.RemoveAt( pos2 );
delete pa; // Deletion avoids memory leak.
}
}
#ifdef _DEBUG
afxDump.SetDepth( 1 );
afxDump << "RemoveAt example: " << &list << "\n";
#endif

该程序的结果如下：
RemoveAt example: A CObList with 2 elements
a CAge at $4C1E 65
a CAge at $4B22 21


 CObList::RemoveHead

CObject* RemoveHead( );

返回值：指向原先在列表头的CObject指针。

说明：
删除列表的头部元素并返回它的指针。
在调用RemoveHead之前，必须保证列表是非空的。否则，MFC库（Microsoft Foundation Class Library）的调试版本将就此给出警告声明。可用IsEmpty函数来检验列表中是否包含元素。

示例：
CObList list;
CAge* pa1;
CAge* pa2;
list.AddHead( pa1 = new CAge( 21 ) );
list.AddHead( pa2 = new CAge( 40 ) ); // List now contains (40, 21).
ASSERT( *(CAge*) list.RemoveHead() == CAge( 40 ) ); // Old head
ASSERT( *(CAge*) list.GetHead() == CAge( 21 ) ); // New head
delete pa1;
delete pa2;

请参阅：CObList::GetHead, CObList::AddHead


 CObList::RemoveTail

CObject* RemoveTail( );

返回值：指向列表尾部对象的指针。

说明：
删除列表的尾部元素并返回它的指针。
在调用RemoveTail 之前，必须保证列表是非空的。否则，MFC库（Microsoft Foundation Class Library）的调试版本将就此给出警告声明。可用IsEmpty函数来检验列表中是否包含元素。

示例：
CObList list;
CAge* pa1;
CAge* pa2;

list.AddHead( pa1 = new CAge( 21 ) );
list.AddHead( pa2 = new CAge( 40 ) ); // List now contains (40, 21).
ASSERT( *(CAge*) list.RemoveTail() == CAge( 21 ) ); // Old tail
ASSERT( *(CAge*) list.GetTail() == CAge( 40 ) ); // New tail
delete pa1;
delete pa2; // Clean up memory.

请参阅：CObList::GetTail, CObList::AddTail


 CObList::SetAt

void SetAt( POSITION pos, CObject* newElement );

参数：
pos | 元素所要设定的POSITION值。
newElement | 要写入列表的CObject指针。

说明：
一个类型为 POSITION 的变量是列表的一个键值。不同于索引的是， 不能对POSITION 值执行操作。 SetAt 将把给定的CObject 指针写到列表中的指定位置。
必须确保所给的POSITION值指向列表中的一个有效位置。否则，MFC库（Microsoft Foundation Class Library）的调试版本将就此给出警告声明。

示例：
CObList list;
CObject* pa;
POSITION pos;

list.AddHead( new CAge( 21 ) );
list.AddHead( new CAge( 40 ) ); // List now contains (40, 21).
if( ( pos = list.GetTailPosition()) != NULL )
{
pa = list.GetAt( pos ); // Save the old pointer for deletion.
list.SetAt( pos, new CAge( 65 ) ); // Replace the tail element.
delete pa; // Deletion avoids memory leak.
}
#ifdef _DEBUG
afxDump.SetDepth( 1 );
afxDump << "SetAt example: " << &list << "\n";
#endif

该程序的结果如下：
SetAt example: A CObList with 2 elements
a CAge at $4D98 40
a CAge at $4DB8 65

请参阅：
CObList::Find, CObList::GetAt, CObList::GetNext, CObList::GetPrev


 COleBusyDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog
└COleDialog
└COleBusyDialog

COleBusyDialog类是在OLE服务器没有响应或服务器忙时使用的对话框。当要调用这些对话框时，首先创建COleBusyDialog类的一个对象，然后，可以用m_bz结构初始化对话框内的控件的值或状态。结构m_bz的类型是OLEUIBUSY。关于使用该对话框的信息，请参阅DoModal成员函数。
注意：由AppWizard生成的包容器代码使用该类。
要了解更多的信息，请参阅“OLE 2.01用户界面库（User Interface Library）”中的OLEUIBUSY结构。
有关OLE特性对话框的信息，请参阅联机文档“Visual C++程序员指南”中的 “OLE中的对话框”。
#include <afxodlgs.h>
请参阅：COleDialog

COleBusyDialog类的成员

数据成员
m_bz 控制对话框行为的OLEUIBUSY结构

构造函数
COleBusyDialog 构造一个COleBusyDialog对象

操作
DoModal | 显示OLE服务器忙对话框
GetSelectionType | 判定对该对话框所作的选择类型


 COleBusyDialog::COleBusyDialog

COleBusyDialog( HTASK htaskBusy, BOOL bNotResponding = FALSE, DWORD dwFlags = 0, CWnd* pParentWnd = NULL );

参数：
htaskBusy | 当前忙的服务器任务句柄。
bNotResponding | 其值为TRUE，调用服务器没有响应对话框，否则调用服务器忙对话框。在服务器没有响应对话框中，措词与服务器忙对话框有些不同，并且“取消”（Cancel）按钮不可用。
dwFlags创建标志。可以包含零个或多个下列值的位或运算。
· | BZ_DISABLECANCELBUTTON | 调用对话框时使“取消”（Cancel）按钮不可用。
· | BZ_DISABLESWITCHTOBUTTON | 调用对话框时使“切换”（Switch To）按钮不可用。
· | BZ_DISABLERETRYBUTTON | 调用对话框时使“重试”（Retry）按钮不可用。
pParentWnd | 指向该对话框对象所属的父窗口或属主窗口对象的指针。如果为NULL，该对话框的父窗口被设置为主应用窗口。

说明：
该函数仅用于构造COleBusyDialog对象。请调用DoModal函数来显示该对话框窗口。
要了解更多的信息，请参阅“OLE 2.01用户界面库（User InterfaceLibrary）”中的OLEUIBUSY结构。

请参阅：COleBusyDialog::DoModal


 COleBusyDialog::DoModal

virtual int DoModal( ) const;

返回值：
对话框的完成状态。它可以是下列值：
· | IDOK | 若对话框成功显示。
· | IDCANCEL | 如果用户取消了该对话框。
· | IDABORT | 若出错。如果返回IDABORT，可调用COleDialog::GetLastError成员函数以取得关于出错类型的相关信息。关于所有可能出现的错误的列表清单，请参阅“OLE 2.01 用户界面库（User Interface Library）”中的OleUIBusy函数。

说明：
调用该函数，以显示OLE服务器忙或服务器没有响应对话框。
如果要通过调整m_bz结构的值来初始化对话框中的控件状态，必须在调用DoModal之前，构造对话框对象之后完成此项工作。
如果DoModal返回IDOK，可以调用其它成员函数获取用户在对话框中输入的设置或信息。

请参阅：
COleDialog::GetLastError, CDialog::DoModal, COleBusyDialog::GetSelectionType, COleBusyDialog::m_bz


 COleBusyDialog::GetSelectionType

UINT GetSelectionType( );

返回值：所作的选择类型。

说明：
调用该函数以取得用户在服务器忙对话框中所作的选择类型。
返回类型在定义在COleBusyDialog类的Selection枚举类型中说明。
enum Selection
{
switchTo,
retry,
callUnblocked
};
下面是这些值的简要说明：
· | COleBusyDialog::switchTo | 用户选择了“切换”（Switch To）按钮。
· | COleBusyDialog::retry | 用户选择了“重试”（Retry）按钮。
· | COleBusyDialog::callUnblocked | 激活服务器的调用未被成块。

请参阅：COleBusyDialog::DoModal


 COleBusyDialog::m_bz

说明：
它是类型为OLEUIBUSY的结构，用以控制服务器忙对话框的行为。该结构的成员可以直接被修改，也可以通过调用成员函数来修改它。
要了解更多的信息，请参阅“OLE 2.01用户界面库（User Interface Library）”中的OLEUIBUSY结构。

请参阅：COleBusyDialog::COleBusyDialog, COleBusyDialog::DoModal


 COleChangeIconDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog
└COleDialog
└COleChangeIconDialog

COleChangeIconDialog类用于OLE变换图标对话框。当要调用该对话框时，首先创建类COleChangeIconDialog的一个对象，然后，可以用m_cs结构初始化对话框内的控件的值或状态。结构m_ci的类型是OLEUICHANGEICON。关于使用该对话框的信息，请参阅DoModal成员函数。
要了解更多的信息，请参阅“OLE 2.01用户界面库（User Interface Library）”中的OLEUICHANGEICON结构。
有关OLE特性对话框的信息，请参阅联机文档“Visual C++程序员指南”中的 “OLE中的对话框”。
#include <afxodlgs.h>
请参阅：COleDialog

COleChangeIconDialog类的成员

数据成员
m_ci 控制对话框行为的结构

构造函数
COleChangeIconDialog 构造一个COleChangeIconDialog对象

操作和属性
DoModal | 显示OLE 2变换图标对话框
DoChangeIcon | 执行在对话框中说明的变换
GetIconicMetafile | 取得和该项图标窗体相关联的元文件的句柄


 COleChangeIconDialog::COleChangeIconDialog

COleChangeIconDialog( COleClientItem* pItem, DWORD dwFlags = CIF_SELECTCURRENT, CWnd* pParentWnd = NULL );

参数：
pItem | 指向要变换图标的项的指针。
dwFlags创建标志，可以包含任意个下列值的位或运算。
· | CIF_SELECTCURRENT | 调用对话框时，将“当前”（Current）单选钮初始化为选中。这是缺省值。
· | CIF_SELECTDEFAULT | 调用对话框时，将“缺省”（Default）单选钮初始化为选中。
· | CIF_SELECTFROMFILE | 调用对话框时， 将“从文件”（FromFile）单选钮初始化为选中。
· | CIF_SHOWHELP | 调用对话框时， 显示“帮助”（Help）按钮。
· | CIF_USEICONEXE | 说明图标必须从说明在m_ci中szIconExe域检取。这在嵌入或链接到非OLE文件时是十分有用的。
pParentWnd | 指向该对话框对象所属的父窗口或属主窗口对象的指针。如果为NULL，该对话框的父窗口被设置为主应用窗口。

说明：
该函数仅用于构造一个COleChangeIconDialog对象。请调用DoModal函数来显示该对话框窗口。
要了解更多的信息，请参阅“OLE 2.01用户界面库（User Interface Library）”中的OLEUICHANGEICON结构。

请参阅：COleClientItem, COleChangeIconDialog::DoModal


 COleChangeIconDialog::DoChangeIcon

BOOL DoChangeIcon( COleClientItem* pItem );

返回值：如果变换成功，则返回非零值；否则为0。

参数：
pItem 指向要变换图标的项的指针。

说明：
在DoModal返回IDOK后，调用该函数将代表指定项的图标变换为在对话框选定的图标。

请参阅：COleChangeIconDialog::DoModal


 COleChangeIconDialog::DoModal

virtual int DoModal( );

返回值：
对话框的完成状态。它可以是下列值：
· | IDOK | 若对话框成功显示。
· | IDCANCEL | 如果用户取消了该对话框。
· | IDABORT | 若出错。如果返回IDABORT，可调用COleDialog::GetLastError成员函数以取得关于出错类型的相关信息。关于所有可能出现的错误的列表清单，请参阅“OLE 2.01 用户界面库（User Interface Library）”中的OleUIChangeIcon函数。

说明：
调用该函数，以显示OLE变换图标对话框。
如果要通过调整m_cs结构的值来初始化对话框中的控件状态，必须在调用DoModal之前，构造对话框对象之后完成此项工作。
如果DoModal返回IDOK，可以调用其它成员函数获取用户在对话框中输入的设置或信息。

请参阅：
COleDialog::GetLastError, CDialog::DoModal, COleChangeIconDialog::m_ci, COleChangeIconDialog::DoChangeIcon, COleChangeIconDialog::GetIconicMetafile


 COleChangeIconDialog::GetIconicMetafile

HGLOBAL GetIconicMetafile( ) const;

返回值：
若在对话框中选择OK，则返回包含新图标的外观的元文件的句柄；否则返回旧图标元文件的句柄。

说明：
调用该函数以取得包含有指定项的图标外观的元文件的句柄。

请参阅：
COleChangeIconDialog::DoModal, COleChangeIconDialog::COleChangeIconDialog, COleChangeIconDialog::DoChangeIcon


 COleChangeIconDialog::m_ci

说明：
它是类型为OLEUICHANGEICON的结构，用以控制服务器忙对话框的行为。该结构的成员可以直接被修改，也可以通过调用成员函数来修改它。
要了解OLEUICHANGEICON 结构的更多信息，请参阅“OLE 2.01用户界面库（User Interface Library）”。

请参阅：COleChangeIconDialog::COleChangeIconDialog


 COleChangeSourceDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog
└COleDialog
└COleChangeSourceDialog

COleChangeSourceDialog类用于OLE变换资源对话框。当要调用该对话框时，首先创建类COleChangeSourceDialog的一个对象，然后，可以用m_cs 结构对话框内的控件的值或状态。结构m_cs的类型是OLEUICHANGESOURCE。关于使用该对话框的信息，请参阅DoModal成员函数。
要了解更多的信息，请参阅“OLE 2.01用户界面库（User Interface Library）”中的OLEUICHANGESOURCE结构。
有关OLE特性对话框的信息，请参阅联机文档“Visual C++程序员指南”中的“OLE中的对话框”。
#include <afxodlgs.h>
请参阅：COleDialog

COleChangeSourceDialog类的成员

数据成员
m_cs 控制对话框行为的结构

构造函数
COleChangeSourceDialog 构造一个COleChangeSourceDialog对象

操作
DoModal 显示OLE变换资源对话框

属性
IsValidSource | 指示该资源有效
GetFileName | 从资源名得到文件名
GetDisplayName | 得到完整的资源显示名
GetItemName | 从资源名得到项目名
GetFromPrefix | 得到原资源的前缀
GetToPrefix | 得到新资源的前缀


 COleChangeSourceDialog::COleChangeSourceDialog

COleChangeSourceDialog( COleClientItem* pItem, CWnd* pParentWnd = NULL );

参数：
pItem | 指向要更新资源的COleClientItem类指针。
pParentWnd | 指向该对话框对象所属的父窗口或属主窗口对象的指针。如果为NULL，该对话框的父窗口被设置为主应用窗口。

说明：
该函数仅用于构造一个COleChangeSourceDialog对象。请调用DoModal函数来显示该对话框窗口。
要了解更多的信息，请参阅“OLE 2.01用户界面库（User Interface Library）”中的OLEUICHANGESOURCE结构。


 COleChangeSourceDialog::DoModal

virtual int DoModal( );

返回值：
对话框的完成状态。它可以是下列值：
· | IDOK | 若对话框成功显示。
· | IDCANCEL | 如果用户取消了该对话框。
· | IDABORT | 若出错。如果返回IDABORT，可调用COleDialog::GetLastError成员函数以取得关于出错类型的相关信息。关于所有可能出现的错误的列表清单，请参阅“OLE 2.01 用户界面库（User Interface Library）”中的OleUIChangeSource函数。

说明：
调用该函数，以显示OLE变换资源对话框。
如果要通过调整m_cs结构的值来初始化对话框中的控件状态，必须在调用DoModal之前，构造对话框对象之后完成此项工作。
如果DoModal返回IDOK, 可以调用其它成员函数获取用户在对话框中输入的设置或信息。下面所列的是典型的查询函数：
·GetFileName
·GetDisplayName
·GetItemName

请参阅：COleChangeSourceDialog::COleChangeSourceDialog


 COleChangeSourceDialog::GetDisplayName

CString GetDisplayName( );

返回值：
构造函数说明了的COleClientItem的完整的资源显示名(标识)。

说明：
调用该函数以获取与客户项相关联的完整的显示名。

请参阅：
COleChangeSourceDialog::GetFileName, COleChangeSourceDialog::GetItemName


 COleChangeSourceDialog::GetFileName

CString GetFileName( );

返回值：
构造函数说明了的COleClientItem的资源显示名的标识部分。

说明：
调用该函数以获取与客户项相关联的完整的显示名的标识部分。文件标识和项目标识合在一起就是完整的显示名。

请参阅：
COleChangeSourceDialog::GetDisplayName, COleChangeSourceDialog::GetItemName


 COleChangeSourceDialog::GetFromPrefix

CString GetFromPrefix( );

返回值：资源的原前缀字符串。

说明：
调用该函数以获取资源的原前缀字符串。只有在DoModal返回IDOK后才能调用该函数。
该值直接从OLEUICHANGESOURCE结构的lpszFrom成员获得。
要了解更多的信息，请参阅“OLE 2.01用户界面库（User Interface Library）”中的OLEUICHANGESOURCE结构。

请参阅：COleChangeSourceDialog::GetToPrefix


 COleChangeSourceDialog::GetItemName

CString GetItemName( );

返回值：
构造函数说明了的COleClientItem的资源显示名的项目标识部分。

说明：
调用该函数以获取与客户项相关联的完整的显示名的项目标识部分。文件标识和项目标识合在一起就是完整的显示名。

请参阅：
COleChangeSourceDialog::GetFileName, COleChangeSourceDialog::GetDisplayName


 COleChangeSourceDialog::GetToPrefix

CString GetToPrefix( );

返回值：资源的新前缀字符串。

说明：
调用该函数以获取资源的新前缀字符串。只有在DoModal返回IDOK后才能调用该函数。
该值直接从OLEUICHANGESOURCE结构的lpszTo成员获得。
要了解更多的信息，请参阅“OLE 2.01用户界面库（User Interface Library）”中的OLEUICHANGESOURCE结构。

请参阅：COleChangeSourceDialog::GetFromPrefix


 COleChangeSourceDialog::IsValidSource

BOOL IsValidSource( );

返回值：如果资源有效，则返回非零值；否则为0。

说明：
调用该函数已判定新的资源是否有效。只有在DoModal返回IDOK后才能调用该函数。
要了解更多的信息，请参阅“OLE 2.01用户界面库（User Interface Library）”中的OLEUICHANGESOURCE结构。

请参阅：COleChangeSourceDialog::DoModal


 COleChangeSourceDialog::m_cs

说明：
它是类型为OLEUICHANGESOURCE的结构，用以控制服务器资源对话框的行为。该结构的成员可以直接被修改，也可以通过调用成员函数来修改它。
要了解更多的信息，请参阅“OLE 2.01用户界面库（User Interface Library）”中的OLEUICHANGESOURCE结构。

请参阅：COleChangeSourceDialog::COleChangeSourceDialog


 COleClientItem

CObject
└CCmdTarget
└CDocItem
└COleClientItem

COleClientItem类定义了OLE项的包容器界面。OLE项代表由服务器应用建立并维护的数据，它可以“无缝地”和文档合成一体，成为“复合文档”，而在用户看来就如同一个单一的文档一样。“复合文档”由OLE项和一包含文档组成。
OLE项可以嵌入或者是链接到复合文档中。当嵌入时，它作为复合文档的一部分进行存储。如果是链接的，数据存储在由服务器应用建立的分离的文件中，而仅把指向它的一个链接存到复合文档中。所有的OLE项包含有说明被调用来编辑它们的服务器应用的信息。
COleClientItem定义了一些可重载的函数，用以响应从服务器应用发出的请求；它们以通知的形式发生作用。这使得服务器应用能将用户编辑OLE项所作的修改通知包容器，或在用户编辑的同时获取相关的信息。COleClientItem能同COleDocument, COleLinkingDoc或COleServerDoc等类一起使用。使用COleClientItem时, 从COleClientItem 派生一个类，执行OnChange成员函数，定义怎样将对项的修改通知包容器。若要支持就地激活的功能，得重载OnGetItemPosition 成员函数。该函数提供了OLE项的显示位置的有关信息。
关于使用包容器界面的信息，请参阅联机文档《Visual C++ 程序员指南》中的“包容器：实现一个包容器”和“激活”。
注意：
OLE文档中，“对象（objects）”指的是嵌入或链接项本身；而“类（classes）”则指的是项的类型。本参考手册用“项”将OLE实体和C++的对象区分开来；用“类型”将OLE类同C++类区分开来。
#include <afxole.h>
请参阅：COleServerItem

COleClientItem成员函数

构造函数
COleClientItem 构造一个COleClientItem对象

创建
CreateFromClipboard | 从剪贴板中创建一个嵌入项
CreateFromData | 从一个数据对象创建一个嵌入项
CanCreateFromData | 指示一个包容器应用是否能创建一个嵌入对象
CreateFromFile | 从一个文件创建一个嵌入项
CreateStaticFromClipboard | 从剪贴板创建一个静态项
CreateStaticFromData | 从一个数据对象创建一个静态项
CreateLinkFromClipboard | 从剪贴板创建一个链接项
CreateLinkFromData | 从一个数据对象创建一个链接项
CanCreateLinkFromData | 指示一个包容器应用是否能创建一个嵌入对象
CreateLinkFromFile | 从一个文件创建一个链接项
CreateNewItem | 启动服务器应用创建一个新的嵌入项
CreateCloneFrom | 创建一个已经存在的项的拷贝

状态
GetLastStatus | 返回上一次OLE操作的状态
GetIconFromRegistry | 检索与特定CLSID服务器相关的图标的句柄
GetType | 返回OLE项的类型(嵌入、链接或静态)
GetExtent | 返回OLE项的矩形边界
GetCachedExtent | 返回OLE项的矩形边界
GetClassID | 获取给定项的类标识
GetUserType | 获取描述项类型的字符串
GetIconicMetafile | 获取用以描绘项的图标的元文件
SetIconicMetafile | 将用以描绘项的图标的元文件存入缓存
GetDrawAspect | 获取显示项的当前视图
SetDrawAspect | 设置显示项的当前视图
GetItemState | 获取项的当前状态
GetActiveView | 获取项被就地激活的视图
IsModified | 如果项在上次保存后被修改了，则返回TRUE
IsRunning | 如果项的服务器应用正在运行，则返回TRUE
IsInPlaceActive | 如果项处于就地激活状态，则返回TRUE
IsOpen | 如果项在服务器应用中处于打开状态，则返回TRUE

数据存取
GetDocument | 返回包含给定项的COleDocument对象
AttachDataObject | 存取OLE对象中的数据

对象转换
ConvertTo | 转换项到另一类型
ActivateAs | 激活项为另一类型
Reload | 在调用ActivateAs后重载项

剪贴板操作
CanPaste | 指示剪贴板中是否包含有可重载或静态的OLE项
CanPasteLink | 指示剪贴板中是否包含有可链接的OLE项
DoDragDrop | 执行一次拖放操作
CopyToClipboard | 将OLE项复制到剪贴板中
GetClipboardData | 获取剪贴板中的数据。这些数据可能是调用CopyToClipboard成员函数后放置在剪贴板中的

一般操作
Close | 关闭OLE项指向服务器的一个链接，但不销毁OLE项本身
Release | 释放OLE链接项的链接，如果处于打开状态则关闭它。释放操作也不销毁客户项本身
Delete | 如果是一个链接的OLE项，则删除或关闭它
Draw | 绘制OLE项
Run | 运行和项相关的应用
SetPrintDevice | 设置该客户项的打印目标设备

激活
Activate | 打开OLE项进行操作，并执行指定的动作
DoVerb | 执行指定动作
Deactivate | 释放激活项
DeactivateUI | 恢复包容器应用的用户界面到初始状态
ReactivateAndUndo | 重新激活项，并撤消上次的就地编辑操作
SetItemRects | 设置项的矩形边界
GetInPlaceWindow | 返回项的就地编辑窗口的指针

嵌入对象操作
SetHostNames | 编辑OLE项，设置服务器显示的名字
SetExtent | 设置OLE项的边界矩形

链接对象操作和状态
GetLinkUpdateOptions | 返回链接项的更新模式 (高级特性)
SetLinkUpdateOptions | 设置链接项的更新模式 (高级特性)
UpdateLink | 更新项的描述缓存
IsLinkUpToDate | 如果一个链接项和它的资源文档是最新的，则返回TRUE

重载函数
OnChange | 服务器改变OLE项时调用。要求重实现
OnGetClipboardData | 框架调用以获取复制到剪贴板的数据
OnInsertMenus | 框架调用以创建一个混合菜单条
OnSetMenu | 框架调用以安装和删除一个混合菜单
OnRemoveMenus | 框架调用以从一个混合菜单中删除包容器菜单
OnUpdateFrameTitle | 框架调用以更新框架窗口的标题栏
OnShowControlBars | 框架调用以显示或隐藏控件条
OnGetItemPosition | 框架调用以项的相对视图的位置
OnScrollBy | 框架调用以滚动项到视图内
OnDeactivateUI | 当服务器删除用户界面时，由框架调用
OnDiscardUndoState | 框架调用以丢弃项的撤消操作状态信息
OnDeactivateAndUndo | 框架调用以在激活后进行撤消操作
OnShowItem | 框架调用以显示OLE项
CanActivate | 框架调用以判定是否允许就地激活
OnActivate | 框架调用以通知已经激活的项
OnActivateUI | 框架调用以通知已经激活的并且需要显示用户界面的项
OnGetClipRect | 框架调用以取得项的剪切矩形坐标
OnGetWindowContext | 当项就地激活时，由框架调用
OnDeactivate | 当项取消时，由框架调用
OnChangeItemPosition | 当项位置改变时，由框架调用


 COleClientItem::Activate

void Activate(LONG nVerb, CView* pView, LPMSG lpMsg = NULL);

参数：
nVerb说明要执行的动作。它可以是下列值中的一个：
值 | 含义 | 符号
-0 | 主动词 | OLEIVERB_PRIMARY
-1 | 第二动词 | 无
-1 | 显示项用于编辑 | OLEIVERB_SHOW
-2 | 在分离窗口中编辑项 | OLEIVERB_OPEN
-3 | 隐藏项 | OLEIVERB_HIDE
-1值通常是另一个动词的别名。如果不支持打开编辑，-2值和-1具有相同的效果。其它的值，请参阅OLE文档中的IOleObject::DoVerb。

pView | 指向包含OLE项的包容器视图窗口指针。该指针被服务器应用用于就地激活OLE项。如果包容器不支持就地激活，该参数为NULL。
lpMsg | 指向使该项被激活的消息的指针。

说明：
调用该函数来替代DoVerb执行说明的动词，以便在产生异常时进行自己的处理。
如果服务器应用是用Microsoft 基础类库编写的, 该函数将引发被执行的相应COleServerItem对象的OnDoVerb成员函数。
如果主动词是编辑并且nVerb参数说明为0，则服务器应用启动为将允许OLE项被编辑。如果包容器应用支持就地激活，也就支持就地编辑。如果不支持就地编辑 (或说明了打开动词), 服务器在一分离的窗口中启动，在那里不能编辑。典型地，当包容器应用的用户在OLE项上双击,nVerb参数的主动词的值决定了用户能执行的动作。然而，如果服务器只支持一个动作，那么，不管在nVerb参数中说明了哪个值，总是执行那个动作。
要了解更多的信息，请参阅OLE文档中的IOleObject::DoVerb。

请参阅：
COleClientItem::DoVerb, COleServerItem::OnDoVerb


 COleClientItem::ActivateAs

BOOL ActivateAs( LPCTSTR lpszUserType, REFCLSID clsidOld, REFCLSID clsidNew );

返回值：如果成功，则返回非零值，否则返回0。

参数：
lpszUserType | 指向代表目标用户类型的字符串指针，例如"Word Document"。
clsidOld | 项的当前类标识的一个参考。除非它是一个链接，否则类标识必须代表实际的对象的类型。如果是一个链接，它必须是该链接所指的项的CLSID。COleConvertDialog自动提供项的正确类标识。
clsidNew | 目标类标识的一个参考。

说明：
可用OLE的对象转换工具来激活项，尽管它是由clsidNew说明的类型的项。此时，COleConvertDialog::DoConvert将被自动的调用来进行项的类型转换。该函数通常不直接被调用。

请参阅：
COleConvertDialog, COleClientItem::ConvertTo, COleClientItem::Reload


 COleClientItem::AttachDataObject

void AttachDataObject( COleDataObject& rDataObject ) const;

参数：
rDataObject COleDataObject对象的一个参考，该对象将被初始化为允许在OLE项中进行数据存取。

说明：
调用该函数以初始化COleDataObject为允许在OLE项中进行数据存取。

请参阅：COleDataObject


 COleClientItem::CanActivate

virtual BOOL CanActivate( );

返回值：
如果允许就地激活，则返回非零值，否则为0。

说明：
当用户要求对OLE项进行就地激活时由框架调用； 该函数的返回值决定了是否允许被就地激活。缺省时，只要包容器有一个有效的窗口，就允许就地激活。可以覆盖该函数来实现接受或拒绝激活请求的特殊逻辑。例如，如果OLE项太小或当前不可见，激活请求将被拒绝。
要了解更多的信息，请参阅OLE文档中的IOleObject::CanInPlaceActivate。


 COleClientItem::CanCreateFromData

static BOOL PASCAL CanCreateFromData( const COleDataObject* pDataObject );

返回值：
如果能从COleDataObject对象中创建嵌入对象，则返回非零值；否则为0。

参数：
pDataObject 指向COleDataObject对象的指针，从中将创建OLE项。

说明：
检查一个包容器应用能否从给定的COleDataObject对象创建嵌入对象。
COleDataObject 类用于在以不同格式从剪贴板，或通过拖放操作，或从一个嵌入OLE项中存取数据时，进行数据的传送。
包容器可应用该函数来决定获得或失去执行Edit Paste和 Edit PasteSpecial命令的能力。
要了解更多的信息，请参阅联机文档《Visual C++ 程序员指南》中的“数据对象和数据源(OLE)”。

请参阅：COleDataObject


 COleClientItem::CanCreateLinkFromData

static BOOL PASCAL CanCreateLinkFromData(const COleDataObject* pDataObject);

返回值：
如果能从COleDataObject对象中创建链接对象，则返回非零值，否则为0。

参数：
pDataObject 指向COleDataObject对象的指针，从中将创建OLE项。

说明：
检查一个包容器应用能否从给定的COleDataObject对象创建链接对象。COleDataObject 类用于在以不同格式从剪贴板，或通过拖放操作，或从一个嵌入OLE项中存取数据时，进行数据的传送。
包容器可应用该函数来决定获得或失去执行Edit Paste Special和 EditPaste Link命令的能力。
要了解更多的信息，请参阅联机文档《Visual C++程序员指南》中的“数据对象和数据源(OLE)。

请参阅：COleDataObject


 COleClientItem::CanPaste

static BOOL PASCAL CanPaste( );

返回值：
如果能从剪贴板粘贴一个嵌入OLE项，则返回非零值，否则为0。

说明：
调用该函数以确认是否能从剪贴板中粘贴一个嵌入OLE项。
要了解更多的信息，请参阅OLE文档中的OleGetClipboard和OleQueryCreate FromData。

请参阅：
COleClientItem::CanPasteLink, COleClientItem::CreateFromClipboard, COleClientItem::CreateStaticFromClipboard, COleDocument


 COleClientItem::CanPasteLink

static BOOL PASCAL CanPasteLink( );

返回值：
如果能从剪贴板粘贴一个链接OLE项，则返回非零值；否则为0。

说明：
调用该函数以确认是否能从剪贴板中粘贴一个链接OLE项。
要了解更多的信息，请参阅OLE文档中的OleGetClipboard和OleQueryLink FromData。

请参阅：
COleClientItem::CanPaste, COleClientItem::CreateLinkFromClipboard


 COleClientItem::Close

void Close( OLECLOSE dwCloseOption = OLECLOSE_SAVEIFDIRTY );

参数：
dwCloseOption说明当OLE项并返回装入状态时如何保存的标志。它可为下列值中的一个：
· | OLECLOSE_SAVEIFDIRTY | 保存OLE项。
· | OLECLOSE_NOSAVE | 不保存OLE项。
· | OLECLOSE_PROMPTSAVE | 让用户决定是否保存OLE项。

说明：
调用该函数将OLE项的状态从运行状态改变到装入状态，也就是说，在服务器不运行的情况下装入它的句柄。OLE项不运行时，该函数不起任何作用。
要了解更多的信息，请参阅OLE文档中的IOleObject::Close 。

请参阅：COleClientItem::UpdateLink


 COleClientItem::COleClientItem

COleClientItem( COleDocument* pContainerDoc = NULL );

参数：
pContainerDoc 指向将包含该项的包容器文档的指针。它可以是任意的COleDocument派生类。

说明：
构造一个COleClientItem对象，并将其加入到指定的包容器文档中，它只创建一个C++对象，不做任何的OLE初始化工作。若赋给NULL指针, 包容器文档将不会增加。必须显式地调用COleDocument::AddItem。
在使用OLE项之前，必须调用下面的创建函数中的一个来创建它：
·CreateFromClipboard
·CreateFromData
·CreateFromFile
·CreateStaticFromClipboard
·CreateStaticFromData
·CreateLinkFromClipboard
·CreateLinkFromData
·CreateLinkFromFile
·CreateNewItem
·CreateCloneFrom

请参阅：COleDocument, COleDocument::AddItem


 COleClientItem::ConvertTo

BOOL ConvertTo( REFCLSID clsidNew );

返回值：如果成功，则返回非零值；否则为0。

参数：
clsidNew 目标类型的类标识。

说明：
调用该成员函数将项的类型由clsidNew指定的类型。COleConvertDialog会自动地调用该函数，一般不允许直接调用它。

请参阅：
COleClientItem::ActivateAs, COleConvertDialog


 COleClientItem::CopyToClipboard

void CopyToClipboard( BOOL bIncludeLink = FALSE );

参数：
bIncludeLink 如果要将链接信息复制到剪贴板中，以使得链接项能被粘贴，则其值为TRUE；否则为FALSE。

说明：
调用该函数将OLE项复制到剪贴板。典型地，你将在为处理编辑菜单的复制和剪切命令而编写的消息处理函数时调用该函数。必须在包容器应用中选定要执行复制或剪切命令的项。
要了解更多的信息，请参阅OLE文档中的OleSetClipboard。


 COleClientItem::CreateCloneFrom

BOOL CreateCloneFrom( const COleClientItem* pSrcItem );

返回值：如果成功，则返回非零值；否则为0。

参数：
pSrcItem 指向要复制的OLE项的指针。

说明：
调用该函数创建指定的OLE 项的一个拷贝。该拷贝和原来的项是完全一致的。可以用该函数来支持撤消操作。

请参阅：COleClientItem::CreateNewItem


 COleClientItem::CreateFromClipboard

BOOL CreateFromClipboard( OLERENDER render = OLERENDER_DRAW,
CLIPFORMAT cfFormat = 0,
LPFORMATETC lpFormatEtc = NULL
);

返回值：如果成功，则返回非零值；否则为0。

参数：
render | 说明服务器显示OLE项的方式的标志。所有可能的值，请参阅OLE文档中的OLERENDER。
cfFormat | 说明创建OLE项时缓存在剪贴板的数据的格式。
lpFormatEtc | 指向FORMATETC结构的一个指针。该结构说明显示的方式是OLERENDER_FORMAT还是OLERENDER_DRAW。只有当你要在cfFormat说明的剪贴板数据格式之外说明另外的格式时，才需要给该参数赋值。如果忽略该参数，FORMATETC结构中的其它域将使用缺省值。

说明：
调用该函数以使用剪贴板中的内容来创建一个嵌入OLE项。在为处理编辑菜单的粘贴命令而编写的消息处理函数中往往要调用该函数(如果CanPaste成员函数返回非零值，框架将使粘贴命令将变得可用)。
要了解更多的信息，请参阅OLE文档中的OLERENDER和FORMATETC。

请参阅：
COleDataObject::AttachClipboard, COleClientItem::CreateFromData, COleClientItem::CanPaste


 COleClientItem::CreateFromData

BOOL CreateFromData(COleDataObject* pDataObject,
OLERENDER render = OLERENDER_DRAW,
CLIPFORMAT cfFormat = 0,
LPFORMATETC lpFormatEtc = NULL
);

返回值：如果成功，则返回非零值；否则为0。

参数：
pDataObject | 指向将从中创建OLE项的COleDataObject 对象的指针。
render | 说明服务器显示OLE项的方式的标志。所有可能的值，请参阅OLE文档中的OLERENDER。
cfFormat | 说明创建OLE项时缓存在剪贴板的数据的格式。
lpFormatEtc | 指向FORMATETC结构的一个指针。该结构说明显示的方式是OLERENDER_FORMAT还是OLERENDER_DRAW。只有当你要在cfFormat说明的剪贴板数据格式之外说明另外的格式时，才需要给该参数赋值。如果忽略该参数，FORMATETC结构中的其它域将使用缺省值。

说明：
调用该函数从COleDataObject对象中创建一个嵌入OLE项。 数据传送操作，比如从剪贴板中粘贴或拖放操作，使得COleDataObject对象包含有服务器应用提供的信息。该函数通常在覆盖CView::OnDrop时使用。
要了解更多的信息，请参阅OLE文档中的OleCreateFromData,OLERENDER和FORMATETC 。

请参阅：
COleDataObject::AttachClipboard, COleClientItem::CreateFromClipboard, COleDataObject


 COleClientItem::CreateFromFile

BOOL CreateFromFile(LPCTSTR lpszFileName,
REFCLSID clsid = CLSID_NULL,
OLERENDER render = OLERENDER_DRAW,
CLIPFORMAT cfFormat = 0,
LPFORMATETC lpFormatEtc = NULL
);

返回值：如果成功，则返回非零值；否则为0。

参数：
lpszFileName | 指向将从中创建OLE项的文件名的指针。
clsid | 保留备用。
render | 说明服务器显示OLE项的方式的标志。所有可能的值，请参阅OLE文档中的OLERENDER。
cfFormat | 说明创建OLE项时缓存在剪贴板的数据的格式。
lpFormatEtc | 指向FORMATETC结构的一个指针。该结构说明显示的方式是OLERENDER_FORMAT还是OLERENDER_DRAW。只有当你要在cfFormat说明的剪贴板数据格式之外说明另外的格式时，才需要给该参数赋值。如果忽略该参数，FORMATETC结构中的其它域将使用缺省值。

说明：
调用该函数从文件创建OLE项。如果用户在插入对象对话框中选中了“从文件创建”按钮并确定，框架将从COleInsertDialog::CreateItem调用该函数来从文件创建OLE项。
要了解更多的信息，请参阅OLE文档中的OleCreateFromFile,OLERENDER和FORMATETC。

请参阅：COleInsertDialog::CreateItem


 COleClientItem::CreateLinkFromClipboard

BOOL CreateLinkFromClipboard(OLERENDER render = OLERENDER_DRAW,
CLIPFORMAT cfFormat = 0,
LPFORMATETC lpFormatEtc = NULL
);

返回值：如果成功，则返回非零值；否则为0。

参数：
render | 说明服务器显示OLE项的方式的标志。所有可能的值，请参阅OLE文档中的OLERENDER。
cfFormat | 说明创建OLE项时缓存在剪贴板的数据的格式。
lpFormatEtc | 指向FORMATETC结构的一个指针。该结构说明显示的方式是OLERENDER_FORMAT还是OLERENDER_DRAW。只有当你要在cfFormat说明的剪贴板数据格式之外说明另外的格式时，才需要给该参数赋值。如果忽略该参数，FORMATETC结构中的其它域将使用缺省值。

说明：
调用该函数以使用剪贴板中的内容来创建一个链接OLE项。在处理编辑菜单的粘贴链接命令而编写的消息处理函数中往往要调用该函数(如果剪贴板中包含有能被链接的OLE项时，COleDocument的缺省实现将使粘贴链接命令将变得可用)。
要了解更多的信息，请参阅OLE文档中的OLERENDER和FORMATETC。

请参阅：
COleClientItem::CanPasteLink, COleClientItem::CreateLinkFromData, COleDataObject::AttachClipboard


 COleClientItem::CreateLinkFromData

BOOL CreateLinkFromData(COleDataObject* pDataObject,
OLERENDER render = OLERENDER_DRAW,
CLIPFORMAT cfFormat = 0,
LPFORMATETC lpFormatEtc = NULL
);

返回值：如果成功，则返回非零值，否则为0。

参数：
pDataObject | 指向将从中创建OLE项的COleDataObject对象的指针。
render | 说明服务器显示OLE项的方式的标志。所有可能的值，请参阅OLE文档中的OLERENDER。
cfFormat | 说明创建OLE项时缓存在剪贴板的数据的格式。
lpFormatEtc | 指向FORMATETC结构的一个指针。该结构说明显示的方式是OLERENDER_FORMAT还是OLERENDER_DRAW。只有当你要在cfFormat说明的剪贴板数据格式之外说明另外的格式时，才需要给该参数赋值。如果忽略该参数，FORMATETC结构中的其它域将使用缺省值。

说明：
调用该函数从COleDataObject对象创建一个链接项。当用户指明建立链接时，在卸载操作时调用该函数。它还可以用户处理编辑粘贴命令。当链接选项设定时，框架将在COleClientItem::CreateLinkFromClipboard和COlePasteSpecialDialog::CreateItem中调用它。
要了解更多的信息，请参阅OLE文档中的OleCreateLinkFromData, OLERENDER和FORMATETC。

请参阅：
COleDataObject::AttachClipboard, COleDataObject, COleClientItem::CreateLinkFromClipboard


 COleClientItem::CreateLinkFromFile

BOOL CreateLinkFromFile(LPCTSTR lpszFileName,
OLERENDER render = OLERENDER_DRAW,
CLIPFORMAT cfFormat = 0,
LPFORMATETC lpFormatEtc = NULL
);

返回值：如果成功，则返回非零值；否则为0。

参数：
lpszFileName | 指向将从中创建OLE项的文件名的指针。
render | 说明服务器显示OLE项的方式的标志。所有可能的值，请参阅OLE文档中的OLERENDER。
cfFormat | 说明创建OLE项时缓存在剪贴板的数据的格式。
lpFormatEtc | 指向FORMATETC结构的一个指针。该结构说明显示的方式是OLERENDER_FORMAT还是OLERENDER_DRAW。只有当你要在cfFormat说明的剪贴板数据格式之外说明另外的格式时，才需要给该参数赋值。如果忽略该参数，FORMATETC结构中的其它域将使用缺省值。

说明：
调用该函数从文件创建链接OLE项。如果用户在插入对象对话框中选中了“从文件创建”按钮，并且“链接”复选框设定，并加以确定，框架将在COleInsertDialog::CreateItem中调用该函数。
要了解更多的信息，请参阅OLE文档中的 OleCreateLinkToFile,OLERENDER和FORMATETC。

请参阅：COleInsertDialog::CreateItem


 COleClientItem::CreateNewItem

BOOL CreateNewItem(REFCLSID clsid,
OLERENDER render = OLERENDER_DRAW,
CLIPFORMAT cfFormat = 0,
LPFORMATETC lpFormatEtc = NULL
);

返回值：如果成功，则返回非零值；否则为0。

参数：
clsid | 唯一确定要创建的OLE项类型的表示。
render | 说明服务器显示OLE项的方式的标志。所有可能的值，请参阅OLE文档中的OLERENDER。
cfFormat | 说明创建OLE项时缓存在剪贴板的数据的格式。
lpFormatEtc | 指向FORMATETC结构的一个指针。该结构说明显示的方式是OLERENDER_FORMAT还是OLERENDER_DRAW。只有当你要在cfFormat说明的剪贴板数据格式之外说明另外的格式时，才需要给该参数赋值。如果忽略该参数，FORMATETC结构中的其它域将使用缺省值。

说明：
调用该函数创建一个嵌入项；该函数使服务器应用允许用户创建OLE项。如果用户在插入对象对话框中选中了“新建”按钮，并加以确定，框架将调用该函数。
要了解更多的信息，请参阅OLE文档中的OleCreate, OLERENDER和FORMATETC。

请参阅：COleInsertDialog::CreateItem


 COleClientItem::CreateStaticFromClipboard

BOOL CreateStaticFromClipboard(OLERENDER render = OLERENDER_DRAW,
CLIPFORMAT cfFormat = 0,
LPFORMATETC lpFormatEtc = NULL
);

返回值：如果成功，则返回非零值；否则为0。

参数：
render | 说明服务器显示OLE项的方式的标志。所有可能的值，请参阅OLE文档中的OLERENDER。
cfFormat | 说明创建OLE项时缓存在剪贴板的数据的格式。
lpFormatEtc | 指向FORMATETC结构的一个指针。该结构说明显示的方式是OLERENDER_FORMAT还是OLERENDER_DRAW。只有当你要在cfFormat说明的剪贴板数据格式之外说明另外的格式时，才需要给该参数赋值。如果忽略该参数，FORMATETC结构中的其它域将使用缺省值。

说明：
调用该函数使用剪贴板的内容创建一个静态项。一个静态项仅包含显示数据而无内部数据。因此它是不可编辑的。在CreateFromClipboard 成员函数失败后，调用该函数。
要了解更多的信息，请参阅OLE文档中的OLERENDER和FORMATETC。

请参阅：
COleDataObject::AttachClipboard, COleClientItem::CanPaste, COleClientItem::CreateStaticFromData


 COleClientItem::CreateStaticFromData

BOOL CreateStaticFromData(COleDataObject* pDataObject,
OLERENDER render = OLERENDER_DRAW,
CLIPFORMAT cfFormat = 0,
LPFORMATETC lpFormatEtc = NULL
);

返回值：如果成功，则返回非零值；否则为0。

参数：
pDataObject | 指向将从中创建OLE项的COleDataObject对象的指针。
render | 说明服务器显示OLE项的方式的标志。所有可能的值，请参阅OLE文档中的OLERENDER。
cfFormat | 说明创建OLE项时缓存在剪贴板的数据的格式。
lpFormatEtc | 指向FORMATETC结构的一个指针。该结构说明显示的方式是OLERENDER_FORMAT还是OLERENDER_DRAW。只有当你要在cfFormat说明的剪贴板数据格式之外说明另外的格式时，才需要给该参数赋值。如果忽略该参数，FORMATETC结构中的其它域将使用缺省值。

说明：
调用该函数从COleDataObject 对象创建一个静态项。一个静态项仅包含显示数据而无内部数据。因此它是不可编辑的。本质上它和CreateStaticFromClipboard是相同的，只是静态项能从任意的COleDataObject中创建，而不仅仅从剪贴板。
当选择静态选项时，在COlePasteSpecialDialog::CreateItem中使用该函数。
要了解更多的信息，请参阅OLE文档中的OleCreateStaticFromData,OLERENDER和FORMATETC。

请参阅：
COleDataObject::AttachClipboard, COleDataObject


 COleClientItem::Deactivate

void Deactivate( );

说明：
调用该函数取消 OLE项并释放所有的关联资源。当用户在项的边界以外的客户区单击鼠标时，已经就地激活的OLE项就被取消。注意取消OLE项将丢失它的撤消状态信息，这样就不能再调用ReactivateAndUndo成员函数。如果应用支持撤消操作，请不要调用Deactivate，而应调用DeactivateUI。要了解更多的信息，请参阅OLE文档中的IoleInPlaceObject::InPlaceDeactivate。

请参阅：
COleClientItem::ReactivateAndUndo, COleClientItem::DeactivateUI


 COleClientItem::DeactivateUI

void DeactivateUI( );

说明：
当用户取消一个已经就地激活的项时，调用该函数。该函数将把包容器应用的用户界面恢复到原来的状态，并隐藏所有用于就地激活操作的菜单项和控件。
该函数不会刷清项的撤消操作状态信息。所以，一旦在取消项后立即选择包容器的撤消操作时，包容器应用仍可以调用ReactivateAndUndo来执行撤消操作。
要了解更多的信息，请参阅OLE文档中的IOleInPlaceObject::InPlaceDeactivate。

请参阅：
COleClientItem::ReactivateAndUndo, COleClientItem::Activate


 COleClientItem::Delete

void Delete( BOOL bAutoDelete = TRUE );

参数：
bAutoDelete 说明是否要从文档中删除项。

说明：
调用该函数从包容器文档中删除OLE项。该函数调用Release成员函数，先删除项的C++ 对象，然后从文档中永久地删除OLE项。如果OLE项是嵌入的，项的内部数据也同时被删。它常关闭一个运行的服务器，所以如果项是一个打开的链接，该函数也将关闭它。

请参阅：COleClientItem::Release


 COleClientItem::DoDragDrop

DROPEFFECT DoDragDrop(LPCRECT lpItemRect,
CPoint ptOffset,
BOOL bIncludeLink = FALSE,
DWORD dwEffects = DROPEFFECT_COPY | DROPEFFECT_MOVE,
LPCRECT lpRectStartDrag = NULL
);

返回值：
一个DROPEFFECT值。如果为DROPEFFECT_MOVE，则原始数据将被删除。

参数：
lpItemRect | 在客户区坐标内表示的屏幕矩形。
ptOffset | 在拖拉鼠标时，鼠标位置相对lpItemRect的偏移量。
bIncludeLink | 如果要将链接数据复制套剪贴板中，则设置该值为TRUE。如果服务器应用不支持链接，则设置该值为FALSE。
dwEffects | 决定拖拉操作时允许使用的拖拉资源的效果。
lpRectStartDrag | 拖拉操作实际起始位置的矩形指针。要了解更多的信息，请参阅下面的说明。

说明：
调用DoDragDrop成员函数来实现拖放操作。拖放操作并不立即开始，而要等到鼠标从lpRectStartDrag指定的位置移开或者预先说明的几个毫秒的时间段过去。如果 lpRectStartDrag为NULL，那么矩形的尺寸为一个像素。
延时由WIN.INI 的[Windows]一节中DragDelay值说明。可以调用CWinApp:: WriteProfileString或CWinApp::WriteProfileInt修改延时。如果没有指定延时，则使用缺省值200毫秒。拖放的延时如下存储：
· | Windows NT的拖放延时存放在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\NT\CurrentVersion\IniFileMapping\win.ini\Windows\DragDelay中。
· | Windows 3.X的拖放延时存放在WIN.INI文件中，[Windows]节下。
· | Windows 95的拖放延时存放在WIN.INI的缓存版本中。
要了解更多有关延时如何存放在入口或.INI文件方面的信息，可参阅联机文档“平台SDK”中的::WriteProfileString。

请参阅：
COleDataSource::DoDragDrop, COleClientItem::CopyToClipboard


 COleClientItem::DoVerb

virtual BOOL DoVerb( LONG nVerb, CView* pView, LPMSG lpMsg = NULL );

返回值：若成功执行，则返回非零值，否则为0。

参数：
nVerb说明要执行的动词。它可以为下列值中的一个：
值 | 含义 | 符号
-0 | 主动词 | OLEIVERB_PRIMARY
-1 | 第二动词 | 无
-1 | 显示项用于编辑 | OLEIVERB_SHOW
-2 | 在分离窗口中编辑项 | OLEIVERB_OPEN
-3 | 隐藏项 | OLEIVERB_HIDE
-1值通常是另一个动词的别名。如果不支持打开编辑，-2值和-1具有相同的效果。其它的值，请参阅OLE文档中的IOleObject::DoVerb 。

pView | 指向包含OLE项的包容器视图窗口指针。该指针被服务器应用用于就地激活OLE项。如果包容器不支持就地激活，该参数为NULL。
lpMsg | 指向是该项被激活的消息的指针。

说明：
调用DoVerb执行指定的动作。此函数调用Active成员函数执行此动作，在产生异常时，它将缓存异常并给用户显示消息框。
如果主动词是编辑并且nVerb参数说明为0，则服务器应用启动为将允许OLE项被编辑。如果包容器应用支持就地激活，也就支持就地编辑。如果不支持就地编辑 (或说明了Open动词), 服务器在一分离的窗口中启动，在那里不能编辑。典型地，当包容器应用的用户在OLE项上双击, nVerb参数的主动词的值决定了用户能执行的动作。然而，如果服务器只支持一个动作，那么，不管在nVerb参数中说明了哪个值，总是执行那个动作。

请参阅：COleClientItem::Activate


 COleClientItem::Draw

BOOL Draw( CDC* pDC, LPCRECT lpBounds, DVASPECT nDrawAspect = (DVASPECT)-1 );

返回值：如果成功，则返回非零值，否则为0。

参数：
pDC | 指向绘制OLE项的CDC 对象指针。
lpBounds | 一个指向CRect对象或RECT结构的指针。它定义的绘制OLE项的矩形边界 (按设备上下文决定的逻辑单位)。
nDrawAspect | 说明OLE项的外观，也就是说，怎样显示OLE项。若nDrawAspect为-1，将延用上次用SetDrawAspect设定的外观。该标记的可能值请参阅SetDrawAspect。

说明：
调用该函数使用指定的设备上下文，在指定的矩形边界内绘制OLE项。该函数可以使用由COleServerItem的OnDraw成员函数创建的表示OLE项的元文件。
典型地，你将使用Draw进行屏幕显示，并用pDC来传送设备上下文。此时，只需说明前两个参数。
lpBounds给出的是目标设备上下文的矩形边界（相对它的当前映射模式）。着色操作可能缩放图形，并被包容器应用用来构造介于显示和打印之间的视图比例。
要了解更多的信息，请参阅OLE文档中的IViewObject::Draw。

请参阅：
COleClientItem::SetExtent, COleServerItem::OnDraw


 COleClientItem::GetActiveView

CView* GetActiveView( ) const;

返回值：
一个视图指针。如果项未被就地激活，则返回NULL 。

说明：返回就地激活的项的视图。

请参阅：
COleClientItem::IsInPlaceActive, COleClientItem::GetDocument


 COleClientItem::GetCachedExtent

BOOL GetCachedExtent(LPSIZE lpSize, DVASPECT nDrawAspect =(DVASPECT)-1);

返回值：
如果成功，则返回非零值；若OLE项是空白的，则返回0。

参数：
lpSize | 接受尺寸信息的SIZE结构或CSize对象的指针。
nDrawAspect | 要获取的OLE项的外观。可能的取值请参阅SetDrawAspect。

说明：
调用该函数以取得OLE项的尺寸。该函数提供与GetExtent函数相同的信息。但是，在其它OLE操作处理的同时，也可以调用GetCachedExtent来获取这些信息。单位是MM_HIMETRIC。
GetCachedExtent使用IViewObject2界面而非IOleObject 来获取项的范围信息。IViewObject2 COM对象缓存着上次调用IViewObject::Draw所用的范围信息。
要了解更多的信息，请参阅OLE文档中的IViewObject2::GetExtent。

请参阅：
COleClientItem::GetExtent, COleClientItem::SetExtent, COleServerItem::OnGetExtent


 COleClientItem::GetClassID

void GetClassID( CLSID* pClassID ) const;

参数：
pClassID 获取类标识的类型为CLSID的值的指针。有关CLSID的更多信息，请参阅OLE文档。

说明：
返回项的类标识存入指针pClassID所指向的内存。类标识是一个128位的数字，它唯一标识编辑项的应用。
要了解更多的信息，请参阅OLE文档中的IPersist::GetClassID。


 COleClientItem::GetClipboardData

void GetClipboardData(COleDataSource* pDataSource,
BOOL bIncludeLink = FALSE,
LPPOINT lpOffset = NULL,
LPSIZE lpSize = NULL
);

参数：
pDataSource | 一个COleDataSource对象指针，用以存取包含在OLE项中的数据。
bIncludeLink | 如果需要包含链接数据，则设置为TRUE；否则为FALSE。
lpOffset | 相对对象的原始位置的鼠标偏移量（以像素为单位）。
lpSize | 对象的尺寸（以像素为单位）。

说明：
调用该函数得到一个COleDataSource对象，其中包含了调用CopyToClipboard成员函数放置在剪贴板中的数据。
如果需要提供除由CopyToClipboard提供的信息以外的数据格式信息时，可覆盖GetClipboardData，然后将COleDataSource对象指针传给COleDataSource:: SetClipboard函数。例如，要使OLE项在包容器文档中的位置和在剪贴板中的位置一致，则必须定义自己的信息传送格式，并在调用CopyToClipboard之前将它放入COleDataSource对象。

请参阅：
COleDataSource, COleClientItem::CopyToClipboard, COleDataSource::SetClipboard


 COleClientItem::GetDocument

COleDocument* GetDocument( ) const;

返回值：
如果该项不是文档的一部分，则返回NULL。

说明：
调用该函数包含该OLE项的文档指针。该指针使你能访问到在COleClientItem构造函数中作为参变量输入的COleDocument对象。

请参阅：
COleClientItem::COleClientItem, COleDocument, COleLinkingDoc


 COleClientItem::GetDrawAspect

DVASPECT GetDrawAspect( ) const;

返回值：
DVASPECT枚举类型的一个值。它的取值列在SetDrawAspect的参考文档中。

说明：
调用GetDrawAspect成员函数获取项的当前视图或“外观”。外观说明了项是如何显示的。

请参阅：
COleClientItem::SetDrawAspect, COleClientItem::Draw


 COleClientItem::GetExtent

BOOL GetExtent( LPSIZE lpSize, DVASPECT nDrawAspect =(DVASPECT)-1 );

返回值：
如果成功，则返回非零值；若OLE项是空白的，则返回0。

参数：
lpSize | 接受尺寸信息的SIZE 结构或CSize对象的指针。
nDrawAspect | 要获取的OLE项的外观。可能值请参阅SetDrawAspect。

说明：
调用该函数以获取OLE项的尺寸。
如果服务器应用是用Microsoft基础类库编写的，将在调用该函数的COleServerItem上引发OnGetExtent成员函数。注意，该函数存取到的尺寸可能与上次用SetExtent成员函数设置的尺寸不同。SetExtent设置的值指被当作一个参考值。尺寸单位是MM_HIMETRIC。
注意：
不要在其它OLE操作处理过程中调用GetExtent，而应调用GetCached Extent。
要了解更多的信息，请参阅OLE文档中的IOleObject::GetExtent。

请参阅：
COleClientItem::SetExtent, COleClientItem::GetCachedExtent, COleServerItem::OnGetExtent


 COleClientItem::GetIconFromRegistry

HICON GetIconFromRegistry( ) const;
static HICON GetIconFromRegistry(CLSID& clsid);

返回值：
一个有效的图标句柄。如果找不到服务器的图标或缺省的图标，则返回NULL。

参数：
clsid 和图标的服务器关联的CLSID的一个参考。

说明：
调用该函数以和图标的服务器关联的CLSID的一个参考。
即使服务器处于运行状态，该成员函数也不会动态地启动服务器或取得图标。相反地，该函数只是打开服务器的可执行图象，存取服务器注册时关联的静态图标。


 COleClientItem::GetIconicMetafile

HGLOBAL GetIconicMetafile( );

返回值：
如果成功，则返回元文件的句柄。否则返回NULL。

说明：
获取用于绘制项的图标的元文件。如果没有当前图标，则返回缺省图标。该函数由MFC/OLE对话框自动调用，一般不直接调用。
该函数还调用SetIconicMetafile将元文件放入缓存以备使用。

请参阅：COleClientItem::SetIconicMetafile


 COleClientItem::GetInPlaceWindow

CWnd* GetInPlaceWindow( );

返回值：
一个项的就地编辑窗口的指针。如果服务器不可用或项未被激活，则返回NULL。

说明：
如果项在一个窗口中被打开进行就地编辑，可以调用GetInPlaceWindow成员函数获得该窗口的指针。只有就地激活的项才可调用该函数。

请参阅：
COleClientItem::Activate, COleClientItem::Deactivate, COleClientItem::SetItemRects


 COleClientItem::GetItemState

UINT GetItemState( ) const;

返回值：
一个COleClientItem::ItemState枚举值。它可以是下列值：emptyState,loadedState, openState, activeState, activeUIState。关于这些状态的信息，请参阅联机文档“Visual C++ 程序员指南” 中的“包容器：客户项状态”。

说明：
调用该函数获取OLE项的当前状态。如果要OLE项的状态改变时发出通知。则使用OnChange成员函数。
要了解更多的信息，请参阅联机文档“Visual C++程序员指南”中的“包容器：客户项状态”。

请参阅：COleClientItem::OnChange


 COleClientItem::GetLastStatus

SCODE GetLastStatus( ) const;

返回值：一个SCODE值。

说明：
返回上次OLE操作的状态码。如果返回布尔值的成员函数返回FALSE，或其它的成员函数返回NULL，GetLastStatus返回更详细的失败信息。
注意，大部分OLE成员函数在严重出错时引发异常。解释SCODE的信息随着返回SCODE值的OLE调用的不同而不同。
要了解更多有关SCODE的信息，请参阅联机文档“平台SDK”中的“COM错误代码结构”。


 COleClientItem::GetLinkUpdateOptions

OLEUPDATE GetLinkUpdateOptions( );

返回值：
下列值中的某一个值：
· | OLEUPDATE_ALWAYS | 随时更新链接项。该选项支持链接对话框中的自动链接-更新单选钮。
· | OLEUPDATE_ONCALL | 在包容器应用发出更新请求时更新链接项(调用UpdateLink成员函数)。该选项支持链接对话框中的手动链接更新单选钮。

说明：
调用该函数获取OLE项的链接-更新选项的当前值。这是个高级操作。该函数由COleLinksDialog类自动调用。
要了解更多的信息，请参阅OLE文档中的IOleLink::GetUpdateOptions。

请参阅：
COleClientItem::SetLinkUpdateOptions, COleLinksDialog


 COleClientItem::GetType

OLE_OBJTYPE GetType( ) const;

返回值： 一个无符号整数，可以是下列值：
· | OT_LINK | 该OLE项是链接的。
· | OT_EMBEDDED | 该OLE项是嵌入的。
· | OT_STATIC | 该OLE项是静态的。也就是说，它仅包含外部表示数据，而无内部数据，不能被编辑。

说明：
调用该函数以判定一个OLE项是嵌入的、链接的或静态的。

请参阅：COleClientItem::GetUserType


 COleClientItem::GetUserType

void GetUserType( USERCLASSTYPE nUserClassType, CString& rString );

参数：
nUserClassType用于指示OLE项类型字符串的不同类型的值。它可为下列值：
· | USERCLASSTYPE_FULL | 提供给用户的完全类型名称。
· | USERCLASSTYPE_SHORT | 在弹出菜单和编辑链接对话框中使用的短名称(最多15个字符)。
· | USERCLASSTYPE_APPNAME | 维持该类的应用名。
rString 一个CString对象的参考，该CString对象用以返回OLE项类型字符串。

说明：
调用该函数获取用户可见的描述OLE项类型的字符串，例如“Worddocument”。它常常是系统注册数据库的登录名。
如果要求完整类型名称但不可得到，将用段名称替代。如果在注册数据库找不到该OLE项类型的登录名，或者没有用户类型注册该OLE项类型，那么将使用当前存放在 OLE项的用户类型。如果用户类型名为空字符串，将使用“Unknown Object”。
要了解更多的信息，请参阅OLE文档中的IOleObject::GetUserType。

请参阅：COleClientItem::GetType


 COleClientItem::IsInPlaceActive

BOOL IsInPlaceActive( ) const;

返回值：
如果项处于就地激活状态，则返回非零值，否则为0。

说明：
调用该函数来判定OLE项是否处于就地激活状态。经常地，应用将根据项是否被就地激活的状态的不同，而执行不同的逻辑。该函数检查当前项的状态是否等于activeState或activeUIState。

请参阅：COleClientItem::GetItemState


 COleClientItem::IsLinkUpToDate

BOOL IsLinkUpToDate( ) const;

返回值：如果是最新的，则返回非零值。

说明：
调用该函数判定OLE项是否是最新的。当链接项的资源文档被更新，它就成为过时的了。一个包含链接的嵌入项也相应地成为过时的。该函数递归地执行对OLE项的检查。注意判断一个OLE项是否过时的代价同实际执行一次更新的代价是差不多的。
该函数由COleLinksDialog自动调用。
要了解更多的信息，请参阅OLE文档中的IOleObject::IsUpToDate。


 COleClientItem::IsModified

BOOL IsModified( ) const;

返回值：如果项是脏的，则返回非零值，否则为0。

说明：
调用该函数判定OLE项是否是脏的(在上次保存后已被修改)。
要了解更多的信息，请参阅OLE文档中的IPersistStorage::IsDirty。


 COleClientItem::IsOpen

BOOL IsOpen( ) const;

返回值：
如果项是打开的，则返回非零值，否则为0。

说明：
调用该函数判定OLE项是否是打开的；也即，被在已分离的窗口中运行的服务器应用的一个实例所打开。该函数用户确定什么时候按孵化模式绘制该对象。一个打开的对象顶部应有一个孵化模式。可以用一个CRectTracker对象来完成它。

请参阅：COleClientItem::GetItemState, CRectTracker


 COleClientItem::IsRunning

BOOL IsRunning( ) const;

返回值：
如果项正在运行，则返回非零值，否则为0。

说明：
调用该函数判定OLE项是否正在运行，也即，一个项是否已被装入，并在服务器应用上运行。
要了解更多的信息，请参阅OLE文档中的OleIsRunning。


 COleClientItem::OnActivate

virtual void OnActivate( );

说明：
框架调用以通知项表示它刚被就地激活。注意，该函数被用于指示服务器正在运行，而非指示项的用户界面已经被安装到包容器应用中。基于这一点，对象并不拥有一个活动的用户界面 (即不处于activeUIState状态)。它没有安装它的菜单和工具条。当安装时，OnActivateUI成员函数将被调用。
缺省执行时，它使用OLE_CHANGEDSTATE参数调用OnChange成员函数。当一个项被就地激活时，可以覆盖该函数执行自定义的处理。

请参阅：
COleClientItem::OnDeactivate, COleClientItem::OnDeactivateUI, COleClientItem::OnActivateUI, COleClientItem::CanActivate


 COleClientItem::OnActivateUI

virtual void OnActivateUI( );

说明：
当对象进入活动的用户界面状态时，框架调用OnActivateUI。该对象现在已经安装了它的工具条和菜单。
缺省执行时它将记下服务器的HWND，以备后面调用GetServerWindow时使用。

请参阅：
COleClientItem::OnDeactivate, COleClientItem::OnDeactivateUI, COleClientItem::OnActivate, COleClientItem::CanActivate


 COleClientItem::OnChange

virtual void OnChange( OLE_NOTIFICATION nCode, DWORD dwParam );

参数：
nCode服务器改变它的项的原因。它可为下列值：
· | OLE_CHANGED | OLE项的外观已被改变。
· | OLE_SAVED | OLE项已被保存。
· | OLE_CLOSED | OLE项已被关闭。
· | OLE_CHANGED_STATE | OLE项从一种状态转换到另一种状态。
dwParam 若nCode值为OLE_SAVED或OLE_CLOSED，该参数无效。如果nCode值为OLE_CHANGED，该参数说明OLE项外观被改变的方向，其可能的值请参阅COleClientItem::Draw的dwParam参数。如果nCode值为OLE_CHANGED_STATE，该参数为COleClientItem::ItemState的一个枚举值，它描述了新进入的状态。它可为下列值：emptyState, loadedState, openState, activeState或activeUIState。

说明：
当用户修改、保存或关闭一个OLE项时，框架调用该函数(如果服务器应用是用Microsoft基础类库编写的，调用该函数以响应COleServerDoc或COleServerItem的Notify成员函数)。缺省执行时，如果nCode为OLE_CHANGED 或OLE_SAVED，该函数表示包容器文档为“被修改”。
至于OLE_CHANGED_STATE，GetItemState返回的当前状态将仍是就地状态，表明该状态要当前优先于状态的改变。
覆盖该函数以响应OLE项的状态的改变。可以通过使显示项的区域变成无效来改变项的外观。在覆盖该函数时请调用它的基类的实现部分。

请参阅：
COleClientItem::GetItemState, COleServerItem::NotifyChanged, COleServerDoc::NotifyChanged, COleServerDoc::NotifyClosed, COleServerDoc::NotifySaved


 COleClientItem::OnChangeItemPosition

virtual BOOL OnChangeItemPosition( const CRect& rectPos );

返回值：
如果项的位置被成功改变，则返回非零值，否则为0。

参数：
rectPos 指示项在包容器应用的客户区中的相对位置。

说明：
框架调用以通知包容器，说明OLE项的范围在就地激活的时候已被改变。缺省执行时，该函数将确定OLE，并调用SetItemRects设定该新值。缺省执行时，该函数计算项新的可见矩形边界值并将有关信息传送到服务器。
覆盖该函数以实现resize/move操作的特殊规则。如果应用是用MFC编写的，服务器调用COleServerDoc::RequestPositionChange时将引发该调用。

请参阅：COleServerDoc::RequestPositionChange


 COleClientItem::OnDeactivate

virtual void OnDeactivate( );

说明：
当OLE项就地激活状态(activeState状态)转换到装入状态时，框架调用该函数, 表示一项在被就地激活后又被取消。注意该函数被用于指示OLE项被关闭，而不是指示它的用户界面从包容器应用中删除掉。当被删除时，框架调用OnDeactivateUI成员函数。
缺省执行时，它使用OLE_CHANGEDSTATE作为参数调用OnChange成员函数。当就地激活的项被取消时，可覆盖该函数以执行自定义的处理。例如，如果希望包容器应用支持撤消操作，可以覆盖该函数以丢弃撤消操作状态信息，表明一旦项被取消，在OLE项上执行的上一次操作不能被撤消。

请参阅：
COleClientItem::OnGetWindowContext, COleClientItem::OnDeactivateUI, COleClientItem::OnActivateUI, COleClientItem::OnActivate, COleClientItem::CanActivate, CDocTemplate::SetContainerInfo


 COleClientItem::OnDeactivateAndUndo

virtual void OnDeactivateAndUndo( );

说明：
当就地激活OLE项后用户发出撤消命令时，框架调用该函数。缺省执行时，它调用DeactivateUI以取消服务器的用户界面。如果要在包容器应用中实现撤消操作，可覆盖该函数。覆盖时，调用基类版本的函数，然后撤消在应用中执行的上一次操作。
要了解更多的信息，请参阅OLE文档中的IOleInPlaceSite::DeactivateAndUndo。

请参阅：COleClientItem::DeactivateUI


 COleClientItem::OnDeactivateUI

virtual void OnDeactivateUI( BOOL bUndoable );

参数：
bUndoable 说明所作的编辑修改能否被撤消。

说明：
当用户取消一就地激活的OLE项时调用该函数。该函数恢复包容器应用的用户界面到它的原始状态，并隐藏用于就地激活状态的所有菜单和控制项。
如果bUndoable为FALSE，包容器将使撤消命令不可用。实际上是丢弃了包容器的撤消状态信息，因为该参数说明在OLE项上执行的上一次操作是不能被撤消的。

请参阅：
COleClientItem::OnActivateUI, COleClientItem::OnDeactivateAndUndo, COleClientItem::OnDeactivate


 COleClientItem::OnDiscardUndoState

virtual void OnDiscardUndoState( );

说明：
当用户在编辑OLE项期间执行了丢弃撤消状态信息的动作，框架调用该函数。缺省执行时，该函数不做任何事情。如果你要在你的包容器应用中实现撤消操作，可覆盖该函数。覆盖时，丢弃撤消状态信息。
如果服务器是用Microsoft基础类库编写的，调用COleServerDoc::DiscardUndoState时将引发对该函数的调用。
要了解更多的信息，请参阅OLE文档中的IOleInPlaceSite::DiscardUndoState。

请参阅：COleServerDoc::DiscardUndoState


 COleClientItem::OnGetClipboardData

virtual COleDataSource* OnGetClipboardData( BOOL bIncludeLink, LPPOINT lpOffset, LPSIZE lpSize );

返回值：
指向包含有剪贴板内容的一个COleDataSource对象的指针。

参数：
bIncludeLink | 如果要复制链接数据到剪贴板中，设置该参数为TRUE；如果服务器应用不支持链接，设置该参数为FALSE。
lpOffset | 相对对象的原始位置的鼠标位置偏移量(像素)。
lpSize | 对象的尺寸(像素)。

说明：
调用该函数得到一个COleDataSource对象，其中包含了调用CopyToClipboard或DoDragDrop成员函数放置在剪贴板中的数据。缺省执行时，该函数调用GetClipboardData。

请参阅：
COleDataSource, COleClientItem::CopyToClipboard, COleClientItem::GetClipboardData, COleDataSource::SetClipboard


 COleClientItem::OnGetClipRect

virtual void OnGetClipRect( CRect& rClipRect );

参数：
rClipRect 指向一个CRect类的对象的指针。该对象保存项的剪切矩形边界坐标。

说明：
框架调用OnGetClipRect成员函数以获取一个正被编辑的项的剪切矩形边界坐标。坐标值是相对包容器应用窗口的客户区的（像素）。
缺省执行时，该函数仅简单地返回项就地激活的视图的客户区矩形边界。

请参阅：COleClientItem::OnActivate


 COleClientItem::OnGetItemPosition

virtual void OnGetItemPosition( CRect& rPosition );

参数：
rPosition包含有项的位置坐标的CRect对象的参考。

说明：
框架调用OnGetItemPosition成员函数以获取一个正被编辑的项的位置坐标。坐标值是相对包容器应用窗口的客户区的（像素）。缺省执行时，该函数不做任何工作。需要支持就地编辑功能的应用应实现该函数。

请参阅：
COleClientItem::OnActivate, COleClientItem::OnActivateUI


 COleClientItem::OnGetWindowContext

virtual BOOL OnGetWindowContext(CFrameWnd** ppMainFrame,
CFrameWnd** ppDocFrame,
LPOLEINPLACEFRAMEINFO lpFrameInfo
);

返回值：
如果成功，则返回非零值，否则为0。

参数：
ppMainFrame | 指向主框架窗口的指针的指针。
ppDocFrame | 指向文档框架窗口的指针的指针。
lpFrameInfo | 用于接受框架窗口信息的的一个OLEINPLACEFRAMEINFO结构的指针。

说明：
当一项被就地激活时，框架调用该函数。该函数用于存取OLE项的父窗口的信息。
如果包容器是MDI应用，缺省实现中用ppMainFrame返回CMDIFrameWnd对象的指针，用ppDocFrame返回CMDIChildWnd对象的指针。如果包容器是SDI应用, 缺省该函数时，它用ppMainFrame返回CFrameWnd对象的指针，而ppDocFrame返回NULL。缺省该函数时，它还填充lpFrameInfo的成员的内容。
如果该函数的缺省实现方式不适合你的应用时，可覆盖该函数；例如，你的应用的用户界面不同于SDI或MDI时。这是高级可覆盖特性。
要了解更多的信息，请参阅OLE文档中的IOleInPlaceSite::GetWindowContext和OLEINPLACEFRAMEINFO结构。


 COleClientItem::OnInsertMenus

virtual void OnInsertMenus( CMenu* pMenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths );

参数：
pMenuShared | 指向空菜单的指针。
lpMenuWidths | 指向一个由六个LONG值组成的数组的指针，它指示在下列每个菜单组中包含由多少个菜单项：文件、编辑、包容器、对象、窗口、帮助。包容器应用必须管理文件、包容器和窗口菜单组，分别对应与数组的第0, 2和4 个元素。

说明：
在就地激活状态向一个空菜单插入包容器应用的菜单期间，框架调用该函数。然后该菜单被传送到服务器上，服务器插入自己的菜单后形成了一个复合菜单。该函数可被多次调用以建立多个复合菜单。
缺省执行该函数时，它将pMenuShared插入包容器菜单，包括文件、包容器和窗口菜单组。使用CDocTemplate::SetContainerInfo设置这些菜单资源。它还会根据菜单资源，给lpMenuWidths数组的第0,2和4个元素指派适当的值。如果该函数的缺省实现方式不适合你的应用时，比如你的应用不应用文档摸板在资源和文档类型之间建立关联的时候，可覆盖该函数。覆盖该函数的同时，必须同时覆盖OnSetMenu和OnRemoveMenus，这是高级可覆盖特性。
要了解更多的信息，请参阅OLE文档中的IOleInPlaceFrame::InsertMenus。

请参阅：
COleClientItem::OnRemoveMenus, COleClientItem::OnSetMenu


 COleClientItem::OnRemoveMenus

virtual void OnRemoveMenus( CMenu* pMenuShared );

参数：
pMenuShared 指向调用OnInsertMenus成员函数构造的复合菜单的指针。

说明：
当就地激活状态结束时，框架调用该函数来从指定的复合菜单中删除包容器菜单。
缺省执行该函数时，它从pMenuShared删除包容器菜单，包括文件、包容器和窗口菜单组。如果该函数的缺省实现方式不适合你的应用时，比如你的应用不应用文档摸板在资源和文档类型之间建立关联的时候，可覆盖该函数。覆盖该函数的同时，必须同时覆盖OnSetMenu和OnRemoveMenus，这是高级可覆盖特性。
如果服务器重复调用OnInsertMenus来建立复合菜单，pMenuShared的子菜单可能为多个复合菜单共享。所以在你覆盖OnRemoveMenus 时，不能删除任何子菜单，而只能使它们脱离复合菜单。
要了解更多的信息，请参阅OLE文档中的IOleInPlaceFrame::RemoveMenus。

请参阅：
COleClientItem::OnInsertMenus, COleClientItem::OnSetMenu


 COleClientItem::OnScrollBy

virtual BOOL OnScrollBy( CSize sizeExtent );

返回值：
如果项滚动了，则返回非零值；如果项不能被滚动，则返回0。

参数：
sizeExtent 说明在x 和y轴方向上滚动的距离（以像素为单位）。

说明：
框架调用该函数响应服务器段请求滚动OLE项。例如，一个OLE项是部分可见，用户移动到其非可见部分进行就地编辑时，框架就会调用该函数以保证光标可见。缺省实现时，该函数不做任何工作。覆盖该函数以将项滚动指定的值。注意，滚动时，项的可见部分也相应改变了，需要调用SetItemRects更新项的可见矩形边界。
要了解更多的信息，请参阅OLE文档中的IOleInPlaceSite::Scroll。

请参阅：COleClientItem::SetItemRects


 COleClientItem::OnSetMenu

virtual void OnSetMenu( CMenu* pMenuShared, HOLEMENU holemenu, HWND hwndActiveObject );

参数：
pMenuShared | 指向调用OnInsertMenus成员函数或::InsertMenu函数构造的复合菜单的指针。
holemenu | 由::OleCreateMenuDescriptor函数返回的菜单描述符的句柄。若分派码已被删除，其值为NULL。
hwndActiveObject | OLE项的编辑窗口的句柄。该窗口将从OLE接受编辑命令。

说明：
当就地激活状态开始和结束时，框架两次调用该函数。第一次安装复合菜单，第二次删除复合菜单。缺省实现时，该函数安装或删除复合菜单柄调用OleSet-MenuDescriptor 函数安装或删除分派码。如果该函数的缺省实现方式不适合你的应用时，可覆盖该函数。覆盖该函数的同时，必须同时覆盖OnInsertMenus和OnRemoveMenus，这是高级可覆盖特性。
要了解更多的信息，请参阅OLE文档中的OleCreateMenuDescriptor，OleSetMenuDescriptor和IOleInPlaceFrame::SetMenu。

请参阅：
COleClientItem::OnInsertMenus, COleClientItem::OnRemoveMenus


 COleClientItem::OnShowControlBars

virtual BOOL OnShowControlBars( CFrameWnd* pFrameWnd, BOOL bShow );

返回值：
如果函数调用引起控件条的状态的改变，则返回非零值；如果没有改变，或pFrameWnd 不是指向包容器的框架窗口，则返回0。

参数：
pFrameWnd | 包容器应用的框架窗口的指针。它可以是一个主框架窗口或一个MDI子窗口。
bShow | 说明是显示控件条还是隐藏控件条。

说明：
框架调用以显示或隐藏包容器应用的控件条。如果控件条的状态同bShow说明的状态相同，该函数返回0。例如控件条已被隐藏并且bShow值为FALSE时，函数返回0。
缺省实现时，该函数从顶层框架窗口中删除工具条。

请参阅：
COleClientItem::OnInsertMenus, COleClientItem::OnSetMenu, COleClientItem::OnRemoveMenus, COleClientItem::OnUpdateFrameTitle


 COleClientItem::OnShowItem

virtual void OnShowItem( );

说明：
框架调用以显示OLE项，使它在编辑期间完全可见。当包容器应用支持链接嵌入项时使用该函数 (也即，如果从COleLinkingDoc派生文档类)。缺省实现时，该函数激活包容器文档的第一个视图。覆盖该函数滚动文档时，OLE项成为可见的。

请参阅：COleLinkingDoc


 COleClientItem::OnUpdateFrameTitle

virtual BOOL OnUpdateFrameTitle( );

返回值：
如果该函数成功更新了框架标题，则返回非零值；否则为0。

说明：
就地激活以更新框架标题栏时，框架调用该函数。缺省执行时，该函数并不改变框架窗口的标题。如果在你的应用中需要一个不同的框架标题，可覆盖该函数。例如"server app - item in docname"(如"Microsoft Excel - spreadsheet in REPORT.DOC")；这是高级可覆盖特性。


 COleClientItem::ReactivateAndUndo

BOOL ReactivateAndUndo( );

返回值：如果成功，则返回非零值，否则为0。

说明：
调用该函数重新激活OLE项并撤消上次编辑中执行的所有操作。如果包容器应用支持撤消命令，在用户取消激活OLE项后立即选择撤消命令时，调用该函数。
如果服务器应用是使用Microsoft基础类库编写的，调用该函数将使服务器去调用COleServerDoc::OnReactivateAndUndo。
要了解更多的信息，请参阅OLE文档中的IOleInPlaceObject::ReactivateAndUndo。

请参阅：
COleServerDoc::OnReactivateAndUndo, COleClientItem::OnDeactivateAndUndo


 COleClientItem::Release

virtual void Release( OLECLOSE dwCloseOption = OLECLOSE_NOSAVE );

参数：
dwCloseOption 说明在项目返回装入状态时怎样存储的标志。其可能的值请参阅COleClientItem::Close。

说明：
调用该函数清空OLE项使用的所有资源。Release由COleClientItem的析构函数调用。
要了解更多的信息，请参阅OLE文档中的IUnknown::Release。

请参阅：
COleClientItem::Close, COleClientItem::Delete


 COleClientItem::Reload

BOOL Reload( );

返回值：如果成功，则返回非零值，否则为0。

说明：
关闭并重载项。在调用ActivateAs函数将项激活为另一类型时，需要调用Reload函数。

请参阅：COleClientItem::ActivateAs


 COleClientItem::Run

void Run( );

说明：
运行和该项关联的应用。
调用Run成员函数以在激活项之前启动服务器应用。在Activate和DoVerb函数中会自动地完成该项工作，所以一般不需调用该函数。如果为了设置项的特性需要运行服务器，例如在执行DoVerb 之前执行SetExtent时，需要调用该函数。

请参阅：COleClientItem::IsRunning


 COleClientItem::SetDrawAspect

void SetDrawAspect( DVASPECT nDrawAspect );

参数：
nDrawAspectDVASPECT枚举的一个值。它可以是下列值：
· | DVASPECT_CONTENT | 该表示方式使得项能在它的包容器中作为一个嵌入对象行显示。
· | DVASPECT_THUMBNAIL | 该表示方式使得项能在浏览工具中显示。
· | DVASPECT_ICON | 以图标方式表示。
· | DVASPECT_DOCPRINT | 该表示方式使得项如同在文件菜单中选择打印命令被打印出来一样。

说明：
调用SetDrawAspect成员函数设置项的视图或“外观”。外观说明了在用nDrawAspect的缺省值作为参数输入时，项是如何用Draw函数绘制的。
该函数能被改变图标对话框（或其它直接使用改变图标对话框的对话框）自动调用，以根据用户要求用图标的方式来显示项。

请参阅：
COleClientItem::GetDrawAspect, COleClientItem::Draw


 COleClientItem::SetExtent

void SetExtent(const CSize& size, DVASPECT nDrawAspect = DVASPECT_CONTENT );

返回值：
如果成功，则返回非零值；若OLE项是空白的，则返回0。

参数：
size | 包含尺寸信息的CSize对象。
nDrawAspect | 要设置边界的OLE项的外观。可能值请参阅SetDrawAspect。

说明：
调用该函数说明有多少空间给OLE项使用。如果服务器应用是用Microsoft基础类库编写的，将在调用该函数的COleServerItem上引发OnSetExtent 成员函数。OLE项将相应地改变显示。尺寸单位必须是MM_HIMETRIC。当用户改变OLE项的尺寸时，调用该函数。
要了解更多的信息，请参阅OLE文档中的IOleObject::SetExtent。

请参阅：
COleClientItem::GetExtent, COleClientItem::GetCachedExtent, COleServerItem::OnSetExtent


 COleClientItem::SetHostNames

void SetHostNames( LPCTSTR lpszHost, LPCTSTR lpszHostObj );

参数：
lpszHost | 包容器应用的用户可见的名称的指针。
lpszHostObj | 包含OLE项的包容器的标识字符串的指针。

说明：
调用该函数指定包容器应用的名称和包含嵌入OLE项的包容器名称。如果服务器应用是使用Microsoft基础类库编写的，该函数将调用包含OLE项的COleServerDoc文档的OnSetHostNames成员函数。当OLE项被编辑时，该信息将被用于窗口的标题。每当包容器文档装入时，框架调就每个被编辑的OLE项调用该函数。SetHostNames仅适用于嵌入项。每次OLE项被激活进行编辑时，并不总要调用该函数。
当用不同的名称保存文件或装入对象时，该函数将自动地适用应用名称和文档名称为参数被调用。所以，一般不需直接调用该函数。
要了解更多的信息，请参阅OLE文档中的IOleObject::SetHostNames。

请参阅：COleServerDoc::OnSetHostNames


 COleClientItem::SetIconicMetafile

BOOL SetIconicMetafile( HGLOBAL hMetaPict );

返回值：如果成功，则返回非零值；否则为0。

参数：
hMetaPict 用于绘制相当图标的元文件的句柄。

说明：
该函数用于缓存绘制图标的元文件。使用GetIconicMetafile可以获取元文件。
hMetaPict参数将复制到项中；所以hMetaPict必须由调用者来释放。

请参阅：COleClientItem::GetIconicMetafile


 COleClientItem::SetItemRects

BOOL SetItemRects( LPCRECT lpPosRect = NULL, LPCRECT lpClipRect = NULL );

返回值：如果成功，则返回非零值；否则为0。

参数：
lprcPosRect | OLE项相对父窗口的客户区坐标的矩形边界的指针。
lprcClipRect | OLE项相对父窗口的客户区坐标的可见部分的矩形边界的指针。

说明：
调用该函数设置OLE项的边界矩形或可见区域的矩形。
OnChangeItemPosition成员函数缺省实现时将自动地调用该函数。一旦OLE的边界矩形或可见区域的矩形改变了，必须调用该函数。通常可以在视图的OnSize和OnScrollBy成员函数中调用该函数。
要了解更多的信息，请参阅OLE文档中的IOleInPlaceObject::SetObjectRects。

请参阅：
COleClientItem::OnChangeItemPosition, COleClientItem::OnGetItemPosition


 COleClientItem::SetLinkUpdateOptions

void SetLinkUpdateOptions( OLEUPDATE dwUpdateOpt );

参数：
dwUpdateOpt该项的链接-更新选项的值。它可以是下列值：
· | OLEUPDATE_ALWAYS | 随时更新链接项。该选项支持链接对话框中的自动链接-更新单选钮。
· | OLEUPDATE_ONCALL | 在包容器应用发出更新请求时更新链接项(调用UpdateLink成员函数)。该选项支持链接对话框中的手动链接更新单选钮。

说明：
调用该函数设置指定链接项的链接更新选项的值。一般不能改变用户在链接对话框中选定的更新选项。
要了解更多的信息，请参阅OLE文档中的IOleLink::SetUpdateOptions。

请参阅：
COleClientItem::GetLinkUpdateOptions, COleLinksDialog


 COleClientItem::SetPrintDevice

BOOL SetPrintDevice( const DVTARGETDEVICE* ptd );
BOOL SetPrintDevice( const PRINTDLG* ppd );

返回值：若函数成功，则返回非零值；否则为0。

参数：
ptd | 指向一个DVTARGETDEVICE数据结构的指针。其中包含了新的打印目标设备的信息。可以是NULL。
ppd | 指向一个PRINTDLG数据结构的指针。其中包含了新的打印目标设备的信息。可以是NULL。

说明：
调用该函数改变该项的打印目标设备。该函数指改变项的打印目标设备但不刷新项的表示缓存。更新项的表示缓存，可使用UpdateLink。
该函数的输入参数包含了OLE系统中用以标识目标设备的信息。
PRINTDLG结构包含Windows用以初始化一般打印对话框的信息。关闭对话框后，Windows返回用该结构返回用户的选择。CPrintDialog 的m_pd成员是一个PRINTDLG结构。
关于该结构的信息，请参阅Win32 文档中的PRINTDLG。
要了解更多的信息，请参阅OLE文档中的DVTARGETDEVICE。

请参阅：
COleClientItem::UpdateLink, CPrintDialog


 COleClientItem::UpdateLink

BOOL UpdateLink( );

返回值：如果成功，则返回非零值；否则为0。

说明：
调用该函数立即更新OLE项的标识数据。对一个链接项来说，该函数为OLE项找到获得新的表示的链接资源。该处理可能涉及一个或多个的服务器应用，将十分地耗时。对嵌入对象来说，该函数递归地检查嵌入项中的链接是否已经过时并更新它。用户可用链接对话框手工地更新个别的链接。
要了解更多的信息，请参阅OLE文档中的IOleLink::Update。

请参阅：COleLinksDialog


 COleCmdUI

CCmdUI
└COleCmdUI

COleCmdUI类为MFC实现了更新用户界面对象的方法，它使你的应用具备IOleCommandTarget驱动的特性。在不支持DocObjects的应用中，当用户在应用里查看菜单时， MFC处理UPDATE_COMMAND_UI通知。每个通知都对应着一个能被操作以反映各自的命令状态的CCmdUI对象。然而，当希望应用支持DocObjects时，MFC处理UPDATE_OLE_COMMAND_UI通知并指派COleCmdUI对象。
COleCmdUI 允许一个DocObject接收由它的包容器的用户界面发出的命令(例如新建文件，打开打印等等)，同时也允许一个包容器接收由DocObject的用户界面发出的命令，尽管我们也可以用IDispatch来分派命令。但IOleCommandTarget 提供了查询和执行的一种简单方法，因为它是建立在一个标准的命令集合上，通常不需参数，也不涉及类型信息。COleCmdUI可被用作支持，更新和设置DocObject 用户界面的其它特性。要调用命令时，可调用COleServerDoc::OnExecOleCmd。
关于DocObjects的信息，请参阅CDocObjectServer和CDocObjectServerItem。或请参阅联机文档“Visual C++程序员指南中”中的“Internet初步：激活文档”和“ 激活文档”。
#include <afxdocobj.h>

COleCmdUI类的成员

构造函数
COleCmdUI 构造一个COleCmdUI对象

可覆盖的函数
Enable | 设置或清除命令可用标志
SetCheck | 设置开/关（on/off）切换命令的状态
SetText | 返回一个命令的文本名或状态


 COleCmdUI::COleCmdUI

COleCmdUI( OLECMD* rgCmds, ULONG cCmds, const GUID* pGroup );

参数：
rgCmds | 和给定的GUID相关的支持命令的清单。OLECMD结构将命令和命令标志相关联。
cCmds | rgCmds中的命令记数。
pGroup | 标识命令集的GUID的指针。

说明：
构造一个与某用户命令相关的COleCmdUI对象。COleCmdUI对象提供了修改DocObject用户界面对象（如菜单项或控件条按钮等）的可编程界面。 用户界面对象可以通过COleCmdUI对象被激活，使其无效、检查和/或清除。


 COleCmdUI::Enable

virtual void Enable( BOOL bOn = TRUE );

参数：
bOn 指示和该COleCmdUI对象关联的命令被激活或使其无效。激活命令用非零值；否则用0。

说明：
调用该函数设置COleCmdUI对象的命令标志为OLECOMDF_ENABLED，说明该命令可用并有效，或清除该命令标志。


 COleCmdUI::SetCheck

virtual void SetCheck( int nCheck = 1 );

参数：
nCheck判定开/关（on/off）切换命令的状态的值。它们是：
值 | 描述
1 | 设置命令为开（on）
2 | 设置命令为不确定状态；因为该命令的特性在不同的选择中可能是开，也可能是关，所以无法确定命令的状态
其它值 | 设置命令为关（off）

说明：
调用该函数设置开/关（on/off）切换命令的状态。

请参阅：COleCmdUI::SetText


 COleCmdUI::SetText

virtual void SetText( LPCTSTR lpszText );

参数：
lpszText 指向和命令一起使用的文本的指针。

说明：
调用该函数返回一个命令的文本名或状态。

请参阅：COleCmdUI::SetCheck


 COleControl

CObject
└CCmdTarget
└CWnd
└COleControl

COleControl类是一个开发OLE控件的功能强大的基类。它由CWnd类派生，继承了Windows窗口对象的所有功能，并加上了OLE独有的功能，例如事件触发、支持方法和特性等。
OLE控件可以插入到OLE包容器中，并通过事件触发和包容器引发方法和特性的双向系统相互通讯和联系。注意，标准的OLE包容器仅支持OLE控件的基本功能，而不支持OLE控件的扩展特性。当在控件中采取某个动作，就会向包容器发出一个事件，称为事件触发。相反，包容器引发一系列的类似于C++类的成员函数和数据成员的方法和特性来与控件进行通讯。这种方法使开发者可以控制控件的外观，并在产生某些动作时通知包容器。
无窗口控件
OLE控件可在没有窗口的情况下使用。无窗口控件是十分有用的：
·无窗口控件可以是透明和无形的。
·无窗口控件减小了实例的尺寸和创建对象的时间。
控件并不需要窗口。一个窗口提供的服务可以容易地通过一个单一的共享窗口（通常是包容器的）和分派码的一位来提供。有一个窗口通常使对象的复杂度增加。
当使用无窗口激活时，包容器（它有一个窗口）将负责提供本来应由控件自己的窗口提供的服务。例如，如果你的控件需要查询键盘输入焦点、查询鼠标位置或获取一个设备上下文等，都由包容器来提供支持。
COleControl无窗口操作成员函数将调用包容器上的这些操作。
当不能使用无窗口激活时，包容器会向控件的IOleInPlaceObjectWindowless界面（支持无窗口的IOleInPlaceObject的扩展）发送输入消息。在适当调整鼠标坐标后，COleControl实现这些该界面时通过控件的消息映射图分派这些消息。可以通过增加消息映射图的入口点，同处理普通的窗口消息一样处理这些消息。
在无窗口控件中，通常需要使用COleControl成员函数来代替相应的成员函数或相关的Windows API函数。
只有在OLE控件对象活动时，它们也能创建窗口。但是对象进行不活动-活动切换的工作量增大，速度也会下降。这可能会引发一些问题：
例如在文本框的栅格中，当光标在列间上下移动时，每个控件都先被就地激活，然后取消。这样不活动/活动切换的速度将直接影响滚动的速度。
关于开发一个OLE控件框架的信息，请参阅联机文档“Visual C++程序员指南”中的“ActiveX控件”和“用ActiveX ControlWizard创建程序”。关于向一个基本框架基础上增加功能的信息，请参阅联机文档“Visual C++程序员指南”中的“建立一个ActiveX控件”。关于OLE控件优化的信息，包括无窗口和flicker-free控件，请参阅联机文档“Visual C++程序员指南”中的“ActiveX控件：优化”。
#include <afxctl.h>

请参阅：
COlePropertyPage, CFontHolder, CPictureHolder

COleControl类的成员

构造函数/析构函数
COleControl | 创建一个COleControl对象
RecreateControlWindow | 销毁并重建控件的窗口

初始化
InitializeIIDs | 将控件将要使用的IIDs通知基类
ResetStockProps | 初始化COleControl的标准特性为缺省值
ResetVersion | 将版本数设置为给定值
SetInitialSize | 设置一个OLE控件第一次在包容器中显示的尺寸

控件修改函数
GetControlFlags | 存取控件标志设置
IsModified | 判定控件的状态是否已经改变
SetModifiedFlag | 改变一个控件的修改状态
ExchangeExtent | 串行化控件的宽度和高度
ExchangeStockProps | 串行化控件的标准特性
ExchangeVersion | 串行化控件的版本号
IsConvertingVBX | 允许OLE控件的指定装入
SerializeExtent | 串行化或初始化控件的显示空间
SerializeStockProps | 串行化或初始化COleControl标准特性
SerializeVersion | 串行化或初始化控件的版本信息
SetModifiedFlag | 改变控件的修改状态
WillAmbientsBeValidDuringLoad | 决定环境特性在控件下次装入时是否可用

更新/绘画函数
DoSuperclassPaint | 重画一个从Windows控件派生的OLE控件
InvalidateControl | 使一个已经显示的控件的区域无效，导致重画控件
IsOptimizedDraw | 指示包容器是否支持当前绘画操作的优化
SelectFontObject | 为一个设备上下文选定自定义Font特性
SelectStockFont | 为一个设备上下文选定标准Font特性
TranslateColor | 将OLE_COLOR值转换为一个COLORREF值

分派异常
GetNotSupported | 禁止用户存取控件的特性
SetNotPermitted | 指示编辑请求失败
SetNotSupported | 禁止用户修改控件的特性
ThrowError | OLE控件出错时发出信号

环境属性函数
AmbientBackColor | 返回环境BackColor特性的值
AmbientDisplayName | 返回由包容器说明的控件名称
AmbientForeColor | 返回环境ForeColor特性的值
AmbientFont | 返回环境Font特性的值
AmbientLocaleID | 返回包容器的本地标识（ID）
AmbientScaleUnits | 返回包容器使用的单位名称
AmbientShowGrabHandles | 决定是否要显示抓取句柄
AmbientShowHatching | 决定是否显示阴影
AmbientTextAlign | 返回包容器说明的文本对齐方式
AmbientUIDead | 决定控件是否要响应用户动作
AmbientUserMode | 决定包容器模式
GetAmbientProperty | 返回指定的环境变量值

事件触发函数
FireClick | 触发标准Click事件
FireDblClick | 触发标准DblClick事件
FireError | 触发标准Error事件FireEvent触发一个自定义事件
FireKeyDown | 触发标准KeyDown事件
FireKeyPress | 触发标准KeyPress事件
FireKeyUp | 触发标准KeyUp事件
FireMouseDown | 触发标准MouseDown事件
FireMouseMove | 触发标准MouseMove事件
FireMouseUp | 触发标准MouseUp事件
FireReadyStateChange | 当控件的就绪状态改变时，触发一个事件

标准方法和属性
DoClick | 执行标准DoClick方法
Refresh | 重画控件外观
GetAppearance | 返回标准Appearance特性的值
SetAppearance | 设置标准Appearance特性的值
GetBackColor | 返回标准BackColor特性的值
SetBackColor | 设置标准BackColor特性的值
GetBorderStyle | 返回标准BorderStyle特性的值
SetBorderStyle | 设置标准BorderStyle特性的值
GetEnabled | 发挥标准Enabled 特性的值
SetEnabled | 设置标准Enabled 特性的值
GetForeColor | 返回标准ForeColor特性的值
SetForeColor | 设置标准ForeColor特性的值
GetFont | 返回标准Font特性的值
SetFont | 设置标准Font特性的值
GetText | 返回标准Text或Caption特性的值
SetText | 设置标准Text或Caption特性的值
GetFontTextMetrics | 返回CFontHolder对象的度量
GetStockTextMetrics | 返回标准Font特性的度量
InternalGetFont | 返回CFontHolder对象的标准Font特性的值
InternalGetText | 获取标准Text或Caption特性
SelectStockFont | 选择控件的标准Font特性到设备上下文中
GetHwnd | 返回标准hWnd特性的值

OLE控件的尺寸函数
GetControlSize | 返回OLE控件的位置和尺寸
SetControlSize | 设置OLE控件的位置和尺寸
GetRectInContainer | 返回控件相对它的包容器的矩形边界
SetRectInContainer | 设置控件相对它的包容器的矩形边界

OLE数据绑定函数
BoundPropertyChanged | 通知包容器，说明绑定特性已经改变
BoundPropertyRequestEdit | 申请编辑特性值的许可权限

简单框架函数
EnableSimpleFrame 使控件支持简单框架

OLE控件位置函数
ControlInfoChanged | 控件处理的助记符改变后调用该函数
GetClientSite | 查询在包容器内的对象的当前客户区指针
GetExtendedControl | 获取属于该包容器的一个扩展控件对象的指针
LockInPlaceActive | 决定控件能否被包容器取消
TransformCoords | 在包容器和控件之间变换坐标

模态对话框函数
PreModalDialog | 通知包容器，说明将显示一个模态对话框
PostModalDialog | 通知包容器，说明一个模态对话框已被关闭

无窗口操作
ClipCaretRect | 一个脱字符号被控件覆盖，调整它的矩形边界
GetCapture | 决定一个无窗口、活动控件对象是否获得鼠标捕获焦点
GetClientRect | 获取控件客户区的尺寸
GetDC | 提供无窗口控件从它的包容器获得设备上下文的途径
GetFocus | 决定一个控件是否具有输入焦点
GetWindowlessDropTarget | 覆盖该函数，允许无窗口控件成为拖放操作的目标
InvalidateRgn | 使包容器窗口的客户区在给定区域内无效。用于重画该区域内的无窗口控件
OnWindowlessMessage | 处理无窗口控件的窗口消息（鼠标和键盘消息除外）
ReleaseCapture | 释放鼠标捕获焦点
ReleaseDC | 释放无窗口控件的包容器的显示设备上下文
ScrollWindow | 允许无窗口控件在屏幕上滚动它的活动图象的一个区域
SetCapture | 使控件的包容器窗口取代控件的鼠标捕获焦点
SetFocus | 使控件的包容器窗口取代控件的输入焦点

非活动指针处理函数
ClientToParent | 将相对控件原点的点平移到相对它的包容器原点的点
GetActivationPolicy | 改变支持IPointerInactive界面的控件的缺省激活行为
GetClientOffset | 获取控件矩形区域左上角和它的客户区左上角的差别
OnInactiveMouseMove | 覆盖该函数，使鼠标指示下的非活动控件的包容器向控件分派WM_MOUSEMOVE消息
OnInactiveSetCursor | 覆盖该函数，使鼠标指示下的非活动控件的包容器像控件分派WM_SETCURSOR消息
ParentToClient | 将相对包容器原点的点平移到相对它的控件原点的点

异步控制函数
GetReadyState | 返回控件的就绪状态
InternalSetReadyState | 设置控件的就绪状态，触发就绪状态改变事件
Load | 重新设置先前的异步数据，初始化新装控件异步特性

可覆盖的函数
DisplayError | 向控件用户显示标准Error事件
DoPropExchange | 串行化COleControl对象特性
GetClassID | 获取控件的OLE类标识
GetMessageString | 为菜单项提供状态栏文本
IsSubclassedControl | 判定控件是否为Windows控件的子类
OnClick | 调用它触发标准Click事件
OnDoVerb | 执行一个控件动词后调用该函数
OnDraw | 当用户要求重画时调用该函数
OnDrawMetaFile | 当控件请求使用一个元文件设备上下文重画时，包容器调用该函数
OnEdit | 包容器调用以激活OLE控件的用户界面

可覆盖的函数
OnEnumVerbs | 由包容器调用以为控件的动词技术
OnEventAdvise | 当事件处理函数和控件建立或断开连接时调用该函数
OnKeyDownEvent | 当触发标准KeyDown事件后调用该函数
OnKeyPressEvent | 当触发标准KeyPress事件后调用该函数
OnKeyUpEvent | 当触发标准KeyUp事件后调用该函数
OnProperties | 当执行控件的"Properties"动词后调用该函数
OnResetState | 设置控件特性为缺省值

改变通知函数
OnAppearanceChanged | 当标准Appearance特性改变时调用该函数
OnBackColorChanged | 当标准BackColor特性改变时调用该函数
OnBorderStyleChanged | 当标准BorderStyle特性改变时调用该函数
OnEnabledChanged | 当标准Enabled特性改变时调用该函数
OnFontChanged | 当标准Font特性改变时调用该函数
OnForeColorChanged | 当标准ForeColor特性改变时调用该函数
OnTextChanged | 当标准Text或Caption特性改变时调用该函数

OLE界面通知函数
OnAmbientPropertyChange | 当环境特性改变时调用该函数
OnClose | 通知控件，说明调用了IOleControl::Close
OnFreezeEvents | 当控件事件冻结或解冻时调用该函数
OnGetControlInfo | 向包容器提供助记符信息
OnMnemonic | 当控件的助记符输入时调用该函数
OnRenderData | 框架调用以获取指定格式的数据
OnRenderFileData | 框架调用以从文件获取指定格式的数据
OnRenderGlobalData | 框架调用以从全局内存获取指定格式的数据
OnSetClientSite | 通知控件，说明调用了IOleControl::SetClientSite
OnSetData | 将控件的数据替换成另一个值
OnSetExtent | 当控件的范围改变时调用该函数
OnSetObjectRects | 当控件的维改变时调用该函数

可覆盖的IViewObject界面通知函数
OnGetColorSet | 通知控件，说明调用了IOleObject::GetColorSet
OnGetNaturalExtent | 覆盖该函数以获取控件最接近计划尺寸和扩展模式的显示尺寸
OnGetViewExtent | 覆盖该函数以获取控件显示区域的尺寸
OnGetViewRect | 覆盖该函数将控件尺寸转换为从以指定位置开始的矩形
OnGetViewStatus | 覆盖该函数以获取控件的视图状态
OnQueryHitPoint | 覆盖该函数以询问控件的显示是否覆盖了一个指定点
OnQueryHitRect | 覆盖该函数以询问控件的显示是否覆盖了一个指定矩形内的任意点

就地激活函数
OnGetInPlaceMenu | 请求将和包容器菜单合并的控件菜单的句柄
OnHideToolBars | 当控件UI取消时，包容器调用该函数
OnShowToolBars | 当控件UI 激活时，包容器调用该函数

属性浏览函数
OnGetDisplayString | 调用该函数以取得代表一个特性值的字符串
OnGetPredefinedStrings | 返回代表一个特性的所有可能值的一组字符串
OnGetPredefinedValue | 返回对应一个预定义字符串的值
OnMapPropertyToPage | 指示用哪个特性页编辑一个特性


 COleControl::AmbientBackColor

OLE_COLOR AmbientBackColor( );

返回值：
如果有的话，则返回包容器的环境BackColor特性的当前值。如果不支持该特性，该函数返回系统定义的Windows 背景颜色。

说明：
环境BackColor特性对所有的控件都是可用的，并由包容器定义。注意包容器并不一定要支持该特性。

请参阅：
COleControl::TranslateColor, COleControl::GetBackColor, COleControl::AmbientForeColor


 COleControl::AmbientDisplayName

CString AmbientDisplayName( );

返回值：
OLE控件的名称。缺省值为一个零长度的字符串。

说明：
指派给控件的包容器名称，可以用于向用户显示错误消息。注意包容器并不一定要支持该特性。


 COleControl::AmbientFont

LPFONTDISP AmbientFont( );

返回值：
包容器环境Font分派界面的指针。缺省值为NULL。如果返回值不等于NULL, 必须调用字体的IUnknown::Release 成员函数来释放字体。

说明：
环境Font 特性对所有的控件都是可用的，并由包容器定义。注意包容器并不一定要支持该特性。

请参阅：
COleControl::GetFont, COleControl::SetFont


 COleControl::AmbientForeColor

OLE_COLOR AmbientForeColor( );

返回值：
如果有的话，则返回包容器的环境ForeColor特性的当前值。如果不支持该特性，该函数返回系统定义的Windows文本颜色。

说明：
环境ForeColor 特性对所有的控件都是可用的，并由包容器定义。注意包容器并不一定要支持该特性。

请参阅：
COleControl::AmbientBackColor, COleControl::GetForeColor, COleControl::TranslateColor


 COleControl::AmbientLocaleID

LCID AmbientLocaleID( );

返回值：
如果有的话，则返回包容器的环境LocaleID特性的当前值。如果不支持该特性，该函数返回0。

说明：
控件可以使用LocaleID改变指定的用户界面。注意包容器并不一定要支持该特性。


 COleControl::AmbientScaleUnits

CString AmbientScaleUnits( );

返回值：
返回包含环境ScaleUnits特性的字符串。如果不支持该特性，该函数返回一个零长度的字符串。

说明：
包容器的环境ScaleUnits特性可用于显示位置或维，用选定的单位标识，例如twip或厘米。注意包容器并不一定要支持该特性。

请参阅：COleControl::TransformCoords


 COleControl::AmbientShowGrabHandles

BOOL AmbientShowGrabHandles( );

返回值：
如果需要显示抓取句柄，则返回非零值，否则为0。如果不支持该特性，则返回非零值。

说明：
调用该函数以判定包容器是否允许控件在其活动期间显示抓取句柄。注意包容器并不一定要支持该特性。

请参阅：COleControl::AmbientShowHatching


 COleControl::AmbientShowHatching

BOOL AmbientShowHatching( );

返回值：
如果要显示阴影模式，则返回非零值，否则为0。如果不支持该特性，该函数返回非零值。

说明：
调用该函数以判定包容器是否允许控件在其用户界面活动期间应用阴影模式显示。注意包容器并不一定要支持该特性。

请参阅：COleControl::AmbientShowGrabHandles


 COleControl::AmbientTextAlign

short AmbientTextAlign( );

返回值：
返回包容器的环境TextAlign特性。如果不支持该特性，该函数返回0。下面是有效返回值的列表：
返回值 | 含义
0 | 通用排列(数字在右，文本在左)
1 | 左对齐
2 | 居中
3 | 右对齐

说明：
调用该函数决定控件包容器选取的环境文本排列方式。该特性对所有的控件都是可用的，并由包容器定义。注意包容器并不一定要支持该特性。


 COleControl::AmbientUIDead

BOOL AmbientUIDead( );

返回值：
如果控件要响应用户界面动作，则返回非零值，否则为0。如果不支持该特性，则返回0。

说明：
调用该函数以判定包容器是否要求控件响应用户界面动作。例如，在设计模式下，包容器必须设置该项为TRUE。

请参阅：COleControl::AmbientUserMode


 COleControl::AmbientUserMode

BOOL AmbientUserMode( );

返回值：
如果包容器处于用户状态，则返回非零值；否则为0（处于设计模式）。如果不支持该模式，则返回0。

说明：
调用该函数以判定包容器是处于设计模式或用户模式。例如，在设计模式下，包容器必须设置该项为FALSE。

请参阅：COleControl::AmbientUIDead


 COleControl::BoundPropertyChanged

void BoundPropertyChanged( DISPID dispid );

参数：
dispid 控件边界特性的分派ID。

说明：
调用该函数以通知边界特性值已被改变。每当该特性值改变时都需调用该函数，即使在整个设置模式中并没有改变该特性值。注意边界特性值和数据成员相对应。每次这样的成员变量改变时，都必须调用BoundPropertyChanged。

请参阅：COleControl::BoundPropertyRequestEdit


 COleControl::BoundPropertyRequestEdit

BOOL BoundPropertyRequestEdit( DISPID dispid );

返回值：
如果允许改变，则返回非零值，否则为0。缺省值是非零值。

参数：
dispid 控件边界特性的分派ID。

说明：
调用该函数从IPropertyNotifySink界面申请改变控件提供的边界特性的许可。如果许可权被拒绝，控件将不允许特性值被改变。可以通过忽视或使企图改变特性值的动作失败已拒绝这样的申请。

请参阅：COleControl::BoundPropertyChanged


 COleControl::ClientToParent

virtual void ClientToParent( LPCRECT lprcBounds, LPPOINT pPoint )const;

参数：
lprcBounds | 包容器内OLE控件的边界的指针，包括边框和滚动条在内的控件的整个区域，而不仅仅是客户区。
pPoint | 要转换成父窗口（包容器）坐标的OLE客户区内的点的指针。

说明：
调用该函数将pPoint的坐标转换成父窗口坐标。输入时， pPoint是相对OLE控件的客户区原点（控件客户区的左上角）。输出时， pPoint是相对父窗口的原点 (包容器的左上角)。

请参阅：
COleControl::ParentToClient, COleControl::GetClientOffset


 COleControl::ClipCaretRect

BOOL ClipCaretRect( LPRECT lpRect );

返回值：如果成功，则返回非零值，否则为0。

参数：
lpRect 输入时，指向一个包含要调整的脱字符区域的RECT结构指针。输出时，调整后的脱字符区域，如果脱字符矩形被完全覆盖，则返回NULL。

说明：
调用该函数调整被重叠的不透明对象完全或部分覆盖的脱字符矩形。一个脱字符是指用要插入文本或图形的闪烁线、块或位图。
一个无窗口对象要安全显示，必须首先检查脱字符是否被重叠对象完全和部分覆盖。一个对象可以应用ClipCaretRect调整（缩减）脱字符以保证适合剪贴区域。
对象创建一个脱字符时，必须将脱字符矩形提交到ClipCaretRect和使用调整后的矩形。如果脱字符被完全覆盖，该方法返回FALSE，脱字符将不会显示。


 COleControl::COleControl

COleControl( );

说明：
构造一个COleControl对象。该函数一般不直接调用。OLE控件一般由它的类创建。


 COleControl::ControlInfoChanged

void ControlInfoChanged( );

说明：
当控件支持的助记符集合改变时，调用该函数。接收该通知时，控件包容器通过调用IOleControl::GetControlInfo获取新的助记符集合。注意包容器并不一定要响应该通知。


 COleControl::DisplayError

virtual void DisplayError( SCODE scode,
LPCTSTR lpszDescription,
LPCTSTR lpszSource,
LPCTSTR lpszHelpFile,
UINT nHelpID
);

参数：
scode | 要报告的状态码值。有关可能的码的完全列表，请参阅联机文档“Visual C++程序员指南”中的“ActiveX控件：高级主题”。
lpszDescription | 要报告的错误描述。
lpszSource | 产生错误的模块名（一般指OLE控件模块名）。
lpszHelpFile | 包含错误描述的帮助文件名。
nHelpID | 要报告的错误的帮助上下文ID。

说明：
当处理一个标准Error事件后，调用该函数（除非事件处理函数不允许显示该错误）。缺省的行为是显示一个消息框，给出包含在lpszDescription中的错误描述。
要选择错误显示的方式，可覆盖该函数。

请参阅：COleControl::FireError


 COleControl::DoClick

void DoClick( );

说明：
调用该函数模拟在控件上的单击动作。此时， COleControl::OnClick成员函数的覆盖函数将被调用，并将触发一个标准Click事件（如果控件支持该事件的话）。
该函数由COleControl基类的标准方法所支持，称为DoClick。
要了解更多的信息，请参阅联机文档“Visual C++程序员指南”中的“ActiveX控件：方法”。

请参阅：COleControl::OnClick


 COleControl::DoPropExchange

virtual void DoPropExchange( CPropExchange* pPX );

参数：
pPX 一个CPropExchange对象指针。框架提供该对象以建立特性内容交换及交换的方向。

说明：
当从永久存储，如字符流或特性集，加载或保存控件时，框架调用该函数。该函数通常还调用PX_函数来加载或保存一个OLE控件的特定的用户定义的特性。
如果使用Control向导来创建一个OLE控件对象。该函数的覆盖版本将调用基类函数COleControl::DoPropExchange串行化COleControl支持的标准特性。当你向控件加入新用户定义的特性时，需要使用该函数来串行化新特性。有关串行化的信息，请参阅联机文档“Visual C++程序员指南”中的“ActiveX控件：串行化”。

请参阅：PX_Bool, PX_Short


 COleControl::DoSuperclassPaint

void DoSuperclassPaint( CDC* pDC, const CRect& rcBounds );

参数：
pDC | 控件包容器的设备上下文指针。
rcBounds | 控件的绘制区域。

说明：
调用该函数以正确地绘制一个非活动的OLE控件。该函数仅在OLE控件从Windows控件派生时使用，并且必须在控件的OnDraw函数中调用。
有关该函数和Windows控件子类的信息，请参阅联机文档“Visual C++程序员指南”中的“ActiveX控件：Windows控件的子类化”。

请参阅：COleControl::OnDraw


 COleControl::DrawContent

void DrawContent( CDC* pDC, CRect& rc );

参数：
pDC | 设备上下文指针。
rc | 绘制的矩形区域。

说明：
当控件的外观需要更新时，由框架调用该函数。该函数在OnDraw函数的覆盖函数中直接调用。

请参阅：
COleControl::OnDraw, COleControl::DrawMetafile, COleControl::OnDrawMetafile


 COleControl::DrawMetafile

void DrawMetafile(CDC* pDC, CRect& rc);

参数：
pDC | 元文件设备上下文指针。
rc | 要绘制的矩形区域。

说明：
当使用元文件设备上下文时，由框架调用该函数。

请参阅：
COleControl::OnDraw, COleControl::DrawContent, COleControl::OnDrawMetafile


 COleControl::EnableSimpleFrame

void EnableSimpleFrame( );

说明：
调用该函数使得一个OLE控件具有简单框架特征。该特征使得一个控件中能够包含其它的控件，但不是真正的控件包含。例如一个组合框中可以由多个控件组成。这些控件不是OLE包含的，但它们在同一个组合框中。


 COleControl::ExchangeExtent

BOOL Exchange Extent(CPropExchange* pPX);

返回值：如果函数成功，则返回非零值，否则为0。

参数：
pPX 一个指向CPropExchange对象的指针。框架提供该对象的建立特性内容交换以及交换的方向。

说明：
调用该函数串行化或初始化控件的范围状态（它说明在HIME TRIC单元中）。该函数通常由COleCowtrol::DoPropExchange的缺省实现调用。

请参阅：COleControl::DoPropExchange


 COleControl::ExchangeStockProps

void ExchangeStockProps( CPropExchange* pPX );

参数：
pPX 一个CPropExchange对象指针。框架提供该对象以建立特性内容交换以及交换的方向。

说明：
调用该函数串行化或初始化控件的标准特性的状态。该函数通常在COleControl::DoPropExchange的缺省实现中直接调用。

请参阅：COleControl::DoPropExchange


 COleControl::ExchangeVersion

BOOL ExchangeVersion( CPropExchange* pPX, DWORD dwVersionDefault, BOOL bConvert = TRUE );

返回值：如果函数成功，则返回非零值，否则为0。

参数：
pPX | 一个CPropExchange对象指针。框架提供该对象以建立特性内容交换以及方向交换。
dwVersionDefault | 控件的当前版本号。
bConvert | 指示在存储时是否要将永久数据转换成最新的格式，或者保留加载时的格式。

说明：
调用该函数串行化或初始化一个控件的版本信息的状态。一般它将是控件的COleControl::DoPropExchange的覆盖函数中第一个要调用的函数。
当加载时，该函数读取永久数据的版本号，并相应地设置CPropExchange对象的版本特性。当保存时，该函数写入永久数据版本号。
有关永久化和版本管理的信息，请参阅联机文档“Visual C++程序员指南”中的“ActiveX控件：串行化”。

请参阅：COleControl::DoPropExchange


 COleControl::FireClick

void FireClick( );

说明：
当在一个活动控件上单击鼠标时，框架调用该函数。如果该事件被定义为可选事件，将由你来决定何时触发该事件。
要自动触发一次Click事件，控件的事件映射表必须定义标准Click事件。

请参阅：
COleControl::FireDblClick, COleControl::FireMouseDown, COleControl::FireMouseUp


 COleControl::FireDblClick

void FireDblClick( );

说明：
当在一个活动控件上双击鼠标时，框架调用该函数。如果该事件被定义为可选事件，将由你来决定何时触发该事件。
要自动触发一次DblClick 事件，控件的事件映射表必须定义标准DblClick事件。

请参阅：
COleControl::FireClick, COleControl::FireMouseDown, COleControl::FireMouseUp


 COleControl::FireError

void FireError( SCODE scode, LPCTSTR lpszDescription, UINT nHelpID = 0 );

参数：
scode | 要报告的状态码值。有关可能的码的完全列表，请参阅联机文档“Visual C++程序员指南”中的“ActiveX控件：高级主题”。
lpszDescription | 要报告的错误描述。
nHelpID | 要报告的错误的帮助ID。

说明：
调用该函数触发一个标准Error事件。该事件提供了当控件发生错误时在你的程序代码的适当位置进行错误提示的方式。跟其它如Click 或MouseMove等标准事件不同的是，Error事件不由控件触发。
要报告在特性设置函数、特性获取函数或自动方法期间发生的错误，请调用COleControl::ThrowError。
实现OLE控件的标准Error事件使用一个SCODE值。由于Visual Basic不支持SCODE值，所以如果想在Visual Basic 4.0使用该事件的话，将会发生错误。
这样的情况，可以手工地在控件的.ODL文件中将SCODE参数改成长整型。另外，任何使用SCODE参数的用户自定义事件、方法或特性，都会导致相同的问题。

请参阅：COleControl::DisplayError


 COleControl::FireEvent

void FireEvent( DISPID dispid, BYTE FAR* pbParams, ... );

参数：
dispid | 要触发的事件的分派ID。
pbParams | 事件参数类型描述。

说明：
可以使用随意多个的参数调用该函数从你的控件中触发一个用户自定义的事件。通常该函数不能直接调用，而是由在控件类声明的事件映射表部分由ClassWizard生成的事件触发函数调用。
pbParams参数是一个以空格键分隔的VTS_列表。这些由空格键分隔（不是逗号）的多个值给出了函数的参数列。可能的值如下：
符号 | 参数类型
VTS_COLOR | OLE_COLOR
VTS_FONT | IFontDisp*
VTS_HANDLE | HWND
VTS_PICTURE | IPictureDisp*
VTS_OPTEXCLUSIVE | OLE_OPTEXCLUSIVE*
VTS_TRISTATE | OLE_TRISTATE
VTS_XPOS_HIMETRIC | OLE_XPOS_HIMETRIC
VTS_YPOS_HIMETRIC | OLE_YPOS_HIMETRIC
VTS_XPOS_PIXELS | OLE_XPOS_PIXELS
VTS_YPOS_PIXELS | OLE_YPOS_PIXELS
VTS_XSIZE_PIXELS | OLE_XSIZE_PIXELS
VTS_YSIZE_PIXELS | OLE_XSIZE_PIXELS
VTS_XSIZE_HIMETRIC | OLE_XSIZE_HIMETRIC
VTS_YSIZE_HIMETRIC | OLE_XSIZE_HIMETRIC
注意：
除了VTS_FONT和VTS_PICTURE，还为所有的可变数据类型定义了常量。这些常量使用VTS_P前缀，例如VTS_PCOLOR是指向VTS_COLOR常量的指针。


 COleControl::FireKeyDown

void FireKeyDown( USHORT* pnChar, short nShiftState );

参数：
pnChar 所按键的虚拟键码值指针。
nShiftState下列标志位的组合：
· | SHIFT_MASK | 在按键期间SHIFT键按下。
· | CTRL_MASK | 在按键期间CTRL键按下。
· | ALT_MASK | 在按键期间ALT键按下。

说明：
当控件是UI活动时按下一个键，框架会调用该函数。如果该事件被定义为可选事件，将由你来决定何时触发该事件。
要自动触发一次KeyDown事件，控件的事件映射表必须定义标准KeyDown事件。

请参阅：
COleControl::FireKeyUp, COleControl::FireKeyPress, COleControl::OnKeyPressEvent


 COleControl::FireKeyPress

void FireKeyPress( USHORT* pnChar );

参数：
pnChar 按键的字符值指针。

说明：
当控件是UI活动时按下一个键，框架会调用该函数。如果该事件被定义为可选事件，将由你来决定何时触发该事件。
接收该事件可能改变pnChar，例如将所有小写字符转换成大写。如果你要检查改变后的字符，覆盖OnKeyPressEvent。
要自动触发一次KeyPress 事件，控件的事件映射表必须定义标准KeyPress事件。

请参阅：
COleControl::OnKeyPressEvent, COleControl::FireKeyDown, COleControl::FireKeyUp


 COleControl::FireKeyUp

void FireKeyUp( USHORT* pnChar, short nShiftState );

参数：
pnChar 所释放键的虚拟键码值指针。
nShiftState下列标志位的组合：
· | SHIFT_MASK | 在释放键期间SHIFT键按下。
· | CTRL_MASK | 在释放键期间CTRL键按下。
· | ALT_MASK | 在释放键期间ALT键按下。

说明：
当用户自定义控件在包容器内是UI活动时释放一个键，框架会调用该函数。如果该事件被定义为可选事件，将由你来决定何时触发该事件。
要自动触发一次KeyUp事件，控件的事件映射表必须定义标准KeyUp事件。

请参阅：
COleControl::FireKeyDown, COleControl::FireKeyPress, COleControl::OnKeyUpEvent


 COleControl::FireMouseDown

void FireMouseDown( short nButton, short nShiftState, OLE_XPOS_PIXELS x, OLE_YPOS_PIXEL y );

参数：
nButton所按鼠标键的数值。它可为下列值：
· | LEFT_BUTTON | 按下左鼠标键。
· | MIDDLE_BUTTON | 按下中鼠标键。
· | RIGHT_BUTTON | 按下右鼠标键。
nShiftState下列标志位的组合：
· | SHIFT_MASK | 在按键期间SHIFT键按下。
· | CTRL_MASK | 在按键期间CTRL键按下。
· | ALT_MASK | 在按键期间ALT键按下。
x | 按下鼠标键时的光标x坐标，该坐标相对于控件窗口的左上角。
y | 按下鼠标键时的光标y坐标，该坐标相对于控件窗口的左上角。

说明：
当在活动的用户自定义控件上按下一个鼠标键，框架会调用该函数。如果该事件被定义为可选事件，将由你来决定何时触发该事件。
要自动触发一次MouseDown事件，控件的事件映射表必须定义标准MouseDown事件。

请参阅：
COleControl::FireMouseUp, COleControl::FireMouseMove, COleControl::FireClick


 COleControl::FireMouseMove

void FireMouseMove( short nButton, short nShiftState, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y );

参数：
nButton所按鼠标键的数值。它可为下列值：
· | LEFT_BUTTON | 按下左鼠标键。
· | MIDDLE_BUTTON | 按下中鼠标键。
· | RIGHT_BUTTON | 按下右鼠标键。
nShiftState下列标志位的组合：
· | SHIFT_MASK | 在按键期间SHIFT键按下。
· | CTRL_MASK | 在按键期间CTRL键按下。
· | ALT_MASK | 在按键期间ALT键按下。
x | 光标的x坐标，该坐标相对于控件窗口的左上角。
y | 光标的y坐标，该坐标相对于控件窗口的左上角。

说明：
当鼠标光标在活动的用户自定义控件上移动时，框架会调用该函数。如果该事件被定义为可选事件，将由你来决定何时触发该事件。
要自动触发一次MouseMove事件，控件的事件映射表必须定义标准MouseMove事件。


 COleControl::FireMouseUp

void FireMouseUp( short nButton, short nShiftState, OLE_XPOS_PIXELS x, OLE_YPOS_PIXELS y );

参数：
nButton所释放鼠标键的数值。它可为下列值：
· | LEFT_BUTTON | 释放左鼠标键。
· | MIDDLE_BUTTON | 释放中鼠标键。
· | RIGHT_BUTTON | 释放右鼠标键。
nShiftState下列标志位的组合：
· | SHIFT_MASK | 在释放键期间SHIFT键按下。
· | CTRL_MASK | 在释放键期间CTRL键按下。
· | ALT_MASK | 在释放键期间ALT键按下。
x | 释放鼠标键时的光标x坐标，该坐标相对于控件窗口的左上角。
y | 释放鼠标键时的光标y坐标，该坐标相对于控件窗口的左上角。

说明：
当在活动的用户自定义控件上释放一个鼠标键，框架会调用该函数。如果该事件被定义为可选事件，将由你来决定何时触发该事件。
要自动触发一次MouseUp事件，控件的事件映射表必须定义标准MouseUp事件。

请参阅：
COleControl::FireMouseDown, COleControl::FireClick, COleControl::FireDblClick


 COleControl::FireReadyStateChange

void FireReadyStateChange( );

说明：
使用控件就绪状态的当前值触发一个事件。就绪状态可为下列值：
· | READYSTATE_UNINITIALIZED | 缺省初始化状态。
· | READYSTATE_LOADING | 控件正在加载它的特性。
· | READYSTATE_LOADED | 控件已经初始化。
· | READYSTATE_INTERACTIVE | 控件有足够数据进行交互，但所有同步数据还未加载完毕。
· | READYSTATE_COMPLETE | 控件具有所有数据。
使用GetReadyState判定控件的当前就绪状态。
InternalSetReadyState改变就绪状态为给定的值，然后调用FireReadyStateChange。

请参阅：
COleControl::GetReadyState, COleControl::InternalSetReadyState


 COleControl::GetActivationPolicy

virtual DWORD GetActivationPolicy( );

返回值：
POINTERINACTIVE枚举的标志组合。可能的标志是：
· | POINTERINACTIVE_ACTIVATEONENTRY | 移动鼠标操作期间，当鼠标移到对象中时，必须将对象激活。
· | POINTERINACTIVE_DEACTIVATEONLEAVE | 移动鼠标操作期间，当鼠标移开对象时，必须将对象变成被活动的。
· | POINTERINACTIVE_ACTIVATEONDRAG | 拖放操作期间，当鼠标拖拉、该对象时，必须将对象激活。

说明：
若要改变支持IPointerInactive界面的控件的缺省激活行为，可覆盖该函数。
当IPointerInactive界面有效时，控件会将WM_SETCURSOR和WM_MOUSEMOVE转发给它。COleControl实现该界面时将会在适当调校鼠标坐标后，通过控件的消息映射表将分派这些消息。
一旦包容器接收到WM_SETCURSOR或WM_MOUSEMOVE，而且鼠标指向一个支持 IPointerInactive的非活动对象时，它会在界面上调用GetActivationPolicy然后返回POINTERINACTIVE枚举的标志。
可以在消息映射表中增加相应的入口点，同其它的窗口消息一样来处理这些消息。在你的消息处理函数中，应该避免在检查m_hWnd值为非NULL时使用m_hWnd成员变量(或使用该成员变量的任何成员函数)。
如果一个对象想在设置鼠标光标和/或触发鼠标移动事件以外，进行更多的鼠标处理操作，例如给出特别的可视反馈，必须返回POINTERINACTIVE_ACTIVATEONENTRY标志，并且只能在活动时进行反馈。
如果对象返回该标志，包容器必须立即激活该对象，然后向它发出相同的消息以触发对GetActivationPolicy的调用。
如果同时返回POINTERINACTIVE_ACTIVATEONENTRY和POINTERIN ACTIVE_DEACTIVATEONLEAVE 标志，那么对象只能在鼠标移到时才能被激活。如果仅返回POINTERINACTIVE_ACTIVATEONENTRY 标志，该对象仅在鼠标第一次进入对象时被激活。
有时可能要将一个非活动控件作为一次OLE拖放操作的目标。这要求在用户拖拉控件时激活控件，以便将控件窗口注册为一个放下的目标。要在拖拉时激活控件，则返回POINTERINACTIVE_ACTIVATEONDRAG标志：
DWORD CMyCtrl::GetActivationPolicy()
{
return POINTERINACTIVE_ACTIVATEONDRAG;
}
GetActivationPolicy通讯的信息必须由包容器进行缓冲。否则，该方法必须在每一次鼠标进入非活动对象时调用。
如果一个非活动对象在鼠标进入时不要求被激活，它的包容器必须在鼠标停留在对象上时调用OnInactiveSetCursor向该对象分派持续的WM_SETCURSOR消息。
使IPointerInactive界面有效通常意味着使控件在任何时候具有处理鼠标消息的能力。如果不支持IPointerInactive界面，那么需要使你的控件自始至终都处于活动状态才能处理鼠标消息，这意味着控件必须具有OLEMISC_ACTIV ATEWHENVISIBLE标志。然而，为避免该标志影响支持IPointerInactive的包容器，你还要指定OLEMISC_IGNOREACTIVATEWHENVISIBLE标志：
static const DWORD BASED_CODE _dwMyOleMisc = OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_IGNOREACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;

请参阅：COleControl::OnInactiveSetCursor, COleControl::OnInactiveMouseMove


 COleControl::GetAmbientProperty

BOOL GetAmbientProperty(DISPID dwDispid, VARTYPE vtProp, void* pvProp );

返回值：
如果支持环境特性，则返回非零值，否则为0。

参数：
dwDispid | 环境特性的分派ID。
vtProp | 说明在pvProp返回值的类型的变量类型标签。
pvProp变量地址指针。该变量用于接收特性值或返回值。该指针的实际类型和vtProp说明的相匹配。
vtProp | pvProp类型
VT_BOOL | BOOL*
VT_BSTR | CString*
VT_I2 | short*
VT_I4 | long*
VT_R4 | float*
VT_R8 | double*
VT_CY | CY*
VT_COLOR | OLE_COLOR*
VT_DISPATCH | LPDISPATCH*
VT_FONT | LPFONTDISP*

说明：
调用该函数以获取包容器的一个环境特性的值。如果使用GetAmbientProperty存取环境的DisplayName和ScaleUnits特性，设置vtProp 为 VT_BSTR ，设置pvProp为CString*。如果获取环境的Font特性，可设置vtProp为VT_FONT，设置pvProp为LPFONTDISP*。
注意，为普通环境特性而提供了函数，例如AmbientBackColor和AmbientFont。

请参阅：
COleControl::AmbientForeColor, COleControl::AmbientScaleUnits, COleControl::AmbientShowGrabHandles


 COleControl::GetAppearance

short GetAppearance ( );

返回值：
如果成功，则返回值为一个短整数 (VT_I2)值，说明控件的当前外观设置。如果控件外观为平面的，该值为零；如果控件外观为3D的，该值为1。

说明：
该函数实现对控件的标准Appearance 特性的Get函数。

请参阅：
COleControl::SetAppearance, COleControl::OnAppearanceChanged


 COleControl::GetBackColor

OLE_COLOR GetBackColor( );

返回值：
如果成功，则返回值指定当前背景色为一个OLE_COLOR值。该值能调用TranslateColor 转换成一个COLORREF值。

说明：
该函数实现对控件的标准BackColor特性的Get函数。

请参阅：
COleControl::AmbientBackColor, COleControl::TranslateColor, COleControl::SetBackColor, COleControl::GetForeColor


 COleControl::GetBorderStyle

short GetBorderStyle( );

返回值：
如果控件具有普通边框，则返回1；如果控件没有边框，则返回0。

说明：
该函数实现对控件的标准Appearance 特性的Get函数。

请参阅：
COleControl::SetBorderStyle, COleControl::OnBorderStyleChanged


 COleControl::GetCapture

CWnd* GetCapture( );

返回值：
如果活动并且无窗口的控件具有当前的鼠标捕获焦点（由控件的包容器判定），那么返回该控件；如果它不具有鼠标捕获焦点，则返回NULL。否则返回具有鼠标捕获焦点的CWnd对象（同CWnd::GetCapture）。

说明：
调用该函数判定一个COleControl对象是否具有鼠标捕获焦点。当调用SetCapture 时，一个活动的无窗口控件获得鼠标捕获焦点。

请参阅：
COleControl::SetCapture, COleControl::ReleaseCapture


 COleControl::GetClassID

virtual HRESULT GetClassID( LPCLSID pclsid ) = 0;

返回值：
如果调用不成功，则返回非零值，否则为0。

参数：
pclsid 类ID的位置指针。

说明：
框架调用以获取控件的OLE类ID。通常由IMPLEMENT_OLECREATE_EX宏实现。


 COleControl::GetClientOffset

virtual void GetClientOffset( long* pdxOffset, long* pdyOffset ) const;

参数：
pdxOffset | OLE控件客户区的重直偏移量指针。
PdyOffset | OLE控件客户区的水平偏移量指针。

说明：
OLE控件在它的包容器内具有一个矩形的区域。控件的客户区是指包括边框和滚动条在内的控件区域。由GetClientOffset存取的偏移量表示了控件的矩形区域的左上角和它的客户区左上角的差距。如果控件具有非客户元素，而不具有标准边框和滚动条，可覆盖该成员函数以说明偏移量。

请参阅：
COleControl::ParentToClient, COleControl::ClientToParent


 COleControl::GetClientRect

virtual void GetClientRect( LPRECT lpRect ) const;

参数：
lpRect 一个包含无窗口控件的客户区维的RECT结构。也就是控件的尺寸减去窗口边框、框架、滚动条等等后所剩部分。lpRect参数指示控件客户区矩形的尺寸，而非它的位置。

说明：调用该函数获取控件的客户区的尺寸。


 COleControl::GetClientSite

LPOLECLIENTSITE GetClientSite( );

返回值：
控件在它的包容器内的当前客户区尺寸指针。

说明：
调用该函数检查控件在它的包容器内的当前客户区尺寸。
返回的指针指向IOleClientSite的一个实例。由包容器实现的IOleClientSite界面是对象内容的视图：从什么地方获取存储、用户界面和其它资源等等。


 COleControl::GetControlFlags

virtual DWORD GetControlFlags( );

返回值：
ControlFlags枚举标志位的ORed组合：
enum ControlFlags
{
fastBeginPaint = 0x0001,
clipPaintDC = 0x0002,
pointerInactive = 0x0004,
noFlickerActivate = 0x0008,
windowlessActivate = 0x0010,
canOptimizeDraw = 0x0020,
};

说明：
覆盖该函数指定控件的标志位设置。缺省地，GetControlFlags返回fastBeginPaint | clipPaintDC。
fastBeginPaint | 如果设置、使用一个OLE控件的开始绘制函数代替BeginPaint API(缺省设置)。
clipPaintDC | 如果不设置该标志位，将使COleControl对IntersectClipRect的调用无效，从而可以稍微加快控件运行的速度。如果你正使用无窗口激活，则该标志位无效。
pointerInactive | 如果该位设置，则提供在控件非活动时的鼠标交互。当COleControl的IPointerInactive界面无效（缺省）时，控件变成非活动的。
noFlickerActivate | 如果该位设置，则除去特别的绘制操作和伴随的可见的闪烁。当在控件非活动和活动时同等地绘制时，使用该标志位。如果你正在使用无窗口激活，则该标志位无效。
windowlessActivate | 如果设置，指示控件使用无窗口激活。
canOptimizeDraw | 如果设置，指示控件将执行优化绘制（如果控件支持的话）。
有关GetControlFlags的信息和OLE控件的其它优化信息，请参阅：“ActiveX控件：优化”。

请参阅：
CDC::IntersectClipRect, COleControl::SetControlSize


 COleControl::GetControlSize

void GetControlSize( int* pcx, int* pcy );

参数：
pcx | 指定控件的宽度（以像素为单位）。
pcy | 指定控件的高度（以像素为单位）。

说明：
调用该函数获取OLE控件窗口的尺寸。
注意控件窗口的坐标是相对于控件的左上角的坐标。

请参阅：
COleControl::GetRectInContainer, COleControl::SetControlSize


 COleControl::GetDC

CDC* GetDC( LPCRECT lprcRect = NULL, DWORD dwFlags = OLEDC_PAINTBKGND );

返回值：
如果成功，则返回包容器CWnd客户区的显示设备上下文指针；否则返回值为NULL。显示设备上下文能在GDI函数中用于绘制包容器窗口的客户区。

参数：
lprcRect 要重画的无窗口控件在其客户区坐标体系下的矩形指针。如果为NULL，表示整个对象区域都要重画。
dwFlags设备上下文的绘制特性，有以下选择：
· | OLEDC_NODRAW | 表示对象不使用设备上下文执行绘制操作，而是仅仅存取显示设备的信息。包容器仅简单地将窗口的DC传给它，而不进行别的处理。
· | OLEDC_PAINTBKGND | 要求在返回DC前包容器重画背景。对象在要求DC绘制一个透明背景的区域时，要使用该标志。
· | OLEDC_OFFSCREEN | 通知包容器，对象将显示一个拷贝到屏幕的离屏位图。当对象将要显示一个产生许多闪烁的绘制操作时，需要使用该标志。包容器可以不响应这类请求。但是，如果该标志不设置，包容器必须返回一个屏幕DC。这使得对象能执行直接的屏幕操作（通过一次XOR操作)。

说明：
调用该函数，为一个无窗口对象提供从它的包容器中获取一个屏幕（或兼容）设备上下文的途径。在完成绘制后必须调用ReleaseDC成员函数。当调用GetDC时，对象传送要绘制的矩形区域（相对于自己的客户区坐标）。GetDC将它们转换成包容器客户区的坐标。对象不能要求绘制比自己的客户区还大的矩形区域。对象的客户区尺寸可由GetClientRect获取。这可以避免对象进行胡乱绘制。

请参阅：COleControl::ReleaseDC


 COleControl::GetEnabled

BOOL GetEnabled( );

返回值：如果控件可用，则返回非零值，否则为0。

说明：
该函数实现对控件的标准Enabled特性的Get函数。

请参阅：
COleControl::SetEnabled, COleControl::OnEnabledChanged


 COleControl::GetExtendedControl

LPDISPATCH GetExtendedControl( );

返回值：
包容器的扩展控件对象指针；如果没有对象可用，则返回NULL。
该对象可以通过它的IDispatch界面进行操纵。同时还可以使用QueryInterface来获得该对象提供的其它可用界面。然而，不能要求对象支持一定集合的界面。注意，依赖一个包容器的扩展控件对象的特定特征会限制控件向其它任意包容器的可移植性。

说明：
调用该函数获取一个有包容器维护的具有扩展特性集的控件对象。调用该函数的函数应在完成对该对象的操作后将对象指针释放。注意包容器并不一定要支持该对象。


 COleControl::GetFocus

CWnd* GetFocus( );

返回值：
如果活动并且无窗口的控件具有当前的键盘焦点（由控件的包容器判定），那么返回该控件；如果它不具有键盘焦点，则返回NULL。
否则返回具有键盘焦点的CWnd对象（同CWnd::GetFocus）。

说明：
调用该函数判定一个COleControl对象是否具有键盘焦点。当调用SetFocus时，一个活动的无窗口控件获得键盘焦点。

请参阅：COleControl::SetFocus


 COleControl::GetFont

LPFONTDISP GetFont( );

返回值：
控件的标准Font特性的字体分派界面指针。

说明：
该函数实现对控件的标准Font特性的Get函数。
注意：
调用者必须在完成工作后释放该对象。在控件的实现中，使用InternalGetFont存取控件的标准Font对象。有关在控件中使用字体的信息，请参阅联机文档“Visual C++程序员指南”中的“ActiveX控件：在ActiveX控件中使用字体”。

请参阅：
COleControl::SetFont, COleControl::AmbientFont, COleControl::InternalGetFont


 COleControl::GetFontTextMetrics

void GetFontTextMetrics( LPTEXTMETRIC lptm, CFontHolder& fontHolder );

参数：
lptm | 一个TEXTMETRIC结构指针。
fontHolder | 一个CFontHolder对象参考。

说明：
调用该函数度量控件所有的CFontHolder 对象的文本计量 ，它可以从SelectStockFont函数中进行选择。如果成功执行，GetFontTextMetrics函数将使用有效的计量信息初始化lptm指向的TEXTMETRIC结构。
如果不成功，将用零填充该结构。当绘制控件时，使用该函数代替::GetTextMetrics，因为像嵌入OLE对象控件可能要求表示成元文件。缺省字体的TEXTMETRIC结构在调用SelectFontObject函数时被刷新。必须在选择标准字体，确保它提供的信息有效后，才能调用GetFontTextMetrics。


 COleControl::GetForeColor

OLE_COLOR GetForeColor( );

返回值：
如果成功，则返回值用一个OLE_COLOR值指定当前的前景颜色。可调用TranslateColor 函数将该值转换成一个COLORREF值。

说明：
该函数实现对控件的标准ForeColor特性的Get函数。

请参阅：
COleControl::AmbientForeColor, COleControl::TranslateColor, COleControl::GetBackColor, COleControl::SetForeColor


 COleControl::GetHwnd

OLE_HANDLE GetHwnd( );

返回值：
若有，则返回OLE控件的窗口句柄；否则返回NULL。

说明：
该函数实现对控件的标准hWnd特性的Get函数。


 COleControl::GetMessageString

virtual void GetMessageString( UINT nID, CString& rMessage ) const;

参数：
nID | 菜单项ID。
rMessage | 一个CString对象参考，通过该对象将返回一个字符串。

说明：
框架调用以获取描述nID 标识的菜单项的目的的段字符串。它可用于在菜单项高亮度显示时，在状态栏中显示一条消息。缺省执行时是加载nID标识的字符串资源。


 COleControl::GetNotSupported

void GetNotSupported( );

说明：
当控件用户不能存取控件特性时，调用该函数代替Get函数。例如，在某特性为只读时。

请参阅：COleControl::SetNotSupported


 COleControl::GetReadyState

long GetReadyState( );

返回值：
控件的就绪状态，可为下列值：
· | READYSTATE_UNINITIALIZED | 缺省初始化状态。
· | READYSTATE_LOADING | 控件正在加载它的特性。
· | READYSTATE_LOADED | 控件已被初始化。
· | READYSTATE_INTERACTIVE | 控件已有足够数据进行交互，但所有同步数据尚未加载完毕。
· | READYSTATE_COMPLETE | 控件已具有它的所有数据。

说明：
调用该函数返回控件的就绪状态。
大多数简单控件无须区分LOADED和INTERACTIVE。然而，支持数据路径特性的控件在接受到足够的数据之前不能进行交互。一个控件应该尽可能快地成为可交互的。

请参阅：
COleControl::FireReadyStateChange, COleControl::InternalSetReadyState


 COleControl::GetRectInContainer

BOOL GetRectInContainer( LPRECT lpRect );

返回值：
如果控件是活动的，则返回非零值，否则为0。

参数：
lpRect 一个矩形结构指针，该结构用于拷贝控件的坐标。

说明：
调用该函数获取控件相对包容器的矩形坐标。该矩形仅在控件活动时有效。

请参阅：
COleControl::SetRectInContainer, COleControl::GetControlSize


 COleControl::GetStockTextMetrics

void GetStockTextMetrics( LPTEXTMETRIC lptm );

参数：
lptm 一个TEXTMETRIC结构指针。

说明：
调用该函数度量控件标准Font特性的文本计量 ，它可以在SelectStockFont函数中进行选择。如果成功执行，GetStockTextMetrics函数将使用有效的计量信息初始化lptm指向的TEXTMETRIC结构，如果不成功，将用零填充该结构。当绘制控件时，使用该函数代替::GetTextMetrics，因为嵌入OLE对象控件可能要求表示成元文件。
缺省字体的TEXTMETRIC结构在调用SelectStockFont函数时被刷新。必须在选择标准字体，确保它提供的信息有效后，才能调用该函数。


 COleControl::GetText

BSTR GetText( );

返回值：
控件文本字符串的当前值；如果没有，则返回零长度字符串。
注意：
有关BSTR数据类型的信息，请参阅“宏和全局量中的数据类型”一节。

说明：
该函数实现对控件的标准Text 或Caption特性的Get函数。注意该函数的调用者必须调用SysFreeString释放返回的字符串资源。在控件的实现中，使用InternalGetText存取控件的标准Text或Caption特性。

请参阅：
COleControl::InternalGetText, COleControl::SetText


 COleControl::GetWindowlessDropTarget

virtual IDropTarget* GetWindowlessDropTarget( );

返回值：
对象IDropTarget界面指针。因为无窗口控件没有窗口，它不能注册IDropTarget 界面。然而，参加拖放操作时，无窗口控件仍旧能实现该界面，并在GetWindowlessDropTarget中返回。

说明：
如果想将无窗口控件作为拖放操作的目标，覆盖GetWindowlessDropTarget。一般地，这需要将控件窗口注册为拖放操作目标。但既然控件没有自己的窗口，将会使用包容器的窗口作为目标。
控件仅简单地提供IDropTarget界面的实现，包容器会在适当时间进行相应的调用。例如：
IDropTarget* CMyCtrl::GetWindowlessDropTarget()
{
m_xDropTarget.AddRef();
return &m_xDropTarget;
}


 COleControl::InitializeIIDs

void InitializeIIDs( const IID* piidPrimary, const IID* piidEvents );

参数：
piidPrimary | 控件主分派界面的界面ID指针。
piidEvents | 控件事件界面的界面ID指针。

说明：
在控件的构造函数中调用该函数，通知基类你的控件将使用的ID。


 COleControl::InternalGetFont

CFontHolder& InternalGetFont( );

返回值：
包含标准Font对象的CFontHolder对象的参考。

说明：调用该函数存取控件的标准Font特性。

请参阅：
COleControl::GetFont, COleControl::SetFont


 COleControl::InternalGetText

const CString& InternalGetText( );

返回值：控件文本字符串的参考。

说明：
调用该函数存取控件的标准Text或Caption特性。

请参阅：
COleControl::GetText, COleControl::SetText


 COleControl::InternalSetReadyState

void InternalSetReadyState( long lNewReadyState );

参数：
lNewReadyState给控件设置的就绪状态，可为下列值：
· | READYSTATE_UNINITIALIZED | 缺省初始化状态。
· | READYSTATE_LOADING | 控件正在加载它的特性。
· | READYSTATE_LOADED | 控件已被初始化。
· | READYSTATE_INTERACTIVE | 控件已有足够数据进行交互，但所有同步数据尚未加载完毕。
· | READYSTATE_COMPLETE | 控件已具有它的所有数据。

说明：
调用该函数设置控件的就绪状态。
大多数简单控件无须区分LOADED 和INTERACTIVE。然而，支持数据路径特性的控件在接受到足够的数据之前不能进行交互。一个控件应该尽可能快地成为可交互的。

请参阅：
COleControl::FireReadyStateChange, COleControl::GetReadyState


 COleControl::InvalidateControl

void InvalidateControl( LPCRECT lpRect = NULL );

参数：
lpRect 控件非有效的区域指针。

说明：
调用该函数使控件进行重画。如果lpRect为NULL，整个控件区域将重画。当控件没有窗口时，将忽略输入的矩形，并调用客户端的IAdviseSink::OnViewChange成员函数。使用该函数代替CWnd::InvalidateRect或::InvalidateRect。

请参阅：COleControl::Refresh


 COleControl::InvalidateRgn

void InvalidateRgn( CRgn* pRgn, BOOL bErase = TRUE );

参数：
pRgn | 一个CRgn对象指针。该对象标识OLE控件在包容器窗口坐标下的非有效区域。如果该参数为NULL，则表示整个控件区域。
bErase | 说明是否要擦除非活动区域的背景色。如果为TRUE，背景色将被擦除。如果为FALSE，背景色保持不变。

说明：
调用该函数时包容器窗口在给定的区域内变成非有效的。该函数可用于重画包容器内的无窗口控件。非有效区域和所有其它更新区域一起，是在下一个WM_PAINT消息发送时要绘制的区域。
如果bErase为TRUE，更新区域的任何部分，整个区域的背景部分将被擦除。


 COleControl::IsConvertingVBX

BOOL IsConvertingVBX( );

返回值：
如果控件被转换，则返回非零值，否则为0。

说明：
当将使用VBX控件的表格转换成使用OLE控件的表格，要求使用OLE控件的特殊加载代码。例如，如果加载OLE控件的一个实例，必须在DoPropExchange调用PX_Font：
PX_Font(pPx, "Font", m_MyFont, pDefaultFont);
然而，VBX控件不具有Font对象；每个Font特性是分别存储的。这种情况下，必须使用IsConvertingVBX来区分这两种情形：
if(IsConvertingVBX()==FALSE)
PX_Font(pPX, "Font", m_MyFont, pDefaultFont);
else
{
PX_String(pPX, "FontName", tempString, DefaultName);
m_MyFont->put_Name(tempString);
PX_Bool(pPX, "FontUnderline", tempBool, DefaultValue);
m_MyFont->put_Underline(tempBool);
...
}
另一种情形是：如果VBX控件存储特性二进制数据（在它的VBM_SAVEP ROPERTY消息处理函数中），而OLE控件使用不同的格式存储它的二进制数据。如果想要OLE控件和VBX控件兼容，不允许使用IsConvertingVBX函数区分加载的是VBX控件还是OLE控件，以便读取新旧两种格式的数据。
在控件的DoPropExchange函数中，可以检查该条件。如果条件成立，执行特殊的加载代码（如前面示例）。如果控件没有被转换，则执行常规加载代码。

请参阅：COleControl::DoPropExchange


 COleControl::IsModified

BOOL IsModified( );

返回值：
若控件在上次保存后已经被修改，则返回非零值，否则为0。

说明：
调用该函数判定控件的状态是否已经改变。当改变项的特性时，控件的状态也改变了。

请参阅：COleControl::SetModifiedFlag


 COleControl::IsOptimizedDraw

BOOL IsOptimizedDraw( );

返回值：
如果包容器支持当前绘制操作的优化绘制，则返回TRUE；否则返回FALSE。

说明：
调用该函数判定包容器支持当前绘制操作的优化绘制。如果支持，控件就无须在完成绘制后为设备上下文选择老的对象（铅笔，刷子，字体等等）。


 COleControl::IsSubclassedControl

virtual BOOL IsSubclassedControl( );

返回值：
如果控件是子类，则返回非零值，否则为0。

说明：
调用该函数判定一个控件是否是Windows控件的子类。如果你的OLE控件是Windows控件的子类，则必须覆盖该函数，并返回TRUE。


 COleControl::Load

void Load( LPCTSTR strNewPath, CDataPathProperty& prop );

参数：
strNewPath | 包含控件同步特性的绝对路径的字符串指针。
prop | 实现同步控件特性的CDataPathProperty对象。

说明：
调用该函数重设原先同步加载的数据，并初始化加载控件的同步特性。

请参阅：CDataPathProperty


 COleControl::LockInPlaceActive

BOOL LockInPlaceActive( BOOL bLock );

返回值：
如果成功封锁，则返回非零值，否则为0。

参数：
bLock 如果控件的活动状态被封锁，该值为TRUE；如果解锁，该值为FALSE。

说明：
调用该函数阻止包容器将控件变成非有效的。注意对控件的任何封锁都必须和控件的解锁相匹配。你只能将你的控件封锁一小段的时间，例如在触发一个事件期间。


 COleControl::OnAmbientPropertyChange

virtual void OnAmbientPropertyChange( DISPID dispID );

参数：
dispID 要改变的环境特性的分派ID，如果多个特性被改变，该参数为DISPID_ UNKNOWN。

说明：
当包容器的一项环境特性改变值以后，由框架调用。

请参阅：COleControl::GetAmbientProperty


 COleControl::OnAppearanceChanged

virtual void OnAppearanceChanged ( );

说明：
当标准Appearance特性值改变后，由框架调用。
如果需在该特性改变后进行相应处理，可覆盖该函数。该函数的缺省实现调用InvalidateControl。

请参阅：
COleControl::GetAppearance, COleControl::SetAppearance, COleControl::InvalidateControl


 COleControl::OnBackColorChanged

virtual void OnBackColorChanged( );

说明：
当标准BackColor特性值改变后，由框架调用。
如果需在该特性改变后进行相应处理，可覆盖该函数。该函数的缺省实现调用InvalidateControl。

请参阅：
COleControl::GetBackColor, COleControl::InvalidateControl


 COleControl::OnBorderStyleChanged

virtual void OnBorderStyleChanged( );

说明：
当标准BorderStyle特性值改变后，由框架调用。该函数的缺省实现调用InvalidateControl。
如果需在该特性改变后进行相应处理，可覆盖该函数。

请参阅：
COleControl::SetBorderStyle, COleControl::InvalidateControl


 COleControl::OnClick

virtual void OnClick( USHORT iButton );

参数：
iButton一个鼠标键的索引。可以是下列值：
· | LEFT_BUTTON | 按下鼠标左键。
· | MIDDLE_BUTTON | 按下鼠标中键。
· | RIGHT_BUTTON | 按下鼠标右键。

说明：
当按下一个鼠标键后，或在激活DoClick的标准方法时，由框架调用该函数。该函数缺省执行时调用COleControl::FireClick。
要修改或扩充缺省处理，可覆盖该函数。

请参阅：
COleControl::DoClick, COleControl::FireClick


 COleControl::OnClose

virtual void OnClose( DWORD dwSaveOption );

参数：
dwSaveOption指示是否在装入前保存对象的标志。有效的值为：
·OLECLOSE_SAVEIFDIRTY
·OLECLOSE_NOSAVE
·OLECLOSE_PROMPTSAVE

说明：
当包容器调用控件的IOleControl::Close函数后，由框架调用该函数。
若控件对象被修改且dwSaveOption是OLECLOSE_SAVEIFDIRTY或OLECLOSE_PROMPTSAVE，OnClose缺省地保存该控件对象。


 COleControl::OnDoVerb

virtual BOOL OnDoVerb( LONG iVerb, LPMSG lpMsg, HWND hWndParent, LPCRECT lpRect );

返回值：
如果调用成功，则返回非零值，否则为0。

参数：
iVerb | 要激活的控件动词的索引。
lpMsg | 激活该动词的Windows消息的指针。
hWndParent | 控件的父窗口句柄。如果动词的执行创建一个窗口（或一些窗口），hWndParent必须作为父窗口。
lpRect | 一个RECT结构指针。控件相对于包容器的坐标将拷贝到该结构中。

说明：
当包容器调用IOleObject::DoVerb成员函数时，框架调用该函数。缺省实现时使用ON_OLEVERB 和ON_STDOLEVERB消息映射入口点来确定调用相应的函数。
如果要改变动词的缺省实现，可覆盖该函数。

请参阅：
ON_OLEVERB, ON_STDOLEVERB, COleControl::OnEnumVerbs


 COleControl::OnDraw

virtual void OnDraw( CDC* pDC, const CRect& rcBounds, const CRect& rcInvalid );

参数：
pDC | 进行绘制的设备上下文。
rcBounds | 控件的矩形区域，包括边界。
rcInvalid | 控件的非有效矩形区域。

说明：
框架调用以使用指定的设备上下文在指定的边界矩形内绘制OLE控件。
使用屏幕设备上下文作为pDC，调用OnDraw用于屏幕显示。rcBounds参数给定了目标设备上下文中矩形（相对它当前的隐射模式）。rcInvalid参数是实际的无效区域，在一些情况下，它是比rcBounds小的区域。

请参阅：
COleControl::OnDrawMetafile, COleControl::DrawContent, COleControl::DrawMetafile


 COleControl::OnDrawMetafile

virtual void OnDrawMetafile( CDC* pDC, const CRect& rcBounds );

参数：
pDC | 进行绘制的设备上下文。
rcBounds | 控件的矩形区域，包括边界。

说明：
框架调用以使用指定的设备上下文在指定的边界矩形内绘制OLE控件。缺省实现时，它调用OnDraw 函数。

请参阅：
COleControl::OnDraw, COleControl::DrawContent, COleControl::DrawMetafile


 COleControl::OnEdit

virtual BOOL OnEdit( LPMSG lpMsg, HWND hWndParent, LPCRECT lpRect );

返回值：
如果调用成功，则返回非零值，否则为0。

参数：
lpMsg | 激活该动词的Windows消息的指针。
hWndParent | 控件的父窗口句柄。
lpRect | 包容器内控件使用的矩形的指针。

说明：
调用该函数使控件处于UI活动状态。该函数同激活控件的OLEIVERB_UIACTIVATE 动词具有相同效果。
该函数经常用作一个ON_OLEVERB消息入口点的处理函数。这使控件的“Object”菜单中的“Edit”项可用。例如：
ON_OLEVERB(AFX_IDS_VERB_EDIT, OnEdit)


 COleControl::OnEnabledChanged

virtual void OnEnabledChanged( );

说明：
当标准Enabled特性值改变后，由框架调用。
如果需在该特性改变后进行相应处理，可覆盖该函数。该函数的缺省实现调用InvalidateControl。

请参阅：
COleControl::SetEnabled, COleControl::GetEnabled


 COleControl::OnEnumVerbs

virtual BOOL OnEnumVerbs( LPENUMOLEVERB FAR* ppenumOleVerb );

返回值：
如果动词可用，则返回非零值，否则为0。

参数：
ppenumOleVerb 指向列举控件动词的IEnumOLEVERB对象的指针。

说明：
当包容器调用IOleObject::EnumVerbs成员函数时，由框架调用该函数。缺省实现时，该函数列举消息映射表中的ON_OLEVERB入口点。
如果要改变列举动词的缺省方式，可覆盖该函数。

请参阅：ON_OLEVERB, ON_STDOLEVERB


 COleControl::OnEventAdvise

virtual void OnEventAdvise( BOOL bAdvise );

参数：
bAdvise TRUE表示一个事件处理函数和该控件建立连接，FALSE表示一个事件处理函数和该控件断开连接。

说明：
当一个事件处理函数和控件建立或断开连接时，由框架调用该函数。


 COleControl::OnFontChanged

virtual void OnFontChanged( );

说明：
当标准Font特性值改变后，由框架调用。该函数的缺省实现调用InvalidateControl。如果控件是Windows 控件的子类，缺省实现时还向控件窗口发送一个WM_SETFONT消息。
如果需在该特性改变后进行相应处理，可覆盖该函数。

请参阅：
COleControl::GetFont, COleControl::InternalGetFont, COleControl::InvalidateControl


 COleControl::OnForeColorChanged

virtual void OnForeColorChanged( );

说明：
当标准ForeColor特性值改变后，由框架调用。该函数的缺省实现调用InvalidateControl。
如果需在该特性改变后进行相应处理，可覆盖该函数。

请参阅：
COleControl::SetForeColor, COleControl::InvalidateControl


 COleControl::OnFreezeEvents

virtual void OnFreezeEvents( BOOL bFreeze );

参数：
bFreeze 如果控件事件处理器被冻结，则返回TRUE，否则为0。

说明：
当包容器调用IOleControl::FreezeEvents后，由框架调用该函数。缺省实现时不做任何事情。
如果需在事件处理器被冻结或解冻时进行额外的处理，可覆盖该函数。


 COleControl::OnGetColorSet

virtual BOOL OnGetColorSet( DVTARGETDEVICE FAR* ptd, HDC hicTargetDev, LPLOGPALETTE FAR* ppColorSet );

返回值：
如果返回一个有效的颜色设置，则返回非零值，否则为0。

参数：
ptd | 显示图片的目标设备指针。如果该值为NULL，图片将显示在一个缺省目标设备中，通常是显示器。
hicTargetDev | 指定由ptd指定的目标设备的信息上下文。该参数可以为一个设备上下文，但不是必需的。如果ptd为NULL，hicTargetDev必须为NULL。
ppColorSet | 指向要复制所使用的颜色设置的位置指针。如果该函数不返回颜色设置，则返回NULL。

说明：
当包容器调用IOleObject::GetColorSet成员函数时，框架调用该函数。包容器调用该函数以获取绘制OLE控件所必须的所有颜色。包容器可以使用在调色板中设置的颜色设置。缺省执行时返回FALSE。
如果需要进行一些特别的处理，可覆盖该函数。


 COleControl::OnGetControlInfo

virtual void OnGetControlInfo( LPCONTROLINFO pControlInfo );

参数：
pControlInfo 要填写的CONTROLINFO结构指针。

说明：
当包容器请求获得有关控件的信息时，由框架调用。该信息包含控件的助记符的主要描述。缺省执行时，将使用缺省信息填写pControlInfo。如果你的控件需要处理助记符，可覆盖该函数。


 COleControl::OnGetDisplayString

virtual BOOL OnGetDisplayString( DISPID dispid, CString& strValue );

返回值：
如果strValue中返回一个字符串，则返回非零值，否则为0。

参数：
dispid | 控件的某一个特性的分派ID。
strValue | 将要返回一个字符串的CString对象的参考。

说明：
框架调用以获取一代表dispid指定的特性的当前值的字符串。
如果控件中有一个特性的值不能直接转换成字符串，而要该特性值显示在包容器提供的特性浏览器中时，可覆盖该函数。

请参阅：COleControl::OnMapPropertyToPage


 COleControl::OnGetInPlaceMenu

virtual HMENU OnGetInPlaceMenu( );

返回值：
返回控件菜单的句柄，如果没有菜单，则返回NULL。缺省实现时返回NULL。

说明：
当控件被UI 激活以获取菜单和包容器已有菜单合并时，框架调用该函数。
有关合并OLE资源的信息，请参阅联机文档“Visual C++程序员指南”中的“菜单和资源(OLE)”。


 COleControl::OnGetNaturalExtent

virtual BOOL OnGetNaturalExtent( DWORD dwAspect,
LONG lindex,
DVTARGETDEVICE* ptd,
HDC hicTargetDev,
DVEXTENTINFO* pExtentInfo,
LPSIZEL psizel
);

返回值：
如果成功返回或调整尺寸，则返回非零值；否则为0。

参数：
dwAspect | 说明如何表示对象。对象的表示包括内容、一个图表、一个略图或一份打印文档。该参数的有效值取自DVASPECT或DVASPECT2。
lindex | 对象中有兴趣的部分。目前只有-1是有效的。
ptd | 一个DVTARGETDEVICE结构的指针，该结构定义了需返回对象尺寸的目标设备。
hicTargetDev | 指定由ptd指定的目标设备的信息上下文。该参数可以为一个设备上下文，但不是必需的。如果ptd为NULL，hicTargetDev必须为NULL。
pExtentInfo指向DVEXTENTINFO结构的指针，该结构说明了尺寸数据。DVEXTENTINFO结构定义如下：
typedef struct tagExtentInfo
{
UINT cb;
DWORD dwExtentMode;
SIZEL sizelProposed;
} DVEXTENTINFO;
结构成员dwExtentMode可为下列值：
· | DVEXTENT_CONTENT | 计算能恰好放下内容的控件大小。
· | DVEXTENT_INTEGRAL | 当改变尺寸时，向控件传递计划的尺寸。
psizel | 指向控件返回的尺寸数据。对没有调整的维，则返回的尺寸数据为。

说明：
框架调用以响应一个包容器的IViewObjectEx::GetNaturalExtent请求。
覆盖该函数以在DVEXTENTINFO结构中返回接近于计划尺寸的对象的显示尺寸和范围模式。缺省执行时，该函数返回FALSE，并且不调整尺寸。

请参阅：COleControl::OnGetViewExtent


 COleControl::OnGetPredefinedStrings

virtual BOOL OnGetPredefinedStrings( DISPID dispid, CStringArray* pStringArray, CDWordArray* pCookieArray );

返回值：
如果元素被添加到pStringArray和pCookieArray中，则返回非零值。

参数：
dispid | 控件的某一个特性的分派 ID。
pStringArray | 填写返回值的字符串数组。
pCookieArray | 填写返回值的DWORD数组。

说明：
框架调用以获取一个预定义字符串集合表示一个特性的所有可能值。
如果控件的某一个特性的可能值能用字符串来表示，可覆盖该函数。向pStringArray每添加一个元素, 同时也需向pCookieArray添加一个相应“小块”元素。这些“小块”值将在以后由框架传递给COleControl::OnGetPredefinedValue函数。

请参阅：
COleControl::OnGetPredefinedValue, COleControl::OnGetDisplayString


 COleControl::OnGetPredefinedValue

virtual BOOL OnGetPredefinedValue( DISPID dispid, DWORD dwCookie, VARIANT FAR* lpvarOut );

返回值：
如果在lpvarOut中返回了一个值，则返回非零值；否则为0。

参数：
dispid | 控件的某一个特性的分派ID。
dwCookie | 由先前的COleControl::OnGetPredefinedStrings覆盖函数返回的“小块”值。
lpvarOut | 指向一个VARIANT结构的指针，通过该结构将返回一个特性值。

说明：
框架调用获取和原先在COleControl::OnGetPredefinedStrings的覆盖函数中返回的预定义字符串相对应的特性值。

请参阅：
COleControl::OnGetPredefinedStrings, COleControl::OnGetDisplayString


 COleControl::OnGetViewExtent

virtual BOOL OnGetViewExtent( DWORD dwDrawAspect, LONG lindex, DVTARGETDEVICE* ptd, LPSIZEL lpsizel );

返回值：
如果成功返回范围信息，函数返回非零值；否则为0。

参数：
dwDrawAspect | 描述一个对象的显示外观或形式的DWORD 值。其有效值取自DVASPECT或DVASPECT2。
lindex | 对象中有兴趣的部分。目前只有-1是有效的。
ptd | 一个DVTARGETDEVICE结构的指针，该结构定义了需返回对象尺寸的目标设备。
lpsizel | 指向返回对象尺寸的位置指针。

说明：
框架调用以响应包容器的IViewObjectEx::GetExtent请求。 如果控件使用两遍绘制并且它的不透明和透明部分具有不同的维，可覆盖该函数。

请参阅：COleControl::OnGetViewRect


 COleControl::OnGetViewRect

virtual BOOL OnGetViewRect( DWORD dwAspect, LPRECT pRect );

返回值：
如果成功返回对象的矩形尺寸，则返回非零值；否则为0。

参数：
dwAspect描述一个对象的显示外观或形式的DWORD值。其有效值取自DVASPECT或DVASPECT2。
· | DVASPECT_CONTENT | 整个对象的边界矩形。包括由GetViewExtent返回的对象原点的左上角和整个对象范围的尺寸。
· | DVASPECT_OPAQUE | 矩形的不透明矩形区域。
· | DVASPECT_TRANSPARENT | 矩形的透明或不规则部分。
pRect 一个RECTL结构指针。该结构指定了绘制对象的矩形。该参数控制对象的位置。

说明：
框架调用以响应包容器的IViewObjectEx::GetRect请求。对象的尺寸由OnGetViewRect 转换成从一个指定的位置开始的矩形（缺省值是显示器的左上角）。如果你的框架使用两遍绘制，并且它的不透明和透明部分具有不同的维，可覆盖该函数。

请参阅：COleControl::OnGetViewExtent


 COleControl::OnGetViewStatus

virtual DWORD OnGetViewStatus( );

返回值：
如果成功，则返回VIEWSTATUS枚举的一个值，否则为0。它可能是下列任意值的组合：
· | VIEWSTATUS_OPAQUE | 对象完全不透明。如果该位不设置，对象包含透明部分。该位仅适用于内容相关的外观，而不适用于DVASPECT_ICON或DVASPECT_DOCPRINT。
· | VIEWSTATUS_SOLIDBKGND | 对象具有固定背景（具有固定颜色，不是可画模式）。该位仅在VIEWSTATUS_OPAQUE设置时由意义，且仅适用于内容相关的外观，而不适用于DVASPECT_ICON或DVASPECT_DOCPRINT。
· | VIEWSTATUS_DVASPECTOPAQUE | 对象支持DVASPECT_OPAQUE。所有以绘制外观作为参数的IViewObjectEx方法将使用该值。
· | VIEWSTATUS_DVASPECTTRANSPARENT | 对象支持DVASPECT_TRANSPARENT。所有以绘制外观作为参数的IViewObjectEx方法将使用该值。

说明：
框架调用以响应包容器的IViewObjectEx::GetViewStatus请求。如果你的框架使用两遍绘制，可覆盖该函数。缺省实现时，它返回VIEWSTATUS_OPAQUE。

请参阅：DVASPECT


 COleControl::OnHideToolBars

virtual void OnHideToolBars( );

说明：
当控件处于UI非活动状态时，框架调用该函数。实现时需隐藏所有由OnShowToolbars显示的工具条。

请参阅：COleControl::OnShowToolBars


 COleControl::OnInactiveMouseMove

virtual void OnInactiveMouseMove( LPCRECT lprcBounds, long x, long y, DWORD dwKeyState );

参数：
lprcBounds | 在的包容器客户区坐标内对象的边界矩形。当接受到WM_MOUSEMOVE消息时，告诉对象它的确切位置和屏幕尺寸。
x | 在的包容器客户区坐标内的鼠标位置的x轴坐标。
y | 在的包容器客户区坐标内的鼠标位置的y轴坐标。
dwKeyState | 标识键盘修正码的当前状态。有效值可为下列标志的任意组合： MK_CONTROL, MK_SHIFT, MK_ALT, MK_BUTTON,MK_LBUTTON, MK_MBUTTON和 MK_RBUTTON。

说明：
包容器在接受到WM_MOUSEMOVE消息时调用该函数，以使鼠标指向的对象变为非活动的。注意窗口的客户区坐标（像素）用于传递鼠标的位置。同时也可以在相同的坐标体系下传递对象的边界矩形。

请参阅：
COleControl::GetActivationPolicy, COleControl::OnInactiveSetCursor


 COleControl::OnInactiveSetCursor

virtual BOOL OnInactiveSetCursor( LPCRECT lprcBounds, long x, long y, DWORD dwMouseMsg, BOOL bSetAlways );

返回值：如果成功，则返回非零值，否则为0。

参数：
lprcBounds | 包容器客户区坐标内对象的边界矩形。当接受到WM_MOUSEMOVE消息时，告诉对象它的确切位置和屏幕尺寸。
x | 包容器客户区坐标内的鼠标位置的x轴坐标。
y | 包容器客户区坐标内的鼠标位置的y轴坐标。
dwMouseMsg | 发生WM_SETCURSOR的鼠标消息的标识。
bSetAlways | 指定对象是否必须设定光标。如果为TRUE，对象必须设定光标；如果为FALSE，则不一定要设定光标，但必须返回S_FALSE。

说明：
包容器在接受到WM_SETCURSOR消息时调用该函数，以使鼠标指向的对象变为非活动的。注意窗口的客户区坐标（以像素为单位）用于传递鼠标的位置。同时也可以在相同的坐标体系下传递对象的边界矩形。

请参阅：
COleControl::GetActivationPolicy, COleControl::OnInactiveMouseMove


 COleControl::OnKeyDownEvent

virtual void OnKeyDownEvent( USHORT nChar, USHORT nShiftState );

参数：
nChar 所按下的键的虚拟键码值。
nShiftState包含下列标志的组合：
· | SHIFT_MASK | 在操作期间SHIFT键按下。
· | CTRL_MASK | 在操作期间CTRL键按下。
· | ALT_MASK | 在操作期间ALT键按下。

说明：
当一个标准KeyDown事件处理时，由框架调用该函数。
如果控件需要在触发键盘事件后存区键的信息，可覆盖该函数。

请参阅：
COleControl::OnKeyUpEvent, COleControl::OnKeyPressEvent


 COleControl::OnKeyPressEvent

virtual void OnKeyPressEvent( USHORT nChar );

参数：
nChar 所按下的键的虚拟键码值。

说明：
当处理一个标准KeyDown事件处理时，由框架调用该函数。注意nChar值可能已被包容器修改。
如果控件需要在事件发生后进行相应处理，可覆盖该函数。

请参阅：COleControl::FireKeyPress


 COleControl::OnKeyUpEvent

virtual void OnKeyUpEvent( USHORT nChar, USHORT nShiftState );

参数：
nChar 所按下的键的虚拟键码值。
nShiftState包含下列标志的组合：
· | SHIFT_MASK | 在操作期间SHIFT键按下。
· | CTRL_MASK | 在操作期间CTRL键按下。
· | ALT_MASK | 在操作期间ALT键按下。

说明：
当处理一个标准KeyDown事件时，由框架调用该函数。
如果控件需要在触发键盘事件后存储键的信息，可覆盖该函数。

请参阅：
COleControl::OnKeyDownEvent, COleControl::OnKeyPressEvent


 COleControl::OnMapPropertyToPage

virtual BOOL OnMapPropertyToPage( DISPID dispid, LPCLSID lpclsid, BOOL* pbPageOptional );

返回值：
如果在lpclsid中返回了一个类ID，则返回非零值；否则为0。

参数：
dispid | 控件的某一个特性的分派ID。
lpclsid | 一个CLSID结构指针，该结构用于返回类ID。
pbPageOptional | 返回一个指示值，指示使用指定特性页是否可选。

说明：
框架调用以获取用于编辑指定特性的特性页的类ID。如果需要从包容器的特性浏览器中激活自己的控件的特性页，可覆盖该函数。

请参阅：COleControl::OnGetDisplayString


 COleControl::OnMnemonic

virtual void OnMnemonic( LPMSG pMsg );

参数：
pMsg 一个助记符键按下时产生的Windows消息指针。

说明：
当包容器检测到OLE控件的一个助记符键按下时，由框架调用该函数。


 COleControl::OnProperties

virtual BOOL OnProperties( LPMSG lpMsg, HWND hWndParent, LPCRECT lpRect );

返回值：
若调用成功，则返回非零值；否则为0。

参数：
lpMsg | 激活该动词的Windows消息指针。
hWndParent | 控件的父窗口句柄。
lpRect | 在包容器中控件使用的边界矩形指针。

说明：
当包容器激活控件的特性动词时，由框架调用该函数。缺省实现时，它显示一个模态特性对话框。


 COleControl::OnQueryHitPoint

virtual BOOL OnQueryHitPoint( DWORD dwAspect, LPCRECT pRectBounds, POINT ptlLoc, LONG lCloseHint, DWORD* pHitResult );

返回值：
如果成功返回一次命中结果，则返回非零值，否则为0。一次命中指OLE控件的显示区的一次覆盖。

参数：
dwAspect | 描述一个对象的显示外观或形式的DWORD值。其有效值取自DVASPECT或DVASPECT2。
pRectBounds | 一个RECT结构指针，该结构指定OLE控件客户区的边界矩形。
ptlLoc | 一个POINT结构指针，该结构指定一次命中的检查点。该点使用OLE控件客户区坐标说明。
lCloseHint | 定义“接近”命中检查点的距离。
pHitResult命中检查的结果指针。可以为下列值：
· | HITRESULT_OUTSIDE | ptlLoc处于OLE对象的外部并且不接近。
· | HITRESULT_TRANSPARENT | ptlLoc在OLE对象边界内，但不接近图象。例如，一个处于透明圆的中心的点可能属于这种HITRESULT_TRANSPARENT。
· | HITRESULT_CLOSE | ptlLoc处于OLE对象的内部或外部，但它和对象足够接近，因此可以认为在对象内。小的、瘦的或细节的对象可以使用该值。即使一个点处于对象的边界矩形的外面，它也可能和对象很接近（这在命中小对象时是必需的）。
· | HITRESULT_HIT | ptlLoc处于对象的图象内。

说明：
框架调用以响应包容器的IViewObjectEx::QueryHitPoint请求。它用于检查对象的显示区域是否覆盖已指定点（命中该点）。QueryHitPoint可以覆盖以对非矩形对象进行命中检查。

请参阅：COleControl::OnQueryHitRect


 COleControl::OnQueryHitRect

virtual BOOL OnQueryHitRect( DWORD dwAspect,
LPCRECT pRectBounds,
LPCRECT prcLoc,
LONG lCloseHint,
DWORD* pHitResult
);

返回值：
如果成功返回一次命中结果，则返回非零值；否则为0。

参数：
dwAspect | 描述一个对象的显示外观或形式的DWORD值。其有效值取自DVASPECT或DVASPECT2。
pRectBounds | 一个RECT结构指针，该结构指定OLE控件客户区的边界矩形。
prcLoc | 一个RECT结构指针，该结构指定一次命中的检查矩形。该矩形相对对象的左上角而定。
lCloseHint | 没有使用。
pHitResult命中检查的结果指针。可以为下列值：
· | HITRESULT_OUTSIDE | 矩形内没有点被OLE对象命中。
· | HITRESULT_HIT | 矩形内至少有一点被OLE对象命中。

说明：
框架调用以响应包容器的IViewObjectEx::QueryHitRect请求。它用于检查对象的显示区域是否覆盖已指定矩形中的点（命中矩形）。QueryHitPoint可以覆盖以对非矩形对象进行命中检查。

请参阅：COleControl::OnQueryHitPoint


 COleControl::OnRenderData

virtual BOOL OnRenderData( LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium );

返回值：
如果成功，则返回非零值；否则为0。

参数：
lpFormatEtc | FORMATETC结构指针。该结构说明要求信息的格式。
lpStgMedium | 一个STGMEDIUM结构指针。该结构用于返回数据。

说明：
框架调用以使用指定格式存取数据。指定的格式必须是上次调用DelayRenderData或DelayRenderFileData成员函数放在控件对象中的。缺省实现时，如果支持的存储介质可以是文件或内存，该函数相应地调用OnRenderFileData或OnRenderGlobalData。如果要求的格式是CF_METAFILEPICT或永久性设置格式，该函数显示合适的数据并返回非零值，否则为0，并不做任何事情。
如果lpStgMedium->tymed是TYMED_NULL, STGMEDIUM必须按lpFormatEtc->tymed指定的进行分配和填充。如果不是TYMED_NULL,则STGMEDIUM和数据一起填充。
覆盖该函数以使用指定格式提供数据。根据数据的不同，你必须覆盖该函数的不同版本。如果数据小且尺寸固定，覆盖OnRenderGlobalData。如果数据是一个文件，或者数据是变长的，覆盖OnRenderFileData。
要了解更多的信息，请参阅OLE文档中的FORMATETC和STGMEDIUM结构。

请参阅：
COleControl::OnRenderFileData, COleControl::OnRenderGlobalData


 COleControl::OnRenderFileData

virtual BOOL OnRenderFileData( LPFORMATETC lpFormatEtc, CFile* pFile );

返回值：
如果成功，则返回非零值；否则为0。

参数：
lpFormatEtc | FORMATETC结构指针。该结构说明要求信息的格式。
pFile | 一个CFile对象指针，该对象用于返回数据。

说明：
框架调用以使用指定格式从文件中存取数据。指定的格式必须是上次调用DelayRenderData成员函数放在控件对象中的。缺省实现时，该函数仅简单地返回FALSE。
覆盖该函数以使用指定格式和介质提供数据。根据数据的不同，你必须覆盖该函数的不同版本。如果想处理多种存储介质的数据，覆盖OnRenderData。如果数据是一个文件，或者数据是变长的，覆盖OnRenderFileData。
要了解更多的信息，请参阅OLE文档中的FORMATETC结构。

请参阅：
COleControl::OnRenderData, COleControl::OnRenderGlobalData


 COleControl::OnRenderGlobalData

virtual BOOL OnRenderGlobalData( LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal );

返回值：
如果成功，则返回非零值；否则为0。

参数：
lpFormatEtc | FORMATETC结构指针。该结构说明要求信息的格式。
phGlobal | 一全局内存的句柄指针。该全局内存用户返回数据。如果没有可分配内存，该参数为NULL。

说明：
框架调用以使用指定格式从全局内存中存取数据。指定的格式必须是上次调用DelayRenderData成员函数放在控件对象中的。缺省实现时，该函数仅简单地返回FALSE。
如果phGlobal为NULL, 那么必须分配一个新的HGLOBAL并用phGlobal返回。否则 phGlobal指定的HGLOBAL必须用数据填充。放到HGLOBAL中的数据量必须不超过内存块的大小。另外，块不可以重新分配更大的尺寸。
覆盖该函数以使用指定格式和介质提供数据。根据数据的不同，你必须覆盖该函数的不同版本。如果想处理多种存储介质的数据，覆盖OnRenderData。如果数据是一个文件，或者数据是变长的，覆盖OnRenderFileData。
要了解更多的信息，请参阅OLE文档中的FORMATETC结构。

请参阅：
COleControl::OnRenderFileData, COleControl::OnRenderData


 COleControl::OnResetState

virtual void OnResetState( );

说明：
当控件的特性必须设置成缺省值时，由框架调用该函数。缺省实现时，它调用DoPropExchange, 传递一个CPropExchange对象，使特性值设置成缺省值。
在该函数中，控件书写器能够插入OLE控件的初始化代码。如果IPersistStream::Load或IPersistStorage::Load失败，或在不调用IPersistStream::Load或IPersistStorage::Load情况下调用IPersistStreamInit::InitNew或IPersistStorage:: InitNew，调用该函数。

请参阅：COleControl::OnSetClientSite


 COleControl::OnSetClientSite

virtual void OnSetClientSite( );

说明：
当包容器调用IOleControl::SetClientSite函数时，框架调用该函数。缺省地，OnSetClientSite检查数据路径是否已经加载，如果已经加载，调用DoDataPathPropExchange。
如果想对该通知进行特别的处理，可覆盖该函数。注意，覆盖该函数必须调用基类。


 COleControl::OnSetData

virtual BOOL OnSetData( LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium, BOOL bRelease );

返回值：
如果成功，则返回非零值；否则为0。

参数：
lpFormatEtc | 指定数据格式的FORMATETC结构指针。
lpStgMedium | 驻留数据的STGMEDIUM结构指针。
bRelease | 如果需要释放存储介质，该值为TRUE；如果控件不释放存储介质，该值为FALSE。

说明：
框架调用以使用指定数据替换控件的数据。如果数据是永久特性设置格式，缺省实现时，该函数会相应地修改控件的状态。否则，缺省的实现不做任何事情。如果bRelease为TRUE，该函数还将调用ReleaseStgMedium。
覆盖该函数以使用指定数据替换控件的数据。
要了解更多的信息，请参阅OLE文档的FORMATETC和STGMEDIUM结构。

请参阅：COleControl::DoPropExchange


 COleControl::OnSetExtent

virtual BOOL OnSetExtent( LPSIZEL lpSizeL );

返回值：
如果尺寸的变化被接受，则返回非零值；否则为0。

参数：
lpSizeL 一个SIZEL结构指针，该结构使用一个长整数来标识控件的宽度和高度。

说明：
当调用IOleObject::SetExtent后，控件的范围需要改变时，框架调用该函数。缺省的实现是改变控件范围的尺寸。如果控件是就地激活的，该函数将调用包容器的OnPosRectChanged。
若要改变控件的缺省尺寸，可覆盖该函数。


 COleControl::OnSetObjectRects

virtual BOOL OnSetObjectRects( LPCRECT lpRectPos, LPCRECT lpRectClip );

返回值：
如果位置改变被接受，则返回非零值；否则为0。

参数：
lpRectPos | 一个RECT结构指针，该结构指示控件的新位置和相对包容器的尺寸。
lpRectClip | 一个RECT结构指针，该结构指示控件被修剪的区域。

说明：
框架调用以实现对IOleInPlaceObject::SetObjectRects的一次调用。缺省的实现是自动的处理控件窗口的位置改变和尺寸的改变，并返回TRUE。
覆盖该函数以修改函数的缺省行为。


 COleControl::OnShowToolBars

virtual void OnShowToolBars( );

说明：
当控件被UI激活时，框架调用该函数。缺省实现时不做任何事情。

请参阅：COleControl::OnHideToolBars


 COleControl::OnTextChanged

virtual void OnTextChanged( );

说明：
当标准Caption或Text特性值改变时，框架调用该函数。缺省实现时它调用InvalidateControl。
如果要在该特性改变后进行相应处理，可覆盖该函数。

请参阅：
COleControl::SetText, COleControl::InternalGetText, COleControl::InvalidateControl


 COleControl::OnWindowlessMessage

virtual BOOL OnWindowlessMessage( UINT msg, WPARAM wParam, LPARAM lParam, LRESULT* plResult );

返回值：如果成功，则返回非零值；否则为0。

参数：
msg | Windows传送的消息标识。
wParam | 由Windows传送。说明附加的消息说明信息。该参数的内容取决于msg参数的值。
lParam | 由Windows传送。说明附加的消息说明信息。该参数的内容取决于msg参数的值。
plResult | Windows结果码。说明消息处理的结果，并取决于传送的消息。

说明：
框架调用以响应包容器的IOleInPlaceObjectWindowless::OnWindowMessage请求，处理无窗口控件的窗口消息，使用的窗口消息是COleControl的OnWindowlessMessage，而不是鼠标消息和键盘消息。COleControl特别为无窗口OLE对象提供了SetCapture和SetFocus 两个函数来进行鼠标捕获和键盘输入焦点的设置。
由于无窗口对象没有窗口，需要提供一种机制由包容器来向它们分派消息。一个OLE对象通过IOleInPlaceObjectWindowless界面的OnWindowMessage方法从它的包容器获得消息。
OnWindowMessage没有HWND参数。

请参阅：
COleControl::SetCapture, COleControl::SetFocus, COleControl::GetWindowlessDropTarget


 COleControl::ParentToClient

virtual UINT ParentToClient( LPCRECT lprcBounds, LPPOINT pPoint, BOOL bHitTest = FALSE ) const;

返回值：
如果bHitTest是FALSE, 则返回HTNOWHERE。如果bHitTest为TRUE,则返回父窗口（包容器）的点落到OLE控件的客户区中的位置，它可为以下鼠标命中检查值：
· | HTBORDER | 在一个固定边框的窗口的边框上。
· | HTBOTTOM | 在窗口的下边框。
· | HTBOTTOMLEFT | 在窗口的左下角。
· | HTBOTTOMRIGHT | 在窗口边框的右下角。
· | HTCAPTION | 在标题栏区域内。
· | HTCLIENT | 在客户区内。
· | HTERROR | 在屏幕背景内或在窗口键的分割线上（同HTNOWHERE相同，但DefWndProc函数将发出“嘟嘟声”，以示错误。
· | HTGROWBOX | 在一个尺寸框内。
· | HTHSCROLL | 在垂直滚动条内。
· | HTLEFT | 在窗口的左边框。
· | HTMAXBUTTON | 在窗口的最大化按钮中。
· | HTMENU | 在菜单区域。
· | HTMINBUTTON | 在窗口的最小化按钮中。
· | HTNOWHERE | 在屏幕背景内或在窗口键的分割线上。
· | HTREDUCE | 在窗口最小化按钮中。
· | HTRIGHT | 在窗口的右边框。
· | HTSIZE | 在一个尺寸框内（同HTGROWBOX相同）。
· | HTSYSMENU | 在控件系统菜单或其子窗口的关闭按钮中。
· | HTTOP | 在窗口的上边框。
· | HTTOPLEFT | 在窗口的左上角。
· | HTTOPRIGHT | 在窗口的右上角。
· | HTTRANSPARENT | 在一当前被另一窗口覆盖的窗口内。
· | HTVSCROLL | 在水平滚动条内。
· | HTZOOM | 在窗口的最大化按钮中。

参数：
lprcBounds | 在包容器内的OLE控件的边界指针，包括边框和滚动条在内的整个控件的区域，而不仅仅是客户区。
pPoint | 指向父窗口（包容器）点的指针。该点将被转换成控件的客户区坐标。
bHitTest | 指定是否要在该点进行命中测试。

说明：
调用该函数，将pPoint的坐标转换成客户区坐标。输入时，pPoint是相对父窗口原点 (包容器的左上角)的。输出时，pPoint是相对OLE控件的客户区原点（控件客户区的左上角）。

请参阅：
COleControl::ClientToParent, COleControl::GetClientOffset


 COleControl::PostModalDialog

void PostModalDialog( );

说明：
当显示模态对话框后，调用该函数，以便包容器重新激活因为调用PreModalDialog而变得非有效的最上层的窗口。该函数和PreModalDialog配对使用。

请参阅：COleControl::PreModalDialog


 COleControl::PreModalDialog

void PreModalDialog( );

说明：
当显示模态对话框时，调用该函数，以便包容器使最上层的窗口变成非有效的。该函数和PostModalDialog配对使用。

请参阅：COleControl::PostModalDialog


 COleControl::RecreateControlWindow

void RecreateControlWindow( );

说明：
调用该函数以销毁和重新创建控件窗口。如果需要改变窗口的风格时，重新创建控件窗口是必需的。


 COleControl::Refresh

void Refresh( );

说明：
调用该函数以强制重画OLE控件。
该函数被COleControl基类作为标准方法来支持，称为Refresh。这使得OLE控件的用户能在指定的之间重画控件。有关该方法的信息，请参阅联机文档“Visual C++程序员指南”中的“ ActiveX控件：方法”。

请参阅：COleControl::InvalidateControl


 COleControl::ReleaseCapture

BOOL ReleaseCapture( );

返回值：如果成功，则返回非零值；否则为0。

说明：
调用该函数释放鼠标捕获焦点。如果该控件具有当前鼠标捕获焦点，那么释放该焦点；否则，该函数没有任何效果。

请参阅：
COleControl::SetCapture, COleControl::GetCapture


 COleControl::ReleaseDC

int ReleaseDC( CDC* pDC );

返回值：如果成功，则返回非零值；否则为0。

参数：
pDC 要释放的控件设备上下文标识。

说明：
调用该函数释放一个无窗口控件的包容器的显示设备上下文，以便给其它应用使用。该函数必须和GetDC配对使用。

请参阅：COleControl::GetDC


 COleControl::ResetStockProps

void ResetStockProps( );

说明：
调用该函数将COleControl标准特性的状态初始化成缺省值。这些特性包括：Appearance, BackColor, BorderStyle, Caption, Enabled, Font,ForeColor, hWnd和Text。有关标准特性的描述，请参阅“ActiveX控件：添加标准特性”。
可以使用ResetStockProps 和ResetVersion覆盖COleControl::OnResetState来提高控件初始化性能。有关优化初始化工作的信息，请参阅联机文档《Virtual C++程序员指南》中的“ActiveX控件：优化”。

示例：
void CMyCtrl::OnResetState()
{
ResetVersion(MAKELONG(_wVerMinor, _wVerMajor));
ResetStockProps();

// initialize custom properties here
}

请参阅：
COleControl::ResetVersion, COleControl::SerializeStockProps


 COleControl::ResetVersion

void ResetVersion( DWORD dwVersionDefault );

参数：
dwVersionDefault 分配给控件的版本号。

说明：
调用该函数以初始化版本号为指定值。
可以使用ResetVersion和ResetStockProps覆盖COleControl::OnResetState来提高控件初始化性能。请参阅ResetStockProps的示例。有关优化初始化工作的信息，请参阅“ActiveX控件：优化”。

请参阅：
COleControl::ResetStockProps, COleControl::SerializeVersion


 COleControl::ScrollWindow

void ScrollWindow( int xAmount, int yAmount, LPCRECT lpRect = NULL, LPCRECT lpClipRect = NULL );

参数：
xAmount | 说明水平滚动的设备单位数。如果向左滚动，该参数必须为负值。
yAmount | 说明垂直滚动的设备单位数。如果向上滚动，该参数必须为负值。
lpRect | 一个CRect对象或 RECT结构的指针。该对象或结构用于指定OLE对象客户区相对包容它的窗口坐标的要滚动的部分。如果lpRect是NULL, 将滚动这个OLE对象的客户区。
lpClipRect | 一个CRect对象或 RECT结构的指针。该对象或结构用于修剪滚动区域矩形。只有在该矩形内的像素要进行滚动，落在该矩形外的点，即使它包含在lpRect矩形内，也不进行滚动。如果lpRect是NULL,将不对滚动区域进行修剪。

说明：
调用该函数使得一个无窗口OLE控件能够在它的活动图象内滚动客户区。


 COleControl::SelectFontObject

CFont* SelectFontObject( CDC* pDC, CFontHolder& fontHolder );

返回值：
上次选中的字体指针。当调用者使用fontHolder完成所有绘制操作后，它必须重新选择原先选中的字体作为CDC::SelectObject的一个参数。

参数：
pDC | 一个设备上下文对象指针
fontHolder | 代表选中字体的CFontHolder对象参考。

说明：调用该函数为设备上下文选择字体。


 COleControl::SelectStockFont

CFont* SelectStockFont( CDC* pDC );

返回值：
上次选中的CFont对象指针。当完成操作后，你必须调用CDC::SelectObject为设备上下文重新选中该字体。

参数：
pDC 一个设备上下文对象指针。

说明：
调用该函数为设备上下文选择标准Font特性。

请参阅：
COleControl::GetFont, COleControl::SetFont


 COleControl::SerializeExtent

void SerializeExtent( CArchive& ar );

参数：
ar 一个CArchive对象。

说明：
调用该函数串行化或初始化分配给控件的显示空间。
可以使用SerializeExtent和SerializeVersion覆盖COleControl::Serialize来提高控件永久化性能。有关优化的信息，请参阅《Visual C++程序员指南》中的“ActiveX控件：优化”。

示例：
void CMyCtrl::Serialize(CArchive& ar)
{
DWORD dwVersion =
SerializeVersion(ar, MAKELONG(_wVerMinor, _wVerMajor));
SerializeExtent(ar);
SerializeStockProps(ar);

if (ar.IsLoading())
{
// load custom properties here
}
else
{
// save custom properties here
}
}

请参阅：
COleControl::SerializeStockProps, COleControl::SerializeVersion


 COleControl::SerializeStockProps

void SerializeStockProps( CArchive& ar );

参数：
ar 一个CArchive对象。

说明：
调用该函数串行化或初始化COleControl标准特性状态。这些特性包括：Appearance, BackColor, BorderStyle, Caption, Enabled, Font, ForeColor和Text。有关标准特性功能的描述，请参阅《Visual C++程序员指南中的》“ActiveX控件：添加标准的特性”。
可以使用SerializeStockProps，SerializeExtent和SerializeVersion覆盖COleControl::Serialize来提高控件永久化性能。请参阅COleControl::SerializeExtent的示例。有关优化的信息，请参阅《Visual C++程序员指南中的》“ActiveX控件：优化”。

请参阅：
COleControl::SerializeExtent, COleControl::SerializeVersion, COleControl::ResetStockProps


 COleControl::SerializeVersion

DWORD SerializeVersion( CArchive& ar, DWORD dwVersionDefault, BOOL bConvert = TRUE );

返回值：
控件的版本号。如果正在装载指定的档案，SerializeVersion返回从档案转载的版本号。否则返回当前版本号。

参数：
ar | 一个CArchive对象。
dwVersionDefault | 控件的当前版本号。
bConvert | 指示在保存永久数据时是否要将它转换成最新的格式，或保持它被装载时的旧格式。

说明：
调用该函数以串行化或初始化控件的版本信息状态。
可以使用SerializeStockProps，SerializeExtent和SerializeVersion覆盖COleControl::Serialize来提高控件永久化性能。请参阅《Visual C++程序员指南》中的COleControl::SerializeExtent的示例。有关优化的信息，请参阅“ActiveX控件：优化”。

请参阅：
COleControl::SerializeExtent, COleControl::SerializeStockProps, COleControl::ResetVersion


 COleControl::SetAppearance

void SetAppearance ( short sAppearance );

参数：
sAppearance 一个短整数值(VT_I2)。它用于说明控件的外观。0设置控件的外观为平面的，1设置控件的外观为3D的。

说明：
调用该函数设置控件的标准Appearance特性值。有关标准特性的信息，请参阅联机文档“Visual C++程序员指南”中的“ActiveX控件：特性”。

请参阅：
COleControl::GetAppearance, COleControl::OnAppearanceChanged


 COleControl::SetBackColor

void SetBackColor( OLE_COLOR dwBackColor );

参数：
dwBackColor 用于绘制控件的背景色的 OLE_COLOR值。

说明：
调用该函数设置控件的标准BackColor 特性值。有关使用该特性和其它相关特性的信息，请参阅Visual C++教程中的“环游示例教程”中的“添加定制的通知特性” 和联机文档“Visual C++程序员指南”中的“ActiveX控件：特性”。

请参阅：
COleControl::SetForeColor, COleControl::GetBackColor, COleControl::OnBackColorChanged


 COleControl::SetBorderStyle

void SetBorderStyle( short sBorderStyle );

参数：
sBorderStyle 控件的新的边框风格；0表示没有边框，1表示普通边框。

说明：
调用该函数设置控件的标准BorderStyle 特性值。控件的窗口将重新创建，并调用OnBorderStyleChanged。

请参阅：
COleControl::GetBorderStyle, COleControl::OnBorderStyleChanged


 COleControl::SetCapture

CWnd* SetCapture( );

返回值：
上次具有鼠标输入焦点的CWnd窗口对象指针。

说明：
如果控件是活动的和无窗口的，该函数将使控件的包容器窗口代表控件获得鼠标捕获焦点。
否则，该函数使控件自己获取鼠标捕获焦点(同CWnd::SetCapture)。

请参阅：
COleControl::GetCapture, COleControl::ReleaseCapture


 COleControl::SetControlSize

BOOL SetControlSize( int cx, int cy );

返回值：
如果调用成功，则返回非零值；否则为0。

参数：
cx | 指定控件的新宽度（以像素为单位）。
cy | 指定控件的新高度（以像素为单位）。

说明：
调用该函数设置OLE控件的尺寸，并通知包容器说明控件的尺寸正被改变。该函数不能在控件构造函数中使用。
注意，控件窗口的所有坐标都是相对控件的左上角的。

请参阅：
COleControl::GetControlSize, COleControl::GetRectInContainer


 COleControl::SetEnabled

void SetEnabled( BOOL bEnabled );

参数：
bEnabled 如果使控件有效，设置为TRUE；否则设置为FALSE。

说明：
调用该函数设置控件的Enabled特性值。设置该特性后，OnEnabledChange将被调用。

请参阅：
COleControl::GetEnabled, COleControl::OnEnabledChanged


 COleControl::SetFocus

CWnd* SetFocus( );

返回值：
原先具有输入焦点的CWnd窗口对象的指针。如果没有这样的窗口，则返回NULL。

说明：
如果控件是活动的和无窗口的，该函数使得控件的包容器窗口获得输入焦点。包容器窗口接受键盘输入，然后将并发的键盘消息分派给调用SetFocus的OLE对象。原先具有输入焦点的窗口将不再具有输入焦点。如果控件不是无窗口的，该函数使得控件自己获得输入焦点（同CWnd::SetFocus)。

请参阅：COleControl::GetFocus


 COleControl::SetFont

void SetFont( LPFONTDISP pFontDisp );

参数：
pFontDisp 一个Font分派界面指针。

说明：调用该函数设置控件的标准Font特性。

请参阅：
COleControl::GetFont, COleControl::InternalGetText, COleControl::OnFontChanged


 COleControl::SetForeColor

void SetForeColor( OLE_COLOR dwForeColor );

参数：
dwForeColor 用于绘制控件前景色的OLE_COLOR值。

说明：
调用该函数设置控件的标准ForeColor 特性值。有关使用该特性和其它相关特性的信息，请参阅Visual C++教程中的“环游示例教程”中的“添加定制的通知特性” 和联机文档《Visual C++程序员指南》中的“ActiveX控件：特性”。

请参阅：
COleControl::SetBackColor, COleControl::GetForeColor, COleControl::OnForeColorChanged


 COleControl::SetInitialDataFormats

virtual void SetInitialDataFormats( );

说明：
框架调用以初始化控件支持的数据格式列表。缺省的实现是指定两种格式：CF_METAFILEPICT和永久特性设置。


 COleControl::SetInitialSize

void SetInitialSize( int cx, int cy );

参数：
cx | OLE控件的初始宽度（以像素为单位）。
cy | OLE控件的初始高度（以像素为单位）。

说明：
在构造函数中调用该函数设置控件的初始尺寸。初始尺寸用设备单位或像素度量。建议在控件的构造函数中使用该函数。


 COleControl::SetModifiedFlag

void SetModifiedFlag( BOOL bModified = TRUE );

参数：
bModified 控件修改标志的新值。TRUE表示控件状态已被改变；FALSE表示控件的状态刚被保存。

说明：
一旦对控件的修改影响到控件的永久状态，调用该函数。例如，当一个永久特性值改变后，设置bModified为TRUE调用该函数。

请参阅：COleControl::IsModified


 COleControl::SetNotPermitted

void SetNotPermitted( );

说明：
当BoundPropertyRequestEdit失败时，调用该函数。该函数发出一个类型为COleDispScodeException的异常，以表示设置操作是不允许的。

请参阅：COleControl::BoundPropertyRequestEdit


 COleControl::SetNotSupported

void SetNotSupported( );

说明：
当控件用户不允许修改控件的任意特性时，例如一个特性是只读时，调用该函数代替Set函数。

请参阅：COleControl::GetNotSupported


 COleControl::SetRectInContainer

BOOL SetRectInContainer( LPRECT lpRect );

返回值：
如果调用成功，则返回非零值；否则为0。

参数：
lpRect 指向包含控件相对包容器的新坐标的矩形。

说明：
调用该函数设置控件矩形坐标为相对包容器的坐标。如果控件是打开的，它的尺寸将被改变。否则包容器的OnPosRectChanged函数将被调用。

请参阅：
COleControl::GetRectInContainer, COleControl::GetControlSize


 COleControl::SetText

void SetText( LPCTSTR pszText );

参数：
pszText 一个字符串指针。

说明：
调用该函数设置控件的标准Caption 或Text特性。
注意，标准Caption和Text特性映射成相同值。这意味着对其中一个特性的修改将自动地修改两个特性。一般地，控件支持标准Caption和Text特性中的一个，但不同时支持。

请参阅：
COleControl::GetText, COleControl::InternalGetText, COleControl::OnTextChanged


 COleControl::ThrowError

void ThrowError( SCODE sc, UINT nDescriptionID, UINT nHelpID = -1 );
void ThrowError( SCODE sc, LPCTSTR pszDescription = NULL, UINT nHelpID = 0 );

参数：
sc | 要报告的状态码值。有关可能码的完全列表，请参阅联机文档“VisualC++程序员指南”中的“ActiveX控件：高级主题”。
nDescriptionID | 要报告的异常字符串资源ID。
nHelpID | 要报告的主题的帮助ID。
pszDescription | 要报告的异常的解释字符串。

说明：
调用该函数通知在控件中发生了一个错误。该函数仅在OLE特性的Get或Set函数中，或在实现OLE自动方法时进行调用。如果你要通知其它事件发生的错误，需要触发标准Error事件。

请参阅：
COleControl::FireError, COleControl::DisplayError


 COleControl::TransformCoords

void TransformCoords( POINTL FAR* lpptlHimetric, POINTF FAR* lpptfContainer, DWORD flags );

参数：
lpptlHimetric | 一个POINTL结构指针，该结构包含HIMETRIC单位的坐标。
lpptfContainer | 一个POINTF结构指针，该结构包含包容器单元尺寸的坐标。
flags下列值的组合：
· | XFORMCOORDS_POSITION | 包容器内的一个位置。
· | XFORMCOORDS_SIZE | 包容器内的尺寸。
· | XFORMCOORDS_HIMETRICTOCONTAINER | 从HIMETRIC单位转换成包容器的单位。
· | XFORMCOORDS_CONTAINERTOHIMETRIC | 从包容器单位转换成HIMETRIC单位。

说明：
调用该函数在HIMETRIC单位和包容器单位之间转换坐标值。
前两个标志XFORMCOORDS_POSITION和XFORMCOORDS_SIZE用于说明将坐标视为位置还是尺寸。剩下的两个标志指示转换的方向。

请参阅：COleControl::AmbientScaleUnits


 COleControl::TranslateColor

COLORREF TranslateColor( OLE_COLOR clrColor, HPALETTE hpal = NULL );

返回值：
RGB (红，绿，蓝) 32位颜色值。它定义了最接近clrColor值的设备可显示的固定颜色。

参数：
clrColor | OLE_COLOR数据类型。要了解更多的信息，请参阅WindowsOleTranslateColor函数。
hpal | 一个可选调色板句柄。可以是NULL。

说明：
调用该函数将一个颜色值从OLE_COLOR数据类型转换到COLORREF数据类型。该函数在将标准ForeColor和BackColor特性值转换成CDC成员函数使用的COLORREF类型时非常有用的。

请参阅：
COleControl::GetForeColor, COleControl::GetBackColor


 COleControl::WillAmbientsBeValidDuringLoad

BOOL WillAmbientsBeValidDuringLoad( );

返回值：
非零值表示环境特性有效；否则环境特性无效。

说明：
调用该函数以判定在从永久存储加载控件时是否使用环境特性值作为缺省值。
在一些包容器中，在初始化调用COleControl::DoPropExchange的覆盖函数期间，控件将不能存取它的环境特性值。例如，如果包容器在调用IOleObject::SetClientSite之前调用IPersistStreamInit::Load 或IPersistStorage::Load就属于这种情况。

请参阅：
COleControl::DoPropExchange, COleControl::GetAmbientProperty


 COleControlModule

CObject
└CCmdTarget
└CWinThread
└CWinApp
└COleControlModule

COleControlModule类是用于派生OLE控件模块对象的基类。该类提供成员函数初始化控件模块。每个使用Microsoft基础类的OLE控件只能包含一个从COleControlModule派生的对象。当其它C++全局对象创建的同时创建该对象。将COleControlModule对象声明为全局级。
关于使用COleControlModule类的其它信息，请参阅联机文档“Visual C++程序员指南”中的CWinApp类和：“ActiveX控件”。

#include <afxctl.h>


 COleConvertDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog
└COleDialog
└COleConvertDialog

COleConvertDialog类用于OLE转换对话框。当要调用该对话框时，首先创建COleConvertDialog类的一个对象，然后使用m_cv结构初始化对话框控件的值或状态。m_cv结构是OLEUICONVERT类型。关于使用该对话框的信息，请参阅DoModal成员函数。
注意：应用向导生成包容器代码使用该类。
要了解更多的信息，请参阅OLE 中的OLEUICONVERT结构。
有关OLE特性对话框的信息，请参阅联机文档《Visual C++程序员指南》中的“OLE中的对话框”。
#include <afxodlgs.h>
请参阅：COleDialog

COleConvertDialog类的成员

数据成员
m_cv 控制对话框行为的结构

构造函数
COleConvertDialog 构造一个COleConvertDialog对象

操作和属性
DoModal | 显示OLE变换项对话框
DoConvert | 执行在对话框中说明的转换
GetSelectionType | 取得选中的选择项类型
GetClassID | 取得与选中项相关联的CLSID
GetDrawAspect | 说明是否绘制项为图标
GetIconicMetafile | 获取和项的图标形式关联的元文件句柄


 COleConvertDialog::COleConvertDialog

COleConvertDialog(COleClientItem* pItem,
DWORD dwFlags = CF_SELECTCON VERTTO,
CLSID FAR* pClassID = NULL,
CWnd* pParentWnd = NULL
);

参数：
pItem | 指向被激活或转换的项的指针。
dwFlags创建标志，可以包含任意个下列值的位或运算。
· | CF_SELECTCONVERTTO | 调用对话框时，将“转换至”（Convert To）单选钮初始化为选中。这是缺省值。
· | CF_SELECTACTIVATEAS | 调用对话框时，将“激活为”（Activate As）单选钮初始化为选中。
· | CF_SETCONVERTDEFAULT | 说明当“转换至”（Convert To）单选钮被选中时，CLSID 在m_cv结构的clsidConvertDefault成员中声明了的类将作为类列表框中缺省选择。
· | CF_SETACTIVATEDEFAULT | 说明当“激活为”（Activate As）单选钮被选中时，CLSID 在m_cv结构的clsidActivateDefault成员中声明了的类将作为类列表框中缺省选择。
· | CF_SHOWHELPBUTTON | 说明调用对话框时将显示帮助按钮。
pClassID | 指向被激活或转换的项的CLSID指针。如果为 NULL，将使用pItem关联的项CLSID。
pParentWnd | 指向该对话框对象所属的父窗口或属主窗口对象的指针。如果为NULL，该对话框的父窗口被设置为主应用窗口。

说明：
该函数仅用于构造一个COleConvertDialog对象。请调用DoModal函数来显示该对话框窗口。
要了解更多的信息，请参阅CLSID键和OLEUICONVERT结构。

请参阅：
COleConvertDialog::DoModal, COleConvertDialog::m_cv


 COleConvertDialog::DoConvert

BOOL DoConvert( COleClientItem* pItem );

返回值：如果成功，则返回非零值；否则为0。

参数：
pItem 指向被激活或转换的项的指针。不能为NULL。

说明：
在DoModal成功返回后，调用该函数转换或激活一个COleClientItem类型的对象。项将按照在转换对话框中选定的信息进行转换或激活。

请参阅：
COleClientItem, COleConvertDialog::DoModal, COleConvertDialog::GetSelectionType, COleClientItem::ConvertTo, COleClientItem::ActivateAs


 COleConvertDialog::DoModal

virtual int DoModal( );

返回值：
对话框的完成状态。它可以是下列值：
· | IDOK | 若对话框成功显示。
· | IDCANCEL | 如果用户取消了该对话框。
· | IDABORT | 若出错。如果返回IDABORT，可调用COleDialog::GetLastError成员函数以取得关于出错类型的相关信息。关于所有可能出现的错误的列表清单，请参阅OLE文档中的OleUIConvert函数。

说明：
调用该函数，以显示OLE 转换对话框。
如果要通过调整m_cv结构的值来初始化对话框中的控件状态，必须在调用DoModal之前，构造对话框对象之后完成此项工作。
如果DoModal返回IDOK，可以调用其它成员函数获取用户在对话框中输入的设置或信息。

请参阅：
COleDialog::GetLastError, CDialog::DoModal, COleConvertDialog::m_cv, COleConvertDialog::DoConvert, COleConvertDialog::GetSelectionType, COleConvertDialog::GetClassID, COleConvertDialog::GetDrawAspect, COleConvertDialog::GetIconicMetafile


 COleConvertDialog::GetClassID

const CLSID& GetClassID( ) const;

返回值：
与转换对话框中选定的项相关联的CLSID。

说明：
调用该函数获取与用户在转换对话框中选定的项相关联的CLSID。只有在DoModal返回IDOK后才能调用该函数。
要了解更多的信息，请参阅OLE文档中的CLSID关键字。

请参阅：COleConvertDialog::DoModal


 COleConvertDialog::GetDrawAspect

DVASPECT GetDrawAspect( ) const;

返回值：
显示对象的方法。
· | DVASPECT_CONTENT | 如果“显示为图标”（Display As Icon）复选框未被选中时返回。
· | DVASPECT_ICON | 如果“显示为图标”（Display As Icon）复选框选中时返回。

说明：
调用该函数决定用户是否选择项以图表方式显示。只有在DoModal返回IDOK后才能调用该函数。
有关绘制外观的信息，请参阅OLE文档中的FORMATETC数据结构。

请参阅：
COleConvertDialog::DoModal, COleConvertDialog::COleConvertDialog


 COleConvertDialog::GetIconicMetafile

HGLOBAL GetIconPicture( ) const;

返回值：
如果“显示为图标”（Display As Icon）复选框选中时，则返回包含选中项的图表外观信息的元文件的句柄；否则为NULL。

说明：
调用该函数获取包含选中项的图表外观信息的元文件的句柄。

请参阅：
COleConvertDialog::DoModal, COleConvertDialog::COleConvertDialog, COleConvertDialog::GetDrawAspect


 COleConvertDialog::GetSelectionType

UINT GetSelectionType( ) const;

返回值：所作的选择类型。

说明：
调用该函数判定用户在转换对话框中选定的转换类型。
返回类型的可能值在COleConvertDialog类的Selection枚举类型中声明。
enum Selection
{
noConversion,
convertItem,
activateAs
};
这些值的简单描述如下：
· | COleConvertDialog::noConversion | 若对话框被取消或用户选择不转换时返回该值。若COleConvertDialog::DoModal返回IDOK，用户可能选择了不同于原先的图标。
· | COleConvertDialog::convertItem | 若选中了Convert To单选钮，用户选择了不同的项进行转换，并且DoModal返回IDOK时，则返回该值。
· | COleConvertDialog::activateAs | 若选中了Activate As单选钮，用户选择了不同的项进行激活，并且DoModal返回IDOK时，则返回该值。

请参阅：
COleConvertDialog::DoModal, COleConvertDialog::COleConvertDialog


 COleConvertDialog::m_cv

说明：
OLEUICONVERT类型的结构用于控制转换对话框的行为。该结构的成员可以直接修改，也可以通过它的成员函数进行修改。
要了解更多的信息，请参阅OLE文档中的OLEUICONVERT结构。

请参阅：
COleConvertDialog::COleConvertDialog, COleConvertDialog::DoModal


 COleCurrency

COleCurrency没有基类。
COleCurrency对象封装了OLE自动的CURRENCY 数据类型。CURRENCY为8字节，取值两个完整整数值除以10000。它的小数点左边有15位，右边为4位。 在涉及货币的计算时，CURRENCY 数据类型时十分有用。它是OLE 自动的VARIANT数据类型的一种可能类型。
COleCurrency为这一浮点固定的数据类型实现了基本的运算操作符。同时还支持计算中的位舍入问题。
要了解更多的信息，请参阅联机文档“Win32 SDK OLE程序员参考”中的CURRENCY 和VARIANT。
#include <afxdisp.h>
请参阅：COleVariant

COleCurrency类的成员

构造函数
COleCurrency 构造一个COleCurrency对象

属性
GetStatus | 取得该COleCurrency的状态（有效性）
SetStatus | 设置该COleCurrency的状态（有效性）

操作
SetCurrency | 设置该COleCurrency的值
Format | 生成代表一个COleCurrency对象的字符串
ParseCurrency | 从一个字符串中读取CURRENCY值并设置COleCurrency的值

操作符
operator CURRENCY | 将COleCurrency值转换成CURRENCY
operator = | 复制一个COleCurrency值
operator +,- | 加、减COleCurrency值或改变它的符号
operator +=,-= | 从COleCurrency 对象中加上、减去一个COleCurrency值
operator *,/ | 将一个 COleCurrency值乘上一个整数值
operator *=,/= | 将一个 COleCurrency值乘上一个整数值
关系操作符 | 比较两个COleCurrency值

数据成员
m_cur | 存放COleCurrency对象的CURRENCY值
m_status | 存放COleCurrency对象的状态

归档/保存
operator << | 将一个COleCurrency值输出到CArchive或CDumpContext
operator >> | 从CArchive输入一个COleCurrency值


 COleCurrency::COleCurrency

COleCurrency( );
COleCurrency( CURRENCY cySrc );
COleCurrency( const COleCurrency& curSrc );
COleCurrency( const VARIANT& varSrc );
COleCurrency( long nUnits, long nFractionalUnits );

参数：
cySrc | 要复制到该新的COleCurrency对象的CURRENCY值。
curSrc | 要复制到该新的COleCurrency 对象的已有的COleCurrency对象。
varSrc | 一个已有的VARIANT数据结构 (可能是一个COleVariant对象)。它将被转换成一个货币值(VT_CY) 并复制到新的COleCurrency对象中。
nUnits, nFractionalUnits | 指示复制到新的COleCurrency对象的单位和分值（1/10,000）。

说明：
所有的构造函数都创建一个新的COleCurrency对象，并初始化为一个给定值。这些构造函数的简要描述如下（除非另外声明，新的COleCurrency项的状态设置为有效）：
· | COleCurrency( ) | 构造一个COleCurrency对象并初始化为0。
· | COleCurrency( cySrc ) | 从一个CURRENCY值构造一个COleCurrency对象。
· | COleCurrency( curSrc ) | 从一个已经存在的COleCurrency对象构造一个COleCurrency对象。两个对象具有相同的状态。
· | COleCurrency( varSrc ) | 构造一个COleCurrency对象。它将尝试将一个已有的VARIANT数据结构或一个COleVariant对象转换成一个货币值(VT_CY)。若转换成功，将转换得到的值复制到新的COleCurrency对象中。若转换不成功，COleCurrency对象的指设置为0，其状态设置为无效。
· | COleCurrency( nUnits, nFractionalUnits ) | 从指定的数字构造一个COleCurrency对象。如果分值的绝对值大于10,000，将对单位进行相应的调整。注意单位和分值用有符号长整数值说明。
要了解更多的信息，请参阅联机文档《Win32 SDK OLE程序员参考》中的CURRENCY 和VARIANT。

示例：
下面的示例表示了无参数和两个参数的构造函数的效果：
COleCurrency curZero; // value: 0.0000
COleCurrency curA(4, 500); // value: 4.0500
COleCurrency curB(2, 11000); // value: 3.1000
COleCurrency curC(2, -50); // value: 1.9950

请参阅：
COleCurrency::SetCurrency, COleCurrency::operator =, COleCurrency::GetStatus, COleCurrency::m_cur, COleCurrency::m_status


 COleCurrency::Format

CString Format( DWORD dwFlags = 0, LCID lcid = LANG_USER_DEFAULT );

返回值：包含格式化的货币值的CString对象。

参数：
dwFlags本地设置的指示标志。可能是下列值：
·LOCALE_NOUSEROVERRIDE使用系统缺省的本地设置，而不用用户自定义的本地设置。
lcid 指示用于转换的本地ID。

说明：
调用该成员函数来创建货币值的格式化表示方式。它将使用本地语言规格来格式化值（本地ID)。货币符号将不包含在返回值中。如果该COleCurrency对象的状态为空，它返回一个空字符串。如果状态为无效，将返回有字符串资源IDS_INVALID_CURRENCY说明的字符串。

示例：
COleCurrency curA; // value: 0.0000
curA.SetCurrency(4, 500); // value: 4.0500

// value returned: 4.05
curA.Format(0, MAKELCID(MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SINGAPORE), SORT_DEFAULT));
// value returned: 4,05
curA.Format(0, MAKELCID(MAKELANGID(LANG_GERMAN, SUBLANG_GERMAN_AUSTRIAN), SORT_DEFAULT));

注意：
有关本地ID值的讨论，请参阅联机文档《Win32 SDK OLE程序员参考》中“支持多国语言”。

请参阅：
COleCurrency::ParseCurrency, COleCurrency::GetStatus


 COleCurrency::GetStatus

CurrencyStatus GetStatus( ) const;

返回值：返回该COleCurrency值的状态。

说明：
调用该函数获取一个给定的COleCurrency对象的状态（有效性）。
返回值由定义在COleCurrency类中的CurrencyStatus枚举类型定义。
enum CurrencyStatus
{
valid = 0,
invalid = 1,
null = 2,
};
这些值的简要描述见下面的列表：
· | COleCurrency::valid | 指示该COleCurrency对象有效。
· | COleCurrency::invalid | 指示该COleCurrency对象无效，也就是说，它的值可能不正确。
· | COleCurrency::null | 指示该COleCurrency对象为空，也就是说，没有为该对象填充值 (这里，"空"是数据库中"没有值"的意思，而不是C++中NULL值)。
在以下情况下，一个COleCurrency对象的状态为无效：
· | 如果它的值要从一个VARIANT 或COleVariant值设定，但它们无转换成货币值。
· | 如果该对象在进行如+= 或*=的算术运算时上溢或下溢。
· | 如果给该对象指派了一个无效值。
· | 如果使用SetStatus显式地设置该对象状态为无效。
有关可能设置状态为无效的操作的信息，请参阅下面的成员函数：
·COleCurrency
·操作符=
·操作符 +, -
·操作符 +=, - =
·操作符 *, /
·操作符 *=, /=

请参阅：
COleCurrency::SetStatus, COleCurrency::m_status


 COleCurrency::ParseCurrency

BOOL ParseCurrency( LPCTSTR lpszCurrency, DWORD dwFlags = 0, LCID lcid = LANG_USER_DEFAULT );
throw( CMemoryException );
throw( COleException );

返回值：
若字符串成功转换成货币值，则返回非零值；否则为0。

参数：
lpszCurrency | 要分解的非空结束字符串的指针。
dwFlags本地设置的指示标志。可能是下列值：
·LOCALE_NOUSEROVERRIDE使用系统缺省的本地设置，而不用用户自定义的本地设置。
lcid | 指示用于转换的本地ID。

说明：
调用该成员函数将一个字符串分解成货币值。它将使用字符串中非数字字符的本地语言规格（本地ID)。
有关本地ID值的讨论，请参阅联机文档“Win32 SDK OLE程序员参考”中“支持多国语言”。
如果字符串成功转换成货币值，该COleCurrency 对象的值设置为该值并设置对象的状态为有效。
若不能将字符串转换成货币值或发生了数值溢出，该COleCurrency对象的状态设置为无效。
如果因为内存分配错误使字符串转换失败，函数发出一个CMemoryException异常。若出现别的错误，函数发出一个COleException异常。

请参阅：
COleCurrency::Format, COleCurrency::GetStatus


 COleCurrency::SetCurrency

void SetCurrency( long nUnits, long nFractionalUnits );

参数：
nUnits, nFractionalUnits 指示复制到新的COleCurrency对象的单位和分值（1/10,000）。

说明：
调用此成员函数设置COleCurrency对象的单位和分值。
如果分值的绝对值大于10,000,将对单位进行相应的调整（见下面的示例）。注意单位和分值用有符号长整数值说明。

示例：
COleCurrency curA; // value: 0.0000
curA.SetCurrency(4, 500); // value: 4.0500
curA.SetCurrency(2, 11000); // value: 3.1000
curA.SetCurrency(2, -50); // value: 1.9950

请参阅：
COleCurrency::COleCurrency, COleCurrency::operator =, COleCurrency::m_cur


 COleCurrency::SetStatus

void SetStatus( CurrencyStatus nStatus );

参数：
nStatus 该COleCurrency对象的新状态。

说明：
调用该成员设置函数COleCurrency对象的状态（有效性）。nStatus参数设置由定义在COleCurrency类中的CurrencyStatus 枚举类型定义。
enum CurrencyStatus
{
valid = 0,
invalid = 1,
null = 2,
};
这些值的简要描述见下面的列表：
· | COleCurrency::valid | 指示该COleCurrency对象有效。
· | COleCurrency::invalid | 指示该COleCurrency对象无效，也就是说，它的值可能不正确。
· | COleCurrency::null | 指示该COleCurrency对象为空，也就是说，没有为该对象填充值 (这里，“空”是数据库中“没有值”的意思，而不是C++中NULL值)。
警告：
该函数在高级编程情况下使用。该函数不修改该对象中的数据，它经常用于将对象的状态设置为空或无效。注意赋值操作（=)和SetCurrency都基于源值设置对象的状态。

请参阅：
COleCurrency::GetStatus, COleCurrency::operator =, COleCurrency::SetCurrency, COleCurrency::m_status


 COleCurrency::m_cur

说明：
该COleCurrency 对象下面的CURRENCY结构。
警告：
改变该函数返回的CURRENCY结构的值将改变该COleCurrency对象的值。但不会改变它的状态。要了解更多的信息，请参阅联机文档“Win32 SDK OLE程序员参考”中的CURRENCY。

请参阅：
COleCurrency::COleCurrency, COleCurrency::operator CURRENCY, COleCurrency::SetCurrency


 COleCurrency::m_status

说明：
该数据成员的类型是在COleCurrency 类中定义的CurrencyStatus类型的枚举。
enum CurrencyStatus
{
valid = 0,
invalid = 1,
null = 2,
};
这些值的简要描述见下面的列表：
· | COleCurrency::valid | 指示该COleCurrency对象有效。
· | COleCurrency::invalid | 指示该COleCurrency对象无效，也就是说，它的值可能不正确。
· | COleCurrency::null | 指示该COleCurrency对象为空，也就是说，没有为该对象填充值 (这里，“空”是数据库中“没有值”的意思，而不是C++中NULL值)。
在以下情况下，一个COleCurrency对象的状态为无效：
· | 如果它的值要从一个VARIANT 或COleVariant值设定，但它们没有转换成货币的值。
· | 如果该对象在进行如+= 或*=的算术运算时上溢或下溢。
· | 如果给该对象指派了一个无效值。
· | 如果使用SetStatus显式地设置该对象状态为无效。
有关可能设置状态为无效的操作的信息，请参阅下面的成员函数：
·COleCurrency
·操作符=
·操作符 +, -
·操作符 +=, -=
·操作符 *, /
·操作符 *=, /=
警告：
该数据成员在高级编程情况下使用。必须使用内联成员函数GetStatus和SetStatus。有关设置该数据成员的信息，请参阅SetStatus

请参阅：
COleCurrency::GetStatus, COleCurrency::SetStatus


 COleCurrency::operator +, -

COleCurrency operator +( const COleCurrency& cur ) const;
COleCurrency operator -( const COleCurrency& cur ) const;
COleCurrency operator -( ) const;

说明：
这些操作符是将两个COleCurrency值进行加减和改变一个COleCurrency值的符号。
如果两个操作数有一个为空，结果COleCurrency值也为空。
如果算术运算溢出，结果COleCurrency值设置为无效。
如果一个操作数无效，另一个非空，结果COleCurrency值也无效。
关于有效、无效和空状态值的信息，请参阅 m_status成员变量。

请参阅：
COleCurrency::operator +=,-=, COleCurrency::GetStatus


 COleCurrency::operator +=, -=

const COleCurrency& operator +=( const COleCurrency& cur );
const COleCurrency& operator -=( const COleCurrency& cur );

说明：
这些操作符是向COleCurrency对象加上一个COleCurrency 值，或从该COleCurrency对象减去一个COleCurrency 值。
如果两个操作数有一个为空，结果COleCurrency值也为空。
如果算术运算溢出，结果COleCurrency值设置为无效。
如果一个操作数无效，另一个非空，结果COleCurrency值也无效。
关于有效、无效和空状态值的信息，请参阅 m_status成员变量。

请参阅：
COleCurrency::operator +,-, COleCurrency::GetStatus


 COleCurrency::operator =

const COleCurrency& operator =( CURRENCY cySrc );
const COleCurrency& operator =( const COleCurrency& curSrc );
const COleCurrency& operator =( const VARIANT& varSrc );

说明：
该重载赋值操作符是将一个源货币值复制到该COleCurrency对象。下面是对各操作的简要描述：
·operator =( cySrc ) | 将CURRENCY值复制到COleCurrency对象中，并将对象状态设置为有效。
·operator =( curSrc ) | 将一个存在的COleCurrency对象的值和状态都复制到该COleCurrency对象中。
·operator =( varSrc ) | 如果能将一个VARIANT值(或COleVariant对象) 转换为一个货币值 (VT_CY)，就将转换值复制到该COleCurrency对象中，并将其状态设置为有效。若转换不成功，COleCurrency对象的值设置为0，状态设置为无效。
要了解更多的信息，请参阅联机文档“Win32 SDK OLE程序员参考”中的CURRENCY和VARIANT。

请参阅：
COleCurrency::COleCurrency, COleCurrency::SetCurrency, COleCurrency::GetStatus


 COleCurrency::operator *, /

COleCurrency operator *( long nOperand ) const;
COleCurrency operator /( long nOperand ) const;

说明：
这些操作符允许你将一个 COleCurrency值按整数倍进行乘除。
如果COleCurrency操作符为空，结果COleCurrency值的状态也为空。
如果算术运算上溢或下溢，结果COleCurrency值设置为无效。
如果一个操作数无效，结果COleCurrency值的状态也无效。
关于有效、无效和空状态值的信息，请参阅 m_status成员变量。

请参阅：
COleCurrency::operator *=,/=, COleCurrency::GetStatus


 COleCurrency::operator *=, /=

const COleCurrency& operator *=( long nOperand );
const COleCurrency& operator /=( long nOperand );

说明：
这些操作是将该COleCurrency值按整数倍进行乘除。
如果COleCurrency操作数为空，该COleCurrency值的状态也为空。
如果算术运算上溢或下溢，该COleCurrency值设置为无效。
如果一个操作数无效，该COleCurrency值的状态也无效。
关于有效、无效和空状态值的信息，请参阅 m_status成员变量。

请参阅：
COleCurrency::operator *,/, COleCurrency::GetStatus


 COleCurrency::operator <<, >>

friend CDumpContext& operator <<( CDumpContext& dc, COleCurrency curSrc );
friend CArchive& operator <<( CArchive& ar, COleCurrency curSrc );
friend CArchive& operator >>( CArchive& ar, COleCurrency& curSrc );

说明：
COleCurrency的插入(<<)操作符支持向档案文件的诊断转储和存储。提取(>>) 操作符支持从一个档案文件装载。

请参阅：CDumpContext, CArchive


 COleCurrency 关系操作符

BOOL operator ==( const COleCurrency& cur ) const;
BOOL operator !=( const COleCurrency& cur ) const;
BOOL operator <( const COleCurrency& cur ) const;
BOOL operator >( const COleCurrency& cur ) const;
BOOL operator <=( const COleCurrency& cur ) const;
BOOL operator >=( const COleCurrency& cur ) const;

说明：
这些操作符比较两个货币值，如果条件为真，则返回非零值，否则为0。
注意：
如果有一个操作数的状态为空或无效，排序操作符(<, <=, >, >=)的返回值未定义。等值操作符(==, !=)是操作数的状态而定。

示例：
COleCurrency curOne(3, 5000); // 3.5
COleCurrency curTwo(curOne); // 3.5
BOOL b;
b = curOne == curTwo; // TRUE

curTwo.SetStatus(COleCurrency::invalid);
b = curOne == curTwo; // FALSE, different status
b = curOne != curTwo; // TRUE, different status
b = curOne < curTwo; // FALSE, same value
b = curOne > curTwo; // FALSE, same value
b = curOne <= curTwo; // TRUE, same value
b = curOne >= curTwo; // TRUE, same value
注意：最后四行在调试模式中将会发出声明警告。

请参阅：COleCurrency::GetStatus


 COleCurrency::operator CURRENCY

operator CURRENCY( ) const;

说明：
该操作符返回一个CURRENCY结构，该结构的值等于COleCurrency对象的值。
要了解更多的信息，请参阅联机文档“Win32 SDK OLE程序员参考”的CURRENCY 。

请参阅：
COleCurrency::m_cur, COleCurrency::SetCurrency


 COleDataObject

COleDataObject没有基类。
COleDataObject用于从一个嵌入OLE项，或从剪贴板中通过拖放操作，以不同的数据格式存取数据时的数据传输。这类数据传输具有一个数据源和一个目的地。数据源是实现为一个COleDataSource类。无论目的地应用中是否有存放在内的数据，或从剪贴板中执行一次粘贴操作，都必须建立COleDataObject类的一个对象。
该类使你能够判定数据是否以一种指定的格式存在。可以列举可用的数据格式或检查一个给定的格式是否可用，然后用首选的格式进行数据存取。对象的存取可以用几种途径，包括使用一个CFile或一个HGLOBAL或STGMEDIUM结构。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的STGMEDIUM结构。
关于如何在你的应用中使用数据对象，请参阅联机文档《Visual C++程序员指南》中的“数据对象和数据源(OLE)”。
#include <afxole.h>

请参阅：
COleDataSource, COleClientItem, COleServerItem, COleDataSource::DoDragDrop, CView::OnDrop

COleDataObject类的成员

构造函数
COleDataObject 构造一个COleDataObject对象

操作
AttachClipboard | 粘附在剪贴板中的数据对象
IsDataAvailable | 检查数据在指定格式下是否可用
GetData | 用指定的格式从一个附加的OLE数据对象中拷贝数据
GetFileData | 用指定格式从一个附加的OLE数据对象中拷贝数据到一个CFile指针
GetGlobalData | 用指定格式从一个附加的OLE数据对象中拷贝数据到一个HGLOBAL
BeginEnumFormats | 为后面一次或多次的
GetNextFormat | 调用作准备GetNextFormat返回下一个可用的格式
Attach | 将指定OLE数据对象附加到COleDataObject
Release | 分离并释放关联的IDataObject对象
Detach | 分离关联的IDataObject对象


 COleDataObject::Attach

void Attach( LPDATAOBJECT lpDataObject, BOOL bAutoRelease = TRUE );

参数：
lpDataObject | 一个OLE数据对象的指针。
bAutoRelease | 如果销毁COleDataObject对象时需释放OLE数据对象，其值为TRUE；否则为FALSE。

说明：
调用该函数将一个OLE数据对象和COleDataObject对象关联。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的 IDataObject结构。

请参阅：
COleDataObject::AttachClipboard, COleDataObject::Detach, COleDataObject::Release


 COleDataObject::AttachClipboard

BOOL AttachClipboard( );

返回值：如果成功，则返回非零值；否则为0。

说明：
调用该函数粘贴一个当前在剪贴板中的数据对象到COleDataObject对象。
注意：
调用该函数将封锁剪贴板直至该数据对象被释放。数据对象在COleDataObject的析构函数中释放。要了解更多的信息，请参阅Win32文档中的OpenClipboard和CloseClipboard。

请参阅：
COleDataObject::Attach, COleDataObject::Detach, COleDataObject::Release


 COleDataObject::BeginEnumFormats

void BeginEnumFormats( );

说明：
调用该函数为后面调用GetNextFormat从项存取一系列数据格式作准备。
调用BeginEnumFormats后，该数据对象支持的第一种格式的位置被存储起来，连续地调用GetNextFormat将列举数据对象的可用格式的序列。要检查数据在给定格式下的可用性，请使用COleDataObject::IsDataAvailable。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的IDataObject::Enum FormatEtc。

请参阅：
COleDataObject::GetNextFormat, COleDataObject::IsDataAvailable


 COleDataObject::COleDataObject

COleDataObject( );

说明：
构造一个COleDataObject对象。在调用COleDataObject函数之前，必须先调用COleDataObject::Attach或COleDataObject::AttachClipboard。
注意：
既然拖放操作的其中一个参数是一个COleDataObject的一个指针，无需调用该构造函数来支持拖放操作。

请参阅：
COleDataObject::Attach, COleDataObject::AttachClipboard, COleDataObject::Release


 COleDataObject::Detach

LPDATAOBJECT Detach( );

返回值：分离的OLE数据对象的指针。

说明：
调用该函数将COleDataObject对象从它关联的OLE数据对象中分离出来，但不释放数据对象。

请参阅：
COleDataObject::Attach, COleDataObject::Release


 COleDataObject::GetData

BOOL GetData( CLIPFORMAT cfFormat, LPSTGMEDIUM lpStgMedium, LPFORMATETC lpFormatEtc = NULL );

返回值：如果成功，则返回非零值；否则为0。

参数：
cfFormat | 数据的返回格式。该参数可以是预定义剪贴板格式的一种或WindowsRegisterClipboardFormat函数的返回值。
lpStgMedium | 接收数据的一个 STGMEDIUM结构。
lpFormatEtc | 一个FORMATETC结构的指针，该结构说明数据的返回格式。如果你要在用cfFormat指定的剪贴板格式外指定另外的格式，给该参数提供一个值。如果该值为NULL, 将使用FORMATETC结构的缺省值。

说明：
调用该函数以指定格式存取数据。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的IDataObject::GetData，STGMEDIUM和FORMATETC。
要了解更多的信息，请参阅Win32文档中的RegisterClipboardFormat。

请参阅：
COleDataObject::GetFileData, COleDataObject::GetGlobalData, COleDataObject::IsDataAvailable


 COleDataObject::GetFileData

CFile* GetFileData( CLIPFORMAT cfFormat, LPFORMATETC lpFormatEtc = NULL );

返回值：
如果成功，则返回一个新的包含数据的CFile或CFile派生类的对象的指针；否则返回NULL。

参数：
cfFormat | 数据的返回格式。该参数可以是预定义剪贴板格式的一种或WindowsRegisterClipboardFormat函数的返回值。
lpFormatEtc | 一个FORMATETC 结构的指针，该结构说明数据的返回格式。如果你要在用cfFormat指定的剪贴板格式外指定另外的格式，给该参数提供一个值。如果该值为NULL，将使用FORMATETC结构的缺省值。

说明：
调用该函数创建一个CFile或CFile派生的对象，以指定格式将数据存取到一个CFile指针中。视数据存储的介质不同，则返回值指向的实际类型可能是CFile，CSharedFile或COleStreamFile。
注意：
该函数返回值存取的CFile对象属于调用者。应由调用者来删除CFile数据对象以关闭文件。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的FORMATETC。要了解更多的信息，请参阅Win32文档中的RegisterClipboardFormat。

请参阅：
COleDataObject::GetData, COleDataObject::GetGlobalData, COleDataObject::IsDataAvailable


 COleDataObject::GetGlobalData

HGLOBAL GetGlobalData( CLIPFORMAT cfFormat, LPFORMATETC lpFormatEtc = NULL );

返回值：
如果成功，则返回包含数据的全局内存块的句柄；否则返回NULL。

参数：
cfFormat | 数据的返回格式。该参数可以是预定义剪贴板格式的一种或Windows RegisterClipboardFormat函数的返回值。
lpFormatEtc | 一个FORMATETC结构的指针，该结构说明数据的返回格式。如果你要在用cfFormat指定的剪贴板格式外指定另外的格式，给该参数提供一个值。如果该值为NULL, 将使用FORMATETC结构的缺省值。

说明：
调用该函数分配全局内存块，以指定格式将数据存取到一个HGLOBAL中。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的FORMATETC。
要了解更多的信息，请参阅Win32文档中的RegisterClipboardFormat。

请参阅：
COleDataObject::GetData, COleDataObject::GetFileData, COleDataObject::IsDataAvailable


 COleDataObject::GetNextFormat

BOOL GetNextFormat( LPFORMATETC lpFormatEtc );

返回值：
如果有另外格式可用，则返回非零值；否则为0。

参数：
lpFormatEtc 一个FORMATETC结构指针，用于函数返回时存取格式信息。

说明：
重复调用该函数获取所有从项存取数据的可用格式。
调用BeginEnumFormats后，该数据对象支持的第一种格式的位置被存储起来，连续地调用GetNextFormat将列举数据对象的可用格式的序列。
使用这些函数可罗列可用格式。要检查数据在给定格式下的可用性，请使用COleDataObject::IsDataAvailable。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的IEnumXXXX::Next。


 COleDataObject::IsDataAvailable

BOOL IsDataAvailable( CLIPFORMAT cfFormat, LPFORMATETC lpFormatEtc = NULL );

返回值：
若数据在指定格式下可用，则返回非零值；否则为0。

参数：
cfFormat | 数据的返回格式。该参数可以是预定义剪贴板格式的一种或Windows RegisterClipboardFormat函数的返回值。
lpFormatEtc | 一个FORMATETC结构的指针，该结构说明数据的返回格式。如果你要在用cfFormat指定的剪贴板格式外指定另外的格式，给该参数提供一个值。如果该值为NULL，将使用FORMATETC结构的缺省值。

说明：
调用该函数判定特定格式是否可用于从OLE 项中存取数据。在调用GetData，GetFileData或GetGlobalData之前调用该函数是十分有用的。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的IDataObject::QueryGetData和FORMATETC结构。要了解更多的信息，请参阅Win32文档中的RegisterClipboardFormat。

请参阅：
COleDataObject::BeginEnumFormats, COleDataObject::GetData, COleDataObject::GetFileData, COleDataObject::GetGlobalData, COleDataObject::GetNextFormat


 COleDataObject::Release

void Release( );

说明：
调用该函数释放一个先前和COleDataObject关联的IDataObject对象的所有权。可以显式地调用Attach或AttachClipboard 或由框架将一个IDataObject对象和COleDataObject 关联。如果Attach 的 bAutoRelease参数为 FALSE, IDataObject对象将不释放。在这种情形下，调用者有责任使用IUnknown::Release释放IDataObject。

请参阅：
COleDataObject::Attach, COleDataObject::COleDataObject, COleDataObject::Detach


 COleDataSource

CObject
└CCmdTarget
└COleDataSource

COleDataSource类起到缓存的作用。它被用户在数据传输期间，例如剪贴板或拖放操作，为应用存放数据。
可以直接建立一个OLE数据资源。一般地，COleClientItem类 和COleServerItem 类在响应CopyToClipboard 时将会建立OLE数据资源。请参阅COleServerItem:: CopyToClipboard的简单描述。为CopyToClipboard 和DoDragDrop成员函数创建OLE数据资源时，如果要添加另外的剪贴板格式，可覆盖客户项或服务器项的OnGetClipboardData成员函数。
无论何时你准备进行数据的传输，必须先建立该类的一个对象，并用最恰当的格式将数据填写进去。插入数据的方式将直接影响是否数据可以直接提供（立即提供）或响应命令提供（延迟提供）。使用每一种剪贴板格式提供数据(和一个可选的FORMATETC结构)，调用DelayRenderData。
有关数据资源和数据传输的信息，请参阅“数据对象和数据源(OLE)”。另外，《Visual C++程序员指南》中的“剪贴板主题” 描述了OLE剪贴板机制。
#include <afxole.h>
请参阅：COleDataObject

COleDataSource类的成员

构造函数
COleDataSource 构造一个COleDataSource对象

操作
CacheData | 使用STGMEDIUM结构以指定方式提供数据
CacheGlobalData | 使用HGLOBAL以指定方式提供数据
DoDragDrop | 执行拖放操作。
SetClipboard | 放置一个COleDataSource对象到剪贴板中。
Empty | 清空数据的COleDataSource对象
FlushClipboard | 丢弃剪贴板中的所有数据
GetClipboardOwner | 验证放置在剪贴板中的数据仍然存在
OnRenderData | 作为延迟提供数据的一部分存取数据
OnRenderFileData | 作为延迟提供数据的一部分存取数据到CFile中
OnRenderGlobalData | 作为延迟提供数据的一部分存取数据到HGLOBAL中
OnSetData | 替换COleDataSource对象中的数据
DelayRenderData | 使用延迟提供方式以指定格式提供数据
DelayRenderFileData | 以指定方式给CFile指针提供数据
DelaySetData | 为OnSetData中支持的每一种格式调用


 COleDataSource::CacheData

void CacheData( CLIPFORMAT cfFormat, LPSTGMEDIUM lpStgMedium, LPFORMATETC lpFormatEtc = NULL );

参数：
cfFormat | 数据的返回格式。该参数可以是预定义剪贴板格式的一种或是WindowsRegisterClipboardFormat函数的返回值。
lpStgMedium | 一个STGMEDIUM结构指针，该结构中包含有指定格式的数据。
lpFormatEtc | 一个FORMATETC结构的指针，该结构说明数据的返回格式。如果你要在用cfFormat指定的剪贴板格式外指定另外的格式，给该参数提供一个值。如果该值为NULL，将使用FORMATETC结构的缺省值。

说明：
调用该函数指定在数据传输期间提供数据的格式。必须提供数据，因为该函数用立即提供的方式提供数据，直到需要时，数据一直放到缓存中。使用一个STGMEDIUM结构提供数据。同时，如果数据量足够小到能使用一个HGLOBAL 来有效地传输，也可以使用CacheGlobalData成员函数。
调用CacheData后，lpFormatEtc的ptd成员和lpStgMedium的内容由数据对象所有，而不是调用者所有。
使用延迟提供，可调用DelayRenderData或DelayRenderFileData成员函数。有关MFC处理的延迟提供的信息，请参阅《Visual C++ 程序员指南》中的“数据对象和数据源：操纵”。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的STGMEDIUM和FORMATETC结构。
要了解更多的信息，请参阅Win32文档中的RegisterClipboardFormat。

请参阅：
COleDataSource::CacheGlobalData, COleDataSource::DelayRenderData, COleDataSource::DelayRenderFileData, COleDataSource::SetClipboard, COleDataSource::DoDragDrop


 COleDataSource::CacheGlobalData

void CacheGlobalData( CLIPFORMAT cfFormat, HGLOBAL hGlobal, LPFORMATETC lpFormatEtc = NULL );

参数：
cfFormat | 数据的返回格式。该参数可以是预定义剪贴板格式的一种或是WindowsRegisterClipboardFormat函数的返回值。
hGlobal | 一个全局内存块的指针，该内存块中包含有指定格式的数据。
lpFormatEtc | 一个FORMATETC结构的指针，该结构说明数据的返回格式。如果你要在用cfFormat指定的剪贴板格式外指定另外的格式，给该参数提供一个值。如果该值为NULL，将使用FORMATETC结构的缺省值。

说明：
调用该函数指定在数据传输期间提供数据的格式。因为该函数用立即提供的方式提供数据，调用时必须提供数据；只有需要时，数据才放到其中。如果要传输的数据量较大或要求结构化的存储介质，可使用CacheData成员函数。
使用延迟提供，可调用DelayRenderData或DelayRenderFileData成员函数。有关MFC处理的延迟提供的信息，请参阅《Visual C++ 程序员指南》中的“数据对象和数据源：操纵”。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的FORMATETC结构。
要了解更多的信息，请参阅Win32文档中的RegisterClipboardFormat。

请参阅：
COleDataSource::CacheData, COleDataSource::DelayRenderData, COleDataSource::DelayRenderFileData


 COleDataSource::COleDataSource

COleDataSource( );

说明：构造一个COleDataSource对象。


 COleDataSource::DelayRenderData

void DelayRenderData( CLIPFORMAT cfFormat, LPFORMATETC lpFormatEtc = NULL );

参数：
cfFormat | 数据的返回格式。该参数可以是预定义剪贴板格式的一种或是WindowsRegisterClipboardFormat函数的返回值。
lpFormatEtc | 一个FORMATETC结构的指针，该结构说明数据的返回格式。如果你要在用cfFormat指定的剪贴板格式外指定另外的格式，给该参数提供一个值。如果该值为NULL，将使用FORMATETC结构的缺省值。

说明：
调用该函数指定在数据传输期间提供数据的格式。因为该函数规定使用延迟提供的方式，所以数据不立即提供。使用 OnRenderData或OnRenderGlobalData成员函数来请求获得数据。
如果你不通过一个CFile对象提供数据，可使用该函数，否则调用DelayRenderFileData 成员函数。有关MFC处理的延迟提供的信息，请参阅 《Visual C++ 程序员指南》中的“数据对象和数据源：操纵”。
使用立即提供方式，可调用CacheData或CacheGlobalData成员函数。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的FORMATETC结构。
要了解更多的信息，请参阅Win32文档中的RegisterClipboardFormat。

请参阅：
COleDataSource::CacheData, COleDataSource::CacheGlobalData, COleDataSource::DelayRenderFileData, COleDataSource::OnRenderData, COleDataSource::OnRenderGlobalData


 COleDataSource::DelayRenderFileData

void DelayRenderFileData( CLIPFORMAT cfFormat, LPFORMATETC lpFormatEtc = NULL );

参数：
cfFormat | 数据的返回格式。该参数可以是预定义剪贴板格式的一种或WindowsRegisterClipboardFormat函数的返回值。
lpFormatEtc | 一个FORMATETC结构的指针，该结构说明数据的返回格式。如果你要在用cfFormat指定的剪贴板格式外指定另外的格式，给该参数提供一个值。如果该值为NULL，将使用FORMATETC结构的缺省值。

说明：
调用该函数指定在数据传输期间提供数据的格式。因为该函数规定使用延迟提供的方式，所以数据不立即提供。使用 OnRenderData或OnRenderGlobalData成员函数来请求获得数据。
如果你通过一个CFile对象提供数据，可使用该函数，否则调用DelayRenderData 成员函数。有关MFC处理的延迟提供的信息，请参阅 《Visual C++ 程序员指南》中的“数据对象和数据源：操纵”。
使用立即提供方式，可调用CacheData或CacheGlobalData成员函数。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的FORMATETC结构。
要了解更多的信息，请参阅Win32文档中的RegisterClipboardFormat。

请参阅：
COleDataSource::CacheData, COleDataSource::CacheGlobalData, COleDataSource::DelayRenderData, COleDataSource::OnRenderFileData


 COleDataSource::DelaySetData

void DelaySetData( CLIPFORMAT cfFormat, LPFORMATETC lpFormatEtc = NULL ) const;

参数：
cfFormat | 数据的返回格式。该参数可以是预定义剪贴板格式的一种或WindowsRegisterClipboardFormat函数的返回值。
lpFormatEtc | 一个FORMATETC结构的指针，该结构说明数据的返回格式。如果你要在用cfFormat指定的剪贴板格式外指定另外的格式，给该参数提供一个值。如果该值为NULL，将使用FORMATETC结构的缺省值。

说明：
调用该函数支持改变数据资源的内容。此时，框架将调用OnSetData。它仅在框架从COleServerItem::GetDataSource返回数据时使用。如果没有调用DelaySetData，OnSetData 函数永远都不会被调用。对支持的每一种剪贴板FORMATETC格式都必须调用DelaySetData。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的STGMEDIUM和FORMATETC结构。要了解更多的信息，请参阅Win32文档中的RegisterClipboardFormat。

请参阅：
COleServerItem::GetDataSource, COleDataSource::OnSetData


 COleDataSource::DoDragDrop

DROPEFFECT DoDragDrop(
DWORD dwEffects = DROPEFFECT_COPY | DROPEFFECT_MOVE | DROPEFFECT_LINK,
LPCRECT lpRectStartDrag = NULL,
COleDropSource* pDropSource = NULL
);

返回值：
拖放操作产生的结果；否则，如果用户在离开提供的矩形之前释放了鼠标，拖放操作没有发生，则返回DROPEFFECT_NONE 。

参数：
dwEffects该数据资源允许的拖放操作，可以为下列值：
· | DROPEFFECT_COPY | 执行复制操作。
· | DROPEFFECT_MOVE | 执行移动操作。
· | DROPEFFECT_LINK | 建立从拖放数据到源数据的链接。
· | DROPEFFECT_SCROLL | 指示发生拖滚操作。
lpRectStartDrag | 定义拖放操作的起始矩形的指针。有关信息，请参见说明。
pDropSource | 目的资源的指针。如果为NULL，使用COleDropSource的缺省实现。

说明：
调用DoDragDrop成员函数执行该数据资源的拖放操作，经常在CWnd::OnLButtonDown处理函数中调用。
拖放操作不立即开始。直到鼠标离开lpRectStartDrag指定的矩形后或过了一段指定的时间后才开始。如果lpRectStartDrag为NULL，矩形的尺寸为一个像素。延时由WIN.INI的[Windows]一节中的DragDelay值定义，缺省值为200毫秒。拖放延时如下存储：
· | Windows NT的拖放延时存放在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\NT\CurrentVersion\IniFileMapping\win.ini\Windows\DragDelay中。
· | Windows 3.X的拖放延时存放在WIN.INI文件中，{Windows}节下。
· | Windows 95的拖放延时存放在WIN.INI的缓存版本中。
要了解更多有关延时如何存放在入口或.INI文件方面的信息，可参阅联机文档“平台SDK”中的::WriteProfileString。
要了解更多的信息，请参阅联机文档《Visual C++ 程序员指南》中的“拖放：实现放操作源”。

请参阅：
COleDropSource::OnBeginDrag, COleDropSource


 COleDataSource::Empty

void Empty( );

说明：
调用该函数清空COleDataSource对象的数据，以便重用。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的ReleaseStgMedium。


 COleDataSource::FlushClipboard

static void FlushClipboard( );

说明：
删除所有通过调用SetClipboard放置在剪贴板中的所有数据。该函数导致一些仍在剪贴板中的数据立即提供。当有必要从内存删除上次放置在剪贴板中的数据对象的时候，调用该函数。调用该函数确保OLE不再需要从原来的数据资源中执行剪贴板操作。

请参阅：
COleDataSource::GetClipboardOwner, COleDataSource::SetClipboard


 COleDataSource::GetClipboardOwner

static COleDataSource* GetClipboardOwner( );

返回值：
当前在剪贴板中的数据资源；如果剪贴板中无任何内容或剪贴板不属于该调用应用，则返回NULL。

说明：
判定在上次调用SetClipboard后剪贴板中的数据是否改变，若改变了，判断当前的所有者。

请参阅：
COleDataSource::FlushClipboard, COleDataSource::SetClipboard


 COleDataSource::OnRenderData

virtual BOOL OnRenderData( LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium );

返回值：如果成功，则返回非零值；否则为0。

参数：
lpFormatEtc | 一个FORMATETC结构的指针，该结构指定所要求信息的格式。
lpStgMedium | 一个STGMEDIUM结构指针，该结构返回数据。

说明：
框架调用以使用指定格式存取数据。指定格式是使用DelayRenderData或 DelayRenderFileData成员函数预先放置在COleDataSource 对象中的一种。如果供应存储介质是文件或内存的话，该函数的缺省实现将相应地调用OnRender-FileData或OnRenderGlobalData。如果不是，则返回0，不做任何事情。 有关MFC处理的延迟提供的信息，请参阅《VisualC++程序员指南》中的“数据对象和数据源：操纵”。
如果lpStgMedium->tymed是TYMED_NULL，必须分配STGMEDIUM并按lpFormatEtc->tymed指定的填充。如果不是TYMED_NULL,STGMEDIUM和数据将适当填充。
这是一个高级可覆盖函数。覆盖该函数以支持特定格式和介质的数据。根据数据的不同，你可能需要覆盖该函数的不同版本。如果数据很小，且大小固定，可覆盖OnRenderGlobalData。如果数据在文件中，大小不定，可覆盖OnRenderFileData。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的STGMEDIUM和FORMATETC结构，TYMED枚举类型和IdataObject::GetData。

请参阅：
COleDataSource::DelayRenderData, COleDataSource::DelayRenderFileData, COleDataSource::OnRenderFileData, COleDataSource::OnRenderGlobalData, COleDataSource::OnSetData


 COleDataSource::OnRenderFileData

virtual BOOL OnRenderFileData( LPFORMATETC lpFormatEtc, CFile* pFile );

返回值：如果成功，则返回非零值；否则为0。

参数：
lpFormatEtc | 一个FORMATETC结构的指针，该结构指定所要求信息的格式。
pFile | 提供数据的CFile对象指针。

说明：
当指定的存储介质是一个文件时，框架调用指定的格式存取数据。指定格式是使用DelayRenderData成员函数预先放置在COleDataSource 对象中的一种。该函数的缺省实现仅简单地返回FALSE。
这是一个高级可覆盖函数。覆盖该函数以支持特定格式和介质的数据。
根据数据的不同，你可能需要覆盖该函数的不同版本。如果要处理多种存储介质，可覆盖OnRenderData。如果数据在文件中，大小不定，可覆盖OnRenderFileData。 有关MFC处理的延迟提供的信息，请参阅《Visual C++ 程序员指南》中的“数据对象和数据源：操纵”。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的FORMATETC结构和IdataObject::GetData。

请参阅：
COleDataSource::DelayRenderData, COleDataSource::DelayRenderFileData, COleDataSource::OnRenderData, COleDataSource::OnRenderGlobalData, COleDataSource::OnSetData, CFile


 COleDataSource::OnRenderGlobalData

virtual BOOL OnRenderGlobalData( LPFORMATETC lpFormatEtc, HGLOBAL* phGlobal );

返回值：如果成功，则返回非零值；否则为0。

参数：
lpFormatEtc | 一个FORMATETC结构的指针，该结构指定所要求信息的格式。
phGlobal | 一个全局内存块的指针，该内存块中包含有指定格式的数据。如果没有分配内存块，该参数为NULL。

说明：
当指定的存储介质是全局内存时，框架调用指定的格式存取数据。指定格式是使用DelayRenderData成员函数预先放置在COleDataSource 对象中的一种。该函数的缺省实现仅简单地返回FALSE。
如果phGlobal为NULL，那么需要分配一个新的HGLOBAL并用phGlobal返回。否则，phGlobal 指定的HGLOBAL必须填充数据。放置在HGLOBAL的数据必须不超过内存块的大小，块不能重新分配更大的尺寸。
这是一个高级可覆盖函数。覆盖该函数以支持特定格式和介质的数据。根据数据的不同，你可能需要覆盖该函数的不同版本。如果要处理多种存储介质，可覆盖OnRenderData。如果数据在文件中，大小不定，可覆盖OnRenderFileData。 有关MFC处理的延迟提供的信息，请参阅《Visual C++ 程序员指南》中的“数据对象和数据源：操纵”。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的FORMATETC结构和IdataObject::GetData。

请参阅：
COleDataSource::DelayRenderData, COleDataSource::DelayRenderFileData, COleDataSource::OnRenderData, COleDataSource::OnRenderFileData, COleDataSource::OnSetData


 COleDataSource::OnSetData

virtual BOOL OnSetData( LPFORMATETC lpFormatEtc, LPSTGMEDIUM lpStgMedium, BOOL bRelease );

返回值：如果成功，则返回非零值；否则为0。

参数：
lpFormatEtc | 一个FORMATETC结构的指针，该结构指定数据被替换的格式。
lpStgMedium | 一个STGMEDIUM结构的指针，该结构包含着将要替换COleDataSource对象中的当前内容的数据。
bRelease | 指示在函数调用结束后谁拥有存储介质的所有权。调用者可以通过设置bRelease值来决定由谁负责将代表存储介质分配的资源释放掉。如果bRelease为非零值，数据资源拥有所有权，它将在使用完以后释放介质。如果bRelease为0，调用者保留所有权，数据资源只能在该调用期间使用介质。

说明：
框架调用指定格式设置或替代COleDataSource对象的数据。只有当数据资源成功获取到它的时候才会拥有它。也就是说，如果OnSetData返回0，它不拥有所有权。如果数据资源拥有了所有权，它通过调用ReleaseStgMedium函数释放存储介质。
该函数的缺省执行不做任何事情。覆盖该函数以用指定格式替代数据。
这是一个高级可覆盖函数。
要了解更多的信息，请参阅“OLE 2程序员参考（卷1）”中的STGMEDIUM和FORMATETC结构和ReleaseStgMedium和IdataObject::GetData函数。

请参阅：
COleDataSource::DelaySetData, COleDataSource::OnRenderData, COleDataSource::OnRenderFileData, COleDataSource::OnRenderGlobalData, COleServerItem::OnSetData


 COleDataSource::SetClipboard

void SetClipboard( );

说明：
在调用下列函数后，将包含在COleDataSource对象中的数据放到剪贴板中。这些函数是：CacheData, CacheGlobalData, DelayRenderData或DelayRenderFileData。

请参阅：
COleDataSource::GetClipboardOwner, COleDataSource::FlushClipboard


 COleDateTime

COleDateTime没有基类。
COleDateTime类封装了在OLE自动中使用的DATE数据类型。它是OLE自动的VARIANT数据类型的一种可能类型。一个COleDateTime值代表一个绝对的日期和时间值。
DATE类型实现为一个浮点值，从1899年12月30日午夜起计算“日”。所以1899年12月31日午夜用数1.0来代表。相似的，1900年1月1日下午6时用数2.25来代表，1899年12月29日午夜是-1.0。而1899年12月29日下午6 时用数-0.25来代表。
注意：解释时间各部分的值时，要取数据的相应部分的绝对值。
COleDateTime类处理了从100年1月1日到9999年12月31日的日期。
注意：
COleDateTime忽略了夏时制。可参阅联机文档《Visual C++程序员指南》中的“日期和时间：自动支持”，以了解详细情况。该类型也可用于仅仅代表日期或时间的值。按通常约定，日期0(1899年12月30日)用于仅代表时间的值，相似地，时间0:00(午夜)用于仅代表日期的值。
如果创建一个日期小于100的COleDateTime对象,则此日期可被接受,但以后调用GetYear,GetMonth,GetDay,GetHour,GetMinute和GetSecond将失败，并返回-1。以前可用两位表示日期，但在MFC 4.2及以后的版本中，日期必须大于100。
要避免出现问题，可指定4位表示日期，例如：
COleDataTime.mytime(1996,1,1,0,0,0);
COleDateTime值的算术运算使用互补类COleDateTimeSpan。COleDateTimeSpan值代表相对时间，一个区间。它们之间的关系类似于CTime和CTimeSpan之间的关系。
有关COleDateTime和COleDateTimeSpan类的信息，请参阅联机文档《Visual C++程序员指南》中的“日期和时间：自动支持”。
#include <afxdisp.h>
请参阅：COleVariant

COleDateTime类的成员

构造函数
COleDateTime | 构造一个COleDateTime对象
GetCurrentTime | 创建一个代表当前时间的COleDateTime对象（静态成员函数）

属性
GetStatus | 获取该COleDateTime对象的状态（有效性）
SetStatus | 设置该COleDateTime对象的状态（有效性）
GetAsSystemTime | 转换COleDateTime对象的时间用一个SYSTEMTIME数据结构表示
GetYear | 返回该COleDateTime对象代表的年
GetMonth | 返回该COleDateTime对象代表的月（1-12）
GetDay | 返回该COleDateTime对象代表的日（1-31）
GetHour | 返回该COleDateTime对象代表的时（0-23）
GetMinute | 返回该COleDateTime对象代表的分（0-59）
GetSecond | 返回该COleDateTime对象代表的秒（0-59）
GetDayOfWeek | 返回该COleDateTime对象代表的该天是星期几（星期日=1）
GetDayOfYear | 返回该COleDateTime对象代表的该天是年内第几天（1月1日=1）

操作
SetDateTime | 设置该COleDateTime对象值为指定的日期/时间值
SetDate | 设置该COleDateTime对象值为指定的日期值
SetTime | 设置该COleDateTime对象值为指定的时间值
Format | 生成一个代表一COleDateTime对象的格式化字符串
ParseDateTime | 从一个字符串读取一个日期/时间值并设置为COleDateTime的值

操作符
operator DATE | 将一个COleDateTime值转换为一个DATE
operator DATE* | 将一个COleDateTime值转换为一个DATE*
operator = | 复制一个COleDateTime值
operator +, - | 加减COleDateTime值
operator +=, -= | 从该COleDateTime对象中加上或减去一个COleDateTime值
关系操作符 | 比较两个COleDateTime值

数据成员
m_dt | 包含该COleDateTime对象对应的DATE
m_status | 包含该COleDateTime对象的状态

归档/存储
operator << | 从CArchive或CDumpContext输出COleDateTime值
operator >> | 从CArchive输入一个COleDateTime值


 COleDateTime::COleDateTime

COleDateTime( );
COleDateTime( const COleDateTime& dateSrc );
COleDateTime( const VARIANT& varSrc );
COleDateTime( DATE dtSrc );
COleDateTime( time_t timeSrc );
COleDateTime( const SYSTEMTIME& systimeSrc );
COleDateTime( const FILETIME& filetimeSrc );
COleDateTime( int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec );
COleDateTime( WORD wDosDate, WORD wDosTime );

参数：
dateSrc | 一个复制到新的COleDateTime 对象的已存在的COleDateTime 对象。
varSrc | 一个已存在的VARIANT数据结构(可能是一个COleVariant对象)。它将被转换成一个时间/日期值（VT_DATE）并设置为新的COleDateTime对象的值。
dtSrc | 复制到新的COleDateTime对象的日期/时间值(DATE)。
timeSrc | 一个time_t值。它将被转换成一个时间/日期值（VT_DATE）并设置为新的 COleDateTime对象的值。
systimeSrc | 一个SYSTEMTIME结构。它将被转换成一个时间/日期值（VT_DATE）并设置为新的COleDateTime对象的值。
filetimeSrc | 一个FILETIME值。它将被转换成一个时间/日期值（VT_DATE）并设置为新的 COleDateTime对象的值。
nYear, nMonth, nDay, nHour, nMin, nSec | 指示复制到新的COleDateTime对象的日期和时间值。
wDosDate, wDosTime | 一个MS-DOS日期和时间值。它将被转换成一个时间/日期值（VT_DATE）并设置为新的 COleDateTime对象的值。

说明：
所有这些构造函数都创建一个新COleDateTime对象并将它初始化为指定值。下表给出日期和时间各组成部分的有效区间：
日期/时间组成部分 | 有效区间
年 | 100-9999
月 | 0-12
日 | 0-31
时 | 0-23
分 | 0-59
秒 | 0-59
注意“日”的上限的确切值取决于年和月。有关细节请参阅SetDate或SetDateTime成员函数。
下面是每个构造函数的简要描述：
· | COleDateTime( ) | 构造一个COleDateTime对象，初始化为0 (1899年12月30 日午夜)。
· | COleDateTime( dateSrc ) | 从一个存在的COleDateTime 创建一个COle-DateTime 对象。
· | COleDateTime( varSrc ) | 创建一个COleDateTime 对象。先要将一个VARIANT结构或COleVariant对象转换成日期/时间(VT_DATE)值。如果转换成功，将转换值复制到新的COleDateTime对象中，否则，新的COleDateTime对象的值设置为0（1899年1月30日）并将状态设置为无效。
· | COleDateTime( dtSrc ) | 从一个DATE值构造一个COleDateTime 对象。
· | COleDateTime( timeSrc ) | 从一个time_t值构造一个COleDateTime 对象。
· | COleDateTime(systimeSrc) | 从一个SYSTEMTIME结构构造一个COleDate-Time 对象。
· | COleDateTime( filetimeSrc ) | 从一个FILETIME值构造一个COleDateTime 对象。
· | COleDateTime( nYear, nMonth, nDay, nHour, nMin, nSec ) | 从指定的数值构造一个COleDateTime对象。
· | COleDateTime( wDosDate, wDosTime ) | 从指定的MS-DOS日期和时间值构造COleDateTime对象。
要了解更多的信息，请参阅联机文档“Win32 SDK OLE程序员参考”中的VARIANT。
要了解更多的信息，请参阅“Microsoft Visual C++运行库参考”中的time_t数据类型。要了解更多的信息，请参阅Win32 SDK OLE文档中的SYSTEMTIME和FILETIME结构。
有关MS-DOS日期和时间值的信息，请参阅Win32 SDK OLE文档中的DosDateTimeToVariantTime。
有关COleDateTime值的边界问题，请参阅联机文档《Visual C++程序员指南》中的“日期和时间：自动支持”。

请参阅：
COleDateTime::SetDate, COleDateTime::SetDateTime, COleDateTime::SetTime, COleDateTime::GetStatus, COleDateTime::operator =, COleDateTime::m_dt, COleDateTime::m_status


 COleDateTime::Format

CString Format( DWORD dwFlags = 0, LCID lcid = LANG_USER_DEFAULT );
CString Format( LPCTSTR lpszFormat ) const;
CString Format( UINT nFormatID ) const;

返回值：包含格式化日期/时间值的CString。

参数：
dwFlags本地设置的指示标志。可能是下列值：
· | LOCALE_NOUSEROVERRIDE | 使用系统缺省的本地设置，而不用用户自定义的本地设置。
· | VAR_TIMEVALUEONLY | 分解时忽略日期。
· | VAR_DATEVALUEONLY | 分解时忽略时间。

lcid 指示用于转换的本地ID。
lpszFormat和printf格式化字符串相似的格式化字符串。格式化代码（用百分号%打头）将被相应的COleDateTime组成部分代替。在格式化字符串中的其它字符将复制到返回的字符串中。具体细节请参阅运行函数strftime。格式化代码的值和意义如下：
· | %H | 当前“日”的“时”。
· | %M | 当前“时”的“分”。
· | %S | 当前“分”的“秒”。
· | %% | 百分号符。

nFormatID 格式控制字符串的资源ID。

说明：
调用该函数串创建一个代表日期/时间值的格式化表示。如果COleDateTime对象状态为空，则返回一个空字符串。如果状态为无效，则返回字符串为资源IDS_INVALID_DATETIME代表的字符串。
下面是该函数的三种形式的简要描述：
Format( dwFlags, lcid );
该形式将使用母语格式(本地ID)来格式化日期/时间值。使用缺省参数时，如果日期/时间值的日期部分值为0（1998年12 月30日），该形式仅打印时间；相似地，如果日期/时间值的时间部分值为0（午夜），该形式仅打印日期。如果日期/时间值的为0（1998年12 月30日午夜），该形式将打印“midnight”。
Format( lpszFormat );
该形式使用格式化字符串的特定格式化代码（以百分号%打头）来格式化。格式化字符串作为一个参数传递到函数中。有关格式化代码的信息，请参阅 “Microsoft Visual C++ 运行库参考”中的strftime, wcsftime。
Format( nFormatID );
该形式使用格式化字符串的特定格式化代码（以百分号%打头）来格式化。格式化字符串是一个资源，该字符串资源的ID作为一个参数传递到函数中。有关格式化代码的信息，请参阅 “Microsoft Visual C++运行库参考”中的strftime, wcsftime。
有关本地ID值的列表，请参阅联机文档“Win32 SDK OLE程序员参考”中的“支持多国语言”。

请参阅：
COleDateTime::ParseDateTime, COleDateTime::GetStatus


 COleDataTime::GetAsSystemTime

BOOL GetAsSystemTime(SYSTEMTIME& sysTime) const;

返回值：
如果成功，则返回TRUE；若转换失败或COleDateTime对象为NULL或无效，则返回FALSE。

参数：
sysTime 一个SYSTEMTIME结构的参考。该结构将被转换成一个日期/时间值并复制到新的COleDateTime对象中。

说明：
调用该函数转换COleDateTime对象的时间用一个SYSTEMTIME数据结构表示。GetAsSystemTime将结果时间存放在sysTime对象中。该函数初始化的SYSTEMTIME数据结构，其wMilliseconds成员设置为零。
有关COleDateTime对象所处状态的信息，请参阅GetStatus。


 COleDateTime::GetCurrentTime

static COleDateTime PASCAL GetCurrentTime( );

说明：
调用该静态成员函数返回当前日期/时间值。

示例：
COleDateTime dateTest; // dateTest value = midnight 30 December 1899
dateTest = COleDateTime::GetCurrentTime(); // dateTest value = current date and time


 COleDateTime::GetDay

int GetDay( ) const;

返回值：该COleDateTime对象代表的“日”。

说明：
调用该成员函数获取该日期/时间值代表的“日”。
有效的返回值区间为1-31。如果该COleDateTime对象的状态不是有效的，则返回值为AFX_OLE_DATETIME_ERROR。
有关查看该COleDateTime对象值的其它成员函数，请参阅以下成员函数：
· | GetMonth
· | GetYear
· | GetHour
· | GetMinute
· | GetSecond
· | GetDayOfWeek
· | GetDayOfYear

请参阅：
COleDateTime::COleDateTime, COleDateTime::SetDateTime, COleDateTime::operator =, COleDateTime::GetStatus


 COleDateTime::GetDayOfWeek

int GetDayOfWeek( ) const;

返回值：
该COleDateTime对象代表的是星期几。

说明：
调用该成员函数获取该日期/时间值代表的是星期几。
有效的返回值区间为1-7，1是星期日，2是星期一，以此类推。如果该COleDateTime对象的状态不是有效的，则返回值为AFX_OLE_DATETIME_ERROR。
有关查看该COleDateTime对象值的其它成员函数，请参阅以下成员函数：
·GetDay
·GetMonth
·GetYear
·GetHour
·GetMinute
·GetSecond
·GetDayOfYear

请参阅：
COleDateTime::COleDateTime, COleDateTime::SetDateTime, COleDateTime::operator =, COleDateTime::GetStatus


 COleDateTime::GetDayOfYear

int GetDayOfYear( ) const;

返回值：
该COleDateTime对象代表的该天是年内第几天。

说明：
调用该成员函数获取该日期/时间值代表的该天是年内第几天。
有效的返回值区间为1-366，1是1月1日。如果该COleDateTime对象的状态不是有效的，则返回值为AFX_OLE_DATETIME_ERROR。
有关查看该COleDateTime 对象值的其它成员函数，请参阅以下成员函数：
·GetDay
·GetMonth
·GetYear
·GetHour
·GetMinute
·GetSecond
·GetDayOfWeek

请参阅：
COleDateTime::COleDateTime, COleDateTime::SetDateTime, COleDateTime::operator =, COleDateTime::GetStatus


 COleDateTime::GetHour

int GetHour( ) const;

返回值：
该COleDateTime对象值代表的“时”。

说明：
调用该成员函数获取该日期/时间值代表的“时”。
有效的返回值区间为0-23。如果该COleDateTime对象的状态不是有效的，则返回值为AFX_OLE_DATETIME_ERROR。
有关查看该COleDateTime对象值的其它成员函数，请参阅以下成员函数：
·GetDay
·GetMonth
·GetYear
·GetMinute
·GetSecond
·GetDayOfWeek
·GetDayOfYear

请参阅：
COleDateTime::COleDateTime, COleDateTime::SetDateTime, COleDateTime::operator =, COleDateTime::GetStatus


 COleDateTime::GetMinute

int GetMinute( ) const;

返回值：
该COleDateTime对象值代表的“分”。

说明：
调用该成员函数获取该日期/时间值代表的“分”。
有效的返回值区间为0-59。如果该COleDateTime对象的状态不是有效的，则返回值为AFX_OLE_DATETIME_ERROR。有关查看该COleDateTime对象值的其它成员函数，请参阅以下成员函数：
·GetDay
·GetMonth
·GetYear
·GetHour
·GetSecond
·GetDayOfWeek
·GetDayOfYear

请参阅：
COleDateTime::COleDateTime, COleDateTime::SetDateTime, COleDateTime::operator =, COleDateTime::GetStatus


 COleDateTime::GetMonth

int GetMonth( ) const;

返回值：该COleDateTime对象值代表的“月”。

说明：
调用该成员函数获取该日期/时间值代表的“月”。
有效的返回值区间为1-12。如果该COleDateTime对象的状态不是有效的，则返回值为AFX_OLE_DATETIME_ERROR。有关查看该COleDateTime对象值的其它成员函数，请参阅以下成员函数：
·GetDay
·GetYear
·GetHour
·GetMinute
·GetSecond
·GetDayOfWeek
·GetDayOfYear

请参阅：
COleDateTime::COleDateTime, COleDateTime::SetDateTime, COleDateTime::operator =, COleDateTime::GetStatus


 COleDateTime::GetSecond

int GetSecond( ) const;

返回值：
该COleDateTime对象值代表的“秒”。

说明：
调用该成员函数获取该日期/时间值代表的“秒”。
有效的返回值区间为0-59。如果该COleDateTime对象的状态不是有效的，则返回值为AFX_OLE_DATETIME_ERROR。
注意：COleDateTime类不支持闰秒。
有关COleDateTime实现的信息，请参阅联机文档“Visual C++程序员指南”中的“日期和时间：自动支持”。
有关查看该COleDateTime对象值的其它成员函数，请参阅以下成员函数：
·GetDay
·GetMonth
·GetYear
·GetHour
·GetMinute
·GetDayOfWeek
·GetDayOfYear

请参阅：
COleDateTime::COleDateTime, COleDateTime::SetDateTime, COleDateTime::operator =, COleDateTime::GetStatus


 COleDateTime::GetStatus

DateTimeStatus GetStatus( ) const;

返回值：返回该COleDateTime值的状态。

说明：
调用该函数获取一个给定的COleDateTime对象的状态（有效性）。
返回值定义在由COleDateTime类定义的DateTimeStatus枚举类型中。
enum DateTimeStatus
{
valid = 0,
invalid = 1,
null = 2
};
这些状态值的简要描述见下列列表：
· | COleDateTime::valid | 指示该COleDateTime对象有效。
· | COleDateTime::invalid | 指示该COleDateTime对象无效，也就是说，它的值可能不正确。
· | COleDateTime::null | 指示该COleDateTime对象为空，也就是说，没有为该对象填充值(这里，“空”是数据库中“没有值”的意思，而不是C++中NULL值)。
在以下情况下，一个COleDateTime对象的状态为无效：
· | 如果它的值从一个VARIANT或COleVariant值设定，但它们无法转换成日期/时间值。
· | 如果它的值从一个time_t, SYSTEMTIME或FILETIME值设定，但它们无法转换成日期/时间值。
· | 如果它的值由SetDateTime带无效参数值设定。
· | 如果该对象在进行如+=或-=的算术运算时上溢或下溢。
· | 如果给该对象指派了一个无效值。
· | 如果使用SetStatus显式地设置该对象状态为无效。
有关可能设置状态为无效的操作的信息，请参阅下面的成员函数：
·COleDateTime
·SetDateTime
·operator +, -
·operator +=, -=
有关COleDateTime值的边界问题，请参阅联机文档《Visual C++程序员指南》中的“日期和时间：自动支持”。

请参阅：
COleDateTime::SetStatus, COleDateTime::m_status


 COleDateTime::GetYear

int GetYear( ) const;

返回值：该COleDateTime对象值代表的“年”。

说明：
调用该成员函数获取该日期/时间值代表的“年”。
有效的返回值区间为100-9999。如果该COleDateTime对象的状态不是有效的，则返回值为AFX_OLE_DATETIME_ERROR。
有关查看该COleDateTime对象值的其它成员函数，请参阅以下成员函数：
·GetDay
·GetMonth
·GetHour
·GetMinute
·GetSecond
·GetDayOfWeek
·GetDayOfYear
有关COleDateTime值的边界问题，请参阅联机文档《Visual C++程序员指南》中的“日期和时间：自动支持”。

请参阅：
COleDateTime::COleDateTime, COleDateTime::SetDateTime, COleDateTime::operator =, COleDateTime::GetStatus


 COleDateTime::ParseDateTime

BOOL ParseDateTime( LPCTSTR lpszDate, DWORD dwFlags = 0, LCID lcid = LANG_USER_DEFAULT );
throw( CMemoryException );
throw( COleException );

返回值：
如果字符串成功转换为日期/时间值，则返回非零值；否则为0。

参数：
lpszDate | 指向要分解的字符串的指针。详情请参阅说明。
dwFlags本地设置的指示标志。可能是下列值：
· | LOCALE_NOUSEROVERRIDE | 使用系统缺省的本地设置，而不用用户自定义的本地设置。
· | VAR_TIMEVALUEONLY | 分解时忽略日期。
· | VAR_DATEVALUEONLY | 分解时忽略时间。
lcid | 指示用于转换的本地ID。

说明：
调用该函数串解析一个字符串，读取成一个日期/时间值。如果字符串成功转换为一个日期/时间值，COleDateTime对象的值就设置为该值，状态设置为有效。
注意：“年”值必须在100和9999之间。
lpszDate参数可以带一个格式变量。例如，下列字符串包含可接受的日期/时间格式：
"25 January 1996"
"8:30:00"
"20:30:00"
"January 25, 1996 8:30:00"
"8:30:00 Jan. 25, 1996"
"1/25/1996 8:30:00" // always specify the full year even in a 'short date' format
注意本地ID同时影响到一个字符串是否可以转换成日期/时间值。
在VAR_DATEVALUEONLY情况下，时间值设置为时间0或午夜。在VAR_TIMEVALUEONLY情况下，日期值设置为日期0或1899年12月30日。
如果字符串不能转换成一个日期/时间值，或出现了运算溢出，该COleDateTime对象的状态设置为无效。
如果因为内存分配出错而使字符串转换失败，该函数引发CMemoryException。出现错误时，该函数引发COleException。
有关locale ID值的列表，请参阅联机文档“Win32 SDK OLE程序员参考”中的“支持多国语言”。
有关COleDateTime值的边界和实现，请参阅联机文档《Visual C++程序员指南》中的“日期和时间：自动支持”。

请参阅：
COleDateTime::Format, COleDateTime::GetStatus


 COleDateTime::SetDate

int SetDate( int nYear, int nMonth, int nDay );

返回值：
如果成功设置该COleDateTime对象的值，则返回0；否则返回1。该返回值基于DateTimeStatus枚举类型。要了解更多的信息，请参阅SetStatus成员函数。

参数：
nYear, nMonth, nDay 指示复制到该COleDateTime对象的日期部分。

说明：
调用该函数设置该COleDateTime对象的日期和时间。日期被设置为指定的值。时间设置为时间0，午夜。
请参阅下面关于参数值有效边界的表：
参数 | 边界
nYear | 100-9999
nMonth | 1-12
nDay | 1-31
nDay值的确切上限随“年”和“月”的不同而不同。 月份为1, 3, 5, 7, 8,10和12时， nDay值的确切上限为31；月份为4, 6, 9和11时，则为30；月份为2, 它为28或29（闰年）。
如果参数指定的值不是有效的，该对象的状态设置为无效而对象的值不变。
下面是日期值的一些例子：
nYear | nMonth | nDay | 值
1995 | 4 | 15 | 1995年4月15日
1789 | 7 | 14 | 1789年7月17日
1925 | 2 | 30 | 无效
10000 | 1 | 1 | 无效
同时设置日期和时间，请参阅COleDateTime::SetDateTime。
有关查看该COleDateTime对象值的其它成员函数，请参阅以下成员函数：
·GetDay
·GetMonth
·GetYear
·GetHour
·GetMinute
·GetSecond
·GetDayOfWeek
·GetDayOfYear
有关COleDateTime值的边界问题，请参阅联机文档《Visual C++程序员指南》中的“日期和时间：自动支持”。

请参阅：
COleDateTime::COleDateTime, COleDateTime::SetDateTime, COleDateTime::operator =, COleDateTime::GetStatus, COleDateTime::m_dt


 COleDateTime::SetDateTime

int SetDateTime( int nYear, int nMonth, int nDay, int nHour, int nMin, intnSec );

返回值：
如果成功设置该COleDateTime对象的值，则返回0；否则返回1。该返回值基于DateTimeStatus枚举类型。要了解更多的信息，请参阅SetStatus成员函数。

参数：
nYear, nMonth, nDay, nHour, nMin, nSec 指示复制到该COleDateTime对象的日期和时间部分。

说明：
调用该函数设置该COleDateTime对象的日期和时间。
请参阅下面关于参数值有效边界的表：
参数 | 边界
nYear | 100-9999
nMonth | 1-12
nDay | 1-31
nHour | 0-23
nMin | 0-59
nSec | 0-59
nDay值的确切上限随“年”和“月”的不同而不同。月份为1, 3, 5, 7, 8,10和12时， nDay值的确切上限为31；月份为4, 6, 9和11时，则为30；月份为2，它为28或29（闰年）。
如果参数指定的值不是有效的，该对象的状态设置为无效而对象的值不变。
下面是时间值的一些例子：
nHour | nMin | nSec | 值
1 | 3 | 3 | 01:03:03
23 | 45 | 0 | 23:45:00
25 | 30 | 0 | 无效
9 | 60 | 0 | 无效
下面是日期值的一些例子：
nYear | nMonth | nDay | 值
1995 | 4 | 15 | 1995年4月15日
1789 | 7 | 14 | 1789年7月17日
1925 | 2 | 30 | 无效
10000 | 1 | 1 | 无效
仅设置日期，请参阅COleDateTime::SetDate；仅设置时间，请参阅COleDateTime:: SetTime。
有关查看该COleDateTime对象值的其它成员函数，请参阅以下成员函数：
·GetDay
·GetMonth
·GetYear
·GetHour
·GetMinute
·GetSecond
·GetDayOfWeek
·GetDayOfYear
有关COleDateTime值的边界问题，请参阅联机文档《Visual C++程序员指南》中的“日期和时间：自动支持”。

请参阅：
COleDateTime::COleDateTime, COleDateTime::SetDate, COleDateTime::SetTime, COleDateTime::operator =, COleDateTime::GetStatus, COleDateTime::m_dt


 COleDateTime::SetStatus

void SetStatus( DateTimeStatus nStatus );

参数：
nStatus 该COleDateTime对象的新状态值。

说明：
调用该成员函数设置COleDateTime对象的状态。nStatus参数值由在COleDateTime 类中定义的DateTimeStatus枚举类型定义。
enum DateTimeStatus
{
valid = 0,
invalid = 1,
null = 2
};
这些状态值的简要描述如下：
· | COleDateTime::valid | 指示该COleDateTime对象有效。
· | COleDateTime::invalid | 指示该COleDateTime对象无效，也就是说，它的值可能不正确。
· | COleDateTime::null | 指示该COleDateTime对象为空，也就是说，没有为该对象填充值 (这里，“空”是数据库中“没有值”的意思，而不是C++中NULL值)。
警告：
该函数仅在高级编程时使用。该函数不改变对象值。它经常被用于设置对象的状态为空或无效。注意赋值操作(operator =)和SetDateTime将根据源数据的值设置对象的状态。

请参阅：
COleDateTime::GetStatus, COleDateTime::operator =, COleDateTime::SetDateTime, COleDateTime::m_dt


 COleDateTime::SetTime

int SetTime( int nHour, int nMin, int nSec );

返回值：
如果成功设置该COleDateTime对象的值，则返回0；否则返回1。该返回值基于DateTimeStatus枚举类型。要了解更多的信息，请参阅SetStatus成员函数。

参数：
nHour, nMin, nSec 指示复制到该COleDateTime对象的时间部分。

说明：
调用该函数设置该COleDateTime对象的日期和时间。时间值设置为指定值，日期值设置为日期0，即1899年12 月30日。请参阅下面关于参数值有效边界的表：
参数 | 边界
nHour | 0-23
nMin | 0-59
nSec | 0-59
如果参数指定的值不是有效的，该对象的状态设置为无效而对象的值不变。
下面是时间值的一些例子：
nHour | nMin | nSec | 值
1 | 3 | 3 | 01:03:03
23 | 45 | 0 | 23:45:00
25 | 30 | 0 | 无效
9 | 60 | 0 | 无效
同时设置日期和时间，请参阅COleDateTime::SetDateTime。
有关查看该COleDateTime对象值的其它成员函数，请参阅以下成员函数：
·GetDay
·GetMonth
·GetYear
·GetHour
·GetMinute
·GetSecond
·GetDayOfWeek
·GetDayOfYear
有关COleDateTime值的边界问题，请参阅联机文档《Visual C++程序员指南》中的“日期和时间：自动支持”。

请参阅：
COleDateTime::COleDateTime, COleDateTime::SetDateTime, COleDateTime::operator =, COleDateTime::GetStatus, COleDateTime::m_dt


 COleDateTime::m_dt

说明：
该COleDateTime对象对应的DATE结构。
警告：
用该函数返回的指针改变DATE对象的值，将相应地改变该COleDateTime对象的值。但不会改变该COleDateTime对象的状态。
有关DATE对象的实现问题，请参阅联机文档《Visual C++程序员指南》中的“日期和时间：自动支持”。

请参阅：
COleDateTime::COleDateTime, COleDateTime::SetDateTime, COleDateTime::SetDate, COleDateTime::SetTime, COleDateTime::operator DATE


 COleDateTime::m_status

说明：
该数据成员的类型是DateTimeStatus枚举类型，它是在COleDateTime类中定义的。
enum DateTimeStatus
{
valid = 0,
invalid = 1,
null = 2
};
这些状态值的简要描述见下列列表：
· | COleDateTime::valid | 指示该COleDateTime对象有效。
· | COleDateTime::invalid | 指示该COleDateTime对象无效，也就是说，它的值可能不正确。
· | COleDateTime::null | 指示该COleDateTime对象为空，也就是说，没有为该对象填充值(这里，“空”是数据库中“没有值”的意思，而不是C++中NULL值)。
在以下情况下，一个COleDateTime对象的状态为无效：
· | 如果它的值从一个VARIANT或COleVariant值设定，但它们无法转换成日期/时间值。
· | 如果它的值从一个time_t, SYSTEMTIME或FILETIME值设定，但它们无法转换成日期/时间值。
· | 如果它的值由SetDateTime带无效参数值设定。
· | 如果该对象在进行如+=或-=的算术运算时上溢或下溢
· | 如果给该对象指派了一个无效值。
· | 如果使用SetStatus显式地设置该对象状态为无效。
有关可能设置状态为无效的操作的信息，请参阅下面的成员函数：
·COleDateTime
·SetDateTime
·operator +, -
·operator +=, -=
警告：
该数据成员仅在高级编程时使用。如果操作对象的状态，请调用成员函数GetStatus和SetStatus。有关设置该数据成员的注意事项，请参阅SetStatus。
有关COleDateTime值的边界问题，请参阅联机文档“Visual C++程序员指南”中的“日期和时间：自动支持”。

请参阅：
COleDateTime::GetStatus, COleDateTime::SetStatus


 COleDateTime::operator +, -

COleDateTime operator +( const COleDateTimeSpan& dateSpan ) const;
COleDateTime operator -( const COleDateTimeSpan& dateSpan ) const;
COleDateTimeSpan operator -( const COleDateTime& date ) const;

说明：
COleDateTime对象代表的是绝对时间。而COleDateTimeSpan对象表示的是相对时间。前两个操作符是从一个COleDateTime值加上或减去一个COleDateTimeSpan值。第三个操作符是将两个COleDateTime 值相减得到一个COleDateTimeSpan值。
如果有一个操作数为空，结果COleDateTime 值的状态设置为空。
如果结果COleDateTime值落在了可接受值的边界以外，该COleDateTime值的状态也设置为无效。
如果操作数中有一个是无效的，另一个为空，则结果COleDateTime值的状态设置为无效。
有关有效，无效和空状态值的信息，请参阅m_status数据成员。
有关COleDateTime值的边界问题，请参阅联机文档《Visual C++程序员指南》中的“日期和时间：自动支持”。

请参阅：
COleDateTime::operator +=,-=, COleDateTime::GetStatus, COleDateTimeSpan


 COleDateTime::operator +=, -=

const COleDateTime& operator +=( const COleDateTimeSpan dateSpan );
const COleDateTime& operator -=( const COleDateTimeSpan dateSpan );

说明：
这些操作符是从该COleDateTime加上或减去一个COleDateTimeSpan值。
如果有一个操作数为空，结果COleDateTime值的状态设置为空。
如果结果COleDateTime值落在了可接受值的边界以外，该COleDateTime值的状态也设置为无效。
如果操作数中有一个是无效的，另一个为空，则结果COleDateTime值的状态设置为无效。
有关有效、无效和空状态值的信息，请参阅m_status数据成员。
有关COleDateTime值的边界问题，请参阅联机文档《Visual C++程序员指南》中的“日期和时间：自动支持”。

请参阅：
COleDateTime::operator +,-, COleDateTime::GetStatus


 COleDateTime::operator =

const COleDateTime& operator =( const COleDateTime& dateSrc );
const COleDateTime& operator =( const VARIANT& varSrc );
const COleDateTime& operator =( DATE dtSrc );
const COleDateTime& operator =( const time_t& timeSrc );
const COleDateTime& operator =( const SYSTEMTIME& systimeSrc );
const COleDateTime& operator =( const FILETIME& filetimeSrc );

说明：
这些重载的赋值操作将一个日期/时间值赋到该COleDateTime对象中。
下面是对各操作的简要描述：
·operator =( dateSrc ) | 将操作数的值和状态赋到COleDateTime对象。
·operator =( varSrc ) | 如果成功地将VARIANT值(或COleVariant对象)转换成日期/时间(VT_DATE)，将转换值赋到该COleDateTime对象中，并将其状态设置为有效。如果转换不成功，对象值设置为0（1899年12月30 日午夜），并将其状态设置为无效。
·operator =( dtSrc ) | 将DATE值赋到该COleDateTime对象中，并将其状态设置为有效。
·operator =( timeSrc ) | 将time_t值转换后赋到该COleDateTime对象中。如果转换成功，对象的状态设置为有效，如果转换不成功，对象的状态设置为无效。
·operator =( systimeSrc ) | 将SYSTEMTIME值转换后赋到该COleDateTime对象中。如果转换成功，对象的状态设置为有效，如果转换不成功，对象的状态设置为无效。
·operator =( filetimeSrc ) | 将FILETIME值转换后赋到该COleDateTime对象中。如果转换成功，对象的状态设置为有效，如果转换不成功，对象的状态设置为无效。
要了解更多的信息，请参阅联机文档“Win32 SDK OLE程序员参考”中的VARIANT。
有关time_t数据类型的信息，请参阅“Microsoft Visual C++运行库参考”中的时间函数。
要了解更多的信息，请参阅Win32 SDK OLE文档中的SYSTEMTIME和FILETIME结构。
有关COleDateTime值的边界问题，请参阅联机文档《Visual C++程序员指南》中的“日期和时间：自动支持”。

请参阅：
COleDateTime::COleDateTime, COleDateTime::SetDateTime, COleDateTime::GetStatus


 COleDateTime::operator <<, >>

friend CDumpContext& AFXAPI operator <<( CDumpContext& dc, COleDateTime timeSrc );
friend CArchive& AFXAPI operator <<( CArchive& ar, COleDateTime& dateSrc );
friend CArchive& AFXAPI operator >>( CArchive& ar, COleDateTime& dateSrc );

说明：
COleDateTime插入(<<)操作符支持诊断转储和存档。抽取(>>) 操作符支持从档案文件加载。

请参阅：CDumpContext, CArchive


 COleDateTime::operator DATE

operator DATE( ) const;

说明：
该操作符返回一个DATE对象，该对象的值是从该COleDateTime对象复制得到的。
有关DATE对象的实现问题，请参阅联机文档《Visual C++程序员指南》中的“日期和时间：自动支持”。

请参阅：COleDateTime::m_dt


 COleDateTime::关系操作符

BOOL operator ==( const COleDateTime& date ) const;
BOOL operator !=( const COleDateTime& date ) const;
BOOL operator <( const COleDateTime& date ) const;
BOOL operator >( const COleDateTime& date ) const;
BOOL operator <=( const COleDateTime& date ) const;
BOOL operator >=( const COleDateTime& date ) const;

说明：
这些操作符比较两个日期/时间值，如果条件符合，则返回非零值；否则为0。
注意：
如果操作数的状态为空或无效，排序操作符(<, <=, >, >=)的返回值不确定。等值操作符(==, !=)的返回值根据操作数的状态而定。

示例：
COleDateTime dateOne(95, 3, 15, 12, 0, 0); // 15 March 1995 12 noon
COleDateTime dateTwo(dateOne); // 15 March 1995 12 noon
BOOL b;
b = dateOne == dateTwo; // TRUE

dateTwo.SetStatus(COleDateTime::invalid);
b = dateOne == dateTwo; // FALSE, different status
b = dateOne != dateTwo; // TRUE, different status
b = dateOne < dateTwo; // FALSE, same value
b = dateOne > dateTwo; // FALSE, same value
b = dateOne <= dateTwo; // TRUE, same value
b = dateOne >= dateTwo; // TRUE, same value
注意：上述示例的后四行将在调试模式下发出警告。

请参阅：COleDateTime::GetStatus


 COleDateTimeSpan

COleDateTimeSpan没有基类。
一个COleDateTimeSpan对象表示一个相对的时间，即一个时间段。
COleDateTimeSpan以日为单位来保存时间。
COleDateTimeSpan类常常与类COleDateTime一起使用。COleDateTime封装了OLE自动化中的DATE数据类型。COleDateTime表示绝对的时间值。所有的COleDateTime计算都涉及COleDateTimeSpan值。这两个类之间的关系类似于类CTime和类CTimeSpan之间的关系。
有关类COleDateTime和COleDateTimeSpan的更进一步的信息，可以参考“Visual C++程序员指南”一书中的文章“日期与时间：自动化支持”。
#include <afxdisp.h>

COleDateTimeSpan类成员

构造
COleDateTimeSpan 构造COleDateTimeSpan对象

属性
GetStatus | 获取COleDateTimeSpan对象的状态（有效性）
SetStatus | 设置COleDateTimeSpan对象的状态（有效性）
GetDays | 返回COleDateTimeSpan对象所表示的时间段的日部分
GetHours | 返回COleDateTimeSpan对象所表示的时间段的小时部分
GetMinutes | 返回COleDateTimeSpan对象所表示的时间段的分钟部分
GetSeconds | 返回COleDateTimeSpan对象所表示的时间段的秒部分
GetTotalDays | 返回COleDateTimeSpan对象所表示的天数
GetTotalHours | 返回COleDateTimeSpan对象所表示的小时数

属性
GetTotalMinutes | 返回COleDateTimeSpan对象所表示的分钟数
GetTotalSeconds | 返回COleDateTimeSpan对象所表示的秒数

操作
SetDateTimeSpan | 设置COleDateTimeSpan对象的值
Format | 产生一个COleDateTimeSpan对象的格式化字符串表达式

操作
operator double | 将COleDateTimeSpan的值转换为双精度值
operator = | 拷贝一个COleDateTimeSpan值
operator +,- | 加、减COleDateTimeSpan值，或改变COleDateTimeSpan值的符号
operator +=,-= | 从一个COleDateTimeSpan值中加、减这个COleDateTimeSpan值
关系操作符 | 比较两个COleDateTimeSpan值

数据成员
m_span | 记录这个COleDateTimeSpan对象所代表的基本的双精度值
m_status | 记录COleDateTimeSpan对象的状态

Dump/Archive
operator << | 将COleDateTimeSpan值输出到CArchive或CDumpContext
operator >> | 从CArchive输入一个COleDateTimeSpan对象


 COleDateTimeSpan::COleDateTimeSpan

COleDateTimeSpan();
COleDateTimeSpan( const COleDateTimeSpan& dateSpanSrc );
COleDateTimeSpan( double dblSpanSrc );
COleDateTimeSpan( long lDays, int nHours, int nMins, int nSecs );

参数：
dateSpanSrc | 要拷贝到新的COleDateTimeSpan对象中去的一个已经存在的COleDateTimeSpan对象。
dblSpanSrc | 要拷贝到新的COleDateTimeSpan对象中去的天数。
lDays,nHours,nMins,nSecs | 表示要拷贝到新的COleDateTimeSpan对象中去的日期和时间值。

说明：
所有这些构造函数创建的新的COleDateTimeSpan对象都被初始化为指定的值。下面给出了有关每一个构造函数的简短描述：
· | COleDateTimeSpan() | 构造一个初始值为0的COleDateTimeSpan对象。
· | COleDateTimeSpan( dateSpanSrc) | 根据一个已经存在的COleDateTimeSpan对象构造一个新的COleDateTimeSpan对象。
· | COleDateTimeSpan( dblSpanSrc) | 根据一个浮点值构造一个COleDateTimeSpan对象。
· | COleDateTimeSpan( lDays,nHours,nMins,nSecs ) | 构造一个按给定的数字值初始化的COleDateTimeSpan对象。
新的COleDateTimeSpan对象的状态被设置为有效的。
有关COleDateTimeSpan值的界限问题的更进一步的信息，参见“Visual C++程序员指南”一书中的文章“日期和时间：自动化支持”。

示例：
COleDateTimeSpan spanOne( 2.75 ); // 2 days and 18 hours
COleDateTimeSpan spanTwo( 2, 18, 0, 0 ); // 2 days and 18 hours
COleDateTimeSpan spanThree( 3, -6, 0, 0 ); // 2 days and 18 hours

COleDateTimeSpan ts1; // Uninitialized time value
COleDateTimeSpan ts2a(ts1); // Copy constructor
COleDateTimeSpan ts2b = ts1; // Copy constructor again
COleDateTimeSpan ts3(100.0); // 100 days
COleDateTimeSpan ts4(0, 1, 5, 12); // 1 hour, 5 minutes, and 12 seconds

请参阅：
COleDateTimeSpan::operator =, COleDateTimeSpan::GetStatus, COleDateTimeSpan::m_span, COleDateTimeSpan::m_status


 COleDateTimeSpan::Format

CString Format(LPCTSTR pFormat) const;
CString Format(UNIT nID) const;

返回值：
一个含有格式化的日期/时间间隔值的CString值。

参数：
pFormat一个代表格式的字符串，类似于printf中的代表格式的字符串。表示格式的代码，其前面的百分号（%）由相应的COleDateTimeSpan成分所代替。而表示格式的字符串中的其它字母则原封不动的拷贝到返回字符串中。更多的细节可参见运行时函数strftime。在Format函数中表示格式的符号的值和含义列表如下：
·%H | 当前日的小时数
·%M | 当前小时中的分钟数
·%S | 当前分钟中的秒数
·%% | 百分号

nID 格式控制字符串的资源ID。

说明：
调用这些函数可以生成一个有关时间段值的格式化表达式。如果COleDateTimeSpan对象的状态为无效，则返回值为一个空的字符串。如果其状态为有效的，则返回的是一个由字符串资源IDS_INVALID_DATETIMESPAN确定的字符串。

有关这个函数的几种形式的简短描述如下所示：
Format(pFormat) | 这种形式的函数用格式字符串来格式化相应的值，格式字符串中用前置的百分号（%）来指定表示格式的符号，就象在printf中一样。该格式字符串是一个资源。这个字符串的ID是作为参数传递给该函数的。
Format(nID) | 这种形式的函数用格式字符串来格式化相应的值，格式字符串中用前置的百分号（%）来指定表示格式的符号，就象在printf中一样。该格式字符串是一个资源。这个字符串的ID是作为指针来传递的。
有关函数中使用的格式化符号的更多的信息，可以参见“Microsoft Visual C++ 6.0运行时间库参考”。有关本地ID值的列表，可参见“Win32 SDK OLE 程序员参考”一书中的“支持多国语言”章节。

请参阅：COleDateTimeSpan::GetStatus


 COleDateTimeSpan::GetDays

long GetDays() const;

返回值：日期/时间段值的日部分。

说明：
调用这个成员函数可以跟踪日期/时间段值的日部分。
这个函数的返回值的范围大致在-3,615,000与3,615,000之间。
其它用来查询COleDateTimeSpan对象的函数可以参见下面列出的成员函数：
·GetHours
·GetMinutes
·GetSeconds
·GetTotalDays
·GetTotalHours
·GetTotalMinutes
·GetTotalSeconds

请参阅：COleDateTimeSpan::SetDateTimeSpan


 COleDateTimeSpan::GetHours

long GetHours() const;

返回值：日期/时间段值的小时部分。

说明：
调用这个成员函数可以获取日期/时间段值的小时部分。
这个函数的返回值的范围在-23与23之间。
其它用来查询COleDateTimeSpan对象的函数可以参见下面列出的成员函数：
·GetDays
·GetMinutes
·GetSeconds
·GetTotalDays
·GetTotalHours
·GetTotalMinutes
·GetTotalSeconds

请参阅：COleDateTimeSpan::SetDateTimeSpan


 COleDateTimeSpan::GetMinutes

long GetMinutes() const;

返回值：日期/时间段值的分钟部分。

说明：
调用这个成员函数可以获取日期/时间段值的分钟部分。
这个函数的返回值的范围在-59与59之间。
其它用来查询COleDateTimeSpan对象的函数可以参见下面列出的成员函数：
·GetDays
·GetHours
·GetSeconds
·GetTotalDays
·GettotalHours
·GetTotalMinutes
·GetTotalSeconds

请参阅：COleDateTimeSpan::SetDateTimeSpan


 COleDateTimeSpan::GetSeconds

long GetSeconds() const;

返回值：日期/时间段值的秒部分。

说明：
调用这个成员函数可以获取日期/时间段值的秒部分。
这个函数的返回值的范围大致在-59与59之间。其它用来查询COleDateTimeSpan对象的函数可以参见下面列出的成员函数：
·GetDays
·GetHours
·GetMinutes
·GetTotalDays
·GetTotalHours
·GetTotalMinutes
·GetTotalSeconds

请参阅：COleDateTimeSpan::SetDateTimeSpan


 COleDateTimeSpan::GetStatus

DateTimeSpanStatus GetStatus() const;

返回值：COleDateTimeSpan值的状态。

说明：
调用这个成员函数可以获取这个COleDateTimeSpan对象的状态（有效性）。
这个返回值是用DateTimeSpanStatus枚举类型定义的，该枚举类型是在COleDateTimeSpan类中定义的。
enum DateTimeSpanStatus
{
valid = 0,
invalid = 1,
null = 2,
};

下面列出了有关这些状态值的简短描述：
· | COleDateTimeSpan::valid | 表示这个COleDateTimeSpan对象是有效的。
· | COleDateTimeSpan::invalid | 表示这个COleDateTimeSpan对象是无效的，也就是说，这个对象的值有可能是错误的。
· | COleDateTimeSpan::null | 表示这个COleDateTimeSpan对象是空的，也就是说，没有值被提供给这个对象。（在数据库中“null”意味着“没有值”，这与C++的NULL相反。）

在下面的示例中一个COleDateTimeSpan对象的状态是无效的：
· | 该对象在一次算术赋值操作，即+=或-=中，产生了上溢或者下溢。
· | 一个无效的值被赋给了这个对象。
· | 通过使用SetStatus将这个对象的状态显式的设置为无效。
有关其它可以将状态设置为无效的操作的更进一步的信息，参见COleDateTimeSpan::operator +,-和COleDateTimeSpan::operator +=,-=。
有关COleDateTimeSpan值的界限的更进一步的信息，参见“Visual C++ 程序员指南”一书中的文章“日期与时间：自动化支持”。

请参阅：COleDateTimeSpan::SetStatus, COleDateTimeSpan::m_status


 COleDateTimeSpan::GetTotalDays

double GetTotalDays() const;

返回值：
这个日期/时间段值以日为单位。虽然这个函数的原型是返回一个双精度值，但是它也常常返回一个整型值。

说明：
调用这个成员函数可以获取以日为单位表示的日期/时间段值。
这个函数的返回值的范围大致在-3.65e6与3.65e6之间。
其它用来查询COleDateTimeSpan对象的函数可以参见下面列出的成员函数：
·GetDays
·GetHours
·GetMinutes
·GetSeconds
·GetTotalHours
·GetTotalMinutes
·GetTotalSeconds

请参阅：COleDateTimeSpan::SetDateTimeSpan, COleDateTimeSpan::operator double


 COleDateTimeSpan::GetTotalHours

double GetTotalHours() const;

返回值：
这个日期/时间段值以小时为单位。虽然这个函数的原型是返回一个双精度值，但是它也常常返回一个整型值。

说明：
调用这个成员函数可以获取以小时为单位的日期/时间段值。
这个函数的返回值的范围大致在-8.77e7与8.77e7之间。
其它用来查询COleDateTimeSpan对象的函数可以参见下面列出的成员函数：
·GetDays
·GetHours
·GetMinutes
·GetSeconds
·GetTotalDays
·GetTotalMinutes
·GetTotalSeconds

请参阅：COleDateTimeSpan::SetDateTimeSpan


 COleDateTimeSpan::GetTotalMinutes

double GetTotalMinutes() const;

返回值：
这个日期/时间段值以分钟为单位。虽然这个函数的原型是返回一个双精度值，但是它也常常返回一个整型值。

说明：
调用这个成员函数可以获取以分钟为单位的日期/时间段值。
这个函数的返回值的范围大致在-5.26e9与5.26e9之间。
其它用来查询COleDateTimeSpan对象的函数可以参见下面列出的成员函数：
·GetDays
·GetHours
·GetMinutes
·GetSeconds
·GetTotalDays
·GetTotalHours
·GetTotalSeconds

请参阅：COleDateTimeSpan::SetDateTimeSpan


 COleDateTimeSpan::GetTotalSeconds

double GetTotalSeconds() const;

返回值：
这个日期/时间段值以秒为单位。虽然这个函数的原型是返回一个双精度值，但是它也常常返回一个整型值。

说明：
调用这个成员函数可以获取以秒为单位的日期/时间段值。
这个函数的返回值的范围大致在-3.16e11与3.16e11之间。
其它用来查询COleDateTimeSpan对象的函数可以参见下面列出的成员函数：
·GetDays
·GetHours
·GetMinutes
·GetSeconds
·GetTotalDays
·GetTotalMinutes
·GetTotalSeconds

请参阅：COleDateTimeSpan::SetDateTimeSpan


 COleDateTimeSpan::SetDateTimeSpan

void SetDateTimeSpan(long lDays, int nHours, int nMins, int nSecs);

参数：
kDays,nHours,nMins,nSecs 表示要被拷贝到COleDateTimeSpan对象中去的日期段和时间段值。

说明：
调用这个成员函数可以设置日期/时间段值。
其它用来查询COleDateTimeSpan对象的函数可以参见下面列出的成员函数：
·GetDays
·GetHours
·GetMinutes
·GetSeconds
·GetTotalDays
·GetTotalHours
·GetTotalMinutes
·GetTotalSeconds

示例：
COleDateTimeSpan spanOne;COleDateTimeSpan spanTwo;
spanOne.SetDateTimeSpan(0, 2, 45, 0); // 2 hours and 45 seconds
spanTwo.SetDateTimeSpan(0, 3, -15, 0); // 2 hours and 45 seconds

请参阅：COleDateTimeSpan::GetStatus, COleDateTimeSpan::m_span


 COleDateTimeSpan::SetStatus

void SetStatus( DateTimeSpanStatus nStatus );

参数：
nStatus 表示COleDateTimeSpan对象的新的状态值。

说明：
调用这个成员函数可以设置COleDateTimeSpan对象的状态（有效性）。参数nStatus值是用DateTimeSpanStatus枚举类型定义的，该枚举类型是在COleDateTimeSpan类中定义的。

enum DateTimeSpanStatus
{
valid = 0,
invalid = 1,
null = 2,
};

下面列出了有关这些状态值的简短描述：
· | COleDateTimeSpan::valid | 表示这个COleDateTimeSpan对象是有效的。
· | COleDateTimeSpan::invalid | 表示这个COleDateTimeSpan对象是无效的，也就是说，这个对象的值有可能是错误的。
· | COleDateTimeSpan::null | 表示这个COleDateTimeSpan对象是空的，也就是说，没有值被提供给这个对象。（在数据库中“null”意味着“没有值”，这与C++的NULL不同。）
警告：
这个函数适用于高级编程的情况。这个函数不改变对象中的数据。它常常被用来将对象的状态设置为null或invalid。注意赋值操作符（operator =）和SetDateTimeSpan是基于源值来设置对象的状态。

请参阅：COleDateTimeSpan::GetStatus, COleDateTimeSpan::m_status


 COleDateTimeSpan::m_span

说明：
这是COleDateTimeSpan对象的基本的双精度值。其值以日为单位表示日期/时间段值。
警告：
改变这个双精度数据成员的值，将改变该COleDateTimeSpan对象的值。它不改变这个COleDateTimeSpan对象的状态。

请参阅：
COleDateTimeSpan::COleDateTimeSpan, COleDateTimeSpan::SetDateTimeSpan, COleDateTimeSpan::operator double


 COleDateTimeSpan::m_status

说明：
这个数据成员的数据类型是枚举类型DateTimeSpanStatus，此枚举类型是在COleDateTimeSpan类中定义的。
enum DateTimeSpanStatus
{
valid = 0,
invalid = 1,
null = 2,
};

有关这些状态值的简短描述，参见下面的列表：
·COleDateTimeSpan::valid | 表示这个COleDateTimeSpan对象是有效的。
·COleDateTimeSpan::invalid | 表示这个COleDateTimeSpan对象是无效的，也就是说，这个对象的值有可能是错误的。
·COleDateTimeSpan::null | 表示这个COleDateTimeSpan对象是空的，也就是说，没有值被提供给这个对象。（在数据库中“null”意味着“没有值”，这与C++的NULL不同。）

在下面的示例中一个COleDateTimeSpan对象的状态是无效的：
· | 该对象在一次算术赋值操作，即+=或-=中，产生了上溢或者下溢。
· | 一个无效的值被赋给了这个对象。
· | 通过使用SetStatus将这个对象的状态显式的设置为无效。
有关其它可以将状态设置为无效的操作的更进一步的信息，参见COleDateTimeSpan::operator +,-和COleDateTimeSpan::operator +=,-=。
警告：
这个数据成员用于高级程序开发情况中。可以使用内联成员函数GetStatus和SetStatus。参见SetStatus可以获得
有关如何设置这个数据成员的更进一步的警告。有关COleDateTimeSpan值的界限问题的更多信息，参见“Visual C++ 程序员指南”一书中的文章“日期与时间：自动化支持”。

请参阅：COleDateTimeSpan::GetStatus, COleDateTimeSpan::SetStatus


 COleDateTimeSpan::operator =

const COleDateTimeSpan& operator=( double dblSpanSrc );
const COleDateTimeSpan& operator=( const COleDateTimeSpan& dateSpanSrc );

说明：
这些重载的赋值操作符将源日期/时间段值拷贝到COleDateTimeSpan对象中。

请参阅：COleDateTimeSpan::COleDateTimeSpan


 COleDateTimeSpan::operator +,-

COleDateTimeSpan opetator +(const COleDateTimeSpan& dateSpan) const;
COleDateTimeSpan operator -(const COleDateTimeSpan& dateSpan) const;
COleDateTimeSpan operator -() const;

说明：
前两个操作符可以用来加、减日期/时间段值。第三个操作符用来改变日期/时间段值的符号。
如果两个操作数有一个为空，则结果中的COleDateTimeSpan值的状态也是空。
如果两个操作数中一个为无效，另一个不为空，则结果中的COleDateTimeSpan值的状态也是无效。
有关状态值valid，invalid和null的进一步信息，可参考成员变量m_status。

请参阅：COleDateTimeSpan::operator +=,-=


 COleDateTimeSpan::operator +=,-=

const COleDateTimeSpan opetator +=(const COleDateTimeSpan dateSpan);
const COleDateTimeSpan operator -=(const COleDateTimeSpan dateSpan);

说明：
这两个操作符可以用来从一个COleDateTimeSpan对象中加、减这个日期/时间段值。
如果两个操作数有一个为空，则结果中的COleDateTimeSpan值的状态也是空。
如果两个操作数中一个为无效，另一个不为空，则结果中的COleDateTimeSpan值的状态也是无效。
有关状态值valid，invalid和null的进一步信息，可参考成员变量m_status。

请参阅：COleDateTimeSpan::operator +,-


 COleDateTimeSpan::operator <<,>>

friend CDumpContext& AFXAPI operator <<( CDumpContext& dc, COleDateTimeSpan dateSpan )
friend CArchive& AFXAPI operator <<( CArchive& ar, COleDateTimeSpan dateSpan );
friend CArchive& AFXAPI operator >>( CArchive& ar, COleDateTimeSpan dateSpan );

说明：
COleDateTimeSpan 插入操作符（<<）支持诊断转储并可以保存到一个文件。提取操作符（>>）支持从一个文件中提取内容。

请参阅：CDumpContext, CArchive


 COleDateTimeSpan::operator double

operator double() const

说明：
这个操作符将一个COleDateTimeSpan值的天数作为一个浮点值返回。

请参阅：
COleDateTimeSpan::GetTotalDays, COleDateTimeSpan::SetDateTimeSpan, COleDateTimeSpan::m_span


 COleDateTimeSpan::Relational Operators

BOOL operator ==( const COleDateTimeSpan& dateSpan ) const;
BOOL operator !=( const COleDateTimeSpan& dateSpan ) const;
BOOL operator < ( const COleDateTimeSpan& dateSpan ) const;
BOOL operator > ( const COleDateTimeSpan& dateSpan ) const;
BOOL operator <=( const COleDateTimeSpan& dateSpan ) const;
BOOL operator >=( const COleDateTimeSpan& dateSpan ) const;

说明：
这些操作符比较两个日期/时间段值，如果条件满足则返回非零值；否则返回零值。

警告：
如果两个操作数中的任何一个的状态为空或者无效，则顺序操作符（<, <=, >, >=）的返回值就是不确定的。等号操作符（==, !=）也要考虑操作数的状态。

示例：
COleDateTimeSpan spanOne(3, 12, 0, 0); // 3 days and 12 hours
COleDateTimeSpan spanTwo(spanOne); // 3 days and 12 hours
BOOL b;
b = spanOne == spanTwo; // TRUE

spanTwo.SetStatus(COleDateTimeSpan::invalid);
b = spanOne == spanTwo; // FALSE, different status
b = spanOne != spanTwo; // TRUE, different status
b = spanOne < spanTwo; // FALSE, same value
b = spanOne > spanTwo; // FALSE, same value
b = spanOne <= spanTwo; // TRUE, same value
b = spanOne >= spanTwo; // TRUE, same value
警告：上述示例中的后四行将在调试模式中声明。


 COleDBRecordView

CObject
└CCmdTarget
└CWnd
└CView
└CScrollView
└CFormView
└COleDBRecordView

COleDBRecordView对象是一个用来显示受控制的数据库记录的视窗。这个视窗是一个直接连接于CRowset对象的表格视窗。该视窗是从一个对话框模板资源生成来的，并且在对话框模板的控件中显示CRowset对象域。COleDBRecordView对象使用对话框数据交换（DDX）和CRowset中的导航功能，来使数据在表格上的控件与行集之间自动移动。COleDBRecordView也提供缺省的用于移动到第一个，下一个，前一个或最后一个的实现，并且提供在当前视窗中用于更新记录的界面。
注意：
如果你使用Date Access Objects（DAO）类比使用OLE DB ConsumerTemplate类更多，请使用CDaoRecordView来代替。如果要获取更多的信息，请参见“Visual C++程序员指南”一书中的文章“数据库主题（总体）”和“DAO和MFC”。
COleDBRecordView在行集中跟踪用户的位置，因此记录视窗可以更新用户界面。当用户移动到行集的任何一端时，记录视窗就会使用在同一方向上进一步移动的用户界面对象——如菜单项或工具条按钮无效。
如果要获取更多关于行集类的信息，请参见“Microsoft Visual C++ 6.0类库参考手册”中的“Microsoft Visual C++6.0模板库参考”卷中的文章“使用OLE DBConsumer Templates”。
#include <afxoledb.h>

COleDBRecordView类成员

构造
COleDBRecordView 构造一个COleDBRecordView对象

属性
OnGetRowset 返回一个指向CRowset类对象的指针

操作
OnMove 更新数据源上的当前记录（如果变脏了），然后移动到指定的记录（下一个，前一个，第一个或最后一个）


 COleDBRecordView::COleDBRecordView

COleDBRecordView( LPCTSTR lpszTemplateName );
COleDBRecordView( UINT nIDTemplate );

参数：
lpszTemplateName | 记录一个以空字符结尾的字符串，该字符串是一个对话框模板资源的名字。
nIDTemplate | 记录一个对话框模板资源的ID号。

说明：
当你创建一个类型是从COleDBRecordView派生而来的对象时，激活其中的一个构造函数来生成一个视对象，并且标识该视所基于的对话框资源。你可以用名字来标识相应的资源（将一个字符串作为参数传递给构造函数），或者用它的ID来标识（将一个无符号的整数作为参数传递给构造函数）。
注意：
你的派生类必须提供它自己的构造函数。在这个构造函数中，用资源的名字或ID作为一个参数来激活构造函数COleDBRecordView::COleDBRecordView。


 COleDBRecordView::OnGetRowset

virtual CRowset* OnGetRowset() = 0;

返回值：
如果成功的生成了对象则返回一个指向CRowset对象的指针；否则返回一个NULL指针。

说明：
此函数返回一个指向CRowset对象的指针。为了构造或获得一个行集对象，并返回一个指向该对象的指针，你必须重载这个函数。如果你用ClassWizard来声明你的记录视类，则向导将为你进行缺省的重载。ClassWizard的缺省实现返回保存在记录视窗中的行集指针，如果这个指针存在的话。如果指针不存在，它就构造一个行集对象，该对象的类型是你用ClassWizard指定的，接着调用它的成员函数Open来打开表或运行一次查询，然后返回一个指向该对象的指针。


 COleDBRecordView::OnMove

virtual BOOL OnMove( UINT nIDMoveCommand );

返回值：
如果移动成功则返回非零值；如果移动请求被忽略则返回0。

参数：
nIDMoveCommand是下面列出的标准命令ID值之一：
· | ID_RECORD_FIRST | 移动到记录集中的第一个记录。
· | ID_RECORD_LAST | 移动到记录集中的最后一个记录。
· | ID_RECORD_NEXT | 移动到记录集中的下一个记录。
· | ID_RECORD_PREV | 移动到记录集中的前一个记录。

说明：
这个成员函数可以实现在行集中移动到不同的记录，并且在记录视窗的控件中显示该记录的字段。其缺省的实现是与记录视窗相关的CRowset对象的适当的成员函数Move。
缺省的，如果用户改变了记录视窗中的数据，则OnMove更新数据源中的当前记录。
AppWizard创建一个菜单资源，它具有First Record，Last Record，Next Record和Previous Record菜单项。如果你选择了Dockable Toolbar选项，AppWizard就创建一个工具条，其上有对应于这些命令的按钮。
如果你在记录集中移动超过了最后一个记录，则在记录视窗中仍然显示最后一个记录。如果你超过了第一个记录，则在视窗中仍然显示第一个记录。


 COleDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog
└COleDialog

COleDialog类为OLE对话框提供了通用的基本功能。微软基础类库提供了几个由COleDialog派生的类。这些类是：
·COleInsertDialog
·COleConvertDialog
·COleChangeIconDialog
·COleLinksDialog
·COleBusyDialog
·COleUpdateDialog
·COlePasteSpecialDialog
·COlePropertiesDialog
·COleChangeSourceDialog
有关OLE特定对话框的更多信息，参见“Visual C++程序员指南”一书中的文章“OLE中的对话框”。
#include <afxodlgs.h>

COleDialog类成员

操作
GetLastError 获取对话框返回的错误代码


 COleDialog::GetLastError

UNIT GetLastError() const;

返回值：
由GetLastError返回的错误代码是基于所显示的特定的对话框的。

说明：
当DoModal返回IDABORT时，调用GetLastError成员函数可以获得额外的错误信息。参见派生类中的DoModal成员函数可以获得有关特别错误消息的更进一步的信息。

请参阅：
COleInsertDialog::DoModal, COleConvertDialog::DoModal, COleChangeIconDialog::DoModal, COleLinksDialog::DoModal, COleBusyDialog::DoModal, COleUpdateDialog::DoModal, COlePasteSpecialDialog::DoModal, COlePropertiesDialog::DoModal, COleChangeSourceDialog::DoModal


 COleDispatchDriver

COleDispatchDriver没有基类。
COleDispatchDriver类实现OLE自动化中的客户方。OLE调度接口为访问一个对象的方法和属性提供了途径。COleDispatchDriver的成员函数连接，分离，创建和释放一个IDispatch类型的调度连接。其它的成员函数使用变量参数列表来简化调用IDispatch::Invoke。
要获得更多的信息，参见“Win32 SDK OLE程序员参考”中的IDispatch和IDispatch::Invoke。
这个类可以直接使用，但一般来说，它只是由用ClassWizard创建的类使用。
当你通过引用一个类型库来创建一个新的C++类时，ClassWizard从COleDispatchDriver派生出新类。
有关使用COleDispatchDriver的更多信息，参见下面列出的“Visual C++程序员指南”一书中的文章：
· | 自动化客户
· | 自动化服务器
· | ClassWizard自动化支持
#include <afxdisp.h>
请参阅：CCmdTarget

COleDispatchDriver成员函数

数据成员
m_bAutoRelease | 在执行ReleaseDispatch或析构对象时，指定是否要释放Idispatch
m_lpDispatch | 表示指向附着在这个COleDispatchDriver的IDispatch接口的指针

构造
COleDispatchDriver 构造一个COleDispatchDriver对象

操作
CreateDispatch | 创建一个IDispatch连接并将它附着于COleDispatchDriver对象
AttachDispatch | 将一个IDispatch连接附着于COleDispatchDriver对象
DetachDispatch | 分开一个IDispatch连接，但并不释放它
ReleaseDispatch | 释放一个IDispatch连接
InvokeHelper | 用于调用自动化方法的助手
SetProperty | 设置一个自动化特性
GetProperty | 获得一个自动化特性


 COleDispatchDriver::AttachDispatch

void AttachDispatch( LPDISPATCH lpDispatch, BOOL bAutoRelease = TRUE);

参数：
lpDispatch | 被附着于COleDispatchDriver对象的指向一个OLE IDispatch对象的指针。
bAutoRelease | 表明当对象超出范围时，是否要释放dispatch。

说明：
调用AttachDispatch成员函数可以将一个IDispatch指针附着于COleDispatchDriver对象上。这个函数释放任何已经附着于COleDispatchDriver对象的IDispatch指针。

请参阅：
COleDispatchDriver::DetachDispatch, COleDispatchDriver::ReleaseDispatch, COleDispatchDriver::CreateDispatch, COleDispatchDriver::m_lpDispatch, COleDispatchDriver::m_bAutoRelease


 COleDispatchDriver::COleDispatchDriver

COleDispatchDriver();
COleDispatchDriver(LPDISPATCH lpDispatch,BOOL bAutoRelease = TRUE);
COleDispatchDriver(const COleDispatchDriver& dispatchSrc);

参数：
lpDispatch | 指向一个被附着于COleDispatchDriver对象的OLE IDispatch对象的指针。
bAboutRelease | 当对象超出范围时，表明是否要释放这个dispatch。
dispatchSrc | 对一个已存在的COleDispatchDriver对象的引用。

说明：
构造一个COleDispatchDriver对象。
COleDispatchDriver(LPDISPATCH lpDispatch,BOOL bAutoRelease = TRUE)连接IDispatch接口。
COleDispatchDriver(const COleDispatchDriver& dispatchSrc)拷贝一个已存在的COleDispatchDriver对象，并增加引用计数。
COleDispatchDriver( )创建一个COleDispatchDriver对象，但不连接IDispatch接口。在使用一个没有参数的COleDispatchDriver( )之前，应该用COleDispatchDriver::CreateDispatch或者COleDispatchDriver::AttachDispatch为它连接一个IDispatch。

请参阅：
COleDispatchDriver::AttachDispatch, COleDispatchDriver::CreateDispatch


 COleDispatchDriver::CreateDispatch

BOOL CreateDispatch(REFCLSID clsid, COleException* pError = NULL);
BOOL CreateDispatch(LPCTSTR lpszProgID, COleException* pError = NULL);

返回值：成功则返回非零值；否则返回0。

参数：
clsid | 要创建的IDispatch连接对象的类ID。
pError | 指向一个OLE异常对象的指针，这个异常对象将保存在创建中产生的状态码。
lpszProgID | 指向一个自动化对象的标识符的指针，如“Excel.Document.5”。将要创建的调度对象是为这个自动化对象创建的。

说明：
创建一个IDispatch对象并将它与COleDispatchDriver对象连接。

请参阅：
COleDispatchDriver::DetachDispatch, COleDispatchDriver::ReleaseDispatch, COleDispatchDriver::AttachDispatch, COleException, COleDispatchDriver::m_lpDispatch


 COleDispatchDriver::DetachDispatch

LPDISPATCH DetachDispatch();

返回值：
一个指向以前连接的IDispatch对象的指针。

说明：
将当前的IDispatch连接从对象上分离。但不释放这个IDispatch。
有关LPDISPATCH类型的更多的信息，参见“OLE程序员参考”中的IDispatch。

请参阅：
COleDispatchDriver::ReleaseDispatch, COleDispatchDriver::CreateDispatch, COleDispatchDriver::AttachDispatch, COleDispatchDriver::m_lpDispatch


 COleDispatchDriver::GetProperty

void GetProperty(DISPID dwDispID,VARTYPE vtProp,void* pvProp) const;

参数：
dwDispID | 标识需要获得的属性。这个值通常由ClassWizard提供。
vtProp | 指定要获取的属性。可能的取值可以参见COleDispatchDriver::InvokeHelper的说明部分。
pvProp | 用来接收属性值的变量的地址。它必须与vtProp所指定的类型相匹配。

说明：获取由dwDispID指定的对象属性。

请参阅：
COleDispatchDriver::InvokeHelper, COleDispatchDriver::SetProperty


 COleDispatchDriver::InvokeHelper

void InvokeHelper(DISPID dwDispID, WORD wFlags, VARTYPE vtRet, void* pvRet, const BYTE FAR* pbParamInfo, ...);
throw(COleException);
throw(COleDispatchException);

参数：
dwDispID | 标识要激活的方法或者属性。这个值常常由ClassWizard提供。
wFlag | 描述调用IDispatch::Invoke的前后关系的标志。其可能的取值参见Platform SDK。
vtRet | 指定返回值的类型。其可能的取值参见说明部分。
pvRet | 是将用来接收属性值或返回值的变量的地址。它必须与vtRet所指定的类型相匹配。
pbParamInfo | 是一个指向用空字符结尾的字符串的指针，这个字符串有多个字节用来指定紧跟pbParamInfo之后的参数的类型。
... | 参数变量列表，这些参数的类型在pbParamInfo中指定。

说明：
在由wFlags指定的前后关系中调用由dwDispID指定的方法或属性。参数pbParamInfo指定要传递给方法或属性的参数的类型。在语法说明中“...”所代表的就是参数的变量列表。
vtRet参数可能的取值来自于VARENUM枚举。
可能的取值如下所示：
符号 | 返回类型
VT_EMPTY | void
VT_I2 | short
VT_I4 | long
VT_R4 | float
VT_R8 | double
VT_CY | CY
VT_DATE | DATE
VT_BSTR | BSTR
VT_DISPATCH | LPDISPATCH
VT_ERROR | SCODE
VT_BOOL | BOOL
VT_VARIANT | VARIANT
VT_UNKNOWN | LPUNKNOWN
参数pbParamInfo是一个由空格分隔的有关VTS_常量的列表。这些值中的许多是由空格来分隔的（而不是逗号），它们指明了函数的参数列表。可能的取值由宏EVENT_CUSTOM列表给出。
此函数将参数转换为VARIANTARG值，然后激活IDispatch::Invoke方法。如果对Invoke的调用失败，这个函数将抛出一个异常。如果由IDispatch::Invoke返回的SCODE（状态码）是DISP_E_EXCEPTION，此函数抛出一个COleException对象；否则它抛出一个COleDispatchException。
更多的信息请参见“Platform SDK”中的VARIANTARG，IDispatch，IDispatch::Invoke，以及COM错误代码的结构。

请参阅：COleException, COleDispatchException


 COleDispatchDriver::ReleaseDispatch

void ReleaseDispatch();

说明：
释放IDispatch连接。如果这个连接已经设置为自动释放，则在释放这个接口之前，此函数将调用Dispatch::Release。

请参阅：
COleDispatchDriver::DetachDispatch, COleDispatchDriver::CreateDispatch, COleDispatchDriver::AttachDispatch, COleDispatchDriver::m_lpDispatch, COleDispatchDriver::m_bAutoRelease


 COleDispatchDriver::SetProperty

void SetProperty(DISPID dwDispID, VARTYPE vtProp, ...);

参数：
dwDispID | 标识要设置的属性。这个值常常由ClassWizard提供。
vtProp | 指明要设置的属性的类型。可能的取值参见COleDispatchDriver::InvokeHelper中的说明部分。
... | 由vtProp指明类型的单一参数。

说明：设置由dwDispID指定的OLE对象属性。

请参阅：
COleDispatchDriver::InvokeHelper, COleDispatchDriver::GetProperty


 COleDispatchDriver::m_bAutoRelease

说明：
如果为TRUE，则当调用ReleaseDispatch或COleDispatchDriver对象被销毁时，由m_lpDispatch访问的COM对象将被自动释放。
缺省的，在构造函数中m_bAutoRelease被设置为TRUE。
有关释放COM对象的更多信息，参见“OLE 2 程序员参考，卷1”中的“实现引用计数和 IUnknown::Release。”

请参阅：
COleDispatchDriver::AttachDispatch, COleDispatchDriver::ReleaseDispatch, COleDispatchDriver::m_lpDispatch


 COleDispatchDriver::m_lpDispatch

说明：
这是指向连接着COleDispatchDriver的IDispatch接口的指针。m_lpDispatch数据成员是一个类型为LPDISPATCH的公用变量。
更多的信息可以参见“OLE程序员参考”中的IDispatch。

请参阅：
COleDispatchDriver::AttachDispatch, COleDispatchDriver::ReleaseDispatch, COleDispatchDriver::CreateDispatch, COleDispatchDriver::DetachDispatch


 COleDispatchException

CObject
└CException
└COleDispatchException

COleDispatchException类处理对OLE IDispatch接口来说特定的异常，这个接口是OLE自动化中的关键部分。
象其它由基类CExecption派生出来的异常类一样，COleDispatchException可以与THROW，THROW_LAST，TRY，CATCH，AND_CATCH和END_CATCH宏一起使用。
一般来说，可以调用AfxThrowOleDispatchException来创建和抛出一个COleDispatchException对象。
有关异常的更多信息，参见“Visual C++程序员指南”一书中的“异常”和“异常：OLE 异常”。
#include <afxdisp.h>
请参阅：COleDispatchDriver, COleException

COleDispatchException类成员

数据成员
m_dwHelpContext | 错误的帮助上下文
m_strDescription | 动词的错误描述
m_strHelpFile | 随m_dwHelpContext使用的帮助文件
m_strSource | 产生异常的应用
m_wCode | IDispatch-特定错误代码


 COleDispatchException::m_dwHelpContext

DWORD m_dwHelpContext;

说明：
在你的应用程序的帮助文件（.HLP）中标识帮助的上下文。当出现一个异常时，由函数AfxThrowOleDispatchException设置这个成员。

请参阅：
COleDispatchException::m_strDescription, COleDispatchException::m_wCode, AfxThrowOleDispatchException


 COleDispatchException::m_strDescription

CString m_strDescription;

说明：
包含动词的错误描述，如“磁盘满”。当出现一个异常时，由函数AfxThrowOleDispatchException设置这个成员。

请参阅：
COleDispatchException::m_dwHelpContext, COleDispatchException::m_wCode, AfxThrowOleDispatchException


 COleDispatchException::m_strHelpFile

CString m_strHelpFile;

说明：这个字符串的内容是应用程序的帮助文件名。

请参阅：AfxThrowOleDispatchException


 COleDispatchException::m_strSource

CString m_strSource

说明：
框架将产生异常的应用程序的名字填入该字符串。

请参阅：AfxThrowOleDispatchException


 COleDispatchException::m_wCode

WORD m_wCode;

说明：
记录一个你的应用程序的特定错误代码。当出现一个异常时，由函数AfxThrowOleDispatchException设置这个成员。

请参阅：
COleDispatchException::m_strDescription, COleDispatchException::m_dwHelpContext, AfxThrowOleDispatchException


 COleDocObjectItem

CObject
└CCmdTarget
└CDocItem
└COleClientItem
└COleDocObjectItem

COleDocObjectItem类实现了活动文档容器。在MFC中，处理一个活动文档类似于处理一个普通的，现场可编辑的嵌入文档，除了下面列出的不同之处：
· | COleDocument派生类仍然保存一个当前内置项的列表；但是这些项有可能是COleDocObjectItem派生的项。
· | 当一个活动文档是活动的时，当它被现场激活时，它占据窗口中的整个客户区。
· | 一个活动文档容器对Help菜单具有完全的控制。
· | Help菜单包含适用于活动文档容器和服务器的菜单项。
由于活动文档容器拥有Help菜单，因此容器要负责将服务器的Help菜单消息向前传送给服务器。这个集成过程由COleDocObjectItem来处理。
有关菜单合并和激活活动文档的更多消息，参见“Visual C++程序员指南”一书中的“获得文档容器概述”。
#include <afxole.h>
请参阅：COleClientItem, CDocObjectServerItem

COleDocObjectItem类成员

构造
COleDocObjectItem 构造一个COleDocObject项

操作
GetActiveView | 获取文档的活动视图
OnPreparePrinting | 准备容器应用程序要打印的文档
OnPrint | 打印容器应用程序的文档
GetPageCount | 获取容器应用程序中的文档的页数
ExecCommand | 执行用户指定的命令


 COleDocObjectItem::COleDocObjectItem

COleDocObjectItem(COleDocument* pContainerDoc = NULL);

参数：
pContainerDoc 是一个指向COleDocument对象的指针，这个对象是作为活动文档容器的。为了使能IMPLEMENT_SERIALIZE，这个参数必须为NULL。而一般来说，是必须用一个非NULL 文档指针来构造一个OLE项。

说明：调用这个成员函数来初始化COleDocObjectItem项。


 COleDocObjectItem::ExecCommand

HRESULT ExecCommand(DWORD nCmdID, DWORD nCmdExecOpt = OLECMDEXECOPT_DONTPROMPTUSER, const GUID* pguidCmdGroup = NULL);

返回值：
如果成功则返回S_OK；否则，返回下列错误代码之一：
值 | 描述
E_UNEXPECTED | 发生了没有预想到的错误
E_FAIL | 发生了错误
E_NOTIMPL | 表示MFC自己尝试翻译和分配命令
OLECMDERR_E_UNKNOWNGROUP | PguidCmdGroup不是NULL，但没有指明一个公认的命令群
OLECMDERR_E_NOTSUPPORTED | 在pGroup群中nCmdID没有被认为是一个有效的命令
OLECMDERR_DISABLED | 由nCmdID标识的命令是无效的，不能被执行
OLECMDERR_NOHELP | 调用者用nCmdID标识的命令请求帮助，但是没有可用的帮助
OLECMDERR_CANCELED | 使用者取消了执行

参数：
nCmdID | 待执行命令的标识符。必须是在由pguidCmdGroup定义的组中。
nCmdExecOpt | 指明任务执行选项。缺省情况下设置为执行任务时不给用户提示。参见OLECMDEXECOPT可获得取值的列表。
pguidCmdGroup | 命令组的特有标识符。缺省情况下是NULL，这表明是标准组。由nCmdID传递的命令必须是属于这个组的。

说明：
调用这个成员函数执行由用户指定的命令。 参数pguidCmdGroup和nCmdID一起唯一确定了要激活的命令。参数nCmdExecOpt确定了需要执行的确切的动作。

请参阅：IOleCommandTarget::Exec


 COleDocObjectItem::GetActiveView

LPOLEDOCUMENTVIEW GetActiveView() const;

返回值：
指向当前活动视窗的IOleDocumentView接口的指针。如果当前没有活动视窗，则返回NULL。

说明：
调用这个成员函数可以获得指向当前活动视窗的IOleDocumentView接口的指针。有关这个返回的IOleDocumentView指针的引用计数在函数返回前不会增加。


 COleDocObjectItem::GetPageCount

BOOL GetPageCount(LPLONG pnFirstPage, LPLONG pcPages);

返回值：成功则返回非零值；否则返回0。

参数：
pnFirstPage | 指向文档的第一页的号码的指针。可以是NULL，这表明调用者不需要这个号码。
pcPages | 指向文档的总页数的指针。可以是NULL，这表明调用者不需要这个数字。

说明：调用这个成员函数可以获得文档中的页数。

请参阅：IPrint::GetPageInfo


 COleDocObjectItem::OnPreparePrinting

static BOOL OnPreparePrinting(CView* pCaller, CPrintInfo* pInfo, BOOL bPrintAll = TRUE);

返回值：如果成功则返回非零值；否则返回0。

参数：
pCaller | 指向CView对象的指针，该对象用来发送打印命令。
pInfo | 指向CPrintInfo对象的指针，该对象用来描述要打印的作业。
bPrintAll | 指明是否是整个文档都要打印。

说明：框架调用这个成员函数来准备一个要打印的文档。

请参阅：COleDocObjectItem::OnPrint


 COleDocObjectItem::OnPrint

static void OnPrint(CView* pCaller, CPrintInfo* pInfo, BOOL bPrintAll = TRUE);

参数：
pCaller | 指向CView对象的指针，该对象用来发送打印命令。
pInfo | 指向CPrintInfo对象的指针，该对象用来描述要打印的作业。
bPrintAll | 指明是否是整个文档都要打印。

说明：框架调用这个成员函数来打印一个文档。

请参阅：COleDocObjectItem::OnPreparePrinting


 COleDocument

CObject
└CCmdTarget
└CDocument
└COleDocument

COleDocument是OLE文档的基类，它支持可视化编辑。
COleDocument从CDocument派生来，这使你的OLE应用程序能够使用由微软基础类库提供的文档/视结构。
COleDocument将文档当作一个处理OLE项的CDocItem对象的集合。容器和服务器应用都需要这样的结构，因为它们的文档必须能够包容OLE项。类COleServerItem和类COleClientItem都从CDocItem派生而来，它们管理应用程序与OLE项之间的相互作用。
如果你正在编写一个简单的容器应用程序，最好从COleDocument派生出你的文档类。如果你正在编写一个支持链接到文档包含的嵌入项的容器应用程序，最好从COleLinkingDoc派生出你的文档类。如果你正在编写一个服务器应用程序或者是组合容器/服务器，最好从COleServerDoc派生出你的文档类。COleLinkingDoc和COleServerDoc是从COleDocument派生而来的，因此这些类继承了所有在COleDocument和CDocument中具有的服务。
要使用COleDocument，可以从它派生出一个类，并添加一些功能用来管理应用中除嵌入或链接项外的其它非OLE数据。如果你将从CDocItem派生而来的类定义为用来保存应用的内部数据，你可以使用由COleDocument定义的工具来保存你的OLE数据和非OLE数据。也可以设计你自己的数据结构来保存你的非OLE数据，以区别于你的OLE 项。更多的信息，参见“Visual C++程序员指南”一书中的文章“容器：复合文件”。
如果提供了邮件支持（MAPI）的话，CDocument支持将你的文档通过邮件发送。COleDocument已经更新了OnFileSendMail，可以正确处理捆绑在一起的文档。更多的信息，参见“Visual C++程序员指南”一书中的文章“MAPI主题”和“MFC中的MAPI支持”。
#include <afxole.h>

COleDocument类成员

构造
COleDocument 构造一个COleDocument对象

操作
HasBlankItems | 检查文档中的空项
EnableCompoundFile | 使文档能够被用OLE结构保存文件格式来保存
GetInPlaceActiveItem | 返回当前正处于活动状态的OLE项
GetStartPosition | 获得开始重复的初始位置
GetNextItem | 获取下一个要重复的文档项
GetNextClientItem | 获取下一个要重复的客户项
GetNextServerItem | 获取下一个要重复的服务器项
UpdateModifiedFlag | 如果任何一个被包容的OLE项被修改，则标记该文档为已被修改
ApplyPrintDevice | 为文档中的所有客户项设置打印目标设备
AddItem | 向文档保持的项列表中添加一个项
RemoveItem | 从文档保持的项列表中移走一个项

重载
GetPrimarySelectedItem | 返回文档中最初选择的OLE项
OnShowViews | 在文档变为可见和不可见时被调用

邮件函数
OnFileSendMail 发送一个附着有文档的邮件消息

消息处理
OnEditChangeIcon | 处理Change Icon菜单命令中的事件
OnEditConvert | 处理一个嵌入或链接对象从一种类型到另一种类型的转换
OnEditLinks | 处理Edit菜单上的Links命令中的事件

消息处理
OnUpdateEditChangeIcon | 由框架调用来更新Edit/Change Icon菜单选项的命令UI
OnUpdateEditLinksMenu | 由框架调用来更新Edit/Links菜单选项的命令UI
OnUpdateObjectVerbMenu | 由框架调用来更新Edit/Object Name菜单选项和从Edit/ObjectName访问的Verb子菜单的命令UI

消息处理
OnUpdatePasteLinkMenu | 由框架调用来更新Paste Special菜单选项的命令UI
OnUpdatePasteMenu | 由框架调用来更新Paste菜单选项的命令UI


 COleDocument::AddItem

virtual void AddItem(CDocItem* pItem);

参数：
pItem 指向要增加的文档项的指针。

说明：
调用这个函数可以向文档中增加一个项。当它被COleClientItem或者COleServerItem的构造函数调用时，你不必显式地调用这个函数，上述的构造函数接收一个指向文档的指针。

请参阅：
CDocItem, COleDocument::RemoveItem, COleServerItem::COleServerItem, COleClientItem::COleClientItem


 COleDocument::ApplyPrintDevice

BOOL ApplyPrintDevice(const DVTARGETDEVICE FAR* ptd);
BOOL ApplyPrintDevice(const PRINTDLG* ppd);

返回值：
如果函数执行成功则返回非零值，否则返回0。

参数：
ptd | 指向一个DVTARGETDEVICE数据结构的指针，该数据结构包含有关新的目标打印设备的信息。它可以为NULL。
ppd | 指向一个PRINTDLG数据结构的指针，该数据结构包含有关新的目标打印设备的信息。它可以为NULL。

说明：
调用这个函数可以为你应用程序中的容器文档中的所有嵌入COleClientItem项改变目标打印设备。此函数为所有的项更新目标打印设备，但是不为这些项刷新显示高速缓存。要更新一个项的显示高速缓存，可以调用COleClientItem::UpdateLink。
送往这个函数的参数包含了OLE用来标识目标设备的信息。PRINTDLG结构包含了Windows用来初始化通用打印对话框的信息。在用户关闭了对话框之后，Windows返回用户在这个结构中选择的信息。一个CPrintDialog对象的成员m_pd是一个PRINTDLG结构。
更多的信息，参见Win32 SDK文档中的PRINTDLG结构。
进一步的信息，参见“OLE 2 程序员参考，卷1”中的DVTARGETDEVICE结构。

请参阅：CPrintDialog


 COleDocument::COleDocument

COleDocument();

说明：构造一个COleDocument对象。


 COleDocument::EnableCompoundFile

void EnableCompoundFile(BOOL bEnable = TRUE);

参数：
bEnable 指明是否能够进行复合文件支持。

说明：
如果你希望用复合文件格式来保存文档，请调用这个函数。这也被称作结构化存储。调用这个函数的典型做法是在COleDocument派生类的构造函数中进行。有关复合文档的更进一般信息，参见“Visual C++程序员指南”一书中的文章“容器：复合文件”。
在为文档设置好是否能够支持复合文件之后，则在文档的整个生命周期中这个设置是不能改变的。

请参阅：COleClientItem


 COleDocument::GetInPlaceActiveItem

COleClientItem* GetInPlaceActiveItem(CWnd* pWnd);

返回值：
指向单一的、正处于活动状态的OLE 项的指针；如果当前没有正处于活动状态的OLE 项，则返回值为NULL。

参数：
pWnd 指向显示容器文档的窗口的指针。

说明：
调用这个函数可以获得框架窗口中正处于活动状态的OLE 项，该框架窗口包含有由pWnd标识的视图。

请参阅：COleClientItem


 COleDocument::GetNextClientItem

COleClientItem* GetNextClientItem(POSITION& pos) const;

返回值：
指向文档中下一个客户项的指针，如果没有更多的客户项则返回NULL。

参数：
pos 是对上一次调用GetNextClientItem设置的POSITION值的引用；其初值是成员函数GetStartPosition返回的。

说明：
调用这个函数可以重复地访问你的文档中的每一个客户项。每一次调用之后，为文档中的下一个项设置了pos的值，这些项有可能是也有可能不是一个客户项。

示例：
// COleDocument::GetNextClientItem示例：
// pDoc points to a COleDocument object
POSITION pos = pDoc->GetStartPosition();
COleClientItem *pItem;
while((pItem = pDoc->GetNextClientItem(pos)) != NULL)
{
// Use pItem
}

请参阅：
COleClientItem, COleDocument::GetStartPosition, COleDocument::GetNextServerItem, COleDocument::GetNextItem


 COleDocument::GetNextItem

virtual CDocItem* GetNextItem(POSITION& pos) const;

返回值：指向在指定位置的文档项的指针。

参数：
pos 是上一次调用GetNextItem设置的POSITION值的引用；其初值是成员函数GetStartPosition的返回值。

说明：
调用这个函数可以重复访问你的文档中的每一个项。在每一次调用之后，pos的值被设置为文档中下一个项的POSITION值。如果被获取的元素是文档中的最后一个元素，则pos的新值为NULL。

示例：
// Example for COleDocument::GetNextItem
// pDoc points to a COleDocument object
POSITION pos = pDoc->GetStartPosition();
CDocItem *pItem;
while( pos != NULL )
{
pItem = pDoc->GetNextItem( pos );
// Use pItem
}

请参阅：
COleDocument::GetStartPosition, COleDocument::GetNextClientItem, COleDocument::GetNextServerItem


 COleDocument::GetNextServerItem

COleServerItem* GetNextServerItem( POSITION& pos ) const;

返回值：
指向文档中下一个服务器项的指针，如果没有更多的项则返回NULL。

参数：
pos 是上一次调用GetNextServerItem设置的POSITION值的引用；其初值是成员函数GetStartPosition的返回值。

说明：
调用这个函数可以重复访问你的文档中的每一个服务器项。在每一次调用之后，pos的值为文档中的下一个项而被设置，这个项可能是也可能不是一个服务器项。

示例：
// Example for COleDocument::GetNextServerItem
// pDoc points to a COleDocument object
POSITION pos = pDoc->GetStartPosition();
COleServerItem *pItem;
while( ( pItem = pDoc->GetNextServerItem( pos ) ) != NULL )
{
// Use pItem
}

请参阅：
COleServerItem, COleDocument::GetStartPosition, COleDocument::GetNextClientItem, COleDocument::GetNextItem


 COleDocument::GetPrimarySelectedItem

virtual COleClientItem* GetPrimarySelectedItem( CView* pView );

返回值：
指向一个单一的已被选择的OLE 项 的指针；如果没有或者没有多于一个OLE项被选择则返回NULL。

参数：
pView 指向显示在文档中的活动视图对象的指针。

说明：
由框架调用此成员函数来获取指定视中的当前已被选择的OLE项。函数的缺省实现搜索被包含的OLE 项列表，以获得一个单一的被选择的项，并返回指向这个项的指针。如果没有被选中的项，或者没有多于一个的被选择的项，则函数返回NULL。为了使这个函数工作，你必须在你的视类中重载成员函数CView::IsSelected。如果你有用于保存被包含OLE 项的自己的方法，请重载这个函数。

请参阅：CView::IsSelected


 COleDocument::GetStartPosition

virtual POSITION GetStartPosition() const;

返回值：
一个POSITION值，可以用来在整个文档的项中开始重复；如果文档没有项则返回值为NULL。

说明：
调用这个函数可以获得文档中第一个项的位置。可以将返回值传递给GetNextItem，GetNextClientItem，或者是GetNextServerItem。

请参阅：
COleDocument::GetNextItem, COleDocument::GetNextClientItem, COleDocument::GetNextServerItem


 COleDocument::HasBlankItems

BOOL HasBlankItems() const;

返回值：
如果文档包含任何空项则返回非零值；否则返回0。

说明：
调用这个函数可以确定文档是否包含空项。一个空项是一个其矩形为空的项。

请参阅：CDocItem::IsBlank


 COleDocument::OnEditChangeIcon

afx_msg void OnEditChangeIcon();

说明：
显示OLE Change Icon对话框，并将代表当前选定的OLE 项的图标改变为用户在对话框中选定的图标。OnEditChangeIcon创建并给出一个COleChangeIconDialog 改变图标对话框。

请参阅：
COleDocument::OnUpdateEditChangeIcon, COleChangeIconDialog


 COleDocument::OnEditConvert

afx_msg void OnEditConvert();

说明：
显示OLE Convert对话框，并根据用户在对话框中的选择转换或激活被选定的OLE项。OnEditConvert创建并推出一个COleConvertDialog转换对话框。
有关转换的一个例子就是将一个Microsoft的Word文档转换为一个WordPad文档。

请参阅：
COleDocument::OnUpdateObjectVerbMenu, COleConvertDialog


 COleDocument::OnEditLinks

afx_msg void OnEditLinks();

说明：
显示OLE Edit/Links对话框。OnEditLinks创建并推出一个COleLinksDialog 链接对话框，让用户改变被链接的对象。

请参阅：
COleDocument::OnUpdateEditLinksMenu, COleLinksDialog


 COleDocument::OnFileSendMail

afx_msg void OnFileSendMail();

说明：
通过一个存在的邮件主机（任何一个）发送一个消息，将文档作为一个附着物。OnFileSendMail调用OnSaveDocument将一个无标题的或已被修改的文档保存到一个临时文件中，这个文件将被通过电子邮件发送。如果文档没有被修改，则不需要一个临时文件；被发送的是原始的文档。如果MAPI32.DLL没有被载入，则OnFileSendMail会载入它。
与OnFileSendMail在CDocument中的实现不同，这个函数正确处理复合文件。
更多的消息，参见“Visual C++程序员指南”一书中的文章“MAPI 主题”和“MFC中的MAPI 支持”。

请参阅：
CDocument::OnFileSendMail, CDocument::OnUpdateFileSendMail, CDocument::OnSaveDocument


 COleDocument::OnShowViews

virtual void OnShowViews( BOOL bVisible );

参数：
bVisible 表明文档是否是可见的。

说明：
在文档的可见性状态改变后，框架就调用这个函数。
这个函数的缺省版本什么也不做。如果当文档的可见性改变时你的应用程序必须执行任何特别的处理，那么你就重载它。


 COleDocument::OnUpdateEditChangeIcon

afx_msg void OnUpdateEditChangeIcon( CCmdUI* pCmdUI );

参数：
pCmdUI 指向一个代表产生更新命令的菜单的CCmdUI结构的指针。更新处理者通过pCmdUI来调用CCmdUI结构的Enable成员函数来更新用户界面。

说明：
框架调用这个函数来更新Edit菜单的Change Icon命令。OnUpdateEditChange基于在文档中是否存在一个有效的图标来更新命令的用户界面。重载这个函数可以改变这些功能。

请参阅：
COleDocument::OnEditChangeIcon, CCmdUI


 COleDocument::OnUpdateEditLinksMenu

afx_msg void OnUpdateEditLinksMenu( CCmdUI* pCmdUI );

参数：
pCmdUI 指向一个代表产生更新命令的菜单的CCmdUI结构的指针。更新处理者通过pCmdUI来调用CCmdUI结构的Enable成员函数来更新用户界面。

说明：
框架调用这个函数来更新Edit菜单的Change Icon命令。从文档中的第一个OLE项开始，OnUpdateEditLinksMenu访问每一项，测试它们是否是一个链接，并且，如果是一个链接，则使能Links命令。重载这个函数可以改变这种情况。

请参阅：
COleDocument::OnEditLinks, COleDocument::GetStartPosition, COleDocument::GetNextClientItem, CCmdUI


 COleDocument::OnUpdateObjectVerbMenu

afx_msg void OnUpdateOjectVerbMenu( CCmdUI* pCmdUI );

参数：
pCmdUI 指向一个代表产生更新命令的菜单的CCmdUI结构的指针。更新处理程序通过pCmdUI来调用CCmdUI结构的Enable成员函数来更新用户界面。

说明：
框架调用这个函数来更新Edit菜单的ObjectName命令以及从ObjectName命令访问的Verb子菜单，在此，ObjectName是文档中嵌入OLE对象的名字。
OnUpdateObjectVerbMenu基于文档中是否存在一个有效的对象来更新ObjectName命令的用户界面。如果一个对象存在，则Edit菜单中的ObjectName命令是有效的。当选择了这个菜单命令时，Verb子菜单就被显示出来了。Verb子菜单包含了所有对这个对象来说可以使用的动词命令，比如说Edit，Properties等等。重载这个函数可以改变这种情况。

请参阅：
COleDocument::OnEditConvert, CCmdUI


 COleDocument::OnUpdatePasteLinkMenu

afx_msg void OnUpdatePasteLinkMenu( CCmdUI* pCmdUI );

参数：
pCmdUI 指向一个代表产生更新命令的菜单的CCmdUI结构的指针。更新处理者通过pCmdUI来调用CCmdUI结构的Enable成员函数来更新用户界面。

说明：
框架调用这个函数来确定是否能够从剪贴板粘贴一个链接的OLE项。PasteSpecial菜单命令是否有效决定于这个项是否能够粘贴到文档中。

请参阅：
COleDocument::OnUpdatePasteMenu, CCmdUI


 COleDocument::OnUpdatePasteMenu

afx_msg void OnUpdatePasteMenu( CCmdUI* pCmdUI );

参数：
pCmdUI 指向一个代表产生更新命令的菜单的CCmdUI结构的指针。更新处理者通过pCmdUI来调用CCmdUI结构的Enable成员函数来更新用户界面。

说明：
框架调用这个函数来确定是否能够从剪贴板粘贴一个链接的OLE项。Paste菜单命令和按钮是否有效决定于这个项是否能够粘贴到文档中。

请参阅：
COleDocument::OnUpdatePasteLinkMenu, CCmdUI


 COleDocument::RemoveItem

virtual void RemoveItem( CDocItem* pItem );

参数：
pItem 指向被移动的文档项的指针。

说明：
调用这个函数可以从文档中删除一个项。通常你不用显式地调用这个函数；它由COleClientItem和COleServerItem的析构函数调用。

请参阅：
COleServerItem, COleClientItem, COleDocument::AddItem, CDocItem


 COleDocument::UpdateModifiedFlag

void UpdateModifiedFlag();

说明：
如果文档中包含的OLE 项被修改了，调用这个函数可以将文档标记为被修改的。这就使得框架在文档关闭前提示用户保存文档，即使就是在文档的内部数据没有改变时也可以这样。

请参阅：
CDocument::SetModifiedFlag, COleClientItem::IsModified


 COleDropSource

CObject
└CCmdTarget
└COleDropSource

一个COleDropSource对象允许将数据拖动到一个拖放目标中。类COleDropTarget处理从拖放操作中获得的数据。COleDropSource对象负责决定何时开始一次拖动操作，并在拖动操作中提供反馈，并决定何时结束一次拖动。只要调用相应的构造函数就可以使用一个COleDropSource对象。这简化了确定是何种事件的过程，比如一次鼠标的点击，用函数COleDataSource::DoDragDrop, COleClientItem:: DoDragDrop，或者COleServerItem::DoDragDrop开始一次拖动操作。这些函数将为你创建一个COleDropSource对象。你也许希望修改COleDropSource可重载函数的缺省行为。这些成员函数将在适当的时候由框架来调用。
有关使用OLE进行拖放操作的更多信息，参见“Visual C++程序员指南”一书中的“拖放(OLE)”。
更多的信息，参见“OLE2程序员参考，卷1”中的IDropSource。
#include <afxole.h>

COleDropSource类成员

构造
COleDropSource 构造一个COleDropSource对象

可重载
GiveFeedback | 在拖放操作中改变光标
OnBeginDrag | 在拖动操作中处理鼠标的动作
QueryContinueDrag | 查看是否可以继续拖动


 COleDropSource::COleDropSource

COleDropSource();

说明：构造一个COleDropSource对象。

请参阅：COleDropTarget


 COleDropSource::GiveFeedBack

virtual SCODE GiveFeedback(DROPEFFECT dropEffect);

返回值：
如果拖动在进行中，则返回DRAGDROP_S_USEDEFAULTCURSORS，如果不在进行中则返回NOERROR。

参数：
dropEffect你希望显示给用户的效果，它常常表明如果在这一点上放开被选择的数据将会发生什么。通常来说，它是最近调用的CView::OnDragEnter或者CView::OnDragOver的返回值。它可以是下列值中的一个或几个：
· | DROPEFFECT_NONE | 不允许放开操作。
· | DROPEFFECT_COPY | 将执行一次拷贝操作。
· | DROPEFFECT_MOVE | 将执行一次移动操作。
· | DROPEFFECT_LINK | 将建立一个从放开的数据到原始数据的链接。
· | DROPEFFECT_SCROLL | 在目标中一次拖动滚动条的操作将要发生或正在发生。

说明：
在调用COleDropTarget::OnDragOver或者COleDropTarget::DragEnter后由framework调用这个函数。重载这个函数可以向用户提供反馈，及如果在这点放开会发生什么。缺省的实现使用OLE缺省光标。有关使用OLE进行拖放操作的信息，参见“Visual C++程序员向导”一书的文章“拖放(OLE)”。
更多的信息，参见“OLE 2 程序员参考，卷1”中的IDropSource::GiveFeedback，IDropTarget::DragOver和IDropTarget::DragEnter。

请参阅：
CView::OnDragEnter, CView::OnDragOver


 COleDropSource::OnBeginDrag

virtual BOOL OnBeginDrag( CWnd* pWnd );

返回值：如果允许拖动则返回非零值，否则返回0。

参数：
pWnd 指向包含被选中数据的窗口的指针。

说明：
当开始拖动操作的事件（如按下鼠标左键）发生时，由框架调用此函数。如果你想修改拖动处理开始的方法，你可以重载这个函数。缺省的实现监视鼠标的动作并保持在拖动模式，直到用户点击鼠标的左键或右键，或者敲击ESC键，这时它释放鼠标。

请参阅：COleDropSource::GiveFeedBack


 COleDropSource::QueryContinueDrag

virtual SCODE QueryContinueDrag( BOOL bEscapePressed, DWORD dwKeyState );

返回值：
在拖动开始之前，如果按下ESC键或者鼠标右键或放开鼠标左键，则返回DRAGDROP_S_ CANCEL。如果要发生一次放开操作则返回DRAGDROP_S_DROP，否则返回S_OK。

参数：
bEscapePressed | 自最后一次调用COleDropSource::QueryContinueDrag后，ESC键被按下的状态。
dwKeyState | 记录键盘上的修改键的状态。这是下列任何一个组合： MK_CONTROL，MK_SHIFT，MK_ALT，MK_LBUTTON，MK_MBUTTON和MK_RBUTTON。

说明：
在拖动开始后，这个函数被框架重复调用直到拖动操作被取消或者结束。如果你想改变拖动的取消点或发生一次放开操作，你可以重载这个函数。
缺省的实现方式按下面的描述启动放开或取消一次拖动。当ESC键或鼠标右键被按下时，就取消一次拖动操作。在拖动开始之后，当鼠标左键被放起时，就启动一次放开操作。否则，此函数返回S_OK并不再执行进一步的操作。
由于这个函数被频繁地调用，所以要尽可能地对它进行优化。

请参阅：
COleDropSource::OnBeginDrag, COleDropTarget::OnDrop


 COleDropTarget

CObject
└CCmdTarget
└COleDropTarget

一个COleDropTarget对象提供窗口与OLE库之间的通讯机制。创建这个类的对象之后，窗口就可以通过OLE拖放机制接收数据。
为了使一个窗口能够接收拖放来的命令，就必须首先创建一个COleDropTarget类对象，然后调用Register函数，该函数只有一个参数，该参数是一个指向所需要的CWnd对象的指针。
有关使用OLE进行拖放操作的更多信息，参见“Visual C++程序员指南”一书中的文章“拖放(OLE)”。
#include <afxole.h>
请参阅：COleDropSource

COleDropTarget类成员

构造
COleDropTarget 构造一个COleDropTarget对象

操作
Register | 将一个窗口注册为一个有效的拖放目标
Revoke | 使窗口不再是一个有效的拖放目标

可重载
OnDragEnter | 当光标第一次进入窗口时被调用
OnDragLeave | 当光标被拖动出窗口时被调用
OnDragOver | 当光标在窗口中拖动时被重复调用
OnDragScroll | 用来确定光标是否被拖进了窗口的滚动条区域
OnDrop | 当数据被放在窗口中时被调用，缺省的处理
OnDropEx | 当数据被放在窗口中时被调用，最初的处理


 COleDropTarget::COleDropTarget

COleDropTarget();

说明：
构造一个COleDropTarget类对象。调用Register来使这个对象与窗口产生联系。

请参阅：
COleDropSource, COleDropTarget::Register, COleDropTarget::Revoke


 COleDropTarget::OnDragEnter

virtual DROPEFFECT OnDragEnter( CWnd* pWnd,
COleDataObject* pDataObject,
DWORD dwKeyState,
CPoint point
);

返回值：
如果在point指定的位置尝试放开会产生的影响。它可以是下列中的一个或几个：
· | DROPEFFECT_NONE | 不允许进行一次放开。
· | DROPEFFECT_COPY | 将执行一次拷贝操作。
· | DROPEFFECT_MOVE | 将执行一次移动操作。
· | DROPEFFECT_LINK | 将建立一个从被放开的数据到原始数据的链接。
· | DROPEFFECT_SCROLL | 在目标中已发生或将要发生一次拖动滚动条的操作。

参数：
pWnd | 指向光标正进入的窗口。
pDataObject | 指向包含可以放开的数据的数据对象。
dwKeyState | 包含修饰键的状态。是下列的一些组合：MK_CONTROL，MK_SHIFT，MK_ALT，MK_LBUTTON，MK_MBUTTON和MK_RBUTTON。
point | 记录光标在客户坐标系中的当前位置。

说明：
当光标首次被拖入窗口时由应用框架调用。重载这个函数可以使得在窗口中可以进行放开操作。缺省的实现调用了CView::OnDragEnter，它只是简单地缺省返回DROPEFFECT_NONE。
更多的信息请参见“OLE 2程序员参考，卷1”中的IDropTarget::DragEnter。

请参阅：
COleDropTarget::OnDragOver, COleDropTarget::OnDragLeave, COleDropTarget::OnDrop, COleDropTarget::OnDropEx, CView::OnDragEnter


 COleDropTarget::OnDragLeave

virtual void OnDragLeave( CWnd* pWnd );

参数：
pWnd 指向光标正离开的窗口。

说明：
当一次拖动操作正在起作用，同时光标正离开窗口时，由应用框架调用。当拖动操作离开指定的窗口时，如果你想有一些特别的动作，请你重载这个函数。这个函数的缺省实现调用了CView::OnDragLeave。
更多的信息请参见“OLE 2程序员参考，卷1”中的IDropTarget::DragEnter。

请参阅：
COleDropTarget::OnDragEnter, COleDropTarget::OnDragOver, COleDropTarget::OnDrop, COleDropTarget::OnDropEx


 COleDropTarget::OnDragOver

virtual DROPEFFECT OnDragOver( CWnd* pWnd,
COleDataObject* pDataObject,
DWORD dwKeyState,
CPoint point
);

返回值：
返回如果在point指定的位置尝试放开会产生的影响。它可以是下列中的一个或几个：
· | DROPEFFECT_NONE | 不允许进行一次放开。
· | DROPEFFECT_COPY | 将执行一次拷贝操作。
· | DROPEFFECT_MOVE | 将执行一次移动操作。
· | DROPEFFECT_LINK | 将建立一个从放开的数据到原始数据的链接。
· | DROPEFFECT_SCROLL | 在目标中已发生或将要发生一次拖动滚动条的操作。

参数：
pWnd | 指向光标正通过的窗口。
pDataObject | 指向包含可以放开的数据的数据对象。
dwKeyState | 包含修饰键的状态。这是下列的一些组合： MK_CONTROL，MK_SHIFT，MK_ALT，MK_LBUTTON，MK_MBUTTON和MK_RBUTTON。
point | 记录光标在客户坐标系中的当前位置。

说明：
当光标通过窗口时由应用框架调用。为了能够在窗口中进行放开操作，你必须重载这个函数。这个函数的缺省实现调用了CView::OnDragOver，它缺省地返回DROPEFFECT_ NONE。由于这个函数被频繁地调用，所以最好能够尽可能的对它进行优化。
更多的信息请参见“OLE 2程序员参考，卷1”中的IDropTarget::DragOver。

请参阅：
COleDropTarget::OnDragEnter, COleDropTarget::OnDragLeave, COleDropTarget::OnDrop, COleDropTarget::OnDropEx


 COleDropTarget::OnDragScroll

virtual DROPEFFECT OnDragScroll( CWnd* pWnd, DWORD dwKeyState, CPoint point );

返回值：
如果在point指定的位置尝试放开会产生的影响。它可以是下列中的一个或几个：
· | DROPEFFECT_NONE | 不允许进行一次放开。
· | DROPEFFECT_COPY | 将执行一次拷贝操作。
· | DROPEFFECT_MOVE | 将执行一次移动操作。
· | DROPEFFECT_LINK | 将建立一个从放开的数据到原始数据的链接。
· | DROPEFFECT_SCROLL | 在目标中已发生或将要发生一次拖动滚动条的操作。

参数：
pWnd | 指向光标正通过的窗口。
dwKeyState | 包含修饰键的状态。这是下列的一些组合： MK_CONTROL，MK_SHIFT，MK_ALT，MK_LBUTTON，MK_MBUTTON和MK_RBUTTON。
point | 以像素为单位记录光标在屏幕上的相对位置。

说明：
在调用OnDragEnter或者OnDragOver之前由框架调用，用来确定point指定的位置是否在滚动条区域内。当你希望这个事件具有特别的行为时，请重载这个函数。这个函数的缺省实现调用了CView::OnDragScroll，它返回DROPEFFECT_NONE，并且当光标进入窗口边界内的缺省滚动条区域时滚动窗口。


 COleDropTarget::OnDrop

virtual BOOL OnDrop( CWnd* pWnd,
COleDataObject* pDateObject,
DROPEFFECT dropEffect,
CPoint point
);

返回值：如果放开成功则返回非零值；否则返回0。

参数：
pWnd | 指向光标正通过的窗口。
pDataObject | 指向包含可以放开的数据的数据对象。
dropEffect是用户为放开操作选择的效果。它可以是下列中的一个或几个：
· | DROPEFFECT_COPY | 将执行一次拷贝操作。
· | DROPEFFECT_MOVE | 将执行一次移动操作。
· | DROPEFFECT_LINK | 将建立一个从放开的数据到原始数据的链接。
point | 以像素为单位记录光标在屏幕中的相对位置。

说明：
当一次放开操作将要发生时由框架调用。框架首先调用OnDropEx。如果OnDropEx函数并不处理放开操作，则框架就接着调用成员函数OnDrop。一般来说，应用程序要在视类中重载OnDropEx，以能处理鼠标右键的拖放操作。
视类中的OnDrop常常是用来处理简单的拖放的。
COleDropTarget::OnDrop的缺省实现调用了CView::OnDrop，它只是简单的返回缺省值FALSE。
更多的信息，参见“OLE 2 程序员参考，卷1”中的IDropTarget::Drop。

请参阅：
COleDropTarget::OnDragOver, COleDropTarget::OnDragEnter, COleDropTarget::OnDropEx


 COleDropTarget::OnDropEx

virtual DROPEFFECT OnDropEx( CWnd* pWnd,
COleDataObject* pDataObject,
DROPEFFECT dropDefault,
DROPEFFECT dropList,
CPoint point
);

返回值：
返回当在point指定的位置进行放开操作时产生的效果。放开操作的影响将在说明部分进行讨论。

参数：
pWnd | 指向光标正通过的窗口。
pDataObject | 指向包含可以放开数据的数据对象。
dropDefault | 用户选择的缺省放开操作的效果与当前的按键的状态有关。它可以是DROPEFFECT_ NONE。放开操作的影响将在书面部分中进行讨论。
dropList | 放开操作的数据源支持的效果列表。放开操作的效果值可以是用按位的或（|）操作来进行组合。放开操作的影响将在书面部分进行讨论。
point | 以像素为单位记录光标在屏幕中的相对位置。

说明：
当要发生一次放开操作的时候有框架调用。框架首先调用这个参数。如果它不处理这次放开操作，则框架接着就调用OnDrop。通常，为了支持鼠标右键的拖放，你需要重载这个函数。一般来说，视类的OnDrop是用来处理简单的拖放操作的。
COleDropTarget::OnDropEx的缺省实现调用了CView::OnDropEx。缺省的，CView:: OnDropEx只简单地返回一个空值来表明必须调用OnDrop成员函数。
放开效果描述了与放开操作相关的动作。下面是放开效果的列表：
· | DROPEFFECT_NONE | 不允许放开操作。
· | DROPEFFECT_COPY | 将执行一次拷贝操作。
· | DROPEFFECT_MOVE | 将执行一次移动操作。
· | DROPEFFECT_LINK | 将建立一个从被放开的数据到原始数据的链接。
· | DROPEFFECT_SCROLL | 标识在目标中将发生或正在发生一次拖动滚动条的操作。
更多的信息，请参见“OLE 2程序员参考，卷1”中的IDropTarget::Drop。

请参阅：
COleDropTarget::OnDragOver, COleDropTarget::OnDragEnter


 COleDropTarget::Register

BOOL Register( CWnd* pWnd );

返回值：如果注册成功则返回非零值；否则返回0。

参数：
pWnd 指向一个要被注册为放开目标的窗口。

说明：
调用这个函数可以以OLE DLL将你的窗口注册为一个有效的放开目标。
如果要获取更多的信息，请参见“OLE 2程序员参考，卷1”中的RegisterDragDrop。

请参阅：
COleDropTarget::Revoke, COleDropTarget::COleDropTarget


 COleDropTarget::Revoke

virtual void Revoke();

说明：
在销毁任何一个已用COleDropTarget::Register调用注册为放开目标的窗口之前，调用Revoke函数将该窗口从放开目标列表中删掉。此函数在被注册窗口的OnDestroy处理函数中自动被调用，通常不需要显式地调用这个函数。
为了获取更多的信息，参见“OLE 2程序员参考，卷1”中的RevokeDragDrop。


 COleException

CObject
└CException
└COleException

一个COleException对象代表的是与一个OLE操作相关的异常情况。此COleException类包括一个公用数据成员，该成员包含了用来表明此异常的原因的状态代码。
一般来说，应该直接创建一个COleException对象；或者可以调用AfxThrowOleException来代替。
有关异常的更多信息，参见“Visual C++程序员指南”中的文章“异常：OLE异常”。
include <afxole.h>

COleException类成员

数据成员
m_sc 包含指明该异常的原因的状态码

操作
Process 将一个被捕获的异常翻译为一个OLE返回代码。


 COleException::Process

static SCODE PASCAL Process( const CException* pAnyException );

返回值：返回一个OLE状态代码。

参数：
pAnyException 指向一个被捕获的异常的指针。

说明：
此成员函数用来将一个被捕获的异常转换为一个OLE错误代码。
注意：这个函数是一个静态函数。
有关SCODE的更多信息，参见“Platform SDK”中的“COM错误代码”。

请参阅：CException


 COleException::m_sc

SCODE m_sc;

说明：
此数据成员包含了表明异常的原因的OLE状态代码。这个变量的值由AfxThrowOleException来设置。

请参阅：AfxThrowOleException


 COleInsertDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog
└COleDialog
└COleInsertDialog

COleInsertDialog类用于OLE Insert Object对话框。当你要调用这个对话框时，创建一个COleInsertDialog类对象。在构造了一个COleInsertDialog对象后，你就可以使用m_io结构来初始化对话框控件中的控件的值或状态。m_io结构的类型是OLEUINSERTOBJECT。有关使用这个对话框类的更多信息，参见DoModal成员函数。
注意：AppWizard生成的容器代码使用了这个类。
更多的信息，参见“OLE 2.0用户接口库”中的OLEUINSERTOBJECT结构。
#include <afxodlgs.h>
请参阅：COleDialog

COleInsertDialog类成员

数据成员
m_io 一个OLEUIINSERTOBJECT类型的结构，用来控制该对话框的行为

构造
COleInsertDialog 构造一个COleInsertDialog对象

操作和属性
DoModal | 显示该OLE Insert Object对话框
CreateItem | 创建在该对话框中选择的项
GetSelectionType | 获取被选择对象的类型
GetClassID | 获取与被选择项关联的CLSID
GetDrawAspect | 确定是否将该项绘制为一个图标
GetIconicMetafile | 获取一个与这个项的图标形式关联的图元文件的句柄
GetPathName | 获取在该对话框中选择的文件的全路径


 COleInsertDialog::COleInsertDialog

COleInsertDialog( DWORD dwFlags = IOF_SELECTCREATENEW, CWnd* pParentWnd = NULL );

参数：
dwFlags创建标志，包含下列值的任意位或（OR）组合：
· | IOF_SHOWHELP | 指定当对话框被调用时，显示Help按钮。
· | IOF_SELECTCREATENEW | 指定当对话框被调用时，Create New单选按钮将被初始选择。这是缺省的，并且不能与IOF_SELECTCREATEFROMFILE一起使用。
· | IOF_SELECTCREATEFROMFILE | 指定当对话框则调用时，CreateFrom File当选按钮被初始选择。不能与IOF_SELECTCREATENEW一起使用。
· | IOF_CHECKLINK | 指定当对话框被调用时，Link复选框将被初始核选。
· | IOF_DISABLELINK | 指定当对话框被调用时，Link复选框将被初始核选。
· | IOF_CHECKDISPLAYASICON | 指定当对话框被调用时，Display AsIcon复选框将被初始核选，当前图标将被显示，而且Change Icon按钮将会有效。
· | IOF_VERIFYSERVERSEXIST | 指定该对话框将通过确保在对话框显示之前在注册数据库中指定的服务器已经存在来使由它添加到列表框中的类有效。设置这个标志将将明显削弱性能。
pParentWnd 指向该对话框所属的父或宿主窗口对象（CWnd类型）。如果它是NULL，则对话框对象的父窗口被设置为应用程序主窗口。

说明：
此成员函数只用来构造一个COleInsertDialog对象。要显示这个对话框，调用DoModal函数。

请参阅：COleInsertDialog::DoModal


 COleInsertDialog::CreateItem

BOOL CreateItem( COleClientItem* pItem );

返回值：
如果创建了项则返回非零值；否则返回0。

参数：
pItem 指向将要被创建的项。

说明：
只有在DoModal返回IDOK时，此成员函数用来创建一个COleClientItem类型的对象。在你调用这个函数之前，你必须分配COleClientItem对象。

请参阅：
COleClientItem::CreateLinkFromFile, COleClientItem::CreateFromFile, COleClientItem::CreateNewItem, COleClientItem::SetDrawAspect, COleInsertDialog::GetSelectionType, COleInsertDialog::DoModal


 COleInsertDialog::DoModal

virtual int DoModal( );
int DoModal( DWORD dwFlags );

返回值：
返回对话框的完成状态。可以是下列值之一：
· | IDOK | 如果对话框被成功显示。
· | IDCANCEL | 如果用户取消了对话框。
· | IDABORT | 如果发生了一个错误。如果返回的是IDABORT，调用COleDialog::GetLastError成员函数来获取更多有关所发生的错误的类型的信息。可能发生的错误的列表，参见“OLE 2.01用户接口库”中的OleUIInsertObject。

参数：
dwFlags是下列值之一：
· | COleInsertDialog::DocObjectOnly | 将只插入DocObjects。
· | COleInsertDialog::ControlsOnly | 将只插入ActiveX控件。
如果是零，则DoModal将既不插入一个DocObjects，也不插入一个ActiveX控件；它的返回值与上面所列的第一种原形的返回值一样。

说明：
此函数用来显示该OLE Insert Object对话框。
如果你想通过设置m_io结构的成员来初始化不同的对话框控件，你应该在第一DoModal之前，但在对话框对象被构造之后进行。
如果DoModal返回的是IDOK，则你可以调用其它的成员函数来获取用户输入到此对话框中的设置或信息。

请参阅：
COleDialog::GetLastError, CDialog::DoModal, COleInsertDialog::GetSelectionType, COleInsertDialog::GetClassID, COleInsertDialog::GetDrawAspect, COleInsertDialog::GetIconicMetafile, COleInsertDialog::GetPathName, COleInsertDialog::m_io


 COleInsertDialog::GetClassID

const CLSID& GetClassID( ) const;

返回值：返回与被选择项相关的CLSID。

说明：
只有在DoModal返回IDOK时，并且该选择的类型是COleInsertDialog::createNewItem时，才调用此成员函数来获取与所选项关联的CLSID。
更多的信息，参见“OLE 2程序员参考，卷1”中的CLSID Key。

请参阅：
COleInsertDialog::DoModal, COleInsertDialog::GetSelectionType


 COleInsertDialog::GetDrawAspect

DVASPECT GetDrawAspect( ) const;

返回值：
返回显示对象所需要的方法。
· | DVASPECT_CONTENT | 如果Display As Icon复选框没有被核选则返回此值。
· | DVASPECT_ICON | 如果Display As Icon复选框被核选则返回此值。

说明：
此成员函数用来确定用户是否选择了将所选的项显示为图标。如果DoModal返回的是IDOK则调用此函数。
有关绘制方面的更多信息，参见“OLE 2程序员参考，卷1”中的FORMATETC数据结构。

请参阅：
COleInsertDialog::DoModal, COleInsertDialog::COleInsertDialog


 COleInsertDialog::GetIconicMetafile

HGLOBAL GetIconicMetafile( ) const;

返回值：
当通过选择OK关闭对话框时，如果Display As Icon复选框被核选，则返回包含所选项的图标的图元文件的句柄；否则，返回NULL。

说明：
此成员函数用来获取包含所选项的图标的图元文件的句柄。

请参阅：
COleInsertDialog::DoModal, COleInsertDialog::GetDrawAspect


 COleInsertDialog::GetPathName

CString GetPathName( ) const;

返回值：
返回在对话框中选择的文件的全路径。如果选择的类型是createNewItem，则在发行模式下函数返回一个没有意义的CString，在调试模式下则给出一个断言。

说明：
只有在DoModal返回IDOK并且选择的类型不是COleInsertDialog::CreateNewItem时，此成员函数用来获取所选文件的全路径。

请参阅：
COleInsertDialog::GetSelectionType, COleInsertDialog::DoModal


 COleInsertDialog::GetSelectionType

UINT GetSelectionType( ) const;

返回值：返回所做选择的类型。

说明：
当通过选择OK关闭Insert Object对话框时，调用此成员函数来获取所做选择的类型。
返回类型的值由在COleInsertDialog类中定义的Selection枚举类型来指定。
enum Selection
{
createNewItem,
insertFromFile,
linkToFile
};
有关这些值的简短描述如下所示：
· | COleInsertDialog::createNewItem | Create New单选按钮被选择。
· | COleInsertDialog::insertFromFile | Create From File单选按钮被选择，并且Link复选框没有被核选。
· | COleInsertDialog::linkToFile | Create From File单选按钮被选择，并且Link复选框被核选。

请参阅：
COleInsertDialog::DoModal, COleInsertDialog::COleInsertDialog


 COleInsertDialog::m_io

说明：
此数据成员是OLEUIINSERTOBJECT类型的结构，用来控制Insert Object对话框的行为。这个结构的成员可以被直接修改或通过成员函数来修改。

请参阅：
COleInsertDialog::COleInsertDialog, COleInsertDialog::DoModal


 COleIPFrameWnd

CFrameWnd类提供Windows单文档界面重叠或弹出式框架窗口，以及管理窗口的成员。

CObject
└CCmdTarget
└CWnd
└CFrameWnd
└COleIPFrameWnd

使用COleIPFrameWnd类作为你的应用程序的现场可编辑窗口的基础。该类创建工具条并将其安放在你的容器应用程序的文档窗口中。当用户调整现场可编辑窗口的大小时，它还处理由一个嵌入COleResizeBar对象产生的通知。
要获取更多有关使用COleIPFrameWnd，请参见“Visual C++程序员指南”一书中的“激活”。
#include <afxole.h>
请参阅：CFrameWnd

COleIPFrameWnd类成员

构造
COleIPFrameWnd 构造一个COleIPFrameWnd对象

可重载
OnCreateControlBars | 当激活一个现场可编辑的项时被框架调用
RepositionFrame | 由框架调用来改变现场可编辑窗口的位置


 COleIPFrameWnd::COleIPFrameWnd

COleIPFrameWnd();

说明：
此函数构造一个COleFrameWnd对象，并初始化它的现场状态信息，此信息保存在一个OLEINPLACEFRAMEINFO类型的结构中。
要获取更多的信息，请参见“OLE 2程序员参考，卷1”中的OLEINPLACEFRAMEINFO。

请参阅：COleServerDoc::ActivateInPlace


 COleIPFrameWnd::OnCreateControlBars

virtual BOOL OnCreateControlBars( CWnd* pWndFrame, CWnd* pWndDoc );

返回值：
如果成功则返回非零值；否则返回0；

参数：
pWndFrame | 指向包装应用程序的框架窗口的指针。
pWndDoc | 指向包装应用程序的尾矿顶层窗口的指针。如果包装应用程序是一个SDI应用程序，则该参数可以为NULL。

说明：
当一个项因为现场编辑而被激活时，框架调用OnCreateControlBars函数。该函数的缺省实现不做任何事情。可以重载该函数，以执行控制条创建时所要求的任何特定处理。

请参阅：COleServerDoc::ActivateInPlace


 COleIPFrameWnd::RepositionFrame

virtual void RepositionFrame( LPCRECT lpPosRect, LPCRECT lpClipRect );

参数：
lpPosRect | 指向一个RECT结构或CRect对象的指针，此结构或对象中包含框架窗口的当前位置相对于客户区的像素坐标。
lpClipRect | 指向一个RECT结构或CRect对象的指针，此结构或对象中包含框架窗口的当前剪裁矩形相对于客户区的坐标。

说明：
框架调用RepositionFrame成员函数来布局控制条，并重定位现场可编辑窗口，使其全部可见。
容器窗口中控制条的布局不同于非OLE框架窗口执行的布局。非OLE框架窗口从给定框架窗口尺寸计算控制条和其它对象的位置，它与函数CFrameWnd::RecalcLayout调用中的处理相同。客户区是减掉控制条和其它对象所占的空间后所剩的区域。从另一方面讲，COleIPFrameWnd窗口根据给定客户区来定位工具条。换句话来说，CFrameWnd::Recalc- Layout的处理是“从外至内”，而COleFrameWnd::RecalcLayout的处理是“从内至外”。

请参阅：CFrameWnd::RecalcLayout


 COleLinkingDoc

CObject
└CCmdTarget
└CDocument
└COleDocument
└COleLinkingDoc

COleLinkingDoc 类是OLE容器文档的基类，它支持链接到它们所包含的嵌入项。一个支持链接到嵌入项的容器应用程序被称为“链接容器”。示例应用程序OCLIENT就是一个链接容器的例子。
当一个链接项的源是另一个文档的嵌入项时，则为了使嵌入项可以编辑，那个包容文档必须被载入。由于这个原因，当用户想要编辑链接项的源时，容器程序就必须能够由另一个容器应用程序启动。你的应用程序也必须使用COleTemplateServer类以使它在被其它的应用程序启动时能够创建文档。
为了使你的容器应用程序成为一个链接容器，请从COleLinkingDoc派生出你的文档类，而不是从COleDocument派生。同处理其它任何OLE容器程序一样，应用程序必须将自己的类设计为可存储应用程序的本地数据以及嵌入或链接项。而且，你必须为保存你的本地数据设计数据结构。如果你为你的应用程序的本地数据定义了一个CDocItem派生类，你就可以使用由COleDocument定义的界面来保存你的本地数据以及OLE数据。
为了使你的应用程序能够被另一个容器程序启动，请定义一个COleTemplateServer对象作为你的应用程序的CWinApp派生类的成员。
class COleClientApp : public CWinApp
{
// ...
protected:
COleTemplateServer m_server;
// ...
};
在你的CWinApp派生类的成员函数InitInstance中，创建一个文档模板并指定你的COleLinkingDoc派生类为一个文档类：
// CMainDoc is derived from COleLinkingDoc
CMultiDocTemplate* pDocTemplate = new CMultiDocTemplate( IDR_OCLIENTTYPE,
RUNTIME_CLASS(CMainDoc),
RUNTIME_CLASS(CSplitFrame),
RUNTIME_CLASS(CMainView)
);
pDocTemplate->SetContainerInfo( IDR_OCLIENTTYPE_CNTR_IP);
AddDocTemplate(pDocTemplate);

通过调用COleTemplateServer对象的ConnectTemplate成员函数，将此COleTemplateServer对象连接到你的文档模板，并通过调用COleTemplateServer::RegisterAll函数向OLE系统注册所有的类对象。
m_server.ConnectTemplate(clsid, pDocTemplate, FALSE);
COleTemplateServer::RegisterAll();
CWinApp派生类的定义和InitInstance函数的示例，请参见MFC示例OCLIENT中的OCLIENT.H和OCLIENT.CPP。
如果要获取有关使用COleLinkingDoc的更多信息，请参见“Visual C++程序员指南”一书中的文章“容器：实现一个容器”。
#include <afxole.h>
请参阅：CDocTemplate

COleLinkingDoc类成员

构造
COleLinkingDoc 构造一个COleLinkingDoc对象

操作
Register | 向OLE系统DLL注册此文档
Revoke | 撤消文档的注册

可重载
OnFindEmbeddedItem | 查找指定的嵌入项
OnGetLinkedItem | 查找指定的链接项


 COleLinkingDoc::COleLinkingDoc

COleLinkingDoc();

说明：
此函数构造一个COleLinkingDoc对象，但不开始与OLE系统DLL的通信。应用程序必须调用成员函数Register通知OLE文档已经打开。

请参阅：COleLinkingDoc::Register


 COleLinkingDoc::OnFindEmbeddedItem

virtual COleClientItem* OnFindEmbeddedItem( LPCTSTR lpszItemName );

返回值：
返回一个指向指定项的指针；如果没有找到该项则返回NULL。

参数：
lpszItemName 指向所请求的嵌入OLE项名称的指针。

说明：
框架调用此函数来确定文档中是否包含一个具有指定名称的嵌入OLE项。此函数的缺省实现是在嵌入项表中查找具有指定名称的项（名字比较区分大小写）。如果你有你自己的存储或命名嵌入OLE项的方式，请重载该函数。

请参阅：
COleClientItem, COleLinkingDoc::OnGetLinkedItem


 COleLinkingDoc::OnGetLinkedItem

virtual COleServerItem* OnGetLinkedItem( LPCTSTR lpszItemName );

返回值：
指向指定项的指针；如果没有找到该项则返回NULL。

参数：
lpszItemName 指向所请求的链接OLE项名字的指针。

说明：
框架调用该函数检查文档中是否包含一个具有指定名字的链接服务器项。缺省的COleLinkingDoc实现总是返回NULL。该格式在派生类COleServerDoc中被重载，用来在OLE服务器项表中查找一个具有指定名称的链接项（名字比较区分大小写）。如果你已经实现了你自己的存储或检索嵌入OLE项的方式，则重载该函数。

请参阅：
COleServerItem::GetItemName, COleServerItem::SetItemName, COleLinkingDoc::OnFindEmbeddedItem


 COleLinkingDoc::Register

BOOL Register(COleObjectFactory* pFactory, LPCTSTR lpszPathName );

返回值：
如果成功注册文档则返回非零值；否则返回0。

参数：
pFactory | 指向一个OLE库对象的指针（可以是NULL）。
lpszPathName | 指向容器文档的全路径的指针。

说明：
此函数通知OLE系统DLL，文档是打开的。该函数在创建或打开一个已命名文件时被调用，用来向OLE系统DLL注册此文档。如果文档代表一个嵌入项，则不需要调用这个函数。
如果在你的应用程序中正使用COleTemplateServer，则由COleLinkingDoc实现的函数OnNewDocument，OnOpenDocument和OnSaveDocument来调用Register。

请参阅：
COleTemplateServer, COleObjectFactory, CDocument::OnNewDocument, CDocument::OnOpenDocument


 COleLinkingDoc::Revoke

void Revoke();

说明：
此函数通知OLE系统DLL文档不再是打开的。该函数从OLE系统DLL中撤销文档的注册。
当关闭一个已命名文件时，你必须调用这个函数，但是通常不需要直接调用它。由COleLinkingDoc实现的函数OnNewDocument，OnOpenDocument和OnSaveDocument来调用Register。

请参阅：
COleTemplateServer, CDocument::OnCloseDocument, CDocument::OnNewDocument, CDocument::OnOpenDocument, CDocument::OnSaveDocument


 COleLinksDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog
└COleDialog
└COleLinksDialog

COleLinksDialog对象用于OLE Edit Links对话框。当你要调用这个对话框时，可创建一个COleLinksDialog对象。当COleLinksDialog对象被构造之后，你可以使用m_el结构来初始化对话框中各个控件的值或状态。m_el结构是OLEUIEDITLINKS类型。要获取有关使用这个对话框类的更多信息，参见成员函数DoModal。
注意：AppWizard生成的容器代码使用了这个类。
要获取更多的信息，请参见“OLE 2.01用户接口库”中的OLEUIEDITLINKS结构。
要获取更多关于OLE特有对话框的信息，参见“Visual C++程序员指南”一书中的文章“OLE中的对话框”。
#include <afxodlgs.h>
请参阅：COleDialog

COleLinksDialog类成员

数据成员
m_el 类型为OLEUIEDITLINKS的结构，用于控制对话框的行为

构造
COleLinksDialog 构造一个COleLinksDialog对象

操作
DoModal 显示OLE Edit Links对话框


 COleLinksDialog::COleLinksDialog

COleLinksDialog( COleDocument*pDoc, CView* pView, DWORD dwFlags=0, CWnd* pParentWnd = NULL );

参数：
pDoc | 指向OLE文档的指针，该文档包含要编辑的链接。
pView | 指向pDoc上的当前视。dwFlags创建标志，可包含0或ELF_SHOWHELP，用于指定当对话框显示时是否显示Help按钮。
pParentWnd | 指向对话框对象所属的父或属主窗口对象（CWnd类型）。如果该参数为NULL，则对话框的父窗口设置为主应用程序窗口。

说明：
该函数只构造COleLinksDialog对象。要显示对话框，需调用DoModal函数。

请参阅：
COleDocument, COleLinksDialog::DoModal, CView, CWnd


 COleLinksDialog::DoModal

virtual int DoModal();

返回值：
对话框的完成状态。它可以是下面的值：
· | IDOK | 如果对话框被成功显示则返回此值。
· | IDCANCEL | 如果用户取消了对话框则返回此值。
· | IDABORT | 如果发生了错误则返回此值。如果返回的是IDABORT，则调用成员函数COleDialog::GetLastError来获取有关所发生错误的类型的进一步信息。可能发生的错误的列表，请参见“OLE 2.01用户接口库”中的OleUIEditLinks函数。

说明：
此函数用来显示OLE Edit Links对话框。
如果你要通过设置m_el结构的成员来初始化不同的对话框控件，你必须要在调用DoModal之前，对话框对象被销毁之后进行。

请参阅：
COleDialog::GetLastError, CDialog::DoModal, COleLinksDialog::m_el


 COleLinksDialog::m_el

说明：
用来控制Edit Links对话框行为的OLEUIEDITILINKS类型的结构。这个结构的成员可以直接修改，或通过成员函数来修改。
要获取更多的信息，参见“OLE 2.01用户接口库”中的OLEUIEDITLINKS结构。

请参阅：
COleLinksDialog::COleLinksDialog, COleLinksDialog::DoModal


 COleMessageFilter

CObject
└CCmdTarget
└COleMessageFilter

COleMessageFilter类管理OLE应用程序交互所需要的并行能力。
COleMessageFilter类用于可视化编辑服务器和容器应用程序中，以及OLE自动化应用程序中。对于要调用的服务器应用程序，该类可使应用程序保持“忙”的状态，这样其他容器应用程序的调用请求就会被取消或稍后重试。当被调用的应用程序忙时，也可以使用该类确定调用者应用程序将采取什么样的动作。服务器应用程序常用的用法是在文档或其他OLE可访问的对象有可能遭到破坏的情况下调用BeginBusyState 和EndBusyState。在用户界面更新过程中，CWinApp::OnIdle将发起这些调用。
缺省地，当应用程序初始化时就分配一个COleMessageFilter对象。可以使用AfxOleGetMessageFilter检索该对象。
这是一个高级类；你很少需要直接使用该类。
要获得更详细的信息，请参阅“Visual C++ 程序员指南”在线文档中的“服务器：实施一个服务器”一节。
#include <afxole.h>
请参阅：CCmdTarget

COleMessageFilter类成员

构造
COleMessageFilter 构造一个COleMessageFilter对象

操作
Register | 注册OLE系统DLL的消息过滤器
Revoke | 激活OLE系统DLL消息过滤器的注册过程
BeginBusyState | 使应用程序处于忙的状态
EndBusyState | 结束应用程序忙的状态
SetBusyReply | 确定忙的应用程序对OLE调用的回答
SetRetryReply | 确定调用者应用程序对忙应用程序的回答
SetMessagePendingDelay | 确定应用程序要等多长时间才对OLE调用做出响应
EnableBusyDialog | 使能或禁止在被调用的应用程序处于忙状态时所显示的对话框
EnableNotRespondingDialog | 使能或禁止在被调用的应用程序没有响应时所显示的对话框

重载
OnMessagePending 在处理OLE调用时框架调用该方法处理消息


 COleMessageFilter::BeginBusyState

virtual void BeginBusySystem();

说明：
调用该函数将启动忙状态。其与EndBusyState函数一起控制应用程序忙的状态。
SetBusyReply方法确定在应用程序忙时对调用者应用程序所做的响应。
BeginBusyState和EndBusyState分别增加或减少用于决定应用程序忙状态的计数器。例如，调用BeginBusyState两次和调用EndBusyState一次将导致忙状态。要取消忙状态，调用EndBusyState的次数与调用BeginBusyState的次数必须相等。
缺省地，框架在空闲处理过程中进入忙状态，这是由CWinApp::OnIdle来执行的。当应用程序正在处理ON_COMMANDUPDATEUI通知时，发来的调用请求将稍后处理，要等到空闲处理过程完成之后。

请参阅：
COleMessageFilter::EndBusyState, COleMessageFilter::SetBusyReply, CWinApp::OnIdle


 COleMessageFilter::COleMessageFilter

COleMessageFilter();

说明：创建一个COleMessageFilter对象。

请参阅：
COleMessageFilter::Register, COleMessageFilter::Revoke


 COleMessageFilter::EnableBusyDialog

void EnableBusyDialog( BOOL bEnableBusy = TRUE );

参数：
bEnableBusy 指明“忙”对话框是使能还是禁止。

说明：
使能或禁止忙对话框，在OLE调用过程中当发送消息逾期而没有回应时（请参阅SetRetryReply），将显示该对话框。

请参阅：
COleMessageFilter::EnableNotRespondingDialog, COleMessageFilter::BeginBusyState, COleMessageFilter::SetBusyReply, COleMessageFilter::SetRetryReply, COleBusyDialog


 COleMessageFilter::EnableNotRespondingDialog

void EnableNotRespondingDialog( BOOL bEnableNotResponding = TRUE )

参数：
bEnableNotResponding 指明“无响应”对话框是使能还是禁止。

说明：
使能或禁止“无响应”对话框，在OLE调用过程中发送键盘或鼠标消息而该调用过程超时就显示该对话框。

请参阅：
COleMessageFilter::EnableBusyDialog, COleMessageFilter::BeginBusyState, COleMessageFilter::SetBusyReply, COleBusyDialog


 COleMessageFilter::EndBusyState

virtual void EndBusyState();

说明：
调用该函数结束忙状态。其与BeginBusyState函数一起控制应用程序忙的状态。
函数SetBusyReply决定在其处于忙状态时对调用者应用程序的响应。
BeginBusyState和EndBusyState分别增加或减少用于决定应用程序忙状态的计数器。例如，调用BeginBusyState两次和调用EndBusyState一次将导致忙状态。
要取消忙状态，调用EndBusyState的次数与调用BeginBusyState的次数必须相等。
缺省地，框架在空闲处理过程中进入忙状态，这是由CWinApp::OnIdle来执行的。当应用程序正在处理ON_UPDATE_COMMAND_UI通知时，发来的调用请求将稍后处理，要等到空闲处理过程完成之后。

请参阅：
COleMessageFilter::BeginBusyState, COleMessageFilter::SetBusyReply, CWinApp::OnIdle


 COleMessageFilter::OnMessagePending

virtual BOOL OnMessagePending( const MSG* pMsg );

返回值：非0代表成功；否则，就返回0。

参数：
pMsg 要发送消息的指针。

说明：
在OLE调用过程中框架调用该函数处理消息。
当调用者应用程序在等待调用完成时，框架就调用OnMessagePending方法，其参数是一个指向要发送消息的制止。缺省地，框架发送WM_PAINT消息，因此在一个花费很长时间的调用过程中出口仍可以更新。
在消息过滤器活动之前，你必须调用Register对消息过滤器进行注册。

请参阅：
COleMessageFilter::Register, AfxOleInit, CWinApp::InitInstance


 COleMessageFilter::Register

BOOL Register();

返回值：非0代表成功；否则，就返回0。

说明：
该函数注册OLE系统DLL的消息过滤器。一个消息过滤器不起作用，除非向系统DLL进行注册。通常，你在应用程序初始化代码中注册应用程序的消息过滤器。你的应用程序所注册的任何消息过滤器在应用程序终止之前都应调用Revoke函数撤销注册信息。
框架缺省的消息过滤器在初始化时自动进行了注册，并在终止之前自动撤销。

请参阅：COleMessageFilter::Revoke


 COleMessageFilter::Revoke

void Revoke();

说明：
撤销以前调用Register所注册的信息。在应用程序终止之前应撤销消息过滤器。由框架自动创建和注册的缺省消息过滤器也将自动被撤销。

请参阅：COleMessageFilter::Register


 COleMessageFilter::SetBusyReply

void SetBusyReply(SERVERCALL nBusyReply);

参数：
nBusyReplySERVERCALL枚举集合中的一个值，在COMPOBJ.H文件中定义。可以是下面的一个值：
· | SERVERCALL_ISHANDLED | 应用程序可以接受调用，但在处理某些特殊的调用过程中可能会失败。
· | SERVERCALL_REJECTED | 应用程序可能永远都不会处理该调用。
· | SERVERCALL_RETRYLATER | 应用程序处于暂时不能处理调用的状态中。

说明：
该函数将应用程序设置为“忙-响应”状态。BeginBusyState和EndBusyState函数控制着应用程序忙的状态。
当调用BeginBusyState函数将应用程序设置为忙状态时，其对来自OLE系统DLL调用的响应值是由最近调用SetBusyReply函数的设置值所决定的。调用者应用程序使用该忙-响应信息决定采取什么动作。
缺省地，忙－响应是SERVERCALL_RETRYLATER。该响应消息导致调用者应用程序尽快重试该调用过程。

请参阅：
COleMessageFilter::BeginBusyState, COleMessageFilter::EndBusyState


 COleMessageFilter::SetMessagePendingDelay

void SetMessagePendingDelay( DWORD nTimeout = 5000 );

参数：
nTimeout 消息延迟发送的秒数。

说明：
该函数决定在调用者应用程序将在多长时间内等待被调用应用程序的响应，过了该时间，调用者应用程序将采取进一步的动作。
该函数与SetRetryRelay函数协同工作。

请参阅：COleMessageFilter::SetRetryReply


 COleMessageFilter::SetRetryReply

void SetRetryReply( DWORD nRetryReply = 0 );

参数：
nRetryReply 两次重试之间所等待的秒数。

说明：
该函数将决定调用者应用程序在收到被调用应用程序的忙响应信息时所采取的动作。
当被调用的应用程序指明自己忙时，调用者应用程序可能会决定等待直到服务器不再忙、立刻重试或在指定的间隔后重试。也可能决定取消本次调用。
调用者的响应是由SetRetryReply和SetMessagePendingDelay控制的。
SetRetryReply决定调用者应用程序在重试调用时应等待多长时间。
SetMessagePendingDelay决定调用者应用程序在采取进一步动作之前等待服务器做出响应的时间。
通常，缺省值都是可接受的，不需要修改。框架将每隔nRetryRelay毫秒就重试调用，直到调用成功或者超出了消息发送延迟时间规定。nRetryRelay取0值则意味着立即重试，-1则意味着取消本次调用。
当超出消息延迟发送时间限制时，就显示OLE“忙-对话框”，这样用户就可以选择是取消本次调用还是重试。调用EnableBusyDialog函数来使能或禁止该对话框。
当在调用过程中发送键盘或鼠标消息而调用超时时（超出了消息发送延迟规定），就显示“无响应”对话框。调用EnableNotRespondingDialog来使能或禁止该对话框。通常，这种状态意味着某些东西出现了错误，用户已经不耐烦了。
当禁止该对话框时，对于调用处于忙状态的应用程序总是使用当前“重试响应”。

请参阅：
COleBusyDialog, COleMessageFilter::EnableNotRespondingDialog, COleMessageFilter::EnableBusyDialog, COleMessageFilter::SetMessagePendingDelay


 COleObjectFactory

CObject
└CCmdTarget
└COleObjectFactory

COleObjectFactory类实现了OLE类工厂，此工厂创建诸如服务器，自动化对象和文档之类的OLE对象。
COleObjectFactory类有用来执行下列功能的成员函数：
· | 管理对象的注册。
· | 更新OLE系统注册和运行时注册，运行时注册用来通知OLE对象正在运行并准备接收信息。
· | 通过限制注册用户在设计时的使用和注册应用程序在运行时的使用来强迫注册。
· | 向OLE系统注册表注册控件对象工厂。
如果要获取更多有关对象创建的信息，请参见文章“数据对象和数据源（OLE）”和“数据对象和数据源：创建和析构”。更多与注册有关的信息，请参见文章“注册”。这些文章都在“Visual C++程序员指南”一书中。
#include <afxdisp.h>
请参阅：COleTemplateServer

COleObjectFactory类成员

构造
COleObjectFactory 构造一个COleObjectFactory对象

操作
Register | 向OLE系统DLLs注册这个对象工厂
RegisterAll | 向OLE系统DLLs注册应用程序的所有对象工厂
Revoke | 从OLE系统DLLs中撤销这个对象工厂的注册
RevokeAll | 从OLE系统DLLs中撤销应用程序所有对象工厂的注册
UpdateRegistryAll | 向OLE系统注册表注册应用程序的所有对象工厂

属性
IsRegistered | 指示对象工厂是否已向OLE系统DLL注册
GetClassID | 返回此工厂创建的对象的OLE类ID

可重载
OnCreateObject | 由框架调用来创建这个工厂对象的一个新对象
UpdateRegistry | 向OLE系统注册表注册这个工厂对象
VerifyUserLicense | 检验控件是否为设计时使用许可
GetLicenseKey | 从控件的DLL请求一个唯一的键
VerifyLicenseKey | 校验控件的嵌入键是否与其容器的嵌入键匹配


 COleObjectFactory::COleObjectFactory

COleObjectFactory( REFCLSID clsid,
CRuntimeClass* pRuntimeClass,
BOOL bMultiInstance,
LPCTSTR lpszProgID
);

参数：
clsid | 这个对象工厂所代表的OLE类ID的引用。
pRuntimeClass | 指向这个工厂能够创建的C++对象的运行时类的指针。
bMultiInstance | 指示应用程序的单一实例是否能够支持多实例化。如果是TRUE，则对于每一个创建对象的请求将启动应用程序的多个实例。
lpszProgID | 指向一个包含程序的文字标识符的字符串指针，比如说“Microsoft Excel”。

说明：
构造一个COleObjectFactory对象，将它初始化为一个没有注册的对象工厂，并将它添加到工厂列表中。但是为了使用这个对象，你必须注册它。
更多的信息参见“OLE 2程序员参考，卷1”中的CLSID Key。

请参阅：CRuntimeClass


 COleObjectFactory::GetClassID

REFCLSID GetClassID() const;

返回值：
返回这个工厂所代表的OLE类ID的引用。

说明：
返回这个工厂所代表的OLE类ID的引用。
要获取更多的信息，请参见“OLE 2程序员参考，卷1”中的CLSID Key。

请参阅：COleObjectFactory::COleObjectFactory


 COleObjectFactory::GetLicenseKey

virtual BOOL GetLicenseKey( DWORD dwReserved,BSTR *pbstrKey );

返回值：
如果许可键字符串不是NULL则返回非零值；否则返回0。

参数：
dwReserved | 为将来的使用保留。
pbstrKey | 指向BSTR的指针，BSTR是用来保存许可键的。

说明：
从控件的DLL中请求一个唯一的许可键，并将它保存在有pbstrKey指向的BSTR中。
这个函数的缺省实现返回0，而且不向BSTR中保存任何东西。如果你使用MFCActiveX ControlWizard来创建你的项目，ControlWizard提供一个重载后的函数，该函数获取控件的许可键。

请参阅：
COleObjectFactory::VerifyUserLicense, COleObjectFactory::VerifyLicenseKey


 COleObjectFactory::IsRegistered

BOOL IsRegistered() const;

返回值：
如果注册了这个工厂则返回非零值；否则返回0。

说明：
如果已经向OLE系统DLLs注册了这个工厂则返回非零值。

请参阅：
COleObjectFactory::Register, COleObjectFactory::Revoke


 COleObjectFactory::OnCreateObject

virtual CCmdTarget* OnCreateObject();

返回值：
指向被创建的东西的指针。如果失败则会抛出一个内存异常。

说明：
由框架调用来创建一个新对象。为了从某些不是传递给构造函数的CRuntimeClass的东西来创建对象，请重载这个函数。

请参阅：
COleObjectFactory::COleObjectFactory, CRuntimeClass


 COleObjectFactory::Register

BOOL Register();

返回值：
如果成功地注册了这个工厂则返回非零值；否则返回0。

说明：
向OLE系统DLLs注册这个对象工厂。通常当应用程序被启动时，由CWinApp::InitInstance调用这个函数。

请参阅：
COleObjectFactory::Revoke, COleObjectFactory::RegisterAll, CWinApp::InitInstance


 COleObjectFactory::RegisterAll

static BOOL PASCAL RegisterAll()

返回值：
如果成功地注册了这个工厂则返回非零值；否则返回0。

说明：
向OLE系统DLLs注册应用程序的所有对象工厂。通常当应用程序被启动时，由CWinApp:: InitInstance调用这个函数。

请参阅：
COleObjectFactory::Revoke, COleObjectFactory::Register, CWinApp::InitInstance


 COleObjectFactory::Revoke

void Revoke();

说明：
从OLE系统DLLs中撤销这个对象工厂的注册。在应用程序终止前框架自动调用这个函数。如果必需的话，可以从重载的CWinApp::ExitInstance调用它。

请参阅：
COleObjectFactory::RevokeAll, COleObjectFactory::Register, CWinApp::ExitInstance


 COleObjectFactory::RevokeAll

static void PASCAL RevokeAll();

说明：
从OLE系统DLLs中撤销应用程序的所有对象工厂的注册。在应用程序终止前框架自动调用这个函数。如果必须的话，可以从重载的CWinApp::ExitInstance调用它。

请参阅：
COleObjectFactory::Revoke, COleObjectFactory::RegisterAll, CWinApp::ExitInstance


 COleObjectFactory::UpdateRegistry

void UpdateRegistry (LPCTSTR lpszProgID = NULL);
virtual void UpdateRegistry( BOOL bRegister ) = 0;

参数：
lpszProgID | 是指向一个字符串的指针，该字符串是人可阅读的程序标识符，比如说“Excel.Document.5”。
bRegister | 指示控件类的对象工厂是否已经被注册。

说明：
下面是有关这个函数的两种形式的简短讨论：
· | UpdateRegistry(lpszProgID) | 向OLE系统注册表注册这个对象工厂。这个函数通常由CWinApp::InitInstance在应用程序被启动时调用。
· | UpdateRegistry(bRegister) | 该函数的这种形式是可重载的。如果bRegister为TRUE，则此函数向系统注册表注册这个控件类。否则不注册这个类。
如果你使用MFC ActiveX ControlWizard来创建你的项目，ControlWizard支持对这个函数的重载。

请参阅：
COleObjectFactory::Revoke, COleObjectFactory::Register, COleObjectFactory::UpdateRegistryAll, CWinApp::InitInstance


 COleObjectFactory::UpdateRegistryAll

static void PASCAL UpdateRegistryAll();

说明：
向OLE系统注册表注册应用程序的所有的对象工厂。此函数通常在应用程序被启动时被CWinApp::InitInstance调用。

请参阅：
COleObjectFactory::Revoke, COleObjectFactory::Register, COleObjectFactory::UpdateRegistry, CWinApp::InitInstance


 COleObjectFactory::VerifyLicenseKey

virtual BOOL VerifyLicenseKey( BSTR bstrKey );

返回值：
如果运行时许可有效则返回非零值；否则返回0。

参数：
bstrKey 是一个用来保存容器的许可字符串版本的BSTR。

说明：
这个函数检验容器是否允许使用OLE控件。缺省的版本调用GetLicenseKey来获得一个有关控件的许可字符串的拷贝，并将这个拷贝与bstrKey中的字符串进行比较。如果两个字符串相匹配，函数就返回一个非零值，否则返回0。为了提供可定制的许可检验，你可以重载这个函数。

请参阅：
COleObjectFactory::VerifyUserLicense, COleObjectFactory::GetLicenseKey


 COleObjectFactory::VerifyUserLicense

virtual BOOL VerifyUserLicense();

返回值：
如果设计时许可有效则返回非零值；否则返回0。

说明：检验OLE控件的设计时许可。

请参阅：
COleObjectFactory::VerifyLicenseKey, COleObjectFactory::GetLicenseKey


 COlePasteSpecialDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog
└COleDialog
└COlePasteSpecialDialog

COlePasteSpecialDialog类用于OLE Paste Special对话框。当应用程序想要调用这个对话框时，可创建一个COlePasteSpecialDialog对象。当构造了COlePasteSpecialDialog对象之后，应用程序可用m_ps结构来初始化对话框各个控件的值或状态。m_ps结构是OLEUIPASTESPECIAL类型。
如果要获取有关OLE专用对话框的信息，请参阅“Visual C++程序员指南”一书中的文章“OLE中的对话框”。
#include <afxodlgs.h>
请参阅：COleDialog

COlePasteSpecialDialog类成员

数据成员
m_ps 一个控件对话框功能的OLEUIPASTESPECIAL类型的结构

构造
COlePasteSpecialDialog 构造一个COlePasteSpecialDialog对象

操作和属性
DoModal | 显示OLE Paste Special对话框
AddFormat | 将定制格式增加到应用程序可以粘贴的格式表中
AddStandardFormats | 将CF_BITMAP，CF_DIB，CF_METAFILEPICT和CF_LINKSOURCE增加到应用程序的可粘贴格式表中
CreateItem | 用指定格式在容器文档中创建项
GetSelectionType | 获取所选择项的类型
GetDrawAspect | 判定是否将项绘制成一个图标
GetIconicMetafile | 获取与此项的图标格式相关联的源文件的句柄
GetPasteIndex | 获取用户选择的可用粘贴项的索引


 COlePasteSpecialDialog::AddFormat

void AddFormat( const FORMATETC& fmt, LPTSTR lpstrFormat, LPTSTR lpstrResult, DWORD flags );
void AddFormat( UINT cf, DWORD tymed, UINT nFormatID, BOOL bEnableIcon, BOOL bLink );

参数：
fmt | 对要添加的数据类型的引用。
lpstrFormat | 向用户描述格式的字符串。
lpstrResult | 如果对话框中选择了此格式，则该参数为描述结构的字符串。
flags | 指定此格式可用的不同链接和嵌入项。此标志是一个或多个不同的OLEUIPASTEFLAG枚举值的位或组合。
cf | 要添加的剪贴板格式。
tymed | 格式中可用的媒介类型。它是一个或多个TYMED枚举值的位或组合。
nFormatID | 标识格式的字符串的ID。这个格式字符串是两个“\n”字符间隔的独立字符串。第一个字符串与lpstrFormat参数中传递的字符串相同；第二个字符串与lpstrResult参数相同。
bEnableIcon | 一个标志，用于确定当在列表框中选择此格式时，Display As Icon 复选框是否活动。
bLink | 一个标志，用于确定当在列表框中选择此格式时，Paste Link单选按钮是否活动。

说明：
这个函数将几种新格式增加到应用程序可在Paste Special操作中支持的格式表中。该函数可用于增加标准格式如CF_TEXT或CF_TIFF，也可用于增加应用程序已向OLE系统注册的定制格式。有关向应用程序中粘贴数据对象的详细信息，参考“Visual C++程序员指南”一书中的文章“数据对象和数据源：操作”。
要获取更多的信息，请参见“OLE 2.01用户接口库”中的OLEUIPASTEFLAG枚举类型。

请参阅：
COlePasteSpecialDialog::AddStandardFormats


 COlePasteSpecialDialog::AddStandardFormats

void AddStandardFormats( BOOL bEnableLink = TRUE );

参数：
bEnableLink 一个标志，用于确定是否将CF_LINKSOURCE增加到应用程序可粘贴的格式表中。

说明：
此函数用于将一系列剪贴板格式增加到应用程序在Paste Special操作中可支持的格式表中：
· | CF_BITMAP
· | CF_DIB
· | CF_METAFILEPICT
· | “嵌入对象（Embedded Object）”
· | （可选）“链接源（Link Source）”
这些格式是用来支持嵌入和链接的。

请参阅：COlePasteSpecialDialog::AddFormat


 COlePasteSpecialDialog::COlePasteSpecialDialog

COlePasteSpecialDialog( DWORD dwFlags = PSF_SELECTPASTE, COleDataObject* pDataObject = NULL, CWnd* pParentWnd = NULL );

参数：
dwFlags创建标志，包含下列标志中的任意多个，各值之间用位或OR操作符组合：
· | PSF_SELECTPASTE | 表明当调用对话框时，Paste单选按钮被初始选中。该标志不能和PSF_SELECTPASTELINK一起使用。它是缺省值。
· | PSF_SELECTPASTELINK | 表明当调用对话框时，Paste Link单选按钮被初始选中。该标志不能与PSF_SELECTPASTE一起使用。
· | PSF_CHECKDISPLAYASICON | 表明当调用对话框时，Display As Icon复选框被初始选中。
· | PSF_SHOWHELP | 表明当调用对话框时，将显示Help按钮。
pDataObject | 指向剪贴板上的COleDataObject对象。
pParentWnd | 指向对话框对象所属的父或属主窗口对象（CWnd类型）。如果该参数为NULL，则对话框的父窗口设置为主应用程序窗口。

说明：
此函数只创建COlePasteSpecialDialog对象。要显示此对话框，需调用DoModal函数。
要获取更多的信息，请参见“OLE 2.01用户接口库”中的OLEUIPASTEFLAG枚举类型。

请参阅：
COleDataObject, COlePasteSpecialDialog::DoModal


 COlePasteSpecialDialog::CreateItem

BOOL CreateItem( COleClientItem* pNewItem );

返回值：
如果创建成功则返回非零值；否则返回0。

参数：
pNewItem 指向一个COleClientItem实例。该参数不能是NULL。

说明：
此函数创建在Paste Special对话框中所选择的新项。该函数只应在DoModal返回IDOK之后被调用。

请参阅：
COleClientItem, COlePasteSpecialDialog::DoModal, COlePasteSpecialDialog::GetSelectionType, COlePasteSpecialDialog::COlePasteSpecialDialog


 COlePasteSpecialDialog::DoModal

virtual int DoModal();

返回值：
对话框完成的状态。它可以是下列值之一：
· | IDOK | 如果成功显示了对话框。
· | IDCANCEL | 如果用户取消了对话框。
· | IDABORT | 如果返回的是IDABORT，则要调用COleDialog::GetLastError成员函数来获取有关所发生的错误类型的进一步信息。可能发生的错误的列表，请参见“OLE 2.01用户接口库”中的OleUIPasteSpecial函数。

说明：
此函数用来显示OLE Paste Special 对话框。
如果你想通过设置m_ps结构的成员函数来初始化不同的对话框控件，则你必须在调用DoModal之前，但在构造了对话框对象之后进行。
如果DoModal返回IDOK，则你可以调用其它成员函数来获取各个设置或由用户在对话框中输入的信息。

请参阅：
COleDataObject, COleDialog::GetLastError, CDialog::DoModal, COlePasteSpecialDialog::COlePasteSpecialDialog, COlePasteSpecialDialog::GetDrawAspect, COlePasteSpecialDialog::GetIconicMetafile, COlePasteSpecialDialog::GetPasteIndex, COlePasteSpecialDialog::GetSelectionType


 COlePasteSpecialDialog::GetDrawAspect

DVASPECT GetDrawAspect() const;

返回值：
返回用来显示对象的方法。
· | DVASPECT_CONTENT | 如果当对话框消失时，Display As Icon复选框未被选择，则返回此值。
· | DVASPECT_ICON | 如果当对话框消失时，Display As Icon复选框被选择，则返回此值。

说明：
此函数用来确定用户是否选择了将所选项显示为一个图标。仅在DoModal返回IDOK后才调用这个函数。
要获取更多有关绘制方面的信息，请参见“OLE 2程序员参考，卷1”中的FORMATETC结构。

请参阅：
COlePasteSpecialDialog::DoModal


 COlePasteSpecialDialog::GetIconicMetafile

HGLOBAL GetIconicMetafile() const;

返回值：
如果在选择OK取消对话框时，Display As Icon复选框被选择，则返回值为包含所选项的图标特征的源文件句柄；否则返回值为NULL。

说明：
此函数获取与用户所选项相关联的源文件。

请参阅：
COlePasteSpecialDialog::GetDrawAspect, COlePasteSpecialDialog::DoModal


 COlePasteSpecialDialog::GetPasteIndex

int GetPasteIndex() const;

返回值：
返回值为用户所选项在OLEUIPASTEENTRY结构数组中的索引。在执行粘贴操作时，将使用对应于所选索引的格式。

说明：
此函数获取与用户所选项相关的索引值。
如果要获取更多的信息，请参见“OLE 2.01用户接口库”中的OLEUIPASTEENTRY结构。

请参阅：
COlePasteSpecialDialog::DoModal


 COlePasteSpecialDialog::GetSelectionType

UINT GetSelectionType() const;

返回值：返回所作的选择的类型。

说明：
此函数用来决定用户所作的选择的类型。
返回类型的值由Selection枚举类型指定，该枚举类型是在COlePasteSpecialDialog类中声明的。
enum Selection
{
pasteLink,
pasteNormal,
pasteOther,
pasteStatic
};
有关这些值的简短说明如下所示：
· | COlePasteSpecialDialog::pasteLink | Paste Link单选按钮被选择，所选的格式是一个标准的OLE格式。
· | COlePasteSpecialDialog::pasteNormal | Paste单选按钮被选择，所选的格式是一个标准的OLE格式。
· | COlePasteSpecialDialog::pasteOther | 被选择的格式不是一个标准的格式。
· | COlePasteSpecialDialog::pasteStatic | 被选择的格式是一个图元文件。

请参阅：COlePasteSpecialDialog::DoModal


 COlePasteSpecialDialog::m_ps

说明：
此数据成员是一个OLEUIPASTESPECIAL类型的结构，用于控制Paste Special对话框的行为。该结构的成员可以被直接修改，也可以通过成员函数修改。

请参阅：
COlePasteSpecialDialog::COlePasteSpecialDialog, COlePasteSpecialDialog::DoModal


 COlePropertiesDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog
└COleDialog
└COlePropertiesDialog

COlePropertiesDialog类封装了Windows通用的OLE 对象属性对话框。通用OLE对象属性对话框提供了用与Windows一致的风格来显示和修改OLE文档项属性的简单方法。这些属性包括，文档项所代表的文件的信息，用于显示按比例缩放的图标和图像的属性，以及有关项的链接的信息（如果该项是链接项的话），还有其它一些。
为了使用一个COlePropertiesDialog对象，首先要用COlePropertiesDialog构造函数来创建这个对象。在对话框被构造出来以后，调用DoModal成员函数来显示这个对话框并使用户能够修改这个项的任何属性。不管选择的是OK（IDOK）按钮还是Cancel（IDCANCEL）按钮DoModal都返回。除了OK和Cancel按钮，还有一个Apply按钮。当用户选择了Apply按钮时，任何有关这个文档项的属性的变化都应用到这个项中，其图像就会自动被更新，但是它仍然是活动的。
m_psh数据成员是一个指向PROPSHEETHEADER结构的指针，在许多情况下，你不需要显式地访问它。但是当你在除了缺省的General，View和Link页外需要额外的页时，你就必须显式地访问它了。在这种情况下，你可以在调用DoModal成员函数之前来修改m_psh数据成员，使它包括你的定制页。
如果要获取更多的有关OLE对话框的信息，请参见“Visual C++程序员指南”一书中的文章“OLE中的对话框”。
#include <afxodlgs.h>
请参阅：COleDialog, CPropertyPage

COlePropertiesDialog类成员

构造
COlePropertiesDialog 构造一个COlePropertiesDialog对象

数据成员
m_gp | 用来初始化COlePropertiesDialog对象的“General“页面的结构
m_lp | 用来初始化COlePropertiesDialog对象的“Link“页面的结构
m_op | 用来初始化COlePropertiesDialog对象的结构
m_psh | 用来增加额外的定制属性页面的结构
m_vp | 用来定制COlePropertiesDialog对象的“View“页面的结构

操作
DoModal 显示对话框并允许用户作一个选择

可重载
OnApplyScale 当文档项的缩放比例改变时由框架调用


 COlePropertiesDialog::COlePropertiesDialog

COlePropertiesDialog( COleClientItem* pItem, UINT nScaleMin = 10, UINT nScaleMax = 500, CWnd* pParentWnd = NULL );

参数：
pItem | 指向一个正被访问的文档项的指针。
nScaleMin | 文档项图像的最小缩放比例百分比。
nScaleMax | 文档项图像的最大缩放比例百分比。
pParentWnd | 指向对话框的父或属主的指针。

说明：
此成员函数用来创建一个COlePropertiesDialog对象。为了使你的文档项能够实现按比例缩放，请从COlePropertiesDialog类来派生你的通用OLE ObjectProperties对话框类。任何用这个类的实例实现的对话框都不能支持文档项的按比例缩放。
缺省的，通用OLE Object Properties对话框具有三个缺省的页面：
· | General 此页面包含了选中的文档项所代表的文件的系统信息。在这一页上，用户可以把选中的项转换为其他的类型。
· | View 此页面包含了显示这个文档项，改变图标，以及改变图像的缩放比例等选项。
· | Link 此页面包含了改变链接项的位置和更新链接项的选项。在这个页面上，用户可以中断所选项的链接。
要增加除那些缺省页面之外的页面，在退出你的COlePropertiesDialog派生类的构造函数之前修改m_psh成员变量就可以了。这是COlePropertiesDialog构造函数的高级实现。

请参阅：
COlePropertiesDialog::OnApplyScale


 COlePropertiesDialog::DoModal

virtual int DoModal();

返回值：
如果成功则返回IDOK或IDCANCEL；否则返回0。IDOK和IDCANCEL都是常量，它们指示用户是选择了OK按钮还是Cancel按钮。
如果返回的是IDCANCEL，你可以调用函数Windows CommDlgExtendedError来确定是否发生了一个错误。

说明：
这个成员函数用来显示Windows通用OLE Object Properties对话框，并允许用户查看或改变文档项的各个属性。

请参阅：
COlePropertiesDialog::OnApplyScale, COlePropertiesDialog::m_psh


 COlePropertiesDialog::OnApplyScale

virtual BOOL OnApplyScale( COleClientItem* pItem, int nCurrentScale, BOOL bRelativeToOrig );

返回值：若已处理则返回非零值; 否则为0

参数：
pItem | 指向其属性正在被访问的文档项的指针。
nCurrentScale | 对话框比例的数字值。
bRelativeToOrig | 表明缩放比例是否适用于文档项的原始大小。

说明：
当缩放比例值被改变，并且没有选择OK或Apply时，由框架调用这个函数。
缺省的实现什么也没做。为了可以进行缩放比例控制，你必须重载这个函数。
注意：
在通用OLE Object Properties 对话框显示之前，框架将pItem置为NULL，将nCurrentScale置为-1来调用这个函数。这用来决定是否可以进行缩放比例控制。

请参阅：COlePropertiesDialog::DoModal


 COlePropertiesDialog::m_gp

说明：
是一个OLEUIGNRLPROPS类型的结构，它用来初始化OLE Object Properties对话框中的General页面。此页面显示了一个嵌入项的类型和大小，并且允许用户访问Convert对话框。如果对象是一个链接，这个页面也显示链接目标。
如果要获取更多有关OLEUIGNRLPROPS结构的信息，请参见OLE文档。


 COlePropertiesDialog::m_lp

说明：
一个OLEUILINKPROPS类型的结构，用来初始化OLE Object Properties对话框中的Link页面。此页面显示了被链接项的位置，并允许用户更新或中断指向这个项的链接。
要获取更多的有关OLEUILINKPROPS结构的信息，请参见OLE文档。


 COlePropertiesDialog::m_op

说明：
一个OLEUIOBJECTPROPS类型的结构，用来初始化OLE Object Properties对话框中的Link页面。这个结构包含了用来初始化General，Link和View页面的成员。
要获取更多的信息，请参见OLE文档中的OLEOBJECTPROPS和OLEUILINKPROPS结构。


 COlePropertiesDialog::m_psh

说明：
一个PROPSHEETHEADER类型的结构，它的成员保存了对话框对象的特征。
在构造了一个COlePropertiesDialog对象之后，在调用DoModal成员函数之前，你可以使用m_psh来设置对话框的不同方面。
要获取更多有关PROPSHEETHEADER结构的信息，参见Win32 SDK文档。

请参阅：COlePropertiesDialog::DoModal


 COlePropertiesDialog::m_vp

说明：
一个OLEUIOBJECTPROPS类型的结构，用来初始化OLE Object Properties对话框中的View页面。此页面允许用户在“内容”和“图标”之间切换对对象的查看，并在容器内改变它的缩放比例。当对象显示为一个图标时，它也允许用户访问Change Icon对话框。
要获取更多有关OLEUIVIEWPROPS结构的信息，请参见OLE文档。


 COlePropertyPage

CObject
└CCmdTarget
└CWnd
└CDialog
└COlePropertyPage

COlePropertyPage类以类似于对话框的图形化界面来显示定制控件的属性。例如，一个属性页可能会包含一个编辑控件，允许用户查看和修改控件的标题属性。
每一个定制的或普通的控件属性都可以有一个对话框控件来允许控件的用户查看当前的属性值，如果有必要的话还可以修改这个值。
要获取更多有关使用COlePropertyPage的信息，请参见“Visual C++程序员指南”一书中的文章“ActiveX控件：属性页”，和“Visual C++教程”中的“修改缺省的属性页”。
#include <afxctl.h>
请参阅：CDialog

COlePropertyPage类成员

构造
COlePropertyPage 构造一个COlePropertyPage对象

操作
GetObjectArray | 返回由属性页编辑的对象数组
SetModifiedFlag | 设置一个标志，该标志用来表明用户是否修改了属性页
IsModified | 表明用户是否修改了属性页
GetPageSite | 返回一个指向属性页的IPropertyPageSite接口的指针
SetDialogResource | 设置属性页的对话框资源
SetPageName | 设置属性页的名称（标题）
SetHelpInfo | 设置属性页的简短帮助文本，帮助文件的名称，以及帮助的上下文
GetControlStatus | 表明用户是否修改了控件中的值
SetControlStatus | 设置一个标志来表明用户是否修改了控件中的值
IgnoreApply | 确定是哪一个控件没有使能Apply按钮

可重载
OnEditProperty | 当用户编辑一项属性时由框架调用
OnHelp | 当用户激活帮助时由框架调用OnInitDialog当初始化属性页时由框架调用
OnObjectsChanged | 当选择了其它具有新属性的OLE控件时由框架调用
OnSetPageSite | 当属性框架提供页面的位置时由框架调用


 COlePropertyPage::COlePropertyPage

COlePropertyPage( UINT idDlg, UINT idCaption );

参数：
idDlg | 对话框模板的资源ID。
idCaption | 属性页的标题的资源ID。

说明：
当你实现COlePropertyPage的一个子类的时候，这个子类的构造函数应该使用COlePropertyPage的构造函数来标识对话框模板资源，这个资源是实现页的基础，并且字符串资源包含了它的标题。


 COlePropertyPage::GetControlStatus

BOOL GetControlStatus( UINT nID );

返回值：
如果控件值被改变则返回TRUE；否则返回FALSE。

参数：
nID 一个实现页控件的资源ID。

说明：
此函数用来确定用户是否修改了属性控件的值，这个属性页控件由资源ID确定。

请参阅：COlePropertyPage::SetControlStatus


 COlePropertyPage::GetObjectArray

LPDISPATCH FAR* GetObjectArray( ULONG FAR* pnObjects );

返回值：
指向一个IDispatch指针数组的指针，该指针数组用来访问属性页面上的每一个控件的属性。调用者不用释放这些接口指针。

参数：
pnObjects 指向一个无符号长整型数的指针，此整型数用来接收被这个页面编辑的对象数。

说明：
每个属性页面对象维持一个指针数组，这些指针指向被页面编辑的对象的IDispatch接口。这个函数将它的参数pnObjects设置为指针数组的元素个数，并返回一个指向数组中的第一个元素的指针。


 COlePropertyPage::GetPageSite

LPPROPERTYPAGESITE GetPageSite();

返回值：
指向属性页的IPropertyPageSite接口的指针。

说明：
此函数用来获取一个指向属性页的IPropertyPageSite接口的指针。
控件和容器互相配合，以使用户能够浏览和修改控件的属性。控件提供属性页面，每一个页面都是一个OLE对象，允许用户编辑一个相关的属性集合。容器提供一个用来显示属性页面的属性框架。对应每一个页面，属性框架提供一个页面位置，它支持IPropertyPageSite接口。

请参阅：COlePropertyPage::OnSetPageSite


 COlePropertyPage::IgnoreApply

void IgnoreApply( UINT nID );

参数：
nID 将被忽略的控件的ID。

说明：
只有当属性页控件的值被改变时，属性页上的Apply按钮才会被使能。这个函数用来指定一些控件，即使这些控件的值被改变了，也不会引起Apply按钮被使能。

请参阅：COlePropertyPage::GetControlStatus


 COlePropertyPage::IsModified

BOOL IsModified();

返回值：如果属性页被修改则返回TRUE。

说明：
此函数用来确定用户是否改变了属性页上的值。

请参阅：COlePropertyPage::SetModifiedFlag


 COlePropertyPage::OnEditProperty

virual BOOL OnEditProperty( DISPID dispid );

返回值：
缺省实现返回FALSE。重载这个函数后将返回TRUE。

参数：
dispid 被编辑的属性的分配ID。

说明：
当一个特定的属性被编辑时框架调用这个函数。为了将焦点设置到页面上特定的控件中，你可以重载这个函数。缺省的实现什么也不做，并返回FALSE。


 COlePropertyPage::OnHelp

virtual BOOL OnHelp( LPCTSTR lpszHelpDir );

返回值：缺省实现返回FALSE。

参数：
lpszHelpDir 包含属性页的帮助文件的目录。

说明：
当用户请求联机帮助的时候框架调用这个函数。在用户访问帮助的时候，如果你的属性页面需要执行任何特定的操作，请重载这个函数。缺省的实现什么也不做并返回FALSE，这指示框架去调用WinHelp。


 COlePropertyPage::OnInitDialog

virtual BOOL OnInitDialog();

返回值：缺省实现返回FALSE。

说明：
当属性页的对话框被初始化时，框架调用这个函数。如果在对话框被初始化时需要执行任何特定的操作，请重载这个函数。缺省的实现调用了CDialog::OnInitDialog，返回FALSE。

请参阅：CDialog::OnInitDialog


 COlePropertyPage::OnObjectsChanged

virtual void OnObjectsChanged();

说明：
当在开发环境中查看一个OLE控件的属性时，一个无模式对话框被用来显示它的属性页面。如果选择了另一个控件，就必须显示一个具有不同设置的属性页面用来显示一个新的属性集合。框架调用这个函数来通知属性页面这个改变。


 COlePropertyPage::OnSetPageSite

virtual void OnSetPageSite();

说明：
当属性框架提供了属性页的页面位置时，框架调用这个函数。缺省的实现载入页面的标题，并尝试从对话框资源来确定页面的大小。如果你的属性页需要任何进一步的动作，请重载这个函数。

请参阅：COlePropertyPage::GetPageSite


 COlePropertyPage::SetControlStatus

BOOL SetControlStatus( UINT nID, BOOL IsDirty );

返回值：
如果指定的控件已被设置则返回TRUE；否则返回FALSE。

参数：
nID | 包含一个属性页控件的ID。
IsDirty | 表明属性页的某个域是否被修改。如果域被修改则被设置为TRUE，如果还没有被修改则被设置为FALSE。

说明：
这个函数用来改变属性页控件的状态。
当属性页被关闭或Apply按钮被选择时，如果属性页控件的状态是变脏了的，则控件的属性将会被用适当的值更新。

请参阅：COlePropertyPage::GetControlStatus


 COlePropertyPage::SetDialogResource

void SetDialogResource( HGLOBAL hDialog );

参数：
hDialog 属性页的对话框资源的句柄。

说明：
此函数用来设置属性页的对话框资源。


 COlePropertyPage::SetHelpInfo

void SetHelpInfo( LPCTSTR lpszDocString, LPCTSTR lpszHelpFile = NULL, DWORD dwHelpContext = 0 );

参数：
lpszDocString | 是一个包含简短帮助信息的字符串，用来显示在状态条或其他的位置中。
lpszHelpFile | 属性页的帮助文件的名称。
dwHelpContext | 属性页的帮助上下文。

说明：
这个函数用来为属性页指定“工具提示”信息，帮助文件名，和帮助上下文。

请参阅：COlePropertyPage::OnHelp


 COlePropertyPage::SetModifiedFlag

void SetModifiedFlag( BOOL bModified = TRUE );

参数：
bModified 为属性页的修改标志指定新值。

说明：
此函数用来表明用户是否修改了属性页面。

请参阅：COlePropertyPage::IsModified


 COlePropertyPage::SetPageName

void SetPageName( LPCTSTR lpszPageName );

参数：
lpszPageName 是一个字符串指针，该字符串包含属性页的名称。

说明：
此函数用来设置属性页的名字，这个名字是属性框架特别显示在页面标签上的。


 COleResizeBar

CObject
└CCmdTarget
└CWnd
└CControlBar
└COleResizeBar

COleResizeBar对象是一种支持改变现场OLE项的大小的控制条。COleResizeBar对象看起来是一个具有带阴影边框和能处理外部大小改变的CRectTracker大小。
COleResizeBar对象通常是从COleIPFrameWnd类派生的框架窗口对象的嵌入成员。
更多信息，请参见“Visual C++ 程序员指南”中的“Activation”。
#include <afxole.h>
请参阅：COleServerDoc

COleResizeBar类成员

构造
COleResizeBar | 构造一个COleResizeBar对象
Create | 创建并初始化一个Windows子窗口，并使它与COleResizeBar对象相联系


 COleResizeBar::COleResizeBar

COleResizeBar();

说明：
构造一个COleResizeBar对象。调用Create创建可改变大小的条对象。

请参阅：COleResizeBar::Create


 COleResizeBar::Create

BOOL Create( CWnd* pParentWnd,
DWORD dwStyle = WS_CHILD | WS_VISIBLE,
UINT nID = AFX_IDW_RESIZE_BAR
);

参数：
pParentWnd | 如果可改变大小的条创建成功则返回非零值；否则返回0。
dwStyle | 指定窗口风格属性。
nID | 可改变大小的条的子窗口ID。

说明：
创建一个子窗口并将其与COleResizeBar对象相联系。

请参阅：CWnd::Create, CControlBar


 COleSafeArray

COleSafeArray类是用于处理任意类型和维数的数组的类。COleSafeArray是从OLE VARIANT结构派生而来的。OLE SAFEARRAY成员函数在可以通过COleSafeArray来访问，就象是特别为一维的字节数组所设计的一个成员函数集。
#include <afxdisp.h>
请参阅：COleVariant, CRecordset, CDatabase

COleSafeArray类成员

构造
COleSafeArray 构造一个COleSafeArray对象

操作
Attach | 给COleSafeArray对象以存在的VARIANT数组的控制
Clear | 释放基VARIANT中的所有数据
Detach | 将VARIANT数组从COleSafeArray对象中分离出来（这将使数据不会被释放）

Win32 API 包装
AccessData | 获取一个指向数组数据的指针
AllocData | 为数组分配内存
AllocDescriptor | 为安全数组描述符分配内存
Copy | 创建一个已存在的数组的拷贝
Create | 创建一个安全数组
Destroy | 销毁一个已经存在的数组
DestroyData | 销毁一个安全数组中的数据
DestroyDescriptor | 销毁一个安全数组的描述符
GetDim | 返回数组的维数
GetElement | 获取安全数组中的一个单一元素
GetElemSize | 返回安全数组中一个元素的按字节表示的大小
GetLBound | 返回一个安全数组任一维的下界
GetUBound | 返回一个安全数组任一维的上界
Lock | 增加一个数组的加锁计数，并将一个指向数组数据的指针放到数组描述符中
PtrOfIndex | 返回一个指向被索引的元素的指针
PutElement | 将一个单一的元素放入数组中
Redim | 改变一个安全数组的最不重要（最右边）的边界
UnaccessData | 减小一个数组的加锁计数，并使由AccessData获得的指针无效
Unlock | 减小一个数组的加锁以使它能被释放或改变大小

一维数组操作
CreateOneDim | 创建一个一维的COleSafeArray对象
GetOneDimSize | 返回一个一维的COleSafeArray对象中的元素个数
ResizeOneDim | 改变一个一维的COleSafeArray对象中的元素个数

操作
operator = | 将一些值（包括SAFEARRAY，VARIANT，COleVariant，或COleSafeArray对象）拷贝到COleSafeArray对象中
operator == | 比较两个不同的数组（SAFEARRAY，VARIANT，ColeVariant，或COleSafeArray对象）
operator << | 向转储描述表输出一个COleSafeArray对象的内容
operator LPVARIANT | 访问COleSafeArray对象的基VARIANT结构
operator LPCVARIANT | 访问COleSafeArray对象的基VARIANT结构


 COleSafeArray::AccessData

void AccessData( void* ppvData );

参数：
ppvData 指向数组数据的指针的指针。

说明：
此成员函数用来返回一个指向数组数据的指针。如果出错，则函数抛出一个CMemoryException或COleException。

请参阅：
COleSafeArray::UnaccessData, SafeArrayAccessData


 COleSafeArray::AllocData

void AllocData();

说明：
此成员函数用来为一个安全数组分配内存。如果出错，则函数抛出一个CMemoryException或COleException。

请参阅：
COleSafeArray::AllocDescriptor, SafeArrayAllocData


 COleSafeArray::AllocDescriptor

void AllocDescriptor( DWORD dwDims );

参数：
dwDims 安全数组中的维数。

说明：
此函数用来为一个安全数组的描述符分配内存。如果出错，则函数抛出一个CMemoryException或COleException。

请参阅：
COleSafeArray::AllocData, SafeArrayAllocDescriptor


 COleSafeArray::Attach

void Attach( VARIANT& varSrc );

参数：
varSrc 是一个VARIANT对象。参数varSrc必须有VARTYPE VT_ARRAY。

说明：
此成员函数将对一个已有的VARIANT数组中的数据的控制传给COleSafeArray对象。源VARIANT的类型被设置为VT_EMPTY。如果当前数组有数据的话，函数将清掉这些数据。

请参阅：COleSafeArray::Detach


 COleSafeArray::Clear

void Clear();

说明：
此函数用来清除安全数组。函数通过将对象的VARTYPE设置为VT_EMPTY来清除一个安全数组。数组中的当前内容被释放，数组也被释放了。

请参阅：VariantClear


 COleSafeArray::COleSafeArray

COleSafeArray();
COleSafeArray( const SAFEARRAY& saSrc, VARTYPE vtSrc );
COleSafeArray( LPCSAFEARRAY psaSrc, VARTYPE vtSrc );
COleSafeArray( const COleSafeArray& saSrc );
COleSafeArray( const VARIANT& varSrc );
COleSafeArray( LPCVARIANT pSrc );
COleSafeArray( const COleVariant& varSrc );

参数：
saSrc | 要被拷贝到新的COleSafeArray对象中去的已经存在的COleSafeArray对象或SAFEARRAY。
vtSrc | 新的COleSafeArray对象的VARTYPE。
psaSrc | 一个指向要被拷贝到新的COleSafeArray对象中去的SAFEARRAY的指针。
varSrc | 要被拷贝到新的COleSafeArray对象中去的已经存在的VARIANT或者COleVariant。
pSrc | 一个指向要被拷贝到新的COleSafeArray对象中去的VARIANT对象的指针。

说明：
所有这些构造函数都创建一个新的COleSafeArray对象。如果没有参数，则创建的是一个空的COleSafeArray对象（VT_EMPTY）。如果COleSafeArray是从另一个数组拷贝来的，并且这个数组的VARTYPE并不是完全确定的（一个COleSafeArray，COleVariant，或者VARIANT），则源数组中的VARTYPE被保留，并且不需要说明。如果COleSafeArray是从另一个数组拷贝而来，并且该数组的VARTYPE是不知道的，则VARTYPE必须用vtSrc参数来指定。
如果出错，则函数抛出一个CMemoryException或COleException。

请参阅：VariantCopy


 COleSafeArray::Copy

void Copy( LPSAFEARRAY* ppsa );

参数：
ppsa 指向一个特定区域的指针，在这个特定区域中将返回新的数组描述符。

说明：
创建一个已经存在的安全数组的拷贝。如果出错，则函数抛出一个CMemoryException或COleException。

请参阅：SafeArrayCopy


 COleSafeArray::Create

void Create( VARTYPE vtSrc, DWORD dwDims, DWORD* rgElements );
void Create( VARTYPE vtSrc, DWORD dwDims, SAFEARRAYBOUND* rgsabounds );

参数：
vtSrc | 是数组的基本类型（也就是说，数组的每一个元素的VARTYPE）。
VARTYPE | 被限制在可变类型的一个子集。不能设置为VT_ARRAY和VT_BYREF标志。对数组来说VT_ARRAY和VT_BYREF是无效的基本类型。所有其它的类型都是合法的。
dwDims | 数组中的维数。在数组创建之后，可以用Redim来改变这个值。
rgElements | 指向一个数组的指针。该数组中记录着被创建的数组的每一维的元素个数。
rgsabounds | 指向一个分配给数组的界线向量（每一维一个）的指针。

说明：
此函数用来给数组分配和初始化数据。如果必要的话，这个函数将清除当前的数组数据。如果出错，则函数抛出一个CMemoryException。

请参阅：SafeArrayCreate


 COleSafeArray::CreateOneDim

void CreateOneDim( VARTYPE vtSrc,
DWORD dwElememts,
const void* pvSrcData = NULL,
long nLBound = 0
);

参数：
vtSrc | 是数组的基本类型（也就是说，数组的每一个元素的VARTYPE）。
dwElements | 数组的维数。在数组被创建之后可以用ResizeOneDim来改变这个值。
pvSrcData | 指向要拷贝到数组中去的数据的指针。
nLBound | 数组的下界。

说明：
此函数用来创建一个一维的COleSafeArray对象。函数为数组分配并初始化数据，如果指针pvSrcData不是NULL，则将指定的数据拷贝到数组中。
如果出错，则函数抛出一个CMemoryException。

请参阅：
COleSafeArray::GetOneDimSize, COleSafeArray::ResizeOneDim, COleSafeArray::Create


 COleSafeArray::Destroy

void Destroy();

说明：
此函数用来销毁一个已经存在的数组描述符和数组中的所有数据。如果数组中保存有对象，则每一个对象都被释放。如果出错，则函数抛出一个CMemoryException或COleException。

请参阅：
COleSafeArray::DestroyData, COleSafeArray::DestroyDescriptor, SafeArrayDestroy


 COleSafeArray::DestroyData

void DestroyData();

说明：
此函数销毁一个安全数组中的所有数据。如果数组中保存有对象，则每一个都被释放。如果出错，则函数抛出一个CMemoryException或COleException。

请参阅：
COleSafeArray::DestroyData, COleSafeArray::DestroyDescriptor, SafeArrayDestroyData


 COleSafeArray::DestroyDescriptor

void DestroyDescriptor();

说明：
此函数用来销毁一个安全数组的描述符。如果出错，则函数抛出一个CMemoryException或COleException。

请参阅：
COleSafeArray::DestroyData, COleSafeArray::DestroyDescriptor, SafeArrayDestroyDescriptor


 COleSafeArray::Detach

VARIANT Detach();

返回值：
返回COleSafeArray对象中的基VARIANT值。

说明：
此成员函数用来将VARIANT数据从COleSafeArray对象中分离出来。函数通过将对象的VARTYPE设置为VT_EMPTY来分离出安全数组中的数据。调用者通过调用Windows函数VariantClear来负责释放数组。
如果出错，则函数抛出一个COleException。

请参阅：
COleSafeArray::Attach, VariantClear


 COleSafeArray::GetDim

DWORD GetDim();

返回值：安全数组的维数。

说明：
此函数返回COleSafeArray对象中的维数。

请参阅：
COleSafeArray::Create, COleSafeArray::Redim, SafeArrayGetDim


 COleSafeArray::GetElement

void GetElement( long* rgIndices, void* pvData );

参数：
rgIndices | 指向一个数组的指针。该数组包含安全数组的每一维的索引。
pvData | 指向用来放置数组的元素的特定区域的指针。

说明：
此函数用来获取安全数组中的一个单一的元素。在获取元素之前和获取元素之后，此函数自动调用Windows函数SafeArrayLock和SafeArrayUnlock。如果此数据元素是一个字符串，对象或可变类型，则函数会用正确的方法来拷贝这个元素。参数pvData应该指向足够大的缓冲区以保存这个元素。
如果出错，函数将抛出一个CMemoryException和COleException。

请参阅：
COleSafeArray::PutElement, SafeArrayGetElement


 COleSafeArray::GetElemSize

DWORD GetElemSize();

返回值：
以字节表示的安全数组中的元素的大小。

说明：
此函数用来获取一个COleSafeArray大小中的一个元素的大小。

请参阅：
COleSafeArray::GetDim, SafeArrayGetElemSize


 COleSafeArray::GetLBound

void GetLBound( DWORD dwDim, long* pLBound );

参数：
dwDim | 要获得其下界的数组的维数。
pLBound | 指向要返回下界的位置的指针。

说明：
此成员函数返回一个COleSafeArray对象的任何维的下界。如果出错，则函数抛出一个COleException。

请参阅：
COleSafeArray::GetUBound, SafeArrayGetLBound


 COleSafeArray::GetOneDimSize

DWORD GetOneDimSize();

返回值：一维安全数组中的元素个数。

说明：
此成员函数用来返回一个一维的COleSafeArray对象的元素个数。

请参阅：
COleSafeArray::ResizeOneDim, SafeArrayRedim


 COleSafeArray::GetUBound

void GetUBound ( DWORD dwDim, long* pUBound );

参数：
dwDim | 要获得其上界的数组的维数。
pUBound | 指向要返回上界的位置的指针。

说明：
此成员函数返回一个COleSafeArray对象的任何维的上界。如果出错，则函数抛出一个COleException。

请参阅：
COleSafeArray::GetLBound, SafeArrayGetUBound


 COleSafeArray::Lock

void Lock();

说明：
此成员函数用来增加一个数组的加锁计数，并在数组描述符中放置一个指向数组数据的指针。如果出错，则函数抛出一个COleException。
数组描述符中的指针一直有效，直到调用了Unlock。对Lock的调用可以是嵌套的；这时就需要对Unlock进行相同次数的调用。
当一个数组被锁住时是不能被删除的。

请参阅：
COleSafeArray::Unlock, SafeArrayLock


 COleSafeArray::PtrOfIndex

void PtrOfIndex( long* rgIndices, void** ppvData );

参数：
rgIndices | 一个索引值数组。这些索引值用来标识数组中的一个元素。元素的索引都必须被指明。
ppvData | 在返回时，指向由rgIndices中的值标识的元素。

说明：
此函数返回一个指向由索引值指定的元素的指针。

请参阅：SafeArrayPtrOfIndex


 COleSafeArray::PutElement

void PutElement( long* rgIndices, LPVOID pvData );

参数：
rgIndices | 指向一个数组的指针。该数组包含安全数组的每一个元素的索引。
pvData | 指向要赋给数组的数据的指针。VT_DISPATCH，VT_UNKNOWN，和VT_BSTR 可变类型都是指针，它们不需要其它级别的迂回。

说明：
这个函数用来将一个单一的元素赋给数组。在分配元素之前和分配元素之后，此函数自动调用Windows函数SafeArrayLock和SafeArrayUnlock。如果数据元素是一个字符串，对象或可变类型，则函数会正确拷贝它们，并且如果已经存在的元素是一个字符串，对象，或可变类型，它们将被清除。
注意你可以对一个数组进行多重锁定，这样当数组被其它操作加锁时，你仍然可以将元素放入这个数组中。
如果出错，函数将抛出一个CMemoryException或COleException。

请参阅：
COleSafeArray::GetElement, SafeArrayPutElement


 COleSafeArray::Redim

void Redim( SAFEARRAYBOUND* psaboundNew );

参数：
psaboundNew 指向一个新的安全数组边界结构的指针，这个边界结构包含新数组的边界。只有数组的最不重要的维是可以改变的。

说明：
此函数用来改变一个安全数组的最不重要的（最右边的）边界。如果出错，函数将抛出一个COleException。

请参阅：
COleSafeArray::Create, COleSafeArray::GetDim, COleSafeArray::ResizeOneDim, SafeArrayRedim


 COleSafeArray::ResizeOneDim

void ResizeOneDim( DWORD dwElements );

参数：
dwElements 一维安全数组中的元素个数。

说明：
此函数用来改变一个一维COleSafeArray对象的元素个数。如果错误，函数将抛出一个COleException。

请参阅：
COleSafeArray::Redim, COleSafeArray::GetOneDimSize, COleSafeArray::CreateOneDim, SafeArrayRedim


 COleSafeArray::UnaccessData

void UnaccessData();

说明：
此函数用来减小一个数组中的锁定计数，并使由AccessData获取的指针无效。如果出错，函数将抛出一个COleException。

请参阅：
COleSafeArray::AccessData, SafeArrayUnaccessData


 COleSafeArray::Unlock

void Unlock();

说明：
此函数用来减小一个数组的锁定计数，以使数组能够被释放或改变大小。此函数在对数组中的数据的访问完成之后被调用。如果出错，函数将抛出一个COleException。

请参阅：
COleSafeArray::Lock, SafeArrayUnlock


 COleSafeArray::operator =

COleSafeArray& operator =( const COleSafeArray& saSrc );
COleSafeArray& operator =( const VARIANT& varSrc );
COleSafeArray& operator =( LPCVARIANT pSrc );
COleSafeArray& operator =( const COleVariant& varSrc );

说明：
这些重载的赋值操作符将源值拷贝到COleSafeArray对象。一个有关每个操作符的简短描述如下所示：
·operator =(saSrc) | 将一个已经存在的COleSafeArray对象拷贝到这个对象中。
·operator =(varSrc) | 将一个已经存在的VARIANT或COleVariant数组拷贝到这个对象中。
·operator =(pSrc) | 将一个由pSrc访问的VARIANT数组拷贝到这个对象中。

请参阅：VariantCopy


 COleSafeArray::operator ==

BOOL operator == ( const SAFEARRAY& saSrc ) const;
BOOL operator == ( LPCSAFEARRAY pSrc ) const;
BOOL operator == ( const COleSafeArray& saSrc ) const;
BOOL operator == ( const VARIANT& varSrc ) const;
BOOL operator == ( LPCVARIANT pSrc ) const;
BOOL operator == ( const COleVariant& varSrc ) const;

说明：
这个操作符比较两个数组（SAFEARRAY，VARIANT，COleVariant，或COleSafeArray数组），如果它们相等则返回非零值；否则就返回零。如果两个数组具有相同的维数，每一维的大小相等，且元素值相等，则它们就是相等。


 COleSafeArray::operator <<

CDumpContext& AFXAPI operator <<( CDumpContext& dc, COleSafeArray&saSrc );

说明：
此强制转换操作符用来访问COleSafeArray对象的基VARIANT结构。


 COleSafeArray::operator LPCVARIANT

operator LPCVARIANT( ) const;

说明：
调用该操作符来访问COleSafeArray对象中的VARIANT结构。


 COleSafeArray::operator LPVARIANT

operator LPVARIANT();

说明：
此强制转换操作符用来访问COleSafeArray对象的基VARIANT结构。
注意，改变由这个函数的返回指针访问的VARIANT结构的值，将改变这个COleSafeArray对象的值。


 COleServerDoc

CObject
└CCmdTarget
└CDocument
└COleDocument
└COleLinkingDoc
└COleServerDoc

COleServerDoc是OLE服务器文档的基类。服务器文档可包含COleServerItem对象，这些对象表示提供给嵌入或链接项的服务器接口。当服务器应用程序由容器应用程序启动来编辑嵌入项时，则将该项加载为服务器自己的服务器文档；COleServerDoc对象只包含一个COleServerItem对象，构成了整个文档。
当服务器应用程序由容器应用程序启动来编辑链接项时，则从磁盘装载一个现有的文档，一部分文档内容被加亮以指示链接项。
COleServerDoc对象也可包含COleClientItem类的项。这使得你可以创建容器－服务器应用程序。框架在为COleServerDoc对象提供服务的同时，也提供了用于存储COleClientItem项的函数。
如果服务器应用程序不支持链接，则服务器程序文档将总是只包含一个服务器项，该项将整个嵌入对象表示为一个文档。如果服务器应用程序支持链接，则每当将一个选择拷贝到剪贴板中时，它都必须创建一个服务器项。
要使用COleServerDoc，可从COleServerDoc类派生一个新类，并实现OnGetEmbeddedItem成员函数，该函数使得服务器应用程序能够支持嵌入项。你可以从COleServerItem派生一个新类来实现文档中的嵌入项，并从OnGetEmbeddedItem函数返回该类的这些对象。
为支持链接项，COleServerDoc提供了OnGetLinkedItem成员函数。应用程序可以利用该函数的缺省实现，或者当应用程序有自己的管理文档项的方式时，可以重载这个函数。
应用程序需要为它所支持的每种服务器文档类型派生一个COleServerDoc派生类。例如，如果服务器应用程序支持工作表格和图表，则它需要两个COleServerDoc派生类。
#include <afxole.h>
请参阅：COleDocument, COleLinkingDoc, COleTemplateServer

COleServerDoc类成员

构造
COleServerDoc 构造一个COleServerDoc对象

属性
IsEmbedded | 表明文档是嵌入在一个容器文档中的还是独立运行的
IsInPlaceActive | 如果此项是当前现场被激活的则返回TRUE
GetEmbeddedItem | 返回一个指向代表整个文档的项的指针
GetItemPosition | 返回当前位置矩形用于现场编辑，该矩形是相对于容器应用程序的客户区的
GetItemClipRect | 返回当前用于现场编辑的剪贴板矩形
GetZoomFactor | 返回用像素表示的缩放因子

操作
OnExecOleCmd | 执行一个指定的命令或显示与该命令相关的帮助
NotifyChanged | 通知容器应用程序用户已经改变了文档
NotifyRename | 通知容器应用程序用户已经将文档改名了
NotifySaved | 通知容器应用程序用户已经保存了文档
NotifyClosed | 通知容器应用程序用户已经关闭了文档
SaveEmbedding | 通知容器应用程序保存文档
ActivateInPlace | 激活文档用于现场编辑
DeactivateAndUndo | 使服务器的用户界面不再是活动的
DiscardUndoState | 丢弃取消状态信息
RequestPositionChange | 改变现场可编辑框架的位置
ScrollContainerBy | 滚动容器程序文档
UpdateAllItems | 通知容器应用程序用户已经改变了文档

可重载
GetDocObjectServer | 重载这个函数可以创建一个新的CDocObjectServer对象，并表明这个文档是一个DocObject容器
OnUpdateDocument | 当保存一个作为嵌入项的服务器文档时，框架调用该函数来更新此项的容器应用程序的备份
OnGetEmbeddedItem | 调用此函数可获取一个表示整个文档的COleServerItem；此函数可用来获取一个嵌入项。需要实现
OnClose | 当容器应用程序请求关闭文档时，框架调用这个函数
OnSetHostNames | 当一个容器为一个嵌入对象设置窗口标题时，框架调用这个函数
OnShowDocument | 框架调用此函数来显示或隐藏文档
OnDeactivate | 当用户使一个现场被激活的项变为不活动时，框架调用此函数
OnDeactivateUI | 框架调用此函数来销毁控件和其它为现场激活所创建的用户界面元素。
OnSetItemRects | 框架调用此函数来定位现场编辑框架窗口在容器应用程序窗口中的位置
OnReactivateAndUndo | 框架调用此函数来取消在现场编辑期间所做的改变
OnFrameWindowActivate | 当容器的框架窗口被激活或成为不活动时，框架调用这个函数
OnDocWindowActivate | 当容器应用程序的文档框架窗口被激活或成为不活动时，框架调用这个函数
OnShowControlBars | 框架调用此函数来显示或隐藏用于现场编辑的控制条
OnResizeBorder | 当容器应用程序的框架窗口或文档窗口被改变大小时，框架调用这个函数
CreateInPlaceFrame | 框架调用此函数来创建一个用于现场编辑的框架窗口
DestroyInPlaceFrame | 框架调用此函数来销毁一个用于现场编辑的框架窗口


 COleServerDoc::ActivateInPlace

BOOL ActivateInPlace();

返回值：
如果成功则返回非零值；否则返回0，这表明该项已经被完全打开了。

说明：
此成员函数用来激活用于现场编辑的项。
此函数执行在现场激活中必须的所有操作。它创建一个现场框架窗口，激活它并设置此项的大小，设置共享菜单和其它控件；将此项滚动到视窗中，并将焦点设置到现场框架窗口。
COleServerItem::OnShow的缺省实现调用这个函数。如果你的应用程序支持其它用于现场激活的动词（比如Play），则请你调用这个函数。

请参阅：COleServerItem::OnShow


 COleServerDoc::COleServerDoc

COleServerDoc();

说明：
当不与OLE系统DLLs连接，此成员函数用来构造一个COleServerDoc对象。
应用程序必须调用COleLinkingDoc::Register函数来打开与OLE的通讯。如果应用程序中使用的是COleTemplateServer，则由COleLinkingDoc实现的OnNewDocument，OnOpenDocument和OnSaveDocument为应用程序调用COleLinkingDoc::Register函数。

请参阅：COleServerItem::OnShow


 COleServerDoc::CreateInPlaceFrame

virtual COleIPFrame Wnd* CreatInPlaceFrame( CWnd* pParentWnd );

返回值：
如果函数成功则返回一个指向现场框架窗口的指针；否则返回NULL。

参数：
pParentWnd 指向容器应用程序的父窗口的指针。

说明：
框架调用此函数来创建一个用于现场编辑的框架窗口。该函数的缺省实现是使用文档模板中指定的信息来创建框架窗口。所使用的视是为文档创建的第一个视。这个视暂时从原来的框架分离，并连接到这个刚创建的框架窗口上。
此函数是一个高级的可重载函数。

请参阅：COleServerDoc::DestroyInPlaceFrame


 COleServerDoc::DeactivateAndUndo

BOOL DeactivateAndUndo();

返回值：如果成功则返回非零值；否则返回0。

说明：
如果你的应用程序支持Undo，并且用户在激活一个项之后，但在对它进行编辑之前选择了Undo，则调用这个函数。如果容器应用程序是用微软基础类库编写的，则调用DeactivateAndUndo函数会导致COleClientItem::OnDeactivateAndUndo被调用，后者使服务器应用程序的用户界面变成不活动的。

请参阅：COleClientItem::OnDeactivateAndUndo


 COleServerDoc::DestroyInPlaceFrame

virtual void DestroyInPlaceFrame( COleIPFrameWnd* pFrame );

参数：
pFrame 指向将要被销毁的现场框架窗口的指针。

说明：
框架调用这个函数来销毁一个现场框架窗口，并将服务器应用程序的文档窗口返回到其在现场激活之前的状态。
此函数是一个高级的可重载函数。

请参阅：COleServerDoc::CreateInPlaceFrame


 COleServerDoc::DiscardUndoState

BOOL DiscardUndoState();

返回值：如果成功则返回非零值；否则返回0。

说明：
如果用户执行一个不能被取消的编辑操作，则调用该函数来强制容器应用程序丢弃它的取消状态信息。
这个函数使得支持Undo的服务器应用程序可以释放资源，否则这些资源就要被不能再使用的取消状态信息浪费掉。

请参阅：COleServerDoc::OnReactivateAndUndo


 COleServerDoc::GetDocObjectServer

virtual CDocObjectServer* GetDocObjectServer( LPOLEDOCUMENTSITE pSite );

返回值：
如果操作成功则返回一个指向CDocObjectServer的指针；否则返回NULL。

参数：
pSite 指向IOleDocumentSite界面的指针，此界面将这个文档与服务器连接起来。

说明：
重载这个函数可以创建一个新的CDocObjectServer项，并返回一个指向这个项的指针。当一个DocObject服务器被激活时，就返回一个非NULL指针，它表明客户可以支持DocObjects。函数的缺省实现返回NULL。
一个支持DocObjects的文档的典型实现将简单地分配一个新的CDocObjectServer对象，并将它返回给调用者。例如：
CDocObjectServer* COleServerDoc::GetDocObjectServer( LPOLEDOCUMENTSITE pSite )
{
return new CDocObjectServer(this, pSite);
}

请参阅：CDocObjectServer::CDocObjectServer


 COleServerDoc::GetEmbeddedItem

COleServerItem* GetEmbeddedItem();

返回值：
如果成功则返回一个指向代表整个文档的项的指针；否则返回NULL。

说明：
此函数用来获取一个指向代表整个文档的项的指针。它调用了COleServerDoc::OnGetEmbeddedItem函数，这是一个没有缺省实现的虚函数。

请参阅：COleServerDoc::OnGetEmbeddedItem


 COleServerDoc::GetItemClipRect

void GetItemClipRect( LPRECT lpClipRect ) const;

参数：
lpClipRect 指向一个RECT结构或CRect对象的指针，此结构或对象用来接收此项的剪贴矩形坐标。

说明：
调用这个函数来获取正在进行现场编辑的项的剪贴矩形坐标。坐标是相对于容器应用程序窗口的客户区，用像素表示的。
绘制不应该发生在剪贴矩形之外。通常，绘制会自动受到限制，利用这个函数可以确定用户是否滚动到了文档的可见部分之外；如果是，则通过调用ScrollContainerBy函数按需要滚动容器文档。

请参阅：
COleServerDoc::GetItemPosition, COleServerDoc::ScrollContainerBy


 COleServerDoc::GetItemPosition

void GetItemPosition( LPRECT lpPosRect ) const;

参数：
lpPosRect 指向一个RECT结构或CRect对象的指针，此结构或对象用来接收此项的坐标。

说明：
调用这个成员函数来获取正被现场编辑的项的坐标。坐标相对于容器应用程序窗口的客户区，用像素表示。
项的位置可以与当前剪贴矩形相比较，用于确定此项在屏幕上可见（或不可见）的程度。

请参阅：COleServerDoc::GetItemClipRect


 COleServerDoc::GetZoomFactor

BOOL GetZoomFactor( LPSIZE lpSizeNum = NULL,
LPSIZE lpSizeDenom = NULL,
LPCRECT lpPosRect = NULL
) const;

返回值：
如果此项是为现场编辑而被激活的，并且它的缩放因子不是100%（1:1），则返回一个非零值；否则返回值为0。

参数：
lpSizeNum | 指向一个CSize类对象的指针，此对象将用来保存缩放因子的分子。该参数可为NULL。
lpSizeDenom | 指向一个CSize类对象的指针，此对象将用来保存缩放因子的分母。该参数可为NULL。
lpPosRect | 指向一个CRect类对象的指针，此对象用于描述此项的新位置。如果该参数为NULL，则该函数使用此项的当前位置。

说明：
GetZoomFactor成员函数确定一个为现场编辑而激活的“缩放因子”。缩放因子是此项的大小与其当前范围之比（用像素表示），如果容器应用程序没有设置此项的范围，则使用它的固有范围（由COleServerItem::OnGetExtent函数确定）。
GetZoomFactor函数将它的前两个参数设为此项的“缩放因子”的分子和分母。
如果此项未被现场编辑，则该函数将这些参数设置为缺省值100%（或1:1），并返回零。如果要获取更进一步的信息，请参见联机技术注释 40，“MFC/OLE现场改变大小和缩放”。

请参阅：
COleServerDoc::GetItemPosition, COleServerDoc::GetItemClipRect, COleServerDoc::OnSetItemRects


 COleServerDoc::IsEmbedded

BOOL IsEmbedded() const;

返回值：
如果COleServerDoc对象是一个代表容器中的嵌入对象的文档，则返回非零值；否则返回0。

说明：
调用IsEmbedded成员函数来确定文档表示的是否是一个嵌入在容器应用程序中的对象。从文件装载的文档不是嵌入式的，尽管它可以由容器应用程序链接来操作。嵌入在容器文档中的文件被认为是嵌入式的。


 COleServerDoc::IsInPlaceActive

BOOL IsInPlaceActive() const;

返回值：
如果COleServerDoc对象是现场活动的，则返回非零值；否则返回0。

说明：
调用IsInPlaceActive成员函数来确定此项当前是否处于现场活动状态。

请参阅：
COleServerDoc::OnReactivateAndUndo, COleServerDoc::ActivateInPlace


 COleServerDoc::NotifyChanged

void NotifyChanged();

说明：
此函数将文档改变了的信息通知给与此文档链接的所有链接项，一般的，应用程序在用户改变某些全局属性（比如服务器文档的大小）之后，调用NotifyChanged函数。如果用一个自动链接将一个OLE项链接到此文档上，则将更新此项以反映这些改变。在用微软基础类库编写的容器应用程序中，将调用COleClientItem的OnChange函数。
注意：
这个函数是为与OLE兼容而提供的。新应用程序应该使用UpdateAllItems函数。

请参阅：
COleServerDoc::NotifyClosed, COleServerDoc::NotifySaved, COleClientItem::OnChange


 COleServerDoc::NotifyClosed

void NotifyClosed();

说明：
此函数通知容器应用程序文档已经关闭。当用户从File菜单中选择Close命令时，由COleServerDoc实现的OnCloseDocument成员函数调用NotifyClosed函数。在用微软基础类库编写的容器应用程序中，将调用COleClientItem的OnChange成员函数。

请参阅：
COleServerDoc::NotifyChanged, COleServerDoc::NotifySaved, COleClientItem::OnChange, CDocument::OnCloseDocument


 COleServerDoc::NotifyRename

void NotifyRename( LPCTSTR lpszNewName );

参数：
lpszNewName 一个字符串指针，此字符串指定服务器文档的新名字；它通常是一个全路径。

说明：
在用户改换服务器文档的名字之后，调用此函数。当用户从File菜单中选择SaveAs命令时，由COleServerDoc实现的OnSaveDocument成员函数调用NotifyRename函数。NotifyRename函数通知OLE系统DLLs，后者再接着通知容器应用程序。在用微软基础类库容器应用程序中，将调用COleClientItem的OnChange成员函数。

请参阅：
COleServerDoc::NotifySaved, CDocument::OnSaveDocument


 COleServerDoc::NotifySaved

void NotifySaved();

说明：
在用户保存了服务器文档之后，调用该函数。当用户从File菜单中选择Save命令时，由COleServerDoc实现的OnSaveDocument成员函数为应用程序调用NotifySaved函数。NotifySaved函数通知OLE系统DLL，后者再接着通知容器应用程序。在用微软基础类库编写的容器应用程序中，将调用COleClientItem的OnChange成员函数。

请参阅：
COleServerDoc::NotifyChanged, COleServerDoc::NotifyClosed, COleClientItem::OnChange, CDocument::OnSaveDocument


 COleServerDoc::OnClose

virtual void OnClose( OLECLOSE dwCloseOption );

参数：
dwCloseOption一个OLECLOSE枚举值。这个参数的值可以是下列值之一：
· | OLECLOSE_SAVEIFDIRTY | 如果文件已被修改则将该文件保存。
· | OLECLOSE_NOSAVE | 将文件关闭而不保存。
· | OLECLOSE_PROMPTSAVE | 如果文件已被修改，则向用户提示保存文件。

说明：
当容器应用程序请求关闭服务器文档时，框架调用此函数。函数的缺省实现调用CDocument::OnCloseDocument函数。要获取更多有关OLECLOSE和其它值的信息，请参见OLE文档的OLECLOSE。

请参阅：
COleException, CDocument::OnCloseDocument


 COleServerDoc::OnDeactivate

virtual void OnDeactivate();

说明：
当用户使一个当前现场活动的嵌入或链接项变为不活动的时候，框架调用此函数。该函数将容器应用程序的用户界面恢复到其原始状态，并销毁视窗为现场激活所创建的任何菜单和其它控件。
此时，取消状态信息应当被无条件释放。
要获取更多的信息，请参见“Visual C++程序员指南”中的文章“激活”。

请参阅：
COleServerDoc::ActivateInPlace, COleServerDoc::OnDeactivateUI, COleServerDoc::DestroyInPlaceFrame


 COleServerDoc::OnDeactivateUI

virtual void OnDeactivateUI( BOOL bUndoable );

参数：
bUndoable 指示编辑改变是否可以被取消。

说明：
当用户使一个现场活动的项变为不活动时，调用此函数。函数将容器应用程序的用户界面恢复到其原始状态，隐藏由现场激活所创建的任何菜单和其它控件。
框架总是设置bUndoable为FALSE。如果服务器应用程序支持取消操作，但是不存在一个可被取消的操作，则bUndoable设置为TRUE来调用由基类实现的OnDeactivateUI函数。

请参阅：COleServerDoc::OnDeactivate


 COleServerDoc::OnDocWindowActivate

virtual void OnDocWindowActivate( BOOL bActivate );

参数：
bActivate 指示是将文档窗口激活还是使它成为不活动的。

说明：
框架调用这个函数来激活用于现场编辑的一个文档窗口，或使此窗口变成不活动的。该函数的缺省实现是删除或增加相应的框架顶层用户界面元素。如果当包含项的文档被激活或成为不活动时，应用程序希望执行附加的动作，则可以重载这个函数。

请参阅：
COleServerDoc::ActivateInPlace, COleServerDoc::OnReactivateAndUndo, COleServerDoc::OnShowControlBars, COleServerDoc::OnDeactivateUI, COleServerDoc::OnFrameWindowActivate, COleIPFrameWnd


 COleServerDoc::OnExecOleCmd

HRESULT OnExecOleCmd( const GUID* pGroup, DWORD nCmdID, DWORD nCmdExecOut, VARIANTARG* pvaIn, VARIANTARG* pvaOut );

返回值：
如果成功则返回S_OK；否则，返回下列错误代码之一：
值 | 描述
E_UNEXPECTED | 发生了意外的错误
E_FAIL | 发生了错误
E_NOTIMPL | 表明MFC自身要尝试翻译和分派命令
OLECMDERR_E_UNKNOWNGROUP | pGroup不是NULL，但是不表示一个被认可的命令组
OLECMDERR_E_NOTSUPPORTED | nCmdID不被认可为是pGroup群中的有效命令
OLECMDERR_DISABLED | 由nCmdID标识的命令被变为无效，不能被执行
OLECMDERR_NOHELP | 调用者请求有关由nCmdID标识的命令的帮助，但是没有可用的帮助
OLECMDERR_CANCELED | 用户取消了执行

参数：
pGroup | 一个指向GUID的指针，这个GUID标识了一个命令集。它可以是NULL，这表示缺省的命令组。
nCmdID | 要执行的命令。必须是在由pGroup标识的组中。
nCmdExecOut | 对象执行命令的方式，可以是下列OLECMDEXECOPT枚举值中的一个或某几个： ·OLECMDEXECOPT_DODEFAULT ·OLECMDEXECOPT_PROMPTUSER ·OLECMDEXECOPT_DONTPROMPTUSER ·OLECMDEXECOPT_SHOWHELP
pvaIn | 指向一个VARIANTARG的指针，这个VARIANTARG包含了命令的输入参数。它可以是NULL。
pvaOut | 指向一个VARIANTARG的指针，这个VARIANTARG用来接收来自命令的输出返回值。它可以是NULL。

说明：
框架调用这个函数来执行一个指定的命令，或为命令显示帮助。
COleCmdUI可以用来使能，更新和设置DocObject用户界面命令的其它属性。
在命令被初始化之后，你可以用OnExecOleCmd来执行它们。在框架尝试翻译和分派一个OLE文档命令之前，它调用这个函数。在处理标准的OLE文档命令时，你不必重载这个函数。但是如果你想处理你自己的定制命令，或处理需要接收参数或返回结果的命令时，你必须要重载这个函数。
大多数命令不需要接收参数或返回结果。对于大多数的命令来说，调用者可以将NULL赋给pvaIn和pvaOut。对于那些需要接收输入参数的命令，调用者可以声明和初始化一个VARIANTARG变量，并将一个指针传递给pvaIn中的变量。对需要一个单一值的命令，参数被直接保存在VARIANTARG中，并传递给函数。而多个参数则必须要在VARIANTARG中使用某个允许的类型（如IDispatch和SAFEARRAY）来打包。
类似的，如果一个命令要返回参数，则调用者需要定义一个VARIANTARG，将它初始化为VT_EMPTY，并将它的地址传递给pvaOut。如果命令返回一个单一的值，则对象可以将这个值直接保存在pvaOut中。如果有多个输出值则必须用某种适用于VARIANTARG的方法来打包。
这个函数的基类实现将使OLE COMMAND_MAP结构与命令目标相联系，并尝试为命令分派一个合适的句柄。函数的基类实现只处理不接收参数和不返回结果的命令。如果你需要处理接收参数或返回结果的命令，你就必须重载这个函数，并且自己来处理pvaIn和pvaOut。

请参阅：COleCmdUI


 COleServerDoc::OnFrameWindowActivate

virtual void OnFrameWindowActivate( BOOL bActivate );

参数：
bActivate 指示框架窗口是要被激活还是变为不活动的。

说明：
当容器应用程序的框架窗口被激活或变为不活动时，框架调用这个函数。此函数的缺省实现是取消框架窗口可能处于的任何帮助方式。如果当框架窗口被激活或成为不活动时，应用程序想要执行特定的处理，则可以重载OnFrameWindowActive函数。
如果要获取更多的信息，请参见“Visual C++程序员指南”中的文章“激活”。

请参阅：
COleServerDoc::OnDocWindowActivate


 COleServerDoc::OnGetEmbeddedItem

virtual COleServerItem* OnGetEmbeddedItem() = 0;

返回值：
如果成功则返回一个指向代表着整个文档的项的指针；否则返回NULL。

说明：
当容器应用程序调用服务器应用程序来创建或编辑一个嵌入项时，框架调用该函数。该函数没有缺省实现。应用程序必须重载这个函数以返回一个表示整个文档的项。这个返回值应该是一个COleServerItem派生类对象。

请参阅：
COleLinkingDoc::OnGetLinkedItem, COleServerItem


 COleServerDoc::OnReactivateAndUndo

virtual BOOL OnReactivateAndUndo();

返回值：
如果成功则返回一个非零值；否则返回0。

说明：
当用户选择取消对一个已被现场激活，后来又变为不活动的项所作的改变时，框架调用这个函数。该函数的缺省实现除了返回FALSE来表明失败之外，它不做任何事情。
如果你的应用程序要支持取消，请重载这个函数。通常应用程序会执行取消操作，然后调用ActivateInPlace函数来激活项。如果容器应用程序是用微软基础类库编写的，则调用COleClientItem::ReactivateAndUndo会导致调用OnReactivateAndUndo函数。

请参阅：
COleServerDoc::ActivateInPlace, COleServerDoc::IsInPlaceActive, COleClientItem::ReactivateAndUndo


 COleServerDoc::OnResizeBorder

virtual void OnResizeBorder( LPCRECT lpRectBorder, LPOLEINPLACEUIWINDOW lpUIWindow, BOOL bFrame );

参数：
lpRectBorder | 指向一个RECT结果或CRect对象的指针，此结构或对象指定边框的坐标。
lpUIWindow | 指向一个IOleInPlaceUIWindow类对象，此对象拥有当前的现场编辑会话。
bFrame | 如果lpUIWindow指向容器应用程序的顶层框架窗口，则设该参数为TRUE；如果lpUIWindow指向容器应用程序的文档顶层框架窗口，则设该参数为FALSE。

说明：
当容器应用程序的框架窗口改变大小时，框架调用这个函数。该函数根据新的窗口大小来改变和调整工具条和其它用户界面元素的大小。
此函数是一个高级的可重载函数。

请参阅：COleServerDoc::OnShowControlBars


 COleServerDoc::OnSetHostNames

virtual void OnSetHostNames( LPCTSTR lpszHost, LPCTSTR lpszHostObj );

参数：
lpszHost | 指向一个字符串的指针，该字符串指定了容器应用程序的名字。
lpszHostObj | 指向一个字符串的指针，该字符串指定了文档的容器名称。

说明：
当容器应用程序设置或改变此文档的主机名时，框架调用此函数。此函数的缺省实现改变所有引用此文档的视的文档标题。
如果你的应用程序想通过一种不同的机制来设置标题，则需要重载这个函数。

请参阅：COleClientItem::SetHostNames


 COleServerDoc::OnSetItemRects

virtual void OnSetItemRects( LPCRECT lpPosRect, LPCRECT lpClipRect );

参数：
lpPosRect | 指向一个RECT结构或CRect对象的指针，此结构或对象指定框架窗口相对于容器应用程序的客户区的位置。
lpClipRect | 指向一个RECT结构或CRect对象的指针，此结构或对象指定在适当位置的框架窗口的剪贴矩形（相对于容器应用程序的客户区）。

说明：
框架调用这个函数来在容器应用程序的框架窗口内定位现场编辑创建窗口。如果有必要更新视的缩放因子，则可以重载这个函数。
尽管OnSsetItemRects可以在任何时候由容器应用程序调用来请求改变现场可编辑项的位置，但它通常还是用于响应RequestPositionChange调用。

请参阅：
COleServerDoc::RequestPositionChange, COleIPFrameWnd::RepositionFrame, COleClientItem::SetItemRects, COleServerDoc::GetZoomFactor


 COleServerDoc::OnShowControlBars

virtual void OnShowControlBars( CFrameWnd *pFrameWnd, BOOL bShow );

参数：
pFrameWnd | 指向框架窗口的指针，此框架窗口的控制条将被隐藏或显示。
bShow | 确定控制条是显示还是隐藏。

说明：
框架调用这个函数来显示或隐藏与pFrameWnd所标识的框架窗口相关联的服务器应用程序的控制条。该函数的缺省实现是枚举该框架窗口所拥有的所有控制条，并隐藏或显示它们。

请参阅：
COleServerDoc::ActivateInPlace, COleServerDoc::OnReactivateAndUndo, COleServerDoc::OnFrameWindowActivate, COleServerDoc::IsInPlaceActive


 COleServerDoc::OnShowDocument

virtual void OnShowDocument( BOOL bShow );

参数：
bShow 指示是显示还是隐藏文档的用户界面。

说明：
当服务器文档必须被隐藏或显示时，框架调用OnShowDocument函数。如果bShow为TRUE，则该函数的缺省实现是在响应时激活服务器拥有的程序，并使容器应用程序滚动它的窗口以使此项可见。如果bShow为FALSE，则函数的缺省实现是通过一个OnDeactivate调用使此项不活动，然后销毁或隐藏为该文档创建的所有框架窗口（除了第一个）。如果没有可见文档，则该函数的缺省实现隐藏服务器应用程序。

请参阅：
COleServerDoc::ActivateInPlace, COleServerItem::OnDoVerb, COleServerDoc::IsInPlaceActive, COleServerDoc::OnDeactivateUI


 COleServerDoc::OnUpdateDocument

virtual BOOL OnUpdateDocument();

返回值：
如果文档被成功地更新则返回非零值；否则返回0。

说明：
当保存一个作为复合文档中的嵌入项的文档时，框架调用该函数。该函数的缺省实现调用COleServerDoc::NotifySaved和COleServerDoc::SaveEmbedding成员函数，然后将文档标记为干净的（未修改的）。如果应用程序想要在更新一个嵌入项时执行特定的处理，则必须重载这个函数。

请参阅：
COleServerDoc::NotifySaved, COleServerDoc::SaveEmbedding, CDocument::OnSaveDocument


 COleServerDoc::RequestPositionChange

void RequestPositionChange( LPCRECT lpPosRect );

参数：
lpPosRect 指向一个RECT结构或CRect对象的指针，此结构或对象中包含此项的新位置。

说明：
此成员函数使容器应用程序改变此项的位置。当现场活动的项中的数据改变时，通常调用RequestPositionChange函数（与UpdateAllItems一起调用）。在此调用之后，容器应用程序可能调用也可能不调用OnSetItemRects函数来执行这个改变。最终位置可能与请求的位置并不相同。

请参阅：COleServerDoc::ScrollContainerBy


 COleServerDoc::SaveEmbedding

void SaveEmbedding();

说明：
这个函数用来告诉容器应用程序保存嵌入对象。OnUpdateDocument会自动调用此函数。值得注意的是这个函数会导致项被在磁盘上更新，因此，它通常只是作为一次特定用户动作的结果被调用。

请参阅：COleServerDoc::NotifyClosed


 COleServerDoc::ScrollContainerBy

BOOL ScrollContainerBy ( CSize sizeScroll );

返回值：如果成功则返回非零值；否则返回0。

参数：
sizeScroll 指示容器文档要滚动多远。

说明：
ScrollContainerBy成员函数将容器文档滚动sizeScroll中所指定的像素数量。正值表示向下和向右滚动；负值表示向上和向左滚动。

请参阅：COleClientItem::OnScrollBy


 COleServerDoc::UpdateAllItems

void UpdateAllItems( COleServerItem* pSender,
LPARAM lHint = 0L,
CObject* pHint = NULL,
DVASPECT nDrawAspect = DVASPECT_CONTENT
);

参数：
pSender | 指向修改文档的项的指针；如果所有项都要被更新，则设置该参数为NULL。
lHint | 包含了有关修改的信息。
pHint | 指向一个包含有关修改的信息的对象的指针。
nDrawAspect确定如果绘制此项。该参数是一个DVASPECT枚举值。它可以是下列值之一：
· | DVASPECT_CONTENT | 用一种可将项显示为其容器文档中一个嵌入对象的方式来显示此项。
· | DVASPECT_THUMBNAIL | 以“拇指甲”的方式来显示项，以使它能在浏览工具中显示。
· | DVASPECT_ICON | 将项显示为一个图标。
· | DVASPECT_DOCPRINT | 将项显示为就好象是在利用File菜单中的Print命令打印它。

说明：
此函数将文档改变了的信息通知给连接在此文档上的所有链接项。应用程序一般在用户改变服务器文档之后调用这个函数。如果一个OLE项以一个自动链接链接到此文档上，则该项被更新以反映这些变化。在用微软基础类库编写的容器应用程序中，将调用COleClientItem的OnChange成员函数。
除了发送项外，UpdateAllItems函数为文档的每个项调用OnUpdate成员函数，传递pHint，lHint和nDrawAspect参数。利用这些参数将有关对文档所做修改的信息传递给各个项。应用程序可以利用lHint对信息进行编码，或者定义一个CObject派生类来存储有关修改的信息并用pHint传递一个该类的对象。可在应用程序的COleServerItem派生类中重载OnUpdate成员函数，根据每个项的显示是否改变了来优化对各个项的更新。

请参阅：
COleServerDoc::NotifyChanged, COleServerItem::OnUpdate, COleServerDoc::NotifySaved, COleClientItem::OnChange


 COleServerItem

CObject
└CCmdTarget
└CDocItem
└COleServerItem

COleServerItem类提供对OLE项的服务器接口。一个链接项可以表示某些或全部服务器文档。一个嵌入项则总是表示整个服务器文档。
COleServerItem类定义了几个可重载的成员函数，这些函数由OLE系统动态链接库（DLL）调用，通常用于响应来自容器应用程序的请求。这些成员函数允许容器应用程序以各种方式间接地对项进行操作，例如显示它，执行它的动词，或以各种格式获取它的数据。
要使用COleServerItem，可从COleServerItem中派生一个新类，并实现OnDraw和Serialize成员函数。OnDraw函数提供项的元文件表示，使它可在容器应用程序打开一个命令文档时显示。CObject的Serialize函数提供项的本机表示，使得一个嵌入项可在服务器应用程序和容器应用程序之间直接传输。OnGetExtent函数提供项的固有对象给容器应用程序，使得容器应用程序可以设置项的大小。
要获取更多有关服务器及其相关话题的信息，请参见“Visual C++程序员指南”中的文章“服务器：实现一个服务器”和文章“容器：高级特征”中的“创建一个容器/服务器应用程序”。
#include <afxole.h>\>
请参阅：COleClientItem, COleServerItem, COleTemplateServer

COleServerItem类成员

状态
GetDocument | 返回包含此项的服务器文档
GetItemName | 返回此项的名称。只用于链接项
SetItemName | 设置此项的名称。只用于链接项
IsConnected | 指示此项当前是否连接到一个活动的容器应用程序上
IsLinkedItem | 指示此项是否表示一个链接式OLE项

操作
CopyToClipboard | 将此项拷贝到剪贴板上
NotifyChanged | 用自动链接更新来更新所有的容器
DoDragDrop | 执行一次拖放操作
GetClipboardData | 获取用于数据传输（拖放或剪贴）的数据源
GetEmbedSourceData | 获取一个OLE项的CF_EMBEDSOURCE数据
AddOtherClipboardData | 将显示和转换格式放进一个COleDataSource对象
GetLinkSourceData | 获取一个OLE项的CF_LINKSOURCE数据
GetObjectDescriptorData | 获取一个OLE项的CF_OBJECTDESCRIPTOR数据

构造
COleServerItem | 构造一个COleServerItem对象
GetDataSource | 获取用于存储转换格式的对象

可重载
OnDraw | 当容器应用程序请求绘制此项时，调用该函数；需要实现
OnDrawEx | 用于绘制专用化的项
OnUpdate | 当此项所属的文档的某部分改变时，调用该函数
OnInitFromData | 由框架调用该函数，该函数用指定的数据传输对象的内容来初始化一个OLE项
OnGetExtent | 由框架调用此函数来获取此OLE项的大小
OnSetExtent | 由框架调用此函数来设置此OLE项的大小
OnGetClipboardData | 由框架调用此函数来获取将要拷贝到剪贴板中的数据
OnSetColorScheme | 用于设置项的颜色表
OnSetData | 用于设置项的数据
OnDoVerb | 用于执行一个动词
OnQueryUpdateItems | 用于确定是否有链接项需要更新
OnRenderData | 获取数据为延迟提供的一部分
OnRenderFileData | 将数据检取到一个CFile中，作为延迟提供的一部分
OnRenderGlobalData | 将数据检取到一个HGLOBAL中，作为延迟提供的一部分
OnUpdateItems | 用于更新服务器文档中所有项的显示高速缓存
OnOpen | 由框架调用此函数来将此OLE项显示在它自己的顶层窗口中
OnShow | 当容器应用程序请求显示此项时，调用该函数
OnHide | 由框架调用该函数来隐藏此OLE项

数据成员
m_sizeExtent 通知服务器此OLE项有多少是可见的


 COleServerItem::AddOtherClipboardData

void AddOtherClipboardData( COleDataSource* pDataSource );

参数：
pDataSource 指向一个COleDataSource对象的指针，数据将放在此对象中。

说明：
此函数用来将OLE项的显示和转换格式放进指定的COleDataSource对象中。
应用程序必须已经实现了OnDraw成员函数，这样才能提供此项的显示格式（一个图元文件图像）。要支持其它的转换格式，可以向GetDataSource返回的COleDataSource对象注册这些格式，并重载OnRenderData成员函数以应用程序希望支持的格式来提供数据。

请参阅：
COleDataSource, COleServerItem::GetDataSource, COleServerItem::GetEmbedSourceData, COleServerItem::OnDraw


 COleServerItem::COleServerItem

COleServerItem( COleServerDoc* pServerDoc, BOOL bAutoDelete );

参数：
pServerDoc | 指向包含此项的文档的指针。
bAutoDelete | 一个标志，指示当连接到此对象的一个链接被释放时，此对象是否可被删除。如果此COleServerItem对象是必须删除的文档数据的组成部分，则将该参数设置为FALSE。如果此对象是用于标识文档中可被删除的数据范围的辅助结构，则将该参数设置为TRUE。

说明：
此函数构造一个COleServerItem项，并将其添加到服务器文档的文档项集合中。

请参阅：COleDocument::AddItem


 COleServerItem::CopyToClipboard

void CopyToClipboard( BOOL bIncludeLink = FALSE );

参数：
bIncludeLink 如果链接数据将被拷贝到剪贴板中，则将此参数设置为TRUE。如果服务器应用程序不支持链接，则将此参数设置为FALSE。

说明：
该函数将此OLE项拷贝到剪贴板中。它利用OnGetClipboardData成员函数来创建一个COleDataSource对象，此对象包含了以所支持的格式表示的OLE项数据。然后函数利用COleDataSource::SetClipboard函数将此COleDataSource对象放到剪贴板上。这个COleDataSource对象中包括了此项的本机数据和它的CF_METAFILEPICT格式的表示，以及应用程序选择支持的任何转换格式中的数据。应用程序必须已经实现了Serialize和OnDraw函数，以使此CopyToClipboard成员函数可以工作。

请参阅：
COleDataSource::SetClipboard, COleDataSource, COleServerItem::AddOtherClipboardData, COleServerItem::GetClipboardData, COleServerItem::OnDraw, CObject::Serialize


 COleServerItem::DoDragDrop

DROPEFFECT DoDragDrop( LPCRECT lpItemRect,
CPoint ptOffset,
BOOL bIncludeLink = FALSE,
DWORD dwEffects = DROPEFFECT_COPY | DROPEFFECT_MOVE,
LPCRECT lpRectStartDrag = NULL
);

返回值：
是一个DROPEFFECT枚举值。如果它是DROPEFFECT_MOVE，则原始数据将被删除。

参数：
lpItemRect | 指定项在屏幕上的矩形，相对于客户区，用像素表示。
ptOffset | 拖动时鼠标位置距离lpItemRect的偏移。
bIncludeLink | 如果链接数据将被拷贝到剪贴板上，则将此参数设置为TRUE。如果应用程序不支持链接，则将此参数设置为FALSE。
dwEffects | 确定数据源在拖动操作中允许的效果（Copy，Move和Link的组合）。
lpRectStartDrag | 指向调用拖动实际开始处的矩形的指针。更多的信息，请参见下面的说明部分。

说明：
此成员函数用来执行一次拖放操作。拖放操作并不是立即开始。直到鼠标光标离开由lpRectStartDrag指定的矩形后，或者直到已经过去了指定的毫秒数后，拖放才开始。如果lpRectStartDrag为NULL，则使用缺省拖动矩形，这样拖动在鼠标光标至少移动一个像素时才开始。
延迟时间是由一个注册表键设置来确定的。你可以通过调用CWinApp::WriteProfileString或者CWinApp::WriteProfileInt来改变延迟时间。如果你没有指定延迟时间，则使用缺省的200毫秒延迟设置。拖动延迟时间是按下面的方式保存的：
· | Windows NT | 拖动延迟时间被保存在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\NT\CurrentVersion\IniFileMapping\win.ini\Windows\DragDelay。
· | Windows 3.x | 拖动延迟时间被保存在[Windows]部分下的WIN.INI文件中。
· | Windows 95 | 拖动延迟时间被保存在WIN.INI的缓冲版本中。
如果要获取更多有关拖动延迟时间是如何保存在注册表或.INI文件中的信息，请参见Platform SDK中的::WriteProfileString。

请参阅：
COleDataSource::DoDragDrop, COleServerItem::CopyToClipboard


 COleServerItem::GetClipboardData

void GetClipboardData( COleDataSource* pDataSource,
BOOL bIncludeLink = FALSE,
LPPOINT lpOffset = NULL,
LPSIZE lpSize = NULL
);

参数：
pDataSource | 指向一个COleDataSource对象的指针，此对象将接收OLE项的所有用所支持的格式表示的数据。
bIncludeLink | 如果链接数据可以被拷贝到剪贴板中，则将此参数设置为TRUE。如果你的服务器应用程序不支持链接，则将此参数设置为FALSE。
lpOffset | 鼠标光标距离此对象原点的以像素表示的偏移。
lpSize | 此对象以像素表示的大小。

说明：
此函数用将拷贝到剪贴板中的所有数据（如果调用CopyToClipboard函数）填充到指定的COleDataSource对象中（如果调用DoDragDrop，同样的数据也将被传输）。GetClipboardData成员函数调用GetEmbedSourceData成员函数来获取此OLE项的本机数据，并调用AddOtherClipboardData成员函数来获取显示格式和任何所支持的转换格式。如果bIncludeLink为TRUE，则GetClipboardData函数也调用GetLinkSourceData函数来获取此项的链接数据。
如果你希望在CopyToClipboard提供这些格式之前或之后将它们放进一个COleDataSource对象中，则可重载这个函数。

请参阅：
COleDataSource, COleServerItem::AddOtherClipboardData, COleServerItem::CopyToClipboard, COleServerItem::DoDragDrop, COleServerItem::GetEmbedSourceData, COleServerItem::GetLinkSourceData


 COleServerItem::GetDataSource

COleDataSource* GetDataSource();

返回值：
一个指向COleDataSource对象的指针，该对象用来保存转换格式。

说明：
此函数用来获取用于存储服务器应用程序所支持的转换格式的COleDataSource对象。如果你希望你的服务器应用程序可以在数据传输操作期间提供多种格式的数据，则可以向此函数返回的COleDataSource对象注册这些格式。例如，如果应用程序想要提供OLE项的CF_TEXT表示以用于剪贴板或拖放操作，则要向GetDataSource返回的COleDataSource对象注册这种格式，然后重载OnRenderXxxData成员函数来提供数据。

请参阅：
COleDataSource, COleDataSource::DelayRenderData, COleServerItem::CopyToClipboard, COleServerItem::DoDragDrop, COleServerItem::OnRenderData, COleServerItem::OnRenderFileData, COleServerItem::OnRenderGlobalData


 COleServerItem::GetDocument

COleServerDoc* GetDocument() const;

返回值：
一个指向包含此项的文档的指针；如果此项不是文档的一部分，则返回值为NULL。

说明：
此函数获取指向包含此项的文档的指针。它支持对作为参数传递给COleServerItem构造函数的服务器文档的访问。

请参阅：
COleServerItem::COleServerItem, COleServerDoc


 COleServerItem::GetEmbedSourceData

void GetEmbedSourceData( LPSTGMEDIUM lpStgMedium );

参数：
lpStgMedium 指向一个STGMEDIUM结构的指针，此结构将接收此OLE项的CF_EMBEDSOURCE数据。

说明：
此函数用来获取一个OLE项的CF_EMBEDSOURCE数据。这种格式中包括此项的本机数据。应用程序必须已经实现了Serialize成员函数，以使GetEmbedSourceData函数能够正确运行。
该函数的结果可以用COleDataSource::CacheData函数增加到一个数据源中。
GetEmbedSourceData函数由OnGetClipboard函数自动调用。
如果要获取更多的信息，请参见“OLE 2程序员参考，卷1”中的STGMEDIUM。

请参阅：
COleServerItem::GetLinkSourceData, COleServerItem::GetObjectDescriptorData, COleDataSource::CacheData, CObject::Serialize


 COleServerItem::GetItemName

const CString& GetItemName() const;

返回值：返回值是项的名字。

说明：
此函数用来获取项的名字。应用程序一般只对链接项调用这个函数。

请参阅：
COleServerItem::SetItemName, COleLinkingDoc::OnGetLinkedItem


 COleServerItem::GetLinkSourceData

BOOL GetLinkSourcedData( LPSTGMEDIUM lpStgMedium );

返回值：如果成功则返回非零值；否则返回0。

参数：
lpStgMedium 指向一个STHGMEDIUM结构的指针，此结构将接收此OLE项的CF_LINKSOURCE数据。

说明：
此函数用来获取一个OLE项的CF_LINKSOURCE数据。这种格式中包括用于描述此OLE项类型的CLSID，以及定位包含此OLE项的文档所需的信息。
此函数的结果可用COleDataSource::CacheData函数增加到一个数据源中。GetLinkSourceData函数由OnGetClipboard函数自动调用。
要获取更多的信息，请参见“OLE 2程序员参考，卷1”中的STGMEDIUM。

请参阅：
COleServerItem::GetEmbedSourceData, COleServerItem::GetObjectDescriptorData


 COleServerItem::GetObjectDescriptorData

void GetObjectDescriptorData( LPPOINT* lpOffset,
LPSIZE* lpSize,
LPSTGMEDIUM lpStgMedium
);

参数：
lpOffset | 鼠标单击距离此OLE项左上角的偏移。该参数可以为NULL。
lpSize | 此OLE项的大小。该参数可以为NULL。
lpStgMedium | 指向一个STGNEDIUM结构的指针，此结构将接收此OLE项的CF_OBJECTDESCRIPTOR数据。

说明：
此函数用来获取一个OLE项的CF_OBJECTDESCRIPTOR数据。这个信息被拷贝到lpStgMedium所指向的STGMEDIUM结构中。这种格式包括Paste Special对话框所需要的信息。
如果要获取更多的信息，请参见“OLE 2程序员参考，卷1”中的STGMEDIUM。

请参阅：
COleServerItem::AddOtherClipboardData, COleServerItem::GetEmbedSourceData, COleServerItem::GetLinkSourceData, COlePasteSpecialDialog


 COleServerItem::IsConnected

BOOL IsConnected() const;

返回值：
如果此项被连接则返回一个非零值；否则返回0。

说明：
此函数用来判断OLE项是否被连接。如果有一个或多个容器文档引用一个OLE项，则认为此OLE项是被连接的。如果一个项的引用计数大于零或者若该项是一个嵌入项，则认为此项是被连接的。

请参阅：
COleServerItem::IsLinkedItem, COleLinkingDoc::OnGetLinkedItem


 COleServerItem::IsLinkedItem

BOOL IsLinkedItem() const;

返回值：
如果此项是一个链接项，则返回一个非零值；否则返回0。

说明：
此函数用来判断此OLE项是否是一个链接项。如果一个项是合法的，并且未返回在文档的嵌入项表中，则此项是链接项。链接项可以链接也可以不链接到容器文档上。
通常对链接和嵌入项使用同一个类。IsLinkedItem函数支持应用程序将链接项的行为有别于嵌入项，尽管它们的代码常常是通用的。

请参阅：
COleServerItem::IsConnected, COleLinkingDoc::OnGetLinkedItem


 COleServerItem::NotifyChanged

void NotifyChanged( DVASPECT nDrawAspect = DVASPECT_CONTENT );

参数：
nDrawAspect一个DVASPECT枚举值，用于指示此OLE项的哪一特征改变了。这个参数可以取下列任何值：
· | DVASPECT_CONTENT | 用这种方式表示的项可以作为一个嵌入对象显示在它的容器中。
· | DVASPECT_THUMBNAIL | 用“拇指甲”方式表示项，以使它可以显示在一个浏览工具中。
· | DVASPECT_ICON | 用图标来表示项。
· | DVASPECT_DOCPRINT | 项被表示为就象它被用File菜单中的Print命令打印一样。

说明：
当链接项改变后，调用此函数。如果一个容器应用程序项用一个自动链链接到文档上，则此项被更新以反映这些变化。在用微软基础类库编写的容器应用程序中，将调用COleClientItem的OnChange成员函数来作为响应。

请参阅：
COleClientItem::OnChange, COleServerItem::OnUpdate, COleServerDoc::NotifyChanged


 COleServerItem::OnDoVerb

virtual void OnDoVerb( LONG iVerb );

参数：
iVerb指定要执行的动词。它可以是下列值中的任何一个。
值 | 含义 | 符号
0 | 主动词 | OLEIVERB_PRIMARY1此动词（无）
-1 | 显示用于编辑的项 | OLEIVERB_SHOW
-2 | 在独立窗口中编辑项 | OLEIVERB_OPEN
-3 | 隐藏项 | OLEIVERB_HIDE

值-1通常是另一个动词的别名。如果打开编辑不支持，则-2值与-1值作用相同。
有关其它的取值，参看“OLE 2程序员参考，卷1”中的IOleObject::DoVerb。

说明：
框架调用这个函数来执行指定的动词。如果容器应用程序是用微软基础类库编写的，则当对应的COleClientItem对象的COleClientItem::Activate成员函数被调用时，调用OnDoVerb函数。如果指定主动词或OLEIVERB_SHOW，则OnDoVerb的缺省实现是调用On_Show成员函数；如果指定次动词或OLEIVERB_OPEN，则缺省实现是调用OnOpen成员函数；如果指定OLEIVERB_HIDE，则缺省实现是调用OnHide成员函数。如果iVerb不是上面所列中的任何一个，则缺省实现是调用OnShow成员函数。
如果指定的主动词不显示此项，则可重载这个函数。例如，如果此项是一个声音记录，并且其主动词是Play，则应用程序不必显示服务器应用程序来播放此项。如果要获取更多的信息，请参见“OLE 2 程序员参考，卷1”中的IOleObject::DoVerb。

请参阅：
COleClientItem::Activate, COleServerItem::OnShow, COleServerItem::OnOpen, COleServerItem::OnHide


 COleServerItem::OnDraw

virtual BOOL OnDraw( CDC* pDC, CSize& rSize ) = 0;

返回值：
如果此项绘制成功，则返回一个非零值；否则返回0。

参数：
pDC | 指向一个CDC对象的指针，要在此对象上绘制此项。显示描述表自动连接到属性显示描述表，因此应用程序可以调用属性函数，尽管这样做会使图元文件设备专用化。
rSize | 指定绘制图元文件的大小（以HIMETRIC为单位）。

说明：
框架调用此函数来将此OLE项转换到一个图元文件中。此OLE项的图元文件表示用于在容器应用程序中显示此项。如果容器应用程序是用微软基础类库编写的，则由对应的COleClientItem对象的Draw成员函数使用此图元文件。Draw函数没有缺省实现。要将此项在指定的设备环境中绘制，应用程序必须重载OnDraw函数。

请参阅：COleClientItem::Draw


 COleServerItem::OnDrawEx

virtual BOOL OnDrawEx( CDC* pDC, DVASPECT nDrawAspect, CSize& rSize );

返回值：
如果此项绘制成功则返回一个非零值；否则返回值为0。

参数：
pDC | 指向一个CDC对象的指针，要在此对象上绘制该项。DC自动连接到属性DC上，因此应用此项可以调用属性函数，尽管这样做会使元文件设备专用化。
nDrawAspect一个DVASPECT枚举值。此参数可以取下列任何值：
· | DVASPECT_CONTENT | 用这种方式表示的项可以作为一个嵌入对象显示在它的容器中。
· | DVASPECT_THUMBNAIL | 用“拇指甲”方式表示项，以使它可以显示在一个浏览工具中。
· | DVASPECT_ICON | 用图标来表示项。
· | DVASPECT_DOCPRINT | 项被表示为就象它被用File菜单中的Print命令打印一样。
rSize | 此项的大小（以HIMETRIC为单位）。

说明：
框架调用此函数来进行所有绘制。当DVASPECT等于DVASPECT_CONTENT时，缺省实现是调用OnDraw函数，否则函数失败。
可重载此函数来为非DVASPECT_CONTENT的特征如DVASPECT_ICON或DVASPECT_THUMBNAIL提供数据。

请参阅：COleServerItem::OnDraw


 COleServerItem::OnGetClipboardData

virtual COleDataSource* OnGetClipboardData( BOOL bIncludeLink,
LPPOINT lpOffset,
LPSIZE lpSize
);

返回值：
一个指向包含剪贴板数据的COleDataSource对象的指针。

参数：
bIncludeLink | 如果链接数据将被拷贝到剪贴板上，则设置该参数为TRUE；如果服务器应用程序不支持链接，则将该参数设置为FALSE。
lpOffset | 鼠标光标距离此对象原点的偏移（以像素计算）。
lpSize | 此对象的用像素表示的大小。

说明：
框架调用这个函数来获取一个COleDataSource对象。此对象中包含将要由CopyToClipboard成员函数调用放到剪贴板上去的所有数据。OnGetClipbordData的缺省实现调用GetClipboardData。

请参阅：
COleDataSource, COleDataSource::SetClipboard, COleServerItem::CopyToClipboard, COleServerItem::GetClipboardData


 COleServerItem::OnGetExtent

virtual BOOL OnGetExtent( DVASPECT nDrawAspect, CSize& rSize );

返回值：如果成功则返回非零值；否则返回0。

参数：
nDrawAspect指定OLE项的特征，此OLE项的边界将要被获取。此参数的值可以是下列任意值：
· | DVASPECT_CONTENT | 用这种方式表示的项可以作为一个嵌入对象显示在它的容器中。
· | DVASPECT_THUMBNAIL | 用“拇指甲”方式表示项，以使它可以显示在一个浏览工具中。
· | DVASPECT_ICON | 用图标来表示项。
· | DVASPECT_DOCPRINT | 项被表示为就像它被用File菜单中的Print命令打印一样。
rSize 一个CSize对象的引用，此对象将接收此OLE项的大小。

说明：
框架调用此函数来获取此OLE项的以HIMETRIC为单位的大小。
如果容器应用程序是用微软基础类库编写的，则在调用对应的COleClientItem对象的GetExtent成员函数时，调用OnGetExtent函数。此函数的缺省实现不做任何事情。你必须自己来实现它。如果你希望在处理此OLE项的尺寸请求时执行特殊的处理，则需要重载这个函数。

请参阅：
COleClientItem::Draw, COleClientItem::GetExtent


 COleServerItem::OnHide

virtual void OnHide();

说明：
由框架调用此函数来隐藏OLE项。其缺省实现调用了COleServerDoc::OnShowDocument（FALSE）。此函数还通知容器应用程序此OLE项已经被隐藏。如果你希望在隐藏一个OLE项时执行特殊的处理，则可以重载这个函数。

请参阅：
COleServerItem::OnOpen, COleServerItem::OnShow, COleServerDoc::OnShowDocument


 COleServerItem::OnInitFromData

virtual BOOL OnInitFromData( COleDataObject* pDataObject, BOOL bCreation );

返回值：如果成功则返回非零值；否则返回0。

参数：
pDataObject | 指向一个OLE数据对象的指针，该对象包含了用来初始化该OLE项的各种格式的数据。
bCreation | 如果调用此函数来初始化一个刚由容器应用程序创建的OLE项，则将此参数设置为TRUE。如果调用此函数来替换一个已有的OLE项的内容，则将此参数设置为FALSE。

说明：
由框架调用这个函数来以pDataObject的内容初始化一个OLE项。如果bCreation的值是TRUE，则当容器应用程序基于当前选择实现了Insert New Object时调用这个函数。所选数据用于创建这个新的OLE项。例如，当在一个电子数据表格程序中选择一段单元范围，然后用Insert New Object创建一个基于所选范围中的值的图表时。此函数的缺省实现不做任何事情。要实现从pDataObject所提供的格式中选择一种可以接收的格式，然后根据该格式中所提供的数据初始化此OLE项，则需要重载这个函数。这是一个高级的可重载函数。
如果要获取更多的信息，请参见“OLE 2 程序员参考，卷1”中的IOleObject::InitFromData。


 COleServerItem::OnOpen

virtual void OnOpen();

说明：
由框架调用此函数，用来在服务器应用程序的一个独立实例中，而不是现场显示此OLE项。
此函数的缺省实现是激活第一个显示包含此OLE项的文档的框架窗口；如果应用程序是一个小服务器应用程序，则此函数的缺省实现是显示主窗口。此函数还通知容器应用程序此OLE项已经打开。
如果想要在打开一个OLE项时执行特殊的处理，则可重载这个函数。这尤其常用于链接项，例如在链接项打开时，将选择设置到链接上。

请参阅：COleServerItem::OnShow


 COleServerItem::OnQueryUpdateItems

virtual BOOL OnQueryUpdateItems();

返回值：
如果文档有需要更新的项则返回非零值；否则返回0。

说明：
框架调用此函数来确定当前服务器文档中是否有过时了的链接项。如果一个项的源文档已经改变了，而链接项还没有更新来反映文档中的变化，则认为此项已经过时了。

请参阅：
COleServerItem::OnUpdate, COleServerItem::OnUpdateItems


 COleServerItem::OnRenderData

virtual BOOL OnRenderData( LPFORMATETC lpFormatEtc, LPSTGMFDIUM lpStgMedium );

返回值：如果成功则返回非零值；否则返回0。

参数：
lpFormatEtc | 指向一个FORMATETC结构的指针，此结构用来指定所请求信息的格式。
lpStgMedium | 指向一个STGMEDIUM结构的指针，此结构将接收返回的数据。

说明：
由框架调用此函数来获取指定格式的数据。指定格式是由先前调用DelayRenderData或DelayRenderFileData成员函数进行延迟提交时放入COleDataSource对象中的格式。若提供的存储介质是一个文件或内存，则函数的缺省实现分别调用OnRenderFileData或OnRenderGlobalData函数。如果这两种格式都未提供，则缺省实现返回零，并且不做任何事情。
如果lpStgMedium->tymed是TYMED_NULL，则将分配STGMEDIUM结构，并用lpFormatEtc->tymed所指定的内容来填充此STGMEDIUM结构。
如果lpStgMedium->tymed不是TYMED_NULL，则用数据来填充此STGMEDIUM结构。
可以重载这个函数来提供所请求格式和介质中的数据。根据数据的不同，应用程序可能希望重载此函数的另一个版本来代替。如果数据很小且大小固定，则可重载OnRenderGlobalData函数。若数据放在一个文件中，或若数据的大小可变，则可重载OnRerderFileData函数。OnRenderData是一个高级的可重载函数。

请参阅：COleServerItem::OnRenderFileData


 COleServerItem::OnRenderFileData

virtual BOOL OnRenderFileData( LPFORMATETC lpFormatEtc, CFile* pFile );

返回值：如果成功则返回非零值；否则返回0。

参数：
lpFormatEtc | 指向一个FORMATETC结构的指针，此结构指定所请求信息的格式。
pFile | 指向一个CFile对象的指针，此对象中存放要提交的数据。

说明：
当存储介质是一个文件时，由框架调用这个函数来获取指定格式的数据。指定的格式是先前用DelayRenderData成员函数进行延迟提交时放进COleDataSource对象中的格式。此函数的缺省实现只是简单返回FALSE。
此函数是一个高级的可重载函数。可以重载这个函数来提供所请求格式和介质中的数据。根据数据的不同，应用程序可能想要重载该函数的其它一种版本来代替。如果想要处理多种存储介质，可以重载OnRenderData函数；如果数据放在文件中，或者数据的大小可变，则重载OnRenderFileData函数。
如果要获取更多的信息，请参见“OLE 2程序员参考，卷1”中的IDataObject::GetData和FORMATETC。

请参阅：COleServerItem::OnRenderData


 COleServerItem::OnRenderGlobalData

virtual BOOL OnRenderGlobalData( LPFORMATETC lpFormatEtc, HGLOBAL* phGlabal );

返回值：如果成功则返回非零值；否则返回0。

参数：
lpFormatEtc | 指向一个FORMATETC结构，此结构指定所请求信息的格式。
phGlobal | 指向一个全局内存句柄，此全局内存将存放所返回的数据。如果没有分配内存，则该参数可以是NULL。

说明：
当指定的存储介质是全局内存时，框架调用此函数以检取指定格式的数据。指定格式是先前用DelayRenderData成员函数进行延迟提交时放入COleDataSource对象中的格式。OnRenderGlobalData函数的缺省实现只是简单返回FALSE。
如果phGlobal为NULL，则将分配一个新HGLOBAL，并在phGlobal中返回此HGLOBAL。否则，将用数据填充phGlobal所指定的HGLOBAL。放入HGLOBAL中的数据量不能超过此内存块的当前大小。并且，此内存块不能再分配成更大的尺寸。
OnRenderGlobalData是一个高级的可重载函数。可以重载此函数来提供所请求格式和介质中的数据。根据数据的不同，应用程序可能想要加载该函数的其它一种版本来代替。如果想要处理多种存储介质，可以重载OnRenderData函数；如果数据放在文件中，或者数据的大小可变，则重载OnRenderFileData函数。
如果要获取更多的信息，请参见“OLE 2程序员参考，卷1”中的STGMEDIUM，FORMATETC和ReleaseStgMedium。

请参阅：COleServerItem::OnRecordData


 COleServerItem::OnSetColorScheme

virtual BOOL OnSetColorScheme( const LOGPALETTE FAR* lpLogPalette );

返回值：
如果使用了调色板则返回非零值；否则返回0。

参数：
lpLogPalette 指向一个Windows的LOGPALETTE结构的指针。

说明：
由框架调用这个函数，用于指定编辑此OLE项时使用的调色板。如果容器应用程序是用微软基础类库编写的，则当对应的COleClientItem对象的IOleObject::SetColorScheme函数被调用时，此函数被调用。这个函数的缺省实现是返回FALSE。如果想要使用推荐的调色板，则可以重载这个函数。服务器应用程序不需要使用建议的调色板。
如果要获取更多的信息，请参见“OLE 2程序员参考，卷1”中的IOleObject::SetColorScheme。


 COleServerItem::OnSetData

virtual BOOL OnSetData( LPFORMATETC pFormatEtc,
LPSTGMEDIUM pStgMedium,
BOOL bRelease
);

返回值：如果成功则返回非零值；否则返回0。

参数：
pFormatEtc | 指向一个FORMATETC结构的指针，此结构用来指定数据的格式。
pStgMedium | 指向一个STGMEDIUM结构的指针，此结构中存放数据。
bRelease | 指示当完成此函数调用后，谁拥有存储介质的所有权。调用者决定谁负责释放为存储介质分配的资源。调用者提供设置bRelease的值来实现这一功能。如果bRelease为一非零值，则服务器应用程序取得所有权，负责在使用完时释放介质。当bRelease为零时，调用者保留所有权，服务器项只能在此函数调用期间使用存储介质。

说明：
由框架调用这个函数，用指定数据替换此OLE项的数据。服务器项不具备此数据的所有权，直到它成功地获取此数据。也就是说，如果服务器项返回零，则它不具有所有权。如果数据源取得所有权，则它通过调用ReleaseStgMedium函数来释放存储介质。
此函数的缺省实现不做任何事情。可重载此函数来实现用指定的数据替换此OLE项的数据。该函数是一个高级的可重载函数。
如果要获取更多的信息，请参见“OLE 2程序员参考，卷1”中的STGMEDIUM，FORMATETC和ReleaseStgMedium。

请参阅：COleDataSource::OnSetData


 COleServerItem::OnSetExtent

virtual BOOL OnSetExtent( DVASPECT nDrawAspect, const CSize& size );

返回值：如果成功则返回非零值；否则返回0。

参数：
nDrawAspect指定一个OLE项的特征，此OLE项的边界要被检取。此参数的值可以是下列任意值：
· | DVASPECT_CONTENT | 用这种方式表示的项可以作为一个嵌入对象显示在它的容器中。
· | DVASPECT_THUMBNAIL | 用“拇指甲”方式表示项，以使它可以显示在一个浏览工具中。
· | DVASPECT_ICON | 用图标来表示项。
· | DVASPECT_DOCPRINT | 项被表示为就象它被用File菜单中的Print命令打印一样。
size 一个CSize结构，用来指定OLE项的新尺寸。

说明：
由框架调用这个函数，用来通知此OLE项在容器文档中有多少空间可以用于它。如果容器应用程序是用微软基础类库编写的，则当对应的COleClientItem对象的SetExtent成员函数被调用时，调用此函数。如果nDrawAspect是DVASPECT_CONTENT，则OnSetExtent函数的缺省实现是设置m_sizeExtent成员为所指定的尺寸；否则，该函数返回零。可以重载此函数来实现在改变此项的尺寸时执行某种特殊处理。

请参阅：
COleClientItem::SetExtent, COleServerItem::OnGetExtent, COleServerItem::m_sizeExtent


 COleServerItem::OnShow

virtual void OnShow();

说明：
由框架调用这个函数，用来指导服务器应用程序在适当的地方显示这个OLE项。当容器应用程序的用户创建一个项或执行一个需要此项的动词（例如Edit）时，需要显示这个项，则通常调用此函数。该函数的缺省实现是试图进行现场激活。如果尝试失败了，则函数调用OnOpen成员函数来在一个独立的窗口中显示这个OLE项。
如果你希望在显示一个OLE项时执行特殊的处理，则需要重载这个函数。

请参阅：
COleServerItem::OnOpen, COleClientItem::Activate


 COleServerItem::OnUpdate

virtual void OnUpdate( COleServerItem* pSender, LPARAM lHint, CObject* pHint, DVASPECT nDrawAspect );

参数：
pSender | 指向修改此文档的项的指针。它可以是NULL。
lHint | 包含与修改有关的信息。
pHint | 指向一个存储有关修改的信息的对象。
nDrawAspect一个DVASPECT_枚举值。此参数的值可以是下列任意值：
· | DVASPECT_CONTENT | 用这种方式表示的项可以作为一个嵌入对象显示在它的容器中。
· | DVASPECT_THUMBNAIL | 用“拇指甲”方式表示项，以使它可以显示在一个浏览工具中。
· | DVASPECT_ICON | 用图标来表示项。
· | DVASPECT_DOCPRINT | 项被表示为就象它被用File菜单中的Print命令打印一样。

说明：
当一个项被修改时，框架调用这个函数。该函数的缺省实现是调用NotifyChanged，而不考虑提示或发送者。

请参阅：COleServerItem::NotifyChanged


 COleServerItem::OnUpdateItems

virtual void OnUpdateItems();

说明：
由框架调用这个函数，用来更新服务器文档中的所有项。该函数的缺省实现是对文档中的所有COleClientItem对象调用UpdateLink函数。

请参阅：
COleServerItem::OnUpdate, COleServerItem::OnQueryUpdateItems


 COleServerItem::SetItemName

void SetItemName( LPCTSTR lpszItemName )

参数：
lpszItemName 指向项的新名字的指针。

说明：
当你创建一个链接项时，调用这个函数来设置它的名字。该名字在文档内必须是唯一的。当调用服务器应用程序来编辑一个链接项时，应用程序利用这个名字来查找该项。不需要对嵌入项调用此函数。

请参阅：
COleServerItem::GetItemName, COleLinkingDoc::OnGetLinkedItem


 COleServerItem::m_sizeExtent

CSize m_sizeExtent;

说明：
此成员函数告知服务器应用程序在容器文档中对象有多少是可见的。OnSetExtent的缺省实现设置此成员。

请参阅：COleServerItem::OnSetExtent


 COleStreamFile

CObject
└CFile
└COleStreamFile

一个COleStreamFile对象将一个复合文件中的数据流（IStream）表示为OLE结构式存储的一部分。除非是一个内存流，否则在此流可打开或创建之前，必须存在一个IStorage对象。
COleStreamFile对象的操作与CFile对象极其相似。
如果要获取更多有关操作流和存储器的信息，请参见“Visual C++程序员指南”中的文章“容器：复合文件”。
更多的信息，参见“OLE 2 程序员参考，卷1”中的IStream和IStorage。
#include <afxole.h>

COleStreamFile类成员

构造
COleStreamFile 构造一个COleStreamFile对象

属性和操作
Attach | 将一个流与此对象相联系
CreateMemoryStream | 从全局内存创建一个流，并将此流与此对象相关联
CreateStream | 创建一个流，并将此流与此对象相关联Detach将此流从此对象中分离
GetStream | 返回当前的流
OpenStream | 安全地打开一个流，并将此流与此对象相关联


 COleStreamFile::Attach

void Attach( LPSTREAM lpStream );

参数：
lpStream 指向要与此对象关联的OLE流，该参数不能是NULL。

说明：
此函数将所提供的OLE流与此COleStreamFile对象相关联。该对象必须已经与一个OLE流相关联。
如果要获取更多的信息，请参见“OLE 2程序员参考，卷1”中的IStream。

请参阅：COleStreamFile::Detach


 COleStreamFile::COleStreamFile

COleStreamFile( LPSTREAM lpStream = NULL );

参数：
lpStream 指向一个要连接到此对象上的OLE流的指针。

说明：
此函数创建一个COleStreamFile对象。如果lpStream为NULL，则此对象不与一个OLE项连接；否则，此对象与提供的OLE流相关联。
如果要获取更多的信息，请参见“OLE 2程序员参考，卷1”中的IStream。

请参阅：COleStreamFile::Attach, CFile


 COleStreamFile::CreateMemoryStream

BOOL CreateMemoryStream( CFileException* pError = NULL );

返回值：
如果成功地创建了流，则返回非零值；否则返回0。

参数：
pError 指向一个CFileException对象的指针或者是NULL，NULL表示创建操作的完成。如果你希望监视因试图创建流而可能产生的异常，则为此函数提供一个值。

说明：
此函数从全局的共享内存中安全地创建一个新的流，在此函数调用中失败是一种正常的、意料之中的情况。内存由OLE子系统分配。
如果要获取更多的信息，请参见“OLE 2程序员参考，卷1”中的CreateStreamOnHGlobal。

请参阅：
COleStreamFile::OpenStream, COleStreamFile::CreateStream, CFileException


 COleStreamFile::CreateStream

BOOL CreateStream( LPSTORAGE lpStorage,
LPCTSTR lpszName,
DWORD nOpenFlags = modeReadWrite|shareExclusive|modeCreate,
CFileException* pError = NULL
);

返回值：
如果成功地创建了流则返回非零值；否则返回0。

参数：
lpStorage | 指向一个OLE存储器对象，此对象中包含要创建的流。
lpszStreamName | 要创建的流的名称。该参数不能为NULL。
nOpenFlags | 打开流时所用的存取方式。缺省时使用互斥，读/写及创建方式。有关可用方式的完整列表，参见CFile::CFile。pError指向一个CFileException对象的指针，或者是NULL。如果你希望监视因试图创建流而可能产生的异常，则为此函数提供一个值。

说明：
此函数在所提供的存储器对象中安全地创建一个新的流，在此函数调用中，失败是一种正常的、意料之中的情况。如果打开失败，并且pError不是NULL，则将抛出一个文件异常。
如果要获取更多的信息，请参见“OLE 2程序员参考，卷1”中的IStorage::CreateStream。

请参阅：
COleStreamFile::OpenStream, COleStreamFile::CreateMemoryStream, CFileException


 COleStreamFile::Detach

LPSTREAM Detach();

返回值：
返回一个指向与此对象相关联的流的指针。

说明：
此函数将流与对象分离，但是不关闭流。在程序终止之前，流必须以其它某种方式关闭。
如果要获取更多的信息，请参见“OLE2程序员参考，卷1”中的IStream。

请参阅：COleStreamFile::Attach


 COleStreamFile::GetStream

IStream* GetStream() const;

返回值：
是一个指向当前流界面（IStream）的指针。

说明：此函数用来返回一个指向当前流的指针。


 COleStreamFile::OpenStream

BOOL OpenStream( LPSTORAGE lpStorage,
LPCTSTR lpszName,
DWORD nOpenFlags = modeReadWrite|shareExclusive,
CFileException* pError = NULL
);

返回值：
如果成功地打开了流则返回非零值；否则返回0。

参数：
lpStorage | 指向一个OLE存储器对象，此对象中包含要打开的流。该参数不可为NULL。
lpszName | 要打开的流的名称。该参数不可以为NULL。
nOpenFlags | 指定打开流时使用的存取方式。缺省使用互斥方式和读/写方式。有关可用方式的完整列表，参见CFile::CFile。
pError | 指向一个CFileException对象的指针，或者是NULL。如果你希望监视因试图创建流而可能产生的异常，则为此函数提供一个值。

说明：
此函数用来打开一个已经存在的流。如果打开失败，并且pError不为NULL，则将抛出一个文件异常。
如果要获取更多的信息，请参见“OLE 2程序员参考，卷1”中的IStorage::OpenStream。

请参阅：
COleStreamFile::CreateStream, COleStreamFile::CreateMemoryStream, CFileException


 COleTemplateServer

CObject
└CCmdTarget
└COleObjectFactory
└COleTemplateServer

COleTemplateServer类用于OLE可视编辑服务器、自动化服务器和链接容器（支持链接到嵌入项的应用程序）。该类从COleObjectFactory类中派生，通常应用程序可直接使用COleTemplateServer而无需使用一个CDocTemplate对象来管理服务器程序文档。可使用COleTemplateServer来实现一个服务器应用程序，即一个可作为独立的应用程序运行的服务器应用程序。全服务器应用程序一般是多文档界面（MDI）应用程序，尽管单文档界面（SDI）应用程序也被支持。必须为应用程序所支持的每种服务器程序文档类型提供一个COleTemplateServer对象；即，如果服务器应用程序支持电子数据表格和图标，那么必须有两个COleTemplateServer对象。
COleTemplateServer重载了由COleObjectFactory所定义的OnCreateInstance成员函数。这个成员函数由框架调用来创建一个适当类型的C++对象。
#include <afxdisp.h>
请参阅：COleServerDoc, COleServerItem

COleTemplateServer类成员

构造
COleTemplateServer 构造一个COleTemplateServer对象

操作
ConnectTemplate | 将一个文档模板连接到基础COleObjectFactory对象上
UpdateRegistry | 向OLE系统注册表中注册这个文档类型


 COleTemplateServer::COleTemplateServer

COleTemplateServer();

说明：
构造一个COleTemplateServer对象。
有关使用COleTemplateServer类的简短描述，参见COleLinkingDoc概述。


 COleTemplateServer::ConnectTemplate

void ConnectTemplate( REFCLSID clsid, CDocTemplate* pDocTemplate, BOOL bMultiInstance );

参数：
clsid | 对模板所请求的OLE类ID的引用。
pDocTemplate | 指向文档模板的指针。
bMultiInstance | 指示单个应用程序是否能支持多个实例。如果该参数为TRUE，则为每一个创建对象的请求，启动应用程序的多个实例。

说明：
此函数将pDocTemplate所支持的文档模板连接到基COleObjectFactory对象。
如果要获取更多的信息，请参见“OLE 2程序员参考，卷1”中的CLSID Key。

请参阅：CDocTemplate


 COleTemplateServer::UpdateRegistry

void UpdateRegistry( OLE_APPTYPE nAppType = OAT_INPLACE_SERVER,
LPCSTR* rglpszRegister = NULL,
LPCSTR FAR* rglpszOverwrite = NULL
);

参数：
nAppType一个OLE_APPTYPE枚举类型值，该枚举是在AFXDISP.H中定义的。它可以是下列值之一：
· | OAT_INPLACE_SERVER | 服务器具有全服务器用户界面。
· | OAT_SERVER | 服务器值支持嵌入。
· | OAT_CONTAINER | 容器支持到嵌入项的链接。
· | OAT_DISPATCH_OBJECT | 对象是能够IDispatch的。
· | OAT_DOCOBJECT_SERVER | 服务器支持嵌入和复合模式的文档对象。
rglpszRegister | 一个项的列表，只有在没有项存在时才要写入注册表中。
rglpszOverwrite | 一个项的列表，不管是否有项存在都要写入注册表中。

说明：
此函数从文档模板串中装载文件类型的信息，并将该信息放进OLE系统注册表中。
注册信息通过调用CDocTemplate::GetDocString来装载。所获取的子串是由索引regFileTypeId，regFileTypeName和fileNewName所标识的那些子串，如GetDocString参考页上所描述的。
如果regFileTypeId子串为空，或GetDocString调用由于某种原因失败，则UpdateRegistry函数失败，文件信息未写入注册表中。
参数rglpszRegister和rglpszOverwrite中的信息通过调用AfxOleRegisterServerClass函数来写入注册表。当这两个参数为NULL时，注册表的缺省信息适用于多数应用程序。有关这些参数中的信息结构的信息，参见AfxOleRegisterServerClass。
如果要获取更多的信息，请参见“Win32 SDK OLE程序员参考”中的IDispatch。

请参阅：
CDocTemplate::GetDocString, AfxOleRegisterServerClass


 COleUpdateDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog
└COleDialog
└COleLinksDialog
└COleUpdateDialog

COleUpdateDialog类用于OLE Edit Links对话框的某种特殊情形，用于只需要更新文档中已经存在的链接或嵌入对象。
#include <afxodlgs.h>
请参阅：COleLinksDialog

COleUpdateDialog类成员
构造
COleUpdateDialog 构造一个COleUpdateDialog对象

操作
DoModal 以一种更新方式显示Edit Links对话框


 COleUpdateDialog::COleUpdateDialog

COleUpdateDialog( COleDocument* pDoc,
BOOL bUpdateLinks = TRUE,
BOOL bUpdateEmbeddings = FALSE,
CWnd* pParentWnd = NULL
);

参数：
pDoc | 指向包含可能需要更新的链接的文档。
bUpdateLinks | 一个标志，用于确定链接对象是否要更新。
bUpdateEmbeddings | 一个标志，用于确定嵌入对象是否要更新。
pParentWnd | 指向此对话框对象所属的父或属主窗口对象（CWnd类型）。如果该参数为NULL，则此对话框的父窗口属主为主应用程序窗口。

说明：
此函数只构造COleUpdateDialog对象。要显示此对话框，需要调用DoModal函数。当应用程序想要只更新已经存在的链接或嵌入项时，应当用该类来代替COleLinksDialog类。

请参阅：
COleDialog, COleLinksDialog, COleDocument, CWnd, CDialog, COleUpdateDialog::DoModal


 COleUpdateDialog::DoModal

virtual int DoModal();

返回值：
对话框的完成状态。是下列值之一：
· | IDOK | 如果对话框成功返回。
· | IDCANCEL | 如果当前文档中不存在需要更新的链接项或嵌入项。
· | IDABORT | 如果发生了一个错误。如果返回的是IDABORT，调用COleDialog::GetLastError成员函数来获取更多有关所发生的错误类型的信息。可能发生的错误的列表，参见“OLE 2.01用户接口库”中的OleUIEditLinks函数。

说明：
此函数以更新方式显示Edit Links对话框。除非用户选择了Cancel按钮，所有的链接项和/或嵌入项都会被更新。

请参阅：
COleDialog::GetLastError, COleLinksDialog::DoModal


 COleVariant

COleVariant没有基类。
一个COleVariant对象封装了VARIANT数据类型。这个数据类型用于OLE自动化。特别的，DISPPARAMS结构包含了一个指向VARIANT结构数组的指针。一个DISPPARAMS结构被用来将参数传递给IDispatch::Invoke。
注意：
这个类是从VARIANT结构派生而来的。这意味着你可以在调用需要一个VARIANT参数时将一个COleVariant传递给它，并且VARIANT结构的数据成员也是在COleVariant中可以访问的数据成员。
两个相关联的MFC类COleCurrency和COleDateTime封装了不同的数据类型CURRENCY（VT_CY）和DATE（VT_DATE）。更广的，COleVariant类被用在DAO类中；参考这些类可以获得有关COleVariant类的典型用法，比如说CDaoQueryDef和CDaoRecordset。
#include <afxdisp.h>

COleVariant类成员

构造
COleVariant 构造一个COleVariant对象

操作
Attach | 将一个VARIANT附着在一个COleVariant上
ChangeType | 改变此COleVariant对象的可变类型
Clear | 清除这个COleVariant对象Detach将一个VARIANT从一个COleVariant上分离，并返回该VARIANT
SetString | 将一个字符串设置为某种特定类型，比如说ANSI

操作符
operator LPCVARIANT | 将一个COleVariant值转换为一个LPCVARIANT
operator LPVARIANT | 将一个COleVariant值转换为一个LPVARIANT
operator = | 拷贝一个COleVariant值
operator == | 比较两个COleVariant值

归档/存储
operator << | 输出一个COleVariant值到CArchive或CDumpContext
operator >> | 从CArchive输入一个COleVariant对象


 COleVariant::Attach

void Attach( VARIANT& varSrc );

参数：
varSrc 一个已存在的VARIANT对象，它将被附着到当前的COleVariant对象上。

说明：
此函数用来将给定的VARIANT对象附着到当前的COleVariant对象上。此函数将varSrc的VARTYPE设置为VT_EMPTY。
要获取更多的信息，请参见“Win32 SDK OLE程序员参考”中的VARIANT和VARTYPE 项。

请参阅：
COleVariant::operator LPCVARIANT, COleVariant::operator LPVARIANT


 COleVariant::ChangeType

void ChangeType( VARTYPE vartype, LPVARIANT pSrc = NULL );

参数：
vartype | 此COleVariant对象的VARTYPE。
pSrc | 一个指向要被转换的VARIANT对象的指针。如果这个值是NULL，则此COleVariant对象是用来作为转换源的。

说明：
此函数用来转换这个COleVariant对象中的可变值的类型。
要获取更多的信息，请参见“Win32 SDK OLE程序员参考”中的VARIANT，VARTYPE和VariantChangeType 项。

请参阅：COleVariant::operator =


 COleVariant::Clear

void Clear();

说明：
此函数用来清除VARIANT。函数为此对象将VARTYPE设置为VT_EMPTY。COleVariant的析构函数调用这个函数。
如果要获取更多的信息，请参见“Win32 SDK OLE程序员参考”中的VARIANT，VARTYPE和VariantClear 项。


 COleVariant::COleVariant

COleVariant();
COleVariant(const VARIANT& varSrc);
COleVariant(const COleVariant& varSrc);
COleVariant(LPCVARIANT pSrc);
COleVariant(LPCTSTR lpszSrc);
COleVariant(LPCTSTR lpszSrc, VARTYPE vtSrc);
COleVariant(CString& strSrc);
COleVariant(BYTE nSrc);
COleVariant(short nSrc,VARTYPE vtSrc = VT_I2);
COleVariant(long lSrc,VARTYPE vtSrc = VT_I4);
COleVariant(const COleCurrency& curSrc);
COleVariant(float fltSrc);
COleVariant(double dblSrc);
COleVariant(const COleDateTime& dateSrc);
COleVariant(const CByteArray& arrSrc);
COleVariant(const CLongBinary& lbSrc);

参数：
varSrc | 一个已存在的COleVariant或VARIANT对象，将要被拷贝到新的COleVariant对象中。
pSrc | 一个指向将要被拷贝到新的COleVariant对象中的VARIANT对象的指针。
lpszSrc | 一个以空字符结尾的，将要被拷贝到新的COleVariant对象中的字符串。
vtSrc | 新的COleVariant对象的VARTYPE。
strSrc | 一个将要被拷贝到新的COleVariant对象中去的CString对象。
nSrc, lSrc | 一个将要被拷贝到新的COleVariant对象中去的数字值。
vtSrc | 新的COleVariant对象的VARTYPE。
curSrc | 一个将要被拷贝到新的COleVariant对象中去的COleCurrency对象。
fltSrc, dblSrc | 一个将要被拷贝到新的COleVariant对象中去的数字值。
dateSrc | 一个将要被拷贝到新的COleVariant对象中去的COleDataTime对象。
arrSrc | 一个将要被拷贝到新的COleVariant对象中去的CByteArray对象。
lbSrc | 一个将要被拷贝到新的COleVariant对象中去的CLongBinary对象。

说明：
所有的这些构造函数都创建新的COleVariant对象，并将其初始化为指定的值。有关这些构造函数的简短描述如下所示：
· | COleVariant() | 创建一个空的COleVariant对象，VT_EMPTY。
· | COleVariant(varSrc) | 拷贝一个已存在的VARIANT或COleVariant对象。保留可变类型。
· | COleVariant(pSrc) | 拷贝一个已存在的VARIANT或COleVariant对象。保留可变类型。
· | COleVariant(lpszSrc) | 将一个字符串拷贝到新对象中，VT_BSTR(UNICODE)。
· | COleVariant(lpszSrc, vtSrc) | 将一个字符串拷贝到新对象中。参数vtSrc必须是VT_BSTR(UNICODE)或VT_BSTRT(ANSI)。
· | COleVariant(strSrc) | 将一个字符串拷贝到新对象中，VT_BSTR(UNICODE)。
· | COleVariant(nSrc) | 将一个8位的整数拷贝到新对象中，VT_UI1。
· | COleVariant(nSrc, vtSrc) | 将一个16位整数（或布尔值）拷贝到新对象中。参数vtSrc必须是VT_I2或VT_BOOL。
· | COleVariant(lSrc, vtSrc) | 将一个32位整数（或SCODE值）拷贝到新对象中。参数vtSrc必须是VT_I4，VT_ERROR或VT_BOOL。
· | COleVariant(curSrc) | 将一个COleCurrency值拷贝到新对象中，VT_CY。
· | COleVariant(fltSrc) | 将一个32位的浮点数拷贝到新对象中，VT_R4。
· | COleVariant(dblSrc) | 将一个64位的浮点数拷贝到新对象中，VT_R8。
· | COleVariant(dateSrc) | 将一个COleDataTime值拷贝到新对象中，VT_DATE。
· | COleVariant(arrSrc) | 将一个CByteArray对象拷贝到新对象中，VT_EMPTY。
· | COleVariant(lbSrc) | 将一个CLongBinary对象拷贝到新对象中，VT_EMPTY。
如果要获取更多的信息，请参见“Platform SDK”中的VARIANT和VARTYPE项。
要获取更多关于SCODE的信息，参见“Platform SDK”中的“COM错误代码结构”。

请参阅：
COleVariant::operator =, CString, COleCurrency, COleDateTime


 COleVariant::Detach

VARIANT Detach();

返回值：
返回这个COleVariant对象的基础VARIANT值。

说明：
此函数用来将基础VARIAINT对象从COleVariant对象上分离。函数为此COleVariant对象将VARTYPE设置为VT_EMPTY。
注意：
在调用Detach后，由调用者负责基于结果中的VARIANT结构来调用VariantClear。
如果要获取更多的信息，请参见“Win32 SDK OLE程序员参考”中的VARIANT，VARTYPE，和VariantClear 项。

请参阅：
COleVariant::operator LPCVARIANT, COleVariant::operator LPVARIANT


 COleVariant::SetString

void SetString( LPCTSTR lpszSrc, VARTYPE vtSrc );

参数：
lpszSrc | 一个以null结尾的字符串，将被拷贝到新的COleVariant对象中。
vtSrc | 新的COleVariant对象的VARTYPE。

说明：
此函数用来将字符串设置为特别的类型。参数vtSrc必须是VT_BSTR（UNICODE）或VT_BSTRT（ANSI）。SetString通常被用来将字符串设置为ANSI，这是因为COleVariant:: COleVariant构造函数有一个字符串或字符串指针参数，并且没有VARTYPE是UNICODE。
在一个非UNICODE构造中，一个DAO记录集希望字符串是ANSI。因此，对于使用COleVariant对象的DAO函数，如果你不是在创建一个UNICODE记录集，你就必须使用COleVariant:: COleVariant( lpszSrc, vtSrc )形式的构造函数，并且将vtSrc设置为VT_BSTRT（ANSI）；或使用SetString并且将vtSrc设置为VT_BSTRT来产生一个ANSI字符串。例如，CDaoRecordset函数CDaoRecordset::Seek和CDaoRecordset::SetFieldValue使用COleVariant对象作为参数。如果这些DAO记录集不是UNICODE的，则这些对象必须是ANSI。

请参阅：
COleVariant::COleVariant, CDaoRecordset::Seek, CDaoRecordset::SetFieldValue


 COleVariant::operator =

const COleVariant& operator = ( const VARIANT& varSrc );
const COleVariant& operator = ( LPCVARIANT pSrc );
const COleVariant& operator = ( const COleVariant& Src );
const COleVariant& operator = ( const LPCTSTR lpszSrc );
const COleVariant& operator = ( const CString& strSrc );
const COleVariant& operator = ( const BYTE nSrc );
const COleVariant& operator = ( const short nSrc );
const COleVariant& operator = ( const long lSrc );
const COleVariant& operator = ( const COleCurrency& curSrc );
const COleVariant& operator = ( const float fltSrc );
const COleVariant& operator = ( const double dblSrc );
const COleVariant& operator = ( const COleDateTime& dateSrc );
const COleVariant& operator = ( const CByteArray& arrSrc );
const COleVariant& operator = ( const CLongBinary& lbSrc );

说明：
这些重载的赋值操作符都将源数据拷贝到COleVariant对象中。对于每一个操作符的简短描述如下所示：
· | operator = (varSrc) | 将一个已存在的VARIANT或COleVariant对象拷贝到此对象中。
· | operator = (pSrc) | 将由pSrc访问的VARIANT对象拷贝到此对象中。
· | operator = (lpszSrc) | 将一个以空字符结尾的字符串拷贝到此对象中，并将VARTYPE设置为VT_BSTR。
· | operator = (strSrc) | 将一个CStrin对象拷贝到此对象中，并将VARTYPE设置为VT_BSTR。
· | operator = (nSrc) | 将一个8位或16位的整数值拷贝到此对象中。如果nSrc是一个8位的值，则将VARTYPE设置为VT_UI1。如果nSrc是一个16位的值并且VARTYPE的值是VT_BOOL，则保持它；否则，将其设置为VT_I2。
· | operator = (lSrc) | 将一个32位的整数值拷贝到此对象中。如果VARTYPE是VT_ERROR，则保持它；否则，将其设置为VT_I4。
· | operator = (curSrc) | 将一个COleCurrency对象拷贝到此对象中，并将VARTYPE设置为VT_CY。
· | operator = (fltSrc) | 将一个32位的浮点值拷贝到此对象中，并将VARTYPE设置为VT_R4。
· | operator = (dblSrc) | 将一个64位的浮点值拷贝到此对象中，并将VARTYPE设置为VT_R8。
· | operator = (dateSrc) | 将一个COleDateTime对象拷贝到此对象中，并将VARTYPE设置为VT_DATE。
· | operator = (arrSrc) | 将一个CByteArray对象拷贝到此对象中。
· | operator = (lbSrc) | 将一个CLongBinary对象拷贝到此对象中。
如果要获取更多的信息，请参见“Win32 SDK OLE程序员参考”中的VARIANT和VARTYPE 项。

请参阅：
COleVariant::COleVariant, COleCurrency, COleDateTime


 COleVariant::operator ==

BOOL operator == ( const VARIANT& varSrc ) const;
BOOL operator == ( LPCVARIANT pSrc ) const;

说明：
此操作符比较两个不同的值，如果它们相等则返回非零值；否则返回0。

请参阅：COleVariant::operator =


 COleVariant::operator <<,>>

friend CDumpContext& AFXAPE operator <<( CDumpContext& dc, COleVariant varSrc );
friend CArchive& AFXAPI operator << ( CArchive& ar, COleVariant varSrc );
friend CArchive& AFXAPI operator >> ( CArchive& ar, COleVariant& varSrc );

说明：
COleVariant的插入操作符（<<）支持诊断转储并可以保存到一个文件。提取操作符（>>）支持从一个文件中提取内容。

请参阅：CDumpContext, CArchive


 COleVariant::operator LPCVARIANT

operator LPCVARIANT() const;

说明：
此操作符返回一个VARIANT结构，该结构的值是从此COleVariant对象中拷贝获得的。
如果要获取更多的信息，请参见“Win32 SDK OLE程序员参考”中的VARIANT项。

请参阅：COleVariant::operator LPVARIANT


 COleVariant::operator LPVARIANT

operator LPVARIANT();

说明：
此操作符用来访问COleVariant对象中的基础VARIANT结构。
警告：
改变由这个函数返回的指针所指的VARIANT结构中的值，就会导致改变此COleVariant对象中的值。
如果要获取更多的信息，请参见“Win32 SDK OLE程序员参考”中的VARIANT项。

请参阅：COleVariant::operator LPCVARIANT


 CPageSetupDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog
└CPageSetupDialog

CPageSetupDialog类封装了Windows通用OLE Page SetUp对话框提供的服务，并且还添加了对设置和修改打印页边距的支持。这个类是设计来代替Print Setup对话框的。
要使用一个CPageSetupDialog对象，首先用CPageSetupDialog构造函数创建对象。一旦已经构造了对话框，就可以设置或修改数据成员m_psd的任意值来初始化对话框的控件。m_psd结构是PAGESETUPDLG类型。Win32 SDK文档中的“设置打印页”主题中给出了初始化这个结构的例子。
在初始化对话框控件之后，调用DoModal成员函数来显示对话框，并允许用户选择打印选项。DoModal返回值说明了用户是选择了OK（IDOK）还是选择了Cancel（IDCANCEL）按钮。
如果DoModal返回的是IDOK，你就可以用几个CPageSetupDialog的成员函数，或访问m_psd数据成员来获取用户输入的信息。

注意：
在通用的OLE Page Setup对话框被取消后，用户作出的任何改变都不会被框架保存。应用程序必须自己负责来将对话框中的所有值保存到一个永久的地方，比如应用程序文档或应用程序类的成员。
#include <afxdlgs.h>

CPageSetupDialog类成员

数据成员
m_psd 一个用来定制CPageSetupDialog对象的结构

构造
CPageSetupDialog 构造一个CPageSetupDialog对象

属性
CreatePrinterDC | 为打印创建一个设备环境
GetDeviceName | 返回打印机的设备名称
GetDevMode | 返回打印机的当前DEVMODE
GetDiverName | 返回打印机使用的驱动程序
GetMargins | 返回打印机当前的页边距设置
GetPortName | 返回输出端口名
GetPaperSize | 返回打印机的纸张大小

操作符
DoModal 显示对话框并让用户做一次选择

可重载
OnDrawPage | 框架调用来给出一个打印页的屏幕图像。
PreDrawPage | 在给出一个打印页的屏幕图像之前由框架调用


 CPageSetupDialog::CPageSetupDialog

CPageSetupDialog( DWORD dwFlags = PSD_MARGINS | PSD_INWININIINTLMEASURE, CWnd* pParentWnd = NULL );

参数：
dwFlags你可以使用一个或多个标志来定制对话框的设置。这些值可以用位或操作符来组合。这些值的意义如下所示：
· | PSD_DEFAULTMINMARGINS | 将允许的页边距的最小宽度设置得与打印机允许的最小宽度一样。如果PSD_MARGINS和PSD_MINMARGINS标志也被指定了，则这个标志可以忽略。
· | PSD_INWININIINTLMEASURE | 不执行。
· | PSD_MINMARGINS | 使系统使用在rtMinMargin成员中指定的值作为允许的左、上、右和下边距的最小宽度。系统将禁止用户输入的宽度小于指定的最小值。如果PSD_MINMARGINS没有被指定，则系统将允许的最小宽度设置得与打印机允许的一样。
· | PSD_MARGINS | 激活边距控制区域。
· | PSD_INTHOUSANDTHSOFINCHES | 使对话框的单元按1/1000英寸来测量。
· | PSD_INTHUNDREDTHSOFMILLIMETERS | 使对话框的单元按1/100毫米来测量。
· | PSD_DISABLEMARGINS | 使边距对话框控件无效。
· | PSD_DISABLEPRINTER | 使Printer按钮无效。
· | PSD_NOWARNING | 当没有缺省的打印机时，禁止显示警告消息。
· | PSD_DISABLEORIENTATION | 使页面方向控件无效。
· | PSD_RETURNDEFAULT | 不显示对话框就使CPageSetupDialog返回DEVMODE和DEVNAMES结构，这两个结构是为系统缺省的打印机而初始化的。它假设hDevNames和hDevMode都是NULL；否则，函数就返回一个错误。如果系统的缺省打印机是由一个老的打印机驱动程序（早于Windows 3.0版本）驱动的，则只返回hDevNames；hDevMode是NULL。
· | PSD_DISABLEPAPER | 使页面选择控件无效。
· | PSD_SHOWHELP | 使对话框显示Help按钮。如果这个标志被指定，则hwndOwner成员必须是NULL。
· | PSD_ENABLEPAGESETUPHOOK | 使hook函数在lpfnSetupHook中被指定。
· | PSD_ENABLEPAGESETUPTEMPLATE | 使操作系统用由hInstance和lpSetupTemplateName标识的对话框模板来创建对话框。
· | PSD_ENABLEPAGESETUPTEMPLATEHANDLE | 表明hInstance标识一个包含预先载入的对话框模板的数据块。如果此标志被指定，则系统忽略lpSetupTemplateName。
· | PSD_ENABLEPAGEPAINTHOOK | 使在lpfnPagePaintHook中指定的钩子函数有效。
· | PSD_DISABLEPAGEPAINTING | 使对话框的绘画区无效。
pParentWnd 指向对话框的父或属主的指针。

说明：
此函数用来构造一个CPageSetupDialog对象。使用DoModal函数来显示此对话框。

请参阅：CPrintDialog, CPageSetupDialog


 CPageSetupDialog::CreatePrinterDC

HDC CreatePrinterDC();

返回值：返回新创建的打印机设备环境（DC）的句柄。

说明：
从DEVMODE和DEVNAMES结构创建一个打印机设备环境。

请参阅：
CPageSetupDialog::GetDevMode, CPageSetupDialog::GetDeviceName, CPageSetupDialog::GetDriverName


 CPageSetupDialog::DoModal

virtual int DoModal();

返回值：
返回IDOK或IDCANCEL。如果返回的是IDCANCEL，则调用Windows CommDlgExtendedError函数来确定是否发生了一个错误。
IDOK和IDCANCEL都是常量，它们用来表明用户选择的是OK按钮还是Cancel按钮。

说明：
此函数用来显示Windows通用OLE Page Setup对话框，并允许用户选择不同的打印设置选项，比如打印边距、页面大小、页面方向，和打印机目标。另外，用户页可以访问如网络位置和所选打印机的属性等打印机设置选项。
如果你希望通过设置m_psd结构的成员来初始化不同的Page Setup对话框选项，你必须在调用DoModal之前和构造此对话框之后进行。在调用DoModal之后，调用其它的成员函数来获取用户在对话框中输入的设置和信息。
如果你想传送用户输入的当前设置，请调用CWinApp::SelectPrinter。这个函数读取来自CPageSetupDialog对象的信息并初始化和选择一个具有适当属性的新打印机DC。
AfxGetApp()->SelectPrinter(dlg.m_psd.hDevNames, dlg.m_psd.hDevMode );

请参阅：CPageSetupDialog::m_psd


 CPageSetupDialog::GetDeviceName

CString GetDeviceName() const;

返回值：由CPageSetupDialog对象使用的设备名称。

说明：
在DoModal之后调用此函数来获取当前选择的打印机名称。


 CPageSetupDialog::GetDevMode

LPDEVMODE GetDevMode() const;

返回值：
返回DEVMODE数据结构，该结构包含了有关设备初始化和打印机驱动程序环境的信息。你必须用Windows GlobalUnlock函数解锁这个结构所占的内存，这在“Platform SDK”中有描述。

说明：
在DoModal之后调用此函数来获取有关CPageSetupDialog对象的打印机设备环境的信息。


 CPageSetupDialog::GetDriverName

CString GetDriverName() const;

返回值：返回当前选择的打印机设备驱动程序的名称。

说明：
在DoModal之后调用此函数来获取当前选择的打印机设备驱动程序的名称。

请参阅：
CPageSetupDialog::GetDeviceName, CPageSetupDialog::GetDevMode, CPageSetupDialog::GetPortName


 CPageSetupDialog::GetMargins

void GetMargins( LPRECT lpRectMargins, LPRECT lpRectMinMargins ) const;

参数：
lpRectMargins | 指向RECT结构或CRect结构的指针，这两个结构描述（用1/1000英寸或1/100毫米）了当前选择的打印机的打印边距。如果对这个矩形并不感兴趣，可以将此参数设置为NULL。
lpRectMinMargins | 指向RECT结构或CRect结构的指针，这两个结构描述（用1/1000英寸或1/100毫米）了当前选择的打印机的最小打印边距。如果对这个矩形并不感兴趣，可以将此参数设置为NULL。

说明：
在DoModal之后调用这个函数来获取打印机设备驱动程序的边距。


 CPageSetupDialog::GetPaperSize

CSize GetPaperSize() const;

返回值：
一个包含打印纸张尺寸（以1/1000英寸或1/100毫米为单位）的CSize对象。

说明：此函数用来获取打印纸张的尺寸。


 CPageSetupDialog::GetPortName

CString GetPortName() const;

返回值：返回当前所选打印端口的名称。

说明：
在DoModal之后调用此函数来获取当前所选打印端口的名称。

请参阅：
CPageSetupDialog::GetDeviceName, CPageSetupDialog::GetDriverName


 CPageSetupDialog::OnDrawPage

virtual UINT OnDrawPage( CDC* pDC, UINT nMessage, LPRECT lpRect );

返回值：如果被处理则返回非零值；否则返回0。

参数：
pDC | 指向打印机设备环境的指针。
nMessage指明一个消息，表示当前绘画页面的区域。可以是下列值之一：
· | WM_PSD_FULLPAGERECT | 整个页面区。
· | WM_PSD_MINMARGINRECT | 当前最小边距。
· | WM_PSD_MARGINRECT | 当前边距。
· | WM_PSD_GREEKTEXTRECT | 页面的内容。
· | WM_PSD_ENVSTAMPRECT | 为贴邮票而保留的区域。
· | WM_PSD_YAFULLPAGERECT | 用于返回地址的区域。这个区域延伸到示例页区域的边界。
lpRect | 指向一个CRect或RECT对象的指针，这两个对象包含了绘画区的坐标。

说明：
由框架调用来画一个打印页面的屏幕图像。然后这个图像作为通用OLE PageSetup对话框的一部分来显示。函数的缺省实现是画一个文本页的图像。
重载这个函数可以定制是画图像的指定区域，还是画整个图像。你可以使用switch和case语句来检查nMessage的值。例如，为了定制获取表示图像的内容，你可以使用下面的例子代码：
Switch( nType )
{
case WM_PSD_GREEKTEXTRECT:
DrawMyImage( pDC, lpRect); //画我的指定图像。
return 1;
default:
return ::Draw(CDC* pDC, UINT nDrawType, LPRECT lpRect);
};
注意：你不需要处理nMessage的每一个取值。可以选择处理图像的某一部分，某几个部分或整个区域。

请参阅：CPageSetupDialog::PreDrawPage


 CPageSetupDialog::PreDrawPage

virtual UINT PreDrawPage( WORD wPaper, WORD wFlags, LPPAGESETUPDLG pPSD );

返回值：如果被处理则返回非零值；否则返回0。

参数：
wPaper | 指定一个用来表明纸张尺寸的值。这个值可以是一个DMPAPER_值，在DEVMODE结构的描述中有这些值的列表。
wFlags表明纸张或信封的方向，以及表明打印机是点阵式的还是HPPCL（HewlettPackard Printer Control Language ）设备。此参数可以是下列值之一：
·0x001 | 纸张是横向放置（点阵式）。
·0x003 | 纸张是横向放置（HPPCL）。
·0x005 | 纸张是纵向放置（点阵式）。
·0x007 | 纸张是纵向放置（HPPCL）。
·0x00b | 信封是横向放置（HPPCL）。
·0x00d | 信封是纵向放置（点阵式）。
·0x019 | 信封是横向放置（HPPCL）。
·0x01f | 信封是纵向放置（点阵式）。
pPSD | 指向一个PAGESETUPDLG结构的纸张。要获取有关这个结构的更多消息，请参见Win32文档。

说明：
在画用于页面的屏幕图像之前由框架调用。重载这个函数来定制图像的绘画。
如果你重载这个函数并返回TRUE，则你必须画整个图像。如果你重载这个函数并返回FALSE，则框架会画出整个缺省的图像。

请参阅：CPageSetupDialog::OnDrawPage


 CPageSetupDialog::m_psd

说明：
一个PAGESETUPDLG类型的结构，它的成员保存了对话框对象的特征。在构造了一个CPageSetupDialog对象之后，在调用DoModal之前，你可以使用m_psd来设置对话框的不同方面。
如果你直接修改m_psd数据成员，则你将重载任何缺省的行为。
要获取有关PAGESETUPDLG结构的更多消息，请参见Win32文档。


 CPaintDC

CObject
└CDC
└CPaintDC

CPaintDC类是一个来自CDC的设备环境类。它在构造期间执行CWnd::BeginPaint，在析构期间执行CWnd::EndPaint。
一个CPaintDC对象只在响应一个WM_PAINT消息的时候被使用，通常是在你的OnPaint消息处理成员函数中。
#include <afxwin.h>

CPaintDC类成员

数据成员
m_ps | 包含了用于画客户区的PAINTSTRUCT
m_hWnd | CPaintDC对象所附着的HWND

构造函数
CPaintDC 构造一个连接到指定的CWnd上的CPaintDC对象


 CPaintDC::CPaintDC

CPaintDC( CWnd* pWnd );
throw( CResourceException );

参数：
pWnd 指向一个CPaintDC对象所属的CWnd对象。

说明：
构造一个CPaintDC对象，准备用于绘画的应用程序窗口，并将PAINTSTRUCT结构保存在m_ps成员变量中。
如果Windows GetDC调用失败，则抛出一个异常（CResourceException类型）。
如果Windows已经分配了它所有的可利用的设备环境，则没有可用的设备环境了。在Windows下，你的应用程序在给定时刻竞争五个可用的公共显示环境。


 CPaintDC::m_hWnd

说明：是CPaintDC对象所附着的HWND。m_hWnd是一个HWND类型的被保护变量。


 CPaintDC::m_ps

说明：
m_ps是一个PAINTSTRUCT类型的公有成员变量。它是一个由CWnd::BeginPaint传递和填充的PAINTSTRUCT。
这个PAINTSTRUCT包含了应用程序用来绘制与CPaintDC对象相关的窗口的客户区信息。
注意，你可以通过PAINTSTRUCT来访问设备环境句柄。但是，你可以更直接地通过m_hDC成员变量来访问这个句柄，m_hDC是CPaintDC从CDC继承来的。


 CPalette

CObject
└CGdiObject
└CPalette

CPalette类封装了Windows的调色板。调色板在一个应用程序和一个颜色输出设备（比如一个显示设备）之间提供了一个接口。这个接口允许此应用程序充分使用输出设备的颜色处理能力，而不会干涉其它应用程序显示的颜色。
Windows使用应用程序的逻辑调色板（一个所需颜色的列表）和系统调色板（定义了可以使用的颜色）来确定使用的颜色。
一个CPalette对象提供了用于操作对象所涉及的调色板的成员函数。构造一个CPalette对象，并使用它的成员函数来创建实际的调色板，一个图形设备接口（GDI）对象，并操作他的项和其它的属性。
#include <afxwin.h>

请参阅：CPalette::GetPaletteEntries, CPalette::SetPaletteEntries

CPalette类成员

构造
CPalette 构造一个CPalette对象，没有被附着的Windows调色板。你必须用一个初始化成员函数来初始化这个CPalette对象后才能使用它

初始化
CreatePalette | 创建一个Windows调色板并将它附着在CPalette对象上
CreateHalftonePalette | 创建一个用于设备环境的半调调色板，并将它附着在此CPalette对象上

操作
FromHandle | 当给予一个Windows调色板对象时返回一个指向一个CPalette对象的指针
AnimatePalette | 替换由CPalette对象标识的逻辑调色板中的项。应用程序不需要更新它的客户区，因为Windows会立即将新的项映射到系统调色板
GetNearestPaletteIndex | 返回逻辑调色板中最匹配某个颜色值的项0的索引
ResizePalette | 将CPalette对象所指定的逻辑调色板的大小改变为指定的项数

属性
GetEntryCount | 获取一个逻辑调色板中的调色板项数目
GetPaletteEntries | 获取一个逻辑调色板中一段范围内的调色板项
SetPaletteEntries | 设置逻辑调色板中一段表项范围内的RGB颜色值和标志
Operator HPALETTE | 返回附着在CPalette上的HPALETTE


 CPalette::AnimatePalette

void AnimatePalette( UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors );

参数：
nStartIndex | 指定要激活的调色板中的第一项。
nNumEntries | 指定要激活的调色板中的项数。
lpPaletteColors | 指向一个PALETTEENTRY结构数组中的第一个成员，此结构用于替换由nStartIndex和nNumEntries所标识的调色板项。

说明：
此函数替换附着在CPalette对象上的逻辑调色板。当一个应用程序定义AnimatePalette时，它不用更新它的客户区，因为Windows会立即将新项映射到系统调色板。
AnimatePalette函数只改变这样的项：在此CPalette对象所连接的LOGPALETTE结构中，此项所对应的palPaletteEntry成员中设置了PC_RESERVED标志的调色板项。要获取有关这个结构的更多信息，请参见“Win 32 SDK程序员参考”中的LOGPALETETTE。

请参阅：CPalette::CreatePalette, ::AnimatePalette


 CPalette::CPalette

CPalette();

说明：
构造一个CPalette对象。这个对象没有连接调色板，直到你调用了CreatePalette来将一个调色板连接到此对象上。

请参阅：CPalette::CreatePalette


 CPalette::CreateHalftonePalette

BOOL CreateHalftonePalette(CDC* pDC);

返回值：如果函数成功则返回非零值；否则返回0。

参数：
pDC 标识设备环境。

说明：
为设备环境创建一个半调的调色板。当设备环境的拉伸方式被设置为HALFTONE时，应用程序应该创建半调调色板。在调用CDC::StretchBlt或::StretchDIBits函数之前，应当将CreateHalftonePalette成员函数所返回的逻辑半调调色板选入并实现到设备环境。要获取更多关于CreateHalftonePalette和StretchDIBits的信息，请参见“Win32SDK程序员参考”。

请参阅：
CDC::RealizePalette, CDC::SelectPalette, CDC::SetStretchBltMode, :: CreateHalftonePalette, ::StretchDIBits


 CPalette::CreatePalette

BOOL CreatePalette( LPLOGPALETTE lpLogPalette );

返回值：如果成功则返回非零值；否则返回0。

参数：
lpLongPalette 指向有关LOGPALETTE结构，此结构包含了有关逻辑调色板中的颜色的信息。

说明：
通过创建一个Windows逻辑调色板并将它连接到CPalette对象上来初始化这个CPalette对象。
要获取更多关于LOGPALETTE的信息，请参见“Win 32 SDK程序员参考”。

请参阅：::CreatePalette, LOGPALETTE


 CPalette::FromHandle

static CPalette* PASCAL FormHandle( HPALETTE hPalette );

返回值：如果成功则返回一个指向CPalette对象的指针；否则返回NULL。

参数：
hPalette 一个Windows GDI调色板句柄。

说明：
当给予一个Windows调色板对象时，该函数返回指向一个CPalette对象的指针。如果此Windows调色板要连接一个CPalette对象，则创建一个临时的CPalette对象，并将此对象连接到此Windows调色板上。这个临时CPalette对象只会有效到下次应用程序的事件循环中有空闲时间时，到那时所有临时图形对象都将被删除。也就是说，临时对象仅在处理一条窗口消息的期间有效。


 CPalette::GetEntryCount

int GetEntryCount();

返回值：返回一个逻辑调色板中的项数。

说明：调用这个成员函数来获取一个给定的逻辑调色板中的项数。

请参阅：CPalette::GetPaletteEntries, CPalette_SetPaletteEntries


 CPalette::GetNearestPaletteIndex

UINT GetNearestPaletteIndex( COLORREF crColor ) const;

返回值：
返回值为逻辑调色板某一项的索引。该项中包含最匹配指定颜色的调色板中的颜色。

参数：
crColor 指定要匹配的颜色。

说明：此函数返回逻辑调色板中最匹配指定颜色值的项的索引。

请参阅：::GetNearestPaletteIndex


 CPalette::GetPaletteEntries

UINT GetPaletteEntries( UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors ) const;

返回值：如果函数成功，则返回从逻辑调色板中获取的项数；否则，返回0。

参数：
nStartIndex | 指定在逻辑调色板中要被获取的第一项。
nNumEntries | 指定在逻辑调色板中要获取的项数。
lpPaletteColors | 指向一个PALETTEENTRY数据结构数组，此结构用来接收调色板项。数组中必须至少包含与nNumEntries所指定的项数一样多的数据结构。

说明：此函数返回逻辑调色板中一定范围内的调色板项。

请参阅：::GetPaletteEntries, CPalette::SetPaletteEntries


 CPalette::ResizePalette

BOOL ResizePalette( UINT nNumEntries );

返回值：如果成功地改变了调色板的大小，则返回非零值；否则返回0。

参数
nNumEntries 指定调色板在改变大小后的项数。

说明：
此函数将一个连接于CPalette对象的逻辑调色板的大小改变为nNumEntries所指定的项数。如果一个应用程序调用ResizePalette来减小一个调色板的大小，则保留在改变大小后的调色板中的项是没有变化的。如果应用程序调用ResizePalette来增大调色板的大小，则增加的调色板项被设置为黑（即红、绿、蓝的值均为0），并且所有增加项的标志均为0。
要获取更多关于Windows API ResizePalette的信息，请参见“Win32 SDK程序员参考”中的::ResizePalette。

请参阅：::ResizePalette


 CPalette::SetPaletteEntries

UINT SetPaletteEntries( UINT nStartIndex, UINT nNumEntries, LPPALETTEENTRY lpPaletteColors );

返回值：如果成功则返回在逻辑调色板中设置的项数；否则返回0。

参数：
nStartIndex | 指定在逻辑调色板中要设置的第一项。
nNumEntries | 指定在逻辑调色板中要设置的项数。
lpPaletteColors | 指向一个用来接收调色板项的PALETTEENTRY数据结构数组。该数组必须包含至少与nNumEntries所指定项数一样多的数据结构。

说明：
此函数用来设置一个逻辑调色板中一定范围内的项的RGB颜色值和标志。如果当应用程序调用SetPaletteEntries函数时此逻辑调色板被选入一个设备环境中，则该调用所做的变化在应用程序调用CDC::RealizePalette之前不会起作用。
要获取更多关于Windows PALETTEENTRY结构的信息，请参见“Win32 SDK程序员参考”中的PALETTEENTRY。

请参阅：CDC::RealizePalette, CPalette::GetPaletteEntries, ::SetPaletteEntries


 CPalette::operator HPALETTE

operator HPALETTE() const;

返回值：如果成功则返回一个由CPalette对象表示的Windows GDI对象句柄；否则返回0。

说明：
此操作符用来获取与CPalette对象连接的Windows GDI句柄。此操作符是一个强制转换操作符，它支持直接使用一个HPALETTE对象。
要获取更多关于使用图形对象的信息，请参见“Win32 SDK程序员参考”中的文章“图形对象”。


 CPen

CObject
└CGdiObject
└CPen

CPen类封装了Windows图形设备接口（GDI）画笔。
#include <afxwin.h>
请参阅：CBrush

CPen类成员

Construction
CPen 构造一个CPen对象

Initialization
CreatePen | 用指定风格、宽度和画刷属性创建一个逻辑装饰画笔或几何画笔，并将它连接到CPen对象上
CreatePenIndirect | 用在一个LOGPEN结构中给出的风格、宽度和颜色来创建一只画笔，并将它连接到CPen对象上

Operations
FromHandle 当给予一个Windows HPEN时，返回一个指向CPen对象的指针

Attributes
Operator HPEN 返回连接到CPen对象上的Windows句柄

Attributes
GetLogPen 获取一个LOGPEN基础结构GetExtLogPen获取一个EXTLOGPEN基础结构


 CPen::CPen

CPen();
CPen( int nPenStyle, int nWidth, COLORREF crColor );
throw( CResourceException );
CPen( int nPenStyle, int nWidth , const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL );
throw( CResourceException );

参数：
nPenStyle指定画笔的风格。 在构造函数的第一个版本中，此参数可以取下列值之一：
PS_SOLID | 创建一支实线画笔。
PS_DASH | 创建一支虚线画笔。只有当画笔宽度为1或更小（以设备单位计算）时才有效。
PS_DOT | 创建一支点线画笔。只有当画笔宽度为1或更小（以设备单位计算）时才有效。
PS_DASHDOT | 创建一支虚线和点交替的画笔。只有当画笔宽度为1或更小（以设备单位计算）时才有效。
PS_DASHDOTDOT | 创建一支虚线和两点交替的画笔。只有当画笔宽度为1或更小（以设备单位计算）时才有效。
PS_NULL | 创建一支空画笔。
PS_INSIDEFRAME | 创建一支画笔，该画笔在Windows GDI输出函数所产生的封闭形状的框架内画线，此输出函数指定一个限定矩形（例如，Ellipse，Rectangle，RoundRect，Pie和Chord成员函数），当此风格用于没有指定限定矩形的Windows GDI输出函数（例如LineTo成员函数）时，此画笔的绘制区域不受框架的限制。

第二种版本的CPen构造器指明了类型、风格、尾帽和连接等属性组合。来自每个类别的值应使用位操作符（|）组合起来。
笔的风格可以是下列之一：
PS_GEOMETRIC | 创建一支几何画笔。
PS_COSMETIC | 创建一支装饰画笔。CPen构造函数的第二个版本为nPenStyle添加了下列一些画笔风格：
PS_ALTERNATE | 创建一支交替设置像素的画笔（此风格只用于装饰画笔）。
PS_USERSTYLE | 创建一支使用用户提供的风格数组的画笔。

尾帽可以是下列值之一：
PS_ENDCAP_ROUND | 尾帽是圆的。
PS_ENDCAP_SQUARE | 尾帽是方的。
PS_ENDCAP_FLAT | 尾帽是平面的。

连接可以是下列值之一：
PS_JOIN_BEVEL | 连接是斜截式的。
PS_JOIN_MITER | 当连接在::SetMiterLimit函数所设置的当前限制之内时，连接是斜接式的。如果连接超出这个限制则成为斜截式的。
PS_JOIN_ROUND | 连接是圆的。

nWidth 指定画笔的宽度。
· | 对于构造函数的第一个版本来说，如果这个值是0，则不管是什么映射方式，以设备单位计算的宽度总是一个像素。
· | 对于构造函数的第二个版本来说，如果nPenStyle是PS_GEOMETRIC，则宽度以逻辑单位给出。如果nPenStyle是PS_COSMETIC，则宽度必须设置为1。

crColor | 包含了画笔的RGB值。
pLogBrush | 指向一个LOGBRUSH结构。如果nPenStyle是PS_COSMETIC，则此LOGBRUSH结构的lbColor成员指定画笔的颜色，此LOGBRUSH结构的lbStyle成员必须设置为BS_SOLID。如果nPenStyle为PS_GEOMETRIC，则此结构的所有成员都必须用于指定画笔画刷属性。
nStyleCount | 指定lpStyle数组的长度（以双字为单位）。如果nPenStyle不是PS_USERSTYLE，这个值必须是零。
lpStyle | 指向一个双字值的数组。第一个值指定一个用户定义的风格中第一段虚线的长度，第二个值指定第一段空白的长度，如此等等。如果nPenStyle不是PS_USERSTYLE，则这个指针必须为NULL。

说明：
如果你使用的是没有参数的构造函数，你就必须用CreatePen，CreatePenIndirect或CreateStockObject成员函数来初始化所生成的CPen对象。如果你使用的是带参数的构造函数，则不再需要进一步的初始化。如果有错误发生，则带参数的构造函数可能会抛出一个异常，但是不带参数的构造函数则总是会成功。

请参阅：
CPen::CreatePen, CPen::CreatePenIndirect, CGdiObject::CreateStockObject


 CPen::CreatePen

BOOL CreatePen( int nPenStyle, int nWidth, COLORREF cfColor );
BOOL CreatePen( int nPenStyle, int nWidth, const LOGBRUSH* pLogBrush, int nStyleCount = 0, const DWORD* lpStyle = NULL );

返回值：如果成功则返回非零值或逻辑画笔的句柄；否则返回0。

参数：
nPenStyle | 指定画笔的风格。其可能取值的列表，请参见CPen构造函数中的nPenStyle参数。
nWidth | 指定画笔的宽度。
· | 对于CreatePen的第一个版本来说，如果这个值为0，则不管是什么映射模式，以设备单位表示的宽度总是一个像素。
· | 对于CreatePen的第二个版本，如果nPenStyle是PS_GEOMETRIC，则宽度以逻辑单位给出。如果nPenStyle是PS_COSMETIC，则宽度必须设置为1。

crColor | 包含画笔的一个RGB颜色。
pLogBrush | 指向一个LOGBRUSH结构。如果nPenStyle是PS_COSMETIC，则此LOGBRUSH结构的lbColor成员指定画笔的颜色，此LOGBRUSH结构的lbStyle成员必须设置为BS_SOLED。如果nPenStyle为PS_GEOMETRIC，则此结构的所有成员都必须用于指定画笔画刷属性。
nStyleCount | 指定lpStyle数组的长度（以双字为单位）。如果nPenStyle不是PS_USERSTYLE，这个值必须是零。
lpStyle | 指向一个双字值的数组。第一个值指定一个用户定义的风格中第一段虚线的长度，第二个值指定第一段空白的长度，如此等等。如果nPenStyle不是PS_USERSTYLE，则这个指针必须为NULL。

说明：
CreatePen的第一个版本用指定的风格、宽度和颜色来初始化一支画笔。此画笔以后可选作为任何设备环境的当前画笔。
宽度大于1个像素的画笔总是具有PS_NULL，PS_SOLED或PS_INSIDEFRAME风格。
如果画笔具有PS_INSIDEFRAME风格和某一不匹配逻辑调色板中颜色的颜色，则此画笔用一个混合色来进行绘制。PS_SOLID画笔风格不能用一个混合色来创建一支画笔。当画笔的宽度小于或等于1时，PS_INSIDEFRAME风格等同于PS_SOLID风格。
CreatePen的第二个版本初始化一支具有指定的风格、宽度和刷子属性的逻辑装饰画笔或几何画笔。一支装饰画笔的宽度总是1；几何画笔的宽度总是由世界单位指定。当应用程序创建了一支逻辑画笔之后，它可通过调用CDC::SelectObject函数来将此画笔选入一个设备环境中。当一支画笔被选入一个设备环境之后，它就可以用于画直线或曲线。
· | 如果nPenStyle为PS_COSMETIC和PS_USERSTYLE，则lpStyle数组中的项指定风格单位中虚线和空白的长度。一个风格单位由使用此画笔画线的设备定义。
· | 如果nPenStyle为PS_GEOMETRIC和PS_USERSTYLE，则lpStyle数组中的项指定虚线和空白的长度（用逻辑单位表示）。
· | 如果nPenStyle为PS_ALTERNATE，则忽略风格单位而交替设置像素。
当一个应用程序不再需要一支给定的画笔时，它将调用CGdiObject::DeleteObject成员函数或销毁CPen对象，以使资源不再使用。当一支画笔被选入一个设备环境后，应用程序就不能删除这支画笔了。

请参阅：
CPen::CreatePenIndirect, CPen::CPen, CGdiObject::DeleteObject, LOGBRUSH


 CPen::CreatePenIndirect

BOOL CreatePenIndirect( LPLOGPEN lpLogPen );

返回值：如果成功则返回非零值；否则返回0。

参数：
lpLogPen 指向Windows LOGPEN结构，此结构包含了此画笔的信息。

说明：
此函数初始化一支画笔，此画笔具有lpLogPen所指向的结构中给定的风格、宽度和颜色。
宽度大于1个像素的画笔总是具有PS_NULL，PS_SOLID或PS_INSIDEFRAME风格。
如果画笔具有PS_INSIDEFRAME风格和某种不匹配逻辑调色板中颜色的颜色，则画笔用一支混合色来绘制。如果画笔宽度小于或等于1，则PS_INSIDEFRAME风格等同于PS_SOLID风格。

请参阅：CPen::CreatePen, CPen::CPen


 CPen::FromHandle

static CPen* PASCAL FromHandle( HPEN hPen );

返回值：如果成功则返回一个指向CPen对象的指针；否则返回NULL。

参数：
hPen Windows GDI画笔的HPEN句柄。

说明：
当给予一个Windows GDI画笔对象时，此函数返回指向一个CPen对象的指针。如果此句柄没有连接一个CPen对象，则将创建一个临时CPen对象，并将此CPen对象连接到此HPEN句柄上。这个临时CPen对象只能有效到下次应用程序的事件循环有空闲时间时，到那时所有临时图形对象都将被删除。也就是说，临时对象仅在处理一条Windows消息的期间有效。


 CPen::GetExtLogPen

int GetExtLogPen( EXTLOGPEN* pLogPen );

返回值：如果成功则返回非零值；否则返回0。

参数：
pLogPen 指向一个EXTLOGPEN结构，此结构包含此画笔的消息。

说明：
此函数用来获取一个EXTLOGPEN 基础结构。该EXTLOGPEN结构定义了画笔的风格、宽度和刷子属性。例如，调用GetExtLogPen来匹配一支画笔的特别的风格。
参见“Win32 SDK程序员参考”中的下列主题，可以获取有关画笔属性的信息：
·GetObject
·EXTLOGPEN
·LOGPEN
·ExtCreatePen

示例：
下面的例子代码演示了调用GetExtLogPen来获取一支画笔的属性，然后创建一支新的、具有相同颜色的装饰画笔。
EXTLOGPEN extlogpen;
penExisting.GetExtLogPen( &extlogpen );
CPen penOther;
LOGBRUSH LogBrush = { extlogpen.elpBrushStyle,extlogpen.elpColor,extlogpen.elpHatch };
penOther.CreatePen( PS_COSMETIC, 1, &LogBrush );

请参阅：CPen::GetLogPen, CPen::CreatePen


 CPen::GetLogPen

int GetLogPen( LOGPEN* pLogPen );

返回值：如果成功则返回非零值；否则返回0。

参数：
pLogPen 指向一个包含画笔信息的LOGPEN结构。

说明：
此函数用来获取一个LOGPEN基础结构。该LOGPEN结构定义了画笔的风格、宽度和画笔模式。例如，调用GetLogPen来匹配一支画笔的特别风格。
参见“Win32 SDK程序员参考”中的下列主题，可以获取有关画笔属性的信息：
·GetObject
·LOGPEN

示例：
下面的例子代码演示了调用GetLogPen来获取一支画笔的特征，然后创建一支新的、具有相同颜色的装饰画笔。
LOGPEN logpen;
penExisting.GetLogPen( &logpen );
CPen penOther( PS_SOLID, 0, logpen.lopnColor );

请参阅：CPen::GetExtLogPen


 CPen::operator HPEN

operator HPEN() const;

返回值：如果成功，则返回一个CPen对象所代表的Windows GDI对象句柄；否则返回0。

说明：
此操作符用来获取连接到CPen对象上的Windows GDI句柄。此操作符是一个强制转换操作符，它支持直接使用一个HPEN对象。
要获取更多有关使用图形对象的信息，请参见“Win32 SDK程序员参考”中的文章“图形对象”。


 CPictureHolder

CPictureHolder没有基类。
CPictureHolder类的目的是Picture属性的实现，这使得用户可以在其控件中显示一幅图画。通过固有的Picture属性，开发者可以指定用于显示的位图、图标或图元文件。
#include <afxctl.h>
请参阅：CFontHolder

CPictureHolder类成员

数据成员
m_pPict 一个指向图画对象的指针

构造
CPictureHolder 构造一个CPictureHolder对象

操作
GetDisplayString | 获取一个显示在控件容器的属性浏览器中的字符串
CreateEmpty | 创建一个空的CPictureHolder对象
CreateFromBitmap | 从位图创建一个CPictureHolder对象
CreateFromMetafile | 从图元文件创建一个CPictureHolder对象
CreateFromIcon | 从图标创建一个CPictureHolder对象
GetPictureDispatch | 返回CPictureHolder对象的IDispatch接口
SetPictureDispatch | 设置CPictureHolder对象的IDispatch接口
GetType | 表明CPictureHolder对象是位图、图元文件还是图标
Render | 画出此图画


 CPictureHolder::CPictureHolder

CPictureHolder();

说明：此函数用来构造一个CPictureHolder对象。

请参阅：CPictureHolder::CreateEmpty


 CPictureHolder::CreateEmpty

BOOL CreateEmpty();

返回值：
如果成功地创建了对象，则返回非零值；否则返回0。

说明：
此函数创建一个空的CPictureHolder对象，并将它与一个IPicture接口连接。

请参阅：
CPictureHolder::CreateFromBitmap, CPictureHolder::CreateFromIcon, CPictureHolder::CreateFromMetafile


 CPictureHolder::CreateFromBitmap

BOOL CreateFromBitmap( UINT idResource );
BOOL CreateFromBitmap( HBITMAP hbm, HPALETTE hpal = NULL );
BOOL CreateFromBitmap( CBitmap* pBitmap,
CPalette* pPal = NULL,
BOOL bTransferOwnership = TRUE
);

返回值：
如果成功地创建了对象则返回非零值；否则返回0。

参数：
idResource | 一个位图资源的资源ID。
pBitmap | 指向一个CBitmap对象的指针。
pPal | 指向一个CPalette对象的指针。
bTransferOwnership | 表明图画对象是否会获取位图和调色板对象的所有权。
hbm | 位图句柄，CPictureHolder对象是由此创建的。
hpal | 调色板句柄，该调色板用来绘制位图。

说明：
此函数用一个位图来初始化一个CPictureHolder中的图画对象。如果bTransferOwnership是TRUE，则在这次调用返回之前，调用者不应该以任何方式来使用这个位图或调色板。如果bTransferOwnership是FALSE，则在图画对象的生命周期内由调用者来负责保证位图和调色板保持有效。

请参阅：
CPictureHolder::CreateEmpty, CPictureHolder::CreateFromIcon, CPictureHolder::CreateFromMetafile


 CPictureHolder::CreateFromIcon

BOOL CreateFromIcon( UINT idResource );
BOOL CreateFromIcon( HICON hIcon,BOOL bTransferOwnership = FALSE );

返回值：
如果创建对象成功则返回非零值；否则返回0。

参数：
idResource | 一个位图资源的资源ID。
hIcon | 图标句柄，CPictureHolder对象由此创建。
bTransferOwnership | 表明这个图画对象是否会获得图标对象的所有权。

说明：
此函数用一个图标来初始化一个CPictureHolder中的图画对象。如果bTransferOwnership是TRUE，则在这次调用返回之前，调用者不应该以任何方式来使用这个图标。如果bTransferOwnership是FALSE，则在图画对象的生命周期内由调用者来负责保证图标保持有效。

请参阅：
CPictureHolder::CreateEmpty, CPictureHolder::CreateFromBitmap, CPictureHolder::CreateFromMetafile


 CPictureHolder::CreateFromMetafile

BOOL CreateFromMetafile( HMETAFILE hmf,
int xExt,
int yExt,
BOOL bTransferOwnership = FALSE
);

返回值：
如果成功地创建了对象则返回非零值；否则返回0。

参数：
hmf | 图元文件的句柄，此图元文件用来创建CPictureHolder对象。
xExt | 图画的X范围。
yExt | 图画的Y范围。
bTransferOwnership | 表明这个图画对象是否会获得图标对象的所有权。

说明：
此函数用一个图元文件来初始化一个CPictureHolder中的图画对象。如果bTransferOwnership是TRUE，则在这次调用返回之前，调用者不应该以任何方式来使用这个图元文件。如果bTransferOwnership是FALSE，则在图画对象的生命周期内由调用者来负责保证这个图元文件保持有效。

请参阅：
CPictureHolder::CreateEmpty, CPictureHolder::CreateFromBitmap, CPictureHolder::CreateFromIcon


 CPictureHolder::GetDisplayString

BOOL GetDisplayString( CString& strValue );

返回值：
如果成功地获取了字符串则返回非零值；否则返回0。

参数：
strValue 用来保存显示字符串的CString的引用。

说明：
此函数用来获取被显示在一个容器的属性浏览器中的字符串。


 CPictureHolder::GetPictureDispatch

LPPICTUREDISP GetPictureDispatch();

返回值：
返回一个指向CPictrureHolder对象的IPictureDisp接口的指针。

说明：
此函数返回一个指向CPictrureHolder对象的IPictureDisp接口的指针。当使用完这个指针后，用户必须对它调用Release。

请参阅：CPictureHolder::SetPictureDispatch


 CPictureHolder::GetType

short GetType();

返回值：
是一个表明图画类型的值。它可能的取值及含义如下所示：
值 | 含义
PICTYPE_UNINITIALIZED | CPictureHolder对象没有被初始化
PICTYPE_NONE | CPictureHolder对象是空的
PICTYPE_BITMAP | 图画是一个位图
PICTYPE_METAFILE | 图画是一个图元文件
PICTYPE_ICON | 图画是一个图标

说明：
此函数用来表明图画是位图、图元文件还是一个图标。


 CPictureHolder::Render

void Render( CDC* pDC, const CRect& rcRender, const CRect& rcWBounds );

参数：
pDC | 指向一个显示环境的指针，图画被显示在这个环境中。
rcRender | 一个矩形，图画被显示在这个矩形中。
rcWBounds | 一个矩形，它代表显示该图画的对象的边界矩形。对一个控件来说，这个矩形是被传递给一个重载的COleControl::OnDraw函数的rcBounds参数。

说明：
此函数将图画显示在由rcRender引用的矩形中。


 CPictureHolder::SetPictureDispatch

void SetPictureDispatch( LPPICTUREDISP pDisp );

参数：
pDisp 指向新的IPictureDisp接口的指针。

说明：
此函数将CPictureHolder对象连接到IPictureDisp接口。

请参阅：CPictureHolder::GetPictureDispatch


 CPictureHolder::m_pPict

说明：
此数据成员是一个指向CPictureHolder对象的IPicture接口的指针。


 CPoint

CPoint类与Windows POINT结构类似。它还包括用来操纵CPoint和POINT结构的成员函数。
只要POINT结构可以使用的地方，CPoint对象也可以使用。这个类与“大小”有关的操作符可以接受CSize对象或SIZE结构，因为这两者是可以互换的。
注意：这个类派生于tagPOINT结构（名字tagPOINT是POINT结构的不太常用的有关名字）。这意味着POINT结构的数据成员，x和y，也是CPoint的可以访问的数据成员。
#include <afxwin.h>

请参阅：CRect, CSize

CPoint类成员

构造
CPoint 构造一个CPoint

操作符
Offset | 给CPoint的x和y成员增加值
operator == | 检查两个点是否相等
operator != | 检查两个点是否不等

返回CPoint值的操作符
operator += | 通过增加一个尺寸或点来使CPoint偏移
operator -= | 通过减去一个尺寸或点来使CPoint偏移
operator + | 返回一个CPoint和一个尺寸或点的和
operator - | 返回一个CPoint和一个尺寸或点的偏差，或一个点的不存在

返回CSize值的操作符
operator - 返回两点之间的大小差别

返回CRect值的操作符
operator + | 返回偏移一个大小的CRect
operator - | 返回偏移一个负大小的CRect


 CPoint::CPoint

CPoint();
CPoint( int initX, int initY );
CPoint( POINT initPt );
CPoint( SIZE initSize );
CPoint( DWORD dwPoint );

参数：
initX | 指定CPoint的成员x的值。
initY | 指定CPoint的成员y的值。
initPt | 用于初始化此CPoint的一个POINT结构或CPoint对象。
initSize | 用于初始化CPoint值的SIZE结构或CSize。
dwPoint | 设此参数的低位字为x成员，高位字为y成员。

说明：构造一个CPoint对象。如果不给参数，则不初始化x和y成员。


 CPoint::Offset

void Offset( int xOffset, int yOffset );
void Offset( POINT point );
void Offset ( SIZE size );

参数：
xOffset | 指定CPoint的x成员的偏移量。
yOffset | 指定CPoint的y成员的偏移量。
point | 指定偏移此CPoint的数量（POINT 或CPoint）。
size | 指定偏移此CPoint的数量（SIZE或CSize）。

说明：此函数将偏移值增加到CPoint的x和y成员。

请参阅：CPoint::operator +=, CPoint::operator -=


 CPoint::operator +

CPoint operator +( SIZE size ) const;
CPoint operator +( POINT point ) const;
CRect operator +( const RECT* lpRect ) const;

返回值：
返回一个偏移一个大小的CPoint，一个偏移一个点的CPoint，或者是一个偏移一个点的CRect。

参数：
size | 包含一个SIZE结构或CSize对象。
point | 包含一个POINT结构或CPoint对象。
lpRect | 包含一个指向RECT结构或CRect对象的指针。

说明：
此操作符用来将一个CPoint偏移一个CPoint或一个CSize对象，或者是将一个CRect对象偏移一个CPoint。例如，使用前两种格式可以做到，将点CPoint(25,-19)偏移一个点CPoint(15,5)或偏移一个大小CSize(15,5)，其结果都是返回CPoint(40,-14);将一个矩形与一个点相加，返回的是偏移了点中所指定的x和y值之后的矩形。例如，使用最后一种格式可以将矩形CRect(125,219,325,419 )偏移一个点CPoint(25,-19)，其结果是返回一个矩形CRect(150,200,350,400)。

请参阅：
CPoint::operator -=, CPoint::operator -, CPoint::operator +=, CSize::operator +, CRect::operator +, CPoint::Offset, CRect::OffsetRect


 CPoint::operator -

CSize operator ( POINT point ) const;
CPoint operator ( SIZE size ) const;
CRect operator ( const RECT* lpRect ) const;
CPoint operator () const;

返回值：
返回表示两点之间偏差的CSize，或是加上了负的size偏移的CPoint，或是加上了负的point偏移的CRect，或是CPoint等于负的point。

参数：
size | 包含一个SIZE结构或CSize对象。
point | 包含一个POINT结构或CPoint对象。
lpRect | 包含一个指向RECT结构或CRect对象的指针。

说明： 使用前两种格式来从CPoint中减去一个CPoint或CSize。第三种格式在Rect上加上负的CPoint所表示的偏移。最后一种格式使用一元操作符来对CPoint取负值。例如，用第一种格式来查找两个点CPoint(25,-19)和CPoint(15,5)之间的差异，则返回的是CSize(10,-24)。从CPoint中减去CSize，所进行的计算与上面是一样的，但是返回的是一个CPoint对象，而不是一个CSize对象。例如，用第二种格式来查找点CPoint(25,-19)和大小CSize(15,5)之间的差异，则返回的是CPoint(10,-24)。从一个点中减去一个矩形，返回的是偏移了点中所指定的x和y的负值之后的矩形。例如，用最后一种格式来将矩形CRect(125,200,325,400)偏移一个点CPoint(25,－19)，则返回的是矩形CRect(100,219,300,419)。使用一个一元操作符来取一个点的负值。例如，对点CPoint(25,-19)使用一元操作符，则返回的是CPoint(-25,19)。

请参阅：
CPoint::operator -=, CPoint::operator +=, CPoint::operator +, CSize::operator +, CRect::operator +, CPoint::Offset, CRect::OffsetRect


 CPoint::operator +=

void operator +=( SIZE size );
void operator +=( POINT point );

参数：
size | 包含一个SIZE结构或CSize对象
point | 包含一个POINT结构或CPoint对象。

说明：
第一种形式给CPoint增加一个大小。第二种形式给CPoint增加一个点。在这两种格式中，都是将右边操作数的x（或cx）成员加到CPoint的x成员，将右边操作数的y（或cy）成员加到CPoint的y成员。例如，将CPoint(5, -7)加到一个包含CPoint(30,40)的变量上，则变量的值变为CPoint(35，33)。

请参阅：CPoint::operator -=, CPoint::operator +, CPoint::Offset


 CPoint::operator -=

void operator -=( SIZE size );
void operator -=( POINT point);

参数：
size | 包含一个SIZE结构或CSize对象。
point | 包含一个POINT结构或CPoint对象。

说明：
第一种形式从CPoint减去一个大小。第二种形式给CPoint减去一个点。在这两种格式中，都是从CPoint的x成员中减去右边操作数的x（或cx）成员，从CPoint的y成员中减去右边操作数的y（或cy）成员。例如，将CPoint(5, -7)从一个包含CPoint(30,40)的变量中减去，则变量的值变为CPoint(25, 47)。

请参阅：CPoint::operator -, CPoint::operator +=, CPoint::Offset


 CPoint::operator ==

BOOL operator ==(POINT point) const;

返回值：如果两点相等则返回非零值；否则返回0。

参数：
point 包含一个POINT结构或CPoint对象。

说明：此函数用来检查两个点是否相等。

请参阅：CPoint::operator !=


 CPoint::operator !=

BOOL operator != ( POINT point ) const;

返回值：如果两点不相等则返回非零值；否则返回0。

参数：
point 包含一个POINT结构或CPoint对象。

说明：此成员函数用来检查两个点是否不等。

请参阅 CPoint::operator ==


 CPrintDialog

CObject
└CCmdTarget
└CWnd
└CDialog
└CCommonDialog
└CPrintDialog

CPrintDialog类封装了Windows通用打印对话框为打印提供的服务。通用打印对话框以一种与Windows标准一致的方式提供了一种实现Print和Print Setup对话框的简单方法。
如果你愿意，可以依靠框架来为应用程序处理许多打印处理方面的事情。在这种情况下，框架自动显示打印用的Windows通用对话框。也可以让框架为应用程序处理打印操作，但用自己的打印对话框来加载通用的Print对话框。
如果你希望你的应用程序在没有框架干涉的情况下来处理打印，则可用所提供的构造函数使用“原样”CPrintDialog类，或者从CPrintDialog派生自己的对话框类，并编制构造函数以满足自己的需要。在这两种情况下，由于这些对话框都是从类CCommondDialog类派生而来的，因此它们的行为将都类似于标准MFC对话框。
为了使用CPrintDialog对象，首先要用CPrintDialog构造函数来创建此对象。
一旦已经构造了对话框，你可以设置或修改m_pd结构中的任何值来初始化对话框的控件的值。m_pd结构是PRINTDLG类型的。要获取更多有关这个结构的信息，请参见Win32 SDK文档。
如果你在m_pd中没有为hDevMode和hDevName成员提供自己的句柄，则要确保在应用程序使用完此对话框时，调用Windows函数GlobalFree释放这些句柄。当使用由CWinApp::OnFilePrintSetup函数提供的框架的Print Setup实现时，应用程序不必释放这些句柄。这些句柄由CWinApp维护，并在CWinApp的析构函数中释放。唯一必要的是在独立使用CPrintDialog时，释放这些句柄。
在初始化对话框之后，调用DoModal成员函数来显示这个对话框，并允许用户选择打印选项。DoModal返回用户选择的是OK（IDOK）还是Cancel（IDCANCEL）按钮。
如果DoModal返回IDOK，则应用程序可以用一个CPrintDialog成员函数来获取用户输入的信息。
要在不显示一个对话框的情况下获取当前打印机的缺省状态，CPrintDialog::GetDefaults成员函数是一个有用的函数。这个成员函数不需要用户的交互作用。
你可以调用Windows的CommDlgExtendedError函数来确定在对话框的初始化过程中是否发生了错误，并获得有关错误的进一步消息。要获取有关这个函数的更多信息，请参见Win32 SDK文档。
CPrintDialog依赖由Windows 3.1及其更高版本引进的COMMDLG.DLL文档。要定制此对话框，先从CPrintDialog派生一个新类，提供一个定制对话框模板，并增加一个处理来自扩展控件的通知消息的消息映射。任何未处理消息将传递给基类处理。不需要定制hook函数。
要想根据对话框是Print还是Print Setup来不同地处理同一条消息，应用程序必须为每个对话框派生一个新类。还必须重载Windows函数AttachOnSetup，它负责处理当在Print对话框内选择Print Setup按钮时新对话框的创建。
如果要获取有关使用CPrintDialog的更多信息，请参见“Visual C++程序员指南”中的文章“通用对话框类”。
#include <afxdlgs.h>
请参阅：CPrintInfo

CPrintDialog类成员

数据成员
m_pd 用来定制CPrintDialog对话框的结构

构造
CPrintDialog 构造一个CPrintDialog对话框

操作
CreatePrinterDC | 创建一个打印机设备环境，但不显示Print对话框
DoModal | 显示对话框，并允许用户进行选择
GetCopies | 获取所请求的备份数目
GetDefaults | 检取设备缺省项，但不显示对话框
GetDeviceName | 检取当前所选打印设备的名字
GetDevMode | 检取DEVMODE结构
GetDriverName | 检取当前所选打印机驱动器的名字
GetFromPage | 检取打印范围的起始页
GetToPage | 检取打印范围的结束页
GetPortName | 检取当前所选打印机端口名
GetPrinterDC | 检取设备环境的句柄
PrintAll | 确定是否请求打印文档的所有页
PrintCollate | 确定是否请求校对备份
PrintRange | 确定是否只打印指定范围内的页
PrintSelection | 确定是否只打印当前所选项


 CPrintDialog::CPrintDialog

CPrintDialog( BOOL bPrintSetupOnly,
DWORD dwFlags = PD_ALLPAGES | PD_USEDEVMODECOPIES |
PD_NOPAGENUMS | PD_HIDEPRINTTOFILE |
PD_NOSELECTION,
CWnd* pParentWnd = NULL
);

参数：
bPrintSetupOnly | 指定是显示标准的Windows Print对话框还是Print Setup对话框。设置该参数为TRUE，则显示标准Windows Print Setup对话框。设置该参数为FALSE，则显示Windows Print对话框。如果bPrintSetupOnly为FALSE，则Print Setup选项按钮仍显示在Print对话框中。
dwFlags | 一个或多个标志，可用于定制对话框的设置，这些标志可以用位或OR操作符来组合。例如，PD_ALLPAGES标志将缺省打印范围设置为文档的所有页。有关这些标志的详细信息，请参见Windows SDK中的PRINTDLG结构。
pParentWnd | 指向对话框的父或属主窗口的指针。

说明：
此函数用来构造一个Windows Print或Print Setup对话框。这个成员函数只构造此对象。利用DoModal成员函数可显示此对话框。
值得注意的是，当你将bPrintSetupOnly设置为FALSE来调用构造函数时，会自动使用PD_RETURNDC标志。在调用DoModal，GetDefaults或GetPrinterDC后，一个打印机DC将会被放在m_pd.hdc中返回。这个DC必须由CPrintDialog的调用者来释放。

请参阅：CPrintDialog::DoModal, ::PrintDlg


 CPrintDialog::CreatePrinterDC

HDC CreatePrinterDC();

返回值：
返回一个新创建的打印机设备环境的句柄。

说明：
此函数从DEVMODE和DEVNAMES结构创建一个打印机设备环境（DC）。
这个DC被假定为当前打印机DC，其它任何先前获得的打印机DC都必须由用户删除。不必显示Print对话框就能调用此函数，并使用创建得到的DC。

请参阅：CPrintDialog::GetDevMode


 CPrintDialog::DoModal

virtual int DoModal();

返回值：
返回IDOK或IDCANCEL。如果返回的是IDCANCEL，则要调用WindowsCommDlgExtendedError函数来确定是否发生了一个错误。IDOK和IDCANCEL都是常量，它表明用户选择的是OK按钮还是Cancel按钮。

说明：
此函数用来显示Windows的通用打印对话框，并允许用户选择各个打印选项，例如备份的数目、页范围和备份是否需要整理。
如果你想要提供设置m_pd结构的成员来初始化各个打印对话框选项，则应当在打印DoModal之前，但在对话框对象构造之后进行。
在调用了DoModal之后，你就可以调用其它的成员函数来检取各个设置或用户在对话框中输入的信息了。

请参阅：
CPrintDialog::CPrintDialog, CDialog::DoModal


 CPrintDialog::GetCopies

int GetCopies() const;

返回值：返回所请求的备份数目。

说明：
在调用DoModal之后调用此函数来获取所请求的备份数目。

请参阅：CPrintDialog::PrintCollate


 CPrintDialog::GetDefaults

BOOL GetDefaults();

返回值：
如果函数成功则返回非零值；否则返回0。

说明：
此函数用来检取缺省打印机的设备缺省值，不需要显示对话框。所检取的值放在m_pd结构中。
在某些情况下，调用这个函数会导致调用CPrintDialog的构造函数，并将bPrintSetupOnly设置为FALSE。在这些情况下，一个打印机DC和hDevNames和hDevMode（m_pd数据成员中的两个句柄）将会被自动分配。
如果CPrintDialog的构造函数是在bPrintSetupOnly设置为FALSE的情况下被调用的，则此函数将不仅仅是把hDevNames和hDevMode（在m_pd.hDevNames和m_pd.hDevMode中）返回给调用者，而是还要返回一个在m_pd.hDC中的打印机DC。由调用者负责删除这个打印机DC，并在完成了CPrintDialog对象时以此句柄调用Windows GlobalFree函数。

请参阅：CPrintDialog::m_pd


 CPrintDialog::GetDeviceName

CString GetDeviceName() const;

返回值：返回当前所选打印机的名字。

说明：
在调用DoModal之后调用此函数来检取当前所选打印机的名字。

请参阅：
CPrintDialog::GetDriverName, CPrintDialog::GetDevMode, CPrintDialog::GetPortName


 CPrintDialog::GetDevMode

LPDEVMODE GetDevMode() const;

返回值：
返回DEVMODE数据结构，该结构包含了有关设备初始化和打印机驱动器环境的信息。你必须调用Windows GlobalUnlock函数来解锁这个结构所占的内存，在“Platform SDK”中有关于这个函数的描述。

说明：
在调用DoModal之后调用此函数来检取有关打印机设备的信息。

请参阅：CDC::GetDeviceCaps


 CPrintDialog::GetDriverName

CString GetDriverName() const;

返回值：
返回当前所选的打印机设备驱动器的名字。

说明：
在调用DoModal之后调用此函数来获取当前所选打印机设备驱动器的名字。

请参阅：
CPrintDialog::GetDeviceName, CPrintDialog::GetDevMode, CPrintDialog::GetPortName


 CPrintDialog::GetFromPage

int GetFromPage() const;

返回值：返回所选打印范围内的首页号码。

说明：
在调用DoModal之后调用此函数来检取所选打印范围内的首页号码。

请参阅：
CPrintDialog::GetToPage, CPrintDialog::PrintRange


 CPrintDialog::GetPortName

CString GetPortName() const;

返回值：返回当前所选打印机端口的名字。

说明：
在调用DoModal之后调用此函数来检取当前所选打印机端口的名字。

请参阅：
CPrintDialog::GetDriverName, CPrintDialog::GetDeviceName


 CPrintDialog::GetPrinterDC

HDC GetPrinterDC() const;

返回值：
如果成功则返回一个打印机设备环境的句柄；否则返回NULL。

说明：
如果CPrintDialog构造函数的参数bPrintSetupOnly是FALSE（表明显示的是Print对话框），则GetPrinterDC返回一个打印机设备环境句柄。当你使用完这个设备环境时，你必须调用Windows DeleteDC函数来删除它。


 CPrintDialog::GetToPage

int GetToPage() const;

返回值：返回所选打印范围内的结束页号码。

说明：
在调用DoModal之后调用此函数来检取所选打印范围内的结束页号码。

请参阅：
CPrintDialog::GetFromPage, CPrintDialog::PrintRange


 CPrintDialog::PrintAll

BOOL PrintAll() const;

返回值：
如果文档中的所有页都要打印则返回非零值；否则返回0。

说明：
在调用DoModal之后调用此函数来确定是否要文档中的所有页。

请参阅：
CPrintDialog::PrintRange, CPrintDialog::PrintSelection


 CPrintDialog::PrintCollate

BOOL PrintCollate() const;

返回值：
如果用户选择了对话框中的整理选择框，则返回非零值；否则返回0。

说明：
在调用DoModal之后调用此函数来确定打印机是否要整理所有要打印的文档备份。

请参阅：CPrintDialog::GetCopies


 CPrintDialog::PrintRange

BOOL PrintRange() const;

返回值：
如果文档中只有某一个范围的页要打印，则返回非零值；否则返回0。

说明：
在调用DoModal之后调用此函数来确定是否只打印文档中某一范围内的页。

请参阅：
CPrintDialog::PrintAll, CPrintDialog::PrintSelection, CPrintDialog::GetFromPage, CPrintDialog::GetToPage


 CPrintDialog::PrintSelection

BOOL PrintSelection() const;

返回值：
如果只要打印所选的项，则返回非零值；否则返回0。

说明：
在调用DoModal之后调用此函数来确定是否只要打印当前所选的项。

请参阅：
CPrintDialog::PrintRange, CPrintDialog::PrintAll


 CPrintDialog::m_pd

PRINTDLG& m_pd;

说明：
一个结构，它的成员保存了对话框对象的特征。在构造一个CPrintDialog对象之后，在调用DoModal之前，你可以使用m_pd来设置对话框的各个方面。有关m_pd结构的更多信息，请参见Win32 SDK文档。
如果要直接修改m_pd数据成员，你将重载任何缺省的行为。


 CPrintInfo

CPrintInfo没有基类。
CPrintInfo存储有关一次打印或打印预览作业的信息。每次选择Print或PrintPreview命令，框架就创建一个CPrintInfo对象，并在命令完成时删除此对象。CPrintInfo包含有关打印作业的一般信息，例如要打印的页范围，以及打印作业的当前状态，例如当前正打印的页。某些信息存放在一个相关联的CPrintInfo对象中；此对象中包含用户在Print对话框中输入的值。
在打印期间，一个CPrintInfo对象在框架和应用程序的视类之间传递，并用于在两者之间交换信息。例如，框架通过对CPrintInfo和m_nCurPage成员赋值，来通知视类要打印文档的哪一页；视类检取此值，并执行指定页的实际打印。
另一个例子就是文档的长度直到打印时也不知道的情况。在这种情况下，视类在每打印一页时都测试是否是文档的结尾了。当到达文档结尾时，视类将CPrintInfo的m_bContinuePrinting成员设置为FALSE，它通知框架停止打印循环。

CPrintInfo由“请参阅”中所列的CView的成员函数调用。

请参阅：
CView::OnBeginPrinting, CView::OnEndPrinting, CView::OnEndPrintPreview, CView::OnPrepareDC, CView::OnPreparePrinting, CView::OnPrint

CPrintInfo类成员

Data Members
m_bDocObject | 包含一个标志，该标志表明被打印的文档是否是一个DocObject
m_dwFlags | 指定DocObject的打印选择
m_nOffsetPage | 在一个组合DocObject打印作业中指定一个特别的DocObject的第一页的偏移
m_pPD | 包含一个指针，该指针指向用于Print对话框的CPrintInfo对象
m_bDirect | 包含一个标志，该标志表明是否直接打印这个文档（不显示Print对话框）
m_bPreview | 包含一个标志，该标志表明是否预览文档
m_bContinuePrinting | 包含一个标志，该标志表明框架是否要继续打印循环
m_nCurPage | 表明当前打印的页码m_NumPreviewPages表明在预览窗口中显示的页数；1或者2
m_lpUserData | 包含一个指针，该指针指向一个用户创建的结构
m_rectDraw | 指定一个用于定义当前可用页区的矩形
m_strPageDesc | 包含一个用于页码显示的格式字符串

Attributes
SetMinPage | 设置文档第一页的页码
SetMaxPage | 设置文档最后一页的页码
GetMinPage | 返回文档第一页的页码
GetMaxPage | 返回文档最后一页的页码
 | 返回在一次组合DocObject打印作业中被打印的DocObject项的第一页前面的页数
GetFromPage | 返回要打印的第一页的页码
GetToPage | 返回要打印的最后一页的页码


 CPrintInfo::GetFromPage

UINT GetFromPage() const;

返回值：要打印的第一页的页码。

说明：
此函数用来获取要打印的第一页的页码。这个值由用户在Print对话框中指定，存放在由m_pPD成员引用的CPrintInfo对象中。如果用户没有指定这个值，则缺省的是文档的第一页。

请参阅：CPrintInfo::m_nCurPage, CPrintInfo::m_pPD, CPrintInfo::GetToPage


 CPrintInfo::GetMaxPage

UINT GetMaxPage() const;

返回值：返回文档的最后一页的页码。

说明：
此函数用来获取文档的最后一页的页码。这个值存放在由m_pPD成员所引用的CPrintDialog对象中。

请参阅：
CPrintInfo::m_nCurPage, CPrintInfo::m_pPD, CPrintInfo::GetMinPage, CPrintInfo::SetMaxPage, CPrintInfo::SetMinPage


 CPrintInfo::GetMinPage

UINT GetMinPage() cost;

返回值：返回文档第一页的页码。

说明：
此函数用来获取文档第一页的页码。这个值存放在由m_pPD所引用的CPrintDialog对象中。

请参阅：
CPrintInfo::m_nCurPage, CPrintInfo::m_pPD, CPrintInfo::GetMaxPage, CPrintInfo::SetMaxPage, CPrintInfo::SetMinPage


 CPrintInfo::GetOffsetPage

UINT GetOffsetPage() const;

返回值：
返回在一次组合DocObject打印作业中被打印的DocObject项的第一页的前面的页数。

说明：
当从一个DocObject客户打印多个DocObject项时，此函数用来获取偏移。这个值由m_nOffsetPage成员引用。当要打印的是DocObject和其它活动文档时，文档的第一页将被编码为：m_nOffsetPage值＋1。只有在m_bDocObject的值为TRUE时，m_nOffsetPage成员才是有效的。

请参阅：CPrintInfo::m_nOffsetPage, CPrintInfo::m_bDocObject


 CPrintInfo::GetToPage

UINT GetToPage() const;

返回值：返回要打印的最后一页的页码。

说明：
此函数用来获取要打印的最后一页的页码。这个值是用户在Print对话框中指定的，并且它被保存在由m_pPD成员所引用的CPrintDialog对象中。如果用户没有指定这个值，则缺省值是文档的最后一页。

请参阅：CPrintInfo::m_nCurPage, CPrintInfo::m_pPD, CPrintInfo::GetFromPage


 CPrintInfo::SetMaxPage

void SetMaxPage( UINT nMaxPage );

参数：
nMaxPage 文档最后一页的页码。

说明：
此函数用来指定文档最后一页的页码。这个值保存在由m_pPD所引用的CPrintDialog对象中。如果文档的长度在打印之前是已知的，则从重载的CView::OnPreparePrinting中调用这个函数。如果文档的长度依赖于用户在Print对话框中的某个设置指定，则从你的重载的CView::OnBeginPrinting中调用这个函数。如果文档的长度直到打印时还是未知的，则使用m_bContinuePrinting成员来控制打印循环。

请参阅：
CPrintInfo::m_bContinuePrinting, CPrintInfo::m_nCurPage, CPrintInfo::m_pPD, CPrintInfo::GetMinPage, CPrintInfo::GetToPage, CPrintInfo::SetMinPage, CView::OnBeginPrinting, CView::OnPreparePrinting


 CPrintInfo::SetMinPage

void SetMinPage( UINT nMinPage );

参数：
nMinPage 文档的第一页的页码。

说明：
此成员函数用来指定文档的第一页的页码。通常页码开始于1。这个值被保存在由m_pPD成员所引用的CPrintDialog对象中。

请参阅：
CPrintDialog::m_nCurPage, CPrintDialog::m_pd, CPrintDialog::GetMaxPage, CPrintInfo::GetMinPage, CPrintInfo::SetMaxPage


 CPrintInfo::m_bContinuePrinting

说明：
此数据成员包含了一个标志，该标志用来表明框架是否继续进行打印循环。如果你正在进行打印时分页，则一旦已到达文件尾，即可在CView::OnPrepareDC的重载中设置该成员为FALSE。如果应用程序已经在打印作业开始时用SetMaxPage成员函数指定了文档的长度，则不必修改这个变量。m_bContinuePrinting成员是BOOL类型的公有变量。

请参阅：CPrintInfo::SetMaxPage, CView::OnPrepareDC


 CPrintInfo::m_bDirect

说明：
如果要省略Print对话框直接进行打印，则框架将此成员设置为TRUE；否则将其设置为FALSE。当应用程序从外壳进行打印，或打印是通过使用ID_FILE_PRINT_DIRECT命令ID进行时，通常Print对话框是被忽略的。
通常来说，你不会改变这个成员，但如果你要改变它，则在你的CView::OnPreparePrinting重载中调用CView::DoPreparePrinting之前改变它。

请参阅：CView::DoPreparePrinting, CView::OnPreparePrinting


 CPrintInfo::m_bDocObject

说明：
此成员中包含一个标志，该标志表明被打印的文档是否是一个DocObject。除非这个标志是TRUE，否则数据成员m_dwFlags和m_nOffsetPage是无效的。

请参阅：CPrintInfo::m_dwFlags, CPrintInfo::m_nOffsetPage


 CPrintInfo::m_bPreview

说明：
此成员包含一个标志，该标志表明文档是否正在预览。这个标志的值由框架根据用户执行的命令来设置。不为打印预览作业显示Print对话框。m_bPreview是一个BOOL类型的公有变量。

请参阅：CView::DoPreparePrinting, CView::OnPreparePrinting


 CPrintInfo::m_dwFlags

说明：
此成员包含一些标志的组合，这些标志指定了DocObject打印操作。只有当成员m_bDocObject是TRUE的时候才有效。
这些标志可以是下列值中的一个或几个：
PRINTFLAG_MAYBOTHERUSER
PRINTFLAG_PROMPTUSER
PRINTFLAG_USERMAYCHANGEPRINTER
PRINTFLAG_RECOMPOSETODEVICE
PRINTFLAG_DONTACTUALLYPRINT
PRINTFLAG_FORCEPROPERTIES
PRINTFLAG_PRINTTOFILE

请参阅：CPrintInfo::m_bDocObject, CPrintInfo::m_nOffsetPage


 CPrintInfo::m_lpUserData

说明：
此成员包含一个指针，该指针指向一个用户创建的结构。你可以用这个成员来保存那些你不想保存在你的应用程序的视类中的打印专用数据。m_lpUseData成员是LPVOID类型的公有变量。


 CPrintInfo::m_nCurPage

说明：
此成员包含当前页的页码。框架为文档的每一页调用CView::OnPripareDC函数，每次为这个成员指定一个不同的值；该成员的取值范围从GetFromPage返回的值到GetToPage返回的值，可以在重载的CView::OnPrepareDC和CView::OnPrint函数中使用这个成员来打印文档的指定页。
当预览方式第一次被激活时，框架读出此成员的值来确定初始时预览文档的哪一页。应用程序可在重载的CView::OnPreparePrinting中设置此成员的值，用来在进入预览方式时维护用户在文档中的当前位置。m_nCurPage成员是UINT类型的公有变量。

请参阅：
CPrintInfo::GetFromPage, CPrintInfo::GetToPage, CView::OnPrepareDC, CView::OnPreparePrinting, CView::OnPrint


 CPrintInfo::m_nNumPreviewPages

说明：
此成员包含了在预览模式下显示的页数，它可以是1或2。m_nNumPreviewPages成员是UINT类型的公有变量。

请参阅：CPrintInfo::m_strPageDesc


 CPrintInfo::m_nOffsetPage

说明：
此成员包含在一个组合的DocObject打印作业中，在一个特定的DocObject的第一页之前的页数。

请参阅：CPrintInfo::m_bDocObject, CPrintInfo::m_dwFlags


 CPrintInfo::m_pPD

说明：
此成员中包含一个指向CPrintDialog对象的指针，这个CPrintDialog对象用于为打印作业显示Print对话框。m_pPD成员是一个声明为CPrintDialog指针的公有变量。

请参阅：CPrintDialog


 CPrintInfo::m_rectDraw

说明：
此成员指定页的可用绘制区域的逻辑坐标。你也许想要在重载的CView::OnPrint中引用该成员。应用程序可以使用这个成员来记录当打印完头、尾等之后留下的可用区域。

请参阅：CView::OnPrint


 CPrintInfo::m_strPageDesc

说明：
此成员中包含了一个在打印预览期间用来显示页码的格式字符串；这个字符串由两个子串组成，一个用于单页显示，一个用于双页显示，每个子串用一个“\n”字符结尾。框架用“Page %u\nPages %u-%u\n”作为缺省值。如果应用程序想要为页码指定一种不同的格式，则可在CView::OnPreparePrinting的重载中指定一个格式字符串。m_strPageDesc成员是CString类型的公有变量。

请参阅：CView::OnPreparePrinting


 CProgressCtrl

CObject
└CCmdTarget
└CWnd
└CProgressCtrl

“进度条控件”是一个窗口，应用程序可以使用这个窗口来表明一个冗长操作的进度。它由一个从左到右，用系统高亮色逐渐填充的矩形组成。
CProgressCtrl类提供了Windows通用进度条控件的机能。这个控件（也就是CProgressCtrl类）只有对运行在Windows 95和Windows NT 3.51或更高版本下的程序才是有效的。
进度条控件具有一个范围和一个当前位置。范围代表了操作的整个期间，当前位置代表了应用程序为完成操作已经做完的部分。窗口进程用范围和当前位置来确定用高亮色填充进度条的百分比，以及确定在进度条中所显示的文本（如果有的话）。由于范围和当前位置值是用有符号整数表示的，所以可能的当前位置值的范围是从-217483648到217483647。
#include <afxcmn.h>

CProgressCtrl类成员

Construction
CProgressCtrl | 构造一个CProgressCtrl对象
Create | 创建一个进度条控件并将它与一个CProgressCtrl对象连接

Attributes
SetRange | 为进度条控件设置范围的最小值和最大值，并重画进度条来反映新的范围
SetRange32 | 为进度条控件设置范围的最小值和最大值，并重画进度条来反映新的范围
GetRange | 获取进度条控件范围的下限和上限
GetPos | 获取进度条的当前位置
SetPos | 设置进度条的当前位置并重画进度条来反映新的位置
OffsetPos | 用一个指定的增量来增加进度条控件的当前位置，并重画此进度条来反映新的位置
SetStep | 为一个进度条控件指定每一步的增量

Operations
StepIt 用每一步的增量（参见SetStep）来增加一个进度条控件的当前位置，并重画此进度条来反映新的位置


 CProgressCtrl::CProgressCtrl

CProgressCtrl();

说明：
此成员函数用来构造一个CProgressCtrl对象。
在构造一个CProgressCtrl对象后，调用CProgressCtrl::Create来创建进度条控件。

请参阅：CProgressCtrl::Create


 CProgressCtrl::Create

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID);

返回值：如果CProgressCtrl对象被成功创建则返回TRUE；否则返回FALSE。

参数：
dwStyle指定进度条控件的风格。除了Windows风格的任何组合，附加下列进度条控件风格：
· | PBS_VERTICAL | 垂直显示进度信息，从顶到底。没有这个标志，进度条控件从左到右水平显示。
· | PBS_SMOOTH | 逐渐显示，平滑地填充进度条控件。没有这个标志，控件将用块来填充。
rect | 指定进度条控件的尺寸和位置。它可以是一个CRect对象或者是一个RECT结构。由于此控件必须是一个子窗口，所以指定的坐标是相对于pParentWnd的客户区的。
pParentWind | 指定进度条控件的父窗口，通常是一个CDialog。它不能是NULL。
nID | 指定进度条控件的ID。

说明：
你可以分两步来构造一个CProgressCtrl对象。首先调用构造函数来创建CProgressCtrl对象；然后调用Create来创建进度条控件。

请参阅：CProgressCtrl::CProgressCtrl


 CProgressCtrl::GetPos

int GetPos();

返回值：返回进度条控件的位置。

说明：
此成员函数用来检取进度条的当前位置。进度条的这个位置不是它在屏幕上的物理位置，而是在SetRange中的上限和下限范围之间的位置。

请参阅：CProgressCtrl::SetPos


 CProgressCtrl::GetRange

void GetRange( int& nLower, int& nUpper );

参数：
nLower | 一个指向整数的引用，它用来接收进度条控件的下限。
nUpper | 一个指向整数的引用，它用来接收进度条控件的上限。

说明：
此成员函数用来获取当前进度条控件的上限和下限，或者说是范围。此函数将上限和下限值拷贝到由nLower和nUpper各自引用的整数中。

请参阅：PBRANGE, PBM_GETRANGE


 CProgressCtrl::OffsetPos

int OffsetPos( int nPos );

返回值：返回进度条控件的早先的位置。

参数：
nPos 用来增加位置的数量。

说明：
此函数用由nPos指定的增量来增加进度条控件的当前位置，并且重画此进度条来反映新的位置。

请参阅：
CProgressCtrl::SetPos, CProgressCtrl::SetRange, CProgressCtrl::StepIt


 CProgressCtrl::SetPos

int SetPos( int nPos );

返回值：返回进度条控件的早先的位置。

参数：
nPos 进度条控件的新位置。

说明：
此成员函数根据nPos指定的位置来设置进度条控件的当前位置，并重画此进度条来反映新的位置。
进度条的这个位置不是它在屏幕上的物理位置，而是在SetRange中的上限和下限范围之间的位置。

请参阅：
CProgressCtrl::OffsetPos, CProgressCtrl::SetRange, CProgressCtrl::StepIt


 CProgressCtrl::SetRange

void SetRange( short nLower, short nUpper );
void SetRange32( int nLower, int nUpper );

参数：
nLower | 指定范围的下限（缺省值是零）。
nUpper | 指定范围的上限（缺省值是100）。

说明：
此函数用来设置进度条控件范围的上限和下限，并重画此进度条来反映新的范围。成员函数SetRange32为进度条设置32位的范围。

请参阅：
CProgressCtrl::OffsetPos, CProgressCtrl::SetPos, CProgressCtrl::StepIt


 CProgressCtrl::SetStep

int SetStep( int nStep );

返回值：返回原来的步增量。

参数：
nStep 新的步增量。

说明：
此函数为进度条控件指定步增量。步增量就是每调用一次CProgressCtrl::StepIt所增加进度条控件的当前位置的数量。缺省的步增量是10。

请参阅：
CProgressCtrl::OffsetPos, CProgressCtrl::SetPos, CProgressCtrl::StepIt


 CProgressCtrl::StepIt

int StepIt();

返回值：返回进度条控件的原来的位置。

说明：
此函数用步增量来增加一个进度条控件的当前位置。该步增量由成员函数CProgressCtrl::SetStep来设定。

请参阅：
CProgressCtrl::SetPos, CProgressCtrl::SetRange, CProgressCtrl::SetStep


 CPropertyPage

CObject
└CCmdTarget
└CWnd
└CDialog
└CPropertyPage

类CPropertyPage的对象表示一张属性表的各页，或者说是被看作是标签对话框。同标准对话框一样，要为属性表中每一页从CPropertyPage类中派生一个新类。要使用CPropertyPage派生对象，首先要创建一个CPropertySheet对象，然后为属性表中的每一页创建一个对象。为表中的每一页调用CPropertySheet::AddPage函数，然后对一个模式属性表调用CPropertySheet::DoModal函数来显示此属性表。对一个非模式属性表调用CPropertySheet::Create来显示此属性表。
你可以创建一种被称为向导的标签对话框，这种对话框包括一个属性表，该表有一系列属性页来引导用户进行一项操作的每一个步骤，比如说设置一个设备或创建一个时事通讯。在一个向导类型的标签对话框中属性页没有标签，每次只有一个属性页是可见的。而且，一个向导类型的对话框没有OK和Apply Now按钮，代替它们的是一个Back按钮，一个Next或Finish按钮和一个Cancel按钮。
如果要获取更多有关建立一个作为向导的属性表的信息，请参见CPropertySheet::SetWizard- Mode。要获取更多有关使用CPropertyPage对象的信息，请参见“Visual C++程序员指南”中的文章“属性表”。
#include <afxdlgs.h>
请参阅：
CPropertySheet, CDialog, CPropertySheet::SetWizardMode

CPropertyPage类成员

数据成员
m_psp Windows PROPSHEETPAGE结构。提供对基本属性页参数的访问

构造
CPropertyPage | 构造有关CPropertyPage对象
Construct | 构造有关CPropertyPage对象。如果你想指定在运行时的参数，或者是你使用的是数组，就使用Construct函数

操作
CancelToClose | 将OK按钮改变为读取Close，并在一个模式属性表的页中进行了一次不可恢复的改变之后，使Cancel按钮无效
SetModified | 用来激活一个Apply Now按钮，或使它成为不活动
QuerySiblings | 向前传送消息到属性表的每一页

重载
OnCancel | 当单击Cancel按钮时由框架调用
OnKillActive | 当当前页不再是活动页时由框架调用。在此执行数据确认
OnOK | 当OK，Apply Now或Close按钮被单击时由框架调用
OnSetActive | 当某页成为活动页时由框架调用
OnApply | 当Apply Now按钮被单击时由框架调用
OnReset | 当Cancel按钮被单击时由框架调用
OnQueryCancel | 当Cancel按钮被单击，并在发生取消操作之前由框架调用
OnWizardBack | 在使用一个向导类型的属性表的情况下，当Back按钮被单击时由框架调用
OnWizardNext | 在使用一个向导类型的属性表的情况下，当Next按钮被单击时由框架调用
OnWizardFinish | 在使用一个向导类型的属性表的情况下，当Finish按钮被单击时由框架调用


 CPropertyPage::CancelToClose

void CancelToClose();

说明：
在对一个模式属性表的页中的数据进行了不可恢复的改变之后，调用此函数。
此函数将把OK按钮改变为Close按钮，并使Cancel按钮无效。这种改变警告用户，刚才所作的改变是永久性的，并且这种修改不能被取消。
在一个无模式属性表中，CancelToClose成员函数不做任何事情，因为一个无模式属性表不会有一个缺省的Cancel按钮。

请参阅：
CPropertyPage::OnKillActive, CPropertyPage::SetModified


 CPropertyPage::Construct

void Construct( UINT nIDTemplate, UINT nIDCaption = 0 );
void Construct( LPCTSTR lpszTemplateName, UINT nIDCaption = 0 );

参数：
nIDTemplate | 用于这个页的模板ID。
nIDCaption | 用来放在此页的标签中的名字的ID。如果是0，则将从对话框模板中取出用于此页的名字。
lpszTemplateName | 包含一个空结尾的字符串，该字符串是模板资源的名字。

说明：
此成员函数用来构造一个CPropertyPage对象。在满足了下列所有条件后，此对象会被显示：
· | 已经用CPropertySheet::AddPage将此页添加到一个属性表中。
· | 已经调用了属性表的DoModal或Create函数。
· | 用户已经选择了（调整到）这一页。
如果没有调用另一个构造函数，则调用Construct。Construct成员函数是灵活的，因为你可以让参数为空，然后在你的代码中的任何地方来指定多个参数和构造。
当你是在处理数组时，你就必须使用Construct，而且你必须为数组的每一个成员调用Construct，以使数据成员可以被分配适当的值。

请参阅：
CPropertyPage::CPropertyPage, CPropertySheet::DoModal, CPropertySheet::AddPage


 CPropertyPage::CPropertyPage

CPropertyPage();
CPropertyPage( UINT nIDTemplate, UINT nIDCaption = 0 );
CPropertyPage( LPCTSTR lpszTemplateName, UINT nIDCaption = 0 );

参数：
nIDTemplate | 用于此页的模板ID。
nIDCaption | 用来放在此页的标签中的名字ID。如果是0，则名字将从此页的对话框模板中取得。
lpszTemplateName | 指向一个字符串，该字符串包含了用于此页的模板的名字。不可以是NULL。

说明：
此函数用来构造一个CPropertyPage对象。在满足下列条件之后，此对象将被显示：
· | 已经用CPropertySheet::AddPage将此页添加到一个属性表中。
· | 已经调用了属性表的DoModal或Create函数。
· | 用户已经选择了（调整到）这一页。
如果你有多个参数（例如，你正使用数组），则使用CPropertySheet::Construct来代替CPropertyPage。

请参阅：
CPropertySheet::Create, CPropertySheet::DoModal, CPropertySheet::AddPage, CPropertyPage::Construct


 CPropertyPage::OnApply

virtual BOOL OnApply();

返回值：
如果改变被接受则返回非零值；否则返回0。

说明：
当用户选择OK或Apply Now按钮后，框架调用此函数。当框架调用此函数时，对属性表中的所有属性页做的改变都被接受了，属性表保持焦点，OnApply返回TRUE（值1）。在框架可以调用OnApply之前，你必须已经调用了SetModified并将它的参数设置为TRUE。这将会使得在用户一进行有关属性页的改变时就激活Apply Now按钮。
重载这个函数来指定当用户单击Apply Now按钮时，你的程序会进行什么动作。在重载时，函数应该返回TRUE来表示接受改变，返回FALSE来表示禁止改变。
OnApply的缺省实现调用OnOK。
如果要获取更多有关当用户在一个属性表中按下Apply Now或OK按钮时发送的通知消息的信息，请参见Win32文档中的PSN_APPLY。

请参阅：
CPropertyPage::SetModified, CPropertyPage::OnOK


 CPropertyPage::OnCancel

virtual void OnCancel();

说明：
当选择Cancel按钮时，框架调用此成员函数。重载这个成员函数来执行Cancel按钮的动作。缺省的实现忽略所做的任何改变。

请参阅：
CPropertyPage::OnApply, CDialog::OnCancel, CPropertyPage::OnOK


 CPropertyPage::OnKillActive

virtual BOOL OnKillActive();

返回值：
如果数据被成功更新则返回非零值；否则返回0。

说明：
当页不再是活动页时，框架调用此函数。重载这个成员函数来执行指定的数据确认任务。
此成员函数的缺省实现将对属性页中的控件所做的设置拷贝到属性页的成员变量中。如果数据没有被成功地更新，则属于一个对话框数据确认（DDV）错误，该页保持焦点。
在此成员函数成功返回之后，框架将调用此页的OnOK函数。

请参阅：
CWnd::UpdateData, CPropertyPage::OnOK, CPropertyPage::OnSetActive


 CPropertyPage::OnOK

virtual void OnOK();

说明：
当用户选择了OK或Apply Now按钮时，在框架调用了OnKillActive之后，框架立即调用此函数。重载这个成员函数来实现当用户解散整个属性表时，执行对当前活动页指定的行为。
此成员函数的缺省实现将该页标记为“清除（clear）”来反映数据已经在OnKillActive函数中更新了。

请参阅：
CDialog::OnOK, CPropertyPage::OnKillActive


 CPropertyPage::OnQueryCancel

virtual BOOL OnQueryCancel();

返回值：
如果禁止取消操作则返回FALSE；如果允许取消操作则返回TRUE。

说明：
当用户单击Cancel时，并在取消动作发生之前，框架调用此成员函数。
重载此成员函数来指定当用户单击Cancel按钮时程序要做的动作。
OnQueryCancel的缺省实现返回TRUE。


 CPropertyPage::OnReset

virtual void OnReset();

说明：
当用户选择Cancel按钮时，可以调用此成员函数。当框架调用此函数时，用户向前对所有属性页所做的选择Apply Now按钮确认的改变都将被放弃，而属性表保持焦点。
重载这个成员函数来指定当用户单击Cancel按钮时程序将执行的动作。
OnReset的缺省实现不做任何事情。

请参阅：
CPropertyPage::OnCancel, CPropertyPage::OnApply


 CPropertyPage::OnSetActive

virtual BOOL OnSetActive();

返回值：
如果成功地激活了此页则返回非零值；否则返回0。

说明：
当用户选择了此页并将其变为活动页时，框架调用这个成员函数。重载此成员函数来执行当一个页被激活时要执行的任务。你的关于这个成员函数的重载应该在做任何其它处理之前调用缺省的版本。
缺省的实现为该页创建窗口（如果在此之前没有创建的话），并使它成为活动页。

请参阅：CPropertyPage::OnKillActive


 CPropertyPage::OnWizardBack

virtual LRESULT OnWizardBack();

返回值：
如果自动前进到下一页，则返回0；如果禁止页改变，则返回-1。如果所到的页是除下一页之外的其它页，则返回要显示的对话框的标识符。

说明：
当用户在一个向导中单击Back按钮时，框架调用这个成员函数。
重载此成员函数来指定当按下Back按钮时用户必须做的一些操作。
要获取更多有关如何创建一个向导类型的属性表的信息，请参见CPropertySheet::SetWizardMode。

请参阅：CPropertySheet::SetWizardMode


 CPropertyPage::OnWizardFinish

virtual BOOL OnWizardFinish();

返回值：
当向导完成时如果属性表被销毁，则返回非零值；否则返回零。

说明：
当用户在一个向导中单击Finish按钮时框架调用此成员函数。当框架调用这个成员函数时，在Finish按钮被按下并且OnWizardFinish返回TRUE（一个非零值）时，属性表被销毁。
重载这个函数来指定当Finish按钮被按下时，用户必须执行的一些动作。当重载这个函数时，返回FALSE来禁止属性表被销毁。
要获取更多有关当用户在一个向导属性表中按下Finish按钮时发送的通知消息的信息，请参见Win32文档中的PSN_WIZFINISH。
如果要获取更多关于如何创建一个向导类型的属性表的信息，请参见CPropertySheet::Set- WizardMode。

请参阅：CPropertyPage::SetWizardMode


 CPropertyPage::OnWizardNext

virtual LRESULT OnWizardNext();

返回值：
如果自动前进到下一页，则返回0；如果禁止页改变，则返回-1。如果所到的页是除下一页之外的其它页，则返回要显示的对话框的标识符。

说明：
当用户在一个向导中单击Next按钮时，框架调用这个成员函数。
重载这个成员函数来指定当Next按钮被按下时用户必须做的某些动作。
如果要获取更多关于如何创建一个向导类型的属性表的信息，请参见CPropertySheet::SetWizardMode。

请参阅：CPropertySheet::SetWizardMode


 CPropertyPage::QuerySiblings

LRESULT QuerySiblings( WPARAM wParam, LPARAM lParam );

返回值：
如果在属性表中的所有页都返回0，则函数返回0；否则，返回属性表中的每一页返回的非零值。

参数：
wParam | 指定附加的与消息相关的信息。
lParam | 指定附加的与消息相关的信息。

说明：
此成员函数用来将一个消息向前传递给属性表中的每一页。如果有一个页返回一个非零值，则属性表不再将消息发送给后续页。


 CPropertyPage::SetModified

void SetModified( BOOL bChanged = TRUE );

参数：
bChanged 如果是TRUE，则表明在最后一次应用后属性页的设置被修改了；如果是FALSE，则表明属性页的设置被应用或被忽略。

说明：
此成员函数用来使Apply Now按钮有效或无效，这要根据属性页中的设置是否应该被应用到适当的外部对象。
框架知道哪一页是“脏的”，就是那些你对它们调用了SetModified(TRUE)的属性页。如果你对某一属性页调用了SetModified(TRUE)，则Apply Now按钮将总是有效的。当你对某一属性页调用了SetModified(FALSE)时，则Apply Now按钮将总是无效的，但是只有在没有任何一个属性页是“脏的”的时候。

请参阅：CPropertyPage::CancelToClose


 CPropertyPage::m_psp

说明：
m_psp是一个结构，它的成员保存了PROPSHEETPAGE的特征。在一个属性页被构造之后，使用这个结构来初始化该属性页的外观。
如果要获取更多关于这个结构的消息，包括它的成员的列表，请参见“WindowsSDK程序员参考”中的PROPSHEETPAGE。

请参阅：CPropertySheet, PROPSHEETPAGE


 CPropertyPageEx

CObject
└CCmdTarget
└CWnd
└CDialog
└CPropertyPage
└CPropertyPageEx

CPropertyPageEx支持在Windows 98和Windows NT 5中引进的扩展的PROPSHEETPAGE结构。此结构中包含了附加的标志和成员，它们支持下列特征：
·一个可以容纳标题和子标题的宽的页眉区。
在你的属性页对象中自动显示新的页眉，调用CPropertyPageEx::Contstruct或CpropertyPageEx::CPropertySheetEx来为标题和子标题传递有效的值。
在其它的方面，CPropertyPageEx与它的基类CPropertyPage具有一样的行为。
请参阅：CPropertySheet, CPropertySheetEx

CPropertyPageEx类成员

构造
CPropertyPageEx | 构造一个CPropertyPageEx对象
Construct | 构造一个CPropertyPageEx对象


 CPropertyPageEx::Construct

void Construct( UINT nIDTemplate,
UINT nIDCaption = 0,
UINT nIDHeaderTitlt =0,
UINT nIDHeaderSubTitle = 0
);
void Construct( LPCTSTR lpszTemplateName,
UINT nIDCaption = 0,
UINT nIDHeaderTitle = 0,
UINT nIDHeaderSubTitle = 0
)

参数：
nIDTemplate | 用于此页的模板的ID。
lpszTemplateName | 指向一个字符串的指针，该字符串包含用于此页的模板的名字。
nIDCaption | 放在此页的标签中的名字的ID。如果是0，则名字从此页的对话框模板中取出。其缺省值为0。
nIDHeaderTitle | 要被放在此属性页的页眉区的标题位置的名字的ID。缺省值为0。
nIDHeaderSubTile | 要被放在此属性页的页眉区的子标题位置的名字的ID。缺省值为0。

说明：
此成员函数用来构造一个CPropertyPageEx对象。
如果你想要在运行时指定你的参数，或你要处理数组，请使用Construct。

请参阅：
CPropertyPage::Construct, CPropertyPageEx::CPropertyPageEx


 CPropertyPageEx::CPropertyPageEx

CPropertyPageEx();
CPropertyPageEx( UINT nIDTemplate,
UINT nIDCaption = 0,
UINT nIDHeaderTitle = 0,
UINT nIDHeaderSubTitle = 0
);
CPropertyPageEx( LPCTSTR lpszTemplateName,
UINT nIDCaption = 0,
UINT nIDHeaderTitle = 0,
UINT nIDHeaderSubTitle = 0
)

参数：
nIDTemplate | 用于此页的模板的ID。
nIDCaption | 放在此页标签中的名字的ID。如果是0，则名字从此页的对话框模板中取出。
nIDHeaderTitle | 要被放在此属性页的页眉区的标题位置的名字的ID。
nIDHeaderSubTile | 要被放在此属性页的页眉区的子标题位置的名字的ID。缺省值为0。
lpszTemplateName | 指向一个字符串的指针，该字符串包含用于此页的模板的名字。

说明：
此成员函数用来构造一个CPropertyPageEx对象。在满足了下列所有条件后，此对象会被显示：
· | 已经用CPropertyExSheet::AddPage将此页添加到一个属性表中。
· | 已经调用了属性表的DoModal或Create函数。
· | 用户已经选择了（调整到）这一页。
如果你有多个参数（例如，你使用了一个数组），请使用Constrcuct来代替CPropertyPageEx。

请参阅：CPropertyPage::CPropertyPage


 CPropertySheet

CObject
└CCmdTarget
└CWnd
└CPropertySheet

CPropertySheet类对象表示属性表，或者说是标签对话框。一个属性表由一个CPropertySheet对象和一个或多个CPropertyPage对象构成。一个属性表由框架来显示，就象是一个具有一系列标签索引的窗口。用户通过这些标签索引来选择当前的页，和一块用于当前所选页的区域。
虽然CPropertySheet不是从CDialog派生而来的，但是管理一个CPropertySheet对象类似于管理一个CDialog对象。例如，一个属性表的创建需要分两部分构造：调用构造函数，然后对模式属性表调用DoModal，或对非模式属性表调用Create。CPropertySheete 有两种类型的构造函数：CPropertySheet::Construct和CPropertySheet::CPropertySheet。
在一个CPropertySheet对象和某个外部对象之间交换数据，类似于与一个CDialog对象交换数据。两者之间的重要差别是：一个属性表的设置通常是CPropertyPage对象的成员变量，而不是CPropertySheet对象本身。
你可以创建一种被称为向导的标签对话框，这种对话框包括一个属性表，该表有一系列属性页来引导用户进行一项操作的每一个步骤，比如说设置一个设备或创建一个时事通讯。在一个向导类型的标签对话框中属性页没有标签，每次只有一个属性页是可见的。而且，一个向导类型的对话框没有OK和Apply Now按钮，代替它们的是一个Back按钮，一个Next或Finish按钮和一个Cancel按钮。
要创建一个向导类型的对话框，其步骤与创建一个标准的属性表的步骤是一样的，但是要在调用DoModal之前调用SetWizardMode。为了使向导按钮有效，调用SetWizardButtons，使用标志来定制它们的功能和外观。为了使Finish按钮有效，在用户完成了在向导的最后一页中的动作之后调用SetFinishText。
#include <afxdlgs.h>

CPropertySheet类成员

数据成员
m_psh Windows PROPSHEETHEADER结构。提供对基本属性表参数的访问

构造
CPropertySheet | 构造一个CPropertySheet对象
Construct | 构造一个CPropertySheet对象

属性
GetActiveIndex | 获取属性表的活动页的索引
GetPageIndex | 获取属性表指定页的索引
GetPageCount | 获取属性表中的页数
GetPage | 获取指向指定页的指针
GetActivePage | 返回活动页对象
SetActivePage | 可设计地设置活动页对象
SetTitle | 设置属性表的标题
GetTabControl | 获取一个指向一个标签控件的指针
SetFinishText | 设置Finish按钮的文本
SetWizardButtons | 使向导按钮有效
SetWizardMode | 使向导模式有效
EnableStackedTabs | 代码属性表是使用堆叠标签还是滚动标签

操作
DoModal | 显示一个模式属性表
Create | 显示一个无模式属性表
AddPage | 向属性表中添加一个页
RemovePage | 从属性表中移去一页
PressButton | 在一个属性表中模拟对指定按钮的选择
EndDialog | 终止属性表


 CPropertySheet::AddPage

void Addpage( CPropertyPage *pPage );

参数：
pPage 指向要被添加到属性表中去的页。不能是NULL。

说明：
此成员函数用来将所提供的页添加到属性表中，并使它具有最右边的标签。此函数按你所希望的从左至右的顺序来添加页。
AddPage将CPropertyPage对象添加到CPropertySheet对象的页列表中，但是并不为这些页实际地创建窗口。直到用户选择了一页，框架才为此页创建窗口。
当你用AddPage来添加一个属性页时，CPropertySheet就是CPropertyPage的父。为了获得从属性页对属性表的访问，可以调用CWnd::GetParent。
如果你在显示属性页之后调用AddPage，则标签行将反映新添加的页。

请参阅：CPropertySheet::RemovePage


 CPropertySheet::Construct

void Construct( UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0 ):
void Construct( LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0 );

参数：
nIDCaption | 用于属性表的标题的ID。
pParentWnd | 指向此属性表的父窗口的指针。如果是NULL，则其父窗口就是应用程序的主窗口。
iSelectPage | 最初在最顶上的页的索引。缺省值是添加到表中的第一页的索引。
pszCaption | 指向一个字符串的指针，该字符串包含了用于属性表的标题。不能是NULL。

说明：
此成员函数用来构造一个CPropertySheet对象。如果还没有调用一个类构造函数，则调用此成员函数。例如，当你声明或分配CPropertySheet对象数组时，就调用Construct。在有数组的情况下，你必须为数组中的每一个成员调用Construct。

示例：
下面的示例说明了在什么情况下你要调用Construct。
int i;
CPropertySheet grpropsheet[4];
CPropertySheet someSheet; // 不需要为它调用Construct。
UINT rgID[4] = {IDD_SHEET1, IDD_SHEET2, IDD_SHEET3, IDD_SHEET4};
for(i = 0; i < 4; i++)
grpropsheet[i].Construct(rgID[i]);

请参阅：
CPropertySheet::CPropertySheet, CPropertySheet::DoModal, CPropertySheet::Create


 CPropertySheet::CPropertySheet

CPropertySheet();
CPropertySheet( UINT nIDCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0 );
CPropertySheet( LPCTSTR pszCaption, CWnd* pParentWnd = NULL, UINT iSelectPage = 0 );

参数：
nIDCaption | 用于属性表的标题的ID。
pParentWnd | 指向此属性表的父窗口的指针。如果是NULL，则其父窗口就是应用程序的主窗口。
iSelectPage | 最初在最顶上的页的索引。缺省值是添加到表中的第一页的索引。
pszCaption | 指向一个字符串的指针，该字符串包含了用于属性表的标题。不能是NULL。

说明：
此函数用来构造一个CPropertySheet对象。要显示此CPropertySheet，调用DoModal或Create。第一个参数中包含的字符串将被放置在属性表的标题条中。
如果你有多个参数（例如，你使用的是数组），则使用Construct来代替CPropertySheet。

请参阅：
CPropertySheet::Construct, CPropertySheet::DoModal, CPropertySheet::Create, CPropertyPage


 CPropertySheet::Create

BOOL Create( CWnd* pParentWnd = NULL, DWORD dwStyle = (DWORD)-1, DWORD dwExStyle = 0 );

返回值：
如果成功地创建了属性表则返回非零值；否则返回0。

参数：
pParentWnd | 指向一个父窗口。如果是NULL，则父是桌面。
dwStyle | 属性表窗口的风格。要获取可用风格的完整列表，参见“Windows风格”。
dwExStyle | 属性表的扩展窗口风格。要获取可用风格的完整列表，参见“扩展的窗口风格”。

说明：
此成员函数用来显示一个无模式的属性表。可以在构造函数的内部调用Create，也可以在激活构造函数之后调用它。
当传递给参数dwStyle的值是-1时，表示的是缺省风格，这种风格实际是：
WS_SYSMENU | WS_POPUP | WS_CAPTION | DS_MODALFRAME | DS_CONTEXT_HELP | WS_VISIBLE。
当传递给参数dwExStyle的值是0时，表示是缺省的扩展风格，实际是：WS_EX_DLGMODALFRAME。
在创建属性表之后，Create成员函数立即返回。要销毁这个属性表，可以调用CWnd::DestroyWindow。
调用Create来显示的无模式属性表，没有象模式属性表那样的OK，Cancel，ApplyNow和Help按钮。必须由用户来创建所需要的按钮。
要显示一个模式属性表，可以调用DoModal。

请参阅：
CDialog::Create, CPropertySheet::DoModal


 CPropertySheet::DoModal

virtual int DoModal();

返回值：
如果函数成功则返回IDOK或IDCANCEL；否则返回0或-1。如果此属性表是作为一个向导（参见SetWizardMode）建立的，DoModal返回ID_WIZFINISH或IDCANCEL。

说明：
此成员函数用来显示一个模式属性表。其返回值对应于用来关闭属性表的控件的ID。此函数返回后，Windows响应这个属性表，所有的属性页都会被销毁。而这些对象本身仍然存在。通常，你将在DoModal返回IDOK之后从CPropertyPage对象检取数据。
要显示一个无模式属性表，请调用Create来代替此函数。
注意：
在一个属性页被第一次从它相应的对话框资源创建时，它有可能引发一个第一次机会（first-chance）异常。这是在创建此页之前属性页将对话框资源的风格改变成了所需的风格的结果。因为资源通常来说是只读的，所以这导致了一个异常。这个异常由系统处理，系统会自动拷贝修改后的资源。这样，第一次机会（first-chance）异常就被忽略了。
由于这个异常必须由操作系统来处理，所以不要用一个C++ try/catch块来隐藏调用CPropertySheet::DoModal，因为在一个C++ try/catch块中catch会处理所有的异常，比如，catch(...)。它将处理那些属于操作系统的异常，这将导致不可预料的行为发生。但是，通过指定异常类型或结构化异常处理来处理C++异常就是安全的，在结构化异常处理中，访问非法异常被传递给操作系统。

请参阅：
CDialog::DoModal, CPropertySheet::Create


 CPropertySheet::EnableStackedTabs

void EnableStackedTabs( BOOL bStacked );

参数：
bStacked 表明在属性表中堆叠式标签是否是有效的。通过设置bStacked为FALSE，可以使堆叠式行标签无效。

说明：
此成员函数用来表明在一个属性表中是否使用堆叠式标签行。缺省的，如果一个属性表有很多标签，它们不能在属性表的宽度中按一个单行放下，则这些标签将按多行堆叠。要使用滚动标签来代替堆叠标签，请在调用DoModal或Create之前将bStacked设置为FALSE来调用EnableStackedTabs。
当你创建一个模式或无模式的属性表时，你必须调用EnableStackedTabs。为了在一个CPropertySheet派生类中混合这种风格，请为WM_CREATE写一个消息句柄。在CWnd::OnCreate的重载版本中，在调用基类实现之前调用EnableStackedTabs(FALSE)。

示例：
int CMyPropertySheet::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
// 设置为滚动标签风格
EnableStackedTabs(FALSE);
// 调用基类
if(CPropertySheet::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
return 0;
}


 CPropertySheet::EndDialog

void EndDialog( int nEndID );

参数：
nEndID 用来作为属性表的返回值的标识符。

说明：
此成员函数用来终止属性表。当按下OK，Cancel或Close按钮时，框架调用这个成员函数。如果发生了一个要改变此属性表的事件，则调用此成员函数。

请参阅：
CPropertyPage::OnOK, CPropertyPage::OnCancel, CWnd::DestroyWindow


 CPropertySheet::GetActiveIndex

int GetActiveIndex() const;

返回值：返回活动页的索引号。

说明：
此成员函数用来获取属性表窗口中的活动页的索引号，然后用这个返回的索引号作为GetPage的参数。

请参阅：
CPropertySheet::GetPage, CPropertySheet::GetActivePage


 CPropertySheet::GetActivePage

CPropertyPage* GetActivePage() const;

返回值：返回指向活动页的指针。

说明：
此成员函数用来获取属性表窗口中的活动页。使用这个函数可以对活动页执行某些动作。

请参阅：CPropertySheet::GetPage


 CPropertySheet::GetPage

CPropertyPage* GetPage( int nPage ) const;

返回值：返回指向nPage参数对应的页的指针。

参数：
nPage 所希望的页的索引，开始于0。其值必须是包含在0和属性表的页数之间。

说明：
此成员函数返回一个指向此属性表中的指定页的指针。

请参阅：
CPropertySheet::AddPage, CPropertySheet::GetActivePage, CPropertySheet::GetPageCount, CPropertySheet::RemovePage, CPropertySheet::SetTitle


 CPropertySheet::GetPageCount

int GetPageCount();

返回值：返回属性表中的页数。

说明：
此成员函数用来确定当前在属性表中的页数。

请参阅：
CPropertySheet::GetPage, CPropertySheet::AddPage, CPropertySheet::RemovePage


 CPropertySheet::GetPageIndex

int GetPageIndex( CPropertyPage* pPage ) const;

返回值：返回一个页的索引号。

参数：
pPage 指向具有要找的索引的页。不能是NULL。

说明：
此成员函数用来获取指定页在属性表中的索引号。例如，为了使用SetActivePage或GetPage你要用GetPageIndex来获取页的索引。

请参阅：
CPropertySheet::SetActivePage, CPropertySheet::GetPage


 CPropertySheet::GetTabControl

CTabCtrl* GetTabControl();

返回值：返回一个指向标签控件的指针。

说明：
此成员函数用来获取一个指向标签控件的指针，并执行某些特定于这个标签控件的操作（也就是说，使用CTabCtrl中的任何API）。例如，如果你希望在初始化期间给每一个标签添加一个位图，你就可以调用这个函数。

请参阅：CTabCtrl::CTabCtrl


 CPropertySheet::PressButton

BOOL PressButton( int nButton );

返回值：如果成功则返回非零值；否则返回0。

参数：
nButton此参数表明被按下的按钮。它可以是下列值之一：
· | PSBTN_BACK | 选择的是Back按钮。
· | PSBTN_NEXT | 选择的是Next按钮。
· | PSBTN_FINISH | 选择的是Finish按钮。
· | PSBTN_OK | 选择的是OK按钮。
· | PSBTN_APPLYNOW | 选择的是Apply Now按钮。
· | PSBTN_CANCEL | 选择的是Cancel按钮。
· | PSBTN_HELP | 选择的是Help按钮。

说明：
此成员函数用来模拟在一个属性表中选择了某个指定的按钮。参见PSM_PRESSBUTTON可以获得更多有关Windows SDK Pressbutton消息的信息。


 CPropertySheet::RemovePage

void RemovePage( CPropertyPage *pPage );
void RemovePage( int nPage );

参数：
pPage | 指向要被从属性表中移走的页。不能是NULL。
nPage | 要被移走的页的索引。其值必须是包含在0和属性表中的页数减1之间。

说明：
此成员函数从属性表中移走一页，并销毁与此页相关的窗口。但CPropertySheet对象本身要直到自己的CPropertySheet窗口被关闭时才会被销毁。

请参阅：CPropertySheet::AddPage


 CPropertySheet::SetActivePage

BOOL SetActivePage( int nPage );
BOOL SetActivePage( CPropertyPage* pPage );

返回值：
如果成功地激活了属性表，则返回非零值；否则返回0。

参数：
nPage | 要设置的页的索引。它的值必须是包含在0和属性表中的页数减1之间。
pPage | 指向属性表中要设置的页。它不能是NULL。

说明：
此成员函数用来改变活动页。例如，如果一个用户对某一页的动作要导致另一页成为活动页，则可以使用SetActivePage。


 CPropertySheet::SetFinishText

void SetFinishText( LPCTSTR lpszText );

参数：
lpszText 指向要显示在Finish命令按钮上的文本。

说明：
此成员函数用来设置Finish命令按钮中的文本。调用SetFinishText来在Finish命令按钮上显示文本，并在用户完成了在向导的最后一页上的动作后隐藏Next和Back按钮。


 CPropertySheet::SetTitle

void SetTitle( LPCTSTR lpszText, UINT nStyle = 0 );

参数：
nStyle | 指定属性表标题的风格。此风格必须被指定为0或者是PSH_PROPTITLE。如果将风格设置为PSH_PROPTITLE，则单词“Properties for”显示在指定作为标题的文本的前面。
lpszText | 指向用来在属性表的标题条中作为标题的文本。

说明：
此成员函数用来指定属性表的标题（显示在一个框架窗口的标题条中的文本）。缺省的，一个属性表在属性表的构造函数中使用这个标题参数。

请参阅：
CPropertySheet::GetPage, CPropertySheet::GetActivePage


 CPropertySheet::SetWizardButtons

void SetWizardButtons( DWORD dwFlags );

参数：
dwFlags是一套用来定制向导按钮的功能和外观的标志。这个参数可以是下列值的组合：
· | PSWIZB_BACK | Back按钮。
· | PSWIZB_NEXT | Next按钮。
· | PSWIZB_FINISH | Finish按钮。
· | PSWIZB_DISABLEDFINISH | Disabled Finish按钮。

说明：
此成员函数用来使一个向导属性表中的Back，Next或Finish按钮有效或者无效。只有在对话框打开之后才调用SetWizardButtons；你不能在调用DoModal之前调用SetWizardButtons。通常来说，应该从CPropertySheet::OnSetActive调用SetWizardButtons。
如果你想改变在Finish按钮上的文本，或者想在用户完成向导的各个步骤之后隐藏Back和Next按钮，请调用SetFinishText。值得注意的是，Finish和Next是共享同一个按钮的。在某一个时间你可以显示Finish或Next按钮，但是不能同时显示它们两个。


 CPropertySheet::SetWizardMode

void SetWizardMode();

说明：
此成员函数用来建立一个作为向导的属性页。一个作为向导的属性页的一个关键特征就是：用户使用Next或Finish，Back和Cancel按钮而不是标签来导航。在调用DoModal之前调用SetWizardMode。在调用SetWizardMode之后，DoModal将返回ID_WIZFINISH（如果用户用Finish按钮来关闭）或者是IDCANCEL。SetWizardMode设置PSF_WIZARD标志。

示例：
CPropertySheet dlg;
CPropertyPage page1, page2;
dlg.AddPage(&page1);
dlg.AddPage(&page2);
dlg.SetWizardMode();
dlg.DoModal();

请参阅：CPropertySheet::DoModal


 CPropertySheet::m_psh

说明：
m_psh是一个结构，它的成员保存了PROPSHEETHEADER的特征。在一个属性表被构造之后，并在用DoModal成员函数来显示它之前，此结构可以用来初始化这个属性表的外观。例如，将m_psh的成员dwSize设置为你的属性表所要求的尺寸。
如果要获取更多有关这个结构的信息，包括它的成员列表，请参见“WindowsSDK程序员参考”中的PROPSHEETHEADER。

请参阅：CPropertySheet::DoModal


 CPropertySheetEx

CObject
└CCmdTarget
└CWnd
└CPropertySheet
└CPropertySheetEx

CPropertySheetEx支持在Windows 98和Windows NT 5中引进的PROPSHEETHEADER结构。该结构包含了附加的标志和成员，支持下面的特征：
·一个“水印”背景位图。
为了在你的属性表对象中自动显示这些新的图像，在调用CPropertySheetEx::Construct或CPropertySheetEx::CPropertySheetEx时要给位图和剪贴板图像传递有效的值。
在所有其它的方面，CPropertySheetEx具有与它的基类CPropertySheet相同的行为。
请参阅：CPropertyPage, CPropertyPageEx

CPropertySheetEx类成员

构造
CPropertySheetEx | 构造一个CPropertySheetEx对象
Construct | 构造一个CPropertySheetEx对象。由具有多个参数的属性页使用

数据成员
m_psh PROPSHEETHEADER结构，它的成员包含了要创建的属性表的特征

操作
AddPage 给属性表添加一个页


 CPropertySheetEx::AddPage

void AddPage(CPropertyPageEx* pPage );

参数：
pPage 指向一个要被添加到属性表中的页。不能是NULL。

说明：
此成员函数用来向属性表中添加一个属性页。按你所希望的从左至右的顺序来添加页。


 CPropertySheetEx::Construct

void Construct( UINT nIDCaption,
CWnd* pParentWnd = NULL,
UINT iSelectPage = 0,
HBITMAP hbmWatermark = NULL,
HPALETTE hpalWatermark = NULL,
HBITMAP hbmHeader = NULL
);
void Construct( LPCTSTR pszCaption,
CWnd* pParentWnd = NULL,
UINT iSelectPage = 0,
HBITMAP hbmWatermark = NULL,
HPALETTE hpalWatermark = NULL,
HBITMAP hbmHeader = NULL
);

参数：
nIDCaption | 要用在属性表中的标题的ID。
pParentWnd | 指向属性表的父窗口的指针。如果是NULL，则父窗口将是应用程序的主窗口。
iSelectPage | 最初将要在最项上的页的索引。缺省的是被添加到表中的第一页。
hbmWatermark | 属性页的水印位图的句柄。
hpalWatermark | 水印位图和/或页眉位图的调色板的句柄。
hbmHeader | 属性页的页眉位图的句柄。
pszCaption | 指向一个字符串的指针，该字符串包含了用于属性表的标题。它不能是NULL。

说明：
此成员函数用来构造一个CPropertySheetEx对象。要获取更多的信息，请参见CPropertySheet::Construct。
要显示这个属性表，请调用DoModal或Create。包含在第一个参数中的字符串将被放在属性表的标题条中。
如果在调用Construct时传递的值是有效的，则水印和/或页眉图像被自动显示。

请参阅：CPropertySheetEx::CPropertySheetEx


 CPropertySheetEx::CPropertySheetEx

CPropertySheetEx();
CPropertySheetEx( UINT nIDCaption,
CWnd* pParentWnd = NULL,
UINT iSelectPage = 0,
HBITMAP hbmWatermark = NULL,
HPALETTE hpalWatermark = NULL,
HBITMAP hbmHeader = NULL
);
CPropertySheetEx( LPCTSTR pszCaption,
CWnd* pParentWnd = NULL,
UINT iSelectPage= 0,
HBITMAP hbmWatermark = NULL,
HPALETTE hpalWatermark = NULL,
HBITMAP hbmHeader = NULL
);

参数：
nIDCaption | 要用在属性表中的标题的ID。
pParentWnd | 指向属性表的父窗口的指针。如果是NULL，则父窗口将是应用程序的主窗口。
iSelectPage | 最初将要在最项上的页的索引。缺省的是被添加到表中的第一页。
hbmWatermark | 属性页的水印位图的句柄。
hpalWatermark | 水印位图和/或页眉位图的调色板的句柄。
hbmHeader | 属性页的页眉位图的句柄。
pszCaption | 指向一个字符串的指针，该字符串包含了用于属性表的标题。它不能是NULL。

说明：
此成员函数用来构造一个CPropertySheetEx对象。要显示这个属性表，请调用DoModal或Create。包含在第一个参数中的字符串将被放置在属性表的标题条中。
如果你有多个参数（例如，如果你正使用一个数组），使用CPropertySheetEx::Construct来代替CPropertySheetEx。
如果在调用Construct时传递的值是有效的，则水印和/或页眉图像被自动显示。

请参阅：CPropertySheetEx::Construct


 CPropertySheetEx::m_psh

说明：
此数据成员是一个结构，它的成员保存了PROPSHFETHEADER的特征。在创建了一个属性表之后，并在调用CPropertySheetEx::DoModal来显示它之前，可以使用这个结构来初始化这个属性表的外观。例如，将m_psh的成员dwSize的设置为你的属性表想要具有的尺寸。
如果要获取更多有关这个结构的信息，包括它的成员的列表，请参见“PlatformSDK”中的PROPSHEETHEADER。

请参阅：CPropertySheetEx::Construct


 CPropExchange

CPropExchange没有基类。
建立一个属性交换的环境和方向。
CPropExchange类支持应用程序的OLE控件的永久性实现。永久性是控件的状态信息在控件本身与某种媒介之间的交换，通常这些状态信息由控件的属性来表现。
当框架获知要从存储器载入一个OLE控件的属性，或是要将这些属性存入永久存储器时，它就构造一个从CPropExchange派生的对象。
框架将一个指向这个CPropExchange对象的指针传递给你的控件的DoPropExchange函数。如果你使用ClassWizard来为你的控件创建开始文件，则控件的DoPropExchange函数调用COleControl::DoPropExchange。这个基类版本交换控件的固有属性；你可以修改你的派生类版本来交换那些你给控件添加的属性。
在载入或创建一个控件的时候，可以使用CPropExchange来使控件的属性连续，或初始化控件的属性。CPropExchange的成员函数ExchangeProp和ExchangeFontProp可以用来将控件的属性存入不同的介质，并从不同的介质载入属性。
#include <afxctl.h>
请参阅：COleControl::DoPropExchange

CPropExchange类成员

操作
ExchangeFontProp | 交换一个字体属性
ExchangeProp | 交换任何内建的类型属性
ExchangeBlobProp | 交换一个二进制的大对象（BLOB）属性
ExchangePersistentProp | 在一个控件和一个文件之间交换一个属性
ExchangeVersion | 交换一个OLE控件的版本号
IsLoading | 表明属性是被载入一个控件还是从控件被保存
GetVersion | 获取一个OLE控件的版本号


 CPropExchange::ExchangeBlobProp

virtual BOOL ExchangeBlobProp( LPCTSTR pszPropName,
void** ppvBlob,
const void* pvBlobDefault = NULL
) = 0;

返回值：
如果交换成功则返回非零值；否则返回0。

参数：
pszPropName | 要交换的属性的名字。
ppvBlob | 指向一个变量的指针，该变量指向属性所保存的地方（变量通常是你的类的成员）。
pvBlobDefault | 属性的缺省值。

说明：
此函数用来使一个保存二进制大对象（BLOB）数据的属性连续。
属性的值从由ppvBlob引用的变量中读出，或在适当的时候将属性值写入这个变量。如果指定了pvBlobDefault，它将被用来作为属性的缺省值。如果由于某种原因，控件的连续失败了，则使用这个值。
函数CArchivePropExchange::ExchangeBlobProp, CResetPropExchange::ExchangeBlobProp和CPropsetPropExchange::ExchangeBlobProp加载这个纯虚函数。

请参阅：
COleControl::DoPropExchange, CPropExchange::ExchangeFontProp, CPropExchange::ExchangePersistentProp, CPropExchange::ExchangeProp


 CPropExchange::ExchangeFontProp

virtual BOOL ExchangeFontProp( LPCTSTR pszPropName,
CFontHolder& font,
const FONTDESC FAR* pFontDesc,
LPFONTDISP pFontDispAmbient
) = 0;

返回值：
如果交换成功则返回非零值；否则返回0。

参数：
pszPropName | 要交换的属性的名字。
font | 一个CFontHolder对象的引用，该对象包含了字体属性。
pFontDesc | 指向一个FONTDESC结构的指针，当pFontDispAmbient是NULL时，该结构包含了用来初始化字体属性的缺省状态的值。
pFontDispAmbient | 一个指向字体的IFontDisp接口的指针，用来初始化字体属性的缺省状态。

说明：
此函数用来在某种存储介质和控件之间交换字体属性。
如果字体属性正在从介质载入控件，则从介质中获取字体的特征，并用来初始化由font引用的CFontHolder对象。如果正在保存字体属性，则字体对象的特征被写入介质。
函数CArchivePropExchange::ExchangeFontProp, CRestPropExchange::ExchangeFontProp和CPropsetPropExchange::ExchangeFontProp加载这个纯虚函数。

请参阅：
COleControl::DoPropExchange, CPropExchange::ExchangeBlobProp, CPropExchange::ExchangePersistentProp, CPropExchange::ExchangeProp


 CPropExchange::ExchangePersistentProp

virtual BOOL ExchangePersistentProp( LPCTSTR pszPropName,
LPUNKNOWN FAR* ppUnk,
REFIID iid,
LPUNKNOWN pUnkDefault
) = 0;

返回值：
如果交换成功则返回非零值；否则返回0。

参数：
pszPropName | 要交换的属性的名字。
ppUnk | 指向一个变量的指针，该变量包含了一个指向属性的IUnknown接口的指针（此变量通常是你的类的成员）。
iid | 控件要使用的有关这个属性的接口的接口指针。
pUnkDefault | 这个属性的缺省值。

说明：
此函数用来在控件和一个文件之间交换属性。
如果属性正被从文件载入到控件，则属性被从文件创建并初始化。如果正保存属性，则属性的值被写入文件。
函数CArchivePropExchange::ExchangePersistentProp, CResetPropExchange::ExchangePersistentProp和CPropsetPropExchange::ExchangePersistentProp加载这个纯虚函数。

请参阅：
COleControl::DoPropExchange, CPropExchange::ExchangeBlobProp, CPropExchange::ExchangeFontProp, CPropExchange::ExchangeProp


 CPropExchange::ExchangeProp

virtual BOOL ExchangeProp( LPCTSTR pszPropName,
VARTYPE vtProp,
void* pvProp,
const void* pvDefault = NULL
) = 0;

返回值：如果成功则返回非零值；否则返回0。

参数：
pszPropName | 要交换的属性的名字。
vtProp一个符号，用来指定要交换的属性的类型。可能的取值如下：
符号 | 属性类型
VT_I2 | 短型（short）
VT_I4 | 长型（long）
VT_BOOL | 布尔型（BOOL）
VT_BSTR | CString
VT_CY | CY
VT_R4 | 浮点型（float）
VT_R8 | 双精度型（double）
pvProp | 一个指向属性值的指针。
pvDefault | 指向属性的一个缺省值的指针。

说明：
此函数用来在某个存储介质和控件之间交换属性。
如果属性正被从介质载入控件，则从介质中获取属性的值，并将这个值存入由pvProp指向的控件中。如果正将属性存入介质，则由pvProp所指向的控件的值被写入介质中。
函数CArchivePropExchange::ExchangeProp, CResetPropExchange::ExchangeProp和CPropsetPropExchange::ExchangeProp加载这个纯虚函数。

请参阅：
COleControl::DoPropExchange, CPropExchange::ExchangeBlobProp, CPropExchange::ExchangeFontProp, CPropExchange::ExchangePersistentProp


 CPropExchange::ExchangeVersion

BOOL ExchangeVersion ( DWORD& dwVersionLoaded, DWORD dwVersionDefault, BOOL bConvert );

返回值：如果成功则返回非零值；否则返回0。

参数：
dwVersionLoaded | 指向一个变量的引用，该变量用来保存被载入的永久数据的版本号。
dwVersionDefault | 控件的当前版本号。
bConvert | 用来表明是将永久数据转换为当前的版本号，还是保持它载入时的版本号。

说明：
框架调用此函数来处理一个版本号的持续性。

请参阅：COleControl::ExchangeVersion


 CPropExchange::GetVersion

DWORD GetVersion();

返回值：返回控件的版本号。

说明：此函数用来获取控件的版本号。


 CPropExchange::IsLoading

BOOL IsLoading();

返回值：
如果属性被载入则返回非零值；否则返回0。

说明：
此函数用来确定属性是被载入控件，还是被从控件保存。

请参阅：COleControl::DoPropExchange


 CPtrArray

CObject
└CPtrArray

CPtrArray类支持void指针数组。
CPtrArray的成员函数类似于CObArray类的成员函数。由于这种相似，你可以利用CObArray参考文档作为成员函数的说明。无论在何处使用一个CObject指针作为函数参数或返回值，都可以将它替换成void。例如：
CObject* CObArray::GetAt( int <nIndex> ) const;
可以转换成：
void* CPtrArray::GetAt( int <nIndex> ) const;
CPtrArray嵌入IMPLEMENT_DYNAMIC宏来支持运行时类型访问和转储到一个CDumpContext对象。如果你需要转储个别的指针数组元素，你必须将转储环境的深度设置为1或更大。
注意：
在使用一个数组之前，先用SetSize函数建立数组的大小，并为数组分配内存。如果应用程序没有使用SetSize函数，则向数组中增加元素会使它被频繁地再分配和拷贝。频繁再分配和拷贝的效率很低，并且可能使内存变得很零碎。
指针数组不能被串行化。
当一个指针数组被删除时，或当其元素被删掉时，只删掉指针，而这些指针所引用的实体不被删除。
#include <afxcoll.h>
请参阅：CObArray

CPtrArray类成员

构造
CPtrArray 构造一个空的void指针数组

绑定
GetSize | 获取这个数组中的元素个数
GetUpperBound | 返回最大的有效索引
SetSize | 设置此数组中要包含的元素个数

操作
FreeExtra | 释放超出当前上界的所有未用内存
RemoveAll | 删除此数组中的所有元素

元素访问
GetAt | 返回给定索引处的值
SetAt | 设置给定索引处的值；数组不运行扩展
ElementAt | 返回对数组内的一个元素指针的一个临时引用
GetData | 允许访问数组中的元素。不能是NULL

扩大数组
SetAtGrow | 设置给定索引处的值，如果必要，允许数组扩展
Add | 将一个元素增加到数组尾；在必要时扩展数组
Append | 将另一个数组添加到此数组；如果必要，则扩展此数组
Copy | 将另一个数组拷贝给此数组；如果必要，则扩展此数组

插入/删除
InsertAt | 将一个元素（或另一数组中的所有元素）插入到指定索引处
RemoveAt | 删除指定索引处的元素

操作符
operator [] 设置或获取给定索引处的元素


 CPtrList

CObject
└CPtrList

CPtrList类支持void指针列表。
CPtrList类的成员函数类似于CObList类的成员函数。由于这种类似性，可以使用CObList参考文档作为成员函数的说明。无论在任何时候使用一个CObject指针作为函数参数或返回值，都可以将指针替换为void。例如，
CObject*& CObList::Gethead() const;
可以替换成：
void* CPtrList::Gethead() const;
CPtrList嵌入了IMPLEMENT_DYNAMIC宏来支持运行类型访问和转储到CDumpContext对象。如果应用程序需要转储各个指针列表元素，则必须将转储环境的深度设置为1或大于1。
指针列表不能为NULL。
当一个CPtrList对象被删除时，或当其元素被删除时，只删除指针，而指针所引用的实体并未被删除。
#include <afxcoll.h>
请参阅：CObList

CPtrList类成员

构造
CPtrList 构造一个空的void指针列表

首/尾访问
GetHead | 返回列表（不能为空）的头元素
GetTail | 返回列表（不能为空）的尾元素

操作
RemoveHead | 移走列表的头元素
RemoveTail | 移走列表的尾元素
AddHead | 将一个元素（或另一列表中的所有元素）增加到列表头（成为新的列表头）
AddTail | 将一个元素（或另一列表中的所有元素）增加到列表尾（成为新的列表尾）
RemoveAll | 从此列表中移走所有元素

重复
GetHeadPosition | 返回列表头元素的位置
GetTailPosition | 返回列表尾元素的位置
GetNext | 获取用于重复的下一个元素
GetPrev | 获取用于重复的上一个元素

获取/修改
GetAt | 获取在给定位置的元素
SetAt | 设置在给定位置的元素
RemoveAt | 从此列表中移走给定位置的元素

插入
InsertBefore | 在一个给定位置之前插入一个新元素
InsertAfter | 在一个给定位置之后插入一个新元素

搜索
Find | 获取一个由指针值指定的元素的位置
FindIndex | 获取由一个索引（从零开始）指定的元素的位置

状态
GetCount | 返回此列表中的元素数目
IsEmpty | 测试列表是否为空（无元素）


 CReBar

CObject
└CCmdTarget
└CWnd
└CControlBar
└CReBar

CReBar对象是一个控制条，它为rebar控件提供页面布局、持续性和状态信息。
rebar对象可以包含多种子窗口，通常是其它控件，包括编辑框、工具条和列表框。rebar对象可以把它的子窗口显示在一个指定的位图上面。应用程序可以自动地改变rebar的大小，或者是用户通过单击或拖动rebar的控制条来手动改变它的大小。

Rebar控件
rebar对象的行为类似于一个工具条对象的行为。一个rebar使用单击－拖动机制来调整它的带的尺寸。一个rebar控件可以包含一个或多个带，每一个带可以是一个控制条、一个位图、一个文本标签和一个子窗口的任意组合。但是，带不能包含多于一个的子窗口。
CReBar使用CReBarCtrl类来提供它的实现。你可以通过CReBarCtrl来访问rebar控件，以利用控件的定制选项。要获取有关rebar控件的给定选项，请参见CReBarCtrl。
警告：
Rebar和rebar控件对象不支持MFC固定控制条。如果调用了CReBar::EnableDocking，则你的应用程序将给出断言。
#include <afxext.h>

CReBar类成员

构造
Create 创建一个rebar控件，并将它连接到CReBar对象上

属性
GetReBarCtrl | 允许直接访问基础通用控件
AddBar | 将一个带添加到一个rebar中


 CReBar::AddBar

BOOL AddBar( CWnd* pBar,
LPCTSTR lpszText = NULL,
CBitmap* pbmp = NULL,
DWORD dwStyle = RBBS_GRIPPERALWAYS | RBBS_FIXEDBMP
);
BOOL AddBar( CWnd* pBar,
COLORREF clrFore,
COLORREF clrBack,
LPCTSTR pszText = NULL,
DWORD dwStyle = RBBS_GRIPPERALWAYS
);

返回值：如果成功则返回非零值；否则返回0。

参数：
pBar | 一个指向CWnd对象的指针，该对象将要被插入rebar的子窗口。被引用的对象必须有一个WS_CHILD。
lpszText | 一个指向字符串的指针，该字符串包含要显示在rebar上的文本。其缺省值是NULL。
pszText | 中包含的文本并不是子窗口的一部分；它是在rebar本身上的。
pbmp | 一个指向CBitmap对象的指针，该对象被显示在rebar的背景上。其缺省值为NULL。
dwStyle | 一个包含要应用于rebar的风格的DWORD。参见Win32结构中的fStyle函数的描述，可以获得有关带风格的完整列表。
clrFore | 一个COLORREF值，它代表了rebar的前景颜色。
clrBack | 一个COLORREF值，它代表了rebar的背景颜色。

说明：此成员函数用来给rebar添加一个带。

请参阅：CReBarCtrl


 CReBar::Create

BOOL Create( CWnd* pParentWnd,
DWORD dwCtrlStyle = RBS_BANDBORDERS,
DWORD dwStyle = WS_CHILD | WS_VISIBLE |
WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CBRS_TOP,
UINT nID = AFX_IDW_REBAR
);

返回值：如果成功则返回非零值；否则返回0。

参数：
pParentWnd | 指向CWnd对象的指针，该对象的Windows窗口是状态条的父窗口。通常是你的框架窗口。
dwCtrlStyle | rebar控件风格。缺省的，是RBS_BANDBORDERS，这种风格显示窄线来分隔rebar控件中相邻的带。参见“Platform SDK”中的“Rebar控件风格”，可以获得一个风格列表。
dwStyle | rebar窗口风格。
nID | rebar的子窗口ID。

说明：此成员函数用来创建一个rebar。

请参阅：CReBarCtrl


 CReBar::GetReBarCtrl

CReBarCtrl& GetReBarCtrl() const;

返回值：一个指向一个CReBarCtrl对象的引用。

说明：
此成员函数允许直接访问基础通用控件。
调用此成员函数来利用Windows rebar通用控件的机能来定制你的rebar。当你调用GetReBarCtrl时，它返回一个指向CReBarCtrl对象的引用，这样你就可以使用任何一套成员函数。
如果要获取更多有关使用CReBarCtrl来定制你的rebar的信息，请参见“VisualC++程序员指南”中的“使用CReBarCtrl”。


 CReBarCtrl

CObject
└CCmdTarget
└CWnd
└CControlBar
└CReBarCtrl

CReBarCtrl类封装了rebar控件的机能，rebar控件是一个子窗口容器。rebar控件所属的应用程序将rebar控件包含的子窗口分配给rebar带。子窗口是另外一种通用的控件。
rebar控件包含一个或多个带。每一个带可以包含一个控制条，一个位图，一个文本标签和一个子窗口的组合。但一个带只能包含每一种项的一个。
rebar控件可以在指定的位图之上显示子窗口。所有的rebar控件带都可以调整大小，除了那些使用RBBS_FIXEDSIZE风格的以外。当你调整一个rebar控件带的位置和大小的时候，rebar控件控制对应于该带的子窗口的位置和大小。单击和拖动一个带的控制条，就可以调整控件中的带的大小或改变它们的顺序。
下面的例子说明了一个具有三个带的rebar控件：
· | 带0包含了一个平坦的、透明（transparent）的工具条控件。
· | 带1包含了透明的标准按钮和下拉按钮。
· | 带2包含了一个组合框和四个标准按钮。

Rebar控件
· | 图像列表。
· | 消息处理。
· | 定制绘画功能。
· | 除标准的窗口风格之外，附加的各种控件风格。要获取这些风格的列表，参见“Platform SDK”中的“Rebar控件风格”。

#include <afxcmn.h>

CReBarCtrl类成员

构造
CReBarCtrl 构造一个CReBarCtrl对象

初始化
Create 创建rebar控件，并将它与CReBarCtrl对象连接

属性
GetBandCount | 获取在rebar控件中的当前带数
GetBandInfo | 获取rebar控件中的指定带的信息
SetBandInfo | 设置一个rebar控件中的已存在的带的特征
GetBarHeight | 获取rebar控件的高度
GetBarInfo | 获取有关rebar控件的信息以及它使用的图像列表
SetBarInfo | 设置一个rebar控件的特征
GetBkColor | 获取rebar控件的缺省背景颜色
SetBkColor | 设置一个rebar控件的缺省背景颜色
GetDropTarget | 获取一个rebar控件的IDropTarget接口指针
GetRect | 获取一个rebar控件中的给定带的边界矩形
GetRowCount | 获取一个rebar控件中的带行的数目
GetRowHeight | 获取一个rebar控件中的指定行的高度
GetTextColor | 获取一个rebar控件的缺省文本颜色
GetToolTips | 获取与rebar控件相关的任何工具提示控件的句柄
IDToIndex | 将一个带的标识符（ID）转换成一个rebar控件中的带索引
SetOwner | 设置一个rebar控件的属主窗口
SetTextColor | 设置一个rebar控件的缺省文本颜色
SetToolTips | 使一个工具提示控件与rebar控件相关联
GetImageList | 获取与rebar控件相关的图像列表
SetImageList | 设置一个rebar控件的图像列表
GetBandBorders | 获取一个带的边界
GetPalette | 获取rebar控件的当前调色板
SetPalette | 设置rebar控件的当前调色板

操作
BeginDrag | 设置rebar控件进入拖－放模式
DeleteBand | 从一个rebar控件中删除一个带
DragMove | 在调用BeginDrag后，更新在rebar控件中的拖动位置
EndDrag | 终止rebar控件的拖放操作
HitTest | 如果一个rebar带在屏幕上的给定点存在的话，则确定rebar带的哪一部分是在这个点上
InsertBand | 向一个rebar控件中插入一个新带
MaximizeBand | 将rebar控件中的一个带调整到它的理想或最大尺寸
MinimizeBand | 将rebar控件中的一个带调整到它的理想或最小尺寸
ShowBand | 显示或隐藏一个rebar控件中的给定带
SizeToRect | 使一个rebar控件符合一个指定的矩形
MoveBand | 将一个带从一个索引移动到另一个索引


 CReBarCtrl::BeginDrag

void BeginDrag( UINT uBand, DWORD dwPos = (DWORD)-1);

参数：
uBand | 从零开始的带索引值，这些带将被拖放操作影响。
dwPos | 一个DWORD值，包含了开始的鼠标坐标。水平坐标包含在LOWORD中，垂直坐标包含在HIWORD中。如果你传递的是（DWORD）-1，则rebar控件将通过调用::GetMessage或::PeekMessage来使用鼠标最后一次的位置。

说明：
此成员函数实现Win32消息RB_BEGINDRAG的行为，就像在“Platform SDK”中描述的一样。

请参阅：::GetMessage, ::PeekMessage


 CReBarCtrl::Create

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

返回值：
如果成功地创建了对象，则返回非零值；否则返回0。

参数：
dwStyle | 指定应用于控件的rebar控件风格的组合。参见“Platfor SDK”中的“rebar控件风格”，可以获得所支持的风格的列表。
rect | 一个指向CRect对象或RECT结构的引用，它们是rebar控件的位置和尺寸。
pParentWnd | 一个指向CWnd对象的指针。它不能是NULL。
nID | 指定rebar控件的控制ID。

说明：
分两步来创建一个rebar控件： 1.
调用CReBarCtrl来构造一个CReBarCtrl对象。 2. 调用Create成员函数来创建Windows rebar控件，并将它与CReBarCtrl对象连接。
当你调用Create时，通用的控件被初始化。


 CReBarCtrl::CReBarCtrl

CReBarCtrl();

说明：
此成员函数用来创建一个CReBarCtrl对象。

请参阅：CReBarCtrl::Create


 CReBarCtrl::DeleteBand

BOOL DeleteBand( UINT uBand );

返回值：
如果成功地删除了带，则返回非零值；否则返回0。

参数：
uBand 要被删除的带的从零开始的索引值。

说明：
此成员函数用来实现Win32消息RB_DELETEBAND的行为，就像在“Platform SDK”中所描述的一样。


 CReBarCtrl::DragMove

void DragMove( DWORD dwPos = ( DWORD)-1 );

参数：
dwPos 一个DWORD值，该值包含了新的鼠标位置。水平坐标包含在LOWORD中，垂直坐标包含在HIWORD中。如果你传递的是（DWORD）－1，则rebar控件将通过调用::GetMessage或::PeekMessage来使用鼠标最后一次的位置。

说明：
此成员函数用来实现Win32消息RB_DRAGMOVE的行为，就像在“Platform SDK”中所描述的一样。

请参阅：
CReBarCtrl::BeginDrag, CReBarCtrl::EndDrag, ::GetMessage, ::PeekMessage


 CReBarCtrl::EndDrag

void EndDrag();

说明：
此成员函数用来实现Win32消息RB_ENDDRAG的行为，就像在“PlatformSDK”中所描述的一样。

请参阅：
CReBarCtrl::BeginDrag, CReBarCtrl::DragMove


 CReBarCtrl::GetBandBorders

void GetBandBorders( UINT uBand, LPRECT prc ) const;

参数：
uBand | 将要被获取边界的带的从0开始的索引。
prc | 一个指向RECT结构的指针，该结构将用来接收带的边界。如果该rebar控件具有RBS_BANDBORDERS风格，则此结构的每一个成员都将接收相似的数目，从相应的带的一面来说，这构成了边界。如果该rebar控件不具有RBS_BANDBORDERS风格，则此结构只有左边的成员接收有效的信息。要获取有关rebar控件风格的描述，请参见“Platform SDK”中的“rebar控件风格”。

说明：
此成员函数用来实现Win32消息RB_GETBANDBORDERS的行为，就像在“Platform SDK”中所描述的一样。


 CReBarCtrl::GetBandCount

UINT GetBandCount() const;

返回值：被分配给控件的带的数目。

说明：
此成员函数用来实现Win32消息RB_GETBANDCOUNT的行为，就像在“Platform SDK”中所描述的一样。

请参阅：
CReBarCtrl::GetBandInfo, CReBarCtrl::SetBandInfo, CReBarCtrl::DeleteBand, CReBarCtrl::InsertBand, CReBarCtrl::ShowBand


 CReBarCtrl::GetBandInfo

BOOL GetBandInfo( UINT uBand, REBARBANDINFO* prbbi ) const;

返回值：如果成功则返回非零值；否则返回0。

参数：
uBand | 带的从零开始的索引，将从这些带获取信息。
prbbi | 一个指向REBARBANDINFO结构的指针，该结构用来接收带的信息。你必须在发送此消息之前将此结构的成员cbSize设置为sizeof(REBARBANDINFO)，并将fMask成员设置为你要获取的项。

说明：
此成员函数用来实现Win32消息RB_GETBANDINFO的行为，就像在“PlatformSDK”中所描述的一样。

请参阅：
CReBarCtrl::SetBandInfo, CReBarCtrl::GetBandCount, CReBarCtrl::DeleteBand, CReBarCtrl::InsertBand, CReBarCtrl::ShowBand


 CReBarCtrl::GetBarHeight

UINT GetBarHeight() const;

返回值：以像素表示的代表控件高度的值。

说明：此成员函数用来获取rebar控件的高度。

请参阅：
CReBarCtrl::GetBarInfo, CReBarCtrl::SetBarInfo


 CReBarCtrl::GetBarInfo

BOOL GetBarInfo( REBARINFO* prbi ) const;

返回值：如果成功则返回非零值；否则返回0。

参数：
prbi 一个指向REBARINFO结构的指针，该结构将用来获取此rebar控件的信息。你必须在发送这个消息之前设置此结构的cbSize成员为sizeof(REBARINFO)。

说明：
此成员函数用来实现Win32消息RB_GETBARINFO的行为，就像在“PlatformSDK”中所描述的一样。

请参阅：CReBarCtrl::SetBarInfo


 CReBarCtrl::GetBkColor

COLORREF GetBkColor() const;

返回值：
返回一个COLORREF值，该值代表当前缺省的背景颜色。

说明：
此成员函数用来实现Win32消息RB_GETBKCOLOR的行为，就像在“PlatformSDK”中所描述的一样。

请参阅：CReBarCtrl::SetBkColor


 CReBarCtrl::GetDropTarget

IDropTarget* GetDropTarget() const;

返回值：返回一个指向IDropTarget接口的指针。

说明：
此成员函数用来实现Win32消息RB_GETDROPTARGET的行为，就像在“Platform SDK”中所描述的一样。


 CReBarCtrl::GetImageList

CImageList* GetImageList();

返回值：
返回一个指向CImageList对象的指针。如果没有控件的图像列表则返回NULL。

说明：
此成员函数用来获取与一个rebar控件相关的CImageList对象。此成员函数使用REBARINFO结构中的size和mask信息，就像在“Platform SDK”中描述的一样。

请参阅：CReBarCtrl::SetImageList


 CReBarCtrl::GetPalette

CPalette* GetPalette() const;

返回值：
返回一个指向CPalette对象的指针，该对象指定rebar控件的当前调色板。

说明：
此成员函数用来获取rebar控件的当前调色板。
值得注意的是，此成员函数使用一个CPalette对象作为它的返回值，而不是一个HPALETTE。

请参阅：CReBarCtrl::SetPalette


 CReBarCtrl::GetRect

BOOL GetRect( UINT uBand, LPRECT prc ) const;

返回值：如果成功则返回非零值；否则返回0。

参数：
uBand | 在rebar控件中的带的从0开始的索引。
prc | 一个指向RECT结构的指针，该结构将用来接收rebar带的边界。

说明：
此成员函数用来实现Win32消息RB_GETRECT的行为，就像在“Platform SDK”中所描述的一样。

请参阅：CReBarCtrl::SizeToRect


 CReBarCtrl::GetRowCount

UINT GetRowCount() const;

返回值：
返回一个UINT值，它代表控件中的带行的数目。

说明：
此成员函数用来实现Win32消息RB_GETROWCOUNT的行为，就像在“PlatformSDK”中所描述的一样。

请参阅：CReBarCtrl::GetRowHeight


 CReBarCtrl::GetRowHeight

UINT GetRowHeight( UINT uRow ) const;

返回值：
一个UINT值，该值代表行的以像素为单位的高度。

参数：
uRow 带的从0开始的索引，此索引所代表的带的高度将被获取。

说明：
此成员函数用来实现Win32消息RB_GETROWHEIGHT的行为，就像在“Platform SDK”中所描述的一样。

请参阅：CReBarCtrl::GetRowCount


 CReBarCtrl::GetTextColor

COLORREF GetTextColor() const;

返回值：
返回一个COLORREF值，该值代表当前缺省的文本颜色。

说明：
此成员函数用来实现Win32消息RB_GETTEXTCOLOR的行为，就像在“Platform SDK”中所描述的一样。

请参阅：
CReBarCtrl::SetTextColor, CReBarCtrl::GetBkColor, CReBarCtrl::SetBkColor


 CReBarCtrl::GetToolTips

CToolTipCtrl* GetToolTips() const;

返回值：返回一个指向CToolTipCtrl对象的指针。

说明：
此成员函数用来实现Win32消息RB_GETTOOLTIPS的行为，就像在“PlatformSDK”中所描述的一样。
值得注意的是，GetToolTips的MFC实现返回一个指向CToolTipCtrl的指针，而不是一个HWND。

请参阅：CReBarCtrl::SetToolTips


 CReBarCtrl::HitTest

int HitTest( RBHITTESTINFO* prbht );

返回值：
返回在给定点的带的从0开始的索引，如果在该指定点上没有rebar带，则返回-1。

参数：
prbht 是一个指向RBHITTESTINFO结构的指针。在发送此消息之前，此结构的pt成员布线在客户区坐标被初始化为指向要被测试的项。

说明：
此成员函数用来实现Win32消息RB_HITTEST的行为，就像在“Platform SDK”中所描述的一样。


 CReBarCtrl::IDToIndex

int IDToIndex( UINT uBandID ) const;

返回值：
如果成功则返回从0开始的带索引；否则返回-1。如果有复制的带索引存在，则返回第一个。

参数：
uBandID 应用程序定义的指定带的标识符，当带被插入时，由REBARBANDINFO中的wID成员传递。

说明：
此成员函数用来实现Win32消息RB_IDTOINDEX的行为，就像在“PlatformSDK”中所描述的一样。

请参阅：CReBarCtrl::InsertBand


 CReBarCtrl::InsertBand

BOOL InsertBand( UINT uIndex, REBARBANDINFO* prbbi );

返回值：如果成功则返回非零值；否则返回0。

参数：
uIndex | 从零开始的位置索引，带将在这个位置插入。如果你设置这个参数为-1，则控件会将新带插入在最后。
prbbi | 一个指向REBARBANDINFO结构的指针，此结构定义了要被插入的带。在调用此成员函数之前，你必须将此结构的cbSize成员设置为sizeof( REBARBANDINFO )。

说明：
此成员函数用来实现Win32消息RB_INSERTBAND的行为，就像在“PlatformSDK”中所描述的一样。


 CReBarCtrl::MaximizeBand

void MaximizeBand( UINT uBand );

参数：
uBand 返回要被最大化的带的从零开始的索引值。

说明：
此成员函数用来实现Win32消息RB_MAXIMIZEBAND的行为，就像在“Platform SDK”中所描述的一样。

请参阅：CReBarCtrl::MinimizeBand


 CReBarCtrl::MinimizeBand

void MinimizeBand( UINT uBand );

参数：
uBand 返回要被最大化的带的从0开始的索引值。

说明：
此成员函数用来实现Win32消息RB_MINIMIZEBAND的行为，就像在“PlatformSDK”中所描述的一样。

请参阅：CReBarCtrl::MaximizeBand


 CReBarCtrl::MoveBand

BOOL MoveBand( UINT uFrom, UINT uTo );

返回值：如果成功则返回非零值；否则返回0。

参数：
uFrom | 要被移动的带的从0开始的索引。
uTo | 新的带位置的从0开始的索引。此参数的值必须不大于总带数减1的值。要得到总带数，可以调用GetBandCount。

说明：
此成员函数用来实现Win32消息RB_MOVEBAND的行为，就像在“PlatformSDK”中所描述的一样。


 CReBarCtrl::SetBandInfo

BOOL SetBandInfo( UINT uBand, REBARBANDINFO* prbbi );

返回值：如果成功则返回非零值；否则返回0。

参数：
uBand | 要接收新设置的带的从0开始的索引。
prbbi | 指向一个REBARBANDINFO结构的指针，此结构定义了要被插入的带。在发送此消息之前，你必须将此结构的cbSize成员设置为sizeof( REBARBANDINFO )。

说明：
此成员函数用来实现Win32消息RB_SETBANDINFO的行为，就像在“PlatformSDK”中所描述的一样。

请参阅：CReBarCtrl::GetBandInfo


 CReBarCtrl::SetBarInfo

BOOL SetBarInfo( REBANRINFO* prbi);

返回值：如果成功则返回非零值；否则返回0。

参数：
prbi 一个指向REBARINFO结构的指针，该结构包含了要设置的信息。在发送此消息之前，你必须将此结构的cbSize成员设置为sizeof( REBARINFO )。

说明：
此成员函数用来实现Win32消息RB_SETBARINFO的行为，就像在“PlatformSDK”中所描述的一样。

请参阅：CReBarCtrl::GetBarInfo


 CReBarCtrl::SetBkColor

COLORREF SetBkColor( COLORREF clr );

返回值：
返回一个COLORREF值，它代表先前的缺省背景颜色。

参数：
clr 一个COLORREF值，它代表新的缺省背景颜色。

说明：
此成员函数用来实现Win32消息RB_SETBKCOLOR的行为，就像在“PlatformSDK”中所描述的一样。在“Platform SDK”中参见此主题，就可以获得更多关于何时设置背景颜色和如何设置缺省值的信息。

请参阅：CReBarCtrl::GetBkColor


 CReBarCtrl::SetImageList

BOOL SetImageList( CImageList* pImageList );

返回值：如果成功则返回非零值；否则返回0。

参数：
pImageList 一个指向CImageList对象的指针，该对象包含了要分配给rebar控件的图像列表。

说明：
此成员函数用来给rebar控件分配图像列表。

请参阅：CReBarCtrl::GetImageList


 CReBarCtrl::SetOwner

CWnd* SetOwner( CWnd* pWnd );

返回值：
返回一个指向CWnd对象的指针，该对象是此rebar控件的当前属主。

参数：
pWnd 一个指向CWnd对象的指针，该对象要被设置为此rebar控件的属主。

说明：
此成员函数用来实现Win32消息RB_SETPARERN的行为，就像在“PlatformSDK”中所描述的一样。
值得注意的是，不管是对rebar控件的当前属主还是被选中的属主，都使用指向CWnd对象的指针，而不是窗口句柄。
注意：
此成员函数并不改变在创建对象时所设置的父；它只是向你指定的窗口发送通知消息。


 CReBarCtrl::SetPalette

CPalette* SetPalette( HPALETTE hPal );

返回值：
返回一个指向CPalette对象的指针，该对象指定了rebar控件先前调色板。

参数：
hPal 一个HPALETTE，它指定了rebar控件将要使用的新的调色板。

说明：
此成员函数用来实现Win32消息RB_SETPALETTE的行为，就像在“PlatformSDK”中所描述的一样。
值得注意的是，此成员函数用一个CPalette对象作为它的返回值，而不是一个HPALETTE。

请参阅：CReBarCtrl::GetPalette


 CReBarCtrl::SetTextColor

COLORREF SetTextColor( COLORREF clr );

返回值：
返回COLORREF值，该值代表了与CReBarCtrl对象相关的先前文本颜色。

参数：
clr 是一个COLORREF值，它代表CReBarCtrl对象中的新的文本颜色。

说明：
此成员函数用来实现Win32消息RB_SETTEXTCOLOR的行为，就像在“PlatformSDK”中所描述的一样。此函数用来支持一个rebar控件中的文本颜色的灵活性。

请参阅：CReBarCtrl::GetTextColor


 CReBarCtrl::SetToolTips

void SetToolTips( CToolTipCtrl* pToolTip );

参数：
pToolTip 一个指向CToolTipCtrl对象的指针。

说明：
此成员函数用来使一个工具提示控件和一个rebar控件相联系。
当你使用完后，你必须销毁此CRoolTipCtrl对象。

请参阅：CReBarCtrl::GetToolTips


 CReBarCtrl::ShowBand

BOOL ShowBand( UINT uBand, BOOL fShow = TRUE ) ;

返回值：如果成功则返回非零值；否则返回0。

参数：
uBand | 此rebar控件中的一个带的从零开始的索引值。
fShow | 表明是显示还是隐藏这个带。如果这个值是TRUE，则显示此带。否则，隐藏这个带。

说明：
此成员函数用来实现Win32消息RB_SHOWBAND的行为，就像在“PlatformSDK”中所描述的一样。

请参阅：
CReBarCtrl::SetBandInfo, CReBarCtrl::GetBandCount, CReBarCtrl::DeleteBand, CReBarCtrl::InsertBand, CReBarCtrl::GetBandInfo


 CReBarCtrl::SizeToRect

BOOL SizeToRect( CRect& rect );

返回值：如果成功则返回非零值；否则返回0。

参数：
rect 一个指向CRect对象的引用，该对象指定了一个rebar对象必须适合的矩形。

说明：
此成员函数用来实现Win32消息RB_SIZETORECT的行为，就像在“PlatformSDK”中所描述的一样。
值得注意的是，此成员函数使用一个CRect对象作为参数，而不是一个RECT结构。

请参阅：CReBarCtrl::GetRect


 CRecentFileList

CObject
└CRecentFileList

CRecentFileList是一个CObject类，它支持对最近使用过（MRU）的文件列表的控件。可以从MRU文件列表中添加或删除文件，该文件列表可以从注册表或一个.INI文件中读出或写入，显示MRU文件列表的菜单可以被更新。
#include <afxadv.h>

CRecentFileList类成员

构造
CRecentFileList 构造一个CRecentFileList对象

属性
GetSize 获取MRU文件列表中的文件数目

操作
Remove | 从MRU文件列表中移走一个文件
Add | 向MRU文件列表中添加一个文件
GetDisplayName | 为一个MRU文件名的菜单显示提供一个显示名称
UpdateMenu | 更新MRU文件列表的菜单显示
ReadList | 从注册表或.INI文件中读出MRU文件列表
WriteList | 将MRU文件列表写入注册表或.INI文件

操作符
operator [] 在一个给定位置返回一个CString对象


 CRecentFileList::Add

virtual void Add( LPCTSTR lpszPathName );

参数：
lpszPathName 要添加到列表中的路径名。

说明：
此成员函数用来将路径在lpszPathName给定的文件添加到最近使用过（MRU）文件列表中。此文件名将被添加到MRU列表的最顶端。如果此文件名在MRU列表中已经存在，则它将会被移动到顶端。

请参阅：
CRecentFileList::Remove, CRecentFileList::UpdateMenu


 CRecentFileList::CRecentFileList

CRecentFileList( UINT nStart,
LPCTSTR lpszSection,
LPCTSTR lpszEntryFormat,
int nSize,
int nMaxDispLen = AFX_ABBREV_FILENAME_LEN
);

参数：
nStart | 在MRU（最近使用过的）文件列表的菜单显示中的数字偏移。
lpszSection | 指向注册表或应用程序的.INI文件中用于MRU文件列表读出或写入部分的名字。
lpszEntryFormat | 指向一个格式字符串，此格式字符串用来作为保存在注册表或应用程序的.INI文件中的项的名字。
nSize | MRU文件列表中的最大文件数目。
nMaxDispLen | 可用于MRU文件列表中的文件名的菜单显示的按字符计算的最大长度。

说明：
此成员函数用来构造一个CRecentFileList对象。
由lpszEntryFormat指向的格式字符串应该包含“%d”，这将被用来代替每一个MRU项的索引。例如，如果此格式字符串是“file%d”，则这些项将被命名为file0，file1等。


 CRecentFileList::GetDisplayName

BOOL GetDisplayName( CString& strName, int nIndex, LPCTSTR lpszCurDir, int nCurDir, BOOL bAtLeastName = TRUE ) const;

返回值：
如果在MRU（最近使用过的）文件列表中的值的索引处没有文件名，则返回FALSE。

参数：
strName | 文件的全路径，该文件的名字将要被显示在MRU文件的菜单列表中。
nIndex | 在MRU文件列表中的文件的从零开始的索引。
lpszCurDir | 包含当前目录的字符串。
bAtLeastName | 如果是非零值，则表明应该返回文件的低级名字，即使是这个名字超过了最大的显示长度（作为nMaxDispLen参数传递给CrecentFileList构造函数）。

说明：
此成员函数用来获取MRU文件列表中的一个文件的显示名。如果该文件在当前目录下，则函数不显示该目录。如果文件名太长了，则不显示目录和扩展名。
如果这样的文件名仍然太长，则除非bAtLeastName是非零值，否则将显示名置为一个空字符串。

请参阅：
CRecentFileList::ReadList, CRecentFileList::WriteList


 CRecentFileList::GetSize

int GetSize() const;

返回值：
在当前MRU（最近使用的）文件列表中的文件数目。

请参阅：
CRecentFileList::Add, CRecentFileList::Remove


 CRecentFileList::operator []

CString& operator []( int nIndex );

参数：
nIndex 在一个CString集合中的一个CStrings的从零开始的索引。

说明：
此重载的下标（[]）操作符返回一个由nIndex中的从零开始的索引指定的单一的CString。


 CRecentFileList::ReadList

virtual void ReadList();

说明：
此函数用来从注册表或应用程序的.INI文件中读取最近使用过的（MRU）文件列表。

请参阅：CRecentFileList::WriteList


 CRecentFileList::Remove

virtual void Remove( int nIndex );

参数：
nIndex 要被从MRU（最近使用过的）文件列表中移走的文件的从零开始的索引。

说明：此函数用来从MRU文件列表中移走一个文件。

请参阅：
CRecentFileList::Add, CRecentFileList::UpdateMenu


 CRecentFileList::UpdateMenu

virtual void UpdateMenu( CCmdUI* pCmdUI );

参数：
pCmdUI 一个指向MRU（最近使用过的）文件列表菜单的指针，该菜单是一个CCmdUI对象。

说明：
此函数用来更新MRU文件列表的菜单显示。

请参阅：
CRecentFileList::Add, CRecentFileList::Remove


 CRecentFileList::WriteList

virtual void WriteList();

说明：
此函数用来将最近使用过的（MRU）文件列表写入注册表或应用程序的.INI文件。

请参阅：CRecentFileList::ReadList


 CRecordset

CObject
└CRecordset

CRecordset对象代表从一个数据源选择的一组记录的集合，被称作“记录集”。CRecordset对象可以以两种形式使用：动态集和快照。动态集是与其它用户的更新保持同步的动态数据集。快照是数据的静态视图。每一种形式都代表打开记录集时固定的一组记录。但是当滚动到动态集中的一个记录时，动态集将反映后来由其它用户或由应用程序中其它记录集对此记录所做的改变。
注意：
如果你正在使用数据访问对象（DAO）类，而不是打开数据库连接（ODBC）类，请使用类CDaoRecordset来代替。
要使用任何一种记录集，通常需要从CRecordset派生一个应用程序指定的记录集类。记录集从一个数据源中选择记录，然后你就可以：
· | 在这些记录中滚动。
· | 更新记录并指定一种加锁模式。
· | 过滤记录集，以获得那些从数据源中选择出来的可利用的记录。
· | 给记录集排序。
· | 参数化该记录集以定制它的具有要直到运行时才知道的信息的选项。
要使用你的类，打开一个数据库并构造一个记录集对象，给构造函数传递一个指向你的CDatabase对象的指针。然后调用记录集的Open成员函数，在此你可以指定该对象是一个动态集还是一个快照。调用Open来从数据源中选择数据。在记录集对象被打开之后，用它的成员函数和数据成员来滚动和操作记录。可用的操作根据对象是一个动态集还是一个快照（这依赖于打开数据库连接（ODBC）数据源的性能），是可更新的还是只读的，你是否实现了成组行检取而不同。为了刷新从调用Open以来可能被改变或添加的记录，可以调用对象的Requery成员函数。当你使用完对象之后，调用对象的Close成员函数，并销毁此对象。
在一个派生的CRecordset类中，使用记录字段交换（RFX）或成组记录字段交换（Bulk RFX）来支持读取和更新记录字段。
#include <afxdb.h>
请参阅：CDatabase, CRecordView

CRecordset类成员

数据成员
m_hstmt | 包含记录集的ODBC语句句柄。类型为HSTMT
m_nFields | 包含记录集中的字段数据成员数目。类型为UINT
m_nParams | 包含记录集中参数数据成员的数目。类型为UINT
m_pDatabase | 包含一个指向CDatabase对象的指针，提供该指针将记录集连接到一个数据源
m_strFilter | 包含一个CString，此对象指定一条结构式查询语言（SQL）的WHERE子句。此成员可用作一个过滤器，只选择符合某一标准的那些记录
m_strSort | 包含一个CString，此对象指定一条SQL ORDERBY子句。此成员可用于控制记录的排序

构造
CRecordset | 构造一个CRecordset对象。应用程序的派生类必须提供一个调用此函数的构造函数
Open | 通过检取记录集表示的表格或执行查询来打开记录集
Close | 关闭记录集和与此记录集相关联的ODBC HSTMT

记录集属性
CanAppend | 如果新记录可以通过
AddNew | 成员函数增加到记录集中，则该函数返回一个非零值
CanBookmark | 如果记录集支持书签则函数返回一个非零值
CanRestart | 如果可以调用Requery来再次运行记录集的查询，则该函数返回一个非零值
CanScroll | 如果应用程序可以滚动记录，则该函数返回一个非零值
CanTransact | 如果数据源支持事务，则该函数返回一个非零值
CanUpdate | 如果记录集可修改（应用程序可以增加、修改或删除记录），则该函数返回一个非零值
GetODBCFieldCount | 返回记录集中的字段数目
GetRecordCount | 返回记录集中的记录数目
GetStatus | 获取记录集的状态：读取记录的索引，以及是否已获取到记录的最终计数
GetTableName | 获取此记录集基于的表的名字
GetSQL | 获取用于选择记录集的记录的SQL字符串
IsOpen | 如果前面已经调用了Open函数，则此函数返回一个非零值
IsBOF | 如果记录集已经定位在第一个记录前，则此函数返回一个非零值
IsEOF | 如果记录集已经定位在最后一个记录后，则此函数返回一个非零值
IsDeleted | 如果记录集定位在一个已删除的记录上，则该函数返回一个非零值

记录集更新操作
AddNew | 为增加新记录作准备。调用Update来完成增加
CancelUpdate | 取消任何用AddNew或Edit操作指定的未决定的更新
Delete | 从记录集中删除当前记录。删除之后，应用程序必须显式地滚动到另一个记录
Edit | 为改变当前记录作准备。调用Update来完成编辑
Update | 通过将新数据或所编辑的数据保存到数据源上，来完成一次AddNew或Edit操作

记录集定位操作
GetBookMark | 将一个记录的标签值分配给该参数对象
Move | 将记录集双向定位到距离当前记录指定数目的记录的位置
MoveFirst | 定位当前记录为记录集中的第一个记录。该函数首先测试IsBOF
MoveLast | 定位当前记录为记录集中的最后一个记录。该函数首先测试IsEOF
MoveNext | 定位当前记录为记录集中的下一个记录。该函数首先测试IsEOF
MovePrev | 定位当前记录为记录集中的第一个记录。该函数首先测试IsBOF
SetAbsolutePosition | 将记录集定位到与指定的记录数相对应的位置
SetBookmark | 定位记录集到书签指定的位置

其他记录集操作
Cancel | 取消一次异步操作或一次来自第二线程的处理
FlushResultSet | 当使用一个预定义的查询时，如果有另外一个结果被获取，返回非零值
GetFieldValue | 返回记录集中的一个字段的值
GetODBCFieldInfo | 返回记录集中各字段的指定类别的信息
GetRowsetSize | 返回在一次单个获取中你要获取的记录数目
GetRowsFetched | 返回在一次获取中实际获取的行数
GetRowStatus | 返回在一次获取中行的状态
IsFieldDirty | 如果在当前记录中的指定字段被改变，则返回一个非零值
IsFieldNull | 如果当前记录中的指定字段是Null（没有值），则返回非零值
IsFieldNullable | 如果当前记录中的指定字段可被设置为Null（没有值），则返回非零值
RefreshRowset | 刷新指定行的数据和状态
Requery | 再次运行记录集的查询来刷新所选择的记录
SetFieldDirty | 标记当前记录中的指定字段是被改变的
SetFieldNull | 设置当前记录中的指定字段的值为Null（没有值）
SetLockingMode | 将加锁模式设置为“乐观”加锁（缺省值）或“悲观”加锁。确定任何更新加锁记录
SetParamNull | 将指定的参数设置为Null（没有值）
SetRowsetCursorPosition | 将游标定位在记录集中的指定行上

记录集重载函数
Check | 用来检查从一个ODBC API函数返回的代码
CheckRowSetError | 用来处理在获取记录期间产生的错误
DoBulkFieldExchange | 用来将一组数据行从数据源中交换到记录集中。实现成组记录交换（Bulk RFX）
DoFieldExchange | 用来在此记录集的字段数据成员和数据源上对应的记录之间交换数据（双向）。双向记录字段交换（RFX）
GetDefaultConnect | 用来获取缺省的字符串
GetDefaultSQL | 用来获取要执行的缺省的SQL字符串
OnSetOptions | 用来为指定的ODBC语句设置选项
SetRowsetSize | 指定在一次获取中你希望获取的记录数目


 CRecordset::AddNew

virtual void AddNew();
throw( CDBException );

说明：
此函数用来为向表中增加一个新记录作准备。你必须调用Requery成员函数来查看刚增加的记录。该记录的字段初始为Null（在数据库术语中，Null意味着“没有值”，与C++中的NULL不一样）。要完成增加操作，你必须调用Update成员函数。Update将应用程序的改变保存到数据源中。
注意：
如果你已经实现了成组读取，则你不能调用AddNow。这将导致失败的断言。虽然类CRecordset不提供用于更新成组数据行的机制，但是你可以使用ODBC API函数SQLSetPos来编写你自己的函数。有关如何做到这一点的例子，请参见DBEFETCH示例。
AddNew利用记录集的字段数据成员准备了一个新的空记录。在应用程序调用AddNew之后，你可以在记录集的字段数据成员中设置所想要的值（应用程序不必为此调用Edit函数；Edir仅用于已有记录）。当应用程序后来调用Update函数时，此字段数据成员中已改变的数据将被保存到数据源上。
警告：
如果你在调用Update之前滚动到一个新的记录，则该新记录丢失，并且不会给出警告。
如果数据源支持事务，则应用程序可以使AddNew调用成为一次事务的一部分。要获取更多有关事务的信息，请参见类CDatabase。值得注意的是，在调用AddNew之前你必须调用CDatabase::BeginTrans。
重点：
对于动态集，新记录增加到记录集中作为最后一个记录。新增加的记录不增加到快照中——应用程序必须调用Requery函数来刷新此记录集。
对一个未调用其Open函数的记录集，调用AddNew函数是不合法的。如果应用程序对一个不可向其插入新记录的记录集调用AddNew函数，则将抛出一个CDBException异常。应用程序可通过调用CanAppend函数来确定此记录集是否可以更新。

请参阅：
CRecordset::Edit, CRecordset::Delete, CRecordset::Update, CRecordset::Requery, CDatabase::BeginTrans, CDBException


 CRecordset::CanAppend

BOOL CanAppend() const;

返回值：
如果此记录集允许增加新记录，则该函数返回一个非零值；否则返回值为0。如果应用程序以只读方式打开此记录集，则CanAppend()将返回0。

说明：
此成员函数用来确定先前打开的记录集是否允许应用程序通过调用AddNew成员函数来增加新记录。

请参阅：
CRecordset::AddNew, CRecordset::Requery


 CRecordset::CanBookmark

BOOL CanBookmark() const;

返回值：
如果记录集支持书签则返回非零值；否则返回0。

说明：
此成员函数用来确定此记录集是否允许用书签来标记记录。此函数独立于Open成员函数的dwOptions参数中CRecordset::useBookmarks选项。CanBookmark表明给定的ODBC驱动器和游标类型是否支持书签。
如果支持书签，CRecordset::useBookmark表明书签是否会是有效的。
注意：单正向记录集不支持书签。

请参阅：
CRecordset::GetBookmark, CRecordset::SetBookmark


 CRecordset::Cancel

void Cancel();

说明：
此成员函数用来请求数据源取消一次正在进行的异步操作或者是一次来自第二线程的处理。值得注意的是，MFC ODBC类不再使用异步处理；要执行一次异步操作，你必须直接调用ODBC API函数SQLSetConnectOption。要获取更多的信息，请参见“ODBC SDK程序员指南”中的“异步执行函数”。


 CRecordset::CancelUpdate

void CancelUpdate();

说明：
此成员函数用来在调用Update之前，取消任何由Edit或AddNew引起的未决定的更新。
注意：
对于使用成组行检取的记录集，此成员函数不能使用，因为这样的记录集不能调用Edit，AddNew或Update。
如果能够进行自动检查脏字段，则CancelUpdate将把成员变量的值恢复到调用Edit或AddNew之前的值；如果不支持自动检查，则改变后的任何值都被保留。
缺省的，当记录集被打开时，自动字段检查是有效的。为了使它无效，你必须指定Open成员函数的dwOption参数中的CRecordset::noDirtyFieldCheck。

请参阅：
CRecordset::AddNew, CRecordset::Edit, CRecordset::Update


 CRecordset::CanRestart

BOOL CanRestart() const;

返回值：如果允许查询则返回非零值；否则返回0。

说明：
此成员函数用来确定记录集是否允许通过调用Requery成员函数来重新开始它的查询（刷新它的记录）。

请参阅：CRecordset::Requery


 CRecordset::CanScroll

BOOL CanScroll() const;

返回值：
如果记录集允许滚动则返回非零值；否则返回0。

说明：
此成员函数用来确定记录集是否允许滚动。


 CRecordset::CanTransact

BOOL CanTransact() const;

返回值：
如果记录集支持事务，则返回一个非零值；否则，返回值为0。

说明：
此成员函数用来确定此记录集是否支持事务。

请参阅：
CDatabase::BeginTrans, CDatabase::CommitTrans, CDatabase::Rollback


 CRecordset::CanUpdate

BOOL CanUpdate() const;

返回值：
如果记录集可更新，则返回一个非零值；否则，返回值为0。

说明：
此成员函数用来确定此记录集是否可更新。
如果基本数据资源只读或如果当你打开记录集在dwOptions参数中指定CRecordset:: readOnly时，一个记录集可能为只读。

请参阅：
CRecordset::Open, CRecordset::AddNew, CRecordset::Edit, CRecordset::Delete, CRecordset::Update


 CRecordset::Check

virtual BOOL Check( RETCODE nRetCode ) const;

返回值：
如果nRetCode的值是SQL_SUCCESS，SQL_SUCCESS_WITH_INFO，SQL_NO_DATA_ FOUND或SQL_NEED_DATA，则返回非零值；否则返回0。

参数：
nRetCode 是一个ODBC API 函数的返回代码。有关的细节，请参见说明部分。

说明：
此成员函数用来检查从一个ODBC API函数返回的代码。下面的列表给出了nRetCode可能的值：
NretCode | Description
SQL_SUCCESS | 函数成功完成；没有其它的可用信息
SQL_SUCCESS_WITH_INFO | 函数成功完成，可能有一个非致命的错误。通过调用SQLError可以获得更多的信息
SQL_NO_DATA_FOUND | 获取了来自结果集的所有行
SQL_ERROR | 函数失败。调用SQLError可以获得更多的信息
SQL_INVALID_HANDLE | 函数失败，这是由于一个无效的环境句柄、连接句柄或语句句柄。这表明有一个程序错误。从SQLError无法获得其它的信息
SQL_STILL_EXECUTING | 一个异步开始的函数仍然在执行。值得注意的是，缺省的MFC从来都不会将这个值传递给Check，因为MFC只使用同步处理
SQL_NEED_DATA | 当处理一个语句时，驱动器决定应用程序需要发送参数数据值
如果要获取更多关于SQLError的信息，请参见“ODBC SDK程序员指南。”

示例：参见宏AFX_ODBC_CALL。

请参阅：AFX_ODBC_CALL


 CRecordset::CheckRowsetError

virtual void CheckRowsetError( RETCODE nRecCode )；

参数：
nRetCode 一个ODBC API函数返回代码。要获取细节，请参见说明部分。

说明：
此虚成员函数用来处理当记录被获取时发生的错误，在成组行处理中它也适用。你可以重载CheckRowsetError来执行你自己的错误处理。
在一次游标导航操作（如Open，Requery或是任何Move操作）中，CheckRowsetError是被自动调用的。它被作为ODBC API函数SQLEetendedFetch的返回值传递。下面的列表给出了nRetCode参数的可能取值：
NretCode | Description
SQL_SUCCESS | 函数成功完成；没有其它的可用信息
SQL_SUCCESS_WITH_INFO | 函数成功完成，可能有一个非致命的错误。通过调用SQLError可以获得更多的信息
SQL_NO_DATA_FOUND | 获取了来自结果集的所有行
SQL_ERROR | 函数失败。调用SQLError可以获得更多的信息
SQL_INVALID_HANDLE | 函数失败，这是由于一个无效的环境句柄、连接句柄或语句句柄。这表明有一个程序错误。从SQLError无法获得其它的信息
SQL_STILL_EXECUTING | 一个异步开始的函数仍然在执行。值得注意的是，缺省的，MFC从来都不会将这个值传递给CheckRowsetError，MFC将继续调用SQLEetendedFetch，直到它不再返回SQL_STILL_EXECUTING

请参阅：
CRecordset::DoBulkFieldExchange, CRecordset::GetRowsetSize, CRecordset::SetRowsetSize, CRecordset::Move


 CRecordset::Close

virual void Close();

说明：
此成员函数用来关闭记录集。ODBC HSTMT和框架分配给这个记录集的内存都将被释放。通常在调用Close之后，如果此C++记录集对象是用new分配的，则由应用程序来负责删除它。
在调用Close之后，应用程序可再次调用Open函数。这使应用程序可复用此对象。另一方式是调用Requery。

示例：
// CRecordset::Close的示例：
// 构造一个快照对象
CCutSet rsCustSet( NULL );
if ( !rsCustSet.Open( ) ) return FALSE;
// 适用快照…
// 关闭快照
rsCustSet.Clost( );
// 当函数退出时，调用析构函数

请参阅：
CRecordset::CRecordset, CRecordset::Open, CRecordset::Requery


 CRecordset::CRecordset

CRecordset( CDatabase* pDatabase = NULL );

参数：
pDatabase 包含一个执行CDatabase对象的指针，或者是值为NULL。如果不是NULL，并且还没有调用CDatabase对象的Open成员函数来将它连接到数据源上，则记录集试图在它自己的Open调用期间为应用程序打开此CDatabase对象。如果此参数为NULL，则当应用程序利用ClassWizard来派生自己的记录集类时，将使用应用程序所指定的数据源信息来构造并连接一个CDatabase对象。

说明：
此成员函数用来构造一个CRecordset对象。应用程序的记录集对象必须是从CRecordset派生的应用程序专用类的对象。可以利用ClassWizard来派生应用程序自己的记录集类。
注意：
应用程序的派生类必须提供它自己的构造函数。在此构造函数中，需要传递适当的参数来调用构造函数CRecordset::CRecordset。
传递NULL参数给你的记录集构造函数，可以为应用程序自动构造并连接一个CDatabase对象。这是一种有用的简捷方式，它不需要应用程序在构造自己的记录集之前构造并连接一个CDatabase对象。

请参阅：
CRecordset::Open, CRecordset::Close


 CRecordset::Delete

virtual void Delete();
throw(CDBException);

说明：
此成员函数用来删除当前记录。在成功删除之后，此记录集的字段数据成员被设置为NULL值，并且应用程序必须显式地调用一个Move函数来移走所删除的记录。一旦移走了被删除的记录，就不能再恢复它。如果数据源支持事务，则可以使Delete调用成为一次事务的一部分。
注意：
如果你已经实现了成组读取，则不能调用Delete。这会导致一个失败断言。虽然类CRecordset不提供用于更新成组数据行的机制，但是你可以使用ODBC API函数SQLSetPos来编写你自己的函数。有关如何做到这一点的例子，请参见DBEFETCH示例。
警告：
当你调用Delete时，记录集必须被更新，并且当前在记录集中必须有有效的记录；否则将发生错误。例如，如果你删除了一个记录，但是在你再次调用Delete之前没有滚动到一个新的记录，则Delete会抛出一个CDBException。与AddNew和Edit不同，Delete调用后不跟Update调用。如果Delete调用失败，字段数据成员将保持不变。

示例：
这个例子说明了如何在一个函数框架上创建一个记录集。该例子假定m_dbCust存在，一个CDatabase类型的成员变量已经连接到数据源上。
// 创建一个派生的CRecordset对象
CCustSet rsCustSet( &m_dbCust );
rsCustSet.Open( );
if( rsCustSet.IsEOF() || !rsCustSet.CanUpdate() || !rsCustSet.CanTransact() ) return;
if( !m_dbCust.BeginTrans( ) )
{
// Do something to handle a failure
}
else
{
// Perhaps scroll to a new record ...
// Delete the current record
rsCustSet.Delete( );
// ...
// Finished commands for this transaction
if( )
m_dbCust.CommitTrans( );
else // User changed mind
m_dbCust.Rollback( );
}
// ...

请参阅：
CDatabase::BeginTrans, CDatabase::CommitTrans, CDatabase::Rollback, CDBException


 CRecordset::DoBulkFieldExchange

virtual void DoBulkFieldExchange( CFieldExchange* pFX );
throw( CDBException );

参数：
pFX 一个指向一个CFileExchange对象的指针。框架已经设置了这个对象来为字段交换操作指定一个环境。

说明：
当实现了成组行处理时，框架调用这个成员函数来将数据从数据源自动传输到你的记录集对象。DoBulkFieldExchange还将应用程序的参数数据成员（如果有的话）与记录集选择的SQL语句字符串中的参数占位符绑定。
如果还没有实现成组行读取，则框架调用DoFieldExchange。为了实现成组行读取，你必须指定Open成员函数中的dwOptions参数的CRecordset::useMultiRowFetch选项。
注意：
只有在你正使用一个从CRecordset派生来的类时，DoBulkFieldExchange才是可用的。如果你已经直接从CRecordset创建了一个记录集对象，则你必须调用GetFieldValue成员函数来获取数据。
成组记录字段交换（Bulk RFX）与记录字段交换（RFX）类似。数据被自动地从数据源传输到一个记录集对象。但是，你不能调用AddNew，Edit，Delete或Update来将改变传输回数据源。目前类CRecordset不提供用于更新数据成组行的机制；但是，你可以用ODBC API函数SQLSetPos来编写你自己的函数。
值得注意的是，ClassWizard不支持成组记录字段交换（RFX）；因此，你必须通过调用Bulk RFX函数来手动重载DoBulkFieldExchange。如果要获取更多关于这些函数的信息，请参见“Visual C++联机文档”中的“记录字段交换函数”。
如果要得到一个有关如何实现成组记录字段交换的例子，请参见DBFETCH示例。要获取更多关于成组行读取的信息，请参见“Visual C++程序员指南”中的文章“记录集：按组读取记录”（ODBC）。

请参阅：
CRecordset::m_nFields, CRecordset::m_nParams, CRecordset::DoFieldExchange, CRecordset::GetFieldValue, CFieldExchange, Record Field Exchange Functions


 CRecordset::DoFieldExchange

virtual void DoFieldExchange( CFieldExchange* pFX );
throw( CDBException );

参数：
pFX是一个指向CFielsExchange对象的指针。框架已经为字段交换操作设置了这个对象来指定一个环境。

说明：
当还没有实现成组行读取时，框架调用这个成员函数来在记录集的字段数据成员和数据源的当前记录的相应列之间自动进行数据交换。DoFieldExchange还将应用程序的参数数据成员（如果有的话）与记录集选择的SQL语句字符串中的参数占位符绑定。
如果已经实现了成组行读取，则框架调用DoBulkFieldExchange。为了实现成组行读取，你必须指定Open成员函数中的dwOptions的CRecordset::useMultiRowFetch选项。
注意：
只有在你正使用一个从CRecordset派生来的类时DoBulkFieldExchange才是有效的。如果你已经直接从CRecordset创建了一个记录集对象，你必须调用GetFieldValue成员函数来检取数据。字段数据的交换，被称为记录字段交换（RFX），可以双向工作：从记录集对象的字段数据成员到数据源的记录的字段，或者从数据源中的记录到记录集对象。
应用程序为实现应用程序派生记录集类的DoFieldExchange函数，一般必须执行的唯一动作是用ClassWizard创建此派生记录集类，并指定字段数据成员的名字和数据类型。应用程序也可以增加代码到ClassWizard编写的代码中，以指定参数数据成员或处理应用程序动态连接的任何列。
当你用ClassWizard声明你的记录集类的时候，该向导会为你重载DoFieldExchange，这类似于下面的例子：
void CCustSet::DoFieldExchange(CFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CCustSet)
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_Text(pFX, "Name", m_strName);
RFX_Int(pFX, "Age", m_wAge);
//}}AFX_FIELD_MAP
}
要获取更多有关RFX函数的信息，请参见“Visual C++联机文档”中的文章“记录字段交换：RFX是如何工作的”。

请参阅：
CRecordset::m_nFields, CRecordset::m_nParams, CRecordset::DoBulkFieldExchange, CRecordset::GetFieldValue, CFieldExchange, Record Field Exchange Functions


 CRecordset::Edit

virtual void Edit();
throw( CDBException, CMemoryException );

说明：
此成员函数用来支持对当前记录的修改。当应用程序调用Edit之后，就可以通过直接重新设置字段数据成员的值来改变它们。当后来应用程序重新调用Update成员函数来将这些改变保存到数据源上时，这次操作才算完成。
注意：
如果你已经实现了成组行读取，你就不能调用Edit。这将导致一个失败断言。虽然类CRecordset不提供用于更新成组数据行的机制，但是你可以使用ODBC API函数SQLSetPos来编写你自己的函数。有关如何做到这一点的例子，请参见DBEFETCH示例。
Edit保存记录集的数据成员的值。如果你调用了Edit，进行了改变，然后再调用Edit，则记录的值被恢复到第一次调用Edit之前的值。
在某些情况下，你可能会想通过将一个列置为Null来更新它。要实现这一点，可以使用TRUE为参数调用SetFieldNull函数，来标记此字段为Null；这样也使此字段表列被更新。如果你想要将某一字段写入数据源，即使是它的值没有改变，则可以使用TRUE为参数调用SetFieldDirty函数。即使此字段的值为Null，这也同样可行。
如果数据源支持事务，则应用程序可以让Edit成为事务的一部分。值得注意的是，你应当在调用Edit之前，但在打开记录集之后，调用CDatabase::BeginTrans函数。还要注意，调用CDatabase::CommitTrans并不能代替调用Update来完成Edit操作。要获取有关事务的更多信息，请参见CDatabase类。
根据当前的加锁方式，正被更新的记录可能被Edit加锁，直到应用程序调用Update或滚动到另一个记录；也可能它只在Edit调用期间被加锁。你可以利用SetLocking Mode来改变加锁方式。
如果应用程序在调用Update之前滚动到了一个新的记录，则恢复当前记录的先前值。如果对一个不可修改的记录集调用Edit，或没有当前记录，则将抛出一个CDBException异常。

示例：
// CRecordset::Edit的示例：
// 编辑一个记录
// 首先设置编辑缓存
// rsCustSet.Edit();
// 然后编辑记录的字段数据成员
rsCustSet.m_dwCustID = 2795;
rsCustSet.m_strCustomer = "ones Mfg";
// 最后，完成此操作
if ( !rsCustSet.Update() )
// 处理更新失败

请参阅：
CRecordset::Update, CRecordset::AddNew, CRecordset::Delete, CRecordset::SetFieldDirty, CRecordset::SetFieldNull, CRecordset::CanUpdate, CRecordset::CanTransact, CRecordset::SetLockingMode


 CRecordset::FlushResultSet

BOOL FlushResultSet() const;
throw( CDBException );

返回值：
如果获取了多个结果集，则返回非零值；否则返回0。

说明：
此成员函数用来获取一个预定义的查询（被保存的过程）的下一个结果集，如果有多个结果集的话。只有在你完全完成了对在当前结果集上的游标的处理时，你才应该调用FlushResultSet。值得注意的是，当你通过调用FlushResultSet获取下一个结果集时，则在那一个结果集上的游标就无效了；你应当在调用FlushResultSet之后调用MoveNext成员函数。
如果一个预定义的查询使用了输出参数或者是输入/输出参数，则为了得到这些参数的值，你必须一直调用FlushResultSet直到它返回FALSE（值0）。
FlushResultSet调用了ODBC API函数SQLMoreResults。如果SQLMoreResults返回SQL_ERROR或SQL_INVALID_HANDLE，则FlushResultSet将抛出一个异常。要获取有关SQLMoreResults的更多信息，请参见“ODBC SDK程序员参考”。

示例：
下面的例子假定COutParamRecordset是一个基于预定义查询的Crecordset的派生对象，该查询具有一个输入参数和一个输出参数，并且有多个结果集。注意DoFieldExchange重载的结构。
// DoFieldExchange重载
// 只有在处理参数装订时才有必要。
// 不要使用有边界字段的CRecordset派生类，除非所有的结果集具有相同的概要或者是有条件的装订代码。
void COutParamRecordset::DoFieldExchange( CFieldExchange* pFX )
{
pFX->SetFieldType( CFieldExchange::outputParam );
RFX_Long( pFX, "Param1", m_nOutParamInstructorCount );
// 在此“Param1”名字是一个从未使用过的假名。
pFX->SetFieldType( CFieldExchange::inputParam );
RFX_Text( pFX, "Param2", m_strInParamName );
// 在此“Param2”名字是一个从未使用过的假名。
}
// 现在实现COurParamRecordset。
// 假定db是一个已经打开的数据库对象。
COutParamRecordset rs( &db );
rs.m_strInParamName = _T("Some_Input_Param_Value");
// 获取第一个结果集
// 注意：对于返回多行集合的存储过程来说，SQL Server需要只能前进类型的游标。
// 过程
rs.Open( CRecordset::forwardOnly, "{? = CALL GetCourses( ? )}", CRecordset::readOnly);
// 在第一个结果集中循环通过所有的数据
while ( !rs.IsEOF( ) )
{
CString strFieldValue;
for( int nIndex = 0; nIndex < rs.GetODBCFieldCount( ); nIndex++ )
{
rs.GetFieldValue( nIndex, strFieldValue );
// TO DO: Use field value string.
}
rs.MoveNext();
}
// 获取其它的结果集...
while( rs.FlushResultSet( ) )
{
// 由于游标无效，必须定义MoveNext
rs.MoveNext( );
while ( !rs.IsEOF() )
{
CString strFieldValue;
for( int nIndex = 0; nIndex < rs.GetODBCFieldCount( ); nIndex++ )
{
rs.GetFieldValue( nIndex, strFieldValue );
// TO DO: 使用的字段值字符串。
}
rs.MoveNext( );
}
}
// 所有的结果集都满了。不能使用该游标了，但是已经写入了输出参数m_nOutParamInstructorCount。
// 注意，要直到CRecordset::FlushResultSet返回FALSE，这表明不会再返回更多的结果集，这时m_nOutParamInstructorCount才无效。
// TO DO: 使用m_nOutParamInstructorCount
// 清除
rs.Close( );
db.Close( );

请参阅：CFieldExchange::SetFieldType


 CRecordset::GetBookmark

void GetBookmark( CDBVariant& varBookmark );
throw( CDBException, CMemoryException );

参数：
varBookmark 一个指向CDBVariant对象的引用，该对象代表在当前记录上的书签。

说明：
此成员函数用来获得当前记录的书签值。要确定此记录集是否支持书签，调用CanBookmark。如果支持书签，应用程序要使书签有效，就必须设置Open成员函数中的dwOptions的CRecordset::useBookmarks选项。
注意：
如果不支持书签或者是书签无效，调用GetBookmark将导致抛出一个异常。在只向前的记录集中是不支持书签的。
GetBookmark将当前记录的书签值分配给一个CDBVariant对象。在移动到另一个记录之后，要返回原来的记录，可以用相应的CDBVariant对象来调用SetBookmark。
注意：
在进行了一定的记录集操作后，书签也许就不再有效了。例如，如果你在调用GetBookmark之后接着调用了Requery，你也许就不能再用SetBookmark返回原来的记录了。调用CDatabase::GetBookmarkPersistence来检查你是否能够安全地调用SetBookmark。

请参阅：
CRecordset::CanBookmark, CRecordset::SetBookmark, CDatabase::GetBookmarkPersistence


 CRecordset::GetDefaultConnect

virtual CString GetDefaultConnect( );

返回值：返回一个包含缺省连接字符串的CString。

说明：
框架调用此成员函数来获取此记录集所基于的数据源的缺省连接字符串。ClassWizard通过在ClassWizard中标识与应用程序所使用的相同数据源来获取有关表和列的信息，为应用程序实现GetDefaultConnect函数。你可能会发现依赖这样的缺省连接来开发应用程序是很方便的。但是缺省连接可能不适合于你的用户。如果是这种情况，你就应该重新实现GetDefaultConnect，放弃ClassWizard的版本。


 CRecordset::GetDefaultSQL

virtual CString GetDefaultSQL( );

返回值：
返回一个包含缺省的SQL语句的CString。

说明：
框架调用此成员函数来获取此记录集基于的缺省的SQL语句。它可能是一个表名，也可能是一条SQL SELECT语句。
你可以通过使用ClassWizard来声明自己的记录集类，来间接地定义缺省的SQL语句。ClassWizard会为你实现这项工作。
如果你需要自己的SQL语句串，就调用GetSQL，它返回用来选择记录集的记录的SQL语句，如果记录集是打开的话。你可以在你的类的GetDefaultSQL重载中编辑你的SQL字符串。例如，你可以使用一个CALL语句来指定对一个预定义的查询的调用。
警告：
如果框架不能标识一张表的名字或提供了多个表名，亦或不能插入一个CALL语句，则表名将是空的。注意，当使用CALL语句时，你不能在弯括号和CALL关键字之间插入空格，也不能在弯括号之前或者是SELECT语句中的SELECT关键字之前插入空格。

请参阅：CRecordset::GetSQL


 CRecordset::GetFieldValue

void GetFieldValue( LPCTSTR lpszName, CDBVariant& varValue, short nFieldType = DEFAULT_FIELD_TYPE );
throw( CDBException, CMemoryException );
void GetFieldValue( short nIndex, CDBVariant& varValue, short nFieldType = DEFAULT_FIELD_TYPE );
throw( CDBException, CMemoryException );
void GetFieldValue( short nIndex, CStringA& strValue );
throw( CDBException, CMemoryException );
void GetFieldValue( short nIndex, CStringW& strValue );
throw( CDBException, CMemoryException );

参数：
lpszName | 一个字段的名字。
varValue | 一个指向CDBVariant对象的引用，该对象将用来保存字段的值。
nFieldType字段的ODBC C数据类型。缺省值DEFAULT_FIELD_TYPE强迫GetFieldValue根据下面的表格确定与SQL数据类型相对应的C数据类型。或者，你可以直接指定数据类型或选择一个兼容的数据类型；例如，你可以将任何数据类型保存到SQL_C_CHAR中。
C 数据类型 | SQL 数据类型
SQL_C_BIT | SQL_BIT
SQL_C_UTINYINT | SQL_TINYINT
SQL_C_SSHORT | SQL_SMALLINT
SQL_C_SLONG | SQL_INTEGER
SQL_C_FLOAT | SQL_REAL
SQL_C_DOUBLE | SQL_FLOAT SQL_DOUBLE
SQL_C_TIMESTAMP | SQL_DATE SQL_TIME SQL_TIMESTAMP
SQL_C_CHAR | SQL_NUMERIC SQL_DECIMAL SQL_BIGINT SQL_CHAR SQL_VARCHAR SQL_LONGVARCHAR
SQL_C_BINARY | SQL_BINARY SQL_VARBINARY SQL_LONGVARBINARY
有关ODBC数据类型的更多信息，参见“ODBC SDK程序员参考”的附录D中的“SQL数据类型”和“C数据类型”。
nIndex | 字段从零开始的索引。
strValue | 一个指向CString对象的引用，该对象将把字段的值保存为文本，而不管字段的数据类型。

说明：
此成员函数用来获取当前记录中的字段数据。你可以用名字或者索引来查找一个字段。也可以把字段值保存在一个CDBVariant对象或一个CString对象中。
如果你已经实现了成组行读取，则在一个行集中的当前记录总是被定位在第一个记录。要在一个给定的行集中对一个记录使用GetFieldValue，必须首先调用SetRowsetCursorPosition成员函数来将游标移动到行集中所希望的行上。然后为这一行调用GetFieldValue。要实现成组行读取，你必须指定Open成员函数中的dwOptions参数的CRecordset::useMultiRowFetch选项。
你可以使用GetFieldValue在运行时动态地读取字段，而不是在设计时静态地装订它们。例如，如果你已经直接从CRecordset声明了一个记录集对象，你就必须使用GetFieldValue来获取字段数据；记录字段交换（RFX），或者是成组记录字段交换（Bulk RFX）还没有实现。
注意：
如果你声明了一个记录集对象，而不是从CRecordset派生，则不被装载ODBC游标库。此游标库要求记录集至少有一个边界列；但是，当你直接使用CRecordset时，没有一个列是边界。成员函数CDatabase::OpenEx和CDatabase::Open控制游标库是否被装载。
GetFieldValue调用ODBC API函数SQLGetData。如果你的驱动器为字段值的实际长度输出值SQL_NO_TOTAL，GetFieldValue抛出一个异常。关于SQLGetData的更多消息，参见“ODBC SDK程序员参考”。

示例：
下面的例子代码说明如何为一个直接从CRecordset声明的记录集对象调用GetFieldValue。
// 创建并打开一个数据库对象；
// 不要装载游标库
CDatabase db;
db.OpenEx( NULL, CDatabase::forceOdbcDialog );
// 直接从CRecordset创建并打开一个记录集对象。
// 注意在一个被连接的数据库中必须存在一个表。
// 使用仅向前类型的记录集以获得最佳的性能，因为值需要MoveNext函数。
CRecordset rs( &db );
rs.Open( CRecordset::forwardOnly, _T( "SELECT * FROM SomeTable" ) );
// 创建一个CDBVariant对象来保存字段数据
CDBVariant varValue;
// 在记录集中循环，使用GetFieldValue 和GetODBCFieldCount 来获取所有列中的数据
short nFields = rs.GetODBCFieldCount( );
while( !rs.IsEOF( ) )
{
for( short index = 0; index < nFields; index++ )
{
rs.GetFieldValue( index, varValue );
// 对varValue作某些操作。
}
rs.MoveNext( );
}
rs.Close( );
db.Close( );

注意：
与DAO类CDaoRecordset不一样，CRecordset没有SetFieldValue成员函数。如果你直接从CRecordset创建了一个对象，它实际上是只读的。

请参阅：
CRecordset::DoFieldExchange, CRecordset::DoBulkFieldExchange, CRecordset::GetODBCFieldCount, CRecordset::GetODBCFieldInfo, CRecordset::SetRowsetCursorPosition


 CRecordset::GetODBCFieldCount

short GetODBCFieldCount() const;

返回值：数据集中的字段数。

说明：
此成员函数用来获取记录集中的字段总数。

请参阅：CRecordset::GetFieldValue


 CRecordset::GetODBCFieldInfo

void GetODBCFieldInfo( LPCTSTR lpszName, CODBCFieldInfo& fieldinfo );
throw( CDBException );
void GetODBCFieldInfo( short nIndex, CODBCFieldInfo& fieldinfo );
throw( CDBException );

参数：
lpszName | 字段的名字。
fieldinfo | 一个指向CODBCFieldInfo结构的引用。
nIndex | 字段从零开始的索引。

说明：
此成员函数用来获取记录集中的字段的信息。此函数的一个版本可以让你用名字来查找一个字段。另一个版本让你用索引来查找一个字段。
有关返回信息的描述，参见CODBCFieldInfo结构。

请参阅：
CRecordset::GetFieldValue, CODBCFieldInfo


 CRecordset::GetRecordCount

long GetRecordCount() const;

返回值：
记录集中记录的数目。如果记录集中不包含记录，则为0，如果不能确定记录的个数，则为－1。

说明：
调用这个函数以确定记录集的大小。
警告：
记录计数保持为“顶点标记”——当用户移动记录时可以看见的最高编号的记录。记录总数仅在用户已经移动过最后一个记录时才可知。
由于性能原因，在应用程序中调用MoveLast时，记录计数不被更新。要想自己更新计数记录，可重复调用MoveNext函数，直到IsEOF返回一个非零值。通过CRecordset:AddNew来加入一个新的记录，并用Update来增加计数。通过CRecordset:Delete来删除一个记录并减小计数。

请参阅：
CRecordset::MoveLast, CRecordset::MoveNext, CRecordset::IsEOF, CRecordset::GetStatus


 CRecordset::GetRowsetSize

DWORD GetRowsetSize() const;

返回值：
返回在一次给定的检取操作中所获取的行数。

说明：
此成员函数用来获取关于你希望在一次给定的检取操作中获取的行数的设置。如果你使用成组行检取，记录集被打开时的缺省行集大小为25；否则为1。
为了实现成组行检取，你必须在Open成员函数的dwOptions参数中指定CRecordset::useMultiRowFetch选项。如果要改变关于行集大小的设置，调用SetRowsetSize。

请参阅：
CRecordset::Open, CRecordset::SetRowsetSize, CRecordset::CheckRowsetError, CRecordset::DoBulkFieldExchange


 CRecordset::GetRowsFetched

DWORD GetRowsFetched( ) const;

返回值：
在执行了指定的检取操作后从数据源获取的行数。

说明：
调用这个成员函数以确定在检取后实际获得了多少记录。当你实现成组行检取的时候，这是非常有用的。行集大小通常指定了在一次检取中会获得多少行记录，但是，记录集中记录的总数也会影响能在行集中获取的行数。例如，如果你的记录集中有10条记录，行集大小被设为4，那么在记录集中循环调用MoveNext会导致最后一个行集中只有2条记录。
为了实现成组行检取，你必须在Open成员函数的dwOptions参数中指定CRecordset::useMultiRowFetch选项。如果要指定行集大小，调用SetRowsetSize。

示例：
MultiRowSet rs;

// 设置行集大小
rs.SetRowsetSize( 5 );

// 打开记录集
rs.Open( CRecordset::dynaset, NULL, CRecordset::useMultiRowFetch );

// 在记录集中循环
while( !rs.IsEOF( ) )
{
for( int rowCount = 0; rowCount < (int)rs.GetRowsFetched( ); rowCount++ )
{
// 作某些操作
}
rs.MoveNext( );
}
rs.Close( );

请参阅：
CRecordset::SetRowsetSize, CRecordset::CheckRowsetError


 CRecordset::GetRowStatus

WORD GetRowStatus(WORD wRow) const;

返回值：行的状态值。有关细节参见说明部分。

参数：
wRow 该行在记录集中的位置，从1开始计算。这个值的范围是从1到行集的大小。

说明：
调用这个函数以获得当前行集中某行的状态。GetRowStauts返回一个值，指明了自最近一次从数据源中获取数据以来，行的状态是否有了变化，或者指明没有检取到与wRow对应的记录。下面的表格列出了可能的返回值。
状态值 | 描述
SQL_ROW_SUCCESS | 该行没有发生变化
SQL_ROW_UPDATED | 该行已经被更新
SQL_ROW_DELETED | 该行已经被删除
SQL_ROW_ADDED | 该行已经被加入
SQL_ROW_ERROR | 由于发生了错误，无法获得该行
SQL_ROW_NOROW | 没有与wRow对应的行
更多的信息参见“ODBC SDK程序员参考”中的ODBC API函数SQLExtendedFetch。

请参阅：
CRecordset::CheckRowsetError, CRecordset::GetRowsFetched, CRecordset::RefreshRowset


 CRecordset::GetSQL

const CString& GetSQL( ) const;

返回值：
对包含了SQL语句的CSting的const引用。

说明：
调用这个成员函数以获取SQL语句，该语句用于在记录集打开时选择记录集中的记录。这通常是一个SQL SELECT语句。由GetSQL返回的字符串是只读的。由GetSQL返回的字符串通常与你在Open成员函数的lpszSQL参数中传递给记录集的字符串不同。这是因为记录集根据你传递给Open的选项、通过ClassWizard指定的选项、在m_strFilter和m_strSort数据成员中指定的选项以及指定的其它任何参数来构造一个完整的SQL语句。
重点：在调用Open以后调用这个成员函数。

请参阅：
CRecordset::GetDefaultSQL, CRecordset::Open, CRecordset::m_strFilter, CRecordset::m_strSort


 CRecordset::GetStatus

void GetStatus( CRecordsetStatus& rStatus ) const;

参数：
rStatus 对一个CRecordsetStatus对象的引用。更多的信息参见说明部分。

说明：
调用这个函数以确定记录集中的当前记录的索引，并（或）确定是否已看见最后一个记录。CRecordset试图跟踪索引，但是在某些情况下可能无法做到。有关解释参见GetRecordCount函数。CRecordsetStatus 结构具有如下形式：
struct CRecordsetStatus
{
long m_lCurrentRecord;
BOOL m_bRecordCountFinal;
};

CRecordsetStatus的两个成员的含义如下：
· | m_lCurrentRecord | 包含了记录集中当前记录的索引（从零开始），如果可知的话。如果不能确定索引，则该成员中包含AFX_CURRENT_RECORD_UNDEFINED（-2）。如果IsBOF为TRUE（空记录集或试图滚动到第一个记录之前），m_lCurrentRecord将被设为AFX_CURRENT_RECORD_BOF（－1）。如果是在第一个记录，它被设为0，第二个记录被设为1，等等。
· | m_bRecordCountFinal | 如果记录集中记录的总数已经确定，则为非零值。通常这个必须通过在记录集头开始并调用MoveNext，直到IsEOF返回非零值。如果这个成员为0，则该记录计数就是GetRecordCount返回的值，如果不是-1，就只是记录的“顶点标记”计数。

请参阅：CRecordset::GetRecordCount


 CRecordset::GetTableName

const CString& GetTableName( ) const;

返回值：
如果记录集是基于一个表格的，则返回值为对包含了表格名字的CString的const引用。否则是一个空字符串。

说明：
调用这个函数以获取SQL表的名字，记录集查询是基于这个表的。只有当记录集是基于一个表，而不是多个表的连接或者预定义的查询（存储过程）时，GetTableName才是有效的。这个表名是只读的。
重点：在调用了Open以后调用这个成员函数。


 CRecordset::IsBOF

BOOL IsBOF( ) const;

返回值：
如果记录集不包含记录或者程序已经向后滚动到第一个记录之前，则返回一个非零值；否则返回值为0。

说明：
在记录之间滚动之前调用这个函数，以确定是否已经到了记录集的第一条记录之前。你也可以与IsEOF一起使用IsBOF函数来确定记录集中是否包含记录，或者为空。在调用Open之后，如果记录集不包含记录，IsBOF返回非零值。当你打开一个至少具有一条记录的记录集时，第一个记录成为当前记录，IsBOF返回0。
如果当前记录为第一条记录并且你调用了MovePrev，IsBOF将随后返回一个非零值。如果IsBOF返回非零值并且你调用了MovePrev，将会发生错误。如果IsBOF返回非零值，则当前记录没有定义，所有需要当前记录的操作将会导致错误。

示例：
这个例子在双向滚动记录集时使用IsBOF和IsEOF来检测记录集的界限。
// 打开一个记录集，第一条记录是当前记录。
CCustSet rsCustSet( NULL );
rsCustSet.Open( );
if( rsCustSet.IsBOF( ) ) return; // 记录集为空。
// 滚动到记录集的尾部，越过最后一条记录，因此没有当前记录。

while ( !rsCustSet.IsEOF( ) ) rsCustSet.MoveNext( ); // 移动到最后一条记录
rsCustSet.MoveLast( );
// 滚动到记录集的头部，在第一条记录之前，因此没有当前记录。

while( !rsCustSet.IsBOF( ) ) rsCustSet.MovePrev( ); // 第一条记录又成了当前记录。
rsCustSet.MoveFirst( );

请参阅：
CRecordset::IsEOF, CRecordset::MoveFirst, CRecordset::MovePrev


 CRecordset::IsDeleted

BOOL IsDeleted( ) const;

返回值：
如果记录集被定位在一个被删除的记录上则返回非零值；否则返回0。

说明：
调用这个函数以确定当前记录是否已被删除。如果你滚动到一条记录，IsDeleted返回TRUE（非零值），在你能够执行任何记录集操作之前，你必须先滚动到其它记录。
注意IsDeleted的结构依赖于许多因素，例如你的记录集的类型，记录集是否可更新，在打开记录集时是否指定了CRecordset::skipDeletedRecords选项，驱动程序是否压缩被删除的记录，以及是否有多个用户。
有关CRecordset::skipDeletedRecords和驱动程序压缩的更多信息参见Open成员函数。
注意：
如果你实现了成组行读取，你不能调用IsDeleted，而应该调用GetRowStatus成员函数。

请参阅：
CRecordset::Delete, CRecordset::IsBOF, CRecordset::IsEOF


 CRecordset::IsEOF

BOOL IsEOF( ) const;

返回值：
如果记录集中不包含记录或者程序已经滚动到最后一个记录之后，则返回非零值；否则返回0。

说明：
当应用程序在记录之间滚动时，调用这个成员函数来确定应用程序是否已滚动超出了记录集的最后一个记录。你也可以使用IsEOF来确定记录集中是包含了记录还是为空。在调用了Open以后，如果记录集不包含记录，IsEOF返回非零值。当你打开一个至少具有一条记录的记录集的时候，第一条记录成为当前记录，IsEOF返回0。
如果在你调用MoveNext的时候，当前记录是最后一条记录，IsEOF将会返回一个非零值。如果IsEOF返回非零值并且你调用了MoveNext，将会产生一个错误。如果IsEOF返回非零值，则当前记录未定义，并且任何需要当前记录的操作将会导致错误。

示例：参见IsBOF的例子。

请参阅：
CRecordset::IsBOF, CRecordset::MoveLast, CRecordset::MoveNext


 CRecordset::IsFieldDirty

BOOL IsFieldDirty( void* pv );
throw( CMemoryException );

返回值：
如果由于调用了AddNew或Edit，指定的字段数据成员被改变了，则返回非零值；否则返回0。

参数：
pv 指向想要检查其状态的字段数据成员的指针；或者为NULL，用来确定某些字段是否被更改了。

说明：
调用这个成员函数以确定指定的字段数据成员是否因为调用了Edit或AddNew而改变。当调用CRecordset的Update成员函数（跟在Edit或AddNew调用之后）更新当前记录时，所有被修改了的字段数据成员中的数据都将被传送给数据源上的对应记录。
注意：
这个成员函数对使用了成组行检取的记录集不起作用。如果你实现了成组行检取，那么IsFieldDirty将总是返回FALSE并导致一个失败的断言。
调用IsFieldDirty之后，前面调用SetFieldDirty的效果将会被复位，因为字段的状态将被重新计算。在使用AddNew的时候，如果当前字段值与null值不同，字段状态将被设为改变过的。在使用Edit的时候，如果字段值与缓冲的值不同，则字段状态被设为改变过的。
IsFieldDirty是通过DoFieldExchange实现的。

请参阅：
CRecordset::SetFieldDirty, CRecordset::IsFieldNull


 CRecordset::IsFieldNull

BOOL IsFieldNull( void* pv );
throw( CMemoryException );

返回值：
如果指定的字段数据成员被标记为Null，则返回一个非零值；否则返回0。

参数：
pv 指向一个要检查其状态的字段数据成员的指针，或者是NULL，以确定是否所有的字段都是Null。

说明：
调用这个成员函数以确定记录集中指定的字段数据成员是否被标记为Null。（在数据库术语中，Null表示“没有值”，与C++中的NULL不同）如果一个字段数据成员被标记为Null，它可以解释为当前记录的某一列没有值。
注意：
这个成员函数对使用了成组行检取的记录集不起作用。如果你实现了成组行检取，IsFieldNull将总是返回FALSE，并将导致断言失败。
IsFieldNull是通过DoFieldExchange实现的。

请参阅：
CRecordset::SetFieldNull, CRecordset::IsFieldDirty


 CRecordset::IsFieldNullable

BOOL IsFieldNullable( void* pv );
throw( CDBException )

参数：
pv 指向要检查其状态的字段数据成员的指针。或者是NULL，表示要确定是否所有的字段都可以被设置为Null值。

说明：
调用这个函数以确定指定的字段数据成员是否可以为空（可以被设为Null值，C++的NULL与数据库术语中的Null并不相同，后者意味着“没有值”）。
注意：
如果你实现了成组行检取，你不能调用IsFieldNullable，而是应当调用GetODBCFieldInfo成员函数以确定一个字段是否可以被设为Null值。注意你在任何时候都可以调用GetODBCFieldInfo，而不用考虑你是否实现了成组行检取。
不能为空的字段必须具有值。如果你试图在增加或更新一个记录时将这样一个字段的值设置为Null，则数据源将拒绝增加或更新，并且Update将抛出一个异常。异常发生在调用Update时，而不是发生在调用SetFieldNull时。
用NULL作为IsFieldNullable函数的第一个参数，将使该函数只应用于outputCloumns，而不作用于params。例如，调用
SetFieldNull( NULL );
这只将设置outputColumns为NULL，而Params将不受影响。
要作用于params，你必须为所想要设置的各个params提供实际地址，例如：
SetFieldNull( &m_strParam );
这意味着应用程序不能像对outputColumns一样，将所有params都设置为NULL。
IsFieldNullable通过DoFieldExchange实现。

请参阅：
CRecordset::IsFieldNull, CRecordset::SetFieldNull


 CRecordset::IsOpen

BOOL IsOpen() const;

返回值：
如果先前已经调用了记录集对象的Open或Requery成员函数，并且记录集还未关闭，则返回一个非零值，否则返回值为零。

说明：此成员函数用来确定记录集是否已经打开。


 CRecordset::Move

virtual void Move( long nRows, WORD wFetchType = SQL_FETCH_RELATIVE );
throw( CDBException, CMemoryException );

参数：
nRows | 要向前或向后移动的行数。正值表示向前移动，直至移动到记录集的尾部。负值表示向后移动，直至移动到开始处。
wFetchType | 确定Move将要获取的行集。其细节参见说明部分。

说明：
此成员函数用来在记录集中向前或向后移动当前记录指针。如果你给nRows传递一个为0的值，则Move刷新当前记录；Move将终止当前的AddNew或Edit模式，并且将把当前记录的值恢复到调用AddNew或Edit之前的值。
注意：
当在记录集中移动时，不能略过被删除的记录。有关的细节可以参见IsDeleted成员函数。
Move用行集来定位记录集。根据传递给nRows和wFetchType的值，Move检取相应的行集，然后将此行集中的第一个记录作为当前记录。如果你还没有实现成组行检取，则行集的大小总是1。当检取一个行集时，Move直接调用CheckRowsetError成员函数来处理检取中发生的任何错误。
Move与其他的CRecordset成员函数是等同的，这得看你所传递的值。尤其是，数值WFetchType指明了更为直观的成员函数，对于移动当前记录来说，可能更喜欢使用该方法。
下面的表列出了wFetchType可能的取值，Move根据wFectchType和nRows将获取的行集，和其它对应于wFetchType的相当的成员函数。
WfetchType | 获取的行集 | 等效成员函数
SQL_FETCH_RELATIVE | 从当前行集的第一行开始的nRows行的行集，(缺省值) |
SQL_FETCH_NEXT | 下一个行集；nRows被忽略 | MoveNext
SQL_FETCH_PRIOR | 前一个行集；nRows被忽略 | MovePrev
SQL_FETCH_FIRST | 记录集中的第一个行集，nRows被忽略 | MoveFirst
SQL_FETCH_LAST | 记录集中的最后一个完整的行集；nRows被忽略 | MoveLast
SQL_FETCH_ABSOLUTE | 如果nRows > 0，行集从记录集的开始处开始nRows行。 如果nRows < 0，则行集从记录集的结尾处开始nRows行。 如果nRows = 0，则返回一个BOF条件 | SetAbsolutePosition
SQL_FETCH_BOOKMARK | 行集开始于书签值与nRows一致的行 | SetBookmark
注意：
对于只向前的记录集，Move只在wFetchType的值为SQL_FETCH_NEXT才有效。
警告：
如果记录集没有记录则调用Move将抛出一个异常。要确定记录集是否有记录，可以调用IsBOF和IsEOF。

如果你已经滚动过了记录集的开始或结尾（IsBOF或IsEOF返回非零值），则调用Move函数将有可能抛出一个CDBException。例如，如果IsEOF返回非零值而IsBOF没有返回非零值，则MoveNext将抛出一个异常，而MovePrev就不会抛出异常。
如果你在当前记录被更新或增加时调用Move，则更新的值将丢失，并且不会给出警告。
有关的信息，参见“ODBC SDK程序员参考”中的ODBC API函数SQLExtendedFetch。

示例：
// rs是一个CRecordset或一个CRecordset派生对象。
// 将行集的大小改变为5
rs.SetRowsetSize( 5 );
// 移动到记录集中的第一个记录
rs.MoveFirst( );
// 移动到第六个记录
rs.Move( 5 );
// 用其它相当的方法移动到第六个记录
// rs.Move( 6, SQL_FETCH_ABSOLUTE );
// rs.SetAbsolutePosition( 6 );
// 在这种情况下，第六个记录是下一个行集的第一个记录。
// 所以下面的方法也是相当的。
// rs.Move( 1, SQL_FETCH_NEXT );
// rs.MoveNext( );

请参阅：
CRecordset::MoveNext, CRecordset::MovePrev, CRecordset::MoveFirst, CRecordset::MoveLast, CRecordset::SetAbsolutePosition, CRecordset::SetBookmark, CRecordset::IsBOF, CRecordset::IsEOF, CRecordset::CheckRowsetError


 CRecordset::MoveFirst

void MoveFirst();
throw(CDBException, CMemoryException );

说明：
此成员函数用来使第一个行集中的第一个记录成为当前记录。不管是否实现了成组行检取，此记录都是记录集中的第一个记录。
你不用在打开记录集之后就立刻调用MoveFirst。在打开记录集的时候，第一个记录（如果有的话）会自动成为当前记录。
注意：对于仅向前的记录集来说，此成员函数是无效的。
注意：当在一个记录集中移动时，删除的记录不能被忽略。参见IsDelete成员函数可以获得有关的细节。
警告：如果记录集没有记录，则调用任何Move函数都将抛出一个异常。要确定记录集中是否有记录，可以调用IsBOF和IsEOF。
在当前记录正在被更新或增加时，如果你调用任何Move函数，则更新将丢失，并且不给出警告。

示例：参见IsBOF的例子。

请参阅：
CRecordset::Move, CRecordset::MoveLast, CRecordset::MoveNext, CRecordset::MovePrev, CRecordset::IsBOF, CRecordset::IsEOF


 CRecordset::MoveLast

void MoveLast();
throw( CDBException, CMemoryException );

说明：
此成员函数用来使最后一个完整行集中的第一个记录成为当前记录。如果你还没有实现成组行检取，则你的记录集的行集大小是1，所以MoveLast只简单地移动到记录集中的最后一个记录。
注意：对于仅向前记录集，此成员函数是无效的。
注意：当在一个记录集中移动时，不能忽略被删除的记录。参见IsDeleted成员函数会获得有关的细节。
警告：如果记录集没有记录，则调用任何Move函数都将抛出一个异常。要确定记录集中是否有记录，可以调用IsBOF和IsEOF。
在当前记录正在被更新或增加时，如果你调用任何Move函数，则更新将丢失，并且不给出警告。

请参阅：
CRecordset::Move, CRecordset::MoveFirst, CRecordset::MoveNext, CRecordset::MovePrev, CRecordset::IsBOF, CRecordset::IsEOF


 CRecordset::MoveNext

void MoveNext();
throw( CDBException, CMemoryException );

说明：
此成员函数用来使下一个记录集中的第一个记录成为当前记录。如果你还没有实现成组行检取，则你的记录集的行集的大小为1，所以MoveNext只简单地移动到下一个记录。
注意：
当在一个记录集中移动时，不能忽略被删除的记录。参见IsDeleted成员函数会获得有关的细节。
警告：
如果记录集没有记录，则调用任何Move函数都将抛出一个异常。要确定记录集中是否有记录，可以调用IsBOF和IsEOF。
还要忠告你，必须在调用MoveNext之前调用IsEOF。例如，如果你已经滚动过了记录集的结尾，则IsEOF将返回非零值；则随后调用MoveNext将抛出一个异常。
在当前记录正在被更新或增加时，如果你调用任何Move函数，则更新将丢失，并且不给出警告。

示例：参见IsBOF的例子。

请参阅：
CRecordset::Move, CRecordset::MovePrev, CRecordset::MoveFirst, CRecordset::MoveLast, CRecordset::IsBOF, CRecordset::IsEOF


 CRecordset::MovePrev

void MovePrev();
throw( CDBException, CMemoryException );

说明：
此成员函数用来使上一个记录集中的第一个记录成为当前记录。如果你还没有实现成组行检取，则你的记录集的行集的大小为1，所以MovePrev只简单地移动到前一个记录。
注意：此成员函数对于只向前记录集无效。
注意：当在一个记录集中移动时，不能忽略被删除的记录。参见IsDeleted成员函数会获得有关的细节。
警告：如果记录集没有记录，则调用任何Move函数都将抛出一个异常。要确定记录集中是否有记录，可以调用IsBOF和IsEOF。
还要忠告你，必须在调用MovePrev之前调用IsBOF。例如，如果你已经滚动过了记录集的开始，则IsBOF将返回非零值；则随后调用MovePrev将抛出一个异常。
在当前记录正在被更新或增加时，如果你调用任何Move函数，则更新将丢失，并且不给出警告。

示例：参见IsBOF的例子。

请参阅：
CRecordset::Move, CRecordset::MoveNext, CRecordset::MoveFirst, CRecordset::MoveLast, CRecordset::IsBOF, CRecordset::IsEOF


 CRecordset::OnSetOptions

virtual void OnSetOptions( HSTMT hstmt );

参数：
hstmt 要设置其选项的ODBC语句的HSTMT。

说明：
框架调用此成员函数来设置记录集的初始选项。OnSetOption确定数据源是否支持可滚动游标和游标并行特性，并相应设置记录集的选项。
可以重载OnSetOptions函数来设置专用于驱动器或数据源的附加项。例如，如果数据源支持打开进行独占存取，则应用程序可以重载OnSetOptions来利用这种功能。

请参阅：CDatabase::OnSetOptions


 CRecordset::Open

virtual BOOL Open( UINT nOpenType = AFX_DB_USE_DEFAULT_TYPE,
LPCTSTR lpszSQL = NULL,
DWORD dwOptions = none
);
throw( CDBException, CMemoryException );

返回值：
如果CRecordset对象被成功打开，则返回非零值；否则，如果CDatabase::Open（如果被调用了）返回0，则返回0。

参数：
nOpenType接收缺省值AFX_DB_USE_DEFAULT_TYPE，或使用下列enumOpenType枚举值之一：
· | CRecordset::dynaset | 可以双向滚动的记录集。当记录集被打开时，记录集的全体成员和记录的顺序都被确定，但是伴随一次获取操作，其它用户对数据值所做的改变是可见的。
· | CRecordset::snapshot | 可以双向滚动的静态记录集。当记录集被打开时，记录集的全体成员和记录的顺序都被确定了；当记录被获取时，其数据值是确定的。其它用户在记录集被关闭，然后在打开之前是不可见的。
· | CRecordset::dynamic | 可以双向滚动的记录集。伴随一次获取操作，其它用户对成员，顺序和数据值所做的改变是可见的。注意，许多ODBC驱动器是不支持这种类型的记录集的。
· | CRecordset::forwardOnly | 只能向前滚动的只读的记录集。
对于CRecordset来说，缺省的值是CRecordset::snapshot。这种缺省值机制，允许Visual C++向导与具有不同缺省值的ODBC CRecordset和DAO CDaoRecordset进行交互。
与此有关的信息，参见“ODBC SDK程序员参考”中文章的“使用块和可滚动游标”。
警告：如果不支持要求的类型，框架将抛出一个异常。
lpszSQL一个包含下列值之一的字符串指针：
· | 一个NULL指针。
· | 一个表名。
· | 一条SQL SELECT语句（可选择带一条SQL WHERE 或ORDER BY子句）。
· | 一条CALL语句，指定一个预定义查询（存储过程）名。注意，你不能在卷括号和CALL关键字之间插入空格。
有关这个字符串的更多信息，请参见说明下的表，以及对ClassWizard的作用的讨论。
注意：
在你的结果集中，列的顺序必须与在你的重载的DoFieldExchange或DoBulkFieldExchange函数中的RFX和Bulk RFX函数调用的顺序相匹配。
dwOptions一个bitmask，它可以指定下列值的组合。这些值中的某些是相互独立的。缺省的值是none。
· | CRecordset::none | 未设置选项。此参数值与所有其它的值是相互独立的。缺省的，记录集可以用Edit或Delete来更新，并允许用AddNew来添加新记录。这种可更新性依赖于数据源，就像你所指定的nOpenType选项。成组添加的优化是没有用的。成组行检取不会被实现。在记录集中导航时，不能略过被删除的记录。书签是没有用的。实现了自动脏字段检查。
· | CRecordset::appendOnly | 不允许在记录集中进行Edit或Delete。值允许AddNew。此选项与CRecordset::readOnly相互独立。
· | CRecordset::readOnly | 用只读方式打开记录集。此选项与CRecordset::appendOnly相互独立。
· | CRecordset::optimizeBulkAdd | 使用预备的SQL语句来优化一次添加多个记录。只有在你不使用ODBC API函数SQLSetPos来更新记录集时才使用。第一次更新确定将哪一个字段标记为脏的。此选项与CRecordset::useMultiRowFetch相互独立。
· | CRecordset::useMultiRowFetch | 实现成组行检取，允许在一次检取操作中获取多行。这是一个高级特征，是设计来提高性能的；但是，ClassWizard不支持成组记录字段交互。此选项与CRecordset::optimiazBulkAdd相互独立。注意，如果你指定了CRecordset::useMultiRowFetch，则选项CRecordset::noDirtyFieldCheck将自动被返回（双缓冲将无效）；对于只向前记录集，选项CRecordset::useExtendedFetch将被自动返回。
· | CRecordset::skipDeletedRecords | 当在记录集中导航时，略过所有已被删除的记录。这将使某个相关获取的性能下降。在一个只向前的记录集中，此选项是无效的。注意，CRecordset::skipDeletedRecords与“驱动器包装”相似，驱动器包装意味着被删除的行被从记录集中移走。但是，如果你的驱动器包装记录，则它将只略过那些被你删除的记录；而不会略过在记录集打开时被其它用户删除的记录。CRecordset::skipDeletedRecords将会略过被其它用户删除的记录。
· | CRecordset::useBookarks | 允许在记录集中使用书签，如果支持书签的话。书签会使数据检取变慢，但是会提高数据导航的性能。在只向前的记录集中此选项是无效的。
· | CRecordset::noDirtyFieldCheck | 关闭自动脏数据检查（双缓冲）。这将提高性能；但是，你必须通过调用SetFieldDirty和SetFieldNull成员函数来手动标记变脏的字段。注意，CRecordset类中的双缓冲类似于CDaoRecordset中的双缓冲。但是，在CRecordset中，你不能在独立字段中使双缓冲有效；你只能对所有字段使它有效或无效。注意，如果你指定了选项CRecordset::useMultiRowFetch，则CRecordset::noDirtyFieldCheck将被自动返回；但是，SetFieldDirty和SetFieldNull不能在实现成组行检取的记录集中使用。
· | CRecordset::executeDirect | 不要使用预备的SQL语句。如果永远不会调用Requery成员函数，则指定此选项来提高性能。
· | CRecordset::useExtendedFetch | 实现SQLException来代替SQLFetch。这是设计来在只向前的记录集中实现成组行检取的。如果你在一个只向前的记录集中指定了选项CRecordset::userMultiRowFetch，则CRecordset::useExtendedFetch将被自动返回。
· | CRecordset::userAllocMultiRowBuffers | 用户将为数据分配存储缓存。如果你想分配自己的存储区，将此选项用与CRecordset::useMultiRowFetch连接；否则，框架将自动分配必要的存储区。注意，指定了CRecordset::userAllocMutiRowBuffers，而没有指定CRecordset::useMultiRowFetch，将导致一个失败断言。

说明：
你必须调用此成员函数来运行记录集定义的查询。在调用Open之前，你必须构造记录集对象。
此记录集与数据源的连接依赖于在调用Open之前你是如何构造这个记录集的。如果你将一个没有连接到一个数据源的CDatabase对象传递给记录集构造函数，此成员函数使用GetDefaultConnect来尝试打开该数据库对象。如果你将NULL传递给记录集构造函数，则此成员函数为你构造一个CDatabase对象，并且Open试图连接给数据库对象。有关关闭记录集和在这些不同的环境下的连接的细节，请参见Close。
注意：
通过一个CRecordset对象对数据源的访问总是被共享的。不像CDaoRecordset类，不能使用一个CRecordset对象来打开一个具有独占访问的数据源。
当你调用Open时，一条查询语句，通常是一条SQL SELECT语句，基于下表给出的标准来选择记录：
lpszSQL参数的值 | 选择的记录所决定于 | 示例
NULL | 由GetDefaultSQL返回的字符串 |
SQL表名 | 在DoFieldExchange或DoBulkFieldExchange中的列表的所有列 | "Customer"
预定义的查询（存储过程）名称 | 该查询被定义的要返回的列 | "{callOverDueAccts}"
SELECT 列表 FROM 列表 | 从指定的表中选出的指定的列 | "SELECT CustId, CustName FROM Customer"
警告：
注意，在SQL字符串中，你不能插入额外的空格。例如，如果你在卷括号和CALL关键字之间插入了空格，MFC将错误地将这个SQL串解释为一个表名，并将它合并到SELECT语句中，这将导致抛出一个异常。
类似地，如果使用输出参数的预定义查询没有在卷括号和‘?’号之间插入空格，则也会导致抛出异常。最后，你不能在一个CALL语句中的卷括号之前和在一个SELECT语句中的SELECT关键字之前插入空格。
通常的程序是将NULL传递给Open；在这种情况下，Open调用GetDefaultSQL。如果你正在使用一个CRecordset派生类，GetDefaultSQL给出你在ClassWizard中指定的表名。你可以代替在lpszSQL参数中指定其它的信息。
不管传递的是什么，Open都为查询构造一个最后的SQL字符串（该字符串可能有SQL WHERE和ORDER BY子串添加在你传递的lpszSQL串中），然后执行这个查询。你可以在调用Open之后通过调用GetSQL来检查这个构造出来的字符串。
记录集类的字段数据成员与所选择数据的列相关联。如果有记录被返回，则第一个记录成为当前记录。
如果你想为记录集设置选项，比如一个过滤器或排序，则应在构造了此记录集对象之后，但在调用Open之前指定这些选项。如果你要在记录集被打开之后刷新记录集中的记录，可以调用Requery。

示例：
下面的代码例子说明了Open调用的不同形式。
// rs 是一个CRecordset或CRecordset派生对象
// 用缺省的SQL语句打开rs
// 实现书签，并关闭自动脏数据检查
rs.Open( CRecordset::snapshot, NULL, CRecordset::useBookmarks | CRecordset::noDirtyFieldCheck );
// 传递一个完整的SELECT语句并打开作为一个动态集
rs.Open( CRecordset::dynaset, _T( "Select L_Name from Customer" ) );
// 接收所有的缺省值
rs.Open( );

请参阅：
CRecordset::CRecordset, CRecordset::Close, CRecordset::GetDefaultSQL, CRecordset::GetSQL, CRecordset::m_strFilter, CRecordset::m_strSort, CRecordset::Requery


 CRecordset::RefreshRowset

void RefreshRowset( WORD wRow, WORD wLockType = SQL_LOCK_NO_CHANGE );

参数：
wRow | 在当前行集中一行的从1开始的位置。这个值的范围可以是零到此行集的大小之间。
wLockType | 一个值，表明在行被刷新之后如何去加锁这个行。有关的细节可参见说明部分。

说明：
此成员函数用来为当前行集中的一行更新数据和状态。如果你传递一个为零的值给wRow，则此行集中的每一行都将被刷新。
要使用RefreshRowset，你必须已经通过指定Open成员函数中的CRecordset::useMulitRowFetch选项实现了成组行检取。
RefreshRowset调用ODBC API函数SQLSetPos。

参数：
wLockType指定在执行SQLSetPos之后此行的加锁状态。下面的表格描述了wLockType可能的取值。
WlockType | 描述
SQL_LOCK_NO_CHANGE（缺省值） | 驱动器和数据源保证该行的加锁或解锁状态与调用RefreshRowset之前一致
SQL_LOCK_EXCLUSIVE | 驱动器或数据源各自独立的加锁该行。不是所有的数据源都支持这种加锁类型
SQL_LOCK_UNLOCK | 驱动器或数据源解锁此行。不是所有的数据源都支持这种加锁类型
有关SQLSetPos的更多信息，请参见“ODBC SDK程序员参考”。

请参阅：
CRecordset::SetRowsetCursorPosition, CRecordset::SetRowsetSize


 CRecordset::Requery

virtual BOOL Requery();
throw ( CDBException, CMemoryException );

返回值：
如果记录集重建成功则返回非零值；否则返回0。

说明：
此成员函数用来重建（刷新）一个记录集。如果有记录返回，则第一个记录成为当前记录。
为了使记录集可反映你或其它用户正对数据集进行的添加或删除，你必须调用Requery函数来重建记录集。如果记录集是一个动态集，则它将自动反映你或其它用户对其现有记录（而非所添加的记录）的更新。如果记录集是一个快照，则应用程序必须调用Requery来反映其它用户的标记及添加和删除。
无论是对一个动态集还是对一个快照，都可以在应用程序想要用一个新的过滤器或排序，或新的参数值来重建记录集的任何时候，调用Requery函数。可以在调用Requery之前，通过赋新值给m_strFilter和m_strSort成员来设置新的过滤器或排序特征；赋新值给参数数据成员来设置新的参数。如果过滤器和排序串不变，则可以复用该查询，这将会提高性能。
如果重建记录集的尝试失败，则记录集被关闭。在调用Requery之前，你可以通过调用CanRestart成员函数来确定记录集是否可被重新查询。CanRestart不保证Requery会成功。
注意：只能在调用Open之后调用Requery函数。

示例：
此示例重建一个记录集，使其采用另一种不同的排列顺序。
// CRecordset::Requery示例：
CCustSet rsCustSet( NULL );
// 打开一个记录集
rsCustSet.Open( );
// 使用该记录集...
// 设置排列顺序并查询记录集
rsCustSet.m_strSort = "District, Last_Name";
if( !rsCustSet.CanRestart( ) ) return; // 不能查询
if( !rsCustSet.Requery( ) ) // 查询失败，因此进行某种行动

请参阅：
CRecordset::CanRestart, CRecordset::m_strFilter, CRecordset::m_strSort


 CRecordset::SetAbsolutePosition

void SetAbsolutePosition( long nRows );
throw( CDBException, CMemoryException );

参数：
nRows 此记录集中的当前记录的从一开始的顺序位置。

说明：
此成员函数用来将记录集定位在指定记录号对应的记录上。SetAbsolutePosition根据这个顺序位置来移动当前的记录指针。
注意：此成员函数在只向前的记录集中是无效的。
对于ODBC记录集，一个为1的绝对位置设置指向记录集中的第一个记录；设置0指向文件开始（BOF）位置。
你也可以传递负值给SetAbsolutePosition。在这种情况下，记录集的位置是从记录集的结尾开始计算的。例如，SetAsolutePosition(-1)当前记录指针移动到记录集中的最后一个记录上。
注意：
绝对位置并不是用来作为记录号的替代品。书签仍然是用来保持和返回到给定记录的最受欢迎的方式，因为当一个记录前面的记录被删除时，该记录的绝对位置就改变了。另外，如果记录集被再次重建，你就不能保证一个给定记录将具有相同的绝对位置，因为在记录集中单个记录的顺序是不被保证的，除非该记录集是用一个使用ORDER BY子句的SQL语句创建的。

请参阅：CRecordset::SetBookmark


 CRecordset::SetBookmark

void SetBookmark( const CDBVariant& varBookmark );
throw( CDBException, CMemoryException );

参数：
varBookmark 一个指向CDBVariant对象的引用，该对象包含了一个指定记录的书签值。

说明：
此成员函数用来将记录集定位在包含指定书签的记录上。为了确定在此记录集中是否支持书签，可以调用CanBookmark。如果支持书签，为了使书签可以使用，你必须设置Open成员函数中的dwOptions参数的CRecordset::useBookmarks选项。
注意：
如果书签不被支持或不能使用，调用SetBookmark将导致抛出一个异常。在只向前的记录集中是不支持书签的。
第一次获取当前记录的书签，可调用GetBookmark，它将书签值保存在一个CDBVariant对象中，用保存的书签值调用SetBookmark可以返回该记录。
注意：
在进行了一定的记录集操作之后，你必须在调用SetBookmark之前检查书签是否持续可用。例如，如果你用GetBookmark获取一个书签，然后调用Requery，则该书签也许已经不再有效了。调用CDabase::GetBookmarkPersistence来检查你是否能够安全地调用SetBookmark。

请参阅：
CRecordset::CanBookmark, CRecordset::GetBookmark, CRecordset::SetAbsolutePosition, CDatabase::GetBookmarkPersistence


 CRecordset::SetFieldDirty

void SetFieldDirty( void* pv, BOOL bDirty = TRUE );

参数：
pv | 指向记录集中一字段数据成员的地址，或为NULL。如果该参数为NULL，则标记记录集中所有字段数据成员。（C++ NULL与数据库术语中的Null不相同，后者表示“没有值”）。
bDirty | 如果要将字段数据成员标记为“脏的”（被修改了），则设置此参数为TRUE；否则如果要将字段数据成员标记为“干净的”（未被修改过），则设置此参数为FALSE。

说明：
此成员函数用来标记记录集中的一个字段数据成员为被修改了或未被修改过。标记字段为未被修改过，可以确保该字段不被更新，并产生较少的SQL语句。
注意：
此成员函数对使用成组行检取的记录集是不适用的。如果你已经实现了成组行检取，则SetFieldDirty将导致一个失败断言。
框架标记改变过的字段数据成员来确保记录字段交换机制（RFX）将它们写入数据源中对应的记录中。改变一个字段的值通常自动地将该自动设置为被修改了，因此应用程序本身很少有必要调用SetFieldDirty函数，但有时可能想要确保记录的列显式地被更新或插入，而不管自动数据成员中是什么值。
重点：只能在调用Edit或AddNew之后调用SetFieldDirty函数。
使用NULL作为SetFieldDirty函数的第一个参数，将使该函数只应用于outputColumns，而不作用于params。例如，调用
SetFieldNull( NULL );
将只设置outputColumns为NULL，而params将不受影响。
要想作用于params，应用程序必须对所想要作用的各个param提供实际地址，例如：
SetFieldNull( &m_strParam );
这意味着应用程序不能像对outputColmns一样将所有params都设置为NULL。

请参阅：
CRecordset::IsFieldDirty, CRecordset::SetFieldNull, CRecordset::Edit, CRecordset::Update


 CRecordset::SetFieldNull

void SetFieldNull( void* pv, BOOL bNull = TRUE );

参数：
pv | 指向记录集中一字段数据成员的地址，或为NULL。如果该参数为NULL，则标记记录集中所有字段数据成员。（C++ NULL与数据库术语中的Null不相同，后者表示“没有值”）。
bNull | 如果要将此字段数据成员标记为没有值（Null），则设置该参数为一个非零值。如果要将此字段数据成员标记为非Null，则设置该参数为零。

说明：
此成员函数用来将记录集的一个字段数据成员标记为Null（专指没有值）或非空。当应用程序将一个新记录增加到一个记录集中时，其所有字段数据成员初始都设置为Null值，并标记为“脏的”（被修改了）。当应用程序从一个数据源中检取一个记录时，该记录的列或是已有值，或是Null。
注意：
此成员函数对使用成组行检取的记录集是不适用的。如果你已经实现了成组行检取，则SetFieldDirty将导致一个失败断言。
如果你特别希望将当前记录的某个字段设计为没有值，可将bNull设置为TRUE来调用SetFieldNull函数，以将该字段标记为Null。如果一个字段先前标记为Null，而现在应用程序想要给它一个值，则只需要简单地设置该字段的新值。
应用程序不需要用SetFieldNull来删掉Null标志。要确定该字段是否可以为Null，可以调用IsFieldNullable函数。
重点：
只能在调用Edit或AddNew之后才能调用SetFieldNull函数。使用NULL作为SetFieldNull函数的第一个参数，将使该函数只应用于outputColumns，而不作用于params。例如，调用
SetFieldNull( NULL );
将只设置outputColumns为NULL，而params将不受影响。
要想作用于params，应用程序必须对所想要作用的各个param提供实际地址，例如：
SetFieldNull( &m_strParam );
这意味着应用程序不能像对outputColumns一样将所有params都设置为NULL。
注意：
当设置参数为Null时，在记录集打开之前调用SetFieldNull将导致一个断言。在这种情况下，可以调用SetParamNull。
SetFieldNull通过DoFieldExchange实现。

请参阅：
CRecordset::IsFieldNull, CRecordset::SetFieldDirty, CRecordset::Edit, CRecordset::Update, CRecordset::IsFieldNullable


 CRecordset::SetLockingMode

void SetLockingMode( UINT nMode );

参数：
nMode包含下列enum LockMode枚举之一：
· | optimistic | 乐观加锁方式，仅在调用Update期间加锁正被更新的记录。
· | pessimistic | 悲观加锁方式，在一调用Edit时即加锁，并保持加锁直到Update调用完成，或移动到一个新记录。

说明：
如果应用程序需要指定记录集用于更新的两种记录加锁方式之一，则调用此成员函数。缺省时，记录集的加锁方式是optimistic。应用程序可将它改变成一种更为谨慎的pessimistic加锁方式。SetLockMode调用应该在应用程序构造并打开一个记录集对象之后，但在调用Edit之前。

请参阅：CRecordset::Edit, CRecordset::Update


 CRecordset::SetParamNull

void SetParamNull( int nIndex, NOOL bNull = TRUE );

参数：
nIndex | 参数从零开始的索引。
bNull | 如果是TRUE（缺省值），则参数被标记为Null。否则，参数被标记为非Null。

说明：
此成员函数用来标记参数为Null（专指没有值）或非Null。与SetFieldNull不一样，你可以在打开记录集之前调用SetParamNull。
SetParamNull通常是用来进行预定义查询的。

请参阅：CRecordset::FlushResultSet


 CRecordset::SetRowsetCursorPosition

void SetRowsetCursorPosition( WORD wRow, WORD wLockType = SQL_LOCK_NO_CHANGE );

参数：
wRow | 当前记录集中一行的从1开始的位置。这个值的范围可以是从1到此行集的大小之间。
wLockType | 一个值，指定在行被刷新之后如何对它加锁。有关的细节，参见说明部分。

说明：
此成员函数用来将游标移动到当前行集中的一行。当实现成组行检取时，通过行集来获取记录，在所获取的行集中的第一个记录就是当前记录。为了使行集中的另一个记录成为当前记录，可以调用SetRowsetCursorPosition。例如，你可以联合SetRowsetCursorPosition和GetFieldValue成员函数来动态地获取你的记录集中的任何记录的数据。
要使用SetRowset Cursor Position，你必须在Open成员函数的dwOptions参数中指明CRecordset::useMultiRowFetch 选项，从而实现多行块存取操作。
SetRowsetCursorPosition调用ODBC API函数SQLSetPos。wLockType参数指定了在执行SQLSetPos之后该行的加锁状态。下面的表格描述了wLockType的可能取值。
WlockType | 描述
SQL_LOCK_NO_CHANGE（缺省值） | 驱动器和数据源保证该行的加锁或解锁状态与调用RefreshRowset之前一致
SQL_LOCK_EXCLUSIVE | 驱动器或数据源各自独立的加锁该行。不是所有的数据源都支持这种加锁类型
SQL_LOCK_UNLOCK | 驱动器或数据源解锁此行。不是所有的数据源都支持这种加锁类型
有关SQLSetPos的更多信息，请参见“ODBC SDK程序员参考”。

请参阅：
CRecordset::RefreshRowset, CRecordset::SetRowsetSize


 CRecordset::SetRowsetSize

virtual void SetRowsetSize( DWORD dwNewRowsetSize );

参数：
dwNewRowsetSize 在一次给定的检取中要获取的行数。

说明：
在使用成组行检取时，此虚成员函数用来指定在一次单一的检取中你希望获取的行数。要实现成组行检取，你必须在Open成员函数的dwOptions参数中设置CRecordset::useMultiRowFetch选项。
注意：
如果在没有实现成组行获取的情况下调用SetRowsetSize，将导致一个失败断言。
在调用Open之前调用SetRowsetSize来初始设置记录集的行集的大小。在实现成组行检取时，缺省的行集大小是25。
注意：
在调用SetRowsetSize时要小心。如果你手动为数据分配存储区（就像在Open中的dwOptions参数的CRecordset::userAllocMultiRowBuffers选项所指定的一样），你应该在调用SetRowsetSize之后，但在执行任何游标导航操作之前，检查是否需要重新分配这些存储缓冲区。
要获得对行集大小的当前设置，可以调用GetRowsetSize。

请参阅：
CRecordset::Open, CRecordset::GetRowsetSize, CRecordset::CheckRowsetError, CRecordset::DoBulkFieldExchange


 CRecordset::Update

virtual BOOL Update();
throw ( CDBException );

返回值：
如果一个记录更新成功则返回一个非零值；否则如果没有列改变，则返回值为零。如果没有记录被更新，或有多个记录被更新，则抛出一个异常。对数据源上的其它任何失败也都将抛出一个异常。

说明：
在调用AddNew或Edit成员函数之后，调用Update成员函数，必须用该调用来完成AddNew或Edit操作。
注意：
如果你已经实现了成组行检取，你就不能调用Update。这将导致一个异常。虽然类CRecordset不提供更新成组行数据的机制，但是你可以提供使用ODBC API函数SQLSetPos来编写你自己的函数。如何做到这一点，请参见例子DBFETCH。
AddNew或Edit都准备了一个编辑缓冲区，被增加或被编辑的数据都放在此缓冲区中，等待存入数据源中。Update保存这些数据。只有标记为或检测为被修改了的那些字段才被更新。
如果数据源支持事务，你可以使Update调用（以及它的相应的AddNew或Edit调用）成为事务的一部分。
警告：
如果你没有先调用AddNew或Edit函数就调用Update函数，则Update函数将抛出一个异常。如果应用程序调用AddNew或Edit，则在调用MoveNext之前，或改变记录集或数据源之前，必须调用Update函数。否则，所做的改变将丢失，并且不给出通知。

请参阅：
CRecordset::Edit, CRecordset::AddNew, CRecordset::SetFieldDirty, CDBException


 CRecordset::m_hstmt

说明：
此数据成员包含与此记录集相关联的ODBC语句数据结构的一个句柄，类型为HSTMT。对一个ODBC数据源的每个查询都与一个HSTMT相关联。
警告：
在调用Open前不要使用m_hstmt。
通常不需要直接访问HSTMT，但是在直接执行SQL语句时可能需要它。类CDatabase的ExectueSQL成员函数提供了使用m_hstmt的示例。

请参阅：CDatabase::ExecuteSQL


 CRecordset::m_nFields

说明：
此成员中包含了记录集类中字段数据成员的数目——记录集从数据源中所选择的列数。记录集必须用当前数目初始化m_nFields成员。当应用程序使用ClassWizard来声明应用程序的记录集类时，ClassWizard将为应用程序编写这段初始代码。你也可人工编写这段代码。
框架利用这个数目来管理字段数据成员和数据源上当前记录的对应列之间的交互。
重点：
在利用参数CFieldExchange::outputColumn调用SetFieldType之后，这个数目必须对应于DoFieldExchange中注册的“输出列”的数目。
你可以动态连接列，就像“Visual C++程序员指南”中的文章“记录集：动态连接数据列”所描述的一样。如果这样做，你就必须增加m_nFields中的计数，以反映DoFieldExchange成员函数中为动态连接列调用的RFX函数的数目。

请参阅：
CRecordset::DoFieldExchange, CRecordset::DoBulkFieldExchange, CRecordset::m_nParams, CFieldExchange::SetFieldType


 CRecordset::m_nParams

说明：
此成员中包含记录集类中参数数据成员的数目——传递给记录集的程序的参数数目。如果记录集类中有参数数据成员，则该类的构造函数必须用当前数目来初始化m_nParams成员。m_nParams的缺省值为零。如果应用程序增加参数数据成员——这必须手动进行——则也必须在类构造函数中手动地增加一个初始化，以反映参数数目（它必须至少与m_strFilter或m_strSort字符串中的占位符‘？’数目一样多）。
当框架参数化记录集的查询时，使用这个成员中的数目。
重点：
在用CFieldExchange::inputParam, CFieldExchange::param, CFieldExchange:: outputParam，或CFieldExchange::inoutParam为参数调用SetFieldType之后，这个成员的数目必须对应于DoFieldExchange或DoBulkFieldExchange中注册的“params”的数目。

请参阅：
CRecordset::DoFieldExchange, CRecordset::DoBulkFieldExchange, CRecordset::m_nFields, CFieldExchange::SetFieldType


 CRecordset::m_pDatabase

说明：
此成员包含了一个指向CDatabase对象的指针，记录集通过此对象连接到一个数据源上。这个成员变量可用两种方式设置。通常来说，在应用程序构造记录集对象时，传递一个指向已经连接的CDatabase对象的指针。如果应用程序传递的是NULL，则CRecordset为应用程序重建一个CDatabase对象并连接该对象。在这两种情况下，CRecordset都将指针存放在此成员变量中。
一般来说，你不需要直接使用m_pDatabase中所存储的指针。不过，如果你想要编制自己对CRecordset的扩展，则可能会使用这个指针。例如，如果你抛出自己的CDBException异常，则你也许会需要这个指针。或者，如果你需要用相同的CRecordset对象来做一些事情，例如运行事务，设置超时中断，或调用CDatabase类的ExecuteSQL成员函数来直接执行SQL语句，则也可能需要用到这个数据成员中的指针。


 CRecordset::m_strFilter

说明：
在应用程序构造了记录集对象之后，但在调用该对象的Open成员函数之前，使用此数据成员来存放一个CString，其中包含一条SQL WHERE子句。记录集利用这个字符串来限制枛柣蚬藮枛它在Open或Requery调用期间可选择的记录。这可用于选择记录的一个子集，例如“all salespersons based inCalifornia”（“state = CA”）。一条WHERE子句的ODBC SQL语法是
WHERE serch-condition（查询条件）。
注意，在该字符串中不要包括WHERE关键字。框架会提供这个关键字的。
应用程序也可以通过在过滤串中放‘？’占位字符，在记录集类中为每个占位字符声明一个参数数据成员，并在运行时传递参数给记录集，来参数化过滤串。这使应用程序可以在运行时构造过滤串。

示例：
// CRecordset::m_strFilter示例：
CCustSet rsCustSet( NULL );
// 设置过滤串
rsCustSet.m_strFilter = "state = 'CA'";
// 运行过滤后的查询
rsCustSet.Open( CRecordset::snapshot, "Customers" );

请参阅：CRecordset::m_strSort, CRecordset::Requery


 CRecordset::m_strSort

说明：
在应用程序构造了记录集对象之后，但在调用此类的Open成员函数之前，使用此数据成员来存储一个CString，其中包含一条SQL ORDERBY子句。记录集利用这个字符串来排序它在Open或Requery调用期间选择的记录。应用程序可以利用这个特性，对记录集按一列或多列进行排序。一条ORDER BY子句的ODBC语法是
ORDER BY sort-specification[,sort-specification]...
在此一个sort-specification（排序规范）是一个整数或一个列名。应用程序也可以通过在排序字符串中的列表后添加上“ASC”或“DESC”来指定是升序还是降序（缺省是升序）。所选记录首先按第一列排序，然后按第二列排序，如此等等。例如，可以先按人名的尾名对“Customers”记录集进行排序，再按人名的首名对该记录集进行排序。更多的信息，可参见“ODBC SDK程序员参考”。注意，在排序字符串中不要包括ORDER BY关键字，框架会提供这个关键字。

示例：
// CRecordset::m_strSort示例：
CCustSet rsCustSet( NULL );
// 设置排序字符串
rsCustSet.m_strSort = "District, Last_Name";
// 运行整理后的查询
rsCustSet.Open( CRecordset::snapshot, "Customers" );

请参阅：CRecordset::m_strFilter, CRecordset::Requery


 CRecordView

CObject
└CCmdTarget
└CWnd
└CView
└CScrollView
└CFormView
└CRecordView

一个CRecordView对象是在控件中显示数据库记录的视。这种视是一种直接连接到一个CRecordset对象上的格式视。此视是从一个对话框模板资源创建的，并将CRecordSet对象的字段显示在对话框模板的控件中。CRecordView对象利用对话框数据交换（DDX）和记录字段交换（RFX）机制，使格式上的控件和记录集的字段之间的数据移动自动化。CRecordView还提供了完成移动到第一个，下一个，上一个或最后一个记录的缺省实现，和一个用于更新视上面的当前记录的接口。
注意：
如果你正在使用数据访问对象（DAO）类，而不是使用开放数据库连接（ODBC）类，则使用CDaoRecordView来代替。
创建应用程序的最常用的方法是利用AppWizard。AppWizard创建记录视类及与其相关联的记录集类，作为基本起始程序的一部分。如果没有用AppWizard来创建记录视类，可以用ClassWizard在以后再创建记录视类。如果只是简单地需要一种格式，那么AppWizard方式要简单些。ClassWizard可以让你决定在以后开发过程中使用一个记录视。利用ClassWizard来分别创建一个记录视和一个记录集，然后连接它们，是一种灵活的方式，因为它在命名记录集类及其.H或.CPP文件时给予你较多的控制。这种方式也使得在同一个记录类上可以用多个记录视。
为使得在记录视中记录之间的移动对终端用户变得比较容易，AppWizard为移动到第一个，下一个，前一个或最后一个记录的操作创建菜单（和可选工具条）资源。如果是用ClassWizard创建一个记录视类，应用程序需要自己利用菜单和位图编辑器来创建这些资源。
CRecordView记载用户在记录集中的位置，以便记录视可以更新用户界面。当用户移动到记录集任何一端时，记录集即禁止用户界面对象枛柪绮说ハ罨蚬ぞ咛鯑枛以阻止朝同一个方向再移动下去。
#include <afxdb.h>
请参阅：CRecordset, CFormView

CRecordView类成员

构造
CRecordView 构造一个CRecordView对象

属性
OnGetRecordset | 返回一个指向CRecordset派生类对象的指针。ClassWizard可为应用程序重载此函数，并在需要时创建记录集
IsOnFirstRecord | 如果当前记录是相关记录集中的第一个记录，则该函数返回非零值
IsOnLastRecord | 如果当前记录是相关记录集中的最后一个记录，则该函数返回非零值

操作
OnMove 如果当前记录已经改变，则在数据源上更新该记录，然后移动到指定记录（下一个，前一个，第一个或最后一个）


 CRecordView::CRecordView

CRecordView( LPCSTR lpszTemplateName );
CRecordView( UINT nIDTemplate );

参数：
lpszTemplateName | 包含一个以NULL结尾的字符串，此字符串是一个对话框模板资源的名称。
nIDTemplate | 包含一个对话框模板资源的ID号。

说明：
当应用程序创建一个CRecordView派生类对象时，可调用此构造函数的任何一种形式来初始化此视对象，并标识该视所基于的对话框资源。应用程序可以按名称（传递字符串参数给构造函数）也可以按其ID（传递一个无符号整数为参数给构造函数）来标识这个对话框资源。建议使用资源ID。
注意：
应用程序的派生类必须提供自己的构造函数。在派生类的构造函数中，需要用资源名或ID为参数来调用CRecordView:: CRecordView构造函数，如下面的示例所示。CRecordView::OnInitialUpdate调用UpdateData，后者调用DoDataExchange。这个初始DoDataExchange调用连接CRecordView控件（间接地）与ClassWizard所创建的CRecordset字段数据成员。这些数据成员直到应用程序调用了CFormView::OnInitialUpdate成员函数之后才可使用。
注意：
如果使用ClassWizard，此向导定义了一个enum值CRecordView::IDD，并在构造函数的成员初始化列表中说明此值，参看示例中的IDD_MYFORM。示例说明了如果你利用自己的代码而不使用ClassWizard时，如何指定对话框模板资源。

示例：
CMyRecordView::CMyRecordView()
: CRecordView( IDD_MYFORM )
{
//{{AFX_DATA_INIT( CMyRecordView )
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Other construction code, such as data initialization
}

请参阅：
CRecordset::DoFieldExchange, CView::OnInitialUpdate, CWnd::UpdateData


 CRecordView::IsOnFirstRecord

BOOL IsOnFirstRecord();

返回值：
如果当前记录是记录集中的第一个记录，则返回非零值；否则返回0。

说明：
此成员函数用来确定当前记录是否是与此记录视相关联的记录集对象中的第一个记录。该函数可以用于编写应用程序自己实现的命令更新处理函数，代替ClassWizard编制的缺省命令更新处理函数。
如果用户移动到了第一个记录，则框架将禁止用于移动到第一个记录或前一个记录的用户界面对象。

请参阅：
CRecordView::OnMove, CRecordView::IsOnLastRecord, CRecordset::IsBOF, CRecordset::GetRecordCount


 CRecordView::IsOnLastRecord

BOOL IsOnLastRecord();

返回值：
如果当前记录是记录集中的最后一个记录，则返回非零值；否则返回0。

说明：
此成员函数用来确定当前记录是否是与此记录视相关联的记录集对象中的最后一个记录。该函数可以用来编写应用程序实现的缺省命令更新处理函数，使ClassWizard能支持在记录间移动的用户界面。
警告：
此函数的结果是可靠的，但是在这样的情况下，即只有当用户已经移动到了记录集的结尾记录后，记录视才能检测到记录集的结尾，函数的结果是不可靠的。在此情况下，用户必须移过最后一个记录后，记录视才能获知它必须禁止用于移动到下一个记录或最后一个记录的任何界面对象。如果用户移过最后一个记录，又移回到最后一个记录（或最后一个记录的前面），记录视可以跟踪用户在记录集中的位置，并正确地禁止用户界面对象。在调用实现函数OnRecordLast（该函数处理ID_RECORD_LAST命令）或CRecordset::MoveLast函数之后，IsOnLastRecord也不可靠。

请参阅：
CRecordView::OnMove, CRecordView::IsOnFirstRecord, CRecordset::IsEOF, CRecordset::GetRecordCount


 CRecordView::OnGetRecordset

virtual CRecordset* OnGetRecordset() = 0;

返回值：
如果成功地创建了对象，则返回一个指向CRecordset派生对象的指针；否则返回一个NULL指针。

说明：
此函数返回一个指向与此记录视相关联的CRecordset派生对象的指针。应用程序必须重载这个成员函数来构造或获取一个记录集对象，并返回一个指向该对象的指针。如果应用程序利用ClassWizard来声明自己的记录视类，则该向导为应用程序编写一个缺省的重载。ClassWizard缺省实现的OnGetRecordset函数返回存储在记录视中的记录集指针（如果存在的话）。如果不存在，则它构造一个具有你在ClassWizard所指定的类型的记录集对象，并调用该对象的Open成员函数打开表或运行查询，然后返回一个指向此记录集对象的指针。

请参阅：CRecordset, CRecordset::Open


 CRecordView::OnMove

virtual BOOL OnMove( UINT nIDMoveCommand );
throw( CDBException );

返回值：
如果移动成功则返回非零值；否则，如果移动请求被否决则返回0。

参数：
nIDMoveCommand是下列标准命令ID值之一：
· | ID_RECORD_FIRST | 移动到记录集中的第一个记录。
· | ID_RECORD_LAST | 移动到记录集中的最后一个记录。
· | ID_RECORD_NEXT | 移动到记录集中的下一个记录。
· | ID_RECORD_PREV | 移动到记录集中的前一个记录。

说明：
此成员函数用来移动到记录集中的一个不同的记录，并将该记录的字段显示在记录视的控件中。缺省实现是调用与此记录视相关联的CRecordset对象的相应的Move成员函数。
缺省的，如果用户在记录视中改变了当前记录，则OnMove将更新数据源上的当前记录。
AppWizard创建一个带有First Record（第一个记录），Last Record（最后一个记录），Next Record（下一个记录），和Previous Record（前一个记录）等菜单项的菜单。如果选择Initial Toolbar选项，则AppWizard还创建一个带有对应于这些命令的工具条。
如果你移动过了记录集中的最后一个记录，记录视仍显示最后一个记录。如果向前移动超过了第一个记录，则记录视仍显示第一个记录。
警告：
如果记录集中没有记录，则调用OnMove将抛出一个异常。在执行任何移动操作之前，可以先调用相应的适当用户界面更新处理函数枛朞nUpdateRecordFirst，OnUpdateRecordLast，OnUpdateRecord或OnUpdateRecordPrev来确定记录集中是否还有记录。

请参阅：CRecordset::Move


 CRect

CRect类与Windows RECT结构相似，并且还包括操作CRect对象和Windows RECT结构的成员函数。
在传递LPRECT,LPCRECT或RECT结构作为参数的任何地方，都可以传递CRect对象来代替。
注意：这个类是从tagRECT结构派生而来的。（tagRECT是RECT结构的不太常用的别名。）这意味着RECT结构的数据成员（left，top，right，和bottom）也是CRect的可访问数据成员。
一个CRect包含用于定义矩形的左上角和右下角点的成员变量。
当指定一个CRect时，必须谨慎地构造它，以使它符合规范——也就是说，使其左坐标值小于右坐标值，使顶坐标值小于底坐标值。例如，左上角为（10，10），右下角为（20，20）就定义了一个符合规范的矩形，但是左上角为（20，20）而右下角为（10，10）的值就定义了一个不符合规范的矩形。如果矩形是不符合规范的，则CRect的许多成员函数都会符合不正确的结果。（参见CRect::NormalizeRect可以得到这些函数的列表。）在你调用一个要求符合规范的矩形的函数之前，你可以通过调用NormalizeRect函数来使不符合规范的矩形成为符合规范的矩形。
当用成员函数CDC::DPtoLP和CDC::LPtoDP来处理CRect时要小心。如果显示环境的映射模式y-extent是负的，就像在MM_LOENGLISH中一样，则CDC::DPtoLP将转换CRect，以使它的顶部坐标大于底部坐标。然后像Height和Size这样的函数将返回负值作为转换后的矩形的高度，则此矩形将是不符合规范的。
当使用重载的CRect操作符时，第一个操作数必须是一个CRect；第二个操作数可以是一个RECT结构或一个CRect对象。
#include <afxwin.h>

请参阅：CPoint, CSize, RECT

CRect类成员

构造
CRect 构造一个CRect对象

运算
Width | 计算CRect的宽度
Height | 计算CRect的高度
Size | 计算CRect的大小
TopLeft | 返回CRect的左上角点
BottomRight | 返回CRect的右下角点
CenterPoint | 返回CRect的中心点
IsRectEmpty | 确定CRect是否是空的。如果CRect的宽度和/或高度为0，则它是空的
IsRectNull | 确定CRect的top，bottom，left，和right是否都等于0
PtInRect | 确定指定的点是否在CRect之内
SetRect | 设置CRect的尺寸
SetRectEmpty | 设置CRect为一个空的矩形（所有的坐标都等于0）
CopyRect | 将一个源矩形的尺寸拷贝到CRect
EqualRect | 确定CRect是否等于给定的矩形
InflateRect | 增加CRect的宽度和高度
DeflateRect | 减少CRect的宽度和高度
NormalizeRect | 使CRect的高度和宽度返回规范
OffsetRect | 将CRect移动到指定的偏移
SubtractRect | 从一个矩形中减去另一个矩形
IntersectRect | 设置CRect等于两个矩形的交集
UnionRect | 设置CRect等于两个矩形的并集

运算符
operator LPCRECT | 将一个CRect转换为一个LPCRECT
operator LPRECT | 将一个CRect转换为一个LPRECT
operator = | 将一个矩形的尺寸拷贝到CRect
operator == | 确定CRect是否与一个矩形相等
operator != | 确定CRect是否不等于另一个矩形
operator += | 使CRect增加指定的偏移，或使CRect放大
operator -= | 从CRect中减去指定的偏移，或缩小CRect
operator &= | 设置CRect等于CRect和某个矩形的交
operator |= | 设置CRect等于CRect和某个矩形的并
operator + | 增加给定偏移量到CRect，并返回得到的CRect对象
operator - | 从CRect中减去给定偏移量，并返回得到的CRect对象
operator & | 创建CRect与某个矩形的交，并返回得到的CRect对象
operator | | 创建CRect与某个矩形的并，并返回得到的CRect对象


 CRect::BottomRight

CPoint& BottomRight( );
const CPoint& BottomRight( ) const;

返回值：返回矩形的右下角点的坐标。

说明：
返回的右下角坐标是一个指向CPoint对象的引用，该对象包含在CRect对象中。可以使用这个函数来获取或设置矩形的右下角坐标。要用这个函数来设置右下角。可以将此函数放在赋值操作符的左边。

请参阅：CRect::TopLeft, CPoint, CRect::CenterPoint


 CRect::CenterPoint

CPoint CenterPoint() const;

返回值：
返回一个CPoint对象，该对象是CRect的中心点。

说明：
要计算CRect的中心点，将其左、右坐标值相加再除2，将其上、下值相加再除2。

请参阅：
CRect::Width, CRect::Height, CRect::Size, CRect::TopLeft, CRect::BottomRight, CRect::IsRectNull, CPoint


 CRect::CopyRect

void CopyRect( LPCRECT lpSrcRect );

参数：
lpSrcRect 指向要拷贝的RECT结构或CRect对象的指针。

说明：此成员函数用来将lpSrcRect矩形拷贝到CRect中。

请参阅：
CRect::CRect, CRect::operator =, CRect::SetRect, CRect::SetRectEmpty


 CRect::CRect

CRect( );
CRect( int l, int t, int r, int b );
CRect( const RECT& srcRect );
CRect( LPCRECT lpSrcRect );
CRect( POINT point, SIZE size );
CRect( POINT topLeft, POINT bottomRight );

参数：
l | 指定CRect的左边位置。
t | 指定CRect的上边位置。
r | 指定CRect的右边位置。
b | 指定CRect的底部位置。
srcRect | 对指定的CRect对象的坐标的RECT结构的引用。
lpSrcRect | 指向给定的CRect对象的坐标的RECT结构。
point | 指定要构造的矩形的原点。该参数值对应于矩形的左上角。
size | 指定要构造的矩形的从左上角到右下角的偏移量。
topLeft | 指定CRect的左上角位置。
bottomRight | 指定CRect的右下角位置。

说明：
此成员函数用来构造一个CRect对象。如果没有给出参数，则不初始化left，top，right，和bottom成员。CRect(const RECT&)和CRect(LPRECT)构造函数指向一个CopyRect。其它的构造函数直接初始化对象的成员变量。

请参阅：
CRect::SetRect, CRect::CopyRect, CRect::operator =, CRect::SetRectEmpty


 CRect::DeflateRect

void DeflateRect( int x, int y );
void DeflateRect( SIZE size );
void DeflateRect( LPCRECT lpRect );
void DeflateRect( int l, int t, int r, int b );

参数：
x | 指定缩小CRect的左和右边的单位数。
y | 指定缩小CRect的上、下边的单位数。
size | 一个指定缩小CRect的单位数的SIZE或CSize。cx值指定缩小左、右边的单位数，cy指定缩小上、下边的单位数。
lpRect | 指向一个RECT结构或CRect，指定缩小每一边的单位数。
l | 指定缩小CRect左边的单位数。
t | 指定缩小CRect上边的单位数。
r | 指定缩小CRect右边的单位数。
b | 指定缩小CRect下边的单位数。

说明：
DeflateRect通过将CRect的边向其中心移动来缩小它。为了做到这一点，DeflateRect将单位数增加到矩形的左边和上边，从右边和下边减去单位数。DeflateRect的参数是有符号的值；正值缩小CRect，而负值则放大它。
前两个重载函数使CRect相对的两对边都缩小，因此CRect的总宽度减小了两倍x（或cx），总高度减小了两倍y（或cy）。其它两个重载函数使CRect的边相对独立的缩小。

请参阅：
CRect::InflateRect, CRect::operator -, CRect::operator -=, ::InflateRect


 CRect::EqualRect

BOOL EqualRect( LPCRECT lpRect ) const;

返回值：
如果两个矩形具有相同的上、左、下、右边值，则返回非零值；否则返回0。
注意：两个矩形都必须是符合规范的，否则此函数将失败。你可以在调用此函数之前，调用NormalizeRect来使矩形规范化。

参数：
lpRect 指向一个RECT结构或CRect对象，该对象或结构包含了一个矩形的左上角和右下角的坐标。

请参阅：
CRect::operator ==, CRect::operator !=, CRect::NormalizeRect, ::EqualRect


 CRect::Height

int Height() const;

返回值：返回CRect的高度。

说明：
此成员函数通过从CRect的下边值中减去上边值来计算CRect的高度。结果值可以是负数。
注意：这个矩形必须是符合规范的，否则此函数将失败。你可以在调用此函数之前，调用NormalizeRect来使矩形规范化。

请参阅：
CRect::Width, CRect::Size, CRect::CenterPoint, CRect::IsRectEmpty, CRect::IsRectNull, CRect::NormalizeRect


 CRect::InflateRect

void InflateRect( int x, int y );
void InflateRect( SIZE size );
void InflateRect( LPCRECT lpRect );
void InflateRect( int l, int t, int r, int b );

参数：
x | 指定扩大CRect左和右边的单位数。
y | 指定扩大CRect上、下边的单位数。
size | 一个指定扩大CRect的单位数的SIZE或CSize。cx值指定扩大左、右边的单位数，cy指定扩大上、下边的单位数。
lpRect | 指向一个RECT结构或CRect，指定扩大每一边的单位数。
l | 指定扩大CRect左边的单位数。
t | 指定扩大CRect上边的单位数。
r | 指定扩大CRect右边的单位数。
b | 指定扩大CRect下边的单位数。

说明：
InflateRect通过将CRect的边向远离其中心的方向移动来扩大它。为了做到这一点，InflateRect从矩形的左边和上边减去单位数，将单位数增加到右边和下边。InflateRect的参数是有符号的值；正值扩大CRect，而负值则缩小它。
前两个重载函数使CRect相对的两对边都扩大，因此CRect的总宽度增加了了两倍x（或cx），总高度增加了两倍y（或cy）。其它两个重载函数使CRect的边则是相对独立的扩大。

请参阅：
CRect::DeflateRect, CRect::operator +, CRect::operator +=, ::InflateRect


 CRect::IntersectRect

BOOL IntersertRect ( LPCRECT lpRect1, LPCRECT lpRect2 );

返回值：
如果交不为空，则返回非零值；否则，如果交为空则返回0。

参数：
lpRect1 | 指向一个RECT结构或CRect对象，该对象或结构包含了一个源矩形。
lpRect2 | 指向一个RECT结构或CRect对象，该对象或结构包含了一个源矩形。

说明：
此函数使CRect等于两个现有矩形的交。交是同时包含在两个现有矩形中的最大矩形。
注意：两个矩形都必须是符合规范的，否则此函数将失败。你可以在调用此函数之前，调用NormalizeRect来使矩形规范化。

请参阅：
CRect::operator &=, CRect::operator &, CRect::UnionRect, CRect::SubtractRect, CRect::NormalizeRect, ::IntersectRect


 CRect::IsRectEmpty

BOOL IsRectEmpty() const;

返回值：
如果CRect是空的则返回非零值；否则，如果CRect不是空的则返回0。

说明：
此函数用来确定CRect是否是空的。如果一个矩形的宽度和/或高度是0或负值，则称这个矩形为空的。与IsRectNull不同，IsRectNull用来确定是否矩形的所有坐标都是零。
注意：这个矩形必须是符合规范的，否则此函数将失败。你可以在调用此函数之前，调用NormalizeRect来使矩形规范化。

请参阅：
CRect::IsRectNull, CRect::SetRectEmpty, CRect::NormalizeRect, ::IsRectEmpty


 CRect::IsRectNull

BOOL IsRectNull() const;

返回值：
如果CRect的上、左、下和右边的值都等于0，则返回非零值；否则返回0。

说明：
此函数用来确定CRect的上、左、下和右边的值是否都等于0。与IsRectEmpty不同，IsRectEmpty用来确定矩形是否为空。

请参阅：CRect::IsRectEmpty, CRect::SetRectEmpty


 CRect::NormalizeRect

void NormalizeRect( );

说明：
此函数用来使CRect符合规范，使其高度和宽度均为正值。矩形被从四个象限规范化，通常这四个象限就是Windows用来确定坐标的。NormalizeRect比较上、下坐标的值，如果上坐标值大于下坐标的值，则将它们互换。类似的，如果左坐标的值大于右坐标的值，则将左、右坐标互换。当处理不同的映射模式和转化的矩形时，这个函数是很有用的。
注意：下面的CRect成员函数为了正确地工作，需要规范化的矩形，它们是：
Height，Width，Size，IsRectEmpty，PtInRect，EqualRect，UnionRect，IntersectRect，SubtractRect，operator ==，operator !=，operator |，operator |=，operator &，和operator &=。


 CRect::OffsetRect

void OffsetRect( int x, int y );
void OffsetRect( POINT point );
void OffsetRect( SIZE size );

参数：
x | 指定要往左或右移动的数量。要往左时此值必须是负值。
y | 指定要往上或下移动的数量。要往上时此值必须是负值。
point | 包含一个POINT结构或CPoint对象，该结构或对象指定了要移动的尺寸。
size | 包含一个SIZE结构或CSize对象，指定要移动的尺寸。

说明：
此函数用来将CRect移动指定的偏移量。将CRect沿x轴移动x个单位，沿y轴移动y个单位。x和y参数都是有符号的值，因此CRect可以向左或向右，向上或向下移动。

请参阅：
CRect::operator +, CRect::operator +=, CRect::operator -, CRect::operator -=


 CRect::PtInRect

BOOL PtInRect( POINT point ) const;

返回值：如果点位于CRect中，则返回非零值；否则返回0。

参数：
point 包含一个POINT结构或CPoint对象。

说明：
此函数用来确定一个指定的点是否在CRect内。如果这个点在CRect的左边和上边上，或在四个边之内，则称此点在CRect之内。点在CRect的右边或底边上，则称点在CRect外。
注意：这个矩形必须是符合规范的，否则此函数将失败。你可以在调用此函数之前，调用NormalizeRect来使矩形规范化。

请参阅：CRect::NormalizeRect, ::PtInRect


 CRect::SetRect

void SetRect( int x1, int y1, int x2, int y2 );

参数：
x1 | 指定左上角的x坐标。
y2 | 指定左上角的y坐标。
x2 | 指定右下角的x坐标。
y2 | 指定右下角的y坐标。

说明：此函数将CRect的各个坐标设置为指定的坐标值。

请参阅：
CRect::CRect, CRect::operator =, CRect::CopyRect, CRect::SetRectEmpty, ::SetRect


 CRect::SetRectEmpty

void SetRectEmpty();

说明：
此函数通过将CRect的所有坐标设置为零来使CRect成为一个空矩形。

请参阅：
CRect::CRect, CRect::SetRect, CRect::CopyRect, CRect::operator =, CRect::IsRectEmpty, CRect::IsRectNull, ::SetRectEmpty


 CRect::Size

CSize Size() const;

返回值：返回一个包含CRect的尺寸的CSize对象。

说明：
返回值的cx和cy成员包含了CRect的高度和宽度。高度和宽度都可以是负值。
注意：这个矩形必须是符合规范的，否则此函数将失败。你可以在调用此函数之前，调用NormalizeRect来使矩形规范化。

请参阅：
CRect::Height, CRect::Width, CRect::IsRectEmpty, CRect::IsRectNull, CRect::NormalizeRect


 CRect::TopLeft

CPoint& TopLeft( );
const CPoint& TopLeft( ) const;

返回值：返回矩形的左上角坐标。

说明：
此函数返回的坐标是一个对CPoint对象的引用，该对象包含在CRect中。
你可以使用此函数来获取或设置矩形的左上角。通过在赋值操作符的左边使用这个函数，可以设置矩形的左上角。

请参阅：CRect::BottomRight, CPoint, CRect::CenterPoint


 CRect::SubtractRect

BOOL SubtractRect( LPCRECT lpRectSrc1, LPCRECT lpRectSrc2 );

返回值：如果函数成功则返回非零值；否则返回0。

参数：
lpRectSrc1 | 指向一个RECT结构或CRect对象，将从这个结构或对象中减去某个矩形。
lpRectSrc2 | 指向一个RECT结构或CRect对象，将从由lpRectSrc1参数指定的矩形中减去这个结构或对象。

说明：
该函数使一个CRect对象的尺寸等于从lpRectSrc1中减去lpRectSrc2的差，这个差值是一个包含所有在lpRectScr1内，而不在lpRectScr1 和lpRectScr2的交之中的点的最小矩形。
如果由lpRectScr2指定的矩形和由lpRectScr1指定的矩形没有在x或y方向之一的方向上重叠，则由lpRectScr1指定的矩形将没有改变。
例如，如果lpRectScr1是（10，10，100，100），lpRectScr2是（50，50，150，150，）则当函数返回时，由lpRectScr1指定的矩形将没有改变。如果lpRectScr1是（10，10，100，100，），lpRectScr2是（50，10，150，150），则当函数返回时，由lpRectScr1指定的矩形将包含坐标（10，10，50，100）。
SubtractRect与操作符-和操作符-=是不一样的。这两个操作符都不调用SubtractRect。
注意：这两个矩形都必须是符合规范的，否则此函数将失败。你可以在调用此函数之前，调用NormalizeRect来使矩形规范化。

请参阅：
CRect::operator -, CRect::operator -=, CRect::IntersectRect, CRect::UnionRect, CRect::NormalizeRect, ::SubtractRect


 CRect::UnionRect

BOOL UnionRect( LPCRECT lpRect1, LPCRECT lpRect2 );

返回值：
如果两个矩形的并不是空，则返回非零值；否则，如果并是空，则返回0。

参数：
lpRect1 | 指向一个RECT或CRect，包含了一个源矩形。
lpRect2 | 指向一个RECT或CRect，包含了一个源矩形。

说明：
此函数使CRect的尺寸等于两个源矩形的并。并就是包含两个源矩形的最小矩形。Windows忽略空矩形，即没有高度也没有宽度的矩形。
注意：这两个矩形都必须是符合规范的，否则此函数将失败。你可以在调用此函数之前，调用NormalizeRect来使矩形规范化。

请参阅：
CRect::operator |=, CRect::operator |, CRect::IntersectRect, CRect::SubtractRect, CRect::NormalizeRect, ::UnionRect


 CRect::Width

int Width() const;

返回值：返回CRect的宽度。

说明：
此函数用右坐标值减去左坐标值，来计算CRect的宽度。这个宽度可以是负值。
注意：这个矩形必须是符合规范的，否则此函数将失败。你可以在调用此函数之前，调用NormalizeRect来使矩形规范化。

请参阅：
CRect::Height, CRect::Size, CRect::CenterPoint, CRect::IsRectEmpty, CRect::IsRectNull, CRect::NormalizeRect


 CRect::operator =

void operator =( const RECT& srcRect );

参数：
srcRect 指向一个源矩形。可以是一个RECT或CRect。

说明：此操作符将srcRect分配给CRect。

请参阅：
CRect::CRect, CRect::SetRect, CRect::CopyRect, CRect::SetRectEmpty, ::CopyRect


 CRect::operator +

CRect operator +( POINT point ) const;
CRect operator +( LPCRECT lpRect ) const;
CRect operator +( SIZE size ) const;

返回值：
返回一个CRect，它是将CRect移动或扩大参数中指定的单位数之后的结果。

参数：
point | 一个POINT结构或CPoint对象，指定了返回值要移动的单位数。
size | 一个SIZE结构或CSize对象，指定了返回值要移动的单位数。
lpRect | 指向一个RECT或CRect对象，包含了要扩大返回值的每一边的单位数。

说明：前两种重载形式返回的CRect对象是CRect移动指定偏移后的结果。参数的x和y（或cx和cy）被增加到CRect的位置上。第三种重载形式返回一个新的CRect对象，此对象是扩大了参数的每一个成员指定的单位数之后的CRect。

请参阅：
CRect::operator +=, CRect::operator -, CRect::OffsetRect, CRect::InflateRect


 CRect::operator -

CRect operator * ( POINT point ) const;
CRect operator * ( SIZE size ) const;
CRect operator * ( LPCRECT lpRect ) const;

返回值：
返回一个CRect，它是将CRect移动或缩小参数中指定的单位数之后的结果。

参数：
point | 一个POINT结构或CPoint对象，指定了返回值要移动的单位数。
size | 一个SIZE结构或CSize对象，指定了返回值要移动的单位数。
lpRect | 指向一个RECT或CRect对象，包含了要扩大返回值的每一边的单位数。

说明：前两种重载形式返回的CRect对象是CRect移动指定偏移后的结果。参数的x和y（或cx和cy）被从CRect的位置上减去。第三种重载形式返回一个新的CRect对象，此对象是缩小了参数的每一个成员指定的单位数之后的CRect。注意，这个重载函数类似于DeflateRect，而不是SubtractRect。

请参阅：
CRect::operator -=, CRect::operator +, CRect::OffsetRect, CRect::DeflateRect, CRect::SubtractRect


 CRect::operator &

CRect operator &( const RECT& rect2 ) const;

返回值：
返回一个CRect，它是CRect和rect2的交。

参数：
rect2 包含一个RECT或CRect。

说明：此操作符返回一个CRect，它是CRect和rect2的交。交是被两个矩形包含的最大矩形。
注意：这两个矩形都必须是符合规范的，否则此函数将失败。你可以在调用此函数之前，调用NormalizeRect来使矩形规范化。

请参阅：
CRect::IntersectRect, CRect::operator &=, CRect::operator |, CRect::NormalizeRect


 CRect::operator |

CRect operator |( const RECT& rect2 ) const;

返回值：返回一个CRect，它是CRect和rect2的并。

参数：
rect2 包含一个RECT或CRect。

说明：此操作符返回一个CRect，它是CRect和rect2的并。并是包含两个矩形的最小矩形。
注意：这两个矩形都必须是符合规范的，否则此函数将失败。你可以在调用此函数之前，调用NormalizeRect来使矩形规范化。

请参阅：
CRect::UnionRect, CRect::operator |=, CRect::operator &, CRect::NormalizeRect


 CRect::operator &=

void operator &=( const RECT& rect );

参数：
rect 包含一个RECT或CRect。

说明：此操作符用来使CRect等于CRect和rect的交。交是被两个源矩形都包含的最大矩形。
注意：这两个矩形都必须是符合规范的，否则此函数将失败。你可以在调用此函数之前，调用NormalizeRect来使矩形规范化。

请参阅：
CRect::operator &, CRect::operator |=, CRect::IntersectRect, CRect::NormalizeRect, ::IntersectRect


 CRect::operator |=

void operator |=( const RECT& rect );

参数：
rect 包含一个RECT或CRect。

说明：此操作符用来使CRect等于CRect和rect的并。并是包含两个源矩形的最小矩形。
注意：这两个矩形都必须是符合规范的，否则此函数将失败。你可以在调用此函数之前，调用NormalizeRect来使矩形规范化。

请参阅：
CRect::operator |, CRect::operator &=, CRect::UnionRect, CRect::NormalizeRect, ::UnionRect


 CRect::operator +=

void operator +=( POINT point );
void operator +=( SIZE size );
void operator +=( LPCRECT lpRect );

参数：
point | 一个POINT结构或CPoint对象，指定了矩形要移动的单位数。
size | 一个SIZE结构或CSize对象，指定了矩形要移动的单位数。
lpRect | 指向一个RECT或CRect对象，包含了要扩大CRect的每一边的单位数。

说明：
前两种重载形式将CRect移动指定的偏移量。参数的x和y（或cx和cy）被增加到CRect。
第三种重载形式将CRect扩大参数中每一个成员所指定的单位数。

请参阅：
CRect::OffsetRect, CRect::InflateRect, CRect::operator +, CRect::operator -=


 CRect::operator -=

void operator -=( POINT point );
void operator -=( SIZE size );
void operator -=( LPCRECT lpRect );

参数：
point | 一个POINT结构或CPoint对象，指定了矩形要移动的单位数。
size | 一个SIZE结构或CSize对象，指定了矩形要移动的单位数。
lpRect | 指向一个RECT或CRect对象，包含了要扩大CRect的每一边的单位数。

说明：
前两种重载形式将CRect移动指定的偏移量。从CRect中减去参数的x和y（或cx和cy）。
第三种重载形式将CRect缩小参数中每一个成员所指定的单位数。注意，这个重载函数像DeflateRet。

请参阅：
CRect::OffsetRect, CRect::DeflateRect, CRect::SubtractRect, CRect::operator -, CRect::operator +=


 CRect::operator ==

BOOL operator ==( const RECT& rect ) const;

返回值：如果相等则返回非零值；否则返回0。

参数：
rect 指向一个源矩形。可以是一个RECT或CRect。

说明：此操作符通过比较rect与CRect左上角和右下角的坐标值来确定它们是否相等。
注意：这两个矩形都必须是符合规范的，否则此函数将失败。你可以在调用此函数之前，调用NormalizeRect来使矩形规范化。

请参阅：
CRect::operator !=, CRect::NormalizeRect, ::EqualRect


 CRect::operator !=

BOOL operator !=( const RECT& rect ) const;

返回值：
如果不相等则返回非零值；否则返回0。

参数：
rect 指向一个源矩形。可以是一个RECT或CRect。

说明：此操作符通过比较rect与CRect左上角和右下角的坐标值来确定它们是否不相等。
注意：这两个矩形都必须是符合规范的，否则此函数将失败。你可以在调用此函数之前，调用NormalizeRect来使矩形规范化。

请参阅：
CRect::operator ==, CRect::NormalizeRect, ::EqualRect


 CRect::operator LPRECT

Operator LPRECT();

说明：
此操作符将一个CRect转化为一个LPRECT。当使用此函数时，不需要使用地址操作符（&）。当你传递一个CRect对象给一个需要LPRECT的函数时，此操作符被自动使用。

请参阅：CRect::operator LPCRECT


 CRect::operator LPCRECT

operator LPCRECT( ) const;

说明：
此操作符将一个CRect转化为一个LPCRECT。当使用此函数时，不需要使用地址操作符（&）。当你传递一个CRect对象给一个需要LPCRECT的函数时，此操作符被自动使用。

请参阅：CRect::operator LPRECT


 CRectTracker

CRectTracker没有基类。
CRectTracker类允许一个项被显示，移动，以不同的方式改变大小。虽然CRectTracker类是设计来支持用户以图形化界面与OLE项交互的，但是它的使用不仅限于支持OLE的应用程序。它可以使用在任何需要用户界面的地方。
CRectTracker的边框可以是实线，也可以是点线。可给予项一种阴影式边框或用一种阴影样式覆盖项，用来指示项的不同状态。你可以在项的外界或内部放置八个调整大小把手。（有关八个调整大小把手的解释，参见GetHandleMask。）最后，一个CRectTracker允许你在调整项的大小时改变项的方向。
要使用CRectTracker，首先要构造一个CRectTracker对象，并指定用哪种显示状态来初始化。然后，应用程序就可以使用这个界面，提供给用户有关与CRectTracker对象相关联的OLE项当前状态的直观反馈了。
#include <afxext.h>
请参阅：
COleResizeBar, CRect, CRectTracker::GetHandleMask

CRectTracker类成员

数据成员
m_nHandleSize | 确定调整大小把手的尺寸
m_rect | 矩形的以像素表示的当前位置
m_sizeMin | 确定矩形宽度和高度的最小值
m_nStyle | 跟踪器的当前风格

构造
CRectTracker 构造一个CRectTracker对象

操作
Draw | 显示矩形
GetTrueRect | 返回矩形的宽度和高度，包括改变大小句柄
HitTest | 返回与CRectTracker对象关联的光标的当前位置
NormalizeHit | 规范化一个单击测试代码
SetCursor | 根据光标在矩形上方的位置来设置光标
Track | 支持用户操作矩形
TrackRubberBand | 支持用户“橡皮筋”似的拉伸选择

可重载
AdjustRect | 当矩形被改变大小时此函数被调用
DrawTrackerRect | 当画一个CRectTracker对象的边框时此函数被调用
OnChangedRect | 当矩形被改变大小或被移动时，此函数被调用
GetHandleMask | 调用此函数来获得一个CRectTracker项的调整大小把手的掩码


 CRectTracker::AdjustRect

virtual void AdjustRect( int nHandle, LPRECT lpRect );

参数：
nHandle | 所使用的句柄的索引。
lpRect | 指向矩形的当前尺寸的指针。（矩形的尺寸由它的高度和宽度给出。）

说明：
当通过使用调整大小把手来改变跟踪矩形的大小时，框架调用此成员函数。只有当用允许反转的形式来调用Track和TrackRubberBand时，这个函数的缺省行为才允许改变矩形的方向。
可以重载这个函数来控制在一次拖动操作期间对跟踪矩形进行调整。一种方法就是在返回之前调整由lpRect指定的坐标。
特殊的特征，如对齐至网格或保持长宽比例，不是由CRectTracker直接支持的，可以重载这个函数来实现。

请参阅：
CRectTracker::Track, CRectTracker::TrackRubberBand, CRectTracker::OnChangedRect


 CRectTracker::CRectTracker

CRectTracker( );
CRectTracker( LPCRECT lpSrcRect, UINT nStyle );

参数：
lpSrcRect 矩形对象的坐标。
nStyle指定CRectTracker对象的风格。下面的风格都是被支持的：
· | CRectTracker::solidLine | 矩形的边框用实线。
· | CRectTracker::dottedLine | 矩形的边框用点线。
· | CRectTracker::hatchedBorder | 矩形的边框用阴影模式。
· | CRectTracker::resizeInside | 调整大小把手位于矩形的内部。
· | CRectTracker::resizeOutside | 调整大小把手位于矩形的外界。
· | CRectTracker::hatchInside | 整个矩形都覆盖了阴影模式。

说明：
此成员函数用来创建并初始化一个CRectTracker对象。
缺省的构造函数用lpSrcRect的值来初始化CRectTracker对象，并将其它的尺寸初始化为系统的缺省值。如果该对象创建时没有使用参数，则不初始化m_rect和m_nStyle数据成员。

请参阅：CRect::CRect


 CRectTracker::Draw

void Draw( CDC* pDC ) const;

参数：
pDC 指向绘制所用的设备环境的指针。

说明：
此成员函数用来绘制矩形的轮廓线和内部区域。跟踪器矩形的风格决定了如何进行绘制。参见CRectTracker的构造函数，可以获得有关可用风格的更多信息。

请参阅：
CRectTracker::DrawTrackerRect, CRectTracker::CRectTracker, CRect::NormalizeRect


 CRectTracker::DrawTrackerRect

virtual void DrawTrackerRect( LPCRECT lpRect, CWnd* pWndClipTo, CDC* pDC, CWnd* pWnd );

参数：
lpRect | 指向包含要绘制的矩形的RECT的指针。
pWndClipTo | 指向窗口的指针，该窗口用于剪贴矩形。
pDC | 指向用于绘制的设备环境的指针。
pWnd | 指向窗口的指针，绘制将在此窗口中发生。

说明：
在Track或TrackRubberBand成员函数内，无论何时跟踪矩形的位置发生改变，框架都将调用此成员函数。此成员函数的缺省实现调用了CDC::DrawFocusRect函数，该函数用来绘制一个打点矩形。
重载这个函数，可以实现在跟踪期间提供不同的反馈。

请参阅：
CRectTracker::Track, CRectTracker::TrackRubberBand, CDC::DrawFocusRect


 CRectTracker::GetHandleMask

virtual UINT GetHandleMask( ) const;

返回值：
返回一个CRectTracker项的调整大小把手的掩码。

说明：
框架调用此成员函数来获取一个矩形的调整大小把手的掩码。
调整大小把手形式在矩形的边和角上，用来让用户控制矩形的形状和尺寸。
每个矩形由8个调整大小把手，标号为0－7。每一个调整大小把手由掩码中的一位代表；该位的值是2^n，这里的n是调整大小把手号。位0－3对应于角上的调整大小把手，从左上角开始，按顺时针方向转。位4－7对应于边上的调整大小把手，从上边开始，按顺时针方向转。下面的图例说明了一个矩形的调整大小把手和它们对应的调整大小把手号和值：

GetHandleMask的缺省实现返回位的掩码，以显示调整大小把手。如果某一单个的位有效，则将绘制相应的调整大小把手。
重载这个函数，可以实现隐藏或显示指定的句柄。

请参阅：CRectTracker::AdjustRect


 CRectTracker::GetTrueRect

void GetTrueRect( LPRECT lpTrueRect ) const;

参数：
lpTrueRect 指向RECT结构的指针，该结构将包含CRectTracker对象的设备坐标。

说明：
此成员函数用来获取矩形的坐标。矩形的尺寸包括位于外边框上的任何调整大小把手的高度和宽度。当函数返回时，*lpTrueRect总是一个用设备坐标表示的规范矩形。

请参阅：CRect::NormalizeRect


 CRectTracker::HitTest

int HitTest( CPoint point ) const;

返回值：
返回的值取决于CRectTracker::TrackerHit枚举类型，可以是下列值之一：
· | CRectTracker::hitNothing | -1
· | CRectTracker::hitTopLeft | 0
· | CRectTracker::hitTopRight | 1
· | CRectTracker::hitBottomRight | 2
· | CRectTracker::hitBottomLeft | 3
· | CRectTracker::hitTop | 4
· | CRectTracker::hitRight | 5
· | CRectTracker::hitBottom | 6
· | CRectTracker::hitLeft | 7
· | CRectTracker::hitMiddle | 8

参数：
point 以设备坐标表示的要测试的点。

说明：
此成员函数用来检查用户是否已经捕获一个调整大小把手。

请参阅：
CRectTracker::NormalizeHit, CRectTracker::SetCursor


 CRectTracker::NormalizeHit

int NormalizeHit( int nHandle ) const;

返回值：返回规范化句柄的索引。

参数：
nHandle 标识用户选择的句柄。

说明：
此函数用于转换潜在的翻转句柄。
当在允许反转的情况下调用CRectTracker::Track或CRectTracker::TrackRubberBand时，矩形有可能按x轴，y轴或两个轴进行反转。当这种情况发生时，HitTest将返回也相对于矩形而反转了的句柄。这不适用于绘制光标反馈，因为反馈取决于矩形的屏幕位置，而不是矩形数据结构中将要被修改的部分。

请参阅：
CRectTracker::HitTest, CRectTracker::Track, CRectTracker::TrackRubberBand


 CRectTracker::OnChangedRect

virtual void OnChangedRect( const CRect& rectOld );

参数：
rectOld 包含CRectTracker对象的旧设备坐标。

说明：
在调用Track期间，无论何时跟踪矩形发生变化，框架都将调用OnChangedRect函数。在调用该函数时，所有用DrawTrackerRect绘制的反馈都已经被删除。此函数的缺省实现不做任何事情。
当你希望在矩形改变大小后执行某些动作时，你可以重载这个函数。

请参阅：
CRectTracker::AdjustRect, CRectTracker::Track, CRectTracker::TrackRubberBand


 CRectTracker::SetCursor

BOOL SetCursor( CWnd* pWnd, UINT nHitTest ) const;

返回值：
如果前一次单击是在跟踪矩形的上方，则返回非零值；否则返回0。

参数：
pWnd | 指向当前包含光标的窗口。
nHitTest | 前一次单击测试的结果，从WM_SETCURSOR消息返回。

说明：
当光标处于CRectTracker对象的区域上方时，此成员函数用来改变光标的形状。从处理WM_SETCURSOR消息的窗口函数（通常是OnSetCursor）内调用此SetCursor函数。

请参阅：
CRectTracker::NormalizeHit, CRectTracker::HitTest, CWinApp::LoadCursor, CWnd::OnSetCursor


 CRectTracker::Track

BOOL Track( CWnd* pWnd,
CPoint point,
BOOL bAllowInvert = FALSE,
CWnd* pWndClipTo = NULL
);

返回值：
如果按下的是ESC键，则跟踪过程停止，跟踪矩形内存储的矩形不变，并且返回0。如果通过移动鼠标并释放鼠标按钮将改变提交，则新的位置和/或大小被记录在跟踪矩形内，并且返回一个非零值。

参数：
pWnd | 包含矩形的窗口对象。
point | 当前鼠标位置相对于客户区的鼠标坐标。
bAllowInvert | 如果此参数为TRUE，则矩形可沿x轴，或y轴反转；否则，此参数为FALSE。
pWndClipTo | 绘制操作将要被剪贴到的窗口。如果该参数为NULL，则pWnd用作剪贴矩形。

说明：
此成员函数显示用于改变矩形大小的用户界面。它通常从应用程序中处理WM_LBUTTONDOWN消息的函数（一般是OnLButtonDown）中调用。
这个函数将捕捉鼠标，直到用户释放鼠标左按钮，单击ESC键，或单击鼠标右按钮。当用户移动鼠标光标时，反馈由调用DrawTracderRect和OnChangedRect来更新。
如果bAllowInvert时TRUE，则跟踪矩形可以沿x轴或y轴反转。

请参阅：
CRectTracker::DrawTrackerRect, CRectTracker::OnChangedRect, CRectTracker::CRectTracker, CRectTracker::TrackRubberBand


 CRectTracker::TrackRubberBand

BOOL TrackRubberBand( CWnd* pWnd, CPoint point, BOOL bAllowInvert =TRUE );

返回值：
如果鼠标被移动并且矩形不是空的，则返回非零值；否则返回0。

参数：
pWnd | 包含矩形的窗口对象。
point | 当前鼠标相对于客户区的设备坐标。
bAllowInvert | 如果是TRUE，则矩形可以沿x轴或y轴反转；否则，其值就是FALSE。

说明：
此成员函数用来进行“橡皮筋似”选择。它通常从处理WM_LBUTTONDOWN消息的应用程序函数（一般时OnLButtonDown）中调用。
这个函数将捕捉鼠标，直到用户释放鼠标左按钮，单击ESC键，或单击鼠标右按钮。当用户移动鼠标光标时，反馈由调用DrawTracderRect和onChangedRect来更新。
通过从右下方选择一个rubber-band-type选择来实现跟踪。如果允许反转的话，则可以通过向上至左或向下至右拖动来改变矩形的大小。

请参阅：
CRectTracker::DrawTrackerRect, CRectTracker::OnChangedRect, CRectTracker::CRectTracker


 CRectTracker::m_nHandleSize

说明：
此数据成员是CRectTracker的调整大小把手的按像素表示的尺寸。用缺省的系统值初始化。


 CRectTracker::m_nStyle

说明：
矩形的当前风格，各种风格的列表参见CRectTracker::CRectTracker。

请参阅：
CRectTracker::CRectTracker, CRectTracker::Draw


 CRectTracker::m_rect

说明：
用客户坐标（以像素计）表示的矩形的当前位置。

请参阅：
CRectTracker::CRectTracker, CRectTracker::Track, CRectTracker::TrackRubberBand


 CRectTracker::m_sizeMin

说明：
矩形的最小尺寸。缺省值cx和cy都从边框宽度的系统缺省值计算而来。该数据成员只用于AdjustRect成员函数。

请参阅：
CRectTracker::Track, CRectTracker::TrackRubberBand, CRectTracker::AdjustRect


 CResourceException

CObject
└CException
└CResourceException

当Windows不能找到或分配一个被申请的资源时就生成一个CResourceException对象。
#include <afxwin.h>

CResourceException类成员

构造
CResourceException 构造一个CResourceException对象


 CResourceException::CResourceException

CResourceException();

说明：
此成员函数用来构造一个CResourceException对象。
不要直接使用这个构造函数，应该直接调用全局函数AfxThrowResourceException。

请参阅：
AfxThrowResourceException, Exception Processing


 CRgn

CObject
└CGdiObject
└CRgn

CRgn类封装了一个Windows图形设备接口（GDI）区域。这一区域是某一窗口中的一个椭圆或多边形区域。要使用这个区域，你可以使用类CRgn的成员函数以及被定义为类CDC的成员函数的剪贴函数。
调用CRgn的成员函数就可以创建，修改和检取关于此区域对象的信息。
#include <afxwin.h>

CRgn类成员

Construction
CRgn 构造一个CRgn对象

Initialization
CreateRectRgn | 用一个矩形区域来初始化一个CRgn对象
CreateRectRgnIndirect | 用由一个RECT结构定义的矩形区域来初始化一个CRgn对象
CreateEllipticRgn | 用一个椭圆形区域来初始化一个CRgn对象
CreateEllipticRgnIndirect | 用由一个RECT结构定义的椭圆形区域来初始化一个CRgn对象
CreatePolygonRgn | 用一个多边形区域来初始化一个CRgn对象。如果有必要，系统通过在第一个顶点和最后一个顶点之间绘制直线来自动关闭该多边形
CreatePolyPolygonRgn | 用一系列封闭的多边形组成的区域来初始化一个CRgn对象。这些多边形可能互不相交或相互重叠
CreateRoundRectRgn | 用一个圆角的矩形区域来初始化一个CRgn对象
CombineRgn | 设置一个CRgn对象，使它等效于两个指定的CRgn对象的联合
CopyRgn | 设置一个CRgn对象，使它为一个指定的CRgn对象的拷贝
CreateFromPath | 从被选入给定设备环境的路径创建一个区域
CreateFromData | 根据给定的区域和变换数据创建一个区域

Operations
EqualRgn | 检查两个CRgn对象，确定它们是否相等
FromHandle | 当给定了一个Windows区域的句柄时返回指向一个CRgn对象的指针
GetRegionData | 用描述给定区域的数据来填充指定的缓冲区
GetRgnBox | 检取一个CRgn对象的限定矩形的坐标
OffsetRgn | 用指定的偏移量移动一个CRgn对象
PtInRegion | 确定一个指定的点是否在矩形内
RectInRegion | 确定一个指定矩形的任何部分是否都在区域的边界内
SetRectRgn | 将CRgn对象设置为指定的矩形区域

Operators
operator HRGN 返回包含在CRgn对象中的Windows句柄


 CRgn::CombineRgn

int CombineRgn( CRgn* pRgn1, CRgn* pRgn2, int nCombineMode );

返回值：
返回最后结果区域的类型。它可以是下列值之一：
· | COMPLEXREGION | 新区域具有相互重叠的边界。
· | ERROR | 未创建新区域。
· | NULLREGION | 新区域为空。
· | SIMPLEREGION | 新区域没有相互重叠的边界。

参数：
pRgn1 | 表示一个已经存在的区域。
pRgn2 | 表示一个已经存在的区域。
nCombineMode指定当组合两个源区域时要执行的操作。它可以是下列值之一：
· | RGN_AND | 使用两个区域互相重叠的区域（相交区域）。
· | RGN_COPY | 创建区域1（由pRgn1标识）的一个拷贝
· | RGN_DIEF | 创建一个区域，该区域由区域1（由pRgn1标识）的不是区域2（由pRgn2标识）的那一部分区域组成。
· | RGN_OR | 组合两个区域的整个部分（两个区域的并）。
· | RGN_XOR | 组合两个区域，但去掉相互重叠的区域。

说明：
此成员函数通过组合两个已有的区域来创建一个新的GDI区域。所组合成的区域就像nCombineMode所指定的一样。
两个指定的区域被组合，所得到的结果区域的句柄被保存在CRgn对象中。因此，不管CRgn中原来保存的区域是什么，都将被合并后的区域所代替。
区域的大小被限制在32767×32767个逻辑单位和64K内存这两个值中较小的那个值的范围内。
使用CopyRgn只是简单地将一个区域拷贝到另一个区域。

请参阅：CRgn::CopyRgn, ::CombineRgn


 CRgn::CopyRgn

int CopyRgn( CRgn* pRgnSrc );

返回值：
返回最后结果区域的类型。它可以是下列值之一：
· | COMPLEXREGION | 新区域具有相互重叠的边界。
· | ERROR | 未创建新区域。
· | NULLREGION | 新区域为空。
· | SIMPLEREGION | 新区域没有相互重叠的边界。

参数：
pRgnSrc 标识一个已有的区域。

说明：
此成员函数用来将一个由pRgnSrc定义的区域拷贝到CRgn对象中。新的区域将代替CRgn对象中原来保存的区域。此函数是CombineRgn成员函数的一个特例。

请参阅：CRgn::CombineRgn, ::CombineRgn


 CRgn::CreateEllipticRgn

BOOL CreateEllipticRgn( int x1, int y1, int x2, int y2 );

返回值：如果操作成功则返回非零值；否则返回0。

参数：
x1 | 指定椭圆的边界矩形的左上角的逻辑x坐标。
y1 | 指定椭圆的边界矩形的左上角的逻辑y坐标。
x2 | 指定椭圆的边界矩形的右下角的逻辑x坐标。
y2 | 指定椭圆的边界矩形的右下角的逻辑y坐标。

说明：
此成员函数用来创建一个椭圆形区域。该区域由用x1，y1，x2，和y2指定的边界矩形来定义。该区域保存在CRgn对象中。
区域的大小被限制在32767×32767个逻辑单位和64K内存这两个值中较小的那个值的范围内。
当使用完了由CreateEllipticRgn函数创建的区域时，应用程序应该将此区域选择出设备环境外，并用DeleteObject函数来删除它。

请参阅：CRgn::CreateEllipticRgnIndirect, ::CreateEllipticRgn


 CRgn::CreateEllipticRgnIndirect

BOOL CreateEllipticRgnIndirect( LPCRECT lpRect );

返回值：如果操作成功则返回非零值；否则返回0。

参数：
lpRect 指向一个RECT结构或一个CRect对象，该结构或对象包含了椭圆的边界矩形的左上角和右下角的逻辑坐标。

说明：
此成员函数用来创建一个椭圆形区域。该区域由用lpRect指向的结构或对象定义，它保存在CRgn对象中。
区域的大小被限制在32767×32767个逻辑单位和64K内存这两个值中较小的那个值的范围内。
当使用完了由CreateEllipticRgnIndirect函数创建的区域时，应用程序应该将此区域选择出设备环境外，并用DeleteObject函数来删除它。

请参阅：CRgn::CreateEllipticRgn, ::CreateEllipticRgnIndirect


 CRgn::CreateFromData

BOOL CreateFromData( const XFORM* lpXForm, int nCount, const RGNDATA* pRgnData );

返回值：如果函数成功则返回非零值；否则返回0。

参数：
lpXForm | 指向一个XFORM数据结构，该数据结构定义了要在区域中实现的变换。如果这个指针是NULL，则将使用相同的变换。
nCount | 指定由pRgnData指向的结构的字节数。
pRgnData | 指向一个RGNDATA数据结构，该数据结构包含了区域数据。

说明：
此成员函数从给定的区域和变换数据创建一个区域。应用程序可以通过调用函数CRgn::GetRegionData来获取一个区域的数据。

请参阅：CRgn::GetRegionData, ::ExtCreateRegion


 CRgn::CreateFromPath

BOOL CreateFromPath( CDC* pDC );

返回值：如果函数成功则返回非零值；否则返回0。

参数：
pDC 标识包含有一条闭合路径的设备环境。

说明：
此成员函数从被选入给定设备环境的路径创建一个区域。由pDC标识的设备环境中必须包含有一条闭合的路径。在CreateFromPath把一条路径转换为一个区域后，Windows从该设备环境中丢弃此闭合路径。

请参阅：CDC::BeginPath, CDC::EndPath, CDC::SetPolyFillMode


 CRgn::CreatePolygonRgn

BOOL CreatePolygonRgn( LPPOINT lpPoints, int nCount, int nMode );

返回值：如果操作成功则返回非零值；否则返回0。

参数：
lpPoints 指向一个POINT结构数组，或指向一个CPoint对象数组。每一个结构指定多边形的一个顶点的x坐标和y坐标。
POINT结构具有下面这样的形式：
typedef struct tagPOINT
{
int x;
int y;
} POINT;

nCount | 指定由lpPoints指向的数组中的POINT结构或CPoint对象的数目。
nMode | 指定区域的填充模式。这个参数可以是ALTERNATE或WINDING。

说明：
此成员函数创建一个多边形区域。如果必要，系统通过从多边形的最后一个顶点到第一个顶点绘制一条直线来关闭此多边形。创建出的多边形区域被保存在CRgn对象中。区域的大小被限制在32767×32767个逻辑单位和64K内存这两个值中较小的那个值的范围内。
当多边形的填充模式是ALTERNATE时，系统在每条扫描线上填充第奇数条边与第偶数条边之间的区域。也就是说，系统将填充第1条边和第2条边之间的区域；第3条边和第4条边之间的区域，等等。
当多边形的填充模式时WINDING时，系统使用绘图的方向来决定是否填充一个区域。多边形中的线段不是以顺时针方向就是以逆时针方向绘制的。一旦从一个封闭区域内向一个图形之外画的假想线穿过了一条顺时针线段时，便将某一计数值加1；若这条线穿过了一条逆时针线段，则将计数值减1。当假想线到达图形之外时，若计数值为非零，则区域被填充。
当使用完了由CreatePolygonRgn函数创建的区域时，应用程序应该将此区域选择出设备环境外，并用DeleteObject函数来删除它。

请参阅：CRgn::CreatePolyPolygonRgn, ::CreatePolygonRgn


 CRgn::CreatePolyPolygonRgn

BOOL CreatePolyPolygonRgn( LPPOINT lpPoints, LPINT lpPolyCounts, int nCount, int nPolyFillMode );

返回值：如果操作成功则返回非零值；否则返回0。

参数：
lpPoints 指向一个POINT结构数组，或指向一个CPoint对象数组，该结构或对象定义了多边形的顶点。每一个多边形都必须被显式地关闭，因为系统不会自动地关闭它们。多边形被连续指定。
POINT结构具有下面这样的形式：
typedef struct tagPOINT
{
int x;
int y;
} POINT;

lpPolyCounts | 指向一个整数数组。第一个整数指定lpPoints数组中的第一个多边形的顶点数，第二个整数指定lpPoints数组中的第二个多边形的顶点数，如此等等。
nCount | 指定lpPolyCounts数组中的整数的总数。
nPolyFillMode | 指定多边形填充模式。这个值可以是ALTERNATE或WINDING。

说明：
此成员函数用来创建一个包含一系列封闭多边形的区域。获得的结果矩形被保存在CRgn对象中。
这些多边形可能是互相分开的，或可能时相互重叠的。
区域的大小被限制在32767×32767个逻辑单位和64K内存这两个值中较小的那个值的范围内。
当多边形的填充模式是ALTERNATE时，系统在每条扫描线上填充第奇数条边与第偶数条边之间的区域。也就是说，系统将填充第1条边和第2条边之间的区域；第3条边和第4条边之间的区域，等等。
当多边形的填充模式是WINDING时，系统使用绘图的方向来决定是否填充一个区域。多边形中的线段不是以顺时针方向就是以逆时针方向绘制的。一旦从一个封闭区域内向一个图形之外画的假想线穿过了一条顺时针线段时，便将某一计数值加1；若这条线穿过了一条逆时针线段，则将计数值减1。当假想线到达图形之外时，若计数值为非零，则区域被填充。
当使用完了由CreatePolyPolygonRgn函数创建的区域时，应用程序应该将此区域选择为设备环境外，并用CGDIObject::DeleteObject函数来删除它。

请参阅：
CRgn::CreatePolygonRgn, CDC::SetPolyFillMode, ::CreatePolyPolygonRgn


 CRgn::CreateRectRgn

BOOL CreateRectRgn( int x1, int y1, int x2, int y2 );

返回值：如果操作成功则返回非零值；否则返回0。

参数：
x1 | 指定区域的左上角的逻辑x坐标。
y1 | 指定区域左上角的逻辑y坐标。
x2 | 指定区域右下角的逻辑x坐标。
y2 | 指定区域的右下角的逻辑y坐标。

说明：
此成员函数用来创建一个矩形区域，该区域被保存在CRgn对象中。
区域的大小被限制在32767×32767个逻辑单位和64K内存这两个值中较小的那个值的范围内。
当使用完了由CreateRectRgn函数创建的区域时，应用程序应该将此区域选择出设备环境外，并用CGDIObject::DeleteObject函数来删除它。

请参阅：
CRgn::CreateRectRgnIndirect, CRgn::CreateRoundRectRgn, ::CreateRectRgn


 CRgn::CreateRectRgnIndirect

BOOL CreateRectRgnIndirect( LPCRECT lpRect );

返回值：如果操作成功则返回非零值；否则返回0。

参数：
lpRect 指向一个RECT结构或CRect对象，该结构或对象包含了区域的左上角和右下角的逻辑坐标。
RECT结构具有下面的格式：
typedef struct tagRECT
{
int left;
int top;
int right;
int bottom;
} RECT;

说明：
此成员函数用来创建一个矩形区域，该区域被保存在CRgn对象中。
区域的大小被限制在32767×32767个逻辑单位和64K内存这两个值中较小的那个值的范围内。
当使用完了由CreateRectRgnIndirect函数创建的区域时，应用程序应该将此区域选择出设备环境外，并用CGDIObject::DeleteObject成员函数来删除它。

请参阅：
CRgn::CreateRectRgn, CRgn::CreateRoundRectRgn, ::CreateRectRgnIndirect


 CRgn::CreateRoundRectRgn

BOOL CreateRoundRectRgn( int x1, int y1, int x2, int y2, int x3, int y3 );

返回值：如果操作成功则返回非零值；否则返回0。

参数：
x1 | 指定区域的左上角的逻辑x坐标。
y1 | 指定区域左上角的逻辑y坐标。
x2 | 指定区域右下角的逻辑x坐标。
y2 | 指定区域的右下角的逻辑y坐标。
x3 | 指定用来创建圆角的椭圆的宽度。
y3 | 指定用来创建圆角的椭圆的高度。

说明：
此成员函数用来创建一个具有圆角的矩形区域。
区域的大小被限制在32767×32767个逻辑单位和64K内存这两个值中较小的那个值的范围内。
当使用完了由CreateRoundRectRgn函数创建的区域时，应用程序应该将此区域选择出设备环境外，并用CGDIObject::DeleteObject函数来删除它。

请参阅：
CRgn::CreateRectRgn, CRgn::CreateRectRgnIndirect, ::CreateRoundRectRgn


 CRgn::CRgn

CRgn();

说明：
此成员函数用来构造一个CRgn对象。在未使用CRgn中的某一个或几个成员函数来初始化该CRgn对象之前，m_hObject数据成员中不含由一个有效的Windows GDI区域。


 CRgn::EqualRgn

BOOL EqualRgn( CRgn* pRgn ) const;

返回值：如果两个区域相等则返回非零值；否则返回0。

参数：
pRgn 标识一个区域。

说明：
此成员函数用来确定给定的矩形与CRgn对象中保存的矩形是否相等。

请参阅：::EqualRgn


 CRgn::FromHandle

static CRgn* PASCAL FromHandle( HRGN hRgn );

返回值：
如果函数成功则返回一个指向CRgn对象的指针。如果函数不成功，则返回值为NULL。

参数：
hRgn 指定一个Windows区域的句柄。

说明：
当给出了一个Windows区域句柄时，此成员函数返回一个指向CRgn对象的指针。如果还没有一个CRgn对象连接到这个句柄上，则创建一个临时CRgn对象并将它连接到句柄上。这一临时的CRgn对象将一直有效，直到应用程序在其事件循环中再次有空闲时间为止。此时，所有的临时图形对象都将被删除。也就是说，该临时对象仅在处理一条窗口消息的过程中有效。


 CRgn::GetRegionData

int GetRegionData( LPRGNDATA lpRgnData, int nCount ) const;

返回值：
指定结果区域的类型。它可以是下列值之一：
· | COMPLEXREGION | 新区域具有相互重叠的边界。
· | ERROR | 未创建新区域。
· | NULLREGION | 新区域为空。
· | SIMPLEREGION | 新区域没有相互重叠的边界。

参数：
lpRgnData | 指向一个RGNDATA数据结构，该结构用来接收信息。如果这个参数是NULL，则返回值包含了此区域数据的字节数。
nCount | 指定lpRgnData缓冲的用字节表示的大小。

说明：
此成员函数用描述区域的数据来填充指定的缓存。这些数据包括组成该区域的矩形的尺寸。此函数常与CRgn::CreateFromData函数连用。

请参阅：CRgn::CreateFromData


 CRgn::GetRgnBox

int GetRgnBox( LPRECT lpRect ) const;

返回值：
指定结果区域的类型。它可以是下列值之一：
· | COMPLEXREGION | 新区域具有相互重叠的边界。
· | ERROR | 未创建新区域。
· | NULLREGION | 新区域为空。
· | SIMPLEREGION | 新区域没有相互重叠的边界。

参数：
lpRect 指向一个RECT结构或CRect对象，该结构或对象包含了区域的左上角和右下角的逻辑坐标。
RECT结构具有下面的格式：
typedef struct tagRECT
{
int left;
int top;
int right;
int bottom;
} RECT;

说明：此成员函数用来获取CRgn对象的边界矩形的坐标。

请参阅：::GetRgnBox


 CRgn::OffsetRgn

int OffsetRgn( int x, int y );
int OffsetRgn( POINT point );

返回值： 指定结果区域的类型。它可以是下列值之一：
· | COMPLEXREGION | 新区域具有相互重叠的边界。
· | ERROR | 未创建新区域。
· | NULLREGION | 新区域为空。
· | SIMPLEREGION | 新区域没有相互重叠的边界。

参数：
x | 指定向左或向右移动的单位数。
y | 指定向上或向下移动的单位数。
point | 此参数的x坐标指定向左或向右移动的单位数。其y坐标指定向上或向下移动的单位数。此参数可以是一个POINT结构或一个CPoint对象。

说明：
此成员函数用来将保存在CRgn对象中的区域移动指定的偏移。此函数将区域沿x轴移动x个单位，沿y轴移动y个单位。
区域的坐标值必须小于或等于32,767，但大于或等于-32,768。要谨慎地选择x和y参数，以避免无效的区域坐标。

请参阅：::OffsetRgn


 CRgn::PtInRegion

BOOL PtInRegion( int x, int y ) const;
BOOL PtInRegion( POINT point ) const;

返回值：如果点在区域内则返回非零值；否则返回0。

参数：
x | 指定要测试的点的x坐标。
y | 指定要测试的点的y坐标。
point | 此参数的x坐标和y坐标指定了要测试的点的x坐标和y坐标。此point参数或者是一个point结构或是一个CPoint对象。

说明：
此成员函数用来检查由x和y给定的点是否在保存在CRgn对象中的区域的内部。

请参阅：::PtInRegion


 CRgn::RectInRegion

BOOL RectInRegion( LPCRECT lpRect ) const;

返回值：
如果指定矩形的任何一部分在区域的边界内，则返回非零值；否则返回0。

参数：
lpRect 指向一个RECT结构或CRect对象，该结构或对象包含了区域的左上角和右下角的逻辑坐标。
RECT结构具有下面的格式：
typedef struct tagRECT
{
int left;
int top;
int right;
int bottom;
} RECT;

说明：
此成员函数用来确定由lpRect指定的矩形的任何一部分是否在保存在CRgn对象中的区域的边界之内。

请参阅：::RectInRegion


 CRgn:: SetRectRgn

void SetRectRgn( int x1, int y1, int x2, int y2 );
void SetRectRgn( LPCRECT lpRect );

参数：
x1 | 指定矩形区域的左上角的逻辑x坐标。
y1 | 指定矩形区域左上角的逻辑y坐标。
x2 | 指定矩形区域右下角的逻辑x坐标。
y2 | 指定矩形区域的右下角的逻辑y坐标。
lpRect | 指定一个矩形区域。该参数可以是一个指向RECT结构或一个CRect对象的指针。

说明：
此成员函数用来创建一个矩形区域。但是它与CreateRectRgn不一样，此函数不从局部Windows应用程序堆中分配任何附加的内存。此函数使用为存放在CRgn对象中的区域分配的空间。这就意味着在调用SetRectRgn函数之前必须使用一个有效的Windows区域将该CRgn对象初始化。由参数x1，x2，y1，和y2指定的两个点指定已分配的空间的最小尺寸。
用这个函数代替CreateRectRgn成员函数可以避免调用局部内存管理程序。

请参阅：CRgn::CreateRectRgn, ::SetRectRgn


 CRgn::operator HRGN

operator HRGN( ) const;

返回值：
如果成功则返回一个WindowsGDI对象句柄，该对象由CRgn对象代表；否则返回NULL。

说明：
此操作符用来获取CRgn对象的与Windows GDI连接的句柄。此操作符是一个强制转换操作符，它支持对一个HRGN对象的直接使用。
要获取更多有关使用图形对象的信息，请参见“Win32 SDK程序员参考”中的文章“图形化对象”。


 CRichEditCntrItem

CObject
└CCmdTarget
└CDocItem
└COleClientItem
└CRichEditCntrItem

一个“带格式编辑控件”是一个窗口，在这个窗口中用户可以输入和编辑文本。文本可以是字母或段落格式，也可以包括嵌入的OLE对象。带格式编辑控件为格式化文本提供了设计界面。但是，应用程序必须实现需要的用户部件，以使格式化操作对用户来说可用。
在MFC的文档视结构的环境中，CRichEditCntrItem类与CRichEditView和CRichEditDoc一起提供带格式编辑控件的功能。CRichEditCntrView保存文本和文本的格式化特征。CRichEditCntrDoc保存视中的OLE客户项的列表。CRichEditCntrItem提供容器方对OLE客户项的访问。
这个Windows通用控件（也就是CRichEditCntr及其相关类）只对于运行在Window95和Windows NT 3.51及更新版本下的程序是可用的。
有关在一个MFC应用程序中使用带格式编辑容器项的例子，请参见WORDPAD示例应用程序。
#include <afxrich.h>
请参阅：CRichEditDoc, CRichEditView

CRichEditCntrItem类成员

构造
CRichEditCntrItem 构造一个CRichEditCntrItem对象

操作
SyncToCRichEditObject 用另一个类型激活项


 CRichEditCntrItem::CRichEditCntrItem

CRichEditCntrItem( REOBJECT* preo = NULL, CRichEditDoc* pContainer = NULL );

参数：
preo | 指向一个REOBJECT结构的指针，该结构描述了一个OLE项。微软这个OLE项构造CRichEditCntrItem对象。如果preo时NULL，则客户项是空的。
pContainer | 指向一个容器文档的指针，该容器文档将包含这个项。如果pContainer是NULL，则你必须显式地调用COleoDcument::AddItem来将这个客户项增加到一个文档中。

说明：
此成员函数用来创建一个CRichEditCntrItem对象，并将它添加到容器文档中。
此函数不实现任何OLE初始化。
更多的信息，请参见Win32文档中的REOBJECT结构。

请参阅：COleDocument::AddItem, CRichEditDoc


 CRichEditCntrItem::SyncToCRichEditObject

void SyncToRichEditObject( REOBJECT& reo );

参数：
reo 指向一个REOBJECT结构的引用，该结构描述了一个OLE项。

说明：
此成员函数用来使这个CRichEditCntrItem的设备外观，即DVASPECT与reo所指定的结构同步。
更多的信息请参见OLE文档中的DVASPECT。


 CRichEditCtrl

CObject
└CCmdTarget
└CWnd
└CRichEditCtrl

一个“带格式编辑控件”是一个窗口，在这个窗口中用户可以输入和编辑文本。文本可以是字母或段落格式，也可以包括嵌入的OLE对象。带格式编辑控件为格式化文本提供了设计界面。但是，应用程序必须实现需要的用户部件，以使格式化操作对用户来说可用。
CRichEditCntr类提供了带格式编辑控件的功能。这个Windows通用控件（也就是CRichEditCtrl类）只对于运行在Window95和Windows NT 3.51及更新版本下的程序是可用的。
重点：
如果你正在使用一个对话框中的带格式编辑控件（不管你的应用程序是SDI，MDI，或是基于对话框的），你必须在显示该对话框之前调用AfxInitRichEdit一次。通常是在你的应用程序的IniInstance成员函数中调用这个函数。你不用在每一次显示这个对话框的时候都调用此AfxInitRichEdit函数，只要在第一次时调用它就可以了。如果你是在使用CRichEditView，则不用调用AfxInitRichEdit。
有关在一个MFC应用程序中使用带格式编辑容器项的例子，请参见WORDPAD示例应用程序。
#include <afxcmn.h>
请参阅：CEdit, CRichEditView

CRichEditCtrl类成员

构造
CRichEditCtrl | 构造一个CRichEditCtrl对象
Create | 创建Windows带格式编辑控件并将它与这个CRichEditCtrl对象相联系

行操作
GetLineCount | 获取这个CRichEditCtrl对象中的行数目
GetLine | 从这个CRichEditCtrl对象中获取一行文本
GetFirstVisibleLine | 确定这个CRichEditCtrl对象的最上面的可见行
LineIndex | 获取此CRichEditCtrl对象中一个给定行的字符索引
LineFromChar | 确定是哪一行包含了给定字符
LineLength | 获取此CRichEditCtrl对象中的给定行的长度
LineScroll | 在此CRichEditCtrl对象中滚动文本

选择操作
Clear | 清除当前选择
GetSel | 获取此CRichEditCtrl对象中的当前选择的开始和结束位置
SetSel | 设置此CRichEditCtrl对象中的选择
GetSelText | 获取此CRichEditCtrl对象中的当前选择的文本
GetSelectionType | 获取此CRichEditCtrl对象中的当前选择中内容的类型
ReplaceSel | 用指定的文本替换此CRichEditCtrl对象中的当前选择
HideSelection | 显示或隐藏当前的选择

格式化操作
GetDefaultCharFormat | 获取此CRichEditCtrl对象中当前缺省的字符格式属性
SetDefaultCharFormat | 设置此CRichEditCtrl对象中的当前缺省字符格式的属性
GetSelectionCharFormat | 获取此CRichEditCtrl对象中当前选择的字符格式属性
SetSelectionCharFormat | 设置此CRichEditCtrl对象中当前选择的字符格式属性
GetParaFormat | 获取此CRichEditCtrl对象中的当前选择的段落格式属性
SetParaFormat | 设置此CRichEditCtrl对象中的当前选择的段落格式属性
SetWordCharFormat | 设置此CRichEditCtrl对象中的当前单词的字符格式属性

编辑操作
Undo | 取消最后一次编辑操作
CanUndo | 确定是否可以取消一次编辑操作
EmptyUndoBuffer | 重置（清除）此CRichEditCtrl对象的取消标志
StreamIn | 将来自一个输入流的文本插入此CRichEditCtrl对象中
StreamOut | 将来自此CRichEditCtrl对象的文本保存到输出流中

一般操作
GetModify | 确定在最后一次保存后此CRichEditCtrl对象的内容是否已经被改变了
SetModify | 为这个CRichEditCtrl对象设置或清除修改标志
FindText | 在这个CRichEditCtrl对象中定位文本
GetRect | 为此CRichEditCtrl对象获取格式化矩形
SetRect | 为此CRichEditCtrl对象设置格式化矩形
GetCharPos | 确定此CRichEditCtrl对象中的一个给定字符的位置
SetOptions | 为这个CRichEditCtrl对象设置选项
SetReadOnly | 为这个CRichEditCtrl对象设置只读选项
GetTextLength | 获取此CRichEditCtrl对象中的文本的长度
GetLimitText | 获取一个用户可以输入这个CRichEditCtrl对象的文本数量的限制
LimitText | 限制一个用户可以输入此CRichEditCtrl对象的文本数量
GetEventMask | 获取此CRichEditCtrl对象的事件掩码
SetEventMask | 设置此CRichEditCtrl对象的事件掩码
RequestResize | 强迫此CRichEditCtrl对象发送请求改变大小的通知
SetBackgroundColor | 设置此CRichEditCtrl对象中的背景颜色
SetTargetDevice | 设置此CRichEditCtrl对象的目标输出设备
FormatRange | 为目标输出设备格式化一个文本范围
DisplayBand | 显示此CRichEditCtrl对象的一部分内容

剪贴板操作
Copy | 将当前选项拷贝到剪贴板上
Cut | 将存取选择剪下到剪贴板上
Paste | 剪贴板上的内容插入到此带格式编辑控件中
PasteSpecial | 将剪贴板上的内容按指定的数据格式插入到此带格式编辑控件中
CanPaste | 确定剪贴板上的内容是否可以粘贴到此带格式编辑控件中

OLE操作
GetIRichEditOle | 为此带格式编辑控件获取一个直线IrichEdit Ole接口的指针
SetOLECallback | 为此带格式编辑控件设置IrichEditOleCallback COM对象


 CRichEditCtrl::CanPaste

BOOL CanPaste( UINT nFormat = 0 ) const;

返回值：
如果剪贴板的格式可以被粘贴，则返回非零值；否则返回0。

参数：
nFormat 要查询的剪贴板数据格式。此参数是某个预定义的剪贴板格式，或是由RegisterClipboardFormat返回的值。

说明：
此成员函数用来确定一个带格式编辑控件是否可以粘贴指定的剪贴板格式。如果nFormat是0，CanPaste将尝试当前剪贴板中的任何格式。

请参阅：
CRichEditCtrl::Paste, CRichEditCtrl::PasteSpecial


 CRichEditCtrl::CanUndo

BOOL CanUndo( ) const;

返回值：
如果最后一次编辑操作可以被通过调用Undo成员函数来取消，则返回非零值；否则，如果不能取消，则返回0。

说明：
此成员函数用来确定最后一次编辑操作是否可以被取消。
更多信息，请参见Win32文档中的EM_CAUNDO。

请参阅：
CRichEditCtrl::Undo, CRichEditCtrl::EmptyUndoBuffer


 CRichEditCtrl::Clear

void Clear( );

说明：
此成员函数用来删除（清除）带格式编辑控件中的当前选择（如果有的话）。
由Clear执行的删除，可以通过调用Undo成员函数来取消。
要删除当前的选择，并将其作为剪贴板的内容，可以调用Cut成员函数。
更多的信息，请参见Win32文档中的WM_CLEAR。

请参阅：
CRichEditCtrl::Undo, CRichEditCtrl::Cut, CRichEditCtrl::Copy, CRichEditCtrl::Paste


 CRichEditCtrl::Copy

void Copy( );

说明：
此成员函数用来将带格式编辑控件中的当前选择（如果有的话）拷贝到剪贴板中。
更多的信息，请参见Win32文档中的WM_COPY。

请参阅：CRichEditCtrl::Paste, CRichEditCtrl::Cut


 CRichEditCtrl::Create

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINTnID );

返回值：如果初始化成功，则返回非零值；否则返回0。

参数：
dwStyle | 指定编辑控件的风格。可以将编辑风格的任何组合应用到此控件。
rect | 指定编辑控件的大小和位置。它可以是一个CRect对象或RECT结构。
pParentWnd | 指定编辑控件的父窗口（通常是一个CDialog）。它不能是NULL。
nID | 指定编辑控件的ID。

说明：
分两步来构造一个CRichEditCtrl对象。首先，调用CRichEditCtrl构造函数，然后调用Create，该函数创建Windows编辑控件并将其连接到CRichEditCtrl对象上。
当你用这个函数来创建一个带格式编辑控件时，首先你必须加载必须的通用控件库。为了加载此库，可以调用全局函数AfxInitRichEdit，它将按顺序初始化通用控件库。在你的进程中你只需要调用AfxInitRichEdit一次。
当执行Create时，Windows发送WM_NCCREATE，WM_NCCALCSIZE，WM_CREATE，和WM_GETMINMAXINFO消息给这个编辑控件。
缺省的，这些消息由CWnd基类中的OnNcCreate，OnNcCalcSize，OnCreate，和OnGetMinMaxInfo成员函数来处理。为了扩展这些缺省的消息处理，可以从CRichEditCtrl派生一个类，向此新类中添加一个消息映射，并重载上述消息处理成员函数。例如，重载OnCreate来为新类实现需要的初始化。
可以将下列的窗口风格应用到一个编辑控件上。
· | WS_CHILD | 总是使用。
· | WS_VISIBLE | 经常使用。
· | WS_DISABLED | 很少使用。
· | WS_GROUP | 可用于成组控件。
· | WS_TABSTOP | 将编辑控件包括在TABLE键的顺序中。

请参阅：CRichEditCtrl::CRichEditCtrl


 CRichEditCtrl::CRichEditCtrl

CRichEditCtrl( );

说明：
此成员函数用来构造一个CRichEditCtrl对象。使用Create来构造Windows 带格式编辑控件。

请参阅：CRichEditCtrl::Create


 CRichEditCtrl::Cut

void Cut();

说明：
此成员函数用来删除（剪切）带格式编辑控件中的当前选择（如果有），并将其拷贝到剪贴板中。
用Cut执行的删除可以通过调用Undo成员函数来取消。
要删除当前的选择而又不将被删除的内容放到剪贴板中，可以调用Clear成员函数。
更多的信息，请参见Win32文档中的WM_CUT。

请参阅：
CRichEditCtrl::Copy, CRichEditCtrl::Undo, CRichEditCtrl::Clear


 CRichEditCtrl::DisplayBand

BOOL DisplayBand( LPRECT pDisplayRect );

返回值：
如果显示格式化文本成功，则返回非零值；否则返回0。

参数：
pDisplayRect 指向一个RECT或CRect对象的指针，用来指定显示文本的设备的区域。

说明：
此成员函数用来显示带格式编辑控件的内容（文本和OLE项）的一部分，用前面的FormatRange指定的格式。文本和OLE项被粘贴到由pDisplayRect指针指定的区域。
更多的信息，请参见Win32文档中的WM_DISPLAYBAND。

请参阅：CRichEditCtrl::FormatRange


 CRichEditCtrl::EmptyUndoBuffer

void EmptyUndoBuffer();

说明：
此成员函数用来重置此带格式编辑控件的undo标志。此时控件将不能取消最后一次编辑操作。无论什么时候当带格式编辑控件中的一项操作是可以被取消的时，取消标志就被设置。
当你调用CWnd的成员函数SetWindowText时，取消标志被自动清除。
更多的信息，请参见Win32文档中的EM_EMPTYUNDOBUFFER。

请参阅：
CRichEditCtrl::CanUndo, CRichEditCtrl::Undo, CWnd::SetWindowText


 CRichEditCtrl::FindText

long FindText( DWORD dwFlags, FINDTEXTEX* pFindText ) const;

返回值：
返回下一次匹配的从零开始的字符位置；如果没有匹配则返回-1。

参数：
dwFlags匹配标准的标志。可以是下列值的零个或多个：
· | FR_MATCHCASE | 指明查找是大小写敏感的。
· | FR_WHOLEWORD | 指明在查找中要考虑单词的边界。
pFindText 指向一个FINDTEXTEX结构的指针，该结构给出了用于查找的参数并返回找到匹配的范围。

说明：
此成员函数用来在带格式编辑控件中查找文本。你可以通过在FINDTEXTEX结构中设置CHARRANGE中的适当范围参数来进行向上或向下搜索。
更多的信息，请参见Win32文档中的EM_FINDTEXTEX消息和FINDTEXTEX结构。

请参阅：CRichEditCtrl::SetSel


 CRichEditCtrl::FormatRange

long FormatRange( FORMATRANGE* pfr, BOOL bDisplay = TRUE );

返回值：
返回值为适应该区域的最后一个字符的索引再加1。

参数：
pfr | 指向FORMATRANGE结构的指针，该结构包含了有关输出设备的信息。如果是NULL，则表明此带格式编辑控件中的高速缓存中的信息可以释放了。
bDisplay | 指示是否应该提交文本。如果是FALSE，则表明文本正好是适量的。

说明：
此成员函数用来为一个指定的设备格式化一个带格式编辑控件中的一定范围的文本。通常，在调用这个函数之后会调用DisplayBand。
更多的信息，请参见Win32文档中的EM_FORMATRANGE消息和FORMATRANGE结构。

请参阅：CRichEditCtrl::DisplayBand


 CRichEditCtrl::GetCharPos

CPoint GetCharPos( long lChar ) const;

返回值：返回由lChar指定的字符的左上角的位置。

参数：
lChar 字符的从零开始的索引。

说明：
此成员函数用来获取在一个CRichEditCtrl对象内的给定字符的位置（左上角）。该字符由给出的它的从零开始的索引指定。如果lChar大于此CRichEditCtrl对象中的最后一个字符的索引，则返回值指示的坐标是此CRichEditCtrl对象中刚好超过其最后一个字符的位置的坐标。
更多的信息，参见Win32文档中的EM_POSFROMCHAR.。

请参阅：CRichEditCtrl::FindText


 CRichEditCtrl::GetDefaultCharFormat

DWORD GetDefaultCharFormat( CHARFORMAT& cf ) const;

返回值：
返回cf的dwMask数据成员。它指定了缺省的字符格式化属性。

参数：
cf 指向一个CHARFORMAT结构的指针，该结构将包含缺省的字符格式化属性。

说明：
此成员函数用来获取此CRichEditCtrl对象的缺省的字符格式化属性。
更多的信息，参见Win32文档中的EM_GETCHARFORMAT消息和CHARFORMAT结构。

请参阅：
CRichEditCtrl::SetDefaultCharFormat, CRichEditCtrl::GetSelectionCharFormat, CRichEditCtrl::GetParaFormat


 CRichEditCtrl::GetEventMask

long GetEventMask() const;

返回值：返回此CRichEditCtrl对象的事件掩码。

说明：
此成员函数用来获取此CRichEditCtrl对象的事件掩码。这个事件掩码指定了此CRichEditCtrl对象要将哪一个消息发送给它的父窗口。
更多的信息，参见Win32文档中的EM_GETEVENTMASK。

请参阅：
CRichEditCtrl::SetEventMask, CRichEditCtrl::CRichEditCtrl


 CRichEditCtrl::GetFirstVisibleLine

int GetFirstVisibleLine() const;

返回值：
返回此CRichEditCtrl对象中的最顶上的可见行的从零开始的索引。

说明：
此成员函数用来确定此CRichEditCtrl对象中的最顶上的可见行。
更多的信息，参见Win32文档中的EM_GETFIRSTVISIBLELINE。

请参阅：
CRichEditCtrl::GetLine, CRichEditCtrl::GetLineCount


 CRichEditCtrl::GetIRichEditOle

IRichEditOle* GetIRichEditOle( ) const;

返回值：
返回指向IRichEditOle接口的指针，该接口用来访问此CRichEditCtrl对象的OLE机能；如果接口不能被访问，则返回的是NULL。

说明：
此成员函数用来访问此CRichEditCtrl对象的IRichEditOle接口。使用此接口可以访问这个CRichEditCtrl对象的OLE机能。
更多的信息，参见Win32文档中的EM_GETOLEINTERFACE消息和IRichEditOle接口。

请参阅：CRichEditCtrl::SetOLECallback


 CRichEditCtrl::GetLimitText

long GetLimitText( ) const;

返回值：
返回此CRichEditCtrl对象的以字节表示的文本限制。

说明：
此成员函数用来获取这个RichEditCtrl对象的文本限制。文本限制是指带格式编辑控件可以接收的以字节表示的最大的文本数量。
更多的信息，参见Win32文档中的EM_GETLIMITTEXT。

请参阅：CRichEditCtrl::LimitText


 CRichEditCtrl::GetLine

int GetLine( int nIndex, LPTSTR lpszBuffer ) const;
int GetLine( int nIndex, LPTSTR lpszBuffer, int nMaxLength ) const;

返回值：返回要被拷贝到lpszBuffer中去的字符数。

参数：
nIndex | 要获取的行的从零开始的索引。
lpszBuffer | 指向用来接收文本的缓冲区。缓冲区中的第一个单词必须指定可以被拷贝到缓冲区中去的最大的字节数目。
nMaxLength | 可以被拷贝到lpszBuffer中去的最大的字符数。GetLine的第二种格式将这个值放在由lpszBuffer指定的缓冲区的第一个单词中。

说明：
此成员函数用来从此CRichEditCtrl对象中获取一行文本。此拷贝的行不包含用于结尾的空字符。
注意：
因为此缓冲区的第一个单词保存了要被拷贝的字符数目，所以必须确保你的缓冲区至少有4字节长。
更多的信息，参见Win32文档中的EM_GETLINE。

请参阅：CRichEditCtrl::LineLength


 CRichEditCtrl::GetLineCount

int GetLineCount( ) const;

返回值：返回此CRichEditCtrl对象中的行数。

说明：
此成员函数用来获取CRichEditCtrl对象中的行数。
更多信息，请参见Win32文档中的EM_GETLINELOUNT。

请参阅：CRichEditCtrl::GetLine


 CRichEditCtrl::GetModify

BOOL GetModify( ) const;

返回值：
如果此CRichEditCtrl对象中的文本被修改了，则返回非零值；否则返回0。

说明：
此成员函数用来确定CRichEditCtrl对象中的内容是否被修改了。
Windows保持一个内部标志来表明带格式编辑控件中的内容是否被改变了。当编辑控件第一次被创建时，这个标志被清零，也可以通过调用SetModify成员函数来清零。
更多的信息，参见Win32文档中的EM_GETMODIFY。

请参阅：CRichEditCtrl::SetModify


 CRichEditCtrl::GetParaFormat

DWORD GetParaFormat( PARAFORMAT& pf ) const;

返回值：
返回pf的数据成员dwMask。它指定在整个当前选择中一致的段落格式化属性。

参数：
pf 指向一个PARAFORMAT结构的指针，该结构包含了当前选择的段落格式化属性。

说明：
此成员函数用来获取当前选择的段落格式化属性。如果选择的不止一段，pf接收的是第一个被选择段的属性。返回值指明了在整个当前选择中一致的属性。
更多的信息，参见Win32文档中的EM_GETPARAFORMAT消息和PARAFORMAT结构。

请参阅：
CRichEditCtrl::SetParaFormat, CRichEditCtrl::GetSelectionCharFormat


 CRichEditCtrl::GetRect

void GetRect( LPRECT lpRect ) const;

参数：
lpRect 是CRect或指向一个RECT的指针，用来接收此CRichEditCtrl对象的格式化矩形。

说明：
此成员函数用来获取此CRichEditCtrl对象的格式化矩形。格式化矩形是文本的边界矩形。这个值不依赖RichEditCtrl对象的大小。
更多的信息，参见Win32文档中的EM_GETRECT。

请参阅：CRichEditCtrl::SetRect


 CRichEditCtrl::GetSel

void GetSel( CHARRANGE& cr ) const;
void GetSel( long& nStartChar, long& nEndChar ) const;

参数：
cr | 对一个CHARRANGE结构的引用，该结构用来接收当前选择的界线。
nStartChar | 当前选择中的第一个字符的从零开始的索引。
nEndChar | 当前选择中的最后一个字符的从零开始的索引。

说明：
此成员函数用来获取在此CRichEditCtrl对象中的当前选择的界线。
这个函数的两种形式提供了用来获取选择的界线的两种可相互替代的方法。下面就是这些形式的简单描述：
· | GetSel(cr) | 这种形式使用CHARRANGE结构的cpMin和cpMax成员来返回界线。
· | GetSel(nStartChar, nEndChar) | 这种形式使用参数nStartChar和nEndChar来返回界线。
如果开始值（cpMin或nStartChar）是0，而结尾值（cpMax或nEndChar）是-1，则选择包括了所有的文本。
更多的信息，参见Win32文档中的EM_EXGETSEL消息和CHARRANGE结构。

请参阅：
CRichEditCtrl::SetSel, CRichEditCtrl::GetSelText, CRichEditCtrl::GetParaFormat, CRichEditCtrl::GetSelectionCharFormat


 CRichEditCtrl::GetSelectionCharFormat

DWORD GetSelectionCharFormat( CHARFORMAT& cf ) const;

返回值：
返回cf的dwMask数据成员。它指定了在整个当前选择中都一致的字符格式化属性。

参数：
cf 这是一个CHARFORMAT结构的指针，该结构用来接收当前选择的字符格式化属性。

说明：
此成员函数用来获取当前选择的字符格式化属性。参数cf接收当前选择中的第一个字符的属性。返回值指明了在整个当前选择中都一致的属性。
更多的信息，参见Win32文档中的EM_GETCHARFORMAT消息和CHARFORMAT结构。

请参阅：
CRichEditCtrl::GetDefaultCharFormat, CRichEditCtrl::GetParaFormat, CRichEditCtrl::SetSelectionCharFormat, CRichEditCtrl::GetSelText


 CRichEditCtrl::GetSelectionType

WORD GetSelectionType( ) const;

返回值：
返回表明当前选择内容的标志。它可以是下列标志的组合：
· | SEL_EMPTY | 表明没有当前选择。
· | SEL_TEXT | 表明当前选择包含文本。
· | SEL_OBJECT | 表明当前选择至少包含了一个OLE项。
· | SEL_MULTICHAR | 表明当前选择包含了不止一个字符的文本。
· | SEL_MULTIOBJECT | 表明当前选择包含了不止一个OLE项。

说明：
此成员函数用来确定此CRichEditCtrl对象中的选择的类型。
更多的信息，参见Win32中的EM_SELECTIONTYPE。

请参阅：
CRichEditCtrl::GetSel, CRichEditCtrl::GetSelText


 CRichEditCtrl::GetSelText

long GetSelText( LPTSTR lpBuf ) const;
CString GetSelText( ) const;

返回值：返回值决定于函数的形式：
· | GetSelText(lpBuf) | 返回要拷贝到lpBuf中去的字符数，不包括结尾的空字符。
· | GetSelText( ) | 返回包含当前选择的字符串。

参数：
lpBuf 指向用来接收当前选择中的文本的缓冲区的指针。

说明：
此成员函数用来接收来自CRichEditCtrl对象中当前选择的文本。
如果你使用第一种形式GetSelText(lpBuf)，则你必须保证缓冲区对于将要接收的文本来说足够大。调用GetSel来确定当前选择中的字符数。
更多的信息，参见Win32文档中EM_GETSELTEXT。

请参阅：
CRichEditCtrl::GetSel, CRichEditCtrl::GetSelectionType


 CRichEditCtrl::GetTextLength

long GetTextLength();

返回值：
返回此CRichEditCtrl对象中的文本的长度。

说明：
此成员函数用来获取此CRichEditCtrl对象中的文本的长度。
更多的信息，参见Win32文档中EM_GETTEXTLENGTH。

请参阅：
CRichEditCtrl::LimitText, CRichEditCtrl::GetLimitText


 CRichEditCtrl::HideSelection

void HideSelection( BOOL bHide, BOOL bPerm );

参数：
bHide | 表明是要显示还是要隐藏选择，如果是TRUE就是要隐藏选择。
bPerm | 表明有关这个选择的可见性的改变是否是永久的。

说明：
此成员函数用来改变此选择的可见性。
当pPerm是TRUE时，则函数改变此CRichEditCtrl对象的ECO_NOHIDESEL选项。有关这个选项的简短描述，参见SetOptions。可以使用此函数来设置CRichEditCtrl对象的所有选项。
更多的信息，参见Win32文档的EM_HIDESELECTION。

请参阅：
CRichEditCtrl::SetSel, CRichEditCtrl::GetSelectionType


 CRichEditCtrl::LimitText

void LimitText( long nChars = 0 );

参数：
nChars 指定用户可输入的文本的长度（以字节表示）。如果这个常数是0，则文本的长度被设置为UINT_MAX字节。这是缺省的行为。

说明：
此成员函数用来限制用户可以输入到一个编辑控件中的文本的长度。
改变这个文本限制只会约束用户可以输入的文本。它对编辑控件中已经存在的文本是没有影响的，它也不影响通过调用CWnd中的SetWindowText函数拷贝到编辑控件中去的文本的长度。如果一个应用程序要用SetWindowText函数来将比在LimiText中指定的文本更多的文本放入一个编辑控件中，则用户可以编辑控件中的任何文本。但是，这个文本限制将禁止用户用新的文本来代替控件中已经存在的文本，除非已经删除了当前的选择，使得控件中的文本低于了文本的限制值。
注意：对于文本极限来说，将每一个OLE项计算为一个字符。
更多的信息，参见Win32文档中的EM_EXLIMITTEXT。

请参阅：CRichEditCtrl::GetLimitText


 CRichEditCtrl::LineFromChar

long LineFromChar( long nIndex ) const;

返回值：
返回包含由nIndex指定的字符索引的行的从零开始的行号。如果nIndex是-1，则返回的是包含选择的第一个字符的行的行号。如果没有选择，则返回当前行的行号。

参数：
nIndex 包含了编辑控件的文本中的期望字符的从零开始的索引值，或者时-1。如果nIndex是-1，则它指定的是当前行，也就是包含插字符（^）的行。

说明：
此成员函数用来获取包含指定字符索引的行的行号。字符索引就是带格式编辑控件中从开始计算的字符数目。对于字符计数，一个OLE项被计算为一个单字符。
更多的信息，参见Win32文档中的EM_EXLINEFROMCHAR。

请参阅：
CRichEditCtrl::GetLineCount, CRichEditCtrl::GetLine, CRichEditCtrl::LineIndex


 CRichEditCtrl::LineIndex

int LineIndex( int nLine = -1 ) const;

返回值：
返回在nLine中指定的行的字符索引；如果指定的行号大于编辑控件中的行数，则返回值为-1。

参数：
nLine 包含编辑控件中的指定行的索引值，或者包含-1。如果nLine是-1，则它指定的是当前行，也就是包含脱字符号（^）的行。

说明：
此成员函数用来获取此CRichEditCtrl对象中的一行的字符索引。字符索引就是带格式编辑控件中从开始计算的字符数目。对于字符计数，一个OLE项被计算为一个单字符。
更多的信息，参见Win32文档中的EM_LINEINDEX。

请参阅：
CRichEditCtrl::LineFromChar, CRichEditCtrl::GetLineCount


 CRichEditCtrl::LineLength

int LineLength( int nLine = -1 ) const;

返回值：
当LineLength是对一个多行的编辑控件调用时，返回的是由nLine指定的行的长度（以字节计算）。当LineLength是对一个单行编辑控件调用时，返回值是编辑控件中的文本的长度。

参数：
nLine 指定其长度要被返回的行中的一个字符的字符索引。如果这个参数是-1，则返回当前行（包含脱字符号的行）的长度，不包括此行中任何被选择文本的长度。当LineLength是对一个单行编辑控件调用时，这个参数被忽略。

说明：
此成员函数用来获取一个带格式编辑控件中的一行的长度。
使用LineIndex成员函数可以获取此CRichEditCtrl对象中的一个给定行号的字符索引。
更多的信息，参见Win32文档中的EM_LINELENGTH。

请参阅：CRichEditCtrl::LineIndex


 CRichEditCtrl::LineScroll

void LineScroll( int nLines, int nChars = 0 );

参数：
nLines | 指定垂直滚动的行数。
nChars | 指定水平滚动的字符数。如果带格式编辑控件是ES_RIGHT或ES_CENTER风格，则这个值被忽略。编辑风格在Create中指定。

说明：
此成员函数用来滚动一个多行编辑控件的文本。
编辑控件不能用来垂直滚动过编辑控件的最后一行。如果当前行的行号再加上nLines指定的行数超过了编辑控件中的总行数，则将调整这个值，以使在滚动到编辑控件中的最后一行后再滚动到控件顶部的行。
LineScroll可以水平滚动过任意行的最后一个字符。
更多的信息，参见Win32文档中的EM_LINESCROLL。

请参阅：CRichEditCtrl::LineIndex


 CRichEditCtrl::Paste

void Paste();

说明：
此成员函数用来将来自剪贴板的数据插入到CRichEditCtrl中的插入点处，即脱字符号所在的位置。只有当剪贴板上的数据是能够被认可的格式时，数据才会被插入。
更多的信息，参见Win32文档中的WM_PASTE。

请参阅：
CRichEditCtrl::Copy, CRichEditCtrl::Cut, CRichEditCtrl::PasteSpecial


 CRichEditCtrl::PasteSpecial

void PasteSpecial( UINT nClipFormat, DWORD dvAspect = 0, HMETAFILE hMF= 0 );

参数：
nClipFormat | 要粘贴到此CRichEditCtrl对象中的剪贴板格式。
dvAspect | 要从剪贴板获取的数据的设备外观。
hMF | 一个图元文件的句柄，该图元文件包含了要被粘贴的对象的图标视。

说明：
此成员函数用来将特定剪贴板格式的数据粘贴到此CRichEditCtrl对象中。新的材料被在插入点，即脱字符号所在处插入。
更多的信息，参见Win32文档中的EM_PASTESPECIAL。

请参阅：
CRichEditCtrl::Paste, CRichEditCtrl::Copy, CRichEditCtrl::Cut


 CRichEditCtrl::ReplaceSel

void ReplaceSel( LPCTSTR lpszNewText, BOOL bCanUndo = FALSE );

参数：
lpszNewText | 指向一个以空字符结尾的字符串的指针，该字符串包含了用于替换的文本。
bCanUndo | 要指定这个功能是可以取消的，就把这个参数设置为TRUE。缺省的值是FALSE。

说明：
此成员函数使用CWnd::SetWindowText来用指定的文本替换此CRichEditCtrl对象中的当前选择的文本。
如果没有当前选择，则替换文本被插入当前脱字符号所在的位置。
更多的信息，参见Win32文档中的EM_REPLACESEL。

请参阅：
CRichEditCtrl::CanUndo, CRichEditCtrl::Undo, CWnd::SetWindowText


 CRichEditCtrl::RequestResize

void RequestResize();

说明：
此成员函数用来强迫此CRichEditCtrl对象向它的父窗口发送EN_REQUESTRESIZE通知消息。在CWnd::OnSize处理一个无底的CRichEditCtrl对象时，这个函数是很有用的。
更多的信息，参见Win32文档中的EM_REQUESTRESIZE消息和文章“无底的带格式控件”。

请参阅：CWnd::OnSize, CRichEditCtrl::Create


 CRichEditCtrl::SetBackgroundColor

COLORREF SetBackgroundColor( BOOL bSysColor, COLORREF cr );

返回值：
返回这个CRichEditCtrl对象先前的背景颜色。

参数：
bSysColor | 表明背景色是否要设置为系统值。如果这个值是TRUE，则cr被忽略。
cr | 要求的背景色。只有在bSysColor是FALSE时才使用。

说明：
此成员函数用来设置这个CRichEditCtrl对象的背景色。背景色可以设置为系统值，或者是设置为指定的COLORREF值。
更多的信息，参见Win32文档中的EM_SETBKGNDCOLOR消息和COLORREF结构。

请参阅：CDC::SetBkColor


 CRichEditCtrl::SetDefaultCharFormat

BOOL SetDefaultCharFormat( CHARFORMAT& cf );

返回值：如果成功则返回非零值；否则返回0。

参数：
cf 一个包含新的缺省字符格式化属性的CHARFORMAT结构。

说明：
此成员函数用来为这个CRichEditCtrl对象中的新文本设置字符格式化属性。这个函数只改变cf中的dwMask成员指定的属性。
更多的信息，参见Win32文档中的EM_SETCHARFORMAT消息和CHARFORMAT结构。

请参阅：
CRichEditCtrl::GetDefaultCharFormat, CRichEditCtrl::SetSelectionCharFormat


 CRichEditCtrl::SetEventMask

DWORD SetEventMask( DWORD dwEventMask );

返回值：返回先前的事件Mask

参数：
dwEventMask 这个CRichEditCtrl对象的新的事件Mask。

说明：
此成员函数用来为这个CRichEditCtrl对象设置新的事件Mask。此事件掩码指定了CRichEditCtrl对象将哪一个通知消息发送给它的父窗口。
更多的信息，参见Win32文档中的EM_SETEVENTMASK。

请参阅：CRichEditCtrl::GetEventMask


 CRichEditCtrl::SetModify

void SetModify( BOOL bModified = TRUE );

参数：
bModified 如果是TRUE，则表明文本被修改了；如果是FALSE，则表明文本没有被修改。这个修改标志被缺省地设置。

说明：
此成员函数用来为一个编辑控件设置或清除修改标志。此修改标志表明编辑控件中的文本是否被修改了。不管用户什么时候改变文本，这个标志都自动被设置。可以用GetModify成员函数来获取这个标志的值。
更多的信息，参见Win32文档中的EM_SETMODIFY。

请参阅：CRichEditCtrl::GetModify


 CRichEditCtrl::SetOLECallback

BOOL SetOLECallback( IRichEditOleCallback* pCallback );

参数：
pCallback 指向一个IRichEditOleCallback对象的指针。CRichEditCtrl对象将利用这个对象来获取与OLE相关的资源和信息。

返回值：
如果成功则返回非零值；否则返回0。

说明：
此成员函数用来给CRichEditCtrl对象提供一个IRichEditOleCallback对象，用来访问与OLE相关的资源和信息。此CRichEditCtrl对象将调用IUnknown::AddRef来增加pCallback指定的COM对象的使用计数。
更多的信息，参见Win32文档中的EM_SETOLEINTERFACE消息和IRichEditOleCallback接口。

请参阅：CRichEditCtrl::GetIRichEditOle


 CRichEditCtrl::SetOptions

void SetOptions( WORD wOp, DWORD dwFlags );

参数：
wOp用来表明存在的类型。可以是下列值之一：
· | ECOOP_SET | 将选项设置为dwFlags所指定的那样。
· | ECOOP_OR | 将当前选项与dwFlags所指定的组合。
· | ECOOP_AND | 只保留那些与dwFlags所指定的一样的当前选项。
· | ECOOP_XOR | 值保留那些没有由dwFlags指定的当前选项。
dwFlags 是带格式编辑选项。在说明部分给出了列出这个标志的可能取值。

说明：
此成员函数用来为CRichEditCtrl对象设置选项。
选项可以是下列值的组合：
· | ECO_AUTOWORDSELECTION | 双击进行自动单词选择。
· | ECO_AUTOVSCROLL | 当用户在行的最末段输入一个字符时，文本自动向右滚动10个字符。当用户按下ENTER键时，控件将所有文本滚动到零位。
· | ECO_AUTOHSCROLL | 当用户在最后一行按下ENTER键时，文本自动向上滚动一页。
· | ECO_NOHIDESEL | 取消一个编辑控件的缺省行为。当控件失去输入焦点时缺省行为隐藏选择，当控件结束输入焦点时则显示选择。如果你指定ECO_NOHIDESEL，则存在的文本被转换，即使是没有焦点的情况下。
· | ECO_READONLY | 禁止用户在编辑控件中输入或编辑文本。
· | ECO_WANTRETURN | 当用户在一个对话框中的多行带格式编辑控件中输入文本按下ENTER键时，指定插入一个回车换行符。如果你没有指定这个风格，按下ENTER键将给带格式编辑控件的父窗口发送一个命令，模拟点击了父窗口的缺省按钮（例如，对话框中的OK按钮）。这个风格对单行编辑控件来说是没有影响的。
· | ECO_SAVESEL | 当控件失去焦点时，保存选择。缺省的，当焦点返回时，控件的所有内容都被选择。
· | ECO_VERTICAL | 在垂直方向上绘制文本和对象。只对亚洲人的语言有效。
更多的信息，参见Win32文档中的EM_SETOPTIONS。

请参阅：
CRichEditCtrl::HideSelection, CRichEditCtrl::SetReadOnly


 CRichEditCtrl::SetParaFormat

BOOL SetParaFormat( PARAFORMAT& pf );

返回值：如果成功则返回非零值；否则返回0。

参数：
pf 一个包含新的缺省段落格式化属性的PARAFORMAT结构。

说明：
此成员函数用来为CRichEditCtrl对象中的当前选择设置段落格式化属性。这个函数只改变pf中dwMask成员指定的属性。
更多的信息，参见Win32文档中的EM_SETPARAFORMAT消息和PARAFORMAT结构。

请参阅：
CRichEditCtrl::GetParaFormat, CRichEditCtrl::SetSelectionCharFormat


 CRichEditCtrl::SetReadOnly

BOOL SetReadOnly( BOOL bReadOnly = TRUE );

返回值：如果成功则返回非零值；否则返回0。

参数：
bReadOnly 表明此CRichEditCtrl对象是否应该是只读的。

说明：
此成员函数用来改变这个CRichEditCtrl对象的ECO_READONLY消息。有关这个消息的简短描述，参见SetOptions。你可以使用这个函数来设置这个CRichEditCtrl对象的所有选项。
更多的信息，参见Win32文档中的EM_SETREADONLY。

请参阅：
CRichEditCtrl::Create, CRichEditCtrl::SetOptions


 CRichEditCtrl::SetRect

void SetRect( LPCRECT lpRect );

参数：
lpRect 是一个CRect或一个指向RECT的指针。它表明了格式化矩形的新的界线。

说明：
此成员函数用来为这个CRichEditCtrl对象设置新的格式化矩形。这个格式化矩形是文本的限制矩形。此限制矩形与带格式编辑控件的大小无关。当此CRichEditCtrl对象第一次被创建时，格式化矩形与窗口的客户区具有相同的尺寸。使用SetRect可以使格式化矩形变得比带格式编辑窗口大或小。
更多的信息，参见Win32文档中的EM_SETRECT。

请参阅：CRichEditCtrl::GetRect


 CRichEditCtrl::SetSel

void SetSel( long nStartChar, long nEndChar );
void SetSel( CHARRANGE& cr );

参数：
nStartChar | 选择中的第一个字符的从零开始的索引。
nEndChar | 选择中的最后一个字符的从零开始的索引。
cr | 一个CHARRANGE结构，包含了当前选择的界线。

说明：
此成员函数用来设置这个CRichEditCtrl对象中的选择。
这个函数的两种形式都用来设置选择的界线，它们可以相互替换。有关这两种形式的简短描述如下所示：
· | SetSel( cr ) | 这种形式用CHARRANGE结构的cpMin和cpMax成员来设置界线。
· | SetSel( nStarChar, nEndChar ) | 这种形式用参数nStartChar和nEndChar来设置界线。
脱字符号被放置在由开始（cpMin或nStartChar）和结束（cpMax或nEndChar）索引中的较大者所指定的选择的结尾处。此函数不滚动CRichEditCtrl的内容，以使脱字符号是可见的。
要选择此CRichEditCtrl对象中的索引文本，可以用一个为0的开始索引和一个为-1的结束索引来调用SetSel。
更多的信息，参见Win32文档中的EM_EXSETSET消息和CHARRANGE结构。

请参阅：
CRichEditCtrl::GetSel, CRichEditCtrl::GetSelectionType


 CRichEditCtrl::SetSelectionCharFormat

BOOL SetSelectionCharFormat( CHARFORMAT& cf );

返回值：
如果成功则返回非零值；否则返回0。

参数：
cf 一个CHARFORMAT结构，包含了当前选择的字符格式化属性。

说明：
此成员函数用来设置这个CRichEditCtrl对象中的当前选择的文本的字符格式化属性。这个函数只改变由cf中的dwMask成员指定的属性。
更多的信息，参见Win32文档中的EM_SETCHARFORMAT消息和CHARFORMAT结构。

请参阅：
CRichEditCtrl::GetSelectionCharFormat, CRichEditCtrl::SetDefaultCharFormat


 CRichEditCtrl::SetTargetDevice

BOOL SetTargetDevice( HDC hDC, long lLineWidth );
BOOL SetTargetDevice( CDC& dc, long lLineWidth );

返回值：如果成功则返回非零值；否则返回0。

参数：
hDC | 新的目标设备的设备环境句柄。
lLineWidth | 用于格式化的线宽。
dc | 新的目标设备的CDC。

说明：
此成员函数用来设置目标设备和此CRichEditCtrl对象中的用于WYSIWYG（所见即所得）的线宽。
如果这个函数成功，则该带格式编辑控件就拥有了作为参数传递来的设备环境。在这种情况下，调用函数不应该销毁这个设备环境。
更多的信息，参见Win32文档中的EM_SETTARGETDEVICE。

请参阅：
CRichEditCtrl::FormatRange, CRichEditCtrl::DisplayBand


 CRichEditCtrl::SetWordCharFormat

BOOL SetWordCharFormat( CHARFORMAT& cf );

返回值：如果成功则返回非零值；否则返回零。

参数：
cf 一个CHARFORMAT结构，包含了当前选择单词的字符格式化属性。

说明：
此成员函数用来设置这个CRichEditCtrl对象中的当前选择单词的字符格式化属性。这个函数只影响cf中的dwMask成员指定的属性。
更多的信息，参见Win32文档中的EM_SETCHARFORMAT消息和CHARFORMAT结构。

请参阅：CRichEditCtrl::SetSelectionCharFormat


 CRichEditCtrl::StreamIn

long StreamIn( int nFormat, EDITSTREAM& es );

返回值：返回从输入流中读到的字符数。

参数：
nFormat | 用来指定输入数据格式的标志。参见说明部分可以获得更多的信息。
es | 一个EDITSTREAM结构，用来指定输入流。参见说明部分可以获得更多的信息。

说明：
此成员函数用从指定的输入流中获得的文本来替换CRichEditCtrl对象中的文本。
nFormat的值必须是下列值之一：
· | SF_TEXT | 表明只读取文本。
· | SF_RTF | 表明读取文本并进行格式化。
这两个值中的任何一个都可以与SFF_SELECTION组合。如果指定了SFF_SELECTION，则StreamIn就替换这个CRichEditCtrl对象的所有内容。
在EDITSTREAM参数es中，你可以指定一个用文本来填充缓存的收回函数。
这个收回函数被重复调用，直至输入流被用完为止。
更多的信息，参见Win32文档中的EM_STREAMIN消息和EDITSTREAM结构。

请参阅：CRichEditCtrl::StreamOut


 CRichEditCtrl::StreamOut

long StreamOut( int nFormat, EDITSTREAM& es );

返回值：返回要写到输出流中去的字符数。

参数：
nformat | 用来指定输出数据格式的标志。参见说明部分可以获得更多的信息。
es | 用来指定输出流的EDITSTREAM结构。参见说明部分可以获得更多的信息。

说明：
此成员函数用来将此CRichEditCtrl对象中的内容写到指定的输出流中。
nFormat的值必须是下列值之一：
· | SF_TEXT | 表示只是写文本。
· | SF_RTF | 表明写文本并进行格式化。
· | SF_RTFNOOBJS | 表明是写文本并进行格式化，用空格来替换OLE项。
· | SF_TEXTIZED | 表明写文本并进行格式化，使用OLE项的原文表示。
这些值中的任何一个都可以与SFF_SELECTION组合。如果指定了SFF_SELECTION，则StreamOut将读取选择写入输出流。如果没有指定，则StreamOut将CRichEditCtrl对象的所有内容都写入输出流中。
在EDITSTREAM参数es中，你可以指定一个用文本来填充缓存的收回函数。这个收回函数被重复调用，直至输入流被用完为止。
更多的信息，参见Win32文档中的EM_STREAMOUT消息和EDITSTREAM结构。

请参阅：CRichEditCtrl::StreamIn


 CRichEditCtrl::Undo

BOOL Undo();

返回值：
如果取消操作成功则返回非零值；否则返回0。

说明：
此成员函数用来取消带格式编辑控件中的最后一次操作。
一次取消操作也可以被取消。例如，你可以用对Undo的第一次调用来恢复被删除的文本。当还没有进行其它的编辑操作时，你可以通过对Undo的第二次调用来再次删除这些文本。
更多的信息，参见Win32文档中的EM_UNDO。

请参阅：
CRichEditCtrl::CanUndo, CRichEditCtrl::EmptyUndoBuffer


 CRichEditDoc

CObject
└CCmdTarget
└CDocument
└COleDocument
└COleLinKingDoc
└CRichEditDoc

一个“带格式编辑控件”是一个窗口，在这个窗口中用户可以输入和编辑文本。文本可以被赋予字母或段落的格式化，也可以包括嵌入的OLE对象。带格式编辑控件为格式化文本提供了设计界面。但是，应用程序必须实现需要的用户部件，以使格式化操作对用户来说可用。
CRichEditDoc类与CRichEditView和CRichEditCntrItem一起，提供了MFC文档视环境中的带格式编辑控件的功能。CRichEditView保存文本和文本的格式化特征。CRichEditDoc保持视中的客户项的列表。CRichEditCntrItem支持从容器方对OLE客户项的访问。
这个Windows通用控件（也就是CRichEditCtrl及其相关类）只对于运行在Window95和Windows NT 3.51及更新版本下的程序是可用的。
有关在一个MFC应用程序中使用带格式编辑文档的例子，请参见WORDPAD示例应用程序。
#include <afxrich.h>
请参阅：CRichEditView, CRichEditCntrItem, COleDocument, CRichEditCtrl

CRichEditDoc类成员

属性
GetStreamFormat | 指示输入/输出流是否要包含格式化信息
GetView | 获取相关的CRichEditView对象

数据成员
m_bRTF 指示I/O流应该包含格式化

可重载
CreateClientItem 此函数用来实现文档的清除


 CRichEditDoc::CreateClientItem

virtual CRichEditCntrItem* CreateClientItem( REOBJECT* preo = NULL ) const = 0;

返回值：
返回指向添加到文档中的新CRichEditCntrItem对象的指针。

参数：
preo 指向一个REOBJECT结构的指针，该结构描述一个OLE项。行的CRichEditCntrItem对象就是围绕这个OLE项构造的。如果preo是NULL，则新的客户项是空的。

说明：
此成员函数用来创建一个CRichEditCntrItem对象，并将它添加到这个文档中。此函数不实现任何OLE初始化。
更多的信息，参见Win32文档中的REOBJECT结构。

请参阅：
CRichEditCntrItem::CRichEditCntrItem, COleDocument::AddItem


 CRichEditDoc::GetStreamFormat

int GetStreamFormat( ) const;

返回值：返回下列标志之一：
· | SF_TEXT | 表示此带格式编辑控件没有包含格式化信息。
· | SF_RTF | 表示此带格式编辑控件包含格式化信息。

说明：
此成员函数用来确定带格式编辑内容的用于流式传输的文本格式。返回值是基于m_bRTF数据成员的。如果m_bRTF是TRUE，则函数返回SF_RTF；否则函数返回SF_TEXT。

请参阅：
CRichEditDoc::m_bRTF, CRichEditCtrl::StreamIn, CRichEditCtrl::StreamOut


 CRichEditDoc::GetView

CRichEditView* GetView( ) const;

返回值：
返回指向与文档相关的CRichEditView对象的指针。

说明：
此成员函数用来访问与这个CRichEditDoc对象相关联的CRichEditView对象。
文本和格式化信息被包含在CRichEditView对象中。CRichEditDoc对象包含了用于连载的OLE项。每一个CRichEditDoc只能有一个CRichEditView与之相对应。

请参阅：
CRichEditView, CDocument::GetNextView


 CRichEditDoc::m_bRTF

说明：
当此数据成员为TRUE时，表示CRichEditCtrl::StreamIn和CRichEditCtrl::StreamOut应该保存段落和字符格式化的特征。

请参阅：CRichEditDoc::GetStreamFormat


 CRichEditView

CObject
└CCmdTarget
└CWnd
└CView
└CCtrlView
└CRichEditView

一个“带格式编辑控件”是一个窗口，在这个窗口中用户可以输入和编辑文本。文本可以被赋予字母或段落的格式化，也可以包括嵌入的OLE对象。带格式编辑控件为格式化文本提供了设计界面。但是，应用程序必须实现需要的用户部件，以使格式化操作对用户来说可用。
CRichEditView类与CRichEditDoc和CRichEditCntrItem一起，提供了MFC文档-视环境中的带格式编辑控件的功能。CRichEditView保存文本和文本的格式化特征。CRichEditDoc保持视中的客户项的列表。CRichEditCntrItem支持从容器方对OLE客户项的访问。
这个Windows通用控件（也就是CRichEditCtrl及其相关类）只对于运行在Window95和Windows NT 3.51及更新版本下的程序是可用的。
有关在一个MFC应用程序中使用带格式编辑文档的例子，请参见WORDPAD示例应用程序。
#include <afxrich.h>
请参阅：CRichEditDoc, CRichEditCntrItem

CRichEditView类成员

构造
CRichEditView 构造一个CrichEditView对象

属性
GetDocument | 获取一个指向相关的CRichEditDoc对象的指针
SetCharFormat | 设置当前选择的字符格式化属性
GetCharFormatSelection | 获取当前选择的字符格式化属性
GetParaFormatSelection | 获取当前选择的段落格式化属性
SetParaFormat | 设置当前选择的段落格式化属性
GetTextLength | 获取RichEdit视中的文本的长度
GetPaperSize | 获取此RichEdit视的纸张大小
SetPaperSize | 设置此RichEdit视的纸张大小
GetMargins | 获取此RichEdit视的页边距
SetMargins | 设置此RichEdit视的的页边距
GetPrintWidth | 获取此RichEdit视的的打印宽度
GetPrintRect | 获取此RichEdit视的的打印矩形
GetPageRect | 获取此RichEdit视的的页面矩形
GetSelectedItem | 从此RichEdit视中获取被选择的项
GetInPlaceActiveItem | 获取此RichEdit视中的当前现场激活的OLE项
GetRichEditCtrl | 获取此带格式编辑控件

数据成员
m_nBulletIndent | 表示公告列表的缩进量
m_nWordWrap | 表示单词的折行约束

操作
FindText | 激活等待光标，查找指定的文本
FindTextSimple | 查找指定文本
IsRichEditFormat | 确定剪贴板中是否包含一个RichEdit中的数据或文本格式
CanPaste | 确定剪贴板包含的数据是否能够被粘贴到此RichEdit视中
DoPaste | 将一个OLE项粘贴到此RichEdit视中
InsertItem | 插入一个新项作为一个OLE项
InsertFileAsObject | 插入一个文件作为一个OLE项
AdjustDialogPosition | 移动一个对话框以使它不遮蔽当前的选择
OnCharEffect | 改变当前选择的字符格式
OnParaAlign | 改变段落的对齐方式
OnUpdateCharEffect | 更新字符公有成员函数的命令UI
OnUpdateParaAlign | 更新段落公有成员函数的命令UI
PrintInsideRect | 格式化在给定矩形中的指定文本
PrintPage | 格式化给定页中的指定文本

可重载
OnInitialUpdate | 在一个视第一次与一个文档连接时刷新这个视
IsSelected | 表明给定的OLE项是否被选择了
OnFindNext | 搜索一个子串的下一次发现
OnTextNotFound | 在没有找到需要的文本时处理用户通知
OnReplaceAll | 用一个新的字符串来替换所有的给定字符串
OnReplaceSel | 替换当前的选择
QueryAcceptData | 查询IDataObject上的数据
OnPasteNativeObject | 从一个OLE项获取本地数据
OnPrinterChanged | 设置给定设备的打印特征
WrapChanged | 根据m_nWordWrap的值为此RichEdit视调整目标输出设备
GetClipboardData | 为此RichEdit视中的一个范围获取一个剪贴板对象
GetContextMenu | 获取一个用于按下右鼠标按钮的上下文菜单


 CRichEditView::AdjustDialogPosition

void AdjustDialogPosition( CDialog* pDlg );

参数：
pDlg 指向一个CDialog对象的指针。

说明：
此函数用来移动给定的对话框以使它不会隐蔽当前的选择。

请参阅：CRichEditCtrl::GetSel


 CRichEditView::CanPaste

BOOL CanPaste( ) const;

返回值：
如果剪贴板中包含的数据的格式是此rich编辑视可以接收的，则返回非零值；否则返回0。

说明：
此成员函数用来确定剪贴板包含的信息是否可以粘贴到此rich编辑视中。

请参阅：
CRichEditCtrl::Paste, CRichEditView::DoPaste, CRichEditView::IsRichEditFormat


 CRichEditView::CRichEditView

CRichEditView( );

说明：
此成员函数用来创建一个CRichEditView对象。

请参阅：CRichEditDoc, CRichEditCtrl


 CRichEditView::DoPaste

void DoPaste( COleDataObject& dataobj, CLIPFORMAT cf, HMETAFILEPICT hMetaPict );

参数：
dataobj | 要粘贴的COleDataObject包含的数据。
cf | 所希望的剪贴板格式。
hMetaPict | 代表要被粘贴的项的图元文件。

说明：
此成员函数用来将dataobj中的OLE项粘贴到rich编辑文档/视中。可以调用这个函数作为QueryAcceptData实现的一部分。
这个函数根据PasteSpecial的处理者的结果来决定粘贴类型。如果cf是0，则新项使用当前的图标来代表。如果cf是非零值并且hMetaPict不是NULL，则新项使用hMetaPict作为它的代表。

请参阅：
CRichEditCtrl::Paste, CRichEditView::IsRichEditFormat, CRichEditView::InsertItem


 CRichEditView::FindText

BOOL FindText( LPCTSTR lpszFind, BOOL bCase = TRUE, BOOL bWord = TRUE );

返回值：
如果找到了lpszFind文本，则返回非零值；否则返回0。

参数：
lpszFind | 包含要搜索的字符串。
bCase | 指明查找是否是大小写敏感的。
bWord | 指明查找只是全词匹配，还是匹配词的一部分。

说明：
此成员函数还是用来查找指定的文本，并将其设置为当前文本。这个函数在查找期间显示等待鼠标。

请参阅：
CRichEditCtrl::FindText, CRichEditCtrl::SetSel, CRichEditView::FindTextSimple, CWaitCursor


 CRichEditView::FindTextSimple

BOOL FindTextSimple( LPCTSTR lpszFind, BOOL bCase = TRUE, BOOL bWord = TRUE );

返回值：
如果找到了lpszFind文本则返回非零值；否则返回0。

参数：
lpszFind | 包含要搜索的字符串。
bCase | 指明查找是否是大小写敏感。
bWord | 指明查找只是全词匹配，还是匹配词的一部分。

说明：
此成员函数用来查找指定的文本，并将其设置为当前选择。

请参阅：
CRichEditCtrl::FindText, CRichEditCtrl::SetSel, CRichEditView::FindText


 CRichEditView::GetCharFormatSelection

CHARFORMAT& GetCharFormatSelection( );

返回值：
返回一个CHARFORMAT结构，该结构包含了当前选择的字符格式化属性。

说明：
此成员函数用来获取当前选择的字符格式化属性。
更多的信息，参见Win32文档中的EM_GETCHARFORMAT消息和CHARFORMAT结构。

请参阅：
CRichEditView::SetCharFormat, CRichEditView::GetParaFormatSelection, CRichEditCtrl::GetSelectionCharFormat


 CRichEditView::GetClipboardData

virtual HRESULT GetClipboardData( CHARRANGE* lpchrg,
DWORD dwReco,
LPDATAOBJECT lpRichDataObj,
LPDATAOBJECT* lplpdataobj
);

返回值：
返回一个HRESULT值，该值用来报告操作的成功。有关HRESULT的更多信息，参见“Platform SDK”中的“COM 错误代码结构”。

参数：
lpchrg | 指向CHARRANGE结构的指针，该结构指定了要被拷贝到由lplpdataobj指定的数据结构中去的字符（和OLE项）的范围。
dwReco剪贴板操作标志。可以是下列值之一：
· | RECO_COPY | 拷贝到剪贴板。
· | RECO_CUT | 剪切到剪贴板。
· | RECO_DRAG | 拖动操作（拖放）。
· | RECO_DROP | 放开操作（拖放）。
· | RECO_PASTE | 从剪贴板粘贴。
lpRichDataObj | 指向一个IDataObject对象的指针，该对象包含了来自带格式编辑控件（IRichEditOle:: GetClipboardData）的剪贴板数据。
lplpdataobj | 指向一个指针变量的指针，该指针变量用来接收代表在lpchrg参数中指定的范围的IDataObject对象的地址。如果返回的是一个错误，则lplpdataobj的值被忽略。

说明：
框架调用这个函数作为IRichEditOleCallback::GetClipboardData处理的一部分。如果返回值表示成功，则IRichEditOleCallback::GetClipboardData返回由lplpdataobj访问的IDataObject；否则，它返回由lpRichDataObj访问的对象。
这个函数的缺省实现返回E_NOTIMPL。
这是一个高级的可重载函数。
更多的信息，参见Win32文档中的IRichEditOle::GetClipboardData，IrichEditOleCallback:: GetClipbuardpata和CHARRANGE，及参见OLE文档中的IDataObject。

请参阅：COleServerItem::GetClipboardData


 CRichEditView::GetContextMenu

virtual HMENU GetContextMenu( WORD seltyp, LPOLEOBJECT lpoleobj, CHARRANGE* lpchrg );

返回值：返回上下文菜单的句柄。

参数：
seltyp | 选择的类型。在说明部分描述了选择的类型值。
lpoleobj | 指向一个OLEOBJECT结构的指针，该结构指定了第一个被选择的OLE对象，如果选择中包含一个或更多的OLE项的话。如果选择没有包含项，则lpoleobj 就是NULL。OLEOBJECT结构保存一个指向一个OLE对象vtable的指针。
lpchrg | 指向一个CHARRANGE结构的指针，该结构包含了当前的选择。

说明：
框架调用这个成员函数作为IRichEditOleCallback::GetContextMenu处理的一部分。此函数是鼠标右键处理程序的典型组成部分。
选择类型可以时下列标志的任意组合：
· | SEL_EMPTY | 表明没有当前选择。
· | SEL_TEXT | 表明当前选择包含了文本。
· | SEL_OBJECT | 表明当前选择包含了至少一个OLE项。
· | SEL_MULTICHAR | 表明当前选择包含的文本不止一个字符。
· | SEL_MULTIOBJECT | 表明当前选择包含了不止一个的OLE对象。
此函数的缺省实现返回NULL。这是一个高级的可重载函数。
更多的信息，参见Win32文档中的IRichEditOleCallback::GetContextMenu和CHARRANGE。
更多有关OLEOBJECT类型的信息，参见“OLE知识库”中的“OLE数据结构和结构配置”。

请参阅：CRichEditCtrl::GetSelectionType


 CRichEditView::GetDocument

CRichEditDoc* GetDocument( ) const;

返回值：
返回一个指向CRichEditDoc对象的指针，该对象与应用程序的CRichEditView对象相关。

说明：
此成员函数用来获取一个指向与这个视相关联的CRichEditDoc对象的指针。

请参阅：
CRichEditDoc, CView::GetDocument, COleClientItem::GetDocument


 CRichEditView::GetInPlaceActiveItem

CRichEditCntrItem* GetInPlaceActiveItem( ) const;

返回值：
返回一个指向CRichEditCntrItem对象的指针，该对象是此rich编辑视中单一的，可现场激活的CRichEditCntrItem对象。

说明：
此成员函数用来获取此CRichEditView对象中的当前被现场激活的OLE项。

请参阅：
COleDocument::GetInPlaceActiveItem, CRichEditCntrItem, CRichEditView::GetSelectedItem


 CRichEditView::GetMargins

CRect GetMargins( ) const;

返回值：
返回在打印中使用的页边距，此页边距是以MM_TWIPS来度量的。

说明：
此成员函数用来接收在打印中使用的当前页边距。

请参阅：
CRichEditView::SetMargins, CRichEditView::GetPrintWidth, CRichEditView::GetPrintRect, CRichEditView::GetPaperSize, CRichEditView::PrintPage, CRichEditView::WrapChanged


 CRichEditView::GetPageRect

CRect GetPageRect( ) const;

返回值：
返回在打印中使用的页面范围，以MM_TWIPS来度量。

说明：
此成员函数用来获取用于打印的页面尺寸。这个值是根据纸张大小来确定的。

请参阅：
CRichEditView::GetMargins, CRichEditView::GetPrintWidth, CRichEditView::GetPrintRect, CRichEditView::GetPaperSize, CRichEditView::PrintPage


 CRichEditView::GetPaperSize

CSize GetPaperSize( ) const;

返回值：
返回用于打印的纸张大小，以MM_TWIPS度量。

说明：此成员函数用来获取当前的纸张大小。

请参阅：
CRichEditView::SetPaperSize, CRichEditView::GetMargins, CRichEditView::GetPrintWidth, CRichEditView::GetPrintRect, CRichEditView::GetPageRect, CRichEditView::PrintPage


 CRichEditView::GetParaFormatSelection

PARAFORMAT& GetParaFormatSelection( );

返回值：
返回一个PARAFORMAT结构，该结构包含了当前选择的段落格式化属性。

说明：
此成员函数用来获取当前选择的段落格式化属性。
更多的信息，参见Win32文档中的EM_GETPARAFORMAT消息和PARAFORMAT结构。

请参阅：
CRichEditView::GetCharFormatSelection, CRichEditView::SetParaFormat, CRichEditCtrl::GetParaFormat


 CRichEditView::GetPrintRect

CRect GetPrintRect( ) const;

返回值：用于打印的图像区域的界线。

说明：
此成员函数用来获取页面矩形中用于打印的区域的界线。

请参阅：
CRichEditView::GetMargins, CRichEditView::GetPrintWidth, CRichEditView::GetPaperSize, CRichEditView::GetPageRect, CRichEditView::PrintPage


 CRichEditView::GetPrintWidth

int GetPrintWidth( ) const;

返回值：
返回打印区域的宽度，以MM_TWIPS度量。

说明：此成员函数用来确定打印区域的宽度。

请参阅：
CRichEditView::GetMargins, CRichEditView::GetPrintRect, CRichEditView::GetPaperSize, CRichEditView::GetPageRect, CRichEditView::PrintPage, CRichEditView::WrapChanged


 CRichEditView::GetRichEditCtrl

CRichEditCtrl& GetRichEditCtrl( ) const;

返回值：返回用于这个视的CRichEditCtrl对象。

说明：
此成员函数用来获取与这个CRichEditView对象相关联的CRichEditCtrl对象。

请参阅：
CRichEditCtrl, CEditView::GetEditCtrl, CTreeView::GetTreeCtrl, CListView::GetListCtrl


 CRichEditView::GetSelectedItem

CRichEditCntrItem* GetSelectedItem( ) const;

返回值：
返回指向一个在CRichEditView对象中选择的CRichEditCntrItem对象的指针；如果在这个视中没有被选择的项，则返回NULL。

说明：
此成员函数用来获取CRichEditView中的当前选择的OLE项（一个CRichEditCntrItem对象）。

请参阅：
CRichEditCntrItem, CRichEditView::GetInPlaceActiveItem


 CRichEditView::GetTextLength

long GetTextLength( ) const;

返回值：
返回这个CRichEditView对象中的文本的长度。

说明：
此成员函数用来获取这个CRichEditView对象中的文本长度。

请参阅：CRichEditCtrl::GetTextLength


 CRichEditView::InsertFileAsObject

void InsertFileAsObject( LPCTSTR lpszFileName );

参数：
lpszFileName 是一个字符串，包含了要被插入的文件的名字。

说明：
此成员函数用来将一个指定的文件（作为一个CRichEditCntrItem对象）插入到一个rich编辑视。

请参阅：
CRichEditView::InsertItem, CRichEditCntrItem


 CRichEditView::InsertItem

HRESULT InsertItem( CRichEditCntrItem* pItem );

返回值：返回有关HRESULT值表示插入的成功。

参数：
pItem 指向要插入的项的指针。

说明：
此成员函数用来将一个CRichEditCntrItem对象插入到一个rich编辑视。
更多有关HRESULT的信息，参见“Platform SDK”中的“COM错误代码结构”。

请参阅：
CRichEditView::InsertFileAsObject, CRichEditCntrItem


 CRichEditView::IsRichEditFormat

BOOL IsRichEditFormat( CLIPFORMAT cf );

返回值：
如果cf是一个rich编辑或文本剪贴板格式，则返回非零值。

参数：
cf 关心的剪贴板格式。

说明：
此成员函数用来确定cf剪贴板格式是文本，带格式文本，或是有OLE项的带格式文本。

请参阅：
CRichEditCtrl::CanPaste, CRichEditCtrl::Paste, CRichEditView::DoPaste


 CRichEditView::IsSelected

virtual BOOL IsSelected( const CObject* pDocItem ) const;

返回值：
如果对象被选择则返回非零值；否则返回0。

参数：
pDocItem 指向视中的一个对象的指针。

说明：
此成员函数用来确定指定的OLE项是否是视中当前被选择的项。
如果你的派生视类有处理OLE项选择的不同方法，可以重载这个函数。

请参阅：
CRichEditView::GetSelectedItem, CRichEditView::GetInPlaceActiveItem


 CRichEditView::OnCharEffect

void OnCharEffect( DWORD dwMask, DWORD dwEffect );

参数：
dwMask | 在当前选择中要修改的字符格式化效果。
dwEffect | 想要的字符格式化效果的列表。

说明：
此成员函数用来为当前选择改变字符格式化效果。
有关dwMask和dwEffect参数和它们的潜在值的更多信息，参见Win32文档中CHARFORMAT的相应数据成员。

请参阅：CRichEditView::SetCharFormat


 CRichEditView::OnFindNext

virtual void OnFindNext( LPCTSTR lpszFind, BOOL bNext, BOOL bCase, BOOL bWord );

参数：
lpszFind | 要查找的字符串。
bNext | 搜索的方向：如果是TRUE则是向下搜索；如果时FALSE则向上搜索。
bCase | 表明查找是否是大小写敏感的。
bWord | 表明查找是否需要匹配整个单词。

说明：
当处理来自Find/Replace对话框的命令时，由框架调用此成员函数。此函数用来在CRichEditView中查找文本。重载这个函数可以为你的派生视类改变搜索特征。

请参阅：
CRichEditView::FindText, CRichEditView::FindTextSimple


 CRichEditView::OnInitialUpdate

virtual void OnInitialUpdate( );

说明：
在第一次将视与文档连接之后，但在视被初始化显示之前，由框架打印此成员函数。这个函数的缺省实现打印了CView::OnUpdate成员函数，没有提示信息（即，参数使用缺省值，lHint为0，pHint为NULL）。重载这个函数可以实现任何需要有关文档信息的一次初始化。例如，如果你的应用程序有固定大小的文档，你就可以根据文档的大小使用这个函数来初始化一个视的滚动极限。
如果你的应用程序支持可变大小的文档，则可以在每次文档改变时使用OnUpdate来更新视的滚动极限。

请参阅：CView::OnUpdate


 CRichEditView::OnParaAlign

void OnParaAlign( WORD wAlign );

参数：
wAlign想要的段落对齐方式。可以是下列值之一：
· | PFA_LEFT | 段落按左边距对齐。
· | PFA_RIGHT | 段落按右边距对齐。
· | PFA_CENTER | 段落居中对齐。

说明：此函数用来改变选择段的段落对齐方式。

请参阅：CRichEditView::OnUpdateParaAlign


 CRichEditView::OnPasteNativeObject

virtual BOOL OnPasteNativeObject( LPSTORAGE lpStg );

返回值：如果成功则返回非零值；否则返回0。

参数：
lpStg 指向一个IStorage对象的指针。

说明：
此成员函数用来从一个嵌入项加载本地数据。通常，你可以通过创建一个围绕IStorage的COleStreamFile来实现这一点。这个COleStreamFile可以连接到一个文档，可以调用CObject::Serialize来加载数据。
这是一个高级的可重载函数。
更多的信息，参见OLE文档中的IStorage。

请参阅：
COleStreamFile, CObject::Serialize, CArchive


 CRichEditView::OnPrinterChanged

virtual void OnPrinterChanged( const CDC& dcPrinter );

参数：
dcPrinter 新打印机的CDC对象。

说明：
当打印机改变时，重载这个函数来改变带格式编辑视的特征。缺省的实现将纸张的尺寸设置为输出设备（打印机）的物理高度和宽度。如果没有与dcPrinter相关联的设备环境。则缺省实现将纸张的尺寸设置为8.5×11寸。

请参阅：
CRichEditView::SetPaperSize, CRichEditView::WrapChanged


 CRichEditView::OnReplaceAll

virtual void OnReplaceAll( LPCTSTR lpszFind, LPCTSTR lpszReplace, BOOL bCase, BOOL bWord );

参数：
lpszFind | 要被替换的文本。
lpszReplace | 用来替换的文本。
bCase | 表明查找是否是大小写敏感的。
bWord | 表明查找是否需要选择整个单词。

说明：
当处理来自Replace对话框的Replace All命令时框架调用此成员函数。此函数用另外的给定文本来替换所有出现的指定文本。重载这个函数可以改变这个视的查找特征。

请参阅：
CRichEditView::OnReplaceSel, CRichEditView::OnFindNext


 CRichEditView::OnReplaceSel

virtual void OnReplaceSel( LPCTSTR lpszFind, BOOL bNext, BOOL bCase, BOOLbWord, LPCTSTR lpszReplace );

参数：
lpszFind | 要被替换的文本。
bNext | 表明搜索的方向：如果是TRUE则表示向下搜索；如果是FALSE则表示向上搜索。
bCase | 表明搜索是否是大小写敏感的。
bWord | 表明搜索是否必须选择整个单词。
lpszReplaced | 用来替换的文本。

说明：
当处理来自Replac对话框的Replace命令时框架调用此成员函数。此函数用另一个字符串来替换某个给定文本的一次出现。重载这个函数可以改变这个视的搜索特征。

请参阅：CRichEditView::OnReplaceAll


 CRichEditView::OnTextNotFound

virtual void OnTextNotFound( LPCTSTR lpszFind );

参数：
lpszFind 没有查找到的文本。

说明：
当一次搜索失败时框架调用此成员函数。重载这个函数可以改变来自一个MessageBeep的输出通知。
更多的信息，参见Win32文档的MessageBeep。

请参阅：
CRichEditView::FindText, CRichEditView::FindTextSimple, CRichEditView::OnFindNext


 CRichEditView::OnUpdateCharEffect

void OnUpdateCharEffect( CCmdUI* pCmdUI, DWORD dwMask, DWORD dwEffect );

参数：
pCmdUI | 指向一个CCmdUI对象的指针。
dwMask | 表示字符格式化掩码。
dwEffect | 表示字符格式化的效果。

说明：
框架调用此成员函数来更新字符效果命令的命令UI。掩码 dwMask指定了要检查的字符格式化属性。标志dwEffect列出了要设置/清除的字符格式化属性。
有关dwMask和dwEffect参数和它们的潜在值的更多信息，参见Win32文档中的CHARFORMAT的相应数据成员。


 CRichEditView::OnUpdateParaAlign

void OnParaAlign( CCmdUI* pCmdUI, WORD wAlign );

参数：
pCmdUI 指向一个CCmdUI对象的指针。
wAlign要检查的段落对齐方式。可以是下列值之一：
· | PFA_LEFT | 段落按左边距对齐。
· | PFA_RIGHT | 段落按右边距对齐。
· | PFA_CENTER | 段落居中对齐。

说明：
框架调用此成员函数来更新段落效果命令的命令UI。

请参阅：
CRichEditView::GetParaFormatSelection, CRichEditView::OnParaAlign, CRichEditView::SetParaFormat


 CRichEditView::PrintInsideRect

long PrintInsideRect( CDC* pDC,
RECT& rectLayout,
long nIndexStart,
longnIndexStop,
BOOL bOutput
);

返回值：
返回值为适合输出区域的最后一个字符的索引值再加1。

参数：
pDC | 指向一个输出区域的设备环境的指针。
rectLayout | 用来定义输出区域的RECT或CRect。
nIndexStart | 要被格式化的第一个字符的从零开始的索引。
nIndexStop | 要被格式化的最后一个字符的从零开始的索引。
bOutput | 表明是否要丢弃文本。如果时FALSE，则文本正好适量。

说明：
此成员函数用来为pDC指定的设备格式化一个带格式编辑控件中的一定范围的文本，使之正好在rectLayout之内。通常，在调用这个函数之后，会调用生成输出的CRichEditCtrl::DisplayBand。

请参阅：
CRichEditCtrl::FormatRange, CRichEditView::PrintPage, CRichEditCtrl::DisplayBand


 CRichEditView::PrintPage

long PrintPage( CDC* pDC, long nIndexStart, long nIndexStop );

返回值：
返回值为此页面中的最后一个字符的索引值加1。

参数：
pDC | 指向一个用于页面输出的设备环境的指针。
nIndexStart | 要被格式化的第一个字符的从零开始的索引。
nIndexStop | 要被格式化的最后一个字符的从零开始的索引。

说明：
此成员函数用来为pDC指定的设备格式化一个带格式编辑控件中的一定范围的文本。每一个页面的版面都由GetPageRect和GetPrintRect控制。通常，在调用这个函数之后会调用生成输出的CRichEditCtrl::DisplayBand。
注意：
PrintPase使用的边距是与物理页相关的，而不是与逻辑页相关。因此，由于许多打印机在纸张上具有不打印的区域，所以为零的页边距将会剪裁文本。为了避免剪裁文本,你必须在打印前调用SetMargins来设置合理的打印机页边距。

请参阅：
CRichEditView::PrintInsideRect, CRichEditView::GetPageRect, CRichEditView::GetPrintRect, CRichEditView::SetMargins


 CRichEditView::QueryAcceptData

virtual HRESULT QueryAcceptData( LPDATAOBJECT lpdataobj,
CLIPFORMATFAR* lpcfFormat,
DWORD dwReco,
BOOL bReally,
HGLOBAL hMetaFile
);

返回值：返回一个报告操作成功的HRESULT值。

参数：
lpdataobj | 指向要查询的IDataObject的指针。
lpcfFormat | 指向可以接受的数据格式的指针。
dwReco | 没有使用。
bReally | 表明是否应该继续进行粘贴操作。
hMetaFile | 一个用来绘制项的图标的图元文件的句柄。

说明：
框架调用此成员函数来将一个对象粘贴到带格式编辑中。重载这个函数以在你的派生文档类中处理不同的COM项的组织。
有关HRESULT和IDataObject的更多信息，分别参见“Platform SDK”中的“COM错误代码结构”和IDataObject。


 CRichEditView::SetCharFormat

void SetCharFormat( CHARFORMAT cf );

参数：
cf 包含新的缺省字符格式化属性的CHARFORMAT结构。

说明：
此成员函数用来为CRichEditView的新文本设置字符格式化属性。这个函数只改变cf的dwMask成员指定的属性。
更多的信息，参见Win32文档中的EM_SETCHARFORMAT消息和CHARFORMAT结构。

请参阅：
CRichEditView::GetCharFormatSelection, CRichEditView::SetParaFormat


 CRichEditView::SetMargins

void SetMargins( const CRect& rectMargin );

参数：
rectMargin 用于打印的新的页边距值，以MM_TWIPS度量。

说明：
此成员函数用来设置这个带格式编辑控件的打印页边距。如果m_nWordWrap是WrapToTargetDevice，则你应该在使用这个函数之后调用WrapChanged来调整打印特性。
注意，PrintPage使用的边距是与物理页相关的，而不是与逻辑页相关。因此，由于许多打印机在纸张上具有不打印的区域，所以为零的页边距将会剪裁文本。为了避免剪裁文本，你必须在打印前调用SetMargins来设置合理的打印机页边距。

请参阅：
CRichEditView::GetMargins, CRichEditView::GetPrintWidth, CRichEditView::GetPrintRect, CRichEditView::GetPaperSize, CRichEditView::GetPageRect, CRichEditView::PrintPage, CRichEditView::WrapChanged


 CRichEditView::SetPaperSize

void SetPaperSize( CSize sizePaper );

参数：
sizePaper 用于打印的新的纸张尺寸值，以MM_TWIPS度量。

说明：
此成员函数用来为打印这个带格式编辑视设置纸张的大小。如果m_nWordWrap是WrapToTargetDevice，则你应该在使用这个函数之后调用WrapChanged来调整打印特性。

请参阅：
CRichEditView::GetPaperSize, CRichEditView::GetMargins, CRichEditView::GetPrintWidth, CRichEditView::GetPrintRect, CRichEditView::GetPageRect, CRichEditView::PrintPage, CRichEditView::WrapChanged


 CRichEditView::SetParaFormat

BOOL SetParaFormat( PARAFORMAT& pf );

返回值：如果成功则返回非零值；否则返回0。

参数：
pf 包含新的缺省度量格式化属性的PARAFORMAT结构。

说明：
此成员函数用来为这个CRichEditView对象中的当前选择设置段落格式化属性。这个函数只改变pf的dwMask成员指定的属性。
更多的信息，参见Win32文档中的EM_SETPARAFORMAT消息和PARAFORMAT结构。

请参阅：
CRichEditView::GetParaFormatSelection, CRichEditView::SetCharFormat


 CRichEditView::WrapChanged

virtual void WrapChanged( );

说明：
当打印特性被改变时（SetMargins或SetPaperSize）调用此成员函数。
重载这个函数可以修改这个带格式编辑视对m_nWordWrap中的变化或打印特性的变化（OnPrinterChanged）做出反应的方式。

请参阅：
CRichEditView::m_nWordWrap, CRichEditView::OnPrinterChanged, CRichEditView::SetMargins, CRichEditView::SetPaperSize


 CRichEditView::m_nBulletIndent

说明：
此数据成员表示公告项在一个列表中的缩进；缺省的，为720个单位，就是1/2寸。


 CRichEditView::m_nWordWrap

说明：
此数据成员表示这个带格式编辑视的word wrap的类型。可以是下列值之一：
· | WrapNone | 表示没有自动的word wrap。
· | WrapToWindow | 表示根据窗口的宽度来进行word wrap。
· | WrapToTargetDevice | 表示根据目标设备的特性来进行word wrap。

请参阅：CRichEditView::WrapChanged


 CRuntimeClass

CRuntimeClass没有基类。
每个由CObject派生的类都与一个CRuntimeClass结构相联系，用户可以使用该结构获取一个对象及其基类的运行时信息。当需要额外的函数参数检查时，或当用户必须根据一个对象的类编写特殊目的代码时，在运行时确定该对象的类就非常有用。C++并不直接支持运行时类的信息。
此结构具有下列成员：
LPCSTR m_lpszClassName 存放ASCII类名的以空字符结尾的字符串。

int m_nObjectSize
以字节为单位给出对象的大小。若此对象具有指向被分配的内存的数据成员，则此值不包含该内存的大小。

UINT m_wSchema
分类编号（对不可分类的类，该值为-1）。对于此分类编号的详细说明，参见IMPLEMENT_SERIAL宏。

CObject* ( PASCAL* m_pfnCreateObject )( )
是一个指向缺省的构造函数的函数指针，该构造函数创建一个你的类的对象（只有在类支持动态创建时才有效；否则，返回NULL）。

CRuntimeClass* ( PASCAL* m_pfn_GetBaseClass )( )
如果你的应用程序是动态地链接到MFC的AFXDLL版本，则是一个指向函数的指针，该函数返回基类的CRuntimeClass结构。

CRuntimeClass* m_pBaseClass
如果你的应用程序是静态地链接到MFC的，则是一个指向基类的CRuntimeClass结构的指针。
Feature Only in Professional and Enterprise Editions 只有在Visual C++的专业版和企业版中才支持对MFC的静态链接。

CObject* CreateObject( );
从CObject派生的类可以支持动态创建，这是在运行时创建一个指定类的对象的能力。例如，文档，视和框架类就应该支持动态创建。CreateObject成员函数可以用来实现这个功能，在运行时为这些类创建对象。

BOOL IsDerivedFrom( const CRuntimeClass* pBaseClass) const;
如果IsDerivedFrom类成员的类是从基类派生而来，该基类的CRuntimeClass结构作为一个参数给出，则返回TRUE。IsDerivedFrom从该成员的类开始向上沿派生类链经过所有的类直到顶端，并且只有在没有与基类匹配的类时才返回FALSE。

注意：
要使用CRuntimeClass结构，你必须在你想要获取运行时对象信息的类的实现中包括IMPLEMENT_DYNAMIQ，IMPLEMENT_DYNCREATE，或IMPLEMENT_SERIAL宏。

请参阅：
CObject::GetRuntimeClass, CObject::IsKindOf, RUNTIME_CLASS, IMPLEMENT_DYNAMIC, IMPLEMENT_DYNCREATE, IMPLEMENT_SERIAL


 CScrollBar

CObject
└CCmdTarget
└CWnd
└CScrollBar

CScrollBar类支持一个Windows滚动条控件的功能。
创建一个滚动条控件分为两步。首先，调用构造函数CScrollBar来构造一个CScrollBar对象，然后调用Create成员函数来创建Windows滚动条控件并将它与CScrollBar对象相联系。
如果你是在一个对话框（通过一个对话框资源）中创建一个CScrollBar对象的，则当用户关闭这个对话框时，CScrollBar自动销毁。
如果你是在一个窗口中创建一个CScrollBar对象，则你必须负责销毁该对象。
如果你是堆栈中创建CScrollBar对象，则该对象将会自动销毁。如果你是通过使用New函数在数据堆中创建CScrollBar对象，则当用户终止使用该Windows滚动条时，你必须调用delete来销毁该对象。
如果你在此CScrollBar对象中分配了任何内存，则应重载CScrollBar析构函数来释放这些内存。
#include <afxwin.h>

请参阅：
CWnd, CButton, CComboBox, CEdit, CListBox, CStatic, CDialog

CScrollBar类成员

Construction
CScrollBar 构造一个CScrollBar对象

Initialization
Create 创建Windows滚动条，并将它连接到CScrollBar对象上

Operations
GetScrollPos | 获取一个滚动框的当前位置
SetScrollPos | 设置一个滚动框的当前位置
GetScrollRange | 获取给定滚动条的当前最大和最小滚动条位置
SetScrollRange | 设置给定滚动条的最小和最大位置
ShowScrollBar | 显示或隐藏一个滚动条
EnableScrollBar | 使一个滚动条的一个或两个箭头有效或无效
SetScrollInfo | 设置有关滚动条的信息
GetScrollInfo | 获取有关滚动条的信息
GetScrollLimit | 获取滚动条的极限


 CScrollBar::Create

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

返回值：如果成功则返回非零值；否则返回0。

参数：
dwStyle | 指定滚动条的风格。任何滚动条风格的组合都适用于滚动条。
rect | 指定滚动条的大小和位置。可以是一个RECT结构或是一个CRect对象。
pParentWnd | 指定滚动条的父窗口，通常是一个CDialog对象。它不能是NULL。
nID | 该滚动条的控件ID。

说明：
可以分两步构造一个CScrollBar对象。首先调用构造函数来构造一个CScrollBar对象；然后调用Create来创建并初始化关联的Windows滚动条，并将它连接到该CScrollBar对象上。
可以将下列窗口风格使用到一个滚动条：
· | WS_CHILD | 总要使用。
· | WS_VISIBLE | 常用。
· | WS_DISABLED | 少用。
· | WS_GROUP | 将控件分组。

请参阅：CScrollBar::CScrollBar


 CScrollBar::CScrollBar

CScrollBar( );

说明：
此成员函数用来构造一个CScrollBar对象。在构造对象之后，调用Create成员函数来创建并初始化Windows滚动条。

请参阅：CScrollBar::Create


 CScrollBar::EnableScrollBar

BOOL EnableScrollBar( UINT nArrowFlags = ESB_ENABLE_BOTH );

返回值：
如果按指定的要求使箭头有效或无效，则返回非零值；否则返回0，这表明箭头已经处于需要的状态，或者是发生了一个错误。

参数：
nArrowFlags指定是要使给定箭头有效还是无效，及是使哪一个箭头有效或无效。这个参数可以是下列值之一：
· | ESB_ENABLE_BOTH | 使滚动条的两个箭头都有效。
· | ESB_DISABLE_LTUP | 使水平滚动条的左箭头或垂直滚动条的上箭头无效。
· | ESB_DISABLE_RTDN | 使水平滚动条的右箭头或垂直滚动条的下箭头无效。
· | ESB_DISABLE_BOTH | 使滚动条的两个箭头都无效。

说明：
此成员函数用来使滚动条的一个或两个箭头有效或无效。

请参阅：CWnd::EnableScrollBar, ::EnableScrollBar


 CScrollBar::GetScrollInfo

BOOL GetScrollInfo( LPSCROLLINFO lpScrollInfo, UINT nMask );

返回值：
如果消息获取了任何值，则返回TRUE；否则返回FALSE。

参数：
lpScrollInfo | 指向一个SCROLLINFO结构的指针。参见“Win32程序员参考”可以获得更多有关这个结构的信息。
nMask | 指定要获取的滚动条参数。通常使用的是：SIF_ALL，表示是SIF_PAGE，SIF_POS，SIF_TRACKPOS和SIF_RANGE的组合。参见SCROLLINFO可以获得有关nMask值的更多信息。

说明：
此成员函数用来获取由SCROLLINFO结构保存的关于一个滚动条的信息。GetScrollInfo允许应用程序使用32位的滚动位置信息。
SCROLLINFO结构包含了有关一个滚动条的信息，包括滚动位置的最小和最大值，页面的大小和滚动框（拇指）的位置。参见“Win32 SDK程序员参考”中的SCROLLINFO结构主题，可以获得有关改变结构的缺省值的更多信息。
MFC Windows消息句柄表示了滚动条的位置，CWnd::OnHScroll和CWnd::OnVScroll只提供16位的位置数据。GetScrollInfo和SetScrollInfo提供32位的滚动条位置数据。因此，一个应用程序在处理GetScrollInfo或SetScrollInfo时，可以调用GetScrollInfo来获取32位的滚动条位置数据。

请参阅：
CScrollBar::SetScrollInfo, CWnd::SetScrollInfo, CWnd::SetScrollPos, CWnd::OnVScroll, CWnd::OnHScroll, SCROLLINFO


 CScrollBar::GetScrollLimit

int GetScrollLimit( );

返回值：
如果成功则返回值指定滚动条最大位置；否则返回值为0。

说明：此成员函数用来获取滚动条的最大滚动位置。

请参阅：CWnd::GetScrollLimit


 CScrollBar::GetScrollPos

int GetScrollPos( ) const;

返回值：
如果成功则返回指定滚动框当前位置的值；否则返回0。

说明：
此成员函数用来获取一个滚动框的当前位置。这个当前位置是一个相对值，它依赖于当前的滚动范围。例如，如果滚动范围是100到200，而滚动框是在滚动条的中间，则这个当前位置是150。

请参阅：
CScrollBar::SetScrollPos, CScrollBar::GetScrollRange, CScrollBar::SetScrollRange, ::GetScrollPos


 CScrollBar::GetScrollRange

void GetScrollRange( LPINT lpMinPos, LPINT lpMaxPos ) const;

参数：
lpMinPos | 指向一个用来接收最小位置的整型变量。
lpMaxPos | 指向一个用来接收最大位置的整型变量。

说明：
此成员函数将滚动条的当前滚动条位置的最小和最大值拷贝为lpMinPos和lpMaxPos指定的值。
一个滚动条控件的缺省范围是空（两个值都为零）。

请参阅：
::GetScrollRange, CScrollBar::SetScrollRange, CScrollBar::GetScrollPos, CScrollBar::SetScrollPos


 CScrollBar::SetScrollInfo

BOOL SetScrollInfo( LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE );

返回值：如果成功则返回TRUE；否则返回FALSE。

参数：
lpScrollInfo | 指向一个SCROLLINFO结构的指针。
bRedraw | 指示这个滚动条是否应重画以反映新的信息。如果bRedraw是TRUE，则滚动条被重画。如果它是FALSE，则不重画滚动条。缺省的，滚动条将被重画。

说明：
此成员函数用来设置SCROLLINFO结构保持的有关一个滚动条的信息。你必须提供SCROLLINFO结构参数需要的值，包括标志值。
SCROLLINFO结构包含了有关一个滚动条的信息，包括滚动位置的最小和最大值，页面的大小和滚动框（拇指）的位置。参见“Win32 SDK程序员参考”中的SCROLLINFO结构主题，可以获得有关改变此结构的缺省值的更多信息。

请参阅：
CScrollBar::GetScrollInfo, CWnd::SetScrollInfo, CWnd::SetScrollPos, CWnd::OnVScroll, CWnd::OnHScroll, CWnd::GetScrollInfo, SCROLLINFO


 CScrollBar::SetScrollPos

int SetScrollPos( int nPos, BOOL bRedraw = TRUE );

返回值：
如果成功则返回滚动框的先前位置；否则返回0。

参数：
nPos | 指定滚动框的新位置。它必须是在滚动范围之内。
bRedraw | 指示滚动条是否应该被重画来反映新的位置。如果bRedraw是TRUE，则滚动条被重画。如果它是FALSE，则不重画滚动条。缺省的，滚动条将被重画。

说明：
此成员函数用来将一个滚动框的当前位置设置为nPos指定的位置，并且，如果指定了重画，则重画滚动条来反映新的位置。

请参阅：
CScrollBar::GetScrollPos, CScrollBar::GetScrollRange, CScrollBar::SetScrollRange, ::SetScrollPos


 CScrollBar::SetScrollRange

void SetScrollRange( int nMinPos, int nMaxPos, BOOL bRedraw = TRUE );

参数：
nMinPos | 指定滚动位置的最小值。
nMaxPos | 指定滚动位置的最大值。
bRedraw | 指示是否要重画滚动条来反映改变。如果bRedraw是TRUE，则滚动条被重画。如果它是FALSE，则不重画滚动条。缺省的，滚动条将被重画。

说明：
此成员函数用来为给定的滚动条设置滚动位置的最小和最大值。如果将nMinPos和nMaxPos都设置为零，则隐藏此标准滚动条。
当处理一个滚动条通知消息时，不要调用这个函数来隐藏一个滚动条。
如果在调用SetScrollRange之后，立即调用SetScrollPos成员函数，则在SetScrollPos中将bRedraw设置为0，以禁止滚动条被重画两次。
由nMinPos和nMaxPos指定的间隔值必须不大于32,767。一个滚动条控件的缺省范围是空（nMinPos和nMaxPos都为0）。

请参阅：
CScrollBar::GetScrollPos, CScrollBar::SetScrollPos, CScrollBar::GetScrollRange, ::SetScrollRange


 CScrollBar::ShowScrollBar

void ShowScrollBar( BOOL bShow = TRUE );

参数：
bShow 指示是显示还是隐藏滚动条。如果这个参数是TRUE，则显示滚动条；否则隐藏滚动条。

说明：
此成员函数用来显示或隐藏一个滚动条。
当应用程序在处理一个滚动条通知消息时，不要调用这个函数来隐藏滚动条。

请参阅：
CScrollBar::GetScrollPos, CScrollBar::GetScrollRange, CWnd::ScrollWindow, CScrollBar::SetScrollPos, CScrollBar::SetScrollRange


 CScrollView

CObject
└CCmdTarget
└CWnd
└CView
└CScrollView

CScrollView类是一个具有滚动性能的CView。你可以在任何一个从CView派生的类中通过重载消息映射的OnHScroll和OnVScroll成员函数来自己处理标准的滚动。但是CScrollView给它的CView性能添加了下列特征：
· | 它管理窗口和视口的大小和映射模式。
· | 它响应滚动条消息自动滚动。
· | 它响应来自键盘，非滚动鼠标或IntelliMouse滚轮的消息自动滚动。
你可以通过重载消息映射的OnMouseWheel和OnRegisteredMouseWheel成员函数来自己处理鼠标轮的滚动。就象对于CScrollView一样，这些成员函数支持为轮旋转消息WM_MOUSEWHEEL推荐的行为。
要利用自动滚动的优点，可以从CScrollView派生你的视类来代替CView派生。当视第一次被创建时，如果你希望根据文档的大小来计算可滚动视的大小，可以从重载的CView::OnInitialUpdate或CView::OnUpdate中调用成员函数SetScrollSizes。（你必须编写自己的代码来查询文档的大小。参见在“Visual C++教程”中的“增强视”可以获得有关的示例。）
调用成员函数SetScrollSize可以设置视的映射模式，可滚动视的总尺寸，以及可在水平或垂直方向上滚动的量。所有的尺寸都是以逻辑单位给出的。视的逻辑大小通常是由保存在文档中的数据计算出来的。但在某些情况下，你可能希望为视指定一个固定的尺寸。有关这两种方法的例子，参见CScrollView::SetScrollSizes。
你应该以逻辑单位指定在水平或垂直方向上滚动的量。缺省情况下，如果用户在滚动框之外单击了滚动条的条身，则CScrollView滚动一“页”。如果用户单击了滚动条两端的滚动箭头，则CScrollView滚动一“行”。缺省情况下，一页是指整个视的大小的1/10；一行是指页大小的1/10。你可以通过传递给SetScrollSize成员函数定制的尺寸来代替这些缺省值。例如，你可以将水平大小设置为宽度总尺寸的一部分，并将垂直大小设置为当前字体的一行的高度。
除了滚动之外，CScrollView还可自动将视的大小按比例变换成当前窗口的大小。在这种方式下，视没有滚动条，这个逻辑视被扩大或缩小以精确符合窗口的客户区。要使用这种“scale-to-fit”的功能，可以调用CScrollView::SetScaleToFitSize。（调用SetScaleToFitSize或SetScrollSizes，但不要都调用。）
在调用你的派生类的OnDraw成员函数之前，CScrollView自动调整传递给OnDraw的CPaintDC设备环境对象的视口原点。
为了为滚动窗口调整视口原点，CScrollView重载CView::OnPrepareDC。这种调整对于CScrollView传递给OnDraw的CPaintDC设备环境来说是自动的，但你必须为自己所使用的其它设备环境（例如CClientDC）自己调用CScrollView::OnPrepareDC。你可以重载CScrollView::OnPrepareDC来设置画笔，背景颜色，和其它绘画属性，但是要调用基类来进行比例变换。
滚动条可以显示在与一个视相关的三个位置，如下所示：
· | 可以使用WS_HSCROLL和WS_VSCROLL风格为视设置标准的窗口风格滚动条。
· | 也可以将滚动条加在包含视的框架上，在这种情况下，框架将来自框架窗口的WM_HSCROLL和WM_VSCROLL消息向前传递给当前的活动视。
· | 框架也可以将来自CSplitterWnd分隔器控件的滚动信息转发给当前活动的分隔格（一个视）。当在一个CSplitterWnd中放置了一个可共享的滚动条时，CScrollView对象将使用这个可共享的滚动条而不再去创建它自己的滚动条。
#include <afxwin.h>

请参阅：CView, CSplitterWnd

CScrollView类成员

Operations
FillOutsideRect | 填充视滚动区域之外的其它区域
GetDeviceScrollPosition | 获取以设备单位表示的当前滚动位置
GetDeviceScrollSizes | 获取可滚动视的用设备单位表示的当前映射模式，总尺寸，以及行和页的大小
GetScrollPosition | 获取用逻辑单位表示的当前滚动位置
GetTotalSize | 获取用逻辑单位表示的滚动视的总尺寸
ResizeParentToFit | 使视的大小可以支配它的框架的大小
ScrollToPosition | 将视滚动到用逻辑单位指定的给定点
SetScaleToFitSize | 将视设置为“scale-to-fit”模式
SetScrollSizes | 设置滚动视的映射模式，总尺寸，以及水平和垂直滚动量

Construction
CScrollView 构造一个CScrollView对象


 CScrollView::CScrollView

CScrollView( );

说明：
此成员函数用来构造一个对象。在此滚动视可用之前你必须调用SetScrollSize或SetScaleToFitSize。

请参阅：
CScrollView::SetScrollSizes, CScrollView::SetScaleToFitSize


 CScrollView::FillOutsideRect

void FillOutsideRect( CDC* pDC, CBrush* pBrush );

参数：
pDC | 将在其中完成填充操作的设备环境。
pBrush | 将被填充的区域的画刷。

说明：
调用FillOutsideRect来填充视的滚动区域之外的区域。在滚动视的OnEraseBkgnd处理函数中使用FillOutsideRect可以避免连续的背景重画。

示例：
BOOL CScaleView::OnEraseBkgnd( CDC* pDC )
{
CBrush br( GetSysColor( COLOR_WINDOW ) );
FillOutsideRect( pDC, &br );
return TRUE; // 擦除
}

请参阅：CWnd::OnEraseBkgnd


 CScrollView::GetDeviceScrollPosition

CPoint GetDeviceScrollPosition( ) const;

返回值：
返回一个CPoint对象，包含了滚动框的水平和垂直位置（以设备单位表示）。

说明：
当你需要滚动条中的滚动框的当前水平和垂直位置时，可以调用GetDeviceScrollPosition。此函数返回的坐标对应于已滚动的视的左上角在文档中的位置。在将鼠标设备的位置偏移到滚动视的设备位置时，这一点是很有用的。
GetDeviceScrollPosition的返回值是以设备单位表示的。如果你需要的是逻辑单位值，你可以使用GetScrollPosition来代替。

请参阅：CScrollView::GetScrollPosition


 CScrollView::GetDeviceScrollSizes

void GetDeviceScrollSizes( int& nMapMode, SIZE& sizeTotal, SIZE& sizePage, SIZE& sizeLine ) const;

参数：
nMapMode | 返回这个视的当前映射模式。参见SetScrollSizes可以获得可能取值的列表。
sizeTotal | 返回这个滚动视的当前以设备单位表示的总尺寸。
sizePage | 返回在响应滚动条的条体中发生的鼠标单击时，水平和垂直方向上的当前滚动量。cx成员中存放水平量；cy成员中存放垂直量。
sizeLine | 返回当响应鼠标在某个滚动箭头上单击时水平和垂直方向上的当前滚动量。cx成员中存放水平量；cy成员中存放垂直量。

说明：
GetDeviceScrollSizes用来获取当前的映射模式，总尺寸，以及这个可滚动视的行和页的大小。各个尺寸都是以设备单位表示的。这个成员函数很少被调用。

请参阅：
CScrollView::SetScrollSizes, CScrollView::GetTotalSize


 CScrollView::GetScrollPosition

CPoint GetScrollPosition( ) const;

返回值：
返回一个CPoint对象，包含滚动框的水平和垂直位置（以逻辑单位表示）。

说明：
当你需要滚动条中的滚动框的当前水平和垂直位置时可以调用GetScrollPosition。这个坐标对是对应于已滚动的视的左上角在文档中的位置。GetScrollPosition的返回值是以逻辑单位表示的。如果你需要的是以设备单位表示的值，你可以调用GetDeviceScrollPosition来代替。

请参阅：CScrollView::GetDeviceScrollPosition


 CScrollView::GetTotalSize

CSize GetTotalSize( ) const;

返回值：
返回以逻辑单位表示的滚动视的总尺寸。水平尺寸被保存在CSize返回值的cx成员中。垂直尺寸被保存在cy成员中。

说明：调用GetTotalSize来获取滚动视的当前水平和垂直尺寸。

请参阅：
CScrollView::GetDeviceScrollSizes, CScrollView::SetScrollSizes


 CScrollView::ResizeParentToFit

void ResizeParentToFit( BOOL bShrinkOnly = TRUE );

参数：
bShrinkOnly 要实现的尺寸调整操作。缺省值是TRUE，表示要根据需要缩小框架窗口。对大的视或小的框架窗口，滚动条仍然是可见的。该值为FALSE，表示视总是要精确地调整框架窗口。这样做可能会有危险，这是因为框架窗口可能会变得太大以致于不能被放在多文档界面（MDI）的框架窗口中或屏幕内。

说明：
调用ResizeParentToFit将使视的大小支配它的框架窗口的大小。仅对MDI子窗口才推荐使用此函数。你应该在CScrollView派生类的OnInitialUpdate处理函数中使用ResizeParentToFit函数。关于这个成员函数的例子，参见CScrollView::SetScrollSize。
ResizeParentToFit假设视图窗口的尺寸已被设置好。如果ResizeParentToFit函数被调用时视图窗口的尺寸还没有被设置好，则屏幕上显示一条断言。为了保证不发生此类事件，应确保在调用ResizeParentToFit函数之前进行如下调用：
GetParentFrame()->RecalcLayout();

请参阅：
CView::OnInitialUpdate, CScrollView::SetScrollSizes


 CScrollView::ScrollToPosition

void ScrollToPosition( POINT pt );

参数：
pt 用逻辑单位表示的要滚动到的点。x成员必须是正值（大于或等于0，小于视的总大小值）。当映射模式时MM_TEXT时，对y成员有同样的要求。当映射模式不是MM_TEXT时，y成员是一个负值。

说明：
调用ScrollToPosition来滚动到视中的一个给定点。视也将被滚动以使此点位于窗口的左上角。当视是“scale-to-fit”的视时，不能调用此函数。

请参阅：
CScrollView::GetDeviceScrollPosition, CScrollView::SetScaleToFitSize, CScrollView::SetScrollSizes


 CScrollView::SetScaleToFitSize

void SetScaleToFitSize( SIZE sizeTotal );

参数：
sizeTotal 指出这个视将被比例变换至的水平和垂直尺寸。可滚动视的尺寸是以逻辑单位测量的。cx成员中存放水平尺寸，cy成员中存放垂直尺寸。cx和cy都必须大于或等于0。

说明：
当你希望将视口的尺寸自动按比例变换为当前窗口的尺寸时，可以调用SetScaleToFitSize函数。使用滚动条时，在任一时刻可能只能看到逻辑视的一部分。但是如果具有“scale-to-fit”的功能，则视没有滚动条，并且逻辑视被扩大或缩小以精确吻合窗口的客户区。当窗口被重新调整大小时，该视将根据窗口的尺寸以新的比例绘制其数据。
通常你可以在视的重载的OnInitialUpdate成员函数中调用SetScaleToFitSize。如果你不需要自动按比例变换，调用SetScrollSizes成员函数来代替。
SetScaleToFitSize可以用来实现一个“Zoom to fit”操作。使用SetScrollSizes来重新初始化滚动。
SetScaleToFitSize假设视图窗口已经被设置好了。如果在调用SetScaleToFitSize时视图窗口的尺寸还没有被设置，你将会得到一个断言。为了保证不出现这种情况，在调用SetScaleToFitSize之前要进行以下调用：
GetParentFrame()->RecalcLayout();

请参阅：
CScrollView::SetScrollSizes, CView::OnInitialUpdate


 CScrollView::SetScrollSizes

void SetScrollSizes(
int nMapMode,
SIZE sizeTotal,
const SIZE& sizePage = sizeDefault,
const SIZE& sizeLine = sizeDefault
);

参数：
nMapMode 要为这个视设置的映射模式。可能的取值包括：

Mapping Mode | Logical Unit | Positive y-axisExtends...
MM_TEXT | 1个像素 | 向下

Mapping Mode | Logical Unit | Positive y-axisExtends...
MM_HIMETRIC | 0.01毫米 | 向上
MM_TWIPS | 1/1440英寸 | 向上
MM_HIENGLISH | 0.001英寸 | 向上
MM_LOMETRIC | 0.1毫米 | 向上
MM_LOENGLISH | 0.01英寸 | 向上
所有的这些模式都是Windows定义的。两个标准的映射模式，MM_ISOTROPIC和MM_ANISOTROPIC，在CScrollView中没有使用。类库提供了SetScaleToFitSize成员函数来将视图的尺寸按比例变换为窗口的尺寸。

sizeTotal | 滚动视的总尺寸。cx成员包含了水平分量。cy成员包含了垂直分量。这些尺寸是以逻辑单位表示的。cx和cy都必须大于或等于0。
sizePage | 当鼠标在滚动条的条体上单击时，要在水平和垂直方向上滚动的量。cx中存放水平滚动量，cy成员中存放垂直滚动量。
sizeLine | 当响应鼠标单击滚动条的滚动箭头时要在水平或垂直方向上滚动的量。cx中存放水平滚动量，cy成员中存放垂直滚动量。

说明：
当视要被更新时，调用SetScrollSizes。在你的重载的OnUpdate成员函数中调用这个函数来调整滚动特性，例如，当文档第一次被显示或是被改变大小时。
通常，通过调用你的派生文档类的一个文档成员函数，可能是GetMyDocSize，你可以获得视的相关文档的尺寸信息。下面的代码给出了这种方法：
SetScrollSizes( nMapMode, GetDocument( )->GetMyDocSize( ) );
另外，你有时候也许需要设置一个固定的尺寸，就像下面的代码：
SetScrollSizes( nMapMode, CSize(100, 100) );
你必须将映射模式设置为除MM_ISOTROPIC或MM_ANISOTROPIC之外的任何Windows映射方式。如果你希望使用一种非限定的映射方式，可以调用SetScaleToFitSize成员函数来代替SetScrollSizes。

示例：
void CScaleView::OnUpdate( )
{
// ...
// Implement a GetDocSize( ) member function in
// your document class; it returns a CSize.
SetScrollSizes( MM_LOENGLISH, GetDocument( )->GetDocSize( ) );
ResizeParentToFit( ); // Default bShrinkOnly argument
// ...
}

请参阅：
CScrollView::SetScaleToFitSize, CScrollView::GetDeviceScrollSizes, CScrollView::GetTotalSize


 CSemaphore

CObject
└CSyncObject
└CSemaphore

一个CSemaphore类对象代表一个“信号”——一个同步对象，它允许有限数目的线程在一个或多个进程中访问同一个资源。一个CSemaphore对象保持了对当前访问某一指定资源的线程的计数。
对于一个只能支持有限数目用户的共享资源来说，CSemaphore是很有用的。
CSemaphore对象的当前计数是还可以允许的其它用户的数目。当这个计数达到零的时候，所有对这个由CSemaphore对象控制的资源的访问尝试都将被插入到一个系统队列中等待，直到它们的时间用完或计数值不再为零。这个被控制的资源可以同时接受访问的最大用户数目是在CSemaphore对象的构造期间被指定的。
要使用一个CSemaphore对象，则在需要的时候构造这个对象。指定你想要等待的信号的名字，应用程序应该在最初就拥有它。然后你就可以在构造函数返回时访问这个信号。当你要访问这个被控制的资源时，调用CSyncObject::Unlock。
使用CSemaphore对象的另一种方法是，将一个CSemaphore类型的变量添加到你想要控制的类中作为一个数据成员。在被控制对象的构造期间，调用CSemaphore数据成员的构造函数来指定访问计数的初始值，访问计数的最大值，信号的名字（如果它要在整个进程中使用），以及需要的安全标志。
要访问由CSemaphore对象用这种方式控制的资源，首先要在你的资源的访问成员函数中创建一个CSingleLock类型或CMultiLock类型的变量。然后调用加锁对象的Lock成员函数（例如，CSingleLock::Lock）。这时，你的线程将达到对资源的访问，等待资源被释放并访问它，或者是在等待资源被释放的过程中超过了时间，对资源的访问失败。不管是哪一种情况，你的资源都是以一种线程安全（thread-safe）方式被访问的。要释放资源，可以使用加锁对象的Unlock成员函数（例如，CSingleLock::Unlock），或者是让加锁对象超越范围。
另外，你可以单独创建一个CSemaphore对象，并且在尝试访问被控制的资源之前显式地访问CSemaphore对象。这种方法虽然对阅读你的源代码的人来说更加清楚，但是却更易于出错。
#include <afxmt.h>

CSemaphore类成员

操作
CSemaphore 构造一个CSemaphore对象


 CSemaphore::CSemaphore

CSemaphore( LONG lInitialCount = 1,
LONG lMaxCount = 1,
LPCTSTR pstrName= NULL,
LPSECURITY_ATTRIBUTES lpsaAttributes = NULL
);

参数：
lInitialCount | 信号的初始使用计数。必须是大于或等于0，并且小于或等于lMaxCount。
lMaxCount | 信号的使用计数的最大值。必须大于0。
pstrName | 信号的名字。如果此信号将在整个进程中被访问，则必须提供这个名字。如果是NULL，则对象将是没有名字的。如果这个名字与一个已经存在的信号的名字一样，则构造函数创建一个新的CSemaphore对象，此对象引用具有这个名字的对象。如果这个名字与一个已经存在的但不是一个信号的同步对象的名字一样，则构造函数会失败。
lpsaAttributes | 此信号对象的安全标志。有关这个结构的详细描述，参见“Win32 SDK程序员参考”中的SECURITY_ATTRIBUTES。

说明：
此成员函数用来构造一个有名字或没有名字的CSemaphore对象。要访问或释放一个CSemaphore对象，可以创建一个CMultiLock或CSingleLock对象，并调用它们的Lock和Unlock函数。

请参阅：CMutex, CEvent, CMultiLock, CSingleLock


 CSharedFile

CObject
└CFile
└CMemFile
└CSharedFile

CSharedFile是CMemFile派生类，它支持共享的内存文件。内存文件的行为类似于磁盘文件，但是文件是保存在RAM中而不是磁盘上。在快速暂存或传输未加工字节时，或在独立进程之间使对象串行化时，一个内存文件是很有用的。
共享内存文件与其它的内存文件不同，共享内存文件的内存是由GlobalAllocWindows函数分配的。CSharedFile类将数据保存在一个全局分配的内存块（用GlobalAlloc创建）中，并且这个内存块可以使用DDE，剪贴板，或其它OLE/COM统一数据传输操作（例如，使用IDataObject）来共享。
GlobalAlloc 返回一个HGLOBAL 句柄，而不是像malloc那样返回一个内存指针。在某些应用程序中需要HGLOBAL句柄。例如，要将数据放入剪贴板中，你就需要一个HGLOBAL句柄。
请注意，CSharedFile不使用内存映射文件，并且数据不能在进程之间共享。CSharedFile对象可以自动分配它们自己的内存，或是你可以通过调用CSharedFile:: SetHandle来将你自己的内存块连接到CSharedFile对象上。不管是哪一种情况，如果nGrowBytes不为零，则用于增长内存文件的内存被自动按nGrowBytes-sized增量分配。
更多的信息，参见“Microsoft Visual C++ 6.0参考库”中的“Microsoft Visual C++6.0运行库参考手册”卷中的“文件处理”。
#include <afxadv.h>
请参阅：CMemFile, GlobalAlloc, GlobalFree, GlobalRealloc

CSharedFile类成员

构造
CSharedFile 构造一个CSharedFile对象

操作
Detach | 关闭共享内存文件并返回它的内存块的句柄
SetHandle | 将共享内存文件与一个内存块连接


 CSharedFile::CSharedFile

CSharedFile( UINT nAllocFlags = GMEM_DDESHARE | GMEM_MOVEABLE, UINT nGrowBytes = 4096 );

参数
nAllocFlags | 表示内存是如何分配的标志。参见GlobalAlloc可以获得一个有效标志值的列表。
nGrowBytes | 用字节表示的内存分配增量。

说明：
此成员函数用来构造一个CSharedFile对象并为它分配内存。

请参阅：CSharedFile::Detach, CSharedFile::SetHandle


 CSharedFile::Detach

HGLOBAL Detach( );

返回值：返回包含此内存文件内容的内存块的句柄。

说明：
此成员函数用来关闭内存文件并使它与内存块分离。你可以通过使用Detach返回的句柄来调用SetHandle来重新打开它。

请参阅：CSharedFile::CSharedFile, CSharedFile::SetHandle


 CSharedFile::SetHandle

void SetHandle( HGLOBAL hGlobalMemory, BOOL bAllowGrow = TRUE );

参数：
hGlobalMemory | 与CSharedFile连接的全局内存的句柄。
bAllowGrow | 指示内存块是否被允许增长。

说明：
此成员函数用来将一个全局内存块连接到CSharedFile对象上。如果bAllowGrow是非零值，则内存块按需要增长，例如，如果要写入此内存文件的字节数大于分配的内存块，则可以增长内存块。

请参阅：CSharedFile::CSharedFile, CSharedFile::Detach


 CSingleDocTemplate

CObject
└CCmdTarget
└CDocTemplate
└CSingleDocTemplate

CSingleDocTemplate类定义了一个文档模板用于实现单文档界面（SDI）。一个SDI应用程序使用主框架窗口来显示一个文档；一次只能打开一个文档。
一个文档模板定义了类的三个类型之间的关系：
· | 一个从CDocument派生而来的文档类。
· | 一个视类，用来显示来自上面提到的文档类的数据。你可以从CView，CScrollView，CFormView，或CEditView派生这个类。（你也可以直接使用CEditView。）
· | 一个框架窗口类，用来包容视。对于一个SDI文档模板，你可以从CFrameWnd派生这个类；如果你不需要定制主框架窗口的行为，你可以直接使用CFrameWnd，而不派生你自己的类。
一个SDI应用程序通常支持一种类型的文档，因此它只有一个CSingleDocTemplate模板。一次只打开一个文档。
除了CSingleDocTemplate的构造函数，你不需要调用它的任何其它成员函数。框架在内部处理CSingleDocTemplate对象。

请参阅：
CDocTemplate, CDocument, CFrameWnd, CMultiDocTemplate, CView, CWinApp

CSingleDocTemplate类成员

构造
CSingleDocTemplate 构造一个CSingleDocTemplate对象


 CSingleDocTemplate::CSingleDocTemplate

CSingleDocTemplate(UINT nIDResource,
CRuntimeClass* pDocClass,
CRuntimeClass* pFrameClass,
CRuntimeClass* pViewClass
);

参数：
nIDResource | 指定文档类型使用的资源ID。它可能包括菜单，图标，加速键和字符串资源。 字符串资源最多可以包含七个子串，子串由‘\n’字符（如果有一个子串没有被包括，则需要‘\n’字符作为一个占位符；尾部的‘\n’字符不是必须的）；这些子串描述了文档的类型。有关子串的信息，参见CDocTemplate::GetDocString。这个字符串资源可以在应用程序的资源文件中找到。例如： // MYCALC.RC STRINGTABLE PRELOAD DISCARDABLE BEGIN IDR_MAINFRAME "MyCalc Windows Application\nSheet\nWorksheet\n Worksheets (*.myc)\n.myc\nMyCalcSheet\n MyCalc Worksheet" END 你可以使用字符串编辑器来编辑这个字符串；在字符串编辑器中整个字符串是作为一个单一的项显示的，而不是作为七个分离的项。 有关这些资源类型的更多信息，参见子串编辑器（在“Visual C++用户指南”中被描述）。
pDocClass | 指向一个文档类的CRuntimeClass对象。这个类是一个CDocument派生类，是你定义来代表你的文档的。
pFrameClass | 指向框架窗口类的CRuntimeClass对象。这个类可以是一个CFrameWnd派生类，或者如果你想要你的主框架窗口具有缺省的行为，它可以是一个CFrameWnd自身。
pViewClass | 指向一个视类的CRuntimeClass对象。这个类是一个CView派生类，是你定义来显示你的文档的。

说明：
此成员函数用来构造一个CSingleDocTemplate对象。动态分配一个CSingleDocTemplate对象，并将它从你的应用程序类的InitInstance成员函数传递给CWinApp::AddDocTemplate。

示例：
// example for CSingleDocTemplate::CSingleDocTemplate
BOOL CMyApp::InitInstance()
{
// ...
// 建立应用程序支持的文档类
AddDocTemplate( new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS( CSheetDoc ) ),
RUNTIME_CLASS( CFrameWnd ),
RUNTIME_CLASS( CSheetView )
);
// ...
}

请参阅：
CDocTemplate::GetDocString, CWinApp::AddDocTemplate, CWinApp::InitInstance, CRuntimeClass, RUNTIME_CLASS


 CSingleLock

CSingleLock没有基类。
一个CSingleLock类对象代表一种访问控制机制，这种机制用于控制在一个多线程程序中对一个资源的访问。为了使用同步类CSemaphore，CMutex，CCriticalSection，和CEvent。
你必须创建一个CSingleLock或CMultiLock对象来等待和释放这个同步对象。当你只需要每次等待一个对象时，可以使用CSingleLock。当在一个特别的时候你可以使用多个对象时，可以使用CMultiLock。
要使用一个CSingleLock对象，在被控制资源的类中的一个成员函数内部调用CSingleLock的构造函数。然后调用ISLock成员函数来确定这个资源是否可用。如果资源是可用的，则继续该成员函数的其余部分。如果资源不能使用，可以在一个指定的时间内等待资源被释放，或者是返回失败。在使用完资源后，如果CSingleLock对象要被再次使用，可以调用Unlock函数，或者销毁CSingleLock对象。
CSingleLock对象需要有一个从CSyncObject派生的对象存在。这通常是一个被控制资源的类的数据成员。
#include <afxmt.h>
请参阅：CMultiLock

CSingleLock类成员

构造
CSingleLock 构造一个CSingleLock对象

方法
IsLocked | 确定此对象是否被加锁
Lock | 等待一个同步对象
Unlock | 释放一个同步对象


 CSingleLock::CSingleLock

CSingleLock( CSyncObject* pObject, BOOL bInitialLock = FALSE );

参数：
pObject | 指向要被访问的同步对象。不能是NULL。
bInitialLock | 指示是否要在最初尝试访问所提供的对象。

说明：
此成员函数用来构造一个CSingleLock对象。通常是从被控制资源的一个访问成员函数中来调用这个函数。


 CSingleLock::IsLocked

BOOL IsLocked( );

返回值：如果对象被加锁则返回非零值；否则返回0。

说明：
此成员函数用来确定与CSingleLock对象相关的对象是否没有发信号（不能使用）。


 CSingleLock::Lock

BOOL Lock( DWORD dwTimeOut = INFINITE );

返回值：如果函数成功则返回非零值；否则返回0。

参数：
dwTimeOut 指定等待要被利用的同步对象的时间数量。如果是INFINITE，则Lock等待直到该对象在返回之前可用。

说明：
此成员函数用来获取对由同步对象控制的资源的访问，这个访问要提供给CSingleLock构造函数。如果同步对象是可用的，Lock将成功返回，而且线程拥有了该对象。如果此同步对象是不可用的，则Lock将等待此同步对象在dwTimeOut参数指定的时间内变为可用。如果此同步对象在指定的时间内没有变为可用的，则Lock返回失败。


 CSingleLock::Unlock

BOOL Unlock( );
BOOL Unlock( LONG lCount, LPLONG lPrevCount = NULL );

返回值：如果函数成功则返回非零值；否则返回0。

参数：
lCount | 要释放的访问数目。必须要大于0。如果指定的数量要导致对象的计数超过它的最大值，则计数不改变，并且函数返回FALSE。
lPrevCount | 指向一个用来接收同步对象的先前计数的变量。如果是NULL，则不返回先前的计数。

说明：
此成员函数用来释放由CSingleLock拥有的同步对象。由CSingleLock的析构函数类调用这个函数。
如果你需要释放一个信号的多于一个的访问计数，可以使用Unlock的第二种形式，并指定要释放的访问数目。


 CSize

CSize类与Windows中表示相对坐标或位置的的SIZE结构类似。
注意 这个类是从SIZE结构派生而来的。这意味着在需要一个SIZE参数的调用中你可以传递一个CSize，并且SIZE结构的数据成员也是CSize中可以访问的数据成员。
SIZE（和CSize）的cx和cy成员是公有成员。另外，CSize实现了用来处理SIZE结构的成员函数。
#include <afxwin.h>

请参阅：CRect, CPoint

CSize类成员

Construction
CSize 构造一个CSize对象

Operators
operator == | 检查CSize是否等于一个尺寸
operator != | 检查CSize是否不等于一个尺寸
operator += | 将CSize与一个尺寸相加
operator -= | 从CSize中减去一个尺寸

Operators Returning CSize Values
operator + | 将两个尺寸相加
operator - | 将两个尺寸相减


 CSize::CSize

CSize( );
CSize( int initCX, int initCY );
CSize( SIZE initSize );
CSize( POINT initPt );
CSize( DWORD dwSize );

参数：
initCX | 设置CSize的cx成员。
initCY | 设置CSize的cy成员。
initSize | 用来初始化CSize的SIZE结构或CSize对象。
initPt | 用来初始化CSize的POINT结构或CPoint对象。
dwSize | 用来初始化CSize的DWORD。双字中的低位字是cx成员，高位字是cy成员。

说明：此成员函数用来构造一个CSize对象。如果没有给出参数，则不初始化cx和cy成员。


 CSize::operator +

CSize operator +( SIZE size ) const;
CPoint operator +( POINT point ) const;
CRect operator +( const RECT* lpRect ) const;

说明：
这些操作符将此CSize值与参数值相加。参见下面有关每一个操作符的描述：
· | operator + (size) | 此操作将两个CSize值相加。
· | operator + (point) | 此操作将一个POINT（或CPoint）值偏移（移动）CSize值。此CSize值的cx和cy成员被增加到POINT值的x和y成员中。它与需要一个SIZE参数的CPoint::operator +版本是类似的。
· | operator + (lpRect) | 此操作将一个RECT（或CRect）值偏移（移动）CSize值。此CSize值的cx和cy成员被增加到RECT值的left，top，right，和bottom数据成员中。它与需要一个SIZE参数的CRect::operator +版本是类似的。

请参阅：CPoint::operator +, CRect::operator +


 CSize::operator -

CSize operator -( SIZE size ) const;
CPoint operator -( POINT point ) const;
CRect operator -( const RECT* lpRect ) const;
CSize operator -( ) const;

说明：
这些操作的前三个将此CSize值从参数值中减去。第四个操作是一个一元的负号，用来改变此CSize值的符号。参见下面对每一个操作的描述：
· | operator -(size) | 此操作将两个CSize值相减。
· | operator -(point) | 此操作将一个POINT（或CPoint）值偏移（移动）CSize值的负值。此CSize值的cx和cy成员被从POINT值的x和y成员中减去。它与需要一个SIZE参数的CPoint::operator -版本是类似的。
· | operator -(lpRect) | 此操作将一个RECT（或CRect）值偏移（移动）CSize值的负值。此CSize值的cx和cy成员被从RECT值的left，top，right和bottom数据成员中减去。它与需要一个SIZE参数的CRect::operator -版本是类似的。
· | operator -( ) | 此操作符返回CSize值的负值。

请参阅：CPoint::operator -, CRect::operator -


 CSize::operator +=

void operator +=( SIZE size );

说明：此操作符将CSize与一个尺寸相加。

请参阅：CSize::operator +


 CSize::operator -=

void operator -= ( SIZE size );

说明：此操作符从CSize中减去一个尺寸。

请参阅：CSize::operator -


 CSize::operator ==

BOOL operator ==( SIZE size ) const;

说明：
此操作符用来检查两个尺寸是否相等。如果相等则返回非零值，否则返回0。

请参阅：CSize::operator !=


 CSize::operator !=

BOOL operator !=( SIZE size ) const;

说明：
此操作符用来检查两个尺寸是否不相等。如果不相等则返回非零值，否则返回0。

请参阅：CSize::operator ==


 CSliderCtrl

CObject
└CCmdTarget
└CWnd
└CSliderCtrl

一个“滑动块控件”（也称为一个跟踪器）是一个包含一个滑动块和可选的刻度线的窗口。当用户用鼠标或方向键移动滑动块时，该控件发送通知消息来表明这些改变。
当你想要用户选择不连续的值或是某一范围内的连续值的集合时，滑动块控件是很有用的。例如，你可以让用户通过移动滑动块到一个给定的刻度线来设置键盘的重复速度。
CSliderCtrl类提供了Windows通用滑动块控件的功能。这个控件（也就是CSliderCtrl类）只对在Windows95和Windows NT 3.51或更高版本下运行的程序是可用的。
滑动块按你在创建它时指定的增量来移动。例如，如果你指定此滑动块的范围为五，则滑动块只能有六个位置：在滑动块控件最左边的一个位置和另外五个在此范围内每隔一个增量的位置。通常，这些位置的每一个由一个刻度线来标识。
通过使用CSliderCtrl的构造函数和Create成员函数来创建一个滑动块。一旦你已经创建了一个滑动块控件，你就可以使用CSliderCtrl中的成员函数来改变它的许多属性。这些你可以做的改变包括设置滑动块的最小和最大位置，绘制刻度线，设置一个选择范围，以及响应该滑动块。
#include <afxcmn.h>

CSliderCtrl类成员

Construction
CSliderCtrl | 构造一个CSliderCtrl对象
Create | 创建一个滑动块控件并将它与一个CSliderCtrl对象连接

Attributes
GetLineSize | 获取一个滑动块控件的行大小
SetLineSize | 设置一个滑动块控件的行大小
GetPageSize | 获取一个滑动块控件的页大小
SetPageSize | 设置一个滑动块控件的页大小
GetRangeMax | 获取一个滑动块的位置的最大值
GetRangeMin | 获取一个滑动块的位置的最小值
GetRange | 获取一个滑动块的位置的最大值和最小值
SetRangeMin | 设置一个滑动块的位置的最小值
SetRangeMax | 设置一个滑动块的位置的最大值
SetRange | 设置一个滑动块的位置的最小值和最大值
GetSelection | 获取当前选择的范围
SetSelection | 设置当前选择的范围
GetChannelRect | 获取滑动块控件的通道的尺寸
GetThumbRect | 获取滑动块控件的拇指的尺寸
GetPos | 获取滑动块的当前位置
SetPos | 设置滑动块的当前位置
GetNumTics | 获取一个滑动块控件中的刻度线的数目
GetTicArray | 获取一个滑动块控件的刻度线位置的数组
GetTic | 获取指定刻度线的位置
GetTicPos | 获取指定刻度线的以客户坐标表示的位置
SetTic | 设置指定刻度线的位置
SetTicFreq | 设置对每一个滑动块控件的增量，刻度线的频率
GetBuddy | 在一个指定位置获取一个滑动块控件的伙伴窗口句柄
SetBuddy | 为一个滑动块控件分配一个伙伴窗口
GetToolTips | 获取分配给一个滑动块控件的工具提示（如果有）句柄
SetToolTips | 将一个工具提示赋给一个滑动块控件
SetTipSide | 定位跟踪器控件使用的工具提示

Operations
ClearSel | 清除在一个滑动块控件中的当前位置
VerifyPos | 检验滑动块控件的位置是否在最小值和最大值之间
ClearTics | 将当前刻度线从滑动块控件中移走


 CSliderCtrl::ClearSel

void ClearSel( BOOL bRedraw = FALSE );

参数：
bRedraw 重画标志。如果这个参数是TRUE，则在选择被清除后重画滑动块；否则不重画滑动块。

说明：此成员函数用来清除滑动块中的当前位置。

请参阅：
CSliderCtrl::GetSelection, CSliderCtrl::SetSelection


 CSliderCtrl::ClearTics

void ClearTics( BOOL bRedraw = FALSE );

参数：
bRedraw 重画标志。如果这个参数是TRUE，则在选择被清除后重画滑动块；否则不重画滑动块。

说明：
此成员函数用来从一个滑动块控件中删除当前的刻度线。

请参阅：
CSliderCtrl::GetTicArray, CSliderCtrl::GetTic, CSliderCtrl::GetNumTics


 CSliderCtrl::Create

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

返回值：如果初始化成功则返回非零值；否则返回0。

参数：
dwStyle | 指定滑动块控件的风格。滑动块控件风格的任意组合都适用于这个控件。
rect | 指定滑动块控件的大小和位置。它可以是一个CRect对象或一个RECT结构。
pParentWnd | 指定此滑动块控件的父窗口，通常是一个CDialog。它必须不是NULL。
nID | 指定此滑动块控件的ID。

说明：
构造一个CSliderCtrl控件可以分两步。首先是调用构造函数，然后调用Create，该函数创建滑动块控件并将它与此CSliderCtrl对象连接。
滑动块控件可以是垂直或水平方向的。它们可以在任何一边或两边具有刻度线，或者是两边都没有。它们也可以用来指定某个范围的连续值。这些属性通过使用滑动块风格来控件，这些风格是在你创建此滑动块控件的时候指定的：
· | TBS_HORZ | 滑动块为水平方向。这个方向是缺省方向。
· | TBS_VERT | 滑动块为垂直方向。如果你没有指定方向，滑动块被认为是水平方向。
· | TBS_AUTOTICKS | 创建的滑动块在其取值范围内对每一个增量都有一个刻度线。当应用程序调用SetRange成员函数时这些刻度线被自动添加。如果你使用了这个风格，你就不能再使用SetTic和SetTicFreq成员函数来指定刻度线的位置。可以使用ClearTics成员函数来代替。
· | TBS_NOTICKS | 创建一个不显示刻度线的滑动块控件。
· | TBS_BOTTOM | 在一个水平滑动块的底部显示刻度线。可以与TBS_TOP一起使用，表示在滑动块的两边都显示刻度线。
· | TBS_TOP | 在一个水平滑动块的顶部显示刻度线。可以与TBS_BOTTOM一起使用，表示在滑动块的两边都显示刻度线。
· | TBS_RIGHT | 在一个垂直滑动块的右边显示刻度线。可以与TBS_LEFT一起使用，表示在滑动块的两边都显示刻度线。
· | TBS_LEFT | 在一个垂直滑动块的左边显示刻度线。可以与TBS_RIGHT一起使用，表示在滑动块的两边都显示刻度线。
· | TBS_BOTH | 在任意方向的滑动块的两边都显示刻度线。
· | TBS_ENABLESELRANGE | 显示一个选择范围。当一个滑动块控件使用了这个风格时，在选择范围的开始和结束位置的刻度线被显示为三角形（而不是垂直的破折号），而且选择范围被用高亮色显示。例如，在一个简单的日程安排应用程序中，选择范围也许是很有用的。用户可以对应于一天的小时选择一个刻度线范围来标识一个预定的会议时间。

请参阅：CSliderCtrl::CSliderCtrl


 CSliderCtrl::CSliderCtrl

CSliderCtrl( );

说明：此成员函数用来构造一个CSliderCtrl对象。

请参阅：CSliderCtrl::Create


 CSliderCtrl::GetBuddy

CWnd* GetBuddy( BOOL fLocation = TRUE ) const;

返回值：
返回一个指向CWnd对象的指针，该对象是在由fLocation指定的位置的一个伙伴窗口。如果在那个位置不存在伙伴窗口，则返回NULL。

参数：
fLocation这个值是用来指示在相关位置上将获取哪一个伙伴窗口的句柄。它可以是下列值之一：
· | TRUE | 获取在滑动块左边的伙伴窗口的句柄。如果该滑动块控件使用了TBS_VERT风格，则将获取滑动块上面的伙伴窗口。
· | FALSE | 获取在滑动块右边的伙伴窗口的句柄。如果该滑动块控件使用了TBS_VERT风格，则将获取滑动块下面的伙伴窗口。

说明：
此成员函数用来实现Win32消息TBM_GETBUDDY的行为，就象在“Platform SDK”中所描述的一样。
有关滑动块控件风格的描述，参见“Platform SDK”中的“跟踪器控件风格”。

请参阅：CSliderCtrl::SetBuddy


 CSliderCtrl::GetChannelRect

void GetChannelRect( LPRECT lprc ) const;

参数：
lprc 一个指向CRect对象的指针，该对象包含了当函数返回时通道的边界矩形。

说明：
此成员函数用来获取一个滑动块控件的通道的边界矩形的大小和位置。通道是这样一个区域，滑动块在它上面移动，并且当选择了一个范围后，它用高亮色显示。

请参阅：CSliderCtrl::GetThumbRect


 CSliderCtrl::GetLineSize

int GetLineSize( ) const;

返回值：返回此滑动块控件的一行的大小。

说明：
此成员函数用来获取一个滑动块控件的行的大小。这个行的大小表明对于TB_LINEUP和TB_LINEDOWN通知，滑动块移动多少。行的大小的缺省设置是1。

请参阅：CSliderCtrl::SetLineSize, CSliderCtrl::GetPageSize


 CSliderCtrl::GetNumTics

UINT GetNumTics( ) const;

返回值：返回在滑动块中的刻度线的数目。

说明：此成员函数用来获取一个滑动块中的刻度线。

请参阅：
CSliderCtrl::GetTicArray, CSliderCtrl::GetTic, CSliderCtrl::GetTicPos, CSliderCtrl::SetTicFreq, CSliderCtrl::ClearTics


 CSliderCtrl::GetPageSize

int GetPageSize( ) const;

返回值：返回此滑动块控件的一页的大小。

说明：
此成员函数用来获取一个滑动块控件中的一页的大小。页的大小表明在响应TB_PAGEUP和TB_PAGEDOWN通知时滑动块会移动多少。

请参阅：
CSliderCtrl::GetLineSize, CSliderCtrl::SetPageSize


 CSliderCtrl::GetPos

int GetPos( ) const;

返回值：返回当前的位置。

说明：
此成员函数用来获取一个滑动块控件中的滑动块的当前位置。

请参阅：
CSliderCtrl::SetPos, CSliderCtrl::GetTicPos


 CSliderCtrl::GetRange

void GetRange( int& nMin, int& nMax ) const;

参数：
nMin | 一个用来接收最小位置的整数的引用。
nMax | 一个用来接收最大位置的整数的引用。

说明：
此成员函数用来获取在一个滑动块控件中的滑动块的最大和最小位置。这个函数将值拷贝到由nMin和nMax引用的整数中。

请参阅：
CSliderCtrl::GetRangeMin, CSliderCtrl::GetRangeMax, CSliderCtrl::SetRange


 CSliderCtrl::GetRangeMax

int GetRangeMax( ) const;

返回值：返回控件的最大值。

说明：
此成员函数用来获取一个滑动块控件中的滑动块的最大位置。

请参阅：
CSliderCtrl::GetRangeMin, CSliderCtrl::GetRange, CSliderCtrl::SetRange


 CSliderCtrl::GetRangeMin

int GetRangeMin( ) const;

返回值：返回控件的最小位置。

说明：
此成员函数用来获取一个滑动块控件中的滑动块的最小位置。

请参阅：
CSliderCtrl::GetRange, CSliderCtrl::GetRangeMax, CSliderCtrl::SetRange


 CSliderCtrl::GetSelection

void GetSelection( int& nMin, int& nMax ) const;

参数：
nMin | 一个用来接收当前选择的开始位置的整数的引用。
nMax | 一个用来接收当前选择的结束位置的整数的引用。

说明：
此成员函数用来获取一个滑动块控件中的当前选择的开始和结束位置。

请参阅：
CSliderCtrl::SetSelection, CSliderCtrl::ClearSel


 CSliderCtrl::GetThumbRect

void GetThumbRect( LPRECT lprc ) const;

参数：
lprc 一个指向CRect对象的指针，该对象包含了当函数返回时此滑动块的边界矩形。

说明：
此成员函数用来获取一个滑动块控件中的滑动块（拇指）的边界矩形的大小和位置。

请参阅：CSliderCtrl::GetChannelRect


 CSliderCtrl::GetTic

int GetTic( int nTic ) const;

返回值：
返回指定刻度线的位置。如果nTic没有指定一个有效索引，则返回-1。

参数：
nTic 一个刻度线的从零开始的索引。

说明：
此成员函数用来获取一个滑动块控件中的刻度线的位置。

请参阅：
CSliderCtrl::SetTic, CSliderCtrl::GetTicArray, CSliderCtrl::GetTicPos, CSliderCtrl::SetTicFreq, CSliderCtrl::ClearTics


 CSliderCtrl::GetTicArray

DWORD* GetTicArray( ) const;

返回值：
返回包含此滑动块控件的刻度线位置的数组的地址。

说明：
此成员函数用来获取包含一个滑动块控件的刻度线的数组的地址。

请参阅：
CSliderCtrl::SetTic, CSliderCtrl::GetTic, CSliderCtrl::GetTicPos, CSliderCtrl::SetTicFreq, CSliderCtrl::ClearTics


 CSliderCtrl::GetTicPos

int GetTicPos( int nTic ) const;

返回值：
返回指定刻度线的用客户坐标表示的物理位置。如果nTic没有指定一个有效的索引则返回-1。

参数：
nTic 一个刻度线的从零开始的索引。

说明：
此成员函数用来获取一个滑动块控件中的一个刻度线的当前物理位置。

请参阅：
CSliderCtrl::SetTic, CSliderCtrl::GetTic, CSliderCtrl::SetTicFreq, CSliderCtrl::ClearTics


 CSliderCtrl::GetToolTips

CToolTipCtrl* GetToolTips( ) const;

返回值：
返回一个指向CToolTipCtrl对象的指针。如果没有使用工具提示则返回NULL。如果此滑动块控件没有使用TBS_TOOLTIPS风格，则返回值是NULL。

说明：
此成员函数用来实现Win32消息TBM_GETTOOLTIPS的行为，就象在“Platform SDK”中描述的那样。
注意这个成员函数返回一个CToolTipCtrl对象。而不是一个控件句柄。
有关滑动块控件风格的描述，参见“Platform SDK”中的“跟踪器风格”。

请参阅：CSliderCtrl::SetToolTips


 CSliderCtrl::SetBuddy

CWnd* SetBuddy ( CWnd* pWndBuddy, BOOL fLocation = TRUE );

返回值：
返回一个指向CWnd对象的指针，该对象是先前在那个位置上分配给此滑动块控件的。

参数：
pWndBuddy 一个指向CWnd对象的指针，该对象将被设置为滑动块控件的伙伴。
fLocation是用来指定显示伙伴窗口的位置的值。这个值可以是下列值之一：
· | TRUE | 如果滑动块控件使用TBS_HORZ风格，则伙伴将显示在滑动块的左边。如果滑动块控件使用TBS_VERT风格，伙伴就出现在滑动块控件的上方。
· | FALSE | 如果滑动块控件使用TBS_HORZ风格，则伙伴就出现在滑动块的右边。如果滑动块控件使用TBS_VERT风格，伙伴就出现在滑动块控件的下方。

说明：
此成员函数用来实现Win32消息TBM_SETBUDDY的行为，就象在“Platform SDK”中描述的那样。
注意，这个成员函数在它的返回值和参数中都使用了指向CWnd对象的指针，而不是窗口句柄。
有关滑动块控件风格的描述，参见“Platform SDK”中的“跟踪器风格”。

请参阅：CSliderCtrl::GetBuddy


 CSliderCtrl::SetLineSize

int SetLineSize( int nSize );

返回值：返回先前的行大小。

参数：
nSize 滑动块控件的新的行大小。

说明：
此成员函数用来设置一个滑动块控件的行的大小。这个行大小表示在响应TB_LINEUP和TV_LINEDOWN通知时，滑动块移动多少。

请参阅：
CSliderCtrl::GetLineSize, CSliderCtrl::SetPageSize


 CSliderCtrl::SetPageSize

int SetPageSize( int nSize );

返回值：返回先前的页大小。

参数：
nSize 滑动块控件的新的页大小。

说明：
此成员函数用来设置一个滑动块控件的页的大小。这个页大小表示在响应TB_PAGEUP和TB_PAGEDOWN通知时，滑动块移动多少。

请参阅：
CSliderCtrl::GetPageSize, CSliderCtrl::GetLineSize


 CSliderCtrl::SetPos

void SetPos( int nPos );

参数：
nPos 指定新的滑动块位置。

说明：
此成员函数用来设置一个滑动块控件中的滑动块的当前位置。

请参阅：
CSliderCtrl::GetPos, CSliderCtrl::SetTic, CSliderCtrl::VerifyPos


 CSliderCtrl::SetRange

void SetRange( int nMin, int nMax, BOOL bRedraw = FALSE );

参数：
nMin | 滑动块的最小位置。
nMax | 滑动块的最大位置。
bRedraw | 重画标志。如果这个参数是TRUE，则在范围被重新设置之后滑动块被重画；否则不重画滑动块。

说明：
此成员函数用来设置一个滑动块控件的滑动块的范围（位置的最小值和最大值）。

请参阅：
CSliderCtrl::GetRange, CSliderCtrl::SetRangeMax, CSliderCtrl::SetRangeMin


 CSliderCtrl::SetRangeMax

void SetRangeMax( int nMax, BOOL bRedraw = FALSE );

参数：
nMax | 滑动块的最大位置。
bRedraw | 重画标志。如果这个参数是TRUE，则在范围被设置之后，重画滑动块；否则不重画滑动块。

说明：
此成员函数用来设置一个滑动块控件中的滑动块的最大位置。

请参阅：
CSliderCtrl::SetRange, CSliderCtrl::GetRangeMax, CSliderCtrl::SetRangeMin


 CSliderCtrl::SetRangeMin

void SetRangeMin( int nMin, BOOL bRedraw = FALSE );

参数：
nMin | 滑动块的最小位置。
bRedraw | 重画标志。如果这个参数是TRUE，则在范围被设置之后，重画滑动块；否则不重画滑动块。

说明：
此成员函数用来设置一个滑动块控件中的滑动块的最大位置。

请参阅：
CSliderCtrl::SetRange, CSliderCtrl::GetRangeMin, CSliderCtrl::SetRangeMax


 CSliderCtrl::SetSelection

void SetSelection( int nMin, int nMax );

参数：
nMin | 滑动块的开始位置。
nMax | 滑动块的结束位置。

说明：
此成员函数用来设置一个滑动块控件中当前选择的开始和结束位置。

请参阅：
CSliderCtrl::GetSelection, CSliderCtrl::ClearSel


 CSliderCtrl::SetTic

BOOL SetTic( int nTic );

返回值：如果设置了刻度线则返回非零值；否则返回0。

参数：
nTic 刻度线的位置。这个参数必须指定一个正值。

说明：
此成员函数用来设置一个滑动块控件中的一个刻度线的位置。

请参阅：
CSliderCtrl::GetTic, CSliderCtrl::GetTicArray, CSliderCtrl::GetTicPos, CSliderCtrl::SetTicFreq, CSliderCtrl::ClearTics


 CSliderCtrl::SetTicFreq

void SetTicFreq( int nFreq );

参数：
nFreq 刻度线的频率。

说明：
此成员函数用来设置显示在一个滑动块中的刻度线的的频率。例如，如果频率被设置为2，则在滑动块的范围中每两个增量显示一个刻度线。缺省的频率设置是1（即，范围中每一个增量都有一个与之对应的刻度线）。
要使用这个函数，你必须创建具有TBS_AUTOTICKS风格的控件。更多的信息，参见CSliderCtrl::Create。

请参阅：
CSliderCtrl::Create, CSliderCtrl::SetTic, CSliderCtrl::GetTicArray


 CSliderCtrl::SetTipSide

int SetTipSide ( int nLocation );

返回值：
返回一个代表工具提示控件的先前位置的值。这个返回值等于nLocation的可能取值之一。

参数：
nLocation 是代表要显示工具提示控件的位置的值。其可能取值的列表，参见“Platform SDK”中所描述的Win32消息TBM_SETTIPSIDE。

说明：
此成员函数用来实现“Platform SDK”中所描述的Win32消息TBM_SETTIPSIDE的行为。
滑动块控件使用TBS_TOOLTIPS风格来显示工具提示。有关滑动块控件风格的描述，参见“Platform SDK”中的“跟踪器控件风格”。


 CSliderCtrl::SetToolTips

void SetToolTips( CToolTipCtrl* pWndTip );

参数：
pWndTip 是一个指向CToolTipCtrl对象的指针，该对象包含了这个滑动块控件的工具提示。

说明：
此成员函数用来实现“Platform SDK”中所描述的Win32消息TBM_SETOOLTIPS的行为。
当创建了一个具有TBS_TOOLTIPS风格的滑动块控件时，它就创建一个缺省的显示在滑动块的旁边的工具提示控件，它显示滑动块的当前位置。有关滑动块控件风格的描述，参见“Platform SDK”中的“跟踪器控件风格”。

请参阅：CSliderCtrl::GetToolTips


 CSliderCtrl::VerifyPos

void VerifyPos( );

说明：
此成员函数用来检验一个滑动块控件中的滑动块的当前位置是否在最小和最大值之间。

请参阅：CSliderCtrl::GetRange, CSliderCtrl::SetPos, CSliderCtrl::GetTicPos


 CSocket

CObject
└CAsynSocket
└CSocket

CSocket类是从CAsyncsocket派生而来的，它继承了CAsyncsocket对WindowsSockets API的封装。与CAsyncsocket对象相比，CSocket对象代表了WindowsSockets API的更高一级的抽象化。CSocket与类CSocketFile和CArchive一起来管理对数据的发送和接收。
一个CSocket对象也支持阻塞，这对于CArchive的同步操作来说是必要的。块操作函数，比如Receive，Send，ReceiveFrom，SendTo，和Accept（都是从CAsyncsocket继承来的），都不返回一个CSocket对象中的WSAEWOULDBLOCK错误。取而代之，这些函数等待，直到操作完成。另外，当这些函数中的某一个是阻塞的时，如果调用了CancelBlockingCall，则原来的调用将因为WSAEINTR错误而终止。
要使用一个CSocket对象，调用构造函数，然后调用Create来创建基础 插槽句柄（插槽类型）。Create的缺省参数创建一个插槽，但是如果你不是用一个CArchive对象来使用这个插槽，则你可以指定一个参数来创建一个数据包 插槽来代替，或者是结合一个指定的端口来创建一个服务器插槽。在客户方使用Connect，则服务器方使用Accept来与一个客户插槽连接。然后再创建一个CSocketFile对象，并在CSocketFile的构造函数中将它连接到CSocket对象上。再接着，创建一个CArchive对象用来发送数据，一个用来接收数据（如果需要），然后在CArchive构造函数中将它们与CSocketFile对象连接。当通讯完成后，销毁CArchive，CSocketFile，CSocket对象。
更多的信息，参见Win32 SDK文档中的“Windows 插槽 2 概述”和“Windows插槽设计思考”。
#include <afxsock.h>
请参阅：CAsyncsocket, CSocketFile

CSocket类成员

构造
CSocket | 构造一个CSocket对象
Create | 创建一个插槽

属性
IsBlocking | 确定一个阻塞调用是否在进行中
FromHandle | 返回一个指向CSocket对象的指针，给出一个插槽句柄
Attach | 将一个插槽句柄与一个CSocket对象连接

操作符
CancelBlockingCall 取消一个当前在进行中的阻塞调用

可重载
OnMessagePending 当等待完成一个阻塞调用时调用此函数来处理悬而未决的消息


 CSocket::Attach

BOOL Attach( SOCKET hsocket );

返回值：如果函数成功则返回非零值。

参数：
hsocket 包含一个插槽句柄。

说明：
此成员函数用来将一个hsocket句柄与一个CSocket对象连接。这个插槽句柄被保存在对象的m_socket数据成员中。
更多的信息，参见Win32 SDK文档中的“Windows Sockets设计思考”。

请参阅：CAsyncSocket::Attach


 CSocket::CancelBlockingCall

void CancelBlockingCall( );

说明：
此成员函数用来取消一个当前在进行中的阻塞调用。这个函数取消该插槽的任何未完的阻塞操作。原来的阻塞调用一有可能就终止，并给出WSAEINTR错误。
在一次阻塞的Connect操作中，Windows 插槽实现一有可能就终止这个阻塞的调用，但是这对于释放socket资源来说是不可能的，要直到连接完成（然后被重置）或时间到时，资源才被释放。只有在应用程序立即尝试打开一个新的插槽（如果没有插槽可利用），或连接到相同的同级者时，这一点才是需要注意的。
除了Accept，取消任何操作都会使该插槽处于一种不确定的状态。如果一个应用程序取消了在一个插槽上的阻塞操作，则应用程序要能够在该插槽上显示，唯一能依赖的操作就是调用Closet，虽然其它的操作可能会对某些Windows 插槽起作用。如果你希望你的应用程序具有最大的可移植性，则你必须小心不要在一次取消后依赖于执行某些操作。
更多的信息，参见Win32 SDK文档中的“Windows Sockets设计思考”。

请参阅：
CAsyncSocket::Accept, CAsyncSocket::Close, CAsyncSocket::Connect, CSocket::IsBlocking, ::WSASetBlockingHook


 CSocket::Create

BOOL Create( UINT nSocketPort = 0, int nSocketType = SOCK_STREAM, LPCTSTR lpszSocketAddress = NULL );

返回值：
如果函数成功则返回非零值；否则返回0，并通过调用GetLastError可以获得特定的错误代码。

参数：
nSocketPort | 一个要被此插槽使用的特别的端口，如果你希望MFC来选择一个端口，则这个值是0。
nSocketType | 是SOCK_STREAM或SOCK_DGRAM。
lpszSocketAddress | 一个指向字符串的指针，该字符串包含了被连接插槽的网络地址。一个带点的数字，如“128.56.22.8”。

说明：
在构造一个插槽对象之后，调用Create成员函数来创建Windows 插槽并连接它。然后Create调用Bind来将此插槽与指定的地址结合。下面就是所支持的插槽类型：
· | SOCK_STREAM | 提供连续的，可靠的，两种方法（two-way）的，基于连接的字节流。使用Internet地址家族的传输控制协议（TCP）。
· | SOCK_DGRAM | 支持无连接的数据包，它有具有固定（通常较小）最大长度的不可靠的缓冲。使用Internet地址家族的User Datagram Protocol（UDP）。要使用这个选项，你必须不用一个CArchive对象来使用插槽。
注意：
Accept成员函数将一个新的，空的CSocket对象的引用作为它的参数。你必须在调用Accept之前构造这个对象。记住，如果这个插槽对象超出了范围，则连接关闭。不要对这个新的sock对象调用Create函数。
有关流和数据包 插槽的更多信息，参见Win32 SDK文档中的“Windows Sockets设计思考”。

请参阅：CAsyncSocket::Create, CAsyncSocket::Bind


 CSocket::CSocket

CSocket( );

说明：
此成员函数用来构造一个CSocket对象。在构造之后，你必须调用Create成员函数。
更多的信息，参见Win32 SDK文档中的“Windows Sockets设计思考”。

请参阅：CAsyncSocket::Create


 CSocket::FromHandle

static CSocket* PASCAL FromHandle( SOCKET hSocket );

返回值：
返回一个指向CSocket对象的指针。如果没有与hSocket连接的CSocket对象，则返回NULL。

参数：
hSocket 包含一个插槽句柄。

说明：
此成员函数返回一个指向CSocket对象的指针。当给予一个插槽句柄，如果没有一个CSocket对象连接到这个句柄，则此成员函数返回NULL，并且不会创建一个临时对象。
更多的信息，参见Win32 SDK文档中的“Windows Sockets设计思考”。

请参阅：CAsyncSocket::FromHandle


 CSocket::IsBlocking

BOOL IsBlocking( );

返回值：
如果该插槽是阻塞的，则返回非零值。否则返回0。

说明：
此成员函数用来确定一个阻塞的调用是否正在进行中。
更多的信息，参见Win32 SDK文档中的“Windows Sockets设计思考”。

请参阅：CSocket::CancelBlockingCall


 CSocket::OnMessagePending

virtual BOOL OnMessagePending( );

返回值：
如果消息被处理了则返回非零值；否则返回0。

说明：
重载这个函数来查找来自Windows的特别消息，并在你的插槽中对它们作出响应。这是一个高级的可重载函数。
当插槽在转发Windows消息时，框架调用OnMessagePending来给你一个机会去处理你的应用程序感兴趣的消息。
更多的信息，参见Win32 SDK文档中的“Windows Sockets设计思考”。

请参阅：
CSocket::CancelBlockingCall, CSocket::IsBlocking


 CSocketFile

CObject
└CFile
└CSocketFile

一个CSocketFile对象是一个用来通过Windows Sockets在网络中发送和接收数据的CFile对象。为了这个目的，你可以将CSocketFile对象与一个CSocket对象连接。你也可以——并且通常是这样做——将CSocketFile对象与一个CArchive对象连接，以使用MFC系列来简化发送和接收数据。
对于连续（发送）的数据，你可以把它们插入到档案中，该档案调用CSocketFile成员函数来把数据写到CSocket对象中。对于不连续（接收）的数据，你从档案中提取它们。这导致该档案调用CSocketFile成员函数来从CSocket对象中读取数据。
提示：
除了象这儿所描述的一样使用CSocketFile，你也可以将它作为一个标准文件对象，就象你使用它的基类CFile一样。你可以将CSocketFile与其它任何基于档案的MFC系列函数一起使用。因为CSocketFile并不支持CFile的所有性能，某些缺省的MFC串行化函数与CSocketFile是不兼容的。这一点对于CEditView类来说完全正确。你不要尝试使用CEditView::SerializeRaw并通过一个与CSocketFile对象连接的CArchive对象来串行化CEditView数据；而应当使用CEditView::Serialize。SerializeRaw函数希望文件对象具有一些CSocketFile所不拥有的函数，比如说Seek。
更多的信息，参见Win32 SDK文档中的“Windows Sockets 2概述”和“WindowsSockets设计思考”。
#include <afxsock.h>
请参阅：CAsyncsocket, CSocket

CSocketFile类成员

构造
CSocketFile 构造一个CSocketFile对象


 CSocketFile::CSocketFile

CSocketFile( CSocket* pSocket, BOOL bArchiveCompatible = TRUE );

参数：
pSocket | 连接到CSocketFile对象的插槽。
bArchiveCompatible | 指示该文件对象是否与一个CArchive对象一起使用。只有当你希望在单机方式下来使用这个CSocketFile对象时，才传递FALSE。这种方式就象单机的CFile对象，具有一定的限制。这个标志将改变与CSocketFile对象连接的CArchive对象管理读缓冲区的方式。

说明：
此成员函数用来构造一个CSocketFile对象。当此对象超出范围或被删除时，它的析构函数将使它自己从插槽对象上分离。
注意：一个CSocketFile对象也可以在没有CArchive对象的情况下作为一个（受限制）的文件来使用。缺省的，CSocketFile构造函数的bArchiveCompatible参数是TRUE。这表明此文件对象是与一个档案一起使用的。要在没有档案的情况下使用这个文件对象，给bArchiveCompatible参数传递FALSE。
在“档案兼容”模式下，一个CSocketFile对象可以提供更好的表现，并减少出现“死锁”的危险。当两个发送和接收插槽相互等待时，或是同时等待一个公用的资源时，就会发生死锁。如果与CSocketFile对象一起工作的CArchive对象按它与CFile对象一起工作的方式来工作时，这种情况就会发生。在与CFile一起工作时，档案可以假定如果它接收到的字节少于它所请求的，则文件已经到达文件结尾了。
但是，在使用CSocketFile工作时，数据是基于消息的；缓冲区可以保存多条消息，因此收到比所请求的要少的字节数并不表示到达了文件结尾。在这种情况下，应用程序不会象使用CFile时那样阻塞，它可以继续从缓冲区中读取数据，直到缓冲区为空。在这种情况下，CArchive::IsBufferEmpty用于监视档案的缓冲区的状态是很有用的。

请参阅：CFile::CFile, CFile::Read


 CSpinButtonCtrl

CObject
└CCmdTarget
└CWnd
└CSpinButtonCtrl

一个“旋转按钮控件”（也称为上下控件）是一对箭头按钮，用户点击它们来增加或减小一个值，比如一个滚动位置或显示在相应控件中的一个数字。与一个旋转按钮控件相联系的值被称为它的当前位置。一个旋转控件通常是与一个相伴的控件一起使用的，称为“伙伴窗口”。
CSpinButtonCtrl类提供了Windows通用旋转按钮控件的功能。这个控件（也就是CSpinButtonCtrl类）只对运行在Windows95和Windows NT3.51或更高版本下的程序来说是可用的。
对用户来说，一个旋转按钮控件和它的伙伴窗口看起来通常就象一个单一的控件。你可以指定一个旋转按钮控件自动将它自己定位在它的伙伴窗口的旁边，并且它自动将它的伙伴窗口的标题设置为它的当前位置。可以将一个旋转按钮控件与一个编辑控件一起使用，以提示用户进行数字输入。
点击向上箭头使当前位置向最大值方向移动，而点击向下箭头使当前位置向最小值的方向移动。缺省的，最小值是100，最大值是0。任何时候，最小值的设置都大于最大值（例如，当使用缺省值时），点击向上箭头减少位置值，而点击向下箭头则增加它。
一个没有伙伴窗口的旋转按钮控件就象简化了的滚动条。例如，一个tab控件有时显示一个旋转按钮控件来使它的用户能够滚动其它的tab进入视。
有关使用CSpinButtonCtrl的更多信息，参见“Visual C++程序员指南”中的“控件主题”和“使用CSpinButtonCtrl”。
#include <afxcmn.h>

请参阅：CSliderCtrl

CSpinButtonCtrl类成员

Construction
CSpinButtonCtrl | 构造一个CSpinButtonCtrl对象
Create | 创建一个旋转按钮控件并将它连接到一个CSpinButtonCtrl对象

Attributes
SetAccel | 为一个旋转按钮控件设置加速
GetAccel | 获取一个旋转按钮控件的加速信息
SetBase | 为一个旋转按钮控件设置基数
GetBase | 获取一个旋转按钮控件的当前基数
SetBuddy | 为一个旋转按钮控件设置伙伴窗口
GetBuddy | 获取指向当前伙伴窗口的指针
SetPos | 设置控件的当前位置
GetPos | 获取一个旋转按钮控件的当前位置
SetRange | 设置一个旋转按钮控件的上限和下限（范围）
GetRange | 获取一个旋转按钮控件的上限和下限（范围）
SetRange32 | 设置旋转按钮控件的32位范围
GetRange32 | 获取旋转按钮控件的32位范围


 CSpinButtonCtrl::Create

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

返回值：如果初始化成功则返回非零值；否则返回0。

参数：
dwStyle | 指定旋转按钮控件的风格。可以将旋转控件风格的任何组合应用到这个控件。
rect | 指定旋转按钮控件的大小和位置。它可以是一个CRect对象或一个RECT结构。
pPrentWnd | 一个指向旋转控件的父窗口的指针，该窗口通常是一个CDialog。它必须不是NULL。
nID | 指定旋转控件的ID。

说明：
构造一个CSpinButtonCtrl对象要分两步。首先调用构造函数，然后调用Create，该函数创建旋转按钮控件并将它与CSpinButtonCtrl对象连接。
可以指定下面的风格给旋转按钮控件：
· | UDS_HORZ | 控件的箭头指向左和右，而不是指向上和下。
· | UDS_WRAP | 如果控件的增加或减小超过了结尾或开始，使控件可以“环绕”。
· | UDS_ARROWKEYS | 当按下向上和向下键时，使控件可以增加或减小。
· | UDS_SETBUDDYINT | 当位置改变时，使控件设置伙伴窗口的文本（使用WM_SETTEXT消息）。文本是按十进制或十六进制格式化后的位置值。
· | UDS_NOTHOUSANDS | 不要在每隔三个十进制数字的地方加千分隔符。
· | UDS_AUTOBUDDY | 自动选择一个Z-order中的前一个窗口作为控件的伙伴窗口。
· | UDS_ALIGNRIGHT | 将旋转按钮窗口定位在伙伴窗口的右边。伙伴窗口的宽度被减小来适应此控件的宽度。
· | UDS_ALIGNLEFT | 将旋转按钮窗口定位在伙伴窗口的右边。伙伴窗口被移动到右边，并且它的宽度被减小来适应此控件的宽度。

请参阅：CSpinButtonCtrl::CSpinButtonCtrl


 CSpinButtonCtrl::CSpinButtonCtrl

CSpinButtonCtrl( );

说明：此成员函数用来构造一个CSpinButtonCtrl对象。

请参阅：CSpinButtonCtrl::Create


 CSpinButtonCtrl::GetAccel

UINT GetAccel( int nAccel, UDACCEL* pAccel ) const;

返回值：返回所获取的加速器结构的数目。

参数：
nAccel | 由pAccel指定的数组中的元素数目。
pAccel | 指向一个UDACCEL结构数组的指针，该数组用来接收加速信息。

说明：此成员函数用来获取一个旋转按钮控件的加速信息。

请参阅：CSpinButtonCtrl::SetAccel


 CSpinButtonCtrl::GetBase

UINT GetBase( ) const;

返回值：返回当前的基数值。

说明：此成员函数用来获取一个旋转按钮控件的当前基数值。

请参阅：CSpinButtonCtrl::SetBase


 CSpinButtonCtrl::GetBuddy

CWnd* GetBuddy( ) const;

返回值：返回一个指向当前伙伴窗口的指针。

说明：此成员函数用来获取一个指向当前伙伴窗口的指针。

请参阅：CSpinButtonCtrl::SetBuddy


 CSpinButtonCtrl::GetPos

int GetPos( ) const;

返回值：
返回值的低位字中是当前位置。如果发生了一个错误，则高位字是非零值。

说明：
此成员函数用来获取一个旋转按钮控件的当前位置。控件根据伙伴窗口的标题来更新它的当前位置，获得要返回的值。如果没有伙伴窗口或者如果标题指示的是一个无效或超出范围的值，则返回一个错误信息。

请参阅：CSpinButtonCtrl::SetPos


 CSpinButtonCtrl::GetRange

DWORD GetRange( ) const;
void GetRange( int &lower, int& upper ) const;
void GetRange32( int &lower, int& upper ) const;

返回值：
第一个版本返回一个32位的值，包含了上限和下限值。低位字是控件的上限，高位字是控件的下限。

参数：
lower | 对一个用来接收控件的下限的整数的引用。
upper | 对一个用来接收控件的上限的整数的引用。

说明：
此成员函数用来获取一个旋转按钮控件的上限和下限（范围）。
成员函数GetRange32获取此旋转按钮控件的用一个32位的整数表示的范围。

请参阅：CSpinButtonCtrl::SetRange


 CSpinButtonCtrl::SetAccel

BOOL SetAccel( int nAccel, UDACCEL* pAccel );

返回值：如果成功则返回非零值；否则返回0。

参数：
nAccel | 由pAccel指定的UDACCEL结构的数目。
pAccel | 指向一个UDACCEL结构数组的指针，该数组包含了加速信息。元素根据nSec成员按升序保存。

说明：此成员函数用来设置一个旋转按钮控件的加速。

请参阅：CSpinButtonCtrl::GetAccel


 CSpinButtonCtrl::SetBase

int SetBase( int nBase );

返回值：
如果成功则返回先前的基数值，如果给出的是一个无效的基数则返回一个非零值。

参数：
nBase 控件的新的基数。

说明：
此成员函数用来设置一个旋转按钮控件的基数。这个基数值决定了伙伴窗口显示的数字是十进制的还是十六进制的。十六进制的数总是无符号的；十进制的数是有符号的。

请参阅：CSpinButtonCtrl::GetBase


 CSpinButtonCtrl::SetBuddy

CWnd* SetBuddy( CWnd* pWndBuddy );

返回值：一个指向先前的伙伴窗口的指针。

参数：
pWndBuddy 指向新的伙伴窗口的指针。

说明：此成员函数用来为一个旋转控件设置伙伴窗口。

请参阅：CSpinButtonCtrl::GetBuddy


 CSpinButtonCtrl::SetPos

int SetPos( int nPos );

返回值：返回原来的位置。

参数：
nPos 控件的新位置。这个值必须在控件的上限和下限指定的范围之内。

说明：此成员函数用来设置一个旋转按钮控件的当前位置。

请参阅：
CSpinButtonCtrl::SetRange, CSpinButtonCtrl::GetPos


 CSpinButtonCtrl::SetRange

void SetRange( int nLower, int nUpper );
void SetRange32( int nLower, int nUpper );

参数：
nLower and nUpper
控件的上限和下限。任何一个界限值都不能大于UD_MAXVAL或小于UD_ MINVAL。另外，两个界限值之间的差值必须不超过UD_MAXVAL。

说明：
此成员函数用来设置一个旋转按钮控件的上限和下限（范围）。
成员函数SetRange32为此旋转按钮控件设置32位的范围。
注意：旋转按钮控件的缺省范围将最大值设置为零（0），而最小值设置为100。由于最大值小于最小值，所以点击向上箭头将减小位置值，而点击向下箭头则增加位置值。使用CSpinButtonCtrl::SetRange来调整这些值。

请参阅：
CSpinButtonCtrl::GetRange, CSpinButtonCtrl::GetPos, CSpinButtonCtrl


 CSplitterWnd

CObject
└CCmdTarget
└CWnd
└CSplitterWnd

CSplitterWnd类提供一个分隔器窗口的功能，分隔器窗口是一个包含有多个窗格的窗口。窗格通常是应用程序特定的由CView派生的对象，但它也可以是具有适当子窗口ID的任何CWnd对象。
一个CSplitterWnd对象通常被嵌入CFrameWnd或CMDIChildWnd父对象。你应按如下步骤创建一个CSplitterWnd对象：
1. | 在父框架中嵌入一个CSplitterWnd成员变量。
2. | 重载父框架的CFrameWnd::OnCreateClient成员函数。
3. | 从重载的OnCreateClient函数中调用类CSplitterWnd的Create或CreateStatic成员函数。
调用Create成员函数可以创建一个动态的分隔器窗口。动态的分隔器窗口通常用于创建和滚动同一文档的多个窗格或视。框架将自动为该分隔器创建一个起始窗格；然后，当用户操纵该分隔器窗口的控件时，框架创建，调整大小，并且排列其它的窗格。
当你调用Create时，应指定一个最小行高度和最小列宽度，这两个最小值被用来确定窗格什么时候太小以致于不能被完全显示。在调用了Create之后，你可以通过调用SetColumnInfo和SetRowInfo来调整这些最小值。
你还可以使用SetColumnInfo和SetRowInfo成员函数来给一列设置一个“理想的”宽度，以及给一行设置一个“理想的”高度。当框架显示一个分隔器窗口时，首先显示父框架，然后才显示分隔器窗口。然后，框架从分隔器窗口的客户区左上角至右下角，根据窗格的理想尺寸以行或列来排放各个窗格。
动态分隔器窗口中的所有窗格都必须是同一个类的窗格。读者熟悉的支持动态分隔器窗口的应用程序包括Microsoft Word和Microsoft Excel。
使用CreateStatic成员函数可以创建一个静态分隔器窗口。用户只能修改静态分隔器窗口中的窗格的尺寸，但是不能改变其中的窗格序号和次序。
在创建静态分隔器时必须专门创建该静态分隔器的所有窗格。你必须在父框架的OnCreateClient成员函数返回之前确保创建了所有窗格，否则，框架将不能正确显示该窗口。
CreateStatic成员函数将使用为0的最小行高度和最小列宽度来自动初始化一个静态分隔器。在调用了Create之后，可以通过调用SetColumnInfo和SetRowInfo成员函数来调整这两个最小值。在调用CreateStatic之后，你也可以使用SetColumnInfo和SetRowInfo成员函数来指定你所希望的理想窗格值。
静态分隔器中的窗格通常属于不同的类。给予静态分隔器窗口的示例，参见图形编辑器和Windows文件管理器。分隔器窗口支持特殊的滚动条（除窗格可能带有的滚动框之外）。这些滚动条是CSplitterWnd对象的子对象并且被窗格共享。
当你创建这个分隔器窗口时，你创建了这些特殊的滚动条。例如，如果一个CSplitterWnd具有一行，两列，则WS_VSCROLL风格将显示两个窗格共享的垂直滚动条。当用户移动这个滚动条时，WM_VSCROLL消息将被发送给两个窗格。当窗格设置滚动条位置时，这个共享滚动条将被设置。
有关动态分隔器窗口的更多信息，参见“Visual C++程序员指南”中的文章“多文档类型，视和框架窗口”中的“分隔器窗口”；和Visual C++联机文档中的“TN029：分隔器窗口”；以及CSplitterWnd类概述。有关如何创建动态分隔器窗口的更多信息，参见“Visual C++联机教程”中的“在增强视的Scribble中添加分隔器窗口”；和MFC常规示例VIEWEX。
#include <afxext.h>
请参阅：CView, CWnd

CSplitterWnd类成员

构造
CSplitterWnd | 构造一个CSplitterWnd对象
Create | 创建一个动态的分隔器窗口并将它与一个CSplitterWnd对象连接
CreateStatic | 创建一个静态的分隔器窗口并将它与一个CSplitterWnd对象连接
CreateView | 在一个分隔器窗口中创建一个窗格

操作符
GetRowCount | 返回当前窗格行的计数值
GetColumnCount | 返回当前窗格列的计数值
GetRowInfo | 返回指定行的信息
SetRowInfo | 设置指定行的信息
GetColumnInfo | 返回指定列的信息
SetColumnInfo | 设置指定列的信息
GetPane | 返回位于指定行和列处的窗格
IsChildPane | 确定窗口是否是此分隔器窗口的当前子窗格
IdFromRowCol | 返回位于指定行和列处的窗格的子窗口ID
RecalcLayout | 在调整行或列尺寸后调用此函数来重新显示该分隔器窗口
GetScrollStyle | 返回共享滚动条的风格
SetScrollStyle | 为分隔器窗口的共享滚动条指定新的滚动条风格

可重载
OnDrawSplitter | 绘制一个分隔器窗口的图像
OnInvertTracker | 绘制一个分隔器窗口的图像，使它具有与框架窗口相同的大小和形状
CreateScrollBarCtrl | 创建一个共享的滚动条控件
DeleteView | 从分隔器窗口中删除一个视图
SplitRow | 表明一个框架窗口是否是水平分隔的
SplitColumn | 表明一个框架窗口是否是垂直分隔的
DeleteRow | 从分隔器窗口中删除一行
DeleteColumn | 从分隔器窗口中删除一列
GetActivePane | 根据焦点或框架中的活动视来确定活动窗格
SetActivePane | 在框架中设置一个活动窗格
CanActivateNext | 检查Next Pane或Previous Pane命令当前是否有效
ActivateNext | 执行Next Pane或Previous Pane命令
DoKeyboardSplit | 执行键盘分隔命令，通常是“Window Split”
DoScroll | 执行分隔窗口的同步滚动
DoScrollBy | 将分隔窗口滚动给定的像素数


 CSplitterWnd::ActivateNext

virtual void ActivateNext( BOOL bPrev = FALSE );

参数：
bPrev 表明要激活哪一个窗口。TRUE表示激活前一个窗口，FALSE表示激活下一个窗口。

说明：
框架调用此成员函数来执行Next Pane 或Previous Pane命令。
这个成员函数是一个高级命令，它由CView类用来作为CSplitterWnd实现的代表。

请参阅：
CView, CSplitterWnd::CanActivateNext, CSplitterWnd::SetActivePane


 CSplitterWnd::CanActivateNext

virtual BOOL CanActivateNext( BOOL bPrev = FALSE );

返回值：如果成功则返回非零值；否则返回0。

参数：
bPrev 表明要激活哪一个窗口。TRUE表示激活前一个窗口，FALSE表示激活下一个窗口。

说明：
框架调用此成员函数来检查Next Pane和Previous Pane命令当前是否有效。
这个成员函数是一个高级命令，它由CView类用来作为CSplitterWnd实现的代表。

请参阅：
CSplitterWnd::ActivateNext, CSplitterWnd::SetActivePane


 CSplitterWnd::Create

BOOL Create( CWnd* pParentWnd,
int nMaxRows,
int nMaxCols,
SIZE sizeMin,
CCreateContext* pContext,
DWORD dwStyle = WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT,
UINT nID = AFX_IDW_PANE_FIRST
);

返回值：如果成功则返回非零值；否则返回0。

参数：
pParentWnd | 分隔器窗口的父框架窗口。
nMaxRows | 分隔器窗口中的最大行数。这个值不能超过2。
nMaxCols | 分隔器窗口中的最大列数。这个值不能超过2。
sizeMin | 指出显示一个窗格所需的最小尺寸。
pContext | 指向一个CCreateContext结构的指针。多数情况下，这个值可以是传递给父框架窗口的pContext。
dwStyle | 指定窗口的风格。
nID | 此窗口的子窗口ID。如果这个分隔器窗口不是嵌套在另一个分隔器窗口中的，则这个ID可以是AFX_IDW_PANE_FIRST。

说明：
要创建一个动态分隔器窗口，应调用Create成员函数。
你可以通过如下步骤将一个CSplitterWnd嵌入一个CFrameWnd或CMDIChildWnd父对象：
1. | 在父框架中嵌入一个CSplitterWnd成员变量。
2. | 重载父框架的CFrameWnd::OnCreateClient成员函数。
3. | 从重载的OnCreateClient中调用Create成员函数。
当你从一个父框架内创建一个分隔器窗口时，将父框架的pContext参数传递给此分隔器窗口。否则，Create函数的pContext可以是NULL。
一个动态分隔器窗口的初始最小行高度和列宽度由sizeMin参数设置。这些最小值被用来确定窗格是否太小以至于不能将其完整地显示出来。
有关动态分隔器窗口的更多信息，参见“Visual C++程序员指南”中的文章“多文档类型，视，和框架窗口”中的“分隔器窗口”；“Visual C++联机文档”中的“TN029：分隔器窗口”；以及CSplitterWnd类概述。

请参阅：
CSplitterWnd::CreateStatic, CFrameWnd::OnCreateClient, CSplitterWnd::SetRowInfo, CSplitterWnd::SetColumnInfo, CSplitterWnd::CreateView


 CSplitterWnd::CreateScrollBarCtrl

virtual BOOL CreateScrollBarCtrl( DWORD dwStyle, UINT nID );

返回值：如果成功则返回非零值；否则返回0。

参数：
dwStyle | 指定窗口的风格。
nID | 此窗口的子窗口ID。如果这个分隔器窗口不是嵌套在另一个分隔器窗口中的，则这个ID可以是AFX_IDW_PANE_FIRST。

说明：
框架调用此成员函数来创建一个共享的滚动条控件。重载CreateScrollBarCtrl来包括一个滚动条附近的其它控件。缺省的行为是创建标准的Windows滚动条控件。

请参阅：AfxGetInstanceHandle


 CSplitterWnd::CreateStatic

BOOL CreateStatic( CWnd* pParentWnd,
int nRows,
int nCols,
DWORD dwStyle = WS_CHILD | WS_VISIBLE,
UINT nID = AFX_IDW_PANE_FIRST
);

返回值：如果成功则返回非零值；否则返回0。

参数：
pParentWnd | 分隔器窗口的父框架窗口。
nRows | 行数。这个值必须不超过16。
nCols | 列数。这个值必须不超过16。
dwStyle | 指定窗口的风格。
nID | 此窗口的子窗口ID。如果这个分隔器窗口不是嵌套在另一个分隔器窗口中的，则这个ID可以是AFX_IDW_PANE_FIRSH。

说明：
要创建一个静态的分隔器窗口，应调用CReateStatic成员函数。
你可以通过如下步骤将一个CSplitterWnd嵌入一个CFrameWnd或CMDIChildWnd父对象：
1. | 在父框架中嵌入一个CSplitterWnd成员变量。
2. | 重载父框架的CFrameWnd::OnCreateClient成员函数。
3. | 从重载的OnCreateClient中调用Create成员函数。
一个静态的分隔器窗口包含了固定数目的窗格，这些窗格是不同类的。
当你创建一个静态分隔器窗口时，你必须同时创建它的所有窗格。CReateView成员函数通常就是用于这个目的，但你也可以创建其它非视类。
一个静态分隔器窗口的初始最小行高度和列高度是0。这些最小值用来确定窗格是否太小以至于不能将其完整地显示出来。
要给静态分隔器窗口添加滚动条，就应在dwStyle参数中指定WS_HSCROLL或WS_VSCROLL风格。
有关静态分隔器窗口的更多信息，参见“Visual C++程序员指南”中的文章“多文档类型，视，和框架窗口”中的“分隔器窗口”；“Visual C++联机文档”中的“TN029：分隔器窗口”；以及CSplitterWnd类概述。

请参阅：
CSplitterWnd::Create, CFrameWnd::OnCreateClient, CSplitterWnd::SetRowInfo, CSplitterWnd::SetColumnInfo, CSplitterWnd::CreateView


 CSplitterWnd::CreateView

virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );

返回值：如果成功则返回非零值；否则返回0。

参数：
row | 指定用来放置新视的分隔器窗口行。
col | 指定用来放置新视的分隔器窗口列。
pViewClass | 指定新视的CRuntimeClass。
sizeInit | 指定新视的初始尺寸。
pContext | 指向用来创建此视的创建环境的指针（通常，该pContext被传递给在其中创建此分隔器窗口的父框架的重载的OnCreateClient成员函数）。

说明：
此成员函数用来为一个静态分隔器窗口创建窗格。一个静态分隔器窗口的所有窗格必须在框架显示这个分隔器之前被创建。
当一个动态分隔器的用户分隔一个窗格，行或列时，框架也调用这个成员函数来创建新的窗格。

请参阅：CSplitterWnd::Create


 CSplitterWnd::CSplitterWnd

CSplitterWnd( );

说明：
构造一个CSplitterWnd分两步。首先调用这个构造函数，它创建一个CSplitterWnd对象，然后调用Create成员函数来创建分隔器窗口并将它与该CSplitterWnd对象连接。

请参阅：CSplitterWnd::Create


 CSplitterWnd::DeleteColumn

virtual void DeleteColumn( int colDelete );

参数：
colDelete 指定要被删除的列。

说明：
当要删除一个列时调用此成员函数。
框架调用此成员函数来实现动态分隔器窗口的逻辑（如果此分隔器窗口具有SPLS_DYNAMIC_SPLIT风格）。它可以用虚函数CreateView来定制，以实现更高级的动态分隔器。

请参阅：
CSplitterWnd::DeleteRow, CSplitterWnd::CreateView, CSplitterWnd::DeleteView


 CSplitterWnd::DeleteRow

virtual void DeleteRow( int rowDelete );

参数：
rowDelete 指定要被删除的行。

说明：
当要删除一个行时调用此成员函数。
框架调用此成员函数来实现动态分隔器窗口的逻辑（如果此分隔器窗口具有SPLS_ DYNAMIC_SPLIT风格）。它可以用虚函数CreateView来定制，以实现更高级的动态分隔器。

请参阅：
CSplitterWnd::DeleteColumn, CSplitterWnd::CreateView, CSplitterWnd::DeleteView


 CSplitterWnd::DeleteView

virtual void DeleteView( int row, int col );

参数：
row | 指定要在分隔器窗口的哪一行中删除视。
col | 指定要在分隔器窗口的哪一列中删除视。

说明：
当要删除一个视时调用DeleteView。如果删除的是活动视，则下一个将成为活动视。缺省的实现假定这个视将在PostNcDestroy中自动删除。
框架调用此成员函数来实现动态分隔器窗口的逻辑（如果此分隔器窗口具有SPLS_DYNAMIC_SPLIT风格）。它可以用虚函数CreateView来定制，以实现更高级的动态分隔器。

请参阅：
CWnd::PostNcDestroy, CSplitterWnd::CreateView, CSplitterWnd::DeleteColumn, CSplitterWnd::DeleteRow


 CSplitterWnd::DoKeyboardSplit

virtual BOOL DoKeyboardSplit( );

返回值：如果成功则返回非零值；否则返回0。

说明：
框架调用此成员函数来实现一个键盘分隔命令，通常是Window Split。
这个成员函数是一个高级命令，被CView用来作为CSplitterWnd实现的代表。

请参阅：CView


 CSplitterWnd::DoScroll

virtual BOOL DoScroll( CView* pViewFrom, UINT nScrollCode, BOOL bDoScroll = TRUE );

返回值：
如果发生了同步的滚动则返回非零值；否则返回0。

参数：
pViewFrom | 一个指向视的指针，滚动消息就是从这个视中发出的。
nScrollCode一个滚动条代码，它表明了用户的滚动要求。这个参数包括两个部分：一个是低字节，用来确定发生的水平滚动的类型，一个是高字节，用来确定发生的垂直滚动的类型：
· | SB_BOTTOM | 滚动到底。
· | SB_LINEDOWN | 向下滚动一行。
· | SB_LINEUP | 向上滚动一行。
· | SB_PAGEDOWN | 向下滚动一页。
· | SB_PAGEUP | 向上滚动一页。
· | SB_TOP | 滚动到顶。
bDoScroll | 确定是否可以发生指定的滚动动作。如果bDoScroll是TRUE（就是说，如果一个子窗口存在，并且此分隔窗口有一个滚动范围），则指定的滚动动作可以发生；如果bDoScroll是FALSE（就是说，如果不存在一个子窗口，或此分隔视没有滚动范围），则滚动将不会发生。

说明：
当视接收到一个滚动消息时，框架调用此成员函数来执行分隔窗口的同步滚动。
重载这个函数，在同步滚动允许之前请求一个由用户指定的动作。

请参阅：
CSplitterWnd::DoScrollBy, CView::OnScroll


 CSplitterWnd::DoScrollBy

virtual BOOL DoScrollBy( CView* pViewFrom, CSize sizeScroll, BOOL bDoScroll = TRUE );

返回值：
如果发生了同步滚动则返回非零值；否则返回0。

参数：
pViewFrom | 指向一个视的指针，滚动消息就是从这个视发出的。
sizeScroll | 要水平和垂直滚动的像素数。
bDoScroll | 确定是否可以发生指定的滚动动作。如果bDoScroll是TRUE（就是说，如果一个子窗口存在，并且此分隔窗口有一个滚动范围），则指定的滚动动作可以发生；如果bDoScroll是FALSE（就是说，如果不存在一个子窗口，或此分隔视没有滚动范围），则滚动将不会发生。

说明：
在响应一个滚动消息时，框架调用此成员函数来执行此分隔窗口的同步滚动，滚动由sizeScroll指定的像素数。正值表示向下和向右滚动，负值表示向上和向左滚动。
重载这个函数，在滚动允许之前请求一个由用户指定的动作。

请参阅：
CSplitterWnd::DoScroll, CView::OnScroll


 CSplitterWnd::GetActivePane

virtual CWnd* GetActivePane(int* pRow = NULL, int* pCol = NULL);

返回值：
返回指向活动窗格的指针。如果不存在活动窗格则返回NULL。

参数：
pRow | 指向一个用来接收此活动窗格的行号的int的指针。
pCol | 指向一个用来接收此活动窗格的列号的int的指针。

说明：
框架调用此成员函数来确定一个分隔器窗口中的活动窗格。
重载这个函数，在获得此活动窗格之前请求一个由用户指定的动作。

请参阅：
CSplitterWnd::SetActivePane, CFrameWnd::GetActiveView, CWnd::GetParentFrame, CWnd::GetFocus


 CSplitterWnd::GetColumnCount

int GetColumnCount( );

返回值：
返回此分隔器中的当前列数。对一个静态分隔器，这也是行数的最大值。

请参阅：CSplitterWnd::GetRowCount


 CSplitterWnd::GetColumnInfo

void GetColumnInfo( int col, int& cxCur, int& cxMin );

参数：
col | 指定一列。
cxCur | 一个要用来设置列的当前宽度的int的引用。
cxMin | 一个要用来设置列的当前最小宽度的int的引用。

说明：此成员函数用来获取指定列的信息。

请参阅：CSplitterWnd::SetColumnInfo, CSplitterWnd::GetRowInfo


 CSplitterWnd::GetPane

CWnd* GetPane( int row, int col );

返回值：
返回位于指定行和列处的窗格。此返回窗格通常是一个CView派生类。

参数：
row | 指定一行。
col | 指定一列。

请参阅：
CSplitterWnd::GetActivePane, CSplitterWnd::IdFromRowCol, CSplitterWnd::IsChildPane


 CSplitterWnd::GetRowCount

int GetRowCount( );

返回值：
返回此分隔器窗口中的当前行数。对一个静态分隔器窗口，这也是最大行数。

请参阅：CSplitterWnd::GetColumnCount


 CSplitterWnd::GetRowInfo

void GetRowInfo( int row, int& cyCur, int& cyMin );

参数：
row | 指定一行。
cyCur | 一个要用来设置行的当前高度的int的引用。
cyMin | 一个要用来设置行的当前最小高度的int的引用。

说明：
此成员函数用来获取指定行的信息。cyCur参数用指定行的当前高度来填充，cyWin用该行的最小高度来填充。

请参阅：
CSplitterWnd::SetRowInfo, CSplitterWnd::GetColumnInfo


 CSplitterWnd::GetScrollStyle

DWORD GetScrollStyle( ) const;

返回值：
如果成功，则返回下列窗口风格标志的一个或多个：
· | WS_HSCROLL | 如果分隔器当前管理共享的水平滚动条。
· | WS_VSCROLL | 如果分隔器当前管理共享的垂直滚动条。
如果分隔器窗口当前不管理任何共享滚动条，则返回零。

说明：
此成员函数返回此分隔器窗口的共享滚动条的风格。

请参阅：CSplitterWnd::SetScrollStyle


 CSplitterWnd::IdFromRowCol

int IdFromRowCol( int row, int col );

返回值：返回此窗格的子窗口的ID。

参数：
row | 指定分隔器窗口的行。
col | 指定分隔器窗口的列。

说明：
此成员函数用来获取位于指定行和列处的窗格的子窗口ID。这个成员函数用于创建非视类的窗格，并且可以在该窗格存在之前被调用。

请参阅：
CSplitterWnd::GetPane, CSplitterWnd::IsChildPane


 CSplitterWnd::IsChildPane

BOOL IsChildPane( CWnd* pWnd, int& row, int& col );

返回值：
若返回值是非零值，则pWnd是此分隔器窗口的子窗格，并且该函数将此分隔器窗口的窗格的位置填写到row和col中。如果pWnd不是此分隔器窗口的子窗口，则返回0。

参数：
pWnd | 指向一个要被测试的CWnd对象的指针。
row | 是对一个将要被设置为行号的int的引用。
col | 是对一个将要被设置为列号的int的引用。

说明：
此成员函数用来确定pWnd是否是此分隔器窗口的子窗口。

请参阅：CSplitterWnd::GetPane


 CSplitterWnd::OnDrawSplitter

virtual void OnDrawSplitter( CDC* pDC, ESplitType nType, const CRect& rect );

参数：
pDC | 一个指向设备环境的指针，将要在这个设备上绘画。如果pDC是NULL，则框架调用CWnd::RedrawWindow并且没有分隔窗口被绘制。
nType一个enum ESplitType值，可以是下列值之一：
· | splitBox | 分隔器拖拉框。
· | splitBar | 显示在两个分隔窗口之间的条。
· | splitIntersection | 分隔窗口的交。当在Windows95下允许时，不会调用这个元素。
· | splitBorder | 分隔窗口边界。
rect | 是对一个用来指定分隔窗口的大小和形状的CRect对象的引用。

说明：
框架调用此成员函数来绘制并指定一个分隔器窗口的精确的特征。
要对一个分隔器窗口的各个图形部件的图像进行高级定制，可以重载OnDrawSplitter。缺省的图像与Microsoft Works for Windows或MicrosoftWindows 95中的分隔器类似。在Microsoft Works for Windows或MicrosoftWindows 95中分隔器条的交接处是混合在一起的。
有关静态分隔器窗口的更多信息，参见“Visual C++程序员指南”中的文章“多文档类型，视和框架窗口”中的“分隔器窗口”；“Visual C++文档”中的“TN029：分隔器窗口”；以及CSplitterWnd类概述。

请参阅：CSplitterWnd::OnInvertTracker


 CSplitterWnd::OnInvertTracker

virtual void OnInvertTracker( const CRect& rect );

参数：
rect 是对一个指定跟踪矩形的CRect对象的引用。

说明：
在调整分隔器大小期间，框架调用此成员函数。
要对一个分隔器窗口的图像进行高级定制，可以重载OnInvertTracker。缺省的图像与Microsoft Works for Windows或Microsoft Windows 95中的分隔器类似。在Microsoft Works for Windows或Microsoft Windows 95中分隔器条的交接处是混合在一起的。
有关静态分隔器窗口的更多信息，参见“Visual C++程序员指南”中的文章“多文档类型，视和框架窗口”中的“分隔器窗口”；“Visual C++文档”中的“TN029：分隔器窗口”；以及CSplitterWnd类概述。

请参阅：CSplitterWnd::OnDrawSplitter


 CSplitterWnd::RecalcLayout

void RecalcLayout( );

说明：
在你用SetRowInfo和SetColumnInfo成员函数调整了行和列的大小之后，调用此成员函数来正确地重新显示此分隔器窗口。如果你是在分隔器窗口可见之前改变行和列的大小作为创建过程的一部分，则不需要调用这个成员函数。
无论什么时候用户调整此分隔器窗口的大小或移动一个分隔条，框架都将调用这个成员函数。

请参阅：
CSplitterWnd::SetRowInfo, CSplitterWnd::SetColumnInfo


 CSplitterWnd::SetActivePane

virtual void SetActivePane( int row, int col, CWnd* pWnd = NULL );

参数：
row | 如果pWnd是NULL，则此参数指定将要被激活的窗格中的行。
col | 如果pWnd是NULL，则此参数指定将要被激活的窗格中的列。
pWnd | 一个指向CWnd对象的指针。如果是NULL，则由row和col指定的窗格被置为活动窗格。如果不是NULL，则它指定了要被激活的窗格。

说明：
当用户将焦点改变到框架窗口中的某一个窗格时，框架调用此成员函数来设置一个活动窗格。你可以显式地调用SetActivePane来将焦点改变到指定的视。可以通过提供行和列，或pWnd来指定窗格。

请参阅：
CSplitterWnd::GetActivePane, CSplitterWnd::GetPane, CFrameWnd::SetActiveView


 CSplitterWnd::SetColumnInfo

void SetColumnInfo( int col, int cxIdeal, int cxMin );

参数：
col | 指定一个分隔器窗口列。
cxIdeal | 指定分隔器窗口列的以像素表示的理想宽度。
cxMin | 指定分隔器窗口列以像素表示的最小宽度。

说明：
此成员函数用来设置一列的新的最小宽度和理想宽度。列的最小值确定了什么时候列将太小以至于不能被完全显示。
当框架显示分隔器窗口时，它从分隔器窗口的客户区的左上角至右下角，根据窗格的理想尺寸按行和列来排放各个窗格。

请参阅：
CSplitterWnd::GetRowInfo, CSplitterWnd::RecalcLayout


 CSplitterWnd::SetRowInfo

void SetRowInfo( int row, int cyIdeal, int cyMin );

参数：
row | 指定一个分隔器窗口行。
cyIdeal | 指定分隔器窗口行的以像素表示的理想高度。
cyMin | 指定分隔器窗口行以像素表示的最小高度。

说明：
此成员函数用来设置一行的新的最小高度和理想高度。行的最小值确定了什么时候行将太小以至于不能被完全显示。
当框架显示分隔器窗口时，它从分隔器窗口的客户区的左上角至右下角，根据窗格的理想尺寸按行和列来排放各个窗格。

请参阅：
CSplitterWnd::GetRowInfo, CSplitterWnd::SetColumnInfo, CSplitterWnd::RecalcLayout


 CSplitterWnd::SetScrollStyle

void SetScrollStyle( DWORD dwStyle );

参数：
dwStyle此分隔器窗口的共享滚动条所指出的滚动条风格，可以是下列值之一：
· | WS_HSCROLL | 创建/显示水平共享滚动条。
· | WS_VSCROLL | 创建/显示垂直共享滚动条。

说明：
此成员函数用来为分隔器窗口的共享滚动条指定新的滚动条风格。一旦创建了一个滚动条，即使调用了没有这个风格的SetScrollStyle，此滚动条也不会被销毁；而是隐藏这些滚动条。在调用SetScrollStyle之后，为了使所有的改变见效，必须调用RecalcLayout。

请参阅：CSplitterWnd::GetScrollStyle


 CSplitterWnd::SplitColumn

virtual BOOL SplitColumn( int cxBefore );

返回值：如果成功则返回非零值；否则返回0。

参数：
cxBefore 在分隔出现点前面的以像素表示的位置。

说明：
当创建了一个垂直的分隔器窗口时调用此成员函数。SplitColumn指明分隔要出现的缺省位置。
框架调用SplitColumn来实现动态分隔器窗口（即，分隔器窗口具有SPLS_DYNAMIC_ SPLIT风格）的逻辑。可以用CreateView函数来定制它，以实现更为高级的动态分隔器。

请参阅：
CSplitterWnd::CreateView, CSplitterWnd::SplitRow, CSplitterWnd::RecalcLayout


 CSplitterWnd::SplitRow

virtual BOOL SplitRow( int cyBefore );

返回值：如果成功则返回非零值；否则返回0。

参数：
cyBefore 在分隔出现点前面的以像素表示的位置。

说明：
当创建了一个水平的分隔器窗口时调用此成员函数。SplitRow指明分隔要出现的缺省位置。
框架调用SplitRow来实现动态分隔器窗口（即，分隔器窗口具有SPLS_DYNAMIC_SPLIT风格）的逻辑。可以用CreateView函数来定制它，以实现更为高级的动态分隔器。

请参阅：
CSplitterWnd::SplitColumn, CSplitterWnd::CreateView, CSplitterWnd::RecalcLayout


 CStatic

CObject
└CCmdTarget
└CWnd
└CStatic

CStatic类提供了一个Windows静态控件的性能。一个静态控件用来显示一个文本字符串，框，矩形，图标，光标，位图，或增强的图元文件。它可以被用来作为标签，框，或用来分隔其它的控件。一个静态控件不接收输入，也不提供输出；但是，如果它是用SS_NOTIFY风格创建的，则它可以通知其父有关设备点击的消息。创建一个静态控件分两步。首先，调用构造函数来构造此CStatic对象，然后调用Create成员函数来创建此静态控件并将它与该CStatic对象连接。如果你是在一个对话框中创建了一个静态控件（通过一个对话框资源），则当用户关闭这个对话框时，此CStatic对象被自动销毁。如果你是在一个窗口中创建了一个CStatic对象，则必须由你来销毁它。在一个窗口的堆栈中创建的CStatic对象将自动被销毁。如果你是使用new函数在堆中创建CStatic对象，则当你使用完后，必须调用delete来销毁这个CStatic对象。

#include <afxwin.h>

请参阅：
CWnd, CButton, CComboBox, CEdit, CListBox, CScrollBar, CDialog

CStatic类成员

构造
CStatic 构造一个CStatic对象

初始化
Create 创建Windows静态控件并将它与该CStatic对象连接

操作符
SetBitmap | 指定要在此静态控件中显示的位图
GetBitmap | 获取先前用SetBitmap设置的位图的句柄
SetIcon | 指定一个要在此静态控件中显示的图标
GetIcon | 获取先前用SetIcon设置的图标的句柄
SetCursor | 指定要显示在此静态控件中的光标图像
GetCursor | 获取先前用SetCursor设置的光标图像的句柄
SetEnhMetaFile | 指定要显示在此静态控件中的增强的图元文件
GetEnhMetaFile | 获取先前用SetEnhMetaFile设置的增强图元文件的句柄


 CStatic::Create

BOOL Create( LPCTSTR lpszText, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID = 0xffff );

返回值：如果成功则返回非零值；否则返回0；

参数：
lpszText | 指定要放置在控件中的文本。如果是NULL，则表示没有文本是可见的。
dwStyle | 指定静态控件的窗口风格。任何静态控件风格的组合都可以用于这个控件。
rect | 指定静态控件的位置和大小。它可以是一个RECT结构或一个CRect对象。
pParentWnd | 指定CStatic父窗口，通常是一个CDialog对象。它不能是NULL。
nID | 指定静态控件的控件ID。

说明：
可以将下列窗口风格用于一个静态控件：
· | WS_CHILD | 总要使用。
· | WS_VISIBLE | 经常使用。
· | WS_DISABLED | 很少使用。
如果你准备在此静态控件中显示一个位图，光标，图标，或图元文件，你必须使用下列风格之一：
· | SS_BITMAP | 此风格用于位图。
· | SS_ICON | 此风格用于光标和图标。
· | SS_ENHMETAFILE | 此风格用于增强的图元文件。
对于光标，位图，或图标，你也可以使用下面的风格：
·SS_CENTERIMAGE用来使静态控件中的图像居中。

请参阅：CStatic::CStatic


 CStatic::CStatic

CStatic( );

说明：此成员函数用来构造一个CStatic对象。

请参阅：CStatic::Create


 CStatic::GetBitmap

HBITMAP GetBitmap( ) const;

返回值：
返回一个当前位图的句柄，如果没有设置位图，则返回NULL。

说明：
此成员函数用来获取先前用SetBitmap设置的与CStatic关联的位图句柄。

请参阅：
CStatic::SetBitmap, STM_GETIMAGE, Bitmaps


 CStatic::GetCursor

HCURSOR GetCursor( );

返回值：
返回一个当前图标句柄。如果没有设置图标则返回NULL。

说明：
此成员函数用来获取先前用SetCursor设置的与CStatic关联的光标句柄。

请参阅：
CStatic::SetCursor, STM_GETIMAGE, Cursors


 CStatic::GetEnhMetaFile

HENHMETAFILE GetEnhMetaFile( ) const;

返回值：
返回一个当前增强图元文件句柄。如果没有设置增强的图元文件则返回NULL。

说明：
此成员函数用来获取先前用SetEnhMetaFile设置的与CStatic关联的增强的图元文件句柄。

请参阅：
CStatic::SetEnhMetaFile, STM_GETIMAGE


 CStatic::GetIcon

HICON GetIcon( ) const;

返回值：
返回一个当前图标句柄。如果没有设置增强的图标则返回NULL。

说明：
此成员函数用来获取先前用SetIcon设置的与CStatic关联的图标句柄。

请参阅：
CStatic::SetIcon, STM_GETICON, Icons


 CStatic::SetBitmap

HBITMAP SetBitmap( HBITMAP hBitmap );

返回值：
返回先前与此静态控件关联的位图的句柄。如果没有与此静态控件关联的位图，则返回NULL。

参数：
hBitmap 要绘制在此静态控件中的位图句柄。

说明：
此成员函数用来将一个新的位图与此静态控件关联。
这个位图将被自动绘制在此静态控件中。缺省的，它将被绘制在左上角，并且此静态控件将根据位图的大小来调整尺寸。
你可以使用不同的窗口和静态控件风格，包括下列值：
· | SS_BITMAP | 此风格总是用于位图。
· | SS_CENTERIMAGE | 用来在此静态控件中居中。如果图像比静态控件大，则它将被剪切掉。如果它比静态控件小，则图像周围的空间将被用位图左上角的像素的颜色填充。

请参阅：CStatic::GetBitmap, STM_SETIMAGE, Bitmaps


 CStatic::SetCursor

HCURSOR SetCursor( HCURSOR hCursor );

返回值：
返回先前与此静态控件关联的光标的句柄。如果没有与此静态控件关联的光标，则返回NULL。

参数：
hCursor 要绘制在此静态控件中的光标句柄。

说明：
此成员函数用来将一个新的光标与此静态控件关联。
这个光标将被自动绘制在此静态控件中。缺省的，它将被绘制在左上角，并且此静态控件将根据光标的大小来调整尺寸。
你可以使用不同的窗口和静态控件风格，包括下列值：
· | SS_ICON | 此风格总是用于位图。
· | SS_CENTERIMAGE | 用来在此静态控件中居中。如果图像比静态控件大，则它将被剪切掉。如果它比静态控件小，则图像周围的空间将被用位图左上角的像素颜色填充。

请参阅：CStatic::GetCursor, STM_SETIMAGE, Cursors


 CStatic::SetEnhMetaFile

HENHMETAFILE SetEnhMetaFile( HENHMETAFILE hMetaFile );

返回值：
返回先前与此静态控件关联的增强图元文件的句柄。如果没有与此静态控件关联的增强图元文件，则返回NULL。

参数：
hMetaFile 要绘制在此静态控件中的增强图元文件句柄。

说明：
此成员函数用来将一个新的增强图元文件与此静态控件关联。
这个增强图元文件将被自动绘制在此静态控件中。缺省的，它将被绘制在左上角，并且此静态控件将根据增强图元文件的大小来调整尺寸。
你可以使用不同的窗口和静态控件风格，包括下列值：
·SS_ENHMETAFILE此风格总是用于位图。

请参阅：CStatic::GetEnhMetaFile, STM_SETIMAGE


 CStatic::SetIcon

HICON SetIcon( HICON hIcon );

返回值：
返回先前与此静态控件关联的图标的句柄。如果没有与此静态控件关联的图标，则返回NULL。

参数：
hIcon 要绘制在此静态控件中的图标句柄。

说明：
此成员函数用来将一个新的图标与此静态控件关联。
这个图标将被自动绘制在此静态控件中。缺省的，它将被绘制在左上角，并且此静态控件将根据图标的大小来调整尺寸。
你可以使用不同的窗口和静态控件风格，包括下列值：
· | SS_ICON | 此风格总是用于图标。
· | SS_CENTERIMAGE | 用来在此静态控件中居中。如果图像比静态控件大，则它将被剪切掉。如果它比静态控件小，则图像周围的空间将被用位图左上角的像素颜色填充。

请参阅：CStatic::GetIcon, STM_SETICON, Icons


 CStatusBar

CObject
└CCmdTarget
└CControlBar
└CStatusBar

一个CStatusBar对象是一个带有一行文本输出窗格的控件，或者称为“指示器”。这些输出窗格常被用作消息行和状态指示器。例如：简单解释所选菜单命令的菜单帮助消息行，作为显示SCROLL LOCK，NUMLOCK以及其它键状态的指示器。
在MFC4.0之后新增加的成员函数CStatusBar:: GetStatusBarCtrl，允许你利用Windows通用控件对状态条的定制和其它功能的支持。CStatusBar成员函数提供了Windows通用控件的大多数功能；但是，当你调用GetStatusBarCtrl时，你可以赋予你的状态条更多的Windows95状态条的特性。当你调用GetStatusBarCtrl时，它将返回一个对CStatusBarCtrl对象的引用。参见CStatusBarCtrl可以获得有关使用Windows通用控件设计工具条的更多信息。有关通用控件的更多的一般信息，请参见“Windows 95 SDK程序员参考”中的“通用控件”。
框架将指示器的信息保存在一个数组中，且最左边的的指示器位于0位置上。当创建一个工具条时，可以使用一个字符串ID数组，框架把这一组ID与对应的指示器关联起来。此后，你就可以使用字符串ID或索引值访问一个指示器。缺省的，第一个指示器是“可伸缩的”：该指示器占据了其它指示器窗格未用到的状态条长度，因此其它窗格是右对齐的。
可以按下列步骤创建一个状态条：
1. | 构造CStatusBar对象。
2. | 调用Create（或CreateEx）函数来创建状态条窗口并将它连接到CStatusBar对象。
3. | 调用SetIndicators函数将字符串ID与每一个指示器联系起来。
有三种办法可以更新状态条窗口中的文本：
1. | 调用CWnd::SetWindowText只更新窗格0中的文本。
2. | 在状态条的ON_UPDATE_COMMAND_UI处理程序中调用CCmdUI::SetText函数。
3. | 调用SetPaneText函数更新任何窗格中的文本。
调用SetPaneStyle可以更新一个状态条窗格的风格。
有关使用CStatusBar的更多信息，参见“Visual C++程序指南”中的文章“状态条”，以及技术注释31，“控制条”。
#include <afxext.h>
请参阅：
CStatusBarCtrl, CControlBar, CWnd::SetWindowText, CStatusBar::SetIndicators

CStatusBar类成员

构造
CStatusBar | 构造一个CStatusBar对象
Create | 创建状态条，并将它与CStatusBar对象连接，且设置初始字体和条高度
CreateEx | 创建一个具有嵌入CStatusBarCtrl对象附加风格的CStatusBar对象
SetIndicators | 设置指示器ID

属性
CommandToIndex | 获取给定指示器ID的索引
GetItemID | 获取给定索引的指示器ID
GetItemRect | 获取给定索引值的显示矩形
GetPaneInfo | 获取一个给定索引的指示器ID，风格和宽度
SetPaneInfo | 设置一个给定索引的指示器ID，风格和宽度
GetPaneStyle | 获取一个给定索引的指示器风格
SetPaneStyle | 设置一个给定索引的指示器风格
GetPaneText | 获取一个给定索引的指示器文本
SetPaneText | 设置一个给定索引的指示器文本
GetStatusBarCtrl | 允许直接访问基础通用控件

可重载
DrawItem 当一个属主绘制的状态条控件的外观改变时，此函数被调用


 CStatusBar::CommandToIndex

int CommandToIndex( UINT nIDFind ) const;

返回值：
如果成功则返回指示器的索引；否则返回-1。

参数：
nIDFind 要获取其索引的指示器的字符串ID。

说明：
此成员函数用来获取一个给定ID的指示器索引值。第一个指示器的索引值为0。

请参阅：CStatusBar::GetItemID


 CStatusBar::Create

BOOL Create( CWnd* pParentWnd, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, UINT nID = AFX_IDW_STATUS_BAR );

返回值：如果成功则返回非零值；否则返回0。

参数：
pParentWnd | 指向一个CWnd对象的指针，该对象的Windows窗口是此状态条的父窗口。
dwStyle状态条风格。除标准的Windows风格之外，还支持下列风格：
· | CBRS_TOP | 控制条在框架窗口的顶部。
· | CBRS_BOTTOM | 控制条在框架窗口的底部。
· | CBRS_NOALIGN | 当父窗口的尺寸发生变化时不重新定位控制条。
nID | 工具条的子窗口ID。

说明：
此成员函数用来创建一个状态条（一个子窗口）并将它与CStatusBar对象连接。还将状态条的初始字体和高度设置为缺省值。

请参阅：CStatusBar::SetIndicators


 CStatusBar::CreateEx

BOOL CreateEx( CWnd* pParentWnd, DWORD dwCtrlStyle = 0, DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_BOTTOM, UINT nID = AFX_IDW_STATUS_BAR );

返回值：如果成功则返回非零值；否则返回0。

参数：
pParentWnd | 指向CWnd对象的指针，该对象的Windows窗口是状态条的父窗口。
dwCtrlStyle用于嵌入CStatusBarCtrl对象创建的附加风格。有关所支持的风格的完整列表，参见dwStyle。被支持的状态条风格有：
· | SBARS_SIZEGRIP | 在状态条的右端有一个调整大小的把手的状态条控件。一个调整大小的把手就类似于一个调整大小的边；它是一个特别的区域，用户可以点击并拖动它来调整父窗口的大小。
· | SBT_TOOLTIPS | 状态条支持工具提示。
dwStyle状态条风格。所支持的风格包括：
· | SBARS_SIZEGRIP | 在状态条的右端有一个调整大小的把手的状态条控件。一个调整大小的把手就类似于一个调整大小的边；它是一个特别的区域，用户可以点击并拖动它来调整父窗口的大小。
· | SBT_TOOLTIPS | 状态条支持工具提示。
nID | 状态条的子窗口ID。

说明：
此成员函数用来创建一个状态条（一个子窗口），并将它与CStatusBar对象连接。此函数也将状态条的初始字体和高度设置为缺省值。
在创建需要具有一定风格的嵌入状态条控件时，使用CreateEx来代替Creat。例如，设置dwCtrlStyle为SBT_TOOLTIPS来在状态条对象中显示工具提示。


 CStatusBar::CStatusBar

CStatusBar();

说明：
此成员函数用来构造一个CStatusBar对象，如果必要的话，创建一种缺省的状态条字体，并将字体特征设置为缺省值。

请参阅：CStatusBar::Create


 CStatusBar::DrawItem

virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );

参数：
lpDrawItemStruct 一个指向DRAWITEMSTRUCT结构的指针，该结构包含了有关所需要的绘画类型的信息。

说明：
当一个属主绘制的状态条的外观改变时，框架调用此成员函数。
DRAWITEMSTRUCT结构的itemAction成员定义了要执行的绘画动作。重载这个成员函数可以实现一个属主绘制的CStatusBar对象的绘画。在此成员函数终止之前，应用程序应该恢复在lpDrawItemStruct中提供的显示环境所选择的所有图形设备接口（GDI）。

请参阅：CWnd::OnDrawItem


 CStatusBar::GetItemID

UINT GetItemID( int nIndex ) const;

返回值：返回由nIndex指定的指示器的ID。

参数：
nIndex 要获取其ID的指示器的索引。

说明：
此成员函数返回由nIndex指定的指示器的ID。

请参阅：CStatusBar::CommandToIndex


 CStatusBar::GetItemRect

void GetItemRect( int nIndex, LPRECT lpRect ) const;

参数：
nIndex | 要获取其矩形坐标的指示器的索引。
lpRect | 执行一个RECT结构或一个CRect对象，该结构或对象将用来接收由nIndex指定的指示器的坐标。

说明：
此成员函数用来将由nIndex指定的指示器的坐标拷贝到由lpRect指定的结构中去。坐标是相对于此状态条的左上角的以像素表示的坐标。

请参阅：
CStatusBar::CommandToIndex, CStatusBar::GetPaneInfo


 CStatusBar::GetPaneInfo

void GetPaneInfo( int nIndex, UINT& nID, UINT& nStyle, int& cxWidth ) const;

参数：
nIndex | 要获取其信息的窗格的索引。
nID | 对一个要被设置为此窗格的ID的UINT值的引用。
nStyle | 对一个要被设置为此窗格的风格的UINT值的引用。
cxWidth | 对一个要被设置为此窗格的宽度的整数值的引用。

说明：
此成员函数用nID，nStyle和cxWidth来设置位于由nIndex指定的位置的指示器窗格的ID，风格和宽度。

请参阅：
CStatusBar::SetPaneInfo, CStatusBar::GetItemID, CStatusBar::GetItemRect


 CStatusBar::GetPaneStyle

UINT GetPaneStyle( int nIndex ) const;

返回值：
返回由nIndex指定的状态条窗格的风格。

参数：
nIndex 要获取其风格的窗格的索引。

说明：
此成员函数用来获取一个状态条窗口的风格。一个窗格的风格确定窗格显示的外观。
有关一个状态条的可用风格的列表，参见Create。

请参阅：CStatusBar::Create, CStatusBar::SetPaneStyle


 CStatusBar::GetPaneText

CString GetPaneText( int nIndex ) const;
void GetPaneText(int nIndex, CString& rString ) const;

返回值：
返回一个包含窗格的文本的CString对象。

参数：
nIndex | 要获取其文本的窗格的索引。
rString | 对一个包含要获取的文本的CString对象的引用。

说明：
此成员函数用来获取显示在一个状态条窗格中的文本。此成员函数的第二种形式用字符串文本来填充一个CString对象。

请参阅：CStatusBar::SetPaneText


 CStatusBar::GetStatusBarCtrl

CStatusBarCtrl& GetStatusBarCtrl( ) const;

返回值：
返回一个对CStatusBarCtrl对象的引用。

说明：
使用CStatusBarCtrl可以利用Windows状态条通用控件的性能，并且可以利用CStatusBarCtrl提供的对状态条定制的支持。例如，通过使用这个通用控件，你可以指定一种风格，使得状态条上有一个调整大小的把手，或者你可以指定一种风格，使得状态条显示在父窗口的客户区的顶端。
有关通用控件的更多信息，参见“Windows95 SDK程序员参考”中的通用控件。


 CStatusBar::SetIndicators

BOOL SetIndicators( const UINT* lpIDArray, int nIDCount );

返回值：如果成功则返回非零值；否则返回0。

参数：
lpIDArray | 指向一个ID数组的指针。
nIDCount | 由lpIDArray指向的数组的元素数目。

说明：
此成员函数用来将每一个指示器的ID设置为由数组lpIDArray的相应元素指定的值，加载由每一个ID指定的字符串资源，并将这个字符串设置为此指示器的文本。

请参阅：
CStatusBar::CStatusBar, CStatusBar::Create, CStatusBar::SetPaneInfo, CStatusBar::SetPaneText


 CStatusBar::SetPaneInfo

void SetPaneInfo( int nIndex, UINT nID, UINT nStyle, int cxWidth );

参数：
nIndex | 要设置其风格的指示器窗格的索引。
nID | 该指示器窗格的新ID。
nStyle | 该指示器窗格的新风格。
cxWidth | 该指示器窗格的新宽度。

说明：
此成员函数用来设置指示器窗格的新ID，风格和宽度。
下面的指示器风格是被支持的：
· | SBPS_NOBORDERS | 在窗格周围没有3-D边框。
· | SBPS_POPOUT | 反转边界以使文字“凸出来”。
· | SBPS_DISABLED | 不绘制文本。
· | SBPS_STRETCH | 扩大窗格以填充不用的空白空间。没有状态条只能有一个窗格具有这种风格。
· | SBPS_NORMAL | 没有扩展，边界或“凸出来”。

请参阅：CStatusBar::GetPaneInfo


 CStatusBar::SetPaneStyle

void SetPaneStyle( int nIndex, UINT nStyle );

参数：
nIndex | 要设置其风格的窗格的索引。
nStyle | 要设置的窗格的风格。

说明：
此成员函数用来设置一个状态条窗格的风格。窗格的风格决定了窗格是怎么显示的。
有关状态条可用风格的列表，参见SetPaneInfo。

请参阅：CStatusBar::Create, CStatusBar::GetPaneStyle


 CStatusBar::SetPaneText

BOOL SetPaneText( int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE );

返回值：如果成功则返回非零值；否则返回0。

参数：
nIndex | 要设置其文本的窗格的索引。
lpszNewText | 指向新的窗格文本的指针。
bUpdate | 如果是TRUE，则在文本被设置之后，窗格是无效的。

说明：
此成员函数用来将窗格文本设置为由lpszNewText指定的字符串。

请参阅：CStatusBar::GetPaneText


 CStatusBarCtrl

CObject
└CCmdTarget
└CWnd
└CStatusBarCtrl

一个“状态条控件”是一个水平的窗口，通常显示在一个父窗口的底部，在其中应用程序可以显示不同类型的状态信息。可以将此状态条控件分割为多个部分，用来显示多种类型的信息。
CStatusBarCtrl类提供了Windows通用状态条控件的性能。这个控件（也就是CStatusBarCtrl类）只对运行在Windows 95和Windows NT3.51或更新版本下的程序来说是可用的。
有关使用CStatusBarCtrl的更多信息，参见“Visual C++程序员指南”中的“控件主题”和“使用CStatusBarCtrl”。
#include <afxcmn.h>
请参阅：CToolBarCtrl

CStatusBarCtrl类成员

构造
CStatusBarCtrl | 构造一个CStatusBarCtrl对象
Create | 创建一个状态条控件并将它与一个CStatusBarCtrl对象连接

属性
SetText | 设置一个状态条控件的给定部分中的文本
GetText | 从一个状态条控件的给定部分中获取文本
GetTextLength | 从一个状态条控件的给定部分获取文本的用字符数目表示的长度
SetParts | 设置一个状态条控件中的部分数目，以及每一个部分的右边缘的坐标
GetParts | 获取一个状态条控件中的部分数目
GetBorders | 获取一个状态条控件的水平或垂直边界的对齐宽度
SetMinHeight | 设置一个状态条控件的绘制区域的最小高度
SetSimple | 指定一个状态条控件是显示简单的文本，还是显示由前一次调用SetParts设置的所有控件部分
GetRect | 获取一个状态条控件中的一个部分的边界矩形
IsSimple | 检查一个状态条窗口控件以确定它是否处于简单模式
GetTipText | 获取状态条中的一个窗格的工具提示文本
SetTipText | 设置状态条中的一个窗格的工具提示文本
SetBkColor | 设置一个状态条控件中的背景颜色
SetIcon | 设置状态条控件中的窗格的图标

可重载
DrawItem 当一个属主绘制的状态条控件的外观改变时调用此函数


 CStatusBarCtrl::Create

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

返回值：如果成功则返回非零值；否则返回零。

参数：
dwStyle | 指定状态条控件的风格。状态条控件风格的任意组合都适用于这个控件。这个参数必须包括WS_CHILD风格。它也必须包括WS_VISIBLE风格。参见说明部分可以获得更多信息。
rect | 指定状态条控件的大小和位置。它可以是一个CRect对象或一个RECT结构。
pParentWnd | 指定状态条控件的父窗口，通常是一个CDialog。它不能是NULL。
nID | 指定状态条控件的ID。

说明：
构造一个CStatusBarCtrl对象可以分两步。首先调用构造函数，然后调用Create来创建状态条控件并将它与CStatusBarCtrl对象连接。
dwStyle参数可以是下列值的任意组合：
· | CCS_BOTTOM | 使控件将它自己定位在父窗口的客户区的底端，并将宽度设置为与父窗口的宽度一样。状态条控件将此作为它的缺省风格。
· | CCS_NODIVIDER | 禁止在控件的顶部绘制两个像素的高亮区。
· | CCS_NOHILITE | 禁止在控件的顶部绘制一个像素的高亮区。
· | CCS_NOMOVEY | 使控件响应WM_SIZE消息，调整自己的大小并水平移动自己，但不是垂直移动。如果使用了CCS_NORESIZE风格，则此风格不能使用。
· | CCS_NOPARENTALIGE | 禁止控件自动移动到父窗口的顶部或底部。不管控件的父窗口的尺寸怎么改变，控件都保持它在父窗口中的位置。如果也使用了CCS_TOP和CCS_BOTTOM风格，则高度被调整为缺省值，但位置和宽度仍然保持不变。
· | CCS_NORESIZE | 当控件设置它自己的初始尺寸和新尺寸时，禁止控件使用缺省的宽度和高度。而是用在创建或调整大小的请求中指定的宽度和高度。
· | CCS_TOP | 使控件将自己定位在其父窗口的顶部，并将自己的宽度设置为与父窗口的宽度一样。
一个状态窗口的缺省位置是沿着父窗口的底部，但是你也可以指定CCS_TOP风格来使它显示在父窗口的客户区的顶部。还可以指定SBARS_SIZEGRIP风格来使它包括一个位于状态窗口右端的调整大小的把手。并不建议组合CCS_TOP和SBARS_SIZEGRIP风格，因为这样获得的调整大小把手是没有用的，尽管系统将它绘制在了状态窗口中。

请参阅：CStatusBarCtrl::CStatusBarCtrl


 CStatusBarCtrl::CStatusBarCtrl

CStatusBarCtrl( );

说明：
此成员函数用来构造一个CStatusBarCtrl控件。

请参阅：CStatusBarCtrl::Create


 CStatusBarCtrl::DrawItem

virtual void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );

参数：
lpDrawItemStruct 一个指向DRAWITEMSTRUCT结构的长指针。该结构包含了有关所要求的绘制的类型的信息。

说明：
当一个属主绘制的状态条控件的外观发生改变时框架调用此成员函数。DRAWITEMS- TRUCT结构的itemAction成员定义了要执行的绘制动作。
缺省的，这个成员函数不做任何事情。重载这个成员函数来实现对一个属主绘制的CStatusBarCtrl对象的绘制。
在此成员函数终止之前，应用程序应该恢复在lpDrawItemStruct中提供的显示环境所选择的所有图形设备接口（GDI）。

请参阅：CWnd::OnDrawItem


 CStatusBarCtrl::GetBorders

BOOL GetBorders( int* pBorders ) const;
BOOL GetBorders( int& nHorz, int& nVert, int& nSpacing ) const;

返回值：如果成功则返回非零值；否则返回零。

参数：
pBorders | 一个有三个元素的整数数组的地址。第一个元素用来接收水平边界的宽度，第二个元素用来接收垂直边界的宽度，第三个元素用来接收矩形之间的边界的宽度。
nHorz | 是对一个用来接收水平边界宽度的整数的引用。
nVert | 是对一个用来接收垂直边界宽度的整数的引用。
nSpacing | 是对一个用来接收矩形之间的边界宽度的整数的引用。

说明：
此成员函数用来获取状态条控件的水平和垂直边界，以及矩形之间的空间的当前宽度。这些边界决定了控件的外部边缘和控件内部包含文本的矩形之间的间隔。

请参阅：
CStatusBarCtrl::GetParts, CStatusBarCtrl::SetParts


 CStatusBarCtrl::GetParts

int GetParts( int nParts, int* pParts ) const;

返回值：
如果成功则返回控件中的部分数；否则返回零。

参数：
nParts | 要获取其坐标的部分数。如果这个参数大于控件中的部分数，则只返回现有部分的坐标。
pParts | 一个整数数组的地址，该数组的元素个数与nParts指定的部分数一样。数组中的每一个元素都用来接收相应部分的右边缘的客户区坐标。如果一个元素被设置为-1，则表示该部分的右边缘扩展到了状态条的右边缘。

说明：
此成员函数用来获取一个状态条控件中的部分数。这个成员函数也用来获取给定数目的部分的右边缘的坐标。

请参阅：
CStatusBarCtrl::GetBorders, CStatusBarCtrl::SetParts


 CStatusBarCtrl::GetRect

BOOL GetRect( int nPane, LPRECT lpRect ) const;

返回值：如果成功则返回非零值；否则返回零。

参数：
nPane | 要获取其边界矩形的部分的从零开始的索引。
lpRect | 一个RECT结构的地址，该结构接收边界矩形。

说明：
此成员函数用来获取状态条控件中的一个部分的边界矩形。

请参阅：CStatusBarCtrl::GetParts


 CStatusBarCtrl::GetText

int GetText( LPCTSTR lpszText, int nPane, int* pType ) const;

返回值：文本的用字符数表示的长度。

参数：
lpszText | 用来接收文本的缓冲的地址。这个参数是一个用空字符结尾的字符串。
nPane | 要获取其文本的部分的从零开始的索引。
pType指向一个用来接收信息类型的整数的指针。这个类型可以是下列值中的一个：
· | 0 | 绘制的文本的一个边界看起来低于状态条平面。
· | SBT_NOBORDERS | 绘制的文本没有边界。
· | SBT_POPOUT | 绘制的文本的边界显示比状态条的平面高。
· | SBT_OWNERDRAW | 如果文本具有SBT_OWNERDRAW绘制风格，则pType接收这个消息并返回与文本关联的32位值，而不是长度和操作类型。

说明：
此成员函数用来从一个状态条控件的给定部分获取文本。

请参阅：
CStatusBarCtrl::SetText, CStatusBarCtrl::GetTextLength


 CStatusBarCtrl::GetTextLength

int GetTextLength( int nPane, int* pType ) const;

返回值：返回文本的用字符数表示的长度。

参数：
nPane 要获取其文本的部分的从零开始的索引。
pType指向一个用来接收信息类型的整数的指针。这个类型是下列值中的一个：
· | 0 | 绘制的文本的一个边界看起来低于状态条平面。
· | SBT_NOBORDERS | 绘制的文本没有边界。
· | SBT_OWNERDRAW | 文本是父窗口绘制的。
· | SBT_POPOUT | 绘制的文本的边界显示比状态条的平面高。

说明：
此成员函数用来从一个状态条控件中的给定部分获取文本的用字符数表示的长度。

请参阅：
CStatusBarCtrl::GetText, CStatusBarCtrl::SetText


 CStatusBarCtrl::GetTipText

CString GetTipText( int nPane ) const;

返回值：
返回一个CString对象，该对象包含了要被使用在工具提示中的文本。

参数：
nPane 要获取工具提示文本的状态条窗格的从零开始的索引。

说明：
此成员函数用来实现Win32消息SB_GETTIPTEXT的行为，就像在“Platform SDK”中描述的一样。

请参阅：CStatusBarCtrl::SetTipText


 CStatusBarCtrl::IsSimple

BOOL IsSimple( ) const;

返回值：
如果状态窗口控件是在简单模式下则返回非零值；否则返回零。

说明：
此成员函数用来实现Win32消息SB_ISSIMPLE行为，就像在“Platform SDK”中描述的一样。

请参阅：CStatusBarCtrl::SetSimple


 CStatusBarCtrl::SetBkColor

COLORREF SetBkColor( COLORREF cr );

返回值：
返回一个代表先前的缺省背景颜色的COLORREF值。

参数：
cr 是指定新的背景颜色的COLORREF值。如果指定的是CLR_DEFAULT值，则会导致状态条使用它的缺省背景颜色。

说明：
此成员函数用来实现Win32消息SB_SETBKCOLOR的行为，就像在“Platform SDK”中描述的一样。


 CStatusBarCtrl::SetIcon

BOOL SetIcon( int nPane, HICON hIcon );

返回值：
如果成功则返回非零值；否则返回零。

参数：
nPane | 将用来接收图标的窗格的从零开始的索引。如果此参数是-1，则状态条被假定为是一个简单状态条。
hIcon | 是要被设置的图标的句柄。如果这个值是NULL，则图标被从此部分中移走。

说明：
此成员函数用来实现Win32消息SB_SETICON的行为，就像在“Platform SDK”中描述的一样。


 CStatusBarCtrl::SetMinHeight

void SetMinHeight( int nMin );

参数：
nMin 控件的以像素表示的最小高度。

说明：
此成员函数用来设置一个状态条控件的绘画区的最小高度。这个最小高度是nMin和两倍的状态条控件的以像素表示的垂直边界的宽度的和。

请参阅：
CStatusBarCtrl::GetRect, CStatusBarCtrl::GetBorders


 CStatusBarCtrl::SetParts

BOOL SetParts( int nParts, int* pWidths );

返回值：如果成功则返回非零值；否则返回零。

参数：
nParts | 要设置的部分的数目。部分数不能大于255。
pWidths | 一个整数数组的地址，该数组的元素个数与nParts指定的数目一样。数组中的每一个元素以客户区坐标指定了相应部分的右边缘位置。如果某一个元素是-1，则相应部分的右边缘位置扩展到了该控件的右边缘。

说明：
此成员函数用来设置一个状态条控件中的部分数，以及每一部分的右边缘的坐标。

请参阅：
CStatusBarCtrl::GetBorders, CStatusBarCtrl::GetParts


 CStatusBarCtrl::SetSimple

BOOL SetSimple( BOOL bSimple = TRUE );

返回值：如果发生了错误则返回零。

参数：
bSimple 显示类型标志。如果这个参数是TRUE，则控件显示简单的文本；如果是FALSE，则它显示多个部分。

说明：
此成员函数用来指定一个状态条控件是显示简单文本，还是显示前面调用SetParts设置的所有控件部分。
如果状态条控件是从非简单模式改变到简单模式，或者是从简单到非简单，控件都会被重画。

请参阅：CStatusBarCtrl::SetParts


 CStatusBarCtrl::SetText

BOOL SetText( LPCTSTR lpszText, int nPane, int nType );

返回值：如果成功则返回非零值；否则返回零。

参数：
lpszText 一个以空字符结尾的字符串的地址，该字符串指定了要设置的文本。如果nType是SBT_OWNERDRAW，则lpszText表示32位的数据。
nPanenType绘制操作的类型。这个类型可以是下列值中的一个：
· | 0 | 绘制的文本的一个边界看起来低于状态条平面。
· | SBT_NOBORDERS | 绘制的文本没有边界。
· | SBT_OWNERDRAW | 文本是父窗口绘制的。
· | SBT_POPOUT | 绘制的文本的边界显示比状态条的平面高。

说明：
此成员函数用来在一个状态条控件的给定部分中设置文本。当控件下一次接收到WM_PAINT消息时，这是表示控件的该部分被改变的消息，导致该部分显示新的文本。

请参阅：
CStatusBarCtrl::GetText, CStatusBarCtrl::GetTextLength


 CStatusBarCtrl::SetTipText

void SetTipText( int nPane, LPCTSTR pszTipText );

参数：
nPane | 要接收工具提示文本的状态条窗格的从零开始的索引。
pszTipText | 一个指向包含工具提示文本的字符串的指针。

说明：
此成员函数用来实现Win32消息SB_SETTIPTEXT的行为，就像在“PlatformSDK”中描述的一样。

请参阅：CStatusBarCtrl::GetTipText


 CStdioFile

CObject
└CFile
└CStdioFile

一个CStdioFile对象代表一个用运行时函数fopen打开的C运行时流式文件。
流式文件是被缓冲的，而且可以以文本方式（缺省）或二进制方式打开。
文本方式提供对硬回车—换行符对的特殊处理。当你将一个换行符（0x0A）写入一个文本方式的CStdioFile对象时，字节对（0x0A，0x0D）被发送给该文件。当你读一个文件时，字节对（0x0A，0x0D）被翻译为一个字节（0x0A）。
当你读一个文件时，字节对（0x0A，0x0D）被翻译为一个字节（0x0A）。
CStdioFile不支持Duplicate，LockRange，和UnlockRange这几个CFile函数。如果在CStdioFile中调用了这几个函数，将会出现CNoSupported异常。
有关使用CStdioFile的更多信息，参见“Visual C++程序员指南”中的文章“MFC文件”，和“Microsoft Visual C++库参考”中的“Microsoft Visual C++ 6.0运行库参考”。
#include <afx.h>

请参阅：
CFile, CFile::Duplicate, CFile::LockRange, CFile::UnlockRange, CNotSupportedException

CStdioFile类成员

数据成员
m_pStream 包含了一个指向打开文件的指针

构造
CStdioFile 从一个路径或文件指针构造一个CStdioFile对象

文本读/写
ReadString | 读取一行文本
WriteString | 写一行文本


 CStdioFile::CStdioFile

CStdioFile( );
CStdioFile( FILE* pOpenStream );
CStdioFile( LPCTSTR lpszFileName, UINT nOpenFlags );
throw( CFileException );

参数：
pOpenStream | 指定由C运行时函数fopen调用返回的文件指针。
lpszFileName | 指定表示需要文件的路径的字符串。该路径可以是相对路径，也可以是绝对路径。
nOpenFlags | 共享和访问方式。指定当文件打开时要进行的动作。可以通过使用位或OR（|）操作符来组合选项。需要一个访问允许和一个文本—二进制标识符；create和noInherit方式是可选的。参见CFile::CFile可以获得方式选项和其它标志的列表。在MFC 3.0及以后版本中，共享标志是允许的。

说明：
此构造函数的缺省版本与CFile::Open成员函数联合工作以测试错误。
一个参数的构造函数版本从一个已经打开的文件的指针构造一个CStdioFile对象。允许指针值包括预定义的输入/输出文件指针stdin，stdout，和stderr。
两个参数的构造函数版本构造一个CStdioFile对象并根据给定的路径打开相应的操作系统文件。
如果不能被打开或创建则抛出CFileException。

示例：
// CStdioFile::CStdioFile示例：
char* pFileName = "test.dat";
CStdioFile f1;
if( !f1.Open( pFileName, CFile::modeCreate | CFile::modeWrite | CFile::typeText ) )
{
#ifdef _DEBUG
afxDump << "Unable to open file" << "\n";
#endif
exit(1);
}

CStdioFile f2( stdout );
TRY
{
CStdioFile f3( pFileName, CFile::modeCreate | CFile::modeWrite | CFile::typeText );
}
CATCH( CFileException, e )
{
#ifdef _DEBUG
afxDump << "File could not be opened!" << e->m_cause << "\n";
#endif
}
END_CATCH


 CStdioFile::ReadString

virtual LPTSTR ReadString( LPTSTR lpsz, UINT nMax );
throw( CFileException );
BOOL ReadString(CString& rString);
throw( CFileException );

返回值：
返回一个指向包含文本数据的缓存的指针。如果在到达文件结尾后没有读到任何数据，则返回NULL；或者是返回布尔值FALSE。

参数：
lpsz | 指定一个指向用户提供的缓冲区的指针；该缓冲区将接收一个以空字符结尾的文本字符串。
nMax | 指定要读取的最大字符数，不计算结尾的空字符。
rString | 是一个对CString对象的引用，当函数返回时，该对象将包含了所读取的字符串。

说明：
此成员函数用来从与CStdioFile对象关联的文件中将文本数据读入一个缓冲区，读取的字符数不超过nMax-1。在碰到第一个换行符时停止读取。在这种情况下，如果读取的字符数小于nMax-1，则将一个换行符保存在缓冲区中。在任何情况下，都在最后添加一个空字符（“0”）。
对于文本方式的输入，CFile::Read也是可用的，但它不会在一个回车换行符处停止。

注意：
这个函数的CString版本将“/n”删除（如果有的话）；LPTSTR版本则不删除。

示例：
// example for CStdioFile::ReadString
extern CStdioFile f;
char buf[100];
f.ReadString(buf,99);

请参阅：CStdioFile::WriteString, CFile::Read


 CStdioFile::WriteString

virtual void WriteString( LPCTSTR lpsz );
throw( CFileException );

参数：
lpsz 指定一个指向存放了以空字符结尾的文本字符串的缓冲区的指针。

说明：
此成员函数将一个缓冲区中的数据写入与CStdioFile对象关联的文件中。结束的空字符（“\0”）不被写入该文件。lpsz中的所有换行符都被以一个硬回车—换行符对写入该文件。
在响应某些条件（如磁盘已满条件）时，WirteString抛出一个异常。
这是一个面向文本的写函数，它对CStdioFile及其后代，以及CArchive来说是可用的。CFile::Write也是可用的，但是它不是在一个空字符处终止，而是将要求的字节数写入文件中。

示例：
// example for CStdioFile::WriteString
extern CStdioFile f;
char buf [ ] = "test string";
f.WriteString(buf);

请参阅：CArchive::ReadString, CFile::Write


 CStdioFile::m_pStream

说明：
m_pStream数据成员是指向一个打开文件的指针，该文件是由C运行时函数fopen返回的。如果文件从来没有被打开过或者已经被关闭了，则它是NULL。


 CString

CString没有基类。
一个CString对象由可变长度的一队字符组成。CString使用类似于Basic的语法提供函数和操作符。连接和比较操作符以及简化的内存管理使CString对象比普通字符串数组容易使用。
CString是基于TCHAR数据类型的对象。如果在你的程序中定义了符号_UNICODE，则TCHAR被定义为类型wchar_t，即16位字符类型；否则，TCHAR被定义为char，即8位字符类型。在UNICODE方式下，CString对象由16位字符组成。非UNICODE方式下，CString对象由8位字符组成。
当不使用_UNICODE时，CString是多字节字符集（MBCS，也被认为是双字节字符集，DBCS）。注意，对于MBCS字符串，CString仍然基于8位字符来计算，返回，以及处理字符串，并且你的应用程序必须自己解释MBCS的开始和结束字节。
CString对象还具有下列特征：
· | CString可作为连接操作的结果而增大。
· | CString对象遵循“值语义”。应将CString看作是一个真实的字符串而不是指向字符串的指针。
· | 你可以使用CString对象任意替换const char*和LPCTSTR函数参数。
· | 转换操作符使得直接访问该字符串的字符就像访问一个只读字符（C-风格的字符）数组一样。
提示：如果可能的话，应在框架中而不是堆中分配这个CString对象。这可以节省内存并简化参数的传递。
CString允许两个具有相同值的字符串共享相同的缓冲空间，这有助于你节省内存空间。但是，如果你初始直接改变该缓冲的内容（不使用MFC），则有可能在无意中改变了两个字符串。CString提供了两个成员函数CString::LockBuffer和CString::UnlockBuffer来帮助你保护你的数据。当你调用LockBuffer时，你就创建了一个字符串的一个拷贝，然后将引用计数设置为-1，这就“加锁”了该缓冲区。当缓冲区被加锁时，就没有其它的字符串可以引用该字符串中的数据，被加锁的字符串也不能引用其它字符串的数据。通过加锁该缓冲区内的字符串，就可以保证该字符串对数据的持续独占。当你使用完数据后，调用UnlockBuffer来将引用计数恢复为1。
更多的信息，参见“Visual C++程序员指南”中的“MFC字符串”和“字符串：Unicode和多字节字符集（MBCS）支持”，以及“Microsoft Visual C++库参考”中的“Microsoft Visual C++ 6.0运行库参考”。
#include <afx.h>

请参阅：
在“Visual C++ 程序员指南”中的：字符串：基本的CString操作，字符串：CString语义，字符串：CString与C字符串相关的操作，字符串：CString异常清除，字符串：CString参数传递

CString类成员

构造
CString 以各种方法构造一个CString对象

字符串数组
GetLength | 返回CString对象中的字符数。对多字节字符，按8位字符计算；即在一个多字节字符中一个开始和结束字节算作两个字符
IsEmpty | 测试一个CString对象中是否不含有字符
Empty | 强制一个字符串的长度为0
GetAt | 返回在给定位置的字符
operator [] | 返回在给定位置的字符--它是代替GetAt的操作符
SetAt | 设置给定位置上的字符
operator LPCTSTR | 像访问一个C风格的字符串一样，直接访问保存在一个CString对象中的字符

分配/串联
operator = | 给CString对象赋一个新值
operator + | 连接两个字符串并返回一个新字符串
operator += | 把一个新字符串连接到一个已经存在的字符串的末端

比较
operator 比较操作符 | 比较操作符（大小写敏感）
Compare | 比较两个字符串（大小写敏感）
CompareNoCase | 比较两个字符串（不区分大小写）
Collate | 比较两个字符串（大小写敏感，使用现场特别信息）
CollateNoCase | 比较两个字符串（不区分大小写，使用现场特别信息）

提取
Mid | 提取一个字符串的中间一部分（类似于BASIC的MID$函数）
Left | 提取一个字符串的左边一部分（类似于BASIC的LEFT$函数）
Right | 提取一个字符串的右边一部分（类似于BASIC的RIGHT$函数）
SpanIncluding | 提取一个字符串，该子字符串中仅含有某一字符集合中的字符。
SpanExcluding | 提取一个字符串，该子字符串中不含有某一字符集合中的字符。

其他转换
MakeUpper | 将字符串中的所有字符转换为大写字符
MakeLower | 将字符串中的所有字符转换为小写字符
MakeReverse | 将字符串中的字符以倒序排列
Replace | 用其它字符替换指定的字符
Remove | 从一个字符串中移走指定的字符
Insert | 在字符串中的给定索引处插入一个字符或一个子字符串
Delete | 从一个字符串中删除一个或多个字符
Format | 像sprintf函数一样格式化该字符串
FormatV | 像vprintf函数一样格式化该字符串
TrimLeft | 将字符串中前面的空格整理出字符串
TrimRight | 将字符串中结尾的空格整理出字符串
FormatMessage | 格式化一个消息字符串

搜索
Find | 在一个较大的字符串中查找字符或子字符串
ReverseFind | 在一个较大的字符串中从末端开始查找某个字符
FindOneOf | 查找与某个字符集合中的字符相匹配的第一个字符

归档/存储
operator << | 把一个CString对象插入一个存档或转储的环境中
operator >> | 从一个存档中提取一个CString对象

缓冲区访问
GetBuffer | 返回一个指向CString对象的指针
GetBufferSetLength | 返回一个指向CString对象的指针，字符串被截断为指定的长度
ReleaseBuffer | 释放对GetBuffer所返回的缓冲区的控制权
FreeExtra | 通过释放原先为此字符串分配的额外内存来删除此字符串对象的额外开销
LockBuffer | 使引用计数无效并保护缓冲区内的数据
UnlockBuffer | 使引用计数有效并释放缓冲区中的数据

Windows专用
AllocSysString | 由CString数据分配一个BSTR
SetSysString | 使用CString对象中的数据来设置一个已存在的BSTR
LoadString | 从一个Windows资源中加载一个已经存在的CString对象
AnsiToOem | 实现由ANSI字符集到OEM字符集的对应转换
OemToAnsi | 实现由OEM字符集到ANSI字符集的对应转换


 CString::AllocSysString

BSTR AllocSysString ( ) const;
throw( CMemoryException );

返回值：指向新分配的字符串。

说明：
此成员函数分配一个BSTR类型的新的OLE的兼容Automation字符串，并把包括空结束符在内的此CString对象的内容拷贝到其中，若内存不足，则发出CMemoryException异常。这个函数通常是用来为OLE自动化返回字符串。
在很少的情况下，你需要使用::SysFreeString来重新分配此函数返回的字符串的存储单元。
注意：如果你使用的是一个共享库的MFC并且是在调试模式下生成的，则你必须与MFCO42D.DLL连接来获得这个函数。通过在STDAFX.H文件中包括<afxdisp.h>，可以使连接程序自动获得MFCO42D.DLL。
有关Windows中的OLE分配函数的更多信息，参见“Win32 SDK OLE程序员参考”中的::SysAllocString和::SysFreeString。

请参阅：::SysAllocString, ::SysFreeString, CMemoryException


 CString::AnsiToOem

void AnsiToOem( );

说明：
此成员函数将CString对象中的所有字符由ANSI字符集转换为OEM字符集。参见“Microsoft Visual C++6.0参考库”中的“Microsoft Visual C++6.0语言参考”卷中的“ANSI字符代码表”。

请参阅：CString::OemToAnsi


 CString::Collate

int Collate( LPCTSTR lpsz ) const;

返回值：
如果两个字符串是一样的，则返回非零值；如果CString对象小于lpsz则返回值<0；如果此CString对象大于lpsz则返回值>0。

参数：
lpsz 要用于比较的另一个字符串。

说明：
此成员函数通过使用通用文本函数_tcscoll来比较这个CString对象和另一个字符串。此通用文本函数_tcscoll是在TCHAR.H中定义的，根据在编译时设置的字符来与strcoll，wcscoll，或_mbscoll对应。这些函数的每一个都根据当前使用的代码页来进行一次区分大小写的比较。更多的信息，参见“Microsoft VisualC++ 6.0运行时库参考”中的strcat，wcscat，_mbscat。

请参阅：CString::Compare, CString::CompareNoCase


 CString::CollateNoCase

int CollateNocase( LPCTSTR lpsz ) const;

返回值：
如果字符串是一样的（不区分大小写）则返回非零值；如果CString对象小于lpsz（不区分大小写）则返回值<0，如果CString对象大于lpsz（不区分大小写）则返回值>0。

参数：
lpsz 指向要用于比较的另一个字符串的指针。

说明：
此成员函数通过使用通用文本函数_tcscoll来比较这个CString对象和另一个字符串。此通用文本函数_tcscoll是在TCHAR.H中定义的，根据在编译时设置的字符来与stricoll，wcsicoll，或_mbsicoll对应。这些函数的每一个都根据当前使用的代码页来进行一次不区分大小写的比较。

请参阅：
CString::Collate, CString::CompareNoCase, CString::Compare


 CString::Compare

int Compare( LPCTSTR lpsz ) const;

返回值：
如果字符串是一样的则返回非零值；如果CString对象小于lpsz则返回值<0，如果CString对象大于lpsz则返回值>0。

参数：
lpsz 要用于比较的另一个字符串。

说明：
此成员函数通过使用通用文本函数_tcscmp来比较这个CString对象和另一个字符串。此通用文本函数_tcscmp是在TCHAR.H中定义的，根据在编译时设置的字符来与strcmp，wcscmp，或_mbscmp对应。这些函数的每一个都根据当前使用的代码页来进行一次区分大小写的比较，而且不会被现场影响。更多的信息，参见“Microsoft Visual C++ 6.0运行库参考”中的strcmp，wcscmp，_mbscmp。

示例：下面的例子说明了如何使用CString::Compare。
// CString::Compare示例：
CString s1( "abc" );
CString s2( "abd" );
ASSERT( s1.Compare( s2 ) == -1 ); // 与另一个CString比较。
ASSERT( s1.Compare( "abe" ) == -1 ); // 与LPTSTR字符串比较。

请参阅：
CString::CompareNoCase, CString::Collate, CString::CollateNoCase


 CString::CompareNoCase

int CompareNoCase( LPCTSTR lpsz ) const;

返回值：
如果字符串是一样的（不区分大小写）则返回非零值；如果CString对象小于lpsz（不区分大小写）则返回值<0，如果CString对象大于lpsz（不区分大小写）则返回值>0。

说明：
此成员函数通过使用通用文本函数_tcsicmp来比较这个CString对象和另一个字符串。此通用文本函数_tcsicmp是在TCHAR.H中定义的，根据在编译时设置的字符来与_stricmp，_wcsicmp，或_mbsicmp对应。这些函数的每一个都根据当前使用的代码页来进行一次区分大小写的比较，而且不会被现场影响。更多的信息，参见“Microsoft Visual C++ 6.0运行库参考”中的_stricmp，_wcsicmp，_mbsicmp。

示例：下面的例子说明了如何使用CString::CompareNoCase。
// CString::CompareNoCase示例：
CString s1( "abc" );
CString s2( "ABD" );
ASSERT( s1.CompareNoCase( s2 ) == -1 ); // 与一个CString比较。
ASSERT( s1.Compare( "ABE" ) == -1 ); // 与LPTSTR字符串比较。

请参阅：
CString::Compare, CString::Collate, CString::CollateNoCase


 CString::比较操作符

BOOL operator ==( const CString& s1, const CString& s2 );
BOOL operator ==( const CString& s1, LPCTSTR s2 );
BOOL operator ==( LPCTSTR s1, const CString& s2 );
BOOL operator !=( const CString& s1, const CString& s2 );
BOOL operator !=( const CString& s1, LPCTSTR s2 );
BOOL operator !=( LPCTSTR s1, const CString& s2 );
BOOL operator < ( const CString& s1, const CString& s2 );
BOOL operator < ( const CString& s1, LPCTSTR s2 );
BOOL operator < ( LPCTSTR s1, const CString& s2 );
BOOL operator > ( const CString& s1, const CString& s2 );
BOOL operator > ( const CString& s1, LPCTSTR s2 );
BOOL operator > ( LPCTSTR s1, const CString& s2 );
BOOL operator <=( const CString& s1, const CString& s2 );
BOOL operator <=( const CString& s1, LPCTSTR s2 );
BOOL operator <=( LPCTSTR s1, const CString& s2 );
BOOL operator >=( const CString& s1, const CString& s2 );
BOOL operator >=( const CString& s1, LPCTSTR s2 );
BOOL operator >=( LPCTSTR s1, const CString& s2 );

返回值：如果字符串满足比较条件则返回非零值；否则返回0。

参数：
s1, s2 要比较的CString对象。

说明：
这些比较操作符用来比较两个字符串。它们是区分大小写的Compare成员函数的方便的代用符。

示例：
// CString比较操作符示例：
CString s1( "abc" );
CString s2( "abd" );
ASSERT( s1 < s2 ); // Operator is overloaded for both.
ASSERT( "ABC" < s1 ); // CString and char*
ASSERT( s2 > "abe" );


 CString::CString

CString( );
CString( const CString& stringSrc );
throw( CMemoryException );
CString( TCHAR ch, int nRepeat = 1 );
throw( CMemoryException );
CString( LPCTSTR lpch, int nLength );
throw( CMemoryException );
CString( const unsigned char* psz );
throw( CMemoryException );
CString( LPCWSTR lpsz );
throw( CMemoryException );
CString( LPCSTR lpsz );
throw( CMemoryException );

参数：
stringSrc | 一个已经存在的CString对象，它要被拷贝到此CString对象中。
ch | 要被重复nRepeat次的单个字符。
nRepeat | 要对ch重复的次数。
lpch | 一个指向字符数组的指针，该字符数组的长度是nLength，不包括结尾的空字符。
nLength | pch中的字符的个数。
psz | 一个要被拷贝到此CString对象中去的以空字符结尾的字符串。
lpsz | 一个要被拷贝到此CString对象中去的以空字符结尾的字符串。

说明：
这些构造函数的每一个都用来以指定的数据初始化一个新的CString对象。
由于构造函数是将输入数据拷贝到新分配的存储区，所以你应该注意可能会导致的内存异常。注意，这些构造函数中的某些函数的作用相当于一个转换函数。这就允许你使用替换物，例如在一个需要CString对象的地方用一个LPTSTR来代替。
此构造函数的某几种形式具有特殊的目的：
· | CString( LPCSTR lpsz ) | 从一个ANSI字符串构造一个Unicode CString。你可以象下面的例子那样用这个函数来加载一个字符串资源。
· | CString( LPCWSTR lpsz ) | 从一个Unicode字符串构造一个CString。
· | CString( const unsigned char* psz ) | 从一个指向unsigned char的指针构造一个CString。
想了解更多的信息，请参阅“Visual C++ 程序员指南”随机文中的“String:CString Exception Cleanup ”一节。

示例：下面的例子说明了如何使用String::CString。
// CString::CString示例：
CString s1; // 空字符串
CString s2( "cat" ); // 从一个文字的C字符串
CString s3 = s2; // 拷贝构造函数
CString s4( s2 + " " + s3 ); // 从一个字符串表达式
CString s5( 'x' ); // s5 = "x"
CString s6( 'x', 6 ); // s6 = "xxxxxx"
CString s7((LPCSTR)ID_FILE_NEW); // s7 = "Create a new document"
CString city = "Philadelphia"; // 不是赋值操作符

请参阅：CString::operator =


 CString::Delete

int Delete( int nIndex, int nCount = 1);
throw( CMemoryException ) ;

返回值：返回已改变的字符串的长度。

参数：
nIndex | 要删除的第一个字符的索引。
nCount | 要删除的字符数。

说明：
此成员函数用来从一个字符串中从nIndex开始的地方删除一个或多个字符。如果nCount比此字符串还要长，则字符串的其余部分都将被删除。

示例：
// 下面的例子说明了如何使用CString::Delete。
str2 = "Hockey is best!";
printf( "Before: %s\n, (LPCTSTR) str2 );
int n = str2.Delete(6, 3);
printf( "After: %s\n*, (LPCTSTR) str2 );
ASSERT( n == str2.Getlength ( ) );
// 这些代码产生下面的删除行：
Before: Hockey is best!
After: Hockey best!

请参阅：CString::Insert


 CString::Empty

void Empty( );

说明：
此成员函数用来使CString对象成为一个空字符串，并释放相应的内存。
更多的信息，参见“Visual C++程序员指南”中的“字符串：CString异常清除”。

示例：下面的例子说明了如何使用CString::Empty。
// CString::Empty示例：
CString s( "abc" );
s.Empty();
ASSERT( s.GetLength( ) == 0 );

请参阅：CString::IsEmpty


 CString::Find

int Find( TCHAR ch ) const;
int Find( LPCTSTR lpszSub ) const;
int Find( TCHAR ch, int nStart ) const;
int Find( LPCTSTR lpszSub, int nStart ) const;

返回值：
返回此CString对象中与需要的子字符串或字符匹配的第一个字符的从零开始的索引；如果没有找到子字符串或字符则返回-1。

参数：
ch | 要搜索的单个字符。
lpszSub | 要搜索的子字符串。
nStart | 字符串中开始搜索的字符的索引，如果是0，则是从头开始搜索。如果nStart不是0，则位于nStart处的字符不包括在搜索之内。
pstr | 指向要搜索的字符串的指针。

说明：
此成员函数用来在此字符串中搜索子字符串的第一个匹配的字符。函数的重载可以接收单个字符（类似于运行时函数strchr）和字符串（类似于strstr）。

示例：
//下面演示第一个例子
// CString::Find( TCHAR ch )
CString s( "abcdef" );
ASSERT( s.Find( 'c' ) == 2 );
ASSERT( s.Find( "de" ) == 3 );

// 下面演示第二个例子
// CString::Find(TCHAR ch,int nStart)
CString str("The stars are aligned");
int n = str.Find('e',5);
ASSERT(n == 12)

请参阅：CString::ReverseFind, CString::FindOneOf


 CString::FindOneOf

int FindOneOf( LPCTSTR lpszCharSet ) const;

返回值：
返回此字符串中第一个在lpszCharSet中也包括的字符的从零开始的索引。

参数：
lpszCharSet 包含用于匹配字符的字符串。

说明：
此成员函数在此字符串中搜索与lpszCharSet中任意字符匹配的第一个字符。

示例：下面的例子说明了如何使用CString::FindOneOf。
// CString::FindOneOf示例：
CString s( "abcdef" );
ASSERT( s.FindOneOf( "xd" ) == 3 ); // 'd' is first match.

请参阅：CString::Find


 CString::Format

void Format( LPCTSTR lpszFormat, ... );
void Format( UINT nFormatID, ... );

参数：
lpszFormat | 一个格式控制字符串。
nFormatID | 包含格式控制字符串的字符串资源标识符。

说明：
此成员函数用来将格式化数据写入一个CString中，其方法就像sprintf函数向一个C-风格的字符数组中格式化输出数据一样。这个成员函数在CString中格式化并存储一系列字符和值。根据lpszFormat中指定的格式或nFormatID标识的字符串资源，函数中的每一个可选参数（如果有）都被转换并输出。
如果此字符串对象本身是作为Format的一个参数，则调用将失败。例如象下面的代码：
CString str = "Some Data";
str.Format("%s%d",str, 123); //注意：在参数列表中也使用了str将导致不可预期的结果。

当你传递一个字符串作为一个可选择的参数时，你必须显式地将它转换为LPCTSTR。这个格式与printf函数中的格式参数具有相同的形式和函数。（有关格式和参数的描述，参见“Microsofr Visual C++ 6.0运行库参考”中的printf。）在被写的字符串结尾将添加一个空字符。
更多的信息，参见“Microsofr Visual C++ 6.0运行时库参考”中的sprintf。

请参阅：CString::GetBuffer, CString::FormatV


 CString::FormatMessage

void FormatMessage( LPCTSTR lpszFormat, ... );
void FormatMessage( UINT nFormatID, ... );

参数：
lpszFormat | 指向格式控制字符串。它将被扫描来进行插入，从而进行格式化。这个格式字符串类似于运行时函数pritf-style格式字符串，除了这个字符串允许参数可以按任意顺序插入。
nFormatID | 包含还没有格式化的消息文本的字符串资源标识符。

说明：
此成员函数用来格式化一个消息字符串。此函数需要一个消息定义作为输入。该消息定义是由lpszFormat决定的，或者是来自由nFormatID标识的字符串资源。函数将这个格式化的消息文本拷贝到CString中，如果需要的话就处理任何嵌入的插入顺序。
每一次插入都必须有相应的参数跟随lpszFormat或nFormatID参数。在消息文本中，为了动态格式化消息，要支持几个转义序列。有关这些转义序列的描述和它们的意义，参见“Win32 SDK程序员参考”中的Windows::FormatMessage函数。

请参阅：
::FormatMessage, CString::LoadString, CString::Format


 CString::FormatV

void FormatV( LPCTSTR lpszFormat, va_list argList );

参数：
lpszFormat | 一个格式控制字符串。
argList | 要传递的参数列表。

说明：
此成员函数用来将格式化数据和一个参数变量列表写入一个CString中，其方法就像vsprintf函数向一个C-风格的字符数组中格式化输出数据一样。这个成员函数在CString中格式化并存储一系列字符和值。根据lpszFormat中指定的格式，函数中的每一个可选参数都被转换并输出。
如果此字符串对象本身是作为FormatV的一个次数，则调用将失败。例如象下面的代码：
CString str = "Some Data";
str.FormatV("%s%d",str, 123); //注意：在次数列表中也使用了str。
将导致不可预期的结果。
更多的信息，参见“Microsoft Visual C++ 6.0运行库参考”中的vsprintf。

示例：
// 使用CString::FormatV，你可以像下面这样来编写函数：
void WriteLogEntry( CStdioFile& refFile, LPCTSTR pstrFormat, ... )
{
CTime timeWrite;
timeWrite = CTime:GetCurrentTime( );
// 输出时间
CString str = timeWrite.Format ( "%d %b %y %H:%M:%S -");
refFile.Write( str, str.GetLength( ));
// 格式化并输出给定的数据
va_list args;
va_start( args, pstrFormat );
str.FormatV( pstrFormat, args );
refFile.Write( str, str.GetLength( ) );
// 插入一个换行符
refFile.Write( "n", 1 );
return;
}
你可以用任意个数的参数来调用上面的函数，例如：
WriteLogEntry( fileLog , "Program started*);
WriteLogEntry( fileLog , "Processed %d bytes* 91341 );
WriteLogEntry( fileLog , "%d error(s) found in %d line(s)", 10, 1351 );
WriteLogEntry( fileLog , "Program completed");
上面的例子将把输出添加到你的fileLog文件，就像下面给出的一样：
17 Apr 97 12:34:53 - Program started
17 Apr 97 12:34:59 - Processed 91341 bytes
17 Apr 97 12:35:22 - 10 error(s) found in 1351 line(s)
17 Apr 97 12:35:23 - Program completed

请参阅：CString::Format, va_start


 CString::FreeExtra

void FreeExtra( );

说明：
此成员函数用来释放原先被此字符串分配的但不再使用的额外的内存。这将减小此字符串的内存的额外开销。此函数按GetLength返回的准确长度来重新分配缓冲区。


 CString::GetAt

TCHAR GetAt( int nIndex ) const;

返回值：返回一个包含字符串中的指定位置的字符串的TCHAR。

参数：
nIndex CString对象中的某个字符的从零开始的索引。nIndex参数必须大于或等于0，并小于GetLength函数的返回值。Microsoft基础类库的测试版验证nIndex的边界；但是发行版不验证。

说明：
你可以把一个CString对象看作是一个字符数组。GetAt成员函数返回一个由一个索引号指定的单个字符。重载的下标（[]）是GetAt常用的代用符。

示例：下面的例子说明了如何使用CString::GetAt。
// CString::GetAt示例：
CString s( "abcdef" );
ASSERT( s.GetAt(2) == 'c' );

请参阅：
CString::GetAt, CString::GetLength, CString::operator []


 CString::GetBuffer

LPTSTR GetBuffer( int nMinBufLength );
throw( CMemoryException );

返回值：一个指向对象的（以空字符结尾的）字符缓冲区的LPTSTR指针。

参数：
nMinBufLength 字符缓冲区的以字符数表示的最小容量。这个值不包括一个结尾的空字符的空间。

说明：
此成员函数返回一个指向CString对象的内部字符缓冲区的指针。返回的LPTSTR不是const，因此可以允许直接修改CString的内容。
如果你使用由GetBuffer返回的指针来改变字符串的内容，你必须在使用其它的CString成员函数之前调用ReleaseBuffer函数。
在调用ReleaseBuffer之后，由GetBuffer返回的地址也许就无效了，因为其它的CString操作可能会导致CString缓冲区被重新分配。如果你没有改变此CString的长度，则缓冲区不会被重新分配。
当此CString对象被销毁时，其缓冲区内存将被自动释放。
注意，如果你自己知道字符串的长度，则你不应该添加结尾的空字符。但是，当你用ReleaseBuffer来释放该缓冲区时，你必须指定最后的字符串长度。如果你添加了结尾的空字符，你应该给ReleaseBuffer的长度参数传递-1，ReleaseBuffer将对该缓冲区执行strlen来确定它的长度。

示例：下面的例子说明了如何用CString::GetBuffer。
// CString::GetBuffer例子
CString s( "abcd" );
#ifdef _DEBUG
afxDump << "CString s" << s << "\n";
#endif
LPTSTR p = s.GetBuffer( 10 );
strcpy( p, "Hello" ); // 直接访问CString对象。
s.ReleaseBuffer( );
#ifdef _DEBUG
afxDump << "CString s " << s << "\n";
#endif

请参阅：
CString::GetBufferSetLength, CString::ReleaseBuffer


 CString::GetBufferSetLength

LPTSTR GetBufferSetLength( int nNewLength );
throw( CMemoryException );

返回值：
返回一个指向对象的（以空字符结尾的）字符缓冲区的LPTSTR指针。

参数：
nNewLength 此CString字符缓冲区的以字符数表示的精确容量。

说明：
此成员函数返回一个指向CString对象的内部字符缓冲区的指针，如果需要的话，切断或增长缓冲区的长度以精确匹配由nNewLength指定的长度。返回的LPTSTR不是const，因此可以允许直接修改CString的内容。
如果你使用由GetBuffer返回的指针来改变字符串的内容，你必须在使用其它的CString成员函数之前调用ReleaseBuffer函数。
在调用ReleaseBuffer之后，由GetBuffer返回的地址也许就无效了，因为其它的CString操作可能会导致CString缓冲区被重新分配。如果你没有改变此CString的长度，则缓冲区不会被重新分配。
当此CString对象被销毁时，其缓冲区内存将被自动释放。
注意，如果你自己知道字符串的长度，则你不应该添加结尾的空字符。但是，当你用ReleaseBuffer来释放该缓冲区时，你必须指定最后的字符串长度。如果你添加了结尾的空字符，你应该给ReleaseBuffer的长度参数传递-1，ReleaseBuffer将对该缓冲区执行strlen来确定它的长度。
有关引用计数的更多信息，参见下面的文章：
· | “Win 32 SDK程序员参考”中的“通过引用计数来管理对象的生命周期”。
· | “Win 32 SDK程序员参考”中的“实现引用计数”。
· | “Win 32 SDK程序员参考”中的“管理引用计数的规则”。

请参阅：CString::GetBuffer, CString::ReleaseBuffer


 CString::GetLength

int GetLength( ) const;

返回值：返回字符串中的字节计数。

说明：
此成员函数用来获取这个CString对象中的字节计数。这个计数不包括结尾的空字符。
对于多字节字符集（MBCS），GetLength按每一个8位字符计数；即，在一个多字节字符中的开始和结尾字节被算作两个字节。

示例：下面的例子说明了如何使用CString::GetLength。
// CString::GetLength示例：
CString s( "abcdef" );
ASSERT( s.GetLength() == 6 );

请参阅：CString::IsEmpty


 CString::Insert

int Insert( int nIndex, TCHAR ch );
throw( CMemoryException );
int Insert( int nIndex, LPCTSTR pstr );
throw( CMemoryException );

返回值：返回被改变的字符串的长度。

参数：
nIndex | 某个字符的索引，在这个字符的前面将要进行插入操作。
ch | 要插入的字符。
pstr | 一个指向要被插入的子字符串的指针。

说明：
此成员函数用来在字符串中的给定索引处插入一个单个字符或一个子字符串。
nIndex参数标识了将要被移走以给字符或子串空间的第一个字符。如果nIndex是零，则插入将方式在这个字符串之前。如果nIndex大于字符串的长度，则函数将把当前的字符串与由ch或pstr指定的新字符串连接起来。

示例：
// 下面的例子说明了如何使用CString::Insert。
CString str("HockeyBest");
int n = str.Insert( 6, "is" );
ASSERT( n == str.GetLength( ) );
printf( "1: %s\n", ( LPCTSTR ) str );
n = str.Insert( 6, ' ' );
ASSERT( n == str.GetLength( ) );
printf ( *2: %s\n*, (LPCTSTR) STR );
n = str.Insert(555,'1');
ASSERT( n == str.GetLength ( ) );
printf ( "3: %s\n", ( LPCTSTR ) str );
// 上面的代码将产生下面这些输出行：
1.Hockeyis Best
2.Hockey is Best
3.Hockey is Best!

请参阅：CString::Delete, CString::operator +


 CString::IsEmpty

BOOL IsEmpty( ) const;

返回值：如果CString对象的长度为0，则返回非零值；否则返回0。

说明：此成员函数用来测试一个CString对象是否是空的。

示例：下面的例子说明了如何使用CString::IsEmpty。
// CString::IsEmpty示例：
CString s;
ASSERT( s.IsEmpty() );

请参阅：CString::GetLength


 CString::Left

CString Left( int nCount ) const;
throw( CMemoryException );

返回值：
返回一个包含指定范围字符的拷贝的CString对象。注意，返回的CString对象可能是空的。

参数：
nCount 要从这个CString对象中提取的字符数。

说明：
此成员函数用来从此CString对象中提取最前面的nCount个字符，并返回被提取的子字符串的拷贝。如果nCount超过了字符串的长度，则整个字符串都被提取。Left类似与Basic LEFT$函数（除了索引是从零开始的）。
对于多字节字符集（MBCS），nCount指的是每8位字符的个数，即，在一个多字节字符中开始和结尾字节被算作两个字符。

示例：下面的例子说明了如何使用CString::Left。
// CString::Left示例：
CString s( _T("abcdef") );
ASSERT( s.Left(2) == _T("ab") );

请参阅：CString::Mid, CString::Right


 CString::LoadString

BOOL LoadString( UINT nID );
throw( CMemoryException );

返回值：如果加载资源成功则返回非零值；否则返回0。

参数：
nID 一个Windows字符串资源ID。

说明：
此成员函数用来读取一个由nID标识的Windows字符串资源，并放入一个已有的CString对象中。

示例：下面的例子说明了如何使用CString::LoadString。
// CString::LoadString示例：
#define IDS_FILENOTFOUND 1
CString s;
if (! s.LoadString( IDS_FILENOTFOUND ))
{
AfxMessageBox("Error Loading String: IDS_FILENOTFOUND");
...
}


 CString::LockBuffer

LPTSTR LockBuffer( );

返回值：返回一个指向CString对象的指针，或者是一个以NULL结尾的字符串。

说明：
此成员函数用来加锁缓冲区内的一个字符串。
通过调用LockBuffer，可以创建一个字符串的拷贝，然后将引用计数设置为-1。当引用计数被设置为-1时，缓冲区中的字符串被认为是处于“加锁”状态。当该字符串处于加锁状态时，字符串被从两个方面得到保护：
· | 没有其它的字符串能够获得对此加锁字符串中的数据的引用，即使是该字符串被赋予了加锁字符串。
· | 加锁字符串将不能引用其它的字符串，即使另一个字符串被拷贝到该加锁字符串中。
通过加锁缓冲区中的字符串，可以保证该字符串对缓冲区的独占保持完整。
在你完成了对LockBuffer的使用之后，调用UnlockBuffer来将该引用计数恢复到1。
有关引用计数的更多信息，参见下面的文章：
· | “Win 32 SDK程序员参考”中的“通过引用计数来管理对象的生命周期”。
· | “Win 32 SDK程序员参考”中的“实现引用计数”。
· | “Win 32 SDK程序员参考”中的“管理引用计数的规则”。

请参阅：
CString::UnlockBuffer, CString::GetBuffer, CString::ReleaseBuffer


 CString::MakeLower

void MakeLower( );

说明：此成员函数将此CString对象转换为一个小写字符串。

示例：下面的例子说明了如何使用CString::MakeLower。
// CString::MakeLower示例：
CString s( "ABC" );
s.MakeLower();
ASSERT( s == "abc" );

请参阅：CString::MakeUpper


 CString::MakeReverse

void MakeReverse( );

说明：此成员函数将此CString对象中的字符的顺序颠倒过来。

示例：下面的例子说明了如何使用CString::MakeReverse。
// CString::MakeReverse示例：
CString s( "abc" );
s.MakeReverse();
ASSERT( s == "cba" );


 CString::MakeUpper

void MakeUpper( );

说明：此成员函数将此CString对象转换为一个大写字符串。

示例：下面的例子说明了如何使用CString::MakeUpper。
// CString::MakeUpper示例：
CString s( "abc" );
s.MakeUpper();
ASSERT( s == "ABC" );

请参阅：CString::MakeLower


 CString::Mid

CString Mid( int nFirst ) const;
throw( CMemoryException );
CString Mid( int nFirst, int nCount ) const;
throw( CMemoryException );

返回值：
返回一个包含指定范围字符的拷贝的CString对象。注意，这个返回的CString对象可能是空的。

参数：
nFirst | 此CString对象中的要被提取的子串的第一个字符的从零开始的索引。
nCount | 要从此CString对象中提取的字符数。如果没有提供这个参数，则字符串的其余部分都被提取。

说明：
此成员函数从此CString对象中提取一个长度为nCount个字符的子串，从nFirst（从零开始的索引）指定的位置开始。此函数返回一个对所提取的字符串的拷贝。Mid类似于Basic MID$函数（除了索引是从零开始的）。
对于多字节字符集（MBCS），nCount指的是每8位字符的数目；也就是说，在一个多字节字符中开始和结尾字节被算作两个字符。

示例：下面的例子说明了如果如何使用CString::Mid。
// CString::Mid示例：
CString s( _T("abcdef") );
ASSERT( s.Mid( 2, 3 ) == _T("cde") );

请参阅：CString::Left, CString::Right


 CString::OemToAnsi

void OemToAnsi( );

说明：
此成员函数将此CString对象中的所有字符由OEM字符集转换成ANSI字符集。参见“Microsoft Visual C++ 6.0库参考”中的“Microsoft Visual C++ 6.0语言参考手册”卷中的“ANSI字符代码表”。
如果定义了_UNICODE，则这个函数是无效的。

请参阅：CString::AnsiToOem


 CString::ReleaseBuffer

void ReleaseBuffer( int nNewLength = -1 );

参数：
nNewLength 此字符串的以字符数表示的新长度，不计算结尾的空字符。如果这个字符串是以空字符结尾的，则参数的缺省值－1将把CString的大小设置为字符串的当前长度。

说明：
使用ReleaseBuffer来结束对由GetBuffer分配的缓冲区的使用。如果你知道缓冲区中的字符串是以空字符结尾的，则可以省略nNewLength参数。如果字符串不是以空字符结尾的，则可以使用nNewLength指定字符串的长度。在调用ReleaseBuffer或其它CString操作之后，由GetBuffer返回的地址是无效的。

示例：下面的例子说明了如何使用CString::ReleaseBuffer。
// CString::ReleaseBuffer示例：
CString s;s = "abc";
LPTSTR p = s.GetBuffer( 1024 );
strcpy(p, "abc"); // 直接使用该缓冲区
ASSERT( s.GetLength() == 3 ); // 字符串长度 = 3
s.ReleaseBuffer(); // 释放多余的内存，现在p无效。
ASSERT( s.GetLength() == 3 ); // 长度仍然是3

请参阅：CString::GetBuffer


 CString::Remove

int Remove ( TCHAR ch );

返回值：返回从字符串中移走的字符数。如果字符串没有改变则返回零。

参数：
ch 要从一个字符串中移走的字符。

说明：
此成员函数用来将ch实例从字符串中移走。与这个字符的比较是区分大小写的。

示例：// 从一个句子中移走小写字母'c':
CString str ("This is a test.");
int n = str.Remove( 't' );
ASSERT( n == 2 );
ASSERT( str == "This is a es." );

请参阅：CString::Replace


 CString::Replace

int Replace( TCHAR chOld, TCHAR chNew );
int Replace( LPCTSTR lpszOld, LPCTSTR lpszNew );

返回值：返回被替换的字符数。如果这个字符串没有改变则返回零。

参数：
chOld | 要被chNew替换的字符。
chNew | 要用来替换chOld的字符。
lpszOld | 一个指向字符串的指针，该字符串包含了要被lpszNew替换的字符。
lpszNew | 一个指向字符串的指针，该字符串包含了要用来替换lpszOld的字符。

说明：
此成员函数用一个字符替换另一个字符。函数的第一个原形在字符串中用chNew现场替换chOld。函数的第二个原形用lpszNew指定的字符串替换lpszOld指定的子串。
在替换之后，该字符串有可能增长或缩短；那是因为lpszNew和lpszOld的长度不需要是相等的。两种版本形式都进行区分大小写的匹配。

示例：
// 第一个例子，old 和new具有相同的长度。
CString strZap( "C--" );
int n = strZap.Replace('-', '+' );
ASSERT( n == 2 );
ASSERT(strZap == "C++" );
// 第二个例子，old和new具有不同的长度。
CString strBang("Everybody likes ice hockey");
n = strBang.Replace( "hockey", "golf" );
ASSERT( n == 1 )
n = strBang.Replace ( "likes" , "plays" );
ASSERT( n == 1 )
n = strBang.Replace( "ice", NULL );
ASSERT( n == 1 )
ASSERT( strBang == "Everybody plays golf" )
// 注意，现在在你的句子中有了一个额外的空格。
// 要移走这个额外的空格，可以将它包括在要被替换的字符串中，例如，“ice”。

请参阅：CString::Remove


 CString::ReverseFind

int ReverseFind( TCHAR ch ) const;

返回值：
返回此CString对象中与要求的字符匹配的最后一个字符的索引；如果没有找到需要的字符则返回-1。

参数：
ch 要搜索的字符。

说明：
此成员函数在此CString对象中搜索与一个子串匹配的最后一个字符。此函数类似于运行时函数strrchr。

示例：// CString::ReverseFind示例：
CString s( "abcabc" );
ASSERT( s.ReverseFind( 'b' ) == 4 );

请参阅：CString::Find, CString::FindOneOf


 CString::Right

CString Right( int nCount ) const;
throw( CMemoryException );

返回值：
返回一个包含指定字符拷贝的CString对象。注意，这个返回的CString对象可能是空的。

参数：
nCount 要从这个CString对象中提取的字符数目。

说明：
此成员函数用来从此CString对象中提取最后（最右边）的nCount个字符，并返回此提取字符串的一个拷贝。如果nCount超过了字符串的长度，则提取整个字符串。Right类似于Basic的RIGHT$函数（除了索引是从零开始的）。
对于多字节字符集（MBCS），nCount指的是每8位字符的数目；也就是说，在一个多字节字符中开始和结尾字节被算作两个字符。

示例：下面的例子说明了如何使用CString::Right。
// CString::Right示例：
CString s( _T("abcdef") );
ASSERT( s.Right(2) == _T("ef") );

请参阅：CString::Mid, CString::Left


 CString::SetAt

void SetAt( int nIndex, TCHAR ch );

参数：
nIndexCString | 对象中的某个字符的从零开始的索引。nIndex参数必须大于或等于0，小于由Getlength的返回的值。Microsoft基础类库的测试版本将检验nIndex的边界，而Release版本则不检验。
ch | 要插入的字符。

说明：
你可以将一个CString对象看作是一个字符数组。SetAt成员函数重写由一个索引值指定的单个字符。如果索引超出了已有字符串的边界，SetAt不会扩大这个字符串。

请参阅：CString::GetAt, CString::operator []


 CString::SetSysString

BSTR SetSysString( BSTR* pbstr ) const;

返回值：返回新的字符串。

参数：
pbstr 一个指向字符串的指针。

说明：
此成员函数重新分配由pbstr所指向的BSTR，并将包括结尾的空字符在内的CString对象中的内容拷贝到该BSTR中。由pbstr所引用的BSTR的值可能会发生变化。如果内存不足，此函数将抛出一个CMemoryException异常。
这个函数通常被用来为OLE自动化改变通过引用传递的字符串的值。
有关Windows中的OLE重分配函数的更多信息，参见“Win32 SDK OLE程序员参考”中的::SysReallocStringLen和::SysFreeString。


 CString::SpanExcluding

CString SpanExcluding( LPCTSTR lpszCharSet ) const;
throw( CMemoryException );

返回值：
返回一个子字符串，该子串保存了在CString字符串中但又不在lpszCharSet字符集合中的字符，该子串以字符串的第一个字符作为开始，以在此字符串中发现的第一个也在lpszCharSet字符集中字符前面的字符作为结尾（也就是说，从此字符串的第一个字符开始，直到第一个也包括在lpszCharSet字符集的字符为止，但不包括这个也在lpszCharSet字符集中的字符）。如果CString中的每一个字符都不在lpszCharSet字符集合中，则返回整个字符串。

参数：
lpszCharSet 一个被解释为字符集的字符串。

说明：
此成员函数用来查找整个CString对象中的字符串，找出lpszCharSet指定的字符集中任何字符第一次出现的位置。SpanExcluding提取并返回这个lpszCharSet字符集中的字符第一次出现之前的所有字符（换句话说，来自lpszCharSet字符集的字符以及在它之后的字符串都不会被返回）。如果在此字符串中没有发现来自lpszCharSet字符集的字符，则SpanExcluding返回整个字符串。

示例：
下面的函数返回src参数的第一个部分。
// 由一个分号（；），一个逗号( , )，一个句号( . )，一个破折号( - )，
// 或一个冒号( : )划定界线的部分。
CString GetFirstPart( CString src)
{
return src.SpanExcluding( ";,.- :");
}

请参阅：CString::SpanIncluding


 CString::SpanIncluding

CString SpanIncluding( LPCTSTR lpszCharSet ) const;
throw( CMemoryException );

返回值：
返回此字符串中的一个子字符串，该子串中的字符也在lpszCharSet字符集中字符集中。该子串开始于字符串中的第一个字符，当发现第一个不是lpszCharSet字符集中的字符时结束。如果字符串中的第一个字符就不是指定字符集中的字符，则SpanIncluding返回一个空的子字符串。

参数：
lpszCharSet 一个被解释为字符集的字符串。

说明：
此成员函数用来从字符串中提取字符，提取的子字符串开始于字符串中的第一个字符，其字符都是由lpszCharSet指定的字符集中的。如果字符串的第一个字符就不在此字符集中，则SpanIncluding返回一个空的字符串。否则，它返回一个连续字符序列，它们都是该字符集中的字符。

示例：
下面的例子说明了如何使用CString::SpanIncluding。
// CString::SpanIncluding示例：
CString str( "cabbage" );
CString res = str.SpanIncluding( "abc" );
ASSERT( res == "cabba" );
res = str.SpanIncluding( "xyz" );
ASSERT( res.IsEmpty( ) );

请参阅：CString::SpanExcluding


 CString::TrimLeft

void TrimLeft( );
void CString::TrimLeft( TCHAR chTarget );
void CString::TrimLeft( LPCTSTR lpszTargets );

参数：
chTarget | 要被整理的目标字符。
lpszTargets | 指向一个字符串的指针，该字符串包含了要被整理的目标字符。

说明：
这个成员函数的没有参数的版本用来将字符串最前面的空格修整掉。当在没有参数的情况下调用时，TrimLeft删除换行符，空格和tab字符。
这个成员函数的需要参数的版本用来将一个特定的字符或一群特定的字符从字符串的开始处删除。
参见TrimRight可以获得一个代码例子。更多的信息，参见“Visual C++程序员指南”中的“字符串主题”。

请参阅：
CString::Mid, CString::Left, CString::Right, CString::MakeUpper, CString::MakeLower, CString::MakeReverse, CString::Format


 CString::TrimRight

void TrimRight( );
void CString::TrimRight( TCHAR chTarget );
void CString::TrimRight( LPCTSTR lpszTargets );

参数：
chTarget | 要被整理的目标字符。
lpszTargets | 一个指向字符串的指针，该字符串中包含了要被整理的目标字符。

说明：
这个成员函数的没有参数的版本用来将字符串最后面的空格修整掉。当在没有参数的情况下调用时，TrimRight从字符串中删除换行符，空格和tab字符。
这个成员函数的需要参数的版本用来将一个特定的字符或一群特定的字符从字符串的结尾处删除。

示例：
CString strBefore;
CString strAfter;
strBefore ="Hockey is Best!!!!" ;
strAfter = strBefore;
str.TrimRight('!' );
printf ("Before: \"%s\"\n",(LPCTSTR) strBefore );
printf ("After: \"%s\"\n",(LPCTSTR) strBefore );

strBefore ="Hockey is Best?!?!?!?!" ;
strAfter = strBefore;
str.TrimRight( *?!* );
printf ("Before: \"%s\"\n",(LPCTSTR) strBefore );
printf ( "After: \"%s\"\n",(LPCTSTR) strAfter );
在上面的第一个例子中，字符串“Hockey is Best!!!!”变成了“Hockey is Best”。
在上面的第二个例子中，字符串“Hockey is Best?!?!?!?!”变成了“Hockey isBest”。
更多的信息，参见“Visual C++程序员指南”中的“字符串主题”。

请参阅：
CString::TrimLeft, CString::Mid, CString::Left, CString::Right, CString::MakeUpper, CString::MakeLower, CString::MakeReverse, CString::Format


 CString::UnlockBuffer

void UnlockBuffer( );

说明：
此成员函数用来解锁先前通过调用LockBuffer加锁的的缓冲区。UnlockBuffer将引用计数恢复为1。
CString析构函数使用UnlockBuffer来保证当析构函数被调用时缓冲区不会被加锁。

请参阅：
CString::LockBuffer, CString::GetBuffer, CString::ReleaseBuffer


 CString::operator []

TCHAR operator []( int nIndex ) const;

参数：
nIndex 字符串中的一个字符的从零开始的索引。

说明：
你可以将一个CString对象看作是一个字符数组。此重载下标操作符（[]）返回由nIndex中的从零开始的索引值指定的一个字符。此操作符是GetAt成员函数的惯用的代用符。

示例：
下面的例子说明了如何使用CString::operator []操作符。
// CString::operator []示例：
CString s( "abc" );
ASSERT( s[1] == 'b' );

请参阅：CString::GetAt, CString::SetAt


 CString::operator =

const CString& operator =( const CString& stringSrc );
throw( CMemoryException );
const CString& operator =( TCHAR ch );
throw( CMemoryException );
const CString& operator =( const unsigned char* psz );
throw( CMemoryException );
const CString& operator =( LPCWSTR lpsz );
throw( CMemoryException );
const CString& operator =( LPCSTR lpsz );
throw( CMemoryException );

说明：
这个CString赋值操作符（=）用新的数据来初始化一个已经存在的CString对象。如果目标字符串（即左边的字符串）已经具有足够大的空间来保存新数据，则不用进行新的内存分配。不管你什么时候使用这个赋值操作符，都要小心可能出现的内存异常，因为常常要为保存新的结果给CString对象分配内存。

示例：
下面的例子说明了如何使用CString::operator =。
// CString::operator =示例：
CString s1, s2; // 空的CString对象
s1 = "cat"; // s1 = "cat"
s2 = s1; // s1 and s2 each = "cat"
s1 = "the " + s1; // 或者是表达式
s1 = 'x'; // 或者只是单个的字符

请参阅：CString::CString


 CString::operator +

friend CString operator +( const CString& string1, const CString& string2 );
throw( CMemoryException );
friend CString operator +( const CString& string, TCHAR ch );
throw( CMemoryException );
friend CString operator +( TCHAR ch, const CString& string );
throw( CMemoryException );
friend CString operator +( const CString& string, LPCTSTR lpsz );
throw( CMemoryException );
friend CString operator +( LPCTSTR lpsz, const CString& string );
throw( CMemoryException );

返回值：
返回一个CString对象，该对象是此连接操作的临时结果。这个返回值使得在一个表达式中组合多次连接成为可能。

参数：
string，string1，string2 | 要连接的CString对象。
ch | 将被连接到一个字符串之后的或将在其后连接一个字符串的字符。
lpsz | 指向一个以空字符结尾的字符串的指针。

说明：
此+操作符将两个字符串连接起来并返回一个CString对象。两个参数中的一个必须是一个CString对象，而另一个可以是指向字符的指针或是一个字符。不管你什么时候使用这个连接操作符，都要小心可能出现的内存异常，因为为了保存这个临时结果常常要分配新内存。

示例：
下面的例子说明了如何使用CString::operator +。
// CString::operator +示例：
CString s1( "abc" );
CString s2( "def" );
ASSERT( (s1 + s2 ) == "abcdef" );
CString s3;
s3 = CString( "abc" ) + "def"; // Correct
s3 = "abc" + "def";
// 错了！第一个参数必须是一个CString。

请参阅：CString::operator +=


 CString::operator +=

const CString& operator +=( const CString& string );
throw( CMemoryException );
const CString& operator +=( TCHAR ch );
throw( CMemoryException );
const CString& operator +=( LPCTSTR lpsz );
throw( CMemoryException );

参数：
string | 将连接到此字符串之后的CString对象。
ch | 将连接到此字符串之后的一个字符。
lpsz | 指向将连接到此字符串之后的的字符串的指针。

说明：
此+=连接操作符将字符连接到此CString字符串之后。+=操作符可以接受另一个CString对象，一个指向字符的指针或一个字符作为参数。不管你什么时候使用这个连接操作符，都要小心可能出现的内存异常，因为常常要为添加到这个CString对象的字符分配内存。

示例：
下面的例子说明了如何使用CString::operator +=。
// CString::operator +=示例：
CString s( "abc" );
ASSERT( ( s += "def" ) == "abcdef" );

请参阅：CString::operator +


 CString::operator <<, >>

friend CArchive& operator <<( CArchive& ar, const CString& string );
throw( CArchiveException );
friend CArchive& operator >>( CArchive& ar, CString& string );
throw( CArchiveException );
friend CDumpContext& operator <<( CDumpContext& dc, const CString& string );

说明：
CString插入操作符（<<）支持向一个存档进行诊断转储和存储。提取操作符支持从一个文档中进行装入。
CDumpContext操作符只有在Microsoft基础类库的调试版中才有效。

示例：
下面的例子说明了如何使用CString::operator <<, >>。
// CString::operator <<, >>示例：
extern CArchive ar;
CString s( "abc" );
#ifdef _DEBUG
afxDump << s; // Prints the value (abc)
afxDump << &s; // Prints the address
#endif
if( ar.IsLoading() ) ar >> s;
else ar << s;

请参阅：CDumpContext


 CString::operator LPCTSTR

operator LPCTSTR ( ) const;

返回值：返回一个指向字符串的数据的字符指针。

说明：
这个非常有用的强制操作符提供了一种非常有效的方法来访问存放在CString对象中的以空字符结尾的C字符串。此函数不拷贝字符而仅返回一个指针。如果你在获取指针之后修改此CString对象，则可能导致内存被重新分配，并使该指针无效。


 CStringArray

CObject
└CStringArray

CStringArray类支持CString对象数组。
CStringArray的成员函数类似于CObArray类的成员函数。由于具有这些相似性，你可以参考关于CObArray的参考文件来获取CStringArray成员函数的详细说明。如果在说明中看到某一函数的返回值是一个指向CObject对象的指针，则可以用一个CString（而不是一个CString指针）来代替它。如果看到某一函数的参数是一个指向CObject的指针，则可以用LPCTSTR来代替它。
例如，可以将
CObject* CObArray::GetAt( int <nIndex> ) const;
转换为
CString CStringArray::GetAt( int <nIndex> ) const;
和将
void SetAt( int <nIndex>, CObject* <newElement> )
转换为
void SetAt( int <nIndex>, LPCTSTR <newElement> );
CStringArray与IMPLEMENT_SERIAL宏联合起来支持其元素的连续和转储。如果一个CString对象数组被用一个重载的插入操作符或Serialize成员函数保存到一个存档中，则它的每一个元素都按顺序连续。
注意：
在使用一个数组之前，使用SetSize来建立它的大小并给它分配内存。如果你不使用SetSize，则向数组中添加元素将导致数组被频繁地拷贝和分配内存。频繁分配内存和拷贝会导致效率低和内存零碎。

如果你需要数组中个别字符串元素的转储，则应该将转储环境的深度设置为1或更大。当一个CString数组被删除时，或当其中的个别元素被删除时，字符串内存被根据需要释放。
有关使用CStringArray的更多信息，参见“Visual C++程序员指南”中的文章“集合”。
#include <afxcoll.h>

CStringArray类成员

构造
CStringArray 构造一个空的CString对象数组

绑定
GetSize | 获取这个数组中的元素数目
SetSize | 设置这个数组中包含的元素数目
GetUpperBound | 返回最大的有效索引

操作符
FreeExtra | 释放当前数组边界之外的未使用的所有内存
RemoveAll | 从数组中删除所有元素

元素访问
GetAt | 返回位于给定索引处的值
SetAt | 设置给定索引处的元素的值；不得将数组增大
ElementAt | 返回对数组中的某一元素指针的临时引用
GetData | 对数组中的元素允许的访问。可以是NULL

扩大数组
SetAtGrow | 设置给定索引处的值，如果必要的话可以增长数组
Add | 在数组的末尾添加一个元素；可根据需要增长数组
Append | 向数组中添加另一个数组；如果必要的话可增长数组
Copy | 将另一个数组拷贝到此数组中；如果必要的话可增长数组

插入/删除
InsertAt | 在指定索引处插入一个元素（或者是另一个数组中的所有元素）
RemoveAt | 删除指定索引处的一个元素

操作符
operator [] 设置或获取在指定索引处的元素


 CStringList

CObject
└CStringList

CStringList类支持CString对象的列表。所有的比较都是通过值比较来完成的，这意味着不是比较字符串的地址而是比较字符串中的字符。
CStringList的成员函数类似于类CObList类的成员函数。由于具有这些相似性，你可以参考关于CObList的参考文件来获取CStringList成员函数的详细说明。如果在说明中看到某一函数的返回值是一个指向CObject对象的指针，则可以用一个CString（而不是一个CString指针）来代替它。如果看到某一函数的参数是一个指向CObject的指针，则可以用LPCTSTR来代替它。
例如，可以将
CObject*& CObList::GetHead() const;
转换为
CString& CStringList::GetHead() const;
和将
POSITION AddHead( CObject* <newElement> );
转换为
POSITION AddHead( LPCTSTR <newElement> );
CStringList与IMPLEMENT_SERIAL宏联合起来支持其元素的连续和转储。如果一个CString对象列表被用一个重载的插入操作符或Serialize成员函数保存到一个存档中，则它的每一个元素都按顺序连续。
如果你需要数组中个别字符串元素的转储，则应该将转储环境的深度设置为1或更大。
当一个CStringList对象被删除时，或当它的元素被删除时，则相应的CString对象被删除。
有关使用CStringList的更多信息，参见“Visual C++程序员指南”中的文章“集合”。
#include <afxcoll.h>

CStringList类成员

构造
CStringList 构造一个空的CString对象列表

首/尾访问
GetHead | 返回此列表（不能是空的）中头部的元素
GetTail | 返回此列表（不能是空的）中尾部的元素

操作
RemoveHead | 从列表的头部删除元素
RemoveTail | 从列表的尾部删除元素
AddHead | 在列表的头部添加一个元素（或者是另一个列表中的所有元素），即产生一个新的头部
AddTail | 在列表的尾部添加一个元素（或者是另一个列表中的所有元素），即产生一个新的尾部
RemoveAll | 删除此列表中的所有元素

重复
GetHeadPosition | 返回列表中的头部元素的位置
GetTailPosition | 返回列表中尾部元素的位置
GetNext | 获取用于重复的下一个元素
GetPrev | 获取用于重复的前一个元素

获取/修改
GetAt | 获取给定位置处的元素
SetAt | 设置给定位置处的元素
RemoveAt | 从此列表中删除由位置指定的一个元素

插入
InsertBefore | 在一个给定位置之前插入一个新元素
InsertAfter | 在一个给定位置之后插入一个新元素

搜索
Find | 获取由字符串值指定的元素的位置
FindIndex | 获取由一个从零开始的索引指定的元素的位置

状态
GetCount | 返回此列表中的元素个数
IsEmpty | 测试列表是否为空（没有元素）


 CSyncObject

CObject
└CSyncObject

CSyncObject类是一个纯虚类，它提供了对于Win32中的同步对象来说通用的性能。Microsoft基础类库提供了几个从CSyncObject派生的类。这些类是CEvent，CMutex，CCriticalSection，和CSemaphore。
有关如何使用同步对象的信息，请参见“Visual C++程序员指南”中的文章“多线程：如何使用同步类”。
#include <afxmt.h>

CSyncObject类对象

构造
CSyncObject 构造一个CSyncObject对象

方法
Lock | 获得对该同步对象的访问
Unlock | 释放对该同步对象的访问

属性
operator HANDLE 获得对该同步对象的访问


 CSyncObject::CSyncObject

CSyncObject( LPCTSTR pstrName );
virtual ~CSyncObject( );

参数：
pstrName 对象的名字。如果是NULL，则pstrName将是空。

说明：
此成员函数用来构造一个具有给定名字的同步对象。


 CSyncObject::Lock

virtual BOOL Lock( DWORD dwTimeout = INFINITE );

返回值：如果函数成功则返回非零值；否则返回0。

参数：
dwTimeout 指定等待此同步对象变为可用（发信号的）的时间量。如果是INFINITE，则Lock一直等待直到对象在返回前变为有效。

说明：
此成员函数用来获得对该同步对象控制的资源的访问。如果该同步对象是可用的，则Lock将成功地返回，并且线程从现在起拥有了这个对象。如果同步对象不可用，则Lock将在dwTimeOut参数指定的毫秒数内等待此同步对象变为可用。如果这个同步对象在指定量的时间内没有变为可用的，则Lock返回失败。


 CSyncObject::Unlock

virtual BOOL Unlock( ) = 0;
virtual BOOL Unlock( LONG lCount, LPLONG lpPrevCount = NULL );

返回值：此函数的缺省实现总是返回TRUE。

参数：
lCount | 缺省实现不使用这个参数。
lpPrevCount | 缺省实现不使用这个参数。

说明：
Unlock的不带参数的声明是一个纯虚函数，所有从CSyncObject派生的类都必须重载它。带有两个参数的缺省实现总是返回TRUE。这个成员函数用来释放由调用线程所拥有的同步对象的访问。第二个声明是提供给像信号（semaphores）那样的同步对象的，这些对象允许对一个被控制资源进行多个访问。


 CSyncObject::operator HANDLE

operator HANDLE( ) const;

返回值：如果成功，则返回此同步对象的句柄；否则返回NULL。

说明：
此操作符用来获取此CSyncObject对象的句柄。你可以用这个句柄来直接调用Windows API。


 CTabCtrl

CObject
└CCmdTarget
└CWnd
└CTabCtrl

一个“标签控件”类似于一个笔记本中的分隔器，或一个文件柜上的标签。通过使用标签控件，应用程序可以将一个窗口或对话框的相同区域定义为多个页面。每一页包含了一套信息或一组控件，当用户选择了相应的标签时应用程序就会显示相应的信息或控件。一种特殊类型的标签控件把标签显示得像按钮一样。点击一个按钮将立即执行一条命令而不是显示一个页。
CTabCtrl类提供了Windows通用标签控件的性能。这个控件（也就是CTabCtrl类）只对运行在Windows 95和Windows NT 3.51或更新版本下的程序来说是可用的。
有关使用CTabCtrl的更多信息，参见“Visual C++程序员指南”中的“控件主题”和“使用CTabCtrl”。
#include <afxcmn.h>
请参阅：CHeaderCtrl, CListCtrl

CTabCtrl类成员

构造
CTabCtrl | 构造一个CTabCtrl对象
Create | 创建一个标签控件并将它与一个CTabCtrl对象连接

属性
GetImageList | 获取与一个标签控件相关的图像列表
SetImageList | 将一个图像列表分配给一个标签控件
GetItemCount | 获取此标签控件中的标签的数目
GetItem | 获取此标签控件中的某一个标签的信息
SetItemExtra | 设置一个标签控件中的每一个标签为应用程序定义的数据所保留的字节数
GetItemRect | 获取一个标签控件中的一个标签的边界矩形
GetCurSel | 确定在一个标签控件中当前选择的标签
SetCurSel | 在一个标签控件中选择一个标签
SetCurFocus | 将焦点设置到一个标签控件中的指定标签上
SetItemSize | 设置某个项的宽度和高度
SetPadding | 设置一个标签控件中的每一个标签的图标和标签周围的空间（填料）
GetRowCount | 获取一个标签控件中的标签的当前行数
GetToolTips | 获取与一个标签控件相关联的工具提示控件的句柄
SetToolTips | 将一个工具提示控件赋给一个标签控件
GetCurFocus | 获取一个标签控件的具有当前焦点的标签
SetMinTabWidth | 设置一个标签控件中的项的最小宽度
GetExtendedStyle | 获取标签控件当前使用的扩展风格
SetExTendedStyle | 设置一个标签控件的扩展风格
GetItemState | 获取指定标签控件项的状态
SetItemState | 设置指定标签控件项的状态

操作
InsertItem | 在一个标签控件中插入一个新的标签
DeleteItem | 从一个标签控件中删除一项
DeleteAllItems | 从一个标签控件中删除所有的项
AdjustRect | 根据一个给定的窗口矩形来估算一个标签控件的的显示区域，或根据一个给定的显示区域来估算与之对应的窗口矩形
RemoveImage | 从一个标签控件的图像列表中删除一个图像
HitTest | 确定哪一个标签（如果有的话）位于指定的屏幕位置
DeselectAll | 重新设置一个标签控件中的项，清除任何被按下的项
HighlightItem | 设置一个标签项的加亮状态

可重载函数
DrawItem 绘制一个标签控件的指定项


 CTabCtrl::AdjustRect

void AdjustRect( BOOL bLarger, LPRECT lpRect );

参数：
bLarger | 指明要执行的选项。如果这个参数是TRUE，则lpRect指定一个显示矩形并接收相应的窗口矩形。如果这个参数是FALSE，则lpRect指定一个窗口矩形并接收相应的显示矩形。
lpRect | 指向一个RECT结构的指针，该结构指定给定的矩形并接收计算后的矩形。

说明：
此成员函数根据给定的窗口矩形计算一个标签控件的显示区域，或根据一个给定的显示区域计算相应的窗口矩形。

请参阅：
CTabCtrl::SetItemSize, CTabCtrl::GetItemRect, CTabCtrl::AdjustRect


 CTabCtrl::Create

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

返回值：
如果成功地初始化了对象则返回TRUE；否则返回FALSE。

参数：
dwStyle | 指定标签控件的风格。标签控件风格的任意组合都适用于这个控件。
rect | 指定控件的尺寸和位置。它可以是一个CRect对象或一个RECT结构。
pParentWnd | 指定该标签控件的父窗口，通常是一个CDialog。它不能是NULL。
nID | 指定标签控件的ID。

说明：
分两步构造一个CTabCtrl对象。首先调用构造函数，然后调用Create函数来创建标签控件并将它与此CTabCtrl对象连接。
下面的风格适用于一个标签控件：
· | TCS_BUTTON | 修改标签的外观，使它们看起来像按钮一样。
· | TCS_FIXEDWIDTH | 使所有的标签都具有相同的宽度。（缺省的，标签控件自动调整每一个标签的尺寸使之适合于它的图标。）不能将此风格与TCS_RIGHTJUSTIFY风格要求使用。
· | TCS_FOCUNEVER | 表示一个标签永远也不会接收输入焦点。
· | TCS_FOCUSONBUTTONDOWN | 表示当点击一个标签时它接收输入焦点。通常这个风格只与TCS_BUTTONS风格一起使用。
· | TCS_FORCEICONLEFT | 将图标集中在左边，但标签标签仍然在中间。（缺省的，控件将图标和标签都放在中间，图标在标签的左边。）
· | TCS_FORCELABELLEFT | 左对齐图标和标签。
· | TCS_MULTILINT | 使一个标签控件显示多行标签。因此所有的标签都可以同时显示。（缺省的，一个标签控件只显示一行标签。）
· | TCS_OWNERDRAWFIXED | 指定由父窗口在该控件中绘制标签。
· | TCS_RIGHTJUSTIFY | 向右调整标签。（缺省的，标签在每一行中是向左调整的。）
· | TCS_SHAREIMAGELISTS | 表示当一个标签控件被销毁时，不销毁它的图像列表。
· | TCS_TOOLTIPS | 表示该标签控件具有一个与之关联的工具提示控件。
· | TCS_TABS | 标签就显示为标签，并且在显示区域的周围绘制了边框。这个风格是缺省的。
· | TCS_SINGLELINE | 只显示一行标签。用户可以根据需要通过滚动来查看更多的标签。这个风格是缺省的。
· | TCS_RAGGEDRIGHT | 不拉伸每一行标签来使之适合控件的整个宽度。这个风格是缺省的。
另外，你还可以将下面的窗口风格应用于一个标签控件：
· | WS_CHILD | 创建一个代表标签控件的子窗口。不能与WS_POPUP风格一起使用。
· | WS_VISIBLE | 创建一个初始可见的标签控件。
· | WS_DISABLED | 创建一个初始无效的窗口。
· | WS_GROUP | 指定一组控件中的第一个控件，在这组控件中用户可以使用箭头键从一个控件移动到另一个控件。在第一个控件后面的所有用WS_GROUP风格定义的控件都属于同一组。下一个具有WS_GROUP风格的控件结束这个风格组并开始下一个组（即，一组结束的地方就是另一组开始的地方）。
· | WS_TABSTOP | 指定用户可以通过使用TAB键到达的控件。用户按TAB键可以到达下一个具有WS_TABSTOP风格的控件。

请参阅：CTabCtrl::CTabCtrl


 CTabCtrl::CTabCtrl

CTabCtrl( );

说明：
此成员函数用来构造一个CTabCtrl对象。


 CTabCtrl::DeleteAllItems

BOOL DeleteAllItems( );

返回值：如果成功则返回非零值；否则返回0。

说明：
此成员函数用来从一个标签控件中删除所有的项。


 CTabCtrl::DeleteItem

BOOL DeleteItem( int nItem );

返回值：如果成功则返回非零值；否则返回0。

参数：
nItem 要删除零基项的从零开始的值。

说明：
此成员函数用来从一个标签控件中删除指定的项。


 CTabCtrl::DeselectAll

void DeselectAll( BOOL fExcludeFocus );

参数：
fExcludeFocus 用来指定未被选择项的范围的标志。如果这个参数被设置为FALSE，则所有的标签按钮都将被重新安排。如果它被设置为TRUE，则除了当前操作选择的项，其它所有的标签项都将被重新安排。

说明：
此成员函数用来实现Win32消息TCM_DESELECTALL的行为，就像在“Platform SDK”中描述的一样。


 CTabCtrl::DrawItem

void DrawItem( LPDRAWITEMSTRUCT lpDrawItemStruct );

参数：
lpDrawItemStruct 一个指向DRAWITEMSTRUCT结构的指针。该结构描述了要被绘制的项。

说明：
当一个设置绘制的标签控件的可视外观改变时，可以调用这个成员函数。DRAWITEMST- RUCT的成员itemAction定义了要被执行的绘制动作。
缺省的，这个成员函数不做任何事情。重载这个成员函数可以实现对一个属主绘制的CTabCtrl对象的绘制。
在这个成员函数终止之前，应用程序必须恢复为lpDrawItemStruct中提供的显示环境选择的所有图形设备接口（GDI）。

请参阅：CWnd::OnDrawItem


 CTabCtrl::GetCurFocus

int GetCurFocus( ) const;

返回值：拥有当前焦点的标签的从零开始的索引。

说明：
此成员函数用来获取拥有当前焦点的标签的索引。

请参阅：CTabCtrl::GetCurSel


 CTabCtrl::GetCurSel

int GetCurSel( ) const;

返回值：
如果成功则返回所选标签的从零开始的索引，如果没有标签被选择则返回-1。

说明：
此成员函数用来获取一个标签控件中当前选择的标签。

请参阅：CTabCtrl::SetCurSel, CTabCtrl::GetCurFocus


 CTabCtrl::GetExtendedStyle

DWORD GetExtendedStyle( );

返回值：
返回值代表了此标签控件当前使用的控件风格。这个值是标签控件扩展风格的一个组合，就像在“Platform SDK”中描述的一样。

说明：
此成员函数用来实现Win32消息TCM_GETEXTENDEDSTYLE的行为，就像在“Platform SDK”中描述的一样。


 CTabCtrl::GetImageList

HIMAGELIST GetImageList( ) const;

返回值：
如果成功则返回此标签控件的图形列表；否则返回NULL。

说明：
此成员函数用来获取与一个标签控件相关联的图形列表。

请参阅：CTabCtrl::SetImageList, CImageList


 CTabCtrl::GetItem

BOOL GetItem( int nItem, TC_ITEM* pTabCtrlItem ) const;

返回值：如果成功则返回TRUE；否则返回FALSE。

参数：
nItem | 标签的从零开始的索引。
pTabCtrlItem | 指向一个TCITEM结构的指针，该结构用来指定要获取的信息。也用来获取该标签的信息。此结构也被InsertItem，GetItem和SetItem成员函数使用。

说明：
此成员函数用来获取一个标签控件中的某个标签的信息。当消息被发送后，mask成员指定要返回哪一个属性。如果mask成员指定TCIF_TEXT值，则pszText成员必须包含用来接收该项文本的缓冲区的地址，cchTextMax成员必须指定缓冲区的大小。
mask指定要获取或设置的是哪些TCITEM结构成员。这个成员可以是零或下列值的一个组合：
· | TCIF_TEXT | pszText成员是有效的。
· | TCIF_IMAGE | iImage成员是有效的。
· | TCIF_PARAM | lParam成员是有效的。
· | TCIF_RTLREADING | 用从右到左的读取顺序在Hebrew或Arabic系统中显示pszText的文本。
· | TCIF_STATE | dwState成员是有效的。
pszText | 指向一个以空字符结尾的字符串的指针，如果此结构包含了一个标签的信息，则该字符串包含了该标签文本。如果此结构正在接收信息，则这个成员指定了用来接收该标签文本的缓冲区的地址。
cchTextMax | pszText指向的缓冲区的大小。如果此结构不是在接收信息，则忽略这个成员。
iImage | 是此标签控件的图像列表中的索引，如果此标签没有图像则这个成员的值为－1。
lParam | 应用程序定义的与此标签相关联的数据。如果每一个标签有多于四个字节的应用程序定义的数据，则应用程序必须定义一个结构并用这个结构来代替TCITEM结构。应用程序定义的结构的第一个成员必须是一个TCITEMHEADER结构。这个TCITEMHEADER结构与TCITEM结构一样，但是没有lParam成员。你的结构与TCITEMHEADER结构的大小差别必须等于每一个标签的额外的字节数。

请参阅：CTabCtrl::InsertItem, CTabCtrl::SetItem


 CTabCtrl::GetItemCount

int GetItemCount( ) const;

返回值：返回此标签控件中的项数。

说明：
此成员函数用来获取此标签控件中的项数。

请参阅：CTabCtrl::GetItem, CTabCtrl::SetItem


 CTabCtrl::GetItemRect

BOOL GetItemRect( int nItem, LPRECT lpRect ) const;

返回值：如果成功则返回非零值；否则返回0。

参数：
nItem | 标签项的从零开始的索引。
lpRect | 指向一个RECT结构的指针，该结构用来接收该标签的边界矩形。这些结构使用的是视口的当前映射模式。

说明：
此成员函数用来获取一个标签控件中的指定标签的边界矩形。

请参阅：CTabCtrl::SetItemSize, CTabCtrl::AdjustRect


 CTabCtrl::GetItemState

BOOL GetItemState ( int nItem, DWORD dwMask, DWORD& dwState ) const;

返回值：
如果成功则返回非零值；否则返回0。如果成功，则dwState用来接收状态信息。

参数：
nItem | 要获取其状态信息的项的从零开始的索引号。
dwMask | 用来指定要返回该项的哪些状态标志。可能值的列表，参见TCITEM结构的mask成员，就像“Platform SDK”中描述的一样。
dwState一个对一个用来接收状态信息的DWORD值的引用。可以是下列值之一：
值 | 描述
TCIS_BUTTONPRESSED | 该标签控件项被选择
TCIS_HIGHLIGHTED | 该标签控件项被加亮，并且该标签和文本被用当前的加亮色绘制。 当使用加亮色时，将是一个真正的颜色，而不是一个抖动色

说明：
此成员函数用来获取由nItem标识的标签控件项的状态。一个项的状态由TCITEM结构中的dwState成员来指定。

请参阅：CTabCtrl::SetItemState


 CTabCtrl::GetRowCount

int GetRowCount( ) const;

返回值：返回此标签控件中的标签行数。

说明：
此成员函数用来获取一个标签控件中的当前行数。只有具有TCS_MULTILINT风格的标签控件可以有多行标签。

请参阅：CTabCtrl::Create


 CTabCtrl::GetToolTips

CToolTipCtrl* GetTooltips( ) const;

返回值：
如果成功则返回工具提示控件的句柄；否则返回NULL。

说明：
此成员函数用来获取与一个标签控件相关联的工具提示控件的句柄。如果一个标签控件具有TCS_TOOLTIPS风格，则它创建一个工具提示控件。你也可以提供使用SetToolTips成员函数来给一个标签控件分配一个工具提示控件。

请参阅：CTabCtrl::SetToolTips, CTabCtrl::Create


 CTabCtrl::HighlightItem

BOOL HighlightItem( int idItem, BOOL fHighlight = TRUE );

返回值：如果成功则返回非零值；否则返回0。

参数：
idItem | 一个标签控件项的从零开始的索引。
fHighlight | 指定要设置的加亮状态。如果这个值是TRUE，则该标签是被加亮的；如果这个值是FALSE，则该标签被设置为它的缺省状态。

说明：
此成员函数用来实现Win32消息TCM_HIGHLIGHTITEM，就像在“PlatformSDK”中描述的一样。


 CTabCtrl::HitTest

int HitTest( TC_HITTESTINFO* pHitTestInfo) const;

返回值：
返回位于指定位置的标签的从零开始的索引，如果在指定的位置没有标签，则返回-1。

参数：
pHitTestInfo 指向一个TCHITTESTINFO结构的指针，就象在“Platform SDK”中描述的一样，该结构指定了要测试的屏幕位置。

说明：
此成员函数用来确定是哪一个标签（如果有的话）位于指定的屏幕位置。


 CTabCtrl::InsertItem

BOOL InsertItem( int nItem, TC_ITEM* pTabCtrlItem );
BOOL InsertItem( int nItem, LPCTSTR lpszItem );
BOOL InsertItem( int nItem, LPCTSTR lpszItem, int nImage);
BOOL InsertItem( UINT nMask int nItem, LPCTSTR lpszItem, int nImage, LPARAM lParam );

返回值：
如果成功则返回从零开始的索引；否则返回-1。

参数：
nItem | 新标签的从零开始的索引。
pTabCtrlItem | 指向一个TCITEM结构的指针，该结构指定了该标签的属性。
lpszItem | 指向要插入的项的指针。
nImage | 一个将要被插入的图像的在一个图像列表中的从零开始的索引。
nMask指定要设置的是哪些TCITEM结构属性。可以是零或下列值的一个组合：
· | TCIF_TEXT | pszText成员是有效的。
· | TCIF_IMAGE | iImage成员是有效的。
· | TCIF_PARAM | lParam成员是有效的。
· | TCIF_RTLREADING | 用从右到左的读取顺序在Hebrew或Arabic系统中显示pszText的文本。
· | TCIF_STATE | dwState成员是有效的。
lParam | 与此标签相关联的应用程序定义的数据。

说明：
此成员函数用来将一个新的标签插入到一个已有的标签控件中。

请参阅：CTabCtrl::GetItem, CTabCtrl::SetItem


 CTabCtrl::RemoveImage

void RemoveImage( int nImage );

参数：
nImage 要删除的图像的从零开始的索引。

说明：
此成员函数用来从一个标签控件的图像列表中删除指定的图像。该标签控件更新每一个标签的图像索引以使每一个标签保持与原来的相同图像的关联。

请参阅：CTabCtrl::GetImageList, CTabCtrl::SetImageList


 CTabCtrl::SetCurFocus

void SetCurFocus( int nItem );

参数：
nItem 指定获得焦点的标签的索引。

说明：
此成员函数用来实现Win32消息TCM_SETCURFOCUS，就像在“PlatformSDK”中描述的一样。

请参阅：CTabCtrl::SetCurSel


 CTabCtrl::SetCurSel

int SetCurSel( int nItem );

返回值：
如果成功则返回先前选择的标签的从零开始的索引；否则返回-1。

参数：
nItem 要选择项的从零开始的索引。

说明：
此成员函数用来从一个标签控件中选择一个标签。当一个标签是通过使用这个函数被选择的时候，标签控件就不会发送TCN_SELCHANGING或TCN_SELCHANGE通知消息。当用户提供点击或使用键盘来改变标签时，将使用WM_NOTIFY来发送这些通知消息。

请参阅：CTabCtrl::GetCurSel, CTabCtrl::GetCurFocus


 CTabCtrl::SetExtendedStyle

DWORD SetExtendedStyle(DWORD dwNewStyle, DWORD dwExMask = 0 );

返回值：
返回一个包含先前的标签控件的扩展风格的DWORD值，就像在“PlatformSDK”中描述的一样。

参数：
dwNewStyle | 表示标签控件的扩展风格的一个组合的值。
dwExMask | 一个用来指明dwNewStyle中的哪些风格要被影响的DWORD值。只有dwNewStyle中的扩展风格会被改变。所有其它的风格都将保持原来的样子。如果这个参数是零，则dwNewStyle中的所有风格都将被影响。

说明：
此成员函数用来实现Win32消息TCM_SETEXTENDEDSTYLE，就像在“Platform SDK”中描述的一样。

请参阅：CTabCtrl::GetExtendedStyle


 CTabCtrl::SetImageList

CImageList* SetImageList( CImageList* pImageList );

返回值：
返回一个指向先前的图像列表的指针；如果没有先前的图像列表则返回NULL。

参数：
pImageList 指向要被分配给此标签控件的图像列表的指针。

说明：
此成员函数用来将一个图像列表分配给一个标签控件。

请参阅：CTabCtrl::GetImageList, CImageList


 CTabCtrl::SetItem

BOOL SetItem( int nItem, TCITEM* pTabCtrlItem );

返回值：如果成功则返回非零值；否则返回0。

参数：
nItem | 该项的从零开始的索引。
pTabCtrlItem | 指向一个TCITEM结构的指针，该结构包含了新的项属性。mask成员指定要设置哪些属性。如果mask成员指定的是TCIF_TEXT值，则pszText就是一个以空字符结尾的字符串的地址，而cchTextMax成员被忽略。

说明：
此成员函数用来设置一个标签的某些或所有属性。

请参阅：CTabCtrl::InsertItem, CTabCtrl::GetItem


 CTabCtrl::SetItemExtra

BOOL SetItemExtra( int nBytes );

返回值：如果成功则返回非零值；否则返回零。

参数：
nBytes 要设置的额外字节的数目。

说明：
此成员函数用来实现Win32消息TCM_SETITEMEXTRA，就像在“PlatformSDK”中描述的一样。

请参阅：CTabCtrl::SetItem


 CTabCtrl::SetItemSize

CSize SetItemSize( CSize size );

返回值：返回标签控件项的原来的宽度和高度。

参数：
size 标签控件项的以像素表示的新宽度和高度。

说明：
此成员函数用来设置标签控件项的宽度和高度。

请参阅：
CTabCtrl::AdjustRect, CTabCtrl::GetItemRect, CTabCtrl::SetItemSize


 CTabCtrl::SetItemState

BOOL SetItemState( int nItem, DWORD dwMask, DWORD dwState );

返回值：如果成功则返回非零值；否则返回0。

参数：
nItem | 要设置其状态信息的项的从零开始的索引号。
dwMask | 用来指定哪个项的状态标志要被设置的mask。可能值的列表，参见TCITEM结构的mask成员，就像在“Platform SDK”中描述的一样。
dwState一个对包含状态信息的DWORD值的引用。可以是下列值之一：
值 | 描述
TCIS_BUTTONPRESSED | 该标签控件项被选择
TCIS_HIGHLIGHTED | 该标签控件项被加亮，并且该标签和文本被用当前的加亮色绘制。 当使用加亮色时，将是一个真正的颜色，而不是一个抖动色

说明：
此成员函数用来设置由nItem标识的标签控件项的状态。

请参阅：CTabCtrl::GetItemState


 CTabCtrl::SetMinTabWidth

int SetMinTabWidth( int cx );

返回值：返回先前的最小标签宽度。

参数：
cx 要设置给一个标签控件项的最小宽度。如果这个参数被设置为-1，则该控件将使用缺省的标签宽度。

说明：
此成员函数用来实现Win32消息TCM_SETMINTABWIDTH，就像在“Platform SDK”中描述的一样。


 CTabCtrl::SetPadding

void SetPadding( CSize size );

参数：
size 表示一个标签控件中的每一个标签的图标和标签周围的空间（填料）数量。

说明：
此成员函数用来设置一个标签控件中的每一个标签的图标和标签周围的空间（填料）数量。


 CTabCtrl::SetToolTips

void SetToolTips( CToolTipCtrl* pWndTip );

参数：
pWndTip 工具提示控件的句柄。

说明：
此成员函数用来将一个工具提示控件分配给一个标签控件。通过调用GetToolTips函数可以获得与一个标签控件相关联的工具提示控件。

请参阅：CTabCtrl::GetToolTips


 CTime

CTime没有基类。
一个CTime对象代表一个绝对的时间和日期。CTime类引入了ANSI time_t数据类型以及其相关的运行时函数，其中包括向或自一个Gregorian日期和24-小时时间的转换功能。
CTime值是基于世界标准时间（UCT）的，UCT时间等于格林威治（Greenwich）时间（GMT）。本地时区是由TZ环境变量控制的。
当创建一个CTime时，将nDST参数设置为0表示有效的是标准时间，或将其设置为大于0表示有效的白天保留时间，将其设置为小于零的值表示由C运行时库代码来计算有效的是标准时间还是白天保留时间。如果没有设置这个参数，则它的值是不明确的，而从mktime返回的值是不可预知的。如果timeptr指向一个由先前调用asctime，gmtime，或localtime返回的tm结构，则tm_isdst域包含了适当的值。
参见“Microsoft Visual C++ 6.0参考库”的“Microsoft Visual C++ 6.0运行时参考库”卷可以获得有关time_t数据类型和CTime使用的运行时函数的更多信息。与CTime类对应的类是CTimeSpan类，它代表了一段时间间隔——两个CTime对象之间的差值。
CTime和CTimeSpan类都是不可派生的。因为没有虚函数，CTime和CTimeSpan对象的大小都正好是四个字节。多数成员函数都是内联函数。
有关使用CTime的更多信息，参见“Visual C++程序员指南”中的文章“日期和时间”，以及“Microsoft Visual C++ 6.0运行时库参考”中的“时间管理”。
#include <afx.h>
请参阅：运行时函数：asctime, _ftime, gmtime, locaItime, strftime, time

CTime类成员

Construction
CTime | 用各种方法构造一个CTime对象
GetCurrentTime | 创建一个代表当前时间的CTime对象（静态成员函数）

Extraction
GetTime | 返回一个与此CTime对象对应的time_t
GetYear | 返回此CTime对象代表的年
GetMonth | 返回此CTime对象代表的月（1至12）
GetDay | 返回此CTime对象代表的日（1至31）
GetHour | 返回此CTime对象代表的小时（0至23）
GetMinute | 返回此CTime对象代表的分钟（0至59）
GetSecond | 返回此CTime对象代表的秒（0至59）
GetDayOfWeek | 返回此日是星期几（1代表星期日，2代表星期一，以此类推）

Conversion
GetGmtTm | 根据UCT将一个CTime对象分解为它的组成部分
GetLocalTm | 根据本地时区时将一个CTime对象分解为它的组成部分
GetAsSystemTime | 将CTime对象中保存的时间信息转换为一个与Win32兼容的SYSTEMTIME结构
Format | 根据本地时区时将一个CTime对象转换为一个格式化字符串
FormatGmt | 根据UCT将一个CTime对象转换为一个格式化字符串

Operators
operator = | 赋一个新的时间值
operator +,- | 将CTime对象加上或减去一个CTimeSpan对象
operator +=,-= | 将此CTime对象加上或减去一个CTimeSpan对象
关系操作符 | 比较两个绝对时间

Archive/Dump
operator << | 向一个CArchive或CDumpContext输出一个CTime对象
operator >> | 从CArchive输入一个CTime对象


 CTime Comparison Operators

BOOL operator ==( CTime time ) const;
BOOL operator !=( CTime time ) const;
BOOL operator <( CTime time ) const;
BOOL operator >( CTime time ) const;
BOOL operator <=( CTime time ) const;
BOOL operator >=( CTime time ) const;

说明：
这些操作符比较两个绝对时间，如果测试条件为真则返回非零值；否则返回0。

示例：
// CTime比较操作符示例：
CTime t1 = CTime::GetCurrentTime();
CTime t2 = t1 + CTimeSpan( 0, 1, 0, 0 ); // 1 hour later
ASSERT( t1 != t2 );
ASSERT( t1 < t2 );
ASSERT( t1 <= t2 );


 CTime::CTime

CTime( );
CTime( const CTime& timeSrc );
CTime( time_t time );
CTime( int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec, int nDST = -1 );
CTime( WORD wDosDate, WORD wDosTime, int nDST = -1 );
CTime( const SYSTEMTIME& sysTime, int nDST = -1 );
CTime( const FILETIME& fileTime, int nDST = -1 );

参数：
timeSrc | 表示一个已经存在的CTime对象。
time | 表示一个时间值。
nYear,nMonth, nDay,
nHour, nMin, nSec		表示要拷贝到新的CTime对象中去的日期和时间值。
nDST表明有效的是否是daylight saving time。可以是下列三个值中的某一个：
· | nDST被设置为0 | 表示起作用的是标准时间。
· | nDST被设置为一个大于0的值 | 表示起作用的是daylight saving time。
· | nDST被设置为一个小于0的值 | 表示要自动计算起作用的是标准时间还是daylight saving time。
wDosDate, wDosTime | 要被转换为一个日期/时间值并被拷贝到新的CTime对象中去的MSDOS日期和时间。
sysTime | 要被转换为一个日期/时间值并被拷贝到新的CTime对象中去的SYSTEMTIME结构。
fileTime | 要被转换为一个日期/时间值并被拷贝到新的CTime对象中去的FILETIME结构。

说明：
所有这些构造函数都创建一个新的CTime对象，并用指定的基于当前时区的绝对时间值来初始化这个对象。
下面是对每一个构造函数的描述：
·CTime( );构造一个没有初始化的CTime对象。这个构造函数允许你定义CTime对象数组。在使用此对象之前，你应该用有效的时间来初始化这个数组。
·CTime( const CTime& );从另一个CTime值构造一个CTime对象。
·CTime( time_t );从一个time_t类型构造一个CTime对象。
·CTime( int, int, etc. );从本地时间成分构造一个CTime对象，每一个时间成分被约束在下列范围：
构成 | 范围
nYear | 1970—3000
nMonth | 1—12
nDay | 1—31
nHour | 没有约束
nMin | 没有约束
nSec | 没有约束
*最大的日期限是1/18/2038。更宽的日期范围，参见COleDateTime。 这个构造函数进行到UTC的相应转换。如果一个或多个年，月，或日成分超出了范围，则Microsoft基础类库的调试版会给出断言。在调用之前由你负责检验参数。
· | CTime( WORD, WORD ); | 根据指定的MSDOS日期和时间构造一个CTime对象。
· | CTime( const SYSTEMTIME& ); | 根据一个SYSTEMTIME结构构造一个CTime对象。
· | CTime( const FILETIME& ); | 根据一个FILETIME结构构造一个CTime对象。你最好不要直接使用CTime FILETIME初始化。如果你使用一个CTime对象来操纵一个文件，则CFile::GetStatus通过使用一个用FILETIME结构初始化的CTime对象来为你获取该文件的时间标记。
有关time_t数据类型的更多信息，参见“Microsoft Visual C++ 6.0运行库参考”中的时间函数。
更多的信息，参见“Win32 SDK程序员参考”中的SYSTEMTIME和FILETIME结构。
更多的信息，参见Win32 SDK文档中的MSDOS日期和时间项。

示例：
// CTime::CTime示例：
time_t osBinaryTime; // C运行时时间(在<time.h>中定义)
time( &osBinaryTime ); // 从操作系统中获取当前时间
CTime time1; // 空的CTime. (0 是不合法的时间值.)
CTime time2 = time1; // 拷贝构造函数
CTime time3( osBinaryTime ); // 根据C运行时时间构造
CTimeCTime time4( 1999, 3, 19, 22, 15, 0 ); // 10:15PM March 19, 1999

请参阅：CTime::GetTime, CTime::GetCurrentTime, CTime::operator =


 CTime::Format

CString Format( LPCTSTR pFormat ) const;
CString Format( UINT nFormatID ) const;

返回值：返回一个包含了格式化时间的CString。

参数：
pFormat一个类似于printf格式化字符串的格式化字符串。前面有一个百分号（%）标记的格式化代码，被相应的CTime成分替换。格式化字符串中的其它字符被不作变动地拷贝到返回字符串中。参见运行时函数strftime可以获得详细的信息。Format的格式化代码的值和意义如下所示：
· | %D | 此CTime中的总天数。
· | %H | 当前天的小时。
· | %M | 当前小时中的分钟。
· | %S | 当前分钟中的秒。
· | %% | 百分号。
nFormatID 用来表示这个格式的字符串的ID。

说明：
此成员函数用来创建一个日期/时间值的格式化表达式。如果此CTime对象的状态是空，则返回值是一个空字符串。如果CTime对象的状态是无效，则返回值是一个空字符串。

示例：
// CTime::Format和CTime::FormatGmt的示例：
CTime t( 1999, 3, 19, 22, 15, 0 ); // 10:15PM March 19, 1999
CString s = t.Format( "%A, %B %d, %Y" );
ASSERT( s == "Friday, March 19, 1999" );

请参阅：CTime::FormatGmt


 CTime::FormatGmt

CString FormatGmt( LPCTSTR pFormat ) const;
CString FormatGmt( UINT nFormatID ) const;

返回值：一个包含格式化时间的CString。

参数：
pFormat | 一个类似于printf格式化字符串的格式化字符串。细节参见运行时函数strftime。
nFormatID | 用来表示这个格式的字符串的ID。

说明：
此成员函数用来生成一个对应于这个CTime对象的格式化字符串。这个时间值没有被转换，因此是反映UTC的。

请参阅：CTime::Format


 CTime::GetAsSystemTime

BOOL GetAsSystemTime( SYSTEMTIME& timeDest ) const;

返回值：如果成功则返回非零值；否则返回0。

参数：
timeDest 是一个对SYSTEMTIME结构的引用，该结构要被转换为一个日期/时间值并被拷贝到新的CTime对象中。

说明：
此成员函数用来将保存在CTime对象中的时间信息转换为一个Win32兼容的SYSTEMTIME结构。GetAsSystemTime将结果时间保存在引用的timeDest对象中。由这个函数初始化的SYSTEMTIME数据结构把它的wMilliseconds成员设置为零。


 CTime::GetCurrentTime

static CTime PASCAL GetCurrentTime( );

说明：此成员函数返回一个代表当前时间的CTime对象。

示例：
// CTime::GetCurrentTime示例：
CTime t = CTime::GetCurrentTime();


 CTime::GetDay

int GetDay( ) const;

说明：
此成员函数根据本地时间返回范围在1--31之间的该月的天。这个函数调用GetLocalTm，该函数使用了一个内部的、静态分配的缓冲区。调用其它的CTime成员函数会导致这个缓冲区中的数据被覆盖。

示例：
// CTime::GetDay, CTime::GetMonth, 和CTime::GetYear的示例：
CTime t( 1999, 3, 19, 22, 15, 0 ); // 10:15PM March 19, 1999
ASSERT( t.GetDay() == 19 );
ASSERT( t.GetMonth() == 3 );
ASSERT( t.GetYear() == 1999 );

请参阅：CTime::GetDayOfWeek


 CTime::GetDayOfWeek

int GetDayOfWeek( ) const;

说明：
此成员函数根据本地时间返回该星期的天；1就是星期日，2就是星期一，...，7就是星期六。这个函数调用GetLocalTm，该函数使用了一个内部的，静态分配的缓冲区。调用其它的CTime成员函数会导致这个缓冲区中的数据被覆盖。


 CTime::GetGmtTm

struct tm* GetGmtTm( struct tm* ptm = NULL ) const;

返回值：
返回一个指向已填好的struct tm的指针，struct tm是在包含文件TIME.H中定义的。该结构的成员和值如下所示：
· | tm_sec | 秒
· | tm_min | 分钟
· | tm_hour | 小时（0—23）
· | tm_mday | 月中的日（1—31）
· | tm_mon | 月（0－11；一月＝0）
· | tm_year | 年（实际的年减1900的差）
· | tm_wday | 星期几（1－7；星期日＝1）
· | tm_yday | 年中的日（0－365；一月一日＝0）
· | tm_isdst | 总是0
注意：struct tm中的年是在范围70至138之间的；在CTime中，年的范围是1970到2038（包含2038）。

参数：
ptm 指向一个将用来接收实际数据的缓冲区。如果这个指针是NULL，则使用一个内部的，静态分配的缓冲区。调用其它的CTime成员函数将导致此缓冲区中的数据被改写。

说明：
此成员函数用来获取一个包含在此CTime对象中所含的时间分解struct tm。GetGmtTm返回UTC。
这个函数调用GetLocalTm，该函数使用了一个内部的、静态分配的缓冲区。调用其它的CTime成员函数会导致这个缓冲区中的数据被覆盖。示例参见GetLocalTm的示例。


 CTime::GetHour

int GetHour( ) const;

说明：
此成员函数根据本地时间返回范围在0至23之间的小时。这个函数调用GetLocalTm，该函数使用了一个内部的、静态分配的缓冲区。调用其它的CTime成员函数会导致这个缓冲区中的数据被覆盖。

示例：
// CTime::GetHour, CTime::GetMinute, 和CTime::GetSecond的示例：
CTime t( 1999, 3, 19, 22, 15, 0 ); // 10:15PM March 19, 1999
ASSERT( t.GetSecond() == 0 );
ASSERT( t.GetMinute() == 15 );
ASSERT( t.GetHour() == 22 );


 CTime::GetLocalTm

struct tm* GetLocalTm( struct tm* ptm = NULL ) const;

返回值：
返回一个指向已填好的struct tm的指针，struct tm是在包含文件TIME.H中定义的。关于该结构的成员安排，参见GetGmtTm。

参数：
ptm 指向一个将用来接收实际数据的缓冲区。如果这个指针是NULL，则使用一个内部的、静态分配的缓冲区。调用其它的CTime成员函数将导致此缓冲区中数据被改写。

说明：
此成员函数用来获取一个包含此CTime对象的分解后的各个成分的struct tm。GetLocalTm返回本地数据。

示例：
// CTime::GetLocalTm示例：
CTime t( 1999, 3, 19, 22, 15, 0 ); // 10:15PM March 19, 1999
struct tm* osTime; // 指向一个包含数据元素的指针。
osTime = t.GetLocalTm( NULL );
ASSERT( osTime->tm_mon == 2 ); // Note zero-based month!


 CTime::GetMinute

int GetMinute( ) const;

说明：
此成员函数根据本地时间返回范围在0至59之间的分钟。这个函数调用GetLocalTm，该函数使用了一个内部的、静态分配的缓冲区。调用其它的CTime成员函数会导致这个缓冲区中的数据被覆盖。


 CTime::GetMonth

int GetMonth( ) const;

说明：
此成员函数根据本地时间返回范围在1至12之间的月（1＝一月）。这个函数调用GetLocalTm，该函数使用了一个内部的、静态分配的缓冲区。调用其它的CTime成员函数会导致这个缓冲区中的数据被覆盖。示例参见GetDay的示例。


 CTime::GetSecond

int GetSecond( ) const;

说明：
此成员函数根据本地时间返回范围在0至59之间的秒。这个函数调用GetLocalTm，该函数使用了一个内部的、静态分配的缓冲区。调用其它的CTime成员函数会导致这个缓冲区中的数据被覆盖。


 CTime::GetTime

time_t GetTime( ) const;

说明：
此成员函数返回一个给定CTime对象的time_t值。

示例：
// CTime::GetTime示例：
CTime t( 1999, 3, 19, 22, 15, 0 ); // 10:15PM March 19, 1999
time_t osBinaryTime = t.GetTime(); // time_t在<time.h>中定义
printf( "time_t = %ld\n", osBinaryTime );

请参阅：CTime::CTime


 CTime::GetYear

int GetYear( ) const;

说明：
此成员函数根据本地时间返回范围在1970年1月1日至2038年1月18日之间的年。这个函数调用GetLocalTm，该函数使用了一个内部的，静态分配的缓冲区。调用其它的CTime成员函数会导致这个缓冲区中的数据被覆盖。示例参见GetDay的示例。

请参阅：CTime::CTime


 CTime::operator =

const CTime& operator =( const CTime& timeSrc );
const CTime& operator =( time_t t );

说明：
这些重载的赋值操作符将源时间拷贝到此CTime对象中。
保存在一个CTime对象中的内部时间与时区无关。在赋值操作中不用进行时区转换。

示例：
// CTime::operator = 示例：
time_t osBinaryTime; // C 运行时时间 (在<time.h>中定义)
CTime t1 = osBinaryTime; // Assignment from time_t
CTime t2 = t1; // Assignment from CTime

请参阅：CTime::CTime


 CTime::operator +, -

CTime operator +( CTimeSpan timeSpan ) const;
CTime operator - ( CTimeSpan timeSpan ) const;
CTimeSpan operator - ( CTime time ) const;

说明：
CTime对象表示绝对时间。CTimeSpan对象表示相对时间。前两个操作符允许你向或从CTime对象中加上或减去一个CTimeSpan对象。第三个操作符允许你将两个CTime对象相减产生一个CTimeSpan对象。

示例：
// CTime::operator +, - 示例：
CTime t1( 1999, 3, 19, 22, 15, 0 ); // 10:15PM March 19, 1999
CTime t2( 1999, 3, 20, 22, 15, 0 ); // 10:15PM March 20, 1999
CTimeSpan ts = t2 - t1; // Subtract 2 Ctimes
ASSERT( ts.GetTotalSeconds() == 86400L );
ASSERT( ( t1 + ts ) == t2 ); // Add a CTimeSpan to a CTime.
ASSERT( ( t2 - ts ) == t1 ); // Subtract a CTimeSpan from a CTime.


 CTime::operator +=, -=

const CTime& operator +=( CTimeSpan timeSpan );
const CTime& operator -=( CTimeSpan timeSpan );

说明：
这些操作符允许你从此CTime对象中加上或减去一个CTimeSpan对象。

示例：
// CTime::operator -= 示例：
CTime t( 1999, 3, 19, 22, 15, 0 ); // 10:15PM March 19, 1999
t += CTimeSpan( 0, 1, 0, 0 ); // 1 hour exactly
ASSERT( t.GetHour() == 23 );


 CTime::operator <<, >>

friend CDumpContext& AFXAPI operator <<( CDumpContext& dc, CTime time );
friend CArchive& AFXAPI operator <<( CArchive& ar, CTime time );
friend CArchive& AFXAPI operator >>( CArchive& ar, CTime& rtime );

说明：
CTime插入操作符（<<）支持向一个存档中进行诊断存档和转储。提取操作符（>>）支持从一个存档装入。

示例：
// CTime::operators <<, >>示例：
CTime t( 1999, 3, 19, 22, 15, 0 ); // 10:15PM March 19, 1999
afxDump << t << "\n"; // Prints 'CTime("Fri Mar 19 22:15:00 1999")'.
extern CArchive ar;
if( ar.IsLoading() ) ar >> t;
else ar << t;

请参阅：CArchive, CDumpContext


 CTimeSpan

CTimeSpan没有基类。
一个CTimeSpan对象代表一个相对的时间段。CTimeSpan引入了ANSI time_t数据及与之相关的运行时函数。这些函数将秒转换为日，时，分和秒的各种组合。
一个CTimeSpan对象以秒为单位保存时间。由于CTimeSpan对象以带符号的四字节数存储，所以最大的时间跨度近似为+-68年。
另外一个与CTimeSpan对应的类是CTime，它描述的是绝对时间。CTimeSpan是两个CTime对象之间的差。
CTime和CTimeSpan类不可派生。因为没有虚函数，所以CTime和CTimeSpan对象的大小都正好是四字节。大多数成员函数都是内联函数。
有关使用CTime的更多信息，参见“Visual C++程序员指南”中的文章“日期和时间”，以及“Microsoft Visual C++ 6.0参考库”的“Microsoft Visual C++ 6.0运行时库参考”卷中的“时间管理”。

#include <afx.h>

请参阅：
Run-time functions: asctime, _ftime, gmtime, localtime, strftime, time

CTimeSpan类成员

构造
CTimeSpan 用不同的方法构造CtimeSpan对象

获取
GetDays | 返回此CTimeSpan对象中的完整的天数
GetHours | 返回当前日中的小时数（-23至+23）
GetMinutes | 返回当前小时中的分钟数（-59至+59）
GetSeconds | 返回当前分钟中的秒数（-59至+59）
GetTotalHours | 返回此CTimeSpan对象中的完整的小时数
GetTotalMinutes | 返回此CTimeSpan.对象中的完整的分钟数
GetTotalSeconds | 返回此CTimeSpan对象中的完整的秒数

转换
Format 将一个CTimeSpan转换为一个格式化的字符串

操作符
operator = | 赋一个新的时间段值
operator +,- | 加或减去CTimeSpan对象
operator +=,-= | 向或从此CTimeSpan中加上或减去一个CTimeSpan对象
关系操作符 | 比较两个相对的时间值

归档/存储
operator << | 向CArchive或CDumpContext输出一个一个CTimeSpan对象
operator >> | 从CArchive输入一个CTimeSpan对象


 CTimeSpan::CTimeSpan

CTimeSpan( );
CTimeSpan( const CTimeSpan& timeSpanSrc );
CTimeSpan( time_t time );
CTimeSpan( LONG lDays, int nHours, int nMins, int nSecs );

参数：
timeSpanSrc | 一个已存在的CTimeSpan对象。
time | 一个time_t时间值。
lDays, nHours, nMins, nSecs | 分别代表日，时，分，秒

说明：
所有这些构造函数都创建一个新的CTimeSpan对象，并用指定的相对时间值来对其进行初始化。下面是对每一个构造函数的描述：
·CTimeSpan( );构造一个没有被初始化的CTimeSpan对象。
·CTimeSpan( const CTimeSpan& );从另一个CTimeSpan值构造一个CTimeSpan对象。
·CTimeSpan( time_t );从一个time_t类型构造一个CTimeSpan对象。这个time_t值应该是两个绝对time_t值的差。
·CTimeSpan( LONG, int, int, int );由时间跨度的组成部分构造一个CTimeSpan对象。每一个成分都受下列范围的限制：
构成 | 范围
lDays | 0至25,000（近似值）
nHours | 0至23
nMins | 0至59
nSecs | 0至59
注意，如果有一个或多个时间—日成分超出了范围，则Microsoft基础类库将给出断言。在调用之前由你负责检验参数是否有效。

示例：
// example for CTimeSpan::CTimeSpan
CTimeSpan ts1; // Uninitialized time value
CTimeSpan ts2a( ts1 ); // Copy constructor
CTimeSpan ts2b = ts1; // Copy constructor again
CTimeSpan ts3( 100 ); // 100 seconds
CTimeSpan ts4( 0, 1, 5, 12 ); // 1 hour, 5 minutes, and 12 seconds


 CTimeSpan::Format

CString Format( LPCSTR pFormat ) const;
CString Format( LPCTSTR pFormat ) const;
CString Format( UINT nID ) const;

返回值：
返回一个包含格式化的时间的CString对象。

参数：
pFormat | 一个类似于printf格式化字符串的格式化字符串。前面有一个百分号（%）标记的格式化代码，将被相应的CTimeSpan成分替换。格式化字符串中的其它字符被不作变动地拷贝到返回字符串中。
Format的格式化代码的值和意义如下所示：
·%D | 此CTime中的总天数。
·%H | 当前天的小时。
·%M | 当前小时中的分钟。
·%S | 当前分钟中的秒。
·%% | 百分号。
nID | 用来表示这个格式的字符串的ID。

说明：
生成一个对应于此CTimeSpan的格式化字符串。
库的调试版检查格式化代码，如果代码不在上面的列表中，则将给出断言。

示例：
// example for CTimeSpan::Format
CTimeSpan ts( 3, 1, 5, 12 ); // 3 days, 1 hour, 5 min, and 12 sec
CString s = ts.Format( "Total days: %D, hours: %H, mins: %M, secs: %S" );
ATLASSERT( s == "Total days: 3, hours: 01, mins: 05, secs: 12" );


 CTimeSpan::GetDays

LONG GetDays( ) const;

说明：
此成员函数返回完整的天数。如果该时间段是负的，则这个值可能是负的。

示例：
// example for CTimeSpan::GetDays
CTimeSpan ts( 3, 1, 5, 12 ); // 3 days, 1 hour, 5 min, and 12 sec
ATLASSERT( ts.GetDays() == 3 );


 CTimeSpan::GetHours

int GetHours( ) const;

说明：
此成员函数返回当前日的小时数。其范围是-23到+23。

示例：
// example for CTimeSpan::GetHours
CTimeSpan ts( 3, 1, 5, 12 ); // 3 days, 1 hour, 5 min, and 12 sec
ATLASSERT( ts.GetHours() == 1 );
ATLASSERT( ts.GetMinutes() == 5 );
ATLASSERT( ts.GetSeconds() == 12 );


 CTimeSpan::GetMinutes

int GetMinutes( ) const;

说明：
此成员函数返回当前小时中的分钟数。范围是-59到59。

示例：参见GetHours的示例。


 CTimeSpan::GetSeconds

int GetSeconds( ) const;

说明：
此成员函数返回当前分钟中的秒数。范围是-59到59。

示例：参见GetHours的示例


 CTimeSpan::GetTotalHours

LONG GetTotalHours( ) const;

说明：
此成员函数返回此CTimeSpan中的完整小时数。

示例：
// example for CTimeSpan::GetTotalHours
CTimeSpan ts( 3, 1, 5, 12 ); // 3 days, 1 hour, 5 min, and 12 sec
ATLASSERT( ts.GetTotalHours() == 73 );
ATLASSERT( ts.GetTotalMinutes() == 4385 );
ATLASSERT( ts.GetTotalSeconds() == 263112 );


 CTimeSpan::GetTotalMinutes

LONG GetTotalMinutes( ) const;

说明：
此成员函数返回此CTimeSpan中的完整分钟数。 示例：参见GetTotalHours的示例。


 CTimeSpan::GetTotalSeconds

LONG GetTotalSeconds( ) const;

说明：
此成员函数返回此CTimeSpan中的完整秒数。

示例：参见GetTotalHours的示例。


 CTimeSpan::operator =

const CTimeSpan& operator =( const CTimeSpan& timeSpanSrc );

说明：
这些重载的赋值操作符将源CTimeSpan timeSpanSrc对象拷贝到此CTimeSpan对象中。

示例：
// CTimeSpan::operator =示例：
CTimeSpan ts1;
CTimeSpan ts2( 3, 1, 5, 12 ); // 3 days, 1 hour, 5 min, and 12 sec
ts1 = ts2;
ASSERT( ts1 == ts2 );

请参阅：CTimeSpan::CTimeSpan


 CTimeSpan::operator +,-

CTimeSpan operator +( CTimeSpan timeSpan ) const;
CTimeSpan operator -( CTimeSpan timeSpan ) const;

说明：
这两个操作符允许你将两个CTimeSpan对象相加或相减。

示例：
// example for CTimeSpan::operator +, -
CTimeSpan ts1( 3, 1, 5, 12 ); // 3 days, 1 hour, 5 min, and 12 sec
CTimeSpan ts2( 100 ); // 100 seconds
CTimeSpan ts3 = ts1 + ts2;
ATLASSERT( ts3.GetSeconds() == 52 ); // 6 mins, 52 secs


 CTimeSpan::operator +=, -=

const CTimeSpan& operator +=( CTimeSpan timeSpan );
const CTimeSpan& operator -=( CTimeSpan timeSpan );

说明：
这些操作符允许你向或从此CTimeSpan中加上或减去一个CTimeSpan对象。

示例：
// example for CTimeSpan::operator +=, -=
CTimeSpan ts1( 10 ); // 10 seconds
CTimeSpan ts2( 100 ); // 100 seconds
ts2 -= ts1;
ATLASSERT( ts2.GetTotalSeconds() == 90 );


 CTimeSpan::operator <<, >>

friend CDumpContext& AFXAPI operator<<( CDumpContext& dc, CTimeSpan timeSpan );
friend CArchive& AFXAPI operator<<( CArchive& ar, CTimeSpan timeSpan );
friend CArchive& AFXAPI operator>>( CArchive& ar, CTimeSpan& rtimeSpan );

说明：
CTimeSpan插入操作符（<<）支持向一个存档进行诊断转储和存储。提取操作符（>>）支持从一个存档中装入。
当你向一个转储环境发送CTimeSpan对象时，时间跨度以日，时，分和秒的数字字符格式显示出来。

示例：
// CTimeSpan::operators <<, >> 示例：
CTimeSpan ts( 3, 1, 5, 12 ); // 3 days, 1 hour, 5 min, and 12 sec
#ifdef _DEBUG
afxDump << ts << "\n";
#endif
// Prints 'CTimeSpan(3 days, 1 hours, 5 minutes and 12 seconds)'
extern CArchive ar;
if( ar.IsLoading( )) ar >> ts;
else ar << ts;


 CTimeSpan Comparison Operators

BOOL operator ==( CTimeSpan timeSpan ) const;
BOOL operator !=( CTimeSpan timeSpan ) const;
BOOL operator <( CTimeSpan timeSpan ) const;
BOOL operator >( CTimeSpan timeSpan ) const;
BOOL operator <=( CTimeSpan timeSpan ) const;
BOOL operator >=( CTimeSpan timeSpan ) const;

说明：
这些操作符比较两个相对时间值。如果测试条件为真，则返回非零值；否则返回0。

示例：
// example for CTimeSpan comparison operatorsCTimeSpan ts1( 100 );
CTimeSpan ts2( 110 );
ATLASSERT( ( ts1 != ts2 ) && ( ts1 < ts2 ) && ( ts1 <= ts2 ) );


 CToolBar

CObject
└CCmdTarget
└CWnd
└CControlBar
└CToolBar

类CToolBar的对象是带有一行位图按钮和可选分隔线的控件条。这些按钮可以像普通按钮、核选按钮或单选按钮那样动作。CToolBar对象通常是由CFrameWnd或CMDIFrameWnd派生的框架窗口对象的嵌入成员。
CToolBar::GetToolBarCtrl是MFC4.0后新增加的成员函数，它允许你利用Windows通用控件对工具条的定制及其它性能的支持。CToolBar的成员函数为你提供了Windows通用控件的大多数性能；但是，当你调用GetToolBarCtrl时，你可以使你的工具条具有更多Windows 95工具条的特征。参见CToolBarCtrl可以获得更多有关如何使用Windows通用控件来设计工具条的信息。更多有关通用控件的一般信息，参见“Windows 95 SDK程序员参考”中的“通用控件”。
Visual C++提供了两种创建一个工具条的方法。要使用资源编辑器（ResourceEditor）创建一个工具条，应遵循下面的步骤：
1. | 创建一个工具条资源。
2. | 构造CToolBar对象。
3. | 调用Create（或CreateEx）函数来创建Windows工具条并将它与该CToolBar对象连接。
4. | 调用LoadToolBar来装入工具条资源。

另外，也可以依据下面的步骤：
1. | 构造CToolBar对象。
2. | 调用Create（或CreateEx）函数来创建Windows工具条并将它与CToolBar对象连接。
3. | 调用LoadBitmap来装入包含工具条按钮图像的位图。
4. | 调用SetButtons来设置按钮风格并使每一个按钮与位图中的一幅图像关联。

此工具条中的所有按钮图像都位于同一个位图，该位图必须为每一个按钮包含一个图像。所有的图像都必须是同样大小的。缺省的尺寸是16个像素宽和15个像素高。这些图像必须一幅接一幅的放在位图中。
SetButton函数以指向一个控制ID数组的指针和一个指定数组中元素数目的整数作为参数。该函数将每个按钮的ID值设置为对应的数组元素的值，并赋予每个按钮一个图像索引值，每个索引值指定对应按钮图像在位图中的位置。如果某一数组元素的值为ID_SEPARATOR，则不为其赋图像索引值。
按钮图像在位图中的次序通常就是图像在屏幕上的绘制次序，但你也可以使用SetButtonInfo函数来修改图像次序和绘制次序的关系。
一个工具条中的所有按钮都具有相同的尺寸。按照“Windows界面软件设计指南”中所说，缺省尺寸为24×22个像素。图像和按钮之间的任何空白尺寸都可用来在图像周围形成一个边界。
每个按钮具有一幅图像。按钮的各种状态和风格（被压住，弹起，按下，无效，无效按下，以及不定）都可以由这幅图像产生。虽然位图可以是任何颜色，但是使用灰色加黑色文字及阴影可实现最好的效果。
缺省情况下，工具条按钮模拟普通按钮。但是，工具条按钮也可以模拟复选框按钮和单选按钮。复选框按钮具有三种状态：核选，清除和不定。单选按钮值具有两种状态：核选和清除。
要设置单个按钮或不指向一个数组的分隔线风格，可以调用GetButtonStyle来获取这个风格，然后调用SetButtonStyle（而不是调用SetButton）。当你要在运行时改变按钮的风格时，SetButtonStyle是最有用的。
要分配显示在一个按钮上的文本，可以调用GetButtonText来获取要显示在该按钮上的文本，然后调用SetButtonText来设置这些文本。
要创建一个复选框按钮，给它赋予TBBS_CHECKBOX风格或在一个ON_UPDATE_ COMMAND_UI处理程序中使用某个CCmdUI对象的SetCheck成员函数。调用SetCheck将一个普通按钮变成一个复选框按钮。传递给SetCheck函数的参数为0，则按钮是未核选的，传递1则按钮被核选，传递2则按钮为不定状态。
要创建一个单选按钮，在一个ON_UPDATE_COMMAND_UI处理程序中调用某个CCmdUI对象的SetRadio成员函数。给SetRadio传递参数0，则按钮为未核选的，传递非零值，则按钮是被核选的。为了提供一个单选按钮组的互不相容性，则组中的每个按钮都必须具有ON_UPDAT_COMMAND_UI处理程序。
有关使用CToolBar的更多信息，参见“Visual C++程序员指南”中的文章“工具条”和“Visual C++联机文件”中的技术注释31，控制条。

#include <afxext.h>

请参阅：
CToolBarCtrl, CControlBar, CToolBar::Create, CToolBar::LoadBitmap, CToolBar::SetButtons, CCmdUI::SetCheck, CCmdUI::SetRadio

CToolBar类成员

构造
CToolBar | 创建一个CtoolBar对象
Create | 创建Windows工具条并将它与该CToolBar连接
CreateEx | 为嵌入的CtoolBarCtrl对象创建一个具有附加风格的CToolBar对象
SetSizes | 设置按钮及其位图的尺寸
SetHeight | 设置工具条的高度
LoadToolBar | 装入一个用资源编辑器创建的工具条资源
LoadBitmap | 装入包含位图-按钮图像的位图
SetBitmap | 设置一个位图中的图像
SetButtons | 设置按钮风格和按钮图像在位图中的索引

属性
CommandToIndex | 返回具有给定的命令ID的按钮的索引
GetItemID | 返回具有给定索引值的按钮或分隔线的命令ID
GetItemRect | 获取具有给定索引值的项的显示矩形
GetButtonStyle | 获取一个按钮的风格
SetButtonStyle | 设置一个按钮的风格
GetButtonInfo | 获取一个按钮的ID，风格和图像号
SetButtonInfo | 设置一个按钮的ID，风格和图像号
GetButtonText | 获取要显示在一个按钮上的文本
SetButtonText | 设置要显示在一个按钮上的文本
GetToolBarCtrl | 允许直接访问基本的通用控件


 CToolBar::CommandToIndex

int CommandToIndex( UINT nIDFind );

返回值：
返回按钮的索引，如果没有按钮具有这个给定的命令ID，则返回-1。

参数：
nIDFind 一个工具条按钮的命令ID。

说明：
此成员函数返回第一个工具条按钮的从位置0开始的索引，该按钮的命令ID与nIDFind匹配。

请参阅：CToolBar::GetItemID


 CToolBar::Create

BOOL Create( CWnd* pParentWnd,
DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_TOP,
UINT nID = AFX_IDW_TOOLBAR
);

返回值：如果成功则返回非零值；否则返回0。

参数：
pParentWnd | 指向工具条的父窗口的指针。
dwStyle工具条的风格。下面列出的是此参数支持的附加风格：
· | CBRS_TOP | 控制条位于框架窗口的顶部。
· | CBRS_BOTTOM | 控制条位于框架窗口的底部。
· | CBRS_NOALIGN | 当父窗口调整尺寸时不重定位控制条。
· | CBRS_TOOLTIPS | 控制条显示工具提示。
· | CBRS_SIZE_DYNAMIC | 控制条是动态的。
· | CBRS_SIZE_FIXED | 控制条是固定的。
· | CBRS_FLOATING | 控制条是浮动的。
· | CBRS_FLYBY | 状态条显示按钮的信息。
· | CBRS_HIDE_INPLACE | 控件不显示给用户。
nID | 工具条子窗口的ID。

说明：
此成员函数用来创建一个Windows工具条（一个子窗口），并将它与CToolBan对象连接。它还将工具条的高度设置为缺省值。

请参阅：
CToolBar::CToolBar, CToolBar::LoadBitmap, CToolBar::SetButtons, CToolBar::LoadToolBar, CControlBar::CalcDynamicLayout, CControlBar::CalcFixedLayout


 CToolBar::CreateEx

BOOL CreateEx( CWnd* pParentWnd,
DWORD dwCtrlStyle = TBSTYLE_FLAT,
DWORD dwStyle = WS_CHILD | WS_VISIBLE | CBRS_ALIGN_TOP,
CRect rcBorders = CRect( 0, 0, 0 ),
UINT nID = AFX_IDW_TOOLBAR
);

返回值：如果成功则返回非零值；否则返回0。

参数：
pParentWnd | 指向工具条的父窗口的指针。
dwCtrlStyle | 嵌入CToolBarCtrl对象的附加风格。缺省的，这个值被设置为TBSTYLE_FLAT。工具条风格的完整列表，参见dwStyle。
dwStyle | 工具条风格。参见“Platform SDK”的“工具条控件和按钮风格”可以获得一个相关风格的列表。
rcBorders | 一个定义工具条窗口边框的宽度的CRect对象。缺省的这些边框被设置为0，0，0，0，这样的工具条窗口是没有边界的。
nID | 工具条的子窗口ID。

说明：
此成员函数用来创建一个Windows工具条（一个子窗口）并将它与该CToolBar对象连接。它还将工具条的高度设置为一个缺省值。
当在嵌入工具条控件的创建期间需要指定某个特定的风格时，使用CreateEx来代替Create。例如，将dwCtrlStyle设置为TBSTYLE_FLAT |TBSTYLE_TRANSPARENT来创建一个类似于Internet Explorer 4工具条的工具条。


 CToolBar::CToolBar

CToolBar( );

说明：
这个成员函数构造一个CToolBar对象并将它设置为缺省尺寸。

请参阅：CToolBar::Create


 CToolBar::GetButtonInfo

void GetButtonInfo( int nIndex, UINT& nID, UINT& nStyle, int& iImage ) const;

参数：
nIndex | 要获取其信息的工具条按钮或分隔线的索引。
nID | 对一个被设置为按钮的命令ID的UINT值的引用。
nStyle | 对一个被设置为按钮的风格的UINT值的引用。
iImage | 对一个被设置为按钮的图像在位图中的索引值的整数的引用。

说明：
此成员函数用来获取位于由nIndex指定的位置的工具条按钮或分隔线的控制ID，风格和图像索引。这些值被分别赋给由nID，nStyle和iImage引用的变量。图像索引是图像在位图中的位置，该位图包含了所有工具条按钮的图像。第一个图像位于位置0。
如果nIndex指定的是一个分隔线，则iImage被设置为以像素表示的分隔线宽度。

请参阅：
CToolBar::SetButtonInfo, CToolBar::GetItemID


 CToolBar::GetButtonStyle

UINT GetButtonStyle( int nIndex ) const;

返回值：
返回由nIndex指定的按钮或分隔线的风格。

参数：
nIndex 要获取其风格的工具条按钮或分隔线的索引。

说明：
此成员函数用来获取工具条上的一个按钮或分隔线的风格。一个按钮的风格确定了按钮显示的样子，以及按钮对用户输入作出的反应。参见SetButtonStyle可以获得有关按钮风格的例子。

请参阅：CToolBar::SetButtonStyle


 CToolBar::GetButtonText

CString GetButtonText( int nIndex ) const;
void GetButtonText( int nIndex, CString& rString ) const;

返回值：返回包含按钮的文本的CString对象。

参数：
nIndex | 要获取的文本的索引。
rString | 一个对CString对象的引用，该对象将包含要被获取的文本。

说明：
此成员函数用来获取显示在一个按钮上的文本。这个函数的第二种形式用字符串文本来填充一个CString对象。

请参阅：CToolBar::SetButtonText


 CToolBar::GetItemID

UINT GetItemID( int nIndex ) const;

返回值：
返回由nIndex指定的按钮或分隔线的命令ID。

参数：
nIndex 要获取其ID的项的索引。

说明：
此成员函数返回由nIndex指定的按钮或分隔线的命令ID。分隔线返回ID_SEPARATOR。

请参阅：
CToolBar::CommandToIndex, CControlBar::GetCount


 CToolBar::GetItemRect

virtual void GetItemRect( int nIndex, LPRECT lpRect );

参数：
nIndex | 要获取其矩形坐标的项（按钮或分隔线）的索引。
lpRect | 将包含项的坐标的RECT结构的地址。

说明：
此成员函数用由nIndex指定的按钮或分隔线的坐标来填充由lpRect指定地址的RECT结构。坐标是以像素为单位的相对于工具条的左上角的值。
使用GetItemRect函数可以获取要用组合框或其它控件替换的分隔线的坐标。

请参阅：CToolBar::CommandToIndex


 CToolBar::GetToolBarCtrl

CToolBarCtrl& GetToolBarCtrl( ) const;

返回值：返回一个对CToolBarCtrl对象的引用。

说明：
此成员函数允许对基本通用控件的直接访问。
使用GetToolBarCtrl可以利用Windows工具条通用控件的性能，并且可以利用CToolBarCtrl为工具条定制提供的支持。
有关使用命令控件的更多信息，参见“Visual C++ 程序员指南”中的文章“控件主题”和“Windows 95 SDK程序员参考”中的“通用控件”。

请参阅：CToolBarCtrl


 CToolBar::LoadBitmap

BOOL LoadBitmap( LPCTSTR lpszResourceName );
BOOL LoadBitmap( UINT nIDResource );

返回值：如果成功则返回非零值；否则返回0。

参数：
lpszResourceName | 指向要被装入的位图的资源名称的指针。
nIDResource | 要装入的位图的资源ID。

说明：
此成员函数用来装入由lpszResourceName或nIDResource指定的位图。该位图应该为每一个工具条按钮包含一个图像。如果该图像不具有标准尺寸（16像素宽，15像素高），则定义SetSizes来设置按钮的尺寸和它们的图像。

请参阅：
CToolBar::Create, CToolBar::SetButtons, CToolBar::SetSizes, CToolBar::LoadToolBar


 CToolBar::LoadToolBar

BOOL LoadToolBar( LPCTSTR lpszResourceName );
BOOL LoadToolBar( UINT nIDResource );

返回值：如果成功则返回非零值；否则返回0。

参数：
lpszResourceName | 指向要被装入的工具条的资源名称的指针。
nIDResource | 要装入的工具条的资源ID。

说明：
此成员函数用来装入由lpszResourceName或nIDResource指定的工具条。
参见“Visual C++用户指南”中的“工具条编辑器”可以获得有关创建一个工具条资源的更多信息。

请参阅：
CToolBar::Create, CToolBar::LoadBitmap, CToolBar::SetButtons


 CToolBar::SetBitmap

BOOL SetBitmap( HBITMAP hbmImageWell );

返回值：如果成功则返回非零值；否则返回0。

参数：
hbmImageWell 一个与工具条相关联的位图图像的句柄。

说明：
此成员函数用来为工具条设置位图图像。例如，在用户对文档采取了可以改变按钮动作的行动之后，调用SetBitmap可以改变位图方式的图像。


 CToolBar::SetButtonInfo

void SetButtonInfo( int nIndex, UINT nID, UINT nStyle, int iImage );

参数：
nIndex | 要设置其信息的按钮或分隔线的索引。
nID | 要给按钮的命令ID设置的值。
nStyle新的按钮风格。下面的按钮风格是被支持的：
· | TBBS_BUTTON | 标准按钮（缺省的）
· | TBBS_SEPARATOR | 分隔线。
· | TBBS_CHECKBOX | 自动复选框按钮。
· | TBBS_GROUP | 标记一个按钮组的开始。
· | TBBS_CHECKGROUP | 标记一个复选框按钮组的开始。
iImage | 按钮的图像在位图中的新索引。

说明：
此成员函数用来设置按钮的命令ID，风格和图像号。对于具有TBBS_SEPARATOR风格的分隔线，这个函数将分隔线的以像素为单位的宽度设置为保存在iImage中的值。
有关位图图像和按钮的更多信息，参见CToolBar概述和CToolBar::LoadBitmap。

请参阅：CToolBar::GetButtonInfo


 CToolBar::SetButtons

BOOL SetButtons( const UINT* lpIDArray, int nIDCount );

返回值：如果成功则返回非零值；否则返回0。

参数：
lpIDArray | 指向一个命令Ids数组的指针。它可以是NULL，用于分配空的按钮。
nIDCount | 由lpIDArray指向的数组的元素数目。

说明：
此成员函数用来将每一个工具条按钮的命令ID设置为由数组lpIDArray的相应元素指定的值。如果该数组的某个元素的值是ID_SEPARATOR，则在工具条的相应位置创建一个分隔线。这个函数还将每个控件的风格设置为TBBS_BUTTON，将每个分隔线的风格设置为TBBS_SEPARATOR，并为每一个按钮分配一个图像索引。图像索引指定了按钮的图像在位图中的位置。
你不用在位图中说明分隔线，因为这个函数不给分隔线分配图像索引。如果你的工具条有位于位置0，1和3的按钮，有位于位置2的分隔线，则位于你的位图中的位置0，1，和2的图像将被分别分配给位置0，1和3的位图。
如果lpIDArray是NULL，则此函数按nIDCount指定的项数分配空间。使用SetButtonInfo可以设置每一个项的属性。

请参阅：
CToolBar::Create, CToolBar::SetButtonInfo, CToolBar::SetButtonStyle, CToolBar::LoadToolBar


 CToolBar::SetButtonStyle

void SetButtonStyle( int nIndex, UINT nStyle );

参数：
nIndex 要设置其风格的按钮或分隔线的索引。
nStyle按钮风格。下面的按钮风格都是被支持的：
· | TBBS_BUTTON | 标准按钮（缺省的）
· | TBBS_SEPARATOR | 分隔线。
· | TBBS_CHECKBOX | 自动复选框按钮。
· | TBBS_GROUP | 标记一个按钮组的开始。
· | TBBS_CHECKGROUP | 标记一个复选框按钮组的开始。

说明：
此成员函数用来设置一个按钮或分隔线或按钮组的风格。一个按钮的风格决定了按钮是如何显示的，以及它对用户的输入是如何反应的。
在调用SetButtonStyle之前，调用GetButtonStyle成员函数来获取该按钮或分隔线的风格。

请参阅：CToolBar::GetButtonStyle


 CToolBar::SetButtonText

BOOL SetButtonText( int nIndex, LPCTSTR lpszText );

返回值：如果成功则返回非零值；否则返回0。

参数：
nIndex | 要设置其文本的按钮的索引。
lpszText | 指向要被设置到一个按钮上的文本。

说明：此成员函数用来设置一个按钮上的文本。

请参阅：CToolBar::GetButtonText


 CToolBar::SetHeight

void SetHeight( int cyHeight );

参数：
cyHeight 是工具条的以像素表示的高度。

说明：
此成员函数用来将工具条的高度设置为在cyHeight中指定的以像素表示的值。在调用SetSize之后，可以使用这个成员函数来重新设置这个标准工具条的高度。如果这个高度太小，则按钮将被从底部剪切。
如果没有调用这个函数，则框架使用该按钮的尺寸来确定此工具条的高度。

请参阅：
CToolBar::SetSizes, CToolBar::SetButtonInfo, CToolBar::SetButtons


 CToolBar::SetSizes

void SetSizes( SIZE sizeButton, SIZE sizeImage );

参数：
sizeButton | 每个按钮的用像素表示的尺寸。
sizeImage | 每个图像的以像素表示的尺寸。

说明：
此成员函数用来将工具条的按钮的尺寸设置为在sizeButton中指定的以像素表示的尺寸。sizeImage参数必须包含在工具条位图中的图像的以像素表示的尺寸。sizeButton中的空间必须足够大以能存放在宽度上加7个像素，在高度上加6个像素的按钮图像。此函数还用来设置工具条的高度以使它能与按钮相适合。
只有当工具条不采用“Windows界面软件设计”中推荐的按钮和图像尺寸时，才调用这个函数。

请参阅：
CToolBar::LoadBitmap, CToolBar::SetButtonInfo, CToolBar::SetButtons


 CToolBarCtrl

CObject
└CCmdTarget
└CWnd
└CToolBarCtrl

CToolBarCtrl类提供了Windows工具条通用控件的性能。这个控件（也就是CToolBarCtrl类）只对运行在Windows 95和Windows NT 3.51或更高版本下的程序来说才是可用的。
一个Windows工具条通用控件是一个矩形子窗口，它包含一个或多个按钮。这些按钮可以显示一个位图图像，一个字符串，或两者都有。当用户选择一个按钮时，它向该工具条的属主窗口发送一条命令消息。通常，工具条中的按钮对应于应用程序的菜单中的项；这些按钮为用户访问一个应用程序的命令提供了更为直接的方法。
CToolBarCtrl对象包含几个重要的内部数据结构：一个按钮图像列表或一个图像列表，一个按钮标签字符串列表和一个TBBUTTON结构的列表，该结构使一个图像和/或字符串与按钮的位置，风格，主题和命令ID相关联。这些数据结构的每一个都由一个从零开始的索引来引用。在你可以使用一个CToolBarCtrl对象之前，你必须设置这些数据结构。字符串列表只能被用作按钮标签；不能从按钮中检取字符串。
要使用一个CToolBarCtrl对象，通常你应该遵循下面的这些步骤：
1. | 构造该CToolBarCtrl对象。
2. | 调用Create来创建Windows工具条通用控件并将它与该CToolBarCtrl对象连接。通过使用风格来指定工具条的风格，如对一个透明的工具条使用TBSTYLE_ TRANSPARENT，或对一个支持风格按钮的工具条使用TBSTYLE_DROPDOWN。
3.指明你希望按钮在工具条上如何显示：
· | 给按钮使用位图图像，通过调用AddBitmap将按钮位图添加到工具条中。
· | 给按钮使用来自一个图像列表的图像，通过调用SetImageList，SetHotImageList，或SetDisabledImageList来指定图像列表。
· | 给按钮使用字符串标签，通过调用AddString和/或AddStrings来将字符串添加到工具条中。
4. | 通过调用AddButtons将按钮结构添加到工具条中。
5. | 如果你希望在一个不是CFrameWnd的属主窗口中的工具条具有工具提示，则你必须在工具条的属主窗口中处理TTN_NEEDTEXT消息，就像在CToolBarCtrl：处理工具提示通知中描述的一样。如果工具条的父窗口是由CFrameWnd派生而来的，则你不用作任何额外的努力就可以显示工具提示，因为CFrameWnd提供了一个缺省的处理函数。
6. | 如果你希望能够让用户定制工具条，则在属主窗口中处理定制通知消息，就像在CToolBarCtrl：处理定制通知中描述的一样。
你可以使用SaveState来将一个工具条控件的当前状态保存在注册表中，用RestoreState来根据注册表中先前保存的信息恢复工具条的状态。除了在应用程序的使用之间保存工具条的状态，通常在用户开始定制该工具条之前应用程序会保存工具条的状态，以防用户后来想将工具条恢复到它的最初的状态。

为Internet Explorer 4.0或更新版提供的支持
要支持在Internet Explorer 4.0或更新版之后引入的性能，MFC提供了图像列表支持，为工具条提供了透明和平坦风格。
一个透明的工具条允许在工具条下的客户被透过工具条显示出来。要创建一个透明的工具条，要同时使用TBSTYLE_FLAT和TBSTYLE_TRANSPARENT风格。透明的工具条具有热点跟踪的特色；就是说，当鼠标指针移动到工具条的一个热点按钮上时，按钮的外观改变。只用TBSTYLE_FLAT风格创建的工具条将包含不透明的按钮。
图像列表支持使控件的缺省行为具有更大的灵活性，并支持热点图像和无效的图像。对透明的工具条使用GetImageList，GetHotImageList和GetDisabledImageList可以根据它的状态来操纵图像。
有关使用CToolBarCtrl的更多信息，参见“Visual C++程序员指南”中的“控件主题”和“使用CToolBarCtrl”。
#include <afxcmn.h>
请参阅：CToolBar

CToolBarCtrl类成员

构造
CToolBarCtrl | 构造一个CToolBarCtrl对象
Create | 创建一个工具条控件并将它与一个CToolBarCtrl对象连接

属性
IsButtonEnabled | 指示一个工具条控件中的指定按钮是否是有效的
IsButtonChecked | 指示一个工具条控件中的指定按钮是否被核选了
IsButtonPressed | 指示一个工具条控件中的指定按钮是否被压住
IsButtonHidden | 指示一个工具条控件中的指定按钮是否被隐藏
IsButtonIndeterminate | 指示一个工具条控件中的指定按钮的状态是否是不确定的（灰的）
SetState | 设置一个工具条控件中的指定按钮的状态
GetState | 获取关于一个工具条控件中的指定按钮的状态的信息，比如它是有效的、被压住的，或是被核选的
GetButton | 获取一个工具条控件中的指定按钮的信息
GetButtonCount | 获取当前在该工具条控件中的按钮的数目
GetItemRect | 获取一个工具条控制中的按钮的边界矩形
GetRect | 获取一个特定工具条按钮的边界矩形
SetButtonStructSize | 指定TBBUTTON结构的大小
GetButtonSize | 获取的像素表示的工具条按钮当前宽度和高度
SetButtonSize | 设置要被添加到一个工具条控件中去的按钮的尺寸
SetBitmapSize | 设置要被添加到一个工具条控件中去的位图图像的尺寸
GetToolTips | 获取与此工具条控件相关联的工具提示控件（如果有的话）的句柄
SetToolTips | 将一个工具提示控件与该工具条控件关联
SetOwner | 设置接收来自工具条控件的通知消息的窗口
GetRows | 获取当前显示在工具条中的按钮的行数
SetRows | 设置显示在工具条中的按钮的行数
SetCmdID | 设置当指定按钮被按下时，要发送到属主窗口的命令标识符
GetBitmapFlags | 获取与工具条位图相关联的标志
GetDisabledImageList | 获取被一个工具条控件用来显示无效按钮的图像列表
GetHotImageList | 获取被一个工具条控件用来显示“热点”按钮的图像列表。当鼠标指针在一个热点控件上时，该控件被加亮显示
GetImageList | 获取被一个工具条控件用来显示缺省状态按钮的图像列表
GetStyle | 获取一个工具条控件当前使用的风格
GetMaxTextRows | 获取显示在一个工具条按钮上的文本行的最大行数
IsButtonHighlighted | 检验工具条控件的加亮状态
SetButtonWidth | 设置工具条控件中的按钮宽度的最大和最小值
SetDisabledImageList | 设置将要被工具条控件用来显示无效按钮的图像列表
SetHotImageList | 设置将要被工具条控件用来显示“热点”按钮的图像列表
SetImageList | 设置将要被工具条控件用来显示缺省状态按钮的图像列表
GetDropTarget | 获取一个工具条控件的IDropTarget接口
SetIndent | 设置一个工具条控件中的第一个按钮的缩排
SetMaxTextRows | 设置一个工具条按钮所显示的最大文本行数
SetStyle | 设置一个工具条控件的风格
GetAnchorHighlight | 获取一个工具条的固定的加亮设置
SetAnchorHighlight | 设置一个工具条的固定的加亮设置
GetHotItem | 获取一个工具条中的热点项的索引
SetHotItem | 设置一个工具条中的热点项的索引
GetInsertMark | 获取工具条的当前插入标记
SetInsertMark | 设置工具条的当前插入标记
GetMaxSize | 获取工具条中的所有可视按钮和分隔线的总的尺寸
InsertMarkHitTest | 获取一个工具条中的某个点的插入标记信息
GetExtendedStyle | 获取一个工具条控件的扩展风格
SetExtendedStyle | 设置一个工具条控件的扩展风格
GetInsertMarkColor | 获取用来绘制工具条的插入标记的颜色
SetInsertMarkColor | 设置用来绘制工具条的插入标记的颜色
MapAccelerator | 将一个加速键映射到一个工具条按钮
MoveButton | 将一个按钮从一个索引移动到另一个索引
HitTest | 确定一个点位于一个工具条控件的什么地方

操作
EnableButton | 使一个工具条控件中的按钮有效或无效
CheckButton | 核选或清除一个工具条控件中的指定按钮
PressButton | 按下或释放一个工具条控件中的指定按钮
GetButtonInfo | 获取工具条中的一个按钮的信息
SetButtonInfo | 设置工具条中的一个按钮的信息
SetDrawTextFlags | 设置Win 32中DrawText功能的标志，该功能通常根据标志设置的指定矩形、格式设置文本
HideButton | 隐藏或显示一个工具条控件中的指定按钮
Indeterminate | 设置或清除一个工具条控件中的指定按钮的不确定（灰的）状态
AddBitmap | 将一个或更多个位图按钮图像添加到一个工具条控件可用的按钮图像列表中
AddButtons | 将一个或多个按钮添加到一个工具条按钮中
InsertButton | 在一个工具条控件中插入一个按钮
DeleteButton | 从该工具条控件中删除一个按钮
CommandToIndex | 获取与指定的命令标识符相关联的按钮的从零开始的索引
RestoreState | 恢复该工具条控件的状态
MarkButton | 设置在一个工具条控件中给定的高亮状态
LoadImages | 将位图定位到工具条控件的图像列表中
SaveState | 保存该工具条控件的状态
Customize | 显示CustomizeToolbar对话框
AddString | 将作为一个资源ID传递的新字符串添加到工具条的内部字符串列表中
AddStrings | 将一个或多个新字符串添加到工具条的内部字符串列表中，是通过传递指向这些用.空字符分隔的字符串的缓冲区的指针来传递这些字符串的
AutoSize | 调整一个工具条控件的尺寸

CToolBarCtrl：处理工具提示通知
当你指定工具条具有TBSTYLE_TOOLTIPS风格时，该工具条创建并管理一个工具提示控件。一个工具提示是一个小的弹出窗口，该窗口包含了一行用于描述一个工具条按钮的文本。通常该工具提示是被隐藏的，只有当用户将光标放在一个工具条按钮上并停留大概半秒时间时它才显示出来。工具提示显示在光标的附近。
在工具提示被显示之前，TTN_NEEDTEXT通知消息被发送给该工具条的属主窗口，以获取对应于该按钮的描述文本。如果该工具条的属主窗口是一个CFrameWnd窗口，则不需要任何额外的工作就会显示工具提示，因为CFrameWnd有一个缺省的TTN_NEEDTEXT通知处理函数。如果该工具条的属主窗口不是由CFrameWnd派生而来的，比如是一个对话框或格式视，则你必须在你的属主窗口的消息映射中添加一项，并在消息映射中提供一个通知处理函数。下面就是要被添加到你的属主窗口的消息映射：
ON_NOTIFY_EX( TTN_NEEDTEXT, 0, memberFxn )
memberFxn 当这个按钮的文本需要显示时将被调用的成员函数。
注意，一个工具提示的id总是0。
除了TTN_NEEDTEXT通知，一个工具提示控件可以向一个工具条控件发送下列通知：
通知消息 | 含义
TTN_NEEDTEXTA | 需要ASCII文本的工具提示控件（只在Win95下）
TTN_NEEDTEXTW | 需要UNICODE文本的工具提示控件（只在Windows NT下）
TBN_HOTITEMCHANGE | 表示热点（被加亮的）项已经改变了
NM_RCLICK | 表示用户用鼠标右键单击一个按钮
TBN_DRAGOUT | 表示用户点击按钮并拖动指针离开了按钮。它支持应用程序实现对一个工具条按钮的拖放。但接收到这个通知时，应用程序将开始拖放操作
TBN_DROPDOWN | 表示用户已经点击了一个使用TBSTYLE_DROPDOWN风格的按钮
TBN_GETOBJECT | 表示用户已经将指针移动到了一个使用TBSTYLE_DROPDOWN风格的按钮上
处理函数的例子和有关使能工具提示的更多信息，参见“Visual C++程序员指南”中的“工具提示”。

CToolBarCtrl：处理定制通知
一个Windows工具条通用控件具有内在的定制特征，包括一个系统定义的定制对话框，用来让用户插入、删除，或重新安排工具条按钮。应用程序决定定制是否有效，并控制用户对该工具条定制的限度。
你可以通过给予工具条CCS_ADJUSTABLE风格来使这些定制特征对于用户来说是可用的。此定制特征允许用户将一个按钮拖动到一个新的位置，或通过拖动按钮离开工具条来删除这个按钮。另外，用户可以双击工具条来显示Customize Toolbar对话框，让用户添加、删除，或重新安排工具条按钮。应用程序可以通过使用Custoimize成员函数来显示对话框。
在定制过程中的每一步，工具条控件都向父窗口发送通知消息。如果用户按住SHIFT键并开始拖动一个按钮，则工具条自动处理这个拖动操作。工具条发送TBN_QUERYDELETE通知消息给父窗口，以确定是否应该删除该按钮。如果父窗口返回FALSE，则这个拖动操作结束。否则，工具条捕捉鼠标输入并等待用户释放鼠标按钮。
当用户释放鼠标按钮时，工具条控件确定鼠标光标所在的位置。如果该光标的位置是在工具条之外，则按钮被删除。如果光标位于另一个工具条按钮上，则工具条向其父窗口发送TBN_QUERYINSERT通知消息，以确定是否要将一个按钮插入在给定按钮的左边。如果父窗口返回TRUE，则该按钮被插入；否则，不插入。工具条发送TBN_TOOLBARCHANGE通知来表示拖动操作结束。
如果用户在没有按下SHIFT键的情况下开始一次拖动操作，则工具条控件发送TBN_BEGINDRAG通知消息给属主窗口。一个实现了自己的按钮拖动代码的应用程序可以使用这个消息作为开始一次拖动操作的信号。工具条发送TBN_ENDDRAG通知消息来表示拖动操作结束。
当用户通过使用Customize Toolbar对话框来定制一个工具条时，该工具条控件发送通知消息。在用户双击工具条之后，但在对话框被创建之前，该工具条发送TBN_BEGINADJUST通知消息。然后，工具条开始发送一系列TBN_QUERYINSERT消息，以确定该工具条是否允许插入按钮。当父窗口返回TRUE时，该工具条停止发送TBN_QUERYINSERT通知消息。如果父窗口没有对任何按钮返回TRUE，则工具条销毁该对话框。
接着，工具条控件通过为工具条中的每一个按钮发送一个TBN_QUERYDELETE通知消息来确定是否可以从工具条中删除某个按钮。父窗口返回TRUE则表示可以删除该按钮；否则，父窗口返回FALSE。工具条将所有的按钮都添加到对话框中，但是将那些不能删除的按钮变灰。
不管什么时候，当工具条控件需要有关Customize Toolbar对话框中的某个控件的信息时，它就发送TBN_GETBUTTONINFO通知信息，并指定它想获取其信息的按钮的索引，以及一个TBNOTIFY结构的地址。父窗口必须用相关的信息填充该结构。
Customize Toolbar对话框还包括一个Help按钮和一个Reset按钮。当用户选择Help按钮时，工具条控件发送TBN_CUSTHELP通知消息。父窗口应该通过显示帮助信息来作出响应。当用户选择Reset按钮时，对话框发送TBN_RESET消息。这个消息表示工具条要再次初始化这个对话框。
这些消息都是WM_NOTIFY消息，通过向你的属主窗口的消息映射中添加下列形式的消息映射项，你可以在你的属主窗口中处理它们。
ON_NOTIFY(wNotifyCode, idControl,memberFxn)
wNotifyCode | 通知消息标识符代码，比如TBN_BEGINADJUST。
idControl | 发送通知的控件的标识符。
memberFxn | 当这个通知被接收时要被调用的成员函数。
你的成员函数应该用下面的原形来声明：
afx_msg void memberFxn( NMHDR* pNotifyStruct, LRESULT* result );
如果通知消息的处理函数返回一个值，则处理函数应该将这个值存放在由result指向的LRESULT中。
对每一个消息，pNotifyStruct指向一个NMHDR结构或一个TBNOTIFY结构。
这些结构被描述如下：NMHDR结构包含了下列成员：
typedef struct tagNMHDR
{
HWND hwndFrom; // 发送消息的控件的句柄
UINT idFrom; // 发送消息的控件的标识符
UINT code; // 通知代码，参见下面
} NMHDR;
hwndFrom | 正发送通知的控件的窗口句柄。要将这个句柄转换为一个CWnd指针，可以使用CWnd::FromHandle。
idFrom | 发送通知的控件的标识符。
code通知代码。这个成员可以是一个特定于一个控件类型的值，比如TBN_BEGINADJUST 或TTN_NEEDTEXT，或者它可以是下面列出的普通通知值中的一个：
· | NM_CLICK | 用户在控件中单击了鼠标的左按钮。
· | NM_DBLCLK | 用户在控件中双击了鼠标的左按钮。
· | NM_KILLFOCUS | 控件失去了输入焦点。
· | NM_OUTOFMEMORY | 由于没有足够的可用内存，控件无法完成一次操作。
· | NM_RCLICK | 用户在控件中单击了鼠标的右按钮。
· | NM_RDBLCLK | 用户在控件中双击了鼠标的右按钮。
· | NM_RETURN | 控件拥有输入焦点，并且用户按下了ENTER键。
· | NM_SETFOCUS | 控件已经接收了输入焦点。
TBNOTIFY结构包含下列成员：
typedef struct
{
NMHDR hdr; // 对所有WM_NOTIFY消息都通用的信息
int iItem; // 与通知相关联的控件的的索引
TBBUTTON tbButton; // 与通知相关联的控件的信息
int cchText; // 按钮文本中的字符数
LPSTR lpszText; // 按钮文本的地址
} TBNOTIFY, FAR* LPTBNOTIFY;
hdr | 对所有WM_NOTIFY消息都通用的信息。
iItem | 与通知相关联的控件的的索引。
tbButton | 包含与通知相关联的工具条控件信息的BBUTTON结构。
cchText | 按钮文本中的字符数。
lpszText | 指向按钮文本的指针。

工具条发送下列信息：
· | TBN_BEGINADJUST | 当用户开始定制一个工具条控件时发送此通知。指针指向的NMHDR结构包含了有关这个通知的信息。处理程序不需要返回任何值。
· | TBN_BEGINDRAG | 当用户开始拖动一个工具条控件中的按钮时发送此通知。指针指向一个TBNOTIFY结构。iItem成员包含了被拖动的按钮的从零开始的索引。处理程序不需要返回任何特定的值。
· | TBN_CUSTHELP | 当用户在Customize Toolbar对话框中选择了Help按钮时发送此通知。没有返回值。指针指向一个NMHDR结构，该结构包含了有关这个通知消息的信息。处理程序不需要返回任何特定的值。
· | TBN_ENDADJUST | 当用户停止定制有关工具条时发送此通知。指针指向一个NMHDR结构，该结构包含了有关此通知消息的信息。处理程序不需要返回任何特定的值。
· | TBN_ENDDRAG | 当用户停止拖动一个工具条控件中的按钮时发送此通知。指针指向一个TBNOTIFY结构。iItem成员包含了被拖动的按钮的从零开始的索引。处理程序不需要返回任何特定的值。
· | TBN_GETBUTTONINFO | 当用户正在定制一个工具条控件时发送此通知。工具条使用这个通知消息来获取Customize Toolbar对话框需要的信息。指针指向一个TBNOTIFY结构。iItem成员指定了一个按钮的从零开始的索引。lpszText和cchText成员指定当前按钮文本的地址和以字符数表示的长度。应用程序应该用有关这个按钮的信息来填充该结构。如果按钮的信息被拷贝到了结构中，则返回TRUE；否则就返回FALSE。
· | TBN_QUERYDELETE | 当用户正在定制一个工具条时发送此消息，以确定一个按钮是否可以被从工具条控件中删除。指针指向一个TBNOTIFY结构。iItem成员包含了要被删除的按钮的从零开始的索引。如果允许该按钮被删除则返回TRUE；否则返回 FALSE来禁止该按钮被删除。
· | TBN_QUERYINSERT | 当用户正在定制一个工具条控件时发送此通知，以确定一个按钮是否可以被插入到指定按钮的左边。指针指向一个TBNOTIFY结构。iItem成员包含了要被插入的按钮的从零开始的索引。如果允许一个按钮被插入到给定按钮的前面，则返回TRUE；否则返回FALSE来禁止该按钮被插入。
· | TBN_RESET | 当用户重新设置Customize Toolbar对话框时发送此通知。指针指向一个NMHDR结构，该结构包含了有关这个通知消息的信息。处理程序不需要返回任何特定的值。
· | TBN_TOOLBARCHANGE | 在用户定制完一个工具条控件之后发送此通知。指针指向一个NMHDR结构，该结构包含了有关这个通知消息的信息。处理程序不需要返回任何特定的值。


 CToolBarCtrl::AddBitmap

int AddBitmap( int nNumButtons, UINT nBitmapID );
int AddBitmap( int nNumButtons, CBitmap* pBitmap );

返回值：
如果成功则返回第一个新图像的从零开始的索引；否则返回-1。

参数：
nNumButtons | 位图中的按钮图像的数目。
nBitmapID | 包含按钮图像或要增加图像的位图的资源标识符。
pBitmap | 指向包含按钮图像或要增加图像的CBitmap对象的指针。

说明：
此成员函数用来将一个或多个按钮图像添加到保存在该工具条控件中的按钮图像列表中。在向工具条添加位图之前，你可以使用Windows APICreateMappedBitmap来映射颜色。
如果你传递的是一个指向CBitMap对象的指针，则你必须确保直到工具条被销毁的时候该位图才会被销毁。

请参阅：
CToolBarCtrl::AddButtons, CToolBarCtrl::InsertButton, CToolBarCtrl::AddString, CToolBarCtrl::AddStrings


 CToolBarCtrl::AddButtons

BOOL AddButtons( int nNumButtons, LPTBBUTTON lpButtons );

返回值：如果成功则返回非零值；否则返回零。

参数：
nNumButtons | 要增加的按钮数。
lpButtons | 一个TBBUTTON结构数组的地址，该结构包含关于要添加的按钮的信息。该数组的元素数目必须与nNumButtons指定的按钮数一样。

说明：
此成员函数用来向一个工具条控件中添加一个或多个按钮。
lpButtons指针指向一个TBBUTTON结构数组。每一个与被添加的按钮相关联的TBBUTTON结构包含了按钮的风格，图像和/或字符串，命令ID，状态和用户定义的数据：
typedef struct _TBBUTTON
{
int iBitmap; // zero-based index of button image
int idCommand; // command to be sent when button pressed
BYTE fsState; // button state--see below
BYTE fsStyle; // button style--see below
DWORD dwData; // application-defined value
int iString; // zero-based index of button label string
} TBBUTTON;
其成员描述如下：
iBitmap | 按钮图像的从零开始的索引。如果这个按钮没有图像，则这个成员是NULL。
idCommand | 与此按钮相关联的命令标识符。当按钮被选择时，这个标识符在一个WM_COMMAND消息中被发送。如果fsStyle成员的值为TBSTYLE_SEP，则这个成员必须是零。
fsState按钮的状态标志。它可以是下面列出的值的一个组合：
· | TBSTATE_CHECKED | 该按钮具有TBSTYLE_CHECKED风格并且被按下。
· | TBSTATE_ENABLED | 按钮接收用户输入。一个不具有这个状态的按钮是不接收用户输入的，并且变灰。
· | TBSTATE_HIDDEN | 按钮不可见，并且不能接收用户输入。
· | TBSTATE_INDETERMINATE | 按钮是变灰的。
· | TBSTATE_PRESSED | 按钮被按下。
· | TBSTATE_WRAP | 按钮之后是一个分隔线。此按钮还必须具有TBSTATE_ENABLED状态。
sStyle按钮风格。它可以是下列值的一个组合：
· | TBSTYLE_BUTTON | 创建一个标准的按钮。
· | TBSTYLE_CHECK | 创建一个每次用户点击时可以在按下和弹起状态间切换的按钮。该按钮则处于按下状态时有一种不同的背景颜色。
· | TBSTYLE_CHECKGROUP | 创建一个核选按钮，它被选择后一直处于按下状态，直到同组中的另一个按钮被按下时它才弹起。
· | TBSTYLE_GROUP | 创建一个被选择后一直处于按下状态，直到同组中的另一个按钮被按下时它才弹起的按钮。
· | TBSTYLE_SEP | 创建一个分隔线，为按钮组之间提供一个小的间距。具有这个风格的按钮是不接收用户输入的。
dwData | 用户定义的数据。
iString | 要用来作为按钮的标签的字符串的从零开始的索引。如果这个按钮没有字符串则这个值为NULL
你提供的图像和/或字符串的索引必须是已经通过调用AddBitmap，AddString，和/或AddStrings被添加到工具条控件的列表中的值。

请参阅：
CToolBarCtrl::InsertButton, CToolBarCtrl::DeleteButton, CToolBarCtrl::AddBitmap, CToolBarCtrl::AddString, CToolBarCtrl::AddStrings


 CToolBarCtrl::AddString

int AddString( UINT nStringID );

返回值：
如果成功则返回被添加的第一个新字符串的从零开始的索引；否则返回-1。

参数：
nStringID 要添加到工具条控件的字符串列表中去的字符串资源的资源标识符。

说明：
此成员函数用来将一个被作为资源ID传递的新字符串添加到工具条的内部字符串列表中。

请参阅：
CToolBarCtrl::AddStrings, CToolBarCtrl::AddButtons, CToolBarCtrl::InsertButton, CToolBarCtrl::AddBitmap


 CToolBarCtrl::AddStrings

int AddStrings( LPCTSTR lpszStrings );

返回值：
如果成功则返回被添加的第一个新字符串的从零开始的索引；否则返回-1。

参数：
lpszStrings 一个包含要添加到工具条的字符串列表中去的一个或多个以空字符结尾的字符串的缓冲区的地址。最后一个字符串必须以两个空字符结尾。

说明：
此成员函数用来将一个或多个新字符串添加到一个工具条控件的可用的字符串列表中。缓冲区中的字符串必须以空字符来分隔。
你必须确保最后一个字符串有两个空结尾符。为了准确地格式化一个常量字符串，你应该按如下的方式来写：
// 自动添加一个空字符。
lpszStrings = "Only one string to add\0";
或
// 一次调用添加三个字符串
lpszStrings = "String 1\0String 2\0String 3\0";
你不能给这个函数传递一个CString对象，因为在一个CStrin中不可能有多于一个的空字符。

请参阅：
CToolBarCtrl::AddString, CToolBarCtrl::AddButtons, CToolBarCtrl::InsertButton, CToolBarCtrl::AddBitmap


 CToolBarCtrl::AutoSize

void AutoSize( );

说明：
此成员函数用来调整整个工具条控件的尺寸。当父窗口的尺寸改变或当工具条的尺寸改变（比如当你设置按钮或位图尺寸或添加字符串时）时，你应该调用这个函数。

请参阅：
CToolBarCtrl::SetBitmapSize, CToolBarCtrl::SetButtonSize, CToolBarCtrl::AddString, CToolBarCtrl::AddStrings


 CToolBarCtrl::CheckButton

BOOL CheckButton( int nID, BOOL bCheck = TRUE );

返回值：如果成功则返回非零值；否则返回零。

参数：
nID | 要被核选或清除的按钮的命令标识符。
bCheck | 如果是TRUE则核选该按钮，如果是FALSE则清除该按钮。

说明：
此成员函数用来核选或清除工具条控件中的一个给定按钮。当一个按钮被核选时，它看起来就像被按下一样。如果你想改变多于一个的按钮状态，可以考虑调用SetState来代替。

请参阅：
CToolBarCtrl::IsButtonChecked, CToolBarCtrl::EnableButton, CToolBarCtrl::PressButton, CToolBarCtrl::HideButton, CToolBarCtrl::Indeterminate, CToolBarCtrl::GetState, CToolBarCtrl::SetState


 CToolBarCtrl::CommandToIndex

UINT CommandToIndex( UINT nID ) const;

返回值：
返回与此命令ID相关联的按钮的从零开始的索引。

参数：
nID 你想要查找其按钮索引的命令ID。

说明：
此成员函数用来获取与指定的命令标识符相关联的按钮的从零开始的索引。

请参阅：
CToolBarCtrl::SetCmdID, CToolBarCtrl::GetButton, CToolBarCtrl::AddButtons, CToolBarCtrl::InsertButton


 CToolBarCtrl::Create

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

返回值：如果成功则返回非零值；否则返回零。

参数：
dwStyle | 指定工具条控件的风格。工具条必须总是具有WS_CHILD风格。另外，你可以为工具条指定在说明部分描述的工具条风格和窗口风格的任意组合。
rect | 随意指定该工具条控件的尺寸和位置。它可以是一个CRect对象或一个RECT结构。
pParentWnd | 指定工具条控件的父窗口。它不能是NULL。
nID | 指定工具条控件的ID。

说明：
构造一个CToolBarCtrl对象分两步。首先调用构造函数，然后调用Create来创建该工具条控件并将它与该CToolBarCtrl对象连接。
工具条控件自动设置工具条窗口的尺寸和位置。其高度依赖于工具条中的按钮的高度。其宽度与父窗口的客户区的宽度一样。CCS_TOP和CCS_BOTTOM风格决定了工具条是位于客户区的顶部还是底部。缺省的，一个工具条具有CCS_TOP风格。
对一个工具条可以使用下面的窗口风格。
· | WS_CHILD | 总是使用
· | WS_VISIBLE | 经常使用
· | WS_DISABLED | 很少使用

接着，你还可以使用一种或多种通用控件风格：
· | CCS_ADJUSTABLE | 允许用户定制工具条。如果使用了这个风格，则工具条的属主窗口必须处理由工具条发送的定制调整消息，就像在CToolBarCtrl：处理定制通知中描述的一样。
· | CCS_BOTTOM | 使控件将自己定位在父窗口客户区的底部，并将自己的宽度设置得与父窗口的宽度一样。
· | CCS_NODIVIDER | 禁止在控件的顶部绘制两个像素的加亮。
· | CCS_NOHILITE | 禁止在控件的顶部绘制一个像素的加亮。
· | CCS_NOMOVEY | 使控件水平地，而不是垂直地调整自己的尺寸和移动自己，作为对一个WM_SIZE消息的响应。如果使用了CCS_NORESIZE风格，则这个风格就不适用了。
· | CCS_NOPARENTALIGN | 禁止控件自动移动到父窗口的顶部或底部。控件保持它在父窗口中的位置，不管父亲窗口的尺寸是怎么改变的。如果还使用了CCS_TOP或CCS_BOTTOM风格，则高度被调整为缺省值，但位置和宽度仍然保持不变。
· | CCS_NORESIZE | 当设置控件的产生尺寸或新尺寸时，禁止控件使用缺省的宽度和高度。控件使用在创建或改变大小时指定的宽度和高度。
· | CCS_TOP | 使控件将自己定位在父窗口的客户区的顶部，并将宽度设置为与父窗口的宽度一样。控件缺省的就具有这个风格。
最后，可以对控件或按钮本身使用工具条风格的一个组合。在“Platform SDK”中的“工具条控件和按钮风格”中描述了这些风格。

请参阅：
CToolBarCtrl::CToolBarCtrl, CToolBarCtrl::SetButtonStructSize


 CToolBarCtrl::CToolBarCtrl

CToolBarCtrl( );

说明：
此成员函数用来构造一个CToolBarCtrl对象。你必须调用Create来使工具条可用。

请参阅：CToolBarCtrl::Create


 CToolBarCtrl::Customize

void Customize( );

说明：
此成员函数用来显示Customize Toolbar对话框。该对话框允许用户通过增加或删除按钮来定制工具条。
要支持定制，你的工具条的父窗口必须对定制通知消息作出处理，就象在CToolBarCtrl::处理定制通知中所描述的那样。你的工具条还必须使用CCS_ADJUSTABLE风格创建，就象在CToolBarCtrl::Create中描述的那样。

请参阅：Customization Notifications


 CToolBarCtrl::DeleteButton

BOOL DeleteButton( int nIndex);

返回值：如果成功则返回非零值；否则返回零。

参数：
nIndex 要删除的按钮的从零开始的索引。

说明：此成员函数用来从工具条控件中删除一个按钮。

请参阅：
CToolBarCtrl::AddButtons, CToolBarCtrl::AutoSize, CToolBarCtrl::InsertButton


 CToolBarCtrl::EnableButton

BOOL EnableButton( int nID, BOOL bEnable = TRUE );

返回值：如果成功则返回非零值；否则返回零。

参数：
nID | 要使其无效或有效的按钮的标识符。
bEnable | 如果是TRUE则表示要使按钮有效；是FALSE表示要使按钮无效。

说明：
此成员函数用来使一个工具条控件中的指定按钮有效或无效。当一个按钮已经是有效的时，它就可以被按下或核选。如果你想改变多于一个的按钮状态，可以考虑调用SetState。

请参阅：
CToolBarCtrl::IsButtonEnabled, CToolBarCtrl::CheckButton, CToolBarCtrl::PressButton, CToolBarCtrl::HideButton, CToolBarCtrl::Indeterminate, CToolBarCtrl::GetState, CToolBarCtrl::SetState


 CToolBarCtrl::GetAnchorHighlight

UINT GetBitmapFlags( ) const;

返回值：
如果返回值是非零值，则可以进行定位加亮。如果返回的是零，则不能进行定位加亮。

说明：
此成员函数用来实现Win32消息TB_GETANCHORHIGHLIGHT，就像在“Platform SDK”中描述的一样。

请参阅：CToolBarCtrl::SetAnchorHighlight


 CToolBarCtrl::GetBitmapFlags

UINT GetBitmapFlags( ) const;

返回值：
如果显示可以支持大工具条位图，则返回具有TBBF_LARGE标志集的UINT，否则就清除。

说明：
此成员函数用来从工具条中获取位图标志。应该在创建工具条之后，但在向工具条添加位图之前调用这个函数。
返回值说明了显示是否支持大位图。如果显示支持大位图，并且你选择了使用它们，则在使用AddBitmap添加你的大位图之前，调用SetBitmapSize和SetButtonSize。

请参阅：
CToolBarCtrl::AddBitmap, CToolBarCtrl::SetBitmapSize, CToolBarCtrl::SetButtonSize


 CToolBarCtrl::GetButton

BOOL GetButton( int nIndex, LPTBBUTTON lpButton ) const;

返回值：如果成功则返回非零值；否则返回零。

参数：
nIndex | 要获取其信息的按钮的从零开始的索引。
lpButton | 用来接收按钮信息的拷贝的TBBUTTON结构的地址。参见CToolBarCtrl::AddButtons可以获得有关TBBUTTON结构的信息。

说明：
此成员函数用来获取一个工具条控件中的指定按钮的信息。

请参阅：
CToolBarCtrl::GetState, CToolBarCtrl::SetState, CToolBarCtrl::GetButtonCount, CToolBarCtrl::GetItemRect, CToolBarCtrl::CommandToIndex, CToolBarCtrl::AddButtons, CToolBarCtrl::InsertButton


 CToolBarCtrl::GetButtonCount

int GetButtonCount( ) const;

返回值：返回按钮的数目。

说明：
此成员函数用来获取工具条控件中的当前按钮的数目。

请参阅：
CToolBarCtrl::GetButton, CToolBarCtrl::GetState, CToolBarCtrl::GetItemRect, CToolBarCtrl::AddButtons, CToolBarCtrl::InsertButton, CToolBarCtrl::DeleteButton


 CToolBarCtrl::GetButtonInfo

BOOL GetButtonInfo( int nID , TBBUTTONINFO* ptbbi ) const;

返回值：如果成功则返回非零值；否则返回零。

参数：
nID | 按钮的标识符。
pbbi | 一个指向TBBUTTONINFO结构的指针，该结构用来接收按钮的信息。

说明：
此成员函数用来实现Win32消息TB_GETBUTTONINFO，就像在“PlatformSDK”中描述的一样。

请参阅：CToolBarCtrl::SetButtonInfo


 CToolBarCtrl::GetButtonSize

DWORD GetButtonSize( ) const;

返回值：
返回一个DWORD值，其LOWORD和HIWORD中分别包含了宽度和高度值。

说明：此成员函数用来获取一个工具条按钮的尺寸。

请参阅：CToolBarCtrl::GetButtonInfo


 CToolBarCtrl::GetDisabledImageList

CImageList* GetDisabledImageList( ) const;

返回值：
返回一个指向CImageList对象的指针。如果没有被设置为无效的图像列表则返回NULL。

说明：
此成员函数用来实现Win32消息TB_GETDISABLEDIMAGELIST，就像在“Platform SDK”中描述的一样。GetDisabledImageList的MFC实现使用包含了工具条控件的按钮图像的CImageList对象，而不是使用一个图像列表的句柄。

请参阅：
CToolBarCtrl::SetDisabledImageList, CToolBarCtrl::GetHotImageList, CToolBarCtrl::GetImageList


 CToolBarCtrl::GetDropTarget

HRESULT GetDropTarget( IDropTarget** ppDropTarget ) const;

返回值：
返回一个HRESULT值，指明操作的成功或失败。

参数：
ppDropTarget 一个指向IDropTarget接口指针的指针。如果发生了一个错误，则一个NULL指针将被放置在这个地址中。

说明：
此成员函数用来实现Win32消息TB_GETOBJECT，就像在“Platform SDK”中描述的一样。


 CToolBarCtrl::GetExtendedStyle

DWORD GetExtendedStyle( ) const;

返回值：
返回一个代表此工具条控件中当前使用的扩展风格的结构。参见“PlatformSDK”中的“工具条扩展风格”可以获得风格的列表。

说明：
此成员函数用来实现Win32消息TB_GETEXTENDEDSTYLE，就像在“PlatformSDK”中描述的一样。

请参阅：CToolBarCtrl::SetExtendedStyle


 CToolBarCtrl::GetHotImageList

CImageList* GetHotImageList( ) const;

返回值：
返回一个指向CImageList对象的指针，如果没有被设置为无效的图像列表则返回NULL。

说明：
此成员函数用来实现Win32消息TB_GETHOTIMAGELIST，就像在“PlatformSDK”中描述的一样。当鼠标指针位于一个热点按钮上时，该按钮被加亮显示。

请参阅：
CToolBarCtrl::GetDisabledImageList, CToolBarCtrl::GetImageList


 CToolBarCtrl::GetHotItem

int GetHotItem( ) const;

返回值：
返回一个工具条中的热点项的从零开始的索引。

说明：
此成员函数用来实现Win32消息TB_GETHOTITEM，就像在“Platform SDK”中描述的一样。


 CToolBarCtrl::GetImageList

CImageList* GetImageList ( ) const;

返回值：
返回一个指向CImageList对象的指针，如果没有被设置为无效的图像列表则返回NULL。

说明：
此成员函数用来实现Win32消息TB_GETIMAGELIST，就像在“Platform SDK”中描述的一样。


 CToolBarCtrl::GetInsertMark

void GetInserMark ( TBINSERTMARK* ptbim ) const;

参数：
ptbim 一个指向TBINSERTMARK结构的指针，该结构用来接收插入标记。

说明：
此成员函数用来实现Win32消息TB_GETINSERTMARK，就像在“PlatformSDK”中描述的一样。

请参阅：CToolBarCtrl::SetInsertMark


 CToolBarCtrl::GetInsertMarkColor

COLORREF GetInsertMarkColor( ) const;

返回值：
返回一个包含当前插入标记的颜色的COLORREF值。

说明：
此成员函数用来实现Win32消息TB_GETINSERTMARKCOLOR，就像在“Platform SDK”中描述的一样。

请参阅：CToolBarCtrl::SetInsertMarkColor


 CToolBarCtrl::GetItemRect

BOOL GetItemRect( int nIndex, LPRECT lpRect ) const;

返回值：如果成功则返回非零值；否则返回零。

参数：
nIndex | 要获取其信息的按钮的从零开始的索引。
lpRect | 一个用来接收边界矩形的坐标的RECT结构或CRect对象的地址。

说明：
此成员函数用来接收工具条控件中的一个按钮的边界矩形。此函数不接收状态被设置为TBSTATE_HIDDEN的按钮的边界矩形。

请参阅：
CToolBarCtrl::GetButton, CToolBarCtrl::GetButtonCount, CToolBarCtrl::GetState, CToolBarCtrl::SetButtonSize, CToolBarCtrl::SetBitmapSize


 CToolBarCtrl::GetMaxSize

BOOL GetMaxSize ( LPSIZE pSize ) const;

返回值：如果成功则返回非零值；否则返回零。

参数：
pSize 一个指向用来接收项的尺寸的SIZE结构的指针。

说明：
此成员函数用来实现Win32消息TB_GETMAXSIZE，就像在“Platform SDK”中描述的一样。


 CToolBarCtrl::GetMaxTextRows

int GetMaxTextRows ( ) const;

返回值：
返回一个工具条按钮上显示的文本的最大行数。

说明：
此成员函数用来获取一个工具条按钮上显示的文本的最大行数。

请参阅：CToolBarCtrl::SetMaxTextRows


 CToolBarCtrl::GetRect

BOOL GetRect( int nID, LPRECT lpRect ) const;

返回值：如果成功则返回TRUE；否则返回FALSE。

参数：
nID | 按钮标识符。
lpRect | 一个指向用来接收边界矩形信息的RECT结构的指针。

说明：
此成员函数用来实现Win32消息TB_GETRECT，就像在“Platform SDK”中描述的一样。


 CToolBarCtrl::GetRows

int GetRows( ) const;

返回值：返回工具条中当前显示的按钮的行数。

说明：
此成员函数用来获取工具条控件中当前显示的按钮的行数。注意，除非工具条是用TBSTYLE_WRAPABLE风格创建的，否则行数总是1。

请参阅：
TBSTYLE_WRAPABLE in CToolBarCtrl::Create, CToolBarCtrl::SetRows


 CToolBarCtrl::GetState

int GetState( int nID ) const;

返回值：
如果成功则返回按钮的状态信息；否则返回-1。按钮的状态信息可以是在CToolBarCtrl::AddButtons中所列出的值的一个组合。

参数：
nID 要获取其信息的按钮的命令标识符。

说明：
此成员函数用来获取有关一个工具条控件中的指定按钮的状态的信息，比如它是否是有效，被按下，或被核选。
如果你要处理多于一个的按钮状态，则这个函数是特别方便的。如果只需要获取一个状态，则可以使用下列成员函数：IsButtonEnabled，IsButtonChecked，IsButtonPressed，IsButtonHidden，或IsButtonIndeterminate。但是，GetState成员函数是检测TBSTATE_WRAP 按钮状态的唯一方法。

请参阅：
CToolBarCtrl::SetState, CToolBarCtrl::GetItemRect, CToolBarCtrl::IsButtonEnabled, CToolBarCtrl::IsButtonChecked, CToolBarCtrl::IsButtonPressed, CToolBarCtrl::IsButtonHidden, CToolBarCtrl::IsButtonIndeterminate


 CToolBarCtrl::GetStyle

DWORD GetStyle( ) const;

返回值：
返回一个包含了工具条控件风格的一个组合的DWORD，就像“Platform SDK”中描述的一样。

说明：
此成员函数用来获取一个工具条控件当前使用的风格。

请参阅：CToolBarCtrl::SetStyle


 CToolBarCtrl::GetToolTips

CToolTipCtrl* GetToolTips( ) const;

返回值：
返回指向一个与工具条相关联的CToolTipCtrl对象的指针。如果该工具条没有关联的工具提示控件，则返回NULL。

说明：
此成员函数用来获取与工具条控件相关联的工具提示控件（如果有的话）的句柄。由于工具条控件通常会创建并维护它自己的工具提示控件，所以大多数程序不需要调用这个函数。

请参阅：
CToolBarCtrl::SetToolTips, CToolBarCtrl: Handling Tool TipNotifications, CToolTipCtrl


 CToolBarCtrl::HideButton

BOOL HideButton( int nID, BOOL bHide = TRUE );

返回值：如果成功则返回非零值；否则返回零。

参数：
nID | 要被显示或隐藏的按钮的命令标识符。
bHide | 如果是TRUE则隐藏此按钮，是FALSE则显示此按钮。

说明：
此成员函数用来隐藏或显示一个工具条控件中的指定按钮。如果你想改变多于一个的按钮状态，则可以考虑调用SetState来代替。

请参阅：
CToolBarCtrl::IsButtonHidden, CToolBarCtrl::EnableButton, CToolBarCtrl::CheckButton, CToolBarCtrl::PressButton, CToolBarCtrl::Indeterminate, CToolBarCtrl::GetState, CToolBarCtrl::SetState


 CToolBarCtrl::HitTest

int HitTest( LPPOINT ppt ) const;

返回值：
返回一个指明了工具条上的一个点的位置的整数值。如果这个值是零或正值，则这个返回值表示的是该点所在的非分隔线项的从零开始的索引。
如果返回值是负值，则该点不在一个按钮中。该返回值的绝对值是一个分隔线或最近的非分隔线项的索引。

参数：
ppt 一个指向POINT结构的指针，该结构的x成员包含了点击测试的x坐标，其y成员包含了点击测试的y坐标。这个坐标是相对于工具条的客户区的。

说明：
此成员函数用来实现Win32消息TB_HITTEST的行为，就像在“Platform SDK”中描述的一样。


 CToolBarCtrl::Indeterminate

BOOL Indeterminate( int nID, BOOL bIndeterminate = TRUE );

返回值：如果成功则返回非零值；否则返回零。

参数：
nID | 要清除或设置其不确定状态的按钮的命令标识符。
bIndeterminate | 如果是TRUE则设置指定按钮的不确定状态，是FALSE则清除它。

说明：
此成员函数用来设置或清除一个工具条控件中的指定按钮的不确定状态。不确定的按钮被显示为灰色，例如，当一个字处理器中被选择的文本同时包含加粗的或正常的字符时，该处理器中的工具条上的加粗按钮就显示为灰色。
如果你希望改变多于一个的按钮状态，可以考虑调用SetState来代替。

请参阅：
Button styles in CToolBarCtrl::AddButtons, CToolBarCtrl::IsButtonIndeterminate, CToolBarCtrl::EnableButton, CToolBarCtrl::CheckButton, CToolBarCtrl::PressButton, CToolBarCtrl::HideButton, CToolBarCtrl::GetState, CToolBarCtrl::SetState


 CToolBarCtrl::InsertButton

BOOL InsertButton( int nIndex, LPTBBUTTON lpButton );

返回值：如果成功则返回非零值；否则返回零。

参数：
nIndex | 一个按钮的从零开始的索引。此函数将一个新按钮插入到这个按钮的左边。
lpButton | 一个包含要被插入的按钮的信息的TBBUTTON结构的指针。参见CToolBarCtrl:: AddButtons可以获得有关TBBUTTON结构的描述。

说明：
此成员函数用来在一个工具条控件中插入一个按钮。
你提供的图像和/或字符串的索引必须是先前通过调用AddBitmap，AddString和/或AddStrings已经添加到工具条控件的列表中去了的值。

请参阅：
CToolBarCtrl::AddButtons, CToolBarCtrl::DeleteButton, CToolBarCtrl::AddBitmap, CToolBarCtrl::AddString, CToolBarCtrl::AddStrings


 CToolBarCtrl::InsertMarkHiTtest

BOOL InsertMarkHitTest( LPPOINT ppt, LPTBINSERTMARK ptbim ) const;

返回值：如果成功则返回非零值；否则返回零。

参数：
ppt | 一个指向包含点击测试坐标的POINT结构，该坐标相对于工具条的客户区。
ptbim | 一个指向用来接收插入标记信息的TBINSERTMARK结构的指针。

说明：
此成员函数用来实现Win32消息TB_INSERTMARKHITTEST的行为，就像在“Platform SDK”中描述的一样。

请参阅：
CToolBarCtrl::GetInsertMark, CToolBarCtrl::SetInsertMark


 CToolBarCtrl::IsButtonChecked

BOOL IsButtonChecked( int nID ) const;

返回值：如果按钮被核选则返回非零值；否则返回零。

参数：
nID 工具条中的按钮的命令标识符。

说明：
此成员函数用来确定一个工具条控件中的指定按钮是否被核选。如果你要获取多于一个的按钮状态，考虑调用GetState。

请参阅：
CToolBarCtrl::CheckButton, CToolBarCtrl::GetState, CToolBarCtrl::SetState, CToolBarCtrl::IsButtonEnabled, CToolBarCtrl::IsButtonPressed, CToolBarCtrl::IsButtonHidden, CToolBarCtrl::IsButtonIndeterminate


 CToolBarCtrl::IsButtonEnabled

BOOL IsButtonEnabled( int nID ) const;

返回值：如果按钮是有效的则返回非零值；否则返回零。

参数：
nID 工具条中的按钮的命令标识符。

说明：
此成员函数用来确定一个工具条控件中的指定按钮是否是有效的。如果你要获取多于一个的按钮状态，考虑调用GetState。

请参阅：
CToolBarCtrl::EnableButton, CToolBarCtrl::GetState, CToolBarCtrl::SetState, CToolBarCtrl::IsButtonChecked, CToolBarCtrl::IsButtonPressed, CToolBarCtrl::IsButtonHidden, CToolBarCtrl::IsButtonIndeterminate, CToolBarCtrl::IsButtonHighlighted


 CToolBarCtrl::IsButtonHidden

BOOL IsButtonHidden( int nID ) const;

返回值：如果按钮被隐藏则返回非零值；否则返回零。

参数：
nID 工具条中的按钮的命令标识符。

说明：
此成员函数用来确定一个工具条控件中的指定按钮是否是隐藏的。如果你要获取多于一个的按钮状态，考虑调用GetState。

请参阅：
CToolBarCtrl::HideButton, CToolBarCtrl::GetState, CToolBarCtrl::SetState, CToolBarCtrl::IsButtonEnabled, CToolBarCtrl::IsButtonChecked, CToolBarCtrl::IsButtonPressed, CToolBarCtrl::IsButtonIndeterminate, CToolBarCtrl::IsButtonHighlighted


 CToolBarCtrl::IsButtonHighlighted

BOOL IsButtonHighlighted( int nID ) const;

返回值：如果按钮被加亮则返回非零值；否则返回0。

参数：
nID 工具条中的按钮的命令标识符。

说明：
此成员函数用来检查一个工具条控件中的指定按钮是否处于加亮状态。

请参阅：
CToolBarCtrl::IsButtonChecked, CToolBarCtrl::IsButtonIndeterminate, CToolBarCtrl::IsButtonHidden, CToolBarCtrl::IsButtonEnabled, CToolBarCtrl::IsButtonPressed, CToolBarCtrl::MarkButton


 CToolBarCtrl::IsButtonIndeterminate

BOOL IsButtonIndeterminate( int nID ) const;

返回值：如果按钮处于不确定状态则返回非零值；否则返回零。

参数：
nID 工具条中的按钮的命令标识符。

说明：
此成员函数用来确定一个工具条控件中的指定按钮是否是不确定的。不确定按钮被显示成灰色，例如，当一个字处理器中被选择的文本同时包含加粗的或正常的字符时，该处理器中的工具条上的加粗按钮就显示为灰色。
如果你要获取多于一个的按钮状态，考虑调用GetState。

请参阅：
CToolBarCtrl::Indeterminate, CToolBarCtrl::GetState, CToolBarCtrl::SetState, CToolBarCtrl::IsButtonEnabled, CToolBarCtrl::IsButtonChecked, CToolBarCtrl::IsButtonPressed, CToolBarCtrl::IsButtonHidden, CToolBarCtrl::IsButtonHighlighted


 CToolBarCtrl::IsButtonPressed

BOOL IsButtonPressed( int nID ) const;

返回值：如果按钮被按下则返回非零值，否则返回零。

参数：
nID 工具条中的按钮的命令标识符。

说明：
此成员函数用来确定一个工具条控件中的指定按钮是否被按下。如果你要获取多于一个的按钮状态，考虑调用GetState。

请参阅：
CToolBarCtrl::PressButton, CToolBarCtrl::GetState, CToolBarCtrl::SetState, CToolBarCtrl::IsButtonEnabled, CToolBarCtrl::IsButtonChecked, CToolBarCtrl::IsButtonHidden, CToolBarCtrl::IsButtonIndeterminate, CToolBarCtrl::IsButtonHighlighted


 CToolBarCtrl::LoadImages

void LoadImages( int iBitmapID, HINSTANCE hinst );

参数：
iBitmapID包含要装入的图像的位图的ID。要指定你自己的位图资源，可以将这个参数设置为一个位图资源的ID，并将hInst设置为NULL。你的位图资源将被添加到图像列表作为一个单一的图像。你可以通过将hinst设置为HINST_COMMCTRL，将这个参数设置为下列ID值之一，来添加标准的，系统定义的位图：
位图ID | 描述
IDB_HIST_LARGE_COLOR | 大尺寸的探测位图
IDB_HIST_SMALL_COLOR | 小尺寸的探测位图
IDB_STD_LARGE_COLOR | 大尺寸的标准位图
IDB_STD_SMALL_COLOR | 小尺寸的标准位图
IDB_VIEW_LARGE_COLOR | 大尺寸的视位图
IDB_VIEW_SMALL_COLOR | 小尺寸的视位图
hinst 指向调用应用程序的程序示例句柄。这个参数这个参数可以是HINST_COMMCTRL，用来加载一个标准的图像列表。

说明：
此成员函数用来实现Win32消息TB_LOADIMAGES的行为，就象在“Platform SDK”中描述的一样。

请参阅：
CToolBarCtrl::SetImageList, CToolBarCtrl::GetImageList


 CToolBarCtrl::MapAccelerator

BOOL MapAccelerator ( TCHAR chAccel, UINT* pIDBtn );

返回值：如果成功则返回非零值；否则返回零。

参数：
chAccel | 要被映射的加速键字符。这个字符与按钮文本中的加下划线的字符是一样的。
pIDBtn | 一个指向用来接收某个按钮的命令标识符的UINT的指针。此按钮用来响应在chAccel中指定的加速键。

说明：
此成员函数用来实现Win32消息TB_MAPACCELERATOR的行为，就像在“Platform SDK”中描述的一样。


 CToolBarCtrl::MarkButton

BOOL MardButton( int nID, BOOL fHighlight = TRUE );

返回值：如果成功则返回非零值；否则返回零。

参数：
nID | 按钮标识符。
fHighlight | 指定要设置的加亮状态。缺省的，这个值是TRUE。如果将其设置为FALSE，则此按钮被设置为它的缺省状态。

说明：
此成员函数用来实现Win32消息TB_MARKBUTTON的行为，就像在“PlatformSDK”中描述的一样。

请参阅：CToolBarCtrl::IsButtonHighlighted


 CToolBarCtrl::MoveButton

BOOL MoveButton( UINT nOldPos, UINT nNewPos );

返回值：如果成功则返回非零值；否则返回零。

参数：
nOldPos | 要被移动的按钮的从零开始的索引。
nNewPos | 按钮的终点的从零开始的索引。

说明：
此成员函数用来实现Win32消息TB_MOVEBUTTON的行为，就像在“PlatformSDK”中描述的一样。


 CToolBarCtrl::PressButton

BOOL PressButton( int nID, BOOL bPress = TRUE );

返回值：如果成功则返回非零值；否则返回零。

参数：
nID | 要被按下或释放的按钮的命令标识符。
bPress | 如果是TRUE则按下指定的按钮；如果是FLASE则释放指定按钮。

说明：
此成员函数用来按下或释放一个工具条控件中的指定按钮。如果你要改变多于一个的按钮状态，可以考虑调用SetState来代替。

请参阅：
CToolBarCtrl::IsButtonPressed, CToolBarCtrl::EnableButton, CToolBarCtrl::CheckButton, CToolBarCtrl::HideButton, CToolBarCtrl::Indeterminate, CToolBarCtrl::GetState, CToolBarCtrl::SetState


 CToolBarCtrl::RestoreState

void RestoreState( HKEY hKeyRoot, LPCTSTR lpszSubKey, LPCTSTR lpszValueName);

参数：
hKeyRoot | 表示注册表中的一个当前打开的主键，或是下列预定义的保留句柄值的任何一个： ·HKEY_CLASSES_ROOT ·HKEY_CURRENT_USER ·HKEY_LOCAL_MACHINE ·HKEY_USERS
lpszSubKey | 指向一个以空字符结尾的字符串，该字符串包含了与某个值关联的子键的名字。这个参数可以是空或是一个指向空字符串的指针。如果这个参数是NULL，则该值被添加到由hKeyRoot参数指定的主键中。
lpszValueName | 指向一个包含要获取的值的名字的字符串。如果这个名字的值在主键中没有给出，则函数将它添加到该主键中。

说明：
此成员函数从参数所指定的注册表中的位置恢复工具条控件的状态。

请参阅：CToolBarCtrl::SaveState


 CToolBarCtrl::SaveState

void SaveState( HKEY hKeyRoot, LPCTSTR lpszSubKey, LPCTSTR lpszValueName );

参数：
hKeyRoot | 表示注册表中的一个当前打开主键，或是下列预定义的保留句柄值的任何一个： ·HKEY_CLASSES_ROOT ·HKEY_CURRENT_USER ·HKEY_LOCAL_MACHINE ·HKEY_USERS
lpszSubKey | 指向一个以空字符结尾的字符串，该字符串包含了与某个值关联的子键的名字。这个参数可以是空或是一个指向空字符串的指针。如果这个参数是NULL，则该值被添加到由hKeyRoot参数指定的主键中。
lpszValueName | 指向一个包含要获取的值的名字的字符串。如果这个名字的值在主键中没有给出，则函数将它添加到该主键中。

说明：
此成员函数用来将工具条控件的状态保存到由参数指定的注册表中的位置。

请参阅：CToolBarCtrl::RestoreState


 CToolBarCtrl::SetAnchorHighlight

BOOL SetAnchorHighlight( BOOL fAnchor = TRUE );

返回值：如果成功则返回非零值；否则返回零。

参数：
fAnchor 指示定位加亮是否有效。如果这个值是非零值，则定位加亮将是有效的。如果这个值是零，则不允许定位加亮。

说明：
此成员函数用来实现Win32消息TB_SETANCHORHIGHLIGHT的行为，就像在“Platform SDK”中描述的一样。

请参阅：CToolBarCtrl::GetAnchorHighlight


 CToolBarCtrl::SetBitmapSize

BOOL SetBitmapSize( CSize size );

返回值：如果成功则返回非零值；否则返回零。

参数：
size 位图图像的以像素表示的宽度和高度。

说明：
此成员函数用来设置要被添加到一个工具条控件中的实际位图图像的尺寸。
只有在向工具条中添加位图之前才调用这个函数。如果应用程序不显式地设置位图的尺寸，则它的缺省值为16×15像素。

请参阅：
CToolBarCtrl::SetButtonSize, CToolBarCtrl::GetItemRect


 CToolBarCtrl::SetButtonInfo

BOOL SetButtonInfo( int nID, TBBUTTONINFO* ptbbi );

返回值：如果成功则返回非零值；否则返回零。

参数：
nID | 按钮标识符。
ptbbi | 一个指向用来接收按钮信息的TBBUTTONINFO结构的指针。

说明：
此成员函数用来实现Win32消息TB_SETBUTTONINFO的行为，就像在“Platform SDK”中描述的一样。

请参阅：CToolBarCtrl::GetButtonInfo


 CToolBarCtrl::SetButtonSize

BOOL SetButtonSize( CSize size );

返回值：如果成功则返回非零值；否则返回零。

参数：
size 按钮的以像素表示的宽度和高度。

说明：
此成员函数用来设置工具条控件中的按钮的尺寸。按钮的尺寸必须总是至少与它所装入的位图的尺寸一样。
只有在向工具条中添加位图之前才调用这个函数。如果应用程序不显式地设置按钮的尺寸，则它的缺省值为24×22像素。

请参阅：CToolBarCtrl::SetBitmapSize, CToolBarCtrl::GetItemRect


 CToolBarCtrl::SetButtonStructSize

void SetButtonStructSize( int nsize );

参数：
nsize TBBUTTON结构的以字节数表示的尺寸。

说明：
此成员函数用来指定TBBUTTON结构的大小。如果你想在TBBUTTON结构中保存额外的数，你可以从TBBUTTON派生一个新的结构，增加你需要的成员，或者创建一个新的结构，该结构包含一个TBBUTTON结构作为它的第一个成员。然后你可以调用这个函数来向工具条控件给出此新结构的大小。
参见CToolBarCtrl::AddButtons可以获得有关TBBUTTON结构的更多信息。

请参阅：
CToolBarCtrl::Create, CToolBarCtrl::AddButtons, CToolBarCtrl::InsertButton, CToolBarCtrl::GetButton


 CToolBarCtrl::SetButtonWidth

BOOL SetButtonWidth( int cxMin, int cxMax );

返回值：如果成功则返回非零值；否则返回零。

参数：
cxMin | 以像素表示的最小按钮宽度。工具条按钮的宽度不能小于这个值。
cxMax | 以像素表示的最大按钮宽度。如果按钮文本太宽，则控件用省略的点来显式它。

说明：
此成员函数用来实现Win32消息TB_SETBUTTONWIDTH的行为，就像在“Platform SDK”中描述的一样。

请参阅：CToolBarCtrl::SetButtonInfo


 CToolBarCtrl::SetCmdID

BOOL SetCmdID( int nIndex, UINT nID );

返回值：如果成功则返回非零值；否则返回零。

参数：
nIndex | 要设置其命令ID的按钮的从零开始的索引。
nID | 要给选定的按钮设置的命令ID。

说明：
此成员函数用来设置指定按钮的命令标识符，当该按钮被按下时，此命令标识符将被发送给属主窗口。

请参阅：
CToolBarCtrl::CommandToIndex, CToolBarCtrl::GetButton, CToolBarCtrl::AddButtons, CToolBarCtrl::InsertButton


 CToolBarCtrl::SetDisabledImageList

CImageList* SetDisabledImageList( CImageList* pImageList );

返回值：
一个指向CImageList对象的指针，该对象先前被工具条控件用来显示无效按钮图像。

参数：
pImageList 一个指向CImageList对象的指针，该对象包含了要被工具条控件用来显示无效按钮图像的图像。

说明：
此成员函数用来实现Win32消息TB_SETDISABLEDIMAGELIST的行为，就像在“Platform SDK”中描述的一样。
SetDisabledImageList的MFC实现使用的是一个包含工具条控件的无效按钮图像的CImageList对象，而不是一个图像列表句柄。

请参阅：
CToolBarCtrl::GetDisabledImageList, CToolBarCtrl::SetHotImageList, CToolBarCtrl::SetImageList


 CToolBarCtrl::SetDrawTextFlags

DWORD SetDrawTextFlage( DWORD dwMask, DWORD dwDTFlags );

返回值：返回一个包含先前的文本绘制标志的DWORD。

参数：
dwMask | 在Win32函数DrawText中指定的一个或多个DT_标志的组合。该组合说明了在绘制文本时使用dwDTFlags中的哪些位。
DwDTFlags | 在Win32函数DrawText中指定的一个或多个DT_标志的组合。该组合表明如何绘制按钮文本。当按钮文本被绘制时，这个值被传递给DrawText。

说明：
此成员函数用来实现Win32消息TB_SETDRAWTEXTFLAGS的行为，就像在“Platform SDK”中描述的一样。
此成员函数用来设置Win32函数DrawText中的标志。该函数用来绘制指定矩形中的文本，根据所设置的标志来格式化字符串。


 CToolBarCtrl::SetExtendedStyle

DWORD SetExtendedStyle( DWORD dwExStyle ) const;

返回值：
返回一个代表先前的扩展风格的DWORD。参见“Platform SDK”中的“工具条扩展风格”可以获得风格的列表。

参数：
dwExStyle 指定新的扩展风格的值。这个参数可以是工具条风格的一个组合。

说明：
此成员函数用来实现Win32消息TB_SETEXTENDEDSTYLE的行为，就像在“Platform SDK”中描述的一样。

请参阅：CToolBarCtrl::GetExtendedStyle


 CToolBarCtrl::SetHotImageList

CImageList* SetHotImageList( CImageList* pImageList );

返回值：
返回一个指向CImageList对象的指针，该对象先前被工具条控件用来显示热点按钮图像。

参数：
pImageList 一个指向CImageList对象的指针，该对象包含的图像将被工具条控件用来显示热点按钮图像。

说明：
此成员函数用来实现Win32消息TB_SETHOTIMAGELIST的行为，就像在“Platform SDK”中描述的一样。
SetHotImageList的MFC实现使用的是一个包含工具条控件的热点按钮图像的CImageList对象，而不是一个图像列表句柄。
当指针位于一个热点按钮上时，该按钮将被加亮显示。

请参阅：
CToolBarCtrl::GetHotImageList, CToolBarCtrl::SetDisabledImageList, CToolBarCtrl::SetImageList


 CToolBarCtrl::SetHotItem

int SetHotItem( int nHot );

返回值：
返回先前的热点项的索引，如果没有热点项则返回-1。

参数：
nHot 将要被变成热点的项的从零开始的索引号。如果这个值是-1，则没有一个项将被变成热点。

说明：
此成员函数用来实现Win32消息TB_SETHOTITEM的行为，就像在“PlatformSDK”中描述的一样。

请参阅：CToolBarCtrl::GetHotItem


 CToolBarCtrl::SetImageList

CImageList* SetImageList( CImageList* pImageList );

返回值：
返回一个指向CImageList对象的指针，该对象先前被工具条控件用来显示处于缺省状态的按钮图像。

参数：
pImageList 一个指向CImageList对象的指针，该对象包含的图像将被工具条控件用来显示缺省状态按钮图像。

说明：
此成员函数用来实现Win32消息TB_SETIMAGELIST的行为，就像在“PlatformSDK”中描述的一样。
SetImageList的MFC实现使用的是一个包含工具条控件的缺省状态按钮图像的CImageList对象，而不是一个图像列表句柄。

请参阅：
CToolBarCtrl::GetImageList, CToolBarCtrl::SetDisabledImageList, CToolBarCtrl::SetHotImageList


 CToolBarCtrl::SetIndent

BOOL SetIndent( int iIndent );

返回值：如果成功则返回非零值；否则返回零。

参数：
iIndent 这个值指定了以像素表示的缩进。

说明：
此处于函数用来设置一个工具条控件中的第一个按钮的缩进。


 CToolBarCtrl::SetInsertMark

void SetInsertMark ( TBINSERTMARK* ptbim )

参数：
ptbim 一个指向包含插入标记的TBINSERTMARK结构的指针。

说明：
此成员函数用来实现Win32消息TB_SETINSERTMARK的行为，就像在“Platform SDK”中描述的一样。

请参阅：CToolBarCtrl::GetInsertMark


 CToolBarCtrl::SetInsertMarkColor

COLORREF SetInsertMarkColor( COLORREF clrNew );

返回值：
返回一个包含先前的插入标记颜色的COLORREF值。

参数：
clrNew 一个包含新的插入标记颜色的COLORREF值。

说明：
此成员函数用来实现Win32消息TB_SETINSERTMARKCOLOR的行为，就像在“Platform SDK”中描述的一样。

请参阅：CToolBarCtrl::GetInsertMarkColor


 CToolBarCtrl::SetMaxTextRows

BOOL SetMaxTextRows( int iMaxRows );

返回值：如果成功则返回非零值；否则返回零。

参数：
iMaxRows 要设置的最大行数。

说明：
此成员函数用来设置显示在一个工具条按钮中的文本的最大行数。

请参阅：CToolBarCtrl::GetMaxTextRows


 CToolBarCtrl::SetOwner

void SetOwner( CWnd* pWnd );

参数：
pWnd 指向将要成为工具条控件的新属主窗口的CWnd或CWnd派生对象的指针。

说明：
此成员函数用来为工具条控件设置属主窗口。属主窗口是接收来自该工具条的通知的窗口。

请参阅：CToolBarCtrl::Create


 CToolBarCtrl::SetRows

void SetRows( int nRows, BOOL bLarger, LPRECT lpRect );

参数：
nRows | 需要的行数。
bLarger | 如果工具条不能调整到需要的行数，此参数指明是使用更多的行还是使用更少的行。
lpRect | 指向CRect对象或RECT结构，该对象或结构用来接收工具条的新的边界矩形。

说明：
此成员函数用来请求工具条控件将它自己调整为需要的行数。
如果该工具条不能将自己调整为需要的行数，则它将根据bLarger的值把自己调整为下一个较大的或较小的尺寸。如果bLarger是TRUE，则新行数将大于请求的行数。如果bLarger是FALSE，则新行数将小于请求的行数。
如果按钮可以被安排为给定的行数，则该给定值是有效的，并且所有行都具有相同的按钮数（可能除了最后一行）。例如，一个包含四个按钮的工具条不能被调整为三行，因为这样的安排将使最后两行都较短。如果你尝试要将它调整为三行，则如果bLarge是TRUE，则得到的是四行，如果bLarger是FALSE，则得到的是两行。
如果工具条中有分隔线，则有关何时给定行数有效的规则就更复杂了。按钮的安排可以这样考虑：按钮组（组中的第一个按钮之前和最后一个按钮之后都有分隔线）不会被分行排列，除非它们不能在一行中安排。
如果一个组不能正好占据完一行，则下一个组将从下一个行开始，即使是这个组可以在上一个大组结束的行中完全安排。这个规则的目的就是使两个大组之间的分隔更加显而易见。这样导致的垂直分隔线被作为行计算。
还要注意，SetRows成员函数将总是选择会获得最小的工具条尺寸的版面规划。创建一个具有TBSTYLE_WRAPABLE风格的工具条，然后调整这个控件将只是简单地根据给定的控件宽度应用这个方法来画出轮廓。
只有使用TBSTYLE_WRAPABLE风格创建的函数才可以调用这个函数。

请参阅：
Toolbar styles in CToolBarCtrl::Create, CToolBarCtrl::GetRows


 CToolBarCtrl::SetState

BOOL SetState( int nID, UINT nState );

返回值：如果成功则返回非零值；否则返回零。

参数：
nID | 按钮的命令标识符。
nState | 状态标志。它可以是CToolBarCtrl::AddButtons中列出的按钮状态值的一个组合。

说明：
此成员函数用来设置一个工具条控件中的指定按钮的状态。
如果你想要设置多于一个的按钮状态，这个函数是特别方便的。如果只要设置一个状态，可以使用下列的成员函数：EnableButton，CheckButton，HideButton，Indeterminate，或PressButton。

请参阅：
CToolBarCtrl::GetState, CToolBarCtrl::AddButtons, CToolBarCtrl::EnableButton, CToolBarCtrl::CheckButton, CToolBarCtrl::HideButton, CToolBarCtrl::Indeterminate, CToolBarCtrl::PressButton


 CToolBarCtrl::SetStyle

void SetStyle( DWORD dwStyle );

参数：
dwStyle 一个包含工具条控件风格的组合的DWORD，就像在“Platform SDK”中描述的一样。

说明：此成员函数用来设置一个工具条控件的风格。

请参阅：CToolBarCtrl::GetStyle


 CToolBarCtrl::SetToolTips

void SetToolTips( CToolTipCtrl* pTip );

参数：
pTip 指向一个CToolTipCtrl对象的指针。

说明：
此成员函数用来使一个工具提示控件与一个工具条控件相关联。

请参阅：
CToolBarCtrl::GetToolTips, CToolBarCtrl: Handling Tool TipNotifications, CToolTipCtrl


 CToolTipCtrl

CObject
└CCmdTarget
└CWnd
└CToolTipCtrl

CToolTipCtrl类封装了一个“工具提示控件”的性能。工具提示控件是一个小的弹出窗口，它用来显示一行描述应用程序中的一个工具的目的的文本。一个“工具”可以是一个窗口，比如说一个子窗口或控件，或者是一个窗口的客户区中的一个应用程序定义的矩形区域。一个工具提示大多数时间是隐藏的，只有在用户将光标放在一个工具上并停留大约半秒时间时，工具提示才显示出来。工具提示显示在光标的附近，当用户点击鼠标按钮或将光标从工具上离开时，工具提示消失。
CToolTipCtrl提供了一些功能，用来控制工具提示的初始时间和持续时间，工具提示周围的边距宽度，工具提示窗口本身的宽度，以及工具提示的背景和文本颜色。一个工具提示控件可以为多个工具提供信息。
CToolTipCtrl类提供了Windows通用工具提示控件的功能。这个控件（也就是这个CToolTipCtrl类）只对运行在Windows 95和Windows NT 3.51或更高版本下的程序来说是可用的。
有关使能CToolTipCtrl的更多信息，参见“Visual C++程序员指南”中的“控件主题”和“使用CToolTipCtrl”。
#include <afxcmn.h>
请参阅：CToolBar

CToolTipCtrl类成员

构造
CToolTipCtrl | 创建一个CToolTipCtrl对象
Create | 创建一个工具提示控件并将它与一个CToolTipCtrl对象连接

属性
GetText | 获取一个工具提示控件为一个工具维持的文本
GetToolInfo | 获取一个工具提示控件维持的关于一个工具的信息
SetToolInfo | 设置一个工具提示控件为一个工具维持的文本
GetToolCount | 获取由一个工具提示控件支持的工具数
GetDelayTime | 获取当前为一个工具提示控件设置的初始，弹出，和再显示持续时间
SetDelayTime | 为一个工具提示控件设置初始，弹出，和再显示持续时间
GetMargin | 获取当前为一个工具提示窗口设置的上，左，底，和右边距
SetMargin | 为一个工具提示窗口设置上，左，底，和右边距
GetMaxTipWidth | 获取一个工具提示窗口的最大宽度
SetMaxTipWidth | 设置一个工具提示窗口的最大宽度
GetTipBkColor | 获取一个工具提示窗口中的背景颜色
SetTipBkColor | 设置一个工具提示窗口中的背景颜色
GetTipTextColor | 获取一个工具提示窗口中的文本颜色
SetTipTextColor | 设置一个工具提示窗口中的文本颜色

操作
Activate | 激活工具提示控件或使它成为不活动的
AddTool | 向一个工具提示控件注册一个工具
DelTool | 从工具提示控件中删除一个工具
HitTest | 测试一个点，以确定它是否位于给定工具的边界矩形之内，如果是，返回关于这个工具的信息
RelayEvent | 传递一个鼠标消息给工具提示控件处理
SetToolRect | 为一个工具设置一个新的边界矩形
UpdateTipText | 为一个工具设置工具提示文本
Update | 强制当前工具被重画
Pop | 从视中删除一个被显示的工具提示窗口


 CToolTipCtrl::Activate

void Activate( BOOL bActivate );

参数：
bActivate 指示是要激活该工具提示控件，还是要使它成为不活动的。

说明：
此成员函数用来激活一个工具提示控件或使它成为不活动的。如果bActivate是TRUE，则控件被激活；如果是FALSE，则将控件变为不活动的。
当一个工具提示控件被激活时，当光标在一个向工具提示注册过的工具上时就会显示工具提示信息；当工具提示控件是不活动的时，则不会显示工具提示信息，即使是光标在一个工具上。

请参阅：
CToolTipCtrl::UpdateTipText, CToolTipCtrl::SetDelayTime


 CToolTipCtrl::AddTool

BOOL AddTool( CWnd* pWnd, UINT nIDText, LPCRECT lpRectTool = NULL, UINT nIDTool = 0 );
BOOL AddTool( CWnd* pWnd, LPCTSTR lpszText = LPSTR_TEXTCALLBACK, LPCRECT lpRectTool = NULL, UINT nIDTool = 0 );

返回值：如果成功则返回非零值；否则返回0。

参数：
pWnd | 指向包含此工具的窗口的指针。
nIDText | 包含工具的文本的字符串资源的ID。
lpRectTool | 指向一个RECT结构的指针，该结构包含了工具的边界矩形的坐标。此坐标是相对于由pWnd指定的窗口的客户区的左上角的。
nIDTool | 该工具的ID。
lpszText | 指向工具的文本的指针。如果这个参数包含的值是LPSTR_TEXTCALLBACK，则TTN_NEEDTEXT通知消息被发送给pWnd指向的窗口的父窗口。

说明：
一个工具提示控件可以与多于一个的工具相关联。此成员函数用来向工具提示控件注册一个工具，这样当光标位于这个工具上面时，保存在工具提示中的信息就被显示。

请参阅：CToolTipCtrl::DelTool


 CToolTipCtrl::Create

BOOL Create( CWnd* pParentWnd, DWORD dwStyle = 0 );

返回值：
如果CToolTipCtrl对象被成功创建，则返回非零值；否则返回零。

参数：
pParentWnd | 指定工具提示控件的父窗口，通常是一个CDialog。它不能是NULL。
dwStyle | 指定工具提示控件的风格。使用该控件所需要的风格的任意组合。

说明：
构造一个CToolTipCtrl对象分为两步。首先调用构造函数来构造CToolTipCtrl对象；然后调用Create来创建工具提示控件并将它与CToolTipCtrl对象连接。
dwStyle参数可以是任意Windows风格的组合。另外，一个工具提示控件还具有两种特定类风格：TTS_ALWAYSTIP和TTS_NOPREFIX。
风格 | 含义
TTS_ALWAYSTIP | 指示当光标在一个工具上时显示工具提示，不管工具提示的属主窗口是否是处于活动状态。没有这个风格，则只有当工具的属主窗口是活动的时候才会显示工具提示控件，否则不显示
TTS_NOPREFIX | 这个风格禁止系统将&字符从一个字符串中去掉。如果一个工具提示控件没有TTS_NOPREFIX风格，则系统自动去掉&字符，让应用程序用同一个字符串作为菜单项和工具提示控件中的文本
一个工具提示控件总是具有WS_POPUP和WS_EX_TOOLWINDOW风格，不管在创建它们的时候你是否指定。

请参阅：CToolTipCtrl::CToolTipCtrl


 CToolTipCtrl::CToolTipCtrl

CToolTipCtrl( );

说明：
此成员函数用来构造一个CToolTipCtrl对象。在构造了对象之后你必须调用Create函数。

请参阅：CToolTipCtrl::Create


 CToolTipCtrl::DelTool

void DelTool( CWnd* pWnd, UINT nIDTool = 0 );

参数：
pWnd | 指向包含工具的窗口的指针。
nIDTool | 工具的ID。

说明：
此成员函数用来从一个工具提示控件支持的工具集合中删除由pWnd和nIDTool指定的工具。

请参阅：CToolTipCtrl::AddTool


 CToolTipCtrl::GetDelayTime

int GetDelayTime( DWORD dwDuration ) const;

返回值：返回用毫秒表示的指定延迟时间。

参数：
dwDuration用来指定将要获取哪一个时间持续值的标志。这个参数可以是下列值之一：
· | TTDT_AUTOPOP | 获取当指针固定在一个工具的边界矩形内时工具提示窗口保持持续可见的时间长度。
· | TTDT_INITIAL | 获取在工具提示窗口显示之前指针必须固定在一个工具的边界矩形内的时间长度。
· | TTDT_RESHOW | 获取当指针从一个工具移动到另一个工具时，后续工具提示窗口显示所需要的时间长度。

说明：
此成员函数用来实现Win32消息TTM_GETDELAYTIME的行为，就像在“Platform SDK”中描述的一样。

请参阅：CToolTipCtrl::SetMargin


 CToolTipCtrl::GetMargin

void GetMargin( LPRECT lprc ) const;

参数：
lprc是一个将用来获取边距信息的RECT结构的地址。该RECT结构的成员没有定义一个边界矩形。为了实现这个消息的目的，将结构成员解释如下：
成员 | 表述
top | 顶边线与工具提示文本顶部之间的以像素表示的距离
left | 左边线与提示文本最左边之间的以像素表示的距离
bottom | 底边线与提示文本底部之间的以像素表示的距离
right | 右边线与提示文本最右边之间的以像素表示的距离

说明：
此成员函数用来实现Win32消息TTM_GETMARGIN的行为，就像在“Platform SDK”中描述的一样。

请参阅：CToolTipCtrl::SetMargin


 CToolTipCtrl::GetMaxTipWidth

int GetMaxTipWidth( ) const;

返回值：返回一个工具提示窗口的最大宽度。

说明：
此成员函数用来实现Win32消息TTM_GETMAXTIPWIDTH的行为，就像在“Platform SDK”中描述的一样。

请参阅：CToolTipCtrl::SetMaxTipWidth


 CToolTipCtrl::GetText

void GetText( CString& str, CWnd* pWnd, UINT nIDTool = 0 ) const;

参数：
str | 是对一个用来接收工具的文本的CString对象的引用。
pWnd | 指向包含工具的窗口的指针。
nIDTool | 工具的ID。

说明：
此成员函数用来获取工具提示控件为一个工具保持的文本。pWnd和nIDTool参数标识工具。如果该工具先前通过调用CToolTipCtrl::AddTool向工具提示控件注册过，则由str参数引用的对象被赋给工具的文本。

请参阅：CToolTipCtrl::AddTool, CToolTipCtrl::DelTool


 CToolTipCtrl::GetTipBkColor

COLORREF GetTipBkColor( ) const;

返回值：返回一个代表背景颜色的COLORREF值。

说明：
此成员函数用来实现Win32消息TTM_GETTIPBKCOLOR的行为，就像在“Platform SDK”中描述的一样。

请参阅：CToolTipCtrl::SetTipBkColor


 CToolTipCtrl::GetTipTextColor

COLORREF GetTipTextColor( ) const;

返回值：返回一个代表文本颜色的COLORREF值。

说明：
此成员函数用来实现Win32消息TTM_GETTIPTEXTCOLOR的行为，就像在“Platform SDK”中描述的一样。

请参阅：CToolTipCtrl::SetTipTextColor


 CToolTipCtrl::GetToolCount

int GetToolCount( ) const;

返回值：返回向工具提示控件注册了的工具数目。

说明：
此成员函数用来获取向工具提示控件注册的工具数目。

请参阅：CToolTipCtrl::AddTool, CToolTipCtrl::DelTool


 CToolTipCtrl::GetToolInfo

BOOL GetToolInfo( CToolInfo& CToolInfo, CWnd* pWnd, UINT nIDTool = 0)const;

返回值：如果成功则返回非零值；否则返回0。

参数：
CToolInfo | 是对一个用来接收工具的文本的TOOLINFO对象的引用。
pWnd | 指向包含工具的窗口的指针。
nIDTool | 工具的ID。

说明：
此成员函数用来获取一个工具提示控件保持的一个工具的信息。由CToolInfo引用的TOOLINFO结构中的hwnd和uId成员标识了该工具。如果该工具先前已经通过调用AddTool向工具提示控件注册了，则TOOLLINFO结构被用该工具的信息填充。

请参阅：CToolTipCtrl::AddTool


 CToolTipCtrl::HitTest

BOOL HitTest( CWnd* pWnd, CPoint pt, LPTOOLINFO lpToolInfo ) const;

返回值：
如果由点击-测试信息指定的点在工具的边界矩形之内，则返回非零值；否则返回0。

参数：
pWnd | 指向包含工具的窗口的指针。
pt | 指向一个用来包含要被测试的点的坐标的CPoint对象的指针。
lpToolInfo | 指向包含工具信息的TOOLINFO结构的指针。

说明：
此成员函数用来测试一个点，以确定这个点是否位于给定工具的边界矩形之内，如果是，则获取有关该工具的信息。
如果这个函数返回一个非零值，则用该点所在的工具的信息来填充lpToolInfo指向的结构。
TTHITTESTINFO结构按如下定义：
typedef struct _TT_HITTESTINFO
{ // tthti
HWND hwnd; // handle of tool or window with tool
POINT pt; // client coordinates of point to test
TOOLINFO ti; // receives information about the tool
} TTHITTESTINFO, FAR *LPHITTESTINFO; hwnd指定该工具的句柄。 pt如果一个点在工具的边界矩形内，则指定这个点的坐标。 ti有关该工具的信息。有关TOOLINFO结构的更多信息，可以参见CToolTipCtrl::GetToolInfo。
请参阅：CToolTipCtrl::GetToolInfo


 CToolTipCtrl::Pop

void pop( );

说明：
此成员函数用来将一个被显示的工具提示窗口从视中删除。
此成员函数用来实现Win32消息TTM_POP的行为，就像在“Platform SDK”中描述的一样。


 CToolTipCtrl::RelayEvent

void RelayEvent( LPMSG lpMsg );

参数：
lpMsg 指向一个包含要转播的消息的MSG结构的指针。

说明：
此成员函数用来将一个鼠标消息传递给一个工具提示控件处理。一个工具提示只处理下面的消息，这些消息是通过RelayEvent传递给它的：
WM_LBUTTONDOWN WM_MOUSEMOVE
WM_LBUTTONUP WM_RBUTTONDOWN
WM_MBUTTONDOWN WM_RBUTTONUP
WM_MBUTTONUP

请参阅：
CWnd::PreTranslateMessage, CWinApp::PreTranslateMessage


 CToolTipCtrl::SetDelayTime

void SetDelayTime( UINT nDelay );
void SetDelayTime( DWORD dwDuration, int iTime );

参数：
nDelay | 指定以毫秒表示的新的延迟时间。
dwDuration | 指定要获取哪一段持续时间值的标志。参见CToolTipCtrl::GetDelayTime可以获得其有效值的描述。
iTime | 以毫秒表示的指定延迟时间。

说明：
此成员函数用来为一个工具提示控件设置延迟时间。延迟时间是在工具提示窗口显示之前光标必须保持在一个工具上的时间长度。缺省的延迟时间是500毫秒。

请参阅：
CToolTipCtrl::Activate, CToolTipCtrl::HitTest, CToolTipCtrl::GetDelayTime, TTM_SETDELAYTIME


 CToolTipCtrl::SetMargin

void SetMargin( LPRECT lprc );

参数：
lprc 一个包含要被设置的边距的信息的RECT结构的地址。该RECT结构的成员没有定义一个边界矩形。参见CToolTipCtrl::GetMargin可以获得有关边界信息的描述。

说明：
此成员函数用来实现Win32消息TTM_SETMARGIN的行为，就像在“PlatformSDK”中描述的一样。

请参阅：CToolTipCtrl::GetMargin


 CToolTipCtrl::SetMaxTipWidth

int SetMaxTipWidth( int iWidth )

返回值：返回先前的最大提示宽度。

参数：
iWidth 要设置的最大工具提示窗口的宽度。

说明：
此成员函数用来实现Win32消息TTM_SETMAXTIPWIDTH的行为，就像在“Platform SDK”中描述的一样。

请参阅：CToolTipCtrl::GetMaxTipWidth


 CToolTipCtrl::SetTipBkColor

void SetTipBkColor( COLORREF clr );

参数：
clr 新的背景颜色。

说明：
此成员函数用来实现Win32消息TTM_SETTIPBKCOLOR的行为，就像在“Platform SDK”中描述的一样。

请参阅：CToolTipCtrl::GetTipBkColor


 CToolTipCtrl::SetTipTextColor

void SetTipTextColor( COLORREF clr );

参数：
clr 新的文本颜色。

说明：
此成员函数用来实现Win32消息TTM_SETTIPTEXTCOLOR的行为，就像在“Platform SDK”中描述的一样。

请参阅：CToolTipCtrl::GetTipTextColor


 CToolTipCtrl::SetToolInfo

void SetToolInfo( LPTOOLINFO lpToolInfo );

参数：
lpToolInfo 指向一个用来指定要设置的信息的TOOLINFO结构的指针。

说明：
此成员函数用来设置一个工具提示控件为一个工具保持的信息。

请参阅：CToolTipCtrl::GetToolInfo


 CToolTipCtrl::SetToolRect

void SetToolRect( CWnd* pWnd, UINT nIDTool, LPCRECT lpRect );

参数：
pWnd | 指向包含工具的窗口的指针。
nIDTool | 工具的ID。
lpRect | 指向一个RECT结构的指针，该结构指定了新的边界矩形。

说明：此成员函数用来为一个工具设置新的边界矩形。

请参阅：CToolTipCtrl::GetToolInfo


 CToolTipCtrl::Update

void Update( );

说明：此成员函数用来强制当前工具被重画。

请参阅：CToolTipCtrl::UpdateTipText


 CToolTipCtrl::UpdateTipText

void UpdateTipText( LPCTSTR lpszText, CWnd* pWnd, UINT nIDTool = 0 );
void UpdateTipText( UINT nIDText, CWnd* pWnd, UINT nIDTool = 0 );

参数：
lpszText | 指向工具的文本的指针。
pWnd | 指向包含此工具的窗口的指针。
nIDTool | 工具的ID。
nIDText | 包含工具文本的字符串资源的ID。

说明：此成员函数用来为此控件的工具更新工具提示文本。

请参阅：CToolTipCtrl::GetToolInfo


 CTreeCtrl

CObject
└CCmdTarget
└CWnd
└CTreeCtrl

一个“tree view 控件”是一个用来显示项的层次列表的窗口，比如一个文档中的标题，索引中的项，或磁盘中的文件和目录。每一个项都包括一个标签和一个可选的位图图像，每一个项还有一个与其相关的子项的列表。单击一个项，用户可以展开或缩进该项的相关子项的列表。
CTreeCtrl类提供了Windows通用tree view控件的性能。这个控件（也就是CTreeCtrl类）只对运行在Windows 95和Windows NT 3.51或更高版本下的程序来说是可用的。
有关使用CTreeCtrl的更多信息，参见“Visual C++程序员指南”中的“控件主题”和“使用CTreeCtrl”。
#include <afxcmn.h>

请参阅：CImageList

CTreeCtrl类成员

构造
CTreeCtrl | 构造一个CTreeCtrl对象
Create | 创建一个tree view控件并将它与一个CTreeCtrl对象连接

属性
GetCount | 获取与一个treeview控件相关联的tree项的数目
GetIndent | 获取一个tree view项对它的父项的偏移（以像素表示）
SetIndent | 设置一个tree view项对它的父项的偏移（以像素表示）
GetImageList | 获取与一个tree view控件相关联的图像列表的句柄
SetImageList | 设置与一个tree view控件相关联的图像列表的句柄
GetNextItem | 获取与指定的关系匹配的下一个tree view项
ItemHasChildren | 如果指定项有子项则返回非零值
GetChildItem | 获取一个指定tree view项的子项
GetNextSiblingItem | 获取指定tree view项的下一个兄弟项
GetPrevSiblingItem | 获取指定tree view项的前一个兄弟项
GetParentItem | 获取指定tree view项的父项
GetFirstVisibleItem | 获取指定tree view项的第一个可视项
GetNextVisibleItem | 获取指定tree view项的下一个可视项
GetPrevVisibleItem | 获取指定tree view项的前一个可视项
GetSelectedItem | 获取当前被选择的tree view项
GetDropHilightItem | 获取一次拖放操作的目标
GetRootItem | 获取指定tree view项的根
GetItem | 获取一个指定tree view项的属性
SetItem | 设置一个指定tree view项的属性
GetItemState | 返回一个项的状态
SetItemState | 设置一个项的状态
GetItemImage | 获取与一个项相关联的图像
SetItemImage | 设置与一个项相关联的图像
GetItemText | 返回一个项的文本
SetItemText | 设置一个项的文本
GetItemData | 返回与一个项关联的32位的应用程序指定值
SetItemData | 设置与一个项关联的32位的应用程序指定值
GetItemRect | 获取一个tree view项的边界矩形
GetEditControl | 获取用来编辑指定tree view项的编辑控件的句柄
GetVisibleCount | 获取与一个tree view项关联的可视tree项的编号
GetToolTips | 获取一个tree view控件使用的子ToolTip控件的的句柄
SetToolTips | 设置一个tree view控件的子ToolTip控件的的句柄
GetBkColor | 获取控件的当前背景颜色
SetBkColor | 设置控件的背景颜色
GetItemHeight | 获取tree view项的当前高度
SetItemHeight | 设置tree view项的当前高度
GetTextColor | 获取控件的当前文本颜色
SetTextColor | 设置控件的文本颜色
SetInsertMark | 设置一个tree view控件的插入标记
GetCheck | 获取一个tree控件项的核选状态
SetCheck | 设置一个tree控件项的核选状态
GetInsertMarkColor | 获取tree view用来绘制插入标记的颜色
SetInsertMarkColor | 设置tree view用来绘制插入标记的颜色

操作
InsertItem | 在一个tree view控件中插入一个新项。
DeleteItem | 从一个tree view控件中删除一个项
DeleteAllItems | 从一个tree view控件中删除所有的项
Expand | 展开或收缩指定tree view项的子项
Select | 选择，在视中滚动，或重画一个指定的tree view项
SelectItem | 选择一个指定的tree view项
SelectDropTarget | 重画作为一次拖放操作的目标的tree项
SelectSetFirstVisible | 选择一个指定的tree view项作为第一个可视项
EditLabel | 现场编辑一个指定的tree view项
HitTest | 返回与CtreeCtrl关联的光标的当前位置
CreateDragImage | 为指定的tree view项创建一个拖动位图
SortChildren | 排序一个给定父项的子项
EnsureVisible | 确保一个tree view项在它的tree view控件中是可视的
SortChildrenCB | 使用一个由应用程序定义的排序函数来排列一个给定父项的子项


 CTreeCtrl::Create

BOOL Create( DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID );

返回值：
如果初始化成功则返回非零值；否则返回0。

参数：
dwStyle | 指定tree view控件的风格。可以对这个控件使用tree view控件风格的任意组合。
rect | 指定tree view控件的尺寸和位置。此参数可以是一个CRect对象或一个RECT结构。
pParentWnd | 指定tree view控件的父窗口，通常是一个CDialog。它不能是NULL。
nID | 指定tree view控件的ID。

说明：
构造一个CTreeCtrl要分两步。首先调用构造函数，然后调用Create来创建这个tree view控件并将它与该CTeeCtrl对象连接。
下面的风格可以应用到一个tree view控件：
· | TVS_HASLINES | tree view控件的子项与它们的父项之间用线连接。
· | TVS_LINESATROOT | tree view控件用线连接子项和根项。
· | TVS_HASBUTTONS | tree view在每一个父项的左边添加一个按钮。
· | TVS_EDITLABELS | tree view控件允许用户编辑tree view项的标签。
· | TVS_SHOWSELALWAYS | 当tree view失去焦点时，使被选择的项仍然保持被选择。
· | TVS_DISABLEDRAGDROP | 该tree view控件被禁止发送。
· | TVN_BEGINDRAG | 通知消息。
· | TVS_NOTOOLTIPS | tree view控件使用工具提示。
· | TVS_SINGLEEXPAND | 当使用这个风格时，改变在tree view中的选择将导致正被选择的项展开，而没有被选择的项收缩。如果用鼠标单击被选择的项，并且该项是关闭的，则该项就会展开。如果该被选择的项被单击时是打开的，则它就会收缩。

请参阅：
CTreeCtrl::CTreeCtrl, Tree View Control Window Styles in the Platform SDK


 CTreeCtrl::CreateDragImage

CImageList* CreateDragImage( HTREEITEM hItem );

返回值：
如果成功，则返回指向图像列表的指针，拖动位图将被加入到其中去；否则返回NULL。

参数：
hItem 要被拖动的tree项的句柄。

说明：
此成员函数用来为一个tree view控件中的给定项创建一个拖动位图，为位图创建一个图像列表，并将位图添加到该图像列表中。当项被拖动时，应用程序用图像-列表函数来显示图像。
CImageList对象是持久的，当使用完它时你必须删除它。例如：
CImageList* pImageList = MyTreeCtrl.CreateDragImage( nItem, &point );
...
...
delete pImageList;

请参阅：
CTreeCtrl::SelectDropTarget, CTreeCtrl::GetDropHilightItem, CTreeCtrl::SetImageList


 CTreeCtrl::CTreeCtrl

CTreeCtrl( )

说明：此函数用来构造一个CTreeCtrl对象。

请参阅：CTreeCtrl::Create


 CTreeCtrl::DeleteAllItems

BOOL DeleteAllItems( );

返回值：如果成功则返回非零值；否则返回0。

说明：
此成员函数用来从tree view控件中删除所有的项。

请参阅：CTreeCtrl::DeleteItem, CTreeCtrl::InsertItem


 CTreeCtrl::DeleteItem

BOOL DeleteItem( HTREEITEM hItem );

返回值：如果成功则返回非零值；否则返回0。

参数：
hItem 要被删除的tree view项的句柄。如果hItem的值是TVI_ROOT，则所有的项都被从此tree view控件中删除。

说明：
此成员函数用来从tree view控件中删除一个项。

请参阅：CTreeCtrl::DeleteAllItems, CTreeCtrl::InsertItem


 CTreeCtrl::EditLabel

CEdit* EditLabel( HTREEITEM hItem );

返回值：
如果成功则返回一个指向CEdit对象的指针，该对象被用来编辑该项的文本；否则返回NULL。

参数：
hItem 要被编辑的tree项的句柄。

说明：
此成员函数开始现场编辑指定项的文本。通过用一个单行编辑控件所包含的文本替换该项的文本来完成编辑。

请参阅：CTreeCtrl::GetEditControl


 CTreeCtrl::EnsureVisible

BOOL EnsureVisible ( HTREEITEM hItem );

返回值：
如果系统滚动tree view控件中的项以保证指定项可见则返回TRUE。否则，返回值为FALSE。

参数：
hItem 要被变为可见的tree项的句柄。

说明：
此成员函数用来保证一个tree view项是可见的。如果必要，函数扩展父项或滚动tree view扩展以使该项可见。

请参阅：CTreeCtrl::GetFirstVisibleItem, CTreeCtrl::GetVisibleCount


 CTreeCtrl::Expand

BOOL Expand( HTREEETEM hItem, UINT nColor );

返回值：如果成功则返回非零值；否则返回0。

参数：
hItem 要被扩展的tree项的句柄。
nCode用来指示要被进行的动作的标志。这个标志可以是下列值之一：
· | TVE_COLLAPSE | 收缩列表。
· | TVE_COLLAPSERESET | 收缩列表并删除子项。
· | TVE_EXPAND | 展开列表。
· | TVE_TOGGLE | 如果列表当前是展开的则收缩列表；反之则展开列表。

说明：
此成员函数用来展开或收缩给定父项的子项列表（如果有）。

请参阅：CTreeCtrl::EnsureVisible


 CTreeCtrl::GetBkColor

COLORREF GetBkColor( ) const;

返回值：
返回一个代表当前背景颜色的COLORREF值。如果这个值是-1，则控件正使用系统的颜色作为背景色。

说明：
此成员函数用来实现Win32消息TVM_GETBKCOLOR的行为，就像在“PlatformSDK”中描述的一样。

请参阅：CTreeCtrl::SetBkColor


 CTreeCtrl::GetCheck

BOOL GetCheck( HTREEITEM hItem ) const;

返回值：
如果该tree控件项是被核选的，则返回非零值；否则返回0。

参数：
hItem 要获取有关其状态信息的HTREEITEM。

说明：此成员函数用来获取一个项的核选状态。

请参阅：CTreeCtrl::SetCheck


 CTreeCtrl::GetChildItem

HTREEITEM GetChildItem( HTREEITEM hItem );

返回值：如果成功则返回该子项的句柄；否则返回NULL。

参数：
hItem 一个tree项的句柄。

说明：此成员函数用来获取由hItem指定的项的子项。

请参阅：
CTreeCtrl::GetItem, CTreeCtrl::GetParentItem, CTreeCtrl::SortChildren


 CTreeCtrl::GetCount

UINT GetCount( )

返回值：返回此tree view控件中的项的数目；否则返回-1。

说明：
此成员函数用来获取一个tree view控件中的项的数目。

请参阅：CTreeCtrl::GetVisibleCount


 CTreeCtrl::GetDropHilightItem

HTREEITEM GetDropHilightItem( );

返回值：如果成功则返回项的句柄；否则返回NULL。

说明：此成员函数用来获取一次拖放操作的目标。

请参阅：CTreeCtrl::SelectDropTarget


 CTreeCtrl::GetEditControl

CEdit* GetEditControl( );

返回值：
如果成功则返回一个指向用来编辑项的文本的编辑控件的指针；否则返回NULL。

说明：
此成员函数用来获取被用来编辑一个tree view项的文本的编辑控件的句柄。

请参阅：CTreeCtrl::EditLabel


 CTreeCtrl::GetFirstVisibleItem

HTREEITEM GetFirstVisibleItem( );

返回值：如果成功则返回第一个可视项的句柄；否则返回NULL。

说明：
此成员函数用来获取该tree view控件中的第一个可视项的句柄。

请参阅：
CTreeCtrl::GetNextVisibleItem, CTreeCtrl::GetPrevVisibleItem, CTreeCtrl::EnsureVisible, CTreeCtrl::GetVisibleCount


 CTreeCtrl::GetImageList

CImageList* GetImageList( UINT nImage )

返回值：
如果成功则返回指向控件的图像列表的指针；否则返回NULL。

参数：
nImage要获取的图像列表的类型。该图像列表可以是下列类型之一：
· | TVSIL_NORMAL | 获取常规的图像列表，它包含了该tree view项的被选择的和不被选择的图像。
· | TVSIL_STATE | 获取状态图像列表，它包含了处于用户定义状态的treeview项的图像。

说明：
此成员函数用来获取与该tree view控件关联的常规或状态图像列表的句柄。一个tree view控件中的每一个项都有一对图像与之关联。当项被选择时就显示其中某一个图像，当项没有被选择时则显示另一个图像。例如，当一个项被选择时显示为一个打开的文件夹，而当它没有被选择时则显示为一个关闭的文件夹。
有关图像列表的更多信息，参见CImageList类。

请参阅：CImageList, CTreeCtrl::SetImageList


 CTreeCtrl::GetIndent

UINT GetIndent( );

返回值：返回以像素表示的缩进量。

说明：此成员函数用来获取子项相对于父项缩进的量。

请参阅：CTreeCtrl::SetIndent


 CTreeCtrl::GetInsertMarkColor

COLORREF GetInsertMarkColor( ) const;

返回值：返回一个包含当前插入编辑颜色的COLORREF。

说明：
此成员函数用来实现Win32消息TVM_GETINSERTMARKCOLOR的行为，就像在“PlatformSDK”中描述的一样。

请参阅：CTreeCtrl::SetInsertMarkColor


 CTreeCtrl::GetItem

BOOL GetItem( TVITEM* pItem );

返回值：如果成功则返回非零值；否则返回0。

参数：
pItem 是一个指向TVITEM结构的指针，就像在“Platform SDK”中描述的一样。

说明：此成员函数用来获取指定tree view项的属性。

请参阅：
CTreeCtrl::SetItem, CTreeCtrl::GetChildItem, CTreeCtrl::GetNextItem, CTreeCtrl::SelectItem


 CTreeCtrl::GetItemData

DWORD GetItemData( HTREEITEM hItem ) const;

返回值：
返回一个与由hItem指定的项关联的32位的应用程序指定值。

参数：
hItem 要获取其数据的项的句柄。

说明：
此成员函数用来获取与指定项关联32位的应用程序指定值。

请参阅：CTreeCtrl::SetItemData


 CTreeCtrl::GetItemHeight

SHORT GetItemHeight( ) const;

返回值：返回以像素表示的项的高度。

说明：
此成员函数用来实现Win32消息TVM_GETITEMHEIGHT的行为，就像在“Platform SDK”中描述的一样。

请参阅：CTreeCtrl::SetItemHeight


 CTreeCtrl::GetItemImage

BOOL GetItemImage( HTREEITEM hItem, int& nImage, int& nSelectedImage )const;

返回值：如果成功则返回非零值；否则返回0。

参数：
hItem | 要获取其图像的项的句柄。
nImage | 一个用来接收该tree view控件的图像列表中的该项图像的索引的整数。
nSelectedImage | 一个用来接收该tree view控件的图像列表中的该项的被选择图像的索引的整数。

说明：
在一个tree view控件中每一个项有一对与之关联的位图图像。图像显示在一个项的标签的左边。其中一个项是在项被选择的时候显示的，另一个项是在项没有被选择的时候显示的。例如，当一个项被选择时它可能被显示为一个打开的文件夹，而当它没有被选择时则显示为一个关闭的文件夹。
此成员函数用来接收项的图像和被选择图像在该tree view控件的图像列表中的索引。

请参阅：CTreeCtrl::SetItemImage, CImageList


 CTreeCtrl::GetItemRect

BOOL GetItemRect( HTREEITEM hItem, LPRECT lpRect, BOOL bTextOnly );

返回值：
如果项是可视的则返回非零值，以及包含在lpRect中的边界矩形。否则，返回0和没有被初始化的lpRect。

参数：
hItem | 一个tree view项的句柄。
lpRect | 指向一个用来接收边界矩形的RECT结构的指针。其中的坐标是相对于该tree view控件的左上角的。
bTextOnly | 如果这个参数是非零值，则边界矩形值包括项的文本。否则，它包括该项在tree view控件所占据的整个一行。

说明：
此成员函数用来获取hItem的边界矩形，并确定该项是否是可视的。

请参阅：
CTreeCtrl::GetVisibleCount, CTreeCtrl::GetNextVisibleItem, CTreeCtrl::GetPrevVisibleItem, CTreeCtrl::EnsureVisible


 CTreeCtrl::GetItemState

UINT GetItemState( HTREEITEM hItem, UINT nStateMask ) const;

返回值：
返回一个用来指定项的状态的UINT。可能取值的信息，参见CTreeCtrl::GetItem。

参数：
hItem | 要获取其状态的项的句柄。
nStateMask | 用来指定要获取哪些状态的掩码，有关nStateMask的可能取值的更多信息，参见“Platform SDK”中的有关TVITEM结构的state和stateMask成员的讨论。

说明：
此成员函数返回由hItem指定的项的状态。

请参阅：CTreeCtrl::GetItem


 CTreeCtrl::GetItemText

CString GetItemText( HTREEITEM hItem ) const;

返回值：返回一个包含该项的文本的CString对象。

参数：
hItem 要获取其文本的项的句柄。

说明：
此成员函数返回由hItem指定的项的文本。

请参阅：CTreeCtrl::SetItemText


 CTreeCtrl::GetNextItem

HTREEITEM GetNextItem( HTREEITEM hItem, UINT nCode );

返回值：如果成功则返回下一个项的句柄；否则返回NULL。

参数：
hItem 一个tree项的句柄。
nCode一个用来指示与hItem的关系的类型的标志。这个标志可以是下列值之一：
· | TVGN_CARET | 获取当前被选择的项。
· | TVGN_CHILD | 获取第一个子项。hItem参数必须是NULL。
· | TVGN_DROPHILITE | 获取是一次拖放操作的目标的项。
· | TVGN_FIRSTVISIBLE | 获取第一个可见的项。
· | TVGN_TEXT | 获取下一个兄弟项。
· | TVGN_NEXTVISIBLE | 获取跟随在指定项之后的下一个可视项。
· | TVGN_PARENT | 获取指定项的父项。
· | TVGN_PREVIOUS | 获取前一个兄弟项。
· | TVGN_PREVIOUSVISIBLE | 获取在指定项之前的第一个可视项。
· | TVGN_ROOT | 获取根项的第一个子项，指定项是该根项的一个部分。

说明：
此成员函数用来获取与nItem具有由nCode参数指定的关系的tree view项。

请参阅：
CTreeCtrl::SetItem, CTreeCtrl::GetChildItem, CTreeCtrl::GetItem, CTreeCtrl::SelectItem, CTreeCtrl::GetPrevSiblingItem


 CTreeCtrl::GetNextSiblingItem

HTREEITEM GgeNextSiblingItem( HTREEITM hItem );

返回值：返回下一个兄弟项的句柄；否则返回NULL。

参数：
hItem 一个tree项的句柄。

说明：此成员函数用来获取下一个兄弟项。

请参阅：
CTreeCtrl::GetPrevSiblingItem, CTreeCtrl::GetChildItem, CTreeCtrl::GetItem, CTreeCtrl::SelectItem, CTreeCtrl::GetParentItem


 CTreeCtrl::GetNextVisibleItem

HTREEITEM GetNextVisibleItem( HTREEITEM hItem );

返回值：返回下一个可视项的句柄；否则返回NULL。

参数：
hItem 一个tree项的句柄。

说明：此成员函数用来获取hItem的下一个可视项。

请参阅：
CTreeCtrl::GetPrevVisibleItem, CTreeCtrl::GetFirstVisibleItem, CTreeCtrl::EnsureVisible, CTreeCtrl::GetParentItem


 CTreeCtrl::GetParentItem

HTREEITEM GetParentItem( HTREEITEM hItem );

返回值：返回父项的句柄；否则返回NULL。

参数：
hItem 一个tree项的句柄。

说明：此成员函数用来获取hItem的父项。

请参阅：
CTreeCtrl::GetChildItem, CTreeCtrl::GetRootItem, CTreeCtrl::GetItem, CTreeCtrl::GetPrevSiblingItem


 CTreeCtrl::GetPrevSiblingItem

HTREEITEM GetPrevSiblingItem(HTREEITEM hItem );

返回值：返回前一个兄弟项的句柄；否则返回NULL。

参数：
hItem 一个tree项的句柄。

说明：此成员函数用来获取hItem的前一个兄弟项。

请参阅：
CTreeCtrl::GetNextSiblingItem, CTreeCtrl::GetParentItem, CTreeCtrl::GetChildItem


 CTreeCtrl::GetPrevVisibleItem

HTREEITEM GetPrevVisibleItem( HTREEITEM hItem );

返回值：返回前一个可视项的句柄；否则返回NULL。

参数：
hItem 一个tree项的句柄。

说明：此成员函数用来获取hItem的前一个可视项。

请参阅：
CTreeCtrl::GetNextVisibleItem, CTreeCtrl::GetFirstVisibleItem, CTreeCtrl::EnsureVisible, CTreeCtrl::GetVisibleCount


 CTreeCtrl::GetRootItem

HTREEITEM GetRootItem( );

返回值：返回根项的句柄；否则返回NULL。

说明：此成员函数用来获取hItem的根项。

请参阅：
CTreeCtrl::GetItem, CTreeCtrl::GetChildItem, CTreeCtrl::GetParentItem


 CTreeCtrl::GetSelectedItem

HTREEITEM GetSelectedItem( );

返回值：返回被选择项的句柄；否则返回NULL。

说明：
此成员函数用来获取此tree view控件中的当前被选择项。

请参阅：
CTreeCtrl::Select, CTreeCtrl::SelectDropTarget, CTreeCtrl::GetDropHilightItem


 CTreeCtrl::GetTextColor

COLORREF GetTextColor( ) const;

返回值：
返回一个代表当前文本颜色的COLORREF值。如果这个值是-1，则控件是使用系统颜色作为文本颜色。

说明：
此成员函数用来实现Win32消息TVM_GETTEXTCOLOR的行为，就像在“Platform SDK”中描述的一样。

请参阅：CTreeCtrl::SetTextColor


 CTreeCtrl::GetToolTips

CToolTipCtrl* GetToolTips( );

返回值：
返回一个指向被tree控件使用的CToolTipCtrl对象的指针。如果Create成员函数使用了TVS_NOTOOLTIPS风格，则不会有工具提示控件被使用，此时返回值为NULL。

说明：
此成员函数用来实现Win32消息TVM_GETTOOLTIPS的行为，就像在“Platform SDK”中描述的一样。
GetToolTips的MFC实现返回一个被tree控件使用的CToolTipCtrl对象，而不是返回指向一个工具提示控件的句柄。

请参阅：CTreeCtrl::SetToolTips


 CTreeCtrl::GetVisibleCount

UINT GetVisibleCount( );

返回值：
返回tree view控件中的可见项的数目；否则返回-1。

说明：
此成员函数用来获取一个tree view控件中的可视项的数目。

请参阅：CTreeCtrl::GetCount, CTreeCtrl::EnsureVisible


 CTreeCtrl::HitTest

HTREEITEM HitTest( CPoint pt, UINT* pFlags );
HTREEITEM HitTest( TVHITTESTINFO* pHitTestInfo );

返回值：
返回位于指定点的tree view项的句柄，如果没有项位于该点，则返回NULL。

参数：
pt | 要测试的点的客户坐标。
pFlags | 指向一个用来接收有关点击测试的信息的整数的指针。它可以是说明部分中列出的flags成员值中的一个或多个。
pHitTestInfo | 一个包含点击测试的位置并接收测试结果的信息的TVHITTESTINFO结构的地址。

说明：
此成员函数用来确定相对于一个tree view控件的客户区的指定点的定位。
当调用这个函数时，pt参数指定要测试的点的坐标。此函数返回位于指定点的项的句柄，或者如果没有项位于该点则返回NULL。另外，pFlags参数包含了指明指定点的定位的值。

请参阅：CTreeCtrl::GetItemRect


 CTreeCtrl::InsertItem

HTREEITEM InsertItem( LPTVINSERTSTRUCT lpInsertStruct );
HTREEITEM InsertItem( UINT nMask,
LPCTSTR lpszItem,
int nImage,
int nSelectedImage,
UINT nState,
UINT nStateMask,
LPARAM lParam,
HTREEITEM hParent,
HTREEITEM hInsertAfter
);

HTREEITEM InsertItem( LPCTSTR lpszItem,
HTREEITEM hParent = TVI_ROOT,
HTREEITEM hInsertAfter = TVI_LAST
);

HTREEITEM InsertItem( LPCTSTR lpszItem,
int nImage,
int nSelectedImage,
HTREEITEM hParent = TVI_ROOT,
HTREEITEM hInsertAfter = TVI_LAST
);

返回值：如果成功则返回新项的句柄；否则返回NULL。

参数：
lpInsertStruct | 一个指向用来指定要插入的tree view项的属性的TVINSERTSTRUCT的指针。
nMask | 用来指定要设置的属性的整数。
lpszItem | 一个包含项的文本的字符串的地址。
nImage | 项的图像在tree view控件的图像列表中的索引。
nSelectedImage | 项的被选择图像在tree view控件的图像列表中的索引。
nState | 为项的状态指定的值。
nStateMask | 指定要设置的状态。
lParam | 与此项关联的一个32位的应用程序指定的值。
hParent | 要被插入的项的父项的句柄。
hInsertAfter | 新项要被插入其后的项的句柄。

说明：
此成员函数用来在一个tree view控件中插入一个新项。

请参阅：
CTreeCtrl::DeleteItem, CTreeCtrl::HitTest, CTreeCtrl::SelectDropTarget, CTreeCtrl::GetItem


 CTreeCtrl::ItemHasChildren

BOOL ItemHasChildren( HTREEITEM hItem );

返回值：
如果由hItem指定的tree项有子项则返回非零值；否则返回0。

参数：
hItem 一个tree项的句柄。

说明：
此成员函数用来确定由hItem指定的tree项是否有子项。如果有，则你可以接着调用CTreeCtrl::GetChildItem来获取那些子项。

请参阅：CTreeCtrl::GetChildItem


 CTreeCtrl::Select

BOOL Select( HTREEITEM hItem, UINT nCode );

返回值：如果成功则返回非零值；否则返回0。

参数：
hItem 一个tree项的句柄。
nCode要进行的动作的类型。这个参数可以是下列值之一：
· | TVGN_CARET | 设置给定项的选择。
· | TVGN_DROPHILITE | 用指明一次拖放操作的目标的风格重画给定的项。
· | TVGN_FIRSTVISIBLE | 垂直滚动该tree view以使指定的项成为第一个可见的项。

说明：
此成员函数通过滚动使该项进入视中，或用指明一次拖放操作的目标的风格重画该项，以选择给定的tree view项。
如果nCode包含的值是TVGN_CARET，则父窗口接收TVN_SELCHANGING和TVN_SELCHANGED通知消息。而且，如果指定项是一个收缩的父项的子项，则该父项的子项列表被展开以显示该指定项。在这种情况下，父窗口接收TVN_ITEMEXPANDING和TVN_ITEMEXPANDED通知消息。

请参阅：
CTreeCtrl::SelectItem, CTreeCtrl::GetSelectedItem, CTreeCtrl::SelectDropTarget


 CTreeCtrl::SelectDropTarget

BOOL SelectDropTarget( HTREEITEM hItem );

返回值：如果成功则返回非零值；否则返回0。

参数：
hItem 一个tree项的句柄。

说明：
此成员函数用指明一次拖放操作的目标的风格来重画该项。

请参阅：
CTreeCtrl::SelectItem, CTreeCtrl::GetDropHilightItem, CTreeCtrl::CreateDragImage


 CTreeCtrl::SelectItem

BOOL SelectItem( HTREEITEM hItem );

返回值：如果成功则返回非零值；否则返回0。

参数：
hItem 一个tree项的句柄。

说明：
此成员函数用来选择给定的tree view项。如果hItem是NULL，则此函数不选择任何项。

请参阅：
CTreeCtrl::Select, CTreeCtrl::GetSelectedItem, CTreeCtrl::SelectDropTarget


 CTreeCtrl::SelectSetFirstVisible

BOOL SelectSetFirstVisible( HTREEITEM hItem );

返回值：如果成功则返回非零值；否则返回0。

参数：
hItem 要被设置为第一个可视项的tree项的句柄。

说明：
此成员函数用来垂直滚动该tree view以使指定的项成为第一个可视项。此函数用TVM_SELECTITEM和TVGN_FIRSTVISIBLE消息参数向窗口发送一个消息。

请参阅：
CTreeCtrl::Select, CTreeCtrl::SelectItem, CTreeCtrl::SelectDropTarget


 CTreeCtrl::SetBkColor

COLORREF SetBkColor( COLORREF clr );

返回值：
返回一个代表当前文本颜色的COLORREF值。如果返回值是-1，则控件正使用系统颜色作为文本颜色。

参数：
clr 一个包含了新的背景颜色的COLORREF值。如果这个值是-1，则控件将改变为用系统颜色作为背景色。

说明：
此成员函数实现了Win32消息TVM_SETBKCOLOR的行为，就像在“Platform SDK”中描述的一样。

请参阅：CTreeCtrl::GetBkColor


 CTreeCtrl::SetCheck

BOOL SetCheck( HTREEITEM hItem, BOOL fCheck = TRUE );

返回值：如果成功则返回非零值；否则返回0。

参数：
hItem | 用来接收改变的核选状态的HTREEITEM。
fCheck | 表明是否要将tree控件项核选。缺省的，SetCheck将该项设置为被核选的。

说明：
此成员函数用来设置一个tree控件项的核选状态。当该tree控件项被核选（fCheck设置为TRUE），则该项显示一个邻近的核选标记。

请参阅：CTreeCtrl::GetCheck


 CTreeCtrl::SetImageList

CImageList* SetImageList( CImageList* pImageList, int nImageListType );

返回值：
返回指向先前的图像列表的指针（如果有）；否则返回NULL。

参数：
pImageList 指向要被分配的图像列表的指针。如果pImageList是NULL，则从tree view控件中删除所有的图像。
nImageListType要设置的图像列表的类型。图像列表可以是下列值之一：
· | TVSIL_NORMAL | 获取常规的图像列表，它包含了该tree view项的被选择的和不被选择的图像。
· | TVSIL_STATE | 获取状态图像列表，它包含了处于用户定义状态的treeview项的图像。

说明：
此成员函数用来设置一个tree view控件的常规或状态图像列表，并使用新的图像来重画该tree view项的图像。

请参阅：CImageList, CTreeCtrl::GetImageList


 CTreeCtrl::SetIndent

void SetIndent( UINT nIndent );

参数：
nIndent 以像素表示的缩进的宽度。如果nIndent小于系统定义的最小宽度，则新的宽度被设置为系统定义的最小值。

说明：
此成员函数用来为一个tree view控件设置缩进的宽度，并重画控件以反映新的宽度。

请参阅：CTreeCtrl::GetIndent, CTreeCtrl::GetItemRect


 CTreeCtrl::SetInsertMark

BOOL SetInsertMark ( HTREEITEM hItem, BOOL fAfter = TRUE );

返回值：如果成功则返回非零值；否则返回0。

参数：
hItem | 用来指定将在哪一个项处放置插入标记的HTREEITEM。如果这个参数是NULL，则删除该插入标记。
fAfter | 用来指定是将插入标记放置在指定项的前面还是后面的BOOL值。如果这个参数是非零值，则插入标记将被放置在指定项之后。如果此参数是零，则将插入标记放置在指定项之前。

说明：
此成员函数实现了Win32消息TVM_SETINSERTMARK的行为，就像在“Platform SDK”中描述的一样。


 CTreeCtrl::SetInsertMarkColor

COLORREF SetInsertMarkColor( COLORREF clrNew );

返回值：
返回一个包含了先前的插入标记颜色的COLORREF值。

参数：
clrNew 一个包含了新的插入标记颜色的COLORREF值。

说明：
此成员函数实现了Win32消息TVM_SETINSERTMARKCOLOR的行为，就像在“Platform SDK”中描述的一样。

请参阅：CTreeCtrl::GetInsertMarkColor


 CTreeCtrl::SetItem

BOOL SetItem( TVITEM* pItem );
BOOL SetItem( HTREEITEM hItem,
UINT nMask,
LPCTSTR lpszItem,
int nImage,
int nSelectedImage,
UINT nState,
UINT nStateMask,
LPARAM lParam
);

返回值：如果成功则返回非零值；否则返回0。

参数：
pItem | 一个指向包含新项属性的TVITEM结构的指针，就像在“Platform SDK”中描述的一样。
hItem | 要设置其属性的项的句柄。
nMask | 指定要设置哪些属性的整数。
lpszItem | 一个包含了项的文本的字符串的地址。
nImage | 项的图像在tree view控件的图像列表中的索引。
nSelectedImage | 该项的被选择图像在tree view控件的图像列表中的索引。
nState | 指定项的状态值。
nStateMask | 指定要设置哪些状态。
lParam | 一个与该项关联的32位的应用程序定义值。

说明：
此成员函数用来设置指定tree view项的属性。
在TVITEM结构中，hItem成员标识了这个项，mask成员指定了要设置的属性。如果mask成员或nMask参数指定的是TVIF_TEXT值，则pszText成员或lpszItem就是一个以空字符结尾的字符串的地址，而cchTextMax成员被忽略。如果mask（或nMask）指定的是TVIF_STATE值，则stateMask成员或nStateMask参数指定要改变的是哪一个项状态，而state成员或nState参数包含了那些状态的值。

请参阅：CTreeCtrl::GetItem


 CTreeCtrl::SetItemData

BOOL SetItemData( HTREEITEM hItem, DWORD dwData );

返回值：如果成功则返回非零值；否则返回0。

参数：
hItem | 要获取其数据的项的句柄。
dwData | 一个与由hItem指定的项关联的32位的应用程序指定值。

说明：
此成员函数用来设置与指定项关联的32位的应用程序指定值。

请参阅：CTreeCtrl::GetItemData


 CTreeCtrl::SetItemHeight

SHORT SetItemHeight ( SHORT cyHeight );

返回值：返回以像素表示的项的先前的高度。

参数：
cyHeight 指定tree view中的每一个项的新高度。如果这个参数小于图像的高度，则它将被设置为图像的高度。如果这个参数不是偶数值，则它将被设置为与它最接近的小于它的偶数值。如果这个参数是-1，则控件将变为使用它缺省的项高度。

说明：
此成员函数实现了Win32消息TVM_SETITEMHEIGHT的行为，就像在“Platform SDK”中描述的一样。

请参阅：CTreeCtrl::GetItemHeight


 CTreeCtrl::SetItemImage

BOOL SetItemImage( HTREEITEM hItem, int nImage, int nSelectedImage );

返回值：如果成功则返回非零值；否则返回0。

参数：
hItem | 要设置其图像的项的句柄。
nImage | 项的图像在tree view控件的图像列表中的索引。
nSelectedImage | 项的被选择图像在tree view控件的图像列表中的索引。

说明：
在一个tree view控件中每一个项有一对与之关联的位图图像。图像显示在一个项的标签的左边。其中一个项是在项被选择的时候显示的，另一个项是在项没有被选择的时候显示的。例如，当一个项被选择时它可能被显示为一个打开的文件夹，而当它没有被选择时则显示为一个关闭的文件夹。
此成员函数用来设置项的图像和它的被选择图像在tree view控件的图像列表中的索引。
有关图像的更多信息，参见CImageList。

请参阅：CTreeCtrl::GetItemImage, CImageList


 CTreeCtrl::SetItemState

BOOL SetItemState( HTREEITEM hItem, UINT nState, UINT nStateMask );

返回值：如果成功则返回非零值；否则返回0。

参数：
hItem | 要设置其状态的项的句柄。
nState | 指定该项的新的状态。
nStateMask | 指定要改变哪些状态。

说明：
此成员函数用来设置由hItem指定的项的状态。有关状态的信息，参见CTreeCtrl::GetItem。

请参阅：CTreeCtrl::GetItem, CTreeCtrl::GetItemState


 CTreeCtrl::SetItemText

BOOL SetItemText( HTREEITEM hItem, LPCTSTR lpszItem );

返回值：如果成功则返回非零值；否则返回0。

参数：
hItem | 要设置其文本的项的句柄。
lpszItem | 一个包含项的新文本的字符串的地址。

说明：
此成员函数用来设置由hItem指定的项的文本。

请参阅：CTreeCtrl::GetItemText


 CTreeCtrl::SetTextColor

COLORREF SetTextColor ( COLORREF clr );

返回值：
一个代表先前的文本颜色的COLORREF值。如果这个值是-1，则控件使用系统颜色作为文本的颜色。

参数：
clr 一个包含了新的文本颜色的COLORREF值。如果这个参数是-1，则控件将变为使用系统颜色作为文本的颜色。

说明：
此成员函数实现了Win32消息TVM_SETTEXTCOLOR的行为，就像在“PlatformSDK”中描述的一样。

请参阅：CTreeCtrl::GetTextColor


 CTreeCtrl::SetToolTips

void SetToolTips( CToolTipCtrl* pWndTip );
CToolTipCtrl* SetToolTips ( CToolTipCtrl* pWndTip );

返回值：
返回一个指向包含控件先前使用的工具提示的CToolTipCtrl对象，如果先前没有使用工具提示则返回NULL。

参数：
pWndTip 一个指向将要被该tree控件使用的CToolTipCtrl对象的指针。

说明：
此成员函数实现了Win32消息TVM_SETTOOLTIPS的行为，就像在“PlatformSDK”中描述的一样。
要使用工具提示，则需要在创建CTreeCtrl对象时指定TVS_NOTOOLTIPS风格。

请参阅：CTreeCtrl::GetToolTips, CTreeCtrl::Create


 CTreeCtrl::SortChildren

BOOL SortChildren ( HTREEITEM hItem );

返回值：如果成功则返回非零值；否则返回0。

参数：
hItem 其子项要被排序的父项的句柄。如果hItem是NULL，则将从该tree的根项开始排序。

说明：
此成员函数用来给一个tree view控件中的指定父项的子项进行排序。SorChildren不会对整个tree进行递归；只对hItem的直接子项进行排序。

请参阅：CTreeCtrl::SortChildrenCB


 CTreeCtrl::SortChildrenCB

BOOL SortChildrenCB( LPTVSORTCB pSort );

返回值：如果成功则返回非零值；否则返回0。

参数：
pSort 指向一个TVSORTCB结构的指针。

说明：
此成员函数通过使用一个应用程序定义的用来比较各项的回收函数来排序treeview项。
如果第一项应该在第二项的前面，则结构的比较函数lpfnCompare必须返回一个负值；如果第一项应该在第二项的后面则返回一个正值，如果两个项相等则返回零。
lParam1和lParam2参数分别对应于两个被比较项的TVITEM结构的lParam成员。lParamSort初始对应于TV_SORTCB结构的lParam成员。

请参阅：CTreeCtrl::SortChildren


 CTreeView

CObject
└CCmdTarget
└CWnd
└CView
└CCtrlView
└CTreeView

CTreeView类简化了对tree控件和CTreeCtrl类的使用，其中CTreeCtrl类使用MFC的文档-视结构封装了tree-控件的性能，有关这种结构的更多信息，参见CView类的概述以及其中的交叉索引。
#include <afxcview.h>

请参阅：CView, CCtrlView, CTreeCtrl

CTreeView类成员

Construction
CTreeView 构造一个CTreeView对象

Attributes
GetTreeCtrl 返回与视关联的tree控件


 CTreeView::CTreeView

CTreeView( );

说明：此成员函数用来构造一个CTreeView对象。

请参阅：CTreeCtrl


 CTreeView::GetTreeCtrl

CTreeCtrl& GetTreeCtrl( ) const;

说明：此成员函数返回一个对与该视关联的tree控件的引用。

请参阅：CTreeCtrl


 CTypedPtrArray

User-specifed base class
└CTypedPtrArray

template <class BASE_CLASS, class TYPE>
class CTypedPtrArray : publicBASE_CLASS

参数：
BASE_CLASS | 类型指针数组类的基类；必须是一个数组类（CObArray或CPtrArray）。
TYPE | 保存在基类数组中的元素的类型。

说明：
CTypedPtrArray类为CPtrArray或CObArray类对象提供了一个类型-安全“包装”。当你使用CTypedPtrArray而不是CPtrArray或CObArray时，C++类型-检查工具帮助消除由不匹配的指针类型引发的错误。
另外，CTypedPtrArray包装了许多在你使用CObArray或CPtrArray时必须使用的强制转换。
由于所有的CTypedPtrArray函数都是内联的，所以使用这个模板不会使你的代码的大小或速度受到很大的影响。
有关使用CTypedPtrArray的更多信息，参见“Visual C++程序员指南”中的文章“集合”和“集合：基于模板的类”。
#include <afxtempl.h>
请参阅：CPtrArray, CObArray

CTypedPtrArray类成员

元素访问
GetAt | 返回给定索引处的值
ElementAt | 返回一个对数组中的元素指针的模板引用
SetAt | 为一个给定索引设置值，不允许数组增长
SetAtGrow | 为一个给定索引设置值，允许数组增长
Add | 将一个新元素添加到设置的尾部。如果必要可以增长数组
Append | 将一个设置的内容添加到另一个数组的结尾。如果必要可以增长数组
Copy | 将另一个数组拷贝到该数组，如果必要可以增长该数组
InsertAt | 在一个指定索引处插入一个元素（或另一个数组中的索引元素）

操作
operator [] 设置或获取指定索引处的元素


 CTypedPtrArray::Add

int Add( TYPE newElement );

返回值：返回被添加元素的索引。

参数：
TYPE | 指定要添加到数组中的元素的类型的模板参数。
newElement | 要添加到此数组中去的元素。

说明：
此成员函数调用BASE_CLASS::Add。更多的细节说明，参见CObArray::Add。


 CTypedPtrArray::Append

int Append( const CTypedPtrArray <BASE_CLASS, TYPE> &src );

返回值：返回第一个被添加元素的索引。

参数：
BASE_CLASS | 类型指针数组类的基类；必须是一个数组类（CObArray或CPtrArray）。
TYPE | 保存在基类数组中的元素的类型。
src | 要被添加到一个数组中的元素的源。

说明：
此成员函数调用BASE_CLASS::Append。更多的细节说明，参见CObArray::Add。


 CTypedPtrArray::Copy

void Copy( const CTypedPtrArray <BASE_CLASS, TYPE> &src );

参数：
BASE_CLASS | 类型指针数组类的基类；必须是一个数组类（CObArray或CPtrArray）。
TYPE | 保存在基类数组中的元素的类型。
src | 要被拷贝到一个数组中的元素的源。

说明：
此成员函数调用BASE_CLASS::Copy。更多的细节说明，参见CObArray::Add。


 CTypedPtrArray::ElementAt

TYPE& ElementAt( int nIndex );

返回值：
返回一个对位于由nIndex指定的位置的元素的模板引用。这个元素的类型是由TYPE模板参数指定的。

参数：
TYPE | 指定保存在此数组的元素类型的模板参数。
nIndex | 一个整数索引，它大于或等于0，小于或等于由BASE_CLASS::GetUpperBound返回的值。

说明：
此成员函数调用BASE_CLASS::ElementAt。更多的细节说明，参见CObArray::ElementAt。

请参阅：CObArray::ElementAt, CObArray::GetUpperBound


 CTypedPtrArray::GetAt

TYPE GetAt( int nIndex ) const;

返回值：
返回位于nIndex指定的位置的元素的拷贝。这个元素的类型由TYPE模板参数指定。

参数：
TYPE | 指定保存在此数组的元素的类型的模板参数。
nIndex | 一个整数索引，它大于或等于0，小于或等于由BASE_CLASS::GetUpperBound返回的值。

说明：
此成员函数调用BASE_CLASS::GetAt。更多的细节说明，参见CObArray::GetAt。

请参阅：CObArray::GetAt, CObArray::GetUpperBound


 CTypedPtrArray::InsertAt

void InsertAt( int nIndex, TYPE newElement, int nCount = 1 );
void InsertAt( int nStartIndex, CTypedPtrArray <BASE_CLASS, TYPE> *pNewArray );

参数：
nIndex | 一个整数索引，可能大于由CObArray::GetUpperBound返回的值。
TYPE | 保存在基类数组中的元素的类型。
newElement | 要放置在此数组中的对象指针。newElement的值可以是NULL。
nCount | 此元素将被插入的次数（缺省为1）。
nStartIndex | 一个可能大于由CObArray::GetUpperBound返回值的整数索引。
BASE_CLASS | 类型指针数组类的基类；必须是一个数组类（CObArray或CPtrArray）。
pNewArray | 另一个包含要被添加到此设置中的元素的数组。

说明：
此成员函数调用BASE_CLASS::InsertAt。更多的细节说明，参见CObArray::InsertAt。


 CTypedPtrArray::SetAt

void SetAt( int nIndex, TYPE ptr );

参数：
nIndex | 一个整数索引，它大于或等于0，小于或等于由CObArray::GetUpperBound返回的值。
TYPE | 保存在基类数组中的元素类型。
ptr | 一个指向要被插入此数组的指定索引处的元素的指针。可以是NULL。

说明：
此成员函数调用BASE_CLASS::SetAt。更多的细节说明，参见CObArray::SetrtAt。


 CTypedPtrArray::SetAtGrow

void SetAtGrow( int nIndex, TYPE newElement );

参数：
nIndex | 一个整数索引，它大于或等于0。
TYPE | 保存在基类数组的元素类型。
newElement | 要被添加到此数组中的对象指针。可以是NULL。

说明：
此成员函数调用BASE_CLASS::SetAtGrow。更多的细节说明，参见CObArray::SetAtGrow。


 CTypedPtrArray::operator []

TYPE& operator []( int nIndex );
TYPE operator []( int nIndex ) const;

参数：
TYPE | 指定保存在此数组的元素的类型的模板参数。
nIndex | 一个整数索引，它大于或等于0，小于或等于由BASE_CLASS::GetUpperBound返回的值。

说明：
这些内联操作符调用BASE_CLASS::operator []。
第一个操作符，对不是const的数组使用，可以使用在一个赋值语句的右边（r-值）或左边（l-值）。第二个操作符，是对const数组使用的，只能被使用在右边。

请参阅：CObArray::operator []


 CTypedPtrList

User-specifed base class
└CTypedPtrList

template < class BASE_CLASS, class TYPE >
class CTypedPtrList : public BASE_CLASS

参数：
BASE_CLASS | 类型指针列表类的基类；必须是一个指针列表类（CObList或CPtrList）。
TYPE | 保存在基类列表中的元素的类型。

说明：
CTypedPtrList类为类CPtrList的对象提供了一个类型-安全的“包装”。当你使用CTypedPtrList而不是CObList或CPtrList的时候，C++类型-检查工具帮助消除由不匹配的指针类型引发的错误。
另外，CTypedPtrList包装实现了许多在使用CObList或CPtrList时要实现的强制转换。
因为所有的CTypedPtrList函数都是内联的，所以使用这个模板不会明显地影响你的代码的大小和速度。
从CObList派生的列表可以是连续的，但是从CPtrList派生的列表却不能。
当一个CTypedPtrList对象被删除时，或者是当它的元素被删除时，只有指针被删除了，而它们所引用的项并没有被删除。
有关使用CTypedPtrList的更多信息，参见“Visual C++程序员指南”中的文章“集合”和“基于模板的类”。
#include <afxtempl.h>
请参阅：CPtrList, CObList

CTypedPtrList类成员

首/尾元素访问
GetHead | 返回列表的头元素（不能是空的）
GetTail | 返回列表的尾元素（不能是空的）

操作
RemoveHead | 从列表的头部删除元素
RemoveTail | 从列表的尾部删除元素
AddHead | 将一个元素（或另一个数组中的所有元素）添加到列表的头部（产生一个新的头部）
AddTail | 将一个元素（或另一个数组中的所有元素）添加到列表的尾部（产生一个新的尾部）

重复
GetNext | 获取用于反复的下一个元素
GetPrev | 获取用于反复的前一个元素

获取/修改
GetAt | 获取在一个给定位置处的元素
SetAt | 设置在一个给定位置处的元素


 CTypedPtrList::AddHead

POSITION AddHead( TYPE newElement );
void AddHead( CTypedPtrList <BASE_CLASS, TYPE> *pNewList );

返回值：
第一种版本返回新插入的元素的POSITION值。

参数：
TYPE | 保存在基类列表中的元素的类型。
newElement | 要添加到此列表中的对象指针。可以是NULL值。
BASE_CLASS | 此类型指针列表类的基类；必须是一个指针列表类（CObList或CPtrList）。
pNewList | 一个指向另一个CTypedPtrList对象的指针。在pNewList中的元素将被添加到列表中。

说明：
此成员函数调用BASE_CLASS::AddHead。
第一种版本将一个新元素添加到列表的头元素之前。
第二种版本将另一个列表中的元素添加到此列表的头元素之前。


 CTypedPtrList::AddTail

POSITION AddTail( TYPE newElement );
void AddTail( CTypedPtrList <BASE_CLASS, TYPE> *pNewList );

返回值：第一个版本返回新插入的元素的POSITION值。

参数
TYPE | 保存在基类列表中的元素的类型。
newElement | 要添加到此列表中的对象指针。可以是NULL值。
BASE_CLASS | 此类型指针列表类的基类；必须是一个指针列表类（CObList或CPtrList）。
pNewList | 一个指向另一个CTypedPtrList对象的指针。在pNewList中的元素将被添加到列表中。

说明：
此成员函数调用BASE_CLASS::AddTail。
第一种版本将一个新元素添加到列表的尾元素之后。
第二种版本将另一个列表中的元素添加到此列表的尾元素之后。


 CTypedPtrList::GetAt

TYPE& GetAt( POSITION position );
TYPE GetAt( POSITION position ) const;

返回值：
如果是通过一个指向const CTypedPtrList的指针访问此列表，则GetAt返回一个类型由模板参数TYPE指定的指针。这使此函数只能被使用在赋值语句的右边，这样就保护了列表不被修改。
如果列表被直接访问，或通过一个指向CTypedPtrList的指针访问，则GetAt返回对一个类型由模板参数TYPE指定的指针的引用。这使得此函数可以使用在赋值语句的任何一边，从而允许该列表可以被修改。

参数：
TYPE | 指定保存在列表中的元素类型的模板参数。
position | 一个由先前调用GetHeadPosition或Find成员函数返回的POSITION值。

说明：
一个类型为POSITION的变量是此列表的一个关键字。它与索引是不一样的，你不能自己处理一个POSITION值。GetAt获取与一个给定位置关联的CObject指针。
你必须确保你的POSITION值表示的是列表中的一个有效位置。如果它是无效的，则Microsoft基础类库的调试版将给出断言。
这个内联函数调用了BASE_CLASS::GetAt。

请参阅：CObList::GetAt


 CTypedPtrList::GetHead

TYPE& GetHead( );
TYPE GetHead( ) const;

返回值：
如果是通过一个指向const CTypedPtrList的指针访问此列表，则GetHead返回一个类型由模板参数TYPE指定的指针。这使此函数只能被使用在赋值语句的右边，这样就保护了列表不被修改。
如果列表被直接访问，或通过一个指向CTypedPtrList的指针访问，则GetHead返回对一个类型由模板参数TYPE指定的指针的引用。这使得此函数可以使用在赋值语句的任何一边，从而允许该列表可以被修改。

参数：
TYPE 指定保存在列表中的元素类型的模板参数。

说明：
此成员函数用来获取代表此列表中的头元素的指针。
在调用GetHead之前，你必须保证该列表不是空的。如果该列表是空的，则Microsoft基础类库的调试版将给出断言。可以使用IsEmpty来检验该列表是否包含元素。

请参阅：
CPtrList::IsEmpty, CTypedPtrList::GetTail, CTypedPtrList::GetNext, CTypedPtrList::GetPrev


 CTypedPtrList::GetNext

TYPE& GetNext( POSITION& rPosition );
TYPE GetNext( POSITION& rPosition ) const;

返回值：
如果是通过一个指向const CTypedPtrList的指针访问此列表，则GetNext返回一个类型由模板参数TYPE指定的指针。这使此函数只能被使用在赋值语句的右边，这样就保护了列表不被修改。
如果列表被直接访问，或通过一个指向CTypedPtrList的指针访问，则GetNext返回对一个类型由模板参数TYPE指定的指针的引用。这使得此函数可以使用在赋值语句的任何一边，从而允许该列表可以被修改。

参数：
TYPE | 指定保存在列表中的元素类型的模板参数。
rPosition | 一个对先前调用GetNext,GetHeadPosition或其他成员函数返回的POSITION值的引用。

说明：
此成员函数用来获取由rPosition标识的列表元素，然后将rPosition设置为列表中的下一个项的POSITION值。如果你是通过调用GetHeadPosition或CPtrList::Find来建立初始位置的，你就可以使用GetNext来实现一个向前的反复循环。
你必须保证你的POSITION值代表的是列表中的一个有效位置。如果位置是无效的，则Microsoft基础类库的调试版将给出断言。
如果获取的元素是列表中的最后一个，则rPosition被设置为新值NULL。
在一个反复中删除一个元素是有可能的。参见CObList::RemovAt的示例。

请参阅：
CObList::Find, CObList::GetHeadPosition, CObList::GetTailPosition, CTypedPtrList::GetPrev, CTypedPtrList::GetHead, CTypedPtrList::GetTail


 CTypedPtrList::GetPrev

TYPE& GetPrev(POSITION& rPosition );
TYPE GetPrev( POSITION& rPosition ) const;

返回值：
如果是通过一个指向const CTypedPtrList的指针访问此列表，则GetPrev返回一个类型由模板参数TYPE指定的指针。这使此函数只能被使用在赋值语句的右边，这样就保护了列表不被修改。
如果列表被直接访问，或通过一个指向CTypedPtrList的指针访问，则GetPrev返回对一个类型由模板参数TYPE指定的指针的引用。这使得此函数可以使用在赋值语句的任何一边，从而允许该列表可以被修改。

参数：
TYPE | 指定保存在列表中的元素类型的模板参数。
rPosition | 一个对先前调用GetPrev或其它成员函数返回的POSITION值的引用。

说明：
此成员函数用来获取由rPosition标识的列表元素，然后将rPosition设置为列表中的下一个项的POSITION值。如果你是通过调用GetTailPosition或Find来建立初始位置的，你就可以使用GetPrev来实现一个反向的反复循环。
你必须保证你的POSITION值代表的是列表中的一个有效位置。如果位置是无效的，则Microsoft基础类库的调试版将给出断言。
如果获取的元素是列表中的第一个，则rPosition被设置为新值NULL。

请参阅：
CPtrList::Find, CPtrList::GetTailPosition, CPtrList::GetHeadPosition, CTypedPtrList::GetNext, CTypedPtrList::GetHead, CTypedPtrList::GetTail


 CTypedPtrList::GetTail

TYPE& GetTail( );
TYPE GetTail( ) const;

返回值：
如果是通过一个指向const CTypedPtrList的指针访问此列表，则GetTail返回一个类型由模板参数TYPE指定的指针。这使此函数只能被使用在赋值语句的右边，这样就保护了列表不被修改。
如果列表被直接访问，或通过一个指向CTypedPtrList的指针访问，则GetTail返回对一个类型由模板参数TYPE指定的指针的引用。这使得此函数可以使用在赋值语句的任何一边，从而允许该列表可以被修改。

参数：
TYPE 指定保存在列表中的元素类型的模板参数。

说明：
此成员函数用来获取此列表中的头元素。
在调用GetTail之前，你必须保证该列表不是空的。如果列表是空的，则Microsoft基础类库的调试版将给出断言。使用IsEmpty来检验列表是否包含元素。

请参阅：
CPtrList::IsEmpty, CPtrList::Find, CPtrList::GetTailPosition, CPtrList::GetHeadPosition, CTypedPtrList::GetPrev, CTypedPtrList::GetNext, CTypedPtrList::GetHead


 CTypedPtrList::RemoveHead

TYPE RemoveHead( );

返回值：
返回先前在列表头部的指针。这个指针的类型由模板参数TYPE指定。

参数：
TYPE 指定保存在列表中的元素类型的模板参数。

说明：
此成员函数从列表的头部删除元素并返回这个元素。
在调用RemoveHead之前，你必须保证该列表不是空的。如果列表是空的，则Microsoft基础类库的调试版将给出断言。使用IsEmpty来检验列表是否包含元素。

请参阅：
CTypedPtrList::RemoveTail, CPtrList::IsEmpty, CPtrList::GetHead, CPtrList::AddHead


 CTypedPtrList::RemoveTail

TYPE RemoveTail( );

返回值：
返回先前在列表尾部的指针。这个指针的类型由模板参数TYPE指定。

参数：
TYPE 指定保存在列表中的元素类型的模板参数。

说明：
此成员函数从列表的尾部删除元素并返回这个元素。
在调用RemoveHead之前，你必须保证该列表不是空的。如果列表是空的，则Microsoft基础类库的调试版将给出断言。使用IsEmpty来检验列表是否包含元素。

请参阅：
CTypedPtrList::RemoveHead, CPtrList::IsEmpty, CPtrList::GetTail, CPtrList::AddTail


 CTypedPtrList::SetAt

void SetAt( POSITION pos, TYPE newElement );

参数：
pos | 要被设置的元素的POSITION。
TYPE | 保存在基类列表中的元素类型。
newElement | 要被写入列表中去的对象指针。

说明：
此成员函数调用BASE_CLASS::SetAt。
一个类型为POSITION的变量是此列表的一个关键字。它与索引是不一样的，你不能自己处理一个POSITION值。SetAt写对象指针到列表中指定位置。
你必须确保你的POSITION值表示的是列表中的一个有效位置。如果它是无效的，则Microsoft基础类库的调试版将给出断言。
更多的细节说明，参见CObList::SetAt。


 CTypedPtrMap

User-specifed base class
└CTypedPtrMap

template < class BASE_CLASS, class KEY, class VALUE >
class CTypedPtrMap : public BASE_CLASS

参数：
BASE_CLASS | 此类型指针映射类的基类；它必须是一个指针映射类（CMapPtrToPtr，CMapPtrToWord，CMapWordToPtr，或CMapStringToPtr）。
KEY | 被用来作为该映射的关键字的对象的类。
VALUE | 保存在该映射中的对象的类。

说明：
CTypedPtrMap类为指针-映射类CMapPtrToPtr，CMapPtrToWord，CMapWordToPtr和CMapStringToPtr提供了安全类型的“包装”。当你使用CTypedPtrMap时，C++的类型-检查工具帮助消除由于不匹配的指针类型引发的错误。
由于所有的CTypedPtrMap函数都是内联的，所以使用这个模板不会明显地影响你的代码的大小或速度。
有关使用CTypedPtrMap的更多信息，参见“Visual C++程序员指南”中的文章“集合”和“集合：基于模板的类”。

#include <afxtempl.h>

请参阅：
CMapPtrToPtr, CMapPtrToWord, CMapWordToPtr, CMapStringToPtr

CTypedPtrMap类成员

元素访问
Lookup | 返回一个基于某个VALUE的KEY
GetNextAssoc | 获取下一个用于反复的元素
RemoveKey | 删除一个由关键字指定的元素
SetAt | 如果找到了匹配的关键字，则向映射中插入一个元素来代替一个已有的元素

操作符
operator [] 向映射中插入一个元素


 CTypedPtrMap::GetNextAssoc

void GetNextAssoc( POSITION& rPosition, KEY& rKey, VALUE& rValue ) const;

参数：
rPosition | 指定一个对先前调用GetNextAssoc或BASE_CLASS::GetStartPosition返回的POSITION值的引用。
KEY | 指定映射的关键字的类型的模板参数。
rKey | 指定被获取元素的返回关键字。
VALUE | 指定映射的值的类型的模板参数。
rValue | 指定被获取元素的返回值。

说明：
此成员函数获取rNextPosition处的映射元素，然后更新rNextPosition使其指向映射中的下一个元素。在对映射中的所有元素进行反复时此函数是最有用的。注意，位置的顺序不必与关键值的顺序一样。
如果被获取的元素是映射中的最后一个元素，则rNextPosition的新值被设置为NULL。
这个内联函数调用BASE_CLASS::GetNextAssoc。

请参阅：
CMapStringToOb::GetNextAssoc, CMapStringToOb::GetStartPosition


 CTypedPtrMap::Lookup

BOOL Lookup( BASE_CLASS::BASE_ARG_KEY key, VALUE& rValue ) const;

返回值：
如果找到了该元素则返回非零值；否则返回0。

参数：
BASE_CLASS | 指定此映射类的基类的模板参数。
key | 指定将被查找的元素的关键字。
VALUE | 指定保存在此映射中的值的类型的模板参数。
rValue | 指定被获取元素的返回值。

说明：
Lookup使用散列法运算法则来快速查找与某个关键字恰好匹配的映射元素。这个内联函数调用BASE_CLASS::Lookup。

请参阅：CMapStringToOb::Lookup


 CTypedPtrMap::RemoveKey

BOOL RemoveKey( KEY key );

返回值：
如果找到了指定的项并成功删除，则返回非零值；否则返回0。

参数：
KEY | 指定映射的关键字的类型的模板参数。
key | 要被删除的元素关键字。

说明：
此成员函数调用了BASE_CLASS::RemoveKey。更多的细节说明，参见CMapStringToOb::RemoveKey。


 CTypedPtrMap::SetAt

void SetAt( KEY key, VALUE newValue );

参数：
KEY | 指定映射的关键字的类型的模板参数。
key | 指定newValue的关键字值。
newValue | 指定新元素的值的对象指针。

说明：
此成员函数调用了BASE_CLASS::SetAt。更多的细节说明，参见CMapStringToOb::SetAt。


 CTypedPtrMap::operator []

VALUE& operator []( BASE_CLASS::BASE_ARG_KEY key );

参数：
VALUE | 指定保存在此映射中的值的类型的模板参数。
BASE_CLASS | 指定此映射类的基类的模板参数。
key | 指定映射中的将被查找或创建的元素的关键字。

说明：
此成员函数只能被使用在一个赋值语句的左边（一个l-值）。如果对于指定的关键字没有映射元素，则创建一个新的元素。这个操作符没有“右边”（r-值）的等价操作符，因为在映射中有可能找不到某个关键字。使用Lookup成员函数可以进行元素恢复。

请参阅：CTypedPtrMap::Lookup


 CUIntArray

CObject
└CUIntArray

CUIntArray类支持无符号整数数组。一个无符号的整数，或UINT，与字和双字是不一样的，一个UINT的物理大小可以根据目标操作环境而改变。在Windows 3.1版下，一个UINT与一个WORD的大小是一样的。在Windows NT和Windows 95下，一个UINT的大小与一个双字一样大。
CUIntArray的成员函数类似于类CObArray的成员函数。由于这个相似性，你可以使用特定成员函数的CObArray引用文件。在你看见一个CObject指针作为函数参数或返回值的地方，用一个UINT来代替。例如：
CObject* CObArray::GetAt( int <nIndex> ) const;
可以被转换为
UINT CUIntArray::GetAt( int <nIndex> ) const;
CUIntArray与IMPLEMENT_DYNAMIC宏一起支持运行时类型访问和转储到一个CDumpContext对象。如果你需要单个无符号整数元素的转储，你必须将转储环境的深度设置为1或更大。无符号整数数组不能被连续。
注意：
在使用一个数组之前，使用SetSize来建立它的大小并给它分配内存。如果你不使用SetSize，当向你的数组添加元素时会导致频繁地重定位和拷贝。频繁的重定位和拷贝会降低效率并产生内存碎片。
有关使用CUIntArray的更多信息，参见“Visual C++程序员指南”中的文章“集合”。
#include <afxcoll.h>

CUIntArray类成员

构造
CUIntArray 构造一个无符号整数的空数组

绑定
GetSize | 获取此数组中的元素的数目
SetSize | 设置包含在此数组中的元素数目
GetUpperBound | 获取最大的有效索引

操作
FreeExtra | 释放在当前上边界之上的所有没有使用的内存
RemoveAll | 从此数组中删除所有的元素

元素访问
GetAt | 返回一个给定索引处的值
SetAt | 设置一个给定索引的值，不允许数组增长
ElementAt | 返回一个对数组中的元素指针的临时引用
GetData | 允许访问数组中的元素。可以是NULL

增加数组
SetAtGrow | 设置一个给定索引的值。允许数组的必要增长
Add | 在数组的最后添加一个元素，允许数组的必要增长
Append | 给此数组添加另一个数组，允许数组的必要增长
Copy | 将另一个数组拷贝到该数组，允许数组的必要增长

插入/删除
InsertAt | 在指定索引处插入一个元素（或另一个数组中的所有元素）
RemoveAt | 删除指定索引处的元素

操作符
operator [] 设置或获取指定索引处的元素


 CUserException

CObject
└CException
└CUserException

抛出一个CUserException来停止一个结束-用户操作。当你想要对应用程序指定的异常使用抛出/捕获异常机制时，可以使用CUserException。在类名中的“User”可以解释为“我的用户做了某些我不想处理的异常事情”。
在调用全局函数AfxMessageBox之后，通常会抛出一个CUserException来通知用户操作失败了。当你编写一个异常处理程序时，由于用户已经获得了失败的通知，所以你要特别处理这个异常。在某些情况下，框架会抛出这个异常。你可以自己抛出一个CUserException，以警告用户，然后调用全局函数AfxThrowUserException。
在下面的示例中，一个函数包含的操作可能会失败，警告用户并抛出一个CUserException。调用函数捕获这个异常并特别处理它：
void DoSomeOperation( )
{
// 如果出错则处理
AfxMessageBox( "The x operation failed" );
AfxThrowUserException( );
}

BOOL TrySomething( )
{
TRY
{
// Could throw a CUserException or other exception.
DoSomeOperation( );
}
CATCH( CUserException, e )
{
return FALSE; // User already notified.
}
AND_CATCH( CException, e )
{
// For other exception types, notify user here.
AfxMessageBox( "Some operation failed" );
return FALSE;
}
END_CATCH
return TRUE; // No exception thrown.
}
有关使用CUserException的更多信息，参见“Visual C++程序员指南”中的“异常”。

#include <afxwin.h>

请参阅：
CException, AfxMessageBox, AfxThrowUserException


 CView

CObject
└CCmdTarget
└CWnd
└CView

CView类为用户定义的视图类提供了基本的功能。视图被连接到文档上，用作文档和用户之间的媒介：视图在屏幕或打印机上显示文档的图像，并将用户的输入解释为对文档的操作。
视图是框架窗口的子窗口。可能会有多个视图共用一个框架窗口，就像在分隔窗口中那样。视图类、框架窗口类和文档类之间的联系通过CDocTemplate类来建立。当用户打开一个新窗口或将现有窗口分隔为多个时，框架会创建一个新视图并将它连接到文档对象上。
一个视图只能被连接到一个文档，但是一个文档可以有多个视图与之相连接，
例如，在分隔窗口或多文档界面（MDI）应用程序的多重子窗口中显示的文档就是如此。对于给定的文档类型，应用程序可以支持不同类型的视图；例如，一个字处理程序可能既要提供文档的完整文本视图，又要提供只显示每节标题的大纲视图。这些不同的视图类型可以放在不同的框架窗口中，如果你使用的是分隔窗口，你也可以把它们放在同一框架窗口的不同板块中。
视图可以响应几种类型的输入，例如键盘输入，鼠标输入或拖放输入，还有菜单、工具条和滚动条产生的命令输入。视图接收框架窗口发送给它的命令，如果视图不接受一个给定的命令，它就将这个命令发送给相连接的文档。与所有的命令目标一样，视图类通过消息映射处理消息。
当文档的数据发生变化时，视图类响应这种变化，通常调用文档的CDocument::UpdateAllViews函数，通知所有其它的视图调用OnUpdate函数。OnUpdate数的缺省实现使视图的整个用户区域无效。你可以重载这个函数，只使视图中与文档的变化部分相对应的区域无效。
如果要使用CView，应当从它派生一个类，并实现它的OnDraw函数以在屏幕上显示。你还可以利用OnDraw函数来进行打印和打印预览。框架将处理打印循环以实现对文档的打印和打印预览。
通过CWnd::OnHScroll和CWnd::OnVScroll成员函数来处理滚动条消息。你可以在这些函数中实现对滚动消息的处理，你也可以利用CView的派生类SCrollView来处理滚动。
除了CScrollView以外，微软基础类库还提供了其它的CView派生类：
· | CCtrlView | 允许你在树，列表和带格式编辑控件中使用文档/视图结构。
· | CDaoRecordView | 在对话框控件中显示数据库记录的视图。
· | CEditView | 提供了一个简单的多行文本编辑器的视图。你可以将CEditView用作对话框中的一个控件，也可以将它用作文档的视图。
· | CFormView | 一种可以滚动的视图，其中包含了对话框控件，它建立在对话框模板资源的基础上。
· | CListView | 使你能够在列表控件中使用文档/视结构的视图。
· | CRecordView | 在对话框控件中显示数据库记录的视图。
· | CRichEditView | 使你能够在带格式编辑控件中使用文档/视图结构的视图。
· | CScrollView | 自动提供滚动支持的一种视图。
· | CTreeView | 使你能够在树控件中使用文档/视图结构的视图。
CView类还有一种派生类，名为CPreviewView，它被框架用于实现打印预览。这个类提供了对打印预览窗口特性的支持，例如工具条、单页或双页预览以及放大（被用来放大预览的图像）等。你没有必要调用或重载CPreviewView的任何成员函数，除非你想实现自己的打印预览界面（例如，如果你希望支持在预览模式下的编辑）。有关使用CView的更多信息参见“Visual C++程序员指南”中的“文档/视图结构主题”和“打印”。另外，有关自定义打印预览的更多细节可以参见“Visual C++文档”中的“技术注释30”。
#include <afxwin.h>

请参阅：CWnd, CFrameWnd, CSplitterWnd, CDC, CDocTemplate, CDocument

CView类成员

操作
DoPreparePrinting | 显示Print对话框，创建打印机设备环境；如果重载了OnPreparePrinting成员函数，则调用之
GetDocument | 返回与视图相连接的文档

OLE可重载函数
OnDragEnter | 当某项第一次被拖入视图的拖放区域时调用这个函数
OnDragLeave | 当某个被拖的项离开视图的拖放区域时调用这个函数
OnDragOver | 当某项被拖过视图的拖放区域时调用这个函数
OnDrop | 当某项被放入视图的拖放区域时调用这个函数，这是缺省的处理函数
OnDropEx | 当某项被放入视图的拖放区域时调用这个函数，这是主要的处理函数
OnDragScroll | 调用这个函数以确定光标是否被拖入窗口的滚动区域
OnInitialUpdate | 在一个视图第一次与文档连接的时候调用这个函数
OnScrollBy | 当一个包含活动的现场可编辑OLE项的视图被滚动时调用这个函数
OnScroll | 当OLE项被拖离视图的边界时调用这个函数

可重载函数
IsSelected | 测试一个文档项是否被选中。用于OLE支持
OnActivateView | 当一个视被激活时调用
OnActivateFrame | 当包含了视的框架窗口被激活或失去活动状态时调用这个函数
OnBeginPrinting | 开始打印作业时调用这个函数；重载这个函数以分配图形设备接口（GDI）资源
OnDraw | 调用这个函数画出文档的图像，用于屏幕显示，打印或打印预览。需要提供其实现
OnEndPrinting | 当打印作业结束时调用这个函数。重载这个函数以释放GDI资源OnEndPrintPreview在退出预览模式的时候调用这个函数
OnEndPrintPreview | 当激活预览模式时调用
OnPrepareDC | 在为屏幕显示调用OnDraw成员函数或为打印和打印预览调用OnPrint成员函数之前调用
OnPreparePrinting | 在文档被打印或预览之前调用这个函数；重载这个函数以初始化Print对话框
OnPrint | 调用这个函数以打印或预览文档的一页
OnUpdate | 调用这个函数以通知一个视图，文档已经被修改

构造函数
CView 构造一个CView对象


 CView::CView

CView( );

说明：
构造一个CView对象。当生成一个新的框架窗口或者要分隔一个窗口时，框架将调用这个构造函数。重载OnInitialUpdate成员函数以在与文档连接之后初始化该视图。

请参阅：CView::OnInitialUpdate


 CView::DoPreparePrinting

BOOL DoPreparePrinting( CPrintInfo* pInfo );

返回值：
如果可以开始打印或打印预览，则返回非零值；否则返回0。

参数：
pInfo 指向一个CPrintInfo结构，它描述了当前的打印作业。

说明：
在你重载的OnPreparePrinting函数中调用这个函数以激活Print对话框并创建一个打印机设备环境。
这个函数的效果依赖于它是为打印还是打印预览调用的（由pInfo参数中的m_bPreview成员指定）。如果某个文件将要被打印，这个函数将使用pInfo所指向的CPrintInfo结构中的数据来激活Print对话框；当用户关闭这个对话框的时候，这个函数根据用户在对话框中指定的设置创建一个打印机设备环境，并将这个设备环境通过pInfo参数返回。这个设备环境被用于打印文档。
如果文件是要被预览，这个函数使用当前的打印机设置创建一个打印机设备环境；这个设备环境在预览过程中被用来仿真打印机。

请参阅：CPrintInfo, CView::OnPreparePrinting


 CView::GetDocument

CDocument* GetDocument( ) const;

返回值：
指向与视图相连接的文档的指针。如果这个视图没有与文档相连接，则返回NULL。

说明：
调用这个函数以获得视图的文档指针。这使你能够调用文档的成员函数。

请参阅：CDocument


 CView::IsSelected

virtual BOOL IsSelected( const CObject* pDocItem ) const;

返回值：如果指定的文档项目被选中，则返回非零值；否则返回0。

参数：
pDocItem 指向要测试的文档项目的指针。

说明：
由框架调用，检查指定的文档项目是否被选中。这个函数的缺省实现返回FALSE。如果你使用CDocItem对象实现选择，则重载这个函数。如果你的视图中包含OLE项，则必须重载这个函数。

请参阅：CDocItem, COleClientItem


 CView::OnActivateFrame

virtual void OnActiveFrame( UINT nState, CFrameWnd* pFrameWnd );

参数：
nstate指定框架窗口是被激活还是反之。它可以是下列值之一：
· | WA_INACTIVE | 框架窗口将结束激活状态。
· | WA_ACTIVE | 框架窗口将通过不同于鼠标点击的方式而激活（例如，通过键盘接口来选择窗口）。
· | WA_CLICKACTIVE | 框架窗口将通过鼠标点击而激活。
pFrameWnd 指向要激活的框架窗口的指针。

说明：
当包含视图的框架窗口要被激活或结束激活状态时，框架就调用这个函数。如果你希望在与视图相关的框架窗口被激活或结束激活状态的时候进行特殊处理，那么应当重载这个成员函数。例如，当CFormView保存或恢复具有焦点的控件的时候，它就重载了这个函数。

请参阅：CWnd::OnActivate, CFormView


 CView::OnActivateView

virtual void OnActivateView( BOOL bActivate, CView* pActivateView, CView* pDeactiveView );

参数：
bActivate | 指明该视图是要被激活还是要结束激活状态。
pActivateView | 指向要激活的视图的指针。
pDeactiveView | 指向要结束激活状态的视图对象的指针。

说明：
当视图被激活或结束激活状态的时候，框架调用这个函数。这个函数的缺省实现将焦点设置到要激活的视图中。如果你希望在视图被激活或结束激活状态的时候进行特殊处理，那么应当重载这个函数。例如，如果你希望提供特别的视觉效果，使活动的视图与非活动的视图能有区别，你应当检查bActivate的值，并根据结果相应地更新视图的外观。
如果应用程序的主框架窗口被激活，而它的活动视图没有发生变化，那么pActivateView和pDeactiveView参数指向同一个视图——例如，焦点是从另一个应用程序传送到这个应用程序，而不是在应用程序内部从一个视图传送到另一个视图或是在MDI的子窗口之间传递。
当对一个视图调用CFrameWnd::SetActiveView，而这个视图与CFrameWnd::GetActive-View返回的视图不一致的时候，这些参数也是不同的。这通常在分隔窗口中发生。

请参阅：
CWnd::OnActivate, CFrameWnd::SetActiveView, CFrameWnd::GetActiveView


 CView::OnBeginPrinting

virtual void OnBeginPrinting( CDC* pDC, CPrintInfo* pInfo );

参数：
pDC | 指向打印机设备环境。
pInfo | 指向一个CPrintInfo结构，该结构描述了当前的打印作业。

说明：
框架在开始打印或打印预览作业之前，而在OnPreparePrinting被调用之后调用这个函数。这个函数的缺省实现不做任何操作。重载这个函数以分配打印所需的GDI资源，如画笔或字体。在OnPrint成员函数内部将这些GDI资源选入设备环境。如果你使用同一个视图对象来执行打印和打印预览，那么对每种显示所需的GDI资源使用不同的变量；这样使你能够在打印的时候更新屏幕。
你还可以使用这个函数来实现依赖于打印机设备环境的属性的初始化工作。例如，打印文档所需的页数依赖于用户在Print对话框中指定的设置（例如页长度等）。在这种情况下，你不能在OnPreparePrinting成员函数中指定文档的长度，而在通常情况下你可以这么做；你必须等待，直到已经根据对话框设置创建了打印机设备环境。OnBeginPrinting是使你能够访问代表了打印机设备环境的CDC对象的第一个重载函数，因此你可以在这个函数内部设置文档的长度。注意如果这时没有直到文档的长度，在预览的过程中将不会显示滚动条。

请参阅：
CView::OnEndPrinting, CView::OnPreparePrinting, CView::OnPrint


 CView::OnDragEnter

virtual DROPEFFECT OnDragEnter( COleDataObject* pDataObject, DWORD dwKeyState, CPoint point );

返回值：
DROPEFFECT枚举类型中的一个值，指明了如果用户在这个位置放下对象时将会发生的放下动作类型。
放下动作的类型通常与dwKeyState指明的当前按键状态有关。标准的从按键状态到DROPEFFECT值的映射如下：
· | DROPEFFECT_NONE | 数据对象不能在这个窗口中放下。
· | DROPEFFECT_LINK | 对应MK_CONTROL|MK_SHIFT，在对象及其服务器之间建立连接。
· | DROPEFFECT_COPY | 对应MK_CONTROL，创建放下的对象的一个拷贝。
· | DROPEFFECT_MOVE | 对应MK_ALT，创建放下的对象的一个拷贝并删除原来的对象。当视图能够接收这个数据对象时，通常这是缺省的下放效果。
有关的更多信息参见MFC高级概念示例OCLIENT。

参数：
pDataObject | 指向将要被拖入视图的下放区域的COleDataObject对象的指针。
dwKeyState | 包含了特殊键的状态。这是下列值的组合： MK_CONTROL, MF_SHIFT,MK_ALT, MK_LBUTTON, MK_MBUTTON和MK_RBUTTON。
point | 相对于视图的客户区域的当前鼠标位置。

说明：
当鼠标第一次进入下放目标窗口的非滚动区域时，框架就调用这个函数。缺省的实现不做任何操作，并返回DROPEFFECT_NONE。
将来可能产生的对OnDragOver成员函数的调用重载这个函数。任何对数据对象要求的数据都在此时获得，以备随后OnDragOver成员函数的使用。此时视图也应当被更新，以给用户视觉反馈。有关的更多信息参见“Visual C++程序员指南”中的文章“拖放：实现下放目标”。

请参阅：
CView::OnDragOver, CView::OnDrop, CView::OnDropEx, CView::OnDragLeave, COleDropTarget::OnDragEnter


 CView::OnDragLeave

virtual void OnDragLeave( );

说明：
当鼠标移出窗口的有效下放位置时，框架调用这个函数。
如果当前的视图需要清除在OnDragEnter或OnDragOver函数中产生的动作，例如清除对象被拖动或下放时用户的反馈，则应当重载这个函数。

请参阅：CView::OnDragEnter, CView::OnDragOver, CView::OnScroll, COleDropTarget::OnDragLeave


 CView::OnDragOver

virtual DROPEFFECT OnDragOver( COleDataObject* pDataObject, DWORD dwKeyState, CPoint point );

返回值：
DROPEFFECT枚举类型中的一个值，它指明了当用户在当前位置下放对象时会发生的下放动作类型。下放动作的类型依赖于dwKeyState指明的当前按键状态。从按键状态到DROPEFFECT枚举值的标准映射为：
· | DROPEFFECT_NONE | 数据对象不能在这个窗口中放下。
· | DROPEFFECT_LINK | 对应MK_CONTROL|MK_SHIFT，在对象及其服务器之间建立连接。
· | DROPEFFECT_COPY | 对应MK_CONTROL，创建下放的对象的一个拷贝。
· | DROPEFFECT_MOVE | 对应MK_ALT，创建下放的对象的一个拷贝并删除原来的对象。当视图能够接收这个数据对象时，通常这是缺省的下放效果。
有关的更多信息参见MFC高级概念示例OCLIENT。

参数：
pDataObject | 指向要被拖过下放目标的COleDataObject对象的指针。
dwKeyState | 包含了特殊键的当前状态。它是下列值的组合： MK_CONTROL,MK_SHIFT, MK_ALT, MK_LBUTTON, MK_MBUTTON和MK_RBUTTON。
point | 相对于视图的客户区域的当前鼠标位置。

说明：
当鼠标从下放目标窗口上方经过时，框架窗口调用这个函数。缺省的实行不做任何操作，并返回DROPEFFECT_NONE。
重载这个函数以在拖放操作的过程中向用户提供视觉反馈。由于这个函数是连续调用的，因此这个函数内部的代码必须尽可能地优化。有关的更多信息参见“Visual C++程序员指南”中的文章“拖放：实现下放目标”。

请参阅：
CView::OnDragEnter, CView::OnDrop, CView::OnDropEx, CView::OnDragLeave, COleDropTarget::OnDragOver


 CView::OnDragScroll

virtual DROPEFFECT OnDragScroll( DWORD dwKeyState, CPoint point );

返回值：
DROPEFFECT枚举类型中的一个值，它指明了当用户在当前位置下放对象时会发生的下放动作类型。下放动作的类型依赖于dwKeyState指明的当前按键状态。从按键状态到DROPEFFECT枚举值的标准映射为：
· | DROPEFFECT_NONE | 数据对象不能在这个窗口中放下。
· | DROPEFFECT_LINK | 对应MK_CONTROL|MK_SHIFT，在对象及其服务器之间建立连接。
· | DROPEFFECT_COPY | 对应MK_CONTROL，创建下放的对象的一个拷贝。
· | DROPEFFECT_MOVE | 对应MK_ALT，创建下放的对象的一个拷贝并删除原来的对象。
· | DROPEFFECT_SCROLL | 指明在目标视图中将要或正在发生一个下放滚动操作。
有关的更多信息参见MFC高级概念示例OCLIENT。

参数：
dwKeyState | 包含了特殊键的当前状态。它是下列值的组合： MK_CONTROL,MK_SHIFT, MK_ALT, MK_LBUTTON, MK_MBUTTON和MK_RBUTTON。
point | 相对于视图的客户区域的当前鼠标位置。

说明：
框架在调用OnDragOver和OnDragEnter之前调用这个函数以确定该点是否位于滚动区域。如果你想要为这个时间提供特别的动作，则可以重载这个函数。当鼠标被移进窗口边界内的滚动区域时，该函数的缺省实现自动滚动窗口。有关的更多信息参见“Visual C++程序员指南”中的文章“拖放：实现下放目标”。

请参阅：
CView::OnDragEnter, CView::OnDragOver, CView::OnDrop, CView::OnDragLeave, COleDropTarget::OnDragScroll


 CView::OnDraw

virtual void OnDraw( CDC* pDC=0 );

参数：
pDC 指向设备环境的指针，该环境被用于画出文档的图像。

说明：
框架调用这个函数以画出文档的图像。框架调用这个函数来实现屏幕显示，打印以及打印预览，在各种情况下，它传递不同的参数。没有缺省的实现。
为了显示你的文档的视图，必须重载这个函数。你可以通过pDC指向的CDC对象来调用图形设备接口（GDI）。你可以在显示之前将GDI资源，如画笔和字体等选入设备环境，在显示完成之后，再把它们选出去。通常你的绘图代码是与设备无关的，这意味着，它不需要有关显示图形的设备类型的信息。
如果要优化绘图操作，调用设备环境的RectVisible成员函数以确定一个给定的矩形是否需要重画。如果你需要区别普通的屏幕显示和打印，那么应调用设备环境的IsPrinting函数。

请参阅：
CDC::IsPrinting, CDC::RectVisible, CView::OnPrint, CWnd::OnCreate, CWnd::OnDestroy, CWnd::PostNcDestroy


 CView::OnDrop

virtual BOOL OnDrop( COleDataObject* pDataObject, DROPEFFECT dropEffect,CPoint point );

返回值：
如果成功地下放，则返回非零值，否则返回0。

参数：
pDataObject | 指向将要被放入下放目标的COleDataObject对象。
dropEffect用户要求的下放效果。
· | DROPEFFECT_COPY | 创建被下放的数据对象的一个拷贝。
· | DROPEFFECT_MOVE | 将数据对象移动到当前鼠标位置。
· | DROPEFFECT_LINK | 在数据对象和它的服务器之间创建连接。
point | 相对于视图的客户区域的当前鼠标位置。

说明：
当用户在有效的下放目标上方放开一个数据对象时，框架调用这个函数。缺省的实现不做任何操作，并且返回FALSE。
重载这个函数以实现视图的客户区内的OLE下放效果。可以通过pDataObject来检查数据对象的剪贴板数据格式和指定点的下放数据。
注意 如果在这个视类中存在OnDropEx的重载函数，则框架不会调用这个函数。

请参阅：
CView::OnDragEnter, CView::OnDragOver, CView::OnDropEx, CView::OnDragLeave, COleDropTarget::OnDrop


 CView::OnDropEx

virtual DROPEFFECT OnDropEx( COleDataObject* pDataObject, DROPEFFECT dropDefault, DROPEFFECT dropList, CPoint point );

返回值：
在point所指定的位置进行的下放动作的效果。它必须是dropEffectList所指定的值之一。在说明部分讨论了下放效果。

参数：
pDataObject | 指向将要放入下放目标的COleDataObject对象的指针。
dropDefault | 用户根据当前按键状态选择的下放操作的效果。它可能是DROPEFFECT_NONE。在说明部分讨论了下放效果。
dropList | 下放源所支持的下放效果的列表。下放效果值可以通过位或操作符（|）组合起来。在说明部分讨论了下放效果。
point | 相对于视图的客户区的当前鼠标位置。

说明：
当用户在有效的下放目标上方放开一个数据对象时，框架调用这个函数。缺省的实现不做任何操作，并且返回一个空值（-1）以指明框架必须调用OnDrop处理函数。
如果要实现鼠标右键的拖放效果，则应重载这个函数。通常在释放右键的时候，右键拖放操作会显示一个选择菜单。
你重载的OnDropEx必须查询鼠标右键的状态。你可以调用GetKeyState或者从OnDragEnter处理函数中保存鼠标右键的状态。
· | 如果鼠标右键被按下，你的重载函数必须显示一个弹出菜单，提供下放源支持的下放效果。
· | 检查dropList以确定下放源所支持的下放效果。在弹出菜单中仅使这些动作有效。
· | 使用SetMenuDefaultItem以根据dropDefault来设置缺省的动作。
· | 最后，执行用户通过弹出菜单所选择的动作。
· | 如果鼠标右键没有按下，你的重载函数应当将它当作标准的下放请求来处理。使用dropDefault中指定的下放效果。另外，你的重载函数业可以返回空值（-1）以指明将由OnDrop来处理这个下放操作。

使用pDataObject来检查COleDataObject的剪贴板数据格式和指定点的下放数据。
下放效果描述了与下放操作相关的动作。参看下面的下放效果列表：
· | DROPEFFECT_NONE | 不允许下放操作。
· | DROPEFFECT_COPY | 将执行拷贝动作。
· | DROPEFFECT_MOVE | 将执行移动动作。
· | DROPEFFECT_LINK | 将建立被下放数据和原始数据的连接。
· | DROPEFFECT_SCROLL | 指明在下放目标中将要或正在发生下放滚动操作。
有关设置缺省菜单命令的更多信息参见Win32文档中的SetMenuDefaultItem以及本书中的CMenu::GetSafeHmenu。

请参阅：
CView::OnDragEnter, CView::OnDragOver, CView::OnDrop, CView::OnDragLeave, COleDropTarget::OnDropEx


 CView::OnEndPrinting

virtual void OnEndPrinting( CDC* pDC, CPrintInfo* pInfo );

参数：
pDC | 指向打印机设备环境的指针。
pInfo | 指向一个CPrintInfo结构，描述了当前的打印作业。

说明：
框架在打印或预览文档之后调用这个函数。这个函数的缺省实现不做任何操作。重载这个函数以释放你在OnBeginPrinting成员函数中分配的GDI资源。

请参阅：CView::OnBeginPrinting


 CView::OnEndPrintPreview

virtual void OnEndPrintPreview( CDC* pDC, CPrintInfo* pInfo, POINT point,CPreviewView* pView );

参数：
pDC | 指向打印机设备环境的指针。
pInfo | 指向一个CPrintInfo结构，描述了当前的打印作业。
point | 指向在预览模式下最后显示的页面中的位置。
pView | 指向用于预览的视图对象的指针。

说明：
当用户退出打印预览模式时，框架调用这个函数。这个函数的缺省实现调用OnEndPrinting成员函数并将主框架窗口恢复到打印预览开始之前的状态。如果在预览模式结束的时候需要进行一些特殊的处理，则应重载这个函数。例如，如果你想要在从预览模式切换到普通显示模式的时候保持用户在文档中的位置，你可以滚动到pInfo参数指向的CPrintInfo结构中m_nCurPage所指向的页面，point参数所描述的位置。
在你的重载函数中总是要调用基类的OnEndPrintPreview函数，通常是在函数的末尾。

请参阅：CPrintInfo, CView::OnEndPrinting


 CView::OnInitialUpdate

virtual void OnInitialUpdate( );

说明：
当视图第一次被连接到文档，但是还没有被显示的时候，框架就调用这个函数。这个函数的缺省实现调用OnUpdate成员函数，不给任何提示信息（这意味着将lHint设为0，将pHint参数设为NULL）。如果你想进行一些需要文档信息的一次性初始化工作，那么应当重载这个函数。例如，如果你的应用程序具有固定大小的文档，你可以利用这个成员函数来根据文档的大小初始化视的滚动范围。如果你的应用程序支持可变大小的文档，则每当文档发生变化时，就使用OnUpdate函数来更新滚动范围。

请参阅：CView::OnUpdate


 CView::OnPrepareDC

virtual void OnPrepareDC( CDC* pDC, CPrintInfo* pInfo = NULL );

参数：
pDC | 指向设备环境的指针，用于画出文档的图像。
pInfo | 指向CPrintInfo结构的指针，如果OnPrepareDC是为打印或打印预览调用的，则该结构描述了当前打印任务，m_nCurPage成员指定了要打印的页数。如果OnPrepareDC是为屏幕显示而调用的，则这个参数为NULL。

说明：
在为屏幕显示而调用OnDraw成员函数或者为打印或打印预览每一页而调用OnPrint成员函数之前，框架调用这个函数。如果这个函数是为屏幕显示而调用的，则这个函数的缺省实现不做任何操作。但是，这个函数在派生类中被重载，例如在CScrollView中，以调整设备环境的属性，因此，在你的重载代码的开始部分，总应该调用基类的实现。
如果这个函数是为打印而调用的，缺省的实现检查保存在pInfo参数中的页面信息。如果没有指定文档的长度，OnPrepareDC假定文档只有一页，并且在打印完一页以后停止打印循环。这个函数通过将结构的m_bContinuePrinting成员设为FALSE来结束打印循环。
如果具有以下的原因，则因重载OnPrepareDC：
· | 要为指定的页面调整设备环境的属性。例如，如果你想要设置设备环境的映射模式或者其它特征，则应在这个函数中完成这些操作。
· | 要实现打印时的分页。通常你应当在打印开始时利用OnPreparePrinting成员函数来指定文档的长度。但是，如果你并不准确地知道文档的长度（例如，当打印数据库中未知数量的记录时），则应重载OnPrepareDC函数，以在打印时检测是否到了文档的末尾。如果已经没有文档需要打印了，将CPrintInfo结构的m_bContinuePrinting成员设为FALSE。
· | 要按页发送打印机的转义序列码。要在OnPrepareDC中发送转义序列码，则应调用pDC成员的Escape成员函数。

请参阅：
CDC::Escape, CPrintInfo, CView::OnBeginPrinting, CView::OnDraw, CView::OnPreparePrinting, CView::OnPrint


 CView::OnPreparePrinting

virtual BOOL OnPreparePrinting( CPrintInfo* pInfo );

返回值：如果要开始打印，则返回非零值；如果取消了打印任务，则返回0。

参数：
pInfo 指向一个CPrintInfo结构，该结构描述了当前打印任务。

说明：
框架在文档被打印或打印预览之前调用这个函数。缺省的实现不做任何操作。你必须重载这个函数才能够打印或打印预览。调用DoPreparePrinting成员函数，将pInfo参数传递给它，然后返回它的返回值。
DoPreparePrinting显示Print对话框并创建一个打印机设备环境。如果你想要用不同于缺省值的值初始化Print对话框，则将这些值赋给pInfo。例如，如果你知道文档的长度，在调用DoPreparePrinting函数之前将这个值传递给pInfo的SetMaxPage成员函数。这个值将显示在Print对话框中范围部分的To: 框中。
对于打印预览作业，DoPreparePrinting并不显示Print对话框。如果你希望在打印作业中跳过Print对话框，检查pInfo中的m_bPreview成员为FALSE，在将它传递给DoPrepare- Printing之前把它设为TRUE，然后在把它恢复为FALSE。
如果你想要进行的初始化工作需要访问代表打印机设备环境的CDC对象（例如，如果你在设定文档长度之前需要知道页面的大小），则应重载OnBeginPrinting成员函数。
如果你想要设置pInfo参数的m_nNumPreviewPages或m_strPageDesc成员的值，则应在调用DoPreparePrinting之后进行这些操作。DoPreparePrinting成员函数会把m_nNumPreviewPages设为在应用程序的.INI文件中找到的值，并将m_strPageDesc设为它的缺省值。

示例：
如果你在创建起始文件的时候选择了打印选项，则AppWizard会提供重载的OnPreparePrinting函数，下面就是例子。除非你想要初始化Print对话框，否则这个重载函数的功能已经足够了：
BOOL CMyView::OnPreparePrinting( CPrintInfo *pInfo )
{
return DoPreparePrinting( pInfo );
}

请参阅：
CPrintInfo, CView::DoPreparePrinting, CView::OnBeginPrinting, CView::OnPrepareDC, CView::OnPrint


 CView::OnPrint

virtual void OnPrint( CDC* pDC, CPrintInfo* pInfo );

参数：
pDC | 指向打印机设备环境的指针。
pInfo | 指向CPrintInfo结构的指针，该结构描述了当前打印作业。

说明：
框架调用这个函数以打印或预览文档的一页。对于要被打印的每一页，框架在调用OnPrepareDC成员函数之后立即调用这个函数。要被打印的页是在pInfo指向的CPrintInfo结构的m_nCurPage成员中指定的。缺省的实现调用OnDraw函数并将打印机设备环境传递给它。
如果具有以下原因，则应重载这个函数：
· | 要允许打印多页文档。仅画出与当前要打印的页相对应的文档内容。如果你要OnDraw函数来绘图，你可以调整视图口的原点，这样只有文档的适当的部分才会被打印。
· | 要使打印出来的图像与屏幕显示的图像不同（如果你的应用程序不是所见即所得的）。不应将打印机设备环境传递给OnDraw函数，而是使用设备环境，用没有在屏幕上显示的属性来画出图像。 如果你在打印时需要一些GDI资源，而在屏幕显示中没有使用它们，则应在绘图之前将它们选入设备环境，随后把它们选出。这些GDI资源必须在OnBeginPrinting函数中分配，而在OnEndPrinting函数中释放。
· | 要实现页眉和页脚。只要你限制OnDraw可以打印的区域，你还可以使用OnDraw函数来绘图。 注意pInfo参数的m_rectDraw成员以逻辑单位描述了页面中可以打印的区域。在你重载的OnPrint中不要调用OnPrepareDC，框架在调用OnPrint之前自动调用了OnPrepareDC。

示例：
下面是重载的OnPrint函数的基本结构：
void CMyView::OnPrint( CDC *pDC, CPrintInfo *pInfo )
{
// Print headers and/or footers, if desired.
// Find portion of document corresponding to pInfo->m_nCurPage
. OnDraw( pDC );
}

请参阅：
CView::OnBeginPrinting, CView::OnEndPrinting, CView::OnPrepareDC, CView::OnDraw


 CView::OnScroll

virtual BOOL CView::OnScroll( UINT nScrollCode, UINT nPos, BOOL bDoScroll= TRUE );

返回值：
如果bDoScroll为TRUE，并且视图确实被滚动了，则返回非零值；否则返回0。
如果bDoScroll为FALSE，则返回当bDoScroll为TRUE时应当返回的值，即使你没有作实际的滚动。

参数：
nScrollCode滚动条代码，指明用户的滚动请求。这个参数由两个部分组成：低字节确定了水平滚动的类型，高字节确定了垂直滚动的类型：
· | SB_BOTTOM | 滚动到底部
· | SB_LINEDOWN | 往下滚动一行
· | SB_LINEUP | 往上滚动一行
· | SB_PAGEDOWN | 往下滚动一页
· | SB_PAGEUP | 往上滚动一页
· | SB_THUMBTRACK | 将滚动块拖至指定位置。当前的位置由nPos指定
· | SB_TOP | 滚动到顶部
nPos | 如果滚动条代码为SB_THUMBTRACK，则包含了当前的滚动块位置；否则没有被使用。根据初始的滚动范围值，nPos有可能为负值，并且在必要时应当被强制转换为整数。
bDoScroll | 确定你是否需要实际完成指定的滚动动作。如果该值为TRUE，则必须执行滚动操作；如果为FALSE，则不应执行滚动操作。

说明：
框架调用这个函数以确定是否能够滚动。有一种情况是，如果视图接受到一个滚动条消息，则框架调用这个函数并将bDoScroll设为TRUE。在这种情况下，你必须执行实际的滚动。其它的情况是，当某个OLE项被拖入下放对象的自动滚动区域，在发生实际的滚动之前，框架调用这个函数并将bDoScroll设为FALSE。在这种情况下，你不应当执行实际的滚动。

请参阅：CView::OnScrollBy, COleClientItem


 CView::OnScrollBy

BOOL CView::OnScrollBy( CSize sizeScroll, BOOL bDoScroll = TRUE );

返回值：
如果该视图能被滚动，则返回非零值；否则返回0。

参数：
sizeScroll | 水平及垂直滚动的像素的数目。
bDoScroll | 确定视图的滚动是否发生。如果该值为TRUE，则发生了滚动；如果为FALSE，则没有发生滚动。

说明：
当用户将OLE项拖到当前视图的边界之外，或者操作水平、垂直滚动条，观察超出文档已显示的部分的内容时，框架就会调用这个函数。缺省的实现不做任何操作。在派生类中，这个函数检查该视图在用户请求的方向上是否可以滚动，然后在必要时更新新的区域。为了执行实际的滚动请求，CWnd::OnHScroll和CWnd::OnVScroll自动调用这个函数。


 CView::OnUpdate

virtual void OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint );

参数：
pSender | 指向修改了文档的视图，如果需要更新所有的视图，则为NULL。
lHint | 包含了与修改有关的信息。
pHint | 指向保存了与修改有关的信息的对象。

说明：
框架在视图的文档被修改后调用这个函数；这个函数被CDocument::UpdateAllViews调用的，使视图能够更新它的显示以反映那些变化。它也被OnInitialUpdate的缺省实现所调用。缺省的实现使整个客户区域无效，使得下一次接收到WM_PAINT消息时重画这些区域。如果你只想更新与文档的修改部分对应的区域，则应重载这个函数。为此你必须利用提示参数传递有关修改的信息。
如果要使用lHint，则应定义特殊的提示值，通常是位掩码或枚举值，并且使文档传递其中的一个值。要使用pHint，则应从CObject集成一个提示类，并使文档传递提示对象的指针。当你重载OnUpdate函数的时候，应使用CObject::IsKindOf成员函数来确定提示对象的运行时类型。
通常你不用在OnUpdate中直接执行任何绘图操作。相反，确定以设备坐标表示的矩形，描述要更新的区域，将这个矩形传递给CWnd::InvalidateRect。这会使下一次接收到WM_PAINT消息时产生绘图操作。
如果lHint为0，pHint为NULL，文档将发送一个一般的更新通知。如果一个视图接收到了一般的更新通知，或者它没有解码出提示，它将会使整个客户区无效。

请参阅：
CDocument::UpdateAllViews, CView::OnInitialUpdate, CWnd::Invalidate, CWnd::InvalidateRect


 CWaitCursor

CWaitCursor没有基类。
CWaitCursor类提供了显示等待光标的直接方式，当你进行冗长的操作时，它通常显示出一个沙漏。好的Windows编程方式要求你在执行耗用大量时间的操作时显示等待光标。
如果要显示等待光标，仅需在进入执行冗长操作的代码之前定义一个CWaitCursor变量。整个对象的构造函数自动地显示等待光标。
当对象超出作用域时（在定义了CWaitCursor对象的代码块的末尾），它的析构函数将光标设为原来的光标。换句话说，该对象自动执行必要的清除工作。
注意：
由于它们的构造函数和析构函数的工作方式，CWaitCursor对象总是被定义为局部变量__它们从不被定义为全局变量，也不用new来分配。
如果你执行了可能会使光标改变的操作，比如显示消息框或对话框，则应调用Restore成员函数以恢复光标。即使当前正在显示等待光标也可以调用Restore函数。
显示等待光标的另一种方式是使用CCmdTarget::BeginWaitCursor和CCmdTarget::EndWait Cursor的组合，可能还有CCmdTarget::RestoreWaitCursor。但是，CWaitCursor更易于使用，因为你在完成了冗长的操作之后不必将光标恢复到原来的光标。
注意：
MFC使用虚拟函数CWinApp::DoWaitCursor来设置和恢复光标。你可以重载这个函数以提供自定义的表现方式。
#include <afxwin.h>

请参阅：
CCmdTarget::BeginWaitCursor, CCmdTarget::EndWaitCursor, CCmdTarget::RestoreWaitCursor, CWinApp::DoWaitCursor

CWaitCursor类成员

构造/析构
CWaitCursor 构造一个CWaitCursor对象并显示等待光标

操作
Restore 在光标被改变后恢复等待光标


 CWaitCursor::CWaitCursor

CWaitCursor( );

说明：
如果要显示等待光标，只需在冗长操作的代码之前定义一个CWaitCursor对象。其构造函数自动显示等待光标。
当对象超出作用域（在定义CWaitCursor对象的代码块的末尾处），它的析构函数将光标设为原来的光标。换句话说，这个对象自动执行必要的清除操作。
析构函数是在代码块的末尾被调用的（可能是在函数末尾的前面），你可以利用这个特性使等待光标只将你的函数的一部分激活。下面的第二个例子演示了这种技术。
注意：
由于它们的构造函数和析构函数的工作方式，CWaitCursor对象总是被定义为局部变量__它们从不被定义为全局变量，也不用new来分配。

示例：
// 下面的例子演示了在冗长操作的过程中显示等待光标的一般方式。
void LengthyFunction( )
{
//你有可能在显示等待光标之前显示一个对话框
CWaitCursor wait; // 显示等待光标
// 执行一些冗长的操作
} // 析构函数自动清除等待光标

// 这个例子演示了在代码块内部使用CWaitCursor对象，
// 因此只有当程序执行冗长的操作时才会显示等待光标。
void ConditionalFunction( )
{
if ( SomeCondition )
{
CWaitCursor wait; // 仅在本代码块内部才显示等待光标。
//执行一些冗长的操作。
} // 在这个地方，析构函数清除等待光标。
else
{
//没有等待光标__只有快速操作
}
}

请参阅：
CWaitCursor::Restore, CCmdTarget::BeginWaitCursor, CCmdTarget::EndWaitCursor


 CWaitCursor::Restore

void Restore( );

说明：
如果想要恢复等待光标，则应在完成操作后调用这个函数，比如显示消息框或对话框，这可能会使等待光标变为其它光标。
如果当前正显示等待光标，也可以调用Restore函数。
如果你需要在没有定义CWaitCursor对象的函数内部恢复等待光标，则应调用CCmdTarget::RestoreWaitCursor。

示例：
// 这个例子演示了改变等待光标的操作
// 在完成改变光标的操作以后，你应当调用
// CWaitCursor::Restore以恢复光标。
void AnotherLengthyFunction( )
{
CWaitCursor wait; // 显示等待光标
//执行一些冗长操作
//对话框通常会将光标变为标准的箭头光标。
CSomeDialog dlg;
dlg.DoModal( );
//为了将光标变回等待光标，必须调用Restore函数。
wait.Restore( );
// 执行一些冗长操作
// 析构函数自动清除等待光标
}
// 如果等待光标被创建它的函数所调用的函数改变，
// 你可以调用CCmdTarget::RestoreWaitCursor来恢复等待光标。
void CalledFunction()
{
CSomeDialog dlg;
dlg.DoModal();
// 由于CWinApp是从CCmdTarget继承的，我们可以
// 使用应用程序对象的指针来调用CCmdTarget::RestoreWaitCursor。
AfxGetApp()->RestoreWaitCursor( );
// 还有其它冗长操作...
}

请参阅：CCmdTarget::RestoreWaitCursor


 CWinApp

CObject
└CCmdTarget
└CWinThread
└CWinApp

CWinApp是一个基类，你通过它来继承Windows应用程序对象。应用程序对象为你提供了初始化应用程序（以及它的每一个实例）和运行应用程序所需的成员函数。

每个使用微软基础类库的应用程序都只能包含一个从CWinApp继承的对象。当Windows调用WinMain函数时，这个对象在其它C++全局对象都已经生成并且可用之后才被创建，WinMain函数是由微软基础类库提供的。将你的CWinApp对象定义为全局的。

当你从CWinApp继承应用程序类的时候，应重载InitInstance成员函数以创建应用程序的主窗口对象。

除了CWinApp的成员函数以外，微软基础类库还提供了以下全局函数，用于访问你的CWinApp对象以及其它全局信息：
· | AfxGetApp | 获得指向CWinApp对象的指针。
· | AfxGetInstanceHandle | 获得当前应用程序实例的句柄。
· | AfxGetResourceHandle | 获得应用程序资源的句柄。
· | AfxGetAppName | 获得一个字符串指针，其中包含了应用程序的名字。
另外，如果你拥有一个指向CWinApp对象的指针，可以通过m_pszExename来获得应用程序的名字。

有关CWinApp类的更多信息参见“Visual C++ 程序员指南”中的“CWinApp：应用程序类”，其中包括下面的内容：
· | AppWizard生成的CWinApp派生代码
· | CWinApp在你的应用程序执行顺序中作用
· | CWinApp的缺省成员函数实现
· | CWinApp的主要可重载函数

#include <afxwin.h>

CWinApp类成员

数据成员
m_pszAppName | 指定了应用程序的名字
m_hInstance | 标识了应用程序的当前实例
m_hPrevInstance | 在32位应用程序中被设为NULL
m_lpCmdLine | 指向一个以null结尾的字符串，指定了应用程序的命令行
m_nCmdShow | 指定最初如何显示窗口
m_bHelpMode | 指明用户是否处于Help上下文模式（通常用SHIFT+F1激活）
m_pActiveWnd | 当一个OLE服务器是现场可激活时，它指向容器应用程序的主窗口
m_pszExeName | 应用程序的模块名字
m_pszHelpFilePath | 应用程序的帮助文件的路径
m_pszProfileName | 应用程序的.INI文件名
m_pszRegistryKey | 用于确定保存应用程序主要设置的完整的注册表键

构造函数
CWinApp 构造一个CWinApp对象

操作函数
LoadCursor | 载入光标资源
LoadStandardCursor | 载入WINDOWS.H中IDC_常量所指定的Windows预定义光标
LoadOEMCursor | 载入WINDOWS.H中OCR_常量所指定的WindowsOEM预定义光标
LoadIcon | 载入图标资源
LoadStandardIcon | 载入WINDOWS.H中IDI_常量所指定的Windows预定义图标
LoadOEMIcon | 载入WINDOWS.H中OIC_常量所指定的WindowsOEM预定义图标
RunAutomated | 检查应用程序的命令行是否指定/Automation选项。已不用。应当在调用ParseCommandLine之后使用CCommandLineInfo::m_bRunEmbedded中的值
RunEmbedded | 检查应用程序的命令行是否指定/Embedding选项。已不用。应当在调用ParseCommandLine之后使用CCommandLineInfo::m_bRunEmbedded中的值
ParseCommandLine | 解析命令行中的每个参数和标志
ProcessShellCommand | 处理命令行参数和标志
GetProfileInt | 从应用程序的.INI文件的一个入口中获取一个整数
WriteProfileInt | 将一个整数写到应用程序的.INI文件的入口
GetProfileString | 从应用程序的.INI文件的一个入口中获取一个字符串
WriteProfileString | 将一个字符串写到应用程序的.INI文件的入口
AddDocTemplate | 将一个文档模板加到应用程序的可用文档模板列表中
GetFirstDocTemplatePosition | 获取第一个文档模板的位置
GetNextDocTemplate | 获得文档模板的位置。可以递归调用
OpenDocumentFile | 由框架调用，用以从文件打开一个文档
AddToRecentFileList | 将一个文件名加入最近使用（MRU）的文件列表
SelectPrinter | 选择先前由用户在打印对话框中指定的打印机
CreatePrinterDC | 创建一个打印机设备环境
GetPrinterDeviceDefaults | 获得缺省的打印机设备

可重载函数
InitInstance | 可被重载以执行Windows的实例初始化，比如创建窗口对象
Run | 运行缺省的消息循环。可被重载以定制消息循环
OnIdle | 可被重载以执行应用程序指定的空闲时处理
ExitInstance | 可被重载以在应用程序结束时执行清除操作
HideApplication | 在关闭所有的文档之前隐藏应用程序
CloseAllDocuments | 关闭所有打开的文档
PreTranslateMessage | 在消息被分派到Windows函数::TranslateMessage和::DispatchMessage之前过滤消息
SaveAllModified | 提示用户保存所有改变了的文档
DoMessageBox | 为应用程序实现AfxMessageBoxProcessMessageFilter在消息到达应用程序之前截取特定的消息
ProcessWndProcException | 截取应用程序的消息和命令处理函数抛出的未被处理的异常
DoWaitCursor | 打开或关闭等待光标
OnDDECommand | 框架调用这个函数以响应动态数据交换（DDE）执行命令
WinHelp | 调用Windows的WinHelp函数

初始化函数
LoadStdProfileSettings | 载入标准的.INT文件设置并允许MRU文件列表特性
SetDialogBkColor | 设置对话框和消息框的缺省背景颜色
SetRegistryKey | 使应用程序的设置保存在注册表中，而不是.INI文件中
EnableShellOpen | 允许用户通过Windows的文件管理器打开数据文件
RegisterShellFileTypes | 在Windows的文件管理器中注册所有的应用程序文档类型
Enable3dControls | 使控件具有三维外观
Enable3dControlsStatic | 使控件具有三维外观

命令处理
OnFileNew | 实现ID_FILE_NEW命令
OnFileOpen | 实现ID_FILE_NEW命令
OnFilePrintSetup | 实现ID_FILE_PRINT_SETUP命令
OnContextHelp | 处理应用程序内的SHIFT+F1命令
OnHelp | 处理应用程序内的F1帮助命令（使用当前的上下文）
OnHelpIndex | 处理ID_HELP_INDEX命令，提供缺省的帮助主题
OnHelpFinder | 处理ID_HELP_FINDER和ID_DEFAULT_HELP命令
OnHelpUsing | 处理ID_HELP_USING命令


 CWinApp::AddDocTemplate

void AddDocTemplate( CDocTemplate* pTemplate );

参数：
pTemplate 指向要增加的CDocTemplate的指针。

说明：

调用这个成员函数，将文档模板加入应用程序维护的可用文档模板列表中。你可以在调用RegisterShellFileTypes之前加入所有的文档模板。

示例：

BOOL CMyApp::InitInstance()
{
// ...
// 下面的代码是在你选择MDI（多文档界面）选项时AppWizard为你生成的。
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_MYTYPE,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMDIChildWnd), // 标准的MDI子框架
RUNTIME_CLASS(CMyView)
);

AddDocTemplate(pDocTemplate);
// ...
}

请参阅：
CWinApp::RegisterShellFileTypes, CMultiDocTemplate, CSingleDocTemplate


 CWinApp::AddToRecentFileList

virtual void AddToRecentFileList( LPCTSTR lpszPathName );

参数：
lpszPathName 文件的路径。

说明：
调用这个成员函数以把lpszPathName加入MRU文件列表。你必须在使用这个成员函数之前调用LoadStdProfileSetting成员函数以载入当前的MRU文件列表。

当框架打开一个文件或者执行Save As命令用新名字保存文件时，它就调用这个成员函数。

示例：
// 这个例子将路径名 c:\temp\test.doc 加入// File菜单中的最近使用（MRU）文件列表
AfxGetApp()->AddToRecentFileList("c:\\temp\\test.doc");

请参阅：
CWinApp::LoadStdProfileSettings


 CWinApp::CloseAllDocuments

void CloseAllDocuments( BOOL bEndSession );

参数：
bEndSession 指定Windows会话是否要结束。如果为TRUE，则会话将结束；否则为FALSE。

说明：
调用这个函数以在退出之前关闭所有打开的文档。在调用CloseAllDocuments之前调用HideApplication。

请参阅：
CWinApp::SaveAllModified, CWinApp::HideApplication


 CWinApp::CreatePrinterDC

BOOL CreatePrinterDC( CDC& dc );

返回值：如果成功地创建了打印机设备环境，则返回非零值；否则返回0。

参数：
dc 对打印机设备环境的引用。

说明：
调用该成员函数从选定的打印机中创建打印机设备上下文（DC）。CreatePrinterDC初始化通过引用传递过来的设备上下文，因此，你可以使用该设备上下文进行打印。
如果该函数调用成功，在你打印完毕之后，必须销毁该设备上下文。你可以让CDC对象的析构器去做这件事，也可以显式地调用CDC=::DeleteDC。

请参阅：
CWinApp::SelectPrinter


 CWinApp::CWinApp

CWinApp( LPCTSTR lpszAppName = NULL );

参数：
lpszAppName 一个以null结尾的字符串，其中包含了Windows使用的应用程序的名字。如果没有提供这个参数，或者其值为NULL，CWinApp使用资源字符串AFX_IDS_APP_TITLE或可执行文件的文件名。

说明：
构造一个CWinApp对象并将lpszAppName传递给它，当作应用程序的名字保存。你必须创建一个CWinApp派生类的全局对象。在你的应用程序中只能有一个CWinApp对象。构造函数保存了执行CWinApp对象的指针，因此WinMain可以调用对象的成员函数以初始化并运行应用程序。


 CWinApp::DoMessageBox

virtual int DoMessageBox( LPCTSTR lpszPrompt, UINT nType, UINT nIDPrompt );

返回值：返回与AfxMessageBox相同的值。

参数：
lpszPrompt | 消息框中文本的地址。
nType | 消息框的风格。
nIDPrompt | 帮助上下文字符串的索引。

说明：
框架调用这个成员函数来实现全局函数AfxMessageBox中的消息框。不要用这个成员函数来打开消息框，应该使用AfxMessageBox。重载这个函数可以在你的应用程序的范围内自定义AfxMessageBox的处理。

请参阅：
AfxMessageBox, ::MessageBox


 CWinApp::DoWaitCursor

virtual void DoWaitCursor( int nCode );

参数：
nCode 如果这个参数为1，则出现等待光标。如果为0，则恢复等待光标，但不增加引用计数。如果为-1，则结束等待光标。

说明：
这个成员函数被框架调用，用以实现CWaitCursor，CCmdTarget::BeginWaitCursor，CCmdTarget::EndWaitCursor和CCmdTarget::RestoreWaitCursor。缺省的实现提供一个沙漏光标。DoWaitCursor维护一个引用计数。当它为正时，将显示沙漏光标。尽管通常你不用直接调用DoWaitCursor函数，你也可以重载这个成员函数以改变等待光标或者在显示等待光标时加入附加的处理。如果需要更简单有效的实现等待光标的方式，使用CWaitCursor。

请参阅：
CCmdTarget::BeginWaitCursor, CCmdTarget::EndWaitCursor, CCmdTarget::RestoreWaitCursor, CWaitCursor


 CWinApp::Enable3dControls

BOOL Enable3dControls( );
BOOL Enable3dControlsStatic( );
注意：在这个部分同时描述了Enable3dControls和Enable3dControlsStatic。

返回值
如果成功地载入了CTL3D32.DLL，则为TRUE；否则为FALSE。
如果操作系统支持控件的三维外观，则这个函数将返回FALSE。

说明：
在你重载的InitInstance成员函数内调用这些成员函数以使对话框和窗口的控件能够具有三维外观。这些成员函数载入CTL3D32.DLL并向它注册应用程序。如果你调用了Enable3dControls或Enable3dControlsStatic，你不需要调用SetDialogBkColor成员函数。
在与MFC DLL连接时，必须使用Enable3dControls。当与MFC库进行静态连接时，必须使用Enable3dControlsStatic。
仅在专业版和企业版中才具有的特征 只有Visual C++的专业版和企业版才支持与MFC的静态连接。有关的更多信息参见“Visual C++”。

MFC自动为下列的窗口类提供3D控件效果：
·CDialog
·CDialogBar
·CFormView
·CPropertyPage
·CPropertySheet
·CControlBar
·CToolBar
如果你希望具有3D外观的控件所在窗口属于上述类，那你只需调用Enable3dControls或Enable3dControlsStatic。如果你希望为基于其它类的窗口中的控件提供3D外观，则必须直接调用CTL3D32的API函数。

示例：
#ifdef _AFXDLL
Enable3dControls( ); // 调用 Enable3dControls
#else
Enable3dControlsStatic( ); // 调用 Enable3dControlsStatic
#endif

请参阅：
CWinApp::InitInstance, CWinApp::SetDialogBkColor


 CWinApp::EnableShellOpen

void EnableShellOpen( );

说明：
通常在你重载的InitInstance函数内调用这个函数，使你的应用程序的用户能够通过在Windows的文件管理器内双击文件的方式打开数据文件。与这个函数一起调用RegisterShellFileTypes成员函数，或者随应用程序提供一个.REG文件，用于手动注册文档类型。

示例：
BOOL CMyApp::InitInstance()
{
// ...
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_MYTYPE,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMDIChildWnd), // 标准的MDI子框架
RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);
// 创建MDI的主框架窗口
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE;
// 保存指向主框架窗口的指针。
// 这是框架获得主框架窗口类型的唯一方式。
m_pMainWnd = pMainFrame;
// 打开文件管理器的拖/放和DDE打开特性。
EnableShellOpen();
RegisterShellFileTypes();
// ...
// 根据应用程序启动时传递的nCmdShow参数显示主窗口
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();
// ...
}

请参阅：
CWinApp::OnDDECommand, CWinApp::RegisterShellFileTypes


 CWinApp::ExitInstance

virtual int ExitInstance( );

返回值
应用程序的退出码；0表示没有错误，大于0的值表示有错误。这个值被用作WinMain的返回值。

说明：
框架在Run成员函数的内部调用这个函数以退出应用程序的实例。不能在其它的任何地方调用这个成员函数，只能在Run成员函数内部调用。这个函数的缺省实现将框架的选项写入应用程序的.INI文件。重载这个函数以在应用程序退出的时候执行一些清除操作。

请参阅：
CWinApp::Run, CWinApp::InitInstance


 CWinApp::GetFirstDocTemplatePosition

POSITION GetFirstDocTemplatePosition( ) const;

返回值
一个POSITION值，可以被用于反复或获取对象指针。如果这个列表为空则返回NULL。

说明：
获得应用程序的第一个文档模板的位置。使用调用GetNextDocTemplate时返回的POSITION值来获得第一个CDocTemplate对象。

请参阅：
CWinApp::AddDocTemplate, CWinApp::GetNextDocTemplate


 CWinApp::GetNextDocTemplate

CDocTemplate* GetNextDocTemplate( POSITION& pos ) const;

返回值：指向CDocTemplate对象的指针。

参数：
pos 对一个POSITION值的引用，该值是上一次对GetNextDocTemplate或GetFirstDoc Template的调用所返回的。这一次调用将这个值更新为下一个位置。

说明：
获得pos所标识的文档模板，然后将pos设置为POSITION值。如果你通过对GetFirstDocTemplatePosition的调用建立了初始的位置，你可以在一个向前的循环中使用GetNextDocTemplate。你必须确保POSITION值是有效的。如果它无效，那么微软基础类库的调试版本将引起断言。如果获得的文档模板是最后一个有效模板，则新的pos值将被设为NULL。

请参阅：
CWinApp::AddDocTemplate, CWinApp::GetFirstDocTemplatePosition


 CWinApp::GetPrinterDeviceDefaults

BOOL GetPrinterDeviceDefaults( PRINTDLG* pPrintDlg );

返回值：如果成功，则为非零值；否则为0。

参数：
pPrintDlg 指向PRINTDLG结构的指针。

说明：
调用这个成员函数来为打印准备打印机设备环境。必要时从Windows的.INI文件中获得缺省的打印机，或者使用用户在Print Setup中设置的打印机配置。

请参阅：
CPrintDialog


 CWinApp::GetProfileInt

UINT GetProfileInt( LPCTSTR lpszSection, LPCTSTR lpszEntry, int nDefault );

返回值
如果这个函数执行成功，则返回指定入口下的字符串的整数值。如果函数没有找到入口，则返回值为nDefault的值。如果与指定入口对应的值不是整数，则返回值为0。
对于.INI文件中的值，这个函数支持十六进制符号。当你获得一个带符号整数时，你必须将其值强制转换为整数值。

参数：
lpszSection | 指向一个以null结尾的字符串，指定了包含入口的部分。
lpszEntry | 指向一个以null结尾的字符串，包含了要获取值的入口。
nDefault | 指定了当框架找不到入口时的缺省返回值。这个值可以是介于0和65535之间的无符号数，也可以是介于-32768和32767之间的带符号值。

说明：
调用这个函数以获得应用程序的注册表或.INI文件中指定部分的入口中的整数值。
这些入口按照如下方式保存：
·Windows NT 该值保存在注册表中
·Windows 3.X 该值保存在WIN.INI文件中。
·Windows 95 该值保存在WIN.INI的缓冲版本中。
这个函数对大小写不敏感，因此lpszSection和lpszEntry参数中的字符串在大小写状态上可以是不同的。

请参阅：
CWinApp::GetProfileString, CWinApp::WriteProfileInt, ::GetPrivateProfileInt


 CWinApp::GetProfileString

CString GetProfileString( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTR lpszDefault = NULL );

返回值
返回值是应用程序的.INI文件中的字符串，如果找不到该字符串，则为lpszDefault。框架支持的字符串最大长度为_MAX_PATH。如果lpszDefault为NULL，则返回值是一个空字符串。

参数：
lpszSection | 指向一个以null结尾的字符串，指定了包含入口的部分。
lpszEntry | 指向一个以null结尾的字符串，其中包含了要获取字符串的入口。这个值不能为NULL。
lpszDefault | 指向给定入口的缺省字符串值，当初始化文件中找不到入口时使用该值。

说明：
调用这个函数以获得与应用程序的注册表或.INI文件中指定部分的入口相关的字符串。
这些入口按照如下方式保存：
·Windows NT 该值保存在注册表中
·Windows 3.X 该值保存在WIN.INI文件中
·Windows 95 该值保存在WIN.INI的缓冲版本中

示例：
CString strSection = "My Section";
CString strStringItem = "My String Item";
CString strIntItem = "My Int Item";
CWinApp* pApp = AfxGetApp();
pApp->WriteProfileString(strSection, strStringItem, "test");
CString strValue;
strValue = pApp->GetProfileString(strSection, strStringItem);
ASSERT(strValue == "test");
pApp->WriteProfileInt(strSection, strIntItem, 1234);
int nValue;
nValue = pApp->GetProfileInt(strSection, strIntItem, 0);
ASSERT(nValue == 1234);

请参阅：
CWinApp::GetProfileInt, CWinApp::WriteProfileString, ::GetPrivateProfileString


 CWinApp::HideApplication

void HideApplication( );

说明：调用这个成员函数以在关闭打开的文档之前隐藏应用程序。

请参阅：
CWinApp::CloseAllDocuments


 CWinApp::InitInstance

virtual BOOL InitInstance( );

返回值：如果初始化成功，则返回非零值；否则返回0。

说明：
Windows允许在同一时刻运行程序的几份拷贝。在概念上，应用程序的初始化可以被分为两个部分：一次性的应用程序初始化工作，这些在应用程序第一次运行时完成，以及示例的初始化工作，每次运行程序的一个拷贝时都会执行这些操作，包括第一次运行时。框架中WinMain的实现调用这个函数。
重载InitInstance以初始化在Windows下运行的应用程序的每个新实例。通常，你重载InitInstance以构造主窗口对象并设置CWinThread::m_pMainWnd数据成员，使其指向这个窗口。有关重载这个成员函数的更多信息参见“Visual C++ 程序员指南”中的“CWinApp：应用程序类”。

示例：
// AppWizard 根据你选择的选项实现重载的InitInstance函数。
// 例如，对于下面由AppWizard创建的代码，选择了单文档界面（SDI）选项。
// 你可以在AppWizard创建的代码中加入其它的每个实例都执行的初始化代码。
BOOL CMyApp::InitInstance()
{
// 标准的初始化工作
// 如果你没有使用这些特性，并且希望减小最终可执行程序的大小，
// 你应当从下面的初始化例程中移去不必要的代码。
SetDialogBkColor(); // 将对话框的背景色设为灰色。
LoadStdProfileSettings(); // 载入标准的INI文件选项（包括MRU）
// 注册应用程序的文档模板。文档模板
//被用作文档、框架窗口和视图之间的联系。
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CMainFrame), // SDI的主框架窗口
RUNTIME_CLASS(CMyView)
);
AddDocTemplate(pDocTemplate);
// 创建一个新（空的）文档
OnFileNew();
if (m_lpCmdLine[0] != '\0')
{
// 任务：在这里加入命令行处理代码
}
return TRUE;
}


 CWinApp::LoadCursor

HCURSOR LoadCursor( LPCTSTR lpszResourceName ) const;
HCURSOR LoadCursor( UINT nIDResource ) const;

返回值：如果成功，则返回光标的句柄；否则返回NULL。

参数：
lpszResourceName | 指向一个以null结尾的字符串，其中包含了光标资源的名字。你可以在这个参数中使用CString对象。
nIDResource | 光标资源的ID。

说明：
载入当前可执行文件中以lpszResourceName为名或nIDResource指定的光标资源。仅当光标以前没有被载入内存时，LoadCursor才会将它载入；否则，它获得现存资源的句柄。
如果要访问预定义的Windows光标，则使用LoadStandardCursor或LoadOEMCursor。

示例：
HCURSOR hCursor;
// 载入最初用图形编辑器创建并赋给ID值IDC_MYCURSOR的光标资源
hCursor = AfxGetApp()->LoadCursor(IDC_MYCURSOR);

请参阅：
CWinApp::LoadStandardCursor, CWinApp::LoadOEMCursor, ::LoadCursor


 CWinApp::LoadIcon

HICON LoadIcon( LPCTSTR lpszResourceName ) const;
HICON LoadIcon( UINT nIDResource ) const;

返回值：如果成功，则返回图标的句柄；否则返回NULL。

参数：
lpszResourceName | 指向一个以null结尾的字符串，其中包含了图标资源的名字。你可以在这个参数中使用CString对象。
nIDResource | 图标资源的ID。

说明：
载入可执行文件中以lpszResourceName为名或是nIDResource指定的图标资源。仅当以前图标没有被载入内存时才将它载入；否则它获得现存资源的句柄。你可以使用LoadStandardIcon或LoadOEMIcon成员函数来访问预定义的Windows图标。
注意：这个成员函数调用Win32 API函数LoadIcon，它仅能载入大小在SM_CXICON和SM_CYICON之内的图标。

请参阅：
CWinApp::LoadStandardIcon, CWinApp::LoadOEMIcon, ::LoadIcon


 CWinApp::LoadOEMCursor

HCURSOR LoadOEMCursor( UINT nIDCursor ) const;
返回值：如果成功，则返回光标的句柄；否则返回NULL。

参数：
nIDCursor 指定了预定义的Windows光标的ODC_常量标识符。你必须在#include <afxwin.h>语句之前定义#define OEMRESOURCE，以获取对WINDOWS.H中OCR_常量的访问权限。

说明：
这个函数载入nIDCursor指定的Windows预定义光标。要访问预定义的Windows光标，应使用LoadOEMCursor或LoadStandardCursor成员函数。

示例：
// 在 stdafx.h 文件中，加入 #define OEMRESOURCE 以
// 包含windows.h 对OCR_值的定义
#define OEMRESOURCE
#include <afxwin.h> // MFC 内核和标准组件
#include <afxext.h> // MFC 扩展（包括VB）
HCURSOR hCursor;
// 载入预定义的Windows全尺寸光标
hCursor = AfxGetApp()->LoadOEMCursor(OCR_SIZEALL);

请参阅：
CWinApp::LoadCursor, CWinApp::LoadStandardCursor, ::LoadCursor


 CWinApp::LoadOEMIcon

HICON LoadOEMIcon( UINT nIDIcon ) const;

返回值：如果成功，则返回图标的句柄；否则返回NULL。

参数：
nIDIcon 指定了预定义的Windows图标的OIC_常量标识符。你必须在#include <afxwin.h>语句之前定义#define OEMRESOURCE，以获取对WINDOWS.H中OIC_常量的访问权限。

说明：
这个函数载入nIDIcon指定的Windows预定义图标资源。要访问预定义的Windows图标，应使用 LoadOEMIcon 或 LoadStandardIcon 成员函数。

请参阅：
CWinApp::LoadStandardIcon, CWinApp::LoadIcon, ::LoadIcon


 CWinApp::LoadStandardCursor

HCURSOR LoadStandardCursor( LPCTSTR lpszCursorName ) const;

返回值：如果成功，则返回光标的句柄；否则返回NULL。

参数：
lpszCursorName标识了预定义的Windows光标的IDC_常量标识符。这些标识符在WINDOWS.H中定义。下面给出的是可能取值的列表和lpszCursorName的含义：
· | IDC_ARROW | 标准的箭头光标
· | IDC_IBEAM | 标准的插入文本光标
· | IDC_WAIT | 当Windows执行耗时操作时使用的沙漏光标
· | IDC_CROSS | 用于选择的十字光标
· | IDC_UPARROW | 向上指的箭头光标
· | IDC_SIZE | 已不被支持。应使用IDC_SIZEALL
· | IDC_SIZEALL | 四向箭头。用于改变窗口大小。
· | IDC_ICON | 以不被支持。应使用IDC_ARROW。
· | IDC_SIZENWSE | 双向箭头，尾部在左上角和右下角。
· | IDC_SIZENESW | 双向箭头，尾部在右上角和左下角。
· | IDC_SIZEWE | 双向水平箭头
· | IDC_SIZENS | 双向垂直箭头

说明：
载入lpszCursorName指定的Windows预定义光标。要访问Windows的预定义光标，应使用LoadStandardCursor 或 LoadOEMCursor成员函数。

示例：
HCURSOR hCursor;
// 载入Windows预定义的上箭头光标。
hCursor = AfxGetApp()->LoadStandardCursor(IDC_UPARROW);

请参阅：
CWinApp::LoadOEMCursor, CWinApp::LoadCursor, ::LoadCursor


 CWinApp::LoadStandardIcon

HICON LoadStandardIcon( LPCTSTR lpszIconName ) const;

返回值：如果成功，则返回图标的句柄；否则返回NULL。

参数：
lpszIconName指定了Windows的预定义图标的常量标识符。这些标识符在WINDOWS.H中定义。下面列出的是可能的取值和lpszIconName的含义：
· | IDI_APPLICATION | 缺省的应用程序图标
· | IDI_HAND | 手形图标，用于严重警告信息
· | IDI_QUESTION | 问号图标，用于提示信息
· | IDI_EXCLAMATION | 感叹号图标，用于警告信息
· | IDI_ASTERISK | 星号图标，用于通知消息

说明：
这个函数载入lpszIconName指定的Windows预定义图标。要访问Windows的预定义图标，应使用LoadStandardIcon或LoadOEMIcon成员函数。

请参阅：
CWinApp::LoadOEMIcon, CWinApp::LoadIcon, ::LoadIcon


 CWinApp::LoadStdProfileSettings

void LoadStdProfileSettings( UINT nMaxMRU = _AFX_MRU_COUNT );

参数：
nMaxMRU 保存的最近使用文件个数。

说明：
在InitInstance成员函数内部调用这个成员函数以允许并载入最近使用（MRU）文件列表和最后一次预览状态。如果nMaxMRU为0，则不维护MRU列表。

请参阅：
CWinApp::OnFileOpen, CWinApp::AddToRecentFileList


 CWinApp::OnContextHelp

afx_msg void OnContextHelp( );

说明：
你必须在CWinApp类的消息映射中加入
ON_COMMAND( ID_CONTEXT_HELP, OnContextHelp )语句，同时加入加速键表入口，通常是SHIFT+F1，以允许这个成员函数。
OnContextHelp使应用程序进入帮助模式。光标变为箭头和问号，用户可以移动鼠标指针，然后按下鼠标左键以选择对话框、窗口、菜单或命令按钮。这个成员函数获得光标下方对象的帮助上下文并据此调用Windows函数WinHelp。

请参阅：
CWinApp::OnHelp, CWinApp::WinHelp


 CWinApp::OnDDECommand

virtual BOOL OnDDECommand( LPTSTR lpszCommand );

返回值：如果处理了命令，则返回非零值；否则返回0。

参数：
lpszCommand 指向应用程序接收到的DDE命令字符串。

说明：
当主框架窗口接收到一个DDE执行消息时，框架就调用这个函数。缺省的实现检查此命令是否申请打开一个文档，如果是，则打开指定的文档。通常当用户双击一个数据文件的时候，Windows的文件管理器就发送这样的DDE命令字符串。如果要处理其它的DDE执行命令，如打印命令，则应重载此函数。

示例：
BOOL CMyApp::OnDDECommand(LPTSTR lpszCommand)
{
if (CWinApp::OnDDECommand(lpszCommand)) return TRUE;
// 处理应用程序能识别的任何DDE命令名返回TRUE。
// 分析DDE命令字符串的例子参见CWinApp::OnDDECommand的实现
// 对于不能处理的DDE命令，返回FALSE。
return FALSE;
}

请参阅：
CWinApp::EnableShellOpen


 CWinApp::OnFileNew

afx_msg void OnFileNew( );

说明：
你必须在CWinApp类的消息映射中加入以下语句：
ON_COMMAND( ID_FILE_NEW, OnFileNew )
以允许这个成员函数。
如果允许这个成员函数，则这个函数将处理File New命令。
有关此函数的缺省动作以及替换这个成员函数的方法参见技术注释22。

示例：
// 下面的消息映射是AppWizard生成的，将File New，Open和Print Setup菜单命令映射到框架中这些命令的缺省实现。
BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
//{{AFX_MSG_MAP(CMyApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// 标准的基于文件的文档命令
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// 标准的打印设置命令
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
// 下面的消息映射演示了如何将
// File New，Open和Print Setup菜单命令重定向到
// 你的CWinApp派生类中实现的处理函数。你可以
// 使用ClassWizard来绑定这些命令，如下面所演示的，
// 因为消息映射入口用//{{AFX_MSG_MAP和//}}AFX_MSG_MAP
// 括起来。注意，如果需要，你可以将处理函数命名为
// CMyApp::OnFileNew，而不是CMyApp::OnMyFileNew，其它处理函数类似。
BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
//{{AFX_MSG_MAP(CMyApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
ON_COMMAND(ID_FILE_NEW, OnMyFileNew)
ON_COMMAND(ID_FILE_OPEN, OnMyFileOpen)
ON_COMMAND(ID_FILE_PRINT_SETUP, OnMyFilePrintSetup)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

请参阅：
CWinApp::OnFileOpen


 CWinApp::OnFileOpen

afx_msg void OnFileOpen( );

说明：
你必须在CWinApp类的消息映射中加入以下语句：
ON_COMMAND( ID_FILE_OPEN, OnFileOpen )
以允许这个成员函数。
如果允许这个成员函数，它将处理File Open命令。
有关此函数的缺省动作以及替换这个成员函数的方法参见技术注释22。

示例：
// 下面的消息映射是AppWizard生成的，将
// File New，Open和Print Setup菜单命令
// 映射到框架中这些命令的缺省实现。
BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
//{{AFX_MSG_MAP(CMyApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// 标准的基于文件的文档命令
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// 标准的打印设置命令
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
// 下面的消息映射演示了如何将
// File New，Open和Print Setup菜单命令重定向到
// 你的CWinApp派生类中实现的处理函数。你可以
// 使用ClassWizard来绑定这些命令，如下面所演示的，
// 因为消息映射入口用//{{AFX_MSG_MAP和//}}AFX_MSG_MAP
// 括起来。注意，如果需要，你可以将处理函数命名为
// CMyApp::OnFileNew，而不是CMyApp::OnMyFileNew，其它处理函数类似。
BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
//{{AFX_MSG_MAP(CMyApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
ON_COMMAND(ID_FILE_NEW, OnMyFileNew)
ON_COMMAND(ID_FILE_OPEN, OnMyFileOpen)
ON_COMMAND(ID_FILE_PRINT_SETUP, OnMyFilePrintSetup)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

请参阅：
CWinApp::OnFileNew


 CWinApp::OnFilePrintSetup

afx_msg void OnFilePrintSetup( );

说明：
你必须在CWinApp类的消息映射中加入以下语句：
ON_COMMAND( ID_FILE_PRINT_SETUP, OnFilePrintSetup )
以允许这个成员函数。
如果允许这个成员函数，它将处理File Print命令。
有关此函数的缺省动作以及替换这个成员函数的方法参见技术注释22。

示例：
// 下面的消息映射是AppWizard生成的，将
// File New，Open和Print Setup菜单命令
// 映射到框架中这些命令的缺省实现。
BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
//{{AFX_MSG_MAP(CMyApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
// NOTE - the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG_MAP
// 标准的基于文件的文档命令
ON_COMMAND(ID_FILE_NEW, CWinApp::OnFileNew)
ON_COMMAND(ID_FILE_OPEN, CWinApp::OnFileOpen)
// 标准的打印设置命令
ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp::OnFilePrintSetup)
END_MESSAGE_MAP()
// 下面的消息映射演示了如何将
// File New，Open和Print Setup菜单命令重定向到
// 你的CWinApp派生类中实现的处理函数。你可以
// 使用ClassWizard来绑定这些命令，如下面所演示的，
// 因为消息映射入口用//{{AFX_MSG_MAP和//}}AFX_MSG_MAP
// 括起来。注意，如果需要，你可以将处理函数命名为
// CMyApp::OnFileNew，而不是CMyApp::OnMyFileNew，其它处理函数类似。
BEGIN_MESSAGE_MAP(CMyApp, CWinApp)
//{{AFX_MSG_MAP(CMyApp)
ON_COMMAND(ID_APP_ABOUT, OnAppAbout)
ON_COMMAND(ID_FILE_NEW, OnMyFileNew)
ON_COMMAND(ID_FILE_OPEN, OnMyFileOpen)
ON_COMMAND(ID_FILE_PRINT_SETUP, OnMyFilePrintSetup)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

请参阅：
CWinApp::OnFileNew


 CWinApp::OnHelp

afx_msg void OnHelp( );

说明：
你必须在CWinApp类的消息映射中加入以下语句：
ON_COMMAND( ID_HELP, OnHelp )
以允许这个成员函数。通常你还将为F1键加入一个加速键入口。允许F1键只是一个惯例，并不是必须的。如果允许这个成员函数，当用户按下F1键的时候，框架就调用这个函数。这个消息处理函数的缺省实现确定对应当前窗口、对话框或菜单项的帮助上下文，然后调用WINHELP.EXE。如果当前没有可用的上下文，则使用缺省的上下文。
如果要为不是当前具有焦点的窗口、对话框、菜单项或工具条按钮的其它对象设置上下文，则应重载这个成员函数。使用所需的帮助上下文ID来调用WinHelp。

请参阅：
CWinApp::OnContextHelp, CWinApp::OnHelpUsing, CWinApp::OnHelpIndex, CWinApp::WinHelp


 CWinApp::OnHelpFinder

afx_msg void OnHelpFinder( );

说明：
你必须在CWinApp类的消息映射中加入以下语句：
ON_COMMAND( ID_HELP_FINDER, OnHelpFinder )
以允许这个成员函数。
如果允许这个成员函数，当应用程序的用户选择了Help Finder命令，用标准的HELP_FINDER主题激活了WinHelp时，框架就调用这个消息处理函数。

请参阅：
CWinApp::OnHelp, CWinApp::OnHelpUsing, CWinApp::WinHelp, CWinApp::OnHelpIndex


 CWinApp::OnHelpIndex

afx_msg void OnHelpIndex( );

说明：
你必须在CWinApp类的消息映射中加入以下语句：
ON_COMMAND( ID_HELP_INDEX, OnHelpIndex)
以允许这个成员函数。
如果允许这个成员函数，当应用程序的用户选择了Help Index命令，用标准的HELP_INDEX主题激活了WinHelp时，框架就调用这个消息处理函数。

请参阅：
CWinApp::OnHelp, CWinApp::OnHelpUsing, CWinApp::WinHelp


 CWinApp::OnHelpUsing

afx_msg void OnHelpUsing( );

说明：
你必须在CWinApp类的消息映射中加入以下语句：
ON_COMMAND( ID_HELP_USING, OnHelpUsing )
以允许这个成员函数。
如果允许这个成员函数，当应用程序的用户选择了Help Using命令，用标准的HELP_HELPONHELP主题激活了WinHelp时，框架就调用这个消息处理函数。

请参阅：
CWinApp::OnHelp, CWinApp::OnHelpIndex, CWinApp::WinHelp


 CWinApp::OnIdle

virtual BOOL OnIdle( LONG lCount );

返回值：如果要接收更多的空闲处理时间，则返回非零值；如果不需要更多的空闲时间则返回0。

参数：
lCount 该参数是一个计数值，当应用程序的消息队列为空，OnIdle函数被调用时，该计数值就增加1。每当一条新消息被处理时，该计数值就被复位为0。你可以使用lCount参数来确定应用程序不处理消息时空闲时间的相对长度。

说明：
如果要执行空闲时处理，则重载这个成员函数。当应用程序的消息队列为空时，OnIdle就在缺省的消息循环中被调用。你可以用重载函数来调用自己的后台空闲处理任务。
OnIdle应返回0以表明不需要更多的空闲处理时间。当消息队列为空时，OnIdle每被调用一次lCount参数就增加，而每处理一条新消息lCount就被复位为0。你可以根据这个计数值调用不同的空闲处理例程。
下面总结了空闲循环处理：
1. | 如果微软基础类库中的消息循环检查消息队列并发现没有未被处理的消息，它就为应用程序对象调用OnIdle函数，并将lCount参数设为0。
2. | OnIdle执行一些处理，然后返回一个非零值，表示它还需要被调用，以进行进一步处理。
3. | 消息循环再次检查消息队列。如果没有未处理的消息，则再次调用OnIdle，增加lCount参数。
4. | 最后，OnIdle结束所有的空闲任务并返回0。这就告诉消息循环停止调用OnIdle直到在消息队列中接收到下一条消息为止，在那时，空闲循环将重新启动，而参数被设为0。
因为只有在OnIdle返回之后应用程序才能处理用户输入，因此在OnIdle中不应进行较长的任务。

注意：
OnIdle的缺省实现更新命令用户接口对象，如菜单项和工具条等，还实现了内部数据结构的清理。因此，如果你重载了OnIdle，你必须用重载版本中使用的lCount值来调用CWinApp::OnIdle。首先调用所有基类的空闲处理（即直到基类的OnIdle返回0）。如果你需要在基类处理完成之前进行一些工作，则应回顾基类的实现以在自己的工作期间选择一个合适的lCount值。

示例：
下面的两个例子演示了OnIdle的用法。

第一个例子处理两个空闲任务，用lCount参数来排列这些任务的优先权。第一个任务优先权较高，一旦可能你就应当执行此任务。第二个任务不十分重要，只有当用户输入有一个较长时间的间歇的时候才应执行此任务。注意其中对基类的OnIdle的调用。第二个例子管理着一组具有不同优先权的空闲任务。
BOOL CMyApp::OnIdle(LONG lCount)
{
BOOL bMore = CWinApp::OnIdle(lCount);
if (lCount == 0)
{
TRACE("App idle for short period of time\n");
bMore = TRUE;
}

else if (lCount == 10)
{
TRACE("App idle for longer amount of time\n");
bMore = TRUE;
}

else if (lCount == 100)
{
TRACE("App idle for even longer amount of time\n");
bMore = TRUE;
}

else if (lCount == 1000)
{
TRACE("App idle for quite a long period of time\n");
// bMore 没有被设为TRUE, 不在需要空闲
// 重要：bMore 没有被设为 FALSE，因为 CWinApp::OnIdle可能还有其它空闲任务要完成。
}
return bMore; // 返回TRUE，只要还有其它空闲任务
}

第二个示例：
// 在这个例子中，有四个空闲循环任务，它们被赋予
// 不同的优先权，运行的机会不同：
// Task1在空闲时总能运行，要求在框架处理它自己的空闲循环任务时没有消息在等候。（lCount为0或1）
// Task2 仅当Task1以及运行时才能运行，要求当Task1运行时没有消息在等候。
// Task3和Task4仅当Task1和Task2都运行之后才能运行，
// 并且在此期间没有消息在等候。如果Task3能够运行，
// 则Task4总是在Task3之后立即运行。
BOOL CMyApp::OnIdle(LONG lCount)
{
// 在这个例子中，像多数应用程序一样，你应该让基类
// 的CWinApp::OnIdle在你试图进行任何附加的空闲循环
// 过程之前完成它的处理。
if (CWinApp::OnIdle(lCount)) return TRUE;
// 基类的CWinApp::OnIdle为lCount保留0和1给框架自己的
// 空闲处理使用。如果你希望与框架平等地共享空闲处理
// 时间，则应替换上面的if语句，直接调用CWinApp::OnIdle，
// 然后为lCount的值0和/或1加入一个case语句。首先应当研
// 究基类的实现以理解你的空闲循环任务将会如何与框架的
// 空闲循环处理竞争。
switch (lCount)
{
case 2:
Task1();
return TRUE; // 下一次给 Task2 一个机会
case 3:
Task2();
return TRUE; // 下一次给Task3和Task4一个机会
case 4:
Task3();
Task4();
return FALSE; // 再次回到空闲循环任务
}
return FALSE;
}


 CWinApp::OpenDocumentFile

virtual CDocument* OpenDocumentFile( LPCTSTR lpszFileName );

返回值：如果成功，则返回指向CDocument对象的指针；否则返回NULL。

参数：
lpszFileName 要打开的文件的名字。

说明：
框架调用这个成员函数为应用程序打开指定名字的CDocument文件。如果具有该名字的文档已经被打开了，则包含这个文档的第一个框架窗口将被激活。如果应用程序支持多文档模板，则框架使用文件扩展名查找适当的文档模板，试图载入此文档。如果成功，则文档模板为该文档创建一个框架窗口和视。

示例：
BOOL CMyApp::InitInstance()
{
// ...
if (m_lpCmdLine[0] == '\0')
{
// 创建一个新（空的）文档
OnFileNew();
}

else
{
// 打开作为第一个命令行参数传递的文件
OpenDocumentFile(m_lpCmdLine);
}
// ...
}


 CWinApp::ParseCommandLine

void ParseCommandLine( CCommandLineInfo& rCmdInfo );

参数：
rCmdInfo 对CCommandLineInfo对象的引用。

说明：
调用这个函数以解析命令行并将参数发送到CCommandLineInfo::ParseParam，每次一个。
当你通过AppWizard开始一个新的MFC项目时，AppWizard将会创建一个Ccommand-LineInfo的本地实例，然后在InitInstance成员函数中调用ProcessShellCommand 和 ParseCommandLine。命令行的过程描述如下：
1.在InitInstance中被创建之后，CCommandLineInfo对象被传递给ParseCommandLine。
2.随后ParseCommandLine反复调用CCommandLineInfo::ParseParam，每次解析出一个参数。
3.ParseParam填充CCommandLineInfo对象，随后该对象被传递给ProcessShellCommand。
4.ProcessShellCommand处理命令行参数和标志。
注意：
如果需要的话，你可以直接调用ParseCommandLine。
有关命令行标志的描述参见CCommandLineInfo::m_nShellCommand。

请参阅：
CCommandLineInfo, CWinApp::InitInstance, CCommandLineInfo::ParseParam, CWinApp::ProcessShellCommand, CCommandLineInfo::m_nShellCommand


 CWinApp::PreTranslateMessage

virtual BOOL PreTranslateMessage( MSG* pMsg );

返回值
如果消息在PreTranslateMessage中被完全处理并且不需要进一步处理，则返回非零值。如果消息还需要按照通常方式处理，则返回零。

参数：
pMsg 指向一个MSG结构的指针，其中包含了要处理的消息。

说明：
如果要在消息被分派到Windows函数TranslateMessage和DispatchMessage之前过滤窗口消息，则应重载这个函数。缺省的实现执行加速键的转换，因此你可以在重载函数中调用CWinApp::PreTranslateMessage成员函数。

请参阅：
::DispatchMessage, ::TranslateMessage


 CWinApp::ProcessMessageFilter

virtual BOOL ProcessMessageFilter( int code, LPMSG lpMsg );

返回值：如果消息被处理，则返回非零值；否则返回0。

参数：
code | 指定了钩子代码。这个成员函数使用这些代码以确定如何处理lpMsg。
lpMsg | 指向一个Windows的MSG结构的指针。

说明：
框架的钩子函数调用这个成员函数以过滤和响应特定的Windows消息。钩子函数在事件被发送到应用程序的正常消息处理过程之前处理这些事件。如果你重载了这个高级特性，确保你调用了基类版本以维护框架的钩子处理。

请参阅：MessageProc, WH_MSGFILTER


 CWinApp::ProcessShellCommand

BOOL ProcessShellCommand( CCommandLineInfo& rCmdInfo );

返回值：如果成功地处理了外壳命令，则返回非零值。如果InitInstance返回了FALSE，则返回0。

参数：
rCmdInfo 对CCommandLineInfo对象的引用。

说明：
这个成员函数被InitInstance调用，用以接收rCmdInfo所标识的CCommandLineInfo对象传递的参数，并执行指定的动作。
当你通过AppWizard开始一个MFC的新项目时，AppWizard将创建CCommandLineInfo的一个本地实例，然后在InitInstance成员函数中调用ProcessShellCommand和ParseCommandLine。命令行按照下面描述的路线传递：
1.在InitInstance中被创建以后，CCommandLineInfo对象将它传递给ParseCommand-Line。
2.随后ParseCommandLine反复调用CCommandLineInfo::ParseParam，每次解析一个参数。
3.ParseParam填充CCommandLineInfo对象，然后将之传递给ProcessShellCommand。
4.ProcessShellCommand处理命令行参数和标志。
CCommandLineInfo对象中用CCommandLineInfo::m_nShellCommand标识的数据成员属于下面的枚举类型，它在CCommandLineInfo类中定义。
enum{ FileNew,FileOpen,FilePrint,FilePrintTo,FileDDE,};
有关这些值的简要描述参见CCommandLineInfo::m_nShellCommand。

请参阅：
CWinApp::ParseCommandLine, CCommandLineInfo, CCommandLineInfo::ParseParam, CCommandLineInfo::m_nShellCommand


 CWinApp::ProcessWndProcException

virtual LRESULT ProcessWndProcException( CException* e, const MSG* pMsg );

返回值
这个返回值必须返回给Windows。通常，对于Windows消息，返回值为0L，对于命令消息，返回值为1L（TRUE）。

参数：
e 指向没有被捕获的异常。 tr valign=top> pMsg 一个MSG结构，其中包含了有关导致框架出现异常的Windows消息的信息。

说明：
每当应用程序不能捕获应用程序的消息处理函数或命令处理函数出现的异常时，框架就调用这个成员函数。不要直接调用这个函数。
这个成员函数的缺省实现创建一个消息框。如果这个未被捕获的异常源于一条菜单、工具条或加速键命令失败，则消息框显示一条“Command failed”消息；否则，显示一条“Internal application error”消息。
如果要为异常提供全局处理，则应重载这个成员函数。若你需要显示该消息框，则应调用基类的函数。

请参阅：
CWnd::WindowProc, CException


 CWinApp::RegisterShellFileTypes

void RegisterShellFileTypes( BOOL bCompat = FALSE );

参数：
bCompat 如果为TRUE，则为外壳命令Print和Print To加入注册表入口，使用户能够从外壳直接打印文件，或者是将文件拖动到打印机对象上。同时它也加入一个DefaultIcon键。缺省情况下，为了向后的兼容性，这个参数为FALSE。

说明：
调用这个函数在Windows的文件管理器中注册应用程序的所有文档类型。这就使用户能够通过在文件管理器内双击而打开应用程序创建的数据文件。对于应用程序中的每个文档模板，在调用AddDocTemplate之后调用RegisterShellFileTypes。当你调用RegisterShellFile- Types的时候，同时也调用EnableShellOpen成员函数。
RegisterShellFileTypes在应用程序维护的CDocTemplate对象列表中反复，并且，对于每个文档模板，在Windows维护的注册表数据库中加入入口。当用户双击文件的时候，文件管理器利用这个入口打开数据文件。这减小了随应用程序发放.REG文件的必要性。
如果注册表数据库中已经将指定的文件扩展名与其它文件类型相关联了，则不会创建新的关联。有关注册信息时所用的字符串格式，请参见CDocTemplate类。

请参阅：
CDocTemplate, CWinApp::EnableShellOpen, CWinApp::AddDocTemplate


 CWinApp::Run

virtual int Run( );

返回值：WinMain返回的整数值。

说明：
这个函数提供了缺省的消息循环。Run函数接收并分派Windows消息，直到应用程序接收到一个WM_QUIT消息。如果应用程序的消息队列当前不包含任何消息，Run就调用OnIdle以执行空闲时处理。接收到的消息先进入PreTranslateMessage成员函数以进行特殊处理，然后发送到Windows函数TranslateMessage，进行标志的键盘转换，最后，调用Windows函数DispatchMessage。
Run很少被重载，但是你也可以重载它以提供特殊的功能。

请参阅：
CWinApp::PreTranslateMessage, M_QUIT, ::DispatchMessage, ::TranslateMessage


 CWinApp::RunAutomated

BOOL RunAutomated( );

返回值：如果找到了该选项，则返回非零值；否则返回0。

说明：
调用这个函数以确定是否出现了“/Automation”或“-Automation”选项，这表明服务器程序是否是由客户应用程序启动的。如果有，则从命令行中清除这个选项。有关OLE自动化的更多信息，参见“Visual C++ 程序员指南”中的“自动化服务器”。

请参阅：
CWinApp::RunEmbedded


 CWinApp::RunEmbedded

BOOL RunEmbedded( );

返回值：如果发现了这个选项，则返回非零值；否则返回0。

说明：
调用这个选项以确定是否出现了“/Embedding”或“-Embedding”选项，这表明服务器应用程序是否是由客户应用程序启动的。如果有，则从命令行中清除这个选项。有关嵌入的更多信息，参见“Visual C++ 程序员指南”中的“服务器：实现服务器”。

请参阅：
CWinApp::RunAutomated


 CWinApp::SaveAllModified

virtual BOOL SaveAllModified( );

返回值：如果能够安全地结束应用程序，则返回非零值；如果不安全，则返回0。

说明：
当应用程序的主框架窗口要被关闭时，或者接收到WM_QUERYENDSESSION消息时，框架调用这个函数以保存所有的文档。
这个成员函数的缺省实现为应用程序中所有被修改的文档调用CDocument::SaveModified成员函数。


 CWinApp::SelectPrinter

void SelectPrinter( HANDLE hDevNames, HANDLE hDevMode, BOOL bFreeOld =TRUE );

参数：
hDevNames | 指向DEVNAMES结构的句柄，标识了指定打印机的驱动程序、设备和输出端口名。
hDevMode | 指向DEVMODE结构的句柄，指定了有关设备初始化和打印机环境的信息。
bFreeOld | 释放以前选择的打印机。

说明：
调用这个成员函数以选择指定的打印机，并释放先前在Print对话框中选择的打印机。
如果hDevMode和hDevNames都是NULL，则SelectPrinter使用当前的缺省打印机。

请参阅：
CPrintDialog, DEVMODE, DEVNAMES


 CWinApp::SetDialogBkColor

void SetDialogBkColor( COLORREF clrCtlBk = RGB(192, 192, 192), COLORREFclrCtlText = RGB(0, 0, 0) );

参数：
clrCtlBk | 应用程序的对话框的背景颜色。
clrCtlText | 应用程序的对话框控件的颜色。

说明：
在InitInstance成员函数内调用这个成员函数以设置应用程序中对话框和消息框的缺省背景色和文本颜色。

示例：
BOOL CMyApp::InitInstance()
{
// 标准的初始化
SetDialogBkColor(); // 将对话框背景颜色设为灰
LoadStdProfileSettings(); // 载入标准的INI文件选项（包括MRU）
// ...
}


 CWinApp::SetRegistryKey

void SetRegistryKey( LPCTSTR lpszRegistryKey );
void SetRegistryKey( UINT nIDRegistryKey );

参数：
lpszRegistryKey | 字符串指针，包含了键的名字。
nIDRegistryKey | 注册表中键的ID/索引。

说明：
这个函数将应用程序的设置保存在注册表而不是INI文件中。这个函数设置m_pszRegistry Key，它被CWinApp的成员函数GetProfileInt，GetProfileString，WriteProfileInt和WriteProfileString使用。如果调用了这个函数，最近使用（MRU）的文件也被保存到注册表中。通常注册表的键为公司的名字。它保存在如下形式的键中：
HKEY_CURRENT_USER\Software\\\\.

请参阅：
CWinApp::InitInstance, CWinApp::GetProfileInt, CWinApp::GetProfileString, CWinApp::WriteProfileInt, CWinApp::WriteProfileString


 CWinApp::WinHelp

virtual void WinHelp( DWORD dwData, UINT nCmd = HELP_CONTEXT );

参数：
dwData | 指定了附加数据。这些值依赖于nCmd参数的值。
nCmd | 指定了请求的帮助类型。可能取值的列表以及它们影响dwData参数的方式参见Windows函数WinHelp。

说明：
调用这个函数以激活WinHelp应用程序。框架也会调用这个函数以激活WinHelp应用程序。
当你的应用程序终止时，框架会自动关闭WinHelp应用程序。

示例：
// 头文件： HELPIDS.H
//
// 这个例子的头文件被包含了两次：
// (1) 它被.CPP文件包含，将DWORD类型的上下文ID传递给CWinApp::WinHelp。
// (2) 它被包含在.HPJ文件中的[MAP]部分，将帮助上下文字符串“HID_MYTOPIC”与帮助上下文ID101关联起来。
// 帮助上下文字符串“HID_MYTOPIC”标识了帮助// 的.RTF源文件中的帮助主题，带有“#”脚注：
// # HID_MYTOPIC
//
// 没有必要用这种方式管理在RESOURCE.H文件中定义的与命令对象或用户界面对象相关的帮助主题的帮助上下文ID。
// 你可以使用MAKEHM工具，或者是AppWizard的上下文帮助选项所生成的MAKEHELP.BAT文件来为这些ID生成帮助映射（.HM）文件。
// 仅对那些不与命令对象或用户界面对象相关的帮助主题才有必要
// 按照这里演示的方式管理帮助上下文ID。
#define HID_MYTOPIC 101
// 显示了在帮助的.RTF文件中具有上下文字符串
// “HID_MYTOPIC”的自定义帮助主题，它被映
// 射到HELPIDS.H文件中的DWORD型ID值HID_MYTOPIC。
AfxGetApp()->WinHelp(HID_MYTOPIC);
// 下面是MAKEHM工具生成的帮助映射（.HM）文件
// 中的一行代码，随后它被AppWizard的上下文帮助
// 选项所生成的MAKEHELP.BAT文件所调用。
// MAKETM工具读出应用程序的RESOURCE.H文件中
// 的#define语句：
// #define ID_MYCOMMAND 0x08004
// 然后加上一个帮助ID的偏移量0x10000以创建帮助上
// 下文的DWORD值0x18004。有关帮助ID偏移量的更
// 多信息参见MFC的技术注释28。
HID_MYCOMMAND 0x18004
// 你很少需要利用帮助上下文ID为命令或用户界面对象
// 直接调用WinHelp。例如，当焦点位于My Command菜
// 单项上时，如果用户按下F1键，框架就会自动调用WinHelp。
// 但是，如果你想要为与命令相关的帮助主题直接调用WinHelp，
// 下面是调用的方法：
AfxGetApp()->WinHelp(0x10000 + ID_MYCOMMAND);

请参阅：
CWinApp::OnContextHelp, CWinApp::OnHelpUsing, CWinApp::OnHelp, CWinApp::OnHelpIndex, ::WinHelp


 CWinApp::WriteProfileInt

BOOL WriteProfileInt( LPCTSTR lpszSection, LPCTSTR lpszEntry, int nValue );

返回值：如果成功，则返回非零值；否则返回0。

参数：
lpszSection | 指向一个以null结尾的字符串，指定了包含入口的部分。如果这个部分不存在，就创建它。这个部分的名字对大小写不敏感，字符串可以是大写字符和小写字符的任意组合。
lpszEntry | 指向一个以null结尾的字符串，指定了包含要写入值的入口的部分。如果在指定的部分中不存在这个入口，就创建它。
nValue | 包含了要写入的值。

说明：
调用这个成员函数以把指定的值写入应用程序的注册表或INI文件的指定部分。这些入口按如下方式保存：
·在Windows NT中，该值被保存在注册表中。
·在Windows 3.X中，该值被保存在WIN.INI文件中。
·在Windows 95中，该值被保存在WIN.INI的缓存版本中。

示例：
CString strSection = "My Section";
CString strStringItem = "My String Item";
CString strIntItem = "My Int Item";
CWinApp* pApp = AfxGetApp();
pApp->WriteProfileString(strSection, strStringItem, "test");
CString strValue;
strValue = pApp->GetProfileString(strSection, strStringItem);
ASSERT(strValue == "test");
pApp->WriteProfileInt(strSection, strIntItem, 1234);
int nValue;
nValue = pApp->GetProfileInt(strSection, strIntItem, 0);
ASSERT(nValue == 1234);

请参阅：
CWinApp::GetProfileInt, CWinApp::WriteProfileString


 CWinApp::WriteProfileString

BOOL WriteProfileString( LPCTSTR lpszSection, LPCTSTR lpszEntry, LPCTSTRlpszValue );

返回值：如果成功，则返回非零值；否则返回0。

参数：
lpszSection | 指向一个以null结尾的字符串，指定了包含入口的部分。如果这个部分不存在，就创建它。这个部分的名字对大小写不敏感，字符串可以是大写字符和小写字符的任意组合。
lpszEntry | 指向一个以null结尾的字符串，指定了包含要写入值的入口的部分。如果在指定的部分中不存在这个入口，就创建它。
lpszValue | 指向要写入的字符串。如果这个参数为NULL，则将删除lpszEntry指定的键。

说明：
调用这个函数将指定的字符串写入应用程序的注册表或INI文件的指定部分。
这些入口按如下方式保存：
·在Windows NT中，该值被保存在注册表中。
·在Windows 3.x中，该值被保存在WIN.INI文件中。
·在Windows 95中，该值被保存在WIN.INI的缓存版本中。

示例：
CString strSection = "My Section";
CString strStringItem = "My String Item";
CString strIntItem = "My Int Item";
CWinApp* pApp = AfxGetApp();
pApp->WriteProfileString(strSection, strStringItem, "test");
CString strValue;
strValue = pApp->GetProfileString(strSection, strStringItem);
ASSERT(strValue == "test");
pApp->WriteProfileInt(strSection, strIntItem, 1234);
int nValue;
nValue = pApp->GetProfileInt(strSection, strIntItem, 0);
ASSERT(nValue == 1234);

请参阅：
CWinApp::GetProfileString, CWinApp::WriteProfileInt, ::WritePrivateProfileStringCWinApp::SetRegistryKey


 CWinApp::m_bHelpMode

说明：
如果应用程序处于帮助上下文模式（通常由SHIFT+F1激活），则为TRUE，否则为FALSE。在帮助上下文模式中，光标变为问号，用户可以在屏幕上移动它。如果你希望在帮助模式下实现特殊处理，则检查这个标志。m_bHelpMode是BOOL类型的公有变量。


 CWinApp::m_hInstance

说明：
对应Windows传递给WinMain的hInstance参数。m_hInstance数据成员是指向运行在Windows环境中的应用程序当前实例的句柄。它是由全局函数AfxGetInstanceHandle返回的。m_hInstance是HINSTANCE类型的公有变量。

示例：
// 通常你不用直接把应用程序的hInstance传递给
// Windows的API，因为等效的MFC成员函数传递
// 了hInstance。下面的例子不太典型。
HCURSOR hCursor;hCursor = ::LoadCursor(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDC_MYCURSOR));
// 获得应用程序的hInstance的更直接的方式是调用AfxGetInstanceHandle：
hCursor = ::LoadCursor(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDC_MYCURSOR));
// 如果你在载入资源的时候需要hInstance，最好
// 调用AfxGetResourceHandle，而不是AfxGetInstanceHandle。
hCursor = ::LoadCursor(AfxGetResourceHandle(), MAKEINTRESOURCE(IDC_MYCURSOR));
// 载入光标资源的更好方式是调用CWinApp::LoadCursor
hCursor = AfxGetApp()->LoadCursor(IDC_MYCURSOR);


 CWinApp::m_hPrevInstance

说明：
对应于Windows传递给WinMain的hPrevInstance参数。
在Win32应用程序中，m_hPrevInstance数据成员总是被设为NULL。如果要找到应用程序的先前实例，则应使用CWnd::FindWindow。


 CWinApp::m_lpCmdLine

说明：
对应于Windows传递给WinMain的lpCmdLine参数。指向一个以null结尾的字符串，指定了应用程序的命令行。用m_lpCmdLine可以访问当应用程序启动时用户输入的命令行参数。m_lpCmdLine是LPSTR类型的公有变量。

示例：
BOOL CMyApp::InitInstance()
{
// ...
if (m_lpCmdLine[0] == '\0')
{
// 创建一个新（空的）文档
OnFileNew();
}
else
{
// 打开作为第一个命令行参数传递的文件
OpenDocumentFile(m_lpCmdLine);
}
// ...
}


 CWinApp::m_nCmdShow

说明：
对应于Windows传递给WinMain的nCmdShow参数。当你为应用程序的主窗口调用CWnd::ShowWindow函数的时候，可以将m_nCmdShow作为参数传递。m_nCmdShow是int类型的公有变量。

示例：
BOOL CMyApp::InitInstance()
{
// ...
// 创建MDI主框架窗口
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME)) return FALSE;
// 保存主框架窗口的指针。这是框架识别主框架窗口的唯一途径。
m_pMainWnd = pMainFrame;
// 根据nCmdShow参数显示主窗口，这个参数是当应用
// 程序第一次启动的时候传递给它的。
pMainFrame->ShowWindow(m_nCmdShow);
pMainFrame->UpdateWindow();
// ...
}


 CWinApp::m_pActiveWnd

说明：
利用这个数据成员来保存OLE容器应用程序的主窗口指针，它使你的OLE服务器应用程序能够现场激活。如果这个数据成员为NULL，则应用程序不能被现场激活。
当框架窗口被OLE容器应用程序现场激活时，框架就设置这个成员变量。

请参阅：
AfxGetMainWnd, CWinThread::m_pMainWnd


 CWinApp::m_pszAppName

说明：
指定应用程序的名字。应用程序可以从传递给CWinApp的构造函数的参数中得到，如果其中没有指定名字，则是ID为AFX_IDS_APP_TITLE的资源字符串。如果在资源中找不到应用程序的名字，那么它来自程序的可执行文件名。全局函数AfxGetAppName返回该值。m_pszAppName是const char* 类型的公有变量。
注意：
如果你为m_pszAppName分配了一个值，它必须是在堆中动态分配的。CWinApp的析构函数利用这个指针调用free( )。你可以使用运行库函数_tcsdup( )来分配内存。同时，在为它分配一个新值之前，先释放与当前指针相关的内存。例如：
// 首先释放在CWinApp启动的时候MFC分配的字符串
// 字符串是在调用InitInstance之前分配的
free((void*)m_pszAppName);
// 改变应用程序文件的名字
// CWinApp的析构函数将释放内存
m_pszAppName=_tcsdup(_T("d:\\somedir\\myapp.exe"));

示例：
CWnd* pWnd;
// 将pWnd设为某个CWnd对象的指针，它的窗口已经创建了。
// 后面对CWnd::MessageBox的调用使用应用
// 程序的名字作为消息框的标题。
pWnd->MessageBox("Some message", AfxGetApp()->m_pszAppName);
// 获得应用程序名字的更直接的方式是调用AfxGetAppName
pWnd->MessageBox("Some message", AfxGetAppName());
// 用应用程序的名字作为消息框标题来显示消息框
// 的更简单的方式是调用AfxMessageBox。
AfxMessageBox("Some message");


 CWinApp::m_pszExeName

说明：
该变量包含了应用程序的可执行文件名，不包括扩展名。与m_pszAppName不同，这个名字中不包含空白。m_pszExeName是const char* 类型的公有变量。
注意
如果你为m_pszExeName分配了一个值，它必须是在堆中动态分配的。CWinApp的析构函数利用这个指针调用free( )。你可以使用运行库函数_tcsDup( )来分配内存。同时，在为它分配一个新值之前，先释放与当前指针相关的内存。例如：
// 首先释放在CWinApp启动的时候MFC分配的字符串
// 字符串是在调用InitInstance之前分配的
free((void*)m_pszExeName);
// 改变.EXE文件的名字
// CWinApp的析构函数将释放内存
m_pszExeName=_tcsdup(_T("d:\\somedir\\myapp"));


 CWinApp::m_pszHelpFilePath

说明：
包含了应用程序的帮助文件的路径。在缺省情况下，框架将m_pszHelpFilePath初始化为应用程序的名字，并加上“.HLP”。如果要改变帮助文件的名字，则应将m_pszHelpFilePath设为包含所需的帮助文件的完整名字的字符串。完成这个操作的合适的位置是在应用程序的InitInstance函数中。m_pszHelpFilePath是const char*类型的公有变量。
注意
如果你为m_pszHelpFilePath分配了一个值，它必须是在堆中动态分配的。CWinApp的析构函数利用这个指针调用free( )。你可以使用运行库函数_tcsDup( )来分配内存。同时，在为它分配一个新值之前，先释放与当前指针相关的内存。例如：
// 首先释放在CWinApp启动的时候MFC分配的字符串
// 字符串是在调用InitInstance之前分配的
free((void*)m_pszHelpFilePath);
// 改变.HLP文件的名字
// CWinApp的析构函数将释放内存
m_pszHelpFilePath=_tcsdup(_T("d:\\somedir\\myapp.hlp"));


 CWinApp::m_pszProfileName

说明：
包含了应用程序的.INI文件的名字。m_pszProfileName是const char* 类型的公有变量。
注意
如果你为m_pszProfileName分配了一个值，它必须是在堆中动态分配的。CWinApp的析构函数利用这个指针调用free( )。你可以使用运行库函数_tcsDup( )来分配内存。同时，在为它分配一个新值之前，先释放与当前指针相关的内存。例如：
// 首先释放在CWinApp启动的时候MFC分配的字符串
// 字符串是在调用InitInstance之前分配的
free((void*)m_pszProfileName);
// 改变.INI文件的名字
// CWinApp的析构函数将释放内存
m_pszProfileName=_tcsdup(_T("d:\\somedir\\myini.ini"));

请参阅：
CWinApp::GetProfileString, CWinApp::GetProfileInt, CWinApp::WriteProfileInt, CWinApp::WriteProfileString


 CWinApp::m_pszRegistryKey

LPCTSTR m_pszRegistryKey;

说明：
用于确定应用程序的配置信息保存在注册表或INI文件的什么位置。通常，这个数据成员被当作是只读的。
注册表入口按如下方式保存：
· | 在Windows NT中，该值被保存在注册表中。应用程序配置的名字被加在下述注册表键的后面：HKEY_CURRENT_USER/SoftWare/LocalAppWizard-Generated/
· | 在Windows 3.x中，该值被保存在INI文件中。
· | 在Windows 95中，该值被保存在INI文件的缓存版本。
如果你为m_pszRegistryKey分配了一个值，它必须是在堆中动态分配的。CWinApp的析构函数利用这个指针调用free( )。你可以使用运行库函数_tcsDup( )来分配内存。同时，在为它分配一个新值之前，先释放与当前指针相关的内存。
例如：
// 首先释放在CWinApp启动的时候MFC分配的字符串
// 字符串是在调用InitInstance之前分配的
free((void*)m_pszRegistryKey);
// 改变注册表键的名字
// CWinApp的析构函数将释放内存
m_pszRegistryKey=_tcsdup(_T("KEY_CURRENT_USER\\SoftWare\\mycompany\\myapp\\thissection\\this-value");

请参阅：CWinApp::SetRegistryKey


 CWindowDC

CObject
└CGdiObject
└CWindowDC

CWindowDC类是从CDC继承的。它在构造的时候调用Windows函数GetWindowDC，在销毁的时候调用ReleaseDC。这意味着CWindowDC对象可以访问CWnd的全部屏幕区域（包括客户区和非客户区）。
有关使用CWindowDC的更多信息参见“Visual C++ 程序员指南”中的“设备环境”。
#include <afxwin.h>

请参阅：CDC

CWindowDC类成员

Construction
CWindowDC 构造一个CWindowDC对象

Data Members
m_hWnd 与这个CWindowDC相关联的HWND句柄


 CWindowDC::CWindowDC

CWindowDC( CWnd* pWnd );
throw( CResourceException );

参数：
pWnd 窗口指针，设备环境对象将访问其客户区域。

说明：
构造一个CWindowDC对象，它可以访问pWnd指向的CWnd对象的整个屏幕区域（包括客户区和非客户区）。构造函数调用Windows函数GetWindowDC。
如果对Windows函数GetWindowDC的调用失败了，将出现异常（属于Cresource-Exception类型）。如果Windows已经分配了所有可用的设备环境，则可能不能访问设备环境。在Windows下，在任何给定时刻应用程序只能使用5个公共显示环境之一。

请参阅：CDC, CClientDC, CWnd


 CWindowDC::m_hWnd

说明：
CWnd指针的HWND句柄被用于构造CWindowDC对象。m_hWnd是HWND类型的保护变量。


 CWinThread

CObject
└CCmdTarget
└CWinThread

CWinThread对象代表在一个应用程序内运行的线程。运行的主线程通常由CWinApp的派生类提供；CWinApp由CWinThread派生。另外，CWinThread对象允许一给定的应用程序拥有多个线程。
CWinThread支持两种线程类型：工作者线程和用户界面线程。工作者线程没有收发消息的功能：例如，在电子表格应用程序中进行后台计算的线程。用户界面线程具有收发消息的功能，并处理从系统收到的消息。CWinApp及其派生类是用户界面线程的例子。其它用户界面线程也可由CWinThread直接派生。
CWinThread类的对象存在于线程的生存期。如果你希望改变这个特性，将m_bAutoDelete设为FALSE。
要使你的代码和MFC是完全线程安全的，CWinThread类是完全必要的。框架使用的用来维护与线程相关的信息的线程局部数据由CWinThread对象管理。
由于依赖CWinThread来处理线程局部数据，任何使用MFC的线程必须由MFC创建。例如，由运行时函数_beginthreadex创建的线程不能使用任何MFC API。
为了创建一个线程，调用AfxBeginThread函数。根据你需要工作者线程还是用户界面线程，有两种调用AfxBeginThread的格式。如果你需要用户界面线程，则将指向你的CWinThread派生类的CRuntimeClass的指针传递给AfxBeginThread。如果你需要创建工作者线程，则将指向控制函数的指针和控制函数的参数传递给AfxBeginThread。对于工作者线程和用户界面线程，你可以指定可选的参数来修改优先级，堆栈大小，创建标志和安全属性。
AfxBeginThread线程将返回指向新的CWinThread对象的指针。
与调用AfxBeginThread相反，你可以构造一个CWinThread派生类的对象，然后调用CreateThread。如果你需要在连续创建和终止线程的执行之间重复使用CWinThread对象，这种两步构造方法非常有用。
有关CWinThread的进一步信息，参见“Visual C++程序员指南”中的文章“用C++和MFC实现多线程”，“多线程：创建用户界面线程”，“多线程：创建工作者线程”和“多线程：如何使用同步”。
请参阅：CWinApp, CCmdTarget

CWinThread类成员

数据成员
m_bAutoDelete | 指定线程结束时是否要销毁对象
m_hThread | 当前线程的句柄
m_nThreadID | 当前线程的ID
m_pMainWnd | 保存指向应用程序的主窗口的指针
m_pActiveWnd | 指向容器应用程序的主窗口，当一个OLE服务器被现场激活时

构造函数
CWinThread | 构造一个CWinThread对象
CreateThread | 开始一个CWinThread对象的执行

操作
GetMainWnd | 查询指向线程主窗口的指针
GetThreadPriority | 获取当前线程的优先级
PostThreadMessage | 向另外的CWinThread对象传递一条消息
ResumeThread | 减少一个线程的挂起计数
SetThreadPriority | 设置当前线程的优先级
SuspendThread | 增加一个线程的挂起计数

可重载函数
ExitInstance | 重载以进行线程终止时的清理工作
InitInstance | 重载以实现线程实例的初始化
OnIdle | 重载以进行线程特定的空闲操作
PreTranslateMessage | 在消息被发送到Windows函数TranslateMessage和DispatchMessage之前过滤消息
IsIdleMessage | 检测特定的消息
ProcessWndProcException | 截获线程消息和命令处理函数出现的所有未处理的异常
ProcessMessageFilter | 在特定的消息到达应用程序之前截获消息
Run | 线程的具有消息收发功能的控制函数，可重载以定制缺省的消息循环


 CWinThread::CreateThread

BOOL CreateThread(DWORD dwCreateFlags = 0,
UINT nStackSize = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);

返回值：
若成功地创建了线程，返回值为非零；否则，返回值为0。

参数：
dwCreateFlags指定控制线程的创建的附加标志。该标志可以是下列两个值之一：
· | CREATE_SUSPENDED | 启动线程时将挂起计数置为一。直到调用ResumeThread线程才执行。
· | 0 | 创建后立即启动线程

nStackSize | 指定以字节数计的新线程的堆栈大小。如果为0，堆栈的大小缺省为与此过程的主线程的堆栈大小相同。
lpSecurityAttrs | 指向一个SECURITY_ATTRIBUTES结构，此结构指定线程的安全属性。

说明：
此成员函数创建一个在调用过程的地址空间中运行的线程。使用AfxBeginThread可以一步创建线程对象并运行之。如果你需要在连续创建和线程执行的终止之间重复使用线程对象，应使用CreateThread。

请参阅：
AfxBeginThread, CWinThread::CWinThread, ::CreateThread


 CWinThread::CWinThread

CWinThread( );

说明：
此函数构造一个CWinThread对象。要执行线程，请调用CreateThread成员函数。你通常通过调用AfxBeginThread来创建线程，AfxBeginThread将调用此构造函数和CreateThread函数。

请参阅：CWinThread::CreateThread


 CWinThread::ExitInstance

virtual int ExitInstance( );

返回值：
是线程的退出码；值为0表示没有错误，值大于0表示有错误发生。通过调用::GetExitCodeThread.可以查询到该值。

说明：
框架通过很少被重载的Run成员函数调用此函数以退出线程的这个实例；或者当调用InitInstance失败时，调用此函数。
除了在Run成员函数内之外，不得在任何地方调用此成员函数。此成员函数仅被用户界面线程使用。
当m_bAutoDelete为真时，此函数的缺省实现删除CWinThread对象。如果你希望当线程终止时执行额外的清除工作，请重载此函数。当你的程序代码被执行之后，你的ExitInstance实现应调用基类的ExitInstance函数。

请参阅：CWinApp::ExitInstance


 CWinThread::GetMainWnd

virtual CWnd* GetMainWnd( );

返回值：
此函数返回指向一个窗口的指针，这个窗口为两类窗口中的一种。如果你的线程是一个OLE服务器的一部分并且拥有一个位于活动容器中的现场激活的对象，此函数返回CWinThread对象的CWinApp::m_pActiveWnd数据成员。
如果没有位于容器中的现场激活的对象或者你的应用程序不是OLE服务器，此函数返回线程对象的m_pMainWnd数据成员。

说明：
如果你的应用程序为一个OLE服务器，调用此函数以得到应用程序的活动主窗口的指针，而不是直接引用应用程序对象的m_pmainWnd成员。对于用户界面线程，调用此函数等价于引用应用程序对象的m_pActiveWnd成员。
如果你的应用程序不是一个OLE服务器，则调用此函数等价于直接引用应用程序对象的m_pMainWnd成员。
重载此函数以修正缺省的行为。

请参阅：AfxGetMainWnd


 CWinThread::GetThreadPriority

int GetThreadPriority( );

返回值：
此函数返回当前线程在其优先级类中的优先级。此返回值应是下列从高到低列出的优先级值中的一个：
·THREAD_PRIORITY_TIME_CRITICAL
·THREAD_PRIORITY_HIGHEST
·THREAD_PRIORITY_ABOVE_NORMAL
·THREAD_PRIORITY_NORMAL
·THREAD_PRIORITY_BELOW_NORMAL
·THREAD_PRIORITY_LOWEST
·THREAD_PRIORITY_IDLE
关于这些优先级的进一步信息，参阅“Win32 SDK程序员参考大全”第4卷中的函数::SetThreadPriority。

说明：
此函数用于得到线程的当前线程优先级。

请参阅：
CWinThread::SetThreadPriority, ::GetThreadPriority


 CWinThread::InitInstance

virtual BOOL InitInstance( );

返回值：
若初始化成功，返回值为非零；不成功则返回0。

说明：
InitInstance必须被重载以初始化每个用户界面线程的新实例。统称，你重载InitInstance函数来执行当线程首次被创建时必须完成的任务。
此成员函数仅在用户界面线程中使用。工作者线程的初始化在传递给AfxBeginThread的控制函数中完成。

请参阅：CWinApp::InitInstance


 CWinThread::IsIdleMessage

virtual BOOL IsIdleMessage( MSG* pMsg );

返回值：
如果在处理消息之后调用了OnIdle，则返回非零值；否则返回0。

参数：
pMsg 指向当前被处理的消息。

说明：
如果避免在产生指定的消息以后调用OnIdle函数，则应重载这个函数。当产生重复的鼠标消息和闪烁光标消息之后，这个函数的缺省实现并不调用OnIdle。
如果应用程序创建了一个短的定时器，OnIdle将被频繁调用，导致性能上的问题。为了改善这种应用程序的性能，重载应用程序的CWinApp派生类中的IsIdleMessage消息，按照如下方式检测WM_TIMER消息：
BOOL CMyApp::IsIdleMessage( MSG* pMsg )
{
if (!CWinApp::IsIdleMessage(pMsg) || pMsg->message == WM_TIMER) return FALSE;
else return TRUE;
}
按照这种方式处理WM_TIMER消息可以改善那些使用短定时器的应用程序的性能。


 CWinThread::OnIdle

virtual BOOL OnIdle( LONG lCount );

返回值：
如果需要更多的空闲处理时间，则返回非零值；如果不需要，则返回0。

参数：
lCount 该参数是一个计数值，当应用程序的消息队列为空，OnIdle函数被调用时，该计数值就增加1。每当一条新消息被处理时，该计数值就被复位为0。你可以使用lCount参数来确定应用程序不处理消息时空闲时间的相对长度。

说明：
如果要执行空闲时处理，则重载这个成员函数。当应用程序的消息队列为空时，OnIdle就在缺省的消息循环中被调用。你可以用重载函数来调用自己的后台空闲处理任务。
OnIdle应返回0以表明不需要更多的空闲处理时间。当消息队列为空时，OnIdle每被调用一次lCount参数就增加，而每处理一条新消息lCount就被复位为0。你可以根据这个计数值调用不同的空闲处理例程。
这个成员函数的缺省实现从内存中释放临时对象和不用的动态链接库。
这个成员函数仅在用户界面线程中使用。
由于应用程序在OnIdle返回之后才能处理消息，因此不应在这个函数中执行较长的操作。

请参阅：CWinApp::OnIdle


 CWinThread::PostThreadMessage

BOOL PostThreadMessage( UINT message, WPARAM wParam, LPARAM lParam );

返回值：
如果成功，则返回非零值；否则返回0。

参数：
message | 用户自定义消息的ID。
wParam | 第一个消息参数。
lParam | 第二个消息参数。

说明：
调用这个函数以向其它CWinThread对象发送一个用户自定义消息。发送的消息通过消息映射宏ON_THREAD_MESSAGE被映射到适当的消息处理函数。

请参阅：ON_THREAD_MESSAGE


 CWinThread::PreTranslateMessage

virtual BOOL PreTranslateMessage( MSG *pMsg );

返回值：
如果消息在PreTranslateMessage中已经被完全处理，不需要再进一步处理，则返回非零值。如果消息需要按通常方式进一步处理，则返回零。

参数：
pMsg 指向包含了要处理的消息的MSG结构。

说明：
如果要在消息被分派到Windows函数::TranslateMessage和::DispatchMessage之前过滤Windows消息，则应重载这个函数。
这个函数仅在用户界面线程中使用。

请参阅：CWinApp::PreTranslateMessage


 CWinThread::ProcessMessageFilter

virtual BOOL ProcessMessageFilter( int code, LPMSG lpMsg );

返回值：
如果消息被处理了，则返回非零值；否则返回0。

参数：
code | 指定了钩子代码。这个成员函数使用这些代码来确定如何处理lpMsg。
lpMsg | 指向Windows的MSG结构的指针。

说明：
框架的钩子函数调用这个函数以过滤并响应特定的Windows函数。钩子函数在事件被发送到应用程序的正常消息处理机制之前处理这些事件。
如果你改变了这种高级特性，确保你调用了基类的相应函数以维持框架的钩子处理。

请参阅：MessageProc, WH_MSGFILTER


 CWinThread::ProcessWndProcException

virtual LRESULT ProcessWndProcException( CException* e, const MSG* pMsg );

返回值：
如果产生了一个WM_CREATE异常，则返回-1；否则返回0。

参数：
e | 指向没有被处理的异常。
pMsg | 指向一个MSG结构，其中包含了与导致框架出现异常的Windows消息有关的信息。

说明：
每当处理函数没有捕获你的线程消息或命令处理函数所抛出的异常时，框架就调用这个成员函数。
不要直接调用这个成员函数。
这个成员函数的缺省实现仅处理下列消息产生的异常：
命令 | 动作
WM_CREATE | 失败
WM_PAINT | 使涉及的窗口有效，防止产生另一个WM_PAINT消息
重载这个成员函数以提供对异常的全局处理。仅当你希望执行缺省的动作时才调用基类的函数。
这个成员函数仅在具有消息收发功能的线程中使用。

请参阅：CWinApp::ProcessWndProcException


 CWinThread::ResumeThread

DWORD ResumeThread( );

返回值：
如果成功，则返回线程的原挂起计数值；否则返回0xFFFFFFFF。如果返回值为零，则表示当前线程没有被挂起。如果返回值为1，线程被挂起，但是即将重新启动。任何大于1的返回值都表明线程将继续挂起。

说明：
调用这个函数以使被SuspendThread成员函数所挂起的线程恢复执行，或者使用CREATE_SUSPENDED标志创建的线程恢复执行。当前线程的挂起计数被减小1。如果挂起计数被减小到0，线程将恢复执行；否则线程继续被挂起。

请参阅：
CWinThread::SuspendThread, ::ResumeThread


 CWinThread::Run

virtual int Run( );

返回值：
线程返回的一个整数值。这个值可以通过调用::GetExitCodeThread来获得。

说明：
这个函数为用户界面线程提供了缺省的消息循环。Run接收并分派Windows消息，直到它接收到一个WM_QUIT消息。如果线程的当前消息队列中不包含消息，Run就调用OnIdle以执行空闲处理。接收到的消息被送到PreTranslateMessage成员函数以进行特殊处理，然后被发送到Windows函数::TranslateMessage以进行标志键盘转换。最后，调用Windows函数::DispatchMessage。
Run函数很少被重载，但是你可以重载它以提供特殊的功能。
这个成员函数仅在用户界面线程中使用。

请参阅：CWinApp::Run


 CWinThread::SetThreadPriority

BOOL SetThreadPriority( int nPriority );

返回值：
如果这个函数成功地执行，则返回非零值；否则返回0。

参数：
nPriority指定了线程在其优先权类中的新优先权级。这个参数必须是下列值之一，从最高优先权到最低：
·THREAD_PRIORITY_TIME_CRITICAL
·THREAD_PRIORITY_HIGHEST
·THREAD_PRIORITY_ABOVE_NORMAL
·THREAD_PRIORITY_NORMAL
·THREAD_PRIORITY_BELOW_NORMAL
·THREAD_PRIORITY_LOWEST
·THREAD_PRIORITY_IDLE
有关这些优先权的更多信息参见“Win32 SDK程序员参考”第四卷中的::SetThreadPriority。

说明：
这个函数设置当前线程在它所属的优先权类中的优先权级。它只能在CreateThread成功返回之后调用。

请参阅：
CWinThread::GetThreadPriority, ::SetThreadPriority


 CWinThread::SuspendThread

DWORD SuspendThread( );

返回值：
如果成功，则返回线程原来的挂起计数值；否则返回0xFFFFFFFF。

说明：
增加当前线程的挂起计数。如果线程的挂起计数大于零，则该线程将不被执行。线程可以通过调用ResumeThread成员函数恢复执行。

请参阅：
CWinThread::ResumeThread, ::SuspendThread


 CWinThread::m_bAutoDelete

说明：
指定当线程结束的时候，是否要自动删除CWinThread对象。m_bAutoDelete是BOOL类型的公有变量。


 CWinThread::m_hThread

说明：
与CWinThread相关联的线程的句柄。m_hThread数据成员是HANDLE类型的公有变量。它仅当线程存在时才有效。


 CWinThread::m_nThreadID

说明：
与CWndThread相关联的线程的句柄。m_nThreadID数据成员是DWORD类型的公有变量。它仅当线程存在时才有效。


 CWinThread::m_pActiveWnd

说明：
使用这个数据成员保存线程的当前活动窗口对象的指针。当m_pActiveWnd所代表的窗口被关闭时，微软基础类库将自动终止你的线程。如果该线程是应用程序的主线程，则应用程序将结束。如果这个数据成员为NULL，则应用程序的CWinApp对象的活动窗口将被继承。m_pActiveWnd是CWnd*类型的公有变量。
通常，你在重载InitInstance的时候设置这个成员变量。在工作者线程中，这个数据成员的值是从它的父线程中继承来的。

请参阅：
CWinThread::InitInstance, CWinThread::m_pMainWnd


 CWinThread::m_pMainWnd

说明：
使用这个数据成员来保存你的线程的主窗口对象的指针。当m_pMainWnd所代表的窗口被关闭时，微软基础类库将自动终止线程。如果该线程是应用程序的主线程，则应用程序将结束。如果这个数据成员为NULL，则应用程序的CWinApp对象的主窗口将被用来确定什么时候终止线程。m_pMainWnd是CWnd*类型的公有变量。
通常，你在重载InitInstance的时候设置这个成员变量。在工作者线程中，这个数据成员的值是从它的父线程继承的。

请参阅：CWinThread::InitInstance


 CWnd

CObject
└CCmdTarget
└CWnd

CWnd类提供了微软基础类库中所有窗口类的基本功能。
CWnd对象与Windows的窗口不同，但是两者有紧密联系。CWnd对象是由CWnd的构造函数和析构函数创建或销毁的。另一方面，Windows的窗口是Windows的一种内部数据结构，它是由CWnd的Create成员函数创建的，而由CWnd的虚拟析构函数销毁。DestroyWindow函数销毁Windows的窗口，但是不销毁对象。
CWnd类和消息映射机制隐藏了WndProc函数。接收到的Windows通知消息通过消息映射被自动发送到适当的CWnd OnMessage成员函数。你可以在派生类中重载OnMessage成员函数以处理成员的特定消息。
CWnd类同时还使你能够为应用程序创建Windows的子窗口。先从CWnd继承一个类，然后在派生类中加入成员变量以保存与你的应用程序有关的数据。在派生类中实现消息处理成员函数和消息映射，以指定当消息被发送到窗口时应该如何动作。
你可以经过两个步骤来创建一个子窗口。首先，调用构造函数CWnd以创建一个CWnd对象，然后调用Create成员函数以创建子窗口并将它连接到CWnd对象。
当用户关闭你的子窗口时，应销毁CWnd对象，或者调用DestroyWindow成员函数以清除窗口并销毁它的数据结构。
在微软基础类库中，从CWnd派生了许多其它类以提供特定的窗口类型。这些类中有许多，包括CFrameWnd,CMDIFrameWnd,CMDIChildWnd,CView和CDialog,被用来进一步派生。从CWnd派生的控件类，如CButton，可以被直接使用，也可以被进一步派生出其它类来。

#include <afxwin.h>

请参阅：CFrameWnd, CView

CWnd类的成员
初始化 | 对话框项函数 | 初始化消息处理函数
窗口状态函数 | 数据绑定函数 | 系统消息处理函数
窗口大小和位置 | 菜单函数 | 一般消息处理函数
窗口访问函数 | 工具提示函数 | 控件消息处理函数
更新/绘图函数 | 定时器函数 | 输入消息处理函数
坐标映射函数 | 警告函数 | 非客户区消息处理函数
窗口文本函数 | 窗口消息函数 | MDI消息处理函数
滚动函数 | 剪贴板函数 | 剪贴板消息处理函数
拖放函数 | OLE控件 | 菜单循环通知
插字符号函数 | 可重载函数 |

数据成员
m_hWnd 指明与这个CWnd对象相关联的HWND句柄

构造和析构
CWnd | 构造一个CWnd对象
DestroyWindow | 销毁相关联的Windows窗口

初始化
Create | 创建并初始化与CWnd对象相关联的子窗口
PreCreateWindow | 在与CWnd对象相关联的窗口被创建之前调用
CalcWindowRect | 调用这个函数以计算窗口客户区的矩形
GetStyle | 返回当前的窗口风格
GetExStyle | 返回窗口的扩展风格
Attach | 将Windows句柄与CWnd对象相连接
Detach | 将一个Windows句柄从CWnd对象上分离并返回这个句柄
PreSubclassWindow | 在调用SubclassWindow之前，允许其它必要的子类化工作
SubclassWindow | 将窗口与CWnd对象相连接，并使它通过CWnd的消息映射转发消息
UnsubclassWindow | 将窗口与CWnd对象分离
FromHandle | 当给定一个窗口的句柄时，返回CWnd对象的指针。如果没有CWnd对象与这个句柄相连接，则创建一个临时的CWnd对象并与之相连接
FromHandlePermanent | 当给定一个窗口的句柄时，返回CWnd对象的指针。如果没有CWnd 对象与这个句柄相连接，则返回NULL
DeleteTempMap | CWinApp的空闲处理函数自动调用这个函数，清除由FromHandle创建的任何临时CWnd对象
GetSafeHwnd | 返回m_hWnd，如果该指针为NULL，则返回NULL
CreateEx | 创建一个Windows的可重叠窗口、弹出窗口或子窗口，并把它连接到一个CWnd对象上
CreateControl | 创建一个OLE控件，该控件在MFC程序中由一个CWnd对象代表

窗口状态函数
IsWindowEnabled | 确定一个窗口是否允许鼠标和键盘输入
EnableWindow | 允许或禁止鼠标和键盘输入
GetActiveWindow | 获得激活的窗口
SetActiveWindow | 激活窗口
GetCapture | 获得捕获鼠标的CWnd
SetCapture | 使随后的鼠标输入都被发送到这个CWnd
GetFocus | 获得当前具有输入焦点的CWnd
SetFocus | 要求输入焦点
GetDesktopWindow | 获得Windows的桌面窗口
GetForegroundWindow | 返回前台窗口的指针（顶层窗口，用户正在其中工作）
SetForegroundWindow | 使创建窗口的线程变为前台并激活窗口
GetIcon | 获得图标的句柄
SetIcon | 设置指定图标的句柄
GetWindowContextHelpId | 获得帮助上下文的标识符
SetWindowContextHelpId | 设置帮助上下文的标识符
ModifyStyle | 修改当前的窗口风格
ModifyStyleEx | 修改窗口的扩展风格

窗口大小和位置
GetWindowPlacement | 获得窗口的显示状态以及正常（还原）的、最大化和最小化的位置
SetWindowPlacement | 设置窗口的显示状态以及正常（还原）的、最大化和最小化的位置
GetWindowRgn | 获得窗口的窗口区域的一个拷贝
SetWindowRgn | 设置窗口的区域
IsIconic | 确定CWnd是否被最小化（图标化）
IsZoomed | 确定CWnd是否被最大化
MoveWindow | 改变CWnd的位置和大小
SetWindowPos | 改变子窗口、弹出窗口和顶层窗口的大小、位置以及顺序
ArrangeIconicWindows | 排列所有最小化（图标化）的子窗口
BringWindowToTop | 使CWnd到达重叠窗口堆栈的顶部
GetWindowRect | 获得CWnd的屏幕坐标
GetClientRect | 获得CWnd客户区域的大小

窗口访问函数
ChildWindowFromPoint | 确定哪个子窗口包含指定的点，如果有的话
FindWindow | 返回由窗口名或窗口类标识的窗口的句柄
GetNextWindow | 返回窗口管理器列表中的下一个（或前一个）窗口
GetOwner | 获得CWnd的拥有者的指针
SetOwner | 改变CWnd的拥有者
GetTopWindow | 返回CWnd所属的第一个子窗口
GetWindow | 返回与窗口有特定关系的窗口
GetLastActivePopup | 确定CWnd拥有的弹出窗口是否最近被激活
IsChild | 指明CWnd是指定窗口的一个子窗口还是其它子对象
GetParent | 获得CWnd的父窗口（如果有）
GetSafeOwner | 获得给定窗口的安全拥有者
SetParent | 改变父窗口
WindowFromPoint | 标明包含给定点的窗口
GetDlgItem | 获得指定的对话框中具有指定ID的控件
GetDlgCtrlID | 如果CWnd是一个子窗口，则用这个函数来返回它的ID值
SetDlgCtrlID | 为窗口（可以是任意子窗口，不仅是对话框中的控件）设置窗口ID或控件ID
GetDescendantWindow | 搜索所有子窗口并返回具有指定ID的窗口
GetParentFrame | 获得CWnd对象的父框架窗口
SendMessageToDescendants | 将消息发送给窗口的所有子窗口
GetTopLevelParent | 获得窗口的顶层父窗口
GetTopLevelOwner | 获得顶层窗口
GetParentOwner | 返回子窗口的父窗口的指针
GetTopLevelFrame | 获得窗口的顶层框架窗口
UpdateDialogControls | 调用这个函数以更新对话框按钮和其它控件的状态
UpdateData | 初始化对话框或获得对话框中的数据
CenterWindow | 将窗口设置到父窗口的中央

更新/绘图函数
BeginPaint | 为绘图准备CWnd
EndPaint | 标志着绘图结束
Print | 在指定的设备环境中画出当前窗口
PrintClient | 在指定的设备环境（通常是打印机设备环境）中画出任何窗口
LockWindowUpdate | 禁止或恢复在给定窗口中的绘图
UnlockWindowUpdate | 解锁用CWnd::LockWindowUpdate锁定的窗口
GetDC | 获得客户区的设备环境
GetDCEx | 获得客户区的显示设备环境，允许在绘图的时候进行剪裁
RedrawWindow | 更新客户区中的指定矩形或区域
GetWindowDC | 获得整个窗口的显示环境，包括标题条、菜单和滚动条
ReleaseDC | 是否客户和窗口设备环境，使其它应用程序能够使用它们
UpdateWindow | 更新客户区
SetRedraw | 使CWnd的变化能够被重画，或者禁止重画发生的变化
GetUpdateRect | 获得完全封闭了CWnd中更新区域的最小矩形的坐标
GetUpdateRgn | 获得CWnd的更新区域
Invalidate | 使整个客户区无效
InvalidateRect | 在当前的更新区域中加入给定的矩形，使客户区的给定矩形无效
InvalidateRgn | 在当前的更新区域中加入给定的区域，使客户区的给定区域无效
ValidateRect | 在当前的更新区域中删除给定的矩形，使客户区的给定矩形有效
ValidateRgn | 在当前的更新区域中删除给定的区域，使客户区的给定区域有效
ShowWindow | 显示或隐藏窗口
IsWindowVisible | 确定窗口是否可见
ShowOwnedPopups | 显示或隐藏该窗口拥有的所有弹出窗口
EnableScrollBar | 允许或禁止滚动条的一个或两个箭头

坐标映射函数
MapWindowPoints | 将一些坐标从CWnd的坐标空间转换（映射）到其它窗口的坐标空间
ClientToScreen | 将给定点或显示器上矩形的客户区坐标转换为屏幕坐标
ScreenToClient | 将给定点或显示器上矩形的屏幕坐标转换为客户坐标

窗口文本函数
SetWindowText | 将窗口的文本或标题文字（如果有）设为指定的文本
GetWindowText | 返回窗口的文本或标题文字（如果有）
GetWindowTextLength | 返回窗口文本或标题文字的长度
SetFont | 设置当前字体
GetFont | 获得当前字体

滚动函数
GetScrollPos | 获得滚动块的当前位置
GetScrollRange | 复制指定滚动条的最大和最小滚动条位置
ScrollWindow | 滚动客户区的内容
ScrollWindowEx | 滚动客户区的内容，与ScrollWindow类似，还有其它功能
GetScrollInfo | 获得SCROLLINFO结构维护的滚动条信息
GetScrollLimit | 获得滚动条的限制
SetScrollInfo | 设置滚动条信息
SetScrollPos | 设置滚动块的当前位置，如果指定，并重画滚动条以反映新的位置
SetScrollRange | 设置指定滚动条的最小和最大位置值
ShowScrollBar | 显示或隐藏滚动条
EnableScrollBarCtrl | 允许或禁止一个滚动条控件
GetScrollBarCtrl | 返回滚动条控件
RepositionBars | 重新设定客户区中控制条的位置

拖放函数
DragAcceptFiles 指明该窗口将接收拖来的文件

插字符号函数
CreateCaret | 为系统插字符创建一个新的形状并获得它的所有权
CreateSolidCaret | 为系统插字符创建一个实心块并获得它的所有权
CreateGrayCaret | 为系统插字符创建一个灰色块并获得它的所有权
GetCaretPos | 获得插字符当前位置的客户区坐标
SetCaretPos | 将插字符移动到指定的位置
HideCaret | 通过将插字符移出显示屏幕而隐藏它
ShowCaret | 在插字符的当前位置显示插字符。一旦被显示，插字符就会自动闪烁

对话框项函数
CheckDlgButton | 在按钮控件旁放置或者清除检查标记
CheckRadioButton | 选中指定的单项按钮并清除指定的按钮组中其它所有单项按钮的检查标记
GetCheckedRadioButton | 返回一组按钮中当前选中的单项按钮的ID
DlgDirList | 用文件或目录列表填充一个列表框
DlgDirListComboBox | 用文件或目录列表填充一个组合框中的列表框
DlgDirSelect | 获得列表框的当前选择
DlgDirSelectComboBox | 获得组合框中列表框的当前选择
GetDlgItemInt | 将给定对话框中控件的文本转换为整数
GetDlgItemText | 获得与控件相关的标题或文本
GetNextDlgGroupItem | 在一组控件内搜索下一个（或上一个）控件
GetNextDlgTabItem | 获得指定的控件之后（或之前）具有WS_TABSTOP风格的第一个控件
IsDlgButtonChecked | 确定按钮控件是否有检查标记
IsDialogMessage | 确定给定的消息是否是送往无模式对话框的，如果是，则处理它
SendDlgItemMessage | 向指定的控件发送一条消息
SetDlgItemInt | 将控件的文本设为代表一个整数的字符串
SetDlgItemText | 设置指定的对话框中的控件的标题或文本
SubclassDlgItem | 将一个Windows控件与CWnd对象连接，然后使它通过CWnd的消息映射转发消息
ExecuteDlgInit | 初始化对话框资源
RunModalLoop | 获得、转换或分派来自模式窗口的消息
ContinueModal | 继续一个窗口的模式状态
EndModalLoop | 结束一个窗口的模式状态

数据绑定函数
BindDefaultProperty | 像类型库中标记的那样，将调用对象的缺省的简单移动属性和与数据源控件相关的游标绑定在一起
BindProperty | 将一个游标移动属性与数据移动控件绑定在一起，然后在MFC的绑定管理器中注册这种联系
GetDSCCursor | 获得游标的指针，该游标是通过数据源控件的DataSource、UserName、Password和SQL属性定义的

菜单函数
GetMenu | 获得指定菜单的指针
SetMenu | 将菜单设为指定的菜单
DrawMenuBar | 重画菜单条
GetSystemMenu | 允许应用程序访问控制菜单，用于拷贝和修改
HiliteMenuItem | 加亮显示一个顶层（菜单条）菜单项，或者取消加亮显示

工具提示函数
EnableToolTips | 允许工具提示控件
CancelToolTips | 禁止工具提示控件
FilterToolTipMessage | 获得与对话框中控件相关的标题和文本
OnToolHitTest | 确定一个点是否位于指定工具的边界矩形之中并获得工具的信息

定时器函数
SetTimer | 安装一个系统定时器，当它被激活时，发送一个WM_TIMER消息
KillTimer | 销毁一个系统定时器

警告函数
FlashWindow | 使窗口闪烁一次
MessageBox | 创建并显示一个窗口，其中包含了应用程序提供的消息和标题

窗口消息函数
GetCurrentMessage | 返回这个窗口当前处理的消息的指针。只应该在OnMessage消息处理函数内部调用
Default | 调用缺省的窗口过程，它提供了对应用程序没有处理的任何窗口消息的缺省处理
PreTranslateMessage | 在消息被发送到Windows函数TranslateMessage和DispatchMessage之前，CWinApp使用这个函数来过滤窗口消息
SendMessage | 向CWnd对象发送一个消息，直到这条消息被处理之后才返回
PostMessage | 将一条消息放入应用程序的消息队列，然后不等窗口处理这条消息直接返回
SendNotifyMessage | 将一条消息发送到窗口并尽快返回，返回的速度取决于该窗口是否是由调用线程所创建

剪贴板函数
ChangeClipboardChain | 将CWnd从剪贴板观察器的链中清除
SetClipboardViewer | 将CWnd加入一个窗口链，每当剪贴板的内容发生变化时，就会通知这些窗口
OpenClipboard | 打开剪贴板。其它应用程序将不能修改剪贴板，直到调用Windows的CloseClipboard函数
GetClipboardOwner | 获得指向剪贴板的当前拥有者的指针
GetOpenClipboardWindow | 获得当前打开剪贴板的窗口的指针
GetClipboardViewer | 获得剪贴板观察器链中的第一个窗口的指针

OLE控件
SetProperty | 设置OLE控件的属性
OnAmbientProperty | 实现周围属性值
GetControlUnknown | 获得指向未知OLE控件的指针
GetProperty | 获得OLE控件的属性
InvokeHelper | 激活OLE控件的方法或属性

可重载函数
WindowProc | 为CWnd对象提供了窗口过程。缺省的窗口过程通过消息映射分派消息
DefWindowProc | 调用缺省的窗口过程，它提供了对应用程序没有处理的任何窗口消息的缺省处理
PostNcDestroy | 这个虚拟函数在窗口被销毁以后被缺省的OnNcDestroy函数所调用
OnNotify | 框架调用这个函数以通知父窗口，在它的一个控件发生了一个事件，或该控件需要消息
OnChildNotify | 父窗口调用这个函数，给被通知的控件一个响应控件通知消息的机会
DoDataExchange | 用于对话框数据交换和校验。由UpdateData调用

初始化消息处理函数
OnInitMenu | 当菜单要被激活时调用这个函数
OnInitMenuPopup | 当弹出菜单要被激活时调用这个函数

系统消息处理函数
OnSysChar | 当一次击键被转换为系统字符消息时调用这个函数
OnSysCommand | 当用户从控制菜单中选择命令，或者当用户选择了最大化或最小化按钮时，调用这个函数
OnSysDeadChar | 当一次击键被转换为系统死键（例如重音字符）消息时调用这个函数
OnSysKeyDown | 当用户按住ALT键并按下其它键时调用这个函数
OnSysKeyUp | 当用户放开一个键，而此时ALT键被按下，则调用这个函数
OnCompacting | 当Windows检测到系统内存很少时，就调用这个函数
OnDevModeChange | 当用户改变了设备模式设置时，就为顶层窗口调用这个函数
OnFontChange | 当字体资源池发生变化时调用这个函数
OnPaletteIsChanging | 当应用程序将要实现其逻辑调色板时通知其它应用程序
OnPaletteChanged | 调用这个函数时使用调色板的所有窗口能够实现它们的逻辑调色板并更新它们的客户区
OnSysColorChange | 当系统颜色设置发生改变时为所有的顶层窗口调用这个函数
OnWindowPosChanging | 由于调用了SetWindowPos函数或其它的窗口管理函数，因而窗口的大小、位置和次序将要发生变化时，就调用这个函数
OnWindowPosChanged | 由于调用了SetWindowPos函数或其它的窗口管理函数，因而当窗口的大小、位置和次序发生了变化时，就调用这个函数
OnDropFiles | 当用户在注册为可以接收拖放文件的窗口上方释放鼠标左键时，这个函数就被调用
OnSpoolerStatus | 每当一个作业被加入或移出打印管理器的队列时，打印管理器就调用这个函数
OnTimeChange | 在系统时间改变之后，为所有的顶层窗口调用这个函数
OnWinIniChange | 在Windows的初始化文件WIN.INI改变之后为所有的顶层窗口调用这个函数

一般消息处理函数
OnCommand | 当用户选择了一个命令时调用这个函数
OnActivate | 当CWnd要被激活或退出激活状态时调用这个函数
OnActivateApp | 当应用程序要被激活或退出激活状态时调用这个函数

一般消息处理函数
OnCancelMode | 调用这个函数以允许CWnd取消任何内部模式，比如鼠标捕获状态
OnChildActivate | 当CWnd的大小和位置发生变化或者CWnd被激活时，就为多文档界面（MDI）的子窗口调用这个函数
OnClose | 调用这个函数，作为关闭CWnd的信号
OnCopyData | 从一个应用程序复制数据到另一个应用程序
OnCreate | 作为窗口创建过程的一部分来调用
OnCtlColor | 如果CWnd是一个控件的父窗口，当控件要被重画时就调用这个函数
OnDestroy | 当CWnd要被销毁时就调用这个函数
OnEnable | 当CWnd被允许或禁止时调用这个函数
OnEndSession | 当会话将要结束时调用这个函数
OnEnterIdle | 调用这个函数以通知应用程序的主窗口过程，模式对话框或菜单正在进入空闲状态
OnEraseBkgnd | 当需要擦除窗口的背景时调用这个函数
OnGetMinMaxInfo | 每当Windows需要知道最大化的位置和大小，或者最小或最大跟踪尺寸时，就调用这个函数
OnIconEraseBkgnd | 当CWnd被最小化（图标化），并且在画出图标之前，必须填充图标的背景时调用这个函数
OnKillFocus | 当CWnd失去输入焦点时立即调用这个函数
OnMenuChar | 当用户按下一个菜单助记字符，但是不能与当前菜单中任何预定义的助记符相匹配时，就调用这个函数
OnMenuSelect | 当用户选择了一个菜单项时就调用这个函数
OnMove | 当CWnd的位置发生变化时调用这个函数
OnMoving | 指明用户正在移动CWnd对象
OnDeviceChange | 通知应用程序或设备驱动程序，设备或计算机的硬件配置发生了变化
OnStyleChanged | 指明Windows的::SetWindowLong函数已经改变了一个或多个窗口风格
OnStyleChanging | 指明Windows的::SetWindowLong函数将要改变一个或多个窗口风格
OnPaint | 调用这个函数以重画窗口的一部分
OnParentNotify | 当创建或销毁一个子窗口，或者当用户在子窗口上方点击了鼠标键时调用这个函数
OnQueryDragIcon | 当一个最小化（图标化）的CWnd要被用户拖拉时就调用这个函数
OnQueryEndSession | 当用户选择结束Windows会话时就调用这个函数
OnQueryNewPalette | 通知CWnd它将接收输入焦点
OnQueryOpen | 当CWnd是一个图标并且用户请求打开这个图标时就调用这个函数

一般消息处理函数
OnSetFocus | 当CWnd获得输入焦点时调用这个函数
OnShowWindow | 当CWnd被隐藏或显示时调用这个函数
OnSize | 当CWnd的大小被改变以后调用这个函数
OnSizing | 指明用户正在改变矩形的大小
OnStyleChanged | 指明窗口的一个或多个风格已经被改变
OnStyleChanging | 指明窗口的一个或多个风格将被改变

控件消息处理函数
OnCharToItem | 这个函数被具有LBS_WANTKEYBOARDINPUT风格的子列表框调用，用以响应WM_CHAR消息
OnCompareItem | 调用这个函数以确定排序的自画组合框或列表框中新项的相对位置
OnDeleteItem | 当一个自画子列表框或组合框中将被销毁时，或者从控件中删除项时调用这个函数
OnDrawItem | 当自画子按钮控件、组合框控件、列表框控件或菜单的可视部分需要被画出时调用这个函数
OnDSCNotify | 在响应数据源控件引发的事件时调用，该事件是当与数据源控件绑定的控件修改或将要修改游标时产生的
OnGetDlgCode | 为控件调用这个函数，使控件能够自己处理输入的箭头键和TAB键
OnMeasureItem | 当控件被创建时为自画子组合框，列表框或菜单项调用这个函数。CWnd通知Windows该控件的大小
SendChildNotifyLastMsg | 提供了从父窗口到子窗口的通知消息，使子窗口能够处理一个任务
ReflectChildNotify | 将消息向它的来源反映的帮助函数
OnWndMsg | 指明一个窗口消息是否已被处理
ReflectLastMsg | 将上一个消息反映到子窗口
OnVKeyToItem | 由CWnd所拥有的列表框调用，用于响应WM_KEYDOWN消息

输入消息处理函数
OnChar | 当一次击键被转换为非系统字符时调用这个函数
OnDeadChar | 当一次击键被转换为非系统死键（例如重音字符）时调用这个函数
OnHScroll | 当用户点击了CWnd的水平滚动条时调用这个函数
OnKeyDown | 当按下了一个非系统键时调用这个函数
OnKeyUp | 当放开一个非系统键时调用这个函数
OnLButtonDblClk | 当用户双击鼠标左键时调用这个函数

输入消息处理函数
OnLButtonDown | 当用户按下鼠标左键时调用这个函数
OnLButtonUp | 当用户放开鼠标左键时调用这个函数
OnMButtonDblClk | 当用户双击鼠标中键时调用这个函数
OnMButtonDown | 当用户按下鼠标中键时调用这个函数
OnMButtonUp | 当用户放开鼠标中键时调用这个函数
OnMouseActivate | 当鼠标位于非活动窗口，并且用户按下鼠标键时调用这个函数
OnMouseMove | 当鼠标光标移动时调用这个函数
OnMouseWheel | 当用户旋转鼠标轮时调用这个函数。使用WindowsNT4.0的消息处理
OnRegisteredMouseWheel | 当用户旋转鼠标轮的时候调用这个函数。使用Windows 95和Windows NT 3.51的消息处理
OnRButtonDblClk | 当用户双击鼠标右键时调用这个函数
OnRButtonDown | 当用户按下鼠标右键时调用这个函数
OnRButtonUp | 当用户放开鼠标右键时调用这个函数
OnSetCursor | 如果没有捕获鼠标输入并且鼠标导致光标在窗口内移动时，就调用这个函数
OnTimer | 当达到SetTimer指定的时间间隔时调用这个函数
OnVScroll | 当用户点击窗口的垂直滚动条时调用这个函数
OnCaptureChanged | 向失去鼠标捕获的窗口发送一条消息

非客户区消息处理函数
OnNcActivate | 当需要改变非客户区以指明活动或非活动状态时调用这个函数
OnNcCalcSize | 当需要计算非客户区的大小和位置时调用这个函数
OnNcCreate | 在OnCreate之前，当要创建非客户区时调用这个函数
OnNcDestroy | 当非客户区要被销毁的时候调用这个函数
OnNcHitTest | 如果CWnd中包含了光标，或者用SetCapture捕获了鼠标输入时，每当鼠标移动时，Windows调用这个函数
OnNcLButtonDblClk | 当光标位于CWnd的非客户区，用户双击鼠标左键时，就调用这个函数
OnNcLButtonDown | 当光标位于CWnd的非客户区，用户按下鼠标左键时，就调用这个函数
OnNcLButtonUp | 当光标位于CWnd的非客户区，用户放开鼠标左键时，就调用这个函数
OnNcMButtonDblClk | 当光标位于CWnd的非客户区，用户双击鼠标中键时，就调用这个函数
OnNcMButtonDown | 当光标位于CWnd的非客户区，用户按下鼠标中键时，就调用这个函数
OnNcMButtonUp | 当光标位于CWnd的非客户区，用户放开鼠标中键时，就调用这个函数

非客户区消息处理函数
OnNcMouseMove | 当光标在CWnd的非客户区中移动时就调用这个函数
OnNcPaint | 当非客户区需要重画时调用这个函数
OnNcRButtonDblClk | 当光标位于CWnd的非客户区，用户双击鼠标右键时，就调用这个函数
OnNcRButtonDown | 当光标位于CWnd的非客户区，用户按下鼠标右键时，就调用这个函数
OnNcRButtonUp | 当光标位于CWnd的非客户区，用户放开鼠标右键时，就调用这个函数

MDI消息处理函数
OnMDIActivate 当MDI子窗口被激活或失去活动状态时调用这个函数

剪贴板消息处理函数
OnAskCbFormatName | 当剪贴板的拥有者将显示剪贴板内容时，剪贴板观察程序就调用这个函数
OnChangeCbChain | 通知指定的窗口将从链中删除
OnDestroyClipboard | 当通过Windows的EmptyClipboard函数清空剪贴板时调用这个函数
OnDrawClipboard | 当内容变化时调用这个函数
OnHScrollClipboard | 当剪贴板的拥有者要滚动剪贴板的图像、使适当的部分无效以及更新滚动条值的时候调用这个函数
OnPaintClipboard | 当剪贴板观察器的客户区需要重画的时候调用这个函数
OnRenderAllFormats | 当拥有者应用程序将被销毁且需要提交它的所有格式时调用这个函数
OnRenderFormat | 当一种延迟提交的格式需要被提交时为剪贴板拥有者调用这个函数
OnSizeClipboard | 当剪贴板观察器窗口的客户区大小发生变化时调用这个函数
OnVScrollClipboard | 当拥有者要滚动剪贴板的图像、使适当的部分无效以及更新滚动条值的时候调用这个函数

菜单循环通知
OnEnterMenuLoop | 进入一个菜单模式的循环时调用该函数
OnExitMenuLoop | 当退出一个菜单模式的循环时调用该函数


 CWnd::ArrangeIconicWindows

UINT ArrangeIconicWindows( );

返回值：如果这个函数执行成功，则返回一行图标的高度；否则返回0。

说明：
排列所有最小化（图标化）的子窗口。
这个成员函数还排列桌面窗口中的图标，这些图标覆盖了整个屏幕。GetDesktopWindow成员函数可以返回桌面窗口对象的图标。
如果要排列MDI客户窗口中的MDI子窗口，则调用CMDIFrameWnd::MDIIconArrange。

请参阅：
CWnd::GetDesktopWindow, CMDIFrameWnd::MDIIconArrange, ::ArrangeIconicWindows


 CWnd::Attach

BOOL Attach( HWND hWndNew );

返回值：如果成功，则返回非零值；否则返回0。

参数：
hWndNew 指定了Windows窗口的句柄。

说明：将一个Windows窗口与CWnd对象相连接。

请参阅：CWnd::Detach, CWnd::m_hWnd, CWnd::SubclassWindow


 CWnd::BeginPaint

CDC* BeginPaint( LPPAINTSTRUCT lpPaint );

返回值：标识了CWnd的设备环境。这个指针可能是临时的，不应在EndPaint之外保存。

参数：
lpPaint 执行PAINTSTRUCT结构，用于获取绘图信息。

说明：
为绘图准备CWnd并用与绘图有关的信息填充PAINTSTRUCT数据结构。
绘图结构中包含了一个RECT数据结构，它包含了完全封闭更新区域的最小矩形以及一个标志，指明背景是否需要擦除。
更新区域是由Invalidate、InvalidateRect或InvalidateRgn成员函数设置的，并且在更新区域改变大小、移动、创建、滚动或执行其它会影响客户区的操作后由系统设置。如果更新区域被标记为需要擦除，则BeginPaint发送一个WM_ONERASEBKGND消息。
除非是在响应WM_PAINT消息的时候，否则不要调用BeginPaint成员函数。每个对BeginPaint成员函数的调用都必须有对应的对EndPaint成员函数的调用。如果在这个区域中的插字符需要被重画，那么BeginPaint成员函数自动隐藏插字符以免被擦除。

请参阅：
CWnd::EndPaint, CWnd::Invalidate, CWnd::InvalidateRgn, ::BeginPaint, CPaintDC


 CWnd::BindDefaultProperty

void BindDefaultProperty( DISPID dwDispID, VARTYPE vtProp, LPCTSTR szFieldName, CWnd * pDSCWnd );

参数：
dwDispID | 指定要与数据源控件绑定的数据绑定控件的属性的DISPID。
vtProp | 指定要绑定的属性的类型--例如，VT_BSTR，VT_VARIANT等等。
szFieldName | 指定要与属性绑定的字段的名字，位于数据源控件提供的游标中。
pDSCWnd | 指向拥有数据源控件的窗口，属性将与该窗口绑定。利用DCS的宿主窗口的资源ID调用GetDlgItem以获取这个指针。

说明：
如类型库中标记的那样将调用对象缺省的简单绑定属性（比如编辑控件）与游标绑定起来，该游标是通过数据源控件的DataSource、UserName、Password和SQL属性定义的。你调用这个函数的CWnd对象必须是一个数据绑定对象。
BindDefaultProperty必须在下面的上下文中使用：
BOOL CMyDlg::OnInitDialog()
{
...
CWnd* pDSC = GetDlgItem(IDC_REMOTEDATACONTROL);
CWnd* pList = GetDlgItem(IDC_DBLISTBOX);
pList->BindDefaultProperty(0x2, VT_BSTR, _T("CourseID"), pDSC);
CWnd* pEdit = GetDlgItem(IDC_MASKEDBOX);
pEdit->BindDefaultProperty(0x16, VT_BSTR, _T("InstuctorID"), pDSC);
...
return TRUE;
}

请参阅：CWnd::GetDSCCursor, CWnd::BindProperty


 CWnd::BindProperty

void BindProperty( DISPID dwDispID, CWnd * pWndDSC );

参数：
dwDispID | 指定了要与数据源控件绑定的数据绑定控件的属性的DISPID。
pWndDSC | 指向拥有数据源控件的窗口，属性将与该窗口绑定。利用DCS的宿主窗口的资源ID调用GetDlgItem以获取这个指针。

说明：
将数据绑定控件（如网格控件）的游标绑定属性与数据源控件绑定起来，并且在MFC绑定管理器中注册这种联系。BindProperty必须在下面的上下文中使用：
BOOL CMyDlg::OnInitDialog()
{
...
CWnd* pDSC = GetDlgItem(IDC_REMOTEDATACONTROL);
CWnd* pList= GetDlgItem(IDC_DBLISTBOX);
pList.BindProperty(0x9, pDSC);
...
return TRUE;
}

请参阅：CWnd::GetDSCCursor, CWnd::BindDefaultProperty


 CWnd::BringWindowToTop

void BringWindowToTop( );

说明：
这个函数将CWnd放到重叠窗口堆栈的顶部。另外，BringWindowToTop还激活弹出窗口、顶层窗口以及MDI子窗口。BringWindowToTop成员函数应当被用来把任何被重叠窗口部分或完全遮住的窗口显露出来。
调用这个函数类似于调用SetWindowPos函数来改变窗口在Z轴方向上的位置。BringWindowToTop函数并不将窗口的风格改变为桌面上的顶层窗口。

请参阅：::BringWindowToTop


 CWnd::CalcWindowRect

virtual void CalcWindowRect( LPRECT lpClientRect, UINT nAdjustType = adjustBorder );

参数：
lpClientRect | 指向一个RECT结构或CRect对象，其中包含了窗口矩形的值。
nAdjustType | 用于现场编辑的枚举类型。它可以具有以下的值：CWnd::adjustBorder = 0，意味着在计算时不考虑滚动条大小；或者CWnd::adjustBorder = 1，意味着它们将被加入最终的矩形大小。

说明：
调用这个成员函数以根据所需的客户矩形大小计算窗口矩形的大小。随后算出的窗口矩形（保存在lpClientRect）中可以被传递到Create成员函数以创建一个窗口，其客户区大小就是要求的大小。
框架在创建窗口之前确定窗口的大小。
客户矩形是完全封闭客户区的最小矩形。窗口矩形是完全封闭窗口的最小矩形。

请参阅：::AdjustWindowRectEx


 CWnd::CancelToolTips

static void PASCAL CancelToolTips( BOOL bKeys = FALSE );

参数：
bKeys 如果为TRUE，当按下键时取消工具提示，并将状态条文本设为缺省值；否则为FALSE。

说明：
如果当前显示了工具提示，则调用这个函数以从屏幕上清除工具提示。
注意:这个成员函数对你的代码管理的工具提示不起作用。它只影响CWnd::Enable ToolTips管理的工具提示控件。

请参阅：EnableToolTips, TTM_ACTIVATE


 CWnd::CenterWindow

void CenterWindow( CWnd* pAlternateOwner = NULL );

参数：
pAlternateOwner 指向一个窗口的指针，本窗口将被定位到该窗口（而不是其它的父窗口）的中央。

说明：
这个函数将一个窗口定位到它的父窗口的中央。通常在CDialog::OnInitDialog中调用，用于将对话框定位到应用程序主窗口的中央。在缺省情况下，这个函数将子窗口定位到它们的父窗口的中央，而将弹出窗口定位到拥有者的中央。如果弹出窗口没有拥有者，它将被定位到屏幕中央。如果要使窗口根据不是父窗口也不是拥有者的窗口来定位，则可以将pAlternateOwner参数可以被设为一个有效的窗口。如果要强迫相对于屏幕定位，则应在pAlternateOwner参数中传递CWnd::GetDesktopWindow返回的值。

请参阅：CWnd::GetDesktopWindow, CDialog::OnInitDialog


 CWnd::ChangeClipboardChain

BOOL ChangeClipboardChain( HWND hWndNext );

返回值：如果成功，则返回一个非零值；否则返回0。

参数：
hWndNext 标识了剪贴板观察器链中跟在CWnd后面的窗口。

说明：从剪贴板观察器的链中移去CWnd，并且使hWndNext指定的窗口称为链中CWnd的后继者。

请参阅：CWnd::SetClipboardViewer, ::ChangeClipboardChain


 CWnd::CheckDlgButton

void CheckDlgButton( int nIDButton, UINT nCheck );

参数：
nIDButton | 指定要修改的按钮。
nCheck | 指定了要执行的动作。如果nCheck为非零值，则CheckDlgButton成员函数将一个检查标记放在按钮旁边；如果为0，则清除检查标记。对于三态按钮，如果nCheck为2，则按钮的状态不确定。

说明：
选择（置检查标记）或清除（清除检查标记）一个按钮，或者改变三态按钮的状态。CheckDlgButton函数向指定的按钮发送一条BM_SETCHECK消息。

请参阅：
CWnd::IsDlgButtonChecked, CButton::SetCheck, ::CheckDlgButton


 CWnd::CheckRadioButton

void CheckRadioButton( int nIDFirstButton, int nIDLastButton, intnIDCheckButton );

参数：
nIDFirstButton | 指定组中第一个单选按钮的整数标识符。
nIDLastButton | 指定组中最后一个单选按钮的整数标识符。
nIDCheckButton | 指定了要选中的单选按钮的整数标识符。

说明：
从一组按钮中选择（加入检查标记）一个单选按钮并清除（清除检查标记）同组中其它单选按钮。CheckRadioButton函数向指定的单选按钮发送一条BM_SETCHECK消息。

请参阅：
CWnd::GetCheckedRadioButton, CButton::SetCheck, ::CheckRadioButton


 CWnd::ChildWindowFromPoint

CWnd* ChildWindowFromPoint( POINT point ) const;
CWnd* ChildWindowFromPoint( POINT point, UINT nFlags ) const;

返回值：
标识了包含指定点的子窗口。如果给定的点位于客户区之外，则返回NULL。如果给定点位于客户区之内，但是不在任何子窗口之内，则返回CWnd。此成员函数将返回包含了指定点的被隐藏或禁止的子窗口。可能有多于一个子窗口包含了给定的点。但是，这个函数仅返回包含该点的第一个窗口的CWnd* 指针。
返回的CWnd* 有可能是临时的，不能保存以供将来使用。

参数：
point 指定了要被测试的点的客户区坐标。
nflags指定了要跳过哪个子窗口。这个参数可以是如下值的组合：
值 | 含义
CWP_ALL | 不跳过任何子窗口
CWP_SKIPINVISIBLE | 跳过不可见的子窗口
CWP_SKIPDISABLED | 跳过被禁止的子窗口
CWP_SKIPTRANSPARENT | 跳过透明的子窗口

说明：确定CWnd的哪个子窗口包含了指定的点。

请参阅：CWnd::WindowFromPoint, ::ChildWindowFromPoint


 CWnd::ClientToScreen

void ClientToScreen( LPPOINT lpPoint ) const;
void ClientToScreen( LPRECT lpRect ) const;

参数：
lpPoint | 指向一个POINT结构或CPoint对象，其中包含了要转换的客户区坐标。
lpRect | 指向一个RECT结构或CRect对象，其中包含了要转换的客户区坐标。

说明：
将显示器上给定点或矩形的客户区坐标转换为屏幕坐标。ClientToScreen成员函数使用lpPoint或lpRect指向的POINT或RECT结构或者CPoint或CRect对象的客户区坐标来计算新的屏幕坐标，然后它将结构中的坐标替换为新坐标。新的屏幕坐标是相对于系统显示器的左上角的。
ClientToScreen成员函数假定给定的点或矩形使用的是客户区坐标。

请参阅：CWnd::ScreenToClient, ::ClientToScreen


 CWnd::ContinueModal

BOOL ContinueModal( );

返回值：如果要继续模式循环，则返回非零值；如果调用了EndModalLoop，则返回0。

说明：
这个成员是由RunModalLoop调用的，用于确定何时退出模式状态。在缺省情况下，它返回一个非零值，直到调用了EndModalLoop。

请参阅：RunModalLoop, EndModalLoop


 CWnd::Create

virtual BOOL Create(
LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID,
CCreateContext* pContext = NULL
);

返回值：如果成功，则返回非零值；否则返回0。

参数：
lpszClassName | 指向一个以null结尾的字符串，它命名了一个Windows的窗口类（一个WNDCLASS结构）。类名可以是用全局函数AfxRegisterWndClass注册的任何名字，也可以是任何预定义的控制类名。如果该参数为NULL，则使用缺省的CWnd属性。
lpszWindowName | 指向一个null结尾的字符串，其中包含了窗口名。
dwStyle | 指定了窗口风格属性。不能使用WS_POPUP。如果你想要创建一个弹出窗口，则应使用CWnd::CreateEx。
rect | 窗口的位置和大小，使用pParentWnd的客户区坐标。
pParentWnd | 父窗口。
nID | 子窗口的ID。
pContext | 窗口的创建上下文。

说明：
创建一个Windows的子窗口，并将它连接到CWnd对象上。
你可以经过两步构造一个子窗口。首先，调用构造函数，创建一个CWnd对象。然后调用Create，创建一个Windows的子窗口，并将它连接到CWnd。Create函数初始化窗口的类名、窗口名，并为它的风格、父窗口和ID注册值。

请参阅：CWnd::CWnd, CWnd::CreateEx


 CWnd::CreateCaret

void CreateCaret( CBitmap* pBitmap );

参数：
pBitmap 标识了一个位图，定义了插入字符的形状。

说明：
为系统插入字符创建一个新的形状，并声明对插入字符的所有权。
这个位图必须是先前用CBitmap::CreateBitmap成员函数、Windows的CreateDIBitmap函数或CBitmap::LoadBitmap成员函数创建的。
CreateCaret自动销毁原来的插字符形状，并不考虑哪个窗口拥有这个插字符。在被创建之后，插字符最初是隐藏的。要显示插字符，必须调用ShowCaret成员函数。
系统插字符是一种共享资源。CWnd只应在它具有输入焦点或者活动的时候才创建插字符。在它失去输入焦点或变为非活动之前，它应该销毁插字符。

请参阅：
CBitmap::CreateBitmap, ::CreateDIBitmap, ::DestroyCaret, CBitmap::LoadBitmap, CWnd::ShowCaret, ::CreateCaret


 CWnd::CreateControl

BOOL CWnd::CreateControl(
LPCTSTR lpszClass,
LPCTSTR lpszWindowName,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID,
CFile* pPersist = NULL,
BOOL bStorage = FALSE,
BSTR bstrLicKey = NULL
);

BOOL CWnd::CreateControl(
REFCLSID clsid,
LPCTSTR lpszWindowName,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID,
CFile* pPersist = NULL,
BOOL bStorage = FALSE,
BSTR bstrLicKey = NULL
);

返回值：如果成功，则返回非零值；否则返回0。

参数：
lpszClass | 这个字符串可能包含了该类的OLE的“短名”（ProgID），例如，“CIRC3.Circ3Ctrl.1”。这个名字应该与控件注册的名字相匹配。或者，这个字符串可能包含了CLSID的字符串形式，包括在大括号内，例如，“{9DBAFCCF-592F-101B-85CE-00608CEC297B}”。在其它情况下，CreateControl将该字符串转换为对应的类ID。
lpszWindowName | 指向要显示在控件中的文本的指针。设置了控件的标题或文本属性（如果有）的值。如果该指针为NULL，则不改变控件的标题或文本属性。
dwStyleWindows | 风格。可能的取值在说明部分列出。
rect | 指定了控件的大小和位置。它可以是一个CRect对象，也可以是一个RECT结构。
pParentWnd | 指定了控件的父窗口。它不能为NULL。
nID | 指定了控件的ID。
pPersist | 指向一个CFile对象的指针，其中包含了控件的永久状态。缺省值为NULL，表明控件在初始化自己的时候并不读任何永久性的存储。如果该参数不是NULL，它必须是一个CFile派生类对象的指针，其中包含了控件的永久数据，可以是流的形式，也可以是存储的形式。这些数据必须是在客户以前的活动中保存的。CFile对象中还可以包含其它数据，但是当调用CreateControl的时候，它的读写指针必须定位在永久数据的第一个字节。
bStorage | 指明pPersist中的数据是被解释为IStorage数据还是IStream数据。如果pPersist中的数据是一种存储，则bStorage应该为TRUE。如果pPersist中的数据是一个流，则bStorage应该是FALSE。缺省值为FALSE。
bstrLicKey | 可选的许可键数据。这个数据仅在创建需要运行时许可的控件时才需要。如果该控件支持许可，要成功地创建控件，你必须提供许可键。缺省的值为NULL。
clsid | 控件的唯一的类ID。

说明：
使用这个成员函数来创建一个OLE控件，在MFC程序中，它用一个CWnd对象来代表。CreateControl与CWnd::Create函数类似，CWnd::Create为CWnd创建一个窗口。CreateControl创建一个OLE控件，而不是其它的普通窗口。
CreateControl仅支持Windows的dwStyle风格的一个子集：
· | WS_VISIBLE | 创建一个最初可见的窗口。如果你希望该控件立即可见，向普通窗口一样，则需要这个风格。
· | WS_DISABLED | 创建一个最初被禁止的窗口。被禁止的窗口不能接收用户的输入。如果控件具有Enable属性，则可以设置这个风格。
· | WS_BORDER | 创建一个带有细边框的窗口。如果控件具有BorderStyle属性，则可以设置这个风格。
· | WS_GROUP | 指定了一组控件中的第一个控件。用户可以在组中使用方向键来把键盘焦点从一个控件转移到另一个控件。在第一个控件之后所有用WS_GROUP风格定义的控件都属于同一组。下一个具有WS_GROUP风格的控件将结束这个组并开始一个新组。
· | WS_TABSTOP | 指明当用户按下TAB键时，控件可以接收键盘焦点。按下TAB键时键盘焦点转移到具有WS_TABSTOP风格的下一个控件。


 CWnd::CreateEx

BOOL CreateEx(
DWORD dwExStyle,
LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle,
int x,
int y,
int nWidth,
int nHeight,
HWND hwndParent,
HMENU nIDorHMenu,
LPVOID lpParam = NULL
);

BOOL CreateEx(
DWORD dwExStyle,
LPCTSTR lpszClassName,
LPCTSTR lpszWindowName,
DWORD dwStyle,
const RECT& rect,
CWnd* pParentWnd,
UINT nID,
LPVOID lpParam = NULL
);

返回值：如果成功，则返回非零值；否则返回0。

参数：
dwExStyle | 指定了要创建的CWnd的扩展风格。对窗口应用任何扩展的窗口风格。
lpszClassName | 指向一个以null结尾的字符串，命名了Windows的窗口类（一个WNDCLASS结构）。类名可以是用全局函数AfxRegisterWndClass注册的任何名字，或者是任何预定义的控制类名。它不能是NULL。
lpszWindowName | 指向一个用null结尾的字符串，包含了窗口的名字。
dwStyle | 指定了窗口风格属性。对可能取值的描述参见“窗口风格”和CWnd::Create。
x | 指定了CWnd窗口的初始x轴位置。
y | 指定了CWnd窗口的初始y轴位置。
nWidth | 指定了CWnd窗口的宽度（设备单位）。
nHeight | 指定了CWnd窗口的高度（设备单位）。
hwndParent | 标识了要创建的CWnd窗口的父窗口或拥有者窗口。对顶层窗口，使用NULL。
nIDorHMenu | 标识了菜单或子窗口的标识符。其含义依赖于窗口的风格。
lpParam | 指向CREATESTRUCT结构的lpCreateParams字段所代表的数据。
rect | 窗口的大小和位置，使用pParentWnd的客户区坐标。
pParentWnd | 父窗口。
nID | 子窗口的ID。

说明：
这个函数使用dwExStyle所指定的扩展风格创建一个重叠式、弹出式或子窗口。
CreateEx的参数指定了WNDCLASS、窗口标题、窗口风格以及（可选）窗口的初始位置和大小。CreateEx还指定了窗口的父窗口（如果有）和ID。
当CreateEx执行的时候，Windows向窗口发送WM_GETMINMAXINFO、WM_NCCREA_TE、WM_NCCALCSIZE和WM_CREATE消息。
要扩展缺省的消息处理，应从CWnd继承一个类，在新类中加入消息映射，并为以上的消息提供成员函数。例如，可以重载OnCreate为新类提供需要的初始化功能。
重载其它OnMessage消息处理函数，为你的派生类提供进一步的功能。
如果给定了WS_VISIBLE风格，Windows将向窗口发送激活和显示窗口所需的所有消息。如果窗口风格中指定了标题条，则lpszWindowName参数中指定的窗口标题将显示在标题条上。
dwStyle参数可以是窗口风格的任意组合。

请参阅：CWnd::Create, ::CreateWindowEx


 CWnd::CreateGrayCaret

void CreateGrayCaret( int nWidth, int nHeight );

参数：
nWidth | 指定了插字符的宽度（逻辑单位）。如果这个参数为0，则宽度被设为系统定义的窗口边框宽度。
nHeight | 指定了插字符的高度（逻辑单位）。如果这个参数为0，则高度被设为系统定义的窗口边框高度。

说明：
这个函数为系统插字符创建一个灰色的矩形，并声明对插字符的所有权。插字符的形状可以是线条，也可以是方块。
参数nWidth和nHeight指定了插字符的宽度和高度（逻辑单位）；实际的宽度和高度（以像素为单位）依赖于映射模式。
使用SM_CXBORDER和SM_CYBORDER索引调用Windows的GetSystemMetrics函数可以获得系统的窗口边框宽度或高度。使用窗口边框的宽度和高度以确保插字符在高分辨率显示中能够看得见。
CreateGrayCaret成员函数自动销毁原来的插字符形状，如果有的话，而并不考虑哪个窗口拥有这个插字符。在被创建之后，插字符是隐藏的。要显示插字符，必须调用ShowCaret成员函数。
系统插字符是一种共享资源。CWnd只应在它具有输入焦点或处于活动状态时才创建插字符。在它失去输入焦点或变为非活动以前，它应当销毁插字符。

请参阅：
::DestroyCaret, ::GetSystemMetrics, CWnd::ShowCaret, ::CreateCaret


 CWnd::CreateSolidCaret

void CreateSolidCaret( int nWidth, int nHeight );

参数：
nWidth | 指定了插字符的宽度（逻辑单位）。如果这个参数为0，则宽度被设为系统定义的窗口边框宽度。
nHeight | 指定了插字符的高度（逻辑单位）。如果这个参数为0，则高度被设为系统定义的窗口边框高度。

说明：
这个函数为系统插字符创建一个实心矩形，并声明对插字符的所有权。插字符的形状可以是线条，也可以是方块。
参数nWidth和nHeight指定了插字符的宽度和高度（逻辑单位）；实际的宽度和高度（以像素为单位）依赖于映射模式。
使用SM_CXBORDER和SM_CYBORDER索引调用Windows的GetSystemMetrics函数可以获得系统的窗口边框宽度或高度。使用窗口边框的宽度和高度以确保插字符在高分辨率显示中能够看得见。
CreateSolidCaret成员函数自动销毁原来的插字符形状，如果有的话，而并不考虑哪个窗口拥有这个插字符。在被创建之后，插字符是隐藏的。要显示插字符，必须调用ShowCaret成员函数。
系统插字符是一种共享资源。CWnd只应在它具有输入焦点或处于活动状态时才创建插字符。在它失去输入焦点或变为非活动以前，它应当销毁插字符。

请参阅：
::DestroyCaret, ::GetSystemMetrics, CWnd::ShowCaret, ::CreateCaret


 CWnd::CWnd

CWnd( );

说明：
构造一个CWnd对象。必须在CreateEx或Create处于函数被调用以后才会创建Windows的窗口并与之连接。

请参阅：CWnd::CreateEx, CWnd::Create


 CWnd::Default

LRESULT Default( );

返回值：依赖于发出的消息。

说明：
调用缺省的窗口过程。缺省的窗口过程提供了对应用程序没有处理的任何窗口消息的缺省处理。这个处理函数确保每个消息都被处理。

请参阅：CWnd::DefWindowProc, ::DefWindowProc


 CWnd::DefWindowProc

virtual LRESULT DefWindowProc( UINT message, WPARAM wParam, LPARAMlParam );

返回值：依赖于发送的消息。

参数：
message | 指定了要处理的Windows消息。
wParam | 指定了与消息有关的附加信息。
lParam | 指定了与消息有关的附加信息。

说明：
这个函数调用缺省的窗口过程，提供了对应用程序没有处理的任何窗口消息的缺省处理。这个成员函数确保每个消息都被处理。它必须用与窗口过程接收到的参数相同的参数来调用。

请参阅：CWnd::Default, ::DefWindowProc


 CWnd::DeleteTempMap

static void PASCAL DeleteTempMap( );

说明：
这个函数被CWinApp对象的空闲时间处理函数自动调用。删除FromHandle成员函数所产生的任何临时CWnd对象。

请参阅：CWnd::FromHandle


 CWnd::DestroyWindow

virtual BOOL DestroyWindow( );

返回值：如果销毁了窗口，则返回非零值；否则返回0。

说明：
这个函数销毁一个与CWnd对象相连接的Windows窗口。DestroyWindow成员函数向窗口发送一个适当的消息，以使该窗口变为非激活的并移去输入焦点。它还销毁窗口的菜单，清除应用程序的队列，销毁定时器，清除剪贴板拥有权，并且如果CWnd对象位于剪贴板观察器链的顶部，还打断剪贴板观察器链。它向窗口发送WM_DESTROY消息和WM_NCDESTROY消息。它不销毁CWnd对象。
DestroyWindow是一个用于执行清除工作的占位符。因为DestroyWindow是一个虚拟函数，在ClassWizard中，它显示在任何CWnd的派生类中。但是即使你在自己的CWnd派生类中重载了这个函数，也不必调用DestroyWindow。如果在MFC代码中没有调用DestroyWindow，并且你希望调用它的话，必须在自己的代码中调用它。
例如，假定你在CView的派生类中重载了DestroyWindow。由于MFC的源代码在任何CFrameWnd的派生类中都没有调用DestroyWindow，因此除非你调用了它，否则你重载的DestroyWindow不会被调用。
如果该窗口是其它窗口的父窗口，当父窗口被销毁时，这些子窗口将被自动销毁。DestroyWindow成员函数首先销毁子窗口，然后销毁本窗口。
DestroyWindow成员函数也销毁CDialog::Create创建的无模式对话框。如果要被销毁的CWnd是一个子窗口并且没有设置WS_EX_NOPARENTNOTIFY风格，则WM_PARENTNOTIFY消息将被发送到父窗口。

请参阅：CWnd::OnDestroy, CWnd::Detach, ::DestroyWindow


 CWnd::Detach

HWND Detach( );

返回值：指向Windows对象的HWND句柄。

说明：将一个Windows的句柄从CWnd对象上分离并返回这个句柄。

请参阅：CWnd::Attach


 CWnd::DlgDirList

int DlgDirList( LPTSTR lpPathSpec, int nIDListBox, int nIDStaticPath, UINTnFileType );

返回值：如果函数成功，则返回非零值；否则返回0。

参数：
lpPathSpec | 指向一个以null结尾的字符串，其中包含了路径或文件名。DlgDirList修改这个字符串，它必须足够长，能够容纳改变后的内容。更多的信息参见后面的说明部分。
nIDListBox | 指定了列表框的标识符。如果nIDListBox为0，DlgDirList假定不存在列表框，因此不作填充。
nIDStaticPath指定了用于显示当前驱动器和目录的静态文本控件的标识符。如果nIDStaticPath为0，则DlgDirList假定没有这样的文本控件。nFileType指定了要显示的文件的属性。它可以是下列值的组合：
DDL_READWRITE | 可读写的数据文件，没有其它属性。
DDL_READONLY | 只读文件
DDL_HIDDEN | 隐藏文件
DDL_SYSTEM | 系统文件
DDL_DIRECTORY | 目录
DDL_ARCHIVE | 档案
DDL_POSTMSGS | LB_DIR 标志。如果设置了LB_DIR标志，Windows将DlgDirList产生的消息放入应用程序的队列，否则，它们被直接发送到对话框过程。
DDL_DRIVES | 驱动器。如果设置了DDL_DRIVES标志，就会自动设置DDL_EXCLUSIVE标志。因此，要创建包括驱动器和文件的目录列表，你必须两次调用DlgDirList：第一次使用DDL_DRIVES标志，第二次使用列表中其它标志。
DDL_EXCLUSIVE | 不相容的位。如果设置了这个位，则只列出指定类型的文件；否则列出普通文件和指定类型的文件。

说明：
这个函数用文件或目录列表来填充一个列表框。DlgDirList向列表框发送LB_RESETCON_TENT和LB_DIR消息。它用与lpPathSpec指定的路径匹配的所有文件的名字填充nIDListBox指定的列表框。
lpPathSpec参数具有如下形式：
[drive:] [[\u]directory[\idirectory]...\u] [filename]
在这个例子中，drive是驱动器字母，directory是有效的目录名，filename是有效的文件名，它必须至少包含一个通配符。通配符是一个问号（？），它意味着与任何字符匹配，还有星号（*），它意味着与任意个数的字符匹配。
如果你为lpPathSpec指定了一个0长度的字符串，或者你只指定了目录名却没有包含任何文件描述，则字符串将变为“*.*”。
如果lpPathSpec中包括了驱动器和/或目录名，则在填充列表框之前，当前驱动器和目录将被改变到设定的驱动器和目录。由nIDStaticPath指定的文本控件也被更新为新的驱动器和/或目录名。
在列表框被填充以后，lpPathSpec将被更新为去掉驱动器和/或目录部分的路径。

请参阅：CWnd::DlgDirListComboBox, ::DlgDirList


 CWnd::DlgDirListComboBox

int DlgDirListComboBox( LPTSTR lpPathSpec, int nIDComboBox, intnIDStaticPath, UINT nFileType );

返回值：
指明了该函数的结果。如果建立了一个列表框，即使是空的列表框，则返回一个非零值。返回值为0则意味着输入字符串中不包含有效的查找路径。

参数：
lpPathSpec | 指向一个以null结尾的字符串，其中包含了路径或文件名。DlgDirList修改这个字符串，它必须足够长，能够容纳改变后的内容。更多的信息参见后面的说明部分。
nIDComboBox | 指定了对话框中组合框的标识符。如果nIDComboBox为0，DlgDirListComboBox假定不存在组合框，因此不作填充。
nIDStaticPath | 指定了用于显示当前驱动器和目录的静态文本控件的标识符。如果nIDStaticPath为0，则DlgDirListComboBox假定没有这样的文本控件。
nFileType指定了要显示的文件的属性。它可以是下列值的组合：
DDL_READWRITE | 可读写的数据文件，没有其它属性。
DDL_READONLY | 只读文件
DDL_HIDDEN | 隐藏文件
DDL_SYSTEM | 系统文件
DDL_DIRECTORY | 目录
DDL_ARCHIVE | 档案
DDL_POSTMSGS | CB_DIR标志。如果设置了CB_DIR标志，Windows将DlgDirListComboBox产生的消息放入应用程序的队列，否则，它们被直接发送到对话框过程。
DDL_DRIVES | 驱动器。如果设置了DDL_DRIVES标志，就会自动设置DDL_EXCLUSIVE标志。因此，要创建包括驱动器和文件的目录列表，你必须两次调用DlgDirListComboBox：第一次使用DDL_DRIVES标志，第二次使用列表中其它标志。
DDL_EXCLUSIVE | 不相容的位。如果设置了这个位，则只列出指定类型的文件；否则列出普通文件和指定类型的文件。

说明：
这个函数用文件或目录列表来填充一个组合框中的列表框。DlgDirListComboBox向组合框发送CB_RESETCONTENT和CB_DIR消息。它用与lpPathSpec指定的路径匹配的所有文件的名字填充nIDComboBox指定的组合框。
lpPathSpec参数具有如下形式：
[drive:][[\u]directory[\idirectory]...\u][filename]
在这个例子中，drive是驱动器字母，directory是有效的目录名，filename是有效的文件名，它必须至少包含一个通配符。通配符是一个问号（？），它意味着与任何字符匹配，还有星号（*），它意味着与任意个数的字符匹配。
如果你为lpPathSpec指定了一个0长度的字符串，或者你只指定了目录名却没有包含任何文件描述，则字符串将变为“*.*”。
如果lpPathSpec中包括了驱动器和/或目录名，则在填充列表框之前，当前驱动器和目录将被改变到设定的驱动器和目录。由nIDStaticPath指定的文本控件也被更新为新的驱动器和/或目录名。
在列表框被填充以后，lpPathSpec将被更新为去掉驱动器和/或目录部分的路径。

请参阅：CWnd::DlgDirList, CWnd::DlgDirSelect, ::DlgDirListComboBox


 CWnd::DlgDirSelect

BOOL DlgDirSelect( LPTSTR lpString, int nIDListBox );

返回值：如果成功，则返回非零值；否则返回0。

参数：
lpString | 指向一个缓冲区，用于获取列表框的当前选择。
nIDListBox | 指定了对话框中列表框的整数ID。

说明：
这个函数获取列表框的当前选择。它假定列表框已经被DlgDirList成员函数所填充并且选择项是一个驱动器字母，一个文件或一个目录名。
DlgDirSelect成员函数将选择项拷贝到lpString所指定的缓冲区。如果没有选择项，则不改变lpString。
DlgDirSelect向列表框发送LB_GETCURSEL和LB_GETTEXT消息。不允许从列表框返回多于一个文件名。列表框不能是多选列表框。

请参阅：
CWnd::DlgDirList, CWnd::DlgDirListComboBox, CWnd::DlgDirSelectComboBox, ::DlgDirSelectEx


 CWnd::DlgDirSelectComboBox

BOOL DlgDirSelectComboBox( LPTSTR lpString, int nIDComboBox );

返回值：如果成功，则返回非零值；否则返回0。

参数：
lpString | 指向一个缓冲区，用于获取选择的路径。
nIDComboBox | 指定了对话框中组合框的整数ID。

说明：
这个函数获取组合框中列表框的当前选择。它假定列表框已经被DlgDirListComboBox成员函数所填充并且选择项是一个驱动器字母、一个文件或一个目录名。
DlgDirSelectComboBox成员函数将选择项拷贝到lpString所指定的缓冲区。如果没有选择项，则不改变lpString。
DlgDirSelectComboBox向组合框发送CB_GETCURSEL和CB_GETTEXT消息。
不允许从组合框返回多于一个文件名。

请参阅：CWnd::DlgDirListComboBox, ::DlgDirSelectComboBoxEx


 CWnd::DoDataExchange

virtual void DoDataExchange( CDataExchange* pDX );

参数：
pDX 指向CDataExchange对象的指针。

说明：
框架调用这个函数以交换并校验对话框数据。
永远不要直接调用这个函数。它是由UpdateData成员函数所调用的。可调用UpdateData函数以初始化对话框控件或从对话框获取数据。
当你从CDialog继承应用程序特有的对话框类时，如果你想要利用框架的自动数据交换和校验功能，你需要重载这个成员函数。ClassWizard将为你编写这个成员函数的重载版本，包含了对话框数据交换（DDX）和校验（DDV）全局函数调用所需的“数据映射”。
要自动生成这个函数的重载版本，首先用对话框编辑器创建一个对话框资源，然后继承一个应用程序特有的对话框类。然后调用ClassWizard并用它来把变量、数据和校验范围与新对话框的不同控件关联起来。ClassWizard将写入重载的DoDataExchange，其中包含了数据映射。下面是ClassWizard生成的DDX/DDV代码块的例子：
void CPenWidthsDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CPenWidthsDlg)
DDX_Text(pDX, IDC_THIN_PEN_WIDTH, m_nThinWidth);
DDV_MinMaxInt(pDX, m_nThinWidth, 1, 20);
DDX_Text(pDX, IDC_THICK_PEN_WIDTH, m_nThickWidth);
DDV_MinMaxInt(pDX, m_nThickWidth, 1, 20);
//}}AFX_DATA_MAP
}
ClassWizard将维护\\{{和\\}}分解符之内的代码。你不应该修改这些代码。
重载的DoDataExchange成员函数必须在源文件的宏语句之前。
有关ClassWizard生成的DDX_和DDV_宏的更多信息参见技术注释26。

请参阅：CWnd::UpdateData


 CWnd::DragAcceptFiles

void DragAcceptFiles( BOOL bAccept = TRUE );

参数：
bAccept 指明是否接收拖放文件的标志。

说明：
使用CWnd指针，在应用程序的CWinApp::InitInstance函数中，在一个窗口的内部调用这个成员函数，以指明你的主窗口和所有的子窗口是否接收从Windows的文件管理器拖放的文件。
只有将bAccept参数设为TRUE并调用了DragAcceptFiles函数的窗口才将它标识为能够处理Windows的WM_DROPFILES消息。例如，在MDI应用程序中，如果在调用DragAcceptFiles函数的时候使用了CMDIFrameWnd窗口指针，则只有CMDIFrameWnd窗口得到WM_DROPFILES消息。这个消息将不会被发送到所有打开的CMDIChildWnd窗口。要使CMDIChildWnd窗口能够接收这个消息，你必须用CMDIChildWnd指针调用DragAcceptFiles函数。
要终止接收拖放文件，则调用这个成员函数并令bAccept等于FALSE。

请参阅：::DragAcceptFiles, WM_DROPFILES


 CWnd::DrawMenuBar

void DrawMenuBar( );

说明：
重画菜单条。如果在Windows创建窗口以后菜单条发生了改变，则应调用这个函数以画出改变了的菜单条。

请参阅： ::DrawMenuBar


 CWnd::EnableScrollBar

BOOL EnableScrollBar( int nSBFlags, UINT nArrowFlags = ESB_ENABLE_BOTH );

返回值：
如果箭头被允许或禁止，如指定的那样，则返回非零值。否则为0，指明箭头已经处于要求的状态，或者发生了错误。

参数：
nSBFlags指定了滚动条类型。可以是下列值之一：
· | SB_BOTH | 允许或禁止窗口的水平和垂直滚动条的箭头。
· | SB_HORZ | 允许或禁止窗口的水平滚动条的箭头。
· | SB_VERT | 允许或禁止窗口的垂直滚动条的箭头。
nArrowFlags指定滚动条箭头是被允许还是禁止，以及哪个箭头将被允许或禁止。可以是下列值之一：
· | ESB_ENABLE_BOTH | 允许滚动条的两个箭头（缺省值）。
· | ESB_DISABLE_LTUP | 禁止水平滚动条的左箭头或垂直滚动条的上箭头。
· | ESB_DISABLE_RTDN | 禁止水平滚动条的右箭头或垂直滚动条的下箭头。
· | ESB_DISABLE_BOTH | 禁止滚动条的两个箭头。

说明：允许或禁止滚动条的一个或两个箭头。

请参阅：CWnd::ShowScrollBar, CScrollBar::EnableScrollBar


 CWnd::EnableScrollBarCtrl

void EnableScrollBarCtrl( int nBar, BOOL bEnable = TRUE );

参数：
nBar | 滚动条标识符。
bEnable | 指定滚动条是要被禁止还是允许。

说明：
调用这个函数以允许或禁止窗口的滚动条。如果窗口拥有同类的滚动条控件，则该滚动条被使用；否则将使用窗口自己的滚动条。

请参阅：CWnd::GetScrollBarCtrl


 CWnd::EnableToolTips

BOOL EnableToolTips( BOOL bEnable );

返回值：如果允许工具提示，则返回TRUE；否则返回FALSE。

参数：
bEnable 指定工具提示控件是要被允许还是禁止。如果是TRUE则允许该控件；如果是FALSE则禁止该控件。

说明：
调用这个成员函数以允许给定窗口的工具提示。重载OnToolHitTest函数，为窗口提供TOOLINFO结构。
注意 有些窗口，如CToolBar，提供OnToolHitTest的内建实现。
有关这个结构的更多信息参见Win32 SDK程序员参考中的TOOLINFO。
要为你的子控件显示工具提示，仅调用EnableToolTips是不够的，除非父窗口是从CFrameWnd继承的。这是因为CFrameWnd提供了TTN_NEEDTEXT通知的缺省处理函数。如果你的父窗口不是从CFrameWnd继承的，这意味着，如果它是一个对话框或格式视图，则你的子控件的工具提示将不会正确显示，除非你提供了工具提示通知TTN_NEEDTEXT的缺省处理函数。
用EnableToolTips为窗口提供的缺省工具提示没有相关的文本。为了获得用于显示工具提示的文本，在显示工具提示窗口之前，将向工具提示控件的父窗口发送一个TTN_NEEDTEXT通知。如果这个消息没有处理函数，为TOOLTIPTEXT结构的pszText成员分配一些值，则将不会为工具提示显示文本。

请参阅：CWnd::CancelToolTips, CWnd::OnToolHitTest, CToolBar, TOOLINFO


 CWnd::EnableWindow

BOOL EnableWindow( BOOL bEnable = TRUE );

返回值：
指明了调用EnableWindow成员函数之前窗口的状态。如果窗口原来是禁止的，则返回非零值。如果窗口原来是允许的，或者发生了错误，则返回0。

参数：
bEnable 指定是把窗口允许还是禁止。如果这个参数为TRUE，则窗口被允许。如果参数为FALSE，则窗口将被禁止。

说明：
允许或禁止鼠标和键盘输入。当禁止输入时，类似鼠标点击和击键之类的输入将被忽略。当允许输入时，窗口将处理所有输入。
如果允许状态发生变化，则在函数返回之前将发送WM_ENABLE消息。
如果被禁止，则所有的子窗口都被禁止。尽管没有向它们发送WM_ENABLE消息。
在窗口被激活之前必须允许窗口。例如，如果应用程序正显示一个无模式对话框，并且禁止了它的主窗口，则在对话框被销毁之前，主窗口必须被允许。否则，另一个窗口将获得输入焦点并被激活。如果子窗口被禁止，当Windows试图确定哪个窗口将得到鼠标消息时，它将被忽略。
在缺省情况下，窗口在被创建的时候是允许的。应用程序可以在Create或CreateEx成员函数中指定WS_DISABLED风格以创建一个最初就禁止的窗口。在窗口被创建以后，应用程序也可以利用EnableWindow成员函数来允许或禁止窗口。
应用程序可以用这个函数来允许或禁止对话框中的控件。被禁止的控件不能接收输入焦点，用户也不能访问它。

请参阅：::EnableWindow, CWnd::OnEnable


 CWnd::EndModalLoop

void EndModalLoop( int nResult );

参数：
nResult 包含了要返回到RunModalLoop的调用者的值。

说明：
调用这个成员函数以结束对RunModalLoop的调用。nResult参数被传给RunModalLoop的返回值。

请参阅：CWnd::RunModalLoop, CWnd::ContinueModal


 CWnd::EndPaint

void EndPaint( LPPAINTSTRUCT lpPaint );

参数：
lpPaint 指向一个PAINTSTRUCT结构，其中包含了BeginPaint成员函数接收到的绘图信息。

说明：
标记了给定窗口的绘图过程的结束。每个被调用的BeginPaint成员函数都需要有一个对对应的EndPaint成员函数，仅在完成绘图操作以后。
如果BeginPaint成员函数隐藏了插字符，则EndPaint在屏幕上恢复插字符。

请参阅：CWnd::BeginPaint, ::EndPaint, CPaintDC


 CWnd::ExecuteDlgInit

BOOL ExecuteDlgInit( LPCTSTR lpszResourceName );
BOOL ExecuteDlgInit( LPVOID lpResource );

返回值：如果执行了一个对话框资源，则返回TRUE；否则返回FALSE。

参数：
lpszResourceName | 指向一个以null结尾的字符串的指针，指定了资源的名字。
lpResource | 指向资源的指针。

说明：
调用这个成员函数以初始化对话框资源。
ExecuteDlgInit将使用与执行模块绑在一起的资源，或者是其它来源的资源。要实现这个目的，ExecuteDlgInit通过调用AfxFindResourceHandle来找到一个资源句柄。如果你的MFC应用程序没有使用共享DLL（MFCx0[U][D].DLL），那么AfxFindResourceHandle调用AfxGetResourceHandle，该函数返回可执行程序中当前资源的句柄。如果你的MFC应用程序使用了MFCx0[U][D].DLL，AfxFindResourceHandle遍历整个共享的CDynLinkLibrary对象列表以及扩展DLL以查找正确的资源句柄。

请参阅：CDialog::OnInitDialog, ::WM_INITDIALOG


 CWnd::FilterToolTipMessage

void FilterToolTipMessage( MSG* pMsg );

参数：
pMsg 执行工具提示消息的指针。

说明：
这个成员函数被框架调用，用以显示与工具条上的按钮相关的工具提示信息。通常它是在PreTranslateMessage函数内调用的。
当框架没有为你调用这个函数时，主动调用它。

请参阅：CWnd::OnToolHitTest


 CWnd::FindWindow

static CWnd* PASCAL FindWindow( LPCTSTR lpszClassName, LPCTSTRlpszWindowNa- me );

返回值：
标识了具有指定的类名或窗口名的窗口。如果没有找到这样的窗口，则返回NULL。
返回的CWnd*值可能是临时的，不能被保存以供将来使用。

参数：
lpszClassName | 指向一个以null结尾的字符串，指定了窗口类（一个WNDCLASS结构）的名字。如果lpClassName为NULL，则所有的类名都匹配。
lpszWindowName | 指向一个以null结尾的字符串，指定了窗口的名字（窗口的标题）。如果lpWindowName为NULL，所有的窗口名都匹配。

说明：
返回顶层的CWnd，其窗口类是由lpszClassName，其窗口名或标题是lpszWindowName给定的。这个函数不搜索子窗口。

请参阅：::FindWindow


 CWnd::FlashWindow

BOOL FlashWindow( BOOL bInvert );

返回值：如果在调用FlashWindow成员函数之前窗口是激活的，则返回非零值；否则返回0。

参数：
bInvert 指定CWnd是要闪烁还是返回它的原始状态。如果bInvert为TRUE，则CWnd从一种状态闪烁到另一种状态。如果bInvert为FALSE，则窗口返回它的原始状态（可以是活动或非活动的）。

说明：
使给定窗口闪烁一次。要实现连续的闪烁，则应该创建一个系统定时器，并反复调用FlashWindow。使CWnd闪烁意味着改变它的标题条的外观，就像CWnd从非活动状态改变到活动状态，或反之（非活动状态的标题条改变到活动标题条；活动标题条改变到非活动标题条）。
通常，窗口被闪烁以通知用户它需要被注意，但是它当前不具有输入焦点。
仅当窗口得到了输入焦点并且不再需要闪烁时，bInvert才应被设为FALSE，在等待输入焦点的时候，应当在对这个函数的连续调用中将它设为TRUE。
对于最小化窗口，这个函数总是返回非零值。如果窗口是最小化的，FlashWindow只是简单地闪烁窗口的图标，对于最小化窗口bInvert会被忽略。

请参阅：::FlashWindow


 CWnd::FromHandle

static CWnd* PASCAL FromHandle( HWND hWnd );

返回值：
当给定了窗口的句柄时，这个函数返回一个CWnd对象的指针。如果CWnd对象没有与这个句柄相连接，则创建一个临时的CWnd对象并将它与句柄连接。这个指针可能是临时的，不能被保存以供将来使用。

参数：
hWnd 一个Windows窗口的HWND句柄。

请参阅：CWnd::DeleteTempMap


 CWnd::FromHandlePermanent

static CWnd* PASCAL FromHandlePermanent( HWND hWnd );

返回值：指向一个CWnd对象的指针。

参数：
hWnd 一个Windows窗口的HWND句柄。

说明：
当给定了一个窗口的句柄时，这个函数返回指向一个CWnd对象的指针。如果CWnd对象没有与这个句柄连接，则返回NULL。
这个函数与FromHandle不同，它不生成临时对象。

请参阅：CWnd::FromHandle


 CWnd::GetActiveWindow

static CWnd* PASCAL GetActiveWindow( );

返回值：
返回活动窗口，如果在被调用时没有活动窗口，则返回NULL。这个指针可能是临时的，不能被保存以供将来使用。

说明：
这个函数获得活动窗口的指针。活动窗口或者是拥有当前输入焦点的窗口，或者是用SetActiveWindow成员函数激活的窗口。

请参阅：CWnd::SetActiveWindow, ::GetActiveWindow


 CWnd::GetCapture

static CWnd* PASCAL GetCapture( );

返回值：
标识了捕获鼠标的窗口。如果没有窗口捕获鼠标则返回NULL。
返回值可能是临时的，不能被保存以供将来使用。

说明：
这个函数获得捕获了鼠标的窗口。在一个给定的时刻只能有一个窗口捕获鼠标。当调用了SetCapture成员函数之后，窗口将接收鼠标捕获。这个窗口将接收所有的鼠标输入，不管光标是否位于它的边界内。

请参阅：CWnd::SetCapture, ::GetCapture


 CWnd::GetCaretPos

static CPoint PASCAL GetCaretPos( );

返回值：返回一个CPoint对象，包含了插字符位置的坐标。

说明：
这个函数获得插字符当前位置的客户区坐标，并且通过CPoint返回。
插字符的位置是用CWnd窗口的客户区坐标给出的。

请参阅：::GetCaretPos


 CWnd::GetCheckedRadioButton

int GetCheckedRadioButton( int nIDFirstButton, int nIDLastButton );

返回值：被选中的单选按钮的ID，如果没有选中任何项，则返回0。

参数：
nIDFirstButton | 指定了按钮组中第一个单选按钮的整数标识符。
nIDLastButton | 指定了按钮组中最后一个单选按钮的整数标识符。

说明：获得指定的按钮组中当前被选中的单选按钮的ID。

请参阅：CWnd::CheckRadioButton


 CWnd::GetClientRect

void GetClientRect( LPRECT lpRect ) const;

参数：
lpRect 指向一个RECT结构或一个CRect对象，用于接收客户区坐标。left和top成员将被设为0。right和bottom成员将包含了窗口的宽度和高度。

说明：
这个函数将CWnd的客户区的客户坐标拷贝到lpRect指向的结构中。客户坐标指定了客户区的左上角和右下角。由于客户坐标是相对于CWnd客户区的左上角的，因此左上角的坐标是（0,0）。

请参阅：CWnd::GetWindowRect, ::GetClientRect


 CWnd::GetClipboardOwner

static CWnd* PASCAL GetClipboardOwner( );

返回值：
如果这个函数执行成功，则返回拥有剪贴板的窗口。否则，返回NULL。返回的指针可能是临时的，不能被保存以供将来使用。

说明：
这个函数获得剪贴板的当前拥有者。
即使剪贴板当前没有拥有者，它也可以包含数据。

请参阅：CWnd::GetClipboardViewer, ::GetClipboardOwner


 CWnd::GetClipboardViewer

static CWnd* PASCAL GetClipboardViewer( );

返回值：
如果这个函数执行成功，则返回当前负责显示剪贴板的窗口；否则返回NULL（例如，如果现在没有观察器）。
返回的指针可能是临时的，不能被保存以供将来使用。

说明：这个函数获得剪贴板观察器链中的第一个窗口。

请参阅：CWnd::GetClipboardOwner, ::GetClipboardViewer


 CWnd::GetControlUnknown

LPUNKNOWN GetControlUnknown( );

返回值：
返回CWnd对象所代表的OLE控件的IUnknown接口的指针。如果这个对象不代表一个OLE控件，则返回值为NULL。

说明：
调用这个函数以获得未知OLE控件的指针。你不应该释放这个IUnknown指针。通常，你必须使用它来访问控件的指定接口。
GetControlUnknown返回的接口指针没有被加入引用计数。不要对指针调用
IUnknown::Release，除非你原来对它调用了IUnknown::AddRef。

请参阅：IUnknown::Release, IUnknown::QueryInterface


 CWnd::GetCurrentMessage

static const MSG* PASCAL GetCurrentMessage( );

返回值：
返回一个指向MSG结构的指针，该结构中包含了窗口当前处理的消息。只应在OnMessage消息处理函数内部调用。


 CWnd::GetDC

CDC* GetDC( );

返回值：
如果调用成功，则返回CWnd客户区的设备环境；否则，返回NULL。这个指针可能是临时的，不能被保存以供将来使用。

说明：
这个函数获得一个指针，指向一个客户区的公用的、属于类的或者私有的设备环境，依赖于为CWnd指定的类风格。对于公用的设备环境，GetDC每次获得设备环境时都给它赋予缺省值。对于属于类的或者私有的设备环境，GetDC保持原来的属性不变。在随后的图形设备接口（GDI）函数中可以使用设备环境以在客户区中绘图。
除非设备环境属于一个窗口类，否则在绘图之后必须调用ReleaseDC成员函数以释放设备环境。由于在同一时刻只有五个公用设备环境可供使用，因此如果释放设备环境时失败，可能导致其它应用程序不能访问设备环境。
如果在注册窗口类的时候，在WNDCLASS的风格中指定了CS_CLASSDC，CS_OWNDC或CS_PARENTDC，则GetDC成员函数将返回属于CWnd类的设备环境。

请参阅：
CWnd::GetDCEx, CWnd::ReleaseDC, CWnd::GetWindowDC, ::GetDC, CClientDC


 CWnd::GetDCEx

CDC* GetDCEx( CRgn* prgnClip, DWORD flags );

返回值：如果函数调用成功，则返回指定窗口的设备环境；否则返回NULL。

参数：
prgnClip 标识了一个裁剪区域，可能与客户窗口的可视区域组合。
flags可以是下列值之一：
· | DCX_CACHE | 由缓存而不是OWNDC或CLASSDC窗口返回一个设备环境。该标志覆盖CS_OWNDC和CS_CLASSDC。
· | DCX_CLIPCHILDREN | 不包括此CWnd窗口下的所有子窗口的可见区域。
· | DCX_CLIPSIBLINGS | 不包括此CWnd窗口之上的所有兄弟窗口的可见区域。
· | DCX_EXCLUDERGN | 在返回的设备环境的可见区域中不包括prgnClip标识的裁剪区域。
· | DCX_INTERSECTRGN | 返回的设备环境的可见区域与prgnClip所标识的裁剪区域重叠。
· | DCX_LOCKWINDOWUPDATE | 即使调用了会影响此窗口的LockWindowUpdate也允许在窗口内绘图。这个值用于在跟踪时绘图。
· | DCX_PARENTCLIP | 使用父窗口的可见区域并忽略父窗口的WS_CLIPCHILDR- EN和WS_PARENTDC风格。这个值将设备环境的原点设为CWnd窗口的左上角。
· | DCX_WINDOW | 返回与窗口矩形而不是客户矩形相对应的设备环境。

说明：
这个函数获得CWnd窗口的设备环境句柄。这个设备环境可以在随后的GDI函数中使用，用于在客户区中绘图。
这个函数是GetDC函数的扩展，使应用程序能够更多地控制一个窗口的设备环境如何或是否被裁剪。
除非设备环境属于一个窗口类，否则在绘图后必须调用ReleaseDC成员函数以释放设备环境。由于在同一时刻仅有五个公用的设备环境可供使用，因此如果释放设备环境时失败，则可能导致其它应用程序不能使用设备环境。
为了获得在缓存中的设备环境，应用程序必须指定DCX_CACHE。如果没有指定DCX_CACHE，并且窗口既不是CS_OWNDC也不是CS_CLASSDC，则这个函数返回NULL。
如果在注册窗口类的时候在WNDCLASS结构中指定了CS_CLASSDC，CS_OWNDC或CS_PARENTDC风格，则GetDCEx将返回具有指定特征的设备环境。
有关这些特征的更多信息参见“Win32 SDK”文档中WNDCLASS结构的描述。

请参阅：
CWnd::BeginPaint, CWnd::GetDC, CWnd::GetWindowDC, CWnd::ReleaseDC, ::GetDCEx


 CWnd::GetDescendantWindow

CWnd* GetDescendantWindow( int nID, BOOL bOnlyPerm = FALSE ) const;

返回值：指向一个CWnd对象的指针，如果没有找到子窗口，则返回NULL。

参数：
nID | 指定了要获取的控件或子窗口的标识符。
bOnlyPerm | 指定了返回的窗口是否可以是临时的。如果为TRUE，则只能返回永久性的窗口；如果为FALSE，则该函数可以返回临时窗口。有关临时窗口的更多信息参见技术注释3。

说明：
调用这个函数以找到给定的ID所指定的后代窗口。这个成员函数搜索整个子窗口树，并不仅是直接子窗口。

请参阅：
CWnd::GetParentFrame, CWnd::IsChild, CWnd::GetDlgItem


 CWnd::GetDesktopWindow

static CWnd* PASCAL GetDesktopWindow( );

返回值：标识了Windows的桌面窗口。这个指针可能是临时的，因此不能被保存以供将来使用。

说明：
这个函数返回Windows的桌面窗口。桌面窗口覆盖整个屏幕，并且所有的图标和其它窗口都画在它上面。

请参阅：::GetDesktopWindow


 CWnd::GetDlgCtrlID

int GetDlgCtrlID( ) const;

返回值：如果函数调用成功，则返回CWnd子窗口的整数标识符；否则返回0。

说明：
返回任何子窗口的窗口或控件ID值，并不仅是对话框的控件。由于顶层窗口没有ID值，因此如果CWnd是一个顶层窗口，则这个函数的返回值是没有意义的。

参见 ::GetDlgCtrlID


 CWnd::GetDlgItem

CWnd* GetDlgItem( int nID ) const;
void CWnd::GetDlgItem( int nID, HWND* phWnd ) const;

返回值：
指向给定的控件或子窗口的指针。如果没有控件具有nID给出的整数ID，则返回NULL。
返回的指针可能是临时的，不能被保存以供将来使用。

参数：
nID | 指定了要获取的控件或子窗口的标识符。
phWnd | 指向子窗口的指针。

说明：
这个函数获得对话框或其它窗口中指定控件或子窗口的指针。返回的指针通常被强制转换为nID所标识的控件类型。

请参阅：
CWnd::GetWindow, CWnd::GetDescendantWindow, CWnd::GetWindow, ::GetDlgItem


 CWnd::GetDlgItemInt

UINT GetDlgItemInt( int nID, BOOL* lpTrans = NULL, BOOL bSigned = TRUE )const;

返回值：
指定了对话框项的文本经转换的值。由于0是一个有效的返回值，必须用lpTrans来检测错误。如果要求返回带符号的值，则将它强制转换为整数类型。
如果经转换的值大于32767（对于带符号数）或65535（对于无符号数），则这个函数返回0。
当有错误发生时，比如遇到了非数字字符或超出了最大数范围，GetDlgItemInt将0拷贝的lpTrans指向未知。如果没有错误发生，则lpTrans接收到一个非零值。如果lpTrans为NULL，GetDlgItemInt不提出错误警告。

参数：
nID | 指定了要转换的对话框控件的整数标识符。
lpTrans | 指向要接收转换标志的布尔。
bSigned | 指定要接收的值是否带符号。

说明：
这个函数接收nID标识的控件的文本。它将给定对话框中指定控件的文本转换为整数，跳过文本开始部分的空格并转换十进制数字。当它到达文本的末尾或者遇到非数字字符时就停止转换。
如果bSigned为TRUE，GetDlgItemInt在文本的开始部分检测有没有减号（－），并将文本转换为带符号数。否则，它生成一个无符号值。
它向控件发送一个WM_GETTEXT消息。

请参阅：CWnd::GetDlgItemText, ::GetDlgItemInt


 CWnd::GetDlgItemText

int GetDlgItemText( int nID, LPTSTR lpStr, int nMaxCount ) const;
int GetDlgItemText( int nID, CString& rString ) const;

返回值：
指定了被拷贝到缓冲区中的实际字节数，不包括结尾的null字符。如果没有拷贝文本，则返回0。

参数：
nID | 指定了要获取其标题的控件的整数标识符。
lpStr | 指向要接收控件的标题或文本的缓冲区。
nMaxCount | 指定了要拷贝到lpStr的字符串的最大长度（以字节为单位）。如果字符串比nMaxCount要长，它将被截断。
rString | 对一个CString对象的引用。

说明：
调用这个函数以获得与对话框中的控件相关的标题或文本。GetDlgItemText成员函数将文本拷贝到lpStr指向的位置并返回拷贝的字节的数目。

请参阅：
CWnd::GetDlgItem, CWnd::GetDlgItemInt, ::GetDlgItemText, WM_GETTEXT


 CWnd::GetDSCCursor

IUnknown * GetDSCCursor( );

返回值：指向数据源控件定义的游标的指针。MFC会为这个指针调用AddRef函数。

说明：
调用这个函数以获取游标的指针，该游标是用数据源控件的DataSource，UserName，Password和SQL属性定义的。可以使用返回的指针来设置复杂数据绑定控件的ICursor属性，如数据绑定网格控件。数据源控件将不会被激活，直到第一个绑定控件请求了游标。这种情况可能发生在调用GetDSCCursor时，也可能是被MFC绑定管理器激活的。在这两种情况下，你都可以调用GetDSCCursor，然后用返回的IUnknown指针调用Release。被激活后数据源控件会试图与数据源相连接。返回的指针应该在下面的上下文中使用：
BOOL CMyDlg::OnInitDialog()
{
// 找到对话框中的子控件
CWnd* pDSC = GetDlgItem(IDC_REMOTEDATACONTROL);
CDBListBox* pList = (CDBListBox*)
GetDlgItem(IDC_DBLISTBOX);
// 告诉MFC的绑定管理器我们已经把DISPID 3
// 与数据源控件相绑定了。
pList->BindProperty(0x3, pDSC);
// 告诉列表框把哪个域作为绑定字段。
pList->SetBoundColumn(_T("CourseID"));
// 告诉列表框把它的内容转移到哪个游标和字段。
pList->SetListField(_T("CourseID"));
IPUNKNOWN *pcursor = pDSC->GetDSCCursor();
...
if (!pcursor)
{
// 指针没有成功地分配，返回FALSE。
return FALSE;
}
// 成功地返回了指针
pList->SetRowSource(pcursor);
...
pcursor->Release();
return TRUE;
}

请参阅：CWnd::BindDefaultProperty, CWnd::BindProperty


 CWnd::GetExStyle

DWORD GetExStyle( ) const;

返回值：窗口的扩展风格。

请参阅：CWnd::GetStyle, ::GetWindowLong


 CWnd::GetFocus

static CWnd* PASCAL GetFocus( );

返回值：
指向拥有当前焦点的窗口的指针，如果没有焦点窗口，则返回NULL。这个指针可能是临时的，不能被保存以供将来使用。

说明：这个函数获得指向当前拥有输入焦点的CWnd的指针。

请参阅：
CWnd::GetActiveWindow, CWnd::GetCapture, CWnd::SetFocus, ::GetFocus


 CWnd::GetFont

CFont* GetFont( ) const;

返回值：
指向一个CFont对象的指针，其中包含了当前的字体。
这个指针可能是临时的，不能被保存以供将来使用。

说明：获得窗口的当前字体。

请参阅：CWnd::SetFont, WM_GETFONT, CFont


 CWnd::GetForegroundWindow

static CWnd* PASCAL GetForegroundWindow( );

返回值：指向前台窗口的指针。这可能是一个临时的CWnd对象。

说明：
返回指向前台窗口（用户正在其中工作的窗口）的指针。前台窗口仅适用于顶层窗口（框架窗口或对话框）。

请参阅：CWnd::SetForegroundWindow


 CWnd::GetIcon

HICON GetIcon( BOOL bBigIcon ) const;

返回值：指向一个图标的句柄。如果不成功，则返回NULL。

参数：
bBigIcon 如果为TRUE，则指定了32×32像素的图标；如果为FALSE，则指定了16×16像素的图标。

说明：
调用这个函数以获得大图标（32×32）或小图标（16×16）的句柄，由bBigIcon指定。

请参阅：CWnd::SetIcon


 CWnd::GetLastActivePopup

CWnd* GetLastActivePopup( ) const;

返回值：
标识了最近激活的弹出窗口。如果遇到了下列情况，则返回值可能是这个窗口本身：
·该窗口是最后被激活的
·这个窗口不拥有任何弹出窗口
·这个窗口不是顶层窗口或被其它窗口所拥有
这个指针可能是临时的，不能被保存以供将来使用。

说明：这个函数确定CWnd拥有的哪个弹出窗口是最后被激活的。

请参阅：::GetLastActivePopup


 CWnd::GetMenu

CMenu* GetMenu( ) const;

返回值：
标识了菜单。如果CWnd没有菜单，则返回值为NULL。如果CWnd是子窗口，则返回值没有定义。
返回的指针可能是临时的，不能被保存以供将来使用。

说明：这个函数获得窗口的菜单指针。这个函数能对子窗口使用，因为它们没有菜单。

请参阅：::GetMenu


 CWnd::GetNextDlgGroupItem

CWnd* GetNextDlgGroupItem( CWnd* pWndCtl, BOOL bPrevious = FALSE )const;

返回值：
如果这个成员函数执行成功，则返回一组中前一个（或下一个）控件的指针。返回的指针可能是临时的，不能被保存以供将来使用。

参数：
pWndCtl | 标识了用作搜索起点的控件。
bPrevious | 指定这个函数如何在对话框的控件组中搜索。如果为TRUE，则该函数搜索组中的前一个控件；如果为FALSE，则搜索组中的下一个控件。

说明：
这个函数在对话框的控件组内搜索前一个（或下一个）控件。一组控件从用WS_GROUP风格创建的控件开始，而以最后一个没有用WS_GROUP风格创建的控件结束。
在缺省情况下，GetNextDlgGroupItem成员函数返回组中下一个控件的指针。如果pWndCtl指定了组中的第一个控件，并且bPrevious为TRUE，则GetNextDlgGroupItem返回组中最后一个控件的指针。

请参阅：CWnd::GetNextDlgTabItem, ::GetNextDlgGroupItem


 CWnd::GetNextDlgTabItem

CWnd* GetNextDlgTabItem( CWnd* pWndCtl, BOOL bPrevious = FALSE ) const;

返回值：
如果这个成员函数执行成功，则返回指向具有WS_TABSTOP风格的前一个（或下一个）控件。
返回的指针可能是临时的，不应保存以供将来使用。

参数：
pWndCtl | 标识了用作搜索起点的控件。
bPrevious | 指定这个函数如何在对话框中搜索。如果为TRUE，则这个函数在对话框中搜索前一个控件；如果为FALSE，则搜索下一个控件。

说明：
这个函数获得用WS_TABSTOP风格创建的第一个控件，并且它位于指定的控件之前（或之后）。

请参阅：CWnd::GetNextDlgGroupItem, ::GetNextDlgTabItem


 CWnd::GetNextWindow

CWnd* GetNextWindow( UINT nFlag = GW_HWNDNEXT ) const;

返回值：
如果这个成员函数执行成功，则返回窗口管理器中的下一个（或前一个）窗口。返回的指针可能是临时的，不应保存以供将来使用。

参数：
nFlag 指定了该函数是返回下一个窗口还是前一个窗口的指针。它可以是GW_HWNDNEXT，表明返回窗口管理器列表中CWnd对象之后的窗口，或者是GW_HWNDPREV，返回窗口管理器列表中的前一个窗口。

说明：
这个函数在窗口管理器列表中搜索下一个（或前一个）窗口。窗口管理器的列表中包含了所有顶层窗口、它们的相关子窗口和任意子窗口的子窗口。
如果CWnd是一个顶层窗口，则函数搜索下一个（或前一个）顶层窗口；如果CWnd是一个子窗口，则函数搜索下一个（或前一个）子窗口。

请参阅： ::GetNextWindow


 CWnd::GetOpenClipboardWindow

static CWnd* PASCAL GetOpenClipboardWindow( );

返回值：如果函数执行成功，则返回当前打开剪贴板的窗口的句柄；否则返回NULL。

说明：这个函数获得当前打开剪贴板的窗口的句柄。

请参阅：
CWnd::GetClipboardOwner, CWnd::GetClipboardViewer, CWnd::OpenClipboard, ::GetOpenClipboardWindow


 CWnd::GetOwner

CWnd* GetOwner( ) const;

返回值：指向CWnd对象的指针。

说明：
这个函数获得窗口的拥有者的指针。如果窗口没有拥有者，则缺省地返回父窗口对象的指针。注意在拥有者和被拥有者之间的关系与父子关系在几个重要方面的差别。例如，具有父窗口的窗口被限制在父窗口的客户区内，但是被拥有的窗口可以被画在桌面上的任何位置。
这个函数中的拥有概念与GetWindow中的拥有概念不同。

请参阅：CWnd::GetParent, CWnd::SetOwner


 CWnd::GetParent

CWnd* GetParent( ) const;

返回值：
如果这个成员函数执行成功，则返回父窗口指针；否则返回值为NULL，表明发生了错误或没有父窗口。
返回的指针可能是临时的，不应保存以供将来使用。

说明：
调用这个函数以获得子窗口的父窗口（如果有）的指针。GetParent函数返回直接父窗口的指针。与此不同，GetParentOwner函数返回不是子窗口（不具有WS_CHILD风格）的最直接父窗口或拥有者窗口的指针。如果你在子窗口中还有子窗口，则GetParent和GetParentOwner返回不同的结果。

请参阅：
CWnd::GetParentOwner, CWnd::GetOwner, CWnd::SetOwner, CWnd::SetParent, ::GetParent


 CWnd::GetParentFrame

CFrameWnd* GetParentFrame( ) const;

返回值：如果成功，则返回框架窗口的指针；否则返回NULL。

说明：
调用这个函数以获得父框架窗口。这个成员函数向上搜索父窗口链直到找到一个CFrameWnd（或其派生类）对象。

请参阅：
CWnd::GetDescendantWindow, CWnd::GetParent, CFrameWnd::GetActiveView


 CWnd::GetParentOwner

CWnd* GetParentOwner( ) const;

返回值：
指向一个CWnd对象的指针。如果CWnd对象没有与一个句柄连接，则创建一个临时的CWnd对象并与之连接。指针可能是临时的，不应保存以供将来使用。

说明：
调用这个成员函数以获得子窗口的父窗口或拥有这窗口的指针。GetParentOwner返回不是子窗口（不具有WS_CHILD风格）的最直接父窗口或拥有者窗口的指针。可以用SetOwner来设置当前的拥有者窗口。在缺省情况下，一个窗口的父窗口就是它的拥有者。
与此不同，GetParent函数返回直接父窗口的指针，而不管它是否是一个子窗口。如果你在子窗口内还有子窗口，则GetParen和GetParentOwner返回不同的结果。

请参阅：
CWnd::GetParent, CWnd::GetOwner, CWnd::SetOwner, CWnd::SetParent, ::GetParent


 CWnd::GetProperty

void GetProperty( DISPID dwDispID, VARTYPE vtProp, void* pvProp )const;

参数：
dwDispID | 标识要获取的属性。这个值通常是由组件廊提供的。
vtProp | 指定了要获取的属性类型。可能的取值参见COleDispatchDriver::InvokeHelper中的说明部分。
pvProp | 变量的地址，该变量将接收属性值。它必须与vtProp指定的类型匹配。

说明：
调用这个成员函数以获得dwDispID所指定的OLE控件属性。GetProperty通过pvProp返回该值。
注意 这个函数只能在代表OLE控件的CWnd对象内调用。

请参阅：CWnd::InvokeHelper, COleDispatchDriver, CWnd::CreateControl


 CWnd::GetSafeHwnd

HWND GetSafeHwnd( ) const;

返回值：
返回窗口的句柄。如果CWnd对象没有与一个窗口连接或它使用的CWnd指针为NULL，则返回NULL。


 CWnd::GetSafeOwner

CWnd* PASCAL GetSafeOwner( CWnd* pParent, HWND* pWndTop );

返回值：指向给定窗口的安全拥有者的指针。

参数：
pParent | 指向父窗口的CWnd对象的指针。
pWndTop | 指向当前位于顶部的窗口的指针。可能为NULL。

说明：
调用这个成员函数以获得拥有者窗口，可以被用于对话框或其它模式窗口。安全拥有者是pParentWnd的第一个不是子窗口的父窗口。如果pParentWnd为NULL，则线程的主窗口（可以通过AfxGetMainWnd获得）被用于找到一个拥有者。
注意 框架本身利用这个函数以确定没有指定拥有者的对话框和属性表的正确拥有者窗口。

请参阅：AfxGetMainWnd


 CWnd::GetScrollBarCtrl

virtual CScrollBar* GetScrollBarCtrl( int nBar ) const;

返回值：一个子滚动条控件。如果没有，则返回NULL。

参数：
nBar指定了滚动条的类型。这个参数可以取如下值：
· | SB_HORZ | 获得水平滚动条的位置。
· | SB_VERT | 获得垂直滚动条的位置。

说明：
调用这个成员函数以获取指定的子滚动控件或分隔窗口的指针。
如果滚动条是在创建窗口的时候指定了WS_HSCROLL或WS_VSCROLL位而创建的，则这个成员函数不对滚动条进行操作。CWnd对这个函数的实现仅简单地返回NULL。派生类，例如CView，实现了描述的功能。

请参阅：CWnd::EnableScrollBarCtrl


 CWnd::GetScrollInfo

BOOL GetScrollInfo( int nBar, LPSCROLLINFO lpScrollInfo, UINT nMask =SIF_ALL );

返回值：如果这个消息获得了任何值，则返回值为TRUE；否则返回值为FALSE。

参数：
nBar指定了滚动条是一个控件还是窗口的非客户区的一部分。如果它是非客户区的一部分，则nBar还指明滚动条是水平的、垂直的，还是都有。它必须是下列值之一：
· | SB_BOTH | 指定了窗口的水平和垂直滚动条。
· | SB_HORZ | 指定了窗口的水平滚动条。
· | SB_VERT | 指定了窗口的垂直滚动条。
lpScrollInfo | 指向一个SCROLLINFO结构的指针。有关这个结构的更多信息参见Win32 SDK程序员参考。
nMask | 指定了要获取的滚动条参数。缺省值指定了SIF_PAGE，SIF_POS，SIF_TRACKPOS和SIF_RANGE的组合。有关nMask取值的更多信息参见SCROLLINFO。

说明：
调用这个函数以获得SCROLLINFO结构为滚动条维护的信息。GetScrollInfo使应用程序能够使用32位的滚动位置值。
SCROLLINFO结构中包含了有关滚动条的信息，包括最小和最大滚动位置，页面大小以及滚动块的位置。有关改变这个结构的缺省值的信息参见《Win32SDK程序员参考》中的SCROLLINFO结构主题。
指明滚动条位置的MFC Windows消息处理函数CWnd::OnHScroll和CWnd::OnVScroll只提供位置数据中的16位。GetScrollInfo和SetScrollInfo提供了滚动条位置数据的32位值。因此，应用程序在处理CWnd::OnHScroll 或CWnd::OnVScroll的时候可以调用GetScrollInfo以获得32位的滚动条位置数据。

请参阅：
CScrollBar::GetScrollInfo, CWnd::SetScrollInfo, CWnd::SetScrollPos, CWnd::OnVScroll, CWnd::OnHScroll, SCROLLINFO


 CWnd::GetScrollLimit

int GetScrollLimit( int nBar );

返回值：如果函数成功，则返回指定了滚动条的最大位置的值；否则返回0。

参数：
nBar指定了滚动条的类型。这个参数可以是下列值之一：
· | SB_HORZ | 获得水平滚动条的滚动限制值。
· | SB_VERT | 获得垂直滚动条的滚动限制值。

说明：调用这个成员函数以获得滚动条的最大滚动位置。

请参阅：CScrollBar::GetScrollLimit


 CWnd::GetScrollPos

int GetScrollPos( int nBar ) const;

返回值：如果成功，则返回滚动条中滚动块的当前位置；否则返回0。

参数：
nBar指定了要检查的滚动条。这个参数可以是下列值之一：
· | SB_HORZ | 获取水平滚动条的位置。
· | SB_VERT | 获取垂直滚动条的位置。

说明：
这个函数获得滚动条的滚动块的当前位置。当前位置是一个相对值，依赖于当前的滚动范围。例如，如果滚动范围是50到100，并且滚动块位于滚动条的中间，则当前位置为75。

请参阅：::GetScrollPos, CScrollBar::GetScrollPos


 CWnd::GetScrollRange

void GetScrollRange( int nBar, LPINT lpMinPos, LPINT lpMaxPos ) const;

参数：
nBar指定了要检查的滚动条。这个参数可以是下列值之一：
· | SB_HORZ | 获得水平滚动条的当前位置。
· | SB_VERT | 获得垂直滚动条的当前位置。
lpMinPos | 指向一个整数变量，该变量将接收最小位置。
lpMaxPos | 指向一个整数变量，该变量将接收最大位置。

说明：
这个函数将指定的滚动条的当前最大和最小滚动位置拷贝到lpMinPos和lpMaxPos所指向的位置。如果CWnd没有滚动条，则GetScrollRange成员函数将0拷贝到lpMinPos和lpMaxPos。
标准滚动条的范围是0到100。滚动条控件的缺省范围是空的（两个值都是0）。

请参阅：::GetScrollRange


 CWnd::GetStyle

DWORD GetStyle( ) const;

返回值：窗口的风格。

请参阅：::GetWindowLong


 CWnd::GetSystemMenu

CMenu* GetSystemMenu( BOOL bRevert ) const;

返回值：
如果bRevert为FALSE，则标识了控制菜单的一个拷贝；如果为TRUE，则返回值没有定义。
返回的指针可能是临时的，不能被保存以供将来使用。

参数：
bRevert 指定要采取的动作。如果bRevert为FALSE，则GetSystemMenu返回当前使用的控制菜单的一个拷贝的句柄。这个拷贝最初与控制菜单一样，但是可以被修改。如果bRevert为TRUE，GetSystemMenu将控制菜单复位到原来的状态。以前控制菜单可能发生的变化都被销毁。这时返回值没有定义。

说明：
这个函数允许应用程序访问控制菜单，用于拷贝和修改。
任何不使用GetSystemMenu以生成它自己的控制菜单拷贝的窗口将接收标准的控制菜单。
GetSystemMenu成员函数返回的指针可以在CMenu::AppendMenu，CMenu::InsertMenu或CMenu::ModifyMenu中使用，用于改变控制菜单。
控制菜单中最初包含了用不同的ID标识的项，如SC_CLOSE，SC_MOVE和SC_SIZE。控制菜单中的项产生WM_SYSCOMMAND消息。所有的预定义控制菜单项都具有大于0xF000的ID值。如果应用程序在控制菜单中加入了项，则必须使用小于F000的ID值。
Windows可能自动使标准控制菜单上的项变灰。CWnd可以通过响应WM_INITMENU消息来执行它自己的选中或变灰操作，这个消息是在任何菜单要被显示之前发送的。

请参阅：
CMenu::AppendMenu, CMenu::InsertMenu, CMenu::ModifyMenu, ::GetSystemMenu


 CWnd::GetTopLevelFrame

CFrameWnd* GetTopLevelFrame( ) const;

返回值：
标识了窗口的顶层框架窗口。
返回的指针可能是临时的，不应保存以供将来使用。

说明：
调用这个成员函数以获得窗口的顶层框架窗口，如果有的话。如果CWnd没有与之相连的窗口，或者它的顶层父窗口不是CFrameWnd的派生类对象，则这个函数返回NULL。

请参阅：CWnd::GetTopLevelOwner, CWnd::GetTopLevelParent


 CWnd::GetTopLevelOwner

CWnd* GetTopLevelOwner( ) const;

返回值：标识了顶层窗口。返回的指针可能是临时的，不能被保存以供将来使用。

说明：
调用这个函数以获得顶层窗口。顶层窗口是桌面的子窗口。如果CWnd没有与之相连的窗口，则这个函数返回NULL。

请参阅：CWnd::GetTopLevelFrame, CWnd::GetTopLevelParent


 CWnd::GetTopLevelParent

CWnd* GetTopLevelParent( ) const;

返回值：
标识了窗口的顶层父窗口。
返回的指针可能是临时的，不应保存以供将来使用。

说明：
调用这个函数以获得窗口的顶层父窗口。GetTopLevelParent与GetTopLevelFrame和GetTopLevelOwner类似，但是，它忽略被设为当前拥有者窗口的值。

请参阅：
CWnd::GetTopLevelOwner, CWnd::GetTopLevelFrame, CWnd::GetOwner, CWnd::SetOwner


 CWnd::GetTopWindow

CWnd* GetTopWindow( ) const;

返回值：
标识了CWnd的子窗口链表中的顶层子窗口。如果没有子窗口，则返回值为NULL。
返回值可能是临时的，不应保存以供将来使用。

说明：
这个函数搜索属于CWnd的顶层子窗口。如果CWnd没有子窗口，这个函数返回NULL。

请参阅：::GetTopWindow


 CWnd::GetUpdateRect

BOOL GetUpdateRect( LPRECT lpRect, BOOL bErase = FALSE );

返回值：
指定了更新区域的状态。如果更新区域不为空，则返回值为非零值；否则为0。如果lpRect参数被设为NULL，且存在更新区域，则返回非零值；否则为0。

参数：
lpRect | 指向一个CRect对象或RECT结构，将被用于接收包含更新区域的客户坐标。将这个参数设为NULL以确定在CWnd中是否存在更新区域。如果lpRect为NULL，且存在更新区域，则GetUpdateRect成员函数返回非零值；如果不存在，则返回0。这就提供了一种方法，用来确定WM_PAINT是否是一个无效区域引起的。在Windows 3.0或更早的版本中不要将这个参数设为NULL。
bErase | 指定更新区域中的背景是否要被擦除。

说明：
这个函数获得完全封闭更新区域的最小矩形的坐标。如果CWnd是用CS_OWNDC创建的，并且映射模式不是MM_TEXT，则GetUpdateRect成员函数用逻辑坐标给出该矩形；否则GetUpdateRect用客户坐标给出矩形。如果不存在更新区域，则GetUpdateRect将矩形设为空（所有的坐标都被设为0）。
bErase成员指定了GetUpdateRect是否要擦除更新区域的背景。如果bErase为TRUE，并且更新区域不为空，则背景将被擦除。为了擦除背景，GetUpdateRect发送一条WM_ERASEBKGND消息。
BeginPaint成员函数获得的更新矩形与GetUpdateRect成员函数获得的矩形相同。
BeginPaint成员函数自动使更新区域有效，因此任何在BeginPaint之后立即调用的GetUpdateRect都返回一个空的更新区域。

请参阅：
CWnd::BeginPaint, ::GetUpdateRect, CWnd::OnPaint, CWnd::RedrawWindow


 CWnd::GetUpdateRgn

int GetUpdateRgn( CRgn* pRgn, BOOL bErase = FALSE );

返回值：指定了一个短整数标志，标识了结果区域的类型。该值可能为下列值之一：
· | SIMPLEREGION | 区域没有重叠边界。
· | COMPLEXREGION | 区域具有重叠边界。
· | NULLREGION | 区域中是空的。
· | ERROR | 没有创建区域。

参数：
pRgn | 标识了更新区域。
bErase | 指定了背景是否要被擦除，以及是否要画出子窗口的非客户区。如果该值为FALSE，则不作绘图操作。

说明：
这个函数在pRgn标识的区域中获得更新区域。区域的坐标是相对于左上角（客户坐标）的。
BeginPaint成员函数自动使更新区域有效，因此任何紧接在BeginPaint后面的GetUpdateRgn调用接收到空的更新区域。

请参阅：CWnd::BeginPaint, ::GetUpdateRgn


 CWnd::GetWindow

CWnd* GetWindow( UINT nCmd ) const;

返回值：
返回要求的窗口指针；如果没有，则返回NULL。
返回的指针可能是临时的，不应保存以供将来使用。

参数：
nCmd指定了CWnd和返回的窗口之间的关系。可以取下列值之一：
· | GW_CHILD | 标识了CWnd的第一个子窗口。
· | GW_HWNDFIRST | 如果CWnd是一个子窗口，则返回它的第一个兄弟窗口；否则返回列表中的第一个顶层窗口。
· | GW_HWNDLAST | 如果CWnd是一个子窗口，则返回最后一个兄弟窗口；否则返回列表中的最后一个顶层窗口。
· | GW_HWNDNEXT | 返回窗口管理器中的下一个窗口。
· | GW_HWNDPREV | 返回窗口管理器中的前一个窗口。
· | GW_OWNER | 标识了CWnd的拥有者。

请参阅：CWnd::GetParent, CWnd::GetNextWindow, ::GetWindow


 CWnd::GetWindowContextHelpId

DWORD GetWindowContextHelpId( ) const;

返回值：帮助上下文标识符。如果窗口没有帮助上下文，则返回0。

说明：调用这个函数以获得与窗口相关的帮助上下文标识符，如果有的话。


 CWnd::GetWindowDC

CDC* GetWindowDC( );

返回值：
如果这个函数成功，则返回给定窗口的显示环境；否则返回NULL。
返回的指针可能是临时的，不应保存以供将来使用。在每次成功地调用了GetWindowDC之后，必须调用ReleaseDC。

说明：
这个函数获得整个窗口的显示环境，包括标题条、菜单和滚动条。窗口的显示环境允许程序在CWnd的任何地方绘图，因为该环境的原点是在CWnd的左上角，而不是客户区的左上角。
每次获得环境的时候都给它赋以缺省的属性。以前的设置将会丢失。
GetWindowDC用于在CWnd的非客户区实现特殊的绘图效果。不推荐在任何窗口的非客户区绘图。
可以利用Windows的GetSystemMetrics函数来获得非客户区的不同部分的大小，如标题条、菜单和滚动条。
在绘图结束以后，必须调用ReleaseDC成员函数以释放显示环境。如果没有成功地释放显示环境，则可能会严重影响应用程序要求的绘图，因为在同一时刻能打开的显示设备环境的数目是有限的。

请参阅：
::GetSystemMetrics, CWnd::ReleaseDC, ::GetWindowDC, CWnd::GetDC, CWindowDC


 CWnd::GetWindowPlacement

BOOL GetWindowPlacement( WINDOWPLACEMENT* lpwndpl ) const;

返回值：如果函数执行成功，则返回非零值；否则返回0。

参数：
lpwndpl 指向一个WINDOWPLACEMENT结构，用于接收显示状态和位置信息。

说明：
这个函数获得窗口的显示状态和正常（复原的）、最小化和最大化的位置。
这个函数获得的WINDOWPLACEMENT结构中的flags成员总是0。如果CWnd是最大化的，则WINDOWPLACEMENT的showCmd成员为SW_SHOWMAXIMIZED。如果窗口是最小化的，则为SW_SHOWMINIMIZED；否则它为SW_SHOWNORMAL。

请参阅：CWnd::SetWindowPlacement, ::GetWindowPlacement


 CWnd::GetWindowRect

void GetWindowRect( LPRECT lpRect ) const;

参数：
lpRect 指向一个CRect对象或RECT结构，用于接收左上角和右下角的屏幕坐标。

说明：
这个函数将CWnd对象的边界矩形的大小拷贝到lpRect所指向的结构中。大小是用相对于显示器屏幕左上角的屏幕坐标给出的，其中包括了标题条，边框和滚动条的大小，如果有的话。

请参阅：
CWnd::GetClientRect, CWnd::MoveWindow, CWnd::SetWindowPos, ::GetWindowRect


 CWnd::GetWindowRgn

int GetWindowRgn( HRGN hRgn )const;

返回值：
返回值指定了该函数获得的区域的类型。可以是下列值之一：
· | NULLREGION | 区域为空。
· | SIMPLEREGION | 区域是一个简单的矩形。
· | COMPLEXREGION | 区域包括多于一个矩形。
· | ERROR | 发生了错误，区域没有受到影响。参数hRgn窗口区域的句柄。

参数：
hRgn 窗口区域的句柄。

说明：
调用这个成员函数以获得窗口的窗口区域。窗口区域确定了操作系统允许画出窗口的区域。操作系统不会在窗口区域之外显示窗口的任何部分。窗口的窗口区域的坐标是相对于窗口的的左上角的，不是窗口的客户区域。要设置窗口的窗口区域，调用CWnd::SetWindowRgn。

请参阅：CWnd::SetWindowRgn


 CWnd::GetWindowText

int GetWindowText( LPTSTR lpszStringBuf, int nMaxCount ) const;
void GetWindowText( CString& rString ) const;

返回值：
指定了要拷贝的字符串的长度，以字节为单位，不包括结尾的空字符。如果CWnd没有标题或标题为空，则为0。

参数：
lpszStringBuf | 指向要接收窗口标题的复制字符串的缓冲区。
nMaxCount | 指定了要拷贝的缓冲区的最大字符数目。如果字符串比nMaxCount指定的数目还要长，则被截断。
rString | 用于接收窗口标题的复制字符串的CString对象。

说明：
这个函数将CWnd的标题（如果有）拷贝到lpszStringBuf指向的缓冲区或者目的字符串rString。如果CWnd对象是一个控件，则GetWindowText成员函数将拷贝控件内的文本（而不是控件的标题）。这个成员函数会向CWnd对象发送一个WM_GETTEXT消息。

请参阅：
CWnd::SetWindowText, WM_GETTEXT, CWnd::GetWindowTextLength


 CWnd::GetWindowTextLength

int GetWindowTextLength( ) const;

返回值：指定了文本的长度，不包括任何结尾的空字符。如果不存在任何文本，则返回0。

说明：
返回CWnd的标题对象的长度。如果CWnd是一个控件，则GetWindowTextLength成员函数返回控件内文本的长度（而不是标题的长度）。这个成员函数会向CWnd对象发送一个WM_GETTEXTLENGTH消息。

请参阅：::GetWindowTextLength, WM_GETTEXTLENGTH, CWnd::GetWindowText


 CWnd::HideCaret

void HideCaret( );

说明：
隐藏插字符或将它从屏幕上清除。尽管插字符不再可见，但是它还可以用ShowCaret成员函数再次显示。隐藏插字符不会销毁它的当前形状。隐藏是累积的。如果HideCaret已经被调用了五次，在插字符能够被显示之前，必须调用ShowCaret成员函数五次。

请参阅：CWnd::ShowCaret, ::HideCaret


 CWnd::HiliteMenuItem

BOOL HiliteMenuItem( CMenu* pMenu, UINT nIDHiliteItem, UINT nHilite );

返回值：指定了是否要加亮显示菜单项。如果要加亮菜单项，则返回非零值；否则返回0。

参数：
pMenu | 标识了包含要加亮的菜单项的顶层菜单。
nIDHiliteItem | 指定了要加亮的菜单项，依赖于nHilite参数的值。
nHilite指定了是要加亮指定的菜单项，还是要清除其加亮显示状态。它可以是MF_HILITE或MF_UNHILITE与MF_BYCOMMAND或MF_BYPOSITION的组合。这些值可以用位或操作符OR组合起来。这些值具有如下含义：
· | MF_BYCOMMAND | 将nIDHiliteItem解释为菜单项ID（缺省解释）。
· | MF_BYPOSITION | 将nIDHiliteItem解释为零基偏移的菜单项。
· | MF_HILITE | 加亮显示该项。如果没有给定这个值，则清除菜单项的加亮状态。
· | MF_UNHILITE | 清除菜单项的加亮显示状态。

说明：
加亮显示一个顶层（菜单条）菜单项或清除其加亮显示状态。MF_HILITE和MF_UNHILITE标志仅能被用于这个成员函数；它们不能与CMenu::Modify- Menu成员函数一起使用。

请参阅：CMenu::ModifyMenu, ::HiliteMenuItem


 CWnd::Invalidate

void Invalidate( BOOL bErase = TRUE );

参数：
bErase 指定是否要擦除更新区域内的背景。

说明：
使CWnd的整个客户区无效。当产生下一个WM_PAINT消息时，客户区被标记为需要重画。也可以在产生WM_PAINT消息之前用ValidateRect或ValidateRgn成员函数使区域有效。
bErase参数指定了在处理更新区域的时候是否要擦除更新区域内的背景。如果bErase为TRUE，则当调用BeginPaint的时候，将擦除背景。如果bErase为FALSE，则背景保持不变。如果对于更新区域的任何部分bErase为TRUE，则整个区域的背景都会被擦除，而不仅是给定的部分。
每当CWnd的更新区域不为空，并且在应用程序的窗口消息队列中没有其它消息时，Windows就发送一条WM_PAINT消息。

请参阅：
CWnd::BeginPaint, CWnd::ValidateRect, CWnd::ValidateRgn, ::InvalidateRect


 CWnd::InvalidateRect

void InvalidateRect( LPCRECT lpRect, BOOL bErase = TRUE );

参数：
lpRect | 指向一个CRect对象或RECT结构，其中包含了要被加入更新区域的矩形（客户区坐标）。如果lpRect为NULL，则整个客户区都被加入更新区域。
bErase | 指定更新区域内的背景是否要被擦除。

说明：
这个函数将给定的客户区矩形加入CWnd更新区域，使该区域无效。无效的矩形与更新区域内的其它区域一起被标记为在发送下一条WM_PAINT消息时需要重画。无效的区域在更新区域内累积，直到发生下一次WM_PAINT调用，这个区域被处理为止，或者直到这个区域被ValidateRect或ValidateRgn成员函数标为有效为止。
bErase参数指定了在处理更新区域的时候是否要擦除更新区域内的背景。如果bErase为TRUE，则当调用BeginPaint函数的时候，将擦除背景。如果bErase为FALSE，则背景保持不变。如果对于更新区域的任何部分bErase为TRUE，则整个区域的背景都会被擦除，而不仅是给定的部分。
当CWnd的更新区域不为空，并且应用程序的窗口消息队列中没有其它消息时，Windows就发送一条WM_PAINT消息。

请参阅：
CWnd::BeginPaint, CWnd::ValidateRect, CWnd::ValidateRgn, ::InvalidateRect


 CWnd::InvalidateRgn

void InvalidateRgn( CRgn* pRgn, BOOL bErase = TRUE );

参数：
pRgn | 指向CRgn对象的指针，标识了要被加入更新区域的区域。这个区域被假定使用客户区坐标。如果这个参数为NULL，则整个客户区都被加入到更新区域。
bErase | 指定客户区内的背景是否要被擦除。

说明：
这个函数将给定的区域加入CWnd更新区域，使该区域无效。无效的区域与更新区域内的其它区域一起被标记，以便在发送下一条WM_PAINT消息时处理重画。无效的区域在更新区域内累积，直到发生下一次WM_PAINT调用，这个区域被处理为止，或者直到这个区域被ValidateRect或ValidateRgn成员函数标为有效为止。
bErase参数指定了在处理更新区域的时候是否要擦除更新区域内的背景。如果bErase为TRUE，则当调用BeginPaint的时候，将擦除背景。如果bErase为FALSE，则背景保持不变。如果对于更新区域的任何部分bErase为TRUE，则整个区域的背景都会被擦除，而不仅是给定的部分。
当CWnd的更新区域不为空，并且应用程序的窗口消息队列中没有其它消息时，Windows就发送一条WM_PAINT消息。
给定的区域必须是先前用一个区域函数创建的。

请参阅：
CWnd::BeginPaint, CWnd::ValidateRect, CWnd::ValidateRgn, ::InvalidateRgn


 CWnd::InvokeHelper

void InvokeHelper( DISPID dwDispID, WORD wFlags, VARTYPE vtRet, void* pvRet, const BYTE* pbParamInfo, ... );
throw( COleException );
throw( COleDispatchException );

参数：
dwDispID | 标识了要激活的方法或属性。这个值通常是由组件廊提供的。
wFlags | 描述了调用IDispatch::Invoke的上下文的标志。wFlags的可能取值参见《Win32 SDK OLE程序员参考》中的IDispatch::Invoke。
vtRet | 指定了返回值的类型。可能的取值参见COleDispatchDriver::InvokeHelper的说明部分。
pvRet | 将接收属性值或返回值的变量地址。它必须与vtRet指定的类型匹配。
pbParamInfo | 指向一个以null结尾的字节字符串，指定了pbParamInfo后面的参数的类型。可能的取值参见COleDispatchDriver::InvokeHelper的说明部分。参数的变量列表，属于pbParamInfo所指定的类型。

说明：
调用这个函数以激活dwDispID所指定的OLE控件的方法或属性，使用wFlags指定的上下文。pbParamInfo参数指定了传递给方法或属性的参数的类型。在句法定义中参数的变量列表用...来代表。
这个函数将参数转换为VARIANTARG值，然后对OLE控件调用IDispatch::Invoke方法。如果对IDispatch::Invoke的调用失败，这个函数将抛出一个异常。如果IDispatch::Invoke返回的SCODE（状态码）是DISP_E_EXCEPTION，则这个函数抛出一个COleException对象；否则它抛出一个COleDispatchException对象。
注意 这个函数只能在代表OLE控件的CWnd对象内调用。
有关在OLE控件容器中使用这个函数的更多信息参见联机的《Visual C++程序员指南》的文章“ActiveX控件容器：在ActiveX控件容器中编写ActiveX控件”。

请参阅：
CWnd::GetProperty, CWnd::SetProperty, COleDispatchDriver, CWnd::CreateControl


 CWnd::IsChild

BOOL IsChild( const CWnd* pWnd ) const;

返回值：描述函数的结果。若pWnd标识的窗口是CWnd的子窗口，则返回非零值；否则返回0。

参数：
pWnd 标识了要测试的窗口。

说明：
这个函数指明pWnd标识的窗口是否是CWnd的子窗口或直接后代窗口。如果CWnd原始弹出窗口到该子窗口的父窗口链中，则该子窗口是CWnd的直接后代窗口。

请参阅：::IsChild


 CWnd::IsDialogMessage

BOOL IsDialogMessage( LPMSG lpMsg );

返回值：
指明这个函数是否已处理了给定的消息。如果消息已被处理，则返回非零值；否则返回0。如果返回值为0，则调用基类的CWnd::PreTranslateMessage成员函数以处理这个消息。在CWnd::PreTranslateMessage成员函数的重载版本中的代码如下：
BOOL CMyDlg::PreTranslateMessage( msg )
{
if( IsDialogMessage( msg ) ) return TRUE;
else return CWnd::PreTranslateMessage( msg );
}

参数：
lpMsg 指向一个MSG结构，其中包含了要被检查的消息。

说明：
调用这个函数以确定给定的消息是否是一个无模式对话框的。如果是，则函数处理这个消息。当IsDialogMessage函数处理消息的时候，它检查键盘消息并将它转换为对应对话框的选择命令。例如，TAB键选择下一个控件或控件组，下箭头键选择组中的下一个控件。
你不能将一个已被IsDialogMessage处理的消息发送给Windows函数::TranslateMessage或::DispatchMessage，因为它已经被处理了。

请参阅：
::DispatchMessage, ::TranslateMessage, ::GetMessage, CWnd::PreTranslateMessage, ::IsDialogMessage


 CWnd::IsDlgButtonChecked

UINT IsDlgButtonChecked( int nIDButton ) const;

返回值：
如果给定的控件被选中，则返回非零值；如果没有选中，则返回0。只有单选按钮和复选按钮才能被选中。对于三态按钮，如果按钮状态不确定，返回值可以是2。对于按钮，这个函数返回0。

参数：
nIDButton 指定了按钮控件的整数标识符。

说明：
这个函数确定一个按钮控件的附加是否具有选中标记。如果按钮是三态控件，则这个函数确定它是变灰、被选中，或都不是。

请参阅：::IsDlgButtonChecked, CButton::GetCheck


 CWnd::IsIconic

BOOL IsIconic( ) const;

返回值：如果CWnd被最小化，则返回非零值；否则返回0。

说明：这个函数指明CWnd是否被最小化（图标化）。

请参阅：::IsIconic


 CWnd::IsWindowEnabled

BOOL IsWindowEnabled( ) const;

返回值：如果允许CWed，则返回非零值；否则返回0。

说明：指定了是否允许CWnd接收鼠标和键盘输入。

请参阅：::IsWindowEnabled


 CWnd::IsWindowVisible

BOOL IsWindowVisible( ) const;

返回值：
如果CWnd可见（被设值了WS_VISIBLE风格位，其父窗口可见），则返回非零值。因为返回值反映了WS_VISIBLE风格位的状态，因此即使CWnd被其它窗口完全遮住，返回值也可以是非零值。

说明：
这个函数确定给定窗口的视觉状态。
窗口具有在WS_VISIBLE风格位中指定的可视状态。当用ShowWindow成员函数设置了这个风格位时，将显示窗口，后来在窗口中的绘图也一直显示。
当窗口被其它窗口覆盖或被父窗口裁剪时，在具有WS_VISIBLE风格位的窗口内的绘图将不会显示。

请参阅：CWnd::ShowWindow, ::IsWindowVisible


 CWnd::IsZoomed

BOOL IsZoomed( ) const;

返回值：如果CWnd被最大化，则返回非零值；否则返回0。

说明：这个函数确定CWnd是否已被最大化。

请参阅：::IsZoomed


 CWnd::KillTimer

BOOL KillTimer( int nIDEvent );

返回值：
指定了函数的结果。如果事件已经被销毁，则返回值为非零值。如果KillTimer成员函数不能找到指定的定时器事件，则返回0。

参数：
nIDEvent 传递给SetTimer的定时器事件值。

说明：
销毁以前调用SetTimer创建的用nIDEvent标识的定时器事件。任何与此定时器有关的未处理的WM_TIMER消息都从消息队列中清除。

请参阅：CWnd::SetTimer, ::KillTimer


 CWnd::LockWindowUpdate

BOOL LockWindowUpdate( );

返回值：
如果函数执行成功，则返回非零值。如果失败或者已经使用LockWindowUpdate函数锁定了其它窗口，则返回0。

说明：
禁止在指定的窗口内绘图。被锁定的窗口不能被移动。在同一时刻只能有一个窗口被锁定。要解锁一个用LockWindowUpdate锁定的窗口，调用UnlockWindowUpdate。
如果拥有被锁定窗口（或者任何被锁定的子窗口）的应用程序调用了Windows的GetDC，GetDCEx或BeginPaint函数，则被调用的函数返回一个设备环境，其可视区域为空。直到应用程序调用UnlockWindowUpdate成员函数解锁了窗口，一直都会这样。
当窗口更新被锁定时，系统跟踪对与锁定窗口相关的设备环境所作的绘图操作的边界矩形。当重又允许绘图时，被锁定的窗口和它的子窗口中的这个区域将被设为无效，强制发送一条WM_PAINT消息以更新屏幕。如果当窗口更新被锁定时没有发生绘图，则没有任何区域被设为无效。
LockWindowUpdate成员函数不使给定的窗口不可见，也不清除WS_VISIBLE风格位。

请参阅：CWnd::GetDCEx, ::LockWindowUpdate


 CWnd::MapWindowPoints

void MapWindowPoints( CWnd* pwndTo, LPRECT lpRect ) const;
void MapWindowPoints( CWnd* pwndTo, LPPOINT lpPoint, UINT nCount ) const;

参数：
pwndTo | 标识了指定点要被转换到的窗口。如果这个参数为NULL，则该点被转换为屏幕坐标。
lpRect | 指定了要转换的点所在的矩形。这个函数的第一个版本仅在Windows 3.1和以后的版本中有效。
lpPoint | 执行POINT结构数组的指针，其中包含要转换的点。
nCount | 指定了lpPoint指向的数组中POINT结构的数目。

说明：这个函数将一系列点从CWnd的坐标空间转换（映射）到其它窗口的坐标空间。

请参阅：
CWnd::ClientToScreen, CWnd::ScreenToClient, ::MapWindowPoints


 CWnd::MessageBox

int MessageBox( LPCTSTR lpszText, LPCTSTR lpszCaption = NULL, UINT nType= MB_OK );

返回值：指定了函数的结果。如果没有足够的内存以创建消息框，则返回0。

参数：
lpszText | 指向一个CString对象或以null结尾的字符串，其中包含了要显示的信息。
lpszCaption | 指向一个CString对象或以null结尾的字符串，被用作消息框标题。如果lpszCaption为NULL，则将使用缺省的标题“Error”。
nType | 指定了消息框的内容和行为。

说明：
这个函数创建并显示一个窗口，其中包含了应用程序提供的消息和标题，加上预定义的图标和按钮的组合，这些定义在消息框风格列表中。使用全局函数AfxMessageBox代替这个成员函数来为你的应用程序实现消息框。
下面显示了可以被用在消息框中的不同的系统图标：
MB_ICONHAND，MB_ICONSTOP和MB_ICONERROR
MB_ICONQUESTION
MB_ICONEXCLAMATION和MB_ICONWARNING
MB_ICONASTERISK和MB_ICONINFORMATION

参阅 ::MessageBox, AfxMessageBox


 CWnd::ModifyStyle

BOOL ModifyStyle( DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0 );

返回值：如果成功地修改了风格，则返回非零值；否则返回0。

参数：
dwRemove | 指定了在修改风格时要清除的窗口风格。
dwAdd | 指定了在修改风格时要加入的窗口风格。
nFlags | 要传递给SetWindowPos的标志，如果不应调用SetWinowPos，则为0。缺省值为0。预设的标志列表参见说明部分。

说明：
调用这个成员函数以修改窗口的风格。要加入或清除的风格可以用位或操作符（|）来组合。有关可用窗口风格的信息参见《Win32 SDK程序员参考》中的“通用窗口风格”主题和::CreateWindow。
如果nFlags为非零值，则ModifyStyle调用Windows 的API函数::SetWindowPos，并将nFLags与下面的四个预定义值组合，以重画窗口：
· | SWP_NOSIZE | 保持当前大小。
· | SWP_NOMOVE | 保持当前位置。
· | SWP_NOZORDER | 保持当前的Z轴顺序。
· | SWP_NOACTIVATE | 不激活窗口。要修改窗口的扩展风格，参见ModifyStyleEx。

请参阅：
SetWindowPos, CWnd::ModifyStyleEx, General WindowStyles, ::SetWindowPos


 CWnd::ModifyStyleEx

BOOL ModifyStyleEx( DWORD dwRemove, DWORD dwAdd, UINT nFlags = 0 );

返回值：如果成功地修改了风格，则返回非零值；否则返回0。

参数：
dwRemove | 指定了在修改风格时要清除的窗口风格。
dwAdd | 指定了在修改风格时要加入的窗口风格。
nFlags | 要传递给SetWindowPos的标志，如果不应调用SetWinowPos，则为0。缺省值为0。预设的标志列表参见说明部分。

说明：
调用这个成员函数以修改窗口的扩展风格。要加入或清除的风格可以用位或操作符（|）来组合。有关可用的扩展窗口风格的信息参见《Win32 SDK程序员参考》中的“扩展窗口风格”主题和::CreateWindow。
如果nFlags为非零值，则ModifyStyleEx调用Windows 的API函数::SetWindowPos，并将nFLags与下面的四个预定义值组合，以重画窗口：
· | SWP_NOSIZE | 保持当前大小。
· | SWP_NOMOVE | 保持当前位置。
· | SWP_NOZORDER | 保持当前的Z轴顺序。
· | SWP_NOACTIVATE | 不激活窗口。要修改窗口的常规风格，参见ModifyStyle。

请参阅：CWnd::ModifyStyle, CreateWindowEx


 CWnd::MoveWindow

void MoveWindow( int x, int y, int nWidth, int nHeight, BOOL bRepaint = TRUE );
void MoveWindow( LPCRECT lpRect, BOOL bRepaint = TRUE );

参数：
x | 指定了CWnd的左边的新位置。
y | 指定了CWnd的顶部的新位置。
nWidth | 指定了CWnd的新宽度。
nHeight | 指定了CWnd的新高度。
bRepaint | 指定了是否要重画CWnd。如果为TRUE，则CWnd象通常那样在OnPaint消息处理函数中接收到一条WM_PAINT消息。如果这个参数为FALSE，则不会发生任何类型的重画操作。这应用于客户区、非客户区（包括标题条和滚动条）和由于CWnd移动而露出的父窗口的任何部分。当这个参数为FALSE的时候，应用程序必须明确地使CWnd和父窗口中必须重画的部分无效或重画。
lpRect | CRect对象或RECT结构，指定了新的大小和位置。

说明：
这个函数改变窗口的位置和大小。
对于顶层的CWnd对象，x和y参数是相对于屏幕的左上角的。对于子对象，它们是相对于父窗口客户区的左上角的。
MoveWindow函数发送一条WM_GETMINMAXINFO消息。处理这个消息时，CWnd得到一个改变最大和最小的窗口缺省值的机会。如果传递给MoveWindow成员函数的参数超过了这些值，则在WM_GETMINMAXINFO处理函数中可以用最小或最大值来代替这些值。

请参阅：CWnd::SetWindowPos, WM_GETMINMAXINFO, ::MoveWindow


 CWnd::OnActivate

afx_msg void OnActivate( UINT nState, CWnd* pWndOther, BOOL bMinimized );

参数：
nState指定CWnd是要被激活还是取消活动状态。它可以是下列值之一：
· | WA_INACTIVE | 窗口将被取消活动状态。
· | WA_ACTIVE | 窗口将通过不同于鼠标点击的某些方法激活（例如，用键盘接口选择窗口）。
· | WA_CLICKACTIVE | 窗口经鼠标点击而激活。
pWndOther | 指向要激活或取消活动状态的CWnd对象的指针。这个指针可以为NULL，也有可能是临时的。
bMinimized | 指定了要激活或取消活动状态的CWnd的最小化状态。如果值为TRUE，表明窗口是最小化的。如果该值为TRUE，则CWnd将被激活，否则将取消活动状态。

说明：
当CWnd对象被激活或取消活动状态时，框架调用这个成员函数。首先调用要取消活动状态的主窗口的OnActivate函数，然后调用要被激活的主窗口的OnActivate函数。
如果CWnd对象是被鼠标点击激活的，则它还将接收到对OnMouseActivate的调用。

注意：
框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_MOUSEACTIVATE, WM_NCACTIVATE, WM_ACTIVATE


 CWnd::OnActivateApp

afx_msg void OnActivateApp( BOOL bActive, HTASK hTask );

参数：
bActive | 指定了CWnd是要被激活还是被取消活动状态。TRUE意味着CWnd要被激活。FALSE意味着CWnd将失去活动状态。
hTask | 指定了任务句柄。如果bActive为TRUE，则该句柄标识了拥有被取消活动状态的CWnd对象的任务。如果bActive为FALSE，则该句柄标识了拥有被激活的CWnd对象的任务。

说明：
框架为被激活的任务的所有顶层窗口或被取消活动状态的任务的所有顶层窗口调用这个成员函数。

注意：
框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_ACTIVATEAPP


 CWnd::OnAmbientProperty

BOOL OnAmbientProperty( COleControlSite* pSite, DISPID dispid, VARIANT*pvar )

返回值：如果支持ambient属性，则返回TRUE；否则返回FALSE。

参数：
pSite | 指向请求ambient属性的空间的位置的指针。
dispid | 被请求的ambient属性的调度ID。
pvar | 指向调用者分配的VARIANT结构的指针，通过这个结构来返回ambient属性的值。

属性
框架调用这个成员函数以从包含OLE控件的窗口获得ambient属性值。重载这个函数以改变OLE控件容器向它的控件返回的缺省ambient属性值。任何没有被重载函数处理的ambient属性请求将被传递到基类的实现中。


 CWnd::OnAskCbFormatName

afx_msg void OnAskCbFormatName( UINT nMaxCount, LPTSTR lpszString );

参数：
nMaxCount | 指定了要拷贝的最大字节数目。
lpszString | 指向缓冲区的指针，格式名的拷贝将保存在此缓冲区中。

说明：
当剪贴板中包含了CF_OWNERDISPLAY格式（这意味着剪贴板的拥有者将显示剪贴板的内容）的数据句柄时，框架调用这个成员函数。剪贴板的拥有者将为它的格式提供名字。
重载这个函数并将CF_OWNERDISPLAY格式的名字拷贝到指定的缓冲区中，不超过指定的最大字节数目。

注意：
框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数(而不是你提供给这个函数的参数)。

请参阅：WM_ASKCBFORMATNAME


 CWnd::OnCancelMode

afx_msg void OnCancelMode( );

说明：
框架调用这个成员函数以通知CWnd取消内部模式。如果CWnd拥有焦点，则当对话框或消息框被显示时，它的OnCancelMode成员函数将被调用。这使CWnd拥有一个取消模式的机会，如鼠标捕获等。
缺省的实现通过调用Windows的ReleaseCapture来作响应。在你的派生类中重载这个函数以处理其它模式。

请参阅：CWnd::Default, ::ReleaseCapture, WM_CANCELMODE


 CWnd::OnCaptureChanged

afx_msg void OnCaptureChanged( CWnd* pWnd );

参数：
pWnd 指向获得鼠标捕获的窗口的指针。

说明：
框架调用这个函数以通知窗口，它已失去鼠标捕获状态。
即使窗口自己调用了::ReleaseCapture，它也会接收到这个消息。应用程序不应试图在响应这个消息的时候设置鼠标捕获。当它接收到这个消息的时候，如果有必要，窗口必须重画自身以响应新的鼠标捕获状态。
有关Windows的ReleaseCapture函数的信息参见《Win32 SDK程序员参考》。

注意：
框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_CAPTURECHANGED


 CWnd::OnChangeCbChain

afx_msg void OnChangeCbChain( HWND hWndRemove, HWND hWndAfter );

参数：
hWndRemove | 指定了要从剪贴板观察器链中清除的窗口句柄。
hWndAfter | 指定了剪贴板观察器链中要被清除的窗口后面的窗口的句柄。

说明：
框架为剪贴板观察器链中的每个窗口调用这个成员函数，以通知它有一个窗口将从链中清除。
每个接收到OnChangeCbChain的CWnd对象应该使用Windows的SendMessage函数以向剪贴板观察器链（由SetClipboardViewer返回的句柄）中的下一个窗口发送WM_CHANGECBCHAIN消息。如果链中的下一个窗口是hWndRemove，则hWndAfter指定的窗口变为下一个窗口，剪贴板消息将发送给它。

注意：
框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::ChangeClipboardChain, ::SendMessage


 CWnd::OnChar

afx_msg void OnChar( UINT nChar, UINT nRepCnt, UINT nFlags );

参数：
nChar | 包含了键的字符代码值。
nRepCnt | 包含了重复计数，当用户按下键时重复的击键数目。
nFlags包含了扫描码，键暂态码，以前的键状态以及上下文代码，如下面的列表所示：
值 | 含义
0--15 | 指定了重复计数。其值是用户按下键时重复的击键数目
16--23 | 指定了扫描码。其值依赖于原始设备制造商（OEM）
24 | 指明该键是否是扩展键，如增强的101或102键盘上右边的ALT或CTRL键如果它是个扩展键，则该值为1；否则，值为0
25--28 | Windows内部使用
29 | 指定了上下文代码。如果按键时ALT键是按下的，则该值为1；否则，值为0
30 | 指定了以前的键状态。如果在发送消息前键是按下的，则值为1；如果键是弹起的，则值为0
31 | 指定了键的暂态。如果该键正被放开，则值为1，如果键正被按下，则该值为0

说明：
当击键被转换为非系统字符时，框架调用这个成员函数。这个函数是在OnKeyUp成员函数之前，OnKeyDown成员之后调用的。OnChar包含了被按下或放开的键值。
由于按键和产生的OnChar调用不必是一一对应的，因此nFlags中的信息对应用程序通常是没有用的。NFlags中的信息仅对最近在OnChar之前调用的OnKeyUp成员函数或OnKeyDown成员函数有用。
对于IBM增强型101和102键键盘，键盘的主体部分的增强键是右边的ALT和CTRL键；还有数字键盘左侧的INS，DEL，HOME，END，PAGE UP，PAGE DOWN以及箭头键等；以及数字键盘上的斜杠（/）和ENTER键。其它键盘可能会支持nFlags中的扩展键位。

注意：
框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_CHAR, WM_KEYDOWN, WM_KEYUP


 CWnd::OnCharToItem

afx_msg int OnCharToItem( UINT nChar, ClistBox* pListBox, UINT nIndex );

返回值：
框架调用这个函数以指定应用程序响应调用时的动作。返回值为-2则表明应用程序处理选择项的所有方面，并且不需要列表框采取进一步动作。返回值为-1则表明列表框应完成缺省动作以响应击键。返回值为0或更大的值则指出列表框中一个项的从0开始的索引值，并指出列表框应为在给定项上的击键完成缺省动作。

参数：
nChar | 指定了用户按下的键的值。
PListBox | 指定了列表框指针，可能是临时的。
NIndex | 指定了当前的插字符位置。

说明：
当具有LBS_WANTKEYBOARDINPUT风格的列表框响应WM_CHAR消息时向它的拥有者发送一个WM_CHARTOITEM消息，则调用这个函数。

注意：
框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_CHAR, WM_CHARTOITEM


 CWnd::OnChildActivate

afx_msg void OnChildActivate( );

说明：
如果CWnd对象是一个多文档界面（MDI）的子窗口，则当用户点击窗口的标题条或窗口被激活、移动或改变大小时，框架调用这个函数。

请参阅：CWnd::SetWindowPos, WM_CHILDACTIVATE


 CWnd::OnChildNotify

virtual BOOL OnChildNotify( UINT message, WPARAM wParam, LPARAMlParam, LRESULT* pLResult );

返回值：如果窗口负责处理发送给它的父窗口的消息，则返回非零值；否则返回0。

参数：
message | 发送给父窗口的Windows消息。
wParam | 与消息相关的wparam。
lParam | 与消息相关的lparam。
pLResult | 指向父窗口过程返回值的指针。如果没有返回值，则这个指针可以是NULL。

说明：
当窗口的父窗口接收到这个窗口有关的通知消息时，就调用这个成员函数。
永远不要直接调用这个成员函数。
这个成员函数的缺省实现返回0，这意味着父窗口将处理消息。重载这个成员函数以扩展响应通知消息的方式。


 CWnd::OnClose

afx_msg void OnClose( );

说明：
框架调用这个函数，作为CWnd或应用程序要被关闭的信号。缺省的实现调用DestroyWindow。

请参阅：CWnd::DestroyWindow, WM_CLOSE


 CWnd::OnCommand

virtual BOOL OnCommand( WPARAM wParam, LPARAM lParam );

返回值：如果应用程序要处理这个消息，则返回非零值；否则返回0。

参数：
wParam | wParam的低位字标识了菜单项或控件的命令ID。如果消息是控件发出的，则wParam的高位字标识了通知消息。如果消息是加速键发出的，则高位字为1。如果消息是菜单发出的，则高位字为0。
lParam | 如果消息是控件发出的，则标识了发出消息的控件；否则lParam为0。

说明：
当用户从菜单中选择了一项，或者子控件发出一个通知消息，或者转换了一个加速键的击键事件，框架就调用这个成员函数。
OnCommand处理控件通知和ON_COMMAND入口的消息映射，并调用相应的成员函数。
在你的派生类中重载这个函数以处理WM_COMMAND消息。除非调用了基类的OnCommand，否则不应处理消息映射。

注意：
框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_COMMAND, CCmdTarget::OnCmdMsg


 CWnd::OnCompacting

afx_msg void OnCompacting( UINT nCpuTime );

参数：
nCpuTime 指定了当前Windows压缩内存所耗费的CPU时间与执行其它操作所耗费的时间的比例。例如，8000h代表有50%的CPU时间用于压缩内存。

说明：
当Windows检测到在30秒至60秒时间内有多于12.5%的系统时间被花费在压缩内存上，则框架为索引的顶层窗口调用这个成员函数。这表明系统内存不足。
当CWnd对象接收到这个调用时，它应当释放尽可能多的内存，考虑应用程序的活动的等级以及在Windows下运行的应用程序总数。应用程序可以调用Windows函数以确定有多少个程序正在运行。

注意：
框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_COMPACTING


 CWnd::OnCompareItem

afx_msg int OnCompareItem( int nIDCtl, LPCOMPAREITEMSTRUCT lpCompareItemStruct );

返回值：
指明两个项的相对位置。它可能是如下值之一：
值 | 含义
-1 | 第一项排在第二项前面
0 | 第一项与第二项顺序相同
1 | 第一项排在第二项后面

参数：
nIDCtl | 发出WM_COMPAREITEM消息的控件的标识符。
lpCompareItemStruct | 包含了一个指向COMPAREITEMSTRUCT数据结构的长指针，其中包含了标识符和应用为组合框或列表框中的两项提供的数据。

说明：
框架调用这个成员函数以指定排序的自画组合框或列表框中新项的相对位置。
如果组合框或列表框是用CBS_SORT或LBS_SORT风格创建的，则当应用程序加入新项时，Windows向组合框或列表框的拥有者发送一条WM_COMPAREITEM消息。
组合框或列表框中的两项在lpCompareItemStruct指向的COMPAREITEMSTRUCT结构中改变形式。OnCompareItem必须返回一个能指明哪一项出现在另一项之前的值。通常，Windows调用这个函数若干次，直到它能够确定新项的确切位置。
如果COMPAREITEMSTRUCT结构的hwndItem成员属于ClistBox或CcomboBox对象，则将调用适当的类的虚拟函数CompareItem。在你继承的ClistBox或CcomboBox类中重载CcomboBox::CompareItem或ClistBox::CompareItem以实现项比较。

注意：
框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
COMPAREITEMSTRUCT, WM_COMPAREITEM, CListBox::CompareItem, CComboBox::CompareItem


 CWnd::OnContextMenu

afx_msg void OnContextMenu( CWnd* pWnd, CPoint pos );

参数：
pWnd | 用户右击鼠标的窗口的句柄。这可以是接收到消息的窗口的一个子窗口。有关处理这个消息的更多信息参见说明部分。
pos | 点击鼠标时光标的位置，用屏幕坐标表示。

说明：
当用户在窗口中点击鼠标右键（右击）时，框架调用这个函数。你可以处理这个消息，使用TrackPopupMenu显示上下文菜单。
如果你没有显示上下文菜单，你必须将这个消息传递给DefWindowProc函数。
如果你的窗口是一个子窗口，DefWindowProc将这个消息发送给父窗口；否则，如果指定的位置是在窗口的标题上，则DefWindowProc显示一个缺省的上下文菜单。


 CWnd::OnCopyData

afx_msg BOOL OnCopyData( CWnd* pWnd, COPYDATASTRUCT*pCopyDataStruct );

返回值：如果接收应用程序成功地接收到了数据，则返回TRUE；否则返回FALSE。

参数：
pWnd | 指向发送数据的CWnd对象的指针。
pCopyDataStruct | 指向一个COPYDATASTRUCT结构的指针，其中包含了要被发送的数据。

说明：
框架调用这个成员函数以把数据从一个应用程序发送到另一个应用程序。
数据中不能包含接收数据的应用程序所不能访问的对象的指针或其它引用。
在拷贝数据的时候，它不能被发送过程的其它线程所改变。
接收应用程序应认为数据是只读的。PCopyDataStruct参数指向的结构仅在传输数据的时候有效；但是，接收应用程序不应释放与结构相关的内存。
如果接收应用程序需要在函数返回之后访问数据，它必须将接收到的数据拷贝到本地缓冲区中。

注意：
框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_COPYDATA


 CWnd::OnCreate

afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct );

返回值：OnCreate必须返回0以继续CWnd对象的创建过程。如果应用程序返回-1，窗口将被销毁。

参数：
lpCreateStruct 指向一个CREATESTRUCT结构，其中包含了与要创建的CWnd对象有关的信息。

说明：
当应用程序通过调用成员函数Create或CreateEx请求创建Windows的窗口时，框架调用这个成员函数。CWnd对象在窗口被创建以后，但是在它变为可见之前接收到对这个函数的调用。OnCreate是在Create或CreateEx成员函数返回之前被调用的。
重载这个成员函数以执行派生类所需的初始化工作。
CREATESTRUCT结构中包含了用于创建窗口的参数的拷贝。

注意：
框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
CWnd::CreateEx, CWnd::OnNcCreate, WM_CREATE, CWnd::Default, CWnd::FromHandle


 CWnd::OnCtlColor

afx_msg HBRUSH OnCtlColor( CDC* pDC, CWnd* pWnd, UINT nCtlColor );

返回值：OnCtlColor必须返回一个刷子句柄，该刷子将被用于画出控件的背景。

参数：
pDC | 包含了子窗口的显示设备环境的指针。可能是临时的。
PWnd | 包含了要求颜色的控件的指针。可能是临时的。
NCtlColor包含了下列值，指定了控件的类型：
· | CTLCOLOR_BTN | 按钮控件
· | CTLCOLOR_DLG | 对话框
· | CTLCOLOR_EDIT | 编辑控件
· | CTLCOLOR_LISTBOX | 列表框控件
· | CTLCOLOR_MSGBOX | 消息框
· | CTLCOLOR_SCROLLBAR | 滚动条控件
· | CTLCOLOR_STATIC | 静态控件

说明：
当要画出一个子控件时，框架就调用这个成员函数。多数控件将这个消息发送到它们的父窗口（通常是一个对话框），为使用正确的颜色画出控件而准备pDC。
要改变文本的颜色，使用要求的红、绿、蓝色值（RGB）调用SetTextColor成员函数。
要改变单行编辑控件的背景颜色，在CTLCOLOR_EDIT和CTLCOLOR_MSGBOX消息代码中设置刷子句柄，并在响应CTLCOLOR_EDIT的代码中调用CDC::SetBkColor函数。
不会为下拉组合框中的列表框调用OnCtlColor函数，因为下拉列表框实际上是组合框的子窗口，而不是窗口的子窗口。要改变下拉列表框的颜色，创建一个CcomboBox，在重载的OnCtlColor中的nCtlColor参数中检查CTLCOLOR_LISTBOX。在这个处理函数中，为设置文本的背景必须使用SetBkColor成员函数。

注意：
框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CDC::SetBkColor


 CWnd::OnDeadChar

afx_msg void OnDeadChar( UINT nChar, UINT nRepCnt, UINT nFlags );

参数：
nChar | 指定死键的字符值。
NRepCnt | 指定重复计数。
NFlags指定了扫描码、键暂态码、以前的按键状态和上下文代码，如下面的列表所示：
值 | 含义
0-7 | 扫描码。高位字的低字节
8 | 扩展键，例如功能键或数字键盘上的键（如果为扩展键则值为1，否则为0）
9-10 | 没有使用
11-12 | 由Windows内部使用
13 | 上下文代码（如果按下键的时候ALT键是被放开的，则返回1；否则返回0）
14 | 以前的键状态（如果此函数被调用前该键是被按下的，则为1；如果该键是放开的，则该值为0）
15 | 暂态（如果键正被放开，则为1，如果正被按下，则为0）

说明：
当OnKeyUp成员函数和OnKeyDown成员函数被调用的时候，框架调用这个函数。这个成员函数可以被用来指定死键的字符值。死键是这样一种键，例如元音字符（双点），它与其它字符组合成符合字符。例如，元音O是由死键、元音和O键组成的。
通常应用程序使用OnDeadChar来对用户每次按键作反馈。例如，应用程序可以在当前字符位置显示一个重音字符，而不需要移动插字符。
由于按键和OnDeadChar调用不必是一一对应的，因此对应用程序来说，nFlags中的信息通常是没有用的。nFlags中的信息只对在OnDeadChar调用之前最近的OnKeyUp和OnKeyDown成员函数的调用有效。
对于IBM增强型101和102键键盘，键盘的主体部分的增强键是右边的ALT和CTRL键；还有数字键盘左侧的INS，DEL，HOME，END，PAGE UP，PAGEDOWN，箭头键；以及数字键盘上的斜杠（/）和ENTER键等。其它键盘可能会支持nFlags中的扩展键位。

注意：
框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）

请参阅：WM_DEADCHAR


 CWnd::OnDeleteItem

afx_msg void OnDeleteItem( int nIDCtl, LPDELETEITEMSTRUCTlpDeleteItemStruct );

参数：
nIDCtl | 发出WM_DELETEITEM消息的控件的标识符。
lpDeleteItemStruct | 指定了指向DELETEITEMSTRUCT结构的长指针，其中包含有关要删除的列表框项的信息。

说明：
框架调用这个函数以通知自画列表框或组合框的拥有者，列表框或组合框将被销毁，或者用CComboBox::DeleteString，CListBox::DeleteString，CComboBox::ResetContent或CListBox::ResetContent清除其中的项。
如果DELETEITEMSTRUCT结构中的hwndItem成员属于组合框或列表框，则将调用适当的类的虚拟函数DeleteItem。重载适当的控件类中的DeleteItem成员函数以删除与项有关的数据。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
CComboBox::DeleteString, CListBox::DeleteString, CComboBox::ResetContent, CListBox::ResetContent, WM_DELETEITEM, CListBox::DeleteItem, CComboBox::DeleteItem


 CWnd::OnDestroy

afx_msg void OnDestroy( );

返回值：
框架调用这个成员函数以通知CWnd对象它将被销毁。OnDestroy是在CWnd对象已经从屏幕上清除以后被调用的。
首先为被销毁的CWnd调用OnDestroy，然后当CWnd的子窗口被销毁时为它们调用OnDestroy。可以假定当OnDestroy运行的时候，所有的子窗口依然存在。
如果被销毁的CWnd对象是剪贴板观察器链（通过调用SetClipboardViewer成员函数设置）的一部分，CWnd必须在从OnDestroy函数返回之前调用ChangeClipboardChain成员函数，将自己从剪贴板观察器链中清除。

请参阅：
CWnd::ChangeClipboardChain, CWnd::DestroyWindow, CWnd::SetClipboardViewer


 CWnd::OnDestroyClipboard

afx_msg void OnDestroyClipboard( );

说明：
当通过调用Windows的EmptyClipboard函数清空剪贴板时，框架为剪贴板的拥有者调用这个成员函数。

请参阅：::EmptyClipboard, WM_DESTROYCLIPBOARD


 CWnd::OnDeviceChange

afx_msg BOOL OnDeviceChange( UINT nEventType, DWORD dwData );

参数：
nEventType | 事件类型。有关可能取值的描述参见说明部分。
dwData | 包含了与事件有关的数据的结构的地址。它的含义依赖于给定的事件。

说明：
框架调用这个函数以通知应用程序或设备驱动程序，设备或计算机的硬件配置发生了改变。
对于提供了软件控制功能，如弹出和锁定的设备，操作系统通常发送一条DBT_DEVICEREMOVEPENDING消息，以便使应用程序和设备驱动程序停止对设备的使用。
如果操作系统强行清除了一个设备，它可能不会发送DBT_DEVICEQUERYREMOVE消息。
nEvent参数可以是下列值之一：
· | DBT_DEVICEARRIVAL | 已经加入了一个设备，现在可以使用。
· | DBT_DEVICEQUERYREMOVE | 允许清除被请求的设备。任何应用程序都可以拒绝这个请求并取消清除操作。
· | DBT_DEVICEQUERYREMOVEFAILED | 清除设备的请求被取消了。
· | DBT_DEVICEREMOVEPENDING | 设备将要被清除。不能拒绝。
· | DBT_DEVICEREMOVECOMPLETE | 设备已经被清除。
· | DBT_DEVICETYPESPECIFIC | 与设备有关的事件。
· | DBT_CONFIGCHANGED | 当前配置发生了变化。
· | DBT_DEVNODES_CHANGED | 设备节点发生了变化。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_DEVICECHANGE


 CWnd::OnDevModeChange

afx_msg void OnDevModeChange( LPTSTR lpDeviceName );

参数：
lpDeviceName 指向Windows初始化文件WIN.INI中指定的设备名。

说明：
当用户改变设备模式设置时，框架为所有的顶层CWnd对象调用这个成员函数。
处理WM_DEVMODECHANGE消息的应用程序可以重新初始化它们的设备模式设置。通常，使用Windows的ExtDeviceMode函数来保存和恢复设备设置的应用程序不处理这个函数。
当用户在控制面板中改变缺省打印机时，不会调用这个函数。在这种情况下，将调用OnWinIniChange函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_DEVMODECHANGE


 CWnd::OnDrawClipboard

afx_msg void OnDrawClipboard( );

说明：
当剪贴板的内容发生变化时，框架为剪贴板观察器链中的每个窗口调用这个成员函数。只有那些通过调用SetClipboardViewer成员函数加入了剪贴板观察器链的应用程序才需要响应这个调用。
接收到OnDrawClipboard的每个窗口必须调用Windows的SendMessage函数以向剪贴板观察器链中的下一个窗口传递一个WM_DRAWCLIPBOARD消息。下一个窗口的句柄是通过SetClipboardViewer成员函数返回的；它可能在响应OnChangeCbChain成员函数调用的时候被修改。

请参阅：
::SendMessage, CWnd::SetClipboardViewer, WM_CHANGECBCHAIN, WM_DRAWCLIPBOARD


 CWnd::OnDrawItem

afx_msg void OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct );

参数：
nIDCtl | 包含了发送WM_DRAWITEM消息的控件的标识符。如果菜单发送了此消息，则nIDCtl中包含0。
lpDrawItemStruct | 指定了指向DRAWITEMSTRUCT数据结构的长指针，其中包含有关要画出的项和要求的绘图类型的信息。

说明：
当控件或菜单的可视状态发生变化时，框架为自画按钮控件、组合框控件、列表框控件或者菜单的拥有者调用这个成员函数。
DRAWITEMSTRUCT结构的itemAction成员定义了要执行的绘图操作。这个成员中的数据允许控件的拥有者确定需要什么绘图动作。
在从处理这个消息的过程中返回之前，应用程序必须确保DRAWITEMSTRUCT的hDC成员所标识的设备环境已经恢复到缺省状态。
如果hwndItem成员属于CButton、CMenu、CListBox或CComboBox对象，则将调用适当的类的虚函数DrawItem。重载适当的控件类的DrawItem成员函数以画出项。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
DRAWITEMSTRUCT, WM_DRAWITEM, CButton::DrawItem, CMenu::DrawItem, CListBox::DrawItem, CComboBox::DrawItem


 CWnd::OnDropFiles

afx_msg void OnDropFiles( HDROP hDropInfo );

参数：
hDropInfo 指向描述下放文件的内部数据结构的指针。这个句柄被Windows的DragFinish，DragQueryFile和DragQueryPoint函数所使用，用来获得与下放文件有关的信息。

说明：
当用户在注册为下放文件接收者的窗口上方放开鼠标左键时，框架就调用这个成员函数。通常，派生类被设计为支持下放文件，并且将在窗口构造过程中注册。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

参阅 CWnd::DragAcceptFiles, WM_DROPFILES, ::DragAcceptFiles, ::DragFinish, ::DragQueryFile, ::DragQueryPoint


 CWnd::OnDSCNotify

afx_msg BOOL OnDSCNotify( DSCSTATE nState, DSCREASON nReason, BOOLpBool );

返回值：如果nReason和nState所标识的操作被处理了，则返回TRUE；否则返回FALSE。

参数：
nState | DSCSTATE枚举量中的一个命名常量，列在Remarks部分。
nReason | DSCSTATE枚举量中的一个命名常量，列在Remarks部分。
pBool | 一个布尔型结果，指明nState和nReason代表的操作是否应当继续。

说明：
当与数据源控件相绑定的控件修改或试图修改游标时，就在响应数据源控件引发的事件时调用这个接收方通知。使用它来跟踪数据源控件产生的原因（nReason）和状态（nState）。缺省情况下允许状态和原因的任意组合。编写你自己的代码以测试对你的应用程序而言是重要的状态和原因，然后返回适当的TRUE或FALSE。
要使用OnDSCNotify，在需要接收接收方通知的类的头文件中定义一个接收映射以及接收方通知的处理函数如下：
class CMyDlg : public CDialog
{
...
DECLARE_EVENTSINK_MAP()
BOOL OnDSCNotify(DSCSTATE nState, DSCREASON nReason, BOOL* pBool);
...
};
然后，在你的类的实现中，定义接收映射并指定接收事件的函数如下：
BEGIN_EVENTSINK_MAP(CMyDlg, CDialog)
ON_DSCNOTIFY(CMyDlg, IDC_RDCCTRL1, OnDSCNotify)
END_EVENTSINK_MAP()
当事件在数据源控件内发生时，通知回调函数，即你实现的OnDSCNotify将被调用。
enum DSCREASON
{
dscNoReason = 0,
dscClose, dscCommit, dscDelete,
dscEdit, dscInsert, dscModify, dscMove
};
对于下面列出的每一种状态，它将被调用多次：
enum DSCSTATE
{
dscNoState = 0,
dscOKToDo,
dscCancelled,
dscSyncBefore,
dscAboutToDo,
dscFailedToDo,
dscSyncAfter,
dscDidEvent
};
多次调用使你能够以不同的次数跟踪事件。例如，由于事件通常是在响应控件对游标的修改时产生的，数据源控件需要做的第一件事情就是引发一个事件，询问是否可以真正执行这个动作；因此是dsdOKToDo状态的原因。如果监控事件（数据控件、应用程序等等）的所有客户都接收了事件，数据源控件将进入dscSyncBefore状态，此时如有必要，所有外面的数据都将被刷新。例如，如果编辑域的内容发生了变化，这个变化将被发送到游标。在这个事件之后，数据源控件将进入dscAboutToDo和dscSyncAfter状态，最后进入dscDidEvent状态。这些为你提供了从数据源空捕捉通知的更多机会。

请参阅：
CWnd::GetDSCCursor, CWnd::BindDefaultProperty, CWnd::BindProperty


 CWnd::OnEnable

afx_msg void OnEnable( BOOL bEnable );

参数：
bEnable 指定了CWnd对象是被允许的还是被禁止的。如果CWnd是允许的，则这个参数为TRUE；如果CWnd是被禁止的，则为FALSE。

说明：
当应用程序改变CWnd对象的允许状态时，框架调用这个成员函数。OnEnable在EnableWindow成员函数返回之前被调用，但是是在窗口的允许状态（WS_DISABLE风格位）改变之后。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::EnableWindow, WM_ENABLE


 CWnd::OnEndSession

afx_msg void OnEndSession( BOOL bEnding );

参数：
bEnding 指定了会话过程是否要结束。如果要结束会话，则为TRUE；否则为FALSE。

说明：
在CWnd对象从OnQueryEndSession成员函数中返回一个非零值之后，框架调用这个成员函数。OnEndSession通知CWnd对象会话确实将要结束。
如果bEnding为TRUE，则在所有的应用程序从这个函数中返回之后，Windows可以在任何时候结束。因此，应当使应用程序在OnEndSession内部完成结束时所需的所有任务。
当会话结束的时候，你不必调用DestroyWindow成员函数或Windows的PostQuitMessage函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
CWnd::DestroyWindow, CWnd::OnQueryEndSession, ::ExitWindows, ::PostQuitMessage, WM_QUERYENDSESSION, CWnd::Default, WM_ENDSESSION


 CWnd::OnEnterIdle

afx_msg void OnEnterIdle( UINT nWhy, CWnd* pWho );

参数：
nWhy指明该消息是显示对话框还是显示菜单的结果。这个参数可以是下列值之一：
· | MSGF_DIALOGBOX | 系统空闲，因为正在显示对话框。
· | MSGF_MENU | 系统空闲，因为正在显示菜单。
pWho指定了对话框指针（如果nWhy为MSGF_DIALOGBOX），或者是包含了显示的菜单（如果nWhy为MSGF_MENU）窗口的指针。这个指针可能是临时的，不能被保存以供将来使用。

说明：
框架调用这个函数以通知应用程序的主窗口过程，有一个模式对话框或或菜单正在进入空闲状态。当模式对话框或菜单处理完原来的一条或多条消息，并且没有其它消息在队列中等候时，它就进入空闲状态。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_ENTERIDLE


 CWnd::OnEnterMenuLoop

afx_msg void OnEnterMenuLoop( BOOL bIsTrackPopupMenu );

参数：
bIsTrackPopupMenu 指定了涉及的菜单是否是一个弹出菜单。如果函数成功，则具有非零值；否则为0。

说明：当进入了菜单模式循环时，框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnExitMenuLoop, WM_ENTERMENULOOP


 CWnd::OnEraseBkgnd

afx_msg BOOL OnEraseBkgnd( CDC* pDC );

返回值：如果它擦除了背景，则返回非零值；否则返回0。

参数：
pDC 指定了设备环境对象。

说明：
当CWnd对象的背景需要被擦除时（例如，当窗口大小被改变时），框架就调用这个函数。它被调用以便为绘图准备无效区域。
缺省的实现使用窗口类结构中hbrBackground成员指定的窗口类背景刷子擦除窗口背景。
如果hbrBackground成员为NULL，你重载的OnEraseBkgnd必须擦除背景色。你的重载函数也可以为刷子调用UnrealizeObject函数，将目标刷子的原点与CWnd的坐标对齐，然后选择该刷子。
如果重载的OnEraseBkgnd在响应WM_ERASEBKGND时处理了这个消息并擦除了背景，则应当返回非零值，表明不需要进一步擦除。如果它返回0，则窗口依然被标记为需要擦除（通常，这意味着PAINTSTRUCT结构的fErase成员将为TRUE）。
Windows假定背景是用MM_TEXT映射模式计算的。如果设备环境使用了其它映射模式，则擦除的区域可能不在客户区的可见部分之内。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_ICONERASEBKGND, CGdiObject::UnrealizeObject, WM_ERASEBKGND


 CWnd::OnExitMenuLoop

afx_msg void OnExitMenuLoop( BOOL bIsTrackPopupMenu );

参数：
bIsTrackPopupMenu 指明涉及的菜单是否是一个弹出菜单。如果函数成功，则具有非零值；否则为0。

说明：当退出菜单模式循环时，框架调用这个函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnEnterMenuLoop, WM_EXITMENULOOP


 CWnd::OnFontChange

afx_msg void OnFontChange( );

说明：
当应用程序改变了字体资源池之后，系统中的所有顶层窗口从框架接收到一个OnFontChange调用。
在系统中加入或删除字体（例如，通过Windows的AddFontResource或RemoveFontResource函数）的应用程序必须向所有的顶层窗口发送WM_FONTCHANGE消息。
要发送这个消息，使用Windows的SendMessage函数，把hWnd参数设为HWND_BROA- DCAST。

请参阅：
::AddFontResource, ::RemoveFontResource, ::SendMessage, WM_FONTCHANGE


 CWnd::OnGetDlgCode

afx_msg UINT OnGetDlgCode( );

返回值：下列值中的一个或多个，指明了应用程序处理的输入类型：
· | DLGC_BUTTON | 按钮（通用）。
· | DLGC_DEFPUSHBUTTON | 缺省按钮。
· | DLGC_HASSETSEL | EM_SETSEL消息。
· | DLGC_UNDEFPUSHBUTTON | 没有缺省的按钮处理。（应用程序可以与DLGC_BUTTON一起使用这个标志，指明它处理按钮输入，但是依靠系统进行缺省按钮处理）
· | DLGC_RADIOBUTTON | 单选按钮。
· | DLGC_STATIC | 静态控件。
· | DLGC_WANTALLKEYS | 所有的键盘输入。
· | DLGC_WANTARROWS | 箭头键。
· | DLGC_WANTCHARS | WM_CHAR消息。
· | DLGC_WANTMESSAGE | 所有的键盘输入。应用程序将这个消息传递给控件。
· | DLGC_WANTTAB | TAB键。

说明：
通常，Windows处理CWnd控件中所有的箭头键和TAB键输入。通过重载OnGetDlgCode，CWnd控件可以选择处理特定类型的输入。预定义控件类的缺省OnGetDlgCode函数返回与每个类相对应的代码。

请参阅：WM_GETDLGCODE


 CWnd::OnGetMinMaxInfo

afx_msg void OnGetMinMaxInfo( MINMAXINFO FAR* lpMMI );

参数：
lpMMI 指向一个MINMAXINFO结构，其中包含了有关窗口的最大化大小和位置以及最小、最大跟踪大小的信息。有关这个结构的更多信息参见MINMAXINFO结构。

说明：
每当Windows需要知道窗口的最大化位置或大小，或者最小、最大的跟踪大小时，框架就调用这个成员函数。最大化大小是指当窗口的边框被完全扩展时窗口的大小。窗口的最大跟踪大小是指用边框改变窗口的大小时可以达到的最大窗口大小。窗口的最小跟踪大小是指用边框改变窗口大小时可以达到的最小窗口大小。
Windows填充一个点组成的数组，为不同的位置和大小指定了缺省值。应用程序可以在OnGetMinMaxInfo中改变这些值。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_GETMINMAXINFO


 CWnd::OnHelpInfo

afx_msg BOOL OnHelpInfo( HELPINFO* lpHelpInfo );

参数：
lpHelpInfo 指向HELPINFO结构的指针，其中包含有关菜单项、控件、对话框或请求帮助的窗口的信息。

说明：
当用户按下F1键时，框架调用这个函数。
如果当按下F1时菜单是激活的，则WM_HELP被发送到与菜单相关的窗口，否则WM_HELP被发送到拥有键盘焦点的窗口。如果没有窗口拥有键盘焦点，则WM_HELP被发送到当前的活动窗口。

请参阅：CWinApp::OnHelp, CWinApp::WinHelp


 CWnd::OnHScroll

afx_msg void OnHScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );

参数：
nSBCode指定了滚动条代码，指明了用户的滚动请求。这个参数可以是下列值之一：
· | SB_LEFT | 滚动到最左边。
· | SB_ENDSCROLL | 结束滚动。
· | SB_LINELEFT | 向左滚动。
· | SB_LINERIGHT | 向右滚动。
· | SB_PAGELEFT | 向左滚动一页。
· | SB_PAGERIGHT | 向右滚动一页。
· | SB_RIGHT | 滚动到最右边。
· | SB_THUMBPOSITION | 滚动到绝对位置。当前的位置由nPos参数指定。
· | SB_THUMBTRACK | 将滚动块拖动到指定的位置。当前的位置由nPos参数指定。
nPos | 如果滚动条代码为SB_THUMBPOSITION或者SB_THUMBTRACK，则指定了滚动块的位置；否则没有使用。取决于初始的滚动范围，nPos可能是负的，如有必要应该被强制转换为整数
pScrollBar | 如果滚动消息来自一个滚动条控件，则包含了控件的指针。如果用户点击了窗口的滚动条，则这个参数为NULL。这个参数可能时临时的，不能被保存以供将来使用。

说明：
当用户点击窗口的水平滚动条时，框架调用这个成员函数。
通常在滚动块要被拖动的时候，滚动条代码SB_THUMBTRACK被应用程序用来给出一些反馈。
如果应用程序滚动了滚动条所控制的内容，它必须用SetScrollPos成员函数复位滚动块的位置。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::SetScrollPos, WM_VSCROLL, WM_HSCROLL


 CWnd::OnHScrollClipboard

afx_msg void OnHScrollClipboard( CWnd* pClipAppWnd, UINT nSBCode, UINTnPos );

参数：
pClipAppWnd | 指定指向剪贴板观察器窗口的指针。这个指针可能时暂时的，因而不应该被保存以供将来使用。
nSBCode在低位字指定滚动条代码，此代码是下列值之一：
· | SB_BOTTOM | 滚动到右下角
· | SB_ENDSCROLL | 结束滚动
· | SB_LINEDOWN | 下滚一行
· | SB_LINEUP | 上滚一行
· | SB_PAGEDOWN | 下滚一页
· | SB_PAGEUP | 上滚一页
· | SB_THUMBPOSITION | 滚动到绝对位置。当前位置由nPos提供。
· | SB_TOP | 滚动到左上角
nPos | 如果滚动条代码为SB_THUMBPOSITION，nPos包含滚动块位置；否则不使用。

说明：
当剪贴板数据具有CF_OWNERDISPLAY格式并且剪贴板观察器的水平滚动条发生一个事件时，剪贴板所有者的OnHScrollClipboard成员函数被剪贴板观察器所调用。剪贴板所有者应滚动剪贴板图象，使适当的区域无效，并更新滚动块的值。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnVScrollClipboard, WM_HSCROLLCLIPBOARD


 CWnd::OnIconEraseBkgnd

afx_msg void OnIconEraseBkgnd( CDC* pDC );

参数：
pDC 指定图标的设备环境对象。该指针可能是临时的，并且不应为将来的使用保存该指针。

说明：
当在画出图标之前必须填充图标的背景时，框架为一个最小化CWnd对象调用这个成员函数。仅当在窗口的缺省实现中定义了类图标时CWnd才会接收该调用；否则调用OnEraseBkgnd。
DefWindowProc成员函数用父窗口的背景刷子填充图标的背景。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnEraseBkgnd, WM_ICONERASEBKGND


 CWnd::OnInitMenu

afx_msg void OnInitMenu( CMenu* pMenu );

参数：
pMenu 指定了要初始化的菜单。可能是临时的，不应被保存以供将来使用。

说明：
当菜单要被激活时，框架调用这个成员函数。这个调用在用户点击菜单条上的菜单项或者按下了菜单键时产生。重载这个函数以在显示之前修改菜单。
OnInitMenu仅在第一次访问菜单时调用；对于每次访问，OnInitMenu仅调用一次。这意味着，例如，当保持按钮被按下时，在几个菜单项之间移动鼠标不会产生新的调用。这个调用不提供有关菜单项的信息。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnInitMenuPopup, WM_INITMENU


 CWnd::OnInitMenuPopup

afx_msg void OnInitMenuPopup( CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu );

参数：
pPopupMenu | 指定了弹出菜单的菜单对象。可能时临时的，不能被保存以供将来使用。
nIndex | 指定了主菜单中弹出菜单的索引。
bSysMenu | 如果弹出菜单为控制菜单，则为TRUE；否则为FALSE。

说明：
当一个弹出菜单将被激活时，框架调用这个成员函数。这允许应用程序在弹出菜单被显示之前修改它，而不需要改变整个菜单。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnInitMenu, WM_INITMENUPOPUP


 CWnd::OnKeyDown

afx_msg void OnKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags );

参数：
nChar | 指定了给定键的虚拟键码。
nRepCnt | 重复计数（用户按住键引起的重复击键数目）。
nFlags指定了扫描码、暂态键码、原来的键状态和上下文代码，如下面的列表所示：
值 | 描述
0-7 | 扫描码（依赖于OEM的值）
8 | 扩展键，比如功能键或数字键盘上的键（如果它是扩展键，则为1）
9-10 | 未使用
11-12 | Windows内部使用
13 | 上下文代码（如果按下键时ALT键时被按下的，则为1；否则为0）
14 | 原来的键状态（如果在调用之前键时按下的，则为1；如果键是弹起的，则为0）
15 | 暂态（如果键正在被释放，则为1；如果键正被按下，则为0）
对于WM_KEYDOWN消息，键暂态位（15位）为0，并且上下文代码位（13位）为0。

说明：
当用户按下了一个非系统键时，框架调用这个成员函数。非系统键是指当ALT键为被按下时按下的键盘键或者当CWnd拥有输入焦点时按下的键盘键。
由于自动重复，在调用OnKeyUp成员函数之前可能会产生多个OnKeyDown调用。指明原来的键状态的位可以被用来确定OnKeyDown调用时是第一次被按下还是重复的按下状态。
对于IBM增强101和102键键盘，增强键包括键盘主体部分的右ALT键和右CTRL键；数字键盘左侧的INS，DEL，HOME，END，PAGE UP，PAGE DOWN和箭头键；以及数字键盘上的斜杠（/）和ENTER键。一些其它的键盘可能支持nFlags中的扩展键位。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_CHAR, WM_KEYUP, WM_KEYDOWN


 CWnd::OnKeyUp

afx_msg void OnKeyUp( UINT nChar, UINT nRepCnt, UINT nFlags );

参数：
nChar | 指定了给定键的虚拟键码。
nRepCnt | 重复计数（用户按住键引起的重复击键数目）。
nFlags指定了扫描码、暂态键码、原来的键状态和上下文代码，如下面的列表所示：
值 | 描述
0-7 | 扫描码（依赖于OEM的值）。高位字的低字节
8 | 扩展键，比如功能键或数字键盘上的键（如果它时扩展键则为1）
9-10 | 未使用
11-12 | Windows内部使用
13 | 上下文代码（如果按下键时ALT键时被按下的，则为1；否则为0）
14 | 原来的键状态（如果在调用之前键时按下的，则为1；如果键是弹起的，则为0）
15 | 暂态（如果键正在被释放，则为1；如果键正被按下，则为0）
对于WM_KEYDOWN消息，键暂态位（15位）为1，并且上下文代码位（13位）为0。

说明：
当一个非系统键被释放的时候，框架调用这个成员函数。非系统键是指当ALT键未按下时按下的键盘键，或者是当CWnd拥有输入焦点时按下的键盘键。
对于IBM增强101和102键键盘，增强键包括键盘主体部分的右ALT键和右CTRL键；数字键盘左侧的INS，DEL，HOME，END，PAGE UP，PAGE DOWN和箭头键；以及数字键盘上的斜杠（/）和ENTER键。一些其它的键盘可能支持nFlags中的扩展键位。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_CHAR, WM_KEYUP, CWnd::Default, WM_KEYDOWN


 CWnd::OnKillFocus

afx_msg void OnKillFocus( CWnd* pNewWnd );

参数：
pNewWnd 指定了获得输入焦点的窗口指针（可能为NULL，或可能是临时的）。

说明：
框架在失去输入焦点之后立刻调用这个成员函数。
如果CWnd显示了一个插字符，则此时必须销毁插字符。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::SetFocus, WM_KILLFOCUS


 CWnd::OnLButtonDblClk

afx_msg void OnLButtonDblClk( UINT nFlags, CPoint point );

参数：
nFlags指定了不同的虚拟键是否被按下。这个参数可以是下列值之一：
· | MK_CONTROL | 如果CTRL键被按下，则设置此位。
· | MK_LBUTTON | 如果鼠标左键被按下，则设置此位。
· | MK_MBUTTON | 如果鼠标中键被按下，则设置此位。
· | MK_RBUTTON | 如果鼠标右键被按下，则设置此位。
· | MK_SHIFT | 如果SHIFT键被按下，则设置此位。point指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。说明当用户双击鼠标左键时框架调用这个成员函数。只有具有CS_DBLCLKS WNDCLASS风格的窗口才接收OnLButtonDlbClk调
point指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。

说明：
当用户双击鼠标左键时框架调用这个成员函数。
只有具有CS_DBLCLKS WNDCLASS风格的窗口才接收OnLButtonDlbClk调用。这是微软基础类窗口的缺省状态。当用户按下、释放，然后在系统规定的双击时间限制之内再次按下鼠标左键时，Windows就调用OnLButtonDblClk。双击鼠标左键实际产生四个事件：WM_LBUTTONDOWN，WM_LBUTTONUP消息，WM_LBUTTONDBLCLK调用，以及释放按钮时的另一个WM_LBUTTONUP消息。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnLButtonDown, CWnd::OnLButtonUp, WM_LBUTTONDBLCLK


 CWnd::OnLButtonDown

afx_msg void OnLButtonDown( UINT nFlags, CPoint point );

参数：
nFlags指定了不同的虚拟键是否被按下。这个参数可以是下列值之一：
· | MK_CONTROL | 如果CTRL键被按下，则设置此位。
· | MK_LBUTTON | 如果鼠标左键被按下，则设置此位。
· | MK_MBUTTON | 如果鼠标中键被按下，则设置此位。
· | MK_RBUTTON | 如果鼠标右键被按下，则设置此位。
· | MK_SHIFT | 如果SHIFT键被按下，则设置此位。
point指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。

说明：当用户按下鼠标左键时，框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnLButtonDblClk, CWnd::OnLButtonUp, WM_LBUTTONDOWN


 CWnd::OnLButtonUp

afx_msg void OnLButtonUp( UINT nFlags, CPoint point );

nFlags指定了不同的虚拟键是否被按下。这个参数可以是下列值之一：
· | MK_CONTROL | 如果CTRL键被按下，则设置此位。
· | MK_LBUTTON | 如果鼠标左键被按下，则设置此位。
· | MK_MBUTTON | 如果鼠标中键被按下，则设置此位。
· | MK_RBUTTON | 如果鼠标右键被按下，则设置此位。
· | MK_SHIFT | 如果SHIFT键被按下，则设置此位。
point指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。

说明：
当用户放开鼠标左键时，框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnLButtonDblClk, CWnd::OnLButtonDown, WM_LBUTTONUP


 CWnd::OnMButtonDblClk

afx_msg void OnMButtonDblClk( UINT nFlags, CPoint point );

参数：
nFlags指定了不同的虚拟键是否被按下。这个参数可以是下列值之一：
· | MK_CONTROL | 如果CTRL键被按下，则设置此位。
· | MK_LBUTTON | 如果鼠标左键被按下，则设置此位。
· | MK_MBUTTON | 如果鼠标中键被按下，则设置此位。
· | MK_RBUTTON | 如果鼠标右键被按下，则设置此位。
· | MK_SHIFT | 如果SHIFT键被按下，则设置此位。
point指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。

说明：
当用户双击鼠标中键时框架调用这个成员函数。
只有具有CS_DBLCLKS WNDCLASS风格的窗口才接收OnMButtonDlbClk调用。这是微软基础类窗口的缺省状态。当用户按下、释放，然后在系统规定的双击时间限制之内再次按下鼠标中键时，Windows就调用OnMButtonDblClk。双击鼠标中键实际产生四个事件：WM_MBUTTONDOWN，WM_MBUTTONUP消息，WM_MBUTTONDBLCLK调用，以及释放按钮时的另一个WM_MBUTTONUP消息。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnMButtonDown, CWnd::OnMButtonUp, WM_MBUTTONDBLCLK


 CWnd::OnMButtonDown

afx_msg void OnMButtonDown( UINT nFlags, CPoint point );

参数：
nFlags指定了不同的虚拟键是否被按下。这个参数可以是下列值之一：
· | MK_CONTROL | 如果CTRL键被按下，则设置此位。
· | MK_LBUTTON | 如果鼠标左键被按下，则设置此位。
· | MK_MBUTTON | 如果鼠标中键被按下，则设置此位。
· | MK_RBUTTON | 如果鼠标右键被按下，则设置此位。
· | MK_SHIFT | 如果SHIFT键被按下，则设置此位。
point指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。

说明：
当用户按下鼠标中键时，框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnMButtonDblClk, CWnd::OnMButtonUp, WM_MBUTTONDOWN


 CWnd::OnMButtonUp

afx_msg void OnMButtonUp( UINT nFlags, CPoint point );

nFlags指定了不同的虚拟键是否被按下。这个参数可以是下列值之一：
· | MK_CONTROL | 如果CTRL键被按下，则设置此位。
· | MK_LBUTTON | 如果鼠标左键被按下，则设置此位。
· | MK_MBUTTON | 如果鼠标中键被按下，则设置此位。
· | MK_RBUTTON | 如果鼠标右键被按下，则设置此位。
· | MK_SHIFT | 如果SHIFT键被按下，则设置此位。
point指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。

说明：
当用户放开鼠标中键时，框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnMButtonDblClk, CWnd::OnMButtonDown, WM_MBUTTONUP


 CWnd::OnMDIActivate

afx_msg void OnMDIActivate( BOOL bActivate, CWnd* pActivateWnd, CWnd* pDeactivateWnd );

参数：
bActivate | 如果子窗口要被激活，则为TRUE；如果要被取消激活状态，则为FALSE。
pActivateWnd | 包含了要激活的MDI子窗口的指针。当被一个MDI子窗口接收的时候，pActiveWnd中包含了要激活的子窗口指针。这个指针可能时临时的，不应被保存以供将来使用。
pDeactivateWnd | 包含了将失去激活状态的MDI子窗口的指针。这个指针可能时临时的，不应被保存以供将来使用。

说明：
框架为被激活的子窗口和取消激活状态的子窗口调用这个成员函数。
一个MDI子窗口可以与MDI框架窗口独立地被激活。当框架窗口被激活时，最近在OnMDIActive调用中被激活的子窗口接收到一个WM_NCACTIVATE消息以画出活动窗口的边框和标题条，但是它不接收另一个OnMDIActivate调用。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CMDIFrameWnd::MDIActivate, WM_MDIACTIVATE


 CWnd::OnMeasureItem

afx_msg void OnMeasureItem( int nIDCtl, LPMEASUREITEMSTRUCT lpMeasureItemStruct );

参数：
nIDCtl | 控件的ID。
lpMeasureItemStruct | 指向一个MEASUREITEMSTRUCT数据结构，其中包含自画控件的大小。

说明：
当控件被创建的时候，框架为自画按钮、组合框、列表框或菜单项调用这个成员函数。
重载这个函数并填充lpMeasureItemStruct指向的MEASUREITEMSTRUCT数据结构，然后返回；这将通知Windows控件的大小，并使Windows能够正确地处理控件的用户交互。
如果列表框或组合框是用LBS_OWNERDRAWVARIABLE或CBS_OWNERDRAWVARIA_BLE风格创建的，则框架为控件中的每一个项调用这个函数；否则这个函数只被调用一次。
在发送WM_INITDIALOG消息之前，Windows为用OWNERDRAWFIXED风格创建的组合框和列表框的拥有者发出对OnMeasureItem的调用。其结果是，当拥有者接收到这个调用时，Windows还没有确定在控件中使用的字体的高度和宽度；需要这些值的函数调用和计算应该发生在应用程序或库的主函数中。
如果要测量的的项是CMenu，CListBox或CComboBox对象，则将调用适当的类的虚函数MeasureItem。重载适当的控件类的MeasureItem成员函数以计算并设置每个项的大小。
仅当控件类是在运行时创建，或者它是用LBS_OWNERDRAWVARIABLE或CBS_OWNERDRAWVARIABLE风格创建的时候，OnMeasureItem才会被调用。这是因为WM_MEASUREITEM消息时在控件创建过程的早期被发送的。
如果你使用DDX_Control，SubclassDlgItem或SubclassWindow进行了子类化，则子类化过程通常发生在创建过程之后。因此，在控件的OnChildNotify函数中无法处理WM_MEASUREITEM消息，这是MFC用来实现ON_WM_MEASUREITEM_REFLECT的机制。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
CMenu::MeasureItem, CListBox::MeasureItem, CComboBox::MeasureItem, WM_MEASUREITEM


 CWnd::OnMenuChar

afx_msg LRESULT OnMenuChar( UINT nChar, UINT nFlags, CMenu* pMenu );

返回值：
返回值的高位字中必须包含下列命令代码之一：
值 | 描述
0 | 告诉Windows废弃用户按下的字符，并在系统扬声器中产生一个短响
1 | 告诉Windows关闭当前的菜单
2 | 通知Windows在返回值的低位字中包含了指定项的号码。这个项是Windows选中的，如果高位字中包含0或1，则低位字被忽略。当使用了加速键（快捷方式）选中菜单中的位图时，应用程序应当处理这个消息。

参数：
nChar | 依赖于编译设置，指定了用户按下的ANSI或Unicode字符。
nFlags | 如果菜单是弹出菜单，则包含了MF_POPUP标志。如果菜单是控制菜单，则包含了MF_SYSMENU标志。
pMenu | 包含了选中菜单的指针。这个指针可能时临时的，不能被保存以供将来使用。

说明：
当用户按下一个不能与当前菜单中任何预定义的助记符相匹配的菜单助记符时，框架就调用这个成员函数。它被发送到拥有这个菜单的CWnd对象。当用户按下ALT以及其它任何键时，也会调用OnMenuChar，即使这些键并不对应助记符字符。在这种情况下，pMenu指向CWnd拥有的菜单，nFlags为0。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_MENUCHAR


 CWnd::OnMenuSelect

afx_msg void OnMenuSelect( UINT nItemID, UINT nFlags HMENU hSysMenu );

参数：
nItemID | 标识了被选中的项。如果选中项是一个菜单项，则nItemID包含了菜单项ID。如果选中项包含了弹出菜单，则nItemID包含了弹出菜单索引，而hSysMenu中包含了主菜单（用户点击的）的句柄。
nFlags包含下列菜单标志的组合：
· | MF_BITMAP | 该项是位图。
· | MF_CHECKED | 该项被选中。
· | MF_DISABLED | 该项被禁止。
· | MF_GRAYED | 该项被变灰。
· | MF_MOUSESELECT | 该项是用鼠标选中的。
· | MF_OWNERDRAW | 该项是一个自画项。
· | MF_POPUP | 该项包含了一个弹出菜单。
· | MF_SEPARATOR | 该项是一个菜单分隔符。
· | MF_SYSMENU | 该项包含在控制菜单中。
hSysMenu | 如果nFlags中包含了MF_SYSMENU，标识了与消息相关的菜单。如果nFlags中包含了MF_POPUP，则标识了主菜单的句柄。如果nFlags中既没有MF_SYSMENU也没有MF_POPUP，则没有使用。

说明：
如果CWnd对象与一个菜单相关联，则当用户选择一个菜单项时，框架调用OnMenuSelect。
如果nFlags中为0xFFFF并且hSysMenu为0，则Windows已经因为用户按下ESC键或在菜单外点击而关闭了菜单。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_MENUSELECT


 CWnd::OnMouseActivate

afx_msg int OnMouseActivate( CWnd* pDesktopWnd, UINT nHitTest, UINTmessage );

返回值：
指定了是否要激活CWnd以及是否放弃鼠标事件。它必须是下列值之一：
· | MA_ACTIVATE | 激活CWnd对象。
· | MA_NOACTIVATE | 不激活CWnd对象 。
· | MA_ACTIVATEANDEAT | 激活CWnd对象并放弃鼠标事件。
· | MA_NOACTIVATEANDEAT | 不激活CWnd对象并放弃鼠标事件。

参数：
pDesktopWnd | 指定了要激活的窗口的顶层父窗口的指针。这个指针可能是临时的，不能被保存。
nHitTest | 指定了击中测试区域代码。击中测试是用来确定光标的位置的。
message | 指定了鼠标消息。

说明：
当光标位于非激活窗口内并且用户按下了鼠标按钮时，框架就调用这个成员函数。
缺省的实现在进行任何处理之前把这个消息传递给父窗口。如果父窗口返回TRUE，则处理过程中止。
有关不同的击中测试区域代码的描述参见OnNcHitTest成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnNcHitTest, WM_MOUSEACTIVATE


 CWnd::OnMouseMove

afx_msg void OnMouseMove( UINT nFlags, CPoint point );

参数：
nFlags指明是否按下了不同的虚拟键。这个参数可以是下列值的组合：
MK_CONTROL | 如果CTRL键被按下，则设置此位。
MK_LBUTTON | 如果鼠标左键被按下，则设置此位。
MK_MBUTTON | 如果鼠标中键被按下，则设置此位。
MK_RBUTTON | 如果鼠标右键被按下，则设置此位。
MK_SHIFT | 如果SHIFT键被按下，则设置此位。

point指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。说明当鼠标光标移动时，框架调用这个成员函数。如果鼠标没有被捕获，则WM_MOUSEMOVE由鼠标下方的窗口所接收；否则消息被发往捕获了鼠标的窗口。

注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）

请参阅：CWnd::SetCapture, CWnd::OnNcHitTest, WM_MOUSEMOVE


 CWnd::OnMouseWheel

afx_msg BOOL OnMouseWheel( UINT nFlags, short zDelta, CPoint pt );

返回值：如果允许鼠标轮滚动，则返回非零值；否则返回0。

参数：
nFlags指明是否按下了虚拟键。这个参数可以是下列值的组合：
· | MK_CONTROL | 如果CTRL键被按下，则设置此位。
· | MK_LBUTTON | 如果鼠标左键被按下，则设置此位。
· | MK_MBUTTON | 如果鼠标中键被按下，则设置此位。
· | MK_RBUTTON | 如果鼠标右键被按下，则设置此位。
· | MK_SHIFT | 如果SHIFT键被按下，则设置此位。
zDelta 指明了旋转的距离。zDelta值以WHEEL_DELTA，即120的倍数或部分的形式表达。小于零的数表明往回滚动（向着用户），而大于零的数表明滚向远处（离开用户）。用户可以在鼠标软件中改变滚轮设置以反转这种响应。有关这个参数的更多信息参见说明部分。
pt指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。

说明：
当用户旋转鼠标滚轮并达到滚轮的下一个刻度时，框架就调用这个成员函数。除非被重载，否则OnMouseWheel调用WM_MOUSEWHEEL的缺省处理。Windows自动将该消息转发到具有输入焦点的控件或子窗口。Win32函数DefWindowProc将该消息上传到拥有它的窗口。
zDelta参数是WHEEL_DELTA的倍数，它被设为120。这个值是要采取的动作的开端，这一类动作（比如向前滚动到下一个刻度）必须为每一个delta产生。
delta被设为120，以允许将来使用更高精度的滚轮，例如没有刻度的自由旋转滚轮。这种设备在每次旋转是可能会发送多个消息，但是每次消息中的值更小。要支持这个可能性，或者可以累计输入的delta值，直到达到一个WHEEL_DELTA（因此你达到与给定delta的旋转相同的响应），或者滚动部分行以响应更频繁的消息。你可以选择你的滚动精度并累计delta值直到达到WHEEL_DELTA。
重载这个成员函数以提供你自己的鼠标滚轮滚动特性。
注意 OnMouseWheel为Windows NT 4.0处理消息。对于Windows 95或Windows NT 3.51 的消息处理，应使用OnRegisteredMouseWheel。

请参阅：mouse_event


 CWnd::OnMove

afx_msg void OnMove( int x, int y );

参数：
x | 指定了客户区左上角的新x轴坐标。对于重叠式和弹出式窗口，坐标是用屏幕坐标给出的，对于子窗口，是用父窗口的客户区坐标给出的。
y | 指定了客户区左上角的新y轴坐标。对于重叠式和弹出式窗口，坐标是用屏幕坐标给出的，对于子窗口，是用父窗口的客户区坐标给出的。

说明：
框架在CWnd对象被移动之后调用这个成员函数。
注意：
框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_MOVE


 CWnd::OnMoving

afx_msg void OnMoving( UINT nSide, LPRECT lpRect );

参数：
nSide | 被移动的窗口的边界。
lpRect | CRect或RECT的地址，其中包含了项的坐标。

说明：
当用户移动CWnd对象时框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_MOVING


 CWnd::OnNcActivate

afx_msg BOOL OnNcActivate( BOOL bActive );

返回值：
如果Windows必须进行缺省处理，则返回非零值；如果要防止标题条或图标变为非激活状态，则为0。

参数：
bActive 表明需要改变标题条或图标以指明活动或非活动状态。如果要画出活动的标题条或图标，则bActive参数为TRUE。如果要画出非活动的标题条或图标，则为FALSE。

说明：
当需要改变非客户区以指明活动和非活动状态时，框架调用这个成员函数。如果bActive为TRUE，则缺省的实现用活动颜色画出标题条和标题条文本；如果bActive为FALSE，则用非活动颜色画出。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::Default, WM_NCACTIVATE


 CWnd::OnNcCalcSize

afx_msg void OnNcCalcSize( BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp );

参数：
bCalcValidRects | 指定应用程序是否需要指定客户区的哪个部分包含了有效信息。Windows将把有效信息拷贝到新客户区的指定位置。如果这个参数为TRUE，则应用程序必须指定客户区的哪个部分有效。
lpncsp | 指向一个NCCALCSIZE_PARAMS数据结构，其中包含了应用程序可用于计算CWnd矩形（包括客户区、边框、标题和滚动条等）的新大小和位置的信息。

说明：
当客户区的大小和位置需要重新计算时，框架调用这个成员函数。通过处理这个消息，应用程序可以在窗口的大小和位置发生变化时控制窗口客户区的内容。
不论bCalcValidRects的值是什么，NCCALCSIZE_PARAMS结构的rgrc结构成员所指向的数组中的第一个矩形中包含了窗口的坐标。对于一个子窗口，这个坐标是相对于父窗口的客户区的。对于顶层窗口，该坐标是屏幕坐标。应用程序应当修改rgrc[0]矩形以反映客户区的大小和位置。
rgrc[1]和rgrc[2]矩形仅当bCalcValidRects为TRUE时有效。在这种情况下，rgrc[1]矩形中包含了被移动或改变大小的窗口的坐标。rgrc[2]矩形中包含了窗口被移动之前的客户区坐标。所有的坐标都是相对于父窗口或屏幕的。缺省的实现根据窗口特征计算客户区的大小（是否有滚动条，菜单等），并且将结果放入lpncsp。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_NCCALCSIZE, CWnd::MoveWindow, CWnd::SetWindowPos


 CWnd::OnNcCreate

afx_msg BOOL OnNcCreate( LPCREATESTRUCT lpCreateStruct );

返回值：
如果创建了非客户区，则返回非零值。如果发生错误，则返回0；在这种情况下，Create函数将返回错误。

参数：
lpCreateStruct 指向CWnd的CREATESTRUCT数据结构。

说明：
当CWnd对象第一次被创建时，框架在WM_CREATE消息之前调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::Create, CWnd::CreateEx, WM_NCCREATE


 CWnd::OnNcDestroy

afx_msg void OnNcDestroy( );

说明：
当非客户区即将被销毁时，框架调用这个函数，这是Windows的窗口被销毁时调用的最后一个成员函数。缺省的实现执行一些清除工作，然后调用虚成员函数PostNcDestroy。
如果你希望执行自己的清除操作，例如删除，则应重载PostNcDestroy。如果你重载了OnNcDestroy，则必须调用基类的OnNcDestroy以确保内部为窗口分配的内存都被释放。

请参阅：
CWnd::DestroyWindow, CWnd::OnNcCreate, WM_NCDESTROY, CWnd::Default, CWnd::PostNcDestroy


 CWnd::OnNcHitTest

afx_msg UINT OnNcHitTest( CPoint point );

返回值：下面列出的鼠标击中测试枚举值之一。
· | HTBORDER | 在不具有可变大小边框的窗口的边框上。
· | HTBOTTOM | 在窗口的水平边框的底部。
· | HTBOTTOMLEFT | 在窗口边框的左下角。
· | HTBOTTOMRIGHT | 在窗口边框的右下角。
· | HTCAPTION | 在标题条中。
· | HTCLIENT | 在客户区中。
· | HTERROR | 在屏幕背景或窗口之间的分隔线上（与HTNOWHERE相同，除了Windows的DefWndProc函数产生一个系统响声以指明错误）。
· | HTGROWBOX | 在尺寸框中。
· | HTHSCROLL | 在水平滚动条上。
· | HTLEFT | 在窗口的左边框上。
· | HTMAXBUTTON | 在最大化按钮上。
· | HTMENU | 在菜单区域。
· | HTMINBUTTON | 在最小化按钮上。
· | HTNOWHERE | 在屏幕背景或窗口之间的分隔线上。
· | HTREDUCE | 在最小化按钮上。
· | HTRIGHT | 在窗口的右边框上。
· | HTSIZE | 在尺寸框中。（与HTGROWBOX相同）
· | HTSYSMENU | 在控制菜单或子窗口的关闭按钮上。
· | HTTOP | 在窗口水平边框的上方。
· | HTTOPLEFT | 在窗口边框的左上角。
· | HTTOPRIGHT | 在窗口边框的右上角。
· | HTTRANSPARENT | 在一个被其它窗口覆盖的窗口中。
· | HTVSCROLL | 在垂直滚动条中。
· | HTZOOM | 在最大化按钮上。

参数：
point包含了光标的x轴和y轴坐标。这些坐标总是用屏幕坐标给出的。

说明：
每当鼠标移动时，框架就为包含光标（或者是用SetCapture成员函数捕获了鼠标输入的CWnd对象）的CWnd对象调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::GetCapture, WM_NCHITTEST


 CWnd::OnNcLButtonDblClk

afx_msg void OnNcLButtonDblClk( UINT nHitTest, CPoint point );

参数：
nHitTest | 指定了击中测试代码。击中测试用于确定光标的位置。
point | 指定了一个CPoint对象，其中包含了光标位置的x轴和y轴屏幕坐标。这些坐标总是相对于屏幕的左上角的。

说明：
当用户在CWnd的非客户区内双击鼠标左键时，框架调用这个成员函数。
如果合适的话，将发出WM_SYSCOMMAND消息。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_NCLBUTTONDBLCLK, CWnd::OnNcHitTest


 CWnd::OnNcLButtonDown

afx_msg void OnNcLButtonDown( UINT nHitTest, CPoint point );

参数：
nHitTest | 指定了击中测试代码。击中测试用于确定光标的位置。
point | 指定了一个CPoint对象，其中包含了光标位置的x轴和y轴屏幕坐标。这些坐标总是相对于屏幕的左上角的。

说明：
当用户在CWnd的非客户区内按下鼠标左键时，框架调用这个成员函数。
如果合适的话，将发出WM_SYSCOMMAND消息。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
CWnd::OnNcHitTest, CWnd::OnNcLButtonDblClk, CWnd::OnNcLButtonUp, CWnd::OnSysCommand, WM_NCLBUTTONDOWN, CWnd::Default


 CWnd::OnNcLButtonUp

afx_msg void OnNcLButtonUp( UINT nHitTest, CPoint point );

参数：
nHitTest | 指定了击中测试代码。击中测试用于确定光标的位置。
point | 指定了一个CPoint对象，其中包含了光标位置的x轴和y轴屏幕坐标。这些坐标总是相对于屏幕的左上角的。

说明：
当用户在CWnd的非客户区内放开鼠标左键时，框架调用这个成员函数。
如果合适的话，将发出WM_SYSCOMMAND消息。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
CWnd::OnNcHitTest, CWnd::OnNcLButtonDown, CWnd::OnSysCommand, WM_NCLBUTTONUP


 CWnd::OnNcMButtonDblClk

afx_msg void OnNcMButtonDblClk( UINT nHitTest, CPoint point );

参数：
nHitTest | 指定了击中测试代码。击中测试用于确定光标的位置。
point | 指定了一个CPoint对象，其中包含了光标位置的x轴和y轴屏幕坐标。这些坐标总是相对于屏幕的左上角的。

说明：
当用户在CWnd的非客户区内双击鼠标中键时，框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
CWnd::OnNcHitTest, CWnd::OnNcMButtonDown, CWnd::OnNcMButtonUp, WM_NCMBUTTONDBLCLK


 CWnd::OnNcMButtonDown

afx_msg void OnNcMButtonDown( UINT nHitTest, CPoint point );

参数：
nHitTest | 指定了击中测试代码。击中测试用于确定光标的位置。
point | 指定了一个CPoint对象，其中包含了光标位置的x轴和y轴屏幕坐标。这些坐标总是相对于屏幕的左上角的。

说明：
当用户在CWnd的非客户区内按下鼠标中键时，框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
CWnd::OnNcHitTest, CWnd::OnNcMButtonDblClk, CWnd::OnNcMButtonUp, WM_NCMBUTTONDOWN


 CWnd::OnNcMButtonUp

afx_msg void OnNcMButtonUp( UINT nHitTest, CPoint point );

参数：
nHitTest | 指定了击中测试代码。击中测试用于确定光标的位置。
point | 指定了一个CPoint对象，其中包含了光标位置的x轴和y轴屏幕坐标。这些坐标总是相对于屏幕的左上角的。

说明：
当用户在CWnd的非客户区内放开鼠标右键时，框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
CWnd::OnNcHitTest, CWnd::OnNcMButtonDblClk, CWnd::OnNcMButtonDown, WM_NCMBUTTONUP


 CWnd::OnNcMouseMove

afx_msg void OnNcMouseMove( UINT nHitTest, CPoint point );

参数：
nHitTest | 指定了击中测试代码。击中测试用于确定光标的位置。
point | 指定了一个CPoint对象，其中包含了光标位置的x轴和y轴屏幕坐标。这些坐标总是相对于屏幕的左上角的。

说明：
当光标在CWnd的非客户区内移动时，框架调用这个成员函数。如果合适的话，将发出WM_SYSCOMMAND消息。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnNcHitTest, CWnd::OnSysCommand, WM_NCMOUSEMOVE


 CWnd::OnNcPaint

afx_msg void OnNcPaint( );

说明：
当非客户区需要重画时，框架调用这个成员函数。缺省的实现画出窗口的框架。
应用程序可以重载这个调用并画出自己定义的窗口边框。裁剪区域通常是矩形，即使框架的形状已经改变。

请参阅：WM_NCPAINT


 CWnd::OnNcRButtonDblClk

afx_msg void OnNcRButtonDblClk( UINT nHitTest, CPoint point );

参数：
nHitTest | 指定了击中测试代码。击中测试用于确定光标的位置。
point | 指定了一个CPoint对象，其中包含了光标位置的x轴和y轴屏幕坐标。这些坐标总是相对于屏幕的左上角的。

说明：
当用户在CWnd的非客户区内双击鼠标右键时，框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
CWnd::OnNcHitTest, CWnd::OnNcRButtonDown, CWnd::OnNcRButtonUp, WM_NCRBUTTONDBLCLK


 CWnd::OnNcRButtonDown

afx_msg void OnNcRButtonDown( UINT nHitTest, CPoint point );

参数：
nHitTest | 指定了击中测试代码。击中测试用于确定光标的位置。
point | 指定了一个CPoint对象，其中包含了光标位置的x轴和y轴屏幕坐标。这些坐标总是相对于屏幕的左上角的。

说明：
当用户在CWnd的非客户区内按下鼠标右键时，框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
CWnd::OnNcHitTest, CWnd::OnNcRButtonDblClk, CWnd::OnNcRButtonUp


 CWnd::OnNcRButtonUp

afx_msg void OnNcRButtonUp( UINT nHitTest, CPoint point );

参数：
nHitTest | 指定了击中测试代码。击中测试用于确定光标的位置。
point | 指定了一个CPoint对象，其中包含了光标位置的x轴和y轴屏幕坐标。这些坐标总是相对于屏幕的左上角的。

说明：
当用户在CWnd的非客户区内双击鼠标左键时，框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
CWnd::OnNcHitTest, CWnd::OnNcRButtonDblClk, CWnd::OnNcRButtonDown, WM_NCRBUTTONUP


 CWnd::OnNotify

virtual BOOL CWnd::OnNotify( WPARAM wParam, LPARAM lParam,LRESULT* pResult );

返回值：如果应用程序处理这个消息，则返回非零值；否则返回0。

参数：
wParam | 如果消息是从控件发出的，则标识了发出消息的控件；否则wParam为0。
lParam | 指向通知消息（NMHDR）结构的指针，其中包含了通知消息代码和附加信息。对于某些通知消息，这个指针指向一个更大的结构，NMHDR是其第一个参数。
pResult | 指向LRESULT变量的指针，如果消息被处理，则用它来保存返回代码。

说明：
框架调用这个函数以通知控件的父窗口，在控件中发生了一个事件，或者该控件需要某些类型的信息。
OnNotify处理控件通知的消息映射。在你的派生类中重载这个成员函数以处理WM_NOTIFY消息。重载函数不会处理消息映射，除非调用了基类的OnNotify。
有关WM_NOTIFY消息的更多信息参见“TN061：ON_NOTIFY和WM_NOTIFY消息”。可能你会对“TN060：新的Windows公共控件”和“TN062：Windows控件的消息反射”中描述的相关主题感兴趣。所有这些都在Visual C++联机文档中。


 CWnd::OnPaint

afx_msg void OnPaint( );

说明：
当Windows或应用程序请求重画应用程序窗口的一部分时，框架调用这个成员函数。WM_PAINT在调用UpdateWindow或RedrawWindow成员函数时发出。当设置了RDW_INTERNALPAINT标志并调用RedrawWindow成员函数时，窗口可能会接收到内部重画消息。在这种情况下，窗口可能没有更新区域。应用程序必须调用GetUpdateRect成员函数以确定窗口是否具有更新区域。如果GetUpdateRect返回0，则应用程序不应调用BeginPaint和EndPaint成员函数。
应用程序负责检查是否需要内部重画或更新，这可通过查看每条WM_PAINT消息的内部数据结构来完成，因为一条WM_PAINT可能是由于一个无效区域或由于使用RDW_INTERNALPAINT标志调用了RedrawWindow成员函数而引起的。
Windows只发送一次内部WM_PAINT消息。在通过UpdateWindow成员函数向窗口发送了内部WM_PAINT消息以后，将不会再向窗口发送其它WM_PAINT消息，直到再次使用RDW_INTERNALPAINT标志调用了RedrawWindow成员函数。
有关在文档/视应用程序中描绘图象的信息参见CView::OnDraw。
有关使用WM_PAINT的更多信息参见《Win32 SDK程序员参考》中的下列主题：
·“WM_PAINT消息”
·“使用WM_PAINT消息”

请参阅：
CWnd::BeginPaint, CWnd::EndPaint, CWnd::RedrawWindow, CPaintDC, CView::OnDraw


 CWnd::OnPaintClipboard

afx_msg void OnPaintClipboard( CWnd* pClipAppWnd, HGLOBAL hPaintStruct );

参数：
pClipAppWnd | 指定了剪贴板应用程序的窗口指针。这个指针可能是临时的，不能被保存以供将来使用。
hPaintStruct | 标识了一个PAINTSTRUCT数据结构，它确定了要画出客户区的什么部分。

说明：
当剪贴板的拥有者以CF_OWNERDISPLAY格式在剪贴板中放置了数据并且剪贴板观察器的客户区需要重画时，剪贴板观察器就调用剪贴板拥有者的OnPaintClipboard成员函数。
要确定是整个客户区还是客户区的一部分需要重画，剪贴板拥有者必须把PAINTSTRUCT结构的rcpaint成员所指定的绘图区域的大小与最近调用的OnSizeClipboard成员函数中指定的大小相比较。
OnPaintClipboard应该使用Windows的GlobalLock函数来锁定包含了PAINTSTRUCT数据结构的内存，并且在退出之前用Windows的GlobalUnlock函数来释放内存。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
::GlobalLock, ::GlobalUnlock, CWnd::OnSizeClipboard, WM_PAINTCLIPBOARD


 CWnd::OnPaletteChanged

afx_msg void OnPaletteChanged( CWnd* pFocusWnd );

参数：
pFocusWnd 指定了引起系统调色板改变的窗口的指针。这个指针可能是临时的，不能被保存。

说明：
当拥有输入焦点的窗口实现了它的逻辑调色板，因而改变了系统调色板时，框架为所有的顶层窗口调用这个成员函数。这个调用允许不具有输入焦点且拥有调色板的窗口实现它的逻辑调色板并更新其客户区。
OnPalletteChanged成员函数是为所有的顶层窗口和重叠窗口，包括改变了系统调色板，因而引起WM_PALETTECHANGED消息的窗口而调用的。如果子窗口也使用调色板，则这个消息必须发送给它。
为了避免无限循环，除非窗口确定pFocusWnd中不包含指向自己的指针，否则就不应实现其调色板。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

参阅::RealizePalette, WM_PALETTECHANGED, CWnd::OnPaletteIsChanging,CWnd::OnQueryNewPalette


 CWnd::OnPaletteIsChanging

afx_msg void OnPaletteIsChanging( CWnd* pRealizeWnd );

参数：
pRealizeWnd 指定了要实现逻辑调色板的窗口。

说明：
框架调用这个成员函数以通知应用程序，有一个应用程序即将实现它的逻辑调色板。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
CWnd::OnPaletteChanged, CWnd::OnQueryNewPalette, WM_PALETTEISCHANGING


 CWnd::OnParentNotify

afx_msg void OnParentNotify( UINT message, LPARAM lParam );

参数：
message指定了父窗口要被通知的事件和子窗口的标识符。事件是消息的低位字。如果事件为WM_CREATE或WM_DESTROY，则消息的高位字是子窗口的标识符；否则高位字没有定义。事件（消息的低位字）可以是下列值中的任意一个：
· | WM_CREATE | 子窗口正在创建。
· | WM_DESTROY | 子窗口正被销毁。
· | WM_LBUTTONDOWN | 用户将鼠标光标放在子窗口上方并按下了鼠标的左键。
· | WM_MBUTTONDOWN | 用户将鼠标光标放在子窗口上方并按下了鼠标的中键。
· | WM_RBUTTONDOWN | 用户将鼠标光标放在子窗口上方并按下了鼠标的右键。
lParam如果消息的事件（低位字）是WM_CREATE或WM_DESTROY，则lParam指定了子窗口的窗口句柄，否则lParam包含了光标的x和y坐标。x坐标为低位字，y坐标为高位字。

说明：
当子窗口被创建或销毁，或者用户在子窗口上方点击鼠标按钮时，框架调用父窗口的OnParentNotify成员函数。在子窗口被创建的时候，系统在创建窗口的Create成员函数返回之前调用OnParentNotify。当子窗口被销毁的时候，系统在任何销毁窗口的处理产生之前调用OnParentNotify。
OnParentNotify是为子窗口的所有父类窗口，包括顶层窗口调用的。
除了那些具有WS_EX_NOPARENTNOTIFY风格的子窗口外，所有的子窗口都向它们的父窗口发送这个消息。在缺省情况下，对话框中的子窗口都具有WS_EX_NOPARENTNO- TIFY风格，除非在用CreateEx成员函数创建子窗口的时候没有使用这个风格。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
CWnd::OnCreate, CWnd::OnDestroy, CWnd::OnLButtonDown, CWnd::OnMButtonDown, CWnd::OnRButtonDown, WM_PARENTNOTIFY


 CWnd::OnQueryDragIcon

afx_msg HCURSOR OnQueryDragIcon( );

返回值：
一个双字值，它在低位字中包含了光标或图标的句柄。光标和图标必须与显示器的分辨率匹配。如果应用程序返回NULL，则系统将显示缺省的光标。缺省的返回值是NULL。

说明：
框架为不具有为类图标的最小化（图标化）窗口调用这个成员函数。系统调用这个函数以在用户拖拉最小化窗口的时候显示光标。
如果应用程序返回图标或光标的句柄，系统将它转换为黑与白。
如果应用程序返回一个句柄，则这个句柄必须标识与显示设备分辨率相兼容的单色光标或图标。应用程序可以调用CWinApp::LoadCursor或CWinApp::LoadIcon成员函数以从它的可执行文件的资源中载入光标或图标并获得其句柄。

请参阅：CWinApp::LoadCursor, CWinApp::LoadIcon, WM_QUERYDRAGICON


 CWnd::OnQueryEndSession

afx_msg BOOL OnQueryEndSession( );

返回值：如果应用程序可以被方便地关闭，则返回非零值；否则返回0。

说明：
当用户选择关闭Windows或者应用程序调用Windows的ExitWindows函数时，框架调用这个成员函数。如果应用程序返回0，则Windows会话不会结束。只要有一个应用程序返回了0，Windows就停止调用OnQueryEndSession，并且向所有已经返回非零值的应用程序发送一个WM_ENDSESSION消息，参数值为FALSE。

请参阅：::ExitWindows, CWnd::OnEndSession, WM_QUERYENDSESSION


 CWnd::OnQueryNewPalette

afx_msg BOOL OnQueryNewPalette( );

返回值：如果CWnd实现了它的逻辑调色板，则返回非零值；否则为0。

说明：
当CWnd对象即将接收输入焦点时，框架就调用这个成员函数，使CWnd有机会在接收到输入焦点时实现它的逻辑调色板。

请参阅：CWnd::Default, CWnd::OnPaletteChanged, WM_QUERYNEWPALETTE


 CWnd::OnQueryOpen

afx_msg BOOL OnQueryOpen( );

返回值：如果图标可以被打开，则返回非零值；如果要防止图标被打开，则返回0。

说明：
当CWnd是最小化的，并且用户请求CWnd恢复它在被最小化之前的大小和位置时，框架调用这个成员函数。
在OnQueryOpen中，CWnd不应该执行任何可能引起激活或改变焦点的动作（例如创建对话框）。

请参阅：WM_QUERYOPEN


 CWnd::OnRButtonDblClk

afx_msg void OnRButtonDblClk( UINT nFlags, CPoint point );

参数：
nFlags指定了不同的虚拟键是否被按下。这个参数可以是下列值之一：
· | MK_CONTROL | 如果CTRL键被按下，则设置此位。
· | MK_LBUTTON | 如果鼠标左键被按下，则设置此位。
· | MK_MBUTTON | 如果鼠标中键被按下，则设置此位。
· | MK_RBUTTON | 如果鼠标右键被按下，则设置此位。
· | MK_SHIFT | 如果SHIFT键被按下，则设置此位。
point指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。

说明：
当用户双击鼠标右键时框架调用这个成员函数。
只有具有CS_DBLCLKS WNDCLASS风格的窗口才接收OnRButtonDlbClk调用。这是微软基础类窗口的缺省状态。当用户按下、释放，然后在系统规定的双击时间限制之内再次按下鼠标右键时，Windows就调用OnRButtonDblClk。双击鼠标右键实际产生四个事件：WM_RBUTTONDOWN，WM_RBUTTONUP消息，WM_RBUTTONDBLCLK调用，以及释放按钮时的另一个WM_RBUTTONUP消息。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnRButtonDown, CWnd::OnRButtonUp, WM_RBUTTONDBLCLK


 CWnd::OnRButtonDown

afx_msg void OnRButtonDown( UINT nFlags, CPoint point );

参数：
nFlags指定了不同的虚拟键是否被按下。这个参数可以是下列值之一：
· | MK_CONTROL | 如果CTRL键被按下，则设置此位。
· | MK_LBUTTON | 如果鼠标左键被按下，则设置此位。
· | MK_MBUTTON | 如果鼠标中键被按下，则设置此位。
· | MK_RBUTTON | 如果鼠标右键被按下，则设置此位。
· | MK_SHIFT | 如果SHIFT键被按下，则设置此位。
point指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。

说明：
当用户按下鼠标右键时框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnRButtonDblClk, CWnd::OnRButtonUp, WM_RBUTTONDOWN


 CWnd::OnRButtonUp

afx_msg void OnRButtonUp( UINT nFlags, CPoint point );

参数：
nFlags指定了不同的虚拟键是否被按下。这个参数可以是下列值之一：
· | MK_CONTROL | 如果CTRL键被按下，则设置此位。
· | MK_LBUTTON | 如果鼠标左键被按下，则设置此位。
· | MK_MBUTTON | 如果鼠标中键被按下，则设置此位。
· | MK_RBUTTON | 如果鼠标右键被按下，则设置此位。
· | MK_SHIFT | 如果SHIFT键被按下，则设置此位。
point指定了光标的x和y轴坐标。这些坐标通常是相对于窗口的左上角的。

说明：
当用户放开鼠标右键时框架调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnRButtonDblClk, CWnd::OnRButtonDown, WM_RBUTTONUP


 CWnd::OnRegisteredMouseWheel

afx_msg LRESULT OnRegisteredMouseWheel( WPARAM wParam, LPARAMlParam );

返回值：此时不重要。总为零。

参数：
wParam | 指针的水平位置。
lParam | 指针的垂直位置。

说明：
当用户滚动鼠标滚轮并遇到滚轮的下一个刻度时，框架就调用这个成员函数。除非被重载，否则OnRegisteredMouseWheel注册Windows的消息，将消息转发到适当的窗口，然后为该窗口调用WM_MOUSEWHEEL处理函数。重载这个成员函数以提供你自己的消息转发机制或改变鼠标滚轮的滚动特性。
注意 OnRegisteredMouseWheel处理Windows 95和Windows NT 3.51中的消息。对于Windows NT 4.0的消息处理，则使用OnMouseWheel。

请参阅：RegisterWindowMessage


 CWnd::OnRenderAllFormats

afx_msg void OnRenderAllFormats( );

说明：
当剪贴板的拥有者应用程序即将被销毁时，框架就调用拥有者的OnRenderAllFormats成员函数。
剪贴板的拥有者应当提交它能够产生的的所有格式的数据，并调用Windows的SetClipboardData函数将每种格式的数据句柄传递给剪贴板。这确保剪贴板中包含了有效的数据，即使提交数据的应用程序已经被销毁了。应用程序必须在调用Windows的SetClipboardData函数之前调用OpenClipboard成员函数，然后调用Windows函数CloseClipboard。

请参阅：
::CloseClipboard, CWnd::OpenClipboard, ::SetClipboardData, CWnd::OnRenderFormat, WM_RENDERALLFORMATS


 CWnd::OnRenderFormat

afx_msg void OnRenderFormat( UINT nFormat );

参数：
nFormat 指定了剪贴板的格式。

说明：
当一种延迟提交的特定格式需要提交时，框架就调用剪贴板拥有者的OnRenderFormat成员函数。接收者应当按照该格式提交数据，并调用Windows函数SetClipboard将它传递到剪贴板。
不要在OnRenderFormat之内调用OpenClipboard成员函数或者Windows函数CloseClipboard。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
::CloseClipboard, CWnd::OpenClipboard, ::SetClipboardData, WM_RENDERFORMAT


 CWnd::OnSetCursor

afx_msg BOOL OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message );

返回值：如果要停止进一步处理，则返回非零值；如果要继续，则返回0。

参数：
pWnd | 指定了包含光标的窗口指针。这个指针可能是临时的，不能被保存以供将来使用。
nHitTest | 指定了击中测试区域代码。击中测试确定了光标的位置。
message | 指定了鼠标消息。

说明：
如果鼠标输入没有被捕获并且鼠标使光标在CWnd对象内移动，则框架调用这个成员函数。
缺省的实现在处理之前调用父窗口的OnSetCursor。如果父窗口返回TRUE，则将停止进一步处理。调用父窗口使父窗口能够控制子窗口中光标的设置。
如果光标不在客户区内，缺省的实现将光标设为箭头；如果是在客户区内，则将光标设为注册的类光标。
如果nHitTest为HTERROR并且该消息是一个鼠标键按下消息，则将调用MessageBeep成员函数。
当CWnd进入菜单模式时，消息参数为0。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::OnNcHitTest, WM_SETCURSOR


 CWnd::OnSetFocus

afx_msg void OnSetFocus( CWnd* pOldWnd );

参数：
pOldWnd 包含了失去输入焦点的CWnd对象（可能为NULL）。这个指针可能是临时的，不能被保存以供将来使用。

说明：
框架在获得输入焦点以后调用这个成员函数。如果要显示插字符，CWnd必须在此时调用适当的插字符函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_SETFOCUS


 CWnd::OnShowWindow

afx_msg void OnShowWindow( BOOL bShow, UINT nStatus );

参数：
bShow 指定窗口是否要被显示。如果窗口要被显示，则为TRUE；如果窗口要被隐藏，则为FALSE。
nStatus指定了要显示的窗口的状态。如果是因为调用ShowWindow成员函数而发出的消息，则为0；否则nStatus为下列值之一：
· | SW_PARENTCLOSING | 父窗口正被关闭（变为图标）或弹出式窗口正被隐藏。
· | SW_PARENTOPENING | 父窗口正被打开（被显示）或弹出式窗口正被显示。 f

说明：
当CWnd对象要被显示或隐藏时，框架调用这个成员函数。当调用ShowWindow成员函数时，或者重叠窗口被最大化或复原，或者重叠式或弹出式窗口被关闭（变为图标）或打开（被显示）时，窗口被显示或隐藏。当重叠窗口被关闭时，所有的与此窗口相关的所有弹出窗口都被隐藏。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_SHOWWINDOW


 CWnd::OnSize

afx_msg void OnSize( UINT nType, int cx, int cy );

参数：
nType指定了要求的调整大小的类型。这个参数可以是下列值之一：
· | SIZE_MAXIMIZED | 窗口已经被最大化。
· | SIZE_MINIMIZED | 窗口已经被最小化。
· | SIZE_RESTORED | 窗口被改变了大小，但SIZE_MINIMIZED和SIZE_MAXIMIZED都不适用。
· | SIZE_MAXHIDE | 当其它窗口被最大化时，消息被发送到所有的弹出窗口。
· | SIZE_MAXSHOW | 当其它窗口被恢复到原来的大小时，消息被发送到所有的弹出窗口。
cx | 指定了客户区域的新宽度。
cy | 指定了客户区域的新高度。

说明：
框架在窗口的大小被改变以后调用这个成员函数。
如果在OnSize中为子窗口调用了SetScrollPos或MoveWindow成员函数，则SetScrollPos或MoveWindow的bRedraw参数必须为非零值，以使CWnd能被重画。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：CWnd::MoveWindow, CWnd::SetScrollPos, WM_SIZE


 CWnd::OnSizeClipboard

afx_msg void OnSizeClipboard( CWnd* pClipAppWnd, HGLOBAL hRect );

参数：
pClipAppWnd | 标识一个剪贴板应用程序的窗口。这个指针可能是临时的，不能被保存。
hRect | 标识一个全局内存对象。这个内存对象中包含了一个RECT数据结构，指定了剪贴板拥有者要画出的区域。

说明：
当剪贴板中包含了具有CF_OWNERDISPLAY属性的数据并且剪贴板观察器窗口的客户区发生了改变时，剪贴板观察器就调用剪贴板拥有者的OnSizeClipboard成员函数。
当剪贴板应用程序要被销毁或最小化时，OnSizeClipboard成员函数将会被调用，并且以一个空矩形（0，0，0，0）作为新的大小。这使得剪贴板拥有者可释放它的显示资源。
在OnSizeClipboard中，应用程序必须用Windows函数GlobalLock来锁定包含了RECT数据结构的内存。并且在返回控制权之前用Windows函数GlobalUnlock释放内存。

注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
::GlobalLock, ::GlobalUnlock, ::SetClipboardData, CWnd::SetClipboardViewer, WM_SIZECLIPBOARD


 CWnd::OnSizing

afx_msg void OnSizing( UINT nSide, LPRECT lpRect );

参数：
nSide | 要移动的窗口的边界。
lpRect | CRect或RECT结构的地址，将包含项的坐标。

说明：
框架调用这个成员函数以指明用户正在改变矩形的大小。通过处理这个消息，应用程序可以监控拖动矩形的大小和位置，并且如果需要，可以改变它的大小和位置。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。


 CWnd::OnSpoolerStatus

afx_msg void OnSpoolerStatus( UINT nStatus, UINT nJobs );

参数：
nStatus | 指定了SP_JOBSTATUS标志。
nJobs | 指定了打印管理器队列中的作业的数目。

说明：
每当在打印管理器中加入或删除一个打印作业时，框架就调用这个成员函数。这个调用仅用于通知目的。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_SPOOLERSTATUS


 CWnd::OnStyleChanged

afx_msg void OnStyleChanged( int nStyleType, LPSTYLESTRUCT lpStyleStruct );

参数：
nStyleType指定改变的是窗口的扩展风格还是非扩展风格。这个参数可以是下列值之一：
· | GWL_EXSTYLE | 窗口的扩展风格发生改变。
· | GWL_STYLE | 窗口的非扩展风格发生改变。
lpStyleStruct指向STYLESTRUCT结构，其中包含了窗口的新风格。应用程序可以检查这个风格，但是不能改变它们。说明框架在::SetWindowLong函数改变了窗口的一个或多个风格之后调用这个成员

说明：
框架在::SetWindowLong函数改变了窗口的一个或多个风格之后调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_STYLECHANGED


 CWnd::OnStyleChanging

afx_msg void OnStyleChanging( int nStyleType, LPSTYLESTRUCT lpStyleStruct );

参数：
nStyleType指定改变的是窗口的扩展风格还是非扩展风格。这个参数可以是下列值之一：
· | GWL_EXSTYLE | 窗口的扩展风格发生改变。
· | GWL_STYLE | 窗口的非扩展风格发生改变。
lpStyleStruct 指向一个STYLESTRUCT结构，其中包含了窗口的新风格。应用程序可以检查这些风格并改变它们。

说明：
框架在::SetWindowLong将要改变窗口的一个或多个风格时调用这个成员函数。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。


 CWnd::OnSysChar

afx_msg void OnSysChar( UINT nChar, UINT nRepCnt, UINT nFlags );

参数：
nChar | 指定了控制菜单键的ASCII字符码。
nRepCnt | 指定了重复计数（当用户按住键时产生的重复击键次数）。
nFlagsnFlags参数可以具有这些值：
值 | 含义
0-15 | 指定了重复计数。该值为用户按住键时产生的重复击键次数
16-23 | 指定了扫描码。其值依赖于原始设备制造商（OEM）
24 | 指定了该键是否是扩展键，如增强101或102键的键盘上右手的ALT和CTRL键。如果它是扩展键，则其值为1；否则为0
25-28 | Windows内部使用
29 | 指定了上下文代码。如果当按下键时ALT键是按下的，则其值为1；否则，其值为0
30 | 指定了原来的键状态。如果在消息发出之前键是按下的，则其值为1；如果是弹起的，则为0
31 | 指定了键的暂态。如果键正被释放，则其值为1，如果键正被按下，则为0

说明：
如果CWnd拥有输入焦点，并且转换出WM_SYSKEYUP和WM_SYSKEYDOWN消息，则框架调用这个成员函数。它指定了控制菜单键的虚拟键码。
如果上下文代码为0，则可以将WM_SYSCHAR消息传递给Windows的TranslateAccelerator函数，它将处理这个消息，就好像这个消息是一个普通按键消息而不是系统字符键。这就使得加速键可以在活动窗口中使用，即使活动窗口不具有输入焦点。
对于IBM增强101和102键键盘，增强键包括键盘主体部分的右ALT键和右CTRL键；数字键盘左侧的INS，DEL，HOME，END，PAGE UP，PAGE DOWN和箭头键；以及数字键盘上的斜杠（/）和ENTER键。一些其它的键盘可能支持nFlags中的扩展键位。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：::TranslateAccelerator, WM_SYSKEYDOWN, WM_SYSKEYUP, WM_SYSCHAR


 CWnd::OnSysColorChange

afx_msg void OnSysColorChange( );

说明：
当系统颜色设置发生变化时，框架为所有的顶层窗口调用这个成员函数。Windows为系统颜色变化所影响的任何窗口调用OnSysColorChange。
具有使用现有的系统颜色的刷子的应用程序必须删除这些刷子，并用新的系统颜色重新创建这些刷子。

请参阅：::SetSysColors, WM_SYSCOLORCHANGE


 CWnd::OnSysCommand

afx_msg void OnSysCommand( UINT nID, LPARAM lParam );

参数：
nID指定了请求的系统命令的类型。这个参数可以是下列值之一：
SC_CLOSE | 关闭CWnd对象。
SC_HOTKEY | 激活与应用程序指定的热键相关的CWnd对象。lParam的低位字标识了要激活的窗口的HWND句柄。
SC_HSCROLL | 水平滚动。
SC_KEYMENU | 通过击键获得菜单。
SC_MAXIMIZE (或SC_ZOOM) | 最大化CWnd对象。
SC_MINIMIZE (或SC_ICON) | 最小化CWnd对象。
SC_MOUSEMENU | 通过鼠标点击获得菜单。
SC_MOVE | 移动CWnd对象。
SC_NEXTWINDOW | 移动到下一个窗口。
SC_PREVWINDOW | 移动到前一个窗口。
SC_RESTORE | 将窗口恢复为普通的位置和大小。
SC_SCREENSAVE | 执行SYSTEM.INI文件中[boot]部分指定的屏幕保护应用程序。
SC_SIZE | 调整CWnd对象的大小。
SC_TASKLIST | 执行或激活Windows的任务管理器应用程序。
SC_VSCROLL | 垂直滚动。
lParam如果控制菜单是通过鼠标选择的，则lParam中包含了光标的位置。低位字包含了x轴坐标，高位字包含了y轴坐标；否则这个参数没有使用。
· | SC_HOTKEY | 激活与应用程序指定的热键相关的窗口。lParam的低位字标识了要激活的窗口。
· | SC_SCREENSAVE | 在控制面板的桌面部分执行屏幕保护应用程序。

说明：
当用户从控制菜单选择了一个命令，或者用户选择了最大化户最小化按钮时，框架调用这个函数。
在缺省情况下，OnSysCommand执行控制菜单对前面表格中描述的预定义动作的请求。
在WM_SYSCOMMAND消息中，nID参数的低四位被Windows内部使用。当应用程序测试nID的值时，它必须用位与操作符AND将值0xFFF0与nID的值组合在一起以获得正确的结果。
控制菜单中的菜单项可以用GetSystemMenu，AppendMenu，InsertMenu和ModifyMenu成员函数来修改。修改了控制菜单的应用程序必须处理WM_SYSCOMMAND消息，并且应用程序没有处理的任何WM_SYSCOMMAND消息都必须被发送给OnSysCommand。应用程序加入的任何命令值必须由应用程序处理，并且不能被传递给OnSysCommand
应用程序可以在任何时候通过向OnSysCommand发送WM_SYSCOMMAND消息来执行任何系统命令。
为选择控制菜单中的项的加速键（快捷方式）被转换为OnSysCommand调用；所有其它的加速键被转换为WM_COMMAND消息。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：WM_SYSCOMMAND


 CWnd::OnSysDeadChar

afx_msg void OnSysDeadChar( UINT nChar, UINT nRepCnt, UINT nFlags );

参数：
nChar | 指定了死键的字符值。
nRepCnt | 指定了重复计数。
nFlags指定了扫描码、键暂态、一起的键状态和上下文代码，如下面的列表所示：
值 | 含义
0-7 | 扫描码（依赖于OEM）。高位字的低位字节
8 | 扩展键，如功能键或数字键盘上的键（如果该键为扩展键，则返回1；否则返回0）
9-10 | 没有使用
11-12 | Windows内部使用
13 | 上下文代码（如果键被按下时ALT键是被按住的，则为1；否则为0）
14 | 以前的键状态（如果键在调用前被按下，则为1；否则为0）
15 | 暂态（如果键是要被放开，则为1；如果键是要被按下，则为0）

说明：
如果当OnSysKeyUp或OnSysKeyDown成员函数被调用时CWnd对象拥有输入焦点，则框架调用这个成员函数。它指定了死键的字符值。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
CWnd::OnSysKeyDown, CWnd::OnSysKeyUp, WM_SYSDEADCHAR, CWnd::OnDeadChar


 CWnd::OnSysKeyDown

afx_msg void OnSysKeyDown( UINT nChar, UINT nRepCnt, UINT nFlags );

参数：
nChar | 指定了被按下的键的虚拟键码。
nRepCnt | 指定了重复计数。
nFlags指定了扫描码、键暂态、以前的键状态和上下文代码，如下面的列表所示：
值 | 含义
0-7 | 扫描码（依赖于OEM）。高位字的低位字节
8 | 扩展键，如功能键或数字键盘上的键（如果该键为扩展键，则返回1；否则返回0）
9-10 | 没有使用
11-12 | Windows内部使用
13 | 上下文代码（如果键被按下时ALT键是被按住的，则为1；否则为0）
14 | 以前的键状态（如果键在调用前被按下，则为1；否则为0）
15 | 暂态（如果键是要被放开，则为1；如果键是要被按下，则为0）
对于OnSysKeyDown调用，键暂态位（15位）为0。如果按下键时ALT键被按下，则上下文代码位（13位）为1；如果因为没有窗口拥有输入焦点消息被发送到活动窗口时，它为0。

说明：
如果CWnd对象具有输入焦点，则当用户按住ALT键然后按下其它键时，框架就调用OnSysKeyDown成员函数。如果没有窗口具有当前的输入焦点，活动窗口的OnSysKeyDown成员函数将会被调用。接收调用的CWnd对象可以通过检查nFlags中的上下文代码位来区别这两种环境。
当上下文代码为0时，OnSysKeyDown接收到的WM_SYSKEYDOWN消息可以被传递给Windows的函数TranslateAccelerator，它将处理这个消息，就像这是一种普通的键盘消息而不是系统键消息。
由于自动重复，在接收到WM_SYSKEYUP消息之前，可能会产生多个OnSysKeyDown调用。以前的键状态（14位）可以用来确定OnSysKeyDown调用是代表第一个按下暂态还是重复的按下暂态。
对于IBM增强101和102键键盘，增强键包括键盘主体部分的右ALT键和右CTRL键；数字键盘左侧的INS，DEL，HOME，END，PAGE UP，PAGE DOWN和箭头键；以及数字键盘上的斜杠（/）和ENTER键。一些其它的键盘可能支持nFlags中的扩展键位。
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：
::TranslateAccelerator, WM_SYSKEYUP, WM_SYSKEYDOWN


 CWnd::OnSysKeyUp

afx_msg void OnSysKeyUp( UINT nChar, UINT nRepCnt, UINT nFlags );

参数：
nChar | 指定了被释放的键的虚拟键码。
nRepCnt | 指定了重复计数。
nFlags指定了扫描码、键暂态码、以前的键状态和上下文代码，如下面的列表所示：
值 | 含义
0-7 | 扫描码（依赖于OEM）。高位字的低位字节
8 | 扩展键，如功能键或数字键盘上的键（如果该键为扩展键，则返回1；否则返回0）
9-10 | 没有使用
11-12 | Windows内部使用
13 | 上下文代码（如果键被按下时ALT键是被按住的，则为1；否则为0）
14 | 以前的键状态（如果键在调用前被按下，则为1；否则为0）
15 | 暂态（如果键正被放开，则为1；如果键正被按下，则为0）
对于OnSysKeyUp调用，键暂态位（15位）为0。如果按下键时ALT键被按下，则上下文代码位（13位）为1；如果因为没有窗口拥有输入焦点消息被发送到活动窗口时，它为0。

说明：
如果CWnd对象具有输入焦点，则当用户放开一个在按住ALT键时按下的键时，框架就调用OnSysKeyUp成员函数。如果没有窗口具有当前的输入焦点，活动窗口的OnSysKeyUp成员函数将会被调用。接收调用的CWnd对象可以通过检查nFlags中的上下文代码位来区别这两种环境。
当上下文代码为0时，OnSysKeyUp接收到的WM_SYSKEYUP消息可以被传递给Windows的函数TranslateAccelerator，它将处理这个消息，就像这是一种普通的键盘消息，而不是系统键消息。
对于IBM增强101和102键键盘，增强键包括键盘主体部分的右ALT键和右CTRL键；数字键盘左侧的INS，DEL，HOME，END，PAGE UP，PAGE DOWN和箭头键；以及数字键盘上的斜杠（/）和ENTER键。一些其它的键盘可能支持nFlags中的扩展键位。
对于非美国增强型102键键盘，右边的ALT键被当作CTRL+ALT键组合处理。下面显示用户按下并释放这个键时生成的消息和调用的顺序：
顺序 | 访问的函数 | 传递的消息
1. | WM_KEYDOWN | VK_CONTROL
2. | WM_KEYDOWN | VK_MENU
3. | WM_KEYUP | VK_CONTROL
4. | WM_SYSKEYUP | VK_MENU
注意 框架调用这个成员函数以允许你的应用程序处理一个Windows消息。传递给你的成员函数的参数反映了接收到消息时框架接收到的参数。如果你调用了这个函数的基类实现，则该实现将使用最初传递给消息的参数（而不是你提供给这个函数的参数）。

请参阅：::TranslateAccelerator, WM_SYSKEYDOWN, WM_SYSKEYUP


 CWnd::OnTCard

afx_msg void OnTCard( UINT idAction, DWORD dwActionData );

参数：
idAction表明用户所进行的动作。此参数可以是下列值之一：
· | IDABORT | 用户点击了可选的Abort按钮。
· | IDCANCEL | 用户点击了可选的Cancel按钮。
· | IDCLOSE | 用户关闭了训练卡片。
· | IDHELP | 用户点击了可选的Windows Help按钮。
· | IDIGNORE | 用户点击了可选的Ignore按钮。
· | IDOK | 用户点击了可选的OK按钮。
· | IDNO | 用户点击了可选的No按钮。
· | IDRETRY | 用户点击了可选的Retry按钮。
· | HELP_TCARD_DATA | 用户点击了一个可选的按钮。dwActionData参数包含了一个由帮助编写者指定的长整数。
· | HELP_TCARD_NEXT | 用户点击了可选的Next按钮。
· | HELP_TCARD_OTHER_CALLER | 另一个应用程序请求训练卡片。
· | IDYES | 用户点击了可选的Yes按钮。
dwActionData 如果idAction指定的是HELP_TCARD_DATA，则此参数是由帮助编写者指定的长整数；否则这个参数是零。

说明：
当用户点击一个可选的按钮时，框架调用这个成员函数。只有当用户单击了Windows Help的某个训练卡片时，这个函数才会被调用。应用程序通过在一个对WinHelp函数的调用中指定HELP_TCARD命令来初始化一个训练卡片。

请参阅：::WinHelp, CWinApp::WinHelp


 CWnd::OnTimeChange

afx_msg void OnTimeChange( );

说明：
在系统时间被改变之后，框架调用此成员函数。
任何应用程序在改变系统时间之后都向所有的顶层窗口发送这个消息。要向所有的顶层窗口发送WM_TIMECHANGE消息，应用程序可以使用Windows函数SendMessage，将它的hwnd参数设置为HWND_BROADCAST。

请参阅：::SendMessage, WM_TIMECHANGE


 CWnd::OnTimer

afx_msg void OnTimer( UINT nIDEvent );

参数：
nIDEvent 指定定时器的标识符。

说明：
当在SetTimer成员函数中指定的每一个时间间隔都被用来安装一个定时器之后，框架调用这个成员函数。
当在应用程序的消息队列中没有其它的消息时，Windows函数DispatchMessage发送一个WM_TIMER消息。
注意 框架调用这个成员函数来使你的应用程序可以处理一个Windows消息。传递给你的函数的参数反映了在消息收到时框架收到的参数。如果你调用了这个函数的基类实现，这个实现将使用最初随着消息传递过来的参数，而不是使用你提供给函数的参数。

请参阅：CWnd::SetTimer, WM_TIMER


 CWnd::OnToolHitTest

virtual int CWnd::OnToolHitTest( CPoint point, TOOLINFO* pTI ) const;

返回值：如果发现了工具提示控制，则返回1；如果没有发现工具提示控制，则返回-1。

参数：
point 指定光标的x-和y-坐标。这些坐标总是相对于窗口的左上角的。
pTI是一个指向TOOLINFO结构的指针。下面的结构值是缺省设置的：
· | hwnd = m_hWnd | 一个窗口的句柄。
· | uId = (UINT)hWndChild | 一个子窗口的句柄。
· | uFlags |= TTF_IDISHWND | 工具的句柄。
· | lpszText = LPSTR_TEXTCALLBACK | 指向要被显示在指定窗口中的字符串的指针。

说明：
框架调用这个成员函数来确定一个点是否在指定工具的边界矩形之内。如果该点是在此矩形之内，则此函数返回有关这个工具的信息。
如果与工具提示关联的该区域不是一个按钮，则OnToolHitTest将结构标志设置为TTF_NOTBUTTON和TTF_CENTERTIP。
重载OnToolHitTest可以提供与缺省不同的信息。
参见《Win32 SDK程序员参考》中的“TOOLINFO”可以获得有关此结构的更多信息。

请参阅：TOOLINFO, CWnd::FilterToolTipMessage


 CWnd::OnVKeyToItem

prot afx_msg int OnVKeyToItem( UINT nKey, CListBox* pListBox, UINT nIndex );

返回值：
返回值指定了在对消息作出响应时应用程序所执行的动作。返回值为-2表示应用程序处理了所选项的各个方面，并且不需要列表框执行更进一步的动作。返回值为-1表示必须执行缺省的动作来响应按键。返回值为0或更大表示列表框中的一个项从零基索引，并且表明了该列表框必须对给定项执行缺省的动作来响应按键。

参数：
nKey | 指定用户按下的键的虚键代码。
pListBox | 指定一个指向此列表框的指针。该指针可能是临时的，且不得为将来使用而保存该指针。
nIndex | 指出插字符的当前位置。

说明：
如果CWnd对象拥有一个具有LBS_WANTKEYBOARDINPUT风格的列表框，则该列表框将发送WM_VKEYTOITEM消息来响应一个WM_KEYDOWN消息。
只有对具有LBS_HASSTRINGS风格的列表框框架才调用这个成员函数。
注意 框架调用这个成员函数来使你的应用程序可以处理一个Windows消息。传递给你的函数的参数反映了在消息收到时框架收到的参数。如果你调用了这个函数的基类实现，这个实现将使用最初随着消息传递过来的参数，而不是使用你提供给函数的参数。

请参阅：WM_KEYDOWN, WM_VKEYTOITEM


 CWnd::OnVScroll

afx_msg void OnVScroll( UINT nSBCode, UINT nPos, CScrollBar* pScrollBar );

参数：
nSBCode指定一个指示用户的滚动请求的滚动条代码。这个参数可以是下列值之一：
· | SB_BOTTOM | 滚动到底部。
· | SB_ENDSCROLL | 结束滚动。
· | SB_LINEDOWN | 向下滚动一行。
· | SB_LINEUP | 向上滚动一行。
· | SB_PAGEDOWN | 向下滚动一页。
· | SB_PAGEUP | 向上滚动一页。
· | SB_THUMBPOSITION | 滚动到一个绝对位置。当前位置在nPos中指定。
· | SB_THUMBTRACK | 拖动滚动框到指定位置。当前位置在nPos中指定。
· | SB_TOP | 滚动到顶部。
nPos 如果滚动条代码是SB_THUMBPOSITION或SB_THUMBTRACK，则此参数指定滚动框的位置；否则不使用此参数。根据初始的滚动范围，nPos可能会是负值，如果需要的话可将其强制转换为int值。
pScrollBar如果滚动信息来自于一个滚动条控制，则此参数是指向该控制的指针。如果用户单击了一个窗口的滚动条，则此参数是NULL。该指针可能是临时的，不能被保存为给将来使用。

说明：
当用户单击窗口的垂直滚动条时，框架调用此成员函数。
希望滚动框被拖动时给出一定反馈的应用程序通常会使用OnVScroll函数。
如果OnVScroll滚动此CWnd对象的内容，则必须调用SetScrollPos成员函数来恢复滚动条的位置。
注意 框架调用这个成员函数来使你的应用程序可以处理一个Windows消息。传递给你的函数的参数反映了在消息收到时框架收到的参数。如果你调用了这个函数的基类实现，这个实现将使用最初随着消息传递过来的参数，而不是使用你提供给函数的参数。

请参阅：CWnd::SetScrollPos, CWnd::OnHScroll, WM_VSCROLL


 CWnd::OnVScrollClipboard

afx_msg void OnVScrollClipboard( CWnd* pClipAppWnd, UINT nSBCode, UINT nPos );

参数：
pClipAppWnd 指定了一个指向Clipboard-viewer窗口的指针。该指针可能是临时的，不能被保存来给将来使用。
nSBCode指定下列滚动条值之一：
· | SB_BOTTOM | 滚动到底部。
· | SB_ENDSCROLL | 结束滚动。
· | SB_LINEDOWN | 向下滚动一行。
· | SB_LINEUP | 向上滚动一行。
· | SB_PAGEDOWN | 向下滚动一页。
· | SB_PAGEUP | 向上滚动一页。
· | SB_THUMBPOSITION | 滚动到一个绝对位置。当前位置在nPos中指定。
· | SB_THUMBTRACK | 拖动滚动框到指定位置。当前位置在nPos中指定。
· | SB_TOP | 滚动到顶部。nPos如果滚动条代码是SB_THUMBPOSITION，则此参数包含了滚动框的位
nPos如果滚动条代码是SB_THUMBPOSITION，则此参数包含了滚动框的位置；否则不使用nPos。

说明：
当剪贴板数据具有CF_OWNERDISPLAY格式，并且在剪贴板查看者的垂直滚动条中发生了一个事件时，剪贴板查看者调用该剪贴板拥有者的OnVScrollClipboard成员函数。该拥有者应该滚动剪贴板图象使适当的区域无效，并更新滚动条的值。
注意 框架调用这个成员函数来使你的应用程序可以处理一个Windows消息。传递给你的函数的参数反映了在消息收到时框架收到的参数。如果你调用了这个函数的基类实现，这个实现将使用最初随着消息传递过来的参数，而不是使用你提供给函数的参数。

请参阅：
CWnd::Invalidate, CWnd::OnHScrollClipboard, CWnd::InvalidateRect, WM_VSCROLLCLIPBOARD, CWnd::Default


 CWnd::OnWindowPosChanged

afx_msg void OnWindowPosChanged( WINDOWPOS* lpwndpos );

参数：
lpwndpos 指向一个WINDOWPOS数据结构，该结构包含了有关此窗口的新尺寸和位置的信息。

说明：
当调用SetWindowPos成员函数或其它窗口管理函数改变了窗口的尺寸、位置或Z次序时，框架调用此成员函数。
此函数的缺省实现给窗口发送WM_SIZE和WM_MOVE。如果应用程序在处理OnWindowPosChanged调用时没有调用它的基类，则不发送这些消息。在OnWindowPosChanged调用中不调用它的基类版来完成一定或修改尺寸的处理将是更加有效的。
注意 框架这个成员函数来使你的应用程序可以处理一个Windows消息。传递给你的函数的参数反映了在消息收到时框架收到的参数。如果你调用了这个函数的基类实现，这个实现将使用最初随着消息传递过来的参数，而不是使用你提供给函数的参数。

请参阅：WM_WINDOWPOSCHANGED


 CWnd::OnWindowPosChanging

afx_msg void OnWindowPosChanging( WINDOWPOS* lpwndpos );

参数：
lpwndpos 指向一个WINDOWPOS数据结构，其中包含了有关窗口新的大小和位置的信息。

说明：
当由于调用了SetWindowPos成员函数或其它的窗口管理函数，窗口的大小、位置或Z轴次序将要发生变化时，框架就调用这个成员函数。
应用程序可以设置或清除WINDOWPOS结构中flags成员的适当的位以便防止窗口发生变化。
对于具有WS_OVERLAPPED或WS_THICKFRAME风格的窗口，缺省的实现向窗口发送一个WM_GETMINMAXINFO消息。这被用来使窗口的新大小和位置有效，并强制使用CS_BYTEALIGNCLIENT和CS_BYTEALIGN客户风格。应用程序可以不调用基类而替换这个功能。
注意 框架这个成员函数来使你的应用程序可以处理一个Windows消息。传递给你的函数的参数反映了在消息收到时框架收到的参数。如果你调用了这个函数的基类实现，这个实现将使用最初随着消息传递过来的参数，而不是使用你提供给函数的参数。

请参阅：CWnd::OnWindowPosChanged, WM_WINDOWPOSCHANGING


 CWnd::OnWinIniChange

afx_msg void OnWinIniChange( LPCTSTR lpszSection );

参数：
lpszSection 指向一个字符串，该字符串指定了已改变部分的名称（该字符串不包括围绕该部分名称的方括号）。

说明：
在Windows初始化文件WIN.INI发生了一个改变后，框架调用此成员函数。Windows 函数SystemParametersInfo在应用程序使用此函数修改了WIN.INI文件中的一个设置之后调用OnWinIniChange。
要向所有的顶层窗口发送WM_WININICHANGE消息，应用程序可以通过将其hwnd参数设置为HWND_BROADCAST来使用Windows函数SendMessage。
如果一个应用程序同时改变了WIN.INI中的不同部分，应用程序应该将lpszSection设置为NULL，发送一个WM_WININICHANGE消息；否则应用程序在每次对WIN.INE作一个改变时就应该发送一个WM_WININICHANGE消息。
如果应用程序接收到对OnWinIniChange的调用，并且lpszSection被设为NULL，则应用程序将检查WIN.INI中影响这个应用程序的所有部分。
注意 框架这个成员函数来使你的应用程序可以处理一个Windows消息。传递给你的函数的参数反映了在消息收到时框架收到的参数。如果你调用了这个函数的基类实现，这个实现将使用最初随着消息传递过来的参数，而不是使用你提供给函数的参数。

请参阅：::SendMessage, ::SystemParametersInfo, WM_WININICHANGE


 CWnd::OnWndMsg

virtual BOOL OnWndMsg( UINT message, WPARAM wParam, LPARAM lParam,LRESULT* pResult );

返回值：如果这个消息被处理，则返回非零值；否则返回0。

参数：
message | 指定了被发送的消息。
wParam | 指定了与消息有关的附加信息。
lParam | 指定了与消息有关的附加信息。
pResult | WindowProc的返回值。与消息有关，可能是NULL。

说明：
这个成员函数是由WindowProc调用的，或者是在消息反射时调用。
有关消息反射的更多信息参见联机的《Visual C++ 程序员指南》中的“处理反射的消息”。

请参阅：
CWnd::OnChildNotify, CWnd::SendChildNotifyLastMsg, CWnd::ReflectChildNotify, CCmdTarget::OnCmdMsg, CWnd::ReflectLastMsg


 CWnd::OpenClipboard

BOOL OpenClipboard( );

返回值：
如果通过CWnd打开了剪贴板，则返回非零值；如果其它应用程序或窗口已经打开了剪贴板，则返回0。

说明：
打开剪贴板。在调用Windows的CloseClipboard函数之前，其它应用程序将不能修改剪贴板的内容。
在调用Windows的EmptyClipboard函数之前，当前的CWnd对象将不会称为剪贴板的拥有者。

请参阅：::CloseClipboard, ::EmptyClipboard, ::OpenClipboard


 CWnd::PostMessage

BOOL PostMessage( UINT message, WPARAM wParam = 0, LPARAM lParam =0 );

返回值：如果公布了消息，则返回非零值；否则返回0。

参数：
message | 指定了要公布的消息。
wParam | 指定了附加的消息信息。这个参数的内容依赖于要公布的消息。
lParam | 指定了附加的消息信息。这个参数的内容依赖于要公布的消息。

说明：
这个函数将一个消息放入窗口的消息队列，然后直接返回，并不等待对应的窗口处理消息。消息队列中的消息是通过调用Windows的GetMessage或PeekMessage函数来获得的。
可以通过Windows的PostMessage函数来访问其它应用程序。

请参阅：
::GetMessage, ::PeekMessage, ::PostMessage, ::PostAppMessage, CWnd::SendMessage


 CWnd::PostNcDestroy

virtual void PostNcDestroy( );

参数：
在窗口被销毁以后，缺省的OnNcDestroy成员函数调用这个函数。派生类可以利用这个函数来执行自定义的清除工作，比如删除指针。

请参阅：CWnd::OnNcDestroy


 CWnd::PreCreateWindow

virtual BOOL PreCreateWindow( CREATESTRUCT& cs );

返回值：如果要继续窗口的创建过程，则返回非零值；返回0则表明创建过程失败。

参数：
cs 一个CREATESTRUCT结构。

说明：
框架在与CWnd对象相连接的Windows窗口被创建之前调用这个成员函数。永远不要直接调用这个函数。
这个函数的缺省实现检验窗口类名是否为NULL，如是，则用适当的缺省值来代替。重载这个函数以在窗口被创建之前修改CREATESTRUCT结构。
每个从CWnd派生的类都在它重载的PreCreateWindow中加入了自己的功能。在设计时，没有描述这些派生的PreCreatWindow。要确定每个类的适当的风格以及风格之间的相互依赖关系，你可以检查与你的应用程序的基类有关的MFC源代码。如果你选择了重载PreCreateWindow，则你可以使用从MFC源代码中收集的信息来确定你的应用程序的基类中使用的风格是否能够提供你需要的功能。
有关改变窗口风格的更多信息参见联机的《Visual C++程序员指南》中的“改变MFC创建的窗口的风格”。

请参阅：CWnd::Create, CWnd::CreateEx, CREATESTRUCT


 CWnd::PreSubclassWindow

virtual void PreSubclassWindow( );

说明：
框架调用这个成员函数以允许在窗口被子类化之前进行其它必要的子类化。重载这个函数以允许控件的动态子类化。这是个高级可重载函数。

请参阅：
CWnd::SubclassWindow, CWnd::UnsubclassWindow, CWnd::GetSuperWndProcAddr, CWnd::DefWindowProc, CWnd::SubclassDlgItem, CWnd::Attach, CWnd::PreCreateWindow


 CWnd::PreTranslateMessage

virtual BOOL PreTranslateMessage( MSG* pMsg );

返回值：
如果消息被转换但是不会被分派，则返回非零值；如果消息没有被转换并且要被分派，则返回0。

参数：
pMsg 指向一个MSG结构，其中包含了要处理的消息。

说明：
CWinApp类使用这个函数以在消息被分派到Windows的TranslateMessage和DispatchMessage函数之前进行转换。

请参阅：
::TranslateMessage, ::IsDialogMessage, CWinApp::PreTranslateMessage


 CWnd::Print

void Print( CDC* pDC, DWORD dwFlags ) const;

参数：
pDC 指向设备环境的指针。
dwFlags指定了绘图选项。这个参数可以是下列标志中的一个或多个：
· | PRF_CHECKVISIBLE | 仅当窗口可见时才画出窗口。
· | PRF_CHILDREN | 画出所有可见的子窗口。
· | PRF_CLIENT | 画出窗口的客户区。
· | PRF_ERASEBKGND | 在画出窗口之前擦去背景。
· | PRF_NONCLIENT | 画出窗口的非客户区。
· | PRF_OWNED | 画出拥有的所有窗口。

说明：
调用这个成员函数以在指定的设备环境中画出当前窗口，通常是在打印机设备环境中。
CWnd::DefWindowProc函数根据指定的绘图选项处理这个消息：
· | 如果指定了PRF_CHECKVISIBLE并且窗口不可见，则不做任何操作。
· | 如果指定了PRF_NONCLIENT，则在指定的设备环境中画出非客户区。
· | 如果指定了PRF_ERASEBKGND，则向窗口发送一条WM_ERASEBKGND消息。
· | 如果指定了PRF_PRINTCLIENT，则向窗口发送一条WM_PRINTCLIENT消息。
· | 如果指定了PRF_PRINTCHILDREN，则向每个可见的子窗口发送一条WM_PRINT消息。
· | 如果指定了PRF_OWNED，则向拥有的每个可见窗口发送一条WM_PRINT消息。

请参阅：WM_PRINT, WM_PRINTCLIENT


 CWnd::PrintClient

void PrintClient( CDC* pDC, DWORD dwFlags ) const;

参数：
pDC 指向设备环境的指针。
dwFlags指定了绘图选项。这个参数可以是这些标志中的一个或多个：
· | PRF_CHECKVISIBLE | 仅当窗口可见时才画出窗口。
· | PRF_CHILDREN | 画出所有可见的子窗口。
· | PRF_CLIENT | 画出窗口的客户区。
· | PRF_ERASEBKGND | 在画出窗口之前擦除背景。
· | PRF_NONCLIENT | 画出窗口的非客户区。
· | PRF_OWNED | 画出拥有的所有窗口。

说明：
调用这个成员函数以在指定的设备环境（通常是一个打印机设备环境）中画出任何窗口。

请参阅：WM_PRINTCLIENT


 CWnd::RedrawWindow

BOOL RedrawWindow(
LPCRECT lpRectUpdate = NULL,
CRgn* prgnUpdate = NULL,
UINT flags = RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE
);

返回值：如果窗口被成功地重画，则返回非零值；否则返回0。

参数：
lpRectUpdate | 指向一个RECT结构，其中包含了更新区域的坐标。如果prgnUpdate中包含了有效的区域句柄，则这个参数将被忽略。
prgnUpdate | 表示了更新区域。如果prgnUpdate和lpRectUpdate都为NULL，则整个客户区将被加入更新区域。
flags下面的标志被用于使窗口无效：
RDW_ERASE | 使窗口在重画时接收到一个WM_ERASEBKGND消息。必须同时指定RDW_INVALIDATE标志；否则RDW_ERASE标志将没有效果。
RDW_FRAME | 使窗口非客户区中与更新区域重叠的任何部分接收到一条WM_NCPAINT消息。必须同时指定RDW_INVALIDATE标志，否则RDW_FRAME标志将没有效果。
RDW_INTERNALPAINT | 使一条WM_PAINT消息被传递到窗口，而不管窗口是否包含一个无效区域。
RDW_INVALIDATE | 使lpRectUpdate或prgnUpdate（仅有一个可能为NULL）无效。如果这个两个参数都为NULL，则整个窗口都无效。

下面的标志被用于使窗口有效：
RDW_NOERASE | 禁止任何未处理的WM_ERASEBKGND消息。
RDW_NOFRAME | 禁止任何未处理的WM_NCPAINT消息。这个标志必须与RDW_VALIDATE一起使用，通常也与RDW_NOCHILDREN一起使用。这个选项必须小心使用，因为它可能会使窗口的某些部分不能正确地画出。
RDW_NOINTERNALPAINT | 禁止任何未处理的内部WM_PAINT消息。这个标志不影响从无效区域产生的WM_PAINT消息。
RDW_VALIDATE | 使lpRectUpdate或prgnUpdate（仅有一个可能为NULL）有效。如果这个两个参数都为NULL，则整个窗口都有效。这个标志不影响内部WM_PAINT消息。 下面的标志控制着何时产生重画动作。除非指定了这些位，否则RedrawWindow函数不会执行绘图动作。
RDW_ERASENOW | 如果有必要，则在函数返回前使涉及的窗口（如RDW_ALLCHILDREN和RDW_NOCHILDREN标志所指定的）接收到WM_NCPAINT和WM_ERASEBKGND消息。WM_PAINT消息将被延缓。
RDW_UPDATENOW | 如果有必要，则在函数返回前使涉及的窗口（如RDW_ALLCHILDREN和RDW_NOCHILDREN标志所指定的）接收到WM_NCPAINT，WM_ERASEBKGND和WM_PAINT消息。 在缺省情况下，RedrawWindow函数影响的窗口依赖于指定的窗口是否具有WS_CLIPCHILDREN风格。WS_CLIPCHILDREN窗口的子窗口不会被影响。但是，那些不具有WS_CLIPCHILDREN风格的窗口将被递归地有效或无效，直到遇见具有WS_CLIPCHILDREN风格的窗口。下面的标志控制着RedrawWindow函数将影响哪些窗口：
RDW_ALLCHILDREN | 在重画操作中包含子窗口，如果有的话。
RDW_NOCHILDREN | 在重画操作中不包括子窗口，如果有的化。

说明：
这个函数更新给定窗口的客户区中指定的矩形或区域。
当RedrawWindow成员函数被用于使捉摸窗口的部分无效的时候，该窗口不接收WM_PAINT消息。如果要重画桌面，应用程序必须使用CWnd::ValidateRgn，CWnd::InvalidateRgn，CWnd::UpdateWindow或::RedrawWindow。


 CWnd::ReflectChildNotify

BOOL ReflectChildNotify(UINT message, WPARAM wParam, LPARAM lParam,LRESULT* pResult );

返回值：如果消息被反射，则返回TRUE；否则返回FALSE。

参数：
message | 指定了要反射的消息。
wParam | 指定了与消息有关的附加信息。
lParam | 指定了与消息有关的附加信息。
pResult | 子窗口生成的结果，将要由父窗口返回。可以是NULL。

说明：
这个消息函数是由框架在OnChildNotify内调用的。它是在将消息反射到它的来源时使用的帮助函数。
反射消息是用CWnd::OnWndMsg或CCmdTarget::OnCmdMsg直接发送的。
有关消息反射的更多信息参见联机的《Visual C++ 程序员指南》中的“处理反射消息”。

请参阅：
CWnd::OnChildNotify, CWnd::SendChildNotifyLastMsg, CWnd::OnWndMsg, CCmdTarget::OnCmdMsg, CWnd::ReflectLastMsg


 CWnd::ReflectLastMsg

static BOOL PASCAL ReflectLastMsg( HWND hWndChild, LRESULT* pResult =NULL );

返回值：如果消息被处理，则返回非零值；否则返回0。

参数：
hWndChild | 子窗口句柄。
pResult | 子窗口生成的结果，将要由父窗口返回。可以是NULL。

说明：
这个成员函数是由框架调用的，用于将最近的消息反射到子窗口。
如果hWndChild标识的窗口是一个OLE控件或永久映射中的窗口，则这个成员函数调用SendChildNotifyLastMsg。
有关消息反射的更多信息参见Visual C++ 程序员联机指南中的“处理反射消息”。

请参阅：
CWnd::OnChildNotify, CWnd::SendChildNotifyLastMsg, CWnd::ReflectChildNotify, CCmdTarget::OnCmdMsg


 CWnd::ReleaseDC

int ReleaseDC( CDC* pDC );

返回值：如果成功，则返回非零值；否则返回0。

参数：
pDC 标识了要释放的设备环境。

说明：
释放设备环境，以供其它应用程序使用。ReleaseDC成员函数的效果依赖于设备环境的类型。
对于GetWindowDC和GetDC成员函数的每一次调用，应用程序都应当调用ReleaseDC成员函数。

请参阅：CWnd::GetDC, CWnd::GetWindowDC, ::ReleaseDC


 CWnd::RepositionBars

void RepositionBars(
UINT nIDFirst,
UINT nIDLast,
UINT nIDLeftOver,
UINTnFlag = CWnd::reposDefault,
LPRECT lpRectParam = NULL,
LPCRECTlpRectClient = NULL,
BOOL bStretch = TRUE
);

参数：
nIDFirst | 要重新定位并改变大小的控制条范围中的第一个控制条的ID。
nIDLast | 要重新定位并改变大小的控制条范围中的最后一个控制条的ID。
nIDLeftOver | 指定了填充客户区其余部分的方格的ID。
nFlag可以具有下列值：
· | CWnd::reposDefault | 实现控制条的布局。lpRectParam没有被使用，可以是NULL。
· | CWnd::reposQuery | 没有执行控制条的布局，相反用客户区的大小初始化了lpRectParam，就像已经完成了布局一样。
· | CWnd::reposExtra | 将lpRectParam的值加到nIDLast的客户区上，并执行布局。
lpRectParam | 指向一个RECT结构；其用法依赖于nFlag的值。
lpRectClient | 指向一个RECT结构，其中包含了可用的客户区。如果为NULL，则窗口的客户区将被使用。
bStretch | 指明控制条是否要被缩放到框架的大小。

说明：
调用这个函数以在窗口的客户区中重定位控制条并改变其大小。nIDFirst和nIDLast参数定义了要在客户区内重定位的控制条ID的范围。nIDLeftOver参数指定了被用来重定位并改变大小，以填充客户区中没有被控制条覆盖的区域的子窗口（通常是视）的ID。

请参阅：CFrameWnd::RecalcLayout


 CWnd::RunModalLoop

int RunModalLoop( DWORD dwFlags );

返回值：
指定了传递给EndModalLoop成员函数的nResult参数的值，随后该函数被用于结束模式循环。

参数：
dwFlags指定了要被发送的Windows消息。可以是下列值之一：
· | MLF_NOIDLEMSG | 不向父窗口发送WM_ENTERIDLE消息。
· | MLF_NOKICKIDLE | 不向窗口发送WM_KICKIDLE消息。
· | MLF_SHOWONIDLE | 当消息队列变为空闲时显示窗口。

说明：
调用这个成员函数以获得、转换或分派消息，直到ContinueModal返回FALSE。在缺省情况下，ContinueModal在调用EndModalLoop之后返回FALSE。返回作为EndModalLoop的nResult提供的值。

请参阅：EndModalLoop, WM_ENTERIDLE


 CWnd::ScreenToClient

void ScreenToClient( LPPOINT lpPoint ) const;
void ScreenToClient( LPRECT lpRect ) const;

参数：
lpPoint | 指向一个CPoint对象或POINT结构，其中包含了要转换的屏幕坐标。
lpRect | 指向一个CRect对象或RECT结构，其中包含了要转换的屏幕坐标。

说明：
将显示器上给定点或矩形的屏幕坐标转换为客户坐标。
ScreenToClient成员函数将lpPoint或lpRect给定的屏幕坐标替换为客户坐标。新的坐标是相对于CWnd客户区的左上角的。

请参阅：CWnd::ClientToScreen, ::ScreenToClient


 CWnd::ScrollWindow

void ScrollWindow( int xAmount, int yAmount, LPCRECT lpRect = NULL,LPCRECT lpClipRect = NULL );

参数：
xAmount | 指定了水平滚动的量，使用设备单位。在左滚时，该参数必须为负。
yAmount | 指定了垂直滚动的量，使用设备单位。在上滚时，该参数必须为负。
lpRect | 指向一个CRect对象或RECT结构，指定了要滚动的客户区的部分。如果lpRect为NULL，则将滚动整个客户区。如果光标区域与滚动矩形重叠，则插字符将被重定位。
lpClipRect | 指向一个CRect对象或RECT结构，指定了要滚动的裁剪区域。只有这个矩形中的位才会被滚动。在矩形之外的位不会被影响，即使它们是在lpRect矩形之内。如果lpClipRect为NULL，则不会在滚动矩形上进行裁剪。

说明：
这个函数滚动当前CWnd对象的客户区内容。
如果插字符在要滚动的CWnd之内，则ScrollWindow自动将插字符隐藏，以避免它被擦除，然后当滚动完成以后，再恢复插字符。插字符的位置将相应地调整。
ScrollWindow成员函数所涉及的区域将不会被重画，但是将被加入当前CWnd对象的更新区域。应用程序最终将接收到一条WM_PAINT消息，通知它这个区域需要重画。要在滚动完成的同时重画涉及的区域，则应在调用ScrollWindow之后立即调用UpdateWindow成员函数。
如果lpRect为NULL，则窗口的任何子窗口的位置将被设为xAmout和yAmout指定的偏移，并且CWnd中任何无效（未画出）区域也被加上偏移。当lpRect为NULL的时候，ScrollWindow更快一些。
如果lpRect不为NULL，则子窗口的位置不发生变化，并且CWnd的无效区域也没有偏移。当lpRect为NULL的时候，如果要防止更新问题，则应在调用ScrollWindow之前调用UpdateWindow成员函数以重画CWnd。

请参阅：CWnd::UpdateWindow, ::ScrollWindow


 CWnd::ScrollWindowEx

int ScrollWindowEx(
int dx,
int dy,
LPCRECT lpRectScroll,
LPCRECT lpRectClip,
CRgn* prgnUpdate,
LPRECT lpRectUpdate,
UINT flags
);

返回值：
如果函数成功，则返回值为SIMPLEREGION（矩形的无效矩形），COMPLEXREGION（非矩形无效区域；重叠矩形）或NULLREGION（没有无效区域）；否则返回值为ERROR。

参数：
dx | 指定了水平滚动的量，使用设备单位。在左滚时，该参数必须为负。
dy | 指定了垂直滚动的量，使用设备单位。在上滚时，该参数必须为负。
lpRectScroll | 指向RECT结构，指定了要滚动的客户区的部分。如果该参数为NULL，则将滚动整个客户区。
lpRectClip | 指向RECT结构，指定了要滚动的裁剪区域。这个结构优先于lpRectScroll指定的矩形。只有这个矩形中的位才会被滚动。在矩形之外的位不会被影响，即使它们是在lpRectScroll矩形之内。如果这个参数为NULL，则不会在滚动矩形上进行裁剪。
prgnUpdate | 标识了被修改的区域，用于保存因滚动而无效的区域。这个参数可能为NULL。
lpRectUpdate | 指向一个RECT结构，该结构将接收因滚动而无效的矩形的边界。这个参数可能为NULL。
flags | 可以具有下列值之一：
SW_ERASE | 当与SW_INVALIDATE一起设置时，向窗口发送一条WM_ERASEBKGND消息以擦除新的无效区域。
SW_INVALIDATE | 在滚动后使prgnUpdate标识的区域无效。
SW_SCROLLCHILDREN | 将与lpRectScroll所指定的矩形相交的所有子窗口滚动dx和dy所指定的数目的像素。Windows向与lpRectScroll相交的所有子窗口发送WM_MOVE消息，即使它们没有移动。当子窗口被滚动并且光标矩形与滚动矩形相交时，插字符被重定位。

说明：
这个函数滚动窗口的客户区内容。该函数与ScrollWindow函数类似，并具有一些附加特性。
如果没有指定SW_INVALIDATE和SW_ERASE，则ScrollWindowEx成员函数并不使滚动的区域无效。如果设置了这两者之一，则ScrollWindowEx将使区域无效。在应用程序调用UpdateWindow成员函数，或调用RedrawWindow成员函数（指定了RDW_UPDATENOW或RDW_ERASENOW），或从应用程序队列中获得WM_PAINT消息之前，这个区域将不会被更新。
如果窗口具有WS_CLIPCHILDREN风格，则prgnUpdate和lpRectUpdate指定的区域代表了必须更新的滚动窗口的全部区域，包括子窗口中所有需要更新的区域。
如果指定了SW_SCROLLCHILDREN标志，并且滚动了子窗口的一个部分，则Windows将不会正确地更新屏幕。在源矩形之外的滚动的子窗口的部分将不会被擦除，并且在新的位置也不会被正确地重画。使用Windows的DeferWindowPos函数以移动不完全位于lpRectScroll矩形之内的子窗口。如果设置了SW_SCROLLCHILDREN标志并且插字符矩形与滚动矩形相交，则光标将被重新定位。
所有输入和输出的坐标（属于lpRectScroll，lpRectClip，lpRectUpdate和prgnUpdate）都被假定使用了客户坐标，而不管窗口具有的是CS_OWNDC风格还是CS_CLASSDC风格。如果有必要，可以使用Windows的LPtoDP和DPtoLP函数将该坐标与逻辑坐标相互转换。

请参阅：
CWnd::RedrawWindow, CDC::ScrollDC, CWnd::ScrollWindow, CWnd::UpdateWindow, ::DeferWindowPos, ::ScrollWindowEx


 CWnd::SendChildNotifyLastMsg

BOOL SendChildNotifyLastMsg( LRESULT* pResult = NULL );

返回值：如果子窗口已经处理了发送给它的父窗口的消息，则返回非零值；否则返回0。

参数：
pResult 子窗口产生的结果，将通过父窗口返回。

说明：
这个成员函数被框架调用，用于从父窗口向子窗口提供通知消息，子窗口可以借此处理任务。
如果该消息为反射消息，SendChildNotifyLastMsg将当前消息发送给它的来源。有关消息反射的更多信息参见联机的《Visual C++ 程序员指南》中的“处理反射消息”。

请参阅：CWnd::OnChildNotify


 CWnd::SendDlgItemMessage

LRESULT SendDlgItemMessage( int nID, UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );

返回值：指定了控件的窗口过程返回的值。如果没有找到控件，则返回0。

参数：
nID | 指定了对话框控件的标识符，该控件将接收消息。
message | 指定了要发送的消息。
wParam | 指定了与消息有关的附加信息。
lParam | 指定了与消息有关的附加信息。

说明：
这个函数向控件发送一条消息。
SendDlgItemMessage直到消息被处理之后才会返回。
使用SendDlgItemMessage等同于获得给定控件的CWnd*指针并调用其SendMessage成员函数。

请参阅：CWnd::SendMessage, ::SendDlgItemMessage


 CWnd::SendMessage

LRESULT SendMessage( UINT message, WPARAM wParam = 0, LPARAM lParam = 0 );

返回值：消息处理的结果；它的值依赖于发送的消息。

参数：
message | 指定了要发送的消息。
wParam | 指定了与消息有关的附加信息。
lParam | 指定了与消息有关的附加信息。

说明：
这个函数向窗口发送指定的消息。SendMessage成员函数直接调用窗口过程并在窗口过程处理了消息以后才返回。这与PostMessage成员函数形成对比，该函数将消息放入窗口的消息队列并立即返回。

请参阅：
::InSendMessage, CWnd::PostMessage, CWnd::SendDlgItemMessage, ::SendMessage


 CWnd::SendMessageToDescendants

void SendMessageToDescendants(
UINT message,
WPARAM wParam = 0,
LPARAM lParam = 0,
BOOL bDeep = TRUE,
BOOL bOnlyPerm = FALSE
);

参数：
message | 指定了要发送的消息。
wParam | 指定了与消息有关的附加信息。
lParam | 指定了与消息有关的附加信息。
bDeep | 指定了搜索的深度。如果为TRUE，则递归搜索所有的子窗口；如果为FALSE，则仅搜索直接子窗口。
bOnlyPerm | 指定该消息是否将被临时窗口接收。如果为TRUE，则临时窗口可以接收这个消息；如果为FALSE，则只有永久窗口才能接收这个消息。有关临时窗口的更多信息参见技术注释3。

说明：
调用这个成员函数以向所有的后代窗口发送指定的Windows消息。
如果bDeep为FALSE，则消息仅被发送到窗口的直接子窗口，否则消息被发送到所有的后代窗口。
如果bDeep和bOnlyPerm为TRUE，则在临时窗口之下进行搜索。在这种情况下，只有在搜索过程中遇到的永久窗口才能接收消息。如果bDeep为FALSE，则消息仅被发送到窗口的直接子窗口。

请参阅：
CWnd::SendMessage, CWnd::FromHandlePermanent, CWnd::FromHandle


 CWnd::SendNotifyMessage

BOOL SendNotifyMessage( UINT message, WPARAM wParam, LPARAM lParam );

返回值：如果函数成功，则返回非零值；否则返回0。

参数：
message | 指定了要发送的消息。
wParam | 指定了与消息有关的附加信息。
lParam | 指定了与消息有关的附加信息。

说明：
这个函数向窗口发送指定的消息。如果窗口是由调用线程创建的，则SendNotifyMessage调用窗口的窗口过程，并在窗口处理了消息之后返回。如果窗口是由其它线程创建的，则SendNotifyMessage将消息传递给窗口过程并立即返回；它并不等待窗口过程结束处理消息。

请参阅：CWnd::SendMessage, ::SendNotifyMessage


 CWnd::SetActiveWindow

CWnd* SetActiveWindow( );

返回值：原来活动的窗口。返回的指针可能是临时的，不能被保存以供将来使用。

说明：
这个函数使CWnd成为活动窗口。
SetActiveWindow成员函数必须小心使用，因为它允许应用程序任意地接管活动窗口和输入焦点。通常，Windows管理着所有的活动。

请参阅：::SetActiveWindow, CWnd::GetActiveWindow


 CWnd::SetCapture

CWnd* SetCapture( );

返回值：
原来接收所有鼠标输入的窗口的指针。如果没有这样的窗口，则返回值为NULL。返回的指针可能是临时的，不能被保存以供将来使用。

说明：
这个函数使随后的所有鼠标输入都被发送到当前的CWnd对象，并不考虑光标的位置。
当CWnd不再需要所有的鼠标输入时，应用程序应当调用ReleaseCapture函数以使其它窗口能够接收鼠标输入。

请参阅：::ReleaseCapture, ::SetCapture, CWnd::GetCapture


 CWnd::SetCaretPos

static void PASCAL SetCaretPos( POINT point );

参数：
point 指定了插字符的新的x和y坐标（客户坐标）。

说明：
这个函数设置插字符的位置。
SetCaretPos成员函数仅当插字符属于当前任务的一个窗口时才移动它。不论插字符是否隐藏，SetCaretPos都移动插字符的位置。
插字符是一种共享资源。如果窗口不拥有插字符，它就不应移动插字符。

请参阅：CWnd::GetCaretPos, ::SetCaretPos


 CWnd::SetClipboardViewer

HWND SetClipboardViewer( );

返回值：
如果成功，则返回剪贴板观察器链中下一个窗口的句柄。应用程序必须保存这个句柄（可以当作成员变量保存），并且在响应剪贴板观察器链消息的时候使用它。

说明：
每当剪贴板的内容发生变化时，这个函数将窗口加入被通知的窗口链（通过WM_DRAWCLIPBOARD消息）。
属于剪贴板观察器链的窗口必须响应WM_DRAWCLIPBOARD、WM_CHANGECBCHAIN和WM_DESTROY消息，并将消息传递到链中的下一个窗口。
这个成员函数向窗口发送一条WM_DRAWCLIPBOARD消息。由于剪贴板观察器链中下一个窗口的句柄还没有返回，应用程序不应传递它在SetClipboardViewer调用过程中接收到的WM_DRAWCLIPBOARD消息。
如果要将自己从剪贴板观察器链中去掉，则应用程序必须调用ChangeClipboard成员函数。

请参阅：CWnd::ChangeClipboardChain, ::SetClipboardViewer


 CWnd::SetDlgCtrlID

int SetDlgCtrlID( int nID );

返回值：如果成功，则返回窗口以前的标识符；否则返回0。

参数：
nID 被设为控件标识符的新值。

说明：
这个函数将窗口的窗口ID或控制ID设为新值。这里的窗口可以是任何子窗口，不仅是对话框中的控件。这种窗口不能是顶层窗口。

请参阅：
CWnd::GetDlgCtrlID, CWnd::Create, CWnd::CreateEx, CWnd::GetDlgItem


 CWnd::SetDlgItemInt

void SetDlgItemInt( int nID, UINT nValue, BOOL bSigned = TRUE );

参数：
nID | 指定了要改变的控件的整数ID。
nValue | 指定了用于生成项目文本的整数值。
bSigned | 指定这个整数是带符号的还是无符号的。如果这个参数为TRUE，则nValue为带符号的。如果这个参数为TRUE并且nValue小于0，则在字符串中，将在第一个数字之前加上负号。如果这个参数为FALSE，则nValue为无符号的。

说明：
这个函数将对话框中给定控件的文本设为代表指定整数值的字符串。
SetDlgItemInt向给定的控件发送一条WM_SETTEXT消息。

请参阅：CWnd::GetDlgItemInt, ::SetDlgItemInt, WM_SETTEXT


 CWnd::SetDlgItemText

void SetDlgItemText( int nID, LPCTSTR lpszString );

参数：
nID | 要设置文本的控件的标识符。
lpszString | 指向一个CString对象或以null结尾的字符串，其中包含了要拷贝到控件的文本。

说明：
设置窗口或对话框拥有的标题或是控件文本。
SetDlgItemText向给定的控件发送一条WM_SETTEXT消息。

请参阅：::SetDlgItemText, WM_SETTEXT, CWnd::GetDlgItemText


 CWnd::SetFocus

CWnd* SetFocus( );

返回值：
原来拥有输入焦点的窗口对象的指针。如果没有这样的窗口，则返回值为NULL。返回的指针可能是临时的，不应被保存。

说明：
这个函数要求得到输入焦点。输入焦点将随后的所有键盘输入定向到这个窗口。原来拥有输入焦点的任何窗口都将失去它。
SetFocus成员函数项失去输入焦点的窗口发送一条WM_KILLFOCUS消息，并向接收输入焦点的窗口发送一条WM_SETFOCUS消息。它还激活该窗口或它的父窗口。
如果当前窗口是激活的，但是不具有输入焦点（这意味着，没有窗口具有输入焦点），则任何按下的键都将产生WM_SYSCHAR，WM_SYSKEYDOWN或WM_SYSKEYUP消息。

请参阅：::SetFocus, CWnd::GetFocus


 CWnd::SetFont

void SetFont( CFont* pFont, BOOL bRedraw = TRUE );

参数：
pFont | 指定了新的字体。
bRedraw | 如果为TRUE，则重画CWnd对象。

说明：
这个函数将窗口的当前字体设为指定的字体。如果bRedraw为TRUE，则窗口还会被重画。

请参阅：CWnd::GetFont, WM_SETFONT


 CWnd::SetForegroundWindow

BOOL SetForegroundWindow( );

返回值：如果函数成功，则返回非零值；否则返回0。

说明：
这个函数将创建窗口的线程推向前台并激活该窗口。键盘输入被定向到这个窗口，并且将向用户显示不同的视觉提示。前台窗口是指用户当前工作的窗口。前台窗口仅针对顶层窗口而言（框架窗口或对话框）。

请参阅：CWnd::GetForegroundWindow


 CWnd::SetIcon

HICON SetIcon( HICON hIcon, BOOL bBigIcon );

返回值：指向一个图标的句柄。

参数：
hIcon | 以前图标的句柄。
bBigIcon | 如果为TRUE，则指定了32×32像素的图标；如果为FALSE，则指定了16×16像素的图标。

说明：
调用这个函数以将图标设为hIcon所标识的指定图标。如果注册了窗口类，则它选择一个图标。

请参阅：CWnd::GetIcon


 CWnd::SetMenu

BOOL SetMenu( CMenu* pMenu );

返回值：如果菜单发生了变化，则返回非零值；否则返回0。

参数：
pMenu 标识了新的菜单。如果这个参数为NULL，则当前菜单被清除。

说明：
这个函数将当前菜单设为指定的菜单。它使窗口被重画以反映菜单的变化。
SetMenu不会销毁以前的菜单。应用程序必须调用CMenu::DestroyMenu成员函数以完成这个任务。

请参阅：
CMenu::DestroyMenu, CMenu::LoadMenu, ::SetMenu, CWnd::GetMenu


 CWnd::SetOwner

void SetOwner( CWnd* pOwnerWnd );

参数：
pOwnerWnd 标识了窗口对象的新拥有者。如果这个参数为NULL，则窗口对象没有拥有者。

说明：
这个函数将当前窗口的拥有者设为指定的窗口对象。然后这个拥有者就可以从当前窗口对象接收命令消息。在缺省情况下，当前窗口的父窗口是其拥有者。
通常在与窗口层次关系不相关的窗口之间建立联系是很有用的。例如，CToolBar向它的拥有者而不是父窗口发送通知消息。这允许工具条在向其它窗口（例如现场框架窗口）发送通知的时候变成某个窗口（例如OLE容器应用程序的窗口）的子窗口。此外，当服务器窗口在现场编辑时失去活动状态或被激活时，由框架窗口拥有的任何窗口都被隐藏或显示。这种拥有关系是通过调用SetOwner来明确设置的。
这个函数中的拥有概念与GetWindow中的拥有概念不同。

请参阅：CWnd::GetOwner, CToolBar


 CWnd::SetParent

CWnd* SetParent( CWnd* pWndNewParent );

返回值：如果成功，则返回以前的父窗口的指针。返回的指针可能是临时的，不应被保存以供将来使用。

参数：
pWndNewParent 标识了新的父窗口。

说明：
这个函数改变子窗口的父窗口。
如果子窗口可见，则Windows执行适当的重画和重绘工作。

请参阅：::SetParent, CWnd::GetParent


 CWnd::SetProperty

void SetProperty( DISPID dwDispID, VARTYPE vtProp, ... );

参数：
dwDispID | 标识了要设置的属性。这个值通常是由组件廊提供的。
vtProp | 指定了要设置的属性的类型。可能的取值参见COleDispatchDriver::InvokeHelper中的说明部分。
... | vtProp指定的类型的单个参数。

说明：
调用这个成员函数以设置dwDispID所标识的OLE控件属性。
注意 这个函数仅应在代表OLE控件的CWnd对象中调用。
有关在OLE控件容器中使用这个成员函数的更多信息参见联机的《Visual C++程序员指南》中的文章“ActiveX控件容器：在ActiveX控件容器中编写ActiveX控件”。

请参阅：CWnd::InvokeHelper, COleDispatchDriver, CWnd::CreateControl


 CWnd::SetRedraw

void SetRedraw( BOOL bRedraw = TRUE );

参数：
bRedraw 指定了重画标志的状态。如果这个参数为TRUE，则重画标志被设置；如果为FALSE，则该标志被清除。

说明：
应用程序调用SetRedraw以允许重画变化或防止变化被重画。
这个成员函数设置或清除重画标志。当重画标志被清除时，在每次变化以后，内容不会更新，直到重画标志被设置才会重新绘出。例如，如果一个应用程序需要在列表框中加入几个项，则可以清除重画标志，加入项，然后设置重画标志。最后，应用程序可以调用Invalidate或InvalidateRect成员函数以使列表框被重画。

请参阅：WM_SETREDRAW


 CWnd::SetScrollInfo

BOOL SetScrollInfo( int nBar, LPSCROLLINFO lpScrollInfo, BOOL bRedraw = TRUE );

返回值：如果成功，则返回TRUE；否则返回FALSE。

参数：
nBar指定滚动条是一个控件还是窗口非客户区的一部分。如果它是非客户区的一部分，则nBar也指定了滚动条是水平的、垂直的，还是都有。它可以是下列值之一：
· | SB_CTL | 包含滚动条的控制参数。M_hWnd的数值必须是滚动条控件的句柄。
· | SB_HORZ | 指定了窗口的水平滚动条。
· | SB_VERT | 指定了窗口的垂直滚动条。
lpScrollInfo | 指向SCROLLINFO结构的指针。有关这个结构的更多信息参见《Win32 SDK程序员参考》。
bRedraw | 指定滚动条是否应被重画以反映新的位置。如果bRedraw为TRUE，则滚动条将被重画。如果它为FALSE，则它不会被重画。缺省情况下滚动条将被重画。

说明：
调用这个成员函数以设置SCROLLINFO结构为滚动条维护的信息。
SCROLLINFO结构中包含了有关滚动条的信息，包括最小和最大滚动位置、页面大小和滚动块的位置。有关改变这个结构缺省值的更多信息参见《Win32 SDK程序员参考》中的SCROLLINFO主题。
指明滚动条位置的MFC Windows消息处理函数，CWnd::OnHScroll和CWnd::OnVScroll，仅提供16位的位置数据。GetScrollInfo和SetScrollInfo提供了32位的滚动条位置数据。因而，在处理CWnd::OnHScroll或CWnd::OnVScroll的时候，应用程序可以调用GetScrollInfo以获得32位的滚动条位置数据。
注意 CWnd::GetScrollInfo允许应用程序使用32位的滚动条位置。

请参阅：
CWnd::GetScrollInfo, CWnd::SetScrollPos, CWnd::OnVScroll, CWnd::OnHScroll, SCROLLINFO


 CWnd::SetScrollPos

int SetScrollPos( int nBar, int nPos, BOOL bRedraw = TRUE );

返回值：滚动块的以前位置。

参数：
nBar指定了要设置的滚动条。这个参数可以是下列值：
· | SB_HORZ | 设置窗口的水平滚动条的滚动块位置。
· | SB_VERT | 设置窗口的垂直滚动条的滚动块位置。
nPos | 指定了滚动块的新位置。它必须在滚动范围之内。
bRedraw | 指定滚动条是否应被重画以反映新的滚动块位置。如果这个参数为TRUE，则滚动条将被重画；如果为FALSE，则滚动条不会被重画。

说明：
这个函数设置滚动块的当前位置，并且如果需要，则重画滚动条以反映滚动块的新位置。
当滚动条需要在随后对别的函数的调用中重画时，将bRedraw设为FALSE将会是有用的。

请参阅：
::SetScrollPos, CWnd::GetScrollPos, CScrollBar::SetScrollPos


 CWnd::SetScrollRange

void SetScrollRange( int nBar, int nMinPos, int nMaxPos, BOOL bRedraw = TRUE );

参数：
nBar指定了要设置的滚动条。这个参数可以取下列值：
· | SB_HORZ | 设置窗口的水平滚动条的范围。
· | SB_VERT | 设置窗口的垂直滚动条的范围。
nMinPos | 指定滚动位置的最小值。
nMaxPos | 指定滚动位置的最大值。
bRedraw | 指定滚动条是否需要被重画以反映变化。如果bRedraw为TRUE，则滚动条被重画；如果为FALSE，则滚动条不会被重画。

说明：
这个函数设置给定滚动条的最小和最大位置。它也可以被用于隐藏或显示标志的滚动条。
应用程序不应在处理滚动条通知消息的时候调用这个函数以隐藏滚动条。
如果在调用了SetScrollPos成员函数之后立即调用SetScrollRange，则SetScrollPos成员函数中的bRedraw参数必须为0以防止滚动条被重画两次。标准滚动条的缺省范围是0到100。滚动条控件的缺省范围为空（nMinPos和nMaxPos的值都为0）。nMinPos和nMaxPos所指定的值之间的差不能大于INT_MAX。

请参阅：CWnd::SetScrollPos, ::SetScrollRange, CWnd::GetScrollRange


 CWnd::SetTimer

UINT SetTimer(UINT nIDEvent, UINT nElapse, void (CALLBACK EXPORT*lpfnTimer) (HWND, UINT, UINT, DWORD) );

返回值：
如果函数成功，则返回新定时器的标识符。应用程序可以将这个值传递给KillTimer成员函数以销毁定时器。如果成功，则返回非零值；否则返回0。

参数：
nIDEvent | 指定了不为零的定时器标识符。
nElapse | 指定了定时值；以毫秒为单位。
lpfnTimer | 指定了应用程序提供的TimerProc回调函数的地址，该函数被用于处理WM_TIMER消息。如果这个参数为NULL，则WM_TIMER消息被放入应用程序的消息队列并由CWnd对象来处理。

说明：
这个函数设置一个系统定时器。指定了一个定时值，每当发生超时，则系统就向设置定时器的应用程序的消息队列发送一个WM_TIMER消息，或者将消息传递给应用程序定义的TimerProc回调函数。
lpfnTimer回调函数不需要被命名为TimerProc，但是它必须按照如下方式定义：
void CALLBACK EXPORT TimerProc(
HWND hWnd, // 调用SetTimer的CWnd的句柄
UINT nMsg, // WM_TIMER
UINT nIDEvent // 定时器标识
DWORD dwTime // 系统时间
);
定时器是有限的全局资源；因此对于应用程序来说，检查SetTimer返回的值以确定定时器是否可用是很重要的。

请参阅：WM_TIMER, CWnd::KillTimer, ::SetTimer


 CWnd::SetWindowContextHelpId

BOOL SetWindowContextHelpId( DWORD dwContextHelpId );

返回值：如果函数成功，则返回非零值；否则返回0。

参数：
dwContextHelpId 帮助上下文标识符。

说明：
调用这个成员函数以将帮助上下文标识符与指定的窗口相关联。
如果子窗口不具有帮助上下文标识符，则它继承它的父窗口的标识符。同理，如果被拥有的窗口不具有帮助上下文标识符，则它继承它的拥有者窗口的标识符。这种对帮助上下文标识符的继承允许应用程序只为对话框和它的所有控件设置一个标识符。

请参阅：CWnd::GetWindowContextHelpId


 CWnd::SetWindowPlacement

BOOL SetWindowPlacement( const WINDOWPLACEMENT* lpwndpl );

返回值：如果函数成功则返回非零值；否则返回0。

参数：
lpwndpl 指向一个WINDOWPLACEMENT结构，指定了新的显示状态和位置。

说明：这个函数设置显示状态和窗口的正常（复原）、最小化和最大化位置。

请参阅：CWnd::GetWindowPlacement, ::SetWindowPlacement


 CWnd::SetWindowPos

BOOL SetWindowPos(
const CWnd* pWndInsertAfter,
int x, int y,
int cx, int cy,
UINT nFlags
);

返回值：如果函数成功，则返回非零值；否则返回0。

参数：
pWndInsertAfter标识了在Z轴次序上位于这个CWnd对象之前的CWnd对象。这个参数可以是指向CWnd对象的指针，也可以是指向下列值的指针：
wndBottom | 将窗口放在Z轴次序的底部。如果这个CWnd是一个顶层窗口，则窗口将失去它的顶层状态；系统将这个窗口放在其它所有窗口的底部。
wndTop | 将窗口放在Z轴次序的顶部。
wndTopMost | 将窗口放在所有非顶层窗口的上面。这个窗口将保持它的顶层位置，即使它失去了活动状态。
wndNoTopMost | 将窗口重新定位到所有非顶层窗口的顶部（这意味着在所有的顶层窗口之下）。这个标志对那些已经是非顶层窗口的窗口没有作用。
有关这个函数以及这些参数的使用规则参见说明部分。

x | 指定了窗口左边的新位置。
y | 指定了窗口顶部的新位置。
cx | 指定了窗口的新宽度。
cy | 指定了窗口的新高度。
nFlags指定了大小和位置选项。这个参数可以是下列值的组合：
SWP_DRAWFRAME | 围绕窗口画出边框（在创建窗口的时候定义）。
SWP_FRAMECHANGED | 向窗口发送一条WM_NCCALCSIZE消息，即使窗口的大小不会改变。如果没有指定这个标志，则仅当窗口的大小发生变化时才发送WM_NCCALCSIZE消息。
SWP_HIDEWINDOW | 隐藏窗口。
SWP_NOACTIVATE | 不激活窗口。如果没有设置这个标志，则窗口将被激活并移动到顶层或非顶层窗口组（依赖于pWndInsertAfter参数的设置）的顶部。
SWP_NOCOPYBITS | 废弃这个客户区的内容。如果没有指定这个参数，则客户区的有效内容将被保存，并在窗口的大小或位置改变以后被拷贝回客户区。
SWP_NOMOVE | 保持当前的位置（忽略x和y参数）。
SWP_NOOWNERZORDER | 不改变拥有者窗口在Z轴次序上的位置。
SWP_NOREDRAW | 不重画变化。如果设置了这个标志，则不发生任何种类的变化。这适用于客户区、非客户区（包括标题和滚动条）以及被移动窗口覆盖的父窗口的任何部分。当这个标志被设置的时候，应用程序必须明确地无效或重画要重画的窗口和父窗口的任何部分。
SWP_NOREPOSITION | 与SWP_NOOWNERZORDER相同。
SWP_NOSENDCHANGING | 防止窗口接收WM_WINDOWPOSCHANGING消息。
SWP_NOSIZE | 保持当前的大小（忽略cx和cy参数）。
SWP_NOZORDER | 保持当前的次序（忽略pWndInsertAfter）。
SWP_SHOWWINDOW | 显示窗口。

说明：
调用这个成员函数以改变子窗口、弹出窗口和顶层窗口的大小、位置和Z轴次序。
窗口在屏幕上按照它们的Z轴次序排序。在Z轴次序上处于顶端的窗口将程序在所有其它窗口的顶部。
子窗口的所有坐标都是客户坐标（相对于父窗口客户区的左上角）。
窗口可以被移动到Z轴次序的顶部，既可以通过将pWndInsertAfter参数设为&wndTopMost，并确保没有设置SWP_NOZORDER标志，也可以通过设置窗口的Z轴次序使它位于所有现存的顶层窗口上方。当一个非顶层窗口被设为顶层窗口时，它拥有的窗口也被设为顶层的。它的拥有者不发生变化。
如果顶层窗口被重新定位到Z轴次序的底部（&wndBottom）或任何非顶层窗口之后，则它将不再是顶层窗口。当顶层窗口被变为非顶层窗口时，它所有的拥有者和它拥有的所有窗口都被变为非顶层窗口。
如果既没有指定SWP_NOACTIVE标志也没有指定SWP_NOZORDER标志（这意味着应用程序要求窗口被同时激活并放入指定的Z轴次序），则pWndInsertAfter参数中指定的值将只在下列环境下适用：
· | 在pWndInsertAfter参数中既没有指定&wndTopMost也没有指定&wndNoTopMost。
· | 这个窗口不是活动窗口。
应用程序不能激活一个非活动窗口但同时又不把它带到Z轴次序的顶部。应用程序可以没有任何限制地改变活动窗口的Z轴次序。
非顶层窗口可能拥有一个顶层窗口，但是反之则不成立。任何被顶层窗口拥有的窗口（例如对话框）都将自己变为顶层窗口，以确保所有被拥有的窗口位于它们的拥有者上方。
在Windows 3.1或更新的版本中，可以将窗口移动到Z轴次序的顶部，并通过设置它们的WS_EX_TOPMOST风格而将之锁定在那里。这种顶层窗口即使在失去活动状态以后也会保持顶层位置。例如，选择WinHelp的Always On Top命令会使帮助窗口变为顶层，并且在你返回应用程序之后它还保持可见。
要创建一个顶层窗口，应在调用SetWindowPos的时候将pWndInsertAfter参数设为&wndTopMost，或者在创建窗口的时候设置WS_EX_TOPMOST风格。
如果Z轴次序中包含了任何具有WS_EX_TOPMOST风格的窗口，则用&wndTopMost移动的窗口将被放到所有非顶层窗口的顶部，但是位于任何顶层窗口的下面。当应用程序激活一个不具有WS_EX_TOPMOST风格的非活动窗口时，该窗口将被移动到所有非顶层窗口的上方，但是位于所有顶层窗口的下方。
如果在调用SetWindowPos的时候pWndInsertAfter参数被设为&wndBottom，并且CWnd是一个顶层窗口，则该窗口失去顶层状态（WS_EX_BOTTOM风格被清除），并且系统将窗口放在Z轴次序的底部。

请参阅：::DeferWindowPos, ::SetWindowPos


 CWnd::SetWindowRgn

int SetWindowRgn( HRGN hRgn, BOOL bRedraw );

返回值：如果函数成功，则返回值为非零值。如果函数失败，则返回值为零。

参数：
hRgn | 一个区域的句柄。
bRedraw | 如果为TRUE，则操作系统在设置区域之后重画窗口；否则，它不进行重画。通常，如果窗口可见，则将bRedraws设为TRUE。如果被设为TRUE，则系统向窗口发送WM_WINDOWPOSCHANGING和WM_WINDOWPOSCHANGED消息。

说明：
调用这个成员函数以设置窗口的区域。
窗口区域的坐标是相对于窗口（而不是窗口客户区）的左上角。
在成功地调用SetWindowRgn之后，操作系统拥有区域句柄hRgn所指定的区域。操作系统不生成该区域的拷贝，因此不要使用此区域句柄进行其它函数调用，并且不要关闭这个区域句柄。

请参阅：::SetWindowRgn, CWnd::GetWindowRgn


 CWnd::SetWindowText

void SetWindowText( LPCTSTR lpszString );

参数：
lpszString 指向一个CString对象或以null结尾的字符串，将被用作新的标题或控件文本。

说明：
这个函数将窗口的标题设为指定的文本。如果窗口为一个控件，则将设置控件内的文本。
这个函数使一条WM_SETTEXT消息被发送到这个窗口。

请参阅：CWnd::GetWindowText, ::SetWindowText


 CWnd::ShowCaret

void ShowCaret( );

说明：
这个函数在屏幕上当前插字符位置显示插字符。一旦被显示，则插字符就开始自动闪烁。
ShowCaret成员函数仅当插字符具有形状并且没有被连续隐藏两次或更多次时才显示它。
隐藏插字符是积累性的。如果HideCaret成员函数被调用了五次，则ShowCaret也必须被调用五次以显示插字符。
插字符是一种共享资源。窗口仅应在它拥有输入焦点或处于活动状态时才显示插字符。

请参阅：CWnd::HideCaret, ::ShowCaret


 CWnd::ShowOwnedPopups

void ShowOwnedPopups( BOOL bShow = TRUE );

参数：
bShow 指定弹出窗口是要被显示还是隐藏。如果这个参数为TRUE，则所有隐藏的弹出窗口将被显示。如果这个参数为FALSE，则所有可见的弹出窗口将被隐藏。

说明：显示或隐藏这个窗口拥有的所有弹出窗口。

请参阅：::ShowOwnedPopups


 CWnd::ShowScrollBar

void ShowScrollBar( UINT nBar, BOOL bShow = TRUE );

参数：
nBar指定滚动条是一个控件还是窗口非客户区的一部分。如果它是非客户区的一部分，则nBar还指明了滚动条是水平的、垂直的，还是都有。它必须是下列值之一：
· | SB_BOTH | 指定了窗口的水平和垂直滚动条。
· | SB_HORZ | 指定了窗口的水平滚动条。
· | SB_VERT | 指定了窗口的垂直滚动条。
bShow指定了Windows要显示还是隐藏滚动条。如果这个参数为TRUE，则滚动条被显示；否则隐藏滚动条。

说明：
这个函数显示或隐藏滚动条。
应用程序不应在处理滚动条通知消息的时候调用ShowScrollBar以隐藏滚动条。

请参阅：::ShowScrollBar, CScrollBar::ShowScrollBar


 CWnd::ShowWindow

BOOL ShowWindow( int nCmdShow );

返回值：如果窗口原来可见，则返回非零值；如果CWnd原来是隐藏的，则返回0。

参数：
nCmdShow指定了CWnd应如何被显示。它必须是下列值之一：
SW_HIDE | 隐藏窗口并将活动状态传递给其它窗口。
SW_MINIMIZE | 最小化窗口并激活系统列表中的顶层窗口。
SW_RESTORE | 激活并显示窗口。如果窗口是最小化或最大化的，Windows恢复其原来的大小和位置。
SW_SHOW | 激活窗口并以其当前的大小和位置显示。
SW_SHOWMAXIMIZED | 激活窗口并显示为最大化窗口。
SW_SHOWMINIMIZED | 激活窗口并显示为图标。
SW_SHOWMINNOACTIVE | 将窗口显示为图标。当前活动的窗口将保持活动状态。
SW_SHOWNA | 按照当前状态显示窗口。当前活动的窗口将保持活动状态。
SW_SHOWNOACTIVATE | 按窗口最近的大小和位置显示。当前活动的窗口将保持活动状态。
SW_SHOWNORMAL | 激活并显示窗口。如果窗口是最小化或最大化的，则Windows恢复它原来的大小和位置。

说明：
这个函数设置窗口的可视状态。
每个应用程序只应用CWinApp::m_nCmdShow为主窗口调用一次ShowWindow。以后调用ShowWindow应该用上面列出的值来代替CWinApp::m_nCmdShow指定的值。

请参阅：::ShowWindow, CWnd::OnShowWindow, CWnd::ShowOwnedPopups


 CWnd::SubclassDlgItem

BOOL SubclassDlgItem( UINT nID, CWnd* pParent );

返回值：如果函数成功，则返回非零值；否则返回0。

参数：
nID | 控件的ID。
pParent | 控件的父窗口（通常是对话框）。

说明：
调用这个成员函数以动态地子类化一个从对话框模板创建的控件，并将之与CWnd对象相连接。当控件被动态子类化时，窗口消息将通过CWnd的消息映射转发，并首先调用CWnd类的消息处理函数。被发往基类的消息将被传递到控件的缺省消息处理函数。
这个成员函数将一个Windows控件与CWnd对象连接，并替换控件的WndProc和AfxWndProc函数。这个函数在GetSuperWndProcAddr成员函数返回的位置中保存旧的WndProc地址。

请参阅：
CWnd::DefWindowProc, CWnd::SubclassWindow, CWnd::Attach


 CWnd::SubclassWindow

BOOL SubclassWindow( HWND hWnd );

返回值：如果函数成功，则返回非零值；否则返回0。

参数：
hWnd 窗口句柄。

说明：
调用这个成员函数以动态子类化一个窗口，并将它与这个CWnd对象相连接。当窗口被动态子类化时，窗口消息将通过CWnd的消息映射，并首先调用CWnd类中的消息处理函数。发送给基类的消息将被传递给窗口的缺省消息处理函数。
这个成员函数将Windows控件与CWnd对象连接起来，并替换窗口的WndProc和AfxWndProc函数。这个函数在CWnd对象中保存旧的WndProc的指针。

请参阅：
CWnd::DefWindowProc, CWnd::SubclassDlgItem, CWnd::Attach, CWnd::PreSubclassWindow, CWnd::UnsubclassWindow


 CWnd::UnlockWindowUpdate

void CWnd::UnlockWindowUpdate();

说明：
调用这个成员函数以解锁用CWnd::LockWindowUpdate锁定的窗口。
在同一时刻只能用LockWindowUpdate锁定一个窗口。有关锁定窗口的更多信息参见CWnd::LockWindowUpdate或Win32函数LockWindowUpdate。


 CWnd::UnsubclassWindow

HWND UnsubclassWindow( );

返回值：被取消子类化的窗口的句柄。

说明：
调用这个成员函数以将WndProc设为原来的值，并将HWND标识窗口与CWnd对象分离。

请参阅：
CWnd::SubclassWindow, CWnd::PreSubclassWindow, CWnd::DefWindowProc, CWnd::SubclassDlgItem, CWnd::Attach


 CWnd::UpdateData

BOOL UpdateData( BOOL bSaveAndValidate = TRUE );

返回值：
如果操作成功，则返回非零值；否则返回0。如果bSaveAndValidate为TRUE，则返回非零值意味着已成功地使数据有效。

参数：
bSaveAndValidate 指明是要初始化对话框（FALSE）还是获取数据（TRUE）的标志。

说明：
调用这个成员函数以初始化对话框中的数据，或者获得并检验对话框数据。
当一个模式对话框被创建时，框架自动在CDialog::OnInitDialog的缺省实现中调用UpdateData，bSaveAndValidate被设为FALSE。这个函数在对话框可见之前被调用。CDialog::OnOK的缺省实现令bSaveAndValidate为TRUE并调用这个成员函数以获得对话框中的数据，如果成功，将关闭对话框（如果在对话框中点击了Cancel按钮，则对话框将被关闭，并不获取数据）。

请参阅：CWnd::DoDataExchange


 CWnd::UpdateDialogControls

void UpdateDialogControls( CCmdTarget* pTarget, BOOL bDisableIfNoHndler );

参数：
pTarget | 指向应用程序的主框架窗口，被用于转发更新消息。
bDisableIfNoHndler | 指明没有更新处理函数的控件是否要被自动显示为禁止状态的标志。

说明：
调用这个成员函数以更新对话框按钮和对话框或使用ON_UPDATE_COMMAND_UI机制的窗口中其它控件的状态。
如果子控件不具有处理函数，并且bDisableIfNoHndler为TRUE，则子控件将被禁止。
框架在应用程序的空闲处理中为对话框条或工具条上的控件调用这个成员函数。

请参阅：CFrameWnd::m_bAutoMenuEnable


 CWnd::UpdateWindow

void UpdateWindow( );

说明：
如果更新区域不为空，则发送一条WM_PAINT消息以更新客户区域。UpdateWindow成员函数直接发送一条WM_PAINT消息，越过应用程序队列。如果更新区域为空，则WM_PAINT不会被发送。

请参阅：::UpdateWindow, CWnd::RedrawWindow


 CWnd::ValidateRect

void ValidateRect( LPCRECT lpRect );

参数：
lpRect 指向一个CRect对象或RECT结构，其中包含了要从更新区域中清除的矩形的客户坐标。如果lpRect为NULL，则整个窗口都变为有效。

说明：
这个函数从窗口的更新区域内清除给定的矩形，使给定矩形之内的客户区有效。BeginPaint成员函数自动使整个客户区有效。如果在下一个WM_PAINT消息产生之前需要使一部分更新区域有效，则不应调用ValidateRect和ValidateRgn成员函数。
Windows将继续产生WM_PAINT消息，直到当前的更新区域有效。

请参阅：CWnd::BeginPaint, ::ValidateRect, CWnd::ValidateRgn


 CWnd::ValidateRgn

void ValidateRgn( CRgn* pRgn );

参数：
pRgn 指向一个CRgn对象的指针，它标识了要从更新区域内清除的区域。如果这个参数为NULL，则整个客户区都将被清除。

说明：
这个函数从窗口的当前更新区域中清除给定的区域，使区域内的客户区有效。给定的区域必须是以前通过区域函数创建的。区域坐标被假设为使用客户区坐标。
BeginPaint成员函数自动使整个客户区有效。如果在产生下一个WM_PAINT消息之前需要使更新区域的一部分有效，则不能调用ValidateRect和ValidateRgn成员函数。

请参阅：::ValidateRgn, CWnd::ValidateRect


 CWnd::WindowFromPoint

static CWnd* PASCAL WindowFromPoint( POINT point );

返回值：
指向窗口对象的指针，点位于该窗口之内。如果在给定点不存在任何窗口，则返回NULL。返回的指针可能是临时的，不应被保存以供将来使用。

参数：
point 指定了一个CPoint对象或POINT数据结构，它定义了要检查的点。

说明：
这个函数获得包含指定点的窗口；point必须指定一个屏幕上用屏幕坐标表示的点。
WindowFromPoint不获取隐藏或禁止的窗口，即使该点位于窗口之内。应用程序应当使用ChildWindowFromPoint成员函数以实现没有限制的搜索。

请参阅：::WindowFromPoint, CWnd::ChildWindowFromPoint


 CWnd::WindowProc

virtual LRESULT WindowProc( UINT message, WPARAM wParam, LPARAM lParam );

返回值：返回值依赖于消息。

参数：
message | 指定了要处理的Windows消息。
wParam | 提供了可用于消息处理的附加信息。这个参数的值与消息有关。
lParam | 提供了可用于消息处理的附加信息。这个参数的值与消息有关。

说明：
这个函数为CWnd对象提供了Windows过程（WindowProc）。它通过窗口的消息映射分派消息。


 CWnd::m_hWnd

说明：
与CWnd相连接的Windows窗口的句柄。m_hWnd数据成员是一个HWND类型的公有变量。

请参阅：CWnd::Attach, CWnd::Detach, CWnd::FromHandle


 CWordArray

CObject
└CWordArray

CWordArray类支持16位字的数组。
CWordArray的成员函数与CObArray类的成员函数类似。因为这种相似性，你可以利用CObArray的参考文档找到成员函数的说明。每当你看到CObject指针被用作函数参数或返回值时，就用WORD来替换。

CObject* CObArray::GetAt( int <nIndex> ) const;
例如，被转换为
WORD CWordArray::GetAt( int <nIndex> ) const;
CWordArray合并了IMPLEMENT_SERIAL宏以支持它的元素的串行化和转储。如果字数组被保存到档案中，可以通过重载的插入操作符或使用CObject::Serialize成员函数，则每个元素将依次被串行化。
注意：在使用数组之前，应使用SetSize来设置它的大小并为之分配内存。如果你没有使用SetSize，则在数组中加入元素时会引起频繁的重分配和拷贝。频繁的重分配和拷贝是效率低下的，会引起内存碎片。
如果你需要转储数组中的单个元素，则必须将转储环境的深度设为1或更大。有关使用CWordArray的更多信息参见联机的《Visual C++ 程序员指南》中的文章“集合”。
#include <afxcoll.h>

CWordArray 类成员

构造
CWordArray 构造一个空的字数组

界限
GetSize | 获得数组中元素的数目
GetUpperBound | 返回最大的有效索引
SetSize | 设置数组中将包含的元素的数目

操作
FreeExtra | 释放在当前上界之上的没有使用的内存
RemoveAll | 从数组中清除所有的元素

访问元素
GetAt | 返回给定索引处的值
SetAt | 为给定的索引设置值；数组不允许增长
ElementAt | 返回对数组中元素指针的临时引用
GetData | 允许访问数组中的元素。可以为NULL

增长数组
SetAtGrow | 设置给定索引处的值；如果有必要则增长数组
Add | 在数组的末尾加入元素；如果有必要则增长数组
Append | 将一个数组追加在另一个数组后面；如果有必要则增长数组
Copy | 将一个数组拷贝到另一个数组。如果有必要则增长数组

插入/清除
InsertAt | 在指定索引处插入一个元素（或其它数组中的全部元素）
RemoveAt | 清除指定索引处的元素

操作符
operator [] 设置或获得指定索引处的元素


 MFC中的宏和全局函数、变量

微软基础类库可以分成两个主要部分：（1）MFC类，（2）宏和全局函数、变量。如果一个函数或者变量不是某个类的成员，它就是全局的函数或变量。
MFC类库和活动模板库（ATL）共用一些字符串转换宏。参看ATL文档中的“字符串转换宏”部分，其中包含了对这些宏的讨论。
MFC中的宏和全局函数、变量提供了下列方面的功能：

General MFC
· | 数据类型
· | MFC类对象的强制类型转换
· | 运行时对象模型服务
· | 诊断服务
· | 异常处理
· | CString格式化和消息框显示
· | 应用程序信息和管理
· | 标准命令和窗口ID
· | 集合类帮助函数

Database
· | 应用于MFC中ODBC类的记录字段交换（RFX）函数和成组记录字段交换（Bulk RFX）函数
· | 应用于MFC中DAO类的记录字段交换（DFX）函数
· | 应用于CRecordView和CDaoRecordView（MFC中的ODBC和DAO类）的对话框数据交换（DDX）函数
· | 应用于OLE控件的对话框数据交换（DDX）函数
· | 用于辅助直接调用开放数据库连接（ODBC）API函数的宏和全局函数、变量
· | DAO数据库引擎的初始化和结束函数

Internet
· | Internet服务器API（ISAPI）解析映射
· | Internet URL 解析全局函数
· | Internet服务器API（ISAPI）诊断宏

OLE
· | OLE初始化
· | 应用程序控制
· | 调度映射
另外，MFC提供了一个函数，名为AfxEnableControlContainer，它使任何一个用MFC4.0开发的OLE容器都能够完全支持复合OLE控件。

OLE控件
· | 可变参数类型常量
· | 类型库访问
· | 属性页
· | 事件映射
· | 事件接收映射
· | 连接映射
· | 注册OLE控件
· | 类工厂和注册
· | OLE控件的持续性
本章的第一部分简要地讨论了上面的每一个方面，列出了该方面的每个全局函数、变量和宏，同时还简要地描述了它们的功能。随后，按照字母顺序详细讨论了MFC类库中的全局函数、全局变量和宏。
有关MFC中的宏和全局函数、变量的主要参考材料是《Visual C++程序员指南》。通常当你需要寻找有关宏和全局函数、变量的信息的时候，你首先会去查询这个地方。如果有必要，Visual C++ 程序员联机指南在描述函数或者宏的时候会提及适当的文章。
注意：
许多全局函数以前缀“Afx”开始——有一些例外，比如对话框数据交换函数（DDX）和一些数据库函数不符合这个约定。所有的全局变量都以“Afx”为前缀。宏没有什么特定的前缀，但是它们都是以大写形式出现的。


 数据类型

本章列出了微软基础类库中最常见的数据类型。大多数数据类型是与Windows软件开发工具包（SDK）中一致的，也有一些是MFC独有的。
下面的数据类型是Windows SDK 和MFC共用的：
· | BOOL | 布尔值。
· | BSTR | 32位字符指针。
· | BYTE | 8位无符号整数。
· | COLORREF | 用作颜色值的32位值。
· | DWORD | 32位无符号整数，或者是段地址以及与之相关的偏移量。
· | LONG | 32位带符号整数。
· | LPARAM | 32位值，作为参数传递给一个窗口过程或者回调函数。
· | LPCSTR | 指向字符串常量的32位指针。
· | LPSTR | 指向字符串的32位指针。
· | LPCTSTR | 指向一个兼容 Unicode 和 DBCS 的字符串的32位指针。
· | LPTSTR | 指向一个兼容 Unicode 和 DBCS 的字符串的32位指针。
· | LPVOID | 指向一个未指定类型的32位指针。
· | LRESULT | 窗口过程或者回调函数返回的32位值。
· | UINT | 在Windows 3.0和3.1中表示16位的无符号整数，在Win32中表示32位的无符号整数。
· | WNDPROC | 指向一个窗口过程的32位指针。
· | WORD | 16位无符号整数。
· | WPARAM | 作为参数传递给窗口函数或者回调函数的值：在Windows 3.0和3.1 中为16位，在Win32中为32位。

微软基础类库中独有的数据类型如下：
· | POSITION | 用于标记集合中一个元素的位置的值；被MFC中的集合类所使用。
· | LPCRECT | 指向一个RECT结构体常量（不能修改）的32位指针。
在《Win32 SDK 程序员参考》的“数据类型”部分，有个不太通用的数据类型的列表。


 MFC类对象的强制类型转换
强制类型转换宏提供了一种方式，可以将一个给定的指针转换为指向特定类的对象的指针，并不需要检查这种转换是否合法。 下面的表格列出了MFC中的强制类型转换宏：

将指针强制转换为MFC类的对象的宏
DYNAMIC_DOWNCAST | 将一个指针转换为指向一个对象的指针，同时检查这种转换是否合法
STATIC_DOWNCAST | 将指向一个类的对象的指针转换为另一个相关类型的指针。在调试版本中，如果该对象不能转换为目标类型，会引起ASSERT


 运行时对象模型服务
CObject和CRuntimeClass这两种类封装了一些对象服务，包括对运行时对象信息的访问，串行化以及动态对象创建。所有从CObject继承的类都继承了这些功能。
通过访问运行时对象信息，你可以在运行时决定对象的信息。当你需要额外的函数参数类型检查，或者你需要编写与类和对象有关的用于特定目的的代码时，这种在运行时决定对象信息的能力非常有用。C++语言本身并不直接支持运行时对象信息。
串行化是指向一个文件写入或者从一个文件读出对象的内容的过程。通过串行化，你即使在应用程序退出以后也还可以保存对象的信息。当应用程序重新启动以后，你可以从文件中读入对象的内容。这样的数据对象被称为是“永久性”的。
动态对象创建功能使你能够在运行时创建指定类型的对象。例如，文档、视和框架对象必须支持动态创建，因为应用框架必须动态地创建它们。
下面的表格列出了支持运行时类信息、串行化和动态创建的MFC宏。
如果需要关于运行时对象服务和串行化的更详细的信息，可以参考《Visual C++程序员指南》中的“CObject 类：访问运行时类信息”部分。

运行时对象模式服务宏
DECLARE_DYNAMIC | 允许对运行时类信息进行访问（必须在类定义中使用）
DECLARE_DYNCREATE | 允许动态创建和访问运行时类信息（必须在类定义中使用）
DECLARE_SERIAL | 允许串行化和访问运行时类信息（必须在类定义中使用）
IMPLEMENT_DYNAMIC | 允许对运行时类信息进行访问（必须在类的实现中使用）
IMPLEMENT_DYNCREATE | 允许动态创建和访问运行时类信息（必须在类的实现中使用）
IMPLEMENT_SERIAL | 允许串行化和访问运行时类信息（必须在类的实现中使用）
RUNTIME_CLASS | 返回与指定名字的类对应的CRuntimeClass结构

OLE经常需要在运行时动态地创建对象。例如，一个OLE服务器必须能够在响应客户的请求时动态地创建OLE项目。类似地，一个自动化服务器也必须能够在响应自动化客户的请求时动态地创建项目。
微软基础类库特别为OLE提供了两个宏。

OLE对象的动态创建
DECLARE_OLECREATE | 允许通过OLE自动化创建对象
IMPLEMENT_OLECREATE | 允许由OLE系统创建对象


 诊断服务
微软基础类库支持许多诊断服务功能，这会使你的调试工作更加简单。这些诊断服务包括一些宏和全局函数，它们允许你跟踪程序的内存分配，在运行时转储对象的内容及在运行时打印调试信息。这些用于诊断服务的宏和全局函数可以组成以下几个类别：
· | 通用诊断宏。
· | 通用诊断函数和变量。
· | 对象诊断函数。

在MFC的调试和发行版本中，所有从CObject继承的类都可以使用这些宏和函数。但是，除了DEBUG_NEW和VERIFY以外，其他的在发行版本中都不起任何作用。
在调试版本的类库中，所有被分配的内存块都包含一部分“保护字节”。如果这些字节被非正常的内存读写所扰乱，诊断例程就会报告出问题。如果你在程序文件中包含了如下的程序行：
#define new DEBUG_NEW

所有对new的调用将保存了产生内存分配的文件名和行号。函数CMemoryState::Dump- AllObjectsSince 将会显示这些附加信息，使你能够识别内存泄漏。同时还可以参考CDumpContext类在诊断输出中给出的附加信息。
另外，C运行时库同样支持一个诊断函数集，你可以利用它来调试程序。如果需要获得更多的信息，请参阅《Microsoft Visual C++ 6.0库参考》中的《MicrosoftVisual C++ 6.0运行库参考》一卷中的“诊断例程”一文。

MFC通用调试宏
ASSERT | 在调试版本的库中，如果指定的表达式计算结果为FALSE，则打印出一条消息，然后退出程序
ASSERT_KINDOF | 测试一个对象是否属于一个指定的类或者从指定类继承而来的类
ASSERT_VALID | 调用对象的AssertValid成员函数测试对象的内部完整性；通常由CObject继承而来
DEBUG_NEW | 在调试模式下提供所有对象分配的文件名和行号以帮助发现内存泄漏
TRACE | 在类库的调试版本中提供了类似printf的功能
TRACE0 | 与TRACE类似，但是接受的格式字符串不包括参数
TRACE1 | 与TRACE类似，但是接受的格式字符串只包括一个参数
TRACE2 | 与TRACE类似，但是接受的格式字符串只包括两个参数
TRACE3 | 与TRACE类似，但是接受的格式字符串只包括三个参数
VERIFY | 与ASSERT类似，但是在Release版本中也象Debug版本一样计算表达式的值

MFC通用诊断变量和函数
afxDump | 全局变量，将CDumpContext信息发送的调试器输出窗口或者调试终端
afxMemDF | 全局变量，控制着调试内存分配器的特性
afxTraceEnabled | 全局变量，用于开放或者禁止TRACE宏的输出
afxTraceFlags | 全局变量，用于打开MFC内建的报告特性
AfxCheckError | 全局变量，用于测试传送的SCODE，检查是否是错误，如果是，抛出适当的错误
AfxCheckMemory | 检查当前分配的所有内存的完整性
AfxDump | 如果在调试器内调用，则在调试时转储对象的状态
AfxDumpStack | 生成当前栈的一个图象。这个函数通常被静态连接
AfxEnableMemoryTracking | 打开或关闭内存跟踪
AfxIsMemoryBlock | 检验一个内存块是否被正确地分配
AfxIsValidAddress | 检验一个内存地址是否属于程序的地址范围
AfxIsValidString | 检验一个指向字符串的指针是否有效
AfxSetAllocHook | 允许在每次进行内存分配时调用一个函数

MFC对象诊断函数
AfxDoForAllClasses | 对所有从CObject继承的支持运行时类型检查的类执行一个指定的功能
AfxDoForAllObjects | 对所有从CObject继承的用new分配内存的对象执行一个指定的功能


 异常处理
在程序执行的过程中，可能会发生一些称为“异常”的非正常状态或者错误。这些异常可能包括内存耗尽，资源分配错误或是找不到文件等。
微软基础类库中采用的异常处理模式和ANSI标准化委员会建议的C++异常处理方式很接近。异常处理函数必须在调用可能发生不正常状态的函数之前建立。如果这个函数遇到了不正常的状态，它就抛出一个异常，并且将控制权转移给异常处理函数。
微软基础类库中包含的某些宏可以建立异常处理函数。另有一些全局函数有助于抛出异常并在必要时终止程序。这些宏和全局函数可以分为以下几类：
· | 异常宏，生成异常处理函数的结构。
· | 异常抛出函数，生成特定类型的异常。
· | 终止函数，使程序终止。
如果需要示例和更多的细节，请参阅《Visual C++程序员指南》中的“异常”部分。

异常宏
TRY | 声明一段代码为异常处理
CATCH | 声明一段代码，用于捕捉前面的TRY块产生的一个异常
CATCH_ALL | 声明一段代码，用于捕捉前面的TRY块产生的所有异常
AND_CATCH | 声明一段代码，用于捕捉前面的TRY块产生的其他类型的异常
AND_CATCH_ALL | 声明一段代码，用于捕捉前面的TRY块抛出的所有其他类型的异常
END_CATCH | 结束上一个CATCH或AND_CATCH块
END_CATCH_ALL | 结束上一个CATCH_ALL代码块
THROW | 抛出一个指定的异常
THROW_LAST | 抛出当前处理的异常，交给后面的处理函数

异常抛出函数
AfxThrowArchiveException | 抛出一个档案异常
AfxThrowFileException | 抛出一个文件异常
AfxThrowMemoryException | 抛出一个内存异常
AfxThrowNotSupportedException | 抛出一个不支持的异常
AfxThrowResourceException | 抛出一个Windows的未找到资源异常
AfxThrowUserException | 在用户初始化的程序动作中抛出一个异常

MFC特别为OLE异常提供了两个异常抛出函数。

OLE异常函数
AfxThrowOleDispatchException | 在OLE自动化函数内抛出一个异常
AfxThrowOleException | 抛出一个OLE异常

为了支持数据库异常，数据库类提供了两个异常类，CDBException和CDaoException，还有一些全局函数用于支持异常类型：

DAO异常函数
AfxThrowDAOException | 从你自己的代码中抛出一个CDaoException异常
AfxThrowDBException | 从你自己的代码中抛出一个CDBException异常

MFC提供了下列终止函数：
终止函数
AfxAbort 当发生了致命错误时用于结束应用程序

请参阅：CException


 CString格式化和消息框显示
有一些函数被用于格式化和处理CString对象。不论何时你需要操作CString对象，你都可以利用这些函数，但是在格式化将被显示在消息框中的文本时，这些函数特别有用。
这组函数中同时还包括了用于显示消息框的全局例程。

CString函数
AfxFormatString1 | 用一个字符串替换给定字符串中的格式字符“%1”
AfxFormatString2 | 用两个字符串替换给定字符串中的两个格式字符“%1”和“%2”
AfxMessageBox | 显示一个消息框

请参阅：CString


 应用程序信息和管理
当你编写一个应用程序的时候，要创建一个从CWinApp继承而来的对象。此时，可能你希望从这个对象的外部获取它的有关信息。
微软基础类库提供了下列全局函数，用以帮助你完成这些任务：

应用程序信息和管理函数
AfxFreeLibrary | 减少已调入内存的动态链接库（DLL）模块的引用计数，当引用计数减到0时，这个模块就会被释放
AfxGetApp | 返回应用程序中唯一的CWinApp对象的指针
AfxGetAppName | 返回一个包含应用程序名字的字符串
AfxGetInstanceHandle | 返回一个代表应用程序实例的HINSTANCE变量
AfxGetMainWnd | 返回指向非OLE应用程序的当前主窗口的指针，或者是服务器程序的现场框架窗口
AfxGetResourceHandle | 返回代表应用程序的缺省资源的HINSTANCE变量。可以利用它来直接访问应用程序的资源
AfxInitRichEdit | 为应用程序初始化RichEdit控件，如果公共控件库还没有被初始化，则初始化公共控件库
AfxLoadLibrary | 调入一个DLL模块，同时返回一个句柄，可以通过它来得到DLL函数的地址
AfxRegisterWndClass | 注册一个Windows的窗口类，用它来替换MFC自动注册的窗口类
AfxSocketInit | 在CWinApp::InitInstance的重载函数中调用，用它来初始化Windows的Socket协议
AfxSetResourceHandle | 设置指向应用程序调入的缺省资源的句柄
AfxRegisterClass | 在使用MFC的DLL中注册一个窗口类
AfxBeginThread | 创建一个新的线程
AfxEndThread | 结束当前线程
AfxGetThread | 获得指向当前CWinThread对象的指针
AfxWinInit | 由MFC提供的WinMain函数调用，是基于GUI的应用程序中CWinApp初始化的一部分，用于初始化MFC。在使用MFC的控制台程序中必须直接调用

请参阅：CWinApp


 标准命令和窗口ID
微软基础类库在AFXRES.H中定义了一系列标准的命令和窗口ID。这些ID通常在资源编辑器中使用，ClassWizard也使用它们来将消息映射到你的处理函数。所有的标准命令都带有ID_前缀。例如，当你使用菜单编辑器的时候，你通常会将文件菜单中的打开菜单项与标准的ID_FILE_OPEN命令ID绑定在一起。
对于大多数标准命令，应用程序不需要引用其命令ID，因为应用框架本身在它的框架类(CWinThread, CWinApp, CView, CDocument等等)的消息映射中处理了这些命令。
除了这些标准的命令ID以外，还定义了一些以AFX_ID为前缀的标准ID。这些ID包括标准的窗口ID（以AFX_IDW为前缀），字符串ID（以AFX_IDS_为前缀），以及其他几种类型。
以AFX_ID为前缀的ID很少由程序员使用，但是当你需要重载那些引用了AFX_ID的框架函数的时候，你可能需要引用这些ID。
这儿并不单独描述这些ID。在技术注释文档的第20，21和22篇中，你可以找到更详细的有关信息。
注意：
FXWIN.H中并不直接包含头文件AFXRES.H。你必须在你的应用程序的资源描述文件（.RC）中明确地包含下列语句：

#include <afxres.h>


 集合类帮助函数
集合类CMap，CList以及CArray使用了一些全局的模板函数来完成诸如构造、析构和串行化元素等功能。在你实现由CMap，CList以及CArray继承而来的类时，你必须重载这些函数以适应在你的映射、链表、数组中保存的数据类型。如果需要获得有关重载ConstructElements，DestructElements以及SerializeElements 的更多信息，请参阅下述文档《Visual C++ 程序员指南》中的“如何生成类型安全的集合”。
微软基础类库中提供了下列全局函数来帮助你定制集合类：

集合类帮助函数
CompareElements | 指出元素是否相同
ConstructElements | 当生成一个元素时完成必要的动作
CopyElements | 将元素从一个数组中复制到另一个数。
DestructElements | 当销毁一个元素时完成必要的动作
DumpElements | 提供了面向流的诊断输出
HashKey | 计算一个Hash键
SerializeElements | 将元素保存在档案中，或者从档案中获得元素

请参阅：CMap, CList, CArray


 记录字段交换函数
这个主题列出了记录字段交换函数(RFX, Bulk RFX, 以及DFX) ，它们被用于自动完成在记录集对象和它的数据源之间的数据传送，同时还能执行对数据的一些操作。
如果你正在使用基于ODBC的类，并且你已经实现了多行记录成组获取，你一定手动重载了CRecordset的成员函数DoBulkFieldExchange，在其中对与数据源中的每一个列相对应的数据成员调用了成组RFX函数。
如果你的基于ODBC的类中还没有实现多行记录成组获取，或者你使用的是基于DAO 的类，那么ClassWizard 将会重载CRecordset 或 CDaoRecordset 的成员函数 DoFieldExchange，在其中对你的记录集中的每个数据字段成员调用RFX函数（如果是ODBC类）或者DFX函数（如果是DAO类）。
当框架每一次调用DoFieldExchange或者DoBulkFieldExchange的时候，记录字段交换函数就传送一次数据。每个函数传送一种特定类型的数据。
如果需要获得有关如何使用这些函数的更详细的说明，可以参阅“记录字段交换：RFX如何工作”；或者“DAO记录字段交换：DFX如何工作”。如果需要有关成组记录获取的更详细的信息，可以参阅下述文章：“成组记录获取（ODBC）”。这些文章可以在《Visual C++程序员指南》中找到。
对于动态绑定的数据列，你也可以自己调用RFX或DFX函数，而不是利用ClassWizard，在“Recordset：动态绑定数据列（ODBC）”和“DAO：动态绑定记录”中对此作了解释。这些文章可以在《Visual C++程序员指南》中找到。注意，在DAO中动态绑定数据与ODBC中的动态绑定有所不同。另外，你也可以编写自己的RFX或DFX例程，在技术注释文档的第43篇（针对ODBC）和第53篇（针对DAO）中对此作了解释。
如果需要获得在DoFieldExchange和DoBulkFieldExchange中使用RFX和DFX函数的例子，可以参看RFX_Text和RFX_Text_Bulk。DFX函数与RFX函数十分类似。

RFX函数(ODBC)
RFX_Binary | 传送CByteArray类型的字节数
RFX_Bool | 传送布尔数据
RFX_Byte | 传送单个的字节数据
RFX_Date | 传送CTime或TIMESTAMP_STRUCT类型的时间和日期数据
RFX_Double | 传送双精度浮点数据
RFX_Int | 传送整型数据
RFX_Long | 传送长整型数据
RFX_LongBinary | 通过CLongBinary类的对象传送二进制大对象（BLOB）数据
RFX_Single | 传送浮点数据
RFX_Text | 传送字符串数据

Bulk RFX函数(ODBC)
RFX_Binary_Bulk | 传送二进制数据的数组
RFX_Bool_Bulk | 传送布尔数据的数组
RFX_Byte_Bulk | 传送字节数据的数组
RFX_Date_Bulk | 传送TIMESTAMP_STRUCT类型数据的数组
RFX_Double_Bulk | 传送双精度浮点数据的数组
RFX_Int_Bulk | 传送整型数据的数组
RFX_Long_Bulk | 传送长整型数据的数组
RFX_Single_Bulk | 传送浮点数据的数组
RFX_Text_Bulk | 传送LPSTR类型数据的数组

DFX函数(DAO)
DFX_Binary | 传送CByteArray类型的字节数组
DFX_Bool | 传送布尔型数据
DFX_Byte | 传送单个字节数据
DFX_Currency | 传送COleCurrency类型的货币数据
DFX_DateTime | 传送COleDateTime类型的时间和日期数据
DFX_Double | 传送双精度浮点数据
DFX_Long | 传送长整型数据
DFX_LongBinary | 通过CLongBinary类的对象传送大二进制对象（BLOB）数据，对于DAO，推荐你使用DFX_Binary
DFX_Short | 传送短整型数据
DFX_Single | 传送浮点数据
DFX_Text | 传送字符串数据。

请参阅：
CRecordset::DoFieldExchange, CRecordset::DoBulkFieldExchange, CDaoRecordset::DoFieldExchange


 CRecordView和CDaoRecordView的对话框数据交换函数
这个主题列出了用于在CRecordset和CRecordView表格之间或是CDaoRecordset与CDaoRecordView表格之间交换数据的DDX_Field函数。
重要：
DDX_Field函数与DDX函数类似，它们都是与表格中的控件交换数据。但是与DDX函数不同的是，它们与和视窗相关的记录集对象的字段交换数据，而不是与记录视窗本身的字段进行交换。如果要获得更多的信息，请参阅CRecordView和CDaoRecordView类，或者参考《Visual C++程序员指南》中的“ClassWizard：将表格控件映射到记录集的字段”。

DDX_Field函数
DDX_FieldCBIndex | 在记录集字段的数据成员和CRecordView或CDaoRecordView中组合框的当前选择索引之间交换整数数据
DDX_FieldCBString | 在记录集字段的数据成员和CRecordView或CDaoRecordView中组合框的编辑控件之间交换CString数据。当从记录集向控件传送数据的时候，这个函数将选择组合框中以给定字符串中的字符开头的项
DDX_FieldCBStringExact | 在记录集字段的数据成员和CRecordView或CDaoRecordView中组合框的编辑控件之间交换CString数据。当从记录集向控件传送数据的时候，这个函数将选择组合框中严格匹配给定字符串的项
DDX_FieldCheck | 在记录集字段的数据成员和CRecordView或CDaoRecordView中复选框之间交换布尔型数据
DDX_FieldLBIndex | 在记录集字段的数据成员和CRecordView或CDaoRecordView中列表框的当前选择索引之间交换整型数据
DDX_FieldLBString | 管理在记录集的字段数据成员和列表框控件之间的CString数据的传送。当数据是从记录集传送到控件时，这个函数将选择列表框中以给定字符串中字符开头的项
DDX_FieldLBStringExact | 管理在记录集的字段数据成员和列表框控件之间的CString数据的传送。当数据是从记录集传送到控件时，这个函数将选择列表框中严格匹配给定字符串的项
DDX_FieldRadio | 在记录集的字段数据成员和CRecordView或CDaoRecordView中的一组单选控件之间传送整数数据
DDX_FieldScroll | 设置或获得CRecordView或CDaoRecordView中滚动条控件的位置。在你的DoFieldExchange函数中调用
DDX_FieldText | 对于在记录集的字段数据成员和CRecordView或CDaoRecordView.中的编辑框之间传送数据，可以获得对应各种类的重载函数，包括int整型，UINT，long型，DWORD，CString，float，double，short，COleDateTime以及COleCurrency等


 OLE控件中的对话框数据交换
这个主题列出了用于在对话框、表格视或控制视对象中的OLE控件的属性与对话框、表格视或控制视对象的数据成员之间交换数据的DDX_OC函数。

DDX_OC函数
DDX_OCBool | 管理在OLE控件的属性与布尔型数据成员之间的布尔数据传送
DDX_OCBoolRO | 管理在OLE控件的只读属性与布尔型数据成员之间的布尔数据传送
DDX_OCColor | 管理在OLE控件的属性与OLE_COLOR数据成员之间的OLE_COLOR数据传送
DDX_OCColorRO | 管理在OLE控件的只读属性与OLE_COLOR数据成员之间的OLE_COLOR数据传送
DDX_OCFloat | 管理在OLE控件的属性与float浮点（或double双精度）数据成员之间的浮点（或双精度）数据传送
DDX_OCFloatRO | 管理在OLE控件的只读属性与浮点（或双精度）数据成员之间的浮点（或双精度）数据传送
DDX_OCInt | 管理在OLE控件的属性与int整型（或long长整型）数据成员之间的整型（或长整型）数据传送
DDX_OCIntRO | 管理在OLE控件的只读属性与整型（或长整型）数据成员之间的整型（或长整型）数据传送
DDX_OCShort | 管理在OLE控件的属性与short短整型数据成员之间的短整型数据传送
DDX_OCShortRO | 管理在OLE控件的只读属性与短整型数据成员之间的短整型数据传送
DDX_OCText | 管理在OLE控件的属性与CString数据成员之间的CString数据传送
DDX_OCTextRO | 管理在OLE控件的只读属性与CString数据成员之间的CString数据传送


 数据库宏和全局函数、变量
这里列出的宏使用于基于ODBC的数据库应用程序。它们不应在基于DAO的应用程序中使用。
直到MFC4.2之前，AFX_SQL_ASYNC 和 AFX_SQL_SYNC宏使异步操作有机会向其它操作让出时间。从MFC4.2开始，这些宏的实现方式有了变化，因为现在MFC的ODBC类只使用同步操作。MFC4.2中的AFX_ODBC_CALL宏是新的。

数据库宏
AFX_ODBC_CALL | 利用这个宏来调用一个返回SQL_STILL_EXECUTING 的ODBC API，它会反复调用这个函数直到它不再返回SQL_STILL_EXECUTING
AFX_SQL_ASYNC | 仅仅是简单地调用AFX_ODBC_CALL
AFX_SQL_SYNC | 利用这个宏来调用一个不返回SQL_STILL_EXECUTING 的ODBC API

数据库全局函数
AfxGetHENV 利用这个全局函数来获得MFC当前使用的ODBC环境的句柄。你可以在直接ODBC调用时使用这个句柄


 DAO数据库引擎的初始化和终止
当你使用MFC的DAO对象时，必须首先初始化DAO数据库引擎，在你的应用程序或者DLL退出前，必须终止数据库引擎。有两个函数AfxDaoInit和AfxDaoTerm可以完成这个任务。

DAO数据库引擎初始化和终止函数
AfxDaoInit | 初始化DAO数据库引擎
AfxDaoTerm | 终止DAO数据库引擎


 OLE初始化
在你的应用程序可以使用OLE系统服务之前，必须首先初始化OLE系统DLL，并且确定DLL的版本。AfxOleInit可以初始化OLE系统DLL。

OLE初始化
AfxOleInit 初始化OLE库


 应用程序控制
OLE需要实质性地控制应用程序和它的对象。OLE的系统DLL必须能够自动地启动、释放应用程序，协调它们的产物以及对象的修改，等等。这个主题中的函数适应了这些需要。另外，除了被OLE系统DLL调用以外，有时这些函数必须由应用程序自己调用。

应用程序控制
AfxOleCanExitApp | 指出应用程序是否能够结束
AfxOleGetMessageFilter | 获得应用程序当前的消息过滤器
AfxOleGetUserCtrl | 获得当前的用户控制标志
AfxOleSetUserCtrl | 设置或清除用户控制标志
AfxOleLockApp | 增加应用程序中活动对象的全局计数
AfxOleUnlockApp | 减小应用程序中活动对象的全局计数
AfxOleRegisterServerClass | 在OLE系统注册表中注册一个服务器
AfxOleSetEditMenu | 实现 typename Object命令的用户接口


 调度映射
OLE自动化提供了在应用程序之间调用方法和访问属性的途径。由微软基础类库提供的调度这些请求的机制称为“调度映射”，它分配对象函数和属性的内部、外部名字，同时还分配属性本身和函数参数的数据类型。

调度映射
DECLARE_DISPATCH_MAP | 声明将使用一个调度映射来揭示一个类的方法和属性（必须用于类声明中）
BEGIN_DISPATCH_MAP | 开始一个调度映射的定义
END_DISPATCH_MAP | 结束一个调度映射的定义
DISP_FUNCTION | 用于调度映射中，以定义一个OLE自动化函数
DISP_PROPERTY | 定义一个OLE自动化属性
DISP_PROPERTY_EX | 定义一个OLE自动化属性并且命名“get”和“set”函数
DISP_PROPERTY_NOTIFY | 为一个OLE自动化属性定义通知消息
DISP_PROPERTY_PARAM | 定义一个带参数的OLE自动化属性，并且命名了“get”和“set”函数
DISP_DEFVALUE | 将一个现存的属性设置为一个对象的缺省值


 Variant参数类型常量

这个主题列出了一些新的常量，它们指出了被设计与微软基础类库中OLE控件类一起使用的variant参数类型。
下面是类常量的一个列表：

Variant数据常量
· | VTS_COLOR | 用于表示RGB颜色值的32位整数
· | VTS_FONT | 指向一个OLE字体对象的IFontDisp接口的指针
· | VTS_HANDLE | 一个Windows句柄值
· | VTS_PICTURE | 指向一个OLE图形对象的IPictureDisp接口的指针
· | VTS_OPTEXCLUSIVE | 一个16位值，用于成组使用的控件，比如单选按钮。这个类型告诉容器是否在一组控件中有一个具有TRUE值，而其它的都是FALSE
· | VTS_TRISTATE | 一个16位带符号整数，用于可能具有三个可能值（选中、未选中、变灰）的属性，例如，复选框
· | VTS_XPOS_HIMETRIC | 一个32位无符号整数值，用于表示x轴上以HIMETRIC为单的位置值
· | VTS_YPOS_HIMETRIC | 一个32位的无符号整数值，用于表示y轴上以HIMETRIC为单位的位置值
· | VTS_XPOS_PIXELS | 一个32位无符号整数值，用于表示x轴上以像素为单位的位置值
· | VTS_YPOS_PIXELS | 一个32位无符号整数值，用于表示y轴上以像素为单位的位置值
· | VTS_XSIZE_PIXELS | 一个32位无符号整数值，用于表示以像素为单位的屏幕对象的宽度
· | VTS_YSIZE_PIXELS | 一个32位无符号整数值，用于表示以像素为单位的屏幕对象的高度
· | VTS_XSIZE_HIMETRIC | 一个32位无符号整数值，用于表示以HIMETRIC为单位的屏幕对象的宽度
· | VTS_YSIZE_HIMETRIC | 一个32位无符号整数值，用于表示以HIMETRIC为单位的屏幕对象的高度
注意：
另外还为所有的variant类型定义了一些variant常量，除了VTS_FONT和VTS_PICTURE，它们提供了一个指向variant数据常量的指针。这些常量以VTS_Pconstantname 约定来命名。例如，VTS_PCOLOR是一个指向VTS_COLOR常量的指针。


 访问类型库
类型库揭示了OLE控件与其它具有OLE能力的应用程序之间的接口。如果OLE控件需要提供一个或多个接口，它必须具有一个类型库。
下面列出的宏使OLE控件能够提供对它自己的类型库的访问。

类型库访问
DECLARE_OLETYPELIB | 定义了OLE控件的GetTypeLib成员函数（必须在类定义中使用）
IMPLEMENT_OLETYPELIB | 实现了OLE控件的GetTypeLib成员函数（必须在类实现中使用）


 属性页
属性页用可定制的图形接口显示特定OLE控件的属性的当前值，通过支持基于对话框数据交换（DDX）的数据映射机制提供了对它们的显示和编辑手段。
这种数据映射机制将属性页控件映射到OLE控件的每个属性。控件属性的值反映了属性页的状态或内容。属性页控件和属性之间的这种映射由在属性页的DoDataExchange成员函数中调用的DDP_函数指定。下面是用于交换你的属性页控件中输入的数据的DDP_函数的列表：

属性页数据交换
DDP_CBIndex | 利用这个函数将组合框中被选中的字符串的索引和控件的属性连接起来
DDP_CBString | 利用这个函数将组合框中被选中的字符串和控件的属性连接起来。选中的字符串可以是以与属性值相同的字母开始的，但是并不需要完全匹配
DDP_CBStringExact | 利用这个函数将组合框中被选中的字符串与控件的属性连接起来。选中的字符串与属性的字符串值必须是严格匹配的
DDP_Check | 利用这个函数将控件的属性页中的复选框与控件的属性连接起来
DDP_LBIndex | 利用这个函数将列表框中被选中字符串的索引与控件的属性连接起来
DDP_LBString | 利用这个函数将列表框中被选中字符串与控件的属性连接起来。选中的字符串可以是以与控件属性值相同的字母开始的，但是并不需要完全匹配
DDP_LBStringExact | 利用这个函数将列表框中被选中的字符串与控件的属性连接起来。被选中的字符串和属性的字符串值必须严格地匹配
DDP_PostProcessing | 利用这个函数来结束你的控件的属性值的传送
DDP_Radio | 利用这个函数将控件的属性页中的一组单选按钮与控件的属性连接起来
DDP_Text | 利益这个函数将控件的属性页中的控件与控件的属性连接起来。这个函数处理一些不同类型的属性，比如双精度值，短整型值，BSTR值以及长整型值等
如果需要获得有关DoDataExchange函数和属性页的详细信息，请参阅《Visual C++程序员指南》中的“ActiveX控件：属性页”一文。
下面是用来为OLE控件创建和管理属性页的宏的列表：

属性页
BEGIN_PROPPAGEIDS | 开始一个属性页ID的列表
END_PROPPAGEIDS | 结束一个属性页ID的列表
PROPPAGEID | 声明一个控件类的属性页


 事件映射
不论何时，如果一个控件想要通知它的容器，有些动作（取决于控件的设计者）已经发生（比如按键、鼠标点击，或者控件状态的变化等），它就调用一个事件引发的函数。这个函数通过产生相应的事件来通知控件的容器一些重要的动作已经产生了。
微软基础类库提供了一种为事件引发而优化的编程模式。在这种模式中，使用了“事件映射”来指定对于一个特定的控件，哪个函数引发哪个事件。事件映射中为每个事件包含了一个宏。例如，一个引发点击事件的事件映射可能是这样的：
BEGIN_EVENT_MAP(CSampleCtrl, COleControl)
//{{AFX_EVENT_MAP(CSampleCtrl)
EVENT_STOCK_CLICK( )
//}}AFX_EVENT_MAP
END_EVENT_MAP()
EVENT_STOCK_CLICK宏指明这个控件每检测到一次鼠标点击就引发一个点击事件。如果要获得其它预定事件的详细列表，请参阅《Visual C++程序员指南》中的“ActiveX控件事件”一文。还要一些宏可以用来指明自定义的事件。
尽管事件映射宏很重要，通常你并不会直接插入它们。这是因为当你使用事件映射将事件引发的函数与事件联系起来时，ClassWizard会在你的源代码中自动地创建一个事件映射入口。不论何时你想编辑或者添加事件映射入口，你都可以使用ClassWizard。
为了支持事件映射，MFC提供了下列宏：

事件映射定义和分界
DECLARE_EVENT_MAP | 定义一个事件映射，它将被用于一个类中，将事件映射到一个事件引发的函数（必须在类定义中使用）
BEGIN_EVENT_MAP | 开始一个事件映射的定义（必须在类的实现中使用）
END_EVENT_MAP | 结束一个事件映射的定义（必须在类的实现中使用）

事件映射宏
EVENT_CUSTOM | 指明哪个事件引发函数将引发特定的事件
EVENT_CUSTOM_ID | 指明哪个事件引发函数将引发特定的具有指定调度ID的事件

消息映射宏
ON_OLEVERB | 指明OLE控件处理的一个自定义的动词
ON_STDOLEVERB | 重载一个OLE控件的标准动词映射


 事件接收映射
当一个嵌入的OLE控件引发一个事件时，该控件的容器通过一个MFC提供的称为“事件接收映射”的机制接收事件。这种事件接收映射为每个特定的事件分配处理函数，包括这些事件的参数。如果需要获得有关事件接收映射的更多的信息，请参阅《Visual C++程序员指南》中的“ActiveX控件容器”一文。

事件接收映射
BEGIN_EVENTSINK_MAP | 开始一个事件接收映射的定义
DECLARE_EVENTSINK_MAP | 定义一个事件接收映射
END_EVENTSINK_MAP | 结束一个事件接收映射的定义
ON_EVENT | 为特定的事件指定一个事件处理函数
ON_EVENT_RANGE | 为一系列OLE控件引发的事件定义一个事件处理函数
ON_EVENT_REFLECT | 在被控件的容器处理之前接收控件所引发的事件
ON_PROPNOTIFY | 定义一个处理函数以处理OLE控件产生的属性通知
ON_PROPNOTIFY_RANGE | 定义一个处理函数以处理一个OLE控件集合产生的属性通知
ON_PROPNOTIFY_REFLECT | 在被控件的容器处理之前接收控件发出的属性通知


 连接映射
OLE控件可以向别的应用程序提供接口。这些接口仅允许容器对控件进行访问。如果一个OLE控件希望访问其它OLE对象的外部接口必须建立一个连接点。这个连接点允许一个控件访问外部的调度映射，比如事件映射或通知函数。
微软基础类库提供了支持这种连接点的编程模式。在这种模式中，利用“连接映射”来为OLE控件指派接口（或者连接点）。连接映射中为每个连接点包含了一个宏。如果要获得有关连接映射的更多信息，参见CConnectionPoint类。
典型的情况是，一个控件将仅仅支持两个连接点：一个用于事件，一个用于属性通知。这是由COleControl基类实现的，并且不需要控件的编写者再作什么额外的工作。你希望在你的类中实现的任何附加的连接点都必须手动添加。为了支持连接映射和连接点，MFC提供了下列宏：

连接映射定义和分界
BEGIN_CONNECTION_PART | 声明一个嵌入类，它实现了附加的连接点（必须在类定义中使用）
END_CONNECTION_PART | 结束一个连接点的定义（必须在类定义中使用）
CONNECTION_IID | 指定控件的连接点的接口ID
DECLARE_CONNECTION_MAP | 声明一个连接映射将被用在一个类中（必须在类定义中使用）
BEGIN_CONNECTION_MAP | 开始一个连接映射的定义（必须在类实现中使用）
END_CONNECTION_MAP | 结束一个连接映射的定义（必须在类实现中使用）
CONNECTION_PART | 指定控件的连接映射中的连接点

下面的函数帮助建立和断开一个使用连接点的连接：
连接点的初始化/终止
AfxConnectionAdvise | 在源端和接收端之间建立一个连接
AfxConnectionUnadvise | 中断源端和接收端之间的一个连接


 注册OLE控件
OLE控件与其它OLE服务器对象一样，可以被其它具有OLE能力的应用程序所访问。这是通过注册控件的类型库和类来实现的。
下面的函数使你能够在Windows的注册数据库中增添或删除控件类，属性页以及类型库等：

注册OLE控件
AfxOleRegisterControlClass | 在注册数据库中增添控件类
AfxOleRegisterPropertyPageClass | 在注册数据库中增添控件的属性页
AfxOleRegisterTypeLib | 在注册数据库中增添控件的类型库
AfxOleUnregisterClass | 从注册数据库中删除控件类或属性页类
AfxOleUnregisterTypeLib | 从注册数据库中删除控件的类型库

AfxOleRegisterTypeLib通常由控件的DLL中DllRegisterServer的实现部分来调用。类似地，AfxOleUnregisterTypeLib由DllUnregisterServer.调用。AfxOleRegisterControlClass， AfxOleRegisterPropertyPageClass 以及AfxOleUnregisterClass 通常由控件的类工厂或属性页的成员函数UpdateRegistry来调用。


 类工厂与许可
为了创建你的OLE控件的一个实例，容器应用程序调用控件的类工厂的成员函数。因为你的控件是一个实际的OLE对象，由类工厂负责创建你的控件的实例。每个OLE控件都必须具有一个类工厂。
OLE控件的另一个重要特征就是它们的强迫许可的能力。ControlWizard使你能够在创建控件的时候将许可功能合并进去。如果需要获得有关控件许可的更详细的信息，请参阅Visual C++ 程序员联机指南中“ActiveX控件：许可一个ActiveX控件”一文。
下面的表格列出了一些宏和函数，它们可以用来声明并实现你的控件的类工厂，也可以许可你的控件。

类工厂与许可
DECLARE_OLECREATE_EX | 为OLE控件或属性页声明一个类工厂
IMPLEMENT_OLECREATE_EX | 实现控件的GetClassID函数并声明类工厂的一个实例
BEGIN_OLEFACTORY | 开始许可函数的声明
END_OLEFACTORY | 结束许可函数的声明
AfxVerifyLicFile | 校验一个控件是否经许可在特定计算机上使用


 OLE控件的持久性
OLE控件的一个能力即是它的属性的持久性（或是串行化），这个能力使得OLE控件可以对一个文件或流读、写属性值。容器应用程序可以利用串行化来存储控件的属性值，即使应用程序已经销毁了这个控件。当以后创建了控件的一个新的实例时，OLE控件的属性值可以从文件或流中读取。

OLE控件的持久性
PX_Blob | 交换控件的存储二进制大对象（BLOB）数据的属性
PX_Bool | 交换控件的BOOL类型的属性
PX_Color | 交换控件的颜色属性
PX_Currency | 交换控件的CY类型的属性
PX_DataPath | 交换控件的CDataPathProperty类型的属性
PX_Double | 交换控件的double型的属性
PX_Font | 交换控件的字体属性
PX_Float | 交换控件的float类型的属性
PX_IUnknown | 交换控件的未定义类型的属性
PX_Long | 交换控件的long型属性
PX_Picture | 交换控件的图形属性
PX_Short | 交换控件的short型属性
PX_Ulong | 交换控件的ULONG类型的属性
PX_Ushort | 交换控件的USHORT类型的属性
PX_String | 交换控件的字符串属性
PX_VBXFontConver | 在VBX控件的与字体有关的属性与OLE控件的字体属性之间交换

另外，全局函数AfxOleTypeMatchGuid可以测试给定的GUID与TYPEDESC是否匹配。


 Internet服务器API解析映射
Internet服务器API是一个扩展的开放API集合，它向你提供了为你的MicrosoftInternet信息服务器创建附加内容、运行Internet服务器程序的能力。当客户向Internet服务器发送一个请求时，服务器处理这个请求，将它发送给“解析映射”中的一系列分析宏。解析映射将客户的请求映射为一个从ChttpServer继承的类的函数和参数。

ISAPI解析映射
BEGIN_PARSE_MAP | 开始一个分析映射的定义
ON_PARSE_COMMAND | 分析客户命令
ON_PARSE_COMMAND_PARAMS | 为CHttpServer对象定义一个来自客户的命令
DEFAULT_PARSE_COMMAND | 调用由FnName参数指定的页面
END_PARSE_MAP | 结束一个分析映射的定义


 Internet URL解析全局函数
Internet服务器API是一个扩展的开放API集合，它向你提供了为你的MicrosoftInternet信息服务器创建附加内容、运行Internet服务器程序的能力。当客户向Internet服务器发送一个请求时，你可以使用一些全局的URL处理函数来析取客户的信息。

Internet URL解析全局函数
AfxParseURL | 分析一个URL字符串，返回服务的类型及其内容
AfxParseURLEx | 分析一个URL字符串，返回服务的类型及其内容，同时还提供客户的名字和密码


 Internet服务器API（ISAPI）诊断宏
微软的 Internet 信息服务器需要一些与MFC程序相同的诊断服务。但是，为Internet服务器编写的程序不需要MFC。下面描述的ISAPI宏为MFC程序和非MFC程序提供了相同层次的调试功能。

ISAPI诊断宏
ISAPIASSERT | 提供了ASSERT功能
ISAPITRACE | 提供了TRACE功能
ISAPITRACE0 | 提供了TRACE0功能
ISAPITRACE1 | 提供了TRACE1功能
ISAPITRACE2 | 提供了TRACE2功能
ISAPITRACE3 | 提供了TRACE3功能
ISAPIVERIFY | 提供了VERIFY功能


 宏、全局函数和全局变量

这个部分描述了MFC库中的全局函数、全局变量以及宏。
注意：
许多全局函数都以“Afx”前缀开始——除了一些例外，如对话框数据交换（DDX）函数和许多数据库函数以外，都遵从这个约定。所有的全局变量都以“Afx”前缀开始。宏没有任何特定的前缀，但是它们都是大写的。
MFC库和活动模板库（ATL）共用一些字符串转换宏。参考ATL文档中的“字符串转换宏”，在那儿讨论了这些宏。
如果需要有关C运行库的调试版本以及诊断函数的信息，请参阅《MicrosoftVisual C++6.0库参考》的《Microsoft Visual C++6.0运行库》一卷中的“调试例程”一文。


 AFX_EXT_CLASS

说明：
扩展DLL使用AFX_EXT_CLASS宏以引出类。与扩展DLL连接的可执行程序使用这个宏以引入类。利用AFX_EXT_CLASS宏，创建扩展DLL时使用的头文件可以被与该DLL连接的可执行文件使用。
在你的DLL的头文件中，在类定义中加入AFX_EXT_CLASS关键字，如下所示：
class AFX_EXT_CLASS CMyClass : public CDocument
{
// 类的主体
};
更多的信息参见“使用AFX_EXT_CLASS来引入和引出”。


 AFX_MANAGE_STATE

AFX_MANAGE_STATE( AFX_MODULE_STATE* pModuleState )

参数：
pModuleState 指向一个AFX_MODULE_STATE结构的指针。

说明：
调用这个宏以保护DLL中的引出函数。调用了这个宏以后，pModuleState 就是立即包含域的剩余部分的实际模块状态。在脱离作用域之前，原来的实际模块状态将被自动保存。
AFX_MODULE_STATE结构中包含了有关模块的全局数据，这是被push或pop的模块状态的一部分。
在缺省情况下，MFC利用主应用程序的资源句柄来载入资源模板。如果你在一个DLL中有一个输出函数，例如在DLL中启动一个对话框的函数，这个模板实际保存在DLL模块中。你需要为将要使用的正确的句柄切换模块状态。你可以在函数的开头加上如下代码以实现这个目的：
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
这会交换当前模块的状态和AfxGetStaticModuleState返回的状态，直到当前作用域结束。
有关模块状态和MFC的更多信息请参见《Visual C++程序员指南》的“创建新的文档、窗口和视窗”中的“管理MFC模块的状态数据”，以及Visual C++联机文档中的“技术注释58”。

请参阅：AfxGetStaticModuleState


 AFX_ODBC_CALL

AFX_ODBC_CALL( SQLFunc )

参数：
SQLFunc 一个ODBC API 函数。有关ODBC API函数的更多信息请参见《ODBCSDK 程序员参考》。

说明：
使用这个宏来调用那些返回SQL_STILL_EXECUTING 的ODBC API 函数。
AFX_ODBC_CALL会重复调用这个函数，直到它们不再返回SQL_STILL_EXECUTING。
在使用AFX_ODBC_CALL之前，你必须声明一个RETCODE类型的变量nRetCode。你可以在调用了这个宏后使用CRecordset::Check函数来检查nRetCode的值。
注意现在MFC的ODBC类仅使用同步处理。如果要实现异步操作，你必须调用ODBC的API函数SQLSetConnectOption。有关的更多信息请参见《ODBC SDK程序员参考》中的“异步执行函数”主题。

示例：
这个例子使用AFX_ODBC_CALL来调用ODBC 的API函数SQLColumns，它返回由strTableName列名的表中的数据列的列表。注意，声明了nRetCode，并且将记录集数据成员作为参数传递给该函数。这个例子同时还演示了如何用CRecordset类的成员函数Check来检查结果。变量prs是指向CRecordset对象的指针，可以在别处声明。
// AFX_ODBC_CALL的例子
RETCODE nRetCode;
AFX_ODBC_CALL( ::SQLColumns( prs->m_hstmt,
(UCHAR *)NULL, SQL_NTS, (UCHAR *)NULL,
SQL_NTS, (UCHAR *)(constchar*)strTableName,
SQL_NTS, (UCHAR *)NULL, SQL_NTS )
);

if( !prs->Check( nRetCode ) )
{
AfxThrowDBException( nRetCode, prs->m_pdb, prs->m_hstmt );
TRACE( "SQLColumns failed\n" );
}

请参阅：AFX_SQL_ASYNC, AFX_SQL_SYNC


 AFX_SQL_ASYNC

AFX_SQL_ASYNC( prs, SQLFunc )

参数：
prs | 指向CRecordset对象或者CDatabase对象的指针。从MFC4.2开始，这个参数就被忽略。
SQLFunc | 一个ODBC的API函数。有关ODBC的API函数的更多的信息请参见《ODBC SDK程序员参考》。

说明：
在MFC4.2中，这个宏的实现有了变化。现在AFX_SQL_ASYNC只是简单地调用AFX_ODBC_CALL宏，并且忽略了prs参数。在MFC的以前的版本中，AFX_SQL_ASYNC被用于调用可能返回SQL_STILL_EXECUTING的ODBCAPI函数。如果一个ODBC的API函数返回了SQL_STILL_EXECUTING，AFX_SQL_ASYNC就会调用
prs->OnWaitForDataSource。
注意：
现在MFC的ODBC类仅使用同步处理。如果要实现异步操作，你必须调用ODBC的API函数SQLSetConnectOption。相关的更多的信息请参考《ODBC SDK程序员参考》中的主题：“异步执行函数。”

请参阅：AFX_ODBC_CALL, AFX_SQL_SYNC


 AFX_SQL_SYNC

AFX_SQL_SYNC( SQLFunc )

参数：
SQLFunc 一个ODBC的API函数。关于这些函数的更多的信息，参看《ODBC SDK程序员参考》。

说明：
AFX_SQL_SYNC宏简单地调用函数SQLFunc。利用这个宏来调用不会返回SQL_STILL_EXECUTING的ODBC API函数。
在调用AFX_SQL_SYNC之前，你必须声明一个RETCODE类型的变量nRetCode。你可以在调用宏之后检查nRetCode的值。
注意在MFC4.2中AFX_SQL_SYNC的实现以及改变了。因为不再需要检查服务器的状态，AFX_SQL_SYNC简单地将一个值赋给nRetCode。例如，你不需要进行下面的调用调用：
AFX_SQL_SYNC( ::SQLGetInfo( .. ) )
而是可以简单地进行赋值：
nRetCode = ::SQLGetInfo( .. );

请参阅：AFX_SQL_ASYNC, AFX_ODBC_CALL


 AfxAbort

void AfxAbort( );

说明：
这是MFC提供的缺省的终止函数。AfxAbort是当发生了一个致命错误，如无法处理的没有捕捉到的异常时，由MFC的成员函数调用的。在个别情况下，如果你遇到了无法恢复的灾难性错误，你也可以自己调用AfxAbort


 AfxBeginThread

CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);
CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
);

返回值：指向新创建的线程对象的指针。

参数：
pfnThreadProc指向工作线程的控制函数。不能是NULL。这个函数必须按下面的方式定义：
UINT MyControllingFunction( LPVOID pParam );
pThreadClass | 从CWinThread继承的对象的RUNTIME_CLASS。
pParam | 将要传送给控制函数的参数，如pfnThreadProc中定义的函数参数所示。
nPriority | 设定的线程的优先级。如果为0，则使用与创建它线程相同的优先级。在《Win32程序员参考》的“SetThreadPriority”中有可用的优先级的完整列表和描述。
nStackSize | 指定新线程使用的栈的以字节为单位的大小。如果为0，则缺省的栈大小与创建它的线程的栈大小相同。
dwCreateFlags指定控制线程的创建过程的附加标志。这个标志可以是两个值之一：
· | CREATE_SUSPENDED | 经过一个延迟后启动这个线程。这个线程将在调用ResumeThread 以后才会启动。
· | 0 | 创建后立即启动这个线程。
lpSecurityAttrs | 指向一个SECURITY_ATTRIBUTES结构，它指定了线程的安全特性。如果为空，将使用与创建它的线程相同的安全特性。如果需要获得有关这个结构的详细信息，请参阅《Win32程序员参考手册》。

说明：
调用这个函数以创建一个新的线程。AfxBeginThread的第一种形式创建了一个工作线程。第二种形式创建了一个用户界面线程。
AfxBeginThread创建一个新的CWinThread对象，调用它的CreateThread函数以启动这个线程，并且返回这个线程的指针。整个过程都进行检查以保证如果创建失败，所有的对象都会被适当地释放。为了结束这个线程，可以在线程内调用AfxEndThread，或者从工作线程的控制函数内返回。
关于AfxBeginThread的更多信息，请参阅《Visual C++程序员指南》中的“多线程：创建工作线程”和“多线程：创建用户界面线程”。

请参阅：AfxGetThread


 AfxCheckError

void AFXAPI AfxCheckError(SCODE sc);
throw CMemoryExcetion*
throw COleException*

说明：
这个函数检测传递的SCODE是否是个错误。如果它是个错误，这个函数将抛出一个异常。如果传递的SCODE是个E_OUTOFMEMORY，它就调用AfxThrowMemoryException 抛出一个CMemoryException。否则，它调用AfxThrowOleException抛出一个COleException。
这个函数可以用来检查你的应用程序中对OLE函数调用的返回值。通过测试应用程序中函数调用的返回值，你就可以用很少的代码正确地响应错误状态。
注意：这个函数在调试版本和非调试版本中具有相同的效果。

示例：
LPDISPATCH pDisp = NULL;
AfxCheckError(CoCreateInstance(CLSID, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch,(LPVOID)&pDisp));
// 如果有错误，则已经抛出了一个异常
// 我们可以开始使用返回的指针
COleDispatchDriver disp(pDisp);
//等等...


 AfxCheckMemory

BOOL AfxCheckMemory( );

返回值：如果没有内存错误，则为非零值；否则为0。

说明：
这个函数使自由内存池有效并在需要时输出错误信息。如果这个函数没有检测到内存冲突，它什么也不输出。
当前在堆中分配的所有内存块都会被检查，包括那些用 new分配的内存，但是不包括那些用直接调用内存分配函数分配的内存，例如malloc函数或者Windows的GlobalAlloc函数。如果发现有内存块存在错误，就会在调试器上输出错误信息。
如果你在程序模块中包含了下面的程序行：
#define new DEBUG_NEW
后面对AfxCheckMemory的调用都会显示发生内存分配的文件名和行号。
注意：
如果你的模块中包含了一个或多个串行化类的实现，那么你必须在最后一个IMPLEMENT_SERIAL宏之后包含#define程序行。这个函数仅在MFC的调试版本中起作用。

示例：
// AfxCheckMemory的例子
CAge* pcage = new CAge( 21 ); // CAge 是从 CObject.继承而来的
Age* page = new Age( 22 ); // Age 不是从 CObject.继承的
*(((char*) pcage) - 1) = 99; // 破坏前面的保护字节
*(((char*) page) - 1) = 99; // 破坏前面的保护字节
AfxCheckMemory();

程序的结果如下：
memory check error at $0067495F = $63, should be $FD
DAMAGE: before Non-Object block at $00674960
Non-Object allocated at file test02.cxx(48)
Non-Object located at $00674960 is 2 bytes long
memory check error at $00674905 = $63, should be $FD
DAMAGE: before Object block at $00674906
Object allocated at file test02.cxx(47)
Object located at $00674906 is 6 bytes long


 AfxConnectionAdvise

BOOL AFXAPI AfxConnectionAdvise(
LPUNKNOWN pUnkSrc,
REFIID iid,
LPUNKNOWN pUnkSink,
BOOL bRefCount,
DWORD FAR* pdwCookie
);

返回值：如果建立了连接则为非零值，否则为0。

参数：
pUnkSrc | 指向调用接口的对象的指针。
pUnkSink | 指向实现接口的对象的指针。
iid | 连接的接口ID。
bRefCount | 如果为TRUE，表明创建连接会引起pUnkSink的引用计数增加。如果为FALSE，则表明应用计数不会增加。
pdwCookie | 指向连接标识符返回的DWORD值的指针。当断开连接的时候，必须将这个值传递给AfxConnectionUnadvise的dwCookie参数。

说明：
调用这个函数在pUnkSrc指明的源端和pUnkSink指明的接收端之间建立连接。

请参阅：AfxConnectionUnadvise


 AfxConnectionUnadvise

BOOL AFXAPI AfxConnectionUnadvise(
LPUNKNOWN pUnkSrc,
REFIID iid,
LPUNKNOWN pUnkSink,
BOOL bRefCount,
DWORD dwCookie
);

返回值：如果断开了连接则为非零值，否则为0。

参数：
pUnkSrc | 指向调用接口的对象的指针。
pUnkSink | 指向实现接口的对象的指针。
iid | 连接点接口的接口ID。
bRefCount | 如果为TRUE，表明断开连接会引起pUnkSink的引用计数减小。如果为FALSE，则表明应用计数不会减小。
pdwCookie | 由AfxConnectionAdvise返回的连接标识符

说明：
调用这个函数以断开pUnkSrc指明的源端和pUnkSink指明的接收端之间的连接。

请参阅：AfxConnectionAdvise


 AfxDaoInit

void AfxDaoInit();
throw(CDaoException);

说明：
这个函数初始化DAO数据库引擎。在大多数情况下，你没有必要调用AfxDaoInit，因为应用程序会在有必要时自动调用。
相关信息和AfxDaoInit的调用示例请参见Visual C++的联机文档中“技术注释54”一文。

请参阅：AfxDaoTerm


 AfxDaoTerm

void AfxDaoTerm()

说明：
这个函数终止DAO数据库引擎。通常你只需在常规的DLL中调用这个函数。应用程序会在必要时自动调用AfxDaoTerm。
在常规DLL中，应该在所有的MFC DAO对象都被销毁以后，而在ExitInstance函数以前调用AfxDaoTerm。
有关调用AfxDaoTerm的更多信息请参阅《Visual C++程序员指南》中的“DAO：在DLL中使用DAO”一文。相关信息参见“Visual C++联机文档”中的“技术注释54”。

请参阅：AfxDaoInit


 AfxDbInitModule

void AFXAPI AfxDbInitModule();

#include <afxdll.h>
为了在MFC的自动连接的常规DLL中支持MFC数据库（或者DAO），应该在你的常规DLL的CWinApp::InitInstance函数中增加对这个函数的调用以初始化MFC的数据库DLL。确保这个调用出现在使用MFC数据库DLL的任何基类或附加代码之前。MFC数据库DLL是一种扩展DLL，为了使一个扩展DLL进入一个CDynLinkLibrary链，必须在每个可能使用它的模块的环境中创建一个CDynLinkLibrary对象。AfxDbInitModule在你的常规DLL的环境中创建一个CDynLinkLibrary对象，使它能够进入常规DLL的CDynLinkLibrary链。


 AfxDoForAllClasses

void AFXAPI AfxDoForAllClasses(
void (* pfn)(const CRuntimeClass* pClass, void* pContext),
void* pContext
);

参数：
pfn | 指向每个类都会调用的重复函数。这个参数是一个指向CRuntimeClass对象的指针以及指向调用者提供给函数的附加数据的void指针。
pContext | 指向调用者提供给重复函数的可选数据的指针。这个指针可以是NULL。

说明：
在应用程序的内存空间中，为所有从CObject继承的可串行化的类调用指定的重复函数。从CObject继承的可串行化的类是以DECLARE_SERIAL宏继承的。每次调用指定的重复函数时，都会将在pContext中传递给AfxDoForAllClasses的指针传递给重复函数。
注意：这个函数仅在MFC的调试版本中起作用。

请参阅：DECLARE_SERIAL


 AfxDoForAllObjects

void AfxDoForAllObjects(
void (* pfn)(CObject* pObject, void* pContext),
void* pContext
);

参数：
pfn | 指向每个对象都执行的重复函数。函数的参数是一个指向CObject的指针以及指向调用者提供给函数的附加数据的void指针。
pContext | 指向调用者提供给函数的附加数据的指针。这个指针可以为NULL。

说明：
对每个用new分配的从CObject继承的对象执行指定的重复函数。栈、全局变量或嵌入对象不包括在内。每次调用指定的重复函数时，都会将在pContext中传递给AfxDoForAllObjects的指针传递给重复函数。
注意：这个函数仅在MFC的调试版本中起作用。


 afxDump

CDumpContext afxDump;

说明：
使用这个变量为你的应用程序提供基本的对象转储能力。afxDump是预定义的CDumpContext对象，它使你能够将CDumpContext信息发送到调试器输出窗口或者调试终端。通常把afxDump作为CObject::Dump的一个参数。
在Windows NT和Windows 95（以及Windows的早期版本）中，当你调试应用程序时，afxDump输出被发送到Visual C++的调试输出窗口。
这个变量仅在MFC的调试版本中定义。有关afxDump的更多信息请参见《VisualC++程序员指南》中的“MFC调试支持”。Visual C++连接文档中的“技术注释7”和“技术注释12”中包含了其它一些信息。
注意：这个函数仅在MFC的调试版本中起作用。

示例：
// afxDump的示例
CPerson myPerson = new CPerson;
// 设置CPerson对象的一些域
//...
// 现在转储内容
#ifdef _DEBUG
afxDump << "Dumping myPerson:\n";
myPerson->Dump(afxDump);
afxDump <<"\n";
#endif

请参阅：CObject::Dump, AfxDump


 AfxDump

void AfxDump(const CObject* pOb);

参数：
pOb 指向由CObject继承的类的对象的指针。

说明：
在调试器中调用这个函数以在调试时转储对象的状态。AfxDump调用一个对象的Dump函数并且将信息发送到afxDump变量指定的位置。AfxDump仅能在MFC的调试版本中使用。
你的程序代码不应该调用AfxDump，而是应该调用适当对象的Dump成员函数。

请参阅：CObject::Dump, afxDump


 AfxDumpStack

void AFXAPI AfxDumpStack(DWORD dwTarget = AFX_STACK_DUMP_TARGET_DEFAULT);

参数：
dwTarget指出转储输出的目标。其取值可以用位或操作符（|）组合起来，可能值如下：
· | AFX_STACK_DUMP_TARGET_TRACE | 通过TRACE宏输出。TRACE仅仅在调试版本中产生输出，在发行版本中不产生输出。同时，TRACE可以被重定向到调试器以外的目标。
· | AFX_STACK_DUMP_TARGET_DEFAULT | 将转储输出发送到缺省目标。对于调试版本，输出发送给TRACE宏。在发行版本中，输出发送到剪贴板。
· | AFX_STACK_DUMP_TARGET_CLIPBOARD | 输出仅发送到剪贴板。数据将按CF_TEXT格式以普通文本的形式放在剪贴板上。
· | AFX_STACK_DUMP_TARGET_BOTH | 同时将输出发送到剪贴板和TRACE宏。
· | AFX_STACK_DUMP_TARGET_ODS | 通过Win32函数OutputDebugString()直接将输出发送的调试器。如果连接了调试器，它在调试版本和发行版本中都会产生调试器输出。AFX_STACK_DUMP_TARGET_ODS 通常到达调试器（如果连接了调试器），并且不能被重定向。

说明：
这个全局函数可以被用来生成当前栈的一个映象。下面的例子反映了MFC对话框应用程序中按钮处理函数调用AfxDumpStack所产生的单行调试输出：
=== begin AfxDumpStack output ===
...
BFF928E0: WINDOWS\SYSTEM\KERNERL32.DLL! UTUnRegister + 2492 bytes
=== end AfxDumpStack() output ===
下面的表格描述了上面的输出行：

输出 | 描述
BFF928E0： | 最近一次函数调用的返回地址
WINDOWS\SYSTEM\KERNEL32.DLL! | 包含函数调用的模块的完整路径名
UTUnRegister | 调用的函数原型
+ 2492 bytes | 以字节为单位的从函数原型地址（这个例子中为UTUnregister）到返回地址（这个例子中为BEF928E0）的偏移
AfxDumpStack在MFC库的调试版本和非调试版本中都可以使用。但是，这个函数通常是静态连接的，即使你的可执行文件以共享DLL的方式使用MFC。
在共享库的实现中，可以在MFCS42.LIB库（以及它的变化形式）中找到这个函数。
为了成功地使用这个函数：
· | 在你的路径中必须包含IMAGEHLP.DLL文件。如果你没有这个DLL文件，这个函数会显示一条错误信息。IMAGEHLP.DLL是随Win32 SDK和Windows一起发售的可散发的DLL。在C:\[Windows]\system[32]下查找它。有关IMAGEHLP提供的函数集的介绍可以参考“可移植的可执行文件的操作”一文。
· | 具有栈框架的模块必须包含调试信息。如果它不包含调试信息，这个函数仍然会生成对栈的跟踪，但是这种跟踪是很简略的。

请参阅：afxDump


 AfxEnableControlContainer

void AfxEnableControlContainer();

说明：
在你应用程序对象的InitInstance函数中调用这个函数，以便能够提供对OLE控件容器的支持。
有关OLE控件（现在被叫做ActiveX控件）的更多信息请参阅《Visual C++程序员指南》中的“ActiveX控件主题”。


 AfxEnableMemoryTracking

BOOL AfxEnableMemoryTracking(BOOL bTrack);

返回值：以前的跟踪允许状态设置。

参数：
bTrack 将这个值设为TRUE时就打开了内存跟踪特性。如果是FALSE则将其关闭。

说明：
诊断内存跟踪通常在MFC的调试版本中有效。利用这个函数对你的代码中正确分配内存的部分禁止跟踪。
有关AfxEnableMemoryTracking的更多信息请参见《Visual C++程序员指南》中的“MFC调试支持”。
注意：这个函数仅在MFC的调试版本中起作用。


 AfxEndThread

void AfxEndThread(UINT nExitCode);

参数：
nExitCode 指定线程的退出代码。

说明：
调用这个函数以结束当前运行的线程。必须在要终止的线程内部调用。
有关AfxEndThread的更多信息请参见《Visual C++程序员指南》中的“多线程：终止线程”。

请参阅：AfxBeginThread


 AfxFormatString1

void AxFormatString1(CString& rString, UINT nIDS, LPCTSTR lpsz1);

参数：
rString | 对CString对象的引用，在替换之后它将包含结果字符串。
nIDS | 模板字符串的资源ID，替换将在模板字符串上发生。
lpsz1 | 将替换模板字符串中格式字符“%1”的字符串。

说明：
调入指定的字符串资源并将字符“%1”替换为lpsz1指向的字符串。新形式的字符串保存在rString中。例如，如果字符串表中的字符串是“File %1 not fount”，而lpszl代表“C:\MYFILE.TXT”，则rString包含的字符串为“File C:\MYFILE.TXT no found”。这个函数在格式化要向消息框或其它窗口发送的字符串时是非常有用的。
如果字符串中格式字符“%1”出现了不止一次，那么会进行多次替换。

请参阅：AfxFormatString2


 AfxFormatString2

void AxFormatString2(CString& rString, UINT nIDS, LPCTSTR lpsz1, LPCTSTR lpsz2);

参数：
rString | 对CString对象的引用，在替换之后它将包含结果字符串。
nIDS | 模板字符串的资源ID，替换将在模板字符串上发生。
lpsz1 | 将替换模板字符串中格式字符“%1”的字符串。
lpsz2 | 将替换模板字符串中格式字符“%2”的字符串。

说明：
调入指定的字符串资源并将字符“%1”和“%2”替换为lpsz1和lpsz2指向的字符串。新形式的字符串保存在rString中。例如，如果字符串表中的字符串是“File %1 not fount in %2”，而lpsz1指向“C:\MYFILE.TXT”，lpsz2指向“C:\MYDIR”，则rString包含的字符串为“File C:\MYFILE.TXT no found inC:\MYDIR”。
如果字符串中格式字符“%1”和“%2”出现了不止一次，那么会进行多次替换。它们不必按照数字顺序排列。

请参阅：AfxFormatString1


 AfxFreeLibrary

BOOL AFXAPI AfxFreeLibrary(HINSTANCE hInstLib);

返回值：
如果函数执行成功则为TRUE，否则为FALSE。

参数：
hInstLib 已调入的库模块的句柄。AfxLoadLibrary返回这个句柄。

说明：
AfxFreeLibrary和AfxLoadLibrary都为每一个调入的库模块维护着引用计数。AfxFreeLibrary减小调入的动态链接库（DLL）模块的引用计数。当引用计数减小到0时，这个模块将从调用进程的地址空间中除去，其句柄也不再有效。每次调用AfxLoadLibrary就会增加这个引用计数。
在卸载一个库模块之前，系统使DLL能够从使用它的进程分离出来。这样就给DLL一个机会以清除当前进程分配的资源。当入口点函数返回之后，库模块就从当前进程的地址空间中移去了。
使用AfxLoadLibrary来映射一个DLL模块。
如果你的程序使用了多线程，确保你使用的是AfxFreeLibrary和AfxLoadLibrary（而不是Win32函数FreeLibrary和LoadLibrary）。当调入或卸载扩展DLL时，使用AfxLoadLibrary和AfxFreeLibrary来启动和关闭执行代码可以保证MFC的全局状态不被破坏。

请参阅：AfxLoadLibrary


 AfxGetApp

CWinApp* AfxGetApp();

返回值：指向应用程序的单一CWinApp对象的指针。

说明：
这个函数返回的指针可以被用来访问应用程序的信息，如主消息调度代码以及顶层窗口等。


 AfxGetAppName

LPCTSTR AfxGetAppName();

返回值：包含应用程序名字的以null字符结尾的字符串。

说明：
这个函数返回的字符串可以被用于诊断消息，或是用作一个临时字符串名的根。


 AfxGetHENV

HENV AFXAPI AfxGetHENV();

返回值：
当前MFC使用的ODBC环境的句柄。如果现在没有任何CDatabase对象或者CRecordset对象正被使用，则返回SQL_HENV_NULL。

说明：
你可以在直接调用ODBC时使用返回的句柄，但是你不能关闭句柄，也不能假定在现存的从CDatabase或CRecordset继承的对象被销毁后句柄依然有效。


 AfxGetInstanceHandle

HINSTANCE AfxGetInstanceHandle( );

返回值：
代表应用程序的当前实例的HINSTANCE值。如果是从与MFC的USRDLL版本连接的DLL内调用的，则返回代表DLL的HINSTANCE值。

说明：
这个函数使你能够获得当前应用程序的实例句柄。AfxGetInstanceHandle总是返回代表你的可执行文件（.EXE）的HINSTANCE值，除非它从与MFC的USRDLL版本连接的DLL内调用的。在这种情况下，它返回的是DLL的HINSTANCE值。

请参阅：AfxGetResourceHandle, AfxSetResourceHandle


 AfxGetInternetHandleType

DWORD AFXAPI AfxGetInternetHandleType( HINTERNET hQuery );

返回值：
在WININET.H中定义的任何Internet服务类型。这些Internet服务的列表参见说明部分。如果这个句柄是NULL或者不能被识别，则函数返回AFX_INET_SERVICE_UNK。

参数：
hQuery 执行一个查询的句柄。

说明：
使用这个全局函数来决定一个Internet句柄的类型。
下面的列表包含了AfxGetInternetHandleType 可能返回的Internet类型。
· | INTERNET_HANDLE_TYPE_INTERNET
· | INTERNET_HANDLE_TYPE_CONNECT_FTP
· | INTERNET_HANDLE_TYPE_CONNECT_GOPHER
· | INTERNET_HANDLE_TYPE_CONNECT_HTTP
· | INTERNET_HANDLE_TYPE_FTP_FIND
· | INTERNET_HANDLE_TYPE_FTP_FIND_HTML
· | INTERNET_HANDLE_TYPE_FTP_FILE
· | INTERNET_HANDLE_TYPE_FTP_FILE_HTML
· | INTERNET_HANDLE_TYPE_GOPHER_FIND
· | INTERNET_HANDLE_TYPE_GOPHER_FIND_HTML
· | INTERNET_HANDLE_TYPE_GOPHER_FILE
· | INTERNET_HANDLE_TYPE_GOPHER_FILE_HTML
· | INTERNET_HANDLE_TYPE_HTTP_REQUEST

注意：
为了调用这个函数，你的项目必须包含AFXINET.H。

请参阅：AfxParseURL


 AfxGetMainWnd

CWnd* AfxGetMainWnd( );

返回值：
如果服务器具有一个可以在容器内现场激活的对象，并且这个容器是活动的，则这个函数返回一个指向包含这个现场活动文档的框架窗口对象的指针。
如果没有可以在容器内现场激活的对象，或者你的应用程序不是一个OLE服务器，这个函数仅返回你的应用程序对象的m_pMainWnd。
如果AfxGetMainWnd被应用程序主线程调用，它根据以上规则返回应用程序的主窗口。如果该函数被应用程序的次线程调用，该函数返回与引起该调用线程连接的主窗口。

说明：
如果你的应用程序是一个OLE服务器，应该调用这个函数以获得应用程序的活动主窗口指针，而不是直接引用应用程序对象的m_pMainWnd成员。
如果你的应用程序不是OLE服务器，那么调用这个函数与直接引用应用程序对象的m_pMainWnd成员是等价的。

请参阅：CWinThread::m_pMainWnd


 AfxGetResourceHandle

HINSTANCE AfxGetResourceHandle( );

返回值：应用程序调入缺省资源的实例的HINSTANCE句柄。

说明：
利用这个函数返回的HINSTANCE句柄来直接访问应用程序的句柄，例如，在调用Windows函数FindResource时使用。

请参阅：AfxGetInstanceHandle, AfxSetResourceHandle


 AfxGetStaticModuleState

AFX_MODULE_STATE* AFXAPI AfxGetStaticModuleState( );

返回值：指向一个AFX_MODULE_STATE 结构的指针。

说明：
调用这个函数以在初始化之前设置模块状态，或者在清除后恢复原来的模块状态。AFX_MODULE_STATE 结构中包含了该模块的全局数据，这是被push或pop的模块状态的一部分。
在缺省情况下，MFC利用主应用程序的资源句柄来调入资源模板。如果你在一个DLL中具有一个输出函数，例如有个函数在DLL中启动一个对话框，这个模板将被保存于DLL模块中。你可能需要改变模块的状态以便使用正确的句柄。你可以在函数的开头加入下面的代码以实现上述功能：
AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
这会交换当前模块的状态和AfxGetStaticModuleState返回的状态，直到当前作用域结束。
有关模块状态和MFC的更多信息请参见《Visual C++程序员指南》的“创建新的文档、窗口和视窗”中的“管理MFC模块的状态数据”，以及Visual C++联机文档中的“技术注释58”。

请参阅：AFX_MANAGE_STATE


 AfxGetThread

CWinThread* AfxGetThread( );

返回值：指向当前执行的线程的指针。

说明：
调用这个函数以获得代表当前执行的线程的CWinThread对象指针。必须在要求的线程内部调用。

请参阅：AfxBeginThread


 AfxInitExtensionModule

BOOL AFXAPI AfxInitExtensionModule( AFX_EXTENSION_MODULE& state, HMODULE hModule );

返回值：
如果成功地初始化了扩展DLL，则返回TRUE；否则返回FALSE。

参数：
state | 对初始化后包含了扩展DLL模块状态的AFX_EXTENSION_MODULE结构的引用。这个状态中包含了扩展DLL在进入DllMain之前作为一般静态对象构造过程的一部分而初始化的运行类对象的拷贝。
hModule | 扩展DLL模块的句柄。

说明：
在扩展DLL的DllMain中调用此函数以初始化DLL。例如：
static AFX_EXTENSION_MODULE extensionDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
if(dwReason == DLL_PROCESS_ATTACH)
{
// 扩展DLL 一次性初始化
if(!AfxInitExtensionModule(extensionDLL, hInstance)) return 0;
...
}
}
AfxInitExtensionModule生成DLL的HMODULE的一个拷贝，并捕捉DLL的运行类（CRuntimeClass结构）和它的对象工厂（COleObjectFactory对象）以供创建CDynLinkLibrary时使用。
MFC的扩展DLL必须在它们的DllMain函数中做两件事情：
· | 调用AfxInitExtensionModule 并检验返回值。
· | 如果DLL要引出CRuntimeClass对象或者具有它自己的资源，则创建一个CDynLinkLibrary对象。
当每个进程与扩展DLL分离时（这发生在进程退出，或者因为调用了AfxFreeLibrary，DLL被卸载时），你可以调用AfxTermExtensionModule来清除扩展DLL。

请参阅：AfxTermExtensionModule


 AfxInitRichEdit

BOOL AFXAPI AfxInitRichEdit( );

说明：
调用这个函数来为应用程序初始化带格式编辑控件。如果该进程还没有初始化公共控件库，则它还初始化公共控件库。如果你在MFC应用程序内直接使用带格式编辑控件，你必须调用这个函数以确保MFC正确地初始化了带格式编辑控件。如果你通过CRichEditCtrl，CRichEditView或CRichEditDoc使用带格式控件，那么你不需要调用这个函数。


 AfxIsMemoryBlock

BOOL AfxIsMemoryBlock( const void* p, UINT nBytes, LONG* plRequestNumber = NULL );

返回值：
如果内存块是现在分配的，并且其长度也是正确的，则返回非零值。否则为0。

参数：
p | 指向将被测试的内存块。
nBytes | 包含了以字节为单位的内存块长度。
plRequestNumber | 指向一个长整数，它将被设为内存块的分配系列号码。由plRequestNumber指向的这个变量只有当AfxIsMemoryBlock返回非零值时才会被填充。

说明：
检测一个内存地址，确保它代表了一个由new的诊断版本分配的活动的内存块。它同时也检验指定的大小是否与最初分配的大小相符。如果这个函数返回非零值，分配的系列号码将在plRequestNumber中返回。这个号码代表了这个内存块相对于其它所有内存分配的顺序。

示例：
// AfxIsMemoryBlock的例子
CAge* pcage = new CAge( 21 ); // CAge is derived from CObject.
ASSERT( AfxIsMemoryBlock( pcage, sizeof( CAge ) ) )

请参阅：AfxIsValidAddress


 AfxIsValidAddress

BOOL AfxIsValidAddress( const void* lp, UINT nBytes, BOOL bReadWrite = TRUE );

返回值：
如果指定的内存块完全包括在程序的内存空间内，则返回非零值；否则返回0。

参数：
lp | 指向将要被检测的内存地址。
nBytes | 包含了要被测试的内存的字节数。
bReadWrite | 指明这块内存是可以读写（TRUE）还是只读（FALSE）。

说明：
测试任意的内存地址，确保它们完全处于程序的内存空间内。该地址并不仅限于用new分配的内存块。

请参阅：
AfxIsMemoryBlock, AfxIsValidString


 AfxIsValidString

BOOL AfxIsValidString( LPCSTR lpsz, int nLength = -1 );

返回值：
如果给定的指针指向一个给定大小的字符串则返回非零值，否则返回0。

参数：
lpsz | 要测试的指针。
nLength | 指定要测试的字符串的长度，以字节为单位。如果值为－1，表示字符串是以null结尾的。

说明：
使用这个函数来确定指向字符串的指针是否有效。

请参阅：
AfxIsMemoryBlock, AfxIsValidAddress


 AfxLoadLibrary

HINSTANCE AFXAPI AfxLoadLibrary( LPCTSTR lpszModuleName );

返回值：
如果函数成功执行，返回值为模块的句柄。如果函数执行失败，返回值为NULL。

参数：
lpszModuleName指向一个以null结尾的字符串，其中包含了模块的名字（DLL或EXE文件）。指定的名字为模块的文件名。
如果该字符串指定了一个路径但是在指定的目录中不存在该文件，这个函数执行失败。
如果没有指定路径并且省略了文件的扩展名，将会附加缺省的扩展名.DLL。但是，文件名字符串可以在尾部包含一个点字符（.），用以指示模块名没有扩展名。如果没有指定路径，这个函数将按如下顺序搜索文件：
· | 应用程序的启动路径。
· | 当前目录。
· | Windows 95：Windows系统目录。Windows NT： 32位Windows系统目录。目录的名字为SYSTEM32.
· | 仅适用于Windows NT：16位Windows系统目录。没有Win32函数可以获得这个目录的路径，但是将会搜索这个目录。这个目录的名字是SYSTEM。
· | Windows 目录。
· | 在PATH环境变量中列出的路径。

说明：
使用AfxLoadLibrary来载入一个DLL模块。它返回一个句柄，可被用于GetProcAddress以获得DLL函数的地址。AfxLoadLibrary还可以用来载入其它可执行模块。
每个进程都为载入的库模块维护这一个引用计数。这个引用计数在调用AfxLoadLibrary时增加，而在调用AfxFreeLibrary时减小。当引用计数减小到零时，该模块就被从调用进程的地址空间中移去，句柄也不再有效。
如果你使用多线程，确保你使用AfxLoadLibrary和AfxFreeLibrary（而不是Win32函数LoadLibrary和FreeLibrary）。当调入或卸载扩展DLL时使用AfxLoadLibrary和AfxFreeLibrary来启动和关闭执行代码可以保证MFC的全局状态不被破坏。

请参阅：AfxFreeLibrary


 afxMemDF

int afxMemDF;

说明：
这个变量在调试器或你的程序中都可以访问，它允许你调整分配诊断。它可以具有枚举变量afxMemDF指定的下列值：
· | allocMemDF | 打开调试分配函数（调试库中的缺省设置）。
· | delayFreeMemDF | 延迟释放内存。当你的应用程序释放一个内存块的时候，分配函数并不将此内存返还给操作系统。这将带给你的程序最大的内存压力。
· | checkAlwaysMemDF | 每次分配或释放内存时调用AfxCheckMemory。这会显著地减慢分配和收集内存的过程。

示例：
// afxMemDF的例子
afxMemDF = allocMemDF | checkAlwaysMemDF;


 AfxMessageBox

int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp =0 );
int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT) -1 );

返回值：
如果没有足够的内存来显示消息框就返回零，否则可能是下列值之一：
· | IDABORT | 选择了Abort按钮。
· | IDCANCEL | 选择了Cancel按钮。
· | IDIGNORE | 选择了Ignore按钮。
· | IDNO | 选择了No按钮。
· | IDOK | 选择了OK按钮。
· | IDRETRY | 选择了Retry按钮。
· | IDYES | 选择了Yes按钮。
如果消息框具有Cancel按钮，那么当按下了ESC键或者是选择了Cancel按钮时，就会返回IDCANCEL值。如果消息框没有Cancel按钮，按下ESC键没有任何效果。
在格式化消息框中显示的字符串时，函数AfxFormatString1和AfxFormatString2非常有用。

参数：
lpszText | 指向一个CString对象或者以null结尾的字符串，包含了要在消息框中显示的信息。
nType | 消息框的风格。对对话框应用任何一种消息框风格。
nIDHelp | 消息的帮助上下文ID。0表示将使用应用程序的缺省帮助上下文。
nIDPrompt | 用于引用字符串表中的字符串的唯一的ID。

说明：
在屏幕上显示一个消息框，这个重载函数的第一种形式在消息框中显示由lpszText指向的文本字符串，并使用nIDHelp来描述帮助上下文。当用户按下了帮助键（通常是F1）时，帮助上下文被用来跳转到相关的帮助主题。
函数的第二种形式使用nIDPrompt所代表的字符串资源来在消息框中显示一个消息。相关的帮助页面通过nIDHelp的值来查找。如果使用了nIDHelp的缺省值（－1），则帮助上下文将使用字符串资源ID，即nIDPrompt。有关定义帮助上下文的更多信息参见《Visual C++程序员指南》中的“帮助主题”一文以及Visual C++联机文档中的“技术注释28”。

请参阅：CWnd::MessageBox


 AfxNetInitModule

void AFXAPI AfxNetInitModule( );

#include <afxdll.h>

说明：
为了在与MFC动态连接的常规DLL中增加MFC的Sockets支持，可以在你的常规DLL的CWinApp::InitInstance函数中加入对这个函数的调用以初始化MFC的SocketsDLL。MFC的Sockets DLL是一种扩展DLL，为了使扩展DLL加入一个CDynLinkLibrary链，必须在每个使用它的模块的环境中创建一个CDynLinkLibrary对象。AfxNetInitModule在你的常规DLL的环境中创建了一个CDynLinkLibrary对象，这样它就可以进入常规DLL的CDynLinkLibrary对象链了。


 AfxOleCanExitApp

BOOL AFXAPI AfxOleCanExitApp( );

#include <afxdisp.h>

返回值：
如果应用程序可以退出，则返回非零值；否则为0。

说明：
指明一个应用程序是否可以退出。如果还存在着对应用程序对象的引用，它就不能退出。全局函数AfxOleLockApp以及AfxOleUnlockApp分别增加和减小对应用程序对象的应用计数。在这个计数不为零时，应用程序就不能退出。如果这个计数为非零值，那么当用户选择了系统菜单中的Close或者File菜单中的Exit时，应用程序的主窗口就被隐藏（不会被销毁）。应用框架会在CFrameWnd::OnClose中调用这个函数。

请参阅：
AfxOleLockApp, AfxOleUnlockApp


 AfxOleGetMessageFilter

COleMessageFilter* AFXAPI AfxOleGetMessageFilter( );

#include <afxwin.h>

返回值：指向当前消息过滤器的指针。

说明：
获得应用程序当前的消息过滤器。调用这个函数可以访问当前从COleMessageFilter继承的对象，正如你调用AfxGetApp可以访问当前的应用程序对象一样。

示例：
COleMessageFilter* pFilter = AfxOleGetMessageFilter();
ASSERT_VALID(pFilter);
pFilter->BeginBusyState();
// 完成一些需要busy状态的操作
pFilter->EndBusyState();

请参阅：COleMessageFilter, AfxGetApp


 AfxOleGetUserCtrl

BOOL AFXAPI AfxOleGetUserCtrl( );

#include <afxdisp.h>

返回值：
如果用户正控制应用程序，则返回非零值；否则为0。

说明：
获得当前的用户控制标志。当用户打开或创建了一个新文档时，就意味着该用户控制着应用程序。如果应用程序不是由OLE系统DLL启动的，换句话说，如果用户通过系统外壳启动了应用程序，也认为是用户控制了应用程序。

请参阅：AfxOleSetUserCtrl


 AfxOleInit

BOOL AFXAPI AfxOleInit( );

#include <afxdisp.h>

返回值：
如果函数执行成功则返回非零值。如果初始化失败则为0，可能是因为安装了版本不正确的OLE系统DLL。

说明：初始化OLE系统DLL。


 AfxOleInitModule

void AFXAPI AfxOleInitModule( );

#include <afxdll.h>

说明：
为了在与MFC动态连接的常规DLL中增加MFC的OLE支持，可以在你的常规DLL的CWinApp::InitInstance函数中加入对这个函数的调用以初始化MFC的OLE DLL。MFC的OLE DLL是一种扩展DLL，为了使扩展DLL加入一个CDynLinkLibrary链，必须在每个使用它的模块的环境中创建一个CDynLinkLibrary对象。AfxNetInitModule在你的常规DLL的环境中创建了一个CDynLinkLibrary对象，这样它就可以进入常规DLL的CDynLinkLibrary对象链了。
如果你正在创建一个OLE控件并使用了COleControlModule，你就不用调用AfxOleInitModule，因为COleControlModule的成员函数InitInstance以及调用了AfxOleInitModule。


 AfxOleLockApp

void AFXAPI AfxOleLockApp( );

#include <afxdisp.h>

说明：
增加框架对应用程序的活动对象的全局计数。
框架保存对应用程序的活动对象的计数。AfxOleLockApp和AfxOleUnlockApp分别增加和减小这个计数值。
当用户试图关闭仍然具有活动对象的应用程序——这样的应用程序的活动对象计数为非零值——时，框架将会把应用程序从用户的视野中隐藏起来，而不是完全地关闭它。AfxOleCanExitApp函数指明了应用程序是否可以退出。
如果一个引出OLE接口的对象不希望在被客户应用程序使用时被销毁，就为它调用AfxOleLockApp函数。同时，对于在构造函数中调用了AfxOleLockApp的对象，应当在其析构函数内调用AfxOleUnlockApp函数。在缺省情况下，COleDocument（及其派生类）自动地锁定或者解锁应用程序。

请参阅：
AfxOleUnlockApp, AfxOleCanExitApp, COleDocument


 AfxOleLockControl

BOOL AFXAPI AfxOleLockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleLockControl( LPCTSTR lpszProgID );

#include <afxwin.h>

返回值：
如果控件的类被成功地锁定，则返回非零值；否则返回0。

参数：
clsid | 控件的唯一的类ID。
lpszProgID | 控件的唯一程序ID。

说明：
锁定了指定控件的类工厂以后，与该控件有关的动态生成的数据就保留在内存中。这样能够显著地加速控件的显示过程。例如，一旦你在对话框中创建了一个控件并且用AfxOleLockControl锁定了它，每次对话框显示或销毁的时候，你就不需要再创建或销毁这个控件了。如果用户重复地打开和关闭对话框，你的控件将会显著地提高性能。当你准备销毁控件时，调用AfxOleUnlockControl函数。

请参阅：AfxOleUnlockControl


 AfxOleRegisterControlClass

BOOL AFXAPI AfxOleRegisterControlClass(
HINSTANCE hInstance,
REFCLSID clsid,
LPCTSTR pszProgID,
UINT idTypeName,
UINT idBitmap,
int nRegFlags,
DWORD dwMiscStatus,
REFGUID tlid,
WORD wVerMajor,
WORD wVerMinor
);

#include <afxctl.h>

返回值：如果注册了控件类，则返回非零值；否则返回0。

参数：
hInstance | 与控件类相关的模块的实例句柄。
clsid | 控件的唯一的类ID。
pszProgID | 控件的唯一的程序ID。
idTypeName | 字符串的资源ID，该字符串中包含了用户可读的控件的类型名。
idBitmap | 位图的资源ID，该位图用于在工具条或调色板中表示OLE控件。
nRegFlags包含了下列标志的一个或多个：
· | afxRegInsertable | 允许控件在OLE对象的插入对象对话框中出现。
· | afxRegApartmentThreading | 将注册表中的线程模式设置为ThreadingModel=Apartment.
注意：在MFC4.2以前的MFC版本中，整型的nRegFlags参数是BOOL类型的。由bInsetable来决定是否可以通过插入对象对话框来加入控件。
dwMiscStatus包含了下列状态标志中的一个或多个（对这些标志的详细描述请参见《OLE程序员参考》中列举的OLEMISC）。
· | OLEMISC_RECOMPOSEONRESIZE
· | OLEMISC_ONLYICONIC
· | OLEMISC_INSERTNOTREPLACE
· | OLEMISC_STATIC
· | OLEMISC_CANTLINKINSIDE
· | OLEMISC_CANLINKBYOLE1
· | OLEMISC_ISLINKOBJECT
· | OLEMISC_INSIDEOUT
· | OLEMISC_ACTIVATEWHENVISIBLE
· | OLEMISC_RENDERINGISDEVICEINDEPENDENT
· | OLEMISC_INVISIBLEATRUNTIME
· | OLEMISC_ALWAYSRUN
· | OLEMISC_ACTSLIKEBUTTON
· | OLEMISC_ACTSLIKELABEL
· | OLEMISC_NOUIACTIVATE
· | OLEMISC_ALIGNABLE
· | OLEMISC_IMEMODE
· | OLEMISC_SIMPLEFRAME
· | OLEMISC_SETCLIENTSITEFIRST
tlid | 控件类的唯一的ID。
wVerMajor | 控件类的主版本号码。
wVerMinor | 控件类的次版本号码。

说明：
通过Windows的注册数据库来注册控件类。这就使得控件可以被具有OLE控件能力的容器所使用。AfxOleRegisterControlClass用控件的名字及其在系统中的位置来更新系统注册表，同时在注册表中设置控件支持的线程模式。有关的更多信息请参见《Visual C++联机文档》中的“技术注释64”，名为“OLE控件中的Apartment模式”，以及《Win32 SDK》中的“进程与线程”。

示例：
// COleObjectFactory::UpdateRegistry 类成员函数的实现
//
BOOL CMyApartmentAwareCtrl::CApartmentCtrlFactory::UpdateRegistry(BOOL bRegister)
{
// 目的：检验你的控件是否遵循Apartment模式线程规则。
// 更多的信息参考MFC 技术注释64。
// 如果你的控件不遵循Apartment模式规则，那么你必须修改下面的代码
// 将第六个参数从 afxRegInsertable | afxRegApartmentThreading
// 变为 afxRegInsertable.
if(bRegister)
return AfxOleRegisterControlClass()
AfxGetInstanceHandle(),
m_clsid,
m_lpszProgID,
IDS_APARTMENT,
IDB_APARTMENT,
afxRegInsertable | afxRegApartmentThreading,
_dwApartmentOleMisc,
_tlid,
_wVerMajor,
_wVerMinor);
else
return AfxOleUnregisterClass(m_clsid, m_lpszProgID);
上面的例子演示了如何将代表可插入的标志和代表Apartment模式的标志通过或运算组合成第六个参数来调用AfxOleregisterControlClass函数。
afxRegInsertable | afxRegApartmentThreading,
对于允许的容器，该控件将出现在插入对象对话框中，同时它将会适用Apartment模式。适用于Apartment模式的控件必须确保静态的类数据通过锁定得到保护，因此当Apartment中的控件访问静态数据时，在它结束之前不会被调度程序禁止，相同类的其它对象也不会开始使用相同的静态数据。对静态数据的任何访问都必须间接地通过临界区代码进行。

请参阅：
AfxOleRegisterPropertyPageClass, AfxOleRegisterTypeLib, AfxOleUnregisterClass, AfxOleUnregisterTypeLib


 AfxOleRegisterPropertyPageClass

BOOL AFXAPI AfxOleRegisterPropertyPageClass(
HINSTANCE hInstance,
REFCLSID clsid,
UINT idTypeName,
int nRegFlags
);

#include <afxctl.h>

返回值：
如果注册了控件类，则返回非零值，否则返回0。

参数：
hInstance | 与属性页类相关的模块的实例句柄。
clsid | 属性页的唯一的类ID。
idTypeName | 字符串的资源ID，该字符串包含了用户可读的属性页的名字。
nRegFlags可能包含标志：
·afxRegApartmentThreading 将注册表中的线程模式设置为ThreadingModel=Apartment.

注意：
在MFC4.2以前的MFC版本中，没有整型的nRegFlags参数。同时afxRegInsertable标志对于属性页也是无效的，如果设置了该标志，可能会在MFC中引起ASSERT。

说明：
通过Windows的注册数据库来注册控件类。这就使得属性页可以被具有OLE控件能力的容器所使用。AfxOleRegisterPropertyPageClass用属性页的名字及其在系统中的位置来更新系统注册表，同时在注册表中设置控件支持的线程模式。有关的更多信息请参见Visual C++联机文档中的“技术注释64”，名为“OLE控件中的Apartment模式”，以及《Win32 SDK》中的“进程与线程”。

请参阅：
AfxOleRegisterControlClass, AfxOleRegisterTypeLib


 AfxOleRegisterServerClass

BOOL AFXAPI AfxOleRegisterServerClass(
REFCLSID clsid,
LPCTSTR lpszClassName,
LPCTSTR lpszShortTypeName,
LPCTSTR lpszLongTypeName,
OLE_APPTYPE nAppType = OAT_SERVER,
LPCTSTR* rglpszRegister = NULL,
LPCTSTR* rglpszOverwrite = NULL
);

#include <afxdisp.h>

返回值：
如果成功注册了服务器类，则返回非零值；否则返回0。

参数：
clsid | 对服务器的OLE类ID 的引用。
lpszClassName | 指向包含服务器对象的类名的字符串的指针。
lpszShortTypeName | 指向包含服务器对象类型的短名字的字符串的指针，如：“Chart”。
lpszLongTypeName | 指向包含服务器对象类型的长名字的字符串的指针，如：“Microsoft Excel 5.0 Chart”。
nAppType取值于OLE_APPTYPE列表中的一个值，指定了OLE应用程序的类型，可能的取值如下：
· | OAT_INPLACE_SERVER | 服务器具有完整的服务器接口。
· | OAT_SERVER | 服务器只支持嵌入。
· | OAT_CONTAINER | 容器支持与嵌入的连接。
· | OAT_DISPATCH_OBJECT | 具有IDispatch能力的对象。
rglpszRegister | 字符串指针数组，代表OLE系统注册表的键和值，当这些键现在没有值时将被加入OLE系统注册表。
rglpszOverwrite | 字符串指针数组，代表OLE系统注册表的键和值，当这些键现在已经有值时将被加入OLE系统注册表。

说明：
这个函数使你能够在OLE系统注册表中注册你自己的服务器。多数应用程序可以使用COleTemplateServer::Register 来注册应用程序的文档类型。如果你的应用程序的系统注册表格式不符合通常的形式，你可以使用AfxOleRegisterServerClass来获得更多的控制。
注册表中包含了一系列的键和值。rglpszRegister 和 rglpszOverwrite参数都是字符串指针的数组，每一个字符串都包含了一个键和值，用NULL字符（'\n'）隔开。每一个字符串都有可以替换的参数，它们的位置用字符“%1”到“%5”来标记。
符号按照下列方式填充：
符号 | 取值
%1 | 类ID，作为字符串格式化
%2 | 类名
%3 | 可执行文件的路径
%4 | 短类型名
%5 | 长类型名

请参阅：COleTemplateServer::UpdateRegistry


 AfxOleRegisterTypeLib

BOOL AfxOleRegisterTypeLib(
HINSTANCE hInstance,
REFGUID tlid,
LPCTSTR pszFileNam = NULL,
LPCTSTR pszHelpDir = NULL
);

返回值：
如果注册了类型库，则返回非零值；否则返回0。

参数：
hInstance | 与类型库相关的应用程序的实例句柄。
tlid | 类型库的唯一的ID。
pszFileName | 指向控件的本地化类型库文件（.TLB）的可选文件名。
pszHelpDir | 类型库的帮助文件所在目录的名字。如果为NULL，就假定帮助文件位于与类型库本身相同的目录。

说明：
在Windows系统注册表中注册类型库，允许其它具有OLE控件能力的容器使用类型库。这个函数用类型库的名字及其在系统中的位置来更新注册表。

请参阅：
AfxOleUnregisterTypeLib, AfxOleRegisterControlClass, AfxOleUnregisterClass


 AfxOleSetEditMenu

void AFXAPI AfxOleSetEditMenu(
COleClientItem* pClient,
CMenu* pMenu,
UINT iMenuItem,
UINT nIDVerbMin,
UINT nIDVerbMax = 0,
UINT nIDConvert = 0
);

#include <afxole.h>

参数：
pClient | 指向客户OLE项的指针。
pMenu | 指向要更新的菜单对象的指针。
iMenuItem | 要更新的菜单项的索引。
nIDVerbMin | 响应起始动词的命令ID。
nIDVerbMax | 响应最后的动词的命令ID。
nIDConvert | Convert菜单项的ID。

说明：
该函数实现了typename Object命令的用户接口。如果服务器只能识别起始的动词，菜单项就变为“verb typename Object”，当用户选择了命令时，将会发送nIDVerbMin命令。如果服务器能够识别几个命令，菜单项就变为“typenameObject”，当用户选择命令时，有一个子菜单列出了所有可能的动词。当用户从子菜单中选择了一个动词以后，如果用户选择的是第一个动词，则发送nIDVerbMin，如果选择了第二个动词，则发送nIDVerbMin+1，依次类推。缺省的COleDocument的实现中自动处理了这个特性。
你必须在客户应用程序的资源描述（.RC）文件中包含下面的语句：
#include <afxolecl.rc>

请参阅：COleDocument


 AfxOleSetUserCtrl

void AFXAPI AfxOleSetUserCtrl( BOOL bUserCtrl );

#include <afxdisp.h>

参数：
bUserCtrl 指定用户控制标志是要被设置还是被清除。

说明：
该函数设置或清除用户控制标志，在AfxOleGetUserCtrl的参考中对之有解释。
当用户创建或载入一个文档时，框架会调用这个函数，但是不包括文档被间接的动作，比如在容器应用程序中载入一个嵌入对象，打开或创建的情况。
如果你的应用程序中有其它动作需要使用户控制应用程序时，调用这个函数。

请参阅：AfxOleGetUserCtrl


 AfxOleTypeMatchGuid

BOOL AfxOleTypeMatchGuid(
LPTYPEINFO pTypeInfo,
TYPEDESC FAR* pTypeDesc,
REFGUID guidType,
ULONG cIndirectionLevels
);

返回值：
如果成功地匹配，则返回非零值；否则返回0。

参数：
pTypeInfo | 指向类型信息对象的指针，可以从该对象获得pTypeDesc。
pTypeDesc | 指向一个TYPEDESC结构的指针。
guidType | 类型的唯一的ID。
cIndirectionLevels | 间接层次数。

说明：
调用这个函数以确定一个类型描述符（从类型信息中获得）是否描述了guidType指示的类型。

示例：
检验typedesc是否代表一个IFontDisp指针：
AfxOleTypeMatchGuid( ptypeinfo, &typedesc, IID_IFontDisp, 1);
这里IID_IFontDisp表明类型类型，间接层次数为1（因为这个例子是检验一个简单的指针的）。


 AfxOleUnlockApp

void AFXAPI AfxOleUnlockApp( );

#include <afxdisp.h>

说明：
减小框架对应用程序的活动对象的计数。更进一步的信息参见AfxOleLockApp。
当活动对象计数达到0时，就会调用AfxOleOnReleaseAllObjects。

请参阅：
AfxOleLockApp, CCmdTarget::OnFinalRelease


 AfxOleUnlockControl

BOOL AFXAPI AfxOleUnlockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleUnlockControl( LPCTSTR lpszProgID );

#include <afxwin.h>

返回值：
如果成功地解锁了控件的类工厂，则返回非零值，否则返回0。

参数：
clsid | 控件的唯一的类ID。
lpszProgID | 控件的唯一的程序ID。

说明：
该函数解锁指定控件的类工厂。控件用AfxOleLockControl锁定后，与之相关的动态生成的数据就会保留在内存中。这样可以显著地提高控件的显示速度，因为控件不必在每次显示的时候创建和销毁。当你准备销毁控件的时候，应该调用AfxOleUnlockControl。

请参阅：AfxOleLockControl


 AfxOleUnregisterClass

BOOL AFXAPI AfxOleUnregisterClass( REFCLSID clsID, LPCSTR pszProgID );

返回值：
如果成功地注销了控件类或属性页类，则返回非零值。否则返回0。

参数：
clsID | 控件或属性页的唯一的类ID。
pszProgID | 控件或属性页的唯一的程序ID。

说明：
该函数从Windows的注册数据库中移去控件类或属性页类的入口。

请参阅：
AfxOleRegisterPropertyPageClass, AfxOleRegisterControlClass, AfxOleRegisterTypeLib


 AfxOleUnregisterTypeLib

BOOL AFXAPI AfxOleUnregisterTypeLib( REFGUID tlID );

返回值：
如果成功地注销了类型库，则返回非零值。否则返回0。

参数：
tlID 类型库的唯一的ID。

说明：
调用这个函数以从Windows的注册数据库移去类型库的入口。

请参阅：
AfxOleUnregisterClass, AfxOleRegisterTypeLib


 AfxParseURL

BOOL AFXAPI AfxParseURL(
LPCTSTR pstrURL,
DWORD& dwServiceType,
CString& strServer,
CString& strObject,
INTERNET_PORT& nPort
);

返回值：
如果成功地解析了URL，则返回非零值。如果URL为空或它不包含已知的Internet服务类型，则为0。

参数：
pstrURL | 指向包含了要解析的URL的字符串的指针。
dwServiceType指明了Internet服务的类型。可能的取值如下：
· | AFX_INET_SERVICE_FTP
· | AFX_INET_SERVICE_HTTP
· | AFX_INET_SERVICE_HTTPS
· | AFX_INET_SERVICE_GOPHER
· | AFX_INET_SERVICE_FILE
· | AFX_INET_SERVICE_MAILTO
· | AFX_INET_SERVICE_NEWS
· | AFX_INET_SERVICE_NNTP
· | AFX_INET_SERVICE_TELNET
· | AFX_INET_SERVICE_WAIS
· | AFX_INET_SERVICE_MID
· | AFX_INET_SERVICE_CID
· | AFX_INET_SERVICE_PROSPERO
· | AFX_INET_SERVICE_AFS
· | AFX_INET_SERVICE_UNK
strServerURL | 中服务类型后的第一个部分。
strObjectURL | 涉及的对象（可能为空）。
nPort | 如果存在，则从URL的服务器或对象部分搜索出来。

说明：
这个全局函数被用于CInternetSession::OpenURL。它解析一个URL字符串，返回服务的类型以及其它的内容。
例如，AfxParseURL解析一个如下形式的URL：
service://server/dir/dir/object.ext:port，返回的内容如下：
strServer == "server"
strObject == "/dir/dir/object/object.ext"
nPort == #port
dwServiceType == #service

注意：为了调用这个函数，你必须在项目中包含AFXINET.H。

请参阅：AfxGetInternetHandleType


 AfxParseURLEx

BOOL AFXAPI AfxParseURLEx(
LPCTSTR pstrURL,
DWORD& dwServiceType,
CString& strServer,
CString& strObject,
INTERNET_PORT& nPort,
CString& strUsername,
CString& strPassword,
DWORD dwFlags = 0
);

返回值：
如果成功地解析了URL，则返回非零值。如果URL为空或它不包含已知的Internet服务类型，则为0。

参数：
pstrURL | 指向包含了要解析的URL的字符串的指针。
dwServiceType指明了Internet服务的类型。可能的取值如下：
· | AFX_INET_SERVICE_FTP
· | AFX_INET_SERVICE_HTTP
· | AFX_INET_SERVICE_HTTPS
· | AFX_INET_SERVICE_GOPHER
· | AFX_INET_SERVICE_FILE
· | AFX_INET_SERVICE_MAILTO
· | AFX_INET_SERVICE_NEWS
· | AFX_INET_SERVICE_NNTP
· | AFX_INET_SERVICE_TELNET
· | AFX_INET_SERVICE_WAIS
· | AFX_INET_SERVICE_MID
· | AFX_INET_SERVICE_CID
· | AFX_INET_SERVICE_PROSPERO
· | AFX_INET_SERVICE_AFS
· | AFX_INET_SERVICE_UNK
strServerURL | 中服务类型后的第一个部分。
strObjectURL | 涉及的对象（可能为空）。
nPort | 如果存在，则从URL的服务器或对象部分搜索出来。
strUserName | 对包含用户名字的CString对象的引用。
strPassword | 对包含了用户密码的CString对象的引用。
dwFlags控制URL的解析方式的标志。可能是下列值的组合：
取值 | 含义
ICU_DECODE | 把%XX转义序列转换为字符
ICU_NO_ENCODE | 不把不安全的字符转换为转义序列
ICU_NO_META | 不把URL中的meta序列（如“\.”和“\..”）移去
ICU_ENCODE_SPACES_ONLY | 仅解码空间ICU_BROWSER_MODE不对‘#’和‘?’后面的字符进行编码或解码，并且也不把'?'后面的空白字符移去。如果没有指定这个值，将会对整个URL进行编码，后面的空白字符也会被移去
如果你使用MFC的缺省条件，则没有设置标志，这个函数将把所有不安全的字符和meta序列（如\.，\..和\...）转换为转义序列。

说明：
这个全局函数是AfxParseURL的扩展版本，被用于CInternetSession::OpenURL。它解析一个URL字符串，返回服务的类型以及其它的内容，同时提供用户的名字和密码。标志指明了如何处理不安全的字符。
注意：为了调用这个函数，你必须在项目中包含AFXINET.H。

请参阅：AfxGetInternetHandleType


 AfxRegisterClass

BOOL AFXAPI AfxRegisterClass( WNDCLASS* lpWndClass );

返回值：
如果成功地注册了这个类，则返回TRUE，否则返回FALSE。

参数：
lpWndClass 指向一个WNDCLASS结构，它包含了要注册的窗口类的信息。关于这个结构的更多的信息，参看Win32 SDK文档。

说明：
利用这个函数在使用MFC的DLL中注册一个窗口类。如果你使用了这个函数，则当DLL卸载时，这个类会自动注销。
在非DLL项目中，AfxRegisterClass标识符被定义为一个宏，映像到Windows函数RegisterClass，因为应用程序中注册的类是自动注销的。如果你用AfxRegisterClass来代替RegisterClass，那么你的代码不管是用于应用程序还是用于DLL都不用于改变。


 AfxRegisterWndClass

LPCTSTR AFXAPI AfxRegisterWndClass(
UINT nClassStyle,
HCURSOR hCursor = 0,
HBRUSH hbrBackground = 0,
HICON hIcon = 0
);

返回值：
一个以null结尾的字符串，其中包含了类名。你可以将这个类名传递给CWnd或其派生类的成员函数Create以创建一个窗口。这个名字是由微软基础类库生成的。
注意：
返回值是指向一个静态缓冲区的指针。如果要保存这个字符串，将它赋给一个CString变量。

参数：
nClassStyle指定Windows的类风格或通过位或（|）操作符生成的风格的组合，用于窗口类类风格的列表参见Win32 SDK文档中的WNDCLASS结构。如果这个值为NULL，缺省的风格如下：
· | 将鼠标风格设为CS_DBLCLICKS，当用户双击鼠标时，将向窗口过程发送双击消息。
· | 将鼠标光标风格设为Windows 的标准风格IDC_ARROW。
· | 将背景刷子设为NULL，因此窗口将不会擦去它的背景。
· | 将图标设为标准的波浪标志的Windows徽标。
hCursor | 指定了一个鼠标光标资源句柄，将被用于该窗口类所创建的每个窗口。如果你使用缺省值0，你将得到标准的IDC_ARROW光标。
hbrBackground | 指定了一个刷子资源句柄，将被用于该窗口类所创建的每个窗口。如果你使用缺省值0，你将获得一个Null背景刷子，同时在WM_ERASEBKGND进程中，窗口将不会释放其背景。
hIcon | 指定了一个图标资源句柄，将被用于该窗口类所创建的每个窗口。如果你使用缺省值0，你将得到标准的波浪标志的Windows徽标。

说明：
微软基础类库自动注册了一些标准的窗口类。如果你希望注册自己的窗口类，可以调用这个函数。
AfxRegisterWndClass为类注册的名字仅与参数有关。如果你用相同的参数多次调用了AfxRegisterWndClass，它仅在第一次调用时才注册类。随后用相同的参数进行调用仅简单地返回以及注册的类名。
如果你用相同的参数为多个CWnd的派生类调用了AfxRegisterWndClass，而不是为每个类生成一个独立的窗口类，那么所有的类共用相同的窗口类。如果使用了CS_CLASSDC风格，这就会引起问题。你将获得一个CS_CLASSDC窗口类，而不是多个CS_CLASSDC窗口类，并且使用这个类的所有的C++窗口都共用相同的DC。为了避免这个问题，可以调用AfxRegisterClass来注册类。

请参阅：
CWnd::Create, CWnd::PreCreateWindow, WNDCLASS, AfxRegisterClass


 AfxSetAllocHook

AFX_ALLOC_HOOK AfxSetAllocHook( AFX_ALLOC_HOOK pfnAllocHook );

返回值：
如果你希望允许分配，则返回非零值。否则返回0。

参数：
pfnAllocHook 指定要调用的函数名。参考关于分配函数的原型的说明。

说明：
这个函数设置一个钩子，使每次分配内存之前都会调用一个指定的函数。微软基础类库中的调试内存分配函数能够调用一个用户定义的钩子函数，使用户能够监控内存分配并控制是否允许分配内存。内存分配的钩子函数的原型如下：
BOOL AFXAPI AllocHook( size_t nSize, BOOL bObject, LONG lRequestNumber );

nSize | 计划分配的内存大小。
bObject | 如果是要为一个CObject派生类对象分配内存则为TRUE，否则为FALSE。
lRequestNumber | 内存分配的系列号。 注意，AFXAPI调用约定意味着调用者必须从栈中清除参数。


 AfxSetResourceHandle

void AfxSetResourceHandle( HINSTANCE hInstResource );

参数：
hInstResource 应用程序调入资源的.EXE或.DLL文件的实例或模块句柄。

说明：
使用这个函数来设置HINSTANCE句柄，决定应用程序的缺省资源从哪儿载入。

请参阅：
AfxGetInstanceHandle, AfxGetResourceHandle


 AfxSocketInit

BOOL AfxSocketInit( WSADATA* lpwsaData = NULL );

返回值：
如果函数成功执行，则返回非零值，否则为0。

参数：
lpwsaData 指向WSADATA结构的指针。如果lpwsaData不等于NULL，那么调用::WSAStartup将填充WSADATA结构。这个函数同时也保证在应用程序之前调用::WSACleanup。

说明：
在你重载的CWinApp::InitInstance函数中调用这个函数以初始化WindowsSockets。

请参阅：CWinApp::InitInstance


 AfxTermExtensionModule

void AFXAPI AfxTermExtensionModule(
AFX_EXTENSION_MODULE& state,
BOOL bAll = FALSE
);

参数：
state | 对一个AFX_EXTENSION_MODULE结构的引用，其中包含了扩展DLL模块的状态。
bAll | 如果为TRUE，清除所有的扩展DLL模块。否则，只清除当前的DLL模块。

说明：
调用这个函数，使每个进程与DLL分离（这在进程退出时发生，或者是由于调用了AfxFreeLibrary，DLL被卸载）的时候MFC可以清除扩展DLL。
AfxTermExtensionModule将删除所有与模块相连的局部内容并从消息映射中除去所有的入口。例如：
static AFX_EXTENSION_MODULE extensionDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
if(dwReason == DLL_PROCESS_ATTACH)
{
// 扩展 DLL 的一次性初始化
if(!AfxInitExtensionModule( extensionDLL, hInstance)) return 0;
// 任务：执行其它的初始化工作
}
else if(dwReason == DLL_PROCESS_DETACH)
{
// 扩展DLL的每个进程结束
AfxTermExtensionModule(extensionDLL);
// 任务：执行其它的清除工作。
}
return 1; // 完成
}
如果你的应用程序动态地载入、释放扩展DLL，确保调用了AfxTermExtensionModule。因为大多数扩展DLL不是动态载入（通常，它们与其引入库相连接）的，通常没有必要调用AfxTermExtensionModule。
MFC的扩展DLL需要在它们的DllMain中调用AfxInitExtensionModule。如果DLL将输出CRuntimeClass对象或者具有它自己的资源，你也需要在DllMain中创建CDynLinkLibrary对象。

请参阅：AfxInitExtensionModule


 AfxThrowArchiveException

void AfxThrowArchiveException( int cause, LPCTSTR lpszArchiveName );

参数：
cause | 指定一个整数，代表了异常的原因。其可能取值的列表参见CArchiveException::m_cause。
lpszArchiveName | 指向一个字符串，其中包含了引起异常的CArchive对象的名字。

说明：抛出一个档案异常。

请参阅：CArchiveException, THROW


 AfxThrowDaoException

void AFXAPI AfxThrowDaoException(
int nAfxDaoError = NO_AFX_DAO_ERROR,
SCODE scode = S_OK
);

参数：
nAfxDaoError | 一个整数值，代表DAO的扩展错误码，其值可能是CDaoException::m_nAfxDaoError中列出的值之一。
scode | DAO产生的一个SCODE类型的OLE错误码。相关信息参见CDaoException::m_scode。

说明：
调用这个函数从你的代码中抛出一个CDaoException类型的异常。框架还调用了AfxThrowDaoException。在你的调用中，你可以传递一个参数，也可以都传递。例如，如果你希望引出CDaoException::nAfxDaoError中定义的一个错误但是并不关心scode参数，可以传递一个有效的nAfxDaoError参数，同时接受缺省的scode值。
有关与MFC的DAO类相关的异常的更多信息可以参见本书中的CDaoException类以及《Visual C++程序员指南》中的“异常：数据库异常”。

请参阅：CException


 AfxThrowDBException

void AfxThrowDBException( RETCODE nRetCode, CDatabase* pdb, HSTMT hstmt );

参数：
nRetCode | 一个RETCODE类型的值，定义了引起被抛出异常的错误的类型。
pdb | 指向CDatabase对象的指针，代表与异常相关的数据源连接。
hstmt | 一个ODBC的HSTMT句柄，代表与异常相关的语句句柄。

说明：
调用这个函数，从你自己的代码中抛出一个CDBException类型的异常。如果框架收到了一个ODBC API函数的RETCODE，并且将其解释为异常而不是可预见的错误，它就调用AfxThrowDBException。例如，数据访问操作可能因为读磁盘错误而失败。
有关ODBC定义的RETCODE的信息参见《ODBC SDK程序员参考》中的第八章：“获得状态和错误信息”。关于MFC对这些代码的扩展参见CDBException类。

请参阅：CDBException::m_nRetCode


 AfxThrowFileException

void AfxThrowFileException(
int cause,
LONG lOsError = -1,
LPCTSTR lpszFileName = NULL
);

参数：
cause | 指定了一个整数，它指明了异常的原因。其可能取值的列表参见CFileException::m_cause。
lOsError | 包含了操作系统的错误号码（如果有的话），它描述了异常的原因。错误码的列表参见你的操作系统手册。
lpszFileName | 指向一个字符串，包含了引起异常的文件的名字。

说明：
这个函数抛出一个文件异常。你必须根据操作系统的错误码确定异常的原因。

请参阅：
CFileException::ThrowOsError, THROW


 AfxThrowInternetException

void AFXAPI AfxThrowInternetException( DWORD dwContext, DWORD dwError = 0 );

参数：
dwContext | 引起错误的操作的环境标识符。dwContext的缺省值由CInternetSession指定，并被传递给CInternetConnection和CInternetFile的派生类。对于针对连接或文件的特定操作，你通常会用自己的值覆盖缺省的dwContext值。这个值将被返回到CInternetSession::OnStatusCallback以标识特定的操作状态。有关环境标识符的更多的信息请参见《Visual C++程序员指南》中的文章：“Internet第一步：WinInet”。
dwError | 引起异常的错误。

说明：
这个函数抛出一个Internet异常。你必须根据操作系统的错误码来确定异常的原因。
注意：为了调用这个函数，你必须在项目中包含AFXINET.H。

请参阅：CInternetException, THROW


 AfxThrowMemoryException

void AfxThrowMemoryException( );

说明：
这个函数抛出一个内存异常。如果调用系统的内存分配函数（例如malloc以及Windows 函数GlobalAlloc）失败了，就调用这个函数。你不需要为 new 调用这个函数，因为如果内存分配失败，new 会自动抛出一个内存异常。

请参阅：CMemoryException, THROW


 AfxThrowNotSupportedException

void AfxThrowNotSupportedException( );

说明：抛出的异常是请求不支持的特性的结果。

请参阅：
CNotSupportedException, THROW


 AfxThrowOleDispatchException

void AFXAPI AfxThrowOleDispatchException(
WORD wCode,
LPCSTR lpszDescription,
UINT nHelpID = 0
);
void AFXAPI AfxThrowOleDispatchException(
WORD wCode,
UINT nDescriptionID,
UINT nHelpID = -1
);

#include <afxdisp.h>

参数：
wCode | 你的应用程序特有的错误码。
lpszDescription | 错误的语言描述。
nDescriptionID | 错误的语言描述的资源ID。
nHelpID | 你的应用程序的帮助文件（.HLP）的帮助环境。

说明：
使用这个函数在一个OLE自动化函数内部抛出一个异常。为这个函数提供的信息可以被控制应用程序（Microsoft Visual Basic或其它OLE自动化的客户程序）所显示。

请参阅：COleException


 AfxThrowOleException

void AFXAPI AfxThrowOleException( SCODE sc );
void AFXAPI AfxThrowOleException( HRESULT hr );

#include <afxdisp.h>

参数：
sc | 指明异常原因的OLE状态代码。
hr | 指明异常原因的结果代码的句柄。

说明：
这个函数生成一个COleException类型的对象并抛出一个异常。接收HRESULT类型的参数的版本将结果代码转换为对应的SCODE。有关HRESULT和SCODE的更多的信息参见《Platform SDK》中的“COM错误代码的结构”。

请参阅：COleException, THROW


 AfxThrowResourceException

void AfxThrowResourceException( );

说明：
这个函数抛出一个资源异常。通常在不能载入Windows资源的时候调用这个函数。

请参阅：CResourceException, THROW


 AfxThrowUserException

void AfxThrowUserException( );

说明：
这个函数抛出一个异常，结束一个终止用户操作。通常在AfxMessageBox向用户报告了一个错误之后会立即调用这个函数。

请参阅：
CUserException, THROW, AfxMessageBox


 afxTraceEnabled

BOOL afxTraceEnabled;

说明：
这是一个全局变量，用于打开或关闭TRACE宏的输出。
在缺省情况下，TRACE宏的输出是被关闭的。如果你希望你的程序中的TRACE宏产生输出，则应将afxTraceEnabled设置为非零值。
通常，afxTraceEnabled是在你的AFX.INI设置的。与此同时，你可以通过TRACER.EXE工具设置afxTraceEnabled的值。更多的信息请参考“技术注释7”。

请参阅：afxTraceFlags, TRACE


 afxTraceFlags

int afxTraceFlags;

说明：
用于打开微软基础类库的内建报告特性。
这个变量可以通过程序来设置也可以在调试器中设置。afxTraceFlags的每一位选择了一个跟踪报告选项。你可以利用TRACER.EXE打开或关闭这些位中的任意一个。没有必要手动设置这些位。
下面是这些位模板以及相应的跟踪报告特性的列表：
·0x01 | 多应用程序调试。这将会在每个TRACE输出之前加上应用程序的名字作为前缀，它既会影响你的应用程序的TRACE输出，也会影响下面描述的附加的报告特性。
·0x02 | 主消息泵。报告在主CWinApp消息处理机制中接收到的每个消息。列出了窗口句柄，消息的名字或号码，wParam以及lParam。 报告发生在对Windows函数GetMessage的调用之后，但是在任何对消息的翻译或分发之前。 动态数据交换消息将显示一些额外的数据，可以被OLE中的一些调试方式所使用。 这个标志仅显示接收到的消息，而不包括那些发出的消息。
·0x04 | 与上面的0x02选项类似的主消息调度，但是适用于在CWnd::WindowProc中分发的消息，并且对接收到的和发送出去的消息都作处理。
·0x08 | WM_COMMAND消息调度。一个特殊的情况，用于扩展WM_COMMAND/OnCommand处理，报告命令路径机制的进度。 同时报告哪个类接收了命令（如果有匹配的消息映射入口），以及什么时候类不接收命令（如果没有匹配的消息映射入口）。在跟踪多文档界面（MDI）应用程序的命令消息流的时候，这个报告特别有用。
·0x10 | OLE跟踪。报告重要的OLE通知或请求。 为OLE服务器或客户打开这个选项以跟踪OLE DLL和OLE应用程序之间的通讯。
·0x20 | 数据库跟踪。报告ODBC类和DAO类的警告，对于DAO类还有一些附加信息。如果你希望跟踪MFC的ODBC类和DAO类，则打开这个选项。对于ODBC，你只能得到警告，例如在DFX调用中发生的类型不匹配。对于DAO，你可以得到所有异常的信息，包括发生异常的DAO或MFC的DAO类中的线路和函数。
相关的更多的信息参见《Visual C++文档》中的“技术注释7”。

请参阅：afxTraceEnabled, TRACE


 AfxVerifyLicFile

BOOL AFXAPI AfxVerifyLicFile(
HINSTANCE hInstance,
LPCTSTR pszLicFileName,
LPOLESTR pszLicFileContents,
UINT cch = -1
);

返回值：
如果存在许可文件并且是以pszLicFileContents中的字符序列开始的，则返回非零值；否则返回0。

参数：
hInstance | 与许可控制相关的DLL的实例句柄。
pszLicFileName | 指向一个以null结尾的字符串，包含了许可文件的名字。
pszLicFileContents | 指向一个字节序列，它必须与许可文件开头的序列匹配。
cch | pszLicFileContents中的字符数目。

说明：
调用这个函数以检验由pszLicFileName指定文件名的许可文件是否对OLE控件有效。如果cch为－1，这个函数将使用：
_tcslen(pszLicFileContents)

请参阅：COleObjectFactory::VerifyUserLicense


 AfxWinInit

BOOL AFXAPI AfxWinInit(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow
);

参数：
hInstance | 当前运行模块的句柄。
hPrevInstance | 应用程序前一个实例的句柄。对于基于Win32的应用程序，这个参数总是NULL。
lpCmdLine | 指向一个以null结尾的字符串，指定了应用程序的命令行。
nCmdShow | 指定了GUI应用程序的主窗口将如何显示。

说明：
这个函数是由MFC提供的WinMain函数调用的，它是基于GUI的应用程序的CWinApp初始化的一部分，主要用来初始化MFC。对于控制台应用程序，不使用MFC提供的WinMain函数，你必须直接调用AfxWinInit来初始化MFC。
如果你自己调用AfxWinInit，你必须声明一个CWinApp类的实例。对于控制台应用程序，你可以选择不从CWinApp基础你自己的类，而是直接使用CWinApp的实例。如果你决定在你的main函数的实现中将所有的工作留给你的应用程序，这样做是可以的。
例子程序TEAR演示了如何用MFC生成一个控制台应用程序。

示例：
// this file must be compiled with the /GX and /MT options:
// cl /GX /MT thisfile.cpp

#include <afx.h>
#include <afxdb.h>
#include <iostream.h>

int main()
{
// try to initialize MFC

if(!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
cerr << "MFC failed to initialize!" << endl;
return 1;
}

// 试图与并不存在的ODBC数据库连接
// （如果不初始化MFC，这根本不会起作用。）

CDatabase db;
try
{
db.Open("This Databsae Doesn't Exist");

// 我们不会真正到达这里。

cout << "Successful!" << endl;
cout << "Closing ... ";
db.Close();
cout << "Closed!" << endl;
}
catch(CDBException* pEx)
{
// 我们到达了一个异常。输出错误信息。
// （如果不初始化MFC，这根本不会起作用。）

char sz[1024];

cout << "Error: ";
if(pEx->GetErrorMessage(sz, 1024)) cout << sz;
else cout << "No error message was available";
cout << endl;

pEx->Delete();
return 1;
}

return 0;
}

请参阅：
CWinApp, CWinApp: The Application Class, main, WinMain


 AND_CATCH

AND_CATCH( exception_class, exception_object_pointer_name )

参数：
exception_class | 指定了要检测的异常类型。标准的异常类的列表参见CException类。
exception_object_pointer_name | 这个宏将生成的异常对象的指针的名字。你可以使用这个指针名在AND_CATCH块中访问异常对象。这个变量是为你定义的。

说明：
定义了一个代码块，用于捕捉前面的TRY块中抛出的附加的异常类型。使用CATCH宏来捕捉一个异常类型，然后用AND_CATCH宏来捕捉后面的类型。
用END_CATCH宏来结束TRY块。
异常处理代码能够检验异常对象以获得有关异常原因的更多信息。在AND_CATCH块内调用THROW_LAST宏，这样可以将处理权移交给下一个异常框架。AND_CATCH标记了前面的CATCH或AND_CATCH块的结束。
注意：
AND_CATCH块被定义为一个C++作用域（用大括号分界）。如果你在这个作用域内定义了一个变量，记住它们仅能在此作用域内访问。这也适用于exception_object_pointer_name 变量。

请参阅：
TRY, CATCH, END_CATCH, THROW, THROW_LAST, AND_CATCH_ALL, CException


 AND_CATCH_ALL

AND_CATCH_ALL( exception_object_pointer_name )

参数：
exception_object_pointer_name 这个宏将生成的异常对象的指针的名字。你可以使用这个指针名在AND_CATCH_ALL块中访问异常对象。这个变量是为你定义的。

说明：
定义了一个代码块，用于捕捉前面的TRY块中抛出的附加的异常类型。使用CATCH宏来捕捉一个异常类型，然后用AND_CATCH_ALL宏来捕捉所有其它类型。如果你适用了AND_CATCH_ALL，用END_CATCH_ALL宏来结束TRY块。
异常处理代码能够检验异常对象以获得有关异常原因的更多信息。在AND_CATCH_ALL块内调用THROW_LAST宏，这样可以将处理权移交给下一个异常框架。AND_CATCH_ALL标记了前面的CATCH或AND_CATCH_ALL块的结束。
注意：
AND_CATCH_ALL块被定义为一个C++作用域（用大括号分界）。如果你在这个作用域内定义了一个变量，记住它们仅能在此作用域内访问。

请参阅：
TRY, CATCH_ALL, END_CATCH_ALL, THROW, THROW_LAST, AND_CATCH, CException


 ASSERT

ASSERT( booleanExpression )

参数：
booleanExpression 指定了一个表达式（包含指针变量），其计算结果为非零值或0。

说明：
这个宏计算它的参数。如果结果为0，则输出一个调试信息并退出程序。如果结果为非零值，它什么也不做。
诊断信息具有如下形式：
assertion failed in file <name> in line <num>
这里的name是源文件的名字，num是源文件中断言失败位置的行号。
在MFC的发行版本中，ASSERT并不计算表达式的值，因而也不会中断程序。如果不管环境如何，表达式都必须被计算，用VERIFY宏来代替ASSERT。
注意：这个函数仅在MFC的调试版本中有效。

示例：
// ASSERT的例子
CAge* pcage = new CAge( 21 ); // CAge is derived from CObject.
ASSERT( pcage!= NULL )
ASSERT( pcage->IsKindOf( RUNTIME_CLASS( CAge ) ) )
// 仅当pcage不是一个CAge*指针时才结束程序。

请参阅：VERIFY


 ASSERT_KINDOF

ASSERT_KINDOF( classname, pobject )

参数：
classname | CObject派生类的名字。
pobject | 类对象的指针。

说明：
这个宏断言指向的对象属于指定的类，或者属于从指定的类继承的类。pobject参数应该是指向一个对象的指针，可以是const类型的。指向的对象和类必须支持CObject运行时类信息。作为一个例子，要确定pDocument是否是CMyDocument类或者它的任何派生类的对象的指针，你可以这么写：
ASSERT_KINDOF(CMyDocument, pDocument)
使用ASSERT_KINDOF宏的作用与下述代码完全相同：
ASSERT(pobject->IsKindOf(RUNTIME_CLASS(classname)));
这个函数仅对用DECLARE_DYNAMIC或DECLARE_SERIAL宏声明的类起作用。
注意：这个函数仅在MFC的调试版本中才有。

请参阅：ASSERT


 ASSERT_VALID

ASSERT_VALID( pObject )

参数：
pObject 指定了从CObject继承的类的对象，它具有AssertValid成员函数的重载版本。

说明：
这个函数用于检验你对对象内部状态的有效性的假定。ASSERT_VALID调用作为参数传递给它的对象的AssertValid成员函数。
在MFC的发行版本中，ASSERT_VALID什么也不做。在调试版本中，它检验一个指针是否为NULL，并且调用对象自己的AssertValid成员函数。如果这些测试中有些失败了，它就按照与ASSERT相同的方式显示一个警告信息。
注意：这个函数仅在MFC的调试版本中才有。
有关的更多信息以及示例参见《Visual C++程序员指南》中的“MFC 调试支持”。

请参阅：
ASSERT, VERIFY, CObject, CObject::AssertValid


 BASED_CODE

说明：
在Win32下，这个宏展开后实际为空，主要是为向后兼容性提供的。在16位的MFC中，这个宏确保数据将被放在代码段而不是数据段中。其结果是你的数据段不太紧凑了。


 BEGIN_CONNECTION_MAP

BEGIN_CONNECTION_MAP( theClass, theBase )

参数：
theClass | 指定了连接映射所属的控件类的名字。
theBase | 指定了theClass的基类的名字。

说明：
在你的程序中每个从COleControl继承的类都能为你的控件支持的连接点提供一个连接映射。在你的类成员函数的实现文件（.CPP）中，用BEGIN_CONNECTION_MAP宏开始连接映射的定义，然后用CONNECTION_PART宏为每个连接点加入一个入口。最后，用END_CONNECTION_MAP宏结束连接映射。

请参阅：
BEGIN_CONNECTION_PART, DECLARE_CONNECTION_MAP


 BEGIN_CONNECTION_PART

BEGIN_CONNECTION_PART( theClass, localClass )

参数：
theClass | 指定了连接点所属的控件类的名字。
localClass | 指定了实现连接点的本地类的名字。

说明：
利用BEGIN_CONNECTION_PART宏来开始除事件和属性通知连接点之外的其它类型的连接点定义。
在你的类成员函数的声明文件（.H）中，用BEGIN_CONNECTION_PART宏来开始连接点定义，然后加入CONNECTION_IID宏以及你想实现的其它成员函数，最后用END_CONNECTION_PART宏结束连接点映射。

请参阅：
BEGIN_CONNECTION_MAP, END_CONNECTION_PART, DECLARE_CONNECTION_MAP


 BEGIN_DISPATCH_MAP

BEGIN_DISPATCH_MAP( theClass, baseClass )

#include <afxdisp.h>

参数：
theClass | 指定拥有调度映射的类的名字。
baseClass | 指定theClass的基类的名字。

说明：
使用BEGIN_DISPATCH_MAP宏来声明你的调度映射定义。
在你的类的成员函数的实现文件（.CPP）中，用BEGIN_DISPATCH_MAP宏开始调度映射，为每个调度函数和属性加入一个入口，最后用END_DISPATCH_MAP宏结束调度映射。

请参阅：
Dispatch Maps, DECLARE_DISPATCH_MAP, END_DISPATCH_MAP, DISP_FUNCTION, DISP_PROPERTY, DISP_PROPERTY_EX, DISP_DEFVALUE


 BEGIN_EVENT_MAP

BEGIN_EVENT_MAP( theClass, baseClass )

参数：
theClass | 指定事件映射所属的控件类的名字。
baseClass | 指定theClass的基类的名字。

说明：
使用BEGIN_EVENT_MAP宏开始你的事件映射的定义。
在你的类的成员函数的实现文件（.CPP）中，使用BEGIN_EVENT_MAP宏开始事件映射，然后为每个事件加入一个入口，最后用END_EVENT_MAP宏结束事件映射。
关于事件映射和BEGIN_EVENT_MAP宏的更多信息参见《Visual C++文档》中的“ActiveX控件：事件”。

请参阅：
DECLARE_EVENT_MAP, END_EVENT_MAP


 BEGIN_EVENTSINK_MAP

BEGIN_EVENTSINK_MAP( theClass, baseClass )

参数：
theClass | 指定了事件接收映射所属的控件类的名字。
baseClass | 指定了theClass的基类的名字。

说明：
使用BEGIN_EVENTSINK_MAP宏开始你的事件接收映射的定义。
在你的类的成员函数的实现文件（.CPP）中，使用BEGIN_EVENTSINK_MAP宏开始事件映射，然后为每个要识别的事件加入一个入口，最后用END_EVENTSINK_MAP宏结束事件接收映射。
关于事件接收映射和OLE控件容器的更多信息参见《Visual C++程序员指南》中的“ActiveX控件容器”。

请参阅：
DECLARE_EVENTSINK_MAP, END_EVENTSINK_MAP


 BEGIN_MESSAGE_MAP

BEGIN_MESSAGE_MAP( theClass, baseClass )

参数：
theClass | 指定消息映射所属的类的名字。
baseClass | 指定theClass的基类的名字。

说明：
使用BEGIN_MESSAGE_MAP宏开始你的消息映射的定义。
在你的类的成员函数的实现文件（.CPP）中，使用BEGIN_MESSAGE_MAP宏开始消息映射，然后为每个消息处理函数加入一个入口，最后用END_MESSAGE_MAP宏结束消息映射。
关于消息映射和BEGIN_MESSAGE_MAP的更多信息参见《Visual C++教程》中的“加入对话框”。

示例：
// BEGIN_MESSAGE_MAP示例
BEGIN_MESSAGE_MAP( CMyWindow, CFrameWnd )
//{{AFX_MSG_MAP( CMyWindow )
ON_WM_PAINT()
ON_COMMAND( IDM_ABOUT, OnAbout )
//}}AFX_MSG_MAP
END_MESSAGE_MAP( )

请参阅：
DECLARE_MESSAGE_MAP, END_MESSAGE_MAP


 BEGIN_OLEFACTORY

BEGIN_OLEFACTORY( class_name )

参数：
class_name 指定了类工厂所属的控件类的名字。

说明：
在控件类的头文件中，用BEGIN_OLEFACTORY宏开始你的类工厂的定义。在BEGIN_OLEFACTORY后面必须立即开始类工厂许可函数的定义。

请参阅：
END_OLEFACTORY, DECLARE_OLECREATE_EX


 BEGIN_PARSE_MAP

BEGIN_PARSE_MAP( theClass, baseClass )

参数：
theClass | 指定拥有这个解析映射的类的名字。
baseClass | 指定theClass的基类的名字。必须是从CHttpServer继承的类。

说明：
使用BEGIN_PARSE_MAP宏来开始你的解析映射的定义。
当CHttpServer对象接收到一个客户命令时，解析映射就将此命令与其类成员函数和参数关联起来。对于每个CHttpServer对象仅有一个解析映射。
在你的类成员函数的实现文件（.CPP）中，用BEGIN_PARSE_MAP宏开始一个解析映射，然后为你的每一个解析函数和属性加入一个入口，最后用END_PARSE_MAP宏来结束解析映射。
有关解析映射的例子参见 ON_PARSE_COMMAND。

请参阅：
ON_PARSE_COMMAND, ON_PARSE_COMMAND_PARAMS, DEFAULT_PARSE_COMMAND, END_PARSE_MAP, CHttpServer


 BEGIN_PROPPAGEIDS

BEGIN_PROPPAGEIDS( class_name, count )

参数：
class_name | 指定了属性页的控件类的名字。
count | 控件类使用的属性页的数目。

说明：
使用BEGIN_PROPPAGEIDS宏来开始你的控件的属性页ID列表的定义。
在你的类成员函数的实现文件（.CPP）中，用BEGIN_PROPPAGEIDS宏来开始属性页列表，然后为你的每一个属性页加入一个入口，最后用END_PROPPAGEIDS宏来结束属性页列表。
有关属性页的更多信息参见《Visual C++程序员指南》中的文章：“ActiveX控件：属性页”。

请参阅：
END_PROPPAGEIDS, DECLARE_PROPPAGEIDS, PROPPAGEID


 CATCH

CATCH( exception_class, exception_object_pointer_name )

参数：
exception_class | 指定了要检测的异常类型。有关标准异常类的列表参见CException类。
exception_object_pointer_name | 指定了这个宏将创建的异常对象指针的名字。你可以在CATCH块内使用这个指针名来访问异常对象。这个变量是为你定义的。

说明：
使用这个宏来定义一个代码块，它将捕捉前面的TRY块抛出的第一个异常类型。异常处理代码能够检验异常对象以获得有关异常原因的详细信息。调用THROW_LAST宏可以将处理权移交给下一个异常框架。用END_CATCH来结束一个TRY块。
如果exception_class是CException类，那么所有的异常类型都会被捕捉。你可以使用CObject::IsKindOf成员函数来决定抛出什么类型的异常。捕捉几个类型的异常的更好的方式是使用一系列的AND_CATCH语句，每个针对一个不同的异常类型。
异常对象指针是由宏生成的。你不必自己声明它。
注意：
CATCH块被定义为一个C++作用域（用大括号分界）。如果你在这个作用域内声明了变量，记住它只能在作用域内部访问。这也适用于exception_object_pointer_name。关于异常和CATCH宏的更多信息参见《Visual C++程序员指南》中的文章：“异常”。

请参阅：
TRY, AND_CATCH, END_CATCH, THROW, THROW_LAST, CATCH_ALL, CException


 CATCH_ALL

CATCH_ALL( exception_object_pointer_name )

参数：
exception_object_pointer_name 指定了这个宏生成的异常对象指针的名字。你可以在CATCH_ALL块中使用这个指针名来访问异常对象。这个变量是为你定义的。

说明：
使用这个宏来定义一块代码，它捕捉前面的TRY块中抛出的所有的异常类型。异常处理代码能够检验异常对象以获得关于异常原因的详细信息。调用THROW_LAST宏可以将处理权移交给下一个异常框架。如果你使用了CATCH_ALL，用END_CATCH_ALL宏来结束TRY块。
注意：
CATCH_ALL块被定义为一个C++作用域（用大括号分界）。如果你在此作用域内定义了一个变量，记住你只能在这个作用域内部访问它。
有关异常的更多的信息参见《Visual C++程序员指南》中的文章：“异常”。

请参阅：
TRY, AND_CATCH_ALL, END_CATCH_ALL, THROW, THROW_LAST, CATCH, CException


 CompareElements

template < class TYPE, class ARG_TYPE >
BOOL AFXAPI CompareElements( const TYPE* pElement1, const ARG_TYPE* pElement2 );

返回值：
如果pElement1所指向的对象与pElement2所指向的对象相等，则返回非零值。否则返回0。

参数：
TYPE | 要比较的第一个元素的类型。
pElement1 | 指向要比较的第一个元素的指针。
ARG_TYPE | 要比较的第二个元素的类型。
pElement2 | 指向要比较的第二个元素的指针。

说明：
这个函数由CList::Find直接调用，CMap::Lookup和CMap::operator[]会间接调用它。CMap的调用使用了CMap的模板参数KEY和ARG_KEY。
缺省的实现返回对*pElement1和*pElement2进行比较的结果。你可以重载这个函数以便它以一种适用于你的应用程序的方式进行比较。
C++语言为简单类型（char，int，float等等）定义了比较操作符（==），但是没有为类和结构定义比较操作符。如果你想使用CompareElements或演示一个使用它的集合类，你就要定义一个比较操作符或者重载CompareElements以返回正确的类型。

请参阅：CList, CMap


 CONNECTION_IID

CONNECTION_IID( iid )

参数：
iid 连接点调用的接口的ID。

说明：
在BEGIN_CONNECTION_PART和END_CONNECTION_PART之间使用CONNECTION_IID宏来为你的OLE控件支持的连接点定义接口ID。
iid参数是用于识别连接点对其连接的接收方调用的接口的ID。例如：
CONNECTION_IID(IID_ISinkInterface)
指定了调用ISinkInterface接口的连接点。

请参阅：
BEGIN_CONNECTION_PART, DECLARE_CONNECTION_MAP, END_CONNECTION_PART


 CONNECTION_PART

CONNECTION_PART( theClass, iid, localClass )

参数：
theClass | 指定了连接点所属的控件类的名字。
iid | 连接点调用的接口的ID。
localClass | 指定了实现连接点的本地类的名字。

说明：
使用CONNECTION_PART宏来把你的OLE控件的连接映射到一个指定的接口ID。
例如：
BEGIN_CONNECTION_MAP(CSampleCtrl, COleControl)
CONNECTION_PART(CSampleCtrl, IID_ISinkInterface, MyConnPt)
END_CONNECTION_MAP()
实现了一个连接映射，其中有一个连接点，它调用了IID_ISinkInterface接口。

请参阅：
BEGIN_CONNECTION_PART, DECLARE_CONNECTION_MAP, BEGIN_CONNECTION_MAP, CONNECTION_IID


 ConstructElements

template< class TYPE >
void AFXAPI ConstructElements( TYPE* pElements, int nCount );

参数：
TYPE | 指定了要构造的元素的类型的模板参数。
pElements | 指向元素的指针。
nCount | 要构造的元素的数目。

说明：
这个函数在构造新的数组、列表或映射时被调用。缺省的版本将新元素的所有位初始化为0。
关于这个函数以及其它帮助函数的信息参见《Visual C++程序员指南》中的文章“集合：如何生成类型安全的集合”。

请参阅：CArray, CList, CMap


 CopyElements

template< class TYPE >
void AFXAPI CopyElements( TYPE* pDest, const TYPE* pSrc, int nCount );

参数：
TYPE | 指定了要复制的元素类型的模板参数。
pDest | 指向复制元素的目的的指针。
pSrc | 指向要复制的元素源的指针。
nCount | 要复制的元素的数目。

说明：
这个函数由CArray::Append和CArray::Copy直接调用。缺省实现使用单一指定的操作符（=）来执行复制操作。如果被复制的类型没有过载操作符=，那么缺省的实现按位进行复制。
关于这个函数以及其它帮助函数的实现参见《Visual C++程序员指南》中的文章“如何生成类型安全的集合”。

请参阅：CArray


 DDP_CBIndex

void AFXAPI DDP_CBIndex(
CDataExchange* pDX,
int id,
int& member,
LPCTSTR pszPropName
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括它的方向。
id | 与pszPropName指定的控件属性相关的组合框控件的资源ID。
member | 与id指定的属性页控件和pszPropName指定的属性相关的成员变量。
pszPropName | 将要与id指定的组合框控件交换数据的控件属性的名字。

说明：
在你的属性页的DoDataExchange函数中调用这个函数以使整数属性的值与属性页中组合框的当前选择的索引同步。这个函数必须在相应的DDX_CBIndex函数之前调用。

请参阅：
DDP_CBString, DDP_Text, COleControl::DoPropExchange, DDX_CBIndex


 DDP_CBString

void AFXAPI DDP_CBString(
CDataExchange* pDX,
int id,
CString& member,
LPCTSTR pszPropName
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括它的方向。
id | 与pszPropName指定的控件属性相关的组合框控件的资源ID。
member | 与id指定的属性页控件和pszPropName指定的属性相关的成员变量。
pszPropName | 将要与id指定的组合框控件交换数据的控件属性的名字。

说明：
在你的属性页的DoDataExchange函数中调用这个函数以使字符串属性的值与属性页中组合框的当前选择同步。这个函数必须在相应的DDX_CBCString函数之前调用。

请参阅：
DDP_CBStringExact, DDP_CBIndex, COleControl::DoPropExchange, DDX_CBString


 DDP_CBStringExact

void AFXAPI DDP_CBStringExact(
CDataExchange* pDX,
int id,
CString& member,
LPCTSTR pszPropName
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括它的方向。
id | 与pszPropName指定的控件属性相关的组合框控件的资源ID。
member | 与id指定的属性页控件和pszPropName指定的属性相关的成员变量。
pszPropName | 将要与id指定的组合框控件交换数据的控件属性的名字。

说明：
在你的属性页的DoDataExchange函数中调用这个函数以使属性页中组合框的当前选择和与之完全匹配的字符串属性的值同步。这个函数必须在相应的DDX_CBCStringExtract函数之前调用。

请参阅：
DDP_CBString, DDP_CBIndex, COleControl::DoPropExchange, DDX_CBStringExact


 DDP_Check

void AFXAPI DDP_Check(
CDataExchange* pDX,
int id,
int& member,
LPCSTR pszPropName
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括它的方向。
id | 与pszPropName指定的控件属性相关的复选框控件的资源ID。
member | 与id指定的属性页控件和pszPropName指定的属性相关的成员变量。
pszPropName | 将要与id指定的复选框控件交换数据的控件属性的名字。

说明：
在你的属性页的DoDataExchange函数中调用这个函数以使属性的值与相关属性页的复选框同步。这个函数必须在相应的DDX_Check函数之前调用。

请参阅：
DDP_Radio, DDP_Text, COleControl::DoPropExchange, DDX_Check


 DDP_LBIndex

void AFXAPI DDP_LBIndex(
CDataExchange* pDX,
int id,
int& member,
LPCTSTR pszPropName
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括它的方向。
id | 与pszPropName指定的控件属性相关的列表框控件的资源ID。
member | 与id指定的属性页控件和pszPropName指定的属性相关的成员变量。
pszPropName | 将要与id指定的列表框字符串交换数据的控件属性的名字。

说明：
在你的属性页的DoDataExchange函数中调用这个函数以使整数属性的值与属性页中列表框的当前选择的索引同步。这个函数必须在相应的DDX_LBIndex函数之前调用。

请参阅：
DDP_LBString, DDP_CBIndex, COleControl::DoPropExchange, DDX_LBIndex


 DDP_LBString

void AFXAPI DDP_LBString(
CDataExchange* pDX,
int id,
CString& member,
LPCTSTR pszPropName
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括它的方向。
id | 与pszPropName指定的控件属性相关的列表控件的资源ID。
member | 与id指定的属性页控件和pszPropName指定的属性相关的成员变量。
pszPropName | 将要与id指定的列表框字符串交换数据的控件属性的名字。

说明：
在你的属性页的DoDataExchange函数中调用这个函数以使整数属性的值与属性页中列表框的当前选择同步。这个函数必须在相应的DDX_LBString函数之前调用。

请参阅：
DDP_LBStringExact, DDP_CBIndex, COleControl::DoPropExchange, DDX_LBString


 DDP_LBStringExact

void AFXAPI DDP_LBStringExact(
CDataExchange* pDX,
int id,
CString& member,
LPCTSTR pszPropName
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括它的方向。
id | 与pszPropName指定的控件属性相关的列表框控件的资源ID。
member | 与id指定的属性页控件和pszPropName指定的属性相关的成员变量。
pszPropName | 将要与id指定的列表框字符串交换数据的控件属性的名字。

说明：
在你的属性页的DoDataExchange函数中调用这个函数以使属性页中列表框的当前选择和与之完全匹配的字符串属性的值同步。这个函数必须在相应的DDX_LBStringExact函数之前调用。

请参阅：
DDP_LBString, DDP_LBIndex, COleControl::DoPropExchange, DDX_LBStringExact


 DDP_PostProcessing

void AFXAPI DDP_PostProcessing( CDataExchange * pDX );

参数：
pDX 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。

说明：
在你的属性页的DoDataExchange函数中调用这个函数，使得当属性值被存储以后停止在属性页到控件之间的数据交换。
这个函数必须在所有的数据交换函数都结束以后调用。例如：
void CSamplePage::DoDataExchange(CDataExchange* pDX)
{
//{{AFX_DATA_MAP(CSpindialPropPage)
DDP_Text(pDX, IDC_POSITIONEDIT, m_NeedlePosition, _T("NeedlePosition"));
DDX_Text(pDX, IDC_POSITIONEDIT, m_NeedlePosition);
DDV_MinMaxInt(pDX, m_NeedlePosition, 0, 3);
//}}AFX_DATA_MAP
DDP_PostProcessing(pDX);
}

请参阅：COleControl::DoPropExchange


 DDP_Radio

void AFXAPI DDP_Radio(
CDataExchange* pDX,
int id,
int& member,
LPCTSTR pszPropName
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括它的方向。
id | 与pszPropName指定的控件属性相关的单选按钮控件的资源ID。
member | 与id指定的属性页控件和pszPropName指定的属性相关的成员变量。
pszPropName | 将要与id指定的单选按钮控件交换数据的控件属性的名字。

说明：
在你的属性页的DoDataExchange函数中调用这个函数以使属性值与属性页中的单选按钮控件同步。这个函数必须在相应的DDX_Radio函数之前调用。

请参阅：
DDP_Check, DDP_Text, COleControl::DoPropExchange, DDX_Radio


 DDP_Text

void AFXAPI DDP_Text( CDataExchange* pDX, int id, BYTE& member, LPCTSTR pszPropName );
void AFXAPI DDP_Text( CDataExchange* pDX, int id, int& member, LPCTSTR pszPropName );
void AFXAPI DDP_Text( CDataExchange* pDX, int id, UINT& member, LPCTSTR pszPropName );
void AFXAPI DDP_Text( CDataExchange* pDX, int id, long& member, LPCTSTR pszPropName );
void AFXAPI DDP_Text( CDataExchange* pDX, int id, DWORD& member, LPCTSTR pszPropName );
void AFXAPI DDP_Text( CDataExchange* pDX, int id, float& member, LPCTSTR pszPropName );
void AFXAPI DDP_Text( CDataExchange* pDX, int id, double& member, LPCTSTR pszPropName );
void AFXAPI DDP_Text( CDataExchange* pDX, int id, CString& member, LPCTSTR pszPropName );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括它的方向。
id | 与pszPropName指定的控件属性相关的控件的资源ID。
member | 与id指定的属性页控件和pszPropName指定的属性相关的成员变量。
pszPropName | 将要与id指定的控件交换数据的控件属性的名字。

说明：
在你的属性页的DoDataExchange函数中调用这个函数以使属性值与属性页控件同步。这个函数必须在相应的DDX_Text函数之前调用。

请参阅：
DDP_Check, DDP_Radio, COleControl::DoPropExchange, DDX_Text


 DDV_MaxChars

void AFXAPI DDV_MaxChars( CDataExchange* pDX, CString const& value, int nChars );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
value | 对对话框、表格视或控件视对象的成员变量的引用，将对其进行数据校验。
nChars | 允许的最大字符数目。

说明：
调用DDV_MaxChars以检验与value相关的控件的字符数是否超过nChars。
关于DDV的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。


 DDV_MinMaxByte

void AFXAPI DDV_MinMaxByte( CDataExchange* pDX, BYTE value, BYTE minVal, BYTE maxVal );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
value | 对对话框、表格视或控件视对象的成员变量的引用，将对其进行数据校验。
minVal | 允许的最小值（BYTE类型）。
MaxVal | 允许的最大值（BYTE类型）。

说明：
调用DDV_MinMaxByte以检验与value相关的控件中的值是否介于minVal和maxVal之间。
关于DDV的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。


 DDV_MinMaxDateTime

void AFXAPI DDV_MinMaxDateTime(
CDataExchange* pDX,
CTime& refvalue,
const CTime* refMinRange,
const CTime* refMaxRange
);
void AFXAPI DDV_MinMaxDateTime(
CDataExchange* pDX,
COleDateTime& refValue,
const COleDateTime* refMinRange,
const COleDateTime* refMaxRange
);

参数：
pDX | 指向CDataExchange对象的指针，框架提供了这个对象以建立数据交换的环境，包括其方向。你无需删除该对象。
refValue | 对与对话框、表格视图或控件视图对象的成品变量相关的CTime或COleDateTime对象的引用。该对象包含了要被检验的数据。
refMinRange | 允许的最小的日期/时间值。
refMaxRange | 允许的最大的日期/时间值。

说明：
调用DDV_MaxDateTime以检验与refValue相关的日历控件（CDateTimeCtrl）中的时间/日期值是否介于refMinRange和refMaxRange之间。
关于DDV的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++程序员教程》中的“加入对话框”。

请参阅：
DDX_DateTimeCtrl, DDV_MinMaxMonth


 DDV_MinMaxDouble

void AFXAPI DDV_MinMaxDouble(
CDataExchange* pDX,
double const& value,
double minVal,
double maxVal
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
value | 对对话框、表格视图或控件视图对象的成员变量的引用，将对其进行数据校验。
minVal | 允许的最小值（double类型）。
maxVal | 允许的最大值（double类型）。

说明：
调用DDV_MinMaxDouble以检验与value相关的控件中的值是否介于minVal和maxVal之间。
关于DDV的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。


 DDV_MinMaxDWord

void AFXAPI DDV_MinMaxDWord(
CDataExchange* pDX,
DWORD const& value,
DWORD minVal,
DWORD maxVal
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
value | 对对话框、表格视图或控件视图对象的成员变量的引用，将对其进行数据校验。
minVal | 允许的最小值（DWORD类型）。
maxVal | 允许的最大值（DWORD类型）。

说明：
调用DDV_MinMaxDWord以检验与value相关的控件中的值是否介于minVal和maxVal之间。
关于DDV的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。


 DDV_MinMaxFloat

void AFXAPI DDV_MinMaxFloat(
CDataExchange* pDX,
float value,
float minVal,
float maxVal
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
value | 对对话框、表格视图或控件视图对象的成员变量的引用，将对其进行数据校验。
minVal | 允许的最小值（float类型）。
maxVal | 允许的最大值（float类型）。

说明：
调用DDV_MinMaxInt以检验与value相关的控件中的值是否介于minVal和maxVal之间。
关于DDV的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。


 DDV_MinMaxInt

void AFXAPI DDV_MinMaxInt( CDataExchange* pDX, int value, int minVal, int maxVal );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
value | 对对话框、表格视或控件视对象的成员变量的引用，将对其进行数据校验。
minVal | 允许的最小值（int类型）。
maxVal | 允许的最大值（int类型）。

说明：
调用DDV_MinMaxInt以检验与value相关的控件中的值是否介于minVal和maxVal之间。
关于DDV的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。


 DDV_MinMaxLong

void AFXAPI DDV_MinMaxLong( CDataExchange* pDX, long value, long minVal, long maxVal );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
value | 对对话框、表格视或控件视对象的成员变量的引用，将对其进行数据校验。
minVal | 允许的最小值（long类型）。
maxVal | 允许的最大值（long类型）。

说明：
调用DDV_MinMaxLong以检验与value相关的控件中的值是否介于minVal和maxVal之间。
关于DDV的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。


 DDV_MinMaxMonth

void AFXAPI DDV_MinMaxMonth(
CDataExchange* pDX,
CTime& refValue,
const CTime* refMinRange,
const CTime* refMaxRange
);
void AFXAPI DDV_MinMaxMonth(
CDataExchange* pDX,
COleDateTime& refValue,
const COleDateTime* refMinRange,
const COleDateTime* refMaxRange
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
refValue | 对与对话框、表格视或控件视对象的成员变量相关的CTime或COleDateTime对象的引用。该对象包含了要被校验的数据。当DDV_MinMaxMonth被调用时，MFC把这个引用传递给它。
refMinRange | 允许的最小的日期/时间值。
refMaxRange | 允许的最大的日期/时间值。

说明：
调用DDV_MinMaxMonth以检验与refValue相关的日历控件（CMonthCalCtrl）中的时间/日期值是否介于refMinRange和refMaxRange之间。
关于DDV的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。


 DDV_MinMaxSlider

void AFXAPI DDV_MinMaxSlider(
CDataExchange* pDX,
DWORD value,
DWORD minVal,
DWORD maxVal
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
value | 对要被校验的数据的引用。这个参数保存或设置滑块控件的当前位置。
minVal | 允许的最小值。
maxVal | 允许的最大值。

说明：
调用DDV_MinMaxSlider以检验与value相关的控件中的值是否介于minVal和maxVal之间。
关于DDV的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。有关滑块控件的更多信息参见《Visual C++程序员指南》中的“使用CSliderCtrl”。

请参阅：DDX_Slider, DDX_FieldSlider


 DDV_MinMaxUnsigned

void AFXAPI DDV_MinMaxUnsigned(
CDataExchange* pDX,
unsigned value,
unsigned minVal,
unsigned maxVal
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
value | 对对话框、表格视或控件视对象的成员变量的引用，将对其进行数据校验。
minVal | 允许的最小值（unsigned类型）。
maxVal | 允许的最大值（unsigned类型）。

说明：
调用DDV_MinMaxUnsigned以检验与value相关的控件中的值是否介于minVal和maxVal之间。
关于DDV的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。


 DDX_CBIndex

void AFXAPI DDX_CBIndex( CDataExchange* pDX, int nIDC, int& index );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
nIDC | 与控件属性相关的组合框控件的ID。
index | 对对话框、表格视或控件视的成员变量的引用，将与该变量发生数据交换。

说明：
DDX_CBIndex函数管理着在对话框、表格视或控件视中的组合框控件与对话框、表格视或控件视的整数数据成员之间的整数数据交换。
当DDX_CBIndex被调用时，index被设置为组合框的当前选择的索引。如果没有选择任何项，则index被设为0。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。

请参阅：DDP_CBIndex


 DDX_CBString

void AFXAPI DDX_CBString( CDataExchange* pDX, int nIDC, CString& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
nIDC | 与控件属性相关的组合框控件的资源ID。
value | 对对话框、表格视或控件视的成员变量的引用，将与该变量发生数据交换。

说明：
DDX_CBString函数管理着在对话框、表格视或控件视中的组合框中的编辑控件与对话框、表格视或控件视的CString数据成员之间的CString数据交换。
当DDX_CBString被调用时，value被设置为组合框的当前选择。如果没有选择任何项，则index被设为空字符串。
注意：
如果组合框是一个下拉列表框，交换的值被限制在255个字符以内。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。

请参阅：DDP_CBString


 DDX_CBStringExact

void AFXAPI DDX_CBStringExact( CDataExchange* pDX, int nIDC, CString& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
nIDC | 与控件属性相关的组合框控件的资源ID。
value | 对对话框、表格视或控件视的成员变量的引用，将与该变量发生数据交换。

说明：
DDX_CBStringExact函数管理着在对话框、表格视或控件视中的组合框中的编辑控件与对话框、表格视或控件视的CString数据成员之间的CString数据交换。
当DDX_CBString被调用时，value被设置为组合框的当前选择。如果没有选择任何项，则index被设为空字符串。
注意：
如果组合框是一个下拉列表框，交换的值被限制在255个字符以内。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。

请参阅：DDP_CBStringExact


 DDX_Check

void AFXAPI DDX_Check( CDataExchange* pDX, int nIDC, int& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
nIDC | 与控件属性相关的复选框控件的资源ID。
value | 对对话框、表格视或控件视的成员变量的引用，将与该变量发生数据交换。

说明：
DDX_Check函数管理着在对话框、表格视或控件视中的复选框控件与对话框、表格视或控件视的整数数据成员之间的整数数据交换。
当DDX_Check被调用时，value被设置为复选框的当前状态。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。

请参阅：DDP_Check


 DDX_Control

void AFXAPI DDX_Control( CDataExchange* pDX, int nIDC, CWnd& rControl );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
nIDC | 与控件属性相关的被子类化的控件的资源ID。
rControl | 对对话框、表格视或控件视的成员变量的引用，将与该变量发生数据交换。

说明：
DDX_Control函数管理着在对话框、表格视或控件视中被子类化的控件与对话框、表格视或控件视的CWnd数据成员之间的数据交换。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。


 DDX_DateTimeCtrl

void AFXAPI DDX_DateTimeCtrl( CDataExchange* pDX, int nIDC, CTime& value );
void AFXAPI DDX_DateTimeCtrl( CDataExchange* pDX, int nIDC, COleDateTime& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。你不需要删除这个对象。
nIDC | 与成员变量相关的日期/时间选取控件的资源ID。
value | 对对话框、表格视或控件视的CTime或COleDateTime成员变量的引用，将与该变量发生数据交换。

说明：
DDX_DateTimeCtrl函数管理着在对话框、表格视或控件视中的日期/时间选取控件（CDateTimeCtrl）与对话框、表格视或控件视的CTime或COleDateTime数据成员之间的日期和（或）时间数据交换。
当DDX_DateTimeCtrl被调用时，value被设置为日期/时间选取控件的当前状态，或者控件的状态被设为value，这取决于数据交换的方向。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。

请参阅：
CDateTimeCtrl, CDateTimeCtrl::SetRange, CDateTimeCtrl::GetRange, DDV_MinMaxDateTime


 DDX_FieldCBIndex

void AFXAPI DDX_FieldCBIndex(
CDataExchange* pDX,
int nIDC,
int& index,
CRecordset* pRecordset
);
void AFXAPI DDX_FieldCBIndex(
CDataExchange* pDX,
int nIDC,
int& index,
CDaoRecordset* pRecordset
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
nIDC | CRecordView或CDaoRecordView对象中控件的ID。
index | 对相关的CRecordset或CDaoRecordset对象的字段数据成员的引用。
pRecordset | 指向CRecordset或CDaoRecordset对象的指针，将与其发生数据交换。

说明：
DDX_FieldCBIndex函数使记录视中组合框控件中的列表框的当前选择项与记录视的相关记录集对象的整数数据成员同步。当数据是从记录集传送到控件时，这个函数将根据index指定的值设置控件的当前选择项。对于从记录集到控件的数据传送，如果记录集的字段为NULL，MFC将index的值设为0。对于从控件到记录集的数据传送，如果控件为空或没有选择任何项，则记录集的字段被设为0。
如果你正在使用基于ODBC的类，则使用第一个版本。如果你正在使用基于DAO的类，则使用第二个版本。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。有关CRecordView和CDaoRecordView中的DDX的更多信息以及例子参见《Visual C++指南》中的文章“记录视”。

示例：
参看DDX_FieldText以获得一般的 DDX_Field例子。DDX_FieldCBIndex的例子与此类似。

请参阅：
DDX_FieldText, DDX_FieldRadio, DDX_FieldLBString, DDX_FieldLBStringExact, DDX_FieldCBStringExact, DDX_FieldLBIndex, DDX_FieldScroll, DDX_CBIndex


 DDX_FieldCBString

void AFXAPI DDX_FieldCBString(
CDataExchange* pDX,
int nIDC,
CString& value,
CRecordset* pRecordset
);
void AFXAPI DDX_FieldCBString(
CDataExchange* pDX,
int nIDC,
CString& value,
CDaoRecordset* pRecordset
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
nIDC | CRecordView 或CDaoRecordView对象中控件的ID。
index | 对相关的CRecordset或CDaoRecordset对象的字段数据成员的引用。
pRecordset | 指向CRecordset或CDaoRecordset对象的指针，将与其发生数据交换。

说明：
DDX_FieldCBString函数管理着记录视中组合框控件的编辑框与记录视的相关记录集的CString数据成员之间的CString数据交换。当数据是从记录集传送到控件时，这个函数将组合框控件的当前选择设为以value指定的字符串中字符开始的第一项。对于从记录集到控件的数据传送，如果记录集的字段为NULL，组合框的选择将被清除，其编辑框被设为空。对于从控件到记录集的数据传送，如果控件为空，则在允许的情况下，记录集的字段被设为NULL。
如果你正在使用基于ODBC的类，则使用第一个版本。如果你正在使用基于DAO的类，则使用第二个版本。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。有关CRecordView和CDaoRecordView中的DDX的更多信息以及例子参见《Visual C++指南》中的文章“记录视”。

示例：
参看DDX_FieldText以获得一般的DDX_Field例子。这个例子中包含了对DDX_FieldCBString的调用。

请参阅：
DDX_FieldText, DDX_FieldRadio, DDX_FieldLBString, DDX_FieldLBStringExact, DDX_FieldCBStringExact


 DDX_FieldCBStringExact

void AFXAPI DDX_FieldCBStringExact(
CDataExchange* pDX,
int nIDC,
CString& value,
CRecordset* pRecordset
);
void AFXAPI DDX_FieldCBStringExact(
CDataExchange* pDX,
int nIDC,
CString& value,
CDaoRecordset* pRecordset
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
nIDC | CRecordView 或CDaoRecordView对象中控件的ID。
index | 对相关的CRecordset或CDaoRecordset对象的字段数据成员的引用。
pRecordset | 指向CRecordset或CDaoRecordset对象的指针，将与其发生数据交换。

说明：
DDX_FieldCBStringExact函数管理着记录视中组合框控件的编辑框与记录视的相关记录集的CString数据成员之间的CString数据交换。当数据是从记录集传送到控件时，这个函数将组合框控件的当前选择设为第一个与value指定的字符串严格匹配的项。对于从记录集到控件的数据传送，如果记录集的字段为NULL，组合框的选择将被清除，其编辑框被设为空。对于从控件到记录集的数据传送，如果控件为空，记录集的字段被设为NULL。
如果你正在使用基于ODBC的类，则使用第一个版本。如果你正在使用基于DAO的类，则使用第二个版本。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。有关CRecordView和CDaoRecordView中的DDX的更多信息以及例子参见《Visual C++指南》中的文章“记录视”。

示例：
参看DDX_FieldText以获得一般的 DDX_Field例子。对DDX_FieldCBStringExact的调用是类似的。

请参阅：
DDX_FieldText, DDX_FieldRadio, DDX_FieldLBString, DDX_FieldLBStringExact, DDX_FieldCBString


 DDX_FieldCheck

void AFXAPI DDX_FieldCheck(
CDataExchange* pDX,
int nIDC,
int& value,
CRecordset* pRecordset
);
void AFXAPI DDX_FieldCheck(
CDataExchange* pDX,
int nIDC,
int& value,
CDaoRecordset* pRecordset
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
nIDC | CRecordView 或CDaoRecordView对象中控件的ID。
value | 对相关的CRecordset或CDaoRecordset对象的字段数据成员的引用。
pRecordset | 指向CRecordset或CDaoRecordset对象的指针，将与其发生数据交换。

说明：
DDX_FieldCheck函数管理着对话框、表格视或控件视中复选框控件与对话框、表格视或控件视的int数据成员之间的整数数据交换。
当DDX_FieldCheck被调用时，value被设置为复选框控件的当前状态，也可能控件的状态被设为value，这取决于数据传送的方向。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。

请参阅：
DDX_FieldText, DDX_FieldRadio, DDX_FieldLBString, DDX_FieldLBStringExact, DDX_FieldCBString


 DDX_FieldLBIndex

void AFXAPI DDX_FieldLBIndex(
CDataExchange* pDX,
int nIDC,
int& index,
CRecordset* pRecordset
);
void AFXAPI DDX_FieldLBIndex(
CDataExchange* pDX,
int nIDC,
int& index,
CDaoRecordset* pRecordset
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
nIDC | CRecordView 或CDaoRecordView对象中控件的ID。
index | 对相关的CRecordset或CDaoRecordset对象的字段数据成员的引用。
pRecordset | 指向CRecordset或CDaoRecordset对象的指针，将与其发生数据交换。

说明：
DDX_FieldLBIndex函数使记录视中列表控件的当前选择与记录视的相关记录集的int数据成员保持同步。当数据是从记录集传送到控件时，这个函数将根据index的值设置控件的当前选择项。对于从记录集到控件的数据传送，如果记录集的字段为NULL，MFC将把index的值设为0。对于从控件到记录集的数据传送，如果控件为空，记录集的字段被设为0。
如果你正在使用基于ODBC的类，则使用第一个版本。如果你正在使用基于DAO的类，则使用第二个版本。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。有关CRecordView和CDaoRecordView中的DDX的更多信息以及例子参见《Visual C++指南》中的“记录视”。

示例：
参看DDX_FieldText以获得一般的 DDX_Field例子。

请参阅：
DDX_FieldText, DDX_FieldRadio, DDX_FieldLBString, DDX_FieldLBStringExact, DDX_FieldCBStringExact, DDX_FieldCBIndex, DDX_FieldScroll, DDX_LBIndex


 DDX_FieldLBString

void AFXAPI DDX_FieldLBString(
CDataExchange* pDX,
int nIDC,
CString& value,
CRecordset* pRecordset
);
void AFXAPI DDX_FieldLBString(
CDataExchange* pDX,
int nIDC,
CString& value,
CDaoRecordset* pRecordset
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
nIDC | CRecordView或CDaoRecordView对象中控件的ID。
value | 对相关的CRecordset或CDaoRecordset对象的字段数据成员的引用。
pRecordset | 指向CRecordset或CDaoRecordset对象的指针，将与其发生数据交换。

说明：
DDX_FieldLBString函数将记录视中列表框的当前选择复制给记录视的相关记录集的CString数据成员。在相反的方向，这个函数将列表框控件的当前选择设为第一个以value指定的字符串中字符为开头的项。对于从记录集到控件的数据传送，如果记录集的字段为NULL，列表框的选择将被清除。对于从控件到记录集的数据传送，如果控件为空，记录集的字段被设为NULL。
如果你正在使用基于ODBC的类，则使用第一个版本。如果你正在使用基于DAO的类，则使用第二个版本。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。有关CRecordView和CDaoRecordView中的DDX的更多信息以及例子参见《Visual C++指南》中的文章“记录视”。

示例：
参看DDX_FieldText以获得一般的 DDX_Field例子。对DDX_FieldLBString的调用是类似的。

请参阅：
DDX_FieldText, DDX_FieldRadio, DDX_FieldLBStringExact, DDX_FieldCBString, DDX_FieldCBStringExact, DDX_FieldCBIndex, DDX_FieldLBIndex, DDX_FieldScroll


 DDX_FieldLBStringExact

void AFXAPI DDX_FieldLBStringExact(
CDataExchange* pDX,
int nIDC,
CString& value,
CRecordset* pRecordset
);
void AFXAPI DDX_FieldLBStringExact(
CDataExchange* pDX,
int nIDC,
CString& value,
CDaoRecordset* pRecordset
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
nIDC | CRecordView 或CDaoRecordView对象中控件的ID。
value | 对相关的CRecordset或CDaoRecordset对象的字段数据成员的引用。
pRecordset | 指向CRecordset或CDaoRecordset对象的指针，将与其发生数据交换。

说明：
DDX_FieldLBStringExact函数将记录视中列表框的当前选择复制给记录视的相关记录集的CString数据成员。在相反的方向，这个函数将列表框控件的当前选择设为第一个与value指定的字符严格匹配的项。对于从记录集到控件的数据传送，如果记录集的字段为NULL，列表框的选择将被清除。对于从控件到记录集的数据传送，如果控件为空，记录集的字段被设为NULL。如果你正在使用基于ODBC的类，则使用第一个版本。如果你正在使用基于DAO的类，则使用第二个版本。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。有关CRecordView和CDaoRecordView中的DDX的更多信息以及例子参见《Visual C++指南》中的文章“记录视”。

示例：
参看DDX_FieldText以获得一般的 DDX_Field例子。对DDX_FieldLBStringExact的调用是类似的。

请参阅：
DDX_FieldText, DDX_FieldRadio, DDX_FieldLBString, DDX_FieldCBString, DDX_FieldCBStringExact, DDX_FieldCBIndex, DDX_FieldLBIndex, DDX_FieldScroll


 DDX_FieldRadio

void AFXAPI DDX_FieldRadio(
CDataExchange* pDX,
int nIDC,
int& value,
CRecordset* pRecordset
);
void AFXAPI DDX_FieldRadio(
CDataExchange* pDX,
int nIDC,
int& value,
CDaoRecordset* pRecordset
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
nIDC | 在CRecordView或CDaoRecordView对象中一组相邻的单选按钮（具有WS_GROUP风格）中的第一个的ID。
value | 对相关的CRecordset或CDaoRecordset对象的字段数据成员的引用。
pRecordset | 指向CRecordset或CDaoRecordset对象的指针，将与其发生数据交换。

说明：
DDX_FieldRadio函数把记录视的记录集中从零开始的int型成员变量与记录视中一组单选按钮的当前选择项关联起来。当数据是从记录集字段传送到记录视时，这个函数打开第n个（从零开始）单选按钮并关闭其它的单选按钮。按相反的方向，这个函数将记录集的字段设为当前打开（被选中）的单选按钮的序号。对于从记录集到控件的数据传送，如果记录集的字段为NULL，没有一个按钮被选中。对于从控件到记录集的数据传送，如果没有控件被选中，如果允许，则记录集的字段被设为NULL。
如果你正在使用基于ODBC的类，则使用第一个版本。如果你正在使用基于DAO的类，则使用第二个版本。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。有关CRecordView和CDaoRecordView中的DDX的更多信息以及例子参见《Visual C++指南》中的文章“记录视”。

示例：
参看DDX_FieldText以获得一般的 DDX_Field例子。对DDX_FieldRadio的调用是类似的。

请参阅：
DDX_FieldText, DDX_FieldLBString, DDX_FieldLBStringExact, DDX_FieldCBString, DDX_FieldCBStringExact, DDX_FieldCBIndex, DDX_FieldLBIndex, DDX_FieldScroll


 DDX_FieldScroll

void AFXAPI DDX_FieldScroll(
CDataExchange* pDX,
int nIDC,
int& value,
CRecordset* pRecordset
);
void AFXAPI DDX_FieldScroll(
CDataExchange* pDX,
int nIDC,
int& value,
CDaoRecordset* pRecordset
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
nIDC | 在CRecordView或CDaoRecordView对象中一组相邻的单选按钮（具有WS_GROUP风格）中的第一个的ID。
value | 对相关的CRecordset或CDaoRecordset对象的字段数据成员的引用。
pRecordset | 指向CRecordset或CDaoRecordset对象的指针，将与其发生数据交换。

说明：
DDX_FieldScroll函数使记录视中滚动条控件的位置与记录视的相关记录集中的int数据成员（或者是你选择的任何整数变量）保持同步。当数据是从记录集传送到滑块控件时，这个函数将滚动条控件的位置设为value指定的值。对于从记录集到控件的数据传送，如果记录集的字段为NULL，滚动条控件的位置被设为0。对于从控件到记录集的数据传送，如果控件为空，记录集的字段被设为0。
如果你正在使用基于ODBC的类，则使用第一个版本。如果你正在使用基于DAO的类，则使用第二个版本。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。有关CRecordView和CDaoRecordView中的DDX的更多信息以及例子参见《Visual C++指南》中的“记录视”。

示例：
参看DDX_FieldText以获得一般的 DDX_Field例子。对DDX_FieldScroll的调用是类似的。

请参阅：
DDX_FieldText, DDX_FieldLBString, DDX_FieldLBStringExact, DDX_FieldCBString, DDX_FieldCBStringExact, DDX_FieldCBIndex, DDX_FieldLBIndex, DDX_Scroll


 DDX_FieldSlider

void AFXAPI DDX_FieldSlider(
CDataExchange* pDX,
int nIDC,
int& value,
CRecordset* pRecordset
);
void AFXAPI DDX_FieldSlider(
CDataExchange* pDX,
int nIDC,
int& value,
CDaoRecordset* pRecordset
);

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
nIDC | 滑块控件的资源ID。
value | 对要交换的值的引用。这个参数保存滑块控件的当前位置，或者被用于设置滑块控件的当前位置。
pRecordset | 指向CRecordset或CDaoRecordset对象的指针，将与其发生数据交换。

说明：
DDX_FieldSlider函数使记录视中滑块控件的位置与记录视的相关记录集中的int数据成员（或者是你选择的任何整数变量）保持同步。当数据是从记录集传送到滑块控件时，这个函数将滑块控件的位置设为value指定的值。对于从记录集到控件的数据传送，如果记录集的字段为NULL，滑块控件的位置被设为0。对于从控件到记录集的数据传送，如果控件为空，记录集的字段被设为0。DDX_FieldSlider并不与滑块控件交换范围信息，否则就可以设置范围而不仅是位置。
如果你正在使用基于ODBC的类，则使用第一个版本。如果你正在使用基于DAO的类，则使用第二个版本。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。有关CRecordView和CDaoRecordView中的DDX的更多信息以及例子参见《Visual C++指南》中的“记录视”。关于滑块控件的信息参见《Visual C++程序员指南》中的“使用CSliderCtrl”。

示例：
参看DDX_FieldText以获得一般的 DDX_Field例子。对DDX_FieldSlider的调用是类似的。

请参阅：
DDX_Slider, DDV_MinMaxSlider, DDX_FieldLBString, DDX_FieldLBStringExact, DDX_FieldCBString, DDX_FieldCBStringExact, DDX_FieldCBIndex, DDX_FieldLBIndex


 DDX_FieldText

void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, BYTE& value, CRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, int& value, CRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, UINT& value, CRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, long& value, CRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, DWORD& value, CRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, CString& value, CRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, float& value, CRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, double& value, CRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, short& value, CDaoRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, BOOL& value, CDaoRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, BYTE& value, CDaoRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, long& value, CDaoRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, DWORD& value, CDaoRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, CString& value, CDaoRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, float& value, CDaoRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, double& value, CDaoRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, COleDateTime& value, CDaoRecordset* pRecordset );
void AFXAPI DDX_FieldText( CDataExchange* pDX, int nIDC, COleCurrency& value, CDaoRecordset* pRecordset );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象以建立数据交换的环境，包括其方向。
nIDC | 在CRecordView或CDaoRecordView对象中控件的ID。
value | 对相关的CRecordset或CDaoRecordset对象的字段数据成员的引用。value的数据类型与你使用的DDX_FieldText的版本有关。
pRecordset | 指向CRecordset或CDaoRecordset对象的指针，将与其发生数据交换。这个指针使DDX_FieldText能够检测并设置NULL值。

说明：
DDX_FieldText函数管理着编辑框控件与记录集的字段数据成员之间的int，short，long，DWORD，CString，float，double，BOOL或BYTE类型的数据交换。对于CDaoRecordset对象，DDX_FieldText函数还管理着COleDateTime和COleCurrency数值的传送。一个空的编辑控件代表了一个NULL值。对于从记录集到控件的数据传送，如果记录集的与为NULL，则编辑框被设为空。对于从控件到记录集的数据传送，如果控件为空，则记录集的字段被设为NULL。
如果你正在使用基于ODBC的类，则使用带CRecordset参数的版本。如果你正在使用基于DAO的类，则使用带CDaoRecordset参数的类。
有关DDX的更多信息参见《Visual C++程序员指南》中的“对话框数据交换和校验”和《Visual C++教程》中的“加入对话框”。有关CRecordView和CDaoRecordView中的DDX的更多信息以及例子参见《Visual C++指南》中的文章“记录视”。

示例：
下面针对CRecordView的包含了DDX_FieldText函数DoDataExchange是为三种类型调用的：IDC_COURSELIST是一个组合框，其它两种控件是编辑框。
对于DAO编程，m_pSet参数是一个指向CRecordset或CDaoRecordset的指针。
//DDX_FieldText的例子
void CSectionForm::DoDataExchange( CDataExchange* pDX )
{
CRecordView::DoDataExchange( pDX );
//{{AFX_DATA_MAP(CSectionForm)
DDX_FieldCBString( pDX, IDC_COURSELIST, m_pSet->m_strCourseID, m_pSet);
DDX_FieldText( pDX, IDC_ROOM, m_pSet->m_nRoomNo, m_pSet );
DDX_FieldText( pDX, IDC_TUITION, m_pSet->m_dwTuition, m_pSet );
//}}AFX_DATA_MAP
}

请参阅：
DDX_FieldRadio, DDX_FieldLBString, DDX_FieldLBStringExact, DDX_FieldCBString, DDX_FieldCBStringExact, DDX_FieldCBIndex, DDX_FieldLBIndex, DDX_FieldScroll


 DDX_LBIndex

void AFXAPI DDX_LBIndex( CDataExchange* pDX, int nIDC, int& index );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 与控件属性相关的列表框控件的资源ID。
index | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_LBIndex函数管理着对话框、表格视或控件视对象中的列表框控件与对话框、表格视或控件视对象的int型数据成员之间的int型数据交换。
当DDX_LBIndex被调用的时候，index被设为列表框的当前选择项的索引。如果没有选择任何项，则index被设为0。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。

请参阅：DDP_LBIndex


 DDX_LBString

void AFXAPI DDX_LBString( CDataExchange* pDX, int nIDC, CString& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 与控件属性相关的列表框控件的资源ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_LBString函数管理着对话框、表格视或控件视对象中的列表框控件中编辑框与对话框、表格视或控件视对象的CString型数据成员之间的CString型数据交换。
当DDX_LBString被调用的时候，value被设为列表框的当前选择项。如果没有选择任何项，则index被设为空字符串。
注意：
如果该列表框是一个下拉列表框，交换的值被限制在255个字符以内。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。

请参阅：DDP_LBString


 DDX_LBStringExact

void AFXAPI DDX_LBStringExact( CDataExchange* pDX, int nIDC, CString& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 与控件属性相关的列表框控件的资源ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_LBStringExact函数管理着对话框、表格视或控件视对象中的列表框控件中编辑框与对话框、表格视或控件视对象的CString型数据成员之间的CString型数据交换。
当DDX_LBStringExact被调用的时候，value被设为列表框的当前选择项。如果没有选择任何项，则index被设为空字符串。
注意：
如果该列表框是一个下拉列表框，交换的值被限制在255个字符以内。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。


 DDX_MonthCalCtrl

void AFXAPI DDX_MonthCalCtrl( CDataExchange* pDX, int nIDC, CTime& value );
void AFXAPI DDX_MonthCalCtrl( CDataExchange* pDX, int nIDC, COleDateTime& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。你不需要自己删除这个对象。
nIDC | 与成员变量相关的月历控件的资源ID。
value | 对对话框、表格视或控件视对象的CTime或COleDateTime成员变量的引用，将与其发生数据交换。

说明：
DDX_MonthCalCtrl函数管理着对话框、表格视或控件视对象中的月历控件与对话框、表格视或控件视对象的CTime或COleDateTime型数据成员之间的数据交换。
注意：
该控件仅管理日期值。时间对象中的时间域被设为控件窗口的创建时间，或者是通过CMonthCalCtrl::SetCurSel设置的任意时间。
当DDX_MonthCalCtrl被调用的时候，value被设为月历控件的当前状态。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。

请参阅：
DDX_DateTimeCtrl, CMonthCalCtrl, CMonthCalCtrl::GetCurSel, CMonthCalCtrl::SetCurSel


 DDX_OCBool

void AFXAPI DDX_OCBool( CDataExchange* pDX, int nIDC, DISPID dispid, BOOL& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 对话框、表格视或控件视中的OLE控件的ID。
dispid | 控件属性的调度ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_OCBool函数管理着对话框、表格视或控件视对象中的OLE控件属性与对话框、表格视或控件视对象的BOOL型数据成员之间的BOOL型数据交换。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。

请参阅：DDX_OCBoolRO


 DDX_OCBoolRO

void AFXAPI DDX_OCBoolRO( CDataExchange* pDX, int nIDC, DISPID dispid, BOOL& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 对话框、表格视或控件视中的OLE控件的ID。
dispid | 控件属性的调度ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_OCBoolRO函数管理着对话框、表格视或控件视对象中的OLE控件的只读属性与对话框、表格视或控件视对象的BOOL型数据成员之间的BOOL型数据交换。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。

请参阅：DDX_OCBool


 DDX_OCColor

void AFXAPI DDX_OCColor( CDataExchange* pDX, int nIDC, DISPID dispid, OLE_COLOR& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 对话框、表格视或控件视中的OLE控件的ID。
dispid | 控件属性的调度ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_OCColor函数管理着对话框、表格视或控件视对象中的OLE控件的属性与对话框、表格视或控件视对象的OLE_COLOR型数据成员之间的OLE_COLOR型数据交换。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。

请参阅：DDX_OCColorRO


 DDX_OCColorRO

void AFXAPI DDX_OCColorRO( CDataExchange* pDX, int nIDC, DISPID dispid, OLE_COLOR& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 对话框、表格视或控件视中的OLE控件的ID。
dispid | 控件属性的调度ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_OCColorRO函数管理着对话框、表格视或控件视对象中的OLE控件的只读属性与对话框、表格视或控件视对象的OLE_COLOR型数据成员之间的OLE_COLOR型数据交换。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。

请参阅：DDX_OCColor


 DDX_OCFloat

void AFXAPI DDX_OCFloat( CDataExchange* pDX, int nIDC, DISPID dispid, float& value );
void AFXAPI DDX_OCFloat( CDataExchange* pDX, int nIDC, DISPID dispid, double& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 对话框、表格视或控件视中的OLE控件的ID。
dispid | 控件属性的调度ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_OCFloat函数管理着对话框、表格视或控件视对象中的OLE控件的属性与对话框、表格视或控件视对象的float（或double）型数据成员之间的float（或double）型数据交换。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。

请参阅：DDX_OCFloatRO


 DDX_OCFloatRO

void AFXAPI DDX_OCFloatRO( CDataExchange* pDX, int nIDC, DISPID dispid, float& value );
void AFXAPI DDX_OCFloatRO( CDataExchange* pDX, int nIDC, DISPID dispid, double& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 对话框、表格视或控件视中的OLE控件的ID。
dispid | 控件属性的调度ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_OCFloatRO函数管理着对话框、表格视或控件视对象中的OLE控件的只读属性与对话框、表格视或控件视对象的float（或double）型数据成员之间的float（或double）型数据交换。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。

请参阅：DDX_OCFloat


 DDX_OCInt

void AFXAPI DDX_OCInt( CDataExchange* pDX, int nIDC, DISPID dispid, int& value );
void AFXAPI DDX_OCInt( CDataExchange* pDX, int nIDC, DISPID dispid, long& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 对话框、表格视或控件视中的OLE控件的ID。
dispid | 控件属性的调度ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_OCInt函数管理着对话框、表格视或控件视对象中的OLE控件的属性与对话框、表格视或控件视对象的int（或long）型数据成员之间的int（或long）型数据交换。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。

请参阅：DDX_OCIntRO


 DDX_OCIntRO

void AFXAPI DDX_OCIntRO( CDataExchange* pDX, int nIDC, DISPID dispid, int& value );
void AFXAPI DDX_OCLongRO( CDataExchange* pDX, int nIDC, DISPID dispid, long& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 对话框、表格视或控件视中的OLE控件的ID。
dispid | 控件属性的调度ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_OCIntRO函数管理着对话框、表格视或控件视对象中的OLE控件的只读属性与对话框、表格视或控件视对象的int（或long）型数据成员之间的int（或long）型数据交换。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。

请参阅：DDX_OCInt


 DDX_OCShort

void AFXAPI DDX_OCShort( CDataExchange* pDX, int nIDC, DISPID dispid, short& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 对话框、表格视或控件视中的OLE控件的ID。
dispid | 控件属性的调度ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_OCShort函数管理着对话框、表格视或控件视对象中的OLE控件的属性与对话框、表格视或控件视对象的short型数据成员之间的short型数据交换。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。

请参阅：DDX_OCShortRO


 DDX_OCShortRO

void AFXAPI DDX_OCShortRO( CDataExchange* pDX, int nIDC, DISPID dispid, short& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 对话框、表格视或控件视中的OLE控件的ID。
dispid | 控件属性的调度ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_OCShortRO函数管理着对话框、表格视或控件视对象中的OLE控件的只读属性与对话框、表格视或控件视对象的short型数据成员之间的short型数据交换。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。

请参阅：DDX_OCShort


 DDX_OCText

void AFXAPI DDX_OCText( CDataExchange* pDX, int nIDC, DISPID dispid, CString& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 对话框、表格视或控件视中的OLE控件的ID。
dispid | 控件属性的调度ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_OCText函数管理着对话框、表格视或控件视对象中的OLE控件的属性与对话框、表格视或控件视对象的CString型数据成员之间的CString型数据交换。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。

请参阅：DDX_OCTextRO


 DDX_OCTextRO

void AFXAPI DDX_OCTextRO( CDataExchange* pDX, int nIDC, DISPID dispid, CString& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 对话框、表格视或控件视中的OLE控件的ID。
dispid | 控件属性的调度ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_OCTextRO函数管理着对话框、表格视或控件视对象中的OLE控件的只读属性与对话框、表格视或控件视对象的CString型数据成员之间的CString型数据交换。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。

请参阅：DDX_OCText


 DDX_Radio

void AFXAPI DDX_Radio( CDataExchange* pDX, int nIDC, int& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 与控件属性相关的单选控件的资源ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_Radio函数管理着对话框、表格视或控件视对象中的单选控件组与对话框、表格视或控件视对象的int型数据成员之间的int型数据交换。
当DDX_Radio被调用时，将根据value设置单选控件组的当前状态。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。


 DDX_Scroll

void AFXAPI DDX_Scroll( CDataExchange* pDX, int nIDC, int& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 与控件属性相关的滚动条控件的资源ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_Scroll函数管理着对话框、表格视或控件视对象中的滚动条控件与对话框、表格视或控件视对象的int型数据成员之间的int型数据交换。
当DDX_Scroll被调用时，将根据value的值设置滚动条控件的当前位置。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。


 DDX_Slider

void AFXAPI DDX_Slider( CDataExchange* pDX, int nIDC, int& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 与控件属性相关的滑块控件的资源ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，将与其发生数据交换。

说明：
DDX_Slider函数管理着对话框、表格视或控件视对象中的滑块控件与对话框、表格视或控件视对象的int型数据成员之间的int型数据交换。
当DDX_Slider被调用时，将根据value的值设置滑块控件的当前位置，也有可能是将value设为控件的当前位置，这取决于交换的方向。
关于DDX的更多信息参见《Visual C++教程》中的“加入对话框”和《Visual C++程序员指南》中的“对话框数据交换与校验”。有关滑块控件的更多信息参见《Visual C++程序员指南》中的“使用CSliderCtrl”。

请参阅：DDX_FieldSlider, DDV_MinMaxSlider


 DDX_Text

void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, BYTE& value );
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, short& value );
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, int& value );
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, UINT& value );
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, long& value );
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, DWORD& value );
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, CString& value );
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, float& value );
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, double& value );
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, COleCurrency& value );
void AFXAPI DDX_Text( CDataExchange* pDX, int nIDC, COleDateTime& value );

参数：
pDX | 指向CDataExchange对象的指针。框架提供了这个对象，用于建立数据交换的环境，包括其方向。
nIDC | 对话框、表格视或控件视中编辑控件的ID。
value | 对对话框、表格视或控件视对象的成员变量的引用，其类型取决于你使用了DDX_Text的哪一个重载版本。

说明：
DDX_Text函数管理着对话框、表格视或控件视对象中的编辑控件与对话框、表格视或控件视对象的CString型数据成员之间的int，UINT，long，DWORD，CString，float或double型数据交换。
关于DDX的更多信息参见Visual C++联机教程中的“加入对话框”和Visual C++程序员联机指南中的“对话框数据交换与校验”。


 DEBUG_NEW

#define new DEBUG_NEW

说明：
用于帮助发现内存泄漏。你可以在程序中原来使用new操作符来分配内存的任何地方使用DEBUG_NEW。
在调试模式（当定义了_DEBUG符号时）中，DEBUG_NEW记录它所分配的每个对象的文件名和行号。然后，当你使用CMemoryState::DumpAllObjectsSince成员函数时，每个用DEBUG_NEW分配的对象将与发生分配的文件名和行号一起现实。
为了使用DEBUG_NEW，在你的源文件中插入下面的指令：
#define new DEBUG_NEW
一旦你插入了这个指令，预处理程序就会在你使用new的地方插入DEBUG_NEW，剩下的事情由MFC完成。当你编译你的程序的发行版本时，DEBUG_NEW转变为简单的new操作，也不再生成文件名和行号信息。
注意：
在MFC 的以前版本（4.1或更早）中，你必须在调用IMPLEMENT_DYNCREATE或IMPLEMENT_SERIAL宏的语句后面加入#define语句，现在不再需要这样做了。
关于DEBUG_NEW宏的更多信息参见“Visual C++程序员指南”中的“MFC调试支持”。


 DECLARE_CONNECTION_MAP

DECLARE_CONNECTION_MAP( )

说明：
在你的程序中每一个COleControl的派生类都可以提供一个连接映射，以指定你的控制支持的附加的连接点。
如果你的控制支持附加的连接点，就在你的类声明的末尾使用DECLARE_CONNECTION_MAP宏。然后，在实现了类成员函数的.CPP文件中，加入BEGIN_CONNECTION_MAP宏，为控制的每个连接点加上CONNECTION_PART宏，最后用END_CONNECTION_MAP宏来声明连接映射的结束。

请参阅：
BEGIN_CONNECTION_PART, BEGIN_CONNECTION_MAP, CONNECTION_IID


 DECLARE_DISPATCH_MAP

DECLARE_DISPATCH_MAP( )

说明：
如果你的程序中的CCmdTarget的派生类支持OLE自动化，这个类必须提供一个调度映射以公开它的方法和属性。在你的类声明的末尾使用DECLARE_DISPATCH_MAP宏。然后，在实现了类成员函数的.CPP文件中加入BEGIN_DISPATCH_MAP宏。然后为你的类的每个公开的方法和属性加入宏入口（DISP_FUNCTION，DISP_PROPERTY等）。最后，使用END_DISPATCH_MAP宏。
注意：
如果你在DECLARE_DISPATCH_MAP之后定义了成员，你必须为它们指定一个新的访问类型（public，private或protected）。
AppWizard和ClassWizard帮助你创建自动化类并维护调度映射。参见关于“AppWizard”以及“ClassWizard：自动化支持”的文章。有关调度映射的更多信息参见“自动化服务器”。所有的文章都在“Visual C++程序员指南”中。

示例：
// DECLARE_DISPATCH_MAP的例子
class CMyDoc : public CDocument
{
// 成员声明
DECLARE_DISPATCH_MAP()
};

请参阅：
Dispatch Maps, BEGIN_DISPATCH_MAP, END_DISPATCH_MAP, DISP_FUNCTION, DISP_PROPERTY, DISP_PROPERTY_EX, DISP_DEFVALUE


 DECLARE_DYNAMIC

DECLARE_DYNAMIC( class_name )

参数：
class_name 类的实际名字（不用引号括起来）。

说明：
当你从CObject继承一个类的时候，这个宏加入了访问类的运行时信息的能力。
在类的头文件（.H）中加入DECLARE_DYNAMIC宏，然后在所有需要访问这个类的对象的.CPP模块中包含这个头文件。
如果你按照前面描述的方式使用了DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏，你就可以在运行时利用RUNTIME_CLASS宏和CObject::IsKindOf函数来确定对象所属的类。
如果在类声明中包含了DECLARE_DYNAMIC，那么必须在类的实现中包含IMPLEMENT_DYNAMIC宏。
有关DECLARE_DYNAMIC宏的更多信息参见“Visual C++程序员指南”中的“CObject类主题”。

请参阅：
IMPLEMENT_DYNAMIC, DECLARE_DYNCREATE, DECLARE_SERIAL, RUNTIME_CLASS, CObject::IsKindOf


 DECLARE_DYNCREATE

DECLARE_DYNCREATE( class_name )

参数：
class_name 类的实际名字（不用引号括起来）。

说明：
使用DECLARE_DYNCREATE宏可以使每个CObject的派生类的对象具有运行时动态创建的能力。框架利用这种能力来动态创建对象，例如，当它在串行化过程中从磁盘读取对象的时候。文档、视和框架类必须支持动态创建，因为框架需要动态地创建它们。
在类的.H模块中加入DECLARE_DYNCREATE宏，然后在每个需要访问这个类的对象的.CPP模块中包含这个模块。
如果在类声明中包含了DECLARE_DYNCREATE，那么必须在类的实现中包含IMPLEMENT_DYNCREATE宏。
关于DECLARE_DYNCREATE宏的更多信息参见“Visual C++程序员指南”中的“CObject类主题”。

请参阅：
DECLARE_DYNAMIC, IMPLEMENT_DYNAMIC, IMPLEMENT_DYNCREATE, RUNTIME_CLASS, CObject::IsKindOf


 DECLARE_EVENT_MAP

DECLARE_EVENT_MAP( )

说明：
你的程序中的每个COleControl的派生类都能够提供一个事件映射，以指定你的控制可能引发的事件。在你的类声明的末尾使用DECLARE_EVENT_MAP宏。然后，在实现类成员函数的.CPP文件中使用BEGIN_ENENT_MAP宏，再加入每个控制事件的宏入口，最后用END_EVENT_MAP宏来声明事件列表的结束。
关于事件映射的更多信息参见“Visual C++程序员指南”中的文章“ActiveX控制：事件”。

请参阅：
BEGIN_EVENT_MAP, END_EVENT_MAP, EVENT_CUSTOM, EVENT_CUSTOM_ID


 DECLARE_EVENTSINK_MAP

DECLARE_EVENTSINK_MAP( )

说明：
OLE容器能够提供事件接收映射以指定你的容器能够接收的事件。在你的类声明的末尾使用DECLARE_EVENTSINK_MAP宏。然后在实现了类成员函数的.CPP文件中使用BEGIN_EVENTSINK_MAP宏，再加入可以接收的事件的宏入口，最后用END_EVENTSINK_MAP宏来声明事件接收列表的结束。
关于事件接收映射的更多信息参见“Visual C++ 程序员指南”中的文章“ActiveX控制容器”。

请参阅：
BEGIN_EVENTSINK_MAP, END_EVENTSINK_MAP, ON_EVENT, ON_PROPNOTIFY


 DECLARE_MESSAGE_MAP

DECLARE_MESSAGE_MAP( )

说明：
你的程序中的每一个CCmdTarget的派生类都可以提供一个消息映射以处理消息。在你的类声明的末尾使用DECLARE_MESSAGE_MAP宏。然后，在实现了类成员函数的.CPP文件中加入BEGIN_MESSAGE_MAP宏，再加入每个消息处理函数的宏入口，最后使用END_MESSAGE_MAP宏。
注意：
如果你在DECLARE_MESSAGE_MAP之后定义了成员，那么你必须为它们指定新的访问类型（public，private 或protected）。
关于消息映射和DECLARE_MESSAGE_MAP宏的更多信息参见“Visual C++程序员指南”中的“消息处理”和“映射主题”。

示例：
// DECLARE_MESSAGE_MAP的例子
class CMyWnd : public CFrameWnd
{
// 成员声明
DECLARE_MESSAGE_MAP( )
};

请参阅：
BEGIN_MESSAGE_MAP, END_MESSAGE_MAP


 DECLARE_OLECREATE

DECLARE_OLECREATE( class_name )

#include <afxdisp.h>

参数：
class_name 类的实际名字（不用引号括起来）。

说明：
DECLARE_OLECREATE宏使得CCmdTarget的派生类的对象能够在OLE自动化的过程中被创建。这个宏使具有OLE能力的应用程序可以创建这种类型的对象。
在类的.H模块中加入DECLARE_OLECREATE宏，然后在每个需要访问这个类对象的.CPP模块中包含这个模块。
如果在类的声明中包含了DECLARE_OLECREATE宏，那么必须在类实现中加入IMPLEMENT_OLECREATE宏。使用了DECLARE_OLECREATE的类声明也必须使用DECLARE_DYNCREATE或DECLARE_SERIAL。

请参阅：
IMPLEMENT_OLECREATE, DECLARE_DYNCREATE, DECLARE_SERIAL


 DECLARE_OLECREATE_EX

DECLARE_OLECREATE_EX( class_name )

参数：
class_name 控制类的名字。

说明：
定义了控制类的类工厂和GetClassID成员函数。在不支持许可的控制类的头文件中使用这个宏。
注意这个宏与下面例子代码的作用相同：
BEGIN_OLEFACTORY(CSampleCtrl)
END_OLEFACTORY(CSampleCtrl)

请参阅：
BEGIN_OLEFACTORY, END_OLEFACTORY


 DECLARE_OLETYPELIB

DECLARE_OLETYPELIB( class_name )

参数：
class_name 与类型库相关的控制类的名字。

说明：
定义了控制类的GetTypeLib成员函数。在控制类的头文件中使用这个宏。

请参阅：IMPLEMENT_OLETYPELIB


 DECLARE_PROPPAGEIDS

DECLARE_PROPPAGEIDS( class_name )

参数：
class_name 拥有属性页的控制类的名字。

说明：
OLE控制能够提供一个属性页列表以显示它的属性。在你的类声明的末尾使用DECLARE_PROPPAGEIDS宏。然后，在定义了类成员函数的.CPP文件中使用BEGIN_PROPPAGEIDS宏，再加入控制的属性页的入口，最后用END_PROPPAGEIDS宏来声明属性页列表的结束。
关于属性页的更多信息参见“Visual C++程序员指南”中的文章“ActiveX控制：属性页”。

请参阅：
BEGIN_PROPPAGEIDS, END_PROPPAGEIDS


 DECLARE_SERIAL

DECLARE_SERIAL(class_name)

参数：
class_name 类的实际名字（不用引号括起来）。

说明：
DECLARE_SERIAL为可以串行化的CObject的派生类生成了必要的C++代码。
串行化是指将对象的内容写入文件或从文件读入对象的内容的过程。
在.H模块中使用DECLARE_SERIAL宏，然后在所有需要访问这个类的对象的.CPP模块中包含这个模块。
如果在类声明中包含了DECLARE_SERIAL宏，那么必须在类实现中包含IMPLEMENT_SERIAL宏。
DECLARE_SERIAL宏包含了DECLARE_DYNAMIC和DECLARE_DYNCREATE的所有功能。
你可以用AFX_API宏为那些使用了DECLARE_SERIAL和IMPLEMENT_SERIAL宏的类自动引出CArchive提取操作符。用下面的代码将类声明（在.H文件中）括起来：
#undef AFX_API
#define AFX_API AFX_EXT_CLASS
<这里是你的类声明>
#undef AFX_API
#define AFX_API
关于DECLARE_SERIAL宏的更多信息参见“Visual C++程序员指南”中的“CObject类主题”。

请参阅：
DECLARE_DYNAMIC, IMPLEMENT_SERIAL, RUNTIME_CLASS, CObject::IsKindOf


 DEFAULT_PARSE_COMMAND

DEFAULT_PARSE_COMMAND( fnName, mapClass )

参数：
fnName | 成员函数的名字。也是命令的名字。
mapClass | 函数映射的目的类的名字。

说明：
如果一个客户向CHttpServer对象提出的请求不包括命令，DEFAULT_PARSE_COMMAND宏就指示框架调入FnName参数指定的缺省页面。
DEFAULT_PARSE_COMMAND宏可以出现在解析映射的任何位置。
解析映射的例子参看ON_PARSE_COMMAND。

请参阅：
BEGIN_PARSE_MAP, ON_PARSE_COMMAND, ON_PARSE_COMMAND_PARAMS, END_PARSE_MAP, CHttpServer


 DestructElements

template< class TYPE >
void AFXAPI DestructElements( TYPE* pElements, int nCount );

参数：
TYPE | 指定了要销毁的元素类型的模板参数。
pElements | 指向元素的指针。
nCount | 要销毁的元素的数目。

说明：
当元素要被销毁时，CArray，CList和 CMap 的类成员调用这个函数。
缺省的实现不做任何操作。有关这个函数以及其它帮助函数的实现的信息参见Visual C++程序员指南中的文章“集合：如何生成类型安全的集合”。

请参阅：CArray, CList, CMap


 DFX_Binary

void AFXAPI DFX_Binary(
CDaoFieldExchange* pFX,
LPCTSTR szName,
CByteArray& value,
int nPreAllocSize = AFX_DAO_BINARY_DEFAULT_SIZE,
DWORD dwBindOptions = 0
);

参数：
pFX | 指向CDaoFieldExchange类的对象的指针。这个对象包含函数调用的环境信息。有关CDaoFieldExchange对象能够指定的操作的附加信息参见Visual C++程序员指南中的文章“DAO记录字段交换：DFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员中保存的值——要被传送的值。对于从记录集到数据源的数据传送，CByteArray类型的值是从指定的数据成员中获取的。对于从数据源到记录集的数据传送，该值是保存在指定的数据成员中的。
nPreAllocSize | 应用框架预分配这么多内存。如果你的数据更多，框架会在必要时分配更多的内存。要获得更好的性能，将这个大小设为一个足够大的值以避免重分配。在AFXDAO.H中，缺省的大小被定义为AFX_DAO_BINARY_DEFAULT_SIZE。
dwBindOptions | 使你能够享受MFC的双缓冲机制好处的选项，该机制能够检测发生了变化的记录集字段。缺省值AFX_DAO_DISABLE_FIELD_CACHE并不使用双缓冲机制，你必须自己调用SetFieldDirty和SetFieldNull。另外一个可能值AFX_DAO_ENABLE_FIELD_CACHE使用双缓冲机制，你不必进行额外的操作以将一个字段标记为脏的或NULL。由于性能和内存方面的原因，不要使用这个值，除非你的二进制数据确实很小。 这些选项在Visual C++程序员指南的“DAO记录字段交换：双缓冲记录”一文中有进一步的解释。 注意： 可以通过设置CDaoRecordset::m_bCheckCacheForDirtyFields来控制是否对数据使用双缓冲机制。

说明：
DFX_Binary函数在CDaoRecordset对象的字段数据成员和数据源中记录的列之间交换字节数组。数据在DAO中的DAO_BYTES类型和记录集中的CByteArray类型之间进行映射。

示例：参见 DFX_Text。

请参阅：
DFX_Text, DFX_Bool, DFX_Currency, DFX_Long, DFX_Short, DFX_Single, DFX_Double, DFX_DateTime, DFX_Byte, DFX_LongBinary, CDaoFieldExchange::SetFieldType


 DFX_Bool

void AFXAPI DFX_Bool(
CDaoFieldExchange* pFX,
LPCTSTR szName,
BOOL& value,
DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE
);

参数：
pFX | 指向CDaoFieldExchange类的对象的指针。这个对象包含函数调用的环境信息。有关CDaoFieldExchange对象能够指定的操作的附加信息参见“Visual C++程序员指南”中的文章“DAO记录字段交换：DFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员中保存的值——要被传送的值。对于从记录集到数据源的数据传送，BOOL类型的值是从指定的数据成员中获取的。对于从数据源到记录集的数据传送，该值是保存在指定的数据成员中的。
dwBindOptions | 使你能够享受MFC的双缓冲机制好处的选项，该机制能够检测发生了变化的记录集字段。缺省值AFX_DAO_ENABLE_FIELD_CACHE使用双缓冲机制。另外一个可能值是AFX_DAO_DISABLE_FIELD_CACHE。如果你指定了这个值，MFC并不对这个字段进行检查。你必须自己调用SetFieldDirty和SetFieldNull。 这些选项在“Visual C++程序员指南”的“DAO记录集：动态记录绑定”一文中有进一步的解释。 注意： 可以通过设置CDaoRecordset::m_bCheckCacheForDirtyFields来控制是否对数据使用双缓冲机制。

说明：
DFX_BOOL函数在CDaoRecordset对象的字段数据成员和数据源中记录的列之间交换布尔数据。数据在DAO中的DAO_BOOL类型和记录集中的BOOL类型之间进行映射。

示例：参见 DFX_Text。

请参阅：
DFX_Text, DFX_Long, DFX_Currency, DFX_Short, DFX_Single, DFX_Double, DFX_DateTime, DFX_Byte, DFX_Binary, DFX_LongBinary, CDaoFieldExchange::SetFieldType


 DFX_Byte

void AFXAPI DFX_Byte(
CDaoFieldExchange* pFX,
LPCTSTR szName,
BYTE& value,
DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE
);

参数：
pFX | 指向CDaoFieldExchange类的对象的指针。这个对象包含函数调用的环境信息。有关CDaoFieldExchange对象能够指定的操作的附加信息参见“Visual C++程序员指南”中的文章“DAO记录字段交换：DFX如何工作”。
szName | 数据列的名字。
value | 指定数据成员中保存的值——要被传送的值。对于从记录集到数据源的数据传送，BYTE类型的值是从指定的数据成员中获取的。对于从数据源到记录集的数据传送，该值是保存在指定的数据成员中的。
dwBindOptions | 使你能够享受MFC的双缓冲机制好处的选项，该机制能够检测发生了变化的记录集字段。缺省值AFX_DAO_ENABLE_FIELD_CACHE使用双缓冲机制。另外一个值可能是AFX_DAO_DISABLE_FIELD_CACHE。如果你指定了这个值，MFC并不对这个字段进行检查。你必须自己调用SetFieldDirty和SetFieldNull。 这些选项在“Visual C++程序员指南”的“DAO记录集：动态记录绑定”一文中有进一步的解释。 注意： 可以通过设置CDaoRecordset::m_bCheckCacheForDirtyFields来控制是否对数据使用双缓冲机制。

说明：
DFX_BYTE函数在CDaoRecordset对象的字段数据成员和数据源中记录的列之间交换单字节数据。数据在DAO中的DAO_BYTES类型和记录集中的BYTE类型之间进行映射。

示例：参见 DFX_Text。

请参阅：
DFX_Text, DFX_Bool, DFX_Currency, DFX_Long, DFX_Short, DFX_Single, DFX_Double, DFX_DateTime, DFX_Binary, DFX_LongBinary, CDaoFieldExchange::SetFieldType


 DFX_Currency

void AFXAPI DFX_Currency(
CDaoFieldExchange* pFX,
LPCTSTR szName,
COleCurrency& value,
DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE
);

参数：
pFX | 指向CDaoFieldExchange类的对象的指针。这个对象包含函数调用的环境信息。有关CDaoFieldExchange对象能够指定的操作的附加信息参见“Visual C++程序员指南”中的文章“DAO记录字段交换：DFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员中保存的值——要被传送的值。对于从记录集到数据源的数据传送，该COleCurrency值是从指定的数据成员中获取的。对于从数据源到记录集的数据传送，该值是保存在指定的数据成员中的。
dwBindOptions | 使你能够享受MFC的双缓冲机制的好处的选项，该机制能够检测发生了变化的记录集字段。缺省值AFX_DAO_ENABLE_FIELD_CACHE使用双缓冲机制。另外一个可能值是AFX_DAO_DISABLE_FIELD_CACHE。如果你指定了这个值，MFC并不对这个字段进行检查。你必须自己调用SetFieldDirty和SetFieldNull。 这些选项在“Visual C++程序员指南”的“DAO记录集：动态记录绑定”一文中有进一步的解释。 注意： 可以通过设置CDaoRecordset::m_bCheckCacheForDirtyFields来控制是否对数据使用双缓冲机制。

说明：
DFX_Currency函数在CDaoRecordset对象的字段数据成员和数据源中记录的列之间交换货币数据。数据在DAO中的DAO_CURRENCY类型和记录集中的COleCurrency类型之间进行映射。

示例：参见 DFX_Text。

请参阅：
DFX_Text, DFX_Bool, DFX_DateTime, DFX_Long, DFX_Short, DFX_Single, DFX_Double, DFX_Byte, DFX_Binary, DFX_LongBinary, CDaoFieldExchange::SetFieldType


 DFX_DateTime

void AFXAPI DFX_DateTime(
CDaoFieldExchange* pFX,
LPCTSTR szName,
COleDateTime& value,
DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE
);

参数：
pFx | 指向CDaoFieldExchange类的对象的指针。这个对象包含函数调用的环境信息。有关CDaoFieldExchange对象能够指定的操作的附加信息参见“Visual C++程序员指南”中的文章“DAO记录字段交换：DFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员中保存的值——要被传送的值。这个函数保存着对一个COleDateTime对象的引用。对于从记录集到数据源的数据传送，该值是从指定的数据成员中获取的。对于从数据源到记录集的数据传送，该值是保存在指定的数据成员中的。
dwBindOptions | 使你能够享受MFC的双缓冲机制的好处的选项，该机制能够检测发生了变化的记录集字段。缺省值AFX_DAO_ENABLE_FIELD_CACHE使用双缓冲机制。另外一个可能值是AFX_DAO_DISABLE_FIELD_CACHE。如果你指定了这个值，MFC并不对这个字段进行检查。你必须自己调用SetFieldDirty和SetFieldNull。 这些选项在“Visual C++程序员指南”的“DAO记录集：动态记录绑定”一文中有进一步的解释。 注意： 可以通过设置CDaoRecordset::m_bCheckCacheForDirtyFields来控制是否对数据使用双缓冲机制。

说明：
DFX_DateTime函数在CDaoRecordset对象的字段数据成员和数据源中记录的列之间交换日期和时间数据。数据在DAO中的DAO_DATE类型和记录集中的COleDateTime类型之间进行映射。
注意：
COleDateTime取代了DAO中用于相同目的的CTime和TIMESTAMP_STRUCT。但是CTime和TIMESTAMP_STRUCT仍被用于基于ODBC的数据访问类。

示例：参见 DFX_Text。

请参阅：
DFX_Text, DFX_Bool, DFX_Currency, DFX_Long, DFX_Short, DFX_Single, DFX_Double, DFX_Byte, DFX_Binary, DFX_LongBinary, CDaoFieldExchange::SetFieldType


 DFX_Double

void AFXAPI DFX_Double(
CDaoFieldExchange* pFX,
LPCTSTR szName,
double& value,
DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE
);

参数：
pFx | 指向CDaoFieldExchange类的对象的指针。这个对象包含函数调用的环境信息。有关CDaoFieldExchange对象能够指定的操作的附加信息参见“Visual C++程序员指南”中的文章“DAO记录字段交换：DFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员中保存的值——要被传送的值。对于从记录集到数据源的数据传送，该double值是从指定的数据成员中获取的。对于从数据源到记录集的数据传送，该值是保存在指定的数据成员中的。
dwBindOptions | 使你能够享受MFC的双缓冲机制的好处的选项，该机制能够检测发生了变化的记录集字段。缺省值AFX_DAO_ENABLE_FIELD_CACHE使用双缓冲机制。另外一个可能值是AFX_DAO_DISABLE_FIELD_CACHE。如果你指定了这个值，MFC并不对这个字段进行检查。你必须自己调用SetFieldDirty和SetFieldNull。 这些选项在“Visual C++程序员指南”的“DAO记录集：动态记录绑定”一文中有进一步的解释。 注意： 可以通过设置CDaoRecordset::m_bCheckCacheForDirtyFields来控制是否对数据使用双缓冲机制。

说明：
DFX_Double函数在CDaoRecordset对象的字段数据成员和数据源中记录的列之间交换double和float数据。数据在DAO中的DAO_R8类型和记录集中的double以及float类型之间进行映射。

示例：参见 DFX_Text。

请参阅：
DFX_Text, DFX_Bool, DFX_Currency, DFX_Long, DFX_Short, DFX_Single, DFX_DateTime, DFX_Byte, DFX_Binary, DFX_LongBinary, CDaoFieldExchange::SetFieldType


 DFX_Long

void AFXAPI DFX_Long(
CDaoFieldExchange* pFX,
LPCTSTR szName,
long& value,
DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE
);

参数：
pFx | 指向CDaoFieldExchange类的对象的指针。这个对象包含函数调用的环境信息。有关CDaoFieldExchange对象能够指定的操作的附加信息参见“Visual C++程序员指南”中的文章“DAO记录字段交换：DFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员中保存的值——要被传送的值。对于从记录集到数据源的数据传送，该long值是从指定的数据成员中获取的。对于从数据源到记录集的数据传送，该值是保存在指定的数据成员中的。
dwBindOptions | 使你能够享受MFC的双缓冲机制的好处的选项，该机制能够检测发生了变化的记录集字段。缺省值AFX_DAO_ENABLE_FIELD_CACHE使用双缓冲机制。另外一个可能值是AFX_DAO_DISABLE_FIELD_CACHE。如果你指定了这个值，MFC并不对这个字段进行检查。你必须自己调用SetFieldDirty和SetFieldNull。 这些选项在“Visual C++程序员指南”的“DAO记录集：动态记录绑定”一文中有进一步的解释。
注意：
可以通过设置CDaoRecordset::m_bCheckCacheForDirtyFields来控制是否对数据使用双缓冲机制。

说明：
DFX_Long函数在CDaoRecordset对象的字段数据成员和数据源中记录的列之间交换长整型数据。数据在DAO中的DAO_I4类型和记录集中的long类型之间进行映射。

示例：参见 DFX_Text。

请参阅：
DFX_Text, DFX_Bool, DFX_Currency, DFX_Short, DFX_Single, DFX_Double, DFX_DateTime, DFX_Byte, DFX_Binary, DFX_LongBinary, CDaoFieldExchange::SetFieldType


 DFX_LongBinary

void AFXAPI DFX_LongBinary(
CDaoFieldExchange* pFX,
LPCTSTR szName,
CLongBinary& value,
DWORD dwPreAllocLenth = AFX_DAO_LONGBINARY_DEFAULT_SIZE,
DWORD dwBindOptions = 0
);

参数：
pFx | 指向CDaoFieldExchange类的对象的指针。这个对象包含函数调用的环境信息。有关CDaoFieldExchange对象能够指定的操作的附加信息参见“Visual C++程序员指南”中的文章“DAO记录字段交换：DFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员中保存的值——要被传送的值。对于从记录集到数据源的数据传送，CLongBinary类型的值是从指定的数据成员中获取的。对于从数据源到记录集的数据传送，该值是保存在指定的数据成员中的。nPreAllocSize应用框架预分配这么多内存。如果你的数据更多，框架会在必要时分配更多的内存。如果要获得更好的性能，将这个大小设为一个足够大的值以避免重分配。
dwBindOptions | 使你能够享受MFC的双缓冲机制的好处的选项，该机制能够检测发生了变化的记录集字段。缺省值AFX_FIELD_CACHE并不使用双缓冲机制，你必须自己调用SetFieldDirty和SetFieldNull。另外一个可能值AFX_DAO_ENABLE_FIELD_CACHE使用双缓冲机制，不必进行额外的操作以将一个字段标记为脏的或NULL。由于性能和内存方面的原因，不要使用这个值，除非你的二进制数据确实很小。 这些选项在“Visual C++程序员指南”的“DAO记录字段交换：双缓冲记录”一文中有进一步的解释。 注意： 可以通过设置CDaoRecordset::m_bCheckCacheForDirtyFields来控制是否对数据使用双缓冲机制。

说明：
重点：我们推荐使用DFX_Binary来代替这个函数。DFX_LongBinary是为了与MFC的ODBC类兼容而提供的。
DFX_LongBinary函数在CDaoRecordset对象的字段数据成员和数据源中记录的列之间交换大二进制对象（BLOB）数据。数据在DAO中的DAO_BYTES类型和记录集中的CLongBinary类型之间进行映射。

示例：参见DFX_Text。

请参阅：
DFX_Text, DFX_Bool, DFX_Currency, DFX_Long, DFX_Short, DFX_Single, DFX_Double, DFX_DateTime, DFX_Byte, CDaoFieldExchange::SetFieldType, CLongBinary


 DFX_Short

void AFXAPI DFX_Short(
CDaoFieldExchange* pFX,
LPCTSTR szName,
short& value,
DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE
);

参数：
pFx | 指向CDaoFieldExchange类的对象的指针。这个对象包含函数调用的环境信息。有关CDaoFieldExchange对象能够指定的操作的附加信息参见“Visual C++程序员指南”中的文章“DAO记录字段交换：DFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员中保存的值——要被传送的值。对于从记录集到数据源的数据传送，该short值是从指定的数据成员中获取的。对于从数据源到记录集的数据传送，该值是保存在指定的数据成员中的。
dwBindOptions | 使你能够享受MFC的双缓冲机制的好处的选项，该机制能够检测发生了变化的记录集字段。缺省值AFX_DAO_ENABLE_FIELD_CACHE使用双缓冲机制。另外一个可能值是AFX_DAO_DISABLE_FIELD_CACHE。如果你指定了这个值，MFC并不对这个字段进行检查。你必须自己调用SetFieldDirty和SetFieldNull。 这些选项在“Visual C++程序员指南”的“DAO记录集：动态记录绑定”一文中有进一步的解释。 注意： 可以通过设置CDaoRecordset::m_bCheckCacheForDirtyFields来控制是否对数据使用双缓冲机制。

说明：
DFX_Short函数在CDaoRecordset对象的字段数据成员和数据源中记录的列之间交换短整型数据。数据在DAO中的DAO_I2类型和记录集中的short类型之间进行映射。

示例：参见DFX_Text。

请参阅：
DFX_Text, DFX_Bool, DFX_Currency, DFX_Long, DFX_Single, DFX_Double, DFX_DateTime, DFX_Byte, DFX_Binary, DFX_LongBinary, CDaoFieldExchange::SetFieldType


 DFX_Single

void AFXAPI DFX_Single(
CDaoFieldExchange* pFX,
LPCTSTR szName,
float& value,
DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE
);

参数：
pFx | 指向CDaoFieldExchange类的对象的指针。这个对象包含函数调用的环境信息。有关CDaoFieldExchange对象能够指定的操作的附加信息参见“Visual C++程序员指南”中的文章“DAO记录字段交换：DFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员中保存的值——要被传送的值。对于从记录集到数据源的数据传送，该float值是从指定的数据成员中获取的。对于从数据源到记录集的数据传送，该值是保存在指定的数据成员中的。
dwBindOptions | 使你能够享受MFC的双缓冲机制的好处的选项，该机制能够检测发生了变化的记录集字段。缺省值AFX_DAO_ENABLE_FIELD_CACHE使用双缓冲机制。另外一个可能值是AFX_DAO_DISABLE_FIELD_CACHE。如果你指定了这个值，MFC并不对这个字段进行检查。你必须自己调用SetFieldDirty和SetFieldNull。 这些选项在“Visual C++程序员指南”的“DAO记录集：动态记录绑定”一文中有进一步的解释。 注意： 可以通过设置CDaoRecordset::m_bCheckCacheForDirtyFields来控制是否对数据使用双缓冲机制。

说明：
DFX_Single函数在CDaoRecordset对象的字段数据成员和数据源中记录的列之间交换浮点数据。数据在DAO中的DAO_R4类型和记录集中的float类型之间进行映射。

示例：参见DFX_Text。

请参阅：
DFX_Text, DFX_Bool, DFX_Currency, DFX_Long, DFX_Short, DFX_Double, DFX_DateTime, DFX_Byte, DFX_Binary, DFX_LongBinary, CDaoFieldExchange::SetFieldType


 DFX_Text

void AFXAPI DFX_Text(
CDaoFieldExchange* pFX,
LPCTSTR szName,
CString& value,
int nPreAllocLength = AFX_DAO_TEXT_DEFAULT_SIZE,
DWORD dwBindOptions = AFX_DAO_ENABLE_FIELD_CACHE
);

参数：
pFx | 指向CDaoFieldExchange类的对象的指针。这个对象包含函数调用的环境信息。有关CDaoFieldExchange对象能够指定的操作的附加信息参见Visual C++程序员联机指南中的文章“DAO记录字段交换：DFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员中保存的值——要被传送的值。对于从记录集到数据源的数据传送，该CString值是从指定的数据成员中获取的。对于从数据源到记录集的数据传送，该值是保存在指定的数据成员中的。nPreAllocSize应用框架预分配这么多内存。如果你的数据更多，框架会在必要时分配更多的空间。如果要获得更好的性能，将这个大小设为一个足够大的值以避免重分配。
dwBindOptions | 使你能够享受MFC的双缓冲机制的好处的选项，该机制能够检测发生了变化的记录集字段。缺省值AFX_DAO_ENABLE_FIELD_CACHE使用双缓冲机制。另外一个可能值是AFX_DAO_DISABLE_FIELD_CACHE。如果你指定了这个值，MFC并不对这个字段进行检查。你必须自己调用SetFieldDirty和SetFieldNull。 这些选项在“Visual C++程序员指南”的“DAO记录集：动态记录绑定”一文中有进一步的解释。 注意： 可以通过设置CDaoRecordset::m_bCheckCacheForDirtyFields来控制是否对数据使用双缓冲机制。

说明：
DFX_TEXT函数在CDaoRecordset对象的字段数据成员和数据源中记录的列之间交换CString数据。数据在DAO中的DAO_CHAR（如果定义了_UNICODE则为DAO_WCHAR）与记录集中的CString之间映射。

示例：
这个例子演示了对DFX_TEXT的一些调用。同时注意对CDaoFieldExchange::SetFieldType的两个调用。通常ClassWizard把对SetFieldType和相关DFX的调用写入第二个调用。你必须编写第一个调用及其DFX调用。建议你将所有的参数放在“//{{AFX_FIELD_MAP”注释之前。必须将参数写在注释之外。
// DFX_Text的例子
void CSections::DoFieldExchange(CDaoFieldExchange* pFX)
{
pFX->SetFieldType(CDaoFieldExchange::param);
DFX_Text(pFX, "Name", m_strNameParam);
//{{AFX_FIELD_MAP(CSections)
pFX->SetFieldType(CDaoFieldExchange::outputColumn);
DFX_Text(pFX, "CourseID", m_strCourseID);
DFX_Text(pFX, "InstructorID", m_strInstructorID);
DFX_Short(pFX, "LabFee", m_nRoomNo);
DFX_Text(pFX, "LabFee", m_strSchedule);
DFX_Short(pFX, "SectionNo", m_nSectionNo);
DFX_Currency(pFX, "LabFee", m_currLabFee);
//}}AFX_FIELD_MAP
}

请参阅：
DFX_Bool, DFX_Long, DFX_Currency, DFX_Short, DFX_Single, DFX_Double, DFX_DateTime, DFX_Byte, DFX_Binary, DFX_LongBinary, CDaoFieldExchange::SetFieldType


 DISP_DEFVALUE

DISP_DEFVALUE( theClass, pszName )

#include <afxdisp.h>

参数：
theClass | 类的名字。
pszName | 代表了对象的值的属性的外部名。

说明：
这个宏使一个已有的属性成为对象的缺省值。使用缺省值可以简化Visual Basic应用程序中的自动化对象的设计。
对象的缺省值指在引用对象时，在没有指定属性或成员函数的情况下而获得或设置的值。

请参阅：
调度映射, DECLARE_DISPATCH_MAP, DISP_PROPERTY_EX, DISP_FUNCTION, BEGIN_DISPATCH_MAP, END_DISPATCH_MAP


 DISP_FUNCTION

DISP_FUNCTION( theClass, pszName, pfnMember, vtRetVal, vtsParams )

#include <afxdisp.h>

参数：
theClass | 类的名字。
pszName | 函数的外部名字。
pfnMember | 成员函数的名字。
vtRetVal | 指定了函数返回类型的值。
vtsParams | 指定了函数参数表的一个或多个常量的用空格分隔的列表。

说明：
DISP_FUNCTION宏被在调度映射中使用，用来定义一个OLE自动化函数。
vtRetVal参数属于VARTYPE类型。这个参数的可能取值来自VARENUM枚举，如下：
符号 | 返回类型
VT_EMPTY | void
VT_I2 | short
VT_I4 | long
VT_R4 | float
VT_R8 | double
VT_CY | CY
VT_DATE | DATE
VT_BSTR | BSTR
VT_DISPATCH | LPDISPATCH
VT_ERROR | SCODE
VT_BOOL | BOOL
VT_VARIANT | VARIANT
VT_UNKNOWN | LPUNKNOWN

vtsParams参数是VTS_ 常量中取值的用空格分隔的列表。有空格分隔的一个或多个取值的列表指定了函数的参数列表。例如：
VTS_I2 VTS_PI2
指定了包含一个短整数以及后面的短整数指针的列表。
VTS_ 常量及其含义如下：
符号 | 参数类型
VTS_I2 | short
VTS_I4 | long
VTS_R4 | float
VTS_R8 | double
VTS_CY | Const CY or CY*
VTS_DATE | DATE
VTS_BSTR | LPCSTR
VTS_DISPATCH | LPDISPATCH
VTS_SCODE | SCODE
VTS_BOOL | BOOL
VTS_VARIANT | Const VARIANT* or VARIANT&
VTS_UNKNOWN | LPUNKNOWN
VTS_PI2 | short*
VTS_PI4 | long*
VTS_PR4 | float*
VTS_PR8 | double*
VTS_PCY | CY*
VTS_PDATE | DATE*
VTS_PBSTR | BSTR*
VTS_PDISPATCH | LPDISPATCH*
VTS_PSCODE | SCODE*
VTS_PBOOL | BOOL*
VTS_PVARIANT | VARIANT*
VTS_PUNKNOWN | LPUNKNOWN*

请参阅：
调度映射, DECLARE_DISPATCH_MAP, DISP_PROPERTY, DISP_PROPERTY_EX, BEGIN_DISPATCH_MAP, END_DISPATCH_MAP


 DISP_PROPERTY

DISP_PROPERTY( theClass, pszName, memberName, vtPropType )

#include <afxdisp.h>

参数：
theClass | 类的名字。
pszName | 属性的外部名字。
memberName | 存储属性的成员变量的名字。
vtPropType | 指定属性类型的值。

说明：
DISP_PROPERTY用在调度映射中，用于定义一个OLE自动化属性。
vtPropType参数属于VARTYPE类型。这个参数的取值可能来自VARENUM枚举：
符号 | 属性类型
VT_I2 | short
VT_I4 | long
VT_R4 | float
VT_R8 | double
VT_CY | CY
VT_DATE | DATE
VT_BSTR | CString
VT_DISPATCH | LPDISPATCH
VT_ERROR | SCODE
VT_BOOL | BOOL
VT_VARIANT | VARIANT
VT_UNKNOWN | LPUNKNOWN
当一个外部客户改变了这个属性的时候，由memberName指定的成员变量的值就发生了改变。对于这个改变，没有任何通知。

请参阅：
调度映射, DECLARE_DISPATCH_MAP, DISP_PROPERTY_EX, DISP_FUNCTION, BEGIN_DISPATCH_MAP, END_DISPATCH_MAP


 DISP_PROPERTY_EX

DISP_PROPERTY_EX( theClass, pszName, memberGet, memberSet, vtPropType )

#include <afxdisp.h>

参数：
theClass | 类的名字。
pszName | 属性的外部名字。
memberGet | 用于获取属性的成员变量的名字。
memberSet | 用于设置属性的成员变量的名字。
vtPropType | 指定属性类型的值。

说明：
DISP_PROPERTY_EX用在调度映射中，用于定义一个OLE自动化属性并命名获取、设置该属性的函数。
memberGet和memberSet函数具有vtPropType参数所决定的签名。memberGet函数没有参数，它返回vtPropType指定的类型的值。memberSet函数具有一个vtPropType所指定的类型的参数，它没有返回值。
vtPropType参数属于VARTYPE类型。这个参数的可能取值来自VARENUM枚举。有关这些值的列表参见对DISP_FUNCTION中vtRetVal参数的说明。注意在DISP_FUNCTION中列出的VT_EMPTY不能作为属性数据类型。

请参阅：
调度映射, DECLARE_DISPATCH_MAP, DISP_PROPERTY, DISP_FUNCTION, BEGIN_DISPATCH_MAP, END_DISPATCH_MAP


 DISP_PROPERTY_NOTIFY

DISP_PROPERTY_NOTIFY(theClass, szExternalName, memberName, pfnAfterSet, vtPropType)

#include <afxdisp.h>

参数：
theClass | 类的名字。
szExternalName | 属性的外部名字。
memberName | 保存属性的成员变量的名字。
pfnAfterSetszExternalName | 的通知函数的名字。
vtPropType | 指定了属性类型的值。

说明：
DISP_PROPERTY_NOTIFY宏用在调度映射中，用来定义一个带通知的OLE自动化属性。与用DISP_PROPERTY定义的属性不同，当属性改变时，用DISP_PROPERTY_NOTIFY定义的属性自动地调用pfnAfterSet指定的函数。
vtPropType参数属于VARTYPE类型。这个参数的可能取值来自VARENUM枚举：
符号 | 属性类型
VT_I2 | short
VT_I4 | long
VT_R4 | float
VT_R8 | double
VT_CY | CY
VT_DATE | DATE
VT_BSTR | CString
VT_DISPATCH | LPDISPATCH
VT_ERROR | SCODE
VT_BOOL | BOOL
VT_VARIANT | VARIANT
VT_UNKNOWN | LPUNKNOWN

请参阅：调度映射, DISP_PROPERTY, DISP_FUNCTION


 DISP_PROPERTY_PARAM

DISP_PROPERTY_PARAM(theClass, pszExternalName, pfnGet, pfnSet, vtPropType, vtsParams)

#include <afxdisp.h>

参数：
theClass | 类的名字。
pszExternalName | 属性的外部名字。
pfnGet | 用于获取属性的成员函数名。
pfnSet | 用于设置属性的成员函数名。
vtPropType | 指定属性类型的值。
vtsParams | 用空格分隔的VTS_变量参数类型字符串，每一个代表一个参数。

说明：
这个宏定义了分别用Get和Set成员函数访问的属性。与DISP_PROPERTY_EX宏不同，这个宏允许你为属性指定一个参数列表。这在实现具有索引或参数的属性时非常有用。
例如，考虑下面对get和set成员函数的声明，它允许用户在访问属性的时候指定行和列：
afx_msg short GetArray(short row, short column);
afx_msg short SetArray(short row, short column, short nNewValue);
这些与控制的调度映射中的DISP_PROPERTY_PARAM宏相对应：
DISP_PROPERTY_PARAM(CMyCtrl, "Array", GetArray, SetArray, VT_I2, VTS_I2 VTS_I2)
另一个例子，考虑下面的get和set成员函数：
LPDISPATCH CMyObject::GetItem(short index1, short index2, short index3);
void CMyObject::SetItem(short index1, short index2, short index3, LPDISPATCHnewValue);
这些与控制的调度映射中的DISP_PROPERTY_PARAM宏相对应：
DISP_PROPERTY_PARAM( CMyObject, "item", GetItem, SetItem, VT_DISPATCH, VTS_I2 VTS_I2 VTS_I2 )

请参阅：调度映射, DISP_PROPERTY_EX


 DumpElements

template< class TYPE >
void AFXAPI DumpElements( CDumpContext& dc, const TYPE* pElements, int nCount );

参数：
dc | 用于转储元素的环境。
TYPE | 指定元素类型的模板参数。
pElements | 指向要转储的元素的指针。
nCount | 要转储的元素的数目。

说明：
重载这个函数以为你的集合中的元素提供面向流的文本形式的诊断输出。如果转储的深度大于0，则CArray::Dump，CList::Dump和CMap::Dump都会调用这个函数。
缺省的实现不做任何操作。如果你的集合的元素是从CObject继承的，通常你的重载函数应当在集合的元素之间重复，按次序为每个元素调用Dump。
有关诊断和Dump函数的信息参见“Visual C++程序员指南”中的“MFC调试支持”。

请参阅：
CDumpContext::SetDepth, CObject::Dump, CArray, CList, CMap


 DYNAMIC_DOWNCAST

DYNAMIC_DOWNCAST( class, pointer )

参数：
class | 类的名字。
pointer | 将要被强制转换为class类对象指针的指针。

说明：
DYNAMIC_DOWNCAST宏提供了将一个指针强制转换为指向一个类的对象的指针的简单方式，同时检查这种强制转换是否合法。这个宏将会把pointer参数强制转换为class参数类型的对象指针。
如果pointer参数所指向的对象就是class类的对象，这个宏将返回一个适当的指针。如果这种转换不合法，这个宏将返回NULL。

请参阅：STATIC_DOWNCAST


 END_CATCH

END_CATCH

说明：
标记了上一个CATCH或AND_CATCH块的结束。
关于END_CATCH宏的更多信息参见“Visual C++程序员指南”中的章节“异常”。

请参阅：
TRY, CATCH, AND_CATCH, THROW, THROW_LAST


 END_CATCH_ALL

END_CATCH_ALL

说明：
标记了上一个CATCH_ALL或AND_CATCH_ALL块的结束。

请参阅：
TRY, CATCH_ALL, AND_CATCH_ALL, THROW, THROW_LAST


 END_CONNECTION_MAP

END_CONNECTION_MAP( )

说明：
使用END_CONNECTION_MAP宏以结束你的连接映射的定义。

请参阅：
BEGIN_CONNECTION_MAP, DECLARE_CONNECTION_MAP


 END_CONNECTION_PART

END_CONNECTION_PART( localClass )

参数：
localClass 指定了实现连接点的本地类的名字。

说明：
使用END_CONNECTION_PART宏以结束你的连接点的定义。

请参阅：
BEGIN_CONNECTION_PART, DECLARE_CONNECTION_MAP


 END_DISPATCH_MAP

END_DISPATCH_MAP( )

#include <afxdisp.h>

说明：
使用END_DISPATCH_MAP宏以结束你的调度映射的定义。它必须与BEGIN_DISPATCH_ MAP结合使用。

请参阅：
调度映射, DECLARE_DISPATCH_MAP, BEGIN_DISPATCH_MAP, DISP_FUNCTION, DISP_PROPERTY, DISP_PROPERTY_EX, DISP_DEFVALUE


 END_EVENT_MAP

END_EVENT_MAP( )

说明：
使用END_EVENT_MAP宏以结束你的事件映射的定义。

请参阅：
DECLARE_EVENT_MAP, BEGIN_EVENT_MAP


 END_EVENTSINK_MAP

END_EVENTSINK_MAP( )

说明：
使用END_EVENTSINK_MAP宏以结束你的事件接收映射的定义。

请参阅：
DECLARE_EVENTSINK_MAP, BEGIN_EVENTSINK_MAP


 END_MESSAGE_MAP

END_MESSAGE_MAP( )

说明：
使用END_MESSAGE_MAP宏以结束你的消息映射的定义。
有关消息映射和END_MESSAGE_MAP宏的更多信息参见“Visual C++程序员指南”中的“消息处理和映射”主题。

请参阅：
DECLARE_MESSAGE_MAP, BEGIN_MESSAGE_MAP, MessageMap Function Categories


 END_OLEFACTORY

END_OLEFACTORY( class_name )

参数：
class_name 类工厂所属的控制类的名字。

说明：
使用END_OLEFACTORY宏以结束你的控制类工厂的定义。

请参阅：
BEGIN_OLEFACTORY, DECLARE_OLECREATE_EX


 END_PARSE_MAP

END_PARSE_MAP( theClass )

参数：
theClass 指定了拥有这个解析映射的类的名字。

说明：
使用END_PARSE_MAP宏来结束你的解析映射的定义。它必须与BEGIN_PARSE_MAP结合使用。
解析映射的例子参见ON_PARSE_COMMAND。

请参阅：
BEGIN_PARSE_MAP, ON_PARSE_COMMAND, ON_PARSE_COMMAND_PARAMS, DEFAULT_PARSE_COMMAND, CHttpServer


 END_PROPPAGEIDS

END_PROPPAGEIDS( class_name )

参数：
class_name 拥有这个属性页的控制类的名字。

说明：
使用END_PROPPAGEIDS宏以结束你的属性页ID列表的定义。

请参阅：
DECLARE_PROPPAGEIDS, BEGIN_PROPPAGEIDS


 EVENT_CUSTOM

EVENT_CUSTOM( pszName, pfnFire, vtsParams )

参数：
pszName | 事件的名字。
pfnFire | 事件引发的函数的名字。
vtsParams | 用空格分隔的一个或多个常量的列表，指定了函数的参数列表。

说明：
使用EVENT_CUSTOM宏来为一个自定义事件定义事件映射入口。
vtsParams参数是来自VTS_常量的值的列表，用空格分隔。其中的一个或多个值指定了函数的参数列表。例如：
VTS_COLOR VTS_FONT
指定了包含短整数以及后面的BOOL值的列表。
VTS_常量及其含义如下：
符号 | 参数类型
VTS_I2 | short
VTS_I4 | long
VTS_R4 | float
VTS_R8 | double
VTS_COLOR | OLE_COLOR
VTS_CY | CURRENCY
VTS_DATE | DATE
VTS_BSTR | const char*
VTS_DISPATCH | LPDISPATCH
VTS_FONT | IfontDispatch*
VTS_HANDLE | HANDLE
VTS_SCODE | SCODE
VTS_BOOL | BOOL
VTS_VARIANT | const VARIANT*
VTS_PVARIANT | VARIANT*
VTS_UNKNOWN | LPUNKNOWN
VTS_OPTEXCLUSIVE | OLE_OPTEXCLUSIVE
VTS_PICTURE | IpictureDisp*
VTS_TRISTATE | OLE_TRISTATE
VTS_XPOS_PIXELS | OLE_XPOS_PIXELS
VTS_YPOS_PIXELS | OLE_YPOS_PIXELS
VTS_XSIZE_PIXELS | OLE_XSIZE_PIXELS
VTS_YSIZE_PIXELS | OLE_YSIZE_PIXELS
VTS_XPOS_HIMETRIC | OLE_XPOS_HIMETRIC
VTS_YPOS_HIMETRIC | OLE_YPOS_HIMETRIC
VTS_XSIZE_HIMETRIC | OLE_XSIZE_HIMETRIC
VTS_YSIZE_HIMETRIC | OLE_YSIZE_HIMETRIC
注意：
另外，除了VTS_FONT和VTS_PICTURE以外，还为所有的可变类型定义了可变常量，提供了指向可变数据常量的指针。这些常量按照VTS_PConstantname约定来命名。例如，VTS_PCOLOR值一个指向VTS_COLOR常量的指针。

请参阅：
EVENT_CUSTOM_ID, DECLARE_EVENT_MAP


 EVENT_CUSTOM_ID

EVENT_CUSTOM_ID( pszName, dispid, pfnFire, vtsParams )

参数：
pszName | 事件的名字。
dispid | 当引发事件时由控制使用的调度ID。
pfnFire | 事件引发的函数的名字。
vtsParams | 当事件被引发时，传递个控制容器的参数变量列表。

说明：
使用EVENT_CUSTOM_ID宏来为属于dispid指定的调度ID的自定义事件定义一个事件引发函数。
vtsParams参数是VTS_常量中的值的列表。列表中用空格隔开的值指定了函数的参数列表。例如：
VTS_COLOR VTS_FONT
指定了包含短整数和后面的BOOL量的列表。
VTS_常量的列表参见EVENT_CUSTOM。

请参阅：EVENT_CUSTOM


 HashKey

template< class ARG_KEY >
UINT AFXAPI HashKey( ARG_KEY key );

返回值：key的散列值。

参数：
ARG_KEY | 指定了用于访问映射键的数据类型的模板参数。
key | 要被计算散列值的键。

说明：
计算给定键值的散列值。
这个函数被CMap::RemoveKey直接调用，CMap::Lookup和CMap::operator[]间接调用它。
缺省的实现将键值向右移动四个位置，生成一个散列值。可以重载这个函数，使它返回适用于你的应用程序的散列值。

请参阅：CMap


 IMPLEMENT_DYNAMIC

IMPLEMENT_DYNAMIC( class_name, base_class_name )

参数：
class_name | 类的实际名字（不用引号括起来）。
base_class_name | 基类的名字（不要引号括起来）。

说明：
这个宏为动态的CObject派生类生成了必要的C++代码，使其能够在运行时访问类的名字及其在继承结构中的位置。在.CPP模块中使用IMPLEMENT_DYNAMIC宏，然后一次性地连接生成的目标代码。
有关的更多信息参见“Visual C++程序员指南”中的“CObject类”主题。

请参阅：
DECLARE_DYNAMIC, RUNTIME_CLASS, CObject::IsKindOf


 IMPLEMENT_DYNCREATE

IMPLEMENT_DYNCREATE( class_name, base_class_name )

参数：
class_name | 类的实际名字（不用引号括起来）。
base_class_name | 基类的实际名字（不用引号括起来）。

说明：
与DECLARE_DYNCREATE宏一起使用IMPLEMENT_DYNCREATE宏，使CObject的派生类的对象能够在运行时被动态创建。框架利用这种能力来动态地创建新对象，例如，当它在串行化的过程中从磁盘读取对象的时候。在类的实现文件中加入IMPLEMENT_DYNCREATE宏。更多的信息参见“Visual C++程序员指南”中的“CObject对象”主题。
如果你使用了DECLARE_DYNCREATE和IMPLEMENT_DYNCREATE宏，就可以使用RUNTIME_CLASS宏以及CObject::IsKindOf成员函数在运行时确定对象所属的类。
如果在类的声明中包含了DECLARE_DYNCREATE，那么就必须在类的实现中包含IMPLEMENT_DYNCREATE。

请参阅：
DECLARE_DYNCREATE, RUNTIME_CLASS, CObject::IsKindOf


 IMPLEMENT_OLECREATE

IMPLEMENT_OLECREATE( class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8 )

#include <afxdisp.h>

参数：
class_name | 类的实际名字（不用引号括起来）。
external_name | 对其它应用程序公开的对象名（不用引号括起来）。
l, w1, w2, b1, b2, b3, b4,b5, b6, b7, b8 | 类的CLSID的组成部分。

说明：
这个宏必须出现在使用DECLARE_OLECREATE的类的实现文件中。
外部名是对其它应用程序公开的标识符。客户应用程序利用外部名来向自动化服务器的类对象发出请求。
OLE的类ID是对象的唯一的128位标识符。它组成了一个long值，两个WORD值以及八个BYTE值，在句法描述中用l，w1，w2以及b1到b8来表示。ClassWizard和AppWizard根据你的请求生成唯一的OLE类ID。

请参阅：
DECLARE_OLECREATE, CLSID Key


 IMPLEMENT_OLECREATE_EX

IMPLEMENT_OLECREATE_EX( class_name, external_name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8 )

参数：
class_name | 属性页类控制的名字。
external_name | 对应用程序公开的对象名。
l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8 | 类的CLSID的组成部分。有关这些参数的详细信息参见IMPLEMENT_OLECREATE的说明。

说明：
这个宏实现你的控制的类工厂以及控制类的GetClassID成员函数。这个宏必须出现在使用了DECLARE_OLECREATE_EX宏或BEGIN_OLEFACTORY 以及END_OLEFACTORY的类的控制的实现文件中。外部名是对其它应用程序公开的OLE控制的标识符。容器程序通过这个名字向控制类发出请求。

请参阅：
DECLARE_OLECREATE_EX, BEGIN_OLEFACTORY, END_OLEFACTORY, IMPLEMENT_OLECREATE


 IMPLEMENT_OLETYPELIB

IMPLEMENT_OLETYPELIB( class_name, tlid, wVerMajor, wVerMinor )

参数：
class_name | 与类型库相关的控制类的名字。
tlid | 类型库的ID数字。
wVerMajor | 类型库的主版本号。
wVerMinor | 类型库的次版本号。

说明：
这个宏实现了控制的GetTypeLib成员函数。它必须出现在使用DECLARE_OLETYPELIB宏的控制的实现文件中。

请参阅：DECLARE_OLETYPELIB


 IMPLEMENT_SERIAL

IMPLEMENT_SERIAL( class_name, base_class_name, wSchema )

参数：
class_name | 类的实际名字（不用引号括起来）。
base_class_name | 基类的名字（不用引号括起来）。
wSchema | 一个UINT类型的版本号，将被用在存档中，使得解串行程序能够识别并处理早期版本的程序所生成的数据。它的值不能是－1。

说明：
这个宏为动态的CObject派生类对象生成必要的C++代码，使它能够在运行时访问类名及其在继承关系中的位置。在.CPP模块中使用IMPLEMENT_SERIAL宏，然后一次性地连接生成的目标代码。
你可以使用AFX_API来为使用了DECLARE_SERIAL和IMPLEMENT_SERIAL宏的类自动引出CArchive提取操作符。用下面的代码把类声明（在.H文件中）括起来：
#undef AFX_API
#define AFX_API AFX_EXT_CLASS
<这里是你的类声明>
#undef AFX_API
#define AFX_API
有关的更多信息参见“Visual C++程序员指南”中的“CObject类”主题。

请参阅：
DECLARE_SERIAL, RUNTIME_CLASS, CObject::IsKindOf


 ISAPIASSERT

ISAPIASSERT( booleanExpression )

参数：
booleanExpression 指定了一个表达式（包括指针变量），其计算结果为非零值或0。

说明：
这个宏的作用与MFC宏ASSERT完全类似。它计算其参数。如果结果为0，这个宏就打印出一条诊断信息并退出程序。如果结果为非零值，它就不做任何操作。
诊断信息具有如下形式：
assertion failed in file <name> in line <num>
这里的name是源文件的名字，而num是源文件中产生断言失败的位置的行号。
在应用程序的发行版本中，ISAPIASSERT并不计算表达式，因此也不会中断程序。如果不管环境如何，都必须计算这个表达式，可以用ISAPIVERIFY宏来代替ISAPIASSERT。ISAPIASSERT仅在应用程序的调试版本中起作用。
ISAPI应用程序不一定要使用MFC。如果你的应用程序没有与MFC连接，ISAPIASSERT提供了与ASSERT相同的功能。如果你的应用程序与MFC连接，那么ISAPIASSERT仅简单地调用MFC的ASSERT。

请参阅：
ISAPITRACE, ISAPITRACE0, ISAPITRACE1, ISAPITRACE2, ISAPITRACE3, ISAPIVERIFY


 ISAPITRACE

ISAPITRACE( exp )

参数：
exp 指定了可变数目的参数，对它们的使用方式与运行时函数printf中的可变数目参数相同。

说明：
这个宏的作用与MFC宏TRACE完全相似，TRACE提供了与printf函数相似的功能，向诸如调试终端之类的转储环境发送一个格式化字符串。与MS-DOS下的C程序中的printf相似，ISAPITRACE宏是在你的程序运行时跟踪变量值的简便途径。在调试环境中，ISAPITRACE宏的输出被送到Visual C++的调试窗口。在发行版本中，它什么也不做。
ISAPI应用程序并没有必要使用MFC。如果你的应用程序没有与MFC连接，ISPAITRACE提供了与TRACE相同的功能。如果你的应用程序与MFC进行连接，那么ISAPITRACE简单地调用MFC的TRACE。

请参阅：
ISAPIASSERT, ISAPITRACE0, ISAPITRACE1, ISAPITRACE2, ISAPITRACE3, ISAPIVERIFY


 ISAPITRACE0

ISAPITRACE0( exp )

参数：
exp 格式化字符串，与运行时函数printf中所用的类似。

说明：
ISAPITRACE0是可以用来进行调试输出的一组跟踪宏中的一种形式。这组宏包括ISAPITRACE0，ISAPITRACE1，ISAPITRACE2和ISAPITRACE3。这些宏之间的差别是它们所带参数的个数。ISAPITRACE0只有一个格式化字符串，可以被用来输出简单的文本信息。ISAPITRACE1具有格式化字符串和一个参数——要被转储的变量。ISAPITRACE2和ISAPITRACE3在格式化字符串后面分别带有两个和三个参数。
在你生成的应用程序的发行版本中，ISAPITRACE0什么也不做。与ISAPITRACE一样，它仅在应用程序的调试版本中才把数据转储到调试输出设备。
ISAPITRACE0的作用与MFC宏TRACE0完全类似。ISAPI应用程序没有必要使用MFC。如果你的应用程序没有与MFC连接，ISAPITRACE0提供与TRACE0相同的功能。如果你的应用程序与MFC连接，ISAPITRACE0简单地调用MFC的TRACE0。

请参阅：
ISAPIASSERT, ISAPITRACE, ISAPITRACE1, ISAPITRACE2, ISAPITRACE3, ISAPIVERIFY


 ISAPITRACE1

ISAPITRACE1( exp, param1 )

参数：
exp | 格式化字符串，与运行时函数printf中所用的类似。
param1 | 将要被转储的变量的名字。

说明：
这个宏的作用与MFC宏TRACE1完全相似。有关ISAPITRACE1的描述参见ISAPITRACE0。
ISAPI应用程序没有必要使用MFC。如果你的应用程序没有与MFC连接，ISAPITRACE1提供与TRACE1相同的功能。如果你的应用程序与MFC连接，ISAPITRACE1简单地调用MFC的TRACE1。

请参阅：
ISAPIASSERT, ISAPITRACE, ISAPITRACE0, ISAPITRACE2, ISAPITRACE3, ISAPIVERIFY


 ISAPITRACE2

ISAPITRACE2( exp, param1, param2 )

参数：
exp | 格式化字符串，与运行时函数printf中所使用的类似。
param1, param2 | 要被转储的变量的名字。

说明：
这个宏的作用与MFC宏TRACE2完全相似。有关ISAPITRACE2的描述参见ISAPITRACE0。
ISAPI应用程序没有必要使用MFC。如果你的应用程序没有与MFC连接，ISAPITRACE2提供与TRACE2相同的功能。如果你的应用程序与MFC连接，ISAPITRACE2简单地调用MFC的TRACE2。

请参阅：
ISAPIASSERT, ISAPITRACE, ISAPITRACE0, ISAPITRACE1, ISAPITRACE3, ISAPIVERIFY


 ISAPITRACE3

ISAPITRACE3( exp, param1, param2, param3 )

参数：
exp | 格式化字符串，与运行时函数printf中所使用的类似。
param1, param2, param3 | 要被转储的变量的名字。

说明：
这个宏的作用与MFC宏TRACE3完全相似。有关ISAPITRACE3的描述参见ISAPITRACE0。
ISAPI应用程序没有必要使用MFC。如果你的应用程序没有与MFC连接，ISAPITRACE3提供与TRACE3相同的功能。如果你的应用程序与MFC连接，ISAPITRACE3简单地调用MFC的TRACE3。

请参阅：
ISAPIASSERT, ISAPITRACE, ISAPITRACE0, ISAPITRACE1, ISAPITRACE2, ISAPIVERIFY


 ISAPIVERIFY

ISAPIVERIFY( booleanExpression )

参数：
booleanExpression 指定了一个表达式（包括指针变量），将被计算，结果为非零值或0。

说明：
这个宏的作用与MFC宏VERIFY完全相似。在应用程序的调试版本中，ISAPIVERIFY宏计算它的参数。如果结果为0，就打印出一条诊断信息并终止程序。如果结果为非零值，它什么也不做。
诊断信息具有如下形式：
assertion failed in file <name> in line <num>
这里的name是源文件的名字，num是源文件中发生断言失败的位置的行号。
在应用程序的发行版本中，ISAPIVERIFY计算表达式，但是并不打印或中断程序。例如，如果这个表达式是一个函数调用，那么将完成这个调用。
ISAPI应用程序没有必要使用MFC。如果你的应用程序没有与MFC连接，ISAPIVERIFY提供与VERIFY相同的功能。如果你的应用程序与MFC连接，ISAPIVERIFY简单地调用MFC的VERIFY。

请参阅：
ISAPIASSERT, ISAPITRACE, ISAPITRACE0, ISAPITRACE1, ISAPITRACE2, ISAPITRACE3


 METHOD_PROLOGUE

METHOD_PROLOGUE( theClass, localClass )

参数：
theClass | 指定了要实现接口映射的类的名字。
localClass | 指定了实现接口映射的本地类的名字。

说明：
当调用一个引出接口的方法时，使用METHOD_PROLOGUE宏来维护正确的全局状态。
典型的情况是，CCmdTarget派生类的对象所实现的接口的成员函数已经使用了这个宏以对pThis指针实现自动初始化。例如：
class CInnerUnknown : public IUnknown
...
CInnerUnknown InnerUnknown;
...
// 内部 IUnknown 实现
STDMETHODIMP_(ULONG) CInnerUnknown::AddRef()
{
METHOD_PROLOGUE(CCmdTarget, InnerUnknown)
return pThis->InternalAddRef();
}
附加的信息参见Visual C++联机文档中的“技术注释38”以及“Visual C++程序员指南”中的“创建新文档，窗口和视”一文中的“管理MFC全局模块的状态数据”一节。


 ON_COMMAND

ON_COMMAND( id, memberFxn )

参数：
id | 命令ID。
memberFxn | 命令被映射到的消息处理函数的名字。

说明：
这个宏通常由ClassWizard自动插入消息映射，也可以手动插入。它指明了将由哪个函数来处理用户界面对象，如菜单项或工具条按钮所发出的命令消息。
当一个命令目标对象接收到了带有指定ID的Windows的WM_COMMAND消息时，ON_COMMAND将调用成员函数memberFxn来处理消息。
用ON_COMMAND把单个消息映射到成员函数。用ON_COMMAND_RANGE把一个范围的命令映射到一个成员函数。对于一个给定的命令ID，只能有一个消息映射入口。这就是说，不能将一个命令映射到多于一个的处理函数。相关的更多信息和例子参见“Visual C++程序员指南”中的“消息处理和映射”主题。

示例：
// ON_COMMAND的例子
BEGIN_MESSAGE_MAP( CMyDoc, CDocument )
//{{AFX_MSG_MAP( CMyDoc )
ON_COMMAND( ID_MYCMD, OnMyCommand )
// ... 其它入口，用于处理别的命令
//}}AFX_MSG_MAP
END_MESSAGE_MAP( )

请参阅：ON_UPDATE_COMMAND_UI


 ON_COMMAND_RANGE

ON_COMMAND_RANGE( id1, id2, memberFxn )

参数：
id1 | 一个连续范围的命令ID的起始值。
id2 | 一个连续范围的命令ID的结束值。
memberFxn | 该命令被映射到的消息处理函数的名字。

说明：
使用这个宏把一个连续范围的命令ID映射到单个命令处理函数。ID的范围从id1开始，到id2结束。
用ON_COMMAND_RANGE把一个范围的命令ID映射到一个成员函数。用ON_COMMAND把单个命令ID映射到成员函数。每个给定的命令ID只能有一个消息映射入口。这就是说，不能把命令映射到多于一个的处理函数。关于映射消息范围的更多信息参见“Visual C++程序员指南”中的“消息映射范围的处理函数”。
ClassWizard不支持消息映射范围，所以你必须自己写入这个宏。确保你把它写在了消息映射的//{{AFX_MSG_MAP分界符外面。

请参阅：
ON_UPDATE_COMMAND_UI_RANGE, ON_CONTROL_RANGE, ON_COMMAND


 ON_CONTROL

ON_CONTROL( wNotifyCode, id, memberFxn )

参数：
wNotifyCode | 控件的通知代码。
id | 命令ID。
memberFxn | 命令被映射到的消息处理函数的名字。

说明：
这个宏指明哪个函数将处理自定义控件的通知消息。控件的通知消息是指控件发送给它的父窗口的消息。
对于每个要被映射到消息处理函数的控件通知消息，在消息映射中都必须有一个ON_CONTROL宏语句。
相关的更多信息及例子参见“Visual C++程序员指南”中的“消息处理和映射”主题。

请参阅：
ON_MESSAGE, ON_REGISTERED_MESSAGE


 ON_CONTROL_RANGE

ON_CONTROL_RANGE( wNotifyCode, id1, id2, memberFxn )

参数：
wNotifyCode | 你的处理函数所响应的通知代码。
id1 | 一个连续范围的控制ID的起始值。
id2 | 一个连续范围的控制ID的结束值。
memberFxn | 控件被映射到的消息处理函数的名字。

说明：
用这个宏把一个连续范围的控制ID映射到单个的Windows通知消息，如BN_CLICKED，的处理函数。ID的范围从id1开始，到id2结束。这个处理函数是为从映射控件发出的特定通知而调用的。
ClassWizard不支持消息映射范围，因此你必须自己写入这个宏。确保你把它写在了消息映射分界符//{{AFX_MSG_MAP的外面。

请参阅：
ON_UPDATE_COMMAND_UI_RANGE, ON_COMMAND_RANGE


 ON_EVENT

ON_EVENT( theClass, id, dispid, pfnHandler, vtsParams )

参数：
theClass | 事件接收映射所属的类。
id | OLE控件的控制ID。
dispid | 控件引发分事件的调度ID。
pfnHandler | 处理事件的成员函数的指针。这个函数具有BOOL类型的返回值，其参数的类型与事件的参数（参见vtsParams）类型相匹配。函数应当返回TRUE以表明事件已被处理，否则返回FALSE。
vtsParams | VTS_常量的序列，指定了事件参数的类型。这些值与诸如DISP_FUNCTION之类的调度映射入口中使用的常量相同。

说明：
用ON_EVENT宏来为OLE控件引发的事件定义事件处理函数。
vtsParams参数是用空格分隔的VTS_常量的列表。用空格隔开的值指定了函数的参数列表。例如：
VTS_I2 VTS_BOOL
指定了一个包含短整数和后面的BOOL量的列表。
VTS_常量的列表参见EVENT_CUSTOM。

请参阅：
ON_EVENT_RANGE, ON_PROPNOTIFY, ON_PROPNOTIFY_RANGE


 ON_EVENT_RANGE

ON_EVENT_RANGE( theClass, idFirst, idLast, dispid, pfnHandler, vtsParams )

参数：
theClass | 事件接收映射所属的类。
idFirst | 范围中第一个OLE控件的控制ID。
idLast | 范围中最后一个OLE控件的控制ID。
dispid | 控件引发的事件的调度ID。
pfnHandler | 指向处理事件的成员函数指针。这个函数必须具有BOOL类型的返回值，第一个参数的类型为UINT（用于控制ID），另外的参数类型与事件的参数（参见vtsParams）匹配。这个函数应当返回TRUE以表明该事件已被处理，否则返回FALSE。
vtsParams | VTS_常量序列，指定了事件参数的类型。第一个常量应当是属于VTS_I4类型的，用于控制ID。这些常量与诸如DISP_FUNCTION之类的调度映射入口中所使用的相同。

说明：
使用ON_EVENT_RANGE宏来为一些OLE控件所引发的事件定义一个事件处理函数。这些控件的ID属于一个连续的范围。
vtsParams参数是一个用空格分隔的VTS_常量的列表。这些用空格隔开的值指定了函数的参数列表。例如：
VTS_I2 VTS_BOOL
指定了一个包含短整数和后面的BOOL量的列表。
VTS_常量的列表参见EVENT_CUSTOM。

请参阅：
ON_EVENT, ON_PROPNOTIFY, ON_PROPNOTIFY_RANGE


 ON_EVENT_REFLECT

ON_EVENT_REFLECT( theClass, dispid, pfnHandler, vtsParams )

参数：
theClass | 事件接收映射所属的类。
dispid | 控件引发的事件的调度ID。
pfnHandler | 指向处理事件的成员函数的指针。这个函数必须具有BOOL类型的返回值，第一个参数的类型为UINT（用于控制ID），另外的参数类型与事件的参数（参见vtsParams）匹配。这个函数应当返回TRUE以表明该事件已被处理，否则返回FALSE。
vtsParams | VTS_常量序列，指定了事件参数的类型。这些常量与诸如DISP_FUNCTION之类的调度映射入口中所使用的相同。

说明：
当被用于OLE控件的封装类的事件接收映射时，ON_EVENT_REFLECT宏在控件的容器处理之前接收控件引发的事件。
vtsParams参数是一个用空格分隔的VTS_常量的列表。这些用空格隔开的值指定了函数的参数列表。例如：
VTS_I2 VTS_BOOL
指定了一个包含短整数和后面的BOOL量的列表。
VTS_常量的列表参见EVENT_CUSTOM。

请参阅：
ON_EVENT, ON_PROPNOTIFY, ON_PROPNOTIFY_REFLECT


 ON_MESSAGE

ON_MESSAGE( message, memberFxn )

参数：
message | 消息的ID。
memberFxn | 消息被映射到消息处理函数的名字。

说明：
这个宏指明哪个函数将处理用户定义的消息。用户定义的消息通常位于WM_USER和0x7FFF之间。用户定义的消息是指不属于标准的WindowsWM_MESSAGE消息的任何消息。对于每个需要被映射到消息处理函数的用户自定义消息，在你的消息映射中都必须有且只能有一个ON_MESSAGE宏语句。
有关的更多信息和例子参见“Visual C++程序员指南”中的“消息处理和映射”主题。

示例：
// ON_MESSAGE的例子
#define WM_MYMESSAGE (WM_USER + 1)
BEGIN_MESSAGE_MAP( CMyWnd, CMyParentWndClass )
ON_MESSAGE( WM_MYMESSAGE, OnMyMessage )
// ... 可能的其它入口，用于处理其它消息
END_MESSAGE_MAP( )

请参阅：
ON_UPDATE_COMMAND_UI, ON_CONTROL, ON_REGISTERED_MESSAGE, ON_COMMAND, 用户定义处理函数


 ON_OLECMD

ON_OLECMD( pguid, olecmdid, id )

参数：
pguid | 命令岁数的命令组的表示符。对于标准组使用NULL。
olecmdid | OLE命令的标识符。
id | 发出命令的资源或对象的菜单ID，工具条ID，按钮ID或其它ID。

说明：
这个宏通过命令调度接口IOleCommandTarget转发命令。IOleCommandTarget允许容器接收DocObject的用户所产生的命令，同时允许容器将相同的命令（例如File菜单中的New，Open，SaveAs以及Print）发送给DocObject。
IOleCommandTarget比OLE自动化的IDispatch要简单。IOleCommandTarget完全依赖于一个标准命令集，它们很少带参数，也不涉及类型信息（因而命令参数的类型安全特性也减小了）。如果你不需要调度带参数的命令，使用COleServerDoc::OnExecOleCmd。
IOleCommandTarget的标准菜单命令已经由MFC用下列宏实现了：
ON_OLECMD_CLEARSELECTION( )
发出Edit Clear命令，实现如下：
ON_OLECMD(NULL, OLECMDID_CLEARSELECTION, ID_EDIT_CLEAR)

ON_OLECMD_COPY( )
发出Edit Copy命令，实现如下：
ON_OLECMD(NULL, OLECMDID_COPY, ID_EDIT_COPY)

ON_OLECMD_CUT( )
发出Edit Cut命令，实现如下：
ON_OLECMD(NULL, OLECMDID_CUT, ID_EDIT_CUT)

ON_OLECMD_NEW( )
发出File New命令，实现如下：
ON_OLECMD(NULL, OLECMDID_NEW, ID_FILE_NEW)

ON_OLECMD_OPEN( )
发出File Open命令，实现如下：
ON_OLECMD(NULL, OLECMDID_OPEN, ID_FILE_OPEN)

ON_OLECMD_PAGESETUP( )
发出File Page Setup命令，实现如下：
ON_OLECMD(NULL, OLECMDID_PAGESETUP, ID_FILE_PAGE_SETUP)

ON_OLECMD_PASTE( )
发出Edit Paste命令，实现如下：
ON_OLECMD(NULL, OLECMDID_PASTE, ID_EDIT_PASTE)

ON_OLECMD_PASTESPECIAL( )
发出Edit Paste Special命令，实现如下：
ON_OLECMD(NULL, OLECMDID_PASTESPECIAL, ID_EDIT_PASTE_SPECIAL)

ON_OLECMD_PRINT( )
发出File Print命令，实现如下：
ON_OLECMD(NULL, OLECMDID_PRINT, ID_FILE_PRINT)

ON_OLECMD_PRINTPREVIEW( )
发出File Print Preview命令，实现如下：
ON_OLECMD(NULL, OLECMDID_PRINTPREVIEW, ID_FILE_PRINT_PREVIEW)

ON_OLECMD_REDO( )
发出Edit Redo命令，实现如下：
ON_OLECMD(NULL, OLECMDID_REDO, ID_EDIT_REDO)

ON_OLECMD_SAVE( )
发出File Save命令，实现如下：ON_OLECMD(NULL, OLECMDID_SAVE, ID_FILE_SAVE)

ON_OLECMD_SAVE_AS( )
发出File Save As命令，实现如下：
ON_OLECMD(NULL, OLECMDID_SAVEAS, ID_FILE_SAVE_AS)

ON_OLECMD_SAVE_COPY_AS( )
发出File Save Copy As命令，实现如下：
ON_OLECMD(NULL, OLECMDID_SAVECOPYAS, ID_FILE_SAVE_COPY_AS)

ON_OLECMD_SELECTALL( )
发出Edit Select All命令，实现如下：
ON_OLECMD(NULL, OLECMDID_SELECTALL, ID_EDIT_SELECT_ALL)

ON_OLECMD_UNDO( )
发出Edit Undo命令，实现如下：
ON_OLECMD(NULL, OLECMDID_UNDO, ID_EDIT_UNDO)

请参阅：COleCmdUI, COleServerDoc::OnExecOleCmd


 ON_OLEVERB

ON_OLEVERB( idsVerbName, memberFxn )

参数：
idsVerbName | 动词名字的字符串资源ID。
memberFxn | 当动词被激活时框架调用的函数。

说明：
这个宏定义了一个消息映射入口，将一个自定义的动词映射到控件的指定成员函数。
可用资源编辑器来生成自定义动词名字，加入字符串表。
memberFxn的函数原型如下：
BOOL memberFxn( LPMSG lpMsg, HWND hWndParent, LPCRECT lpRect );
pMsg，hWndParent和lpRect参数的值时从IOleObject::DoVerb成员函数的对应参数中取得的。

请参阅：ON_STDOLEVERB


 ON_PARSE_COMMAND

ON_PARSE_COMMAND( FnName, mapClass, Args )

参数：
FnName | 成员函数的名字。也是命令的名字。
mapClass | 要把函数映射到的类的名字。
Args | 映射到FnName的参数。符号的列表参见说明部分。

说明：
ON_PARSE_COMMAND宏被用于解析映射，用来定义从客户发送到CHttpServer对象的命令。
FnName表示的成员函数必须以一个指向CHttpServerContext对象的指针作为它的第一个参数。FnName属于LPSTR类型，用解析映射中的符号ITS_LPSTR来标识，这意味着，FnName指向一个包含了mapClass类的成员函数名的字符串。
参数Args可以取下列值之一：
符号 | 类型或注释
ITS_EMPTY | Args不能为空白。如果你没有参数，则使用ITS_EMPTY
ITS_PSTR | 字符串指针
ITS_RAW | 精确的行数据发送到ISAPI扩展，不要使用具有任何其它参数类型的ITS_RAW；若使用了，则导致ASSERT。参见“Remarks”中的示例
ITS_I2 | 一个short值
ITS_I4 | 一个long值
ITS_R4 | 一个float值
ITS_R8 | 一个double值

示例：
/ / The following example Illustrates extracting
/ / a string and a short sent to the server:
BEGIN_PARSE_MAP(CDerivedClass, CHttpServer)
DEFAULT_PARSE_COMMAND(Myfunc, CDerivedClass)
ON_PARSE_COMMAND(Myfunc, CDerivedClass, ITS_PSTR ITS_I2)
ON_PARSE_COMMAND_PARAMS("string integer=42")
ON_PARSE_COMMAND(Myfunc2, CDerivedClass, ITS_PSTR ITS_I2 ITS_PSTR)
ON_PARSE_COMMAND_PARAMS("string integer string2='Default value'")
END_PARSE_MAP(CDerivedClass)
注意：如果你在可选的ITS_PSTR的缺省值中加入空格，使用单引号。
void Myfunc(CHttpServerContext* pCtxt, LPTSTR pszName, int nNumber);
void Myfunc2(CHttpServerContext* pCtxt, LPTSTR pszName, int nNumber, LPTSTR pszTitle);
// 下面的例子演示了提取发送给服务器的原始数据
BEGIN_PARSE_MAP(CDerivedClass, CHttpServer)
DEFAULT_PARSE_COMMAND(Myfunc, CDerivedClass)
ON_PARSE_COMMAND(Myfunc, CDerivedClass, ITS_RAW)
END_PARSE_MAP(CDerivedClass)
函数原型如下：
void CDerivedClass::Myfunc(CHttpServerContext* pCtxt, void* pVoid, DWORD dwBytes);
在第二个例子中，pVoid指针指向发送给你的扩展部分的数据。dwBytes参数是pVoid所指向的字节数目。如果dwBytes为零，pVoid可能不指向任何内容。
注意：
解析映射命令的处理函数必须以指向CHttpServerContext对象的指针为第一个参数，参数必须按照与ON_PARSE_COMMAND中相同的顺序定义。

请参阅：
BEGIN_PARSE_MAP, END_PARSE_MAP, ON_PARSE_COMMAND_PARAMS, DEFAULT_PARSE_COMMAND, CHttpServer


 ON_PARSE_COMMAND_PARAMS

ON_PARSE_COMMAND_PARAMS( Params )

参数：
Params 参数，映射到Args参数，并与FnName所标识的函数相关，在ON_PARSE_COMMAND宏中，位于ON_PARSE_COMMAND_PARAMS之前。

说明：
ON_PARSE_COMMAND_PARAMS宏标识并指定了参数的缺省值，该参数与一个函数相关，这个函数被映射到一个由客户发往CHttpSever对象的命令。ON_PARSE_COMMAND_PARAMS宏必须紧跟在与之相关的ON_PARSE_COMMAND宏之后。
如果参数被命名，客户在请求的时候必须提供参数的名字。例如，如果你的参数如下：
ON_PARSE_COMMAND_PARAMS("string int=42")
那么客户必须提供参数字符串，否则查询就会失败。
如果参数是可选的，客户不必提供它，解析映射将会提供缺省值。例如，如果你的参数如下：
ON_PARSE_COMMAND_PARAMS("string=default int=42")
那么客户的查询中不必定义任何参数，缺省的参数字符串是一个空字符串。
解析映射的例子参见ON_PARSE_COMMAND。

请参阅：
BEGIN_PARSE_MAP, END_PARSE_MAP, ON_PARSE_COMMAND, DEFAULT_PARSE_COMMAND, CHttpServer


 ON_PROPNOTIFY

ON_PROPNOTIFY( theClass, id, dispid, pfnRequest, pfnChanged )

参数：
theClass | 事件接收映射所属的类。
id | OLE控件的控制ID。
dispid | 与通知有关的属性的调度ID。
pfnRequest | 指向一个成员函数的指针，该函数处理属性的OnRequestEdit通知。这个函数必须具有BOOL类型的返回值和BOOL*类型的参数。它应当将参数设为TRUE以允许改变属性，或者设为FALSE以禁止改变属性。这个函数应当返回TRUE以表明它已经处理了通知，否则返回FALSE。
pfnChanged | 指向一个成员函数的指针，该函数处理属性的OnChanged通知。函数应当具有BOOL类型的返回值和一个UINT类型的参数。这个函数必须返回TRUE以表明它已经处理了通知，否则返回FALSE。

说明：
用ON_PROPNOTIFY宏来定义一个事件接收映射入口以处理OLE控件发出的属性通知。
vtsParams参数是一个用空格分隔的VTS_常量的列表。这些用空格隔开的值指定了函数的参数列表。例如：
VTS_I2 VTS_BOOL
指定了包含短整数和后面的BOOL量的列表。
VTS_常量的列表参见EVENT_CUSTOM。

请参阅：
ON_EVENT_RANGE, ON_PROPNOTIFY_RANGE


 ON_PROPNOTIFY_RANGE

ON_PROPNOTIFY_RANGE( theClass, idFirst, idLast, dispid, pfnRequest, pfnChanged )

参数：
theClass | 事件接收映射所属的类。
idFirst | 范围中第一个OLE控件的控制ID。
idLast | 范围中最后一个OLE控件的控制ID。
dispid | 与通知有关的属性的调度ID。
pfnRequest | 指向一个成员函数的指针，该函数处理属性的OnRequestEdit通知。这个函数必须具有BOOL类型的返回值和UINT以及BOOL*类型的参数。它应当将参数设为TRUE以允许改变属性，或者设为FALSE以禁止改变属性。这个函数应当返回TRUE以表明它已经处理了通知，否则返回FALSE。
pfnChanged | 指向一个成员函数的指针，该函数处理属性的OnChanged通知。这个函数必须具有BOOL型返回值以及一个UINT参数。该函数必须返回TRUE以表明通知已经被处理，否则返回FALSE。

说明：
使用ON_PROPNOTIFY_RANGE宏来定义一个事件接收映射，用以处理OLE控件发出的属性通知，这些控件的ID属于一个连续的范围。

请参阅：
ON_EVENT_RANGE, ON_PROPNOTIFY, ON_EVENT


 ON_PROPNOTIFY_REFLECT

ON_PROPNOTIFY_REFLECT( theClass, dispid, pfnRequest, pfnChanged )

参数：
theClass | 事件接收映射所属的类。
dispid | 与通知有关的属性的调度ID。
pfnRequest | 指向一个成员函数的指针，该函数处理属性的OnRequestEdit通知。这个函数必须具有BOOL类型的返回值和BOOL*型参数。这个函数应当将参数设为TRUE以允许改变属性，或者设为FALSE以禁止改变属性。函数应该返回TRUE以表明通知已经被处理，否则就返回FALSE。
pfnChanged | 指向一个成员函数的指针，该函数处理属性的OnChanged通知。这个函数必须具有BOOL类型的返回值，不能有参数。函数应该返回TRUE以表明通知已经被处理，否则就返回FALSE。

说明：
当ON_PROPNOTIFY_REFLECT宏被用于OLE控件的封装类的事件接收映射时，它在控件发出的属性通知被控件容器处理之前接收它们。

请参阅：
ON_EVENT_REFLECT, ON_PROPNOTIFY


 ON_REGISTERED_MESSAGE

ON_REGISTERED_MESSAGE( nMessageVariable, memberFxn )

参数：
nMessageVariable | 注册的窗口消息ID变量。
memberFxn | 消息被映射到的消息处理函数的名字。

说明：
Windows的RegisterWindowMessage函数可被用来定义一个新的窗口消息，这个消息在系统内应当是唯一的。这个消息指明由哪个函数来处理注册的消息。
有关的更多信息和例子参见“Visual C++程序员指南”中的“消息处理和映射”主题。

示例：
// ON_REGISTERED_MESSAGE的例子
const UINT wm_Find = RegisterWindowMessage( FINDMSGSTRING );
BEGIN_MESSAGE_MAP( CMyWnd, CMyParentWndClass )
//{{AFX_MSG_MAP( CMyWnd )
ON_REGISTERED_MESSAGE( wm_Find, OnFind )
// ... 可能的入口，用于处理其它消息。
//}}AFX_MSG_MAP
END_MESSAGE_MAP( )

请参阅：
ON_MESSAGE, ON_UPDATE_COMMAND_UI, ON_CONTROL, ON_COMMAND, ::RegisterWindowMessage, User-Defined Handlers


 ON_REGISTERED_THREAD_MESSAGE

ON_REGISTERED_THREAD_MESSAGE( nMessageVariable, memberFxn )

参数：
nMessageVariable | 注册的窗口消息ID变量。
memberFxn | 消息被映射到的CWinThread消息处理函数的名字。

说明：
这个宏指明由哪个函数来处理Windows的RegisterWindowMessage函数注册的消息。RegisterWindowMessage函数被用于定义一个新的窗口消息，在整个系统中，该消息是唯一的。当使用CWinThread类的时候，必须用ON_REGISTERED_THREAD_MESSAGE来代替ON_REGISTERED_MESSAGE。

请参阅：
ON_REGISTERED_MESSAGE, ON_THREAD_MESSAGE, ::RegisterWindowMessage, CWinThread


 ON_STDOLEVERB

ON_STDOLEVERB( iVerb, memberFxn )

参数：
iVerb | 被覆盖的动词的标准动词索引。
memberFxn | 当动词被激活时由框架调用的函数。

说明：
利用这个宏来改变标准动词的缺省动作。
标准动词索引的形式如OLEIVERB_，后面跟一个动作。例如，OLEIVERB_SHOW，OLEIVERB_HIDE和OLEIVERB_UIACTIVATE等标准动词的例子。
对可以用作memberFxn参数的函数原型的描述参见ON_OLEVERB。

请参阅：ON_OLEVERB


 ON_THREAD_MESSAGE

ON_THREAD_MESSAGE( message, memberFxn )

参数：
message | 消息的ID。
memberFxn | 消息被映射到的CWinThread消息处理函数的名字。

说明：
这个宏指明由哪个函数来处理用户定义的消息。当使用CWinThread类的时候，必须用ON_THREAD_MESSAGE来代替ON_MESSAGE。用户定义的消息是指那些不属于标准的Windows WM_MESSAGE的消息。对于每一个要映射到消息处理函数的用户定义函数，在消息映射中必须有且只能有一个ON_THREAD_MESSAGE宏语句。

请参阅：
ON_MESSAGE, ON_REGISTERED_THREAD_MESSAGE, CWinThread


 ON_UPDATE_COMMAND_UI

ON_UPDATE_COMMAND_UI( id, memberFxn )

参数：
id | 消息的ID。
memberFxn | 消息被映射到的消息处理函数的名字。

说明：
这个宏通常由ClassWizard插入消息映射，用于指明由哪个函数处理用户界面的更新消息。
对于每个要映射到消息处理函数的用户界面更新命令，在消息映射中必须有且只能有一个ON_UPDATE_COMMAND_UI宏语句。
相关的信息和例子参见“Visual C++程序员指南”中的“消息处理和映射”主题。

请参阅：
ON_MESSAGE, ON_REGISTERED_MESSAGE, ON_CONTROL, ON_COMMAND, CCmdUI


 ON_UPDATE_COMMAND_UI_RANGE

ON_UPDATE_COMMAND_UI_RANGE( id1, id2, memberFxn )

参数：
id1 | 一个连续的命令ID范围的起始ID。
id2 | 一个连续的命令ID范围的结束ID。
memberFxn | 命令被映射到的更新消息处理函数的名字。

说明：
使用这个宏将一个连续范围的命令ID映射到一个更新消息处理函数。更新消息处理函数更新与命令相关的菜单项和工具条按钮的状态。ID 的范围从id1开始，到id2结束。
ClassWizard不支持消息映射范围，因此你必须自己加入这个宏。确保你把它写在了消息映射的分界符//{{AFX_MSG_MAP的外面。

请参阅：
ON_COMMAND_RANGE, ON_CONTROL_RANGE


 PROPPAGEID

PROPPAGEID( clsid )

参数：
clsid 属性页的唯一的类ID。

说明：
使用这个宏加入一个OLE控件使用的属性页。所有的PROPPAGEID宏都必须放在你的控件的实现文件中，位于BEGIN_PROPPAGEIDS和END_PROPPAGEIDS宏之间。

请参阅：
BEGIN_PROPPAGEIDS, END_PROPPAGEIDS


 PX_Blob

BOOL PX_Blob(
CPropExchange* pPX,
LPCTSTR pszPropName,
HGLOBAL& hBlob,
HGLOBAL hBlobDefault = NULL
);

返回值：
如果成功地交换了数据则为非零值，否则为0。

参数：
pPX | 指向CPropExchange对象的指针（通常用作传递给DoPropExchange的参数）。
pszPropName | 要交换的属性的名字。
hBlob | 对存储属性的变量（通常是你的类的成员变量）的引用。
hBlobDefault | 属性的缺省值。

说明：
在你的控件的DoPropExchange成员函数内调用这个函数，用以串行化或初始化一个存储二进制大对象（BLOB）数据的属性。属性的值将从hBlob引用的变量中读写。这个变量在最初调用PX_Blob之前必须被初始化为NULL（通常这可以在控件的构造函数中完成）。如果指定了hBlobDefault，它将被用作该属性的缺省值。如果由于某种原因，控件的初始化或串行化过程失败了，就会使用这个缺省值。
句柄hBlob和hBlobDefault指向一个内存块，其中包含如下内容：
· | 包含了后面的二进制数据的长度（以字节为单位）的DWORD值，后面是：
· | 包含了实际的二进制数据的内存块。
注意当载入BLOB类型的属性时，PX_Blob会使用Windows的API函数GlobalAlloc来分配内存。你应该负责释放内存。因此，你的控件的析构函数必须对BLOB类型的属性句柄调用GlobalFree以释放为控件分配的内存。

请参阅：COleControl::DoPropExchange


 PX_Bool

BOOL PX_Bool(
CPropExchange* pPX,
LPCTSTR pszPropName,
BOOL& bValue
);
BOOL PX_Bool(
CPropExchange* pPX,
LPCTSTR pszPropName,
BOOL& bValue,
BOOL bDefault
);

返回值：
如果成功地交换了数据，则返回非零值；否则返回0。

参数：
pPX | 指向CPropExchange对象的指针（通常作为参数传递给DoPropExchange）。
pszPropName | 将要交换的属性的名字。
bValue | 对保存属性的变量的引用（通常是你的类的成员变量）。
bDefault | 属性的缺省值。

说明：
在你的控件的DoPropExchange成员函数内调用这个函数，用以串行化或初始化一个BOOL类型的属性。属性的值将从bValue引用的变量中读写。如果指定了bDefault，它将被用作该属性的缺省值。如果由于某种原因，控件的串行化过程失败了，就会使用这个缺省值。

请参阅：COleControl::DoPropExchange


 PX_Color

BOOL PX_Color(
CPropExchange* pPX,
LPCTSTR pszPropName,
OLE_COLOR& clrValue
);
BOOL PX_Color(
CPropExchange* pPX,
LPCTSTR pszPropName,
OLE_COLOR& clrValue,
OLE_COLOR clrDefault
);

返回值：
如果成功地交换了数据，则返回非零值；否则返回0。

参数：
pPX | 指向CPropExchange对象的指针（通常作为参数传递给DoPropExchange）。
pszPropName | 将要交换的属性的名字。
clrValue | 对保存属性的变量的引用（通常是你的类的成员变量）。
clrDefault | 属性的缺省值。

说明：
在你的控件的DoPropExchange成员函数内调用这个函数，用以串行化或初始化一个OLE_COLOR类型的属性。属性的值将从clrValue引用的变量中读写。如果指定了clrDefault，它将被用作该属性的缺省值。如果由于某种原因，控件的串行化过程失败了，就会使用这个缺省值。

请参阅：COleControl::DoPropExchange


 PX_Currency

BOOL PX_Currency(
CPropExchange* pPX,
LPCTSTR pszPropName,
CY& cyValue
);
BOOL PX_Currency(
CPropExchange* pPX,
LPCTSTR pszPropName,
CY& cyValue,
CY cyDefault
);

返回值：
如果成功地交换了数据，则返回非零值；否则返回0。

参数：
pPX | 指向CPropExchange对象的指针（通常作为参数传递给DoPropExchange）。
pszPropName | 将要交换的属性的名字。
cyValue | 对保存属性的变量的引用（通常是你的类的成员变量）。
cyDefault | 属性的缺省值。

说明：
在你的控件的DoPropExchange成员函数内调用这个函数，用以串行化或初始化一个currency类型的属性。属性的值将从cyValue引用的变量中读写。如果指定了cyDefault，它将被用作该属性的缺省值。如果由于某种原因，控件的串行化过程失败了，就会使用这个缺省值。

请参阅：COleControl::DoPropExchange


 PX_DataPath

BOOL PX_DataPath(
CPropExchange* pPX,
LPCTSTR pszPropName,
CDataPathProperty& dataPathProperty
);
BOOL PX_DataPath(
CPropExchange* pPX,
CDataPathProperty& dataPathProperty
);

返回值：
如果成功地交换了数据，则返回非零值；否则返回0。

参数：
pPX | 指向CPropExchange对象的指针（通常作为参数传递给DoPropExchange）。
pszPropName | 将要交换的属性的名字。
dataPathProperty | 对保存属性的变量的引用（通常是你的类的成员变量）。

说明：
在你的控件的DoPropExchange成员函数内部调用这个函数以串行化或初始化一个CDataPathProperty类型的日期路径属性。日期路径属性实现了异步的控件属性。属性的值将从dataPathProperty所引用的变量中读写。

请参阅：
COleControl::DoPropExchange, CDataPathProperty


 PX_Double

BOOL PX_Double(
CPropExchange* pPX,
LPCTSTR pszPropName,
double& doubleValue
);
BOOL PX_Double(
CPropExchange* pPX,
LPCTSTR pszPropName,
double& doubleValue,
double doubleDefault
);

返回值：
如果成功地交换了数据，则返回非零值；否则返回0。

参数：
pPX | 指向CPropExchange对象的指针（通常作为参数传递给DoPropExchange）。
pszPropName | 将要交换的属性的名字。
doubleValue | 对保存属性的变量的引用（通常是你的类的成员变量）。
doubleDefault | 属性的缺省值。

说明：
在你的控件的DoPropExchange成员函数内调用这个函数，用以串行化或初始化一个double类型的属性。属性的值将从doubleValue引用的变量中读写。如果指定了doubleDefault，它将被用作该属性的缺省值。如果由于某种原因，控件的串行化过程失败了，就会使用这个缺省值。

请参阅：
COleControl::DoPropExchange, PX_Float, PX_Short


 PX_Float

BOOL PX_Float(
CPropExchange* pPX,
LPCTSTR pszPropName,
float& floatValue
);
BOOL PX_Float(
CPropExchange* pPX,
LPCTSTR pszPropName,
float& floatValue,
float floatDefault
);

返回值：
如果成功地交换了数据，则返回非零值；否则返回0。

参数：
pPX | 指向CPropExchange对象的指针（通常作为参数传递给DoPropExchange）。
pszPropName | 将要交换的属性的名字。
floatValue | 对保存属性的变量的引用（通常是你的类的成员变量）。
floatDefault | 属性的缺省值。

说明：
在你的控件的DoPropExchange成员函数内调用这个函数，用以串行化或初始化一个float类型的属性。属性的值将从floatValue引用的变量中读写。如果指定了floatDefault，它将被用作该属性的缺省值。如果由于某种原因，控件的串行化过程失败了，就会使用这个缺省值。

请参阅：
COleControl::DoPropExchange, PX_Double, PX_String


 PX_Font

BOOL PX_Font(
CPropExchange* pPX,
LPCTSTR pszPropName,
CFontHolder& font,
const FONTDESC FAR* pFontDesc = NULL,
LPFONTDISP pFontDispAmbient = NULL
);

返回值：
如果成功地交换了数据，则返回非零值；否则返回0。

参数：
pPX | 指向CPropExchange对象的指针（通常作为参数传递给DoPropExchange）。
pszPropName | 要交换的属性的名字。
font | 对包含了字体属性的CFontHolder对象的引用。
pFontDesc | 指向FONTDESC结构的指针，该结构包含了在pFontDispAmbient为NULL时用来初始化字体属性的缺省状态的值。
pFontDispAmbient | 指向字体的IFontDisp接口的指针，用于初始化字体属性的缺省状态。

说明：
在控件的DoPropExchange成员函数内调用这个函数，用以串行化或初始化字体类型的属性。属性的值将从字体（一个CFontHolder引用）读写。如果指定了pFontDesc和pFontDispAmbient，它们将被用于在必要时初始化属性的缺省值。如果由于某种原因控件的串行化过程失败了，就会使用这个值。通常，你在pFontDesc中传递NULL，在pFontDispAmbient中传递COleControl::AmbientFont返回的值。注意COleControl:: AmbientFont返回的字体对象必须用IFontDisp::Release来释放。

请参阅：
COleControl::DoPropExchange, COleControl::AmbientFont


 PX_IUnknown

BOOL PX_IUnknown(
CPropExchange* pPX,
LPCTSTR pszPropName,
LPUNKNOWN& pUnk,
REFIID iid,
LPUNKNOWN pUnkDefault = NULL
);

返回值：
如果成功地交换了数据，则返回非零值；否则返回0。

参数：
pPX | 指向CPropExchange对象的指针（通常作为参数传递给DoPropExchange）。
pszPropName | 将要交换的属性的名字。
pUnk | 对包含了对象的接口变量的引用，该变量代表属性的值。
iid | 接口ID指明控件将使用属性对象的哪个接口。
pUnkDefault | 属性的缺省值。

说明：
在你的控件的DoPropExchange成员函数内调用这个函数，用以串行化或初始化一个具有IUnknown接口的对象所代表的属性。属性的值将从pUnk引用的变量中读写。如果指定了pUnkDefault，它将被用作该属性的缺省值。如果由于某种原因，控件的串行化过程失败了，就会使用这个缺省值。

请参阅：COleControl::DoPropExchange


 PX_Long

BOOL PX_Long(
CPropExchange* pPX,
LPCTSTR pszPropName,
long& lValue
);
BOOL PX_Long(
CPropExchange* pPX,
LPCTSTR pszPropName,
long& lValue,
long lDefault
);

返回值：
如果成功地交换了数据，则返回非零值；否则返回0。

参数：
pPX | 指向CPropExchange对象的指针（通常作为参数传递给DoPropExchange）。
pszPropName | 将要交换的属性的名字。
lValue | 对保存属性的变量的引用（通常是你的类的成员变量）。
lDefault | 属性的缺省值。

说明：
在你的控件的DoPropExchange成员函数内调用这个函数，用以串行化或初始化一个long类型的属性。属性的值将从lValue引用的变量中读写。如果指定了lDefault，它将被用作该属性的缺省值。如果由于某种原因，控件的串行化过程失败了，就会使用这个缺省值。

请参阅：COleControl::DoPropExchange


 PX_Picture

BOOL PX_Picture(
CPropExchange* pPX,
LPCTSTR pszPropName,
CPictureHolder& pict
);
BOOL PX_Picture(
CPropExchange* pPX,
LPCTSTR pszPropName,
CPictureHolder& pict,
CPictureHolder& pictDefault
);

返回值：
如果成功地交换了数据，则返回非零值；否则返回0。

参数：
pPX | 指向CPropExchange对象的指针（通常作为参数传递给DoPropExchange）。
pszPropName | 将要交换的属性的名字。
pict | 对保存属性的CPictureHolder对象的引用（通常是你的类的成员变量）。
pictDefault | 属性的缺省值。

说明：
在你的控件的DoPropExchange成员函数内调用这个函数，用以串行化或初始化一个图形属性。属性的值将从pict引用的变量中读写。如果指定了pictDefault，它将被用作该属性的缺省值。如果由于某种原因，控件的串行化过程失败了，就会使用这个缺省值。

请参阅：COleControl::DoPropExchange


 PX_Short

BOOL PX_Short(
CPropExchange* pPX,
LPCTSTR pszPropName,
short& sValue
);
BOOL PX_Short(
CPropExchange* pPX,
LPCTSTR pszPropName,
short& sValue,
short sDefault
);

返回值：
如果成功地交换了数据，则返回非零值；否则返回0。

参数：
pPX | 指向CPropExchange对象的指针（通常作为参数传递给DoPropExchange）。
pszPropName | 将要交换的属性的名字。
sValue | 对保存属性的变量的引用（通常是你的类的成员变量）。
sDefault | 属性的缺省值。

说明：
在你的控件的DoPropExchange成员函数内调用这个函数，用以串行化或初始化一个short类型的属性。属性的值将从sValue引用的变量中读写。如果指定了sDefault，它将被用作该属性的缺省值。如果由于某种原因，控件的串行化过程失败了，就会使用这个缺省值。

请参阅：COleControl::DoPropExchange


 PX_String

BOOL PX_String(
CPropExchange* pPX,
LPCTSTR pszPropName,
CString& strValue
);
BOOL PX_String(
CPropExchange* pPX,
LPCTSTR pszPropName,
CString& strValue,
CString strDefault
);

返回值：
如果成功地交换了数据，则返回非零值；否则返回0。

参数：
pPX | 指向CPropExchange对象的指针（通常作为参数传递给DoPropExchange）。
pszPropName | 将要交换的属性的名字。
strValue | 对保存属性的变量的引用（通常是你的类的成员变量）。
strDefault | 属性的缺省值。

说明：
在你的控件的DoPropExchange成员函数内调用这个函数，用以串行化或初始化一个字符串属性。属性的值将从strValue引用的变量中读写。如果指定了strDefault，它将被用作该属性的缺省值。如果由于某种原因，控件的串行化过程失败了，就会使用这个缺省值。

请参阅：
COleControl::DoPropExchange, CString


 PX_ULong

BOOL PX_ULong(
CPropExchange* pPX,
LPCTSTR pszPropName,
ULONG& ulValue
);
BOOL PX_ULong(
CPropExchange* pPX,
LPCTSTR pszPropName,
ULONG& ulValue,
long ulDefault
);

返回值：
如果成功地交换了数据，则返回非零值；否则返回0。

参数：
pPX | 指向CPropExchange对象的指针（通常作为参数传递给DoPropExchange）。
pszPropName | 将要交换的属性的名字。
ulValue | 对保存属性的变量的引用（通常是你的类的成员变量）。
ulDefault | 属性的缺省值。

说明：
在你的控件的DoPropExchange成员函数内调用这个函数，用以串行化或初始化一个ULONG类型的属性。属性的值将从ulValue引用的变量中读写。如果指定了ulDefault，它将被用作该属性的缺省值。如果由于某种原因，控件的串行化过程失败了，就会使用这个缺省值。

请参阅：COleControl::DoPropExchange


 PX_UShort

BOOL PX_UShort(
CPropExchange* pPX,
LPCTSTR pszPropName,
USHORT& usValue
);
BOOL PX_UShort(
CPropExchange* pPX,
LPCTSTR pszPropName,
USHORT& usValue,
USHORT usDefault
);

返回值：
如果成功地交换了数据，则返回非零值；否则返回0。

参数：
pPX | 指向CPropExchange对象的指针（通常作为参数传递给DoPropExchange）。
pszPropName | 将要交换的属性的名字。
usValue | 对保存属性的变量的引用（通常是你的类的成员变量）。
usDefault | 属性的缺省值。

说明：
在你的控件的DoPropExchange成员函数内调用这个函数，用以串行化或初始化一个unsigned short类型的属性。属性的值将从usValue引用的变量中读写。
如果指定了usDefault，它将被用作该属性的缺省值。如果由于某种原因，控件的串行化过程失败了，就会使用这个缺省值。

请参阅：COleControl::DoPropExchange


 PX_VBXFontConvert

BOOL PX_VBXFontConvert( CPropExchange* pPX, CFontHolder& font );

返回值：
如果成功地交换了数据，则返回非零值；否则返回0。

参数：
pPX | 指向CPropExchange对象的指针（通常作为参数传递给DoPropExchange）。
font | OLE控件的字体属性，包含了转换的VBX控件与字体有关的属性。

说明：
在控件的DoPropExchange成员函数内部调用这个函数，转换VBX控件与字体有关的属性，用以初始化字体属性。
这个函数只能被那些设计来直接代替VBX控件的OLE控件使用。当Visual Basic开发环境转换一个包含VBX控件的窗体，使用相应的OLE控件时，它将会调用控件的IDataObject::SetData函数，传递一个包含了VBX控件的属性数据的属性集。这个操作随后使控件的DoPropExchange函数被激活。DoPropExchange能够调用PX_VBXFontConvert以把VBX控件与字体有关的属性（例如，“字体名”、“字体大小”等）转换为OLE控件中字体属性的相应内容。
只有当控件是从VBX窗体应用程序中转换而来时才能调用PX_VBXFontConvert。例如：
void CSampleCtrl::DoPropExchange(CPropExchange* pPX)
{
ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor));
COleControl::DoPropExchange(pPX);
if (IsConvertingVBX()) PX_VBXFontConvert(pPX, InternalGetFont());
}

请参阅：
COleControl::DoPropExchange, COleControl::AmbientFont, PX_Font


 RFX_Binary

void RFX_Binary(
CFieldExchange* pFX,
const char* szName,
CByteArray& value,
int nMaxLength = 255
);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象所指定操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
value | 指定数据成员所保存的值——要被交换的值。对于从记录集到数据源的数据传送，CByteArray类型的值是从指定的数据成员中获得的。对于从数据源到记录集的数据传送，该值保存在指定的数据成员中。
nMaxLength | 要被交换的字符串或数组对象的最大长度。nMaxLength的缺省值为255。合法的值为1到INT_MAX。框架将分配这么多内存。为了获得最好的性能，应该传递一个足够大的值，使之能够容纳你要求的最大数据项。

说明：
RFX_Binary函数在CRecordset对象的字段数据成员和数据源中记录的SQL_BINARY，SQL_VARBINARY或SQL_LONGVARBINARY型数据列之间交换字节数组数据。数据源中这些类型的数据被映射到记录集中的CByteArray类型。示例参见“RFX_Text”

请参阅：
RFX_Text, RFX_Bool, RFX_Long, RFX_Int, RFX_Single, RFX_Double, RFX_Date, RFX_Byte, RFX_LongBinary, CFieldExchange::SetFieldType


 RFX_Binary_Bulk

void RFX_Binary_Bulk(
CFieldExchange* pFX,
LPCTSTR szName,
BYTE** prgByteVals,
long** prgLengths,
int nMaxLength
);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象能指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
prgByteVals | 指向BYTE值的数组的指针。这个数组中保存了将要从数据源传送到记录集的数据。
prgLengths | 指向长整数数组的指针。这个数组中保存了prgByteVals指向的数组中每个值的以字节为单位的长度。注意如果对应的数据项中是个NULL值，那么这个数组中将保存一个SQL_NULL_DATA值。更多的细节参见ODBC SDK程序员参考中的ODBC API函数SQLBindCol。
nMaxLength | prgByteVals指向的数组中保存的指定最大允许长度。为了确保数据不被截断，应该传递一个足够大的值，使之能够容纳你要求的最大数据项。

说明：
RFX_Binary_Bulk函数将ODBC数据源的数据列中的多行字节数据传送给CRecordset的派生对象中的相应数组。数据源的列可以属于以下类型：SQL_BINARY，SQL_VARBINARY或SQL_LONGVARBINARY。记录集必须定义一个BYTE指针型的字段数据成员。
如果你把prgByteVals和prgLengths初始化为NULL，那么它们指向的数组将自动分配，其大小等于行集的大小。
注意：
成组记录字段交换仅把数据从数据源传送到记录集对象。要使你的记录集可更新，必须使用ODBC的API函数SQLSetPos。这种做法的例子参见DBFETCH。
更多的信息参见“Visual C++程序员指南”中的文章“记录集：成组获取记录（ODBC）”和“记录字段交换（RFX）”。

示例：参见RFX_Text_Bulk.

请参阅：
RFX_Bool_Bulk, RFX_Byte_Bulk, RFX_Date_Bulk, RFX_Double_Bulk, RFX_Int_Bulk, RFX_Long_Bulk, RFX_Single_Bulk, RFX_Text_Bulk, CFieldExchange::SetFieldType


 RFX_Bool

void RFX_Bool( CFieldExchange* pFX, const char* szName, BOOL& value);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象能指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员所保存的值——要被交换的值。对于从记录集到数据源的数据传送，BOOL类型的值是从指定的数据成员中获得的。对于从数据源到记录集的数据传送，该值保存在指定的数据成员中。

说明：
RFX_BOOL函数在CRecordset对象的字段数据成员和数据源中记录的SQL_BIT型数据列之间交换布尔型数据。

示例：参见RFX_Text。

请参阅：
RFX_Text, RFX_Long, RFX_Int, RFX_Single, RFX_Double, RFX_Date, RFX_Byte, RFX_Binary, RFX_LongBinary, CFieldExchange::SetFieldType


 RFX_Bool_Bulk

void RFX_Bool_Bulk( CFieldExchange* pFX, LPCTSTR szName, BOOL** prgBoolVals, long** prgLengths);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象所指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
prgBoolVals | 指向BOOL值数组的指针。这个数组中保存了将要从数据源传送到记录集的数据。
prgLengths | 指向长整数数组的指针。这个数组中保存了prgBoolVals指向的数组中每个值的以字节为单位的长度。注意如果对应的数据项中是个NULL值，那么这个数组中将保存一个SQL_NULL_DATA值。更多的细节参见ODBC SDK程序员参考中的ODBC API函数SQLBindCol。

说明：
RFX_Bool_Bulk函数将ODBC数据源的数据列中的多行布尔数据传送给CRecordset派生对象中的相应数组。数据源的列必须是SQL_BIT类型的。记录集必须定义一个BOOL指针型的字段数据成员。
如果你把prgBoolVals和prgLengths初始化为NULL，那么它们指向的数组将自动分配，其大小等于行集的大小。
注意：
成组记录字段交换仅把数据从数据源传送到记录集对象。如果要使你的记录集可更新，必须使用ODBC的API函数SQLSetPos。这种做法的例子参见DBFETCH。
更多的信息参见“Visual C++程序员指南”中的文章“记录集：成组获取记录（ODBC）”和“记录字段交换（RFX）”。

示例：参见RFX_Text_Bulk.

请参阅：
RFX_Binary_Bulk, RFX_Byte_Bulk, RFX_Date_Bulk, RFX_Double_Bulk, RFX_Int_Bulk, RFX_Long_Bulk, RFX_Single_Bulk, RFX_Text_Bulk, CFieldExchange::SetFieldType


 RFX_Byte

void RFX_Byte( CFieldExchange* pFX, const char* szName, BYTE& value);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象所指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员所保存的值——要被交换的值。对于从记录集到数据源的数据传送，BYTE类型的值是从指定的数据成员中获得的。对于从数据源到记录集的数据传送，该值保存在指定的数据成员中。

说明：
RFX_Byte函数在CRecordset对象的字段数据成员和数据源中记录的SQL_TINYINT型数据列之间交换单字节数据。

示例：参见 RFX_Text.

请参阅：
RFX_Text, RFX_Bool, RFX_Long, RFX_Int, RFX_Single, RFX_Double, RFX_Date, RFX_Binary, RFX_LongBinary, CFieldExchange::SetFieldType


 RFX_Byte_Bulk

void RFX_Byte_Bulk(
CFieldExchange* pFX,
LPCTSTR szName,
BYTE** prgByteVals,
long** prgLengths
);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象所指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
prgByteVals | 指向BYTE值数组的指针。这个数组中保存了将要从数据源传送到记录集的数据。
prgLengths | 指向长整数数组的指针。这个数组中保存了prgByteVals指向的数组中每个值的以字节为单位的长度。注意如果对应的数据项中是个NULL值，那么这个数组中将保存一个SQL_NULL_DATA值。更多的细节参见ODBC SDK程序员参考中的ODBC API函数SQLBindCol。

说明：
RFX_Byte_Bulk函数将ODBC数据源的数据列中的多行布尔数据传送给CRecordset的派生对象中的相应数组。数据源的列必须是SQL_TINYINT类型的。记录集必须定义一个BYTE指针型的字段数据成员。
如果你把prgByteVals和prgLengths初始化为NULL，那么它们指向的数组将自动分配，其大小等于行集的大小。
注意：
成组记录字段交换仅把数据从数据源传送到记录集对象。如果要使你的记录集可更新，必须使用ODBC的API函数SQLSetPos。这种做法的例子参见DBFETCH。
更多的信息参见“Visual C++程序员指南”中的文章“记录集：成组获取记录（ODBC）”和“记录字段交换（RFX）”。

示例：参见RFX_Text_Bulk。

请参阅：
RFX_Binary_Bulk, RFX_Bool_Bulk, RFX_Date_Bulk, RFX_Double_Bulk, RFX_Int_Bulk, RFX_Long_Bulk, RFX_Single_Bulk, RFX_Text_Bulk, CFieldExchange::SetFieldType


 RFX_Date

void RFX_Date( CFieldExchange* pFX, const char* szName, CTime& value );
void RFX_Date( CFieldExchange* pFX, const char* szName, TIMESTAMP_STRUCT& value );

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象能指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员所保存的值——要被交换的值。在函数的两个版本中，value的数据类型是不一样的。函数的第一个版本使用对CTime对象的引用。对于从记录集到数据源的数据传送，该值是从指定的数据成员中获得的。对于从数据源到记录集的数据传送，该值保存在指定的数据成员中。函数的第二个版本使用对TIMESTAMP_STRUCT结构的引用。 你必须在调用前自己设置这个结构。对话框数据交换（DDX）和ClassWizard都不支持这个版本。在你的字段映射中，将你对RFX_Date的第二个版本的调用写在ClassWizard的注释分界符之外。

说明：
RFX_Date函数在CRecordset对象的字段数据成员和数据源中记录的SQL_DATE，SQL_TIME或SQL_TIMESTAMP型数据列之间交换CTime或TIMESTAMP_STRUCT数据。
这个函数对应CTime的版本会带来一些中间处理的负担，范围也有限制。如果你认为这些因素很重要，那就使用第二个版本的函数。不过要注意它缺乏ClassWizard和DDX支持，并且需要你自己设置结构体。

示例：参见“RFX_Text”

请参阅：
RFX_Text, RFX_Bool, RFX_Long, RFX_Int, RFX_Single, RFX_Double, RFX_Byte, RFX_Binary, RFX_LongBinary, CFieldExchange::SetFieldType


 RFX_Date_Bulk

void RFX_Date_Bulk(
CFieldExchange* pFX,
LPCTSTR szName,
TIMESTAMP_STRUCT** prgTSVals,
long** prgLengths
);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象能指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
prgTSVals | 指向TIMESTAMP_STRUCT值数组的指针。这个数组中保存了将要从数据源传送到记录集的数据。有关TIMESTAMP_STRUCT数据类型的更多信息参见“ODBC SDK程序员参考”中的文章“记录字段交换：RFX如何工作”。
prgLengths | 指向长整数数组的指针。这个数组中保存了prgBoolVals指向的数组中每个值的以字节为单位的长度。注意如果对应的数据项中是个NULL值，那么这个数组中将保存一个SQL_NULL_DATA值。更多的细节参见ODBC SDK程序员参考中的ODBC API函数SQLBindCol。

说明：
RFX_Date_Bulk函数将ODBC数据源的数据列中的多行TIMESTAMP_STRUCT数据传送给CRecordset的派生对象中的相应数组。数据源的列可以是以下类型：SQL_DATE，SQL_TIME或SQL_TIMESTAMP。记录集必须定义一个TIMESTAMP_STRUCT指针型的字段数据成员。
如果你把prgTSVals和prgLengths初始化为NULL，那么它们指向的数组将自动分配，其大小等于行集的大小。
注意：
成组记录字段交换仅把数据从数据源传送到记录集对象。如果要使你的记录集可更新，必须使用ODBC的API函数SQLSetPos。这种做法的例子参见DBFETCH。
更多的信息参见“Visual C++程序员指南”中的文章“记录集：成组获取记录（ODBC）”和“记录字段交换（RFX）”。

示例：参见RFX_Text_Bulk.

请参阅：
RFX_Binary_Bulk, RFX_Bool_Bulk, RFX_Byte_Bulk, RFX_Double_Bulk, RFX_Int_Bulk, RFX_Long_Bulk, RFX_Single_Bulk, RFX_Text_Bulk, CFieldExchange::SetFieldType


 RFX_Double

void RFX_Double( CFieldExchange* pFX, const char* szName, double& value);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象能指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员所保存的值——要被交换的值。对于从记录集到数据源的数据传送，double类型的值是从指定的数据成员中获得的。对于从数据源到记录集的数据传送，该值保存在指定的数据成员中。

说明：
RFX_Double函数在CRecordset对象的字段数据成员和数据源中记录的SQL_DOUBLE型数据列之间交换double float数据。

示例：参见 RFX_Text.

请参阅：
RFX_Text, RFX_Bool, RFX_Long, RFX_Int, RFX_Single, RFX_Date, RFX_Byte, RFX_Binary, RFX_LongBinary, CFieldExchange::SetFieldType


 RFX_Double_Bulk

void RFX_Double_Bulk(
CFieldExchange* pFX,
LPCTSTR szName,
double** prgDblVals,
long** prgLengths
);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象能指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
prgDblVals | 指向double值数组的指针。这个数组中保存了将要从数据源传送到记录集的数据。
prgLengths | 指向长整数数组的指针。这个数组中保存了prgDblVals指向的数组中每个值的以字节为单位的长度。注意如果对应的数据项中是个NULL值，那么这个数组中将保存一个SQL_NULL_DATA值。更多的细节参见ODBC SDK程序员参考中的ODBC API函数SQLBindCol。

说明：
RFX_Double_Bulk函数将ODBC数据源的数据列中的多行双精度浮点数据传送给CRecordset的派生对象中的相应数组。数据源的列必须是SQL_DOUBLE类型的。记录集必须定义一个double指针型的字段数据成员。
如果你把prgDblVals和prgLengths初始化为NULL，那么它们指向的数组将自动分配，其大小等于行集的大小。
注意：
成组记录字段交换仅把数据从数据源传送到记录集对象。如果要使你的记录集可更新，必须使用ODBC的API函数SQLSetPos。这种做法的例子参见DBFETCH。
更多的信息参见“Visual C++程序员指南”中的文章“记录集：成组获取记录（ODBC）”和“记录字段交换（RFX）”。

示例：参见“RFX_Text_Bulk”

请参阅：
RFX_Binary_Bulk, RFX_Bool_Bulk, RFX_Byte_Bulk, RFX_Date_Bulk, RFX_Int_Bulk, RFX_Long_Bulk, RFX_Single_Bulk, RFX_Text_Bulk, CFieldExchange::SetFieldType


 RFX_Int

void RFX_Int( CFieldExchange* pFX, const char* szName, int& value);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象能指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员所保存的值——要被交换的值。对于从记录集到数据源的数据传送，int类型的值是从指定的数据成员中获得的。对于从数据源到记录集的数据传送，该值保存在指定的数据成员中。

说明：
RFX_Int函数在CRecordset对象的字段数据成员和数据源中记录的SQL_SMALLINT型数据列之间交换整数数据。

示例：参见“RFX_Text.”

请参阅：
RFX_Text, RFX_Bool, RFX_Long, RFX_Single, RFX_Double, RFX_Date, RFX_Byte, RFX_Binary, RFX_LongBinary, CFieldExchange::SetFieldType


 RFX_Int_Bulk

void RFX_Int_Bulk( CFieldExchange* pFX, LPCTSTR szName, int** prgIntVals, long** prgLengths);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象能指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
prgIntVals | 指向整数数组的指针。这个数组中保存了将要从数据源传送到记录集的数据。
prgLengths | 指向长整数数组的指针。这个数组中保存了prgIntVals指向的数组中每个值的以字节为单位的长度。注意如果对应的数据项中是个NULL值，那么这个数组中将保存一个SQL_NULL_DATA值。更多的细节参见ODBC SDK程序员参考中的ODBC API函数SQLBindCol。

说明：
RFX_Int_Bulk函数将ODBC数据源的数据列中的多行整数数据传送给CRecordset的派生对象中的相应数组。数据源的列必须是SQL_SMALLINT类型的。记录集必须定义一个int指针型的字段数据成员。
如果你把prgIntVals和prgLengths初始化为NULL，那么它们指向的数组将自动分配，其大小等于行集的大小。
注意：
成组记录字段交换仅把数据从数据源传送到记录集对象。如果要使你的记录集可更新，必须使用ODBC的API函数SQLSetPos。这种做法的例子参见DBFETCH。
更多的信息参见“Visual C++程序员指南”中的文章“记录集：成组获取记录（ODBC）”和“记录字段交换（RFX）”。

示例：参见“RFX_Text_Bulk.”

请参阅：
RFX_Binary_Bulk, RFX_Bool_Bulk, RFX_Byte_Bulk, RFX_Date_Bulk, RFX_Double_Bulk, RFX_Long_Bulk, RFX_Single_Bulk, RFX_Text_Bulk, CFieldExchange::SetFieldType


 RFX_Long

void RFX_Long( CFieldExchange* pFX, const char* szName, LONG& value);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象能指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员所保存的值——要被交换的值。对于从记录集到数据源的数据传送，long类型的值是从指定的数据成员中获得的。对于从数据源到记录集的数据传送，该值保存在指定的数据成员中。

说明：
RFX_Long函数在CRecordset对象的字段数据成员和数据源中记录的SQL_INTEGER型数据列之间交换整数数据。

示例：参见“RFX_Text.”

请参阅：
RFX_Text, RFX_Bool, RFX_Int, RFX_Single, RFX_Double, RFX_Date, RFX_Byte, RFX_Binary, RFX_LongBinary, CFieldExchange::SetFieldType


 RFX_Long_Bulk

void RFX_Long_Bulk(
CFieldExchange* pFX,
LPCTSTR szName,
long** prgLongVals,
long** prgLengths
);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象能指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
prgLongVals | 指向长整数数组的指针。这个数组中保存了将要从数据源传送到记录集的数据。
prgLengths | 指向长整数数组的指针。这个数组中保存了prgLongVals指向的数组中每个值的以字节为单位的长度。注意如果对应的数据项中是个NULL值，那么这个数组中将保存一个SQL_NULL_DATA值。更多的细节参见ODBC SDK程序员参考中的ODBC API函数SQLBindCol。

说明：
RFX_Long_Bulk函数将ODBC数据源的数据列中的多行长整数数据传送给CRecordset的派生对象中的相应数组。数据源的列必须是SQL_INTEGER类型的。记录集必须定义一个long指针型的字段数据成员。
如果你把prgLongVals和prgLengths初始化为NULL，那么它们指向的数组将自动分配，其大小等于行集的大小。
注意：
成组记录字段交换仅把数据从数据源传送到记录集对象。要使你的记录集可更新，必须使用ODBC的API函数SQLSetPos。这种做法的例子参见DBFETCH。
更多的信息参见“Visual C++程序员指南”中的文章“记录集：成组获取记录（ODBC）”和“记录字段交换（RFX）”。

示例：参见“RFX_Text_Bulk.”

请参阅：
RFX_Binary_Bulk, RFX_Bool_Bulk, RFX_Byte_Bulk, RFX_Date_Bulk, RFX_Double_Bulk, RFX_Int_Bulk, RFX_Single_Bulk, RFX_Text_Bulk, CFieldExchange::SetFieldType


 RFX_LongBinary

void RFX_LongBinary( CFieldExchange* pFX, const char* szName, CLongBinary& value );

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象能指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员所保存的值——要被交换的值。对于从记录集到数据源的数据传送，CLongBinary类型的值是从指定的数据成员中获得的。对于从数据源到记录集的数据传送，该值保存在指定的数据成员中。

说明：
RFX_LongBinary函数在CRecordset对象的字段数据成员和数据源中记录的SQL_LONGVARBINARY或SQL_LONGVARCHAR类型的数据列之间传递使用CLongBinary类的二进制大对象（BLOB）数据。

示例：参见“RFX_Text.”

请参阅：
RFX_Text, RFX_Bool, RFX_Long, RFX_Int, RFX_Single, RFX_Double, RFX_Date, RFX_Byte, RFX_Binary, CFieldExchange::SetFieldType, CLongBinary


 RFX_Single

void RFX_Single( CFieldExchange* pFX, const char* szName, float& value);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象能指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员所保存的值——要被交换的值。对于从记录集到数据源的数据传送，float类型的值是从指定的数据成员中获得的。对于从数据源到记录集的数据传送，该值保存在指定的数据成员中。

说明：
RFX_Single函数在CRecordset对象的字段数据成员和数据源中记录的SQL_REAL型数据列之间交换浮点数据。

示例：参见“RFX_Text.”

请参阅：
RFX_Text, RFX_Bool, RFX_Long, RFX_Int, RFX_Double, RFX_Date, RFX_Byte, RFX_Binary, RFX_LongBinary, CFieldExchange::SetFieldType


 RFX_Single_Bulk

void RFX_Single_Bulk(
CFieldExchange* pFX,
LPCTSTR szName,
float** prgFltVals,
long** prgLengths
);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象能指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
prgFltVals | 指向float数组的指针。这个数组中保存了将要从数据源传送到记录集的数据。
prgLengths | 指向长整数数组的指针。这个数组中保存了prgFltVals指向的数组中每个值的以字节为单位的长度。注意如果对应的数据项中是个NULL值，那么这个数组中将保存一个SQL_NULL_DATA值。更多的细节参见“ODBC SDK程序员参考”中的ODBC API函数SQLBindCol。

说明：
RFX_Single_Bulk函数将ODBC数据源的数据列中的多行浮点数据传送给CRecordset的派生对象中的相应数组。数据源的列必须是SQL_REAL类型的。记录集必须定义一个float指针型的字段数据成员。
如果你把prgFltVals和prgLengths初始化为NULL，那么它们指向的数组将自动分配，其大小等于行集的大小。
注意：
成组记录字段交换仅把数据从数据源传送到记录集对象。如果要使你的记录集可更新，你必须使用ODBC的API函数SQLSetPos。这种做法的例子参见DBFETCH。
更多的信息参见“Visual C++程序员指南”中的文章“记录集：成组获取记录（ODBC）”和“记录字段交换（RFX）”。

示例：参见“RFX_Text_Bulk.”

请参阅：
RFX_Binary_Bulk, RFX_Bool_Bulk, RFX_Byte_Bulk, RFX_Date_Bulk, RFX_Double_Bulk, RFX_Int_Bulk, RFX_Long_Bulk, RFX_Text_Bulk, CFieldExchange::SetFieldType


 RFX_Text

void RFX_Text(
CFieldExchange* pFX,
const char* szName,
CString& value,
int nMaxLength = 255,
int nColumnType = SQL_VARCHAR,
short nScale = 0
);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象能指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
value | 指定的数据成员所保存的值——要被交换的值。对于从记录集到数据源的数据传送，CString类型的值是从指定的数据成员中获得的。对于从数据源到记录集的数据传送，该值保存在指定的数据成员中。
nMaxLength | 将要被传送的字符串或数组的最大长度。nMaxLength的缺省值是255，合法的值为1到INT_MAX。框架会为数据分配这么多内存。为了获得最好的性能，应当传递一个足够大的值，使之能够容纳你要求的最大的数据项。
nColumnType | 主要为参数使用。一个指定了参数类型的整数。参数的类型是ODBC数据类型SQL_XXX中的一个。
nScale | 指定了SQL_DECIMAL或SQL_NUMERIC类型的值的范围。nScale只在设置参数值的时候才有用。更多的信息参见“ODBC SDK程序员参考”的附录D中的文章“精度，范围，长度和显示大小”。

说明：
RFX_Text函数在CRecordset对象的字段数据成员和数据源中记录的SQL_LONGVARCHAR，SQL_CHAR，SQL_VARCHAR，SQL_DECIMAL或SQL_NUMERIC型数据列之间交换CString数据。

示例：
这个例子演示了几个对RFX_Text的调用。注意其中还包括了对CFieldExchange::SetFieldType的两次调用。通常ClassWizard会写入对SetFieldType的第二次调用以及相关的RFX调用。你必须自己写入对SetFieldType的第一次调用以及相关的RFX调用。我们建议你把参数项放在
“//{{AFX_FIELD_MAP”注释之外。必须把参数放在注释之外。
// RFX_Text的例子
void CSections::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::inputParam);
RFX_Text(pFX, "Name", m_strNameParam);
//{{AFX_FIELD_MAP(CSections)
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_Text(pFX, "CourseID", m_strCourseID);
RFX_Text(pFX, "InstructorID", m_strInstructorID);
RFX_Int(pFX, "RoomNo", m_nRoomNo);
RFX_Text(pFX, "Schedule", m_strSchedule);
RFX_Int(pFX, "SectionNo", m_nSectionNo);
RFX_Single(pFX, "LabFee", m_flLabFee);
//}}AFX_FIELD_MAP
}

请参阅：
RFX_Bool, RFX_Long, RFX_Int, RFX_Single, RFX_Double, RFX_Date, RFX_Byte, RFX_Binary, RFX_LongBinary, CFieldExchange::SetFieldType


 RFX_Text_Bulk

void RFX_Text_Bulk(
CFieldExchange* pFX,
LPCTSTR szName,
LPSTR* prgStrVals,
long** prgLengths,
int nMaxLength
);

参数：
pFX | 指向CFieldExchange类对象的指针。这个对象包含了一些信息，用于定义函数调用的上下文环境。有关CFieldExchange对象能指定的操作的更多信息参见“Visual C++程序员指南”中的文章“记录字段交换：RFX如何工作”。
szName | 数据列的名字。
prgStrVals | 指向LPSTR数组的指针。这个数组中保存了将要从数据源传送到记录集的数据。注意在ODBC的当前版本中，这些值不能是Unicode的。
prgLengths | 指向长整数数组的指针。这个数组中保存了prgFltVals指向的数组中每个值的以字节为单位的长度。注意如果对应的数据项中是个NULL值，那么这个数组中将保存一个SQL_NULL_DATA值。更多的细节参见“ODBC SDK程序员参考”中的ODBC API函数SQLBindCol。
nMaxLength | prgStrVals所指向的数组中所能保存的值的最大长度，包括null结束字符。为了确保数据不被截断，应当传递一个足够大的值，使之能够容纳你要求的最大的数据项。

说明：
RFX_Text_Bulk函数将ODBC数据源的数据列中的多行字符数据传送给CRecordset的派生对象中的相应数组。数据源的列可以是SQL_LONGVARCHAR，SQL_CHAR，SQL_VARCHAR，SQL_DECIMAL或SQL_NUMERIC类型的。记录集必须定义一个LPSTR指针型的字段数据成员。
如果你把prgStrVals和prgLengths初始化为NULL，那么它们指向的数组将自动分配，其大小等于行集的大小。
注意：
成组记录字段交换仅把数据从数据源传送到记录集对象。如果要使你的记录集可更新，你必须使用ODBC的API函数SQLSetPos。这种做法的例子参见DBFETCH。
更多的信息参见“Visual C++程序员指南”中的文章“记录集：成组获取记录（ODBC）”和“记录字段交换（RFX）”。

示例：
ClassWizard不支持Bulk RFX函数，因此你必须手动在DoBulkFieldExchange函数中写入调用。这个例子演示了对RFX_Text_Bulk的调用，同时还有对RFX_Long_Bulk的调用。这些调用的前面是CFieldExchange::SetFieldType。注意对于参数，你调用RFX函数，而不是Bulk RFX函数。
void MultiRowSet::DoBulkFieldExchange( CFieldExchange* pFX )
{
pFX->SetFieldType( CFieldExchange::outputColumn );
RFX_Long_Bulk( pFX, _T( "[colRecID]" ), &m_rgID, &m_rgIDLenghts );
RFX_Text_Bulk( pFX, _T( "[colName]" ), &m_rgName, &m_rgNameLengths, 30 );
pFX->SetFieldType( CFieldExchange::inputParam );
RFX_Text( pFX, "NameParam", m_strNameParam );
}

请参阅：
RFX_Binary_Bulk, RFX_Bool_Bulk, RFX_Byte_Bulk, RFX_Date_Bulk, RFX_Double_Bulk, RFX_Int_Bulk, RFX_Long_Bulk, RFX_Single_Bulk, CFieldExchange::SetFieldType


 RUNTIME_CLASS

RUNTIME_CLASS( class_name )

参数：
class_name 类的实际名字（不用引号括起来）。

说明：
利用这个宏通过C++类的名字获得一个运行时类结构。
RUNTIME_CLASS为class_name指定的类返回一个指向CRuntimeClass结构的指针。只有用DECLARE_DYNAMIC，DECLARE_DYNCREATE或DECLARE_SERIAL定义的CObject的派生类才能返回CRuntimeClass结构指针。
更多的信息参见“Visual C++程序员指南”中的“CObject类”主题。

示例：
// RUNTIME_CLASS的例子
CRuntimeClass* prt = RUNTIME_CLASS( CAge );
ASSERT( lstrcmp( prt->m_lpszClassName, "CAge" ) == 0 );

请参阅：
DECLARE_DYNAMIC, DECLARE_DYNCREATE, DECLARE_SERIAL, CObject::GetRuntimeClass, CRuntimeClass


 SerializeElements

template <class TYPE>
void AFXAPI SerializeElements( CArchive& ar, TYPE* pElements, int nCount );

参数：
TYPE | 指定了元素类型的模板参数。
ar | 用来写入存档或读出存档的档案对象。
pElements | 指向要被存档的元素的指针。
nCount | 要存档的元素的数目。

说明：
CArray，CList和CMap调用这个函数以串行化元素。缺省的实现进行按位读写。
有关这个函数和其它帮助函数的实现的信息参见“Visual C++程序员指南”中的文章“集合：如何生成类型安全的集合”。

请参阅：CArchive


 STATIC_DOWNCAST

STATIC_DOWNCAST( class_name, pobject )

参数：
class_name | 类的名字。
pobject | 将要被强制转换为class_name类型的对象指针的指针。

说明：
如果在创建你的应用程序时定义了_DEBUG预处理符号，这个宏将把一个对象指针从一种类型转换为一种相关的类型。如果指针不为NULL，并且指向的对象不属于目标类型的话，这个宏将会引起ASSERT。
在没有_DEBUG的版本中，这个宏不作任何检查就进行转换。
目标类型由class_name参数指定，而pobject参数标识了指针。例如，你可能会通过以下表达式把一个名为pYourDoc的CYourDocument指针转换为CDocument指针：
CDocument* pDoc = STATIC_DOWNCAST(CDocument, pYourDoc);
如果pYourDoc并不指向一个CDocument对象，那么这个宏将会引起ASSERT。

请参阅：DYNAMIC_DOWNCAST


 THIS_FILE

说明：
这个宏展开要被编译的文件的名字。这个信息被ASSERT和VERIFY宏所使用。
AppWizard和ClassWizard在它们生成的源代码文件中写入这个宏。

请参阅：ASSERT, VERIFY


 THROW

THROW( exception_object_pointer )

参数：
exception_object_pointer 指向从CException继承的异常对象的指针。

说明：
抛出指定的异常。THROW中断程序的运行，将控制权转移到你的程序中相关的CATCH块。如果你没有提供CATCH块，那么控制权将会转移到微软基础类库的模块，它打印出一条错误信息，然后退出。
更多的信息参见“Visual C++程序员指南”中的文章“异常”。

请参阅：
THROW_LAST, TRY, CATCH, AND_CATCH, END_CATCH, CATCH_ALL, AND_CATCH_ALL, END_CATCH_ALL, AfxThrowArchiveException, AfxThrowFileException, AfxThrowMemoryException, AfxThrowNotSupportedException, AfxThrowResourceException, AfxThrowUserException


 THROW_LAST

THROW_LAST( )

说明：
将异常抛回下一个外部CATCH块。
这个宏使你能够抛出一个本地产生的异常。如果你试图抛出一个刚捕捉到的异常，通常它会越过作用字段并被删除。通过THROW_LAST，这个异常就可以被正确地传递给下一个CATCH处理函数。
更多的信息参见“Visual C++程序员指南”中的文章“异常”。

请参阅：
THROW, TRY, CATCH, AND_CATCH, END_CATCH, CATCH_ALL, AND_CATCH_ALL, END_CATCH_ALL


 TRACE

TRACE( exp )

参数：
exp 指定了可变数目的参数，它们的使用方式与运行时函数printf中的可变数目的参数相同。

说明：
提供了与printf函数类似的功能，可以向转储设备，例如文件或调试终端发送格式化字符串。与MS-DOS下的C程序中的printf类似，TRACE宏是在程序指向时跟踪变量值的简便方式。在调试环境中，TRACE宏的输出发送到afxDump。在发行环境中，它不做任何操作。
TRACE宏每次最多可以发送512个字符。如果你通过格式化命令调用TRACE宏，被展开后的格式化命令的字符串总长度不能超过512，包括结尾的NULL字符。超出了这个限制就会引起ASSERT。
注意：这个宏仅在MFC的调试版本中有效。
更多的信息参见"Visual C++程序员指南"中的文章"MFC调试支持"。

示例
// TRACE的例子
int i = 1;
char sz[] = "one";
TRACE( "Integer = %d, String = %s\n", i, sz );
// output： 'Integer = 1, String = one'

请参阅：TRACE0, TRACE1, TRACE2, TRACE3, AfxDump, afxTraceEnabled


 TRACE0

TRACE0( exp )

参数：
exp 与运行时函数printf中类似的格式字符串。

说明：
TRACE0与TRACE类似，是一组跟踪宏中的一个形式，可以用它们来产生调试输出。这组宏包括：
· | TRACE0 | 接收一个格式字符串，可以用于将简单的文本消息转储到afxDump。
· | TRACE1 | 接收一个格式字符串和一个参数（一个要被转储到afxDump的变量）。
· | TRACE2 | 接收一个格式字符串和两个参数（两个要被转储到afxDump的变量）。
· | TRACE3 | 接收一个格式字符串和三个参数（三个要被转储到afxDump的变量）。
如果你生成了应用程序的发行版本，TRACE0不做任何操作。与TRACE一样，它仅在应用程序的调试版本中才把数据转储到afxDump中。
注意：这个宏仅在MFC的调试版本中有效。

示例
// TRACE0的例子
TRACE0( "Start Dump of MyClass members:" );

请参阅：TRACE, TRACE1, TRACE2, TRACE3


 TRACE1

TRACE1( exp, param1 )

参数
exp | 与运行时函数printf中类似的格式字符串。
param1 | 将被转储的变量的名字。

说明：TRACE1宏的描述参见TRACE0。

示例
// TRACE1的例子
int i = 1;
TRACE1( "Integer = %d\n", i );
// output： 'Integer = 1'


 TRACE2

TRACE2( exp, param1, param2 )

参数：
exp | 与运行时函数printf中类似的格式字符串。
param1 | 要被转储的变量的名字。
param2 | 要被转储的变量的名字。

说明：TRACE2的描述参见TRACE0。

示例
// TRACE2的例子
int i = 1;
char sz[] = "one";
TRACE2( "Integer = %d, String = %s\n", i, sz );
// 输出： 'Integer = 1, String = one'


 TRACE3

TRACE3( exp, param1, param2, param3 )

参数：
exp | 与运行时函数printf中类似的格式字符串。
param1 | 要被转储的变量的名字。
param2 | 要被转储的变量的名字。
param3 | 要被转储的变量的名字。

说明：TRACE3的描述参见TRACE0。


 TRY

TRY

说明：
用这个宏来建立一个TRY块。TRY块定义了一块代码，可以抛出异常。这些异常将被后面的CATCH和AND_CATCH块处理。允许递归：异常可以被传递给外部的TRY块，只要忽略它们或是使用THROW_LAST宏。用END_CATCH或END_CATCH_ALL宏来结束TRY块。
更多的信息参见“Visual C++程序员指南”中的文章“异常”。

请参阅：
CATCH, AND_CATCH, END_CATCH, CATCH_ALL, AND_CATCH_ALL, END_CATCH_ALL, THROW, THROW_LAST


 VERIFY

VERIFY( booleanExpression )

参数：
booleanExpression 指定了一个表达式（包含指针变量），其计算结果为非零值或0。

说明：
在MFC的调试版本中，VERIFY宏计算它的参数。如果结果是0，这个宏就打印出一条消息并中止程序。如果结果为非零值，它就不做任何操作。
诊断消息的形式如下：
assertion failed in file <name> in line <num>
这里的name是源文件的名字，num是源文件中发生断言失败的位置的行号。
在MFC的发行版本中，VERIFY计算表达式的值，但是并不输出或中断程序。例如，如果这个表达式是一个函数调用，这个调用会被执行。

请参阅：ASSERT


 结构、风格、回调函数和消息映射

这个部分描述了微软基础类库使用的结构和风格

本部分目录：
· | MFC使用的结构 | 提供各成员函数使用的结构的说明链接。
· | MFC使用的风格 | 提供在创建MFC对象时使用的风格的说明链接。
· | MFC使用的回调函数 | 提供MFC库中出现的回调函数的说明链接。
· | 消息映射 | 列出了所有的消息映射宏和所有的CWnd消息映射条目及其对应的成员函数原型。


 MFC使用的结构

下表列出了各种不同成员函数调用的结构。
寻求更多某个类的使用信息，请参阅类和成员函数的注意事项或使用表中某个结构的链接。

ABC 结构
ABCFLOAT 结构
AFX_EXTENSION_MODULE 结构
BITMAP 结构
BITMAPINFO 结构
CDaoDatabaseInfo 结构
CDaoErrorInfo 结构
CDaoFieldInfo 结构
CDaoIndexInfo 结构
CDaoIndexFieldInfo 结构
CDaoParameterInfo 结构
CDaoQueryDefInfo 结构
CDaoRelationInfo 结构
CDaoRelationFieldInfo 结构
CDaoTableDefInfo 结构
CDaoWorkspaceInfo 结构
CODBCFieldInfo 结构
COLORADJUSTMENT 结构
COMPAREITEMSTRUCT 结构
CREATESTRUCT 结构
DELETEITEMSTRUCT 结构
DEVMODE 结构
DEVNAMES 结构
DRAWITEMSTRUCT 结构
EXTENSION_CONTROL_BLOCK 结构
FILETIME 结构
HSE_VERSION_INFO 结构
HTTP_FILTER_CONTEXT 结构
HTTP_FILTER_LOG 结构
HTTP_FILTER_PREPROC_HEADERS 结构
HTTP_FILTER_RAW_DATA 结构
HTTP_FILTER_URL_MAP 结构
HTTP_FILTER_VERSION 结构
LINGER 结构
LOGBRUSH 结构
LOGPEN 结构
MEASUREITEMSTRUCT 结构
MINMAXINFO 结构
MSG 结构
NCCALCSIZE_PARAMS 结构
PAINTSTRUCT 结构
POINT 结构
RECT 结构
RGNDATA 结构
SIZE 结构
SOCKADDR 结构
SOCKADDR_IN 结构
SYSTEMTIME 结构
TEXTMETRIC 结构
WINDOWPLACEMENT 结构
WINDOWPOS 结构
WSADATA 结构
XFORM 结构


 ABC结构

ABC结构具有如下形式：
typedef struct _ABC
{ /* abc */
int abcA;
UINT abcB;
int abcC;
} ABC;

ABC结构包含了TrueType字体中字符的宽度。

成员：
abcA | 指定了字符的A宽度。A宽度是指画出的字符图形离当前位置的距离。
abcB | 指定了字符的B宽度。B宽度是指画出的字符图形的宽度。
abcC | 指定了字符的C宽度。C宽度是指加在当前位置上的距离，用于提供字符图形右边的空白。

注释：
字符的总宽度是A，B和C宽度的总和。A或C宽度都可以是负的，指明上悬或下垂。

请参阅：CDC::GetCharABCWidths


 ABCFLOAT结构

ABCFLOAT结构具有如下形式：
typedef struct _ABCFLOAT
{ /* abcf */
FLOAT abcfA;
FLOAT abcfB;
FLOAT abcfC;
} ABCFLOAT;

ABCFLOAT结构包含了字符的A，B和C宽度。

成员：
abcfA | 指定了字符的A宽度。A宽度是指画出的字符图形离当前位置的距离。
abcfB | 指定了字符的B宽度。B宽度是指画出的字符图形的宽度。
abcfC | 指定了字符的C宽度。C宽度是指加在当前位置上的距离，用于提供字符图形右边的空白。

注释：
A，B和C宽度是根据字体的基准线测量的。字符的增量（总宽度）是A，B和C宽度的总和。A或C宽度都可以是负数，表明上悬或下垂。

请参阅：CDC::GetCharABCWidths


 AFX_EXTENSION_MODULE结构

AFX_EXTENSION_MODULE 结构具有如下形式：
struct AFX_EXTENSION_MODULE
{
BOOL bInitialized;
HMODULE hModule;
HMODULE hResource;
CRuntimeClass* pFirstSharedClass;
COleObjectFactory* pFirstSharedFactory;
};AFX_EXTENSION_MODULE
被用在MFC扩展DLL的初始化过程中，用于保存扩展DLL模块的状态。

成员：
bInitialized | 如果DLL模块已经用AfxInitExtensionModule初始化了，则为TRUE。
hModule | 指定了DLL模块的句柄。
hResource | 指定了DLL的自定义资源模块的句柄。
pFirstSharedClass | 指向有关DLL模块的第一个运行时类的信息（CRuntimeClass结构）的指针。用于提供运行时类列表的开始部分。
pFirstSharedFactory | 指向DLL模块的第一个对象工厂（COleObjectFactory对象）的指针。用于提供类工厂列表的开始部分。

注释：
MFC扩展DLL需要在它们的DllMain函数中做两件事情：
· | 调用AfxInitExtensionModule并检查返回值。
· | 如果DLL要引出CRuntimeClass对象或者拥有它自己的资源，就创建一个CDynLinkLibrary对象。
AFX_EXTENSION_MODULE结构被用于保存扩展DLL模块状态的一个备份，包括运行时对象的一个拷贝，它已经在进入DllMain函数之前被扩展DLL作为常规静态对象构造过程的一部分初始化过了。例如：
static AFX_EXTENSION_MODULE extensionDLL;
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID)
{
// 初始化这个DLL的扩展模块
VERIFY(AfxInitExtensionModule(extensionDLL, hInstance));
}
AFX_EXTENSION_MODULE结构中保存的模块信息可以被拷贝到CDynLinkLibrary对象中。例如：
// CDynLinkLibrary 类
IMPLEMENT_DYNAMIC(CDynLinkLibrary, CCmdTarget)
// 构造函数
CDynLinkLibrary::CDynLinkLibrary(AFX_EXTENSION_MODULE& state, BOOL bSystem)
{
#ifndef _AFX_NO_OLE_SUPPORT
m_factoryList.Construct(offsetof(COleObjectFactory, m_pNextFactory));
#endif
m_classList.Construct(offsetof(CRuntimeClass, m_pNextClass));
// 从AFX_EXTENSION_MODULE结构中拷贝信息
ASSERT(state.hModule != NULL);
m_hModule = state.hModule;
m_hResource = state.hResource;
m_classList.m_pHead = state.pFirstSharedClass;
#ifndef _AFX_NO_OLE_SUPPORT
m_factoryList.m_pHead = state.pFirstSharedFactory;
#endif
m_bSystem = bSystem;
}

请参阅：
AfxInitExtensionModule, AfxTermExtensionModule


 BITMAP结构

BITMAP结构具有如下形式：
typedef struct tagBITMAP
{ /* bm */
int bmType;
int bmWidth;
int bmHeight;
int bmWidthBytes;
BYTE bmPlanes;
BYTE bmBitsPixel;
LPVOID bmBits;
} BITMAP;

BITMAP结构定义了逻辑位图的高，宽，颜色格式和位值。

成员：
bmType | 指定了位图的类型。对于逻辑位图，这个成员必须为0。
bmWidth | 指定了位图的宽度，以像素为单位。宽度必须大于0。
bmHeight | 指定了位图的高度，以扫描行为单位。高度必须大于0。
bmWidthBytes | 指定了每个扫描行中字节的数目。这个值必须是个偶数，因为图形设备接口（GDI）假定位图中的位值构成一个整数（2字节）数组。换句话说，bmWidthBytes*8必须是16的倍数，大于或等于bmWidth与bmBitsPixel相乘所得的值。
bmPlanes | 指定了位图中颜色平面的数目。
bmBitsPixel | 指定了每个位平面中用于定义一个像素所需的颜色位数。
bmBits | 指向位图中位值的位置。bmBits成员必须是一个指向单字节数组的长指针。

注释：
现在使用的位图格式有单色的和彩色的。单色的位图使用每个位平面一位的格式。每个扫描线是16的倍数。
对于一个高度为n的单色位图，扫描线是按照如下方式组织的：
Scan 0
Scan 1
.
.
.
Scan n-2
Scan n-1
单色设备上的像素不是黑就是白。如果位图中对应的位是1，则像素就被打开（白）。如果对应的位是0，则像素被关闭（黑）。
所有具有RC_BITBLT位的设备都支持位图，该位是在CDC::GetDeviceCaps成员函数的RASTERCAPS索引中设置的。
每个设备都有它自己的颜色格式。为了在不同的设备间传递位图，使用Windows的GetDIBits和SetDIBits函数。

请参阅：CBitmap::CreateBitmapIndirect


 BITMAPINFO结构

BITMAPINFO结构具有如下形式：
typedef struct tagBITMAPINFO
{
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;

BITMAPINFO结构定义了Windows设备无关位图（DIB）的度量和颜色信息。

成员：
bmiHeader | 指定了一个BITMAPINFOHEADER结构，包含了有关设备相关位图的度量和颜色格式的信息。
bmiColors | 指定了一个RGBQUAD或DWORD数据类型的数组，定义了位图中的颜色。

注释：
设备无关位图由两个部分组成：
(1) | 一个BITMAPINFO结构，描述了位图的度量和颜色信息；
(2) | 一个字节数组，定义了位图的像素。数组中的字节被组合在一起，但是每个扫描行必须用零填补，在一个LONG边界结束。如果高度为正的，位图的起始位置在左下角。如果高度为负，起始位置在左上角。
(3)BITMAPINFOHEADER结构中的biBitCount成员决定了定义像素的位数以及位图中的最大颜色数。这个成员可以是下列值之一：
· | 位图是单色的，bmiColors成员包含两个入口。位图数组中的每一位代表一个像素。如果该位被清除，则用bmiColors表中的第一种颜色显示该像素。如果该位被置位，则用表中的第二种颜色显示该像素。
· | 位图最多有16种颜色，bmiColors成员中包含了最多可达16个入口。位图中的每个像素用一个4位的值来表示，该值用作颜色表的索引。例如，如果位图中的第一个字节是0x1F，这个字节代表两个像素。第一个像素包含了颜色表中第二种颜色，第二个像素包含了颜色表中第十六种颜色。
· | 位图最多有256种颜色，bmiColors成员包含了多达256个入口。在这种情况下，数组中的每个字节代表一个像素。
· | 位图最多有216种颜色。BITMAPINFOHEADER的biCompression成员必须是BI_BITFIELDS。bmiColors成员包含了3个DWORD型颜色掩码，分别代表了每个像素中的红，绿和蓝色成分。DWORD型掩码中的位必须是连续的，不能与其它掩码重叠。并非像素中的所有位都必须被使用。数组中的每个WORD值代表一个像素。
· | 位图最多具有224种颜色，bmiColors成员为NULL。位图数组中的每个三字节组合分别代表像素中蓝，绿红的深度。
· | 位图中最多具有232种颜色。BITMAPINFOHEADER中的biCompression成员必须是BI_BITFIELDS。bmiColors成员中包含了三个DWORD颜色掩码，分别指定了像素的红，绿和蓝成分。DWORD掩码中的位必须是连续的，并且不能与其它掩码重叠。并非像素中的所有位都必须被使用。数组中的每个DWORD值代表一个像素。
BITMAPINFOHEADER结构中的biClrUsed成员指定了颜色表中实际使用的索引的数目。如果biClrUsed成员被设为0，位图将使用biBitCount成员中指定的最大颜色数。
bmiColors表中的颜色应当按照其重要性的顺序出现。另一种情况是，对于使用DIB函数，bmiColors成员可以是一个16位无符号整数的数组，指定了当前实现的逻辑调色板中的索引，而不是确切的RGB值。在这种情况下，使用位图的应用程序必须调用Windows的DIB函数（CreateDIBitmap，CreateDIBPatternBrush和CreateDIBSection），iUsage参数应被设为DIB_PAL_COLORS。
如果位图是一个压缩位图（这意味着，这种位图的数组直接跟在一个指针所引用的BITMAPINFO头的后面），在使用DIB_PAL_COLORS模式的时候，biClrUsed成员必须被设为偶数，以便使DIB位图数组从DWORD边界开始。
注意：
如果位图被保存在文件中，或者要被传送到另一个应用程序，bmiColors成员不能包含调色板索引。除非应用程序独占地使用和控制位图，位图的颜色表中应当包含准确的RGB值。

请参阅：CBrush::CreateDIBPatternBrush


 CDaoDatabaseInfo结构

CDaoDatabaseInfo结构具有如下形式：
struct CDaoDatabaseInfo
{
CString m_strName; // Primary
BOOL m_bUpdatable; // Primary
BOOL m_bTransactions; // Primary
CString m_strVersion; // Secondary
long m_lCollatingOrder; // Secondary
short m_nQueryTimeout; // Secondary
CString m_strConnect; // All
};
CDaoDatabaseInfo结构中包含了与数据库对象有关的信息，该对象是为数据访问对象（DAO）定义的。这个数据库对象是CDaoDatabase类的MFC对象下面的一个DAO对象。对上面的Primary，Secondary和All的引用指明了CDaoWorkspace::GetDatabaseInfo成员函数是如何返回信息的。

成员：
m_strName | 数据库对象的唯一名字。要直接获得这个属性的值，调用CDaoDatabase::GetName。有关的细节参见DAO帮助的“名字属性”主题。
m_bUpdatable | 指明是否可以对数据库作出改变。要直接获得这个属性的值，调用CDaoDatabase::CanUpdate。有关的细节参见DAO帮助的“可更新的属性”主题。
m_bTransactions | 指明一个数据源是否支持事务——一系列改变的记录，以后可以被滚动回去（取消）或执行（保存）。如果数据库是基于Microsoft Jet数据库引擎的，Transaction属性是非零值，你可以使用事务。其它数据库引擎可能不支持事务。要直接获取这个属性，调用CDaoDatabase::CanTransact。有关的细节参见DAO帮助的“事务属性”主题。
m_strVersion | 指明了Microsoft Jet数据库引擎的版本。要直接获取这个属性的值，调用数据库对象的GetVersion成员函数。有关的细节参见DAO帮助的“版本属性”主题。
m_lCollatingOrder指定了字符串比较或排序中使用的顺序。可能的取值包括：
· | dbSortGeneral | 使用一般（English，French，German，Portuguese，Italian和Modern Spanish）的排序顺序。
· | dbSortArabic | 使用Arabic排序顺序。
· | dbSortCyrillic | 使用Russian排序顺序。
· | dbSortCzech | 使用Czech排序顺序。
· | dbSortDutch | 使用Dutch排序顺序。
· | dbSortGreek | 使用Greek排序顺序。
· | dbSortHebrew | 使用Hebrew排序顺序。
· | dbSortHungarian | 使用Hungarian排序顺序。
· | dbSortIcelandic | 使用Icelandic排序顺序。
· | dbSortNorwdan | 使用Norwegian或Danish排序顺序。
· | dbSortPDXIntl | 使用Paradox International排序顺序。
· | dbSortPDXNor | 使用Paradox Norwegian或Danish排序顺序。
· | dbSortPDXSwe | 使用Paradox Swedish或Finnish排序顺序。
· | dbSortPolish | 使用Polish排序顺序。
· | dbSortSpanish | 使用Spanish排序顺序。
· | dbSortSwedFin | 使用Swedish或Finnish排序顺序。
· | dbSortTurkish | 使用Turkish排序顺序。
· | dbSortUndefined | 使用的排序顺序未定义或未知。
更多的信息参见DAO帮助中的“数据访问的自定义Windows注册表设置”主题。
m_nQueryTimeout | 当在ODBC数据库上执行一个查询时，Microsoft Jet数据库引擎在超时错误发生前等待的秒数。缺省的超时值为60秒。当QueryTimeout被设为0时，不产生超时。这可能会引起程序挂起。要直接获得这个属性的值，调用数据库对象的GetQueryTimeout成员函数。有关的细节参见DAO帮助的“QueryTimeout属性”主题。
m_strConnect | 提供了有关打开的数据库的源的信息。有关连接字符串以及直接获取这个属性值的信息参见CDaoDatabase::GetConnect成员函数。更多的信息参见DAO帮助的“连接属性”主题。

注释：
CDaoWorkspace::GetDatabaseInfo成员函数所获得的信息被保存在CDaoDatabaseInfo结构中。为CDaoWorkspace对象调用GetDatabaseInfo函数，数据库对象被保存在该对象的数据库集合中。在调试版本中，CDaoDatabaseInfo还定义了一个Dump成员函数。你可以使用Dump来转储CDaoDatabaseInfo对象的内容。
有关这个结构以及其它MFC DAO Info结构的信息参见“Visual C++程序员指南”中的文章“DAO集合：获得有关DAO对象的信息”。

请参阅：
CDaoWorkspace, CDaoDatabase, CDaoWorkspace::GetDatabaseCount


 CDaoErrorInfo结构

CDaoErrorInfo结构具有以下形式：
struct CDaoErrorInfo
{
long m_lErrorCode;
CString m_strSource;
CString m_strDescription;
CString m_strHelpFile;
long m_lHelpContext;
};
CDaoErrorInfo结构包含了为数据访问对象（DAO）定义的错误对象的信息。MFC没有将DAO错误对象封装为一个类。CDaoException类提供了访问DAODBEngine对象中包含的错误集合的接口，该对象也包括了所有的工作空间。当MFC的DAO操作抛出一个你捕捉到的CDaoException对象时，MFC会填充CDaoErrorInfo结构并将它保存在异常对象的m_pErrorInfo成员中。（如果你选择了直接调用DAO，你必须自己调用异常对象的GetErrorInfo函数以填充m_pErrorInfo。）
有关处理DAO错误的更多信息参见“Visual C++程序员指南”中的文章“异常：数据库异常”。相关的信息参见DAO帮助的“错误对象”主题。

成员：
m_lErrorCode | 一个数字的DAO错误代码。参见DAO帮助的“可捕捉的数据访问错误”主题。
m_strSource | 最初产生错误的对象或应用程序的名字。源属性指定了一个字符串表达式，代表最初产生错误的对象；这个表达式通常是对象的类名。有关的细节参见DAO帮助的“源属性”主题。
m_strDescription | 与错误相关的描述性字符串。有关的细节参见DAO帮助的“描述属性”主题。
m_strHelpFile | Microsoft Windows帮助文件的经完全验证的路径。有关的细节参见DAO帮助的“帮助上下文，帮助文件属性”主题。
m_lHelpContext | Microsoft Windows的帮助文件中主题的上下文ID。有关的细节参见DAO帮助的“帮助上下文，帮助文件属性”主题。

说明：
CDaoException::GetErrorInfo成员函数获得的信息被保存在一个CDaoErrorInfo结构中。在异常处理函数中检查你捕捉到的CDaoException对象的m_pErrorInfo数据成员，或者在你生成的CDaoException对象中调用GetErrorInfo函数，目的是对可能会在DAO接口的直接调用中产生的错误进行检查。在调试版本中，CDaoErrorInfo还定义了一个Dump成员函数，可以使用Dump来转储CDaoErrorInfo对象的内容。
有关这个结构和其它MFC的DAO Info结构的信息参见“Visual C++程序员指南”中的文章“DAO集合：获取有关DAO对象的信息”。

请参阅：CDaoException


 CDaoFieldInfo结构

CDaoFieldInfo结构具有如下形式：
struct CDaoFieldInfo
{
CString m_strName; // Primary
short m_nType; // Primary
long m_lSize; // Primary
long m_lAttributes; // Primary
short m_nOrdinalPosition; // Secondary
BOOL m_bRequired; // Secondary
BOOL m_bAllowZeroLength; // Secondary
long m_lCollatingOrder; // Secondary
CString m_strForeignName; // Secondary
CString m_strSourceField; // Secondary
CString m_strSourceTable; // Secondary
CString m_strValidationRule; // All
CString m_strValidationText; // All
CString m_strDefaultValue; // All
};
CDaoFieldInfo结构中包含了为数据访问对象（DAO）定义的字段对象的信息。上面对Primary，Secondary和All的引用指明了CDaoTableDef，CDaoQueryDef和CDaoRecordset类中的GetFieldInfo成员函数是如何返回信息的。
MFC类不代表任何字段对象。相反，DAO对象构成了下面包含字段对象集合的MFC类的对象：CDaoTableDef，CDaoRecordset和CDaoQueryDef。这些类提供了用于访问字段信息中单个项的成员函数，也可以利用CDaoFieldInfo对象以及它的GetFieldInfo成员函数来一次访问所有的信息。
CDaoFieldInfo不仅可以用于检查对象的属性，还可以用于构造一个输入参数，用来创建表中的新字段。对于这个任务，可以使用更简单的选项。但是要想获得更好的控制，可以使用CDaoTableDef::CreateField的带CDaoFieldInfo参数的版本。

成员：
m_strName | 字段对象的唯一名字。有关的细节参见DAO帮助中的“名字属性”主题。
m_nType一个指明字段数据类型的值。有关的细节参见DAO帮助中的“类型属性”主题。这个属性的取值可能是下列值之一：
· | dbBoolean | 是/否，与TRUE/FALSE相同
· | dbByte | 字节
· | dbInteger | 短整数
· | dbLong | 长整数
· | dbCurrency | Currency，参见MFC类COleCurrency
· | dbSingle | 单精度数
· | dbDouble | 双精度数
· | dbDate | 日期/时间，参见MFC类COleDateTime
· | dbText | 文本，参见MFC类CString
· | dbLongBinary | 长二进制（OLE对象）可能你希望使用MFC类CByteArray来代替CLongBinary，因为CByteArray功能更强，也更易使用
· | dbMemo | 备注，参见MFC类CString。
· | dbGUID | 用于远程过程调用的全局唯一的标识符。更多的信息参见DAO帮助中的“类型属性”主题。 注意：不要对二进制数据使用字符串数据类型。这会使你的数据被传递给Unicode/ANSI转换层，导致负担增加，并且可能会导致不希望出现的转换。
m_lSize指明了包含文本的DAO字段对象的最大大小，以字节为单位，或者是包含了文本或数字值的字段对象的固定大小。有关的细节参见DAO帮助中的“大小属性”主题。大小可能是下列值之一：
类型 | 大小（Bytes） | 描述
dbBoolean | 1 | 字节是/否（与TRUE/FALSE相同）
dbByte | 1 | 字节
dbInteger | 2 | 整数
dbLong | 4 | 长整数
dbCurrency | 8 | Currency（COleCurrency）
dbSingle | 4 | 单精度数
dbDouble | 8 | 双精度数
dbDate | 8 | 日期/时间（COleDateTime）
dbText | 1～255 | 文本（CString）
dbLongBinary | 0 | 长二进制数据（OLE对象，CByteArray，用于代替CLongBinary）
dbMemo | 0 | 备注（CString）
dbGUID | 16 | 用于远程过程调用的全局唯一的标识符
m_lAttributes指定了表定义，记录集，查询定义或索引对象中包含的字段对象的特征。返回的值可能是这些值的和，用C++的位或操作符（|）生成：
· | dbFixedField | 字段大小是固定的（数字字段的缺省值）。
· | dbVariableField | 字段大小可变（仅对文本字段成立）。
· | dbAutoIncrField | 新记录的字段值自动增加到一个唯一的长整数，该数不能改变。仅支持Microsoft Jet数据库表。
· | dbUpdatableField | 字段的值可以改变。
· | dbDescending | 字段按照降序（Z～A或100～0）保存（仅适用于索引对象的字段集合中的字段对象。在MFC中，索引对象自己就包含在表定义对象中）。如果你省略了这个常量，字段就按照升序（A～Z或0～100）保存（缺省值）。
在检查这个属性的设置的时候，可以使用C++的位与操作符（&）来测试某个指定的值。在设置多重属性的时候，可以用位或操作符（|）把适当的常量组合起来。有关的细节参见DAO帮助中的“Attribute属性”主题。
m_nOrdinalPosition | 一个指定了数字顺序的值，将按照这种顺序显示由DAO字段对象所代表的字段。你可以用CDaoTableDef::CreateField来设置这个属性。有关的细节参见DAO帮助中的“OrdinalPosition属性”主题。
m_bRequired | 指明一个DAO字段对象是否需要非Null值。如果这个属性值为TRUE，那么这个字段不允许有Null值。如果Required被设为FALSE，这个字段就可以有Null值，也可以有符合AllowZeroLength和ValidationRule属性所指定的条件的值。有关的细节参见DAO帮助中的“Required属性”主题。你可以使用CDaoTableDef::CreateField来设置这个属性。
m_bAllowZeroLength | 指明对于一个文本类型或Memo数据类型的DAO字段对象，空字符串（“”）是否是有效的值。如果这个属性为TRUE，空字符串就是有效值。你可以将这个属性设为FALSE以确保不能将这个字段的值设为空字符串。有关的细节参见DAO帮助中的“AllowZeroLength属性”主题。你可以用CDaoTableDef::CreateField来设置这个属性。
m_lCollatingOrder | 为字符串比较和排序指定了文本顺序。有关的细节参见DAO帮助中的“为数据访问自定义Windows注册表设置”主题。可能的返回值列表参见CDaoDatabaseInfo结构中的m_lCollatingOrder成员。你可以用CDaoTableDef::CreateField来设置这个属性。
m_strForeignName | 一个值，在关系中指定了与原始表中的字段对应的外部表中的DAO字段对象的名字。有关的细节参见DAO帮助中的“ForeignName属性”主题。
m_strSourceField | 指定了一个字段名，是表定义，记录集或查询集对象所包含的DAO字段对象的数据源。例如，你可以使用这个属性来确定一个查询字段的数据源，这个字段的名字与基础表中的字段名无关。有关的细节参见DAO帮助中的“SourceField，SourceTable属性”主题。可以用CDaoTableDef::CreateField来设置这个属性。
m_strSourceTable | 指定了一个表名，是表定义，记录集或查询集对象的数据源。这个属性指定了与字段对象相关的原始表明。例如，你可以使用这个属性来确定一个查询字段的数据源，这个字段的名字与基础表中的字段名无关。有关的细节参见DAO帮助中的“SourceField，SourceTable属性”主题。你可以用CDaoTableDef::CreateField来设置这个属性。
m_strValidationRule当改变或增加字段的数据时用于检验数据是否有效的值。有关的细节参见DAO帮助中的“ValidationRule属性”主题。你可以用CDaoTableDef::CreateField来设置这个属性。
有关表定义的信息参见CDaoTableDefInfo结构的m_strValidationRule成员。
m_strValidationText | 一个值，指定了当DAO字段对象的值不符合ValidationRule属性所指定的有效规则时应用程序显示的消息文本。有关的细节参见DAO帮助中的“ValidationText属性”主题。你可以用CDaoTableDef::CreateField来设置这个属性。
m_strDefaultValue | 一个DAO字段对象的缺省值。当创建了一个新记录时，DefaultValue属性会被作为字段的缺省值自动输入。有关的细节参见DAO帮助中的“DefaultValue属性”主题。你可以用CDaoTableDef::CreateField来设置这个属性。

注释：
通过GetFieldInfo成员函数（属于包含该字段的类）获取的信息保存在CDaoFieldInfo结构中。调用保存了字段对象的包含对象的GetFieldInfo成员函数。在调试版本中，CDaoFieldInfo还定义了一个Dump成员函数。可以使用Dump来转储CDaoFieldInfo对象的内容。
有关这个结构以及其他MFC DAO Info结构的使用，参见“Visual C++程序员指南”中的文章“DAO集合：获取DAO对象的信息”。

请参阅：
CDaoTableDef::GetFieldInfo, CDaoRecordset::GetFieldInfo, CDaoQueryDef::GetFieldInfo


 CDaoIndexFieldInfo结构

CDaoIndexFieldInfo结构具有如下形式：
struct CDaoIndexFieldInfo
{
CString m_strName; // Primary
BOOL m_bDescending; // Primary
};
CDaoIndexFieldInfo结构中包含了为数据访问对象（DAO）定义的索引字段对象的信息。索引对象可以有多个字段，指明表定义（或基于表的记录集）的索引建立在哪些字段上。上面对Primary的引用指明了调用CDaoTableDef或CDaoRecordset类的GetIndexInfo成员函数时获得的信息是如何通过CDaoIndexInfo对象的m_pFiledInfos成员返回的。
MFC类不代表索引对象和索引字段对象。相反，DAO对象构成了CDaoTableDef或CDaoRecordset类的MFC对象，这些对象中包含了索引对象的集合，名为索引集。每个索引对象包含了一个字段对象的集合。这些类提供了用于访问索引信息中单个项的成员函数，你也可以通过调用包含对象的GetIndexInfo成员函数在CDaoIndexInfo对象中访问所有的项。CDaoIndexInfo中具有一个数据成员m_pFieldInfos，它指向一个CDaoIndexFieldInfo对象的数组。

成员：
m_strName | 索引字段对象的唯一的名字。有关的细节参见DAO帮助中的“Name属性”主体。
m_bDescending | 指明了索引对象定义的索引顺序。如果顺序是降序的则该成员的值为TRUE。

注释：
调用表定义或记录集对象的GetIndexInfo成员函数，你感兴趣的索引对象就保存在这些对象的索引集中。然后访问CDaoIndexInfo对象的m_pFieldInfos成员。m_pFieldInfos数组的长度保存在m_nFields中。CDaoIndexFieldInfo还在调试版本中定义了一个Dump函数。你可以使用Dump来转储CDaoIndexFieldInfo对象的内容。
有关这个结构以及其他MFC DAO Info结构的使用参加“Visual C++程序员指南”中的文章“DAO集合：获取DAO对象的信息”。

请参阅：
CDaoTableDef::GetIndexInfo, CDaoRecordset::GetIndexInfo


 CDaoIndexInfo结构

CDaoIndexInfo 结构具有如下形式：
struct CDaoIndexInfo
{
CDaoIndexInfo( ); // Constructor
CString m_strName; // Primary
CDaoIndexFieldInfo* m_pFieldInfos; // Primary
short m_nFields; // Primary
BOOL m_bPrimary; // Secondary
BOOL m_bUnique; // Secondary
BOOL m_bClustered; // Secondary
BOOL m_bIgnoreNulls; // Secondary
BOOL m_bRequired; // Secondary
BOOL m_bForeign; // Secondary
long m_lDistinctCount; // All

// Below the // Implementation comment:
// Destructor, not otherwise documented
};
CDaoIndexInfo结构中包含了有关为数据访问对象（DAO）定义的索引对象的信息。上面对Primary，Secondary和All的引用指明了CDaoTableDef和CDaoRecordset类的成员函数GetIndexInfo是符合返回信息的。
MFC类不代表索引对象。相反，DAO对象构成了属于CDaoTableDef或CDaoRecordset类的MFC对象，它们包含了索引对象的集合，称为索引集合。
这些类提供了用于访问索引信息的单个项的成员函数，还可以调用包含对象的GetIndexInfo成员函数，利用CDaoIndexInfo对象同时访问所有项。
CDaoIndexInfo具有一个构造函数和一个析构函数，用于适当地分配和释放m_pFieldInfos中的索引字段信息。

成员：
m_strName | 字段对象的唯一名字。有关的细节参见DAO帮助中的“Name属性”主题。
m_pFieldInfos | 指向一个CDaoIndexFieldInfo对象数组的指针，该数组指明了表定义或记录集中哪个字段是索引的关键字段。每个对象标识了索引中的一个字段。缺省的索引顺序是升序。一个索引对象可以具有一个或多个索引关键字段。它们可以是升序，降序或其组合。
m_nFields | m_pFieldInfos中保存的字段的数目。
m_bPrimary如果Primary属性为TRUE，则索引对象代表一个主索引。主索引由一个或多个字段组成，这些字段可以按照给定的顺序唯一地标识表中的所有记录。由于索引字段必须是唯一的，DAO中，索引对象的Unique属性也被设为TRUE。如果主索引由多于一个字段组成，每个字段都可以有重复的值，但是所有索引字段取值的组合必须是唯一的。主索引由表的关键字组成，通常包含了与主键中相同的字段。
当为一个表设置主键的时候，主键被自动设为表的主索引。更多的信息参见DAO帮助中的“Primary属性”和“Unique属性”主题。
注意：每个表最多只能有一个主索引。
m_bUnique指明一个索引对象是否是表的唯一索引。如果这个属性为TRUE，那么这个索引对象代表了唯一的索引。唯一的索引由表中的一个或多个字段组成，它们在逻辑上将表中的所有记录按照给定的唯一顺序排列起来。如果这个索引由一个字段组成，这个字段中的值必须是独立的。如果索引由多个字段组成，那么每个字段都可以有重复的值，但是它们的组合必须是唯一的。
如果索引的Unique和Primary属性都被设为TRUE，那么这个索引是主索引，并且是唯一的。他按照给定的逻辑顺序唯一地标识了表中的所有记录。如果Primary属性被设为FALSE，这个索引是次索引。次索引（关键索引或非关键索引）按照给定的顺序在逻辑上排列表中的记录，但是并不能作为表中记录的标识使用。
更多的信息参见DAO帮助中的“Primary属性”和“Unique属性”主题。
m_bClustered指明一个索引对象是否代表一个表的成簇索引。如果这个顺序被设为TRUE，那么索引对象代表成簇索引，否则就不是。成簇索引由一个或多个非关键字段组成，它们一起按照给定的顺序排列表中的所有记录。有了成簇索引，表中的数据将按照索引指定的顺序存储。成簇索引提供了访问数据的有效方式。更多的信息参见DAO帮助中的“Clustered属性”主题。
注意：对于使用Microsoft Jet数据库引擎的数据库，Clustered属性会被忽略，因为Jet数据库引擎不支持成簇索引。
m_bIgnoreNulls指明是否有记录的索引项在它们的索引字段中包含Null值。如果这个属性为TRUE，具有Null值的字段就没有索引项。如果要使对记录的查找更快速，可以为这个字段定义索引。如果你允许建立索引的字段中包含Null值，并且可能有许多项为Null，可以把索引对象的IgnoreNulls属性设为TRUE以减小索引使用的存储空间。IgnoreNulls属性和Required属性的设置共同决定了一个具有Null索引值的记录是否具有索引项，如下面的表格所示：
IgnoreNulls | Required | 索引字段中的Null
True | False | 允许有Null值，但没有索引项
False | False | 允许有Null值，有索引项
True或False | True不允许有Null值，没有索引项
更多的信息参见DAO帮助中的“IgnoreNulls属性”主题。
m_bRequired | 指明一个DAO索引对象是否要求非Null值。如果这个属性为TRUE，那么索引对象不允许有Null值。更多的信息参见DAO帮助中的“Required属性”主题。
Tip | 当你能够为DAO索引对象或字段对象（被表定义，记录集或查询定义对象所包含）设置这个属性的时候，就为字段对象设置这个属性。为字段对象设置的属性的有效性检查将在索引对象之前进行。
m_bForeign | 指明索引对象是否代表了表中的一个外部关键字。如果这个属性为TRUE，则索引对象代表了表中的外部关键字。外部关键字由外部表中的一个或多个字段组成，他唯一确定了主表中的行。当你创建一个要求引用完整性的关系时，Microsoft Jet数据库引擎为外部表创建一个索引对象并设置Foreign属性。更多的信息参见DAO帮助中的“Foreign属性”主题。
m_lDistinctCount | 指定了相关表中包含的索引对象的唯一值的数目。检查DistinctCount属性以确定索引中唯一值或键的数目。每个键只被计数一次，即使在索引允许重复值时，它们多次出现。这个信息对于试图通过统计索引信息来优化数据访问的应用程序非常有用。唯一值的数目还被当作索引对象的势。DistinctCount属性并不总是反映某一时刻关键字的数目。例如，由于取消事务所引起的改变不会被DistinctCount属性立即反映。更多的信息参见DAO帮助中的“DistinctCount属性”主题。

注释：
用表定义对象的GetIndexInfo成员函数获得的信息被保存在CDaoIndexInfo结构中。调用包含了索引对象的表定义对象的GetIndexInfo成员函数。在调试版本中CDaoIndexInfo还定义了一个Dump成员函数。你可以使用Dump来转储CDaoIndexInfo对象的内容。
有关这个结构以及其他MFC DAO Info结构的使用，参见“Visual C++程序员指南”中的文章“DAO集合：获取DAO对象的信息”。

请参阅：CDaoTableDef::GetIndexInfo


 CDaoParameterInfo结构

CDaoParameterInfo结构具有如下形式：
struct CDaoParameterInfo
{
CString m_strName; // Primary
short m_nType; // Primary
COleVariant m_varValue; // Secondary
};
CDaoParameterInfo结构中包含了为数据访问对象（DAO）定义的参数对象的信息。上面对Primary和Secondary的引用指明了CDaoQueryDef类的成员函数GetParameterInfo是如何返回信息的。
MFC没有把DAO参数对象封装为一个类。DAO查询对象构成了MFC的CDaoQueryDef对象的基础，在它们的参数集中保存了参数。要访问CDaoQueryDef对象中的参数对象，就调用查询定义对象的成员函数GetParameterInfo，可以获得特点的参数名或是参数集的索引。你可以与GetParameterInfo一起使用CDaoQueryDef::GetParameterCount函数，以在参数集中循环。

成员：
m_strName | 参数对象的唯一的名字。更多的信息参见DAO帮助中的“Name属性”主题。
m_nType | 指明了参数对象的数据类型的值。可能取值的列表参见CDaoFieldInfo结构的m_nType成员。更多的信息参见DAO帮助中的“Type属性”主题。
m_varValue | 参数的值，保存在COleVariant对象中。

注释：
通过成员函数CDaoQueryDef::GetParameterInfo获得的信息保存在CDaoParameterInfo结构中。为查询定义对象调用GetParameterInfo函数，这些对象的参数集中保存了参数对象。
注意：
如果你希望得到或设置参数的值，使用CDaoRecordset类的GetParamValue和SetParamValue成员函数。
CDaoParameterInfo还为调试模式定义了一个Dump成员函数。你可以使用Dump来转储CDaoParameterInfo对象的内容。关于这个结构以及其他MFC DAO Info结构的使用参见“Visual C++ 程序员指南”中的文章“DAO集合：获得DAO对象的信息”。

请参阅：CDaoQueryDef


 CDaoQueryDefInfo结构

CDaoQueryDefInfo结构具有如下形式：
struct CDaoQueryDefInfo
{
CString m_strName; // Primary
short m_nType; // Primary
COleDateTime m_dateCreated; // Secondary
COleDateTime m_dateLastUpdated; // Secondary
BOOL m_bUpdatable; // Secondary
BOOL m_bReturnsRecords; // Secondary
CString m_strSQL; // All
CString m_strConnect; // All
short m_nODBCTimeout; // All
};
CDaoQueryDefInfo结构包含了为数据访问对象（DAO）定义的查询定义对象的信息。查询定义对象是CDaoQueryDef类的对象。上面对Primary，Secondary和All的引用指明了CDaoDatabase类的成员函数GetQueryDefInfo是如何返回信息的。

成员：
m_strName | 查询定义对象的唯一的名字。更多的信息参见DAO帮助中的“Name属性”主题。调用CDaoQueryDef::GetName以直接访问这个属性。
m_nType指明了查询定义对象的操作类型的值。其取值可能是下列值之一：
· | dbQSelect Select | 该查询选择记录。
· | dbQAction Action | 该查询移动或改变数据，但是不返回记录。
· | dbQCrosstab Crosstab | 该查询用与电子表格类似的格式返回数据。
· | dbQDelete Delete | 该查询删除指定的行。
· | dbQUpdate Update | 该查询更新一些记录。
· | dbQAppend Append | 该查询在表或查询的尾部加入新记录。
· | dbQMakeTable Make-table | 该查询根据记录集创建一个新表。
· | dbQDDL Data-definition | 该查询影响表格及其部分的结构。
· | dbQSQLPassThrough Pass-through | 直接把SQL语句传递给数据库，没有中间处理。
· | dbQSetOperation Union | 该查询创建一个快照型记录集对象，其中包含了一个或多个表中指定记录的数据，所有重复的记录都被删除。如果要包含重复记录，在查询定义的SQL语句中加入ALL关键字。
· | dbQSPTBulk | 与dbQSQLPassThrough一起使用，指定了一种不返回记录的查询。 注意： 在创建一个直接传递SQL的查询时，你不需要设置dbQSQLPassThrough常量。它是在创建查询定义对象并设置连接属性的时候由Microsoft Jet数据库引擎自动设置的。
更多的信息参见DAO帮助中的“Type属性”主题。
m_dateCreated | 创建查询定义的日期和时间。如果要直接获得创建查询定义的日期，调用与表相关的CDaoTableDef对象的成员函数GetDateCreated。更多的信息参见下面的注释。还可以参看DAO帮助中的“DateCreated，LastUpdated属性”主题。
m_dateLastUpdated | 最近一次对查询定义作出改变的日期和时间。如果要直接获得最近改变表的日期，调用查询定义的成员函数GetDateLastUpdated。更多的信息参见下面的注释。同时参看DAO帮助中的“DateCreated，LastUpdated属性”主题。
m_bUpdatable | 指明是否可以修改查询定义对象。如果这个属性为TRUE，查询定义可以被修改；否则不能。可以被修改意味着查询定义对象的查询定义可以被修改。如果查询定义可以被修改，则查询定义对象的Updatable属性被设为TRUE，即使结果记录集不能被修改。如果要直接获得这个属性的值，调用查询定义对象的CanUpdate成员函数。更多的信息参见DAO帮助中的“Updatable属性”主题。
m_bReturnsRecords | 指明一个直接将SQL传递给外部数据库的查询是否返回记录。如果这个属性为TRUE，该查询返回记录。如果要直接获得这个属性的值，调用CDaoQuery- Def::GetReturnsRecords。并不是所有直接将SQL传递给外部数据库的查询都返回记录。例如，SQL UPDATE语句更新记录，但不返回语句，而SQL SELECT语句却返回语句。更多的信息参见DAO帮助中的“ReturnsRecords属性”主题。
m_strSQL | 定义了查询定义对象所执行的查询的SQL语句。SQL属性中包含了SQL语句，决定了执行查询时记录如何被选择，分组或排序。你可以使用该查询把记录选择到一个dynaset类型或snapshot类型的记录集对象。你也可以定义一个批查询来修改数据而不返回记录。你可以调用查询定义的GetSQL成员函数来直接获得这个属性的值。更多的信息参见“Visual C++程序员指南”中的文章“DAO查询”以及DAO帮助中的“SQL属性”主题。
m_strConnect | 提供了用于直接传递查询的数据库源的信息。这个信息采用连接字符串的形式。有关连接字符串以及直接获得这个属性值的更多信息参见CDaoDatabase::GetConnect成员函数。
m_nODBCTimeout | 当在一个ODBC数据库上运行一个查询时，在产生一个超时错误之前，Microsoft Jet数据库引擎将等待的秒数。当你使用ODBC数据库的时候，例如Microsoft SQL Server，可能会因为网络阻塞或是ODBC服务器的重负而引起延迟。为了避免无限等待，你可以指定Microsoft Jet数据库引擎在产生错误前等待多长时间。缺省的超时值为60秒。你可以调用查询定义的GetODBCTimeout成员函数来直接获得这个属性的值。更多的信息参见DAO帮助中的“ODBCTimeout属性”主题。

注释：
CDaoDatabase::GetQueryDefInfo成员函数获得的信息被保存在CDaoQueryDefInfo结构中。调用数据库对象的GetQueryDefInfo函数，查询定义对象就保存在该对象的查询定义集合中。CDaoQueryDefInfo还为调试版本定义了一个Dump成员函数。你可以利用Dump来转储CDaoQueryDefInfo对象的内容。CDaoDatabase类也提供了用于直接访问CDaoQueryDefInfo对象所返回的所有属性的成员函数，因此你可能很少需要调用GetQueryDefInfo。
当你在查询定义对象的字段集合或参数集合中加入新的字段或参数时，如果基础数据库不支持新对象所指定的数据类型，就会抛出一个异常。
日期和时间设置是从创建查询定义或最后修改查询定义的计算机上获得的。在多用户环境中，用户应当直接使用net time命令从文件服务器上获得这些设置，以避免DateCreated和LastUpdated属性中的不一致。有关这个结构和其他MFCDAO Info结构的信息参见“Visual C++ 程序员指南”中的文章“DAO集合：获得DAO对象的信息”。

请参阅：CDaoQueryDef, CDaoDatabase


 CDaoRelationFieldInfo结构

CDaoRelationFieldInfo结构具有如下形式：
struct CDaoRelationFieldInfo
{
CString m_strName; // Primary
CString m_strForeignName; // Primary
};
CDaoRelationFieldInfo结构中包含了为数据访问对象（DAO）定义的关系中的字段的信息。DAO关系对象指定了定义关系的主表中的字段和外部表中的字段。在上面的结构定义中对Primary的引用指明了调用CDaoDatabase类的成员函数GetRelationInfo获得的信息是如何在CDaoRelationInfo对象的m_pFieldInfos成员中返回的。
MFC类不代表任何关系对象和关系字段对象。相反，DAO对象构成了CDaoDatabase类的MFC对象，其中包含了关系对象的集合，称为关系集合。每个关系对象包含了一个关系对象的集合。每个关系对象使主表中的字段和外部表中的字段产生联系。合在一起，关系字段对象定义了每个表中的一组字段，它们一起定义了关系。CDaoDatabase使你能够调用GetRelationInfo成员函数通过CDaoRelationInfo对象来访问关系对象。CDaoRelationInfo对象具有一个数据成员m_pFieldInfos，它指向一个CDaoRelationFieldInfo对象的数组。

成员：
m_strName | 关系的主表中字段的名字。
m_strForeignName | 关系的外部表中字段的名字。

注释：
调用包容的CDaoDatabase对象的GetRelationInfo成员函数，你感兴趣的关系对象就保存在该对象的关系集合中。然后访问CDaoRelationInfo对象的m_pFieldInfos成员。CDaoRelationFieldInfo还在调试版本中定义了一个Dump函数。你可以使用Dump来转储CDaoRelationFieldInfo对象的内容。
有关这个结构以及其他MFC DAO Info结构的信息参见“Visual C++ 程序员指南”中的文章“DAO集合：获得DAO对象的信息”。

请参阅：CDaoRelationInfo


 CDaoRelationInfo结构

CDaoRelationInfo结构具有如下形式：
struct CDaoRelationInfo
{
CDaoRelationInfo( ); // Constructor
CString m_strName; // Primary
CString m_strTable; // Primary
CString m_strForeignTable; // Primary
long m_lAttributes; // Secondary
CDaoRelationFieldInfo* m_pFieldInfos; // Secondary
short m_nFields; // Secondary
// Below the // Implementation comment:
// Destructor, not otherwise documented
};
CDaoRelationInfo结构中包含了在CDaoDatabase对象的两个表之间定义的关系的信息。上面对Primary和Secondary的引用指明了CDaoDatabase类的成员函数GetRelationInfo是如何返回信息的。
MFC类不代表关系对象。相反，DAO对象构成了CDaoDatabase类的MFC对象，它维护着一个关系对象的集合：CDaoDatabase提供了用于访问关系信息中一些单独项的成员函数，也可以调用包容数据库对象的GetRelationInfo成员函数，通过CDaoRelationInfo结构同时访问所有的信息。

成员：
m_strName | 关系对象的唯一名字。更多的信息参见DAO帮助中的“Name属性”主题。
m_strTable | 命名关系中的主表。
m_strForeignTable | 命名关系中的外部表。外部表是用于包含外部关键字的表。通常，可以利用外部表来建立或强化引用完整性。外部表通常位于一对多关系中多的一方。外部表的例子有包含以下内容的表：美国州代码或加拿大的省或顾客的订货。
m_lAttributes包含了有关关系类型的信息。这个成员的值可以是下列值中的任何一个：
· | dbRelationUnique | 一对一关系。
· | dbRelationDontEnforce | 关系是非强迫的的。（没有引用完整性）
· | dbRelationInherited | 关系存在于非当前数据库中，其中包含了两个相连的表。
· | dbRelationLeft | 关系是左连接的。左外部连接包含了两个表中第一个（左边）表的所有记录，即使在第二个表（右边）中没有与之匹配的值。
· | dbRelationRight | 关系是右连接的。右的外部连接包含了两个表中第二个（右边）表的所有记录，即使在第一个表（左边）中没有与之匹配的值。
· | dbRelationUpdateCascade | 更新操作是重叠的。
· | dbRelationDeleteCascade | 删除操作是重叠的。
m_pFieldInfos | 指向CDaoRelationFieldInfo结构数组的指针。对于关系中的每个字段，该数组中都包含一个对象。m_nFields数据成员给出了数组元素的个数。
m_nFields | m_pFieldInfos数据成员中CDaoRelationFieldInfo对象的个数。

注释：
通过CDaoDatabase::GetRelationInfo成员函数获取的信息被保存在CDaoRelationInfo结构中。CDaoRelationInfo还在调试版本中定义了一个Dump成员函数。你可以使用Dump来转储CDaoRelationInfo对象的内容。有关这个结构以及其他MFC DAO Info结构的信息参见“Visual C++ 程序员指南”中的文章“DAO集合：获取DAO对象的信息”。

请参阅：CDaoRelationFieldInfo


 CDaoTableDefInfo结构

CDaoTableDefInfo结构具有如下形式：
struct CDaoTableDefInfo
{
CString m_strName; // Primary
BOOL m_bUpdatable; // Primary
long m_lAttributes; // Primary
COleDateTime m_dateCreated; // Secondary
COleDateTime m_dateLastUpdated; // Secondary
CString m_strSrcTableName; // Secondary
CString m_strConnect; // Secondary
CString m_strValidationRule; // All
CString m_strValidationText; // All
long m_lRecordCount; // All
};
CDaoTableDefInfo结构中包含了为数据访问对象（DAO）定义的表定义对象的信息。表定义是CDaoTableDef类的对象。上面对Primary，Secondary和All的引用指明了在CDaoDatabase类的成员函数GetTableDefInfo中信息是如何返回的。

成员：
m_strName | 表定义对象的唯一的名字。如果要直接获得这个属性的值，调用表定义对象的GetName成员函数。更多的信息参见DAO帮助中的“Name属性”主题。
m_bUpdatable | 指明是否可以修改表。确定一个表可以修改的最快的方式是否为这个表打开一个CDaoTableDef对象，然后调用这个对象的CanUpdate成员函数。对于一个新创建的表定义对象，CanUpdate总是返回非零值（TRUE），对于连接的表定义对象则返回0（FALSE）。一个新创建的表定义对象仅能被附加到一个用户具有写权限的数据库。如果该表仅包含不可更新的字段，CanUpdate返回0。当有一个或多个字段可以被更新时，CanUpdate返回非零值。你只能编辑可更新的字段。更多的信息参见DAO帮助中的“Updatable属性”主题。
m_lAttributes指定了表定义对象所代表的表的特征。如果要获得表定义的当前属性，调用它的成员函数GetAttributes。返回值可能是下面这些值的组合（使用位或操作符|）：
· | dbAttachExclusive | 对于使用Microsoft Jet数据库引擎的数据库，指明这个表是一个独占使用的表。
· | dbAttachSavePWD | 对于使用Microsoft Jet数据库引擎的数据库，指明连接的表的用户ID和密码被保存在连接信息中。
· | dbSystemObject | 指明这个表是由Microsoft Jet数据库引擎提供的系统表（只读）。
· | dbHiddenObject | 指明这个表是由Microsoft Jet数据库引擎提供的隐含表（只读）。
· | dbAttachedTable | 指明这个表是非ODBC数据库，例如Paradox数据库的一个连接表。
· | dbAttachedODBC | 指明这个表是ODBC数据库，例如Microsoft SQLServer数据库的一个连接表。
m_dateCreated | 创建表的日期和时间。如果要直接获得创建表的日期，调用与该表相关的CDaoTableDef对象的GetDateCreated成员函数。更多的信息参见下面的注释。相关信息参见DAO帮助中的“DateCreated，LastUpdated属性”主题。
m_dateLastUpdated | 最近对表的设计作出改变的日期和时间。如果要直接获取该表最近被修改的日期，调用与该表相关的CDaoTableDef对象的GetDateLastUpdated成员函数。更多的信息参见下面的注释。相关的信息参见DAO帮助中的“DateCreated，LastUpdated属性”主题。
m_strSrcTableName | 指定了连接表的名字，如果有的话。如果要直接获得源表的名字，调用与表相关的CDaoTableDef对象的GetSourceTableName成员函数。
m_strConnect | 提供了与打开的数据库源有关的信息。你可以调用CDaoTableDef对象的成员函数GetConnect来检查这个属性。有关连接字符串的更多信息参见GetConnect。
m_strValidationRule | 当表定义字段中的数据被改变或加入一个表中时，这个值被用来校验数据。校验仅支持使用Microsoft Jet数据库引擎的数据库。如果要直接获得校验规则，调用与该表相关的CDaoTableDef对象的GetValidationRule成员函数。相关的信息参见DAO帮助中的“Validation属性”主题。
m_strValidationText | 指定了当ValidationRule属性所指定的校验规则不被满足时，应用程序要显示的消息文本。相关的消息参见DAO帮助中的“ValidationText属性”主题。
m_lRecordCount在表定义对象中访问的记录数目。这个属性是只读的。如果要直接获取记录的计数，调用CDaoTableDef对象的GetRecordCount成员函数。
GetRecordCount的文档进一步描述了记录计数。注意如果表中有很多记录，要获得这个计数可能耗去很多时间。

注释：
CDaoDatabase::GetTableDefInfo成员函数获得的信息被保存在CDaoTableDefInfo结构中。调用CDaoDatabase结构的GetTableDefInfo成员函数，表定义对象就保存在的TableDefs集合中。CDaoTableDefInfo还在调试版本中定义了一个Dump成员函数。你可以使用Dump来转储CDaoTableDefInfo对象的内容。
日期和时间设置是从基表被创建或修改的计算机上获得的。在多用户环境中，用户应该直接从文件服务器获得这些设置以避免DateCreated和LastUpdated属性产生不一致。
有关这个结构和其他MFC DAO Info结构的信息参见“Visual C++ 程序员指南”中的文章“DAO集合：获得DAO对象的信息”。

请参阅：
CDaoTableDef, CDaoDatabase, CDaoTableDef::CanUpdate, CDaoTableDef::GetAttributes, CDaoTableDef::GetDateCreated, CDaoTableDef::GetDateLastUpdated, CDaoTableDef::GetRecordCount, CDaoTableDef::GetSourceTableName, CDaoTableDef::GetValidationRule, CDaoTableDef::GetValidationText


 CDaoWorkspaceInfo结构

CDaoWorkspaceInfo结构具有如下形式：
struct CDaoWorkspaceInfo
{
CString m_strName; // Primary
CString m_strUserName; // Secondary
BOOL m_bIsolateODBCTrans; // All
};
CDaoWorkspaceInfo结构中包含了为使用数据访问对象（DAO）的数据库访问而定义的工作空间的信息。工作空间是CDaoWorkspace类的对象。上面对Primary，Secondary和All的引用指明了CDaoWorkspace类的GetWorkspaceInfo成员函数是如何返回信息的。

成员：
m_strName | 工作空间的唯一名字。如果要直接获得这个属性值，调用查询定义对象的GetName成员函数。更多的信息参见DAO帮助中的“Name属性”主题。
m_strUserName | 代表了工作空间对象的拥有者的值。相关的信息参见DAO帮助中的“UserName属性”主题。
m_bIsolateODBCTrans | 指明了涉及同一个ODBC数据库的多用户事务是否被隔离。更多的信息参见CDaoWorkspace::SetIsolateODBCTrans。相关的信息参见DAO帮助中的“IsolateODBCTrans属性”主题。

注释：
CDaoWorkspace::GetWorkspaceInfo成员函数获取的信息被保存在CDaoWorkspaceInfo结构中。CDaoWorkspaceInfo还在调试版本中定义了一个Dump成员函数。你可以使用Dump来转储CDaoWorkspaceInfo对象的内容。有关这个对象和其他MFC DAO Info结构的信息参见“Visual C++ 程序员指南”中的文章“DAO集合：获得DAO对象的信息”。

请参阅：CDaoWorkspace


 CODBCFieldInfo结构

CODBCFieldInfo结构具有如下形式：
struct CODBCFieldInfo
{
CString m_strName;
SWORD m_nSQLType;
UDWORD m_nPrecision;
SWORD m_nScale;
SWORD m_nNullability;
};
CODBCFieldInfo结构中包含了ODBC数据源中字段的有关信息。如果要获得这个信息，调用CRecordset::GetODBCFieldInfo。

成员：
m_strName | 字段的名字。
m_nSQLType | 字段的SQL数据类型。它可以是ODBC SQL数据类型或驱动程序特定的SQL数据类型。有效的ODBC SQL数据类型的列表参见“ODBC SDK程序员参考”的附录D中的“SQL 数据类型”。有关驱动程序特定的SQL数据类型的信息参看驱动程序的文档。
m_nPrecision | 字段的最大精度。有关的细节参见“ODBC SDK 程序员参考”的附录D中的“精度，范围，长度和显示大小”。
m_nScale | 字段的范围。有关的细节参见ODBC SDK 程序员参考的附录D中的“精度，范围，长度和显示大小”。
m_nNullability | 一个字段是否允许Null值。它可以是两个值之一：如果该字段允许Null值，则为SQL_NULLABLE；如果该字段不允许Null值，则为SQL_NO_NULLS。

请参阅：
CRecordset::GetODBCFieldInfo, CRecordset::GetFieldValue


 COLORADJUSTMENT结构

COLORADJUSTMENT结构具有如下形式：
typedef struct tagCOLORADJUSTMENT
{ /* ca */
WORD caSize;
WORD caFlags;
WORD caIlluminantIndex;
WORD caRedGamma;
WORD caGreenGamma;
WORD caBlueGamma;
WORD caReferenceBlack;
WORD caReferenceWhite;
SHORT caContrast;
SHORT caBrightness;
SHORT caColorfulness;
SHORT caRedGreenTint;
} COLORADJUSTMENT;
COLORADJUSTMENT结构定义了当StretchBlt模式为HALFTONE时，Windows的StretchBlt和StretchDIBits函数使用的颜色调整值。

成员：
caSize | 指定了该结构以字节为单位的大小。
caFlags指定了如何准备输出图象。这个成员可以被设为NULL或是下列值的组合：
· | CA_NEGATIVE | 指定了要显示原图的反相图。
· | CA_LOG_FILTER | 指定了一个对数函数，将对输出颜色的最后深度起作用。当亮度较低时，这将增加颜色的对比度。
caIlluminantIndex指定了光源的亮度，图象将在该光源下显示。这个成员可以被设为下列值中的一个：
· | ILLUMINANT_EQUAL_ENERGY
· | ILLUMINANT_A
· | ILLUMINANT_B
· | ILLUMINANT_C
· | ILLUMINANT_D50
· | ILLUMINANT_D55
· | ILLUMINANT_D65
· | ILLUMINANT_D75
· | ILLUMINANT_F2
· | ILLUMINANT_TURNGSTEN
· | ILLUMINANT_DAYLIGHT
· | ILLUMINANT_FLUORESCENT
· | ILLUMINANT_NTSC
caRedGamma | 指定了原色中红原色的n次gamma修正值。这个值必须介于2500～65000之间。如果值等于10000，则意味着没有gamma修正。
caGreenGamma | 指定了原色中绿原色的n次gamma修正值。这个值必须介于2500～65000之间。如果值等于10000，则意味着没有gamma修正。
caBlueGamma | 指定了原色中蓝原色的n次gamma修正值。这个值必须介于2500～65000之间。如果值等于10000，则意味着没有gamma修正。
caReferenceBlack | 指定了源色的黑色参考值。任何比这个值暗的颜色被当作黑色。这个值必须介于0～4000之间。
caReferenceWhite | 指定了源色的白色参考值。任何比这个值亮的颜色被当作白色。这个值必须介于6000～10000之间。
caContrast | 指定了对源对象应用的对比度值。这个值必须介于－100～100之间。如果该值为0则意味着没有对比度调整。
caBrightness | 指定了对源对象应用的亮度值。这个值必须介于－100～100之间。如果该值为0，则意味着没有亮度调整。
caColorfulness | 指定了对源对象应用的饱和度值。这个值必须介于－100～100之间。如果该值为0，则意味着没有饱和度调整。
caRedGreenTint | 指定了应用于源对象的红或绿校正值。这个值必须介于－100～100之间。正数将会向红色调整，而负数将会向绿色调整。如果这个值为0，则意味着没有调整。

请参阅：CDC::GetColorAdjustment


 COMPAREITEMSTRUCT结构

COMPAREITEMSTRUCT数据结构具有这种形式：
typedef struct tagCOMPAREITEMSTRUCT
{
UINT CtlType;
UINT CtlID;
HWND hwndItem;
UINT itemID1;
DWORD itemData1;
UINT itemID2;
DWORD itemData2;
} COMPAREITEMSTRUCT;

COMPAREITEMSTRUCT结构为有序的自画列表框或组合框中的两项提供了标识符和来自应用程序的数据。当应用程序在用CBS_SORT或LBS_SORT风格创建的自画列表框或组合框中加入一个新项时，Windows将给拥有者发送一个WM_COMPAREITEM消息。这个消息的lParam参数中包含了指向COMPAREITEMSTRUCT结构的长指针。通过接收这个消息，拥有者比较这个两个项并返回一个值，指明哪一项在前。

成员：
CtlType | ODT_LISTBOX （这指定了一个自画列表框）或ODT_COMBOBOX （这指定了一个自画组合框）。
CtlID | 列表框或组合框的控制ID。
hwndItem | 控件的窗口句柄。
itemID1 | 将要比较的列表框或组合框中第一项的索引。
itemData1 | 应用程序为要比较的第一项提供的数据。这个值在把这个项加入组合框或列表框时给定。
itemID2 | 将要比较的列表框或组合框中第二项的索引。
itemData2 | 应用程序为要比较的第二项提供的数据。这个值在把这个项加入组合框或列表框时给定。

请参阅：CWnd::OnCompareItem


 CREATESTRUCT结构

CREATESTRUCT结构具有如下形式：
typedef struct tagCREATESTRUCT
{
LPVOID lpCreateParams;
HANDLE hInstance;
HMENU hMenu;
HWND hwndParent;
int cy;
int cx;
int y;
int x;
LONG style;
LPCSTR lpszName;
LPCSTR lpszClass;
DWORD dwExStyle;
} CREATESTRUCT;

CREATESTRUCT结构定义了传递给应用程序的窗口过程的初始化参数。

成员：
lpCreateParams | 指向将被用于创建窗口的数据的指针。
hInstance | 标识了拥有新窗口的模块的模块实例的句柄。
hMenu | 标识了要被用于新窗口的菜单。如果是子窗口，则包含整数ID。
hwndParent | 标识了拥有新窗口的窗口。如果新窗口是一个顶层窗口，这个参数可以为NULL。
cy | 指定了新窗口的高。
cx | 指定了新窗口的宽。
y | 指定了新窗口的左上角的y轴坐标。如果新窗口是一个子窗口，则坐标是相对于父窗口的；否则坐标是相对于屏幕原点的。
x | 指定了新窗口的左上角的x轴坐标。如果新窗口是一个子窗口，则坐标是相对于父窗口的；否则坐标是相对于屏幕原点的。
style | 指定了新窗口的风格。
lpszName | 指向一个以null结尾的字符串，指定了新窗口的名字。
lpszClass | 指向一个以null结尾的字符串，指定了新窗口的Windows类名（一个WNDCLASS结构；更多的信息参见Win32 SDK文档）。
dwExStyle | 指定了新窗口的扩展风格。

请参阅：CWnd::OnCreate


 DELETEITEMSTRUCT结构

DELETEITEMSTRUCT结构具有如下形式：
typedef struct tagDELETEITEMSTRUCT
{ /* ditms */
UINT CtlType;
UINT CtlID;
UINT itemID;
HWND hwndItem;
UINT itemData;
} DELETEITEMSTRUCT;
DELETEITEMSTRUCT结构指定一个被删除的自画列表框或组合框项。当从列表框或组合框中删除一项或当列表框或组合框被销毁时，对于被删除的每一项，Windows向它的拥有者发送WM_DELETEITEM消息。消息的lParam参数包含指向这个结构的指针。

成员：
CtlType | 是ODT_LISTBOX（对于自画列表框）或ODT_COMBOBOX（对于自画组合框）。
CtlID | 指定列表框或组合框的标识符。
itemID | 指定将被删除的项在列表框或组合框中的索引。
hwndItem | 控件的标识符。
itemData | 指定程序定义的与该项相关的数据。此值通过消息的lParam参数传递给控件，而这一消息向列表框或组合框中增加项。

请参阅：CWnd::OnDeleteItem


 DEVMODE结构

DEVMODE结构具有如下形式：
typedef struct _devicemode
{ /* dvmd */
TCHAR dmDeviceName[32];
WORD dmSpecVersion;
WORD dmDriverVersion;
WORD dmSize;
WORD dmDriverExtra;
DWORD dmFields;
short dmOrientation;
short dmPaperSize;
short dmPaperLength;
short dmPaperWidth;
short dmScale;
short dmCopies;
short dmDefaultSource;
short dmPrintQuality;
short dmColor;
short dmDuplex;
short dmYResolution;
short dmTTOption;
short dmCollate;
TCHAR dmFormName[32];
WORD dmUnusedPadding;
USHORT dmBitsPerPel;
DWORD dmPelsWidth;
DWORD dmPelsHeight;
DWORD dmDisplayFlags;
DWORD dmDisplayFrequency;
} DEVMODE;

DEVMODE数据结构中包含了有关设备初始化和打印机环境的信息。

成员：
dmDeviceName | 指定了驱动程序支持的设备名称；例如，对于PCL/HP LaserJet系列，会是CL/HP激光打印机。这个字符串在设备驱动程序之间是相互不同的。
dmSpecVersion | 指定了初始化数据的版本数字，这个结构就基于这些数据。
dmDriverVersion | 指定了打印机驱动程序开发商分配的打印机驱动程序版本号。
dmSize | 指定了DEVMODE结构的大小，以字节为单位，不包括dmDriverData（与设备有关）成员。如果应用程序仅操作数据中与驱动程序无关的部分，它就可以使用这个成员以确定该结构的长度，而并不需要有不同版本的记录。
dmDriverExtra | 包含了这个结构后面的私有驱动程序数据的数目，以字节为单位。如果设备驱动程序不使用该设备独有的信息，就把这个成员设为零。
dmFields | 指定了DEVMODE结构的其余成员中哪些已被初始化。第0位（定义为DM）ORIENTATION）代表dmOrientation，第1位（定义为DM_PAPERSIZE）代表dmPaperSize等等。打印机驱动出现仅支持那些适合打印技术的成员。
dmOrientation | 选择纸的方向。这个成员可以为DMORIENT_PORTRAIT（1）或DMORIENT_ LANDSCAPE（2）。
dmPaperSize选择将用于打印的纸张大小。如果纸张的长度和宽度都用dmPaperLength和dmPaperWidth成员来设置的话，这个成员可以被设为0。否则，dwPaperSize成员可以被设为以下值之一：
DMPAPER_LETTER | letter， 8 1/2×1 英寸
MPAPER_LEGAL | Legal， 8 1/2×14 英寸
DMPAPER_A4 | A4 letter， 210×297 毫米
DMPAPER_CSHEET | C letter， 17×22 英寸
DMPAPER_DSHEET | D letter， 22×34 英寸
DMPAPER_ESHEET | E letter， 34×44 英寸
DMPAPER_LETTERSMALL | letter small， 8 1/2×11 英寸
DMPAPER_TABLOID | Tabloid， 11×17 英寸
DMPAPER_LEDGER | Ledger， 17×11 英寸
DMPAPER_STATEMENT | Statement， 5 1/2×8 1/2 英寸
DMPAPER_EXECUTIVE | Executive， 7 1/4×10 1/2 英寸
DMPAPER_A3 | A3 Sheet， 297×420 毫米
DMPAPER_A4SMALL | A4 Small Sheet， 210×297 毫米
DMPAPER_A5 | A5 Sheet， 148×210 毫米
DMPAPER_B4 | B4 Sheet， 250×354 毫米
DMPAPER_B5 | B5 Sheet， 182×257 毫米
DMPAPER_FOLIO | Folio, 8 1/2×13 英寸
DMPAPER_QUARTO | Quarto, 215×275 毫米
DMPAPER_10X14 | 10×14 英寸
DMPAPER_11X17 | 11×17 英寸
DMPAPER_NOTE | Note, 8 1/2×11 英寸
DMPAPER_ENV_9 | #9 EnVelope， 3 7/8×8 7/8 英寸
DMPAPER_ENV_10 | #10 EnVelope， 4 1/8×9 1/2 英寸
DMPAPER_ENV_11 | #11 EnVelope， 4 1/2×10 3/8 英寸
DMPAPER_ENV_12 | #12 EnVelope， 4 3/4×11 英寸
DMPAPER_ENV_14 | #14 EnVelope， 5×11 1/2 英寸
DMPAPER_ENV_DL | DL EnVelope， 110×220 毫米
DMPAPER_ENV_C5 | C5 EnVelope， 162×229 毫米
DMPAPER_ENV_C3 | C3 EnVelope， 324×458 毫米
DMPAPER_ENV_C4 | C4 EnVelope， 229×324 毫米
DMPAPER_ENV_C6 | C6 EnVelope， 114×162 毫米
DMPAPER_ENV_C65 | C65 EnVelope， 114×229 毫米
DMPAPER_ENV_B4 | B4 EnVelope， 250×353 毫米
DMPAPER_ENV_B5 | B5 EnVelope， 176×250 毫米
DMPAPER_ENV_B6 | B6 EnVelope， 176×125 毫米
DMPAPER_ENV_ITALY | Italy EnVelope， 110×230 毫米
DMPAPER_ENV_MONARCH | Monarch EnVelope， 3 7/8×7 1/2 英寸
DMPAPER_ENV_PERSONAL | 6 3/4 EnVelope， 3 5/8×6 1/2 英寸
DMPAPER_FANFOLD_US | US Std Fanfold, 14 7/8×11 英寸
DMPAPER_FANFOLD_STD_GERMAN | German Std Fanfold, 8 1/2×12 英寸
DMPAPER_FANFOLD_LGL_GERMAN | German Legal Fanfold, 8 1/2×13 英寸

dmPaperLength | 重定义由dmPaperSize成员指定的纸张长度，可用于自定义纸张大小，也可以用于点阵打印机，这种打印机能打出任意长度的纸张。这些值与这个结构中其他指定物理长度的值都是以0.1毫米为单位的。
dmPaperWidth | 重载由dmPaperSize成员指定的纸张宽度。
dmScale | 指定了打印输出的缩放因子。实际的页面大小为物理纸张的大小乘以dmScale/100。例如，对于信纸大小的纸张，如果dmScale的值为50，它将可以容纳相当于17×22英寸页面的内容，因为输出的文本和图形的宽、高都将是原始大小的一半。
dmCopies | 如果设备支持多页拷贝，则选择了要打印的拷贝数目。
dmDefaultSource | 保留，必须为0。
dmPrintQuality指定了打印机的分辨率。有四种预定义的与设备无关的值：
DMRES_HIGH
DMRES_MEDIUM
DMRES_LOW
DMRES_DRAFT
如果给定了一个正值，它就指定了每英寸打印的点数（DPI），因此是与设备有关的。
dmColor对于彩色打印机，在彩色和单色之间切换。下面是可能的取值：
·DMCOLOR_COLOR
·DMCOLOR_MONOCHROME
dmDuplex为支持双面打印的打印机选择双面打印方式。可能的取值如下：
·DMDUP_SIMPLEX
·DMDUP_HORIZONTAL
·DMDUP_VERTICAL
dmYResolution | 指定了打印机在y方向的分辨率，以每英寸的点数为单位。如果打印机对该成员进行了初始化，dmPrintQuality成员指定了打印机在x方向的分辨率，以每英寸点数为单位。
dmTTOption指明如何打印TrueType字体。这个成员可以取如下值之一：
· | DMTT_BITMAP | 把TrueType字体作为图形打印。这是点阵打印机的缺省动作。
· | DMTT_DOWNLOAD | 将TrueType字体作为软字体下载。这是使用打印机控制语言（PCL）的惠普打印机的缺省动作。
· | DMTT_SUBDEV | 用TrueType字体替换设备字体。这是PostScript系列打印机的缺省动作。

dmCollate指定在打印多份拷贝的时候是否使用校对。使用DMCOLLATE_FALSE后能够得到更快更有效的输出，因为不管要打印多少份拷贝，只向打印机传送一次数据。打印机仅被通知再打印一页。这个成员可以是下列值之一：
· | DMCOLLATE_TRUE | 当打印多份拷贝时进行校对。
· | DMCOLLATE_FALSE | 当打印多份拷贝时不进行校对。

dmFormName | 指定了要使用的格式名字。例如，Letter或Legal。这些名字的完整集合可以通过Windows的EnumForms函数获得。
dmUnusedPadding | 用于将结构对齐到DWORD边界。不能使用或引用这个成员。它的名字和用法是保留的，在以后的版本中可能会变化。
dmBitsPerPel | 指定了显示设备的颜色分辨率，以像素的位数为单位。例如，16色使用4位，256色使用8位，而65536色使用16位。
dmPelsWidth | 指定了可见设备表面的以像素为单位的宽度。dmPelsHeight指定了可见设备表面的以像素为单位的高度。
dmDisplayFlags指定了设备的显示模式。下面是有效的标志：
· | DM_GRAYSCALE | 指定显示使用了无颜色设备。如果没有设置这个标志，就假定彩色模式。
· | DM_INTERLACED | 指定了隔行显示模式。如果没有设置这个标志，就假定非隔行模式。

dmDisplayFrequency | 指定了显示设备的特定模式所使用的以赫兹为单位的频率（每秒的周期数）。

注释：
在dmDisplayMode成员后面将是一些设备驱动程序的私有数据。以字节为单位的私有数据数目是由dmDriverExtra成员指定的。

请参阅：CDC::ResetDC, CPrintDialog::GetDevMode


 DEVNAMES结构

DEVNAMES结构具有如下形式：
typedef struct tagDEVNAMES
{ /* dvnm */
WORD wDriverOffset;
WORD wDeviceOffset;
WORD wOutputOffset;
WORD wDefault;
/* wDefault后面是驱动程序，设备和端口名字符串*/
} DEVNAMES;

DEVNAMES结构中包含的字符串指定了打印机的驱动程序，设备和输出端口的名字。PrintDlg函数使用这些字符串来初始化系统定义的Print对话框中的成员。当用户关闭对话框时，将在这个结构中返回有关选中的打印机的信息。

成员：
wDriverOffset | （输入/输出）指定了一个以null结尾的字符串的偏移，其中包含了设备驱动程序的文件名（没有扩展名）。对于输入，这个字符串将被用于确定要显示在对话框中的打印机。
wDeviceOffset | （输入/输出）指定了以null结尾的字符串（包括null在内，最多有32个字节），其中包含了设备的名字。这个字符串必须与DEVMODE结构中的dmDeviceName成员相同。
wOutputOffset | （输入/输出）指定了以null结尾的字符串，其中包含了物理输出设备（输出端口）的DOS设备名。这个字符串必须与DEVMODE结构中的dmDeviceName成员相同。
wDefault | 指定DEVNAMES结构中包含的字符串是否表示了缺省打印机。这个字符串被用来检验自最近一次打印操作以来，缺省打印机是否发生变化。对于输入操作，如果设置了DN_DEFAULTPRN标志，DEVNAMES结构中的其它值将被检验，与当前的缺省打印机作比较。如果有字符串不匹配，就会显示一个警告信息，通知用户可能需要重新格式化文档。对于输出操作，只有当显示了Print Setup对话框并且用户选择了OK按钮时，wDefault成员才会发生改变。如果选择了缺省的打印机，就会设置DN_DEFAULTPRN标志。如果选择了一个其它打印机，则不会设置这个标志。这个成员中其它所有的位都是保留的，被Print对话框过程内部使用。

请参阅：CPrintDialog::CreatePrinterDC


 DRAWITEMSTRUCT

DRAWITEMSTRUCT结构具有如下形式：
typedef struct tagDRAWITEMSTRUCT
{
UINT CtlType;
UINT CtlID;
UINT itemlD;
UINT itemAction;
UINT itemState;
HWND hwndltem;
HDC hDC;
RECT rcItem;
DWORD itemData;
} DRAWITEMSTRUCT;

注释：
DRAWITEMSTRUCT结构提供了控制属主决定如何绘制其控制所需要的信息。
该控制的属主通过WM_DRAWITEM消息的lParam参数来获取指向此结构的指针。

成员：
CtlType控件类型。控件类型的取值如下：
· | ODT_BUTTON | 自画按钮
· | ODT_COMBOBOX | 自画组合框
· | ODT_LISTBOX | 自画列表框
· | ODT_MENU | 自画菜单
· | ODT_LISTVIEW | 列表视控件
· | ODT_STATIC | 自画Static控件
· | ODT_TAB | Tab 控件
CtlID | 组合框，列表框或按钮的控制ID。对菜单不使用这个成员。
itemID | 菜单的菜单项ID或是组合框或列表框中的项的索引。对于空的列表框或组合框，这个成员是一个负值，这允许应用程序只在rcItem成员指定的位置画出焦点矩形，既使控件中没有项。这样用户就可以知道列表框或组合框是否具有输入焦点。itemAction成员中位的设置决定了该矩形是否应当画得就象列表框或组合框拥有输入焦点那样。
itemAction定义了要求的绘图动作。它可以是下面位中的一个或多个：
· | ODA_DRAWENTIRE | 当需要画出整个控件时设置该位。
· | ODA_FOCUS | 当控件获得或失去输入焦点时设置该位。如果要确定控件是否拥有输入焦点，应该检查itemState成员。
· | ODA_SELECT | 当选择项发生变化时设置该位。如果要确定新的选择状态，应该检查itemState成员。
itemState指定了完成当前绘图动作后项的可视状态。如果要使菜单项无效，则会设置ODS_GRAYED标志。状态标志如下：
· | ODS_CHECKED | 如果要标记菜单项则设置该位。仅对菜单使用。
· | ODS_DISABLED | 如果要把该项画成禁止状态则设置该位。
· | ODS_FOCUS | 如果该项拥有输入焦点则设置该位。
· | ODS_GRAYED | 如果要使该项变灰则设置该位。仅对菜单使用。
· | ODS_SELECTED | 如果该项被选中则设置该位。
· | ODS_COMBOBOXEDIT | 绘图发生在自画组合框控件的选择区域（编辑控件）。
· | ODS_DEFAULT | 该项为缺省项。
hwndItem | 指定了组合框，列表框和按钮控件的窗口句柄。指定了包含菜单项的菜单的句柄（HMENU）。
hDC | 标识了一个设备环境。在控件上进行绘图操作时必须使用这个设备环境。
rcItem | hDC成员指定的设备环境中的矩形，定义了将要画出的控件的边界。Windows自动将画出的任何东西裁剪在组合框，列表框和按钮的设备环境之内，但是它不裁剪菜单项。在画出菜单项的时候，拥有者不能在rcItem成员所定义的矩形之外绘图。
itemData对于组合框或列表框，这个成员包含了下面的函数传递给列表框的值：
· | CComboBox::AddString
· | CComboBox::InsertString
· | CListBox::AddString
· | CListBox::InsertString
对于菜单，这个成员包含了下面的函数传递给菜单的值：
· | CMenu::AppendMenu
· | CMenu::InsertMenu
· | CMenu::ModifyMenu


 EXTENSION_CONTROL_BLOCK结构

EXTENSION_CONTROL_BLOCK结构具有如下形式：
typedef struct _EXTENSION_CONTROL_BLOCK
{
DWORD cbSize; //IN
DWORD dwVersion; //IN
HCONN ConnID; //IN
DWORD dwHttpStatusCode; //OUT
CHAR lpszLogData[HSE_LOG_BUFFER_LEN]; //OUT
LPSTR lpszMethod; //IN
LPSTR lpszQueryString; //IN
LPSTR lpszPathInfo; //IN
LPSTR lpszPathTranslated; //IN
DWORD cbTotalBytes; //IN
DWORD cbAvailable; //IN
LPBYTE lpbData; //IN
LPSTR lpszContentType; //IN
BOOL ( WINAPI* GetServerVariable )
( HCONN hConn,
LPSTR lpszVariableName,
LPVOID lpvBuffer,
LPDWORD lpdwSize );
BOOL ( WINAPI* WriteClient )
( HCONN ConnID,
LPVOID Buffer,
LPDWORD lpdwBytes,
DWORD dwReserved );
BOOL ( WINAPI* ReadClient )
( HCONN ConnID,
LPVOID lpvBuffer,
LPDWORD lpdwSize );
BOOL ( WINAPI* ServerSupportFunction )
( HCONN hConn,
DWORD dwHSERRequest,
LPVOID lpvBuffer,
LPDWORD lpdwSize,
LPDWORD lpdwDataType );
} EXTENSION_CONTROL_BLOCK, *LPEXTENSION_CONTROL_BLOCK;
服务器通过EXTENSION_CONTROL_BLOCK.与ISA通讯。
上面对IN和OUT的引用指明该成员是适用于发送到扩展的消息（IN）还是来自扩展的消息（OUT）。

成员：
EXTENSION_CONTROL_BLOCK结构包括如下的域：
cbSize | 结构的大小。
dwVersion | HTTP_FILTER_REVISION的版本信息。HIWORD中包含了主版本号，LOWORD中包含了次版本号。
ConnID | 由HTTP服务器分配的唯一数字。它不能被修改。
dwHttpStatusCode当完成请求时当前事务的状态。可能是下列值之一：
· | HTTP_STATUS_BAD_REQUEST
· | HTTP_STATUS_AUTH_REQUIRED
· | HTTP_STATUS_FORBIDDEN
· | HTTP_STATUS_NOT_FOUND
· | HTTP_STATUS_SERVER_ERROR
· | HTTP_STATUS_NOT_IMPLEMENTED
lpszLogData | 大小为HSE_LOG_BUFFER_LEN的缓冲区。包含了当前事务的与ISA相关的以null结尾的登记信息字符串，这个登记信息将被输入到HTTP服务器日志。出于管理的目的，为HTTP服务器和ISA事务维护一个日志文件会非常有用。
lpszMethod | 生成请求的方法。与CGI变量REQUEST_METHOD等价。
lpszQueryString | 包含查询信息的以null结尾的字符串。与CGI变量QUERY_STRING等价。
lpszPathInfo | 以null结尾的字符串，包含了客户给出的附加路径信息。与CGI变量PATH_INFO等价。
lpszPathTranslated | 以null结尾的字符串，包含了转换路径。与CGI变量PATH_TRANSLATED等价。
cbTotalBytes | 要从客户端接收的字节总数。与CGI变量CONTENT_LENGTH等价。如果这个值为0xffffffff，则有4G或更多的数据。在这种情况下，必须调用CHttpServerContext::ReadClient直到没有更多的数据。
cbAvailablelpbData | 所指向的缓冲区的可能容量。如果cbTotalBytes与cbAvailable相同，变量lpbData指向的缓冲区将包含了客户发出的所有数据。否则cbTotalBytes将包含接收到的数据的总字节数。ISA将需要适用回调函数CHttpServerContext::ReadClient来读出数据的剩余部分（从偏移为cbAvailable的位置开始）。
lpbData | 指向一个大小为cbAvailable的缓冲区，其中包含了客户发出的数据。
lpszContentType | 以null结尾的字符串，包含了客户发出数据的内容的类型。与CGI变量CONTENT_TYPE等价。
GetServerVariable这个函数将与HTTP连接或服务器本身有关的信息（包括CGI变量）拷贝到一个缓冲区中。GetServerVariable接收如下的参数：
· | hConn | 连接的句柄。
· | lpszVariableName | 以null结尾的字符串，指明被要求的是哪个变量。变量的名字为：
变量名 | 描述
ALL_HTTP | 所有还没有被解析为一个上面的变量之一的HTTP头。这些变量的形式为：HTTP_<起始域名>
AUTH_PASS | 当客户提供密码时，这将获得与REMOTE_USER对应的密码。它是一个以null结尾的字符串
AUTH_TYPE | 包含了使用的鉴定的类型。例如，如果使用了Basic鉴定，该字符串为“Basic”。对于WindowsNT Challenge-response，这个字符串为“NTLM”。其它鉴定模式将具有别的字符串。因为可以在Internet服务器中加入新的鉴定类型，所以要列出所以可能的字符串是不现实的。如果该字符串为空，则没有使用鉴定
CONTENT_LENGTH | 脚本能够期望从客户接收的字节数
CONTENT_TYPE | 在POST请求的主体部分提供的有关内容类型的信息
GATEWAY_INTERFACE | 服务器支持的CGI规格的修订版。当前的版本为CGI/1.1
HTTP_ACCEPT | 特殊情形的HTTP头。Accept的值：连结的域，通过“，”隔开。例如，如果下面的几行代码是HTTP头的一部分： accept:*/*;q=0.1 accept:text/html accept:image/jpeg 那么HTTP_ACCEPT变量将具有以下值： */*;q=0.1,text/html,image/jpeg
PATH_INFO | 附加的路径信息，与客户给定的相同。这个构成了URL中在脚本名之后，而在查询字符串（如果有）之前的部分
PATH_TRANSLATED | 这是PATH_INFO的值，但是还把一些虚拟路径名扩展到了目录信息中。
QUERY_STRING | 在引用该脚本的URL中？后面的信息
REMOTE_ADDR | 客户的IP地址
REMOTE_HOST | 客户的主机名字
REMOTE_USER | 这里包括了客户提供，经服务器鉴定的用户名
REQUEST_METHOD | HTTP的请求方法
SCRIPT_NAME | 要指向的脚本程序的名字
SERVER_NAME | 服务器的主机名（或IP地址），与在引用自己的URL中出现的一样
SERVER_PORT | 接收到请求的TCP/IP端口
SERVER_PROTOCOL | 与请求相关的信息获取协议的名字和版本。通常是HTTP/1.0
SERVER_SOFTWARE | CGI程序运行的Web服务器的名字和版本
lpvBuffer | 指向缓冲区的指针，该缓冲区用于接收请求的信息。
lpdwSize | 指向一个DWORD值的指针，该值指明了缓冲区可以容纳的字节数。如果成功地结束，DWORD中包含了传送到缓冲区内的字节数目（包括结束符null）。
WriteClient从指定的缓冲区向客户发送信息。WriteClient具有如下参数：
· | ConnID | HTTP服务器分配的唯一的连接数。
· | Buffer | 指向要写入数据的缓冲区的指针。
· | lpdwBytes | 指向要写入的数据的指针。
· | dwReserved | 为将来的用途保留。
ReadClient将Web客户的HTTP请求中的信息读入调用者提供的缓冲区。ReadClient具有如下参数：
· | ConnID | HTTP服务器分配的唯一的连接数。
· | lpvBuffer | 指向接收要求的信息的缓冲区的指针。
· | lpdwSize | 指向DWORD值的指针，该值指明缓冲区能够获得的字节数。*lpdwSize中包含了实际传送到缓冲区的字节数。
ServerSupportFunction向ISA提供一些通用目的函数，例如与HTTP服务器实现相关的函数。
ServerSupportFunction具有如下参数：
· | hConn | 连接句柄。
· | dwHSERRequest | HTTP服务器扩展值。可能的取值和相关参数的列表参见 CHttpServerContext::ServerSupportFunction。
· | lpvBuffer | 与HSE_REQ_SEND_RESPONSE_HEADER一起使用的时候，它指向一个以null结尾的字符串（例如，“401 Acess Denied”）。如果这个缓冲区为空，这个函数将发出缺省的响应“200 OK”。与HSE_REQ_DONE_WITH_SESSION一起使用的时候，它指向一个DWORD值，指明了请求的状态代码。
· | lpdwSize | 与HSE_REQ_SEND_RESPONSE_HEADER一起使用的时候，它指向ldwDataType缓冲区的大小。
· | lpdwDataType | 以nll为结尾的字符串，指向将与头一起发送的可选的头或数据。如果为NULL，这个头将以一组“\r\n”结束。

注释：
服务器用后缀.EXE和.BAT将文件标识为CGI（通用网关接口）可执行程序。另外，服务器能用DLL后缀将文件标识为要执行的脚本。
当服务器载入DLL时，它在入口点CHttpServer::GetExtensionVersion调用DLL，以获得HTTP_FILTER_REVISION的版本号，以及服务器管理者的简短文本描述。对于每个客户请求，都要调用CHttpServer::GetExtensionVersion入口点。
扩展将接收共同需要的信息，如查询字符串，路径信息，方法名和转换路径。

请参阅：
CHttpServerContext::ReadClient, CHttpServer::GetExtensionVersion, CHttpServer::HttpExtensionProc


 FILETIME结构

FILETIME结构具有如下形式：
typedef struct _FILETIME
{
DWORD dwLowDateTime; /* low 32 bits */
DWORD dwHighDateTime; /* high 32 bits */
} FILETIME, *PFILETIME, *LPFILETIME;

FILETIME结构是一个64位值，代表了自1601年以来经过的100纳秒的个数。

成员：
dwLowDateTime | 指定了文件时间的低32位值。
dwHighDateTime | 指定了文件时间的高32位值。

说明：
不建议直接在该数据结构上进行加减操作而获取相对时间值，而是应该用下面的方法：
首先将获取的FILETIME类型变量复制到一个LARGE_INTEGER类型的变量中。
然后在LARGE_INTEGER上进行正常的64位加减法操作。

请参阅：CTime::CTime


 HSE_VERSION_INFO结构

HSE_VERSION_INFO结构具有如下形式：
typedef struct _HSE_VERSION_INFO
{
DWORD dwExtensionVersion;
CHAR lpszExtensionDesc[HSE_MAX_EXT_DLL_NAME_LEN];
} HSE_VERSION_INFO, *LPHSE_VERSION_INFO;
这个结构是由CHttpServer::GetExtensionVersion成员函数的pVer参数所指向的。它提供了ISA的版本号以及ISA的文本描述。

成员：
dwExtensionVersion | ISA的版本号。
lpszExtensionDesc | ISA的文本描述。缺省的实现提供了文本的位置，应当重定义CHttpServer::GetExtensionVersion函数以提供你自己的描述。

请参阅：CHttpServer::GetExtensionVersion


 HTTP_FILTER_AUTHENT结构

HTTP_FILTER_AUTHENT结构具有如下形式：
typedef struct _HTTP_FILTER_AUTHENT
{
CHAR* pszUser; //IN/OUT
DWORD cbUserBuff; //IN
CHAR* pszPassword; //IN/OUT
DWORD cbPasswordBuff; //IN
} HTTP_FILTER_AUTHENT, *PHTTP_FILTER_AUTHENT;

成员：
pszUser | 指向一个包含了这次请求的用户名的字符串。一个空串代表一位匿名用户。
cbUserBuff | pszUser指向的缓冲区的大小。必须保证至少为SF_MAX_USERNAME。
pszPassword | 指向一个包含了这次请求的密码的字符串。
cbPasswordBuff | pszPassword指向的缓冲区的大小。必须保证至少为SF_MAX_PASSWORD

说明：
当CHttpFilter::HttpFilterProc中的NotificationType为SF_NOTIFY_AUTHENTICATION时，其中的pvNotification指向该结构，用来表示服务器正打算识别该客户。
通过重载CHttpFilter::OnAuthentication函数，该结构可以用于处理不同的客户配置。
上面注释中的IN或IN/OUT表示该成员是否应用于通知进入(IN)过滤器或进入和来自(IN/OUT)过滤器。

请参阅：
CHttpFilter::HttpFilterProc, CHttpFilter::OnAuthentication


 HTTP_FILTER_CONTEXT结构

HTTP_FILTER_CONTEXT结构具有如下形式：
typedef struct _HTTP_FILTER_CONTEXT
{
DWORD cbSize; //IN
DWORD Revision; //IN
PVOID ServerContext; //IN
DWORD ulReserved; //IN
BOOL fIsSecurePort; //IN
PVOID pFilterContext; //IN/OUT
BOOL (WINAPI* GetServerVariable) (
struct _HTTP_FILTER_CONTEXT * pfc,
LPSTR lpszVariableName,
LPVOID lpvBuffer,
LPDWORD lpdwSize
);
BOOL (WINAPI* AddResponseHeaders) (
struct _HTTP_FILTER_CONTEXT * pfc,
LPSTR lpszHeaders,
DWORD dwReserved
);
BOOL (WINAPI * WriteClient) (
struct _HTTP_FILTER_CONTEXT * pfc,
LPVOID Buffer,
LPDWORD lpdwBytes,
DWORD dwReserved
);
VOID * (WINAPI * AllocMem) (
struct _HTTP_FILTER_CONTEXT * pfc,
DWORD cbSize,
DWORD dwReserved
);
BOOL (WINAPI * ServerSupportFunction) (
struct _HTTP_FILTER_CONTEXT * pfc,
enum SF_REQ_TYPE sfReq,
PVOID pData,
DWORD ul1,
DWORD ul2
);
} HTTP_FILTER_CONTEXT, *PHTTP_FILTER_CONTEXT;
上面的注释IN或IN/OUT指明成员是仅用于发送到过滤器的消息（IN）还是用于发送到过滤器和从过滤器发出的消息（OUT）。

成员：
cbSize | 以字节数计的结构大小。
Revision | 结构的修正级别，小于或等于HTTP_FILTER_REVISION的版本。
ServerContext | 为服务器的使用而保留。
ulReserved | 为服务器的使用而保留。
fIsSecurePort | 如果为TRUE表明这一事件通过一个安全端口发生。
pFilterContext | 过滤器使用的指针，指向环境信息，过滤器将之与请求相关联。在SF_NOTIFY_END_OF_NET_SESSION通知中可以安全地释放与请求相关的内存。
GetServerVariable函数的指针，此函数用于获取服务器和连接的信息。有关细节参见CHttpServerContext::GetServerVariable。GetServerVariable具有以下参数：
· | pfc | 指向传递到CHttpFilter::HttpFilterProc的过滤器环境的指针。
· | lpszVariableName | 要获取的服务器变量。
· | lpvBuffer | 用于存储变量值的缓冲区。
· | lpdwSize | 缓冲区lpvBuffer的大小。
AddResponseHeaders函数的指针，此函数在HTTP响应上加上头。有关细节参见CHttpServerContext::ServerSupportFunction中对于HSE_REQ_SEND_RESPONSE_HEADER的描述。AddResponseHeaders具有以下参数：
· | pfc | 指向传送给CHttpFilter::HttpFilterProc过滤器环境的指针。
· | lpszHeaders | 包含要加的头的字符串指针。
· | dwReserved | 留作将来使用。必须为0。
WriteClient函数的指针，此函数将原始数据发回客户。有关细节参见CHttpFilterContext::WriteClient。WriteClient具有以下参数：
· | pfc | 传送给CHttpFilter::HttpFilterProc的指针。
· | Buffer | 包含发送给客户的数据的缓冲区。
· | lpdwBytes | Buffer指向的缓冲区大小。
· | dwReserved | 留作将来使用。
AllocMem指向用来分配内存的函数的指针。当请求结束时，这个函数分配的内存将被自动释放。AllocMem具有以下参数：
· | pfc | 传递给CHttpFilter::HttpFilterProc的指针。
· | cbSize | 要分配的缓冲区的大小。
· | dwReserved | 留作将来使用。
ServerSupportFunction指向用来扩展ISAPI过滤器API的指针。下面列出的参数与使用的ISA有关：
·pfc指向用来扩展ISAPI过滤器API的函数的指针。
·sfReq服务器函数通知。可能值如下：
SF_REQ_SEND_RESPONSE_HEADER | 发送一个完整的HTTP服务器响应头，包括状态，服务器版本，消息时间和MIME版本。服务器扩展会在信息的结尾添加其它信息，比如内容类型，内容长度等等，最后是额外的"\r\n"。
SF_REQ_ADD_HEADERS_ON_DENIAL | 如果服务器忽略HTTP请求，在服务器错误响应加上特定的头。这允许一个授权的过滤器不过滤任何请求而广播它的服务。通常这个头是遵照自定义鉴定模式的WWW鉴定头，但是对头指定的内容并不作任何限制。
SF_REQ_SET_NEXT_READ_SIZE | 仅被原始数据过滤器使用，返回SF_STATUS_ READ_NEXT。
pData | 字符串指针。与ISA有关。对sfReg的每个值，相应的pData值参见注释部分的表格。
ul1, ul2 | 与ISA有关。对sfReg的每个值，相应的值参见注释部分的表格。

注释：下面是与ServerSupportFunction参数对应的可能值：
sfReq | pData | ul1, ul2
SF_REQ_SEND_RESPONSE_HEADER | 以零结尾的字符串，指向可选的状态字符串（比如“401AccessDenied”），对于缺省的响应“200OK”为NULL | 以零结尾的字符串，指向将被附加到头和设置头的可选数据。如为NULL，头将以空行结束
SF_REQ_ADD_HEADERS_ON_DENIAL | 以零结尾的字符串，指向一个或多个以"/r/n"结尾的头行 |
SF_REQ_SET_NEXT_READ_SIZE |  | 下一次要读的字节数

请参阅：
CHttpFilter::HttpFilterProc, CHttpFilter::OnLog, CHttpServerContext, CHttpServerContext::GetServerVariable, CHttpServerContext::ServerSupportFunction, CHttpServerContext::WriteClient


 HTTP_FILTER_LOG结构

HTTP_FILTER_LOG结构具有如下形式：
typedef struct _HTTP_FILTER_LOG
{
const CHAR* pszClientHostName; //IN/OUT
const CHAR* pszClientUserName; //IN/OUT
const CHAR* pszServerName; //IN/OUT
const CHAR* pszOperation; //IN/OUT
const CHAR* pszTarget; //IN/OUT
const CHAR* pszParameters; //IN/OUT
DWORD dwHttpStatus; //IN/OUT
DWORD dwWin32Status; //IN/OUT
} HTTP_FILTER_LOG, *PHTTP_FILTER_LOG;
CHttpFilter::HttpFilterProc中的pvNotification指向这个结构，此时NotificationType应该是SF_NOTIFY_LOG，指明服务器将把信息记入日志文件。字符串不能改变，但是可以替换指针。如果改变了字符串指针，它们所指向的内存必须保持有效，直到产生下一次通知。
上面注释中的IN/OUT指明该成员应用于输入（IN）或输出（OUT）到过滤器的消息。

成员：
pszClientHostName | 客户的主机名。
pszClientUserName | 客户的用户名。
pszServerName | 客户所连接的服务器名。
pszOperation | HTTP命令。
pszTarget | HTTP命令的目标。
pszParameters | 传递给HTTP命令的参数。
dwHttpStatus | HTTP的返回状态。
dwWin32Status | Win32错误代码。

请参阅：
CHttpFilter::HttpFilterProc, CHttpFilter::OnLog


 HTTP_FILTER_PREPROC_HEADERS结构

HTTP_FILTER_PREPROC_HEADERS结构具有如下形式：
typedef struct _HTTP_FILTER_PREPROC_HEADERS
{
BOOL (WINAPI * GetHeader) (
struct _HTTP_FILTER_CONTEXT * pfc,
LPSTR lpszName,
LPVOID lpvBuffer,
LPDWORD lpdwSize
);
BOOL (WINAPI * SetHeader) (
struct _HTTP_FILTER_CONTEXT * pfc,
LPSTR lpszName,
LPSTR lpszValue
);
BOOL (WINAPI * AddHeader) (
struct _HTTP_FILTER_CONTEXT * pfc,
LPSTR lpszName,
LPSTR lpszValue
);
DWORD dwReserved;
} HTTP_FILTER_PREPROC_HEADERS, *PHTTP_FILTER_PREPROC_HEADERS;
CHttpFilter::HttpFilterProc中的pvNotification指向这个结构，此时NotificationType应该是SF_NOTIFY_PREPROC_HEADERS，指明服务器将要处理客户头。

成员：
GetHeader函数指针，该函数接收指定的头值。头名中必须包括冒号（“：”）。可以用特定的值，如“method”，“url”和“version”来接收请求行的单独部分。GetHeader具有以下参数：
· | pfc | 从传递给CHttpFilter::HttpFilterProc 的过滤器环境指针中获得的过滤器环境。
· | lpszName | 要获得的头的名字。
· | lpvBuffer | 指向大小为lpdwSize的缓冲区的指针，其中保存了头的值。
· | lpdwSize | lpvBuffer指向的缓冲区的大小。
SetHeader函数指针，该函数用于改变或删除头的值。SetHeader具有以下参数：
· | pfc | 从传递给CHttpFilter::HttpFilterProc 的过滤器环境指针中获得的过滤器环境。
· | lpszName | 要改变或删除的头的名字。
· | lpszValue | 字符串指针，要把头改变为该指针所指向的字符串；或者是指向“\0”的指针，表明要删除头。
AddHeader函数指针，该函数用于加入头。AddHeader具有如下参数：
· | pfc | 从传递给CHttpFilter::HttpFilterProc 的过滤器环境指针中获得的过滤器环境。
· | lpszName | 要改变或删除的头的名字。
· | lpszValue | 字符串指针，要把头改变为该指针所指向的字符串；或者是指向“\0”的指针，表明要删除头。

请参阅：
CHttpFilter::HttpFilterProc, CHttpFilter::OnPreprocHeaders


 HTTP_FILTER_RAW_DATA结构

HTTP_FILTER_RAW_DATA结构具有如下形式：
typedef struct _HTTP_FILTER_RAW_DATA
{
PVOID pvInData; //IN
DWORD cbInData; //IN
DWORD cbInBuffer; //IN
DWORD dwReserved; //IN
} HTTP_FILTER_RAW_DATA, *PHTTP_FILTER_RAW_DATA;
这个结构被传递给CHttpFilter::HttpFilterProc的SF_NOTIFY_READ_RAW_DATA和SF_NOTIFY_SEND_RAW_DATA通知类型。
上面注释中的IN指明要处理的消息将发往过滤器。

成员：
pvInData | 指向数据缓冲区的指针（输入或输出）。
cbInDatapvInData | 所指向的缓冲区中数据的数量。
cbInBufferpvInData | 所指向的缓冲区的大小。
dwReserved | 为将来的使用保留。

请参阅：
CHttpFilter::HttpFilterProc, CHttpFilter::OnReadRawData, CHttpFilter::OnSendRawData


 HTTP_FILTER_URL_MAP结构

HTTP_FILTER_URL_MAP结构具有如下形式：
typedef struct _HTTP_FILTER_URL_MAP
{
const CHAR* pszURL; //IN
CHAR* pszPhysicalPath; //IN/OUT
DWORD cbPathBuff; //IN
} HTTP_FILTER_URL_MAP, *PHTTP_FILTER_URL_MAP;
CHttpFilter::HttpFilterProc中的pvNotification指向这个结构，此时NotificationType应该是SF_NOTIFY_URL_MAP，指明服务器将把指定了URL映射到实际路径。过滤器可以随时修改实际路径。
上面注释中的IN或IN/OUT指明该成员是仅适用于发往过滤器的消息（IN）还是对发往过滤器和过滤器发出的消息都适用（IN/OUT）。

成员：
pszURL | 将要被映射到实际路径的URL。
pszPhysicalPath | 保存实际路径的缓冲区指针。
cbPathBuffpszPhysicalPath | 所指向的缓冲区的大小。

请参阅：
CHttpFilter::HttpFilterProc, CHttpFilter::OnUrlMap


 HTTP_FILTER_VERSION结构

HTTP_FILTER_VERSION结构具有如下形式：
typedef struct _HTTP_FILTER_VERSION
{
DWORD dwServerFilterVersion; //IN
DWORD dwFilterVersion; //OUT
CHAR lpszFilterDesc[SF_MAX_FILTER_DESC_LEN+1]; //OUT
DWORD dwFlags; //OUT
} HTTP_FILTER_VERSION, *PHTTP_FILTER_VERSION;
这个结构被服务器传递给应用程序的CHttpFilter::HttpFilterProc入口点，用来把任何环境信息与HTTP请求关联起来。
上面注释中的IN或OUT指明该成员是适用于发往过滤器的消息（IN）还是过滤器发出的消息（OUT）。

成员：
dwServerFilterVersion | 过滤使用的头的版本。当前头文件的版本为HTTP_FILTER_REVISION。
dwFilterVersion | HTTP_FILTER_REVISION的版本。
lpszFilterDesc | 保存简短的字符串的位置，该字符串描述了ISAPI过滤器应用程序。
dwFlags | SF_NOTIFY_* 标志的组合，用来指明这个应用程序需要什么事件，过滤器以何种优先级载入。有效标志的列表参见CHttpFilter::GetFilterVersion和 CHttpFilter::HttpFilterProc。

请参阅：
CHttpFilter::HttpFilterProc, CHttpFilter::GetFilterVersion


 LINGER结构

LINGER结构具有如下形式：
struct linger
{
u_short l_onoff; // option on/off
u_short l_linger; // linger time
};
LINGER结构被用来操作CAsyncSocket::GetSockOpt的SO_LINGER和SO_DONTLINGER选项。

注释：
设置了SO_DONTLINGER选项可以防止成员函数阻塞。在等待发送还未发送出去的数据时可以关闭。设置这个选项等价于把SO_LINGER的l_onoff设为0。

请参阅：
CAsyncSocket::GetSockOpt, CAsyncSocket::SetSockOpt


 LOGBRUSH结构

LOGBRUSH结构具有如下形式：
typedef struct tag LOGBRUSH
{ /* lb */
UINT lbStyle;
COLORREF lbColor;
LONG lbHatch;
} LOGBRUSH;

LOGBRUSH结构定义了物理刷子的风格、颜色和模板。它被Windows的CreateBrushIndirect和ExtCreatePen函数使用。

成员：
lbStyle指定了刷子的风格。lbStyle成员必须是以下风格之一：
BS_DIBPATTERN | 一个代模板的刷子，用设备无关位图（DIB）来定义。如果lbStyle为BS_DIBPATTERN，那么lbHatch成员中包含了压缩DIB的句柄。
BS_DIBPATTERNPT | 一个代模板的刷子，用设备无关位图（DIB）来定义。如果lbStyle为BS_DIBPATTERNPT，那么lbHatch成员中包含了指向压缩DIB的指针。
BS_HATCHED | 阴影刷子。
BS_HOLLOW | 空刷子。
BS_NULL | 与BS_HOLLOW相同。
BS_PATTERN | 用内存位图定义的模板刷子。
BS_SOLID | 实心刷子。
lbColor指定了画出刷子的颜色。如果lbStyle为BS_HOLLOW或BS_PATTERN风格，将会忽略lbColor。如果lbStyle为BS_DIBPATTERN或BS_DIBPATTERNBT，则lbColor的低位字指定了BITMAPINFO结构的bmiColors成员是包含了准确的红、绿、蓝（RGB）值还是包含当前使用的逻辑调色板的索引。lbColor成员可以取如下值之一：
·DIB_PAL_COLORS | 颜色表中包含了当前使用的逻辑调色板中的16位索引数组。
·DIB_RGB_COLORS | 颜色表中包含了准确的RGB值。
lbHatch指定了阴影的风格。其含义依赖于lbStyle所定义的刷子风格。如果lbStyle为BS_DIBPATTERN，则lbHatch成员中包含了包装的DIB的句柄。如果lbStyle为BS_DIBPATTERNPT，则lbHatch成员中包含了包装的DIB的指针。如果lbStyle为BS_HATCHED，则lbHatch成员指定了创建阴影时使用的线条的方向。它可以取下面列出的值：
· | HS_BDIAGONAL | 45度向上，从左到右的阴影。
· | HS_CROSS | 纵横交叉的阴影。
· | HS_DIAGCROSS | 45度交叉的阴影。
· | HS_FDIAGONAL | 45度向下，从左到右的阴影。
· | HS_HORIZONTAL | 水平阴影。
· | HS_VERTICAL | 垂直阴影。
如果lbStyle是BS_PATTERN，则lbHatch为定义了模板的位图句柄。如果lbStyle为BS_SOLID或BS_HOLLOW，则lbHatch被忽略。

注释：
lbColor控制着阴影刷子的前景色，CDC::SetBkMode和CDC::SetBkColorbm函数控制着背景色。

请参阅：CDC::GetCharABCWidths


 LOGPEN结构

LOGPEN结构具有如下形式：
typedef struct tagLOGPEN
{ /* lgpn */
UINT lopnStyle;
POINT lopnWidth;
COLORREF lopnColor;
} LOGPEN;

LOGPEN结构定义了画笔的风格、宽度和颜色，画笔是用于画出线条和边界的绘图对象。CPen::CreatePenIndirect函数使用LOGPEN结构。

成员：
lopnStyle指定了画笔的风格。这个成员可以是以下值之一：
· | PS_SOLID | 创建实心的画笔。
· | PS_DASH | 创建短线画笔。（仅当画笔宽度为1时有效）
· | PS_DOT | 创建点线画笔。（仅当画笔宽度为1时有效）
· | PS_DASHDOT | 创建点划线画笔。（仅当画笔宽度为1时有效）
· | PS_DASHDOTDOT | 创建短线与两个点相间的画笔。（仅当画笔宽度为1时有效）
· | PS_NUL | 创建空画笔。
· | PS_INSIDEFRAME | 创建一种画笔，在封闭图形的框架内部画线，这个图形是由那些指定边界矩形的GDI输出函数（例如Ellipse，Rectangle，RoundRect，Pie以及Chord成员函数）生成的。当对那些不指定边界矩形的GDI输出函数（例如LineTo成员函数）应用这个风格时，画笔的绘图区域并不被限制在框架内部。
如果画笔具有PS_INSIDEFRAME风格，并且其颜色与逻辑颜色表中的颜色不匹配，那么将用抖动色画出该画笔。不能用PS_SOLID风格来创建具有抖动色的画笔。当画笔宽度小于或等于1时，PS_INSIDEFRAME风格与PS_SOLID风格相同。
当对Ellipse，Rectangle和RoundRect以外的函数产生的GDI对象使用PS_INSIDEFRAME风格时，画出的线条可能不会完全位于指定的框架内部。
lopnWidth | 指定画笔的宽度，使用逻辑单位。如果lopnWidth成员为0，则不论当前的映射模式是什么，画笔在光栅设备上的宽度都是一个象素。
lopnColor | 指定画笔的颜色。

注释
lopnWidth成员中POINT结构的y值没有被使用。

请参阅：CPen::CreatePenIndirect


 MEASUREITEMSTRUCT结构

MEASUREITEMSTRUCT数据结构具有如下形式：
typedef struct tagMEASUREITEMSTRUCT
{
UINT CtlType;
UINT CtlID;
UINT itemID;
UINT itemWidth;
UINT itemHeight;
DWORD itemData
} MEASUREITEMSTRUCT;
MEASUREITEMSTURCT结构通知Windows自画控件或菜单项的尺度。这使得Windows能够正确处理控件的用户交互。如果没有正确地填充MEASUREITEMSTRUCT结构中的成员，可能会导致控件的不正确的操作。

成员：
CtlType包含了控件的类型。控件类型的取值如下：
· | ODT_COMBOBOX | 自画组合框。
· | ODT_LISTBOX | 自画列表框。
· | ODT_MENU | 自画菜单。
CtlID | 包含了组合框、列表框或按钮的控制ID。菜单不使用这个成员。
ItemID | 包括了菜单的菜单项ID或是可变高度的组合框或列表框中列表框项的ID。这个成员不对固定高度的组合框、列表框和按钮使用。
ItemWidth | 指定了菜单项的宽度。自画菜单项的所有者必须在它从消息返回之前填充这个成员。
ItemHeight | 指定了列表框或菜单中一项的高度。在从消息返回之前，自画组合框、列表框或菜单项的所有者必须填充这个成员。列表框项的最大高度为255。
ItemData对于组合框或列表框，这个成员中包含了下列函数传递给列表框的值：
· | CComboBox::AddString
· | CComboBox::InsertString
· | CListBox::AddString
· | CListBox::InsertString
对于菜单，这个成员中包含了下列函数传递给菜单的值：
· | CMenu::AppendMenu
· | CMenu::InsertMenu
· | CMenu::ModifyMenu

请参阅：CWnd::OnMeasureItem


 MINMAXINFO结构

MINMAXINFO结构具有如下形式：
typedef struct tagMINMAXINFO
{
POINT ptReserved;
POINT ptMaxSize;
POINT ptMaxPosition;
POINT ptMinTrackSize;
POINT ptMaxTrackSize;
} MINMAXINFO;
MINMAXINFO结构中包含了有关窗口的最大化大小和位置以及最大、最小跟踪大小的信息。

成员：
ptReserved | 为内部使用保留。
ptMaxSize | 指定了窗口的最大化宽度（point.x）和最大化高度（point.y）。
ptMaxPosition | 指定了最大化窗口的左边位置（point.x）和顶部位置（point.y）。
ptMinTrackSize | 指定了窗口的最小跟踪宽度（point.x）和最小跟踪高度（point.y）。
ptMaxTrackSize | 指定了窗口的最大跟踪宽度（point.x）和最大跟踪高度（point.y）。

请参阅：CWnd::OnGetMinMaxInfo


 MSG结构

MSG结构具有如下形式：
typedef struct tagMSG
{ // msg
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;

MSG结构中包含了线程的消息队列中的消息信息。

成员：
hwnd | 标识了接收的消息的窗口过程所属的窗口的句柄。
message | 指定了消息号。
wParam | 指定了消息的附加信息。具体的含义与message成员的值有关。
lParam | 指定了消息的附加信息。具体的含义与message成员的值有关。
time | 指定了发出消息的时间。
pt | 指定了发出消息时光标位置的屏幕坐标。


 NCCALCSIZE_PARAMS结构

NCCALCSIZE_PARAMS结构具有如下形式：
typedef struct tagNCCALCSIZE_PARAMS
{
RECT rgrc[3];
PWINDOWPOS lppos;
} NCCALCSIZE_PARAMS;
NCCALCSIZE_PARAMS结构中包含了一些信息，应用程序在处理WM_NCCALCSIZE消息的时候用它来计算窗口客户区的大小，位置和有效内容。

成员：
rgrc | 指定了一个矩形数组。第一个矩形包含了窗口被移动或改变大小之后的新坐标。第二个矩形包含了窗口被移动或改变大小之前的坐标。第三个矩形包含了在被移动或改变大小之前窗口客户区的坐标。如果该窗口是一个子窗口，那么这些坐标是相对于父窗口的客户区的。如果该窗口是一个顶层窗口，那么这些坐标是相对于屏幕的。
lppos | 指向WINDOWPOS结构，其中包含了引起窗口移动或改变大小的操作所指定的大小或位置值。

请参阅：CWnd::OnNcCalcSize


 PAINTSTRUCT结构

PAINTSTRUCT结构具有如下形式：
typedef struct tagPAINTSTRUCT
{
HDC hdc;
BOOL fErase;
RECT rCPaint;
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[16];
} PAINTSTRUCT;

PAINTSTRUCT结构中包含了被用于画出窗口客户区的信息。

成员：
hdc | 标识了用于绘图的显示环境。
fErase | 指定是否要重画背景。如果应用程序需要重画背景，则其为非零值。如果创建Windows的窗口类时没有使用背景刷子（参见Win32 SDK文档中WNDCLASS结构的hbrBackground成员的描述），那么应由应用程序负责画出背景。
rCPaint | 指定了要重画的矩形区域的左上角和右下角。
fRestore | 保留成员。它被Windows内部使用。
fIncUpdate | 保留成员。它被Windows内部使用。
rgbReserved[16] | 保留成员。Windows内部使用的保留内存块。

请参阅：CPaintDC::m_ps


 POINT结构

POINT数据结构具有如下形式：
typedef struct tagPOINT
{
LONG x;
LONG y;
} POINT;

POINT结构定义一个点的x和y坐标。

成员：
x | 指定了点的x坐标。
y | 指定了点的y坐标。

请参阅：CPoint


 RECT结构

RECT数据结构具有如下形式：

typedef struct tagRECT
{
LONG left;
LONG top;
LONG right;
LONG bottom;
} RECT;

RECT结构定义了矩形的左上角坐标和右下角坐标。

成员：
left | 指定了矩形的左上角的x坐标。
top | 指定了矩形的左上角的y坐标。
right | 指定了矩形的右下角的x坐标。
bottom | 指定了矩形的右下角的y坐标。

请参阅：CRect


 RGNDATA结构

RGNDATA结构具有如下形式：
typedef struct _RGNDATA
{ /* rgnd */
RGNDATAHEADER rdh;
char Buffer[1];
} RGNDATA;
RGNDATA结构中包含了一个头和一个矩形数组，组成了一个区域。这些矩形从左到右、从上到下排列，没有重叠。

成员：
rdh | 指定了一个RGNDATAHEADER结构。（有关这个结构的更多信息参见Win32 SDK文档）这个结构的成员指定了区域的类型（是矩形还是不规则多边形），组成区域的矩形数目，包含矩形结构的缓冲区大小，等等。
Buffer | 指定了任意大小的缓冲区，其中包含了组成区域的RECT结构。

请参阅：
CRgn::CreateFromData, CRgn::GetRegionData


 SIZE结构

SIZE结构具有如下形式：
typedef struct tagSIZE
{
int cx;
int cy;
} SIZE;

SIZE结构指定了矩形的宽度和高度。

成员：
cx | 指定了函数返回时的x范围。
cy | 指定了函数返回时的y范围。

注释：
这个结构中保存的矩形尺度信息可以作为视口的范围，窗口范围，文本范围，位图尺度或者是一些扩展函数使用的aspect-ratio过滤器。

请参阅：CSize


 SOCKADDR结构

SOCKADDR结构具有如下形式：
struct sockaddr
{
unsigned short sa_family;
char sa_data[14];
};
SOCKADDR结构被用来保存参与Windows Sockets通讯的机器的Internet协议（IP）地址。

成员：
sa_family | Socket地址家族。
sa_data | 所有不同的socket地址结构的最大大小。

注释：
Microsoft TCP/IP Sockets开发包只支持Internet地址域。为了填充地址的每个部分，应当使用SOCKADDR_IN结构，它是这个地址格式所特有的。SOCKADDR和SOCKADDR_IN数据结构的大小相同。你可以在这两种数据结构之间转换。更多的信息参见Win32 SDK文档中的“Windows Sockets编程考虑”。

请参阅：
SOCKADDR_IN, CAsyncSocket::Create, CSocket::Create


 SOCKADDR_IN结构

SOCKADDR_IN结构具有如下形式：
struct sockaddr_in
{
short sin_family;
unsigned short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
在Internet地址家族中，SOCKADDR_IN结构被Windows Sockets用来指定要连接的本地或远程结束点地址。这是一种与Internet地址家族有关的SOCKADDR结构的形式，并且它可以被强制转换为SOCKADDR。

成员：
sin_family | 地址家族（必须是AF_INET）。
sin_port | IP端口。
sin_addr | IP地址。
sin_zero | 用于将该结构对齐到与SOCKADDR相同的大小。

注释：
这个结构中的IP地址部分属于IN_ADDR类型。在Windows Sockets头文件WINSOCK.H中，IN_ADDR是按照下面的方式定义的：
struct in_addr
{
union
{
struct
{
unsigned char s_b1,
s_b2,
s_b3,
s_b4;
} S_un_b;

struct
{
unsigned short s_w1,
s_w2;
} S_un_w;

unsigned long S_addr;
} S_un;
};
更多的信息参见Win32 SDK文档中的“Windows Sockets编程考虑”。

请参阅：SOCKADDR


 SYSTEMTIME结构

SYSTEMTIME结构具有如下形式：
typedef struct _SYSTEMTIME
{
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME;
SYSTEMTIME结构代表了日期和时间，对于月、日、年、周、时、分、秒和毫秒分别使用了不同的成员。

成员：
wYear | 当前的年。
wMonth | 当前的月，一月为1。
wDayOfWeek | 当前的周日，星期日为0，星期一为1，依次类推。
wDay | 当前的日期。
wHour | 当前的小时。
wMinute | 当前的分钟数。
wSecond | 当前的秒数。
wMilliseconds | 当前的毫秒数。

请参阅：CTime::CTime


 TEXTMETRIC结构

TEXTMETRIC 结构具有如下形式：
typedef struct tagTEXTMETRIC
{ /* tm */
int tmHeight;
int tmAscent;
int tmDescent;
int tmInternalLeading;
int tmExternalLeading;
int tmAveCharWidth;
int tmMaxCharWidth;
int tmWeight;
BYTE tmItalic;
BYTE tmUnderlined;
BYTE tmStruckOut;
BYTE tmFirstChar;
BYTE tmLastChar;
BYTE tmDefaultChar;
BYTE tmBreakChar;
BYTE tmPitchAndFamily;
BYTE tmCharSet;
int tmOverhang;
int tmDigitizedAspectX;
int tmDigitizedAspectY;
} TEXTMETRIC;

TEXTMETRIC结构中包含了有关物理字体的基本信息。所有的大小都是用逻辑单位给出的，这意味着，它们依赖于显示环境的当前映射模式。
有关这个结构的更完整的信息参见Win32 SDK文档中的TEXTMETRIC。

请参阅：CDC::GetTextMetrics


 WINDOWPLACEMENT结构

WINDOWPLACEMENT 数据结构具有如下形式：
typedef struct tagWINDOWPLACEMENT
{ /* wndpl */
UINT length;
UINT flags;
UINT showCmd;
POINT ptMinPosition;
POINT ptMaxPosition;
RECT rcNormalPosition;
} WINDOWPLACEMENT;
WINDOWPLACEMENT 结构中包含了有关窗口在屏幕上位置的信息。

成员：
length | 指定了结构的长度，以字节为单位。
flags指定了控制最小化窗口的位置的标志以及复原窗口的方法。这个成员可以是下面列出的标志之一，或都是：
· | WPF_SETMINPOSITION | 表明可以指定最小化窗口的x和y坐标。如果是在ptMinPosition成员中设置坐标，则必须指定这个标志。
· | WPF_RESTORETOMAXIMIZED | 表明复原后的窗口将会被最大化，而不管它在最小化之前是否是最大化的。这个设置仅在下一次复原窗口时有效。它不改变缺省的复原操作。这个标志仅当showCmd成员中指定了SW_SHOWMINIMIZED时才有效。
showCmd指定了窗口的当前显示状态。这个成员可以是下列值之一：
· | SW_HIDE | 隐藏窗口，使其它窗口变为激活的。
· | SW_MINIMIZE | 最小化指定的窗口，并激活系统列表中的顶层窗口。
· | SW_RESTORE | 激活并显示窗口。如果窗口是最小化或最大化的，Windows将把它恢复到原来的大小和位置（与SW_SHOWNORMAL相同）。
· | SW_SHOW | 激活窗口并按照当前的位置和大小显示窗口。
· | SW_SHOWMAXIMIZED | 激活窗口并将其显示为最大化的。
· | SW_SHOWMINIMIZED | 激活窗口并将其显示为图标。
· | SW_SHOWMINNOACTIVE | 将窗口显示为图标。当前激活的窗口仍保持激活状态。
· | SW_SHOWNA | 按当前状态显示窗口。当前激活的窗口仍保持激活状态。
· | SW_SHOWNOACTIVATE | 按最近的位置和大小显示窗口。当前激活的窗口仍保持激活状态。
· | SW_SHOWNORMAL | 激活并显示窗口。如果窗口是最小化或最大化的，Windows将它恢复到原来的大小和位置（与SW_RESTORE相同）。
ptMinPosition | 指定了窗口被最小化时左上角的位置。
ptMaxPosition | 指定了窗口被最大化时左上角的位置。
rcNormalPosition | 指定了窗口处于正常状态（复原）时的坐标。

请参阅：CWnd::SetWindowPlacement


 WINDOWPOS结构

WINDOWPOS数据结构具有如下形式：
typedef struct tagWINDOWPOS
{ /* wp */
HWND hwnd;
HWND hwndInsertAfter;
int x;
int y;
int cx;
int cy;
UINT flags;
} WINDOWPOS;
WINDOWPOS结构包含了有关窗口的大小和位置的信息。

成员：
hwnd | 标识窗口。
hwndInsertAfter | 标识了一个窗口，本窗口将被放在这个窗口的后面。
x | 指定了窗口的左边界的位置。
y | 指定了窗口的右边界的位置。
cx | 指定了窗口的宽度，以象素为单位。
cy | 指定了窗口的高度，以象素为单位。
flags指定了窗口位置的选项。这个成员可以是下列值之一：
· | SWP_DRAWFRAME | 画出窗口的边框（在窗口类的描述中定义）。窗口接收到一个WM_NCCALCSIZE消息。
· | SWP_FRAMECHANGED | 向窗口发送一个WM_NCCALCSIZE消息，即使没有改变窗口的大小。如果没有指定这个标志，仅当窗口的大小发生变化时才发送WM_NCCALCSIZE消息。
· | SWP_HIDEWINDOW | 隐藏窗口。
· | SWP_NOACTIVATE | 不激活窗口。
· | SWP_NOCOPYBITS | 废弃客户区的全部内容。如果没有指定这个标志，将会保存客户区的有效内容并在窗口被改变大小或重定位以后回送到客户区。
· | SWP_NOMOVE | 保留当前位置（忽略x和y成员）。
· | SWP_NOOWNERZORDER | 不改变所有者窗口在Z轴上的顺序。
· | SWP_NOSIZE | 保留当前大小（忽略cx和cy成员）。
· | SWP_NOREDRAW | 不重画改变的内容。
· | SWP_NOREPOSITION | 与SWP_NOOWNERZORDER相同。
· | SWP_NOSENDCHANGING | 防止窗口接收WM_WINDOWPOSCHANGING消息。
· | SWP_NOZORDER | 保留当前顺序（忽略hwndInsertAfter成员）
· | SWP_SHOWWINDOW | 显示窗口。

请参阅：CWnd::OnWindowPosChanging


 WSADATA结构

WSADATA结构具有如下形式：
struct WSAData
{
WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYSSTATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR* lpVendorInfo;
};
WSADATA结构被用来保存全局函数AfxSocketInit返回的Windows Sockets初始化信息。

成员：
wVersion | Windows Sockets DLL期望调用者使用的Windows Sockets规范的版本。
wHighVersion | 这个DLL能够支持的Windows Sockets规范的最高版本。通常它与wVersion相同。
szDescription | 以null结尾的ASCII字符串，Windows Sockets DLL将对Windows Sockets实现的描述拷贝到这个字符串中，包括制造商标识。文本（最多可以有256个字符）可以包含任何字符，但是要注意不能包含控制字符和格式字符，应用程序对其最可能的使用方式是把它（可能被截断）显示在在状态信息中。
szSystemStatus | 以null结尾的ASCII字符串，Windows Sockets DLL把有关的状态或配置信息拷贝到该字符串中。Windows Sockets DLL应当仅在这些信息对用户或支持人员有用时才使用它们，它不应被作为szDescription域的扩展。
iMaxSockets | 单个进出能够打开的socket的最大数目。Windows Sockets的实现能提供一个全局的socket池，可以为任何进程分配；或者它也可以为socket分配属于进程的资源。这个数字能够很好地反映Windows Sockets DLL或网络软件的配置方式。应用程序的编写者可以通过这个数字来粗略地指明Windows Sockets的实现方式对应用程序是否有用。例如，X Windows服务器在第一次启动的时候可能会检查iMaxSockets的值：如果这个值小于8，应用程序将显示一条错误信息，指示用户重新配置网络软件（这是一种可能要使用szSystemStatus文本的场合）。显然无法保证某个应用程序能够真正分配iMaxSockets个socket，因为可能有其它WindowsSockets应用程序正在使用。
iMaxUdpDg | Windows Sockets应用程序能够发送或接收的最大的用户数据包协议（UDP）的数据包大小，以字节为单位。如果实现方式没有限制，那么iMaxUdpDg为零。在Berkeley sockets的许多实现中，对于UDP数据包有个固有的限制（在必要时被分解），大小为8192字节。Windows Sockets的实现可以对碎片重组缓冲区的分配作出限制。对于适合的WindowsSockets 实现，iMaxUdpDg的最小值为512。注意不管iMaxUdpDg的值是什么，都不推荐你发回一个比网络的最大传送单元（MTU）还大的广播数据包。（Windows Sockets API 没有提供发现MTU的机制，但是它不会小于512个字节）
lpVendorInfo | 指向销售商的数据结构的指针。这个结构的定义（如果有）超出了WindowsSockets规范的范围。更多的信息“参见Win32 SDK文档”中的“Windows Sockets编程考虑”。

注意：
在MFC中，WSADATA结构是由AfxSocketInit函数返回的，你在InitInstance函数中调用这个函数。如果你需要在以后使用这些信息，你可以获得这个结构并将它保存在程序中。

请参阅：AfxSocketInit


 XFORM结构

XFORM结构具有如下形式：
typedef struct tagXFORM
{ /* xfrm */
FLOAT eM11;
FLOAT eM12;
FLOAT eM21;
FLOAT eM22;
FLOAT eDx;
FLOAT eDy;
} XFORM;

注释：
XFORM结构指定了从世界空间到页面空间的转换。EDx和eDy成员分别指定了水平和垂直转换成分。下面的表格显示了其它成员是如何被使用的，依赖于其它操作：
操作 | eM11 | eM12 | eM21 | eM22
旋转 | 旋转角度的余弦 | 旋转角度的正弦 | 旋转角度的反正弦 | 旋转角度的余弦
缩放 | 水平缩放成分 | 空 | 空 | 垂直缩放成分
修剪 | 空 | 水平比例常量 | 垂直比例常量 | 空
反射 | 水平反射成分 | 空 | 空 | 垂直反射成分

请参阅：CRgn::CreateFromData


 MFC使用的风格

当你创建相应的MFC时，使用下列风格。
在大多数情况下，这些风格通常在类的Create函数的dwStyle参数中设置。

MFC风格
风格 | 描述
按钮风格 | 应用于CButton类对象，例如单选框、复选框和按钮。在CButton::Create的dwStyle参数中设置一个组合的风格。
组合框风格 | 应用于CComboBox类对象。在CComboBox::Create的dwStyle参数中设置一个组合的风格。
编辑风格 | 应用于CEdit类对象。在CEdit::Create的dwStyle参数中设置一个组合的风格。
框架窗口风格 | 应用于CFrameWnd类对象。在CFrameWnd::Create的dwStyle参数中设置一个组合的风格。
列表框风格 | 应用于CListBox类对象。在CListBox::Create的dwStyle参数中设置一个组合的风格。
消息框风格 | 应用于AfxMessageBox项。在AfxMessageBox的nType参数中设置一个组合的风格。
滚动条风格 | 应用于CScrollBar类对象。在CScrollBar::Create的dwStyle参数中设置一个组合的风格。
静态文本风格 | 应用于CStatic类对象。在CStatic::Create的dwStyle参数中设置一个组合的风格。
窗口风格 | 应用于CWnd类对象。在CWnd::Create或CWnd::CreateEx的dwStyle参数中设置一个组合的风格。
扩展窗口风格 | 应用于CWnd类对象。在CWnd::CreateEx的dwExStyle参数中设置一个组合的风格。


 按钮风格

· | BS_AUTOCHECKBOX | 与复选框相同，但是当用户选择复选框时，检查标记出现在复选框中，而当用户再一次选择复选框时，检查标记就消失。
· | BS_AUTORADIOBUTTON | 与单项按钮相同，但是当用户选择它的时候，这个按钮自动加亮显示自己并去掉同组中相同风格的其它单项按钮的选择状态。
· | BS_AUTO3STATE | 与三态复选框相同，但是当用户选择该框时它会改变自己的状态。
· | BS_CHECKBOX | 创建一个小方块，在它的右边显示文本（除非这个风格与BS_LEFTTEXT风格一起使用）。
· | BS_DEFPUSHBUTTON | 创建一个具有深黑边界的按钮。用户可以按下ENTER键以选择这个按钮。这个风格使用户可以快速地选择最相似的选项（缺省选项）。
· | BS_GROUPBOX | 创建一个矩形区域，其中的按钮是成组的。与这种风格相关的任何文本将显示在矩形的左上角。
· | BS_LEFTTEXT | 当与单项按钮风格或复选框风格一起使用时，文本出现在单项按钮或复选框的左边。
· | BS_OWNERDRAW | 创建一个自画按钮。当按钮的视觉状态发生改变时，框架调用DrawItem成员函数。当使用CBitmapButton类的时候，必须设置这个风格。
· | BS_PUSHBUTTON | 创建一个按钮，当用户选择该按钮时向所有者窗口发送一个WM_COMMAND消息。
· | BS_RADIOBUTTON | 创建一个小圆形区域，在它的右边显示文本（除非这个风格与BS_LEFTTEXT风格一起使用）。单项按钮通常成组使用但是只能独占选择。
· | BS_3STATE | 与复选框类似，但是这个框不仅可以被选中，还可以被变灰。变灰状态通常用来标识该复选框已经被禁止。

请参阅：CButton::Create


 组合框风格

· | CBS_AUTOHSCROLL | 当用户在行尾输入一个字符时，自动把编辑控件中的文本向右滚动。如果没有设置该风格，则输入的文本信息只能多到填满矩形边框。
· | CBS_DROPDOWN | 与CBS_SIMPLE类似，但是除非用户选择了编辑控件旁边的图标，否则不会显示列表框。
· | CBS_DROPDOWNLIST | 与CBS_DROPDOWN类似，但是编辑控件被静态文本项代替，其中显示了列表框中的当前选择。
· | CBS_HASSTRINGS | 包含了字符串组成的项的自画组合框。组合框维护着字符串的内存和指针，因此应用程序可以使用GetText成员函数从某个项获得文本。
· | CBS_OEMCONVERT | 在组合框的编辑控件内输入的文本将从ANSI字符集转换到OEM字符集，然后再回到ANSI。当应用程序调用Windows的AnsiToOem函数把组合框中的一个ANSI字符串转换到OEM字符时，这能确保进行了合适的字符转换。这个风格对那些包含了文件名的组合框最有用，仅适用于用CBS_SIMPLE或CBS_DROPDOWN风格创建的组合框。
· | CBS_OWNERDRAWFIXED | 列表框的拥有者负责画出其内容，列表框中所有项的高度是一样的。
· | CBS_OWNERDRAWVARIABLE | 列表框的拥有者负责画出其内容，列表框中各项的高度是不一致的。
· | CBS_SIMPLE | 任何时候都显示列表框。列表框的当前选择显示在编辑控件中。
· | CBS_SORT | 自动排列输入到列表框的字符串。
· | CBS_DISABLENOSCROLL | 当列表框没有足够的项以供滚动时，列表框将显示一个被禁止的垂直滚动条。如果没有这种风格，当列表框不包含足够的项时，这个滚动条将会被隐藏。
· | CBS_NOINTEGRALHEIGHT | 指明组合框的大小就是应用程序在创建该组合框时指定的大小。通常，Windows会调整一些组合框的大小，使得组合框不需要显示部分项。

请参阅：CComboBox::Create


 编辑风格

· | ES_AUTOHSCROLL | 当用户在行尾输入字符时，自动将文本向右滚动10个字符。当用户按下ENTER键时，控件将文本滚动回起始位置。
· | ES_AUTOVSCROLL | 当用户在最后一行输入ENTER时，自动将文本向上滚动一页。
· | ES_CENTER | 在单行或多行编辑控件中将文本对中。
· | ES_LEFT | 在单行或多行编辑控件中将文本靠左对齐。
· | ES_LOWERCASE | 将用户输入到编辑控件的字符全部转换为小写。
· | ES_MULTILINE | 指明了一个多行编辑控件（缺省的是单行的）。如果指定了ES_AUTOVSCROLL风格，编辑控件将显示尽可能多的文本，并且当用户按下ENTER键时会自动地垂直滚动文本。如果没有指定ES_AUTOVSCROLL风格，则编辑控件将显示尽可能多的行，如果在按下ENTER键却没有更多的行要显示的话，就发出蜂鸣声。如果指定了ES_AUTOHSCROLL风格，当光标到达控件的右边时，多行编辑控件会自动地水平滚动文本。如果要开始一个新行，用户必须按下ENTER键。如果没有指定ES_AUTOHSCROLL风格，控件会在有必要时自动将单词折合到下一行的开始。如果按下ENTER键，则另起一行。折回单词的位置是由窗口的大小决定的。如果窗口的大小发生改变，折回单词的位置也会反生改变，将会重新显示文本。多行编辑控件可以有滚动条。具有滚动条的编辑控件会处理它自己的滚动条消息。没有滚动条的编辑控件按照前面描述的方式进行滚动，并且处理父窗口发出的任何滚动消息。
· | ES_NOHIDESEL | 通常，当编辑控件失去输入焦点时，它会隐藏选择区域，当它获得输入焦点时，它会反转显示选择区域。如果指定了ES_NOHIDESEL风格则去掉了这个缺省的动作。
· | ES_OEMCONVERT | 输入到编辑控件的文本将被从ANSI字符集转换到OEM字符集，然后转换回ANSI字符集。这使得在应用程序调用Windows的AnsiToOem函数以把编辑控件中的ANSI字符串转换为OEM字符时，能够进行正确的字符转换。这个风格对包含文件名的编辑控件最有用。
· | ES_PASSWORD | 在编辑控件中输入字符时，将所有的字符显示为星号（*）。应用程序可以通过SetPasswordChar成员函数来改变显示的字符。
· | ES_RIGHT | 在单行或多行编辑控件中将文本靠右对齐。
· | ES_UPPERCASE | 在编辑控件中输入字符时，将所有的字符转换为大写。
· | ES_READONLY | 禁止用户输入或修改编辑控件中的文本。
· | ES_WANTRETURN | 指定当用户在对话框中的多行编辑控件中输入文本时，如果按下了ENTER键，则插入回车换行符。如果不使用这个风格，按下ENTER键的效果与按下对话框的缺省按钮相同。这个风格对单行编辑控件不起作用。

请参阅：CEdit::Create


 框架窗口风格

· | FWS_ADDTOTITLE | 指定了要附加到框架窗口标题末尾的信息。例如，“Microsoft Draw - Drawing in Document1”。你可以指定显示在AppWizard的Advanced Options对话框中的字符串。如果你希望关闭这个选项，重载CWnd::PreCreateWindow消息。
· | FWS_PREFIXTITLE | 在框架窗口的标题中，在应用程序的名字之前显示文档的名字。例如，“Document - WordPad”。你可以指定显示在AppWizard的Advanced Options对话框中的字符串。如果你希望关闭这个选项，重载CWnd::PreCreateWindow消息。
· | FWS_SNAPTOBARS | 控制框架窗口的大小，该窗口围绕着一个控制条，这个控制条是一个浮动窗口，而不是固定在框架窗口中。这个风格调整窗口的大小以使用控制条。


 列表框风格

· | LBS_EXTENDEDSEL | 用户可以通过鼠标和SHIFT键或者其它特殊键组合来选取多个项。
· | LBS_HASSTRINGS | 指定自画列表框中包含的项是由字符串组成的。列表框维护着字符串的内存和指针，应用程序可以使用GetText成员函数来获得特定项的文本。
· | LBS_MULTICOLUMN | 指定一个可以水平滚动的多列列表框。SetColumnWidth成员函数设置列的宽度。
· | LBS_MULTIPLESEL | 当用户单击或双击字符串时，切换字符串的选择状态。可以选择任意数目的字符串。
· | LBS_NOINTEGRALHEIGHT | 列表框的大小与应用程序创建它的时候指定的大小完全相等。通常，Windows会调整列表框的大小，是列表框不会只显示部分项。
· | LBS_NOREDRAW | 当列表框发生变化时不更新显示。这个风格可以通过发送WM_SETREDRAW消息在任何时间改变。
· | LBS_NOTIFY | 当用户单击或双击字符串时，父窗口接收到一个输入消息。
· | LBS_OWNERDRAWFIXED | 列表框的所有者负责画出它的内容，列表框中的各项是等高的。
· | LBS_OWNERDRAWVARIABLE | 列表框的所有者负责画出其内容，列表框中的各项的高度不相同。
· | LBS_SORT | 列表框中的字符串是按照字母表顺序排列的。
· | LBS_STANDARD | 列表框中的字符串是按照字母表顺序排序的，当用户单击或双击字符串时，父窗口接收到一个输入消息。列表框在每条边上都有边界。
· | LBS_USETABSTOPS | 允许列表框在显示字符串的时候识别并扩展制表字符。缺省的制表位置是32个对话框单位。（对话框单位是水平或垂直距离。水平对话框单位等于当前对话框基准宽度单位的四分之一。对话框基准单位是通过当前系统字体的宽度和高度来计算的。Windows的GetDialogBaseUnits函数返回以象素为单位的当前对话框基准单位。）
· | LBS_WANTKEYBOARDINPUT | 不论什么时候，只要用户在列表框具有输入焦点的时候按下了键，列表框就接收到WM_VKEYTOITEM或WM_CHARTOITEM消息。这使得应用程序能够对键盘输入进行特别处理。
· | LBS_DISABLENOSCROLL | 当列表框中没有足够多的项，不需要滚动时，就显示一个被禁止的垂直滚动条。如果不使用这个风格，当列表框不包含足够多的项时，它就隐藏滚动条。

请参阅：CListBox::Create


 消息框风格

消息框类型
· | MB_ABORTRETRYIGNORE | 消息框包含三个按钮：Abort，Retry和Ignore。
· | MB_OK | 消息框包含一个按钮：OK。
· | MB_OKCANCEL | 消息框包含两个按钮：OK和Cancel。
· | MB_RETRYCANCEL | 消息框包含两个按钮：Retry和Cancel。
· | MB_YESNO | 消息框包含两个按钮：Yes和No。
· | MB_YESNOCANCEL | 消息框包含三个按钮：Yes，No和Cancel。

消息框模式
· | MB_APPLMODAL | 用户在当前窗口中继续工作之前必须先响应消息框。但是，用户可以移动到其它应用程序的窗口中并在那些窗口中工作。如果没有指定MB_SYSTEMMODAL和MB_TASKMODAL，则缺省值为MB_APPLMODAL。
· | MB_SYSTEMMODAL | 在用户响应消息框之前，所有的应用程序都被挂起。系统模式消息框被用来向用户通知严重的、潜在的毁灭性错误，需要立即注意，小心对待。
· | MB_TASKMODAL | 与MB_APPLMODAL类似，但是在微软基础类应用程序中没有用处。这个标志是为那些没有窗口句柄的调用应用程序或库保留的。

消息框图标
· | MB_ICONEXCLAMATION | 在消息框中显示感叹号图标。
· | MB_ICONINFORMATION | 在消息框中显示一个圆包围着字母“i”的图标。
· | MB_ICONQUESTION | 在消息框中显示问号图标。
· | MB_ICONSTOP | 在消息框中显示停止标志图标。

消息框缺省按钮
· | MB_DEFBUTTON1 | 第一个按钮是缺省按钮。注意，除非指定了MB_DEFBUTTON2 或MB_DEFBUTTON3风格，否则第一个按钮总是缺省按钮。
· | MB_DEFBUTTON2 | 第二个按钮是缺省按钮。
· | MB_DEFBUTTON3 | 第三个按钮是缺省按钮。

请参阅：AfxMessageBox


 滚动条风格

· | SBS_BOTTOMALIGN | 与SBS_HORZ风格一起使用。滚动条的底边与Create成员函数中指定的矩形的底边对齐。滚动条具有系统滚动条的缺省高度。
· | SBS_HORZ | 指明了一个水平滚动条。如果既没有指定SBS_BOTTOMALIGN风格又没有指定SBS_TOPALIGN风格，则滚动条具有Create成员函数中指定的高度，宽度和位置。
· | SBS_LEFTALIGN | 与SBS_VERT风格一起使用。滚动条的左边与Create成员函数中指定的矩形的左边对齐。滚动条具有系统滚动条的缺省宽度。
· | SBS_RIGHTALIGN | 与SBS_VERT风格一起使用。滚动条的右边与Create成员函数中指定的矩形的右边对齐。滚动条具有系统滚动条的缺省宽度。
· | SBS_SIZEBOX | 指明了一个尺寸框。如果SBS_SIZEBOXBOTTOMRIGHTALIGN风格和SBS_SIZEBOXTOPLEFTALIGN风格都没有指定，尺寸框具有Create成员函数中指定的高度，宽度和位置。
· | SBS_SIZEBOXBOTTOMRIGHTALIGN | 与SBS_SIZEBOX风格一起使用。尺寸框的右下角与Create成员函数中指定的矩形的右下角对齐。尺寸框具有系统尺寸框的缺省大小。
· | SBS_SIZEBOXTOPLEFTALIGN | 与SBS_SIZEBOX风格一起使用。尺寸框的左上角与Create成员函数中指定的矩形的左上角对齐。尺寸框具有系统尺寸框的缺省大小。
· | SBS_TOPALIGN | 与SBS_HORZ风格一起使用。滚动条的顶边与Create成员函数中指定的矩形的顶边对齐。滚动条具有系统滚动条的缺省高度。
· | SBS_VERT | 指明了一个垂直滚动条。如果既没有指定SBS_RIGHTALIGN风格也没有指定SBS_LEFTALIGN风格，滚动条具有Create成员函数中指定的高度，宽度和位置。

请参阅：CScrollBar::Create


 静态文本风格

· | SS_BLACKFRAME | 指定了一个带边框的方框，用与窗口边框相同的颜色画出。缺省的颜色是黑色。
· | SS_BLACKRECT | 指定一个矩形，用窗口边框的颜色填充。缺省颜色是黑色。
· | SS_CENTER | 指定一个简单的矩形，在矩形的中央显示给定的文本。文本将在显示之前格式化。超出行尾的单词将自动折回到下一行的开始。
· | SS_GRAYFRAME | 指定一个带边框的方框，用屏幕的背景色（桌面颜色）画出。缺省的颜色是灰色。
· | SS_GRAYRECT | 指定一个矩形，用屏幕的背景色填充。缺省的颜色是灰色。
· | SS_ICON | 指定了在对话框中显示的图标。给定的文本是资源文件中定义的图标名（不是文件名）。nWidth和nHeight参数被忽略，图标自动调整自己的大小。
· | SS_LEFT | 指定一个简单的矩形，在矩形内显示左对齐的给定文本。文本在显示之前格式化。超出行尾的单词将自动折回到下一行的开始。
· | SS_LEFTNOWORDWRAP | 指定一个简单的矩形，在矩形内显示左对齐的给定文本。制表符被扩展，但是不会折回单词。超出行尾的单词被裁剪。
· | SS_NOPREFIX | 除非指定了这个风格，否则Windows将控制文本中所有的“&”字符解释为加速键前缀。在这种情况下，“&”被移去，字符串中的下一个字符被加上下划线。如果一个包含文本的静态文本控件不需要这个特性，可能需要加入SS_NOPREFIX。这个风格可以用于任何静态控件。你可以用位或操作符把SS_NOPREFIX与其它风格组合起来。最常使用这个风格的情况是，可能要在对话框的静态控件中显示带有“&”字符的文件名或其它字符串。
· | SS_RIGHT | 指定一个简单的矩形，在矩形内显示右对齐的给定文本。文本在显示之前格式化。超出行尾的单词将自动折回到下一行的开始。
· | SS_SIMPLE | 指定一个简单的矩形，在矩形内显示一行左对齐的文本。文本行不能用任何方法缩短或改变。（控件的父窗口或对话框不能处理WM_CTLCOLOR消息）
· | SS_USERITEM | 指定一个用户自定义的项。
· | SS_WHITEFRAME | 指定一个带边框的方框，用窗口背景色画出。缺省值为白色。
· | SS_WHITERECT | 指定一个矩形，用窗口背景色填充。缺省值为白色。

请参阅：CStatic::Create


 窗口风格

· | WS_BORDER | 创建一个有边界的窗口。
· | WS_CAPTION | 创建一个有标题条的窗口（隐含WS_BORDER风格）。不能与WS_DLGFRAME风格一起使用。
· | WS_CHILD | 创建一个子窗口。不能与WS_POPUP风格一起使用。
· | WS_CLIPCHILDREN | 当你在父窗口中绘图时，除去子窗口所占的区域。在创建父窗口的时候使用。
· | WS_CLIPSIBLINGS | 剪裁相关的子窗口，这意味着，当一个特定的子窗口接收到重绘消息时，WS_CLIPSIBLINGS风格将在子窗口要重画的区域中去掉与其它子窗口重叠的部分。（如果没有指定WS_CLIPSIBLINGS风格，并且子窗口有重叠，当你在一个子窗口的客户区绘图时，它可能会画在相邻的子窗口的客户区中。）只与WS_CHILD风格一起使用。
· | WS_DISABLED | 创建一个初始状态为禁止的窗口。
· | WS_DLGFRAME | 创建一个窗口，具有双重边界，但是没有标题条。
· | WS_GROUP | 指定一组控件中的第一个，用户可以用箭头键在这组控件中移动。在第一个控件后面把WS_GROUP风格设置为FALSE的控件都属于这一组。下一个具有WS_GROUP风格的控件将开始下一组（这意味着一个组在下一组的开始处结束）。
· | WS_HSCROLL | 创建一个具有水平滚动条的窗口。
· | WS_MAXIMIZE | 创建一个最大化的窗口。
· | WS_MAXIMIZEBOX | 创建一个具有最大化按钮的窗口。
· | WS_MINIMIZE | 创建一个初始状态为最小化的窗口。仅与WS_OVERLAPPED风格一起使用。
· | WS_MINIMIZEBOX | 创建一个具有最小化按钮的窗口。
· | WS_OVERLAPPED | 创建一个重叠窗口。重叠窗口通常具有标题条和边界。
· | WS_OVERLAPPEDWINDOW | 创建一个具有WS_OVERLAPPED，WS_CAPTION，WS_SYSMENU，WS_THICKFRAME，WS_MINIMIZEBOX和WS_MAXIMIZEBOX风格的重叠式窗口。
· | WS_POPUP | 创建一个弹出式窗口，不能与WS_CHILD风格一起使用。
· | WS_POPUPWINDOW | 创建一个具有WS_BORDER，WS_POPUP和WS_SYSMENU风格的弹出窗口。为了使控制菜单可见，必须与WS_POPUPWINDOW一起使用WS_CAPTION风格。
· | WS_SYSMENU | 创建一个在标题条上具有控制菜单的窗口。仅对带标题条的窗口使用。
· | WS_TABSTOP | 指定了一些控件中的一个，用户可以通过TAB键来移过它。TAB键使用户移动到下一个用WS_TABSTOP风格定义的控件。
· | WS_THICKFRAME | 创建一个具有厚边框的窗口，可以通过厚边框来改变窗口大小。
· | WS_VISIBLE | 创建一个最初可见的窗口。
· | WS_VSCROLL | 创建一个具有垂直滚动条的窗口。

请参阅：CWnd::Create, CWnd::CreateEx


 扩展窗口风格

· | WS_EX_ACCEPTFILES | 指明用这个风格创建的窗口能够接受拖放文件。
· | WS_EX_CLIENTEDGE | 指明窗口具有3D外观，这意味着，边框具有下沉的边界。
· | WS_EX_CONTEXTHELP | 在窗口的标题条中包含问号。当用户单击问号时，鼠标光标的形状变为带指针的问号。如果用户随后单击一个子窗口，子窗口将接收到一个WM_HELP消息。
· | WS_EX_CONTROLPARENT | 允许用户用TAB键遍历窗口的子窗口。
· | WS_EX_DLGMODALFRAME | 指明一个具有双重边界的窗口，当你在dwStyle参数中指定了WS_CAPTION风格标志时，它可以具有标题条（可选）。
· | WS_EX_LEFT | 指定窗口具有左对齐属性。这是缺省值。
· | WS_EX_LEFTSCROLLBAR | 将垂直滚动条放在客户区的左边。
· | WS_EX_LTRREADING | 按照从左到右的方式显示窗口文本。这是缺省方式。
· | WS_EX_MDICHILD | 创建一个MDI子窗口。
· | WS_EX_NOPARENTNOTIFY | 指定用这个风格创建的子窗口在被创建或销毁的时候将不向父窗口发送WM_PARENTNOTIFY消息。
· | WS_EX_OVERLAPPEDWINDOW | 组合了WS_EX_CLIENTEDGE和WS_EX_WIND-OWEDGE风格。
· | WS_EX_PALETTEWINDOW | 组合了WS_EX_WINDOWEDGE和WS_EX_TOPMOST风格。
· | WS_EX_RIGHT | 赋予窗口右对齐属性。这与窗口类有关。
· | WS_EX_RIGHTSCROLLBAR | 将垂直滚动条（如果有）放在客户区的右边。这是缺省方式。
· | WS_EX_RTLREADING | 按照从右到左的顺序显示窗口文本。
· | WS_EX_STATICEDGE | 创建一个具有三维边界的窗口，用于不接受用户输入的项。
· | WS_EX_TOOLWINDOW | 创建一个工具窗口，目的是被用作浮动工具条。工具窗口具有标题条，比通常的标题条要短，窗口的标题是用小字体显示的。工具窗口不出现在任务条或用户按下ALT+TAB时出现的窗口中。
· | WS_EX_TOPMOST | 指定用这个风格创建的窗口必须被放在所有非顶层窗口的上面，即使这个窗口已经不处于激活状态，它还是保留在最上面。应用程序可以用SetWindowsPos成员函数来加入或去掉这个属性。
· | WS_EX_TRANSPARENT | 指定了用这个风格创建的窗口是透明的。这意味着，在这个窗口下面的任何窗口都不会被这个窗口挡住。用这个风格创建的窗口只有当它下面的窗口都更新过以后才接收WM_PAINT消息。
· | WS_EX_WINDOWEDGE | 指定了具有凸起边框的窗口。

请参阅：CWnd::CreateEx


 MFC使用的回调函数

在微软基础类型中出现了三个回调函数。下面的主题中描述了传递给CDC::EnumObjects, CDC::GrayString和CDC::SetAbortProc的回调函数。有关回调函数的一般用法参见这些处于函数的说明部分。注意所有的回调函数在返回Windows前都必须捕捉异常，因为异常不能被抛到回调边界之外。
有关异常的更多信息参见“Visual C++ 程序员指南”中的文章“异常”。


 CDC::EnumObjects的回调函数

int CALLBACK EXPORT ObjectFunc( LPSTR lpszLogObject, LPSTR* lpData );

返回值：
这个回调函数返回一个整数。返回的值是用户定义的。如果回调函数返回0，则EnumObjects中止枚举。

参数：
lpszLogObject | 指向一个LOGPEN或LOGBRUSH数据结构的指针，其中包含了有关对象的逻辑属性的信息。
lpData | 指向应用程序提供的传递给EnumObjects函数的数据。

说明：
ObjectFunc名为应用程序提供的函数名预留的位置。实际的名字必须要引出。

请参阅：CDC::EnumObjects


 CDC::GrayString的回调函数

BOOL CALLBACK EXPORT OutputFunc( HDC hDC, LPARAM lpData, int nCount );

返回值：
如果成功，回调函数的返回值必须是TRUE；否则为FALSE。

参数：
hDC | 标识了位图的内存设备环境，其宽度和高度至少为GrayString涉及的nWidth和nHeight。
lpData | 指向要显示的字符串。
nCount | 指定了要输出的字符个数。

说明：
OutputFunc为应用程序提供的回调函数名预留了位置。回调函数（OutputFunc）必须从（0，0）而不是（x，y）开始画出图形。

请参阅：CDC::GrayString


 CDC::SetAbortProc的回调函数

BOOL CALLBACK EXPORT AbortFunc( HDC hPr, int code );

返回值：
如果要继续打印任务，则abort处理函数的返回值必须为非零值。如果要取消，则返回值为0。

参数：
hPr | 标识设备环境。
code | 指明是否发生了错误。如果没有发生错误，则为0。如果打印管理器已经用完了磁盘空间，并且如果应用程序等待就能获得更多磁盘空间，则返回SP_OUTOFDISK。如果code为SP_OUTOFDISK，应用程序不必放弃打印任务。如果code不是SP_OUTOFDISK，它必须通过调用Windows的PeekMessage或GetMessage函数服从打印管理器。

说明：
AbortFunc为应用程序提供的函数名预留了位置。实际的名字必须要引出，如CDC::SetAbortProc的说明部分所描述的。

请参阅：CDC::SetAbortProc


 消息映射

这个部分列出了所有的消息映射宏和所有的CWnd消息映射条目及其对应的成员函数原型。
分类 | 描述
WM_COMMAND消息处理函数 | 处理用户菜单选择或菜单键产生的WM_COMMAND消息
子窗口通知消息处理函数 | 处理子窗口发出的通知消息
WM_消息处理函数 | 处理WM_消息，如WM_PAINT
用户自定义消息处理函数 | 处理用户自定义消息

（本参考中使用的术语和阅读的解释参见“如何使用消息映射交叉参考”）

由于Windows是一个面向消息的操作系统，在Windows环境下很大一部分编程工作涉及消息处理。每当发生一个事件，如击键或鼠标点击，就会向应用程序发送一个消息，然后由它来处理事件。
微软基础类库提供了为基于消息的编程而优化的编程模式。在这种模式下，“消息映射”被用于指明哪个函数将为特定的类处理不同的消息。消息映射包含了一个或多个宏，用以指定哪个函数处理哪个消息。例如，一个包含ON_COMMAND宏的消息映射看起来可能象这样：
BEGIN_MESSAGE_MAP( CMyDoc, CDocument )
//{{AFX_MSG_MAP( CMyDoc )
ON_COMMAND( ID_MYCMD, OnMyCommand )
// ...其它入口，用于处理另外的消息
//}}AFX_MSG_MAP
END_MESSAGE_MAP( )
ON_COMMAND宏被用于处理菜单、按钮和加速键产生的命令消息。可以用宏来映射下列消息：

Windows消息
·控件通知
·用户自定义消息

命令消息
·注册的用户自定义消息
·用户界面更新消息

消息范围
·命令
·更新处理消息
·控件通知

尽管消息映射宏很重要，通常你并不需要直接使用它们。这是因为当你用ClassWizard把消息处理函数与消息关联在一起的时候，它将会在源文件中自动创建消息映射入口。不论何时你希望编辑或加入消息映射条目，你都可以使用ClassWizard。
注意：ClassWizard不支持消息映射范围。你必须自己写入这些消息映射入口。
但是，消息映射是微软基础类库中很重要的一个部分。你必须理解它们的作用，类库也提供了有关文档。


 消息映射宏

为了支持消息映射，MFC提供了下列宏：

消息映射的声明和分界宏
DECLARE_MESSAGE_MAP | 声明将在一个类中使用消息映射，把消息映射到函数（必须用在类声明中）
BEGIN_MESSAGE_MAP | 开始消息映射的定义（必须用在类实现中）
END_MESSAGE_MAP | 结束消息映射的定义（必须用在类实现中）

消息映射宏
ON_COMMAND | 指明将由哪个函数处理指定的命令消息
ON_CONTROL | 指明将由哪个函数处理指定的控件通知消息
ON_MESSAGE | 指明将由哪个函数处理用户自定义的消息
ON_OLECMD | 指明将由哪个函数处理DocObject或其容器发出的菜单命令
ON_REGISTERED_MESSAGE | 指明将由哪个函数处理注册的用户自定义消息
ON_REGISTERED_THREAD_MESSAGE | 指明当你拥有一个CWinThread类时，将由哪个函数处理注册的用户自定义消息
ON_THREAD_MESSAGE | 指明当你拥有一个CWinThread类时，将由哪个函数处理用户自定义消息
ON_UPDATE_COMMAND_UI | 指明将由哪个函数处理指定的用户界面更新命令消息

消息映射范围宏
ON_COMMAND_RANGE | 指明将由哪个函数处理该宏的前两个参数所指定的范围内的命令ID
ON_UPDATE_COMMAND_UI_RANGE | 指明将由哪个更新处理器处理该宏的前两个参数所指定的范围内的命令ID
ON_CONTROL_RANGE | 指明将由哪个函数处理该宏的第二和第三个参数所指定的范围内的控制ID发出的通知。第一个参数是一个控件通知消息，例如BN_CLICKED

有关消息映射、消息映射的声明和分界宏以及消息映射宏的更多的信息参见“消息处理”和“映射主题”。有关消息映射范围的更多信息参见“消息映射范围的处理函数”。有关如何使用ClassWizard的更多信息参见“使用ClassWizard”。这些参考都在“Visual C++ 程序员指南”中。


 如何使用消息映射交叉参考

在标着<memberFxn>的条目中，写入你的CWnd派生类的成员函数。可以给你的函数取任意一个你喜欢的名字。其它函数，例如OnActive，是CWnd类的成员函数。如果调用了它们，它们将消息传递给Windows的DefWindowProc函数。如果要处理Windows通知消息，在你自己的类中重载相应的CWnd成员函数。你可以在函数中调用基类的被重载的函数，使基类和Windows能够回应消息。 在所有的情况下，将函数原型放入CWnd派生类的头文件中，并按照下面的方式编写消息映射入口。 使用了下面的术语：
术语 | 定义
id | 任何用户自定义的菜单项ID（WM_COMMAND消息）或控件（子窗口通知消息）ID
"message"和"wNotifyCode" | WINDOWS.H中定义的Windows消息ID
nMessageVariable | 包含了Windows的RegisterWindowsMessage函数的返回值的变量的名字。它必须被声明为NEAR


 WM_COMMAND消息处理函数

映射入口 | 函数原型
ON_COMMAND( <id>, <memberFxn> ) | afx_msg void memberFxn( );


 子窗口通知消息处理函数

子窗口通知消息有五个部分：
分类 | 描述
普通控件处理函数 | 处理通用控件通知代码
用户按钮处理函数 | 处理用户按钮通知代码
组合框处理函数 | 处理组合框通知代码
编辑控件处理函数 | 处理编辑控件通知代码
列表框处理函数 | 处理列表框通知代码


 普通控件处理函数

映射入口 | 函数原型
ON_CONTROL( <wNotifyCode>,<id>,<memberFxn> ) | afx_msg void memberFxn( );


 用户按钮处理函数

映射入口 | 函数原型
ON_BN_CLICKED( <id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_BN_DISABLE( <id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_BN_DOUBLECLICKED( <id>,<memberFxn> ) | afx_msg void memberFxn( )
ON_BN_HILITE( <id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_BN_PAINT( <id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_BN_UNHILITE( <id>, <memberFxn> ) | afx_msg void memberFxn( )


 组合框处理函数

映射入口 | 函数原型
ON_CBN_CLOSEUP(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_CBN_DBLCLK(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_CBN_DROPDOWN(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_CBN_EDITCHANGE(<id>,<memberFxn> ) | afx_msg void memberFxn( )
ON_CBN_EDITUPDATE(<id>,<memberFxn> ) | afx_msg void memberFxn( )
ON_CBN_ERRSPACE(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_CBN_KILLFOCUS(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_CBN_SELCHANGE(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_CBN_SELENDCANCEL(<id>,<memberFxn> ) | afx_msg void memberFxn( )
ON_CBN_SELENDOK(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_CBN_SETFOCUS(<id>, <memberFxn> ) | afx_msg void memberFxn( )


 编辑控件处理函数

映射入口 | 函数原型
ON_EN_CHANGE(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_EN_ERRSPACE(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_EN_HSCROLL(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_EN_KILLFOCUS(<id>,<memberFxn> ) | afx_msg void memberFxn( )
ON_EN_MAXTEXT(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_EN_SETFOCUS(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_EN_UPDATE(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_EN_VSCROLL(<id>, <memberFxn> ) | afx_msg void memberFxn( )


 列表框控件处理函数

映射入口 | 函数原型
ON_LBN_DBLCLK(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_LBN_ERRSPACE(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_LBN_KILLFOCUS(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_LBN_SELCHANGE(<id>, <memberFxn> ) | afx_msg void memberFxn( )
ON_LBN_SETFOCUS(<id>, <memberFxn> ) | afx_msg void memberFxn( )


 WM_消息处理函数

主题 | 映射入口
A-C | ON_WM_ACTIVATE到ON_WM_CTLCOLOR
D-E | ON_WM_DEADCHAR到ON_WM_ERASEBKGND
F-K | ON_WM_FONTCHANGE到ON_WM_KILLFOCUS
L-M | ON_WM_LBUTTONDBLCLK到ON_WM_MOVING
N-O | ON_WM_NCACTIVATE到ON_WM_NCRBUTTONUP
P-R | ON_WM_PAINT到ON_WM_RENDERFORMAT
S | ON_WM_SETCURSOR到ON_WM_SYSKEYUP
T-Z | ON_WM_TIMECHANGE到ON_WM_WININICHANGE


 WM_消息处理函数：A-C

映射入口 | 函数原型
ON_WM_ACTIVATE( ) | afx_msg void OnActivate( UINT, CWnd*,BOOL )
ON_WM_ACTIVATEAPP( ) | afx_msg void OnActivateApp( BOOL,HANDLE )
ON_WM_ASKCBFORMATNAME( ) | afx_msg void OnAskCbFormatName( UINT,LPSTR )
ON_WM_CANCELMODE( ) | afx_msg void OnCancelMode( )
ON_WM_CAPTURECHANGED( ) | afx_msg void OnCaptureChanged( CWnd* )
ON_WM_CHANGECBCHAIN( ) | afx_msg void OnChangeCbChain( HWND, HWND )
ON_WM_CHAR( ) | afx_msg void OnChar( UINT, UINT,UINT )
ON_WM_CHARTOITEM( ) | afx_msg int OnCharToItem( UINT,CWnd*, UINT )
ON_WM_CHILDACTIVATE( ) | afx_msg void OnChildActivate( )
ON_WM_CLOSE( ) | afx_msg void OnClose( )
ON_WM_COMPACTING( ) | afx_msg void OnCompacting( UINT )
ON_WM_COMPAREITEM( ) | afx_msg int OnCompareItem( LPCOMPAREITEMSTRUCT )
ON_WM_CONTEXTMENU( ) | afx_msg void OnContextMenu( CWnd*, CPoint )
ON_WM_COPYDATA( ) | afx_msg BOOL OnCopyData( CWnd* pWnd, COPYDATASTRUCT* pCopyDataStruct )
ON_WM_CREATE( ) | afx_msg int OnCreate( LPCREATESTRUCT )
ON_WM_CTLCOLOR( ) | afx_msg HBRUSH OnCtlColor( CDC*, CWnd*, UINT )


 WM_消息处理函数：D-E

映射入口 | 函数原型
ON_WM_DEADCHAR( ) | afx_msg void OnDeadChar( UINT, UINT, UINT )
ON_WM_DELETEITEM( ) | afx_msg void OnDeleteItem( LPDELETEITEMSTRUCT )
ON_WM_DESTROY( ) | afx_msg void OnDestroy( )
ON_WM_DESTROYCLIPBOARD( ) | afx_msg void OnDestroyClipboard( )
ON_WM_DEVICECHANGE( ) | afx_msg void OnDeviceChange( UINT, DWORD )
ON_WM_DEVMODECHANGE( ) | afx_msg void OnDevModeChange( LPSTR )
ON_WM_DRAWCLIPBOARD( ) | afx_msg void OnDrawClipboard( )
ON_WM_DRAWITEM( ) | afx_msg void OnDrawItem( LPDRAWITEMSTRUCT )
ON_WM_DROPFILES( ) | afx_msg void OnDropFiles( HDROP )
ON_WM_ENABLE( ) | afx_msg void OnEnable( BOOL )
ON_WM_ENDSESSION( ) | afx_msg void OnEndSession( BOOL )
ON_WM_ENTERIDLE( ) | afx_msg void OnEnterIdle( UINT,CWnd* )
ON_WM_ERASEBKGND( ) | afx_msg BOOL OnEraseBkgnd( CDC * )


 WM_消息处理函数：F-K

映射入口 | 函数原型
ON_WM_FONTCHANGE( ) | afx_msg void OnFontChange( )
ON_WM_GETDLGCODE( ) | afx_msg UINT OnGetDlgCode( )
ON_WM_GETMINMAXINFO( ) | afx_msg void OnGetMinMaxInfo( LPPOINT )
ON_WM_HELPINFO( ) | afx_msg BOOL OnHelpInfo( HELPINFO* )
ON_WM_HSCROLL( ) | afx_msg void OnHScroll( UINT, UINT,CWnd* )
ON_WM_HSCROLLCLIPBOARD() | afx_msg void OnHScrollClipboard( CWnd*, UINT, UINT)
ON_WM_ICONERASEBKGND( ) | afx_msg void OnIconEraseBkgnd( CDC* )
ON_WM_INITMENU( ) | afx_msg void OnInitMenu( CMenu* )
ON_WM_INITMENUPOPUP( ) | afx_msg void OnInitMenuPopup( CMenu*, UINT, BOOL )
ON_WM_KEYDOWN( ) | afx_msg void OnKeyDown( UINT, UINT, UINT )
ON_WM_KEYUP( ) | afx_msg void OnKeyUp( UINT, UINT, UINT )
ON_WM_KILLFOCUS( ) | afx_msg void OnKillFocus( CWnd* )


 WM_消息处理函数：L-M

映射入口 | 函数原型
ON_WM_LBUTTONDBLCLK( ) | afx_msg void OnLButtonDblClk( UINT, Cpoint )
ON_WM_LBUTTONDOWN( ) | afx_msg void OnLButtonDown( UINT, CPoint )
ON_WM_LBUTTONUP( ) | afx_msg void OnLButtonUp( UINT, CPoint )
ON_WM_MBUTTONDBLCLK( ) | afx_msg void OnMButtonDblClk( UINT, CPoint )
ON_WM_MBUTTONDOWN( ) | afx_msg void OnMButtonDown( UINT, CPoint )
ON_WM_MBUTTONUP( ) | afx_msg void OnMButtonUp( UINT, CPoint )
ON_WM_MDIACTIVATE( ) | afx_msg void OnMDIActivate( BOOL, CWnd*, CWnd* )
ON_WM_MEASUREITEM( ) | afx_msg void OnMeasureItem( LPMEASUREITEMSTRUCT )
ON_WM_MENUCHAR( ) | afx_msg LONG OnMenuChar( UINT, UINT, CMenu* )
ON_WM_MENUSELECT( ) | afx_msg void OnMenuSelect( UINT, UINT, HMENU )
ON_WM_MOUSEACTIVATE( ) | afx_msg int OnMouseActivate( CWnd*, UINT, UINT )
ON_WM_MOUSEMOVE( ) | afx_msg void OnMouseMove( UINT, CPoint )
ON_WM_MOUSEWHEEL( ) | afx_msg BOOL OnMouseWheel( UINT, short, CPoint )
ON_WM_MOVE( ) | afx_msg void OnMove( int, int )
ON_WM_MOVING( ) | afx_msg void OnMoving( UINT, LPRECT )


 WM_消息处理函数：N-O

映射入口 | 函数原型
ON_WM_NCACTIVATE( ) | afx_msg BOOL OnNcActivate( BOOL )
ON_WM_NCCALCSIZE( ) | afx_msg void OnNcCalcSize( BOOL, NCCALCSIZE_PARAMS FAR* )
ON_WM_NCCREATE( ) | afx_msg BOOL OnNcCreate( LPCREATESTRUCT )
ON_WM_NCDESTROY( ) | afx_msg void OnNcDestroy( )
ON_WM_NCHITTEST( ) | afx_msg UINT OnNcHitTest( CPoint )
ON_WM_NCLBUTTONDBLCLK( ) | afx_msg void OnNcLButtonDblClk( UINT, CPoint )
ON_WM_NCLBUTTONDOWN( ) | afx_msg void OnNcLButtonDown( UINT, CPoint )
ON_WM_NCLBUTTONUP( ) | afx_msg void OnNcLButtonUp( UINT, CPoint )
ON_WM_NCMBUTTONDBLCLK( ) | afx_msg void OnNcMButtonDblClk( UINT, CPoint )
ON_WM_NCMBUTTONDOWN( ) | afx_msg void OnNcMButtonDown( UINT, CPoint )
ON_WM_NCMBUTTONUP( ) | afx_msg void OnNcMButtonUp( UINT, CPoint )
ON_WM_NCMOUSEMOVE( ) | afx_msg void OnNcMouseMove( UINT, CPoint )
ON_WM_NCPAINT( ) | afx_msg void OnNcPaint( )
ON_WM_NCRBUTTONDBLCLK( ) | afx_msg void OnNcRButtonDblClk( UINT, CPoint )
ON_WM_NCRBUTTONDOWN( ) | afx_msg void OnNcRButtonDown( UINT, Cpoint )
ON_WM_NCRBUTTONUP( ) | afx_msg void OnNcRButtonUp( UINT, CPoint )


 WM_消息：P-R

映射入口 | 函数原型
ON_WM_PAINT( ) | afx_msg void OnPaint( )
ON_WM_PAINTCLIPBOARD( ) | afx_msg void OnPaintClipboard( CWnd*, HANDLE )
ON_WM_PALETTECHANGED( ) | afx_msg void OnPaletteChanged( CWnd* )
ON_WM_PALETTEISCHANGING( ) | afx_msg void OnPaletteIsChanging( CWnd* )
ON_WM_PARENTNOTIFY( ) | afx_msg void OnParentNotify( UINT, LONG )
ON_WM_QUERYDRAGICON( ) | afx_msg HCURSOR OnQueryDragIcon( )
ON_WM_QUERYENDSESSION( ) | afx_msg BOOL OnQueryEndSession( )
ON_WM_QUERYNEWPALETTE( ) | afx_msg BOOL OnQueryNewPalette( )
ON_WM_QUERYOPEN( ) | afx_msg BOOL OnQueryOpen( )
ON_WM_RBUTTONDBLCLK( ) | afx_msg void OnRButtonDblClk( UINT, CPoint )
ON_WM_RBUTTONDOWN( ) | afx_msg void OnRButtonDown( UINT, CPoint )
ON_WM_RBUTTONUP( ) | afx_msg void OnRButtonUp( UINT, CPoint )
ON_WM_RENDERALLFORMATS( ) | afx_msg void OnRenderAllFormats( )
ON_WM_RENDERFORMAT( ) | afx_msg void OnRenderFormat( UINT )


 WM_消息：S

映射入口 | 函数原型
ON_WM_SETCURSOR( ) | afx_msg BOOL OnSetCursor( CWnd*, UINT, UINT )
ON_WM_SETFOCUS( ) | afx_msg void OnSetFocus( CWnd* )
ON_WM_SHOWWINDOW( ) | afx_msg void OnShowWindow( BOOL, UINT )
ON_WM_SIZE( ) | afx_msg void OnSize( UINT, int, int )
ON_WM_SIZECLIPBOARD( ) | afx_msg void OnSizeClipboard( CWnd*, HANDLE )
ON_WM_SIZING( ) | afx_msg void OnSizing( UINT, LPRECT )
ON_WM_SPOOLERSTATUS( ) | afx_msg void OnSpoolerStatus( UINT, UINT )
ON_WM_STYLECHANGED( ) | afx_msg void OnStyleChanged( int, LPSTYLESTRUCT )
ON_WM_STYLECHANGING( ) | afx_msg void OnStyleChanging( int,LPSTYLESTRUCT )
ON_WM_SYSCHAR( ) | afx_msg void OnSysChar( UINT, UINT, UINT )
ON_WM_SYSCOLORCHANGE( ) | afx_msg void OnSysColorChange( )
ON_WM_SYSCOMMAND( ) | afx_msg void OnSysCommand( UINT, LONG )
ON_WM_SYSDEADCHAR( ) | afx_msg void OnSysDeadChar( UINT, UINT, UINT )
ON_WM_SYSKEYDOWN( ) | afx_msg void OnSysKeyDown( UINT, UINT, UINT )
ON_WM_SYSKEYUP( ) | afx_msg void OnSysKeyUp( UINT,UINT, UINT )


 WM_消息：T-Z

映射入口 | 函数原型
ON_WM_TCARD( ) | afx_msg void OnTCard( UINT, DWORD )
ON_WM_TIMECHANGE( ) | afx_msg void OnTimeChange( )
ON_WM_TIMER( ) | afx_msg void OnTimer( UINT )
ON_WM_VKEYTOITEM( ) | afx_msg int OnVKeyToItem( UINT, CWnd*, UINT )
ON_WM_VSCROLL( ) | afx_msg void OnVScroll( UINT, UINT, CWnd* )
ON_WM_VSCROLLCLIPBOARD( ) | afx_msg void OnVScrollClipboard( CWnd*, UINT, UINT )
ON_WM_WINDOWPOSCHANGED( ) | afx_msg void OnWindowPosChanged( WINDOWPOS* lpwndpos )
ON_WM_WINDOWPOSCHANGING( ) | afx_msg void OnWindowPosChanging( WINDOWPOS* lpwndpos )
ON_WM_WININICHANGE( ) | afx_msg void OnWinIniChange( LPSTR )


 用户定义处理函数

映射入口 | 函数原型
ON_MESSAGE( <message>, <memberFxn> ) | afx_msg LRESULT memberFxn( WPARAM, LPARAM );
ON_REGISTERED_MESSAGE( <nMessageVariable>, <memberFxn> ) | afx_msg LRESULT memberFxn( WPARAM, LPARAM );
ON_THREAD_MESSAGE( <message>, <memberFxn> ) | afx_msg void memberFxn( UINT, LONG );
ON_REGISTERED_THREAD_MESSAGE( <nMessageVariable>, <memberFxn> ) | afx_msg void memberFxn( UINT, LONG );