Класс для просмотра изображений
Введите в файл реализации класса CRightView следующий код:
void CRightView::Show() { CTreeDoc *pDoc = GetDocument0; //====== Количество картинок int nPoly = pDoc › m_Shapes.size(); //=== Вычисление шага, с которым выводятся картинки int dx = m_szltem.cx + m_szMargin.ex, dy = m_szltem.cy + m_szMargin.cy, nCols = m_szView.cx/dx; // Количество колонок //====== Коррекция if (nCols < 1)nCols = 1; if (nCols > nPoly)nCols = nPoly; //====== Количество рядов int nRows = ceil(double(nPoly)/nCols); //=== Вычисление и установка размеров окна прокрутки m_szScroll = CSize(nCols*dx, nRows*dy); SetScrollSizes(MM_TEXT, m_szScroll); //====== Координаты и размеры первой картинки CRect r (CPoint(0.0), m_szltem); r.OffsetRect (15.15); //====== Стиль окна картинки DWORD style = WS_CHILD | WS_BORDER | WS_VISIBLE; //====== Цикл прохода по рядам (n – счетчик картинок) for (int 1=0, n=0; i<nRows; i++) { //====== Цикл прохода по столбцам for (int j=0; j<nCols && rKnPoly; j++, n++) { //====== Создаем класс окна картинки CWndGeora *pWnd = new CWndGeom(this, n); //====== Запоминаем его в контейнере m_pWnds.push_back(pWnd); //====== Создаем Windows-окно pWnd › Create (m_WndClass, 0, style, r, this, 0); //====== Сдвигаем позицию окна вправо r.OffsetRect (dx, 0); } //=== Начинаем новый ряд картинок (сдвиг влево-вниз) r.OffsetRect (-nCols*dx, dy); } }
Существенным моментом в алгоритме является то, что размер прокручиваемого окна (m_szScroll) зависит от количества картинок. Поэтому сколько бы их не было в текущей папке – все будут доступны с помощью полос прокрутки. Расположение и размеры картинок определяются с помощью объекта класса CRect. Метод OffsetRect этого класса позволяет сдвигать прямоугольник окна в нужном нам направлении.
Обслуживание контейнера m_pWnds дочерних окон типа cwndGeom сопряжено с необходимостью следить за освобождением памяти, занимаемой окнами, в те моменты, когда происходит переход от папки к папке в окне CLeftview. Для этой цели служит вспомогательная функция Clear, которую надо вызывать как в отмеченные выше моменты, так и при закрытии окна. Последний случай сопровождается автоматическим вызовом деструктора класса CRightview. С учетом сказанного введите такие добавки в файл RightView.cpp:
void CRightview::Clear() { //====== Цикл прохода по всем адресам контейнера for (UINT i=0; Km_pWnds .size (); i++) { //====== Уничтожение Windows-окна m_pWnds[i] › DestroyWindow(); // Освобождение памяти, занимаемой объектом delete m_pWnds[ i ]; } //===== Освобождение памяти, занимаемой контейнером m_pWnds.clear(); } //===== Деструктор класса вызывает Clear CRightview::~CRightview() { Clear (); }