【发布时间】:2011-12-15 15:34:37
【问题描述】:
matlab 函数 getline(图像处理工具箱)在双击或按回车键或空格键时返回折线的位置(先前已用光标定义)。
由于我的黄油手指和意外双击,我想删除双击结束的能力。
我需要更改哪些部分,或者我应该注意哪些功能,我什至不知道在 matlab 中是如何定义双击的。
干杯!
【问题讨论】:
标签: user-interface matlab image-processing input
matlab 函数 getline(图像处理工具箱)在双击或按回车键或空格键时返回折线的位置(先前已用光标定义)。
由于我的黄油手指和意外双击,我想删除双击结束的能力。
我需要更改哪些部分,或者我应该注意哪些功能,我什至不知道在 matlab 中是如何定义双击的。
干杯!
【问题讨论】:
标签: user-interface matlab image-processing input
MATLAB 将“回调”函数与图形对象相关联,这些对象定义了在单击鼠标、按下键等时要执行的操作。在 getline() 中,要查看的部分是 NextButtonDown() 子函数。这是与第一次鼠标按下以启动线路后的后续鼠标按下相关联的回调。关键是检查SelectionType 图形属性,双击将是open。在这种情况下,它会关闭该图。因此,要禁用该功能,只需删除额外的大小写和检查逻辑。这是我的 r2009b 版本的差异:
306,310d305
< selectionType = get(GETLINE_FIG, 'SelectionType');
< if (~strcmp(selectionType, 'open'))
< % We don't want to add a point on the second click
< % of a double-click
<
322,328d316
<
< end
<
< if (~strcmp(get(GETLINE_FIG, 'SelectionType'), 'normal'))
< % We're done!
< set(GETLINE_H1, 'UserData', 'Completed');
< end
【讨论】:
@JohnColby提供的答案通过编辑GETLINE.m函数文件解决了你的问题。基本上,您注释掉检查是否执行了双击的每一行。该信息通过查询'SelectionType'图形属性获得。
或者,如果您像我一样讨厌更改内置函数,那么请考虑以下不涉及更改任何现有函数的解决方案。以下是我们如何使用它的示例:
h = addlistener(handle(gcf), 'WindowButtonDownFcn', 'PostSet', @changedWBDFcn);
[x,y] = getline();
delete(h)
plot(x,y, 'Color','r')
这个想法是创建一个事件侦听器,当'WindowButtonDownFcn' 图形属性更改时触发该侦听器。我们用它来插入一个在之前设置的回调函数之前被调用的函数(实际上我们用我们自己的函数替换了回调,最后调用了旧的回调函数)。
这允许我们插入一个检查调用是否由双击触发的部分,并简单地跳过此类事件。
这必须执行两次,因为 GETLINE 在第一次点击时首先调用 FirstButtonDown,这会将 NextButtonDown 设置为在后续点击时调用,因此使用 flag 变量来区分这两种情况。
上述事件监听函数的代码:
function changedWBDFcn(src,ev,flag)
hFig = ev.AffectedObject; %# figure handle
currFcn = ev.NewValue; %# current callback function
delete(src); %# delete event listener
if nargin < 3, flag = false; end %# determine flag
%# hijack WindowButtonDownFcn function
set(hFig, 'WindowButtonDownFcn',{@wbdFcn,currFcn,flag})
%# callback function
function wbdFcn(o,e,currFcn,flag)
%# skip anything but single-clicks
if ~strcmpi(get(hFig,'SelectionType'),'normal')
return
end
%# evaluate previous callback function
hgfeval(currFcn) %# getline('FirstButtonDown'),getline('NextButtonDown')
%# repeat process after first click
if flag
addlistener(handle(hFig), 'WindowButtonDownFcn', ...
'PostSet', {@changedWBDFcn,true});
end
end
end
【讨论】: