CView

提供用户定义视图类的基本功能。

语法

class AFX_NOVTABLE CView : public CWnd

成员

受保护构造函数

名称 描述
CView::CView 构造 CView 对象。

公共方法

名称 描述
CView::DoPreparePrinting 显示“打印”对话框并创建打印机设备上下文;当重写 OnPreparePrinting 成员函数时调用。
CView::GetDocument 返回与视图关联的文档。
CView::IsSelected 测试是否选择了文档项。 OLE 支持所必需的。
CView::OnDragEnter 当首次将项拖入视图的拖放区域内时调用。
CView::OnDragLeave 当拖动的项离开视图的拖放区域时调用。
CView::OnDragOver 当将项拖动到视图的拖放区域上时调用。
CView::OnDragScroll 调用以确定是否将光标拖入窗口的滚动区域内。
CView::OnDrop 当项已被拖入视图的拖放区域(默认处理程序)时调用。
CView::OnDropEx 当项已被拖入视图的拖放区域(主处理程序)时调用。
CView::OnInitialUpdate 在首次将视图附加到文档之后调用。
CView::OnPrepareDC 在为屏幕显示调用 OnDraw 成员函数之前或在为打印或打印预览调用 OnPrint 成员函数之前调用。
CView::OnScroll 当将 OLE 项拖动到视图边框之外时调用。
CView::OnScrollBy 当滚动包含就地激活状态的 OLE 项的视图时调用。

受保护方法

名称 描述
CView::OnActivateFrame 当包含该视图的框架窗口被激活或停用时调用。
CView::OnActivateView 当激活视图时调用。
CView::OnBeginPrinting 当打印作业开始时调用;重写以分配图形设备接口 (GDI) 资源。
CView::OnDraw 为屏幕显示、打印或打印预览调用以呈现文档的图像。 需要实现。
CView::OnEndPrinting 当打印作业结束时调用;重写以解除分配 GDI 资源。
CView::OnEndPrintPreview 当退出预览模式时调用。
CView::OnPreparePrinting 在打印或预览文档之前调用;重写以初始化“打印”对话框。
CView::OnPrint 调用以打印或预览文档的某个页面。
CView::OnUpdate 调用以通知已修改其文档的视图。

备注

视图附加到文档并充当文档与用户之间的中介:视图在屏幕或打印机上呈现文档的图像,并将用户输入解释为对文档的操作。

视图是框架窗口的子级。 多个视图可以共享框架窗口,就像拆分窗口的情况一样。 视图类、框架窗口类和文档类之间的关系由 CDocTemplate 对象建立。 当用户打开新窗口或拆分现有窗口时,框架将构造一个新视图并将其附加到文档。

视图只能附加到一个文档,但一个文档可以同时附加多个视图,例如,如果文档显示在拆分窗口或多文档界面 (MDI) 应用程序的多个子窗口中。 你的应用程序可以支持给定文档类型的不同类型的视图;例如,字处理程序可能同时提供文档的完整文本视图和仅显示节标题的大纲视图。 如果使用拆分器窗口,可以将这些不同类型的视图放置在各个单独的框架窗口或一个框架窗口的各单独窗格中。

视图可能负责处理多种不同类型的输入,例如键盘输入、鼠标输入或通过拖放方式输入,以及菜单、工具栏或滚动条中的命令。 视图接收由其框架窗口转发的命令。 如果视图未处理给定命令,则会将命令转发到其关联的文档。 与所有命令目标一样,视图通过消息映射处理消息。

视图负责显示和修改文档的数据,但不负责存储它。 文档为视图提供有关其数据的必要详细信息。 可以让视图直接访问文档的数据成员,也可以为要调用的视图类提供文档类中的成员函数。

文档的数据发生更改时,负责更改的视图通常调用文档的 CDocument::UpdateAllViews 函数,即通过为每个视图调用 OnUpdate 成员函数来通知所有其他视图。 OnUpdate 的默认实现使视图的整个工作区失效。 可以重写它以仅使映射到文档修改部分的工作区的区域失效。

若要使用 CView,请从中派生类并实现 OnDraw 成员函数以执行屏幕显示。 还可以使用 OnDraw 执行打印和打印预览。 框架处理打印循环以打印和预览文档。

视图使用 CWnd::OnHScrollCWnd::OnVScroll 成员函数处理滚动条消息。 可以在这些函数中实现滚动条消息处理,也可以使用 CView 派生类 CScrollView 处理滚动。

CScrollView 外,Microsoft 基础类库还提供派生自 CView 的九个其他类:

  • CCtrlView,允许使用文档的视图 - 包含树、列表和丰富的编辑控件的视图体系结构。

  • CDaoRecordView,在对话框控件中显示数据库记录的视图。

  • CEditView,提供简单的多行文本编辑器的视图。 可以将 CEditView 对象用作对话框中的控件以及文档上的视图。

  • CFormView,包含对话框控件且基于对话框模板资源的可滚动视图。

  • CListView,允许使用文档的视图 - 包含列表控件的视图体系结构。

  • CRecordView,在对话框控件中显示数据库记录的视图。

  • CRichEditView,允许使用文档的视图 - 包含丰富的编辑控件的视图体系结构。

  • CScrollView,自动提供滚动支持的视图。

  • CTreeView,允许使用文档的视图 - 包含树控件的视图体系结构。

CView 类还有一个名为 CPreviewView 的派生实现类,由框架用来执行打印预览。 此类支持打印预览窗口特有的功能,例如工具栏、单页或双页预览以及缩放,即放大预览的图像。 无需调用或重写任何 CPreviewView 成员函数,除非你想要实现自己的打印预览界面(例如,如果要支持在打印预览模式下编辑)。 有关使用 CView 的详细信息,请参阅文档/视图体系结构打印。 此外,有关自定义打印预览的更多详细信息,请参阅技术说明 30

继承层次结构

CObject

CCmdTarget

CWnd

CView

要求

标头afxwin.h

CView::CView

构造 CView 对象。

CView();

注解

创建新的框架窗口或拆分窗口时,框架调用构造函数。 重写 OnInitialUpdate 成员函数以在附加文档后初始化视图。

CView::DoPreparePrinting

OnPreparePrinting 的重写中调用此函数以调用“打印”对话框并创建打印机设备上下文。

BOOL DoPreparePrinting(CPrintInfo* pInfo);

参数

pInfo
指向描述当前打印作业的 CPrintInfo 结构。

返回值

如果打印或打印预览可以开始,则为非零;如果操作已取消,则为 0。

备注

此函数的行为取决于是否为打印或打印预览调用它(由 pInfo 参数的 m_bPreview 成员指定)。 如果正在打印文件,此函数将使用 pInfo 所指向的 CPrintInfo 结构中的值调用“打印”对话框;在用户关闭对话框后,该函数会基于用户在对话框中指定的设置创建打印机设备上下文,并通过 pInfo 参数返回此设备上下文。 此设备上下文用于打印文档。

如果正在预览文件,此函数将使用当前打印机设置创建打印机设备上下文;此设备上下文用于在预览期间模拟打印机。

CView::GetDocument

调用此函数以获取指向视图文档的指针。

CDocument* GetDocument() const;

返回值

指向与视图关联的 CDocument 对象的指针。 如果视图未附加到文档,则为 NULL

备注

这样,便可以调用文档的成员函数。

CView::IsSelected

由框架调用以检查是否选择了指定的文档项。

virtual BOOL IsSelected(const CObject* pDocItem) const;

参数

pDocItem
指向要测试的文档项。

返回值

如果选择了指定的文档项,则为非零;否则为 0。

备注

此函数的默认实现返回 FALSE。 如果要使用 CDocItem 对象实现所选内容,则重写此函数。 如果视图包含 OLE 项,则必须重写此函数。

CView::OnActivateFrame

当包含该视图的框架窗口被激活或停用时,由框架调用。

virtual void OnActivateFrame(
    UINT nState,
    CFrameWnd* pFrameWnd);

参数

nState
指定是激活还是停用框架窗口。 可以为下列值之一:

  • WA_INACTIVE 正在停用框架窗口。

  • WA_ACTIVE 正在通过除鼠标单击以外的某种方法激活框架窗口(例如,通过使用键盘界面选择窗口)。

  • WA_CLICKACTIVE 正在通过鼠标单击激活框架窗口

pFrameWnd
指向要激活的框架窗口的指针。

注解

如果要在激活或停用与视图关联的框架窗口时执行特殊处理,请重写此成员函数。 例如,CFormView 保存并还原具有焦点的控件时执行此替代。

CView::OnActivateView

当激活或停用视图时,由框架调用。

virtual void OnActivateView(
    BOOL bActivate,
    CView* pActivateView,
    CView* pDeactiveView);

参数

bActivate
指示是激活还是停用视图。

pActivateView
指向正在激活的视图对象。

pDeactiveView
指向正在停用的视图对象。

备注

此函数的默认实现为正在激活的视图设置焦点。 如果要在激活或停用视图时执行特殊处理,则重写此函数。 例如,如果要提供可区分活动视图和非活动视图的特殊视觉提示,则需要检查 bActivate 参数并相应地更新视图的外观。

如果已激活应用程序的主框架窗口但活动视图未发生更改,则 pActivateViewpDeactiveView 参数指向同一视图,例如,如果焦点从另一个应用程序转移到此应用程序,而不是从一个视图转移到应用程序内的另一个视图,或者在 MDI 子窗口之间切换时。 这样,视图就可以根据需要重新实现其调色板。

当使用与 CFrameWnd::GetActiveView 返回的视图不同的视图调用 CFrameWnd::SetActiveView 时,这些参数会有所不同。 这通常与拆分器窗口一起发生。

CView::OnBeginPrinting

在调用 OnPreparePrinting 之后,由框架在打印或打印预览作业开始时调用。

virtual void OnBeginPrinting(
    CDC* pDC,
    CPrintInfo* pInfo);

参数

pDC
指向打印机设备上下文。

pInfo
指向描述当前打印作业的 CPrintInfo 结构。

备注

此函数的默认实现不执行任何操作。 重写此函数以分配专用于打印的任何 GDI 资源,例如笔或字体。 在设备上下文中从 OnPrint 成员函数内为每个使用 GDI 对象的页面选择这些对象。 如果要使用相同的视图对象执行屏幕显示和打印,请为每个显示所需的 GDI 资源使用单独的变量;这样做可以在打印期间更新屏幕。

你也可以使用此函数根据打印机设备上下文的属性执行初始化。 例如,打印文档所需的页面数可能取决于用户在“打印”对话框中指定的设置(例如页面长度)。 在这种情况下,你不能在 OnPreparePrinting 成员函数中指定文档长度(这是一般情况下的做法);你必须等待片刻,直到根据对话框设置创建了打印机设备上下文为止。 OnBeginPrinting 是第一个允许你访问 CDC 对象(表示打印机设备上下文)的可重写函数,因此,你可以从此函数设置文档长度。 请注意,如果此时还不指定文档长度,打印预览期间将不会显示滚动条。

CView::OnDragEnter

当鼠标首次进入放置目标窗口的非滚动区域时,由框架调用。

virtual DROPEFFECT OnDragEnter(
    COleDataObject* pDataObject,
    DWORD dwKeyState,
    CPoint point);

参数

pDataObject
指向被拖入视图的放置区域中的 COleDataObject

dwKeyState
包含修改键的状态。 这是任意数量的以下对象的组合:MK_CONTROLMK_SHIFTMK_ALTMK_LBUTTONMK_MBUTTONMK_RBUTTON

point
相对于视图工作区的当前鼠标位置。

返回值

DROPEFFECT 枚举类型中的一个值,该值指示当用户将对象置于此位置时会发生的放置类型。 放置类型通常取决于 dwKeyState 指示的当前键状态。 键状态到 DROPEFFECT 值的标准映射为:

  • DROPEFFECT_NONE 无法在此窗口中放置数据对象。

  • MK_CONTROL|MK_SHIFTDROPEFFECT_LINK 在对象与其服务器之间创建链接。

  • MK_CONTROLDROPEFFECT_COPY 创建放置的对象的副本。

  • MK_ALTDROPEFFECT_MOVE 创建放置的对象的副本并删除原始对象。 当视图可以接受此数据对象时,这通常是默认放置效果。

有关详细信息,请参阅 MFC 高级概念示例 OCLIENT

备注

默认实现不执行任何操作并返回 DROPEFFECT_NONE

重写此函数以准备对 OnDragOver 成员函数的未来调用。 此时应检索数据对象所需的任何数据,以便稍后在 OnDragOver 成员函数中使用。 此时还应更新视图,为用户提供视觉反馈。 有关详细信息,请参阅 OLE 拖放:实现放置目标

CView::OnDragLeave

当鼠标移出该窗口的有效放置区域时,在拖动操作期间由框架调用。

virtual void OnDragLeave();

备注

如果当前视图需要清理在 OnDragEnterOnDragOver 调用期间执行的任何操作(例如在拖放对象时删除任何视觉用户反馈),则重写此函数。

CView::OnDragOver

当在放置目标窗口上移动鼠标时,在拖动操作期间由框架调用。

virtual DROPEFFECT OnDragOver(
    COleDataObject* pDataObject,
    DWORD dwKeyState,
    CPoint point);

参数

pDataObject
指向被拖动到放置目标上的 COleDataObject

dwKeyState
包含修改键的状态。 这是任意数量的以下对象的组合:MK_CONTROLMK_SHIFTMK_ALTMK_LBUTTONMK_MBUTTONMK_RBUTTON

point
相对于视图工作区的当前鼠标位置。

返回值

DROPEFFECT 枚举类型中的一个值,该值指示当用户将对象置于此位置时会发生的放置类型。 放置类型通常取决于 dwKeyState 指示的当前键状态。 键状态到 DROPEFFECT 值的标准映射为:

  • DROPEFFECT_NONE 无法在此窗口中放置数据对象。

  • MK_CONTROL|MK_SHIFTDROPEFFECT_LINK 在对象与其服务器之间创建链接。

  • MK_CONTROLDROPEFFECT_COPY 创建放置的对象的副本。

  • MK_ALTDROPEFFECT_MOVE 创建放置的对象的副本并删除原始对象。 当视图可以接受此数据对象时,这通常是默认放置效果。

有关详细信息,请参阅 MFC 高级概念示例 OCLIENT

备注

默认实现不执行任何操作并返回 DROPEFFECT_NONE

重写此函数以在拖动操作期间为用户提供视觉反馈。 由于持续调用此函数,因此应尽可能优化其中包含的任何代码。 有关详细信息,请参阅 OLE 拖放:实现放置目标

CView::OnDragScroll

在调用 OnDragEnterOnDragOver 以确定点是否位于滚动区域中之前,由框架调用。

virtual DROPEFFECT OnDragScroll(
    DWORD dwKeyState,
    CPoint point);

参数

dwKeyState
包含修改键的状态。 这是任意数量的以下对象的组合:MK_CONTROLMK_SHIFTMK_ALTMK_LBUTTONMK_MBUTTONMK_RBUTTON

point
包含光标相对于屏幕的位置(以像素为单位)。

返回值

DROPEFFECT 枚举类型中的一个值,该值指示当用户将对象置于此位置时会发生的放置类型。 放置类型通常取决于 dwKeyState 指示的当前键状态。 键状态到 DROPEFFECT 值的标准映射为:

  • DROPEFFECT_NONE 无法在此窗口中放置数据对象。

  • MK_CONTROL|MK_SHIFTDROPEFFECT_LINK 在对象与其服务器之间创建链接。

  • MK_CONTROLDROPEFFECT_COPY 创建放置的对象的副本。

  • MK_ALTDROPEFFECT_MOVE 创建放置的对象的副本并删除原始对象。

  • DROPEFFECT_SCROLL 指示拖动滚动操作即将或正在目标视图中执行。

有关详细信息,请参阅 MFC 高级概念示例 OCLIENT

备注

如果要为此事件提供特殊行为,则重写此函数。 当将光标拖入每个窗口边框中的默认滚动区域内时,默认实现会自动滚动窗口。 有关详细信息,请参阅 OLE 拖放:实现放置目标

CView::OnDraw

由框架调用以呈现文档的图像。

virtual void OnDraw(CDC* pDC) = 0;

参数

pDC
指向用于呈现文档图像的设备上下文。

备注

框架调用此函数以执行屏幕显示、打印和打印预览,并在每种情况下传递不同的设备上下文。 没有默认实现。

必须重写此函数才能显示文档的视图。 可以使用 pDC 参数所指向的 CDC 对象发出图形设备接口 (GDI) 调用。 可以在绘图前在设备上下文中选择 GDI 资源(例如笔或字体),之后将取消选择它们。 通常,绘图代码可以与设备无关;也就是说,不需要有关哪种类型的设备显示图像的信息。

若要优化绘图,请调用设备上下文的 RectVisible 成员函数,以确定是否绘制给定的矩形。 如果需要区分普通屏幕显示和打印,请调用设备上下文的 IsPrinting 成员函数。

CView::OnDrop

当用户将数据对象释放在有效的放置目标上时,由框架调用。

virtual BOOL OnDrop(
    COleDataObject* pDataObject,
    DROPEFFECT dropEffect,
    CPoint point);

参数

pDataObject
指向置于放置目标中的 COleDataObject

dropEffect
用户请求的放置效果。

  • DROPEFFECT_COPY 创建要放置的数据对象的副本。

  • DROPEFFECT_MOVE 将数据对象移动到当前鼠标位置。

  • DROPEFFECT_LINK 在数据对象与其服务器之间创建链接。

point
相对于视图工作区的当前鼠标位置。

返回值

如果放置成功,则为非零值;否则为 0。

备注

默认实现不执行任何操作并返回 FALSE

重写此函数以实现 OLE 置于视图工作区的效果。 可以通过剪贴板数据格式的 pDataObject 以及在指定点放置的数据检查数据对象。

注意

如果在此视图类中重写 OnDropEx,则框架不会调用此函数。

CView::OnDropEx

当用户将数据对象释放在有效的放置目标上时,由框架调用。

virtual DROPEFFECT OnDropEx(
    COleDataObject* pDataObject,
    DROPEFFECT dropDefault,
    DROPEFFECT dropList,
    CPoint point);

参数

pDataObject
指向置于放置目标中的 COleDataObject

dropDefault
用户根据当前键状态为默认放置操作选择的效果。 该项可能为 DROPEFFECT_NONE。 “备注”部分中讨论了放置效果。

dropList
放置源支持的放置效果列表。 可以使用按位 OR (|) 运算符对放置效果值进行组合。 “备注”部分中讨论了放置效果。

point
相对于视图工作区的当前鼠标位置。

返回值

point 指定的位置处尝试放置而导致的放置效果。 这必须是 dropEffectList 指示的值之一。 “备注”部分中讨论了放置效果。

注解

默认实现不执行任何操作并返回虚拟值 (-1),以指示框架应调用 OnDrop 处理程序。

重写此函数以实现鼠标右键拖放的效果。 释放鼠标右键时,鼠标右键拖放通常显示选项的菜单。

重写 OnDropEx 应查询鼠标右键。 可以从 OnDragEnter 处理程序调用 GetKeyState 或存储鼠标右键状态。

  • 如果鼠标右键关闭,则重写应显示一个弹出菜单,该菜单提供放置源支持的拖放效果。

    • 检查 dropList 以确定放置源支持的放置效果。 仅在弹出菜单上启用这些操作。

    • 使用 SetMenuDefaultItem 基于 dropDefault 设置默认操作。

    • 最后,执行弹出窗口菜单中的用户选择指示的操作。

  • 如果鼠标右键未关闭,则重写应将其作为标准放置请求进行处理。 使用 dropDefault 中指定的放置效果。 或者,重写可以返回虚拟值 (-1),以指示 OnDrop 将处理此放置操作。

使用 pDataObject 检查剪贴板数据格式的 COleDataObject 以及在指定点放置的数据。

放置效果描述与放置操作关联的操作。 请参见放置效果的以下列表:

  • DROPEFFECT_NONE 不允许放置。

  • DROPEFFECT_COPY 将执行复制操作。

  • DROPEFFECT_MOVE 将执行移动操作。

  • DROPEFFECT_LINK 将建立从已放置的数据到原始数据的链接。

  • DROPEFFECT_SCROLL 指示拖动滚动操作即将或正在目标中执行。

有关设置默认菜单命令的详细信息,请参阅 Windows SDK 中的 SetMenuDefaultItem 和此卷中的 CMenu::GetSafeHmenu

CView::OnEndPrinting

在打印或预览了文档后,由框架调用。

virtual void OnEndPrinting(
    CDC* pDC,
    CPrintInfo* pInfo);

参数

pDC
指向打印机设备上下文。

pInfo
指向描述当前打印作业的 CPrintInfo 结构。

备注

此函数的默认实现不执行任何操作。 重写此函数以释放在 OnBeginPrinting 成员函数中分配的任何 GDI 资源。

CView::OnEndPrintPreview

当用户退出打印预览模式时,由框架调用。

virtual void OnEndPrintPreview(
    CDC* pDC,
    CPrintInfo* pInfo,
    POINT point,
    CPreviewView* pView);

参数

pDC
指向打印机设备上下文。

pInfo
指向描述当前打印作业的 CPrintInfo 结构。

point
指定上次在预览模式下显示的页面上的点。

pView
指向用于预览的视图对象。

备注

此函数的默认实现调用 OnEndPrinting 成员函数,并将主框架窗口还原到打印预览开始前的状态。 重写此函数以在终止预览模式时执行特殊处理。 例如,如果要在从预览模式切换到普通显示模式时保留用户在文档中的位置,则可以滚动到 point 参数以及 pInfo 参数所指向的 CPrintInfo 结构的 m_nCurPage 成员所描述的位置。

始终从重写中调用 OnEndPrintPreview 的基类版本,通常位于函数末尾。

CView::OnInitialUpdate

在视图首次附加到文档之后但在最初显示视图之前,由框架调用。

virtual void OnInitialUpdate();

备注

此函数的默认实现调用不带提示信息的 OnUpdate 成员函数(即,对于 lHint 参数,使用默认值 0,对于 pHint 参数,使用 NULL)。 重写此函数以执行任何需要文档信息的一次性初始化。 例如,如果应用程序具有固定大小的文档,则可以使用此函数根据文档大小初始化视图的滚动限制。 如果应用程序支持可变大小的文档,则使用 OnUpdate 在每次文档更改时更新滚动限制。

CView::OnPrepareDC

在为屏幕显示调用 OnDraw 成员函数之前且在打印或打印预览期间为每个页面调用 OnPrint 成员函数之前,由框架调用。

virtual void OnPrepareDC(
    CDC* pDC,
    CPrintInfo* pInfo = NULL);

参数

pDC
指向用于呈现文档图像的设备上下文。

pInfo
如果为打印或打印预览调用 OnPrepareDC,则指向描述当前打印作业的 CPrintInfo 结构;m_nCurPage 成员指定要打印的页面。 如果为屏幕显示调用 OnPrepareDC,则此参数是 NULL

注解

如果为屏幕显示调用此函数,则此函数的默认实现将不执行任何操作。 但是,此函数在派生类(例如 CScrollView)中重写,以调整设备上下文的属性;因此,应始终在重写开始时调用基类实现。

如果为打印调用此函数,则默认实现将检查存储在 pInfo 参数中的页面信息。 如果未指定文档的长度,则 OnPrepareDC 将假定文档的长度是一页,并在打印一页后停止打印循环。 该函数通过将结构的 m_bContinuePrinting 成员设置为 FALSE 来停止打印循环。

出于以下任一原因而重写 OnPrepareDC

  • 调整指定页面所需的设备上下文的属性。 例如,如果需要设置映射模式或设备上下文的其他特征,请在此函数中执行此操作。

  • 执行打印时分页。 通常,使用 OnPreparePrinting 成员函数在打印开始时指定文档的长度。 但是,如果事先不知道文档的长度(例如,从数据库打印不确定的记录数时),请重写 OnPrepareDC 以在打印文档时测试文档的末尾。 没有更多要打印的文档时,请将 CPrintInfo 结构的 m_bContinuePrinting 成员设置为 FALSE

  • 逐页将转义代码发送到打印机。 若要从 OnPrepareDC 发送转义代码,请调用 pDC 参数的 Escape 成员函数。

在重写开始时调用 OnPrepareDC 的基类版本。

示例

void CMyView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo)
{
   CView::OnPrepareDC(pDC, pInfo);

   // If we are printing, set the mapmode and the window
   // extent properly, then set viewport extent. Use the
   // SetViewportOrg member function in the CDC class to
   // move the viewport origin to the center of the view.

   if (pDC->IsPrinting()) // Is the DC a printer DC.
   {
      CRect rect;
      GetClientRect(&rect);

      pDC->SetMapMode(MM_ISOTROPIC);
      CSize ptOldWinExt = pDC->SetWindowExt(1000, 1000);
      ASSERT(ptOldWinExt.cx != 0 && ptOldWinExt.cy != 0);
      CSize ptOldViewportExt = pDC->SetViewportExt(rect.Width(), -rect.Height());
      ASSERT(ptOldViewportExt.cx != 0 && ptOldViewportExt.cy != 0);
      CPoint ptOldOrigin = pDC->SetViewportOrg(rect.Width() / 2, rect.Height() / 2);
   }
}

CView::OnPreparePrinting

在打印或预览文档之前由框架调用。

virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);

参数

pInfo
指向描述当前打印作业的 CPrintInfo 结构。

返回值

如果要开始打印,则为非零;如果打印作业已取消,则为 0。

备注

默认实现不执行任何操作。

必须重写此函数才能启用打印和打印预览。 调用 DoPreparePrinting 成员函数,向其传递 pInfo 参数,然后返回其返回值;DoPreparePrinting 显示“打印”对话框并创建打印机设备上下文。 如果要使用默认值以外的值初始化“打印”对话框,请将值分配给 pInfo 的成员。 例如,如果知道文档的长度,请在调用 DoPreparePrinting 之前将该值传递给 pInfoSetMaxPage 成员函数。 此值显示在“打印”对话框的“范围”部分的“到:”框中。

DoPreparePrinting 不显示预览作业的“打印”对话框。 如果要绕过打印作业的“打印”对话框,请检查 pInfom_bPreview 成员是否为 FALSE,然后在将其传递给 DoPreparePrinting 之前将其设置为 TRUE;之后将其重置为 FALSE

如果需要执行要求访问表示打印机设备上下文的 CDC 对象的初始化(例如,如果需要在指定文档长度之前知道页面大小),请重写 OnBeginPrinting 成员函数。

如果要设置 pInfo 参数的 m_nNumPreviewPagesm_strPageDesc 成员的值 ,请在调用 DoPreparePrinting 后执行此操作。 DoPreparePrinting 成员函数将 m_nNumPreviewPages 设置为应用程序的 .INI 文件中找到的值,并将 m_strPageDesc 设置为其默认值。

示例

重写 OnPreparePrinting 并调用重写中的 DoPreparePrinting,以便框架将显示“打印”对话框并为你创建打印机 DC。

BOOL CMyEditView::OnPreparePrinting(CPrintInfo* pInfo)
{
   return CEditView::DoPreparePrinting(pInfo);
}

如果知道文档包含的页数,请在调用 DoPreparePrinting 前在 OnPreparePrinting 中设置最大页数。 框架将在“打印”对话框的“到”框中显示最大页码。

BOOL CExampleView::OnPreparePrinting(CPrintInfo* pInfo)
{
   //The document has 2 pages.
   pInfo->SetMaxPage(2);
   return CView::DoPreparePrinting(pInfo);
}

CView::OnPrint

由框架调用以打印或预览文档的页面。

virtual void OnPrint(
    CDC* pDC,
    CPrintInfo* pInfo);

参数

pDC
指向打印机设备上下文。

pInfo
指向描述当前打印作业的 CPrintInfo 结构。

备注

对于要打印的每个页面,框架在调用 OnPrepareDC 成员函数后立即调用此函数。 要打印的页面由 pInfo 所指定的 CPrintInfo 结构的 m_nCurPage 成员指定。 默认实现调用 OnDraw 成员函数,并向其传递打印机设备上下文。

出于以下任一原因重写此函数:

  • 允许打印多页文档。 仅呈现与当前打印的页面对应的文档部分。 如果使用 OnDraw 执行呈现,则可以调整视区原点,以便仅打印文档的相应部分。

  • 使打印的图像看起来不同于屏幕图像(即,如果应用程序不是 WYSIWYG)。 使用设备上下文通过屏幕上未显示的属性呈现图像,而不是将打印机设备上下文传递给 OnDraw

    如果需要打印不用于屏幕显示的 GDI 资源,请在绘图前在设备上下文中选择这些资源,之后取消选择它们。 应在 OnBeginPrinting 中分配并在 OnEndPrinting 中释放这些 GDI 资源。

  • 实现页眉或页脚。 仍可使用 OnDraw 通过限制可打印的区域来执行呈现。

请注意,pInfo 参数的 m_rectDraw 成员描述逻辑单元中页面的可打印区域。

不要在 OnPrint 的重写中调用 OnPrepareDC;框架在调用 OnPrint 之前自动调用 OnPrepareDC

示例

下面是重写 OnPrint 函数的框架:

void CMyView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
   UNREFERENCED_PARAMETER(pInfo);

   // Print headers and/or footers, if desired.
   // Find portion of document corresponding to pInfo->m_nCurPage.
   OnDraw(pDC);
}

若要查看其他示例,请参见CRichEditView::PrintInsideRect

CView::OnScroll

由框架调用以确定是否可以滚动。

virtual BOOL OnScroll(
    UINT nScrollCode,
    UINT nPos,
    BOOL bDoScroll = TRUE);

参数

nScrollCode
一个滚动条代码,指示用户的滚动请求。 此参数由两个部分组成:低位字节,用于确定水平滚动的类型,以及高位字节,用于确定垂直滚动的类型:

  • SB_BOTTOM 滚动至底部。

  • SB_LINEDOWN 向下滚动一行。

  • SB_LINEUP 向上滚动一行。

  • SB_PAGEDOWN 向下滚动一页。

  • SB_PAGEUP 向上滚动一页。

  • SB_THUMBTRACK 将滚动框拖动到指定位置。 当前位置在 nPos 中指定。

  • SB_TOP 滚动至顶部。

nPos
如果滚动条代码为 SB_THUMBTRACK,则包含当前滚动框位置;否则不使用。 根据初始滚动范围,nPos 可能为负,并且应在必要时强制转换为 int

bDoScroll
确定是否应实际执行指定的滚动操作。 如果为 TRUE,则应进行滚动;如果为 FALSE,则不应进行滚动。

返回值

如果 bDoScrollTRUE 且实际上已滚动视图,则返回非零;否则返回 0。 如果 bDoScrollFALSE,则返回在 bDoScrollTRUE 时返回的值,即使实际上未执行滚动也是如此。

备注

在一种情况下,当视图接收滚动条消息时,在将 bDoScroll 设置为 TRUE 的情况下由框架调用此函数。 在这种情况下,实际上应滚动视图。 在另一种情况下,当在实际进行滚动之前最初将 OLE 项拖入放置目标的自动滚动区域内时,在将 bDoScroll 设置为 FALSE 的情况下调用此函数。 在这种情况下,实际上不应滚动视图。

CView::OnScrollBy

当用户在文档的当前视图之外查看区域时,由框架调用,方法是将 OLE 项拖动到视图的当前边框上,或者通过操作垂直或水平滚动条。

virtual BOOL OnScrollBy(
    CSize sizeScroll,
    BOOL bDoScroll = TRUE);

参数

sizeScroll
水平和垂直滚动的像素数。

bDoScroll
确定是否滚动视图。 如果为 TRUE,则进行滚动;如果为 FALSE,则不进行滚动。

返回值

如果能够滚动视图,则为非零;否则为 0。

注解

在派生类中,此方法检查视图是否可按用户请求的方向滚动,然后在必要时更新新区域。 此函数由 CWnd::OnHScrollCWnd::OnVScroll 自动调用以执行实际的滚动请求。

此方法的默认实现不会更改视图,但如果未调用,视图将不会在 CScrollView 派生额类中滚动。

如果文档宽度或高度超过 32767 像素,则超过 32767 的滚动将失败,因为使用无效的 sizeScroll 参数调用了 OnScrollBy

CView::OnUpdate

在修改视图的文档之后由框架调用;此函数由 CDocument::UpdateAllViews 调用,并允许视图更新其显示以反映这些修改。

virtual void OnUpdate(
    CView* pSender,
    LPARAM lHint,
    CObject* pHint);

参数

pSender
指向修改文档的视图,如果要更新所有视图,则为 NULL

lHint
包含有关修改的信息。

pHint
指向存储有关修改的信息的对象。

注解

它还由 OnInitialUpdate 的默认实现调用。 默认实现使整个工作区失效,在收到下一条 WM_PAINT 消息时将其标记为绘制。 如果要仅更新映射到文档修改部分的区域,请重写此函数。 为此,必须使用提示参数传递有关修改的信息。

若要使用 lHint,请定义特殊提示值,通常是位掩码或枚举类型,并让文档传递其中一个值。 若要使用 pHint,请从 CObject 中派生提示类并让文档将指针传递给提示对象;重写 OnUpdate 时,使用 CObject::IsKindOf 成员函数确定提示对象的运行时类型。

通常,不应直接从 OnUpdate 中执行任何绘图。 相反,确定设备坐标中的矩形描述,即需要更新的区域;将此矩形传递给 CWnd::InvalidateRect。 这会导致下次收到 WM_PAINT 消息时进行绘制。

如果 lHint 为 0,pHintNULL,则文档已发送通用更新通知。 如果视图收到通用更新通知,或者如果无法解码提示,则应使整个工作区失效。

另请参阅

MFC 示例 MDIDOCVW
CWnd
层次结构图
CWnd
CFrameWnd
CSplitterWnd
CDC
CDocTemplate
CDocument