三、图形用户界面设计方法
1、图形用户界面的组成
(1)图形用户界面GUI(Graphical User Interface):用户与计算机进行信息交流的窗口。
(2)设计图形用户界面的方法
- 调用建立用户界面控件的函数
- 使用MATLAB提供的GUIDE工具进行可视化设计
2、控件对象及其操作
(1)常用控件
- 输入和输出类控件:编辑框、静态文本、列表框、滑动条等。
- 实施确认、选择操作类控件:按钮、双位按钮、单选按钮、复选框。
(2)建立控件对象
句柄变量=uicontrol(图形窗口句柄,属性1,属性值1,属性2,属性值2,……)
其中,属性及其取值决定了控件的特征。若省略图形窗口句柄,默认在当前图形窗口建立控件对象。
(3)控件对象的基本控制属性
- Style属性:定义控件对象的类型,例如‘pushbutton’表示按钮对象,‘edit’表示编辑框。
- String属性:定义控件对象的说明文字。
- Tag属性:标识控件对象。
- Enable属性:控制控件对象是否可用。
- Position属性:定义控件对象的位置,其取值形式为[x,y,w,h]。
- Callback属性:其属性值是描述命令的字符串或函数句柄,当选中控件时,系统将自动执行字符串描述的命令或调用句柄所代表的函数,实施相关操作。
例子:在图形窗口建立三个按钮对象,当单机按钮时分别绘制正弦曲线、显示或隐藏坐标轴的网络、清楚坐标轴的图形。
ha=axes('Units','pixels','Position',[40,40,360,360]); btgrid=uicontrol('Style','pushbutton','String','网格',... 'Position',[450,120,48,20],... 'Callback','grid');%grid显示或隐藏坐标轴的网络 btncla=uicontrol('Style','pushbutton','String','清除',... 'Position',[450,80,48,20],... 'Callback','cla');%cla清除坐标轴 btplot=uicontrol('Style','pushbutton','String','绘图',... 'Position',[450,160,48,20]); btplot.Callback=@plot_sin;%绘图
建立回调绘图函数文件plot_sin.m
function plot_sin(source,callbackdata) t=-pi:pi/20:pi; plot(t,sin(t)); end
注:回调函数定义格式
function 函数名(source,evendata)
……
end
其中,参数source是发生事件的源控件对象句柄,evendata存储事件数据。
3、菜单对象
(1)建立菜单对象
uimenu函数用于创建、设置、修改菜单
- 建立一级菜单项的函数调用格式
一级菜单项句柄=uimenu(图形窗口句柄,属性,属性值1,属性2,属性值2,……) - 建立子菜单项的函数调用格式:
子菜单项句柄=uimenu(上级菜单项句柄,属性,属性值1,属性2,属性值2,……)
(2)菜单属性
- Label属性:定义菜单项的名字。
- Accelerator属性:定义菜单项的快捷键
- Checked属性:指示菜单项是否已选中
- Enable属性:控制菜单项的可选性
- Separator属性:在菜单项上方添加一条分割线
例子:在上例的界面中添加“图形选项”菜单项,其中包括一个二级菜单项“线型”,其下又有3个子菜单项,分别为“实线”、“虚线”、“双划线”。
主程序
%建立坐标轴 ha=axes('Units','pixels','Position',[40,40,360,360]); %grid显示或隐藏坐标轴的网络 btgrid=uicontrol('Style','pushbutton','String','网格',... 'Position',[450,120,48,20],... 'Callback','grid'); %cla清除坐标轴 btncla=uicontrol('Style','pushbutton','String','清除',... 'Position',[450,80,48,20],... 'Callback','cla'); %绘图 btplot=uicontrol('Style','pushbutton','String','绘图',... 'Position',[450,160,48,20]); btplot.Callback=@plot_sin; %一级菜单项 hopt=uimenu(gcf,'Label','图形选项','Accelerator','L'); %建立二级菜单项,包括实线、虚线、双划线 hLStyle=uimenu(hopt,'Label','选项','Tag','LStyle','Enable','off');Enable为off菜单不可用 hL_Solid=uimenu(hLStyle,'Label','实线','Tag','Solid','Callback',@MLine_Type); hL_Dotted=uimenu(hLStyle,'Label','虚线','Tag','Dotted','Callback',@MLine_Type); hL_Dashed=uimenu(hLStyle,'Label','双划线','Tag','Dashed','Callback',@MLine_Type);
函数文件plot_sin.m
function plot_sin(source,callbackdata) t=-pi:pi/20:pi; plot(t,sin(t)); h1=findobj('Tag','LStyle'); h1.Enable='On';%将Tag属性为LStyle的Enable改为on,使得 “线型”菜单项可用 end
函数文件MLine_Type.m
function MLine_Type(source,callbackdata) hline=findobj('Type','line');%返回类型为线型的对象 if strcmp(source.Tag,'Solid')==1%strcmp字符比较函数 hline.LineStyle='-'; elseif strcmp(source.Tag,'Dotted')==1 hline.LineStyle=':'; elseif strcmp(source.Tag,'Dashed')==1 hline.LineStyle='--'; end end
程序运行结果,运行主程序生成图形界面,此时菜单中“图形选项”下的“选项”不可用。单机“绘图”按钮绘制曲线之后,“选项”可用,这时可以改变线型。
四、用户界面设计工具
1、图形界面设计窗口
(1)打开GUIDE
- 在MATLAB命令行窗口输入guide命令
- 在MATLAB主窗口中选择“主页”选项卡,单击工具栏的“新建”命令按钮,再选择“应用程序”下的GUIDE命令。
(2)图形用户界面设计模板
- Blank GUI(Default)
- GUI with Uicontrols
- GUI with Axes and Menu
- Modal Question Dialog
(3)图形用户界面设计窗口
图形用户界面设计窗口由菜单栏、工具栏、组件选项板、界面设计区、状态栏等部分组成。
例子:建立一个图形用户界面,该界面包括一个坐标轴,3个静态文本,3个可编辑文本,2个按钮。还有一个按钮组,里面有两个单选按钮。
2、图形用户界面设计工具
从左到右依次是:
对齐对象工具、菜单编辑器、Tab键顺序编辑器、工具栏编辑器、代码编辑器、对象属性检查器、对象浏览器。
(1)对象属性检查器
用于检查/修改对象属性的工具
(2)菜单编辑器
(3)对象浏览器
用于查看图形对象和展示界面的组织架构。
3、回调属性与回调函数
(1)回调属性
- Callback属性:按钮类控件和菜单项的单击事件的默认回调属性。
- CreateFcn属性:定义创建图形对象的响应。
- DeleteFcn属性:定义取消图形对象的响应。
- ButtonFcn属性:定义单击鼠标键按下的响应。
- KeyPressFcn属性:定义键盘键按下的响应。
- SelectionChangeFcn属性:定义改变选项的响应。
(2)回调函数框架
function 对象标识_Callback(hObject,eventdata,handles)
,其中,hObject为发生事件的源控件,eventdata为事件数据,handles保存图形界面中所有对象的句柄。
(3)回调函数举例
- “绘图”按钮的Callback
function pushbutton1_Callback(hObject, eventdata, handles) A=eval(handles.editfz.String); f=eval(handles.editpl.String)/50; theta=eval(handles.editxj.String)/180*pi; x=linspace(0,2*pi,100); if handles.Opsin.Value==1%判断是选择sin还是cos函数 y=A*sin(f*x+theta); else y=A*cos(f*x+theta); end plot(x,y); handles.PStyle.Enable='On';
- “实线”菜单的回调函数(虚线,双划线类似)
function Soild_Callback(hObject, eventdata, handles) hline=findobj('Type','line'); hline.LineStyle='-'; handles.Solid.Checked='On';%指示菜单已经选中 handles.Dotted.Checked='Off'; handles.Dashed.Checked='Off';
- “红色”菜单的回调函数
function r_Callback(hObject, eventdata, handles) hline=findobj('Type','line'); hline.Color='r'; handles.r.Checked='On';%指示菜单已经选中 handles.g.Checked='Off'; handles.b.Checked='Off';
成果图