Matlab的GUI的工作原理及流程
例如,用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
執行該GUI時,程式首先從主函式的入口點開始執行即,從function varargout = ceshi(varargin)開始執行。
1、gui_Singleton = 1;保證只能執行該GUI程式的一個例項,即只能開啟一個視窗。
gui_Singleton = 0;允許該GUI程式可以執行多個例項,即可以開啟多個視窗
2、
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、
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程式設計所收穫的一點心得體會,不對的地方歡迎大家指正。也歡迎大家補充。目的:共同學習,共同進步。