这里写目录标题
- 一、对话框设计实例
-
- 二、菜单设计
-
- 1. 建立用户菜单
- 2. 菜单对象常用属性
- 3. 快捷菜单
一、对话框设计实例
- 在上一篇博客当中,我们介绍了控件的基本操作,这是建立对话框的基础。
- 下面我们举两个例子,用以说明对话框的应用与设计方法。
1. 数值转化
- 例如,我们建立一个的 “数值转换” 对话框,在左边输入一个十进制整数和 2~16 之间的数,单击 “转换” 按钮能够在右边得到十进制数所对应的二~十六进制字符串,单击 “退出” 按钮退出对话框。
- 程序如下:
hf=figure('Color',[0,1,1],'Position',[100,200,400,200],...
'Name','数制转换','NumberTitle','off','MenuBar','none');
uicontrol(hf,'Style','Text','Position',[80,160,40,20],...
'Horizontal','center','String','输入框','Back',[0,1,1]);
uicontrol(hf,'Style','Text','Position',[280,160,40,20],...
'Horizontal','center','String','输出框','Back',[0,1,1]);
uicontrol(hf,'Style','Frame','Position',[20, 65,165,90],'Back',[1,1,0]);
uicontrol(hf,'Style','Text','Position',[25,110,85,25],...
'Horizontal','center','String','十进制数','Back',[1,1,0]);
uicontrol(hf,'Style','Text','Position',[25,75,85,25],...
'Horizontal','center','String','2~16进制','Back',[1,1,0]);
hel=uicontrol(hf,'Style','Edit','Position',[100,115,60,25],...
'Back',[0,1,0]);
he2=uicontrol(hf,'Style','Edit','Position',[100,80,60,25],...
'Back',[0,1,0]);
uicontrol(hf,'Style','Frame','Position',[215,65,165, 90],'Back',[1,1,0]);
ht=uicontrol(hf,'Style','Text','Position',[255,95,90,30],...
'Horizontal','center','Back',[0,1,0]);
COMM=['n=str2num(get(hel,''String''));',...
'b=str2num(get(he2,''String''));',...
'dec=trdec(n,b);','set(ht,''string'',dec);'];
uicontrol(hf,'Style','Push','Position',[55,20,90,25], ...
'String','转 换','Call',COMM);
uicontrol(hf,'Style','Push','Position',[255,20,90,30],...
'String','退 出','Call','close(hf)');
- 程序中调用了 trdec.m 函数文件,该函数文件的作用是将任意十进制整数转换为二 ∼ \sim ∼十六进制字符串。
- 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;
- 此时,我们在输入框的十进制数中输入 2,2~16 进制中输入 2,然后点击转换按钮,得到输出结果如下所示。
2. 图形演示
- 例如,我们建立一个的 “图形演示” 窗口,在编辑框中输入绘图命令,当单击 “绘图” 按钮时,能在左边坐标轴绘制出所对应的图形,下拉列表框提供色图控制,列表框提供坐标网格线和左边边框控制,单击 “关闭” 按钮退出对话框。
clf;
set(gcf,'Unit','normalized','Position',[0.2,0.3,0.5,0.40]);
set(gcf,'Menubar','none','Name','图形演示','NumberTitle','off');
axes('Position',[0.05,0.15,0.5,0.8]);
uicontrol(gcf,'Style','text','Unit','normalized',...
'Posi',[0.60,0.85,0.2,0.1],'String',...
'输入绘图命令','Horizontal','center');
hedit=uicontrol(gcf,'Style','edit','Unit','normalized',...
'Posi',[0.60,0.15,0.2,0.68],...
'Max',2); %Max取2,使Max-Min>1,从而允许多行输入
hpopup=uicontrol(gcf,'Style','popup','Unit','normalized',...
'Posi',[0.83,0.8,0.15,0.15],'String',...
'Spring|Summer|Autumn|Winter','Call',...
'comm(hedit,hpopup,hlist)');
hlist=uicontrol(gcf,'Style','list','Unit','normalized',...
'Posi',[0.83,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.83,0.35,0.15,0.15],'String',...
'绘图','Call','comm(hedit,hpopup,hlist)');
uicontrol(gcf,'Style','push','Unit','normalized',...
'Posi',[0.83,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(chpop{n1})) ;
eval(chlist{n2}) ;
end
t=0:pi/10:pi;
r=2+sin(t);
[x,y,z]=cylinder(r,30);
surf(x,y,z);
- 色图选择为 Winter,有网格线,有边框线,得最后结果如下图所示。
二、菜单设计
- MATLAB 用户菜单对象是图形窗口的子对象,所以菜单设计总在图形窗口中进行。
- MATLAB 的图形窗口有自己的菜单栏,为了建立用户自己的菜单系统,可以先将图形窗口 MenuBar 属性设置为 none,以取消图形窗口默认的菜单,然后再建立用户自己的菜单。
1. 建立用户菜单
- 用户菜单通常包括一级菜单(菜单条)和二级菜单,有时根据需要还可以往下建立子菜单(三级菜单等),每一级菜单又包括若干菜单项。要建立用户菜单可用 uimenu 函数,因其调用方法不同,该函数可以用于建立一级菜单项和子菜单项。
- 建立一级菜单项的函数调用格式如下:
句柄变量=uimenu(图形窗口句柄,属性名1,属性值1,属性名2,属性值2,...)
句柄变量=uimenu(一级菜单项句柄,属性名1,属性值1,属性名2,属性值2,...)
- 这两种调用格式的区别在于,建立一级菜单项时,要给出图形窗口的句柄。如果省略了这个句柄,MATLAB 就在当前图形窗口中建立这个菜单项。
- 如果此时不存在活动图形窗口,MATLAB 会自动打开一个图形窗口,并将该菜单项作为它的菜单对象。在建立子菜单项时,必须指定一级菜单项对应的句柄。例如:
hm=uimenu(gcf,'Label','File');
hm1=uimenu(hm,'Label','Save');
hm2=uimenu(hm,'Label','save As');
- 将在当前窗口菜单条中建立名为 File 的菜单项。其中,Label 属性值 File 就是菜单项的名字,hm 是 File 菜单项的句柄,供定义该菜单项的子菜单之用。后两条命令将在 File 菜单项下建立 Save 和 Save As 两个子菜单项。具体界面如下图所示。
2. 菜单对象常用属性
- 菜单对象除具有 Children、Parent、Tag、Type、UserData、Visible 等公共属性外,还有一些常用的特殊属性。
- (1) Label 属性:该属性的取值是字符串,用于定义菜单项的名字。可以在字符串中加入 & 字符,这时在该菜单项名字上,跟随 & 字符后的字符有一条下划线,& 字符本身不出现在菜单项中。对于这种有带下划线字符的菜单,可以用 Alt 键加该字符键来激活相应的菜单项。
- (2) Accelerator 属性:该属性的取值可以是任何字母,用于定义菜单项的快捷键。如取字母 W,则表示定义快捷键为 Ctrl+W。
- (3) CallBack 属性:该属性的取值是字符串,可以是某个脚本文件名或一组 MATLAB 命令。在该菜单项被选中以后,MATLAB 将自动调用此回调函数来作出对相应菜单项的响应,如果没有设置一个合适的回调函数,则此菜单项也将失去其应有的意义。
- 在产生子菜单时 CallBack 属性也可以省略,因为这时直接打开下一级菜单,而不是侧重于某一操作。
- (4) Checked 属性:该属性的取值是 ‘on’ 或 ‘off’(默认值),该属性为菜单项定义一个指示标记,可以用这个特性指明菜单项是否已选中。
- (5) Enable 属性:该属性的取值是 ‘on’(默认值)或 'off ',这个属性控制菜单项的可选择性。如果它的值是 'off ',则此时不能使用该菜单。此时,该菜单项呈灰色。
- (6) Position 属性:该属性的取值是数值,它定义一级菜单项在菜单条上的相对位置或子菜单项在菜单组内的相对位置。例如,对于一级菜单项,若Position属性值为1,则表示该菜单项位于图形窗口菜单条的可用位置的最左端。
- (7) Separator 属性:该属性的取值是 ‘on’ 或 ‘off’(默认值)。如果该属性值为 ‘on’,则在该菜单项上方添加一条分隔线,可以用分隔线将各菜单项按功能分开。
- 例如,我们建立图形演示系统,系统菜单条中含有 3 个菜单项:Plot、Option 和 Quit。Plot 菜单项中有 Sine Wave 和 Cosine Wave 两个子菜单项,分别控制在本图形窗口画出正弦和余弦曲线。Option 菜单项的内容如下图所示,其中 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','Callback',...
['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','Callback',...
['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',...
'Callback','grid on','Enable','off');
hgoff=uimenu(hoption,'Label','&Grid off',...
'Callback','grid off','Enable','off');
hbon=uimenu(hoption,'Label','&Box on', ...
'separator','on','Callback','box on','Enable','off');
hboff=uimenu(hoption,'Label','&Box off',...
'Callback','box off','Enable','off');
hwincor=uimenu(hoption,'Label','&Window Color','Separator','on');
uimenu(hwincor,'Label','&Red','Accelerator','r',...
'Callback','set(gcf,''color'',''r'');');
uimenu(hwincor,'Label','&Blue','Accelerator','b',...
'Callback','set (gcf,''color'',''b'');');
uimenu(hwincor,'Label','&Yellow','Callback',...
'set(gcf,''color'',''y'');');
uimenu(hwincor,'Label','&white','Callback',...
'set(gcf,''color'',''w'');');
%定义Quit菜单项
uimenu(gcf,'Label','&Quit','Callback','close(gcf)');
- 然后,我们选择 Plot ⟶ \longrightarrow ⟶Sine Wave 命令、Option ⟶ \longrightarrow ⟶Grid on 命令、Option ⟶ \longrightarrow ⟶Window Color ⟶ \longrightarrow ⟶Yellow 命令后,系统运行界面如下图所示。
3. 快捷菜单
- 快捷菜单是用鼠标右键单击某对象时在屏幕上弹出的菜单。这种菜单出现的位置是不固定的,而且总是和某个图形对象相联系。
- 在 MATLAB 中,可以使用
uicontextmenu
函数和图形对象的 UlContextMenu 属性来建立快捷菜单,具体步骤如下:
- (1) 利用
uicontextmenu
函数建立快捷菜单。
- (2) 利用
uimenu
函数为快捷菜单建立菜单项。
- (3) 利用
set
函数将该快捷菜单和某图形对象联系起来。
- 例如,我们绘制 y = 2 e − 0.5 x sin ( 2 π x ) y=2e^{-0.5x}\sin (2\pi x) y=2e−0.5xsin(2πx),并建立一个与之相联系的快捷菜单,用控制曲线的线型和曲线宽度。
- 程序如下:
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','虚线','Callback','set (hl,''LineStyle'','':'');');
uimenu(hls,'Label','实线','Callback','set (hl,''LineStyle'',''-'');');
uimenu(hlw,'Label','加宽','Callback','set (hl,''LineWidth'',2);');
uimenu(hlw,'Label','变细','Callback','set (hl,''LineWidth'',0.5);');
set(hl,'UIContextMenu',hc); %将该快捷菜单和曲线对象联系起来
- 此时是按默认参数(0.5 磅实线)画线。
- 我们将鼠标指针指向线条并右击,则弹出快捷菜单,如下图所示,选择菜单命令可以改变线型和曲线宽度。