Окт 13

Использование глобальных или статических переменных

Иногда бывает нужно, чтобы информация, полученная в процессе обработки какого-то сообщения, была сохранена и использована позже при обработке другого сообщения.
Рассмотрим следующий пример. В программе Hellol размеры клиентской области окна были получены при помощи функции GetClientRect. Но существует и другой способ получить эту информацию — обрабатывая сообщение WM_SIZE. Параметр IParam этого сообщения содержит в своем младшем слове значение ширины, а в старшем слове — значение высоты клиентской области окна. Допустим, что мы определили две локальные переменные в теле функции WndProc:
int width, height; и добавили обработку сообщения WM_SIZE, обеспечивающую сохранение соответствующих значений:
case WMJIZE:
width = LOWORDCIParam); height = HIWORD(lParam): return 0;
Здесь LOWORD и HIWORD — макросы, определенные в заголовочных файлах Windows; первый из них извлекает младшее слово, а второй — старшее слово из 32-разрядного аргумента.
Закомментируем вызов функции GetClientRect в блоке обработки сообщения WM_PAINT и вместо него вставим следующий код:
rect.left = 0: rect.top = 0; rect.right = width; rect.bottom = height;
После компиляции и запуска программы будет показано пустое окно, не содержащее никакого текста.
Неудача объясняется тем, что при повторном вызове WndProc значения ее локальных переменных от предыдущего вызова не сохраняются.
Но эту ошибку легко исправить. Надо лишь объявить переменные width и height либо как статические (static), либо как глобальные.