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

Posted

技术标签:

【中文标题】如何在 C++ 和 FLTK 中实现倒计时时钟?【英文标题】:How to implement a countdown clock in C++ and FLTK? 【发布时间】:2015-08-16 01:58:09 【问题描述】:

我使用 Programming with C++ 中的 FLTK 和 Gui 库创建了一个小游戏,我想使用倒计时时钟计时器。 FLTK 有 Fl::add_timeout(double t,Callback) 非常有用。问题是我想在我的类中使用该函数,以便在调用它时可以更改窗口内的任何内容。该功能必须是静态的,因此我无法访问窗口并进行我想要的更改。 Gui 库只包含对业余程序员有用的东西,所以我不能使用函数 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. 您想使用 FLTK 库中的一个函数,该函数采用回调函数。 2.这个函数需要是一个静态c风格的函数才能作为回调传递。 3. 您不确定如何访问您的 Game 类的实例,因为该函数是静态的。简单的解决方法是将“this”作为第三个参数传递给 add_timeout,如下所示: add_timeout(1.0, TIME, this);然后,在 TIME(void *d) 中,你可以说 static_cast(d)->variable. 非常感谢!我没想过要像这样使用 void 论点。谢谢! 【参考方案1】:

这里的要点是:

    你想使用一个函数(add_timeout)

    它需要一个 c 风格的回调,所以你给它一个静态成员函数。

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

从此处的文档: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();

【讨论】:

别忘了选择它作为答案!!哈哈。 你可以使用同样的技巧来启动成员函数 pthread_create/_beginthreadex ;)

以上是关于如何在 C++ 和 FLTK 中实现倒计时时钟?的主要内容,如果未能解决你的问题,请参考以下文章

你如何在 iOS 中实现“时钟擦除”/径向擦除效果?

FLTK窗口未在while循环c ++中显示

如何在 C++ 中使用计时器在给定时间内强制输入?

是否可以使用标准 C++ 线程而不是 FLTK 超时来更新窗口?

在c++中实现,如何创建一个char的数组

你如何在 C++ 中实现阶乘函数? [复制]