概述
在MATLAB的命令行視窗中鍵入guide可以打開GUIDE。這個命令將打開GUIDE Quick Start對話框。它可以看作是一個簡單的GUI應用程式的開發嚮導。利用它可以使用滑鼠方便地在窗體上添加各種各樣的控制項。而且它會負責生成一個m檔案,裡邊定義了各個控制項的回調函式,簡化了GUI應用程式的開發。當然matlab中GUI應用程式也可以使用純代碼生成。在MATLAB中,關於guide的使用方法, 參見幫助文檔:MATLAB/Getting Started/Create Graphical User Interfaces/Laying Out a GUI/Starting GUIDE條目下。
GUIDE(Graphical User Interfaces Development Environment) 是由視窗、游標、按鍵、選單、文字說明等對象(Objects)構成的一個用戶界面。用戶通過一定的方法(如滑鼠或鍵盤)選擇、激活這些圖形對象,使計算機產生某種動作或變化,比如實現計算、繪圖等。
程式設計
一. 控制項對象及屬性(Object and its attributes of controller))
1. GUI控制項對象類型(The mode of controller object)
控制項對象是事件回響的圖形界面對象。當某一事件發生時,應用程式會做出回響並執行某些預定的功能子程式(Callback).
2. 控制項對象的描述(Description of controller object)
MATLAB中的控制項大致可分為兩種,一種為動作控制項,滑鼠點擊這些控制項時會產生相應的回響。一種為靜態控制項,是一種不產生回響的控制項,如文本框等。
每種控制項都有一些可以設定的參數,用於表現控制項的外形、功能及效果,既屬性。屬性由兩部分組成:屬性名和屬性值,它們必須是成對出現的。
(1) 按鈕(Push Buttons):執行某種預定的功能或操作;
(2) 開關按鈕(Toggle Button):產生一個動作並指示一個二進制狀態(開或關),當鼠點擊它時按鈕將下陷,並執行callback(回調函式)中指定的內容,再次點擊,按鈕復原,並再次執行callback中的內容;
(3) 單選框(Radio Button):單個的單選框用來在兩種狀態之間切換,多個單選框組成一個單選框組時,用戶只能在一組狀態中選擇單一的狀態,或稱為單選項;
(4) 複選框(Check Boxes):單個的複選框用來在兩種狀態之間切換,多個複選框組成一個複選框組時,可使用戶在一組狀態中作組合式的選擇,或稱為多選項;
(5) 文本編輯器(Editable Texts):用來使用鍵盤輸入字元串的值,可以對編輯框中的內容進行編輯、刪除和替換等操作;
(6) 靜態文本框(Static Texts):僅僅用於顯示單行的說明文字;
(7) 滾動條(Slider): 可輸入指定範圍的數量值;
(8) 框線(Frames):在圖形視窗圈出一塊區域;
(9) 列表框(List Boxes):在其中定義一系列可供選擇的字元串;
(10)彈出式選單(Popup Menus): 讓用戶從一列選單項中選擇一項作為參數輸入;
(11)坐標軸(Axes): 用於顯示圖形和圖象
3. 控制項對象的屬性(Attributes of controller object)
用戶可以在創建控制項對象時,設定其屬性值,未指定時將使用系統預設值。
兩大類控制項對象屬性:第一類是所有控制項對象都具有的公共屬性,第二類是控制項對象作為圖形對象所具有的屬性。
A, 控制項對象的公共屬性
Children取值為空矩陣,因為控制項對象沒有自己的子對象
Parent取值為某個圖形視窗對象的句柄,該句柄表明了控制項對象所在的圖形視窗
Tag取值為字元串,定義了控制項的標識值,在任何程式中都可以通過這個標識值控制該控制項對象
Type取值為uicontrol,表明圖形對象的類型
UserDate取值為空矩陣,用於保存與該控制項對象相關的重要數據和信息
Visible取值為no 或off,
B,控制項對象的基本控制屬性
BackgroundColor取值為顏色的預定義字元或RGB數值
Callback取值為字元串,可以是某個M檔案名稱或一小段MATLAB語句,當用戶激活某個控制項對象時,應用程式就運行該屬性定義的子程式。
Enable取值為on(預設值),inactive和off
Extend取值為四元素矢量[0 ,0 width, height],記錄控制項對象標題字元的位置和尺寸
ForegroundColor取值為顏色的預定義字元或RGB數值
Max,Min取值都為數值
String取值為字元串矩陣或數組,定義控制項對象標題或選項內容
Style取值可以是pushbutton, radiobutton, checkbox, edit, text, slider, frame, popupmenu 或listbox
Units取值可以是pixels, normalized, inches, centimeters或points
Value取值可以是矢量,也可以是數值,其含義及解釋依賴於控制項對象的類型
C,控制項對象的修飾控制屬性
FontAngle取值為normal,italic, oblique,
FontName取值為控制項標題等字型的字型檔名
FontSize取值為數值,
FontWeight取值為points,normalized, inches, centimeters或pixels
HorizontalAligment取值為left,right,定義對齊方式
D, 控制項對象的輔助屬性
ListboxTop取值為數量值
SliderStop取值為兩元素矢量[minstep,maxstep],用於slider控制項
Selected取值為on 或off
SlectionHoghlight取值為on 或off
E,Callback管理屬性
BusyAction取值為cancel或queue
ButtDownFun取值為字元串,一般為某個M檔案名稱或一小段MATLAB程式
Creatfun取值為字元串,一般為某個M檔案名稱或一小段MATLAB程式
DeletFun取值為字元串,一般為某個M檔案名稱或一小段MATLAB程式
HandleVisibility取值為on,callback或off
Interruptible取值為on 或off
二.GUI開發環境(GUI DevelopmentEnvironment, GUIDE)MATLAB提供了一套可視化的創建圖形視窗的工具,使用用戶界面開發環境可方便的創建GUI應用程式, 它可以根據用戶設計的GUI布局,自動生成M檔案的框架,用戶使用這一框架編制自己的應用程式。MATLAB提供了一套可視化的創建圖形用戶接口(GUI)的工具,包括:*布局編輯器(Layout Edtor)-------在圖形視窗中加入及安排對象。布局編輯器是可以啟動用戶界面的控制臺,上述工具都必須從布局編輯器中訪問,用guide命令可以啟動,或在啟動平台視窗中選擇GUIDE來啟動布局編輯器。*幾何排列工具(Alignment Tool)-----調整各對象相互之間的幾何關係和位置*屬性編輯器(Property Inspector)-----查詢並設定屬性值*對象瀏覽器Object Browser)-----用於獲得當前MATLAB圖形用戶界面程式中所有的全部對象信息,對象的類型,同時顯示控制項的名稱和標識,在控制項上雙擊滑鼠可以打開該控制項的屬性編輯器。*選單編輯器(Menu Editor)-----建立視窗選單條的選單和任何構成布局的彈出選單在MATLAB中, GUI的設計是以 M檔案的編程形式實現的,GUI的布局代碼存儲在M檔案和MAT檔案中,而在MATLAB6中有了很大的改變,MATLAB6將GUI的布局代碼存儲在 FIG檔案中,同時還產生一個M檔案用於存儲調用函式,在M檔案中不再包含GUI的布局代碼,在開發應用程式時代碼量大大減少。1. 布局編輯器(Layout editor):用於從控制項選擇板上選擇控制項對象並放置到布局區去,布局區被激活後就成為圖形視窗。 在命令視窗輸入GUIDE命令或點擊工具列中的guide圖示都可以打開空白的布局編輯器,在命令視窗輸入GUIDEfilename 可打開一個已存在的名為filename圖形用戶界面。(1)將控制項對象放置到布局區a. 用滑鼠選擇並放置控制項到布局區內;b. 移動控制項到適當的位置;c. 改變控制項的大小;d. 選中多個對象的方法;(2) 激活圖形視窗 選Tools選單中的Activate Figure項或點擊工具條上的ActivareFigure按鈕, 在激活圖形視窗的同時將存儲M 檔案和FIG檔案,如所建立的布局還沒有進行存儲,用戶界面開發環境將打開一個Save As對話框,按輸入的檔案的名字,存儲一對同名的M檔案和帶有.fig擴展名的FIG檔案。(3) 運行GUI程式 在命令視窗直接鍵入檔案名稱或用openfig, open或hgload命令運行GUI程式。(4) 布局編輯器參數設定 選File選單下的Preferences選單項打開參數設定視窗,點擊樹狀目錄中的GUIDE,既可以設定布局編輯器的參數。(5) 布局編輯器的彈出選單 在任一控制項上按下滑鼠右鍵,會彈出一個選單,通過該選單可以完成布局編輯器的大部分操作。2. 幾何位置排列工具(Alignment tool) 用於調節各控制項對象之間的相對位置。3. 用屬性編輯器設定控制項屬性(Set attributes of controller with PropertyInspector) 在屬性編輯器中提供了所有可設定的屬性列表並顯示出當前的屬性。(1)屬性編輯器(Opening PropertyInspector):三種方法:1. 用工具列上的圖示打開;2. 從View選單中選擇Property Inspector選單項;3. 在按滑鼠右鍵彈出的Property Inspector選單中選擇選單項。(1) 使用屬性編輯器(Using Property Inspector)a. 布置控制項b. 定義文本框的屬性c. 定義坐標系d. 定義按鈕屬性e. 定義複選框4. 選單編輯器(Menu Editor): 包括選單的設計和編輯,選單編輯器有八個快捷鍵,可以利用它們任意添加或刪除選單,可以設定選單項的屬性,包括名稱(Label)、標識(Tag)、選擇是否顯示分隔線(Separator above this item)、是否在選單前加上選中標記(Item ischecked)、調用函式(Callback)。5. 對象瀏覽器(Object Browsers):用於瀏覽當前程式所使用的全部對象信息,可以在對象瀏覽器中選種一個或多個控制項來打開該控制項的屬性編輯器。
三、GUI程式設計(GUI Program design)
包括圖形界面的設計和功能設計兩個方面
例1: 用於繪圖和圖形旋轉的GUI:
1、 布置控制項:一個坐標系、一個文本框、一個複選框,一個按鈕
2、 定義文本框的屬性:String---簡單設計示例,FontName---隸書,FontSize--22
3、 定義坐標系: Visible—off,
4、 定義按鈕屬性: String—繪圖,FontName,ForegroundColor, ontSize, BackgroundColor,Callback---surf(peaks(30))
5、 定義複選框: String—rotate3D,Callback—rotate3d
例2:設計一個簡單信號分析儀的程式,要求根據輸入的兩個頻率和時間間隔,計算函式x=sin(2πf1t)+sin(2πf2t) 的值,並對函式進行快速傅立葉變換,最後分別繪製時域和頻域的曲線。
1. 設計圖形界面(GUI Design)
設計步驟:
(1) 在布局編輯器中布置控制項,
(2) 使用幾何位置排列工具對控制項的位置進行調整;
(3) 設計控制項的屬性;
(4) 設定其他繪圖屬性。
2. 設定控制項的標識(Set the Tag of controller)
控制項的標識(Tag)是對於各控制項的識別,每個控制項載創建時都會由開發環境自動產生一個標識,在程式設計中,為了編輯、記憶和維護的方便,一般為控制項設定一個新的標識。本例設定第一個坐標軸的標識為:frequency_axes,用於顯示頻域圖形; 第二個坐標軸的標識為:time_axes, 用於顯示時域圖形。三個文本編輯框的標識為f1_input, f2_input, t_input,分別用於輸入兩個頻率和自變數時間的間隔.
3. 編寫代碼(Editcode)
GUI圖形界面的功能,還是要通過一定的設計思路和計算方法,由特定的程式來實現。為了實現程式的功能,還需要在運行程式前編寫一些代碼,完成程式中變數的賦值、輸入輸出、計算及繪圖等工作。
一般方法為,內容為:
%(1)設定對象的初始值;
%分別設定三個文本編輯框的初始值為:
f1_input=20
f2_input=50
f3_input=0:0.001:0.5
%(2)編寫代碼:
%1)從GUI獲得用戶輸入的數據,本例中輸入的三個數據
%分別為頻率1、頻率2和時間間隔。
f1=str2double(get(handles.f1_input,'String'));
f2=str2double(get(handles.f2_input,'String'));
t=eval(get(handles.t_input,'String'));
%2)計算數據,計算函式值,按指定點進行快速傅立葉變
%換,並計算頻域的幅值和頻域解析度。
x=sin(2*pi*f1*t)+sin(2*pi*f2*t);
y=fft(x,512);
m=y.*conj(y)/512;
f=1000*(0:256)/512;
%3)在第一個坐標軸中繪製頻域曲線。
axes(handles.frequency_axes)
plot(f,m(1:257))
set(handles.frequency_axes,'XminorTick','on')
gridon
%4)在第二個坐標軸中繪製時域曲線。
axes(handles.time_axes)%選擇適當的坐標軸
plot(t,x)
set(handles.time_axes,'XminorTick','on')
gridon
運行程式(Running program)
例3 :製作一個曲面光照效果的演示界面,如圖所示,三個彈出式選單分別用於選擇曲面形式、色彩圖、光照模式和反射模式,三個滾動條用於確定光源的位置,一個按鈕用於退出演示。
製作要點:
(1)建立一個靜態文本,用於顯示界面的標題:光照效果演示;
(2)建立坐標軸對象,用於顯示圖形;
(3)建立四個下拉選單,分別用於選擇繪圖表面的形狀、色圖、光照模式和反射模式,每個下拉選單的上方都有一個靜態文本用於說明選單的作用;
(4)在一個frame上建立三個滑條用於確定光源的位置,並在frame上方加一說明;
(5)建立一個按鈕用於退出演示;
callback函式的內容為:
functionvarargout = pushbutton1_Callback(h, eventdata, handles, varargin)
delete(handles.figure1)
%--------------------------------------------------------------------
functionvarargout = popupmenu1_Callback(h, eventdata, handles, varargin)
val=get(h,'value');
switchval
case1
surf(peaks);
case2
sphere(30);
case3
membrane
case4
[x,y]=meshgrid(-4:.1:4);
r=sqrt(x.^2+y.^2)+eps;
z=sinc(r);
surf(x,y,z)
case5
[x,y]=meshgrid([-1.5:.3:1.5],[-1:0.2:1]);
z=sqrt(4-x.^2/9-y.^2/4);
surf(x,y,z);
case6
t=0:pi/12:3*pi;
r=abs(exp(-t/4).*sin(t));
[x,y,z]=cylinder(r,30);
surf(x,y,z);
end
shadinginterp
light('Position',[-3-2 1]);
axisoff
%--------------------------------------------------------------------
functionvarargout = radiobutton1_Callback(h, eventdata, handles, varargin)
set(h,'value',1)
set(handles.radiobutton2,'value',0)
set(handles.radiobutton3,'value',0)
set(handles.radiobutton4,'value',0)
lightingflat
%--------------------------------------------------------------------
functionvarargout = radiobutton2_Callback(h, eventdata, handles, varargin)
set(h,'value',1)
set(handles.radiobutton1,'value',0)
set(handles.radiobutton3,'value',0)
set(handles.radiobutton4,'value',0)
lightinggouraud
%--------------------------------------------------------------------
functionvarargout = radiobutton3_Callback(h, eventdata, handles, varargin)
set(h,'value',1)
set(handles.radiobutton1,'value',0)
set(handles.radiobutton2,'value',0)
set(handles.radiobutton4,'value',0)
lightingphong
%--------------------------------------------------------------------
functionvarargout = radiobutton4_Callback(h, eventdata, handles, varargin)
set(h,'value',1)
set(handles.radiobutton1,'value',0)
set(handles.radiobutton3,'value',0)
set(handles.radiobutton3,'value',0)
lightingnone
%--------------------------------------------------------------------
functionvarargout = popupmenu2_Callback(h, eventdata, handles, varargin)
val=get(h,'value');
switchval
case1
colormap(jet)
case2
colormap(hot)
case3
colormap(cool)
case4
colormap(copper)
case5
colormap(pink)
case6
colormap(spring)
case7
colormap(summer)
case8
colormap(autumn)
case9
colormap(winter)
end
%--------------------------------------------------------------------
functionvarargout = popupmenu3_Callback(h, eventdata, handles, varargin)
val=get(h,'value');
switchval
case1
lighting flat
case2
lighting gouraud
case3
lighting phong
case4
lighting none
end
%--------------------------------------------------------------------
functionvarargout = popupmenu4_Callback(h, eventdata, handles, varargin)
val=get(h,'value');
switchval
case1
material shiny
case2
material dull
case3
material metal
case4
material default
end
%--------------------------------------------------------------------
functionvarargout = slider1_Callback(h, eventdata, handles, varargin)
val=get(h,'value');
set(handles.edit1,'string',num2str(val));
lx==val;ly=get(handles.slider2,'value'); ly=get(handles.slider3,'value');
light('Position',[xy z]);
%--------------------------------------------------------------------
functionvarargout = edit1_Callback(h, eventdata, handles, varargin)
str=get(h,'string');
set(handles.slider1,'value',str2num(str));
lx==str2num(str);ly=get(handles.slider2,'value'); ly=get(handles.slider3,'value');
light('Position',[xy z]);
%--------------------------------------------------------------------
functionvarargout = slider2_Callback(h, eventdata, handles, varargin)
val=get(h,'value');
set(handles.edit2,'string',num2str(val));
lx=get(handles.slider1,'value');lx==val; ly=get(handles.slider3,'value');
light('Position',[xy z]);
%--------------------------------------------------------------------
functionvarargout = edit2_Callback(h, eventdata, handles, varargin)
str=get(h,'string');
set(handles.slider2,'value',str2num(str));
%--------------------------------------------------------------------
functionvarargout = slider3_Callback(h, eventdata, handles, varargin)
val=get(h,'value');
set(handles.edit3,'string',num2str(val));
%--------------------------------------------------------------------
functionvarargout = edit3_Callback(h, eventdata, handles, varargin)
str=get(h,'string');
set(handles.slider3,'value',str2num(str));
*對話框設計:在圖形用戶界面程式設計中,對話框是重要的信息顯示和獲取輸入數據的用戶界面對象。
1、公共對話框:
公共對話框是利用windows資源的對話框,包括檔案打開、檔案保存、顏色設定、字型設定、列印設定等。
1) 檔案打開對話框:用於打開檔案
uigetfile
uigetfile(‘FilterSpec’)
uigetfile(‘FilterSpec’,’DialogTitle’)
uigetfile(‘FilterSpec’,’DialogTitle’,x,y)
[fname,pname]=uigetfile(…)
2) 檔案保存對話框:用於保存檔案
uiputfile
uiputfile(‘InitFile’)
uiputfile(‘InitFile’,’DialogTitle’)
uiputfile(‘InitFile’,’DialogTitle’,x,y)
[fname,pname]=uiputfile(…)
3) 顏色設定對話框:用於圖形對象顏色的互動設定
c=uisetcolor(‘h_or_c,’DialogTitle’)
4) 字型設定對話框:用於字型屬性的互動式設定
uisetfont
uisetfont(h)
uisetfont(S)
uisetfont(h,’DialogTitle’)
uisetfont(S,’DialogTitle’)
S=uisetfont(…)
5) 列印設定對話框:用於列印頁面的互動式設定
dlg=pagesetupdlg(fig)
pagedlg
pagedlg(fig)
6) 列印預覽對話框:用於對列印頁面進行預覽
printpreview
printpreview(f)
7) 列印對話框:
printdlg
printdlg(fig)
printdlg(‘-crossplatform’,fig)
printdlg(-‘setup’,fig)
2、MATLAB專用對話框
1)錯誤信息對話框:用於提示錯誤信息
errordlg打開默認的錯誤信息對話框
errordlg(‘errorstring’)打開顯示’errorstring’信息的錯誤信息對話框
errordlg(‘errorstring’,’dlgname’)打開顯示’errorstring’信息的錯誤信息對話框,對話框的標題由‘dlgname’指定
erordlg(‘errorstring’,’dlgname’,’on’)打開顯示’errorstring’信息的錯誤信息對話框,對話框的標題由‘dlgname’指定. 如果對話框已存在,’on’參數將對話框顯示在最前端。
h=errodlg(…)返回對話框句柄
例:errordlg('輸入錯誤,請重新輸入','錯誤信息')
2) 幫助對話框:用於幫助提示信息
helpdlg 打開默認的幫助對話框
helpdlg(‘helpstring’)打開顯示’errorstring’信息的幫助對話框,
helpdlg(‘helpstring’,’dlgname’)打開顯示’errorstring’信息的幫助對話框, 對話框的標題由‘dlgname’指定
h=helpdlg(…)返回對話框句柄
例:helpdlg('矩陣尺寸必須相等','線上幫助')
3) 輸入對話框:用於輸入信息
answer=inputdlg(prompt)打開輸入對話框,prompt為單元數組,用於定義輸入數據視窗的個數和顯示提示信息,answer為用於存儲輸入數據的單元數組。
answer=inputdlg(prompt,title)與上者相同,title確定對話框的標題。
answer=inputdlg(prompt,title,lineNo)參數lineNo可以是標量、列矢量或m×2階矩陣,若為標量,表示每個輸入視窗的行數均為lineNo;若為列矢量,則每個輸入視窗的行數由列矢量lineNo的每個元素確定;若為矩陣,每個元素對應一個輸入視窗,每行的第一列為輸入視窗的行數,第二列為輸入視窗的寬度。
answer=inputdlg(prompt,title,lineNo,de fAns) 參數defans為一個單元數組,存儲每個輸入數據的默認值,元素個數必須與prompt 所定義的輸入視窗數相同,所有元素必須是字元串。
answer=inputdlg(prompt,title,lineNo,de fAns,Sesize) 參數resize決定輸入對話框的大小能否被調整,可選值為on或off.
例:prompt={'Input Name','Input Age'};
title="InputName and Age";
lines=[21]';
def={'JohnSmith','35'};
answer=inputdlg(prompt,title,lines,def);
4) 列表選擇對話框:用於在多個選項中選擇需要的值
[selection,ok]=listdlg(‘Liststring’,S,…)輸出參數selection為一個矢量,存儲所選擇的列表項的索引號,
輸入參數為可選項’Liststring’(單元數組), ’SelectionMode’(’single’或’multiple’,’ListSize’([wight,height]), ’Name’ (對話框標題)等
5) 信息提示對話框:用於顯示提示信息
msgbox(message)打開信息提示對話框,顯示message信息。
msgbox(message,title)title確定對話框標題。
msgbox(message,title,’icon’)icon用於顯示圖示,可選圖示包括:none(無圖示)/error/help/warn/custom(用戶定義)
msgbox(message,title,’custom’,icondata,iconcmap)當使用用戶定義圖示時,icondata為定義圖示的圖像數據,iconcmap為圖像的色彩圖。
msgbox(…,’creatmode’)選擇模式creatmode,選項為:modal, non_modal, 和replace。
h=msgbox(…) 返回對話框句柄
6) 問題提示對話框:用於回答問題的多種選擇
button=questdlg(‘qstring’)打開問題提示對話框,有三個按鈕,分別為:yes,no和cancel,’questdlg’確定提示信息。
button=questdlg(‘qstring’,’title’)title確定對話框標題。
button=questdlg(‘qstring’’title’,’default’)當按回車鍵時,返回default值default 必須是yes,no或cancel之一。
button=questdlg(‘qstring’,’title’,’str1’,’str2’,’default’)打開問題提示對話框,有兩個按鈕,分別由str1和str2確定,’qstdlg’確定提示信息,default必須是str1或str2之一。
button=questdlg(‘qstring’,’title’,’str1’,’str2’,’str3’,’default’) 打開問題提示對話框,有三個按鈕,分別由str1,str2和str3確定,’qstdlg’確定提示信息,default必須是str1, str2或str3之一。
7) 進程條:以圖形方式顯示運算或處理的進程
h=waitbar(x,’title’)顯示以title為標題的進程條,x為進程條的比例長度,其值必須在0到1之間,h為返回的進程條對象的句柄。
waitbar(x,’title’,’creatcancelbtn’,’button_callback’)在進程條上使用creatcancelbtn參數創建一個撤銷按鈕,在進程中按下撤銷按鈕將調用button_callback函式。
waitbar(…,property_name,property_value,…)選擇其它由prompt_name定義的參數,參數值由prompt_value指定。
例:
h=waitbar(0,'pleaswait...');
fori=1:10000
waitbar(i/10000,h)
end
close(h)
8)警告信息對話框:用於提示警告信息
h=warndlg(‘warningstring’,’dlgname’)打開警告信息對話框,顯示warningstring信息,dlgname確定對話框標題,h為返回對話句柄。