Ejemplo DRAWCLI: ilustra la integración de compatibilidad con contenedor activo con funciones específicas de la aplicación

Actualización: noviembre 2007

El ejemplo DRAWCLI es una aplicación de dibujo orientada a objetos compatible con el contenedor de edición visual. Entre los ejemplos de contenedor activo de MFC —CONTAINER, OCLIENT y DRAWCLI— este ejemplo proporciona la mejor demostración de la integración de la compatibilidad con un contenedor activo con características específicas de una aplicación (en este caso, características de dibujo). Además, DRAWCLI muestra un uso eficaz del polimorfismo de C++ en el diseño de sus clases "forma" y "herramienta de dibujo" (CDrawObj y CDrawTool).

Nota de seguridad:

Este código de ejemplo se proporciona para ilustrar un concepto y no debe utilizarse en aplicaciones o sitios Web, ya que quizás no ilustre las prácticas de codificación más seguras. Microsoft no asume ninguna responsabilidad por daños incidentales o consecuentes en caso de que el código de ejemplo se utilice para propósitos distintos de aquellos para los que se concibió.

Para obtener ejemplos e instrucciones para su instalación:

  • En el menú Ayuda de Visual Studio, haga clic en Ejemplos.

    Para obtener más información, vea Localizar archivos de ejemplo.

  • La lista de ejemplos completa con la versión más reciente está disponible en línea en la página Visual Studio 2008 Samples.

  • También encontrará ejemplos en el disco duro de su equipo. De manera predeterminada, los ejemplos y el archivo Léame se copian en una carpeta bajo \Archivos de programa\Visual Studio 9.0\Samples\. Para las versiones Express de Visual Studio, todos los ejemplos están en línea.

Generar y ejecutar el ejemplo

Para generar y ejecutar el ejemplo DRAWCLI

  1. Abra la solución drawcli.sln.

  2. En el menú Generar, haga clic en Generar.

  3. Abra y ejecute la aplicación DRAWCLI desde el directorio Debug del proyecto.

Características del logotipo de Windows de DRAWCLI

DRAWCLI muestra también la compatibilidad con el logotipo de Windows. Todas las aplicaciones MFC cumplen algunos de los requisitos para el logotipo de Windows: un ejecutable para Win32, compatibilidad con nombres largos de archivo, compatibilidad con nombres de ruta UNC y el uso de los colores y medidas del sistema. DRAWCLI cumple el resto de requisitos para el logotipo de Windows incluyendo las siguientes características.

  • Compatibilidad con ActiveX. DRAWCLI es un contenedor activo que almacena los archivos con el formato de archivo compuesto, admite activación in situ y actúa como destino en operaciones de arrastrar y colocar.

  • Compatibilidad con MAPI. DRAWCLI proporciona un mensaje "Enviar como mensaje de correo electrónico" en el menú Archivo que permite al usuario enviar un documento como datos adjuntos en un mensaje de correo electrónico.

  • Compatibilidad con las instrucciones de shell, incluido el Registro de iconos pequeños y grandes, el uso del Registro del sistema en lugar de un archivo .ini y el tener un programa de instalación y desinstalación. Para esto último, DRAWCLI incluye una secuencia de comandos compatible con el kit de herramientas InstallSHIELD de Stirling Software para crear programas de instalación y desinstalación.

DRAWCLI cumple también las siguientes recomendaciones para aplicaciones Windows.

  • Utiliza páginas de propiedades con fichas.

  • Utiliza controles comunes de Windows.

  • Muestra un menú de acceso directo como respuesta al clic con el botón secundario del mouse (ratón).

  • Almacena información de resumen con los documentos.

La interfaz de usuario de DRAWCLI es similar a la de los programas de dibujo orientados a objetos.

Integrar la compatibilidad con un contenedor activo con funciones específicas de la aplicación

El ejemplo DRAWCLI era originalmente una aplicación de dibujo independiente desarrollada mediante la utilización de clases MFC. Después, se integró la versión independiente de DRAWCLI con una segunda versión de esquema de DRAWCLI creada mediante la utilización de la característica Contenedor ActiveX del Asistente para aplicaciones. Este proceso es similar al modo en que el servidor de edición visual de ActiveX agrega compatibilidad con un servidor a SCRIBBLE.

El diseño de la aplicación contenedora ActiveX de MFC debería tener básicamente el mismo aspecto, sin tener en cuenta si agrega funcionalidad ActiveX a una aplicación MFC (documento y vista) independiente existente o si comienza con una aplicación contenedora ActiveX generada con un Asistente para aplicaciones. A continuación se expone una breve descripción de cómo DRAWCLI está dividida en código específico de la aplicación y código específico del contenedor ActiveX.

  • La clase CDrawObj, implementada en Drawobj.cpp, es una clase base para clases derivadas de "forma". Esta clase base controla las pruebas, el movimiento y el cambio de tamaño de las formas. Con el uso del polimorfismo, DRAWCLI puede interactuar con objetos de clases diferentes a través de la interfaz de CDrawObj.

  • Las clases CDrawRect y CDrawPoly son derivadas de CDrawObj. CDrawRect se utiliza para dibujar rectángulos, rectángulos redondeados, elipses y líneas. CDrawPoly se utiliza para dibujar polígonos. Estas dos clases son independientes de la funcionalidad de contenedor ActiveX de DRAWCLI.

  • La clase CDrawOleObj se deriva también de CDrawObj y se utiliza para representar objetos incrustados. CDrawOleObj delega las operaciones específicas de ActiveX en un objeto CDrawItem contenido (se describe a continuación). Para operaciones de forma genéricas, los objetos incrustados se tratan como otros objetos de forma en DRAWCLI porque CDrawOleObj se deriva de CDrawObj.

  • La clase CDrawItem, derivada de COleClientItem, controla todo el comportamiento específico de ActiveX para el objeto incrustado. La implementación de CDrawItem es similar a la de las clases derivadas de COleClientItem en los ejemplos CONTAINER y OCLIENT.

  • La clase CDrawDoc se deriva de COleDocument. El objeto COleDocument mantiene una lista CObList de objetos CDrawObj. CDrawDoc delega varios comandos de menú específicos del contenedor ActiveX, como Pegar, Pegar vínculo y Vínculos, en la clase COleDocument.

  • La clase CDrawView se deriva de CScrollView. La implementación específica de ActiveX de CDrawView es similar a la de las clases de vista en los ejemplos CONTAIN y OCLIENT. La mayor parte de la interfaz de usuario específica de dibujo de DRAWCLI se implementa también en CDrawView.

Palabras clave

En este ejemplo, se muestra el uso de las siguientes palabras clave:

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

Nota:

Algunos ejemplos, como éste, no se han modificado para reflejar los cambios en los asistentes, las bibliotecas y el compilador de Visual C++, pero, aun así, muestran cómo realizar la tarea deseada.

Vea también

Otros recursos

Ejemplos de MFC