亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        MATLAB GUIDE程序設(shè)計(jì)參數(shù)在內(nèi)部函數(shù)間及窗口間傳遞方式研究

        2015-10-09 12:22:33陳建張勝良李鑫
        軟件導(dǎo)刊 2015年9期

        陳建++張勝良++李鑫

        摘 要:MATLAB具有高效科學(xué)的計(jì)算功能、友好的用戶(hù)界面及功能豐富的應(yīng)用工具箱,在眾多科學(xué)領(lǐng)域得到了廣泛的應(yīng)用。MATLAB GUI具有學(xué)習(xí)起點(diǎn)低、易學(xué)易懂、開(kāi)發(fā)周期短的優(yōu)點(diǎn),用戶(hù)不必深入掌握面向?qū)ο蟮木幊陶Z(yǔ)言也能設(shè)計(jì)出精美的人機(jī)界面。深入探討了MATLAB GUIDE程序設(shè)計(jì)中參數(shù)在內(nèi)部函數(shù)間及窗口間傳遞的不同方式,結(jié)合實(shí)例闡述了各方式原理,討論了其優(yōu)缺點(diǎn)、使用范圍和使用方法,以方便MATLAB GUIDE程序設(shè)計(jì)者檢索查看并對(duì)其熟練掌握。

        關(guān)鍵詞:MATLAB GUIDE;內(nèi)部函數(shù);窗口;參數(shù)傳遞

        DOIDOI:10.11907/rjdk.151537

        中圖分類(lèi)號(hào):TP301

        文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào)文章編號(hào):16727800(2015)009001205

        基金項(xiàng)目基金項(xiàng)目:國(guó)家自然科學(xué)基金項(xiàng)目(51175473);浙江省教育廳項(xiàng)目(Y201122752)

        作者簡(jiǎn)介作者簡(jiǎn)介:陳建(1975-),男,山東泰安人,博士,浙江工業(yè)大學(xué)機(jī)械學(xué)院副教授、碩士生導(dǎo)師,研究方向?yàn)榫G色設(shè)計(jì)及制造、可拓設(shè)計(jì);張勝良(1987-),男,江蘇徐州人,浙江工業(yè)大學(xué)機(jī)械學(xué)院碩士研究生,研究方向?yàn)榫G色設(shè)計(jì)及制造;李鑫(1991-),女,湖南株洲人,浙江工業(yè)大學(xué)機(jī)械學(xué)院碩士研究生,研究方向?yàn)榫G色設(shè)計(jì)及制造。

        0 引言

        GUI(Graphical User Interface, 圖形用戶(hù)界面)是指由窗口、菜單、對(duì)話框等各種圖形對(duì)象組成的用戶(hù)界面,提供一個(gè)友好的人機(jī)圖形交互平臺(tái),用戶(hù)通過(guò)一定的方法(如鼠標(biāo)或鍵盤(pán))選擇、激活這些圖形對(duì)象,使計(jì)算機(jī)產(chǎn)生某種動(dòng)作或變化,例如實(shí)現(xiàn)符號(hào)運(yùn)算、數(shù)值計(jì)算、圖形處理等,具有友好性、操作方便的優(yōu)點(diǎn)[1]。創(chuàng)建MATLAB GUI通常有兩種方式[2]:①使用M文件直接利用句柄圖形指令生成控件及其功能,移植性好,但是因?yàn)榧兇a編寫(xiě),工作量較大,一般需要設(shè)計(jì)者有豐富的經(jīng)驗(yàn)[3];②使用GUIDE(Graphical User Interface Development Environment, 圖形用戶(hù)界面開(kāi)發(fā)環(huán)境),它提供了一系列工具用于建立GUI對(duì)象,這些工具極大簡(jiǎn)化了設(shè)計(jì)和創(chuàng)建GUI的過(guò)程,可快速完成GUI界面布局,自動(dòng)對(duì)M文件編程,實(shí)現(xiàn)控件的功能擴(kuò)展[410]。顯然第二種方法操作方便、效率高,更適合寫(xiě)大型程序。本文討論的參數(shù)在內(nèi)部函數(shù)及窗口間的傳遞方式僅限于后者。

        參數(shù)在內(nèi)部函數(shù)及界面間的傳遞方式是MATLAB GUIDE程序設(shè)計(jì)的重點(diǎn),也是難點(diǎn),如果熟練掌握,會(huì)達(dá)到事半功倍的效果。筆者利用MATLAB GUIDE程序設(shè)計(jì)了“基于模糊AHPTOPSIS的綠色設(shè)計(jì)油鋸評(píng)價(jià)系統(tǒng)”軟件,如圖1、圖2所示,這里需要設(shè)置并處理大量的參數(shù)在內(nèi)部函數(shù)及窗口間的傳遞。

        圖1 基于模糊AHPTOPSIS的綠色設(shè)計(jì)油鋸評(píng)價(jià)系統(tǒng)

        為了敘述的方便性和統(tǒng)一性,在本文中,Variable代表參數(shù),Value代表參數(shù)值,Nameoffile代表文件名。本文只對(duì)涉及到的各類(lèi)命令函數(shù)作簡(jiǎn)單介紹,具體使用方法請(qǐng)參閱參考文獻(xiàn)[11]。另外,驗(yàn)證實(shí)例編程時(shí),需要在COMMAND WINDOW輸入以下代碼,清除所有窗口,以防出現(xiàn)未知錯(cuò)誤。

        h=findall(0,'type','figure');

        delete(h);

        1 參數(shù)在內(nèi)部函數(shù)間傳遞方式

        MATLAB GUIDE程序設(shè)計(jì)中,參數(shù)在內(nèi)部函數(shù)間傳遞方式有多種,主要分為:handles/guidata、userdata、getappdata/setappdata、save/load、evalin/assignin、global函數(shù)等,為了形象具體地說(shuō)明參數(shù)在內(nèi)部函數(shù)間傳遞的程序設(shè)計(jì),特用一個(gè)例子來(lái)說(shuō)明。如圖 3所示,其實(shí)現(xiàn)功能如下:在彈出菜單中選擇一項(xiàng),然后點(diǎn)擊顯示,右邊文本就會(huì)顯示選擇的內(nèi)容,這就涉及到了彈出菜單的數(shù)據(jù)如何傳遞到觸控按鈕的問(wèn)題,其中,設(shè)置窗口tag:figure,設(shè)置彈出菜單tag:popupmenu/string:軟件/導(dǎo)刊,設(shè)置觸控按鈕tag:pushbutton/enable:off,設(shè)置靜態(tài)文本tag:text,其余采用默認(rèn)設(shè)置。另外,GUIDE自動(dòng)生成的M文件中,各函數(shù)除了下文添加了代碼的函數(shù)外均采用默認(rèn)代碼。

        圖2 基于模糊AHPTOPSIS的綠色設(shè)計(jì)油鋸評(píng)價(jià)系統(tǒng)參數(shù)

        圖3 參數(shù)在內(nèi)部函數(shù)間傳遞方式實(shí)例

        1.1 handles/guidata

        GUIDE中某一窗口的所有控件使用同一個(gè)handles結(jié)構(gòu)體,handles結(jié)構(gòu)體中保存了圖形窗口中所有對(duì)象的句柄,可以使用handles獲取或設(shè)置某個(gè)對(duì)象的屬性。由于handles是個(gè)結(jié)構(gòu)體,可以為它增加新的結(jié)構(gòu)域,并可在該窗口對(duì)應(yīng)的M文件各函數(shù)中共享調(diào)用,這就實(shí)現(xiàn)了參數(shù)在內(nèi)部函數(shù)間的傳遞。

        在回調(diào)函數(shù)中把參數(shù)存入handles的方式為:

        handles=guidata(handles.figure);

        handles.variable=value;

        guidata(handles.figure,handles);

        其中,handles=guidata(handles.figure)為該函數(shù)取之前的GUI數(shù)據(jù),并保存到handles中,guidata(handles.figure,handles)用來(lái)更新handles結(jié)構(gòu),生成新的GUI數(shù)據(jù)。guidata任何時(shí)刻只能管理一個(gè)GUI數(shù)據(jù),也就是說(shuō),任何GUI任何時(shí)刻只能有一個(gè)handles結(jié)構(gòu)體,并且不能使用guidata存儲(chǔ)除handles結(jié)構(gòu)外的任何其它數(shù)據(jù),否則,它會(huì)覆蓋handles結(jié)構(gòu)體,導(dǎo)致GUI不能運(yùn)行[11]。這里有一點(diǎn)需要注意,經(jīng)常有人引用opening函數(shù)中的guidata(hObject,handles)代替guidata(handles.figure,handles),在opening函數(shù)中,hObject是該窗口的句柄,而在回調(diào)函數(shù)中,hObject指的是該控件的句柄。當(dāng)hObject不是窗口對(duì)象句柄時(shí),MATLAB會(huì)將handles保存到hObject的父類(lèi)窗口句柄中。為了保證句柄的一致性,避免未知的錯(cuò)誤,推薦使用guidata(handles.figure,handles)。

        另,handles不宜添加過(guò)多的用戶(hù)數(shù)據(jù),因?yàn)樵贕UIDE生成的M文件中,handles是每個(gè)回調(diào)函數(shù)的輸入?yún)?shù),這樣會(huì)加大每個(gè)回調(diào)函數(shù)不必要的內(nèi)存開(kāi)銷(xiāo)。

        為了實(shí)現(xiàn)示例效果,可在彈出菜單和觸控按鈕的callback函數(shù)中添加如下代碼:

        function popupmenu_Callback(hObject, eventdata, handles)

        handles=guidata(handles.figure);%取得之前的GUI數(shù)據(jù),并保存到handles中去

        set(handles.pushbutton,'enable','on');%設(shè)置觸控按鈕可使用

        v = get(handles.popupmenu,'value'); % 確定選擇彈出菜單的第幾項(xiàng)

        str=get(handles.popupmenu,'string');%獲得彈出菜單的所有內(nèi)容

        switch v

        case 1

        handles.forshow=str{1};%選擇第一項(xiàng),把字符串“軟件”添加到handles結(jié)構(gòu)體中

        case 2

        handles.forshow=str{2};%選擇第二項(xiàng),把字符串“導(dǎo)刊”添加到handles結(jié)構(gòu)體中

        end

        guidata(handles.figure,handles);%更新handles結(jié)構(gòu),參數(shù)forshow被保存進(jìn)去

        function pushbutton_Callback(hObject, eventdata, handles)

        set(handles.text,'string',handles.forshow);%使文本顯示選擇的內(nèi)容

        1.2 userdata

        userdata方式用于存儲(chǔ)用戶(hù)定義的數(shù)據(jù),可以為任何數(shù)據(jù)類(lèi)型,直接通過(guò)對(duì)象的userdata屬性進(jìn)行各個(gè)callback之間的數(shù)據(jù)存取操作。雖然使用這種方法簡(jiǎn)單、安全性高[12],但是每個(gè)對(duì)象僅能存取一個(gè)變量值,因此當(dāng)同一對(duì)象存儲(chǔ)多次變量時(shí),先前的變量就會(huì)被覆蓋掉,只保留最后一次存儲(chǔ)的變量,因此UserData適用于存儲(chǔ)簡(jiǎn)單、單一且讀取不頻繁的數(shù)據(jù)。使用方法:

        首先將數(shù)據(jù)存儲(chǔ)到一個(gè)特定的對(duì)象中,建議選定該窗口:

        set(handles.figure,'userdata',variable)

        此時(shí),variable數(shù)據(jù)就存在該窗口屬性?xún)?nèi):

        variable= get(handles.figure,'UserData')

        取回變量,可在任意callback中獲取該數(shù)據(jù)值。

        1.3 getappdata/setappdata

        Application數(shù)據(jù)保存在GUI對(duì)象的一個(gè)未公開(kāi)屬性Application Data內(nèi),該屬性的值為一個(gè)結(jié)構(gòu)體。一個(gè)GUI中,可同時(shí)存在多個(gè)Application數(shù)據(jù),通常選擇窗口對(duì)象作為Application數(shù)據(jù)的保存對(duì)象。與UserData的方式相比,明顯克服了UserData的缺點(diǎn),使一個(gè)對(duì)象能存取多個(gè)變量值,適用于變量多且讀取不頻繁的數(shù)據(jù)。使用方法:

        setappdata(handles.figure,variable,value)

        添加新的結(jié)構(gòu)域variable到對(duì)象handles.figure的Application數(shù)據(jù)中,value可以為任何類(lèi)型數(shù)據(jù)。

        value=getappdata(handles.figure,variable)

        獲取對(duì)象handles.figure的Application數(shù)據(jù)中variable字段的值:

        isappdata(handles.figure,variable)

        判斷對(duì)象handles.figure的Application數(shù)據(jù)中是否存在字段variable,存在返回1,否則返回0。

        1.4 save/load

        save函數(shù)將workspace中變量用二進(jìn)制格式保存在當(dāng)前工作目錄的MAT文件下,可以使用load函數(shù)重新載入數(shù)據(jù),其思想是將某參數(shù)的值先存到磁盤(pán),等待用的時(shí)候再調(diào)用。當(dāng)然,這種方式涉及到磁盤(pán)讀寫(xiě),速度會(huì)有影響,但卻方便對(duì)所有的全局參數(shù)進(jìn)行管理,且適用于大量數(shù)據(jù)的傳遞[12]。使用方法:

        save nameoffile.mat variable1 variable2…variableN

        把工作空間多個(gè)參數(shù)保存到名為nameoffile的MAT文件中,如果此前該MAT文件已存在,則寫(xiě)成save nameoffile.mat variable append。

        return= load('nameoffile.mat')

        將nameoffile.mat加載到工作空間,返回值return為一結(jié)構(gòu)體,包括該MAT文件中的所有數(shù)據(jù)。

        1.5 evalin/assignin

        MATLAB通常的基本工作空間是base空間。MATLAB在程序運(yùn)行過(guò)程中,將為每個(gè)函數(shù)分配其函數(shù)工作空間(從基本空間中分割出的一塊, 以函數(shù)名作為其工作空間名),各個(gè)工作空間之間的變量不能直接引用,在函數(shù)退出后,該函數(shù)空間也就立即被注銷(xiāo)。因此,對(duì)于函數(shù)文件,運(yùn)行結(jié)果除輸出變量返回到基本工作空間或其父工作空間(調(diào)用該函數(shù)的程序工作空間)之外,其它中間變量都不在基本工作空間或其父工作空間保留。為了得到某中間變量,可使用evalin/assignin函數(shù),其優(yōu)點(diǎn)是方法簡(jiǎn)單,但在維護(hù)工作時(shí)不能清除[12]。使用方法:

        assignin('base','variable',value)

        這樣工作空間中就生成一個(gè)名字為variable的變量,保存有value數(shù)據(jù)。

        evalin('base','variable')

        得到工作空間變量variable的數(shù)據(jù)。

        為了實(shí)現(xiàn)示例效果,可在彈出菜單和觸控按鈕的callback函數(shù)中添加如下代碼:

        function popupmenu_Callback(hObject, eventdata, handles)

        set(handles.pushbutton,'enable','on');%設(shè)置觸控按鈕可使用

        v = get(handles.popupmenu,'value');% 確定選擇彈出菜單的第幾項(xiàng)

        str=get(handles.popupmenu,'string');%獲得彈出菜單的所有內(nèi)容

        switch v

        case 1

        forshow=str{1};%選擇第一項(xiàng),把字符串“軟件”添加到handles結(jié)構(gòu)體中

        case 2

        forshow=str{2};%選擇第二項(xiàng),把字符串“導(dǎo)刊”添加到handles結(jié)構(gòu)體中

        end

        assignin('base','zsl',forshow);%工作空間中生成一個(gè)名字為zsl的變量,保存有forshow數(shù)據(jù)

        function pushbutton_Callback(hObject, eventdata, handles)

        forshow=evalin('base','zsl');%得到工作空間變量zsl的數(shù)據(jù),返回給forshow。

        set(handles.text,'string',forshow);%使文本顯示選擇的內(nèi)容

        1.6 global函數(shù)

        global函數(shù)方式是最簡(jiǎn)單的方式,但也是最容易出錯(cuò)的方式,其優(yōu)點(diǎn)很明顯:代碼可讀性好,代碼運(yùn)行效率高。因?yàn)橥ㄟ^(guò)函數(shù)傳參數(shù)的方式,系統(tǒng)會(huì)浪費(fèi)過(guò)多的時(shí)間在復(fù)制數(shù)據(jù)上,其缺點(diǎn)也很明顯:如果你在一個(gè)地方修改了x值,那么所有x值就都變了,會(huì)出現(xiàn)未知錯(cuò)誤。另外,全局變量破壞了程序的封裝性。所以,global函數(shù)方式是最后考慮的方式,只適合在單窗口且全局變量較少或數(shù)據(jù)存取比較頻繁時(shí)使用,多窗口且全局變量較多時(shí)應(yīng)避免使用。使用方法:

        在定義全局變量時(shí),加一句 global variable;在調(diào)用全局變量前,加一句 global variable。

        2 參數(shù)在窗口間傳遞方式

        兩個(gè)窗口間的結(jié)構(gòu)分為順序結(jié)構(gòu)和主子結(jié)構(gòu),這是相對(duì)于某個(gè)參數(shù)是先定義在調(diào)用還是調(diào)用時(shí)再定義而言的。當(dāng)窗口A運(yùn)行時(shí)產(chǎn)生的參數(shù)在后來(lái)運(yùn)行的窗口B中得到調(diào)用,則窗口A、B為順序結(jié)構(gòu);當(dāng)窗口A運(yùn)行時(shí),需運(yùn)行窗口B得到其預(yù)定義數(shù)據(jù)或產(chǎn)生某參數(shù)以調(diào)用,則窗口A、B為主子結(jié)構(gòu),A為主窗口,B為子窗口。

        2.1 順序結(jié)構(gòu)

        MATLAB GUIDE程序設(shè)計(jì)中,參數(shù)在窗口間順序傳遞方式有多種,主要分為:findall/guidata、save/load、global函數(shù)、setappdata/getappdata等,它們各有自己的優(yōu)缺點(diǎn),下文將進(jìn)行具體闡述。為了形象具體地說(shuō)明參數(shù)在順序結(jié)構(gòu)窗口間傳遞的程序設(shè)計(jì),特用一個(gè)例子來(lái)說(shuō)明,如圖 4、圖5所示,其實(shí)現(xiàn)功能如下:在窗口A的彈出菜單中選擇一項(xiàng)后,窗口A消失,進(jìn)入窗口B,點(diǎn)擊顯示,文本就會(huì)顯示在窗口A選擇的內(nèi)容,這就涉及到窗口A中彈出菜單的數(shù)據(jù)如何傳遞到窗口B觸控按鈕的問(wèn)題。其中,在窗口A中,設(shè)置窗口tag:figure1,設(shè)置彈出菜單tag:popupmenu1/string:軟件/導(dǎo)刊,在窗口B中,設(shè)置窗口tag:figure2,設(shè)置觸控按鈕tag:pushbutton2,設(shè)置靜態(tài)文本tag:text2,其余采用默認(rèn)設(shè)置。另外,GUIDE自動(dòng)生成的M文件中,各函數(shù)中除了下文添加了代碼的函數(shù)外均采用默認(rèn)代碼。

        圖4 參數(shù)在順序結(jié)構(gòu)窗口 圖5 參數(shù)在順序結(jié)構(gòu)窗口 間傳遞方式示例 間傳遞方式示例

        2.1.1 findall/guidata

        在A窗口,按照參數(shù)在內(nèi)部函數(shù)間handles/guidata的傳遞方式,把傳遞變量保存到handles中。

        在B窗口,進(jìn)行如下步驟:

        HandlesofAObject=findall(0,property1,value1,…)

        在根對(duì)象內(nèi)查找滿(mǎn)足要求的窗口并返回所查找到的窗口句柄,要使查找的窗口具有唯一性,可利用該窗口的多個(gè)屬性值或利用唯一屬性值:

        HandlesofAObject=guidata(HandlesofAObject)

        獲得窗口A的handles數(shù)據(jù)。

        2.1.2 save/load

        使用方法與參數(shù)在內(nèi)部函數(shù)間傳遞方式相同,故不贅述。

        2.1.3 global

        使用方法與參數(shù)在內(nèi)部函數(shù)間傳遞方式相同,故不贅述。

        2.1.4 setappdata/getappdata

        使用方法與參數(shù)在內(nèi)部函數(shù)間傳遞方式大體相同,通常選擇根對(duì)象作為Application數(shù)據(jù)的保存對(duì)象,使用方法:

        setappdata(0,variable,value)

        添加新的字段variable到根對(duì)象的Application數(shù)據(jù)中,value可以為任何類(lèi)型數(shù)據(jù)。

        value=getappdata(0,variable)

        獲取根對(duì)象的Application數(shù)據(jù)中variable字段的值。

        isappdata(0,variable)

        判斷根對(duì)象的Application數(shù)據(jù)中是否存在字段variable,存在返回1,否則返回0。

        2.2 主子結(jié)構(gòu)

        MATLAB GUIDE程序設(shè)計(jì)中,參數(shù)在窗口間主子傳遞的方式主要有利用GUIDE本身的varargin/varargout傳遞和利用waitfor函數(shù)傳遞。為了形象說(shuō)明參數(shù)在主子結(jié)構(gòu)窗口間傳遞的程序設(shè)計(jì),特用一個(gè)例子來(lái)說(shuō)明,如圖 6、圖7所示,其實(shí)現(xiàn)功能如下:在主窗口A中點(diǎn)擊顯示按鈕,彈出子窗口B,在子窗口B中的彈出菜單中選擇某一項(xiàng)后,窗口B消失,在窗口A中顯示選擇的內(nèi)容,這就涉及到子窗口B彈出菜單的數(shù)據(jù)如何傳遞到主窗口A觸控按鈕的問(wèn)題,其中,在窗口A中,設(shè)置窗口tag:figure1,設(shè)置觸控按鈕tag:pushbutton1,設(shè)置靜態(tài)文本tag:text1;在窗口B中,設(shè)置窗口tag:figure2,設(shè)置彈出菜單tag:popupmenu2/string:軟件/導(dǎo)刊,其余采用默認(rèn)設(shè)置,另外,GUIDE自動(dòng)生成的M文件各函數(shù)中除了下文添加了代碼的函數(shù)外均采用默認(rèn)代碼。

        圖6 參數(shù)在主子結(jié)構(gòu)窗口 圖7 參數(shù)在主子結(jié)構(gòu)窗口

        間傳遞方式示例一 間傳遞方式示例二

        2.2.1 利用GUIDE本身的varargin/varargou傳遞參數(shù)

        GUIDE執(zhí)行函數(shù)順序?yàn)椋篛pening函數(shù)→Output函數(shù)→Callback函數(shù),其中Opening函數(shù)和Output函數(shù)只會(huì)執(zhí)行一次,執(zhí)行完Opening函數(shù),GUI窗口就被創(chuàng)建了,執(zhí)行完Output函數(shù)就已經(jīng)輸出varargout了。若要GUI根據(jù)用戶(hù)的操作來(lái)輸出varargout,可以使用uiwait和uiresume,此時(shí)GUIDE執(zhí)行函數(shù)順序?yàn)椋篛pening函數(shù)→Callback函數(shù)→Output函數(shù)[11]。在窗口的OpenFcn中,如果不加uiwait,程序會(huì)直接運(yùn)行到下面,執(zhí)行OutputFcn,也就是說(shuō)程序一運(yùn)行,返回值就確定了,再在其它部分對(duì)handles.output作更改也沒(méi)有效果了。加上uiwait,只有執(zhí)行了uiresume后,才會(huì)繼續(xù)執(zhí)行到OutputFcn,在此之前用戶(hù)有充分的時(shí)間設(shè)置返回值。使用方法:

        在子窗口M文件中,假設(shè)子窗口的名稱(chēng)為subGUI,設(shè)想的參數(shù)輸入輸出為:[out1,out2,…,outN]=subGUI(in1,in2,…,inN)。

        (1)在OpeningFcn函數(shù)中,讀入?yún)?shù),并用guidata保存,即:

        handles.in1=varargin{1};

        handles.in2=varargin{2};

        handles.inN=varargin{N};

        guidata(hObject,handles);

        (2)在OpeningFcn函數(shù)的結(jié)尾加上uiwait(handles.figure2)。

        (3)在窗口中控制程序結(jié)束的回調(diào)函數(shù)末尾加上uiresume(handles.figure2)。

        (4)在子窗口的OutputFcn中設(shè)置要傳遞出去的參數(shù),即

        varargout{1}=handles.out1;

        varargout{2}=handles.out2;

        varargout{N}=handles.outN;

        (5)末尾添加delete(handles.figure2)結(jié)束程序。

        通過(guò)以上設(shè)置后,在主窗口就可以通過(guò)[out1,out2,…,outN]=subGUI(in1,in2,…,inN)的形式調(diào)用該子程序。在主窗口中調(diào)用子窗口時(shí),主窗口不需要特別設(shè)置,同調(diào)用普通的函數(shù)一樣。在打開(kāi)子窗口的同時(shí),主程序還可以響應(yīng)其它控件,不需要擔(dān)心子窗口的返回值被傳錯(cuò)了地方。

        在子窗口(subGUI.fig)的M文件中,添加如下代碼:

        function subGUI_OpeningFcn(hObject, eventdata, handles, varargin)

        handles.output = hObject;

        guidata(hObject, handles);

        uiwait(handles.figure2);%暫停執(zhí)行OutputFcn函數(shù)執(zhí)行回調(diào)函數(shù),直到resume命令出現(xiàn)

        function varargout = subGUI_OutputFcn(hObject, eventdata, handles)

        varargout{1} = handles.forshow;%輸出參數(shù)為handles結(jié)構(gòu)體中的forshow結(jié)構(gòu)域,即在彈出菜單選中的內(nèi)容

        delete(handles.figure2);%刪除子窗口

        function popupmenu2_Callback(hObject, eventdata, handles)

        handles=guidata(handles.figure2);%取得之前的GUI數(shù)據(jù),并保存到handles中去

        v = get(handles.popupmenu2,'value'); % 確定選擇彈出菜單的第幾項(xiàng)

        str=get(handles.popupmenu2,'string');%獲得彈出菜單的所有內(nèi)容

        switch v

        case 1

        handles.forshow=str{1};%選擇第一項(xiàng),把字符串“軟件”添加到handles結(jié)構(gòu)體中

        case 2

        handles.forshow=str{2};%選擇第二項(xiàng),把字符串“導(dǎo)刊”添加到handles結(jié)構(gòu)體中

        end

        set(handles.figure2,'visible','off');%設(shè)置子窗口不可見(jiàn)

        guidata(handles.figure2,handles);%更新handles結(jié)構(gòu),參數(shù)forshow被保存進(jìn)去uiresume(handles.figure2);%恢復(fù)執(zhí)行OutputFcn函數(shù)

        在主窗口(mainGUI.fig)的觸控按鈕的callback函數(shù)添加如下代碼:

        function pushbutton1_Callback(hObject, eventdata, handles)

        forshow=subGUI;%函數(shù)subGUI的返回值賦給變量forshow

        set(handles.text1,'string',forshow);%使文本顯示選擇的內(nèi)容

        2.2.2 利用waitfor函數(shù)

        waitfor函數(shù)用來(lái)阻止程序執(zhí)行,等待事件或條件的發(fā)生直到條件滿(mǎn)足,程序繼續(xù)執(zhí)行??梢院芎玫乩脀aitfor這一特性來(lái)進(jìn)行參數(shù)在主子窗口間傳遞。以前例說(shuō)明:首先在子窗口B利用前文所述的handles/guidata,把傳遞的參數(shù)保存到handles中,然后在主窗口中點(diǎn)擊觸控按鈕,彈出子窗口B,此時(shí)利用waitfor函數(shù)來(lái)阻止主窗口A運(yùn)行,并對(duì)子窗口B進(jìn)行操作,直到操作完畢(也就是滿(mǎn)足了waitfor的條件),主窗口A繼續(xù)運(yùn)行,再次通過(guò)guidata函數(shù)完成主子窗口間的數(shù)據(jù)傳遞。

        在子窗口(subGUI.fig)的彈出菜單callback函數(shù)添加如下代碼:

        function popupmenu2_Callback(hObject, eventdata, handles)

        handles=guidata(handles.figure2);%取得之前的GUI數(shù)據(jù),并保存到handles中去

        v = get(handles.popupmenu2,'value'); % 確定選擇彈出菜單的第幾項(xiàng)

        str=get(handles.popupmenu2,'string');%獲得彈出菜單的所有內(nèi)容

        switch v

        case 1

        handles.forshow=str{1};%選擇第一項(xiàng),把字符串“軟件”添加到handles結(jié)構(gòu)體中

        case 2

        handles.forshow=str{2};%選擇第二項(xiàng),把字符串“導(dǎo)刊”添加到handles結(jié)構(gòu)體中

        end

        guidata(handles.figure2,handles);%更新handles結(jié)構(gòu),參數(shù)forshow被保存進(jìn)去

        set(handles.figure2,'visible','off');%設(shè)置子窗口不可見(jiàn)

        在主窗口(mainGUI.fig)的觸控按鈕的callback函數(shù)添加如下代碼:

        function pushbutton1_Callback(hObject, eventdata, handles)

        handlesofsubGUI =subGUI;%生成子窗口,返回其句柄

        waitfor(subGUI,'visible');%程序暫停,直到在子窗口彈出菜單中選擇一項(xiàng)

        handlesofsubGUI =guidata(handlesofsubGUI);%取得子窗口GUI的handles

        forshow= handlesofsubGUI.forshow;%返回handlesofsubGUI結(jié)構(gòu)體中結(jié)構(gòu)域forshow

        set(handles.text1,'string',forshow);%使文本顯示選擇的內(nèi)容

        3 結(jié)語(yǔ)

        本文討論了MATLAB GUIDE程序設(shè)計(jì)中參數(shù)在內(nèi)部函數(shù)間及窗口間傳遞的不同方式,并結(jié)合實(shí)例闡述了各方式原理。受篇幅限制,部分示例略。不同的傳遞方式有各自的優(yōu)缺點(diǎn)和適用范圍,在應(yīng)用時(shí)需結(jié)合具體情況選擇。

        參考文獻(xiàn)參考文獻(xiàn):

        [1] 于育民, 梁瑛. MATLABGUI在圖形可視化中的應(yīng)用[J]. 安陽(yáng)工學(xué)院學(xué)報(bào), 2010, 9(4):5354,96.

        [2] 紀(jì)元法, 孫希延, 施滸立. MATLAB的兩種圖形用戶(hù)界面參數(shù)輸入方法[J]. 電腦知識(shí)與技術(shù), 2008,2(13):728731.

        [3] 陳德偉. MATLAB圖形用戶(hù)界面的制作[J]. 常州工學(xué)院學(xué)報(bào), 2005,18(4):811.

        [4] 徐俊立, 王強(qiáng), 金珩. MATLAB環(huán)境下的GUI編程[J]. 內(nèi)蒙古民族大學(xué)學(xué)報(bào):自然科學(xué)版, 2006,21(6):640641.

        [5] 陳安宇, 陳偉, 石彬, 等. MATLAB圖形用戶(hù)界面的應(yīng)用研究[J]. 機(jī)電工程技術(shù), 2008,37(10):2627,46.

        [6] 梁輝. MATLAB制作圖形界面的應(yīng)用[J]. 佳木斯大學(xué)學(xué)報(bào):自然科學(xué)版, 2003,21(4):402406.

        [7] 陳立明, 董輝 ,李加海. 基于MATLAB 6.5的圖形用戶(hù)界面應(yīng)用技術(shù)研究[J]. 電腦開(kāi)發(fā)與應(yīng)用, 2005,18(4):4749.

        [8] 陳子為. 基于MATLAB GUI掃雷游戲的設(shè)計(jì)與實(shí)現(xiàn)[J]. 現(xiàn)代電子技術(shù), 2008,31(24):8588.

        [9] 王玉林, 葛蕾, 李艷斌. 新型界面開(kāi)發(fā)工具:MATLAB GUI[J]. 無(wú)線電通信技術(shù), 2008,34(6):5052.

        [10] 張秋紅, 李玉忍. 用MATLAB制作圖形用戶(hù)界面[J]. 電腦開(kāi)發(fā)與應(yīng)用, 2003,16(3):1011,14.

        [11] 羅華飛. MATLAB GUI設(shè)計(jì)學(xué)習(xí)手記[M]. 北京: 北京航空航天大學(xué)出版社, 2009.

        [12] 南洋, 周靜, 孟開(kāi)元, 等. 基于MATLAB GUI的界面設(shè)計(jì)[J]. 石油儀器, 2008,22(6):7678.

        責(zé)任編輯(責(zé)任編輯:杜能鋼)

        亚洲熟女乱色综合亚洲av| av黄色大片久久免费| 中文字幕人妻饥渴浪妇| 人妻无码一区二区不卡无码av| 亚洲男人第一av网站| 亚洲春色在线视频| 亚洲级αv无码毛片久久精品| 娇妻粗大高潮白浆| 青青草视频在线观看入口| 中国午夜伦理片| 77777亚洲午夜久久多人| 综合图区亚洲另类偷窥| 日韩精品一区二区三区人妻在线| 三年的高清电影免费看| 又大又粗弄得我出好多水| 一本久久精品久久综合桃色| 最新国产女主播在线观看| 好大好爽我要高潮在线观看| 成 人免费va视频| 亚洲精品中国国产嫩草影院美女| 国产麻豆成人精品av| 色综合天天综合网国产成人网| 国产亚洲av无码专区a∨麻豆| 日韩精品网| 青草草视频在线观看华人免费| 国产成人精品无码一区二区三区| 免费又黄又爽又猛的毛片| 亚洲熟妇在线视频观看| 日本一区二区啪啪视频| 欧美顶级少妇作爱| 久久99精品久久久久久秒播 | 亚洲精品一区久久久久一品av| 天堂影院一区二区三区四区| 最新国产美女一区二区三区| 日韩精品一区二区免费| 亚洲国产成人精品无码区二本| 国产91在线免费| 男女性生活视频免费网站| 国产精品国产精品国产专区不卡| 久久久久99精品国产片| 日韩精品极品视频在线观看蜜桃|