User interface MATLAB:修改getline()以删除';双击'结束输入;功能
matlab函数getline(图像处理工具箱)通过双击或按return键或空格键返回多段线的位置(先前已使用光标定义) 由于我的黄油手指和不小心双击,我想取消双击结束的功能 我需要更改哪些部分,或者我应该注意哪些函数,我甚至无法找到双击是如何在matlab中定义的 干杯 MATLAB将“回调”函数与图形对象相关联,图形对象定义单击鼠标、按键等时的操作。。在User interface MATLAB:修改getline()以删除';双击'结束输入;功能,user-interface,matlab,image-processing,input,User Interface,Matlab,Image Processing,Input,matlab函数getline(图像处理工具箱)通过双击或按return键或空格键返回多段线的位置(先前已使用光标定义) 由于我的黄油手指和不小心双击,我想取消双击结束的功能 我需要更改哪些部分,或者我应该注意哪些函数,我甚至无法找到双击是如何在matlab中定义的 干杯 MATLAB将“回调”函数与图形对象相关联,图形对象定义单击鼠标、按键等时的操作。。在getline()中,要查看的部分是NextButtonDown()子函数。这是在第一次按下鼠标以启动行之后,与后续鼠标按下关联的回调。关键
getline()
中,要查看的部分是NextButtonDown()
子函数。这是在第一次按下鼠标以启动行之后,与后续鼠标按下关联的回调。关键是检查SelectionType
figure属性,双击该属性将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
306310D305
提供的答案通过编辑函数文件来解决您的问题。基本上,您可以注释掉检查是否执行了双击的每一行。此信息通过查询地物属性获得
P>可选的,如果你像我一样讨厌修改内置函数,那么考虑下面的解决方案,它不涉及改变现有的函数。以下是我们如何使用它的示例:
h = addlistener(handle(gcf), 'WindowButtonDownFcn', 'PostSet', @changedWBDFcn);
[x,y] = getline();
delete(h)
plot(x,y, 'Color','r')
其思想是创建一个事件监听器,当figure属性更改时触发该监听器。我们使用它插入一个函数,该函数在前面设置的回调函数之前被调用(实际上,我们用自己的函数替换回调函数,该函数在最后调用旧函数)
这允许我们插入一个部分,检查调用是否由双击触发,并跳过此类事件
这必须做两次,因为GETLINE first在第一次单击时调用FirstButtonDown
,这将设置NextButtonDown
在后续单击时调用,因此使用标志
变量来区分这两种情况
上述事件侦听器函数的代码:
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
功能更改DWBDFCN(src、ev、标志)
hFig=ev.infectedObject;%#数字手柄
currFcn=ev.NewValue;%#当前回调函数
删除(src);%#删除事件侦听器
如果nargin<3,则flag=false;结束%#确定标志
%#劫持WindowButtonDownFcn函数
设置(hFig,'WindowButtonDownFcn',{@wbdFcn,currFcn,flag})
%#回调函数
功能wbdFcn(o、e、currFcn、标志)
%#跳过任何操作,只跳过单击
if~strcmpi(get(hFig,'SelectionType'),'normal')
返回
结束
%#计算上一个回调函数
hgfeval(currFcn)%#getline('FirstButtonDown')、getline('NextButtonDown'))
%#第一次单击后重复此过程
如果旗
addlistener(句柄(hFig),'WindowButtonDownFcn'。。。
'PostSet',{@changedWBDFcn,true});
结束
结束
结束
您好,谢谢您的帮助,但是,我不得不稍微改变一下(我想),我需要注释掉“selectionType”是“正常”而不是“开放”的情况,即第325行>328行和第288行>290行。但这现在起作用了,谢谢!为此干杯,我首先需要快速而肮脏地完成它,但我稍后会尝试实现它,因为它看起来确实是一种更好的方式。