如何将参数传递给draw()方法 - FLTK

时间:2014-06-09 21:04:52

标签: c++ fltk

我是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现在不会在断点处中断..

任何解决方案,暗示我做错了什么或可能的替代方案?

提前致谢!

这里有一些我的代码:
    

View.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 个答案:

答案 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*