Лабораторная работа 5. Модернизация SYSMETS: добавление интерфейса клавиатуры

advertisement
Лабораторная работа 5. Модернизация SYSMETS: добавление
интерфейса клавиатуры
Давайте добавим интерфейс клавиатуры в программу SYSMETS. Это очевидно будет работа для
клавиш управления курсором. Мы используем большинство клавиш управления курсором
<Home>, <End>, <PageUp>, <PageDown>, <> и <> для вертикальной прокрутки. Клавиши <>
и <> можно оставить на менее важную горизонтальную прокрутку.
5.1 Логика обработки сообщений WM_KEYDOWN
Один из простейших способов создать интерфейс клавиатуры — это использовать логику
обработки сообщений WM_KEYDOWN в оконной процедуре, которая будет работать
параллельно с логикой обработки сообщений WM_VSCROLL и WM_HSCROLL:
case WM_KEYDOWN:
iVscrollInc = iHscrollInc = 0;
switch(wParam)
{
case VK_HOME: // аналогично WM_VSCROLL, SB_TOP
iVscrollInc = — iVscrollPos;
break;
case VK_END: // аналогично WM_VSCROLL, SB_BOTTOM
iVscrollInc = iVscrollMax — iVscrollPos;
break;
case VK_UP: // аналогично WM_VSCROLL, SB_LINEUP
iVscrollInc = — 1;
break;
case VK_DOWN: // аналогично WM_VSCROLL, SB_LINEDOWN
iVscrollInc = 1;
break;
case VK_PRIOR: // аналогично WM_VSCROLL, SB_PAGEUP
iVscrollInc = min(-1, — cyClient / cyChar);
break;
case VK_NEXT: // аналогично WM_VSCROLL, SB_PAGEDOWN
iVscrollInc = max(1, cyClient / cyChar);
break;
case VK_LEFT: // аналогично WM_HSCROLL, SB_PAGEUP
iHscrollInc = — 8;
break;
case VK_RIGHT:// аналогично WM_HSCROLL, SB_PAGEDOWN
iHscrollInc = 8;
break;
default:
break;
}
if (iVscrollInc = max(- iVscrollPos, min(iVscrollInc, iVscrollMax — iVscrollPos)))
{
iVscrollPos += iVscrollInc;
ScrollWindow(hwnd, 0, — cyChar * iVscrollInc, NULL, NULL);
SetScrollPos(hwnd, SB_VERT, iVscrollPos, TRUE);
UpdateWindow(hwnd);
}
if (iHscrollInc = max(- iHscrollPos, min(iHscrollInc, iHscrollMax — iHscrollPos)))
{
iHscrollPos += iHscrollInc;
ScrollWindow(hwnd, — cxChar * iHscrollInc, 0, NULL, NULL);
SetScrollPos(hwnd, SB_HORZ, iHscrollPos, TRUE);
}
return 0;
Вам тоже не нравится эта программа? Простое дублирование всех инструкций предыдущей
программы занятие глупое, поскольку, если когда-нибудь захочется изменить логику работы
полос прокрутки, то придется делать параллельные изменения в логике WM_KEYDOWN.
Должен быть лучший способ. И он есть.
5.2 Посылка асинхронных сообщений
Не лучше было бы просто преобразовать каждое из этих сообщений WM_KEYDOWN в
эквивалентное сообщение WM_VSCROLL и WM_HSCROLL и, таким образом, быть может,
обмануть оконную процедуру WndProc, чтобы ей казалось, что она получает сообщения полосы
прокрутки WM_VSCROLL или WM_HSCROLL? Windows позволяет это сделать. Функция
называется SendMessage, и имеет те же параметры, что и параметры, передаваемые в оконную
процедуру:
SendMessage(hwnd, message, wParam, lParam);
Когда вы вызываете SendMessage, то Windows вызывает оконную процедуру с описателем окна
hwnd, передавая ей эти четыре параметра. После того, как оконная процедура заканчивает
обработку сообщения, Windows передает управление следующей за вызовом SendMessage
инструкции. Оконная процедура, которой вы отправляете синхронное сообщение, может быть той
же самой оконной процедурой, другой оконной процедурой той же программы, или даже
оконной процедурой другого приложения.
Далее показано, как можно было бы использовать SendMessage для обработки WM_KEYDOWN в
программе SYSMETS:
case WM_KEYDOWN:
switch(wParam)
{
case VK_HOME:
SendMessage(hwnd, WM_VSCROLL, SB_TOP, 0L);
break;
case VK_END:
SendMessage(hwnd, WM_VSCROLL, SB_BOTTOM, 0L);
break;
case VK_PRIOR:
SendMessage(hwnd, WM_VSCROLL, SB_PAGEUP, 0L);
break;
[остальные строки программы]
Теперь вы поняли основную идею. Нашей целью было добавить интерфейс клавиатуры к полосам
прокрутки, и мы это сделали. Мы продублировали логику обработки сообщений полос прокрутки
обработкой сообщений о нажатии клавиш управления курсором, фактически передавая оконной
процедуре синхронное сообщение полос прокрутки.
Теперь вы понимаете, почему в программу SYSMETS3 включена обработка SB_TOP и
SB_BOTTOM для сообщений WM_VSCROLL. Тогда это не использовалось, а сейчас
используется для обработки клавиш Home и End. Добавьте в программу SYSMETS эти
изменения.
Скачать