Проектирование графического интерфейса пользователя______________255

Таблица 4,1. Последовательность событий мыши при переключении
фокуса

Действие пользователя      _____Событие____________________

Перемещение курсора мыши в преде-  Множество событий OnMouseMove в
лах первого компонента              первом компоненте______'______

Перемещение курсора мыши в преде-  Множество событий OnMouseMove в
лах формы                         форме^                 ______

Перемещение курсора мыши в преде-  Множество событий OnMouseMove во
лах второго компонента              втором компоненте______________

Нажатие кнопки мыши              OnExit в первом компоненте  _
OnEnter во втором компоненте
OnMouseDown во втором компоненте

Отпускание кнопки мыши            OnClick во втором компоненте
j                          '         OnMouseUp во втором компоненте

События OnMouseMove происходят постоянно в процессе перемещения курсо-
ра мыши и даже просто при его дрожании, неизбежном, если пользователь не сни-
мает руки с мыши. Это надо учитывать и пользоваться этим событием очень осто-
рожно, поскольку оно, в отличие от других, происходит многократно.

Как видно из приведенной таблицы, каждое действие пользователя, связанное
с нажатием или отпусканием кнопки мыши приводит к серии последовательно на-
ступающих событий. В обработчиках событий OnMouseDown и OnMouseUp можно
распознать, какая кнопка мыши нажата и в какой точке компонента находится в
данный момент курсор мыши.

Рассмотренная в таблице 4.1 последовательность событий имеет место, если во
втором компоненте свойство DragMode (см. раздел 4.4) равно dmManual (ручное
начало процесса перетаскивания), как это установлено по умолчанию. Если же это
свойство равно dmAutomatic (автоматическое начало процесса перетаскивания),
то все рассмотренные события, связанные с манипуляцией мышью, заменяются
следующими:

OnMouseDown Заменяется на OnStartDrag

OnMouseMove Заменяется на событие OnDragOver того компонента, над ко-
торым перемещается курсор мыши

OnMouseUp    Заменяется на событие OnDragDrop компонента, над которым
завешается перетаскивание (если компонент может воспри-
нять информацию от перетаскиваемого объекта), и последую-
щее событие OnEndDrag компонента, который перетаскивался

События OnExit и OnEnter вообще не возникают, поскольку переключения
фокуса не происходит. Не наступает также событие OnClick.

В дальнейшем в данном разделе события, связанные с перетаскиванием, рас-
сматриваться не будут. Подробное описание этих событий см. в разделе 4.4.

Если в примере, приведенном в таблице 4.1, щелчок делается на объекте, ко-
торый уже находится в этот момент в фокусе, то не происходят события OnExit и
OnEnter. В этом случае при нажатии кнопки наступает только событие OnMouse-
Down, а при отпускании кнопки — события OnClick и OnMouseUp.