我是FLTK的新手,目前面临以下问题:
我有一个PointModel类,它存储带有x和y坐标的点,一个类View,需要调用update(),每次PointModel中的坐标改变(Observer Pattern)并绘制它们,最后是一个类MyBox,其中应绘制坐标。
View来自Fl_Window。 MyBox派生自Fl_Box和View的一部分
因此我需要知道,如何将View的成员函数(void update())中的点坐标传递给MyBox的draw方法。
我试图对我得到View *的user_data指针进行类型转换,以便能够获取PointModel,保持点坐标。但是在调用draw()方法后窗口关闭了。 也许我只在这里得到一个NULL-Pointer?不幸的是我无法通过调试来检查它,因为Eclipse现在不会在断点处中断..
任何解决方案,暗示我做错了什么或可能的替代方案?
提前致谢!
这里有一些我的代码:
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();
}
编辑:我将代码更新为正在运行的版本
答案 0 :(得分:1)
好吧,在调用add_timeout()之前会调用MyBox.draw()
。 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*