Класс для просмотра изображений
Класс представления документа CRightView служит для иллюстрации содержимого всех документов, обнаруженных в текущей выбранной папке. В окне CRightView мы рядами и столбцами разместим другие простые окна, управляемые классом CWndGeom, которые будут иметь одинаковый размер и изображать геометрию конструкции, соответствующей данным документа. Причем изображение в контексте окна воспроизведут сами документы, точнее объекты m_poly, которые есть в каждом из них. Далее окна класса CWndGeom мы будем называть картинками.
Так как количество документов в текущей папке произвольно и заранее не известно (но они все должны быть доступны пользователю), то, чтобы разместить все картинки, размеры окна CRightView должны быть переменными. Окно должно быть "резиновым". Класс CRightView был изначально создан мастером AppWizard как класс, способный прокручивать содержимое своего окна, так как в качестве базового класса для него был выбран csroliview. Благодаря этому класс приобрел способность следить за размерами своего окна и при необходимости создавать полосы горизонтальной и вертикальной прокрутки.
Наша цель – научиться программно управлять размерами окна прокрутки, динамически создавать и уничтожать окна картинок и правильно изображать в них геометрию конструкции, опираясь на данные документа. Скорректируйте коды стартовой заготовки с интерфейсом класса так, как показано ниже:
#pragma once //====== Класс для демонстрации содержимого документов class CRightView: public CScrollView { //====== Упреждающее объявление класса картинок friend class CWndGeom; protected: CSize m_szView; // Реальные размеры окна CSize m_szScroll; // Размеры прокручиваемого окна CSize m_szltem; // Размеры картинки CSize m_szMargin; // Размеры полей CString m_WndClass; // Строка регистрации картинки CRightView (); DECLARE_DYNCREATE(CRightView) public: //====== Контейнер картинок vector<CWndGeom*> m_pWnds; CTreeDoc* GetDocument() { return dynamic_cast<CTret=Doc*> (m_pDocument); } virtual – CRightView(); void Show(); // Демонстрация картинок void Clear(); // Освобождение ресурсов // Overrides public: virtual void OnDraw(CDC* pDC); protected: virtual void OnlnitialUpdate(); DECLARE_MESSAGE_MAP() };
Внесите сокращения и изменения в коды реализации класса так, как показано ниже:
IMPLEMENTJDYNCREATE(CRightView, CScrollView) BEGIN_MESSAGE_MAP(CRightView, CScrollView) END_MESSAGE_MAP() CRightView::CRightView()() CRightView::-CRightView(){} void CRightView::OnDraw(CDC* pDC) { CTreeDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); }
Полосы прокрутки автоматически появляются, когда реальные размеры окна (m_szview) становятся меньше размеров прокручиваемого окна (m_szScroll), которые надо задать в качестве аргумента функции SetScrollSizes. Если пользователь увеличил размеры окна и они стали равными или больше тех, что были указаны, то полосы автоматически исчезают. Отсюда следует, что программист должен как-то задать первоначальные размеры m_szScroll, когда еще не известны требования к ним. Обычно это делается в функции OnlnitialUpdate. Просмотрите коды этой функции, и вы увидите, какие размеры прокручиваемого окна (по умолчанию) задал мастер AppWizard.
Для слежения за размерами окна представления введите в класс CRightview реакцию на сообщение WM_SI ZE, так же как вы это делали в классе CDrawView. Измените коды этой функции, а также функции OnlnitialUpdate, в которой мы приравниваем начальные размеры прокручиваемого окна к реальным:
void CRightView::OnSize(UINT nType, int ex, int cy) { CScrollView::OnSize(nType, ex, cy); if (cx==0 || cy==0) return; //====== Запоминаем размеры окна представления m_szView = CSize (ex, cy); } void CRightView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); //====== Начальные размеры окна m_szScroll = m_szView; SetScrollSizes(MM_TEXT, m_szScroll); }