| 
 | 
|  |   |  | |
|  |  |  | |
|  |  | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|  | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 
 | ||
| Visual Basic 
       Window/Form Routines GradientFill: Triangular Gradient Form Backgrounds | ||
| Posted: | Monday February 17, 2003 | |
| Updated: | Monday December 26, 2011 | |
| Applies to: | VB4-32, VB5, VB6 | |
| Developed with: | VB6, Windows XP | |
| OS restrictions: | Windows 98 or later, Windows 2000 or later | |
| Author: | VBnet - Randy Birch | |
| Related: | FillRect: Gradient Form Backgrounds GradientFill: Gradient Form Backgrounds GradientFill: Triangular Gradient Form Backgrounds Pure VB: Tile an Image as a Form Background | |
| Prerequisites | 
| None. | 
|  | 
|  I 
       certainly can't pretend to know why this works; its based on a C demo in 
       the MSDN. While the TRIVERTEX structure is straightforward enough, I 
       don't have sufficient experience with GDI to truly understand the ins and 
       outs of the GRADIENT_TRIANGLE structure and its Vertex members. Suffice 
       to say, playing around with different values for the various setting may 
       provide you with a strong indication of what's going on under the hood. As coded, the demo creates the form coloured as shown. The Red, Green, Blue and Alpha members of the TRIVERTEX structure are defined in the C header files as USHORT, or in VB parlance, Integers. Concerning the TRIVERTEX structure, the MSDN states: 
 For the GRADIENT_TRIANGLE structure, the MSDN text is: 
 While this demos the code against a form background which may have its place in something like a custom splash screen, a better use for this code would be to fill a picture box being used as a colour-picking tool. | 
| BAS Module Code | 
| None. | 
|  | 
| Form Code | 
|   | 
| Add the following code to a form: | 
|  | 
| Option Explicit '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Copyright ©1996-2011 VBnet/Randy Birch, All Rights Reserved. ' Some pages may also contain other copyrights by the author. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ' Distribution: You can freely use this code in your own ' applications, but you may not reproduce ' or publish this code on any web site, ' online service, or distribute as source ' on any media without express permission. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' Private Const GRADIENT_FILL_TRIANGLE = &H2
Private Type TRIVERTEX
   X As Long
   Y As Long
   Red As Integer
   Green As Integer
   Blue As Integer
   Alpha As Integer
End Type
Private Type GRADIENT_TRIANGLE
   Vertex1 As Long
   Vertex2 As Long
   Vertex3 As Long
End Type
   
Private Declare Function GradientFill Lib "msimg32" _
  (ByVal hdc As Long, _
   pVertex As Any, _
   ByVal dwNumVertex As Long, _
   pMesh As Any, _
   ByVal dwNumMesh As Long, _
   ByVal dwMode As Long) As Long
Private Sub Form_Load()
   Me.AutoRedraw = True
   
End Sub
Private Sub Form_Resize()
   Call DrawGradientFillTriangle(vbBlue, vbYellow, vbRed, vbBlack)
End Sub
Private Sub DrawGradientFillTriangle(dwColour1 As Long, _
                                     dwColour2 As Long, _
                                     dwColour3 As Long, _
                                     dwColour4 As Long)
    
   Dim grTri(0 To 1) As GRADIENT_TRIANGLE
   Dim vert(0 To 3) As TRIVERTEX
   
  'Colour at upper-left corner
   With vert(0)
      .X = 0
      .Y = 0
      .Red = LongToSignedShort(CLng((dwColour1 And &HFF&) * 256))
      .Green = LongToSignedShort(CLng(((dwColour1 And &HFF00&) \ &H100&) * 256))
      .Blue = LongToSignedShort(CLng(((dwColour1 And &HFF0000) \ &H10000) * 256))
      .Alpha = 0
   End With
   
  'Colour at upper-right corner
   With vert(1)
      .X = Me.ScaleWidth \ Screen.TwipsPerPixelX
      .Y = 0
      .Red = LongToSignedShort(CLng((dwColour2 And &HFF&) * 256))
      .Green = LongToSignedShort(CLng(((dwColour2 And &HFF00&) \ &H100&) * 256))
      .Blue = LongToSignedShort(CLng(((dwColour2 And &HFF0000) \ &H10000) * 256))
      .Alpha = 0
   End With
  'Colour at lower-right corner
   With vert(2)
      .X = Me.ScaleWidth \ Screen.TwipsPerPixelX
      .Y = Me.ScaleHeight \ Screen.TwipsPerPixelY
      .Red = LongToSignedShort(CLng((dwColour3 And &HFF&) * 256))
      .Green = LongToSignedShort(CLng(((dwColour3 And &HFF00&) \ &H100&) * 256))
      .Blue = LongToSignedShort(CLng(((dwColour3 And &HFF0000) \ &H10000) * 256))
      .Alpha = 0
   End With
      
  'Colour at lower-left corner
   With vert(3)
      .X = 0
      .Y = Me.ScaleHeight \ Screen.TwipsPerPixelX
      .Red = LongToSignedShort(CLng((dwColour4 And &HFF&) * 256))
      .Green = LongToSignedShort(CLng(((dwColour4 And &HFF00&) \ &H100&) * 256))
      .Blue = LongToSignedShort(CLng(((dwColour4 And &HFF0000) \ &H10000) * 256))
      .Alpha = 0
   End With
   
   With grTri(0)
      .Vertex1 = 0
      .Vertex2 = 1
      .Vertex3 = 2
   End With
   
   With grTri(1)
      .Vertex1 = 0
      .Vertex2 = 2
      .Vertex3 = 3
   End With
         
   Me.Cls
   
  'parameters:
  'hdc - display context handle of the target window
  'vert(0) - first member of interest in the vert() array
  '4 - number of vert() array members (not ubound(vert))
  'grTri(0) - first member of interest in the grTri() array
  '2 - number of grTri() array members (not ubound(grTri)
  'GRADIENT_FILL_TRIANGLE - fill operation
   Call GradientFill(Me.hdc, vert(0), 4, grTri(0), 2, GRADIENT_FILL_TRIANGLE)
End Sub
Private Function LongToSignedShort(dwUnsigned As Long) As Integer
    
  'convert from long to signed short
   If dwUnsigned < 32768 Then
      LongToSignedShort = CInt(dwUnsigned)
   Else
      LongToSignedShort = CInt(dwUnsigned - &H10000)
   End If
    
End Function | 
| Comments | 
|  | 
| 
 | 
|  | |||||
| 
 | |||||
|  | |||||
| 
            	
            	Copyright ©1996-2011 VBnet and Randy Birch. All Rights Reserved. | 
|  |