
- •Задание 3. Создание кода, отображающего текст
- •Задание 4. Использование стандартных шрифтов
- •Задание 5. Поддержка средств прокрутки
- •Подведение итогов
- •Глава 9. Ввод текста
- •Чтение кодов управляющих клавиш и управление полосой прокрутки
- •Виртуальные коды клавиш, которые не генерируют сообщения wm_char
- •Задание 1. Обработка сообщения wm_keydown
- •Чтение кодов символьных клавиш и отображение символов
- •Наиболее часто используемые управляющие клавиши
- •Задание 2. Обработка сообщения wm_char
Подведение итогов
В этой главе рассказывалось, как можно отобразить строки текста в окне представления и использовать шрифты. Вы научились устанавливать и сохранять атрибуты шрифта, а также выводить текст заданным шрифтом. В случае необходимости прокрутки текста вы научились поддерживать средства прокрутки. Отметим главное.
При отображении текста в окне необходимо получить объект контекста устройства. Если текст отображается функцией OnDraw() класса представления, то используется объект контекста устройства, связанный с клиентской областью окна, адрес которого передан в эту функцию.
Если вы не хотите отображать текст, используя заданный по умолчанию шрифт System, то выберите альтернативный шрифт, описанный в классе CFont, вызвав функцию SelectObject() или функцию SelectStockObject() класса CDC для стандартного шрифта.
Для получения информации о размере или других атрибутах выбранного шрифта вызовите функцию GetTextMetrics() класса CDC.
Определите любые текстовые атрибуты, стандартные значения которых хотите изменить. Вызовите функцию CDC::SetTextColor() для установки цвета текста и CDC::SetTextCharacterExtra() для изменения межсимвольного интервала.
При отображении текста функцией OnDraw() класса представления необходимо вызвать функцию CDC::GetClipBox() для получения размеров недействительной области, что позволяет увеличить эффективность работы программы, так как текст отображается только в той области окна, которая нуждается в перерисовке.
Для завершения процедуры отображения текста используются функции CDC::TextOut() или CDC::DrawText(). Функция OnDraw() класса представления отображает текст, частично или полностью попадающий в недействительную область или окно представления.
Шрифт выбирается в стандартном диалоговом окне Font. Для этого создайте объект класса CFontDialog, а затем вызовите функцию CFontDialog::DoModal(). После возврата из функции можно получить полное описание выбранного шрифта, обращаясь к переменным и вызывая функцию класса CFontDialog.
Для инициализации объекта шрифта, являющегося экземпляром класса CFont, можно использовать информацию о шрифте из объекта класса CFontDialog. Затем объект шрифта можно выбрать в объекте контекста устройства и отобразить текст, используя этот шрифт.
Глава 9. Ввод текста
В этой главе рассматриваются вопросы:
чтение кодов управляющих клавиш;
чтение кодов символьных клавиш;
управление курсором при редактировании текста;
Чтение кодов управляющих клавиш и управление полосой прокрутки
Некоторые объекты пользовательского интерфейса обеспечивают ввод с клавиатуры, если обладают фокусом ввода (keyboard focus). К таким объектам относятся окна (главное, представления, диалоговое) и кнопки. Фокус ввода могут иметь только активные объекты. Активное диалоговое окно имеет выделенный заголовок. Активное главное окно располагается на самом верхнем уровне (top-level window). Если приложение поддерживает архитектуру документ-представление, и его главное окно является активным, то фокус ввода содержится в его окне представления. Если фокус ввода имеет кнопка, то она выделена. При каждом нажатии клавиши Windows посылает сообщение WM_KEYDOWN окну, в котором в данный момент находится фокус ввода. При каждом отпускании клавиши генерируется сообщение WM_KEYUP в этом же окне.
Ввод с клавиатуры — двухэтапный процесс. Прежде, чем сообщения WM_KEYDOWN и WM_KEYUP доходят до окна, они транслируются функцией ::TranslateMessage(). Если была нажата любая из функциональных клавиш, то активное окно получает только сообщения WM_KEYDOWN или WM_KEYUP независимо от трансляции сообщения. Комбинация клавиш Alt и любой другой называется системной клавишей, и при ее нажатии генерируется сообщение WM_SYSKEYDOWN, а при ее отпускании — WM_SYSKEYUP. Если введен символ ANSI, то функция трансляции сообщений ::TranslateMessage() проверяет состояние регистра клавиатуры и посылает сообщение WM_CHAR с соответствующим кодом символа верхнего или нижнего регистра. Таким образом, сообщения WM_KEYDOWN и WM_KEYUP порождают сообщения WM_CHAR и WM_DEADCHAR соответственно. Сообщения WM_SYSKEYDOWN и WM_SYSKEYUP порождают сообщения WM_SYSCHAR или WM_SYSDEADCHAR.
Для обработки сообщений WM_KEYDOWN и WM_KEYUP в классе окна существуют функции CWnd::OnKeyDown() и CWnd::OnKeyUp(). Обработчики сообщений WM_KEYDOWN и WM_KEYUP необходимы при визуализации сообщений управляющих клавиш.
Прототипы функций CWnd::OnKeyDown() и CWnd::OnKeyUp() приводятся ниже:
afx_msg void CWnd::OnKeyDown(UINT nChar,UINT nRepCnt,UINT nFlags); afx_msg void CWnd::OnKeyUp(UINT nChar,UINT nRepCnt, UINT nFlags);
Т а б л и ц а 9.1