程序的用户界面是用户与计算机程序交互的方式。用户通过键盘、鼠标等输入设备与计算机交换信息。图形用户界面(GUI)是包含图形对象,如窗口、图标、菜单和文本的用户界面。用户以某种方式选择或激活这些对象,会引起动作或发生变化,例如调用计算机程序或者绘图。
用户界面(或接口)是指:人与机器(或程序)之间交互作用的工具和方法。如键盘、鼠标、跟踪球、话筒都可成为与计算机交换信息的接口。
图形用户界面(Graphical User Interfaces,GUI)则是由窗口、光标、按键、菜单、文字说明等对象(Objects)构成的一个用户界面。用户通过一定的方法(如鼠标或键盘)选择、激活这些图形对象,使计算机产生某种动作或变化,比如实现计算、绘图等。
GUI对象可以由M文件或GUIDE创建,下面介绍这两种方法的应用。
GUI设计工具包括以下几个:
MATLAB为用户提供了4个GUI模式供用户选择,分别是空白版(Blank GUI)、带有控件的模板(GUI with Uicontrols)、带有坐标轴和菜单的模板(GUI with Axes and Menu)和问答式对话框(Modal Questions Dialog)。一般选择默认模式(即Blank GUI)进入对象设计编辑器如下图所示。
【例】对于传递函数为的归一化二阶系统,制作一个能绘制该系统单位阶跃响应的图形用户界面。
首先在MATLAB中输入以下程序:
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);',...
'y(:,k)=step(1,[1 2*z(k) 1],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');
在MATLAB中GUIDE提供了多种设计模板,用户可以很轻松地定制属于自己的GUI对象,同时自动生成对应的M文件框架,这样就简化了GUI应用程序的创建工作。用户可以直接使用该框架来编写自己的函数代码。GUIDE模板中包含了相关回调函数,可以打开对应的M文件,查看工作方式或者修改函数,实现用户所需要的功能。
在GUI控件对象中,界面菜单是一个重要组成部分。从句柄图形对象结构中,Uimenu对象的结构体系以Figure图形窗口为父对象,和Axes坐标轴、Unicontrol界面控件为平等级别的组建。
在MATLAB中,可以根据需要在GUI对象中创建标准菜单,自行设置菜单或者创建现场菜单等。同时,可以设置菜单控件的各种属性,例如添加快捷键、设置对应的回调函数等。因此,在GUI对象中,可以设置菜单控件来完成多种功能。对于比较简单的GUI对象,可以根据需要定制MATLAB图形窗口的标准菜单,设置不同的菜单属性。
【例】创建一个简单的GUI对象,根据需要定制标准菜单。
解:创建一个默认的图形窗口。在MATLAB的命令行窗口中输入下面的命令代码:
Handle_figure=figure;
查看图形结构。输入上面的代码后,按“Enter”键,得到默认的图形窗口,如下图所示。
GUI系统中,回调函数扮演着非常重要的角色。一般情况下,应用程序调用系统提供的函数完成自己的工作,系统函数由系统内部实现,应用程序调用;和系统提供的函数不同,回调函数一般有应用程序实现,由系统调用。
在C语言中,回调函数使用函数指针来实现。通常,我们需要通过某种接口告诉系统已定义好的回调函数指针,系统保存这个指针,然后在需要的时候通过这个指针来调用由应用程序定义的回调函数。
现场菜单就是当用户用右键选择对象后,弹出的快捷菜单选项。因此,可以认为现场菜单和某个图形对象相联系,并通过鼠标右键来激活。
创建现场菜单的一般步骤如下:
1.利用命令ufcontextnenu创建现场菜单对象;
2.利用命令uinenu来设置该现场菜单对象的具体属性;
3.利用命令set将现场菜单和图形对象联系起来。
现场菜单也属于MATLAB的图形对象之一,因此可以使用GUIDE来创建现场菜单,也可以直接使用M文件来创建现场菜单。
4.1.编写GUI的程序代码
【例】创建一个GUI画图模型
在MATLAB编辑器中输入以下代码:
clear all
clc
%建立一个图像框
fig=figure(1);
set(fig,'position',[256 198 420 360],'name','GUI example','numbertitle','off','menubar','none');
axes_h=axes('position',[0.1 0.1 0.8 0.6]);
set(gcf,'currentaxes',axes_h);
text(0.25,0.93,'\fontname{标楷体}GUI-Plot example','fontsize',15);
uicontrol(fig,'style','pushbutton','string','plot','position',[280 290 100 30],...
'callback',['x=eval(get(t1,''string''));y=eval(get(t2,''string''));'...
'p=plot(x,y);xlabel(''x'');ylabel(''y'');']);
t1=uicontrol(fig,'style','edit','position',[170 320 100 30],'string','linspace(0,2*pi)','fontsize',8);
t2=uicontrol(fig,'style','edit','position',[170 270 100 30],'string','sin(linspace(0,2*pi))','fontsize',8);
uicontrol(fig,'style','text','position',[50 320 105 30],'string',{'please input ordinate','x='});
uicontrol(fig,'style','text','position',[50 270 105 30],'string',{'please input ordinate','y='});
Option_menu=uimenu(gcf,'label','&Option');
type=uimenu(Option_menu,'label','&Type');
uimenu(type,'label','&Solid','position',1,'callback','set(p,''linestyle'',''-'')');
uimenu(type,'label','&Dashed','position',3,'callback','set(p,''linestyle'',''--'')');
uimenu(type,'label','D&otted','position',2,'callback','set(p,''linestyle'','':'')');
uimenu(type,'label','D&ashdot','position',4,'callback','set(p,''linestyle'','':'')');
symbol=uimenu(Option_menu,'label','&Symbol','separator','on');
uimenu(symbol,'label','Circle(o)','callback','set(p,''linestyle'',''o'')');
uimenu(symbol,'label','X_mark(x)','callback','set(p,''linestyle'',''x'')');
uimenu(symbol,'label','Star(*)','callback','set(p,''linestyle'',''*'')');
uimenu(symbol,'label','Diamond(d)','callback','set(p,''linestyle'',''d'')');
uimenu(symbol,'label','Triangle_up(^)','callback','set(p,''linestyle'',''^'')');
uimenu(symbol,'label','Triangle_right(>)','callback','set(p,''linestyle'',''>'')');
uimenu(symbol,'label','Hexagram(h)','callback','set(p,''linestyle'',''h'')');
color=uimenu(Option_menu,'label','&Color','separator','on');
uimenu(color,'label','&Blue','callback','set(p,''color'',''b'')');
uimenu(color,'label','&Green','callback','set(p,''color'',''g'')');
uimenu(color,'label','&Red','callback','set(p,''color'',''r'')');
uimenu(color,'label','&Cyan','callback','set(p,''color'',''c'')');
uimenu(color,'label','&Magenta','callback','set(p,''color'',''m'')');
uimenu(color,'label','&Yellow','callback','set(p,''color'',''y'')');
uimenu(color,'label','Blac&k','callback','set(p,''color'',''k'')');
Grid_menu=uimenu(gcf,'label','&Grid');
check1=uimenu(Grid_menu,'label','Gridon','callback',['set(check1,''Checked'',''on'');'...
'set(check2,''Checked'',''off'');GRID ON;'],'accelerator','y');
heck2=uimenu(Grid_menu,'label','Grid off','callback',['set(check2,''Checked'',''on'');'...
'set(check1,''Checked'',''off'');GRID OFF;'],'accelerator','z');
rwm=uicontextmenu;
uimenu(rwm,'label','Width_2','callback','set(p,''linewidth'',2)');
uimenu(rwm,'label','Width_4','callback','set(p,''linewidth'',4)');
uimenu(rwm,'label','Width_6','callback','set(p,''linewidth'',6)');
uimenu(rwm,'label','Width_8','callback','set(p,''linewidth'',8)');
uimenu(rwm,'label','Original','callback','set(p,''linewidth'',1)');
set(gca,'uicontextmenu',rwm);
运行程序后,得到下面的图形。
单击plot后出现下面的图形
4.2演示GUI对象
【例】绘制一条S曲线,创建一个与之相联系的现场菜单,用以控制曲线的颜色。
编写脚本M文件
clear all
clc
t=(-3*pi:pi/50:3*pi)+eps;
y=sin(t)./t; %制作具体菜单项,定义相应的回调
hline=plot(t,y); %绘制Sa曲线
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) %使cm现场菜单与Sa曲线相联系
运行后得到下面的(蓝色线条)S曲线
将鼠标指针指向线条,右键弹出现场菜单,在选中菜单单项(如Red)后,曲线变成红色。
在GUI中,用户控件是除了用户菜单之外,实现用户和计算机交互的重要途径。
【例】创建一个界面包含3种控件:静态文本、双位按键、控件区域框。
在MATLAB编辑框口输入以下代码:
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);
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');
运行后得到下面的图形。可以选择图名的正体或斜体,也可以增加图中栅栏。
图形用户界面(GUI)是由窗口、按键、菜单、文字说明等对象构成的一个用户界面,用户通过一定的方法,选择、激活这些图形对象,实现计算、绘图等功能。以上就是今天学习的内容,一起坚持打卡哦!