【问题标题】:MATLAB: Modify getline() to remove 'end input on double-click' functionalityMATLAB:修改 getline() 以删除“双击结束输入”功能
【发布时间】:2011-12-15 15:34:37
【问题描述】:

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

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

我需要更改哪些部分,或者我应该注意哪些功能,我什至不知道在 matlab 中是如何定义双击的。

干杯!

【问题讨论】:

    标签: user-interface matlab image-processing input


    【解决方案1】:

    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
    

    【讨论】:

    • 您好,感谢您的帮助,但是,我不得不稍微不同(我认为),我需要注释掉“selectionType”是“正常”而不是“开放”的情况,即行 325>328 和 288>290。但这现在有效,所以谢谢!
    【解决方案2】:

    @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
    

    【讨论】:

    • 为此干杯,我需要在第一个实例中快速而肮脏地完成它,但我稍后会尝试实现它,因为它似乎是一个更好的方法。
    猜你喜欢
    • 2012-11-12
    • 1970-01-01
    • 2014-06-30
    • 2013-11-09
    • 2011-09-14
    • 1970-01-01
    • 2016-03-19
    • 2013-11-02
    • 1970-01-01
    相关资源
    最近更新 更多