版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第9章句柄圖形與GUI設(shè)計(jì)9.1GUI的設(shè)計(jì)9.2句柄圖形對(duì)象9.3編寫響應(yīng)函數(shù)9.4編程創(chuàng)建GUI9.5標(biāo)準(zhǔn)對(duì)話框9.6菜單設(shè)計(jì) 9.1句柄圖形對(duì)象
MATLAB的圖形系統(tǒng)是面向?qū)ο蟮?,圖形的輸出就是建立圖形對(duì)象。通常用戶不必關(guān)心這些高級(jí)MATLAB命令包含的對(duì)象。然而有時(shí)為了某些特殊應(yīng)用,調(diào)整對(duì)象也要用一些低層的MATLAB命令。
句柄圖形是對(duì)底層圖形例程集合的總稱,它進(jìn)行生成圖形的實(shí)際工作。這些細(xì)節(jié)通常隱藏在圖形M文件的內(nèi)部,如果想使用它們,則通過圖形句柄也是可得到的。圖形對(duì)象是MATLAB顯示數(shù)據(jù)的基本繪圖元素,每個(gè)對(duì)象擁有一個(gè)唯一的標(biāo)志,即句柄。通過句柄可以對(duì)已有的圖形對(duì)象進(jìn)行操作,控制其屬性。句柄圖形使用戶可以自定義MATLAB的信息顯示方式。
一個(gè)圖形是由許多的圖形對(duì)象組成的,這些對(duì)象是以層次順序保存的。圖形對(duì)象包括:
根對(duì)象。
繪制圖形的圖形框架窗口對(duì)象(即Figure窗口)。
核心(Core)對(duì)象。
繪圖(Plot)對(duì)象。
注釋對(duì)象。
MATLAB中這些對(duì)象的組織形式為層次結(jié)構(gòu),如圖9-1所示。圖9-1圖形對(duì)象的層次結(jié)構(gòu)
Root對(duì)象即根對(duì)象,位于MATLAB層次結(jié)構(gòu)的最上層,因此在MATLAB中創(chuàng)建圖形對(duì)象時(shí),只能創(chuàng)建唯一的一個(gè)Root對(duì)象,而其他的所有對(duì)象都從屬于該對(duì)象。根對(duì)象是由系統(tǒng)在啟動(dòng)MATLAB時(shí)自動(dòng)創(chuàng)建的,用戶可以對(duì)根對(duì)象的屬性進(jìn)行設(shè)置,從而改變圖形的顯示效果。
圖形框架窗口對(duì)象Figure是MATLAB顯示圖形的窗口,其中包含菜單欄、工具欄、用戶接口對(duì)象(交互式對(duì)象)、右鍵菜單(彈出式菜單)、坐標(biāo)系及坐標(biāo)軸的子對(duì)象等。MATLAB允許用戶同時(shí)創(chuàng)建多個(gè)圖形窗口。在MATLAB中,圖形框架窗口對(duì)象有兩個(gè)特殊的作用:
包含數(shù)據(jù)圖形;
包含圖形用戶界面操作GUI。
MATLAB對(duì)一次打開的圖形數(shù)目沒有限制,用戶的計(jì)算機(jī)系統(tǒng)可能會(huì)做出限制。如果當(dāng)前尚未創(chuàng)建圖形對(duì)象(即Figure窗口),則調(diào)用任意一個(gè)繪圖函數(shù)或圖像顯示函數(shù),如plot()函數(shù)和imshow()函數(shù)等,均可以自動(dòng)創(chuàng)建一個(gè)圖形窗口。如果當(dāng)前根對(duì)象已經(jīng)包含了一個(gè)或多個(gè)圖形窗口,則總有一個(gè)窗口為當(dāng)前窗口,且該窗口為所有當(dāng)前繪圖函數(shù)的輸出窗口。對(duì)于每一個(gè)對(duì)象都可以修改它的一些屬性。例如,可以改變圖形窗口的位置和圖形對(duì)象的背景色。對(duì)于一個(gè)軸對(duì)象,可以改變它在圖形區(qū)域內(nèi)的刻度大小和位置。線條對(duì)象可以變得更細(xì),或改變成另一種顏色,或另一種線型,等等。因?yàn)槭菍哟谓Y(jié)構(gòu),所以某個(gè)對(duì)象改變時(shí),會(huì)影響到這個(gè)結(jié)構(gòu)中它以下的所有對(duì)象。如果使用鼠標(biāo)改變圖形對(duì)象的屏幕位置,線條和軸對(duì)象也會(huì)跟著變。但是如果改變右邊軸對(duì)象的軸刻度,那只影響這個(gè)軸上的線條。
圖形對(duì)象是MATLAB顯示數(shù)據(jù)的基本繪圖元素,每個(gè)對(duì)象擁有一個(gè)唯一的標(biāo)志,即句柄。通過句柄可以對(duì)已有的圖形對(duì)象進(jìn)行操作,控制其屬性。能夠?qū)崿F(xiàn)句柄訪問的函數(shù),如表9-1所示。9.1.1圖形對(duì)象屬性的獲取和設(shè)置
MATLAB用兩個(gè)通用的低級(jí)基本命令get()?和set()?來處理圖形對(duì)象。通過使用這兩個(gè)命令,可以給出或修改所有對(duì)象的屬性值。
figure()函數(shù)可以生成圖形對(duì)象的句柄,通過set()函數(shù)可設(shè)定figure的屬性,以控制圖形的外觀和顯示特點(diǎn)。
1.set()函數(shù)
在MATLAB中,使用set()函數(shù)可以設(shè)置對(duì)象的屬性值,其通常的調(diào)用格式如下:
set(H,'PropertyName',PropertyValue,...):設(shè)置由句柄H指定的圖形窗口的屬性,屬性名由'PropertyName'指定,其屬性值為PropertyValue。H可以為向量,此時(shí)將H中指定的所有窗口的PropertyName屬性設(shè)置為PropertyValue。
例如:set(gca,'YAxisLocation','right')
通過set()函數(shù)可以查看一個(gè)對(duì)象的所有可設(shè)置屬性的所有可能的值。
>>set(axes)
ActivePositionProperty:[position|{outerposition}]
ALim
ALimMode:[{auto}|manual]
AmbientLightColor
Box:[on|{off}]
2.get()函數(shù)
在MATLAB中,使用get()函數(shù)可以得到對(duì)象的屬性及其屬性的當(dāng)前值,其調(diào)用格式如下:
(1)?get(h):返回由句柄h指定的圖形窗口的所有屬性值。
(2)?get(h,'PropertyName'):返回屬性'PropertyName'的值。
除了函數(shù)set()和get()外,MATLAB還提供了另外兩個(gè)函數(shù)來操作對(duì)象和它們的屬性。任意一個(gè)對(duì)象和它們的子對(duì)象可以用delete(handle)來刪除。同樣,reset(handle)將與句柄有關(guān)的全部對(duì)象屬性(除了?'Position'?屬性)重新設(shè)置為該對(duì)象類型的缺省值。9.1.2圖形對(duì)象句柄的訪問
1.當(dāng)前圖形句柄
在MATLAB中,句柄圖形有一個(gè)重要概念,即當(dāng)前性(BeingCurrent)。當(dāng)前的圖形對(duì)象即為最后創(chuàng)建的圖形對(duì)象,或最后被鼠標(biāo)點(diǎn)中的圖形對(duì)象。
在通常情況下,MATLAB保存三個(gè)“當(dāng)前句柄”,三個(gè)句柄為層次關(guān)系。這些屬性能夠使得用戶方便地獲取這些關(guān)鍵對(duì)象的句柄,其方法如下:
get(0,'CurrentFigure'):獲取當(dāng)前圖形窗口對(duì)象的句柄。
get(gcf,'CurrentAxes'):獲取當(dāng)前圖形窗口對(duì)象中當(dāng)前坐標(biāo)軸對(duì)象的句柄。
get(gcf,'CurrentObject'):獲取當(dāng)前圖形窗口對(duì)象中當(dāng)前對(duì)象的句柄。
2.查找對(duì)象
句柄圖形提供了對(duì)圖形對(duì)象的訪問途徑,并且允許用函數(shù)get()和set()定制圖形。如果用戶忘記保存句柄或圖形對(duì)象的句柄,或者當(dāng)變量被覆蓋時(shí),如果要改變對(duì)象的屬性,不知道它們的句柄怎么辦呢?這時(shí)就必須進(jìn)行對(duì)象句柄的查找,MATLAB提供了查找對(duì)象的函數(shù)gcf()、gca()、gco()和findobj()等。
MATLAB的findobj()函數(shù)可以用于快速遍歷對(duì)象從屬關(guān)系表,并獲取具有特定屬性值的對(duì)象句柄。如果用戶沒有指定起始對(duì)象,那么findobj()函數(shù)從根對(duì)象開始查找。該函數(shù)的調(diào)用格式如下:
h=findobj:返回根對(duì)象及其所有的從屬句柄,返回值為一個(gè)列向量。
h=findobj('PropertyName',PropertyValue,...):返回滿足'PropertyName'屬性的值為PropertyValue的所有句柄,可以同時(shí)設(shè)置多個(gè)條件。
h=findobj(objhandles,'flat','PropertyName',PropertyValue,...):限制查找范圍,僅查找objhandles指定的句柄,而不查找其子句柄。9.1.3圖形對(duì)象的復(fù)制與刪除
通過copyobj()函數(shù)可以實(shí)現(xiàn)將對(duì)象從一個(gè)父對(duì)象移動(dòng)至另一個(gè)父對(duì)象中。新對(duì)象與原對(duì)象的差別在于其Parent屬性值不同,并且其句柄不同。在MATLAB中,可以向一個(gè)新的父對(duì)象中復(fù)制多個(gè)子對(duì)象,也可以將一個(gè)子對(duì)象復(fù)制到多個(gè)父對(duì)象中。復(fù)制對(duì)象需要注意的是,子對(duì)象和父對(duì)象之間的類型必須匹配。
在復(fù)制對(duì)象時(shí),如果被復(fù)制的對(duì)象包含子對(duì)象,MATLAB同時(shí)復(fù)制所有的子對(duì)象。
copyobj()函數(shù)的用法:
new_handle=copyobj(h,p)該語(yǔ)句復(fù)制h指定的圖形對(duì)象至p指定的對(duì)象中,成為p的子對(duì)象。h和p的取值可以有下面三種情況:
h和p均為向量。此時(shí)h和p長(zhǎng)度必須相同,返回值new_handle為長(zhǎng)度相同的向量。在這種情況下,new_handle(i)是h(i)的副本,其父對(duì)象為p(i);
h為標(biāo)量,p為向量。此時(shí)將h復(fù)制到p指定的所有對(duì)象中,返回結(jié)果new_handle為與p長(zhǎng)度相等的向量,每個(gè)new_handle(i)是h的副本,其父對(duì)象為p(i);
h為向量,p為標(biāo)量。此時(shí)將h指定的所有對(duì)象復(fù)制到p中,返回結(jié)果new_handle為與h長(zhǎng)度相等的向量,每個(gè)new_handle(i)是h(i)的副本,其父對(duì)象為p。 9.2GUI的設(shè)計(jì)
用戶界面(或接口)是指人與機(jī)器(或程序)之間交互作用的工具和方法,如鍵盤、鼠標(biāo)、跟蹤球、話筒等都可成為與計(jì)算機(jī)交換信息的接口。
圖形用戶接口,即GUI(GraphicalUserInterface),是一個(gè)整合了窗口、圖標(biāo)、按鈕、菜單和文本等圖形對(duì)象的用戶接口,是用戶與計(jì)算機(jī)或程序與計(jì)算機(jī)之間進(jìn)行通信和交互的方法。MATLAB中的GUI程序?yàn)槭录?qū)動(dòng)的程序,事件包括按下按鈕、單擊鼠標(biāo)等。GUI中的每個(gè)控件與用戶定義的語(yǔ)句相關(guān)。當(dāng)在界面上執(zhí)行某項(xiàng)操作時(shí),則開始執(zhí)行相關(guān)的語(yǔ)句,激活這些圖形對(duì)象,使計(jì)算機(jī)產(chǎn)生某種動(dòng)作或變化,比如實(shí)現(xiàn)計(jì)算、繪圖等。
MATLAB提供了兩種創(chuàng)建圖形用戶接口的方法:通過GUI向?qū)?GUIDE)創(chuàng)建的方法和編程創(chuàng)建GUI的方法。用戶可以根據(jù)需要,選擇適當(dāng)?shù)姆椒▌?chuàng)建圖形用戶接口。通??梢詤⒖枷旅娴慕ㄗh:
如果創(chuàng)建對(duì)話框,可以選擇編程創(chuàng)建GUI的方法。MATLAB中提供了一系列標(biāo)準(zhǔn)對(duì)話框,可以通過一個(gè)函數(shù)簡(jiǎn)單創(chuàng)建對(duì)話框。
只包含少量控件的GUI,可以采用程序方法創(chuàng)建,每個(gè)控件可以由一個(gè)函數(shù)調(diào)用實(shí)現(xiàn)。
復(fù)雜的GUI通過向?qū)?chuàng)建比通過程序創(chuàng)建更簡(jiǎn)單一些,但是對(duì)于大型的GUI,或者由不同的GUI之間相互調(diào)用的大型程序,用程序創(chuàng)建更容易一些。9.2.1啟動(dòng)GUI開發(fā)環(huán)境
本節(jié)通過GUI向?qū)В碐UIDE(GraphicalUserInterfaceDevelopmentEnvironment,用戶圖形界面開發(fā)環(huán)境),創(chuàng)建一個(gè)簡(jiǎn)單的GUI,該GUI實(shí)現(xiàn)三維圖形的繪制。界面中包含一個(gè)繪圖區(qū)域;一個(gè)面板,其中包含三個(gè)繪圖按鈕,分別實(shí)現(xiàn)表面圖、網(wǎng)格圖和等值線的繪制;一個(gè)彈出菜單,用以選擇數(shù)據(jù)類型,并且用靜態(tài)文本進(jìn)行說明。
GUIDE包含了大量創(chuàng)建GUI的工具,這些工具簡(jiǎn)化了創(chuàng)建GUI的過程。通過向?qū)?chuàng)建GUI直觀、簡(jiǎn)單,便于用戶快速開發(fā)GUI。GUIDE自動(dòng)生成包含控制操作的MATLAB函數(shù)的程序文件,它提供初始化GUI的代碼和包含GUI回調(diào)函數(shù)(響應(yīng)函數(shù))的框架,用戶可以向函數(shù)中添加代碼實(shí)現(xiàn)自己的操作。
(1)啟動(dòng)GUI操作界面。GUIDE可以通過四種方法啟動(dòng):
可以在MATLAB主窗口命令行中鍵入GUIde命令來啟動(dòng)GUIDE;
在MATLAB主窗口左下角的“開始”菜單中選擇“MATLAB?|?GUIDE(GUIBuilder)”;
在MATLAB主窗口的File菜單中選擇“New?|?GUI”;
點(diǎn)擊MATLAB主窗口工具欄中的GUIDE圖標(biāo)。
啟動(dòng)GUIDE后,系統(tǒng)打開GUI快速啟動(dòng)向?qū)Ы缑?,界面上有“打開已有GUI(OpenExistingGUI)”和“新建GUI(CreateNewGUI)”兩個(gè)標(biāo)簽,用戶可以根據(jù)需要進(jìn)行選擇。
(2)選擇新建GUI標(biāo)簽,打開新建GUI對(duì)話框,如圖9-2所示。圖9-2GUI向?qū)Ы缑?.2.2GUI的可選控件和模板
1.GUI可選的控件
GUI可選的控件有以下幾種:
PushButton:普通按鈕,當(dāng)按鈕按下時(shí)則產(chǎn)生操作,如按下OK按鈕時(shí)進(jìn)行相應(yīng)操作并關(guān)閉對(duì)話框。
ToggleButton:開關(guān)按鈕。該按鈕包含兩個(gè)狀態(tài),第一次按下按鈕時(shí)按鈕狀態(tài)為“開”,再次按下時(shí)將其狀態(tài)改變?yōu)椤瓣P(guān)”。狀態(tài)為“開”時(shí)進(jìn)行相應(yīng)的操作。
RadioButton:?jiǎn)芜x按鈕。該按鈕用于在一組選項(xiàng)中選擇一個(gè)并且每次只能選擇一個(gè)。用鼠標(biāo)點(diǎn)擊選項(xiàng)即可選中相應(yīng)的選項(xiàng),選擇新的選項(xiàng)時(shí)原來的選項(xiàng)自動(dòng)取消。
ButtonGroup:按鈕組控件。該按鈕將按鈕集合進(jìn)行成組管理。
CheckBox:復(fù)選框。該按鈕用于同時(shí)選中多個(gè)選項(xiàng)。當(dāng)需要向用戶提供多個(gè)互相獨(dú)立的選項(xiàng)時(shí),可以使用復(fù)選框。
ListBox:列表框控件。該按鈕將項(xiàng)目進(jìn)行列表,用于在一組選項(xiàng)中選擇一個(gè)或多個(gè)。
EditText:文本編輯框,用戶可以在其中輸入或修改文本字符串。程序以文本為輸入時(shí)使用該工具。
StaticText:靜態(tài)文本。控制文本行的顯示,用于向用戶顯示程序使用說明、顯示滑動(dòng)條的相關(guān)數(shù)據(jù)等。用戶不能修改靜態(tài)文本的內(nèi)容。
EditText:編輯框控件。該按鈕用于文本行的編輯、顯示,用戶可以修改文本的內(nèi)容。
Slider:滑動(dòng)條,通過滑動(dòng)條的方式指定參數(shù)。指定數(shù)據(jù)的方式可以有拖動(dòng)滑動(dòng)條、點(diǎn)擊滑動(dòng)槽的空白處,或者點(diǎn)擊按鈕?;瑒?dòng)條的位置顯示的為指定數(shù)據(jù)范圍的百分比。
PopupMenu:彈出式菜單控件,單擊下拉箭頭后列出項(xiàng)目供選擇,類似于列表框控件。
Axes:坐標(biāo)軸控件,建立坐標(biāo)系。
Panel:面板控件,是裝載其他控件的容器。
2.GUI功能模板
在新建GUI的對(duì)話框中,GUIDE在左側(cè)提供了4個(gè)功能模板:
BlankGUI(Default):空白的GUI,用戶界面上不含任何控件,默認(rèn)為空GUI。
GUIwithUicontrols:是帶用戶控件(Uicontrols)的用戶界面。該界面包括PushButton、Slider、RadioButton、CheckBoxes、Editable和StaticTextComponents、ListBoxes和ToggleButton等組件。
GUIwithAxesandMenu:帶坐標(biāo)軸和菜單的用戶界面。
ModalQuestionDialog:帶詢問對(duì)話框的用戶界面。用戶可以保存該GUI模板,選中左下角的復(fù)選框,并鍵入保存位置及名稱,例如:輸入“simples_gui1”。
如果不保存,則在第一次運(yùn)行該GUI時(shí)系統(tǒng)提示保存。設(shè)置完成后,單擊OK按鈕進(jìn)入GUI的Layout編輯。此時(shí)系統(tǒng)會(huì)打開界面編輯窗口和程序編輯窗口,如果不保存該GUI,則只有界面編輯窗口。9.2.3GUI窗口的布局與Layout編輯器
1.創(chuàng)建GUI對(duì)象
選擇新建空的GUI用戶界面窗口,選中下面的保存選項(xiàng),并輸入文件名,單擊OK按鈕,打開Layout編輯器窗口,如圖9-3所示。圖9-3Layout(布局)編輯器窗口該窗口中包括菜單欄、控制工具欄、GUI控件面板、GUI編輯區(qū)域等,在GUI編輯區(qū)域右下腳,可以通過鼠標(biāo)拖曳的方式改變GUI界面的大小。
當(dāng)用戶在GUIDE中打開一個(gè)GUI時(shí),該GUI將顯示在Layout編輯器中,Layout編輯器是所有GUIDE工具的控制面板。在Layout編輯視圖,可以使用如下工具:
LayoutEditor:布局編輯器;
AlignmentTool:對(duì)齊工具;
PropertyInspector:對(duì)象屬性觀察器;
ObjectBrowser:對(duì)象瀏覽器;
MenuEditor:菜單編輯器。
2.控件的添加和對(duì)齊
向GUI中添加控件包括添加、設(shè)置控件屬性,設(shè)置控件顯示文本等。
用戶可以使用鼠標(biāo)把模板左邊的控件,如按鈕、坐標(biāo)軸、單選按鈕等,拖動(dòng)到中間的布局區(qū)域。
(1)首先向界面中添加按鈕。用鼠標(biāo)點(diǎn)擊“PushButton”,并拖曳至GUI編輯區(qū)。
(2)在該按鈕上點(diǎn)擊右鍵,選擇“Duplicate”,將該按鈕復(fù)制兩次,并移動(dòng)到合適的位置。
(3)然后將這三個(gè)按鈕添加到面板中。在編輯區(qū)的右側(cè)添加面板,并將三個(gè)按鈕移動(dòng)到面板中。
(4)繼續(xù)向其中添加靜態(tài)文本、彈出菜單和繪圖區(qū),所得到的結(jié)果如圖9-4所示。
3.改變GUI窗口的大小
在布局編輯器中可以很方便地改變GUI中網(wǎng)格區(qū)域的大小,只需單擊網(wǎng)格區(qū)域的右下角,當(dāng)鼠標(biāo)變?yōu)榧^形式時(shí),拖動(dòng)鼠標(biāo),即可適當(dāng)改變窗口的大小。圖9-4添加控件9.2.4GUI控件的屬性控制
由于繼承對(duì)所有類型的對(duì)象有一些相同的屬性和方法(如表9-2所示),然而這其中有一部分屬性和方法對(duì)某些對(duì)象來說是沒有意義的,具體見每種類型對(duì)象的方法,可查閱具體對(duì)象的幫助文件。表9-2共有屬性和方法
1.屬性查看器
用戶可以使用如下三種方式打開屬性查看器來觀察和修改屬性:
在布局窗口中雙擊某個(gè)控件。
在“View”菜單中選擇“PropertyInspector”選項(xiàng)。
右擊某個(gè)控件并從彈出的快捷菜單中選擇“InspectProperties”項(xiàng)。
每一個(gè)控件都有自己的屬性,常規(guī)屬性有:
(1)控件風(fēng)格和外觀屬性:
BackgroundColor:設(shè)置控件背景顏色,使用[RGB]或顏色定義。
CData:在控件上顯示的真彩色圖像,使用矩陣表示。
ForegroundColor:文本顏色。
String:控件上的文本,以及列表框和彈出菜單的選項(xiàng)。
Visible:控件是否可見。
(2)對(duì)象的常規(guī)信息屬性:
Enable屬性:表示此控件的使能狀態(tài)。當(dāng)將其設(shè)置為“on”時(shí),表示可選;設(shè)置為“off”時(shí),則表示不可選。
Style:控件對(duì)象類型。
Tag:用戶定義的控件表示。
TooltipString屬性:提示信息顯示。當(dāng)鼠標(biāo)指針位于此控件上時(shí),顯示提示信息。
UserData:用戶指定數(shù)據(jù)。
Position:控件對(duì)象的尺寸和位置。
Units:設(shè)置控件的位置及大小的單位。
有關(guān)字體的屬性:如FontAngle、FontName等。
(3)控件當(dāng)前狀態(tài)信息屬性:
ListboxTop:在列表框中顯示的最頂層的字符串的索引。
Max:最大值。
Min:最小值。
Value:控件的當(dāng)前值。
(4)控件回調(diào)函數(shù)的執(zhí)行屬性:
BusyAction:處理回調(diào)函數(shù)的中斷。有兩種選項(xiàng),即Cancel(取消中斷事件)和queue(排隊(duì)(默認(rèn)設(shè)置))。
ButtonDownFcn屬性:按鈕按下時(shí)的處理函數(shù)。
CallBack屬性:是連接程序界面整個(gè)程序系統(tǒng)的實(shí)質(zhì)性功能的紐帶。該屬性值應(yīng)該為一個(gè)可以直接求值的字符串,在該對(duì)象被選中和改變時(shí),系統(tǒng)將自動(dòng)地對(duì)字符串進(jìn)行求值。
CreateFcn:在對(duì)象產(chǎn)生過程中執(zhí)行的回調(diào)函數(shù)。
DeleteFcn:刪除對(duì)象過程中執(zhí)行的回調(diào)函數(shù)。
Interruptible屬性:指定當(dāng)前的回調(diào)函數(shù)在執(zhí)行時(shí)是否允許中斷,去執(zhí)行其他的函數(shù)。
2.設(shè)置控件屬性
1)設(shè)置控件標(biāo)志屬性
控件標(biāo)志用于M文件中識(shí)別控件。通過設(shè)置控件的標(biāo)簽,為每個(gè)控件指定一個(gè)標(biāo)志。同一個(gè)GUI中每個(gè)控件的標(biāo)志應(yīng)是唯一的??丶?chuàng)建時(shí)系統(tǒng)會(huì)為其指定一個(gè)默認(rèn)標(biāo)志,用戶應(yīng)在保存前修改該標(biāo)志為具有實(shí)際意義的字符串,該字符串應(yīng)能反應(yīng)該控件的基本信息。
點(diǎn)擊工具欄中PropertyInspector項(xiàng),或雙擊某個(gè)控件打開屬性編輯器,設(shè)置該控件的屬性,如設(shè)置按鈕的標(biāo)志屬性,標(biāo)簽名Tag屬性為surf_pushbutton。
2)設(shè)置控件顯示文本
多數(shù)控件具有標(biāo)簽、列表或顯示文本,用以和其他控件區(qū)分。設(shè)置控件的顯示文本可以通過設(shè)置該控件的屬性完成。打開屬性編輯器,選擇需要編輯的控件或者雙擊激活屬性編輯器,編輯該控件的屬性,如圖9-5所示。
不同類型控件的顯示文本如下:
PushButton、ToggleButton、RadioButton、CheckBox:這些控件具有標(biāo)簽,可以通過其String屬性修改其顯示文本,例如設(shè)置第一個(gè)按鈕的顯示文字,即將String屬性設(shè)為Surf。圖9-5設(shè)置控件屬性
Pop-UpMenu:彈出菜單具有多個(gè)顯示文本,在設(shè)置時(shí),點(diǎn)擊String后面的按鈕,彈出編輯器。在編輯器中輸入需要顯示的字符串,每行一個(gè),完成后點(diǎn)擊確認(rèn)。
EditText:文本編輯框用于向用戶提供輸入和修改文本的界面。程序設(shè)計(jì)時(shí)可以選擇初始文本。文本編輯框中文本設(shè)置與彈出菜單基本相同。需要注意的是,文本編輯框通常只接受一行文本,如果需要顯示或接受多行文本,則需要設(shè)置屬性中的Max和Min,使其差值大于1。
StaticText:當(dāng)靜態(tài)文本只有一行時(shí),可以通過String后面的輸入框直接輸入,當(dāng)文本有多行時(shí),激活編輯器進(jìn)行設(shè)置。
ListBox:列表框用于向用戶顯示一個(gè)或多個(gè)項(xiàng)目。在String編輯框中輸入要顯示的列表,點(diǎn)擊OK。當(dāng)列表框不足以顯示其中的項(xiàng)目時(shí),可以通過ListBoxTop屬性設(shè)置優(yōu)先顯示的項(xiàng)。
Panel、ButtonGroup:面板和按鈕組用于將其他控件分組。面板和按鈕組可以有標(biāo)題,在其屬性String中輸入目標(biāo)文本即可。另外,標(biāo)題可以顯示在面板的任何位置,可以通過TitlePosition的值設(shè)置標(biāo)題的位置。默認(rèn)情況下,標(biāo)題位于頂部。
MATLAB中沒有為Slider、Axes、ActiveXControl等控件提供文本顯示,不過用戶可以通過靜態(tài)文本為這些控件設(shè)置標(biāo)題或說明。對(duì)于圖形坐標(biāo)系(Axes),用戶還可以通過圖形標(biāo)注函數(shù)進(jìn)行設(shè)置,如xlable、ylable等。
3)用同樣方法設(shè)置其他按鈕和其他控件的屬性
添加控件后,用戶可以通過鼠標(biāo)拖曳、屬性編輯器等改變控件的位置,或者通過工具欄中的對(duì)齊工具對(duì)控件進(jìn)行統(tǒng)一規(guī)劃。 9.3編寫響應(yīng)函數(shù)
9.3.1響應(yīng)函數(shù)的定義及類型
1.響應(yīng)函數(shù)(回調(diào)函數(shù))的定義及類型在創(chuàng)建GUI界面時(shí),系統(tǒng)已經(jīng)為其自動(dòng)生成了所需要的文件,一個(gè)GUI通常包含兩個(gè)文件,一個(gè)FIG文件和一個(gè)M文件。
FIG文件的擴(kuò)展名為(.fig),是一種MATLAB文件,其中包含GUI的布局及其中包含的所有控件的相關(guān)信息。FIG文件為二進(jìn)制文件,只能通過GUI向?qū)нM(jìn)行修改。
M文件中包含該GUI中控件對(duì)應(yīng)的響應(yīng)函數(shù)及系統(tǒng)函數(shù)等,它們包含GUI的初始代碼及相關(guān)響應(yīng)函數(shù)的模板。但這些函數(shù)的初始代碼并不包括具體的操作動(dòng)作,用戶需要根據(jù)自己的要求為界面中的控件編寫響應(yīng)函數(shù)的具體內(nèi)容,這些函數(shù)決定當(dāng)事件發(fā)生時(shí)的具體操作。
M文件通常包含一個(gè)與文件同名的主函數(shù),各個(gè)控件對(duì)應(yīng)的響應(yīng)函數(shù),這些響應(yīng)函數(shù)為主函數(shù)的子函數(shù)。響應(yīng)函數(shù)的類型如表9-3所示。
2.訪問響應(yīng)函數(shù)
通常情況下,在保存GUI時(shí),向?qū)?huì)自動(dòng)向M文件中添加響應(yīng)函數(shù)。另外,用戶也可以向M文件中添加其他的響應(yīng)函數(shù)。
通過向?qū)В脩艨梢砸韵旅鎯煞N方式向M文件中添加響應(yīng)函數(shù)。
(1)在GUIDE窗口中,在一個(gè)控件上點(diǎn)擊右鍵,在彈出的菜單的Viewcallbacks中選擇需要添加的響應(yīng)函數(shù)類型,向?qū)ё詣?dòng)將其添加到M文件中,并在文本編輯器中打開該函數(shù),用戶便可對(duì)其進(jìn)行編輯。如果該函數(shù)已經(jīng)存在,則打開該函數(shù)。
(2)在View菜單中,選擇Viewcallbacks中需要添加的響應(yīng)函數(shù)類型。也可以在View菜單中,選擇M-fileEditor,在文本編輯器中打開該函數(shù):
點(diǎn)擊編輯器中的函數(shù)查看工具(f圖標(biāo)),顯示該GUI中包含的函數(shù),包括各控件的響應(yīng)函數(shù)。
選擇一個(gè)響應(yīng)函數(shù)。
響應(yīng)函數(shù)與特定的GUI對(duì)象關(guān)聯(lián),或與GUI圖形關(guān)聯(lián)。當(dāng)事件發(fā)生時(shí),MATLAB調(diào)用該事件所激發(fā)的響應(yīng)函數(shù)。
GUI圖形及各種類型的控件有不同的響應(yīng)函數(shù)類型。每個(gè)控件可以擁有的響應(yīng)函數(shù)定義為該控件的屬性,例如,一個(gè)按鈕可以擁有五種響應(yīng)函數(shù)屬性:ButtonDownFcn、Callback、CreateFcn、DeleteFcn和KeyPressFcn。用戶可以同時(shí)為每個(gè)屬性創(chuàng)建響應(yīng)函數(shù)。GUI圖形本身也可以擁有特定類型的響應(yīng)函數(shù)。
每一種類型的響應(yīng)函數(shù)都有其觸發(fā)機(jī)制或者事件,MATLAB中的響應(yīng)函數(shù)屬性、對(duì)應(yīng)的觸發(fā)事件及可以應(yīng)用的控件,如表9-4所示。9.3.2響應(yīng)函數(shù)的語(yǔ)法、參數(shù)與關(guān)聯(lián)
MATLAB中對(duì)響應(yīng)函數(shù)的語(yǔ)法和參數(shù)有一些約定,在GUI向?qū)?chuàng)建響應(yīng)函數(shù)并寫入M文件時(shí)便遵守這些約定。如下面為按鈕的響應(yīng)函數(shù)模板:
%Executesonbuttonpressinsurf_pushbutton.
functionsurf_pushbutton_Callback(hObject,eventdata,handles)
%hObjecthandletosurf_pushbutton(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
1.函數(shù)的名稱
GUI向?qū)?chuàng)建函數(shù)模板時(shí),函數(shù)的名稱:控件標(biāo)簽(Tag屬性)?+?下劃線?+?函數(shù)屬性。如上面的模板中,Tag屬性為surf_pushbutton,響應(yīng)函數(shù)的屬性為Callback,因此函數(shù)名為surf_pushbutton_Callback。
每個(gè)控件都有幾種回調(diào)函數(shù):
CreateFcn:是在控件對(duì)象創(chuàng)建的時(shí)候發(fā)生(一般為初始化樣式,顏色,初始值等)。
DeleteFcn:是在空間對(duì)象被清除時(shí)發(fā)生。
ButtonDownFcn和KeyPressFcn:分別為鼠標(biāo)點(diǎn)擊和按鍵事件的Callback。
CallBack:為一般回調(diào)函數(shù),因不同的控件而異。例如按鈕被按下時(shí)發(fā)生,下拉框改變值時(shí)發(fā)生,sliderbar拖動(dòng)時(shí)發(fā)生,等等。
2.響應(yīng)函數(shù)包含的參數(shù)
在添加控件后第一次保存GUI時(shí),向?qū)騇文件中添加相應(yīng)的響應(yīng)函數(shù),函數(shù)名由當(dāng)前Tag屬性的當(dāng)前值確定。因此,如果需要改變Tag屬性的默認(rèn)值,請(qǐng)?jiān)诒4鍳UI前進(jìn)行。
響應(yīng)函數(shù)包含如下參數(shù):
hObject:對(duì)象句柄,發(fā)生事件的源控件,如觸發(fā)該函數(shù)的控件的句柄;
eventdata:保留參數(shù);
handles:為傳入的對(duì)象句柄它是為一個(gè)結(jié)構(gòu)體,包含圖形中所有對(duì)象的句柄,如:handles=
figure1:160.0011
edit1:9.0020
uipanel1:8.0017
popupmenu1:7.0018
pushbutton1:161.0011
output:160.0011
其中,包含了文本編輯框、面板、彈出菜單和按鈕。
GUI向?qū)?chuàng)建handles結(jié)構(gòu)體,并且在整個(gè)程序運(yùn)行中保持其值不變。所有的響應(yīng)函數(shù)使用該結(jié)構(gòu)體作為輸入?yún)?shù)。
3.響應(yīng)函數(shù)的關(guān)聯(lián)
一個(gè)GUI中包含多個(gè)控件,GUIDE中提供了一種方法,用于指定每個(gè)控件所對(duì)應(yīng)的響應(yīng)函數(shù)。
GUIDE通過每個(gè)控件的響應(yīng)屬性將控件與對(duì)應(yīng)的響應(yīng)函數(shù)相關(guān)聯(lián)。在默認(rèn)情況下,GUIDE將每個(gè)控件的最常用的響應(yīng)屬性,如將Callback設(shè)置為%automatic。
如每個(gè)按鈕有五個(gè)響應(yīng)屬性,即ButtonDownFcn、Callback、CreateFcn、DeleteFcn和KeyPressFcn,用戶可以通過屬性編輯器將其他響應(yīng)屬性設(shè)置為%automatic。
當(dāng)再次保存GUI時(shí),GUIDE將%automatic替換為響應(yīng)函數(shù)的名稱,該函數(shù)的名稱由該控件Tag屬性及響應(yīng)函數(shù)的名稱組成。9.3.3初始化響應(yīng)函數(shù)
GUI的初始化函數(shù)包括opening()函數(shù)和output()函數(shù)。
1.OPening()函數(shù)
打開函數(shù)(Openingfunction)在GUI出現(xiàn)之前實(shí)施操作。
在每個(gè)GUIM文件中,opening函數(shù)是第一個(gè)調(diào)用的函數(shù)。該函數(shù)在所有控件創(chuàng)建完成后,GUI顯示之前運(yùn)行。用戶可以通過opening()函數(shù)設(shè)置程序的初始任務(wù),如創(chuàng)建數(shù)據(jù)、讀入數(shù)據(jù)等。
通常,Opening()函數(shù)的名稱為“M文件名?+?_OpeningFcn”,如下面的初始模板:
%ExecutesjustbeforeexGUIplotismadevisible.
functionexGUIplot_OpeningFcn(hObject,eventdata,handles,varargin)
%Thisfunctionhasnooutputargs,seeOutputFcn.
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%varargincommandlineargumentstoexGUIplot(seeVARARGIN)
%ChoosedefaultcommandlineoutputforexGUIplot
handles.output=hObject;
%Updatehandlesstructure
guidata(hObject,handles);
%UIWAITmakesexGUIplotwaitforuserresponse(seeUIRESUME)
%uiwait(handles.figure1);其中,文件名為exGUIplot,函數(shù)名為exGUIplot_OpeningFcn。該函數(shù)包含四個(gè)參數(shù),第四個(gè)參數(shù)varargin允許用戶通過命令行向opening()函數(shù)傳遞參數(shù)。Opening()函數(shù)將這些參數(shù)添加到結(jié)構(gòu)體handles中,供響應(yīng)函數(shù)調(diào)用。該函數(shù)中包含三行語(yǔ)句:
handles.output=hObject:向結(jié)構(gòu)體handles中添加新元素output,并將其值賦為輸入?yún)?shù)hObject,即GUI的句柄。該句柄供output()函數(shù)調(diào)用。
guidata(hObject,handles):保存handles。用戶必須通過GUIdata保存結(jié)構(gòu)體handles的任何改變。
uiwait(handles.figure1):在初始情況下,該語(yǔ)句并不執(zhí)行。該語(yǔ)句用于中斷GUI執(zhí)行等待用戶反應(yīng)或GUI被刪除。如果需要運(yùn)行該語(yǔ)句,刪除前面的“%”即可。圖9-6選擇OpeningFcn()函數(shù)
打開函數(shù)包含在GUI可見之前進(jìn)行操作的代碼,用戶可以在打開函數(shù)中訪問GUI的所有控件,因?yàn)樗蠫UI中的對(duì)象都在調(diào)用打開函數(shù)之前就已經(jīng)創(chuàng)建。如果用戶需要在訪問GUI之前實(shí)現(xiàn)某些操作,如創(chuàng)建數(shù)據(jù)或圖形,那么可以通過在打開函數(shù)中增添代碼、添加數(shù)據(jù)來加以實(shí)現(xiàn)。
編寫opening()的數(shù)據(jù)生成函數(shù):
(1)在GUI向?qū)е悬c(diǎn)擊M-fileEditor,打開M文件編輯器。打開的編輯器中為該GUI對(duì)應(yīng)的M文件。
(2)點(diǎn)擊編輯器中的“f()”圖標(biāo),打開函數(shù)查看工具,顯示該GUI中包含的函數(shù),包括各控件的響應(yīng)函數(shù),選擇OpeningFcn()函數(shù),該函數(shù)前面部分是該GUI保存的文件名。對(duì)于一個(gè)文件名為“exGUIplot”的GUI來說,它的打開函數(shù)名為“simples_gui1_OpeningFcn”。如圖9-6所示。
該函數(shù)中已有部分初始的默認(rèn)內(nèi)容,可以在打開函數(shù)中增添自己需要的操作代碼和數(shù)據(jù)來實(shí)現(xiàn)自己需要的功能。例如希望該函數(shù)在GUI出現(xiàn)之前運(yùn)行生成三維表面圖形,在GUI出現(xiàn)時(shí)顯示該圖形??稍趏pening()函數(shù)中添加以下代碼(黑色部分):
functionsimples_gui1_OpeningFcn(hObject,eventdata,handles,varargin)
%Thisfunctionhasnooutputargs,seeOutputFcn.
%hObjecthandletofigure
%eventdata?reserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%varargincommandlineargumentstosimples_gui1(seeVARARGIN)
%Choosedefaultcommandlineoutputforsimples_gui1
handles.output=hObject;
handles.peaks=peaks(35);
handles.membrane=membrane;
[x,y]=meshgrid(-8:.5:8);
r=sqrt(x.^2+y.^2)+eps;
sinc=sin(r)./r;
handles.sinc=sinc;
%Setthecurrentdatavalue.
handles.current_data=handles.peaks;
contour(handles.current_data)
%ChoosedefaultcommandlineoutputforGUIPlot
handles.output=hObject;
2.output()函數(shù)
輸出函數(shù)(outputfunction)在必要的時(shí)候向命令行輸出數(shù)據(jù)。用于向命令行返回GUI運(yùn)行過程中產(chǎn)生的輸出結(jié)果,這一點(diǎn)在用戶需要將某個(gè)變量傳遞給另一個(gè)GUI時(shí)尤其實(shí)用。該函數(shù)在opening()函數(shù)返回控制權(quán)和控制權(quán)返回至命令行之間運(yùn)行。因此,輸出參數(shù)必須在opening()函數(shù)中生成,或者在opening()函數(shù)中調(diào)用uiwait()函數(shù)中斷output()的執(zhí)行,等待其他響應(yīng)函數(shù)生成輸出參數(shù)。
output()函數(shù)的函數(shù)名為“M文件名+_OutputFcn”,如GUIDE在輸出函數(shù)中生成如下初始模板代碼:
%Outputsfromthisfunctionarereturnedtothecommandline.
functionvarargout=simples_gui1_OutputFcn(hObject,eventdata,handles)
%varargoutcellarrayforreturningoutputargs(seeVARARGOUT);
%hObjecthandletofigure
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%Getdefaultcommandlineoutputfromhandlesstructure
varargout{1}=handles.output;
該函數(shù)的函數(shù)名為exGUIplot_OutputFcn()。output()函數(shù)有一個(gè)輸出參數(shù)varargout。在默認(rèn)情況下,output()函數(shù)將handles.output的值賦予varargout,因此output()的默認(rèn)輸出為GUI的句柄。用戶可以通過改變handles.output的值改變函數(shù)輸出結(jié)果。9.3.4添加響應(yīng)函數(shù)
1.按鈕的響應(yīng)函數(shù)
(1)用戶可以按上述方法,通過M文件編輯器中的函數(shù)查看工具查找相應(yīng)函數(shù),或者使用右鍵彈出菜單查找相應(yīng)函數(shù)。
在GUI編輯器中右鍵點(diǎn)擊相應(yīng)控件,例如“表面圖”按鈕,在彈出菜單中選擇菜單命令“ViewCallbacks?|?Callback”,系統(tǒng)自動(dòng)打開M文件編輯器,并且光標(biāo)位于相應(yīng)的函數(shù)處。該函數(shù)中已有部分默認(rèn)內(nèi)容,可以在其中添加如下程序生成該按鈕的響應(yīng)函數(shù)。
%Executesonbuttonpressinsurf_pushbutton.
functionsurf_pushbutton1_Callback(hObject,eventdata,handles)
%hObjecthandletosurf_pushbutton1(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
surf(handles.current_data);
guidata(hObject,handles);
一般,Callback回調(diào)函數(shù)都以guidata(hObject,handles)語(yǔ)句結(jié)束以更新數(shù)據(jù)。
(2)用同樣方法為其他按鈕添加等值線、網(wǎng)格圖的響應(yīng)函數(shù)。
2.彈出菜單的響應(yīng)函數(shù)
彈出菜單的響應(yīng)函數(shù)首先取得彈出菜單的String屬性和Value屬性,后來通過分支語(yǔ)句選擇數(shù)據(jù)。彈出菜單的響應(yīng)函數(shù)如下:
%Executesonselectionchangeindata_pop_up.
functiondata_pop_up_Callback(hObject,eventdata,handles)
%hObjecthandletodata_pop_up(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
%Determinetheselecteddataset.
str=get(hObject,'String');
val=get(hObject,'Value');
%Setcurrentdatatotheselecteddataset.
switchstr{val};
case'Peaks'%Userselectspeaks
handles.current_data=handles.peaks;
case'Membrane'%Userselectsmembrane
handles.current_data=handles.membrane;
case'Sinc'%Userselectssinc
handles.current_data=handles.sinc;
end
%Savethehandlesstructure.
guidata(hObject,handles)
%Hints:contents=get(hObject,'String')returnsdata_pop_upcontentsascellarray
%contents{get(hObject,'Value')}returnsselecteditemfromdata_pop_up9.3.5運(yùn)行GUI
單擊工具欄最右邊的綠色箭頭按鈕,即運(yùn)行當(dāng)前的GUI窗口,結(jié)果如圖9-7所示。圖9-7當(dāng)前的GUI窗口運(yùn)行結(jié)果9.3.6創(chuàng)建菜單欄
當(dāng)使用GUIDE生成GUI時(shí),默認(rèn)情況是不生成菜單欄和工具條的,如果需要的話,可以創(chuàng)建。在MATLAB中可以創(chuàng)建兩種菜單:菜單欄(主菜單)和右鍵彈出式菜單,兩種菜單都可以通過菜單編輯器創(chuàng)建。
在GUIDE窗口中,選擇“Tools”菜單中“MenuEditor…”選項(xiàng)激活菜單編輯器,或者選擇工具欄中的菜單編輯器圖標(biāo)。
該界面中包含兩個(gè)標(biāo)簽,即MenuBar和ContextMenus,分別用于創(chuàng)建菜單欄和右鍵菜單。工具欄中包含三組工具,分別為新建工具、編輯工具及刪除。編輯菜單項(xiàng)目時(shí),右側(cè)顯示該項(xiàng)目的屬性。
(1)選擇菜單欄的“MenuBar”標(biāo)簽,此時(shí)工具欄中的新建菜單欄選項(xiàng)為激活狀態(tài),而新建右鍵菜單選項(xiàng)為灰色。
(2)點(diǎn)擊“NewMenu”項(xiàng),新建菜單,默認(rèn)名稱為Untitled1。
(3)菜單屬性的設(shè)置。新建后用鼠標(biāo)點(diǎn)擊菜單名,在窗口右側(cè)顯示該菜單的屬性,可以對(duì)其進(jìn)行以下編輯。單擊圖中的菜單標(biāo)題Untitled1,將在菜單編輯器的右邊顯示該菜單的屬性提供給用戶進(jìn)行編輯,如Label、Tag、Accelerator、Separator和Checked等屬性,如圖9-8所示。圖9-8設(shè)置菜單項(xiàng)屬性可以在右側(cè)屬性編輯器中設(shè)置菜單項(xiàng)的屬性,其中:
Label:該菜單項(xiàng)的顯示文本;
Tag:該項(xiàng)的標(biāo)簽,必須是唯一的,用于在代碼中識(shí)別該項(xiàng);
Accelerator:設(shè)置鍵盤快捷鍵。鍵盤快捷鍵用于快速訪問不包含子菜單的菜單項(xiàng)。在Ctrl+?后面的輸入框中選擇字母,當(dāng)同時(shí)按下Ctrl鍵和該字母時(shí),則訪問該菜單項(xiàng)。需要注意的是,如果該快捷鍵和系統(tǒng)其他快捷鍵沖突,則該快捷鍵可能失效。
Separator:在該項(xiàng)目上畫以橫線,與其他項(xiàng)目分開。
Checked:選中該選項(xiàng)后,在第一次訪問該項(xiàng)目后會(huì)在該項(xiàng)目后進(jìn)行標(biāo)記。
Enablethisitem:選中該選項(xiàng),則在第一次打開菜單時(shí)該項(xiàng)目可用。如果取消該選項(xiàng),則在第一次打開菜單時(shí),該項(xiàng)目顯示為灰色。
Moreoptions:用于打開屬性編輯器,可以對(duì)該項(xiàng)目進(jìn)行更多編輯。
(4)添加新的菜單項(xiàng)。創(chuàng)建菜單欄后向其中添加新的菜單項(xiàng)目,點(diǎn)擊工具欄中的“NewMenu”圖標(biāo)新建菜單項(xiàng)。
(5)添加新的子菜單項(xiàng)。創(chuàng)建菜單項(xiàng)后向其中添加新的子菜單項(xiàng)目,選擇菜單項(xiàng),點(diǎn)擊工具欄中的“NewMenuItem”圖標(biāo)新建子菜單項(xiàng),如圖9-9所示。圖9-9添加子菜單項(xiàng)
(6)在Callback文本框中選擇子菜單項(xiàng)的響應(yīng)函數(shù),如為打開文件子菜單項(xiàng)響應(yīng)函數(shù)添加以下代碼:
functionopen_Callback(hObject,eventdata,handles)
%hObjecthandletoopen(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
file=uigetfile('*.m');
if~isequal(file,0)
open(file);
end9.3.7創(chuàng)建右鍵彈出式菜單
右鍵彈出式菜單也叫上下文菜單,是指當(dāng)用戶在關(guān)聯(lián)的對(duì)象上點(diǎn)擊右鍵時(shí)才會(huì)顯示內(nèi)容,創(chuàng)建彈出式右鍵菜單方法如下:
(1)選擇編輯器中的“ContextMenus”標(biāo)簽。此時(shí)NewContextMenu菜單處于激活狀態(tài),其他標(biāo)簽為灰色。
(2)單擊“NewContextMenu”項(xiàng),為右鍵菜單添加父菜單項(xiàng),一個(gè)臨時(shí)編號(hào)命名的菜單項(xiàng)Untitled_1出現(xiàn)在Tag文本框中,為父菜單項(xiàng)命名,例如:axes_context_menu。
(3)選擇父菜單項(xiàng),然后點(diǎn)擊工具欄中的“NewMenuItem”圖標(biāo)新建子菜單項(xiàng),一個(gè)臨時(shí)編號(hào)命名的菜單項(xiàng)Untitled_1出現(xiàn)在Label、Tag文本框中。
(4)在Callback文本框中選擇子菜單項(xiàng)的響應(yīng)函數(shù),如更改坐標(biāo)系背景顏色為藍(lán)色的子菜單項(xiàng),為響應(yīng)函數(shù)添加以下代碼:
functionblue_background_Callback(hObject,eventdata,handles)
%hObjecthandletoblue_background(seeGCBO)
%eventdatareserved-tobedefinedinafutureversionofMATLAB
%handlesstructurewithhandlesanduserdata(seeGUIDATA)
set(gca,'Color','b',...
'XColor','k',...
'YColor','k',...
'ZColor','k')
(5)最后,需要將右鍵菜單與相應(yīng)的對(duì)象關(guān)聯(lián)。在GUI編輯窗口中,選擇需要關(guān)聯(lián)的對(duì)象,打開屬性編輯器,編輯其屬性。將其UIContextMenu屬性設(shè)置為待關(guān)聯(lián)的右鍵菜單名,如圖9-10所示。圖9-10對(duì)象與右鍵菜單關(guān)聯(lián)9.3.8創(chuàng)建工具條
在GUIDE窗口中,選擇Tools菜單中的“ToolbarEditor…”工具條編輯器或者單擊工具欄中的工具條編輯器圖標(biāo),為GUI添加工具條。
(1)在工具條編輯器中雙擊工具條命令圖標(biāo),或單擊選擇圖標(biāo),然后點(diǎn)擊“ADD”按鈕,將圖標(biāo)添加到工具條上,如圖9-11所示。圖9-11添加工具條圖標(biāo)
(2)工具欄上的圖標(biāo)是預(yù)定義的工具,代表了標(biāo)準(zhǔn)的MATLAB的工具集。它們的行為、動(dòng)作是內(nèi)建的,回調(diào)函數(shù)(callback)決定這些預(yù)定義工具的行為,在工具欄的預(yù)設(shè)工具與菜單欄的菜單項(xiàng)調(diào)用同一個(gè)的函數(shù),如標(biāo)準(zhǔn)工具(打開文件、保存數(shù)據(jù)、更改模式,等等),預(yù)定義工具都以%default顯示。用戶可以更改默認(rèn)設(shè)置%default,通過調(diào)用其他函數(shù)來自定義其他一些工具。
自定義工具。在工具面板(ToolPalette)選項(xiàng)組上部的兩個(gè)圖標(biāo)(P或T)創(chuàng)建pushtools和toggletools,參閱圖9-11。這些自定義工具都沒有內(nèi)置函數(shù),因此單擊時(shí),只有開和關(guān)兩個(gè)狀態(tài),如果使用這些圖標(biāo)時(shí),需要添加自己的回調(diào)函數(shù)。
(3)編輯屬性。工具條編輯器右邊是工具屬性,可以根據(jù)自己的需要對(duì)以下各項(xiàng)進(jìn)行編輯和更改。
CData:工具圖標(biāo)。
Tag:工具在程序內(nèi)部使用的名稱。
Enable:使能。決定用戶是否可以點(diǎn)擊。
Separator:分割符。
ClickedCallback:?jiǎn)螕魰r(shí)調(diào)用回調(diào)函數(shù)。
OffCallback(uitoggletoolonly):關(guān)閉狀態(tài)時(shí)調(diào)用回調(diào)函數(shù)。
OnCallback(uitoggletoolonly):打開狀態(tài)時(shí)調(diào)用回調(diào)函數(shù)。9.4編程創(chuàng)建GUI9.4.1定義GUI
1.定義功能本節(jié)要?jiǎng)?chuàng)建的GUI的功能是:
(1)在坐標(biāo)系內(nèi)繪制用戶選定的數(shù)據(jù)。
(2)打開該GUI時(shí),在坐標(biāo)系中顯示圖形。
(3)用戶可以通過彈出菜單選擇繪制其他函數(shù),選擇后點(diǎn)擊3個(gè)按鈕之一繪制網(wǎng)格圖、面圖或等值圖形。
2.選擇控件
該例的圖形用戶界面由6個(gè)控件組成,所包含的控件包括坐標(biāo)系、彈出菜單(其中包含3個(gè)繪圖選項(xiàng))、1個(gè)靜態(tài)文本、3個(gè)按鈕(在坐標(biāo)系中根據(jù)彈出菜單選擇的數(shù)據(jù)內(nèi)容繪制圖形)。
3.選擇、創(chuàng)建函數(shù)
(1)可以創(chuàng)建圖形句柄的常見函數(shù)有以下幾個(gè):
figure()函數(shù):創(chuàng)建一個(gè)新的圖形對(duì)象。
newplot()函數(shù):做好開始畫新圖形對(duì)象的準(zhǔn)備。
axes()函數(shù):創(chuàng)建坐標(biāo)軸圖形對(duì)象。
line()函數(shù):畫線。
patch()函數(shù):填充多邊形。
surface()函數(shù):繪制三維曲面。
image()函數(shù):顯示圖片對(duì)象。
uicontro1()函數(shù):生成用戶控制圖形對(duì)象。
uimenu()函數(shù):生成圖形窗口的菜單中層次菜單與下一級(jí)子菜單。
(2)獲取與設(shè)置對(duì)象屬性的常用函數(shù)有以下幾個(gè):
gcf()函數(shù):獲得當(dāng)前圖形窗口的句柄。
gca()函數(shù):獲得當(dāng)前坐標(biāo)軸的句柄。
gco()函數(shù):獲得當(dāng)前對(duì)象的句柄。
gcbo()函數(shù):獲得當(dāng)前正在執(zhí)行調(diào)用的對(duì)象的句柄。
gcbf()函數(shù):獲取包括正在執(zhí)行調(diào)用的對(duì)象的圖形句柄。
delete()函數(shù):刪除句柄所對(duì)應(yīng)的圖形對(duì)象。
findobj()函數(shù):查找具有某種屬性的圖形對(duì)象。
(3)其他可以選擇的幾個(gè)實(shí)用的函數(shù)有以下幾個(gè):
uigetfile()函數(shù):選擇文件對(duì)話框。
uiputfile()函數(shù):保存文件對(duì)話框。
uisetcolor()函數(shù):設(shè)置顏色對(duì)話框。
fontsetcolor()函數(shù):設(shè)置字體對(duì)話框。
msgbox()函數(shù):消息框。
warndlg()函數(shù):警告框。
helpdlg()函數(shù):幫助框。首先創(chuàng)建一個(gè)GUI文件。因?yàn)樵撐募瘮?shù),它是一個(gè)函數(shù)文件,而不是一個(gè)腳本文件。
(1)在MATLAB提示行鍵入edit,打開編輯器。
(2)在第一行定義函數(shù):functionsimples_gui2。
(3)接著函數(shù)定義行functionsimples_gui2輸入下列幫助文本(用%號(hào)打頭的是help文本),用于在MATLAB中使用help命令查詢,幫助文本后需要一個(gè)空行,MATLAB根據(jù)它確定help文本的結(jié)束。
functionsimples_gui2
%該例使用彈出菜單選擇數(shù)據(jù),
%單擊按鈕,使用從彈出菜單選擇的數(shù)據(jù),
%在坐標(biāo)軸中繪制網(wǎng)格、面圖或等值線圖形。
(4)由于該例使用嵌套函數(shù),因此可在函數(shù)的末尾添加end語(yǔ)句。
functionsimples_gui2
%該例使用彈出菜單選擇數(shù)據(jù),
%單擊按鈕,使用從彈出菜單選擇的數(shù)據(jù),
%在坐標(biāo)軸中繪制網(wǎng)格、面圖或等值線圖形。
end
(5)保存該文件,并命名為simples_gui2。9.4.2創(chuàng)建GUI主界面
在MATLAB中,一個(gè)GUI就是一個(gè)figure,當(dāng)生成主界面GUI時(shí)的第一步就是先創(chuàng)建figure,然后定位它在屏幕中的位置,并且在添加控件和初始化之前,使它不可視,即設(shè)置visible屬性為off。
設(shè)置方法是在end語(yǔ)句之前,輸入創(chuàng)建主界面的代碼如下:
%InitializeandhidetheGUIasitisbeingconstructed.
f=figure('Visible','off','Position',[360,500,450,285]);這段函數(shù)中的代碼的意義如下:
Figure:創(chuàng)建GUI圖形窗口,調(diào)用figure()函數(shù)使用了兩個(gè)property、value對(duì)。
Visible、off:定義figure現(xiàn)在不可視。
Position屬性是一個(gè)4元素的向量(離左邊距離、離底部距離、寬、高),指定它在屏幕中的位置和大小,默認(rèn)單位是像素pixels。
由于使用了figure()函數(shù)的默認(rèn)定義,GUI主界面有標(biāo)準(zhǔn)的菜單項(xiàng)顯示,還可以添加下列選項(xiàng)對(duì)GUI主界面進(jìn)行定義:
'MenuBar','none',...:隱藏該圖形原有的菜單欄;
'HandleVisibility','callback',...:設(shè)置該圖形只能通過響應(yīng)函數(shù)調(diào)用,并且阻止通過命令行向該窗口中寫入內(nèi)容或者刪除該窗口;
'Color',get(0,'defaultuicontrolbackgroundcolor')):定義圖形的背景色,該語(yǔ)句定義圖形的背景與GUI控件的默認(rèn)顏色相同,如按鈕的顏色。由于不同的系統(tǒng)會(huì)有不同的默認(rèn)設(shè)置,因此,該語(yǔ)句保證GUI的背景色與控件的顏色匹配。
如果要設(shè)置Visible的屬性值為on,則定義figure為可視。運(yùn)行Run或單擊F5按鈕,或在命令行輸入:
>>simples_gui2
則顯示自定義的GUI主界面如圖9-12所示,顯示有標(biāo)準(zhǔn)的菜單項(xiàng)和工具條。圖9-12自定義的GUI主界面9.4.3添加控件
該例的圖形用戶界面由6個(gè)控件組成:3個(gè)按鈕、1個(gè)靜態(tài)文本、1個(gè)彈出式菜單、1個(gè)坐標(biāo)軸。程序啟動(dòng)時(shí),首先用下列語(yǔ)句向GUI添加這些組件。使用uicontrol()函數(shù)創(chuàng)建按鈕、靜態(tài)文本和彈出菜單,使用axes()函數(shù)創(chuàng)建坐標(biāo)軸。
1.添加按鈕
在end語(yǔ)句之前,輸入創(chuàng)建按鈕的代碼如下:
%Constructthecomponents.
hsurf=uicontrol('Style','pushbutton',...
'String','Surf','Position',[315,220,70,25]);
hmesh=uicontrol('Style','pushbutton',...
'String','Mesh','Position',[315,180,70,25]);
hcontour=uicontrol('Style','pushbutton',...
'String','Countour','Position',[315,135,70,25]);代碼中語(yǔ)句的含義如下:
uicontrol:創(chuàng)建用戶控件。
Style:定義控件的類型,pushbutton指定該控件是一個(gè)按鈕。
String:指定每個(gè)按鈕上的文字:Surf、Mesh、Contour。
Position:是一個(gè)4元素的向量(離左邊距離、離底部距離、寬、高),指定按鈕在GUI中的位置和大小,默認(rèn)單位是像素pixels。
每次調(diào)用該控件時(shí)都返回該控件的句柄。
2.創(chuàng)建彈出菜單和靜態(tài)文本
使用uicontrol函數(shù)創(chuàng)建彈出菜單(下拉列表菜單)和靜態(tài)文本,彈出菜單的String屬性使用了3個(gè)元素的單元數(shù)組指定菜單項(xiàng):Peaks、Membrane和Sinc。靜態(tài)文本作為彈出菜單的標(biāo)簽,String屬性告訴用戶SelectData。在end語(yǔ)句之前,輸入創(chuàng)建彈出菜單和靜態(tài)文本的代碼如下:
hpopup=uicontrol(‘Style’,‘popupmenu’,...
‘String’,{‘Peaks’,‘Membrane’,‘Sinc’},...
‘Position’,[300,50,100,25]);
htext=uicontrol(‘Style’,‘text’,‘String’,‘SelectData’,...
'Position',[325,90,60,15]);代碼中語(yǔ)句的含義如下:
uicontrol:創(chuàng)建用戶控件(彈出菜單、文本)。
Style:定義控件的類型,Style值設(shè)置為popupmenu用于創(chuàng)建彈出菜單,text用于創(chuàng)建靜態(tài)文本控件。
String:用于設(shè)置菜單中顯示的內(nèi)容,這里顯示3個(gè)函數(shù)的名稱。
Position:定義控件的位置。
3.創(chuàng)建坐標(biāo)系
在end語(yǔ)句之前,輸入創(chuàng)建坐標(biāo)系的代碼如下:
%Axesforplottingtheselectedplot
ha=axes('Units','pixels','Position',[50,60,200,185]);
align([hsurf,hmesh,hcontour,htext,hpopup],'Center','None');
代碼中語(yǔ)句的含義如下:
axes,創(chuàng)建坐標(biāo)系;
Units:定義單位為像素。
Position:定義坐標(biāo)系的位置及大小。
align:除了坐標(biāo)軸之外,使所有控件按照自己的中心對(duì)齊。9.4.4設(shè)置GUI可視
在end語(yǔ)句之前,輸入下列代碼來設(shè)置GUI可視:
set(f,'Visible','on')
現(xiàn)在的程序代碼如下:
functionsimples_gui2
%該例使用彈出菜單選擇數(shù)據(jù)
%單擊按鈕,使用從彈出菜單選擇的數(shù)據(jù)
%在坐標(biāo)軸中繪制網(wǎng)格、面圖或等值線圖形
%CreateandhidetheGUIasitisbeingconstructed.
f=figure('Visible','off','Position',[360,500,450,285]);
%Constructthecomponents.
hsurf=uicontrol('Style','pushbutton','String','Surf',...
'Position',[315,220,70,25]);
hmesh=uicontrol('Style','pushbutton','String','Mesh',...
'Position',[315,180,70,25]);
hcontour=uicontrol('Style','pushbutton',...
'String',
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025醫(yī)院市場(chǎng)部工作計(jì)劃模板
- 四年級(jí)學(xué)期的班主任工作計(jì)劃范文
- 2025學(xué)年第二學(xué)期六班班級(jí)工作計(jì)劃
- XX年安全保衛(wèi)年度工作計(jì)劃
- 2025年春季教學(xué)計(jì)劃表
- 2025小學(xué)圖書室工作計(jì)劃怎么寫
- 公司網(wǎng)絡(luò)部2019年工作計(jì)劃范文
- 《大專生物化學(xué)酶》課件
- 圖書出版合同三方協(xié)議
- 天津勞務(wù)合同填寫范本
- 五年級(jí)道德與法治上冊(cè)全冊(cè)知識(shí)點(diǎn)考點(diǎn)歸納及期末
- JJF(浙) 1134-2017 微米千分尺校準(zhǔn)規(guī)范
- 人教版八年級(jí)上冊(cè)數(shù)學(xué)期末考試試卷有答案
- 2024年春季學(xué)期-計(jì)算機(jī)應(yīng)用基礎(chǔ)學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 2024年審計(jì)師考試-中級(jí)審計(jì)師考試近5年真題集錦(頻考類試題)帶答案
- SVG圖形渲染瓶頸分析
- 郵儲(chǔ)銀行財(cái)務(wù)報(bào)表分析報(bào)告
- 2024年中考英語(yǔ)二輪復(fù)習(xí):形容詞與副詞 專項(xiàng)訓(xùn)練(解析版)
- 人教版七年級(jí)數(shù)學(xué)上冊(cè) 6.1幾何圖形(第六章 幾何圖形初步 自學(xué)、復(fù)習(xí)、上課課件)
- 圍墻拆除重建施工方案
- 國(guó)開(陜西)2024年秋《社會(huì)調(diào)查》形考作業(yè)1-4答案
評(píng)論
0/150
提交評(píng)論