Поделиться через


Образец DRAWCLI: демонстрация интеграции поддержки активных контейнеров с функциями для работы с приложениями

Обновлен: Ноябрь 2007

Образец DRAWCLI представляет объектно-ориентированное приложение с функциями рисования и поддержкой контейнеров визуального редактирования. Этот образец наряду с другими образца активных контейнеров MFC — CONTAINER, OCLIENT и DRAWCLI — служит лучшим вариантом иллюстрации для интеграции поддержки активных контейнеров с функциями для работы с приложениями (в этом случае — с функциями рисования). Кроме того, в образце DRAWCLI показано эффективное использование полиморфизма C++ в разработке классов "фигур" и "инструментов рисования" (CDrawObj и CDrawTool).

9t94971d.alert_security(ru-ru,VS.90).gifПримечание о безопасности.

Этот образец кода служит для демонстрации основных принципов и не предназначен для использования в приложениях или на веб-узлах, поскольку не может считаться примером наиболее безопасного кода. Корпорация Майкрософт не несет ответственности за случайные или косвенные убытки в случае использования образца кода не по назначению.

Чтобы получить образцы и инструкции по их установке, выполните следующие действия.

  • В меню Справка среды Visual Studio выберите пункт Примеры.

    Дополнительные сведения см. в разделе Поиск файлов примеров.

  • Самая последняя версия и полный список образцов доступны в Интернете на странице образцов Visual Studio 2008.

  • Кроме того, образцы находятся на жестком диске компьютера. По умолчанию образцы кода и файл Readme копируются в папку, находящуюся в папке \Program Files\Visual Studio 9.0\Samples\. Все образцы кода для экспресс-выпусков Visual Studio находятся в Интернете.

Построение и запуск образца

Построение и запуск образца DRAWCLI

  1. Откройте решение drawcli.sln.

  2. В меню Построение выберите команду Построить.

  3. В каталоге Отладка проекта откройте и запустите приложение DRAWCLI.

Функции эмблемы Windows в DRAWCLI

В DRAWCLI также показаны требования, необходимые для получения эмблемы Windows. Все приложения MFC выполняют часть требований для получения эмблемы Windows: исполняемый файл Win32, поддержка длинных имен файлов, поддержка путей в формате UNC и использование системных цветов и метрик. Образец DRAWCLI выполняет и остальные требования для получения эмблемы Windows, включая следующие функции.

  • Поддержка ActiveX. Образец DRAWCLI является активным контейнером, хранящим файлы в составном формате, поддерживающим активацию на месте и выступающим в качестве назначения для операций перетаскивания.

  • Поддержка MAPI. Образец DRAWCLI содержит команду "Send as Mail" в меню File, которая дает пользователю возможность отправить документ в виде почтового вложения.

  • Выполнение требований к оболочке, включая регистрацию больших и маленьких значков, использование системного реестра вместо INI-файла и наличие программы для установки и удаления. Для задач установки и удаления в DRAWCLI входит сценарий, совместимый с набором средств InstallSHIELD, разработанным Stirling Software для создания программ установки и удаления.

DRAWCLI также выполняет следующие рекомендации для приложений Windows.

  • Использование страниц свойств со вкладками.

  • Использование общих элементов управления Windows.

  • Открытие контекстного меню в ответ на щелчок правой кнопкой мыши.

  • Хранение сводных данных вместе с документами.

Пользовательский интерфейс DRAWCLI аналогичен другим объектно-ориентированным программам рисования.

Интеграция поддержки активных контейнеров с функциями для работы с приложениями

Образец DRAWCLI первоначально представлял изолированное приложения с функциями рисования, разработанной с помощью классов MFC. Затем изолированная версия DRAWCLI была интегрирована со второй базовой версией DRAWCLI, созданной с помощью функции контейнера ActiveX в мастере приложений. Этот процесс аналогичен добавлению серверной поддержки в SCRIBBLE посредством сервера визуального редактирования ActiveX.

Структура контейнерного приложения MFC ActiveX должна выглядеть в целом одинаковой независимо от того, добавляются ли функции ActiveX к существующему изолированному приложению MFC (с документами и представлениями) или сначала запускается контейнерное приложение ActiveX, созданное мастером приложений. Далее представлено краткое описание процесса разделения DRAWCLI на код, относящийся к приложению, и код, относящийся к контейнеру ActiveX.

  • Класс CDrawObj, реализованный в файле Drawobj.cpp, является базовым для производных классов "фигур". Этот базовый класс выполняет проверку нажатия фигур, обрабатывает перемещение фигур и изменение их размера. Применение полиморфизма позволяет DRAWCLI взаимодействовать с другими объектами различных классов по интерфейсу CDrawObj's.

  • Классы CDrawRect и CDrawPoly являются производными от CDrawObj. Класс CDrawRect используется для рисования прямоугольников, прямоугольников со скругленными углами, эллипсов и линий. Класс CDrawPoly используется для рисования полигонов. Эти два класса не зависят от функций контейнера ActiveX в приложении DRAWCLI.

  • Класс CDrawOleObj также является производным от CDrawObj и используется для представления внедренных объектов. Класс CDrawOleObj делегирует все операции, относящиеся к ActiveX, в объект CDrawItem, который содержится в контейнере (как описано ниже). Для универсальных операций с фигурами внедренные объекты обрабатываются аналогично другим объектам фигур в DRAWCLI, поскольку класс CDrawOleObj является производным от CDrawObj.

  • Класс CDrawItem, производный от COleClientItem, обрабатывает все действия, относящиеся к ActiveX, для внедренного объекта. Реализация CDrawItem аналогична реализации классов, производных от COleClientItem, в образцах CONTAINER и OCLIENT.

  • Класс CDrawDoc является производным от COleDocument. Объект COleDocument ведет список CObList объектов CDrawObj. Класс CDrawDoc делегирует несколько команд меню, относящихся к контейнеру ActiveX, таких как Edit Paste, Paste Link и Links, в базовый класс COleDocument.

  • Класс CDrawView является производным от CScrollView. Реализация функций ActiveX в классе CDrawView аналогична реализации классов представления в образцах 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

9t94971d.alert_note(ru-ru,VS.90).gifПримечание.

Некоторые образцы, включая данный, не модифицировались с учетом изменений в мастерах, библиотеках и компиляторе Visual C++, однако по-прежнему демонстрируют выполнение требуемой задачи.

См. также

Другие ресурсы

Примеры MFC