Этот пример очень вдохновлен решением Benoit_11, но немного усовершенствован. У меня также создалось впечатление, что три разные функции в вашем обратном вызове делали разные вещи, поэтому я сделал 3 разных меню, изменяя разные свойства линии (вместо того, чтобы изменять одно и то же свойство с разными значениями).
Я сделал обратный вызов uimenu в одной вложенной функции. Он решает, что делать на основе параметра what2do
, предоставленного в определении uimenu (но не стесняйтесь хранить 3 отдельные функции). Однако обратите внимание, что функция, которая переключает галочку, одинакова для всех uimenu (вам не нужна отдельная функция для каждого из них).
function hf = TestUiContext2
%// Extension of Benoit_11 solution
clear ; clc ; close all
hf = figure ; %// return the handle of the figure
hax = axes; %// Create axes and save handle
plot(rand(20,3)); %// Plot three lines
hcmenu = uicontextmenu; %// Define a context menu; it is not attached to anything
%// Define the context menu items and install their callbacks
item1 = uimenu(hcmenu, 'Label','Bold line' , 'Callback' , {@uiCallback,'bold'});
item2 = uimenu(hcmenu, 'Label','Dotted line' , 'Callback' , {@uiCallback,'dots'});
item3 = uimenu(hcmenu, 'Label','Markers on' , 'Callback' , {@uiCallback,'mark'});
hlines = findall(hax,'Type','line'); %// Locate line objects
for line = 1:length(hlines) %// Attach the context menu to each line
set(hlines(line),'uicontextmenu',hcmenu)
end
function uiCallback(obj,~,what2do)
hline = gco ;
switch what2do
case 'bold'
toggle_bold_line(hline)
case 'dots'
toggle_dotted_line(hline)
case 'mark'
toggle_markers(hline)
end
%// reposition the context menu and make it visible
set(hcmenu,'Position',get(gcf,'CurrentPoint'),'Visible','on')
toggle_checkmark(obj) %// toggle the checkmark
end
function toggle_checkmark(obj)
if strcmp(get(obj,'Checked'),'on')
set(obj,'Checked','off')
else
set(obj,'Checked','on')
end
end
function toggle_bold_line(hline)
if get(hline,'LineWidth')==0.5
set(hline,'LineWidth',2)
else
set(hline,'LineWidth',0.5)
end
end
function toggle_dotted_line(hline)
if strcmpi(get(hline,'LineStyle'),':')
set(hline,'LineStyle','-')
else
set(hline,'LineStyle',':')
end
end
function toggle_markers(hline)
if strcmpi(get(hline,'Marker'),'none')
set(hline,'Marker','o')
else
set(hline,'Marker','none')
end
end
end
Теперь вы можете наслаждаться тикают все свое меню на одном дыхании;)
Nice один, и вы можете также изменить положение меню, а также сделать его видимым: 'набор (hcmenu,«Позиция» , get (gcf, 'CurrentPoint'), 'Visible', 'on') 'поэтому он появляется в той же позиции;) – Hoki
Да, я подумал об этом @Hoki, но я использовал get (0, 'PointerLocation') и он не работал, поэтому я сдался и лег спать ха-ха :). Хорошее решение на вашей стороне +1! –
Это может сработать, но с обходом. 'get (0, 'PointerLocation')' вернуть позицию "на экране". Тогда вам придется перевести это в координаты фигуры. – Hoki