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


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


Цвет фона выбирается из того набора, который предоставляет система (см. справку по функции GetSysColor), а курсор создали сами. Дело в том, что системный курсор, идентифицируемый как i DC_HAND, работает не во всех версиях Windows. Если вы работаете в среде Windows 2000, то можете заменить в параметре функции LoadCur sor вызов GetModuleHandle (0) на 0, а идентификатор IDC_MYHAND на IDC_HAND и работать с системным курсором. В этом случае ресурс курсора IDC_MYHAND окажется лишним и его можно удалить.

В данный момент мы предполагаем, что в классе документа уже создан динамический контейнер m_Shapes объектов класса CPolygon, каждый элемент которого соответствует данным, полученным в результате чтения документов, обнаруженных в текущем каталоге. Теперь приступим к разработке самой сложной функции в составе класса CRightView, которая должна:

  1. Пройти по всему перечню объектов m_shapes класса CPolygon.

  2. Вычислить исходя из текущего размера окна количество рядов и колонок мини-окон с изображениями полигонов.

  3. Создать для каждого из них окно, управляемое классом CWndGeom.

Дальше события развиваются автоматически. После создания окна cwndGeom система пошлет ему сообщение WM_PAINT, в обработке которого надо создать и настроить контекст устройства мини-окна, а затем вызвать функцию Draw для того полигона из контейнера m_Shapes, индекс которого соответствует индексу окна CWndGeom. Каждый полигон рисует себя сам в заданном ему в качестве параметра контексте устройства. Введите в файл реализации класса 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);



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