MATLAB GUI编程 code运行流程

例如,用GUIDE创建名为ceshi的GUI程序,其m文件的主函数有如下形式。那么,打开该GUI时,它到底是怎么运行的呢?以下略作小结,欢迎大家补充

  1. function varargout = ceshi(varargin)  
  2. gui_Singleton = 1;  
  3. gui_State = struct(‘gui_Name’,  
  4. mfilename, …  
  5. ’gui_Singleton’,  
  6. gui_Singleton, …  
  7. ’gui_OpeningFcn’, @ceshi_OpeningFcn, …  
  8. ’gui_OutputFcn’,  
  9. @ceshi_OutputFcn, …  
  10. ’gui_LayoutFcn’,  
  11. [] , …  
  12. ’gui_Callback’,  
  13. []);  
  14. if nargin && ischar(varargin{1})  
  15. gui_State.gui_Callback = str2func(varargin{1});  
  16. end  
  17. if nargout  
  18. [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});  
  19. else  
  20. gui_mainfcn(gui_State, varargin{:});  
  21. end  
function varargout = ceshi(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton',
gui_Singleton, ...
'gui_OpeningFcn', @ceshi_OpeningFcn, ...
'gui_OutputFcn',
@ceshi_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 时,程序首先从主函数的入口点开始运行即,从function varargout = ceshi(varargin) 开始运行。

1 、gui_Singleton = 1; 保证只能运行该GUI 程序的一个实例,即只能打开一个窗口。

gui_Singleton = 0; 允许该GUI 程序可以运行多个实例,即可以打开多个窗口

2 、
  1. gui_State = struct(‘gui_Name’,  
  2. mfilename, …  
  3. ’gui_Singleton’,  
  4. gui_Singleton, …  
  5. ’gui_OpeningFcn’, @ceshi_OpeningFcn, …  
  6. ’gui_OutputFcn’,  
  7. @ceshi_OutputFcn, …  
  8. ’gui_LayoutFcn’,  
  9. [] , …  
  10. ’gui_Callback’,  
  11. []);  
gui_State = struct('gui_Name',
mfilename, ...
'gui_Singleton',
gui_Singleton, ...
'gui_OpeningFcn', @ceshi_OpeningFcn, ...
'gui_OutputFcn',
@ceshi_OutputFcn, ...
'gui_LayoutFcn',
[] , ...
'gui_Callback',
[]);

该结构描述了该GUI的状况,包括gui的名字、运行实例、初始化函数、输出函数、布局以及回调函数。

3、

  1. if nargin && ischar(varargin{1})  
  2. gui_State.gui_Callback = str2func(varargin{1});  
  3. end  
  4. if nargout  
  5. [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});  
  6. else  
  7. gui_mainfcn(gui_State, varargin{:});  
  8. end  
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.gui_Callback = str2func(varargin{1});分别取得figure和包含的控件的CreateFcn回调函数,创建各个控件。

4、figure和各控件创建完毕,程序会调用OpeningFcn进行初始化,然后运行OutputFcn,把figure的句柄作为输出参数输出。这时,GUI界面便在屏幕上显示出来。
5、此后程序处于等待状态,等待用户的操作。程序在调用gui_mainfcn函数时,会给figure以及各控件加一个事件监听器(listener),用来监听用户对figure以及各控件的操作。例如:用户用鼠标点击一个pushbutton按钮时,程序会监听到这个时间,然后调用该按钮的回调函数pushbutton_callback,对事件进行处理。用户点击figure的关闭按钮时,会调用其CloseRequestFcn回调函数,执行关闭窗口的操作。等等


可以在主函数的singleton处设置断点,然后用stepin逐步调试,发现原来GUI调用了很多函数:

gui_mainfcn->genwarname->openfig->fileparts->ispc->filesep->fullfile->unique->intmax->dec2hex->iskeyword->fliplr->hgload->str2double->lineseries->figuretoolbarcreatfcn->usejava->char->arrayviewfun->uibuttongroup->schema->addlistener->initprintexportemplate->duidata->iscom->ishghandle->isprop->childaddedcbk->findall->…

这么多的函数,都是GUIDE内部调用的,用来创建控件,并为控件添加监听器-listener。红色字体标准的函数可能是我们比较熟悉和关心的:载入图形的句柄、创建toolbar、创建buttongroup、添加监听器-listener等等。

  程序在主函数里调用figure及各控件的CreateFcn函数创建完各控件后,下一步的任务就是要显示figure以及各控件。这时,程序会调用其OpeningFcn函数,用户如果想初始化各控件的数值以及和figure相关联的handles结构的数值,代码就可以放在这里。注意:要调用guidata(hObject,handles);函数保存所做的修改。
       在OpeningFcn函数中有一条代码:handles.output=hObject;是matlab guide自动加上的,目的是把该GUI figure的句柄当作输出参数传递出去。handles.output是matlab guide自动添加到handles结构中的变量,用来传递输出参数,我们可以修改这个变量名,如:用handles.myoutput代替,只是要和OutputFcn中的varargout{1}=handles.output;名字相对应就可以。

      如果我们在OpeningFcn的最后没有调用uiwait(handles.figure1),则程序立马调用OutputFcn,并返回,这时程序的输出参数就是figure的句柄,我们可以利用这个句柄来操纵figure内的控件。例如,设置其数值等。如果我们在OpeningFcn的最后调用了uiwait(handles.figure1),则程序不会调用OutputFcn,而是等到用户完成操作,调用uiresume(handles.figure1)时才继续调用OutputFcn函数。

     直到这时,程序才算执行完毕。接下来,程序会利用原先设定的监听器(listener)来监听用户的输入操作。如,按下pushbutton等。

    用guide创建的GUI的整个工作过程就是这样。了解了其工作流程,我们可以在编程中灵活控制,而不用感到一头雾水了。

以上是我这段时间利用GUI编程所收获的一点心得体会,不对的地方欢迎大家指正。也欢迎大家补充。目的:共同学习,共同进步。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值