
- •Задание 3. Создание кода, отображающего текст
- •Задание 4. Использование стандартных шрифтов
- •Задание 5. Поддержка средств прокрутки
- •Подведение итогов
- •Глава 9. Ввод текста
- •Чтение кодов управляющих клавиш и управление полосой прокрутки
- •Виртуальные коды клавиш, которые не генерируют сообщения wm_char
- •Задание 1. Обработка сообщения wm_keydown
- •Чтение кодов символьных клавиш и отображение символов
- •Наиболее часто используемые управляющие клавиши
- •Задание 2. Обработка сообщения wm_char
Чтение кодов символьных клавиш и отображение символов
При нажатии большинства клавиш окну с фокусом ввода передается сообщение WM_CHAR. Клавиши, которые не передают сообщения WM_CHAR, перечислены в табл. 9.1. Когда программа позволяет печатать текст, самый простой способ чтения кода клавиши состоит в определении обработчика сообщения WM_CHAR. Этому обработчику передается стандартный код ANSI печатаемого символа, а не виртуальный код клавиши, транслирующийся в код символа. В классе CWnd существует функция OnChar(), обрабатывающая сообщение WM_CHAR и имеющая такой прототип:
afx_msg void CWnd::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
Функция CWnd::OnChar() имеет такие же параметры, как и функция CWnd::OnKeyDown(), рассмотренная в предыдущем параграфе.
Обычно при вводе текста в программу символы отображаются на экране внутри окна представления или на другом устройстве с помощью функции, подобной CDС::TextOut(). Если нажимается управляющая клавиша, например Ctrl+A, Enter, Tab и др., то генерируется код символа со значением, меньше 32. Программа либо игнорирует нажатия управляющих клавиш, либо использует их для выполнения некоторого управляющего воздействия. Например, в ответ на нажатие клавиши Backspace (код символа 8), программа может удалять предыдущий символ, а в ответ на нажатие клавиши Enter (код символа 13) — генерировать новую строку. Наиболее часто используемые клавиши управления перечислены в табл. 9.3. Если передать символьный код нажатой управляющей клавиши такой функции, как CDC::TextOut(), то Windows отобразит маленький прямоугольник или символ Ђ, указывая, что код не соответствует печатному символу.
Т а б л и ц а 9.3
Наиболее часто используемые управляющие клавиши
Клавиша |
Действие |
Десятичное значение кода |
Backspase |
Возврат на одну позицию |
8 |
Tab |
Табуляция |
9 |
Ctrl+ |
Перевод строки |
10 |
|
Возврат каретки |
13 |
Esc |
Выход |
27 |
Для чтения кодов символьных клавиш и отображения символов необходимо передать код символа обработчику сообщения WM_CHAR. Затем добавить символ, код которого поступил обработчику, в конец строки. И, наконец, отобразить всю строку с добавленным символом. Добавления нового символа в конец строки реализуется с помощью функции CSimpleStringT::AppendChar() из библиотеки ATL (Active Template Library — библиотека активных шаблонов). Ее прототип показан ниже.
void CSimpleStringT::AppendChar( XCHAR ch );
Вызов функции CSimpleStringT::AppendChar() можно выполнить таким образом:
pDoc->m_TextLine.AppendChar(nChar);
Здесь pDoc — указатель на объект документа, получаемый с помощью функции CView::GetDocument(); m_TextLine — строка символов, которая определена как объект класса CString, включенный в класс документа; nChar — символ, который добавляется в конец строки.
Альтернативный способ добавления символа в конец строки — использовать перегруженный оператор «+=» класса CString. Однако для применения этого оператора необходимо символ, хранящийся в nChar, преобразовать в строку типа CString с помощью функции CString::Format():
CString str; str.Format("%c",nChar); PDoc->m_TextLine +=str;
Для отображения вводимых с клавиатуры символов необходимо создать объект контекста устройства, связав его с окном представления, и использовать его для отображения всей строки, включая новый символ в конце. Так как объект контекста устройства ассоциируется с клиентской областью окна, то для его создания используется класс CClientDC.
Для отображения введенной строки символов можно использовать два варианта. Первый вариант предусматривает вызов функции CDC::TextOut() в обработчике OnChar() класса представления. Этой функции передается строка и ее координаты в окне представления. Даже если в строку добавляется последний символ, то заново отобразить всю строку проще, чем вычислять позицию последнего символа и выводить этот символ в окно представления. Определение точного места символа в строке — сложная задача для шрифтов с переменным питчем (шагом) или курсивных шрифтов.
Второй вариант отображения символов предусматривает традиционную технологию взаимодействия объектов документа и представления: вместо непосредственного отображения текста функция OnChar() класса представления вызывает функцию CDocument::UpdateAllViews(), которая вызывает OnDraw() класса представления. Тогда вызов функции CDC::TextOut() необходимо включить в функцию OnDraw() класса представления. Создавать объект контекста устройства в этом случае нет необходимости, поскольку за обновление представления отвечает класс представления.
Достоинства каждого варианта отображения символов таковы. Отображение текста непосредственно из обработчика OnChar() не только более эффективно, но также позволяет избежать нежелательного мерцания, происходящего при каждом обновлении окна представления функцией OnDraw(). Нежелательное мерцание является следствием очистки недействительной области окна непосредственно перед вызовом OnDraw(). С точки зрения эффективности работы программы, проще повторно отображать символы всякий раз, когда нужно обновить окно, т.е. с помощью функции OnDraw().
Для установки цвета выводимых в окно символов можно использовать стандартный цвет “Windows Font”, получаемый передачей значения COLOR_WINDOWTEXT в Win32 API функцию ::GetSysColor(), прототип которой приводится ниже:
DWORD GetSysColor( int nIndex );
Параметр определяет отображаемый элемент, цвет которого возвращается функцией. Этот параметр может иметь одно из значений, которые представлены в табл. В3 приложения В. Например, вызов функции ::GetSysColor() для установки цвета “Windows Font” выполняется таким образом:
ClientDC.SetTextColor (::GetSysColor (COLOR_WINDOWTEXT));
Если не устанавливать шрифт текста, символы отображаются с использованием стандартного системного шрифта.