Мышь и стилус в графическом редакторе

Дмитрий Маштаков
  Поговорим не об инструментах графического редактора (то есть, не о карандашах, кистях или окнах ) а о тех устройствах, посредством которых человек раскрывает окна и передвигает по экрану кисти и карандаши.
  Более конкретно - поговорим о мыши и о стилусе.

  Это собственно то, с чем пользователь физически соприкасается, если он замыслил стать художником, и с этой целью скачал программу графического редактора и купил навороченный планшет со стилусом. Или взял его на время у приятеля, чтобы попробовать. 
  Разумеется, будущий художник надеется, что рисовать ему будет удобно. Что ему будет удобно физически иметь дело с тем, что он держит в руке, или с тем, по чему он кликает или проводит пальцами своей руки.
  А для этого и программисты, должны постараться. А для этого они должны иметь кое-какие сведения о мыши и стилусе. Сведения эти могут пригодиться и будущему художнику. Так сказать, для лучшего понимания процесса.

  Как человек управляет компьютером? С точки зрения человека, он управляет им чисто физически - кликает кнопки мыши, передвигает её или ведёт пальцем по пластине ноутбука, прижимает стилус к планшету, или, оторвав от планшета его конец, ведёт стилус по воздуху, перемещая тем не менее указатель по экрану.
  Как же всё это происходит?
  Компьютеру нет дела до конкретных особенностей того, что человек делает со своими "железками", как он держит стилус - в прямых, или согнутых пальцах, высунул ли он язык во время рисования, или пришла ли посмотреть на его рисование кошка.
  Однако, с точки зрения компьютера, человек, действуя чисто физически, совершает иногда действия, приводящие к событиям.

1.  Событием является нажимание кнопки мыши или стилуса. Это событие называется MouseDown.
  Событием является прижимание, возникновение контакта стилуса с поверхностью планшета. это событие называется точно так же - MouseDown.
2.  Событием является отпускание кнопки мыши или стилуса. Это событие называется  MouseUp.
  И точно так же называется событие разрыва контакта стилуса с поверхностью планшета.
3.  Перемещение мыши, или перемещение стилуса по поверхности (или над поверхностью) планшета также является событием, и называется оно MouseMove.

  Работа компьютера состоит в обработке тех событий, которые к нему поступают. Различает он эти события по названиям. И каждый раз, при наступлении любого события - MouseDown, MouseUp или MouseMove, компьютер предоставляет в распоряжение программиста один и тот же набор значений параметров -
 
  (Button As Integer, Shift As Integer, X As Single, Y As Single)

которые можно рассматривать и использовать, как обычные переменные.
  Например, оператор  С=Point(X, Y) передаст переменной С код цвета пикселя, имеющего координаты X,Y.
  Код это представляет собой целое число, получаемое по формуле С=256*256*BB+256*GG+RR
Здесь BB,GG и RR известные Вам числа, обозначающие цвет в программах для рисования (0-255 такие могут быть значения каждого из этих чисел).

  Что касается параметров Button и Shift, то они обозначают номера или состояния кнопок мыши (Button) и состояния клавиш Shift, Ctrl и Alt в тот момент, когда произошло событие. Величины эти получаются побитовым сложением кодов двоичного представления.

Значения Button для событий нажатия или отпускания кнопки:
  1 - нажата/отжата лев.кнопка мыши, или стилус изменил контакт с поверхностью планшета
  2 - нажата/отжата прав.кнопка мыши или верхняя (длинная) кнопка стилуса
  4 - нажата/отжата нижняя (короткая) кнопка стилуса

Состояния Button для события движеня мыши:
  (001) - нажата лев.кнопка мыши, или стилус прижат к к поверхности планшета
  (010) - нажата правая кнопка мыши, или верхняя (длинная) кнопка стилуса
  (100) - нажата нижняя (короткая) кнопка стилуса
 
Состояния Shift при нажатии/отпускании кнопки и движения мыши или стилуса:
  (001) - нажата клавиша Shift на клавиатуре
  (010) - нажата клавиша Ctrl на клавиатуре
  (100) - нажата клавиша Alt на клавиатуре

  Например, если мы удерживаем одной рукой одновременно нажатыми клавиши Shift и Ctrl и ведём стилусом над поверхностью планшета, не касаясь её, то у нас будут непрерывной чередой наступать события MouseMove с параметрами Button=0 и Shift=3, и мы можем обрабатывать их, если хотим. Например так -

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Button=0 And Shift=3 Then
    Print "Перестань баловаться с планшетом и положи стилус на место"
  End If
End Sub

  Для того, чтобы проверить всё это, я сделал небольшую тестовую программку, результат её действия Вы можете видеть вверху, на иллюстрации. При проведении теста я веду мышью с верхней части графического окна в нижнюю его часть. Значение координаты Y при этом движении увеличивается. По ходу дела указатель мыши проходит окрашенную в красный цвет область между  Y=40 и Y=80.
  При наступлении события нажатия/отжатия кнопки программа печатает значения координат Y и Y, значения цвета, и значения параметров Button и Shift.
  Также отслеживается и событие MouseMove, однако параметры, связанные с этим событием выводятся на печать один только раз - как только Y окажется большим числа 40. После этого событие, связанное с движением мыши, продолжает отслеживаться, но информация на печать уже не выводится.
  В примере на иллюстрации я нажал силусом на планшет в верхней части окна и повёл его вниз быстро. Поэтому первую координату, большую чем 40, компьютер пропустил, но сумел обработать следующую  - Y=42 Вы можете видеть это на рисунке. Отрыв стилуса от поверхности планшета был зафиксирован на координате Y=122.
 
  Особенности работы стилуса и мыши я учёл в своей программе графического редактора. Об этом я расскажу в следующей статье. Кстати, изображение стилуса, который находится на иллюстрации в горизонтальном положении, было приведено в такое положение поворотом на 44 градуса из того, что было найдено в интернете. Поворот этот я успешно сделал, использовав свою программу.
  Так что практический толк от моей программы уже есть. ))
__________
     Продолжение тут - http://www.proza.ru/2019/06/14/1740


=====================
ПРИЛОЖЕНИЕ текст тестовой программы

Dim XX1 As Integer, YY1 As Integer, XX2 As Integer, YY2 As Integer
Dim BB As Integer, GG As Integer, RR As Integer, KK As Integer

Private Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Picture1.Line (0, 40)-(200, 80), vbRed, BF: KK = 0
    Line (0, 0)-(3890, 1000), vbWhite, BF: CurrentY = 0: CurrentX = 0
    Print X; Y;:  XX2 = XX1: YY2 = YY1: XX1 = X: YY2 = Y
    Print " color ";: Call cRGB(Picture1.Point(X, Y)): Print BB; GG; RR;
    Print " Butt= "; Button;: Print " Sh= "; Shift
End Sub

Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  If Y > 40 And KK = 0 Then
    Print X; Y;:  XX2 = XX1: YY2 = YY1: XX1 = X: YY2 = Y
    Print " color ";: Call cRGB(Picture1.Point(X, Y)): Print BB; GG; RR;
    Print " Butt= "; Button;: Print " Sh= "; Shift
    KK = 1: End If
End Sub

Private Sub Picture1_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Print X; Y;:  XX2 = XX1: YY2 = YY1: XX1 = X: YY2 = Y
    Print " color ";: Call cRGB(Picture1.Point(X, Y)): Print BB; GG; RR;
    Print " Butt= "; Button;: Print " Sh= "; Shift
End Sub

Private Sub cRGB(C As Long)
Dim Co As Long, C1 As Long, C2 As Long
  Co = C: C1 = Int(Co / 256): C2 = Int(C1 / 256)
  BB = C2: GG = C1 - C2 * 256: RR = Co - C1 * 256
End Sub
_______
скачать программу тест мыши можно здесь - http://yadi.sk/d/H4zn3D2R3hcTdw
а программу Графический редактор, тут - http://yadi.sk/d/bd3PVYUko3qdEA