Как удалить определенные опции uicontextmenu в MATLAB (например, в меню легенды) - PullRequest
0 голосов
/ 22 октября 2018

Итак, у меня есть легенда (на сюжете) в приложении, над которым я работаю.Если щелкнуть по нему правой кнопкой мыши, появится множество дополнительных действий.К ним относятся такие вещи, как «Интерпретатор», «Местоположение», «Ориентация» и т. Д. Я знаю, что можно перезаписать это меню, установив свое собственное uicontextmenu set(axes,'uicontextmenu',newmenu), но как вы просто отредактируете его?Что, если я хочу запретить пользователю изменять местоположение легенды, но ничего больше?

Возможна ли такая настройка?Вот код, который я тестировал / возился с этим.

x = 1:20;
y = cos(x);
z = sin(x);
plot(x,y);
hold on
plot(x,z);
lg = legend('stuff1','stuff2');
% remove the menu altogether
%set(lg,'uicontextmenu','')

Я использую R2014b

РЕДАКТИРОВАТЬ: Чтобы быть полностью ясным, я хочу иметь возможность удалить некоторые параметры изсуществующее uicontextmenu (которое я не создал явно), но не все.

1 Ответ

0 голосов
/ 22 октября 2018

Первое, что вам нужно сделать, это установить свойство ShowHiddenHandles корневого объекта в 'on', что сделает скрытые маркеры обнаруживаемыми.Затем вы можете просто сделать следующее:

>> hMenu = get(lg, 'UIContextMenu')  % Get the context menu handle

hMenu = 

  ContextMenu with properties:

    Callback: ''
    Children: [12×1 Menu]  % This would be empty if handles were still hidden

  Show all properties

>> hItems = get(hMenu, 'Children')  % Get the menu item handles

hItems = 

  12×1 Menu array:

  Menu    (scribe:legend:mcode)
  Menu    (scribe:legend:propedit)
  Menu    (scribe:legend:orientation)
  Menu    (scribe:legend:location)
  Menu    (scribe:legend:interpreter)
  Menu    (scribe:legend:font)
  Menu    (scribe:legend:linewidth)
  Menu    (scribe:legend:edgecolor)
  Menu    (scribe:legend:color)
  Menu    (scribe:legend:edittitle)
  Menu    (scribe:legend:delete)
  Menu    (scribe:legend:refresh)

>> delete(hItems(4));  % Delete the fourth item

Вышесказанное также можно сделать с точечной нотацией для доступа к свойству, например:

delete(lg.UIContextMenu.Children(4));

Кроме того, вы можете оставить дескрипторы скрытымии используйте findall, который требует, чтобы вы знали некоторые свойства объекта, который вы ищете.Например, чтобы найти и удалить объект меню со свойством 'Label', установленным на 'Location' на текущем рисунке, сделайте следующее:

delete(findall(gcf, 'Label', 'Location'));

И для всего вышеперечисленного вы можете подтвердить, что "Опция «Расположение» теперь отсутствует в контекстном меню:

enter image description here

...