MATLAB:修改getline()以删除'双击'结束输入'功能

时间:2011-10-26 11:01:58

标签: user-interface matlab image-processing input

matlab函数getline(图像处理工具箱)通过双击或按返回键或空格键返回折线(之前已使用光标定义)的位置。

由于我的黄油手指和不小心双击,我想删除双击结束的能力。

我需要更改哪些部分,或者我应该注意哪些功能,我无法找到如何在matlab中定义双击。

干杯!

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

@JohnColby提供的答案通过编辑GETLINE.m函数文件解决了您的问题。基本上,您会注释掉检查是否执行了双击的每一行。通过查询'SelectionType'数字属性获得此信息。


或者,如果您像我一样并且您讨厌对内置函数进行更改,请考虑以下不涉及更改任何现有函数的解决方案。以下是我们如何使用它的示例:

h = addlistener(handle(gcf), 'WindowButtonDownFcn', 'PostSet', @changedWBDFcn);
[x,y] = getline();
delete(h)

plot(x,y, 'Color','r')

我们的想法是创建一个在'WindowButtonDownFcn' figure属性更改时触发的事件侦听器。我们使用它来插入一个在之前设置的回调函数之前被调用的函数(实际上我们用我们自己的函数替换回调,该函数在最后调用旧函数)。

这允许我们插入一个部分来检查是否通过双击触发了呼叫,并且只是跳过这样的事件。

这必须完成两次,因为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