12/31/2006

GUI其他元件之應用

(Sources: Matlab GUI Tips. RS Schestowitz, )

圓鈕按鈕(Radio Buttons)


圓鈕按鈕通常以群組方式出現,但僅能從中選其一。為此,每一次按鈕之回叫函數中,必須伴隨下面之設定指令,將選擇之按鈕值設定為1,其餘皆設定為0:


set(handles.radio1, 'Value', 1);
set(handles.radio2, 'Value', 0);
set(handles.radio3, 'Value', 0);


上式為radio1之回叫函數內容,為此,其他之按鈕值須設定為0。在實際之狀態測試時,則可用下式進行。通常圓鈕之表示法有按下與釋放兩狀態,按下時圓鈕內會有一點綠。按下狀態其內定值為1,或等於Max值,否則為零。其測試方式如下:

if (get(hObject,'Value') == get(hObject,'Max'))
% 此處執行圓鈕被按下之程式
else
% 此處執行圓鈕釋放狀態之程式
end

若圓鈕成為群組形式時,除採用上述方法設定外,亦可利用群組回叫函數SelectionChangeFcn處理,不必採用個別設定的方式。其功能後述。

開関鈕(Toggle Buttons)


開關鈕之功能與圓鈕相同,只是開關鈕為長方形,外觀與按鈕相同。只是它存在按下與釋放兩狀態,前者呈外凸而後者呈內陷。其狀態值按下時等於Max(預設值為1),釋放時等於Min(預設值為0)。利用下面回叫函數可以偵測其狀態:

function togglebutton1_Callback(hObject, eventdata, handles)
button_state = get(hObject,'Value');
if button_state == get(hObject,'Max')
% 執行開關鈕按下狀態之程式
elseif button_state == get(hObject,'Min')
% 執行開關鈕釋放狀態之程式
end

與圓鈕同樣,開關鈕亦可以利用群組的形式處理,其回叫函數為SelectionChangeFcn。

若想將開關鈕(或圓鈕)加上影像,則可利用CData這個屬性,設其色值為mxnx3之RGB值,屬實色圖像。若以亂數產生16x128圖像,並作如下設定:

a(:,:,1) = rand(16,128);
a(:,:,2) = rand(16,128);
a(:,:,3) = rand(16,128);
set(hObject,'CData',a)


勾選盒(Check Boxes)


勾選盒旨在確定某項元件所代表意義之確認。已勾選狀態之值等於Max(預設值為1),無勾選狀態之值則為Min(預設值為0),可以利用下式進行測試:

if (get(handles.state,'Value') == 0),
set(handles.checkbox, 'Value', 0);
set(handles.state, 'String', '0');
else
set(handles.checkbox, 'Value', 1);
set(handles.state, 'String', '1');
end


下拉選單(Drop-down Menus)


下拉選單與跳出式選單(Pop-Up Menus)相同。其內可選擇之項目至少兩項以上,但實際應用僅能其中一項有效。通常選單存在'String'之內,被選定的項目序則置放'Value'內。因此,為確定被選定之名稱,必須使用如下指令:


function popupmenu1_Callback(hObject, eventdata, handles)
val = get(hObject,'Value');
string_list = get(hObject,'String');
selected_string = string_list{val}; % convert from cell array
% to string
% proceed with callback...

if (strcmp(selected_string,'MenuEntry1')),
set(handles.data, 'String','Data1');
elseif (selected_string,'MenuEntry2')),
set(handles.data, 'String', 'Data2');
else
msgbox('Error with menu callback. Parameter passed is not recognized.');
end

若選擇之項目多時,亦可使用switch case之型式:

function popupmenu1_Callback(hObject, eventdata, handles)
val = get(hObject,'Value');
switch val
case 1
% 選擇第一項時之程式
case 2
% 選擇第二項時之程式
case 3
% 選擇第三項時之程式
...
end


選單勾記選項


在下拉式清單中,已選的項目加打勾記號時,必須針對同一選單中之項目加以標記:

set(handles.menuitem1, 'Checked', 'off');
set(handles.menuitem2, 'Checked', 'off');
set(handles.menuitem3, 'Checked', 'off');
set(handles.menuitem4, 'Checked', 'on');
set(handles.menu_selection, 'String', 'item4');


滑尺(Sliders)


利用滑尺之位置算出實際之滑尺值,再滙入實際程式,其程序如下:

function slider1_Callback(hObject, eventdata, handles)
slider_value = get(hObject,'Value');
% proceed with callback...

亦可使用下列指令設定其值:

set(handles.slider_value,'String', num2str(ceil(get(handles.slider))));

若要將滑尺值與編輯窗內之值連動,亦可採用下面回叫函數。當使用者拉動滑尺,其對應值可以在編輯窗中顯示:

set(handles.edit1,'String',num2str(get(handles.slider1,'Value')));

上述指令中,應用到三項指令:

  • 使用get指令取得滑尺之現值。
  • 利用num2str函數將數值轉換為字串。
  • 利用set指令重設編輯窗之'String' 文字屬性。

編輯窗(Edit Text)


使用者亦可經由編輯窗輸入文字,然後由其'String'屬性取得內容。其正式回叫函數如下:

function edittext1_Callback(hObject, eventdata, handles)
user_string = get(hObject,'string');
% proceed with callback...

若要取得的是數值,則必須將文字串轉換為數值,此可以使用str2double轉換函數為之。因此,若取得的內容屬非數值文字,則經過此函數轉換之結果會得到NaN,如此可以使用isnan()進行測試,然後利用errordlg發出錯誤信息。其型式如下:

function edittext1_Callback(hObject, eventdata, handles)
user_entry = str2double(get(hObject,'string'));
if isnan(user_entry)
errordlg('你必須輸入數值','Bad Input','modal')
end
% 由此繼續其他程式指令...


列示窗(List Boxes)


列示窗主要在顯示一系列項目,供使用者選擇,其選項可為單選或多選。常應用於檔案或目錄顯示。在guide中設定時,可循下列方式進行:

  • 在屬性表中,就'String'項下輸入要顯示的項目。
  • 選 OK確定,清單中之頭一項即會顯示在窗口中。
  • 下面參數可供設定,以獲得不同的功能:其中包括ListBoxTop、Value、Max及Min 等項。
     * 若窗口不足以顯示所有項目時,可以用'ListBoxTop'屬性選定那些項目置於最頂端。
    * 使用者預設僅能一次單選。若要多選,可使用屬性表中之'Max' 與'Min'參數設定,
    使其 Max - Min > 1。例如: Max = 2, Min = 0。
    * 在最初顯示時可以設定'Value',作為最初預設為被選之項目。
    * 不設初值選定時,可以設定 Max與 Min值,以得多重選擇;或設為空集合即可。


列示窗也可以利用回叫函數進行程式設定,回叫函數常與滑鼠按鈕釋放時或特定鍵按下時之動作連動。而利用箭號鍵則可改變數值屬性,並觸動回叫函數之執行及設定圖之 SelectionType 屬性至normal狀態。

使用Enter鍵或空白鍵並不改變數值屬性,但可以觸發回叫函數,並設定 SelectionType 屬性至open狀態。若使用者雙按滑鼠,則每一單擊會令回叫函數執行。第一個單擊時,MATLAB設定圖之SelectionType屬性至normal,第二個單擊則會讓其再度打開(open)。

下面程式為一個典型列示窗之回叫函數內容。設listbox1 為其標籤值,先取得其選定值序,再取得其名單,再求得對應值序之名稱,其過程與一般下拉式選單類似。

function listbox1_Callback(hObject, eventdata, handles)
index_selected = get(hObject,'Value');
list = get(hObject,'String');
item_selected = list{index_selected}; % Convert from cell array
% to string



群組功能(Panel, Button Group)



版面與按鈕群組功能可以將一群類似功能之元件歸納在一起,互相之間具有連動之關係。這種群組也具有名稱,可以代表整組的呼叫。這個名稱可以置於群組外圍之位置。

群組功能可利用uipanel與uibuttongroup函數產生各項組合元件。其語法如下:

ph = uipanel(fh,'PropertyName',PropertyValue,...)


其中 ph 為組合之握把,而第一項參數 fh 則為其母系之圖握把,或者其直屬之面版或按鈕組合握把。其語法如下:


bgh = uibuttongroup('PropertyName',PropertyValue,...)


其中 bgh 為按鈕群組之握把。其母系屬性則用來說明其下各元件之屬性。若兩者均不表明其母系之關係,則預設母系應為現圖。

在guide應用群組指令則更簡單,其特性屬性也較明確。其應用過程可以簡述如下:

1. 在屬性表中,先選標題'Title',將其名稱更改其他有意義的名稱。
2. 只要在週圍按鍵,該標題即刻更換。
3. 若要變換標題之置放位置,則可選擇標題位置'TitlePosition',並從其跳出窗中選擇適當位置,其預設值為左上角(lefttop)。

常用的參數如下表所示:


屬性Property
數值
Values

說明
Description

Parent
Handle
元件之母圖、母版或按鈕組合之握把。
Position
4-元素向量: [離左邊矩, 離底邊矩,寬度,高度]. 預設值=s [0, 0, 1, 1].
元件對應母系座標之位置及大小。
Title
String
元件字串名稱,不得使用 remove, defaultfactory 等相同字眼。否則前面要加倒斜線。
TitlePosition
lefttop, centertop, righttop, leftbottom, centerbottom, rightbottom. Default is lefttop.
標題在組合邊之位置。
Units
pixels, normalized, inches, centimeters, points, characters. Default is normalized.
量測位置向量之單位。




面版群組功能(Panel Group)


下面之指令可以建立面版群組之握把pgh。指向此握把,可以建立其內群組之元件。

pgh = uipanel('Parent',fh,'Title','Demo Panel',...
'Position',[.25 .1 .5 .8]);


其中fh為此組合之母系圖握把。利用這個握把亦可建立按鈕功能組合。 設此群組之標題名稱為'Demo Panel',並以lefttop為其預設位置。單位預設值為'normalized',表示其大小可以自動依圖變更。其位置則設為圖寬度之50%、圖高度之80%。離左緣25%,離底緣10%。此外,尚另加二個按鈕(即A、B按鈕),其相關位置也以相對位置表示:


pbh1 = uicontrol(pgh,'Style','pushbutton','String','A按鈕',...
'Units','normalized','Position',[.1 .55 .8 .3]);
pbh2 = uicontrol(pgh,'Style','pushbutton','String','B按鈕',...
'Units','normalized','Position',[.1 .15 .8 .3]);


按鈕群組功能(Button Group)


下面程式可建立一個按鈕群組,其名稱為'按鈕組合',握把為bgh。母系圖握把為fh,標題位置採預設值lefttop。

bgh = uibuttongroup('Parent',fh,'Title','按鈕組合',...
'Position',[.1 .2 .8 .6]);


圓鈕群組功能(Radio Group)


同樣,亦可建立圓鈕群組,其程式如下:

rbh1 = uicontrol(bgh,'Style','radiobutton','String','紅色',...
'Units','normalized','Position',[.1 .6 .3 .2]);
rbh2 = uicontrol(bgh,'Style','radiobutton','String','藍色',...
'Units','normalized','Position',[.1 .2 .3 .2]);

開始時,MATLAB會自動以第一個按鈕為預選值,若要第一個以外為預選值則可事先設定其'Value'參數值。