资源描述
高教社刘卫国高教社刘卫国MATLAB 程序设计与应用(第二版)例题源程序程序设计与应用(第二版)例题源程序 第第 8 章:章:MATLAB 图形用户界面设计图形用户界面设计 王成优王成优山东大学(威海)山东大学(威海)MATLAB 语言语言 WangChengyou Shandong University,Weihai1 第第 8 章章 MATLAB 图形用户界面设计图形用户界面设计 例例 8.1 建立图 8.1 所示的图形演示系统菜单。菜单条中含有 3 个菜单项:Plot、Option和 Quit。Plot 中有 Sine Wave 和 Cosine Wave 两个子菜单项,分别控制在本图形窗口画出正弦和余弦曲线。Option 菜单项的内容如图 8.1 所示,其中 Grid on 和 Grid off 控制给坐标轴加网格线,Box on 和 Box off 控制给坐标轴加边框,而且这 4 项只有在画有曲线时才是可选的。Window Color 控制图形窗口背景颜色。Quit 控制是否退出系统。screen=get(0,ScreenSize);W=screen(3);H=screen(4);figure(Color,1,1,1,Position,0.2*H,0.2*H,0.5*W,0.3*H,.Name,图形演示系统,NumberTitle,off,MenuBar,none);%定义 Plot 菜单项 hplot=uimenu(gcf,Label,&Plot);uimenu(hplot,Label,Sine Wave,Call,.t=-pi:pi/20:pi;,plot(t,sin(t);,.set(hgon,Enable,on);,.set(hgoff,Enable,on);,.set(hbon,Enable,on);,.set(hboff,Enable,on););uimenu(hplot,Label,Cosine Wave,Call,.t=-pi:pi/20:pi;,plot(t,cos(t);,.set(hgon,Enable,on);,.set(hgoff,Enable,on);,.set(hbon,Enable,on);,.set(hboff,Enable,on););%定义 Option 菜单项 hoption=uimenu(gcf,Label,&Option);hgon=uimenu(hoption,Label,&Grid on,.Call,grid on,Enable,off);hgoff=uimenu(hoption,Label,&Grid off,.Call,grid off,Enable,off);hbon=uimenu(hoption,Label,&Box on,.高教社刘卫国高教社刘卫国MATLAB 程序设计与应用(第二版)例题源程序程序设计与应用(第二版)例题源程序 第第 8 章:章:MATLAB 图形用户界面设计图形用户界面设计 王成优王成优山东大学(威海)山东大学(威海)MATLAB 语言语言 WangChengyou Shandong University,Weihai2 separator,on,Call,box on,Enable,off);hboff=uimenu(hoption,Label,&Box off,.Call,box off,Enable,off);hwincor=uimenu(hoption,Label,&Window Color,Separator,on);uimenu(hwincor,Label,&Red,Accelerator,r,.Call,set(gcf,Color,r););uimenu(hwincor,Label,&Blue,Accelerator,b,.Call,set(gcf,Color,b););uimenu(hwincor,Label,&Yellow,Call,.set(gcf,Color,y););uimenu(hwincor,Label,&White,Call,.set(gcf,Color,w););%定义 Quit 菜单项 uimenu(gcf,Label,&Quit,Call,close(gcf);例例 8.2 绘制曲线 y=2e-0.5xsin(2x),并建立一个与之相联系的快捷菜单,用以控制曲线的线型和曲线宽度。x=0:pi/100:2*pi;y=2*exp(-0.5*x).*sin(2*pi*x);hl=plot(x,y);hc=uicontextmenu;%建立快捷菜单 hls=uimenu(hc,Label,线型);%建立菜单项 hlw=uimenu(hc,Label,线宽);uimenu(hls,Label,虚线,Call,set(hl,LineStyle,:););uimenu(hls,Label,实线,Call,set(hl,LineStyle,-););uimenu(hlw,Label,加宽,Call,set(hl,LineWidth,2););uimenu(hlw,Label,变细,Call,set(hl,LineWidth,0.5););set(hl,UIContextMenu,hc);%将该快捷菜单和曲线对象联系起来 例例 8.3 建立如图 8.10 所示的数制转换对话框。在左边输入一个十进制整数和 216 之间的数,单击“转换”按钮能在右边得到十进制数所对应的 216 进制字符串,单击“退出”按钮退出对话框。hf=figure(Color,0,1,1,Position,100,200,400,200,.Name,数制转换,NumberTitle,off,MenuBar,none);高教社刘卫国高教社刘卫国MATLAB 程序设计与应用(第二版)例题源程序程序设计与应用(第二版)例题源程序 第第 8 章:章:MATLAB 图形用户界面设计图形用户界面设计 王成优王成优山东大学(威海)山东大学(威海)MATLAB 语言语言 WangChengyou Shandong University,Weihai3 uicontrol(hf,Style,Text,Units,normalized,.Position,0.05,0.8,0.45,0.1,Horizontal,center,.String,输 入 框,Back,0,1,1);uicontrol(hf,Style,Text,Units,normalized,.Position,0.5,0.8,0.45,0.1,Horizontal,center,.String,输 出 框,Back,0,1,1);uicontrol(hf,Style,Frame,Units,normalized,.Position,0.04,0.33,0.45,0.45,Back,1,1,0);uicontrol(hf,Style,Text,Units,normalized,.Position,0.05,0.6,0.25,0.1,Horizontal,center,.String,十进制数,Back,1,1,0);uicontrol(hf,Style,Text,Units,normalized,.Position,0.05,0.4,0.25,0.1,Horizontal,center,.String,216 进制,Back,1,1,0);he1=uicontrol(hf,Style,Edit,Units,normalized,.Position,0.25,0.6,0.2,0.1,Back,0,1,0);he2=uicontrol(hf,Style,Edit,Units,normalized,.Position,0.25,0.4,0.2,0.1,Back,0,1,0);uicontrol(hf,Style,Frame,Units,normalized,.Position,0.52,0.33,0.45,0.45,Back,1,1,0);ht=uicontrol(hf,Style,Text,Units,normalized,.Position,0.6,0.5,0.3,0.1,Horizontal,center,.Back,0,1,0);COMM=n=str2num(get(he1,String);,.b=str2num(get(he2,String);,.dec=trdec(n,b);,set(ht,string,dec);uicontrol(hf,Style,Push,Units,normalized,.Position,0.18,0.1,0.2,0.12,String,转 换,Call,COMM);uicontrol(hf,Style,Push,Units,normalized,.Position,0.65,0.1,0.2,0.12,.String,退 出,Call,close(hf);程序调用了trdec.m函数文件,该函数的作用是将任意十进制整数转换为216进制高教社刘卫国高教社刘卫国MATLAB 程序设计与应用(第二版)例题源程序程序设计与应用(第二版)例题源程序 第第 8 章:章:MATLAB 图形用户界面设计图形用户界面设计 王成优王成优山东大学(威海)山东大学(威海)MATLAB 语言语言 WangChengyou Shandong University,Weihai4 字符串。trdec.m函数文件如下:function dec=trdec(n,b)ch1=0123456789ABCDEF;%十六进制的 16 个符号 k=1;while n=0%不断除某进制基数取余直到商为 0 p(k)=rem(n,b);n=fix(n/b);k=k+1;end k=k-1;strdec=;while k=1%形成某进制数的字符串 kb=p(k);strdec=strcat(strdec,ch1(kb+1:kb+1);k=k-1;end dec=strdec;例例 8.4 建立如图 8.11 所示的图形演示对话框。在编辑框输入绘图命令,当单击“绘图”按钮时,能在左边坐标轴绘制所对应的图形,弹出框提供色图控制,列表框提供坐标网格线和坐标边框控制。clf;set(gcf,Unit,normalized,Position,0.2,0.3,0.55,0.36);set(gcf,Menubar,none,Name,图形演示,NumberTitle,off);axes(Position,0.05,0.15,0.55,0.7);uicontrol(gcf,Style,text,Unit,normalized,.Posi,0.63,0.85,0.2,0.1,String,.输入绘图命令,Horizontal,center);hedit=uicontrol(gcf,Style,edit,Unit,normalized,.Posi,0.63,0.15,0.2,0.68,.Max,2);%Max 取 2,使 Max-Min1,从而允许多行输入 hpopup=uicontrol(gcf,Style,popup,Unit,normalized,.Posi,0.85,0.8,0.15,0.15,String,.高教社刘卫国高教社刘卫国MATLAB 程序设计与应用(第二版)例题源程序程序设计与应用(第二版)例题源程序 第第 8 章:章:MATLAB 图形用户界面设计图形用户界面设计 王成优王成优山东大学(威海)山东大学(威海)MATLAB 语言语言 WangChengyou Shandong University,Weihai5 Spring|Summer|Autumn|Winter,Call,.COMM(hedit,hpopup,hlist);hlist=uicontrol(gcf,Style,list,Unit,normalized,.Posi,0.85,0.55,0.15,0.25,String,.Grid on|Grid off|Box on|Box off,Call,.COMM(hedit,hpopup,hlist);hpush1=uicontrol(gcf,Style,push,Unit,normalized,.Posi,0.85,0.35,0.15,0.15,String,.绘 图,Call,COMM(hedit,hpopup,hlist);uicontrol(gcf,Style,push,Unit,normalized,.Posi,0.85,0.15,0.15,0.15,String,.关 闭,Call,close all);COMM.m 函数文件:function COMM(hedit,hpopup,hlist)com=get(hedit,String);n1=get(hpopup,Value);n2=get(hlist,Value);if isempty(com)%编辑框输入非空时 eval(com);%执行从编辑框输入的命令 chpop=spring,summer,autumn,winter;chlist=grid on,grid off,box on,box off;colormap(eval(chpopn1);eval(chlistn2);end 例例 8.5 利用 GUI 设计工具设计图 8.18 所示的用户界面。该界面包括一个用于显示图形的轴对象,显示的图形包括表面图、网格图或等高线图。绘制图形的功能通过 3 个命令按钮来实现,用户通过单击相应的按钮,即可绘制相应图形。绘制图形所需要的数据通过一个弹出框来选取。在弹出框中包括 3 个选项,分别对应 MATLAB 的数据函数 peaks、membrane(该函数产生 MATLAB 标志)和用户自定义的绘图数据 sinc,用户可以通过选择相应的选项来载入相应的绘图数据。在图形窗口默认的菜单条上添加一个菜单项 Select,Select 下又有两个子菜单项 Yellow 和 Red,选中 Yellow 项时,图形窗口将变成黄色,选中 Red 项时,图形窗口将变成红色。高教社刘卫国高教社刘卫国MATLAB 程序设计与应用(第二版)例题源程序程序设计与应用(第二版)例题源程序 第第 8 章:章:MATLAB 图形用户界面设计图形用户界面设计 王成优王成优山东大学(威海)山东大学(威海)MATLAB 语言语言 WangChengyou Shandong University,Weihai6 操作步骤如下:(1)打开 GUI 设计窗口,添加有关控件对象。在 MATLAB 命令窗口输入命令 guide,将打开 GUI 设计窗口。单击 GUI 设计窗口控件工具栏中的 Axes 按钮,并在图形窗口中拖出一个矩形框,调整好大小和位置。再添加 3 个按钮、一个弹出框和一个静态文本框,并调整好大小和位置。必要时可利用位置调整工具将图形对象对齐。(2)利用属性编辑器,设置图形对象的属性。打开属性编辑器,当用户在界面设计中选择一个对象后,在属性编辑器将列出该对象的属性及默认的属性值。利用属性编辑器把 3 个按钮的 Position 属性的第 3 和第4 个分量设为相同的值,以使 3 个按钮宽和高都相等。3 个按钮的 String 属性分别是说明文字 Mesh、Surf 和 Contour3,FontSize 属性设为 10。双击弹出框,打开该对象的属性设置对话框。为了设置弹出框的 String 属性,单击 String 属性名后面的图标,然后在打开的文本编辑器中输入 3 个选项:peaks、membrane、sinc。注意,每行输入一个选项。将静态文本框的 String 属性设置为 Choose Data of Graphics。(3)编写代码,实现控件功能。为了实现控件的功能,需要编写相应的程序代码。如果实现代码较为简单,可以直接修改控件的 Callback 属性。对于较为复杂的程序代码,最好还是编写 M 文件。右键单击任一图形对象,在弹出的快捷菜单中选择 View Callbacks,再选 Callback 子菜单,将自动打开一个 M 文件,这时可以在各控件的回调函数区输入相应的程序代码。本例需要添加的代码如下(注释部分和函数引导行是系统 M 文件中已有的):在打开的函数文件中,添加用于创建绘图数据的代码:function ex8_5_OpeningFcn(hObject,eventdata,handles,varargin)%This function has no output args,see OutputFcn.%hObject handle to figure%eventdata reserved-to be defined in a future version of MATLAB%handles structure with handles and user data(see GUIDATA)%varargin command line arguments to ex8_5(see VARARGIN)handles.peaks=peaks(35);handles.membrane=membrane(5);%membrane 函数产生 MATLAB 标志 x,y=meshgrid(-8:0.5:8);r=sqrt(x.2+y.2);高教社刘卫国高教社刘卫国MATLAB 程序设计与应用(第二版)例题源程序程序设计与应用(第二版)例题源程序 第第 8 章:章:MATLAB 图形用户界面设计图形用户界面设计 王成优王成优山东大学(威海)山东大学(威海)MATLAB 语言语言 WangChengyou Shandong University,Weihai7 sinc=sin(r)./(r+eps);handles.sinc=sinc;handles.current_data=handles.peaks;为弹出式菜单编写响应函数代码如下:%-Executes on selection change in popupmenu1.function popupmenu1_Callback(hObject,eventdata,handles)%hObject handle to popupmenu1(see GCBO)%eventdata reserved-to be defined in a future version of MATLAB%handles structure with handles and user data(see GUIDATA)val=get(hObject,Value)str=get(hObject,String);switch strval case peaks handles.current_data=handles.peaks;case membrane handles.current_data=handles.membrane;case sinc handles.current_data=handles.sinc;end guidata(hObject,handles)%Hints:contents=get(hObject,String)returns popupmenu1 contents as cell array%contentsget(hObject,Value)returns selected item from popupmenu1 为 Mesh 按钮编写响应函数代码如下:%-Executes on button press in pushbutton1.function pushbutton1_Callback(hObject,eventdata,handles)%hObject handle to pushbutton1(see GCBO)%eventdata reserved-to be defined in a future version of MATLAB%handles structure with handles and user data(see GUIDATA)mesh(handles.current_data)为 Surf 按钮编写响应函数代码如下:%-Executes on button press in pushbutton2.function pushbutton2_Callback(hObject,eventdata,handles)高教社刘卫国高教社刘卫国MATLAB 程序设计与应用(第二版)例题源程序程序设计与应用(第二版)例题源程序 第第 8 章:章:MATLAB 图形用户界面设计图形用户界面设计 王成优王成优山东大学(威海)山东大学(威海)MATLAB 语言语言 WangChengyou Shandong University,Weihai8%hObject handle to pushbutton2(see GCBO)%eventdata reserved-to be defined in a future version of MATLAB%handles structure with handles and user data(see GUIDATA)surf(handles.current_data)为 Contour3 按钮编写响应函数代码如下:%-Executes on button press in pushbutton3.function pushbutton3_Callback(hObject,eventdata,handles)%hObject handle to pushbutton3(see GCBO)%eventdata reserved-to be defined in a future version of MATLAB%handles structure with handles and user data(see GUIDATA)contour3(handles.current_data)可以看出,每个控件对象都有一个由 function 语句引导的函数,用户可以在相应的函数下添加程序代码来完成指定的任务。在运行图形用户界面文件时,如果单击其中的某个对象,则在 MATLAB 机制下自动调用该函数。
展开阅读全文