Читая Эпплмана

Пример 4. Работаем с прямоугольниками и точками.

В Windows все (или почти все) окна представлены прямоугольниками. Поэтому прежде чем переходить к работе с окнами, необходимо познакомиться с функциями, ответственными за работу с прямоугольниками. Таких (основных) функций 11.
Функция Описание
CopyRect Копирует содержимое одного прямоугольника в другой
EqualRect Возвращает TRUE (число отличное от нуля), если прямоугольники равны
InflateRect Увеличивает или уменьшает размер прямоугольника на заданное число пикселей. Допускается ввод отрицательных значений
IntersectRect Вычисляет прямоугольник, являющийся пересечением 2-х прямоугольников. В новый прямоугольник включаются все точки, присутствующие в обоих исходных прямоугольниках.
IsRectEmpty Возвращает TRUE (число отличное от нуля), если прямоугольник пуст
OffsetRect Перемещает прямоугольник на заданное число пикселей. Допускается ввод отрицательных значений
PtInRect Определяет, принадлежит ли заданная точка прямоугольнику.
SetRect Задает значения полей прямоугольника посредством вызова функции (вместо прямого присваивания
SetRectEmpty Обнуляет все поля прямоугольника, делая его пустым
SubtractRect Выполняет вычитание прямоугольников.
UnionRect Вычисляет прямоугольник, являющийся объединением 2-х прямоугольников. Результат представляет собой наименьший прямоугольник, полностью включающий оба исходных прямоугольника.

Данные функции используют для некоторых своих аргументов тип RECT, описывающий координаты прямоугольника (верхний левый и нижний правый углы):
Type RECT
    left As Long
    top As Long
    right As Long
    bottom As Long
End Type

Кроме того, достаточно часто используется другой тип POINTAPI. Данный тип описывает горизонтальную и вертикальную координаты конкретной точки:
Type POINTAPI
    X As Long
    Y As Long
End Type

Теперь о том, как пользоваться примером. Как и ранее, я произвел русификацию форм и комментариев, удалил код, относящийся к Win16 и сделал маленькие добавления, чтобы показать использование всех функций. Увеличена толщина линий при рисовании для большей наглядности.

В модуле перечисляются все функции, типы, а также глобальные переменные, которые будут использоваться в программе. 
В форме: Чтобы работать с программой выберите меню Режим/Прямоугольник1 и начертите первый прямоугольник. Выбрав меню Режим/Прямоугольник2 начертите второй прямоугольник, так, чтобы он пересекался с первым.
Сама методика рисования достаточно проста и эффективна. Она заключается в трех процедурах: Picture1_MouseDown, Picture1_MouseMove и Picture1_MouseUp. Внимательно изучите эти коды, потом Вы сможете неоднократно использовать их в своих программах для создания "резиновых" линий при изменении границ элементов. 
- Вначале задаются координаты первой точки и устанавливается режим рисования "исключающее ИЛИ" (DrawMode=vbNotXorPen). 
- Затем при перетаскивании мыши стирается старый прямоугольник, рисуется новый и запоминается конечная точка.
- При отпускании клавиши мыши - стираем старый прямоугольник, рисуем новый, запоминаем координаты конечной точки. В зависимости от выбранного меню передаем значения начальной и конечной точек первому или второму прямоугольникам. Или (если выбрано меню работы с Точкой) в соответствующую процедуру. Восстанавливаем исходный режим рисования и обновляем графическое поле.
Что здесь можно (и нужно) дополнить для реальных программ, так это проверка того какая клавиша мыши нажата.

Событие Picture1_Paint так же не представляет особых сложностей. Вначале с помощью API-функций получаем пересечение и объединение 2-х исходных прямоугольников, а затем рисуем полученные результаты каждый своим цветом.

Процедура работы с точкой (DoPointDisplay) получает координаты точки и, в зависимости от того, к каким прямоугольникам она относится (проверяется с помощью API-функции PtInRect) выводит соответствующее сообщение.

Вот и все, что предложил Эпплман. Теперь немного о том, что добавил я:
- В меню вид добавлена обработка функции вычитания  прямоугольников(SubtractRect). Принцип работы у нее абсолютно такой же как и у функций объединения и пересечения.
- Добавлено стирание прямоугольников (меню Удалить). Здесь используется функция SetRectEmpty, которой передается один единственный параметр, указывающий какой из прямоугольников необходимо стереть. Но вначале проверяется существует данный прямоугольник или нет. В данной ситуации это не обязательно, так как функция SetRectEmpty при отсутствии прямоугольника просто ничего выполнять не будет. Проверка здесь приведена как пример использования функции IsRectEmpty (на тот случай, если необходимо проводить какие либо вычисления, а прямоугольника в наличии нет).
- Ну и в заключение, процедуры смещения и изменения размеров. В данном примере эти процедуры применены только к ПЕРВОМУ прямоугольнику. Это сделано чтобы не было чрезмерного загромождения однотипными блоками и не ухудшалось восприятие самих функций. По тем же причинам не показана обработка правильности вводимого значения (допустимы только целые числа, как положительные, так и отрицательные).

 
Назад Далее Скачать пример

Hosted by uCoz