FLTK学习-9-相同窗口不同内容显示切换

      在窗口的同一个位置切换不同的显示内容,所有的内容都是一个在同一个构件上显示的,可以切换显示的内容。

Demo VC6.0工程

      demo的界面,很简单,按change键切换不同的显示,开始时是空的,按一下显示salarys,再按一下显示types,再按一下返回空白界面。后台一个线程负责刷新数据。


salarys


types

      奇怪的问题:在VC6+fltk1.1.10中刷新有些问题,详见下面的代码分析。在VS2008+FLTK1.3.x中正常。


线程函数


  1. void thread_fun(void *pdata)    
  2. {    
  3.     WndStruct *pWndStruct = (WndStruct *)pdata;    
  4.     int i = 1;    
  5.     int k = 0;    
  6.     srand(time(0));    
  7.     for (;;)    
  8.     {    
  9.         for(k=0; k<N_SALARY; k++)    
  10.         {    
  11.             if(i%1000==0)    
  12.                 ++salarys[k].year;     
  13.             salarys[k].salary = 5000+i;    
  14.         }    
  15.         for(k=0; k<N_TYPES; ++k)    
  16.         {    
  17.             char randNum = (char)(5*rand()/(float)RAND_MAX);    
  18.             typess[k].height = 30+randNum*5.18;    
  19.             typess[k].weight = 5+randNum*0.31;    
  20.         }    
  21.         ++i;    
  22.         if(i>100000)    
  23.             i=0;     
  24.     
  25.         for(int i=1; i<3; ++i)    
  26.         {    
  27.             if (pWndStruct[i].pWnd && pWndStruct[i].isShow)    
  28.             {    
  29.                 pWndStruct[i].pDynFunc(&pWndStruct[i]);    
  30. //              ((CMyWnd *)pWndStruct[i].pWnd)->redraw();    //-----1     
  31.                 pWndStruct[i].pWnd->redraw();                //-----2     
  32. //              pWndStruct[i].pWnd->damage(FL_DAMAGE_ALL);   //-----3     
  33.     
  34.             }    
  35.         }  
  36.         Fl::flush();   //----new 5-1     
  37.         Sleep(300);    
  38.     }    
  39. }  
void thread_fun(void *pdata)  
{  
    WndStruct *pWndStruct = (WndStruct *)pdata;  
    int i = 1;  
    int k = 0;  
    srand(time(0));  
    for (;;)  
    {  
        for(k=0; k<N_SALARY; k++)  
        {  
            if(i%1000==0)  
                ++salarys[k].year;   
            salarys[k].salary = 5000+i;  
        }  
        for(k=0; k<N_TYPES; ++k)  
        {  
            char randNum = (char)(5*rand()/(float)RAND_MAX);  
            typess[k].height = 30+randNum*5.18;  
            typess[k].weight = 5+randNum*0.31;  
        }  
        ++i;  
        if(i>100000)  
            i=0;   
  
        for(int i=1; i<3; ++i)  
        {  
            if (pWndStruct[i].pWnd && pWndStruct[i].isShow)  
            {  
                pWndStruct[i].pDynFunc(&pWndStruct[i]);  
//              ((CMyWnd *)pWndStruct[i].pWnd)->redraw();	//-----1  
                pWndStruct[i].pWnd->redraw();				//-----2  
//              pWndStruct[i].pWnd->damage(FL_DAMAGE_ALL);	//-----3  
  
            }  
        }
		Fl::flush();   //----new 5-1  
        Sleep(300);  
    }  
}


        分析:线程刷新函数中VC6中只能使用//------1行刷新,如果使用第2行,则数据头能够显示出来,数据需要动动鼠标或者什么的才能刷新,可能是刷新机制有问题。而在VS2008中可以使用2,3行的刷新函数。而且使用第//-----1行的刷新时,如果把矩形颜色设为red,刷新时部分数据有时会变成红色闪烁。

        至于VC6中使用第1行刷新,扫了一下fltk源码,fl_widget的redraw函数不是virtual,在派生类中实现redraw会隐藏基类的实现,但是wndstruct中的pWnd是fl_widget指针,默认应该是调用基类fl_widget的实现??

        哎!没想明白!

【刚刚知道原因,没有调用Fl::flush()函数,在刷新的时候调用一次该函数即可刷新,应该是全部页面的刷新---不确定,加入//new 5-1一句,即可实现刷新。-------2013.5.1 Note】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值