捕获鼠标点击
控制对鼠标点击进行响应的属性
有两个属性可以确定对象是否及如何响应鼠标点击:
PickableParts
- 确定对象是否捕获鼠标点击HitTest
- 确定对象是否响应鼠标点击或将其传递给最近的前代。
对象在层次结构中传递点击,直到有对象对其响应。
对鼠标点击的响应编程
当对象捕获并响应鼠标点击时,该对象执行以下操作:
执行鼠标按下函数以响应鼠标左击操作 - 如果对象为
ButtonDownFcn
属性定义了回调,那么 MATLAB® 执行此回调。显示上下文菜单以响应鼠标右键点击 - 如果对象使用
ContextMenu
属性定义了上下文菜单,那么 MATLAB 调用上下文菜单。
注意
图窗没有 PickableParts
属性。图窗执行按钮回调函数,无论其 HitTest
属性设置如何。
注意
如果坐标区的 PickableParts
属性设置为 'none'
,那么坐标区的子对象无法捕获鼠标点击。这种情况下,所有鼠标点击都会由图窗捕获。
组合使用 PickablePart/HitTest 值
使用 PickableParts
和 HitTest
属性实现以下行为:
被点击的对象捕获鼠标点击,并以按钮按下回调或上下文菜单响应。
被点击的对象捕获鼠标点击,并将鼠标点击传递给它的一个前代,该前代以按钮按下回调或上下文菜单响应。
被点击的对象未捕获鼠标点击。鼠标点击可能由被点击对象背后的对象捕获。
下表总结了基于属性值的鼠标点击响应。
坐标区 PickableParts | PickableParts | HitTest | 鼠标点击结果 |
---|---|---|---|
visible/all | visible (默认值) | on (默认值) | 点击对象可见部分会执行按钮按下回调或调用上下文菜单 |
visible/all | all | on | 点击对象任何部分(即使不可见),也会使该对象成为当前对象并执行按钮按下回调或调用上下文菜单 |
visible/all/none | none | on/off | 点击对象不会使其成为当前对象,而且不会执行按钮按下回调或调用上下文菜单 |
none | visible/all/none | on/off | 点击任何坐标区的子对象都不会执行按钮按下回调或调用上下文菜单 |
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
,因此该补片成为当前对象。当该补片成为当前对象时,它执行其按钮按下回调。