在窗口的同一个位置切换不同的显示内容,所有的内容都是一个在同一个构件上显示的,可以切换显示的内容。
DemoVC6.0工程
demo的界面,很简单,按change键切换不同的显示,开始时是空的,按一下显示salarys,再按一下显示types,再按一下返回空白界面。后台一个线程负责刷新数据。
salarys
types
奇怪的问题:在VC6+fltk1.1.10中刷新有些问题,详见下面的代码分析。在VS2008+FLTK1.3.x中正常。
线程函数
- voidthread_fun(void*pdata)
- {
- WndStruct*pWndStruct=(WndStruct*)pdata;
-
inti=1;
-
intk=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)
- {
-
charrandNum=(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(inti=1;i<3;++i)
- {
-
if(pWndStruct[i].pWnd&&pWndStruct[i].isShow)
- {
- pWndStruct[i].pDynFunc(&pWndStruct[i]);
-
-
pWndStruct[i].pWnd->redraw();
-
- }
- }
-
Fl::flush();
- 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】
在窗口的同一个位置切换不同的显示内容,所有的内容都是一个在同一个构件上显示的,可以切换显示的内容。
DemoVC6.0工程
demo的界面,很简单,按change键切换不同的显示,开始时是空的,按一下显示salarys,再按一下显示types,再按一下返回空白界面。后台一个线程负责刷新数据。
salarys
types
奇怪的问题:在VC6+fltk1.1.10中刷新有些问题,详见下面的代码分析。在VS2008+FLTK1.3.x中正常。
线程函数
- voidthread_fun(void*pdata)
- {
- WndStruct*pWndStruct=(WndStruct*)pdata;
-
inti=1;
-
intk=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)
- {
-
charrandNum=(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(inti=1;i<3;++i)
- {
-
if(pWndStruct[i].pWnd&&pWndStruct[i].isShow)
- {
- pWndStruct[i].pDynFunc(&pWndStruct[i]);
-
-
pWndStruct[i].pWnd->redraw();
-
- }
- }
-
Fl::flush();
- 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】
分享到:
相关推荐
基于C++的轻量级UI设计库,由于它同时支持在Windows和Linux,所以对跨平台使用非常有用。
离线安装包,亲测可用
fltk-draw-demo
附件是FLTK 1.3.2的用书手册(FLTK Programming Manual)。内容均是摘自FLTK官网,但是官网是网页版,阅读标记不太方便,我将其制作成pdf浏览,在这给大家共享一下~~
收集了一些fltk入门的中文教程,还不错,里面还有一些例子,对初学者很有帮助
FLTK (pronounced "fulltick") is a cross-platform C++ GUI toolkit for UNIX®/Linux® (X11), Microsoft® Windows®, and MacOS® X. FLTK provides modern GUI functionality without the bloat and supports ...
fltk是一个轻量级的图形库开发工具包,源码完全开安,可以根据自身的需要重新定制自己的界面控件。
fltk 2.0 source code
这是大分子三维重建软件relion的基础运行包,有需要的可以下载
fltk-rs FLTK图形用户界面库的Rust绑定。 FLTK板条箱是一个跨平台的轻量级gui库,可以作为FLTK图形用户界面库的静态fltk-rs Rust绑定。 FLTK板条箱是一个跨平台的轻量级GUI库,可以将其静态链接以生成小型,独立(无...
离线安装包,亲测可用
fltk-rs FLTK图形用户界面库的Rust绑定。 FLTK板条箱是一个跨平台的轻量级gui库,可以静态链接以生成小型,自包含且快速的gui应用程序。 教程:Erco的FLTK作弊,这是出色的FLTK C ++参考。 为什么选择FLTK? 轻的。 ...
fltk-1.3.4-2 vs2010编译工程编译成功,可直接使用
离线安装包,测试可用
一个跨平台界面开发包fltk(UNIX® /Linux® (X11), Microsoft® Windows® , and MacOS® X.)
本文主要介绍了在FLTK中如何自定义一个窗口分割控件,实现窗口的布局,该控件可以实现拖拉窗口和隐藏侧边栏功能。
FLTK,如同其名字所表达的:The Fast Light Tool Kit,一个轻量级的GUI开发库。但这轻量级并不代表功能的羸弱,相反,FLTK在具有基本的GUI功能之外,还拥有一些特殊的功能,比如跨平台、内置 OpenGL功能、速度更快、...
fltk2.0源码 可以架设在Nano-X上,用来支持控件、按钮、文本框等
FLTK-Tutorial.
fltk和vega联合编程的例子,fltk是一个跨平台界面包,vega是一个虚拟场景的渲染工具,fltk和vega相结合可实现具有丰富界面的跨平台的vega编程(自己开发)-fltk and Salmon joint programming examples fltk is a ...