Создание приложений OLE 2
(Том Сван, "Освоение Borland C++4.5")
В этом разделе вы создадите два новых
приложения OLE. Первое - простая программа-сервер
OLE, второе - пример простого контейнера OLE. Эти
программы предназначены для демонстрации
минимальных затрат программирования,
необходимых для создания приложений OLE 2.
В любом случае, для создания оболочки
программы следует воспользоваться приложением
AppExpert. Сначала необходимо сгенерировать основу
приложения в AppExpert, затем модифицировать
созданные файлы для создания законченного
рабочего примера.
При написании своих версий этих
программ необходимо иметь в виду несколько
моментов. Во-первых, в этой главе приводятся
листинги только исходных, немодифицированных
файлов.
Во-вторых, CLSID этих программ будет
отличаться от CLSID программ, которые вы
сгенерируете с помощью AppExpert. Это нормально и
даже необходимо, поскольку с помощью CLSID одни
серверные приложения в Windows отличаются от других.
В-третьих, эти примеры содержат минимум
необходимых средств для того, чтобы начать
программировать с OLE. Вы можете использовать эти
примеры в качестве начального кода для создания
своего действительно полезного сервера или
контейнера. В этой главе просто не хватает места
для описания реализации функциональных сервера
и контейнера - в этом случае вам понадобился бы
грузоподъемник, чтобы положить эту книгу на стол.
Создание сервера OLE
Первое приложение OLE в этой главе -
сервер. В этом примере вы построите полный сервер
- сервер, который может использоваться и как
автономное приложение, и как сервер. Создавая
автономный сервер (т.е. в виде исполняемой
программы .ЕХЕ, а не в виде динамически
подключаемой библиотеки DLL), вы упрощаете процесс
регистрации сервера в Windows.
Начальный процесс разработки сервера
прост. Сначала из интегрированной среды Borland C++
версии 4.5 запустите AppExpert. Задайте каталог и имя
вашего проекта. Я поместил свой проект в каталог
\BC45\SOURCE\OLESVR. Проект я назвал OLESVR (я всегда называю
проекты и каталоги проектов одним и тем же
именем, это облегчает запоминание). Ниже
приводится последовательность действий, в
результате которых был создан проект OLESVR.
- Запустите AppExpert. В первом диалоговом окне
следует задать имя и каталог проекта. Как уже
отмечалось, я использовал OLESVR для задания обоих.
- После выбора ОК в диалоговом окне имени и
каталога проекта следующий раздел АррЕхреrt -
диалоговое окно Application General Options (основные
опции приложения). Это диалоговое окно позволяет
задать конфигурацию приложения, генерируемого
AppExpert. Вам придется модифицировать несколько
опций для проекта OLESVR.
- Первая опция, которую необходимо изменить,
находится в блоке Application: Summary. Замените
параметр по умолчанию Multiple document interface на Single
document interface. Это изменение согласуется с
призывом Microsoft делать ставку на однодокументные
приложения для Windows. На рис. 21.1 демонстрируется
модифицированный блок Application: Summary.
- Второе изменение, которое необходимо внести, -
указать AppExpert, что ваша программа будет сервером
OLE. Это изменение вносится в пункт Application: OLE 2
Options, имеющий ряд опций OLE 2, которые можно
задавать. Поскольку вы создаете сервер OLE, вы
будете оперировать только элементами блока
группы OLE 2 Server: (поищите его в правой верхней
части диалога). Выберите кнопку ячейки пометки Server
EXE. На рис. 21.2 демонстрируются изменения,
проведенные в пункте Application:OLE 2 Options.
- При желании вы можете заполнить элементы пункта
Application: Admin Options блока диалога AppExpert. С его
помощью вы можете задать в приложении заметку об
авторском праве, имя и информацию о версии. Все
элементы в Application: Admin Options необязательны, и вы
можете их не задавать.
Подпункты пункта Main Window не нуждаются
в модификациях, их следует оставить заданными
значениями по умолчанию. Для данного приложения
нет необходимости менять что-либо в этих
подпунктах. Пункт MDI Child/View неприменим для этого
проекта, поэтому нет нужды в нем что-нибудь
менять.
После задания всех необходимых
модификаций следует выбрать кнопку Generate в нижней
части блока диалога AppExpert Application General Options.
AppExpert запросит у вас подтверждение,
действительно ли вы собираетесь создать проект;
после принятия подтверждения AppExpert сгенерирует
приложение. На рис. 21.3 приводится конечный
проект, загруженный в интегрированную среду Borland
C++ версии 4.5.
Рис. 21.3. Проект OLESVR загружен в интегрированную
среду Borland C++ версии 4.5
Теперь, когда программа
сгенерирована, в нее следует добавить код,
задающий функциональность сервера OLE. Необходимо
включить код, рисующий изображение, а также
провести другие незначительные изменения.
К счастью, помимо Borland C++ версии 4.5 можно
воспользоваться программой ClassExpert, что облегчит
внесение большей части изменений. Предположим,
вы хотите сперва заняться вопросами отображения.
Как и в любой созданной с помощью AppExpert программе,
основная часть рисования выполняется классом
отображения, производным от класса OWL TOleView. Файл,
в котором содержится реализация отображения,
имеет имя LSVROLVW.CPP. В листинге 21.1 приводится
первоначальный файл OSROLVW.CPP.
Листинг 21.1 (файл реализации класса отображения
OLESVR, OSVROLVW.CPP)
/* проект olesvr
Авторское право _ 1994
ПОДСИСТЕМА: Приложение olesvr.exe
ФАЙЛ: svrolvw.cpp
Исходный файл реализации olesvrOleView (TOleView)
*/
#include <owl\owlpch.h>
#pragma hdrstop
#include "olsvrapp.h"
#include "Isvrolvw. h"
#include <stdio.h>
// Реализация olesvrOleView
// Создать таблицу для всех сообщений/команд,
поддерживаемых olsvrOleView,
// производным от TOleView
DEFINE_RESPONSE_TABLE1 (olesvrOleView, TOleView)
// olesvr0leViewRSP_TBL_BEGIN
EV_WM_GETMINMAXINFO,
EV_OC_VIEWSHOWTOOLS,
// olesvr0leViewRSP_TBL_END
END_RESPONSE_TABLE;
///////////////////////////////////////////////////////////////
// olesvrOleView
// Обработка создания/уничтожения
olesvrOleView::olesvrOleView (TDocument& doc, TWindow* parent)
: TOleView(doc, parent)
{
ToolBar = 0;
// ВСТАВИТЬ >> В этом месте код вашего
конструктора
}
olesvrOleView::~olesvrOleView ()
{
// ВСТАВИТЬ>> В этом месте код вашего
деструктора
}
//
// Процедура рисования для Window, Printer и PrintPreview
клиента TOleView
//
void olesvrOleView::Paint (TDC& dc, bool erase, TRect& rect)
{
olesvrApp *theApp = TYPESAFE_DOWNCAST(GetApplication(), olesvrApp);
if (theАрр) {
// рисовать только в случае, если необходимо
что-нибудь напечатать или отобразить,
// иначе не производить никаких действий
if (theApp->Printing && theApp->Printer && !
rect.IsEmpty()) {
// использовать pageSize для получения размера окна
для визуализации информации
// для Window - это рабочая область,
// для принтера - это размеры контекста устройства
и
// для print preview - это окно формата
TSize pageSize( rect. right - rect. left, rect. bottom
- rect. top);
TPrintDialog::TData &printerData =
theApp->Printer->GetSetup();
// вычислить число страниц, которые необходимо
напечатать
printerData.MinPage = 1;
printerData.MaxPage = 1;
TOcView *ocView = GetOcView();
// Рисование TOcPart по умолчанию
TRect CLientRect = GetClientRect();
TRect logicalRect = clientRect +
(TSize&)ocView->GetOrigin();
for (TOcPartCollectionlter
i(GetOcDoc()->GetParts()); i; i++) {
TOcPart& p = *i.Current();
if (p.IsVisible(logicalRect)) {
TRect r = p.GetRect();
r -= ocView->GetOrigin();
p.Draw(dc, r, clientRect); //
Нарисовать внедренный объект
if (p.IsSelected()) {
TUIHandle
handle(r, TUIHandle::HandlesIn | TUIHandle::Grapples |
TUIHandle::HatchBorder, 5);
handle. Paint(dc);
} else {
TUIHandle handle(r,
TUIHandle::HatchBorder, 5);
handle. Paint(dc);
}
}
}
// ВСТАВИТЬ>> В этом месте выполняется печать
TOleView::Paint(dc, erase, rect);
} else {
// ВСТАВИТЬ>> В этом месте выполняется обычное
рисование
}
dc.TextOut(0, 30, "olesvr OLE Server");
}
}
void olesvrOleView::EvGetMinMaxInfo (MINMAXINFO far& minmaxinfo)
{
olesvrApp *theApp = TYPESAFE_DOWNCAST(GetApplication(), olesvrApp);
if (theApp) {
if (theApp->Printing) {
minmaxinfo.ptMaxSize = TPoint( 32000, 32000);
minmaxinfo.ptMaxTrackSize = TPoint(32000, 32000);
return;
}
}
TOleView::EvGetMinMaxInfo(minmaxinfo);
}
bool olesvrOleView::EvOcViewShowTools (TOcToolBarlnfo far& tbi)
{
// Сконструировать и создать панель управления
для отображения, уничтожить
// нашу панель для сокрытия
if (tbi.Show) {
if (!ToolBar) {
ToolBar = new TControlBar(this);
olesvrApp *theApp =
TYPESAFE_DOWNCAST(GetApplication(), olesvrApp);
CHECK(theApp);
theApp->CreateGadgets(ToolBar, true);
}
ToolBar->Create();
tbi.HTopTB = (HWND) *ToolBar;
} else {
if (ToolBar) {
ToolBar->Destroy();
delete ToolBar;
ToolBar = 0;
}
}
return true;
}
|
|