在窗口的同一个位置切换不同的显示内容,所有的内容都是一个在同一个构件上显示的,可以切换显示的内容。
Demo VC6.0工程
demo的界面,很简单,按change键切换不同的显示,开始时是空的,按一下显示salarys,再按一下显示types,再按一下返回空白界面。后台一个线程负责刷新数据。
salarys
types
奇怪的问题:在VC6+fltk1.1.10中刷新有些问题,详见下面的代码分析。在VS2008+FLTK1.3.x中正常。
线程函数
- 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);
- }
- }
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】