DRAWCLI, exemple : illustre l'intégration de la prise en charge des conteneurs actifs avec des fonctionnalités spécifiques aux applications
Mise à jour : novembre 2007
L'exemple DRAWCLI est une application de dessin orientée objet avec une prise en charge des conteneurs d'édition visuelle. De tous les exemples de conteneurs actifs MFC (CONTAINER, OCLIENT et DRAWCLI), celui-ci apporte la meilleure illustration d'une intégration de la prise en charge de conteneurs actifs à l'aide de fonctionnalités spécifiques aux applications, c'est-à-dire dans le cas présent des fonctionnalités de dessin. En outre, DRAWCLI présente une utilisation efficace du polymorphisme C++ dans le design de ses classes de "formes" et d'"outils de dessin" (CDrawObj et CDrawTool).
Note de sécurité : |
---|
Cet exemple de code est fourni pour illustrer un concept et ne doit pas être utilisé dans des applications ou des sites Web, car il peut ne pas illustrer les pratiques de programmation les plus sûres. Microsoft n'assume aucune responsabilité pour tout dommage indirect ou consécutif en cas d'utilisation de l'exemple de code à des fins autres que celles prévues. |
Pour obtenir des exemples et des instructions d'installation :
Dans le menu ? (Aide) de Visual Studio, cliquez sur Exemples.
Pour plus d'informations, consultez Recherche des fichiers d'exemple.
La liste la plus récente et la plus complète d'exemples est disponible en ligne à partir de la page Visual Studio 2008 Samples.
Des exemples sont également disponibles sur le disque dur de votre ordinateur. Des exemples et un fichier Readme sont copiés par défaut dans un dossier sous \Program Files\Visual Studio 9.0\Samples\. Pour les éditions Express de Visual Studio, tous les exemples sont accessibles en ligne.
Génération et exécution de l'exemple
Pour générer et exécuter l'exemple DRAWCLI
Ouvrez la solution drawcli.sln.
Dans le menu Générer, cliquez sur Générer.
Dans le répertoire Débogage du projet, ouvrez et exécutez l'application DRAWCLI.
Fonctionnalités de DRAWCLI relatives au logo Windows
DRAWCLI illustre également la conformité au logo Windows. Toutes les applications MFC répondent à certaines exigences relatives au logo Windows : un exécutable Win32, la prise en charge des noms de fichiers longs, la prise en charge des noms de chemins d'accès UNC et l'utilisation des couleurs et mesures système. DRAWCLI répond aux autres exigences imposées par le logo Windows en incluant les fonctionnalités ci-dessous.
Prise en charge ActiveX. DRAWCLI est un conteneur actif qui stocke ses fichiers dans le format de fichier composé, prend en charge l'activation sur place et tient lieu de cible pour les opérations de glisser-déplacer.
Prise en charge MAPI. DRAWCLI propose un message "Send" dans son menu File, ce qui permet à l'utilisateur d'envoyer un document sous forme de pièce jointe.
Conformité aux indications du shell, y compris l'inscription de grandes et petites icônes, l'utilisation de la base de registres au lieu d'un fichier .ini et l'existence d'un programme d'installation et de désinstallation. Pour cette dernière exigence, DRAWCLI comprend un script compatible avec InstallSHIELD, trousse à outils de Stirling Software destinée à la création de programmes d'installation et de désinstallation.
DRAWCLI est également conforme aux recommandations ci-dessous relatives aux applications Windows :
utilisation de pages de propriétés avec onglet ;
utilisation des contrôles communs de Windows ;
affichage d'un menu contextuel en réponse à un clic avec le bouton droit ;
stockage des informations résumées avec ses documents.
L'interface utilisateur de DRAWCLI est comparable à celle d'autres programmes de dessin orientés objet.
Intégration de la prise en charge des conteneurs actifs avec des fonctionnalités spécifiques aux applications
L'exemple DRAWCLI est à l'origine une application de dessin autonome développée à l'aide de classes MFC. La version autonome de DRAWCLI a ensuite été intégrée à une deuxième version squelette de DRAWCLI, créée à l'aide de la fonctionnalité Conteneur ActiveX de l'Assistant Application. Ce processus d'intégration est comparable à la manière dont le serveur d'édition visuelle ActiveX ajoute la prise en charge serveur à SCRIBBLE.
Le design d'une application de conteneurs ActiveX MFC doit avoir pratiquement la même apparence, indépendamment du fait que vous ajoutiez la fonctionnalité ActiveX à une application MFC autonome (doc/view) ou que vous partiez d'une application de conteneurs ActiveX générée à l'aide de l'Assistant Application. Vous trouverez ci-dessous une description courte de la façon dont DRAWCLI se compose d'une part de code spécifique aux applications et d'autre part de code spécifique aux conteneurs ActiveX.
La classe CDrawObj, implémentée dans Drawobj.cpp, est une classe de base pour les classes dérivées de type "forme". Cette classe de base gère le test d'atteinte des formes, le déplacement des formes et le redimensionnement des formes. À l'aide du polymorphisme, DRAWCLI peut interagir avec des objets de classes différentes par l'intermédiaire de l'interface de CDrawObj.
Les classes CDrawRect et CDrawPoly sont dérivées de CDrawObj. CDrawRect permet de dessiner des rectangles, des rectangles avec coins arrondis, des ellipses et des lignes. CDrawPoly permet de dessiner des polygones. Ces deux classes sont indépendantes de la fonctionnalité conteneur ActiveX de DRAWCLI.
La classe CDrawOleObj est également dérivée de CDrawObj et permet de représenter des objets incorporés. CDrawOleObj délègue toute opération spécifiquement de type ActiveX à un objet CDrawItem qu'il contient (décrit plus loin). Pour les opérations génériques relatives aux formes, les objets incorporés sont traités comme d'autres objets de type forme dans DRAWCLI, parce que CDrawOleObj est dérivée de CDrawObj.
La classe CDrawItem, dérivée de COleClientItem, gère l'intégralité du comportement spécifique à ActiveX pour l'objet incorporé. L'implémentation de CDrawItem est comparable à celle des classes dérivées de COleClientItem dans les exemples CONTAINER et OCLIENT.
La classe CDrawDoc est dérivée de COleDocument. L'objet COleDocument conserve une CObList des objets CDrawObj. CDrawDoc délègue plusieurs commandes de menu spécifiques aux conteneurs ActiveX, telles que Edit Paste, Paste Link et Links, à la classe de base COleDocument.
La classe CDrawView est dérivée de CScrollView. L'implémentation spécifique à ActiveX de CDrawView est comparable à celle des classes dérivées dans les exemples CONTAIN et OCLIENT. L'essentiel de l'interface utilisateur spécifique au dessin de DRAWCLI est également implémenté dans CDrawView.
Mots clés
Cet exemple illustre l'utilisation des mots clés suivants :
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
Remarque : |
---|
Certains exemples, tels que celui-ci, n'ont pas été modifiés pour refléter les changements apportés aux Assistants, aux bibliothèques et au compilateur Visual C++, mais ils illustrent bien l'exécution de la tâche souhaitée. |