45882 (Работа с регионами в Visual C++), страница 2
Описание файла
Документ из архива "Работа с регионами в Visual C++", который расположен в категории "". Всё это находится в предмете "информатика" из , которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. .
Онлайн просмотр документа "45882"
Текст 2 страницы из документа "45882"
Чтобы проделать подобное, нам прийдётся наваять небольшую функцию, которая будет сканировать битмап и создавать из него попиксельно регион с прозрачностью. Далее такой регион будет достаточно прицепить к окну.
// ----------------------------------------------------------------------
// Функция сканирует битмап и возвращает необходимый нам регион.
// Освободить объект региона нужно будет самостоятельно...
// ----------------------------------------------------------------------
HRGN ScanRegion(HBITMAP pBitmap, BYTE jTranspR, BYTE jTranspG, BYTE jTranspB)
{
// ширина и высота битмапа
WORD wBmpWidth,wBmpHeight;
// конечный и временный регионы
HRGN hRgn, hTmpRgn;
// 24-битные пиксели из битмапа
BYTE *pPixels = Get24BitPixels(pBitmap, &wBmpWidth, &wBmpHeight);
if (!pPixels) return NULL;
// создаём рабочий регион
hRgn = CreateRectRgn(0,0,wBmpWidth,wBmpHeight);
if (!hRgn) { delete pPixels; return NULL; }
// ---------------------------------------------------------
// сканируем битмап
// ---------------------------------------------------------
DWORD p=0;
for (WORD y=0; y { for (WORD x=0; x { BYTE jRed = pPixels[p+2]; BYTE jGreen = pPixels[p+1]; BYTE jBlue = pPixels[p+0]; if (jRed == jTranspR && jGreen == jTranspG && jBlue == jTranspB) { // удаляем прозрачный цвет из региона hTmpRgn = CreateRectRgn(x,y,x+1,y+1); CombineRgn(hRgn, hRgn, hTmpRgn, RGN_XOR); DeleteObject(hTmpRgn); } // следующий пиксель p+=3; } } // освобождаем пиксели delete pPixels; // возвращаем регион return hRgn; } Как видно из кода, сперва создаётся квадратный регион такого же размера как и битмап, переданный в функцию как параметр. Затем происходит сканирование каждого пикселя и, если находится пиксель такого же цвета как и указанный, то этот пиксель исключается из региона. Для демонстрации вышеописанного алгоритма была создана утилита RegionCreator, которая представляет собой консольное приложение работающее с графическими файлами. Скачать RegionCreator - 19Кб Запускается эта утилитка следующим образом: regioncreator bitmap.bmp: сам битмап r,g,b : прозрачный цвет (в десятичном виде: 255 255 255) Загрузка сложных регионов После того, как битмап будет обработан утилиткой, его можно поместить в приложение как ресурс и загрузить следующим образом: // ищем ресурс для нашего скина. HRSRC hrSkin = FindResource(hInstance, MAKEINTRESOURCE(IDB_SKIN),"BINARY"); if (!hrSkin) return false; // загружаем стандартный "BINARY" ресурс. LPRGNDATA pSkinData = (LPRGNDATA)LoadResource(hInstance, hrSkin); if (!pSkinData) return false; // создаём регион. HRGN rgnSkin = ExtCreateRegion(NULL, SizeofResource(NULL,hrSkin), pSkinData); // освобождаем выделенный ресурс FreeResource(pSkinData); После этого, регион достаточно будет прицепить к окну. И не забудьте удалить регион перед завершением приложения командой DeleteObject(rgnSkin). В заключении, неплохо было бы заключить весь вышеприведённый материал в класс, чтобы код удобнее читался: Удачи! Список литературы Для подготовки данной работы были использованы материалы с сайта http://www.realcoding.net/