home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 3_2004-2005.ISO / Data / Zips / XP_Style_B1762706272004.psc / Button.ctl < prev    next >
Text File  |  2004-06-27  |  29KB  |  845 lines

  1. VERSION 5.00
  2. Begin VB.UserControl Button 
  3.    Alignable       =   -1  'True
  4.    AutoRedraw      =   -1  'True
  5.    ClientHeight    =   2400
  6.    ClientLeft      =   0
  7.    ClientTop       =   0
  8.    ClientWidth     =   3945
  9.    ControlContainer=   -1  'True
  10.    DefaultCancel   =   -1  'True
  11.    ForeColor       =   &H8000000C&
  12.    KeyPreview      =   -1  'True
  13.    ScaleHeight     =   160
  14.    ScaleMode       =   3  'Pixel
  15.    ScaleWidth      =   263
  16.    ToolboxBitmap   =   "Button.ctx":0000
  17.    Begin VB.Timer TimerMouseOvrCheck 
  18.       Enabled         =   0   'False
  19.       Interval        =   50
  20.       Left            =   750
  21.       Top             =   135
  22.    End
  23.    Begin VB.Timer Timer1 
  24.       Enabled         =   0   'False
  25.       Interval        =   50
  26.       Left            =   150
  27.       Top             =   120
  28.    End
  29. End
  30. Attribute VB_Name = "Button"
  31. Attribute VB_GlobalNameSpace = False
  32. Attribute VB_Creatable = True
  33. Attribute VB_PredeclaredId = False
  34. Attribute VB_Exposed = False
  35. 'This XP-Style Button can be placed on any background
  36. 'MouseOver and TabStop will be highlighted
  37. 'The color of the button can be adapted to any color during runtime
  38.  
  39. 'Please feel invited to visit my homepage
  40. 'http://home.t-online.de/home/l.kobarg/clk/
  41. 'There you can find a calculator using the XP-Style Button
  42.  
  43. 'if you got any improvements, maybe round, or oval shapes please let me know
  44. 'l.kobarg@t-onlien.de
  45.  
  46. 'Based on Leo Barsukov's cool Totally skinned Calculator********
  47. 'http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=38467&lngWId=1
  48.  
  49. 'and Gez Lemon's transparent tutorials
  50. 'http://www.juicystudio.com/tutorial/vb/winapi.asp
  51.  
  52. 'known issues:
  53. 'during programming the auto-type (auto completion) will not work properly
  54. 'if a form using the XP-Style button is open
  55.  
  56. Option Explicit
  57.  
  58. Private m_lngHeight As Long
  59. Private m_lngWidth As Long
  60. Private m_blnSkinFromRes As Boolean
  61.  
  62. '
  63. ' Index values for the resource file.
  64. '
  65. Public Enum eImages
  66.     eNone = 0       ' No Value.
  67.     eSkin1 = 1      ' Skin Image 1.
  68. End Enum
  69.  
  70.  
  71. '
  72. ' Win32 API-Constants.
  73. '
  74. Private Const RGN_OR = 2
  75.  
  76. '
  77. ' Win32 API-Declarations.
  78. '
  79.  
  80. '*********************************************
  81. 'Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  82. Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
  83. Private Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long
  84. Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
  85. Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Long) As Long
  86.  
  87. Private ButtonLeftPressed As Boolean
  88.  
  89. '*********************************************
  90.  
  91.  
  92.  
  93. 'For drawing the caption
  94. Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
  95. Private Declare Function DrawText Lib "user32" Alias "DrawTextA" (ByVal hdc As Long, ByVal lpStr As String, ByVal nCount As Long, lpRect As RECT, ByVal wFormat As Long) As Long
  96. 'Rect drawing
  97. Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long
  98. Private Declare Function FrameRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long
  99. 'Create/Delete brush
  100. Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
  101. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  102. 'For drawing lines
  103. Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long
  104. Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
  105. 'Misc
  106. Private Declare Function SetPixel Lib "gdi32" Alias "SetPixelV" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long
  107. Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
  108.  
  109. Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
  110.  
  111.  
  112.  
  113. Dim m_CurrPoint As POINTAPI
  114.  
  115.  
  116.  
  117. Dim cColor As Long
  118. 'Center
  119. Private Const DT_CENTERABS = &H65
  120.  
  121. 'Default system colours
  122. Private Const COLOR_BTNFACE = 15
  123. Private Const COLOR_BTNSHADOW = 16
  124. Private Const COLOR_BTNTEXT = 18
  125. Private Const COLOR_BTNHIGHLIGHT = 20
  126. Private Const COLOR_BTNDKSHADOW = 21
  127. Private Const COLOR_BTNLIGHT = 22
  128.  
  129. 'Rectangle
  130. Private Type RECT
  131.         Left As Long
  132.         Top As Long
  133.         Right As Long
  134.         Bottom As Long
  135. End Type
  136.  
  137.  
  138. 'Point
  139. Private Type POINTAPI
  140.         x As Long
  141.         y As Long
  142. End Type
  143.  
  144. 'Events
  145. Public Event Click()
  146. Public Event MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
  147. Public Event MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
  148. Public Event MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
  149. Event MouseOut()
  150.  
  151. Private Height      As Long                 'Width
  152. Private Width       As Long                 'Height
  153.  
  154. Private CurrText    As String               'Current caption
  155. Private CurrFont    As StdFont              'Current font
  156.  
  157. 'Rects structures
  158. Private RC          As RECT
  159. Private RC2         As RECT
  160. Private RC3         As RECT
  161.  
  162. Private LastButton  As Byte                 'Last button pressed
  163. Private isEnabled   As Boolean              'Enabled or not
  164.  
  165. 'Default system colors
  166. Public cFace        As Long
  167. Private cLight      As Long
  168. Private cHighLight  As Long
  169. Private cShadow     As Long
  170. Private cDarkShadow As Long
  171. Private cText       As Long
  172.  
  173. Private lastStat    As Byte                 'Last property
  174. Private TE          As String               'Text
  175. Public MausOvr      As Boolean              'maus ⁿber dem Button
  176. Private FocusFlag As Boolean                'button hat den focus
  177. Private MausOvrDrawn As Boolean             'maus highlight bereits gemalt
  178.  
  179.  
  180. Private Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
  181.  
  182. Dim n As Integer
  183.  
  184. 'Single click
  185. Private Sub UserControl_Click()
  186.         RaiseEvent Click
  187. End Sub
  188.  
  189.  
  190. 'Double click
  191. Private Sub UserControl_DblClick()
  192.     
  193.     If LastButton = 1 Then
  194.         'Call the mousedown sub
  195.         RaiseEvent Click
  196.         'UserControl.Refresh
  197.         UserControl_MouseDown 1, 1, 1, 1
  198.     End If
  199.     
  200. End Sub
  201.  
  202. Public Property Get ForeColor() As OLE_COLOR
  203.     ForeColor = cColor
  204. End Property
  205.  
  206. Public Property Let ForeColor(ByVal New_ForeColor As OLE_COLOR)
  207.     cColor = New_ForeColor
  208.     PropertyChanged "ForeColor"
  209. End Property
  210.  
  211.  
  212. Private Sub UserControl_GotFocus()
  213.     FocusFlag = True
  214.     If Not FocusFlag Then
  215.         Redraw 0, False
  216.     End If
  217. End Sub
  218.  
  219.  
  220. Private Sub UserControl_LostFocus()
  221.     FocusFlag = False
  222.     Redraw 0, False
  223. End Sub
  224.  
  225. 'Initialize
  226. Private Sub UserControl_Initialize()
  227.    
  228.     LastButton = 1   'Lastbutton = right mouse button
  229.     RC2.Left = 2
  230.     RC2.Top = 2
  231.     SetColors        'Get default colors
  232.     TimerMouseOvrCheck.Enabled = True
  233. End Sub
  234.  
  235. 'Initialize properties
  236. Private Sub UserControl_InitProperties()
  237.  
  238.     CurrText = "Caption"                'Caption
  239.     isEnabled = True                    'Enabled
  240.     Set CurrFont = UserControl.Font     'Font
  241.     
  242. End Sub
  243.  
  244.  
  245.  
  246.  
  247. 'Mousedown
  248. Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
  249.     
  250.     If Button = 1 Then ButtonLeftPressed = True
  251.     LastButton = Button     'Set lastbutton
  252.     
  253.     If Button <> 2 Then
  254.         Redraw 2, False     'Redraw button
  255.     End If
  256.     'Raise mousedown event
  257.     RaiseEvent MouseDown(Button, Shift, x, y)
  258.     
  259. End Sub
  260.  
  261.  
  262.  
  263. 'Mouseup
  264. Private Sub UserControl_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
  265.     
  266.     ButtonLeftPressed = False
  267.     If Button <> 2 Then
  268.         Redraw 0, False     'Redraw
  269.     End If
  270.     
  271.     'Raise mousrup event
  272.     RaiseEvent MouseUp(Button, Shift, x, y)
  273.     
  274. End Sub
  275.  
  276.  
  277. 'Property Get: Caption
  278. Public Property Get Caption() As String
  279.     Caption = CurrText      'Return caption
  280. End Property
  281.  
  282.  
  283. 'Property Let: Caption
  284. Public Property Let Caption(ByVal newValue As String)
  285.     CurrText = newValue     'Set caption
  286.     Redraw 0, True          'Redraw
  287.     PropertyChanged "TX"    'Last property changed is text
  288. End Property
  289.  
  290.  
  291. 'Property Get: Enabled
  292. Public Property Get Enabled() As Boolean
  293.     Enabled = isEnabled     'Set enabled/disabled
  294. End Property
  295.  
  296.  
  297. 'Property Let: Enabled
  298. Public Property Let Enabled(ByVal newValue As Boolean)
  299.     isEnabled = newValue            'Set enabled/disabled
  300.     Redraw 0, True                  'Redraw
  301.     UserControl.Enabled = isEnabled 'Set enabled/disabled
  302.     PropertyChanged "ENAB"          'Last property changed is enabled
  303. End Property
  304.  
  305.  
  306. 'Property Get: Font
  307. Public Property Get Font() As Font
  308.     Set Font = CurrFont             'Return font
  309. End Property
  310.  
  311.  
  312. 'Property Set: Font
  313. Public Property Set Font(ByRef newFont As Font)
  314.     Set CurrFont = newFont          'Set font
  315.     Set UserControl.Font = CurrFont 'Set font
  316.     Redraw 0, True                  'Redraw
  317.     PropertyChanged "FONT"          'Last property changed is font
  318. End Property
  319.  
  320.  
  321. 'Property Get: hWnd
  322. Public Property Get hwnd() As Long
  323.     hwnd = UserControl.hwnd         'Return hWnd
  324. End Property
  325.  
  326.  
  327. 'Resize
  328. Private Sub UserControl_Resize()
  329.     
  330.     'Renew dimension variables
  331.     Height = UserControl.ScaleHeight
  332.     Width = UserControl.ScaleWidth
  333.     
  334.     'Set rect1
  335.     RC.Bottom = Height
  336.     RC.Right = Width
  337.     
  338.     'Set rect 2
  339.     RC2.Bottom = Height
  340.     RC2.Right = Width
  341.     
  342.     'Set rect 3
  343.     RC3.Left = 4
  344.     RC3.Top = 4
  345.     RC3.Right = Width - 4
  346.     RC3.Bottom = Height - 4
  347.     
  348.     Redraw 0, True          'Redraw
  349.     
  350. End Sub
  351.  
  352.  
  353. 'Read Properties
  354. Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  355.     cColor = PropBag.ReadProperty("ForeColor", &H80000012)
  356.     CurrText = PropBag.ReadProperty("TX", "")                       'Caption
  357.     isEnabled = PropBag.ReadProperty("ENAB", True)                  'Enabled
  358.     Set CurrFont = PropBag.ReadProperty("FONT", UserControl.Font)   'Font
  359.     
  360.     UserControl.Enabled = isEnabled     'Set enabled state
  361.     Set UserControl.Font = CurrFont     'Set font
  362.     
  363.     SetColors       'Set colours
  364.     Redraw 0, True  'Redraw
  365.     pCreateSkin (True)
  366. End Sub
  367.  
  368.  
  369. 'Write properties
  370. Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
  371. Call PropBag.WriteProperty("ForeColor", cColor, &H80000012)
  372.     PropBag.WriteProperty "TX", CurrText    'Caption
  373.     PropBag.WriteProperty "ENAB", isEnabled 'Enabled state
  374.     PropBag.WriteProperty "FONT", CurrFont  'Font
  375.  
  376. End Sub
  377.  
  378.  
  379. 'Redraw
  380. Private Sub Redraw(ByVal curStat As Byte, ByVal Force As Boolean)
  381.  
  382.   Dim i               As Long
  383.   Dim stepXP1         As Single
  384.   Dim XPface          As Long
  385.  
  386.     'No errors
  387.     If Height = 0 Then Exit Sub
  388.     
  389.     lastStat = curStat  'Set property
  390.     TE = CurrText       'Caption
  391.  
  392.     With UserControl
  393.         .Cls                                        'Clear control
  394.         'DrawRectangle 0, 0, Width, Height, cFace    'Draw button face
  395.         
  396.         If isEnabled = True Then            'If enabled
  397.             SetTextColor .hdc, cText        'Set text colour
  398.             
  399.             'Button is Up ****************************************************
  400.             If curStat = 0 Then             'If button is up
  401.                 
  402.                  'Gradient step
  403.                 stepXP1 = 25 / Height
  404.                 
  405.                 'Shift color
  406.                 XPface = ShiftColor(cFace, &H30)
  407.                 
  408.                 'Draw gradient background
  409.                 For i = 2 To Height - 3
  410.                     DrawLine 0, i, Width, i, ShiftColor(XPface, -stepXP1 * i)
  411.                 Next
  412.                 
  413.                 'Set caption
  414.                 SetTextColor UserControl.hdc, cColor
  415.                 DrawText .hdc, CurrText, Len(CurrText), RC, DT_CENTERABS
  416.                 
  417.                 'Draw outline
  418.                 DrawLine 2, 0, Width - 2, 0, &H733C00                  'upper
  419.                 DrawLine 2, Height - 1, Width - 2, Height - 1, &H733C00 'lower
  420.                 DrawLine 0, 2, 0, Height - 2, &H733C00                 'left
  421.                 DrawLine Width - 1, 2, Width - 1, Height - 2, &H733C00 'right
  422.                 
  423.                 'Draw corners
  424.                 SetPixel UserControl.hdc, 1, 1, &H7B4D10
  425.                 SetPixel UserControl.hdc, 1, Height - 2, &H7B4D10
  426.                 SetPixel UserControl.hdc, Width - 2, 1, &H7B4D10
  427.                 SetPixel UserControl.hdc, Width - 2, Height - 2, &H7B4D10
  428.                 
  429.                 'Draw shadows
  430.                 DrawLine 2, Height - 2, Width - 2, Height - 2, ShiftColor(XPface, -&H30)
  431.                 DrawLine 1, Height - 3, Width - 2, Height - 3, ShiftColor(XPface, -&H20)
  432.                 DrawLine Width - 2, 2, Width - 2, Height - 2, ShiftColor(XPface, -&H24)
  433.                 DrawLine Width - 3, 3, Width - 3, Height - 3, ShiftColor(XPface, -&H18)
  434.                 
  435.                 'Draw highlights
  436.                 DrawLine 2, 1, Width - 2, 1, ShiftColor(XPface, &H10)
  437.                 DrawLine 1, 2, Width - 2, 2, ShiftColor(XPface, &HA)
  438.                 DrawLine 1, 2, 1, Height - 2, ShiftColor(XPface, -&H5)
  439.                 DrawLine 2, 3, 2, Height - 3, ShiftColor(XPface, -&HA)
  440.                 
  441.                 'Mouse over Button ***********************************
  442.                 If MausOvr Then
  443.                     For n = 1 To 1
  444.                         DrawLine n + 1, n, Width - n - 1, n, &H80FF& 'upper
  445.                         DrawLine n + 1, Height - n - 1, Width - n - 1, Height - n - 1, &H80FF& 'lower
  446.                         DrawLine n, n + 1, n, Height - n - 1, &H80FF& 'left
  447.                         DrawLine Width - n - 1, n + 1, Width - n - 1, Height - n - 1, &H80FF& 'right
  448.                     Next n
  449.                     
  450.                     'Draw corners
  451.                     SetPixel UserControl.hdc, 2, 2, &H80FF&          'upper left
  452.                     SetPixel UserControl.hdc, 2, Height - 3, &H80FF& 'lower left
  453.                     SetPixel UserControl.hdc, Width - 3, 2, &H80FF&  'upper right
  454.                     SetPixel UserControl.hdc, Width - 3, Height - 3, &H80FF&   'lower right
  455.                     
  456.                     'MausOvr = False
  457.                 End If
  458.                 
  459.                 'Button got Focus ***********************************
  460.                 If FocusFlag Then
  461.                     For n = 2 To 2
  462.                         DrawLine n + 1, n, Width - n - 1, n, &H8000000C      'upper
  463.                         DrawLine n + 1, Height - n - 1, Width - n - 1, Height - n - 1, &H8000000C  'lower
  464.                         DrawLine n, n + 1, n, Height - n - 1, &H8000000C     'left
  465.                         DrawLine Width - n - 1, n + 1, Width - n - 1, Height - n - 1, &H8000000C   'right
  466.                     Next n
  467.                     
  468.                     'Draw corners
  469.                     'SetPixel UserControl.hDC, 3, 3, &H8000000C           'upper left
  470.                     'SetPixel UserControl.hDC, 3, Height - 4, &H8000000C  'lower left
  471.                     'SetPixel UserControl.hDC, Width - 4, 3, &H8000000C   'upper right
  472.                     'SetPixel UserControl.hDC, Width - 4, Height - 4, &H8000000C'lower right
  473.                     'MausOvr = False
  474.                 End If
  475.             
  476.             'Button is Down ****************************************************
  477.             ElseIf curStat = 2 Then     'Button is down
  478.                 
  479.                 'Set gradient step
  480.                 stepXP1 = 15 / Height
  481.                 
  482.                 'Shift color
  483.                 XPface = ShiftColor(cFace, &H30)
  484.                 XPface = ShiftColor(XPface, -32)
  485.                 
  486.                 'Draw gradient background
  487.                 For i = 3 To Height - 3
  488.                     DrawLine 0, Height - i, Width, Height - i, ShiftColor(XPface, -stepXP1 * i)
  489.                 Next i
  490.                          
  491.                 'Draw caption
  492.                 SetTextColor .hdc, cColor
  493.                 DrawText .hdc, CurrText, Len(CurrText), RC2, DT_CENTERABS
  494.                 
  495.                 'Draw outline
  496.                 DrawLine 2, 0, Width - 2, 0, &H733C00                  'upper
  497.                 DrawLine 2, Height - 1, Width - 2, Height - 1, &H733C00 'lower
  498.                 DrawLine 0, 2, 0, Height - 2, &H733C00                 'left
  499.                 DrawLine Width - 1, 2, Width - 1, Height - 2, &H733C00 'right
  500.                 
  501.                 'Draw corners
  502.                 SetPixel UserControl.hdc, 1, 1, &H7B4D10
  503.                 SetPixel UserControl.hdc, 1, Height - 2, &H7B4D10
  504.                 SetPixel UserControl.hdc, Width - 2, 1, &H7B4D10
  505.                 SetPixel UserControl.hdc, Width - 2, Height - 2, &H7B4D10
  506.                 
  507.                 'Draw shadows
  508.                 DrawLine 2, Height - 2, Width - 2, Height - 2, ShiftColor(XPface, &H10)
  509.                 DrawLine 1, Height - 3, Width - 2, Height - 3, ShiftColor(XPface, &HA)
  510.                 DrawLine Width - 2, 2, Width - 2, Height - 2, ShiftColor(XPface, &H5)
  511.                 DrawLine Width - 3, 3, Width - 3, Height - 3, XPface
  512.                 
  513.                 'Draw highlights
  514.                 DrawLine 2, 1, Width - 2, 1, ShiftColor(XPface, -&H20)
  515.                 DrawLine 1, 2, Width - 2, 2, ShiftColor(XPface, -&H18)
  516.                 DrawLine 1, 2, 1, Height - 2, ShiftColor(XPface, -&H20)
  517.                 DrawLine 2, 2, 2, Height - 2, ShiftColor(XPface, -&H16)
  518.             
  519.                 'Mouse is over Button ***************************************************
  520.                 If MausOvr Then
  521.                     For n = 1 To 1
  522.                         DrawLine n + 1, n, Width - n - 1, n, &H80FF& 'upper
  523.                         DrawLine n + 1, Height - n - 1, Width - n - 1, Height - n - 1, &H80FF& 'lower
  524.                         DrawLine n, n + 1, n, Height - n - 1, &H80FF& 'left
  525.                         DrawLine Width - n - 1, n + 1, Width - n - 1, Height - n - 1, &H80FF& 'right
  526.                     Next n
  527.                     
  528.                     'Draw corners
  529.                     SetPixel UserControl.hdc, 2, 2, &H80FF&          'upper left
  530.                     SetPixel UserControl.hdc, 2, Height - 3, &H80FF& 'lower left
  531.                     SetPixel UserControl.hdc, Width - 3, 2, &H80FF&  'upper right
  532.                     SetPixel UserControl.hdc, Width - 3, Height - 3, &H80FF& 'lower right
  533.                     
  534.                     'MausOvr = False
  535.                 End If
  536.                 
  537.                 'Button got Focus
  538.                 If FocusFlag Then
  539.                     For n = 2 To 2
  540.                         DrawLine n + 1, n, Width - n - 1, n, &H8000000C      'oben
  541.                         DrawLine n + 1, Height - n - 1, Width - n - 1, Height - n - 1, &H8000000C 'unten
  542.                         DrawLine n, n + 1, n, Height - n - 1, &H8000000C         'links
  543.                         DrawLine Width - n - 1, n + 1, Width - n - 1, Height - n - 1, &H8000000C 'rechts
  544.                     Next n
  545.                     
  546.                     'Draw corners
  547.                     'SetPixel UserControl.hDC, 3, 3, &H8000000C           'upper left
  548.                     'SetPixel UserControl.hDC, 3, Height - 4, &H8000000C  'lower left
  549.                     'SetPixel UserControl.hDC, Width - 4, 3, &H8000000C   'upper right
  550.                     'SetPixel UserControl.hDC, Width - 4, Height - 4, &H8000000C'lower right
  551.                     'MausOvr = False
  552.                 End If
  553.             
  554.             End If
  555.             
  556.         'Button is Disabled *********************************************
  557.         Else    'Disabled state
  558.             
  559.             'Shift color
  560.             XPface = ShiftColor(cFace, &H30)
  561.             'Draw button face
  562.             DrawRectangle 0, 0, Width, Height, ShiftColor(XPface, -&H18)
  563.             'Caption
  564.             SetTextColor .hdc, ShiftColor(XPface, -&H68)
  565.             DrawText .hdc, CurrText, Len(CurrText), RC, DT_CENTERABS
  566.             'Draw outline
  567.             DrawLine 0, 0, Width, 0, ShiftColor(XPface, -&H54)
  568.             DrawLine 1, Height - 1, Width, Height - 1, ShiftColor(XPface, -&H54)
  569.             DrawLine 0, 1, 0, Height, ShiftColor(XPface, -&H54)
  570.             DrawLine Width - 1, 1, Width - 1, Height - 1, ShiftColor(XPface, -&H54)
  571.             'Draw corners
  572.             'SetPixel UserControl.hDC, 1, 1, ShiftColor(XPface, -&H48)
  573.             'SetPixel UserControl.hDC, 1, Height - 2, ShiftColor(XPface, -&H48)
  574.             'SetPixel UserControl.hDC, Width - 2, 1, ShiftColor(XPface, -&H48)
  575.             'SetPixel UserControl.hDC, Width - 2, Height - 2, ShiftColor(XPface, -&H48)
  576.         End If
  577.     End With
  578.     
  579. End Sub
  580.  
  581.  
  582. 'Draw rectangle
  583. Private Sub DrawRectangle(ByVal x As Long, ByVal y As Long, ByVal Width As Long, ByVal Height As Long, ByVal Color As Long, Optional OnlyBorder As Boolean = False)
  584.  
  585.   Dim bRect As RECT
  586.   Dim hBrush As Long
  587.   Dim Ret As Long
  588.     
  589.     'Fill out rect
  590.     bRect.Left = x
  591.     bRect.Top = y
  592.     bRect.Right = x + Width
  593.     bRect.Bottom = y + Height
  594.     
  595.     'Create brush
  596.     hBrush = CreateSolidBrush(Color)
  597.     
  598.     If OnlyBorder = False Then  'Just border
  599.         Ret = FillRect(UserControl.hdc, bRect, hBrush)
  600.     Else    'Fill whole rect
  601.         Ret = FrameRect(UserControl.hdc, bRect, hBrush)
  602.     End If
  603.     
  604.     'Delete brush
  605.     Ret = DeleteObject(hBrush)
  606.     
  607. End Sub
  608.  
  609.  
  610. 'Draw line
  611. Private Sub DrawLine(ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal Color As Long)
  612.  
  613.   Dim pt As POINTAPI
  614.  
  615.     UserControl.ForeColor = Color           'Set forecolor
  616.     MoveToEx UserControl.hdc, X1, Y1, pt    'Move to X1/Y1
  617.     LineTo UserControl.hdc, X2, Y2          'Draw line to X2/Y2
  618.     
  619. End Sub
  620.  
  621.  
  622. 'Set Colours
  623. Private Sub SetColors()
  624.     
  625.     'Get system colours and save into variables
  626.     cFace = RGB(200, 200, 255)
  627.     'cFace = RGB(100, 100, 255)
  628.     
  629.     '####################################
  630.     '# cFace = GetSysColor(COLOR_BTNFACE)
  631.     '####################################
  632.     
  633.     cShadow = GetSysColor(COLOR_BTNSHADOW)
  634.     cLight = GetSysColor(COLOR_BTNLIGHT)
  635.     cDarkShadow = GetSysColor(COLOR_BTNDKSHADOW)
  636.     cHighLight = GetSysColor(COLOR_BTNHIGHLIGHT)
  637.     cText = GetSysColor(COLOR_BTNTEXT)
  638.     
  639. End Sub
  640.  
  641.  
  642. 'Shift colors
  643. Private Function ShiftColor(ByVal Color As Long, ByVal value As Long) As Long
  644.  
  645.   Dim Red As Long, Blue As Long, Green As Long
  646.     
  647.     'Shift blue
  648.     Blue = ((Color \ &H10000) Mod &H100)
  649.     Blue = Blue + ((Blue * value) \ &HC0)
  650.     'Shift green
  651.     Green = ((Color \ &H100) Mod &H100) + value
  652.     'Shift red
  653.     Red = (Color And &HFF) + value
  654.     
  655.     'Check red bounds
  656.     If Red < 0 Then
  657.         Red = 0
  658.     ElseIf Red > 255 Then
  659.         Red = 255
  660.     End If
  661.     'Check green bounds
  662.     If Green < 0 Then
  663.         Green = 0
  664.     ElseIf Green > 255 Then
  665.         Green = 255
  666.     End If
  667.     'Check blue bounds
  668.     If Blue < 0 Then
  669.         Blue = 0
  670.     ElseIf Blue > 255 Then
  671.         Blue = 255
  672.     End If
  673.     
  674.     'Return color
  675.     ShiftColor = RGB(Red, Green, Blue)
  676.   
  677. End Function
  678.  
  679. Private Sub Timer1_Timer()
  680.   GetCursorPos m_CurrPoint
  681.   ScreenToClient hwnd, m_CurrPoint
  682.   MausOvrDrawn = False
  683.     'if the mouse has left the button, reset everything....
  684.  
  685.     'Call UserControl_MouseMove(Button, Shift, X, Y)
  686.     'Call Image1_MouseMove(Button, Shift, X, Y)
  687.   If m_CurrPoint.x < UserControl.ScaleLeft Or _
  688.      m_CurrPoint.y < UserControl.ScaleTop Or _
  689.      m_CurrPoint.x > UserControl.ScaleLeft + UserControl.Width / 15 Or _
  690.      m_CurrPoint.y > UserControl.ScaleTop + UserControl.Height / 15 Then
  691.       
  692.        Timer1.Enabled = False
  693.        'Raise the mouse leave event....
  694.        MausOvr = False
  695.        Redraw 0, False
  696.        RaiseEvent MouseOut
  697.        
  698.        TimerMouseOvrCheck.Enabled = True
  699.   End If
  700. End Sub
  701.  
  702. Private Sub TimerMouseOvrCheck_Timer()
  703.     GetCursorPos m_CurrPoint
  704.     ScreenToClient hwnd, m_CurrPoint
  705.     'if the mouse has left the button, reset everything....
  706.  
  707.     'Call UserControl_MouseMove(Button, Shift, X, Y)
  708.     'Call Image1_MouseMove(Button, Shift, X, Y)
  709.     If Not (m_CurrPoint.x < UserControl.ScaleLeft Or _
  710.         m_CurrPoint.y < UserControl.ScaleTop Or _
  711.         m_CurrPoint.x > UserControl.ScaleLeft + UserControl.Width / 15 Or _
  712.         m_CurrPoint.y > UserControl.ScaleTop + UserControl.Height / 15) Then
  713.  
  714.             TimerMouseOvrCheck.Enabled = False
  715.             MausOvr = True
  716.                       
  717.             'Redraw 0, False
  718.             If ButtonLeftPressed = True Then      'Right click
  719.                 Redraw 2, False     'Redraw Button pressed
  720.             Else
  721.                 If Not MausOvrDrawn Then
  722.                     Redraw 0, False     'Redraw Button up
  723.                 End If
  724.             End If
  725.        
  726.             MausOvrDrawn = True
  727.             Timer1.Enabled = True
  728.             
  729.             'Raise mousemove event
  730.             'RaiseEvent MouseMove(Button, Shift, X, Y)
  731.             
  732.     End If
  733. End Sub
  734.  
  735.  
  736. Public Sub Refesh()
  737.     Redraw 0, False
  738. End Sub
  739.  
  740. 'Skin Part **********************************************
  741. '
  742. ' The optional last parameter allows you to specify the image's background color. If left blank, the
  743. ' color of the image's top left pixel is used.
  744. '
  745. Public Function fRegionFromBitmap(picSource As Picture, Optional lngBackColor As Long) As Long
  746.     Dim lngReturn As Long
  747.     Dim lngRgnTmp As Long
  748.     Dim lngSkinRgn As Long
  749.     Dim lngStart As Long
  750.     Dim lngRow As Long
  751.     Dim lngCol As Long
  752.     '
  753.     ' Create a rectangular region.
  754.     ' A region is a rectangle, polygon, or ellipse (or a combination of two or more of these shapes)
  755.     ' that can be filled, painted, inverted, framed, and used to perform hit testing (testing for
  756.     ' the cursor location).
  757.     '
  758.     lngSkinRgn = CreateRectRgn(0, 0, 0, 0)
  759.     
  760.     With UserControl
  761.         '
  762.         ' Get the dimensions of the bitmap.
  763.         '
  764.         m_lngHeight = .Height / Screen.TwipsPerPixelY
  765.         m_lngWidth = .Width / Screen.TwipsPerPixelX
  766.         '
  767.         ' If no background color is passed in, get the red, green, blue (RGB) color value of the top
  768.         ' left pixel in the picturebox's device context (DC).
  769.         '
  770.         If lngBackColor < 1 Then lngBackColor = GetPixel(UserControl.hdc, 0, 0)
  771.         '
  772.         ' Loop through the bitmap, row by row, examining each pixel.
  773.         ' In each row, work from left to right comparing each pixel to the background color.
  774.         '
  775.         For lngRow = 0 To m_lngHeight - 1
  776.             lngCol = 0
  777.             Do While lngCol < m_lngWidth
  778.                 '
  779.                 ' Skip all pixels in a row with the same color as the background color.
  780.                 '
  781.                 Do While lngCol < m_lngWidth And GetPixel(.hdc, lngCol, lngRow) = lngBackColor
  782.                     lngCol = lngCol + 1
  783.                 Loop
  784.                 
  785.                 If lngCol < m_lngWidth Then
  786.                     '
  787.                     ' Get the start and end of the block of pixels in the row that are not the same
  788.                     ' color as the background.
  789.                     '
  790.                     lngStart = lngCol
  791.                     Do While lngCol < m_lngWidth And GetPixel(.hdc, lngCol, lngRow) <> lngBackColor
  792.                         lngCol = lngCol + 1
  793.                     Loop
  794.                     If lngCol > m_lngWidth Then lngCol = m_lngWidth
  795.                     '
  796.                     ' Create a region equal in size to the line of pixels that don't match the
  797.                     ' background color. Combine this region with our final region.
  798.                     '
  799.                     lngRgnTmp = CreateRectRgn(lngStart, lngRow, lngCol, lngRow + 1)
  800.                     lngReturn = CombineRgn(lngSkinRgn, lngSkinRgn, lngRgnTmp, RGN_OR)
  801.                     Call DeleteObject(lngRgnTmp)
  802.                 End If
  803.             Loop
  804.         Next lngRow
  805.     End With
  806.    
  807.     fRegionFromBitmap = lngSkinRgn
  808. End Function
  809.  
  810. Public Sub pCreateSkin(blnFromRes As Boolean)
  811.     Dim lngRegion As Long
  812.     
  813.     'Screen.MousePointer = vbHourglass
  814.     
  815.    
  816.         
  817.         ' Based on the picture, create a region for Windows to use for our PictureBox and tell
  818.         ' Windows not to paint anything outside this region.
  819.         '
  820.         lngRegion = fRegionFromBitmap(UserControl.Picture)
  821.         Call SetWindowRgn(UserControl.hwnd, lngRegion, True)
  822.         '.picSkin.Picture = LoadPicture("")
  823.    
  824.     
  825.     'Screen.MousePointer = vbDefault
  826. End Sub
  827.  
  828. '***********************************************************
  829.  
  830.  
  831.  
  832.  
  833.  
  834.  
  835.  
  836.  
  837.  
  838.  
  839.  
  840. '
  841.  
  842.  
  843.  
  844.  
  845.