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

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

Demo VC6.0工程

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

FLTK学习-9-相同窗口不同内容显示切换_第1张图片

salarys

FLTK学习-9-相同窗口不同内容显示切换_第2张图片

types

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


线程函数


[cpp] view plain copy print ?
  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. }  


        分析:线程刷新函数中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】

你可能感兴趣的:(FLTK学习-9-相同窗口不同内容显示切换)