Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
WinAPI.docx
Скачиваний:
49
Добавлен:
16.12.2018
Размер:
3.43 Mб
Скачать

5.6.2 Программа typer

Программа TYPER объединяет вместе многое из того, о чем мы узнали в этой главе.

Программу TYPER можете считать сильно устаревшим текстовым редактором. Вы можете набрать в окне текст, перемещая курсор (имеется ввиду каретка) по экрану с помощью клавиш управления курсором (или клавишами управления кареткой?), и стереть содержимое окна, нажав <Esc>. Окно также очистится при изменении размеров окна. Здесь нет ни прокрутки, ни поиска и замены, ни возможности сохранять файлы, ни контроля правописания, но это только начало.

Для простоты в программе TYPER используется фиксированный шрифт. Создание текстового редактора для пропорционального шрифта является, как вы могли бы сообразить, гораздо более трудным делом. Программа получает контекст устройства в нескольких местах: при обработке сообщений WM_CREATE, WM_KEYDOWN, WM_CHAR и WM_PAINT. Каждый раз при этом для выбора фиксированного шрифта вызываются функции GetStockObject и SelectObject.

При обработке сообщения WM_SIZE программа TYPER рассчитывает ширину и высоту окна в символах и хранит эти значения в переменных cxBuffer и cyBuffer. Затем она использует функцию malloc, чтобы выделить буфер для хранения всех символов, которые могут быть напечатаны в окне. В переменных xCaret и yCaret сохраняется положение каретки в символах.

При обработке сообщения WM_SETFOCUS программа TYPER вызывает функцию CreateCaret для создания каретки, имеющей ширину и высоту символа, функцию SetCaretPos для установки положения каретки и функцию ShowCaret, чтобы сделать каретку видимой. При обработке сообщения WM_KILLFOCUS программа вызывает функции HideCaret и DestroyCaret.

Сообщения WM_KEYDOWN и WM_KEYUP здесь обрабатываются более полно. Обработка сообщения WM_KEYDOWN в основном включает в себя обработку клавиш управления курсором. Клавиши <Home> и <End> заставляют каретку переместиться в начало или конец строки, клавиши <PageUp> и <PageDown> — к верхней или нижней границе окна. Клавиши стрелок работают так, как вы и ожидаете. При нажатии клавиши <Delete> программа TYPER должна переместить все, что находится в буфере, начиная от следующей позиции каретки и до конца строки, а затем вывести на экран в конец строки символ пробела.

Обработчик сообщения WM_CHAR включает в себя обработку клавиш <Backspace>, <Tab>, <Linefeed> (<Ctrl>+<Enter>), <Enter>, <Escape> и символьных клавиш. Отметьте, что поле Repeat Count параметра lParam использовано при обработке сообщения WM_CHAR (здесь предполагается, что важен каждый вводимый пользователем символ), а не при обработке сообщения WM_KEYDOWN (чтобы предотвратить нечаянное двойное нажатие). Обработка нажатий <Backspace> и <Tab> отчасти упрощена путем использования функции SendMessage. Логика обработки клавиши <Backspace> заменяется логикой обработки <Delete>, а клавише <Tab> ставится в соответствие несколько пробелов.

Как уже упоминалось, во время рисования в окне при обработке отличного от WM_PAINT сообщения, вы должны сделать каретку невидимой. В программе это делается при обработке сообщения WM_KEYDOWN для клавиши <Delete> и сообщения WM_CHAR для символьных клавиш. В обоих этих случаях, в программе TYPER меняется содержимое буфера, а затем в окне рисуется новый символ или символы.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]