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 / CDockBar.cls < prev   
Text File  |  2007-02-28  |  23KB  |  742 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 = "CDockBar"
  10. Attribute VB_GlobalNameSpace = False
  11. Attribute VB_Creatable = True
  12. Attribute VB_PredeclaredId = False
  13. Attribute VB_Exposed = False
  14. ' ----------------------------------------------------------------- '
  15. ' Filename: CDockBar.cls
  16. ' Author:   Shaurya Malhotra (shauryamal@gmail.com)
  17. ' Date:     24 February 2007
  18. '
  19. ' Converted from MFC's CDockBar class and adapted to Visual Basic
  20. ' ----------------------------------------------------------------- '
  21.  
  22. Option Explicit
  23.  
  24. Implements CControlBar
  25. Private ControlBar As New CControlBar
  26.  
  27. Private m_rectLayout As RECT
  28.  
  29. '****IMPORTANT : SUBCLASSING DATA****
  30. '***********DO NOT MODIFY!!**********
  31. Private mWndProcOrg As Long
  32. Private mHWndSubClassed As Long
  33. '******END OF SUBCLASSING DATA*******
  34.  
  35. Friend Function CalcFixedLayout(bStretch As Boolean, bHorz As Boolean) As Size
  36.     Dim sizeFixed As Size
  37.     sizeFixed = ControlBar.CalcFixedLayout(bStretch, bHorz)
  38.     
  39.     ' get max size
  40.     Dim sizeMax As Size
  41.     
  42.     If (Not (IsRectEmpty(m_rectLayout) <> 0)) Then
  43.         sizeMax = CSize(m_rectLayout)
  44.     Else
  45.         Dim rectFrame As RECT
  46.         Dim pFrame As CFrame
  47.         Set pFrame = GetParentFrame(ControlBar.hWnd)
  48.         Call GetClientRect(pFrame.m_hWnd, rectFrame)
  49.         sizeMax = CSize(rectFrame)
  50.     End If
  51.  
  52.     ' prepare for layout
  53.     Dim layout As AFX_SIZEPARENTPARAMS
  54.     
  55.     If (m_bLayoutQuery <> 0) Then layout.hDWP = 0 Else _
  56.             layout.hDWP = BeginDeferWindowPos(ControlBar.arrBars.GetSize)
  57.  
  58.     
  59.     Dim pt As POINTAPI
  60.     pt.x = -cxBorder2
  61.     pt.y = -cyBorder2
  62.  
  63.     Dim nWidth As Long
  64.     nWidth = 0
  65.  
  66.     Dim bWrapped As Boolean
  67.     bWrapped = False
  68.  
  69.     ' layout all the control bars
  70.     Dim nPos As Long
  71.     
  72.     For nPos = 0 To (ControlBar.arrBars.GetSize - 1)
  73.         Dim pBar As CToolbar
  74.         Set pBar = ControlBar.GetDockedControlBar(nPos)
  75.  
  76.         Dim pVoid As Object
  77.         Set pVoid = ControlBar.arrBars.GetItem(nPos)
  78.         If Not (pBar Is Nothing) Then
  79.             If (pBar.IsVisible) Then
  80.                 ' get ideal rect for bar
  81.                 Dim dwMode As Long
  82.                 dwMode = 0
  83.  
  84.                 If (((pBar.m_dwStyle And CBRS_SIZE_DYNAMIC) <> 0) And _
  85.                     ((pBar.m_dwStyle And CBRS_FLOATING) <> 0)) Then
  86.                     dwMode = dwMode Or (LM_HORZ Or LM_MRUWIDTH)
  87.                 ElseIf (pBar.m_dwStyle And CBRS_ORIENT_HORZ) <> 0 Then
  88.                     dwMode = dwMode Or (LM_HORZ Or LM_HORZDOCK)
  89.                 Else
  90.                     dwMode = dwMode Or LM_VERTDOCK
  91.                 End If
  92.  
  93.                 Dim sizeBar As Size
  94.                 sizeBar = pBar.CalcDynamicLayout(-1, dwMode)
  95.  
  96.                 Dim recta As RECT
  97.                 recta = CPtRect(pt, sizeBar)
  98.  
  99.                 ' get current rect for bar
  100.                 Dim rectBar As RECT
  101.                 Call GetWindowRect(pBar.m_hWnd, rectBar)
  102.                 Call ScreenToClientRect(m_hWnd, rectBar)
  103.  
  104.                 If (bHorz) Then
  105.                     ' Offset Calculated Rect out to Actual
  106.                     If ((rectBar.Left > recta.Left) And ((Not m_bFloating) <> 0)) <> 0 Then
  107.                         Call OffsetRect(recta, rectBar.Left - recta.Left, 0)
  108.                     End If
  109.  
  110.                     ' If ControlBar goes off the right, then right justify
  111.                     If ((recta.Right > sizeMax.cx) And ((Not m_bFloating) <> 0)) <> 0 Then
  112.                         Dim x As Long
  113.                         x = GetWidth(recta) - cxBorder2
  114.                         x = GetMax(sizeMax.cx - x, pt.x)
  115.                         Call OffsetRect(recta, x - recta.Left, 0)
  116.                     End If
  117.  
  118.                     ' If ControlBar has been wrapped, then left justify
  119.                     If (bWrapped) Then
  120.                         bWrapped = False
  121.                         Call OffsetRect(recta, -(recta.Left + cxBorder2), 0)
  122.  
  123.                     ' If ControlBar is completely invisible, then wrap it
  124.                     ElseIf ((recta.Left >= (sizeMax.cx - cxBorder2)) And _
  125.                         (nPos > 0) And (Not (ControlBar.arrBars.GetItem(nPos - 1) Is Nothing))) <> 0 Then
  126.                         Call ControlBar.arrBars.InsertAt(nPos, Nothing)
  127.                         Set pBar = Nothing
  128.                         Set pVoid = Nothing
  129.                         bWrapped = True
  130.                     End If
  131.                     
  132.                     If (Not bWrapped) Then
  133.                         If (Not IsRectEq(recta, rectBar)) Then
  134.                             If ((Not m_bLayoutQuery) And (Not ((pBar.m_dwStyle And CBRS_FLOATING) <> 0))) Then
  135.                                 pBar.m_pDockContext.m_rectMRUDockPos = recta
  136.                             End If
  137.  
  138.                             Call AfxRepositionWindow(layout, pBar.m_hWnd, recta)
  139.                         End If
  140.  
  141.                         pt.x = recta.Left + sizeBar.cx - cxBorder2
  142.                         nWidth = GetMax(nWidth, sizeBar.cy)
  143.                     End If
  144.                 Else
  145.                     ' Offset Calculated Rect out to Actual
  146.                     If ((rectBar.Top > recta.Top) And (Not m_bFloating)) <> 0 Then
  147.                         Call OffsetRect(recta, 0, rectBar.Top - recta.Top)
  148.                     End If
  149.  
  150.                     ' If ControlBar goes off the bottom, then bottom justify
  151.                     If ((recta.Bottom > sizeMax.cy) And (Not m_bFloating)) <> 0 Then
  152.                         Dim y As Long
  153.                         y = GetHeight(recta) - cyBorder2
  154.                         y = GetMax(sizeMax.cy - y, pt.y)
  155.                         Call OffsetRect(recta, 0, y - recta.Top)
  156.                     End If
  157.  
  158.                     ' If ControlBar has been wrapped, then top justify
  159.                     If (bWrapped) Then
  160.                         bWrapped = False
  161.                         Call OffsetRect(recta, 0, -(recta.Top + cyBorder2))
  162.                     ' If ControlBar is completely invisible, then wrap it
  163.                     ElseIf (nPos > 0) Then
  164.                         If ((recta.Top >= (sizeMax.cy - cyBorder2)) And _
  165.                             Not (ControlBar.arrBars.GetItem(nPos - 1) Is Nothing)) <> 0 Then
  166.  
  167.                             Call ControlBar.arrBars.InsertAt(nPos, Nothing)
  168.                             Set pBar = Nothing
  169.                             Set pVoid = Nothing
  170.                             bWrapped = True
  171.                         End If
  172.                     End If
  173.                     
  174.                     If (Not bWrapped) Then
  175.                         If (Not IsRectEq(recta, rectBar)) Then
  176.                             If ((Not m_bLayoutQuery) And _
  177.                                 (Not ((pBar.m_dwStyle And CBRS_FLOATING) <> 0))) Then
  178.                                 pBar.m_pDockContext.m_rectMRUDockPos = recta
  179.                             End If
  180.                             Call AfxRepositionWindow(layout, pBar.m_hWnd, recta)
  181.                         End If
  182.                         pt.y = recta.Top + sizeBar.cy - cyBorder2
  183.                         nWidth = GetMax(nWidth, sizeBar.cx)
  184.                     End If
  185.                 End If
  186.             End If
  187.  
  188.             If (Not bWrapped) Then
  189.                 ' handle any delay/show hide for the bar
  190.                 Call pBar.RecalcDelayShow(layout)
  191.             End If
  192.         End If
  193.         
  194.         If ((pBar Is Nothing) And (pVoid Is Nothing) And (nWidth <> 0)) Then
  195.             ' end of row because pBar == NULL
  196.             If (bHorz) Then
  197.                 pt.y = pt.y + (nWidth - cyBorder2)
  198.                 sizeFixed.cx = GetMax(sizeFixed.cx, pt.x)
  199.                 sizeFixed.cy = GetMax(sizeFixed.cy, pt.y)
  200.                 pt.x = -cxBorder2
  201.             Else
  202.                 pt.x = pt.x + (nWidth - cxBorder2)
  203.                 sizeFixed.cx = GetMax(sizeFixed.cx, pt.x)
  204.                 sizeFixed.cy = GetMax(sizeFixed.cy, pt.y)
  205.                 pt.y = -cyBorder2
  206.             End If
  207.             nWidth = 0
  208.         End If
  209.     Next nPos
  210.  
  211.     
  212.     If (Not m_bLayoutQuery) <> 0 Then
  213.         ' move and resize all the windows at once!
  214.         If ((layout.hDWP = 0) Or (Not (EndDeferWindowPos(layout.hDWP) <> 0))) Then
  215.             Debug.Print "Warning: DeferWindowPos failed - low system resources."
  216.         End If
  217.     End If
  218.  
  219.     ' adjust size for borders on the dock bar itself
  220.     Call SetRectEmpty(recta)
  221.     Call CalcInsideRect(recta, bHorz)
  222.     If (((Not bStretch) Or (Not bHorz)) And (sizeFixed.cx <> 0)) Then
  223.         sizeFixed.cx = sizeFixed.cx + (-recta.Right + recta.Left)
  224.     End If
  225.  
  226.     If (((Not bStretch) Or bHorz) And (sizeFixed.cy <> 0)) Then
  227.         sizeFixed.cy = sizeFixed.cy + (-recta.Bottom + recta.Top)
  228.     End If
  229.  
  230.     CalcFixedLayout = sizeFixed
  231. End Function
  232.  
  233.  
  234. Private Property Set CControlBar_arrBars(ByVal RHS As CPtrArray)
  235. '
  236. End Property
  237.  
  238. Private Property Get CControlBar_arrBars() As CPtrArray
  239. '
  240. End Property
  241.  
  242. Private Property Let CControlBar_bAutoDelete(ByVal RHS As Boolean)
  243. '
  244. End Property
  245.  
  246. Private Property Get CControlBar_bAutoDelete() As Boolean
  247. '
  248. End Property
  249.  
  250. Private Property Let CControlBar_bFloating(ByVal RHS As Boolean)
  251. '
  252. End Property
  253.  
  254. Private Property Get CControlBar_bFloating() As Boolean
  255. '
  256. End Property
  257.  
  258. Private Property Let CControlBar_bLayoutQuery(ByVal RHS As Boolean)
  259. '
  260. End Property
  261.  
  262. Private Property Get CControlBar_bLayoutQuery() As Boolean
  263. '
  264. End Property
  265.  
  266. Private Function CControlBar_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
  267. '
  268. End Function
  269.  
  270. Private Property Let CControlBar_cxDefaultGap(ByVal RHS As Long)
  271. '
  272. End Property
  273.  
  274. Private Property Get CControlBar_cxDefaultGap() As Long
  275. '
  276. End Property
  277.  
  278. Private Property Get CControlBar_cxLeftBorder() As Long
  279. '
  280. End Property
  281.  
  282. Private Property Let CControlBar_cxLeftBorder(ByVal RHS As Long)
  283. '
  284. End Property
  285.  
  286. Private Property Let CControlBar_cxRightBorder(ByVal RHS As Long)
  287. '
  288. End Property
  289.  
  290. Private Property Get CControlBar_cxRightBorder() As Long
  291. '
  292. End Property
  293.  
  294. Private Property Let CControlBar_cyBottomBorder(ByVal RHS As Long)
  295. '
  296. End Property
  297.  
  298. Private Property Get CControlBar_cyBottomBorder() As Long
  299. '
  300. End Property
  301.  
  302. Private Property Let CControlBar_cyTopBorder(ByVal RHS As Long)
  303. '
  304. End Property
  305.  
  306. Private Property Get CControlBar_cyTopBorder() As Long
  307. '
  308. End Property
  309.  
  310. Private Property Let CControlBar_dwDockStyle(ByVal RHS As Long)
  311. '
  312. End Property
  313.  
  314. Private Property Get CControlBar_dwDockStyle() As Long
  315. '
  316. End Property
  317.  
  318. Private Property Let CControlBar_dwStyle(ByVal RHS As Long)
  319.     m_dwStyle = RHS
  320. End Property
  321.  
  322. Private Property Let m_dwStyle(ByVal RHS As Long)
  323.     ControlBar.dwStyle = RHS
  324. End Property
  325.  
  326. Public Property Get m_dwStyle() As Long
  327.     m_dwStyle = ControlBar.dwStyle
  328. End Property
  329.  
  330. Private Property Get CControlBar_dwStyle() As Long
  331.     CControlBar_dwStyle = m_dwStyle()
  332. End Property
  333.  
  334. Public Property Get m_hWnd() As Long
  335.     m_hWnd = ControlBar.hWnd
  336. End Property
  337.  
  338. Private Property Get CControlBar_hWnd() As Long
  339.     CControlBar_hWnd = ControlBar.hWnd
  340. End Property
  341.  
  342. Public Function CControlBar_IsVisible() As Boolean
  343.     CControlBar_IsVisible = ControlBar.IsVisible
  344. End Function
  345.  
  346. Private Property Let CControlBar_nCount(ByVal RHS As Long)
  347. '
  348. End Property
  349.  
  350. Private Property Get CControlBar_nCount() As Long
  351. '
  352. End Property
  353.  
  354. Private Property Let CControlBar_nMRUWidth(ByVal RHS As Long)
  355. '
  356. End Property
  357.  
  358. Private Property Get CControlBar_nMRUWidth() As Long
  359. '
  360. End Property
  361.  
  362. Private Property Let CControlBar_nStateFlags(ByVal RHS As Long)
  363. '
  364. End Property
  365.  
  366. Private Property Get CControlBar_nStateFlags() As Long
  367. '
  368. End Property
  369.  
  370. Private Property Let CControlBar_pDockContext(ByVal RHS As CDockContext)
  371. '
  372. End Property
  373.  
  374. Private Property Get CControlBar_pDockContext() As CDockContext
  375. '
  376. End Property
  377.  
  378.  
  379. Private Function CalcInsideRect(ByRef recta As RECT, bHorz As Boolean)
  380.     Call ControlBar.CalcInsideRect(recta, bHorz)
  381. End Function
  382.  
  383.  
  384. Public Function SetBarStyle(dwStyle_param As Long)
  385.     If (m_dwStyle <> dwStyle_param) Then
  386.         Dim dwOldStyle As Long
  387.         dwOldStyle = m_dwStyle
  388.         m_dwStyle = dwStyle_param
  389.         Call OnBarStyleChange(dwOldStyle, dwStyle_param)
  390.     End If
  391. End Function
  392.  
  393. Private Function CControlBar_SetBarStyle(dwStyle_param As Long)
  394.     Call SetBarStyle(dwStyle_param)
  395. End Function
  396.  
  397.  
  398. Private Function OnBarStyleChange(dwOldStyle As Long, dwNewStyle As Long)
  399. '
  400. End Function
  401.  
  402.  
  403. Private Property Let CControlBar_hWndOwner(ByVal RHS As Long)
  404.     ControlBar.hWndOwner = RHS
  405. End Property
  406.  
  407. Private Property Get CControlBar_hWndOwner() As Long
  408.     CControlBar_hWndOwner = ControlBar.hWndOwner
  409. End Property
  410.  
  411. Public Property Let m_hWndOwner(ByVal RHS As Long)
  412.     CControlBar_hWndOwner = RHS
  413. End Property
  414.  
  415. Public Property Get m_hWndOwner() As Long
  416.     CControlBar_hWndOwner = CControlBar_hWndOwner
  417. End Property
  418.  
  419.  
  420. Private Property Let CControlBar_pDockSite(ByVal RHS As CFrame)
  421.     ControlBar.pDockSite = RHS
  422. End Property
  423.  
  424. Private Property Get CControlBar_pDockSite() As CFrame
  425.     Set CControlBar_pDockSite = ControlBar.pDockSite
  426. End Property
  427.  
  428. Public Property Let m_pDockSite(RHS As CFrame)
  429.     CControlBar_pDockSite = RHS
  430. End Property
  431. Public Property Get m_pDockSite() As CFrame
  432.     Set m_pDockSite = CControlBar_pDockSite
  433. End Property
  434.  
  435. Private Property Let CControlBar_pDockBar(ByVal RHS As CDockBar)
  436.     ControlBar.pDockBar = RHS
  437. End Property
  438.  
  439. Private Property Get CControlBar_pDockBar() As CDockBar
  440.     Set CControlBar_pDockBar = ControlBar.pDockBar
  441. End Property
  442.  
  443. Public Property Let m_pDockBar(RHS As CDockBar)
  444.     CControlBar_pDockBar = RHS
  445. End Property
  446.  
  447. Public Property Get m_pDockBar() As CDockBar
  448.     Set m_pDockBar = CControlBar_pDockBar
  449. End Property
  450.  
  451. Public Function Create(pParentWnd As Long, dwStyle As Long, nID As Long) As Boolean
  452.     ' save the style
  453.     m_dwStyle = (dwStyle And CBRS_ALL)
  454.     
  455.     'VERIFY(AfxDeferRegisterClass(AFX_WNDCONTROLBAR_REG));
  456.  
  457.     ' create the HWND
  458.     Dim recta As RECT
  459.     Call SetRectEmpty(recta)
  460.  
  461.     ' Note: Parent must resize itself for control bar to be resized
  462.     Create = ControlBar.Create(afxWndControlBar, "", dwStyle, recta, pParentWnd, nID)
  463.  
  464.     If Create = True Then
  465.         Call Subclass
  466.         Call ControlBar.OnCreate(this)
  467.     End If
  468. End Function
  469.  
  470.  
  471.  
  472. Friend Function WindowPROC(ByVal hWnd As Long, _
  473.          ByVal uMsg As Long, ByVal wParam As Long, _
  474.          lParam As Long) As Long
  475.  
  476.     Select Case uMsg
  477.         Case WM_DESTROY
  478.             Call ControlBar.OnDestroy
  479.             WindowPROC = 0
  480.  
  481.         Case WM_NCPAINT
  482.             Call EraseNonClient
  483.             WindowPROC = 0
  484.  
  485.         Case WM_NCCALCSIZE
  486.             Dim b As Boolean
  487.             If wParam <> 0 Then b = True Else b = False
  488.             Call OnNcCalcSize(b, lParam)
  489.  
  490.         ' No point putting WM_CREATE here, because this control was
  491.         ' subclassed AFTER it was created
  492.         ' Instead call OnCreate from the function 'Create'
  493.         'Case WM_CREATE
  494.         '    WindowPROC = OnCreate
  495.  
  496.         Case WM_SIZEPARENT
  497.             Dim tmp As AFX_SIZEPARENTPARAMS
  498.             Call CopyMemory(tmp, lParam, Len(tmp))
  499.             WindowPROC = OnSizeParent(wParam, tmp)
  500.             Call CopyMemory(lParam, tmp, Len(tmp))
  501.  
  502.         Case Else
  503.             WindowPROC = DefWindowProc(hWnd, uMsg, wParam, lParam)
  504.     End Select
  505.  
  506. End Function
  507.  
  508.  
  509. Private Sub Subclass()
  510.     If mWndProcOrg Then Exit Sub
  511.  
  512.     mWndProcOrg = SetWindowLong(m_hWnd, GWL_WNDPROC, AddressOf DB_SubWndProc)
  513.     mHWndSubClassed = m_hWnd
  514.  
  515.     Call SetWindowLong(m_hWnd, GWL_USERDATA, ObjPtr(Me))
  516. End Sub
  517.  
  518.  
  519. Private Sub UnSubClass()
  520.     If mWndProcOrg = 0 Then Exit Sub
  521.     SetWindowLong mHWndSubClassed, GWL_WNDPROC, mWndProcOrg
  522.     mWndProcOrg = 0
  523. End Sub
  524.    
  525.  
  526. Private Sub Class_Initialize()
  527.     Call Initialize
  528. End Sub
  529.  
  530. Private Sub Class_Terminate()
  531.     Call UnSubClass
  532. End Sub
  533.  
  534. Private Function OnSizeParent(wParam As Long, ByRef lParam As AFX_SIZEPARENTPARAMS) As Long
  535.     Dim lpLayout As AFX_SIZEPARENTPARAMS
  536.     lpLayout = lParam
  537.  
  538.     ' set m_bLayoutQuery to TRUE if lpLayout->hDWP == NULL
  539.     Dim bLayoutQuery As Boolean
  540.     bLayoutQuery = m_bLayoutQuery
  541.  
  542.     Dim rectLayout As RECT
  543.     rectLayout = m_rectLayout
  544.  
  545.     m_bLayoutQuery = CBool(lpLayout.hDWP = 0)
  546.  
  547.     m_rectLayout = lpLayout.recta
  548.  
  549.     Dim lResult As Long
  550.     lResult = ControlBar.OnSizeParent(wParam, lParam, this)
  551.     ' restore m_bLayoutQuery
  552.     m_bLayoutQuery = bLayoutQuery
  553.  
  554.     m_rectLayout = rectLayout
  555.  
  556.     OnSizeParent = lResult
  557. End Function
  558.  
  559.  
  560. Private Property Get this() As CDockBar
  561.    Set this = Me
  562. End Property
  563.  
  564. Public Property Get IsDockBar() As Boolean
  565.     IsDockBar = True
  566. End Property
  567.  
  568. Public Property Get IsWindowVisible() As Boolean
  569.     IsWindowVisible = CBool(Globals.IsWindowVisible(m_hWnd))
  570. End Property
  571.  
  572. Public Property Get m_bFloating() As Boolean
  573.     m_bFloating = ControlBar.bFloating
  574. End Property
  575.  
  576. Public Property Let m_bFloating(RHS As Boolean)
  577.     ControlBar.bFloating = RHS
  578. End Property
  579.  
  580. Public Property Get m_bLayoutQuery() As Boolean
  581.     m_bLayoutQuery = ControlBar.bLayoutQuery
  582. End Property
  583. Public Property Let m_bLayoutQuery(RHS As Boolean)
  584.     ControlBar.bLayoutQuery = RHS
  585. End Property
  586.  
  587. Friend Function DockControlBar(pBar As CToolbar, lpRect As RECT)
  588.     'ASSERT_VALID(this);
  589.     'ASSERT_VALID(pBar);
  590.     'ASSERT_KINDOF(CControlBar, pBar);
  591.  
  592.     Dim rectBar As RECT
  593.     Call GetWindowRect(pBar.m_hWnd, rectBar)
  594.     
  595.     If Not (pBar.m_pDockBar Is Nothing) Then
  596.         If ((pBar.m_pDockBar.m_hWnd = this.m_hWnd) And CBool(IsRectEmpty(lpRect)) Or IsRectEq(rectBar, lpRect)) Then
  597.             ' already docked and no change in position
  598.             Exit Function
  599.         End If
  600.     End If
  601.  
  602.     ' set CBRS_FLOAT_MULTI style if docking bar has it
  603.     If (m_bFloating And ((pBar.m_dwDockStyle And CBRS_FLOAT_MULTI) <> 0)) Then
  604.         m_dwStyle = m_dwStyle Or CBRS_FLOAT_MULTI
  605.     End If
  606.  
  607.     m_dwStyle = m_dwStyle And (Not (CBRS_SIZE_FIXED Or CBRS_SIZE_DYNAMIC))
  608.     
  609.     m_dwStyle = m_dwStyle Or pBar.m_dwStyle And (CBRS_SIZE_FIXED Or CBRS_SIZE_DYNAMIC)
  610.  
  611.     If Not ((m_dwStyle And CBRS_FLOAT_MULTI) <> 0) Then
  612.         'TCHAR szTitle[_MAX_PATH];
  613.         'pBar->GetWindowText(szTitle, _countof(szTitle));
  614.         'AfxSetWindowText(m_hWnd, szTitle);
  615.         Dim szTitle As String
  616.         szTitle = Space(260)
  617.         Call GetWindowText(pBar.m_hWnd, szTitle, MAX_PATH_)
  618.         Call SetWindowText(m_hWnd, szTitle)
  619.     End If
  620.  
  621.     ' align correctly and turn on all borders
  622.     Dim dwStyle As Long
  623.     dwStyle = pBar.GetBarStyle()
  624.     dwStyle = dwStyle And (Not (CBRS_ALIGN_ANY))
  625.     dwStyle = dwStyle Or (m_dwStyle And CBRS_ALIGN_ANY) Or CBRS_BORDER_ANY
  626.  
  627.     If (m_bFloating) Then
  628.         dwStyle = dwStyle Or CBRS_FLOATING
  629.     Else
  630.         dwStyle = dwStyle And (Not CBRS_FLOATING)
  631.     End If
  632.  
  633.     Call pBar.SetBarStyle(dwStyle)
  634.  
  635.     ' hide first if changing to a new docking site to avoid flashing
  636.     Dim bShow As Boolean
  637.     bShow = False
  638.  
  639.     If Not (pBar.m_pDockBar Is Nothing) Then
  640.         If ((pBar.m_pDockBar.m_hWnd <> this.m_hWnd) And pBar.IsWindowVisible()) Then
  641.             Call pBar.SetWindowPos(0, 0, 0, 0, 0, _
  642.                 SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOZORDER Or SWP_NOACTIVATE Or SWP_HIDEWINDOW)
  643.             bShow = True
  644.         End If
  645.     End If
  646.  
  647.     Dim nPos As Long
  648.     nPos = -1
  649.     If Not (CBool(IsRectEmpty(lpRect))) Then
  650.         ' insert into appropriate row
  651.         Dim recta As RECT
  652.         Call CopyRect(recta, lpRect)
  653.         Call ScreenToClientRect(Me.m_hWnd, recta)
  654.         Dim ptMid As POINTAPI
  655.         ptMid.x = (recta.Left + (GetWidth(recta) / 2))
  656.         ptMid.y = (recta.Top + (GetHeight(recta) / 2))
  657.         
  658.         nPos = Insert(pBar, recta, ptMid)
  659.  
  660.         ' position at requested position
  661.         Call pBar.SetWindowPos(0, recta.Left, recta.Top, GetWidth(recta), _
  662.             GetHeight(recta), SWP_NOZORDER Or SWP_NOACTIVATE Or SWP_NOCOPYBITS)
  663.     Else
  664.         ' always add on current row, then create new one
  665.         ControlBar.arrBars.Add pBar
  666.         ControlBar.arrBars.Add Nothing
  667.  
  668.         ' align off the edge initially
  669.         Call pBar.SetWindowPos(0, -cxBorder2, -cyBorder2, 0, 0, _
  670.             SWP_NOSIZE Or SWP_NOZORDER Or SWP_NOACTIVATE Or SWP_NOCOPYBITS)
  671.     End If
  672.  
  673.     ' attach it to the docking site
  674.     If (pBar.GetParent() <> this.m_hWnd) Then
  675.         Call pBar.SetParent(this.m_hWnd)
  676.     End If
  677.     
  678.     If Not (pBar.m_pDockBar Is Nothing) Then
  679.         If (pBar.m_pDockBar.m_hWnd = this.m_hWnd) Then
  680.             Call pBar.m_pDockBar.RemoveControlBar(pBar, nPos)
  681.         ElseIf Not (pBar.m_pDockBar Is Nothing) Then
  682.             Call pBar.m_pDockBar.RemoveControlBar(pBar, -1, IIf((m_bFloating And (Not (pBar.m_pDockBar.m_bFloating))), 1, 0))
  683.         End If
  684.     End If
  685.  
  686.     pBar.m_pDockBar = this
  687.  
  688.     If (bShow) Then
  689.         'ASSERT(!pBar->IsWindowVisible());
  690.         Call pBar.SetWindowPos(0, 0, 0, 0, 0, _
  691.             SWP_NOSIZE Or SWP_NOMOVE Or SWP_NOZORDER Or SWP_NOACTIVATE Or SWP_SHOWWINDOW)
  692.     End If
  693.  
  694.     ' remove any place holder for pBar in this dockbar
  695.     Call RemovePlaceHolder(pBar)
  696.  
  697.     ' get parent frame for recalc layout
  698.     Dim pFrameWnd As Object
  699.     Set pFrameWnd = GetDockingFrame()
  700.  
  701.     If TypeName(pFrameWnd) = "CFrame" Then
  702.         Dim t1 As CFrame
  703.         Set t1 = pFrameWnd
  704.         Call t1.DelayRecalcLayout
  705.     ElseIf TypeName(pFrameWnd) = "CMiniDockFrameWnd" Then
  706.         Dim t2 As CMiniDockFrameWnd
  707.         Set t2 = pFrameWnd
  708.         Call t2.DelayRecalcLayout
  709.     End If
  710. End Function
  711.  
  712.  
  713. Friend Function GetDockedCount() As Integer
  714.     Dim nCount As Integer
  715.     nCount = 0
  716.     
  717.     Dim i As Long
  718.     For i = 0 To ControlBar.arrBars.GetSize - 1
  719.         If (Not (ControlBar.GetDockedControlBar(i) Is Nothing)) Then
  720.             nCount = nCount + 1
  721.         End If
  722.     Next i
  723.     
  724.     GetDockedCount = nCount
  725. End Function
  726.  
  727.  
  728. Public Property Get GetParent()
  729. '
  730. End Property
  731.  
  732.  
  733.  
  734.  
  735.  
  736. Private Function Insert(pBarIns As Object, recta As RECT, ptMid As POINTAPI) As Long
  737.     ) As Long
  738.     ) As Long
  739.     ) Alfauno ) As Long
  740.  seCent()
  741. '
  742. E