Смекни!
smekni.com

Работа с регионами в Visual C++ (стр. 2 из 2)

// ---------------------------------------------------------

// сканируембитмап

// ---------------------------------------------------------

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).

В заключении, неплохо было бы заключить весь вышеприведённый материал в класс, чтобы код удобнее читался:

Удачи!