Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
65-96.doc
Скачиваний:
5
Добавлен:
11.11.2019
Размер:
340.99 Кб
Скачать

Задание 1. Изменение базового класса для класса представления приложения

Специальный класс представления CScrollView порождается от класса общего назначения CView. Следовательно, для получения полос прокрутки необходимо изменить класс представления программы MуPaint таким образом, чтобы он порождался от класса CScrollView, а не CView. Чтобы класс представления стал производным от класса CScrollView, необходимо в исходных файлах MуPaintView.h и MуPaintView.cpp программы MуPaint, созданной ранее, заменить все вхождения класса CView на CScrollView.

Для замены вхождений класса CView выполните следующие действия.

  1. Откройте проект MуPaint.vcproj или файл решений MуPaint.sln и окно Solution Explorer.

  2. Двойным щелчком на имени файла MуPaintView.h отобразите в окне редактора код интерфейса класса представления.

  3. Вызовите диалоговое окно замены символов, выполнив команду Edit  Find and Replace   Replace. В строке Find what укажите CView, в строке Replace with — CScrollView. Нажмите кнопку Replace All. В файле будут найдены и заменены все вхождения строки CView на CScrollView.

  4. Аналогично отобразите код файла MуPaintView.срр в окне редактора и выполните замену всех вхождений строки CView на CScrollView. В файле MуPaintView.h таких вхождений должно быть одно, а в MуPaintView.cpp — восемь.

Рис. 4.5. Окно Generated Classes в процессе выбора базового класса CScrollView

  1. Сохраните изменения с помощью команды File Save All.

При генерации новой программы с помощью MFC Application Wizard можно сгенерировать класс представления, производный от класса CScrollView. Для этого в диалоговом окне Generated Classes (Сгенерированные классы) выберите имя класса представления CMуPaint View в списке Generated classes, а затем — класс CScrollView в списке Base class (Базовый класс) как на рис. 4.5.

Задание 2. Создание кода, обеспечивающего преобразования координат

  1. Добавьте в функцию CMуPaintView::OnLButtonDown() в файле MуPaintView.cpp следующий код, выделенный полужирным шрифтом. Первый добавленный оператор создает объект контекста, связанный с окном представления. Второй оператор вызывает функцию СView::OnPrepareDC() для корректировки начала области просмотра. Третий оператор вызывает функцию CDC::DPtoLP(), которая преобразует координаты курсора, сохраненные в параметре point, из координат устройства в логические для объекта контекста устройства по отношению к новому (установленному) началу области просмотра. Если в координаты, хранящиеся в параметре point, преобразованы в логические, то их уже можно использовать для рисования линии.

void CMуPaintView::OnLButtonDown (UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default CClientDC ClientDC (this); OnPrepareDC (&ClientDC); ClientDC.DPtoLP (&point); m_PointOrigin = point; m_PointOld = point; SetCapture (); m_Dragging = 1; RECT Rect; GetClientRect (&Rect); ClientToScreen (&Rect); ::ClipCursor (&Rect); CView::OnLButtonDown (nFlags, point); }

Примечание Объект контекста устройства, передаваемый функции CMуPaintView::OnDraw(), уже имеет правильно установленное начало области просмотра, скорректированное для прокрученного рисунка. При создании собственного объекта контекста устройства его необходимо передать функции CView::OnPrepareDC() для коррекции начала области просмотра.

  1. Аналогично измените код функции-обработчика сообщений мыши CMуPaintView::OnMouseMove(). В этой функции уже создается объект контекста устройства, поэтому необходимо добавить только обращения к функциям CView::OnPrepareDC() и CDC::DPtoLP(). Выделенный полужирным шрифтом код показывает добавленные операторы.

void CMуPaintView::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default ::SetCursor (m_HCross); if (m_Dragging) { CClientDC ClientDC (this); OnPrepareDC (&ClientDC); ClientDC.DPtoLP (&point); ClientDC.SetROP2 (R2_NOT); ClientDC.MoveTo (m_PointOrigin); ClientDC.LineTo (m_PointOld); ClientDC.MoveTo (m_PointOrigin); ClientDC.LineTo (point); m_PointOld = point; } CView::OnMouseMove(nFlags, point); }

  1. В код обработчика сообщений мыши CMуPaintView::OnLButtonUp() необходимо добавить только обращения к функциям CView::OnPrepareDC() и CDC::DPtoLP(). Выделенный полужирным шрифтом код показывает добавленные операторы.

void CMуPaintView::OnLButtonUp(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default if (m_Dragging) { m_Dragging = 0; ::ReleaseCapture (); ::ClipCursor (NULL); CClientDC ClientDC (this); OnPrepareDC (&ClientDC); ClientDC.DPtoLP (&point); ClientDC.SetROP2 (R2_NOT); ClientDC.MoveTo (m_PointOrigin); ClientDC.LineTo (m_PointOld); ClientDC.SetROP2 (R2_COPYPEN); ClientDC.MoveTo (m_PointOrigin); ClientDC.LineTo (point); CMуPaintDoc* PDoc = GetDocument (); PDoc->AddLine (m_PointOrigin.x,m_PointOrigin.y,point.x, point.y); } CView::OnLButtonUp(nFlags, point); }

  1. Откомпилируйте программу с помощью команды BuildCompile и устраните синтаксические ошибки в случае их появления. При наличии ошибок появляются соответствующие сообщения в окне Output, которое открывается по команде ViewOther Windows Output.

Построение программы и попытка ее выполнить приведут к возникновению исключительной ситуации (Unhandled exception — необработанное исключение), которая обнаруживается в функции OnMouseMove() при вызове функции OnPrepareDC(). Необходимо устранить исключительную ситуацию.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]