Иллюстрированный самоучитель по Visual Studio.Net


Класс для просмотра изображений - часть 5


//=== Вычисление и установка размеров окна прокрутки

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. Метод Of f setRect этого класса позволяет сдвигать прямоугольник окна в нужном нам направлении.

Обслуживание контейнера m_pWnds дочерних окон типа cwndGeom сопряжено с необходимостью следить за освобождением памяти, занимаемой окнами, в те моменты, когда происходит переход от папки к папке в окне CLef tview. Для этой цели служит вспомогательная функция 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 () ;

}




Начало  Назад  Вперед