Overwrite the function handle with a newer state?

2 views (last 30 days)
I am currently learning from Matt Fig's 41 GUIs. What I do not understand is why he writes this line: set(ln,'buttondownfcn',{@ax_bdfcn,S})? (it is from GUI_18). Not doing this way, clicking on the line does not generate a new one. However I would like to see what this line of code exactly does. Could anybody help me?
P.s. the same syntax is used in GUI_7.
Thanks in advance.
function [] = GUI_18()
% Demonstrate the use of the buttondownfcn for an axes.
% Clicking on the axes creates a random line. Note that clicking on the
% line does the same thing. This must be accounted for in the coding
% below, or clicking on the line would do nothing. Right click to delete
% the line.
%
% An exercise would be to alter the code so that right clicking recreates
% the plot in another figure window. This could be done at least two
% different ways.
%
%
% Author: Matt Fig
% Date: 7/15/2009
S.fh = figure('units','pixels',...
'position',[200 200 200 200],...
'menubar','none',...
'numbertitle','off',...
'name','GUI_18',...
'resize','off');
S.ax = axes('units','pixels',...
'position',[30 30 160 160],...
'fontsize',8,...
'buttondownfcn',{@ax_bdfcn,S},...
'nextplot','replacechildren');
function [] = ax_bdfcn(varargin)
% buttondownfcn for axes.
[h,S] = varargin{[1,3]}; % Extract the calling handle and structure.
% We need to account for when the user clicks the line instead of the axes.
if ~strcmpi(get(h,'type'),'axes')
h = findobj('children',h); %
end
seltype = get(S.fh,'selectiontype'); % Right-or-left click?
switch seltype
case 'alt'
cla % Delete the line.
case 'normal'
ln = plot(h,sort(rand(1,10))); % Plot a new line.
set(ln,'buttondownfcn',{@ax_bdfcn,S})
otherwise
% Do something else for double-clicks, etc.
end
Here starts GUI_7
function [] = GUI_7()
% Demonstrate how to store choice counters for multiple user choices.
% Creates a popup with two choices and a textbox to display the number of
% times each choice has been made.
%
%
% Author: Matt Fig
% Date: 7/15/2009
S.fh = figure('units','pixels',...
'position',[300 300 300 100],...
'menubar','none',...
'name','GUI_7',...
'numbertitle','off',...
'resize','off');
S.tx = uicontrol('style','tex',...
'unit','pix',...
'position',[10 15 280 20],...
'backgroundcolor',get(S.fh,'color'),...
'fontsize',12,'fontweight','bold',...
'string','OPTION 1: 0 OPTION 2: 0');
S.pp = uicontrol('style','pop',...
'unit','pix',...
'position',[10 60 280 20],...
'backgroundc',get(S.fh,'color'),...
'fontsize',12,'fontweight','bold',...
'string',{'option 1';'option 2'},'value',1);
S.CNT = [0 0]; % Holds the number of times each option has been called.
set(S.pp,'callback',{@pp_call,S}); % Set the callback.
function [] = pp_call(varargin)
% Callback for popupmenu.
S = varargin{3}; % Get the structure.
P = get(S.pp,'val'); % Get the users choice from the popup.
S.CNT(P) = S.CNT(P) + 1; % Increment the counter.
set(S.tx, 'string', sprintf('OPTION 1: %i OPTION 2: %i', S.CNT));
set(S.pp,'callback',{@pp_call,S}); % Save the new count.

Accepted Answer

Jan
Jan on 25 Aug 2013
ln = plot(h,sort(rand(1,10))); % Plot a new line.
set(ln,'buttondownfcn',{@ax_bdfcn,S})
The first line draws the lines, while the 2nd line defined the ButtonDownFcn of the created line. This function is called, when the user clicks on the line. Then Matlab performs:
ax_bdfcn(ln, EventData, S)
  1 Comment
Zoltán Csáti
Zoltán Csáti on 25 Aug 2013
Thank you. So after the command
set(ln,'buttondownfcn',{@ax_bdfcn,S})
ax_bdfcn function is called again, but this time - as you wrote - with ax_bdfcn(ln, EventData, S) so
if ~strcmpi(get(h,'type'),'axes')
h = findobj('children',h);
end
will take effect and therefore we always get the handle of the figure instead of the line. Am I right?

Sign in to comment.

More Answers (0)

Categories

Find more on Interactive Control and Callbacks in Help Center and File Exchange

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!