Существует два свойства, которые определяют, отвечают ли объекты на клики мыши и как:
PickableParts
- Определяет, захватывает ли объект клики мыши
HitTest
- Определяет, может ли объект ответить на захваченный клик мыши или передать нажатие кнопки ближайшему предку.
Объекты передают нажатие кнопки через иерархию объектов до достижения объекта, который может ответить.
Когда объект захватывает и реагирует на клик мыши, объект:
Выполняет функцию опускания кнопки в ответ на щелчок левой кнопкой мыши - если объект задает коллбэк для ButtonDownFcn
свойство, MATLAB® выполняет этот коллбэк.
Отображает контекстное меню в ответ на щелчок правой кнопкой мыши - если объект определил контекстное меню используя ContextMenu
свойство, MATLAB вызывает это контекстное меню.
Примечание
Фигуры не имеют PickableParts
свойство. Фигуры выполняют функции обратного вызова кнопки независимо от настройки их HitTest
свойство.
Примечание
Если оси PickableParts
для свойства задано значение 'none'
Дети осей не могут захватывать клики мыши. При этом все клики мыши захватываются рисунком.
Используйте PickableParts
и HitTest
свойства для реализации следующего поведения:
Объект, нажатый на кнопку мыши, захватывает клик мыши и отвечает с помощью кнопки вниз коллбэка или контекстного меню.
Объект, кликнутый, захватывает клик мыши и передает клик мыши одному из его предков, который может ответить кнопкой вниз коллбэка или контекстным меню.
Объект, выбранный кликом мыши, не захватывает клик мыши. Клик мыши может быть захвачен объектами, расположенными позади объекта, выбранного кликом мыши.
В этой таблице суммируется реакция на клик мыши на основе значений свойств.
Пикетируемые детали осей | PickableParts | HitTest | Результат клика мыши |
---|---|---|---|
видимый/все | видимый (по умолчанию) | on (по умолчанию) | Нажатие по видимым частям объекта выполняет коллбэк кнопки вниз или вызывает контекстное меню |
видимый/все | все | на | Щелчок по любой части объекта, даже если он не отображается, делает объект текущим и выполняет коллбэк вниз кнопки или вызывает контекстное меню |
видимый/all/none | ничего | вкл ./выкл. | Щелчок по объекту никогда не делает его текущим объектом и никогда не может выполнить коллбэк кнопки или активировать контекстное меню |
ничего | видимый/all/none | вкл ./выкл. | Нажатие по всем дочерним объектам осей никогда не выполняет коллбэк кнопки вниз или вызывает контекстное меню |
MATLAB ищет предков с помощью Parent
свойство каждого объекта до нахождения подходящего предка или достижения рисунка.
Рассмотрим следующую иерархию объектов и их PickableParts
и HitTest
настройки свойств.
Этот код создает иерархию:
function pickHit f = figure; ax = axes; p = patch(rand(1,3),rand(1,3),'g'); l = line([1 0],[0 1]); set(f,'ButtonDownFcn',@(~,~)disp('figure'),... 'HitTest','off') set(ax,'ButtonDownFcn',@(~,~)disp('axes'),... 'HitTest','off') set(p,'ButtonDownFcn',@(~,~)disp('patch'),... 'PickableParts','all','FaceColor','none') set(l,'ButtonDownFcn',@(~,~)disp('line'),... 'HitTest','off') end
Щелкните левой кнопкой мыши по линии:
Линия становится текущим объектом, но не может выполнить свою ButtonDownFcn
коллбэк, потому что его HitTest
свойство off
.
Линия передает удар ближайшему предку (родительским осям), но оси не могут выполнить его ButtonDownFcn
коллбэк, поэтому оси передают удар на рисунок.
Рисунок может выполнить свой коллбэк, поэтому MATLAB отображает figure
в Командном окне.
Область закрашенной фигуры FaceColor
является none
. Однако закрашенная фигура PickableParts
является all
, так что можно выбрать закрашенную фигуру, щелкнув пустую грань и ребро.
Область закрашенной фигуры HitTest
свойство on
таким образом, закрашенная фигура может стать текущим объектом. Когда закрашенная фигура становится текущим объектом, он выполняет обратный коллбэк вниз своей кнопки.