如何检查uicontextmenu是否可见或有效

时间:2016-04-14 09:08:09

标签: matlab matlab-figure

我有什么:

在Matlab-GUI中,我有一个连接到图(=轴)的uicontextmenu。如果我通过鼠标单击(右键)“激活”这个,我可以使用通常的“回调”来做一些事情,比如突出显示情节。如果用户然后选择菜单的uimenu元素之一,我可以使用此uimenu元素的回调并重置突出显示。 但是如果用户没有选择元素,则存在问题。上下文菜单消失了,如果发生这种情况,我找不到找出方法。在我的示例中,突出显示的图表保持突出显示。

到目前为止我尝试了什么:

除了阅读文档之外,我还将属性的监听器附加到某些uimenu元素,例如:

addlistener(mymenu_element, 'Visible', 'PostSet', @mytest);

但是这个属性以及其他属性似乎在任何时候都不会被改变或触及 - 有点让我感到惊讶:o

所以问题是:

有没有办法在执行uicontextmenu之后执行一个函数(或者你在上下文菜单“消失”时调用它)?换句话说:如果用户没有选择上下文菜单的元素,那么如何识别它呢?

1 个答案:

答案 0 :(得分:1)

由于您无法听取这些内容(我已经进行了一些测试并得出了相同的结论),您可以通过以不同的方式创建和管理您的uicontextmenu来解决这个问题:

function yourFunction
  % create a figure
  hFig = figure;
  % add a listener to the mouse being pressed
  addlistener ( hFig, 'WindowMousePress', @(a,b)mouseDown(hFig) );
end
function mouseDown(hFig)
  % react depening on the mouse selection type:
  switch hFig.SelectionType
    case 'alt' % right click
      % create a uicontext menu and store in figure data
      hFig.UserData.uic = uicontextmenu ( 'parent', hFig );
      % create the menu items for the uicontextmenu
      uimenu ( 'parent', hFig.UserData.uic, 'Label', 'do this', 'Callback', @(a,b)DoThis(hFig) )
      % assign to the figure
      hFig.UIContextMenu = hFig.UserData.uic;
      % turn visible on and set position
      hFig.UserData.uic.Visible = 'on';
      hFig.UserData.uic.Position = hFig.CurrentPoint;
      % uicontext menu will appear as desired
      % the next mouse action is then to either select an item or
      %  we will capture it below
    otherwise
      % if the uic is stored in the userdata we need to run the clean up 
      %  code since the user has not clicked on one of the items
      if isfield ( hFig.UserData, 'uic' )
        DoThis(hFig);
      end
  end
end
function DoThis(hFig)
  % Your code
  disp ( 'your code' );
  % Clean up
  CleanUp(hFig);
end
function CleanUp(hFig)
  % delete the uicontextmenu and remove the reference to it
  delete(hFig.UserData.uic)
  hFig.UserData = rmfield ( hFig.UserData, 'uic' );
end