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

界面编程

开发平台:

Visual C++

  1. return rc;
  2. }
  3. CRect CExtMenuControlBar::_GetMainFrameSysIconRect()
  4. {
  5. CRect rc;
  6. CRect rcWnd,rcClient,rcHelper;
  7. CFrameWnd * pFrame =
  8. _GetDockingFrameImpl();
  9. ASSERT_VALID( pFrame );
  10. pFrame->GetWindowRect( &rcWnd );
  11. pFrame->GetClientRect( &rcClient );
  12. rcHelper = rcWnd;
  13. pFrame->ScreenToClient( &rcHelper );
  14. ASSERT( rcHelper.top <= rcClient.top );
  15. int yDiff = rcClient.top - rcHelper.top;
  16. rc.SetRect(
  17. rcWnd.left + GetSystemMetrics(SM_CYFRAME),
  18. rcWnd.top + GetSystemMetrics(SM_CXFRAME),
  19. rcWnd.left + yDiff,
  20. rcWnd.top + yDiff
  21. );
  22. return rc;
  23. }
  24. BOOL CExtMenuControlBar::_TrackFrameSystemMenu(
  25. CWnd * pFrame,
  26. CPoint * pPoint, // = NULL, // NULL means calc menu track area automatically
  27. BOOL bSelectAny, // = FALSE
  28. LPCRECT rcExcludeArea, // = NULL
  29. UINT nTrackFlags, // = (UINT)(-1)
  30. BOOL bCombinedMode // = FALSE
  31. )
  32. {
  33. _CancelFlatTracking();
  34. /// if( nTrackFlags == (UINT)(-1) )
  35. /// nTrackFlags = TPMX_BOTTOMALIGN;
  36. ASSERT_VALID( pFrame );
  37. bool bPrevTBMT = CExtToolControlBar::g_bMenuTracking;
  38. int nTrackingIdxOld = m_nBtnIdxMenuTracking;
  39. // if( g_bMenuTracking )
  40. CExtToolControlBar::_CloseTrackingMenus();
  41. // if( CExtPopupMenuWnd::IsMenuTracking() )
  42. // CExtPopupMenuWnd::CancelMenuTracking();
  43. CMenu * pSysMenu = pFrame->GetSystemMenu( FALSE );
  44. if( pSysMenu == NULL )
  45. return FALSE;
  46. ASSERT( ::IsMenu(pSysMenu->GetSafeHmenu()) );
  47. CExtPopupMenuWnd * pPopup =
  48. CExtPopupMenuWnd::InstantiatePopupMenu(
  49. GetSafeHwnd(),
  50. RUNTIME_CLASS(CExtPopupMenuWnd),
  51. this
  52. );
  53. if( ! pPopup->CreatePopupMenu(
  54. pFrame->GetSafeHwnd()
  55. )
  56. )
  57. {
  58. ASSERT( FALSE );
  59. return FALSE;
  60. }
  61. if( ! pPopup->UpdateFromMenu(
  62. pFrame->GetSafeHwnd(),
  63. pSysMenu,
  64. false,
  65. true,
  66. true
  67. )
  68. )
  69. {
  70. ASSERT( FALSE );
  71. return FALSE;
  72. }
  73. __EXT_MFC_LONG_PTR dwExStyle = ::__EXT_MFC_GetWindowLong( pFrame->GetSafeHwnd(), GWL_EXSTYLE );
  74. bool bRTL = ( (dwExStyle & WS_EX_LAYOUTRTL) != 0 ) ? true : false;
  75. CPoint point;
  76. if( pPoint != NULL)
  77. point = *pPoint;
  78. else
  79. {
  80. CRect rcWnd,rcClient,rcHelper;
  81. pFrame->GetWindowRect( &rcWnd );
  82. pFrame->GetClientRect( &rcClient );
  83. rcHelper = rcWnd;
  84. pFrame->ScreenToClient( &rcHelper );
  85. //ASSERT( rcHelper.top <= rcClient.top );
  86. int yDiff = rcClient.top - rcHelper.top;
  87. int n = 0;
  88. WINDOWPLACEMENT _wp;
  89. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  90. _wp.length = sizeof(WINDOWPLACEMENT);
  91. VERIFY(
  92. ::GetWindowPlacement(
  93. GetSafeHwnd(),
  94. &_wp
  95. )
  96. );
  97. if( _wp.showCmd != SW_SHOWMAXIMIZED ) 
  98. n = ::GetSystemMetrics( SM_CXFRAME );
  99. point = rcWnd.TopLeft();
  100. if( bRTL )
  101. {
  102. point = CPoint( rcWnd.right, rcWnd.top );
  103. n = -n;
  104. }
  105. point.x += n;
  106. point.y += yDiff;
  107. }
  108. if( nTrackFlags == (UINT)(-1) )
  109. nTrackFlags = 0;
  110. if( (nTrackFlags & TPMX_ALIGN_MASK ) == 0 )
  111. nTrackFlags = bRTL ? TPMX_RIGHTALIGN : TPMX_TOPALIGN;
  112. if( bSelectAny )
  113. nTrackFlags |= TPMX_SELECT_ANY;
  114. if( bPrevTBMT )
  115. nTrackFlags |= TPMX_NO_HIDE_RARELY;
  116. pFrame->SetFocus();
  117. CExtToolControlBar::g_bMenuTracking =
  118. bSelectAny ? bPrevTBMT : false; // (+ v.2.23)
  119. if( nTrackingIdxOld >= 0 )
  120. _SwitchMenuTrackingIndex( nTrackingIdxOld );
  121. CWnd * pWndNotify = m_pDockSite;
  122. if( pWndNotify == NULL )
  123. pWndNotify = GetParent();
  124. if( pWndNotify != NULL )
  125. pWndNotify->SendMessage(
  126. g_nMsgPrepareSystemMenu,
  127. WPARAM(pPopup),
  128. LPARAM(pFrame)
  129. );
  130. if( bRTL && !bCombinedMode )
  131. point.x += pPopup->OnQueryMenuShadowSize();
  132. CRect rcExclude( rcExcludeArea );
  133. if( rcExcludeArea == NULL )
  134. rcExclude.SetRect( point, point );
  135. pPopup->m_hWndNotifyMenuClosed = GetSafeHwnd();
  136. if( ! pPopup->TrackPopupMenu(
  137. nTrackFlags 
  138. | ( bCombinedMode ? TPMX_COMBINE_DEFAULT : 0) 
  139. | TPMX_OWNERDRAW_FIXED
  140. | TPMX_SYSMENU,
  141. point.x,point.y,
  142. rcExclude,
  143. bCombinedMode ?
  144. this : NULL,
  145. bCombinedMode ?
  146. CExtToolControlBar::_CbPaintCombinedContent : NULL,
  147. NULL,
  148. bCombinedMode ? true : false
  149. )
  150. )
  151. {
  152. //delete pPopup;
  153. CExtToolControlBar::_CloseTrackingMenus();
  154. return FALSE;
  155. }
  156. g_bMenuTracking = true;
  157. return TRUE;
  158. }
  159. BOOL CExtMenuControlBar::TrackChildFrameSystemMenu(
  160. CPoint * pPoint, // = NULL, // NULL means calc any track area automatically
  161. BOOL bSelectAny // = FALSE
  162. )
  163. {
  164. if( ! m_bAllowProfChildFrameSysmenu )
  165. return FALSE;
  166. if( ! _IsMdiApp() )
  167. {
  168. ASSERT( FALSE );
  169. return FALSE;
  170. } // if( ! _IsMdiApp() )
  171. if( GetButtonsCount() > 0 )
  172. {
  173. CExtBarButton * pTBB = _GetButtonPtr( 0 );
  174. ASSERT_VALID( pTBB );
  175. if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) )
  176. {
  177. if( ! CExtPopupMenuWnd::IsMenuTracking() )
  178. {
  179. HWND hWndFocus = ::GetFocus();
  180. if( hWndFocus != NULL )
  181. ::SendMessage( hWndFocus, WM_CANCELMODE, 0L, 0L );
  182. } // if( ! CExtPopupMenuWnd::IsMenuTracking() )
  183. if( ! TrackButtonMenu( 0 ) )
  184. {
  185. ASSERT( FALSE );
  186. return FALSE;
  187. } // if( ! TrackButtonMenu( 0 ) )
  188. return TRUE;
  189. } // if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) )
  190. } // if( GetButtonsCount() > 0 )
  191. BOOL bMax = FALSE;
  192. HWND hWndActiveChild = _GetActiveMdiChildWnd( bMax );
  193. if( hWndActiveChild == NULL )
  194. return FALSE;
  195. ASSERT( ::IsWindow(hWndActiveChild) );
  196. CWnd * pWnd = CWnd::FromHandlePermanent(hWndActiveChild);
  197. if( pWnd == NULL )
  198. {
  199. ASSERT( FALSE );
  200. return FALSE;
  201. }
  202. ASSERT_VALID( pWnd );
  203. // FrameFeatures does not use CMDIChildWnd
  204. // ASSERT( pWnd->IsKindOf(RUNTIME_CLASS(CMDIChildWnd)) );
  205. //CFrameWnd * pFrame = 
  206. // DYNAMIC_DOWNCAST(
  207. // CFrameWnd,
  208. // pWnd
  209. // );
  210. // ASSERT( pFrame != NULL );
  211. // if( pFrame == NULL )
  212. // {
  213. // ASSERT( FALSE );
  214. // return FALSE;
  215. // }
  216. // ASSERT_VALID( pFrame );
  217. g_bMenuTracking = true;
  218. _SwitchMenuTrackingIndex();
  219. m_bSysMenuTracking =
  220. _TrackFrameSystemMenu(
  221. pWnd,
  222. pPoint,
  223. bSelectAny
  224. ) ? true : false;
  225. return m_bSysMenuTracking ? TRUE : FALSE;
  226. }
  227. BOOL CExtMenuControlBar::TrackMainFrameSystemMenu(
  228. CPoint * pPoint, // = NULL // NULL means calc menu track area automatically
  229. BOOL bSelectAny // = FALSE
  230. )
  231. {
  232. if( ! m_bAllowProfMainFrameSysmenu )
  233. return FALSE;
  234. CFrameWnd * pFrame = _GetDockingFrameImpl();
  235. ASSERT_VALID( pFrame );
  236. CWnd * pWndForPlacement = stat_GetWndForPlacement( pFrame );
  237. // if( pWndForPlacement->m_hWnd != pFrame->m_hWnd )
  238. // return FALSE;
  239. g_bMenuTracking = true;
  240. _SwitchMenuTrackingIndex();
  241. m_bSysMenuTracking =
  242. _TrackFrameSystemMenu(
  243. pWndForPlacement, // pFrame
  244. pPoint,
  245. bSelectAny
  246. ) ? true : false;
  247. return m_bSysMenuTracking ? TRUE : FALSE;
  248. }
  249. BOOL CExtMenuControlBar::TrackButtonMenu(
  250. int nIndex,
  251. BOOL bSelectAny, // = FALSE
  252. BOOL bDelayedTracking, // = FALSE
  253. BOOL bNoAnimation // = FALSE
  254. )
  255. {
  256. bSelectAny;
  257. bDelayedTracking;
  258. if( g_bMenuTracking
  259. && m_nBtnIdxMenuTracking == nIndex
  260. )
  261. return TRUE;
  262. if( ! SafeDisplayBar() )
  263. return FALSE;
  264. _CancelFlatTracking();
  265. if( m_bMenuBarUsesDelayedButtonMenuTracking )
  266. PostMessage(
  267. g_nMsgTrackButtonMenu,
  268. (WPARAM)nIndex,
  269. (LPARAM)bNoAnimation
  270. );
  271. else
  272. SendMessage(
  273. g_nMsgTrackButtonMenu,
  274. (WPARAM)nIndex,
  275. (LPARAM)bNoAnimation
  276. );
  277. return TRUE;
  278. }
  279. LRESULT CExtMenuControlBar::OnTrackButtonMenu(WPARAM wParam,LPARAM lParam)
  280. {
  281. if( !( ::IsWindowEnabled(
  282. m_bPresubclassDialogMode
  283. ? GetOwner()->GetSafeHwnd()
  284. : _GetDockingFrameImpl()->GetSafeHwnd()
  285. )
  286. )
  287. return 0;
  288. int nCountOfButtons = GetButtonsCount();
  289. ASSERT( nCountOfButtons >= 0 );
  290. if( nCountOfButtons == 0 )
  291. return 0;
  292. int nIndex = int(wParam);
  293. if( nIndex < 0 || nIndex>=nCountOfButtons )
  294. {
  295. _CancelFlatTracking();
  296. _CloseTrackingMenus();
  297. return 0;
  298. }
  299. CExtBarButton * pTBB = _GetButtonPtr(nIndex);
  300. ASSERT_VALID( pTBB );
  301. BOOL bDroppedMode =
  302. CExtPopupMenuWnd::IsMenuTracking();
  303. if( !pTBB->IsAbleToTrackMenu() )
  304. bDroppedMode = FALSE;
  305. if( bDroppedMode )
  306. {
  307. CExtToolControlBar::TrackButtonMenu(
  308. nIndex,
  309. true,
  310. false,
  311. (lParam != 0) ? true : false
  312. );
  313. return 0;
  314. }
  315. _CloseTrackingMenus();
  316. if( CExtMouseCaptureSink::GetCapture() == GetSafeHwnd() )
  317. CExtMouseCaptureSink::ReleaseCapture();
  318. if( ! m_bFlatTracking )
  319. {
  320. HWND hWndFocus = ::GetFocus();
  321. if( hWndFocus != NULL )
  322. ::SendMessage( hWndFocus, WM_CANCELMODE, 0L, 0L );
  323. } // if( ! m_bFlatTracking )
  324. m_nFlatTrackingIndex = nIndex;
  325. if( ! m_bFlatTracking )
  326. {
  327. m_bFlatTracking = true;
  328. HDWP hPassiveModeDWP = NULL;
  329. OnFlatTrackingStart( hPassiveModeDWP );
  330. } // if( ! m_bFlatTracking )
  331. _UpdateFlatTracking();
  332. return 0;
  333. }
  334. int CExtMenuControlBar::_FlatTrackingGet() const
  335. {
  336. ASSERT_VALID( this );
  337. return m_bFlatTracking;
  338. }
  339. void CExtMenuControlBar::_FlatTrackingSet( bool bFlatTracking )
  340. {
  341. ASSERT_VALID( this );
  342. m_bFlatTracking = bFlatTracking;
  343. }
  344. int CExtMenuControlBar::_FlatTrackingIndexGet() const
  345. {
  346. ASSERT_VALID( this );
  347. return m_nFlatTrackingIndex;
  348. }
  349. void CExtMenuControlBar::_FlatTrackingIndexSet( int nFlatTrackingIndex )
  350. {
  351. ASSERT_VALID( this );
  352. m_nFlatTrackingIndex = nFlatTrackingIndex;
  353. }
  354. void CExtMenuControlBar::_CancelFlatTracking(
  355. BOOL bRepaint // = TRUE
  356. )
  357. {
  358. ASSERT_VALID( this );
  359. if( ! m_bFlatTracking )
  360. return;
  361. m_bFlatTracking = false;
  362. OnFlatTrackingStop();
  363. _UpdateFlatTracking( bRepaint );
  364. }
  365. void CExtMenuControlBar::OnFlatTrackingStart(
  366. HDWP & hPassiveModeDWP
  367. )
  368. {
  369. ASSERT_VALID( this );
  370. CExtToolControlBar::OnFlatTrackingStart( hPassiveModeDWP );
  371. }
  372. void CExtMenuControlBar::OnFlatTrackingStop()
  373. {
  374. ASSERT_VALID( this );
  375. CExtToolControlBar::OnFlatTrackingStop();
  376. }
  377. void CExtMenuControlBar::_UpdateFlatTracking(
  378. BOOL bRepaint // = TRUE
  379. )
  380. {
  381. ASSERT_VALID( this );
  382. if( m_nFlatTrackingIndex < 0
  383. && m_nOldTrackingIndex < 0
  384. )
  385. {
  386. if( m_bFlatTracking )
  387. {
  388. m_bFlatTracking = false;
  389. OnFlatTrackingStop();
  390. } // if( m_bFlatTracking )
  391. return;
  392. }
  393. HWND hWndCurrentFocus = ::GetFocus();
  394. if( hWndCurrentFocus != NULL )
  395. {
  396. CWnd * pWndTest = CWnd::FromHandlePermanent( hWndCurrentFocus );
  397. if( pWndTest == NULL )
  398. {
  399. HWND hWnd = ::GetParent( hWndCurrentFocus );
  400. if( hWnd != NULL )
  401. pWndTest = CWnd::FromHandlePermanent( hWnd );
  402. } // if( pWndTest == NULL )
  403. if( pWndTest != NULL )
  404. {
  405. CComboBox * pComboTest =
  406. DYNAMIC_DOWNCAST(
  407. CComboBox,
  408. pWndTest
  409. );
  410. if( pComboTest == NULL )
  411. {
  412. pWndTest = pWndTest->GetParent();
  413. if( pWndTest != NULL )
  414. {
  415. pComboTest =
  416. DYNAMIC_DOWNCAST(
  417. CComboBox,
  418. pWndTest
  419. );
  420. }
  421. } // if( pComboTest == NULL )
  422. if( pComboTest != NULL
  423. && (pComboTest->GetStyle() & (CBS_DROPDOWN|CBS_DROPDOWNLIST)) != 0
  424. && pComboTest->GetDroppedState()
  425. )
  426. pComboTest->ShowDropDown( FALSE );
  427. } // if( pWndTest != NULL )
  428. } // if( hWndCurrentFocus != NULL )
  429. int nCountOfButtons = GetButtonsCount();
  430. if( !m_bFlatTracking )
  431. {
  432. if( m_nFlatTrackingIndex >= 0 )
  433. {
  434. ASSERT( m_nFlatTrackingIndex < nCountOfButtons );
  435. CExtBarButton * pTBB =
  436. _GetButtonPtr(m_nFlatTrackingIndex);
  437. ASSERT_VALID( pTBB );
  438. pTBB->ModifyStyle(0,TBBS_PRESSED);
  439. INT nIndexRepaint = m_nFlatTrackingIndex;
  440. m_nFlatTrackingIndex = m_nOldTrackingIndex = -1;
  441. if( bRepaint )
  442. {
  443. _InvalidateButton( nIndexRepaint );
  444. ///UpdateWindow();
  445. }
  446. }
  447. // if( g_bMenuTracking )
  448. // _CloseTrackingMenus();
  449. return;
  450. } // if( !m_bFlatTracking )
  451. if( m_nFlatTrackingIndex != m_nOldTrackingIndex )
  452. {
  453. if( m_nOldTrackingIndex >= 0 && m_nOldTrackingIndex < nCountOfButtons )
  454. {
  455. CExtBarButton * pTBB =
  456. _GetButtonPtr(m_nOldTrackingIndex);
  457. ASSERT_VALID( pTBB );
  458. pTBB->ModifyStyle(0,TBBS_PRESSED|TBBS_CHECKED);
  459. if( bRepaint )
  460. _InvalidateButton(m_nOldTrackingIndex);
  461. } // if( m_nOldTrackingIndex >= 0 && m_nOldTrackingIndex < nCountOfButtons )
  462. if( m_nFlatTrackingIndex >= 0 )
  463. {
  464. ASSERT( m_nFlatTrackingIndex < nCountOfButtons );
  465. CExtBarButton * pTBB =
  466. _GetButtonPtr(m_nFlatTrackingIndex);
  467. ASSERT_VALID( pTBB );
  468. pTBB->ModifyStyle(TBBS_PRESSED);
  469. if( bRepaint )
  470. _InvalidateButton(m_nFlatTrackingIndex);
  471. }
  472. m_nOldTrackingIndex = m_nFlatTrackingIndex;
  473. AnimationSite_PassAnimationEvents();
  474. ///UpdateWindow();
  475. } // if( m_nFlatTrackingIndex != m_nOldTrackingIndex )
  476. }
  477. void CExtMenuControlBar::_DelaySyncActiveMdiChild()
  478. {
  479. ASSERT_VALID( this );
  480. if( m_bDelayedSyncActiveMdiChild
  481. || m_bDelayedUpdateMenuBar
  482. || m_hWnd == NULL
  483. || (! ::IsWindow(m_hWnd) )
  484. )
  485. return;
  486. m_bDelayedSyncActiveMdiChild = true;
  487. PostMessage( WM_TIMER, 13, 0 );
  488. }
  489. void CExtMenuControlBar::_DelayUpdateMenuBar()
  490. {
  491. ASSERT_VALID( this );
  492. if( m_bDelayedUpdateMenuBar
  493. || m_hWnd == NULL
  494. || (! ::IsWindow(m_hWnd) )
  495. )
  496. return;
  497. m_bDelayedSyncActiveMdiChild = false;
  498. m_bDelayedUpdateMenuBar = true;
  499. PostMessage( WM_TIMER, 14, 0 );
  500. }
  501. void CExtMenuControlBar::OnTimer(__EXT_MFC_UINT_PTR nIDEvent) 
  502. {
  503. __PROF_UIS_MANAGE_STATE;
  504. if( nIDEvent == 13 )
  505. {
  506. KillTimer( nIDEvent );
  507. if( m_bDelayedSyncActiveMdiChild )
  508. {
  509. m_bDelayedSyncActiveMdiChild = false;
  510. _SyncActiveMdiChild();
  511. }
  512. return;
  513. } // if( nIDEvent == 13 )
  514. if( nIDEvent == 14 )
  515. {
  516. KillTimer( nIDEvent );
  517. if( m_bDelayedUpdateMenuBar )
  518. {
  519. m_bDelayedUpdateMenuBar = false;
  520. VERIFY( UpdateMenuBar( TRUE ) );
  521. } // if( m_bDelayedUpdateMenuBar )
  522. return;
  523. } // if( nIDEvent == 14 )
  524. if( nIDEvent == 15 )
  525. {
  526. KillTimer( nIDEvent );
  527. ASSERT( m_bMdiApp );
  528. HWND hWndMdiClient = _GetHwndMdiArea();
  529. if( hWndMdiClient != NULL )
  530. {
  531. KillTimer( nIDEvent );
  532. VERIFY( _InitMdiChildHook( hWndMdiClient ) );
  533. } // if( hWndMdiClient != NULL )
  534. return;
  535. } // if( nIDEvent == 15 )
  536. if( nIDEvent == 16 )
  537. {
  538. KillTimer( nIDEvent );
  539. _KillFrameMenu();
  540. return;
  541. } // if( nIDEvent == 16 )
  542. CExtToolControlBar::OnTimer(nIDEvent);
  543. }
  544. bool CExtMenuControlBar::_InitMdiChildHook( HWND hWndMdiClient )
  545. {
  546. ASSERT( m_bMdiApp );
  547. ASSERT( ::IsWindow(hWndMdiClient) );
  548. if( ! SetupHookWndSink( hWndMdiClient ) )
  549. {
  550. ASSERT( FALSE );
  551. return false;
  552. } // if( ! SetupHookWndSink( hWndMdiClient ) )
  553. ::SetWindowPos(
  554. hWndMdiClient, NULL, 0, 0, 0, 0,
  555. SWP_FRAMECHANGED
  556. |SWP_NOZORDER|SWP_NOOWNERZORDER|SWP_NOCOPYBITS
  557. |SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE
  558. );
  559. VERIFY( _SyncActiveMdiChild() );
  560. return true;
  561. }
  562. bool CExtMenuControlBar::_IsSimplifiedDropDownButtons() const
  563. {
  564. ASSERT_VALID( this );
  565. return true;
  566. }
  567. bool CExtMenuControlBar::_OnMouseMoveMsg(UINT nFlags, CPoint point) 
  568. {
  569. if( ! m_bFlatTracking )
  570. return CExtToolControlBar::_OnMouseMoveMsg(nFlags, point);
  571. int nIndex = HitTest( point );
  572. if( nIndex == m_nFlatTrackingIndex
  573. || nIndex < 0
  574. )
  575. return true;
  576. TrackButtonMenu( nIndex );
  577. return true;
  578. }
  579. void CExtMenuControlBar::OnLButtonDown(UINT nFlags, CPoint point) 
  580. {
  581. if( !m_bFlatTracking )
  582. {
  583. int nIndex = HitTest(point);
  584. if( nIndex >= 0 )
  585. {
  586. int nMenuIndex = GetMenuTrackingButton();
  587. if( nIndex == nMenuIndex )
  588. return;
  589. }
  590. }
  591. CExtToolControlBar::OnLButtonDown(nFlags, point);
  592. }
  593. void CExtMenuControlBar::OnLButtonUp(UINT nFlags, CPoint point) 
  594. {
  595. BOOL bRepaint = FALSE;
  596. if( m_bFlatTracking )
  597. {
  598. m_bFlatTracking = false;
  599. OnFlatTrackingStop();
  600. _UpdateFlatTracking( FALSE );
  601. bRepaint = TRUE;
  602. }
  603. CExtToolControlBar::OnLButtonUp(nFlags, point);
  604. if( bRepaint )
  605. Invalidate();
  606. }
  607. void CExtMenuControlBar::_RecalcLayoutImpl()
  608. {
  609. CExtToolControlBar::_RecalcLayoutImpl();
  610. if( m_pDockSite != NULL
  611. && IsFloating()
  612. && ( ! ((InternalFriendlyFrameWnd*)m_pDockSite)->IsInRecalcLayout() )
  613. && (! CExtControlBar::ProfileBarStateIsSerializing( m_pDockSite ) )
  614. && (m_pDockSite->GetStyle()&WS_VISIBLE) != 0
  615. )
  616. {
  617. WINDOWPLACEMENT _wp;
  618. ZeroMemory( &_wp, sizeof(WINDOWPLACEMENT) );
  619. _wp.length = sizeof(WINDOWPLACEMENT);
  620. CWnd * pWndPlacement = stat_GetWndForPlacement( m_pDockSite );
  621. ASSERT_VALID( pWndPlacement );
  622. pWndPlacement->GetWindowPlacement( &_wp );
  623. if( _wp.showCmd == SW_SHOWMINIMIZED )
  624. {
  625. //m_pDockSite->DelayRecalcLayout();
  626. return;
  627. }
  628. m_pDockSite->RecalcLayout();
  629. }
  630. }
  631. bool CExtMenuControlBar::OnQueryShiftRTL() const
  632. {
  633. ASSERT_VALID( this );
  634. return ((g_ResourceManager->OnQueryLangLayout()&LAYOUT_RTL) != 0) ? true : false;
  635. }
  636. bool CExtMenuControlBar::OnQueryRevertRTL() const
  637. {
  638. ASSERT_VALID( this );
  639. return ((g_ResourceManager->OnQueryLangLayout()&LAYOUT_RTL) != 0) ? true : false;
  640. }
  641. void CExtMenuControlBar::_RecalcPositionsImpl()
  642. {
  643. CExtToolControlBar::_RecalcPositionsImpl();
  644. if( g_bHideMenuBarExpandContentButton
  645. && m_pRightBtn != NULL
  646. )
  647. {
  648. ASSERT_VALID( m_pRightBtn );
  649. if( m_pRightBtn->GetButtons().GetSize() == 0 )
  650. m_pRightBtn->Show( FALSE );
  651. }
  652. CWnd * pWndParent = GetParent();
  653. ASSERT_VALID( pWndParent );
  654. BOOL bInDockBar = pWndParent->IsKindOf(RUNTIME_CLASS(CDockBar));
  655. if( IsFloating() && bInDockBar )
  656. return;
  657. int nCountOfButtons = GetButtonsCount();
  658. if( nCountOfButtons <= 1 )
  659. return;
  660. int nRightIndex = nCountOfButtons - 1;
  661. CExtBarMdiRightButton * pRightTBB =
  662. DYNAMIC_DOWNCAST(
  663. CExtBarMdiRightButton,
  664. _GetButtonPtr( nRightIndex )
  665. );
  666. if( pRightTBB == NULL && nCountOfButtons > 1 )
  667. {
  668. nRightIndex--;
  669. pRightTBB =
  670. DYNAMIC_DOWNCAST(
  671. CExtBarMdiRightButton,
  672. _GetButtonPtr( nRightIndex )
  673. );
  674. } // if( pRightTBB == NULL && nCountOfButtons > 1 )
  675. if( pRightTBB == NULL )
  676. return;
  677. if( !pRightTBB->IsVisible() )
  678. return;
  679. ASSERT( nRightIndex >= 1 );
  680. #ifdef _DEBUG
  681. CExtBarButton * pPrevTBB =
  682. _GetButtonPtr( nRightIndex - 1 );
  683. ASSERT_VALID( pPrevTBB );
  684. /// ASSERT( pPrevTBB->IsVisible() );
  685. #endif // _DEBUG
  686. CExtBarButton * pExpandTBB = NULL;
  687. CRect rcBtnExpand(0,0,0,0);
  688. int nAlignMargin = 0;
  689. BOOL bHorz = 
  690. bInDockBar
  691. ? IsDockedHorizontally()
  692. : ( (m_dwStyle & (CBRS_ALIGN_TOP|CBRS_ALIGN_BOTTOM))
  693. ? true
  694. : false
  695. )
  696. ;
  697. CRect rcClient;
  698. GetClientRect( &rcClient );
  699. if( nRightIndex < (nCountOfButtons-1) )
  700. {
  701. pExpandTBB = _GetButtonPtr( nRightIndex + 1 );
  702. ASSERT_VALID( pExpandTBB );
  703. if( ! pExpandTBB->IsKindOf( RUNTIME_CLASS(CExtBarContentExpandButton)) )
  704. pExpandTBB = NULL;
  705. } // if( nRightIndex < (nCountOfButtons-1) )
  706. if( pExpandTBB != NULL )
  707. { // if content-expand button exists
  708. if( pExpandTBB->IsVisible() )
  709. {
  710. rcBtnExpand = pExpandTBB->Rect();
  711. nAlignMargin =
  712. bHorz ? rcBtnExpand.left : rcBtnExpand.top;
  713. } // if( pExpandTBB->IsVisible() )
  714. else
  715. {
  716. pExpandTBB = NULL;
  717. nAlignMargin =
  718. bHorz ? rcClient.right : rcClient.bottom;
  719. } // else from if( pExpandTBB->IsVisible() )
  720. nAlignMargin -= __MENUBAR_RIGHT_ADJUST_GAP;
  721. } // if content-expand button exists
  722. else
  723. {  // if content-expand button DOES NOT exists
  724. nAlignMargin =
  725. bHorz ? rcClient.right : rcClient.bottom;
  726. nAlignMargin -= __MENUBAR_RIGHT_ADJUST_GAP;
  727. }  // if content-expand button DOES NOT exists
  728. CRect rcBtnRight = pRightTBB->Rect();
  729. if( bHorz && rcBtnRight.right >= nAlignMargin )
  730. return;
  731. if( (!bHorz) && rcBtnRight.bottom >= nAlignMargin )
  732. return;
  733. if( bHorz )
  734. rcBtnRight.OffsetRect(
  735. nAlignMargin - rcBtnRight.right,
  736. 0
  737. );
  738. else
  739. rcBtnRight.OffsetRect(
  740. 0,
  741. nAlignMargin - rcBtnRight.bottom
  742. );
  743. if( pExpandTBB == NULL )
  744. {
  745. pRightTBB->SetRect(rcBtnRight);
  746. return;
  747. }
  748. ASSERT( !rcBtnExpand.IsRectEmpty() );
  749. CRect rcBtnExpand2(
  750. bHorz ? rcBtnRight.left : rcBtnExpand.left,
  751. bHorz ? rcBtnExpand.top : rcBtnRight.top,
  752. bHorz ?
  753. rcBtnRight.left + rcBtnExpand.Width()
  754. :
  755. rcBtnExpand.left + rcBtnExpand.Width()
  756. ,
  757. bHorz ?
  758. rcBtnExpand.top + rcBtnExpand.Height()
  759. :
  760. rcBtnRight.top + rcBtnExpand.Height()
  761. );
  762. rcBtnRight.OffsetRect(
  763. bHorz ? rcBtnExpand.right - rcBtnRight.right : 0,
  764. bHorz ? 0 : rcBtnExpand.bottom - rcBtnRight.bottom
  765. );
  766. pRightTBB->SetRect(rcBtnRight);
  767. pExpandTBB->SetRect(rcBtnExpand2);
  768. if( g_bHideMenuBarExpandContentButton )
  769. pExpandTBB->Show( FALSE );
  770. }
  771. bool CExtMenuControlBar::_GetFullRowMode() const
  772. {
  773. ASSERT_VALID( this );
  774. return true;
  775. }
  776. bool CExtMenuControlBar::OnQueryMultiRowLayout() const
  777. {
  778. ASSERT_VALID( this );
  779. if( m_bPresubclassDialogMode
  780. // || m_pDockSite == NULL
  781. )
  782. return false;
  783. if( m_pDockBar != NULL )
  784. {
  785. if( IsFloating() )
  786. return false;
  787. if( _IsDockSiteCustomizeMode() )
  788. return true;
  789. } // if( m_pDockBar != NULL )
  790. return m_bMultiRowLayout;
  791. }
  792. CExtBarContentExpandButton * CExtMenuControlBar::OnCreateBarRightBtn()
  793. {
  794. ASSERT_VALID( this );
  795. if( m_bMultiRowLayout )
  796. return NULL;
  797. return CExtToolControlBar::OnCreateBarRightBtn();
  798. }
  799. void CExtMenuControlBar::_Dragging_OnStart()
  800. {
  801. _CancelFlatTracking();
  802. if( g_bMenuTracking )
  803. _CloseTrackingMenus();
  804. CExtToolControlBar::_Dragging_OnStart();
  805. }
  806. void CExtMenuControlBar::_Dragging_OnStop(
  807. CExtControlBar::InternalDraggingState_t & _dsOld,
  808. CExtControlBar::InternalDraggingState_t & _dsNew,
  809. bool bCancel
  810. )
  811. {
  812. CExtToolControlBar::_Dragging_OnStop(
  813. _dsOld,
  814. _dsNew,
  815. bCancel
  816. );
  817. if( _IsMdiApp() )
  818. {
  819. _InstallMdiDocButtons();
  820. _RecalcPositionsImpl();
  821. } // if( _IsMdiApp() )
  822. }
  823. HWND CExtMenuControlBar::_GetHwndMainFrame()
  824. {
  825. if( m_bPresubclassDialogMode )
  826. return NULL;
  827. CFrameWnd * pFrame = _GetDockingFrameImpl();
  828. ASSERT_VALID( pFrame );
  829. ASSERT( ::IsWindow(pFrame->GetSafeHwnd()) );
  830. return pFrame->GetSafeHwnd();
  831. }
  832. HWND CExtMenuControlBar::_GetHwndPlacement()
  833. {
  834. if( !m_bPresubclassDialogMode )
  835. return NULL;
  836. return m_hWndHelper;
  837. }
  838. HWND CExtMenuControlBar::_GetHwndChildFrame()
  839. {
  840. if( m_bPresubclassDialogMode )
  841. return NULL;
  842. return m_hWndHelper;
  843. }
  844. HWND CExtMenuControlBar::_GetHwndMdiArea()
  845. {
  846. if( m_bPresubclassDialogMode )
  847. return NULL;
  848. ASSERT( _IsMdiApp() );
  849. CFrameWnd * pFrame = _GetDockingFrameImpl();
  850. ASSERT_VALID( pFrame );
  851. ASSERT( ::IsWindow(pFrame->GetSafeHwnd()) );
  852. // FrameFeatures does not use CMDIFrameWnd
  853. // ASSERT_KINDOF( CMDIFrameWnd, pFrame );
  854. CMDIFrameWnd * pMdiFrame =
  855. DYNAMIC_DOWNCAST(
  856. CMDIFrameWnd,
  857. pFrame
  858. );
  859. if( pMdiFrame == NULL )
  860. {
  861. for( HWND hWnd = ::GetWindow( pFrame->GetSafeHwnd(), GW_CHILD );
  862. hWnd != NULL;
  863. hWnd = ::GetWindow( hWnd, GW_HWNDNEXT )
  864. )
  865. {
  866. ASSERT( ::IsWindow( hWnd ) );
  867. TCHAR strClassName[ 512 ];
  868. ::memset( strClassName, 0, sizeof(strClassName) );
  869. ::GetClassName( hWnd, strClassName, 512 );
  870. if( _tcslen( strClassName ) == 0 )
  871. continue;
  872. __EXT_MFC_STRLWR( strClassName, 512 );
  873. //if( _tcscmp( strClassName, _T("mdiclient") ) == 0 )
  874. if( _tcsstr( strClassName, _T("mdiclient") ) != NULL )
  875. return hWnd;
  876. }
  877. return NULL;
  878. } // if( pMdiFrame == NULL )
  879. //ASSERT_VALID( pMdiFrame );
  880. ASSERT( pMdiFrame->m_hWndMDIClient != NULL );
  881. ASSERT( ::IsWindow( pMdiFrame->m_hWndMDIClient ) );
  882. return pMdiFrame->m_hWndMDIClient;
  883. }
  884. int CExtMenuControlBar::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  885. {
  886. if (CExtToolControlBar::OnCreate(lpCreateStruct) == -1)
  887. return -1;
  888. CFrameWnd * pFrame = _GetDockingFrameImpl();
  889. if( pFrame == NULL )
  890. {
  891. m_bPresubclassDialogMode = true;
  892. if( m_hWndHelper == NULL )
  893. {
  894. m_hWndHelper = ::GetParent( m_hWnd );
  895. ASSERT( m_hWndHelper != NULL );
  896. ASSERT( ::IsWindow( m_hWndHelper ) );
  897. if( !IsHookedWindow( m_hWndHelper ) )
  898. SetupHookWndSink( m_hWndHelper );
  899. } // if( m_hWndHelper == NULL )
  900. return 0;
  901. }
  902. ASSERT_VALID( pFrame );
  903. ASSERT( ::IsWindow(pFrame->GetSafeHwnd()) );
  904. ASSERT( m_menuFrame.GetSafeHmenu() == NULL );
  905. ASSERT( m_menuDoc.GetSafeHmenu() == NULL );
  906. if( (pFrame->GetStyle()&WS_CHILD) == 0 )
  907. {
  908. HMENU hFrameMenu = pFrame->GetMenu()->GetSafeHmenu();
  909. if( hFrameMenu != NULL )
  910. {
  911. m_menuFrame.Attach( hFrameMenu );
  912. _UpdateMenuBar( FALSE );
  913. pFrame->SetMenu( NULL );
  914. }
  915. } // if( (pFrame->GetStyle()&WS_CHILD) == 0 )
  916. HWND hWndMainFrame = _GetHwndMainFrame();
  917. if( hWndMainFrame != NULL )
  918. {
  919. CWnd * pWndForPlacement = stat_GetWndForPlacement( CWnd::FromHandle(hWndMainFrame) );
  920. if( ! SetupHookWndSink( pWndForPlacement->m_hWnd ) )
  921. {
  922. ASSERT( FALSE );
  923. return FALSE;
  924. }
  925. if( pWndForPlacement->m_hWnd != hWndMainFrame )
  926. {
  927. if( ! SetupHookWndSink( hWndMainFrame ) )
  928. {
  929. ASSERT( FALSE );
  930. return FALSE;
  931. }
  932. }
  933. // FrameFeatures does not use CMDIFrameWnd
  934. if( pFrame->IsKindOf(RUNTIME_CLASS(CMDIFrameWnd))
  935. || _IsMdiApp()
  936. )
  937. { // if MDI App
  938. m_bMdiApp = true;
  939. HWND hWndMdiClient = _GetHwndMdiArea();
  940. if( hWndMdiClient != NULL )
  941. {
  942. VERIFY( _InitMdiChildHook( hWndMdiClient ) );
  943. }
  944. else
  945. SetTimer( 15, 10, NULL );
  946. // // pass message loop for smooth MDI client area update reasons
  947. // //CExtPopupMenuWnd::PassMsgLoop( CExtControlBar::g_bEnableOnIdleCalls );
  948. // MSG msg;
  949. // int i = 0;
  950. // for( ; PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) && i < 1000; i++ )
  951. // {
  952. // if( !AfxGetThread()->PumpMessage() )
  953. // break;
  954. // if( msg.message == WM_TIMER && msg.wParam == 15 )
  955. // break;
  956. // } // while( PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE) )
  957. } // if( pFrame->IsKindOf(RUNTIME_CLASS(CMDIFrameWnd)) ...
  958. } // if( hWndMainFrame != NULL )
  959. return 0;
  960. }
  961. /////////////////////////////////////////////////////////////////////////////
  962. // CExtBarMdiDocButton
  963. IMPLEMENT_DYNCREATE(CExtBarMdiDocButton,CExtBarButton)
  964. CExtBarMdiDocButton::CExtBarMdiDocButton(
  965. CExtToolControlBar * pBar, // = NULL
  966. UINT nCmdID, // = ID_SEPARATOR
  967. UINT nStyle // = 0
  968. )
  969. : CExtBarButton( pBar, nCmdID, nStyle )
  970. , m_hWndActiveMdiChild( NULL )
  971. , m_bHandleDblClickAsCloseCmd( true )
  972. {
  973. }
  974. CExtBarMdiDocButton::~CExtBarMdiDocButton()
  975. {
  976. }
  977. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  978. bool CExtBarMdiDocButton::IsRibbonPaintingMode() const
  979. {
  980. ASSERT_VALID( this );
  981. return false;
  982. }
  983. CSize CExtBarMdiDocButton::RibbonILV_CalcSize(
  984. CDC & dc,
  985. INT nILV // = -1 // -1 use current visual level
  986. ) const
  987. {
  988. ASSERT_VALID( this );
  989. nILV;
  990. return
  991. ( const_cast < CExtBarMdiDocButton * > ( this ) )
  992. -> CalculateLayout( dc, CSize(0,0), IsHorzBarOrientation() );
  993. }
  994. #endif //  (!defined __EXT_MFC_NO_RIBBON_BAR)
  995. CSize CExtBarMdiDocButton::CalculateLayout(
  996. CDC & dc,
  997. CSize sizePreCalc,
  998. BOOL bHorz
  999. )
  1000. {
  1001. ASSERT_VALID( this );
  1002. ASSERT_VALID( GetBar() );
  1003. ASSERT( GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) );
  1004. ASSERT_VALID( (&dc) );
  1005. ASSERT( CtrlGet() == NULL );
  1006. ASSERT( ! IsSeparator() );
  1007. dc;
  1008. sizePreCalc;
  1009. bHorz;
  1010. CSize _size( 16, 16 );
  1011. CExtCmdIcon * pIcon = GetIconPtr();
  1012. if( pIcon != NULL
  1013. && (! pIcon->IsEmpty() )
  1014. )
  1015. _size = pIcon->GetSize();
  1016. _size.cx += 3;
  1017. _size.cy += 3;
  1018. return _size;
  1019. }
  1020. bool CExtBarMdiDocButton::CanStartCommandDrag()
  1021. {
  1022. ASSERT_VALID( this );
  1023. return false;
  1024. }
  1025. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1026. CExtCustomizeCmdTreeNode * CExtBarMdiDocButton::GetCmdNode(
  1027. bool bInitial // = false
  1028. )
  1029. {
  1030. ASSERT_VALID( this );
  1031. // ASSERT_VALID( GetBar() );
  1032. // bInitial;
  1033. // ASSERT( m_pCmdNodeI == NULL );
  1034. // ASSERT( m_pCmdNodeC == NULL );
  1035. // return NULL;
  1036. return CExtBarButton::GetCmdNode( bInitial );
  1037. }
  1038. void CExtBarMdiDocButton::SetBasicCmdNode(
  1039. CExtCustomizeCmdTreeNode * pNode
  1040. )
  1041. {
  1042. ASSERT_VALID( this );
  1043. // ASSERT_VALID( GetBar() );
  1044. // ASSERT( m_pCmdNodeI == NULL );
  1045. // ASSERT( m_pCmdNodeC == NULL );
  1046. // ASSERT( FALSE ); // should be never called
  1047. // pNode;
  1048. CExtBarButton::SetBasicCmdNode( pNode );
  1049. }
  1050. void CExtBarMdiDocButton::SetCustomizedCmdNode(
  1051. CExtCustomizeCmdTreeNode * pNode
  1052. )
  1053. {
  1054. ASSERT_VALID( this );
  1055. // ASSERT_VALID( GetBar() );
  1056. // ASSERT( m_pCmdNodeI == NULL );
  1057. // ASSERT( m_pCmdNodeC == NULL );
  1058. // ASSERT( FALSE ); // should be never called
  1059. // pNode;
  1060. CExtBarButton::SetCustomizedCmdNode( pNode );
  1061. }
  1062. CExtCustomizeCmdTreeNode * CExtBarMdiDocButton::OnCustomizeNodeInit(
  1063. CExtCustomizeSite * pSite,
  1064. CExtCustomizeCmdTreeNode * pParentNode // toolbar node
  1065. )
  1066. {
  1067. ASSERT_VALID( this );
  1068. // ASSERT_VALID( GetBar() );
  1069. // ASSERT( pSite != NULL );
  1070. // ASSERT_VALID( pParentNode );
  1071. // pSite;
  1072. // pParentNode;
  1073. // return NULL; // no customization support
  1074. return CExtBarButton::OnCustomizeNodeInit( pSite, pParentNode );
  1075. }
  1076. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1077. BOOL CExtBarMdiDocButton::PutToPopupMenu(
  1078. CExtPopupMenuWnd * pPopup
  1079. )
  1080. {
  1081. ASSERT( pPopup != NULL );
  1082. ASSERT( pPopup->GetSafeHwnd() == NULL );
  1083. ASSERT_VALID( GetBar() );
  1084. ASSERT( GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) );
  1085. ASSERT( CtrlGet() == NULL );
  1086. ASSERT( ! IsSeparator() );
  1087. HWND hWndActiveChild = _ActiveMdiChildWndGet();
  1088. ASSERT( ::IsWindow( hWndActiveChild ) );
  1089. //CFrameWnd * pFrame =
  1090. // DYNAMIC_DOWNCAST(
  1091. // CFrameWnd,
  1092. // CWnd::FromHandle(hWndActiveChild)
  1093. // );
  1094. CMenu * pSysMenu =
  1095. CWnd::FromHandle(hWndActiveChild) ->
  1096. GetSystemMenu( FALSE );
  1097. if( pSysMenu == NULL )
  1098. {
  1099. ASSERT( FALSE );
  1100. return FALSE;
  1101. }
  1102. ASSERT( ::IsMenu(pSysMenu->GetSafeHmenu()) );
  1103. CExtCmdIcon & _icon = GetIcon();
  1104. CExtSafeString sActiveDocument;
  1105. if( ! g_ResourceManager->LoadString( sActiveDocument, IDS_ACTIVE_DOCUMENT ) )
  1106. sActiveDocument = _T("Active document");
  1107. if( ! pPopup->ItemInsert(
  1108. (UINT)CExtPopupMenuWnd::TYPE_POPUP,
  1109. -1,
  1110. sActiveDocument,
  1111. _icon
  1112. )
  1113. )
  1114. {
  1115. ASSERT( FALSE );
  1116. return FALSE;
  1117. }
  1118. CExtPopupMenuWnd * pChildPopup =
  1119. pPopup->ItemGetPopup(
  1120. pPopup->ItemGetCount() - 1
  1121. );
  1122. ASSERT( pChildPopup != NULL );
  1123. if( ! pChildPopup->UpdateFromMenu(
  1124. GetBar()->GetSafeHwnd(),
  1125. pSysMenu,
  1126. false,
  1127. false
  1128. )
  1129. )
  1130. {
  1131. ASSERT( FALSE );
  1132. return FALSE;
  1133. }
  1134. pChildPopup->
  1135. SetCmdTargetToAllItems(
  1136. hWndActiveChild
  1137. );
  1138. if( (pPopup->TrackFlagsGet()&TPMX_PALETTE) != 0 )
  1139. pPopup->ItemGetInfo(pPopup->ItemGetCount()-1).SetChildCombine();
  1140. VERIFY(
  1141. pPopup->ItemInsert(
  1142. CExtPopupMenuWnd::TYPE_SEPARATOR,
  1143. -1
  1144. )
  1145. );
  1146. return TRUE;
  1147. }
  1148. HWND CExtBarMdiDocButton::_ActiveMdiChildWndGet()
  1149. {
  1150. ASSERT_VALID( this );
  1151. if( m_hWndActiveMdiChild != NULL
  1152. && ::IsWindow( m_hWndActiveMdiChild )
  1153. )
  1154. return m_hWndActiveMdiChild;
  1155. /// if( p_bMaximized != NULL )
  1156. /// (*p_bMaximized) = false;
  1157. CMDIFrameWnd * pMdiFrame = DYNAMIC_DOWNCAST( CMDIFrameWnd, GetBar()->_GetDockingFrameImpl() );
  1158. HWND hWndMdiClient = NULL;
  1159. if( pMdiFrame == NULL )
  1160. hWndMdiClient = ((CExtMenuControlBar*)GetBar())->_GetHwndMdiArea();
  1161. else
  1162. {
  1163. ASSERT_VALID( pMdiFrame );
  1164. hWndMdiClient = pMdiFrame->m_hWndMDIClient;
  1165. } // else from if( pMdiFrame == NULL )
  1166. if( hWndMdiClient == NULL )
  1167. return NULL;
  1168. ASSERT( ::IsWindow( hWndMdiClient ) );
  1169. BOOL bMax = FALSE;
  1170. HWND hWndActiveChildFrame = (HWND) ::SendMessage( hWndMdiClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMax );
  1171. if( hWndActiveChildFrame == NULL )
  1172. {
  1173. /// bMax = FALSE;
  1174. }
  1175. else
  1176. {
  1177. ASSERT( ::IsWindow( hWndActiveChildFrame ) );
  1178. __EXT_MFC_LONG_PTR dwActiveChildFrameStyle =
  1179. ::__EXT_MFC_GetWindowLong( hWndActiveChildFrame, GWL_STYLE );
  1180. if( pMdiFrame == NULL )
  1181. {
  1182. if( (dwActiveChildFrameStyle&WS_VISIBLE) == 0 )
  1183. {
  1184. hWndActiveChildFrame = NULL;
  1185. ///bMax = FALSE;
  1186. } // if( (dwActiveChildFrameStyle&WS_VISIBLE) == 0 )
  1187. } // if( pMdiFrame == NULL )
  1188. else
  1189. {
  1190. CWnd * pWndTempAnalyze = CWnd::FromHandlePermanent( hWndActiveChildFrame );
  1191. if( pWndTempAnalyze != NULL )
  1192. {
  1193. ASSERT_VALID( pWndTempAnalyze );
  1194. CMDIChildWnd * pWndTempMDIChild = DYNAMIC_DOWNCAST( CMDIChildWnd, pWndTempAnalyze );
  1195. if( pWndTempMDIChild != NULL
  1196. && pWndTempMDIChild->m_bPseudoInactive
  1197. && (dwActiveChildFrameStyle&WS_VISIBLE) == 0
  1198. )
  1199. {
  1200. hWndActiveChildFrame = NULL;
  1201. ///bMax = FALSE;
  1202. }
  1203. } // if( pWndTempAnalyze != NULL )
  1204. } // else from if( pMdiFrame == NULL )
  1205. } // else from if( hWndActiveChildFrame == NULL )
  1206. /// if( p_bMaximized != NULL )
  1207. /// (*p_bMaximized) = bMax ? true : false;
  1208. return hWndActiveChildFrame;
  1209. }
  1210. HWND CExtBarMdiDocButton::_ActiveMdiChildWndAttach(
  1211. HWND hWndActiveMdiChildNew
  1212. )
  1213. {
  1214. ASSERT_VALID( this );
  1215. if( hWndActiveMdiChildNew == m_hWndActiveMdiChild )
  1216. return m_hWndActiveMdiChild;
  1217. HWND hWndActiveMdiChildOld = m_hWndActiveMdiChild;
  1218. m_hWndActiveMdiChild = hWndActiveMdiChildNew;
  1219. m_iconCache.Empty();
  1220. return hWndActiveMdiChildOld;
  1221. }
  1222. HWND CExtBarMdiDocButton::_ActiveMdiChildWndDetach()
  1223. {
  1224. ASSERT_VALID( this );
  1225. return _ActiveMdiChildWndAttach( NULL );
  1226. }
  1227. CExtCmdIcon * CExtBarMdiDocButton::GetIconPtr()
  1228. {
  1229. ASSERT_VALID( this );
  1230. ASSERT_VALID( GetBar() );
  1231. if( m_hWndActiveMdiChild != NULL
  1232. && ::IsWindow( m_hWndActiveMdiChild )
  1233. && ( ! m_iconCache.IsEmpty() )
  1234. )
  1235. return (&m_iconCache);
  1236. HWND hWndActiveChild = _ActiveMdiChildWndGet();
  1237. if( hWndActiveChild == NULL )
  1238. return NULL;
  1239. if( m_hWndActiveMdiChild != hWndActiveChild )
  1240. m_hWndActiveMdiChild = NULL;
  1241. ASSERT( ::IsWindow(hWndActiveChild) );
  1242. _ExtractWndIcon( hWndActiveChild, m_iconCache );
  1243. if( m_iconCache.IsEmpty() )
  1244. return NULL;
  1245. return (&m_iconCache);
  1246. }
  1247. void CExtBarMdiDocButton::_ExtractWndIcon(
  1248. HWND hWnd,
  1249. CExtCmdIcon & _Icon
  1250. )
  1251. {
  1252. _Icon.Empty();
  1253. if( hWnd == NULL
  1254. || ( ! ::IsWindow( hWnd ) )
  1255. )
  1256. return;
  1257. HICON hIcon = (HICON)(__EXT_MFC_DWORD_PTR) ::SendMessage( hWnd, CExtControlBar::g_nMsgQueryIcon, 0, 0 );
  1258. if( hIcon == NULL )
  1259. {
  1260. hIcon = (HICON)(__EXT_MFC_DWORD_PTR) ::SendMessage( hWnd, WM_GETICON, ICON_SMALL, 0 );
  1261. if( hIcon == NULL )
  1262. {
  1263. hIcon = (HICON)(__EXT_MFC_DWORD_PTR) ::SendMessage( hWnd, WM_GETICON, ICON_BIG, 0 );
  1264. if( hIcon == NULL )
  1265. {
  1266. hIcon = (HICON)(__EXT_MFC_DWORD_PTR) ::__EXT_MFC_GetClassLong( hWnd, __EXT_MFC_GCL_HICONSM );
  1267. if( hIcon == NULL )
  1268. {
  1269. hIcon = (HICON)(__EXT_MFC_DWORD_PTR) ::__EXT_MFC_GetClassLong( hWnd, __EXT_MFC_GCL_HICON );
  1270. if( hIcon == NULL )
  1271. return;
  1272. } // if( hIcon == NULL )
  1273. } // if( hIcon == NULL )
  1274. } // if( hIcon == NULL )
  1275. } // if( hIcon == NULL )
  1276. ASSERT( hIcon != NULL );
  1277. // _Icon.AssignFromHICON( hIcon, true );
  1278. CExtCmdIcon _iconBig;
  1279. _iconBig.AssignFromHICON( hIcon, true );
  1280. VERIFY(
  1281. _Icon.CreateScaledCopy(
  1282. _iconBig,
  1283. CSize( 16, 16 )
  1284. )
  1285. );
  1286. }
  1287. void CExtBarMdiDocButton::OnUpdateCmdUI(
  1288. CWnd * pTarget,
  1289. BOOL bDisableIfNoHndler,
  1290. int nIndex
  1291. )
  1292. {
  1293. ASSERT_VALID( this );
  1294. pTarget;
  1295. bDisableIfNoHndler;
  1296. nIndex;
  1297. }
  1298. bool CExtBarMdiDocButton::OnDblClick(
  1299. CPoint point
  1300. )
  1301. {
  1302. ASSERT_VALID( this );
  1303. ASSERT_VALID( GetBar() );
  1304. if( ! IsEnabled() )
  1305. return false;
  1306. if( ! m_bHandleDblClickAsCloseCmd )
  1307. return false;
  1308. CWnd * pWndMdiChildFrame = GetCmdTargetWnd();
  1309. if( pWndMdiChildFrame->GetSafeHwnd() == NULL )
  1310. return true;
  1311. bool bAllowClose = false;
  1312. CMenu * pSysMenu = pWndMdiChildFrame->GetSystemMenu( FALSE );
  1313. if( pSysMenu != NULL )
  1314. {
  1315. INT nCount = pSysMenu->GetMenuItemCount();
  1316. for( INT nItem = 0; nItem < nCount; nItem++ )
  1317. {
  1318. UINT nID = pSysMenu->GetMenuItemID( nItem );
  1319. if( nID != SC_CLOSE )
  1320. continue;
  1321. MENUITEMINFO mii;
  1322. ::memset(&mii,0,sizeof(MENUITEMINFO));
  1323. mii.cbSize = sizeof(MENUITEMINFO);
  1324. mii.fMask = MIIM_STATE;
  1325. if( !pSysMenu->GetMenuItemInfo(
  1326. nItem,
  1327. &mii,
  1328. TRUE
  1329. )
  1330. )
  1331. break;
  1332. if( ( mii.fState & (MFS_DISABLED|MFS_GRAYED) ) == 0 )
  1333. bAllowClose = true;
  1334. break;
  1335. } // for( INT nItem = 0; nItem < nCount; nItem++ )
  1336. } // if( pSysMenu != NULL )
  1337. if( ! bAllowClose )
  1338. return true;
  1339. GetBar()->ClientToScreen( &point );
  1340. pWndMdiChildFrame->PostMessage(
  1341. WM_SYSCOMMAND,
  1342. SC_CLOSE,
  1343. MAKELONG( point.x, point.y )
  1344. );
  1345. return true;
  1346. }
  1347. CWnd * CExtBarMdiDocButton::GetCmdTargetWnd()
  1348. {
  1349. ASSERT_VALID( GetBar() );
  1350. HWND hWndActiveChild = _ActiveMdiChildWndGet();
  1351. if( hWndActiveChild == NULL )
  1352. return NULL;
  1353. ASSERT( ::IsWindow(hWndActiveChild) );
  1354. CWnd * pWnd = CWnd::FromHandlePermanent(hWndActiveChild);
  1355. if( pWnd == NULL )
  1356. {
  1357. pWnd = CWnd::FromHandle(hWndActiveChild);
  1358. ASSERT_VALID( pWnd );
  1359. } // if( pWnd == NULL )
  1360. #ifdef _DEBUG
  1361. else
  1362. {
  1363. ASSERT_VALID( pWnd );
  1364. // FrameFeatures specifics
  1365. //ASSERT( pWnd->IsKindOf(RUNTIME_CLASS(CMDIChildWnd)) );
  1366. } // else from if( pWnd == NULL )
  1367. #endif // _DEBUG
  1368. return pWnd;
  1369. }
  1370. UINT CExtBarMdiDocButton::OnTrackPopup(
  1371. CPoint point,
  1372. bool bSelectAny,
  1373. bool bForceNoAnimation
  1374. )
  1375. {
  1376. ASSERT_VALID( GetBar() );
  1377. bool bDockSiteCustomizeMode =
  1378. GetBar()->_IsDockSiteCustomizeMode();
  1379. if( bDockSiteCustomizeMode )
  1380. return UINT(-1L);
  1381. CExtMenuControlBar * pBar =
  1382. DYNAMIC_DOWNCAST(
  1383. CExtMenuControlBar,
  1384. GetBar()
  1385. );
  1386. CWnd * pWnd = CExtBarMdiDocButton::GetCmdTargetWnd();
  1387. //CFrameWnd * pFrame = 
  1388. // DYNAMIC_DOWNCAST(
  1389. // CFrameWnd,
  1390. // pWnd
  1391. // );
  1392. // ASSERT( pFrame != NULL );
  1393. if( pBar == NULL
  1394. //|| pFrame == NULL
  1395. )
  1396. {
  1397. CExtBarButton::OnTrackPopup( point, bSelectAny, bForceNoAnimation );
  1398. return UINT(-1L);
  1399. }
  1400. bool bPrevTBMT = CExtToolControlBar::g_bMenuTracking;
  1401. if( CExtToolControlBar::g_bMenuTracking
  1402. //&& CExtPopupMenuWnd::IsMenuTracking()
  1403. && pBar->_GetIndexOf(this) ==
  1404. pBar->m_nBtnIdxMenuTracking
  1405. )
  1406. return UINT(-1L);
  1407. CExtToolControlBar::_CloseTrackingMenus();
  1408. if( pBar->IsFloating() )
  1409. {
  1410. pBar->ActivateTopParent();
  1411. CFrameWnd * pFrame =
  1412. pBar->GetDockingFrame();
  1413. ASSERT_VALID( pFrame );
  1414. pFrame->BringWindowToTop();
  1415. }
  1416. __EXT_MFC_LONG_PTR dwExStyle = ::__EXT_MFC_GetWindowLong( pWnd->GetSafeHwnd(), GWL_EXSTYLE );
  1417. bool bRTL = ( (dwExStyle & WS_EX_LAYOUTRTL) != 0 ) ? true : false;
  1418. UINT nTrackFlags = TPMX_TOPALIGN;
  1419. CRect rcBtn = Rect();
  1420. // point.x = rcBtn.left;
  1421. // point.y = rcBtn.bottom;
  1422. switch( GetBar()->GetSafeDockBarDlgCtrlID() )
  1423. {
  1424. case AFX_IDW_DOCKBAR_BOTTOM:
  1425. nTrackFlags = TPMX_BOTTOMALIGN;
  1426. // point.x = rcBtn.left;
  1427. // point.y = rcBtn.bottom;
  1428. break;
  1429. case AFX_IDW_DOCKBAR_LEFT:
  1430. nTrackFlags = bRTL ? TPMX_RIGHTALIGN : TPMX_LEFTALIGN;
  1431. // point.x = rcBtn.right;
  1432. // point.y = rcBtn.top;
  1433. break;
  1434. case AFX_IDW_DOCKBAR_RIGHT:
  1435. nTrackFlags = bRTL ? TPMX_LEFTALIGN : TPMX_RIGHTALIGN;
  1436. // point.x = rcBtn.left;
  1437. // point.y = rcBtn.top;
  1438. break;
  1439. } // switch( GetBar()->GetSafeDockBarDlgCtrlID() )
  1440. pBar->ClientToScreen( &rcBtn );
  1441. // pBar->ClientToScreen( &point );
  1442. point = rcBtn.CenterPoint();
  1443. CExtToolControlBar::g_bMenuTracking = bPrevTBMT;
  1444. GetBar()->_SwitchMenuTrackingIndex(
  1445. GetBar()->_GetIndexOf( this )
  1446. );
  1447. if( bForceNoAnimation )
  1448. nTrackFlags |= TPMX_FORCE_NO_ANIMATION;
  1449. g_pTrackingMenuTBB = this;
  1450. pBar->m_bSysMenuTracking =
  1451. pBar->
  1452. _TrackFrameSystemMenu(
  1453. pWnd,
  1454. &point, // NULL,
  1455. TRUE,
  1456. &rcBtn,
  1457. nTrackFlags,
  1458. m_bHandleDblClickAsCloseCmd ? FALSE : TRUE
  1459. ) ? true : false;
  1460. CExtToolControlBar::g_bMenuTracking = true;
  1461. return UINT(-1L);
  1462. }
  1463. /////////////////////////////////////////////////////////////////////////////
  1464. // CExtBarMdiRightButton
  1465. IMPLEMENT_DYNCREATE(CExtBarMdiRightButton,CExtBarMdiDocButton)
  1466. CExtBarMdiRightButton::CExtBarMdiRightButton(
  1467. CExtToolControlBar * pBar, // = NULL
  1468. UINT nCmdID, // = ID_SEPARATOR
  1469. UINT nStyle // = 0
  1470. ) :
  1471. CExtBarMdiDocButton(
  1472. pBar,
  1473. nCmdID,
  1474. nStyle
  1475. )
  1476. {
  1477. }
  1478. CExtBarMdiRightButton::~CExtBarMdiRightButton()
  1479. {
  1480. }
  1481. BOOL CExtBarMdiRightButton::PutToPopupMenu(
  1482. CExtPopupMenuWnd * pPopup
  1483. )
  1484. {
  1485. ASSERT( pPopup != NULL );
  1486. ASSERT( pPopup->GetSafeHwnd() == NULL );
  1487. ASSERT_VALID( GetBar() );
  1488. ASSERT( GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) );
  1489. ASSERT( CtrlGet() == NULL );
  1490. ASSERT( ! IsSeparator() );
  1491. CExtMenuControlBar * pBar =
  1492. DYNAMIC_DOWNCAST(
  1493. CExtMenuControlBar,
  1494. GetBar()
  1495. );
  1496. ASSERT_VALID( pBar );
  1497. BOOL bHorz = !pBar->IsDockedVertically();
  1498. MdiMenuBarRightButtonsInfo_t _info;
  1499. pBar->_GetMdiMenuBarRightButtonsInfo( _info, this, bHorz );
  1500. if( !_info.m_bInitialized )
  1501. return FALSE;
  1502. HWND hWndActiveChild = _ActiveMdiChildWndGet();
  1503. ASSERT( ::IsWindow( hWndActiveChild ) );
  1504. int nCount = pPopup->ItemGetCount();
  1505. if( nCount > 0 )
  1506. {
  1507. if( pPopup->ItemGetCmdID(nCount-1) !=
  1508. CExtPopupMenuWnd::TYPE_SEPARATOR
  1509. )
  1510. {
  1511. VERIFY(
  1512. pPopup->ItemInsert(
  1513. CExtPopupMenuWnd::TYPE_SEPARATOR,
  1514. -1
  1515. )
  1516. );
  1517. }
  1518. }
  1519. if( _info.m_bBtnHelp )
  1520. {
  1521. VERIFY(
  1522. pPopup->ItemInsert(
  1523. SC_CONTEXTHELP,
  1524. -1,NULL,NULL,hWndActiveChild
  1525. )
  1526. );
  1527. }
  1528. if( _info.m_bBtnMinimize )
  1529. {
  1530. VERIFY(
  1531. pPopup->ItemInsert(
  1532. SC_MINIMIZE,
  1533. -1,NULL,NULL,hWndActiveChild
  1534. )
  1535. );
  1536. VERIFY(
  1537. pPopup->ItemInsert(
  1538. SC_RESTORE,
  1539. -1,NULL,NULL,hWndActiveChild
  1540. )
  1541. );
  1542. }
  1543. // if( _info.m_bBtnMaximize && !_info.m_bBtnMinimize )
  1544. // {
  1545. // VERIFY(
  1546. // pPopup->ItemInsert(
  1547. // SC_MAXIMIZE,
  1548. // -1,NULL,NULL,hWndActiveChild
  1549. // )
  1550. // );
  1551. // }
  1552. if( _info.m_bBtnMaximize )
  1553. {
  1554. VERIFY(
  1555. pPopup->ItemInsert(
  1556. _info.m_bBtnMinimize ? SC_MAXIMIZE : SC_RESTORE,
  1557. -1,NULL,NULL,hWndActiveChild
  1558. )
  1559. );
  1560. }
  1561. if( _info.m_bBtnClose )
  1562. {
  1563. VERIFY(
  1564. pPopup->ItemInsert(
  1565. SC_CLOSE,
  1566. -1,NULL,NULL,hWndActiveChild
  1567. )
  1568. );
  1569. }
  1570. return TRUE;
  1571. }
  1572. CExtCmdIcon * CExtBarMdiRightButton::GetIconPtr()
  1573. {
  1574. return NULL;
  1575. }
  1576. void CExtMenuControlBar::_GetMdiMenuBarRightButtonsInfo(
  1577. CExtBarMdiRightButton::MdiMenuBarRightButtonsInfo_t & _info,
  1578. CExtBarMdiRightButton * pTBB,
  1579. BOOL bHorz
  1580. )
  1581. {
  1582. ASSERT_VALID( this );
  1583. ASSERT_VALID( pTBB );
  1584. _info.m_pWndMdiChildFrame = pTBB->GetCmdTargetWnd();
  1585. if( _info.m_pWndMdiChildFrame == NULL )
  1586. return;
  1587. //ASSERT( _info.m_pWndMdiChildFrame->IsKindOf(RUNTIME_CLASS(CMDIChildWnd)) );
  1588. ASSERT_VALID( _info.m_pWndMdiChildFrame );
  1589. _info.m_pBar = this;
  1590. DWORD dwFrameStyle = _info.m_pWndMdiChildFrame->GetStyle();
  1591. _info.m_bBtnClose = false;
  1592. CMenu * pSysMenu = _info.m_pWndMdiChildFrame->GetSystemMenu( FALSE );
  1593. if( pSysMenu != NULL )
  1594. {
  1595. INT nCount = pSysMenu->GetMenuItemCount();
  1596. for( INT nItem = 0; nItem < nCount; nItem++ )
  1597. {
  1598. UINT nID = pSysMenu->GetMenuItemID( nItem );
  1599. if( nID != SC_CLOSE )
  1600. continue;
  1601. MENUITEMINFO mii;
  1602. ::memset(&mii,0,sizeof(MENUITEMINFO));
  1603. mii.cbSize = sizeof(MENUITEMINFO);
  1604. mii.fMask = MIIM_STATE;
  1605. if( !pSysMenu->GetMenuItemInfo(
  1606. nItem,
  1607. &mii,
  1608. TRUE
  1609. )
  1610. )
  1611. break;
  1612. if( ( mii.fState & (MFS_DISABLED|MFS_GRAYED) ) == 0 )
  1613. _info.m_bBtnClose = true;
  1614. break;
  1615. } // for( INT nItem = 0; nItem < nCount; nItem++ )
  1616. } // if( pSysMenu != NULL )
  1617. _info.m_bBtnMaximize =
  1618. (dwFrameStyle & WS_MAXIMIZEBOX) ?
  1619. true : false;
  1620. _info.m_bBtnMinimize =
  1621. (dwFrameStyle & WS_MINIMIZEBOX) ?
  1622. true : false;
  1623. _info.m_bBtnHelp =
  1624. (_info.m_bBtnMaximize && (_info.m_pWndMdiChildFrame->GetExStyle()&WS_EX_CONTEXTHELP)) ?
  1625. true : false;
  1626. if( bHorz )
  1627. {
  1628. _info.m_calcSize.cx = __GAP_BETWEEN_WND_RIGHT_BUTTONS;
  1629. _info.m_calcSize.cy = _info.m_cyIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
  1630. if( _info.m_bBtnMinimize )
  1631. _info.m_calcSize.cx +=
  1632. (_info.m_cxIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS)*2;
  1633. if( _info.m_bBtnMaximize && !_info.m_bBtnMinimize )
  1634. _info.m_calcSize.cx +=
  1635. _info.m_cxIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
  1636. if( _info.m_bBtnHelp )
  1637. _info.m_calcSize.cx +=
  1638. _info.m_cxIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
  1639. if( _info.m_bBtnClose )
  1640. _info.m_calcSize.cx +=
  1641. _info.m_cxIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
  1642. } // if( bHorz )
  1643. else
  1644. {
  1645. _info.m_calcSize.cx = _info.m_cxIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
  1646. _info.m_calcSize.cy = __GAP_BETWEEN_WND_RIGHT_BUTTONS;
  1647. if( _info.m_bBtnMinimize )
  1648. _info.m_calcSize.cy +=
  1649. (_info.m_cyIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS)*2;
  1650. if( _info.m_bBtnMaximize && !_info.m_bBtnMinimize )
  1651. _info.m_calcSize.cy +=
  1652. _info.m_cyIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
  1653. if( _info.m_bBtnHelp )
  1654. _info.m_calcSize.cy +=
  1655. _info.m_cyIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
  1656. if( _info.m_bBtnClose )
  1657. _info.m_calcSize.cy +=
  1658. _info.m_cyIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
  1659. } // else from if( bHorz )
  1660. _info.m_bInitialized = true;
  1661. }
  1662. CExtBarMdiRightButton::MdiMenuBarRightButtonsInfo_t::
  1663. MdiMenuBarRightButtonsInfo_t()
  1664. {
  1665. m_bInitialized
  1666. = m_bBtnClose
  1667. = m_bBtnMaximize
  1668. = m_bBtnMinimize
  1669. = m_bBtnHelp
  1670. = false;
  1671. m_pBar = NULL;
  1672. m_pWndMdiChildFrame = NULL;
  1673. if( g_PaintManager.m_bIsWinXPorLater )
  1674. {
  1675. CSize _sizeTmp( // (+ v.2.22)
  1676. ::GetSystemMetrics(SM_CXSMSIZE),
  1677. ::GetSystemMetrics(SM_CYSMSIZE)
  1678. );
  1679. int nMetric =
  1680. max( _sizeTmp.cx, _sizeTmp.cy ) + 1;
  1681. m_cxIcon = max( nMetric, 18 ); // 16->18 (+ v.2.23)
  1682. m_cyIcon = max( nMetric, 18 ); // 16->18 (+ v.2.23)
  1683. } // if( g_PaintManager.m_bIsWinXPorLater )
  1684. else
  1685. {
  1686. m_cxIcon = ::GetSystemMetrics(SM_CXSIZE);
  1687. m_cyIcon = ::GetSystemMetrics(SM_CYSIZE);
  1688. } // else from if( g_PaintManager.m_bIsWinXPorLater )
  1689. ASSERT(
  1690. m_cxIcon > __GAP_BETWEEN_WND_RIGHT_BUTTONS
  1691. &&
  1692. m_cyIcon > __GAP_BETWEEN_WND_RIGHT_BUTTONS
  1693. );
  1694. m_cxIcon -= __GAP_BETWEEN_WND_RIGHT_BUTTONS;
  1695. m_cyIcon -= __GAP_BETWEEN_WND_RIGHT_BUTTONS;
  1696. m_calcSize.cx = m_calcSize.cy = 0;
  1697. EmptyLocations();
  1698. }
  1699. void CExtBarMdiRightButton::MdiMenuBarRightButtonsInfo_t::
  1700. EmptyLocations()
  1701. {
  1702. m_rcBtnClose.SetRectEmpty();
  1703. m_rcBtnMaximize.SetRectEmpty();
  1704. m_rcBtnRestore.SetRectEmpty();
  1705. m_rcBtnMinimize.SetRectEmpty();
  1706. m_rcBtnHelp.SetRectEmpty();
  1707. }
  1708. void CExtBarMdiRightButton::MdiMenuBarRightButtonsInfo_t::
  1709. InitLocations(
  1710. const CRect & rcBtn,
  1711. BOOL bHorz
  1712. )
  1713. {
  1714. ASSERT( m_bInitialized );
  1715. EmptyLocations();
  1716. if( rcBtn.IsRectEmpty() )
  1717. return;
  1718. CRect rcStart(0,0,0,0);
  1719. CSize sizeOffset(0,0);
  1720. if( bHorz )
  1721. {
  1722. int nOffset = (rcBtn.Height() - m_cyIcon) / 2;
  1723. rcStart.SetRect(
  1724. rcBtn.left + __GAP_BETWEEN_WND_RIGHT_BUTTONS,
  1725. rcBtn.top + nOffset,
  1726. rcBtn.left + __GAP_BETWEEN_WND_RIGHT_BUTTONS
  1727. + m_cxIcon,
  1728. rcBtn.top + nOffset + m_cyIcon
  1729. );
  1730. sizeOffset.cx = m_cxIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
  1731. } // if( bHorz )
  1732. else
  1733. {
  1734. int nOffset = (rcBtn.Width() - m_cxIcon) / 2;
  1735. rcStart.SetRect(
  1736. rcBtn.left + nOffset,
  1737. rcBtn.top + __GAP_BETWEEN_WND_RIGHT_BUTTONS,
  1738. rcBtn.left + nOffset + m_cxIcon,
  1739. rcBtn.top + __GAP_BETWEEN_WND_RIGHT_BUTTONS
  1740. + m_cxIcon
  1741. );
  1742. sizeOffset.cy = m_cyIcon+__GAP_BETWEEN_WND_RIGHT_BUTTONS;
  1743. } // else from if( bHorz )
  1744. if( m_bBtnHelp )
  1745. {
  1746. m_rcBtnHelp = rcStart;
  1747. rcStart.OffsetRect(sizeOffset);
  1748. }
  1749. if( m_bBtnMinimize )
  1750. {
  1751. m_rcBtnMinimize = rcStart;
  1752. rcStart.OffsetRect(sizeOffset);
  1753. m_rcBtnRestore = rcStart;
  1754. rcStart.OffsetRect(sizeOffset);
  1755. }
  1756. if( m_bBtnMaximize && (! m_bBtnMinimize ) )
  1757. {
  1758. m_rcBtnMaximize = rcStart;
  1759. rcStart.OffsetRect(sizeOffset);
  1760. }
  1761. if( m_bBtnClose )
  1762. m_rcBtnClose = rcStart;
  1763. }
  1764. CSize CExtBarMdiRightButton::CalculateLayout(
  1765. CDC & dc,
  1766. CSize sizePreCalc,
  1767. BOOL bHorz
  1768. )
  1769. {
  1770. ASSERT_VALID( this );
  1771. dc;
  1772. ASSERT_VALID( GetBar() );
  1773. ASSERT( GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) );
  1774. ASSERT_VALID( (&dc) );
  1775. ASSERT( CtrlGet() == NULL );
  1776. // ASSERT( ! IsSeparator() );
  1777. if( ( ! IsVisible() )
  1778. || ( GetStyle() & TBBS_HIDDEN ) != 0
  1779. )
  1780. {
  1781. m_ActiveSize.cx = m_ActiveSize.cy = 0;
  1782. return m_ActiveSize;
  1783. }
  1784. CExtMenuControlBar * pBar =
  1785. STATIC_DOWNCAST(
  1786. CExtMenuControlBar,
  1787. GetBar()
  1788. );
  1789. ASSERT_VALID( pBar );
  1790. MdiMenuBarRightButtonsInfo_t _info;
  1791. pBar->_GetMdiMenuBarRightButtonsInfo( _info, this, bHorz );
  1792. //ASSERT( _info.m_bInitialized );
  1793. if( !_info.m_bInitialized )
  1794. return CSize( 1, 1 );
  1795. CSize _size( _info.m_calcSize );
  1796. if( bHorz )
  1797. {
  1798. if( _size.cy < sizePreCalc.cy )
  1799. _size.cy = sizePreCalc.cy;
  1800. }
  1801. else
  1802. {
  1803. if( _size.cx < sizePreCalc.cx )
  1804. _size.cx = sizePreCalc.cx;
  1805. }
  1806. m_ActiveSize = _size;
  1807. return _size;
  1808. }
  1809. void CExtBarMdiRightButton::PaintCompound(
  1810. CDC & dc,
  1811. bool bPaintParentChain,
  1812. bool bPaintChildren,
  1813. bool bPaintOneNearestChildrenLevelOnly
  1814. )
  1815. {
  1816. ASSERT_VALID( GetBar() );
  1817. ASSERT( GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) );
  1818. ASSERT_VALID( (&dc) );
  1819. ASSERT( CtrlGet() == NULL );
  1820. // ASSERT( ! IsSeparator() );
  1821. if( ! IsPaintAble( dc ) )
  1822. return;
  1823. if( AnimationClient_StatePaint( dc ) )
  1824. return;
  1825. if( bPaintParentChain )
  1826. PaintParentChain( dc );
  1827. CExtMenuControlBar * pBar =
  1828. DYNAMIC_DOWNCAST(
  1829. CExtMenuControlBar,
  1830. GetBar()
  1831. );
  1832. ASSERT_VALID( pBar );
  1833. MdiMenuBarRightButtonsInfo_t _info;
  1834. bool bHorz = IsHorzBarOrientation();
  1835. pBar->_GetMdiMenuBarRightButtonsInfo( _info, this, bHorz );
  1836. if( ! _info.m_bInitialized )
  1837. return;
  1838. CRect rcTBB = Rect();
  1839. _info.InitLocations( rcTBB, bHorz );
  1840. CPoint ptCursor( 0, 0 );
  1841. ::GetCursorPos(&ptCursor);
  1842. pBar->ScreenToClient( &ptCursor );
  1843. bool bFlat = true;
  1844. bool bDrawBorder = true;
  1845. int eAlign =
  1846. CExtPaintManager::__ALIGN_HORIZ_CENTER
  1847. | CExtPaintManager::__ALIGN_VERT_CENTER;
  1848. bool bEnabled = IsEnabled() ? true : false;
  1849. bool bChecked =
  1850. ( (GetStyle()&TBBS_CHECKED) != 0 ) 
  1851. ? true 
  1852. : false;
  1853. if( _info.m_bBtnHelp )
  1854. {
  1855. bool bHover =
  1856. (IsHover() && _info.m_rcBtnHelp.PtInRect(ptCursor))
  1857. ? true : false;
  1858. bool bPushed =
  1859. (IsPressed() && _info.m_rcBtnHelp.PtInRect(ptCursor))
  1860. ? true : false;
  1861. CExtPaintManager::PAINTPUSHBUTTONDATA _ppbdCtxHelp(
  1862. this,
  1863. bHorz ? true : false,
  1864. _info.m_rcBtnHelp,_T(""),NULL,bFlat,
  1865. bHover, bPushed, false, bEnabled,
  1866. bDrawBorder,false,false,eAlign,
  1867. NULL, false, SC_CONTEXTHELP,
  1868. (!bEnabled) || ( bEnabled && (!bHover) && (!bPushed) )
  1869. );
  1870. _ppbdCtxHelp.m_bChecked = bChecked;
  1871. _ppbdCtxHelp.m_nIconAlignment = CExtPaintManager::__ALIGN_HORIZ_CENTER | CExtPaintManager::__ALIGN_VERT_CENTER;
  1872. pBar->PmBridge_GetPM()->PaintPushButtonMdiRight( dc, _ppbdCtxHelp );
  1873. }
  1874. if( _info.m_bBtnMinimize )
  1875. {
  1876. bool bHover =
  1877. (IsHover() && _info.m_rcBtnRestore.PtInRect(ptCursor))
  1878. ? true : false;
  1879. bool bPushed =
  1880. (IsPressed() && _info.m_rcBtnRestore.PtInRect(ptCursor))
  1881. ? true : false;
  1882. CExtPaintManager::PAINTPUSHBUTTONDATA _ppbdRestore(
  1883. this,
  1884. bHorz ? true : false,
  1885. _info.m_rcBtnRestore,_T(""),NULL,bFlat,
  1886. bHover, bPushed, false, bEnabled,
  1887. bDrawBorder,false,false,eAlign,
  1888. NULL, false, SC_RESTORE,
  1889. (!bEnabled) || ( bEnabled && (!bHover) && (!bPushed) )
  1890. );
  1891. _ppbdRestore.m_bChecked = bChecked;
  1892. pBar->PmBridge_GetPM()->PaintPushButtonMdiRight( dc, _ppbdRestore );
  1893. bHover =
  1894. (IsHover() && _info.m_rcBtnMinimize.PtInRect(ptCursor))
  1895. ? true : false;
  1896. bPushed =
  1897. (IsPressed() && _info.m_rcBtnMinimize.PtInRect(ptCursor))
  1898. ? true : false;
  1899. CExtPaintManager::PAINTPUSHBUTTONDATA _ppbdMinimize(
  1900. this,
  1901. bHorz ? true : false,
  1902. _info.m_rcBtnMinimize,_T(""),NULL,bFlat,
  1903. bHover, bPushed, false, bEnabled,
  1904. bDrawBorder,false,false,eAlign,
  1905. NULL, false, SC_MINIMIZE,
  1906. (!bEnabled) || ( bEnabled && (!bHover) && (!bPushed) )
  1907. );
  1908. _ppbdMinimize.m_bChecked = bChecked;
  1909. pBar->PmBridge_GetPM()->PaintPushButtonMdiRight( dc, _ppbdMinimize );
  1910. }
  1911. if( _info.m_bBtnMaximize && !_info.m_bBtnMinimize )
  1912. {
  1913. bool bHover =
  1914. (IsHover() && _info.m_rcBtnMaximize.PtInRect(ptCursor))
  1915. ? true : false;
  1916. bool bPushed =
  1917. (IsPressed() && _info.m_rcBtnMaximize.PtInRect(ptCursor))
  1918. ? true : false;
  1919. CExtPaintManager::PAINTPUSHBUTTONDATA _ppbdMaximize(
  1920. this,
  1921. bHorz ? true : false,
  1922. _info.m_rcBtnMaximize,_T(""),NULL,bFlat,
  1923. bHover, bPushed, false, bEnabled,
  1924. bDrawBorder,false,false,eAlign,
  1925. NULL, false, SC_MAXIMIZE,
  1926. (!bEnabled) || ( bEnabled && (!bHover) && (!bPushed) )
  1927. );
  1928. _ppbdMaximize.m_bChecked = bChecked;
  1929. pBar->PmBridge_GetPM()->PaintPushButtonMdiRight( dc, _ppbdMaximize );
  1930. }
  1931. if( _info.m_bBtnClose )
  1932. {
  1933. bool bHover =
  1934. (IsHover() && _info.m_rcBtnClose.PtInRect(ptCursor))
  1935. ? true : false;
  1936. bool bPushed =
  1937. (IsPressed() && _info.m_rcBtnClose.PtInRect(ptCursor))
  1938. ? true : false;
  1939. CExtPaintManager::PAINTPUSHBUTTONDATA _ppbdClose(
  1940. this,
  1941. bHorz ? true : false,
  1942. _info.m_rcBtnClose,_T(""),NULL,bFlat,
  1943. bHover, bPushed, false, bEnabled,
  1944. bDrawBorder,false,false,eAlign,
  1945. NULL, false, SC_CLOSE,
  1946. (!bEnabled) || ( bEnabled && (!bHover) && (!bPushed) )
  1947. );
  1948. _ppbdClose.m_bChecked = bChecked;
  1949. pBar->PmBridge_GetPM()->PaintPushButtonMdiRight( dc, _ppbdClose );
  1950. }
  1951. if( bPaintChildren )
  1952. PaintChildren( dc, bPaintOneNearestChildrenLevelOnly );
  1953. }
  1954. UINT CExtBarMdiRightButton::OnTrackPopup(
  1955. CPoint point,
  1956. bool bSelectAny,
  1957. bool bForceNoAnimation
  1958. )
  1959. {
  1960. point;
  1961. bSelectAny;
  1962. bForceNoAnimation;
  1963. return UINT( -1L );
  1964. }
  1965. void CExtBarMdiRightButton::OnClick(
  1966. CPoint point,
  1967. bool bDown
  1968. )
  1969. {
  1970. bool bDockSiteCustomizeMode =
  1971. GetBar()->_IsDockSiteCustomizeMode();
  1972. if( bDockSiteCustomizeMode )
  1973. return;
  1974. if( bDown )
  1975. return;
  1976. // CExtMouseCaptureSink::ReleaseCapture();
  1977. ASSERT_VALID( GetBar() );
  1978. ASSERT( GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) );
  1979. ASSERT( CtrlGet() == NULL );
  1980. ASSERT( ! IsSeparator() );
  1981. CExtMenuControlBar * pBar =
  1982. DYNAMIC_DOWNCAST(
  1983. CExtMenuControlBar,
  1984. GetBar()
  1985. );
  1986. ASSERT_VALID( pBar );
  1987. BOOL bHorz = !pBar->IsDockedVertically();
  1988. MdiMenuBarRightButtonsInfo_t _info;
  1989. pBar->_GetMdiMenuBarRightButtonsInfo( _info, this, bHorz );
  1990. if( !_info.m_bInitialized )
  1991. return;
  1992. _info.InitLocations( Rect(), bHorz );
  1993. bool bInstallHideFlag = false;
  1994. UINT nHelperSysCmdID = 0;
  1995. if( _info.m_bBtnHelp
  1996. && _info.m_rcBtnHelp.PtInRect(point)
  1997. )
  1998. nHelperSysCmdID = SC_CONTEXTHELP;
  1999. else if( _info.m_bBtnMinimize
  2000. && _info.m_rcBtnRestore.PtInRect(point)
  2001. )
  2002. {
  2003. nHelperSysCmdID = SC_RESTORE;
  2004. bInstallHideFlag = true;
  2005. }
  2006. else if( _info.m_bBtnMinimize
  2007. && _info.m_rcBtnMinimize.PtInRect(point)
  2008. )
  2009. {
  2010. nHelperSysCmdID = SC_MINIMIZE;
  2011. bInstallHideFlag = true;
  2012. }
  2013. else if( _info.m_bBtnMaximize && !_info.m_bBtnMinimize
  2014. && _info.m_rcBtnMaximize.PtInRect(point)
  2015. )
  2016. nHelperSysCmdID = SC_MAXIMIZE;
  2017. else if( _info.m_bBtnClose
  2018. && _info.m_rcBtnClose.PtInRect(point)
  2019. )
  2020. nHelperSysCmdID = SC_CLOSE;
  2021. if( nHelperSysCmdID == 0 )
  2022. return;
  2023. HWND hWndActiveChild = _ActiveMdiChildWndGet();
  2024. if( hWndActiveChild == NULL )
  2025. return;
  2026. ASSERT( ::IsWindow( hWndActiveChild ) );
  2027. if( bInstallHideFlag )
  2028. {
  2029. Show( FALSE );
  2030. ASSERT( GetBar()->GetButtonsCount() > 0 );
  2031. CExtBarButton * pTBB = GetBar()->GetButton( 0 );
  2032. ASSERT_VALID( pTBB );
  2033. if( pTBB->IsVisible()
  2034. && pTBB->IsKindOf( RUNTIME_CLASS(CExtBarMdiDocButton) )
  2035. )
  2036. {
  2037. pTBB->Show( FALSE );
  2038. }
  2039. // GetBar()->Invalidate();
  2040. // GetBar()->UpdateWindow();
  2041. // GetBar()->GetParentFrame()->DelayRecalcLayout();
  2042. }
  2043. if( nHelperSysCmdID == SC_MAXIMIZE )
  2044. {
  2045. HWND hWndMdiClientArea =
  2046. ::GetParent( hWndActiveChild );
  2047. ASSERT( hWndMdiClientArea != NULL );
  2048. ASSERT( ::IsWindow( hWndMdiClientArea ) );
  2049. ::PostMessage(
  2050. hWndMdiClientArea,
  2051. WM_MDIRESTORE,
  2052. (WPARAM)hWndActiveChild,
  2053. 0
  2054. );
  2055. } // if( nHelperSysCmdID == SC_MAXIMIZE )
  2056. else
  2057. {
  2058. pBar->ClientToScreen( &point );
  2059. pBar->_DelayUpdateMenuBar();
  2060. ::SendMessage(
  2061. hWndActiveChild,
  2062. WM_SYSCOMMAND,
  2063. nHelperSysCmdID,
  2064. MAKELONG( point.x, point.y )
  2065. );
  2066. } // else
  2067. }
  2068. bool CExtBarMdiRightButton::OnDblClick(
  2069. CPoint point
  2070. )
  2071. {
  2072. ASSERT_VALID( this );
  2073. ASSERT_VALID( GetBar() );
  2074. point;
  2075. return false;
  2076. }
  2077. __EXT_MFC_INT_PTR CExtBarMdiRightButton::OnToolHitTest(
  2078. CPoint point,
  2079. TOOLINFO * pTI
  2080. )
  2081. {
  2082. ASSERT_VALID( this );
  2083. ASSERT_VALID( GetBar() );
  2084. ASSERT( GetBar()->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) );
  2085. ASSERT( CtrlGet() == NULL );
  2086. ASSERT( ! IsSeparator() );
  2087. CExtMenuControlBar * pBar =
  2088. DYNAMIC_DOWNCAST(
  2089. CExtMenuControlBar,
  2090. GetBar()
  2091. );
  2092. ASSERT_VALID( pBar );
  2093. BOOL bHorz = !pBar->IsDockedVertically();
  2094. MdiMenuBarRightButtonsInfo_t _info;
  2095. pBar->_GetMdiMenuBarRightButtonsInfo( _info, this, bHorz );
  2096. if( !_info.m_bInitialized )
  2097. return -1;
  2098. _info.InitLocations( Rect(), bHorz );
  2099. if( _info.m_bBtnHelp
  2100. && _info.m_rcBtnHelp.PtInRect(point)
  2101. )
  2102. {
  2103. if( pTI != NULL )
  2104. {
  2105. ::CopyRect(
  2106. &(pTI->rect),
  2107. &_info.m_rcBtnHelp
  2108. );
  2109. CExtSafeString str;
  2110. if( g_ResourceManager->LoadString( str, ID_CONTEXT_HELP ) )
  2111. pTI->lpszText = (LPTSTR)
  2112. ::calloc( (str.GetLength() + 1), sizeof(TCHAR) );
  2113. if( pTI->lpszText != NULL )
  2114. __EXT_MFC_STRCPY( pTI->lpszText, str.GetLength() + 1, str );
  2115. else
  2116. pTI->lpszText = LPSTR_TEXTCALLBACK;
  2117. }
  2118. return ((__EXT_MFC_INT_PTR)ID_CONTEXT_HELP);
  2119. }
  2120. if( _info.m_bBtnMinimize
  2121. && _info.m_rcBtnRestore.PtInRect(point)
  2122. )
  2123. {
  2124. if( pTI != NULL )
  2125. {
  2126. ::CopyRect(
  2127. &(pTI->rect),
  2128. &_info.m_rcBtnRestore
  2129. );
  2130. CExtSafeString str;
  2131. if( g_ResourceManager->LoadString( str, AFX_IDS_SCRESTORE ) )
  2132. pTI->lpszText = (LPTSTR)
  2133. ::calloc( (str.GetLength() + 1), sizeof(TCHAR) );
  2134. if( pTI->lpszText != NULL )
  2135. __EXT_MFC_STRCPY( pTI->lpszText, str.GetLength() + 1, str );
  2136. else
  2137. pTI->lpszText = LPSTR_TEXTCALLBACK;
  2138. }
  2139. return ((int)AFX_IDS_SCRESTORE);
  2140. }
  2141. if( _info.m_bBtnMinimize
  2142. && _info.m_rcBtnMinimize.PtInRect(point)
  2143. )
  2144. {
  2145. if( pTI != NULL )
  2146. {
  2147. ::CopyRect(
  2148. &(pTI->rect),
  2149. &_info.m_rcBtnMinimize
  2150. );
  2151. CExtSafeString str;
  2152. if( g_ResourceManager->LoadString( str, AFX_IDS_SCMINIMIZE ) )
  2153. pTI->lpszText = (LPTSTR)
  2154. ::calloc( (str.GetLength() + 1), sizeof(TCHAR) );
  2155. if( pTI->lpszText != NULL )
  2156. __EXT_MFC_STRCPY( pTI->lpszText, str.GetLength() + 1, str );
  2157. else
  2158. pTI->lpszText = LPSTR_TEXTCALLBACK;
  2159. }
  2160. return ((__EXT_MFC_INT_PTR)AFX_IDS_SCMINIMIZE);
  2161. }
  2162. if( _info.m_bBtnMaximize && !_info.m_bBtnMinimize
  2163. && _info.m_rcBtnMaximize.PtInRect(point)
  2164. )
  2165. {
  2166. if( pTI != NULL )
  2167. {
  2168. ::CopyRect(
  2169. &(pTI->rect),
  2170. &_info.m_rcBtnMaximize
  2171. );
  2172. CExtSafeString str;
  2173. if( g_ResourceManager->LoadString( str, AFX_IDS_SCMAXIMIZE ) )
  2174. pTI->lpszText = (LPTSTR)
  2175. ::calloc( (str.GetLength() + 1), sizeof(TCHAR) );
  2176. if( pTI->lpszText != NULL )
  2177. __EXT_MFC_STRCPY( pTI->lpszText, str.GetLength() + 1, str );
  2178. else
  2179. pTI->lpszText = LPSTR_TEXTCALLBACK;
  2180. }
  2181. return ((__EXT_MFC_INT_PTR)AFX_IDS_SCMAXIMIZE);
  2182. }
  2183. if( _info.m_bBtnClose
  2184. && _info.m_rcBtnClose.PtInRect(point)
  2185. )
  2186. {
  2187. if( pTI != NULL )
  2188. {
  2189. ::CopyRect(
  2190. &(pTI->rect),
  2191. &_info.m_rcBtnClose
  2192. );
  2193. CExtSafeString str;
  2194. if( g_ResourceManager->LoadString( str, AFX_IDS_SCCLOSE ) )
  2195. pTI->lpszText = (LPTSTR)
  2196. ::calloc( (str.GetLength() + 1), sizeof(TCHAR) );
  2197. if( pTI->lpszText != NULL )
  2198. __EXT_MFC_STRCPY( pTI->lpszText, str.GetLength() + 1, str );
  2199. else
  2200. pTI->lpszText = LPSTR_TEXTCALLBACK;
  2201. }
  2202. return ((__EXT_MFC_INT_PTR)AFX_IDS_SCCLOSE);
  2203. }
  2204. return -1;
  2205. }
  2206. bool CExtBarMdiRightButton::CanStartCommandDrag()
  2207. {
  2208. ASSERT_VALID( this );
  2209. return false;
  2210. }
  2211. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2212. CExtCustomizeCmdTreeNode * CExtBarMdiRightButton::GetCmdNode(
  2213. bool bInitial // = false
  2214. )
  2215. {
  2216. ASSERT_VALID( this );
  2217. // ASSERT_VALID( GetBar() );
  2218. // bInitial;
  2219. // ASSERT( m_pCmdNodeI == NULL );
  2220. // ASSERT( m_pCmdNodeC == NULL );
  2221. // return NULL;
  2222. return CExtBarMdiDocButton::GetCmdNode( bInitial );
  2223. }
  2224. void CExtBarMdiRightButton::SetBasicCmdNode(
  2225. CExtCustomizeCmdTreeNode * pNode
  2226. )
  2227. {
  2228. ASSERT_VALID( this );
  2229. // ASSERT_VALID( GetBar() );
  2230. // ASSERT( m_pCmdNodeI == NULL );
  2231. // ASSERT( m_pCmdNodeC == NULL );
  2232. // ASSERT( FALSE ); // should be never called
  2233. // pNode;
  2234. CExtBarMdiDocButton::SetBasicCmdNode( pNode );
  2235. }
  2236. void CExtBarMdiRightButton::SetCustomizedCmdNode(
  2237. CExtCustomizeCmdTreeNode * pNode
  2238. )
  2239. {
  2240. ASSERT_VALID( this );
  2241. // ASSERT_VALID( GetBar() );
  2242. // ASSERT( m_pCmdNodeI == NULL );
  2243. // ASSERT( m_pCmdNodeC == NULL );
  2244. // ASSERT( FALSE ); // should be never called
  2245. // pNode;
  2246. CExtBarMdiDocButton::SetCustomizedCmdNode( pNode );
  2247. }
  2248. CExtCustomizeCmdTreeNode * CExtBarMdiRightButton::OnCustomizeNodeInit(
  2249. CExtCustomizeSite * pSite,
  2250. CExtCustomizeCmdTreeNode * pParentNode // toolbar node
  2251. )
  2252. {
  2253. ASSERT_VALID( this );
  2254. // ASSERT_VALID( GetBar() );
  2255. // ASSERT( pSite != NULL );
  2256. // ASSERT_VALID( pParentNode );
  2257. // pSite;
  2258. // pParentNode;
  2259. // return NULL; // no customization support
  2260. return CExtBarMdiDocButton::OnCustomizeNodeInit( pSite, pParentNode );
  2261. }
  2262. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2263. bool CExtBarMdiRightButton::OnQueryFlatTrackingEnabled() const
  2264. {
  2265. ASSERT_VALID( this );
  2266. return false;
  2267. }
  2268. LRESULT CExtBarMdiRightButton::OnHelpHitTest(
  2269. CPoint point
  2270. )
  2271. {
  2272. ASSERT_VALID( this );
  2273. return (LRESULT)OnToolHitTest(point,NULL);
  2274. }
  2275. void CExtMenuControlBar::_KillFrameMenu()
  2276. {
  2277. if( m_bPresubclassDialogMode )
  2278. return;
  2279. if( IsOleIpObjActive() )
  2280. return;
  2281. CFrameWnd * pFrame = _GetDockingFrameImpl();
  2282. ASSERT_VALID( pFrame );
  2283. HWND hWndFrame = pFrame->GetSafeHwnd();
  2284. ASSERT( hWndFrame != NULL );
  2285. ASSERT( ::IsWindow(hWndFrame) );
  2286. HMENU hFrameRealMenu = ::GetMenu( hWndFrame );
  2287. if( hFrameRealMenu == NULL )
  2288. return;
  2289. ::SetMenu( hWndFrame, NULL );
  2290. _DelayUpdateMenuBar();
  2291. }
  2292. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2293. void CExtMenuControlBar::OnCustomizeModeEnter()
  2294. {
  2295. ASSERT_VALID( this );
  2296. CExtToolControlBar::OnCustomizeModeEnter();
  2297. }
  2298. void CExtMenuControlBar::OnCustomizeModeLeave()
  2299. {
  2300. ASSERT_VALID( this );
  2301. CExtToolControlBar::OnCustomizeModeLeave();
  2302. }
  2303. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2304. void CExtMenuControlBar::PreSubclassWindow() 
  2305. {
  2306. CExtToolControlBar::PreSubclassWindow();
  2307. m_bHelperTrackingCharCode = false;
  2308. if( m_bPresubclassDialogMode && m_hWndHelper == NULL )
  2309. {
  2310. m_hWndHelper = ::GetParent( m_hWnd );
  2311. if( m_hWndHelper != NULL )
  2312. {
  2313. ASSERT( ::IsWindow( m_hWndHelper ) );
  2314. if( !IsHookedWindow( m_hWndHelper ) )
  2315. SetupHookWndSink( m_hWndHelper );
  2316. }
  2317. } // if( m_bPresubclassDialogMode && m_hWndHelper == NULL )
  2318. }
  2319. BOOL CExtMenuControlBar::PreTranslateMessage(MSG* pMsg) 
  2320. {
  2321. if( m_bPresubclassDialogMode )
  2322. {
  2323. if( TranslateMainFrameMessage(pMsg) )
  2324. return TRUE;
  2325. }
  2326. return CExtToolControlBar::PreTranslateMessage(pMsg);
  2327. }
  2328. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2329. CExtCustomizeSite::CCmdMenuInfo * CExtMenuControlBar::MenuInfoGet()
  2330. {
  2331. ASSERT_VALID( this );
  2332. return m_pMenuInfo;
  2333. }
  2334. CExtCustomizeSite::CCmdMenuInfo * CExtMenuControlBar::MenuInfoDetach()
  2335. {
  2336. ASSERT_VALID( this );
  2337. CExtCustomizeSite::CCmdMenuInfo * pMenuInfo = m_pMenuInfo;
  2338. m_pMenuInfo = NULL;
  2339. return pMenuInfo;
  2340. }
  2341. CExtCustomizeSite::CCmdMenuInfo * CExtMenuControlBar::MenuInfoAttach(
  2342. CExtCustomizeSite::CCmdMenuInfo * pMenuInfo
  2343. )
  2344. {
  2345. ASSERT_VALID( this );
  2346. CExtCustomizeSite::CCmdMenuInfo * pMenuInfoOld = m_pMenuInfo;
  2347. m_pMenuInfo = pMenuInfo;
  2348. return pMenuInfoOld;
  2349. }
  2350. void CExtMenuControlBar::MenuInfoUpdate()
  2351. {
  2352. ASSERT_VALID( this );
  2353. CExtCustomizeSite * pSite =
  2354. GetCustomizeSite();
  2355. if( pSite == NULL )
  2356. return;
  2357. CExtCustomizeSite::CCmdMenuInfo * pMenuInfo =
  2358. pSite->MenuInfoFindForMenuBar();
  2359. if( ((LPVOID)pMenuInfo) != ((LPVOID)MenuInfoGet()) )
  2360. MenuInfoAttach( pMenuInfo );
  2361. }
  2362. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2363. void CExtMenuControlBar::SetMdiWindowPopupName(
  2364. __EXT_MFC_SAFE_LPCTSTR sMdiWindowPopupName // = NULL
  2365. )
  2366. {
  2367. ASSERT_VALID( this );
  2368. m_sMdiWindowPopupName =
  2369. ( sMdiWindowPopupName != NULL )
  2370. ? sMdiWindowPopupName
  2371. : _T("")
  2372. ;
  2373. m_sMdiWindowPopupName.TrimLeft();
  2374. m_sMdiWindowPopupName.TrimRight();
  2375. while( m_sMdiWindowPopupName.Replace( _T("&"), _T("") ) > 0 )
  2376. {
  2377. m_sMdiWindowPopupName.TrimLeft();
  2378. m_sMdiWindowPopupName.TrimRight();
  2379. }
  2380. }