C ++动态显示或隐藏FLTK小部件?

时间:2011-04-01 14:47:14

标签: c++ macros fltk

我是C ++的新手,之前从未使用过宏,但我相信他们可以让我解决以下问题,尽管我会欢迎其他解决方案。

我写了以下宏:

#define COMMAND(NUMBER){ button_ ## NUMBER ## ->hide(); }

我希望像这样称呼它

for (int i = 1; i < 10; i++)
{
    COMMAND(i)
}

希望当程序执行时,它将完成相同的操作:

button_1->hide();
button_2->hide();
button_3->hide();
button_4->hide();
       .
       .
button_10->hide();

我的想法是,我想根据加载表单时读入的配置文件动态显示/隐藏窗口小部件。

不幸的是,上面的宏看起来不起作用,而是它的作用

button_i->hide();

导致编译错误,因为button_i不存在!

所以我的问题是:
A)是否可以在C ++中执行此操作? B)宏是否能够实现这一点?
C)如果不是什么可以?
D)如果宏可以做到这一点,那么我如何修改上面的代码实际上让它工作!

由于

3 个答案:

答案 0 :(得分:1)

我很确定有一种方法可以让宏技巧发挥作用,但有更好的选择。

例如,您可以将按钮存储在数组中。

假设您的按钮有一个名为struct button的类型,请按以下方式声明您的按钮:

struct button *buttons[42];

您需要像对各个button_X变量一样初始化所有这些变量。

button[i] = <whatever you do to create button number i>;

然后你就可以做到:

for (int i=0; i<42; i++) {
  button[i]->hide();
}

或仅使用其编号切换任何单个按钮。从长远来看,你可能会发现比任何宏技巧更好。

(警告:数组基于0,因此您的第一个按钮为button[0]

答案 1 :(得分:0)

如果您可以控制button_2等变量,我建议您使用数组。这样你就可以使用:

for (int i = 1; i < 10; i++)
{
  button[i]->hide();
}

当然,放在宏观中这是微不足道的。

一般情况下,在C中使用普通循环无法实现所需。但是,如果确实想要走这条路线,请查看boost预处理器包。

答案 2 :(得分:-1)

不要试图自己管理按钮,FLTK不喜欢这样。您将看到一组令人难以看见的令人敬畏的按钮。我不知道怎么做你想要的方式,但我会这样做:

Fl_Button * o = (Fl_Button *)myWindow->child(i);
o->hide();

并让按钮成为FLTK窗口的子项。

相关问题