В моем диалоговом окне несколько стадий, ограничим их пока двумя гипотетическими пунктами, которые исполняются при нажатии одной и той же кнопки на разных этапах обработки:
- выбор и подтверждение действия
- исполнение действия
Казалось бы, можно просто использовать некие костыли, в виде статических или глобальных переменных, чтобы отслеживать на каком месте обработки мы находимся. Например:
... // объявляем статическую переменную прямо в обработчике диалогового окна // или делаем ее глобальной 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 ...