Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том2)" -> 43

Visual С++ 6. Полное руководство: В 2 т.(том2) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том2) — Бином, 2006. — 530 c.
Скачать (прямая ссылка): vicualcc2006t2.djvu
Предыдущая << 1 .. 37 38 39 40 41 42 < 43 > 44 45 46 47 48 49 .. 173 >> Следующая

Добавление кода
Теперь добавим данные для сохранения строки текста, реализуем функции обработки сообщений, сгенерированные выше, и добавим код в функцию OnDraw класса представления.
Откройте файл EchoDoc.h и добавьте определение переменной m_TextLine в начало определения класса CEchoDoc.
class CEchoDoc : public CDocument {
public:
CString m_TextLine;
// оставшаяся часть определения класса CEchoDoc
Эта переменная используется для хранения вводимых символов. Откройте файл EchoView.cpp и добавьте код в сгенерированную функцию OnChar следующим образом.
void CEchoView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) {
// TODO: Здесь добавьте собственный код обработчика // и/или вызов стандартного обработчика
if (nChar < 32) <
::MessageBeep (МВ_ОК); // генерация стандартного звука return ;
>
CEchoDoc* PDoc = GetDocumentO; PDoc->m_TextLine += nChar;
CClientDC ClientDC (this);
ClientDC.SetTextColor (::GetSysColor (COLOR_WINDOWTEXT)); ClientDC. SetBkMode (TRANSPARENT); ClientDC.TextOut (0, 0, PDoc->m_TextLine);
CView : OnChar (nChar, nRepCnt, nFlags);
}
Функция OnChar получает управление при каждом нажатии символьной клавиши, а параметр nChar содержит код ANSI символа.
Заметим: при нажатии клавиши, генерирующей код символа со значением, меньше 32, функция OnChar подает звуковой сигнал и завершает свою работу. Такие коды генерируются при нажатии клавиш управления, например Ctrl+A, Enter или Tab вместо клавиш отображаемых символов. Программа либо игнорирует нажатия управляющих клавиш, либо использует их для вызова некоторого управляющего воздействия. Например, в ответ на нажатие клавиши Backspace (код символа 8), программа может удалять предыдущий символ, а в ответ на нажатие клавиши Enter (код символа 13) — генерировать новую строку. Наиболее часто используемые
клавиши управления перечислены в табл. 18.9. Если передать символьный код нажатой управляющей клавиши такой функции, как TextOut, то Windows отобразит маленький прямоугольник, указывая, что код не соответствует печатному символу.
Таблица. 18.9. Наиболее используемые управляющие клавиши
Клавиша Действие Десятичное значение кода
Backspase Возврат на одну позицию 8
Tab Табуляция 9
Ctrl+J Перевод строки 10
J Возврат каретки 13
Esc Выход 27
Затем функция ОпСпаг добавляет в конец строки, содержащей текст, новый символ, используя перегруженный оператор "+=" класса СБигз-пд.
СЕспоОос* РОос = GetDocument() ; Р0ос->т_Техг.Ь:1пе += пСпаг;
Наконец, функция ОпСпаг создает объект контекста устройства для окна представления и использует его для отображения всей строки, включая новый символ в конце. Даже если в окно просто добавляется последний символ, то заново отобразить строку проще, чем вычислять позицию последнего символа и выводить этот символ. Определение точного места символа в строке — сложная задача для шрифтов с переменным питчем или курсивных шрифтов.
Заметим: вместо установки специфического цвета функция ОпСпаг присваивает тексту цвет "Wmdows Ропг.", получаемый передачей значения СОЬОК__К1'ЫОО«'ТЕХТ в функцию Win32 АР1 : : GetSysColor.
СИеШгОС. ЗегЛ'ехТ-Со1ог ( : :GetSysColor (СОЬОк_Иг1ЫООКТЕХТ) ) ;
Так как функция ОпСпаг не устанавливает шрифт текста, символы отображаются с использованием стандартного системного шрифта.
Предупреждение
Как упоминалось в гл. 13, если окно представления поддерживает средства прокрутки, т.е. порождается от класса СБсгоНУхеы, то перед отображением текста или графики необходимо передать созданный объект контекста устройства ссИег^БС в функцию СТ1ею: : ОпРгерагеОС. Функция ОпРгерагеос согласует объект контекста устройства с текущей позицией прокрутки документа таким образом, чтобы выводимые символы появились в правильных позициях. Для объекта контекста устройства, переданного функции ОпБгаж, функцию ОпРгерагеБС вызывать не нужно.
Хотя функция ОпОгам при каждом нажатии клавиши отображает обновленную строку символов, программе проще повторно отображать символы всякий раз, когда нужно обновить окно. Для этого добавьте следующий код в функцию ОпОгам в файле EchoView.cpp.
1111111111111111111П11111111111111111111111111111 /11 /11111 /11111 II Отображение с использованием класса CEchoView
void CEchoView::OnDraw(CDC* pDC) {
CEchoDoc* pDoc = GetDocument() ; ASSERT_VALID(pDOc) ;
// TODO: здесь добавьте собственный код отображения данных
PDC->SetTextColor (::GetSysColor (COLOR_WINDOWTEXT)); PDC->SetBkMode (TRANSPARENT); PDC->TextOut (0, 0, pDoc->m_TextLine);
}
Обратите внимание: вместо непосредственного отображения текста, функция OnChar могла бы вызвать функцию CDocument: : UpdateAllViews для отображения текста функцией OnDraw. Тем не менее, отображение текста прямо из onChar не только более эффективно, но также позволяет избежать нежелательного мерцания, происходящего при каждом обновлении окна представления функцией OnDraw. Нежелательное мерцание является следствием очистки недействительной области окна непосредственно перед вызовом OnDraw.
Наконец, добавим в функцию OnEditClear следующий код.
Предыдущая << 1 .. 37 38 39 40 41 42 < 43 > 44 45 46 47 48 49 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100