如何将参数传递给 draw() 方法 - FLTK
Posted
技术标签:
【中文标题】如何将参数传递给 draw() 方法 - FLTK【英文标题】:How to pass arguments to draw() method - FLTK 【发布时间】:2014-06-09 21:04:52 【问题描述】:我是 FLTK 的新手,目前面临以下问题: 我有一个 PointModel 类,它存储带有 x 和 y 坐标的点,一个 View 类,它需要调用 update(),每次 PointModel 中的坐标发生变化(观察者模式)并绘制它们,最后是一个 MyBox 类,其中应该绘制坐标。 视图派生自 Fl_Window。 MyBox 派生自 Fl_Box 和 View 的一部分。 因此,我需要知道,如何将 View 的成员函数(void update())中的点坐标传递给 MyBox 的 draw 方法。
我正在尝试对我得到的 user_data 指针进行类型转换,以防万一能够获取 PointModel,保存点坐标。但是在调用 draw() 方法后窗口会关闭。 也许我在这里只得到一个 NULL 指针?不幸的是,我无法通过调试检查它,因为不知何故 Eclipse 现在不会在断点处中断..
任何解决方案,提示我做错了什么或可能的替代方案?
提前致谢!
这是我的一些代码:
查看.cpp:
class MyBox : public Fl_Box
void draw()
Fl_Box::draw();
View *v1 = (View*)this->parent();
if(v1 != NULL)
int lastX = v1->getPointModel()->getLastX();
int lastY = v1->getPointModel()->getLastY();
int currentX = v1->getPointModel()->getCurrentX();
int currentY = v1->getPointModel()->getCurrentY();
fl_color(FL_WHITE);
fl_line(lastX, lastY, currentX, currentY);
public:
MyBox(int X,int Y,int W,int H,const char*L=0) : Fl_Box(X,Y,W,H,L)
box(FL_FLAT_BOX);
;
View::View(*arguments*) :Fl_Window(540,650,"View1")
begin();
MyBox box(20,20,500,500," ");
box.box(FL_UP_BOX);
box.color(0x00000000);
//more widgets
end();
show();
Fl::add_timeout(3.0, Timer_CB, (void*)this);
Fl::run();
编辑:我将代码更新为运行版本
【问题讨论】:
【参考方案1】:好吧,MyBox.draw()
将在您调用 add_timeout() 之前被调用。 user_data() 最有可能给你 NULL ......你可以在那里添加一个检查 NULL 。比如:
void draw()
Fl_Box::draw();
void* ptr = user_data();
if (ptr)
// do stuff here...
第二个可能的问题是 this->parent()->user_data();
。 MyBox 对象的父对象是 Fl_Window 对象(实际上是您的 View 对象,它是一个 Fl_Window),我认为 user_data() 将始终为它返回 NULL...
将任何对象传递给小部件的最简单方法是使用 user_data() 方法:
box.user_data(&myview); // after this box.user_data() will return a View*
【讨论】:
谢谢德扬!围绕获取点坐标添加 if(v1 != NULL) 语句并将第 4 行更改为: View v1 = (View)this->parent() 解决了问题!不知道我怎么会忘记在绘制小部件时已经调用了 draw 方法......现在一切正常!以上是关于如何将参数传递给 draw() 方法 - FLTK的主要内容,如果未能解决你的问题,请参考以下文章