home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 7_2009-2012.ISO / data / zips / Remote_Des21926411122010.psc / RemoteDesktop / class / cdibSection.cls next >
Text File  |  2010-11-12  |  18KB  |  533 lines

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "cdibSection"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = False
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. '<CSCC>
  15. '--------------------------------------------------------------------------------
  16. '    Component  : cdibSection
  17. '    Project    : NetRemote
  18. '    Author     : B2qid www.labsoft.web.id
  19. '    Description: {ParamList}
  20. '
  21. '    Modified   : 11/12/2010 2:52:18 PM
  22. '--------------------------------------------------------------------------------
  23. '</CSCC>
  24. Option Explicit
  25.  
  26. Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
  27.     lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
  28.  
  29. Private Type SAFEARRAYBOUND
  30.     cElements As Long
  31.     lLbound As Long
  32. End Type
  33. Private Type SAFEARRAY2D
  34.     cDims As Integer
  35.     fFeatures As Integer
  36.     cbElements As Long
  37.     cLocks As Long
  38.     pvData As Long
  39.     Bounds(0 To 1) As SAFEARRAYBOUND
  40. End Type
  41. Private Declare Function VarPtrArray Lib "msvbvm60.dll" Alias "VarPtr" (Ptr() As Any) As Long
  42.  
  43. Private Type RGBQUAD
  44.     rgbBlue As Byte
  45.     rgbGreen As Byte
  46.     rgbRed As Byte
  47.     rgbReserved As Byte
  48. End Type
  49. Private Type BITMAPINFOHEADER '40 bytes
  50.     biSize As Long
  51.     biWidth As Long
  52.     biHeight As Long
  53.     biPlanes As Integer
  54.     biBitCount As Integer
  55.     biCompression As Long
  56.     biSizeImage As Long
  57.     biXPelsPerMeter As Long
  58.     biYPelsPerMeter As Long
  59.     biClrUsed As Long
  60.     biClrImportant As Long
  61. End Type
  62. Private Type BITMAPINFO
  63.     bmiHeader As BITMAPINFOHEADER
  64.     bmiColors As RGBQUAD
  65. End Type
  66. Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
  67. Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
  68. Private Declare Function GetDesktopWindow Lib "user32" () As Long
  69. ' Note - this is not the declare in the API viewer - modify lplpVoid to be
  70. ' Byref so we get the pointer back:
  71. Private Declare Function CreateDIBSection Lib "gdi32" _
  72.     (ByVal hdc As Long, _
  73.     pBitmapInfo As BITMAPINFO, _
  74.     ByVal un As Long, _
  75.     lplpVoid As Long, _
  76.     ByVal Handle As Long, _
  77.     ByVal dw As Long) As Long
  78. Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
  79.  
  80.  Private Const HALFTONE As Long = 4
  81.  Private Declare Function StretchBlt Lib "gdi32" (ByVal hdc As Long, _
  82.  ByVal x As Long, _
  83.  ByVal y As Long, _
  84.  ByVal nWidth As Long, _
  85.  ByVal nHeight As Long, _
  86.  ByVal hSrcDC As Long, _
  87.  ByVal xSrc As Long, _
  88.  ByVal ySrc As Long, _
  89.  ByVal nSrcWidth As Long, _
  90.  ByVal nSrcHeight As Long, _
  91.  ByVal dwRop As Long) As Long
  92.  
  93.  
  94. Private Declare Function SetStretchBltMode Lib "gdi32" (ByVal hdc As Long, _
  95. ByVal nStretchMode As Long) As Long
  96.  
  97. Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
  98. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  99. Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
  100. Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
  101. Private Declare Function LoadImage Lib "user32" Alias "LoadImageA" (ByVal hInst As Long, ByVal lpsz As String, ByVal un1 As Long, ByVal n1 As Long, ByVal n2 As Long, ByVal un2 As Long) As Long
  102. Private Const BI_RGB = 0&
  103. Private Const BI_RLE4 = 2&
  104. Private Const BI_RLE8 = 1&
  105. Private Const DIB_RGB_COLORS = 0 '  color table in RGBs
  106.  
  107. Private Type BITMAP
  108.     bmType As Long
  109.     bmWidth As Long
  110.     bmHeight As Long
  111.     bmWidthBytes As Long
  112.     bmPlanes As Integer
  113.     bmBitsPixel As Integer
  114.     bmBits As Long
  115. End Type
  116. Private Declare Function GetObjectAPI Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long
  117. Private Declare Function timeGetTime Lib "winmm.dll" () As Long
  118. Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
  119.  
  120. ' Clipboard functions:
  121. Private Declare Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As Long
  122. Private Declare Function CloseClipboard Lib "user32" () As Long
  123. Private Declare Function SetClipboardData Lib "user32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
  124. Private Declare Function EmptyClipboard Lib "user32" () As Long
  125. Private Const CF_BITMAP = 2
  126. Private Const CF_DIB = 8
  127.  
  128. ' Handle to the current DIBSection:
  129. Private m_hDIb As Long
  130. ' Handle to the old bitmap in the DC, for clear up:
  131. Private m_hBmpOld As Long
  132. ' Handle to the Device context holding the DIBSection:
  133. Private m_hDC As Long
  134. ' Address of memory pointing to the DIBSection's bits:
  135. Private m_lPtr As Long
  136. ' Type containing the Bitmap information:
  137. Private m_tBI As BITMAPINFO
  138.  
  139. Public Function CopyToClipboard( _
  140.         Optional ByVal bAsDIB As Boolean = True _
  141.     ) As Boolean
  142. Dim lhDCDesktop As Long
  143. Dim lhDC As Long
  144. Dim lhBmpOld As Long
  145. Dim hObj As Long
  146. Dim lFmt As Long
  147. Dim b() As Byte
  148. Dim tBI As BITMAPINFO
  149. Dim lPtr As Long
  150. Dim hDibCopy As Long
  151.  
  152.     lhDCDesktop = GetDC(GetDesktopWindow())
  153.     If (lhDCDesktop <> 0) Then
  154.         lhDC = CreateCompatibleDC(lhDCDesktop)
  155.         If (lhDC <> 0) Then
  156.             If (bAsDIB) Then
  157.                MsgBox "I don't know how to put a DIB on the clipboard! Copy as bitmap instead!!!"
  158.                 ' Create a duplicate DIBSection and copy
  159.                 ' to the clipboard:
  160.                 'LSet tBI = m_tBI
  161.                 'hDibCopy = CreateDIBSection( _
  162.                 '        lhDC, _
  163.                 '        m_tBI, _
  164.                 '        DIB_RGB_COLORS, _
  165.                 '        lPtr, _
  166.                 '        0, 0)
  167.                 'If (hDibCopy <> 0) Then
  168.                 '    lhBmpOld = SelectObject(lhDC, hObj)
  169.                 '    BitBlt lhDC, 0, 0, Width, Height, m_hDC, 0, 0, vbSrcCopy
  170.                 '    SelectObject lhDC, lhBmpOld
  171.                 '    lFmt = CF_DIB
  172.                 '
  173.                 '     '....
  174.                                     
  175.                 'Else
  176.                 '    hObj = 0
  177.                 'End If
  178.             Else
  179.                 ' Create a compatible bitmap and copy to
  180.                 ' the clipboard:
  181.                 hObj = CreateCompatibleBitmap(lhDCDesktop, Width, Height)
  182.                 If (hObj <> 0) Then
  183.                     lhBmpOld = SelectObject(lhDC, hObj)
  184.                     PaintPicture lhDC
  185.                     SelectObject lhDC, lhBmpOld
  186.                     lFmt = CF_BITMAP
  187.                     ' Now set the clipboard to the bitmap:
  188.                     If (OpenClipboard(0) <> 0) Then
  189.                         EmptyClipboard
  190.                         If (SetClipboardData(lFmt, hObj) <> 0) Then
  191.                             CopyToClipboard = True
  192.                         End If
  193.                         CloseClipboard
  194.                     End If
  195.                 End If
  196.             End If
  197.             DeleteDC lhDC
  198.         End If
  199.         DeleteDC lhDCDesktop
  200.     End If
  201. End Function
  202.  
  203. Public Function CreateDIB( _
  204.         ByVal lhDC As Long, _
  205.         ByVal lWidth As Long, _
  206.         ByVal lHeight As Long, _
  207.         ByRef hDib As Long _
  208.     ) As Boolean
  209.     With m_tBI.bmiHeader
  210.         .biSize = Len(m_tBI.bmiHeader)
  211.         .biWidth = lWidth
  212.         .biHeight = lHeight
  213.         .biPlanes = 1
  214.         .biBitCount = 24
  215.         .biCompression = BI_RGB
  216.         .biSizeImage = BytesPerScanLine * .biHeight
  217.     End With
  218.     hDib = CreateDIBSection( _
  219.             lhDC, _
  220.             m_tBI, _
  221.             DIB_RGB_COLORS, _
  222.             m_lPtr, _
  223.             0, 0)
  224.     CreateDIB = (hDib <> 0)
  225. End Function
  226. Public Function CreateFromPicture( _
  227.         ByRef picThis As StdPicture _
  228.     )
  229. Dim lhDC As Long
  230. Dim lhDCDesktop As Long
  231. Dim lhBmpOld As Long
  232. Dim tBMP As BITMAP
  233. Dim lhWnd As Long
  234.     On Error GoTo errme
  235.     GetObjectAPI picThis.Handle, Len(tBMP), tBMP
  236.     If (Create(tBMP.bmWidth, tBMP.bmHeight)) Then
  237.         lhWnd = GetDesktopWindow()
  238.         lhDCDesktop = GetDC(lhWnd)
  239.         If (lhDCDesktop <> 0) Then
  240.             lhDC = CreateCompatibleDC(lhDCDesktop)
  241.             ReleaseDC lhWnd, lhDCDesktop
  242.             If (lhDC <> 0) Then
  243.                 lhBmpOld = SelectObject(lhDC, picThis.Handle)
  244.                 LoadPictureBlt lhDC
  245.                 SelectObject lhDC, lhBmpOld
  246.                 DeleteDC lhDC
  247.             End If
  248.         End If
  249.     End If
  250. errme:
  251. End Function
  252. Public Function Create( _
  253.         ByVal lWidth As Long, _
  254.         ByVal lHeight As Long _
  255.     ) As Boolean
  256.     ClearUp
  257.     m_hDC = CreateCompatibleDC(0)
  258.     If (m_hDC <> 0) Then
  259.         If (CreateDIB(m_hDC, lWidth, lHeight, m_hDIb)) Then
  260.             m_hBmpOld = SelectObject(m_hDC, m_hDIb)
  261.             Create = True
  262.         Else
  263.             DeleteDC m_hDC
  264.             m_hDC = 0
  265.         End If
  266.     End If
  267. End Function
  268. Public Property Get BytesPerScanLine() As Long
  269.     ' Scans must align on dword boundaries:
  270.     BytesPerScanLine = (m_tBI.bmiHeader.biWidth * 3 + 3) And &HFFFFFFFC
  271. End Property
  272.  
  273. Public Property Get Width() As Long
  274.     Width = m_tBI.bmiHeader.biWidth
  275. End Property
  276. Public Property Get Height() As Long
  277.     Height = m_tBI.bmiHeader.biHeight
  278. End Property
  279.  
  280. Public Sub LoadPictureBlt( _
  281.         ByVal lhDC As Long, _
  282.         Optional ByVal lSrcLeft As Long = 0, _
  283.         Optional ByVal lSrcTop As Long = 0, _
  284.         Optional ByVal lSrcWidth As Long = -1, _
  285.         Optional ByVal lSrcHeight As Long = -1, _
  286.         Optional ByVal eRop As RasterOpConstants = vbSrcCopy _
  287.     )
  288.     If lSrcWidth < 0 Then lSrcWidth = m_tBI.bmiHeader.biWidth
  289.     If lSrcHeight < 0 Then lSrcHeight = m_tBI.bmiHeader.biHeight
  290.     BitBlt m_hDC, 0, 0, lSrcWidth, lSrcHeight, lhDC, lSrcLeft, lSrcTop, eRop
  291. End Sub
  292.  
  293.  
  294. Public Sub PaintPicture( _
  295.         ByVal lhDC As Long, _
  296.         Optional ByVal lDestLeft As Long = 0, _
  297.         Optional ByVal lDestTop As Long = 0, _
  298.         Optional ByVal lDestWidth As Long = -1, _
  299.         Optional ByVal lDestHeight As Long = -1, _
  300.         Optional ByVal lSrcLeft As Long = 0, _
  301.         Optional ByVal lSrcTop As Long = 0, _
  302.         Optional ByVal eRop As RasterOpConstants = vbSrcCopy _
  303.     )
  304.     If (lDestWidth < 0) Then lDestWidth = m_tBI.bmiHeader.biWidth
  305.     If (lDestHeight < 0) Then lDestHeight = m_tBI.bmiHeader.biHeight
  306.     
  307.     SetStretchBltMode lhDC, HALFTONE
  308.     StretchBlt lhDC, lDestLeft, lDestTop, lDestWidth, lDestHeight, m_hDC, 0, 0, _
  309.     Me.Width, Me.Height, vbSrcCopy
  310.     
  311.     'BitBlt lhDC, lDestLeft, lDestTop, lDestWidth, lDestHeight, m_hDC, lSrcLeft, lSrcTop, eRop
  312. End Sub
  313.  
  314.  
  315. Public Sub PaintPicture2( _
  316.         ByVal lhDC As Long, _
  317.         Optional ByVal lDestLeft As Long = 0, _
  318.         Optional ByVal lDestTop As Long = 0, _
  319.         Optional ByVal lDestWidth As Long = -1, _
  320.         Optional ByVal lDestHeight As Long = -1, _
  321.         Optional ByVal lSrcLeft As Long = 0, _
  322.         Optional ByVal lSrcTop As Long = 0, _
  323.         Optional ByVal eRop As RasterOpConstants = vbSrcCopy _
  324.     )
  325.     If (lDestWidth < 0) Then lDestWidth = m_tBI.bmiHeader.biWidth
  326.     If (lDestHeight < 0) Then lDestHeight = m_tBI.bmiHeader.biHeight
  327.     
  328.     'SetStretchBltMode lhDC, HALFTONE
  329.     'StretchBlt lhDC, lDestLeft, lDestTop, lDestWidth, lDestHeight, m_hDC, 0, 0, _
  330.     'Me.Width, Me.Height, vbSrcCopy
  331.     
  332.     BitBlt lhDC, lDestLeft, lDestTop, lDestWidth, lDestHeight, m_hDC, lSrcLeft, lSrcTop, eRop
  333. End Sub
  334.  
  335.  
  336. Public Property Get hdc() As Long
  337.     hdc = m_hDC
  338. End Property
  339. Public Property Get hDib() As Long
  340.     hDib = m_hDIb
  341. End Property
  342. Public Property Get DIBSectionBitsPtr() As Long
  343.     DIBSectionBitsPtr = m_lPtr
  344. End Property
  345. Public Sub RandomiseBits( _
  346.         Optional ByVal bGray As Boolean = False _
  347.     )
  348. Dim bDib() As Byte
  349. Dim x As Long, y As Long
  350. Dim lC As Long
  351. Dim tSA As SAFEARRAY2D
  352. Dim xEnd As Long
  353.     
  354.     ' Get the bits in the from DIB section:
  355.     With tSA
  356.         .cbElements = 1
  357.         .cDims = 2
  358.         .Bounds(0).lLbound = 0
  359.         .Bounds(0).cElements = m_tBI.bmiHeader.biHeight
  360.         .Bounds(1).lLbound = 0
  361.         .Bounds(1).cElements = BytesPerScanLine()
  362.         .pvData = m_lPtr
  363.     End With
  364.     CopyMemory ByVal VarPtrArray(bDib()), VarPtr(tSA), 4
  365.  
  366.     ' random:
  367.     Randomize Timer
  368.     
  369.     xEnd = (Width - 1) * 3
  370.     If (bGray) Then
  371.         For y = 0 To m_tBI.bmiHeader.biHeight - 1
  372.             For x = 0 To xEnd Step 3
  373.                 lC = Rnd * 255
  374.                 bDib(x, y) = lC
  375.                 bDib(x + 1, y) = lC
  376.                 bDib(x + 2, y) = lC
  377.             Next x
  378.         Next y
  379.     Else
  380.         For x = 0 To xEnd Step 3
  381.             For y = 0 To m_tBI.bmiHeader.biHeight - 1
  382.                 bDib(x, y) = 0
  383.                 bDib(x + 1, y) = Rnd * 255
  384.                 bDib(x + 2, y) = Rnd * 255
  385.             Next y
  386.         Next x
  387.     End If
  388.     
  389.     ' Clear the temporary array descriptor
  390.     ' (This does not appear to be necessary, but
  391.     ' for safety do it anyway)
  392.     CopyMemory ByVal VarPtrArray(bDib), 0&, 4
  393.     
  394. End Sub
  395.  
  396. Public Sub ClearUp()
  397.     If (m_hDC <> 0) Then
  398.         If (m_hDIb <> 0) Then
  399.             SelectObject m_hDC, m_hBmpOld
  400.             DeleteObject m_hDIb
  401.         End If
  402.         DeleteDC m_hDC
  403.     End If
  404.     m_hDC = 0: m_hDIb = 0: m_hBmpOld = 0: m_lPtr = 0
  405. End Sub
  406.  
  407. Public Function Resample( _
  408.         ByVal lNewHeight As Long, _
  409.         ByVal lNewWidth As Long _
  410.     ) As cdibSection
  411. Dim cDib As cdibSection
  412.     Set cDib = New cdibSection
  413.     If cDib.Create(lNewWidth, lNewHeight) Then
  414.         If (lNewWidth <> m_tBI.bmiHeader.biWidth) Or (lNewHeight <> m_tBI.bmiHeader.biHeight) Then
  415.             ' Change in size, do resample:
  416.             ResampleDib cDib
  417.         Else
  418.             ' No size change so just return a copy:
  419.             cDib.LoadPictureBlt m_hDC
  420.         End If
  421.         Set Resample = cDib
  422.     End If
  423. End Function
  424.  
  425. Private Function ResampleDib(ByRef cDibTo As cdibSection) As Boolean
  426. Dim bDibFrom() As Byte
  427. Dim bDibTo() As Byte
  428.  
  429. Dim tSAFrom As SAFEARRAY2D
  430. Dim tSATo As SAFEARRAY2D
  431.  
  432.     ' Get the bits in the from DIB section:
  433.     With tSAFrom
  434.         .cbElements = 1
  435.         .cDims = 2
  436.         .Bounds(0).lLbound = 0
  437.         .Bounds(0).cElements = m_tBI.bmiHeader.biHeight
  438.         .Bounds(1).lLbound = 0
  439.         .Bounds(1).cElements = BytesPerScanLine()
  440.         .pvData = m_lPtr
  441.     End With
  442.     CopyMemory ByVal VarPtrArray(bDibFrom()), VarPtr(tSAFrom), 4
  443.  
  444.     ' Get the bits in the to DIB section:
  445.     With tSATo
  446.         .cbElements = 1
  447.         .cDims = 2
  448.         .Bounds(0).lLbound = 0
  449.         .Bounds(0).cElements = cDibTo.Height
  450.         .Bounds(1).lLbound = 0
  451.         .Bounds(1).cElements = cDibTo.BytesPerScanLine()
  452.         .pvData = cDibTo.DIBSectionBitsPtr
  453.     End With
  454.     CopyMemory ByVal VarPtrArray(bDibTo()), VarPtr(tSATo), 4
  455.  
  456. Dim xScale As Single
  457. Dim yScale As Single
  458.  
  459. Dim x As Long, y As Long, xEnd As Long, xOut As Long
  460.  
  461. Dim fX As Single, fY As Single
  462. Dim ifY As Long, ifX As Long
  463. Dim dX As Single, dy As Single
  464. Dim r As Long, r1 As Single, r2 As Single, r3 As Single, r4 As Single
  465. Dim g As Long, g1 As Single, g2 As Single, g3 As Single, g4 As Single
  466. Dim b As Long, b1 As Single, b2 As Single, b3 As Single, b4 As Single
  467. Dim ir1 As Long, ig1 As Long, ib1 As Long
  468. Dim ir2 As Long, ig2 As Long, ib2 As Long
  469.  
  470.     xScale = (Width - 1) / cDibTo.Width
  471.     yScale = (Height - 1) / cDibTo.Height
  472.     
  473.     xEnd = cDibTo.Width - 1
  474.         
  475.     For y = 0 To cDibTo.Height - 1
  476.         
  477.         fY = y * yScale
  478.         ifY = Int(fY)
  479.         dy = fY - ifY
  480.         
  481.         For x = 0 To xEnd
  482.             fX = x * xScale
  483.             ifX = Int(fX)
  484.             dX = fX - ifX
  485.             
  486.             ifX = ifX * 3
  487.             ' Interpolate using the four nearest pixels in the source
  488.             b1 = bDibFrom(ifX, ifY): g1 = bDibFrom(ifX + 1, ifY): r1 = bDibFrom(ifX + 2, ifY)
  489.             b2 = bDibFrom(ifX + 3, ifY): g2 = bDibFrom(ifX + 4, ifY): r2 = bDibFrom(ifX + 5, ifY)
  490.             b3 = bDibFrom(ifX, ifY + 1): g3 = bDibFrom(ifX + 1, ifY + 1): r3 = bDibFrom(ifX + 2, ifY + 1)
  491.             b4 = bDibFrom(ifX + 3, ifY + 1): g4 = bDibFrom(ifX + 4, ifY + 1): r4 = bDibFrom(ifX + 5, ifY + 1)
  492.             
  493.             ' Interplate in x direction:
  494.             ir1 = r1 * (1 - dy) + r3 * dy: ig1 = g1 * (1 - dy) + g3 * dy: ib1 = b1 * (1 - dy) + b3 * dy
  495.             ir2 = r2 * (1 - dy) + r4 * dy: ig2 = g2 * (1 - dy) + g4 * dy: ib2 = b2 * (1 - dy) + b4 * dy
  496.             ' Interpolate in y:
  497.             r = ir1 * (1 - dX) + ir2 * dX: g = ig1 * (1 - dX) + ig2 * dX: b = ib1 * (1 - dX) + ib2 * dX
  498.             
  499.             ' Set output:
  500.             If (r < 0) Then r = 0
  501.             If (r > 255) Then r = 255
  502.             If (g < 0) Then g = 0
  503.             If (g > 255) Then g = 255
  504.             If (b < 0) Then b = 0
  505.             If (b > 255) Then
  506.                 b = 255
  507.             End If
  508.             xOut = x * 3
  509.             bDibTo(xOut, y) = b
  510.             bDibTo(xOut + 1, y) = g
  511.             bDibTo(xOut + 2, y) = r
  512.             
  513.         Next x
  514.         
  515.     Next y
  516.  
  517.     ' Clear the temporary array descriptor
  518.     ' (This does not appear to be necessary, but
  519.     ' for safety do it anyway)
  520.     CopyMemory ByVal VarPtrArray(bDibFrom), 0&, 4
  521.     CopyMemory ByVal VarPtrArray(bDibTo), 0&, 4
  522.  
  523.  
  524. End Function
  525.  
  526. Private Sub Class_Terminate()
  527.     ClearUp
  528. End Sub
  529.  
  530.  
  531.  
  532.  
  533.