10分钟搞定matlabGUI


参考文献:

MATLAB程序设计教程

李海涛,邓樱

编著

高等教育出版社,2002

用户界面是用户与计算机进行信息交流的方式。计算机 用户界面 在屏幕显示图形和文本,若有扬声器还可产生声音。用户通 过输入设备(如:键盘、鼠标、跟踪球、绘制板或麦克风), 与计算机通讯。用户界面设定了如何观看和如何感知计算机、 操作系统或应用程序。通常,多是根据悦目的结构和用户界 面功能的有效性来选择计算机或程序。

图形用户界面(GUI)是指由窗口、菜单、图标、光标、 图形用户界面 按键、对话框和文本等各种图形对象 图形对象组成的用户界面。它让 图形对象 用户定制用户与Matlab的交互方式,而命令窗口不是唯一与 Matlab的交互方式。

用户通过鼠标或键盘选择、激活这些图形对象,使计算 机产生某种动作或变化。 基本图形对象分为控件对象 用户界面菜单对象 控件对象和用户界面菜单对象 控件对象 用户界面菜单对象,简称 控件和菜单 控件 菜单。 菜单 由上一讲可知:用户菜单、用户控件和对话框是和坐标 轴处于同一层次的,都是图形窗口的子对象。

Matlab中设计图形用户界面的方法有两种 使用可视化 方法有两种:使用可视化 方法有两种 的界面环境和通过编写程序 通过编写程序。 的界面环境 通过编写程序

图形用户界面设计工具的启动
图形用户界面设计工具的启动方式: 1. 命令方式 图形用户界面GUI设计工具的启动命令为guide,格式为: ① guide 功能: 功能:启动GUI设计工具,并建立名字为untitled.fig的图形 用户界面。 ② guide filename 功能: 功能:启动GUI设计工具,并打开已建立的图形用户界面 filename。

2. 菜单方式 在Matlab的主窗口中,选择File菜单中的New菜单项, 再选择其中的GUI命令,就会显示GUI的设计模板。

Matlab为GUI设计一共准备了 种模板,分别是 为 设计一共准备了4种模板 设计一共准备了 种模板,分别是: Blank GUI(Default)(空白模板,默认); GUI with Uicontrols(带控件对象的GUI模板); GUI with Axes and Menu(带坐标轴与菜单的GUI模板); Modal Question Dialog(带模式问题对话框的GUI模板)。

当用户选择不同的模板时,在GUI设计模板界面的右边 就会显示出与该模板对应的GUI图形。

图形用户界面设计工具启动时模板选择对话框

图形用户界面设计窗口
在GUI设计模板中选中一个模板,然后单击OK按钮, 就会显示GUI设计窗口。选择不同的GUI设计模式时,在 GUI设计窗口中显示的结果是不一样的。 图形用户 界面GUI设计 窗口由菜单栏、 菜单栏、 菜单栏 工具栏、 工具栏、控件 工具栏以及图 工具栏 图 形对象设计区 等4个功能区 个功能区 组成。

左图为空白 GUI模板情形

GUI设计 窗口的菜单栏 菜单栏 有File、Edit、 、 、 View、Layout、 、 、 Tools和Help 6 个菜单项,使 个菜单项 用其中的命令 可以完成图形 用户界面的设 计操作。 编辑工具在菜单栏的下方,提供了常用的工具;设计 设计 编辑工具 工具区位于窗口的左半部分,提供了设计GUI过程中所用的 工具区 用户控件;空间模板区 空间模板区是网格形式的用户设计GUI的空白区 空间模板区 域。 在GUI设计窗口创建图形对象后,通过双击该对象,就 会显示该对象的属性编辑器。

一、图形用户界面开发环境(GUIDE) 图形用户界面开发环境
Matlab提供了一套可视化的创建图形窗口的工具,使 用图形用户界面开发环境可方便地创建GUI应用程序,它 可以根据用户设计的GUI布局,自动生成M文件的框架,用 户使用这一框架编制自己的应用程序。

Matlab提供了一套可视化的创建图形用户接口(GUI) ( ) 的工具,包括:

布局编辑器(Layout Edtor)——在图形窗口中创建及布置 布局编辑器 图形对象。布局编辑器是可以启动用户界面的控制面板,上 述工具都必须从布局编辑器中访问,用guide命令可以启动, 用 命令可以启动, 命令可以启动 或在启动平台窗口中选择GUIDE来启动布局编辑器; 来启动布局编辑器; 或在启动平台窗口中选择 来启动布局编辑器 几何排列工具(Alignment Tool)——调整各对象相互之间 几何排列工具 的几何关系和位置; 属性查看器(Property Inspector)——查询并设置属性值; 属性查看器 对象浏览器(Object Browser)——用于获得当前Matlab图 对象浏览器 形用户界面程序中的全部对象信息,对象的类型,同时显示 控件的名称和标识,在控件上双击鼠标可以打开该控件的属 性编辑器; 菜单编辑器(Menu Editor)——创建、设计、修改下拉式 菜单编辑器 菜单和快捷菜单; Tab顺序编辑器(Tab Order Editor)——用于设置当用 顺序编辑器( 顺序编辑器 ) 户按下键盘上的Tab键时,对象被选中的先后顺序。

在Matlab 5中, GUI的设计是以 M文件的编程形式实 现的,GUI的布局代码存储在M文件和MAT文件中,而在 Matlab 6中有了很大的改变, Matlab 6将GUI的布局代码 存储在 FIG文件中,同时还产生一个M文件用于存储调用 函数,在M文件中不再包含GUI的布局代码,在开发应用程 序时代码量大大减少。 1. 布局编辑器 布局编辑器(Layout editor) 用于从控件选择板上选择控件对象并放置到布局区去, 布局区被激活后就成为图形窗口。 在命令窗口输入GUIDE 命令或点击工具栏中的guide图标都可以打开空白的布局编 打开空白的布局编 辑器,在命令窗口输入GUIDE filename 可打开一个已存在 辑器 打开一个已存在 的名为filename图形用户界面。



将控件对象放置到布局区 用鼠标选择并放置控件到布局区内; 移动控件到适当的位置; 改变控件的大小; 选中多个对象的方法。

一 个 简 单 的 布 局 示 例



激活图形窗口

如所建立的布局还没有进行存储,可用File菜单下的 Save As菜单项(或工具栏中的对应项 工具栏中的对应项),按输入的文件的 工具栏中的对应项 名字,在激活图形窗口的同时将存储一对同名的M文件和 带有.fig扩展名的FIG文件。



运行GUI程序 程序 运行 在命令窗口直接键入文件名或用openfig, open或 hgload命令运行GUI程序。



布局编辑器参数设置

选File菜单下 的Preferences 菜单项打开参 数设置窗口, 点击树状目录 中的GUIDE, , 即可以设置布 局编辑器的参 数。



布局编辑器的弹出菜单

在任一控件上按下鼠标右键,会弹出一个菜单, 通过该菜单可以完成布局编辑器的大部分操作。

2. 位置调整工具 位置调整工具(Alignment tool) 利用位置调整工具,可以对GUI对象设计区内的多个对 象的位置进行调整。 位置调整工具的打开方式有两种: 位置调整工具的打开方式有两种: ① 从GUI设计窗口的工具栏上选择 Align Objects命令按钮; ② 选择Tools菜单下的Align Objects...菜 单项,就可以打开对象位置调整器。 对象位置调整器中的第一栏是垂直方向的位置调整, 第二栏是水平方向的位置调整。 在选中多个对象后,可以方便的通过对象位置调整器 调整对象间的对齐方式和距离。

3. 用属性查看器设置控件属性 利用对象属性查看器,可以查看每个对象的属性值,也 可以修改、设置对象的属性值。 ① 打开属性查看器(Opening Property Inspector) 打开属性查看器

对象属性查看器的打开方式有四种: 对象属性查看器的打开方式有四种: 从GUI设计窗口工具栏上选择 Property Inspector命令按钮; 选择View菜单下的Property Inspector菜单项; 在命令窗口中输入inspect; 在控件对象上单击鼠标右键, 选择弹出菜单的 Property Inspector菜单项。



使用属性查看器(Using Property Inspector) 使用属性查看器 布置控件; 定义文本框的属性; 定义坐标轴的属性; 定义按钮的属性; 定义复选框。

4. 菜单编辑器 菜单编辑器(Menu Editor) 利用菜单编辑器,可以创建、设置、修改下拉式菜单和 快捷菜单。选择 Tools 菜单下的 Menu Editor...子菜单,即可 打开菜单编辑器。

菜单也可以通 过编程实现,方法 为从GUI设计窗口 的工具栏上选择 Menu Editor命令按 钮,打开菜单编辑 程序。

菜单编辑器包括菜单的设计和编辑,菜单编辑器有八个 快捷键,可以利用它们任意添加或删除菜单,可以设置菜单 项的属性,包括名称(Label)、标识(Tag)、选择是否显示分 、 、 隔线(Separator above this item)、是否在菜单前加上选中标 、 记(Item is checked)、调用函数(Callback)。 、 。

菜单编辑器左上角的第一个按钮用于创建一级菜单项。 第二个按钮用于创建一级菜单的子菜单。

菜单编辑器的左下角有两个按钮,选择第一个按钮, 可以创建下拉式菜单。选择第二个按钮,可以创建Context Menu菜单。选择它后,菜单编辑器左上角的第三个按钮就 会变成可用,单击它就可以创建Context Menu主菜单。在选 中已经创建的Context Menu主菜单后,可以单击第二个按钮 创建选中的Context Menu主菜单的子菜单。与下拉式菜单一 样,选中创建的某个Context Menu菜单,菜单编辑器的右边 就会显示该菜单的有关属性,可以在这里设置、修改菜单 的属性。

菜单编辑器左上角的第四个与第五个按钮用于对选中 的菜单进行左移与右移,第六与第七个按钮用于对选中的 菜单进行上移与下移,最右边的按钮用于删除选中的菜单。

5. 对象浏览器 对象浏览器(Object Browsers) 利用对象浏览器,可以查看当前设计阶段的各个句柄图 形对象。可以在对象浏览器中选中一个或多个控件来打开该 控件的属性编辑器。 对象浏览器的打开方式有: ① 从GUI设计窗口的工具栏上选择Object Browser命令按钮; ② 选择View菜单下的Object Browser子菜单; ③ 在设计区域单击鼠标右键, 选择弹出菜单的 Object Browser。

顺序编辑器( 6. Tab顺序编辑器(Tab Order Editor) 顺序编辑器 ) 利用Tab顺序编辑器(Tab Order Editor),可以设置用户按 键盘上的Tab键时,对象被选中的先后顺序。 Tab顺序编辑器的打开方式为: 顺序编辑器的打开方式为: 顺序编辑器的打开方式为 ① 选择Tools菜单下的Tab Order Editor...菜单项,就可以打开 Tab顺序编辑器。 ② 从GUI设计窗口的工具 栏上选择Tab Order Editor...命令按钮。

二、控件对象及属性
1. GUI控件对象类型 控件对象类型 控件对象是事件响应的图形界面对象。当某一事件发生 时,应用程序会做出响应并执行某些预定的功能子程序 (Callback). ) 2. 控件对象的描述 Matlab中的控件大致可分为两种,一种为动作控件 动作控件, 动作控件 鼠标点击这些控件时会产生相应的响应。一种为静态控件 静态控件, 静态控件 是一种不产生响应的控件,如文本框等。 每种控件都有一些可以设置的参数,用于表现控件的外 形、功能及效果,既属性。属性由两部分组成:属性名和属 性值,它们必须是成对出现的。

按钮(Push Buttons):执行某种预定的功能或操作; ① 按钮 : 开关按钮(Toggle Button):产生一个动作并指示一个二 ② 开关按钮 : 进制状态(开或关),当鼠点击它时按钮将下陷,并执 行callback(回调函数)中指定的内容,再次点击,按钮 复原,并再次执行callback 中的内容; 单选框(Radio Button):单个的单选框用来在两种状态之 ③ 单选框 : 间切换,多个单选框组成一个单选框组时,用户只能在 一组状态中选择单一的状态,或称为单选项; 复选框(Check Boxes):单个的复选框用来在两种状态之 ④ 复选框 : 间切换,多个复选框组成一个复选框组时,可使用户在 一组状态中作组合式的选择,或称为多选项; 文本编辑器(Editable Texts):用来使用键盘输入字符串 ⑤ 文本编辑器 : 的值,可以对编辑框中的内容进行编辑、删除和替换等 操作;

静态文本框(Static Texts):仅用于显示单行的说明文字; ⑥ 静态文本框 滚动条(Slider): 可输入指定范围的数量值; ⑦ 滚动条 : 边框(Frames):在图形窗口圈出一块区域; ⑧ 边框 : ⑨ 列表框 列表框(List Boxes):在其中定义一系列可供选择的字符 : 串; ⑩ 弹出式菜单(Popup Menus): 让用户从一列菜单项中选 弹出式菜单 : 择一项作为参数输入; 此外还有坐标轴(Axes), 用于显示图形和图象。

3. 控件对象的属性 控件对象的属性(Attributes of controller object) 用户可以在创建控件对象时,设定其属性值,未指定时 将使用系统缺省值。

两大类控件对象属性:第一类是所有控件对象都具有的 公共属性,第二类是控件对象作为图形对象所具有的属性。

① 控件对象的公共属性 Children 取值为空矩阵,因为控件对象没有自己的子对 象; Parent取值为某个图形窗口对象的句柄,该句柄表明了控 件对象所在的图形窗口; Tag取值为字符串,定义了控件的标识值,在任何程序中 都可以通过这个标识值控制该控件对象; Type 取值为uicontrol,表明图形对象的类型; UserDate取值为空矩阵,用于保存与该控件对象相关的 重要数据和信息; Visible取值为on 或off。

② 控件对象的基本控制属性
BackgroundColor取值为颜色的预定义字符或RGB数值;缺省值为浅 灰色; Callback取值为字符串,可以是某个M文件名或一小段Matlab语句, 当用户激活某个控件对象时,应用程序就运行该属性定义的子程序; Enable取值为on(缺省值),inactive和off; Extend取值为四元素矢量[0, 0, width, height],记录控件对象标题字符 的位置和尺寸; ForegroundColor取值为颜色的预定义字符或RGB数值,该属性定义 控件对象标题字符的颜色;缺省值为黑色; Max,Min取值都为数值,缺省值分别为1和0; , String取值为字符串矩阵或块数组,定义控件对象标题 标题或选项内容; 标题 Style取值可以是pushbutton(缺省值), radiobutton, checkbox, edit, text, slider, frame, popupmenu 或listbox; Units取值可以是pixels (缺省值), normalized(相对单位), inches, centimeters(厘米)或points(磅); Value取值可以是矢量,也可以是数值,其含义及解释依赖于控件对 象的类型。

③ 控件对象的修饰控制属性

FontAngle取值为normal(正体,缺省值), italic(斜 体), oblique(方头); FontName取值为控件标题等字体的字库名; FontSize取值为数值; FontUnits取值为points(缺省值), normalized, inches, centimeters或pixels; FontWeight取值为normal(缺省值), light,demi和bold, 定义字符的粗细; HorizontalAligment取值为left,center (缺省值) 或 right,定义控件对象标题等的对齐方式。

④ 控件对象的辅助属性 ListboxTop取值为数量值,用于listbox控件对象; SliderStep取值为两元素矢量[minstep,maxstep],用于 slider控件对象; Selected取值为on 或off(缺省值) ; SlectionHoghlight取值为on 或off(缺省值) 。 ⑤ Callback管理属性 管理属性 BusyAction取值为cancel或queue(缺省值) ; ButtDownFun取值为字符串,一般为某个M文件名或 一小段Matlab程序; Creatfun 取值为字符串,一般为某个M文件名或一小 段Matlab程序; DeletFun取值为字符串,一般为某个M文件名或一小 段Matlab程序; HandleVisibility取值为on(缺省值), callback或off; Interruptible取值为on 或off(缺省值) 。

4. 控件对象的建立 在对话框上有各种各样的控件,利用这些控件可以实现 有关控制。 Matlab提供了用于建立控件对象的函数uicontrol,其调 用格式为: 对象句柄=uicontrol(图形窗口句柄,属性名1,属 性值1,属性名2,属性值2,…) 其中各个属性名及可取的值和后面将介绍的uimenu函数相似, 但也不尽相同。 例1 建立数制转换对话框。在左边输入一个十进制整数和 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='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;

所建立的数制转换对话框如下:

例2 建立图形演示对话框。在编辑框输入绘图命令,单 击“绘图”按钮能在左边坐标轴得到所对应的图形,弹出 框提供色图控制,列表框提供坐标网格线和坐标边框控制。

程序如下:

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)'); set(hlist,'Call','COMM(hedit,hpopup,hlist)'); set(hpopup,'Call','COMM(hedit,hpopup,hlist)');

程序调用了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 所建立的图形演示对 话框如右图所示:

三、菜单设计
1. 建立用户菜单 建立自定义的用户菜单的函数为uimenu,格式为: Hm=uimenu(Hp,属性名1,属性值 ,属性 ,属性名 ,属性值1, 名2,属性值 ,…) ,属性值2, 功能:创建句柄值为Hm的自定义的用户菜单。其中Hp为 功能: 为 其父对象的句柄,属性名和属性值构成属性二元对,定义 其父对象的句柄 用户菜单的属性。

因其调用方法不同,该函数可以用于建立一级菜单项和 子菜单项。

建立一级菜单项的函数调用格式为: 建立一级菜单项的函数调用格式为: 一级菜单项的函数调用格式为 一级菜单项句柄=uimenu(图形窗口句柄,属性名1, 图形窗口句柄,属性名 , 一级菜单项句柄 图形窗口句柄 属性值1,属性名2,属性值2, 属性值 ,属性名 ,属性值 ,…) 建立子菜单项的函数调用格式为: 建立子菜单项的函数调用格式为: 子菜单项的函数调用格式为 子菜单项句柄=uimenu(一级菜单项句柄,属性名 一级菜单项句柄, 子菜单项句柄 一级菜单项句柄 1,属性值1,属性名2,属性值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函数访问该属性。 例3 建立“图形演示系统”菜单。菜单条中含有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','Call','set(gcf,''Color'',''y'');'); uimenu(hfigcor,'Label','&White','Call','set(gcf,''Color'',''w'');'); %定义Quit菜单项 uimenu(gcf,'Label','&Quit','Call','close(gcf)');

所建立的“图形演示系统”菜单如下:

例4 建立一个菜单系统。 菜单条中含有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'')']);

所建立的菜单系统如下:

3. 快捷菜单 快捷菜单是用鼠标右键单击某对象时在屏幕上弹出的菜 单。这种菜单出现的位置是不固定的,而且总是和某个图形 对象相联系。 在Matlab中,可以使用uicontextmenu函数和图形对象的 UIContextMenu属性来建立快捷菜单,具体步骤为: 利用uicontextmenu函数建立快捷菜单 函数建立快捷菜单,格式为: ① 利用 函数建立快捷菜单 hc=uicontextmenu 功能: 功能:建立快捷菜单,并将句柄值赋给变量hc。 利用uimenu函数为快捷菜单建立菜单项 函数为快捷菜单建立菜单项,格式为: ② 利用 函数为快捷菜单建立菜单项 uimenu(‘快捷菜单名’,属性名,属性值,...) 快捷菜单名’ 属性名,属性值, 快捷菜单名 功能: 功能:为创建的快捷菜单赋值,其中属性名和属性值构成属 性二元对。 利用set函数将该快捷菜单和某图形对象联系起来 函数将该快捷菜单和某图形对象联系起来。 ③ 利用 函数将该快捷菜单和某图形对象联系起来。

例5 绘制曲线 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为句柄的图形 窗口进行打印预览。

如右图所示,打印 预览对话框上有5个 按钮。

⑦ 打印对话框 为Windows的标准对话框,函数为 printdlg ,格式为: printdlg:对当前图形窗口打开Windows打印对话框; printdlg(fig):对以fig为句柄的图形窗口打开Windows打 印对话框; printdlg(‘-crossplatform’,fig):打开crossplatform 模式的 Matlab打印对话框; printdlg(-‘setup’,fig):在打印设置模式下,强制打开打 印对话框。

2. Matlab专用对话框 专用对话框 Matlab除了使用公共对话框外,还提供了一些专用对话 框,包括帮助、错误信息、信息提示、警告信息等。 ① 错误信息对话框 用于提示错误信息,函数为errordlg ,其调用格式为: errordlg errordlg:打开默认的错误信息对话框; errordlg(‘errorstring’):打开显示’errorstring’信息的错误 信息对话框; errordlg(‘errorstring’,’dlgname’):打开显示’errorstring’信 息的错误信息对话框,对话框的标题由‘dlgname’指定; erordlg(‘errorstring’,’dlgname’,’on’):打开显 示’errorstring’信息的错误信息对话框,对话框的标题由 ‘dlgname’指定。如果对话框已存在,’on’参数将对话框 显示在最前端; h=errodlg(…):返回对话框句柄。

例6 errordlg('输入错误,请重新输入','错误信息')

② 帮助对话框 用于帮助提示信息,函数为helpdlg ,其调用格式为: helpdlg:打开默认的帮助对话框; helpdlg(‘helpstring’):打开显示‘errorstring’信息的帮助 对话框; helpdlg(‘helpstring’,‘dlgname’):打开显示‘errorstring’ 信息的帮助对话框, 对话框的标题由‘dlgname’指定; h=helpdlg(…):返回对话框句柄。 例7 helpdlg('矩阵尺寸必须相等','在线帮助')

③ 输入对话框 用于输入信息,函数为inputdlg ,其调用格式为: 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.

例8 创建两个输入窗口的输入对话框。 prompt={'Input Name','Input Age'}; title='Input Name and Age'; lines=[2 1]'; def={'John Smith','35'}; answer=inputdlg(prompt,title,lines,def); ④ 列表选择对话框 用于在多个选项中选择需要的值,函数为listdlg,其调 用格式为: [selection,ok]=listdlg(‘Liststring’,S,…) 输出参数selection为一个矢量,存储所选择的列表项的索引 号,输入参数为可选项’Liststring’(字符单元数组), ’SelectionMode’(’single’或’multiple(缺省值)’), 等 ’ListSize’([wight,height]), ’Name’ (对话框标题)等。

⑤ 信息提示对话框 用于显示提示信息,函数为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(…):返回对话框句柄。

⑥ 问题提示对话框 用于回答问题的多种选择,函数为questdlg,格式为: button=questdlg(‘qstring’):打开问题提示对话框,有三个 按钮,分别为:Yes,No和Cancel,’questdlg’确定提示信息; button=questdlg(‘qstring’,’title’): … title确定对话框标题; button=questdlg(‘qstring’’title’,’default’):当按回车键时, 返回‘default’的值,‘default’ 必须是Yes,No或Cancel 之一; 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之一。

⑦ 进程条 以图形方式显示运算或处理的进程,函数为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指定。

例9 创建并使用进程条。 h=waitbar(0,'pleas wait...'); for i=1:10000 waitbar(i/10000,h) end close(h) ⑧ 警告信息对话框 用于提示警告信息,函数为warndlg,其调用格式为: h=warndlg(‘warningstring’,’dlgname’) 打开警告信息对话框,显示‘warningstring’信息, ‘dlgname’确定对话框标题,h为返回的对话框句柄。

四、GUI程序设计 程序设计
包括图形用户界面的设计和功能设计两个方面。 例10 使用Push Button按钮与静态文本框设计GUI,在窗口 中显示单击按钮次数。 (1) 在界面上安装一个命 令按钮和一个静态文本框 (2) 使用对象的属性窗口设 置控件的属性

(3) 打开该GUI的 m 文件ex10.m,该文件中已经自动生成了 许多代码。找到函数 function pushbutton1_Callback(hObject, eventdata, handles) 在这个函数名称下面写入如下程序段: persistent c if isempty(c) c=0 end c=c+1; str=sprintf('Total Clicks: %d',c); set(handles.text1,'String',str); 保存程序后,单击Click按 钮,则在什么的文本框中 显示单击次数。

例11 制作一个简易的加减法计算器。 (1) 在界面上安装两个编 辑文本框、一个静态文本 框与两个命令按钮 (2) 使用对象的属性窗口设 置控件的属性

打开该GUI的 m 文件ex11.m,在函数 pushbutton1_Callback 与 pushbutton2_Callback 中加入代码,如下所示: (3) function pushbutton1_Callback(hObject, eventdata, handles) s1=str2double(get(handles.edit1,'String')) s2=str2double(get(handles.edit2,'String')) set(handles.text1,'String',s1+s2); function pushbutton2_Callback(hObject, eventdata, handles) s1=str2double(get(handles.edit1,'String')) s2=str2double(get(handles.edit2,'String')) set(handles.text1,‘String’,s1-s2);

例12 使用3个单选钮控制静态文本框的背景颜色。

function radiobutton1_Callback(hObject, eventdata, handles) set(handles.text1,'BackGroundColor','r') function radiobutton2_Callback(hObject, eventdata, handles) set(handles.text1,'BackGroundColor','g') function radiobutton3_Callback(hObject, eventdata, handles) set(handles.text1,'BackGroundColor','b')

例13 使用滚动条。

function slider1_Callback(hObject, eventdata, handles) v=get(handles.slider1,'Value'); str=sprintf('%.2f',v); set(handles.text1,'String',str);

例14 制作一个根据密度与体积计算质量的简易计算器。 (1) 在界面上布置控件对 象。 (2) 使用对象的属性窗口设 置控件的属性。

例15 使用程序把基本控件安装在图形窗口上。
h1=uicontrol('style','edit','TooltipString','Edit Text') h2=uicontrol('style','checkbox','Position',[90,20,30,20],'TooltipString','Checkbox') h3=uicontrol('style','listbox','Position',[150,20,40,20],'TooltipString','Listbox') h4=uicontrol('style','pushbutton','Position',[210,20,30,20],'TooltipString','Pushbutton') h5=uicontrol('style','radiobutton','Position',[260,20,30,20],'TooltipString','Radiobutton') h6=uicontrol('style','slider','Position',[310,20,30,20],'TooltipString','Slider') h7=uicontrol('style','text','Position',[370,20,30,20],'TooltipString','Static Text') h8=uicontrol('style','toggle','Position',[430,20,30,20],'TooltipString','Togglebutton')

上面程序虽 然实现了控件的 安装,但是,还 不能完成具体的 功能。如果要完 成特定的功能, 需要加入其他语 句。

例16 在图形窗口底部安装一个命令按钮、一个可编辑文本 框、一个静态文本框。针对命令按钮(pushbutton)编写程 序,使程序运行后,点击该命令按钮,便随机绘制出一些折 线;同时可编辑文本框背景色变为蓝色,静态文本框背景色 变为红色。

主程序设计如下: h1=uicontrol('style','pushbutton','Position',[280,0,50,20]) set(h1,'String','PUSH','Callback','fun')

主程序只创建安装了一个Pushbutton按钮,然后,在set语句 中使用Callback属性调用函数fun。

函数fun代码如下: function fun plot(rand(3,5)) h2=uicontrol('style','edit','TooltipString', 'Edit Text','Position',[80,0,30,20]) h3=uicontrol('style','text','Position', [440,0,30,20],'TooltipString','Static Text') set(h2,'BackGroundColor',[0 0 1]) set(h3,'BackGroundColor',[1 0 0]) 在函数fun中除了绘图之外,还制作了一个Edit Text、一个 Static Text,并且把这两个控件的背景色设置为蓝色 [0 0 1]与红色[1 0 0]。

例17 制作依附于某对象的弹出式菜单。

编写程序如下: m=uicontextmenu; subplot(1,3,1) h1=line([1,2],[2,2],'LineWidth',8,'UIContextMenu',m) c1=['subplot(1,3,2);line([1 2],[1 3])']; c2=['subplot(1,3,3);plot(rand(2))']; uimenu(m,'Label','line','Callback',c1); uimenu(m,'Label','plot','Callback',c2);

程序运行后,先绘制出右图第一个图所示图形,在蓝色 宽条上单击鼠标右键,出现菜单,菜单上有两个选项line 与plot,选择line绘制出右图第二个图所示线段;选择plot 绘制出右图第三个图所示两条(随机)线段。

例18 用于绘图和图形旋转的GUI。 布置控件:一个坐标系、一个文本框、一个复选框, ① 布置控件 一个按钮; 定义文本框的属性: ② 定义文本框的属性:String---简单设计示例, FontName---隶书,FontSize—22; 定义坐标系: ③ 定义坐标系 Visible—off; 定义按钮属性: ④ 定义按钮属性 String—开始绘图,FontName, ForegroundColor, FontSize, BackgroundColor,Callback--surf(peaks(30)); 定义复选框: ⑤ 定义复选框 String—3D旋转,Callback—rotate3d。

布局编辑器中编辑完 成的图形用户界面

运行所创建的图 形用户界面程序

点击按钮的结果

选择三维旋转功 能后对图形进行 的旋转操作

例19 设计一个简单信号分析仪的程序,要求根据输入的 两个频率和时间间隔,计算函数 x=sin(2πf1t)+sin(2πf2t) 的 值,并对函数进行快速傅立叶变换,最后分别绘制时域和 频域的曲线。 (一)设计图形界面 设计步骤: 在布局编辑器中布置控件:本例中使用了2个坐标系、 3个文本编辑框、1个按钮和3个静态文本框; 使用几何位置排列工具对控件的位置进行调整: 设计控件的属性:为显示美观,首先将文本编辑框 和静态文本框的字号分别设置为20和16,将3个静态文 本框的标题分别改为“频率1”、“频率2”和“时间”, 将按钮的标题改为“绘图”。 设置其他绘图属性。如设置主窗口的标题为“信号 分析仪”。

上述步骤基本完成了图形界面的设计,如下图所示:

上述图形界面设计运行后显示的 图形如下: 其设置如右图所示

(二)设置控件的标识 控件的标识(Tag)用于对各控件的识别。每个控件在创 建时都会由开发环境自动产生一个标识,在程序设计中, 为了编辑、记忆和维护的方便,一般为控件设置一个新的 标识。 本例设置第一个坐标轴的标识为:frequency_axes, 用 于显示频域图形; 第二个坐标轴的标识为:time_axes, 用于 显示时域图形。三个文本编辑框的标识为f1_input, f2_input, f1_input, t_input,分别用于输入两个频率和自变量时间的间隔。由于 不需要返回3个静态文本框和按钮的值,这些控件的标识 可以使用缺省值。 (三)编写代码 GUI图形界面的功能,还是要通过一定的设计思路和 计算方法,由特定的程序来实现。为了实现程序的功能, 还需要在运行程序前编写一些代码,完成程序中变量的赋 值、输入输出、计算及绘图等工作。

1. 设置对象的初始值 分别设置三个文本编辑框的初始值为: f1_input=20 f2_input=50 t_input=0:0.001:0.5 2. 编写代码 为按钮的调用函数编写代码,这段代码放在按钮的调用函 数pushbutton1_Callback()中,代码包括以下部分: 获得用户输入的数据。 (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(handles.frequency_axes) plot(f,m(1:257)) set(handles.frequency_axes,'XminorTick','on') grid on (4)在第二个坐标轴中绘制时域曲线。 )在第二个坐标轴中绘制时域曲线。 axes(handles.time_axes) %选择适当的坐标轴 plot(t,x) set(handles.time_axes,'XminorTick','on') grid on 3. 运行程序


相关文档

更多相关文档

10分钟搞定网络图
十分钟搞定区块链入门
这道菜的做法非常简单哦,10分钟就搞定,简单又快手
十分钟内搞定文章开头
10分钟教你搞定那些不听话的字和词
10分钟搞定核心员工的面试
10分钟搞定营养早餐!大家快来看一看吧!
十分钟搞定清新妆 OL族不再怕迟到
想把白粥煮得又滑又粘稠?只用一招,10分钟搞定!
快上车! 10分钟搞定《倚天屠龙记》
10分钟搞定matlabGUI
《一个实例搞定MATLAB界面编程》续——浅谈 GUIDE 和Simulink混合编程
matlabGUI设计
matlabGUI
一个实例搞定MATLAB界面编程
电脑版