DRAWCLI-Beispiel: Demonstriert die Integration der aktiven Containerunterstützung mit anwendungsspezifischen Features

Aktualisiert: November 2007

Das DRAWCLI-Beispiel ist ein objektorientiertes Zeichenprogramm mit Container-Unterstützung für visuelle Bearbeitung. Von den MFC-Beispielen für Active Container (CONTAINER, OCLIENT und DRAWCLI) veranschaulicht dieses Beispiel am besten die Integration von Active Container-Unterstützung mit anwendungsspezifischen Features (in diesem Fall Zeichenfeatures). Darüber hinaus demonstriert DRAWCLI im Entwurf seiner CDrawObj- und CDrawTool-Klassen ("Form"- und "Zeichengerät"-Klassen) den effizienten Einsatz der C++-Polymorphie.

Sicherheitshinweis:

Dieser Beispielcode dient dazu, ein Konzept zu veranschaulichen. Er sollte nicht für Anwendungen oder Websites verwendet werden, da dieser Code unter Umständen nicht die sicherste Codierungstechnik darstellt. Microsoft übernimmt keine Haftung für beiläufig entstandene Schäden oder Folgeschäden, falls der Beispielcode nicht bestimmungsgemäß verwendet wird.

So rufen Sie Beispiele und Anweisungen für ihre Installation ab

  • Klicken Sie in Visual Studio im Menü Hilfe auf Beispiele.

    Weitere Informationen finden Sie unter Suchen von Beispieldateien.

  • Die neueste Version und vollständige Liste mit Beispielen ist online unter Visual Studio 2008 Samples verfügbar.

  • Sie können auch Beispiele auf der Festplatte des Computers suchen. Standardmäßig werden Beispiele und eine Infodatei in einen Ordner unter \Programme\Visual Studio 9.0\Samples\ kopiert. Für Express Editions von Visual Studio sind alle Beispiele online verfügbar.

Erstellen und Ausführen des Beispiels

So erstellen Sie das DRAWCLI-Beispiel und führen es aus

  1. Öffnen Sie die Projektmappe drawcli.sln.

  2. Klicken Sie im Menü Erstellen auf Erstellen.

  3. Öffnen Sie die Anwendung DRAWCLI im Debugverzeichnis des Projekts, und führen Sie diese aus.

Windows-Logo-Features in "DRAWCLI"

DRAWCLI veranschaulicht auch die Kompatibilität mit dem Windows-Logo. Alle MFC-Anwendungen erfüllen einige Anforderungen des Windows-Logos: eine ausführbare Win32-Datei, Unterstützung für lange Dateinamen und UNC-Pfadnamen sowie Verwendung der Systemfarben und -eigenschaften. Durch die folgenden Features erfüllt DRAWCLI die restlichen Anforderungen des Windows-Logos:

  • ActiveX-Unterstützung. DRAWCLI ist ein Active-Container, der seine Dateien im Verbunddateiformat speichert, direkte Aktivierung unterstützt und als Ablageziel für Drag & Drop-Vorgänge fungiert.

  • MAPI-Unterstützung. DRAWCLI stellt im Menü File die Option Send as Mail zur Verfügung, mit der der Benutzer ein Dokument als E-Mail-Anlage senden kann.

  • Kompatibilität mit Shellrichtlinien, einschließlich Registrierung großer und kleiner Symbole, Verwendung der Systemregistrierung an Stelle einer INI-Datei und Vorhandensein eines Setup- sowie eines Deinstallationsprogramms. Für Letzteres enthält DRAWCLI ein Skript, das mit InstallSHIELD kompatibel ist, dem Toolkit der Firma Stirling Software zum Erstellen von Setup- und Deinstallationsprogrammen.

DRAWCLI erfüllt außerdem folgende Anforderungen an Windows-Anwendungen:

  • Es verwendet Eigenschaftenseiten mit Registerkarten.

  • Es verwendet allgemeine Windows-Steuerelemente.

  • Es zeigt beim Klicken mit der rechten Maustaste ein Kontextmenü an.

  • Es speichert Übersichtsinformationen mit seinen Dokumenten.

Die Benutzeroberfläche von DRAWCLI ähnelt den Benutzeroberflächen anderer objektorientierter Zeichenprogramme.

Integrieren der Active Container-Unterstützung mit anwendungsspezifischen Features

Das DRAWCLI-Beispiel war ursprünglich ein eigenständiges Zeichenprogramm, das mithilfe der MFC-Klassen entwickelt wurde. Die eigenständige Version von DRAWCLI wurde dann in ein zweites Skelett von DRAWCLI integriert, das mit dem ActiveX-Containerfeature des Anwendungs-Assistenten erstellt worden war. Auf ähnliche Weise fügt der ActiveX-Server für visuelle Bearbeitung dem SCRIBBLE-Beispiel Serverunterstützung hinzu.

Unabhängig davon, ob Sie einer vorhandenen eigenständigen MFC-Anwendung mit Dokument-/Ansichtarchitektur ActiveX-Funktionalität hinzufügen oder ob Sie mit einer von einem Anwendungs-Assistenten generierten ActiveX-Containeranwendung beginnen, die mit einem Anwendungs-Assistenten erstellt wurde, sollte der Entwurf einer MFC-ActiveX-Containeranwendung im Grunde gleich aussehen. Es folgt eine kurze Beschreibung der Aufteilung von DRAWCLI in für die Anwendung und den ActiveX-Container spezifischen Code.

  • Die CDrawObj-Klasse, die in Drawobj.cpp implementiert ist, stellt eine Basisklasse für abgeleitete "Form"-Klassen dar. Diese Basisklasse behandelt die Trefferüberprüfung von Formen sowie das Bewegen und das Ändern der Größe von Formen. Durch die Verwendung von Polymorphie kann DRAWCLI über die Schnittstelle von CDrawObj mit Objekten verschiedener Klassen interagieren.

  • Die CDrawRect-Klasse und die CDrawPoly-Klasse sind von CDrawObj abgeleitet. CDrawRect wird zum Zeichnen von Rechtecken, abgerundeten Rechtecken, Ellipsen und Linien verwendet. Mit CDrawPoly werden Polygone gezeichnet. Diese beiden Klassen sind von der ActiveX-Containerfunktionalität von DRAWCLI unabhängig.

  • Die CDrawOleObj-Klasse ist ebenfalls von CDrawObj abgeleitet und wird zum Darstellen eingebetteter Objekte verwendet. CDrawOleObj delegiert alle ActiveX-spezifischen Vorgänge an ein enthaltenes CDrawItem-Objekt (nachstehend beschrieben). Für allgemeine Formvorgänge werden eingebettete Objekte wie andere Formobjekte in DRAWCLI behandelt, da CDrawOleObj von CDrawObj abgeleitet ist.

  • Die CDrawItem-Klasse, die von COleClientItem abgeleitet ist, behandelt ActiveX-spezifisches Verhalten für das eingebettete Objekt. Die Implementierung von CDrawItem ist der Implementierung der von COleClientItem abgeleiteten Klassen im CONTAINER-Beispiel und im OCLIENT-Beispiel ähnlich.

  • Die CDrawDoc-Klasse ist von COleDocument abgeleitet. Das COleDocument-Objekt verwaltet eine CObList der CDrawObj-Objekte. CDrawDoc delegiert mehrere für ActiveX-Container spezifische Menübefehle, z. B. Bearbeiten > Einfügen, Verknüpfung einfügen und Verknüpfungen, an die Basisklasse COleDocument.

  • Die CDrawView-Klasse ist von CScrollView abgeleitet. Die ActiveX-spezifische Implementierung von CDrawView ist der Implementierung der Ansichtsklassen im CONTAINER-Beispiel und im OCLIENT-Beispiel ähnlich. Die Sammelverarbeitung der zeichenspezifischen Benutzeroberfläche von DRAWCLI ist ebenfalls in CDrawView implementiert.

Schlüsselwörter

Dieses Beispiel demonstriert die Verwendung der folgenden Schlüsselwörter:

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

Hinweis:

In diesem und einigen anderen Beispielen wurden die Änderungen an den Visual C++-Assistenten, -Bibliotheken und -Compilern noch nicht nachvollzogen. Sie demonstrieren aber dennoch, wie Sie die gewünschte Aufgabe durchführen können.

Siehe auch

Weitere Ressourcen

MFC-Beispiele