设置Matlab WindowButtonDownFcn并保留默认行为

时间:2019-05-22 14:56:07

标签: matlab matlab-figure undocumented-behavior

我可以在保留默认行为的同时手动设置WindowButtonDownFcn并有选择地覆盖鼠标右键或中键吗?最终目标是单击鼠标即可将图形复制到剪贴板。

set(gcf,'WindowButtonDownFcn',@(src,~) disp(src.SelectionType)); %this seemingly always overwrites default behavior of figure click

我尝试了以下错误消息(向右滚动)

listener(gcf,'WindowButtonDownFcn',@(src,~) disp(src.SelectionType)) %Event 'WindowButtonDownFcn' is not defined for class 'matlab.ui.Figure'.
listener(get(gcf,'parent'),'WindowButtonDownFcn',@(src,~) disp(src.SelectionType)) %Event 'WindowButtonDownFcn' is not defined for class 'matlab.ui.Root'
handle(gcf).addlistener(handle(gcf),'WindowButtonDownFcn',@(src,~) disp(src.SelectionType)) %Unrecognized method, property, or field 'addlistener' for class 'matlab.ui.Figure'.

以及使用handleevent.listener进行的其他多个排列均未成功

在Matlab 2019a中测试。

编辑:这是一个模板函数,可与基于matlabgui的同类答案的修饰符一起使用

%copies figure to clipboard when [control]+[right-click] anywhere on figure window (and leaving default functionality intact)
figure; plot(randi(100,1,100)) %random figure
addlistener ( gcf, 'WindowMousePress', @(src,~) myFavFunc(src,[]))

function myFavFunc(src,~)
if strcmp(src.SelectionType,'alt') && numel(src.CurrentModifier)==1 &&  strcmp(src.CurrentModifier,'control')
    print -clipboard -dmeta
    disp('copied figure to clipboard')
end
end

1 个答案:

答案 0 :(得分:2)

我不知道为什么Matlab隐藏一些数字事件,您可以在此处获得列表:

  hFig = figure;
  mc = metaclass(hFig);
  disp ( {mc.EventList.Name}' ) ;

然后,您可以从该信息中为鼠标按下事件添加一个侦听器:

hFig = figure;
addlistener ( hFig, 'WindowMousePress', @(src,~)disp('myCallback' ))

这将保留标准的图形回调,而不是disp命令让它运行一个函数,您可以在其中查看图形属性SelectionType以确定按下哪个鼠标按钮。您可以扩展它以使用CurrentModifier属性来确定是否按下CtrlShiftAlt来进一步自定义它。