如何用C ++和FLTK实现倒计时时钟?

时间:2015-08-16 01:58:09

标签: c++ user-interface fltk

我使用C ++编程中的FLTK和Gui库创建了一个小游戏,我想使用倒计时时钟计时器。 FLTK有Fl :: add_timeout(double t,Callback)非常有用。问题是我想在我的课程中使用该功能,所以当它被调用时我可以更改窗口内的任何内容。该功能必须是静态的,因此我无法访问窗口并进行我想要的更改。 Gui库仅包含对于amatuer程序员有用的东西,所以我不能使用函数reference_to<>()。有什么想法我如何使用该功能或​​任何其他方式来实现这一点?谢谢你的时间。

我的代码:

#include"GUI.h"
#include<FL/Fl.h>
#include"Simple_window.h"

class Game : public Window {
   Button *b;
   //variables i need for the window
public:
   Game(Point xy,int w,int h, const string& name) : Window(xy,w,h,name) {         
      b=new Button(Point(100,100),40,20,"Button"cb_button);
      Fl::add_timeout(1.0,TIME);
   }  
   ~Game(){
      delete b;
   }
   static void cb_button(Address,Address addr){
      reference_to<Game>(addr).B();
   }
   void B(){}
   static void TIME(void *d){
      //access to the variables like this->...
      Fl::repeat_timeout(1.0,TIME); 
   }
};

int main(){
  Game win(Point(300,200),400,430,"Game");
  return Fl::run();
}

1 个答案:

答案 0 :(得分:2)

这里的要点是:

  1. 您想使用函数(add_timeout)

  2. 它需要一个c样式的回调,所以你给它一个静态的成员函数。

  3. 您不确定如何从静态方法访问实例变量。

  4. 从这里的文档:http://www.fltk.org/doc-2.0/html/index.html,您可以看到add_timeout函数将void *作为其第三个参数传递给您的回调。这里的快速修复是将this指针传递给add_timeout函数然后将其转换为Game *以访问您的成员变量,如下所示:

    #include"GUI.h"
    #include<FL/Fl.h>
    #include"Simple_window.h"
    
    class Game : public Window 
    {    
    public:
       Game(Point xy,int w,int h, const string& name) 
              : Window(xy,w,h,name), b(nullptr)
       {         
          b = new Button(Point(100,100),40,20,"Button", cb_button);
          Fl::add_timeout(1.0, callback, (void*)this);
       }
    
       ~Game()
       {
           delete b;
       }
    
       static void cb_button(Address, Address addr)
       {
           reference_to<Game>(addr).B();
       }
    
       void B(){}
    
       static void callback(void *d)
       {
           Game* instance = static_cast<Game*>(d);
           instance->b; // access variables like this->
           Fl::repeat_timeout(1.0,TIME); 
       }
    
    private:
        //variables you need for the window
        Button *b;
    };
    
    int main()
    {
        Game win(Point(300,200),400,430,"Game");
        return Fl::run();
    }