home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 3_2004-2005.ISO / Data / Zips / LittleButt184987272005.psc / LittleButton.ctl < prev   
Text File  |  2005-02-07  |  47KB  |  1,621 lines

  1. VERSION 5.00
  2. Begin VB.UserControl LittleButton 
  3.    Appearance      =   0  'Flat
  4.    AutoRedraw      =   -1  'True
  5.    BackColor       =   &H00E0E0E0&
  6.    ClientHeight    =   480
  7.    ClientLeft      =   0
  8.    ClientTop       =   0
  9.    ClientWidth     =   2880
  10.    ControlContainer=   -1  'True
  11.    MaskColor       =   &H00000000&
  12.    PropertyPages   =   "LittleButton.ctx":0000
  13.    ScaleHeight     =   480
  14.    ScaleWidth      =   2880
  15.    ToolboxBitmap   =   "LittleButton.ctx":000A
  16.    Begin VB.Timer timer1 
  17.       Enabled         =   0   'False
  18.       Left            =   2475
  19.       Top             =   0
  20.    End
  21. End
  22. Attribute VB_Name = "LittleButton"
  23. Attribute VB_GlobalNameSpace = False
  24. Attribute VB_Creatable = True
  25. Attribute VB_PredeclaredId = False
  26. Attribute VB_Exposed = False
  27. Option Explicit
  28.  
  29.  
  30.  
  31.  
  32. '########################################################################
  33.  '
  34.  '             IMPORTANT INFO ABOUT LittleButton.ocx
  35.  '              ===================================
  36.  '
  37.  ' CONTROL FEATURES:
  38.  '
  39.  '    => Create a control array of 1 to 20 buttons, instantly
  40.  '       with the change of one property
  41.  '
  42.  '    => Buttons instantly formatted in a neat column or row,
  43.  '       right or left aligned, with the selection of another
  44.  '       property
  45.  '
  46.  '    => Can visually create a buttons click in code, and, specify
  47.  '       whether or not to execute the code for that button as well
  48.  '
  49.  '    => Buttons display a hilighted rectangle, any color of your
  50.  '       choosing, to ehance the visual effect the mouse is within
  51.  '       the rectangle boundries of the specified button
  52.  '
  53.  '    => All of the buttons Captions AND toolTipText [PopupText]
  54.  '       can be set in one string at design time
  55.  '
  56.  '    => Each button can display its own picture
  57.  '
  58.  '    => 3 Visual FX can be applied to the buttons caption if desired:
  59.  '        Shadow; Bevel; Raised
  60.  '
  61.  '    => Is a container control so it can own other controls
  62.  '
  63.  '
  64.  '
  65.  '
  66.  'PROPERTIES:
  67.  '
  68.  '   -[Caption]: MUST BE SET IN CODE, NOT PROPERTY WINDOW
  69.  '
  70.  '              purpose:
  71.  '
  72.  '
  73.  '
  74.  '   -[PopupText]: MUST BE SET IN CODE, NOT PROPERTY WINDOW
  75.  '
  76.  '               purpose: provides tooltiptext for each individual
  77.  '                        button in the control (as opposed to the
  78.  '                        ToolTipText property which provides a
  79.  '                        ToolTip for the ENTIRE control
  80.  '
  81.  '                   use: specify a string that is seperated by
  82.  '                        pipe "|" chr for each button index in
  83.  '                        the control i.e if you have 2 buttons
  84.  '                        (ButtonArrayCount = 2)
  85.  '                        LittleButton1.Caption="caption1|caption2"
  86.  '                        -OR- set the caption for individual buttons
  87.  '                        by specifying an index in the array  i.e.
  88.  '                        LittleButton1.Caption(1) = "caption2"
  89.  '
  90.  '
  91.  '
  92.  'EVENTS:
  93.  '
  94.  '  [Click; MouseDown; MouseUp; KeyDown; KeyUp; MousEnter; MouseExit]
  95.  '
  96.  '########################################################################
  97.   
  98. '  types
  99. Private Type Pointapi
  100.    X As Long
  101.    Y As Long
  102. End Type
  103.  
  104. Private Type RECT
  105.     Left As Long
  106.     Top As Long
  107.     Right As Long
  108.     Bottom As Long
  109. End Type
  110.  
  111.  
  112. '  enums
  113. Enum enBtnState
  114.    buttonDown = 0
  115.    buttonUp = 1
  116. End Enum
  117.  
  118. Enum enBtnDividers
  119.     dividerNONE = 0
  120.     dividerFRAME = 1
  121. End Enum
  122.  
  123. Enum enBordStyle
  124.    borderFLAT = 0
  125.    borderSUNKEN = 1
  126.    borderLINE = 2
  127.    borderFRAMED = 3
  128.    borderRAISED = 4
  129. End Enum
  130.  
  131. Enum enArrOrient
  132.    Column = 0
  133.    Row = 1
  134. End Enum
  135.  
  136. Enum enBtnArrCnt
  137.    One = 1
  138.    Two = 2
  139.    Three = 3
  140.    Four = 4
  141.    Five = 5
  142.    Six = 6
  143.    Seven = 7
  144.    Eight = 8
  145.    Nine = 9
  146.    Ten = 10
  147.    Eleven = 11
  148.    Twelve = 12
  149.    Thirteen = 13
  150.    Fourteen = 14
  151.    Fifteen = 15
  152.    Sixteen = 16
  153.    Seventeen = 17
  154.    Eighteen = 18
  155.    Nineteen = 19
  156.    Twenty = 20
  157. End Enum
  158.  
  159. Enum enToggleVal
  160.    ToggledUp = 0
  161.    ToggledDown = 1
  162. End Enum
  163.  
  164. Enum enAlign
  165.    Left = 0 'default
  166.    Right = 1
  167. End Enum
  168.  
  169. Enum enCaptFX
  170.    fxNONE = 0
  171.    fxSHADOW = 1
  172.    fxRAISED = 2
  173.    fxEMBOSSED = 3
  174. End Enum
  175.  
  176. Enum enRestingDepth
  177.      restingFLAT = &H4000
  178.      restingRAISED = &H1000
  179. End Enum
  180.  
  181. Enum enCtrlImgTransparency
  182.    [10%] = 0
  183.    [20%] = 1
  184.    [30%] = 2
  185.    [40%] = 3
  186.    [50%] = 4
  187.    [60%] = 5
  188.    [70%] = 6
  189.    [80%] = 7
  190.    [90%] = 8
  191.    [100%] = 9
  192. End Enum
  193.  
  194. Enum enHiliteShape
  195.    HiliteRectangle = 0
  196.    HiliteOval = 1
  197. End Enum
  198.  
  199. Enum enCaptAlign
  200.     DT_LEFT = &H0
  201.     DT_CENTER = &H1
  202.     DT_RIGHT = &H2
  203. End Enum
  204.  
  205. Enum enShowApp
  206.   SW_HIDE = 0
  207.   SW_SHOWNORMAL = 1
  208.   SW_SHOWMINIMIZED = 2
  209.   SW_MAXIMIZE = 3
  210.   SW_SHOWNOACTIVATE = 4
  211.   SW_MINIMIZE = 6
  212.   SW_SHOWMINNOACTIVE = 7
  213.   SW_SHOWNA = 8
  214.   SW_RESTORE = 9
  215.   SW_MAX = 10
  216.   SW_INVALIDATE = &H2
  217.   SW_SMOOTHSCROLL = &H10
  218. End Enum
  219.  
  220. Enum enState
  221.   DFCS_CHECKED = &H400
  222.   DFCS_FLAT = &H4000
  223.   DFCS_HOT = &H1000
  224.   DFCS_MONO = &H8000
  225.   DFCS_PUSHED = &H200
  226.   DFCS_INACTIVE = &H100
  227.   DFCS_TRANSPARENT = &H800
  228. End Enum
  229.  
  230.  
  231. '  constants
  232. Private Const BORDER_BUFFER As Long = 2
  233. Private Const DFC_BUTTON = 4
  234. Private Const DFCS_BUTTONPUSH = &H10
  235. Private Const STRMODNAME = "LittleButton.ocx"
  236.  
  237.  
  238. 'public variable
  239. Public currentButtonIndex&
  240. Attribute currentButtonIndex.VB_VarMemberFlags = "400"
  241. Attribute currentButtonIndex.VB_VarDescription = "The index of the current button being referenced in code. This property is a 0 based array and must be set/specified before setting the [Caption] or [PopupText] of any 1 individual button"
  242.  
  243.  
  244. '  local variables
  245. Dim bEnter As Boolean, bOrientationChanged As Boolean
  246. Dim m_bDoExecuteCode As Boolean
  247. Dim btnRECT() As RECT, captRECT() As RECT
  248. Dim peiceRECT() As RECT, ctrlsRect As RECT
  249. Dim mArrMouseIsIn&, mOldArrMouseIsIn&
  250.  
  251.  
  252. '  api declarations
  253. Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long
  254. Private Declare Function CreateSolidBrush Lib "gdi32" (ByVal crColor As Long) As Long
  255. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  256. Private Declare Function DrawEdge Lib "user32" (ByVal hdc As Long, qrc As RECT, ByVal edge As Long, ByVal grfFlags As Long) As Long
  257. Private Declare Function DrawFrameControl Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal un1 As Long, ByVal un2 As Long) As Long
  258. 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
  259. Private Declare Function DrawFocusRect Lib "user32" (ByVal hdc As Long, lpRect As RECT) As Long
  260. Private Declare Function FillRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long
  261. Private Declare Function FillRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long, ByVal hBrush As Long) As Long
  262. Private Declare Function FrameRect Lib "user32" (ByVal hdc As Long, lpRect As RECT, ByVal hBrush As Long) As Long
  263. Private Declare Function FrameRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long, ByVal hBrush As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
  264. Private Declare Function GetCursorPos Lib "user32" (lpPoint As Pointapi) As Long
  265. Private Declare Function InvalidateRect Lib "user32.dll" (ByVal hwnd As Long, lpRect As RECT, ByVal bErase As Long) As Long
  266. Private Declare Function OffsetRect Lib "user32" (lpRect As RECT, ByVal X As Long, ByVal Y As Long) As Long
  267. Private Declare Function PtInRect Lib "user32" (lpRect As RECT, ByVal X As Long, ByVal Y As Long) As Long
  268. Private Declare Function SetRect Lib "user32" (lpRect As RECT, ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
  269. Private Declare Function SetTextColor Lib "gdi32" (ByVal hdc As Long, ByVal crColor As Long) As Long
  270. Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
  271. Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
  272.  
  273.  
  274. '  Default Property Values:
  275. Const m_def_ButtonArrayOrientation = 0
  276. Const m_def_ButtonArrayCount = 2
  277. Const m_def_CaptionFX = 0
  278. Const m_def_Caption = ""
  279. Const m_def_CaptionColor = 0
  280. Const m_def_Align = 0
  281. Const m_def_BorderStyle = 0
  282. Const m_def_PopupText = ""
  283. Const m_def_MouseOverHiliteColor = &HFFC0C0
  284. Const m_def_MouseOverCaptionColor = &HFFFFFF
  285. Const m_def_MouseOverHiliteBorderColor = 0
  286. Const m_def_ControlImageTransparency = 7
  287. Const m_def_HiliteShape = 0
  288. Const m_def_CaptionAlign = &H0
  289. Const m_def_RestingButtonDepth = 0
  290. Const m_def_ButtonPictureStretch = 0
  291. Const m_def_ButtonDividers = 0
  292.  
  293.  
  294. '  Property Variables:
  295. Dim m_ButtonArrayOrientation As enArrOrient
  296. Dim m_ButtonArrayCount As enBtnArrCnt
  297. Dim m_CaptionFX As enCaptFX
  298. Dim m_Caption As String, m_tempCaption() As String
  299. Dim m_CaptionColor As OLE_COLOR
  300. Dim m_Align As enAlign
  301. Dim m_ToggleVal As enToggleVal
  302. Dim m_BorderStyle As enBordStyle
  303. Dim m_PopupText  As String, m_tempPopupText() As String
  304. Dim m_MouseOverHiliteColor As OLE_COLOR
  305. Dim m_MouseOverCaptionColor As OLE_COLOR
  306. Dim m_MouseOverHiliteBorderColor As OLE_COLOR
  307. Dim m_ControlImageTransparency As enCtrlImgTransparency
  308. Dim m_ControlImage As Picture
  309. Dim m_HiliteShape As enHiliteShape
  310. Dim m_CaptionAlign As enCaptAlign
  311. Dim m_RestingButtonDepth As enRestingDepth
  312. Dim m_ButtonPictureStretch As Boolean
  313. Dim m_ButtonDividers As enBtnDividers
  314.  
  315.  
  316.  
  317. '  events raised
  318. Event KeyDown(KeyCode%, Shift%)
  319. Event KeyUp(KeyCode%, Shift%)
  320. Event Click(LittleButtonIndex&)
  321. Event MouseDown(Button%, LittleButtonIndex&, Shift%, X!, Y!)
  322. Event MouseUp(Button%, LittleButtonIndex&, Shift%, X!, Y!)
  323. Event MouseEnter(LittleButtonIndex&)
  324. Event MouseExit(LittleButtonIndex&)
  325.  
  326.  
  327.   
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.  
  339.  
  340.  
  341.  
  342.  
  343.  
  344.  
  345.  
  346.   
  347.  
  348.  
  349.  
  350. Private Sub UserControl_GotFocus()
  351.   '
  352.   'draw the focus rect
  353.   'Call DrawFocusRect(hdc, focusRECT)
  354. End Sub
  355.  
  356.  
  357. Private Sub UserControl_KeyDown(KeyCode As Integer, Shift As Integer)
  358.    RaiseEvent KeyDown(KeyCode, Shift)
  359. End Sub
  360.  
  361. Private Sub UserControl_KeyUp(KeyCode As Integer, Shift As Integer)
  362.    RaiseEvent KeyUp(KeyCode, Shift)
  363. End Sub
  364.  
  365. Private Sub UserControl_LostFocus()
  366.  '
  367.  'remove the focus rect by clearing and redrawing
  368.  'Call UserControl_Resize
  369. End Sub
  370.  
  371. Private Sub UserControl_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  372.    
  373.   ' redraw the buttons with [mArrMouseIsIn] in down state
  374.   Call SetRects( _
  375.           mArrMouseIsIn, _
  376.           mArrMouseIsIn, _
  377.           DFCS_PUSHED)
  378.   
  379.   'redraw the caption
  380.   Call DrawCaption
  381.   
  382.   
  383.   If m_bDoExecuteCode = True Then
  384.       RaiseEvent MouseDown(Button, mArrMouseIsIn, Shift, X, Y)
  385.   End If
  386.   
  387. End Sub
  388.  
  389. Private Sub UserControl_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  390.  
  391.    'redraw the buttons with [mArrMouseIsIn] in up state
  392.   Call SetRects( _
  393.            mArrMouseIsIn, _
  394.            mArrMouseIsIn, _
  395.            DFCS_HOT)
  396.            
  397.   'repaint the captions
  398.   Call DrawCaption
  399.   
  400.   
  401.   If m_bDoExecuteCode = True Then
  402.      RaiseEvent MouseUp(Button, mArrMouseIsIn&, Shift, X, Y)
  403.      RaiseEvent Click(mArrMouseIsIn&)
  404.   End If
  405.   
  406. End Sub
  407.  
  408. Private Sub UserControl_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  409.   Dim lng_cnt&, pixX&, pixY&, upper&
  410.   Dim bFound As Boolean
  411.   
  412.   
  413.    'if the user is pressing a button we dont want to register
  414.    'change to [mArrMouseIsIn] because we need to store the
  415.    'proper button to restore on mouse ups
  416.   If Button <> 0 Then
  417.        Exit Sub
  418.   End If
  419.   
  420.   
  421.   
  422.    'convert x and y point mouse is down at to pixels
  423.   pixX& = twip2PixX(CLng(X))
  424.   pixY& = twip2PixY(CLng(Y))
  425.   upper& = (m_ButtonArrayCount - 1)
  426.   
  427.    
  428.    'which rect area (button array) is the mouse moving at
  429.   For lng_cnt& = 0 To upper&
  430.        'is the mouse point in this rect
  431.       If PtInRect(peiceRECT(lng_cnt&), pixX&, pixY&) <> 0 Then
  432.            '
  433.           'lng_cnt& now represents the indect of peiceRect
  434.           'that the mouse_down just occurred. pass that on
  435.           'to mod level var [mArrMouseIsIn]
  436.          mArrMouseIsIn = lng_cnt&
  437.          bFound = True
  438.          Exit For
  439.       End If
  440.   Next lng_cnt&
  441.   
  442.   
  443.   
  444.   If bFound = True Then
  445.      Dim splitUpper&
  446.      
  447.       'start the timer that monitores for the mouseExit
  448.       'event and raise the mousenter event
  449.      If bEnter = False Then
  450.           bEnter = True
  451.           Call TmrAction(timer1, True, 200)
  452.           RaiseEvent MouseEnter(mArrMouseIsIn&)
  453.         
  454.      Else 'bEnter = True
  455.      
  456.            'the button/array the mouse is over has changed
  457.           If mOldArrMouseIsIn <> mArrMouseIsIn Then
  458.  
  459.                 RaiseEvent MouseExit(mOldArrMouseIsIn)
  460.                 mOldArrMouseIsIn = mArrMouseIsIn
  461.                 RaiseEvent MouseEnter(mArrMouseIsIn&)
  462.  
  463.           End If
  464.  
  465.  
  466.  
  467.           ' prevent "subscript out of range" error
  468.           If mArrMouseIsIn& <= UBound(m_tempPopupText) Then
  469.                 ' tool tip text change
  470.                 UserControl.Extender.ToolTipText = _
  471.                                  m_tempPopupText( _
  472.                                  mArrMouseIsIn&)
  473.           End If
  474.            
  475.           
  476.           If m_RestingButtonDepth = restingRAISED Then
  477.                'repaint the buttons
  478.                Call SetRects(, _
  479.                             mArrMouseIsIn, _
  480.                             m_RestingButtonDepth)
  481.           Else 'If m_RestingButtonDepth =restingFLAT Then
  482.           
  483.                Call SetRects( _
  484.                         mArrMouseIsIn, _
  485.                         mArrMouseIsIn, DFCS_HOT)
  486.          End If
  487.          
  488.          'repaint the captions
  489.          Call DrawCaption(mArrMouseIsIn&)
  490.          
  491.      End If
  492.   End If
  493.   
  494. End Sub
  495.  
  496.  
  497. Private Sub UserControl_Paint()
  498.   Call UserControl_Resize
  499. End Sub
  500.  
  501. Private Sub UserControl_Resize()
  502.   Dim minWid&, minHei&
  503.   
  504.   On Error GoTo Err_Handler:
  505.   
  506.   
  507.    'to avoid ridiculous button sizes/configurations
  508.    'enforce minimum and maximum sizes
  509.   If m_ButtonArrayOrientation = Column Then
  510.          minWid& = (Height / m_ButtonArrayCount) * 2
  511.          minHei& = (m_ButtonArrayCount * 220)
  512.   
  513.   Else ' m_ButtonArrayOrientation = Row
  514.  
  515. bOrientationChanged:
  516.  
  517.       'when changing orientation from column to row
  518.       'because of the above code, we intially end up
  519.       'with a huge control with a width of around
  520.       '18,000..so when changed orientation from col
  521.       'to row..bOrientationChanged is toggled to true
  522.       'to trigger this peice of sizing code
  523.       If bOrientationChanged = True Then
  524.            bOrientationChanged = False
  525.            minWid& = 3000
  526.           
  527.            Call UserControl.Size( _
  528.                          3000, _
  529.                          230)
  530.       Else
  531.            minWid& = ((Height * 2) * m_ButtonArrayCount)
  532.            minHei& = 230
  533.          
  534.       End If
  535.       
  536.   End If
  537.   
  538.  
  539.  
  540.   'size restricting code enforced
  541.   If Width < minWid& Then
  542.      Width = minWid&
  543.   ElseIf Height < minHei& Then
  544.      Height = minHei&
  545.   End If
  546.   
  547.   
  548.   'cause the control was resized we need
  549.   'to reset the rect coods that make up the
  550.   'buttons and the caption
  551.   Call SetRects
  552.   Call DrawCaption
  553.   
  554. Exit Sub
  555. Err_Handler:
  556.   Select Case Err.Number
  557.       Case Is = 0, 11
  558.          'division by 0 error
  559.       Case Else
  560.          Err.Source = Err.Source & "." & STRMODNAME & ".ProcName  "
  561.          Debug.Print Err.Number & vbTab & Err.Source & Err.Description
  562.          Err.Clear
  563.          Resume Next
  564.   End Select
  565. End Sub
  566.  
  567. Private Sub UserControl_Terminate()
  568.   'make sure timer is off
  569.   Call TmrAction(timer1, False)
  570. End Sub
  571.  
  572.  
  573.  
  574.  
  575.  
  576.  
  577.  
  578.  
  579.  
  580.  
  581.  
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.  
  590.  
  591.  
  592.  
  593.  
  594.  
  595.  
  596.  
  597.  
  598.  
  599.  
  600.  
  601.  
  602.  
  603.  
  604.  
  605.  
  606.  
  607.  
  608.  
  609.  
  610.  
  611.  
  612.  
  613.  
  614.  
  615.  
  616.  
  617.  
  618.  
  619.  
  620.  
  621.  
  622.  
  623.  
  624.  
  625.  
  626.  
  627.  
  628.  
  629.  
  630.  
  631.  
  632.  
  633.  
  634.  
  635.  
  636.  
  637.  
  638.  
  639.  
  640.  
  641. '=======================================================================
  642. '                 PRIVATE SUBS / FUNCTIONS
  643. '=======================================================================
  644.  
  645.  
  646.  
  647.  
  648.  
  649.  
  650. 'paints the border around the entire control
  651. 'which can be  none;raised;sunken;line;framed
  652. Private Sub DrawBorder()
  653.  
  654.   Dim DrawFlags&
  655.   
  656.   Const BF_BOTTOM = &H8
  657.   Const BF_LEFT = &H1
  658.   Const BF_RIGHT = &H4
  659.   Const BF_TOP = &H2
  660.   Const BF_RECT = (BF_LEFT Or BF_TOP Or BF_RIGHT Or BF_BOTTOM)
  661.   Const BDR_RAISEDINNER As Long = &H4
  662.   Const BDR_RAISEDOUTER As Long = &H1
  663.   Const BDR_SUNKENINNER As Long = &H8
  664.   Const BDR_SUNKENOUTER As Long = &H2
  665.  
  666.  
  667.   If m_BorderStyle = borderFLAT Then
  668.       'If flat then were drawing nothing on the edge
  669.       'tantamoust to bordersless
  670.   ElseIf m_BorderStyle = borderFRAMED Then
  671.       DrawFlags& = (BDR_RAISEDINNER Or BDR_SUNKENOUTER)
  672.   ElseIf m_BorderStyle = borderLINE Then
  673.       DrawFlags& = (BDR_SUNKENINNER Or BDR_RAISEDOUTER)
  674.   ElseIf m_BorderStyle = borderSUNKEN Then
  675.       DrawFlags& = (BDR_SUNKENINNER Or BDR_SUNKENOUTER)
  676.   ElseIf m_BorderStyle = borderRAISED Then
  677.       DrawFlags& = (BDR_RAISEDINNER Or BDR_RAISEDOUTER)
  678.   End If
  679.   
  680.   
  681.   'draw the border
  682.   Call DrawEdge(hdc, ctrlsRect, DrawFlags&, BF_RECT)
  683.   
  684. End Sub
  685.  
  686. 'draw the buttons (caption area) caption
  687. Private Sub DrawCaption(Optional hiliteIndex& = -1)
  688.   Dim lng_cnt&, DT_MAIN&, clr&
  689.   
  690.   Const DT_WORDBREAK As Long = &H10
  691.   DT_MAIN& = (DT_WORDBREAK Or m_CaptionAlign)
  692.   
  693.   For lng_cnt& = 0 To UBound(m_tempCaption)
  694.         
  695.         'if the index is an index in which the
  696.         'mouse is over we want to paint the text
  697.         '[MouseOverCaptionColor]
  698.         'Otherwise, we use [CaptionColor]
  699.         If lng_cnt& = hiliteIndex& Then
  700.             clr& = m_MouseOverCaptionColor
  701.         Else
  702.             clr& = m_CaptionColor
  703.         End If
  704.         
  705.         
  706.         
  707.         'which captions drawing effects are we using
  708.         If m_CaptionFX = fxSHADOW Then
  709.               Call DrawCaptAddit(lng_cnt&, 2.5, 2.5, RGB(170, 170, 185))
  710.         
  711.         ElseIf m_CaptionFX = fxRAISED Then
  712.               Call DrawCaptAddit(lng_cnt&, 0.6, 0.6, RGB(150, 150, 160))
  713.               Call DrawCaptAddit(lng_cnt&, -1.2, -1.2, RGB(255, 255, 255))
  714.               
  715.         ElseIf m_CaptionFX = fxEMBOSSED Then
  716.               Call DrawCaptAddit(lng_cnt&, 1.1, 1.1, RGB(255, 255, 255))
  717.               
  718.         End If
  719.         
  720.  
  721.      
  722.         'set the forecolor for the caption color
  723.         Call SetTextColor( _
  724.                     hdc, _
  725.                     clr&)
  726.         
  727.         'draw the caption
  728.         Call DrawText( _
  729.                    hdc, _
  730.                    m_tempCaption(lng_cnt&), _
  731.                    Len(m_tempCaption(lng_cnt&)), _
  732.                    captRECT(lng_cnt&), _
  733.                    DT_MAIN&)
  734.   Next lng_cnt&
  735.  
  736. End Sub
  737. '------------------------------------------------------
  738. 'this sub draws any hiliting or shadowing as required
  739. 'to produce emboss or raised effects for the caption
  740. '
  741. 'CALLERS: Sub DrawCaption
  742. '------------------------------------------------------
  743. Private Sub DrawCaptAddit(captIndex&, xOffset!, yOffset!, color&)
  744.      Dim DT_CALC&, DT_MAIN&, clr&
  745.   
  746.      Const DT_WORDBREAK As Long = &H10
  747.      DT_MAIN& = (DT_WORDBREAK Or m_CaptionAlign)
  748.      
  749.   
  750.      'move the captionRect to the right
  751.      'and down xOffset! & yOffset! pixels
  752.      Call OffsetRect( _
  753.                 captRECT(captIndex&), _
  754.                 xOffset!, yOffset!)
  755.                 
  756.      'set the forecolor
  757.      Call SetTextColor( _
  758.                  hdc, _
  759.                  color&)
  760.                  
  761.      'draw the text in the color
  762.      Call DrawText( _
  763.                 hdc, _
  764.                 m_tempCaption(captIndex&), _
  765.                 Len(m_tempCaption(captIndex&)), _
  766.                 captRECT(captIndex&), _
  767.                 DT_MAIN&)
  768.                 
  769.      'move the captRect back to its orig
  770.      'location for drawing of regular text
  771.      Call OffsetRect( _
  772.                 captRECT(captIndex&), _
  773.                 -xOffset!, -yOffset!)
  774. End Sub
  775.  
  776. 'paints the border of the entire button structure
  777. Private Sub PaintButtonHilite(btnIndex&)
  778.  
  779.    Dim hBr&, hBrBord&, brushStyle&
  780.      
  781.    Const HS_VERTICAL As Long = 1
  782.    Const HS_NOSHADE As Long = 17
  783.    Const HS_HALFTONE As Long = 18
  784.    Const HS_DITHEREDCLR As Long = 20
  785.    Const HS_SOLIDBKCLR As Long = 23
  786.  
  787.  
  788. 'CREATE BRUSHES----------
  789.  
  790.    'create a brush of the hilight color
  791.    hBr& = CreateSolidBrush( _
  792.              m_MouseOverHiliteColor)
  793.              
  794.    'creates the brush for the border color
  795.    'of the hilite color
  796.    hBrBord& = CreateSolidBrush( _
  797.               m_MouseOverHiliteBorderColor)
  798.              
  799.              
  800. 'PAINT WITH THE BRUSHES---------
  801.    
  802. 'If rectangle shape hilight .......
  803.    If m_HiliteShape = HiliteRectangle Then
  804.    
  805.         'fill the captRect with that brush color
  806.         Call FillRect( _
  807.                    hdc _
  808.                  , captRECT(btnIndex&) _
  809.                  , hBr&)
  810.             
  811.         Call FrameRect( _
  812.                   hdc, _
  813.                   captRECT(btnIndex&) _
  814.                  , hBrBord&)
  815.                  
  816.  'If oval shaped hilight...
  817.    Else
  818.    
  819.         Dim hRgn&
  820.         Dim leftBuffer&, rightBuffer&
  821.         
  822.         
  823.         'for proper formatting of the
  824.         'round rect hilite
  825.         If m_Align = Left Then
  826.             leftBuffer& = -15
  827.             rightBuffer& = 0
  828.         Else
  829.             leftBuffer& = 0
  830.             rightBuffer& = 15
  831.         End If
  832.         
  833.         
  834.         
  835.         With captRECT(btnIndex&)
  836.              'create a round rect rgn using
  837.              'capRect as a skeleton
  838.              hRgn& = CreateRoundRectRgn( _
  839.                                (.Left + leftBuffer&), _
  840.                                .Top, _
  841.                                (.Right + rightBuffer&), _
  842.                                .Bottom, _
  843.                                 15, 15)
  844.                                 
  845.              'fill the region with m_MouseOverHiliteColor
  846.              Call FillRgn( _
  847.                                hdc, _
  848.                                hRgn&, _
  849.                                hBr&)
  850.                                
  851.              'draw the border color of the hilite color
  852.              Call FrameRgn( _
  853.                                hdc, _
  854.                                hRgn&, _
  855.                                hBrBord&, _
  856.                                1, 1)
  857.         End With
  858.         
  859.    End If
  860.              
  861. 'UNLOAD THE BRUSHES--------------
  862.  
  863.    Call DeleteObject(hBr&)
  864.    Call DeleteObject(hBrBord&)
  865.              
  866. End Sub
  867.  
  868. Private Sub RedimRects()
  869.      Dim upper&
  870.     
  871.     'ubound of the button count
  872.      upper& = (m_ButtonArrayCount - 1)
  873.      
  874.     'reset the size of the peiceRect and
  875.     'btnRect and captRect array
  876.      ReDim peiceRECT(upper&)
  877.      ReDim btnRECT(upper&)
  878.      ReDim captRECT(upper&)
  879.      
  880.     'redimension array holding the props
  881.      ReDim Preserve m_tempCaption(upper&)
  882.      ReDim Preserve m_tempPopupText(upper&)
  883. End Sub
  884.  
  885.  
  886. Private Sub SetRects(Optional uniqueIndex& = -1, _
  887.                      Optional hiliteIndex& = -1, _
  888.                      Optional uniqueBtnState As enState = -1)
  889. 'VARIABLES:------------------------------------
  890.   'we use singles instead of integer or long for
  891.   'drawing stuff because its more precise and
  892.   'results in much better looking buttons
  893.   '--------------------------------------------
  894.   Dim lng_cnt&, arrCnt&   'long
  895.   Dim peiceLeft!, peiceTop!, peiceRight!, peiceBottom! 'single
  896.   Dim peiceSize!, btnSize! 'single
  897.   Dim btnState As enState
  898.   
  899. 'CODE:
  900.  Cls
  901.  On Error GoTo Err_Handler:
  902.  
  903.  'number buttons to paint/create
  904.  arrCnt& = (m_ButtonArrayCount - 1)
  905.  
  906.  'first set the controls rect which is the outside edge of LittleButton
  907.  'for drawing the borderstyle
  908.  Call SetRect(ctrlsRect, 0, 0, twip2PixX!(Width) - 1, twip2PixY!(Height) - 1)
  909.  Call DrawBorder
  910.  
  911.  
  912. 'IF BUTTON ORENTATION IS  COLUMN
  913.  If m_ButtonArrayOrientation = Column Then
  914.      
  915.     '[peiceSize] = height of ocx/number of buttons wanted
  916.     peiceSize! = ((twip2PixY!(Height) - 5) / m_ButtonArrayCount)
  917.     
  918.     '[peiceLeft]  remains constant in column layout
  919.     'and is (basically) left edge
  920.     peiceLeft! = BORDER_BUFFER
  921.    
  922.     'peiceRight remains constant in column layout and is
  923.     '(basically) the width of the control
  924.     peiceRight! = (twip2PixX!(Width) - BORDER_BUFFER)
  925.  
  926.      
  927.     'loop through the number of buttons in the array
  928.     'specified by prop ButtonArrayCount
  929.    For lng_cnt& = 0 To arrCnt&
  930.         '
  931.         peiceTop! = (lng_cnt& * peiceSize!) + BORDER_BUFFER
  932.         peiceBottom! = (peiceTop! + peiceSize!)
  933.  
  934.         '
  935.         'set the main rect area
  936.         Call SetRect(peiceRECT(lng_cnt), _
  937.                      peiceLeft!, _
  938.                      peiceTop!, _
  939.                      peiceRight!, _
  940.                      peiceBottom!)
  941.       
  942.       
  943.         If m_Align = Left Then
  944.        
  945.              'the buttons rect area
  946.             Call SetRect(btnRECT(lng_cnt&), _
  947.                         peiceLeft!, _
  948.                         peiceTop!, _
  949.                        (peiceLeft! + (peiceBottom! - peiceTop!)), _
  950.                         peiceBottom!)
  951.                        
  952.              'the captions rect area for left alignment button
  953.             Call SetRect(captRECT(lng_cnt&), _
  954.                        (peiceLeft! + (peiceBottom! - peiceTop!) + 1), _
  955.                         peiceTop!, _
  956.                        (peiceRight! - 2), _
  957.                         peiceBottom!)
  958.             
  959.             
  960.             
  961.         Else 'm_Align = Right
  962.        
  963.              'the buttons rect area
  964.             Call SetRect(btnRECT(lng_cnt&), _
  965.                         peiceRight! - (peiceBottom! - peiceTop!), _
  966.                         peiceTop!, _
  967.                         peiceRight!, _
  968.                         peiceBottom!)
  969.                        
  970.              'the captions rect area for right alignment button
  971.             Call SetRect(captRECT(lng_cnt&), _
  972.                         (peiceLeft! + 1), _
  973.                         peiceTop!, _
  974.                         (peiceRight! - (peiceBottom! - peiceTop!) - 2), _
  975.                         peiceBottom!)
  976.                        
  977.         End If
  978.        
  979.        
  980.  
  981.         '  paints the mouseover hilite color
  982.         If hiliteIndex& <> -1 Then
  983.            If lng_cnt& = hiliteIndex& Then
  984.                 Call PaintButtonHilite(lng_cnt&)
  985.            End If
  986.         End If
  987.         
  988.         
  989.         'means a single button will have different
  990.         'state than the rest becuase of mousedown
  991.         If lng_cnt = uniqueIndex& Then
  992.              btnState = uniqueBtnState
  993.         'draw the button in
  994.         'its normal state
  995.         Else
  996.              btnState = m_RestingButtonDepth
  997.         End If
  998.         
  999.         
  1000.         'draw the button
  1001.         Call DrawFrameControl( _
  1002.                       hdc&, _
  1003.                       btnRECT(lng_cnt&), _
  1004.                       DFC_BUTTON, _
  1005.                       DFCS_BUTTONPUSH Or btnState)
  1006.     Next lng_cnt
  1007.  
  1008.  
  1009.  Else 'IF BUTTON ORENTATION IS ROW
  1010.      
  1011.      
  1012.     peiceSize! = ((twip2PixX!(Width) - 4) / m_ButtonArrayCount)
  1013.     peiceBottom! = (twip2PixY!(Height) - BORDER_BUFFER)
  1014.     '
  1015.     For lng_cnt& = 0 To arrCnt&
  1016.         '
  1017.         peiceLeft! = (lng_cnt& * peiceSize!) + BORDER_BUFFER
  1018.         peiceTop! = BORDER_BUFFER
  1019.         peiceRight! = (peiceLeft! + peiceSize!)
  1020.        
  1021.         
  1022.          'the main rect area for each button control
  1023.         Call SetRect(peiceRECT(lng_cnt), _
  1024.                      peiceLeft!, _
  1025.                      peiceTop!, _
  1026.                      peiceRight!, _
  1027.                      peiceBottom!)
  1028.        
  1029.          
  1030.         If m_Align = Left Then
  1031.        
  1032.              'the buttons rect area for left aligned button
  1033.             Call SetRect(btnRECT(lng_cnt&), _
  1034.                         peiceLeft!, _
  1035.                         BORDER_BUFFER, _
  1036.                         (peiceLeft! + (peiceBottom! - peiceTop!)), _
  1037.                         peiceBottom!)
  1038.                        
  1039.              'the captions rect area for left aligned button
  1040.             Call SetRect(captRECT(lng_cnt&), _
  1041.                         (peiceLeft! + (peiceBottom! - peiceTop!) + 1), _
  1042.                         BORDER_BUFFER, _
  1043.                         (peiceRight! - 2), _
  1044.                         peiceBottom!)
  1045.                   
  1046.         Else ' m_Align = Right
  1047.        
  1048.              'the buttons rect area for right aligned button
  1049.             Call SetRect(btnRECT(lng_cnt&), _
  1050.                        (peiceRight! - (peiceBottom! - peiceTop!)), _
  1051.                         BORDER_BUFFER, _
  1052.                         peiceRight!, _
  1053.                         peiceBottom!)
  1054.                        
  1055.              'the captions rect area for right aligned button
  1056.             Call SetRect(captRECT(lng_cnt&), _
  1057.                         (peiceLeft! + 1), _
  1058.                         BORDER_BUFFER, _
  1059.                        (peiceRight! - (peiceBottom! - peiceTop!) - 2), _
  1060.                         peiceBottom!)
  1061.         End If
  1062.  
  1063.  
  1064.  
  1065.         
  1066.         ' paints the buttons hilite color
  1067.         If hiliteIndex& <> -1 Then
  1068.            If lng_cnt& = hiliteIndex& Then
  1069.                 Call PaintButtonHilite(lng_cnt&)
  1070.            End If
  1071.         End If
  1072.  
  1073.         
  1074.         'means a single button will have different
  1075.         'state than the rest becuase of mousedown
  1076.         If lng_cnt = uniqueIndex& Then
  1077.              btnState = uniqueBtnState
  1078.         'draw the button in
  1079.         'its normal state
  1080.         Else
  1081.              btnState = m_RestingButtonDepth
  1082.         End If
  1083.         
  1084.         
  1085.         'draw the button
  1086.         Call DrawFrameControl( _
  1087.                       hdc&, _
  1088.                       btnRECT(lng_cnt&), _
  1089.                       DFC_BUTTON, _
  1090.                       DFCS_BUTTONPUSH Or btnState)
  1091.   
  1092.      Next lng_cnt
  1093.  End If
  1094.  
  1095.  
  1096. Exit Sub
  1097. Err_Handler:
  1098.     Err.Source = Err.Source & "." & STRMODNAME & ".SetRects  "
  1099.     Debug.Print Err.Number & vbTab & Err.Source & Err.Description
  1100.     Err.Clear
  1101.     Resume Next
  1102. End Sub
  1103.  
  1104. Private Sub timer1_Timer()
  1105.   Dim PT As Pointapi
  1106.   
  1107.   'where the cursor is now
  1108.   Call GetCursorPos(PT)
  1109.   
  1110.   'once the cursor lies out of the control then turn
  1111.   'of this timer and raise the mouse exit event
  1112.   If WindowFromPoint(PT.X, PT.Y) <> hwnd Then
  1113.   
  1114.       bEnter = False
  1115.       
  1116.       'turn off this timer
  1117.       Call TmrAction( _
  1118.              timer1, _
  1119.              False)
  1120.       
  1121.       'repaint the buttons
  1122.       Call SetRects(, _
  1123.             , DFCS_HOT)
  1124.             
  1125.       'repaint the captions
  1126.       Call DrawCaption
  1127.       
  1128.       'raise the mouseExit event
  1129.       RaiseEvent MouseExit( _
  1130.              mArrMouseIsIn&)
  1131.   End If
  1132.  
  1133. End Sub
  1134.  
  1135. 'simplify(slightly) timer starting and stopping
  1136. Private Sub TmrAction(timer As timer, Start As Boolean, Optional Interval = 250)
  1137.  
  1138. With timer
  1139.    If Start = True Then
  1140.      .Interval = Interval
  1141.      .Enabled = True
  1142.      
  1143.    Else
  1144.      .Interval = 0
  1145.      .Enabled = False
  1146.      
  1147.    End If
  1148. End With
  1149.  
  1150. End Sub
  1151.  
  1152. Private Sub ToggleButtonState()
  1153.   Static bToggleVal As Boolean
  1154.   
  1155.   bToggleVal = Not (bToggleVal)
  1156.   '
  1157.   'alter the read only property to match the buttons state
  1158.   If m_ToggleVal = ToggledUp Then
  1159.       m_ToggleVal = ToggledDown
  1160.   Else
  1161.       m_ToggleVal = ToggledUp
  1162.   End If
  1163.   
  1164. End Sub
  1165.  
  1166.  
  1167. '----------------------------------------
  1168. 'functions to shorten code for converts twips to pixels and vice versa
  1169.                                            
  1170. Private Function twip2PixX(lvalX&) As Single 'convert twip to pixels(X)
  1171.   twip2PixX! = (lvalX& / Screen.TwipsPerPixelX)
  1172. End Function
  1173.  
  1174. Private Function twip2PixY(lvalY&) As Single 'convert twip to pixels(Y)
  1175.   twip2PixY! = (lvalY& / Screen.TwipsPerPixelY)
  1176. End Function
  1177.  
  1178. Private Function pix2TwipX(lvalX&) As Single 'pixels to twips(X)
  1179.   pix2TwipX! = (lvalX& * Screen.TwipsPerPixelX)
  1180. End Function
  1181.  
  1182. Private Function pix2TwipY(lvalY&) As Single 'pixels to twips(Y)
  1183.   pix2TwipY! = (lvalY& * Screen.TwipsPerPixelY)
  1184. End Function
  1185.  
  1186.  
  1187.  
  1188.  
  1189.  
  1190.  
  1191.  
  1192.  
  1193.  
  1194.  
  1195.  
  1196.  
  1197.  
  1198.  
  1199.  
  1200.  
  1201.  
  1202.  
  1203.  
  1204.  
  1205.  
  1206.  
  1207.  
  1208.  
  1209.  
  1210.  
  1211.  
  1212.  
  1213.  
  1214.  
  1215.  
  1216.  
  1217.  
  1218.  
  1219.  
  1220.  
  1221.  
  1222.  
  1223.  
  1224.  
  1225.  
  1226.  
  1227.  
  1228.  
  1229.  
  1230.  
  1231.  
  1232.  
  1233.  
  1234.  
  1235.  
  1236.  
  1237.  
  1238.  
  1239.  
  1240.  
  1241.  
  1242.  
  1243.  
  1244.  
  1245.  
  1246.  
  1247.  
  1248. '=======================================================================
  1249. '        USER CONTROL VISIBLE INTERFACE CODE
  1250. '=======================================================================
  1251.  
  1252.  
  1253.  
  1254. 'Initialize Properties for User Control
  1255. Private Sub UserControl_InitProperties()
  1256.  
  1257.     m_Align = m_def_Align
  1258.     Set UserControl.Font = Ambient.Font
  1259.     m_CaptionColor = m_def_CaptionColor
  1260.     m_Caption = m_def_Caption
  1261.     m_CaptionFX = m_def_CaptionFX
  1262.     m_ButtonArrayCount = m_def_ButtonArrayCount
  1263.     m_ButtonArrayOrientation = m_def_ButtonArrayOrientation
  1264.     m_BorderStyle = m_def_BorderStyle
  1265.     m_PopupText = m_def_PopupText
  1266.     m_MouseOverHiliteColor = m_def_MouseOverHiliteColor
  1267.     m_MouseOverHiliteBorderColor = m_def_MouseOverHiliteBorderColor
  1268.     m_MouseOverCaptionColor = m_def_MouseOverCaptionColor
  1269.     Set m_ControlImage = LoadPicture("")
  1270.     m_ControlImageTransparency = m_def_ControlImageTransparency
  1271.     m_HiliteShape = m_def_HiliteShape
  1272.     m_CaptionAlign = m_def_CaptionAlign
  1273.     m_RestingButtonDepth = m_def_RestingButtonDepth
  1274.     m_ButtonPictureStretch = m_def_ButtonPictureStretch
  1275.     m_ButtonDividers = m_def_ButtonDividers
  1276.     
  1277.     
  1278.     Call RedimRects
  1279.     Call UserControl_Resize
  1280.  
  1281. End Sub
  1282.  
  1283. 'Load property values from storage
  1284. Private Sub UserControl_ReadProperties(PropBag As PropertyBag)
  1285.  
  1286.     m_Align = PropBag.ReadProperty("Align", m_def_Align)
  1287.     Set UserControl.Font = PropBag.ReadProperty("Font", Ambient.Font)
  1288.     m_CaptionColor = PropBag.ReadProperty("CaptionColor", Ambient.ForeColor)
  1289.     m_Caption = PropBag.ReadProperty("Caption", m_def_Caption)
  1290.     UserControl.BackColor = PropBag.ReadProperty("BackColor", Ambient.BackColor)
  1291.     m_CaptionFX = PropBag.ReadProperty("CaptionFX", m_def_CaptionFX)
  1292.     m_ButtonArrayCount = PropBag.ReadProperty("ButtonArrayCount", m_def_ButtonArrayCount)
  1293.     m_ButtonArrayOrientation = PropBag.ReadProperty("ButtonArrayOrientation", m_def_ButtonArrayOrientation)
  1294.     m_BorderStyle = PropBag.ReadProperty("BorderStyle", m_def_BorderStyle)
  1295.     m_PopupText = PropBag.ReadProperty("PopupText", m_def_PopupText)
  1296.     m_MouseOverHiliteColor = PropBag.ReadProperty("MouseOverHiliteColor", m_def_MouseOverHiliteColor)
  1297.     m_MouseOverHiliteBorderColor = PropBag.ReadProperty("MouseOverHiliteBorderColor", m_def_MouseOverHiliteBorderColor)
  1298.     m_MouseOverCaptionColor = PropBag.ReadProperty("MouseOverCaptionColor", m_def_MouseOverCaptionColor)
  1299.     Set Picture = PropBag.ReadProperty("ButtonPicture", Nothing)
  1300.     Set m_ControlImage = PropBag.ReadProperty("ControlImage", Nothing)
  1301.     m_ControlImageTransparency = PropBag.ReadProperty("ControlImageTransparency", m_def_ControlImageTransparency)
  1302.     m_HiliteShape = PropBag.ReadProperty("HiliteShape", m_def_HiliteShape)
  1303.     m_CaptionAlign = PropBag.ReadProperty("CaptionAlign", m_def_CaptionAlign)
  1304.     m_RestingButtonDepth = PropBag.ReadProperty("RestingButtonDepth", m_def_RestingButtonDepth)
  1305.     m_ButtonPictureStretch = PropBag.ReadProperty("ButtonPictureStretch", m_def_ButtonPictureStretch)
  1306.     m_ButtonDividers = PropBag.ReadProperty("ButtonDividers", m_def_ButtonDividers)
  1307.  
  1308.  
  1309.     Call RedimRects
  1310.     
  1311.     Call HandlePipeString( _
  1312.                  m_Caption, _
  1313.                  m_tempCaption(), _
  1314.                  m_Caption)
  1315.                  
  1316.     Call HandlePipeString( _
  1317.                   m_PopupText, _
  1318.                   m_tempPopupText(), _
  1319.                   m_PopupText)
  1320.                   
  1321.     Call UserControl_Resize
  1322.   
  1323.     'if m_bDoExecuteCode = false then events wont be
  1324.     'raised for mouse_down or mouse_up or mouse click
  1325.     'the val of this can be changed to false by sub
  1326.     '[Visual Press] who 's purpose is to visually create
  1327.     'a button press.  A user may wish to create this effect
  1328.     'without actually raising the associated event
  1329.     'the end of sub [Visual Press] sets this back to true
  1330.      m_bDoExecuteCode = True
  1331.     
  1332.   End Sub
  1333.    
  1334. 'Write property values to storage
  1335. Private Sub UserControl_WriteProperties(PropBag As PropertyBag)
  1336.  
  1337.     Call PropBag.WriteProperty("Align", m_Align, m_def_Align)
  1338.     Call PropBag.WriteProperty("Font", UserControl.Font, Ambient.Font)
  1339.     Call PropBag.WriteProperty("CaptionColor", m_CaptionColor, Ambient.ForeColor)
  1340.     Call PropBag.WriteProperty("Caption", m_Caption, m_def_Caption)
  1341.     Call PropBag.WriteProperty("BackColor", UserControl.BackColor, Ambient.BackColor)
  1342.     Call PropBag.WriteProperty("CaptionFX", m_CaptionFX, m_def_CaptionFX)
  1343.     Call PropBag.WriteProperty("ButtonArrayCount", m_ButtonArrayCount, m_def_ButtonArrayCount)
  1344.     Call PropBag.WriteProperty("ButtonArrayOrientation", m_ButtonArrayOrientation, m_def_ButtonArrayOrientation)
  1345.     Call PropBag.WriteProperty("BorderStyle", m_BorderStyle, m_def_BorderStyle)
  1346.     Call PropBag.WriteProperty("PopupText", m_PopupText, m_def_PopupText)
  1347.     Call PropBag.WriteProperty("MouseOverHiliteColor", m_MouseOverHiliteColor, m_def_MouseOverHiliteColor)
  1348.     Call PropBag.WriteProperty("MouseOverHiliteBorderColor", m_MouseOverHiliteBorderColor, m_def_MouseOverHiliteBorderColor)
  1349.     Call PropBag.WriteProperty("Align", m_Align, m_def_Align)
  1350.     Call PropBag.WriteProperty("MouseOverCaptionColor", m_MouseOverCaptionColor, m_def_MouseOverCaptionColor)
  1351.     Call PropBag.WriteProperty("ButtonPicture", Picture, Nothing)
  1352.     Call PropBag.WriteProperty("ControlImage", m_ControlImage, Nothing)
  1353.     Call PropBag.WriteProperty("ControlImageTransparency", m_ControlImageTransparency, m_def_ControlImageTransparency)
  1354.     Call PropBag.WriteProperty("HiliteShape", m_HiliteShape, m_def_HiliteShape)
  1355.     Call PropBag.WriteProperty("CaptionAlign", m_CaptionAlign, m_def_CaptionAlign)
  1356.     Call PropBag.WriteProperty("RestingButtonDepth", m_RestingButtonDepth, m_def_RestingButtonDepth)
  1357.     Call PropBag.WriteProperty("ButtonPictureStretch", m_ButtonPictureStretch, m_def_ButtonPictureStretch)
  1358.     Call PropBag.WriteProperty("ButtonDividers", m_ButtonDividers, m_def_ButtonDividers)
  1359.     
  1360. End Sub
  1361.  
  1362. 'PUBLIC SUB LAUNCH
  1363. Public Sub Launch(strAppPathOrUrl$, Optional ShowHow As enShowApp = 1)
  1364. Attribute Launch.VB_Description = "Launches a file or application, or, a web address in the systems default browser if a string enclosed in quotes that specifies a web address, i.e ""www.yahoo.com"""
  1365.  
  1366.     Call ShellExecute(hwnd&, _
  1367.                     "open", _
  1368.                     strAppPathOrUrl$, _
  1369.                     vbNullString, _
  1370.                     vbNullString, _
  1371.                     ShowHow)
  1372. End Sub
  1373.  
  1374. 'PUBLIC SUB VISUALPRESS'-------------------------
  1375. 'this sub allows the user to not only execute code
  1376. 'for the mousedown or mouseup button visual create
  1377. 'the press down and up as well
  1378. '------------------------------------------------
  1379. Public Sub VisualPress(buttonState As enBtnState, buttonIndex&, _
  1380.                        Optional DoCodeExecute As Boolean = True, _
  1381.                        Optional mouseButton% = 1)
  1382. Attribute VisualPress.VB_Description = "Creates a button press, both visually, and in code (if DoCodeExecute=True)"
  1383.  
  1384.   'if user selected a valid button in the control
  1385.   If buttonIndex& >= 0 Then
  1386.      If buttonIndex& <= m_ButtonArrayCount Then
  1387.      
  1388.         mArrMouseIsIn& = buttonIndex&
  1389.         m_bDoExecuteCode = DoCodeExecute
  1390.    
  1391.         If buttonState = buttonDown Then
  1392.             'press down
  1393.             Call UserControl_MouseDown(mouseButton%, 0, 0, 0)
  1394.         Else
  1395.             'press up
  1396.             Call UserControl_MouseUp(mouseButton%, 0, 0, 0)
  1397.              
  1398.             '------------------------------------------
  1399.             'the press down caused the button to be
  1400.             'hilited just as if it was really pressed
  1401.             'so clear the hiliting with a repaint
  1402.             '-----------------------------------------
  1403.             
  1404.             'repaint the buttons
  1405.             Call SetRects(, _
  1406.                   , DFCS_HOT)
  1407.             
  1408.             'repaint the captions
  1409.             Call DrawCaption
  1410.          End If
  1411.             '-----------------------------------------
  1412.        
  1413.          m_bDoExecuteCode = True
  1414.      End If
  1415.   End If
  1416.   
  1417. End Sub
  1418. '
  1419. ''ALIGN
  1420. Public Property Get Align() As enAlign
  1421. Attribute Align.VB_Description = "The layout relationship between the button and caption (Left: button left of caption; Right: button right of caption)"
  1422.         Align = m_Align
  1423. End Property
  1424. Public Property Let Align(ByVal New_Align As enAlign)
  1425.         m_Align = New_Align
  1426.         PropertyChanged "Align"
  1427.  
  1428.         Call UserControl_Resize
  1429. End Property
  1430. 'BACKCOLOR
  1431. Public Property Get BackColor() As OLE_COLOR
  1432. Attribute BackColor.VB_Description = "The overall  color of the control"
  1433. Attribute BackColor.VB_ProcData.VB_Invoke_Property = ";Appearance"
  1434.         BackColor = UserControl.BackColor
  1435. End Property
  1436. Public Property Let BackColor(ByVal New_BackColor As OLE_COLOR)
  1437.         UserControl.BackColor() = New_BackColor
  1438.         PropertyChanged "BackColor"
  1439.         
  1440.         Call UserControl_Resize
  1441. End Property
  1442. 'BORDERSTYLE
  1443. Public Property Get BorderStyle() As enBordStyle
  1444. Attribute BorderStyle.VB_Description = "The borderstyle that is displayed at the edges of the control (Flat; Line; Framed; Raised; Sunken)"
  1445. Attribute BorderStyle.VB_ProcData.VB_Invoke_Property = ";Appearance"
  1446.         BorderStyle = m_BorderStyle
  1447. End Property
  1448. Public Property Let BorderStyle(ByVal New_BorderStyle As enBordStyle)
  1449.         m_BorderStyle = New_BorderStyle
  1450.         PropertyChanged "BorderStyle"
  1451.         
  1452.         Call UserControl_Resize
  1453. End Property
  1454.  
  1455. 'BUTTONARRAYCOUNT
  1456. Public Property Get ButtonArrayCount() As enBtnArrCnt
  1457. Attribute ButtonArrayCount.VB_Description = "The number of buttons in the control"
  1458. Attribute ButtonArrayCount.VB_ProcData.VB_Invoke_Property = ";Behavior"
  1459.         ButtonArrayCount = m_ButtonArrayCount
  1460. End Property
  1461. Public Property Let ButtonArrayCount(ByVal New_ButtonArrayCount As enBtnArrCnt)
  1462.         m_ButtonArrayCount = New_ButtonArrayCount
  1463.         PropertyChanged "ButtonArrayCount"
  1464.         '
  1465.         Call RedimRects
  1466.         Call UserControl_Resize
  1467. End Property
  1468. 'BUTTONARRAYORIENTATION
  1469. Public Property Get ButtonArrayOrientation() As enArrOrient
  1470. Attribute ButtonArrayOrientation.VB_Description = "How the buttons are aligned in relation to each other (Column or Row)"
  1471. Attribute ButtonArrayOrientation.VB_ProcData.VB_Invoke_Property = ";Appearance"
  1472.         ButtonArrayOrientation = m_ButtonArrayOrientation
  1473. End Property
  1474. Public Property Let ButtonArrayOrientation(ByVal New_ButtonArrayOrientation As enArrOrient)
  1475.         m_ButtonArrayOrientation = New_ButtonArrayOrientation
  1476.         PropertyChanged "ButtonArrayOrientation"
  1477.         '
  1478.         'bOrientationChanged toggled to true triggers
  1479.         'a resize retrict in UserControl_Resize
  1480.         'see UserControl_Resize (bOrientationChanged:)
  1481.         If New_ButtonArrayOrientation = Row Then
  1482.             bOrientationChanged = True
  1483.         End If
  1484.         
  1485.         Call UserControl_Resize
  1486. End Property
  1487. 'BUTTONDIVIDERS
  1488. Public Property Get ButtonDividers() As enBtnDividers
  1489.         ButtonDividers = m_ButtonDividers
  1490. End Property
  1491. Public Property Let ButtonDividers(ByVal New_ButtonDividers As enBtnDividers)
  1492.         m_ButtonDividers = New_ButtonDividers
  1493.         PropertyChanged "ButtonDividers"
  1494. End Property
  1495. 'BUTTONPICTURE
  1496. Public Property Get ButtonPicture() As Picture
  1497. Attribute ButtonPicture.VB_Description = "Picture that is displayed in the square button area"
  1498.         Set ButtonPicture = UserControl.Picture
  1499. End Property
  1500. Public Property Set ButtonPicture(ByVal New_ButtonPicture As Picture)
  1501.         Set UserControl.Picture = New_ButtonPicture
  1502.         PropertyChanged "ButtonPicture"
  1503. End Property
  1504. 'BUTTONPICTURESTRETCH
  1505. Public Property Get ButtonPictureStretch() As Boolean
  1506.         ButtonPictureStretch = m_ButtonPictureStretch
  1507. End Property
  1508.  
  1509. Public Property Let ButtonPictureStretch(ByVal New_ButtonPictureStretch As Boolean)
  1510.         m_ButtonPictureStretch = New_ButtonPictureStretch
  1511.         PropertyChanged "ButtonPictureStretch"
  1512. End Property
  1513. 'CAPTION -------------------------------------------------
  1514. 'If user leaves default val of index = -1 then he can get/set
  1515. 'the caption as 1 long string divided by pipe |  chararcter
  1516. 'to indicate the captin of the next index in the button array
  1517. 'If an the button array
  1518. 'If aRestingButon array
  1519. 'If aRestingBiBiBiBiBiBiBiGet B
  1520. 'the reate this effect
  1521. Lault val 'the rUy
  1522. 'CAPTION -------------------------------------------d toggled to true trigg====================tureStretch A edges of     0rigg |  chararcter
  1523. 'to out rPBiBi----------- an the button array
  1524. 'If aRestingButon a&t==tureStretch A edges of     0rigg |  cure"ButtlCL===========  cutceToyBackColor() = New_BackColor
  1525.         PropertyChanged "BackColor"
  1526.   ".         End If
  1527.          
  1528.  
  1529.    g = 18
  1530.     If
  1531.    gt
  1532. Lau    IenRperty = ";Appe1aXlFnColor", Amb
  1533.  
  1534.    o trukColov     
  1535.  
  1536.    g  Amb
  1537.    ole)
  1538.   .m_BuBoperty("q & vbTab & Err.Source & Err.Descripu in tpBag.ReadProperty("MN is m_BorderStyle = m_def_BorderStyle
  1539.     m_Pop-------f     ed Buton a&tt of  As Boolean    If
  1540.   yr)
  1541.    m_def_Burce &y
  1542. u in t
  1543.    mc-----------------b
  1544.     -MMMMMMMMMMMMMMMM--f     ed Buton*  ed on a&ttw                  
  1545.         Else
  1546.    'mdttom! = ef
  1547.  
  1548.   MMMMD"ButtonDiv;TTON, _
  1549.                       DFCS_BUTTONPUSH Or btnState)
  1550.     Next lng_cnt
  1551.  
  1552.  
  1553.  Else 'IF BUTTON ORENTATION IS ROW
  1554.      
  1555.      
  1556.     peiceSize! = ((twip2PixX!(Width) - 4) / m_ButtonArrayCount)
  1557.     peiceBottom! = (twip2PixY!(Height) - BORDER_BUFFER)
  1558.   of  As A     Widt Call UserCU----- an tsaYrlgned in .WriteProperty("BordIRgg |  chararcttonArrayClgned in .WritePropeMMMMMMMMMM===  cutcIuf         edErty!ritePrlgned in .WritePropeMMMMMMMMMM===  cutcIuf         edErty N ORENTATIy Get Buttof thDty!rite'MMMMMMMM===cton arr 
  1559.  
  1560.  arr 
  1561.  
  1562.  arr 
  1563.  
  1564.  arr 
  1565.  
  1566.  arr 
  1567.  
  1568.  arr 
  1569.  
  1570.  arr 
  1571.  
  1572.  arr 
  1573.  
  1574.  arr 
  1575.  
  1576.  arr 
  1577.  
  1578.  arr 
  1579.  
  1580.  arr 
  1581.  
  1582.  arr 
  1583.  
  1584.  arr 
  1585.  
  1586.  arr 
  1587.  
  1588.  arr 
  1589.  
  1590.  arr 
  1591.  
  1592.  arr 
  1593.  
  1594.  arr 
  1595.  
  1596.  arr 
  1597.  
  1598.  arr 
  1599.  
  1600.  arr 
  1601.  
  1602.  arr 
  1603.  
  1604.  arr 
  1605.  
  1606.  arr 
  1607.  
  1608.  arr 
  1609.  
  1610.  arr 
  1611.  
  1612.  arr 
  1613.  
  1614.  arr 
  1615.  
  1616.  arr 
  1617. "y =m_def_BorderStyle)r 
  1618.  
  1619.  arr 
  1620. "y =m_def_BorderStyl
  1621.