home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 3_2004-2005.ISO / Data / Zips / Desktop_In1726743312004.psc / Gradient.cls < prev   
Text File  |  2003-12-23  |  9KB  |  243 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 = "clsGradient"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
  15. Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
  16. Option Explicit
  17.  
  18. 'Property Storage Variables
  19. Private mlColor1    As Long
  20. Private mlColor2    As Long
  21. Private mfAngle     As Single
  22. Private mPicHDC As Long
  23. Private mPicHWND As Long
  24.  
  25. 'Property Default Constants - Colors and Angle match Kath-Rock logo.
  26. Private Const mlDefColor1   As Long = &HFFFFD0  'Very Light Blue
  27. Private Const mlDefColor2   As Long = &H400000  'Very Dark Blue
  28. Private Const mfDefAngle    As Single = 315     'Upper-Left to Lower-Right
  29.  
  30. 'Misc Constants
  31. Private Const PI    As Double = 3.14159265358979
  32. Private Const RADS  As Double = PI / 180    '<Degrees> * RADS = radians
  33.  
  34. 'TypeDefs
  35. Private Type PointSng   'Internal Point structure
  36.     X   As Single       'Uses Singles for more precision.
  37.     Y   As Single
  38. End Type
  39.  
  40. Private Type PointAPI   'API Point structure
  41.     X   As Long
  42.     Y   As Long
  43. End Type
  44.  
  45. Private Type RectAPI    'API Rect structure
  46.     Left    As Long
  47.     Top     As Long
  48.     Right   As Long
  49.     Bottom  As Long
  50. End Type
  51.  
  52. 'API functions and Constants
  53. Private Const PS_SOLID As Long = 0  'Solid Pen Style (Used for CreatePen())
  54. Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
  55. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  56. Private Declare Function GetClientRect Lib "user32" (ByVal hWnd As Long, lpRect As RectAPI) As Long
  57. Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
  58. Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
  59. Private Declare Function GetTickCount Lib "kernel32" () As Long
  60. Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
  61. Private Declare Function LockWindowUpdate Lib "user32" (ByVal hWndLock As Long) As Long
  62. Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, lpPoint As PointAPI) As Long
  63. Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
  64.  
  65. Public Function Draw(uRight As Long, uBottom As Long) As Boolean
  66.  
  67. 'Note: This class uses API functions to draw. If the
  68. '      destination object is in AutoRedraw mode, the
  69. '      Refresh method for that object must be invoked.
  70.  
  71. 'picObj can be a Form or PictureBox.
  72.  
  73. Dim lRet    As Long
  74. Dim lIdx    As Long
  75. Dim lTime   As Long
  76. Dim uRect   As RectAPI
  77.  
  78. '    lTime = GetTickCount()
  79.     
  80.     On Error GoTo LocalError
  81.     
  82.     'Stop the window from updating until we're finished.
  83.     lRet = LockWindowUpdate(mPicHWND)
  84.     
  85.     lRet = GetClientRect(mPicHWND, uRect)
  86.     
  87.     'Test for possible errors (GetClientRect failure or Rect < 2 pixels)
  88.     If lRet <> 0 Then
  89.         If uRect.Right > 1 And uRect.Bottom > 1 Then
  90.             lIdx = DrawGradient(mPicHDC, uRight, uBottom)
  91.             Draw = (lIdx > 0)
  92.         End If
  93.     End If
  94.     
  95.     'My P3-500 took 99 millisecs (.099 secs) to create and draw 2554 diagonal
  96.     'lines at 315 degrees. That was frmDemo maximized on a 1280 x 1024 screen.
  97.     'At this speed I can redraw an entire 1280px. screen over 10 times per second.
  98.     
  99.     'Same size rect at a 0 degree angle took 48 millisecs (.048 secs) to create and
  100.     'draw 1278 lines. This speed can redraw a 1280px. screen 20 times per second.
  101.     
  102.     'Uncomment the two lines below and the lTime line at the top
  103.     'of this function to test the times on your PC.
  104.     
  105. '    lTime = GetTickCount() - lTime
  106. '    MsgBox CStr(lIdx / 2) & " lines drawn in " & CStr(lTime) & " milliseconds"
  107.         
  108. NormalExit:
  109.     'Unlock the window to allow it to update now.
  110.     lRet = LockWindowUpdate(0)
  111.     Exit Function
  112.     
  113. LocalError:
  114.     MsgBox Err.Description, vbExclamation
  115.     Resume NormalExit
  116.  
  117. End Function
  118. Public Function BlendColors(ByVal lColor1 As Long, ByVal lColor2 As Long, ByVal lSteps As Long, laRetColors() As Long) As Long
  119.  
  120. 'Creates an array of colors blending from
  121. 'Color1 to Color2 in lSteps number of steps.
  122. 'Returns the count and fills the laRetColors() array.
  123.  
  124. Dim lIdx    As Long
  125. Dim lRed    As Long
  126. Dim lGrn    As Long
  127. Dim lBlu    As Long
  128. Dim fRedStp As Single
  129. Dim fGrnStp As Single
  130. Dim fBluStp As Single
  131.  
  132.     'Stop possible error
  133.     If lSteps < 2 Then lSteps = 2
  134.     
  135.     'Extract Red, Blue and Green values from the start and end colors.
  136.     lRed = (lColor1 And &HFF&)
  137.     lGrn = (lColor1 And &HFF00&) / &H100
  138.     lBlu = (lColor1 And &HFF0000) / &H10000
  139.     
  140.     'Find the amount of change for each color element per color change.
  141.     fRedStp = Div(CSng((lColor2 And &HFF&) - lRed), CSng(lSteps))
  142.     fGrnStp = Div(CSng(((lColor2 And &HFF00&) / &H100&) - lGrn), CSng(lSteps))
  143.     fBluStp = Div(CSng(((lColor2 And &HFF0000) / &H10000) - lBlu), CSng(lSteps))
  144.     
  145.     'Create the colors
  146.     ReDim laRetColors(lSteps - 1)
  147.     laRetColors(0) = lColor1            'First Color
  148.     laRetColors(lSteps - 1) = lColor2   'Last Color
  149.     For lIdx = 1 To lSteps - 2          'All Colors between
  150.         laRetColors(lIdx) = CLng(lRed + (fRedStp * CSng(lIdx))) + _
  151.             (CLng(lGrn + (fGrnStp * CSng(lIdx))) * &H100&) + _
  152.             (CLng(lBlu + (fBluStp * CSng(lIdx))) * &H10000)
  153.     Next lIdx
  154.     
  155.     'Return number of colors in array
  156.     BlendColors = lSteps
  157.  
  158. End Function
  159. Private Function DrawGradient(ByVal hdc As Long, ByVal lWidth As Long, ByVal lHeight As Long) As Long
  160.  
  161. Dim bDone       As Boolean
  162. Dim iIncX       As Integer
  163. Dim iIncY       As Integer
  164. Dim lIdx        As Long
  165. Dim lRet        As Long
  166. Dim hPen        As Long
  167. Dim hOldPen     As Long
  168. Dim lPointCnt   As Long
  169. Dim laColors()  As Long
  170. Dim fMovX       As Single
  171. Dim fMovY       As Single
  172. Dim fDist       As Single
  173. Dim fAngle      As Single
  174. Dim fLongSide   As Single
  175. Dim uTmpPt      As PointAPI
  176. Dim uaPts()     As PointAPI
  177. Dim uaTmpPts()  As PointSng
  178.     
  179.     On Error GoTo LocalError
  180.     
  181.     'Start with center of rect
  182.     ReDim uaTmpPts(2)
  183.     uaTmpPts(2).X = Int(lWidth / 2)
  184.     uaTmpPts(2).Y = Int(lHeight / 2)
  185.     
  186.     'Calc distance to furthest edge as if rect were square
  187.     fLongSide = IIf(lWidth > lHeight, lWidth, lHeight)
  188.     fDist = (Sqr((fLongSide ^ 2) + (fLongSide ^ 2)) + 2) / 2
  189.     
  190.     'Create points to the left and the right at a 0║ angle (horizontal)
  191.     uaTmpPts(0).X = uaTmpPts(2).X - fDist
  192.     uaTmpPts(0).Y = uaTmpPts(2).Y
  193.     uaTmpPts(1).X = uaTmpPts(2).X + fDist
  194.     uaTmpPts(1).Y = uaTmpPts(2).Y
  195.     
  196.     'Lines will be drawn perpendicular to mfAngle so
  197.     'add 90║ and correct for 360║ wrap
  198.     fAngle = CDbl(mfAngle + 90) - Int(Int(CDbl(mfAngle + 90) / 360#) * 360#)
  199.     
  200.     'Rotate second and third points to fAngle
  201.     Call RotatePoint(uaTmpPts(2), uaTmpPts(0), fAngle)
  202.     Call RotatePoint(uaTmpPts(2), uaTmpPts(1), fAngle)
  203.     
  204.     'We now have a line that crosses the center and
  205.     'two sides of the rect at the correct angle.
  206.     
  207.     'Calc the starting quadrant, direction of and amount of first move
  208.     '(fMovX, fMovY moves line from center to starting edge)
  209.     'and direction of each incremental move (iIncX, iIncY).
  210.     Select Case mfAngle
  211.         Case 0 To 90
  212.             'Left Bottom
  213.             If Abs(uaTmpPts(0).X - uaTmpPts(1).X) <= Abs(uaTmpPts(0).Y - uaTmpPts(1).Y) Then
  214.                 'Move line to left edge; Draw left to right
  215.                 fMovX = IIf(uaTmpPts(0).X > uaTmpPts(1).X, -uaTmpPts(0).X, -uaTmpPts(1).X)
  216.                 fMovY = 0
  217.                 iIncX = 1
  218.                 iIncY = 0
  219.             Else
  220.                 'Move line to bottom edge; Draw bottom to top
  221.                 fMovX = 0
  222.                 fMovY = IIf(uaTmpPts(0).Y > uaTmpPts(1).Y, lHeight - uaTmpPts(1).Y(cfresh method for that object must be invoked.
  223. ib rawGramode, the
  224. '      
  225.   0
  226.                 r      >G'   b in  (      2  r      >G'c b inSD'Y.Cqtn r hTTTTTTTTTDb inSDCC= (e
  227. ' 1t"
  228. Ae - 1)
  229.      Colorosr that objm
  230.    2dintAPI
  231. Dim uiH10000) - lBlu), CS
  232. Dile           LefDecla
  233. Dile     1i> uaTmpPeodefDelu), CS
  234. DiaEim uiH + 90) / Leeu), CS
  235. DiaEim uiebon Draw(uc), CS
  236. DiaX = 0
  237.                 fMovY = IIf(uaTmpPts(0).Y > uaTmpPts(1).Y, lHeight - uaTmpPts(1).Y(cfresh method for that object must be invoked.
  238. ib rawGramode, the
  239. '      
  240.   0
  241.                 r      >G'   b in  (      2  r      >G'c b oa20)   Call RotatePoint(uaTmpPt Cai'   bY =Point(uaTmpPt Cai'   bYYYYYYYYYuaTmpPt Cai'   bYYYYYYYYYuaTmpPt Cai'   bYYYYYYYYYereTTTTTTTD'   bYY =a.os;iiBRet        s 2  r 5-,W = 0=a.os;
  242.     fLongSide = IIf(Pts(ore Fuos;reen.
  243. iPts(1-m