09.04.2016 Views

Priemioop

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Проектирование редактора документов<br />

Подклассы Windowlmp<br />

Подклассы Windowlmp преобразуют запросы в операции, характерные для<br />

конкретной оконной системы. Рассмотрим пример из раздела 2.2. Мы определили<br />

Rectangle: : Draw в терминах операции DrawRect над экземпляром класса<br />

Window:<br />

void Rectangle::Draw (Window* w) {<br />

w->DrawRect(_xO, _yO, _xl, _yl);<br />

}<br />

В реализации DrawRect по умолчанию используется абстрактная операция<br />

рисования прямоугольников, объявленная в Windowlmp:<br />

void Window: : DrawRect (<br />

Coord xO, Coord yO, Coord xl, Coord yl<br />

) {<br />

_imp->DeviceRect (xO , yO , xl , yl) ;<br />

}<br />

где _imp - переменная-член класса Window, в которой хранится указатель на<br />

объект Windowlmp, использованный при конфигурировании Window. Реализация<br />

окна определяется тем экземпляром подкласса Windowlmp, на который указывает<br />

_imp. Для XWindowImp (то есть подкласса Windowlmp для оконной системы<br />

X Window System) реализация DeviceRect могла бы выглядеть так:<br />

void XWindowImp::DeviceRect (<br />

Coord xO, Coord yO', Coord xl, Coord yl<br />

) {<br />

int x = round(min(xO, xl));<br />

int у = round(min(yO, yl));<br />

int w = round(abs(xO - xl));<br />

int h = round(abs(yO - yl));<br />

XDrawRectangle(_dpy, _winid, _gc, x, y, w, h) ;<br />

}

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!