home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 5_2007-2008.ISO / data / Zips / Docking_To2050802282007.psc / DockTB / CControlBar.cls < prev    next >
Text File  |  2007-02-28  |  27KB  |  847 lines

  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 = "CControlBar"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. ' ----------------------------------------------------------------- '
  15. ' Filename: CControlBar.cls
  16. ' Author:   Shaurya Malhotra (shauryamal@gmail.com)
  17. ' Date:     24 February 2007
  18. '
  19. ' Converted from MFC's CControlBar class and adapted to Visual Basic
  20. ' ----------------------------------------------------------------- '
  21.  
  22. Option Explicit
  23.  
  24. Implements CWnd
  25. Private Wnd As New CWnd
  26.  
  27. Private m_bFloating As Boolean
  28. Private m_bLayoutQuery As Boolean
  29. Private m_bAutoDelete As Boolean
  30.  
  31. Private m_cxLeftBorder As Long, m_cxRightBorder As Long
  32. Private m_cyTopBorder As Long, m_cyBottomBorder As Long
  33. Private m_cxDefaultGap As Long          ' default gap value
  34. Private m_nMRUWidth As Long             ' for dynamic resizing
  35.  
  36. Private m_nCount As Long
  37.  
  38. Enum StateFlags
  39.     delayHide = 1
  40.     delayShow = 2
  41.     tempHide = 4
  42.     statusSet = 8
  43. End Enum
  44.  
  45. Private m_nStateFlags As Long
  46. Private m_pDockContext As CDockContext  ' used during dragging
  47. Private m_pDockSite As CFrame           ' current dock site, if dockable
  48. Private m_pDockBar As CDockBar          ' current dock bar, if dockable
  49.  
  50. Private m_dwDockStyle As Long           ' indicates how bar can be docked
  51. Public arrBars As New CPtrArray         ' each element is a CControlBar
  52.  
  53.  
  54. Public Property Let pDockContext(ByVal RHS As CDockContext)
  55.     Set m_pDockContext = RHS
  56. End Property
  57.  
  58. Public Property Get pDockContext() As CDockContext
  59.     Set pDockContext = m_pDockContext
  60. End Property
  61.  
  62. Public Property Let bFloating(ByVal RHS As Boolean)
  63.     m_bFloating = RHS
  64. End Property
  65.  
  66. Public Property Get bFloating() As Boolean
  67.     bFloating = m_bFloating
  68. End Property
  69.  
  70. Public Property Let bLayoutQuery(ByVal RHS As Boolean)
  71.     m_bLayoutQuery = RHS
  72. End Property
  73.  
  74. Public Property Get bLayoutQuery() As Boolean
  75.     bLayoutQuery = m_bLayoutQuery
  76. End Property
  77.  
  78. Public Property Let cxLeftBorder(ByVal RHS As Long)
  79.     m_cxLeftBorder = RHS
  80. End Property
  81.  
  82. Public Property Get cxLeftBorder() As Long
  83.     cxLeftBorder = m_cxLeftBorder
  84. End Property
  85.  
  86. Public Property Let cxRightBorder(ByVal RHS As Long)
  87.     m_cxRightBorder = RHS
  88. End Property
  89.  
  90. Public Property Get cxRightBorder() As Long
  91.     cxRightBorder = m_cxRightBorder
  92. End Property
  93.  
  94. Public Property Let cyTopBorder(ByVal RHS As Long)
  95.     m_cyTopBorder = RHS
  96. End Property
  97.  
  98. Public Property Get cyTopBorder() As Long
  99.     cyTopBorder = m_cyTopBorder
  100. End Property
  101.  
  102. Public Property Let cyBottomBorder(ByVal RHS As Long)
  103.     m_cyBottomBorder = RHS
  104. End Property
  105.  
  106. Public Property Get cyBottomBorder() As Long
  107.     cyBottomBorder = m_cyBottomBorder
  108. End Property
  109.  
  110. Public Property Let cxDefaultGap(ByVal RHS As Long)
  111.     m_cxDefaultGap = RHS
  112. End Property
  113.  
  114. Public Property Get cxDefaultGap() As Long
  115.     cxDefaultGap = m_cxDefaultGap
  116. End Property
  117.  
  118. Public Property Let nMRUWidth(ByVal RHS As Long)
  119.     m_nMRUWidth = RHS
  120. End Property
  121.  
  122. Public Property Get nMRUWidth() As Long
  123.     nMRUWidth = m_nMRUWidth
  124. End Property
  125.  
  126. Public Property Let nCount(ByVal RHS As Long)
  127.     m_nCount = RHS
  128. End Property
  129.  
  130. Public Property Get nCount() As Long
  131.     nCount = m_nCount
  132. End Property
  133.  
  134. Public Property Let nStateFlags(ByVal RHS As Long)
  135.     m_nStateFlags = RHS
  136. End Property
  137.  
  138. Public Property Get nStateFlags() As Long
  139.     nStateFlags = m_nStateFlags
  140. End Property
  141.  
  142. Public Property Let dwStyle(ByVal RHS As Long)
  143.     Wnd.dwStyle = RHS
  144. End Property
  145.  
  146. Public Property Get dwStyle() As Long
  147.     dwStyle = Wnd.dwStyle
  148. End Property
  149.  
  150. Public Property Let pDockSite(ByVal RHS As CFrame)
  151.     Set m_pDockSite = RHS
  152. End Property
  153.  
  154. Public Property Get pDockSite() As CFrame
  155.     Set pDockSite = m_pDockSite
  156. End Property
  157.  
  158. Public Property Let pDockBar(ByVal RHS As CDockBar)
  159.     Set m_pDockBar = RHS
  160. End Property
  161.  
  162. Public Property Get pDockBar() As CDockBar
  163.     Set pDockBar = m_pDockBar
  164. End Property
  165.  
  166. Public Property Let dwDockStyle(ByVal RHS As Long)
  167.     m_dwDockStyle = RHS
  168. End Property
  169.  
  170. Public Property Get dwDockStyle() As Long
  171.     dwDockStyle = m_dwDockStyle
  172. End Property
  173.  
  174. Private Property Let CWnd_dwStyle(ByVal RHS As Long)
  175.     Wnd.dwStyle = RHS
  176. End Property
  177.  
  178. Private Property Get CWnd_dwStyle() As Long
  179.     CWnd_dwStyle = Wnd.dwStyle
  180. End Property
  181.  
  182. Private Property Let CWnd_hWnd(ByVal RHS As Long)
  183. '
  184. End Property
  185.  
  186. Private Property Get CWnd_hWnd() As Long
  187.     CWnd_hWnd = Wnd.hWnd
  188. End Property
  189.  
  190. Public Property Get hWnd() As Long
  191.     hWnd = Wnd.hWnd
  192. End Property
  193. Friend Property Let hWnd(RHS As Long)
  194.     Wnd.hWnd = RHS
  195. End Property
  196.  
  197. Private Sub Class_Initialize()
  198.     Call Initialize
  199. End Sub
  200.  
  201. Private Function CWnd_CreateEx(dwExStyle As Long, lpszClassName As String, lpszWindowName As String, dwStyle As Long, x As Long, y As Long, nWidth As Long, nHeight As Long, hWndParent As Long, nIDorHMenu As Long, lpParam As Long, Optional obj As Object = Nothing) As Boolean
  202.     CWnd_CreateEx = Wnd.CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, nIDorHMenu, lpParam)
  203. End Function
  204.  
  205. Public Function CreateEx(dwExStyle As Long, lpszClassName As String, lpszWindowName As String, dwStyle As Long, x As Long, y As Long, nWidth As Long, nHeight As Long, hWndParent As Long, nIDorHMenu As Long, lpParam As Long) As Boolean
  206.     CreateEx = CWnd_CreateEx(dwExStyle, lpszClassName, lpszWindowName, dwStyle, x, y, nWidth, nHeight, hWndParent, nIDorHMenu, lpParam, this)
  207. End Function
  208.  
  209. Friend Function Create(lpszClassName As String, lpszWindowName As String, dwStyle As Long, recta As RECT, pParentWnd As Long, nID As Long, Optional pContext As Long = 0) As Boolean
  210.     Create = Wnd.Create(lpszClassName, lpszWindowName, dwStyle, recta, pParentWnd, nID, pContext, this)
  211. End Function
  212.  
  213.  
  214. Friend Sub SetBorders(cxLeft As Long, cyTop As Long, cxRight As Long, cyBottom As Long)
  215.     'ASSERT(cxLeft >= 0);
  216.     'ASSERT(cyTop >= 0);
  217.     'ASSERT(cxRight >= 0);
  218.     'ASSERT(cyBottom >= 0);
  219.  
  220.     m_cxLeftBorder = cxLeft
  221.     m_cyTopBorder = cyTop
  222.     m_cxRightBorder = cxRight
  223.     m_cyBottomBorder = cyBottom
  224. End Sub
  225.  
  226. Friend Function Invalidate(Optional bErase As Boolean = True) As Variant
  227.     Wnd.Invalidate (bErase)
  228. End Function
  229.  
  230. Friend Function CalcInsideRect(ByRef recta As RECT, bHorz As Boolean)   'const
  231.     'ASSERT_VALID(this);
  232.     Dim dwStyle As Long
  233.     dwStyle = m_dwStyle
  234.  
  235.     If ((dwStyle And CBRS_BORDER_LEFT) <> 0) Then
  236.         recta.Left = recta.Left + cxBorder2
  237.     End If
  238.  
  239.     If (dwStyle And CBRS_BORDER_TOP) <> 0 Then
  240.         recta.Top = recta.Top + cyBorder2
  241.     End If
  242.  
  243.     If (dwStyle And CBRS_BORDER_RIGHT) <> 0 Then
  244.         recta.Right = recta.Right - cxBorder2
  245.     End If
  246.  
  247.     If (dwStyle And CBRS_BORDER_BOTTOM) <> 0 Then
  248.         recta.Bottom = recta.Bottom - cyBorder2
  249.     End If
  250.  
  251.     ' inset the top and bottom.
  252.     If (bHorz = True) Then
  253.         recta.Left = recta.Left + m_cxLeftBorder
  254.         recta.Top = recta.Top + m_cyTopBorder
  255.         recta.Right = recta.Right - m_cxRightBorder
  256.         recta.Bottom = recta.Bottom - m_cyBottomBorder
  257.         
  258.         If ((m_dwStyle And (CBRS_GRIPPER Or CBRS_FLOATING)) = CBRS_GRIPPER) Then
  259.             recta.Left = recta.Left + CX_BORDER_GRIPPER + CX_GRIPPER + CX_BORDER_GRIPPER
  260.         End If
  261.     Else
  262.         recta.Left = recta.Left + m_cyTopBorder
  263.         recta.Top = recta.Top + m_cxLeftBorder
  264.         recta.Right = recta.Right - m_cyBottomBorder
  265.         recta.Bottom = recta.Bottom - m_cxRightBorder
  266.  
  267.         If ((m_dwStyle And (CBRS_GRIPPER Or CBRS_FLOATING)) = CBRS_GRIPPER) Then
  268.             recta.Top = recta.Top + CY_BORDER_GRIPPER + CY_GRIPPER + CY_BORDER_GRIPPER
  269.         End If
  270.     End If
  271.  
  272. End Function
  273.  
  274.  
  275. Friend Function CalcFixedLayout(bStretch As Boolean, bHorz As Boolean) As Size
  276.     Dim sizea As Size
  277.     If (bStretch And bHorz) Then
  278.         sizea.cx = 32767
  279.     Else
  280.         sizea.cx = 0
  281.     End If
  282.     
  283.     If (bStretch And (Not bHorz)) Then
  284.         sizea.cy = 32767
  285.     Else
  286.         sizea.cy = 0
  287.     End If
  288.  
  289.     CalcFixedLayout = sizea
  290. End Function
  291.  
  292.  
  293. Public Function IsVisible() As Boolean
  294.     If (m_nStateFlags And delayHide) <> 0 Then
  295.         IsVisible = False
  296.         Exit Function
  297.     End If
  298.  
  299.     If (((m_nStateFlags And delayShow) <> 0) Or ((GetStyle(m_hWnd) And WS_VISIBLE) <> 0)) Then
  300.         IsVisible = True
  301.         Exit Function
  302.     End If
  303.  
  304.     IsVisible = False
  305. End Function
  306.  
  307.  
  308. Private Property Let m_dwStyle(ByVal RHS As Long)
  309.     dwStyle = RHS
  310. End Property
  311.  
  312. Private Property Get m_dwStyle() As Long
  313.     m_dwStyle = dwStyle
  314. End Property
  315.  
  316.  
  317.  
  318. Public Function SetBarStyle(dwStyle_param As Long)
  319.     If (m_dwStyle <> dwStyle_param) Then
  320.         Dim dwOldStyle As Long
  321.         dwOldStyle = m_dwStyle
  322.         m_dwStyle = dwStyle_param
  323.         Call OnBarStyleChange(dwOldStyle, dwStyle_param)
  324.     End If
  325. End Function
  326.  
  327. Private Function OnBarStyleChange(dwOldStyle As Long, dwNewStyle As Long)
  328. '
  329. End Function
  330.  
  331. Private Function Initialize()
  332.     ' no elements contained in the control bar yet
  333.     m_nCount = 0
  334.     'm_pData = NULL;
  335.  
  336.     ' set up some default border spacings
  337.     m_cxLeftBorder = 6
  338.     m_cxRightBorder = 6
  339.     m_cxDefaultGap = 2
  340.     m_cyTopBorder = 1
  341.     m_cyBottomBorder = 1
  342.     'm_bAutoDelete = FALSE;
  343.     'm_hWndOwner = NULL;
  344.     m_nStateFlags = 0
  345.     Set m_pDockSite = Nothing
  346.     Set m_pDockBar = Nothing
  347.     Set m_pDockContext = Nothing
  348.     m_dwStyle = 0
  349.     m_dwDockStyle = 0
  350.     m_nMRUWidth = 32767
  351. End Function
  352.  
  353. Private Property Let CWnd_hWndOwner(ByVal RHS As Long)
  354.     Wnd.hWndOwner = RHS
  355. End Property
  356.  
  357. Private Property Get CWnd_hWndOwner() As Long
  358.     CWnd_hWndOwner = Wnd.hWndOwner
  359. End Property
  360.  
  361. Public Property Let hWndOwner(ByVal RHS As Long)
  362.     CWnd_hWndOwner = RHS
  363. End Property
  364.  
  365. Public Property Get hWndOwner() As Long
  366.     hWndOwner = CWnd_hWndOwner
  367. End Property
  368.  
  369.  
  370. Friend Function OnSizeParent(wParam As Long, ByRef lParam As AFX_SIZEPARENTPARAMS, Optional pBar As Variant) As Long
  371.     Dim lpLayout As AFX_SIZEPARENTPARAMS
  372.     lpLayout = lParam
  373.     
  374.     Dim dwStyle As Long
  375.     dwStyle = RecalcDelayShow(lpLayout, m_hWnd)
  376.     
  377.     dwStyle = GetWindowLong(m_hWnd, GWL_STYLE)
  378.     If (((dwStyle And WS_VISIBLE) <> 0) And ((dwStyle And CBRS_ALIGN_ANY) <> 0)) <> 0 Then
  379.         ' align the control bar
  380.         Dim recta As RECT
  381.         Call CopyRect(recta, lpLayout.recta)
  382.  
  383.         Dim sizeAvail As Size
  384.         sizeAvail = CSize(recta)      ' maximum size available
  385.  
  386.         ' get maximum requested size
  387.         Dim dwMode As Long
  388.  
  389.         If (lpLayout.bStretch) <> 0 Then dwMode = LM_STRETCH Else dwMode = 0
  390.         
  391.         If ((((GetWindowLong(m_hWnd, GWL_STYLE) And CBRS_ALL) And CBRS_SIZE_DYNAMIC) <> 0) And (((GetWindowLong(m_hWnd, GWL_STYLE) And CBRS_ALL) And CBRS_FLOATING) <> 0)) <> 0 Then
  392.             dwMode = dwMode Or (LM_HORZ Or LM_MRUWIDTH)
  393.         ElseIf (dwStyle And CBRS_ORIENT_HORZ) <> 0 Then
  394.             dwMode = dwMode Or (LM_HORZ Or LM_HORZDOCK)
  395.         Else
  396.             dwMode = dwMode Or LM_VERTDOCK
  397.         End If
  398.  
  399.         Dim sizea As Size
  400.  
  401.         If (IsObject(pBar)) Then
  402.                 sizea = CalcDynamicLayout(-1, dwMode, pBar)
  403.         Else
  404.                 sizea = CalcDynamicLayout(-1, dwMode)
  405.         End If
  406.  
  407.         sizea.cx = GetMin(sizea.cx, sizeAvail.cx)
  408.         sizea.cy = GetMin(sizea.cy, sizeAvail.cy)
  409.  
  410.         If (dwStyle And CBRS_ORIENT_HORZ) <> 0 Then
  411.             lpLayout.sizeTotal.cy = lpLayout.sizeTotal.cy + sizea.cy
  412.             lpLayout.sizeTotal.cx = GetMax(lpLayout.sizeTotal.cx, sizea.cx)
  413.             
  414.             If (dwStyle And CBRS_ALIGN_TOP) <> 0 Then
  415.                 lpLayout.recta.Top = lpLayout.recta.Top + sizea.cy
  416.             ElseIf (dwStyle And CBRS_ALIGN_BOTTOM) <> 0 Then
  417.                 recta.Top = recta.Bottom - sizea.cy
  418.                 lpLayout.recta.Bottom = lpLayout.recta.Bottom - sizea.cy
  419.             End If
  420.         ElseIf (dwStyle And CBRS_ORIENT_VERT) <> 0 Then
  421.             lpLayout.sizeTotal.cx = lpLayout.sizeTotal.cx + sizea.cx
  422.             lpLayout.sizeTotal.cy = GetMax(lpLayout.sizeTotal.cy, sizea.cy)
  423.  
  424.             If (dwStyle And CBRS_ALIGN_LEFT) <> 0 Then
  425.                 lpLayout.recta.Left = lpLayout.recta.Left + sizea.cx
  426.             ElseIf (dwStyle And CBRS_ALIGN_RIGHT) <> 0 Then
  427.                 recta.Left = recta.Right - sizea.cx
  428.                 lpLayout.recta.Right = lpLayout.recta.Right - sizea.cx
  429.             End If
  430.         Else
  431.             Assert ("Assertion failed!")    ' can never happen
  432.         End If
  433.  
  434.         recta.Right = recta.Left + sizea.cx
  435.         recta.Bottom = recta.Top + sizea.cy
  436.  
  437.         ' only resize the window if doing layout and not just rect query
  438.         If (lpLayout.hDWP <> 0) Then
  439.             If (IsObject(pBar)) Then
  440.                 If (pBar.IsDockBar()) Then
  441.                         Call AfxRepositionWindow(lpLayout, m_hWnd, recta)
  442.                 End If
  443.             End If
  444.         End If
  445.  
  446.     End If
  447.  
  448.     OnSizeParent = 0
  449.     lParam = lpLayout
  450. End Function
  451.  
  452.  
  453. Friend Property Get m_hWnd() As Long
  454.     m_hWnd = Wnd.hWnd
  455. End Property
  456.  
  457.  
  458. Friend Function CalcDynamicLayout(x As Integer, nMode As Long, Optional pBar As Variant) As Size
  459.     If IsObject(pBar) Then
  460.         Dim tmp As Size
  461.         Dim db As CDockBar
  462.         Set db = pBar
  463.         CalcDynamicLayout = db.CalcFixedLayout(nMode And LM_STRETCH, nMode And LM_HORZ)
  464.         Set db = Nothing
  465.     Else
  466.         CalcDynamicLayout = CalcFixedLayout(nMode And LM_STRETCH, nMode And LM_HORZ)
  467.     End If
  468. End Function
  469.  
  470.  
  471.  
  472.  
  473. Private Function RecalcDelayShow(lpLayout As AFX_SIZEPARENTPARAMS, Optional m_hWnd As Long = 0) As Long
  474.     ' resize and reposition this control bar based on styles
  475.     Dim dwStyle As Long
  476.     dwStyle = (m_dwStyle And (CBRS_ALIGN_ANY Or CBRS_BORDER_ANY)) Or _
  477.         (GetWindowLong(m_hWnd, GWL_STYLE) And WS_VISIBLE)
  478.         
  479.     dwStyle = GetWindowLong(m_hWnd, GWL_STYLE)
  480.  
  481.     ' handle delay hide/show
  482.     If (m_nStateFlags And (delayHide Or delayShow)) = 0 Then
  483.         Dim swpFlags As Long
  484.         swpFlags = 0
  485.  
  486.         If (m_nStateFlags And delayHide) <> 0 Then
  487.             'ASSERT((m_nStateFlags & delayShow) == 0);
  488.             If (dwStyle And WS_VISIBLE) <> 0 Then
  489.                 swpFlags = SWP_HIDEWINDOW
  490.             End If
  491.         Else
  492.             'ASSERT(m_nStateFlags & delayShow);
  493.             If ((dwStyle And WS_VISIBLE) = 0) <> 0 Then
  494.                 swpFlags = SWP_SHOWWINDOW
  495.             End If
  496.         End If
  497.  
  498.         If (swpFlags <> 0) Then
  499.             ' make the window seem visible/hidden
  500.             dwStyle = dwStyle Xor WS_VISIBLE
  501.  
  502.             If (lpLayout.hDWP <> 0) Then
  503.                 ' clear delay flags
  504.                 m_nStateFlags = m_nStateFlags And (Not (delayShow Or delayHide))
  505.                 ' hide/show the window if actually doing layout
  506.                 lpLayout.hDWP = DeferWindowPos(lpLayout.hDWP, m_hWnd, 0, _
  507.                     0, 0, 0, 0, swpFlags Or _
  508.                     SWP_NOMOVE Or SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOACTIVATE)
  509.             End If
  510.         Else
  511.             ' clear delay flags -- window is already in correct state
  512.             m_nStateFlags = m_nStateFlags And (Not (delayShow Or delayHide)) '**CHECK AGAIN**'
  513.         End If
  514.     End If
  515.  
  516.     RecalcDelayShow = dwStyle           ' return new style
  517. End Function
  518.  
  519. Friend Function OnCreate(obj As Object) As Integer
  520.     Dim pFrameWnd As CFrame
  521.     Set pFrameWnd = GetParentFrame(m_hWnd)
  522.  
  523.     If (pFrameWnd.IsFrameWnd()) Then
  524.         Set m_pDockSite = pFrameWnd
  525.         Call m_pDockSite.AddControlBar(obj)
  526.     End If
  527.  
  528.     OnCreate = 0
  529. End Function
  530.  
  531.  
  532. Private Property Get this() As CControlBar
  533.    Set this = Me
  534. End Property
  535.  
  536. Friend Function GetBarStyle() As Long
  537.     GetBarStyle = m_dwStyle
  538. End Function
  539.  
  540. Friend Function IsWindowVisible() As Boolean
  541.     IsWindowVisible = CBool(Globals.IsWindowVisible(m_hWnd))
  542. End Function
  543.  
  544. Friend Function SetWindowPos(hWndInsertAfter As Long, x As Long, y As Long, cx As Long, cy As Long, wFlags As Long) As Long
  545.     SetWindowPos = Globals.SetWindowPos(m_hWnd, hWndInsertAfter, x, y, cx, cy, wFlags)
  546. End Function
  547.  
  548. Friend Function GetDockedControlBar(nPos As Long) As Object
  549.     Dim pResult As Object
  550.     Set pResult = arrBars.GetItem(nPos)
  551.  
  552.     If IsObject(pResult) Then
  553.         Set GetDockedControlBar = pResult
  554.     Else
  555.         Set GetDockedControlBar = Nothing
  556.     End If
  557. End Function
  558.  
  559. Friend Property Get GetParent() As Long
  560.     GetParent = Globals.GetParent(m_hWnd)
  561. End Property
  562.  
  563. Friend Function SetParent(newParent As Long)
  564.     Call Globals.SetParent(m_hWnd, newParent)
  565. End Function
  566.  
  567. Public Property Let bAutoDelete(ByVal RHS As Boolean)
  568.     m_bAutoDelete = RHS
  569. End Property
  570. Public Property Get bAutoDelete() As Boolean
  571.     bAutoDelete = m_bAutoDelete
  572. End Property
  573.  
  574. Friend Function PreCreateWindow(ByRef cs As CREATESTRUCT) As Boolean
  575.     ' force clipsliblings (otherwise will cause repaint problems)
  576.     cs.style = cs.style Or WS_CLIPSIBLINGS
  577.  
  578.     ' default border style translation for Win4
  579.     '  (you can turn off this translation by setting CBRS_BORDER_3D)
  580.  
  581.     If ((m_dwStyle And CBRS_BORDER_3D) = 0) Then
  582.         Dim dwNewStyle As Long
  583.         dwNewStyle = 0
  584.         
  585.         Select Case (m_dwStyle And (CBRS_BORDER_ANY Or CBRS_ALIGN_ANY))
  586.             Case CBRS_LEFT:
  587.                 dwNewStyle = CBRS_BORDER_TOP Or CBRS_BORDER_BOTTOM
  588.             Case CBRS_TOP:
  589.                 dwNewStyle = CBRS_BORDER_TOP
  590.             Case CBRS_RIGHT:
  591.                 dwNewStyle = CBRS_BORDER_TOP Or CBRS_BORDER_BOTTOM
  592.             Case CBRS_BOTTOM:
  593.                 dwNewStyle = CBRS_BORDER_BOTTOM
  594.         End Select
  595.  
  596.         ' set new style if it matched one of the predefined border types
  597.         If (dwNewStyle <> 0) Then
  598.             m_dwStyle = m_dwStyle And (Not (CBRS_BORDER_ANY))
  599.             m_dwStyle = m_dwStyle Or (dwNewStyle Or CBRS_BORDER_3D)
  600.         End If
  601.     End If
  602.  
  603.     PreCreateWindow = True
  604. End Function
  605.  
  606. Private Property Let CWnd_nFlags(ByVal RHS As Long)
  607. '
  608. End Property
  609.  
  610. Private Property Get CWnd_nFlags() As Long
  611. '
  612. End Property
  613.  
  614. Friend Function OnMouseActivate(pDesktopWnd As Long, nHitTest As Integer, nMsg As Integer) As Long
  615.     ' call default when toolbar is not floating
  616.     If (Not IsFloating()) Then
  617.         OnMouseActivate = Wnd.OnMouseActivate(pDesktopWnd, nHitTest, nMsg)
  618.     End If
  619.  
  620.     ' special behavior when floating
  621.     Call ActivateTopParent
  622.  
  623.     OnMouseActivate = MA_NOACTIVATE     ' activation already done
  624. End Function
  625.  
  626.  
  627. Private Function IsFloating() As Boolean
  628.     If (IsDockBar()) Then
  629.         IsFloating = bFloating
  630.     Else
  631.         IsFloating = (Not (m_pDockBar Is Nothing)) And (m_pDockBar.m_bFloating)
  632.     End If
  633. End Function
  634.  
  635. Private Function IsDockBar() As Boolean
  636.     IsDockBar = False
  637. End Function
  638.  
  639. Private Function ActivateTopParent()
  640.     Call Wnd.ActivateTopParent
  641. End Function
  642.  
  643.  
  644. Friend Function EraseNonClient(Optional obj As Object = Nothing)
  645.     ' get window DC that is clipped to the non-client area
  646.     Dim dc As Long
  647.     dc = GetWindowDC(hWnd)
  648.     
  649.     Dim rectClient As RECT
  650.     Call GetClientRect(hWnd, rectClient)
  651.  
  652.     Dim rectWindow As RECT
  653.     Call GetWindowRect(hWnd, rectWindow)
  654.     
  655.     Call MyScreenToClient(hWnd, rectWindow)
  656.     Call OffsetRect(rectClient, -rectWindow.Left, -rectWindow.Top)  'rectClient.
  657.     Call ExcludeClipRect(dc, rectClient.Left, rectClient.Top, rectClient.Right, rectClient.Bottom)       'dc.
  658.  
  659.     ' draw borders in non-client area
  660.     Call OffsetRect(rectWindow, -rectWindow.Left, -rectWindow.Top) 'rectWindow.
  661.  
  662.     Call DrawBorders(ByVal dc, rectWindow, obj)
  663.  
  664.     Call IntersectClipRect(ByVal dc, rectWindow.Left, rectWindow.Top, rectWindow.Right, rectWindow.Bottom)    'dc.
  665.     Call SendMessage(hWnd, WM_ERASEBKGND, ByVal dc, 0)
  666.     
  667.     ' draw gripper in non-client area
  668.     Call DrawGripper(dc, rectWindow)
  669.  
  670.     Call ReleaseDC(hWnd, dc)
  671. End Function
  672.  
  673.  
  674. Private Function DrawBorders(ByVal pDC As Long, ByRef recta As RECT, Optional obj As Object = Nothing)
  675.     'ASSERT_VALID(this);
  676.     'ASSERT_VALID(pDC);
  677.  
  678.     Dim dwStyle As Long
  679.     dwStyle = m_dwStyle
  680.     
  681.     If Not ((dwStyle And CBRS_BORDER_ANY) <> 0) Then
  682.         Exit Function
  683.     End If
  684.  
  685.     ' prepare for dark lines
  686.     'ASSERT(rect.top == 0 && rect.left == 0);
  687.     Dim rect1 As RECT, rect2 As RECT
  688.     rect1 = recta
  689.     rect2 = recta
  690.         
  691.     'COLORREF clr = afxData.bWin4 ? afxData.clrBtnShadow : afxData.clrWindowFrame;
  692.     Dim clr As Long
  693.     clr = clrBtnShadow
  694.  
  695.     ' draw dark line one pixel back/up
  696.     If (dwStyle And CBRS_BORDER_3D) <> 0 Then
  697.         rect1.Right = rect1.Right - CX_BORDER
  698.         rect1.Bottom = rect1.Bottom - CY_BORDER
  699.     End If
  700.     
  701.     If (dwStyle And CBRS_BORDER_TOP) <> 0 Then
  702.         rect2.Top = rect2.Top + cyBorder2
  703.     End If
  704.     If (dwStyle And CBRS_BORDER_BOTTOM) <> 0 Then
  705.         rect2.Bottom = rect2.Bottom - cyBorder2
  706.     End If
  707.  
  708.     ' draw left and top
  709.     If (dwStyle And CBRS_BORDER_LEFT) <> 0 Then
  710.         Call FillSolidRect(pDC, 0, rect2.Top, CX_BORDER, (rect2.Bottom - rect2.Top), clr)
  711.     End If
  712.     
  713.     If (dwStyle And CBRS_BORDER_TOP) <> 0 Then
  714.         Call FillSolidRect(pDC, 0, 0, recta.Right, CY_BORDER, clr)
  715.     End If
  716.  
  717.     ' draw right and bottom
  718.     If (dwStyle And CBRS_BORDER_RIGHT) <> 0 Then
  719.         Call FillSolidRect(pDC, rect1.Right, rect2.Top, -CX_BORDER, (rect2.Bottom - rect2.Top), clr)
  720.     End If
  721.     
  722.     If (dwStyle And CBRS_BORDER_BOTTOM) <> 0 Then
  723.         Call FillSolidRect(pDC, 0, rect1.Bottom, recta.Right, -CY_BORDER, clr)
  724.     End If
  725.  
  726.     If (dwStyle And CBRS_BORDER_3D) <> 0 Then
  727.         ' prepare for hilite lines
  728.         clr = clrBtnHilite
  729.  
  730.         ' draw left and top
  731.         If (dwStyle And CBRS_BORDER_LEFT) <> 0 Then
  732.             Call FillSolidRect(pDC, 1, rect2.Top, CX_BORDER, (rect2.Bottom - rect2.Top), clr)
  733.         End If
  734.         If (dwStyle And CBRS_BORDER_TOP) <> 0 Then
  735.             Call FillSolidRect(pDC, 0, 1, recta.Right, CY_BORDER, clr)
  736.         End If
  737.  
  738.         ' draw right and bottom
  739.         If (dwStyle And CBRS_BORDER_RIGHT) <> 0 Then
  740.             Call FillSolidRect(pDC, recta.Right, rect2.Top, -CX_BORDER, (rect2.Bottom - rect2.Top), clr)
  741.         End If
  742.         
  743.         If (dwStyle And CBRS_BORDER_BOTTOM) <> 0 Then
  744.             Call FillSolidRect(pDC, 0, recta.Bottom, recta.Right, -CY_BORDER, clr)
  745.         End If
  746.     End If
  747.  
  748.     If (dwStyle And CBRS_BORDER_LEFT) <> 0 Then
  749.         recta.Left = recta.Left + cxBorder2
  750.     End If
  751.     If (dwStyle And CBRS_BORDER_TOP) <> 0 Then
  752.         recta.Top = recta.Top + cyBorder2
  753.     End If
  754.     If (dwStyle And CBRS_BORDER_RIGHT) <> 0 Then
  755.         recta.Right = recta.Right - cxBorder2
  756.     End If
  757.     If (dwStyle And CBRS_BORDER_BOTTOM) <> 0 Then
  758.         recta.Bottom = recta.Bottom - cyBorder2
  759.     End If
  760. End Function
  761.  
  762.  
  763.  
  764. Private Function DrawGripper(ByVal pDC As Long, ByRef recta As RECT)
  765.     ' only draw the gripper if not floating and gripper is specified
  766.     If ((m_dwStyle And (CBRS_GRIPPER Or CBRS_FLOATING)) = CBRS_GRIPPER) Then
  767.  
  768.         ' draw the gripper in the border
  769.         If (m_dwStyle And CBRS_ORIENT_HORZ) <> 0 Then
  770.             Call Draw3dRect(pDC, recta.Left + CX_BORDER_GRIPPER, _
  771.                 recta.Top + m_cyTopBorder, _
  772.                 CX_GRIPPER, (recta.Bottom - recta.Top) - m_cyTopBorder - m_cyBottomBorder, _
  773.                 clrBtnHilite, clrBtnShadow)
  774.         Else
  775.             Call Draw3dRect(pDC, recta.Left + m_cyTopBorder, _
  776.                 recta.Top + CY_BORDER_GRIPPER, _
  777.                 (recta.Right - recta.Left) - m_cyTopBorder - m_cyBottomBorder, CY_GRIPPER, _
  778.                 clrBtnHilite, clrBtnShadow)
  779.         End If
  780.     End If
  781. End Function
  782.  
  783.  
  784. Friend Function OnWindowPosChanging(lpWndPos As WINDOWPOS)
  785.     ' WINBUG: We call DefWindowProc here instead of CWnd::OnWindowPosChanging
  786.     '  (which calls CWnd::Default, which calls through the super wndproc)
  787.     '  because certain control bars that are system implemented (such as
  788.     '  CToolBar with TBSTYLE_FLAT) do not implement WM_WINDOWPOSCHANGING
  789.     '  correctly, causing repaint problems.  This code bypasses that whole
  790.     '  mess.
  791.  
  792.     Call DefWindowProc(m_hWnd, WM_WINDOWPOSCHANGING, 0, VarPtr(lpWndPos))
  793.  
  794.     If (lpWndPos.flags And SWP_NOSIZE) <> 0 Then
  795.         Exit Function
  796.     End If
  797.  
  798.     ' invalidate borders on the right
  799.     Dim recta As RECT
  800.     
  801.     Call GetWindowRect(m_hWnd, recta)
  802.     
  803.     Dim sizePrev  As Size
  804.     sizePrev = CRECTtoSize(recta)
  805.     
  806.     Dim cx As Integer
  807.     cx = lpWndPos.cx
  808.     Dim cy As Integer
  809.     cy = lpWndPos.cy
  810.     
  811.     If ((cx <> sizePrev.cx) And ((m_dwStyle And CBRS_BORDER_RIGHT) <> 0)) Then
  812.         Call SetRect(recta, cx - cxBorder2, 0, cx, cy)
  813.         Call InvalidateRect(m_hWnd, recta, True)
  814.         Call SetRect(recta, sizePrev.cx - cxBorder2, 0, sizePrev.cx, cy)
  815.         Call InvalidateRect(m_hWnd, recta, True)
  816.     End If
  817.  
  818.     ' invalidate borders on the bottom
  819.     If ((cy <> sizePrev.cy) And ((m_dwStyle And CBRS_BORDER_BOTTOM) <> 0)) Then
  820.         Call SetRect(recta, 0, cy - cyBorder2, cx, cy)
  821.         Call InvalidateRect(m_hWnd, recta, True)
  822.         Call SetRect(recta, 0, sizePrev.cy - cyBorder2, cx, sizePrev.cy)
  823.         Call InvalidateRect(m_hWnd, recta, True)
  824.     End If
  825. End Function
  826.  
  827.  
  828. Friend Function OnDestroy()
  829.     If Not (m_pDockSite Is Nothing) Then
  830.         Call m_pDockSite.RemoveControlBar(this)
  831.         Set m_pDockSite = Nothing
  832.     End If
  833. End Function
  834.  
  835.  
  836. Friend Function OnLButtonDblClk(nFlags As Long, pt As POINTAPI, Optional obj As CToolbar = Nothing)
  837.     ' only toggle docking if clicked in "void" space
  838.     Dim tmp As tagTOOLINFO
  839.     If (Not (m_pDockBar Is Nothing) And (obj.OnToolHitTest(pt, False, tmp) = -1)) Then
  840.         ' start the drag
  841.         'ASSERT(m_pDockContext != NULL);
  842.         Call m_pDockContext.ToggleDocking
  843.     Else
  844.         'CWnd::OnLButtonDblClk(nFlags, pt);
  845.     End If
  846. End Function
  847.