11.4 用户控件(uicontrol)
11.4.3 控件制作示例
11.4.3.1 双位按键、无线电按键、控件区域框示例
【 * 例 11.4.3.1-1 】目标:创建一个界面包含 4 种控件:静态文本、“无线电”选择开关、双位按键、控件区域框。
[exm11431_1.m]
clf reset
set(gcf, 'menubar' , 'none' )
set(gcf, 'unit' , 'normalized' , 'position' ,[0.2,0.2,0.64,0.32]);
set(gcf, 'defaultuicontrolunits' , 'normalized' ) % 设置用户缺省控件单位属性值
h_axes=axes( 'position' ,[0.05,0.2,0.6,0.6]);
t=0:pi/50:2*pi;y=sin(t);plot(t,y);
set(h_axes, 'xlim' ,[0,2*pi]);
set(gcf, 'defaultuicontrolhorizontal' , 'left' );
htitle=title( ' 正弦曲线 ' );
set(gcf, 'defaultuicontrolfontsize' ,12); % 设置用户缺省控件字体属性值
uicontrol( 'style' , 'frame' , ... % 创建用户控件区 <11>
'position' ,[0.67,0.55,0.25,0.25]);
uicontrol( 'style' , 'text' , ... % 创建静态文本框 <13>
'string' , ' 正斜体图名 :' , ...
'position' ,[0.68,0.77,0.18,0.1], ...
'horizontal' , 'left' );
hr1=uicontrol(gcf, 'style' , 'radio' , ... % 创建“无线电”选择按键 <17>
'string' , ' 正体 ' , ... % 按键功能的文字标识 ' 正体 '
'position' ,[0.7,0.69,0.15,0.08]); % 按键位置
set(hr1, 'value' ,get(hr1, 'Max' )); % 因图名缺省使用正体,所以小圆圈应被点黑 <20>
set(hr1, 'callback' ,[ ... % <21>
'set(hr1,''value'',get(hr1,''max'')),' , ... % 选中将小圆圈点黑 <22>
'set(hr2,''value'',get(hr2,''min'')),' , ... % 将“互斥”选项点白 <23>
'set(htitle,''fontangle'',''normal''),' , ... % 使图名字体正体显示
]);
hr2=uicontrol(gcf, 'style' , 'radio' , ... % 创建“无线电”选择按键 <26>
'string' , ' 斜体 ' , ... % 按键功能的文字标识 ' 斜体 '
'position' ,[0.7,0.58,0.15,0.08], ... % 按键位置
'callback' ,[ ...
'set(hr1,''value'',get(hr1,''min'')),' , ... % <30>
'set(hr2,''value'',get(hr2,''max'')),' , ... % <31>
'set(htitle,''fontangle'',''italic'')' , ... % 使图名字体斜体显示
]); % <33>
ht=uicontrol(gcf, 'style' , 'toggle' , ... % 制作双位按键 <34>
'string' , 'Grid' , ...
'position' ,[0.67,0.40,0.15,0.12], ...
'callback' , 'grid' );

图 11.4.3.1-1 静态文本、选择开关、双位按键及控件区域框
11.4.3.2 静态文本框、滑动键、检录框示例
【 * 例 11.4.3.2-1 】目标:制作演示“归一化二阶系统单位阶跃响应”的交互界面。在该界面中,阻尼比可在 [0.02,2.02] 中连续调节,标志当前阻尼比值;可标志峰值时间和大小;可标志(响应从 0 到 0.95 所需的)上升时间。本例涉及以下主要内容:( A )静态文本的创建和实时改写。( B )滑动键的创建; 'Max' 和 'Min' 的设置; 'Value' 的设置和获取。( C )检录框的创建; 'Value' 的获取。( D )受多个控件影响的回调操作。
[exm11432_1.m]
clf reset
set(gcf, 'unit' , 'normalized' , 'position' ,[0.1,0.2,0.64,0.35]);
set(gcf, 'defaultuicontrolunits' , 'normalized' );
set(gcf, 'defaultuicontrolfontsize' ,12);
set(gcf, 'defaultuicontrolfontname' , ' 隶书 ' );
set(gcf, 'defaultuicontrolhorizontal' , 'left' );
str= ' 归一化二阶系统阶跃响应曲线 ' ;
set(gcf, 'name' ,str, 'numbertitle' , 'off' ); % 书写图形窗名
h_axes=axes( 'position' ,[0.05,0.2,0.6,0.7]); % 定义轴位框位置
set(h_axes, 'xlim' ,[0,15]); % 设置时间轴长度
str1= ' 当前阻尼比 =' ;
t=0:0.1:10;z=0.5;y=step(1,[1 2*z 1],t);
hline=plot(t,y);
htext=uicontrol(gcf, 'style' , 'text' , ... % 制作静态说明文本框 <14>
'position' ,[0.67,0.8,0.33,0.1], ...
'string' ,[str1,sprintf( '%1.4g\' ,z)]);
hslider=uicontrol(gcf, 'style' , 'slider' , ... % 创建滑动键 <17>
'position' ,[0.67,0.65,0.33,0.1], ...
'max' ,2.02, 'min' ,0.02, ... % 设最大阻尼比为 2 ,最小阻尼比为 0.02 <19>
'sliderstep' ,[0.01,0.05], ... % 箭头操纵滑动步长 1% ,游标滑动步长 5% <20>
'Value' ,0.5); % 缺省取阻尼比等于 0.5 <21>
hcheck1=uicontrol(gcf, 'style' , 'checkbox' , ... % 创建峰值检录框 <22>
'string' , ' 最大峰值 ' , ...
'position' ,[0.67,0.50,0.33,0.11]);
vchk1=get(hcheck1, 'value' ); % 获得峰值检录框的状态值 <25>
hcheck2=uicontrol(gcf, 'style' , 'checkbox' , ... % 创建上升时间检录框 <26>
'string' , ' 上升时间 (0->0.95)' , ...
'position' ,[0.67,0.35,0.33,0.11]);
vchk2=get(hcheck2, 'value' ); % 获得上升时间检录框的状态值 <29>
set(hslider, 'callback' ,[ ... % 操作滑动键 , 引起回调 <30>
'z=get(gcbo,''value'');' , ... % 获得滑动键状态值 <31>
'callcheck(htext,str1,z,vchk1,vchk2)' ]); % 被回调的函数文件 <32>
set(hcheck1, 'callback' ,[ ... % 操作峰值检录框 , 引起回调 <33>
'vchk1=get(gcbo,''value'');' , ... % 获得峰值检录框状态值 <34>
'callcheck(htext,str1,z,vchk1,vchk2)' ]); % 被回调的函数文件 <35>
set(hcheck2, 'callback' ,[ ... % 操作峰值检录框 , 引起回调 <36>
'vchk2=get(gcbo,''value'');' , ... % 获得峰值检录框状态值 <37>
'callcheck(htext,str1,z,vchk1,vchk2)' ]); % 被回调的函数文件 <38>
[callcheck.m]
function callcheck(htext,str1,z,vchk1,vchk2)
cla,set(htext, 'string' ,[str1,sprintf( '%1.4g\' ,z)]); % 更新静态文本框内容 <2>
dt=0.1;t=0:dt:15;N=length(t);y=step(1,[1 2*z 1],t);plot(t,y);
if vchk1 % 假如峰值框被选中 <4>
[ym,km]=max(y);
if km<(N-3) % 假如在设定时间范围内能插值 <6>
k1=km-3;k2=km+3;k12=k1:k2;tt=t(k12);
yy=spline(t(k12),y(k12),tt); % 局部样条插值 <8>
[yym,kkm]=max(yy); % 求更精确的峰值位置
line(tt(kkm),yym, 'marker' , '.' , ... % 画峰值点 <10>
'markeredgecolor' , 'r' , 'markersize' ,20);
ystr=[ 'ymax = ' ,sprintf( '%1.4g\' ,yym)];
tstr=[ 'tmax = ' ,sprintf( '%1.4g\' ,tt(kkm))];
text(tt(kkm),1.05*yym,{ystr;tstr})
else % 假如在设定时间范围内不能插值 <15>
text(10,0.4*y(end),{ 'ymax --> 1' ; 'tmax --> inf' })
end
end
if vchk2 % 假如上升时间框被选中 <19>
k95=min(find(y>0.95));k952=[(k95-1),k95];
t95=interp1(y(k952),t(k952),0.95); % 线性插值 <21>
line(t95,0.95, 'marker' , 'o' , 'markeredgecolor' , 'k' , 'markersize' ,6);
tstr95=[ 't95 = ' ,sprintf( '%1.4g\' ,t95)];
text(t95,0.65,tstr95)
end

图 11.4.3.2-1
11.4.3.3 可编辑框、弹出框、列表框、按键示例
【 * 例 11.4.3.3-1 】目标:制作一个能绘制任意图形的交互界面。它包括:可编辑文本框、弹出框、列表框。本例的关键内容是:如何使编辑框允许输入多行指令。
[exm11433_1.m]
clf reset % <1>
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' , ... % 制作可编辑文本框 <14>
'position' ,[0.52,0.05,0.26,0.8], ...
'Max' ,2); % 取 2 ,使 Max-Min>1 ,而允许多行输入 <16>
hpop=uicontrol(gcf, 'style' , 'popup' , ... % 制作弹出菜单 <17>
'position' ,[0.8,0.73,0.18,0.12], ...
'string' , 'spring|summer|autumn|winter' ); % 设置弹出框中选项名 <19>
hlist=uicontrol(gcf, 'Style' , 'list' , ... % 制作列表框 <20>
'position' ,[0.8,0.23,0.18,0.37], ...
'string' , 'Grid on|Box on|Hidden off|Axis off' , ... % 设置列表框中选项名 <22>
'Max' ,2); % 取 2 ,使 Max-Min>1 ,而允许多项选择 <23>
hpush=uicontrol(gcf, 'Style' , 'push' , ... % 制作与列表框配用的按键 <24>
'position' ,[0.8,0.05,0.18,0.15], 'string' , 'Apply' );
set(hedit, 'callback' , 'calledit(hedit,hpop,hlist)' ); % 编辑框输入引起回调 <26>
set(hpop, 'callback' , 'calledit(hedit,hpop,hlist)' ); % 弹出框选择引起回调 <27>
set(hpush, 'callback' , 'calledit(hedit,hpop,hl[1] [2] 下一页 |