本文摘自iLoveMatlab論壇
1、從最簡單的開始
編程的基本思想是:我執行一個操作,程序做出一個反應。“一個操作”包括點擊鼠標、拖動滑塊、填寫數據、選擇選項等;“做出一個反應”包括計算、儲存在哪里、貼個圖出來、顯示在哪里。
簡言之:當點擊按鈕A時, 然后執行任務C,則進入按鈕A的回調函數callback里,寫下任務C的代碼。
幾個基本概念
- CallBack: 最常用的。點擊按鈕時,按鈕下的Callback就會執行;拖動滑塊時,滑塊名下的callback就會執行;總之,正常用途全放在callback下。
- ButtonDownFcn:單擊,這個函數名下的代碼就會執行。(ps:按鈕的callback也是點擊,覆蓋掉buttondownfcn。)
- CreateFcn:顧名思義,在生成這個控件,顯示之前,執行這個函數名下的代碼。
- DeleteFcn: 顧名思義,在控件要銷毀,但是被毀滅之前執行這個函數名下的代碼。貌似“真的要退出嗎”這一類。
- KeyPressFcn:當前控件獲得焦點且有按鍵按下時執行。
- SelectionChangeFcn:在群按鈕組件中改變選擇時,所執行的函數。
2、常用控件代碼框架參考
Toggle Button
functon togglebutton1_callback(hObject,eventdata,handles)
%這一句不用管。自動加的。
button_state = get(hObject,'Value')
%控件甲的callback下面hObject就是控件甲,同理控件乙callback下的hObject......
if button_state==get(hObject,'Max')
%則……
else if button_state==get(hObject,'Min')
%則……
end
PS:button_state是變量名,存放按鈕的選擇狀態。如果button甲放在一個buttonGroup里,則button甲callback下的代碼就要挪到buttonGroup下面去。因為buttonGroup的回調函數會覆蓋掉它成員的回調函數。
Radio Buttons
右鍵Radio按鈕,進入編輯callback
function ………………略
if(get(hObject,'Value')==get(hObject,'Max'))
%被選中了,你想怎么樣
else
%不被選中,你想怎么樣
end
Check Boxes
if(get(hObject,'Value')==get(hObject,'Max'))
%被選中了,你想怎么樣
else
%不被選中,你想怎么樣
end
Edit Text
function edit1_Callback(hObject,eventdata,handles)
user_string = get(hObject,'String'); %就得到了所輸入的字符
%matlab把所有輸入當作字符,如果期望輸入數據,則進行數據類型轉換:
user_entry= str2double(get(hObject,'String'));
if isnan(user_entry) %nan就是not a number的簡寫。
errodlg('You must entry a number value','Bad Input','modal') %跳出一個對話框。
end
PS: 'Bad Input'是指窗口樣式,如黃色感嘆號或者紅叉的對話框;modal是指窗口類型,如警告對話框。
Sliders
function slider1_callback(hObject,eventdata,handles)
slide_value=get(hObject,'Value');%獲取滑塊當前值
%別的代碼
PS:它的Max Min 屬性設置了滑竿的最大最小范圍值。
List Boxes
function ........
index = get(handles.listbox1,'Value'); %listbox1控件的tag名
file_list =get(handles.listbox1,'String'); %得到了listBoxes的列表
file_name = file_list{index};%得到了所選擇的項目名
%別的代碼
PS:此callback在鼠標在這個控件上松開或者特定的鍵盤按鍵松開(看怎么設置屬性)時執行。默認鍵盤上下鍵可以改變它的值同時執行一次callback。而enter和space不改變它的值,只是執行callback。Max-Min 差值是0的話,表示只可以單選;1的話,表示可以多選。這個可以在他的屬性欄里設置。
Pop_up Menus
function .......
val=get(hObject,'Value')
Switch val
case 1
%
case 2
%
defualt
......
end
Button Groups
function .......
switch get(hObject,'Tag');%注意這里的hObject和別的不同,不是指Button Group,而是指在組里面被選中的那個控件
case 'radio button1' %按鈕1的tag
%。。。。。
case '按鈕2的tag'
%。。。。。
end
Axes
axes(handles.youraxesname);%選擇一個axes
plot(x,y); %這時所畫的圖就到它上面了
set(handles.youraxesname,'XMimrFrick','on'); %順便設置一下它的屬性
grid on; %加上網格
3、怎么獲得和設置控件的屬性
通俗的說,就是怎么獲取編輯框里的字符、滑塊現在的位置、pop up里被選中的選項,如何控制static text顯示我要求的信息等。
-
設置:set(handles.控件的tag,'要設置的屬性名','要設置的屬性值')。比如:
set(handles.edit1,'string','hello world'); -
獲取:get(handles.控件的tag,'要獲取的屬性名')
help里可以看到所有可能有用的屬性:
MATLAB->Creating Graphical User Interfaces->Laying Out GUIs and Setting Properties->What Properties Do I Need to Set?
4、數據怎么在不同的控件之間傳遞
先看在一個GUI界面內部的傳遞數據。每一個控件的回調函數頭:
function myc_Callback(hObject, eventdata, handles)
第一個參數是hObject,是跟這個callback所關聯的控件的handles,在它自己的callback下,可以用代號-> hObject 來調用它。即控件自己的回調函數調用自己的屬性,只用hObject.屬性名就可以了(中間一點)。
第二個參數是MATLAB的保留參數。
第三個handles是這個GUI界面的代號,可以通過它獲取這個界面的所有信息。所以在控件A自己的回調函數中,要獲取或者設置別的控件的屬性,就用 handles.別的控件Tag.屬性
handles hObject 都是結構體。handles格式是一個存放數據的缸。控件的handles是小缸,它的名字叫做hObject;GUI界面的handle是一個大缸,並且這個缸名字也叫做handles;大缸里存放了所有的小缸和所有用戶數據,你只需handles.控件A的tag,就可以存取控件A的信息。
把自己計算出或者別的什么數據放到這個缸里,可以在任何地方:
handles.變量名 = 某些值 (其實也就是給結構體添加成員變量)
b=handles.變量名 (結構名加點號來引用成員變量)
就可以得到這個變量值,同樣也可以修改它。
別忘了使用guidata(hObject, handles);在函數末尾來保存你對handles和hObject的操作。(不然你自定義的變量就沒了)
5、在不同GUI之間傳遞數據
數據傳入
先看打開一個GUI界面時,傳給他的參數有哪些。
function mygui_OpeningFcn(hObject, eventdata, handles, varargin)
所有的啟動參數都是通過varargin傳到它的OpeningFcn里面的。啟動參數包括:
figure,也就是窗口參數,如position之類。例如:打開這個GUI時,使用命令
mygui('Position',[434 234 234 34])
表示打開窗口在這個位置;還有哪些可控屬性可以查help。
自定義參數,如果傳入的參數不是figure的屬性(matlab查找不到你輸入的屬性名),則輸入的參數作為一個向量存放在varargin里面。比如mygui('路人甲','80‘),那varargin{1}存放了'路人甲',varargin{2}=’80‘
數據傳出
看每一個GUI的最外層的那句 function varargout = mygui(varargin)。把GUI本身看做一個函數,b=mygui(一些傳入的參數) 就執行GUI並返回結果,b就得到了傳出來的結果。
在GUI任意地方,將要輸出的數據存在handles.output里面。
handles.output=數據1;
handles.secend_output=數據2;
然后在GUI的outputFcn里面加上
varaginout{1}=handles.output;
varaginout{2}=handles.secend_output;
這樣就把數據傳出來了
