Операционная система Microsoft Windows 3.1 для программиста. Дополнительные главы


Листинг 2.6. Фрагмент файла bmpinfo/dib.cpp - часть 2


// Создаем метафайл в памяти hdcMeta = CreateMetaFile((LPSTR)NULL);

// Устанавливаем начало координат и размеры изображения SetWindowOrgEx(hdcMeta, 0, 0, NULL); SetWindowExtEx(hdcMeta, ptSize.x, ptSize.y, NULL);

// Создаем палитру из DIB hPal = DIBCreatePalette(hDib); if(hPal) { // Выбираем и реализуем палитру в контекст // метафайла hOldPal = SelectPalette(hdcMeta, hPal, FALSE); RealizePalette(hdcMeta); }

// Рисуем DIB в контексте метафайла DIBPaint(hdcMeta, 0, 0, hDib);

// Выбираем старую палитру if(hPal) SelectPalette(hdcMeta, hOldPal, FALSE);

// Закрываем метафайл hMF = CloseMetaFile(hdcMeta);

// Заказываем память для заголовка метафайла hMeta = GlobalAlloc(GHND, sizeof(METAFILEPICT)); lpMeta = (LPMETAFILEPICT)GlobalLock(hMeta);

// Преобразуем координаты для // режима отображения MM_HIMETRIC SizeToHiMetric(&x, &y);

// Заполняем заголовок метафайла lpMeta->mm = MM_ANISOTROPIC; lpMeta->xExt = x; lpMeta->yExt = y; lpMeta->hMF = hMF;

// Расфиксируем память заголовка метафайла GlobalUnlock(hMeta);

// Записываем метафайл в Clipboard if(hMeta) SetClipboardData(CF_METAFILEPICT, hMeta);

// Записываем DDB в Clipboard if(hBitmap) SetClipboardData(CF_BITMAP, hBitmap);

// Записываем палитру в Clipboard if(hPal) SetClipboardData(CF_PALETTE, hPal);

// Закрываем Clipboard CloseClipboard(); return TRUE; }

Функция SizeToHiMetric предназначена для преобразования значений ширины и высоты изображения из пикселов в сотые доли миллиметра. Напомним, что при заполнении заголовка метафайла в изотропном и анизотропном режиме отображения размеры изображения указываются в сотых долях миллиметра.

Для выполнения преобразования функция SizeToHiMetric определяет количество пикселов в одном логическом дюйме для контекста отображения, связанного с экраном дисплея. Далее ширина (высота) изображения (в пикселах) умножается на значение 2540 (1 дюйм соответствует 25,4 миллиметра) и делится на количество пикселов в одном логическом дюйме.

Функция DIBCopyToClipboard выполняет копирование данных в Clipboard одновременно в нескольких форматах, используя методики, описанные нами в предыдущих разделах.Для определения размеров DIB вызывается функция DIBGetBmpRect, определенная в файле dib.cpp (в листинге не представлена).




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



Книжный магазин