В 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 (на тот случай, если необходимо
проводить какие либо вычисления, а
прямоугольника в наличии нет).
- Ну и в заключение, процедуры смещения и
изменения размеров. В данном примере эти
процедуры применены только к ПЕРВОМУ
прямоугольнику. Это сделано чтобы не было чрезмерного
загромождения однотипными блоками и не
ухудшалось восприятие самих функций. По тем
же причинам не показана обработка
правильности вводимого значения (допустимы
только целые числа, как положительные, так и
отрицательные).
| Назад | Далее | Скачать пример |