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)。
常用的參數如下表所示:
面版群組功能(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'參數值。
沒有留言:
張貼留言