GUI程序设计GUI(GraphicalUserInterfaces)是图形用户界面的简称,GUI程序时由窗口、光标、按键、菜单、按钮等对象构成的一个用户界面,用户通过一定的方法选择、激活这些图形对象,使计算机响应这些动作或变化,如实现计算、绘制图形等。GUI程序是提供应用程序、进行技术演示等的方便工具,利于反复使用而且操作简单。和v++、VB等编程语言类似,matlab提供了包括文本框、按钮、复选框、下拉菜单等多种控件供用户使用,并提供了供设计、修改图形用户界面程序的专用工作台,称为layouteditor,使用guide指令即可打开该界面设计工具。句柄图形(HandleGraphics)就是将一个图形的每一个组件都视为一个对象(Object),每一个对象都有一个独一无二的“句柄”(handle),根据这个句柄,就可以找到这个对象(即图形组件)的各项属性,并进而更改这些属性,以产生不同的图形呈现效果。由于GUI程序控件较多,本文将从实例出发,就MATLAB在数学实验中常用的一些功能进行介绍。【例1.7.1】设计一个如下图形用户界面,该界面有如下功能:(1)打开该界面时,在轴上绘制peaks函数表面着色图,方位角为–37.5,俯视角为30;这两个角度的范围均为[-90,90]。(2)若在方位角或俯视角编辑框中输入新数据,则滚动条会自动滚动到对应的位置,且按新视角重新绘制peaks函数;若输入数据错误,则弹出出错对话框;(3)拖动滚动条时,对应的方位角和俯视角均更新,并重新绘制图形;(4)按钮“mesh”和“surf”切换图形绘制方式。(5)关闭该GUI时,弹出对话框进行确认。在本程序中,读者将学习如下知识:GUI界面程序的编写过程;GUI程序中数据的传递和访问;matlab自定义对话框的使用;各种控件,包括编辑控件、按钮控件、滑动条控件的回调函数编写以下将一步步实现该GUI程序。步骤一:窗口的控件布局与参数设置使用guide指令,打开一个新的GUI程序,分别将Axes控件、四个StaticText控件、两个EditText控件、两个Slider控件、两个PushButton控件拖到界面上。双击每个控件可以打开“PropertyInspector”,并做如下设置:四个静态文本控件的'String'属性,分别设置为:方位角(度),调整方位角(度),俯视角(度),调整俯视角(度);第一个EditText控件存储方位角,设置其“String”属性为-37.5;“Tag”属性为edit_az;第二个EditText控件存储俯视角,设置其“String”属性为30;'Tag'属性为edit_el;第一个Slider控件设置其“Tag”属性为slider_az;第二个Slider控件设置其“Tag”属性为slider_el;第一个PushButton控件设置其“Tag”属性为push_mesh,‘String’属性为‘Mesh’;第二个PushButton控件设置其“Tag”属性为push_surf,‘String’属性为‘Surf’;此时,将文件存为prog1_7_1.fig,并运行,即可出现一个figure界面,并生成一个prog1_7_1.m文件。可惜目前并不能做任何事情,因为我们还没有设置每个控件的回调属性。步骤二:设置回调函数(1)初始化图形界面函数打开prog1_7_1.fig,找到:functionprog1_7_1_OpeningFcn(hObject,eventdata,handles,varargin)该函数是在prog1_7_1运行时,在prog1_7_1图形界面出现之前开始执行。在该程序中,我们可以进行参数的初始化操作。在该函数中,键入如下代码:handles.peaks=peaks(35);%在handles结构中定义一个field,名字为peaks,%此后在程序的其他地方均可访问handle.peaks数据surf(handles.peaks);%该语句使得程序执行时即表面着色绘图;handles.az=-37.5;%同handles.peaks一样,这里利用handles结构定义az和el域handles.el=30;%并赋值,使得程序其他地方均可访问。view([handles.az,handles.el]);%设置初始视角set(handles.edit_az,'Value',handles.az);%将GUI中的edit_az显示为当前值;set(handles.edit_el,'Value',handles.el);%将GUI中的edit_az显示为当前值;set(handles.slider_az,'Value',(handles.az+90)/180);%计算出在滑动条中所在的位置;set(handles.slider_el,'Value',(handles.el+90)/180);%计算出在滑动条中所在的位置;handles.output=hObject;%Updatehandlesstructureguidata(hObject,handles);%使用guidata函数存储当前的handles结构,使其数据被重用。保存后运行,可发现,此时在轴上绘制出peaks的图形,且视角显示对应的数据。但拖动滚动条时程序没有反应。(2)为编辑框设置回调函数在prog1_7_1.fig上,选中edit_az编辑框,点右键,选中“viewCallbacks”,选中Callback,即进行回调函数编写。此时,若在编辑框中输入数据,并按回车键,则自动调用该回调函数。添加的源代码及解释如下:functionedit_az_Callback(hObject,eventdata,handles)(中间解释代码省略)tt=get(handles.edit_az,'String');%得到当前输入的数值val=str2double(tt);%将字符串转换成数值val1=(val+90)/180;%得到当前方位角在滚动条中的实际数值;handles.az=val;%对handles.az重新赋值;guidata(hObject,handles);%存储handles结构。ifisnumeric(val)&val=-90&val=90判断若输入的数值在规定范围set(handles.slider_az,'Value',val1);%将滚动条位置与当前输入值对应;view([handles.az,handles.el]);elseerrordlg('输入参数错误!输入数值在[-90,90]之间!');set(handles.edit_az,'String','-37.5');end同样道理,选中edit_el编辑框,点右键,选中“viewCallbacks”,选中Callback,添加源代码如下:functionedit_el_Callback(hObject,eventdata,handles)(中间解释代码省略)tt=get(handles.edit_el,'String');%得到当前输入的数值val=str2double(tt);%将字符串转换成数值val1=(val+90)/180;%得到当前滚动角;handles.el=val;%对handles.el重新赋值;guidata(hObject,handles);%%存储handles结构。ifisnumeric(val)&val=-90&val=90set(handles.slider_el,'Value',val1);view([handles.az,handles.el]);elseerrordlg('输入参数错误!输入数值在[-90,90]之间!');set(handles.edit_el,'String','30');end注:errordlg函数是一个matlab自定义的弹出式对话框函数,该函数的输入参数为对话框上显示的字符串。当程序执行到此时,会弹出一个对话框如下:(3)为滑动条设置回调函数在prog1_7_1.fig上,选中slider_az滑动条,点右键,选中“viewCallbacks”,选中Callback,即进行回调函数编写。此后,若拖动滑动条上的滑块,则自动调用该回调函数。本段函数的目的是,当拖动滑块时,会在编辑框中显示当前方位角,并按新方位角绘制peaks函数。添加的源代码及解释如下:functionslider_az_Callback(hObject,eventdata,handles)(中间的matlab自动生成解释代码略去)sd_az=get(handles.slider_az,'Value');%得到tag属性为slider_az的控件的当前值handles.az=(sd_az-0.5)*180;%将其转换为对应的方位角度,并存储在handles.az中set(handles.edit_az,'String',num2str(handles.az));%更新edit_az编辑框的字符串view([handles.az,handles.el]);%对绘图设置新方位角guidata(hObject,handles);%存储handles结构的变化同样道理,选中slider_el滑动条,点右键,选中“viewCallbacks”,选中Callback,添加源代码如下,代码同slider_az_Callback类似,不再解释。functionslider_el_Callback(hObject,eventdata,handles)(中间的matlab自动生成解释代码略去)sd_el=get(handles.slider_el,'Value');handles.el=(sd_el-0.5)*180;;set(handles.edit_el,'String',num2str(handles.el));view([handles.az,handles.el]);guidata(hObject,handles);(4)为按钮设置回调函数本段函数的目的是:按照当前输入的方位角和俯视角,在网格图和表面着色图之间切换。在prog1_7_1.fig上,分别选中push_mesh按钮及push_surf,点右键,选中“viewCallbacks”,选中Callback,即进行回调函数编写。functionpush_mesh_Callback(hObject,eventdata,handles)(中间的matlab自动生成解释代码略去)mesh(handles.peaks)%绘图view([handles.az,handles.el]);%设置当前视角functionpush_surf_Callback(hObject,eventdata,handles)(中间的matlab自动生成解释代码略去)surf(handles.peaks);%绘图view([handles.az,handles.el]);%设置当前视角步骤三设置关闭程序函数本函数在关闭该GUI程序时被执行。为此,在在prog1_7_1.fig上的空白处,按右键,选中:viewCallbacks中的CloseRequestFcn,自动生成GUIDemo_CloseRequestFcn(hObject,eventdata,handles)函数,添加代码如下:functionGUIDemo_CloseRequestFcn(hObject,eventdata,handles)(中间的matlab自动生成解释代码略去)selection=questdlg('确认退出吗?','退出','OK','Cancel','Cancel');switchselection,case'OK',delete(gcf);%删除当前图形句柄case'Cancel'returnend运行时,点击关闭按钮,则调用该函数,在本函数中,调用了matlab的自