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


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


// ----------------------------------------------------- // Функции для работы с файлами в формате DIB // ----------------------------------------------------- #define STRICT #include <windows.h> #include <windowsx.h> #include <commdlg.h> #include <mem.h> #pragma hdrstop #include "dib.hpp"

// ------------------------------- // Функция SizeToHiMetric // Преобразование ширины и высоты для // режима отображения MM_HIMETRIC // ------------------------------- static void SizeToHiMetric(int *width, int *height) { HDC hDC = GetDC(0);

if(hDC) { // Определяем количество пикселов на один // логический дюйм по горизонтали и вертикали int dpiX = GetDeviceCaps(hDC, LOGPIXELSX); int dpiY = GetDeviceCaps(hDC, LOGPIXELSY);

// Константа для пересчета const long HiMetricPerInch = 2540;

// Выполняем пересчет if(width) *width = int (*width * HiMetricPerInch / dpiX); if(height) *height = int (*height * HiMetricPerInch / dpiY);

ReleaseDC(0, hDC); } }

// ------------------------------- // Функция DIBCopyToClipboard // Копирование DIB в Clipboard // ------------------------------- BOOL DIBCopyToClipboard(HDIB hDib, HWND hwnd) { POINT ptSize; HDC hdcMeta, hdc, hdcMem; HMETAFILE hMF; HBITMAP hBitmap; HPALETTE hPal, hOldPal; HGLOBAL hMeta; LPMETAFILEPICT lpMeta; int x, y;

// Если DIB не загружен или он имеет тип, // отличный от WINRGB_DIB, копирование не выполняем if(hDib == NULL) return FALSE; if(DIBType(hDib) != WINRGB_DIB) return FALSE;

// Открываем и очищаем Clipboard if(!OpenClipboard(hwnd)) return FALSE; EmptyClipboard();

// Определяем размеры DIB DIBGetBmpRect(hDib, &ptSize); x = ptSize.x; y = ptSize.y;

// Создаем DDB // Копируем в него содержимое окна, // размеры копируемой области равны // размерам DIB hdc = GetDC(hwnd); hdcMem = CreateCompatibleDC(hdc); hBitmap = CreateCompatibleBitmap(hdc, x, y); if(hBitmap) { SelectObject(hdcMem, hBitmap); StretchBlt(hdcMem, 0, 0, x, y, hdc, 0, 0, x, y, SRCCOPY); } DeleteDC(hdcMem); ReleaseDC(hwnd, hdc);




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



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