第08章_MATLAB图形用户界面设计_例题源程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第8章MATLAB图形用户界面设计
例8.1建立图8.1所示的图形演示系统菜单。
菜单条中含有3个菜单项:Plot、Option 和Quit。
Plot中有Sine Wave和Cosine Wave两个子菜单项,分别控制在本图形窗口画出正弦和余弦曲线。
Option菜单项的内容如图8.1所示,其中Grid on和Grid off控制给坐标轴加网格线,Box on和Box off控制给坐标轴加边框,而且这4项只有在画有曲线时才是可选的。
Window Color控制图形窗口背景颜色。
Quit控制是否退出系统。
screen=get(0,'ScreenSize');
W=screen(3);H=screen(4);
figure('Color',[1,1,1],'Position',[0.2*H,0.2*H,0.5*W,0.3*H],...
'Name','图形演示系统','NumberTitle','off','MenuBar','none');
%定义Plot菜单项
hplot=uimenu(gcf,'Label','&Plot');
uimenu(hplot,'Label','Sine Wave','Call',...
['t=-pi:pi/20:pi;','plot(t,sin(t));',...
'set(hgon,''Enable'',''on'');',...
'set(hgoff,''Enable'',''on'');',...
'set(hbon,''Enable'',''on'');',...
'set(hboff,''Enable'',''on'');']);
uimenu(hplot,'Label','Cosine Wave','Call',...
['t=-pi:pi/20:pi;','plot(t,cos(t));',...
'set(hgon,''Enable'',''on'');',...
'set(hgoff,''Enable'',''on'');',...
'set(hbon,''Enable'',''on'');',...
'set(hboff,''Enable'',''on'');']);
%定义Option菜单项
hoption=uimenu(gcf,'Label','&Option');
hgon=uimenu(hoption,'Label','&Grid on',...
'Call','grid on','Enable','off');
hgoff=uimenu(hoption,'Label','&Grid off',...
'Call','grid off','Enable','off');
hbon=uimenu(hoption,'Label','&Box on',...
'separator','on','Call','box on','Enable','off');
hboff=uimenu(hoption,'Label','&Box off',...
'Call','box off','Enable','off');
hwincor=uimenu(hoption,'Label','&Window Color','Separator','on');
uimenu(hwincor,'Label','&Red','Accelerator','r',...
'Call','set(gcf,''Color'',''r'');');
uimenu(hwincor,'Label','&Blue','Accelerator','b',...
'Call','set(gcf,''Color'',''b'');');
uimenu(hwincor,'Label','&Yellow','Call',...
'set(gcf,''Color'',''y'');');
uimenu(hwincor,'Label','&White','Call',...
'set(gcf,''Color'',''w'');');
%定义Quit菜单项
uimenu(gcf,'Label','&Quit','Call','close(gcf)');
例8.2绘制曲线y=2e-0.5x sin(2πx),并建立一个与之相联系的快捷菜单,用以控制曲线的线型和曲线宽度。
x=0:pi/100:2*pi;
y=2*exp(-0.5*x).*sin(2*pi*x);
hl=plot(x,y);
hc=uicontextmenu; %建立快捷菜单
hls=uimenu(hc,'Label','线型'); %建立菜单项
hlw=uimenu(hc,'Label','线宽');
uimenu(hls,'Label','虚线','Call','set(hl,''LineStyle'','':'');');
uimenu(hls,'Label','实线','Call','set(hl,''LineStyle'',''-'');');
uimenu(hlw,'Label','加宽','Call','set(hl,''LineWidth'',2);');
uimenu(hlw,'Label','变细','Call','set(hl,''LineWidth'',0.5);');
set(hl,'UIContextMenu',hc); %将该快捷菜单和曲线对象联系起来
例8.3建立如图8.10所示的数制转换对话框。
在左边输入一个十进制整数和2~16之间的数,单击“转换”按钮能在右边得到十进制数所对应的2~16进制字符串,单击“退出”按钮退出对话框。
hf=figure('Color',[0,1,1],'Position',[100,200,400,200],...
'Name','数制转换','NumberTitle','off','MenuBar','none');
uicontrol(hf,'Style','Text', 'Units','normalized',...
'Position',[0.05,0.8,0.45,0.1],'Horizontal','center',...
'String','输入框','Back',[0,1,1]);
uicontrol(hf,'Style','Text','Units','normalized',...
'Position',[0.5,0.8,0.45,0.1],'Horizontal','center',...
'String','输出框','Back',[0,1,1]);
uicontrol(hf,'Style','Frame','Units','normalized',...
'Position',[0.04,0.33,0.45,0.45],'Back',[1,1,0]);
uicontrol(hf,'Style','Text','Units','normalized',...
'Position',[0.05,0.6,0.25,0.1],'Horizontal','center',...
'String','十进制数','Back',[1,1,0]);
uicontrol(hf,'Style','Text','Units','normalized',...
'Position',[0.05,0.4,0.25,0.1],'Horizontal','center',...
'String','2~16进制','Back',[1,1,0]);
he1=uicontrol(hf,'Style','Edit','Units','normalized',...
'Position',[0.25,0.6,0.2,0.1],'Back',[0,1,0]);
he2=uicontrol(hf,'Style','Edit','Units','normalized',...
'Position',[0.25,0.4,0.2,0.1],'Back',[0,1,0]);
uicontrol(hf,'Style','Frame','Units','normalized',...
'Position',[0.52,0.33,0.45,0.45],'Back',[1,1,0]);
ht=uicontrol(hf,'Style','Text','Units','normalized',...
'Position',[0.6,0.5,0.3,0.1],'Horizontal','center',...
'Back',[0,1,0]);
COMM=['n=str2num(get(he1,''String''));',...
'b=str2num(get(he2,''String''));',...
'dec=trdec(n,b);','set(ht,''string'',dec);'];
uicontrol(hf,'Style','Push','Units','normalized',...
'Position',[0.18,0.1,0.2,0.12],'String','转换','Call',COMM);
uicontrol(hf,'Style','Push', 'Units','normalized',...
'Position',[0.65,0.1,0.2,0.12],...
'String','退出', 'Call','close(hf)');
程序调用了trdec.m函数文件,该函数的作用是将任意十进制整数转换为2~16进制字
符串。
trdec.m函数文件如下:
function dec=trdec(n,b)
ch1='0123456789ABCDEF'; %十六进制的16个符号
k=1;
while n~=0 %不断除某进制基数取余直到商为0
p(k)=rem(n,b);
n=fix(n/b);
k=k+1;
end
k=k-1;
strdec='';
while k>=1 %形成某进制数的字符串
kb=p(k);
strdec=strcat(strdec,ch1(kb+1:kb+1));
k=k-1;
end
dec=strdec;
例8.4建立如图8.11所示的图形演示对话框。
在编辑框输入绘图命令,当单击“绘图”按钮时,能在左边坐标轴绘制所对应的图形,弹出框提供色图控制,列表框提供坐标网格线和坐标边框控制。
clf;
set(gcf,'Unit','normalized','Position',[0.2,0.3,0.55,0.36]);
set(gcf,'Menubar','none','Name','图形演示','NumberTitle','off');
axes('Position',[0.05,0.15,0.55,0.7]);
uicontrol(gcf,'Style','text', 'Unit','normalized',...
'Posi',[0.63,0.85,0.2,0.1],'String',...
'输入绘图命令','Horizontal','center');
hedit=uicontrol(gcf,'Style','edit','Unit','normalized',...
'Posi',[0.63,0.15,0.2,0.68],...
'Max',2); %Max取2,使Max-Min>1,从而允许多行输入hpopup=uicontrol(gcf,'Style','popup','Unit','normalized',...
'Posi',[0.85,0.8,0.15,0.15],'String',...
'Spring|Summer|Autumn|Winter','Call',...
'COMM(hedit,hpopup,hlist)');
hlist=uicontrol(gcf,'Style','list','Unit','normalized',...
'Posi',[0.85,0.55,0.15,0.25],'String',...
'Grid on|Grid off|Box on|Box off','Call',...
'COMM(hedit,hpopup,hlist)');
hpush1=uicontrol(gcf,'Style','push','Unit','normalized',...
'Posi',[0.85,0.35,0.15,0.15],'String',...
'绘图','Call','COMM(hedit,hpopup,hlist)');
uicontrol(gcf,'Style','push','Unit','normalized',...
'Posi',[0.85,0.15,0.15,0.15],'String',...
'关闭','Call','close all');
COMM.m函数文件:
function COMM(hedit,hpopup,hlist)
com=get(hedit,'String');
n1=get(hpopup,'Value');
n2=get(hlist,'Value');
if ~isempty(com) %编辑框输入非空时
eval(com'); %执行从编辑框输入的命令
chpop={'spring','summer','autumn','winter'};
chlist={'grid on','grid off','box on','box off'};
colormap(eval(chpop{n1}));
eval(chlist{n2});
end
例8.5利用GUI设计工具设计图8.18所示的用户界面。
该界面包括一个用于显示图形的轴对象,显示的图形包括表面图、网格图或等高线图。
绘制图形的功能通过3个命令按钮来实现,用户通过单击相应的按钮,即可绘制相应图形。
绘制图形所需要的数据通过一个弹出框来选取。
在弹出框中包括3个选项,分别对应MATLAB的数据函数peaks、membrane(该函数产生MATLAB标志)和用户自定义的绘图数据sinc,用户可以通过选择相应的选项来载入相应的绘图数据。
在图形窗口默认的菜单条上添加一个菜单项Select,Select下又有两个子菜单项Yellow和Red,选中Yellow项时,图形窗口将变成黄色,选中Red项时,图形窗口将变成红色。
操作步骤如下:
(1) 打开GUI设计窗口,添加有关控件对象。
在MATLAB命令窗口输入命令guide,将打开GUI设计窗口。
单击GUI设计窗口控件工具栏中的Axes按钮,并在图形窗口中拖出一个矩形框,调整好大小和位置。
再添加3个按钮、一个弹出框和一个静态文本框,并调整好大小和位置。
必要时可利用位置调整工具将图形对象对齐。
(2) 利用属性编辑器,设置图形对象的属性。
打开属性编辑器,当用户在界面设计中选择一个对象后,在属性编辑器将列出该对象的属性及默认的属性值。
利用属性编辑器把3个按钮的Position属性的第3和第4个分量设为相同的值,以使3个按钮宽和高都相等。
3个按钮的String属性分别是说明文字Mesh、Surf和Contour3,FontSize属性设为10。
双击弹出框,打开该对象的属性设置对话框。
为了设置弹出框的String属性,单击String属性名后面的图标,然后在打开的文本编辑器中输入3个选项:peaks、membrane、sinc。
注意,每行输入一个选项。
将静态文本框的String属性设置为Choose Data of Graphics。
(3) 编写代码,实现控件功能。
为了实现控件的功能,需要编写相应的程序代码。
如果实现代码较为简单,可以直接修改控件的Callback属性。
对于较为复杂的程序代码,最好还是编写M文件。
右键单击任一图形对象,在弹出的快捷菜单中选择View Callbacks,再选Callback子菜单,将自动打开一个M文件,这时可以在各控件的回调函数区输入相应的程序代码。
本例需要添加的代码如下(注释部分和函数引导行是系统M文件中已有的):在打开的函数文件中,添加用于创建绘图数据的代码:
function ex8_5_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject handle to figure
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% varargin command line arguments to ex8_5 (see VARARGIN)
handles.peaks=peaks(35);
handles.membrane=membrane(5); % membrane函数产生MATLAB标志
[x,y]=meshgrid(-8:0.5:8);
r=sqrt(x.^2+y.^2);
sinc=sin(r)./(r+eps);
handles.sinc=sinc;
handles.current_data=handles.peaks;
为弹出式菜单编写响应函数代码如下:
% --- Executes on selection change in popupmenu1.
function popupmenu1_Callback(hObject, eventdata, handles)
% hObject handle to popupmenu1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
val=get(hObject,'Value')
str=get(hObject,'String');
switch str{val}
case 'peaks'
handles.current_data=handles.peaks;
case 'membrane'
handles.current_data=handles.membrane;
case 'sinc'
handles.current_data=handles.sinc;
end
guidata(hObject,handles)
% Hints: contents = get(hObject,'String') returns popupmenu1 contents as cell array
% contents{get(hObject,'Value')} returns selected item from popupmenu1 为Mesh按钮编写响应函数代码如下:
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA)
mesh(handles.current_data)
为Surf按钮编写响应函数代码如下:
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton2 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
surf(handles.current_data)
为Contour3按钮编写响应函数代码如下:
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject handle to pushbutton3 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
contour3(handles.current_data)
可以看出,每个控件对象都有一个由function语句引导的函数,用户可以在相应的函数下添加程序代码来完成指定的任务。
在运行图形用户界面文件时,如果单击其中的某个对象,则在MATLAB机制下自动调用该函数。