![]() |
|
Matlab 由M函数文件产生用户菜单和控件
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
广告招租,e-mail:yesize@hotmail.com 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 就可获得题目所要求的图形用户界面。
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||