1. 程式人生 > >Matlab的GUI的工作原理及流程

Matlab的GUI的工作原理及流程

例如,用GUIDE建立名為ceshiGUI程式,其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程式設計所收穫的一點心得體會,不對的地方歡迎大家指正。也歡迎大家補充。目的:共同學習,共同進步。