Вспоминаем Си. Изменение ID элемента управления

В моем диалоговом окне несколько стадий, ограничим их пока двумя гипотетическими пунктами, которые исполняются при нажатии одной и той же кнопки на разных этапах обработки:

  • выбор и подтверждение действия
  • исполнение действия

Казалось бы, можно просто использовать некие костыли, в виде статических или глобальных переменных, чтобы отслеживать на каком месте обработки мы находимся. Например:

...
// объявляем статическую переменную прямо в обработчике диалогового окна
// или делаем ее глобальной
static int stage;
...
case WM_COMMAND:
  switch (LOWORD(wparam)) {
    case IDC_BTN_PROCESS:
      // тыкнули на нашу кнопочку и попали сюда
      // определяем на какой стадии мы находимся
      switch (stage) {
        case 0:
          // тут что-то делаем на стадии 0
          ...
          // переходим на стадию 1
          stage = 1;
          break; // stage
        case 1:
          // тут что-то делаем на стадии 1
          break; // stage
      } // switch (stage)
      break; // IDC_BTN_PROCESS
  } // switch (LOWORD(wparam))
  break; // WM_COMMAND
...

Такое может прокатить при написании игрового движка, но мы сейчас пишем не его. Меня данная лестница switch / case / if не устроила, ибо задача у меня более простая. Да и интересовал, в общем-то момент смены / назначения ID. Таким образом у меня получился код такого вида:

...
case WM_COMMAND:
  switch (LOWORD(wparam)) {

    case IDC_BTN_STAGE0:
        // тут что-то делаем на стадии 0
        ...
        // переходим на стадию 1, изменяя ID нашей кнопочки
        SetWindowLong((HWND)lparam,GWL_ID,IDC_BTN_STAGE1);
        break; // IDC_BTN_STAGE0

    case IDC_BTN_STAGE1:
        // тут что-то делаем на стадии 1
        ...
        break; // IDC_BTN_STAGE1

  } // switch (LOWORD(wparam))
  break; // WM_COMMAND
...
Запись опубликована в рубрике Программирование с метками , . Добавьте в закладки постоянную ссылку.

Добавить комментарий