Есть необходимость создания регионов для окна "на лету", для этого используется нижеследующая процедура наглым образом украденная откуда-то(hWin - хендл окна,hBitmap - битмап отрисованный в окне,bm - глобальная структура BITMAP)... Процедура работает, но ОЧЕНЬ МЕДЛЕННО (рисунок средней "сложности" размером 640х480 обрабатывается около 2 миллиардов тактов). А теперь собственно вопрос: Возможно ли создать регион БОЛЕЕ БЫСТРЫМ способом, чем "тупое" GetPixel ??? Код (Text): CreateRegionOrig PROC uses esi hWin:DWORD,hBitmap:DWORD LOCAL var_X:DWORD ; Col value LOCAL var_Y:DWORD ; Row value LOCAL var_StartLineX:DWORD ; start location of a region LOCAL var_FullRegion:DWORD ; Combination of all Regions found so far LOCAL var_LineRegion:DWORD ; Current region LOCAL var_TransparantColor:DWORD ; color that is used to indicate transparancy LOCAL var_Inline:DWORD ; Inline Region state mov var_Inline,FALSE mov var_X,0 mov var_Y,0 mov var_StartLineX,0 invoke CreateRectRgn,0,0,0,0 mov var_FullRegion,eax invoke GetDC,hWin push eax invoke CreateCompatibleDC,eax xchg eax,esi push hWin call ReleaseDC invoke SelectObject,esi,hBitmap invoke GetPixel,esi,0,0 mov var_TransparantColor,eax mov ebx, bm.bmHeight .WHILE var_Y < ebx mov ebx,bm.bmWidth .WHILE var_X <= ebx invoke GetPixel,esi,var_X,var_Y mov ebx,bm.bmWidth .IF eax==var_TransparantColor || var_X==ebx .IF var_Inline==TRUE mov var_Inline,FALSE mov ebx,var_Y inc ebx invoke CreateRectRgn,var_StartLineX,var_Y,var_X,ebx mov var_LineRegion,eax invoke CombineRgn,var_FullRegion,var_FullRegion,var_LineRegion,RGN_OR invoke DeleteObject,var_LineRegion .ENDIF .ELSE .IF var_Inline==FALSE mov var_Inline,TRUE push var_X pop var_StartLineX .ENDIF .ENDIF inc var_X mov ebx,bm.bmWidth .ENDW inc var_Y mov var_X,0 mov ebx,bm.bmHeight .ENDW invoke DeleteDC,esi invoke SetWindowRgn,hWin,var_FullRegion,1 ret CreateRegionOrig ENDP
Выделяй память под битмап и забирай его целиком с помощью GetDIBits. Затем обращайся к пикселам как к обычному двумерному массиву. Постоянные вызовы CreateRectRgn, CombineRgn на каждой итерации цикла тоже ужасны, но это уже другая песня. Вообще, лучше подумай, как написать свой алгоритм, потому что этот плох (явно слишком медленный).
Спасибо за ответы. Ещё один вопрос: каков формат описания региона, и возможно ли создать прямоугольный регион в размер окна и уже затем напрямую изменять регион ???