图像用户界面,GUI,作为包含了使用户能执行交互式任务的设备或组件图像显示,在许多程序设计软件中都是不可缺少的功能。这次,我们就来了解下MATLAB中的GUI。
首先,先谈下GUI基础,也是今后操作必须熟悉的知识。在MATLAB中,每一个图形对象都会有唯一 一个句柄和一组定义图形对象外观的属性。句柄,可以理解成是图形“身份证”,见它犹如见本人。用户能够使用这些句柄图像控制图像的行为和外观。(句柄图像今后的博客会谈及)。图形对象包括了Uimenu和Uicontrol对象,以及图形、坐标轴、文本及子对象。
看那么多文字,难免会厌烦,先让我们看下GUI的经典应用吧:
对于传递函数G=1/s.^2+2*s*zeta+1的归一化二阶系统,制作绘制该系统单 位阶跃响应的图形用户界面
1)这是打开的界面
2)
3)
4)点击grid on按钮,会生成网格线
clc clear all; %产生图形窗口和坐标轴 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); %在坐标右轴生成静态文本框和编辑框 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','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);',... 's2=tf(1,[1 2*z(k) 1]);',... 'y(:,k)=step(s2,t);',... 'plot(t,y(:,k));',... 'if (length(z)>1),hold on,end,',... 'end;','hold off,']); %生成坐标网格按钮 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');
接下来,就进入到正题,我们这次就先了解下“菜单”。
1.菜单的布置
建立菜单项的语法格式:hm=uimenu(Hx_parent,'PropertyName',PropertyValue,...)
hm——菜单项句柄 Hx_parent——默认父辈对象的句柄
Uimenu对象中最重要的属性是:'Label'和'Callback'。
'Label'属性值是菜单条和下拉菜单项上的文本字符串,以确认菜单项。
'Callback'属性值是MATLAB字符串,当选中菜单项时,它传给eval,用以执行。
删除或恢复所有标准菜单:
h=figure(1); set(h,'Menubar','none'); %删除 set(h,'Menubar','figure'); %恢复
我们就看下最简单的菜单实例吧,通过下面的代码认识创建的过程:
clc h=figure(1); set(h,'Menubar','none'); hm_ex=uimenu(gcf,'Label','Example'); %Example菜单下的子菜单 hm_exgrid=uimenu(hm_ex,'Label','Grid'); hm_exview=uimenu(hm_ex,'Label','View'); hm_box=uimenu(hm_ex,'Label','Axis Box','CallBack',[... 'if strcmp(get(gca,''Box''),''on''),',... 'set(gca,''Box'',''off''),',... 'set(hm_box,''Checked'',''off''),',... 'else,',... 'set(gca,''Box'',''on''),',... 'set(hm_box,''Checked'',''on''),',... 'end']); %View菜单下的子菜单 hm_ex2D=uimenu(hm_exview,'Label','2_D'); hm_ex3D=uimenu(hm_exview,'Label','3_D'); %第二个顶层菜单Close hm_close=uimenu(gcf,'Label','Close'); hm_clfig=uimenu(hm_close,'Label','Close Figure','CallBack','Close'); hm_clmenu=uimenu(hm_close,'Label','Remove Menu');
‘Label’后面跟的是该菜单的名字,而‘CallBack’后面跟的是回调字符串,关于回调属性后面再详说。
如图,我们创建了两个菜单Example和CLose,然后Example下面还有三个子菜单,而View菜单下面也还有两个子菜单。
2)定义系统快捷键(在X Window系统)
hm_top=uimenu('Label','Example'); uimenu(hm_top,'Label','&Grid');
——定义了键盘上G为快捷键。注&后面跟的字母即为快捷键!
注意:不可以为顶层菜单定义快捷键···
3)菜单的外观
三个属性值:'Position'、'Checked'和'Separator'
Position
改变菜单位置:set(hm_1,'Position',1);
得到菜单位置:get(hm_2,'Position');
Checked——使校验标记出现在菜单项标志的左边,默认'off'
改变菜单项标志本身:
例:
hm_box=uimenu(hm_ex,'Label','Axis Box','CallBack',[... 'if strcmp(get(gca,''Box''),''on''),',... 'set(gca,''Box'',''off''),',... 'set(hm_box,''Label'',''Set Box on''),',... 'else,',... 'set(gca,''Box'',''on''),',... 'set(hm_box,''Label'',''Set Box off''),',... 'end']);
选中Axis Box后,右边会出现打钩的标记!
Separator——将下拉菜单分成局部组
set(hm_box,'Separator','on');
菜单的颜色控制:
'BackGroundColor'控制填充菜单背景的颜色
'ForeGroundColor'确定菜单项文本的颜色,默认黑色
%第三个顶层菜单Color hm_color=uimenu(gcf,'Label','Color'); hm_submenu1=uimenu(hm_color,'Label','Red','CallBack','set (gcf,''Color'',''Red'')'); hm_submenu2=uimenu(hm_color,'Label','Blue','CallBack','set (gcf,''Color'',''Blue'')');
菜单项去能(菜单可见但不能被选择)
set(hm,''Enable'',''off'');
关于菜单的回调属性,下次和句柄图形一起说明。