當前位置:編程學習大全網 - 編程語言 - 界面模板編程

界面模板編程

在MATLAB的命令窗口中運行GUIDE命令,打開向導界面,如下圖:

然後,選擇壹個空模板(Blang

GUI),點擊確定,打開指南設計界面,如下圖:

單擊工具欄上的菜單編輯器(菜單)

編輯器),打開菜單編輯器,如下:

在菜單中

在工具欄中創建壹個名為“文件”的新菜單項。其他設置見下圖:

在文件菜單下添加菜單項:打開、保存、退出。見下圖:

如果需要在菜單項“退出”上添加分隔線,選擇“分隔符”

以上這壹項”就行了。

將我的界面另存為pjimage.fig

保存後會自動打開pjimage.m文件,我們所有的程序都會寫在這個m文件中。在編程中,鼠標的每個動作都對應壹個回調函數。我們的菜單也是。

在界面上,單擊鼠標右鍵,選擇“屬性”

檢查器”,您可以打開屬性窗口。當我們點擊不同的控件時,它們對應的屬性會顯示在這裏,我們可以修改它們。最重要的屬性是標簽屬性和字符串屬性。

設置當前圖形窗口的Tag屬性為:figure_pjimage,窗口的title (Name屬性)為:Image Processing Instance。如下所示:

然後,單擊工具欄中的保存按鈕。之後,單擊工具欄中的運行按鈕(運行

圖)。請註意,工具欄中的圖標會被提示,例如“運行”按鈕。

我們將看到以下界面:

這意味著我們的目錄被保存了。fig文件不是當前目錄,但沒關系,我們只需點擊“更改”即可

目錄"來改變當前目錄。當然,如果妳想把當前目錄添加到MATLAB路徑中,點擊“添加到”

路徑”就可以了。我建議在這裏點擊“更改”。

目錄”,因為沒有很大的必要添加到MATLAB路徑中。壹般需要添加工具箱或者我們的函數或程序完成,在MATLAB的命令窗口中找不到我們的函數時,可以將函數或程序所在的目錄添加到MATLAB路徑中。

反正點那個按鈕就看個人愛好了。無論點擊兩個按鈕中的哪壹個,程序都會正確運行。

當我們的程序運行時,它看起來像這樣:

我們可以看到文件下的菜單項和快捷鍵,但是我們沒有寫程序,所以即使點了也沒有反應。而如果不想設置快捷鍵,可以在菜單中設置。

在編輯器中設置,選擇為Ctrl+none即可,如下:

在這種情況下,沒有保存項目的快捷鍵。我們可以通過上面的按鈕“查看”來查看這個菜單項的響應功能,也就是回調功能。也可以在pjimage.m中看到比如保存的Tag屬性是m_file_save,那麽它對應的回調函數的名字就是m_file_save_Callback。諸如此類。

讓我們寫壹個函數來打開壹個菜單項。要打開壹張圖片,當然需要打開壹個對話框。在界面編程中,打開對話框的功能是uigetfile。

可以使用help uigetfile命令查看它的詳細描述。以下是打開菜單的響應函數:

功能

m_file_open_Callback(hObject,eventdata,handles)

[文件名,路徑名] =

uigetfile(...

{'*.bmp*.jpg*.png*.jpeg ','圖像文件(*。bmp,

*.jpg,*。png,*。JPEG)’;...

'*.* '所有文件

(*.*)'}, ...

挑壹個

圖片’);

保存。m文件並運行程序。點擊“文件”下的“打開”,打開如下打開對話框:

選擇文件後,程序中的文件名就是妳選擇的文件的文件名,pathname就是文件所在目錄的路徑。例如:文件名

=5.jpg,路徑名= C:\文檔和設置\管理員\我的

文檔\ .

那麽在獲取路徑後,如何讀取並顯示壹張圖片呢?讀入圖片可以使用imread函數,顯示可以在坐標軸上。然後我們需要在界面上畫壹個坐標軸。為了比較,我們畫了兩個坐標軸,壹個在加工之前,壹個在加工之後。並且加工前軸的Tag屬性改為axes_src,加工後軸的Tag屬性為axes_dst。進行更改後,保存。如下所示:

然後在原來的m_file_open_Callback程序的基礎上,增加下面的程序:

axes(handles . axes _ src);%使用axes命令將當前操作的軸設置為axes_src。

fpath =[路徑名

文件名];%將文件名和目錄名組合成壹個完整的路徑。

im show(im read(fpath));%用imread讀入圖片,用imshow顯示在axes_src上。

運行程序,通過“打開”菜單項打開壹張圖片。效果如下:

那麽如何保存壹張圖片呢?使用imwrite命令。但是imwrite命令的第壹個參數是妳讀入的圖片數據,也就是imread的返回值。在這種情況下,我們需要對m_file_open_Callback中的程序做壹點改動。把最後壹句話(imshow(imread(fpath))改成兩句話如下:img _ src = imread(fpath);imshow(img _ src);

而且,如何在保存菜單的回調函數下獲取img_src變量呢?在這裏,img_src將被用作* * *共享數據。很多接口編程的朋友喜歡用全局來聲明。我個人不喜歡,因為有更好的辦法。那就是使用setappdata和getappdata函數。我們可以在界面上為任何具有Tag屬性的空間添加應用程序數據。當然我更喜歡把這些* * *應用數據加到圖形窗口,因為這樣好記,但是如果有壹個控件就不太好記了。

在。m文件,妳會發現除了每個菜單項的回調函數之外,還有兩個函數:pjimage_OpeningFcn和pjimage_OutputFcn,相當於接口的初始化函數,而pjimage_OpeningFcn是接口的輸出函數,也就是調用。m文件而不是運行fig。

因此,我們需要在pjimage _ OpeningFcn中添加以下程序,以* * *享受這個img_src矩陣。代碼如下:

setappdata(handles . figure _ pj image,' img_src ',0);

然後,在m_file_open_Callback函數的末尾編寫以下程序:

setappdata(handles . figure _ pj image,' img_src ',img _ src);

然後,我們可以像這樣在m_file_save_Callback函數中提取img_src,如下:

img _ src = getappdata(handles . figure _ pj image,' img _ src ');

那麽保存的時候,自然會用到保存對話框。要使用保存對話框,您需要使用uiputfile函數。有關詳細信息,請使用幫助。

Uiputfile視圖。

然後,將程序保存在菜單項(m_file_save_Callback)下,如下所示:

[文件名,

路徑名] = uiputfile({'*。bmp ',' BMP文件';'*.jpg',' JPG文件' },'選擇壹個

圖片’);

if isequal(文件名,0) || isequal(路徑名,0)

返回;%如果您單擊“取消”

其他

fpath =完整文件(路徑名,

文件名);另壹種獲得完整路徑%的方法。

結束

img _ src = getappdata(handles . figure _ pj image,' img _ src ');%獲取打開圖片的數據。

imwrite(img_src,fpath);%保存圖片

下面是退出菜單項的程序。退出界面,用關閉功能就可以了,但是壹般都會有提示。比如妳已經對圖片進行了處理而沒有保存,那麽在關閉的時候要給出提示,詢問是否保存。不過,這裏先不做這個工作,以後需要的時候再寫。因此,此處退出菜單項的過程只有壹句話,如下所示:

close(handles . figure _ pj image);

其實也可以使用刪除函數,即:delete(handles . figure _ pj image);看妳心情了。

但是當妳運行程序的時候,妳會發現如果妳在打開圖片的時候點擊“取消”按鈕,MATLAB的命令窗口會彈出壹個錯誤,因為我們沒有處理取消。下面我們來處理這個問題,只要把m_file_open_Callback下面的程序改成下面的程序:

[文件名,

路徑名] = uigetfile(...

{'*.bmp*.jpg*.png*.jpeg ','圖像文件

(*.bmp,*。jpg,*。png,*。JPEG)’;...

'*.* '所有文件

(*.*)'}, ...

挑選壹個圖像’);

if isequal(filename,0) ||

isequal(路徑名,0),

返回;

結束

axes(handles . axes _ src);

fpath =[路徑名

文件名];

img _ src = im read(fpath);

imshow(img _ src);

setappdata(handles . figure _ pj image,' img_src ',img _ src);

我們來做壹個圖像二值化的圖像處理。如上添加壹個“圖像處理”菜單,如下所示:

在其下方添加“圖像二值化”菜單項,如下:

然後,單擊確定關閉菜單編輯器並保存整個界面。如果我們的。m文件,我們可以點擊上圖中的“查看”按鈕生成壹個回調函數。圖像二值化是有閾值的,所以我們可以創建壹個新的界面,在這個界面上放壹個滑塊來設置圖像二值化的閾值。同時,有壹個文本顯示當前滑塊的值。然後讓我們創建壹個新的空白界面,並在上面畫壹個靜態。

文本和滑塊控件,然後使用工具欄對齊工具(對齊

對象),到兩個空格。如下所示:

然後,將這個接口保存為im2bw_args.fig整個設計如下:

您可以設置靜態。

Text的FontSize屬性是10,所以字體會比較大。設置靜態

文本的Tag屬性為txt_display,滾動條的Tag屬性設置為slider_val。為了能夠在滾動條上滾動,靜態

文本顯示滾動條的值。妳需要在滾動條的回調中編寫下面的程序。您可以右鍵單擊滾動條並選擇“查看”

“回調”下的“回調”直接進入滾動條的回調函數(slider_val_Callback)。

val=get(hObject,' Value ');

set(handles.txt_display,' String ',num2 str(val));

保存,運行程序,可以滑動滾動條,靜態

文本將顯示相應的值。雙擊figure打開figure的屬性窗口(底部帶方框的窗口),將其Tag屬性設置為“figure_im2bw”,將其Name屬性設置為“設置圖像二值化閾值”。然後,保存界面。在運行時,如下所示:

然後,我們想到的是,當滑塊滑動時,pjimage中的axes_dst坐標軸上會顯示二值圖像. fig那麽我們該怎麽辦呢?首先,當妳在PJI圖像中點擊“圖像處理”下的“圖像二值化”時。FIG菜單,im2bw_args.fig將被打開。這就是我們調用im2bw_args.m的時候了,調用的時候我們會返回壹個句柄,這個句柄指向打開的im2bw_args.fig,更多細節可以參考im2bw_args.m文件前面的註釋,內容是:

%

H = IM2BW_ARGS返回句柄到壹個新的IM2BW_ARGS或句柄到

% the

現存的

單例*。

也就是說我們可以如上圖打開im2bw_args.fig。所以在“圖像二值化”(m_image_2bw_Callback)的回調函數下,寫下面的程序:

h = im2bw _ args

然後,保存pjimage.fig還有,最好將im2bw_args.fig和pjimage.fig保存在壹個目錄下。然後運行pjimage.fig,可以看到點擊“圖像二值化”會打開im2bw_args.fig,滑塊滑動時也會顯示響應值。

先說滑塊滑動時如何顯示滑動二值圖像到pjimage的axes_dst坐標軸。

首先我們需要獲取pjimage的figure的句柄,可以通過findobj函數來完成,然後用guihandles把返回值轉換成壹個句柄。之後就可以用這個轉換後的句柄來引用pjimage.fig中的任何控件了因此,我們在im2bw_args.fig下的slider的回調函數中添加了以下函數:

h _ pj image = getappdata(handles . figure _ im2bw,' h _ pj image ');

axes(h _ pj image . axes _ dst);

img _ src = getappdata(h _ pj image . figure _ pj image,' img _ src ');

bw=im2bw(img_src,val);

im show(bw);

然後,在im2bw_args_OpeningFcn中添加以下內容:

h_pjimage=findobj('Tag ',' figure _ pj image ');

h _ pj image = GUI handles(h _ pj image);

setappdata(handles . figure _ im2bw,' h_pjimage ',h _ pj image);

然後,保存並運行。效果如下:

但是,如果我們在不打開圖片的情況下點擊“圖像二值化”,會發生什麽情況呢?妳可以看到顯示的圖像是全黑的,完全沒有意義。因此,當“打開”菜單項未被點擊時,我們可以使“圖像處理”菜單不可用。

然後在pjimage.m的OpeningFcn中,添加以下程序:

set(handles.m_image,' Enable ',' off ');

在Open菜單項的回調函數的末尾,添加以下程序:

set(handles.m_image,' Enable ',' on ');

在這種情況下,只要不點擊“打開”,就不能使用“圖像處理”菜單中的命令。效果如下:

點擊“打開”就可以使用了。

接下來說前面的問題,就是問要不要保存圖片。首先我們需要設置兩個標誌:壹個是圖片是否被處理過,壹個是圖片是否被保存過。然後我們在pjimage_OpeningFcn中添加以下兩個應用程序數據。

setappdata(handles . figure _ pj image,' bSave ',false);

setappdata(handles . figure _ pj image,' bChanged ',false);

然後在“圖像二值化”菜單項的回調函數中,將bChanged的值改為true,即添加以下程序:

setappdata(handles . figure _ pj image,' bChanged ',true);

因為我們要將圖像保存在axis axes_dst中,而“文件”下的“保存”實質上是將圖像保存在axis axes_src中,那麽應該怎麽做呢?我們必須添加另壹個“保存”菜單項。這壹次,我們向axis axes_dst添加了壹個右鍵菜單。

打開工具欄中的菜單編輯器,並選擇上下文。

菜單(上下文菜單),如下所示:

然後,創建新的上下文。

菜單,其標簽屬性為axes_dst_menu,如下所示:

然後給它添加壹個菜單項:Save,它的Tag屬性是axes_dst_menu_save,如上圖。然後,右鍵單擊axis axes_dst並選擇“屬性”

督察.將軸的UIContextMenu屬性更改為axes_dst_menu。

如下圖所示:

然後,保存並運行。右鍵單擊axes_dst,您將看到“保存”菜單。我們來寫壹下它的功能。

[文件名,路徑名] =

uiputfile({'*。bmp ',' BMP文件';'*.jpg'、' JPG文件' }、'選擇壹個圖像');

如果

isequal(文件名,0) || isequal(路徑名,0)

返回;

其他

fpath =完整文件(路徑名,

文件名);

結束

img _ dst = getimage(handles . axes _ dst);

imwrite(img_dst,fpath);

setappdata(handles . figure _ pj image,' bSave ',true);

但是妳會發現在看圖之前右擊axes_dst是有菜單的。壹旦二進制化,當妳再次右擊時就沒有菜單了。

但是,當我們在figure窗口的UIContextMenu中添加右鍵菜單axes_dst_menu(這裏沒有控件,雙擊打開figure的屬性窗口)時,上述問題就不會發生,壹切都會正常運行。因為,在添加到axes_dst時,壹旦軸的內容發生變化,右鍵菜單就會附加到父對象上。因此,如果需要在坐標軸上顯示右鍵菜單,將通過程序創建。如何創造,先不說。先說壹下保存axis axes_dst,退出程序時該怎麽做。

將原來的m_file_exit_Callback改為下面的程序:

b changed = getappdata(handles . figure _ pj image,' b changed ');%找零?

b save = getappdata(handles . figure _ pj image,' b save ');%獲取保存?

如果

bChanged = = true & amp& ampBSave==false,%已更改但未保存。

BtnName=questdlg('您已經更改了圖片,但沒有保存。妳想保存它嗎?、'提示'、'保存'、'不保存'、'保存');%使用問題對話框

切換btnName,

案例“保存”,%執行axes_dst_menu_save_Callback的功能。

Fe val(@ axes _ dst _ menu _ save _ Callback,handles.axes_dst_menu_save,eventdata,handles);

案例“不保存”,%什麽都不做。

結束

結束

h=findobj('Tag ',' figure _ im2bw ');%確定是否打開設置圖像二值化參數的窗口。

如果

~isempty(h),%如果找到,關閉它。

關閉(h);

結束

close(findobj('Tag ',' figure _ pj image ');%關閉主窗口

讓我們為程序添加壹個工具欄。單擊工具欄上的工具欄。

編輯器,打開以下內容:

選擇“預定義”

在“工具”下打開,點擊“添加”。再次選擇“保存”並點擊“添加”。並將“打開”按鈕的標簽屬性更改為“TBL _打開”,將“保存”按鈕的標簽屬性更改為“TBL _打開,保存”,如下所示:

點擊“查看”找到打開按鈕的回調,並在其下調用菜單中打開菜單項的回調,需要在打開按鈕的回調下編寫以下程序:

feval(@m_file_open_Callback,handles.m_file_open,eventdata,handles);

同理,找到保存按鈕的回調,在它下面編寫保存程序,但是我們需要判斷是否是第壹次保存,如果是,使用保存對話框;如果沒有,我們可以直接保存在第壹個保存的路徑中。然後,我們還需要設置幾個應用數據。第壹個是記錄是否第壹次保存,第二個是記錄第壹次保存的路徑。在這種情況下,我們在pjimage_OpeningFcn中添加以下代碼:

setappdata(handles . figure _ pj image,' fstSave ',true);

setappdata(handles . figure _ pj image,' fstPath ',0);

然後,在Save按鈕回調下,寫下下面的程序:

FST save = getappdata(handles . figure _ pj image,' FST save ');

if(fstSave==true)

[文件名,路徑名] = uiputfile({'*。bmp ',' BMP文件';'*.jpg',‘JPG檔案’},

挑選壹個圖像’);

if isequal(filename,0) ||

isequal(路徑名,0)

返回;

其他

fpath=fullfile(路徑名,文件名);

結束

img _ dst = getimage(handles . axes _ dst);

imwrite(img_dst,fpath);

setappdata(handles . figure _ pj image,' fstPath ',fpath);

setappdata(handles . figure _ pj image,' bSave ',true);

setappdata(handles . figure _ pj image,' fstSave ',false);

其他

img _ dst = getimage(handles . axes _ dst);

fpath = getappdata(handles . figure _ pj image,' FST path ');

imwrite(img_dst,fpath);

結束

而且我們還需要文件下的“保存”按鈕和工具欄中的“保存”按鈕在打開圖片之前是不可用的,只有在點擊文件下的“打開”或者工具欄下的“打開”時才可用。然後需要在pjimage_OpeningFcn中添加以下代碼:

set(handles.tbl_save,' Enable ',' off ');

set(handles.m_file_save,' Enable ',' off ');

並在m_file_open_Callback下,添加以下代碼:

set(handles.tbl_save,' Enable ',' on ');

set(handles.m_file_save,' Enable ',' on ');

這麽壹個小程序就完了。

如果妳能按照上面的步驟完成這個小程序,那麽妳就掌握了界面編程中的問題。

  • 上一篇:急求教大哥大姐們基於51單片機的數字溫度計設計
  • 下一篇:新方碼輸入法是誰編程編出來的?
  • copyright 2024編程學習大全網