DRAWCLI 示例:阐释活动容器支持与应用程序特定的功能的集成

更新:2007 年 11 月

DRAWCLI 示例是具有可视化编辑容器支持的面向对象的绘图应用程序。MFC 活动容器示例(CONTAINEROCLIENT 和 DRAWCLI)中的此示例提供了集成活动容器支持与特定于应用程序的功能(在此示例中是绘图功能)的最佳说明。此外,DRAWCLI 还说明如何在其“shape”和“drawing tool”类(CDrawObjCDrawTool)的设计中有效使用 C++ 多态性。

安全说明:

提供该示例代码是为了阐释一个概念,并不代表着最安全的编码实践,因此不应在应用程序或网站中使用该示例代码。对于超出本示例代码的预期用途以外的使用所造成的偶然或继发性损失,Microsoft 不承担任何责任。

获取示例和安装示例的说明:

  • 在 Visual Studio 的“帮助”菜单上,单击“示例”。

    有关更多信息,请参见定位示例文件

  • 示例的最新版本和完整列表可以从 Visual Studio 2008 Samples page(Visual Studio 2008 示例页面)联机获取。

  • 还可以在计算机的硬盘上查找示例。默认情况下,示例和自述文件将复制到 \Program Files\Visual Studio 9.0\Samples\ 下的文件夹中。对于 Visual Studio 速成版,所有示例都位于联机位置。

生成并运行示例

生成并运行 DRAWCLI 示例

  1. 打开解决方案 drawcli.sln。

  2. 在“生成”菜单中单击“生成”。

  3. 从项目的 Debug 目录中,打开并运行 DRAWCLI 应用程序。

DRAWCLI 的 Windows 徽标功能

DRAWCLI 还阐释 Windows 徽标遵从性。所有 MFC 应用程序都满足 Windows 徽标的一些要求:是 Win32 可执行文件、支持长文件名、支持 UNC 路径名以及使用系统颜色和公制。DRAWCLI 通过包括以下功能满足 Windows 徽标的其余要求。

  • ActiveX 支持。DRAWCLI 是活动容器,它以复合文件格式存储其文件,支持就地激活,并且作为拖放操作的放置目标。

  • MAPI 支持。DRAWCLI 在其“File”菜单上提供“Send as Mail”消息,使用户可以将文档作为邮件附件发送。

  • 符合外壳程序规则,包括大小图标的注册,使用系统注册表而非 .ini 文件,以及具有安装和卸载程序。对于后者,DRAWCLI 包含一个与 InstallSHIELD(Stirling Software 的用于创建安装和卸载程序的工具包)兼容的脚本。

DRAWCLI 还满足 Windows 应用程序的以下建议。

  • 使用选项卡式属性页。

  • 使用 Windows 公共控件。

  • 显示快捷菜单以响应鼠标右键单击。

  • 将摘要信息与其文档一起存储。

DRAWCLI 的用户界面类似于其他面向对象的绘图程序的用户界面。

集成活动容器支持与特定于应用程序的功能

DRAWCLI 示例最初是使用 MFC 类开发的独立的绘图应用程序。然后该独立的 DRAWCLI 版本与使用应用程序向导的 ActiveX 容器功能创建的 DRAWCLI 的第二个主干版本相集成。这一过程类似于 ActiveX 可视化编辑服务器将服务器支持添加到 SCRIBBLE 的方式。

MFC ActiveX 容器应用程序的设计在本质上应是相同的,无论是将 ActiveX 功能添加到现有的独立 MFC(文档/视图)应用程序,还是从应用程序向导生成的 ActiveX 容器应用程序开始。以下是对 DRAWCLI 如何被划分成特定于应用程序的代码和特定于 ActiveX 容器的代码的简短说明。

  • CDrawObj 类(在 Drawobj.cpp 中实现)是派生的“shape”类的基类。该基类处理形状的命中测试、形状的移动和形状的大小调整。通过使用多态性,DRAWCLI 可以通过 CDrawObj 的接口与不同类的对象进行交互。

  • CDrawRect 类和 CDrawPoly 类是从 CDrawObj 派生的。CDrawRect 用于绘制矩形、圆角矩形、椭圆和直线。CDrawPoly 用于绘制多边形。这两个类独立于 DRAWCLI 的 ActiveX 容器功能。

  • CDrawOleObj 类也是从 CDrawObj 派生的,用于表示嵌入的对象。CDrawOleObj 将所有特定于 ActiveX 的操作委托给包含的 CDrawItem 对象(参阅下面的描述)。对于一般形状操作,对嵌入的对象的处理类似于对 DRAWCLI 中其他形状对象的处理,因为 CDrawOleObj 是从 CDrawObj 派生的。

  • COleClientItem 派生的 CDrawItem 类处理嵌入对象的所有特定于 ActiveX 的行为。CDrawItem 的实现类似于 CONTAINEROCLIENT 示例中 COleClientItem 派生类的实现。

  • CDrawDoc 类是从 COleDocument 派生的。COleDocument 对象维护 CDrawObj 对象的 CObListCDrawDoc 将几个特定于 ActiveX 容器的菜单命令(例如“Edit”->“Paste”、“Paste Link”和“Link”)委托给基类 COleDocument

  • CDrawView 类是从 CScrollView 派生的。CDrawView 的特定于 ActiveX 的实现类似于 CONTAIN 和 OCLIENT 示例中视图类的实现。大量的 DRAWCLI 的特定于绘图的用户界面也是在 CDrawView 中实现的。

关键字

此示例说明以下关键字:

AfxGetApp;AfxGetMainWnd;AfxMessageBox;AfxOleInit;AfxRegisterWndClass;AfxThrowMemoryException;CArchive::Close;CArchive::IsStoring;CBitmap::CreateCompatibleBitmap;CBrush::CreateBrushIndirect;CBrush::CreateSolidBrush;CCmdTarget::BeginWaitCursor;CCmdTarget::EndWaitCursor;CCmdUI::Enable;CCmdUI::SetCheck;CCmdUI::SetRadio;CColorDialog::DoModal;CColorDialog::GetColor;CControlBar::EnableDocking;CControlBar::GetBarStyle;CControlBar::SetBarStyle;CDC::Attach;CDC::BitBlt;CDC::CreateCompatibleDC;CDC::DPtoLP;CDC::DrawFocusRect;CDC::FillRect;CDC::GetClipBox;CDC::GetDeviceCaps;CDC::HIMETRICtoDP;CDC::IntersectClipRect;CDC::IsPrinting;CDC::LPtoDP;CDC::LineTo;CDC::MoveTo;CDC::OffsetViewportOrg;CDC::OffsetWindowOrg;CDC::PatBlt;CDC::SelectObject;CDC::SetBkColor;CDC::SetBrushOrg;CDC::SetMapMode;CDC::SetViewportExt;CDC::SetViewportOrg;CDC::SetWindowExt;CDC::SetWindowOrg;CDialog::DoModal;CDocTemplate::SetContainerInfo;CDocument::GetFirstViewPosition;CDocument::GetNextView;CDocument::GetTitle;CDocument::OnNewDocument;CDocument::OnOpenDocument;CDocument::OnSaveDocument;CDocument::SetModifiedFlag;CDocument::SetTitle;CDocument::UpdateAllViews;CFrameWnd::DockControlBar;CFrameWnd::EnableDocking;CFrameWnd::LoadFrame;CFrameWnd::OnCreateClient;CGdiObject::UnrealizeObject;CMDIChildWnd::Create;CMenu::GetSubMenu;CMenu::LoadMenu;CMenu::TrackPopupMenu;CObList::AddTail;CObList::GetCount;CObList::GetHeadPosition;CObList::GetNext;CObList::IsEmpty;CObList::RemoveAll;CObList::RemoveAt;CObject::AssertValid;CObject::Dump;CObject::IsKindOf;CObject::Serialize;COleClientItem::Close;COleClientItem::CreateCloneFrom;COleClientItem::CreateFromData;COleClientItem::CreateStaticFromData;COleClientItem::Deactivate;COleClientItem::Delete;COleClientItem::DoVerb;COleClientItem::Draw;COleClientItem::GetActiveView;COleClientItem::GetClipboardData;COleClientItem::GetDocument;COleClientItem::GetExtent;COleClientItem::GetInPlaceWindow;COleClientItem::GetItemState;COleClientItem::GetType;COleClientItem::IsInPlaceActive;COleClientItem::OnChange;COleClientItem::OnChangeItemPosition;COleClientItem::OnGetItemPosition;COleClientItem::Release;COleClientItem::SetItemRects;COleClientItem::UpdateLink;COleDataObject::AttachClipboard;COleDataObject::GetFileData;COleDataObject::IsDataAvailable;COleDataSource::CacheGlobalData;COleDataSource::SetClipboard;COleInsertDialog::CreateItem;COleInsertDialog::DoModal;COleInsertDialog::GetSelectionType;CPen::CreatePen;CPen::CreatePenIndirect;CPrintDialog::CreatePrinterDC;CRect::BottomRight;CRect::Height;CRect::InflateRect;CRect::IntersectRect;CRect::IsRectEmpty;CRect::NormalizeRect;CRect::OffsetRect;CRect::SetRect;CRect::TopLeft;CRect::Width;CRectTracker::Draw;CRgn::CreateEllipticRgnIndirect;CRgn::CreatePolygonRgn;CRgn::CreateRoundRectRgn;CRgn::RectInRegion;CScrollView::GetDeviceScrollPosition;CScrollView::SetScrollSizes;CStatusBar::Create;CStatusBar::SetIndicators;CString::MakeLower;CToolBar::Create;CView::DoPreparePrinting;CView::GetDocument;CView::IsSelected;CView::OnActivateView;CView::OnBeginPrinting;CView::OnDragEnter;CView::OnDragLeave;CView::OnDragOver;CView::OnDraw;CView::OnDrop;CView::OnEndPrinting;CView::OnInitialUpdate;CView::OnPrepareDC;CView::OnPreparePrinting;CView::OnPrint;CView::OnScrollBy;CView::OnUpdate;CWinApp::AddDocTemplate;CWinApp::EnableShellOpen;CWinApp::InitInstance;CWinApp::LoadStdProfileSettings;CWinApp::RegisterShellFileTypes;CWinApp::SetRegistryKey;CWnd::DoDataExchange;CWnd::GetCapture;CWnd::GetParentFrame;CWnd::Invalidate;CWnd::InvalidateRect;CWnd::OnCreate;CWnd::OnDestroy;CWnd::OnEraseBkgnd;CWnd::OnLButtonDblClk;CWnd::OnLButtonDown;CWnd::OnLButtonUp;CWnd::OnMouseMove;CWnd::OnSetFocus;CWnd::OnSize;CWnd::PreCreateWindow;CWnd::ScreenToClient;CWnd::SetCapture;CWnd::SetFocus;CWnd::ShowWindow;CWnd::UpdateWindow;DragAcceptFiles;Ellipse;GetACP;GetKeyState;GetMapMode;GetVersion;GlobalFree;GlobalLock;GlobalUnlock;LOWORD;LineTo;LoadCursor;MAKELONG;MoveTo;MulDiv;Polygon;RGB;Rectangle;RegisterClipboardFormat;ReleaseCapture;RoundRect;SelectObject;SetCursor;free;malloc;memcpy;min;realloc;wcstombs

说明:

某些示例(如此示例)尚未经过修改以反映 Visual C++ 向导、库和编译器中所做的更改,但仍演示了如何完成所需的任务。

请参见

其他资源

MFC 示例