// ---------------------------------------------------------
// сканируембитмап
// ---------------------------------------------------------
DWORD p=0;
for (WORD y=0; y<wBmpHeight; y++)
{
for (WORD x=0; x<wBmpWidth; 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 >
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).
В заключении, неплохо было бы заключить весь вышеприведённый материал в класс, чтобы код удобнее читался:
Удачи!