Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VB уроки.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
592.38 Кб
Скачать

Урок 2. Изучаем события, связанные с активностью мыши

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

Запускайте 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 лучше всего подходит для инициализации объектов и переменных, принадлежащих форме.

Готово!