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