Изучение параметров сообщения WM_CHAR удобно выполнять с помощью приложения KBDMSG, которое отображает эти параметры в своем окне (5.1).
5.1. Просмотр клавиатурных сообщений в окне приложения KBDMSG
В столбце VKEY отображается виртуальный код нажатой клавиши, в столбце SCAN - аппаратный скан-код, в столбце FS - флаги. Далее в столбце REPT отображается счетчик повторений и в столбце CHAR - символ (только для символьных клавиш).
Когда вы нажимаете очередную клавишу, текущее содержимое главного окна приложения сдвигается вверх и на экране появляется строка, соответствующая сообщению от нажатой клавиши. После отжимания клавиши появляется еще одна строка.
Исходные тексты приложения приведены в листинге 5.1.
Листинг 5.1. Файл kbdmsg\kbdmsg.c
// ================================================= // Определения // =================================================
switch (msg) { // При создании главного окна приложения // определяем и сохраняем метрики шрифта // с фиксированной шириной символов case WM_CREATE : { // Получаем пространство отображения hps = WinGetPS (hWnd);
// Выбираем в пространство отображения шрифт // с фиксированной шириной символов SetCourierFont(hps);
// Устанавливаем шрифт, выбранный в пространство // отображения по умолчанию ResetFont(hps);
// Возвращаем пространство отображения WinReleasePS (hps); return FALSE; }
// Во время перерисовки стираем содержимое // окна и выводим строку заголовка таблицы case WM_PAINT : { // Получаем пространство отображения hps = WinBeginPaint (hWnd, NULLHANDLE, &rec);
// Закрашиваем область, требующую обновление WinFillRect (hps, &rec, CLR_WHITE);
// Выбираем в пространство отображения шрифт // с фиксированной шириной символов SetCourierFont(hps);
// Рисуем заголовок таблицы в нижней части окна ptl.x = cxChar; ptl.y = cyDesc + cyChar; GpiCharString At (hps, &ptl, strlen(szTitle), szTitle);
// Устанавливаем шрифт, выбранный в пространство // отображения по умолчанию ResetFont(hps);
// Возвращаем пространство отображения WinEndPaint (hps); return 0; }
case WM_ERASEBACKGROUND : return(MRFROMLONG(1L));
// При изменении размеров окна сохраняем новые // размеры и перерисовываем окно case WM_SIZE : { cxClient = SHORT1FROMMP (mp2); cyClient = SHORT2FROMMP (mp2);
// Все окно требует перерисовки WinInvalidateRect (hWnd, NULL, TRUE); return 0; }
// Это сообщение появляется, когда пользователь // нажимает или отжимает клавишу case WM_CHAR : { // Получаем пространство отображения hps = WinGetPS (hWnd);
// Выбираем в пространство отображения шрифт // с фиксированной шириной символов SetCourierFont(hps);
// Выделяем параметры клавиатурного сообщения // и сохраняем их в структуре cm cm.chr = CHARMSG(&msg) ->chr; cm.vkey = CHARMSG(&msg) ->vkey; cm.scancode = CHARMSG(&msg) ->scancode; cm.cRepeat = CHARMSG(&msg) ->cRepeat; cm.fs = CHARMSG(&msg) ->fs;
// ================================================= // Выбор шрифта с фиксированной шириной символов // =================================================
void SetCourierFont(HPS hps) { FATTRS fat;
// Заполняем структуру описанием нужного // нам шрифта
// Размер структуры fat.usRecordLength = sizeof(FATTRS);
// Название шрифта strcpy(fat.szFacename ,"Courier");
// Используем нормальный шрифт без выделений // наклоном, подчеркиванием и т. п. fat.fsSelection = 0;
// Указываем, что система Presentation Manager должна // подобрать шрифт, подходящий к нашему описанию fat.lMatch = 0L;
// Регистрационный номер, должен быть равен 0 fat.idRegistry = 0;
// Кодовая страница fat.usCodePage = 850;
// Высота шрифта fat.lMaxBaselineExt = 12L;
// Ширина шрифта fat.lAveCharWidth = 12L;
// Тип шрифта - обычный без использования кернинга, // двухбайтовых символов и т. д. fat.fsType = 0;
// Использование шрифта - шрифт, который отображается // без смешивания с графикой fat.fsFontUse = FATTR_FONTUSE_NOMIX;