home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 4_2005-2006.ISO / data / Zips / Mikes_MP3_1935449252005.psc / ctlEBSlider.ctl < prev    next >
Text File  |  2005-09-15  |  16KB  |  466 lines

  1. VERSION 5.00
  2. Begin VB.UserControl ctlEBSlider 
  3.    BackColor       =   &H00000000&
  4.    ClientHeight    =   360
  5.    ClientLeft      =   0
  6.    ClientTop       =   0
  7.    ClientWidth     =   4440
  8.    ScaleHeight     =   360
  9.    ScaleWidth      =   4440
  10.    ToolboxBitmap   =   "ctlEBSlider.ctx":0000
  11.    Begin VB.PictureBox picSlider 
  12.       BorderStyle     =   0  'None
  13.       Height          =   200
  14.       Left            =   120
  15.       ScaleHeight     =   182
  16.       ScaleMode       =   0  'User
  17.       ScaleWidth      =   375
  18.       TabIndex        =   0
  19.       Top             =   0
  20.       Width           =   375
  21.    End
  22.    Begin VB.Line linGroove 
  23.       BorderColor     =   &H80000014&
  24.       Index           =   1
  25.       X1              =   0
  26.       X2              =   4380
  27.       Y1              =   180
  28.       Y2              =   180
  29.    End
  30.    Begin VB.Line linGroove 
  31.       BorderColor     =   &H80000010&
  32.       BorderWidth     =   2
  33.       Index           =   0
  34.       X1              =   0
  35.       X2              =   4380
  36.       Y1              =   180
  37.       Y2              =   180
  38.    End
  39. End
  40. Attribute VB_Name = "ctlEBSlider"
  41. Attribute VB_GlobalNameSpace = False
  42. Attribute VB_Creatable = True
  43. Attribute VB_PredeclaredId = False
  44. Attribute VB_Exposed = False
  45. Option Explicit
  46. '[Description]
  47. '   EBSlider
  48. '   A stand-alone slider control
  49. '[Author]
  50. '   Richard Allsebrook  <RA>    RichardAllsebrook@earlybirdmarketing.com
  51. '[History]
  52. '   V1.0.0  20/06/2001
  53. '   Initial Release
  54. '[Declarations]
  55. 'Property storage
  56. Private lngMin                   As Long                   'Minimum value range
  57. Private lngMax                   As Long                   'Maximum value range
  58. Private lngValue                 As Long                   'Current Value
  59. Private lngSliderWidth           As Long
  60. Private zBorderStyle             As EBSliderBorderStyle
  61. Private zOrientation             As EBSliderOrientation    'Current Orientation
  62. 'Event Stubs
  63. Public Event Changed()
  64. 'Enums
  65. Public Enum EBSliderOrientation
  66.     EBHorizontal
  67.     EBVertical
  68. End Enum
  69. #If False Then 'Trick preserves Case of Enums when typing in IDE
  70. Private EBHorizontal, EBVertical
  71. #End If
  72. Public Enum EBSliderBorderStyle
  73.     EBNone = 0
  74.     EBSunkenOuter = &H2
  75.     EBRaisedInner = &H4
  76.     EBEtched = (EBSunkenOuter Or EBRaisedInner)
  77. End Enum
  78. #If False Then 'Trick preserves Case of Enums when typing in IDE
  79. Private EBNone, EBSunkenOuter, EBRaisedInner, EBEtched
  80. #End If
  81. 'API Stubs
  82. 'API UDTs
  83. Private Type RECT
  84.     Left                             As Long
  85.     Top                              As Long
  86.     Right                            As Long
  87.     bottom                           As Long
  88. End Type
  89. 'API Constants
  90. Private Const BDR_RAISEDINNER    As Long = &H4
  91. Private Const BF_BOTTOM          As Long = &H8
  92. Private Const BF_LEFT            As Long = &H1
  93. Private Const BF_RIGHT           As Long = &H4
  94. Private Const BF_TOP             As Long = &H2
  95. Private Const BF_RECT            As Double = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM)
  96. Private Declare Function DrawEdge Lib "user32" (ByVal hdc As Long, _
  97.                                                 qrc As RECT, _
  98.                                                 ByVal edge As Long, _
  99.                                                 ByVal grfFlags As Long) As Long
  100. Private Declare Function SetRect Lib "user32" (lpRect As RECT, _
  101.                                                ByVal X1 As Long, _
  102.                                                ByVal Y1 As Long, _
  103.                                                ByVal X2 As Long, _
  104.                                                ByVal Y2 As Long) As Long
  105. Public Property Get BorderStyle() As EBSliderBorderStyle
  106.     BorderStyle = zBorderStyle
  107. End Property
  108. Public Property Let BorderStyle(newValue As EBSliderBorderStyle)
  109.     zBorderStyle = newValue
  110.     UserControl_Paint
  111. End Property
  112. Public Property Get Max() As Long
  113. '[Description]
  114. '   Return the current Max property
  115. '[Code]
  116.     Max = lngMax
  117. End Property
  118. Public Property Let Max(ByVal newValue As Long)
  119. '[Description]
  120. '   Set the current max property
  121. '[Code]
  122.     If newValue > lngMin Then
  123. 'Max must be greater than Min
  124.         lngMax = newValue
  125.         If lngValue > lngMax Then
  126. 'Ensure current value is within new min-max range
  127.             lngValue = lngMax
  128.             PropertyChanged "Value"
  129.         End If
  130. 'Re-initialise slider
  131.         PositionSlider
  132.         PropertyChanged "Max"
  133.     End If
  134. End Property
  135. Public Property Get min() As Long
  136. '[Description]
  137. '   Return the current Min property
  138. '[Code]
  139.     min = lngMin
  140. End Property
  141. Public Property Let min(ByVal newValue As Long)
  142. '[Description]
  143. '   Set the Min property
  144. '[Code]
  145.     If newValue <= lngMax Then
  146. 'Min must be less than Max
  147.         lngMin = newValue
  148.         If lngValue < lngMin Then
  149. 'ensure current value still in min-max range
  150.             lngValue = lngMin
  151.             PropertyChanged "Value"
  152.         End If
  153.         PositionSlider
  154.         PropertyChanged "Min"
  155.     End If
  156. End Property
  157. Public Property Get Orientation() As EBSliderOrientation
  158.     Orientation = zOrientation
  159. End Property
  160. Public Property Let Orientation(newValue As EBSliderOrientation)
  161.     zOrientation = newValue
  162.     SliderWidth = lngSliderWidth 'force resize or slider
  163.     picSlider_Paint
  164.     UserControl_Resize
  165. End Property
  166. Private Sub picSlider_MouseMove(Button As Integer, _
  167.                                 Shift As Integer, _
  168.                                 x As Single, _
  169.                                 y As Single)
  170. '[Description]
  171. '   Allow the user to reposition the slider by dragging
  172. '[Declarations]
  173. Dim lngPos   As Long     'New position of slider
  174. Dim sglScale As Single   'Calculated scale of slider
  175. '[Code]
  176.     If Button = vbLeftButton Then
  177. 'Only move if the button is pressed
  178.         With picSlider
  179.             If zOrientation = EBHorizontal Then
  180. 'calulate new position of slider and round to nearest pixel
  181.                 lngPos = ((.Left + x - lngSliderWidth / 2) \ 15) * 15
  182. 'Constrain to control
  183.                 If lngPos < 0 Then
  184. 'Attempted to move slider past start
  185.                     lngPos = 0
  186.                 ElseIf lngPos > UserControl.Width - lngSliderWidth Then
  187. 'Attempted to move slider past end
  188.                     lngPos = UserControl.Width - lngSliderWidth
  189.                 End If
  190. 'Move slider
  191.                 .Left = lngPos
  192. 'Re-calculate value based on new position
  193.                 sglScale = (UserControl.Width - lngSliderWidth) / (lngMax - lngMin)
  194.                 lngValue = (lngPos / sglScale) + lngMin
  195.                 RaiseEvent Changed
  196.             Else
  197. 'Vertical
  198. 'calulate new position of slider and round to nearest pixel
  199.                 lngPos = ((.Top + y - lngSliderWidth / 2) \ 15) * 15
  200. 'Constrain to control
  201.                 If lngPos < 0 Then
  202. 'Attempted to move slider past start
  203.                     lngPos = 0
  204.                 ElseIf lngPos > UserControl.Height - lngSliderWidth Then
  205. 'Attempted to move slider past end
  206.                     lngPos = UserControl.Height - lngSliderWidth
  207.                 End If
  208. 'Move slider
  209.                 .Top = lngPos
  210. 'Re-calculate value based on new position
  211.                 sglScale = (UserControl.Height - lngSliderWidth) / (lngMax - lngMin)
  212.                 lngValue = (lngPos / sglScale) + lngMin
  213.                 RaiseEvent Changed
  214.             End If
  215.         End With
  216.     End If
  217. End Sub
  218. Private Sub picSlider_Paint()
  219. '[Description]
  220. '   Draw a raised border round the slider
  221. '[Declarations]
  222. Dim udtRECT                 As RECT         'Slider RECT structure
  223. '[Code]
  224.     With picSlider
  225.         SetRect udtRECT, 0, 0, .Width / 15, .Height / 15
  226.         DrawEdge .hdc, udtRECT, BDR_RAISEDINNER, BF_RECT
  227.     End With
  228. End Sub
  229. Private Sub picSlider_Resize()
  230.     picSlider.Cls
  231. End Sub
  232. Private Sub PositionSlider()
  233. '[Description]
  234. '   Moves the slider to match the current Value property
  235. '[Declarations]
  236. Dim sglScale                As Single       'Calculated scale of slider
  237. '[Code]
  238.     With picSlider
  239.         If lngMax - lngMin <> 0 Then
  240. 'Avoid devide by zero error
  241. 'Calculate new position
  242.             If zOrientation = EBHorizontal Then
  243.                 sglScale = (UserControl.Width - lngSliderWidth) / (lngMax - lngMin)
  244.                 .Left = (lngValue - lngMin) * sglScale
  245.             Else
  246.                 sglScale = (UserControl.Height - lngSliderWidth) / (lngMax - lngMin)
  247.                 .Top = (lngValue - lngMin) * sglScale
  248.             End If
  249.         End If
  250.     End With
  251. End Sub
  252. Public Property Get SliderColor() As OLE_COLOR
  253. '[Description]
  254. '   Return the current slider color
  255. '[Code]
  256.     SliderColor = picSlider.BackColor
  257. End Property
  258. Public Property Let SliderColor(newValue As OLE_COLOR)
  259. '[Description]
  260. '   Set the slider color
  261. '[Code]
  262.     picSlider.BackColor = newValue
  263. 'Redraw the slider
  264.     picSlider_Paint
  265.     PropertyChanged "SliderColor"
  266. End Property
  267. Public Property Get SliderWidth() As Long
  268. '[Description]
  269. '   Reurn current slider width
  270. '[Code]
  271.     SliderWidth = lngSliderWidth
  272. End Property
  273. Public Property Let SliderWidth(ByVal newValue As Long)
  274. '[Description]
  275. '   Set slider width
  276. '[Code]
  277.     If (zOrientation = EBHorizontal And newValue < UserControl.Width) Or (zOrientation = EBVertical And newValue < UserControl.Height) Then
  278. 'Ensure slider width is less than control
  279.         lngSliderWidth = newValue
  280.         If zOrientation = EBHorizontal Then
  281.             picSlider.Width = lngSliderWidth
  282. 'picSlider.Height = UserControl.Height
  283.         Else
  284. 'picSlider.Height = lngSliderWidth
  285.             picSlider.Width = UserControl.Width
  286.         End If
  287. 'Redraw the slider
  288.         picSlider_Paint
  289. 'Reposition the slider
  290.         PositionSlider
  291.         PropertyChanged "SliderWidth"
  292.     End If
  293. End Property
  294. Private Sub UserControl_InitProperties()
  295. '[Description]
  296. '   Set initial values for properties
  297. '[Code]
  298.     lngMin = 0
  299.     lngMax = 100
  300.     lngValue = 50
  301.     lngSliderWidth = 315
  302.     picSlider.BackColor = vb3DFace
  303.     Orientation = EBHorizontal
  304.     BorderStyle = EBNone
  305. 'Initialise the slider
  306.     PositionSlider
  307. End Sub
  308. Private Sub UserControl_MouseDown(Button As Integer, _
  309.                                   Shift As Integer, _
  310.                                   x As Single, _
  311.                                   y As Single)
  312. '[Description]
  313. '   Clicking anywhere on the control makes the slider jump to that position
  314. '[Declarations]
  315. Dim lngPos   As Long     'New position of slider
  316. Dim sglScale As Single   'Calculated scale of slider
  317.     With picSlider
  318.         If zOrientation = EBHorizontal Then
  319. 'Caluclate new position and round to nearest pixel
  320.             lngPos = ((x - lngSliderWidth / 2) \ 15) * 15
  321. 'Constrain to control
  322.             If lngPos < 0 Then
  323. 'Attempted to move past start
  324.                 lngPos = 0
  325.             ElseIf lngPos > UserControl.Width - lngSliderWidth Then
  326. 'Attempted to move past end
  327.                 lngPos = UserControl.Width - lngSliderWidth
  328.             End If
  329. 'Move slider
  330.             .Left = lngPos
  331. 'Calculate value based on new position
  332.             sglScale = (UserControl.Width - .Width) / (lngMax - lngMin)
  333.             lngValue = (lngPos / sglScale) + lngMin
  334.             RaiseEvent Changed
  335.         Else
  336. 'Caluclate new position and round to nearest pixel
  337.             lngPos = ((y - lngSliderWidth / 2) \ 15) * 15
  338. 'Constrain to control
  339.             If lngPos < 0 Then
  340. 'Attempted to move past start
  341.                 lngPos = 0
  342.             ElseIf lngPos > UserControl.Height - lngSliderWidth Then
  343. 'Attempted to move past end
  344.                 lngPos = UserControl.Height - lngSliderWidth
  345.             End If
  346. 'Move slider
  347.             .Top = lngPos
  348. 'Calculate value based on new position
  349.             sglScale = (UserControl.Height - lngSliderWidth) / (lngMax - lngMin)
  350.             lngValue = (lngPos / sglScale) + lngMin
  351.             RaiseEvent Changed
  352.         End If
  353.     End With
  354. End Sub
  355. Private Sub UserControl_Paint()
  356. Dim udtRECT                 As RECT
  357.     SetRect udtRECT, 0, 0, UserControl.Width / Screen.TwipsPerPixelX, UserControl.Height / Screen.TwipsPerPixelY
  358.     DrawEdge UserControl.hdc, udtRECT, zBorderStyle, BF_RECT
  359. End Sub
  360. Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  361. '[Description]
  362. '   Retrieve stored properties from PropBag
  363. '[Code]
  364.     With PropBag
  365.         lngMin = .ReadProperty("Min", 0)
  366.         lngMax = .ReadProperty("Max", 100)
  367.         lngValue = .ReadProperty("Value", 50)
  368.         lngSliderWidth = .ReadProperty("SliderWidth", 315)
  369.         picSlider.BackColor = .ReadProperty("SliderColor", vb3DFace)
  370.         BorderStyle = .ReadProperty("BorderStyle", EBNone)
  371.         Orientation = .ReadProperty("Orientation", EBHorizontal)
  372.     End With
  373. 'Initialise the slider
  374.     PositionSlider
  375. End Sub
  376. Private Sub UserControl_Resize()
  377. '[Description]
  378. '   Resize constituant controls to match new control size
  379. '[Declarations]
  380. Dim lngWidth  As Long  'New control width
  381. Dim lngHeight As Long  'New control height
  382. Dim intIndex  As Integer
  383. '[Code]
  384.     With UserControl
  385.         .Cls
  386.         lngWidth = .Width - Screen.TwipsPerPixelX
  387.         lngHeight = .Height - Screen.TwipsPerPixelY
  388.         If zOrientation = EBHorizontal Then
  389. 'Horizontal
  390.             For intIndex = 0 To 1
  391.                 With linGroove(intIndex)
  392.                     .X1 = 15
  393.                     .X2 = lngWidth - 15
  394.                     .Y1 = lngHeight / 2
  395.                     .Y2 = lngHeight / 2
  396.                 End With 'linGroove(intIndex)
  397.             Next intIndex
  398.             With picSlider
  399.                 .Top = 0
  400.                 .Height = lngHeight
  401.                 .Width = lngSliderWidth
  402.             End With 'picSlider
  403.         Else
  404. 'Vertical
  405.             For intIndex = 0 To 1
  406.                 With linGroove(intIndex)
  407.                     .X1 = lngWidth / 2
  408.                     .X2 = lngWidth / 2
  409.                     .Y1 = 15
  410.                     .Y2 = lngHeight - 15
  411.                 End With 'linGroove(intIndex)
  412.             Next intIndex
  413.             With picSlider
  414.                 .Left = 0
  415.                 .Width = lngWidth
  416.                 .Height = lngSliderWidth
  417.             End With 'picSlider
  418.         End If
  419.     End With
  420. 'Initialise the slider
  421.     PositionSlider
  422. End Sub
  423. Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
  424. '[Description]
  425. '   Store properties in PropBag
  426. '[Code]
  427.     With PropBag
  428.         .WriteProperty "Min", lngMin, 0
  429.         .WriteProperty "Max", lngMax, 100
  430.         .WriteProperty "Value", lngValue, 50
  431.         .WriteProperty "SliderWidth", lngSliderWidth, 315
  432.         .WriteProperty "SliderColor", picSlider.BackColor, vb3DFace
  433.         .WriteProperty "BorderStyle", zBorderStyle, EBNone
  434.         .WriteProperty "Orientation", zOrientation, EBHorizontal
  435.     End With
  436. End Sub
  437. Public Property Get Value() As Long
  438. '[Description]
  439. '   Return the current Value property
  440. '[Code]
  441.     If zOrientation = EBHorizontal Then
  442.         Value = lngValue
  443.     Else
  444.         Value = lngMax + lngMin - lngValue
  445.     End If
  446. End Property
  447. Public Property Let Value(newValue As Long)
  448. '[Description]
  449. '   Set the current Value property
  450. '[Code]
  451. 'Constrain new value to min-max range
  452.     If newValue < lngMin Then
  453.         newValue = lngMin
  454.     ElseIf newValue > lngMax Then
  455.         newValue = lngMax
  456.     End If
  457.     lngValue = newValue
  458. 'Reposition slider
  459.     PositionSlider
  460.     PropertyChanged "Value"
  461.     RaiseEvent Changed
  462. End Property
  463. ':)Code Fixer V3.0.9 (9/15/2005 1:30:29 PM) 53 + 451 = 504 Lines Thanks Ulli for inspiration and lots of code.
  464.  
  465.  
  466.