第7讲 Matlab的GUI程序设计.docx
- 文档编号:11894307
- 上传时间:2023-04-08
- 格式:DOCX
- 页数:23
- 大小:128.81KB
第7讲 Matlab的GUI程序设计.docx
《第7讲 Matlab的GUI程序设计.docx》由会员分享,可在线阅读,更多相关《第7讲 Matlab的GUI程序设计.docx(23页珍藏版)》请在冰豆网上搜索。
第7讲Matlab的GUI程序设计
第七讲Matlab的GUI程序设计
一、图形对象及其句柄:
1.图形对象
MATLAB把构成图形的各个基本要素称为图形对象。
这些对象包括计算机屏幕、图形窗口(Figure)、用户菜单(Uimenu)、用户控件(Uicontrol)、坐标轴(Axes)、曲线(Line)、曲面(Surface)、文字(Text)、图像(image)、光源(Light)、区域块(Patch)和方框(Rectangle)。
系统将每一个对象按树型结构组织起来。
每个图形对象都可以被独立地操作。
(help)
2.图形对象句柄
MATLAB在创建每一个图形对象时,都为该对象分配唯一的一个值,称其为图形对象句柄(Handle)。
句柄是图形对象的唯一标识符。
MATLAB提供了3个用于获取已有图形对象句柄的函数:
gcf获取当前图形窗口句柄(getcurrentfigure)。
gca获取当前坐标轴句柄(getcurrentaxis)。
gco获取最近被单击的图形对象的句柄(getcurrentobject)。
[注]其他具体的对象句柄可利用低层绘图指令获得。
但以此3种最常用。
二、图形对象的属性:
三、
:
:
:
:
;
1.属性名与属性值
MATLAB给每种对象的每一个属性规定了一个名字,称为属性名,而属性名的取值成为属性值。
例如,LineStyle是曲线对象的一个属性名,它的值决定着线型,取值可以是'-'、':
'、'-.'、'--'或'none'。
2.属性的操作
set函数的调用格式为:
%设置属性值
set(句柄,属性名1,属性值1,属性名2,属性值2,…)
get函数的调用格式为:
%获取属性值
V=get(句柄,属性名)
三、图形对象的创建:
1.图形窗口对象
建立图形窗口对象使用figure函数。
调用该函数的命令形式为:
句柄变量=figure(属性名1,属性值1,属性名2,属性值2,…)
MATLAB为每个图形窗口提供了很多属性。
这些属性及其取值控制着图形窗口对象。
除公共属性外,其他常用属性:
MenuBar属性、Name属性、Position属性、Color属性等。
2.坐标轴对象
建立坐标轴对象使用axes函数,调用它的命令形式为:
句柄变量=axes(属性名1,属性值1,属性名2,属性值2,…)
MATLAB为每个坐标轴对象提供了很多属性。
除公共属性外,还有其他常用属性。
四、Matlab的GUI设计:
GUI(GraphicUserInterface),即图形用户界面。
1、GUI设计的原则
针对用户不同的需要,设计出的图形用户界面也各不相同。
一般而言,一个较好的界面都遵循以下三个特征:
简单性、一致性和熟悉性。
简单性
在设计界面时,应力求简洁、直接、清晰地体现出界面的功能和特征。
一些可有可无的功能应尽量删去,以保证界面的整洁。
设计的图形界面要直观,应多采用图形,而尽量避免数据。
设计的界面应尽量减少窗口的数目,力求避免在不同窗口之间进行来回切换。
一致性
一是用户自己开发的界面风格要尽量一致;二是新设计的界面要与其它已有的界面风格尽量保持一致。
用户在初次使用新界面时,总是习惯于凭经验进行试探。
例如,图形显示区通常安排在界面的左侧,按键等控制区通常放在右侧。
熟悉性
在设计新界面时,应尽量使用人们熟悉的标志和符号,设计出友好、令人舒适的用户界面。
用户可能并不了解新界面的具体含义和操作方法,但完全何以根据熟悉的标志作出正确的猜测,便于学习和使用。
除了上述对界面的静态要求外,还应要求界面的动态性。
例如,所设计的界面对于用操作的响应要迅速和连续;对持续时间较长的运算要给出等待时间提示,并允许用户中断等。
2、GUI设计的步骤
图形用户界面的制作一般包括界面设计和程序实现,对于初学者,建议按照下述步骤进行:
(1)分析界面所要求实现的主要功能,以明确设计任务;
(2)在纸上绘出界面草图,并站在使用者的角度审查草图;
(3)按照构思的草图,上机制作静态界面,并检查它;
(4)编写界面动态功能的程序,对功能进行逐项检查。
注意:
这只是一种建议,在设计中,步骤间也许要交叉或重复执行。
由于设计和实现过程往往不是一步到位的,可能需要反复修改才能获得满意的界面。
GUI包含两类基本的图形对象:
一是用户界面控件对象(Uicontrol),简称为控件对象;一是用户界面菜单对象(Uimenu),简称为菜单对象。
五、用户控件制作函数uicontrol
1、用于制作图形用户界面上的其它控件。
主要有以下10种类型:
push,按钮
radio,选择按钮
toggle,双位按钮
check,检录框
list,列表框
popup,弹出框
slide滑动条
edit可编辑文本框
text静态文本框
frame控件区域框
2、控件制作函数uicontrol的使用格式:
hc=uicontrol(hc_parant,'style','CntlName','CntlP','CntlV',…)
hc为控件句柄名
hc_parant为句柄hc的父对象句柄
CntlName为控件类型名
CntlP为句柄hc的属性名
CntlV为句柄hc的属性值
例7.1创建一个界面(图7-1)包含4种控件:
静态文本、选择开关、双位按键、控件区域框。
编写M脚本文件examGUI7_1.m,运行该文件便可得如图7-1所示的界面。
图7-1静态文本、选择开关、双位按键及控件区域框
[examGUI7_1.m]
clfreset
%以下三句对图形窗口的工具条,窗口及控件的位置和尺寸进行设置。
set(gcf,'menubar','none')
set(gcf,'unit','normalized','position',[0.2,0.2,0.64,0.32]);
set(gcf,'defaultuicontrolunits','normalized')
h_axes=axes('position',[0.05,0.2,0.6,0.6]);%设置轴
t=0:
pi/50:
2*pi;y=sin(t);plot(t,y);%画sin(t)的图形
set(h_axes,'xlim',[0,2*pi]);%设置轴上x坐标的范围
set(gcf,'defaultuicontrolhorizontal','left');%把y轴放在窗口的左边
htitle=title('正弦曲线');
set(gcf,'defaultuicontrolfontsize',12);%设置控件字体的大小
uicontrol('style','frame',...
'position',[0.67,0.55,0.25,0.25]);%设置框架控件
uicontrol('style','text',...
'string','正斜体图名:
',...
'position',[0.68,0.77,0.18,0.1],...
'horizontal','left');%设置静态文本控件
hr1=uicontrol(gcf,'style','radio',...
'string','正体',...
'position',[0.7,0.69,0.15,0.08]);%设置选择按钮控件1
set(hr1,'value',get(hr1,'Max'));
%设置hr1属性value的值='max'(选择按钮有点提示选中此项)
set(hr1,'callback',[...
'set(hr1,''value'',get(hr1,''max'')),',...
'set(hr2,''value'',get(hr2,''min'')),',...
'set(htitle,''fontangle'',''normal''),']);
%选择按钮选中时,取normal字体
hr2=uicontrol(gcf,'style','radio',...%设置选择按钮控件2
'string','斜体',...
'position',[0.7,0.58,0.15,0.08],...
'callback',[...
'set(hr1,''value'',get(hr1,''min'')),',...
'set(hr2,''value'',get(hr2,''max'')),',...
'set(htitle,''fontangle'',''italic'')']);
%选择按钮选中时,取斜字体
ht=uicontrol(gcf,'style','toggle',...%设置双位按钮,注意与单功能按钮的区别
'string','Grid',...
'position',[0.67,0.40,0.15,0.12],...
'callback','grid');
例7.2如图7-2建立数制转换对话框。
在左边输入一个十进制整数和2~16之间的数,单击“转换”按钮能在右边得到十进制数所对应的2~16进制字符串,单击“退出”按钮退出对话框。
程序如下[examGUI7_2.m]:
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','Position',[0.5,0.8,0.45,0.1],...
'Units','normalized','Horizontal','center',...
'String','输出框','Back',[0,1,1]);
uicontrol(hf,'Style','Frame','Position',[0.04,0.33,0.45,0.45],...
'Units','normalized','Back',[1,1,0]);
uicontrol(hf,'Style','Text','Position',[0.05,0.6,0.25,0.1],...
'Units','normalized','Horizontal','center',...
'String','十进制数','Back',[1,1,0]);
uicontrol(hf,'Style','Text','Position',[0.05,0.4,0.25,0.1],...
'Units','normalized','Horizontal','center',...
'String','2~16进制','Back',[1,1,0]);
he1=uicontrol(hf,'Style','Edit','Position',[0.25,0.6,0.2,0.1],...
'Units','normalized','Back',[0,1,0]);
he2=uicontrol(hf,'Style','Edit','Position',[0.25,0.4,0.2,0.1],...
'Units','normalized','Back',[0,1,0]);
uicontrol(hf,'Style','Frame','Position',[0.52,0.33,0.45,0.45],...
'Units','normalized','Back',[1,1,0]);
ht=uicontrol(hf,'Style','Text','Position',[0.6,0.5,0.3,0.1],...
'Units','normalized','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','Position',[0.18,0.1,0.2,0.12],...
'String','转换','Units','normalized','Call',COMM);
uicontrol(hf,'Style','Push','Position',[0.65,0.1,0.2,0.12],...
'String','退出','Units','normalized','Call','close(hf)');
程序调用了trdec.m函数文件,该函数的作用是将任意十进制整数转换为2~16进制字符串。
trdec.m函数文件如下:
functiondec=trdec(n,b)
ch1='0123456789ABCDEF';%十六进制的16个符号
k=1;
whilen~=0%不断除某进制基数取余直到商为0
p(k)=rem(n,b);
n=fix(n/b);
k=k+1;
end
k=k-1;
strdec='';
whilek>=1%形成某进制数的字符串
kb=p(k);
strdec=strcat(strdec,ch1(kb+1:
kb+1));
k=k-1;
end
dec=strdec;
例7.3制作一个(如图7-3所示)能绘制任意图形的交互界面。
它包括:
可编辑文本框、弹出框、列表框。
图7-3
本例的关键内容是:
1)如何使编辑框允许输入多行指令。
2)在利用M函数文件创建用户界面时,如何依靠全局变量传递控件的图柄,保证回调动作正确执行。
(1)编写M函数文件examGUI7_3.m和calledit1.m
[examGUI7_3.m]
functionexamGUI6()
globalhedithpophlist%定义全局变量
clfreset
%以下各句对图形窗口及其子对象进行设置
set(gcf,'unit','normalized','position',[0.1,0.4,0.85,0.35]);
set(gcf,'defaultuicontrolunits','normalized');
set(gcf,'defaultuicontrolfontsize',11);
set(gcf,'defaultuicontrolfontname','隶书');
set(gcf,'defaultuicontrolhorizontal','left');
set(gcf,'menubar','none');
%以下各句对图形窗口的标题进行设置
str='通过多行指令绘图的交互界面';
set(gcf,'name',str,'numbertitle','off');
%以下各句在图形窗口安置轴
h_axes=axes('position',[0.05,0.15,0.45,0.70],'visible','off');
%以下各句在图形窗口设置text对象,并在其上输出'绘图指令输入框'
uicontrol(gcf,'Style','text',...
'position',[0.52,0.87,0.26,0.1],...
'String','绘图指令输入框');
%以下各句在图形窗口设置edit对象
hedit=uicontrol(gcf,'Style','edit',...
'position',[0.52,0.05,0.26,0.8],...
'Max',2);
%以下各句在图形窗口设置popup对象(弹出式菜单)
hpop=uicontrol(gcf,'style','popup',...
'position',[0.8,0.73,0.18,0.12],...
'string','spring|summer|autumn|winter');
%以下各句在图形窗口设置list对象(列表框)
hlist=uicontrol(gcf,'Style','list',...
'position',[0.8,0.23,0.18,0.37],...
'string','Gridon|Boxon|Hiddenoff|Axisoff',...
'Max',2);
%以下各句在图形窗口设置push对象(按钮)
hpush=uicontrol(gcf,'Style','push',...
'position',[0.8,0.05,0.18,0.15],'string','Apply');
%在编辑框输入数据,按回车时调用calledit1子函数
set(hedit,'callback','calledit1');
%选中弹出式菜单时,调用calledit1子函数
set(hpop,'callback','calledit1');
%选中按钮时,调用calledit1子函数
set(hpush,'callback','calledit1');
[calledit1.m]
functioncalledit1()
globalhedithpophlist%引用已定义的全局变量
ct=get(hedit,'string');%把编辑框的字符输入到ct
vpop=get(hpop,'value');%把选中的弹出菜单的选项输入到vpop
vlist=get(hlist,'value');%把选中的弹出菜单的选项输入到vlist
if~isempty(ct)%如果ct中字符不空,则执行以下语句,否则什么都不干
eval(ct')%画函数图形
popstr={'spring','summer','autumn','winter'};
liststr={'gridon','boxon','hiddenoff','axisoff'};
invstr={'gridoff','boxoff','hiddenon','axison'};
colormap(eval(popstr{vpop}))%用列表框选中的颜色着色
vv=zeros(1,4);vv(vlist)=1;%将列表框选中的项赋值1
fork=1:
4
ifvv(k);eval(liststr{k});elseeval(invstr{k});end
end
end
(2)在MATLAB指令窗中运行examGUI7_3.m就可获得题目所要求的图形用户界面。
(3)分别在'绘图指令输入框'中输入如下两组命令,进行测试:
ezsurf('x^2*exp(-x^2-y^2)');
shadinginterp;
light;
lightinggouraud;
----
[X0,Y0,Z0]=sphere(30);
X=2*X0;Y=2*Y0;Z=2*Z0;
surf(X0,Y0,Z0);
shadinginterp;
holdon,mesh(X,Y,Z),colormap(hot),holdoff;
hiddenoff;
light;
lightingphong;
axisequal,axisoff;
六、用代码来制作GUI界面
例7.4对于传递函数为
的归一化二阶系统,制作一个能绘制该系统单位阶跃响应的图形用户界面。
本例演示:
(A)图形界面的大致生成过程;
(B)静态文本和编辑框的生成;
(C)坐标网格控制键的形成;
(D)如何使用该界面。
(1)产生图形窗和轴位框:
如图7-4所示。
图7-4产生坐标轴
clfreset
%set(0,'DefaultFigureColor','b')
H=axes('unit','normalized','position',[0,0,1,1],'visible','off');%建立轴,并取轴句柄H
set(gcf,'currentaxes',H);%在当前图形窗口上安置坐标轴H
str='\fontname{隶书}归一化二阶系统的阶跃响应曲线';
text(0.12,0.93,str,'fontsize',13);%在H上,相对于左下角的取值
h_fig=get(H,'parent');%取H的父句柄h_fig=gcf
set(h_fig,'unit','normalized','position',[0.1,0.2,0.7,0.4]);
%设置图形窗口h_fig的位置[0.1,0.2,0.7,0.4](相对于屏幕)
h_axes=axes('parent',h_fig,...
'unit','normalized','position',[0.1,0.15,0.55,0.7],...
'xlim',[015],'ylim',[01.8],'fontsize',8);
%在H窗口上指定位置画新轴
(2)在坐标框右侧生成作解释用的“静态文本”和可接收输入的“编辑框”:
如图7-5所示。
图7-5在图形界面中添加编辑框和文本框
h_text=uicontrol(h_fig,'style','text',...
'unit','normalized','position',[0.67,0.73,0.25,0.14],...
'horizontal','left','string',{'输入阻尼比系数','zeta='});
%在图形窗口(h_fig)指定位置[0.67,0.73,0.25,0.14]上生成文本标签
h_edit=uicontrol(h_fig,'style','edit',...
'unit','normalized','position',[0.67,0.59,0.25,0.14],...
'horizontal','left',...
'callback',[...
'z=str2num(get(gcbo,''string''));',...
't=0:
0.1:
15;',...
'fork=1:
length(z);',...
'y(:
k)=step(1,[12*z(k)1],t);',...
'plot(t,y(:
k));',...
'if(length(z)>1),holdon,end,',...
'end;',...
'h
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第7讲 Matlab的GUI程序设计 Matlab GUI 程序设计