Листинг 21.1 (файл реализации класса
отображения OLESVR, OSVROLVW.CPP)
/* проект olesvr
Авторское право _ 1994
ПОДСИСТЕМА: Приложение olesvr.exe
ФАЙЛ: svrolvw.cpp
Исходный файл реализации olesvrOleView
(TOleView)
*/
#include
<owlowlpch.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::HatchBorder, 5); 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;
}
|