Листинг 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 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;
}
|