- Любовные романы
- Фантастика и фэнтези
- Ненаучная фантастика
- Ироническое фэнтези
- Научная Фантастика
- Фэнтези
- Ужасы и Мистика
- Боевая фантастика
- Альтернативная история
- Космическая фантастика
- Попаданцы
- Юмористическая фантастика
- Героическая фантастика
- Детективная фантастика
- Социально-психологическая
- Боевое фэнтези
- Русское фэнтези
- Киберпанк
- Романтическая фантастика
- Городская фантастика
- Технофэнтези
- Мистика
- Разная фантастика
- Иностранное фэнтези
- Историческое фэнтези
- LitRPG
- Эпическая фантастика
- Зарубежная фантастика
- Городское фентези
- Космоопера
- Разное фэнтези
- Книги магов
- Любовное фэнтези
- Постапокалипсис
- Бизнес
- Историческая фантастика
- Социально-философская фантастика
- Сказочная фантастика
- Стимпанк
- Романтическое фэнтези
- Ироническая фантастика
- Детективы и Триллеры
- Проза
- Юмор
- Феерия
- Новелла
- Русская классическая проза
- Современная проза
- Повести
- Контркультура
- Русская современная проза
- Историческая проза
- Проза
- Классическая проза
- Советская классическая проза
- О войне
- Зарубежная современная проза
- Рассказы
- Зарубежная классика
- Очерки
- Антисоветская литература
- Магический реализм
- Разное
- Сентиментальная проза
- Афоризмы
- Эссе
- Эпистолярная проза
- Семейный роман/Семейная сага
- Поэзия, Драматургия
- Приключения
- Детская литература
- Загадки
- Книга-игра
- Детская проза
- Детские приключения
- Сказка
- Прочая детская литература
- Детская фантастика
- Детские стихи
- Детская образовательная литература
- Детские остросюжетные
- Учебная литература
- Зарубежные детские книги
- Детский фольклор
- Буквари
- Книги для подростков
- Школьные учебники
- Внеклассное чтение
- Книги для дошкольников
- Детская познавательная и развивающая литература
- Детские детективы
- Домоводство, Дом и семья
- Юмор
- Документальные книги
- Бизнес
- Работа с клиентами
- Тайм-менеджмент
- Кадровый менеджмент
- Экономика
- Менеджмент и кадры
- Управление, подбор персонала
- О бизнесе популярно
- Интернет-бизнес
- Личные финансы
- Делопроизводство, офис
- Маркетинг, PR, реклама
- Поиск работы
- Бизнес
- Банковское дело
- Малый бизнес
- Ценные бумаги и инвестиции
- Краткое содержание
- Бухучет и аудит
- Ораторское искусство / риторика
- Корпоративная культура, бизнес
- Финансы
- Государственное и муниципальное управление
- Менеджмент
- Зарубежная деловая литература
- Продажи
- Переговоры
- Личная эффективность
- Торговля
- Научные и научно-популярные книги
- Биофизика
- География
- Экология
- Биохимия
- Рефераты
- Культурология
- Техническая литература
- История
- Психология
- Медицина
- Прочая научная литература
- Юриспруденция
- Биология
- Политика
- Литературоведение
- Религиоведение
- Научпоп
- Психология, личное
- Математика
- Психотерапия
- Социология
- Воспитание детей, педагогика
- Языкознание
- Беременность, ожидание детей
- Транспорт, военная техника
- Детская психология
- Науки: разное
- Педагогика
- Зарубежная психология
- Иностранные языки
- Филология
- Радиотехника
- Деловая литература
- Физика
- Альтернативная медицина
- Химия
- Государство и право
- Обществознание
- Образовательная литература
- Учебники
- Зоология
- Архитектура
- Науки о космосе
- Ботаника
- Астрология
- Ветеринария
- История Европы
- География
- Зарубежная публицистика
- О животных
- Шпаргалки
- Разная литература
- Зарубежная литература о культуре и искусстве
- Пословицы, поговорки
- Боевые искусства
- Прочее
- Периодические издания
- Фанфик
- Военное
- Цитаты из афоризмов
- Гиды, путеводители
- Литература 19 века
- Зарубежная образовательная литература
- Военная история
- Кино
- Современная литература
- Военная техника, оружие
- Культура и искусство
- Музыка, музыканты
- Газеты и журналы
- Современная зарубежная литература
- Визуальные искусства
- Отраслевые издания
- Шахматы
- Недвижимость
- Великолепные истории
- Музыка, танцы
- Авто и ПДД
- Изобразительное искусство, фотография
- Истории из жизни
- Готические новеллы
- Начинающие авторы
- Спецслужбы
- Подростковая литература
- Зарубежная прикладная литература
- Религия и духовность
- Старинная литература
- Справочная литература
- Компьютеры и Интернет
- Блог
Программирование для карманных компьютеров - Владимир Волков
Шрифт:
Интервал:
Закладка:
BOOL CNotePadView::PreCreateWindow(CREATESTRUCT& cs)
{
if(!CEditView::PreCreateWindow(cs))
return FALSE;
cs.style &= ~WS_VSCROLL;
cs.style &= ~WS_HSCROLL;
cs.style &= ~ES_AUTOHSCROLL;
m_dwDefaultStyle &= ~WS_VSCROLL;
m_dwDefaultStyle &= ~WS_HSCROLL;
m_dwDefaultStyle &= ~ES_AUTOHSCROLL;
return TRUE;
}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).
Р РёСЃ.В 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).
Рис. 5.8. Мастер добавления события, основанного на сообщениях Windows.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();

