Attribute VB_Name = "PaintSup" Option Explicit '----------------------------------------------------------------- Public Function ShrinkBmp(dispHdc As Long, hBmp As Long, RatioX As Single, RatioY As Single) As Long '----------------------------------------------------------------- Dim hBmpOut As Long ' output bitmap handle Dim bm1 As BITMAP, bm2 As BITMAP ' temporary bitmap structs Dim hdcMem1 As Long, hdcMem2 As Long ' temporary memory bitmap handles... '----------------------------------------------------------------- hdcMem1 = CreateCompatibleDC(dispHdc) ' create mem DC compatible to the display DC hdcMem2 = CreateCompatibleDC(dispHdc) ' create mem DC compatible to the display DC GetObject hBmp, LenB(bm1), bm1 ' select bitmap object LSet bm2 = bm1 ' copy bitmap object bm2.bmWidth = CLng(bm2.bmWidth * RatioX) ' scale output bitmap width bm2.bmHeight = CLng(bm2.bmHeight * RatioY) ' scale output bitmap height bm2.bmWidthBytes = ((((bm2.bmWidth * bm2.bmBitsPixel) + 15) \ 16) * 2) ' calculate bitmap width bytes hBmpOut = CreateBitmapIndirect(bm2) ' create handle to output bitmap indirectly from new bm2 SelectObject hdcMem1, hBmp ' select original bitmap into mem dc SelectObject hdcMem2, hBmpOut ' select new bitmap into mem dc ' stretch old bitmap into new bitmap StretchBlt hdcMem2, 0, 0, bm2.bmWidth, bm2.bmHeight, _ hdcMem1, 0, 0, bm1.bmWidth, bm1.bmHeight, vbSrcCopy DeleteDC hdcMem1 ' delete memory dc DeleteDC hdcMem2 ' delete memory dc ShrinkBmp = hBmpOut ' return handle to new bitmap '----------------------------------------------------------------- End Function '----------------------------------------------------------------- '----------------------------------------------------------------- Public Sub InitDeskDC(OutHdc As Long, OutBmp As BITMAP, DispRec As RECT) '----------------------------------------------------------------- Dim DskHwnd As Long ' hWnd of desktop Dim DskRect As RECT ' rect size of desktop Dim DskHdc As Long ' hdc of desktop Dim hOutBmp As Long ' handle to output bitmap Dim rc As Long ' function return code '----------------------------------------------------------------- DskHwnd = GetDesktopWindow() ' Get src - HWND of Desktop DskHdc = GetWindowDC(DskHwnd) ' Get src HDC - Handle to device context rc = GetWindowRect(DskHwnd, DskRect) ' Get src Rectangle dimentions With DispRec ' Create handle to compatible output bitmap hOutBmp = CreateCompatibleBitmap(DskHdc, (.Right - .Left + 1), (.Bottom - .Top + 1)) rc = GetObject(hOutBmp, Len(OutBmp), OutBmp) ' Get handle to bitmap OutHdc = CreateCompatibleDC(DskHdc) ' Create compatible hdc rc = SelectObject(OutHdc, hOutBmp) ' copy bitmap structure into output dc rc = StretchBlt(OutHdc, 0, 0, _ (.Right - .Left + 1), _ (.Bottom - .Top + 1), _ DskHdc, 0, 0, _ (DskRect.Right - DskRect.Left + 1), _ (DskRect.Bottom - DskRect.Top + 1), _ vbSrcCopy) ' Paint bitmap desk dc to output dc End With rc = DeleteObject(hOutBmp) ' delete handle to output bitmap rc = ReleaseDC(DskHwnd, DskHdc) ' Clean up - Release src HDC '----------------------------------------------------------------- End Sub '----------------------------------------------------------------- '----------------------------------------------------------------- Public Sub PaintDeskDC(InHdc As Long, InBmp As BITMAP, OutHwnd As Long) '----------------------------------------------------------------- Dim OutRect As RECT ' rect. size of output window Dim OutHdc As Long ' hdc of output window Dim rc As Long ' function return code '----------------------------------------------------------------- rc = GetClientRect(OutHwnd, OutRect) ' Get Dest Rectangle dimentions OutHdc = GetWindowDC(OutHwnd) ' get Dest HDC With OutRect ' Paint the desktop picture to the output window... rc = StretchBlt(OutHdc, 0, 0, _ (.Right - .Left + 1), _ (.Bottom - .Top + 1), _ InHdc, 0, 0, _ InBmp.bmWidth, InBmp.bmHeight, vbSrcCopy) End With rc = ReleaseDC(OutHwnd, OutHdc) ' Clean up - Release src HDC '----------------------------------------------------------------- End Sub '----------------------------------------------------------------- '----------------------------------------------------------------- Public Sub DelDeskDC(OutHdc As Long) '----------------------------------------------------------------- Dim rc As Long '----------------------------------------------------------------- rc = DeleteDC(OutHdc) ' Clean up - Release src HDC '----------------------------------------------------------------- End Sub '----------------------------------------------------------------- '----------------------------------------------------------------- Public Sub DrawTransparentBitmap(lHDCDest As Long, _ lBmSource As Long, _ lMaskColor As Long, _ Optional lDestStartX As Long, _ Optional lDestStartY As Long, _ Optional lDestWidth As Long, _ Optional lDestHeight As Long, _ Optional lSrcStartX As Long, _ Optional lSrcStartY As Long, _ Optional BkGrndHdc As Long) '----------------------------------------------------------------- Dim udtBitMap As BITMAP Dim lColorRef As Long 'COLORREF Dim lBmAndBack As Long 'HBITMAP Dim lBmAndObject As Long Dim lBmAndMem As Long Dim lBmSave As Long Dim lBmBackOld As Long Dim lBmObjectOld As Long Dim lBmMemOld As Long Dim lBmSaveOld As Long Dim lHDCMem As Long 'HDC Dim lHDCBack As Long Dim lHDCObject As Long Dim lHDCTemp As Long Dim lHDCSave As Long Dim udtSize As POINTAPI 'POINT Dim x As Long, y As Long '----------------------------------------------------------------- lHDCTemp = CreateCompatibleDC(lHDCDest) 'Create a temporary HDC compatible to the Destination HDC SelectObject lHDCTemp, lBmSource 'Select the bitmap GetObject lBmSource, Len(udtBitMap), udtBitMap With udtSize .x = udtBitMap.bmWidth 'Get width of bitmap .y = udtBitMap.bmHeight 'Get height of bitmap 'Use passed width and height parameters If lDestWidth <> 0 Then .x = lDestWidth If lDestHeight <> 0 Then .y = lDestHeight x = .x y = .y End With 'Create some DCs to hold temporary data lHDCBack = CreateCompatibleDC(lHDCDest) lHDCObject = CreateCompatibleDC(lHDCDest) lHDCMem = CreateCompatibleDC(lHDCDest) lHDCSave = CreateCompatibleDC(lHDCDest) 'Create a bitmap for each DC. DCs are required for 'a number of GDI functions 'Monochrome DC lBmAndBack = CreateBitmap(x, y, 1&, 1&, 0&) 'Monochrome DC lBmAndObject = CreateBitmap(x, y, 1&, 1&, 0&) 'Compatible DC's lBmAndMem = CreateCompatibleBitmap(lHDCDest, x, y) lBmSave = CreateCompatibleBitmap(lHDCDest, x, y) 'Each DC must select a bitmap object to store pixel data. lBmBackOld = SelectObject(lHDCBack, lBmAndBack) lBmObjectOld = SelectObject(lHDCObject, lBmAndObject) lBmMemOld = SelectObject(lHDCMem, lBmAndMem) lBmSaveOld = SelectObject(lHDCSave, lBmSave) 'Set proper mapping mode. SetMapMode lHDCTemp, GetMapMode(lHDCDest) 'Save the bitmap sent here, because it will be overwritten BitBlt lHDCSave, 0&, 0&, x, y, lHDCTemp, lSrcStartX, lSrcStartY, vbSrcCopy 'Set the background color of the source DC to the color 'contained in the parts of the bitmap that should be transparent lColorRef = SetBkColor(lHDCTemp, lMaskColor) 'Create the object mask for the bitmap by performaing a BitBlt 'from the source bitmap to a monochrome bitmap. BitBlt lHDCObject, 0&, 0&, x, y, lHDCTemp, lSrcStartX, lSrcStartY, vbSrcCopy 'Set the background color of the source DC back to the original color SetBkColor lHDCTemp, lColorRef 'Create the inverse of the object mask. BitBlt lHDCBack, 0&, 0&, x, y, lHDCObject, 0&, 0&, vbNotSrcCopy 'Copy the background of the main DC to the destination If (BkGrndHdc <> 0) Then BitBlt lHDCMem, 0&, 0&, x, y, BkGrndHdc, lDestStartX, lDestStartY, vbSrcCopy Else BitBlt lHDCMem, 0&, 0&, x, y, lHDCDest, lDestStartX, lDestStartY, vbSrcCopy End If 'Mask out the places where the bitmap will be placed BitBlt lHDCMem, 0&, 0&, x, y, lHDCObject, 0&, 0&, vbSrcAnd 'Mask out the transparent colored pixels on the bitmap BitBlt lHDCTemp, lSrcStartX, lSrcStartY, x, y, lHDCBack, 0&, 0&, vbSrcAnd 'XOR the bitmap with the background on the destination DC BitBlt lHDCMem, 0&, 0&, x, y, lHDCTemp, lSrcStartX, lSrcStartY, vbSrcPaint 'Copy the destination to the screen BitBlt lHDCDest, lDestStartX, lDestStartY, x, y, lHDCMem, 0&, 0&, vbSrcCopy 'Place the original bitmap back into the bitmap sent here BitBlt lHDCTemp, lSrcStartX, lSrcStartY, x, y, lHDCSave, 0&, 0&, vbSrcCopy 'Delete memory bitmaps DeleteObject SelectObject(lHDCBack, lBmBackOld) DeleteObject SelectObject(lHDCObject, lBmObjectOld) DeleteObject SelectObject(lHDCMem, lBmMemOld) DeleteObject SelectObject(lHDCSave, lBmSaveOld) 'Delete memory DC's DeleteDC lHDCMem DeleteDC lHDCBack DeleteDC lHDCObject DeleteDC lHDCSave DeleteDC lHDCTemp '----------------------------------------------------------------- End Sub '-----------------------------------------------------------------