完整版matlab电子教案9.docx
《完整版matlab电子教案9.docx》由会员分享,可在线阅读,更多相关《完整版matlab电子教案9.docx(17页珍藏版)》请在冰豆网上搜索。
完整版matlab电子教案9
4.3用户界面控制对象(Uicontrol)
除了菜单外,控制对象是另一种实现用户与计算机交互的主要手段。
用户界面控制对象(Uicontrol)是这样一类图形界面对象:
用户用鼠标在控制对象上进行操作,单击鼠标时,将会使应用程序作出响应,并执行某些预定的功能子程序(Callback)。
控制对象的结果是可见的,又是可以改变应用程序的初始状态。
4.3.1控制对象的创建
和创建菜单对象类似,同样有两种方式用于创建控制对象:
一是基于函数命令行的编程方式;二是基于GUI的方式。
(1)基于函数命令行的编程方式
使用控制对象函数uicontrol是创建控制对象的基本方法,函数的调用格式为:
h=uicontrol('PropertyName1',value1,'PropertyName2',value2,…)
在当前图形窗口创建一个用户界面控制对象,并返回一个句柄值。
h=uicontrol(hfig,…)
在特定的图形窗口创建一个用户界面控制对象。
其中,h为待制作的用户界面控制对象的句柄,hfig为其父对象句柄,当hfig缺省时,系统将在当前图形界面上添加用户界面控制对象。
(2)基于GUI的方式
如图4.2,打开GUI设计工具集窗口,窗口的左侧便是各种类型的控制对象按钮栏。
单击要添加的控制对象按钮,在图形窗口中拖动鼠标“画出”所需要的位置和大小即可。
4.3.2控制对象的类型和属性
MATLAB提供了11种控制对象,每一种控制对象对应于不同的特定目的。
下面介绍这些控制对象的特征和实现的功能。
●坐标轴(Axis):
设置坐标轴控制对象。
●框架(Frame)——该组件为一封闭的、可见的、图形窗口区域。
框架能使一用户图形界面中相关的控制组件能容易理解。
框架没有相关的回调程序。
只有控制组件能在框架中显示。
框架不是透明的,因此用户定义的组件先后顺序决定了组件是否被框架遮住或可见。
属性Stackingorder决定了控制组件的显示顺序:
第一个定义的组件最先显示,后面定义的控制组件则覆盖已经存在的组件。
若用户要用一框架包围一些组件,则必须第一个定义框架。
●校验框(check)——当单击检验框时,会执行一操作。
该组件对于提供用户多个独立的选择是很有用的。
要激活一校验框,只需用鼠标单击该组件即可,且选中的状态在组件上显示出来。
●可编辑文本框(edit)——允许用户输入与修改文本文字的区域。
当用户想把文字作为输入时,可使用该组件。
若一可编辑文本框有焦点,则单击文本框的菜单栏不会执行任何操作。
因此,在单击菜单条后,语句get(edit_handle,’String’)并没有返回当前编辑框中的内容。
因为系统必须执行回调函数来改变属性string的值,即使屏幕上显示的文字已经改变。
●列表框(list)——显示一些项目的列表(用命令string设置),且允许用户选择一个或多个项目。
属性Min与Max控制着选择的模式。
属性Value显示可选择的项目与包含着字符串列表中项目的索引;对于选择了多个项目则用向量表示。
在任何的能改变属性Value值的、鼠标松开的操作之后,系统MATLAB将马上执行列表框的回调函数。
因此,用户有必要增加一“Done”按钮,用于推迟当要多次选择项目时的操作。
在执行列表框回调函数Callback属性之前,列表框中项目的选择有单击或双击之分,对应于将图形窗口属性SelectionType设置为normal或open。
●弹出菜单(popup)——当组件被按下时,打开且显示一选择列表(用命令string设置)。
当没有打开时,该组件显示当前的选择项。
该组件对于用户想给其他用户提供一系列的互斥的选择项,又不想占用太多的区域。
●普通按钮(push)——当该组件被按下时,将执行一操作。
要激活一按钮,只需在按钮上按下鼠标按钮。
●单选按钮(radio)——该组件与校验框相类似,但它包含几个互斥的、而且相关的选项(例如在任意时刻,只能选择一个状态)。
要激活某一单选按钮,只需在该组件上按下鼠标即可。
被选中的组件同时显示出来。
●滑块(slide)——该组件允许用户通过移动某一范围之内的滑块来输入一指定的数值。
用户要移动一滑块,只需在滑块上按下鼠标不放,且在滑块方向上移动;或者是在滑槽内单击鼠标;或者是单击滑块条上的箭头。
当松开鼠标后,滑块所在位置将与一数值对应。
用户可以设置滑块的最大值、最小值与当前值等。
●静态文本框(text)——显示文本行。
静态文本经常作为其他控制对象标签,以提供其他用户相关信息,或者是显示一滑块的数值。
其他用户不能交互地改变静态文本,因此对于静态文本,没有相关的回调函数。
●触发按钮(toggle)——当该组件被单击且显示出它们的状态(on或者off)时,控制是否执行回调函数。
用法handle=uicontrol(parent)在父对象parent上生成一用户图形控制界面。
用户界面控制对象都是图形窗口的子对象,所以当窗口中没有坐标轴时,同样可以放置控制组件于图形窗口中。
handle=uicontrol(…,'PropertyName',PropertyValue,…)参量PropertyName为属性名,参量PropertyValue可为结构数组或者为单元数组,同时随意地返回刚生成的对象的句柄。
当然用户可以通过命令set与get来设置与询问生成对象的属性值。
表4.4列出了用于命令uicontrol对象的属性名。
每一属性名当作一描述该属性的链接。
表4.4
属性名
属性名含义
属性值
控制控件类型与显示
BackgroundColor
对象的背景颜色
有效值:
ColorSpec
缺省值:
与系统有关
Cdata
显示于对象之上的真颜色图片
有效值:
矩阵
ForegroundColor
文本字体的颜色
有效值:
ColorSpec
缺省值:
[000](黑色)
SelectionHighlight
当对象被选中时突出显示
有效值:
on、off
缺省值:
on
String
用户控制界面的标签,也是列表框与弹出菜单中的项目
有效值:
任意有效的字符串
Visible
用户界面控制是否可见
有效值:
on、off
缺省值:
on
关于控件对象的一般信息
Children
用户界面控制界面没有子对象
Enable
用户界面控制是否可用
有效值:
on、inactive、off
缺省值:
on
Parent
用户界面控制对象的父对象
有效值:
图形窗口标量句柄
Selected
对象是否为选中状态
有效值:
on、off
缺省值:
off
SliderStep
滑块步长尺度
有效值:
二维向量
缺省值:
[0.0010.1]
Style
用户界面控制对象的类型
有效值:
pushbutton、edit、text、togglebutton、slider、radiobutton、popupmenu、listbox、frame
缺省值:
pushbutton
Tag
由用户指定的对象的标记符
有效值:
任意有效字符串
TooltipString
对象的工具提示
有效值:
任意有效字符串
Type
图形对象的类型
有效值:
字符串(只读)
缺省值:
uicontrol
UserData
用户指定的数据
有效值:
矩阵
控制控件对象的位置
Position
用户界面控制对象的大小与位置
有效值:
位置矩形
缺省值:
[20206020]
Units
解释属性position向量的单位
有效值:
pixels、character、normalized、points、centimeters
缺省值:
pixels
控制字体与标签
FontAngle
字符的倾斜度
有效值:
normal、italic、oblique
缺省值:
normal
FontName
字体系列名称
有效值:
字符串
缺省值:
与系统有关
FontSize
字体大小
有效值:
一标量
缺省值:
与系统有关
FontUnits
字体大小单位
有效值:
pixels、normalized、inches、centimeters、points
缺省值:
points
FontWeight
文本字体的磅值
有效值:
light、normal、demi、bold
缺省值:
normal
HorizontalAlignment
标签字符串的对齐方式
有效值:
left、center、left
缺省值:
决定于用户界面控制的对象
String
用户控制界面的标签,也是列表框与弹出菜单中的项目
有效值:
字符串
控制回调函数的执行
BusyAction
回调函数中断方式
有效值:
cancel、queue
缺省值:
queue
ButtonDownFcn
当按钮按下时执行的回调函数
有效值:
字符串
Callback
控制操作
有效值:
字符串
CreateFcn
在对象生成过程中执行的回调函数
有效值:
字符串
DeleteFcn
在对象删除过程中执行的回调函数
有效值:
字符串
Interruptible
回调函数中断的模式
有效值:
on、off
缺省值:
on
UIContextMenu
与界面控制中的对象相关的菜单(如按下鼠标右键)
有效值:
句柄
关于当前状态的一般信息
ListboxTop
第一个显示于列表框中的项目的索引
有效值:
标量
缺省值:
[1]
Max
最大值(与用户界面控制对象有关)
有效值:
标量
缺省值:
与系统有关
Min
最小值(与用户界面控制对象有关)
有效值:
标量
缺省值:
与系统有关
Value
用户界面控制对象的当前值
有效值:
标量或向量
缺省值:
与系统有关
控制组件的访问
HandleVisibility
句柄是否可从命令窗口中与GUIs中访问
有效值:
on、callback、off
缺省值:
on
HitTest
组件是否可由鼠标单击选中
有效值:
on、off
缺省值:
on
例4.3-1创建一个界面(图4-11)包含4种控件:
静态文本、选择开关、双位按键、控件区域框。
编写M脚本文件examGUI4.m,运行该文件便可得如图4-11所示的界面。
图1-11静态文本、选择开关、双位按键及控件区域框
[examGUI4.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');
例4.3-2概率密度函数作图:
[glht_gui.m]
clfreset
%以下三句对图形窗口的工具条,窗口及控件的位置和尺寸进行设置。
set(gcf,'menubar','none','NumberTitle','off')
set(gcf,'name','概率密度函数作图')
set(gcf,'unit','normalized','position',[0.3,0.3,0.5,0.5]);
set(gcf,'defaultuicontrolunits','normalized')
h_axes=axes('position',[0.1,0.2,0.6,0.6]);%设置轴
set(gcf,'defaultuicontrolhorizontal','left');%把y轴放在窗口的左边
set(gcf,'defaultuicontrolfontsize',12);%设置控件字体的大小
hp1=uicontrol(gcf,'style','push',...%设置按钮
'string','二项分布',...
'position',[0.75,0.70,0.2,0.1],...
'callback','glht1');
[glht1.m]
x=0:
10;
y=binopdf(x,10,0.5);
plot(x,y,'+')
title('二项分布');
例4.3-3如图4-12建立数制转换对话框。
在左边输入一个十进制整数和2~16之间的数,单击“转换”按钮能在右边得到十进制数所对应的2~16进制字符串,单击“退出”按钮退出对话框。
程序如下[examGUI5.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;
例4.3-4一元函数极值问题:
[jzwt_gui.m]
hf=figure('Color',[0,1,1],'Position',[200,200,600,400],...
'Name','一元函数极值问题',...
'NumberTitle','off','MenuBar','none');
set(gcf,'defaultuicontrolfontsize',16);
h_axes=axes('Units','normalized','position',[0.43,0.15,0.5,0.5]);%设置轴
uicontrol(hf,'Style','Text','Units','normalized',...
'Position',[0.05,0.8,0.25,0.1],'Horizontal','center',...
'String','函数式:
','Back',[0,1,1]);
he1=uicontrol(hf,'Style','Edit','Position',[0.3,0.8,0.6,0.1],...
'Units','normalized','Back',[0,1,0]);
uicontrol(hf,'Style','Text','Units','normalized',...
'Position',[0.1,0.6,0.15,0.1],'Horizontal','center',...
'String','极值:
','Back',[0,1,1]);
uicontrol(hf,'Style','Frame','Position',[0.05,0.15,0.3,0.45],...
'Units','normalized','Back',[1,1,0]);
uicontrol(hf,'Style','Push','Position',[0.1,0.45,0.2,0.1],...
'String','最大值','Units','normalized',...
'Call',['n=get(he1,''String'');''jzwt1(n,1);']);
uicontrol(hf,'Style','Push','Position',[0.1,0.25,0.2,0.1],...
'String','最小值','Units','normalized',...
'Call',['n=get(he1,''String'');''jzwt1(n,0);']);
[jzwt1.m]
functionjzwt1(st,m)
if(m==1)
[x,fval]=fminbnd(['-('st')'],0,1);
fval=-fval;
else
[x,fval]=fminbnd(['('st')'],0,1);
end
st=sym(st);
ezplot(st);
axis([01-11]);
holdon
plot(x,fval,'or')