1. 程式人生 > >Matlab-GUIDE使用說明(Matlab-GUI介面)

Matlab-GUIDE使用說明(Matlab-GUI介面)

  從簡單的例子說起吧。

   建立MatlabGUI介面通常有兩種方式:

   1,使用 .m 檔案直接動態新增控制元件
 
   2.  使用 GUIDE 快速的生成GUI介面

顯然第二種視覺化編輯方法算更適合寫大型程式。

一:建立GUI

1.在 .m檔案中動態新增


例如

h_main=figure(‘name’,‘a demo of gui design’,‘menubar’,‘none’,…

   'numbertitle','off','position',[100 100 300 100]);

h_edit=uicontrol('style','edit','backgroundcolor',[1 1 1],'position',[20 20 5020],...

   'tag','myedit','string','1','horizontalalignment','left');

h_but1=uicontrol('style','pushbutton','position',[20 50 5020],'string','INC',...

   'callback',['v=eval(get(h_edit,''string''));',...

      'set(h_edit,''string'',int2str(v+1));']);

h_but2=uicontrol('style','pushbutton','position',[80 50 5020],'string','DEC',...

  'callback',['v=eval(get(h_edit,''string''));','set(h_edit,''string'',int2str(v-1));']);


2.使用GUIDE幫助建立GUI

在Command裡面輸入 GUIDE或者從選單裡面,或者從快捷按鈕均可 進入 GUIDE



新建並且儲存後,會生成相應的fig檔案和m檔案,在Layout編輯檢視,可以使用如下工具:

Layout Editor:佈局編輯器;
Alignment Tool:對齊工具;
Property Inspector:物件屬性觀察器;
Object Browser:物件瀏覽器;
Menu Editor:選單編輯器。

二:使用控制元件

新建一個佈局(視窗),可以在新視窗中新增如下控制元件

1.靜態文字(StaticText)       2.編輯框(Edit Text)控制元件
3.列表框(Listbox)控制元件           4.滾動條(Slider)控制元件
5.按鈕(PushButton)控制元件       6.開關按鈕(Toggle Button)控制元件
7.單選按鈕(RadioButton)控制元件       8.按鈕組(Button Group)控制元件
9.檢查框(CheckBox)控制元件       10.列表框(Listbox)控制元件
11.彈出式選單(PopupMenu)控制元件   12.座標軸(Axes)控制元件
13.面板(Panel)控制元件


每一個控制元件都有自己的屬性常規屬性有:

        一、控制元件風格和外觀
        (1)BackgroundColor:設定控制元件背景顏色,使用[R GB]或顏色定義。
        (2)CData:在控制元件上顯示的真彩色影象,使用矩陣表示。
        (3)ForegroundColor:文字顏色。
        (4)String屬性:控制元件上的文字,以及列表框和彈出選單的選項。
        (5)Visible:控制元件是否可見。

        二、物件的常規資訊
        (1)Enable屬性: 表示此控制元件的使能狀態,設定為on”,表示可選,為“off”時則表示不可選。
        (2)Style:控制元件物件型別。
        (3)Tag:控制元件表示(使用者定義)。
        (4)TooltipString屬性:提示資訊顯示。當滑鼠指標位於此控制元件上時,顯示提示資訊。
        (5)UserData:使用者指定資料。
        (6)Position:控制元件物件的尺寸和位置。
        (7)Units:設定控制元件的位置及大小的單位
        (8)有關字型的屬性,如FontAngle,FontName等。

        三、控制元件回撥函式的執行
        (1)BusyAction:處理回撥函式的中斷。有兩種選項:即Cancel:取消中斷事件,queue:排隊(預設設定)。
        (2)ButtonDownFcn屬性:按鈕按下時的處理函式。
        (3)CallBack屬性:是連線程式介面整個程式系統的實質性功能的紐帶。該屬性值應該為一個可以直接求值的字串,在該物件被選中和改變時,系統將自動地對字串進行求值。
        (4)CreateFcn:在物件產生過程中執行的回撥函式。
        (5)DeleteFcn:刪除物件過程中執行的回撥函式。
        (6)Interruptible屬性:指定當前的回撥函式在執行時是否允許中斷,去執行其他的函式。

        四、控制元件當前狀態資訊
        (1)ListboxTop:在列表框中顯示的最頂層的字串的索引。
        (2)Max:最大值。
        (3)Min:最小值。
        (4)Value:控制元件的當前值。


你可以使用屬性編輯器來設定屬性




三:寫回調函式 CallBack

每個控制元件都有幾種回撥函式,右鍵選中的控制元件一般會有如下選單:


然後就可以跳轉到相應的Editor中編輯程式碼,GUIDE會自動生成 相應的函式體,函式名,名稱一般是 控制元件 Tag+Call型別名 引數有三個 (hObject, eventdata, handles)

其中hObject 為發生事件的源控制元件,eventdata為事件資料結構,handles為傳入的物件控制代碼

CreateFcn 是在控制元件物件建立的時候發生(一般為初始化樣式,顏色,初始值等)
DeleteFcn 實在空間物件被清除的時候發生
ButtonDownFcn和KeyPressFcn分別為滑鼠點選和按鍵事件Callback

CallBack為一般回撥函式,因不同的控制元件而已異。例如按鈕被按下時發生,下拉框改變值時發生,sliderbar 拖動時發生等等。


四:控制代碼圖形之間的層次關係


可以建立 圖形控制代碼的常見函式

1.figure函式:建立一個新的圖形物件。
2.newplot函式:做好開始畫新圖形物件的準備。
3.axes函式:建立座標軸圖形物件。
4.line函式:畫線。
5.patch函式:填充多邊形。
6.surface函式:繪製三維曲面。
7.image函式:顯示圖片物件。
8.uicontrol函式:生成使用者控制圖形物件。
9.uimenu函式:生成圖形視窗的選單中層次選單與下一級子選單。

幾個實用的小函式:

uigetfile  選擇檔案對話方塊
uiputfile  儲存檔案對話方塊
uisetcolor  設定顏色對話方塊
fontsetcolor  設定字型對話方塊
msgbox    訊息框
warndlg    警告框
helpdlg     訊息框

不過如果要讓父視窗不可用,你需要使用uiwait來定焦於使用者對話方塊。
例如:

    h=helpdlg('Please press me!','Attention');
    uiwait(h);


四:獲取與設定物件屬性


 常用函式:


gcf函式:獲得當前圖形視窗的控制代碼
gca函式:獲得當前座標軸的控制代碼
gco函式:獲得當前物件的控制代碼
gcbo函式:獲得當前正在執行呼叫的物件的控制代碼
gcbf函式:獲取包括正在執行呼叫的物件的圖形控制代碼
delete函式:刪除控制代碼所對應的圖形物件
findobj函式:查詢具有某種屬性的圖形物件


設定方法:

(1)get函式返回某些物件屬性的當前值。例如:

p=get(obj,'Position');    

(2)函式set改變控制代碼圖形物件屬性,例如:
set(obj,'Position',vect);


五:函式呼叫


在一個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,不過那樣的話,資料傳遞會麻煩一些。


下面看figureOpenning 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將會被要求。


六:資料傳遞



在matlabGUI程式中進行值傳遞我經常使用的兩種方法:



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');