`
chinamming
  • 浏览: 141178 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

DemoVC6.0工程

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


salarys


types

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


线程函数


  1. voidthread_fun(void*pdata)
  2. {
  3. WndStruct*pWndStruct=(WndStruct*)pdata;
  4. inti=1;
  5. intk=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. charrandNum=(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. for(inti=1;i<3;++i)
  25. {
  26. if(pWndStruct[i].pWnd&&pWndStruct[i].isShow)
  27. {
  28. pWndStruct[i].pDynFunc(&pWndStruct[i]);
  29. //((CMyWnd*)pWndStruct[i].pWnd)->redraw();//-----1
  30. pWndStruct[i].pWnd->redraw();//-----2
  31. //pWndStruct[i].pWnd->damage(FL_DAMAGE_ALL);//-----3
  32. }
  33. }
  34. Fl::flush();//----new5-1
  35. Sleep(300);
  36. }
  37. }


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

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

DemoVC6.0工程

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


salarys


types

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


线程函数


  1. voidthread_fun(void*pdata)
  2. {
  3. WndStruct*pWndStruct=(WndStruct*)pdata;
  4. inti=1;
  5. intk=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. charrandNum=(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. for(inti=1;i<3;++i)
  25. {
  26. if(pWndStruct[i].pWnd&&pWndStruct[i].isShow)
  27. {
  28. pWndStruct[i].pDynFunc(&pWndStruct[i]);
  29. //((CMyWnd*)pWndStruct[i].pWnd)->redraw();//-----1
  30. pWndStruct[i].pWnd->redraw();//-----2
  31. //pWndStruct[i].pWnd->damage(FL_DAMAGE_ALL);//-----3
  32. }
  33. }
  34. Fl::flush();//----new5-1
  35. Sleep(300);
  36. }
  37. }


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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics