首先,我們先改變 GUIDE 面版的大小(可經由拖放面版右下角的黑點來達成),並在面版上放置兩個控制物件,一個是「拉霸」(Slider),另一個是「可編輯文字欄位」(Edit Text),如下:
接著,我們可以使用滑鼠右鍵來點選任一個 UI 控制物件,並選取「Inspect Properties」,以改變其性質。以上面的拉霸為例,以滑鼠右鍵點選後,選取「Inspect Properties」,即可開啟「性質檢視器」(Property Inspector),其外觀如下:
在此性質檢視器中,左邊是物件的性質,右邊則是此性質所對應的值,我們可以點選右邊來改變這些值。我們首先要做的事,就是設定目前面板上的兩個物件的代號,後續對此物件的處理,我們都會根據此代號來進行。經由「性質檢視器」,我們可以進行如下:
- 將拉霸的 Tag 性質改成「mySlider」,此即是拉霸物件的代號。
- 將文字欄位的 Tag 設定成「myText」,此即是文字欄位物件的代號。
完成物件代號的設定後,我們就可以設定物件的反應命令。我們希望這些反應命令能夠使這個 GUI 應用程式達到下列功能:
- 當使用者拖放拉霸時,能將拉霸的位置(預設值是介於 0 和 1 之間)顯示在文字欄位。
- 但文字欄位值被改變時,拉霸的位置能夠隨之改變。
在 GUIDE 的環境下,一個物件的反應命令都是由一個特定的函式來完成,這個函式就稱為反應函式,而函式名稱就是「物件代號_Callback」。
首先,我們以滑鼠右鍵點選拉霸,並選取「View Callbacks/Callback」,即可開啟 MATLAB 程式編輯器。(如果你尚未存檔,MATLAB 會要求你先存檔,才能繼續。你可以經由 GUIDE 主畫面將檔案儲存成 myGui01.fig,之後所有相關程式碼即會被儲存到 myGui01.m。)此程式編輯器會顯示反應命令必須加入的位置,依本例而言,拉霸的 Tag 是 mySlider,所以其反應函式是 mySlider_Callback(),所加進去的兩列敘述如下:
position = num2str(get(handles.mySlider, 'Value')); set(handles.myText, 'String', position); 其中第一列敘述抓出拉霸的位置,並轉成數值,第二列則將此數值設定為文字欄位的顯示文字。加入的位置如下所示:
使用相同的方式,我們也可以加入文字欄位的反應命令,其反應函式是 myText_Callback(),所加進去的兩列敘述如下
value = str2double(get(handles.myText, 'String')); set(handles.mySlider, 'Value', value); 其中第一列是抓出文字欄位的顯示文字,然後轉成數值,然後在第二列將拉霸的位置設定成此數值。加入的位置如下所示:
加入這些反應命令後,即可儲存檔案並關閉 MATLAB 編輯器,然後按下 GUIDE 面版的工具列的三角形按鈕,即可開啟我們所設計的 GUI 介面如下:
你可以直接移動拉霸,其位置就會顯示在文字欄位內;你也可以修改文字欄位的值,來指定拉霸的位置。
如果你已經完成整體設計流程,此時可以關閉 GUIDE 主畫面。之後只需在 MATLAB 輸入 myGui01,即可開啟所設計的 GUI 程式畫面。若還需要進行 GUI 程式的修改,只需在 MATLAB 輸入 guide myGuide01,即可開啟 GUIDE 主畫面並繼續進行 GUI 程式設計,例如加入新的控制物件並定義相關反應命令等。
上述範例已經收錄在本書範例目錄中的 gui01.m 和 gui01.fig。
從這個範例中我們可以知道,在設計反應命令時,最重要的事,就是要能讓不同的 UI 控制物件都能存取其他物件以及相關資料,因為每一個 UI 控制物件的反應命令都是以函式的型式來進行,因此 GUIDE 在每一個反應函式內提供了一個結構變數 handles,以便提供資料的共通,可達到下列兩項功能:
- 可以經由 handles 來存放或取用共通的資料。
- 可以經由 handles 來取得每一個 UI 控制物件的性質。
例如,若要在某一個控制物件的反應函式內存放變數 A,可以加入下列敘述:
handles.myData = A; % 將變數 A 存放在 handles 的 myData 欄位 guidata(hObject, handles) % 將新的 handles 存回整個 GUI 介面 如果要在另一個控制物件的反應函式裡面使用變數 A,只要加入下列敘述即可:
A = handles.myData; 另外,handles 本身也包含了同一個 GUI 介面下的所有控制物件,以上一節的範例來說,我們定義了兩個控制物件的 Tag,因此你可以在任一個反應函式內取用每一個控制物件,如下:
handles.mySlider:拉霸物件 handles.myText:文字欄位物件 如果整個 GUI 的名稱是 myGUI,那麼 handles.myGUI 就是指到整個 GUI 的圖形,因此若要關閉此視窗,也可以使用下列敘述:
delete(handles.myGUI)
MATLAB程式設計:入門篇