2024年2月21日发(作者:)
Matlab GUI设计
设计的一般步骤:
1. 程序功能描述
2. 程序界面设计
3. 程序代码设计
4. 程序测试运行
在GUI的设计中应注意在面板上进行按钮的静态布置时一定要事先预算好按钮的个数。更重要的一点是如果你放置了一个按钮并且对此按钮的属性进行了某种操作,那么该按钮的痕迹将永远保存在你所建的面板上,你将该按钮删除,然后重新建一个按钮,并将其属性值设置和上一个按钮一模一样,那并不能保证你将上一按钮覆盖,在程序进行运行的过程中它只会识别上一按钮(已经删除的按钮),而你将上一按钮的删除则造成程序运行中的错误或是得不到你预想的界面效果,为了避免这种情况,在进行设计的时候对任一按钮属性的设置不要与已经删除按钮的属性相同。
在GUI指令的作用下,待打开的文件名不区分字母的大小写。
打开空白版的GUI界面是个控件的说明:
控件名
按钮
PropertyName
PushButton
功能
最常用的控件,用于响应用户的鼠标单击,按钮上有说明文字说明其作用。
切换按钮 ToggleButton 当单击时会凹凸状态切换。
单选按钮 RadioButton
复选框
文本框
滚动条
框架
列表框
坐标轴
CheckBox
EditText
Slider
Frame
ListBox
Axes
当单击时会用黑白点切换,总是成组出现,多个单选按钮互斥,一组中只有一个被选中。
当单击时会用√切换,有选中、不选中和不确定等状态,总是成组出现,多个复选框可同时选用。
凹形方框,可随意输入和编辑单行和多行文字,并显示出来。
用于显示文字信息,但不接受输入。
可以用图示的方式显示在一个范围内数值的大概值范围,用户可以移动滚动条改变数值。
将一组控件围在框架中,用于装饰界面。
显示下拉文字列表,用户可以从列表中选择一项和多项。
相当于文本框和列表框的组合,用户可以从下拉列表中选择。
用于绘制坐标轴。
静态文本框 StaticText
弹出式菜单 PopupMenu
* 控件的常用属性:
创建控件以后,要对控件的各种属性值进行设置,大部分控件都要对以下的属性值进行设置:
(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)在点击【Grid on】或【Grid off】键时,在轴上画出或删除“分格线”;缺省时无分格线。
(3)在菜单【Options】下,有2个下拉菜单【Box on】和【Box off】;缺省时为Box off状态。
(4)所设计的界面和其上图形对象、控件对象都按比例缩放。
界面的最终效果如下:
解:1.启动GUI工具箱以后,布置如下图所示的界面:
上述界面包含一个坐标轴控件、两个静态文本框控件、一个可编辑文本框、两个按钮控件。
2.对各控件进行属性设置:
1) 双击工作区或控件可引出图形窗和相应控件的“属性编辑框(Property Inspector)”。
在图形窗的属性编辑框中,设置如下属性值:
Name Myguil %图形窗的名称
Resize on %图形窗可以缩放
Tag figuer1 %生成1域存放图形窗句柄
2) 在轴属性编辑框中,设置如下属性值:
Units normalized %采用相对度量单位,缩放时保持比例
Box off %坐标轴不封闭
Tag axes1 %生成1域存放轴句柄
XLim [0,15] %X轴范围
YLim [0,2] %Y轴范围
3) 在图形区上方的静态文本的属性编辑框中,设置如下属性值:
Fontsize 0.696 %字体大小
FontUnits normalized %采用相对度量单位,缩放时保持字体比例
String 归一化二阶系统的阶跃响应曲线 %显示在界面上的字符
Tag title_text %生成_text域存放静态文本句柄
HorizontalAlignment Center %文字中心对齐
Units normalized %采用相对度量单位,缩放时保持该区比例
4) 在可编辑文本上方的静态文本的属性编辑框中,设置如下属性值:
Fontsize 0.351 %字体大小
FontUnits normalized %采用相对度量单位,缩放时保持字体比例
HorizontalAlignment Center %文字中心对齐
String 系统阻尼比 %显示在界面上的字符
Tag edit_text %生成_text域存放静态文本句柄
Units normalized %采用相对度量单位,缩放时保持该区比例
5) 在可编辑文本的属性编辑框中,设置如下属性值:
Fontsize 0.626 %字体大小
FontUnits normalized %采用相对度量单位,缩放时保持字体比例
HorizontalAlignment Center %文字中心对齐
String %在界面上显示为空白
Tag zeta_edit %生成_edit域存放弹出式选单句柄
Units normalized %采用相对度量单位,缩放时保持该区比例
6) 在上按键的属性编辑框中,设置如下属性值:
Fontsize 0.485 %字体大小
FontUnits normalized %采用相对度量单位,缩放时保持字体比例
HorizontalAlignment Center %文字中心对齐
String Grid on %在按键上显示Grid on
Tag GridOn_push %生成_push域存放该键句柄
Units normalized %采用相对度量单位,缩放时保持该键比例
7) 在下按键的属性编辑框中,设置如下属性值:
Fontsize 0.485 %字体大小
FontUnits normalized %采用相对度量单位,缩放时保持字体比例
HorizontalAlignment Center %文字中心对齐
String Grid off %在按键上显示Grid off
Tag GridOff_push %生成f_push域存放该键句柄
Units normalized %采用相对度量单位,缩放时保持该键比例
至此对控件属性的设置基本结束,得到如下界面:
3.创建菜单
点击“菜单编辑器”图标,引出空白菜单编辑对话窗,再点击该对话窗最左上方的“新菜单New Menu”图标,在左侧空白窗口中,出现”Untitled1”图标;点击此图标则在右侧引出填写栏,在“lable”中填写Options;在“Tag”中填写options,于是左侧的”Untitled1”图标变成“Options”图标,表示此菜单已生成。
先点亮左侧的“Option”图标,再点击菜单编辑对话窗上的“新菜单项NewMenu Item”图标,就引出等待定义的菜单项;在右侧的“Label”中填写Box on,在“Tag”中填写box_on。重复该小步操作,建立另一个菜单项Box off。
注意:菜单编辑对话窗上的“Callback”不要填写,机器自动生成。
4.界面的激活与回调函数的生成
点击工作台上的”运行界面“的工具图标,会出现一个询问对话框,当按提示对以上的设计进行存储以后,就会引出2个界面:名为Myguil的(待激活的)图形用户界面;展示名为Myguil的(待填写回调指令的)M函数文件的文件编辑器界面。同时,在当前目录或给定目录上,由MATLAB自动生成了2个文件,即和Myguil.m。
1)在Myguil.m文件中,填写回调指令:
function varargout=zeta_edit_Callback(hObject, eventdata, handles,varargin)
z=str2num(get(_edit,„String‟)) %从编辑框中获取zeta数据
t=0:0.1:15; %设置时间采样数组
cla %clear current axis
for k=1:length(z)
y(:,k)=step(1,[1,2*z(k),1],t); %计算阶跃输出
line(t,y(:,k)); %绘制曲线
end
2)对Grid on与Grid off控件的回调函数的编写
Function varargout=GridOn_push_Callback(hObject, eventdata, handles,varargin)
grid on
function varargout=GridOff_push_Callback(hObject, eventdata, handles,varargin)
grid off
3)对box_on与box_off回调函数的编写
function varargout=box_on_Callback(hObject, eventdata, handles,varargin)
box on %配合菜单Box on的操作指令
set(_on,„enable‟,„off‟) %使菜单项Box on失能
set(_off,„enable‟,„on‟) %使菜单项Box off使能
function varargout=box_off_Callback(hObject, eventdata, handles,varargin)
box off %配合菜单Box off的操作指令
set(_off,„enable‟,„off‟) %使菜单项Box off 失能
set(_on,„enable‟,„on‟) %使菜单项Box on 使能
经过以上几个步骤生成的图形用户界面已经可以使用了,只要Myguil.m和在当前目录或在MATLAB搜索路径上,那么在指令窗运行Myguil就能使用该界面,如下:
输入阻尼比后显示如下:
点击Grid on后弹出的界面如下,点击Grid off后弹出的界面如上图。
至此设计完成。
* 控件对象的建立
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函数文件如下:
function dec=trdec(n,b)
ch1='ABCDEF'; %十六进制的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));
k=k-1;
end
dec=strdec;
上述程序运行的结果如下图:
在输入框中输入一个十进制的数以及一个要转换的进制数以后,点击转换即可得到结果,例如在十进制数中输入123456789,在2—16进制中输入16点击转换即得一下结果如下图:
常用颜色与其对应数值
颜色
黑色
白色
红色
绿色
蓝色
黄色
R分量(红色) G分量(绿色) B分量(蓝色)
0
1
1
0
0
1
0
1
0
1
0
1
0
1
0.5
0
0.62
1
0
1
0
0
1
0
1
1
0.5
0
0.40
0.83
洋红色
1
蓝绿色
0
灰色
暗红
铜色
0.5
0.5
1
碧绿色
0.49
例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','Grid on|Grid off|Box on|Box off');
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','close all');
set(hpush1,'Call','COMM(hedit,hpopup,hlist)');
程序中回调函数COMM的程序如下:
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
得到的界面如下:
上图是在绘图命令的窗口中输入绘图的命令以后所得到的图形。
'position'位置向量[x y width height]。其中,[x y]表示相对于图形对象左下角的uicontrol的左下角位置。[widht height]表示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(前景颜色)。
① Tag属性
Tag属性的取值是字符串,它定义了该菜单对象的一个标识值。定义了Tag属性后,在任何程序中都可以通过这个标识值找出该菜单对象。
② Type属性
Type属性的取值总是uimenu,这个属性值标明图形对象的类型。对菜单对象,其类型就是uimenu,用户不能改写这个属性。
③ UserData属性
UserData属性的取值是一个矩阵,缺省值为空矩阵,用户可以在这个属性中保存与该菜单对象相关的重要数据或信息,借此可以达到传递数据或信息的目的。可以用set和get函数访问该属性。
例4:建立“图形演示系统”菜单。菜单条中含有3个菜单项:Plot、Option和Quit。Plot中有Sine Wave和Cosine Wave两个子菜单项,分别控制在本图形窗口画出正弦和余弦曲线。Option菜单项的内容为:Grid on和Grid off控制给坐标轴加网格线,Box on和Box off控制给坐标轴加边框,而且这4项只有在画有曲线时才是可选的。Figure 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.6*W,0.4*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','&Grig on','Call','grid on','Enable','off');
hgoff=uimenu(hoption,'Label','&Grig 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');
hfigcor=uimenu(hoption,'Label','&Figure Color','Separator','on');
uimenu(hfigcor,'Label','&Red','Accelerator','r','Call','set(gcf,''Color'',''r'');');
uimenu(hfigcor,'Label','&Blue','Accelerator','b','Call','set(gcf,''Color'',''b'');');
uimenu(hfigcor,'Label','&Yellow','Accelerator','y','Call','set(gcf,''Color'',''y'');');
uimenu(hfigcor,'Label','&White','Accelerator','w','Call','set(gcf,''Color'',''w'');');
%定义Quit菜单项
uimenu(gcf,'Label','&Quit','Call','close(gcf)');
在matlab中运行上面的程序可得:
例5.建立一个菜单系统。
菜单条中含有File和Help两个菜单项。如果选择File中的New选项,则将显示New Item字样,如果选择File中的Open选项,则将显示出Open Item字样。File中的Save菜单项初始时处于禁选状态,在选择Help选项之后将此菜单项恢复成可选状态,如果选择File中的Save选项,则将出现一个新的菜单(三级菜单),其中共有两个子菜单项Text file和Graphics
file,如果选择第1项,则将变量k1和k2分别赋为0和1,然后调用file01.m文件来进行相应的处理(该文件需要另行编写),如果选择第2项,则将变量k1和k2分别赋为1和0,然后调用file10.m文件来进行相应的处理(该文件也需要另行编写)。如果选择File中的Save As选项,则将显示Save As Item字样。如果选择File中的Exit选项,则将关闭当前窗口。如果选择Help中About …选项,则将显示Help Item字样,并将Save•菜单设置成可选状态。
解:程序设计如下:
screen=get(0,'ScreenSize');
W=screen(3);H=screen(4);
hf=figure('Color',[1,1,1],'Position',[1,1,0.4*W,0.3*H],...
'Name','菜单设计示例一','NumberTitle','off','MenuBar','none');
hfile=uimenu(hf,'label','&File');
hhelp=uimenu(hf,'label','&Help');
uimenu(hfile,'label','&New','call','disp(''New Item'')');
uimenu(hfile,'label','&Open','call','disp(''Open Item'')');
hsave=uimenu(hfile,'label','&Save','Enable','off');
uimenu(hsave,'label','Text file','call','k1=0;k2=1;file01;');
uimenu(hsave,'label','Graphics file','call','k1=1;k2=0;file10;');
uimenu(hfile,'label','Save &As','call','disp(''Save As Item'')');
uimenu(hfile,'label','&Exit','separator','on','call','close(hf)');
uimenu(hhelp,'label','About ...','call',...
['disp(''Help Item'');','set(hsave,''Enable'',''on'')']);
程序运行的结果:
* 快捷菜单
快捷菜单是用鼠标右键单击某对象时在屏幕上弹出的菜单。这种菜单出现的位置是不固
定的,而且总是和某个图形对象相联系。
在Matlab中,可以使用uicontextmenu函数和图形对象的UIContextMenu属性来建立快捷菜单,具体步骤为:
① 利用uicontextmenu函数建立快捷菜单,格式为:
hc=uicontextmenu
功能:建立快捷菜单,并将句柄值赋给变量hc。
② 利用uimenu函数为快捷菜单建立菜单项,格式为:
uimenu(„快捷菜单名‟,属性名,属性值,...)
功能:为创建的快捷菜单赋值,其中属性名和属性值构成属性二元对。
③ 利用set函数将该快捷菜单和某图形对象联系起来。
例6.绘制曲线 y=2e-0.5xsin(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); %将该快捷菜单和曲线对象联系起来
得到的结果为:(下图是在图形区域点击右键的结果)
* 对话框的设计
在图形用户界面程序设计中,对话框是重要的信息显示和获取输入数据的用户界面对象。使用对话框,可以使应用程序的界面更加友好,使用更加方便。Matlab 提供了两类对话框,一类为 Windows 的公共对话框,另一类为Matlab 风格的专用对话框。
1.公共对话框
公共对话框是利用windows资源的对话框,包括文件打开、文件保存、颜色设置、字体设置、打印设置、打印预览、打印等。
① 文件打开对话框
用于打开文件,函数为 uigetfile,其调用格式为:
uigetfile:弹出文件打开对话框,列出当前目录下的所有Matlab文件;
uigetfile(„FilterSpec‟):弹出文件打开对话框,列出当前目录下的所有由„FilterSpec‟ 指定类型的文件;
uigetfile(„FilterSpec‟,‟DialogTitle‟):同时设置文件打开对话框的标题为‟DialogTitle‟;
uigetfile(„FilterSpec‟,‟DialogTitle‟,x,y):…x,y参数用于确定文件打开对话框的位置;
[fname,pname]=uigetfile(…):返回打开文件的文件名和路径。
② 文件保存对话框
用于保存文件,函数为uiputfile,其调用格式为:
uiputfile:弹出文件保存对话框,列出当前目录下的所有Matlab文件;
uiputfile(„InitFile‟):弹出文件保存对话框,列出当前目录下的所有由„InitFile‟指定类型的文件;
uiputfile(„InitFile‟,‟DialogTitle‟):…同时设置文件保存对话框的标题为‟DialogTitle‟;
uiputfile(„InitFile‟,‟DialogTitle‟,x,y):…x,y参数用于确定文件保存对话框的位置;
[fname,pname]=uiputfile(…):返回保存文件的文件名和路径。
③ 颜色设置对话框
用于图形对象颜色的交互式设置,函数为 uisetcolor,其调用格式为:
c=uisetcolor(„h_or_c,‟DialogTitle‟)
输入参数 h_or_c 可以是一个图形对象的句柄,也可以是一个三色 RGB 矢量,‟DialogTitle‟为颜色设置对话框的标题。
④ 字体设置对话框
用于字体属性的交互式设置,函数为uisetfont,格式为:
uisetfont:打开字体设置对话框,返回所选择字体的属性;
uisetfont(h):h 为图形对象句柄,使用字体设置对话框重新设置该对象的字体属性;
uisetfont(S):S为字体属性结构变量,S中包含的属性有FontName、FontUnits、FontSize、FontWeight、FontAngle,返回重新设置的属性值;
uisetfont(h,‟DialogTitle‟): h 为图形对象句柄,使用字体设置对话框重新设置该对象的字体属性,‟DialogTitle‟设置对话框的标题;
uisetfont(S,‟DialogTitle‟): S为字体属性结构变量,S中包含的属性有FontName、FontUnits、FontSize、FontWeight、FontAngle,返回重新设置的属性值, ‟DialogTitle‟
设置对话框的标题;
S=uisetfont(…):返回字体属性值,保存在结构变量S中。
⑤ 打印设置对话框
用于打印页面的交互式设置,有两个函数:pagesetupdlg 和 pagedlg(老版本,Matlab6中仍可用)。调用格式为:
dlg=pagesetupdlg(fig):fig为图形窗口的句柄,省略时为当前图形窗口;
pagedlg:设置当前图形窗口;
pagedlg(fig):设置以fig为句柄的图形窗口。
⑥ 打印预览对话框
用于对打印页面进行预览,函数为printpreview ,格式为:
printpreview:对当前图形窗口进行打印预览;
printpreview(f):对以f为句柄的图形窗口进行打印预览。
⑦ 打印对话框
为Windows的标准对话框,函数为 printdlg ,格式为:
printdlg:对当前图形窗口打开Windows打印对话框;
printdlg(fig):对以fig为句柄的图形窗口打开Windows打印对话框;
printdlg(„-crossplatform‟,fig):打开crossplatform 模式的Matlab打印对话框;
printdlg(-„setup‟,fig):在打印设置模式下,强制打开打印对话框。
专用对话框
Matlab除了使用公共对话框外,还提供了一些专用对话框,包括帮助、错误信息、信息提示、警告信息等。
① 错误信息对话框
用于提示错误信息,函数为errordlg ,其调用格式为:
errordlg:打开默认的错误信息对话框;
errordlg(„errorstring‟):打开显示‟errorstring‟信息的错误信息对话框;
errordlg(„errorstring‟,‟dlgname‟):打开显示‟errorstring‟信息的错误信息对话框,对话框的标题由„dlgname‟指定;
erordlg(„errorstring‟,‟dlgname‟,‟on‟):打开显示‟errorstring‟信息的错误信息对话框,对话框的标题由„dlgname‟指定
例7 errordlg('输入错误,请重新输入','错误信息')
显示结果如下图:
② 帮助对话框
用于帮助提示信息,函数为helpdlg ,其调用格式为:
helpdlg:打开默认的帮助对话框;
helpdlg(„helpstring‟):打开显示„errorstring‟信息的帮助对话框;
helpdlg(„helpstring‟,„dlgname‟):打开显示„errorstring‟ 信息的帮助对话框, 对话框的标题由„dlgname‟指定;
h=helpdlg(…):返回对话框句柄。
例8 helpdlg('矩阵尺寸必须相等','在线帮助')
③ 输入对话框
用于输入信息,函数为inputdlg ,其调用格式为:(输入对话框的解释1)
answer=inputdlg(prompt):打开输入对话框,prompt为单元数组,用于定义输入数据窗口的个数和显示提示信息,answer为用于存储输入数据的单元数组;
answer=inputdlg(prompt,title):与上者相同,title确定对话框的标题;
answer=inputdlg(prompt,title,lineNo):参数lineNo可以是标量、列矢量或m×2阶矩阵,若为标量,表示每个输入窗口的行数均为lineNo;若为列矢量,则每个输入窗口的行数由列矢量lineNo的每个元素确定;若为矩阵,每个元素对应一个输入窗口,每行的第一列为输入窗口的行数,第二列为输入窗口的宽度;
answer=inputdlg(prompt,title,lineNo,defAns):参数defans为一个单元数组,存储每个输入数据的默认值,元素个数必须与prompt 所定义的输入窗口数相同,所有元素必须是字符串;
answer=inputdlg(prompt,title,lineNo,defAns,Resize):参数resize决定输入对话框的大小能否被调整,可选值为on或off.
例9 创建两个输入窗口的输入对话框
prompt={'Input Name','Input Age'};
title='Input Name and Age';
lines=[2 1]';
def={'John Smith','35'};
answer=inputdlg(prompt,title,lines,def);
程序运行的结果如下
语法:(输入对话框的解释2)
answer=inputdlg(‘prompt’,‘title’,lineo, ’defans’,adopt)
1. ‘prompt’:输入提示字符串,‘title’:输入对话框的标题;
2. lineo:设置输入区的行数和列数,一般设为1。如果行数和列数都要设置,用[行数,列数]的形式设置;
3. ’defans’设置缺省的输入;
4. adopt设置用户是否可以改变对话框的大小。‘yes’为可以,‘no’为不可以
例子如下:
clear
promp={'输入名称:','输入价钱 : '};
default={'0','0'};
answer=inputdlg(promp,'Test',1,default)
运行后弹出如右的对话框
④ 列表选择对话框
语法:[section,ok]=listdlg(‘chracname’,‘value’)
1. 列表对话框的参数是由一对一对的属性名chracname和属性值vaule组成。属性名‘ListString’设置备选项,备选项为字符串或者字符串数组;属性名‘Initial Value’设置初始选项;属性名‘SelectionMode’设置是否多选,属性值‘Single’为单选,属性值‘multiple’为多选;属性名‘PromotString’设置提示字符。
2. Selection为被选中的备选项的序列号。Ok返回用户是否单击Ok按钮确认的逻辑值,1为确认,0为单击了Cancel按钮。
例10.GUI实例
界面的排列如上图所示,文件名为plot_multiple
在“选择”按钮的属性列表里将“callback”设置为choice
在“绘图”按钮的属性列表里将“callback”设置为take_plot
在“关闭”按钮的属性列表里将“callback”设置为take_close
%文件choice.m的代码:
str={'mesh','surf','waterfall','meshz','meshc','contour','contour3'};
[s,v]= listdlg('ListString',str,...
'Name','请选择一种绘图方法',...
'PromptString','请选择',...
'SelectionMode','single')
%文件take_plot.m的代码
switch s
case 1
mesh(peaks)
case 2
surf(peaks)
case 3
clear
[x,y,z]=peaks;
waterfall(x,y,z);
colormap([1 0 0])
case 4
clear
[x,y,z]=peaks;
meshz(x,y,z);
colormap([1 0 0])
case 5
clear
[x,y,z]=peaks;
meshc(x,y,z);
colormap([1 0 0])
case 6
clear
[x,y,z]=peaks;
contour(z);
colormap([1 0 0])
case 7
clear
[x,y,z]=peaks;
contour3(z);
colormap([1 0 0])
end
%文件take_close.m的代码
answer=questdlg('您要关闭窗口吗?');
if answer=='Yes'
close
end
注意要将编写的文件放在matlab默认的目录下
在matlab窗口中运行plot_multiple即可弹出下面的窗口:
点击“选择”弹出:
选中一种绘图的方式以后单击“ok”即可,然后点击“绘图”即可。例如选择mesh后点击“绘图”则弹出:
点击“关闭”按钮则弹出:
按照自己的需求选择即可。
⑤ 信息提示对话框
用于显示提示信息,函数为msgbox ,其调用格式为:
msgbox(message):打开信息提示对话框,显示message信息;
msgbox(message,title):…title确定对话框标题;
msgbox(message,title,‟icon‟): … „icon‟用于显示图标,可选图标包括:none(无图标,缺省值)、error、help、warn或custom(用户定义);
msgbox(message,title,‟custom‟,icondata,iconcmap):当使用用户定义图标时,iconData为定义图标的图像数据,iconCmap为图像的色彩图;
msgbox(…,‟creatmode‟):选择模式creatMode,选项为:modal, non-modal 和replace;
h=msgbox(…):返回对话框句柄。
例11.msgbox(‘message’,‘title’)
其中‘message’为显示在对话框上的消息,‘title’为消息对话框的标题。
⑥ 问题提示对话框
用于回答问题的多种选择,函数为questdlg,格式为:
button=questdlg(„qstring‟):打开问题提示对话框,有三个按钮,分别为:Yes,No和Cancel,‟questdlg‟确定提示信息;
button=questdlg(„qstring‟,‟title‟): … title确定对话框标题;
button=questdlg(„qstring‟‟title‟,‟default‟):当按回车键时,返回„default‟的值,„default‟
必须是Yes,No或Cancel 之一;
button=questdlg(„qstring‟,‟title‟,‟str1‟,‟str2‟,‟default‟):打开问题提示对话框,有两个按钮,分别由str1和str2确定,‟qstdlg‟确定提示信息, „title‟确定对话框标题,„default‟必须是str1或str2之一;
button=questdlg(„qstring‟, ‟title‟,‟str1‟,‟str2‟,‟str3‟,‟default‟): 打开问题提示对话框,有三个按钮,分别由str1, str2和str3确定,‟qstdlg‟确定提示信息, „title‟确定对话框标题,„default‟必须是str1, str2或str3之一。
例12.answer=questdlg('are you a student?','answer my question','yes')运行后弹出的对话框为
例13 clear
answer=questdlg('你打算怎么去上海','请回答我','火车','飞机','轮船','火车');
switch answer
case'火车'
msgbox('做火车比较好','我的建议')
case'飞机'
msgbox('做飞机比较快','我的建议')
case'轮船'
msgbox('做轮船比较慢','我的建议')
end
运行后弹出的对话框为:
点击火车则显示:
⑦ 进程条
以图形方式显示运算或处理的进程,函数为waitbar,其调用格式为:
h=waitbar(x,‟title‟):显示以title为标题的进程条,x为进程条的比例长度,其值必须在0到1之间,h为返回的进程条对象的句柄;
waitbar(x,‟title‟,‟creatcancelbtn‟,‟button_callback‟):在进程条上使用CreatCancelBtn参数创建一个撤销按钮,在进程中按下撤销按钮将调用button_callback函数;
waitbar(…,property_name,property_value,…):选择其它由property_name定义的参数,参数值由property_value指定
例14 创建并使用进程条。
h=waitbar(0,'');
for i=1:10000
waitbar(i/10000,h)
end
close(h)
运行的结果显示为:
⑧ 警告信息对话框
用于提示警告信息,函数为warndlg,其调用格式为:
h=warndlg(„warningstring‟,‟dlgname‟)
打开警告信息对话框,显示„warningstring‟信息,„dlgname‟确定对话框标题,h为返回的对话框句柄。
根据前面讲述的知识设计一个简单信号分析仪的程序:
例15设计一个简单信号分析仪的程序,要求根据输入的两个频率和时间间隔,计算函数xsin(2f1t)sin(2f2t)的值,并对函数进行快速傅立叶变换,最后分别绘制时域和频域的曲线。
解:控件的布置如下图所示:
对于控件的‟String‟的设置见图
对控件的Tag的设置:设置第一个坐标轴的标识为:frequency_axes, 用于显示频域图形;
第二个坐标轴的标识为:time_axes, 用于显示时域图形。三个文本编辑框的标识为f1_input,
f2_input, t_input,分别用于输入两个频率和自变量时间的间隔。由于不需要返回3个静态文本框和按钮的值,这些控件的标识可以使用缺省值。
控件的标识(Tag)用于对各控件的识别。每个控件在创建时都会由开发环境自动产生一个标识,在程序设计中,为了编辑、记忆和维护的方便,一般为控件设置一个新的标识。
GUI图形界面的功能,还是要通过一定的设计思路和计算方法,由特定的程序来实现。为了实现程序的功能,还需要在运行程序前编写一些代码,完成程序中变量的赋值、输入输出、计算及绘图等工作。
1. 设置对象的初始值
分别设置三个文本编辑框的初始值为:(初始化)
f1_input=20
f2_input=50
t_input=0:0.001:0.5
2. 编写代码
(1) 从GUI获得用户输入的数据。本例中输入的3个数据分别为频率1、频率2和时间间隔。
f1=str2double(get(handles.f1_input,'String'));
f2=str2double(get(handles.f2_input,'String'));
t=eval(get(handles.t_input,'String'));
(2)计算数据。计算函数值,按指定点进行快速傅立叶变换,并计算频域的幅值和频域分辨率。
x=sin(2*pi*f1*t)+sin(2*pi*f2*t);
y=fft(x,512);
m=y.*conj(y)/512;
f=1000*(0:256)/512;
(3)在第一个坐标轴中绘制频域曲线。
axes(ncy_axes)
plot(f,m(1:257))
set(ncy_axes,'XminorTick','on')
grid on
(4)在第二个坐标轴中绘制时域曲线。
axes(_axes) %选择适当的坐标轴
plot(t,x)
set(_axes,'XminorTick','on')
grid on
得到的图形如下:


发布评论