matlab GUI设计.docx
《matlab GUI设计.docx》由会员分享,可在线阅读,更多相关《matlab GUI设计.docx(33页珍藏版)》请在冰豆网上搜索。
![matlab GUI设计.docx](https://file1.bdocx.com/fileroot1/2022-12/1/04e90f0a-c28d-4f4f-bfa6-2a0c5403f55f/04e90f0a-c28d-4f4f-bfa6-2a0c5403f55f1.gif)
matlabGUI设计
MatlabGUI设计
设计的一般步骤:
1.程序功能描述
2.程序界面设计
3.程序代码设计
4.程序测试运行
在GUI的设计中应注意在面板上进行按钮的静态布置时一定要事先预算好按钮的个数。
更重要的一点是如果你放置了一个按钮并且对此按钮的属性进行了某种操作,那么该按钮的痕迹将永远保存在你所建的面板上,你将该按钮删除,然后重新建一个按钮,并将其属性值设置和上一个按钮一模一样,那并不能保证你将上一按钮覆盖,在程序进行运行的过程中它只会识别上一按钮(已经删除的按钮),而你将上一按钮的删除则造成程序运行中的错误或是得不到你预想的界面效果,为了避免这种情况,在进行设计的时候对任一按钮属性的设置不要与已经删除按钮的属性相同。
在GUI指令的作用下,待打开的文件名不区分字母的大小写。
打开空白版的GUI界面是个控件的说明:
控件名
PropertyName
功能
按钮
PushButton
最常用的控件,用于响应用户的鼠标单击,按钮上有说明文字说明其作用。
切换按钮
ToggleButton
当单击时会凹凸状态切换。
单选按钮
RadioButton
当单击时会用黑白点切换,总是成组出现,多个单选按钮互斥,一组中只有一个被选中。
复选框
CheckBox
当单击时会用√切换,有选中、不选中和不确定等状态,总是成组出现,多个复选框可同时选用。
文本框
EditText
凹形方框,可随意输入和编辑单行和多行文字,并显示出来。
静态文本框
StaticText
用于显示文字信息,但不接受输入。
滚动条
Slider
可以用图示的方式显示在一个范围内数值的大概值范围,用户可以移动滚动条改变数值。
框架
Frame
将一组控件围在框架中,用于装饰界面。
列表框
ListBox
显示下拉文字列表,用户可以从列表中选择一项和多项。
弹出式菜单
PopupMenu
相当于文本框和列表框的组合,用户可以从下拉列表中选择。
坐标轴
Axes
用于绘制坐标轴。
*控件的常用属性:
创建控件以后,要对控件的各种属性值进行设置,大部分控件都要对以下的属性值进行设置:
(1)string属性:
用于显示在控件上的字符串,起说明或提示作用。
(2)callback属性:
回调函数,与菜单的一样。
(3)enable属性:
表示该控件是否有效,”on“表示有效,”off“表示无效。
(4)tooltipstring属性:
当鼠标放在控件上时显示提示信息,为字符串。
(5)字体属性:
包括fontname,fontsize等。
(6)Tag属性:
控件的标记,用于标识控件。
(7)Units取值可以是pixels(缺省值),normalized(相对单位),inches,centimeters或points(磅);
*实现GUI的基本机制是对控件的属性编程,特别是对其回调函数(callback)的编写。
注意回调函数的概念,它指的是在对象的某一个事件发生时,MATLAB内部机制允许自动调用的函数。
其几个参数的意思分别为:
hObject表示当前窗口的句柄;
eventdata表示事件代码,为保留;
handles是该窗口中的所有句柄的集合。
例1:
利用GUI工具箱设计一界面使其满足如下的功能。
(1)在编辑框中,可输入表示阻尼比的标量或“行数组”数值,并在按【enter】键后,在轴上画出相应的蓝色曲线(坐标范围:
X轴[0,15];Y轴[0,2])。
(2)在点击【Gridon】或【Gridoff】键时,在轴上画出或删除“分格线”;缺省时无分格线。
(3)在菜单【Options】下,有2个下拉菜单【Boxon】和【Boxoff】;缺省时为Boxoff状态。
(4)所设计的界面和其上图形对象、控件对象都按比例缩放。
界面的最终效果如下:
解:
1.启动GUI工具箱以后,布置如下图所示的界面:
上述界面包含一个坐标轴控件、两个静态文本框控件、一个可编辑文本框、两个按钮控件。
2.对各控件进行属性设置:
1)双击工作区或控件可引出图形窗和相应控件的“属性编辑框(PropertyInspector)”。
在图形窗的属性编辑框中,设置如下属性值:
⏹NameMyguil%图形窗的名称
⏹Resizeon%图形窗可以缩放
⏹Tagfiguer1%生成handles.figure1域存放图形窗句柄
2)在轴属性编辑框中,设置如下属性值:
⏹Unitsnormalized%采用相对度量单位,缩放时保持比例
⏹Boxoff%坐标轴不封闭
⏹Tagaxes1%生成handles.axes1域存放轴句柄
⏹XLim[0,15]%X轴范围
⏹YLim[0,2]%Y轴范围
3)在图形区上方的静态文本的属性编辑框中,设置如下属性值:
⏹Fontsize0.696%字体大小
⏹FontUnitsnormalized%采用相对度量单位,缩放时保持字体比例
⏹String归一化二阶系统的阶跃响应曲线%显示在界面上的字符
⏹Tagtitle_text%生成handles.title_text域存放静态文本句柄
⏹HorizontalAlignmentCenter%文字中心对齐
⏹Unitsnormalized%采用相对度量单位,缩放时保持该区比例
4)在可编辑文本上方的静态文本的属性编辑框中,设置如下属性值:
⏹Fontsize0.351%字体大小
⏹FontUnitsnormalized%采用相对度量单位,缩放时保持字体比例
⏹HorizontalAlignmentCenter%文字中心对齐
⏹String系统阻尼比%显示在界面上的字符
⏹Tagedit_text%生成handles.edit_text域存放静态文本句柄
⏹Unitsnormalized%采用相对度量单位,缩放时保持该区比例
5)在可编辑文本的属性编辑框中,设置如下属性值:
⏹Fontsize0.626%字体大小
⏹FontUnitsnormalized%采用相对度量单位,缩放时保持字体比例
⏹HorizontalAlignmentCenter%文字中心对齐
⏹String%在界面上显示为空白
⏹Tagzeta_edit%生成handles.zeta_edit域存放弹出式选单句柄
⏹Unitsnormalized%采用相对度量单位,缩放时保持该区比例
6)在上按键的属性编辑框中,设置如下属性值:
⏹Fontsize0.485%字体大小
⏹FontUnitsnormalized%采用相对度量单位,缩放时保持字体比例
⏹HorizontalAlignmentCenter%文字中心对齐
⏹StringGridon%在按键上显示Gridon
⏹TagGridOn_push%生成handles.GridOn_push域存放该键句柄
⏹Unitsnormalized%采用相对度量单位,缩放时保持该键比例
7)在下按键的属性编辑框中,设置如下属性值:
⏹Fontsize0.485%字体大小
⏹FontUnitsnormalized%采用相对度量单位,缩放时保持字体比例
⏹HorizontalAlignmentCenter%文字中心对齐
⏹StringGridoff%在按键上显示Gridoff
⏹TagGridOff_push%生成handles.GridOff_push域存放该键句柄
⏹Unitsnormalized%采用相对度量单位,缩放时保持该键比例
至此对控件属性的设置基本结束,得到如下界面:
3.创建菜单
点击“菜单编辑器”图标,引出空白菜单编辑对话窗,再点击该对话窗最左上方的“新菜单NewMenu”图标,在左侧空白窗口中,出现”Untitled1”图标;点击此图标则在右侧引出填写栏,在“lable”中填写Options;在“Tag”中填写options,于是左侧的”Untitled1”图标变成“Options”图标,表示此菜单已生成。
先点亮左侧的“Option”图标,再点击菜单编辑对话窗上的“新菜单项NewMenuItem”图标,就引出等待定义的菜单项;在右侧的“Label”中填写Boxon,在“Tag”中填写box_on。
重复该小步操作,建立另一个菜单项Boxoff。
注意:
菜单编辑对话窗上的“Callback”不要填写,机器自动生成。
4.界面的激活与回调函数的生成
点击工作台上的”运行界面“的工具图标,会出现一个询问对话框,当按提示对以上的设计进行存储以后,就会引出2个界面:
名为Myguil的(待激活的)图形用户界面;展示名为Myguil的(待填写回调指令的)M函数文件的文件编辑器界面。
同时,在当前目录或给定目录上,由MATLAB自动生成了2个文件,即Myguil.fig和Myguil.m。
1)在Myguil.m文件中,填写回调指令:
functionvarargout=zeta_edit_Callback(hObject,eventdata,handles,varargin)
z=str2num(get(handles.zeta_edit,‘String’))%从编辑框中获取zeta数据
t=0:
0.1:
15;%设置时间采样数组
cla%clearcurrentaxis
fork=1:
length(z)
y(:
k)=step(1,[1,2*z(k),1],t);%计算阶跃输出
line(t,y(:
k));%绘制曲线
end
2)对Gridon与Gridoff控件的回调函数的编写
Functionvarargout=GridOn_push_Callback(hObject,eventdata,handles,varargin)
gridon
functionvarargout=GridOff_push_Callback(hObject,eventdata,handles,varargin)
gridoff
3)对box_on与box_off回调函数的编写
functionvarargout=box_on_Callback(hObject,eventdata,handles,varargin)
boxon%配合菜单Boxon的操作指令
set(handles.box_on,‘enable’,‘off’)%使菜单项Boxon失能
set(handles.box_off,‘enable’,‘on’)%使菜单项Boxoff使能
functionvarargout=box_off_Callback(hObject,eventdata,handles,varargin)
boxoff%配合菜单Boxoff的操作指令
set(handles.box_off,‘enable’,‘off’)%使菜单项Boxoff失能
set(handles.box_on,‘enable’,‘on’)%使菜单项Boxon使能
经过以上几个步骤生成的图形用户界面已经可以使用了,只要Myguil.m和Myguil.fig在当前目录或在MATLAB搜索路径上,那么在指令窗运行Myguil就能使用该界面,如下:
输入阻尼比后显示如下:
点击Gridon后弹出的界面如下,点击Gridoff后弹出的界面如上图。
至此设计完成。
*控件对象的建立
Matlab提供了用于建立控件对象的函数uicontrol,其调用格式为:
对象句柄=uicontrol(图形窗口句柄,属性名1,属性值1,属性名2,属性值2,…)
例2:
建立数制转换对话框。
在左边输入一个十进制整数和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','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));
k=k-1;
end
dec=strdec;
上述程序运行的结果如下图:
在输入框中输入一个十进制的数以及一个要转换的进制数以后,点击转换即可得到结果,例如在十进制数中输入123456789,在2—16进制中输入16点击转换即得一下结果如下图:
常用颜色与其对应数值
颜色
R分量(红色)
G分量(绿色)
B分量(蓝色)
黑色
0
0
0
白色
1
1
1
红色
1
0
0
绿色
0
1
0
蓝色
0
0
1
黄色
1
1
0
洋红色
1
0
1
蓝绿色
0
1
1
灰色
0.5
0.5
0.5
暗红
0.5
0
0
铜色
1
0.62
0.40
碧绿色
0.49
1
0.83
例3建立图形演示对话框。
在编辑框输入绘图命令,单击“绘图”按钮能在左边坐标轴得到所对应的图形,弹出框提供色图控制,列表框提供坐标网格线和坐标边框控制。
解:
对控件的编程如下:
clf;
set(gcf,'Unit','normalized','Position',[0.2,0.3,0.65,0.35]);
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');
hlist=uicontrol(gcf,'Style','list','Unit','normalized',...
'Posi',[0.85,0.55,0.15,0.25],'String','Gridon|Gridoff|Boxon|Boxoff');
hpush1=uicontrol(gcf,'Style','push','Unit','normalized',...
'Posi',[0.85,0.35,0.15,0.15],'String','绘图');
uicontrol(gcf,'Style','push','Unit','normalized',...
'Posi',[0.85,0.15,0.15,0.15],'String','关闭','Call','closeall');
set(hpush1,'Call','COMM(hedit,hpopup,hlist)');
程序中回调函数COMM的程序如下:
functionCOMM(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={'gridon','gridoff','boxon','boxoff'};
colormap(eval(chpop{n1}));
eval(chlist{n2});
end
得到的界面如下:
上图是在绘图命令的窗口中输入绘图的命令以后所得到的图形。
'position'位置向量[xywidthheight]。
其中,[xy]表示相对于图形对象左下角的uicontrol的左下角位置。
[widhtheight]表示uicontrol的尺寸大小,其单位由属性Units确定
Units包括
inches:
centimeters:
normalized:
points:
{pixels}:
位置属性值的单位依次为
英寸
厘米
归一化的坐标值,图形的左下角映射为[0 0]而右上角的映射为为[1 1]
打印设置点,等于1/72英寸
屏幕的象素。
计算机屏幕分辨率的最小单位。
*菜单设计
建立自定义的用户菜单的函数为uimenu,格式为:
Hm=uimenu(Hp,属性名1,属性值1,属性名2,属性值2,…)
功能:
创建句柄值为Hm的自定义的用户菜单。
其中Hp为其父对象的句柄,属性名和属性值构成属性二元对,定义用户菜单的属性。
因其调用方法不同,该函数可以用于建立一级菜单项和子菜单项。
建立一级菜单项的函数调用格式为:
一级菜单项句柄=uimenu(图形窗口句柄,属性名1,属性值1,属性名2,属性值2,…)
建立子菜单项的函数调用格式为:
子菜单项句柄=uimenu(一级菜单项句柄,属性名1,属性值1,属性名2,属性值2,…)
菜单对象常用的属性:
菜单对象除具有Children(子对象),Parent(父对象),Tag(标签),Type(类型),UserData(用户数据),Enable(使能)和Visible(可见性)等公共属性,还有一些常用的特殊属性,如回调(callback)属性和菜单名(label)。
另外,用户菜单的外观有四个属性:
Position(位置),Separator(分隔线),checked(检录符)和ForeGroundColor(前景颜色)。
1Tag属性
Tag属性的取值是字符串,它定义了该菜单对象的一个标识值。
定义了Tag属性后,在任何程序中都可以通过这个标识值找出该菜单对象。
2Type属性
Type属性的取值总是uimenu,这个属性值标明图形对象的类型。
对菜单对象,其类型就是uimenu,用户不能改写这个属性。
3UserData属性
UserData属性的取值是一个矩阵,缺省值为空矩阵,用户可以在这个属性中保存与该菜单对