new第6講MATLAB圖形用戶界面設(shè)計(jì).ppt
第5章圖形用戶界面編程,圖形用戶界面,所謂用戶界面就是用戶與計(jì)算機(jī)交互通信聯(lián)系的平臺(tái)。圖形用戶界面是指包含圖形對(duì)象的用戶界面,MATLAB包含兩類基本的圖形對(duì)象:控件對(duì)象和菜單對(duì)象。MATLAB提供了“布局編輯器”和“菜單編輯器”等工具設(shè)計(jì)圖形用戶界面。,5.1布局編輯器,MATLAB窗口的File菜單下選New下的GUI,或在MATLAB命令窗口輸入guide。,圖形對(duì)象,工具條:排列、菜單編輯、M文件編輯器、屬性觀察器、對(duì)象瀏覽器和圖形激活鈕。,布局區(qū)域,GUI制作:需求分析,要點(diǎn):1)確定需要實(shí)現(xiàn)哪些功能;2)確定數(shù)據(jù)輸入/輸出方式;3)確定所需的窗口圖形元素;4)繪制GUI草圖;5)征求用戶或他人的意見(jiàn),并進(jìn)行修改。,GUI制作:繪制并測(cè)試GUI,要點(diǎn):1)在計(jì)算機(jī)上實(shí)現(xiàn)需求分析繪制的草圖,并依據(jù)實(shí)際情況進(jìn)行調(diào)整;2)從用戶使用的角度對(duì)GUI進(jìn)行調(diào)試。注:在完成設(shè)計(jì)與測(cè)試之前,不要編碼,因?yàn)榇藭r(shí)編寫(xiě)的代碼可能會(huì)因設(shè)計(jì)的更改而失去意義。在GUI測(cè)試穩(wěn)定后編寫(xiě)并測(cè)試代碼。,GUI設(shè)計(jì)原則,簡(jiǎn)單性簡(jiǎn)潔、直接、清晰地體現(xiàn)出界面的功能和特征。風(fēng)格一致性例如:圖形窗口在左,圖形控件在右等。易理解性盡量使用人們熟悉的標(biāo)志和符號(hào),界面中的動(dòng)作必須做到及時(shí)、連續(xù)、可逆,對(duì)連續(xù)時(shí)間長(zhǎng)的運(yùn)算要給出等待時(shí)間提示,并允許用戶中斷等。,5.2控件對(duì)象,選擇命令鈕單選鈕文本框滾動(dòng)條列表框坐標(biāo)軸,開(kāi)關(guān)鈕復(fù)選框標(biāo)簽框架彈出式菜單,控件對(duì)象屬性:外觀及風(fēng)格控制,BackgrandColor:設(shè)置控件的背景色,可以是RGB顏色值,如110,也可以是短名顏色值,如y,還可以是長(zhǎng)名顏色值,如yellow;Cdata:設(shè)置顯示在控件上圖象的顏色值;1行3列。(效果不理想)ForegroundColor:設(shè)置控件上顯示文本的顏色;SelectHighlight:用于確定空間被選中時(shí)是否顯示被選中的狀態(tài)(取值:on、off);String:用于設(shè)置控件上顯示的文本串;Visible:設(shè)置控件的可見(jiàn)狀態(tài)。,控件對(duì)象屬性:基本信息屬性,Enable:可用狀態(tài)on;暫停不用狀態(tài)inactive;不可用狀態(tài):off;Parent:控件對(duì)象的父對(duì)象句柄所在圖形窗口對(duì)象句柄;Selected:用于確定控件是否被選中;Sliderstep:用于設(shè)置滾動(dòng)條每次移動(dòng)的步長(zhǎng);Style:用于決定所創(chuàng)建控件的類型;Tag:相當(dāng)于控件對(duì)象的名稱,在程序設(shè)計(jì)時(shí)可用來(lái)指定控件;TooltipString:設(shè)置簡(jiǎn)單提示信息;UserData:保存與控件對(duì)象有關(guān)的信息或數(shù)據(jù),可通過(guò)set和get函數(shù)來(lái)調(diào)用這些信息。,控件對(duì)象屬性:字體控制屬性,FontAngle:用于確定字體的傾斜;FontName:設(shè)置字體的名稱;FontSize:設(shè)置字體的大?。籉ontUnits:確定字體大小的單位;FontWeight:定義字體的粗細(xì);HorizontalAlignment:定義字符對(duì)齊方式。,控件對(duì)象屬性:回調(diào)例程控制,ButtonDownFcn:定義當(dāng)鼠標(biāo)在控件對(duì)象上按下時(shí)執(zhí)行的回調(diào)例程,可以是字符串、MATLAB表達(dá)式或M文件的文件名;Callback:定義單擊控件時(shí)執(zhí)行的回調(diào)例程;CreateFcn:定義在控件對(duì)象創(chuàng)建階段執(zhí)行的回調(diào)例程;DeleteFcn:定義在控件對(duì)象刪除階段執(zhí)行的回調(diào)例程;BusyAction:決定回調(diào)例程的調(diào)用方式,取值有cancel與queue,與Interruptible聯(lián)合使用;Interruptible:決定回調(diào)例程的中斷調(diào)用模式,如為on則新的回調(diào)例程中斷當(dāng)前正在執(zhí)行的回調(diào)例程,如為off則由BusyAction決定調(diào)用模式;UIContextMenu:建立與上下文菜單(contextmenu)對(duì)象的聯(lián)系,其屬性的取值為菜單對(duì)象句柄。,控件對(duì)象屬性:當(dāng)前狀態(tài)信息屬性,ListboxTop:用于顯示在列表框最上頭的字符串的索引號(hào),默認(rèn)值為1;是String屬性定義的字符串向量的某個(gè)元素的索引值。Value:決定空間的當(dāng)前值;對(duì)彈出式菜單控件pop_upmenus,該屬性為已選中的列表項(xiàng)的索引值。,控件對(duì)象屬性:當(dāng)前狀態(tài)信息屬性Max,Max:定義Value屬性允許的最大值。在不同的控件類型中,Max有不同的意義:復(fù)選框:選中時(shí)Value屬性的值為Max的值;文本框:Max-Min>1則可進(jìn)行多行輸入;列表框:Max-Min>1則可允許多個(gè)列表項(xiàng)選擇;單選鈕:選中時(shí)Value屬性的值為Max的值;滾動(dòng)條:定義了滾動(dòng)條變化范圍的最大值;開(kāi)關(guān)鈕:選中時(shí)Value屬性的值為Max的值。,控件對(duì)象屬性:當(dāng)前狀態(tài)信息屬性Min,Min:定義了Value屬性允許的最小值。復(fù)選框:未選中時(shí)Value屬性的值為Min的值;單選鈕:未選中時(shí)Value屬性的值為Min的值;滾動(dòng)條:定義了滾動(dòng)條變化范圍的最小值;開(kāi)關(guān)鈕:未選中時(shí)Value屬性的值為Min的值。,控件對(duì)象屬性的操作方式和步驟,命令方式:利用uicontrol建立控件對(duì)象時(shí),定義控件屬性的屬性值;利用set設(shè)置、修改屬性的屬性值;利用get獲得屬性的屬性值。GUI方式:通過(guò)PropertyInspectorGUI設(shè)計(jì)工具設(shè)置控件對(duì)象的屬性值。程序中控件對(duì)象的一般操作步驟:1)獲取對(duì)象句柄;2)對(duì)對(duì)象屬性進(jìn)行操作。,MATLAB句柄圖形,句柄圖形:MATLAB每幅圖的每個(gè)組成部分是一個(gè)對(duì)象,每個(gè)對(duì)象有一個(gè)句柄與其相聯(lián)。MATLAB句柄圖體系如下:,圖形句柄,在MATLAB中,每個(gè)圖形對(duì)象都由一個(gè)數(shù)字來(lái)表識(shí),稱為句柄,用來(lái)唯一確定圖形對(duì)象。計(jì)算機(jī)屏幕:根對(duì)象(Root),句柄為0;圖形窗口:句柄為整數(shù);其它:句柄為浮點(diǎn)值。,圖形對(duì)象句柄的獲取,每個(gè)對(duì)象在創(chuàng)建時(shí)可以返回該對(duì)象的句柄。例如:h=plot(0:.1:2*pi,sin(0:.1:2*pi);利用標(biāo)準(zhǔn)對(duì)象句柄獲取函數(shù)獲?。篻cf:獲取當(dāng)前圖形窗口的句柄;gca:獲取當(dāng)前坐標(biāo)軸的句柄;gco:獲取當(dāng)前圖形的當(dāng)前對(duì)象的句柄;gcbf/gcba/gcbo:獲取回調(diào)例程圖形窗口/坐標(biāo)軸/當(dāng)前對(duì)象的句柄。,圖形對(duì)象句柄的獲取findobj,h=findobj(Propertyname,propertyValue,):獲得指定屬性Propertyname的屬性值為propertyValue對(duì)應(yīng)對(duì)象的句柄。h=findobj(objHandle,Propertyname,propertyValue,):同上,但將查找范圍限制在objHandle指定的對(duì)象及其子對(duì)象中。h=findobj(objHandle,flat,Propertyname,propertyValue,):同上,但將查找范圍不包括子對(duì)象。h=findobj:返回一個(gè)列向量,是根對(duì)象及其所有子對(duì)象的句柄值。,圖形對(duì)象句柄的獲取舉例,%-Executesonbuttonpressinpushbutton1.functionpushbutton1_Callback(hObject,eventdata,handles)h=findobj(Tag,axes1);x=-pi:0.1:pi;y=sin(x);plot(x,y,Parent,h);,%-Executesonbuttonpressinpushbutton2.functionpushbutton2_Callback(hObject,eventdata,handles)h=findobj(Tag,axes2);x=-pi:0.1:pi;y=cos(x);plot(x,y,Parent,h);,對(duì)象及屬性的操作:刪除和拷貝,delete(handle):刪除句柄handle對(duì)應(yīng)對(duì)象及其子對(duì)象;c=copyobj(h,p):復(fù)制對(duì)象句柄,c為新得到的句柄。如果h和p均為向量,則將h對(duì)應(yīng)的句柄分別作為p各對(duì)應(yīng)對(duì)象的子對(duì)象的句柄;如果h為向量,p為標(biāo)量,則將h對(duì)應(yīng)的句柄作為p對(duì)應(yīng)對(duì)象的子對(duì)象的句柄;如果h為標(biāo)量,p為向量,則將h對(duì)應(yīng)的句柄分別作為p對(duì)應(yīng)對(duì)象的子對(duì)象的句柄。,對(duì)象及屬性的操作copyobj舉例,mesh(peaks(30);text(30,20,2,leftarrowpeak);h=findobj(String,leftarrowpeak);figuremesh(peaks(20);ha=copyobj(h,gca);,對(duì)象及屬性的操作:創(chuàng)建、設(shè)置和獲取,h=uicontrol(parent,PropertyName,propertyValue,)缺省parent表示在當(dāng)前圖形窗口創(chuàng)建控件對(duì)象。set(handle,PropertyName,propertyValue,)用來(lái)設(shè)置句柄為handle的控件對(duì)象的屬性值。get(handle,PropertyName)返回句柄為handle的對(duì)象中名為PropertyName的屬性的屬性值。,對(duì)象及屬性的操作舉例,x=0:.1:2*pi;y=sin(x);h_sin=plot(x,y,*);lineWidth=get(h_sin,LineWidth);set(h_sin,Color,10.50,LineWidth,lineWidth+4);hpop=uicontrol(Style,popup,String,Black|Green|Blue|Red,.Position,340190100150,Callback,setmap,.Tag,popup);,setmap.m文件中的內(nèi)容:hp=findobj(Tag,popup);val=get(hp,Value);ifval=1set(gca,Color,0,0,0);elseifval=2set(gca,Color,010);elseifval=3set(gca,Color,001);elseifval=4set(gca,Color,100);end,5.3菜單對(duì)象和上下文菜單,在MATLAB中有兩類菜單:下拉式菜單uimenu和上下文菜單uicontextmenu。下拉式菜單(菜單對(duì)象)的位置是固定的。上下文菜單的位置是不固定的,且總與某個(gè)圖形對(duì)象相聯(lián)系,通過(guò)鼠標(biāo)右鍵激活,同時(shí)下拉式菜單可為其中的菜單項(xiàng)。,菜單對(duì)象的創(chuàng)建,hm=uimenu(h,PropertyName,value,)以h為父對(duì)象的句柄創(chuàng)建一個(gè)菜單對(duì)象,并返回該菜單的句柄。例如:,h0=figure(MenuBar,none,Toolbar,none,Name,DrawGraph);h1=uimenu(h0,Label,Checked,上下文菜單創(chuàng)建,h=uicontextmenu(PropertyName,propertyValue,)一般步驟:1)利用uincontextmenu創(chuàng)建上下文菜單對(duì)象;2)利用uimenu制作菜單項(xiàng);3)利用set將上下文菜單與具體的圖形對(duì)象聯(lián)系起來(lái)。,上下文菜單創(chuàng)建舉例,cmenu=uicontextmenu;hline=plot(1:10,UIContextMenu,cmenu);item1=uimenu(cmenu,Label,dashed,.Callback,set(hline,LineStyle,-);item2=uimenu(cmenu,Label,dotted,.Callback,set(hline,LineStyle,:);item1=uimenu(cmenu,Label,Solid,.Callback,set(hline,LineStyle,-);,利用菜單編輯器制作菜單,菜單屬性,在菜單編輯器的右邊有少量有關(guān)菜單屬性值的設(shè)置。Checked:對(duì)選中的菜單打標(biāo)記(對(duì)頂層菜單無(wú)用);Label:設(shè)置菜單標(biāo)題;Separator:用于在菜單上設(shè)置分隔條;Visible:設(shè)置菜單的可見(jiàn)狀態(tài);Accelerator:用于設(shè)置菜單加速鍵;Callback:定義單擊菜單對(duì)象時(shí)執(zhí)行的回調(diào)例程;Tag:標(biāo)記菜單項(xiàng)的名稱,便于在程序設(shè)計(jì)時(shí)通過(guò)該名稱指定菜單項(xiàng)。,5.4對(duì)話框,在GUI程序設(shè)計(jì)中,對(duì)話框是最重要的顯示信息和取得用戶數(shù)據(jù)的用戶界面對(duì)象。MATLAB的對(duì)話框分為兩類:公共對(duì)話框和一般對(duì)話框。公共對(duì)話框:文件打開(kāi)對(duì)話框、文件保存對(duì)話框、顏色設(shè)置對(duì)話框、字體設(shè)置對(duì)話框、打印頁(yè)面對(duì)話框、打印預(yù)覽對(duì)話框和打印對(duì)話框。一般對(duì)話框:幫助對(duì)話框、出錯(cuò)信息對(duì)話框、信息提示對(duì)話框等。,文件打開(kāi)對(duì)話框,fname,pname=uigetfile(FilterSpec,DialogTitle,x,y)獲取待打開(kāi)文件的文件名fname及路徑信息pname。FilterSpec指定文件類型;DialogTitle指定對(duì)話框標(biāo)題名;x,y指定對(duì)話框位置信息。uigetfile并未打開(kāi)有關(guān)文件。MATLAB提供了基于C語(yǔ)言實(shí)現(xiàn)的低級(jí)文件I/O函數(shù)。,>>fn,pn=uigetfile(*.m,OpenMFile,10,10);>>fnfn=sample1.m>>pnpn=C:MATLAB6p5work,打開(kāi)、關(guān)閉文件,fid,errormessage=fopen(filename,permission);使用permission指定的模式打開(kāi)filename指定的文件,成功時(shí)返回文件標(biāo)識(shí),否則返回系統(tǒng)錯(cuò)誤信息errormessage.permission的取值及含義:r:只讀模式;w:寫(xiě)模式(含創(chuàng)建);a:添加;r+:讀寫(xiě);w+:讀寫(xiě)(含創(chuàng)建);a+:添加(含創(chuàng)建)。status=fclose(fid):關(guān)閉fid指定的文件,操作成功時(shí)返回0,否則返回1。,無(wú)格式輸入/輸出,a,count=fread(fid,size,precision,skip):從指定文件fid中讀取size個(gè)單位長(zhǎng)度為precision的數(shù)據(jù)元素至a中,skip表示每次讀后跳過(guò)的字節(jié)數(shù)。count表示實(shí)際讀入的數(shù)據(jù)個(gè)數(shù)。size取值含義:標(biāo)量n(讀取n個(gè)元素);inf(讀到文件結(jié)尾);m,n(讀取m*n個(gè)元素)。precision:uchar(8位無(wú)符號(hào)字符缺省值);schar(8位帶符號(hào)字符);int8(8位帶符號(hào)整數(shù));uint8(8位無(wú)符號(hào)整數(shù));single(32位浮點(diǎn)數(shù));double(64位浮點(diǎn)數(shù))。count=fwrite(fid,a,precision,skip):將a中數(shù)據(jù)轉(zhuǎn)換成precision指定的數(shù)據(jù)元素寫(xiě)入fid指定的文件中,count為成功寫(xiě)入的元素?cái)?shù)目。,格式化輸入/輸出,count=fprintf(fid,format,a,):將a中數(shù)據(jù)用format格式化后寫(xiě)入文件fid中,count為寫(xiě)入的字節(jié)數(shù)。fid缺省表示向顯示屏輸出。例如:x=0:.2:2;y=x;2*exp(x);fid=fopen(data.txt,w);fprintf(fid,%6.2f%12.8fn,y);fclose(fid);a,count=fscanf(fid,format,size):從fid指定文件中讀取size指定的數(shù)據(jù),并根據(jù)format指定的格式對(duì)其轉(zhuǎn)換后返回a,count為讀取的元素?cái)?shù)目。,按行從文件讀數(shù)據(jù),line=fgetl(fid):從文件fid中讀1行數(shù)據(jù)至line,返回的行不包括換行符。遇到文件結(jié)尾則返回-1。line=fgets(fid):從文件fid中讀1行數(shù)據(jù)至line,返回的行包括換行符。遇到文件結(jié)尾則返回-1。,文件測(cè)試,eofstat=feof(fid):文件結(jié)尾返回-1,否則返回0。frewind(fid):將文件位置指針?lè)蠢@到文件開(kāi)頭。status=fseek(fid,offset,origin):將文件的位置指針定位到origin偏移offset指定的位置。Origin的取值為bof或-1文件開(kāi)始cof或0文件當(dāng)前位置eof或1文件結(jié)束position=ftell(fid):返回位置指針指向的位置,失敗時(shí)返回-1。,文件保存對(duì)話框,fname,pname=uinputfile(Initfile,DialogTitle,x,y):Initfile為指定待保存文件類型,DialogTitle為對(duì)話框標(biāo)題,x和y為對(duì)話框位置。例如:>>uiputfile(*.m,Save)ans=kk,顏色設(shè)置對(duì)話框,c=uisetcolor(h_or_c,DialogTitle):h_or_c為初始顏色,可以是一個(gè)1X3的RGB向量,也可以是一個(gè)圖形對(duì)象的句柄(該圖形對(duì)象必有一個(gè)顏色屬性)。,>>c=uisetcolor(101,SelectColor)c=0.251000.2510,字體設(shè)置對(duì)話框,s=uisetfont(h_or_s,DialogTitle):h_or_s為初始字體屬性,可以是一個(gè)對(duì)象的句柄,也可以是一個(gè)字體屬性結(jié)構(gòu);s為字體屬性結(jié)構(gòu),包括(FontName,FontUnits,FontSize,FontWeight,FontAngle等域)。,Text1=uicontrol(style,text,string,XxYyZz);Text2=uicontrol(style,text,string,AxBbCc,.position,200206020);s=uisetfont(Text1,UpdateFont);ifisstruct(s)%Checkforcancelset(Text2,s);end,幫助對(duì)話框,h=helpdlg(HelpString,dlgname):HelpString為幫助信息;dlgname為對(duì)話框標(biāo)題。例如:,>>helpdlg(Thisisadialogue!,Help),在線幫助窗口helpwin(補(bǔ)),>>str=Topic1,Helpstringfortopic1;Topic2Helpstringfortopic2;>>helpwin(str,Topic2,MyTitle),信息提示對(duì)話框,h=msgbox(message,title,icon):icon的取值為:none,error,help和custom,默認(rèn)為none。,Data=1:64;Data=(Data*Data)/64;h=msgbox(String,Title,custom,Data,hsv(64);,5.5GUI編程,設(shè)計(jì)一個(gè)如下所示的GUI,當(dāng)單擊“繪圖”按鈕時(shí),將在坐標(biāo)軸上繪制選擇的圖形。,Figure的Name屬性值為GUI例子程序,坐標(biāo)軸的Tag屬性值為axes1,標(biāo)簽的String屬性的值為圖形選擇,單選鈕的string屬性值為正弦曲線,Tag屬性值為sin,單選鈕的string屬性值為余弦曲線,Tag屬性值為cos,Value屬性值為1.0,命令鈕的string屬性值為繪圖,Tag屬性值為draw,保存時(shí)文件名為fgui,fgui.m程序說(shuō)明:gui_State,%Begininitializationcode-DONOTEDITgui_Singleton=1;gui_State=struct(gui_Name,mfilename,.gui_Singleton,gui_Singleton,.gui_OpeningFcn,fgui_OpeningFcn,.gui_OutputFcn,fgui_OutputFcn,.gui_LayoutFcn,.gui_Callback,);ifnarginend,ifnargoutvarargout1:nargout=gui_mainfcn(gui_State,varargin:);elsegui_mainfcn(gui_State,varargin:);end%Endinitializationcode-DONOTEDIT,gui_Singleton大于0表示只有一個(gè)實(shí)例化的圖形窗口存在;gui_Name圖形窗口對(duì)應(yīng)文件名;,gui_OpeningFcn窗口創(chuàng)建前執(zhí)行的函數(shù);gui_OutputFcn輸出時(shí)執(zhí)行的函數(shù);gui_Callback確定控件的回調(diào)函數(shù);gui_mainfcn調(diào)用分派函數(shù)。,fgui.m程序說(shuō)明:fgui_OpeningFcn,%-Executesjustbeforefguiismadevisible.functionfgui_OpeningFcn(hObject,eventdata,handles,varargin)%Thisfunctionhasnooutputargs,seeOutputFcn.%hObjecthandletofigure%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)%varargincommandlineargumentstofgui(seeVARARGIN)%Choosedefaultcommandlineoutputforfguihandles.output=hObject;%Updatehandlesstructureguidata(hObject,handles);%UIWAITmakesfguiwaitforuserresponse(seeUIRESUME)%uiwait(handles.figure1);,guidata:存儲(chǔ)或檢索應(yīng)用數(shù)據(jù)。,fgui.m程序說(shuō)明:fgui_OutputFcn,%-Outputsfromthisfunctionarereturnedtothecommandline.functionvarargout=fgui_OutputFcn(hObject,eventdata,handles)%varargoutcellarrayforreturningoutputargs(seeVARARGOUT);%hObjecthandletofigure%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)%Getdefaultcommandlineoutputfromhandlesstructurevarargout1=handles.output;,fgui.m程序說(shuō)明:draw_Callback,%-Executesonbuttonpressindraw.functiondraw_Callback(hObject,eventdata,handles)%hObjecthandletodraw(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)x=-pi:.1:pi;ifget(handles.sin,Value)>0plot(x,sin(x),Parent,handles.axes1);elseifget(handles.cos,Value)>0plot(x,cos(x),Parent,handles.axes1);end,用戶輸入程序,fgui.m程序說(shuō)明:sin_Callback,%-Executesonbuttonpressinsin.functionsin_Callback(hObject,eventdata,handles)%hObjecthandletosin(seeGCBO)%eventdatareserved-tobedefinedinafutureversionofMATLAB%handlesstructurewithhandlesanduserdata(seeGUIDATA)%Hint:get(hObject,Value)returnstogglestateofsinset(handles.cos,Value,get(handles.cos,Min);%設(shè)置cos單選鈕為補(bǔ)選中狀態(tài),Cos_Callback與此類似,