第14课 Matlab的GUI程序设计1

更新时间:2024-05-18 03:27:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第五章 Matlab的GUI程序设计

一、 图形对象及其句柄:

1. 图形对象

MATLAB把构成图形的各个基本要素称为图形对象。

这些对象包括计算机屏幕、图形窗口(Figure) 、用户菜单(Uimenu)、用户控件(Uicontrol)、坐标轴(Axes)、曲线(Line)、曲面(Surface)、文字(Text)、图像(image)、光源(Light)、区域块(Patch)和方框(Rectangle)。系统将每一个对象按树型结构组织起来。每个图形对象都可以被独立地操作。(help)

2. 图形对象句柄

MATLAB在创建每一个图形对象时,都为该对象分配唯一的一个值,称其为图形对象句柄(Handle)。句柄是图形对象的唯一标识符。 MATLAB提供了3个用于获取已有图形对象句柄的函数: gcf 获取当前图形窗口句柄(get current figure)。 gca 获取当前坐标轴句柄(get current axis)。

gco 获取最近被单击的图形对象的句柄(get current object)。 [注]其他具体的对象句柄可利用低层绘图指令获得。但以此3种最常用。

二、 图形对象的属性:

1. 属性名与属性值

MATLAB给每种对象的每一个属性规定了一个名字,称为属性名,而属性名的取值成为属性值。例如,LineStyle是曲线对象的一个属性名,它的值决定着线型,取值可以是'-' 、':'、'-.'、'--'或'none'。 2. 属性的操作

set函数的调用格式为:%设置属性值

set(句柄,属性名1,属性值1,属性名2,属性值2,…)

get函数的调用格式为:%获取属性值

V=get(句柄,属性名)

三、图形对象的创建:

1. 图形窗口对象

建立图形窗口对象使用figure函数。调用该函数的命令形式为: 句柄变量=figure(属性名1,属性值1,属性名2,属性值2,…)

MATLAB为每个图形窗口提供了很多属性。这些属性及其取值控制着图形窗口对象。除公共属性外,其他常用属性:MenuBar属性、Name属性、Position属性、Color属性等。 2. 坐标轴对象

建立坐标轴对象使用axes函数,调用它的命令形式为: 句柄变量=axes(属性名1,属性值1,属性名2,属性值2,…) MATLAB为每个坐标轴对象提供了很多属性。除公共属性外,还有其他常用属性。

四、Matlab的GUI设计:

GUI(Graphic User Interface),即图形用户界面。 1、GUI设计的原则

针对用户不同的需要,设计出的图形用户界面也各不相同。一般而言,一个较好的界面都遵循以下三个特征:简单性、一致性和熟悉性。

错误!未找到引用源。简单性

在设计界面时,应力求简洁、直接、清晰地体现出界面的功能和特征。一些可有可无的功能应尽量删去,以保证界面的整洁。设计的图形界面要直观,应多采用图形,而尽量避免数据。设计的界面应尽量减少窗口的数目,力求避免在不同窗口之间进行来回切换。

错误!未找到引用源。一致性

一是用户自己开发的界面风格要尽量一致;二是新设计的界面要与其它已有的界面风格尽量保持一致。用户在初次使用新界面时,总是习惯于凭经验进行试探。例如,图形显示区通常安排在界面的左侧,按键等控制区通常放在右侧。

错误!未找到引用源。熟悉性

在设计新界面时,应尽量使用人们熟悉的标志和符号,设计出友好、令人舒适的用户界面。用户可能并不了解新界面的具体含义和操作方法,但完全何以根据熟悉的标志作出正确的猜测,便于学习和使用。

除了上述对界面的静态要求外,还应要求界面的动态性。例如,所设计的界面对于用操作的响应要迅速和连续;对持续时间较长的运算要给出等待时间提示,并允许用户中断等。

2、GUI设计的步骤

图形用户界面的制作一般包括界面设计和程序实现,对于初学者,建议按照下述步骤进行:

(1) 分析界面所要求实现的主要功能,以明确设计任务; (2) 在纸上绘出界面草图,并站在使用者的角度审查草图; (3) 按照构思的草图,上机制作静态界面,并检查它; (4) 编写界面动态功能的程序,对功能进行逐项检查。

注意:这只是一种建议,在设计中,步骤间也许要交叉或重复执行。由于设计和实现过程往往不是一步到位的,可能需要反复修改才能获得满意的界面。

GUI包含两类基本的图形对象:一是用户界面控件对象(Uicontrol),简称为控件对象;一是用户界面菜单对象(Uimenu),简称为菜单对象。

五、用户控件制作函数uicontrol

1、用于制作图形用户界面上的其它控件。 主要有以下10种类型:

push, 按钮 radio, 选择按钮 toggle, 双位按钮 check, 检录框 list, 列表框 popup, 弹出框 slide 滑动条

edit 可编辑文本框 text 静态文本框 frame 控件区域框

2、控件制作函数uicontrol的使用格式:

hc=uicontrol(hc_parant,'style','CntlName','CntlP','CntlV',…) hc为控件句柄名

hc_parant为句柄hc的父对象句柄

CntlName为控件类型名 CntlP为句柄hc的属性名 CntlV为句柄hc的属性值

例5.1 创建一个界面(图5-1)包含4种控件:静态文本、选择开关、双位按键、控件区域框。

编写M脚本文件examGUI5_1.m ,运行该文件便可得如图5-1所示的界面。

图5-1 静态文本、选择开关、双位按键及控件区域框

[EXAMGUI5_1.M]

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); %画sin(t)的图形

set(h_axes,'xlim',[0,2*pi]); %设置轴上x坐标的范围 set(gcf,'defaultuicontrolhorizontal','left');%把y轴放在窗口的左边

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]); %设置选择按钮控件1 set(hr1,'value',get(hr1,'Max'));

%设置hr1属性value的值='max'(选择按钮有点提示选中此项) set(hr1,'callback',[...

'set(hr1,''value'',get(hr1,''max'')),',... 'set(hr2,''value'',get(hr2,''min'')),',... 'set(htitle,''fontangle'',''normal''),']);

%选择按钮选中时,取normal字体

hr2=uicontrol(gcf,'style','radio',... %设置选择按钮控件2 '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');

例5.2 如图5-2建立数制转换对话框。在左边输入一个十进制整数和2~16之间的数,单击“转换”按钮能在右边得到十进制数所对应的2~16进制字符串,单击“退出”按钮退出对话框。

程序如下[examGUI5_2.m]:

hf=figure('Color',[0,1,1],'Position',[100,200,400,200],... 'Name','数制转换', ...

'NumberTitle','off','MenuBar','none');

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','Position',[0.5,0.8,0.45,0.1],... 'Units','normalized','Horizontal','center',... 'String','输 出 框','Back',[0,1,1]);

uicontrol(hf,'Style','Frame','Position',[0.04,0.33,0.45,0.45],... 'Units','normalized','Back',[1,1,0]);

uicontrol(hf,'Style','Text','Position',[0.05,0.6,0.25,0.1],... 'Units','normalized','Horizontal','center',...

'String','十进制数','Back',[1,1,0]);

uicontrol(hf,'Style','Text','Position',[0.05,0.4,0.25,0.1],... 'Units','normalized','Horizontal','center',... 'String','2~16进制','Back',[1,1,0]);

he1=uicontrol(hf,'Style','Edit','Position',[0.25,0.6,0.2,0.1],... 'Units','normalized','Back',[0,1,0]);

he2=uicontrol(hf,'Style','Edit','Position',[0.25,0.4,0.2,0.1],... 'Units','normalized','Back',[0,1,0]);

uicontrol(hf,'Style','Frame','Position',[0.52,0.33,0.45,0.45],... 'Units','normalized','Back',[1,1,0]);

ht=uicontrol(hf,'Style','Text','Position',[0.6,0.5,0.3,0.1],... 'Units','normalized','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','Position',[0.18,0.1,0.2,0.12],... 'String','转 换','Units','normalized','Call',COMM); uicontrol(hf,'Style','Push','Position',[0.65,0.1,0.2,0.12],... 'String','退 出','Units','normalized','Call','close(hf)');

程序调用了trdec.m函数文件,该函数的作用是将任意十进制整数转换为2~16进制字符串。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;

例5.3 制作一个(如图5-3所示)能绘制任意图形的交互界面。它包括:可编辑文本框、弹出框、列表框。

图 5-3

本例的关键内容是:

1) 2)

如何使编辑框允许输入多行指令。

在利用M函数文件创建用户界面时,如何依靠全局变量传递控件的图柄,保证回调动作正确执行。

(1)编写M函数文件examGUI5_3.m和calledit1.m [examGUI5_3.m]

function examGUI6( )

global hedit hpop hlist %定义全局变量

clf reset

%以下各句对图形窗口及其子对象进行设置

set(gcf,'unit','normalized','position',[0.1,0.4,0.85,0.35]); set(gcf,'defaultuicontrolunits','normalized'); set(gcf,'defaultuicontrolfontsize',11); set(gcf,'defaultuicontrolfontname','隶书'); set(gcf,'defaultuicontrolhorizontal','left'); set(gcf,'menubar','none');

%以下各句对图形窗口的标题进行设置 str='通过多行指令绘图的交互界面';

set(gcf,'name',str,'numbertitle','off');

%以下各句在图形窗口安置轴

h_axes=axes('position',[0.05,0.15,0.45,0.70],'visible','off');

%以下各句在图形窗口设置text对象,并在其上输出'绘图指令输入框' uicontrol(gcf,'Style','text',... 'position',[0.52,0.87,0.26,0.1],... 'String','绘图指令输入框');

%以下各句在图形窗口设置edit对象

hedit=uicontrol(gcf,'Style','edit',... 'position',[0.52,0.05,0.26,0.8],... 'Max',2);

%以下各句在图形窗口设置popup对象(弹出式菜单) hpop=uicontrol(gcf,'style','popup',... 'position',[0.8,0.73,0.18,0.12],...

'string','spring|summer|autumn|winter');

%以下各句在图形窗口设置list对象(列表框) hlist=uicontrol(gcf,'Style','list',... 'position',[0.8,0.23,0.18,0.37],...

'string','Grid on|Box on|Hidden off|Axis off',... 'Max',2);

%以下各句在图形窗口设置push对象(按钮) hpush=uicontrol(gcf,'Style','push',...

'position',[0.8,0.05,0.18,0.15],'string','Apply');

%在编辑框输入数据,按回车时调用calledit1子函数 set(hedit,'callback','calledit1');

%选中弹出式菜单时,调用calledit1子函数 set(hpop,'callback','calledit1');

%选中按钮时,调用calledit1子函数

set(hpush,'callback','calledit1');

[calledit1.m]

function calledit1( )

global hedit hpop hlist %引用已定义的全局变量

ct=get(hedit,'string'); %把编辑框的字符输入到ct

vpop=get(hpop,'value'); %把选中的弹出菜单的选项输入到vpop vlist=get(hlist,'value'); %把选中的弹出菜单的选项输入到vlist

if ~isempty(ct) %如果ct中字符不空,则执行以下语句,否则什么都不干 eval(ct') %画函数图形

popstr={'spring','summer','autumn','winter'}; liststr={'grid on','box on','hidden off','axis off'}; invstr={'grid off','box off','hidden on','axis on'}; colormap(eval(popstr{vpop})) %用列表框选中的颜色着色 vv=zeros(1,4);vv(vlist)=1; %将列表框选中的项赋值1 for k=1:4

if vv(k);eval(liststr{k});else eval(invstr{k});end end end

(2)在MATLAB指令窗中运行examGUI5_3.m就可获得题目所要求的图形用户界面。

ezsurf('x^2*exp(-x^2-y^2)'); shading interp; light;

lighting gouraud;

----

[X0,Y0,Z0]=sphere(30); X=2*X0;Y=2*Y0;Z=2*Z0; surf(X0,Y0,Z0); shading interp;

hold on,mesh(X,Y,Z),colormap(hot),hold off; hidden off; light;

lighting phong;

axis equal,axis off;

本文来源:https://www.bwwdw.com/article/v7e7.html

Top