5. Запустив программу после внесения этих изменений, можно увидеть, что окно документа начинает себя вести как окно текстового редактора. В нем появился текстовый курсор, пользователь может набирать текст, появились полосы прокрутки. Однако если набрать в окне достаточно большой объем текста и прокрутить его горизонтально или вертикально, можно обнаружить проблемы с перерисовкой окна и выводом текста на экран. Даже при использовании технологии MFC многое разработчик должен делать самостоятельно.
6. Добавить к классу CNotePadView новый приватный метод. Для этого нужно щелкнуть правой клавишей мыши на имени класса в окне ClassView и выполнить команду Add Member Function. На экран будет выведено окно мастера. Его надо заполнить так, как это показано на рис. 5.6. Код этого метода приведен в листинге 5.18.
Рис. 5.6. Окно мастера создания метода класса.
Листинг 5.18void CNotepadView::UpdateViewWindow()
{
CEdit& edit = GetEditCtrl();
TEXTMETRIC tm;
CDC* pDC = edit.GetDC();
pDC->GetTextMetrics(&tm);
edit.ReleaseDC(pDC);
CRect r;
edit.GetRect(&r);
int noOfVisibleLines = r.Height() / tm.tmHeight;
if(edit.GetLineCount() > noOfVisibleLines)
{
long lwStyle =::GetWindowLong(edit.GetSafeHwnd(), GWL_STYLE);
if(!(lwStyle & WS_VSCROLL))
{
lwStyle |= WS_VSCROLL;
::SetWindowLong(edit.GetSafeHwnd(), GWL_STYLE, lwStyle);
}
int nCaretLine = edit.LineFromChar();
int nFirstVisible = edit.GetFirstVisibleLine();
if(nFirstVisible + noOfVisibleLines <= nCaretLine)
{
HideCaret();
edit.LineScroll(nCaretLine – nFirstVisible – noOfVisibleLines + 1);
ShowCaret();
}
if(nFirstVisible > nCaretLine)
{
HideCaret();
edit.LineScroll(nCaretLine – nFirstVisible);
ShowCaret();
}
}
else
{
long lwStyle =::GetWindowLong(edit.GetSafeHwnd(), GWL_STYLE);
if(!(lwStyle & WS_VSCROLL))
return;
int nFirstVisible = edit.GetFirstVisibleLine();
edit.LineScroll(-nFirstVisible, 0);
lwStyle &= ~WS_VSCROLL;
::SetWindowLong(edit.GetSafeHwnd(), GWL_STYLE, lwStyle);
}
}7. Теперь необходимо связать этот метод со стандартным обработчиком события перерисовки измененного окна. Для этого надо добавить данное событие к классу CNotePadView и написать его обработчик. Нужно щелкнуть правой клавишей мыши на имени класса CNotePadView в окне ClassView и выполнить команду Add Virtual Function. На экран будет выведено окно мастера (рис. 5.7).
Этот мастер позволяет добавить к классу те функции, которые он наследует от базового класса. В данном случае добавляется существующее в базовом классе событие OnUpdate, которое вызывается после модификации документа для перерисовки его отображения в окне. В левом списке New Virtual Functions окна мастера нужно выбрать функцию OnUpdate, а затем нажать кнопку Add and Edit. Событие будет добавлено в класс, а в редакторе будет открыт код реализации этого события. Код нужно переписать, как показано в листинге 5.19. Листинг 5.19
void CNotePadView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
{
CEditView::OnUpdate(pSender, lHint, pHint);
UpdateViewWindow();
}8. Несколько иначе добавляется событие OnKeyDown. Снова потребуется вызвать контекстное меню на имени класса CNotePadView в окне ClassView. Поскольку событие OnKeyDown является обернутым в метод MFC сообщением Windows, то на этот раз необходимо выбрать из контекстного меню команду Add Windows Message Handler. На экран будет выведено окно мастера (рис. 5.8).