cButtonBar.cls
上传用户:davilee3
上传日期:2015-04-22
资源大小:986k
文件大小:20k
源码类别:

浏览器

开发平台:

Visual Basic

  1. VERSION 1.0 CLASS
  2. BEGIN
  3.   MultiUse = -1  'True
  4.   Persistable = 0  'NotPersistable
  5.   DataBindingBehavior = 0  'vbNone
  6.   DataSourceBehavior  = 0  'vbNone
  7.   MTSTransactionMode  = 0  'NotAnMTSObject
  8. END
  9. Attribute VB_Name = "cButtonBar"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. Attribute VB_Ext_KEY = "SavedWithClassBuilder6" ,"Yes"
  15. Attribute VB_Ext_KEY = "Top_Level" ,"Yes"
  16. Attribute VB_Ext_KEY = "Member0" ,"cButtons"
  17. Option Explicit
  18. Private Declare Function ScreenToClient Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
  19. Private Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long
  20. Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
  21. Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
  22. Private Type POINTAPI
  23.     X As Long
  24.     Y As Long
  25. End Type
  26. Private Declare Function CreateWindowEX Lib "user32" Alias "CreateWindowExA" (ByVal dwExStyle As Long, ByVal lpClassName As String, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hwndParent As Long, ByVal HMenu As Long, ByVal hInstance As Long, lpParam As Any) As Long
  27. Private Declare Function SendMessageAny Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  28. Private Declare Function DestroyWindow Lib "user32" (ByVal hwnd As Long) As Long
  29. Private Declare Function GetClientRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
  30. Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
  31. Private Const SWP_NOZORDER As Long = &H4
  32. 'Private Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
  33. 'Private Declare Function GetSysColor Lib "user32" (ByVal nIndex As Long) As Long
  34. 'Private Declare Function GetCapture Lib "user32" () As Long
  35. Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long
  36. Private Declare Function ReleaseCapture Lib "user32" () As Long
  37. 'Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
  38. Private Const COLOR_BTNSHADOW As Long = 16
  39. Private Const COLOR_BTNHIGHLIGHT As Long = 20
  40. Private Const COLOR_BTNFACE = 15
  41. 'Private Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
  42. Private Const SRCCOPY = &HCC0020
  43. Private Const WM_USER = &H400
  44. Private Const CW_USEDEFAULT = &H80000000
  45. Private Const SWP_NOSIZE = &H1
  46. Private Const SWP_NOACTIVATE = &H10
  47. Private Const SWP_NOMOVE = &H2
  48. Private Const HWND_TOPMOST = -1
  49. Private Type RECT
  50.     Left As Long
  51.     Top As Long
  52.     Right As Long
  53.     Bottom As Long
  54. End Type
  55. Private Const TTS_NOPREFIX = &H2
  56. 'Private Const TTF_TRANSPARENT = &H100
  57. 'Private Const TTF_CENTERTIP = &H2
  58. Private Const TTM_ADDTOOLA = (WM_USER + 4)
  59. Private Const TTM_ACTIVATE = WM_USER + 1
  60. Private Const TTM_UPDATETIPTEXTA = (WM_USER + 12)
  61. Private Const TTM_SETMAXTIPWIDTH = (WM_USER + 24)
  62. 'Private Const TTM_SETTIPBKCOLOR = (WM_USER + 19)
  63. 'Private Const TTM_SETTIPTEXTCOLOR = (WM_USER + 20)
  64. Private Const TTM_SETTITLE = (WM_USER + 32)
  65. Private Const TTM_SETTOOLINFOA As Long = (WM_USER + 9)
  66. Private Const TTM_NEWTOOLRECTA As Long = (WM_USER + 6)
  67. Private Const TTM_DELTOOLA As Long = (WM_USER + 5)
  68. Private Const TTS_BALLOON = &H40
  69. Private Const TTS_ALWAYSTIP = &H1
  70. Private Const TTF_SUBCLASS = &H10
  71. Private Const TTF_CENTERTIP = &H2
  72. Private Const TOOLTIPS_CLASSA = "tooltips_class32"
  73. Private Type TOOLINFO
  74.     lSize As Long
  75.     lFlags As Long
  76.     lHwnd As Long
  77.     lId As Long
  78.     lpRect As RECT
  79.     hInstance As Long
  80.     lpStr As String
  81.     lParam As Long
  82. End Type
  83. '====================================================
  84. Private WithEvents mPctBox As PictureBox
  85. Attribute mPctBox.VB_VarHelpID = -1
  86. 'tool tip hwnd
  87. Private mHTip As Long
  88. Private m_TipTitle As String
  89. Private m_TipText As String
  90. '按钮集合
  91. Private mvarButtons As Collection
  92. Private mvarAutoRaidoCheck As Boolean
  93. '容器的长宽
  94. Private mMeWidth&, mMeHeight&
  95. '左键点击时的按钮
  96. Private mActiveBtn As cButton
  97. '按钮宽度
  98. Private m_ButtonWidth As Long
  99. '按钮高度
  100. Private m_ButtonHeight  As Long
  101. '按钮数量
  102. Private mButtonCount As Long
  103. '上一个按钮
  104. Private mPreButton As cButton
  105. '是否已经创建
  106. Private mCreated As Boolean
  107. Public Event MouseDown(Button As Integer, Shift As Integer, X As Long, Y As Long, btn As cButton)
  108. Public Event MouseUp(Button As Integer, Shift As Integer, X As Long, Y As Long, btn As cButton)
  109. Public Event MouseMove(Button As Integer, Shift As Integer, X As Long, Y As Long, btn As cButton)
  110. Public Event DblClick(X&, Y&)
  111. Public Event DragDrop(X&, Y&)
  112. Public Function Buttons() As Collection
  113. Set Buttons = mvarButtons
  114. End Function
  115. 'index,1 base
  116. Public Function Add(Optional nCaption$, Optional nStyle As cbeButtonStyle = cbtsNormal, Optional nTagL&, _
  117.         Optional sKey As String, Optional sIndex As Long = -1) As cButton
  118. If mCreated Then
  119.     Dim objNewMember As cButton
  120.     
  121.     Dim tLeft&, tLeft2&, tBtn As cButton
  122.     Dim tRc As RECT
  123.     
  124.     Set objNewMember = New cButton
  125.     If sIndex < 1 Or sIndex > mButtonCount + 1 Then
  126.         sIndex = mButtonCount + 1
  127.     Else
  128.         For Each tBtn In mvarButtons
  129.             If tBtn.index >= sIndex Then
  130.                 tBtn.Left = tBtn.Left + m_ButtonWidth
  131.                 tBtn.index = tBtn.index + 1
  132.             End If
  133.         Next tBtn
  134.     End If
  135.                
  136.     mPctBox.Visible = True
  137.     If Len(sKey) = 0 Then
  138.         mvarButtons.Add objNewMember
  139.     Else
  140.         mvarButtons.Add objNewMember, sKey
  141.     End If
  142.     mButtonCount = mButtonCount + 1
  143.     Call SizeBar
  144.     
  145.     With objNewMember
  146.         .Caption = nCaption
  147.         .Style = nStyle
  148.         .TagL = nTagL
  149.         .index = sIndex
  150.         .CreateFace mPctBox.hdc, (sIndex - 1) * m_ButtonWidth, 0, m_ButtonWidth, m_ButtonHeight, Me
  151.         .RightBorder = True
  152.         .ButtonState = cbtnNormal
  153.         
  154.         .GetButtonLprect VarPtr(tRc)
  155.         AddTip mButtonCount, "", tRc
  156.     End With
  157.     Call UpdateAllTipRect
  158.     Call UpdateAllTipText
  159.     
  160.     'return the object created
  161.     Set Add = objNewMember
  162.     Set objNewMember = Nothing
  163.     
  164. End If
  165. End Function
  166. '集合上的remove
  167. Public Sub Remove(vntIndexKey As Variant)
  168. On Error Resume Next
  169. Dim tBtn As cButton
  170. Dim tIndex&, tWidth&
  171. Set tBtn = mvarButtons(vntIndexKey)
  172. If Not tBtn Is Nothing Then
  173.     tIndex = tBtn.index
  174.     Call RemoveByIndex(tIndex)
  175. End If
  176. End Sub
  177. '按"按钮排列顺序(index) 来 remove
  178. Public Sub RemoveByIndex(vntIndex As Long)
  179. Dim i&, tcnt&
  180. Dim tBtn As cButton
  181. If vntIndex > 0 And vntIndex <= mButtonCount Then
  182.     tcnt = mButtonCount
  183.     mPctBox.Cls
  184.     For i = tcnt To 1 Step -1
  185.         Set tBtn = mvarButtons(i)
  186.         If tBtn.index > vntIndex Then
  187.             tBtn.index = tBtn.index - 1
  188.             tBtn.Left = tBtn.Left - m_ButtonWidth
  189.         ElseIf tBtn.index = vntIndex Then
  190.             mvarButtons.Remove i
  191.             If mActiveBtn Is tBtn Then
  192.                 Set mActiveBtn = Nothing
  193.             End If
  194.             If mPreButton Is tBtn Then
  195.                 Set mPreButton = Nothing
  196.             End If
  197.             mButtonCount = mButtonCount - 1
  198.             tBtn.Destory
  199.             Set tBtn = Nothing
  200.         Else
  201.             tBtn.RePaint
  202.         End If
  203.         
  204.         Set tBtn = Nothing
  205.     Next i
  206.     Call SizeBar
  207.     Call DelTip(mButtonCount + 1)
  208.     Call UpdateAllTipRect
  209.     Call UpdateAllTipText
  210. End If
  211. End Sub
  212. ''删除指定的"按钮",参数是就是按钮本身
  213. 'Public Sub RemoveByButtonObj(btnObj As cButton)
  214. 'Dim tBtn As cButton
  215. 'If Not btnObj Is Nothing Then
  216. '    For Each tBtn In mvarButtons
  217. '        If btnObj Is tBtn Then
  218. '            RemoveByIndex tBtn.index
  219. '            Exit Sub
  220. '        End If
  221. '    Next tBtn
  222. 'End If
  223. 'End Sub
  224. '
  225. Public Sub Clear()
  226. 'Dim i&
  227. Set mPreButton = Nothing
  228. Set mActiveBtn = Nothing
  229. Set mvarButtons = New Collection
  230. 'For i = mButtonCount To 1 Step -1
  231. '    mvarButtons.Remove i
  232. 'Next i
  233. mButtonCount = 0
  234. End Sub
  235. '交换按钮,其他按钮不作调整
  236. Public Sub SwitchButton(index1&, index2&)
  237. Dim tBtn As cButton
  238. Dim sB1 As cButton, sB2 As cButton
  239. Dim tExit&, tLeft&
  240. If index1 > 0 And index1 <= mButtonCount And _
  241.         index2 > 0 And index2 <= mButtonCount Then
  242.     tExit = 0
  243.     For Each tBtn In mvarButtons
  244.         If tBtn.index = index1 Then
  245.             Set sB1 = tBtn
  246.             tExit = tExit + 1
  247.         ElseIf tBtn.index = index2 Then
  248.             Set sB2 = tBtn
  249.             tExit = tExit + 1
  250.         End If
  251.         If tExit >= 2 Then Exit For
  252.     Next tBtn
  253.     If (Not sB1 Is Nothing) And (Not sB2 Is Nothing) Then
  254.         tLeft = sB1.Left
  255.         sB1.index = index2
  256.         sB2.index = index1
  257.         sB1.Left = sB2.Left
  258.         sB2.Left = tLeft
  259.         sB1.RePaint
  260.         sB2.RePaint
  261.     End If
  262.     Call UpdateAllTipText
  263. End If
  264. End Sub
  265. '移动按钮,附件的按钮做相应调整
  266. Public Sub MoveButton(nFromIndex&, nToIndex&)
  267. Dim tBtn As cButton
  268. If nFromIndex > 0 And nFromIndex <= mButtonCount And _
  269.         nToIndex > 0 And nToIndex <= mButtonCount Then
  270.     If nFromIndex > nToIndex Then
  271.         For Each tBtn In mvarButtons
  272.             If tBtn.index >= nToIndex And tBtn.index < nFromIndex Then
  273.                 tBtn.index = tBtn.index + 1
  274.                 tBtn.Left = tBtn.Left + m_ButtonWidth
  275.             ElseIf tBtn.index = nFromIndex Then
  276.                 tBtn.index = nToIndex
  277.                 tBtn.Left = (nToIndex - 1) * m_ButtonWidth
  278.             End If
  279.         Next tBtn
  280.     ElseIf nFromIndex < nToIndex Then
  281.         For Each tBtn In mvarButtons
  282.             If tBtn.index <= nToIndex And tBtn.index > nFromIndex Then
  283.                 tBtn.index = tBtn.index - 1
  284.                 tBtn.Left = tBtn.Left - m_ButtonWidth
  285.             ElseIf tBtn.index = nFromIndex Then
  286.                 tBtn.index = nToIndex
  287.                 tBtn.Left = (nToIndex - 1) * m_ButtonWidth
  288.             End If
  289.         Next tBtn
  290.     End If
  291.     Call UpdateAllTipText
  292. End If
  293. End Sub
  294. Public Function SelectButton(nFromIndex&, nToIndex&) As Long
  295. Dim tBtn As cButton
  296. If nFromIndex > 0 And nFromIndex <= mButtonCount And _
  297.         nToIndex > 0 And nToIndex <= mButtonCount Then
  298.     If nFromIndex >= nToIndex Then
  299.         For Each tBtn In mvarButtons
  300.             If tBtn.index >= nToIndex And tBtn.index <= nFromIndex Then
  301.                 tBtn.Selected = True
  302.             Else
  303.                 tBtn.Selected = False
  304.             End If
  305.         Next tBtn
  306.     ElseIf nFromIndex < nToIndex Then
  307.         For Each tBtn In mvarButtons
  308.             If tBtn.index <= nToIndex And tBtn.index >= nFromIndex Then
  309.                 tBtn.Selected = True
  310.             Else
  311.                 tBtn.Selected = False
  312.             End If
  313.         Next tBtn
  314.     End If
  315.     SelectButton = Abs(nFromIndex - nToIndex) + 1
  316. Else
  317.     For Each tBtn In mvarButtons
  318.         tBtn.Selected = False
  319.     Next tBtn
  320. End If
  321. End Function
  322. Public Sub IniMe(npct As PictureBox)
  323. Set mPctBox = npct
  324. With mPctBox
  325.     .ScaleMode = vbPixels
  326.     .BorderStyle = 0
  327. End With
  328. m_TipText = ""
  329. m_TipTitle = ""
  330. Call CreateTip
  331. mCreated = True
  332. End Sub
  333. '================= ToolTip 相关 ===========================
  334. Private Function CreateTip() As Boolean
  335. Dim lWinStyle As Long
  336. If mHTip <> 0 Then
  337.     DestroyWindow mHTip
  338. End If
  339. lWinStyle = TTS_ALWAYSTIP Or TTS_NOPREFIX Or TTS_BALLOON
  340. mHTip = CreateWindowEX(0&, _
  341.             TOOLTIPS_CLASSA, _
  342.             vbNullString, _
  343.             lWinStyle, _
  344.             CW_USEDEFAULT, _
  345.             CW_USEDEFAULT, _
  346.             CW_USEDEFAULT, _
  347.             CW_USEDEFAULT, _
  348.             mPctBox.hwnd, _
  349.             0&, _
  350.             App.hInstance, _
  351.             0&)
  352. SetWindowPos mHTip, _
  353.     HWND_TOPMOST, _
  354.     0&, _
  355.     0&, _
  356.     0&, _
  357.     0&, _
  358.     SWP_NOACTIVATE Or SWP_NOSIZE Or SWP_NOMOVE
  359. SendMessageAny mHTip, TTM_SETMAXTIPWIDTH, 0, 0
  360. End Function
  361. '添加tip
  362. Private Sub AddTip(id&, nTxt$, nRc As RECT)
  363. Dim lpRect As RECT
  364. Dim ti As TOOLINFO
  365. GetClientRect mPctBox.hwnd, lpRect
  366. With ti
  367.     .lSize = Len(ti)
  368.     .lFlags = TTF_SUBCLASS 'Or TTF_CENTERTIP
  369.     .lpStr = nTxt
  370.     .lHwnd = mPctBox.hwnd
  371.     .lId = id
  372.     '.hInstance = App.hInstance
  373.     .lpRect = nRc
  374. End With
  375. SendMessageAny mHTip, TTM_ADDTOOLA, 0&, ti
  376. End Sub
  377. '删除
  378. Private Sub DelTip(id&)
  379. Dim ti As TOOLINFO
  380. With ti
  381.     .lSize = Len(ti)
  382.     .lHwnd = mPctBox.hwnd
  383.     .lId = id
  384. End With
  385. SendMessageAny mHTip, TTM_DELTOOLA, 0&, ti
  386. End Sub
  387. '更新tip text
  388. Friend Sub UpdateTipText(id&, nText$)
  389. Dim ti As TOOLINFO
  390. With ti
  391.     .lSize = Len(ti)
  392.     .lpStr = nText
  393.     .lHwnd = mPctBox.hwnd
  394.     .lId = id
  395. End With
  396. SendMessageAny mHTip, TTM_UPDATETIPTEXTA, 0&, ti
  397. End Sub
  398. Private Sub UpdateAllTipText()
  399. Dim tBtn As cButton
  400. For Each tBtn In mvarButtons
  401.     UpdateTipText tBtn.index, tBtn.GetCombinTipText
  402. Next tBtn
  403. End Sub
  404. '更新tip 区域
  405. Private Sub UpdateTipRect(id&, nRc As RECT)
  406. Dim ti As TOOLINFO
  407. With ti
  408.     .lSize = Len(ti)
  409.     .lHwnd = mPctBox.hwnd
  410.     .lId = id
  411.     .lpRect = nRc
  412. End With
  413. SendMessageAny mHTip, TTM_NEWTOOLRECTA, 0&, ti
  414. End Sub
  415. Private Sub UpdateAllTipRect()
  416. Dim tRc As RECT
  417. Dim tBtn As cButton
  418. If mHTip <> 0 Then
  419.     For Each tBtn In mvarButtons
  420.         tBtn.GetButtonLprect VarPtr(tRc)
  421.         UpdateTipRect tBtn.index, tRc
  422.     Next tBtn
  423. End If
  424. End Sub
  425. '更新tip title,暂时无用
  426. Private Sub ChangeTipTitle(nStr$)
  427. If mHTip <> 0 Then
  428.     Debug.Print "tiptitle", SendMessageAny(mHTip, TTM_SETTITLE, 0&, ByVal nStr)
  429. End If
  430. End Sub
  431. '激活|停用tip
  432. Public Sub ActiveTip(nActive As Long)
  433. SendMessageAny mHTip, TTM_ACTIVATE, nActive, 0
  434. End Sub
  435. '=============================================================
  436. Private Sub Class_Initialize()
  437. mCreated = False
  438. Set mvarButtons = New Collection
  439. mButtonCount = 0
  440. Set mPreButton = Nothing
  441. m_ButtonHeight = 22
  442. m_ButtonWidth = 80
  443. End Sub
  444. Private Sub Class_Terminate()
  445. If mHTip <> 0 Then
  446.     DestroyWindow mHTip
  447.     mHTip = 0
  448. End If
  449. Call Clear
  450. End Sub
  451. Private Sub mPctBox_DblClick()
  452. Dim tpt As POINTAPI
  453. GetCursorPos tpt
  454. ScreenToClient mPctBox.hwnd, tpt
  455. RaiseEvent DblClick(tpt.X, tpt.Y)
  456. End Sub
  457. Private Sub mPctBox_DragDrop(Source As Control, X As Single, Y As Single)
  458. If Source Is mPctBox Then
  459.     RaiseEvent DragDrop(CLng(X), CLng(Y))
  460. End If
  461. End Sub
  462. Private Sub mPctBox_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
  463. 'Dim tBtn As cButton, tbtn2 As cButton
  464. Dim tCurBtn As cButton
  465. Set tCurBtn = Hittest(X, Y)
  466. If Button = vbLeftButton Then
  467.     If Not tCurBtn Is Nothing Then
  468.         If mvarAutoRaidoCheck Then
  469.             CheckRadioButton tCurBtn.index
  470.         Else
  471.             tCurBtn.ButtonState = cbtnPress
  472.         End If
  473.         Set mActiveBtn = tCurBtn
  474.     End If
  475. End If
  476. RaiseEvent MouseDown(Button, Shift, CLng(X), CLng(Y), tCurBtn)
  477. End Sub
  478. Private Sub mPctBox_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  479. Dim tCurBtn As cButton
  480. Dim tRInMe As Boolean
  481. tRInMe = InMe(X, Y) And ItsMe(X, Y)
  482. If tRInMe Then
  483.     SetCapture mPctBox.hwnd
  484. Else
  485.     If Button = 0 Then
  486.         ReleaseCapture
  487.     End If
  488.     
  489. End If
  490. Set tCurBtn = Hittest(X, Y)
  491. If Button = vbLeftButton Then
  492.     If Not mActiveBtn Is Nothing Then
  493.         If mActiveBtn.InMe(X, Y) Then
  494.             mActiveBtn.ButtonState = cbtnPress
  495.         Else
  496.             mActiveBtn.ButtonState = cbtnOver
  497.         End If
  498.     End If
  499. Else
  500.     
  501.     If Not mPreButton Is tCurBtn Then
  502.         If Not mPreButton Is Nothing Then
  503.             mPreButton.ButtonState = cbtnNormal
  504.         End If
  505.     End If
  506.     If Not tCurBtn Is Nothing Then
  507.         If tRInMe Then
  508.             tCurBtn.ButtonState = cbtnOver
  509.         Else
  510.             tCurBtn.ButtonState = cbtnNormal
  511.         End If
  512.     End If
  513.     
  514. '    If tCurBtn Is Nothing Then
  515. '        m_TipText = ""
  516. '        m_TipTitle = ""
  517. '        UpdateTip
  518. '        ActiveTip 0
  519. '    Else
  520. '        If m_TipText <> tCurBtn.TipText Or m_TipTitle <> tCurBtn.TipTitle Then
  521. '            m_TipText = tCurBtn.TipText
  522. '            m_TipTitle = tCurBtn.TipTitle
  523. '            Debug.Print m_TipText, m_TipTitle
  524. '            ChangeTipTitle m_TipTitle
  525. '            UpdateTip
  526. '            ActiveTip 1
  527. '        Else
  528. '            If Not mPreButton Is tCurBtn Then
  529. '                ActiveTip 0
  530. '                ActiveTip 1
  531. '            End If
  532. '        End If
  533. '    End If
  534.     
  535.     Set mPreButton = tCurBtn
  536. End If
  537. RaiseEvent MouseMove(Button, Shift, CLng(X), CLng(Y), tCurBtn)
  538. End Sub
  539. Private Sub mPctBox_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
  540. Call ReleaseCapture
  541. If Not mActiveBtn Is Nothing Then
  542.     mActiveBtn.ButtonState = cbtnNormal
  543.     Set mActiveBtn = Nothing
  544. End If
  545. RaiseEvent MouseUp(Button, Shift, CLng(X), CLng(Y), Hittest(X, Y))
  546. End Sub
  547. Private Sub mPctBox_Paint()
  548. Dim tBtn As cButton
  549. For Each tBtn In mvarButtons
  550.     tBtn.RePaint
  551. Next tBtn
  552. End Sub
  553. Public Function InMe(ByVal X&, ByVal Y&) As Boolean
  554. InMe = X >= 0 And X < mMeWidth And _
  555.     Y >= 0 And Y < mMeHeight
  556. End Function
  557. '对应的点是否自己
  558. Private Function ItsMe(ByVal X&, ByVal Y&) As Boolean
  559. Dim tpt As POINTAPI
  560. tpt.X = X: tpt.Y = Y
  561. ClientToScreen mPctBox.hwnd, tpt
  562. ItsMe = (WindowFromPoint(tpt.X, tpt.Y) = mPctBox.hwnd)
  563. End Function
  564. Public Function Hittest(ByVal X&, ByVal Y&) As cButton
  565. Dim tBtn As cButton
  566. For Each tBtn In mvarButtons
  567.     If tBtn.InMe(X, Y) Then
  568.         Set Hittest = tBtn
  569.         Set tBtn = Nothing
  570.         Exit For
  571.     End If
  572. Next tBtn
  573. End Function
  574. Public Sub Refresh()
  575. Dim tBtn As cButton
  576. For Each tBtn In mvarButtons
  577.     tBtn.Refresh
  578. Next tBtn
  579. End Sub
  580. Private Sub mPctBox_Resize()
  581. mMeWidth = mPctBox.ScaleWidth
  582. mMeHeight = mPctBox.ScaleHeight
  583. End Sub
  584. Public Sub CheckRadioButton(nIndex&)
  585. Dim tBtn As cButton
  586. For Each tBtn In mvarButtons
  587.     If tBtn.index = nIndex Then
  588.         tBtn.Checked = True
  589.     Else
  590.         tBtn.Checked = False
  591.     End If
  592. Next tBtn
  593. End Sub
  594. Public Property Get AutoRaidoCheck() As Boolean
  595. AutoRaidoCheck = mvarAutoRaidoCheck
  596. End Property
  597. Public Property Let AutoRaidoCheck(ByVal vNewValue As Boolean)
  598. mvarAutoRaidoCheck = vNewValue
  599. End Property
  600. Public Sub DragBegin()
  601. mPctBox.Drag
  602. End Sub
  603. '按钮宽度
  604. Public Property Get ButtonWidth() As Long
  605. ButtonWidth = m_ButtonWidth
  606. End Property
  607. Public Property Let ButtonWidth(ByVal vNewValue As Long)
  608. If m_ButtonWidth <> vNewValue And vNewValue > 0 Then
  609.     m_ButtonWidth = vNewValue
  610.     Call SizeButtons
  611. End If
  612. End Property
  613. '按钮高度
  614. Public Property Get ButtonHeight() As Long
  615. ButtonHeight = m_ButtonHeight
  616. End Property
  617. Public Property Let ButtonHeight(ByVal vNewValue As Long)
  618. If m_ButtonHeight <> vNewValue And vNewValue > 0 Then
  619.     m_ButtonHeight = vNewValue
  620.     Call SizeButtons
  621. End If
  622. End Property
  623. '改变按钮大小
  624. Private Sub SizeButtons()
  625. Dim tBtn As cButton
  626. Dim tRc As RECT
  627. mPctBox.Cls
  628. Call SizeBar
  629. For Each tBtn In mvarButtons
  630.     tBtn.Move (tBtn.index - 1) * m_ButtonWidth, tBtn.Top, m_ButtonWidth, m_ButtonHeight
  631.     
  632.     tBtn.GetButtonLprect VarPtr(tRc)
  633.     UpdateTipRect tBtn.index, tRc
  634. Next tBtn
  635. End Sub
  636. Private Sub SizeBar()
  637. On Error Resume Next
  638. If mButtonCount > 0 Then
  639.     mPctBox.Visible = True
  640.     SetWindowPos mPctBox.hwnd, 0, 0, 0, m_ButtonWidth * mButtonCount, _
  641.         m_ButtonHeight, SWP_NOMOVE Or SWP_NOZORDER
  642.     'Call UpdateTipRect
  643. Else
  644.     mPctBox.Visible = False
  645.     SetWindowPos mPctBox.hwnd, 0, 0, 0, m_ButtonWidth, _
  646.         m_ButtonHeight, SWP_NOMOVE Or SWP_NOZORDER
  647. End If
  648. End Sub