1. 程式人生 > >matlab GUI介面設計總結

matlab GUI介面設計總結

二:使用控制元件


新建一個佈局(視窗),可以在新視窗中新增如下控制元件


1.靜態文字(Static Text)        2.編輯框(Edit Text)控制元件
3.列表框(Listbox)控制元件            4.滾動條(Slider)控制元件
5.按鈕(Push Button)控制元件        6.開關按鈕(Toggle Button)控制元件
7.單選按鈕(Radio Button)控制元件        8.按鈕組(Button Group)控制元件
9.檢查框(Check Box)控制元件        10.列表框(Listbox)控制元件
11.彈出式選單(Popup Menu)控制元件    12.座標軸(Axes)控制元件

13.面板(Panel)控制元件




每一個控制元件都有自己的屬性常規屬性有:


        一、控制元件風格和外觀
        (1)BackgroundColor:設定控制元件背景顏色,使用[R G B]或顏色定義。
        (2)CData:在控制元件上顯示的真彩色影象,使用矩陣表示。
        (3)ForegroundColor:文字顏色。
        (4)String屬性:控制元件上的文字,以及列表框和彈出選單的選項。
        (5)Visible:控制元件是否可見。


        二、物件的常規資訊
        (1)Enable屬性:表示此控制元件的使能狀態,設定為on”,表示可選,為“off”時則表示不可選。

        (2)Style:控制元件物件型別。
        (3)Tag:控制元件表示(使用者定義)。
        (4)TooltipString屬性:提示資訊顯示。當滑鼠指標位於此控制元件上時,顯示提示資訊。
        (5)UserData:使用者指定資料。
        (6)Position:控制元件物件的尺寸和位置。
        (7)Units:設定控制元件的位置及大小的單位
        (8)有關字型的屬性,如 FontAngle, FontName等。


        三、控制元件回撥函式的執行
        (1)BusyAction:處理回撥函式的中斷。有兩種選項:即Cancel:取消中斷事件,queue:排隊(預設設定)。

        (2)ButtonDownFcn屬性:按鈕按下時的處理函式。
        (3)CallBack屬性:是連線程式介面整個程式系統的實質性功能的紐帶。該屬性值應該為一個可以直接求值的字串,在該物件被選中和改變時,系統將自動地對字串進行求值。
        (4)CreateFcn:在物件產生過程中執行的回撥函式。
        (5)DeleteFcn:刪除物件過程中執行的回撥函式。
        (6)Interruptible屬性:指定當前的回撥函式在執行時是否允許中斷,去執行其他的函式。


        四、控制元件當前狀態資訊
        (1)ListboxTop:在列表框中顯示的最頂層的字串的索引。
        (2)Max:最大值。
        (3)Min:最小值。
        (4)Value:控制元件的當前值。




你可以使用屬性編輯器來設定屬性


三:寫回調函式 CallBack


每個控制元件都有幾種回撥函式,右鍵選中的控制元件一般會有如下選單:



然後就可以跳轉到相應的 Editor中編輯程式碼,GUIDE會自動生成 相應的函式體,函式名,名稱一般是 控制元件 Tag+ Call型別名引數有三個 ( hObject, eventdata, handles)


其中 hObject 為發生事件的源控制元件,eventdata為事件資料結構,handles為傳入的物件控制代碼


CreateFcn 是在控制元件物件建立的時候發生(一般為初始化樣式,顏色,初始值等)
DeleteFcn 實在空間物件被清除的時候發生
ButtonDownFcn和KeyPressFcn分別為滑鼠點選和按鍵事件Callback


CallBack為一般回撥函式,因不同的控制元件而已異。例如按鈕被按下時發生,下拉框改變值時發生,sliderbar 拖動時發生等等。




四:控制代碼圖形之間的層次關係



可以建立 圖形控制代碼的常見函式


1.figure函式:建立一個新的圖形物件。
2.newplot函式:做好開始畫新圖形物件的準備。
3.axes函式:建立座標軸圖形物件。
4.line函式:畫線。
5.patch函式:填充多邊形。
6.surface函式:繪製三維曲面。
7.image函式:顯示圖片物件。
8.uicontrol函式:生成使用者控制圖形物件。
9.uimenu函式:生成圖形視窗的選單中層次選單與下一級子選單。


幾個實用的小函式:


uigetfile  選擇檔案對話方塊
uiputfile  儲存檔案對話方塊
uisetcolor  設定顏色對話方塊
fontsetcolor  設定字型對話方塊
msgbox    訊息框
warndlg    警告框
helpdlg     訊息框


不過如果要讓父視窗不可用,你需要使用uiwait來定焦於使用者對話方塊。
例如:


    h=helpdlg('Please press me!','Attention');
    uiwait(h);




四:獲取與設定物件屬性




 常用函式:


gcf函式:獲得當前圖形視窗的控制代碼
gca函式:獲得當前座標軸的控制代碼
gco函式:獲得當前物件的控制代碼
gcbo函式:獲得當前正在執行呼叫的物件的控制代碼
gcbf函式:獲取包括正在執行呼叫的物件的圖形控制代碼
delete函式:刪除控制代碼所對應的圖形物件
findobj函式:查詢具有某種屬性的圖形物件




設定方法:


(1)get函式返回某些物件屬性的當前值。例如:


p=get(obj,'Position');     


(2)函式set改變控制代碼圖形物件屬性,例如:
set(obj,'Position',vect);



例如:關閉控制元件  set(handles.listbox2,'Visible','off');
關閉視窗:


五:函式呼叫




在一個m檔案中,可以定義多個函式,但是檔名一定要與第一個函式(主函式)一致,
該檔案中其他函式則為本檔案的私有函式,外部不可訪問(可以通過引數呼叫的方法訪問,下面會描述)。


例如在一個程式中,建立一個fig後,會生成這樣一個m檔案:


function varargout =febirdfun(varargin)
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @febirdfun_OpeningFcn, ...
                   'gui_OutputFcn',  @febirdfun_OutputFcn, ...
                   'gui_LayoutFcn',  [], ...
                   'gui_Callback',   []);


if nargin && ischar(varargin{1})
   gui_State.gui_Callback = str2func(varargin{1});
end


if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end


解析 一下這個主函式:首先 gui_State是一個結構,指定了figure開啟和輸出函式,


開始 gui_CallBack為空,如果輸入引數個數不為0,接下來將輸入第一個引數傳遞給gui_State.callback。


接下來用交給 gui_mainfcn函式處理,gui_mainfcn 根據gui_State和傳入引數
來確定是執子函式,還是開啟 fig 檔案和執行 OpeningFcn和OutputFcn。


如過 gui_Callback為空,那麼就執行開啟主視窗fig檔案,否則,呼叫子函式


這個函式的作用有:
1.當輸入不帶引數的時候,能夠開啟fig檔案,並且初始化控制元件
2.當指定需要呼叫的函式名時,可以作為其他控制元件callback使用 (實則呼叫同文件中的子函式)
   例如,在某一個控制元件的 callback 裡面這樣寫:(febrdfun為主函式)
    febirdfun("@push_button_Callback",gcbf,[])
  這樣的呼叫就可以呼叫檔案裡面的子函式。


當然也可以使用其他檔案裡面的函式作為callback,不過那樣的話,資料傳遞會麻煩一些。




下面看figure Openning Function




%================================


function Main_OpeningFcn(hObject, eventdata, handles, varargin)


handles.output = hObject;
% 通常在這裡面定義自己的資料結構例如


s=struct("P1",v1...
             "P2",v2);
handles.MyStruct=s;
% 更新handles資料結構  非常重要!!
guidata(hObject, handles);


%================================
function varargout = Main_OutputFcn(hObject, eventdata, handles)
varargout{1} = handles.output;


這個函式是輸出返回值的定義


注意:  matlab 中,function 對應的 end 可以沒有,但是隨著版本的更新,end將會被要求。




六:資料傳遞






在matlab GUI程式中進行值傳遞我經常使用的兩種方法:






1.利用主函式 的 handles 資料結構傳值



例如在某一個影象視窗控制代碼 中有一個物件 handles(可以定義自己的資料結構)


那麼在一個子Callback函式中,可以通過handles傳遞資料:


function  sliderbar1_Callback(hObject,eventdata,handles)


  %%  eg1
  v1=get(hObject,'value');
  obj=handles.Text1  %直接定位 Tag 為 Text1的控制元件
  set(obj,'value',v1);
  %%  eg2
  handles.MyStruct.P1=v1; % 更改handles中的資料
  guidata(hObject,handles); %更新 handles !!重要
end




2.利用控制元件的 UserData 來傳值


每一個控制元件一般都有一個屬於自己的自定義域,userData,你可以定義這樣一個域用來儲存自己的資料,例如在定義 timer 的 TimerFcn中


t1=timer('TimerFcn',{@Timer1Fcn},'ErrorFcn',@Timer1ErrorFcn},'Period',1.0,'ExecutionMode','fixedrate');


t1.Userfata=handles.MyStruct;


這裡 Timer1Fcn的呼叫看似沒有傳入任何引數,實際上此函式的定義一定要有至少兩個引數


function Timer1Fcn(obj,eventata)


   obj.UserData=XXXXX;%可以這樣共享資料

end


當然Timer定義的時候允許這樣傳遞一個引數,當然這樣也可以進行傳值.


t1=timer('TimerFcn',{@Timer1Fcn,handles},'ErrorFcn',{@Timer1ErroFcnr,handles},'Period',1.0,'ExecutionMode','fixedrate');