由M函数文件产生用户菜单和控件
已有 945 次阅读2010-9-1 04:58
|个人分类:matlab|
11.5 由M函数文件产生用户菜单和控件
11.5.1 利用全局变量编写用户界面函数文件
【 * 例 11.5.1-1 】目标:利用 M 函数文件创建与例 11.4.3.3-1 相同的用户界面。本例演示:如何依靠全局变量传递控件的图柄,从而保证回调动作正确执行。
(1)编写 M 函数文件 exm1151_1.m 和 calledit1.m
[exm1151_1.m]
function exm1151_1( )
global hedit hpop hlist
(这中间是:原 exm11433_1.m 第〈 1 〉行到第〈 25 〉行的全部指令)
set(hedit, 'callback' , 'calledit1' ); % 编辑框输入引起回调 <26>
set(hpop, 'callback' , 'calledit1' ); % 弹出框选择引起回调 <27>
set(hpush, 'callback' , 'calledit1' ); % 按键引起的回调 <28>
[calledit1.m]
function calledit1( )
global hedit hpop hlist
(下面续接内容是:原 calledit.m 第〈 2 〉行以下的全部指令)
(2)在 MATLAB 指令窗中运行 exm1151_1 就可获得题目所要求的图形用户界面。
11.5.2 利用 'UserData' 属性编写用户界面函数文件
【 * 例 11.5.2-1 】目标:利用 M 函数文件创建与例 11.4.3.3-1 相同的用户界面。本例演示:如何依靠图形窗的 'UserData' 属性传送用户控件的图柄,从而保证回调动作正确执行。
(1)编写 M 函数文件 exm1152_1.m 和 calledit2.m
[exm1152_1.m]
function exm1152_1( )
(这中间是:原 exm11433_1.m 第〈 1 〉行到第〈 25 〉行的全部指令)
set(hedit, 'callback' , 'calledit2' ); % 编辑框输入引起回调 <26>
set(hpop, 'callback' , 'calledit2' ); % 弹出框选择引起回调 <27>
set(hpush, 'callback' , 'calledit2' ); % 按键引起的回调 <28>
set(gcf, 'UserData' ,[hedit,hpop,hlist])
[calledit2.m]
function calledit2( )
H=get(gcf, 'UserData' );
ct=get(H(1), 'string' ); % 获得输入的字符串函数 <2>
vpop=get(H(2), 'value' ); % 获得选项的位置标识 <3>
vlist=get(H(3), 'value' ); % 获得选项位置向量 <4>
(下面续接内容是:原 calledit.m 第〈 5 〉行以下的全部指令)
(2)在 MATLAB 指令窗中运行 exm1152_1 就可获得题目所要求的图形用户界面。
11.5.3 利用递归法编写用户界面函数文件
【 * 例 11.5.3-1 】目标:利用 M 函数文件创建与例 11.4.3.3-1 相同的用户界面。本例演示:如何依靠图形窗 'UserData' 属性在递归调用中传送用户控件的图柄,保证回调动作正确执行。
(1)编写 M 函数文件 exm1153_1.m
[exm1153_1.m]
function exm1153_1(flag)
if nargin<1;flag= 'startup' ; end % 允许在无输入宗量形式下调用该函数 <2>
if ~ischar(flag);error( 'flag must be character ''startup''.' ); end
switch flag % 切换控制 <4>
case 'startup' % <5>
clf reset % <6>
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' );
uicontrol(gcf, 'Style' , 'text' , ... % 制作静态文本框
'position' ,[0.52,0.87,0.26,0.1], ...
'String' , ' 绘图指令输入框 ' );
hedit=uicontrol(gcf, 'Style' , 'edit' , ... % 制作可编辑文本框 <19>
'position' ,[0.52,0.05,0.26,0.8], ... % <20>
'Max' ,2); % 取 2 ,使 Max-Min>1 ,而允许多行输入 <21>
hpop=uicontrol(gcf, 'style' , 'popup' , ... % 制作弹出菜单 <22>
'position' ,[0.8,0.73,0.18,0.12], ... % <23>
'string' , 'spring|summer|autumn|winter' ); % 设置弹出框中选项名 <24>
hlist=uicontrol(gcf, 'Style' , 'list' , ... % 制作列表框 <25>
'position' ,[0.8,0.23,0.18,0.37], ... % <26>
'string' , 'Grid on|Box on|Hidden off|Axis off' , ... % 设置列表框中选项名 <27>
'Max' ,2); % 取 2 ,使 Max-Min>1 ,而允许多项选择 <28>
hpush=uicontrol(gcf, 'Style' , 'push' , ... % 制作与列表框配用的按键 <29>
'position' ,[0.8,0.05,0.18,0.15], 'string' , 'Apply' );
set(hedit, 'callback' , 'exm1153_1(''set'')' ); % 编辑框输入引起回调 <31>
set(hpop, 'callback' , 'exm1153_1(''set'')' ); % 弹出框选择引起回调 <32>
set(hpush, 'callback' , 'exm1153_1(''set'')' ); % 按键引起的回调 <33>
set(gcf, 'UserData' ,[hedit,hpop,hlist]); % 向 'UserData' 存放图柄 <34>
case 'set' % 以下是回调函数 <35>
H=get(gcf, 'UserData' ); % 从 'UserData' 获取图柄 <36>
ct=get(H(1), 'string' ); % 获得输入的字符串函数 <37>
vpop=get(H(2), 'value' ); % 获得选项的位置标识 <38>
vlist=get(H(3), 'value' ); % 获得选项位置向量 <39>
if ~isempty(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;
for k=1:4
if vv(k);eval(liststr{k}); else eval(invstr{k}); end % 按列表选项影响图形
end
end % <50>
end
(2)在 MATLAB 指令窗中运行 exm1153_1 就可获得题目所要求的图形用户界面(即图 11.4.3.3-1 无图形时的初始界面)。
【 * 例 11.5.3-2 】目标:利用 M 函数文件创建与例 11.4.3.3-1 相同的用户界面。本例演示:如何依靠 'Tag' 属性 与 findobj 指令的配合使用获取回调操作所必须的控件图柄,保证回调动作正确执行。
本例的程序可由 exm1153_1.m 做如下修改而得:
(1)删去 exm1153_1.m 的指令 <34><36> 。
(2)在 exm1153_1.m 的 <20> 和 <21> 行之间增添一行
'Tag' , 'H_edit' , ...
(3)在 exm1153_1.m 的 <23> 和 <24> 行之间增添一行
'Tag' , 'H_popup' , ...
(4)在 exm1153_1.m 的 <27> 和 <28> 行之间增添一行
'Tag' , 'H_list' , ...
(5)把 exm1153_1.m 的 <31><32><33> 条指令中的 exm1153_1 改为 exm1153_2 。
(6)在 exm1153_1.m 的 <35> 和 <37> 行之间增添以下三条指令。
H(1)=findobj(gcf, 'Tag' , 'H_edit' );
H(2)=findobj(gcf, 'Tag' , 'H_popup' );
H(3)=findobj(gcf, 'Tag' , 'H_list' );
(7)把 exm1153_1.m 的函数头修改为
function exm1153_2(flag)
(8)把修改后的文件“另存为” exm1153_2.m ,就完成了新文件的编写。 ( 9 )在 MATLAB 指令窗中运行 exm1153_2 就可获得题目所要求的图形用户界面。