HoverButton.ctl
上传用户:hx800c
上传日期:2020-12-02
资源大小:792k
文件大小:17k
源码类别:

编辑框

开发平台:

Visual Basic

  1. VERSION 5.00
  2. Begin VB.UserControl HoverControl 
  3.    ClientHeight    =   600
  4.    ClientLeft      =   0
  5.    ClientTop       =   0
  6.    ClientWidth     =   2145
  7.    ScaleHeight     =   40
  8.    ScaleMode       =   3  'Pixel
  9.    ScaleWidth      =   143
  10. End
  11. Attribute VB_Name = "HoverControl"
  12. Attribute VB_GlobalNameSpace = False
  13. Attribute VB_Creatable = True
  14. Attribute VB_PredeclaredId = False
  15. Attribute VB_Exposed = False
  16.  'Project:       Hover button control
  17. 'Description:   A flat button like simple button with hovering effect
  18. '               which uses differnet Win32 api for effects
  19. 'Author:        Muhammad Saleem Mirza
  20. 'Email:         saleem_mirza@yahoo.com
  21. '               For more information and questions, please feel free to contact me
  22. '               at saleem_mirza@yahoo.com
  23. '               I will welcome your sugestions
  24. '''''''''''''''''''''''''''''''
  25. '
  26. '
  27. Option Explicit
  28. Dim m_Caption As String
  29. Dim m_SingleLine As Boolean
  30. Dim m_Image As Picture
  31. 'Event Declarations:
  32. Event Click() 'MappingInfo=UserControl,UserControl,-1,Click
  33. Attribute Click.VB_Description = "Occurs when the user presses and then releases a mouse button over an object."
  34. Event DblClick() 'MappingInfo=UserControl,UserControl,-1,DblClick
  35. Attribute DblClick.VB_Description = "Occurs when the user presses and releases a mouse button and then presses and releases it again over an object."
  36. Event KeyDown(KeyCode As Integer, Shift As Integer) 'MappingInfo=UserControl,UserControl,-1,KeyDown
  37. Attribute KeyDown.VB_Description = "Occurs when the user presses a key while an object has the focus."
  38. Event KeyPress(KeyAscii As Integer) 'MappingInfo=UserControl,UserControl,-1,KeyPress
  39. Attribute KeyPress.VB_Description = "Occurs when the user presses and releases an ANSI key."
  40. Event KeyUp(KeyCode As Integer, Shift As Integer) 'MappingInfo=UserControl,UserControl,-1,KeyUp
  41. Attribute KeyUp.VB_Description = "Occurs when the user releases a key while an object has the focus."
  42. Event MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) 'MappingInfo=UserControl,UserControl,-1,MouseDown
  43. Attribute MouseDown.VB_Description = "Occurs when the user presses the mouse button while an object has the focus."
  44. Event MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single) 'MappingInfo=UserControl,UserControl,-1,MouseMove
  45. Attribute MouseMove.VB_Description = "Occurs when the user moves the mouse."
  46. Event MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single) 'MappingInfo=UserControl,UserControl,-1,MouseUp
  47. Attribute MouseUp.VB_Description = "Occurs when the user releases the mouse button while an object has the focus."
  48. Event MouseEnter(Button As Integer, Shift As Integer, x As Single, y As Single) 'MappingInfo=UserControl,UserControl,-1,MouseUp
  49. Event MouseOut(Button As Integer, Shift As Integer, x As Single, y As Single) 'MappingInfo=UserControl,UserControl,-1,MouseUp
  50. Private HiColor As OLE_COLOR
  51. Private ShadowColor As OLE_COLOR
  52. Private IsButtonPressed As Boolean
  53. Private rcText As RECT
  54. 'Default Property Values:
  55. Const m_def_Caption = "Hover Button"
  56. Const m_def_SingleLine = True
  57. Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
  58. Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long
  59. 'LHJ
  60. Private m_bFlat As Boolean
  61. Private Const P2P_COLOR_HLIGHT = &HFFFFFF
  62. Private Const P2P_COLOR_SHADOW = &HFF8080
  63. Private m_nDrawWidth  As Integer
  64. 'Private m_HightColor As Long
  65. 'Private m_ShadowColor As Long
  66. Public m_bStrech As Boolean
  67. 'WARNING! DO NOT REMOVE OR MODIFY THE FOLLOWING COMMENTED LINES!
  68. 'MappingInfo=UserControl,UserControl,-1,BackColor
  69. Public Property Get BackColor() As OLE_COLOR
  70. Attribute BackColor.VB_Description = "Returns/sets the background color used to display text and graphics in an object."
  71.     BackColor = UserControl.BackColor
  72. End Property
  73. Public Property Let BackColor(ByVal New_BackColor As OLE_COLOR)
  74.     UserControl.BackColor() = New_BackColor
  75.     PropertyChanged "BackColor"
  76.     Refresh
  77. End Property
  78. 'WARNING! DO NOT REMOVE OR MODIFY THE FOLLOWING COMMENTED LINES!
  79. 'MappingInfo=UserControl,UserControl,-1,ForeColor
  80. Public Property Get ForeColor() As OLE_COLOR
  81. Attribute ForeColor.VB_Description = "Returns/sets the foreground color used to display text and graphics in an object."
  82.     ForeColor = UserControl.ForeColor
  83. End Property
  84. Public Property Let ForeColor(ByVal New_ForeColor As OLE_COLOR)
  85.     UserControl.ForeColor() = New_ForeColor
  86.     PropertyChanged "ForeColor"
  87.     Refresh
  88. End Property
  89. 'WARNING! DO NOT REMOVE OR MODIFY THE FOLLOWING COMMENTED LINES!
  90. 'MappingInfo=UserControl,UserControl,-1,Enabled
  91. Public Property Get Enabled() As Boolean
  92. Attribute Enabled.VB_Description = "Returns/sets a value that determines whether an object can respond to user-generated events."
  93.     Enabled = UserControl.Enabled
  94. End Property
  95. Public Property Let Enabled(ByVal New_Enabled As Boolean)
  96.     UserControl.Enabled() = New_Enabled
  97.     PropertyChanged "Enabled"
  98.     Refresh
  99. End Property
  100. 'WARNING! DO NOT REMOVE OR MODIFY THE FOLLOWING COMMENTED LINES!
  101. 'MappingInfo=UserControl,UserControl,-1,Font
  102. Public Property Get Font() As Font
  103. Attribute Font.VB_Description = "Returns a Font object."
  104. Attribute Font.VB_UserMemId = -512
  105.     Set Font = UserControl.Font
  106. End Property
  107. Public Property Set Font(ByVal New_Font As Font)
  108.     Set UserControl.Font = New_Font
  109.     PropertyChanged "Font"
  110.     Refresh
  111. End Property
  112. '
  113. 'WARNING! DO NOT REMOVE OR MODIFY THE FOLLOWING COMMENTED LINES!
  114. 'MappingInfo=UserControl,UserControl,-1,Refresh
  115. Public Sub Refresh()
  116. Attribute Refresh.VB_Description = "Forces a complete repaint of a object."
  117.     UserControl.Refresh
  118. End Sub
  119. Private Sub UserControl_Click()
  120.     RaiseEvent Click
  121.    ' Draw3Drect rcText, HiColor, ShadowColor
  122.   '  Debug.Print "UserControl_Click()"
  123. End Sub
  124. Private Sub UserControl_DblClick()
  125.     RaiseEvent DblClick
  126.     ButtonDown vbLeftButton
  127. End Sub
  128. Private Sub UserControl_KeyDown(KeyCode As Integer, Shift As Integer)
  129.     RaiseEvent KeyDown(KeyCode, Shift)
  130. End Sub
  131. Private Sub UserControl_KeyPress(KeyAscii As Integer)
  132.     RaiseEvent KeyPress(KeyAscii)
  133. End Sub
  134. Private Sub UserControl_KeyUp(KeyCode As Integer, Shift As Integer)
  135.     RaiseEvent KeyUp(KeyCode, Shift)
  136. End Sub
  137. Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single)
  138.     ButtonDown Button
  139.     RaiseEvent MouseDown(Button, Shift, x, y)
  140. End Sub
  141. 'Capture mouse movement, changes look according to mouse position
  142. 'like hovering effect
  143. Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
  144.     RaiseEvent MouseMove(Button, Shift, x, y)
  145.     If Button = vbLeftButton Then
  146.         Exit Sub
  147.     End If
  148.     
  149.     Dim m_rect As RECT
  150.     CopyRect rcText, m_rect
  151.     
  152.     If GetCapture() <> UserControl.hwnd Then
  153.         SetCapture (UserControl.hwnd)
  154.         Draw3DRect m_rect, HiColor, ShadowColor
  155.         RaiseEvent MouseEnter(Button, Shift, x, y)
  156.        ' m_Image.t
  157.     Else
  158.         Dim PT As POINTAPI
  159.         PT.x = x
  160.         PT.y = y
  161.         ClientToScreen UserControl.hwnd, PT
  162.         If WindowFromPoint(PT.x, PT.y) <> UserControl.hwnd Then
  163.             Refresh
  164.             If Button <> vbLeftButton Then
  165.                    RaiseEvent MouseOut(Button, Shift, x, y)
  166.   
  167.                 ReleaseCapture
  168.             End If
  169.         End If
  170.     End If
  171.     
  172. End Sub
  173. Private Sub UserControl_MouseUp(Button As Integer, Shift As Integer, x As Single, y As Single)
  174.     RaiseEvent MouseUp(Button, Shift, x, y)
  175.     ButtonUp Button
  176.     
  177. End Sub
  178. '
  179. 'Initialize Properties for User Control
  180. Private Sub UserControl_InitProperties()
  181.     Set UserControl.Font = Ambient.Font
  182.     Set m_Image = Nothing
  183.     m_SingleLine = m_def_SingleLine
  184.     m_Caption = m_def_Caption
  185.     m_nDrawWidth = 1
  186. End Sub
  187. Private Sub UserControl_Paint()
  188.     If IsButtonPressed = False Then
  189.         PrintCaption UserControl.hwnd, UserControl.hdc, m_Caption
  190.     End If
  191. End Sub
  192. 'Load property values from storage
  193. Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  194.     UserControl.BackColor = PropBag.ReadProperty("BackColor", &H8000000F)
  195.     UserControl.ForeColor = PropBag.ReadProperty("ForeColor", &H80000012)
  196.     UserControl.Enabled = PropBag.ReadProperty("Enabled", True)
  197.     Set UserControl.Font = PropBag.ReadProperty("Font", Ambient.Font)
  198.     Set m_Image = PropBag.ReadProperty("Image", Nothing)
  199.     m_SingleLine = PropBag.ReadProperty("SingleLine", m_def_SingleLine)
  200.     m_Caption = PropBag.ReadProperty("Caption", m_def_Caption)
  201.     m_bFlat = PropBag.ReadProperty("bFlat", False)
  202.     HiColor = PropBag.ReadProperty("HlightColor", P2P_COLOR_HLIGHT)
  203.     ShadowColor = PropBag.ReadProperty("ShadowColor2", P2P_COLOR_SHADOW)
  204.     m_nDrawWidth = PropBag.ReadProperty("nDrawWidth", 1)
  205. End Sub
  206. Private Sub UserControl_Resize()
  207.    ' HiColor = HiColor
  208.    ' ShadowColor = ShadowColor
  209.     GetClientRect UserControl.hwnd, rcText
  210. End Sub
  211. 'Write property values to storage
  212. Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
  213.     Call PropBag.WriteProperty("BackColor", UserControl.BackColor, &H8000000F)
  214.     Call PropBag.WriteProperty("ForeColor", UserControl.ForeColor, &H80000012)
  215.     Call PropBag.WriteProperty("Enabled", UserControl.Enabled, True)
  216.     Call PropBag.WriteProperty("Font", UserControl.Font, Ambient.Font)
  217.     Call PropBag.WriteProperty("Image", m_Image, Nothing)
  218.     Call PropBag.WriteProperty("SingleLine", m_SingleLine, m_def_SingleLine)
  219.     Call PropBag.WriteProperty("Caption", m_Caption, m_def_Caption)
  220.     Call PropBag.WriteProperty("bFlat", m_bFlat, False)
  221.     Call PropBag.WriteProperty("ShadowColor2", ShadowColor, P2P_COLOR_SHADOW)
  222.     Call PropBag.WriteProperty("HlightColor", HiColor, P2P_COLOR_HLIGHT)
  223.       Call PropBag.WriteProperty("nDrawWidth", m_nDrawWidth, 1)
  224.  
  225. End Sub
  226. 'WARNING! DO NOT REMOVE OR MODIFY THE FOLLOWING COMMENTED LINES!
  227. 'MemberInfo=11,0,0,0
  228. Public Property Get Image() As Picture
  229.     Set Image = m_Image
  230. End Property
  231. Public Property Set Image(ByVal New_Image As Picture)
  232.     Set m_Image = New_Image
  233.     PropertyChanged "Image"
  234.     Refresh
  235. End Property
  236. ' Draw Caption and image on button
  237. Private Sub PrintCaption(hwnd As Long, hdc As Long, mCaption As String)
  238.     
  239.     Dim rText As RECT, rTemp As RECT, rcBRect As RECT
  240.     Dim mCap As String
  241.     Dim textHeight  As Long
  242.     Dim Rgn As Long
  243.     Cls
  244.     
  245.     
  246.    ' CopyRect rcBRect, m_rect
  247.      Dim rct As RECT
  248.     Dim hBr As Long
  249.     'Fill in the hDC with the form's
  250.     'background color. Otherwise the form
  251.     'may appear Totally Garbage.
  252.     rct.Left = 0
  253.     rct.Top = 0
  254.     rct.Right = ScaleX(UserControl.Width, vbPixels, vbPixels)
  255.     rct.Bottom = ScaleY(UserControl.Height, vbPixels, vbPixels)
  256.     hBr = CreateSolidBrush(TranslateColor(&H80000005))
  257.     FillRect hdc, rct, hBr
  258.     DeleteObject hBr
  259.    
  260.      
  261.     
  262.     mCap = mCaption
  263.     CopyRect rcText, rTemp
  264.     InflateRect rTemp, -1, -1
  265.     
  266.     Rgn = CreateRectRgnIndirect(rTemp)
  267.     SelectClipRgn hdc, Rgn
  268.     
  269.     CopyRect rTemp, rText
  270.     
  271.     SelectFont hdc, Font(), ForeColor()
  272.     If m_SingleLine = True Then
  273.         textHeight = DrawText(hdc, mCap, Len(mCap), rText, DT_CENTER Or DT_CALCRECT Or DT_BOTTOM Or DT_WORD_ELLIPSIS)
  274.     Else
  275.         textHeight = DrawText(hdc, mCap, Len(mCap), rText, DT_CENTER Or DT_CALCRECT Or DT_WORDBREAK)
  276.     End If
  277.     
  278.     If m_Image Is Nothing Then
  279.         rText.Top = (rTemp.Bottom - textHeight) / 2
  280.     Else
  281.         rText.Top = rTemp.Bottom - textHeight
  282.     End If
  283.     rText.Bottom = rTemp.Bottom
  284.     rText.Right = rTemp.Right
  285.     'If image is not specified then draw caption at center of button
  286.     'otherwise draw image
  287.     If Not m_Image Is Nothing Then
  288.         Dim ImageWidth As Long, ImageHeight As Long, ImageLeft As Long, ImageTop As Long
  289.         
  290.         rTemp.Bottom = rText.Top + rTemp.Top
  291.         ImageWidth = ScaleX(m_Image.Width, vbHimetric, vbPixels)
  292.         ImageHeight = ScaleX(m_Image.Height, vbHimetric, vbPixels)
  293.         ImageLeft = (rTemp.Right - ImageWidth) / 2
  294.         ImageLeft = IIf(ImageLeft <= 0, rTemp.Left, ImageLeft)
  295.         ImageTop = (rTemp.Bottom - ImageHeight) / 2
  296.         ImageTop = IIf(ImageTop <= 0, rTemp.Top, ImageTop)
  297.         If IsButtonPressed = True Then
  298.             ImageLeft = ImageLeft + 1
  299.             ImageTop = ImageTop + 1
  300.         End If
  301.         If m_bStrech Then
  302.             PaintPicture m_Image, ImageLeft, ImageTop, ScaleX(UserControl.Width, vbHimetric, vbPixels), ScaleX(UserControl.Height, vbHimetric, vbPixels)
  303.         Else
  304.             If m_bFlat Then
  305.                 PaintPicture m_Image, ImageLeft, ImageTop + 1
  306.             Else
  307.                 PaintPicture m_Image, ImageLeft + 1, ImageTop + 1
  308.             End If
  309.            ' Debug.Print ImageLeft & " top:" & ImageTop
  310.         End If
  311.     End If
  312.     If IsButtonPressed = True Then
  313.         OffsetRect rText, 1, 1
  314.     End If
  315.     
  316.     If m_SingleLine = True Then
  317.         DrawText hdc, mCap, Len(mCap), rText, DT_CENTER Or DT_BOTTOM Or DT_WORD_ELLIPSIS
  318.     Else
  319.         DrawText hdc, mCap, Len(mCap), rText, DT_CENTER Or DT_WORDBREAK
  320.     End If
  321.     SelectClipRgn hdc, 0
  322.     DeleteObject Rgn
  323.     
  324.      ' SetBkColor hdc, &H80000005
  325.   
  326. End Sub
  327. ' Draw 3D border around the button
  328. Private Function Draw3DRect(pRect As RECT, Optional ColorHilight As Long, Optional ColorShadow As Long) As Boolean
  329.        
  330.     If m_bFlat Then
  331.         Draw3DRect = DrawFlatEdges(pRect, ColorHilight, ColorShadow)
  332.         Exit Function
  333.     End If
  334.     
  335.     
  336.     Dim lpRect As RECT
  337.     CopyRect pRect, lpRect
  338.     DrawWidth = 1
  339.     
  340.     InflateRect lpRect, -1, -1
  341.     Line (lpRect.Left, lpRect.Bottom)-(lpRect.Left, lpRect.Top), ColorHilight
  342.     Line -(lpRect.Right, lpRect.Top), ColorHilight
  343.     Line -(lpRect.Right, lpRect.Bottom), ColorShadow
  344.     Line -(lpRect.Left, lpRect.Bottom), ColorShadow
  345.     Draw3DRect = True
  346. End Function
  347. Private Function DrawFlatEdges(pRect As RECT, Optional ColorHilight As Long, Optional ColorShadow As Long) As Boolean
  348.     Dim lpRect As RECT
  349.     CopyRect pRect, lpRect
  350.     If m_nDrawWidth <= 0 Then
  351.         m_nDrawWidth = 1
  352.     End If
  353.     DrawWidth = m_nDrawWidth
  354.     Dim Color As Long
  355.     If ColorShadow > -1 Then
  356.         Color = ColorShadow
  357.     Else
  358.        Color = ColorHilight
  359.     End If
  360.     If Color < 0 Then
  361.         Color = 0
  362.     End If
  363.     
  364.     InflateRect lpRect, -0, -0
  365.     Line (lpRect.Left, lpRect.Bottom - 1)-(lpRect.Left, lpRect.Top), Color
  366.     Line -(lpRect.Right - 1, lpRect.Top), Color
  367.     Line -(lpRect.Right - 1, lpRect.Bottom - 1), Color
  368.     Line -(lpRect.Left, lpRect.Bottom - 1), Color
  369.     DrawFlatEdges = True
  370. End Function
  371. Private Sub CopyRect(Src As RECT, dest As RECT)
  372.     With dest
  373.         .Bottom = Src.Bottom
  374.         .Left = Src.Left
  375.         .Right = Src.Right
  376.         .Top = Src.Top
  377.     End With
  378. End Sub
  379. Private Sub ButtonDown(Optional Button As Integer)
  380.     
  381.     If Button = vbLeftButton And Button <> vbRightButton Then
  382.         IsButtonPressed = True
  383.         PrintCaption UserControl.hwnd, UserControl.hdc, m_Caption
  384.         Dim m_rect As RECT
  385.         CopyRect rcText, m_rect
  386.         Draw3DRect m_rect, ShadowColor, HiColor
  387.     End If
  388. End Sub
  389. Private Sub ButtonUp(Optional Button As Integer)
  390.     IsButtonPressed = False
  391.    ' ButtonDown Button
  392.     Refresh
  393. End Sub
  394. 'MemberInfo=0,0,0,True
  395. Public Property Get SingleLine() As Boolean
  396.     SingleLine = m_SingleLine
  397. End Property
  398. Public Property Let SingleLine(ByVal New_SingleLine As Boolean)
  399.     m_SingleLine = New_SingleLine
  400.     PropertyChanged "SingleLine"
  401.     Refresh
  402. End Property
  403. 'WARNING! DO NOT REMOVE OR MODIFY THE FOLLOWING COMMENTED LINES!
  404. 'MemberInfo=13,0,0,
  405. Public Property Get Caption() As String
  406.     Caption = m_Caption
  407. End Property
  408. Public Property Let Caption(ByVal New_Caption As String)
  409.     m_Caption = New_Caption
  410.     PropertyChanged "Caption"
  411.     Refresh
  412. End Property
  413. Public Sub About()
  414.    ' frmAbout.Show 1, Me
  415. End Sub
  416. Public Property Get bFlat() As Boolean
  417.     bFlat = m_bFlat
  418. End Property
  419. Public Property Let bFlat(ByVal vNewValue As Boolean)
  420.     m_bFlat = vNewValue
  421.     PropertyChanged "bFlat"
  422.     Refresh
  423. End Property
  424. Public Property Get HlightColor() As OLE_COLOR
  425.     HlightColor = HiColor
  426. End Property
  427. Public Property Let HlightColor(ByVal vNewValue As OLE_COLOR)
  428.     HiColor = vNewValue
  429.     PropertyChanged "HlightColor"
  430.     Refresh
  431. End Property
  432. Public Property Get ShadowColor2() As OLE_COLOR
  433.     ShadowColor2 = ShadowColor
  434. End Property
  435. Public Property Let ShadowColor2(ByVal vNewValue As OLE_COLOR)
  436.    ShadowColor = vNewValue
  437.     PropertyChanged "ShadowColor2"
  438.     Refresh
  439. End Property
  440. Public Property Get nDrawWidth() As Integer
  441.     nDrawWidth = m_nDrawWidth
  442. End Property
  443. Public Property Let nDrawWidth(ByVal vNewValue As Integer)
  444.     m_nDrawWidth = vNewValue
  445.     PropertyChanged "nDrawWidth"
  446.     Refresh
  447. End Property