如何将参数传递给 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的主要内容,如果未能解决你的问题,请参考以下文章

如何通过反射将参数传递给方法

如何将参数传递给scala中的方法

控制台应用程序参数,如何将参数传递给 Main 方法

启动线程时如何将参数传递给方法? [复制]

如何将参数传递给 Cucumber 中的@before 方法?

如何通过常量引用将参数传递给方法?