Операционная система Microsoft Windows 3.1 для программиста -том 1


Приложение KBMSG - часть 7


В нашем случае эта область совпадает с заданной четвертым параметром.

В качестве четвертого и пятого параметра можно задать значение NULL, в этом случае будет свернута вся внутренняя область окна.

Далее функция PrintMsg выбирает системный шрифт с фиксированной шириной букв и получает имя клавиши, соответствующее параметру lParam. Для получения имени клавиши, определенном в драйвере клавиатуры, вызывается уже знакомая вам функция GetKeyNameText:

rc = GetKeyNameText(lParam, szKeyName, 20); if(!rc) MessageBeep(0);

В нашем приложении эта функция копирует 20 символов имени клавиши в буфер szKeyName. В случае ошибки выдается звуковой сигнал, для чего вызывается функция MessageBeep.

Вслед за этим в буфере szBuf подготавливается строка, которая будет выведена в нижней части экрана. В эту строку включается символическое имя полученного сообщения, код ANSI, соответствующий параметру wParam, параметры wParam и lParam в шестнадцатеричном представлении, а также имя клавиши, определенное в драйвере клавиатуры.

Для вывода строки вызывается функция TextOut:

TextOut(hdc, cxChar, rect.bottom - cyChar, szBuf, nBufSize);

Строка выводится начиная с позиции (cxChar, rect.bottom - cyChar), то есть в нижней части главного окна приложения.

Перед завершением работы функция PrintMsg вызывает функцию ValidateRect:

ValidateRect(hwnd, NULL);

Эта функция описана в файле windows.h:

void WINAPI ValidateRect(HWND hwnd, const RECT FAR* lprc);

Для окна, идентификатор которого задан первым параметром, функция удаляет область, заданную вторым параметром, из области, требующей обновления.

Для чего здесь вызывается эта функция?

Дело в том, что после вызова функции ScrollWindow область свертки помечается как требующая обновления, поэтому функция окна получит сообщение WM_PAINT и только что выведенная строка будет стерта.

В нашем случае вывод в окно выполняется не во время обработки сообщения WM_PAINT, поэтому для предотвращения стирания мы должны объявить окно не требующим перерисовки. Если в качестве второго параметра функции ValidateRect указать значение NULL, вся внутренняя область окна будет помечена как не требующая перерисовки и сообщение WM_PAINT будет удалено из очереди приложения.




Начало  Назад  Вперед



Книжный магазин