un bien belle procédure, encore faut-il savoir l'exploiter...
Code : Tout sélectionner
ProcedureDLL TransBlit(hdc, hBitmap, xStart, yStart, TransColor)
; by netmaestro based on http://support.microsoft.com/kb/79212/EN-US/
Define.POINT ptSize
hdcTemp = CreateCompatibleDC_(hdc)
SelectObject_(hdcTemp, hBitmap)
GetObject_(hBitmap, SizeOf(BITMAP), bm.BITMAP)
ptSize\x = bm\bmWidth
ptSize\y = bm\bmHeight
DPtoLP_(hdcTemp, @ptSize, 1)
hdcBack = CreateCompatibleDC_(hdc)
hdcObject = CreateCompatibleDC_(hdc)
hdcMem = CreateCompatibleDC_(hdc)
hdcSave = CreateCompatibleDC_(hdc)
bmAndBack = CreateBitmap_(ptSize\x, ptSize\y, 1, 1, #Null)
bmAndObject = CreateBitmap_(ptSize\x, ptSize\y, 1, 1, #Null)
bmAndMem = CreateCompatibleBitmap_(hdc, ptSize\x, ptSize\y)
bmSave = CreateCompatibleBitmap_(hdc, ptSize\x, ptSize\y)
bmBackOld = SelectObject_(hdcBack, bmAndBack)
bmObjectOld = SelectObject_(hdcObject, bmAndObject)
bmMemOld = SelectObject_(hdcMem, bmAndMem)
bmSaveOld = SelectObject_(hdcSave, bmSave)
SetMapMode_(hdcTemp, GetMapMode_(hdc))
BitBlt_(hdcSave, 0, 0, ptSize\x, ptSize\y, hdcTemp, 0, 0, #SRCCOPY)
cColor = SetBkColor_(hdcTemp, TransColor)
BitBlt_(hdcObject, 0, 0, ptSize\x, ptSize\y, hdcTemp, 0, 0, #SRCCOPY)
SetBkColor_(hdcTemp, cColor)
BitBlt_(hdcBack, 0, 0, ptSize\x, ptSize\y, hdcObject, 0, 0, #NOTSRCCOPY)
BitBlt_(hdcMem, 0, 0, ptSize\x, ptSize\y, hdc, xStart, yStart, #SRCCOPY)
BitBlt_(hdcMem, 0, 0, ptSize\x, ptSize\y, hdcObject, 0, 0, #SRCAND)
BitBlt_(hdcTemp, 0, 0, ptSize\x, ptSize\y, hdcBack, 0, 0, #SRCAND)
BitBlt_(hdcMem, 0, 0, ptSize\x, ptSize\y, hdcTemp, 0, 0, #SRCPAINT)
BitBlt_(hdc, xStart, yStart, ptSize\x, ptSize\y, hdcMem, 0, 0, #SRCCOPY)
BitBlt_(hdcTemp, 0, 0, ptSize\x, ptSize\y, hdcSave, 0, 0, #SRCCOPY)
DeleteObject_(SelectObject_(hdcBack, bmBackOld))
DeleteObject_(SelectObject_(hdcObject, bmObjectOld))
DeleteObject_(SelectObject_(hdcMem, bmMemOld))
DeleteObject_(SelectObject_(hdcSave, bmSaveOld))
DeleteDC_(hdcMem)
DeleteDC_(hdcBack)
DeleteDC_(hdcObject)
DeleteDC_(hdcSave)
DeleteDC_(hdcTemp)
EndProcedure