DRAWCLI 範例:說明整合 Active 容器支援和特定的應用程式功能
更新:2007 年 11 月
DRAWCLI 範例是一個物件導向、且支援視覺化編輯 (Visual Editing) 容器的繪圖應用程式。在 MFC Active 容器範例之中 (CONTAINER、OCLIENT 和 DRAWCLI),這個範例為整合 Active 容器支援和特定的應用程式功能 (在這個範例中是繪圖功能) 做出最佳的說明。此外,DRAWCLI 會示範 C++ 多型 (Polymorphism) 在它的「形狀」與「繪圖工具」類別 (CDrawObj 和 CDrawTool) 設計中的有效使用方式。
![]() |
---|
這個程式碼範例僅供概念說明之用,同時因為範例中的程式碼撰寫並沒有周全的顧及所有安全性問題,所以本範例不適用於實際執行的應用程式或網站中。如果使用者擅自將範例程式碼用於其他意圖而導致連帶事件或重大損害時,Microsoft 將不承擔任何責任。 |
若要取得範例和指示以便進行安裝:
按一下 Visual Studio [說明] 功能表上的 [範例]。
如需詳細資訊,請參閱尋找範例檔案。
最新版的完整範例清單可從 Visual Studio 2008 範例網頁 (英文) 取得。
您也可以將範例置於電腦硬碟中。根據預設,範例和讀我檔案都會複製到 \Program Files\Visual Studio 9.0\Samples\ 下的資料夾中。對於所有的 Visual Studio Express 版,所有範例都可在線上找到。
建置和執行範例
若要建置並執行 DRAWCLI 範例
開啟 drawcli.sln 方案。
在 [建置] 功能表上,按一下 [建置]。
從專案的 Debug 目錄中,開啟並執行 DRAWCLI 應用程式。
DRAWCLI 的 Windows 標誌功能
DRAWCLI 也說明 Windows 標誌的相容性。所有的 MFC 應用程式都會符合某些 Windows 標誌需求:一個 Win32 可執行檔、支援長檔名、支援 UNC 路徑名稱、使用系統色彩和公制等。DRAWCLI 因包含了下列功能而符合其餘 Windows 標誌的需求。
支援 ActiveX。DRAWCLI 是一個 Active 容器,可以將它的檔案儲存成複合檔案 (Compound File) 格式、支援就地啟動 (In-Place Activation),和當做拖放作業的置放目標 (Drop Target) 使用。
支援 MAPI。DRAWCLI 在它的 [File] 功能表中提供一個「Send as Mail」訊息,允許使用者將文件當成郵件附件來傳送。
相容於 Shell 規則,包含大、小圖示的登錄、使用系統登錄來取代 .ini 檔案,和擁有一個安裝和解除安裝程式。針對最後一項,DRAWCLI 包含了一段相容於 InstallSHIELD、Stirling Software 工具套件的指令碼,用來建立安裝與解除安裝程式。
DRAWCLI 也符合下列為 Windows 應用程式所提出的建議。
使用索引標籤式的屬性頁。
使用 Windows 通用控制項。
顯示快速鍵功能表來回應按一下滑鼠右鍵的動作。
將摘要資訊隨其文件一起儲存。
DRAWCLI 的使用者介面和其他物件導向繪圖程式的使用者介面相似。
整合 Active 容器支援和特定的應用程式功能
DRAWCLI 範例最初是使用 MFC 類別所開發的獨立繪圖應用程式。DRAWCLI 的獨立版本後來和 DRAWCLI 的第二個架構版本 (使用應用程式精靈的「ActiveX 容器」功能所建立) 整合在一起。這個程序與 ActiveX 視覺化編輯伺服程式將伺服程式支援加入至 SCRIBBLE 的方法很類似。
不論您是否把 ActiveX 功能加入至現有的獨立 MFC (文件/檢視) 應用程式,或是從應用程式精靈產生的 ActiveX 容器應用程式開始啟動,MFC ActiveX 容器應用程式的設計基本上看起來應該都相同。下面是 DRAWCLI 如何分成特定應用程式程式碼和特定 ActiveX 容器程式碼的簡短說明。
在 Drawobj.cpp 中實作的 CDrawObj 類別,是衍生的「形狀」類別的基底類別。這個基底類別會處理形狀的點擊測試 (Hit Testing)、形狀的移動,和形狀的調整大小。透過使用多型,DRAWCLI 可以藉由 CDrawObj's 介面,與不同類別的物件進行互動。
CDrawRect 與 CDrawPoly 類別都是衍生自 CDrawObj。CDrawRect 是用來繪製矩形、圓角矩形、橢圓形和直線。CDrawPoly 是用來繪製多邊形。這兩個類別都是 DRAWCLI 的 ActiveX 容器功能的獨立類別。
CDrawOleObj 類別也是衍生自 CDrawObj,而且是用來表示內嵌物件 (Embedded Object)。CDrawOleObj 會將任何特定的 ActiveX 作業委派給已收納的 CDrawItem 物件 (接下來將有說明)。如果是一般的形狀作業,內嵌的物件會因為 CDrawOleObj 是衍生自 CDrawObj 而被當做 DRAWCLI 中的其他形狀物件來處理。
CDrawItem 類別是衍生自 COleClientItem,可以處理所有內嵌之物件的 ActiveX 特定的行為。CDrawItem 的實作相似於 CONTAINER 和 OCLIENT 範例中 COleClientItem 所衍生的類別。
CDrawDoc 類別是衍生自 COleDocument。COleDocument 物件會維護 CDrawObj 物件的 CObList。CDrawDoc 會將幾個特定的 ActiveX 容器功能表命令 (例如,[Edit Paste]、[Paste Link] 及 [Links]) 委派到 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++ 精靈、程式庫以及編譯器方面的變更,不過還是可以示範如何完成您要進行的工作。 |