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

界面编程

开发平台:

Visual C++

  1. // This is part of the Professional User Interface Suite library.
  2. // Copyright (C) 2001-2009 FOSS Software, Inc.
  3. // All rights reserved.
  4. //
  5. // http://www.prof-uis.com
  6. // mailto:support@prof-uis.com
  7. //
  8. // This source code can be used, modified and redistributed
  9. // under the terms of the license agreement that is included
  10. // in the Professional User Interface Suite package.
  11. //
  12. // Warranties and Disclaimers:
  13. // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
  14. // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  16. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
  17. // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
  18. // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
  19. // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
  20. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  21. #include "stdafx.h"
  22. #if _MFC_VER < 0x700
  23. #include <../src/AfxImpl.h>
  24. #else
  25. #include <../src/mfc/AfxImpl.h>
  26. #endif
  27. #if (!defined __EXT_MENUCONTROLBAR_H)
  28. #include <ExtMenuControlBar.h>
  29. #endif
  30. #if (!defined __EXT_POPUP_MENU_WND_H)
  31. #include <ExtPopupMenuWnd.h>
  32. #endif
  33. #if (!defined __EXT_PAINT_MANAGER_H)
  34. #include <ExtPaintManager.h>
  35. #endif
  36. #if (!defined __EXTDOCKBAR_H)
  37. #include "ExtDockBar.h"
  38. #endif
  39. #if( !defined __EXTMINIDOCKFRAMEWND_H)
  40. #include "ExtMiniDockFrameWnd.h"
  41. #endif
  42. #if (!defined __ExtCmdManager_H)
  43. #include <ExtCmdManager.h>
  44. #endif
  45. #if (!defined __EXT_MEMORY_DC_H)
  46. #include <../Src/ExtMemoryDC.h>
  47. #endif
  48. #if (!defined __EXT_LOCALIZATION_H)
  49. #include <../Src/ExtLocalization.h>
  50. #endif
  51. //#if (!defined __EXT_MFC_NO_RIBBON_BAR)
  52. // #if (!defined __EXT_RIBBON_BAR_H)
  53. // #include <ExtRibbonBar.h>
  54. // #endif // (!defined __EXT_RIBBON_BAR_H)
  55. //#endif
  56. #include <Resources/Resource.h>
  57. #ifdef _DEBUG
  58. #define new DEBUG_NEW
  59. #undef THIS_FILE
  60. static char THIS_FILE[] = __FILE__;
  61. #endif
  62. #define __MENUBAR_RIGHT_ADJUST_GAP 1
  63. bool CExtMenuControlBar::g_bHideMenuBarExpandContentButton = false;
  64. bool CExtMenuControlBar::g_bCancelNearestAltUp = false;
  65. bool CExtMenuControlBar::g_bKeyCodeTracking = false;
  66. const UINT CExtMenuControlBar::g_nMsgPrepareSystemMenu =
  67. ::RegisterWindowMessage(
  68. _T("CExtMenuControlBar::g_nMsgPrepareSystemMenu")
  69. );
  70. bool CExtMenuControlBar::g_bTranslateContextHelpCmd = false;
  71. ACCEL CExtMenuControlBar::g_accelContextHelp = { FVIRTKEY, VK_F1, ID_HELP };
  72. /////////////////////////////////////////////////////////////////////////////
  73. // CExtMenuControlBar hook sink
  74. bool CExtMenuControlBar::OnHookWndMsg(
  75. LRESULT & lResult,
  76. HWND hWndHooked,
  77. UINT nMessage,
  78. WPARAM & wParam,
  79. LPARAM & lParam
  80. )
  81. {
  82. __PROF_UIS_MANAGE_STATE;
  83. if( GetSafeHwnd() == NULL
  84. || CWnd::FromHandlePermanent(GetSafeHwnd()) == NULL
  85. || _DraggingGetBar() != NULL
  86. )
  87. return 
  88. CExtHookSink::OnHookWndMsg(
  89. lResult,
  90. hWndHooked,
  91. nMessage,
  92. wParam,
  93. lParam
  94. );
  95. HWND hWndMainFrame = NULL;
  96. CWnd * pWndForPlacement = NULL;
  97. if( ! m_bPresubclassDialogMode )
  98. {
  99. hWndMainFrame = _GetHwndMainFrame();
  100. if( hWndMainFrame != NULL )
  101. pWndForPlacement = stat_GetWndForPlacement( CWnd::FromHandle(hWndMainFrame) );
  102. } // if( ! m_bPresubclassDialogMode )
  103. if( ( (!m_bPresubclassDialogMode)
  104. && ( ( hWndMainFrame != NULL
  105. && hWndHooked == hWndMainFrame
  106. )
  107. || ( pWndForPlacement != NULL
  108. && hWndHooked == pWndForPlacement->m_hWnd
  109. )
  110. )
  111. )
  112. || ( m_bPresubclassDialogMode
  113. && hWndHooked == _GetHwndPlacement()
  114. )
  115. )
  116. { // if window is a main frame or parent dialog-like
  117. if( nMessage == WM_PARENTNOTIFY
  118. &&
  119. CExtPopupMenuWnd::IsMenuTracking()
  120. )
  121. {
  122. lResult = 0;
  123. return true;
  124. }
  125. // if( nMessage == WM_INITMENU )
  126. // {
  127. // CFrameWnd * pFrame = _GetDockingFrameImpl();
  128. // if( pFrame != NULL )
  129. // {
  130. // HMENU hSysMenu = ::GetSystemMenu( hWndHooked, FALSE );
  131. // HMENU hCurMenu = GetSubMenu( (HMENU)wParam, 0 );
  132. // CPoint ptCursor;
  133. // if( hCurMenu == hSysMenu
  134. // && hCurMenu != NULL
  135. // && ::GetCursorPos(&ptCursor)
  136. // )
  137. // {
  138. // ::SetForegroundWindow( hWndHooked ); 
  139. // if( TrackMainFrameSystemMenu( &ptCursor, FALSE ) )
  140. // return true;
  141. // }
  142. // } // if( pFrame != NULL )
  143. // } // if( nMessage == WM_INITMENU )
  144. // if( nMessage == WM_INITMENU )
  145. // {
  146. // CFrameWnd * pFrame = _GetDockingFrameImpl();
  147. // if( pFrame != NULL )
  148. // {
  149. // HMENU hSysMenu = ::GetSystemMenu( hWndHooked, FALSE );
  150. // HMENU hCurMenu = GetSubMenu( (HMENU)wParam, 0 );
  151. // if( hCurMenu == hSysMenu
  152. // && hCurMenu != NULL
  153. // )
  154. // {
  155. // CMenu * pSysMenu = CMenu::FromHandle( hSysMenu );
  156. // UINT nEnable = 
  157. // CExtPopupMenuWnd::g_bFullScreenMode
  158. // ? MF_GRAYED
  159. // : MF_ENABLED
  160. // ;
  161. // pSysMenu->EnableMenuItem( 
  162. // SC_MOVE,
  163. // nEnable|MF_BYCOMMAND
  164. // ); 
  165. // pSysMenu->EnableMenuItem( 
  166. // SC_SIZE,
  167. // nEnable|MF_BYCOMMAND
  168. // ); 
  169. // pSysMenu->EnableMenuItem( 
  170. // SC_MAXIMIZE,
  171. // nEnable|MF_BYCOMMAND
  172. // ); 
  173. // }
  174. // } // if( pFrame != NULL )
  175. // } // if( nMessage == WM_INITMENU )
  176. if( nMessage == WM_SIZE
  177. || nMessage == WM_ACTIVATEAPP
  178. || ( nMessage == WM_COMMAND
  179. && ( ((HIWORD(wParam))==0)
  180. || ((HIWORD(wParam))==1)
  181. )
  182. )
  183. || nMessage == WM_SYSCOMMAND
  184. )
  185. {
  186. m_bHelperTrackingCharCode = false;
  187. if( _IsNonCommandButtonMode() )
  188. return
  189. CExtHookSink::OnHookWndMsg(
  190. lResult,
  191. hWndHooked,
  192. nMessage,
  193. wParam,
  194. lParam
  195. );
  196. HWND hWndCapture = CExtMouseCaptureSink::GetCapture();
  197. if( hWndCapture == GetSafeHwnd() )
  198. CExtMouseCaptureSink::ReleaseCapture();
  199. else if( hWndCapture != NULL )
  200. {
  201. CWnd * pWnd = FromHandlePermanent(hWndCapture);
  202. if( pWnd != NULL
  203. && pWnd->GetSafeHwnd() != NULL
  204. && ::IsWindow( pWnd->GetSafeHwnd() )
  205. && pWnd->IsKindOf(RUNTIME_CLASS(CExtControlBar))
  206. )
  207. CExtMouseCaptureSink::ReleaseCapture();
  208. }
  209. _CancelFlatTracking();
  210. if( CExtMenuControlBar::g_bMenuTracking )
  211. CExtMenuControlBar::_CloseTrackingMenus();
  212. //if( CExtPopupMenuWnd::IsMenuTracking() )
  213. // CExtPopupMenuWnd::CancelMenuTracking();
  214. return CExtHookSink::OnHookWndMsg( lResult, hWndHooked, nMessage, wParam, lParam );
  215. }
  216. if( ! m_bPresubclassDialogMode )
  217. {
  218. // if( nMessage == WM_NCLBUTTONDBLCLK && wParam == HTSYSMENU )
  219. // {
  220. // if( hWndHooked == _GetHwndMainFrame() )
  221. // {
  222. // ::SendMessage( hWndHooked, WM_SYSCOMMAND, SC_CLOSE, lParam );
  223. // if( ::IsWindow( hWndHooked ) )
  224. // ::SendMessage( hWndHooked, WM_NCPAINT, 0, 0L );
  225. // lResult = 0L;
  226. // return true;
  227. // }
  228. // }
  229. // if( nMessage == WM_NCLBUTTONDOWN && wParam == HTSYSMENU )
  230. // {
  231. // if( hWndHooked == _GetHwndMainFrame() )
  232. // {
  233. // CExtPopupMenuWnd::CancelMenuTracking();
  234. // bool bDblClick = false;
  235. // static clock_t g_nLastClock = 0;
  236. // static HWND g_hWndLastClick = NULL;
  237. // clock_t nCurrClock = ::clock();
  238. // if( g_hWndLastClick == hWndHooked )
  239. // {
  240. // clock_t nDiff = (clock_t)::abs( nCurrClock - g_nLastClock );
  241. // clock_t nDoubleClickTime = (clock_t)::GetDoubleClickTime();
  242. // if( nDiff <= nDoubleClickTime )
  243. // bDblClick = true;
  244. // }
  245. // g_hWndLastClick = hWndHooked;
  246. // g_nLastClock = nCurrClock;
  247. // if( bDblClick )
  248. // {
  249. // ::SendMessage( hWndHooked, WM_NCLBUTTONDBLCLK, wParam, lParam );
  250. // lResult = 0;
  251. // return true;
  252. // }
  253. // if( ! m_bAllowProfMainFrameSysmenu )
  254. // return false;
  255. // }
  256. // }
  257. if( ( nMessage == WM_NCLBUTTONUP && wParam == HTSYSMENU )
  258. || ( nMessage == WM_NCRBUTTONUP && ( wParam == HTCAPTION || wParam == HTSYSMENU ) )
  259. )
  260. {
  261. CExtToolControlBar::g_bMenuTrackingExpanded = false;
  262. CPoint * pPoint = NULL, ptCursor;
  263. if( nMessage == WM_NCRBUTTONUP )
  264. {
  265. if( ! ::GetCursorPos(&ptCursor) )
  266. {
  267. lResult = 0;
  268. return true;
  269. }
  270. pPoint = &ptCursor;
  271. }
  272. if( !_IsDockSiteCustomizeMode() )
  273. {
  274. if( ! TrackMainFrameSystemMenu( pPoint, FALSE ) )
  275. return false;
  276. } // if( !_IsDockSiteCustomizeMode() )
  277. lResult = 0L;
  278. return true;
  279. }
  280. if( ( nMessage == WM_NCLBUTTONDOWN || nMessage == WM_NCRBUTTONDOWN )
  281. && wParam == HTSYSMENU
  282. )
  283. {
  284. lResult = 0;
  285. if( ( ! m_bAllowProfMainFrameSysmenu )
  286. && hWndHooked == _GetHwndMainFrame()
  287. )
  288. return false;
  289. if( (! m_bAllowProfChildFrameSysmenu )
  290. && _IsMdiApp()
  291. && hWndHooked == _GetHwndChildFrame()
  292. )
  293. return false;
  294. return true;
  295. }
  296. if( nMessage == WM_NCRBUTTONDOWN && wParam == HTCAPTION )
  297. {
  298. if( !_IsDockSiteCustomizeMode() )
  299. {
  300. CExtToolControlBar::g_bMenuTrackingExpanded = false;
  301. CPoint ptCursor;
  302. if( ::GetCursorPos(&ptCursor) )
  303. if( ! TrackMainFrameSystemMenu( &ptCursor, FALSE ) )
  304. return false;
  305. } // if( !_IsDockSiteCustomizeMode() )
  306. lResult = 0;
  307. return true;
  308. }
  309. if( nMessage == CExtPopupMenuWnd::g_nMsgNotifyMenuClosed )
  310. {
  311. m_bSysMenuTracking = false;
  312. return false;
  313. }
  314. } // if( !m_bPresubclassDialogMode )
  315. bool bPrintPreviewMode = false;
  316. if( (!m_bPresubclassDialogMode)
  317. && m_pDockSite->GetSafeHwnd() != NULL
  318. && FindPrintPreviewMode(m_pDockSite)
  319. )
  320. bPrintPreviewMode = true;
  321. if( nMessage == CExtPopupMenuWnd::g_nMsgPopupNext
  322. || nMessage == CExtPopupMenuWnd::g_nMsgPopupPrev
  323. )
  324. { // if menu next/prev popup activation messages
  325. BOOL bDummyMax = FALSE;
  326. HWND hWndMdiChild = _GetActiveMdiChildWnd(bDummyMax);
  327. int iTrackingIndex =
  328. GetMenuTrackingButton();
  329. if( (!bPrintPreviewMode) && iTrackingIndex < 0 ) // menu tracked on other bar
  330. {
  331. if( m_bSysMenuTracking )
  332. {
  333. if( nMessage == CExtPopupMenuWnd::g_nMsgPopupNext
  334. && _IsMdiApp()
  335. && hWndMdiChild != NULL
  336. && IsDisplayMdiDocumentButtons()
  337. )
  338. {
  339. ASSERT( !m_bPresubclassDialogMode );
  340. if( ! TrackChildFrameSystemMenu( NULL, TRUE ) )
  341. {
  342. if( m_bAllowProfChildFrameSysmenu )
  343. return false;
  344. int iNewTrackIndex =
  345. GetVisibleButton(
  346. iTrackingIndex,
  347. (nMessage == CExtPopupMenuWnd::g_nMsgPopupNext) ?
  348. TRUE : FALSE
  349. );
  350. if( iNewTrackIndex == iTrackingIndex )
  351. {
  352. lResult = 0; // same as tracking now
  353. return true;
  354. }
  355. TrackButtonMenu(iNewTrackIndex);
  356. }
  357. } // if( _IsMdiApp() && hWndMdiChild != NULL )
  358. else
  359. {
  360. int iNewTrackIndex =
  361. GetVisibleButton(
  362. iTrackingIndex,
  363. (nMessage == CExtPopupMenuWnd::g_nMsgPopupNext) ?
  364. TRUE : FALSE
  365. );
  366. if( iNewTrackIndex == iTrackingIndex )
  367. {
  368. lResult = 0; // same as tracking now
  369. return true;
  370. }
  371. TrackButtonMenu(iNewTrackIndex);
  372. } // else from if( _IsMdiApp() && hWndMdiChild != NULL )
  373. } // if( m_bSysMenuTracking )
  374. lResult = 0;
  375. return true;
  376. }
  377. if( nMessage == CExtPopupMenuWnd::g_nMsgPopupNext
  378. && ( !m_bPresubclassDialogMode )
  379. && iTrackingIndex == GetVisibleButton(-1,FALSE)
  380. )
  381. {
  382. if( ! _IsDockSiteCustomizeMode() )
  383. {
  384. if( (! TrackMainFrameSystemMenu( NULL, TRUE ) ) )
  385. {
  386. if( m_bAllowProfMainFrameSysmenu )
  387. return false;
  388. //int iNewTrackIndex = 0;
  389. int iNewTrackIndex =
  390. GetVisibleButton(
  391. iTrackingIndex,
  392. (nMessage == CExtPopupMenuWnd::g_nMsgPopupNext) ?
  393. TRUE : FALSE
  394. );
  395. if( bPrintPreviewMode
  396. || iNewTrackIndex == iTrackingIndex
  397. )
  398. {
  399. lResult = 0; // same as tracking now
  400. return true;
  401. }
  402. TrackButtonMenu(iNewTrackIndex);
  403. lResult = 0;
  404. return true;
  405. }
  406. } // if( ! _IsDockSiteCustomizeMode() )
  407. lResult = 0;
  408. return true;
  409. }
  410. if( nMessage == CExtPopupMenuWnd::g_nMsgPopupPrev
  411. && ( !m_bPresubclassDialogMode )
  412. && iTrackingIndex == 0
  413. && IsDisplayMdiDocumentButtons()
  414. )
  415. {
  416. if( ! _IsDockSiteCustomizeMode() )
  417. {
  418. if( (! (_IsMdiApp() && hWndMdiChild != NULL ) )
  419. || bPrintPreviewMode
  420. || (! TrackChildFrameSystemMenu( NULL, TRUE ) )
  421. )
  422. {
  423. if( ! TrackMainFrameSystemMenu( NULL, TRUE ) )
  424. {
  425. if( m_bAllowProfMainFrameSysmenu )
  426. return false;
  427. int iNewTrackIndex =
  428. GetVisibleButton(
  429. iTrackingIndex,
  430. (nMessage == CExtPopupMenuWnd::g_nMsgPopupNext) ?
  431. TRUE : FALSE
  432. );
  433. if( bPrintPreviewMode
  434. || iNewTrackIndex == iTrackingIndex
  435. )
  436. {
  437. lResult = 0; // same as tracking now
  438. return true;
  439. }
  440. TrackButtonMenu(iNewTrackIndex);
  441. lResult = 0;
  442. return true;
  443. }
  444. }
  445. } // if( ! _IsDockSiteCustomizeMode() )
  446. lResult = 0;
  447. return true;
  448. }
  449. if( nMessage == CExtPopupMenuWnd::g_nMsgPopupNext
  450. && (!m_bPresubclassDialogMode)
  451. && _IsMdiApp()
  452. && m_bSysMenuTracking
  453. && iTrackingIndex < 0
  454. && hWndMdiChild != NULL
  455. && IsDisplayMdiDocumentButtons()
  456. && (!bPrintPreviewMode)
  457. )
  458. {
  459. if( !_IsDockSiteCustomizeMode() )
  460. if( ! TrackChildFrameSystemMenu( NULL, TRUE ) )
  461. return false;
  462. lResult = 0;
  463. return true;
  464. }
  465. int iNewTrackIndex =
  466. GetVisibleButton(
  467. iTrackingIndex,
  468. (nMessage == CExtPopupMenuWnd::g_nMsgPopupNext) ?
  469. TRUE : FALSE
  470. );
  471. if( (! IsDisplayMdiDocumentButtons() )
  472. && nMessage == CExtPopupMenuWnd::g_nMsgPopupPrev
  473. && iTrackingIndex == 0
  474. && iNewTrackIndex > 0
  475. )
  476. {
  477. if( !_IsDockSiteCustomizeMode() )
  478. if( ! TrackMainFrameSystemMenu( NULL, TRUE ) )
  479. return false;
  480. lResult = 0;
  481. return true;
  482. }
  483. if( bPrintPreviewMode
  484. || iNewTrackIndex == iTrackingIndex
  485. )
  486. {
  487. lResult = 0; // same as tracking now
  488. return true;
  489. }
  490. TrackButtonMenu(iNewTrackIndex);
  491. lResult = 0;
  492. return true;
  493. } // if menu next/prev popup activation messages
  494. if( nMessage == CExtPopupMenuWnd::g_nMsgNotifyMenuExpanded )
  495. { // if menu rarely used items was expanded
  496. CExtToolControlBar::g_bMenuTrackingExpanded = true;
  497. lResult = 0;
  498. return true;
  499. } // if menu rarely used items was expanded
  500. if( ! m_bPresubclassDialogMode )
  501. {
  502. if( nMessage == WM_STYLECHANGING
  503. || nMessage == WM_STYLECHANGED
  504. )
  505. return false;
  506. _KillFrameMenu();
  507. }
  508. } // if window is a main frame or parent dialog-like
  509. else if( (!m_bPresubclassDialogMode) && hWndHooked == _GetHwndChildFrame() )
  510. {
  511. if( nMessage == WM_PARENTNOTIFY
  512. && CExtPopupMenuWnd::IsMenuTracking()
  513. )
  514. {
  515. lResult = 0;
  516. return true;
  517. }
  518. if( nMessage == WM_SIZE
  519. || nMessage == WM_WINDOWPOSCHANGED
  520. || nMessage == WM_ACTIVATEAPP
  521. || ( nMessage == WM_COMMAND && (((HIWORD(wParam))==0)||((HIWORD(wParam))==1)) )
  522. || nMessage == WM_SYSCOMMAND
  523. )
  524. {
  525. m_bHelperTrackingCharCode = false;
  526. bool bSizePos = false;
  527. if( nMessage == WM_SIZE )
  528. bSizePos = true;
  529. else if( nMessage == WM_WINDOWPOSCHANGED )
  530. {
  531. LPWINDOWPOS lpWP = (LPWINDOWPOS)lParam;
  532. ASSERT( lpWP != NULL );
  533. if( (lpWP->flags & SWP_FRAMECHANGED) == 0 )
  534. bSizePos = true;
  535. } // else if( nMessage == WM_WINDOWPOSCHANGED )
  536. HWND hWndCapture = CExtMouseCaptureSink::GetCapture();
  537. if( hWndCapture == GetSafeHwnd() )
  538. CExtMouseCaptureSink::ReleaseCapture();
  539. else if( hWndCapture != NULL )
  540. {
  541. CWnd * pWnd = FromHandlePermanent(hWndCapture);
  542. if( pWnd != NULL
  543. && pWnd->GetSafeHwnd() != NULL
  544. && ::IsWindow( pWnd->GetSafeHwnd() )
  545. && pWnd->IsKindOf(RUNTIME_CLASS(CExtControlBar))
  546. && (! (((CExtControlBar*)pWnd)->_RowResizingGet() ) )
  547. && (! (((CExtControlBar*)pWnd)->_RowRecalcingGet() ) )
  548. )
  549. CExtMouseCaptureSink::ReleaseCapture();
  550. }
  551. _CancelFlatTracking();
  552. if( CExtMenuControlBar::g_bMenuTracking )
  553. CExtMenuControlBar::_CloseTrackingMenus();
  554. if( CExtPopupMenuWnd::IsMenuTracking() )
  555. CExtPopupMenuWnd::CancelMenuTracking();
  556. if( !bSizePos )
  557. {
  558. _KillFrameMenu();
  559. if( ( nMessage == WM_SIZE
  560. || nMessage == WM_WINDOWPOSCHANGED
  561. )
  562. && (! _IsDockSiteCustomizeMode() )
  563. )
  564. {
  565. WINDOWPLACEMENT _wp;
  566. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  567. _wp.length = sizeof(WINDOWPLACEMENT);
  568. ::GetWindowPlacement( _GetHwndChildFrame(), &_wp );
  569. if( _wp.showCmd != SW_SHOWMAXIMIZED
  570. || ( _GetButtonsCountImpl() > 0
  571. && (! _GetButtonPtr(0)->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) )
  572. && ( IsDisplayMdiDocumentButtons() )
  573. ) // MDI doc buttons not installed, but should be displayed
  574. )
  575. _DelayUpdateMenuBar();
  576. }
  577. } // if( !bSizePos )
  578. return 
  579. CExtHookSink::OnHookWndMsg(
  580. lResult,
  581. hWndHooked,
  582. nMessage,
  583. wParam,
  584. lParam
  585. );
  586. }
  587. bool bPrintPreviewMode = false;
  588. if( (!m_bPresubclassDialogMode)
  589. && m_pDockSite->GetSafeHwnd() != NULL
  590. && FindPrintPreviewMode(m_pDockSite)
  591. )
  592. bPrintPreviewMode = true;
  593. if( bPrintPreviewMode )
  594. {
  595. lResult = 0;
  596. return true;
  597. }
  598. bool bMinFrameNcLbDown = false;
  599. bool bMinFrameNcLbUp = false;
  600. if( nMessage == WM_NCLBUTTONDOWN
  601. || nMessage == WM_NCLBUTTONUP
  602. )
  603. {
  604. WINDOWPLACEMENT _wp;
  605. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  606. _wp.length = sizeof(WINDOWPLACEMENT);
  607. ::GetWindowPlacement( hWndHooked, &_wp );
  608. if( _wp.showCmd == SW_SHOWMINIMIZED )
  609. {
  610. if( nMessage == WM_NCLBUTTONDOWN )
  611. bMinFrameNcLbDown = true;
  612. else if( nMessage == WM_NCLBUTTONUP )
  613. bMinFrameNcLbUp = true;
  614. }
  615. }
  616. if( bMinFrameNcLbUp && wParam == HTCAPTION )
  617. return true;
  618. if( ( bMinFrameNcLbDown && wParam == HTCAPTION )
  619. || ( nMessage == WM_NCLBUTTONUP && wParam == HTSYSMENU )
  620. || ( nMessage == WM_NCRBUTTONUP && ( wParam == HTCAPTION || wParam == HTSYSMENU ) )
  621. )
  622. {
  623. if( wParam == HTCAPTION
  624. && ::IsIconic( hWndHooked )
  625. )
  626. return false;
  627. CExtToolControlBar::g_bMenuTrackingExpanded = false;
  628. CPoint * pPoint = NULL, ptCursor;
  629. if( nMessage == WM_NCRBUTTONUP )
  630. {
  631. if( ! ::GetCursorPos(&ptCursor) )
  632. {
  633. lResult = 0;
  634. return true;
  635. }
  636. pPoint = &ptCursor;
  637. }
  638. if( !_IsDockSiteCustomizeMode() )
  639. if( ! TrackChildFrameSystemMenu(
  640. pPoint,
  641. FALSE
  642. )
  643. )
  644. return false;
  645. lResult = 0;
  646. return true;
  647. }
  648. if( ( nMessage == WM_NCLBUTTONDOWN || nMessage == WM_NCRBUTTONDOWN )
  649. && wParam == HTSYSMENU
  650. )
  651. {
  652. if( ! m_bAllowProfChildFrameSysmenu )
  653. return false;
  654. lResult = 0;
  655. return true;
  656. }
  657. if( nMessage == WM_NCRBUTTONDOWN && wParam == HTCAPTION )
  658. {
  659. if( !_IsDockSiteCustomizeMode() )
  660. {
  661. CExtToolControlBar::g_bMenuTrackingExpanded = false;
  662. CPoint ptCursor;
  663. if( ::GetCursorPos(&ptCursor) )
  664. if( ! TrackChildFrameSystemMenu(
  665. &ptCursor,
  666. FALSE
  667. )
  668. )
  669. return false;
  670. } // if( !_IsDockSiteCustomizeMode() )
  671. lResult = 0;
  672. return true;
  673. }
  674. if( nMessage == CExtPopupMenuWnd::g_nMsgNotifyMenuClosed )
  675. {
  676. m_bSysMenuTracking = false;
  677. return true;
  678. }
  679. if( nMessage == CExtPopupMenuWnd::g_nMsgPopupNext
  680. || nMessage == CExtPopupMenuWnd::g_nMsgPopupPrev
  681. )
  682. { // if menu next/prev popup activation messages
  683. int iTrackingIndex =
  684. GetMenuTrackingButton();
  685. if( nMessage == CExtPopupMenuWnd::g_nMsgPopupPrev )
  686. {
  687. if( ! _IsDockSiteCustomizeMode() )
  688. {
  689. if( ! TrackMainFrameSystemMenu(
  690. NULL,
  691. TRUE
  692. )
  693. )
  694. {
  695. if( m_bAllowProfMainFrameSysmenu )
  696. return false;
  697. int iNewTrackIndex =
  698. GetVisibleButton(
  699. iTrackingIndex,
  700. (nMessage == CExtPopupMenuWnd::g_nMsgPopupNext) ?
  701. TRUE : FALSE
  702. );
  703. if( iNewTrackIndex == iTrackingIndex )
  704. {
  705. lResult = 0; // same as tracking now
  706. return true;
  707. }
  708. TrackButtonMenu(iNewTrackIndex);
  709. }
  710. }
  711. lResult = 0;
  712. return true;
  713. }
  714. if( iTrackingIndex < 0 ) // menu tracked on other bar
  715. {
  716. if( m_bSysMenuTracking )
  717. {
  718. int iNewTrackIndex =
  719. GetVisibleButton(
  720. iTrackingIndex,
  721. (nMessage == CExtPopupMenuWnd::g_nMsgPopupNext) ?
  722. TRUE : FALSE
  723. );
  724. if( iNewTrackIndex == iTrackingIndex )
  725. {
  726. lResult = 0; // same as tracking now
  727. return true;
  728. }
  729. TrackButtonMenu(iNewTrackIndex);
  730. } // if( m_bSysMenuTracking )
  731. lResult = 0;
  732. return true;
  733. }
  734. int iNewTrackIndex =
  735. GetVisibleButton(
  736. iTrackingIndex,
  737. (nMessage == CExtPopupMenuWnd::g_nMsgPopupNext) ?
  738. TRUE : FALSE
  739. );
  740. if( iNewTrackIndex == iTrackingIndex )
  741. {
  742. lResult = 0; // same as tracking now
  743. return true;
  744. }
  745. TrackButtonMenu(iNewTrackIndex);
  746. lResult = 0;
  747. return true;
  748. } // if menu next/prev popup activation messages
  749. } // else else if( (!m_bPresubclassDialogMode) && hWndHooked == _GetHwndChildFrame() )
  750. else if( (!m_bPresubclassDialogMode) && hWndHooked == _GetHwndMdiArea() )
  751. {
  752. if( nMessage == WM_PARENTNOTIFY
  753. &&
  754. CExtPopupMenuWnd::IsMenuTracking()
  755. )
  756. {
  757. lResult = 0;
  758. return true;
  759. }
  760. if( nMessage == WM_MDISETMENU )
  761. {
  762. CFrameWnd * pFrame = _GetDockingFrameImpl();
  763. ASSERT_VALID( pFrame );
  764. HWND hWndFrame = pFrame->GetSafeHwnd();
  765. ASSERT( hWndFrame != NULL );
  766. ASSERT( ::IsWindow(hWndFrame) );
  767. bool bOle = IsOleIpObjActive();
  768. HMENU hOldMdiMenu = m_menuDoc.Detach();
  769. HMENU hNewMdiMenu = (HMENU)wParam;
  770. m_menuDoc.Attach( hNewMdiMenu );
  771. if( bOle )
  772. {
  773. ::SetMenu( hWndFrame, hNewMdiMenu );
  774. } // if( bOle )
  775. else
  776. {
  777. HMENU hFrameRealMenu = ::GetMenu( hWndFrame );
  778. if( hFrameRealMenu != NULL )
  779. ::SetMenu( hWndFrame, NULL );
  780. _DelayUpdateMenuBar();
  781. } // else from if( bOle )
  782. CExtHookSink::OnHookWndMsgNextProcCurrent( 0L, 0L );
  783. lResult = (LRESULT)hOldMdiMenu;
  784. //_DelaySyncActiveMdiChild(); // (- v.2.23)
  785. _SyncActiveMdiChild(); // (+ v.2.23)
  786. m_bDelayedSyncActiveMdiChild = false; // (+ v.2.23)
  787. return true;
  788. }
  789. if( nMessage == WM_MDIREFRESHMENU )
  790. {
  791. CExtHookSink::OnHookWndMsgNextProcCurrent( 0L, 0L );
  792. //_DelaySyncActiveMdiChild(); // (- v.2.23)
  793. _SyncActiveMdiChild(); // (+ v.2.23)
  794. m_bDelayedSyncActiveMdiChild = false; // (+ v.2.23)
  795. lResult = 0;
  796. return true;
  797. }
  798. if( nMessage == WM_CONTEXTMENU )
  799. {
  800. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  801. CExtCustomizeSite * pSite =
  802. CExtCustomizeSite::GetCustomizeSite( m_hWnd );
  803. if( pSite != NULL
  804. && pSite->IsCustomizeMode()
  805. )
  806. {
  807. lResult = 0;
  808. return true;
  809. }
  810. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  811. if( !CExtControlBar::FindHelpMode(this) )
  812. {
  813. CFrameWnd * pFrame = _GetDockingFrameImpl();
  814. ASSERT_VALID( pFrame );
  815. CPoint ptCursor;
  816. if( ! ::GetCursorPos(&ptCursor) )
  817. {
  818. lResult = 0;
  819. return true;
  820. }
  821. HWND hWndTrack = GetOwner()->GetSafeHwnd();
  822. ASSERT( hWndTrack != NULL && ::IsWindow(hWndTrack) );
  823. CExtPopupMenuWnd * pPopup =
  824. CExtPopupMenuWnd::InstantiatePopupMenu(
  825. GetSafeHwnd(),
  826. RUNTIME_CLASS(CExtPopupMenuWnd),
  827. this
  828. );
  829. VERIFY( pPopup->CreatePopupMenu(hWndTrack) );
  830. if( ! CExtDockBar::_ConstructDockSiteControlBarPopupMenu(
  831. pFrame,
  832. pPopup,
  833. CExtControlBar::POPUP_MENU_EVENT_DATA::__PMED_MDICLIAREA_CTX,
  834. this,
  835. WM_CONTEXTMENU,
  836. NULL
  837. )
  838. )
  839. {
  840. delete pPopup;
  841. }
  842. else
  843. {
  844. if( pPopup->ItemGetCount() == 0 )
  845. {
  846. delete pPopup;
  847. }
  848. else
  849. {
  850. ::SetFocus( hWndTrack );
  851. pPopup->m_hWndNotifyMenuClosed = GetSafeHwnd();
  852. if( ! pPopup->TrackPopupMenu(
  853. TPMX_OWNERDRAW_FIXED,
  854. ptCursor.x,
  855. ptCursor.y,
  856. NULL,
  857. this,
  858. NULL,
  859. NULL,
  860. true
  861. )
  862. )
  863. {
  864. //delete pPopup;
  865. }
  866. }
  867. }
  868. } // if( !CExtControlBar::FindHelpMode(this) )
  869. lResult = 0;
  870. return true;
  871. } // if( nMessage == WM_CONTEXTMENU )
  872. if( nMessage == WM_MDIACTIVATE
  873. || nMessage == WM_MDIDESTROY
  874. || nMessage == WM_MDINEXT
  875. )
  876. {
  877. if( nMessage == WM_MDINEXT
  878. && IsOleIpObjActive()
  879. )
  880. {
  881. lResult = 0;
  882. return true;
  883. }
  884. _DelaySyncActiveMdiChild();
  885. _DelayUpdateMenuBar();
  886. }
  887. if( g_PaintManager.m_bIsWinXPorLater )
  888. {
  889. // this implements Windows XP or later MDI flicker fix
  890. // suggested by Mr. Raffaele Cappelli
  891. HWND hWndMdiClient = _GetHwndMdiArea();
  892. if( nMessage == WM_MDIACTIVATE )
  893. {
  894. HWND hWndNew = (HWND)wParam;
  895. BOOL bOldWasMaximized = FALSE;
  896. HWND hWndOld = (HWND)
  897. ::SendMessage( hWndMdiClient, WM_MDIGETACTIVE, 0, (LPARAM)&bOldWasMaximized );
  898. // hWndOld;
  899. // if( bOldWasMaximized )
  900. // {
  901. // if( ! ::IsZoomed( hWndOld ) )
  902. // ::SendMessage( hWndNew, WM_SYSCOMMAND, SC_MAXIMIZE, 0L );
  903. // ::SendMessage( hWndMdiClient, WM_SETREDRAW, FALSE, 0 );
  904. // }
  905. // if( ::IsIconic( hWndNew ) )
  906. // ::SendMessage(
  907. // hWndMdiClient,
  908. // bOldWasMaximized ? WM_MDIMAXIMIZE : WM_MDIRESTORE,
  909. // (WPARAM)hWndNew,
  910. // 0L
  911. // );
  912. LRESULT _lResult = CExtHookSink::OnHookWndMsgDefault();
  913. _lResult;
  914. // if( bOldWasMaximized )
  915. // {
  916. // ::SendMessage( hWndMdiClient, WM_SETREDRAW, TRUE, 0 );
  917. // ::RedrawWindow( hWndMdiClient, NULL, NULL, RDW_INVALIDATE | RDW_ALLCHILDREN );
  918. // }
  919. if( hWndOld != NULL && bOldWasMaximized )
  920. {
  921. ::SetWindowPos(
  922. hWndNew, NULL, 0, 0, 0, 0,
  923. SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE
  924. |SWP_NOZORDER|SWP_NOOWNERZORDER
  925. |SWP_FRAMECHANGED
  926. );
  927. //CRect rcClient;
  928. //::GetClientRect( hWndMdiClient, &rcClient );
  929. //::PostMessage( hWndMdiClient, WM_SIZE, SIZE_RESTORED, MAKELPARAM( rcClient.Width(), rcClient.Height() ) );
  930. }
  931. return true;
  932. }
  933. return 
  934. CExtHookSink::OnHookWndMsg(
  935. lResult,
  936. hWndHooked,
  937. nMessage,
  938. wParam,
  939. lParam
  940. );
  941. } // if( g_PaintManager.m_bIsWinXPorLater )
  942. } // else if( (!m_bPresubclassDialogMode) && hWndHooked == _GetHwndMdiArea() )
  943. else
  944. {
  945. ASSERT( FALSE );
  946. }
  947. MSG msg;
  948. ::memset( &msg, 0, sizeof(MSG) );
  949. msg.hwnd = hWndHooked;
  950. msg.message = nMessage;
  951. msg.wParam = wParam;
  952. msg.lParam = lParam;
  953. if( TranslateMainFrameMessage(&msg) )
  954. return true;
  955. return 
  956. CExtHookSink::OnHookWndMsg(
  957. lResult,
  958. hWndHooked,
  959. nMessage,
  960. wParam,
  961. lParam
  962. );
  963. }
  964. bool CExtMenuControlBar::_IsNonCommandButtonMode() const
  965. {
  966. ASSERT_VALID( this );
  967. return m_bNonCommandButtonMode;
  968. }
  969. /////////////////////////////////////////////////////////////////////////////
  970. // CExtMenuControlBar
  971. IMPLEMENT_DYNCREATE(CExtMenuControlBar, CExtToolControlBar)
  972. CExtMenuControlBar::CExtMenuControlBar()
  973. : m_bUseFastKeyboardMenuTracking( true )
  974. , m_bAllowProfMainFrameSysmenu( true )
  975. , m_bAllowProfChildFrameSysmenu( true )
  976. , m_bHandleDblClickAsCloseCmd( true )
  977. , m_bFlatTracking( false )
  978. , m_bSysMenuTracking( false )
  979. , m_bMdiApp( false )
  980. , m_bMultiRowLayout( true )
  981. , m_nFlatTrackingIndex( -1 )
  982. , m_nOldTrackingIndex( -1 )
  983. , m_sMdiWindowPopupName( _T("") )
  984. , m_nMdiDocButtonCmdID( 0 )
  985. , m_hWndHelper( NULL )
  986. , m_bDelayedSyncActiveMdiChild( false )
  987. , m_bDelayedUpdateMenuBar( false )
  988. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  989. , m_pMenuInfo( NULL )
  990. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  991. , m_bNonCommandButtonMode( false )
  992. , m_bMenuBarUsesDelayedButtonMenuTracking( true )
  993. , m_bAdaptiveCmdAllocMode( false )
  994. , m_bHelperTrackingCharCode( false )
  995. {
  996. }
  997. CExtMenuControlBar::~CExtMenuControlBar()
  998. {
  999. _RemoveAllButtonsImpl();
  1000. //CSingleLock _slCsCB( &g_csCB );
  1001. // _slCsCB.Lock();
  1002. int nCountOfBars = (int)g_AllBars.GetSize();
  1003. for( int i=0; i<nCountOfBars; i++ )
  1004. {
  1005. CExtControlBar * pBar = g_AllBars[i];
  1006. ASSERT( pBar != NULL );
  1007. if( pBar == this )
  1008. {
  1009. g_AllBars.RemoveAt( i );
  1010. break;
  1011. }
  1012. }
  1013. // _slCsCB.Unlock();
  1014. }
  1015. BEGIN_MESSAGE_MAP(CExtMenuControlBar, CExtToolControlBar)
  1016.     //{{AFX_MSG_MAP(CExtMenuControlBar)
  1017. ON_WM_DESTROY()
  1018. ON_WM_TIMER()
  1019. ON_WM_LBUTTONDOWN()
  1020. ON_WM_LBUTTONUP()
  1021. ON_WM_CREATE()
  1022. //}}AFX_MSG_MAP
  1023. ON_REGISTERED_MESSAGE(CExtToolControlBar::g_nMsgTrackButtonMenu, OnTrackButtonMenu)
  1024. END_MESSAGE_MAP()
  1025. // LoadMenuBar() required only for CFrameWnd
  1026. // based windows principally without menu
  1027. BOOL CExtMenuControlBar::LoadMenuBar(
  1028. UINT nResourceID
  1029. )
  1030. {
  1031. if( m_menuDoc.GetSafeHmenu() != NULL )
  1032. {
  1033. VERIFY( m_menuDoc.DestroyMenu() );
  1034. }
  1035. if( m_menuFrame.GetSafeHmenu() != NULL )
  1036. {
  1037. VERIFY( m_menuFrame.DestroyMenu() );
  1038. }
  1039. if( m_pDockSite != NULL )
  1040. {
  1041. if( GetSafeHwnd() == NULL
  1042. || (! ::IsWindow( GetSafeHwnd() ) )
  1043. || m_menuFrame.GetSafeHmenu() != NULL
  1044. )
  1045. {
  1046. ASSERT( FALSE );
  1047. return FALSE;
  1048. }
  1049. }
  1050. if( ! g_ResourceManager->LoadMenu( m_menuFrame, nResourceID ) )
  1051. {
  1052. ASSERT( FALSE );
  1053. return FALSE;
  1054. }
  1055. ASSERT( ::IsMenu(m_menuFrame.GetSafeHmenu()) );
  1056. if( !g_CmdManager->UpdateFromMenu(
  1057. g_CmdManager->ProfileNameFromWnd( GetSafeHwnd() ),
  1058. m_menuFrame.GetSafeHmenu()
  1059. )
  1060. )
  1061. {
  1062. ASSERT( FALSE );
  1063. return FALSE;
  1064. }
  1065. return _UpdateMenuBar();
  1066. }
  1067. CMenu * CExtMenuControlBar::_GetMenu()
  1068. {
  1069. if( m_menuDoc.GetSafeHmenu() != NULL )
  1070. {
  1071. ASSERT( ::IsMenu(m_menuDoc.GetSafeHmenu()) );
  1072. return &m_menuDoc;
  1073. }
  1074. if( m_menuFrame.GetSafeHmenu() != NULL )
  1075. {
  1076. ASSERT( ::IsMenu(m_menuFrame.GetSafeHmenu()) );
  1077. return &m_menuFrame;
  1078. }
  1079. return NULL;
  1080. }
  1081. CMenu * CExtMenuControlBar::GetMenu()
  1082. {
  1083. return _GetMenu();
  1084. }
  1085. BOOL CExtMenuControlBar::UpdateMenuBar( // update after menu changed
  1086. BOOL bDoRecalcLayout // = TRUE
  1087. )
  1088. {
  1089. return _UpdateMenuBar( bDoRecalcLayout );
  1090. }
  1091. BOOL CExtMenuControlBar::_UpdateMenuBar(
  1092. BOOL bDoRecalcLayout // = TRUE
  1093. )
  1094. {
  1095. SetButtons(); // remove all buttons
  1096. VERIFY(
  1097. g_CmdManager->CmdRemoveByMask(
  1098. g_CmdManager->ProfileNameFromWnd( GetSafeHwnd() ),
  1099. (DWORD)CExtCmdItem::STATE_MENUBAR_TMP
  1100. )
  1101. );
  1102. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1103. MenuInfoUpdate();
  1104. CExtCustomizeSite::CCmdMenuInfo * pMenuInfo = MenuInfoGet();
  1105. if( pMenuInfo != NULL )
  1106. {
  1107. ASSERT_VALID( pMenuInfo->GetNode() );
  1108. SetButtons( pMenuInfo->GetNode() );
  1109. } // if( pMenuInfo != NULL )
  1110. else
  1111. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1112. {
  1113. CMenu * pMenu = GetMenu();
  1114. if( pMenu != NULL && pMenu->GetSafeHmenu() != NULL )
  1115. {
  1116. ASSERT( ::IsMenu(pMenu->GetSafeHmenu()) );
  1117. bool bRevertRTL = OnQueryRevertRTL();
  1118. UINT nMenuItemCount = pMenu->GetMenuItemCount();
  1119. for( UINT nMenuItemIndex = 0; nMenuItemIndex < nMenuItemCount; nMenuItemIndex++ )
  1120. {
  1121. UINT nInsertButtonLocation =
  1122. bRevertRTL
  1123. ? 0
  1124. : nMenuItemIndex
  1125. ;
  1126. MENUITEMINFO mii;
  1127. ::memset( &mii, 0, sizeof(MENUITEMINFO) );
  1128. mii.cbSize = sizeof(MENUITEMINFO);
  1129. mii.fMask =
  1130. MIIM_CHECKMARKS
  1131. |MIIM_DATA
  1132. |MIIM_ID
  1133. |MIIM_STATE
  1134. |MIIM_SUBMENU
  1135. |MIIM_TYPE
  1136. ;
  1137. mii.cch = __MAX_UI_ITEM_TEXT;
  1138. CExtSafeString sText;
  1139. mii.dwTypeData =
  1140. sText.GetBuffer( __MAX_UI_ITEM_TEXT );
  1141. ASSERT( mii.dwTypeData != NULL );
  1142. if( mii.dwTypeData == NULL )
  1143. {
  1144. ASSERT( FALSE );
  1145. return FALSE;
  1146. }
  1147. if( ! pMenu->GetMenuItemInfo(
  1148. nMenuItemIndex,
  1149. &mii,
  1150. TRUE
  1151. )
  1152. )
  1153. {
  1154. sText.ReleaseBuffer();
  1155. ASSERT( FALSE );
  1156. return false;
  1157. }
  1158. sText.ReleaseBuffer();
  1159. BOOL bAppendMdiWindowsMenu = FALSE;
  1160. UINT nCmdID = 0;
  1161. CExtCmdItem * pCmdItem = NULL;
  1162. bool bAllocCmd = false;
  1163. bool bStateEnable = false;
  1164. if( mii.hSubMenu == NULL )
  1165. {
  1166. nCmdID = mii.wID;
  1167. if( nCmdID == ID_SEPARATOR )
  1168. {
  1169. if( ! InsertButton(
  1170. nInsertButtonLocation,
  1171. nCmdID,
  1172. FALSE
  1173. )
  1174. )
  1175. {
  1176. ASSERT( FALSE );
  1177. return FALSE;
  1178. }
  1179. continue;
  1180. } // if( nCmdID == ID_SEPARATOR )
  1181. ASSERT( CExtCmdManager::IsCommand(nCmdID) );
  1182. pCmdItem =
  1183. g_CmdManager->CmdGetPtr(
  1184. g_CmdManager->ProfileNameFromWnd( GetSafeHwnd() ),
  1185. nCmdID
  1186. );
  1187. if( m_bAdaptiveCmdAllocMode )
  1188. {
  1189. if( pCmdItem == NULL )
  1190. {
  1191. bAllocCmd = true;
  1192. bStateEnable = true;
  1193. }
  1194. #ifdef _DEBUG
  1195. else
  1196. {
  1197. ASSERT( pCmdItem != NULL );
  1198. }
  1199. #endif
  1200. } // if( mii.hSubMenu == NULL )
  1201. else
  1202. {
  1203. bAllocCmd = true;
  1204. } // else from if( mii.hSubMenu == NULL )
  1205. if( bAllocCmd )
  1206. {
  1207. pCmdItem =
  1208. g_CmdManager->CmdAllocPtr(
  1209. g_CmdManager->ProfileNameFromWnd( GetSafeHwnd() )
  1210. );
  1211. if( pCmdItem == NULL )
  1212. {
  1213. ASSERT( FALSE );
  1214. return FALSE;
  1215. } // if( pCmdItem == NULL )
  1216. nCmdID = pCmdItem->m_nCmdID;
  1217. ASSERT( CExtCmdManager::IsCommand(nCmdID) );
  1218. pCmdItem->StateSetMenubarTemp();
  1219. pCmdItem->StateSetBasic();
  1220. if( bStateEnable )
  1221. pCmdItem->StateEnable(TRUE);
  1222. if( _IsMdiApp() && (! m_sMdiWindowPopupName.IsEmpty() ) )
  1223. {
  1224. CExtSafeString _sText(sText);
  1225. _sText.TrimLeft();
  1226. _sText.TrimRight();
  1227. while( _sText.Replace(_T("&"),_T("")) > 0 )
  1228. {
  1229. _sText.TrimLeft();
  1230. _sText.TrimRight();
  1231. } // while( _sText.Replace(_T("&"),_T("")) > 0 )
  1232. if( _sText == m_sMdiWindowPopupName )
  1233. bAppendMdiWindowsMenu = TRUE;
  1234. } // if( _IsMdiApp() && (! m_sMdiWindowPopupName.IsEmpty() ) )
  1235. } // else from if( mii.hSubMenu == NULL )
  1236. ASSERT( pCmdItem != NULL );
  1237. if( pCmdItem->m_sToolbarText.IsEmpty() )
  1238. pCmdItem->m_sToolbarText = sText;
  1239. if( pCmdItem->m_sMenuText.IsEmpty() )
  1240. pCmdItem->m_sMenuText = sText;
  1241. if( ! InsertButton(
  1242. nInsertButtonLocation,
  1243. nCmdID,
  1244. FALSE
  1245. )
  1246. )
  1247. {
  1248. ASSERT( FALSE );
  1249. return FALSE;
  1250. }
  1251. if( mii.hSubMenu != NULL )
  1252. {
  1253. ASSERT( ::IsMenu(mii.hSubMenu) );
  1254. SetButtonMenu(
  1255. nInsertButtonLocation,
  1256. mii.hSubMenu,
  1257. FALSE,
  1258. FALSE,
  1259. FALSE
  1260. );
  1261. } // if( mii.hSubMenu != NULL )
  1262. if( bAppendMdiWindowsMenu )
  1263. {
  1264. VERIFY(
  1265. MarkButtonAsMdiWindowsMenu(
  1266. nInsertButtonLocation,
  1267. TRUE
  1268. )
  1269. );
  1270. } // if( bAppendMdiWindowsMenu )
  1271. } // for( UINT nMenuItemIndex = 0; nMenuItemIndex < nMenuItemCount; nMenuItemIndex++ )
  1272. ASSERT( m_pRightBtn == NULL );
  1273. m_pRightBtn = OnCreateBarRightBtn();
  1274. if( m_pRightBtn != NULL )
  1275. {
  1276. ASSERT_VALID( m_pRightBtn );
  1277. ASSERT_KINDOF( CExtBarContentExpandButton, m_pRightBtn );
  1278. m_buttons.Add( m_pRightBtn );
  1279. } // if( m_pRightBtn != NULL )
  1280. } // if( pMenu != NULL && pMenu->GetSafeHmenu() != NULL )
  1281. } // else from if( pMenuInfo != NULL )
  1282. if( _IsMdiApp() )
  1283. {
  1284. if( ! IsOleIpObjActive() )
  1285. if( _InstallMdiDocButtons( FALSE ) )
  1286. bDoRecalcLayout = TRUE;
  1287. VERIFY( _SyncActiveMdiChild() );
  1288. }
  1289. if( bDoRecalcLayout && m_pDockSite != NULL )
  1290. {
  1291. CFrameWnd * pFrame = GetParentFrame();
  1292. ASSERT_VALID( pFrame );
  1293. pFrame->RecalcLayout();
  1294. if( pFrame->IsKindOf(RUNTIME_CLASS(CExtMiniDockFrameWnd)) )
  1295. pFrame->SetWindowPos(
  1296. NULL, 0, 0, 0, 0,
  1297. SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE
  1298. |SWP_NOZORDER|SWP_NOOWNERZORDER
  1299. |SWP_FRAMECHANGED
  1300. );
  1301. Invalidate();
  1302. _RecalcLayoutImpl();
  1303. UpdateWindow();
  1304. } // if( bDoRecalcLayout && m_pDockSite != NULL )
  1305. return TRUE;
  1306. }
  1307. HWND CExtMenuControlBar::_GetActiveMdiChildWnd(
  1308. BOOL & bMaximized
  1309. )
  1310. {
  1311. bMaximized = FALSE;
  1312. if( ! _IsMdiApp() )
  1313. return NULL;
  1314.  // FrameFeatures does not use CMDIFrameWnd
  1315. CMDIFrameWnd * pMdiFrame = DYNAMIC_DOWNCAST( CMDIFrameWnd, _GetDockingFrameImpl() );
  1316. HWND hWndMdiClient = NULL;
  1317. if( pMdiFrame == NULL )
  1318. hWndMdiClient = _GetHwndMdiArea();
  1319. else
  1320. {
  1321. ASSERT_VALID( pMdiFrame );
  1322. hWndMdiClient = pMdiFrame->m_hWndMDIClient;
  1323. } // else from if( pMdiFrame == NULL )
  1324. if( hWndMdiClient == NULL )
  1325. return NULL;
  1326. ASSERT( ::IsWindow( hWndMdiClient ) );
  1327. BOOL bMax = FALSE;
  1328. HWND hWndActiveChildFrame = (HWND) ::SendMessage( hWndMdiClient, WM_MDIGETACTIVE, 0, (LPARAM)&bMax );
  1329. if( hWndActiveChildFrame == NULL )
  1330. bMax = FALSE;
  1331. else
  1332. {
  1333. if( ! ::IsWindow( hWndActiveChildFrame ) )
  1334. return NULL;
  1335. __EXT_MFC_LONG_PTR dwActiveChildFrameStyle = :: __EXT_MFC_GetWindowLong( hWndActiveChildFrame, GWL_STYLE );
  1336. if( pMdiFrame == NULL )
  1337. {
  1338. if( (dwActiveChildFrameStyle&WS_VISIBLE) == 0 )
  1339. {
  1340. hWndActiveChildFrame = NULL;
  1341. bMax = FALSE;
  1342. } // if( (dwActiveChildFrameStyle&WS_VISIBLE) == 0 )
  1343. } // if( pMdiFrame == NULL )
  1344. else
  1345. {
  1346. CWnd * pWndTempAnalyze =
  1347. CWnd::FromHandlePermanent( hWndActiveChildFrame );
  1348. if( pWndTempAnalyze != NULL )
  1349. {
  1350. ASSERT_VALID( pWndTempAnalyze );
  1351. CMDIChildWnd * pWndTempMDIChild = DYNAMIC_DOWNCAST( CMDIChildWnd, pWndTempAnalyze );
  1352. if( pWndTempMDIChild != NULL
  1353. && pWndTempMDIChild->m_bPseudoInactive
  1354. && (dwActiveChildFrameStyle&WS_VISIBLE) == 0
  1355. )
  1356. {
  1357. hWndActiveChildFrame = NULL;
  1358. bMax = FALSE;
  1359. }
  1360. else
  1361. {
  1362. if( ! bMax )
  1363. {
  1364. if( (dwActiveChildFrameStyle&WS_MAXIMIZE) != 0 )
  1365. bMax = true;
  1366. }
  1367. }
  1368. } // if( pWndTempAnalyze != NULL )
  1369. } // else from if( pMdiFrame == NULL )
  1370. } // else from if( hWndActiveChildFrame == NULL )
  1371. bMaximized = bMax;
  1372. return hWndActiveChildFrame;
  1373. }
  1374. void CExtMenuControlBar::OnUpdateCmdUI(
  1375. CFrameWnd * pTarget,
  1376. BOOL bDisableIfNoHndler
  1377. )
  1378. {
  1379. CExtToolControlBar::OnUpdateCmdUI(
  1380. pTarget,
  1381. bDisableIfNoHndler
  1382. );
  1383. }
  1384. BOOL CExtMenuControlBar::_SyncActiveMdiChild()
  1385. {
  1386. if( m_bPresubclassDialogMode )
  1387. return TRUE;
  1388. if( _DraggingGetBar() != NULL )
  1389. return TRUE;
  1390. // if( (GetStyle() & WS_VISIBLE) == 0 )
  1391. // return TRUE;
  1392. BOOL bMax = FALSE;
  1393. HWND hWndActiveChild =
  1394. _GetActiveMdiChildWnd( bMax );
  1395. if( m_hWndHelper == hWndActiveChild )
  1396. return TRUE;
  1397. if( m_hWndHelper != NULL )
  1398. SetupHookWndSink( m_hWndHelper, true );
  1399. m_hWndHelper = hWndActiveChild;
  1400. if( m_hWndHelper != NULL )
  1401. SetupHookWndSink( m_hWndHelper );
  1402. _RecalcLayoutImpl();
  1403. return TRUE;
  1404. }
  1405. LRESULT CExtMenuControlBar::DoHelpHitTest( CPoint ptHelpHitTest )
  1406. {
  1407. ASSERT_VALID( this );
  1408. return CExtToolControlBar::DoHelpHitTest( ptHelpHitTest );
  1409. }
  1410. bool CExtMenuControlBar::_IsMdiApp() const
  1411. {
  1412. ASSERT_VALID( this );
  1413. return m_bMdiApp;
  1414. }
  1415. bool CExtMenuControlBar::IsDisplayMdiDocumentButtons() const
  1416. {
  1417. ASSERT_VALID( this );
  1418. return true;
  1419. }
  1420. BOOL CExtMenuControlBar::_InstallMdiDocButtons(
  1421. BOOL bDoRecalcLayout // = TRUE
  1422. )
  1423. {
  1424. ASSERT( _IsMdiApp() );
  1425. if( ! IsDisplayMdiDocumentButtons() )
  1426. {
  1427. if( bDoRecalcLayout )
  1428. _RecalcLayoutImpl();
  1429. return TRUE;
  1430. }
  1431. if( _DraggingGetBar() != NULL )
  1432. return FALSE;
  1433. BOOL bMax = FALSE;
  1434. HWND hWndActiveChild =
  1435. _GetActiveMdiChildWnd( bMax );
  1436. int nCountOfButtons = GetButtonsCount();
  1437. if( nCountOfButtons == 0
  1438. && hWndActiveChild == NULL
  1439. )
  1440. return FALSE;
  1441. CExtBarMdiDocButton * pDocTBB = NULL;
  1442. if( nCountOfButtons > 0 )
  1443. pDocTBB = 
  1444. DYNAMIC_DOWNCAST(
  1445. CExtBarMdiDocButton,
  1446. _GetButtonPtr(0)
  1447. );
  1448. int nRightIndex = nCountOfButtons - 1;
  1449. CExtBarMdiRightButton * pRightTBB = NULL;
  1450. if( nCountOfButtons > 0 )
  1451. pRightTBB =
  1452. DYNAMIC_DOWNCAST(
  1453. CExtBarMdiRightButton,
  1454. _GetButtonPtr(nRightIndex)
  1455. );
  1456. if( pRightTBB == NULL
  1457. && nCountOfButtons > 1
  1458. )
  1459. {
  1460. if( !m_bMultiRowLayout )
  1461. nRightIndex--;
  1462. pRightTBB =
  1463. DYNAMIC_DOWNCAST(
  1464. CExtBarMdiRightButton,
  1465. _GetButtonPtr(nRightIndex)
  1466. );
  1467. }
  1468. BOOL bRetVal = FALSE;
  1469. if( hWndActiveChild == NULL || (!bMax) )
  1470. { // if no active MDI doc or not maximized
  1471. if( pRightTBB != NULL )
  1472. {
  1473. ASSERT_VALID( pRightTBB );
  1474. VERIFY( RemoveButton(nRightIndex,FALSE) );
  1475. bRetVal = TRUE;
  1476. pRightTBB = NULL;
  1477. }
  1478. if( pDocTBB != NULL )
  1479. {
  1480. ASSERT_VALID( pDocTBB );
  1481. VERIFY( RemoveButton(0,FALSE) );
  1482. bRetVal = TRUE;
  1483. pDocTBB = NULL;
  1484. }
  1485. } // if no active MDI doc or not maximized
  1486. else
  1487. { // if active MDI doc is maximized
  1488. ASSERT( hWndActiveChild != NULL );
  1489. ASSERT( ::IsWindow(hWndActiveChild) );
  1490. if( m_nMdiDocButtonCmdID == 0 )
  1491. {
  1492. CExtCmdItem * pCmdItem =
  1493. g_CmdManager->CmdAllocPtr(
  1494. g_CmdManager->ProfileNameFromWnd( GetSafeHwnd() )
  1495. );
  1496. ASSERT( pCmdItem != NULL );
  1497. if( pCmdItem == NULL )
  1498. return FALSE;
  1499. m_nMdiDocButtonCmdID = pCmdItem->m_nCmdID;
  1500. ASSERT(
  1501. CExtCmdManager::IsCommand(
  1502. m_nMdiDocButtonCmdID
  1503. )
  1504. );
  1505. //pCmdItem->StateSetMenubarTemp();
  1506. pCmdItem->StateSetBasic();
  1507. } // if( m_nMdiDocButtonCmdID == 0 )
  1508. if( pRightTBB == NULL )
  1509. {
  1510. pRightTBB =
  1511. new CExtBarMdiRightButton(
  1512. this,
  1513. m_nMdiDocButtonCmdID
  1514. );
  1515. ASSERT_VALID( pRightTBB );
  1516. m_buttons.InsertAt( nRightIndex + 1, pRightTBB );
  1517. bRetVal = TRUE;
  1518. } // if( pRightTBB == NULL )
  1519. if( pDocTBB == NULL )
  1520. {
  1521. HMENU hDocMenu =
  1522. ::GetSystemMenu(hWndActiveChild,FALSE);
  1523. if( hDocMenu != NULL
  1524. && ::IsMenu(hDocMenu)
  1525. )
  1526. {
  1527. pDocTBB =
  1528. new CExtBarMdiDocButton(
  1529. this,
  1530. m_nMdiDocButtonCmdID
  1531. );
  1532. ASSERT_VALID( pDocTBB );
  1533. pDocTBB->m_bHandleDblClickAsCloseCmd =
  1534. m_bHandleDblClickAsCloseCmd;
  1535. pDocTBB->SetMenu( hDocMenu, FALSE, FALSE );
  1536. m_buttons.InsertAt( 0, pDocTBB );
  1537. bRetVal = TRUE;
  1538. }
  1539. } // if( pDocTBB == NULL )
  1540. } // if active MDI doc is maximized
  1541. if( pRightTBB != NULL )
  1542. {
  1543. ASSERT_VALID( pRightTBB );
  1544. pRightTBB->_ActiveMdiChildWndAttach( hWndActiveChild );
  1545. }
  1546. if( pDocTBB != NULL )
  1547. {
  1548. ASSERT_VALID( pDocTBB );
  1549. pDocTBB->_ActiveMdiChildWndAttach( hWndActiveChild );
  1550. }
  1551. if( bDoRecalcLayout )
  1552. {
  1553. _RecalcLayoutImpl();
  1554. bRetVal = FALSE;
  1555. }
  1556. return bRetVal;
  1557. }
  1558. void CExtMenuControlBar::OnDestroy() 
  1559. {
  1560. if( m_nMdiDocButtonCmdID != 0 )
  1561. {
  1562. VERIFY(
  1563. g_CmdManager->CmdRemove(
  1564. g_CmdManager->ProfileNameFromWnd( GetSafeHwnd() ),
  1565. m_nMdiDocButtonCmdID
  1566. )
  1567. );
  1568. m_nMdiDocButtonCmdID = 0;
  1569. }
  1570. RemoveAllWndHooks();
  1571. CExtToolControlBar::OnDestroy();
  1572. }
  1573. CSize CExtMenuControlBar::_GetDefButtonSize() const
  1574. {
  1575. ASSERT_VALID( this );
  1576. return 
  1577. IsDockedHorizontally()
  1578. ? CSize( 22, 19 )
  1579. : CSize( 19, 22 );
  1580. }
  1581. const ACCEL * CExtMenuControlBar::_GetTranslatedContextHelpAccel() const
  1582. {
  1583. if( ! g_bTranslateContextHelpCmd )
  1584. return NULL;
  1585. return &g_accelContextHelp;
  1586. }
  1587. BOOL CExtMenuControlBar::TranslateMainFrameMessage(MSG* pMsg) 
  1588. {
  1589. __PROF_UIS_MANAGE_STATE;
  1590. if( GetSafeHwnd() == NULL
  1591. || (!::IsWindow(GetSafeHwnd()))
  1592. )
  1593. return  FALSE;
  1594. ASSERT( pMsg != NULL );
  1595. if( pMsg->message == WM_TIMER
  1596. && pMsg->hwnd == m_hWndHelper
  1597. && AnimationSite_OnHookTimer( UINT(pMsg->wParam) )
  1598. )
  1599. return TRUE;
  1600. if( pMsg->message == WM_QUERYOPEN )
  1601. {
  1602. if( m_pDockSite != NULL )
  1603. {
  1604. _DelayUpdateMenuBar();
  1605. // m_bDelayedUpdateMenuBar = true;
  1606. // SetWindowPos(
  1607. // NULL, 0, 0, 0, 0,
  1608. // SWP_FRAMECHANGED
  1609. // |SWP_NOMOVE|SWP_NOSIZE|SWP_NOCOPYBITS
  1610. // |SWP_NOZORDER|SWP_NOOWNERZORDER|SWP_NOACTIVATE
  1611. // );
  1612. // SetTimer( 14, 100, NULL );
  1613. }
  1614. return FALSE;
  1615. } // if( pMsg->message == WM_QUERYOPEN )
  1616. // BEGIN: fix for the bug reported by Vitaly Murashev
  1617. HWND hWndMainFrame = _GetHwndMainFrame();
  1618. if( (! m_bPresubclassDialogMode )
  1619. && ( hWndMainFrame == NULL
  1620. || (! ::IsWindow( hWndMainFrame ) )
  1621. || (! ::IsWindowEnabled( hWndMainFrame ) )
  1622. )
  1623. )
  1624. return FALSE;
  1625. // END: fix for the bug reported by Vitaly Murashev
  1626. if( pMsg->message == WM_ACTIVATE
  1627. || pMsg->message == WM_ACTIVATEAPP
  1628. || pMsg->message == WM_SETFOCUS
  1629. || pMsg->message == WM_KILLFOCUS
  1630. )
  1631. {
  1632. m_bHelperTrackingCharCode = false;
  1633. g_bCancelNearestAltUp = true;
  1634. return FALSE;
  1635. } // if( pMsg->message == WM_ACTIVATE ...
  1636. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1637. CExtCustomizeSite * pSite = GetCustomizeSite();
  1638. if( pSite != NULL )
  1639. {
  1640. if( pSite->GetCustomizeDropSource() != NULL )
  1641. return FALSE;
  1642. if( WM_KEYFIRST <= pMsg->message
  1643. && pMsg->message <= WM_KEYLAST
  1644. && pSite->IsCustomizeMode()
  1645. && (! CExtPopupMenuWnd::IsMenuTracking() )
  1646. )
  1647. return TRUE;
  1648. } // if( pSite != NULL )
  1649. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1650. bool bDockSiteCustomizeMode =
  1651. _IsDockSiteCustomizeMode();
  1652. if( _IsMdiApp() )
  1653. {
  1654. if( ( pMsg->message == WM_COMMAND
  1655. && ( (LOWORD(pMsg->wParam)) == ID_NEXT_PANE
  1656. || (LOWORD(pMsg->wParam)) == ID_PREV_PANE
  1657. || (LOWORD(pMsg->wParam)) == ID_WINDOW_NEW
  1658. || (LOWORD(pMsg->wParam)) == ID_WINDOW_ARRANGE
  1659. || (LOWORD(pMsg->wParam)) == ID_WINDOW_CASCADE
  1660. || (LOWORD(pMsg->wParam)) == ID_WINDOW_TILE_HORZ
  1661. || (LOWORD(pMsg->wParam)) == ID_WINDOW_TILE_VERT
  1662. || (LOWORD(pMsg->wParam)) == ID_WINDOW_SPLIT
  1663. )
  1664. )
  1665. || pMsg->message == WM_MDIACTIVATE
  1666. || pMsg->message == WM_MDINEXT
  1667. || pMsg->message == WM_MDIRESTORE
  1668. || pMsg->message == WM_MDIMAXIMIZE
  1669. || pMsg->message == WM_MDITILE
  1670. || pMsg->message == WM_MDICASCADE
  1671. || pMsg->message == WM_MDIICONARRANGE
  1672. )
  1673. {
  1674. if( bDockSiteCustomizeMode )
  1675. return TRUE;
  1676. if( IsOleIpObjActive() )
  1677. return TRUE;
  1678. }
  1679. } // if( _IsMdiApp() )
  1680. bool bPrintPreviewMode = false;
  1681. if( (!m_bPresubclassDialogMode)
  1682. && (!bDockSiteCustomizeMode)
  1683. && m_pDockSite->GetSafeHwnd() != NULL
  1684. && FindPrintPreviewMode(m_pDockSite)
  1685. )
  1686. bPrintPreviewMode = true;
  1687. bool bComboDropDownTracking = false;
  1688. CWnd * pWndCurrFocus = CWnd::GetFocus();
  1689. if( pWndCurrFocus != NULL )
  1690. {
  1691. if( pWndCurrFocus->IsKindOf(RUNTIME_CLASS(CComboBox)) )
  1692. {
  1693. if( (pWndCurrFocus->GetStyle() & (CBS_DROPDOWN|CBS_DROPDOWNLIST)) != 0
  1694. && ((CComboBox *)pWndCurrFocus)->GetDroppedState()
  1695. )
  1696. bComboDropDownTracking = true;
  1697. }
  1698. else
  1699. {
  1700. pWndCurrFocus = pWndCurrFocus->GetParent();
  1701. if( pWndCurrFocus != NULL )
  1702. {
  1703. if( pWndCurrFocus->IsKindOf(RUNTIME_CLASS(CComboBox)) )
  1704. {
  1705. if( (pWndCurrFocus->GetStyle() & (CBS_DROPDOWN|CBS_DROPDOWNLIST)) != 0
  1706. && ((CComboBox *)pWndCurrFocus)->GetDroppedState()
  1707. )
  1708. bComboDropDownTracking = true;
  1709. }
  1710. }
  1711. }
  1712. }
  1713. UINT nMsg = pMsg->message;
  1714. if( nMsg == WM_COMMAND
  1715. && HIWORD( pMsg->wParam ) == 0
  1716. ) // (+ v.2.24)
  1717. {
  1718. bool bAlt = ( (::GetAsyncKeyState(VK_MENU)&0x8000) != 0 ) ? true : false;
  1719. g_bCancelNearestAltUp = bAlt;
  1720. }
  1721. if(    nMsg == WM_SYSKEYDOWN
  1722. || nMsg == WM_SYSKEYUP
  1723. || nMsg == WM_KEYDOWN
  1724. || nMsg == WM_KEYUP
  1725. )
  1726. {
  1727. BOOL bKeyUp = ( nMsg == WM_KEYUP || nMsg == WM_SYSKEYUP) ? TRUE : FALSE;
  1728. BOOL bCtrl = ::GetKeyState(VK_CONTROL) & 0x80000000;
  1729. BOOL bShift = ::GetKeyState(VK_SHIFT) & 0x80000000;
  1730. BOOL bAlt = HIWORD(pMsg->lParam) & KF_ALTDOWN;
  1731. TCHAR vkTCHAR = (TCHAR)pMsg->wParam;
  1732. if( pMsg->wParam == VK_MENU && m_bHelperTrackingCharCode && bKeyUp )
  1733. {
  1734. m_bHelperTrackingCharCode = false;
  1735. return FALSE;
  1736. }
  1737. if( bAlt && pMsg->wParam != VK_MENU )
  1738. {
  1739. if( ( VK_NUMPAD0 <= pMsg->wParam && pMsg->wParam <= VK_NUMPAD9 )
  1740. || pMsg->wParam == VK_INSERT // 0
  1741. || pMsg->wParam == VK_END    // 1
  1742. || pMsg->wParam == VK_DOWN   // 2
  1743. || pMsg->wParam == VK_NEXT   // 3
  1744. || pMsg->wParam == VK_LEFT   // 4
  1745. || pMsg->wParam == 0x0C      // 5, VK_CLEAR
  1746. || pMsg->wParam == VK_RIGHT  // 8
  1747. || pMsg->wParam == VK_HOME   // 7
  1748. || pMsg->wParam == VK_UP     // 8
  1749. || pMsg->wParam == VK_PRIOR  // 9
  1750. )
  1751. m_bHelperTrackingCharCode = g_bCancelNearestAltUp = true;
  1752. else
  1753. m_bHelperTrackingCharCode = false;
  1754. }
  1755. if( m_bHelperTrackingCharCode )
  1756. return FALSE;
  1757. if( ( ! bDockSiteCustomizeMode ) && GetSafeHwnd() != NULL )
  1758. { // help key processing
  1759. const ACCEL * pAccel = _GetTranslatedContextHelpAccel();
  1760. CPoint ptCursor( LONG_MAX, LONG_MAX );
  1761. HWND hWndFromPoint = NULL;
  1762. CWnd * pWndFromPointPermanent = NULL;
  1763. CExtToolControlBar * pToolBarFromPoint = NULL;
  1764. int nHitTestButtonIndex = -1;
  1765. CExtBarButton * pHitTestTBB = NULL;
  1766. UINT nHitTestCmdID = ID_SEPARATOR;
  1767. LPCTSTR strBarCmdProfileName = NULL;
  1768. CExtCmdItem * pHitTestCmdItem = NULL;
  1769. if( pAccel != NULL
  1770. && pMsg->wParam == WPARAM(pAccel->key)
  1771. && (pAccel->fVirt&(FSHIFT|FCONTROL|FALT)) ==
  1772. ( 0
  1773. | ( bShift ? (FSHIFT) : 0 )
  1774. | ( bCtrl ? (FCONTROL) : 0 )
  1775. | ( bAlt ? (FALT) : 0 )
  1776. )
  1777. && ::GetCursorPos( &ptCursor )
  1778. && ( hWndFromPoint = ::WindowFromPoint( ptCursor ) ) != NULL
  1779. && ( pWndFromPointPermanent = CWnd::FromHandlePermanent( hWndFromPoint ) ) != NULL
  1780. && ( pToolBarFromPoint = DYNAMIC_DOWNCAST( CExtToolControlBar, pWndFromPointPermanent ) ) != NULL
  1781. && ( ( m_pDockSite != NULL )
  1782. ? ( m_pDockSite == pToolBarFromPoint->m_pDockSite )
  1783. : ( GetParent() == pToolBarFromPoint->GetParent() )
  1784. )
  1785. && ( strBarCmdProfileName = g_CmdManager->ProfileNameFromWnd( hWndFromPoint ) ) != NULL
  1786. //&& _tcscmp( g_CmdManager->ProfileNameFromWnd( hWndFromPoint ), g_CmdManager->ProfileNameFromWnd( m_hWnd ) ) == NULL
  1787. && ::ScreenToClient( hWndFromPoint, &ptCursor )
  1788. && ( nHitTestButtonIndex = pToolBarFromPoint->HitTest( ptCursor ) ) >= 0
  1789. && ( pHitTestTBB = pToolBarFromPoint->GetButton( nHitTestButtonIndex ) ) != NULL
  1790. && ( ! pHitTestTBB->IsKindOf( RUNTIME_CLASS( CExtBarMdiDocButton ) ) )
  1791. //&& ( ! pHitTestTBB->IsKindOf( RUNTIME_CLASS( CExtBarContentExpandButton ) ) )
  1792. && ( nHitTestCmdID = pHitTestTBB->GetCmdID( false ) ) != ID_SEPARATOR
  1793. && ( pHitTestCmdItem = g_CmdManager->CmdGetPtr( strBarCmdProfileName, nHitTestCmdID ) ) != NULL
  1794. && ( ! pHitTestCmdItem->StateIsMenubarTemp() )
  1795. )
  1796. {
  1797. if( ! bKeyUp )
  1798. ::AfxGetApp()->WinHelp( nHitTestCmdID, HELP_CONTEXT );
  1799. return TRUE;
  1800. } // if( pAccel != NULL ...
  1801. } // help key processing
  1802. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1803. if( m_bFlatTracking
  1804. && KeyTipsDisplayedGet()
  1805. && ( ( _T('A') <= vkTCHAR && vkTCHAR <= _T('Z') )
  1806. || ( _T('0') <= vkTCHAR && vkTCHAR <= _T('9') )
  1807. )
  1808. )
  1809. {
  1810. if( bKeyUp )
  1811. return TRUE;
  1812. bool bActionInvoked = false;
  1813. bool bContinueKeyTipMode = false;
  1814. CExtCustomizeCmdKeyTip & keyTipChain = KeyTipChainGet();
  1815. if( KeyTipTranslate(
  1816. (DWORD)pMsg->wParam,
  1817. &keyTipChain,
  1818. true,
  1819. bActionInvoked,
  1820. bContinueKeyTipMode
  1821. ) >= 0
  1822. )
  1823. {
  1824. if( bActionInvoked
  1825. && ( ! bContinueKeyTipMode )
  1826. //&& ( ! CExtPopupMenuWnd::IsMenuTracking() )
  1827. )
  1828. {
  1829. if( m_bFlatTracking )
  1830. {
  1831. m_bFlatTracking = false;
  1832. OnFlatTrackingStop();
  1833. } // if( m_bFlatTracking )
  1834. _UpdateFlatTracking( FALSE );
  1835. }
  1836. else
  1837. KeyTipDisplay( keyTipChain );
  1838. //return TRUE;
  1839. }
  1840. return TRUE;
  1841. }
  1842. #endif // from (!defined __EXT_MFC_NO_CUSTOMIZE)
  1843. if( bAlt
  1844. && (! m_bFlatTracking )
  1845. && ( nMsg != WM_SYSKEYDOWN
  1846. && nMsg != WM_SYSKEYUP
  1847. )
  1848. && ( vkTCHAR == VK_NUMPAD0
  1849. || vkTCHAR == VK_NUMPAD1
  1850. || vkTCHAR == VK_NUMPAD2
  1851. || vkTCHAR == VK_NUMPAD3
  1852. || vkTCHAR == VK_NUMPAD4
  1853. || vkTCHAR == VK_NUMPAD5
  1854. || vkTCHAR == VK_NUMPAD6
  1855. || vkTCHAR == VK_NUMPAD7
  1856. || vkTCHAR == VK_NUMPAD8
  1857. || vkTCHAR == VK_NUMPAD9
  1858. || vkTCHAR == 0x2D
  1859. || vkTCHAR == 0x22
  1860. || vkTCHAR == 0x28
  1861. || vkTCHAR == 0x22
  1862. || vkTCHAR == 0x25
  1863. || vkTCHAR == 0x0C
  1864. || vkTCHAR == 0x27
  1865. || vkTCHAR == 0x24
  1866. || vkTCHAR == 0x26
  1867. || vkTCHAR == 0x21
  1868. )
  1869. )
  1870. {
  1871. g_bKeyCodeTracking = true;
  1872. g_bCancelNearestAltUp = false;
  1873. return FALSE;
  1874. }
  1875. if( g_bKeyCodeTracking )
  1876. {
  1877. g_bKeyCodeTracking = false;
  1878. return FALSE;
  1879. }
  1880. if( vkTCHAR == VK_MENU && (!bCtrl) && (!bShift) )
  1881. { // only VK_MENU pressed
  1882. if( bDockSiteCustomizeMode )
  1883. return TRUE;
  1884. if( bPrintPreviewMode
  1885. || bComboDropDownTracking
  1886. )
  1887. return FALSE;
  1888. if( m_bFlatTracking ) // (+ v.2.23)
  1889. {
  1890. if( ! bKeyUp )
  1891. return TRUE;
  1892. _CancelFlatTracking();
  1893. return TRUE;
  1894. } // if( m_bFlatTracking )
  1895. if( !bKeyUp )
  1896. {
  1897. g_bCancelNearestAltUp = false;
  1898. return FALSE; // (+ v.2.23)
  1899. }
  1900. if( g_bCancelNearestAltUp
  1901. || g_bMenuTracking
  1902. || GetButtonsCount() == 0
  1903. )
  1904. {
  1905. if( g_bCancelNearestAltUp ) // (+ v.2.23)
  1906. return FALSE;
  1907. return TRUE;
  1908. }
  1909. if( ! CExtPopupMenuWnd::IsMenuTracking() )
  1910. {
  1911. HWND hWndFocus = ::GetFocus();
  1912. if( hWndFocus != NULL )
  1913. ::SendMessage( hWndFocus, WM_CANCELMODE, 0L, 0L );
  1914. } // if( ! CExtPopupMenuWnd::IsMenuTracking() )
  1915. CExtToolControlBar::g_bMenuTrackingExpanded = false;
  1916. if( hWndMainFrame != NULL )
  1917. {
  1918. CWnd * pWndForPlacement = stat_GetWndForPlacement( CWnd::FromHandle(hWndMainFrame) );
  1919. HWND hWndForeground = ::GetForegroundWindow();
  1920. bool bCancelButtonTracking = true;
  1921. if( hWndMainFrame == hWndForeground
  1922. || hWndMainFrame == pWndForPlacement->m_hWnd
  1923. )
  1924. bCancelButtonTracking = false;
  1925. else if(
  1926. (::__EXT_MFC_GetWindowLong(hWndMainFrame,GWL_STYLE)&WS_CHILD) != 0
  1927. && ::IsChild( hWndForeground, hWndMainFrame )
  1928. )
  1929. bCancelButtonTracking = false;
  1930. else
  1931. {
  1932. for( HWND hWnd = ::GetParent( hWndForeground );
  1933. hWnd != NULL;
  1934. hWnd = ::GetParent( hWnd )
  1935. )
  1936. {
  1937. if( hWnd == hWndMainFrame
  1938. || hWnd == pWndForPlacement->m_hWnd
  1939. )
  1940. {
  1941. bCancelButtonTracking = false;
  1942. break;
  1943. } // if( hWnd == hWndMainFrame ...
  1944. }
  1945. }
  1946. if( bCancelButtonTracking )
  1947. return TRUE;
  1948. } // if( hWndMainFrame != NULL )
  1949. INT nStartFlatIndex = OnCalcFlatTrackingIndex( vkTCHAR, -1 );
  1950. if( nStartFlatIndex < 0 )
  1951. {
  1952. INT nIndex, nCount = GetButtonsCount();
  1953. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  1954. {
  1955. CExtBarButton * pTBB = GetButton( nIndex );
  1956. ASSERT_VALID( pTBB );
  1957. if( pTBB->OnQueryFlatTrackingEnabled() )
  1958. {
  1959. nStartFlatIndex = nIndex;
  1960. break;
  1961. }
  1962. }
  1963. } // if( nStartFlatIndex < 0 )
  1964. if( nStartFlatIndex >= 0 )
  1965. {
  1966. TrackButtonMenu( nStartFlatIndex );
  1967. return TRUE;
  1968. } // if( nStartFlatIndex >= 0 )
  1969. else
  1970. return FALSE;
  1971. } // only VK_MENU pressed
  1972. if( (! m_bPresubclassDialogMode )
  1973. && bAlt
  1974. && (  vkTCHAR == VK_SPACE
  1975. || ( _IsMdiApp() // (+ v.2.23)
  1976. && ( vkTCHAR == VK_SUBTRACT
  1977. // disable warning C4310: cast truncates constant value
  1978. #pragma warning( push )
  1979. #pragma warning( disable : 4310 )
  1980. || vkTCHAR == ((TCHAR)0xbd) // '-' near '0'
  1981. // rollback warning C4310: cast truncates constant value
  1982. #pragma warning( pop )
  1983. )
  1984. )
  1985. )
  1986. )
  1987. {
  1988. if( bDockSiteCustomizeMode )
  1989. return TRUE;
  1990. if( bKeyUp )
  1991. return TRUE;
  1992. // allow child popup track it's system menu
  1993. CWnd * pWnd = CWnd::GetActiveWindow();
  1994. if( pWnd == NULL
  1995. || (!(::IsWindow(pWnd->GetSafeHwnd())))
  1996. )
  1997. return TRUE;
  1998. if( pWnd->GetSafeHwnd() != _GetDockingFrameImpl()->GetSafeHwnd()
  1999. && (pWnd->GetStyle() & WS_POPUP) != 0
  2000. )
  2001. return TRUE;
  2002. // track frame system menu
  2003. CExtToolControlBar::g_bMenuTrackingExpanded = false;
  2004. if( !_IsDockSiteCustomizeMode() )
  2005. {
  2006. _CancelFlatTracking();
  2007. if( vkTCHAR == VK_SPACE )
  2008. {
  2009. if( ! TrackMainFrameSystemMenu( NULL, TRUE ) )
  2010. return FALSE;
  2011. } // if( vkTCHAR == VK_SPACE )
  2012. else
  2013. {
  2014. ASSERT( _IsMdiApp() ); // (+ v.2.23)
  2015. if(    nMsg == WM_KEYDOWN
  2016. || nMsg == WM_KEYUP
  2017. )
  2018. return TRUE;
  2019. BOOL bMax = FALSE;
  2020. HWND hWndActiveChild = _GetActiveMdiChildWnd( bMax );
  2021. if( hWndActiveChild == NULL )
  2022. {
  2023. if( !bKeyUp )
  2024. g_bCancelNearestAltUp = true;
  2025. return TRUE;
  2026. }
  2027. bool bExplicitTrackChildFrameSystemMenu = true;
  2028. if( GetButtonsCount() > 0 )
  2029. {
  2030. CExtBarButton * pTBB = _GetButtonPtr( 0 );
  2031. ASSERT_VALID( pTBB );
  2032. if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) )
  2033. {
  2034. if( ! CExtPopupMenuWnd::IsMenuTracking() )
  2035. {
  2036. HWND hWndFocus = ::GetFocus();
  2037. if( hWndFocus != NULL )
  2038. ::SendMessage( hWndFocus, WM_CANCELMODE, 0L, 0L );
  2039. } // if( ! CExtPopupMenuWnd::IsMenuTracking() )
  2040. VERIFY( CExtToolControlBar::TrackButtonMenu( 0 ) );
  2041. bExplicitTrackChildFrameSystemMenu = false;
  2042. } // if( pTBB->IsKindOf(RUNTIME_CLASS(CExtBarMdiDocButton)) )
  2043. } // if( GetButtonsCount() > 0 )
  2044. if( bExplicitTrackChildFrameSystemMenu )
  2045. if( ! TrackChildFrameSystemMenu( NULL, TRUE ) )
  2046. return FALSE;
  2047. } // else from if( vkTCHAR == VK_SPACE )
  2048. }
  2049. return TRUE;
  2050. } // if( ( !m_bPresubclassDialogMode ) && bAlt && vkTCHAR == VK_SPACE )
  2051. if( ( bPrintPreviewMode || bComboDropDownTracking )
  2052. && (! bDockSiteCustomizeMode )
  2053. )
  2054. return FALSE;
  2055. if( ( bAlt
  2056. || ( m_bFlatTracking
  2057. && vkTCHAR != VK_LEFT
  2058. && vkTCHAR != VK_RIGHT
  2059. && vkTCHAR != VK_UP
  2060. && vkTCHAR != VK_DOWN
  2061. && vkTCHAR != VK_F4
  2062. && vkTCHAR != VK_RETURN
  2063. && vkTCHAR != VK_SPACE
  2064. && vkTCHAR != VK_ESCAPE
  2065. && vkTCHAR != VK_TAB
  2066. )
  2067. )
  2068. && (!bDockSiteCustomizeMode)
  2069. )
  2070. { // if VK_ALT + VK_... pressed
  2071. // if( g_bCancelNearestAltUp ) // (+ v.2.23)
  2072. // return FALSE;
  2073. if( bKeyUp )
  2074. {
  2075. if( m_bHelperTrackingCharCode )
  2076. return FALSE;
  2077. return TRUE;
  2078. }
  2079. BYTE lpKeyState[256];
  2080. ::GetKeyboardState( lpKeyState );
  2081. UINT wScanCode = ::MapVirtualKey( vkTCHAR, 0 );
  2082. HKL hKeyboardLayout =
  2083. ::GetKeyboardLayout(
  2084. ( ::AfxGetThread() ) -> m_nThreadID
  2085. );
  2086. #if (defined _UNICODE)
  2087. TCHAR szChar[2] = { _T(''), _T('') };
  2088. ::ToUnicodeEx( vkTCHAR, wScanCode, lpKeyState, szChar, 1, 1, hKeyboardLayout );
  2089. #else
  2090. WORD nMapped = 0;
  2091. ::ToAsciiEx( vkTCHAR, wScanCode, lpKeyState, &nMapped, 1, hKeyboardLayout );
  2092. TCHAR szChar[2] = { (TCHAR)nMapped, _T('') };
  2093. #endif
  2094. ::CharUpper( szChar );
  2095. int nBtnIdx = -1;
  2096. if( szChar[0] != 0 )
  2097. {
  2098. nBtnIdx = GetButtonByAccessKey( szChar[0] );
  2099. if( nBtnIdx < 0 )
  2100. {
  2101. CPtrList _listVisibleToolBars;
  2102. CFrameWnd * pDockSite = m_pDockSite;
  2103. if( pDockSite == NULL )
  2104. pDockSite =
  2105. DYNAMIC_DOWNCAST(
  2106. CFrameWnd,
  2107. GetParent()
  2108. );
  2109. if( pDockSite != NULL )
  2110. {
  2111. ExtControlBarVector_t vBars;
  2112. ((const CExtControlBar *)this)->_GetFrameControlBars(
  2113. false,
  2114. vBars,
  2115. __GFECB_FIXED|__GFECB_NONFIXED|__GFECB_DOCKED|__GFECB_FLOATED|__GFECB_VIS_ALL
  2116. );
  2117. for( int i = 0; i < vBars.GetSize(); i++ )
  2118. {
  2119. CExtToolControlBar * pToolBar =
  2120. DYNAMIC_DOWNCAST(
  2121. CExtToolControlBar,
  2122. vBars[i]
  2123. );
  2124. if( pToolBar->GetSafeHwnd() == NULL
  2125. || pToolBar == this
  2126. )
  2127. continue;
  2128. ASSERT_VALID( pToolBar );
  2129. ASSERT( pToolBar->IsVisible() );
  2130. _listVisibleToolBars.AddTail( pToolBar );
  2131. }
  2132. } // if( pDockSite != NULL )
  2133. else
  2134. {
  2135. for( CWnd * pWnd = GetParent()->GetWindow( GW_CHILD );
  2136. pWnd != NULL;
  2137. pWnd = pWnd->GetWindow( GW_HWNDNEXT )
  2138. )
  2139. {
  2140. CExtToolControlBar * pToolBar =
  2141. DYNAMIC_DOWNCAST(
  2142. CExtToolControlBar,
  2143. pWnd
  2144. );
  2145. if( pToolBar->GetSafeHwnd() == NULL
  2146. || pToolBar == this
  2147. )
  2148. continue;
  2149. ASSERT_VALID( pToolBar );
  2150. if( ! pToolBar->IsVisible() )
  2151. continue;
  2152. _listVisibleToolBars.AddTail( pToolBar );
  2153. }
  2154. } // else from if( pDockSite != NULL )
  2155. for( POSITION pos = _listVisibleToolBars.GetHeadPosition();
  2156. pos != NULL;
  2157. )
  2158. {
  2159. CExtToolControlBar * pToolBar = (CExtToolControlBar *)
  2160. _listVisibleToolBars.GetNext( pos );
  2161. int nBtnIdx = pToolBar->GetButtonByAccessKey( szChar[0] );
  2162. if( nBtnIdx < 0 )
  2163. continue;
  2164. CExtBarButton * pTBB = pToolBar->GetButton( nBtnIdx );
  2165. ASSERT_VALID( pTBB );
  2166. ASSERT( !pTBB->IsSeparator() );
  2167. if( ! CExtPopupMenuWnd::IsMenuTracking() )
  2168. {
  2169. HWND hWndFocus = ::GetFocus();
  2170. if( hWndFocus != NULL )
  2171. ::SendMessage( hWndFocus, WM_CANCELMODE, 0L, 0L );
  2172. } // if( ! CExtPopupMenuWnd::IsMenuTracking() )
  2173. _CancelFlatTracking();
  2174. if( pTBB->IsAbleToTrackMenu() )
  2175. {
  2176. CExtToolControlBar::g_bMenuTrackingExpanded = false;
  2177. pToolBar->TrackButtonMenu(
  2178. nBtnIdx,
  2179. true,
  2180. false,
  2181. m_bUseFastKeyboardMenuTracking
  2182. );
  2183. } // if( pTBB->IsAbleToTrackMenu() )
  2184. else
  2185. {
  2186. g_bCancelNearestAltUp =
  2187. CExtPopupMenuWnd::IsKeyPressed( VK_MENU )
  2188. ? true : false;
  2189. pTBB->OnDeliverCmd();
  2190. } // else from if( pTBB->IsAbleToTrackMenu() )
  2191. return TRUE;
  2192. }
  2193. g_bCancelNearestAltUp = true; // (+ v.2.24)
  2194. return FALSE;
  2195. } // if( nBtnIdx < 0 )
  2196. else
  2197. {
  2198. CExtBarButton * pTBB = CExtToolControlBar::GetButton( nBtnIdx );
  2199. ASSERT_VALID( pTBB );
  2200. ASSERT( !pTBB->IsSeparator() );
  2201. if( ! CExtPopupMenuWnd::IsMenuTracking() )
  2202. {
  2203. HWND hWndFocus = ::GetFocus();
  2204. if( hWndFocus != NULL )
  2205. ::SendMessage( hWndFocus, WM_CANCELMODE, 0L, 0L );
  2206. } // if( ! CExtPopupMenuWnd::IsMenuTracking() )
  2207. _CancelFlatTracking();
  2208. if( pTBB->IsAbleToTrackMenu() )
  2209. {
  2210. CExtToolControlBar::g_bMenuTrackingExpanded = false;
  2211. CExtToolControlBar::TrackButtonMenu(
  2212. nBtnIdx,
  2213. true,
  2214. false,
  2215. m_bUseFastKeyboardMenuTracking
  2216. );
  2217. } // if( pTBB->IsAbleToTrackMenu() )
  2218. else
  2219. {
  2220. g_bCancelNearestAltUp =
  2221. CExtPopupMenuWnd::IsKeyPressed( VK_MENU )
  2222. ? true : false;
  2223. pTBB->OnDeliverCmd();
  2224. } // else from if( pTBB->IsAbleToTrackMenu() )
  2225. return TRUE;
  2226. } // else from if( nBtnIdx < 0 )
  2227. } // if( szChar[0] != 0 )
  2228. g_bCancelNearestAltUp = true; // (+ v.2.23)
  2229. if( m_bFlatTracking ) // (+ v.2.25)
  2230. {
  2231. if( bAlt && m_bFlatTracking && ( vkTCHAR == VK_DOWN || vkTCHAR == VK_UP ) )
  2232. {
  2233. }
  2234. else
  2235. return TRUE;
  2236. }
  2237. else
  2238. return FALSE;
  2239. } // if( (bAlt || m_bFlatTracking) && (!bDockSiteCustomizeMode) )
  2240. if( m_bFlatTracking && (!bDockSiteCustomizeMode) )
  2241. {
  2242. if( bKeyUp )
  2243. return TRUE;
  2244. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2245. if( vkTCHAR == VK_LEFT
  2246. || vkTCHAR == VK_RIGHT
  2247. || vkTCHAR == VK_UP
  2248. || vkTCHAR == VK_DOWN
  2249. || vkTCHAR == VK_TAB
  2250. || vkTCHAR == VK_SPACE
  2251. || vkTCHAR == VK_ESCAPE
  2252. || vkTCHAR == VK_RETURN
  2253. || ( VK_F1 <= vkTCHAR && vkTCHAR <= VK_F24 )
  2254. )
  2255. {
  2256. HDWP hPassiveModeDWP = NULL;
  2257. int nBtnIdx, nCountOfButtons = _GetButtonsCountImpl();
  2258. for( nBtnIdx = 0; nBtnIdx < nCountOfButtons; nBtnIdx++ )
  2259. {
  2260. CExtBarButton * pTBB = _GetButtonPtr( nBtnIdx );
  2261. ASSERT_VALID( pTBB );
  2262. pTBB->OnKeyTipTrackingQuery( false, NULL, hPassiveModeDWP );
  2263. }
  2264. }
  2265. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2266. bool bUpdateIndex = false;
  2267. TCHAR _vkTCHAR = vkTCHAR;
  2268. if( ( vkTCHAR == VK_DOWN || vkTCHAR == VK_UP )
  2269. && bAlt
  2270. )
  2271. _vkTCHAR = VK_F4;
  2272. int nNewCustomFlatTrackingIndex =
  2273. OnCalcFlatTrackingIndex(
  2274. INT(_vkTCHAR ),
  2275. INT( TCHAR( m_nFlatTrackingIndex ) )
  2276. );
  2277. if( nNewCustomFlatTrackingIndex >= 0 )
  2278. {
  2279. m_nFlatTrackingIndex = nNewCustomFlatTrackingIndex;
  2280. bUpdateIndex = true;
  2281. } // if( nNewCustomFlatTrackingIndex >= 0 )
  2282. else
  2283. {
  2284. if( _vkTCHAR == VK_TAB )
  2285. {
  2286. if( bShift )
  2287. _vkTCHAR = VK_LEFT;
  2288. else
  2289. _vkTCHAR = VK_RIGHT;
  2290. } // if( _vkTCHAR == VK_TAB )
  2291. switch( _vkTCHAR )
  2292. {
  2293. case VK_LEFT:
  2294. bUpdateIndex = true;
  2295. m_nFlatTrackingIndex =
  2296. GetVisibleButton(
  2297. m_nFlatTrackingIndex,
  2298. FALSE
  2299. );
  2300. break;
  2301. case VK_RIGHT:
  2302. bUpdateIndex = true;
  2303. m_nFlatTrackingIndex =
  2304. GetVisibleButton(
  2305. m_nFlatTrackingIndex,
  2306. TRUE
  2307. );
  2308. break;
  2309. case VK_SPACE:
  2310. case VK_RETURN:
  2311. case VK_F4:
  2312. case VK_UP:
  2313. case VK_DOWN:
  2314. {
  2315. if( CExtPopupMenuWnd::IsMenuTracking()
  2316. || m_nFlatTrackingIndex < 0
  2317. )
  2318. return TRUE;
  2319. ASSERT( m_nFlatTrackingIndex < GetButtonsCount() );
  2320. CExtBarButton * pTBB =
  2321. _GetButtonPtr(m_nFlatTrackingIndex);
  2322. ASSERT_VALID( pTBB );
  2323. if( pTBB->IsAbleToTrackMenu() )
  2324. {
  2325. if( ! CExtPopupMenuWnd::IsMenuTracking() )
  2326. {
  2327. HWND hWndFocus = ::GetFocus();
  2328. if( hWndFocus != NULL )
  2329. ::SendMessage( hWndFocus, WM_CANCELMODE, 0L, 0L );
  2330. } // if( ! CExtPopupMenuWnd::IsMenuTracking() )
  2331. int nIndex = m_nFlatTrackingIndex;
  2332. if( m_bFlatTracking )
  2333. {
  2334. m_bFlatTracking = false;
  2335. OnFlatTrackingStop();
  2336. } // if( m_bFlatTracking )
  2337. _UpdateFlatTracking( FALSE );
  2338. CExtToolControlBar::TrackButtonMenu(
  2339. nIndex,
  2340. true,
  2341. false,
  2342. m_bUseFastKeyboardMenuTracking
  2343. );
  2344. }
  2345. else
  2346. {
  2347. if( ( vkTCHAR == VK_RETURN || vkTCHAR == VK_SPACE )
  2348. // && CExtCmdManager::IsCommand(
  2349. // pTBB->GetCmdID(true)
  2350. // )
  2351. )
  2352. {
  2353. pTBB->OnClick( CPoint(0,0), false );
  2354. }
  2355. if( m_bFlatTracking )
  2356. {
  2357. m_bFlatTracking = false;
  2358. OnFlatTrackingStop();
  2359. } // if( m_bFlatTracking )
  2360. _UpdateFlatTracking();
  2361. }
  2362. return TRUE;
  2363. }
  2364. break;
  2365. case VK_ESCAPE:
  2366. if( m_bFlatTracking )
  2367. {
  2368. m_bFlatTracking = false;
  2369. OnFlatTrackingStop();
  2370. } // if( m_bFlatTracking )
  2371. _UpdateFlatTracking();
  2372. return TRUE;
  2373. } // switch( _vkTCHAR )
  2374. } // else from if( nNewCustomFlatTrackingIndex >= 0 )
  2375. if( bUpdateIndex )
  2376. {
  2377. int nCountOfButtons = GetButtonsCount();
  2378. ASSERT( nCountOfButtons > 0 );
  2379. if( m_nFlatTrackingIndex < 0 )
  2380. m_nFlatTrackingIndex = nCountOfButtons - 1;
  2381. else if(m_nFlatTrackingIndex >= nCountOfButtons)
  2382. m_nFlatTrackingIndex = 0;
  2383. }
  2384. _UpdateFlatTracking();
  2385. return TRUE;
  2386. } // if( m_bFlatTracking && (!bDockSiteCustomizeMode) )
  2387. }
  2388. if( nMsg == WM_CONTEXTMENU )
  2389. {
  2390. if( g_bMenuTracking || m_bFlatTracking || bDockSiteCustomizeMode )
  2391. return TRUE;
  2392. }
  2393. if( m_bFlatTracking && (!bDockSiteCustomizeMode) )
  2394. {
  2395. if( (nMsg >= __EXT_MFC_WM_MOUSEFIRST && nMsg <= __EXT_MFC_WM_MOUSELAST)
  2396. && nMsg != WM_MOUSEMOVE
  2397. )
  2398. _CancelFlatTracking();
  2399. } // if( m_bFlatTracking && (!bDockSiteCustomizeMode) )
  2400. return FALSE;
  2401. }
  2402. CRect CExtMenuControlBar::_GetChildFrameSysIconRect()
  2403. {
  2404. CRect rc;
  2405. rc.SetRectEmpty();
  2406. BOOL bMax = FALSE;
  2407. HWND hWndActiveChild =
  2408. _GetActiveMdiChildWnd( bMax );
  2409. if( hWndActiveChild == NULL )
  2410. return rc;
  2411. ASSERT( ::IsWindow(hWndActiveChild) );
  2412. if( bMax )
  2413. return rc;
  2414. CWnd * pWnd = CWnd::FromHandlePermanent(hWndActiveChild);
  2415. if( pWnd == NULL )
  2416. {
  2417. ASSERT( FALSE );
  2418. return rc;
  2419. }
  2420. ASSERT_VALID( pWnd );
  2421. // FrameFeatures does not use CMDIChildWnd
  2422. // ASSERT( pWnd->IsKindOf(RUNTIME_CLASS(CMDIChildWnd)) );
  2423. //CFrameWnd * pFrame = 
  2424. // DYNAMIC_DOWNCAST(
  2425. // CFrameWnd,
  2426. // pWnd
  2427. // );
  2428. // ASSERT( pFrame != NULL );
  2429. // if( pFrame == NULL )
  2430. // {
  2431. // ASSERT( FALSE );
  2432. // return rc;
  2433. // }
  2434. // ASSERT_VALID( pFrame );
  2435. CRect rcWnd,rcClient,rcHelper;
  2436. pWnd->GetWindowRect( &rcWnd );
  2437. pWnd->GetClientRect( &rcClient );
  2438. rcHelper = rcWnd;
  2439. pWnd->ScreenToClient( &rcHelper );
  2440. ASSERT( rcHelper.top <= rcClient.top );
  2441. int yDiff = rcClient.top - rcHelper.top;
  2442. rc.SetRect(
  2443. rcWnd.left + GetSystemMetrics(SM_CYFRAME),
  2444. rcWnd.top + GetSystemMetrics(SM_CXFRAME),
  2445. rcWnd.left + yDiff,
  2446. rcWnd.top + yDiff
  2447. );