找回密码
 注册
Simdroid-非首页
查看: 74|回复: 0

关于嵌入到窗口中的waitbar

[复制链接]
发表于 2008-11-9 13:13:35 | 显示全部楼层 |阅读模式 来自 北京
最近用到了waitbar,但是Matlab的waitbar总游离于主窗口之外,网上有人介绍放入主窗口的办法,事实上就是精简Matlab本身的waitbar,但是这仍然不能满足我的要求,主要是我的界面还要另外plot新的figure,而patch不检查当前绘图区域,所以如果在waitbar绘制过程中点击了plot出来的figure或者别的figure,那么进度条r就会在当前的figure下画,问题很让人头疼
关于patch,按照Matlab说法,它不像其他高级绘图命令,patch不检查figure和axes的所有权,只是简单的向当前axes上画patch,如果有多个figure或者axes,像我这种情况,麻烦就来了
所以在使用patch前,必须告诉Matlab,把要画的figure和axes说清楚。这样,基本就实现了完美的嵌入式进度条显示:
首先在GUI窗口中找出一块空地,放上一个axes,起个名字,我起的名字是TheWaitBar,然后,如果某一时刻触发,使waitbar开始画图(比如点了开始计算的OK键),那么加入下面一段话的执行:

  1. TheEndTime = 6000; % 自己定义的循环次数
  2. h = get(handles.TheWaitBar,'title');
  3. set(h,'String','Please Wait...');
  4. for t = 1:TheEndTime
  5.        MyWaitBar(t/TheEndTime,handles);
  6.        V(t) = sin(t);    % 举个计算的例子
  7. end
  8. cla;
  9. set(h,'String',''); % 打扫战场
复制代码
其中的handles就是GUI中的handles。
调用下面自己写的waitbar函数:

  1. function MyWaitBar(t,handles)
  2. if nargin == 2
  3.         set(0,'CurrentFigure',handles.figure1);   % 告诉Matlab当前的绘图窗口
  4.         set(handles.figure1,'CurrentAxes',handles.TheWaitBar); % 告诉Matlab当前的绘图区域
  5. end
  6. x = t*100;
  7. xpatch = [0 x x 0];
  8. ypatch = [0 0 1 1];
  9. patch(xpatch,ypatch,'b','EdgeColor','b','EraseMode','none');
  10. drawnow;
复制代码
其中handles.figure1是当前GUI主窗口(也就是TheWaitBar所在窗口的句柄),如果你有多个GUI窗口,在程序里写个handles不加分号看一看TheWaitBar在哪个里就可以了。
这样的话,如果你有多个figure,无论你如何用鼠标选择当前窗口,程序都会在TheWaitBar控件上绘制图形进度条。
我对GUI初学,有什么不恰当的地方,还请大家多多指教,小弟在此权作抛砖引玉

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Simapps系列直播

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-10-7 11:26 , Processed in 0.036374 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表