ExtControlBar.cpp
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:775k
源码类别:

界面编程

开发平台:

Visual C++

  1. {
  2. CRect rcArea = *pBtn;
  3. CRect rcDefOffsetWnd;
  4. GetWindowRect( &rcDefOffsetWnd );
  5. rcArea.OffsetRect( rcDefOffsetWnd.TopLeft() );
  6. OnAdvancedPopupMenuTipWndDisplay(
  7. *pATTW,
  8. rcArea,
  9. _ti.lpszText
  10. );
  11. }
  12. }
  13. if( _ti.lpszText != NULL
  14. && _ti.lpszText != LPSTR_TEXTCALLBACK
  15. )
  16. ::free( _ti.lpszText );
  17. }
  18. }
  19. break;
  20. case WM_PRINT:
  21. case WM_PRINTCLIENT:
  22. {
  23. CDC * pDC = CDC::FromHandle( (HDC) wParam );
  24. CRect rcRgnWnd, rcRgnClient;
  25. GetWindowRect( &rcRgnWnd );
  26. GetClientRect( &rcRgnClient );
  27. if( IsFloating() )
  28. {
  29. CRect rcFloatClient;
  30. GetParentFrame()->GetClientRect( &rcFloatClient );
  31. if( rcRgnClient.Width() > rcFloatClient.Width() )
  32. rcRgnClient.right = rcRgnClient.left + rcFloatClient.Width();
  33. if( rcRgnClient.Height() > rcFloatClient.Height() )
  34. rcRgnClient.bottom = rcRgnClient.top + rcFloatClient.Height();
  35. }
  36. if( (lParam&PRF_NONCLIENT) != 0 )
  37. {
  38. CRect rcWnd = rcRgnWnd, rcClient = rcRgnClient;
  39. ClientToScreen( &rcClient );
  40. rcClient.OffsetRect( -rcWnd.TopLeft() );
  41. rcWnd.OffsetRect( -rcWnd.TopLeft() );
  42. CRgn rgnWnd;
  43. if( rgnWnd.CreateRectRgnIndirect(&rcWnd) )
  44. pDC->SelectClipRgn( &rgnWnd );
  45. pDC->ExcludeClipRect( &rcClient );
  46. DoPaintNC( pDC );
  47. pDC->SelectClipRgn( NULL );
  48. }
  49. if( (lParam&(PRF_CLIENT|PRF_ERASEBKGND)) != 0 )
  50. {
  51. CPoint ptVpOffset( 0, 0 );
  52. if( (lParam&PRF_NONCLIENT) != 0 )
  53. {
  54. CRect rcWnd = rcRgnWnd, rcClient = rcRgnClient;
  55. ClientToScreen( &rcClient );
  56. ptVpOffset.x = rcWnd.left - rcClient.left;
  57. ptVpOffset.y = rcWnd.top - rcClient.top;
  58. }
  59. if( ptVpOffset.x != 0
  60. || ptVpOffset.y != 0
  61. )
  62. pDC->OffsetViewportOrg(
  63. -ptVpOffset.x,
  64. -ptVpOffset.y
  65. );
  66. // DoEraseBk( pDC );
  67. // DoPaint( pDC );
  68. CDC dcSurface;
  69. CBitmap bmpSurface;
  70. CWindowDC dcDesktop( NULL );
  71. if( dcSurface.CreateCompatibleDC( NULL )
  72. && bmpSurface.CreateCompatibleBitmap(
  73. &dcDesktop,
  74. rcRgnClient.Width(),
  75. rcRgnClient.Height()
  76. )
  77. )
  78. {
  79. CBitmap * pOldBmp = dcSurface.SelectObject( &bmpSurface );
  80. DoEraseBk( &dcSurface );
  81. DoPaint( &dcSurface );
  82. pDC->BitBlt(
  83. 0,
  84. 0,
  85. rcRgnClient.Width(),
  86. rcRgnClient.Height(),
  87. &dcSurface,
  88. 0,
  89. 0,
  90. SRCCOPY
  91. );
  92. dcSurface.SelectObject( pOldBmp );
  93. }
  94. if( ptVpOffset.x != 0
  95. || ptVpOffset.y != 0
  96. )
  97. pDC->OffsetViewportOrg(
  98. ptVpOffset.x,
  99. ptVpOffset.y
  100. );
  101. } // if( (lParam&(PRF_CLIENT|PRF_ERASEBKGND)) != 0 )
  102. if( (lParam&PRF_CHILDREN) != 0 )
  103. CExtPaintManager::stat_PrintChildren(
  104. m_hWnd,
  105. message,
  106. pDC->GetSafeHdc(),
  107. lParam,
  108. false
  109. );
  110. }
  111. return (!0);
  112. case WM_TIMER:
  113. // if( wParam == __TIMER_ID_DELAYED_UPDATE )
  114. // {
  115. // CFrameWnd * pFrame = _GetDockingFrameImpl();
  116. // if( pFrame != NULL )
  117. // OnUpdateCmdUI( pFrame, TRUE );
  118. // KillTimer( __TIMER_ID_DELAYED_UPDATE );
  119. // return 0L;
  120. // } // if( wParam == __TIMER_ID_DELAYED_UPDATE )
  121. // else
  122. if( wParam == __TIMER_ID_DRELAYED_REPAINT_FAKE )
  123. {
  124. RedrawWindow(
  125. NULL,
  126. NULL,
  127. RDW_INVALIDATE|RDW_UPDATENOW
  128. |RDW_ERASE|RDW_ERASENOW
  129. |RDW_ALLCHILDREN
  130. |RDW_FRAME
  131. );
  132. KillTimer( __TIMER_ID_DRELAYED_REPAINT_FAKE );
  133. return 0L;
  134. } // if( wParam == __TIMER_ID_DRELAYED_REPAINT_FAKE )
  135. if( AnimationSite_OnHookTimer( UINT(wParam) ) )
  136. return 0L;
  137. break;
  138. case WM_CLOSE:
  139. // emulate for disabling update in user non-frame mode
  140. m_bInCustomModeUpdateCmdUI = true;
  141. return 0;
  142. case WM_DESTROY:
  143. AnimationSite_ClientRemove();
  144. #if (_MFC_VER >= 0x700) && (_MFC_VER <= 0x710)
  145. if( m_pDockSite != NULL
  146. && m_pDockSite->IsKindOf( RUNTIME_CLASS(CMDIChildWnd) )
  147. )
  148. {
  149. CFrameWnd * pFrame = GetParentFrame();
  150. if( pFrame != m_pDockSite )
  151. m_bHelperSuppressDestruction = true;
  152. }
  153. #endif // (_MFC_VER >= 0x700) && (_MFC_VER <= 0x710)
  154. // emulate for disabling update in user non-frame mode
  155. m_bInCustomModeUpdateCmdUI = true;
  156. break;
  157. case WM_NCDESTROY:
  158. AnimationSite_ClientRemove();
  159. if( m_pDockContext != NULL )
  160. {
  161. m_pDockBar = NULL;
  162. delete m_pDockContext;
  163. m_pDockContext = NULL;
  164. }
  165. // emulate for disabling update in user non-frame mode
  166. m_bInCustomModeUpdateCmdUI = true;
  167. NcButtons_RemoveAll();
  168. break;
  169. case WM_SETFOCUS:
  170. {
  171. LRESULT lResult =
  172. CControlBar::WindowProc(message, wParam, lParam);
  173. if( IsMinimizedOnRow() )
  174. MaximizeOnRow();
  175. if( !IsFixedMode() )
  176. {
  177. CWnd * pWnd = GetWindow(GW_CHILD);
  178. if( pWnd != NULL
  179. && stat_QueryFocusChangingEnabled( this, pWnd->m_hWnd )
  180. )
  181. {
  182. pWnd->SetFocus();
  183. //#if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  184. // ASSERT(
  185. // pWnd->GetWindow(GW_HWNDNEXT) == NULL
  186. // || IsKindOf(RUNTIME_CLASS(CExtDynTabControlBar))
  187. // );
  188. //#else
  189. // ASSERT(
  190. // pWnd->GetWindow(GW_HWNDNEXT) == NULL
  191. // );
  192. //#endif // else from (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  193. }
  194. } // if( !IsFixedMode() )
  195. return lResult;
  196. }
  197. case WM_ERASEBKGND:
  198. if( !m_bDoNotEraseClientBackground )
  199. return !0;
  200. CExtPaintManager::stat_ExcludeChildAreas(
  201. (HDC)wParam,
  202. *this
  203. );
  204. return CControlBar::WindowProc(message, wParam, lParam);
  205. case WM_CREATE:
  206. {
  207. if( (!m_bPresubclassDialogMode) && (!IsFixedMode()) )
  208. {
  209. ASSERT( GetSafeHwnd() != NULL );
  210. ASSERT( ::IsWindow(GetSafeHwnd()) );
  211. HWND hWndParent = ::GetParent( GetSafeHwnd() );
  212. CFrameWnd * pFrame = NULL;
  213. do
  214. {
  215. ASSERT( hWndParent != NULL );
  216. ASSERT( ::IsWindow(hWndParent) );
  217. CWnd * pWnd = CWnd::FromHandle( hWndParent );
  218. if( pWnd->IsKindOf(RUNTIME_CLASS(CFrameWnd)) )
  219. {
  220. pFrame = (CFrameWnd *)pWnd;
  221. break;
  222. }
  223. } while( pFrame == NULL );
  224. ASSERT( pFrame != NULL );
  225. ASSERT_VALID( pFrame );
  226. if( pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) )
  227. {
  228. pFrame = pFrame->GetParentFrame();
  229. ASSERT( pFrame != NULL );
  230. ASSERT_VALID( pFrame );
  231. ASSERT( !pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) );
  232. }
  233. VERIFY( _FrameEnableDockingImpl( pFrame ) );
  234. } // if( (!m_bPresubclassDialogMode) && (!IsFixedMode()) )
  235. ////AnimationSite_Init( false );
  236. }
  237. break;
  238. case WM_SHOWWINDOW:
  239. case WM_SIZE:
  240. m_bDelelayRepaintNcButtons = true;
  241. OnControlBarPositionChange(
  242. this,
  243. __ECBPC_MUTUAL_DEPENDENCY,
  244. true,
  245. true
  246. );
  247. break;
  248. case WM_WINDOWPOSCHANGED:
  249. {
  250. CExtPopupMenuTipWnd * pATTW =
  251. OnAdvancedPopupMenuTipWndGet();
  252. if( pATTW != NULL )
  253. pATTW->Hide();
  254. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  255. CExtCustomizeSite * pSite = NotifiedCustomizeSiteGet();
  256. if( pSite != NULL )
  257. pSite->OnBarStateChanged( this );
  258. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  259. if( m_pDockBar == NULL && (!m_bPresubclassDialogMode) )
  260. break; // on destruction
  261. LPWINDOWPOS lpWindowPos = 
  262. reinterpret_cast < LPWINDOWPOS > (lParam);
  263. ASSERT( lpWindowPos != NULL );
  264. if( ! IsFixedMode() )
  265. _UpdateVisibilityInChain();
  266. CExtControlBar * pBar = this;
  267. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  268. CExtDynTabControlBar * pTabBar = _GetNearestTabbedContainer();
  269. if( pTabBar != NULL && pTabBar != this )
  270. pBar = pTabBar;
  271. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  272. pBar->m_bDelelayRepaintNcButtons = true;
  273. pBar->PostMessage( WM_NCPAINT );
  274. if( (lpWindowPos->flags & SWP_FRAMECHANGED) == 0 )
  275. _RecalcNcArea();
  276. OnControlBarPositionChange(
  277. this,
  278. __ECBPC_MUTUAL_DEPENDENCY,
  279. true,
  280. true
  281. );
  282. break;
  283. }
  284. case WM_WINDOWPOSCHANGING:
  285. {
  286. m_bDelelayRepaintNcButtons = true;
  287. if( m_pDockBar == NULL && (!m_bPresubclassDialogMode) )
  288. break; // on destruction
  289. LPWINDOWPOS lpWindowPos = 
  290. reinterpret_cast < LPWINDOWPOS > (lParam);
  291. ASSERT( lpWindowPos != NULL );
  292. lpWindowPos->flags |= SWP_FRAMECHANGED;
  293. break;
  294. }
  295. case WM_SETTEXT:
  296. {
  297. m_bDelelayRepaintNcButtons = true;
  298. LRESULT lResult = CControlBar::WindowProc(message, wParam, lParam);
  299. if( (! IsFixedMode() )
  300. && (! IsKindOf( RUNTIME_CLASS(CExtDynControlBar) ) )
  301. )
  302. {
  303. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  304. if( AutoHideModeGet() )
  305. {
  306. CExtDynAutoHideArea * pTabs =
  307. CExtDynAutoHideArea::stat_FindAreaOfBar( this );
  308. if( pTabs != NULL )
  309. {
  310. ASSERT_VALID( pTabs );
  311. pTabs->UpdateTabWnd();
  312. CExtDynAutoHideSlider * pAutoHideSlider =
  313. pTabs->GetAutoHideSlider();
  314. if( pAutoHideSlider->GetSafeHwnd() != NULL
  315. && (pAutoHideSlider->GetStyle()&WS_VISIBLE) != 0
  316. )
  317. pAutoHideSlider->SendMessage( WM_NCPAINT );
  318. } // if( pTabs != NULL )
  319. } // if( AutoHideModeGet() )
  320. else
  321. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  322. if( IsVisible() )
  323. {
  324. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  325. CWnd * pWnd = GetParent();
  326. bool bRecalcThisNcArea = true;
  327. if( pWnd != NULL
  328. && pWnd->IsKindOf( RUNTIME_CLASS(CExtDockDynTabBar) )
  329. )
  330. {
  331. ASSERT_VALID( pWnd );
  332. pWnd = pWnd->GetParent();
  333. ASSERT_VALID( pWnd );
  334. CExtDynTabControlBar * pTabBar =
  335. DYNAMIC_DOWNCAST(
  336. CExtDynTabControlBar,
  337. pWnd
  338. );
  339. if( pTabBar != NULL )
  340. {
  341. pTabBar->InvalidateSwitcher();
  342. CFrameWnd * pFrame = pTabBar->GetParentFrame();
  343. ASSERT_VALID( pFrame );
  344. pFrame->DelayRecalcLayout();
  345. pFrame->PostMessage( WM_NULL );
  346. LONG nSelIdx = pTabBar->GetSwitcherSelection();
  347. if( nSelIdx >= 0 )
  348. {
  349. CExtControlBar * pBarTest = pTabBar->GetBarAt( nSelIdx, true );
  350. if( pBarTest == this )
  351. {
  352. CString strText;
  353. GetWindowText( strText );
  354. pTabBar->SetWindowText( strText );
  355. } // if( pBarTest == this )
  356. } // if( nSelIdx >= 0 )
  357. ((CExtControlBar*)pTabBar)->_RecalcNcArea();
  358. bRecalcThisNcArea = false;
  359. } // if( pTabBar != NULL )
  360. } // if( pWnd != NULL ...
  361. if( bRecalcThisNcArea )
  362. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  363. _RecalcNcArea();
  364. } // else if( IsVisible() )
  365. } // if( ! IsFixedMode() ...
  366. return lResult;
  367. } // case WM_SETTEXT:
  368. } // switch( message )
  369. return CControlBar::WindowProc(message, wParam, lParam);
  370. }
  371. /////////////////////////////////////////////////////////////////////////////
  372. // CExtControlBar message handlers
  373. void CExtControlBar::NcButtons_Paint( CDC & dc )
  374. {
  375. ASSERT( dc.GetSafeHdc() != NULL );
  376. INT nCountOfNcButtons = NcButtons_GetCount();
  377. for( INT nBtn = 0; nBtn < nCountOfNcButtons; nBtn++ )
  378. {
  379. CExtBarNcAreaButton * pBtn =
  380. NcButtons_GetAt( nBtn );
  381. if( ! pBtn->OnQueryVisibility() )
  382. continue;
  383. pBtn->OnNcAreaDraw( dc );
  384. } // for( INT nBtn = 0; nBtn < nCountOfNcButtons; nBtn++ )
  385. }
  386. CRect & CExtControlBar::NcButtons_CalcGripperTextLocation(
  387. CRect & rcPreCalcText
  388. )
  389. {
  390. INT nCountOfNcButtons = NcButtons_GetCount();
  391. if( nCountOfNcButtons == 0 )
  392. return rcPreCalcText; 
  393. bool bHorz = false;
  394. bool bGripperAtTop = true;
  395. if( ! IsFloating() )
  396. {
  397. if( ! IsBarWithGripper( &bGripperAtTop ) )
  398. return rcPreCalcText;
  399. bHorz = IsDockedHorizontally();
  400. }
  401. // find last visible at right or at bottom
  402. CExtBarNcAreaButton * pBtn = NULL;
  403. for( INT nBtnIdx = nCountOfNcButtons; nBtnIdx > 0 ; nBtnIdx-- )
  404. {
  405. CExtBarNcAreaButton * pBtnExamine =
  406. NcButtons_GetAt( nBtnIdx - 1 );
  407. ASSERT_VALID( pBtnExamine );
  408. if( pBtnExamine->OnQueryVisibility() )
  409. {
  410. pBtn = pBtnExamine;
  411. break;
  412. }
  413. } // for( INT nBtnIdx = nCountOfNcButtons; nBtnIdx > 0 ; nBtnIdx-- )
  414. CRect rcDefalte = PmBridge_GetPM()->Bar_GetCaptionBordersForText( this );
  415. rcPreCalcText.DeflateRect(
  416. rcDefalte.left,
  417. rcDefalte.top,
  418. rcDefalte.right,
  419. rcDefalte.bottom
  420. );
  421. if( pBtn == NULL )
  422. return rcPreCalcText;
  423. // adjust caption text rect
  424. const CRect & rcBtn = *pBtn;
  425. if( bHorz && (! bGripperAtTop ) )
  426. {
  427. rcPreCalcText.top = rcBtn.bottom + 1;
  428. if( rcPreCalcText.top > rcPreCalcText.bottom )
  429. rcPreCalcText.top = rcPreCalcText.bottom;
  430. } // if( bHorz && (! bGripperAtTop ) )
  431. else
  432. {
  433. if( (g_ResourceManager->OnQueryLangLayout()&LAYOUT_RTL) != 0 )
  434. {
  435. rcPreCalcText.left = rcBtn.right + 1;
  436. if( rcPreCalcText.right < rcPreCalcText.left )
  437. rcPreCalcText.right = rcPreCalcText.left;
  438. }
  439. else
  440. {
  441. rcPreCalcText.right = rcBtn.left - 1;
  442. if( rcPreCalcText.left > rcPreCalcText.right )
  443. rcPreCalcText.left = rcPreCalcText.right;
  444. }
  445. } // if( bHorz && (! bGripperAtTop ) )
  446. return rcPreCalcText;
  447. }
  448. UINT CExtControlBar::NcButtons_HitTest(
  449. CPoint point,
  450. CExtBarNcAreaButton ** ppBtn // = NULL
  451. )
  452. {
  453. if( ppBtn != NULL )
  454. *ppBtn = NULL;
  455. bool bNeedRepaint = false;
  456. CWnd * pWndNcRepaint = this;
  457. CRect rcBarWnd;
  458. if( IsFloating() )
  459. {
  460. CExtMiniDockFrameWnd * pFrame =
  461. DYNAMIC_DOWNCAST(
  462. CExtMiniDockFrameWnd,
  463. GetParentFrame()
  464. );
  465. if( pFrame == NULL )
  466. return HTCLIENT;
  467. pFrame->GetWindowRect( &rcBarWnd );
  468. pWndNcRepaint = pFrame;
  469. } // if( IsFloating() )
  470. else
  471. {
  472. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  473. if( AutoHideModeGet() )
  474. {
  475. ASSERT_VALID( m_pDockBar );
  476. ASSERT_KINDOF( CExtDockBar, m_pDockBar );
  477. CExtDynAutoHideArea * pWndAutoHideArea =
  478. ((CExtDockBar*)m_pDockBar)->_GetAutoHideArea();
  479. ASSERT_VALID( pWndAutoHideArea );
  480. ASSERT_VALID( pWndAutoHideArea->m_pWndSlider );
  481. if( pWndAutoHideArea->m_pWndSlider->_GetBar() != this
  482. || ((pWndAutoHideArea->m_pWndSlider->GetStyle() & WS_VISIBLE) == 0)
  483. )
  484. return HTCLIENT;
  485. pWndAutoHideArea->m_pWndSlider->
  486. GetWindowRect( &rcBarWnd );
  487. }
  488. else
  489. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  490. GetWindowRect( &rcBarWnd );
  491. } // else from if( IsFloating() )
  492. CPoint ptDevOffset = -rcBarWnd.TopLeft();
  493. CPoint ptWnd( point + ptDevOffset );
  494. bool bDragging = m_bDragging;
  495. if( !bDragging )
  496. bDragging = (_DraggingGetBar() != NULL) ? true : false;
  497. UINT nFirstHT = HTCLIENT;
  498. if( _DraggingGetBar() == NULL
  499. && (!CExtPopupMenuWnd::IsMenuTracking())
  500. )
  501. {
  502. INT nCountOfNcButtons = NcButtons_GetCount();
  503. for( INT nBtn = 0; nBtn < nCountOfNcButtons; nBtn++ )
  504. {
  505. CExtBarNcAreaButton * pBtn =
  506. NcButtons_GetAt( nBtn );
  507. if( !pBtn->OnQueryVisibility() )
  508. continue;
  509. if( (pBtn->m_bHover || pBtn->m_bPushed)
  510. && ppBtn == NULL
  511. )
  512. {
  513. bNeedRepaint = true;
  514. if( bDragging || m_bRowRecalcing || m_bRowResizing )
  515. {
  516. pBtn->m_bHover = false;
  517. pBtn->m_bPushed = false;
  518. continue;
  519. }
  520. }
  521. UINT nHT =
  522. pBtn->OnNcAreaHitTest( ptWnd );
  523. if( nHT != HTCLIENT )
  524. {
  525. if( ppBtn != NULL )
  526. {
  527. *ppBtn = pBtn;
  528. return nHT;
  529. }
  530. // TO FIX: ASSERT( nFirstHT == HTCLIENT );
  531. nFirstHT = nHT;
  532. bNeedRepaint = true;
  533. }
  534. } // for( INT nBtn = 0; nBtn < nCountOfNcButtons; nBtn++ )
  535. }
  536. if( bNeedRepaint )
  537. pWndNcRepaint->SendMessage( WM_NCPAINT );
  538. return nFirstHT;
  539. }
  540. UINT CExtControlBar::OnNcHitTest(CPoint point) 
  541. {
  542. if( _DraggingGetBar() != NULL )
  543. return HTNOWHERE;
  544. UINT nHT = NcButtons_HitTest( point );
  545. if( nHT != HTCLIENT )
  546. {
  547. m_bNcAreaBtnTracking = true;
  548. return nHT;
  549. }
  550. else
  551. {
  552. if( m_bNcAreaBtnTracking )
  553. PostMessage( WM_NCPAINT );
  554. m_bNcAreaBtnTracking = false;
  555. // if( ( ! CExtPopupMenuWnd::IsKeyPressed( VK_LBUTTON ) )
  556. // && GetSafeHwnd() != NULL
  557. // && ::GetCapture() == m_hWnd
  558. // )
  559. // ::ReleaseCapture();
  560. }
  561. if( IsFixedMode() || IsFloating() )
  562. return HTCLIENT;
  563. CRect rcBarWnd;
  564. GetWindowRect( &rcBarWnd );
  565. CPoint ptDevOffset = -rcBarWnd.TopLeft();
  566. CRect rcBarClient;
  567. GetClientRect( &rcBarClient );
  568. ClientToScreen( &rcBarClient );
  569. if( rcBarWnd == rcBarClient )
  570. return HTCLIENT;
  571. // rcBarWnd.OffsetRect( ptDevOffset );
  572. // rcBarClient.OffsetRect( ptDevOffset );
  573. point += ptDevOffset;
  574. CRect rcRowResize = _RectRowResizeGet();
  575. CRect rcRowRecalc = _RectRowRecalcGet();
  576. CRect rcRowRecalcUp = _RectRowRecalcUpGet();
  577. bool bHorz = IsDockedHorizontally();
  578. if( (! rcRowResize.IsRectEmpty() )
  579. && rcRowResize.PtInRect( point )
  580. )
  581. {
  582. if( ! _RowResizingIsEnabled( this ) )
  583. return HTNOWHERE;
  584. return bHorz ? HTBOTTOM : HTRIGHT;
  585. }
  586. if( (! rcRowRecalc.IsRectEmpty() )
  587. && rcRowRecalc.PtInRect( point )
  588. )
  589. {
  590. if( _IsLastBarInRow( true ) )
  591. return HTNOWHERE; //HTCLIENT;
  592. if( ! _RowRecalcingIsEnabled( this ) )
  593. return HTNOWHERE;
  594. if( !_RowRecalcing_IsBottomEnabled() )
  595. return HTNOWHERE; //HTCLIENT;
  596. return bHorz ? HTRIGHT : HTBOTTOM;
  597. }
  598. if( (! rcRowRecalcUp.IsRectEmpty() )
  599. && rcRowRecalcUp.PtInRect( point )
  600. )
  601. {
  602. if( _IsFirstBarInRow( true ) )
  603. return HTNOWHERE; //HTCLIENT;
  604. if( ! _RowRecalcingIsEnabled( this ) )
  605. return HTNOWHERE;
  606. if( ! _RowRecalcing_IsTopEnabled() )
  607. return HTNOWHERE; //HTCLIENT;
  608. return bHorz ? HTLEFT : HTTOP;
  609. }
  610. return HTCLIENT;
  611. }
  612. void CExtControlBar::_GetDeepNcModeMetrics(
  613. bool & bEnableResizerLeft,
  614. bool & bEnableResizerTop,
  615. bool & bEnableResizerRight,
  616. bool & bEnableResizerBottom
  617. )
  618. {
  619. bEnableResizerLeft = true;
  620. bEnableResizerTop = true;
  621. bEnableResizerRight = true;
  622. bEnableResizerBottom = true;
  623. if( IsFixedMode() )
  624. return;
  625. // if( !IsVisible() )
  626. // return;
  627. if( m_pDockSite == NULL || m_pDockBar == NULL )
  628. {
  629. bEnableResizerLeft = false;
  630. bEnableResizerTop = false;
  631. bEnableResizerRight = false;
  632. bEnableResizerBottom = false;
  633. return;
  634. }
  635. ASSERT_VALID( m_pDockSite );
  636. ASSERT_VALID( m_pDockBar );
  637. if( ! m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockBar)) )
  638. {
  639. bEnableResizerLeft = false;
  640. bEnableResizerTop = false;
  641. bEnableResizerRight = false;
  642. bEnableResizerBottom = false;
  643. return;
  644. }
  645. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  646. if( m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockDynTabBar)) )
  647. {
  648. bEnableResizerLeft = false;
  649. bEnableResizerTop = false;
  650. bEnableResizerRight = false;
  651. bEnableResizerBottom = false;
  652. return;
  653. }
  654. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  655. CExtDockBar * pDockBar = (CExtDockBar *) m_pDockBar;
  656. UINT nDockBarID = pDockBar->GetDlgCtrlID();
  657. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  658. BOOL bHorz = ( nDockBarID == AFX_IDW_DOCKBAR_TOP || nDockBarID == AFX_IDW_DOCKBAR_BOTTOM );
  659. INT nCount = (INT)pDockBar->m_arrBars.GetSize();
  660. ASSERT( nCount >= 1 );
  661. if( nCount == 1 )
  662. return;
  663. INT nOwnIdx = pDockBar->FindBar( this );
  664. if( nOwnIdx == -1 )
  665. return; // destruction
  666. ASSERT( nOwnIdx > 0 && nOwnIdx < nCount );
  667. bool bPrevRowExist = false;
  668. bool bFirstVisibleOnRow = true;
  669. INT nBar = nOwnIdx-1;
  670. for( ; nBar > 0; nBar-- )
  671. {
  672. CControlBar * pBar = (CControlBar *) pDockBar->m_arrBars[nBar];
  673. if( pBar == NULL )
  674. {
  675. if( nBar > 0 )
  676. bPrevRowExist = true;
  677. break;
  678. }
  679. if( __PLACEHODLER_BAR_PTR( pBar ) )
  680. continue;
  681. ASSERT_VALID( pBar );
  682. ASSERT_KINDOF( CControlBar, pBar );
  683. if( pBar->IsVisible() )
  684. bFirstVisibleOnRow = false;
  685. }
  686. bool bPrevVisibleRowExist = false;
  687. if( bPrevRowExist )
  688. {
  689. for( nBar--; nBar > 0; nBar-- )
  690. {
  691. CControlBar * pBar = (CControlBar *) pDockBar->m_arrBars[nBar];
  692. if( pBar == NULL )
  693. continue;
  694. if( __PLACEHODLER_BAR_PTR( pBar ) )
  695. continue;
  696. ASSERT_VALID( pBar );
  697. ASSERT_KINDOF( CControlBar, pBar );
  698. if( pBar->IsVisible() )
  699. {
  700. bPrevVisibleRowExist = true;
  701. break;
  702. }
  703. }
  704. }
  705. bool bNextRowExist = false;
  706. bool bLastVisibleOnRow = true;
  707. for( nBar = nOwnIdx+1; nBar < nCount; nBar++ )
  708. {
  709. CControlBar * pBar = (CControlBar *) pDockBar->m_arrBars[nBar];
  710. if( pBar == NULL )
  711. {
  712. if( nBar < (nCount-1) )
  713. bNextRowExist = true;
  714. break;
  715. }
  716. if( __PLACEHODLER_BAR_PTR( pBar ) )
  717. continue;
  718. ASSERT_VALID( pBar );
  719. ASSERT_KINDOF( CControlBar, pBar );
  720. if( pBar->IsVisible() )
  721. bLastVisibleOnRow = false;
  722. }
  723. bool bNextVisibleRowExist = false;
  724. if( bNextRowExist )
  725. {
  726. for( nBar++; nBar < nCount; nBar++ )
  727. {
  728. CControlBar * pBar = (CControlBar *) pDockBar->m_arrBars[nBar];
  729. if( pBar == NULL )
  730. continue;
  731. if( __PLACEHODLER_BAR_PTR( pBar ) )
  732. continue;
  733. ASSERT_VALID( pBar );
  734. ASSERT_KINDOF( CControlBar, pBar );
  735. if( pBar->IsVisible() )
  736. {
  737. bNextVisibleRowExist = true;
  738. break;
  739. }
  740. }
  741. }
  742. if( m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockDynBar)) )
  743. { // if dockbar is dynamic docker
  744. if( bHorz )
  745. {
  746. if( !bPrevVisibleRowExist )
  747. bEnableResizerTop = false;
  748. /**/ if( !bNextVisibleRowExist )
  749. /**/ bEnableResizerBottom = false;
  750. if( bFirstVisibleOnRow )
  751. bEnableResizerLeft = false;
  752. if( bLastVisibleOnRow )
  753. bEnableResizerRight = false;
  754. } // if( bHorz )
  755. else
  756. {
  757. if( !bPrevVisibleRowExist )
  758. bEnableResizerLeft = false;
  759. /**/ if( !bNextVisibleRowExist )
  760. /**/ bEnableResizerRight = false;
  761. if( bFirstVisibleOnRow )
  762. bEnableResizerTop = false;
  763. if( bLastVisibleOnRow )
  764. bEnableResizerBottom = false;
  765. } // else from if( bHorz )
  766. } // if dockbar is dynamic docker
  767. else
  768. { // if dockbar is static docker
  769. INT nOwnCircleNo = GetDockBarCircleNo();
  770. if( nOwnCircleNo > 0 )
  771. {
  772. switch( nDockBarID )
  773. {
  774. case AFX_IDW_DOCKBAR_TOP:
  775. if( !bPrevVisibleRowExist )
  776. bEnableResizerTop = false;
  777. // if( !bNextVisibleRowExist )
  778. // bEnableResizerBottom = false;
  779. if( bFirstVisibleOnRow )
  780. bEnableResizerLeft = false;
  781. if( bLastVisibleOnRow )
  782. bEnableResizerRight = false;
  783. break;
  784. case AFX_IDW_DOCKBAR_BOTTOM:
  785. // if( !bPrevVisibleRowExist )
  786. // bEnableResizerTop = false;
  787. if( !bNextVisibleRowExist )
  788. bEnableResizerBottom = false;
  789. if( bFirstVisibleOnRow )
  790. bEnableResizerLeft = false;
  791. if( bLastVisibleOnRow )
  792. bEnableResizerRight = false;
  793. break;
  794. case AFX_IDW_DOCKBAR_LEFT:
  795. if( !bPrevVisibleRowExist )
  796. bEnableResizerLeft = false;
  797. // if( !bNextVisibleRowExist )
  798. // bEnableResizerRight = false;
  799. if( bFirstVisibleOnRow )
  800. bEnableResizerTop = false;
  801. if( bLastVisibleOnRow )
  802. bEnableResizerBottom = false;
  803. break;
  804. case AFX_IDW_DOCKBAR_RIGHT:
  805. // if( !bPrevVisibleRowExist )
  806. // bEnableResizerLeft = false;
  807. if( !bNextVisibleRowExist )
  808. bEnableResizerRight = false;
  809. if( bFirstVisibleOnRow )
  810. bEnableResizerTop = false;
  811. if( bLastVisibleOnRow )
  812. bEnableResizerBottom = false;
  813. break;
  814. #ifdef _DEBUG
  815. default:
  816. {
  817. ASSERT( FALSE );
  818. }
  819. break;
  820. #endif // _DEBUG
  821. } // switch( nDockBarID )
  822. } // if( nOwnCircleNo > 0 )
  823. } // if dockbar is static docker
  824. }
  825. void CExtControlBar::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp) 
  826. {
  827. bCalcValidRects;
  828. if( m_pDockBar == NULL && (!m_bPresubclassDialogMode) )
  829. return; // on destruction
  830. CRect & rcClientLoc =
  831. reinterpret_cast < CRect & > ( lpncsp->rgrc[0] );
  832. CRect rcClientLocSaved = rcClientLoc;
  833. if( IsFloating() ) // (+ v.2.22)
  834. {
  835. if( !IsFixedMode() ) // (+ v.2.23)
  836. {
  837. rcClientLoc.DeflateRect( 1, 1 );
  838. return;
  839. }
  840. rcClientLoc.OffsetRect( 0, -rcClientLoc.top );
  841. rcClientLoc.OffsetRect( -rcClientLoc.left, 0 );
  842. return;
  843. }
  844. bool bEnableResizerLeft = true;
  845. bool bEnableResizerTop = true;
  846. bool bEnableResizerRight = true;
  847. bool bEnableResizerBottom = true;
  848. _GetDeepNcModeMetrics(
  849. bEnableResizerLeft,
  850. bEnableResizerTop,
  851. bEnableResizerRight,
  852. bEnableResizerBottom
  853. );
  854. CRect rcDevOrg( rcClientLoc );
  855. CRect rcGrip, rcRowResize, rcRowRecalc, rcRowRecalcUp;
  856. rcGrip.SetRectEmpty();
  857. rcRowResize.SetRectEmpty();
  858. rcRowRecalc.SetRectEmpty();
  859. rcRowRecalcUp.SetRectEmpty();
  860. INT nSeparatorWidth = 0;
  861. INT nSeparatorHeight = 0;
  862. INT nGripWidthAtLeft = 0;
  863. INT nGripHeightAtTop = 0;
  864. CUSTOM_NC_AREA_QUERY_DATA _cnaqd( this );
  865. _cnaqd.Notify();
  866. nSeparatorWidth = _SeparatorWidthGet();
  867. nSeparatorHeight = _SeparatorHeightGet();
  868. nGripWidthAtLeft = _GripperWidthAtLeftGet();
  869. nGripHeightAtTop = _GripperHeightAtTopGet();
  870. m_nMinHW = nSeparatorWidth;
  871. m_nMinVH = nSeparatorHeight;
  872. bool bGripperAtTop = false;
  873. bool bGripperExists = IsBarWithGripper( &bGripperAtTop );
  874. #ifdef _DEBUG
  875. if( IsKindOf( RUNTIME_CLASS( CExtDynControlBar ) ) )
  876. {
  877. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  878. if( !IsKindOf( RUNTIME_CLASS( CExtDynTabControlBar ) ) )
  879. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  880. {
  881. ASSERT( !bGripperExists );
  882. }
  883. }
  884. #endif // _DEBUG
  885. CPoint ptGripOffset( 0, 0 );
  886. UINT nDockBarDlgCtrlID = GetSafeDockBarDlgCtrlID();
  887. if( ! IsFixedMode() )
  888. {
  889. MfcControlBarVector_t vBars;
  890. _GetRowBars( vBars );
  891. int nCountOfnBars = (int)vBars.GetSize();
  892. INT nLastFixedIdx = -1;
  893. CExtControlBar * pLastExtBar = NULL;
  894. bool bAddTopRecalc = false;
  895. for( INT nBar = 0; nBar < nCountOfnBars ; nBar++ )
  896. {
  897. CControlBar * pBar = vBars[ nBar ];
  898. ASSERT_VALID( pBar );
  899. if( !pBar->IsVisible() )
  900. continue;
  901. CExtControlBar * pExtBar =
  902. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  903. if( pExtBar != NULL && pExtBar->IsFixedMode() )
  904. pExtBar = NULL;
  905. if( pExtBar != NULL )
  906. {
  907. if( pExtBar == this
  908. && pLastExtBar != NULL
  909. && nLastFixedIdx == (nBar-1)
  910. )
  911. {
  912. bAddTopRecalc = true;
  913. break;
  914. }
  915. pLastExtBar = pExtBar;
  916. }
  917. else
  918. nLastFixedIdx = nBar;
  919. } // for( INT nBar = 0; nBar < nCountOfnBars ; nBar++ )
  920. switch( nDockBarDlgCtrlID )
  921. {
  922. case AFX_IDW_DOCKBAR_TOP:
  923. if( bEnableResizerRight )
  924. {
  925. rcRowRecalc = rcClientLoc;
  926. rcRowRecalc.OffsetRect( -rcClientLoc.left, -rcClientLoc.top );
  927. rcRowRecalc.left = rcRowRecalc.right - nSeparatorWidth;
  928. rcClientLoc.right -= nSeparatorWidth;
  929. }
  930. if( bEnableResizerBottom )
  931. {
  932. rcClientLoc.DeflateRect( 0, 0, 0, nSeparatorHeight );
  933. rcRowResize = rcClientLoc;
  934. rcRowResize.OffsetRect( -rcClientLoc.left, -rcClientLoc.top );
  935. rcRowResize.top = rcRowResize.bottom;
  936. rcRowResize.bottom += nSeparatorHeight;
  937. rcRowResize.right = rcRowResize.left + rcDevOrg.Width();
  938. }
  939. if( bAddTopRecalc )
  940. {
  941. rcRowRecalcUp = rcClientLoc;
  942. rcRowRecalcUp.OffsetRect( -rcClientLoc.left, -rcClientLoc.top );
  943. rcRowRecalcUp.right = rcRowRecalcUp.left + nSeparatorWidth;
  944. if( bGripperExists )
  945. ptGripOffset.x += nSeparatorWidth;
  946. rcClientLoc.DeflateRect( nSeparatorWidth, 0, 0, 0 );
  947. } // if( bAddTopRecalc )
  948. break;
  949. case AFX_IDW_DOCKBAR_BOTTOM:
  950. if( bEnableResizerRight )
  951. {
  952. rcRowRecalc = rcClientLoc;
  953. rcRowRecalc.OffsetRect( -rcClientLoc.left, -rcClientLoc.top );
  954. rcRowRecalc.left = rcRowRecalc.right - nSeparatorWidth;
  955. rcClientLoc.right -= nSeparatorWidth;
  956. }
  957. if( bEnableResizerTop )
  958. {
  959. rcClientLoc.DeflateRect( 0, nSeparatorHeight, 0, 0 );
  960. rcRowResize = rcClientLoc;
  961. rcRowResize.OffsetRect( -rcClientLoc.left, -rcClientLoc.top );
  962. rcRowResize.bottom = rcRowResize.top + nSeparatorHeight;
  963. rcRowResize.right = rcRowResize.left + rcDevOrg.Width();
  964. if( bGripperExists )
  965. ptGripOffset.y += nSeparatorHeight;
  966. }
  967. if( bAddTopRecalc )
  968. {
  969. rcRowRecalcUp = rcClientLoc;
  970. rcRowRecalcUp.OffsetRect( -rcClientLoc.left, -rcClientLoc.top );
  971. rcRowRecalcUp.right = rcRowRecalcUp.left + nSeparatorWidth;
  972. if( bGripperExists )
  973. ptGripOffset.x += nSeparatorWidth;
  974. rcClientLoc.DeflateRect( nSeparatorWidth, 0, 0, 0 );
  975. } // if( bAddTopRecalc )
  976. break;
  977. case AFX_IDW_DOCKBAR_LEFT:
  978. if( bEnableResizerBottom )
  979. {
  980. rcRowRecalc = rcClientLoc;
  981. rcRowRecalc.OffsetRect( -rcClientLoc.left, -rcClientLoc.top );
  982. rcRowRecalc.top = rcRowRecalc.bottom - nSeparatorHeight;
  983. rcClientLoc.DeflateRect( 0, 0, 0, nSeparatorHeight );
  984. }
  985. if( bEnableResizerRight )
  986. {
  987. rcClientLoc.DeflateRect( 0, 0, nSeparatorHeight, 0 );
  988. rcRowResize = rcClientLoc;
  989. rcRowResize.OffsetRect( -rcClientLoc.left, -rcClientLoc.top );
  990. rcRowResize.left = rcRowResize.right;
  991. rcRowResize.right += nSeparatorWidth;
  992. rcRowResize.bottom = rcRowResize.top + rcDevOrg.Height();
  993. }
  994. if( bAddTopRecalc )
  995. {
  996. rcRowRecalcUp = rcClientLoc;
  997. rcRowRecalcUp.OffsetRect( -rcClientLoc.left, -rcClientLoc.top );
  998. rcRowRecalcUp.bottom = rcRowRecalcUp.top + nSeparatorWidth;
  999. if( bGripperExists )
  1000. ptGripOffset.y += nSeparatorHeight;
  1001. rcClientLoc.DeflateRect( 0, nSeparatorHeight, 0, 0 );
  1002. } // if( bAddTopRecalc )
  1003. break;
  1004. case AFX_IDW_DOCKBAR_RIGHT:
  1005. if( bEnableResizerBottom )
  1006. {
  1007. rcRowRecalc = rcClientLoc;
  1008. rcRowRecalc.OffsetRect( -rcClientLoc.left, -rcClientLoc.top );
  1009. rcRowRecalc.top = rcRowRecalc.bottom - nSeparatorHeight;
  1010. rcClientLoc.DeflateRect( 0, 0, 0, nSeparatorHeight );
  1011. }
  1012. if( bEnableResizerLeft )
  1013. {
  1014. rcClientLoc.DeflateRect( nSeparatorHeight, 0, 0, 0 );
  1015. rcRowResize = rcClientLoc;
  1016. rcRowResize.OffsetRect( -rcClientLoc.left, -rcClientLoc.top );
  1017. rcRowResize.right = rcRowResize.left + nSeparatorWidth;
  1018. rcRowResize.bottom = rcRowResize.top + rcDevOrg.Height();
  1019. if( bGripperExists )
  1020. ptGripOffset.x += nSeparatorWidth;
  1021. }
  1022. if( bAddTopRecalc )
  1023. {
  1024. rcRowRecalcUp = rcClientLoc;
  1025. rcRowRecalcUp.OffsetRect( -rcClientLoc.left, -rcClientLoc.top );
  1026. rcRowRecalcUp.bottom = rcRowRecalcUp.top + nSeparatorWidth;
  1027. if( bGripperExists )
  1028. ptGripOffset.y += nSeparatorHeight;
  1029. rcClientLoc.DeflateRect( 0, nSeparatorHeight, 0, 0 );
  1030. } // if( bAddTopRecalc )
  1031. break;
  1032. } // switch( nDockBarDlgCtrlID )
  1033. } // if( ! IsFixedMode() )
  1034. else
  1035. {
  1036. PmBridge_GetPM()->FixedBar_AdjustClientRect(
  1037. this,
  1038. rcClientLoc
  1039. );
  1040. } // else from if( !IsFixedMode() )
  1041. if( bGripperExists )
  1042. {
  1043. rcGrip = rcClientLoc;
  1044. rcGrip.OffsetRect( -rcClientLoc.left, -rcClientLoc.top );
  1045. if( bGripperAtTop )
  1046. {
  1047. rcGrip.bottom = rcGrip.top + nGripHeightAtTop;
  1048. m_nMinVH += rcGrip.Height();
  1049. if( IsFixedMode() )
  1050. rcGrip.DeflateRect( __BAR_NC_GAP_X, 0 );
  1051. } // if( bGripperAtTop )
  1052. else
  1053. {
  1054. rcGrip.right = rcGrip.left + nGripHeightAtTop;
  1055. m_nMinHW += rcGrip.Width();
  1056. if( IsFixedMode() )
  1057. rcGrip.DeflateRect( 0, __BAR_NC_GAP_Y );
  1058. } // else from if( bGripperAtTop )
  1059. rcGrip.OffsetRect( ptGripOffset );
  1060. if( IsFixedMode() )
  1061. rcGrip.DeflateRect(
  1062. (nDockBarDlgCtrlID == AFX_IDW_DOCKBAR_LEFT)   ? __BAR_NC_GAP_X : 0,
  1063. (nDockBarDlgCtrlID == AFX_IDW_DOCKBAR_TOP)    ? __BAR_NC_GAP_X : 0,
  1064. (nDockBarDlgCtrlID == AFX_IDW_DOCKBAR_RIGHT)  ? __BAR_NC_GAP_X : 0,
  1065. (nDockBarDlgCtrlID == AFX_IDW_DOCKBAR_BOTTOM) ? __BAR_NC_GAP_X : 0
  1066. );
  1067. } // if( bGripperExists )
  1068. OnNcAreaButtonsReinitialize();
  1069. OnNcAreaButtonsReposition();
  1070. if( bGripperExists )
  1071. {
  1072. rcClientLoc.DeflateRect(
  1073. bGripperAtTop
  1074. ? 0
  1075. : nGripWidthAtLeft  + __BAR_NC_GAP_X
  1076. ,
  1077. bGripperAtTop
  1078. ? nGripHeightAtTop  + __BAR_NC_GAP_Y
  1079. : 0
  1080. ,
  1081. 0,
  1082. 0
  1083. );
  1084. } // if( bGripperExists )
  1085. // if( !IsKindOf(RUNTIME_CLASS(CExtDynControlBar)) )
  1086. // rcClientLoc.DeflateRect( __BAR_NC_GAP_X, __BAR_NC_GAP_Y );
  1087. if( rcClientLoc.bottom < rcClientLoc.top )
  1088. rcClientLoc.bottom = rcClientLoc.top;
  1089. if( rcClientLoc.right < rcClientLoc.left )
  1090. rcClientLoc.right = rcClientLoc.left;
  1091. _RectGripSet( rcGrip );
  1092. _RectRowResizeSet( rcRowResize );
  1093. _RectRowRecalcSet( rcRowRecalc );
  1094. _RectRowRecalcUpSet( rcRowRecalcUp );
  1095. }
  1096. void CExtControlBar::OnNcPaint() 
  1097. {
  1098. // if( m_pDockBar == NULL
  1099. // && (!m_bPresubclassDialogMode)
  1100. // )
  1101. // return; // on destruction
  1102. if( m_bDelelayRepaintNcButtons )
  1103. {
  1104. m_bDelelayRepaintNcButtons = false;
  1105. OnNcAreaButtonsReposition();
  1106. }
  1107. #if (defined __DEBUG_PAINTING_AREAS_EXTRESIZABLEBAR__)
  1108. CRect rcBarWnd, rcBarClient;
  1109. GetWindowRect( &rcBarWnd );
  1110. GetClientRect( &rcBarClient );
  1111. ClientToScreen( &rcBarClient );
  1112. if( rcBarWnd == rcBarClient )
  1113. return;
  1114. CPoint ptDevOffset = -rcBarWnd.TopLeft();
  1115. rcBarWnd.OffsetRect( ptDevOffset );
  1116. rcBarClient.OffsetRect( ptDevOffset );
  1117. CWindowDC dcBarWnd( this );
  1118. ASSERT( dcBarWnd.GetSafeHdc() != NULL );
  1119. dcBarWnd.ExcludeClipRect( &rcBarClient );
  1120. CDC & dc = dcBarWnd;
  1121. dc.FillSolidRect( &rcBarWnd, PmBridge_GetPM()->GetColor( COLOR_3DFACE, this ) );
  1122. bool bGripperAtTop = false;
  1123. bool bGripperExists = IsBarWithGripper( &bGripperAtTop );
  1124. if( bGripperExists )
  1125. {
  1126. CRect rcGrip = _RectGripGet();
  1127. // ASSERT( ! rcGrip.IsRectEmpty() );
  1128. CExtSafeString sWndText;
  1129. OnGetBarCaptionText( __EBCT_SINGLE_CAPTION_DOCKED, sWndText );
  1130. dc.FillSolidRect( &rcGrip, PmBridge_GetPM()->GetColor( COLOR_HIGHLIGHT, this ) );
  1131. if( !sWndText.IsEmpty() )
  1132. {
  1133. CRect rcGripText( rcGrip );
  1134. rcGripText.DeflateRect( 2, 2 );
  1135. HFONT hOldFont = (HFONT)
  1136. ::SelectObject(
  1137. dc.GetSafeHdc(),
  1138. ::GetStockObject(DEFAULT_GUI_FONT)
  1139. );
  1140. COLORREF clrTextOld =
  1141. dc.SetTextColor( PmBridge_GetPM()->GetColor( COLOR_HIGHLIGHTTEXT, this ) );
  1142. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  1143. dc.DrawText(
  1144. sWndText,
  1145. &rcGripText,
  1146. DT_LEFT|DT_VCENTER|DT_END_ELLIPSIS
  1147. );
  1148. dc.SetBkMode( nOldBkMode );
  1149. dc.SetTextColor( clrTextOld );
  1150. ::SelectObject(
  1151. dc.GetSafeHdc(),
  1152. hOldFont
  1153. );
  1154. }
  1155. } // if( bGripperExists )
  1156. CRect rcRowResize = _RectRowResizeGet();
  1157. CRect rcRowRecalc = _RectRowRecalcGet();
  1158. CRect rcRowRecalcUp = _RectRowRecalcUpGet();
  1159. if( ! rcRowResize.IsRectEmpty() )
  1160. dc.FillSolidRect( &rcRowResize, RGB(255,0,0) );
  1161. if( ! rcRowRecalc.IsRectEmpty() )
  1162. dc.FillSolidRect( &rcRowRecalc, RGB(0,255,0) );
  1163. if( ! rcRowRecalcUp.IsRectEmpty() )
  1164. dc.FillSolidRect( &rcRowRecalcUp, RGB(0,0,255) );
  1165. if( IsBarWithGripper() && !IsFloating() )
  1166. NcButtons_Paint( dc );
  1167. #else // __DEBUG_PAINTING_AREAS_EXTRESIZABLEBAR__
  1168. CWindowDC dc( this );
  1169. CRect rcClient, rcBar;
  1170. GetClientRect( rcClient );
  1171. ClientToScreen( rcClient );
  1172. GetWindowRect( rcBar );
  1173. rcClient.OffsetRect( -rcBar.TopLeft() );
  1174. rcBar.OffsetRect( -rcBar.TopLeft() );
  1175. dc.ExcludeClipRect( rcClient );
  1176. CExtMemoryDC mdc( &dc, &rcBar );
  1177. CUSTOM_NC_AREA_QUERY_DATA _cnaqd( this, mdc.GetSafeHdc() );
  1178. if( ! _cnaqd.Notify() )
  1179. DoPaintNC( &mdc );
  1180. mdc.__Flush();
  1181. ReleaseDC( &dc );
  1182. PmBridge_GetPM()->OnPaintSessionComplete( this );
  1183. #endif // ! __DEBUG_PAINTING_AREAS_EXTRESIZABLEBAR__
  1184. }
  1185. void CExtControlBar::DoPaintNC( CDC * pDC )
  1186. {
  1187. ASSERT_VALID( this );
  1188. ASSERT_VALID( pDC );
  1189. ASSERT( pDC->GetSafeHdc() != NULL );
  1190. CRect rcClient, rcBar;
  1191. GetClientRect( rcClient );
  1192. ClientToScreen( rcClient );
  1193. GetWindowRect( rcBar );
  1194. rcClient.OffsetRect( -rcBar.TopLeft() );
  1195. rcBar.OffsetRect( -rcBar.TopLeft() );
  1196. pDC->ExcludeClipRect( rcClient );
  1197. if( (! PmBridge_GetPM()->GetCb2DbTransparentMode(this) )
  1198. || (! PmBridge_GetPM()->PaintDockerBkgnd( false, *pDC, this ) )
  1199. )
  1200. pDC->FillSolidRect(
  1201. &rcBar,
  1202. PmBridge_GetPM()->GetColor(
  1203. CExtPaintManager::CLR_3DFACE_OUT, this
  1204. )
  1205. );
  1206. bool bFloating = IsFloating() ? true : false;
  1207. bool bFixedMode = IsFixedMode();
  1208. bool bPaintFrame = true;
  1209. if( bFloating
  1210. && bFixedMode
  1211. && CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON != NULL
  1212. && CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->m_pHelperTearOffBar == this
  1213. )
  1214. bPaintFrame = false;
  1215. if( bPaintFrame )
  1216. {
  1217. CExtPaintManager::PAINTDOCKINGFRAMEDATA _pdfd(
  1218. this,
  1219. rcBar,
  1220. rcClient,
  1221. IsBarWindowActive(),
  1222. bFloating,
  1223. ! bFixedMode,
  1224. ! bFixedMode
  1225. );
  1226. PmBridge_GetPM()->PaintDockingFrame( *pDC, _pdfd );
  1227. } // if( bPaintFrame )
  1228. if( ! bFloating )
  1229. {
  1230. bool bHorz = IsDockedHorizontally();
  1231. CRect rc;
  1232. rc = _RectRowResizeGet();
  1233. if( ! rc.IsRectEmpty() )
  1234. PmBridge_GetPM()->PaintResizableBarSeparator(
  1235. *pDC,
  1236. rc,
  1237. bHorz,
  1238. this
  1239. );
  1240. rc = _RectRowRecalcGet();
  1241. if( ! rc.IsRectEmpty() )
  1242. PmBridge_GetPM()->PaintResizableBarSeparator(
  1243. *pDC,
  1244. rc,
  1245. !bHorz,
  1246. this
  1247. );
  1248. rc = _RectRowRecalcUpGet();
  1249. if( ! rc.IsRectEmpty() )
  1250. PmBridge_GetPM()->PaintResizableBarSeparator(
  1251. *pDC,
  1252. rc,
  1253. !bHorz,
  1254. this
  1255. );
  1256. } // if( ! bFloating )
  1257. bool bGripperAtTop = false;
  1258. if( IsBarWithGripper(&bGripperAtTop) && (! bFloating ) )
  1259. {
  1260. CRect rcGrip = _RectGripGet();
  1261. bool bHorz = IsDockedHorizontally();
  1262. CRect rcText( rcGrip );
  1263. if( bHorz && (! bGripperAtTop ) )
  1264. {
  1265. rcText.DeflateRect( 0, 2 );
  1266. rcText.OffsetRect( -2, 0 );
  1267. } // if( bHorz && (! bGripperAtTop ) )
  1268. else
  1269. {
  1270. rcText.DeflateRect( 2, 0 );
  1271. } // else from if( bHorz && (! bGripperAtTop ) )
  1272. NcButtons_CalcGripperTextLocation( rcText );
  1273. CExtSafeString sCaption;
  1274. OnGetBarCaptionText( __EBCT_SINGLE_CAPTION_DOCKED, sCaption );
  1275. CRgn rgnExclude;
  1276. if( rgnExclude.CreateRectRgnIndirect( &rcGrip ) )
  1277. pDC->SelectClipRgn( &rgnExclude );
  1278. CExtControlBar * pFlashingBar = this;
  1279. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1280. CExtDynTabControlBar * pTabbedBar = DYNAMIC_DOWNCAST( CExtDynTabControlBar, this );
  1281. if( pTabbedBar != NULL )
  1282. {
  1283. LONG nSel = pTabbedBar->GetSwitcherSelection();
  1284. if( nSel >= 0 )
  1285. {
  1286. CExtControlBar * pBar = pTabbedBar->GetBarAt( nSel, true );
  1287. if( pBar != NULL )
  1288. {
  1289. ASSERT_VALID( pBar );
  1290. ASSERT( pBar->GetSafeHwnd() != NULL );
  1291. pFlashingBar = pBar;
  1292. } // if( pBar != NULL )
  1293. } // if( nSel >= 0 )
  1294. } // if( pTabbedBar != NULL )
  1295. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1296. CExtPaintManager::PAINTGRIPPERDATA _pgd(
  1297. pFlashingBar, // this
  1298. rcGrip,
  1299. rcText,
  1300. IsBarWindowActive(),
  1301. false,
  1302. bHorz && !bGripperAtTop,
  1303. !bFixedMode,
  1304. sCaption.IsEmpty() ? LPCTSTR( NULL ) : sCaption,
  1305. ( (g_ResourceManager->OnQueryLangLayout()&LAYOUT_RTL) != 0 ) ? true : false
  1306. );
  1307. bool bDrawDefaultCaption = true, bFlashCaptionHighlightedState = false;
  1308. if( pFlashingBar->FlashCaptionIsInProgress( &bFlashCaptionHighlightedState ) )
  1309. {
  1310. _pgd.m_bFlashCaptionHighlightedState = bFlashCaptionHighlightedState;
  1311. _pgd.m_clrFlashCaptionText = pFlashingBar->m_clrFlashCaptionText;
  1312. _pgd.m_clrFlashCaptionBackground = pFlashingBar->m_clrFlashCaptionBackground;
  1313. if( pFlashingBar->FlashCaption_DoPaintNC(
  1314. *pDC,
  1315. (LPVOID)(&_pgd)
  1316. )
  1317. )
  1318. bDrawDefaultCaption = false;
  1319. } // if( pFlashingBar->FlashCaptionIsInProgress( &bFlashCaptionHighlightedState ) )
  1320. if( bDrawDefaultCaption )
  1321. {
  1322. PmBridge_GetPM()->PaintGripper( *pDC, _pgd );
  1323. NcButtons_Paint( *pDC );
  1324. } // if( bDrawDefaultCaption )
  1325. pDC->SelectClipRgn( NULL );
  1326. } // if( IsBarWithGripper(&bGripperAtTop) && (! bFloating ) )
  1327. }
  1328. void CExtControlBar::OnSysColorChange() 
  1329. {
  1330. CControlBar::OnSysColorChange();
  1331. //CExtPaintManager * pPM = PmBridge_GetPM();
  1332. // g_PaintManager.OnSysColorChange( this );
  1333. // g_CmdManager.OnSysColorChange( pPM, this );
  1334. _RecalcLayoutImpl();
  1335. }
  1336. void CExtControlBar::OnSettingChange(UINT uFlags, __EXT_MFC_SAFE_LPCTSTR lpszSection) 
  1337. {
  1338.     CControlBar::OnSettingChange(uFlags, lpszSection);
  1339. // m_nGripHeightAtTop = ::GetSystemMetrics(SM_CYSMCAPTION)+1;
  1340. // m_nGripWidthAtLeft = ::GetSystemMetrics(SM_CYSMCAPTION)+1;
  1341. // m_nSeparatorHeight = min( 4, ::GetSystemMetrics(SM_CYSIZEFRAME) );
  1342. // m_nSeparatorWidth = min( 4, ::GetSystemMetrics(SM_CXSIZEFRAME) );
  1343. // m_nMinHW = ::GetSystemMetrics(SM_CYSMCAPTION)+1 + m_nSeparatorHeight;
  1344. // m_nMinVH = ::GetSystemMetrics(SM_CYSMCAPTION)+1 + m_nSeparatorHeight;
  1345. CExtPaintManager * pPM = PmBridge_GetPM();
  1346. g_PaintManager.OnSettingChange( this, uFlags, lpszSection );
  1347. g_CmdManager.OnSettingChange( pPM, this, uFlags, lpszSection );
  1348. _RecalcLayoutImpl();
  1349. }
  1350. LRESULT CExtControlBar::OnDisplayChange( WPARAM wParam, LPARAM lParam )
  1351. {
  1352. LRESULT lResult = CControlBar::OnDisplayChange( wParam, lParam );
  1353. //CExtPaintManager * pPM = PmBridge_GetPM();
  1354. // g_PaintManager.OnDisplayChange( this, (INT)wParam, CPoint(lParam) );
  1355. // g_CmdManager.OnDisplayChange( pPM, this, (INT)wParam, CPoint(lParam) );
  1356. return lResult;
  1357. }
  1358. LRESULT CExtControlBar::OnThemeChanged( WPARAM wParam, LPARAM lParam )
  1359. {
  1360. wParam;
  1361. lParam;
  1362. LRESULT lResult = Default();
  1363. //CExtPaintManager * pPM = PmBridge_GetPM();
  1364. // g_PaintManager.OnThemeChanged( this, wParam, lParam );
  1365. // g_CmdManager.OnThemeChanged( pPM, this, wParam, lParam );
  1366. return lResult;
  1367. }
  1368. void CExtControlBar::OnCancelMode() 
  1369. {
  1370. if( m_bRowResizing )
  1371. _RowResizingStop( true );
  1372. if( m_bRowRecalcing )
  1373. _RowRecalcingStop( true );
  1374. if( m_bDragging )
  1375. _DraggingStop( true );
  1376. // CExtPopupMenuWnd::CancelMenuTracking();
  1377. CWnd::CancelToolTips();
  1378. // ASSERT( !CExtPopupMenuWnd::IsMenuTracking() );
  1379. if( m_bNcAreaBtnTracking )
  1380. {
  1381. m_bNcAreaBtnTracking = false;
  1382. PostMessage( WM_NCPAINT );
  1383. if( GetSafeHwnd() != NULL
  1384. && ::GetCapture() == m_hWnd
  1385. )
  1386. ::ReleaseCapture();
  1387. }
  1388. CControlBar::OnCancelMode();
  1389. }
  1390. void CExtControlBar::OnCaptureChanged(CWnd *pWnd) 
  1391. {
  1392. if( m_bRowResizing )
  1393. _RowResizingStop( true );
  1394. if( m_bRowRecalcing )
  1395. _RowRecalcingStop( true );
  1396. // if( m_bDragging )
  1397. // _DraggingStop( true );
  1398. CControlBar::OnCaptureChanged(pWnd);
  1399. }
  1400. bool CExtControlBar::_OnMouseMoveMsg(UINT nFlags, CPoint point)
  1401. {
  1402. nFlags;
  1403. _SetCursor( point );
  1404. if( m_bNcAreaBtnTracking )
  1405. return true;
  1406. if( m_bRowResizing )
  1407. {
  1408. _RowResizingUpdateState();
  1409. return true;
  1410. }
  1411. if( m_bRowRecalcing )
  1412. {
  1413. _RowRecalcingUpdateState();
  1414. return true;
  1415. }
  1416. if( m_bDragging )
  1417. {
  1418. CPoint ptScreen( point );
  1419. ClientToScreen( &ptScreen );
  1420. _DraggingUpdateState(
  1421. ptScreen,
  1422. CExtPopupMenuWnd::IsKeyPressed(VK_CONTROL) ? true : false
  1423. );
  1424. return true;
  1425. }
  1426. if( IsFloating()
  1427. && CExtMiniDockFrameWnd::g_bAutoMakeTopmostOnMouseEvent
  1428. && (!CExtPopupMenuWnd::IsMenuTracking())
  1429. )
  1430. {
  1431. CFrameWnd * pParentFrame = GetParentFrame();
  1432. if( pParentFrame != NULL )
  1433. pParentFrame->BringWindowToTop();
  1434. }
  1435. return false;
  1436. }
  1437. void CExtControlBar::OnMouseMove(UINT nFlags, CPoint point) 
  1438. {
  1439. __PROF_UIS_MANAGE_STATE;
  1440. if( ! CExtPopupMenuWnd::IsMenuTracking() )
  1441. {
  1442. if( ! OnQueryBarHoverProcessingEnabled() )
  1443. return;
  1444. } // if( ! CExtPopupMenuWnd::IsMenuTracking() )
  1445. if( _OnMouseMoveMsg(nFlags,point) )
  1446. return;
  1447. CControlBar::OnMouseMove(nFlags,point);
  1448. }
  1449. bool CExtControlBar::OnQueryBarHoverProcessingEnabled() const
  1450. {
  1451. ASSERT_VALID( this );
  1452. HWND hWndOwn = GetSafeHwnd();
  1453. if( hWndOwn == NULL )
  1454. return false;
  1455. if( ! CExtPopupMenuWnd::TestHoverEnabledFromActiveHWND( hWndOwn ) )
  1456. return false;
  1457. return true;
  1458. }
  1459. bool CExtControlBar::_RowRecalcing_IsBottomEnabled()
  1460. {
  1461. // previous or next CExtControlBar should not be minimized
  1462. ExtControlBarVector_t vBars;
  1463. _GetRowExtBars( vBars );
  1464. INT nCountOfBars = (INT)vBars.GetSize();
  1465. bool bThisPassed = false;
  1466. CExtControlBar * pBarPrev = NULL, * pBarNext = NULL;
  1467. for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  1468. {
  1469. CExtControlBar * pBar = vBars[ nBar ];
  1470. ASSERT_VALID( pBar );
  1471. if( !pBar->IsVisible() )
  1472. continue;
  1473. if( !bThisPassed )
  1474. pBarPrev = pBar;
  1475. else
  1476. {
  1477. pBarNext = pBar;
  1478. break;
  1479. }
  1480. if( pBar == this )
  1481. {
  1482. bThisPassed = true;
  1483. continue;
  1484. }
  1485. } // for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  1486. bool bMinimizedPrev = true, bMinimizedNext = true;
  1487. if( pBarPrev != NULL )
  1488. bMinimizedPrev = pBarPrev->IsMinimizedOnRow();
  1489. if( pBarNext != NULL )
  1490. bMinimizedNext = pBarNext->IsMinimizedOnRow();
  1491. if( bMinimizedPrev && bMinimizedNext )
  1492. return false;
  1493. return true;
  1494. }
  1495. bool CExtControlBar::_RowRecalcing_IsTopEnabled()
  1496. {
  1497. // this or next extbar should not be minimized
  1498. ExtControlBarVector_t vBars;
  1499. _GetRowExtBars( vBars );
  1500. INT nCountOfBars = (INT)vBars.GetSize();
  1501. CExtControlBar * pBarNext = NULL;
  1502. for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  1503. {
  1504. CExtControlBar * pBar = vBars[ nCountOfBars - nBar - 1 ];
  1505. ASSERT_VALID( pBar );
  1506. if( !pBar->IsVisible() )
  1507. continue;
  1508. if( pBar == this )
  1509. break;
  1510. pBarNext = pBar;
  1511. } // for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  1512. bool bMinimizedNext = true;
  1513. if( pBarNext != NULL )
  1514. bMinimizedNext = pBarNext->IsMinimizedOnRow();
  1515. if( bMinimizedNext && IsMinimizedOnRow() )
  1516. return false;
  1517. return true;
  1518. }
  1519. void CExtControlBar::OnNcLButtonDown(UINT nHitTest, CPoint point) 
  1520. {
  1521. ASSERT_VALID( this );
  1522. _ActivateOnClick();
  1523. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1524. CExtCustomizeSite * pSite = NotifiedCustomizeSiteGet();
  1525. if( pSite != NULL
  1526. && pSite->IsCustomizeMode()
  1527. )
  1528. pSite->DropTargetPopupCancel();
  1529. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1530. if( IsFixedMode() || IsFloating() )
  1531. return;
  1532. switch( nHitTest )
  1533. {
  1534. case HTLEFT:
  1535. case HTBOTTOM:
  1536. break; // case HTLEFT & HTBOTTOM
  1537. default:
  1538. if( ( !IsFixedMode() )
  1539. && ( !IsMinimizedOnRow() )
  1540. )
  1541. {
  1542. CPoint ptScreen( point );
  1543. //ClientToScreen( &ptScreen );
  1544. CExtBarNcAreaButton * pBtn = NULL;
  1545. ( const_cast < CExtControlBar * > ( this ) ) ->
  1546. NcButtons_HitTest( ptScreen, &pBtn );
  1547. if( pBtn == NULL ) // (+ v.2.24)
  1548. {
  1549. if( stat_QueryFocusChangingEnabled( this, m_hWnd ) )
  1550. SetFocus();
  1551. }
  1552. }
  1553. //return;
  1554. break;
  1555. } // switch( nHitTest )
  1556. ASSERT( !m_bRowRecalcing );
  1557. ASSERT( !m_bRowResizing );
  1558. CRect rcBarWnd, rcBarClient;
  1559. GetWindowRect( &rcBarWnd );
  1560. GetClientRect( &rcBarClient );
  1561. ClientToScreen( &rcBarClient );
  1562. if( rcBarWnd == rcBarClient )
  1563. return;
  1564. CPoint ptDevOffset = -rcBarWnd.TopLeft();
  1565. // rcBarWnd.OffsetRect( ptDevOffset );
  1566. // rcBarClient.OffsetRect( ptDevOffset );
  1567. point += ptDevOffset;
  1568. CRect rcRowResize = _RectRowResizeGet();
  1569. CRect rcRowRecalc = _RectRowRecalcGet();
  1570. CRect rcRowRecalcUp = _RectRowRecalcUpGet();
  1571. bool bHorz = IsDockedHorizontally();
  1572. if( (! rcRowResize.IsRectEmpty() )
  1573. && rcRowResize.PtInRect( point )
  1574. )
  1575. {
  1576. ASSERT( (INT)nHitTest == (bHorz ? HTBOTTOM : HTRIGHT) );
  1577. _RowResizingStart();
  1578. return;
  1579. }
  1580. if( (! rcRowRecalc.IsRectEmpty() )
  1581. && rcRowRecalc.PtInRect( point )
  1582. )
  1583. {
  1584. ASSERT( !_IsLastBarInRow( true ) );
  1585. ASSERT( (INT)nHitTest == (bHorz ? HTRIGHT : HTBOTTOM) );
  1586. m_bTopRecalcing = false;
  1587. if( !_RowRecalcing_IsBottomEnabled() )
  1588. return;
  1589. _RowRecalcingStart();
  1590. return;
  1591. }
  1592. if( (! rcRowRecalcUp.IsRectEmpty() )
  1593. && rcRowRecalcUp.PtInRect( point )
  1594. )
  1595. {
  1596. ASSERT( !_IsFirstBarInRow( true ) );
  1597. ASSERT( (INT)nHitTest == (bHorz ? HTLEFT : HTTOP) );
  1598. if( !_RowRecalcing_IsTopEnabled() )
  1599. return;
  1600. m_bTopRecalcing = true;
  1601. _RowRecalcingStart();
  1602. return;
  1603. }
  1604. CPoint ptScreen = point + rcBarWnd.TopLeft();
  1605. bool bNeedRepaint = false;
  1606. UINT nHT = NcButtons_HitTest( ptScreen );
  1607. if( nHT == HTCLIENT )
  1608. {
  1609. if( m_bNcAreaBtnTracking )
  1610. bNeedRepaint = true;
  1611. m_bNcAreaBtnTracking = false;
  1612. if( GetSafeHwnd() != NULL
  1613. && ::GetCapture() == m_hWnd
  1614. )
  1615. ::ReleaseCapture();
  1616. } // if( nHT == HTCLIENT )
  1617. else
  1618. {
  1619. if( !m_bNcAreaBtnTracking )
  1620. bNeedRepaint = true;
  1621. m_bNcAreaBtnTracking = true;
  1622. if( GetSafeHwnd() != NULL
  1623. && ::GetCapture() != m_hWnd
  1624. )
  1625. ::SetCapture( m_hWnd );
  1626. } // else from if( nHT == HTCLIENT )
  1627. if( bNeedRepaint )
  1628. {
  1629. SendMessage( WM_NCPAINT );
  1630. GetParent()->SendMessage( WM_NCPAINT );
  1631. }
  1632. }
  1633. void CExtControlBar::OnNcLButtonUp(UINT nHitTest, CPoint point) 
  1634. {
  1635. // if( m_bNcAreaBtnTracking )
  1636. // {
  1637. // if( GetSafeHwnd() == NULL
  1638. // || ::GetCapture() != m_hWnd
  1639. // )
  1640. // return;
  1641. // ::ReleaseCapture();
  1642. // CRect rcBarWnd;
  1643. // GetWindowRect( &rcBarWnd );
  1644. // CPoint ptDevOffset = -rcBarWnd.TopLeft();
  1645. // CPoint ptWnd( point + ptDevOffset );
  1646. // INT nCountOfNcButtons = NcButtons_GetCount();
  1647. // for( INT nBtn = 0; nBtn < nCountOfNcButtons; nBtn++ )
  1648. // {
  1649. // CExtBarNcAreaButton * pBtn =
  1650. // NcButtons_GetAt( nBtn );
  1651. // if( ! pBtn->OnQueryVisibility() )
  1652. // continue;
  1653. // if( pBtn->OnNcAreaClicked( ptWnd ) )
  1654. // return;
  1655. // } // for( INT nBtn = 0; nBtn < nCountOfNcButtons; nBtn++ )
  1656. // return;
  1657. // }
  1658. if( m_bRowResizing )
  1659. {
  1660. _RowResizingStop( false );
  1661. return;
  1662. }
  1663. if( m_bRowRecalcing )
  1664. {
  1665. _RowRecalcingStop( false );
  1666. return;
  1667. }
  1668. if( m_bDragging )
  1669. {
  1670. //_DraggingStop( false );
  1671. return;
  1672. }
  1673. CControlBar::OnNcLButtonUp(nHitTest, point);
  1674. }
  1675. void CExtControlBar::OnRButtonDown(UINT nFlags, CPoint point) 
  1676. {
  1677. ASSERT_VALID( this );
  1678. _ActivateOnClick();
  1679.     CControlBar::OnRButtonDown( nFlags, point );
  1680. }
  1681. void CExtControlBar::OnMButtonDown(UINT nFlags, CPoint point) 
  1682. {
  1683. ASSERT_VALID( this );
  1684. _ActivateOnClick();
  1685.     CControlBar::OnMButtonDown( nFlags, point );
  1686. }
  1687. void CExtControlBar::OnLButtonDown(UINT nFlags, CPoint point) 
  1688. {
  1689. ASSERT_VALID( this );
  1690.     if( m_pDockBar == NULL || CExtPopupMenuWnd::IsMenuTracking() )
  1691. {
  1692.         CWnd::OnLButtonDown(nFlags, point);
  1693. return;
  1694. }
  1695. _ActivateOnClick();
  1696. // start dragging
  1697. ASSERT_VALID( m_pDockBar );
  1698.     ASSERT( m_pDockContext != NULL );
  1699.     ClientToScreen( &point );
  1700. bool bExtendedDragging = _IsShowContentWhenDragging();
  1701. if( !bExtendedDragging && IsFixedMode() )
  1702. {
  1703. m_pDockContext->StartDrag( point );
  1704. return;
  1705. }
  1706. if( m_pDockBar != NULL && (!IsFloating()) )
  1707. {
  1708. if( !m_pDockBar->IsKindOf(
  1709. RUNTIME_CLASS(CExtDockBar)
  1710. )
  1711. )
  1712. bExtendedDragging = false;
  1713. }
  1714. if( IsFloating() )
  1715. {
  1716. CMiniDockFrameWnd * pMiniFrame =
  1717. DYNAMIC_DOWNCAST(
  1718. CMiniDockFrameWnd,
  1719. GetDockingFrame()
  1720. );
  1721. ASSERT_VALID( pMiniFrame );
  1722. CExtMiniDockFrameWnd * pExtMiniFrame =
  1723. DYNAMIC_DOWNCAST(
  1724. CExtMiniDockFrameWnd,
  1725. GetDockingFrame()
  1726. );
  1727. if( pExtMiniFrame != NULL )
  1728. {
  1729. pExtMiniFrame->OnNcLButtonDown(
  1730. HTCAPTION,
  1731. point
  1732. );
  1733. return;
  1734. }
  1735. } // if( IsFloating() )
  1736. if( ! IsFixedMode() )
  1737. {
  1738. if( stat_QueryFocusChangingEnabled( this, m_hWnd ) )
  1739. SetFocus();
  1740. }
  1741. CPoint ptOffset( point );
  1742. CRect rcWnd;
  1743. GetWindowRect( &rcWnd );
  1744. ptOffset -= rcWnd.TopLeft();
  1745. _DraggingStart( point, ptOffset );
  1746. }
  1747. void CExtControlBar::OnLButtonUp(UINT nFlags, CPoint point) 
  1748. {
  1749. if( m_bRowResizing )
  1750. {
  1751. _RowResizingStop( false );
  1752. return;
  1753. }
  1754. if( m_bRowRecalcing )
  1755. {
  1756. _RowRecalcingStop( false );
  1757. return;
  1758. }
  1759. if( m_bDragging )
  1760. {
  1761. _DraggingStop( false );
  1762. return;
  1763. }
  1764. if( m_bNcAreaBtnTracking )
  1765. {
  1766. if( GetSafeHwnd() == NULL
  1767. || ::GetCapture() != m_hWnd
  1768. )
  1769. return;
  1770. ::ReleaseCapture();
  1771. CRect rcBarWnd;
  1772. GetWindowRect( &rcBarWnd );
  1773. CPoint ptDevOffset = -rcBarWnd.TopLeft();
  1774. CPoint ptWnd = point;
  1775. ClientToScreen( &ptWnd );
  1776. ptWnd += ptDevOffset;
  1777. INT nCountOfNcButtons = NcButtons_GetCount();
  1778. for( INT nBtn = 0; nBtn < nCountOfNcButtons; nBtn++ )
  1779. {
  1780. CExtBarNcAreaButton * pBtn =
  1781. NcButtons_GetAt( nBtn );
  1782. if( ! pBtn->OnQueryVisibility() )
  1783. continue;
  1784. if( pBtn->OnNcAreaClicked( ptWnd ) )
  1785. return;
  1786. } // for( INT nBtn = 0; nBtn < nCountOfNcButtons; nBtn++ )
  1787. return;
  1788. }
  1789. CControlBar::OnLButtonUp(nFlags, point);
  1790. }
  1791. void CExtControlBar::OnRButtonUp(UINT nFlags, CPoint point) 
  1792. {
  1793. nFlags;
  1794. // if( m_bRowResizing )
  1795. // _RowResizingStop();
  1796. // if( m_bRowRecalcing )
  1797. // _RowRecalcingStop();
  1798. // if( m_bDragging )
  1799. // _DraggingStop( false );
  1800. // CControlBar::OnRButtonUp(nFlags, point);
  1801. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1802. CExtCustomizeSite * pSite = NotifiedCustomizeSiteGet();
  1803. if( pSite != NULL
  1804. && pSite->IsCustomizeMode()
  1805. )
  1806. return;
  1807. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1808. if( m_bPresubclassDialogMode
  1809. || _GetDockingFrameImpl() == NULL
  1810. || CExtControlBar::FindHelpMode( this )
  1811. )
  1812. {
  1813. CControlBar::OnRButtonUp( nFlags, point );
  1814. return;
  1815. }
  1816. CFrameWnd * pFrame = _GetDockingFrameImpl();
  1817. ASSERT_VALID( pFrame );
  1818. if( ! ::GetCursorPos(&point) )
  1819. return;
  1820. if( (! IsFixedMode() )
  1821. && (! IsKindOf(RUNTIME_CLASS(CExtPanelControlBar)) )
  1822. )
  1823. {
  1824. CPoint ptClient = point;
  1825. ScreenToClient( &ptClient );
  1826. CRect rcClient;
  1827. GetClientRect( &rcClient );
  1828. if( rcClient.PtInRect(ptClient) )
  1829. return;
  1830. }
  1831. HWND hWndTrack = GetOwner()->GetSafeHwnd();
  1832. ASSERT( hWndTrack != NULL && ::IsWindow(hWndTrack) );
  1833. CExtPopupMenuWnd * pPopup =
  1834. CExtPopupMenuWnd::InstantiatePopupMenu(
  1835. GetSafeHwnd(),
  1836. RUNTIME_CLASS(CExtPopupMenuWnd),
  1837. this
  1838. );
  1839. VERIFY( pPopup->CreatePopupMenu(hWndTrack) );
  1840. if( ! CExtDockBar::_ConstructDockSiteControlBarPopupMenu(
  1841. pFrame,
  1842. pPopup,
  1843. CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_CONTROLBAR_CTX,
  1844. this,
  1845. WM_RBUTTONUP,
  1846. NULL
  1847. )
  1848. )
  1849. {
  1850. delete pPopup;
  1851. return;
  1852. }
  1853. if( pPopup->ItemGetCount() == 0 )
  1854. {
  1855. delete pPopup;
  1856. return;
  1857. }
  1858. CWnd * pWndChild = GetWindow( GW_CHILD );
  1859. if( pWndChild != NULL )
  1860. {
  1861. HWND hWndOwn = m_hWnd;
  1862. if( stat_QueryFocusChangingEnabled( this, pWndChild->m_hWnd ) )
  1863. {
  1864. pWndChild->SetFocus();
  1865. CExtPopupMenuWnd::PassMsgLoop( true );
  1866. if( ! ::IsWindow( hWndOwn ) )
  1867. {
  1868. delete pPopup;
  1869. return;
  1870. }
  1871. m_bWindowActive = true;
  1872. SendMessage( WM_NCPAINT );
  1873. }
  1874. }
  1875. if( ! pPopup->TrackPopupMenu(
  1876. TPMX_OWNERDRAW_FIXED,
  1877. point.x,
  1878. point.y,
  1879. NULL,
  1880. this,
  1881. NULL,
  1882. NULL,
  1883. true
  1884. )
  1885. )
  1886. {
  1887. //delete pPopup;
  1888. }
  1889. }
  1890. void CExtControlBar::OnNcRButtonUp(UINT nHitTest, CPoint point)
  1891. {
  1892. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1893. CExtCustomizeSite * pSite = NotifiedCustomizeSiteGet();
  1894. if( pSite != NULL
  1895. && pSite->IsCustomizeMode()
  1896. )
  1897. return;
  1898. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1899. if( m_bPresubclassDialogMode
  1900. || _GetDockingFrameImpl() == NULL
  1901. || CExtControlBar::FindHelpMode( this )
  1902. )
  1903. {
  1904. CControlBar::OnNcRButtonUp( nHitTest, point );
  1905. return;
  1906. }
  1907. CFrameWnd * pFrame = _GetDockingFrameImpl();
  1908. ASSERT_VALID( pFrame );
  1909. if( ! ::GetCursorPos(&point) )
  1910. return;
  1911. HWND hWndTrack = GetOwner()->GetSafeHwnd();
  1912. ASSERT( hWndTrack != NULL && ::IsWindow(hWndTrack) );
  1913. CExtPopupMenuWnd * pPopup =
  1914. CExtPopupMenuWnd::InstantiatePopupMenu(
  1915. GetSafeHwnd(),
  1916. RUNTIME_CLASS(CExtPopupMenuWnd),
  1917. this
  1918. );
  1919. VERIFY( pPopup->CreatePopupMenu(hWndTrack) );
  1920. if( ! CExtDockBar::_ConstructDockSiteControlBarPopupMenu(
  1921. pFrame,
  1922. pPopup,
  1923. CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_CONTROLBAR_NC_CTX,
  1924. this,
  1925. WM_RBUTTONUP,
  1926. NULL
  1927. )
  1928. )
  1929. {
  1930. delete pPopup;
  1931. return;
  1932. }
  1933. if( pPopup->ItemGetCount() == 0 )
  1934. {
  1935. delete pPopup;
  1936. return;
  1937. }
  1938. if( stat_QueryFocusChangingEnabled( this, hWndTrack ) )
  1939. ::SetFocus( hWndTrack );
  1940. if( ! pPopup->TrackPopupMenu(
  1941. TPMX_OWNERDRAW_FIXED,
  1942. point.x,
  1943. point.y,
  1944. NULL,
  1945. this,
  1946. NULL,
  1947. NULL,
  1948. true
  1949. )
  1950. )
  1951. {
  1952. //delete pPopup;
  1953. }
  1954. }
  1955. void CExtControlBar::OnLButtonDblClk(UINT nFlags, CPoint point)
  1956. {
  1957.     if( m_pDockBar == NULL )
  1958. {
  1959.         CWnd::OnLButtonDblClk(nFlags, point);
  1960. return;
  1961. }
  1962. if( ! _FloatStateChangingIsEnabled( this ) )
  1963. return;
  1964. ToggleDocking();
  1965. }
  1966. void CExtControlBar::OnNcLButtonDblClk(UINT nHitTest, CPoint point) 
  1967. {
  1968.     if( m_pDockBar == NULL || nHitTest != HTCAPTION )
  1969. {
  1970.         CWnd::OnNcLButtonDblClk(nHitTest, point);
  1971. return;
  1972. }
  1973. if( ! _FloatStateChangingIsEnabled( this ) )
  1974. return;
  1975. ToggleDocking();
  1976. }
  1977. void CExtControlBar::OnNcMButtonDown(UINT nHitTest, CPoint point)
  1978. {
  1979. ASSERT_VALID( this );
  1980. _ActivateOnClick();
  1981. CControlBar::OnNcMButtonDown( nHitTest, point );
  1982. }
  1983. void CExtControlBar::OnNcRButtonDown(UINT nHitTest, CPoint point)
  1984. {
  1985. ASSERT_VALID( this );
  1986. _ActivateOnClick();
  1987. CControlBar::OnNcRButtonDown( nHitTest, point );
  1988. }
  1989. bool CExtControlBar::_IsShowContentWhenDragging() const
  1990. {
  1991. //BOOL bDragShowContent = FALSE;
  1992. //    ::SystemParametersInfo(
  1993. // SPI_GETDRAGFULLWINDOWS,
  1994. // 0,
  1995. //        &bDragShowContent,
  1996. // 0
  1997. // );
  1998. // return bDragShowContent ? true : false;
  1999. #if (!defined __EXT_MFC_NO_DOCK_MARKERS)
  2000. eResizablePanelDockingType_t eResizablePanelDockingType =
  2001. OnQueryDockingType();
  2002. if( INT(eResizablePanelDockingType) >= INT(__RESIZABLE_DOCKING_TYPE_STUDIO_2005) )
  2003. return true;
  2004. #endif // (!defined __EXT_MFC_NO_DOCK_MARKERS)
  2005. return false;
  2006. }
  2007. bool CExtControlBar::_IsShowContentWhenRowResizing() const
  2008. {
  2009. #if (!defined __EXT_MFC_NO_DOCK_MARKERS)
  2010. eResizablePanelDockingType_t eResizablePanelDockingType =
  2011. OnQueryDockingType();
  2012. if( INT(eResizablePanelDockingType) >= INT(__RESIZABLE_DOCKING_TYPE_STUDIO_2005) )
  2013. return false;
  2014. #endif // (!defined __EXT_MFC_NO_DOCK_MARKERS)
  2015. return _IsShowContentWhenDragging();
  2016. }
  2017. bool CExtControlBar::_IsShowContentWhenRowRecalcing() const
  2018. {
  2019. #if (!defined __EXT_MFC_NO_DOCK_MARKERS)
  2020. eResizablePanelDockingType_t eResizablePanelDockingType =
  2021. OnQueryDockingType();
  2022. if( INT(eResizablePanelDockingType) >= INT(__RESIZABLE_DOCKING_TYPE_STUDIO_2005) )
  2023. return false;
  2024. #endif // (!defined __EXT_MFC_NO_DOCK_MARKERS)
  2025. return _IsShowContentWhenDragging();
  2026. }
  2027. CExtControlBar::e_control_bar_position_changing_t CExtControlBar::GetCurrentControlBarPositionChangingType() const
  2028. {
  2029. ASSERT_VALID( this );
  2030. return m_eCBPC;
  2031. }
  2032. void CExtControlBar::OnControlBarPositionChange(
  2033. CExtControlBar * pBarEventSrc,
  2034. e_control_bar_position_changing_t eCBPC,
  2035. bool bInitial,
  2036. bool bFinal
  2037. )
  2038. {
  2039. ASSERT_VALID( this );
  2040. ASSERT_VALID( pBarEventSrc );
  2041. pBarEventSrc;
  2042. if( ! ( bInitial && bFinal ) )
  2043. {
  2044. if( bInitial && m_eCBPC == __ECBPC_EMPTY )
  2045. m_eCBPC = eCBPC;
  2046. else if( bFinal && m_eCBPC == eCBPC )
  2047. m_eCBPC = __ECBPC_EMPTY;
  2048. }
  2049. }
  2050. void CExtControlBar::_OnControlBarPositionChange_RedockingImpl(
  2051. CExtControlBar * pBarEventSrc,
  2052. e_control_bar_position_changing_t eCBPC,
  2053. bool bInitial,
  2054. bool bFinal
  2055. )
  2056. {
  2057. ASSERT_VALID( this );
  2058. m_bDelayShowInvoked = true;
  2059. m_bDelayShowFlag = IsVisible() ? true : false;
  2060. CExtDynControlBar * pDynContainer = _GetNearestDynamicContainer();
  2061. if( pDynContainer != NULL )
  2062. {
  2063. pDynContainer->m_bDelayShowInvoked = true;
  2064. pDynContainer->m_bDelayShowFlag = m_bDelayShowFlag;
  2065. }
  2066. ExtControlBarVector_t vBars;
  2067.     _GetFrameControlBars(
  2068. NULL,
  2069. pBarEventSrc->m_pDockSite,
  2070. vBars
  2071. );
  2072. INT nCountOfBars = (INT)vBars.GetSize();
  2073. ASSERT( nCountOfBars > 0 );
  2074. for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2075. {
  2076. CExtControlBar * pBar = vBars[ nBar ];
  2077. ASSERT_VALID( pBar );
  2078. pBar->OnControlBarPositionChange(
  2079. pBarEventSrc,
  2080. eCBPC,
  2081. bInitial,
  2082. bFinal
  2083. );
  2084. }
  2085. }
  2086. void CExtControlBar::_OnControlBarPositionChange_InRowImpl(
  2087. CExtControlBar * pBarEventSrc,
  2088. e_control_bar_position_changing_t eCBPC,
  2089. bool bInitial,
  2090. bool bFinal
  2091. )
  2092. {
  2093. ASSERT_VALID( this );
  2094. _OnControlBarPositionChange_RedockingImpl(
  2095. pBarEventSrc,
  2096. eCBPC,
  2097. bInitial,
  2098. bFinal
  2099. );
  2100. //ExtControlBarVector_t vBars;
  2101. // _GetRowExtBars( vBars );
  2102. //INT nCountOfBars = (INT)vBars.GetSize();
  2103. // ASSERT( nCountOfBars > 0 );
  2104. // for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2105. // {
  2106. // CExtControlBar * pBar = vBars[ nBar ];
  2107. // ASSERT_VALID( pBar );
  2108. // pBar->OnControlBarPositionChange(
  2109. // pBarEventSrc,
  2110. // eCBPC,
  2111. // bInitial,
  2112. // bFinal
  2113. // );
  2114. // }
  2115. }
  2116. CRect CExtControlBar::g_rcHelperRowResizingLimits( -32767, -32767, 32767, 32767 );
  2117. void CExtControlBar::_RowResizingStart()
  2118. {
  2119. ASSERT( !m_bRowRecalcing );
  2120. ASSERT( !m_bRowResizing );
  2121. g_rcHelperRowResizingLimits.SetRect( -32767, -32767, 32767, 32767 );
  2122. CWnd::CancelToolTips();
  2123. CExtToolControlBar::_CloseTrackingMenus();
  2124. CExtPopupMenuWnd::CancelMenuTracking();
  2125. if( m_pDockSite->GetSafeHwnd() != NULL )
  2126. {
  2127. if( GetParentFrame() == m_pDockSite )
  2128. {
  2129. ASSERT_VALID( m_pDockBar );
  2130. ASSERT( m_pDockBar->GetSafeHwnd() != NULL );
  2131. CWnd * pWnd = m_pDockBar;
  2132. for( ; true; )
  2133. {
  2134. CWnd * pWnd2 = pWnd->GetParent();
  2135. if( pWnd2 == NULL )
  2136. {
  2137. pWnd = NULL;
  2138. break;
  2139. }
  2140. if( pWnd2 == m_pDockSite )
  2141. break;
  2142. pWnd = pWnd2;
  2143. } // for( ; true; )
  2144. if( pWnd != NULL )
  2145. {
  2146. CExtDockBar * pDockBar = DYNAMIC_DOWNCAST( CExtDockBar, pWnd );
  2147. if( pDockBar != NULL )
  2148. {
  2149. UINT nDockBarID = UINT( pDockBar->GetDlgCtrlID() );
  2150. if( nDockBarID == AFX_IDW_DOCKBAR_TOP
  2151. || nDockBarID == AFX_IDW_DOCKBAR_BOTTOM
  2152. || nDockBarID == AFX_IDW_DOCKBAR_LEFT
  2153. || nDockBarID == AFX_IDW_DOCKBAR_RIGHT
  2154. )
  2155. {
  2156. CRect rcFrameInner, rcOwnClient;
  2157. GetClientRect( &rcOwnClient );
  2158. m_pDockSite->GetClientRect( &rcFrameInner );
  2159. m_pDockSite->RepositionBars(
  2160. 0,
  2161. 0x0FFFF,
  2162. AFX_IDW_PANE_FIRST,
  2163. CWnd::reposQuery,
  2164. rcFrameInner,
  2165. rcFrameInner
  2166. );
  2167. ClientToScreen( &rcOwnClient );
  2168. m_pDockSite->ClientToScreen( &rcFrameInner );
  2169. g_rcHelperRowResizingLimits = rcOwnClient;
  2170. switch( nDockBarID )
  2171. {
  2172. case AFX_IDW_DOCKBAR_TOP:
  2173. g_rcHelperRowResizingLimits.bottom = rcFrameInner.bottom;
  2174. break;
  2175. case AFX_IDW_DOCKBAR_BOTTOM:
  2176. g_rcHelperRowResizingLimits.top = rcFrameInner.top;
  2177. break;
  2178. case AFX_IDW_DOCKBAR_LEFT:
  2179. g_rcHelperRowResizingLimits.right = rcFrameInner.right;
  2180. break;
  2181. case AFX_IDW_DOCKBAR_RIGHT:
  2182. g_rcHelperRowResizingLimits.left = rcFrameInner.left;
  2183. break;
  2184. } // switch( nDockBarID )
  2185. }
  2186. } // if( pDockBar != NULL )
  2187. } // if( pWnd != NULL )
  2188. } // if( GetParentFrame() == m_pDockSite )
  2189. POSITION pos = m_pDockSite->m_listControlBars.GetHeadPosition();
  2190. for( ; pos != NULL; )
  2191. {
  2192. CControlBar * pBar = (CControlBar *)
  2193. m_pDockSite->m_listControlBars.GetNext( pos );
  2194. if( pBar->GetSafeHwnd() == NULL
  2195. || pBar->IsDockBar()
  2196. )
  2197. continue;
  2198. CExtMenuControlBar * pMenuBar =
  2199. DYNAMIC_DOWNCAST( CExtMenuControlBar, pBar );
  2200. if( pMenuBar == NULL )
  2201. continue;
  2202. pMenuBar->_CancelFlatTracking();
  2203. } // for( ; pos != NULL; )
  2204. } // if( m_pDockSite->GetSafeHwnd() != NULL )
  2205. if( ! _RowResizingIsEnabled(this) )
  2206. return;
  2207. _OnControlBarPositionChange_InRowImpl(
  2208. this,
  2209. __ECBPC_ROW_RESIZING,
  2210. true,
  2211. false
  2212. );
  2213. m_bRowResizing = true;
  2214. CExtMouseCaptureSink::SetCapture( GetSafeHwnd() );
  2215. ASSERT_VALID( m_pDockSite );
  2216. ASSERT( !IsFloating() );
  2217. m_nMetricOffset = IsDockedHorizontally() ?
  2218. m_sizeDockedH.cy : m_sizeDockedV.cx;
  2219. if( !_IsShowContentWhenRowResizing() )
  2220. {
  2221. CPoint ptCursorScreen( 0, 0 );
  2222. ::GetCursorPos( &ptCursorScreen );
  2223. m_nTrackerOffset =
  2224. IsDockedHorizontally()
  2225. ? ptCursorScreen.y : ptCursorScreen.x;
  2226. _DrawResizingTracker( false );
  2227. } // if( !_IsShowContentWhenRowResizing() )
  2228. while( m_bRowResizing )
  2229. {
  2230. ::WaitMessage();
  2231. MSG msg;
  2232. // Process all the messages in the message queue
  2233. while( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
  2234. {
  2235. bool bStop = false;
  2236. switch( msg.message )
  2237. {
  2238. case WM_ACTIVATEAPP:
  2239. case WM_CANCELMODE:
  2240. // case WM_LBUTTONUP:
  2241. case WM_RBUTTONDOWN:
  2242. case WM_NCLBUTTONUP:
  2243. // case WM_NCLBUTTONDOWN:
  2244. case WM_NCRBUTTONUP:
  2245. case WM_NCRBUTTONDOWN:
  2246. case WM_MBUTTONDOWN:
  2247. case WM_MBUTTONUP:
  2248. case WM_NCMBUTTONDOWN:
  2249. case WM_NCMBUTTONUP:
  2250. case WM_CONTEXTMENU:
  2251. bStop = true;
  2252. break;
  2253. default:
  2254. if( WM_KEYFIRST <= msg.message
  2255. && msg.message <= WM_KEYLAST
  2256. )
  2257. bStop = true;
  2258. // else
  2259. // {
  2260. // if( CExtMouseCaptureSink::GetCapture() != GetSafeHwnd() )
  2261. // bStop = true;
  2262. // else
  2263. // {
  2264. // if( (!CExtPopupMenuWnd::
  2265. // IsKeyPressed(VK_LBUTTON))
  2266. // || CExtPopupMenuWnd::
  2267. // IsKeyPressed(VK_RBUTTON)
  2268. // || CExtPopupMenuWnd::
  2269. // IsKeyPressed(VK_MBUTTON)
  2270. // )
  2271. // bStop = true;
  2272. // }
  2273. // }
  2274. break;
  2275. } // switch( msg.message )
  2276. if( bStop )
  2277. {
  2278. _RowResizingStop( true );
  2279. break;
  2280. }
  2281. if( !AfxGetThread()->PumpMessage() )
  2282. {
  2283. PostQuitMessage(0);
  2284. break; // Signal WM_QUIT received
  2285. } // if( !AfxGetThread()->PumpMessage() )
  2286. } // while( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
  2287. if( m_bRowResizing && CExtControlBar::g_bEnableOnIdleCalls )
  2288. {
  2289. for( LONG nIdleCounter = 0L;
  2290. ::AfxGetThread()->OnIdle(nIdleCounter);
  2291. nIdleCounter ++
  2292. );
  2293. }
  2294. } // while( m_bRowResizing )
  2295. _OnControlBarPositionChange_InRowImpl(
  2296. this,
  2297. __ECBPC_ROW_RESIZING,
  2298. false,
  2299. true
  2300. );
  2301. }
  2302. void CExtControlBar::_RowResizingStop( bool bCancel )
  2303. {
  2304. m_bRowResizing = false;
  2305. if( CExtMouseCaptureSink::GetCapture() == GetSafeHwnd() )
  2306. CExtMouseCaptureSink::ReleaseCapture();
  2307. ASSERT_VALID( m_pDockSite );
  2308. ASSERT_VALID( m_pDockBar );
  2309. ASSERT( !IsFloating() );
  2310. if( !_IsShowContentWhenRowResizing() )
  2311. {
  2312. _DrawResizingTracker( true );
  2313. if( !bCancel )
  2314. {
  2315. bool bHorz = IsDockedHorizontally();
  2316. if( m_nMetricOffset !=
  2317. (bHorz ? m_sizeDockedH.cy : m_sizeDockedV.cx)
  2318. )
  2319. {
  2320. ExtControlBarVector_t vBars;
  2321. _GetRowExtBars( vBars );
  2322. INT nCountOfBars = (INT)vBars.GetSize();
  2323. ASSERT( nCountOfBars > 0 );
  2324. LONG nDiff = 0;
  2325. for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2326. {
  2327. CExtControlBar * pBar = vBars[ nBar ];
  2328. ASSERT_VALID( pBar );
  2329. // if( !pBar->IsVisible() )
  2330. // continue;
  2331. if( pBar->IsFixedMode() )
  2332. continue;
  2333. if( bHorz )
  2334. {
  2335. if( nDiff == 0 )
  2336. nDiff = pBar->m_sizeDockedH.cy - m_nMetricOffset;
  2337. pBar->m_sizeDockedH.cy = m_nMetricOffset;
  2338. }
  2339. else
  2340. {
  2341. if( nDiff == 0 )
  2342. nDiff = pBar->m_sizeDockedV.cx - m_nMetricOffset;
  2343. pBar->m_sizeDockedV.cx = m_nMetricOffset;
  2344. }
  2345. } // for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2346. if( nDiff != 0 )
  2347. {
  2348. UINT nDockBarID = GetSafeDockBarDlgCtrlID();
  2349. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  2350. MfcControlBarVector_t vNextRow;
  2351. if( nDockBarID == AFX_IDW_DOCKBAR_TOP
  2352. || nDockBarID == AFX_IDW_DOCKBAR_LEFT
  2353. )
  2354. _GetNextRowBars( true, vNextRow );
  2355. else
  2356. _GetNextRowBars( false, vNextRow );
  2357. INT nCountOfBars = (INT)vNextRow.GetSize();
  2358. for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2359. {
  2360. CExtControlBar * pBar = (CExtControlBar *)vNextRow[ nBar ];
  2361. ASSERT_VALID( pBar );
  2362. if( !pBar->IsKindOf( RUNTIME_CLASS(CExtControlBar) ) )
  2363. continue;
  2364. if( pBar->IsFixedMode() )
  2365. continue;
  2366. if( bHorz )
  2367. pBar->m_sizeDockedH.cy += nDiff;
  2368. else
  2369. pBar->m_sizeDockedV.cx += nDiff;
  2370. } // for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2371. } // if( nDiff != 0 )
  2372. }
  2373. //xx//
  2374. //m_pDockSite->RecalcLayout();
  2375. GetParentFrame()->RecalcLayout();
  2376. } // if( !bCancel )
  2377. ASSERT_VALID( m_pDockBar );
  2378. m_pDockBar->RedrawWindow(
  2379. NULL, NULL,
  2380. RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASENOW
  2381. |RDW_ALLCHILDREN
  2382. |RDW_NOFRAME
  2383. );
  2384. } // if( !_IsShowContentWhenRowResizing() )
  2385. }
  2386. void CExtControlBar::_RowResizingUpdateState()
  2387. {
  2388. ASSERT( m_bRowResizing );
  2389. ASSERT_VALID( m_pDockSite );
  2390. CRect rcDockSite;
  2391. m_pDockSite->GetWindowRect( &rcDockSite );
  2392. CSize sizeDockMax =
  2393. rcDockSite.Size()
  2394. - CSize(
  2395. _CalcDesiredMinHW(),
  2396. _CalcDesiredMinVH()
  2397. );
  2398. if( sizeDockMax.cx <= 0 || sizeDockMax.cy <= 0 )
  2399. return;
  2400. CPoint ptCursorScreen( 0, 0 );
  2401. ::GetCursorPos( &ptCursorScreen );
  2402. if( ptCursorScreen.x < g_rcHelperRowResizingLimits.left )
  2403. ptCursorScreen.x = g_rcHelperRowResizingLimits.left;
  2404. if( ptCursorScreen.x > g_rcHelperRowResizingLimits.right )
  2405. ptCursorScreen.x = g_rcHelperRowResizingLimits.right;
  2406. if( ptCursorScreen.y < g_rcHelperRowResizingLimits.top )
  2407. ptCursorScreen.y = g_rcHelperRowResizingLimits.top;
  2408. if( ptCursorScreen.y > g_rcHelperRowResizingLimits.bottom )
  2409. ptCursorScreen.y = g_rcHelperRowResizingLimits.bottom;
  2410. CPoint ptCursor( ptCursorScreen );
  2411. CRect rcBarWnd;
  2412. GetWindowRect( &rcBarWnd );
  2413. CPoint ptDevOffset = -rcBarWnd.TopLeft();
  2414. ptCursor += ptDevOffset;
  2415. CRect rcRowResize = _RectRowResizeGet();
  2416. CRect rcRowRecalc = _RectRowRecalcGet();
  2417. CRect rcRowRecalcUp = _RectRowRecalcUpGet();
  2418. bool bHorz = IsDockedHorizontally();
  2419. if( bHorz )
  2420. {
  2421. INT nMin1 = _CalcDesiredMinVH();
  2422. bool bTop = IsDockedAtTop();
  2423. INT nMin2 = bTop
  2424. ? (ptCursor.y + rcRowResize.Height()/2)
  2425. : (m_sizeDockedH.cy - ptCursor.y + rcRowResize.Height()/2)
  2426. ;
  2427. m_nMetricOffset = max( nMin1, nMin2 );
  2428. if( m_nMetricOffset > sizeDockMax.cy )
  2429. m_nMetricOffset = sizeDockMax.cy;
  2430. if( m_nMetricOffset == m_sizeDockedH.cy )
  2431. return;
  2432. } // if( bHorz )
  2433. else
  2434. {
  2435. INT nMin1 = _CalcDesiredMinHW();
  2436. bool bLeft = IsDockedAtLeft();
  2437. INT nMin2 = bLeft
  2438. ? (ptCursor.x + rcRowResize.Width()/2)
  2439. : (m_sizeDockedV.cx - ptCursor.x + rcRowResize.Width()/2 )
  2440. ;
  2441. m_nMetricOffset = max( nMin1, nMin2 );
  2442. if( m_nMetricOffset > sizeDockMax.cx )
  2443. m_nMetricOffset = sizeDockMax.cx;
  2444. if( m_nMetricOffset == m_sizeDockedV.cx )
  2445. return;
  2446. } // else from if( bHorz )
  2447. bool bShowContent = _IsShowContentWhenRowResizing();
  2448. if( bShowContent )
  2449. {
  2450. ExtControlBarVector_t vBars;
  2451. _GetRowExtBars( vBars );
  2452. INT nCountOfBars = (INT)vBars.GetSize();
  2453. ASSERT( nCountOfBars > 0 );
  2454. LONG nDiff = 0;
  2455. for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2456. {
  2457. CExtControlBar * pBar = vBars[ nBar ];
  2458. ASSERT_VALID( pBar );
  2459. // if( !pBar->IsVisible() )
  2460. // continue;
  2461. if( pBar->IsFixedMode() )
  2462. continue;
  2463. if( bHorz )
  2464. {
  2465. if( nDiff == 0 )
  2466. nDiff = pBar->m_sizeDockedH.cy - m_nMetricOffset;
  2467. pBar->m_sizeDockedH.cy = m_nMetricOffset;
  2468. }
  2469. else
  2470. {
  2471. if( nDiff == 0 )
  2472. nDiff = pBar->m_sizeDockedV.cx - m_nMetricOffset;
  2473. pBar->m_sizeDockedV.cx = m_nMetricOffset;
  2474. }
  2475. } // for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2476. /*
  2477. if( nDiff != 0 )
  2478. {
  2479. UINT nDockBarID = GetSafeDockBarDlgCtrlID();
  2480. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  2481. MfcControlBarVector_t vNextRow;
  2482. if( nDockBarID == AFX_IDW_DOCKBAR_TOP
  2483. || nDockBarID == AFX_IDW_DOCKBAR_LEFT
  2484. )
  2485. _GetNextRowBars( true, vNextRow );
  2486. else
  2487. _GetNextRowBars( false, vNextRow );
  2488. INT nCountOfBars = vNextRow.GetSize();
  2489. for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2490. {
  2491. CExtControlBar * pBar = (CExtControlBar *)vNextRow[ nBar ];
  2492. ASSERT_VALID( pBar );
  2493. if( !pBar->IsKindOf( RUNTIME_CLASS(CExtControlBar) ) )
  2494. continue;
  2495. if( pBar->IsFixedMode() )
  2496. continue;
  2497. if( bHorz )
  2498. pBar->m_sizeDockedH.cy += nDiff;
  2499. else
  2500. pBar->m_sizeDockedV.cx += nDiff;
  2501. } // for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2502. } // if( nDiff != 0 )
  2503. */
  2504. m_pDockSite->RecalcLayout();
  2505. ASSERT_VALID( m_pDockBar );
  2506. if( m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockBar)) )
  2507. ((CExtDockBar *)m_pDockBar)->OnDynamicLayoutUpdate();
  2508. CExtPaintManager::stat_PassPaintMessages();
  2509. _OnControlBarPositionChange_InRowImpl(
  2510. this,
  2511. __ECBPC_ROW_RESIZING,
  2512. false,
  2513. false
  2514. );
  2515. return;
  2516. } // if( bShowContent )
  2517. _DrawResizingTracker( true );
  2518. m_nTrackerOffset =
  2519. bHorz ? ptCursorScreen.y : ptCursorScreen.x;
  2520. _OnControlBarPositionChange_InRowImpl(
  2521. this,
  2522. __ECBPC_ROW_RESIZING,
  2523. false,
  2524. false
  2525. );
  2526. _DrawResizingTracker( false );
  2527. }
  2528. bool CExtControlBar::g_bLockAllBars = false;
  2529. bool CExtControlBar::_DraggingIsEnabled(
  2530. const CExtControlBar * pBarQuerySrc
  2531. ) const
  2532. {
  2533. ASSERT_VALID( this );
  2534. ASSERT_VALID( pBarQuerySrc );
  2535. pBarQuerySrc;
  2536. return (! g_bLockAllBars );
  2537. }
  2538. bool CExtControlBar::_RowResizingIsEnabled(
  2539. const CExtControlBar * pBarQuerySrc
  2540. ) const
  2541. {
  2542. ASSERT_VALID( this );
  2543. ASSERT_VALID( pBarQuerySrc );
  2544. pBarQuerySrc;
  2545. return (! g_bLockAllBars );
  2546. }
  2547. bool CExtControlBar::_RowResizingGet() const
  2548. {
  2549. ASSERT_VALID( this );
  2550. return m_bRowResizing;
  2551. }
  2552. void CExtControlBar::_RowRecalcingStart()
  2553. {
  2554. ASSERT( !m_bRowRecalcing );
  2555. ASSERT( !m_bRowResizing );
  2556. CWnd::CancelToolTips();
  2557. CExtToolControlBar::_CloseTrackingMenus();
  2558. CExtPopupMenuWnd::CancelMenuTracking();
  2559. if( m_pDockSite->GetSafeHwnd() != NULL )
  2560. {
  2561. POSITION pos = m_pDockSite->m_listControlBars.GetHeadPosition();
  2562. for( ; pos != NULL; )
  2563. {
  2564. CControlBar * pBar = (CControlBar *)
  2565. m_pDockSite->m_listControlBars.GetNext( pos );
  2566. if( pBar->GetSafeHwnd() == NULL
  2567. || pBar->IsDockBar()
  2568. )
  2569. continue;
  2570. CExtMenuControlBar * pMenuBar =
  2571. DYNAMIC_DOWNCAST( CExtMenuControlBar, pBar );
  2572. if( pMenuBar == NULL )
  2573. continue;
  2574. pMenuBar->_CancelFlatTracking();
  2575. } // for( ; pos != NULL; )
  2576. } // if( m_pDockSite->GetSafeHwnd() != NULL )
  2577. if( ! _RowRecalcingIsEnabled(this) )
  2578. return;
  2579. _OnControlBarPositionChange_InRowImpl(
  2580. this,
  2581. __ECBPC_IN_ROW_RESIZING,
  2582. true,
  2583. false
  2584. );
  2585. m_bRowRecalcing = true;
  2586.     CExtMouseCaptureSink::SetCapture( GetSafeHwnd() );
  2587. ASSERT_VALID( m_pDockSite );
  2588. if( !_IsShowContentWhenRowRecalcing() )
  2589. {
  2590. CPoint ptCursorScreen( 0, 0 );
  2591. ::GetCursorPos( &ptCursorScreen );
  2592. m_nTrackerOffset =
  2593. IsDockedHorizontally()
  2594. ? ptCursorScreen.x
  2595. : ptCursorScreen.y;
  2596. m_nMetricOffset = 0;
  2597. _DrawRecalcingTracker( false );
  2598. } // if( !_IsShowContentWhenRowRecalcing() )
  2599. while( m_bRowRecalcing )
  2600. {
  2601. ::WaitMessage();
  2602. MSG msg;
  2603. // Process all the messages in the message queue
  2604. while( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
  2605. {
  2606. bool bStop = false;
  2607. switch( msg.message )
  2608. {
  2609. case WM_ACTIVATEAPP:
  2610. case WM_CANCELMODE:
  2611. // case WM_LBUTTONUP:
  2612. case WM_RBUTTONDOWN:
  2613. // case WM_NCLBUTTONUP:
  2614. case WM_NCLBUTTONDOWN:
  2615. case WM_NCRBUTTONUP:
  2616. case WM_NCRBUTTONDOWN:
  2617. case WM_MBUTTONDOWN:
  2618. case WM_MBUTTONUP:
  2619. case WM_NCMBUTTONDOWN:
  2620. case WM_NCMBUTTONUP:
  2621. case WM_CONTEXTMENU:
  2622. bStop = true;
  2623. break;
  2624. default:
  2625. if( WM_KEYFIRST <= msg.message
  2626. && msg.message <= WM_KEYLAST
  2627. )
  2628. bStop = true;
  2629. // else
  2630. // {
  2631. // if( CExtMouseCaptureSink::GetCapture() != GetSafeHwnd() )
  2632. // bStop = true;
  2633. // else
  2634. // {
  2635. // if( (!CExtPopupMenuWnd::
  2636. // IsKeyPressed(VK_LBUTTON))
  2637. // || CExtPopupMenuWnd::
  2638. // IsKeyPressed(VK_RBUTTON)
  2639. // || CExtPopupMenuWnd::
  2640. // IsKeyPressed(VK_MBUTTON)
  2641. // )
  2642. // bStop = true;
  2643. // }
  2644. // }
  2645. break;
  2646. } // switch( msg.message )
  2647. if( bStop )
  2648. {
  2649. _RowRecalcingStop( true );
  2650. break;
  2651. }
  2652. if( !AfxGetThread()->PumpMessage() )
  2653. {
  2654. PostQuitMessage(0);
  2655. break; // Signal WM_QUIT received
  2656. } // if( !AfxGetThread()->PumpMessage() )
  2657. } // while( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
  2658. if( m_bRowRecalcing && CExtControlBar::g_bEnableOnIdleCalls )
  2659. {
  2660. for( LONG nIdleCounter = 0L;
  2661. ::AfxGetThread()->OnIdle(nIdleCounter);
  2662. nIdleCounter ++
  2663. );
  2664. }
  2665. } // while( m_bRowRecalcing )
  2666. _OnControlBarPositionChange_InRowImpl(
  2667. this,
  2668. __ECBPC_IN_ROW_RESIZING,
  2669. false,
  2670. true
  2671. );
  2672. }
  2673. void CExtControlBar::_RowRecalcingStop( bool bCancel )
  2674. {
  2675. m_bRowRecalcing = false;
  2676. if( CExtMouseCaptureSink::GetCapture() == GetSafeHwnd() )
  2677. CExtMouseCaptureSink::ReleaseCapture();
  2678. ASSERT_VALID( m_pDockSite );
  2679. ASSERT_VALID( m_pDockBar );
  2680. ASSERT( !IsFloating() );
  2681. if( !_IsShowContentWhenRowRecalcing() )
  2682. {
  2683. _DrawRecalcingTracker( true );
  2684. if( !bCancel )
  2685. {
  2686. if( m_nMetricOffset != 0 )
  2687. {
  2688. bool bHorz = IsDockedHorizontally();
  2689. ExtControlBarVector_t vBars;
  2690. _GetRowExtBars( vBars );
  2691. INT nCountOfBars = (INT)vBars.GetSize();
  2692. ASSERT( nCountOfBars > 1 );
  2693. bool bThisPassed = false;
  2694. for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2695. {
  2696. CExtControlBar * pBar =
  2697. vBars[
  2698. m_bTopRecalcing
  2699. ? (nCountOfBars - nBar - 1)
  2700. : nBar
  2701. ];
  2702. ASSERT_VALID( pBar );
  2703. if( pBar == this )
  2704. {
  2705. bThisPassed = true;
  2706. continue;
  2707. }
  2708. if( !bThisPassed )
  2709. continue;
  2710. if( bHorz )
  2711. {
  2712. pBar->m_sizeDockedH.cx += m_nMetricOffset;
  2713. if( pBar->m_sizeDockedH.cx < pBar->_CalcDesiredMinHW() )
  2714. {
  2715. m_sizeDockedH.cx -=
  2716. pBar->_CalcDesiredMinHW() - pBar->m_sizeDockedH.cx;
  2717. pBar->m_sizeDockedH.cx = pBar->_CalcDesiredMinHW();
  2718. }
  2719. } // if( bHorz )
  2720. else
  2721. {
  2722. pBar->m_sizeDockedV.cy += m_nMetricOffset;
  2723. if( pBar->m_sizeDockedV.cy < pBar->_CalcDesiredMinVH() )
  2724. {
  2725. m_sizeDockedV.cy -=
  2726. pBar->_CalcDesiredMinVH() - pBar->m_sizeDockedV.cy;
  2727. pBar->m_sizeDockedV.cy = pBar->_CalcDesiredMinVH();
  2728. }
  2729. } // else from if( bHorz )
  2730. break;
  2731. } // for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2732. if( bHorz )
  2733. {
  2734. m_sizeDockedH.cx -= m_nMetricOffset;
  2735. if( m_sizeDockedH.cx < _CalcDesiredMinHW() )
  2736. {
  2737. m_sizeDockedH.cx +=
  2738. _CalcDesiredMinHW() - m_sizeDockedH.cx;
  2739. m_sizeDockedH.cx = _CalcDesiredMinHW();
  2740. }
  2741. } // if( bHorz )
  2742. else
  2743. {
  2744. m_sizeDockedV.cy -= m_nMetricOffset;
  2745. if( m_sizeDockedV.cy < _CalcDesiredMinVH() )
  2746. {
  2747. m_sizeDockedV.cy +=
  2748. _CalcDesiredMinVH() - m_sizeDockedV.cy;
  2749. m_sizeDockedV.cy = _CalcDesiredMinVH();
  2750. }
  2751. } // else from if( bHorz )
  2752. //xx//
  2753. //m_pDockSite->RecalcLayout();
  2754. GetParentFrame()->RecalcLayout();
  2755. } // if( m_nMetricOffset != 0 )
  2756. } // if( !bCancel )
  2757. /*ASSERT_VALID( m_pDockBar );
  2758. m_pDockBar->RedrawWindow(
  2759. NULL, NULL,
  2760. RDW_ERASE|RDW_INVALIDATE|RDW_UPDATENOW|RDW_ERASENOW
  2761. |RDW_ALLCHILDREN
  2762. |RDW_NOFRAME
  2763. );*/
  2764. } // if( !_IsShowContentWhenRowRecalcing() )
  2765. }
  2766. void CExtControlBar::_RowRecalcingUpdateState()
  2767. {
  2768. ASSERT( m_bRowRecalcing );
  2769. ASSERT_VALID( m_pDockBar );
  2770. ASSERT_VALID( m_pDockSite );
  2771. CPoint ptCursorScreen( 0, 0 );
  2772. ::GetCursorPos( &ptCursorScreen );
  2773. CPoint ptCursor( ptCursorScreen );
  2774. CRect rcBarWnd;
  2775. GetWindowRect( &rcBarWnd );
  2776. CPoint ptDevOffset = -rcBarWnd.TopLeft();
  2777. ptCursor += ptDevOffset;
  2778. CRect rcRowRecalc = _RectRowRecalcGet();
  2779. CRect rcRowRecalcUp = _RectRowRecalcUpGet();
  2780. bool bSysDragShowContent = _IsShowContentWhenRowRecalcing();
  2781. bool bHorz = IsDockedHorizontally();
  2782. if( bHorz )
  2783. {
  2784. if( m_bTopRecalcing )
  2785. {
  2786. INT nMetric =
  2787. max(
  2788. _CalcDesiredMinHW(),
  2789. (m_sizeDockedH.cx - ptCursor.x + rcRowRecalcUp.Width()/2)
  2790. );
  2791. m_nMetricOffset = m_sizeDockedH.cx - nMetric;
  2792. if( m_nMetricOffset == 0 )
  2793. return;
  2794. if( bSysDragShowContent )
  2795. m_sizeDockedH.cx = nMetric;
  2796. } // if( m_bTopRecalcing )
  2797. else
  2798. {
  2799. INT nMetric =
  2800. max(
  2801. _CalcDesiredMinHW(),
  2802. (ptCursor.x + rcRowRecalc.Width()/2)
  2803. );
  2804. m_nMetricOffset = m_sizeDockedH.cx - nMetric;
  2805. if( m_nMetricOffset == 0 )
  2806. return;
  2807. if( bSysDragShowContent )
  2808. m_sizeDockedH.cx = nMetric;
  2809. } // else from if( bTopRecalcing )
  2810. } // if( bHorz )
  2811. else
  2812. {
  2813. if( m_bTopRecalcing )
  2814. {
  2815. INT nMetric =
  2816. max(
  2817. _CalcDesiredMinVH(),
  2818. (m_sizeDockedV.cy - ptCursor.y + rcRowRecalcUp.Height()/2)
  2819. );
  2820. m_nMetricOffset = m_sizeDockedV.cy - nMetric;
  2821. if( m_nMetricOffset == 0 )
  2822. return;
  2823. if( bSysDragShowContent )
  2824. m_sizeDockedV.cy = nMetric;
  2825. } // if( m_bTopRecalcing )
  2826. else
  2827. {
  2828. INT nMetric =
  2829. max(
  2830. _CalcDesiredMinVH(),
  2831. (ptCursor.y + rcRowRecalc.Height()/2)
  2832. );
  2833. m_nMetricOffset = m_sizeDockedV.cy - nMetric;
  2834. if( m_nMetricOffset == 0 )
  2835. return;
  2836. if( bSysDragShowContent )
  2837. m_sizeDockedV.cy = nMetric;
  2838. } // else from if( m_bTopRecalcing )
  2839. } // else from if( bHorz )
  2840. ASSERT( m_nMetricOffset != 0 );
  2841. if( bSysDragShowContent )
  2842. {
  2843. ExtControlBarVector_t vBars;
  2844. _GetRowExtBars( vBars );
  2845. INT nCountOfBars = (INT)vBars.GetSize();
  2846. ASSERT( nCountOfBars > 1 );
  2847. bool bThisPassed = false;
  2848. for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2849. {
  2850. CExtControlBar * pBar =
  2851. vBars[
  2852. m_bTopRecalcing
  2853. ? (nCountOfBars - nBar - 1)
  2854. : nBar
  2855. ];
  2856. ASSERT_VALID( pBar );
  2857. if( pBar == this )
  2858. {
  2859. bThisPassed = true;
  2860. continue;
  2861. }
  2862. if( !bThisPassed )
  2863. continue;
  2864. if( bHorz )
  2865. {
  2866. pBar->m_sizeDockedH.cx += m_nMetricOffset;
  2867. if( pBar->m_sizeDockedH.cx < pBar->_CalcDesiredMinHW() )
  2868. {
  2869. m_sizeDockedH.cx -=
  2870. pBar->_CalcDesiredMinHW() - pBar->m_sizeDockedH.cx;
  2871. pBar->m_sizeDockedH.cx = pBar->_CalcDesiredMinHW();
  2872. }
  2873. } // if( bHorz )
  2874. else
  2875. {
  2876. pBar->m_sizeDockedV.cy += m_nMetricOffset;
  2877. if( pBar->m_sizeDockedV.cy < pBar->_CalcDesiredMinVH() )
  2878. {
  2879. m_sizeDockedV.cy -=
  2880. pBar->_CalcDesiredMinVH() - pBar->m_sizeDockedV.cy;
  2881. pBar->m_sizeDockedV.cy = pBar->_CalcDesiredMinVH();
  2882. }
  2883. } // else from if( bHorz )
  2884. break;
  2885. } // for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2886. m_pDockSite->RecalcLayout();
  2887. _OnControlBarPositionChange_InRowImpl(
  2888. this,
  2889. __ECBPC_IN_ROW_RESIZING,
  2890. false,
  2891. false
  2892. );
  2893. ASSERT_VALID( m_pDockBar );
  2894. if( m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockBar)) )
  2895. ((CExtDockBar *)m_pDockBar)->OnDynamicLayoutUpdate();
  2896. return;
  2897. } // if( bSysDragShowContent )
  2898. ASSERT_VALID( m_pDockBar );
  2899. CRect rcDockBarWnd;
  2900. m_pDockBar->GetWindowRect( &rcDockBarWnd );
  2901. INT nMinTrackerOffset = bHorz ?
  2902. rcDockBarWnd.left : rcDockBarWnd.top;
  2903. if( m_bTopRecalcing )
  2904. {
  2905. MfcControlBarVector_t vBars;
  2906. _GetRowBars( vBars );
  2907. INT nCountOfBars = (INT)vBars.GetSize();
  2908. for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2909. {
  2910. CControlBar * pBar = vBars[ nBar ];
  2911. ASSERT_VALID( pBar );
  2912. if( !pBar->IsVisible() )
  2913. continue;
  2914. CExtControlBar * pExtBar =
  2915. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  2916. if( pExtBar != NULL && pExtBar->IsFixedMode() )
  2917. pExtBar = NULL;
  2918. if( pExtBar == NULL )
  2919. {
  2920. CRect rcBarWnd;
  2921. pBar->GetWindowRect( &rcBarWnd );
  2922. nMinTrackerOffset += bHorz ?
  2923. rcBarWnd.Width() : rcBarWnd.Height();
  2924. } // if( pExtBar == NULL )
  2925. else
  2926. {
  2927. nMinTrackerOffset += bHorz
  2928. ? pExtBar->_CalcDesiredMinHW()
  2929. : pExtBar->_CalcDesiredMinVH();
  2930. } // else from if( pExtBar == NULL )
  2931. if( pBar == this )
  2932. break;
  2933. } // for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2934. } // if( m_bTopRecalcing )
  2935. else
  2936. {
  2937. nMinTrackerOffset = bHorz
  2938. ? rcBarWnd.left + _CalcDesiredMinHW()
  2939. : rcBarWnd.top  + _CalcDesiredMinVH()
  2940. ;
  2941. } // else from if( m_bTopRecalcing )
  2942. INT nMaxTrackerOffset = 0;
  2943. if( m_bTopRecalcing )
  2944. {
  2945. nMaxTrackerOffset = bHorz
  2946. ? rcBarWnd.right  - _CalcDesiredMinHW()
  2947. : rcBarWnd.bottom - _CalcDesiredMinVH()
  2948. ;
  2949. } // if( m_bTopRecalcing )
  2950. else
  2951. {
  2952. nMaxTrackerOffset = bHorz ?
  2953. rcDockBarWnd.right : rcDockBarWnd.bottom;
  2954. MfcControlBarVector_t vBars;
  2955. _GetRowBars( vBars );
  2956. INT nCountOfBars = (INT)vBars.GetSize();
  2957. for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2958. {
  2959. CControlBar * pBar = vBars[ nCountOfBars - nBar - 1 ];
  2960. ASSERT_VALID( pBar );
  2961. if( !pBar->IsVisible() )
  2962. continue;
  2963. if( pBar == this )
  2964. break;
  2965. CExtControlBar * pExtBar =
  2966. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  2967. if( pExtBar != NULL && pExtBar->IsFixedMode() )
  2968. pExtBar = NULL;
  2969. if( pExtBar == NULL )
  2970. {
  2971. CRect rcBarWnd;
  2972. pBar->GetWindowRect( &rcBarWnd );
  2973. nMaxTrackerOffset -= bHorz ?
  2974. rcBarWnd.Width() : rcBarWnd.Height();
  2975. } // if( pExtBar == NULL )
  2976. else
  2977. {
  2978. nMaxTrackerOffset -= bHorz
  2979. ? pExtBar->_CalcDesiredMinHW()
  2980. : pExtBar->_CalcDesiredMinVH();
  2981. } // else from if( pExtBar == NULL )
  2982. } // for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  2983. } // else from if( m_bTopRecalcing )
  2984. _DrawRecalcingTracker( true );
  2985. m_nTrackerOffset = bHorz
  2986. ? ptCursorScreen.x
  2987. : ptCursorScreen.y;
  2988. ASSERT( nMinTrackerOffset <= nMaxTrackerOffset );
  2989. if( m_nTrackerOffset < nMinTrackerOffset )
  2990. m_nTrackerOffset = nMinTrackerOffset;
  2991. if( m_nTrackerOffset > nMaxTrackerOffset )
  2992. m_nTrackerOffset = nMaxTrackerOffset;
  2993. _OnControlBarPositionChange_InRowImpl(
  2994. this,
  2995. __ECBPC_IN_ROW_RESIZING,
  2996. false,
  2997. false
  2998. );
  2999. _DrawRecalcingTracker( false );
  3000. }
  3001. bool CExtControlBar::_RowRecalcingIsEnabled(
  3002. const CExtControlBar * pBarQuerySrc
  3003. ) const
  3004. {
  3005. ASSERT_VALID( this );
  3006. ASSERT_VALID( pBarQuerySrc );
  3007. pBarQuerySrc;
  3008. return (! g_bLockAllBars );
  3009. }
  3010. bool CExtControlBar::_RowRecalcingGet() const
  3011. {
  3012. ASSERT_VALID( this );
  3013. return m_bRowRecalcing;
  3014. }
  3015. void CExtControlBar::_DrawResizingTracker( bool bErasingPrevious )
  3016. {
  3017. ASSERT_VALID( this );
  3018. ASSERT( !IsFloating() );
  3019. ASSERT_VALID( m_pDockSite );
  3020. ASSERT_VALID( m_pDockBar );
  3021. CRect rcDockBar;
  3022. m_pDockBar->GetWindowRect( &rcDockBar );
  3023. if( rcDockBar.IsRectEmpty() )
  3024. return;
  3025. CRect rcRowResize = _RectRowResizeGet();
  3026. CRect rcTracker( rcDockBar );
  3027. if( IsDockedHorizontally() )
  3028. {
  3029. rcTracker.top =
  3030. m_nTrackerOffset - rcRowResize.Height()/2;
  3031. rcTracker.bottom =
  3032. m_nTrackerOffset + rcRowResize.Height()/2;
  3033. } // if( IsDockedHorizontally() )
  3034. else
  3035. {
  3036. rcTracker.left =
  3037. m_nTrackerOffset - rcRowResize.Width()/2;
  3038. rcTracker.right =
  3039. m_nTrackerOffset + rcRowResize.Width()/2;
  3040. } // else from if( IsDockedHorizontally() )
  3041. CFrameWnd * pFrame = GetDockingFrame(); // m_pDockSite;
  3042. ASSERT_VALID( pFrame );
  3043. CRect rcDockingFrame;
  3044. pFrame->GetWindowRect( &rcDockingFrame );
  3045. rcTracker.OffsetRect( -rcDockingFrame.TopLeft() );
  3046. CDC * pDC = pFrame->GetDCEx( NULL, __DOCKSITE_DCX_FLAGS );
  3047. DWORD dwOldLayout = pDC->SetLayout( LAYOUT_LTR );
  3048. MsgDrawTrackedAreaData_t _MsgDrawTrackedAreaData(
  3049. *this,
  3050. *pDC,
  3051. __EDTAT_RESIZING_ENTIRE_ROW,
  3052. rcTracker,
  3053. bErasingPrevious
  3054. );
  3055. _MsgDrawTrackedAreaData.NotifyOrDrawDefault();
  3056. pDC->SetLayout( dwOldLayout );
  3057.     pFrame->ReleaseDC(pDC);
  3058. }
  3059. void CExtControlBar::_DrawRecalcingTracker( bool bErasingPrevious )
  3060. {
  3061. ASSERT_VALID( this );
  3062. ASSERT( !IsFloating() );
  3063. ASSERT_VALID( m_pDockSite );
  3064. ASSERT_VALID( m_pDockBar );
  3065. CRect rcRowRecalc = _RectRowRecalcGet();
  3066. CRect rcRowRecalcUp = _RectRowRecalcUpGet();
  3067. CRect rcTracker;
  3068. GetWindowRect( &rcTracker );
  3069. if( IsDockedHorizontally() )
  3070. {
  3071. INT nMetric =
  3072. m_bTopRecalcing
  3073. ? rcRowRecalcUp.Width()/2
  3074. : rcRowRecalc.Width()/2;
  3075. rcTracker.left =
  3076. m_nTrackerOffset - nMetric;
  3077. rcTracker.right =
  3078. m_nTrackerOffset + nMetric;
  3079. } // if( IsDockedHorizontally() )
  3080. else
  3081. {
  3082. INT nMetric =
  3083. m_bTopRecalcing
  3084. ? rcRowRecalcUp.Height()/2
  3085. : rcRowRecalc.Height()/2;
  3086. rcTracker.top =
  3087. m_nTrackerOffset - nMetric;
  3088. rcTracker.bottom =
  3089. m_nTrackerOffset + nMetric;
  3090. } // else from if( IsDockedHorizontally() )
  3091. CFrameWnd * pFrame = GetDockingFrame(); // m_pDockSite;
  3092. ASSERT_VALID( pFrame );
  3093. CRect rcDockingFrame;
  3094. pFrame->GetWindowRect( &rcDockingFrame );
  3095. rcTracker.OffsetRect( -rcDockingFrame.TopLeft() );
  3096. CDC * pDC = pFrame->GetDCEx( NULL, __DOCKSITE_DCX_FLAGS );
  3097. DWORD dwOldLayout = pDC->SetLayout( LAYOUT_LTR );
  3098. MsgDrawTrackedAreaData_t _MsgDrawTrackedAreaData(
  3099. *this,
  3100. *pDC,
  3101. __EDTAT_RESIZING_ENTIRE_ROW,
  3102. rcTracker,
  3103. bErasingPrevious
  3104. );
  3105. _MsgDrawTrackedAreaData.NotifyOrDrawDefault();
  3106. pDC->SetLayout( dwOldLayout );
  3107.     pFrame->ReleaseDC(pDC);
  3108. }
  3109. bool CExtControlBar::IsOleIpObjActive(
  3110. CFrameWnd * pFrameSearch
  3111. )
  3112. {
  3113. if( FindPrintPreviewMode( pFrameSearch ) )
  3114. return false;
  3115. if( pFrameSearch == NULL )
  3116. {
  3117. pFrameSearch =
  3118. DYNAMIC_DOWNCAST( CFrameWnd, AfxGetMainWnd() );
  3119. if( pFrameSearch == NULL )
  3120. return false;
  3121. }
  3122. //ASSERT_VALID( pFrameSearch );
  3123. if( pFrameSearch->IsKindOf(RUNTIME_CLASS(CMiniDockFrameWnd)) )
  3124. {
  3125. pFrameSearch = pFrameSearch->GetParentFrame();
  3126. ASSERT_VALID( pFrameSearch );
  3127. ASSERT( !pFrameSearch->IsKindOf(RUNTIME_CLASS(CMiniDockFrameWnd)) );
  3128. }
  3129. CMDIFrameWnd * pFrameSearchMDI =
  3130. DYNAMIC_DOWNCAST(
  3131. CMDIFrameWnd,
  3132. pFrameSearch
  3133. );
  3134. if( pFrameSearchMDI != NULL
  3135. && pFrameSearchMDI->m_hWndMDIClient != NULL
  3136. && ::IsWindow( pFrameSearchMDI->m_hWndMDIClient )
  3137. )
  3138. {
  3139. // pFrameSearch = NULL;
  3140. // BOOL bMaximized = FALSE;
  3141. // HWND hWndActiveFrame = (HWND)
  3142. // ::SendMessage(
  3143. // pFrameSearchMDI->m_hWndMDIClient,
  3144. // WM_MDIGETACTIVE,
  3145. // 0,
  3146. // (LPARAM)&bMaximized
  3147. // );
  3148. // if( hWndActiveFrame != NULL )
  3149. // {
  3150. // CWnd * pWndPermanent =
  3151. // CWnd::FromHandlePermanent( hWndActiveFrame );
  3152. // if( pWndPermanent != NULL )
  3153. // {
  3154. // CMDIChildWnd * pWndMDIChild =
  3155. // DYNAMIC_DOWNCAST(
  3156. // CMDIChildWnd,
  3157. // pWndPermanent
  3158. // );
  3159. // if( pWndMDIChild != NULL
  3160. // && (! pWndMDIChild->m_bPseudoInactive )
  3161. // && (pWndMDIChild->GetStyle()&WS_VISIBLE) != 0
  3162. // )
  3163. // pFrameSearch = pWndMDIChild;
  3164. // }
  3165. // }
  3166. pFrameSearch = ((CMDIFrameWnd*)pFrameSearch)->GetActiveFrame();
  3167. if( pFrameSearch == NULL )
  3168. return false;
  3169. }
  3170. bool bOleInplaceItemActivated = false;
  3171. CView * pActiveView = pFrameSearch->GetActiveView();
  3172. if( pActiveView != NULL
  3173. && (! pActiveView->IsKindOf(RUNTIME_CLASS(CPreviewView)) )
  3174. )
  3175. {
  3176. ASSERT_VALID( pActiveView );
  3177. CDocument * pActiveDoc = pActiveView->GetDocument();
  3178. if( pActiveDoc != NULL )
  3179. {
  3180. ASSERT_VALID( pActiveDoc );
  3181. COleDocument * pActiveOleDoc = 
  3182. DYNAMIC_DOWNCAST(COleDocument,pActiveDoc);
  3183. if( pActiveOleDoc != NULL )
  3184. {
  3185. ASSERT_VALID( pActiveOleDoc );
  3186. COleClientItem * pItem =
  3187. pActiveOleDoc->GetInPlaceActiveItem(pActiveView);
  3188. if( pItem != NULL )
  3189. bOleInplaceItemActivated = true;
  3190. } // if( pActiveOleDoc != NULL )
  3191. } // if( pActiveDoc != NULL )
  3192. } // if( pActiveView != NULL ...
  3193. return bOleInplaceItemActivated;
  3194. }
  3195. bool CExtControlBar::IsOleIpObjActive() const
  3196. {
  3197. ASSERT_VALID( this );
  3198. return IsOleIpObjActive( _GetDockingFrameImpl() );
  3199. }
  3200. bool CExtControlBar::SafeDisplayBar()
  3201. {
  3202. if( m_bPresubclassDialogMode )
  3203. {
  3204. if( GetStyle() & WS_VISIBLE )
  3205. return true;
  3206. return false;
  3207. }
  3208. if( IsVisible() )
  3209. {
  3210. if( (m_nStateFlags & delayShow) == 0 )
  3211. return true;
  3212. } // if( IsVisible() )
  3213. if( m_nStateFlags &
  3214. //(CControlBar::delayHide | CControlBar::tempHide)
  3215. CControlBar::tempHide
  3216. )
  3217. return false;
  3218. CFrameWnd * pFrame =
  3219. _GetDockingFrameImpl();
  3220. ASSERT_VALID( pFrame );
  3221. bool bOleInplaceItemActivated =
  3222. //CExtControlBar::IsOleIpObjActive( pFrame );
  3223. IsOleIpObjActive();
  3224. if( bOleInplaceItemActivated &&
  3225. (m_dwStyle & CBRS_HIDE_INPLACE)
  3226. )
  3227. return false;
  3228. // pFrame->ShowControlBar( this, TRUE, TRUE );
  3229. // pFrame = GetParentFrame();
  3230. // ASSERT_VALID( pFrame );
  3231. // pFrame->RecalcLayout();
  3232. CExtControlBar::DoFrameBarCheckCmd(
  3233. pFrame,
  3234. UINT(GetDlgCtrlID())
  3235. );
  3236. HWND hWndThis = GetSafeHwnd();
  3237. CExtPopupMenuWnd::PassMsgLoop(false);
  3238. if( ! ::IsWindow(hWndThis) )
  3239. return false;
  3240. if( !IsVisible() )
  3241. {
  3242. ASSERT( FALSE );
  3243. return false;
  3244. }
  3245. return true;
  3246. }
  3247. bool CExtControlBar::IsSingleOnRow(
  3248. bool bOnlyFixed, // = false
  3249. bool bOnlyNonFixed // = false
  3250. ) const
  3251. {
  3252. ASSERT_VALID( this );
  3253. ASSERT( !IsFloating() );
  3254. ASSERT_VALID( m_pDockBar );
  3255. INT nTotalDockCount = (INT)m_pDockBar->m_arrBars.GetSize();
  3256. bool bThisFound = false;
  3257. INT nCountInRow = 0;
  3258. for( INT nBar = 0; nBar < nTotalDockCount; nBar++ )
  3259. {
  3260. CControlBar * pBar = (CControlBar *)
  3261. m_pDockBar->m_arrBars[ nBar ];
  3262. if( pBar == NULL )
  3263. {
  3264. if( bThisFound )
  3265. break;
  3266. nCountInRow = 0;
  3267. continue;
  3268. }
  3269. if( __PLACEHODLER_BAR_PTR( pBar ) )
  3270. continue;
  3271. ASSERT_KINDOF( CControlBar, pBar );
  3272. if( pBar == (CControlBar *)this )
  3273. bThisFound = true;
  3274. if( !pBar->IsVisible() )
  3275. continue;
  3276. if( bOnlyFixed || bOnlyNonFixed )
  3277. {
  3278. bool bFixed = true;
  3279. if( pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar))
  3280. && !((CExtControlBar *)pBar)->IsFixedMode()
  3281. )
  3282. bFixed = false;
  3283. if( bOnlyFixed && !bFixed )
  3284. continue;
  3285. if( !bOnlyFixed && bFixed )
  3286. continue;
  3287. } // if( bOnlyFixed || bOnlyNonFixed )
  3288. nCountInRow++;
  3289. if( bThisFound && nCountInRow > 1 )
  3290. return false;
  3291. } // for( INT nBar = 0; nBar < nTotalDockCount; nBar++ )
  3292. // ASSERT( nCountInRow >= 1 );
  3293. return (nCountInRow == 1) ? true : false;
  3294. }
  3295. void CExtControlBar::MakeSingleOnRow()
  3296. {
  3297. CFrameWnd * pFrame = GetDockingFrame();
  3298. ASSERT_VALID( pFrame );
  3299. pFrame->RecalcLayout();
  3300. ASSERT_VALID( m_pDockBar );
  3301. int nPos = m_pDockBar->FindBar( this );
  3302. ASSERT( 1 <= nPos && nPos < m_pDockBar->m_arrBars.GetSize() );
  3303. if( nPos < m_pDockBar->m_arrBars.GetSize()
  3304. && m_pDockBar->m_arrBars[nPos+1] != NULL
  3305. )
  3306. m_pDockBar->m_arrBars.InsertAt(
  3307. nPos+1, ((CControlBar*)NULL) );
  3308. if( m_pDockBar->m_arrBars[nPos-1] != NULL )
  3309. m_pDockBar->m_arrBars.InsertAt(
  3310. nPos, ((CControlBar*)NULL) );
  3311. if( IsDockedHorizontally() )
  3312. m_sizeDockedH = CSize( MAXSHORT, m_sizeDockedH.cy );
  3313. else
  3314. m_sizeDockedV = CSize( m_sizeDockedV.cx, MAXSHORT );
  3315. pFrame->RecalcLayout();
  3316. }
  3317. bool CExtControlBar::IsMinimizedOnRow() const
  3318. {
  3319. if( IsDockedVertically()
  3320. && m_sizeDockedV.cy == _CalcDesiredMinVH()
  3321. )
  3322. return true;
  3323. if( IsDockedHorizontally()
  3324. && m_sizeDockedH.cx == _CalcDesiredMinHW()
  3325. )
  3326. return true;
  3327. return false;
  3328. }
  3329. bool CExtControlBar::IsMaximizedOnRow() const
  3330. {
  3331. if( IsFloating() )
  3332. return false;
  3333. if(IsMinimizedOnRow())
  3334. return false;
  3335. ExtControlBarVector_t vBars;
  3336. ( const_cast < CExtControlBar * > ( this ) ) ->
  3337. _GetRowExtBars(
  3338. vBars
  3339. );
  3340. INT nCountOfBars = (INT)vBars.GetSize();
  3341. for( int nBar = 0; nBar < nCountOfBars; nBar++ )
  3342. {
  3343. CExtControlBar * pBar = vBars[ nBar ];
  3344. ASSERT( pBar != NULL );
  3345. if( pBar == this )
  3346. continue;
  3347. if( !(pBar->IsMinimizedOnRow()) )
  3348. return false;
  3349. }
  3350. return true;
  3351. }
  3352. void CExtControlBar::MinimizeOnRow()
  3353. {
  3354. ASSERT_VALID( this );
  3355. ASSERT_VALID( m_pDockSite );
  3356. ASSERT_VALID( m_pDockBar );
  3357. ASSERT( GetSafeHwnd() != NULL );
  3358. ASSERT( ::IsWindow( GetSafeHwnd() ) != NULL );
  3359. if( IsFloating () || IsSingleOnRow() )
  3360. return;
  3361. ExtControlBarVector_t vBars;
  3362.     _GetRowExtBars(vBars);
  3363. INT nCountOfBars = (INT)vBars.GetSize();
  3364. if( nCountOfBars <= 1 )
  3365. return;
  3366. CExtDockBar * pDockBar =
  3367. (CExtDockBar*) m_pDockBar;
  3368. ASSERT( pDockBar != NULL );
  3369. BOOL bHorz = IsDockedHorizontally();
  3370. INT nCalcExtentMax = 0;
  3371. if( bHorz )
  3372. {
  3373. INT nMin = _CalcDesiredMinHW();
  3374. nCalcExtentMax = m_sizeDockedH.cx - nMin;
  3375. m_sizeDockedH.cx = nMin;
  3376. ASSERT( nCalcExtentMax >= 0 );
  3377. }
  3378. else
  3379. {
  3380. INT nMin = _CalcDesiredMinVH();
  3381. nCalcExtentMax = m_sizeDockedV.cy - nMin;
  3382. m_sizeDockedV.cy = nMin;
  3383. ASSERT( nCalcExtentMax >= 0 );
  3384. }
  3385. for( INT nBar = 0; nCalcExtentMax > 0; nBar++ )
  3386. {
  3387. if( nBar == nCountOfBars )
  3388. nBar = 0;
  3389. CExtControlBar * pBar = vBars[ nBar ];
  3390. ASSERT_VALID( pBar );
  3391. if( pBar != this )
  3392. {
  3393. if( bHorz )
  3394. pBar->m_sizeDockedH.cx++;
  3395. else
  3396. pBar->m_sizeDockedV.cy++;
  3397. nCalcExtentMax--;
  3398. } // if( pBar != this )
  3399. } // for( nBar = 0; nCalcExtentMax > 0; nBar++ )
  3400. GetParentFrame()->RecalcLayout();
  3401. //_GetDockingFrameImpl()->SetFocus();
  3402. }
  3403. void CExtControlBar::MaximizeOnRow()
  3404. {
  3405. ASSERT_VALID( this );
  3406. ASSERT_VALID( m_pDockSite );
  3407. ASSERT_VALID( m_pDockBar );
  3408. ASSERT( GetSafeHwnd() != NULL );
  3409. ASSERT( ::IsWindow( GetSafeHwnd() ) != NULL );
  3410. if( IsFloating () || IsSingleOnRow() )
  3411. return;
  3412. ExtControlBarVector_t vBars;
  3413.     _GetRowExtBars(vBars);
  3414. INT nCountOfBars = (INT)vBars.GetSize();
  3415. if( nCountOfBars <= 1 )
  3416. return;
  3417. CExtDockBar * pDockBar =
  3418. (CExtDockBar*) m_pDockBar;
  3419. ASSERT( pDockBar != NULL );
  3420. BOOL bHorz = IsDockedHorizontally();
  3421. INT nMetric = 0;
  3422. for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  3423. {
  3424. CExtControlBar * pBar = vBars[ nBar ];
  3425. ASSERT_VALID( pBar );
  3426. if( pBar == this )
  3427. continue;
  3428. if( bHorz )
  3429. {
  3430. INT nMin = pBar->_CalcDesiredMinHW();
  3431. nMetric += pBar->m_sizeDockedH.cx - nMin;
  3432. pBar->m_sizeDockedH.cx = nMin;
  3433. }
  3434. else
  3435. {
  3436. INT nMin = pBar->_CalcDesiredMinVH();
  3437. nMetric += pBar->m_sizeDockedV.cy - nMin;
  3438. pBar->m_sizeDockedV.cy = nMin;
  3439. }
  3440. } // for( INT nBar = 0; nBar < nCountOfBars; nBar++ )
  3441. if( bHorz )
  3442. m_sizeDockedH.cx += nMetric;
  3443. else
  3444. m_sizeDockedV.cy += nMetric;
  3445. GetParentFrame()->RecalcLayout();
  3446. }
  3447. void CExtControlBar::OnRepositionSingleChild(
  3448. int cx, // = -1, // if negative - get from client area
  3449. int cy, // = -1
  3450. bool bRedraw // = TRUE
  3451. )
  3452. {
  3453. if( ! m_bReposSingleChildMode )
  3454. return;
  3455.     // automatic child resizing - only one child is allowed
  3456. HWND hWndChild = ::GetWindow( m_hWnd, GW_CHILD );
  3457.     if( hWndChild == NULL )
  3458. return;
  3459. ASSERT( ::IsWindow( hWndChild ) );
  3460. ASSERT( ::GetWindow( hWndChild, GW_HWNDNEXT ) == NULL );
  3461. CRect rcClient;
  3462. if( cx < 0 || cy < 0 )
  3463. GetClientRect( &rcClient );
  3464. else
  3465. rcClient.SetRect( 0, 0, cx, cy );
  3466. if( IsFloating() )
  3467. {
  3468. // CSize sizeFrame(
  3469. // ::GetSystemMetrics(SM_CXSIZEFRAME),
  3470. // ::GetSystemMetrics(SM_CYSIZEFRAME)
  3471. // );
  3472. // rcClient.DeflateRect( sizeFrame );
  3473. rcClient.DeflateRect( 1, 1 );
  3474. } // if( IsFloating() )
  3475. CRect rcChild;
  3476. ::GetWindowRect( hWndChild, &rcChild );
  3477. ScreenToClient( &rcChild );
  3478. if( rcChild == rcClient )
  3479. return;
  3480. ::MoveWindow(
  3481. hWndChild,
  3482. rcClient.left,
  3483. rcClient.top,
  3484. rcClient.Width(),
  3485. rcClient.Height(),
  3486. bRedraw ? TRUE : FALSE
  3487. );
  3488. }
  3489. void CExtControlBar::OnSize(UINT nType, int cx, int cy) 
  3490. {
  3491. nType;
  3492. if( m_bUpdatingChain )
  3493. return;
  3494. OnRepositionSingleChild( cx, cy, true );
  3495. CFrameWnd * pFrame = GetParentFrame();
  3496. if( pFrame != NULL
  3497. && pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd))
  3498. )
  3499. {
  3500. OnNcAreaButtonsReposition();
  3501. pFrame->SendMessage( WM_NCPAINT );
  3502. }
  3503. }
  3504. void CExtControlBar::_Dragging_OnStart()
  3505. {
  3506. CWnd::CancelToolTips();
  3507. CExtPopupMenuWnd::CancelMenuTracking();
  3508. ASSERT_VALID( m_pDockBar );
  3509. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3510. CExtDockDynTabBar * pTabbedDockBar =
  3511. DYNAMIC_DOWNCAST(
  3512. CExtDockDynTabBar,
  3513. m_pDockBar
  3514. );
  3515. if( pTabbedDockBar != NULL )
  3516. {
  3517. CExtDynTabControlBar * pTabbedBar =
  3518. STATIC_DOWNCAST(
  3519. CExtDynTabControlBar,
  3520. pTabbedDockBar->GetParent()
  3521. );
  3522. ASSERT_VALID( pTabbedBar );
  3523. pTabbedBar->SaveIndex( this );
  3524. }
  3525. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3526. GetOwner()->
  3527. SendMessage(
  3528. WM_SETMESSAGESTRING,
  3529. IDS_EXTSTATUS_PREVENT_DOCKING
  3530. );
  3531. }
  3532. void CExtControlBar::_Dragging_OnStop(
  3533. InternalDraggingState_t & _dsOld,
  3534. InternalDraggingState_t & _dsNew,
  3535. bool bCancel
  3536. )
  3537. {
  3538. _dsOld, _dsNew, bCancel;
  3539. GetOwner()->
  3540. SendMessage(
  3541. WM_SETMESSAGESTRING,
  3542. AFX_IDS_IDLEMESSAGE
  3543. );
  3544. ASSERT_VALID( this );
  3545. if( IsFixedMode() )
  3546. return;
  3547. ASSERT_VALID( (&_dsOld) );
  3548. ASSERT_VALID( (&_dsNew) );
  3549. ASSERT( _dsNew.ExtBarSrcGet() == this );
  3550. ASSERT_VALID( m_pDockBar );
  3551. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3552. CExtDockDynTabBar * pTabbedDockBar =
  3553. DYNAMIC_DOWNCAST(
  3554. CExtDockDynTabBar,
  3555. m_pDockBar
  3556. );
  3557. if( pTabbedDockBar != NULL )
  3558. {
  3559. CExtDynTabControlBar * pTabbedBar =
  3560. STATIC_DOWNCAST(
  3561. CExtDynTabControlBar,
  3562. pTabbedDockBar->GetParent()
  3563. );
  3564. ASSERT_VALID( pTabbedBar );
  3565. pTabbedBar->RemoveTemporaryItems( false );
  3566. if( bCancel )
  3567. {
  3568. pTabbedBar->RestoreIndex( this );
  3569. pTabbedBar->SelectControlBar( this );
  3570. } // if( bCancel )
  3571. } // if( pTabbedDockBar != NULL )
  3572. if( bCancel && _dsNew.ExtBarDstGet() != NULL )
  3573. {
  3574. CExtDynTabControlBar * pTabbedBar =
  3575. DYNAMIC_DOWNCAST(
  3576. CExtDynTabControlBar,
  3577. _dsNew.ExtBarDstGet()
  3578. );
  3579. if( pTabbedBar != NULL )
  3580. {
  3581. pTabbedBar->RemoveTemporaryItems( false );
  3582. }
  3583. } // if( bCancel && _dsNew.ExtBarDstGet() != NULL )
  3584. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3585. }
  3586. void CExtControlBar::_SetCursor(
  3587. const CPoint & point
  3588. )
  3589. {
  3590. bool bCustomizeMode = false;
  3591. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3592. CExtCustomizeSite * pSite = NotifiedCustomizeSiteGet();
  3593. if( pSite != NULL )
  3594. {
  3595. if( pSite->DraggedNodeGet() != NULL )
  3596. return;
  3597. bCustomizeMode = pSite->IsCustomizeMode();
  3598. } // if( pSite != NULL )
  3599. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3600. if( ! bCustomizeMode )
  3601. {
  3602. if( CExtControlBar::FindHelpMode(this) )
  3603. return;
  3604. } // if( ! bCustomizeMode )
  3605. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3606. else
  3607. {
  3608. ASSERT( ! CExtControlBar::FindHelpMode(this) );
  3609. } // else from if( !bCustomizeMode )
  3610. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3611. HCURSOR hCursor = NULL;
  3612. if( ! m_bPresubclassDialogMode )
  3613. {
  3614. if( m_bDragging || m_bDragDetecting || m_bRowResizing || m_bRowRecalcing )
  3615. { // if can analyze resize cursors
  3616. if( m_bDragging || m_bDragDetecting && ( ! ( m_bRowResizing || m_bRowRecalcing ) ) )
  3617. {
  3618. //ASSERT( ! ( m_bRowResizing || m_bRowRecalcing ) );
  3619. hCursor = g_hCursorArrow;
  3620. if( ( m_bDragDetecting || m_bDragging ) && IsFixedDockStyle() )
  3621. {
  3622. if( m_bDragging )
  3623. hCursor = g_hCursorDrag;
  3624. else
  3625. {
  3626. CRect rcBarWnd;
  3627. GetWindowRect( &rcBarWnd );
  3628. CPoint ptDevOffset = -rcBarWnd.TopLeft();
  3629. CPoint ptWnd; //( point );
  3630. //ClientToScreen( &ptWnd );
  3631. ::GetCursorPos( &ptWnd );
  3632. ptWnd += ptDevOffset;
  3633. CRect rcGrip = _RectGripGet();
  3634. if( rcGrip.PtInRect( ptWnd ) )
  3635. hCursor = g_hCursorDrag;
  3636. }
  3637. }
  3638. else if( IsFixedDockStyle() )
  3639. {
  3640. e_calc_fixed_resizing_t eCFR =
  3641. g_DragStateOld.GetCFR();
  3642. if( eCFR == __ECFR_HORZ )
  3643. hCursor = g_hCursorResizeH;
  3644. else if( eCFR == __ECFR_VERT )
  3645. hCursor = g_hCursorResizeV;
  3646. else
  3647. hCursor = g_hCursorDrag;
  3648. ASSERT( hCursor != NULL );
  3649. }
  3650. } // if( m_bDragging || m_bDragDetecting && ( ! ( m_bRowResizing || m_bRowRecalcing ) ) )
  3651. else
  3652. {
  3653. ASSERT( ! m_bDragging );
  3654. ASSERT( ! IsFloating() );
  3655. if( IsDockedVertically() )
  3656. {
  3657. if( m_bRowRecalcing )
  3658. {
  3659. ASSERT( ! m_bRowResizing );
  3660. hCursor = g_hCursorResizeV;
  3661. ASSERT( hCursor != NULL );
  3662. } // if( m_bRowRecalcing )
  3663. else
  3664. {
  3665. ASSERT( ! m_bRowRecalcing );
  3666. hCursor = g_hCursorResizeH;
  3667. ASSERT( hCursor != NULL );
  3668. } // else from if( m_bRowRecalcing )
  3669. } // if( IsDockedVertically() )
  3670. else
  3671. {
  3672. if( m_bRowRecalcing )
  3673. {
  3674. ASSERT( ! m_bRowResizing );
  3675. hCursor = g_hCursorResizeH;
  3676. ASSERT( hCursor != NULL );
  3677. } // if( m_bRowRecalcing )
  3678. else
  3679. {
  3680. ASSERT( ! m_bRowRecalcing );
  3681. hCursor = g_hCursorResizeV;
  3682. ASSERT( hCursor != NULL );
  3683. } // else if( m_bRowRecalcing )
  3684. } // else from if( IsDockedVertically() )
  3685. } // else from if( m_bDragging || m_bDragDetecting && ( ! ( m_bRowResizing || m_bRowRecalcing ) ) )
  3686. } // if can analyze resize cursors
  3687. else
  3688. { // if can not analyze resize cursors
  3689. if( ! IsFloating() )
  3690. {
  3691. CRect rcBarWnd;
  3692. GetWindowRect( &rcBarWnd );
  3693. CPoint ptDevOffset = -rcBarWnd.TopLeft();
  3694. CPoint ptWnd( point );
  3695. ClientToScreen( &ptWnd );
  3696. ptWnd += ptDevOffset;
  3697. CRect rcGrip = _RectGripGet();
  3698. if( rcGrip.PtInRect(ptWnd) )
  3699. {
  3700. INT nCountOfNcButtons = NcButtons_GetCount();
  3701. for( INT nBtn = 0; nBtn < nCountOfNcButtons; nBtn++ )
  3702. {
  3703. CExtBarNcAreaButton * pBtn =
  3704. NcButtons_GetAt( nBtn );
  3705. hCursor =
  3706. pBtn->OnNcAreaQueryCursor( ptWnd );
  3707. if( hCursor != NULL )
  3708. break;
  3709. } // for( INT nBtn = 0; nBtn < nCountOfNcButtons; nBtn++ )
  3710. if( hCursor == NULL )
  3711. {
  3712. if( _DraggingIsEnabled( this ) )
  3713. {
  3714. if( IsFixedDockStyle() )
  3715. hCursor = g_hCursorDrag;
  3716. else
  3717. hCursor = g_hCursorArrow;
  3718. }
  3719. else
  3720. hCursor = g_hCursorArrow;
  3721. ASSERT( hCursor != NULL );
  3722. } // if( hCursor == NULL )
  3723. } // if( rcGrip.PtInRect(ptWnd) )
  3724. } // if( !IsFloating() )
  3725. } // if can not analyze resize cursors
  3726. } // if( ! m_bPresubclassDialogMode )
  3727. if( hCursor == NULL )
  3728. {
  3729. hCursor = (HCURSOR)(__EXT_MFC_DWORD_PTR)
  3730. ::__EXT_MFC_GetClassLong(
  3731. m_hWnd,
  3732. __EXT_MFC_GCL_HCURSOR
  3733. );
  3734. ASSERT( hCursor != NULL );
  3735. } // if( hCursor == NULL )
  3736. if( ::GetCursor() != hCursor )
  3737. ::SetCursor( hCursor );
  3738. }
  3739. CExtControlBar * CExtControlBar::_DraggingGetBar() // return currently dagging controlbar
  3740. {
  3741. if( g_DragStateOld.IsEmpty() )
  3742. return NULL;
  3743. return g_DragStateOld.ExtBarSrcGet();
  3744. }
  3745. bool CExtControlBar::_DraggingCancel() // returns true if dragging was really canceled
  3746. {
  3747. CExtControlBar * pBar = _DraggingGetBar();
  3748. if( pBar == NULL )
  3749. return false;
  3750. pBar->_DraggingStop( true );
  3751. return true;
  3752. }
  3753. void CExtControlBar::_DraggingStart(
  3754. const CPoint & point,
  3755. const CPoint & pointOffset, // = CPoint( 0, 0 );
  3756. CSize sizeWaitMouseMove // = CSize( 1, 1 )
  3757. )
  3758. {
  3759. ASSERT( !m_bRowRecalcing );
  3760. ASSERT( !m_bRowResizing );
  3761. ASSERT( !m_bDragging );
  3762. ASSERT_VALID( m_pDockSite );
  3763. if( CExtControlBar::ProfileBarStateIsSerializing( m_pDockSite ) )
  3764. return;
  3765. if( ! _DraggingIsEnabled( this ) )
  3766. return;
  3767. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3768. CExtCustomizeSite * pSite = NotifiedCustomizeSiteGet();
  3769. if( pSite != NULL
  3770. && pSite->IsCustomizeMode()
  3771. )
  3772. pSite->DropTargetPopupCancelEx( -2 );
  3773. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3774. // (+ v.2.24)
  3775. // detect valid dragging start event
  3776. MSG msg;
  3777. for( ; PeekMessage( &msg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE ); );
  3778. HWND hWndOwn = GetSafeHwnd();
  3779. ASSERT( hWndOwn != NULL && ::IsWindow(hWndOwn) );
  3780. CExtMouseCaptureSink::SetCapture( hWndOwn );
  3781. m_bDragDetecting = true;
  3782. _SetCursor( point );
  3783. //sizeWaitMouseMove.cx = sizeWaitMouseMove.cy = 5; // debug
  3784. if( sizeWaitMouseMove.cx > 0 && sizeWaitMouseMove.cy > 0 )
  3785. {
  3786. ::WaitMessage();
  3787. CPoint ptMouseStart( 0, 0 ), ptMouseCurrent( 0, 0 );
  3788. ::GetCursorPos( &ptMouseStart );
  3789. bool bEnableStartDragging = true, bMouseShiftDetected = false;
  3790. for( ; bEnableStartDragging && (!bMouseShiftDetected); )
  3791. {
  3792. for(  ; ::IsWindow(hWndOwn)
  3793. && PeekMessage( &msg, NULL, 0, 0, PM_NOREMOVE );
  3794. )
  3795. { // wait any mouse movement look
  3796. MSG _msgOwnLBtnUp;
  3797. ::PeekMessage(
  3798. &_msgOwnLBtnUp,
  3799. hWndOwn,
  3800. WM_LBUTTONUP,
  3801. WM_LBUTTONUP,
  3802. PM_NOREMOVE
  3803. );
  3804. if( _msgOwnLBtnUp.message == WM_LBUTTONUP )
  3805. {
  3806. bEnableStartDragging = false;
  3807. CWnd * pWndChild = GetWindow( GW_CHILD );
  3808. if( pWndChild != NULL )
  3809. {
  3810. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3811. CExtDynTabControlBar * pTabbedBar =
  3812. DYNAMIC_DOWNCAST( CExtDynTabControlBar, this );
  3813. if( pTabbedBar != NULL )
  3814. {
  3815. LONG nSel = pTabbedBar->GetSwitcherSelection();
  3816. if( nSel >= 0 )
  3817. {
  3818. CExtControlBar * pBar =
  3819. pTabbedBar->GetBarAt( nSel, true );
  3820. if( pBar != NULL )
  3821. {
  3822. CWnd * pWndChild = pBar->GetWindow( GW_CHILD );
  3823. if( pWndChild != NULL )
  3824. {
  3825. if( stat_QueryFocusChangingEnabled( this, pWndChild->m_hWnd ) )
  3826. pWndChild->SetFocus();
  3827. }
  3828. else
  3829. {
  3830. if( stat_QueryFocusChangingEnabled( this, m_hWnd ) )
  3831. pBar->SetFocus();
  3832. }
  3833. break;
  3834. } // if( pBar != NULL )
  3835. } // if( nSel >= 0 )
  3836. } // if( pTabbedBar != NULL )
  3837. else
  3838. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3839. {
  3840. if( stat_QueryFocusChangingEnabled( this, pWndChild->m_hWnd ) )
  3841. pWndChild->SetFocus();
  3842. break;
  3843. }
  3844. } // if( pWndChild != NULL )
  3845. if( stat_QueryFocusChangingEnabled( this, m_hWnd ) )
  3846. SetFocus();
  3847. break;
  3848. } // if( _msgOwnLBtnUp.message == WM_LBUTTONUP )
  3849. if( ::IsWindow(hWndOwn) )
  3850. {
  3851. if( msg.hwnd == hWndOwn )
  3852. {
  3853. if( msg.message == WM_MOUSEMOVE )
  3854. {
  3855. ::GetCursorPos( &ptMouseCurrent );
  3856. CSize sizeMouseShift(
  3857. abs( (ptMouseCurrent.x - ptMouseStart.x) ),