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

界面编程

开发平台:

Visual C++

  1. // {
  2. // if( (*ppFoundBar) != NULL )
  3. // return false;
  4. // (*ppFoundBar) = pBar;
  5. // continue;
  6. // } // if( pExtBar == NULL )
  7. CExtDynControlBar * pDynBar = DYNAMIC_DOWNCAST( CExtDynControlBar, pBar );
  8. if( pDynBar == NULL )
  9. {
  10. if( (*ppFoundBar) != NULL )
  11. return false;
  12. (*ppFoundBar) = pExtBar;
  13. continue;
  14. } // if( pDynBar == NULL )
  15. if( pDynBar->m_pWndDynDocker == NULL
  16. || pDynBar->m_pWndDynDocker->GetSafeHwnd() == NULL
  17. )
  18. continue;
  19. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  20. CExtDynTabControlBar * pTabbedBar = DYNAMIC_DOWNCAST( CExtDynTabControlBar, pDynBar );
  21. if( pTabbedBar != NULL )
  22. {
  23. LONG nSel = pTabbedBar->GetSwitcherSelection();
  24. if( nSel < 0 )
  25. continue;
  26. CExtControlBar * pSetInTabsBar = pTabbedBar->GetBarAt( nSel, true );
  27. if( pSetInTabsBar == NULL )
  28. continue;
  29. ASSERT_VALID( pSetInTabsBar );
  30. ASSERT( pSetInTabsBar->GetSafeHwnd() != NULL );
  31. if( (*ppFoundBar) != NULL )
  32. return false;
  33. (*ppFoundBar) = pSetInTabsBar;
  34. continue;
  35. } // if( pTabbedBar != NULL )
  36. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  37. CExtControlBar * pFoundBar2 = NULL;
  38. if( stat_FindSingleVisbleBarNested( pDynBar->m_pWndDynDocker, &pFoundBar2 ) )
  39. {
  40. if( (*ppFoundBar) != NULL )
  41. return false;
  42. (*ppFoundBar) = pFoundBar2;
  43. continue;
  44. }
  45. } // for( nIndex = 0; nIndex < nCount; nIndex++ )
  46. if( (*ppFoundBar) != NULL )
  47. return true;
  48. return false;
  49. }
  50. bool CExtControlBar::FlashCaption_DoPaintNC(
  51. CDC & dc,
  52. LPVOID pPGD
  53. )
  54. {
  55. ASSERT_VALID( this );
  56. ASSERT( GetSafeHwnd() != NULL );
  57. ASSERT( dc.GetSafeHdc() != NULL );
  58. ASSERT( pPGD != NULL );
  59. dc;
  60. pPGD;
  61. // if( ! bFlashCaptionHighlightedState )
  62. // return false;
  63. //CExtPaintManager::PAINTGRIPPERDATA & _pgd = *( (CExtPaintManager::PAINTGRIPPERDATA *) pPGD );
  64. // NcButtons_Paint( *pDC );
  65. // return true;
  66. return false;
  67. }
  68. void CExtControlBar::FlashCaption_OnRepaint()
  69. {
  70. ASSERT_VALID( this );
  71. ASSERT( GetSafeHwnd() != NULL );
  72. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  73. if( AutoHideModeGet())
  74. {
  75. CFrameWnd * pFrame = GetParentFrame();
  76. ASSERT_VALID( pFrame );
  77. ASSERT( pFrame->GetSafeHwnd() != NULL );
  78. ASSERT( ! pFrame->IsKindOf( RUNTIME_CLASS( CExtMiniDockFrameWnd ) ) );
  79. CExtDynAutoHideArea * pDAHA = NULL;
  80. CWnd * pWnd = pFrame->GetWindow( GW_CHILD );
  81. for( ; pWnd != NULL; pWnd = pWnd->GetWindow( GW_HWNDNEXT ) )
  82. {
  83. CExtDynAutoHideArea * pDAHA2 = DYNAMIC_DOWNCAST( CExtDynAutoHideArea, pWnd );
  84. if( pDAHA2 == NULL )
  85. continue;
  86. LONG nIndex = pDAHA2->FindControlBar( this );
  87. if( nIndex < 0 )
  88. continue;
  89. pDAHA = pDAHA2;
  90. break;
  91. }
  92. if( pDAHA->IsWindowVisible() )
  93. pDAHA->Invalidate();
  94. CExtDynAutoHideSlider * pDAHS = pDAHA->GetAutoHideSlider();
  95. if( pDAHS != NULL
  96. && pDAHS->_GetBar() == this
  97. && pDAHS->IsWindowVisible()
  98. )
  99. pDAHS->SendMessage( WM_NCPAINT );
  100. return;
  101. } // if( AutoHideModeGet())
  102. CExtDynTabControlBar * pTabbedBar = _GetNearestTabbedContainer();
  103. if( pTabbedBar != NULL )
  104. {
  105. ASSERT_VALID( pTabbedBar );
  106. ASSERT( pTabbedBar->GetSafeHwnd() != NULL );
  107. if( pTabbedBar->IsWindowVisible() )
  108. pTabbedBar->SendMessage( WM_NCPAINT );
  109. pTabbedBar->InvalidateSwitcher();
  110. } // if( pTabbedBar != NULL )
  111. else
  112. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  113. {
  114. if( IsWindowVisible() )
  115. SendMessage( WM_NCPAINT );
  116. } // else from if( pTabbedBar != NULL )
  117. CFrameWnd * pFrame = GetParentFrame();
  118. ASSERT_VALID( pFrame );
  119. ASSERT( pFrame->GetSafeHwnd() != NULL );
  120. if( pFrame->IsKindOf( RUNTIME_CLASS( CExtMiniDockFrameWnd ) )
  121. && pFrame->IsWindowVisible()
  122. )
  123. pFrame->SendMessage( WM_NCPAINT );
  124. #if (!defined __EXT_MFC_NO_DYNAMIC_BAR_SITE)
  125. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  126. else
  127. {
  128. bool bVisibleState = false;
  129. CExtDynamicControlBar * pBar = DYNAMIC_DOWNCAST( CExtDynamicControlBar, this );
  130. if( pBar != NULL
  131. && pBar->BarStateGet( &bVisibleState ) == CExtDynamicControlBar::__EDBS_DOCUMENT
  132. )
  133. {
  134. if( bVisibleState )
  135. {
  136. CExtDynamicBarSite * pDBS = pBar->GetBarSite();
  137. if( pDBS != NULL )
  138. {
  139. switch( pDBS->GetDetectedUiType() )
  140. {
  141. case CExtDynamicBarSite::__EDUIT_MDI_WITH_TABS:
  142. {
  143. CExtTabWnd * pWndMdiTabs = pDBS->GetMdiTabs();
  144. if( pWndMdiTabs != NULL )
  145. {
  146. pWndMdiTabs->Invalidate();
  147. pWndMdiTabs->UpdateWindow();
  148. }
  149. }
  150. break;
  151. case CExtDynamicBarSite::__EDUIT_SDI_TAB_PAGE_CONTAINER:
  152. {
  153. CExtTabPageContainerWnd * pWndTPC = pDBS->GetTabPageContainer();
  154. if( pWndTPC != NULL )
  155. {
  156. CExtTabWnd * pWndTabs = pWndTPC->GetSafeTabWindow();
  157. if( pWndTabs != NULL )
  158. {
  159. pWndTabs->Invalidate();
  160. pWndTabs->UpdateWindow();
  161. }
  162. }
  163. }
  164. break;
  165. }
  166. }
  167. }
  168. }
  169. }
  170. #endif // __EXT_MFC_NO_TABMDI_CTRL
  171. #endif // __EXT_MFC_NO_DYNAMIC_BAR_SITE
  172. }
  173. void CExtControlBar::FlashCaption_OnTimer()
  174. {
  175. ASSERT_VALID( this );
  176. ASSERT( GetSafeHwnd() != NULL );
  177. ASSERT( m_nFlashCaptionCounter >= 0 );
  178. if( m_bFlashCaptionHighlightedState )
  179. {
  180. m_bFlashCaptionHighlightedState = false;
  181. FlashCaption_OnRepaint();
  182. m_nFlashCaptionCounter --;
  183. if( m_nFlashCaptionCounter <= 0 )
  184. KillTimer( m_nFlashCaptionTimerID );
  185. } // if( m_bFlashCaptionHighlightedState )
  186. else
  187. {
  188. m_bFlashCaptionHighlightedState = true;
  189. FlashCaption_OnRepaint();
  190. }
  191. }
  192. bool CExtControlBar::FlashCaptionIsInProgress(
  193. bool * p_bFlashCaptionHighlightedState // = NULL
  194. ) const
  195. {
  196. ASSERT_VALID( this );
  197. if( p_bFlashCaptionHighlightedState != NULL )
  198. (*p_bFlashCaptionHighlightedState) = false;
  199. if( GetSafeHwnd() == NULL )
  200. return false;
  201. if( m_nFlashCaptionCounter == 0 )
  202. return false;
  203. if( p_bFlashCaptionHighlightedState != NULL )
  204. (*p_bFlashCaptionHighlightedState) = m_bFlashCaptionHighlightedState;
  205. return true;
  206. }
  207. bool CExtControlBar::FlashCaption(
  208. INT nFlashCount, // = -1 // negative value cancels current flashing
  209. INT nStepMilliseconds, // = 250
  210. COLORREF clrFlashText, // = RGB(255,255,255),
  211. COLORREF clrFlashBackground // = RGB(255,0,0)
  212. )
  213. {
  214. ASSERT_VALID( this );
  215. if( GetSafeHwnd() == NULL )
  216. return false;
  217. m_bFlashCaptionHighlightedState = false;
  218. if( nFlashCount <= 0 || nStepMilliseconds <= 0 )
  219. {
  220. m_nFlashCaptionCounter = 0;
  221. FlashCaption_OnTimer();
  222. return true;
  223. }
  224. m_clrFlashCaptionText = clrFlashText;
  225. m_clrFlashCaptionBackground = clrFlashBackground;
  226. m_nFlashCaptionCounter = nFlashCount;
  227. m_nFlashCaptionStepMilliseconds = nStepMilliseconds;
  228. SetTimer( UINT(m_nFlashCaptionTimerID), UINT(m_nFlashCaptionStepMilliseconds), NULL );
  229. return true;
  230. }
  231. bool CExtControlBar::FindHelpMode(
  232. CWnd * pWndStartSearch
  233. )
  234. {
  235. ASSERT_VALID( pWndStartSearch );
  236. ASSERT( pWndStartSearch->GetSafeHwnd() != NULL && ::IsWindow(pWndStartSearch->GetSafeHwnd()) );
  237. CFrameWnd * pFrame = DYNAMIC_DOWNCAST( CFrameWnd, pWndStartSearch );
  238. if( pFrame == NULL )
  239. pFrame = pWndStartSearch->GetParentFrame();
  240. for( ; pFrame != NULL;
  241. pFrame = pFrame->GetParentFrame()
  242. )
  243. {
  244. if( pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) )
  245. continue;
  246. if( pFrame->m_bHelpMode )
  247. return true;
  248. }
  249. return false;
  250. }
  251. bool CExtControlBar::FindPrintPreviewMode(
  252. CFrameWnd * pFrame
  253. )
  254. {
  255. //ASSERT_VALID( pFrame );
  256. CView * pView = pFrame->GetActiveView();
  257. if( pView != NULL
  258. && pView->IsKindOf( RUNTIME_CLASS(CPreviewView) )
  259. )
  260. return true;
  261. return false;
  262. }
  263. bool CExtControlBar::IsDockSiteInPrintPreviewMode()
  264. {
  265. ASSERT_VALID( this );
  266. if( m_pDockSite == NULL
  267. || m_bPresubclassDialogMode
  268. )
  269. return false;
  270. return FindPrintPreviewMode( m_pDockSite );
  271. }
  272. void CExtControlBar::DelayShow( BOOL bShow )
  273. {
  274. ASSERT_VALID( this );
  275. m_bDelayShowInvoked = true;
  276. m_bDelayShowFlag = bShow ? true : false;
  277. CExtDynControlBar * pDynContainer = _GetNearestDynamicContainer();
  278. if( pDynContainer != NULL )
  279. {
  280. pDynContainer->m_bDelayShowInvoked = true;
  281. pDynContainer->m_bDelayShowFlag = m_bDelayShowFlag;
  282. }
  283. CMiniDockFrameWnd * pMiniFrame =
  284. DYNAMIC_DOWNCAST( CMiniDockFrameWnd, GetParentFrame() );
  285. if( IsFloating()
  286. && (! IsVisible() )
  287. && (! IsFixedMode() )
  288. )
  289. {
  290. if( pMiniFrame != NULL )
  291. {
  292. ASSERT_VALID( pMiniFrame );
  293. pMiniFrame->ModifyStyle( 0, FWS_SNAPTOBARS );
  294. }
  295. }
  296. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  297. else
  298. if( m_bAutoHideMode )
  299. bShow = FALSE;
  300. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  301. if( pMiniFrame != NULL && bShow && m_pDockBar->GetSafeHwnd() != NULL )
  302. {
  303. CControlBar::DelayShow( bShow );
  304. CControlBar * pParentBar = DYNAMIC_DOWNCAST( CControlBar, m_pDockBar->GetParent() );
  305. if( pParentBar != NULL )
  306. pParentBar->DelayShow( bShow );
  307. else
  308. {
  309. pMiniFrame->RecalcLayout();
  310. pMiniFrame->ShowWindow( SW_SHOWNA );
  311. }
  312. return;
  313. }
  314. CControlBar::DelayShow( bShow );
  315. }
  316. void CExtControlBar::_UpdateVisibilityInChain()
  317. {
  318. LONG nDelayedRowUpdateMetric = m_nDelayedRowUpdateMetric;
  319. m_nDelayedRowUpdateMetric = 0;
  320. if( m_pDockBar == NULL && (!m_bPresubclassDialogMode) )
  321. return; // on destruction
  322. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  323. if( m_bAutoHideMode )
  324. return;
  325. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  326. if( _DraggingGetBar() != NULL )
  327. return;
  328. if( _GetBarToggleFloatingState() != NULL )
  329. return;
  330. if( IsFixedMode() || IsFixedDockStyle()
  331. || m_pDockSite == NULL
  332. || m_pDockBar == NULL
  333. || IsDockSiteInPrintPreviewMode()
  334. // || ( m_pDockBar->GetSafeHwnd() != NULL
  335. // && ::IsWindow( m_pDockBar->GetSafeHwnd() )
  336. // && (!m_pDockBar->IsVisible())
  337. // )
  338. )
  339. return;
  340. ASSERT_VALID( m_pDockSite );
  341. if( m_bUpdatingChain )
  342. return;
  343. m_bUpdatingChain = true;
  344. m_nDelayedRowUpdateMetric = nDelayedRowUpdateMetric;
  345. _UpdateVisibilityInRow();
  346. BOOL bVisible = IsVisible();
  347. CExtDockDynBar * pDynDocker = DYNAMIC_DOWNCAST( CExtDockDynBar, m_pDockBar );
  348. if( pDynDocker != NULL )
  349. { // update parent dynamic docker with new visiblity options
  350. ASSERT_KINDOF( CExtDockDynBar, pDynDocker );
  351. CExtDynControlBar * pDynBar =
  352. STATIC_DOWNCAST(
  353. CExtDynControlBar,
  354. pDynDocker->GetParent()
  355. );
  356. ASSERT_VALID( pDynBar );
  357. // if( pDynBar->m_bUpdatingChain )
  358. // return;
  359. if( bVisible )
  360. {
  361. if( ! pDynBar->IsVisible() )
  362. m_pDockSite->ShowControlBar( pDynBar, TRUE, TRUE );
  363. // pDynDocker->OnDynamicLayoutUpdate();
  364. } // if( bVisible )
  365. else
  366. {
  367. INT nDockedVisibleCount =  pDynDocker->GetDockedVisibleCount();
  368. if( nDockedVisibleCount == 0 )
  369. {
  370. if( pDynBar->IsVisible() )
  371. m_pDockSite->ShowControlBar( pDynBar, FALSE, TRUE );
  372. } // if( nDockedVisibleCount == 0 )
  373. } // else from if( bVisible )
  374. } // update parent dynamic docker with new visiblity options
  375. if( ! bVisible )
  376. { // if( ! bVisible ) - update child invisibility options
  377. if( IsKindOf(RUNTIME_CLASS(CExtDynControlBar)) )
  378. {
  379. CExtDockDynBar * pInnerDynDocker =
  380. ((CExtDynControlBar *) this)->m_pWndDynDocker;
  381. if( pInnerDynDocker != NULL )
  382. {
  383. //pInnerDynDocker->ShowAll( FALSE );
  384. for( INT nPos = 0; nPos < pInnerDynDocker->m_arrBars.GetSize(); nPos++ )
  385. {
  386. CControlBar * pBar = pInnerDynDocker->GetDockedControlBar( nPos );
  387. if( pBar == NULL )
  388. continue;
  389. CExtDynControlBar * pDynBar =
  390. DYNAMIC_DOWNCAST( CExtDynControlBar, pBar );
  391. if( pDynBar == NULL )
  392. continue;
  393. //pDynBar->m_bUpdatingChain = true;
  394. pDynBar->DelayShow( FALSE );
  395. //pDynBar->SetWindowPos(
  396. // NULL, 0, 0, 0, 0,
  397. // SWP_NOZORDER|SWP_NOMOVE|SWP_NOSIZE
  398. // |SWP_NOACTIVATE
  399. // |SWP_HIDEWINDOW
  400. // |SWP_NOSENDCHANGING
  401. // );
  402. //pDynBar->m_bUpdatingChain = false;
  403. } // for( INT nPos = 0; nPos < pInnerDynDocker->m_arrBars.GetSize(); nPos++ )
  404. } // if( pInnerDynDocker != NULL )
  405. }
  406. } // if( ! bVisible ) - update child invisibility options
  407. CFrameWnd * pParentFrame = GetParentFrame();
  408. ASSERT_VALID( pParentFrame );
  409. if( pParentFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) )
  410. pParentFrame->RecalcLayout();
  411. m_bUpdatingChain = false;
  412. }
  413. void CExtControlBar::_UpdateVisibilityInRow()
  414. {
  415. if( m_pDockBar == NULL && (!m_bPresubclassDialogMode) )
  416. return; // on destruction
  417. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  418. if( m_bAutoHideMode )
  419. return;
  420. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  421. if( IsFixedMode() || IsFixedDockStyle()
  422. || m_pDockSite == NULL
  423. || m_pDockBar == NULL
  424. )
  425. return;
  426. ASSERT_VALID( m_pDockSite );
  427. // if( IsKindOf(RUNTIME_CLASS(CExtDynControlBar)) )
  428. // return;
  429. CExtDynControlBar * pDynBar =
  430. DYNAMIC_DOWNCAST( CExtDynControlBar, this );
  431. if( pDynBar != NULL
  432. && (! pDynBar->_IsDelayedVisibilityUpdateEnabled() )
  433. )
  434. return;
  435. ASSERT_VALID( m_pDockBar );
  436. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  437. CExtDynTabControlBar * pTabbedBar = NULL;
  438. if( m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockDynTabBar)) )
  439. {
  440. pTabbedBar =
  441. STATIC_DOWNCAST(
  442. CExtDynTabControlBar,
  443. m_pDockBar->GetParent()
  444. );
  445. ASSERT_VALID( pTabbedBar );
  446. pTabbedBar->UpdateBarVisibility( this );
  447. } // if( m_pDockBar->IsKindOf(RUNTIME_CLASS(CExtDockDynTabBar)) )
  448. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  449. BOOL bVisible = IsVisible();
  450. // recalc desired size in row after ShowWindow(SW_SHOW)
  451. UINT nDockBarID = GetSafeDockBarDlgCtrlID();
  452. ASSERT_DOCKBAR_DLGCTRLID( nDockBarID );
  453. if( nDockBarID == AFX_IDW_DOCKBAR_FLOAT )
  454. return;
  455. ASSERT_DOCKBAR_DLGCTRLID_DOCKED( nDockBarID );
  456. bool bHorz =
  457. ( nDockBarID == AFX_IDW_DOCKBAR_TOP
  458. || nDockBarID == AFX_IDW_DOCKBAR_BOTTOM
  459. ) ? true : false;
  460. if( !bVisible )
  461. {
  462. m_nDelayedRowUpdateMetric = bHorz
  463. ? m_sizeDockedH.cx
  464. : m_sizeDockedV.cy
  465. ;
  466. return;
  467. }
  468. if( m_nDelayedRowUpdateMetric == 0 )
  469. return;
  470. long nDelayedRowUpdateMetric = m_nDelayedRowUpdateMetric;
  471. m_nDelayedRowUpdateMetric = 0;
  472. ExtControlBarVector_t vRow;
  473. _GetRowExtBars( vRow );
  474. INT nCountInRow = (INT)vRow.GetSize();
  475. ASSERT( nCountInRow > 0 );
  476. if( nCountInRow == 1 )
  477. return;
  478. for( INT nBar = 0; nBar < nCountInRow; )
  479. {
  480. CExtControlBar * pBar = vRow[ nBar ];
  481. ASSERT_VALID( pBar );
  482. BOOL bBarIsVisible = pBar->IsVisible();
  483. bool bFixedBar = pBar->IsFixedMode();
  484. if( pBar == this
  485. || (!bBarIsVisible)
  486. || bFixedBar
  487. )
  488. {
  489. nCountInRow--;
  490. vRow.RemoveAt( nBar );
  491. continue;
  492. }
  493. LONG nRealBarExtent = bHorz
  494. ? pBar->m_sizeDockedH.cx
  495. : pBar->m_sizeDockedV.cy
  496. ;
  497. LONG nMinBarExtent = bHorz
  498. ? pBar->_CalcDesiredMinHW()
  499. : pBar->_CalcDesiredMinVH()
  500. ;
  501. if( nRealBarExtent <= nMinBarExtent )
  502. {
  503. nCountInRow--;
  504. vRow.RemoveAt( nBar );
  505. continue;
  506. }
  507. nBar ++;
  508. } // for( INT nBar = 0; nBar < nCountInRow; )
  509. if( nCountInRow == 0 )
  510. return;
  511. LONG nExtentDesizred = nDelayedRowUpdateMetric;
  512. for( ; nExtentDesizred > 0 && nCountInRow > 0; )
  513. {
  514. for( INT nBar = 0; nBar < nCountInRow; )
  515. {
  516. CExtControlBar * pBar = vRow[ nBar ];
  517. ASSERT_VALID( pBar );
  518. LONG & nRealBarExtentRef = bHorz
  519. ? pBar->m_sizeDockedH.cx
  520. : pBar->m_sizeDockedV.cy
  521. ;
  522. LONG nMinBarExtent = bHorz
  523. ? pBar->_CalcDesiredMinHW()
  524. : pBar->_CalcDesiredMinVH()
  525. ;
  526. ASSERT( nRealBarExtentRef > nMinBarExtent );
  527. nRealBarExtentRef --;
  528. nExtentDesizred --;
  529. if( nExtentDesizred == 0 )
  530. break;
  531. if( nRealBarExtentRef == nMinBarExtent )
  532. {
  533. nCountInRow--;
  534. vRow.RemoveAt( nBar );
  535. continue;
  536. }
  537. nBar ++;
  538. } // for( nBar = 0; nBar < nCountInRow; )
  539. } // for( ; nExtentDesizred > 0 && nCountInRow > 0; )
  540. }
  541. bool CExtControlBar::g_bControlBarClassRegistered = false;
  542. bool CExtControlBar::RegisterControlBarClass()
  543. {
  544. if( g_bControlBarClassRegistered )
  545. return true;
  546. WNDCLASS _wndClassInfo;
  547. HINSTANCE hInst = ::AfxGetInstanceHandle();
  548. if( ! ::GetClassInfo( hInst, __EXT_CONTROLBAR_CLASS_NAME, &_wndClassInfo ) )
  549. {
  550. _wndClassInfo.style = CS_GLOBALCLASS|CS_DBLCLKS|CS_HREDRAW|CS_VREDRAW;
  551. _wndClassInfo.lpfnWndProc = ::DefWindowProc;
  552. _wndClassInfo.cbClsExtra = _wndClassInfo.cbWndExtra = 0;
  553. _wndClassInfo.hInstance = hInst;
  554. _wndClassInfo.hIcon = NULL;
  555. _wndClassInfo.hCursor = ::LoadCursor( NULL, IDC_ARROW );
  556. ASSERT( _wndClassInfo.hCursor != NULL );
  557. _wndClassInfo.hbrBackground = NULL; 
  558. _wndClassInfo.lpszMenuName = NULL;
  559. _wndClassInfo.lpszClassName = __EXT_CONTROLBAR_CLASS_NAME;
  560. if( !::AfxRegisterClass( &_wndClassInfo ) )
  561. {
  562. ASSERT( FALSE );
  563. //AfxThrowResourceException();
  564. return false;
  565. }
  566. }
  567. g_bControlBarClassRegistered = true;
  568. return true;
  569. }
  570. BOOL CExtControlBar::PreCreateWindow(CREATESTRUCT& cs) 
  571. {
  572. if( ( !RegisterControlBarClass() )
  573. || ( !CControlBar::PreCreateWindow(cs) )
  574. )
  575. {
  576. ASSERT( FALSE );
  577. return FALSE;
  578. }
  579. cs.lpszClass = __EXT_CONTROLBAR_CLASS_NAME;
  580. return TRUE;
  581. }
  582. void CExtControlBar::PreSubclassWindow() 
  583. {
  584. CControlBar::PreSubclassWindow();
  585. // emulate for enabling update in user non-frame mode
  586. m_bInCustomModeUpdateCmdUI = false;
  587. if( ! m_bPresubclassDialogMode )
  588. { // if m_bPresubclassDialogMode was not set manually
  589. HWND hWndParent = ::GetParent( m_hWnd );
  590. if( hWndParent != NULL )
  591. {
  592. CWnd * pWndParent = CWnd::FromHandlePermanent( hWndParent );
  593. if( pWndParent != NULL )
  594. {
  595. if( ( ! pWndParent->IsKindOf(RUNTIME_CLASS(CControlBar)) )
  596. && ( ! pWndParent->IsKindOf(RUNTIME_CLASS(CFrameWnd)) )
  597. )
  598. {
  599. // non-frame mode
  600. // may be we are inside dialog
  601. __EXT_MFC_ULONG_PTR dwWndStyle = ::__EXT_MFC_GetWindowLong( m_hWnd, GWL_STYLE );
  602. m_dwStyle = DWORD(dwWndStyle & CBRS_ALL);
  603. m_bPresubclassDialogMode = true;
  604. }
  605. } // if( pWndParent != NULL )
  606. } // if( hWndParent != NULL )
  607. } // if m_bPresubclassDialogMode was not set manually
  608. if( m_dwStyle & CBRS_TOOLTIPS )
  609. EnableToolTips();
  610. if( ( (CWnd::GetExStyle()&(WS_EX_LAYOUTRTL|WS_EX_RTLREADING)) != 0 ) )
  611. {
  612. CWnd::ModifyStyleEx(
  613. WS_EX_LAYOUTRTL|WS_EX_RTLREADING,
  614. 0,
  615. SWP_FRAMECHANGED
  616. );
  617. ASSERT( (CWnd::GetExStyle()&(WS_EX_LAYOUTRTL|WS_EX_RTLREADING)) == 0 );
  618. } // if( ( (CWnd::GetExStyle()&(WS_EX_LAYOUTRTL|WS_EX_RTLREADING)) != 0 ) )
  619. AnimationSite_Init( false );
  620. }
  621. #define ID_TIMER_WAIT   0xE000  // timer while waiting to show status
  622. #define ID_TIMER_CHECK  0xE001  // timer to check for removal of status
  623. BOOL CExtControlBar::PreTranslateMessage(MSG* pMsg) 
  624. {
  625. // CControlBar::PreTranslateMessage(MSG* pMsg) 
  626. ASSERT_VALID(this);
  627. ASSERT(m_hWnd != NULL);
  628. // allow tooltip messages to be filtered
  629. if( CWnd::PreTranslateMessage(pMsg) )
  630. return TRUE;
  631. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  632. CWnd * pWndParent = GetParent();
  633. if( pWndParent->GetSafeHwnd() != NULL
  634. && pWndParent->IsKindOf( RUNTIME_CLASS(CExtDockDynBar) )
  635. && pWndParent->PreTranslateMessage(pMsg)
  636. )
  637. return TRUE;
  638. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  639. if( (m_nFlags&WF_OLECTLCONTAINER) != NULL
  640. && WM_KEYFIRST <= pMsg->message
  641. && pMsg->message <= WM_KEYLAST
  642. )
  643. { // analyze OLE keyboard message translation
  644. HWND hWndFocus = ::GetFocus();
  645. if( hWndFocus != NULL
  646. && ::IsChild( m_hWnd, hWndFocus )
  647. )
  648. { // if focus is inside
  649. HWND hWndOwn = m_hWnd;
  650. HWND hWnd = hWndFocus;
  651. for( ; hWnd != NULL && hWnd != hWndOwn; hWnd = ::GetParent(hWnd) )
  652. {
  653. if( ! ::IsWindow(hWndOwn) )
  654. return FALSE;
  655. CWnd * pWnd = CWnd::FromHandlePermanent( hWnd );
  656. if( pWnd == NULL )
  657. continue;
  658. LPUNKNOWN pUnknown = pWnd->GetControlUnknown();
  659. if( pUnknown != NULL )
  660. {
  661. if( pWnd->PreTranslateMessage( pMsg ) )
  662. return TRUE;
  663. IOleInPlaceActiveObject * pOleInPlaceActiveObject = NULL;
  664. HRESULT hr =
  665. pUnknown->QueryInterface(
  666. __uuidof(IOleInPlaceActiveObject),
  667. (LPVOID*)(&pOleInPlaceActiveObject)
  668. );
  669. if( hr == S_OK )
  670. {
  671. ASSERT( pOleInPlaceActiveObject != NULL );
  672. hr =
  673. pOleInPlaceActiveObject->TranslateAccelerator(
  674. pMsg
  675. );
  676. pOleInPlaceActiveObject->Release();
  677. if( hr == S_OK )
  678. return TRUE;
  679. } // if( hr == S_OK )
  680. } // if( pUnknown != NULL )
  681. } // for( ; hWnd != NULL && hWnd != hWndOwn; hWnd = ::GetParent(hWnd) )
  682. } // if focus is inside
  683. } // analyze OLE keyboard message translation
  684. CWnd * pOwner = GetOwner();
  685. #if _MFC_VER < 0x700
  686. UINT message = pMsg->message;
  687. // handle CBRS_FLYBY style (status bar flyby help)
  688. if( ( ( m_dwStyle & CBRS_FLYBY)
  689. || message == WM_LBUTTONDOWN
  690. || message == WM_LBUTTONUP
  691. )
  692. &&
  693. ( ( message >= __EXT_MFC_WM_MOUSEFIRST
  694. && message <= __EXT_MFC_WM_MOUSELAST
  695. ) ||
  696. ( message >= WM_NCMOUSEFIRST
  697. && message <= WM_NCMOUSELAST
  698. )
  699. )
  700. &&
  701. ( (! CExtToolControlBar::g_bMenuTracking
  702. || CExtPopupMenuWnd::IsMenuTracking()
  703. )
  704. )
  705.  )
  706. {
  707. //#if _MFC_VER < 0x700
  708. _AFX_THREAD_STATE * pThreadState =
  709. ::AfxGetThreadState();
  710. //#else
  711. // AFX_MODULE_THREAD_STATE * pThreadState =
  712. // //::AfxGetModuleThreadState();
  713. // //AfxGetModuleState()->m_thread.GetData();
  714. // ::AfxGetThreadState()->m_pModuleState->m_thread.GetData();
  715. //#endif
  716. // gather information about current mouse position
  717. CPoint point = pMsg->pt;
  718. ScreenToClient( &point );
  719. TOOLINFO _ti;
  720. ::memset( &_ti, 0, sizeof(TOOLINFO) );
  721. _ti.cbSize = sizeof(AFX_OLDTOOLINFO);
  722. __EXT_MFC_INT_PTR nHit = OnToolHitTest( point, &_ti );
  723. if( _ti.lpszText != NULL
  724. && _ti.lpszText != LPSTR_TEXTCALLBACK
  725. )
  726. free( _ti.lpszText );
  727. BOOL bNotButton =
  728. message == WM_LBUTTONDOWN && (_ti.uFlags & TTF_NOTBUTTON);
  729. if (message != WM_LBUTTONDOWN && GetKeyState(VK_LBUTTON) < 0)
  730. nHit = pThreadState->m_nLastStatus;
  731. // update state of status bar
  732. if (nHit < 0 || bNotButton)
  733. {
  734. if (GetKeyState(VK_LBUTTON) >= 0 || bNotButton)
  735. {
  736. SetStatusText(-1);
  737. KillTimer(ID_TIMER_CHECK);
  738. }
  739. }
  740. else
  741. {
  742. if (message == WM_LBUTTONUP)
  743. {
  744. SetStatusText(-1);
  745. ResetTimer(ID_TIMER_CHECK, 200);
  746. }
  747. else
  748. {
  749. if ((m_nStateFlags & statusSet) || GetKeyState(VK_LBUTTON) < 0)
  750. SetStatusText(nHit);
  751. else if (nHit != pThreadState->m_nLastStatus)
  752. ResetTimer(ID_TIMER_WAIT, 300);
  753. }
  754. }
  755. pThreadState->m_nLastStatus = nHit;
  756. }
  757. #endif
  758. // don't translate dialog messages when in Shift+F1 help mode
  759. CFrameWnd* pFrameWnd = GetTopLevelFrame();
  760. if( pFrameWnd != NULL && pFrameWnd->m_bHelpMode )
  761. return FALSE;
  762. if( ! m_bPresubclassDialogMode )
  763. {
  764. // since 'IsDialogMessage' will eat frame window accelerators,
  765. //   we call all frame windows' PreTranslateMessage first
  766. while( pOwner != NULL )
  767. {
  768. HWND hWndOwner = pOwner->GetSafeHwnd();
  769. ASSERT( hWndOwner != NULL );
  770. if( !::IsWindow(hWndOwner) )
  771. break;
  772. if( CWnd::FromHandlePermanent(hWndOwner) == NULL )
  773. break;
  774. // allow owner & frames to translate before IsDialogMessage does
  775. if (pOwner->PreTranslateMessage(pMsg))
  776. return TRUE;
  777. // try parent frames until there are no parent frames
  778. pOwner = pOwner->GetParentFrame();
  779. }
  780. // HWND hWndChild = ::GetWindow( m_hWnd, GW_CHILD );
  781. // if( hWndChild != NULL
  782. // && pMsg->hwnd != NULL
  783. // && WM_KEYFIRST <= pMsg->message
  784. // && pMsg->message <= WM_KEYLAST
  785. // && ::IsChild( hWndChild, pMsg->hwnd )
  786. // )
  787. // {
  788. // ::TranslateMessage( pMsg );
  789. // ::DispatchMessage( pMsg );
  790. // return TRUE;
  791. // }
  792. } // if( !m_bPresubclassDialogMode )
  793. return FALSE;
  794. // // filter both messages to dialog and from children
  795. // return PreTranslateInput(pMsg);
  796. }
  797. __EXT_MFC_INT_PTR CExtControlBar::OnToolHitTest(
  798. CPoint point,
  799. TOOLINFO * pTI
  800. ) const
  801. {
  802. ASSERT_VALID( this );
  803. if( CExtToolControlBar::g_bMenuTracking
  804. || CExtPopupMenuWnd::IsMenuTracking()
  805. || OnAdvancedPopupMenuTipWndGet() != NULL
  806. || m_bSuspendTips
  807. )
  808. return -1;
  809. CPoint ptScreen( point );
  810. ClientToScreen( &ptScreen );
  811. CExtBarNcAreaButton * pBtn = NULL;
  812. ( const_cast < CExtControlBar * > ( this ) ) ->
  813. NcButtons_HitTest( ptScreen, &pBtn );
  814. if( pBtn != NULL )
  815. {
  816. ASSERT_VALID( pBtn );
  817. return pBtn->OnToolHitTest( point, pTI );
  818. }
  819. return -1; //CControlBar::OnToolHitTest( point, pTI );
  820. }
  821. CExtPopupMenuTipWnd * CExtControlBar::OnAdvancedPopupMenuTipWndGet(
  822. CObject * pHelperSrc, // = NULL
  823. LPARAM lParam // = 0
  824. ) const
  825. {
  826. ASSERT_VALID( this );
  827. pHelperSrc;
  828. lParam;
  829. if( ! g_bUseAdvancedToolTips )
  830. return NULL;
  831. if( m_bSuspendTips )
  832. return NULL;
  833. if( ( ( ( const_cast < CExtControlBar * > ( this ) ) -> GetBarStyle() ) & CBRS_TOOLTIPS ) == 0 )
  834. return NULL;
  835. return (&( CExtPopupMenuSite::g_DefPopupMenuSite.GetTip() ));
  836. }
  837. void CExtControlBar::OnAdvancedPopupMenuTipWndDisplay(
  838. CExtPopupMenuTipWnd & _ATTW,
  839. const RECT & rcExcludeArea,
  840. __EXT_MFC_SAFE_LPCTSTR strTipText,
  841. CObject * pHelperSrc, // = NULL
  842. LPARAM lParam // = 0
  843. ) const
  844. {
  845. ASSERT_VALID( this );
  846. ASSERT( strTipText != NULL && _tcslen( strTipText ) > 0 );
  847. pHelperSrc;
  848. lParam;
  849. if( IsFixedMode()
  850. && IsFixedDockStyle()
  851. && ( ( m_pDockSite != NULL
  852. && GetSafeDockBarDlgCtrlID() == AFX_IDW_DOCKBAR_BOTTOM
  853. )
  854. || ( ( ( const_cast < CExtControlBar * > ( this ) ) -> GetBarStyle() ) & CBRS_ALIGN_BOTTOM ) != 0
  855. )
  856. )
  857. _ATTW.SetTipStyle( CExtPopupMenuTipWnd::__ETS_INV_RECTANGLE_NO_ICON );
  858. else
  859. _ATTW.SetTipStyle( CExtPopupMenuTipWnd::__ETS_RECTANGLE_NO_ICON );
  860. _ATTW.SetText( strTipText );
  861. _ATTW.Show( (CWnd*)this, rcExcludeArea );
  862. }
  863. HWND CExtControlBar::FindHwndNotSafeForMutualPaint(
  864. CWnd * pWndStartSearch
  865. )
  866. {
  867. ASSERT_VALID( pWndStartSearch );
  868. if( ( pWndStartSearch->GetStyle() & WS_VISIBLE ) == 0 )
  869. return NULL;
  870. CFrameWnd * pFrame = DockSiteFromWnd( pWndStartSearch );
  871. if( pFrame != NULL )
  872. {
  873. ASSERT_VALID( pFrame );
  874. if( ( pFrame->GetStyle() & WS_VISIBLE ) == 0 )
  875. return NULL;
  876. //#if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  877. // for( HWND hWnd =
  878. // ::GetWindow(
  879. // pFrame->GetSafeHwnd(),
  880. // GW_CHILD
  881. // );
  882. // hWnd != NULL;
  883. // hWnd =
  884. // ::GetWindow(
  885. // hWnd,
  886. // GW_HWNDNEXT
  887. // )
  888. // )
  889. // {
  890. // CWnd * pWnd = CWnd::FromHandlePermanent( hWnd );
  891. // if( pWnd == NULL )
  892. // continue;
  893. // CExtDynAutoHideSlider * pSlider =
  894. // DYNAMIC_DOWNCAST( CExtDynAutoHideSlider, pWnd );
  895. // if( pSlider != NULL )
  896. // {
  897. // if( (pSlider->GetStyle() & WS_VISIBLE) == 0 )
  898. // break;
  899. // if( pSlider->m_nResizingMode != HTCLIENT )
  900. // return hWnd;
  901. // }
  902. // }
  903. //#endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  904. } // if( pFrame != NULL )
  905. HWND hWndRetVal = NULL;
  906. //CSingleLock _slCsCB( &g_csCB );
  907. // _slCsCB.Lock();
  908. CExtControlBar * pBar = _DraggingGetBar();
  909. if( pBar != NULL )
  910. {
  911. if( pBar->_IsShowContentWhenDragging() )
  912. {
  913. #if (!defined __EXT_MFC_NO_DOCK_MARKERS)
  914. if( (! pBar->IsFixedMode() )
  915. && (! pBar->IsFixedDockStyle() )
  916. && INT(pBar->OnQueryDockingType()) >= INT(__RESIZABLE_DOCKING_TYPE_STUDIO_2005)
  917. && ( ! g_PaintManager.m_bLayeredHighlighting2005 )
  918. )
  919. {
  920. POINT ptCursor;
  921. if( ::GetCursorPos( &ptCursor ) )
  922. {
  923. HWND hWndFromPoint = ::WindowFromPoint( ptCursor );
  924. if( hWndFromPoint != NULL )
  925. {
  926. ASSERT( ::IsWindow(hWndFromPoint) );
  927. CWnd * pWnd = CWnd::FromHandlePermanent( hWndFromPoint );
  928. if( pWnd != NULL )
  929. {
  930. CExtDynDockMarkerWnd * pDockMarkerWnd =
  931. DYNAMIC_DOWNCAST( CExtDynDockMarkerWnd, pWnd );
  932. if( pDockMarkerWnd != NULL )
  933. hWndRetVal = pBar->GetSafeHwnd();
  934. } // if( pWnd != NULL )
  935. } // if( hWndFromPoint != NULL )
  936. } // if( ::GetCursorPos( &ptCursor ) )
  937. }
  938. #endif // (!defined __EXT_MFC_NO_DOCK_MARKERS)
  939. } // if( pBar->_IsShowContentWhenDragging() )
  940. else
  941. hWndRetVal = pBar->GetSafeHwnd();
  942. } // if( pBar != NULL )
  943. else
  944. {
  945. int nCountOfBars = (int)g_AllBars.GetSize();
  946. for( int nBar = 0; nBar < nCountOfBars; nBar++ )
  947. {
  948. pBar = g_AllBars[nBar];
  949. ASSERT_KINDOF( CExtControlBar, pBar );
  950. if( pBar->GetSafeHwnd() == NULL )
  951. continue;
  952. if( pBar->m_bRowRecalcing
  953. && ( !pBar->_IsShowContentWhenRowRecalcing() )
  954. )
  955. {
  956. hWndRetVal = pBar->GetSafeHwnd();
  957. break;
  958. }
  959. if( pBar->m_bRowResizing
  960. && ( !pBar->_IsShowContentWhenRowResizing() )
  961. )
  962. {
  963. hWndRetVal = pBar->GetSafeHwnd();
  964. break;
  965. }
  966. } // for( int nBar = 0; nBar < nCountOfBars; nBar++ )
  967. } // else from if( pBar != NULL )
  968. // _slCsCB.Unlock();
  969. return hWndRetVal;
  970. }
  971. CFrameWnd * CExtControlBar::DockSiteFromWnd(
  972. CWnd * pWndStartSearch
  973. )
  974. {
  975. ASSERT_VALID( pWndStartSearch );
  976. CFrameWnd * pFrame =
  977. DYNAMIC_DOWNCAST(
  978. CFrameWnd,
  979. pWndStartSearch
  980. );
  981. if( pFrame != NULL )
  982. return pFrame;
  983. pFrame = pWndStartSearch->GetParentFrame();
  984. if( pFrame == NULL )
  985. return NULL;
  986. ASSERT_VALID( pFrame );
  987. if( ! pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) )
  988. return pFrame;
  989. pFrame = pFrame->GetParentFrame();
  990. if( pFrame == NULL )
  991. return NULL;
  992. ASSERT_VALID( pFrame );
  993. ASSERT( !pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) );
  994. return pFrame;
  995. }
  996. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  997. void CExtControlBar::OnCustomizeModeEnter()
  998. {
  999. ASSERT_VALID( this );
  1000. if( IsKindOf(RUNTIME_CLASS(CExtDynControlBar)) )
  1001. return;
  1002. CWnd * pWndChild = GetWindow( GW_CHILD );
  1003. if( pWndChild->GetSafeHwnd() != NULL )
  1004. pWndChild->EnableWindow( FALSE );
  1005. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1006. else if( AutoHideModeGet() )
  1007. {
  1008. ASSERT_VALID( m_pDockBar );
  1009. ASSERT_KINDOF( CExtDockBar, m_pDockBar );
  1010. CExtDynAutoHideArea * pWndAutoHideArea =
  1011. ((CExtDockBar*)m_pDockBar)->_GetAutoHideArea();
  1012. if( pWndAutoHideArea != NULL
  1013. && pWndAutoHideArea->m_pWndSlider != NULL
  1014. )
  1015. {
  1016. ASSERT_VALID( pWndAutoHideArea );
  1017. ASSERT_VALID( pWndAutoHideArea->m_pWndSlider );
  1018. pWndChild = pWndAutoHideArea->m_pWndSlider->GetWindow( GW_CHILD );
  1019. if( pWndChild->GetSafeHwnd() != NULL )
  1020. pWndChild->EnableWindow( FALSE );
  1021. } // if( pWndAutoHideArea != NULL ...
  1022. } // else if( AutoHideModeGet() )
  1023. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1024. }
  1025. void CExtControlBar::OnCustomizeModeLeave()
  1026. {
  1027. ASSERT_VALID( this );
  1028. if( IsKindOf(RUNTIME_CLASS(CExtDynControlBar)) )
  1029. return;
  1030. CWnd * pWndChild = GetWindow( GW_CHILD );
  1031. if( pWndChild->GetSafeHwnd() != NULL )
  1032. pWndChild->EnableWindow( TRUE );
  1033. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1034. else if( AutoHideModeGet() )
  1035. {
  1036. ASSERT_VALID( m_pDockBar );
  1037. ASSERT_KINDOF( CExtDockBar, m_pDockBar );
  1038. CExtDynAutoHideArea * pWndAutoHideArea =
  1039. ((CExtDockBar*)m_pDockBar)->_GetAutoHideArea();
  1040. if( pWndAutoHideArea != NULL
  1041. && pWndAutoHideArea->m_pWndSlider != NULL
  1042. )
  1043. {
  1044. ASSERT_VALID( pWndAutoHideArea );
  1045. ASSERT_VALID( pWndAutoHideArea->m_pWndSlider );
  1046. pWndChild = pWndAutoHideArea->m_pWndSlider->GetWindow( GW_CHILD );
  1047. if( pWndChild->GetSafeHwnd() != NULL )
  1048. pWndChild->EnableWindow( TRUE );
  1049. } // if( pWndAutoHideArea != NULL ...
  1050. } // else if( AutoHideModeGet() )
  1051. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1052. }
  1053. void CExtControlBar::OnCustomizeListBoxUpdate( CExtCustomizeToolbarsListBox * pWndList )
  1054. {
  1055. ASSERT_VALID( this );
  1056. ASSERT_VALID( pWndList );
  1057. if( !m_bVisibleInCustomizeListBox )
  1058. return;
  1059. pWndList->AddBar( this );
  1060. }
  1061. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1062. bool CExtControlBar::_IsDockSiteCustomizeMode() const
  1063. {
  1064. ASSERT_VALID( this );
  1065. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1066. CExtCustomizeSite * pSite = NotifiedCustomizeSiteGet();
  1067. if( pSite != NULL )
  1068. return pSite->IsCustomizeMode();
  1069. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1070. return false;
  1071. }
  1072. void CExtControlBar::_ActivateOnClick()
  1073. {
  1074. ASSERT_VALID( this );
  1075. HWND hWndOwn = GetSafeHwnd();
  1076. if( hWndOwn == NULL
  1077. || (! ::IsWindow( hWndOwn ) )
  1078. )
  1079. return;
  1080. HWND hWndActivate = NULL;
  1081. if( m_bPresubclassDialogMode )
  1082. hWndActivate = ::GetParent( hWndOwn );
  1083. else
  1084. hWndActivate = _GetDockingFrameImpl()->GetSafeHwnd();
  1085. if( hWndActivate == NULL )
  1086. {
  1087. if( stat_QueryFocusChangingEnabled( this, hWndOwn ) )
  1088. ::SetFocus( hWndOwn );
  1089. return;
  1090. }
  1091. CWnd * pWndPermanent =
  1092. CWnd::FromHandlePermanent( hWndActivate );
  1093. if( pWndPermanent != NULL )
  1094. {
  1095. CMDIChildWnd * pWndMDIChild =
  1096. DYNAMIC_DOWNCAST( CMDIChildWnd, pWndPermanent );
  1097. if( pWndMDIChild != NULL )
  1098. {
  1099. CFrameWnd * pWndFrame =
  1100. pWndMDIChild->GetParentFrame();
  1101. if( pWndFrame != NULL )
  1102. {
  1103. CMDIFrameWnd * pWndMDIFrame =
  1104. DYNAMIC_DOWNCAST( CMDIFrameWnd, pWndFrame );
  1105. if( pWndMDIFrame != NULL )
  1106. {
  1107. CMDIChildWnd * pActive =
  1108. pWndMDIFrame->MDIGetActive();
  1109. if( pWndMDIChild != pActive )
  1110. pWndMDIChild->MDIActivate();
  1111. return;
  1112. }
  1113. }
  1114. }
  1115. }
  1116. HWND hWndFocus = ::GetFocus();
  1117. if( hWndFocus == NULL )
  1118. {
  1119. if( stat_QueryFocusChangingEnabled( this, hWndActivate ) )
  1120. ::SetFocus( hWndActivate );
  1121. return;
  1122. }
  1123. if( hWndActivate != hWndFocus
  1124. || (! ::IsChild(hWndActivate, hWndFocus) )
  1125. )
  1126. {
  1127. if( ! OnQueryBarHoverProcessingEnabled() )
  1128. {
  1129. if( stat_QueryFocusChangingEnabled( this, hWndActivate ) )
  1130. ::SetFocus( hWndActivate );
  1131. }
  1132. }
  1133. }
  1134. void CExtControlBar::_OnNcMiniFrameActivate( bool bActive )
  1135. {
  1136. ASSERT_VALID( this );
  1137. bActive;
  1138. }
  1139. CExtControlBar::QUERY_REPOSITION_CALC_EFFECT_DATA::
  1140. QUERY_REPOSITION_CALC_EFFECT_DATA(
  1141. SHORT nFlags,
  1142. CWnd * pWndToReposChilds,
  1143. UINT nIDFirst,
  1144. UINT nIDLast,
  1145. UINT nIDLeftOver,
  1146. LPRECT lpRectParam,
  1147. LPCRECT lpcRectClient,
  1148. bool bStretch
  1149. )
  1150. : m_nFlags( nFlags )
  1151. , m_pWndToReposChilds( pWndToReposChilds )
  1152. , m_nIDFirst( nIDFirst )
  1153. , m_nIDLast( nIDLast )
  1154. , m_nIDLeftOver( nIDLeftOver )
  1155. , m_lpRectParam( lpRectParam )
  1156. , m_lpcRectClient( lpcRectClient )
  1157. , m_bStretch( bStretch )
  1158. {
  1159. ASSERT_VALID( m_pWndToReposChilds );
  1160. ASSERT( m_pWndToReposChilds->GetSafeHwnd() != NULL );
  1161. ASSERT( ::IsWindow( m_pWndToReposChilds->GetSafeHwnd() ) );
  1162. ASSERT( ((int)__PRCF_WND_REPOS_DEFAULT) == ((int)CWnd::reposDefault) );
  1163. ASSERT( ((int)__PRCF_WND_REPOS_QUERY) == ((int)CWnd::reposQuery) );
  1164. ASSERT( ((int)__PRCF_WND_REPOS_EXTRA) == ((int)CWnd::reposExtra) );
  1165. }
  1166. CExtControlBar::QUERY_REPOSITION_CALC_EFFECT_DATA::
  1167. ~QUERY_REPOSITION_CALC_EFFECT_DATA()
  1168. {
  1169. }
  1170. void CExtControlBar::QUERY_REPOSITION_CALC_EFFECT_DATA::
  1171. QueryTypeSet( SHORT nQueryType )
  1172. {
  1173. const SHORT nTest = SHORT(__PRCF_WND_REPOS_MASK);
  1174. nQueryType &= nTest;
  1175. m_nFlags &= ~nTest;
  1176. m_nFlags |= nQueryType;
  1177. }
  1178. SHORT CExtControlBar::QUERY_REPOSITION_CALC_EFFECT_DATA::
  1179. QueryTypeGet() const
  1180. {
  1181. const SHORT nTest = SHORT(__PRCF_WND_REPOS_MASK);
  1182. SHORT nRetVal = SHORT( m_nFlags & nTest );
  1183. return nRetVal;
  1184. }
  1185. bool CExtControlBar::QUERY_REPOSITION_CALC_EFFECT_DATA::
  1186. IsQueryReposDefault() const
  1187. {
  1188. bool bRetVal =
  1189. ( ((int)QueryTypeGet()) == ((int)CWnd::reposDefault) )
  1190. ? true : false;
  1191. return bRetVal;
  1192. }
  1193. bool CExtControlBar::QUERY_REPOSITION_CALC_EFFECT_DATA::
  1194. IsQueryReposQuery() const
  1195. {
  1196. bool bRetVal =
  1197. ( ((int)QueryTypeGet()) == ((int)CWnd::reposQuery) )
  1198. ? true : false;
  1199. return bRetVal;
  1200. }
  1201. bool CExtControlBar::QUERY_REPOSITION_CALC_EFFECT_DATA::
  1202. IsQueryReposExtra() const
  1203. {
  1204. bool bRetVal =
  1205. ( ((int)QueryTypeGet()) == ((int)CWnd::reposExtra) )
  1206. ? true : false;
  1207. return bRetVal;
  1208. }
  1209. CExtControlBar::QUERY_REPOSITION_CALC_EFFECT_DATA::
  1210. operator WPARAM() const
  1211. {
  1212. return ( (WPARAM) this );
  1213. }
  1214. void CExtControlBar::QUERY_REPOSITION_CALC_EFFECT_DATA::
  1215. ExcludeFromCenterSet(
  1216. bool bExclude // = true
  1217. )
  1218. {
  1219. const SHORT nTest = SHORT(__PRCF_EXCLUDE_FROM_CENTER);
  1220. if( bExclude )
  1221. m_nFlags |= nTest;
  1222. else
  1223. m_nFlags &= ~nTest;
  1224. }
  1225. bool CExtControlBar::QUERY_REPOSITION_CALC_EFFECT_DATA::
  1226. ExcludeFromCenterGet() const
  1227. {
  1228. const SHORT nTest = SHORT(__PRCF_EXCLUDE_FROM_CENTER);
  1229. bool bRetVal = ( (m_nFlags&nTest) != 0 ) ? true : false;
  1230. return bRetVal;
  1231. }
  1232. void CExtControlBar::RepositionBarsEx(
  1233. CWnd * pWndToReposChilds,
  1234. UINT nIDFirst,
  1235. UINT nIDLast,
  1236. UINT nIDLeftOver,
  1237. UINT nFlag, // = reposDefault
  1238. LPRECT lpRectParam, // = NULL
  1239. LPCRECT lpRectClient, // = NULL
  1240. BOOL bStretch // = TRUE
  1241. )
  1242. {
  1243. ASSERT_VALID( pWndToReposChilds );
  1244. ASSERT( nFlag == 0 || nFlag == reposQuery || nFlag == reposExtra );
  1245. AFX_SIZEPARENTPARAMS layout;
  1246. HWND hWndLeftOver = NULL;
  1247. layout.bStretch = bStretch;
  1248. layout.sizeTotal.cx = layout.sizeTotal.cy = 0;
  1249. if( lpRectClient != NULL )
  1250. layout.rect = *lpRectClient;    // starting rect comes from parameter
  1251. else
  1252. pWndToReposChilds->GetClientRect(
  1253. &layout.rect // starting rect comes from client rect
  1254. );
  1255. ASSERT( layout.rect.left <= layout.rect.right );
  1256. if( nFlag != 1 )
  1257. layout.hDWP = ::BeginDeferWindowPos(8); // reasonable guess
  1258. else
  1259. layout.hDWP = NULL; // not actually doing layout
  1260. for( HWND hWndChild = ::GetTopWindow( pWndToReposChilds->m_hWnd );
  1261. hWndChild != NULL;
  1262. hWndChild = ::GetWindow( hWndChild, GW_HWNDNEXT )
  1263. )
  1264. {
  1265. UINT nIDC = _AfxGetDlgCtrlID(hWndChild);
  1266. CWnd * pWnd = CWnd::FromHandlePermanent( hWndChild );
  1267. if( nIDC == nIDLeftOver )
  1268. hWndLeftOver = hWndChild;
  1269. else if( pWnd != NULL )
  1270. {
  1271. QUERY_REPOSITION_CALC_EFFECT_DATA _qrced(
  1272. (SHORT)nFlag,
  1273. pWndToReposChilds,
  1274. nIDFirst,
  1275. nIDLast,
  1276. nIDLeftOver,
  1277. lpRectParam,
  1278. lpRectClient,
  1279. bStretch ? true : false
  1280. );
  1281. pWnd->SendMessage(
  1282. g_nMsgQueryRepositionCalcEffect,
  1283. _qrced,
  1284. 0L
  1285. );
  1286. if( nFlag == 1 && _qrced.ExcludeFromCenterGet() )
  1287. {
  1288. ASSERT( _qrced.IsQueryReposQuery() );
  1289. continue;
  1290. }
  1291. if(
  1292. nIDC >= nIDFirst
  1293. && nIDC <= nIDLast
  1294. )
  1295. ::SendMessage(
  1296. hWndChild,
  1297. WM_SIZEPARENT,
  1298. 0,
  1299. (LPARAM)&layout
  1300. );
  1301. }
  1302. }
  1303. // if just getting the available rectangle, return it now...
  1304. if( nFlag == 1 )
  1305. {
  1306. ASSERT(lpRectParam != NULL);
  1307. if( bStretch )
  1308. ::CopyRect( lpRectParam, &layout.rect );
  1309. else
  1310. {
  1311. lpRectParam->left = lpRectParam->top = 0;
  1312. lpRectParam->right = layout.sizeTotal.cx;
  1313. lpRectParam->bottom = layout.sizeTotal.cy;
  1314. }
  1315. return;
  1316. }
  1317. // the rest is the client size of the left-over pane
  1318. if( nIDLeftOver != 0 && hWndLeftOver != NULL )
  1319. {
  1320. CWnd* pLeftOver = CWnd::FromHandle(hWndLeftOver);
  1321. // allow extra space as specified by lpRectBorder
  1322. if( nFlag == 2 )
  1323. {
  1324. ASSERT(lpRectParam != NULL);
  1325. layout.rect.left += lpRectParam->left;
  1326. layout.rect.top += lpRectParam->top;
  1327. layout.rect.right -= lpRectParam->right;
  1328. layout.rect.bottom -= lpRectParam->bottom;
  1329. }
  1330. // reposition the window
  1331. pLeftOver->CalcWindowRect( &layout.rect );
  1332. AfxRepositionWindow( &layout, hWndLeftOver, &layout.rect );
  1333. }
  1334. // move and resize all the windows at once!
  1335. if( layout.hDWP == NULL
  1336. || !::EndDeferWindowPos( layout.hDWP )
  1337. )
  1338. TRACE0("Warning: DeferWindowPos failed - low system resources.n");
  1339. }
  1340. void CExtControlBar::_PreSyncRowMetrics()
  1341. {
  1342. ASSERT_VALID( this );
  1343. if( IsVisible()
  1344. || IsFloating()
  1345. )
  1346. return;
  1347. //m_nDelayedRowUpdateMetric = 0;
  1348. ExtControlBarVector_t vRow;
  1349. _GetRowExtBars( vRow );
  1350. INT nCount = (INT)vRow.GetSize();
  1351. INT i = 0;
  1352. for( i = 0; i < nCount; )
  1353. {
  1354. CExtControlBar * pBar = vRow[ i ];
  1355. ASSERT_VALID( pBar );
  1356. if( !pBar->IsVisible()
  1357. || pBar->IsFixedMode()
  1358. || pBar->IsFixedDockStyle()
  1359. || pBar == this
  1360. )
  1361. {
  1362. vRow.RemoveAt( i );
  1363. nCount--;
  1364. }
  1365. else
  1366. i++;
  1367. }
  1368. UINT nDockbarID = GetSafeDockBarDlgCtrlID();
  1369. ASSERT_DOCKBAR_DLGCTRLID( nDockbarID );
  1370. bool bHorz =
  1371. (nDockbarID == AFX_IDW_DOCKBAR_TOP || nDockbarID == AFX_IDW_DOCKBAR_BOTTOM)
  1372. ? true : false;
  1373. LONG nOwnMetric = bHorz ? m_sizeDockedH.cx : m_sizeDockedV.cy;
  1374. if( nOwnMetric == 0 )
  1375. {
  1376. nOwnMetric = bHorz ? _CalcDesiredMinHW() : _CalcDesiredMinVH();
  1377. (bHorz ? m_sizeDockedH.cx : m_sizeDockedV.cy) = nOwnMetric;
  1378. }
  1379. LONG & nCrossMetricOwnRef = bHorz ? m_sizeDockedH.cy : m_sizeDockedV.cx;
  1380. LONG nCrossMetricOther = -1;
  1381. for( i = 0; i < nCount && nOwnMetric > 0; )
  1382. {
  1383. CExtControlBar * pBar = vRow[ i ];
  1384. //pBar->m_nDelayedRowUpdateMetric = 0;
  1385. LONG & nRefBarMetric = bHorz ? pBar->m_sizeDockedH.cx : pBar->m_sizeDockedV.cy;
  1386. LONG nBarMinMetric = bHorz ? pBar->_CalcDesiredMinHW() : pBar->_CalcDesiredMinVH();
  1387. if( nCrossMetricOther <= 0 )
  1388. nCrossMetricOther = bHorz ? pBar->m_sizeDockedH.cy : pBar->m_sizeDockedV.cx;
  1389. if( nRefBarMetric <= nBarMinMetric )
  1390. {
  1391. vRow.RemoveAt( i );
  1392. nCount--;
  1393. if( nCount == 0 )
  1394. break;
  1395. continue;
  1396. }
  1397. nRefBarMetric --;
  1398. nOwnMetric --;
  1399. ASSERT( nOwnMetric >= 0 );
  1400. if( nOwnMetric == 0 )
  1401. break;
  1402. i++;
  1403. ASSERT( i <= nCount );
  1404. if( i == nCount )
  1405. i = 0;
  1406. }
  1407. if( nCrossMetricOther > 0 )
  1408. nCrossMetricOwnRef = nCrossMetricOther;
  1409. }
  1410. void CExtControlBar::OnFrameBarCheckCmd(
  1411. bool bResizableCheckmarks // = false
  1412. )
  1413. {
  1414. ASSERT_VALID( this );
  1415. ASSERT_VALID( m_pDockSite );
  1416. ASSERT(ID_VIEW_STATUS_BAR == AFX_IDW_STATUS_BAR);
  1417. ASSERT(ID_VIEW_TOOLBAR == AFX_IDW_TOOLBAR);
  1418. ASSERT(ID_VIEW_REBAR == AFX_IDW_REBAR);
  1419. CFrameWnd * pParentFrame = GetParentFrame();
  1420. // if( bResizableCheckmarks // (- v.2.23)
  1421. // || IsFixedDockStyle()
  1422. // )
  1423. bool bVisible = ((GetStyle() & WS_VISIBLE) != 0) ? true : false;
  1424. if( IsFixedDockStyle()
  1425. || ( bResizableCheckmarks && bVisible ) // (+ v.2.23)
  1426. )
  1427. {
  1428. m_pDockSite->ShowControlBar(
  1429. this,
  1430. bVisible ? FALSE : TRUE,
  1431. FALSE
  1432. );
  1433. // SetTimer( __TIMER_ID_DELAYED_UPDATE, 150, NULL );
  1434. return;
  1435. }
  1436. ASSERT( ! IsFixedDockStyle() );
  1437. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1438. if( AutoHideModeGet() )
  1439. {
  1440. ASSERT_VALID( m_pDockBar );
  1441. ASSERT_KINDOF( CExtDockBar, m_pDockBar );
  1442. CExtDynAutoHideArea * pWndAutoHideArea =
  1443. ((CExtDockBar*)m_pDockBar)->_GetAutoHideArea();
  1444. ASSERT_VALID( pWndAutoHideArea );
  1445. ASSERT_VALID( pWndAutoHideArea->m_pWndSlider );
  1446. if( pWndAutoHideArea->m_pWndSlider->m_bActiveState
  1447. && pWndAutoHideArea->m_pWndSlider->_GetBar() == this
  1448. )
  1449. return;
  1450. LONG nIndex = pWndAutoHideArea->FindControlBar( this );
  1451. if( nIndex < 0 )
  1452. {
  1453. ASSERT( FALSE );
  1454. return;
  1455. }
  1456. pWndAutoHideArea->SelectionSet( nIndex, true, true );
  1457. // ASSERT( pWndAutoHideArea->m_pWndSlider->m_bActiveState );
  1458. // ASSERT( pWndAutoHideArea->m_pWndSlider->m_pBar == this );
  1459. // ASSERT( pWndAutoHideArea->m_pWndSlider->GetStyle() & WS_VISIBLE );
  1460. if( stat_QueryFocusChangingEnabled( this, pWndAutoHideArea->m_pWndSlider->m_hWnd ) )
  1461. pWndAutoHideArea->m_pWndSlider->SetFocus();
  1462. // SetTimer( __TIMER_ID_DELAYED_UPDATE, 150, NULL );
  1463. return;
  1464. }
  1465. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1466. if( ! bVisible )
  1467. {
  1468. _DisplayingSet( true );
  1469. m_pDockSite->ShowControlBar( this, TRUE, FALSE );
  1470. CExtMiniDockFrameWnd * pMiniFrame = DYNAMIC_DOWNCAST( CExtMiniDockFrameWnd, pParentFrame );
  1471. if( pMiniFrame != NULL )
  1472. {
  1473. _UpdateVisibilityInChain();
  1474. pMiniFrame->RecalcLayout();
  1475. }
  1476. } // if( ! bVisible )
  1477. ASSERT_VALID( m_pDockBar );
  1478. // ASSERT_KINDOF( CExtDockBar, m_pDockBar );
  1479. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1480. if( ((CExtDockBar*)m_pDockBar)->IsKindOf(RUNTIME_CLASS(CExtDockDynTabBar)) )
  1481. {
  1482. CExtDynTabControlBar * pTabbed = 
  1483. STATIC_DOWNCAST(
  1484. CExtDynTabControlBar,
  1485. m_pDockBar->GetParent()
  1486. );
  1487. CRect rc;
  1488. pTabbed->GetWindowRect( &rc );
  1489. CSize _size = rc.Size();
  1490. pTabbed->SetInitDesiredSizeFloating( _size );
  1491. pTabbed->SetInitDesiredSizeHorizontal( _size );
  1492. pTabbed->SetInitDesiredSizeVertical( _size );
  1493. pTabbed->m_pDockContext->m_sizeLast = _size;
  1494. pTabbed->SelectControlBar( this );
  1495. pTabbed->_DisplayingSet( true );
  1496. pParentFrame->DelayRecalcLayout();
  1497. if( stat_QueryFocusChangingEnabled( this, m_hWnd ) )
  1498. SetFocus();
  1499. // SetTimer( __TIMER_ID_DELAYED_UPDATE, 150, NULL );
  1500. return;
  1501. }
  1502. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  1503. if( pParentFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)) )
  1504. pParentFrame->BringWindowToTop();
  1505. pParentFrame->DelayRecalcLayout();
  1506. if( stat_QueryFocusChangingEnabled( this, m_hWnd ) )
  1507. SetFocus();
  1508. // SetTimer( __TIMER_ID_DELAYED_UPDATE, 150, NULL );
  1509. }
  1510. void CExtControlBar::OnFrameBarCheckUpdate(
  1511. CCmdUI * pCmdUI,
  1512. bool bResizableCheckmarks // = false
  1513. )
  1514. {
  1515. ASSERT_VALID( this );
  1516. ASSERT_VALID( m_pDockSite );
  1517. ASSERT(ID_VIEW_STATUS_BAR == AFX_IDW_STATUS_BAR);
  1518. ASSERT(ID_VIEW_TOOLBAR == AFX_IDW_TOOLBAR);
  1519. ASSERT(ID_VIEW_REBAR == AFX_IDW_REBAR);
  1520. BOOL bEnabled = _ClosingIsEnabled( this ) ? TRUE : FALSE;
  1521. pCmdUI->Enable( bEnabled );
  1522. if( bResizableCheckmarks
  1523. || IsFixedDockStyle()
  1524. )
  1525. {
  1526. pCmdUI->SetCheck(
  1527. (GetStyle() & WS_VISIBLE) != 0
  1528. );
  1529. return;
  1530. }
  1531. }
  1532. BOOL CExtControlBar::DoFrameBarCheckCmd(
  1533. CFrameWnd * pFrame,
  1534. UINT nBarID,
  1535. bool bResizableCheckmarks // = false
  1536. )
  1537. {
  1538. ASSERT_VALID( pFrame );
  1539. CControlBar * pBar = pFrame->GetControlBar( nBarID );
  1540. if( pBar != NULL )
  1541. {
  1542. if( pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar)) )
  1543. ((CExtControlBar*)pBar)->
  1544. OnFrameBarCheckCmd( bResizableCheckmarks );
  1545. else
  1546. pFrame->ShowControlBar(
  1547. pBar,
  1548. (pBar->GetStyle() & WS_VISIBLE) == 0,
  1549. FALSE
  1550. );
  1551. return TRUE;
  1552. }
  1553. return FALSE;
  1554. }
  1555. void CExtControlBar::DoFrameBarCheckUpdate(
  1556. CFrameWnd * pFrame,
  1557. CCmdUI * pCmdUI,
  1558. bool bResizableCheckmarks // = false
  1559. )
  1560. {
  1561. ASSERT_VALID( pFrame );
  1562. CControlBar * pBar = pFrame->GetControlBar( pCmdUI->m_nID );
  1563. if( pBar != NULL )
  1564. {
  1565. if( pBar->IsKindOf(RUNTIME_CLASS(CExtControlBar)) )
  1566. ((CExtControlBar*)pBar)->
  1567. OnFrameBarCheckUpdate( pCmdUI, bResizableCheckmarks );
  1568. else
  1569. pCmdUI->SetCheck(
  1570. (pBar->GetStyle() & WS_VISIBLE) != 0
  1571. );
  1572. return;
  1573. }
  1574. pCmdUI->ContinueRouting();
  1575. }
  1576. void CExtControlBar::OnSetFocus(CWnd* pOldWnd) 
  1577. {
  1578. CControlBar::OnSetFocus(pOldWnd);
  1579. if( IsFixedMode() )
  1580. return;
  1581. HWND hWndChild = ::GetWindow( GetSafeHwnd(), GW_CHILD );
  1582. if( hWndChild != NULL )
  1583. {
  1584. if( stat_QueryFocusChangingEnabled( this, hWndChild ) )
  1585. ::SetFocus( hWndChild );
  1586. }
  1587. }
  1588. bool CExtControlBar::OnConstructDockSiteControlBarPopupMenu(
  1589. CExtPopupMenuWnd * pPopup
  1590. ) const
  1591. {
  1592. ASSERT_VALID( this );
  1593. ASSERT( GetSafeHwnd() != NULL );
  1594. ASSERT( ::IsWindow(GetSafeHwnd()) );
  1595. ASSERT_VALID( pPopup );
  1596. if( ! m_bAppearInDockSiteControlBarPopupMenu )
  1597. return false;
  1598. if( g_bLockAllBars )
  1599. return false;
  1600. UINT nBarID = (UINT)GetDlgCtrlID();
  1601. VERIFY( pPopup->ItemInsert( nBarID ) );
  1602. return true;
  1603. }
  1604. LRESULT CExtControlBar::OnHelpHitTest(WPARAM wParam, LPARAM lParam)
  1605. {
  1606. HWND hWndCapture = ::GetCapture();
  1607. if( hWndCapture != NULL && hWndCapture == GetSafeHwnd() )
  1608. SendMessage( WM_CANCELMODE );
  1609. LRESULT lResult = DoHelpHitTest( CPoint(DWORD(lParam)) );
  1610. if( lResult == -3L )
  1611. return 0L;
  1612. if( lResult == -2L )
  1613. return -1L;
  1614. if( lResult != -1L )
  1615. return HID_BASE_COMMAND+lResult;
  1616. return CControlBar::OnHelpHitTest(wParam,lParam);
  1617. }
  1618. LRESULT CExtControlBar::DoHelpHitTest( CPoint ptHelpHitTest )
  1619. {
  1620. ASSERT_VALID( this );
  1621. ptHelpHitTest;
  1622. return -1L;
  1623. }
  1624. bool CExtControlBar::g_bUseCmdManagerForSetMessageString = true;
  1625. void CExtControlBar::stat_SetMessageString(
  1626. CWnd * pWnd,
  1627. UINT nCmdID // = AFX_IDS_IDLEMESSAGE
  1628. )
  1629. {
  1630. if( pWnd->GetSafeHwnd() == NULL
  1631. || (! ::IsWindow(pWnd->GetSafeHwnd()) )
  1632. )
  1633. return;
  1634. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1635. CExtCustomizeSite * pSite =
  1636. CExtCustomizeSite::GetCustomizeSite( pWnd->m_hWnd );
  1637. if( pSite != NULL
  1638. && pSite->IsCustomizeMode()
  1639. )
  1640. nCmdID = AFX_IDS_IDLEMESSAGE;
  1641. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1642. CFrameWnd * pFrame = DYNAMIC_DOWNCAST( CFrameWnd, pWnd );
  1643. if( pFrame == NULL && (pWnd->GetStyle() & WS_CHILD) != 0 )
  1644. pFrame = pWnd->GetParentFrame();
  1645. if( pFrame != NULL
  1646. && pFrame->IsKindOf(RUNTIME_CLASS(CExtMiniDockFrameWnd))
  1647. )
  1648. pFrame = pFrame->GetParentFrame();
  1649. HWND hWnd = 
  1650. pFrame != NULL 
  1651. ? pFrame->m_hWnd
  1652. : pWnd->m_hWnd;
  1653. if( g_bUseCmdManagerForSetMessageString
  1654. && nCmdID != AFX_IDS_IDLEMESSAGE
  1655. )
  1656. {
  1657. __EXT_MFC_SAFE_LPCTSTR strProfile = g_CmdManager->ProfileNameFromWnd( pWnd->m_hWnd );
  1658. if( strProfile != NULL )
  1659. {
  1660. CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr( strProfile, nCmdID );
  1661. if( pCmdItem != NULL )
  1662. {
  1663. CWnd * pTempBar =
  1664. CWnd::FromHandlePermanent(
  1665. ::GetDlgItem( hWnd, AFX_IDW_STATUS_BAR )
  1666. );
  1667. if( pTempBar != NULL )
  1668. {
  1669. CStatusBar * pStatusBar =
  1670. DYNAMIC_DOWNCAST( CStatusBar, pTempBar );
  1671. if( pStatusBar != NULL )
  1672. {
  1673. int nIdlePaneIndex =
  1674. pStatusBar->CommandToIndex( 0 );
  1675. if( nIdlePaneIndex != -1)
  1676. pStatusBar->SetPaneText(
  1677. nIdlePaneIndex,
  1678. pCmdItem->m_sTipStatus.IsEmpty()
  1679. ? _T("")
  1680. : pCmdItem->m_sTipStatus
  1681. );
  1682. return;
  1683. } // if( pStatusBar != NULL )
  1684. } // if( pTempBar != NULL )
  1685. } // if( pCmdItem != NULL )
  1686. } // if( strProfile != NULL )
  1687. } // if( g_bUseCmdManagerForSetMessageString ...
  1688. ::SendMessage( 
  1689. hWnd,
  1690. WM_SETMESSAGESTRING, 
  1691. nCmdID, 0
  1692. );
  1693. }
  1694. HWND CExtControlBar::stat_FindMdiClientHWND(
  1695. HWND hWndMdiFrame
  1696. )
  1697. {
  1698. for( HWND hWnd = ::GetWindow( hWndMdiFrame, GW_CHILD );
  1699. hWnd != NULL;
  1700. hWnd = ::GetWindow( hWnd, GW_HWNDNEXT )
  1701. )
  1702. {
  1703. ASSERT( ::IsWindow( hWnd ) );
  1704. TCHAR strClassName[ 512 ];
  1705. ::memset( strClassName, 0, sizeof(strClassName) );
  1706. ::GetClassName( hWnd, strClassName, 512 );
  1707. if( _tcslen( strClassName ) == 0 )
  1708. continue;
  1709. __EXT_MFC_STRLWR( strClassName, 512 );
  1710. //if( _tcscmp( strClassName, _T("mdiclient") ) == 0 )
  1711. if( _tcsstr( strClassName, _T("mdiclient") ) != NULL )
  1712. return hWnd;
  1713. }
  1714. return NULL;
  1715. }
  1716. bool CExtControlBar::stat_AdjustOccCompatibilityTree(
  1717. CWnd * pWndRoot
  1718. )
  1719. {
  1720. if( pWndRoot->GetSafeHwnd() == NULL )
  1721. return false;
  1722. ASSERT_VALID( pWndRoot );
  1723. if( pWndRoot->GetControlUnknown() != NULL )
  1724. return true;
  1725. bool bOccMode = false;
  1726. CWnd * pWnd = pWndRoot->GetWindow( GW_CHILD );
  1727. for( ; pWnd != NULL; pWnd = pWnd->GetWindow(GW_HWNDNEXT) )
  1728. {
  1729. ASSERT_VALID( pWnd );
  1730. if( CWnd::FromHandlePermanent(pWnd->GetSafeHwnd()) == NULL )
  1731. continue;
  1732. bOccMode |= stat_AdjustOccCompatibilityTree( pWnd );
  1733. } // for( ; pWnd != NULL; pWnd = pWnd->GetWindow(GW_HWNDNEXT) )
  1734. if( bOccMode )
  1735. pWndRoot->m_nFlags |= WF_OLECTLCONTAINER;
  1736. else
  1737. pWndRoot->m_nFlags &= ~(WF_OLECTLCONTAINER);
  1738. CFrameWnd * pDockSite = DYNAMIC_DOWNCAST( CFrameWnd, pWndRoot );
  1739. if( pDockSite != NULL
  1740. && pDockSite->IsKindOf( RUNTIME_CLASS(CExtMiniDockFrameWnd) )
  1741. )
  1742. pDockSite = NULL;
  1743. if( pDockSite != NULL )
  1744. {
  1745. CMap
  1746. < CExtMiniDockFrameWnd *,
  1747. CExtMiniDockFrameWnd *,
  1748. char,
  1749. char
  1750. >
  1751. setMiniFrames;
  1752. POSITION pos = pDockSite->m_listControlBars.GetHeadPosition();
  1753. for( ; pos != NULL; )
  1754. {
  1755. CControlBar * pControlBar = (CControlBar *)
  1756. pDockSite->m_listControlBars.GetNext( pos );
  1757. if( pControlBar->m_pDockSite == NULL )
  1758. continue;
  1759. ASSERT_VALID( pControlBar );
  1760. ASSERT_KINDOF( CControlBar, pControlBar );
  1761. if( pControlBar->IsDockBar() )
  1762. continue;
  1763. CFrameWnd * pBarParentFrame =
  1764. pControlBar->GetParentFrame();
  1765. ASSERT_VALID( pBarParentFrame );
  1766. if( pBarParentFrame == pDockSite )
  1767. continue;
  1768. CExtMiniDockFrameWnd * pFloatingFrame =
  1769. DYNAMIC_DOWNCAST(
  1770. CExtMiniDockFrameWnd,
  1771. pBarParentFrame
  1772. );
  1773. if( pFloatingFrame == NULL )
  1774. continue;
  1775. setMiniFrames.SetAt( pFloatingFrame, 0 );
  1776. } // for( ; pos != NULL; )
  1777. pos = setMiniFrames.GetStartPosition();
  1778. for( ; pos != NULL; )
  1779. {
  1780. CExtMiniDockFrameWnd * pFloatingFrame = NULL;
  1781. char nDummy;
  1782. setMiniFrames.GetNextAssoc(pos,pFloatingFrame,nDummy);
  1783. stat_AdjustOccCompatibilityTree( pFloatingFrame );
  1784. } // for( ; pos != NULL; )
  1785. }
  1786. return bOccMode;
  1787. }
  1788. void CExtControlBar::stat_RedrawFloatingFrames( CFrameWnd * pDockSite )
  1789. {
  1790. ASSERT_VALID( pDockSite );
  1791. CMap
  1792. < CMiniFrameWnd *,
  1793. CMiniFrameWnd *,
  1794. char,
  1795. char
  1796. >
  1797. setMiniFrames;
  1798. POSITION pos = pDockSite->m_listControlBars.GetHeadPosition();
  1799. for( ; pos != NULL; )
  1800. {
  1801. CControlBar * pControlBar = (CControlBar *)
  1802. pDockSite->m_listControlBars.GetNext( pos );
  1803. if( pControlBar->m_pDockSite == NULL )
  1804. continue;
  1805. ASSERT_VALID( pControlBar );
  1806. ASSERT_KINDOF( CControlBar, pControlBar );
  1807. if( pControlBar->IsDockBar() )
  1808. continue;
  1809. CFrameWnd * pBarParentFrame =
  1810. pControlBar->GetParentFrame();
  1811. ASSERT_VALID( pBarParentFrame );
  1812. if( pBarParentFrame == pDockSite )
  1813. continue;
  1814. CMiniFrameWnd * pFloatingFrame =
  1815. DYNAMIC_DOWNCAST(
  1816. CMiniFrameWnd,
  1817. pBarParentFrame
  1818. );
  1819. if( pFloatingFrame == NULL )
  1820. continue;
  1821. setMiniFrames.SetAt( pFloatingFrame, 0 );
  1822. } // for( ; pos != NULL; )
  1823. pos = setMiniFrames.GetStartPosition();
  1824. for( ; pos != NULL; )
  1825. {
  1826. CMiniFrameWnd * pFloatingFrame = NULL;
  1827. char nDummy;
  1828. setMiniFrames.GetNextAssoc(pos,pFloatingFrame,nDummy);
  1829. pFloatingFrame->RecalcLayout();
  1830. pFloatingFrame->RedrawWindow(
  1831. NULL,
  1832. NULL,
  1833. RDW_INVALIDATE | RDW_UPDATENOW | RDW_ERASE
  1834. | RDW_FRAME | RDW_ALLCHILDREN
  1835. );
  1836. } // for( ; pos != NULL; )
  1837. }
  1838. void CExtControlBar::stat_RecalcBarMetrics( CFrameWnd * pDockSite )
  1839. {
  1840. ASSERT_VALID( pDockSite );
  1841. for( POSITION pos = pDockSite->m_listControlBars.GetHeadPosition();
  1842. pos != NULL;
  1843. )
  1844. {
  1845. CControlBar * pControlBar = (CControlBar *)
  1846. pDockSite->m_listControlBars.GetNext( pos );
  1847. if( pControlBar->m_pDockSite == NULL )
  1848. continue;
  1849. ASSERT_VALID( pControlBar );
  1850. ASSERT_KINDOF( CControlBar, pControlBar );
  1851. if( pControlBar->IsDockBar() )
  1852. continue;
  1853. CExtControlBar * pExtControlBar =
  1854. DYNAMIC_DOWNCAST( CExtControlBar, pControlBar );
  1855. if( pExtControlBar != NULL
  1856. && pExtControlBar->m_bNoForcedRecalcMetrics
  1857. )
  1858. continue;
  1859. pControlBar->SetWindowPos(
  1860. NULL, 0, 0, 0, 0,
  1861. SWP_NOSIZE|SWP_NOMOVE|SWP_NOZORDER|SWP_NOOWNERZORDER
  1862. //|SWP_NOREDRAW
  1863. |SWP_FRAMECHANGED
  1864. );
  1865. //pControlBar->PostMessage( WM_NCPAINT );
  1866. CExtToolControlBar * pToolBar =
  1867. DYNAMIC_DOWNCAST( CExtToolControlBar, pControlBar );
  1868. if( pToolBar != NULL )
  1869. pToolBar->_RecalcPositionsImpl();
  1870. pControlBar->Invalidate();
  1871. }
  1872. }
  1873. CWnd * CExtControlBar::stat_GetWndForPlacement( CWnd * pWnd )
  1874. {
  1875. ASSERT_VALID( pWnd );
  1876. ASSERT( pWnd->GetSafeHwnd() != NULL && ::IsWindow( pWnd->GetSafeHwnd() ) );
  1877. for( ; true; pWnd = pWnd->GetParent() )
  1878. {
  1879. DWORD dwStyle = pWnd->GetStyle();
  1880. if( (dwStyle&WS_CHILD) == 0 )
  1881. break;
  1882. } // for( ; true; pWnd = pWnd->GetParent() )
  1883. return pWnd;
  1884. }
  1885. bool CExtControlBar::stat_GetWindowPlacement( HWND hWnd, WINDOWPLACEMENT & _wp )
  1886. {
  1887. #if (!defined __EXT_MFC_NO_NC_FRAME )
  1888. return CExtNcFrameImpl::stat_GetWindowPlacement( hWnd, _wp );
  1889. #else
  1890. return ::GetWindowPlacement( hWnd, &_wp ) ? true : false;
  1891. #endif
  1892. }
  1893. bool CExtControlBar::stat_SetWindowPlacement( HWND hWnd, const WINDOWPLACEMENT & _wp )
  1894. {
  1895. #if (!defined __EXT_MFC_NO_NC_FRAME )
  1896. return CExtNcFrameImpl::stat_SetWindowPlacement( hWnd, _wp );
  1897. #else
  1898. return ::SetWindowPlacement( hWnd, &_wp ) ? true : false;
  1899. #endif
  1900. }
  1901. bool CExtControlBar::stat_SaveWindowRect(
  1902. HWND hWnd,
  1903. __EXT_MFC_SAFE_LPCTSTR strSection,
  1904. __EXT_MFC_SAFE_LPCTSTR strEntry
  1905. )
  1906. {
  1907. #if (!defined __EXT_MFC_NO_NC_FRAME )
  1908. return CExtNcFrameImpl::stat_SaveWindowRect( hWnd, strSection, strEntry );
  1909. #else
  1910. if( LPCTSTR( strSection ) == NULL
  1911. || LPCTSTR( strEntry ) == NULL
  1912. || _tcslen( LPCTSTR( strSection ) ) == 0
  1913. || _tcslen( LPCTSTR( strEntry ) ) == 0
  1914. || hWnd == NULL
  1915. || ( ! ::IsWindow( hWnd ) )
  1916. )
  1917. return false;
  1918. CExtSafeString strWP;
  1919. WINDOWPLACEMENT _wp;
  1920. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  1921. _wp.length = sizeof(WINDOWPLACEMENT);
  1922. CExtControlBar::stat_GetWindowPlacement( hWnd, _wp );
  1923. RECT & rc = _wp.rcNormalPosition;
  1924. strWP.Format( _T("%d,%d,%d,%d,%d,%d"), rc.left, rc.top, rc.right, rc.bottom, _wp.showCmd, _wp.flags );
  1925. ::AfxGetApp()->WriteProfileString( strSection, strEntry, __EXT_MFC_SAFE_LPCTSTR( strWP ) );
  1926. return true;
  1927. #endif
  1928. }
  1929. bool CExtControlBar::stat_LoadWindowRect(
  1930. HWND hWnd,
  1931. __EXT_MFC_SAFE_LPCTSTR strSection,
  1932. __EXT_MFC_SAFE_LPCTSTR strEntry,
  1933. bool bForceHideWindow // = false
  1934. )
  1935. {
  1936. #if (!defined __EXT_MFC_NO_NC_FRAME )
  1937. return CExtNcFrameImpl::stat_LoadWindowRect( hWnd, strSection, strEntry, bForceHideWindow );
  1938. #else
  1939. if( LPCTSTR( strSection ) == NULL
  1940. || LPCTSTR( strEntry ) == NULL
  1941. || _tcslen( LPCTSTR( strSection ) ) == 0
  1942. || _tcslen( LPCTSTR( strEntry ) ) == 0
  1943. || hWnd == NULL
  1944. || ( ! ::IsWindow( hWnd ) )
  1945. )
  1946. return false;
  1947. CExtSafeString strWP;
  1948. WINDOWPLACEMENT _wp;
  1949. strWP = ::AfxGetApp()->GetProfileString( strSection, strEntry );
  1950. if( strWP.IsEmpty() )
  1951. return false;
  1952. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  1953. _wp.length = sizeof(WINDOWPLACEMENT);
  1954. CExtControlBar::stat_GetWindowPlacement( hWnd, _wp );
  1955. RECT & rc = _wp.rcNormalPosition;
  1956. if( __EXT_MFC_STSCANF(
  1957. __EXT_MFC_SAFE_LPCTSTR( strWP ),
  1958. __EXT_MFC_SAFE_LPCTSTR( _T("%d,%d,%d,%d,%d,%d") ),
  1959. &rc.left, 
  1960. &rc.top, 
  1961. &rc.right, 
  1962. &rc.bottom,
  1963. &_wp.showCmd,
  1964. &_wp.flags
  1965. ) == 6
  1966. )
  1967. {
  1968. if( bForceHideWindow )
  1969. _wp.showCmd = SW_HIDE;
  1970. CExtControlBar::stat_SetWindowPlacement( hWnd, _wp );
  1971. }
  1972. ::RedrawWindow( hWnd, NULL, NULL, RDW_INVALIDATE|RDW_ERASE|RDW_UPDATENOW|RDW_ALLCHILDREN|RDW_FRAME );
  1973. return true;
  1974. #endif
  1975. }
  1976. void CExtControlBar::OnContextMenu(CWnd* pWnd, CPoint point) 
  1977. {
  1978. ASSERT_VALID( this );
  1979. pWnd;
  1980. ScreenToClient( &point );
  1981. CRect rcClient;
  1982. GetClientRect( &rcClient );
  1983. if( rcClient.PtInRect(point) )
  1984. return;
  1985. OnRButtonUp( 0, point );
  1986. }
  1987. void CExtControlBar::OnTimer(__EXT_MFC_UINT_PTR nIDEvent)
  1988. {
  1989. ASSERT_VALID( this );
  1990. if( nIDEvent == ((__EXT_MFC_UINT_PTR)m_nFlashCaptionTimerID) )
  1991. {
  1992. FlashCaption_OnTimer();
  1993. return;
  1994. }
  1995. CControlBar::OnTimer( nIDEvent );
  1996. }
  1997. CExtControlBar::eResizablePanelDockingType_t
  1998. CExtControlBar::OnQueryDockingType() const
  1999. {
  2000. ASSERT_VALID( this );
  2001. eResizablePanelDockingType_t eResizablePanelDockingType =
  2002. g_eResizablePanelDockingType;
  2003. if( eResizablePanelDockingType == __RESIZABLE_DOCKING_TYPE_BY_THEME )
  2004. eResizablePanelDockingType = (eResizablePanelDockingType_t)
  2005. PmBridge_GetPM()->GetThemeDockingType();
  2006. ASSERT( __RESIZABLE_DOCKING_TYPE_MIN_VALUE <= eResizablePanelDockingType );
  2007. ASSERT( eResizablePanelDockingType <= __RESIZABLE_DOCKING_TYPE_MAX_VALUE );
  2008. return eResizablePanelDockingType;
  2009. }
  2010. #if (!defined __EXT_MFC_NO_DOCK_MARKERS)
  2011. /////////////////////////////////////////////////////////////////////////////
  2012. // CExtDynDockHighlightWnd window
  2013. IMPLEMENT_DYNAMIC( CExtDynDockHighlightWnd, CWnd )
  2014. IMPLEMENT_CExtPmBridge_MEMBERS( CExtDynDockHighlightWnd );
  2015. CExtDynDockHighlightWnd::CExtDynDockHighlightWnd(
  2016. CExtDynDockMarkerWnd * pWndDynDockMarker
  2017. )
  2018. : m_pWndDynDockMarker( pWndDynDockMarker )
  2019. {
  2020. ASSERT_VALID( m_pWndDynDockMarker );
  2021. ASSERT( m_pWndDynDockMarker->GetSafeHwnd() != NULL );
  2022. ASSERT( pWndDynDockMarker->IsStateApplyable() );
  2023. CExtControlBar * pDraggedBar =
  2024. CExtControlBar::_DraggingGetBar();
  2025. if( pDraggedBar == NULL )
  2026. return;
  2027. ASSERT_VALID( pDraggedBar );
  2028. HWND hWndMarkerTarget = pWndDynDockMarker->GetMarkerTargetHWND();
  2029. CRect rcScreen( 0, 0, 0, 0 );
  2030. if( hWndMarkerTarget == NULL )
  2031. {
  2032. if( CExtDynDockMarkerWnd::g_arrDockMarkerWndsOuter.GetSize() != 4 )
  2033. {
  2034. ASSERT( FALSE );
  2035. return;
  2036. } // if( CExtDynDockMarkerWnd::g_arrDockMarkerWndsOuter.GetSize() != 4 )
  2037. CRect rcTemp;
  2038. CExtDynDockMarkerWnd::g_arrDockMarkerWndsOuter[0]->GetWindowRect( &rcTemp );
  2039. rcScreen.top = rcTemp.top;
  2040. CExtDynDockMarkerWnd::g_arrDockMarkerWndsOuter[1]->GetWindowRect( &rcTemp );
  2041. rcScreen.bottom = rcTemp.bottom;
  2042. CExtDynDockMarkerWnd::g_arrDockMarkerWndsOuter[2]->GetWindowRect( &rcTemp );
  2043. rcScreen.left = rcTemp.left;
  2044. CExtDynDockMarkerWnd::g_arrDockMarkerWndsOuter[3]->GetWindowRect( &rcTemp );
  2045. rcScreen.right = rcTemp.right;
  2046. CRect rcOuterMargins = PmBridge_GetPM()->DockMarker_GetOuterDistance();
  2047. rcScreen.InflateRect( &rcOuterMargins );
  2048. } // if( hWndMarkerTarget == NULL )
  2049. else
  2050. {
  2051. ::GetWindowRect( hWndMarkerTarget, &rcScreen );
  2052. CWnd * pWnd = CWnd::FromHandlePermanent( hWndMarkerTarget );
  2053. if( pWnd == NULL
  2054. || (! pWnd->IsKindOf( RUNTIME_CLASS(CExtControlBar) ) )
  2055. )
  2056. hWndMarkerTarget = NULL;
  2057. } // else from if( hWndMarkerTarget == NULL )
  2058. CExtPaintManager::eDockMarkerType_t eDockMarkerType =
  2059. (CExtPaintManager::eDockMarkerType_t)
  2060. pWndDynDockMarker->GetMarkerType();
  2061. static const CSize _sizeMinMetric( 30, 30 );
  2062. switch( eDockMarkerType )
  2063. {
  2064. case CExtPaintManager::__EDMT_2005_TOP:
  2065. if( hWndMarkerTarget != NULL )
  2066. {
  2067. rcScreen.bottom = rcScreen.top + rcScreen.Height() / 2;
  2068. } // if( hWndMarkerTarget != NULL )
  2069. else
  2070. {
  2071. CSize _size = pDraggedBar->GetSizeDockedHorizontal();
  2072. if( _size.cy <= _sizeMinMetric.cy )
  2073. _size.cy = _sizeMinMetric.cy;
  2074. rcScreen.bottom = rcScreen.top + _size.cy;
  2075. } // else from if( hWndMarkerTarget != NULL )
  2076. break;
  2077. case CExtPaintManager::__EDMT_2005_BOTTOM:
  2078. if( hWndMarkerTarget != NULL )
  2079. {
  2080. rcScreen.top = rcScreen.bottom - rcScreen.Height() / 2;
  2081. } // if( hWndMarkerTarget != NULL )
  2082. else
  2083. {
  2084. CSize _size = pDraggedBar->GetSizeDockedHorizontal();
  2085. if( _size.cy <= _sizeMinMetric.cy )
  2086. _size.cy = _sizeMinMetric.cy;
  2087. rcScreen.top = rcScreen.bottom - _size.cy;
  2088. } // else from if( hWndMarkerTarget != NULL )
  2089. break;
  2090. case CExtPaintManager::__EDMT_2005_LEFT:
  2091. if( hWndMarkerTarget != NULL )
  2092. {
  2093. rcScreen.right = rcScreen.left + rcScreen.Width() / 2;
  2094. } // if( hWndMarkerTarget != NULL )
  2095. else
  2096. {
  2097. CSize _size = pDraggedBar->GetSizeDockedVertical();
  2098. if( _size.cx <= _sizeMinMetric.cx )
  2099. _size.cx = _sizeMinMetric.cx;
  2100. rcScreen.right = rcScreen.left + _size.cx;
  2101. } // else from if( hWndMarkerTarget != NULL )
  2102. break;
  2103. case CExtPaintManager::__EDMT_2005_RIGHT:
  2104. if( hWndMarkerTarget != NULL )
  2105. {
  2106. rcScreen.left = rcScreen.right - rcScreen.Width() / 2;
  2107. } // if( hWndMarkerTarget != NULL )
  2108. else
  2109. {
  2110. CSize _size = pDraggedBar->GetSizeDockedVertical();
  2111. if( _size.cx <= _sizeMinMetric.cx )
  2112. _size.cx = _sizeMinMetric.cx;
  2113. rcScreen.left = rcScreen.right - _size.cx;
  2114. } // else from if( hWndMarkerTarget != NULL )
  2115. break;
  2116. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS )
  2117. case CExtPaintManager::__EDMT_2005_TAB:
  2118. break;
  2119. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS )
  2120. default:
  2121. {
  2122. ASSERT( FALSE );
  2123. }
  2124. return;
  2125. } // switch( eDockMarkerType )
  2126. RegisterDockHighlightClass();
  2127. if( CExtDynDockMarkerWnd::g_pWndMarkersParent == NULL )
  2128. {
  2129. CExtDynDockMarkerWnd::g_pWndMarkersParent = new CWnd;
  2130. if( ! CExtDynDockMarkerWnd::g_pWndMarkersParent->CreateEx(
  2131. WS_EX_TOPMOST,
  2132. __EXT_DYNDOCKMARKER_CLASS_NAME,
  2133. _T(""),
  2134. WS_POPUP,
  2135. 0,
  2136. 0,
  2137. 0,
  2138. 0,
  2139. ::GetDesktopWindow(),
  2140. (HMENU)NULL,
  2141. 0L
  2142. )
  2143. )
  2144. {
  2145. ASSERT( FALSE );
  2146. delete CExtDynDockMarkerWnd::g_pWndMarkersParent;
  2147. CExtDynDockMarkerWnd::g_pWndMarkersParent = NULL;
  2148. return;
  2149. }
  2150. } // if( CExtDynDockMarkerWnd::g_pWndMarkersParent == NULL )
  2151. BOOL bCreateResult =
  2152. CWnd::CreateEx(
  2153. WS_EX_TOPMOST
  2154. | ( g_PaintManager.m_bLayeredHighlighting2005
  2155. ? __EXT_MFC_WS_EX_LAYERED
  2156. : 0
  2157. )
  2158. ,
  2159. __EXT_DYNDOCKHIGHLIGHTWND_CLASS_NAME,
  2160. _T(""),
  2161. WS_POPUP,
  2162. rcScreen.left,
  2163. rcScreen.top,
  2164. rcScreen.Width(),
  2165. rcScreen.Height(),
  2166. CExtDynDockMarkerWnd::g_pWndMarkersParent->GetSafeHwnd(),
  2167. (HMENU)NULL,
  2168. 0L
  2169. );
  2170. if( ! bCreateResult )
  2171. {
  2172. ASSERT( FALSE );
  2173. return;
  2174. } // if( ! bCreateResult )
  2175. if( g_PaintManager.m_bLayeredHighlighting2005 )
  2176. {
  2177. bool bTabShape = false;
  2178. CRect rcTabMainArea(0,0,0,0), rcTabBottomMiddleArea(0,0,0,0);
  2179. bool bTabsAtTop = false;
  2180. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2181. bTabsAtTop = CExtControlBar::g_bTabsAtTop;
  2182. if( m_pWndDynDockMarker->GetMarkerType() == CExtPaintManager::__EDMT_2005_TAB )
  2183. {
  2184. CRect rcClient = rcScreen;
  2185. rcClient.OffsetRect( - rcClient.TopLeft() );
  2186. bTabShape = true;
  2187. int nTabHeight = CExtControlBar::g_nTabShapeMaxHeight;
  2188. int nTrackerHeight = rcClient.Height();
  2189. if( nTrackerHeight < (CExtControlBar::g_nTabShapeMaxHeight * 2) )
  2190. nTabHeight = nTrackerHeight / 2;
  2191. rcTabMainArea = rcClient;
  2192. if( bTabsAtTop )
  2193. rcTabMainArea.top += nTabHeight;
  2194. else
  2195. rcTabMainArea.bottom -= nTabHeight;
  2196. ASSERT( rcTabMainArea.bottom > rcTabMainArea.top );
  2197. CRect rcTabBottomLeftArea( rcClient );
  2198. rcTabBottomLeftArea.right =
  2199. rcTabBottomLeftArea.left
  2200. + CExtControlBar::g_nTabShapeBottomLeftAreaWidth
  2201. ;
  2202. if( bTabsAtTop )
  2203. rcTabBottomLeftArea.bottom =
  2204. rcTabBottomLeftArea.top + nTabHeight;
  2205. else
  2206. rcTabBottomLeftArea.top =
  2207. rcTabBottomLeftArea.bottom - nTabHeight;
  2208. rcTabBottomMiddleArea = rcTabBottomLeftArea;
  2209. rcTabBottomMiddleArea.OffsetRect(
  2210. rcTabBottomLeftArea.Width(),
  2211. 0
  2212. );
  2213. rcTabBottomMiddleArea.right =
  2214. rcTabBottomMiddleArea.left
  2215. + CExtControlBar::g_nTabShapeBottomMiddleAreaWidth
  2216. ;
  2217. if( rcTabBottomMiddleArea.right > rcClient.right )
  2218. rcTabBottomMiddleArea.right = 
  2219. rcTabBottomMiddleArea.left
  2220. + (rcClient.right - rcTabBottomMiddleArea.left) / 2
  2221. ;
  2222. CRect rcTabBottomRightArea( rcTabBottomLeftArea );
  2223. rcTabBottomRightArea.right = rcClient.right;
  2224. rcTabBottomRightArea.left = rcTabBottomMiddleArea.right;
  2225. CExtControlBar * pDraggedBar = CExtControlBar::_DraggingGetBar();
  2226. if( pDraggedBar->GetSafeHwnd() != NULL )
  2227. {
  2228. ASSERT_VALID( pDraggedBar );
  2229. ASSERT_VALID( pDraggedBar->m_pDockSite );
  2230. ASSERT( pDraggedBar->m_pDockSite->GetSafeHwnd() != NULL );
  2231. if( (pDraggedBar->m_pDockSite->GetExStyle()&WS_EX_LAYOUTRTL) != 0 )
  2232. {
  2233. rcTabBottomRightArea.left =
  2234. rcTabBottomRightArea.right
  2235. - rcTabBottomLeftArea.Width()
  2236. ;
  2237. rcTabBottomMiddleArea.OffsetRect(
  2238. rcTabBottomRightArea.left
  2239. - rcTabBottomMiddleArea.right
  2240. ,
  2241. 0
  2242. );
  2243. rcTabBottomLeftArea.right =
  2244. rcTabBottomMiddleArea.left
  2245. ;
  2246. } // if( (pDraggedBar->m_pDockSite->GetExStyle()&WS_EX_LAYOUTRTL) != 0 )
  2247. } // if( pDraggedBar->GetSafeHwnd() != NULL )
  2248. } // if( m_pWndDynDockMarker->GetMarkerType() == CExtPaintManager::__EDMT_2005_TAB )
  2249. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS )
  2250. PmBridge_GetPM()->DockMarker_AdjustHighlightedLayer(
  2251. m_hWnd,
  2252. rcScreen.Width(),
  2253. rcScreen.Height(),
  2254. bTabShape,
  2255. bTabsAtTop,
  2256. rcTabMainArea,
  2257. rcTabBottomMiddleArea
  2258. );
  2259. }
  2260. SetWindowPos(
  2261. CExtDynDockMarkerWnd::g_pWndMarkersParent,
  2262. 0, 0, 0, 0,
  2263. SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_SHOWWINDOW
  2264. );
  2265. }
  2266. CExtDynDockHighlightWnd::~CExtDynDockHighlightWnd()
  2267. {
  2268. }
  2269. BEGIN_MESSAGE_MAP(CExtDynDockHighlightWnd, CWnd)
  2270. //{{AFX_MSG_MAP(CExtDynDockHighlightWnd)
  2271. ON_WM_NCCALCSIZE()
  2272. ON_WM_MOUSEACTIVATE()
  2273. ON_WM_PAINT()
  2274. //}}AFX_MSG_MAP
  2275. END_MESSAGE_MAP()
  2276. bool CExtDynDockHighlightWnd::g_bDockHighlightClassRegistered = false;
  2277. bool CExtDynDockHighlightWnd::RegisterDockHighlightClass()
  2278. {
  2279. if( g_bDockHighlightClassRegistered )
  2280. return true;
  2281. WNDCLASS _wndClassInfo;
  2282. HINSTANCE hInst = ::AfxGetInstanceHandle();
  2283. if( ! ::GetClassInfo( hInst, __EXT_DYNDOCKHIGHLIGHTWND_CLASS_NAME, &_wndClassInfo ) )
  2284. {
  2285. _wndClassInfo.style = CS_GLOBALCLASS; //|CS_DBLCLKS;
  2286. _wndClassInfo.lpfnWndProc = ::DefWindowProc;
  2287. _wndClassInfo.cbClsExtra = _wndClassInfo.cbWndExtra = 0;
  2288. _wndClassInfo.hInstance = hInst;
  2289. _wndClassInfo.hIcon = NULL;
  2290. _wndClassInfo.hCursor = ::LoadCursor( NULL, IDC_ARROW );
  2291. ASSERT( _wndClassInfo.hCursor != NULL );
  2292. _wndClassInfo.hbrBackground = NULL; 
  2293. _wndClassInfo.lpszMenuName = NULL;
  2294. _wndClassInfo.lpszClassName = __EXT_DYNDOCKHIGHLIGHTWND_CLASS_NAME;
  2295. if( !::AfxRegisterClass( &_wndClassInfo ) )
  2296. {
  2297. ASSERT( FALSE );
  2298. //AfxThrowResourceException();
  2299. return false;
  2300. }
  2301. }
  2302. g_bDockHighlightClassRegistered = true;
  2303. return true;
  2304. }
  2305. BOOL CExtDynDockHighlightWnd::PreCreateWindow( CREATESTRUCT & cs ) 
  2306. {
  2307. if( ( !RegisterDockHighlightClass() )
  2308. || ( ! CWnd::PreCreateWindow(cs) )
  2309. )
  2310. {
  2311. ASSERT( FALSE );
  2312. return FALSE;
  2313. }
  2314. cs.lpszClass = __EXT_DYNDOCKHIGHLIGHTWND_CLASS_NAME;
  2315. return TRUE;
  2316. }
  2317. void CExtDynDockHighlightWnd::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp) 
  2318. {
  2319. // CWnd::OnNcCalcSize(bCalcValidRects, lpncsp);
  2320. bCalcValidRects;
  2321. lpncsp;
  2322. }
  2323. int CExtDynDockHighlightWnd::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message) 
  2324. {
  2325. // return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);
  2326. pDesktopWnd;
  2327. nHitTest;
  2328. message;
  2329. return MA_NOACTIVATEANDEAT;
  2330. }
  2331. void CExtDynDockHighlightWnd::OnPaint() 
  2332. {
  2333. if( g_PaintManager.m_bLayeredHighlighting2005 )
  2334. {
  2335. Default();
  2336. return;
  2337. } // if( g_PaintManager.m_bLayeredHighlighting2005 )
  2338. CRect rcClient;
  2339. GetClientRect( &rcClient );
  2340. CPaintDC dcPaint( this );
  2341. if( rcClient.IsRectEmpty() )
  2342. return;
  2343. if( m_bmpHighlightSurface.IsEmpty() )
  2344. {
  2345. BITMAPINFOHEADER bih;
  2346. ::memset( &bih, 0, sizeof(BITMAPINFOHEADER) );
  2347. bih.biSize = sizeof(BITMAPINFOHEADER);
  2348. bih.biWidth = rcClient.Width();
  2349. bih.biHeight = rcClient.Height();
  2350. bih.biPlanes = 1;
  2351. bih.biBitCount = 32;
  2352. bih.biCompression = BI_RGB;
  2353. bih.biSizeImage = bih.biWidth * bih.biHeight;
  2354. COLORREF * pSurfaceCB = NULL;
  2355. HBITMAP hDib =
  2356. ::CreateDIBSection(
  2357. dcPaint,
  2358. (LPBITMAPINFO)&bih,
  2359. DIB_RGB_COLORS,
  2360. (void **)&pSurfaceCB,
  2361. NULL,
  2362. NULL
  2363. );
  2364. if( hDib == NULL || pSurfaceCB == NULL )
  2365. {
  2366. ASSERT( FALSE );
  2367. return;
  2368. }
  2369. CDC dcMemory;
  2370. if( ! dcMemory.CreateCompatibleDC( &dcPaint ) )
  2371. {
  2372. ASSERT( FALSE );
  2373. ::DeleteObject( hDib );
  2374. return;
  2375. }
  2376. HGDIOBJ hOldBmp = dcMemory.SelectObject( hDib );
  2377. dcMemory.BitBlt(
  2378. 0,
  2379. 0,
  2380. bih.biWidth,
  2381. bih.biHeight,
  2382. &dcPaint,
  2383. 0,
  2384. 0,
  2385. SRCCOPY
  2386. );
  2387. dcMemory.SelectObject( hOldBmp );
  2388. dcMemory.DeleteDC();
  2389. bool bTabShape = false;
  2390. CRect rcTabMainArea(0,0,0,0), rcTabBottomMiddleArea(0,0,0,0);
  2391. bool bTabsAtTop = false;
  2392. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2393. bTabsAtTop = CExtControlBar::g_bTabsAtTop;
  2394. if( m_pWndDynDockMarker->GetMarkerType() == CExtPaintManager::__EDMT_2005_TAB )
  2395. {
  2396. bTabShape = true;
  2397. int nTabHeight = CExtControlBar::g_nTabShapeMaxHeight;
  2398. int nTrackerHeight = rcClient.Height();
  2399. if( nTrackerHeight < (CExtControlBar::g_nTabShapeMaxHeight * 2) )
  2400. nTabHeight = nTrackerHeight / 2;
  2401. rcTabMainArea = rcClient;
  2402. if( bTabsAtTop )
  2403. rcTabMainArea.top += nTabHeight;
  2404. else
  2405. rcTabMainArea.bottom -= nTabHeight;
  2406. ASSERT( rcTabMainArea.bottom > rcTabMainArea.top );
  2407. CRect rcTabBottomLeftArea( rcClient );
  2408. rcTabBottomLeftArea.right =
  2409. rcTabBottomLeftArea.left
  2410. + CExtControlBar::g_nTabShapeBottomLeftAreaWidth
  2411. ;
  2412. if( bTabsAtTop )
  2413. rcTabBottomLeftArea.bottom =
  2414. rcTabBottomLeftArea.top + nTabHeight;
  2415. else
  2416. rcTabBottomLeftArea.top =
  2417. rcTabBottomLeftArea.bottom - nTabHeight;
  2418. rcTabBottomMiddleArea = rcTabBottomLeftArea;
  2419. rcTabBottomMiddleArea.OffsetRect(
  2420. rcTabBottomLeftArea.Width(),
  2421. 0
  2422. );
  2423. rcTabBottomMiddleArea.right =
  2424. rcTabBottomMiddleArea.left
  2425. + CExtControlBar::g_nTabShapeBottomMiddleAreaWidth
  2426. ;
  2427. if( rcTabBottomMiddleArea.right > rcClient.right )
  2428. rcTabBottomMiddleArea.right = 
  2429. rcTabBottomMiddleArea.left
  2430. + (rcClient.right - rcTabBottomMiddleArea.left) / 2
  2431. ;
  2432. CRect rcTabBottomRightArea( rcTabBottomLeftArea );
  2433. rcTabBottomRightArea.right = rcClient.right;
  2434. rcTabBottomRightArea.left = rcTabBottomMiddleArea.right;
  2435. CExtControlBar * pDraggedBar = CExtControlBar::_DraggingGetBar();
  2436. if( pDraggedBar->GetSafeHwnd() != NULL )
  2437. {
  2438. ASSERT_VALID( pDraggedBar );
  2439. ASSERT_VALID( pDraggedBar->m_pDockSite );
  2440. ASSERT( pDraggedBar->m_pDockSite->GetSafeHwnd() != NULL );
  2441. if( (pDraggedBar->m_pDockSite->GetExStyle()&WS_EX_LAYOUTRTL) != 0 )
  2442. {
  2443. rcTabBottomRightArea.left =
  2444. rcTabBottomRightArea.right
  2445. - rcTabBottomLeftArea.Width()
  2446. ;
  2447. rcTabBottomMiddleArea.OffsetRect(
  2448. rcTabBottomRightArea.left
  2449. - rcTabBottomMiddleArea.right
  2450. ,
  2451. 0
  2452. );
  2453. rcTabBottomLeftArea.right =
  2454. rcTabBottomMiddleArea.left
  2455. ;
  2456. } // if( (pDraggedBar->m_pDockSite->GetExStyle()&WS_EX_LAYOUTRTL) != 0 )
  2457. } // if( pDraggedBar->GetSafeHwnd() != NULL )
  2458. } // if( m_pWndDynDockMarker->GetMarkerType() == CExtPaintManager::__EDMT_2005_TAB )
  2459. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS )
  2460. PmBridge_GetPM()->DockMarker_AdjustHighlightedArea(
  2461. pSurfaceCB,
  2462. bih.biWidth,
  2463. bih.biHeight,
  2464. bTabShape,
  2465. bTabsAtTop,
  2466. rcTabMainArea,
  2467. rcTabBottomMiddleArea
  2468. );
  2469. m_bmpHighlightSurface.FromBitmap( hDib );
  2470. ::DeleteObject( hDib );
  2471. } // if( m_bmpHighlightSurface.IsEmpty() )
  2472. ASSERT( ! m_bmpHighlightSurface.IsEmpty() );
  2473. // CDC dcMemory;
  2474. //  if( dcMemory.CreateCompatibleDC( &dcPaint ) )
  2475. //  {
  2476. //  CBitmap * pOldBmp =
  2477. //  dcMemory.SelectObject(
  2478. //  &m_bmpHighlightSurface
  2479. //  );
  2480. //  dcPaint.BitBlt(
  2481. //  0,
  2482. //  0,
  2483. //  rcClient.Width(),
  2484. //  rcClient.Height(),
  2485. //  &dcMemory,
  2486. //  0,
  2487. //  0,
  2488. //  SRCCOPY
  2489. //  );
  2490. //  dcMemory.SelectObject( pOldBmp );
  2491. //  } // if( dcMemory.CreateCompatibleDC( &dcPaint ) )
  2492. // #ifdef _DEBUG
  2493. //  else
  2494. //  {
  2495. //  ASSERT( FALSE );
  2496. //  } // else from if( dcMemory.CreateCompatibleDC( &dcPaint ) )
  2497. // #endif // _DEBUG
  2498. m_bmpHighlightSurface.AlphaBlend(
  2499. dcPaint.m_hDC,
  2500. 0,
  2501. 0,
  2502. rcClient.Width(),
  2503. rcClient.Height()
  2504. );
  2505. }
  2506. /////////////////////////////////////////////////////////////////////////////
  2507. // CExtDynDockMarkerWnd window
  2508. #define __DYNDOCKMARKER_TIMER_ID_TEMP 77
  2509. #define __DYNDOCKMARKER_TIMER_ID_ANIMATE 88
  2510. #define __DYNDOCKMARKER_ANIMATION_PERCENT_STEP 25
  2511. IMPLEMENT_DYNAMIC( CExtDynDockMarkerWnd, CWnd )
  2512. IMPLEMENT_CExtPmBridge_MEMBERS( CExtDynDockMarkerWnd );
  2513. CWnd * CExtDynDockMarkerWnd::g_pWndMarkersParent = NULL;
  2514. CExtDynDockMarkerWnd::CExtDynDockMarkerWnd(
  2515. CExtDynDockMarkerWnd * pWndParentMarker,
  2516. HWND hWndMarkerTarget,
  2517. int eMarkerType,
  2518. const CExtBitmap & _bmpIn,
  2519. const CExtBitmap & _bmpOut,
  2520. HRGN hRgn,
  2521. CRect rcScreen,
  2522. const CExtBitmap * _pBmpOuterBk, // = NULL
  2523. int nOffserInnerX, // = 0
  2524. int nOffserInnerY, // = 0
  2525. bool bSparsedMode // = false
  2526. )
  2527. : m_pWndParentMarker( pWndParentMarker )
  2528. , m_hWndMarkerTarget( hWndMarkerTarget )
  2529. , m_hWndLastHoverDepenentMarker( NULL )
  2530. , m_ptOffsetInner( nOffserInnerX, nOffserInnerY )
  2531. , m_bSparsedMode( bSparsedMode )
  2532. , m_bAnimationInProcess( false )
  2533. , m_bAnimationShow( false )
  2534. , m_bDestroyOnAnimationStop( false )
  2535. , m_nOpaquePercent( 100 )
  2536. {
  2537. m_pWndParentMarker;
  2538. m_pWndDockHighlight = NULL;
  2539. // ASSERT( m_hWndMarkerTarget != NULL && ::IsWindow(m_hWndMarkerTarget) );
  2540. m_eMarkerType = eMarkerType;
  2541. ASSERT(
  2542. int(CExtPaintManager::__EDMT_MIN_VALUE) <= m_eMarkerType
  2543. && m_eMarkerType <= int(CExtPaintManager::__EDMT_MAX_VALUE)
  2544. );
  2545. m_eMTS = __EMTS_UNKNOWN;
  2546. ASSERT( ! _bmpIn.IsEmpty() );
  2547. ASSERT( ! _bmpOut.IsEmpty() );
  2548. ASSERT( hRgn != NULL );
  2549. m_bmpIn = _bmpIn;
  2550. m_bmpOut = _bmpOut;
  2551. if( _pBmpOuterBk != NULL  )
  2552. // m_bmpOuterBk.Attach( hBmpOuterBk );
  2553. m_bmpOuterBk = (*_pBmpOuterBk);
  2554. m_rgn.Attach( hRgn );
  2555. RegisterDockMarkerClass();
  2556. if( g_pWndMarkersParent == NULL )
  2557. {
  2558. g_pWndMarkersParent = new CWnd;
  2559. if( ! g_pWndMarkersParent->CreateEx(
  2560. WS_EX_TOPMOST,
  2561. __EXT_DYNDOCKMARKER_CLASS_NAME,
  2562. _T(""),
  2563. WS_POPUP,
  2564. 0,
  2565. 0,
  2566. 0,
  2567. 0,
  2568. ::GetDesktopWindow(),
  2569. (HMENU)NULL,
  2570. 0L
  2571. )
  2572. )
  2573. {
  2574. ASSERT( FALSE );
  2575. delete g_pWndMarkersParent;
  2576. g_pWndMarkersParent = NULL;
  2577. return;
  2578. }
  2579. } // if( g_pWndMarkersParent == NULL )
  2580. BOOL bCreateResult =
  2581. CWnd::CreateEx(
  2582. WS_EX_TOPMOST
  2583. | ( g_PaintManager.m_bLayeredHighlighting2005
  2584. ? __EXT_MFC_WS_EX_LAYERED
  2585. : 0
  2586. )
  2587. ,
  2588. __EXT_DYNDOCKMARKER_CLASS_NAME,
  2589. _T(""),
  2590. WS_POPUP,
  2591. rcScreen.left,
  2592. rcScreen.top,
  2593. rcScreen.Width(),
  2594. rcScreen.Height(),
  2595. g_pWndMarkersParent->GetSafeHwnd(),
  2596. (HMENU)NULL,
  2597. 0L
  2598. );
  2599. if( ! bCreateResult )
  2600. {
  2601. ASSERT( FALSE );
  2602. return;
  2603. } // if( ! bCreateResult )
  2604. if( g_PaintManager.m_bLayeredHighlighting2005 )
  2605. g_PaintManager.m_pfnSetLayeredWindowAttributes(
  2606. GetSafeHwnd(), 
  2607. 0, 
  2608. 255,
  2609. __EXT_MFC_LWA_ALPHA
  2610. );
  2611. ::SetWindowRgn(
  2612. m_hWnd,
  2613. (HRGN)m_rgn.GetSafeHandle(),
  2614. FALSE
  2615. );
  2616. // if( m_pWndParentMarker->GetSafeHwnd() != NULL )
  2617. // SetWindowPos( m_pWndParentMarker, 0,0,0,0, SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE );
  2618. // if( eMarkerType == INT(CExtPaintManager::__EDMT_2005_GROUP_CENTRAL) )
  2619. // ShowWindow( SW_HIDE );
  2620. SetTimer( __DYNDOCKMARKER_TIMER_ID_TEMP, 50, NULL );
  2621. }
  2622. CExtDynDockMarkerWnd::~CExtDynDockMarkerWnd()
  2623. {
  2624. HighlightMarkerTarget( false );
  2625. }
  2626. BEGIN_MESSAGE_MAP(CExtDynDockMarkerWnd, CWnd)
  2627. //{{AFX_MSG_MAP(CExtDynDockMarkerWnd)
  2628. ON_WM_NCCALCSIZE()
  2629. ON_WM_MOUSEACTIVATE()
  2630. ON_WM_PAINT()
  2631. ON_WM_TIMER()
  2632. //}}AFX_MSG_MAP
  2633.     ON_MESSAGE( WM_PRINT, OnPrintClient )
  2634.     ON_MESSAGE( WM_PRINTCLIENT, OnPrintClient )
  2635. END_MESSAGE_MAP()
  2636. CTypedPtrArray < CPtrArray, CExtDynDockMarkerWnd * >
  2637. CExtDynDockMarkerWnd::g_arrDockMarkerWndsOuter;
  2638. CTypedPtrArray < CPtrArray, CExtDynDockMarkerWnd * >
  2639. CExtDynDockMarkerWnd::g_arrDockMarkerWndsInner;
  2640. HWND CExtDynDockMarkerWnd::g_hWndLastDynamicTarget = NULL;
  2641. bool CExtDynDockMarkerWnd::HighlightMarkerTarget(
  2642. bool bHighlight // = true
  2643. )
  2644. {
  2645. ASSERT_VALID( this );
  2646. if( GetSafeHwnd() != NULL
  2647. && ( GetExStyle() & __EXT_MFC_WS_EX_LAYERED ) != 0
  2648. && g_PaintManager.m_bLayeredHighlighting2005
  2649. )
  2650. g_PaintManager.m_pfnSetLayeredWindowAttributes(
  2651. GetSafeHwnd(), 
  2652. 0, 
  2653. g_PaintManager->DockMarker_GetAlpha( bHighlight, this ),
  2654. __EXT_MFC_LWA_ALPHA
  2655. );
  2656. if( bHighlight )
  2657. {
  2658. if( m_pWndDockHighlight != NULL )
  2659. HighlightMarkerTarget( false );
  2660. UnHighlightMarkersExcluding( this );
  2661. m_pWndDockHighlight =
  2662. new CExtDynDockHighlightWnd( this );
  2663. if( m_pWndDockHighlight->GetSafeHwnd() == NULL )
  2664. {
  2665. HighlightMarkerTarget( false );
  2666. ASSERT( FALSE );
  2667. return false;
  2668. } // if( m_pWndDockHighlight->GetSafeHwnd() == NULL )
  2669. return true;
  2670. } // if( bHighlight )
  2671. else
  2672. {
  2673. if( m_pWndDockHighlight != NULL )
  2674. {
  2675. ASSERT_VALID( m_pWndDockHighlight );
  2676. if( m_pWndDockHighlight->GetSafeHwnd() != NULL )
  2677. m_pWndDockHighlight->DestroyWindow();
  2678. delete m_pWndDockHighlight;
  2679. m_pWndDockHighlight = NULL;
  2680. } // if( m_pWndDockHighlight != NULL )
  2681. return true;
  2682. } // else from if( bHighlight )
  2683. }
  2684. CExtControlBar::e_calc_dock_type_t CExtDynDockMarkerWnd::GetCDT()
  2685. {
  2686. ASSERT_VALID( this );
  2687. ASSERT(
  2688. int(CExtPaintManager::__EDMT_MIN_VALUE) <= m_eMarkerType
  2689. && m_eMarkerType <= int(CExtPaintManager::__EDMT_MAX_VALUE)
  2690. );
  2691. CExtControlBar * pBar = NULL;
  2692. if( m_hWndMarkerTarget != NULL )
  2693. {
  2694. CWnd * pWnd = CWnd::FromHandlePermanent( m_hWndMarkerTarget );
  2695. if( pWnd != NULL )
  2696. {
  2697. pBar =
  2698. DYNAMIC_DOWNCAST( CExtControlBar, pWnd );
  2699. } // if( pWnd != NULL )
  2700. } // if( m_hWndMarkerTarget != NULL )
  2701. switch( m_eMarkerType )
  2702. {
  2703. case int(CExtPaintManager::__EDMT_2005_TOP):
  2704. return
  2705. ( pBar != NULL )
  2706. ? CExtControlBar::__ECDT_2005_BAR_TOP
  2707. : (
  2708. ( m_hWndMarkerTarget != NULL )
  2709. ? CExtControlBar::__ECDT_2005_INNER_TOP
  2710. : CExtControlBar::__ECDT_2005_OUTER_TOP
  2711. )
  2712. ;
  2713. case int(CExtPaintManager::__EDMT_2005_BOTTOM):
  2714. return
  2715. ( pBar != NULL )
  2716. ? CExtControlBar::__ECDT_2005_BAR_BOTTOM
  2717. : (
  2718. ( m_hWndMarkerTarget != NULL )
  2719. ? CExtControlBar::__ECDT_2005_INNER_BOTTOM
  2720. : CExtControlBar::__ECDT_2005_OUTER_BOTTOM
  2721. )
  2722. ;
  2723. case int(CExtPaintManager::__EDMT_2005_LEFT):
  2724. return
  2725. ( pBar != NULL )
  2726. ? CExtControlBar::__ECDT_2005_BAR_LEFT
  2727. : (
  2728. ( m_hWndMarkerTarget != NULL )
  2729. ? CExtControlBar::__ECDT_2005_INNER_LEFT
  2730. : CExtControlBar::__ECDT_2005_OUTER_LEFT
  2731. )
  2732. ;
  2733. case int(CExtPaintManager::__EDMT_2005_RIGHT):
  2734. return
  2735. ( pBar != NULL )
  2736. ? CExtControlBar::__ECDT_2005_BAR_RIGHT
  2737. : (
  2738. ( m_hWndMarkerTarget != NULL )
  2739. ? CExtControlBar::__ECDT_2005_INNER_RIGHT
  2740. : CExtControlBar::__ECDT_2005_OUTER_RIGHT
  2741. )
  2742. ;
  2743. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS )
  2744. case int(CExtPaintManager::__EDMT_2005_TAB):
  2745. {
  2746. if( pBar != NULL )
  2747. return CExtControlBar::__ECDT_2005_BAR_NEW_TAB;
  2748. break;
  2749. }
  2750. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS )
  2751. } // switch( m_eMarkerType )
  2752. return CExtControlBar::__ECDT_FLOATED;
  2753. }
  2754. int CExtDynDockMarkerWnd::GetMarkerType() const
  2755. {
  2756. ASSERT_VALID( this );
  2757. ASSERT(
  2758. int(CExtPaintManager::__EDMT_MIN_VALUE) <= m_eMarkerType
  2759. && m_eMarkerType <= int(CExtPaintManager::__EDMT_MAX_VALUE)
  2760. );
  2761. return m_eMarkerType;
  2762. }
  2763. HWND CExtDynDockMarkerWnd::GetMarkerTargetHWND() const
  2764. {
  2765. ASSERT_VALID( this );
  2766. //ASSERT( m_hWndMarkerTarget != NULL && ::IsWindow(m_hWndMarkerTarget) );
  2767. return m_hWndMarkerTarget;
  2768. }
  2769. bool CExtDynDockMarkerWnd::IsStateApplyable() const
  2770. {
  2771. ASSERT_VALID( this );
  2772. ASSERT(
  2773. int(CExtPaintManager::__EDMT_MIN_VALUE) <= m_eMarkerType
  2774. && m_eMarkerType <= int(CExtPaintManager::__EDMT_MAX_VALUE)
  2775. );
  2776. if( m_eMarkerType == int(CExtPaintManager::__EDMT_2005_TOP)
  2777. || m_eMarkerType == int(CExtPaintManager::__EDMT_2005_BOTTOM)
  2778. || m_eMarkerType == int(CExtPaintManager::__EDMT_2005_LEFT)
  2779. || m_eMarkerType == int(CExtPaintManager::__EDMT_2005_RIGHT)
  2780. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS )
  2781. || m_eMarkerType == int(CExtPaintManager::__EDMT_2005_TAB)
  2782. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS )
  2783. )
  2784. return true;
  2785. return false;
  2786. }
  2787. void CExtDynDockMarkerWnd::UnHighlightAllMarkers(
  2788. bool bPassPaintMessages // = true
  2789. )
  2790. {
  2791. UnHighlightMarkersExcluding(
  2792. NULL,
  2793. bPassPaintMessages
  2794. );
  2795. }
  2796. void CExtDynDockMarkerWnd::UnHighlightMarkersExcluding(
  2797. CExtDynDockMarkerWnd * pMarkerExclude,
  2798. bool bPassPaintMessages // = true
  2799. )
  2800. {
  2801. UnHighlightMarkersExcluding( g_arrDockMarkerWndsOuter, pMarkerExclude, false );
  2802. UnHighlightMarkersExcluding( g_arrDockMarkerWndsInner, pMarkerExclude, false );
  2803. if( bPassPaintMessages )
  2804. CExtPaintManager::stat_PassPaintMessages();
  2805. }
  2806. void CExtDynDockMarkerWnd::UnHighlightMarkersExcluding(
  2807. CTypedPtrArray < CPtrArray, CExtDynDockMarkerWnd * >
  2808. & arrDockMarkerWnds,
  2809. CExtDynDockMarkerWnd * pMarkerExclude,
  2810. bool bPassPaintMessages // = true
  2811. )
  2812. {
  2813. int nCount = (int)arrDockMarkerWnds.GetSize();
  2814. for( int nIndex = 0; nIndex < nCount; nIndex++ )
  2815. {
  2816. CExtDynDockMarkerWnd * pDynDockMarkerWnd =
  2817. arrDockMarkerWnds[ nIndex ];
  2818. ASSERT_VALID( pDynDockMarkerWnd );
  2819. ASSERT( pDynDockMarkerWnd->GetSafeHwnd() != NULL );
  2820. if( pDynDockMarkerWnd == pMarkerExclude )
  2821. continue;
  2822. VERIFY( pDynDockMarkerWnd->HighlightMarkerTarget( false ) );
  2823. } // for( int nIndex = 0; nIndex < nCount; nIndex++ )
  2824. if( bPassPaintMessages )
  2825. CExtPaintManager::stat_PassPaintMessages();
  2826. }
  2827. void CExtDynDockMarkerWnd::ShowAllMarkers(
  2828. bool bShow // = true
  2829. )
  2830. {
  2831. ShowMarkers( g_arrDockMarkerWndsOuter, bShow, false );
  2832. ShowMarkers( g_arrDockMarkerWndsInner, bShow, true );
  2833. }
  2834. void CExtDynDockMarkerWnd::DestroyAllMarkers()
  2835. {
  2836. DestroyMarkers( g_arrDockMarkerWndsOuter, false );
  2837. DestroyMarkers( g_arrDockMarkerWndsInner, false );
  2838. if( g_pWndMarkersParent != NULL )
  2839. {
  2840. ASSERT_VALID( g_pWndMarkersParent );
  2841. g_pWndMarkersParent->DestroyWindow();
  2842. delete g_pWndMarkersParent;
  2843. g_pWndMarkersParent = NULL;
  2844. } // if( g_pWndMarkersParent != NULL )
  2845. g_hWndLastDynamicTarget = NULL;
  2846. }
  2847. void CExtDynDockMarkerWnd::DestroyMarkers(
  2848. CTypedPtrArray < CPtrArray, CExtDynDockMarkerWnd * >
  2849. & arrDockMarkerWnds,
  2850. bool bAnimate // = true
  2851. )
  2852. {
  2853. ShowMarkers( arrDockMarkerWnds, false, bAnimate );
  2854. int nCount = (int)arrDockMarkerWnds.GetSize();
  2855. for( int nIndex = 0; nIndex < nCount; nIndex++ )
  2856. {
  2857. CExtDynDockMarkerWnd * pDynDockMarkerWnd =
  2858. arrDockMarkerWnds[ nIndex ];
  2859. ASSERT_VALID( pDynDockMarkerWnd );
  2860. if( pDynDockMarkerWnd->GetSafeHwnd() != NULL )
  2861. {
  2862. if( pDynDockMarkerWnd->IsAnimationInProcess() )
  2863. pDynDockMarkerWnd->m_bDestroyOnAnimationStop = true;
  2864. else
  2865. pDynDockMarkerWnd->DestroyWindow();
  2866. }
  2867. } // for( int nIndex = 0; nIndex < nCount; nIndex++ )
  2868. arrDockMarkerWnds.RemoveAll();
  2869. }
  2870. void CExtDynDockMarkerWnd::PostNcDestroy() 
  2871. {
  2872. CWnd::PostNcDestroy();
  2873. delete this;
  2874. }
  2875. bool CExtDynDockMarkerWnd::IsAnimationInProcess() const
  2876. {
  2877. ASSERT_VALID( this );
  2878. return m_bAnimationInProcess;
  2879. }
  2880. void CExtDynDockMarkerWnd::AnimationStart(
  2881. bool bShow
  2882. )
  2883. {
  2884. ASSERT_VALID( this );
  2885. AnimationStop();
  2886. bool bNeedToAnimate = false;
  2887. if( (GetStyle()&WS_VISIBLE) == 0 )
  2888. {
  2889. if( bShow )
  2890. {
  2891. bNeedToAnimate = true;
  2892. if( g_PaintManager.m_bIsWin2000orLater 
  2893. && g_PaintManager.m_pfnSetLayeredWindowAttributes != NULL
  2894. && CExtPaintManager::stat_GetBPP() > 8
  2895. )
  2896. {
  2897. __EXT_MFC_ULONG_PTR nStyle = ::__EXT_MFC_GetWindowLong( GetSafeHwnd(), GWL_EXSTYLE );
  2898. ::__EXT_MFC_SetWindowLong( GetSafeHwnd(), GWL_EXSTYLE, nStyle | __EXT_MFC_WS_EX_LAYERED );
  2899. m_nOpaquePercent = 0;
  2900. g_PaintManager.m_pfnSetLayeredWindowAttributes(
  2901. GetSafeHwnd(), 
  2902. 0, 
  2903. BYTE((255 * m_nOpaquePercent) / 100), 
  2904. __EXT_MFC_LWA_ALPHA
  2905. );
  2906. ShowWindow( SW_SHOWNOACTIVATE );
  2907. CExtPaintManager::stat_PassPaintMessages();
  2908. }
  2909. } // if( bShow )
  2910. }
  2911. else
  2912. {
  2913. if( !bShow )
  2914. {
  2915. bNeedToAnimate = true;
  2916. if( g_PaintManager.m_bIsWin2000orLater 
  2917. && g_PaintManager.m_pfnSetLayeredWindowAttributes != NULL
  2918. && CExtPaintManager::stat_GetBPP() > 8
  2919. )
  2920. {
  2921. __EXT_MFC_ULONG_PTR nStyle = ::__EXT_MFC_GetWindowLong( GetSafeHwnd(), GWL_EXSTYLE );
  2922. ::__EXT_MFC_SetWindowLong( GetSafeHwnd(), GWL_EXSTYLE, nStyle | __EXT_MFC_WS_EX_LAYERED );
  2923. m_nOpaquePercent = 100;
  2924. g_PaintManager.m_pfnSetLayeredWindowAttributes(
  2925. GetSafeHwnd(), 
  2926. 0, 
  2927. BYTE((255 * m_nOpaquePercent) / 100), 
  2928. __EXT_MFC_LWA_ALPHA
  2929. );
  2930. CExtPaintManager::stat_PassPaintMessages();
  2931. }
  2932. } // if( !bShow )
  2933. }
  2934. if( bNeedToAnimate )
  2935. {
  2936. m_bAnimationShow = bShow;
  2937. m_bAnimationInProcess = true;
  2938. m_bDestroyOnAnimationStop = false;
  2939. SetTimer( __DYNDOCKMARKER_TIMER_ID_ANIMATE, 1, NULL );
  2940. OnTimer( __DYNDOCKMARKER_TIMER_ID_ANIMATE );
  2941. }
  2942. }
  2943. void CExtDynDockMarkerWnd::AnimationStop()
  2944. {
  2945. ASSERT_VALID( this );
  2946. KillTimer( __DYNDOCKMARKER_TIMER_ID_ANIMATE );
  2947. if( (GetStyle()&WS_VISIBLE) != 0 )
  2948. {
  2949. if( !m_bAnimationShow )
  2950. ShowWindow( SW_HIDE );
  2951. }
  2952. else
  2953. {
  2954. if( m_bAnimationShow )
  2955. ShowWindow( SW_SHOWNOACTIVATE );
  2956. }
  2957. ::RedrawWindow(
  2958. GetSafeHwnd(), 
  2959. NULL, 
  2960. NULL, 
  2961. RDW_INVALIDATE | RDW_UPDATENOW
  2962. );
  2963. m_bAnimationInProcess = false;
  2964. if( m_bDestroyOnAnimationStop )
  2965. DestroyWindow();
  2966. }
  2967. bool CExtDynDockMarkerWnd::ShowMarker( 
  2968. bool bShow, 
  2969. bool bAnimate // = true 
  2970. )
  2971. {
  2972. ASSERT_VALID( this );
  2973. if( g_PaintManager.m_bIsWin2000orLater 
  2974. && g_PaintManager.m_pfnSetLayeredWindowAttributes != NULL
  2975. && CExtPaintManager::stat_GetBPP() > 8
  2976. && PmBridge_GetPM()->m_eStyle2005 != CExtPaintManager::__ES2005_BETA1
  2977. && bAnimate
  2978. )
  2979. {
  2980. AnimationStart( bShow );
  2981. }
  2982. else
  2983. {
  2984. if( (GetStyle()&WS_VISIBLE) != 0 )
  2985. {
  2986. if( !bShow )
  2987. ShowWindow( SW_HIDE );
  2988. }
  2989. else
  2990. {
  2991. if( bShow )
  2992. ShowWindow( SW_SHOWNOACTIVATE );
  2993. }
  2994. }
  2995. return true;
  2996. }
  2997. void CExtDynDockMarkerWnd::ShowMarkers(
  2998. CTypedPtrArray < CPtrArray, CExtDynDockMarkerWnd * >
  2999. & arrDockMarkerWnds,
  3000. bool bShow, // = true
  3001. bool bAnimate // = true
  3002. )
  3003. {
  3004. static bool bAnimatingInProcess = false;
  3005. int nCount = (int)arrDockMarkerWnds.GetSize();
  3006. if( nCount <= 0 )
  3007. return;
  3008. // if( g_PaintManager.m_bIsWin2000orLater 
  3009. // && g_PaintManager.m_pfnSetLayeredWindowAttributes != NULL
  3010. // && CExtPaintManager::stat_GetBPP() > 8
  3011. // && bAnimate
  3012. // &&  !bAnimatingInProcess
  3013. // )
  3014. // {
  3015. // bool bNeedToAnimate = false;
  3016. //
  3017. // // apply the __EXT_MFC_WS_EX_LAYERED style for all the marker windows
  3018. // int nIndex = 0;
  3019. // for( nIndex = 0; nIndex < nCount; nIndex++ )
  3020. // {
  3021. // CExtDynDockMarkerWnd * pDynDockMarkerWnd =
  3022. // arrDockMarkerWnds[ nIndex ];
  3023. // ASSERT_VALID( pDynDockMarkerWnd );
  3024. // ASSERT( pDynDockMarkerWnd->GetSafeHwnd() != NULL );
  3025. //
  3026. // if( (pDynDockMarkerWnd->GetStyle()&WS_VISIBLE) == 0 )
  3027. // {
  3028. // if( bShow )
  3029. // {
  3030. // bNeedToAnimate = true;
  3031. //
  3032. // LONG nStyle = 
  3033. // ::__EXT_MFC_GetWindowLong(
  3034. // pDynDockMarkerWnd->GetSafeHwnd(), 
  3035. // GWL_EXSTYLE
  3036. // );
  3037. // ::__EXT_MFC_SetWindowLong(
  3038. // pDynDockMarkerWnd->GetSafeHwnd(), 
  3039. // GWL_EXSTYLE, 
  3040. // nStyle | __EXT_MFC_WS_EX_LAYERED
  3041. // );
  3042. // g_PaintManager.m_pfnSetLayeredWindowAttributes(
  3043. // pDynDockMarkerWnd->GetSafeHwnd(), 
  3044. // 0, 
  3045. // 0, 
  3046. // __EXT_MFC_LWA_ALPHA
  3047. // );
  3048. // pDynDockMarkerWnd->ShowWindow( SW_SHOWNOACTIVATE );
  3049. //
  3050. // } // if( bShow )
  3051. // }
  3052. // else
  3053. // {
  3054. // if( !bShow )
  3055. // {
  3056. // bNeedToAnimate = true;
  3057. //
  3058. // LONG nStyle = 
  3059. // ::__EXT_MFC_GetWindowLong(
  3060. // pDynDockMarkerWnd->GetSafeHwnd(), 
  3061. // GWL_EXSTYLE
  3062. // );
  3063. // ::__EXT_MFC_SetWindowLong(
  3064. // pDynDockMarkerWnd->GetSafeHwnd(), 
  3065. // GWL_EXSTYLE, 
  3066. // nStyle | __EXT_MFC_WS_EX_LAYERED
  3067. // );
  3068. // g_PaintManager.m_pfnSetLayeredWindowAttributes(
  3069. // pDynDockMarkerWnd->GetSafeHwnd(), 
  3070. // 0, 
  3071. // 255, 
  3072. // __EXT_MFC_LWA_ALPHA
  3073. // );
  3074. // } // if( !bShow )
  3075. // }
  3076. // }
  3077. //
  3078. // if( bNeedToAnimate )
  3079. // {
  3080. // bAnimatingInProcess = true;
  3081. // for( int nPercent = 25; nPercent <= 100; nPercent += 25 ) 
  3082. // {
  3083. // // Make the marker window nPercent% alpha
  3084. // for( nIndex = 0; nIndex < nCount; nIndex++ )
  3085. // {
  3086. // CExtDynDockMarkerWnd * pDynDockMarkerWnd =
  3087. // arrDockMarkerWnds[ nIndex ];
  3088. // ASSERT_VALID( pDynDockMarkerWnd );
  3089. // ASSERT( pDynDockMarkerWnd->GetSafeHwnd() != NULL );
  3090. //
  3091. // g_PaintManager.m_pfnSetLayeredWindowAttributes(
  3092. // pDynDockMarkerWnd->GetSafeHwnd(), 
  3093. // 0, 
  3094. // BYTE((255 * (bShow ? nPercent : 100 - nPercent)) / 100), 
  3095. // __EXT_MFC_LWA_ALPHA
  3096. // );
  3097. // ::RedrawWindow(
  3098. // pDynDockMarkerWnd->GetSafeHwnd(), 
  3099. // NULL, 
  3100. // NULL, 
  3101. // RDW_INVALIDATE | RDW_UPDATENOW
  3102. // );
  3103. // }
  3104. // Sleep( 15 );
  3105. // }
  3106. // }
  3107. //
  3108. // // remove the __EXT_MFC_WS_EX_LAYERED style for all the marker windows
  3109. // for( nIndex = 0; nIndex < nCount; nIndex++ )
  3110. // {
  3111. // CExtDynDockMarkerWnd * pDynDockMarkerWnd =
  3112. // arrDockMarkerWnds[ nIndex ];
  3113. // ASSERT_VALID( pDynDockMarkerWnd );
  3114. // ASSERT( pDynDockMarkerWnd->GetSafeHwnd() != NULL );
  3115. //
  3116. // if( (pDynDockMarkerWnd->GetStyle()&WS_VISIBLE) != 0 )
  3117. // {
  3118. // if( !bShow )
  3119. // pDynDockMarkerWnd->ShowWindow( SW_HIDE );
  3120. // }
  3121. // else
  3122. // {
  3123. // if( bShow )
  3124. // pDynDockMarkerWnd->ShowWindow( SW_SHOWNOACTIVATE );
  3125. // }
  3126. //
  3127. // LONG nStyle = 
  3128. // ::__EXT_MFC_GetWindowLong(
  3129. // pDynDockMarkerWnd->GetSafeHwnd(), 
  3130. // GWL_EXSTYLE
  3131. // );
  3132. // if( (nStyle & __EXT_MFC_WS_EX_LAYERED) != 0 )
  3133. // {
  3134. // ::__EXT_MFC_SetWindowLong(
  3135. // pDynDockMarkerWnd->GetSafeHwnd(), 
  3136. // GWL_EXSTYLE, 
  3137. // nStyle & ~__EXT_MFC_WS_EX_LAYERED
  3138. // );
  3139. // ::RedrawWindow(
  3140. // pDynDockMarkerWnd->GetSafeHwnd(), 
  3141. // NULL, 
  3142. // NULL, 
  3143. // RDW_INVALIDATE | RDW_UPDATENOW
  3144. // );
  3145. // }
  3146. // }
  3147. // bAnimatingInProcess = false;
  3148. // }
  3149. // else
  3150. {
  3151. for( int nIndex = 0; nIndex < nCount; nIndex++ )
  3152. {
  3153. CExtDynDockMarkerWnd * pDynDockMarkerWnd =
  3154. arrDockMarkerWnds[ nIndex ];
  3155. ASSERT_VALID( pDynDockMarkerWnd );
  3156. ASSERT( pDynDockMarkerWnd->GetSafeHwnd() != NULL );
  3157. if( (pDynDockMarkerWnd->GetStyle()&WS_VISIBLE) != 0 )
  3158. {
  3159. if( !bShow )
  3160. //pDynDockMarkerWnd->ShowWindow( SW_HIDE );
  3161. pDynDockMarkerWnd->ShowMarker( false, bAnimate );
  3162. }
  3163. else
  3164. {
  3165. if( bShow )
  3166. //pDynDockMarkerWnd->ShowWindow( SW_SHOWNOACTIVATE );
  3167. pDynDockMarkerWnd->ShowMarker( true, bAnimate );
  3168. }
  3169. } // for( int nIndex = 0; nIndex < nCount; nIndex++ )
  3170. }
  3171. CExtPaintManager::stat_PassPaintMessages();
  3172. }
  3173. void CExtDynDockMarkerWnd::CreateOuterMarkers(
  3174. CFrameWnd * pFrame,
  3175. bool bShow, // = true
  3176. CExtPaintManager * pPM // = NULL
  3177. )
  3178. {
  3179. ASSERT_VALID( pFrame );
  3180. ASSERT_KINDOF( CFrameWnd, pFrame );
  3181. AFX_SIZEPARENTPARAMS layout;
  3182. layout.bStretch = FALSE;
  3183. layout.sizeTotal.cx = layout.sizeTotal.cy = 0;
  3184. pFrame->GetClientRect(
  3185. &layout.rect
  3186. );
  3187. layout.hDWP = NULL;
  3188. //HWND hWndLeftOver = NULL;
  3189. for( HWND hWndChild = ::GetTopWindow( pFrame->m_hWnd );
  3190. hWndChild != NULL;
  3191. hWndChild = ::GetWindow( hWndChild, GW_HWNDNEXT )
  3192. )
  3193. {
  3194. UINT nIDC = _AfxGetDlgCtrlID(hWndChild);
  3195. if( nIDC == AFX_IDW_PANE_FIRST )
  3196. {
  3197. //hWndLeftOver = hWndChild;
  3198. continue;
  3199. }
  3200. CWnd * pWnd =
  3201. CWnd::FromHandlePermanent( hWndChild );
  3202. if( pWnd != NULL )
  3203. {
  3204. CExtDockBar * pExtDockBar =
  3205. DYNAMIC_DOWNCAST(
  3206. CExtDockBar,
  3207. pWnd
  3208. );
  3209. if( pExtDockBar != NULL )
  3210. {
  3211. UINT nCircleNo = pExtDockBar->_GetCircleNo();
  3212. if( nCircleNo >= 1 )
  3213. break;
  3214. } // if( pExtDockBar != NULL )
  3215. CExtControlBar::QUERY_REPOSITION_CALC_EFFECT_DATA _qrced(
  3216. (SHORT)reposQuery,
  3217. pFrame,
  3218. 0,
  3219. 0x0FFFF,
  3220. AFX_IDW_PANE_FIRST,
  3221. &layout.rect,
  3222. &layout.rect,
  3223. false
  3224. );
  3225. pWnd->SendMessage(
  3226. CExtControlBar::g_nMsgQueryRepositionCalcEffect,
  3227. _qrced,
  3228. 0L
  3229. );
  3230. if( _qrced.ExcludeFromCenterGet() )
  3231. {
  3232. ASSERT( _qrced.IsQueryReposQuery() );
  3233. continue;
  3234. }
  3235. } // if( pWnd != NULL )
  3236. ::SendMessage(
  3237. hWndChild,
  3238. WM_SIZEPARENT,
  3239. 0,
  3240. (LPARAM)&layout
  3241. );
  3242. }
  3243. if( pPM == NULL )
  3244. pPM = g_PaintManager.GetPM();
  3245. CRect rcScreen( layout.rect );
  3246. pFrame->ClientToScreen( &rcScreen );
  3247. VERIFY(
  3248. pPM->DockMarker_CreateWnds(
  3249. NULL, //hWndLeftOver
  3250. CExtPaintManager::__EDMT_2005_GROUP_SPARSED,
  3251. rcScreen,
  3252. g_arrDockMarkerWndsOuter,
  3253. ( INT(CExtControlBar::g_eResizablePanelDockingType) < 0 )
  3254. ? ( ( pPM == NULL ) ? g_PaintManager->GetThemeDockingType() : pPM->GetThemeDockingType() )
  3255. : INT(CExtControlBar::g_eResizablePanelDockingType)
  3256. ,
  3257. NULL
  3258. )
  3259. );
  3260. ShowMarkers(
  3261. g_arrDockMarkerWndsOuter,
  3262. bShow,
  3263. false
  3264. );
  3265. }
  3266. //void CExtDynDockMarkerWnd::CreateInnerMarkers(
  3267. // CFrameWnd * pFrame,
  3268. // bool bShow // = true
  3269. // )
  3270. //{
  3271. // ASSERT_VALID( pFrame );
  3272. // ASSERT_KINDOF( CFrameWnd, pFrame );
  3273. //CRect rcScreen;
  3274. // pFrame->GetClientRect( &rcScreen );
  3275. // CExtControlBar::RepositionBarsEx(
  3276. // pFrame,
  3277. // 0,
  3278. // 0x0FFFF,
  3279. // AFX_IDW_PANE_FIRST,
  3280. // CWnd::reposQuery,
  3281. // rcScreen,
  3282. // rcScreen
  3283. // );
  3284. // pFrame->ClientToScreen( &rcScreen );
  3285. // VERIFY(
  3286. // PmBridge_GetPM()->DockMarker_CreateWnds(
  3287. // CExtPaintManager::__EDMT_2005_GROUP_SPARSED,
  3288. // rcScreen,
  3289. // g_arrDockMarkerWndsInner,
  3290. // NULL
  3291. // )
  3292. // );
  3293. // ShowMarkers(
  3294. // g_arrDockMarkerWndsInner,
  3295. // bShow
  3296. // );
  3297. //}
  3298. CExtDynDockMarkerWnd * CExtDynDockMarkerWnd::stat_FindMarker(
  3299. HWND hWndMarkerTarget,
  3300. int eMarkerType,
  3301. bool bSparsedMode
  3302. )
  3303. {
  3304. CTypedPtrArray < CPtrArray, CExtDynDockMarkerWnd * > & _arr =
  3305. bSparsedMode
  3306. ? CExtDynDockMarkerWnd::g_arrDockMarkerWndsOuter
  3307. : CExtDynDockMarkerWnd::g_arrDockMarkerWndsInner
  3308. ;
  3309. int nIndex, nCount = (int)_arr.GetSize();
  3310. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  3311. {
  3312. CExtDynDockMarkerWnd * pDynDockMarkerWnd =
  3313. _arr[ nIndex ];
  3314. ASSERT_VALID( pDynDockMarkerWnd );
  3315. if( pDynDockMarkerWnd->m_eMarkerType == eMarkerType
  3316. && ( ( bSparsedMode && pDynDockMarkerWnd->m_bSparsedMode )
  3317. || ( (!bSparsedMode) && (!pDynDockMarkerWnd->m_bSparsedMode) )
  3318. )
  3319. )
  3320. {
  3321. if( hWndMarkerTarget != NULL )
  3322. {
  3323. if( hWndMarkerTarget != pDynDockMarkerWnd->m_hWndMarkerTarget )
  3324. continue;
  3325. }
  3326. return pDynDockMarkerWnd;
  3327. }
  3328. } // for( nIndex = 0; nIndex < nCount; nIndex ++ )
  3329. return NULL;
  3330. }
  3331. HWND CExtDynDockMarkerWnd::stat_AnalyzeDynBar(
  3332. CExtDynControlBar * pDynBar,
  3333. CPoint ptCursor
  3334. )
  3335. {
  3336. ASSERT_VALID( pDynBar );
  3337. ASSERT_KINDOF( CExtDynControlBar, pDynBar );
  3338. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3339. ASSERT( ! pDynBar->IsKindOf( RUNTIME_CLASS(CExtDynTabControlBar) ) );
  3340. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3341. ASSERT( pDynBar->GetSafeHwnd() != NULL );
  3342. CExtDockDynBar * pWndDynDocker = pDynBar->m_pWndDynDocker;
  3343. ASSERT_VALID( pWndDynDocker );
  3344. ASSERT_KINDOF( CExtDockDynBar, pWndDynDocker );
  3345. ASSERT( pWndDynDocker->GetSafeHwnd() != NULL );
  3346. CExtControlBar * pDraggedBar =
  3347. CExtControlBar::_DraggingGetBar();
  3348. ASSERT_VALID( pDraggedBar );
  3349. ExtControlBarVector_t vBars;
  3350. pWndDynDocker->CalcOrderedVector( vBars );
  3351. int nBarCount = (int)vBars.GetSize();
  3352. for( int nBarIdx = 0; nBarIdx < nBarCount; nBarIdx++ )
  3353. {
  3354. CExtControlBar * pExtBar = vBars[ nBarIdx ];
  3355. ASSERT_VALID( pExtBar );
  3356. ASSERT_KINDOF( CExtControlBar, pExtBar );
  3357. if( pExtBar->IsFixedMode()
  3358. || pExtBar->IsFixedDockStyle()
  3359. )
  3360. continue;
  3361. if( ! pExtBar->IsWindowVisible() )
  3362. continue;
  3363. CRect rcWnd;
  3364. pExtBar->GetWindowRect( &rcWnd );
  3365. if( ! rcWnd.PtInRect(ptCursor) )
  3366. continue;
  3367. HWND hWndDynamicTarget = pExtBar->GetSafeHwnd();
  3368. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3369. CExtDynTabControlBar * pDynTabControlBar =
  3370. pExtBar->_GetNearestTabbedContainer();
  3371. if( pDynTabControlBar != NULL )
  3372. hWndDynamicTarget = pDynTabControlBar->GetSafeHwnd();
  3373. else
  3374. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3375. {
  3376. CExtDynControlBar * pDynBar =
  3377. DYNAMIC_DOWNCAST( CExtDynControlBar, pExtBar );
  3378. if( pDynBar != NULL )
  3379. {
  3380. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3381. pDynTabControlBar =
  3382. DYNAMIC_DOWNCAST( CExtDynTabControlBar, pDynBar );
  3383. if( pDynTabControlBar != NULL )
  3384. hWndDynamicTarget = pDynTabControlBar->GetSafeHwnd();
  3385. else
  3386. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3387. {
  3388. hWndDynamicTarget =
  3389. stat_AnalyzeDynBar(
  3390. pDynBar,
  3391. ptCursor
  3392. );
  3393. if( hWndDynamicTarget == NULL )
  3394. continue;
  3395. return hWndDynamicTarget;
  3396. } // else from if( pDynTabControlBar != NULL )
  3397. } // if( pDynBar != NULL )
  3398. }
  3399. return hWndDynamicTarget;
  3400. } // for( int nBarIdx = 0; nBarIdx < nBarCount; nBarIdx++ )
  3401. return NULL;
  3402. }
  3403. void CExtDynDockMarkerWnd::CreateDynamicMarkers(
  3404. CFrameWnd * pFrame,
  3405. bool bShow, // = true
  3406. CExtPaintManager * pPM // = NULL
  3407. )
  3408. {
  3409. ASSERT_VALID( pFrame );
  3410. ASSERT_KINDOF( CFrameWnd, pFrame );
  3411. if( pPM == NULL )
  3412. pPM = g_PaintManager.GetPM();
  3413. bool bInnerAreaFound = false;
  3414. HWND hWndDynamicTarget = NULL;
  3415. CPoint ptCursor;
  3416. if( ::GetCursorPos( &ptCursor ) )
  3417. {
  3418. CExtControlBar * pDraggedBar =
  3419. CExtControlBar::_DraggingGetBar();
  3420. if( pDraggedBar == NULL )
  3421. return;
  3422. bool bFound = false;
  3423. hWndDynamicTarget = ::WindowFromPoint( ptCursor );
  3424. if( hWndDynamicTarget != NULL )
  3425. {
  3426. CWnd * pWnd =
  3427. CWnd::FromHandlePermanent( hWndDynamicTarget );
  3428. if( pWnd != NULL )
  3429. {
  3430. CExtDynDockMarkerWnd * pDynDockMarkerWnd =
  3431. DYNAMIC_DOWNCAST( CExtDynDockMarkerWnd, pWnd );
  3432. if( pDynDockMarkerWnd != NULL )
  3433. return;
  3434. } // if( pWnd != NULL )
  3435. } // if( hWndDynamicTarget != NULL )
  3436. if( ! bFound )
  3437. {
  3438. for( POSITION pos = pFrame->m_listControlBars.GetHeadPosition();
  3439. pos != NULL;
  3440. )
  3441. {
  3442. CControlBar * pBar = (CControlBar *)
  3443. pFrame->m_listControlBars.GetNext( pos );
  3444. ASSERT_VALID( pBar );
  3445. ASSERT_KINDOF( CControlBar, pBar );
  3446. if( pDraggedBar != NULL
  3447. && LPVOID(pDraggedBar) == LPVOID(pBar)
  3448. )
  3449. continue;
  3450. if( pBar->IsDockBar() )
  3451. continue;
  3452. CExtControlBar * pExtBar =
  3453. DYNAMIC_DOWNCAST( CExtControlBar, pBar );
  3454. if( pExtBar == NULL )
  3455. continue;
  3456. if( pExtBar->IsFixedMode()
  3457. || pExtBar->IsFixedDockStyle()
  3458. )
  3459. continue;
  3460. //DWORD dwStyle = pBar->GetStyle();
  3461. //if( (dwStyle&WS_VISIBLE) == 0 )
  3462. // continue;
  3463. if( ! pBar->IsWindowVisible() )
  3464. continue;
  3465. CFrameWnd * pParentFrame =
  3466. pBar->GetParentFrame();
  3467. if( pParentFrame == pFrame )
  3468. continue;
  3469. if( ! pParentFrame->IsKindOf(RUNTIME_CLASS(CExtMiniDockFrameWnd)) )
  3470. continue;
  3471. DWORD dwParentFrameStyle = pParentFrame->GetStyle();
  3472. if( (dwParentFrameStyle&WS_VISIBLE) == 0 )
  3473. continue;
  3474. if( pDraggedBar != NULL
  3475. && pDraggedBar->GetParentFrame() == pParentFrame
  3476. )
  3477. continue;
  3478. CRect rcWnd;
  3479. pParentFrame->GetWindowRect( &rcWnd );
  3480. if( ! rcWnd.PtInRect(ptCursor) )
  3481. continue;
  3482. pExtBar->GetWindowRect( &rcWnd );
  3483. if( ! rcWnd.PtInRect(ptCursor) )
  3484. continue;
  3485. hWndDynamicTarget = pExtBar->GetSafeHwnd();
  3486. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3487. CExtDynTabControlBar * pDynTabControlBar =
  3488. pExtBar->_GetNearestTabbedContainer();
  3489. if( pDynTabControlBar != NULL )
  3490. hWndDynamicTarget = pDynTabControlBar->GetSafeHwnd();
  3491. else
  3492. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3493. {
  3494. CExtDynControlBar * pDynBar =
  3495. DYNAMIC_DOWNCAST( CExtDynControlBar, pExtBar );
  3496. if( pDynBar != NULL )
  3497. {
  3498. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3499. pDynTabControlBar =
  3500. DYNAMIC_DOWNCAST( CExtDynTabControlBar, pDynBar );
  3501. if( pDynTabControlBar != NULL )
  3502. hWndDynamicTarget = pDynTabControlBar->GetSafeHwnd();
  3503. else
  3504. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3505. {
  3506. hWndDynamicTarget =
  3507. stat_AnalyzeDynBar(
  3508. pDynBar,
  3509. ptCursor
  3510. );
  3511. if( hWndDynamicTarget == NULL )
  3512. continue;
  3513. bFound = true;
  3514. break;
  3515. } // else from if( pDynTabControlBar != NULL )
  3516. } // if( pDynBar != NULL )
  3517. }
  3518. bFound = true;
  3519. break;
  3520. }
  3521. if( ! bFound )
  3522. {
  3523. for( hWndDynamicTarget = ::GetNextWindow( pFrame->GetSafeHwnd(), GW_CHILD );
  3524. hWndDynamicTarget != NULL;
  3525. hWndDynamicTarget = ::GetNextWindow( hWndDynamicTarget, GW_HWNDNEXT )
  3526. )
  3527. {
  3528. //DWORD dwStyle = (DWORD)
  3529. // ::__EXT_MFC_GetWindowLong( hWndDynamicTarget, GWL_STYLE );
  3530. //if( (dwStyle&WS_VISIBLE) == 0 )
  3531. // continue;
  3532. if( ! ::IsWindowVisible( hWndDynamicTarget ) )
  3533. continue;
  3534. CRect rcWnd;
  3535. ::GetWindowRect( hWndDynamicTarget, &rcWnd );
  3536. if( ! rcWnd.PtInRect(ptCursor) )
  3537. continue;
  3538. UINT nDlgCtrlID = (UINT)
  3539. ::GetDlgCtrlID( hWndDynamicTarget );
  3540. if( nDlgCtrlID == AFX_IDW_PANE_FIRST )
  3541. {
  3542. bFound = bInnerAreaFound = true;
  3543. break;
  3544. } // if( nDlgCtrlID == AFX_IDW_PANE_FIRST )
  3545. CWnd * pWnd =
  3546. CWnd::FromHandlePermanent( hWndDynamicTarget );
  3547. if( pWnd == NULL )
  3548. break;
  3549. if( g_hWndLastDynamicTarget == hWndDynamicTarget )
  3550. {
  3551. bFound = true;
  3552. break;
  3553. }
  3554. CExtDockBar * pDockBar =
  3555. DYNAMIC_DOWNCAST( CExtDockBar, pWnd );
  3556. if( pDockBar == NULL )
  3557. break;
  3558. if( pDockBar->_GetCircleNo() < 1 )
  3559. break;
  3560. for( hWndDynamicTarget = ::GetNextWindow( hWndDynamicTarget, GW_CHILD );
  3561. hWndDynamicTarget != NULL;
  3562. hWndDynamicTarget = ::GetNextWindow( hWndDynamicTarget, GW_HWNDNEXT )
  3563. )
  3564. {
  3565. __EXT_MFC_ULONG_PTR dwStyle = ::__EXT_MFC_GetWindowLong( hWndDynamicTarget, GWL_STYLE );
  3566. if( (dwStyle&WS_VISIBLE) == 0 )
  3567. continue;
  3568. CRect rcWnd;
  3569. ::GetWindowRect( hWndDynamicTarget, &rcWnd );
  3570. if( ! rcWnd.PtInRect(ptCursor) )
  3571. continue;
  3572. CWnd * pWnd =
  3573. CWnd::FromHandlePermanent( hWndDynamicTarget );
  3574. if( pWnd == NULL )
  3575. break;
  3576. if( g_hWndLastDynamicTarget == hWndDynamicTarget )
  3577. {
  3578. bFound = true;
  3579. break;
  3580. }
  3581. CExtControlBar * pBar =
  3582. DYNAMIC_DOWNCAST( CExtControlBar, pWnd );
  3583. if( pBar == NULL )
  3584. continue;
  3585. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3586. CExtDynTabControlBar * pDynTabControlBar =
  3587. pBar->_GetNearestTabbedContainer();
  3588. if( pDynTabControlBar != NULL )
  3589. hWndDynamicTarget = pDynTabControlBar->GetSafeHwnd();
  3590. else
  3591. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3592. {
  3593. CExtDynControlBar * pDynBar =
  3594. DYNAMIC_DOWNCAST( CExtDynControlBar, pBar );
  3595. if( pDynBar != NULL )
  3596. {
  3597. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3598. pDynTabControlBar =
  3599. DYNAMIC_DOWNCAST( CExtDynTabControlBar, pDynBar );
  3600. if( pDynTabControlBar != NULL )
  3601. hWndDynamicTarget = pDynTabControlBar->GetSafeHwnd();
  3602. else
  3603. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3604. {
  3605. hWndDynamicTarget =
  3606. stat_AnalyzeDynBar(
  3607. pDynBar,
  3608. ptCursor
  3609. );
  3610. if( hWndDynamicTarget == NULL )
  3611. continue;
  3612. bFound = true;
  3613. break;
  3614. } // else from if( pDynTabControlBar != NULL )
  3615. } // if( pDynBar != NULL )
  3616. }
  3617. bFound = true;
  3618. break;
  3619. }
  3620. break;
  3621. }
  3622. } // if( ! bFound )
  3623. } // if( ! bFound )
  3624. if( ! bFound )
  3625. hWndDynamicTarget = NULL;
  3626. } // if( ::GetCursorPos( &ptCursor ) )
  3627. if( g_hWndLastDynamicTarget != NULL
  3628. && (! ::IsWindow(g_hWndLastDynamicTarget) )
  3629. )
  3630. g_hWndLastDynamicTarget = NULL;
  3631. if( g_hWndLastDynamicTarget == hWndDynamicTarget )
  3632. {
  3633. if( g_hWndLastDynamicTarget == NULL )
  3634. DestroyMarkers( g_arrDockMarkerWndsInner, true );
  3635. return;
  3636. }
  3637. DestroyMarkers( g_arrDockMarkerWndsInner, true );
  3638. if( hWndDynamicTarget != NULL )
  3639. {
  3640. CWnd * pWndPermanent = CWnd::FromHandlePermanent( hWndDynamicTarget );
  3641. if( pWndPermanent != NULL
  3642. && pWndPermanent->IsKindOf( RUNTIME_CLASS(CExtControlBar) )
  3643. && (!( ((CExtControlBar*)pWndPermanent)->IsFixedDockStyle()
  3644. || ((CExtControlBar*)pWndPermanent)->IsFixedMode()
  3645. ))
  3646. )
  3647. {
  3648. CExtControlBar * pBarDst = (CExtControlBar*)
  3649. pWndPermanent;
  3650. CExtControlBar * pBarSrc =
  3651. CExtControlBar::_DraggingGetBar();
  3652. ASSERT_VALID( pBarSrc );
  3653. if( (! pBarSrc->_CanDockToTabbedContainers(pBarDst) )
  3654. || (! pBarDst->_CanDockToTabbedContainers(pBarSrc) )
  3655. )
  3656. {
  3657. if( (! pBarSrc->_CanDockLTRB(pBarDst) )
  3658. || (! pBarDst->_CanDockLTRB(pBarSrc) )
  3659. )
  3660. {
  3661. g_hWndLastDynamicTarget = NULL;
  3662. return;
  3663. }
  3664. bInnerAreaFound = false;
  3665. }
  3666. }
  3667. } // if( hWndDynamicTarget != NULL )
  3668. g_hWndLastDynamicTarget = hWndDynamicTarget;
  3669. if( g_hWndLastDynamicTarget != NULL )
  3670. {
  3671. CRect rcScreen;
  3672. ::GetWindowRect( g_hWndLastDynamicTarget, &rcScreen );
  3673. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS )
  3674. VERIFY(
  3675. pPM->DockMarker_CreateWnds(
  3676. g_hWndLastDynamicTarget,
  3677. bInnerAreaFound
  3678. ? CExtPaintManager::__EDMT_2005_GROUP_CENTRAL
  3679. : CExtPaintManager::__EDMT_2005_GROUP_TAB
  3680. ,
  3681. rcScreen,
  3682. g_arrDockMarkerWndsInner,
  3683. ( INT(CExtControlBar::g_eResizablePanelDockingType) < 0 )
  3684. ? ( ( pPM == NULL ) ? g_PaintManager->GetThemeDockingType() : pPM->GetThemeDockingType() )
  3685. : INT(CExtControlBar::g_eResizablePanelDockingType)
  3686. ,
  3687. NULL
  3688. )
  3689. );
  3690. #else // (!defined __EXT_MFC_NO_TAB_CONTROLBARS )
  3691. VERIFY(
  3692. pPM->DockMarker_CreateWnds(
  3693. g_hWndLastDynamicTarget,
  3694. CExtPaintManager::__EDMT_2005_GROUP_CENTRAL,
  3695. rcScreen,
  3696. g_arrDockMarkerWndsInner,
  3697. ( INT(CExtControlBar::g_eResizablePanelDockingType) < 0 )
  3698. ? ( ( pPM == NULL ) ? g_PaintManager->GetThemeDockingType() : pPM->GetThemeDockingType() )
  3699. : INT(CExtControlBar::g_eResizablePanelDockingType)
  3700. ,
  3701. NULL
  3702. )
  3703. );
  3704. #endif // else from (!defined __EXT_MFC_NO_TAB_CONTROLBARS )
  3705. ShowMarkers(
  3706. g_arrDockMarkerWndsInner,
  3707. bShow,
  3708. true
  3709. );
  3710. } // if( g_hWndLastDynamicTarget != NULL )
  3711. }
  3712. bool CExtDynDockMarkerWnd::g_bDockMarkerClassRegistered = false;
  3713. bool CExtDynDockMarkerWnd::RegisterDockMarkerClass()
  3714. {
  3715. if( g_bDockMarkerClassRegistered )
  3716. return true;
  3717. WNDCLASS _wndClassInfo;
  3718. HINSTANCE hInst = ::AfxGetInstanceHandle();
  3719. if( ! ::GetClassInfo( hInst, __EXT_DYNDOCKMARKER_CLASS_NAME, &_wndClassInfo ) )
  3720. {
  3721. _wndClassInfo.style = CS_GLOBALCLASS; //|CS_DBLCLKS;
  3722. _wndClassInfo.lpfnWndProc = ::DefWindowProc;
  3723. _wndClassInfo.cbClsExtra = _wndClassInfo.cbWndExtra = 0;
  3724. _wndClassInfo.hInstance = hInst;
  3725. _wndClassInfo.hIcon = NULL;
  3726. _wndClassInfo.hCursor = ::LoadCursor( NULL, IDC_ARROW );
  3727. ASSERT( _wndClassInfo.hCursor != NULL );
  3728. _wndClassInfo.hbrBackground = NULL; 
  3729. _wndClassInfo.lpszMenuName = NULL;
  3730. _wndClassInfo.lpszClassName = __EXT_DYNDOCKMARKER_CLASS_NAME;
  3731. if( !::AfxRegisterClass( &_wndClassInfo ) )
  3732. {
  3733. ASSERT( FALSE );
  3734. //AfxThrowResourceException();
  3735. return false;
  3736. }
  3737. }
  3738. g_bDockMarkerClassRegistered = true;
  3739. return true;
  3740. }
  3741. BOOL CExtDynDockMarkerWnd::PreCreateWindow( CREATESTRUCT & cs ) 
  3742. {
  3743. if( ( !RegisterDockMarkerClass() )
  3744. || ( ! CWnd::PreCreateWindow(cs) )
  3745. )
  3746. {
  3747. ASSERT( FALSE );
  3748. return FALSE;
  3749. }
  3750. cs.lpszClass = __EXT_DYNDOCKMARKER_CLASS_NAME;
  3751. return TRUE;
  3752. }
  3753. void CExtDynDockMarkerWnd::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp) 
  3754. {
  3755. // CWnd::OnNcCalcSize(bCalcValidRects, lpncsp);
  3756. bCalcValidRects;
  3757. lpncsp;
  3758. }
  3759. int CExtDynDockMarkerWnd::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message) 
  3760. {
  3761. // return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);
  3762. pDesktopWnd;
  3763. nHitTest;
  3764. message;
  3765. return MA_NOACTIVATEANDEAT;
  3766. }
  3767. void CExtDynDockMarkerWnd::_RenderImpl( CDC * pDC )
  3768. {
  3769. ASSERT_VALID( this );
  3770. ASSERT( pDC != NULL );
  3771. ASSERT( pDC->GetSafeHdc() != NULL );
  3772. CRect rcClient;
  3773. GetClientRect( &rcClient );
  3774. // CDC dcMemory;
  3775. //  if( dcMemory.CreateCompatibleDC( pDC ) )
  3776. //  {
  3777. if( ! m_bmpOuterBk.IsEmpty() )
  3778. {
  3779. //  CBitmap * pOldBmp =
  3780. //  dcMemory.SelectObject( &m_bmpOuterBk );
  3781. //  pDC->BitBlt(
  3782. //  rcClient.left,
  3783. //  rcClient.top,
  3784. //  rcClient.Width(),
  3785. //  rcClient.Height(),
  3786. //  &dcMemory,
  3787. //  0,
  3788. //  0,
  3789. //  SRCCOPY
  3790. //  );
  3791. //  dcMemory.SelectObject( pOldBmp );
  3792. m_bmpOuterBk.AlphaBlend(
  3793. pDC->GetSafeHdc(),
  3794. rcClient
  3795. );
  3796. }
  3797. CExtBitmap * pBmpInner =
  3798. (m_eMTS == __EMTS_HOVER)
  3799. ? (&m_bmpIn)
  3800. : (&m_bmpOut)
  3801. ;
  3802. CSize _size = pBmpInner->GetSize();
  3803. ASSERT( _size.cx > 0 && _size.cy > 0 );
  3804. //  CBitmap * pOldBmp =
  3805. //  dcMemory.SelectObject( pBmpInner );
  3806. //  pDC->BitBlt(
  3807. //  rcClient.left + m_ptOffsetInner.x,
  3808. //  rcClient.top + m_ptOffsetInner.y,
  3809. //  bmpDescription.bmWidth,
  3810. //  bmpDescription.bmHeight,
  3811. //  &dcMemory,
  3812. //  0,
  3813. //  0,
  3814. //  SRCCOPY
  3815. //  );
  3816. //  dcMemory.SelectObject( pOldBmp );
  3817. pBmpInner->AlphaBlend(
  3818. pDC->GetSafeHdc(),
  3819. rcClient.left + m_ptOffsetInner.x,
  3820. rcClient.top + m_ptOffsetInner.y,
  3821. _size.cx,
  3822. _size.cy
  3823. );
  3824. PmBridge_GetPM()->DockMarker_PostRender(
  3825. *pDC,
  3826. rcClient,
  3827. (CExtPaintManager::eDockMarkerType_t)m_eMarkerType,
  3828. ( m_eMTS == __EMTS_HOVER ) ? true : false,
  3829. (CObject *)this
  3830. );
  3831. //  } // if( dcMemory.CreateCompatibleDC( &dcPaint ) )
  3832. // #ifdef _DEBUG
  3833. //  else
  3834. //  {
  3835. //  ASSERT( FALSE );
  3836. //  } // else from if( dcMemory.CreateCompatibleDC( &dcPaint ) )
  3837. // #endif // _DEBUG
  3838. }
  3839. LRESULT CExtDynDockMarkerWnd::OnPrintClient( WPARAM wParam, LPARAM lParam )
  3840. {
  3841. lParam;
  3842. LRESULT lResult = Default();
  3843. CDC * pDC = CDC::FromHandle( (HDC)wParam );
  3844. _RenderImpl( pDC );
  3845.     return lResult;
  3846. }
  3847. void CExtDynDockMarkerWnd::OnPaint() 
  3848. {
  3849. CPaintDC dcPaint( this );
  3850. _RenderImpl( &dcPaint );
  3851. }
  3852. void CExtDynDockMarkerWnd::OnTimer(__EXT_MFC_UINT_PTR nIDEvent) 
  3853. {
  3854. if( nIDEvent == __DYNDOCKMARKER_TIMER_ID_ANIMATE  )
  3855. {
  3856. if( (m_nOpaquePercent <= 0 && !m_bAnimationShow)
  3857. || (m_nOpaquePercent >= 100 && m_bAnimationShow)
  3858. )
  3859. {
  3860. AnimationStop();
  3861. return;
  3862. }
  3863. m_nOpaquePercent += 
  3864. m_bAnimationShow 
  3865. ? + __DYNDOCKMARKER_ANIMATION_PERCENT_STEP
  3866. : - __DYNDOCKMARKER_ANIMATION_PERCENT_STEP;
  3867. if( g_PaintManager.m_bIsWin2000orLater 
  3868. && g_PaintManager.m_pfnSetLayeredWindowAttributes != NULL
  3869. && CExtPaintManager::stat_GetBPP() > 8
  3870. )
  3871. {
  3872. g_PaintManager.m_pfnSetLayeredWindowAttributes(
  3873. GetSafeHwnd(), 
  3874. 0, 
  3875. BYTE((g_PaintManager->DockMarker_GetAlpha( false, this ) * m_nOpaquePercent) / 100), 
  3876. __EXT_MFC_LWA_ALPHA
  3877. );
  3878. ::RedrawWindow(
  3879. GetSafeHwnd(), 
  3880. NULL, 
  3881. NULL, 
  3882. RDW_INVALIDATE | RDW_UPDATENOW
  3883. );
  3884. }
  3885. return;
  3886. } // if( nIDEvent == __DYNDOCKMARKER_TIMER_ID_ANIMATE  )
  3887. else if( nIDEvent == __DYNDOCKMARKER_TIMER_ID_TEMP  )
  3888. {
  3889. if( (GetStyle()&WS_VISIBLE) == 0 )
  3890. return;
  3891. if( m_hWndMarkerTarget != NULL )
  3892. {