212 颜色控制.docx
《212 颜色控制.docx》由会员分享,可在线阅读,更多相关《212 颜色控制.docx(31页珍藏版)》请在冰点文库上搜索。
212颜色控制
颜色控制
uimenu对象可设置两个颜色属性。
'BackGroundColor'属性控制填充菜单背景的颜色。
缺省值是浅灰。
另一颜色属性为'ForeGroundColor',它确定菜单项文本的颜色,缺省值是黑色。
颜色属性同样能很好地用于顶层菜单条和下拉菜单。
颜色可以用来表示状态信息或简单加上菜单的特色。
例如,挑选线段颜色。
在子菜单中,各菜单项的背景可以填充合适的色彩。
>>Hm_green=uimenu(Hm_color,'Label','Green','BackgroundColor','g',...
'Callback','set(Hl_line,'Color','g')');
菜单项去能
改变对象uimenu的'Enable'值或'Visible'属性可使菜单项暂时去能。
'Enable'属性通常设
为'on'。
当'Enable'属性'设为'off'时,标志字符串变灰,菜单项去能。
在这种状态下,菜单项保持可见但不能被选择。
此属性可用来将不恰当的菜单选择去能。
下面的例子(mmenu4.m)说明了用两个菜单项和'Enable'属性来设定坐标轴的'Box'属性的另一种方法。
>>Hm_top=uimenu('Label',Example');
>>Hm_boxon=uimenu(Hm_top,'Label','SetBoxOn'...'CallBack',[...
'set(gca,''Box'',''on''),',...
'set(Hm_boxon,''Enable'',''off''),',...
'set(Hm_boxoff,''Enable'',''Enable'',''on'')']);
>>Hm_boxoff=uimenu(Hm_top,'Label',SetBoxOff',...'Enable','off',...'CallBack',[...
'set(gca,''Box'',''off''),',...
'set(Hm_boxon,''Enable'',''on''),',...
'set(Hm_boxoff,''Enable'',''off'')']);
设定'Visible'属性为'off',可将菜单项完全隐藏。
菜单项象是从屏幕中消失,而其它菜单项改变了在显示器上的位置以填补由当前不可见菜单造成的空隙。
然而,不可见的菜单仍然存在,而且uimenu对象
的'Position'属性值也不改变。
当属性'Visible'又重新设为'on'时,菜单项重新出现在正常的位置。
这个性质可以用来暂时地撤消一个菜单。
下面的例子(mmenu5.m)建立了两个顶层菜单和两个菜单项。
>>Hm_control=uimenu('Label','Control');
>>Hm_extra=uimenu('Label','Extra');
>>Hm_limit=uimenu(Hm_control,'Label','LimitedMenus',...
'CallBack','set(Hm_extra,''Viseble'',''off'')');
>>Hm_full=uimenu(Hm_control,'Label','FullMenus',...
'CallBack','set(Hm_extra,''Visible'',''on'')');
当选择了LimitedMenus项时,Extra菜单就从菜单条中消失。
当选择了FullMenus项时,Extra菜单又重新显示在原来的位置的菜单条上。
回调属性
'Callback'属性值是一个MATLAB字符串,MATLAB将它传给函数eval并在命令窗口工作空间执
行。
它对于函数M文件有重要的隐含意义,我们将在本章后面继续讨论这一属性。
因为'Callback'属性必须是字符串,所以在字符号内多重MATLAB命令、后续行以及字符串都会使必需的句法变得十分复杂。
如果有不止一个命令要执行,命令间必须适当地分隔开来。
例如,
>>uimenu('Label','Test','CallBack','gridon;set(gca,''Box'',''on'')');
把一个字符串传给eval,使命令
>>gridon;set(gca,'Box','on')
在命令窗口工作空间中执行。
这是合法的句法,因为命令用逗号或分号隔开,多重命令可输入到同一命令行中。
在定义回调函数时,也遵循MATLAB规定,即在已引用的字符串内,用两个单引号来表示单引号。
字符串可以串接起来生成一个合法MATLAB字符串,只要把它们括在方括号中。
>>uimenu('Label','Test','CallBack',['gridon,','set(gca,''Box'',''on'')']);
注意字符串'gridon'含有所需的逗号以分隔两个命令。
如果使用了续行号,上述命令可写为
>>uimenu('Label','Test',...
'CallBack',[...
'gridon,',...
'set(gca,''Box'',''on'')'...
]);
上例中命令行被分隔,每行的末尾加上了三个句号表示命令的继续。
注意到上列单行的所有元素都被保留,包括字符串分隔命令的逗号。
在'gridon,…'行中最后引号后的逗号是可选的;下一行开始的空格起相同的作用。
欲了解详情,请参阅前面关于建立行向量的章节。
如果引号、逗号和括号不正确输入,MATLAB将给出警告;但在复杂回调字符串中很难寻找错误
的。
为了使错误最少,对包含MATLAB语句的回调字符串请记住以下的一些规则:
把整个回调字符串括在方括号中,不要忘记最后的右括号')'。
把各语句括上单引号。
已引用的字符串内,要用双引号。
如:
'quoted':
'a''quoted''string';'Quote''a'''quoted'''string''now'。
在引号后要用逗号或空格结尾。
除了最后一句,各语句在引号内要以逗号或分号结尾;在引号后要用逗号或空格结尾。
有后续行的各行要以三个句号(...)结尾。
前面的例子之一mmenu4.m是所涉及的回调字符串句法的很好说明。
>>Hm_top=unimenu(Label','Example');
>>HM_boxon=uimenu(Hm_top,...
'Label','Set'Boxon',...
'CallBack',[...
'set(gca,''Box'',''on''),',...
set(Hm_boxon,''Enable'',''off''),',...
set(Hm_boxoff,''Enable'',''on'')'];
>>Hm_boxoff=uimenu(Hm_top,...
'Label','SetBoxoff',...
'Enable','off'',',...
'CallBack',[...
'set(gca,''Box'',''off'',',...
'set(Hm_boxon,''Enable'',''on''),',...
'set(Hm_boxoff''Enable'',''off'')'];
上例中还引出了关于回调函数另一个重点,在变量Hm_boxoff定义之前,在回调串中用Hm_boxoff替代Hm_boxon。
因为回调串只是一个字符串,MATLAB不会给出警告,而且仅在uimenu被激活并将字符串传给eval时才由MATLAB执行。
它隐含有函数M文件的设计和测试,这将在本章后面讨论。
M文件的举例
下例将演示一组简单菜单的生成。
该例子包含在精通MATLAB工具箱的函数M文件mmenus中。
正如下面所示的那样,这个函数文件被分隔成了若干块,以便于讨论函数的各个方面。
首先,定义一个函数并在当前的图形中用顶层Line菜单建立菜单条,该菜单分别含有三个子菜单:
LineStyle,LineWidth,LineColor。
functionmmenus()
%MMENUSSimplemenuexample.
%MMENUSuseswaitforbuttonpressandgcoincallbackstrings
%tolettheusermakeamenuselectionandthenselectanobject
%byclickingonitwiththemouse.Thecallbackstringsthenuse
%thesetfunctiontoapplythepropertyvaluetotheselected
%object.
%Copyright(c)1996byPrentice-Hall,Inc.
Hm_line=uimenu(gcf,'label'.'Line');
Hm_lstyle=uimenu(Hm_line,'label','LineStyle');
Hm_lwidth=uimenu(Hm_line,'label','Linewidth');
Hm_lcolor=uimenu(Hm_'label,'LineColor');
其次,使用waitforbuttonpress和gco得到当前对象的句柄,确认它为一个线对象,并采用适当的'Linestyle'值。
注意这些菜单项句柄以后不再使用,所以它们不必保存。
uimenu(Hm_lstyle,'Label',Solid',...
'CallBack',('waitforbuttonpress;',...
'ifget(gco,''type'')==''line'','...
'set(gco,''LineStyle'',''-''),'...
'end']);
uimenu(Hm_lstyle,'Label',Dotted',...
'Callback',['waitforbuttonpress;',...
'ifget(gco,''Type'')==''line'',',...
'set(gco,''LineStyle'','','':
''),'...
'end']);
uimenu(Hm_lstyle,'Label',Dashed',...
'Callback',['waitforbuttonpress;',...
'ifget(gco,''Type'')==''line'',',...
'set(gco,''LineStyle'',''-'':
''),'...
'end']);
uimenu(Hm_lstyle,'Label',DashDot',...
'Callback',['waitforbuttonpress;',...
'ifget(gco,''Type'')==''line'',',...
'set(gco,''LineStyle'',''-'':
''),'...
'end']);
现在,对Linewidth子菜单项也做同样的操作:
uimenu(Hm_lwitdth,'Label','Default',...
'CallBack',['witforbuttonpress;',...
'ifget(gco,''Type'')==''line'',',...
'set(gco,''LineWidth'',0.5),',...
'end']);
uimenu(Hm_lwitdth,'Label','Thick',...
'CallBack',['witforbuttonpress;',...
'ifget(gco,''Type'')==''line'',',...
'set(gco,''LineWidth'',2.0),',...
'end']);
uimenu(Hm_lwitdth,'Label','Thicker',...
'CallBack',['witforbuttonpress;',...
'ifget(gco,''Type'')==''line'',',...
'set(gco,''LineWidth'',3.0),',...
'end']);
uimenu(Hm_lwitdth,'Label','Thickest',...
'CallBack',['witforbuttonpress;',...
'ifget(gco,''Type'')==''line'',',...
'set(gco,''LineWidth'',4.0),',...
'end']);
对LineColor子菜单项也做同样的操作。
将菜单项背景加色并在合适时改变文本颜色。
uimenu(Hm_lcolor,'Label','yellow',...
'BackgroundColor','y',...
'CallBack',['witforbuttonpress;',...
'ifget(gco,''Type'')==''line'',',...
'set(gco,''color'','''y''),',...
'end']);
uimenu(Hm_lcolor,'Label','Magenta',...
'BackgroundColor','m','ForegroundColor','w'...
'CallBack',['witforbuttonpress;',...
'ifget(gco,''Type'')==''line'',',...
'set(gco,''color'','''m''),',...
'end']);
uimenu(Hm_lcolor,'Label','yan',...
'BackgroundColor','c',...
'CallBack',['witforbuttonpress;',...
'ifget(gco,''Type'')==''line'',',...
'set(gco,''color'','''c''),',...
'end']);
uimenu(Hm_lcolor,'Label','Red',...
'BackgroundColor','r','ForegroundColor','w',...
'CallBack',['witforbuttonpress;',...
'ifget(gco,''Type'')==''line'',',...
'set(gco,''color'','''r''),',...
'end']);
uimenu(Hm_lcolor,'Label','Green',...
'BackgroundColor','g',...
'CallBack',['witforbuttonpress;',...
'ifget(gco,''Type'')==''line'',',...
'set(gco,''color'','''g''),',...
'end']);
uimenu(Hm_lcolor,'Label','Blue',...
'BackgroundColor','b','ForegroundColor','w',...
'CallBack',['witforbuttonpress;',...
'ifget(gco,''Type'')==''line'',',...
'set(gco,''color'','''b''),',...
'end']);
uimenu(Hm_lcolor,'Label','White',...
'BackgroundColor','w',...
'CallBack',['witforbuttonpress;',...
'ifget(gco,''Type'')==''line'',',...
'set(gco,''color'','''w''),',...
'end']);
uimenu(Hm_lcolor,'Label','Black',...
'BackgroundColor','k','ForegroundColor','w',...
'CallBack',['witforbuttonpress;',...
'ifget(gco,''Type'')==''line'',',...
'set(gco,''color'','''k''),',...
'end']);
为使这一函数更完全,可用同样方法增加另外的菜单以改变坐标轴、曲面、补片和图形的属性。
例如,下面加上了一个Color映象以改变图形颜色的映象。
Hm_cmap=uimenu(gcf,'Label','ColorMap');
uimenu(Hm_cmap,'Label','Lighter','CallBack','brighten(.3)');
uimenu(Hm_cmap,'Label','Darker','CallBack','brighten(-.3)');
uimenu(Hm_cmap,'Label','Default','CallBack','colormap(''default'')');
uimenu(Hm_cmap,'Label','Gray','CallBack','colormap(gray)');
uimenu(Hm_cmap,'Label','Hot','CallBack','colormap(hot)');
uimenu(Hm_cmap,'Label','Cool','CallBack','colormap(cool)');
uimenu(Hm_cmap,'Label','Bone','CallBack','colormap(bone)');
uimenu(Hm_cmap,'Label','Copper','CallBack','colormap(copper)');
uimenu(Hm_cmap,'Label','Pink','CallBack','colormap(pink)');
uimenu(Hm_cmap,'Label','Prism','CallBack','colormap(prism)');
uimenu(Hm_cmap,'Label','Jet','CallBack','colormap(jet)');
uimenu(Hm_cmap,'Label','Flag','CallBack','colormap(flag)');
uimenu(Hm_cmap,'Label','HSV','CallBack','colormap(hsvflag)');
最后,加上含有两个菜单项的Quit菜单。
其中,CloseFigure关闭图形;RemoveMenus让图形打开但删除用户的顶层菜单及所有它的子菜单。
drawnow命令立即删除菜单。
Hm_quit=uimenu(GCF,'lABEL','quit');
uimenu(Hm_quit,'Label','CloseFigure','CallBack','close;return');
uimenu(Hm_quit,'Label','RemoveMenu',...
'Callback',[...
'delete(findobj(gcf,''Type,''uimenu'',''parent'',gcf)),',...
'drawnow']);
精通MATLAB工具箱中有许多采用这种技术的函数和其它建立有用的基于对象工具的函数。
其中许多函数将在本章后面详细讨论。
21.4控制框
在各计算机平台上,窗口系统都采用控制框和菜单,让用户进行某些操作,或设置选项或属性。
控制框是图形对象,如图标、文本框和滚动条,它和菜单一起使用以建立用户图形界面,称之为窗口系统和计算机窗口管理器。
MATLAB控制框,又称uicontrol,与窗口管理器所用的函数十分相似。
它们是图形对象,可以放置在MATLAB的图形窗中的任何位置并用鼠标激活。
MATLAB的uicontrol包括按钮、滑标、文本框及弹出式菜单。
由MATLAB生成的uicontrol