Образец HIERSVR: демонстрация серверного приложения с перетаскиванием OLE
Обновлен: Ноябрь 2007
Образец HIERSVR служит примером серверного приложения визуального редактирования, которое поддерживает связанные объекты и редактирование объектов по месту их расположения. Кроме того, это приложение представляет "полнофункциональный" сервер и может непосредственно открывать и сохранять файлы. Объект HIERSVR представляет многоуровневую иерархическую схему, где каждый узел иерархии состоит из текста, окруженного прямоугольником или другими фигурами. Образец HIERSVR демонстрирует функции сервера, а также перетаскивание OLE и копирование в буфер обмена.
Примечание о безопасности. |
---|
Этот образец кода служит для демонстрации основных принципов и не предназначен для использования в приложениях или на веб-узлах, поскольку не может считаться примером наиболее безопасного кода. Корпорация Майкрософт не несет ответственности за случайные или косвенные убытки в случае использования образца кода не по назначению. |
Чтобы получить образцы и инструкции по их установке, выполните следующие действия.
В меню Справка среды Visual Studio выберите пункт Примеры.
Дополнительные сведения см. в разделе Поиск файлов примеров.
Самая последняя версия и полный список образцов доступны в Интернете на странице образцов Visual Studio 2008.
Кроме того, образцы находятся на жестком диске компьютера. По умолчанию образцы кода и файл Readme копируются в папку, находящуюся в папке \Program Files\Visual Studio 9.0\Samples\. Все образцы кода для экспресс-выпусков Visual Studio находятся в Интернете.
Построение и запуск образца
Построение и запуск образца HIERSVR
Откройте решение hiersvr.sln.
В меню Построение выберите команду Построить.
Запустите HIERSRV в виде изолированного приложения, чтобы оно зарегистрировалось в системе.
Схемы HIERSRV
В HIERSVR редактируются и отображаются документы или объекты, имеющие тип иерархической схемы с одиночным наследованием. Для каждого узла на схеме, за исключением корневого, существует только один родительский узел. Каждый родитель может иметь несколько потомков. Примером иерархической схемы являются организационная схема компании и список классов MFC, поскольку в них не используется множественное наследование C++. Файл Mfcclass.hie включен в качестве примера документа HIERSVR.
Каждый узел в иерархии обладает минимальным набором атрибутов.
Description — текст, состоящий из 30 или менее символов.
Shape — стиль прямоугольника, который окружает текст: прямоугольник, прямоугольник со скругленными углами или овальный прямоугольник.
Item Key Link (необязательно) — имя, используемое для ссылки на связанный элемент. Если этот атрибут не указан, по умолчанию используется строка описания. Это имя выводится, когда ссылка просматривается с помощью команды Edit Links в клиентском приложении.
Создание схемы HIERSVR
Новая диаграмма HIERSVR начинается с одного узла с текстом "Root node". Чтобы добавить узел, сначала выберите родительский узел, щелкнув его мышью. Затем выберите команду Add Node в меню Edit. В диалоговом окне Add Node укажите три атрибута, описанных выше. Чтобы изменить атрибуты узла, выберите его щелчком мыши, а затем выберите команду Change Node. Чтобы переместить узел, щелкните его и перетащите в новое расположение.
Образец HIERSVR выполнит импорт данных о иерархии из текстового файла, имеющего следующий формат: текст в каждой строке (отделяемой символом перевода строки) является значением атрибута Description для каждого узла. Число знаков табуляции перед текстом определяет уровень узла в иерархии. Файл Mfcclass.txt в каталоге образца HIERSVR является текстовым файлом импорта для схемы Mfcclass.hie, собственного файла HIERSVR.
Чтобы связать иерархическую схему с клиентским документом, сначала нужно сохранить файл в приложении HIERSVR. Затем выберите узел для копирования с помощью команды Edit Copy. Ссылка будет скопирована в буфер обмена. Текст выбранного узла также будет скопирован в буфер обмена в формате CF_TEXT, и вся иерархия узлов будет скопирована в собственном формате буфера обмена HIERSVR. Необходимо сохранить документ, поскольку для формата ссылки требуется наличие имени документа. Наконец, в клиентском приложении выберите команду Edit Paste Link (или команду Paste Link в меню Edit Paste Special). Ссылка появится в клиентском документе в виде узла, выбранного перед выполнением команды Edit Copy. Также будет показан прямоугольник.
Чтобы внедрить иерархическую схему в клиентский документ, можно использовать процедуру работы с буфером обмена, аналогичную показанной выше процедуре для связывания объекта, или выбрать команду Insert New Object в клиентском приложении. Если выбран вариант с буфером обмена, в клиентском приложении используйте команду Edit Paste, а не Edit Paste Link. В клиентский документ будет внедрена только вложенная иерархия, начинающаяся с выбранного узла.
Независимо от способа добавления схемы (связывание или внедрение) в окне клиентского приложения будет отображаться только верхний выбранный узел. Чтобы показать остальную часть схемы, необходимо запустить HIERSVR из клиентского приложения, дважды щелкнув верхний элемент.
Сервер визуального редактирования
В HIERSVR показано наследование классов, необходимое для реализации полнофункционального серверного приложения визуального редактирования, и приведены примеры наиболее распространенных пользовательских интерфейсов клиентского приложения, для которых необходим дополнительный код.
Далее показаны три класса платформы, использованные для реализации серверного приложения визуального редактирования.
Объект COleTemplateServer, хранящийся в переменной m_server, являющейся членом класса приложения HIERSVR.
Класс HIERSVR CServerDoc, производный от COleServerDoc.
Класс HIERSVR CServerItem, производный от COleServerItem.
Класс HIERSVR CInPlaceFrame, производный от класса COleIPFrameWnd, который вначале создается мастером приложений.
Ключевые слова
В этом образце показаны следующие ключевые слова:
AfxGetMainWnd; AfxMessageBox; AfxOleInit; AfxThrowMemoryException; AfxThrowNotSupportedException; AfxThrowResourceException; CArchive::Close; CCmdTarget::BeginWaitCursor; CCmdTarget::EndWaitCursor; CCmdUI::Enable; CCmdUI::SetCheck; CControlBar::EnableDocking; CControlBar::GetBarStyle; CControlBar::SetBarStyle; CDC::GetDeviceCaps; CDC::LPtoDP; CDC::LPtoHIMETRIC; CDC::SelectObject; CDC::SetMapMode; CDC::SetViewportExt; CDC::SetWindowExt; CDialog::DoModal; CDialog::OnInitDialog; CDocTemplate::SetServerInfo; CDocument::DeleteContents; CDocument::GetFirstViewPosition; CDocument::GetNextView; CDocument::OnNewDocument; CDocument::SetModifiedFlag; CDocument::UpdateAllViews; CFile::Open; CFileDialog::DoModal; CFileDialog::GetPathName; CFontDialog::DoModal; CFontDialog::GetColor; CFrameWnd::Create; CFrameWnd::DockControlBar; CFrameWnd::EnableDocking; CFrameWnd::LoadFrame; CMenu::GetSubMenu; CMenu::LoadMenu; CMenu::TrackPopupMenu; CObList::AddHead; CObList::AddTail; CObList::GetCount; CObList::GetHeadPosition; CObList::GetNext; CObList::GetTail; CObList::RemoveAll; CObList::RemoveAt; CObject::AssertValid; CObject::Dump; CObject::Serialize; COleDataObject::AttachClipboard; COleDataObject::GetFileData; COleDataObject::IsDataAvailable; COleIPFrameWnd::OnCreateControlBars; COleLinkingDoc::OnGetLinkedItem; COleServerDoc::GetItemPosition; COleServerDoc::IsInPlaceActive; COleServerDoc::OnDeactivateUI; COleServerDoc::OnGetEmbeddedItem; COleServerDoc::OnSetItemRects; COleServerDoc::RequestPositionChange; COleServerDoc::UpdateAllItems; COleServerItem::CopyToClipboard; COleServerItem::DoDragDrop; COleServerItem::GetClipboardData; COleServerItem::GetDataSource; COleServerItem::GetDocument; COleServerItem::GetItemName; COleServerItem::IsLinkedItem; COleServerItem::OnDraw; COleServerItem::OnGetClipboardData; COleServerItem::OnGetExtent; COleServerItem::OnOpen; COleServerItem::OnRenderFileData; COleServerItem::SetItemName; COleTemplateServer::ConnectTemplate; COleTemplateServer::UpdateRegistry; CPen::CreatePen; CRect::BottomRight; CRect::Height; CRect::InflateRect; CRect::IntersectRect; CRect::OffsetRect; CRect::PtInRect; CRect::Size; CRect::TopLeft; CScrollView::GetDeviceScrollPosition; CScrollView::ScrollToPosition; CScrollView::SetScrollSizes; CString::Empty; CString::GetLength; CString::IsEmpty; CToolBar::Create; CToolBar::LoadBitmap; CToolBar::SetButtons; CView::GetDocument; CView::OnDragEnter; CView::OnDragLeave; CView::OnDragOver; CView::OnDraw; CView::OnDrop; CView::OnInitialUpdate; CView::OnPrepareDC; CView::OnUpdate; CWinApp::AddDocTemplate; CWinApp::EnableShellOpen; CWinApp::ExitInstance; CWinApp::InitInstance; CWinApp::LoadStdProfileSettings; CWinApp::RegisterShellFileTypes; CWnd::ClientToScreen; CWnd::DoDataExchange; CWnd::GetClientRect; CWnd::GetParentFrame; CWnd::Invalidate; CWnd::InvalidateRect; CWnd::OnCreate; CWnd::OnKeyDown; CWnd::OnLButtonDblClk; CWnd::OnLButtonDown; CWnd::OnRButtonDown; CWnd::OnSize; CWnd::SetOwner; CWnd::ShowWindow; CWnd::UpdateWindow; CreateFontIndirect; DragAcceptFiles; EnableWindow; ExtTextOut; GetDeviceCaps; GetSysColor; GetTextExtent; GetWindowTextLength; IsChild; LPtoDP; LineTo; LoadBitmap; MoveTo; MulDiv; RGB; RectVisible; Rectangle; RegisterClipboardFormat; RoundRect; SelectObject; SetTextColor; SetViewportExt; SetWindowExt; SetWindowOrg; _alloca; afxMemDF; lstrcpy; memset; min; strnlen; wcstombs
Примечание. |
---|
Некоторые образцы, включая данный, не модифицировались с учетом изменений в мастерах, библиотеках и компиляторе Visual C++, однако по-прежнему демонстрируют выполнение требуемой задачи. |