5. Принципы построения пользовательского интерфейса
5.1.1. Пример реализации основных оконных функций Обычно для реализации основных функций для работы с окнами требуется графический пакет, поддерживающий работу с областями сложной формы. С каждым окном связываются две такие области - область отсечения, представляющая собой видимую часть окна, и область, требующая перерисовки. Менеджер окон сам определяет окна, у которых область, требующая перерисовки, не пуста, и автоматически генерирует для таких окон запрос на перерисовку соответствующей области.
В случае, когда мы работаем только прямоугольными окнами, все области, возникающие при выполнении над окнами основных операций, являются объединением нескольких прямоугольников, так что для простейшей реализации оконного интерфейса достаточно иметь графическую библиотеку с возможностью отсечения только по прямоугольным областям. В случае, когда область состоит из нескольких прямоугольников, каждый из них по очереди становится областью отсечения и для него выполняется функция перерисовки соответствующего окна.
Ниже приводится пример подобной системы. В ней весь экран разбивается на прямоугольники, являющиеся видимыми частями окон, и все рисование ведется на основе данного разбиения. Если нужно нарисовать содержимое области, то определяются все прямоугольники, имеющие с ней непустое пересечение, для каждого из них устанавливается соответствующая область отсечения (равная пересечению области и прямоугольника) и для соответствующего окна вызывается функция перерисовки.
Использование отсечения только по прямоугольным областям заметно ускоряет и упрощает процесс отсечения, но за это приходится расплачиваться несколькими вызовами функции рисования для областей, являющихся объединением нескольких прямоугольников.
// File view.h //
// Simple windowing system, basic class for all window objects
//
#ifndef__VIEW_ #define __VIEW__
#include <string.h>
#inciude "point.h"
#include "rect.h"
#include "mouse.h"