http://www.cnblogs.com/duanp/archive/2008/11/29/Matlab-GUIDE.html
函數調用
在一個m文件中,可以定義多個函數,但是文件名一定要與第一個函數(主函數)一致,
該文件中其他函數則為本文件的私有函數,外部不可訪問(可以通過參數調用的方法訪問,下面會描述)。
例如在一個程序中,創建一個fig后,會生成這樣一個m文件:
function varargout =febirdfun(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name', mfilename, ...
'gui_Singleton', gui_Singleton, ...
'gui_OpeningFcn', @febirdfun_OpeningFcn, ...
'gui_OutputFcn', @febirdfun_OutputFcn, ...
'gui_LayoutFcn', [], ...
'gui_Callback', []);
if nargin && ischar(varargin{1})
gui_State.gui_Callback = str2func(varargin{1});
end
if nargout
[varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
gui_mainfcn(gui_State, varargin{:});
end
解析 一下這個主函數:首先 gui_State是一個結構,指定了figure打開和輸出函數,
開始 gui_CallBack為空,如果輸入參數個數不為0,接下來將輸入第一個參數傳遞給gui_State.callback。
接下來用交給 gui_mainfcn函數處理,gui_mainfcn 根據gui_State和傳入參數
來確定是執子函數,還是打開 fig 文件和運行 OpeningFcn和OutputFcn。
如過 gui_Callback為空,那么就運行打開主窗口fig文件,否則,調用子函數
這個函數的作用有:
1.當輸入不帶參數的時候,能夠打開fig文件,並且初始化控件
2.當指定需要調用的函數名時,可以作為其他控件callback使用 (實則調用同文件中的子函數)
例如,在某一個控件的 callback 里面這樣寫:(febrdfun為主函數)
febirdfun("@push_button_Callback",gcbf,[])
這樣的調用就可以調用文件里面的子函數。
當然也可以使用其他文件里面的函數作為callback,不過那樣的話,數據傳遞會麻煩一些。
下面看figure Openning Function
%================================
function Main_OpeningFcn(hObject, eventdata, handles, varargin)
handles.output = hObject;
% 通常在這里面定義自己的數據結構例如
s=struct("P1",v1...
"P2",v2);
handles.MyStruct=s;
% 更新handles數據結構 非常重要!!
guidata(hObject, handles);
%================================
function varargout = Main_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;
這個函數是輸出返回值的定義
注意: matlab 中,function 對應的 end 可以沒有,但是隨着版本的更新,end將會被要求。
六:數據傳遞
在matlab GUI程序中進行值傳遞我經常使用的兩種方法:
1.利用主函數 的 handles 數據結構傳值
例如在某一個圖像窗口句柄 中有一個對象 handles(可以定義自己的數據結構)
那么在一個子Callback函數中,可以通過handles傳遞數據:
function sliderbar1_Callback(hObject,eventdata,handles)
%% eg1
v1=get(hObject,'value');
obj=handles.Text1 %直接定位 Tag 為 Text1的控件
set(obj,'value',v1);
%% eg2
handles.MyStruct.P1=v1; % 更改handles中的數據
guidata(hObject,handles); %更新 handles !!重要
end
2.利用控件的 UserData 來傳值
每一個控件一般都有一個屬於自己的自定義域,userData,你可以定義這樣一個域用來保存自己的數據,例如在定義 timer 的 TimerFcn中
t1=timer('TimerFcn',{@Timer1Fcn},'ErrorFcn',@Timer1ErrorFcn},'Period',1.0,'ExecutionMode','fixedrate');
t1.Userfata=handles.MyStruct;
這里 Timer1Fcn的調用看似沒有傳入任何參數,實際上此函數的定義一定要有至少兩個參數
function Timer1Fcn(obj,eventata)
obj.UserData=XXXXX;%可以這樣共享數據
end
當然Timer定義的時候允許這樣傳遞一個參數,當然這樣也可以進行傳值.
t1=timer('TimerFcn',{@Timer1Fcn,handles},'ErrorFcn',{@Timer1ErroFcnr,handles},'Period',1.0,'ExecutionMode','fixedrate');
感謝:http://blog.sina.com.cn/s/blog_45b486b80100gs1p.html