Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
65-96.doc
Скачиваний:
5
Добавлен:
11.11.2019
Размер:
340.99 Кб
Скачать

Размер рисунка и параметры окна прокрутки

Если переместить бегунок прокрутки (см. рис. 4.1), то MFC-класс CScrollView обеспечит соответствующую прокрутку рисунка. Например, при перемещении бегунка вертикальной полосы вниз MFC прокручивает рисунок к нижней части. Аналогично, когда пользователь перемещает бегунок горизонтальной полосы прокрутки вправо, MFC прокручивает рисунок к правому краю. Следовательно, библиотеке MFC должна быть передана информация о размерах рисунка.

В переменной типа SIZE можно хранить размеры рисунка в виде прямоугольника, ограничивающего рисунок.

Напомним, что первой функцией, к которой обращается приложения, является функция CView::OnInitialUpdate(). Она выполняет инициализацию объекта представления. Если функция переопределена в производном классе представления, то она вызывает функцию OnUpdate() производного класса или OnInitialUpdate() базового класса после того, как полностью создано окно представления, перед выполнением рисования с помощью функции CMуPaintView::OnDraw(). Именно в ней следует задать режим отображения (преобразования) координат (mapping mode) и размер рисунка для вывода его в окно представления с прокруткой.

При обновлении окна представления данных в результате изменения размера документа необходимо регулировать параметры прокрутки. Для этого используется функция SetScrollSizes() класса CScrollView. Именно эта функция устанавливает режим отображения координат и задает размер логического окна.

Прототип функции такой:

void SetScrollSizes( int nMapMode, SIZE sizeTotal, const SIZE& sizePage = sizeDefault, const SIZE& sizeLine = sizeDefault );

Рис. 4.4. Режим отображения MM_TEXT

Первый параметр nMapMode задает режим отображения и является атрибутом рисунка, сохраняемый объектом контекста устройства. Режим отображения определяет систему координат и единицы измерения, используемые для вывода текста и графики. Программа MуPaint (как и другие программы в данной книге) использует режим отображения MM_TEXT, в котором все единицы заданы в пикселах, горизонтальные координаты увеличиваются в направлении вправо, а вертикальные – вниз (рис. 4.4). В других главах будут рассмотрены другие режимы отображения. Если необходимо масштабировать изображение таким образом, чтобы оно вписывалось в некоторый заданный размер, или установить другое направление вертикальной оси координат (поменять направление возрастания координаты Y), то для контекста устройства нужно выбрать другой режим отображения. Перечень режимов отображения координат приводится в табл.В1 приложения В.

Вторым параметром (sizeTotal) функции SetScrollSizes() является размер рисунка.

Если щелкнуть кнопкой мыши на полосе прокрутки (но не на кнопке со стрелкой или бегунке), то окно представления прокручивается на одну страницу. По умолчанию страница равна 1/10 размера документа в направлении прокрутки. Если щелкнуть на кнопке со стрелкой в полосе прокрутки, то окно представления прокручивается на одну строку. По умолчанию строка равна 1/10 страницы. Прокручиваемые расстояния можно настроить, передав требуемые размеры страницы и строки в третьем (sizePage) и четвертом (sizeLine) параметрах функции CScrollView::SetScrollSizes () 

Если вместо функции SetScrollSizes() из функции OnInitialUpdate() вызвать функцию SetScaleToFitSize(), то текст и графика в окне представления масштабируются таким образом, чтобы весь документ помещался внутри текущего окна представления. Поскольку такое масштабирование устраняет потребность в прокрутке, полосы прокрутки будут отсутствовать

В программе MуPaint размер документа постоянен. Если приложение изменяет размер документа (например, при вводе или удалении данных), то необходимо вызвать функцию SetScrollSizes () класса CScrollView. Лучше всего это сделать внутри функции CView::OnUpdate() класса представления, вызываемой при каждом изменении данных в документе.

Для определения текущих горизонтальных и вертикальных размеров окна прокрутки используется функция CScrollView::GetTotalSize(), которая возвращает объект класса CSize с размерами документа, заданными при вызове функции CScrollView::SetScrollSizes(). Прототип функции такой:

CSize GetTotalSize();

Так как классу представления передается сообщение мыши, то ее курсор должен находиться внутри окна представления. Для проверки попадания курсора мыши в заданную прямоугольную область используется функция CRect::PtInRect(). Функция имеет следующий прототип:

BOOL PtInRect(POINT point);

Параметром функции является указатель на структуру POINT или объект класса CPoint, которые определяют координаты (x,y) точки. Объявление структуры приведено ниже.

typedef struct tagPOINT {   LONG x;   LONG y; } POINT;

Функция CRect::PtInRect() возвращает значение TRUE, если координаты курсора попадают в заданную прямоугольную область. Если курсор находится за ее пределами, работа функции завершается.

Перемещение курсора в процессе рисования должно ограничиваться областью пересечения рисунка и окна представления. За пределами области рисунка линии не должны отображаться. Глобальная функция ::ClipCursor()ограничивает перемещение курсора прямоугольной областью, указатель на которую передается ей в качестве параметра. Прототип функции следующий:

BOOL ClipCursor(CONST RECT *lpRect);

Для определения прямоугольной области, в пределах которой будет перемещаться курсор в процессе рисования, используется функция, определяющая область, общую для рисунка и окна представления. Ее можно определить как результат пересечения двух прямоугольников в результате вызова функции CRect::IntersectRect().Прототип функции такой:

BOOL IntersectRect( LPCRECT lpRect1, LPCRECT lpRect2 );

Параметрами являются указатели на структуру RECT или объекты класса CRect, определяющие размеры исходных прямоугольников. В нашем случае мы будем рассматривать два прямоугольника, определяющие область рисунка и окно представления. Функция CRect::IntersectRect() возвращает ненулевое значение, если результат пересечения — не пустой объект.

Для получения размеров окна представления вызывают функцию CWnd::GetClientRect(), поскольку окно представления накладывается на клиентскую область главного окна. Прототип функции задается так:

void GetClientRect( LPRECT lpRect );

Параметр функции — указатель на структуру RECT или объект класса CRect. Координаты левого верхнего угла определяются как 0, координаты правого нижнего угла прямоугольника содержат ширину и высоту окна.

Прямоугольник, определяющий размеры рисунка, может быть задан с помощью конструктора класса CRect:

CRect( int left, int top, int right, int bottom );

Параметры конструктора определяют координаты левого верхнего и правого нижнего углов прямоугольника. Координаты левого верхнего угла имеет смысл задать нулевыми (совпадают с левой верхней вершиной клиентской области). Правая нижняя граница рисунка вычисляется с помощью функции CScrollView::GetTotalSize().

При вызове функции ::ClipCursor(), которая ограничивает перемещение курсора мыши, в качестве аргументов используются координаты устройства. Следовательно, предварительно необходимо преобразовать логические координаты, в которых вычислялись размеры рисунка и окна представления, в координаты устройства. Для этого существует функция CWnd::ClientToScreen(), которая имеет такие прототипы:

void ClientToScreen( LPPOINT lpPoint ) const;

void ClientToScreen( LPRECT lpRect ) const;

Параметр функций — указатель на структуру POINT или объект класса CPoint для первой функции, указатель на структуру RECT или объект класса CRect — для второй. Параметры определяют логические координаты, которые преобразуются в координаты устройства.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]