Начало » Конспекты школьника » Часть 2 » [Учимся программировать!][Изучаем события]
Учимся программировать!
Конспекты школьника.
www.klyaksa.net
Изучаем события, связанные с
активностью мыши
Давайте попробуем разобраться, как
происходит рисование с помощью мыши в
графических редакторах.
Запускайте Visual Basic, создайте стандартный
проект. Установите свойства формы: Имя (Name) -
frmPaint, Caption - "Рисование на форме".
Обычно рисование происходит при движении
мыши, т.е. нашему приложению необходимо
обрабатывать событие MouseMove, которое
сообщает, что мышь перемещается по окну
приложения. Добавим следующий код:
Private Sub Form_MouseMove(Button As Integer, Shift As
Integer, X As Single, Y As Single)
frmPaint.PSet (X, Y)
End Sub
Запустим приложение. При движении мыши по
форме остается след из точек.
Но след должен оставаться, только если при
движении мыши нажата левая кнопка мыши.
Добавим это условие в код приложения.
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
If Button = 1 Then frmPaint.PSet (X, Y)
End Sub
Если запустить только что созданную
программу, то можно обнаружить небольшую
проблему. Проблема состоит в том, что для
того, чтобы нарисовать сплошную линию, нам
необходимо двигать курсор мыши очень медленно.
Как с этой проблемой справляются другие
графические приложения? Очень просто. Они
соединяют линией две соседние точки
положения мыши. Это может показаться
странным, но именно так работают
графические редакторы.
Во время движения мыши по экрану
компьютер проверяет положение мыши через
небольшие промежутки времени. Поскольку
компьютер не имеет возможности отследить
все положения мыши, то необходимо делать
некоторые предположения о ее
местонахождении. Это предположение
выражается в том, что компьютер
предполагает, что мышь двигалась по прямой
между теми двумя точками, положение
компьютеру известно. Когда вы рисуете на
компьютере с помощью мыши, компьютер ведет
себя именно так.
Повторим этот метод в нашем приложении.
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As
Single, Y As Single)
If Button = 1 Then frmPaint.Line -(X, Y)
End Sub
Почти хорошо. Однако появилась неприятная
особенность. Каждый раз, когда мы нажимаем
кнопку мыши для того, чтобы начать рисовать
новый фрагмент, приложение соединяет
линией точку окончания предыдущего
фрагмента с началом нового. Для этого нам
понадобится знать начальное положение
курсора мыши, при нажатии кнопки. Объявим
две глобальные переменные в секции (General)(Declarations).
Dim intPrevX As Integer
Dim intPrevY As Integer
Теперь перепишем процедуру обработки
события MouseMove и добавим обработку события
MouseDown.
Dim intPrevX As Integer
Dim intPrevY As Integer
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As
Single)
If Button = 1 Then
intPrevX = X
intPrevY = Y
End If
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As
Single)
If Button = 1 Then frmPaint.Line (intPrevX, intPrevY)-(X, Y)
intPrevX = X
intPrevY = Y
End Sub
Готово! Запускаем приложение и радуемся
результату.
Радуемся, радуемся, но если приложение
свернуть и обратно развернуть (или на время
закрыть другим окном) изображение исчезнет.
Избавиться от этой неприятности просто:
установите свойство формы AutoRedraw равным true
и окно будет перерисовываться
автоматически.
Теперь, на закуску, создадим цветной
рисунок.
По умолчанию будем использовать черный
цвет. Другие цвета можно будет включит
нажав на определенную клавишу на
клавиатуре, вернутся к черному цвету нажав
на любую другую клавишу.
Текущий цвет будем хранить в переменной
Color типа Long (Длинное целое число от 32147483648 до +2147483647).
Значение переменной можно задать
различными способами:
- присвоив какое-то числовое значение (Color
= 12345; Color = &H80000018);
- с помощью констант (Color = vbBlack);
- с помощью функции QBColor() (Color = QBColor(3));
- С помощью функции RGB() (Color = RGB(255,255,255)).
Дополним уже имеющийся код:
Dim intPrevX As Integer
Dim intPrevY As Integer
Dim Color As Long
Private Sub Form_KeyPress(KeyAscii As Integer)
Select Case Chr$(KeyAscii)
Case "1"
Color = RGB(255, 0, 0)
Case "2"
Color = RGB(0, 255, 0)
Case "3"
Color = RGB(0, 0, 255)
Case Else
Color = RGB(0, 0, 0)
End Select
lColor = RGB(0, 0, 0)
End Sub
Private Sub Form_Load()
Color = RGB(0, 0, 0)
End Sub
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
intPrevX = X
intPrevY = Y
End If
End Sub
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Print lColor
If Button = 1 Then frmPaint.Line (intPrevX, intPrevY)-(X, Y),
Color
intPrevX = X
intPrevY = Y
End Sub
Одним из наиболее используемых событий формы является Load. Это
событие происходит при загрузке формы в память. Поэтому Load лучше
всего подходит для инициализации объектов и переменных,
принадлежащих форме.
Готово!
предыдущий урок
:: содержание :: следующий
урок
|