我要加入 登录
声振论坛 返回首页

aspenye的个人空间 http://home.vibunion.com/?60755 [收藏] [复制] [分享] [RSS]

日志

由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 就可获得题目所要求的图形用户界面。 

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 我要加入

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-18 13:35 , Processed in 0.093549 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部