9. В левом списке New Windows Messages/events нужно выбрать функцию WM_ KEYDOWN, двойным щелчком на ее имени нужно переместите ее в правый список и нажать кнопку OK. В окне редактора будет открыт код обработчика этого события. Его нужно изменить, как показано в листинге 5.20. Листинг 5.20
void CNotePadView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CEditView::OnKeyDown(nChar, nRepCnt, nFlags);
if(nChar == VK_DELETE)
{
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))
return;
int nFirstVisible = edit.GetFirstVisibleLine;
edit.LineScroll(-nFirstVisible, 0);
lwStyle &= ~WS_VSCROLL;
::SetWindowLong(edit.GetSafeHwnd, GWL_STYLE, lwStyle);
}
}
}В результате всех этих манипуляций будет создано нормально обновляемое окно редактирования.
10. Наконец, для того, чтобы при выходе за пределы видимой части окна, окно отображало полосы прокрутки, по алгоритму, описанному в пункте 8, нужно добавить к классу событие WM_CHAR и написать его обработчик, код которого приведен в листинге 5.21.
Листинг 5.21void CNotePadView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CEditView::OnChar(nChar, nRepCnt, nFlags);
UpdateViewWindow;
}11. Если запустить приложение, то будет видно, что функции редактирования при помощи сочетаний клавиш Ctrl+C, Ctrl+V, Ctrl+X и Ctrl+Z уже работают. Такое взаимодействие уже встроено в класс CEditView. Необходимо связать эти действия с соответствующими пунктами меню редактирования.
12. Из контекстного меню на имени класса CNotePadView в окне ClassView выбрать команду Add Windows Message Handler. В открывшемся окне мастера нужно найти список Class or Object to Handle и выбрать в нем строку ID_EDIT_COPY. В списке New Windows Message/Handler нужно найти строку COMMAND и дважды щелкнуть на ней мышью. На экран будет выведено окно с запросом имени функции, которое можно оставить без изменений. Эта строка будет добавлена в окно Existing Windows Message/Handler. После нажатия кнопки OK в общем окне, в коде будет создан обработчик события OnEditCopy, связанный с соответствующим пунктом меню.
13. Такие же действия нужно выполнить с идентификаторами ID_EDIT_CUT, ID_ EDIT_PASTE и ID_EDIT_UNDO.
14. Написать код обработчиков этих событий, который приведен в листинге 5.22.
Листинг 5.22void CNotePadView::OnEditCopy
{
CEditView::OnEditCopy;
UpdateViewWindow;
}
void CNotePadView::OnEditCut
{
CEditView::OnEditCut;
UpdateViewWindow;
}
void CNotePadView::OnEditPaste
{
CEditView::OnEditPaste;
UpdateViewWindow;
}
void CNotePadView::OnEditUndo
{
CEditView::OnEditUndo;
UpdateViewWindow;
}