第十章 图形用户界面(GUI)制作
10.1 入门
【例 10.1-1】对于传递函数为
G
1
2
s
1
2
s
的归一化二阶系统,制作一个能绘制该系统
单位阶跃响应的图形用户界面。本例演示:(A)图形界面的大致生成过程;(B)静态文
本和编辑框的生成;(C)坐标网格控制键的形成;(D)如何使用该界面。
(1)产生图形窗和轴位框:如图 10.1-1 所示。
clf reset
H=axes('unit','normalized','position',[0,0,1,1],'visible','off');
set(gcf,'currentaxes',H);
str='\fontname{隶书}归一化二阶系统的阶跃响应曲线';
text(0.12,0.93,str,'fontsize',13);
h_fig=get(H,'parent');
set(h_fig,'unit','normalized','position',[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',[0 15],'ylim',[0 1.8],'fontsize',8);
图 10.1-1 产生坐标轴
(2)在坐标框右侧生成作解释用的“静态文本”和可接收输入的“编辑框”:如图 10.1-2
所示。
h_text=uicontrol(h_fig,'style','text',...
'unit','normalized','position',[0.67,0.73,0.25,0.14],...
'horizontal','left','string',{'输入阻尼比系数','zeta ='});
h_edit=uicontrol(h_fig,'style','edit',...
1
'unit','normalized','position',[0.67,0.59,0.25,0.14],...
'horizontal','left',...
'callback',[...
'z=str2num(get(gcbo,''string''));',...
't=0:0.1:15;',...
'for k=1:length(z);',...
'y(:,k)=step(1,[1 2*z(k) 1],t);',...
'plot(t,y(:,k));',...
'if (length(z)>1) ,hold on,end,',...
'end;',...
'hold off,']);
图 10.1-2 在图形界面中添加编辑框和文本框
(3)形成坐标网格控制按键:如图 10.1-3 所示。
h_push1=uicontrol(h_fig,'style','push',...
'unit','normalized','position',[0.67,0.37,0.12,0.15],...
'string','grid on','callback','grid on');
h_push2=uicontrol(h_fig,'style','push',...
'unit','normalized','position',[0.67,0.15,0.12,0.15],...
'string','grid off','callback','grid off');
2
图 10.1-3 添加了两个按键的图形界面
(4)输入阻尼比系数,可得单位阶跃响应曲线:如图 10.1-4 和图 10.1-5 所示。
图 10.1-4 输入标量阻尼比所得到的响应曲线
图 10.1-5 输入阻尼比数组所得到的一组响应曲线
10.2 图形用户界面的设计原则和一般步骤
3
10.2.1
10.2.2
设计原则
一般制作步骤
10.3 界面菜单(uimenu)
图形窗的标准菜单
10.3.1
【例 10.3-1】本例说明:如何隐藏和恢复标准菜单的显示。
(1)获得缺省设置的标准菜单(如图 10.3-1 所示)
figure
(2)隐去标准菜单的两种方法(如图 10.3-2 所示)
set(H_fig , 'MenuBar','none');
set(gcf,'menubar',menubar);
(3)恢复图形窗上标准菜单(如图 10.3-1 所示)
set(gcf,'menubar','figure');
图 10.3-1 含有菜单条的图形窗
图 10.3-2 移去菜单条的图形窗
自制的用户菜单
10.3.2
【例10.3-2】本例目标:创建如图10.3-3那样的菜单,Color菜单项及其下拉的Blue菜单各带
一个简捷键,而另一项下拉菜单Red带一个快捷键。
编写如下程序:
[exm103_2.m]
figure
h_menu=uimenu(gcf,'Label','&Color');
h_submenu1=uimenu(h_menu,'Label','&Blue',...
'Callback','set(gcf,''color'',''blue'')');
h_submenu2=uimenu(h_menu,'label','Red',...
'Callback','set(gcf,''color'',''red'')',...
'Accelerator','r');
4
图 10.3-3 用户菜单及快捷键设置
用户菜单的属性
10.3.3
【例 10.3-3】本例的目标是:在图形窗上自制一个名为【Test】的“顶层菜单项”;当用鼠
标点动该菜单项时,将产生一个带分格的封闭坐标轴。通过本例说明:(A)回调属性的运
作机理;(B)用户顶层菜单项的制作(C)uimenu 属性的设置方法;(D)复杂字符串的
构成方法和注意事项。
(1)产生图 10.3-4 界面的 uimenu 的书写格式一:
uimenu('Label','Test','Callback','grid on,set(gca,''box'',''on''),')
图 10.3-4 通过顶层菜单 Test 形成的带分格的封闭坐标轴
(2)产生图 10.3-4 界面的 uimenu 的书写格式二:
uimenu('Label','Test', ...
'Callback',['grid on,' , ...
'set(gca,''box'',''on'');'])
(4)产生图 10.3-4 界面的 uimenu 的书写格式三:
Lpv='Test';
Cpv=['grid on,','set(gca,''box'',''on''),'];
uimenu('Label', Lpv, 'Callback' , Cpv)
(5)产生图 10.3-4 界面的 uimenu 的书写格式四:
PS.Label='Test';
PS.Callback=['grid on;','set(gca,''box'',''on'');'];
uimenu(PS)
10.3.4
【例 10.3-4】目标:绘制一条 Sa 曲线,创建一个与之相联系的现场菜单,用以控制 Sa 曲线
的颜色(图 10.3-5)。
现场菜单的制作
5
(1)编写脚本 M 文件 exm103_4.m
[exm103_4.m]
t=(-3*pi:pi/50:3*pi)+eps;
y=sin(t)./t;
hline=plot(t,y);
cm=uicontextmenu;
%制作具体菜单项,定义相应的回调
uimenu(cm,'label','Red','callback','set(hline,''color'',''r''),')
uimenu(cm,'label','Blue','callback','set(hline,''color'',''b''),')
uimenu(cm,'label','Green','callback','set(hline,''color'',''g''),')
set(hline,'uicontextmenu',cm)
(2)在指令窗中运行文件 exm103_4.m ,得到图 10.3-5 所示的(但为蓝色的)Sa 曲线。
图 10.3-5 Context 菜单
10.4 用户控件(uicontrol)
10.4.1
10.4.2
10.4.3
控件制作函数
用户控件的种类
控件制作示例
一 双位按键、无线电按键、控件区域框示例
【例 10.4-1】目标:创建一个界面(图 10.4-1)包含 4 种控件:静态文本、“无线电”选择
开关、双位按键、控件区域框。
编写 M 脚本文件 exm104_1.m ,运行该文件便可得如图 10.4-1 所示的界面。
[exm104_1.m]
clf reset
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);
6
set(h_axes,'xlim',[0,2*pi]);
set(gcf,'defaultuicontrolhorizontal','left');
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]);
set(hr1,'value',get(hr1,'Max'));
set(hr1,'callback',[...
'set(hr1,''value'',get(hr1,''max'')),',...
'set(hr2,''value'',get(hr2,''min'')),',...
'set(htitle,''fontangle'',''normal''),',...
]);
hr2=uicontrol(gcf,'style','radio',...
'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
图 10.4-2 静态文本、滑动键以及检录框
二 静态文本框、滑动键、检录框示例
【例 10.4-2】目标:制作演示“归一化二阶系统单位阶跃响应”的交互界面(图 10.4-2)。
在该界面中,阻尼比可在[0.02,2.02]中连续调节,标志当前阻尼比值;可标志峰值时间和大
小;可标志(响应从 0 到 0.95 所需的)上升时间。本例涉及以下主要内容:(A)静态文本
的创建和实时改写。(B)滑动键的创建;'Max' 和 'Min' 的设置;'Value' 的设置和获取。(C)
检录框的创建;'Value' 的获取。(D)受多个控件影响的回调操作。
[exm104_2.m]
clf reset
set(gcf,'unit','normalized','position',[0.1,0.2,0.64,0.35]);
set(gcf,'defaultuicontrolunits','normalized');
set(gcf,'defaultuicontrolfontsize',12);
set(gcf,'defaultuicontrolfontname','隶书');
set(gcf,'defaultuicontrolhorizontal','left');
str='归一化二阶系统阶跃响应曲线';
set(gcf,'name',str,'numbertitle','off');
h_axes=axes('position',[0.05,0.2,0.6,0.7]);
set(h_axes,'xlim',[0,15]);
str1='当前阻尼比=';
t=0:0.1:10;z=0.5;y=step(1,[1 2*z 1],t);
hline=plot(t,y);
htext=uicontrol(gcf,'style','text',...
'position',[0.67,0.8,0.33,0.1],...
'string',[str1,sprintf('%1.4g\',z)]);
hslider=uicontrol(gcf,'style','slider',...
'position',[0.67,0.65,0.33,0.1],...
'max',2.02,'min',0.02,...
'sliderstep',[0.01,0.05],...
'Value',0.5);
8