C ++ динамически отображать или скрывать виджеты FLTK? - PullRequest
0 голосов
/ 01 апреля 2011

Я новичок в 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();

Идея состоит в том, чтоЯ хочу, чтобы графический интерфейс FLTK отображал / скрывал виджеты динамически в зависимости от файла конфигурации, считываемого при загрузке формы.

К сожалению, похоже, что приведенный выше макрос не работает и вместо этого

button_i->hide();

, который вызывает ошибку компиляции, потому что button_i не существует!

Итак, мои вопросы:
A) Возможно ли это сделать в C ++?
B)Может ли макрос сделать это?
C) Если нет, то что может?
D) Если макросы могут это сделать, то как мне изменить вышеприведенный код, чтобы он действительно заработал!

Спасибо

Ответы [ 3 ]

1 голос
/ 01 апреля 2011

Я почти уверен, что есть способ заставить трюк макросов работать, но есть и лучшие варианты.

Вы можете, например, хранить свои кнопки в массиве.

Предполагая, что ваши кнопки имеют тип 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])

0 голосов
/ 20 февраля 2013

Не пытайтесь управлять кнопками самостоятельно, FLTK не нравится. У вас будет огромный набор кнопок, которые вы не сможете увидеть. Я не уверен, как это сделать так, как вы хотите, но я бы сделал это так:

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

и пусть кнопки являются дочерними элементами окна FLTK.

0 голосов
/ 01 апреля 2011

Если у вас есть контроль над переменными button_2 и т.д., я бы рекомендовал вместо этого использовать массив. Таким образом, вы можете использовать вид:

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

Конечно, это довольно просто поместить в макрос.

В общем, вы не можете выполнить то, что хотите, с простым циклом в C. Однако, если вы действительно хотите пойти по этому пути, посмотрите на пакет препроцессора boost.

...