摘要:從設(shè)計圖形用戶界面的框架結(jié)構(gòu)及實現(xiàn)人機交互人手,著重說明用MATLAB語言進行圖形用戶界面程序設(shè)計時若干相關(guān)內(nèi)容的處理要點,并以具體實例,詳細論述了制作圖形用戶界面時回調(diào)函數(shù)的編寫方法。
關(guān)鍵詞:MATLAB;圖形用戶界面;控件設(shè)計;回調(diào)函數(shù)
中圖分類號:TP311文獻標識碼:A文章編號:1009-3044(2009)27-7767-02
Programme Design Based on MATLAB GUIDE
YAO Xiu-fang, CUI Song-fei
(Department of Opitical and Electionic Equipment, the Academy of Equipment Command Technology, Beijing 101416, China)
Abstract: The paper introduces lots of correlated main of GUI programme by MATLAB, based on design frame of GUI and achieving mutual Peron-Computer. then, the paper discusses the method of compiling Call-back function through an example when making GUI.
Key words: MATLAB; graphical user interfaces(GUI); control design; call-back function
MATLAB是一套高性能的數(shù)值計算和可視化的科技應(yīng)用軟件。它集高效的數(shù)值分析、完備的信號和圖形處理、功能豐富的應(yīng)用工具箱為一體,構(gòu)成了一個方便快捷,界面友好的用戶環(huán)境,是一種適應(yīng)多種硬件平臺的數(shù)學(xué)計算工具,它的出現(xiàn)給各課程的計算機輔助教學(xué)帶來了福音。特別是他的集成圖形用戶界面GUIDE(Graphical User Interface Development Environment),包含了窗口菜單、對話框、按鈕和文本等各種控件的用戶界面,用戶通過鍵盤或鼠標操作,就可以設(shè)計出具有自己獨特風格的圖形界面,再通過編寫回調(diào)函數(shù)就可以實現(xiàn)GUI與用戶之間的交互,為教學(xué)課件的制作提供了極大的方便,GUIDE程序設(shè)計分兩步進行,一是靜態(tài)圖形界面制作,二是控件回調(diào)函數(shù)編程。
1 靜態(tài)圖形界面制作
在matlab的命令窗口中鍵入“guide”命令,啟動GUIDE的GUI編輯器,GUI控制面板包括了所有的圖形界面控件uicontrol,如按鈕(Push Butter)、滑動條(Slider)、單選按鈕(Radio Butter)、復(fù)選框(Check box)、文本框(Edit Text)、文本標簽(Ststic Text)、下拉菜單(Pop-up Menu)、下拉列表框(List box)、雙位按鈕(Toggle Butter)、坐標軸(Axes)等,用戶選中需要的控件,拖移到空白處,即可創(chuàng)建出相應(yīng)的控件,并通過拖拉可調(diào)整其大小大小,如圖1所示。
每個控件都有自己的屬性Style,屬性Style決定控件的類型,將鼠標移至相應(yīng)的控件上雙擊,就可以打開屬性框,每個控件均有很多項屬性,但主要的有:“string” 用來定義控件的顯示字符;“Tag”是控件的重要屬性,是對控件進行編程和訪問時的標識名稱,每個控件創(chuàng)建時都會由開發(fā)環(huán)境自動生成一個標識,在程序設(shè)計中為了編輯、記憶和維護的方便,用戶要修改成自己好記憶的字符串,在編寫回調(diào)函數(shù)Callback時由此標識來識別;“name”是標題屬性;“BackgroundColor”是背景顏色設(shè)置,按用戶風格設(shè)定其值。圖1中各控件的“string”屬性和“Tag”屬性分別定義如下:
三個坐標的“Tag”標識分別為:axes10、axes1、axes2;兩個按鈕的“Tag”標識分別為:按鈕“沖激響應(yīng)”的“Tag”標識為pushbutton1,按鈕“階躍響應(yīng)” 的“Tag”標識為 pushbutton2;編輯文本框的“Tag”標識為RLC,用來接收鍵盤輸入電阻、電感及電容的值。
按照自己的構(gòu)想將需要的控件位置擺放合適,屬性設(shè)置好后保存GUI文件,文件名取為xhxt_5,matlab將用戶創(chuàng)建的GUI的所用信息保存在xhxt_5.fig 和xhxt_5.m兩個文件中,其中.fig為二進制文件,用來存放搭建GUI界面所需的所有圖形控件的完整描述信息(包括控件屬性);.m文件用來存放GUI程序響應(yīng)特定事件時調(diào)用的函數(shù),包含了運行GUI所需的所有程序代碼,包括GUI控件的回調(diào)函數(shù)Callback框架,.m決定GUI的行為,他控制GUI中控件如何響應(yīng)用戶操作,這兩個文件是互相影響的。系統(tǒng)自動生成的xhxt_5.m文件代碼中有三個關(guān)鍵函數(shù)需要用戶編寫程,分別說明如下:
OpeningFcn 函數(shù)
OpeningFcn函數(shù)是GUIDE在.m文件中自動生成的函數(shù)之一,其名字與文件名相同,如文件名為xhxt_5,則OpeningFcn函數(shù)的函數(shù)名為xhxt_5_OpeningFcn,OpeningFcn中的代碼在運行GUI并使其可視化之前執(zhí)行,因此該函數(shù)通常用來實現(xiàn)用戶訪問GUI之前所需的各種數(shù)據(jù)的初始化。
CreateFcn函數(shù)
GUIDE在為GUI自動生成 .m文件中,自動為每一個控件生成CreateFcn函數(shù),函數(shù)名由控件的“Tag”屬性決定,主要用來存放相應(yīng)控件的初始化函數(shù)。
Callback函數(shù)
GUIDE在為GUI自動生成 .m文件中,為每一個控件生成相應(yīng)的回調(diào)函數(shù)Callback定義行代碼,控件對用戶的響應(yīng)控制,需要在回調(diào)函數(shù)中添加相應(yīng)的代碼來實現(xiàn)??丶卣{(diào)函數(shù)的函數(shù)名由控件的“Tag”屬性決定?;卣{(diào)函數(shù)的編寫是GUIDE設(shè)計的重點,所有句柄對象都有如下三個回調(diào)函數(shù):
ButtonDownFcn(),鼠標左鍵在對象上單擊時執(zhí)行的回調(diào)函數(shù);
CreateFcn(),對象創(chuàng)建時執(zhí)行的回調(diào)函數(shù);
DeleteFcn(),對象刪除時執(zhí)行的回調(diào)函數(shù)。
回調(diào)都是可以在命令窗口中可執(zhí)行的字符串,當屬性激活時,它傳給eval函數(shù)來執(zhí)行?;卣{(diào)編程可以采用不同的形式或不同的調(diào)用方式來執(zhí)行相應(yīng)的程序。在編寫回調(diào)函數(shù)時句柄圖形函數(shù),常用的幾個句柄函數(shù)為:set設(shè)置對象屬性;get獲取對象屬性;gcf獲得當前圖形的句柄;gca獲得當前坐標軸的句柄;gco獲得當前對象的句柄;Axes創(chuàng)建坐標軸對象;Image創(chuàng)建圖形對象等。
2 編程控制GUI
在靜態(tài)圖形界面設(shè)計好后,用戶可以通過鼠標或鍵盤激活這些圖形對象,使計算機執(zhí)行相應(yīng)的動作,這些動作的執(zhí)行通過回調(diào)函數(shù)Callback來實現(xiàn),matlab guide編程主要考慮的是界面函數(shù)如何通過回調(diào)函數(shù)來實現(xiàn),以及用什么樣的方法比較方便快捷。
表1中xhxt_5.m代碼中只有各個控件、菜單的回調(diào)函數(shù)原型和注釋,并沒有實現(xiàn)功能的函數(shù)體,要實現(xiàn)具體的功能調(diào)用需要用戶自己編寫添加程序。
2.1 初始化程序的編寫
初始化圖形界面是通過函數(shù)Openingfig實現(xiàn)的。Openingfig函數(shù)調(diào)用與.m文件對應(yīng)的.fig 文件來初始化圖形界面。在這一過程中還存在隱含調(diào)用.fig的CreatFcn函數(shù),但這一過程無法使用輸入?yún)?shù),也就是說要用輸入?yún)?shù)設(shè)置圖形界面元素的一些特性,還必須編寫自己的初始化函數(shù)。
在本設(shè)計實例中,需要在坐標軸ases10的位置顯示電路圖,需要為“Tag”標識為RLC的編輯文本框設(shè)置R、L、C初始值,其初始化程序分別為:
function xhxt_5_OpeningFcn(hObject, eventdata, handles, varargin)
I=imread('dl.bmp','bmp'); % 讀入圖形文件dl.bmp
axes(handles.axes10);% 獲得坐標軸axes10的句柄
image(I);axis off % 顯示電路圖
function RLC_CreateFcn(hObject, eventdata, handles)
set(gcbo,'String','[1 1 1]'); % 為 R、L、C設(shè)初始值
if ispc isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
set(hObject,'BackgroundColor','white');
end
2.2 回調(diào)函數(shù)Callback的編寫
回調(diào)函數(shù)的編寫,可以把該控件的函數(shù)代碼直接寫在“Callback”中,也可以把函數(shù)代碼放在一個自定義的.M文件中,而在Callback”中只將其文件名寫上即可。不管采用哪種方法,回調(diào)函數(shù)編寫的一個重要的技巧就是通過set、get語句對控件的屬性進行獲取、設(shè)置,以及完成相關(guān)數(shù)據(jù)的傳遞、保存、獲取,這一點在下面的程序段中得到了很好的體現(xiàn)。
在本設(shè)計實例中,當按下“沖激響應(yīng)”按鈕時,要在坐標軸ases1的位置顯示沖激響應(yīng)曲線,當按下“階躍響應(yīng)”按鈕時,要在坐標軸ases2的位置顯示階躍響應(yīng)曲線,所以要分別為pushbutton1_Callback和pushbutton2_Callback編寫回調(diào)函數(shù),程序代碼分別為:
function pushbutton1_Callback(hObject, eventdata, handles)
m= str2num(get(handles.RLC,'String'))
R=m(1);L=m(2);C=m(3);a=[L*C R*C 1];b=[1];axes(handles.axes1);
x=impulse(b,a);plot(x,'linewidth',2); grid on; hold on;
function pushbutton2_Callback(hObject, eventdata, handles)
m= str2num(get(handles.RLC,'String'))
R=m(1);L=m(2);C=m(3); a=[L*C R*C 1]; b=[1];y=step(b,a);axes(handles.axes2)
plot(y,'linewidth',2); grid on; hold on;
把上述初始化程序及回調(diào)函數(shù)加入表1的相應(yīng)位置,然后運行程序,并輸入R、L、C的值(若分別鍵入 1 3 1),按下“沖激響應(yīng)”按鈕,則輸出沖激響應(yīng)波形,按下“階躍響應(yīng)”按鈕,則輸出階躍響應(yīng)波形,運行結(jié)果如圖2所示。
結(jié)果分析,在RLC電路中,描述電路的微分方程為: 。
當 為過阻尼狀態(tài); 為臨界阻尼狀態(tài); 為欠阻尼狀態(tài)。
現(xiàn)在輸入的RLC值為過阻尼狀態(tài),所以波形有振蕩過程,同樣的方法,輸入不同的R、L、C的值,可以得到不同的曲線形狀。
3 結(jié)束語
通過對matlab guide圖形用戶界面的設(shè)計實例,展示了人機交互式圖形用戶界面及其參數(shù)的可調(diào)控性。在實際設(shè)計制作中要解決的幾個關(guān)鍵技術(shù)問題是:利用各控件的屬性進行數(shù)據(jù)的保存、傳遞;通過句柄訪問控件并進行數(shù)據(jù)的獲取和傳遞;編寫各控件的回調(diào)函數(shù)?;卣{(diào)函數(shù)的編寫不可能一蹴而就,需要反復(fù)的調(diào)試、修改和運行才能夠使程序得以正確運行。
參考文獻:
[1] 陳垚光.精通MATLAB GUI設(shè)計[M].北京:電子工業(yè)出版,2008.
[2] 梁虹.信號與線性系統(tǒng)分析——基于MATLAB的方法與實現(xiàn)[M].北京:高等教育出版社,2007.
[3] 吳大正.信號與線性系統(tǒng)分析[M].北京:高等教育出版社,2006.
[4] 陳懷琛,吳大正,等.MATLAB及在電子信息課程中的應(yīng)用[M].北京:電子工業(yè)出版,2007.
[5] 印金國.Matlab控件回調(diào)函數(shù)編寫與軟件調(diào)試[J].電腦編程與應(yīng)用,2007(2):45-47.
[6] 姚秀芳.MATLAB在《信號與系統(tǒng)》課程教學(xué)中的應(yīng)用研究[J].實驗技術(shù)與探索,2008(8):35-38.
[7] 徐俊文,王強,等.MATLAB環(huán)境下的GUI編程[J].內(nèi)蒙古民族大學(xué)學(xué)報,2006,21(6):640-643.
[8] 陶亮.MATLAB圖形用戶界面在信號與系統(tǒng)課程教學(xué)中的應(yīng)用[J].電氣電子教學(xué)學(xué)報,2006,26(5):96-98.