Condividi tramite


Esempio DRAWCLI: integrazione del supporto del contenitore attivo con le funzionalità specifiche dell'applicazione

Aggiornamento: novembre 2007

L'esempio DRAWCLI rappresenta un'applicazione di disegno orientata ad oggetti con il supporto per il contenitore di modifica visiva. Tra i diversi esempi di contenitori attivi MFC (CONTAINER, OCLIENT e DRAWCLI), nel presente esempio viene illustrato in modo estremamente chiaro come integrare il supporto per il contenitore attivo con funzionalità specifiche dell'applicazione, in questo caso le funzionalità di disegno. In DRAWCLI, inoltre, viene offerta la dimostrazione di un utilizzo efficace del polimorfismo di C++ per la progettazione delle classi "forma" e "strumento di disegno" (CDrawObj e CDrawTool).

Nota sulla sicurezza:

Questo esempio di codice viene fornito solo a scopo dimostrativo e non deve essere utilizzato in applicazioni o siti Web, poiché potrebbe non implementare le tecniche migliori a livello di sicurezza. Microsoft esclude ogni responsabilità per danni diretti o indiretti derivanti dall'utilizzo dell'esempio di codice per scopi diversi da quelli previsti.

Per ottenere gli esempi e le istruzioni per l'installazione:

  • In Visual Studio scegliere Esempi dal menu ?.

    Per ulteriori informazioni, vedere Individuazione dei file di esempio.

  • La versione più recente e l'elenco completo degli esempi sono disponibili in linea alla pagina Visual Studio 2008 Samples.

  • È anche possibile trovare gli esempi sul disco rigido del computer. Per impostazione predefinita, gli esempi e il file Leggimi vengono copiati in una cartella nel percorso \Programmi\Visual Studio 9.0\Samples\. Per le versioni Express di Visual Studio, tutti gli esempi sono disponibili in linea.

Generazione ed esecuzione dell'esempio

Per generare ed eseguire l'esempio DRAWCLI

  1. Aprire la soluzione drawcli.sln.

  2. Scegliere Genera dal menu Genera.

  3. Dalla directory Debug del progetto, aprire ed eseguire l'applicazione DRAWCLI.

Funzionalità di conformità con il logo Windows

In DRAWCLI viene illustrata anche la conformità con il logo Windows. Tutte le applicazioni MFC soddisfano alcune delle caratteristiche richieste per il logo Windows: un eseguibile Win32, il supporto per i nomi di file lunghi, il supporto per i nomi di percorso UNC e l'utilizzo dei colori e dei formati di sistema. In DRAWCLI sono implementati anche gli altri requisiti per il logo Windows, ovvero le seguenti funzionalità:

  • Supporto ActiveX: DRAWCLI è un contenitore attivo nel quale i file vengono memorizzati con il formato file composito. L'applicazione supporta inoltre l'attivazione sul posto e può essere utilizzata come destinazione per le operazioni di trascinamento della selezione.

  • Supporto MAPI: nel menu File di DRAWCLI è incluso il comando "Send as Mail" che consente all'utente di inviare un documento come allegato di un messaggio di posta.

  • Conformità con le istruzioni della shell, inclusa la registrazione di icone grandi e piccole, l'utilizzo del Registro di sistema invece di un file INI e l'utilizzo di un programma di installazione e uno di disinstallazione. Per quest'ultima funzionalità, in DRAWCLI è incluso uno script compatibile con il kit di InstallSHIELD Stirling Software, per la generazione di programmi di installazione e disinstallazione.

DRAWCLI, infine, soddisfa anche le seguenti raccomandazioni per le applicazioni Windows:

  • Utilizzo di pagine delle proprietà a schede.

  • Utilizzo dei controlli comuni di Windows.

  • Visualizzazione di menu di scelta rapida in seguito all'utilizzo del pulsante destro del mouse.

  • Salvataggio di informazioni di riepilogo insieme ai documenti.

L'interfaccia utente di DRAWCLI è simile a quella di altri programmi di disegno orientati ad oggetti.

Integrazione del supporto del contenitore attivo con le funzionalità specifiche dell'applicazione

In origine, l'esempio DRAWCLI era costituito da un'applicazione di disegno autonoma sviluppata utilizzando le classi MFC. La versione autonoma è stata quindi integrata con una seconda versione di base generata utilizzando la funzionalità contenitore ActiveX della Creazione guidata applicazioni. Il processo appena descritto è simile all'operazione con cui il server ActiveX di modifica visiva consente di aggiungere il supporto server a SCRIBBLE.

La progettazione di un'applicazione contenitore ActiveX MFC rimane sostanzialmente identica, indipendentemente dal fatto che la funzionalità ActiveX venga aggiunta a un'applicazione (doc/vis) MFC autonoma esistente o che si utilizzi un'applicazione contenitore ActiveX generata con la Creazione guidata applicazioni. Di seguito è fornita una breve descrizione delle due diverse sezioni di codice presenti in DRAWCLI, quella specifica dell'applicazione e quella specifica del contenitore ActiveX.

  • La classe CDrawObj, implementata in Drawobj.cpp, è una classe base per le classi "forma" derivate. Tramite questa classe base è possibile spostare e ridimensionare le forme nonché gestirne l'hit testing. Il polimorfismo consente a DRAWCLI di interagire con oggetti appartenenti a classi diverse tramite l'interfaccia di CDrawObj.

  • Le classi CDrawRect e CDrawPoly sono derivate da CDrawObj. CDrawRect viene utilizzata per disegnare rettangoli, rettangoli arrotondati, ellissi e linee. CDrawPoly viene invece utilizzata per disegnare poligoni. Le due classi sono indipendenti dalla funzionalità contenitore ActiveX di DRAWCLI.

  • Anche la classe CDrawOleObj è derivata da CDrawObj e viene utilizzata per la rappresentazione degli oggetti incorporati. CDrawOleObj non esegue direttamente le operazioni specifiche di ActiveX. Tali operazioni vengono delegate a un oggetto CDrawItem contenuto, descritto di seguito. Per le operazioni generiche sulle forme, gli oggetti incorporati vengono considerati come gli altri oggetti forma in DRAWCLI, perché CDrawOleObj è derivata da CDrawObj.

  • La classe CDrawItem, derivata da COleClientItem, gestisce il comportamento specifico ActiveX dell'oggetto incorporato. L'implementazione di CDrawItem è simile a quella delle classi derivate da COleClientItem illustrate negli esempi CONTAINER e OCLIENT.

  • La classe CDrawDoc è derivata da COleDocument. L'oggetto COleDocument gestisce un CObList di oggetti CDrawObj. CDrawDoc delega le operazioni associate a numerosi comandi di menu specifici del contenitore ActiveX, tra cui Modifica Incolla, Incolla collegamento e Collegamenti, alla classe base COleDocument.

  • La classe CDrawView è derivata da CScrollView. L'implementazione di CDrawView specifica di ActiveX è simile a quella delle classi visualizzazione illustrate negli esempi CONTAIN e OCLIENT. Anche la maggior parte delle funzionalità dell'interfaccia utente di DRAWCLI specifiche delle operazioni di disegno è implementata in CDrawView.

Parole chiave

Nell'esempio vengono illustrate le seguenti parole chiave:

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:

Alcuni esempi, tra cui il presente, non sono stati cambiati per riflettere le modifiche apportate alle procedure guidate, alle librerie e al compilatore di Visual C++, tuttavia forniscono comunque le istruzioni per completare l'attività desiderata.

Vedere anche

Altre risorse

Esempi relativi ad MFC