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

 

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

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

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

void CEchoView::OnEditClear() {
// TODO: Здесь добавьте собственный код обработчика
CEchoDoc* PDoc = GetDocument(); PDoc->m_TextLine.Empty (); PDoc->UpdateAllViews (NULL);
}
Добавленный код вызывает функцию Empty класса CString, которая удаляет символы, хранимые в переменной m TextLine, устанавливая длину строки в 0. Затем вызывается функция UpdateAllViews, очищающая окно представления.
Теперь можно построить и выполнить программу Echo и попробовать ввести строки текста. Оставьте проект Echo открытым в Developer Studio, потому что работа с этой программой еще не окончена.
Управление курсором при редактировании
При выполнении программы Echo вы, вероятно, заметили, что чего-то не хватает, а именно, знакомого мигающего курсора, отмечающего место вставки данных в текст. Добавим его в этом параграфе.
Для управления курсором нужно определить несколько новых функций обработки сообщений. Назначение каждой из этих функций будет объяснено после добавления их кода. В окне мастера ClassWizard откройте вкладку Message Maps, в
списке Class name выберите имя класса CEchoView, а в списке Object IDs — класс
CEchoView.
Теперь определим обработчики трех уведомляющих сообщений Windows, посылаемых окну представления. В списке Message выберите сообщение wm_create и щелкните на кнопке Add Function для создания обработчика сообщения с именем OnCreate. Аналогично определите обработчики сообщений wm_killfocus и wm_setfocus, которые называются OnKillFocus и OnSetFocus. Щелчком на кнопке OK закройте диалоговое окно мастера.
Перед реализацией новых обработчиков сообщений откройте файл EchoView.h и добавьте следующие определения в начало определения класса CEchoView.
class CEchoView : public CView
{
private :
POINT m_CaretPos;
int m_XCaret, m_YCaret;
Переменная m_CaretPos хранит текущую позицию курсора, m_XCaret — его ширину, m_YCaret 7 высоту.
Теперь откройте файл EchoView.cpp и добавьте код инициализации в конструктор класса CEchoView.
CEchoView::CEchoView() {
// todo: здесь добавьте собственный код конструктора m_CaretPos.х = m_CaretPos.у = 0;
}
Такая инициализация заставит курсор первоначально появиться в левом верхнем углу окна представления.
В этом же файле добавьте код в функцию OnCreate.
int CEchoView::OnCreate(LPCREATESTRUCT lpCreateStruct) {
if (CView::OnCreate(lpCreateStruct) == -1) return -1 ;
// TODO: здесь добавьте специальный код
CClientDC ClientDC(this); TEXTMETRIC TM;
ClientDC.Ge tTextMe tries (6TM);
m_XCaret = TM. tmAveCharWidth / 3;
m_YCaret = TM.tmHeight + TM. tmExtemalLeading;
return 0;
}
Функция OnCreate вызывается после первоначального создания окна представления, но перед тем, как оно станет видимым. Добавленный код вычисляет
и сохраняет размер отображаемого курсора. Вместо установки некоторой произвольной ширины курсора функция OnCreate рассчитывает ее ширину по текущей ширине рамки окна так, чтобы каретка имела подходящую ширину, независимо от видеорежима, т. е. ширина курсора масштабируется в соответствии с размерами других стандартных элементов окна. Она получает ширину рамки окна, передавая функции API : : GetSystemMetrics значение sm_cxborder Win32. Функция OnCreate делает высоту курсора равной высоте символов в стандартном системном шрифте, используемом для отображения текста. Она получает высоту, создавая объект контекста устройства и вызывая функцию TextMetrics.
Затем добавьте код в функцию OnSetFocus (также находящуюся в файле Echoview.cpp) следующим образом.
void CEchoView. :OnSetFocus(CWnd* pOldWnd) {
CView::OnSetFocus(pOldWnd);
// TODO: здесь добавьте собственный код обработчика
CreateSolidCaret (m_XCaret, m_YCaret); SetCaretPos (m_CaretPos); ShowCaret ();
}
Функция OnSetFocus вызывается всякий раз, когда окно представления получает фокус ввода, в частности, при первоначальном создании окна представления и при каждом переключении на программу Echo после работы в другой программе. Функция OnSetFocus вызывает функцию CreateSolidCaret класса CWnd для создания курсора, передавая этой функции значения его ширины и высоты. Затем она вызывает функцию CWnd: :SetCaretPos, чтобы поместить курсор в нужную позицию. Так как вновь созданный курсор невидим, вызовите функцию CWnd: : ShowCaret, чтобы его отобразить,
Обратите внимание: когда окно представления создано, функция OnSetFocus вызывается после функции OnCreate. Следовательно, можно использовать размеры курсора, установленные функцией OnCreate. Легко понять, почему курсор необходимо создавать до создания окна представления. Но почему же его необходимо создавать каждый раз при получении окном представления фокуса? Причина в том, что курсор удаляется всякий раз, когда окно представления теряет фокус, вызывая функцию : : DestroyCaret класса Win32 API, которую необходимо добавить в функцию OnKillFocus.
void CEchoView:-.OnKillFocus (CWnd* pNewWnd) {
CView::OnKillFocus(pNewWnd) ;
// TODO: здесь добавьте собственный код обработчика ::DestroyCaret ();
)
Функция OnKillFocus вызывается каждый раз, когда окно представления теряет фокус ввода. Курсор - это общедоступный ресурс Windows. Одновременно
Предыдущая << 1 .. 38 39 40 41 42 43 < 44 > 45 46 47 48 49 50 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100