matlab gui基礎



一、從最簡單的開始
      編程最基本的目的就是——我執行一個操做,程序作出一個反應
       「一個操做」包括:點擊鼠標,拖動滑塊,填寫數據,選擇選項…… 
「作出一個反應」包括:計算一些東西,而後儲存在哪裏,或者貼個圖出來,或者顯示在哪裏……
-------------------------------------------------------------------------------------------------------------------
      編程的基本思想
      目的->點擊按鈕A, 而後執行任務C,
         則->進入按鈕A的回調函數callback裏,寫下任務C的代碼。
-------------------------------------------------------------------------------------------------------------------
     a:不知道callback在哪??右鍵單擊按鈕,view callbacks->選擇callback)別的控件也同樣。
     a:不一樣的回調函數啥意思??
       callBack
        最經常使用的就是它。若是控件是按鈕,那點擊按鈕時,則按鈕下的Callback就會執行;若是是滑塊,則拖動滑塊時,滑塊名下的callback就會執行;總之,就是對控件默認操做時,matlab後臺就會自動調用它名下的的callback。正經常使用途,全放在callback下就夠了。若是其餘的,實在是想知道,瞭解一下也何嘗不可。
       ButtonDownFcn
       就是鼠標在它(代指各類控件)上面點擊一下,你放在這個函數名下的代碼就會執行。(ps:按鈕的callback也是點擊,因此會覆蓋掉這個buttondownfcn。)
        CreateFcn
        顧名思義,在生成這個控件,顯示以前,執行你放在這個函數名下的代碼;
        DeleteFcn
        同樣。在控件要銷燬,可是被毀滅以前執行這個函數名下的代碼。貌似「真的要退出嗎」這一類就是寫在這裏。
        KeyPressFcn
        當前控件得到焦點且有按鍵按下時執行。(什麼是焦點?就是這個控件被鼠標點了(或者是tab輪選到了)。你打開一個記事本,而後再點這個網頁,再隨便按幾個按鍵,記事本上有字不?沒有對吧。由於它沒得到焦點,因此你的按鍵它不會反應的。只有你最後再點它一下,再按幾個按鍵,結果怎麼樣?有字了吧?)這裏的KeyPressFcn也是同樣的道理。
通常在這下面的代碼還會判斷下按鍵是什麼,而後執行相應的代碼。
         ResizeFcn,SelectionChangeFcn 不經常使用。也懶得去看了。附幾句,控件都有Resize的屬性,好像默認是不可調整,若是要用到這個函數,去把它打開先。 

       SelectionChangeFcn
       是在羣按鈕 組件中,改變選擇時,所執行的函數。

        哪些控件支持哪些回調函數?很簡單,你在它上面右鍵就能夠看到了,點進去就能夠編輯了。
       能夠在property inspect中在須要的回調函數下設置%automatic就能夠自動添加相應的回調函數框架

二、經常使用控件代碼框架參考
---------------------------------------------------------------------
Toggle Button 的callback通常寫法
      toggle button是什麼?設計面板上,左邊那一欄圖標,看到它名字了吧?沒看到?File->preference->GUIDE->把那個show names那一欄勾選上。好了,能夠看到了吧 。知道是什麼了吧?
     拖進來,雙擊它,看到它的屬性設置表。上面各類各樣的屬性,之後有時間慢慢研究。
     點下它時,它默認value ='Max'
      不點下它時,它value='Min'
--------


  1. functon   togglebutton1_callback(hObject,eventdata,handles) 
  2. %這一句,如今不用管。自動加的。  
  3. %%%如下是通常代碼
  4. button_state = get(hObject,'Value')  
  5. %控件甲的callback下面hObject就是控件甲,同理控件乙callback下的hObject......
  6. if button_state==get(hObject,'Max')
  7.     %則怎麼怎麼怎麼
  8. else if button_state==get(hObject,'Min')
  9.      %則怎麼怎麼怎麼
  10. end
複製代碼

--------
備註:button_state隨便取的變量名,存放按鈕的選擇狀態,別覺得它是什麼喔。
           若是你的button甲是放在一個buttonGroup裏面,則button甲callback下的代碼就要挪到buttonGroup下面去。由於buttonGroup的回調函數會覆蓋掉它成員的回調函數。
----------------------------------------
Radio Buttons  
------
  1. 右鍵點選你的Radio按鈕,進入編輯callback
  2. function ………………略
  3. if(get(hObject,'Value')==get(hObject,'Max'))
  4.    %被選中了,你想怎麼樣
  5. else
  6.     %不被選中,你想怎麼樣
  7. end
複製代碼
-----------------------------------------
Check Boxes
-------
  1. if(get(hObject,'Value')==get(hObject,'Max'))
  2.    %被選中了,你想怎麼樣
  3. else
  4.     %不被選中,你想怎麼樣
  5. end
複製代碼
------------------------------------------
Edit Text
-----------
  1. function edit1_Callback(hObject,eventdata,handles)
  2. user_string = get(hObject,'String');    %就獲得了所輸入的字符
  3. %由於matlab是把全部的輸入看成字符來看待,若是你是指望的到輸入的數據的話,則:
  4. user_entry= str2double(get(hObject,'String'));     這裏進行一個數據類型轉換。看函數名就知道了。
  5. if isnan(user_entry)         %nan就是not a number的簡寫。知道這個函數意思了吧?
  6.      errodlg('You must entry a number value','Bad Input','modal')      %跳出一個對話框。
  7. end
  8. %正確獲得了數值,如下輸入你的其餘代碼
複製代碼
----------
附: 'Bad Input'是指窗口樣式,就像咱們在操做系統下,常常會跳出一個黃色感嘆號的對話框,或者一個紅叉的對話框;
        modal是指窗口類型,就像一些程序跳出警告對話框,咱們什麼也不能作了,只能把那個對話框選擇一個是或者不是,才能繼續作其餘事情。這種對話框就是modal類型。而一般的好比瀏覽器的界面,咱們打開後,能夠無論,而後打開別的對話框,這種就是非模態對話框。
      
       默認在點擊你的界面菜單欄或者界面上的其餘組件後,這個edit text的callback都回被執行一遍,因此在你點肯定按鈕的時候,edit callback下讀到的數據會更新的了,不用擔憂!
---------------------------------------------------
Sliders
---------
  1. function slider1_callback(hObject,eventdata,handles)
  2. slide_value=get(hObject,'Value');%獲取滑塊當前值
  3. %別的代碼
複製代碼
----------
附: 它的Max Min 屬性設置了滑竿的最大最小範圍值。
---------------------------------------------------
List Boxes
-----------
  1. function ........
  2. index = get(handles.listbox1,'Value');  %listbox1是你本身的那個控件的tag名字
  3. file_list =get(handles.listbox1,'String');   %獲得了你的listBoxes的列表
  4. file_name = file_list{index};
  5. %獲得了所選擇的項目名,一下寫本身的代碼
複製代碼
-------------------
附:
       此 callback在鼠標在這個控件上鬆開或者特定的鍵盤按鍵鬆開(看你怎麼設置它的別的屬性的了)時候執行。
      默認鍵盤上 下 鍵能夠改變它的值同時執行一次callback。而enter和space不改變它的值,只是執行callback
Max-Min 差值是0的話,表示只能夠單選;1的話,表示能夠多選。這個能夠在他的屬性欄裏設置
----------------------------------------------------------
Pop_up Menus
--------------
  1. function .......
  2. val=get(hObject,'Value')
  3. Switch val
  4. case 1
  5. %
  6. case 2
  7. %
  8. defualt
  9. ......
  10. end
複製代碼

----------------------------------------------------
Button Groups
------------------
  1. function .......
  2. switch get(hObject,'Tag');
  3. %注意這裏的hObject和別的不一樣,並非指這個BUtton Group,而是指在組裏面,被選中的那個控件
  4. case 'radio button1'   %按鈕1的tag
  5.      %。。。。。
  6. case '按鈕2的tag'
  7.     %。。。。。
  8. 。。。
  9. end
複製代碼

----------
附:因此在這裏,若是要拿到button groups自己的話,就用handles.它的tag名  中間一個點。
--------------------------------------------------
Axes
-------------
       它是用來畫圖的,能夠說是一塊畫布。它並不算是嚴格意義上的控件,但可讓用戶在它的區域上點擊或者移動鼠標時(看你是放在什麼callback下了)執行必定的代碼。那就要加它本身的callback函數了。
       下面用來通常功能,因此不用本身的callback,代碼都是寫在別的控件回調函數下。

  1. axes(handles.youraxesname);%選擇你的一個axes,天然,用它的tag來選中它
  2. plot(x,y);  %這時,所畫的圖就到它上面了
  3. set(handles.youraxesname,'XMimrFrick','on'); %順便設置一下它的屬性
  4. grid on; %加上網格
複製代碼

--------------------------------------------------
Active控件

還沒時間去研究。這個是最好用的,由於能夠借用別人的現成的東西,畢竟本身不是程序員,沒有必要編寫太多的代碼。一些通用的好比文件存取對話框,視頻放映之類的。
惋惜,我還沒時間去看。呵呵。

------------------------------------------------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------------------------
ps:真是幸虧有恢復數據功能,多是我打太長時間,點發新話題竟然要重登錄,再後退已經沒有內容了,差點崩潰。
o(∩_∩)o...


[ 本帖最後由 柚籽 於 2008-5-15 02:53 編輯 ]
 
 
 
   
2#
 
  發表於 2007-11-11 19:03:31   |   只看該做者
很是全面!

對GUI理解的很透徹,有時間當這個板塊的版主麼?
 
 
 
 
   
3#
 
  樓主 |   發表於 2007-11-12 02:19:09   |   只看該做者
三、怎麼得到和設置控件的屬性

     通俗的說,就是我怎麼獲取 編輯框裏的字符,滑塊如今的位置,pop up裏被選中的選項,如何控制 static text顯示我要求的信息
     控件的屬性固然遠不止我剛剛說的。
     在你須要的地方插入如下代碼:
設置:
     set(handles.你控件的tag,'要設置的屬性名','要設置的屬性值')
獲取:
    get(handles.你控件的tag,'要獲取的屬性名')


    好比:set(handles.edit1,'string','hello world');


help裏能夠看到全部可能有用的屬性 
MATLAB->Creating Graphical User Interfaces->Laying Out GUIs and Setting Properties->What Properties Do I Need to Set?


4. 數據怎麼在不一樣的控件之間傳遞

     知道了GUI的數據管理規則,這個就很簡單了。
-------------------    
先看在一個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的操做。(否則你自定義的變量就沒了)
-----------------------
五、在不一樣GUI之間傳遞數據

-----------這部分是之前寫的我發現個人理解有些問題---因此我如今傳遞數據用的application data的方法,沒用這個-。可能還沒理解透output的函數做用------------------------ 
  傳入 
    那就來看打開一個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‘
       
     那mygui中對這讀取兩個數據進行反應,就達到了傳入參數的目的。

  傳出
      那怎麼把數據傳出來呢?
      將你要輸出的數據存在handles.output裏面
     在GUI任意地方
              handles.output=數據1;
              handles.secend_output=數據2;
     而後在GUI的outputFcn裏面加上
             varaginout{1}=handles.output;
             varaginout{2}=handles.secend_output;

這樣就把數據傳出來了。

看每個GUI的最外層的那句     function varargout = mygui(varargin)     看輸入輸出,就是這樣了。把GUI自己就是一個函數,        b=mygui(一些傳入的參數)   就執行GUI並返回結果        則b就獲得了傳出來的結果。------------------------------------------------
相關文章
相關標籤/搜索