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

界面编程

开发平台:

Visual C++

  1. if( nIndex == IDX_SCROLL_BOTTOM )
  2. {
  3. rectItem = m_rcScrollBottom;
  4. return;
  5. }
  6. }
  7. if( m_bExpandAvailable
  8. && nIndex == IDX_EXPAND
  9. )
  10. {
  11. rectItem = m_rcExpandBtn;
  12. if( bIncludeIndents )
  13. ((CRect *)(&rectItem))->DeflateRect(1,0);
  14. return;
  15. }
  16. bool bTearOff = _IsTearOff();
  17. int nTearOffCaptionHeight = bTearOff ? _GetTearOffCaptionHeight() : 0;
  18. if( bTearOff
  19. && nIndex == IDX_TEAROFF
  20. )
  21. {
  22. rectItem = m_rcTearOffBtn;
  23. if( bIncludeIndents )
  24. ((CRect *)(&rectItem))->DeflateRect(1,0);
  25. return;
  26. }
  27. if( nCountOfItems == 0 )
  28. {
  29. ::SetRectEmpty( &rectItem );
  30. return;
  31. }
  32. if( nIndex < 0 )
  33. {
  34. ::SetRectEmpty( &rectItem );
  35. return;
  36. }
  37. ASSERT( nIndex >= 0 && nIndex < nCountOfItems );
  38. MENUITEMDATA & mi = ItemGetInfo( nIndex );
  39. if( ! mi.IsDisplayed() )
  40. {
  41. ::SetRectEmpty( &rectItem );
  42. return;
  43. }
  44. CRect rcCache = mi.GetCachedRect( bIncludeIndents );
  45. if( ! rcCache.IsRectEmpty() )
  46. {
  47. ::CopyRect( &rectItem, rcCache );
  48. return;
  49. }
  50. CRect rcMB = OnQueryMenuBorderMetrics();
  51. int y = m_nDyScrollOffset + rcMB.top;
  52. CRect rcItem;
  53. rcItem.SetRectEmpty();
  54. if( mi.IsToolButton() )
  55. {
  56. rcItem.left =
  57. rcMB.left; 
  58. // + __EXT_MENU_TOOLBTN_GAP; // - 2.28 
  59. rcItem.right =
  60. mi.GetMeasuredWidth();
  61. } // if( mi.IsToolButton() )
  62. else
  63. {
  64. rcItem.left =
  65. rcMB.left;
  66. rcItem.right =
  67. m_sizeFullItems.cx
  68. + rcMB.left;
  69. } // else from if( mi.IsToolButton() )
  70. if( bIncludeIndents )
  71. {
  72. INT nMarginLeft = 0, nMarginRight = 0;
  73. mi.GetOuterMargins(
  74. &nMarginLeft,
  75. NULL,
  76. &nMarginRight,
  77. NULL
  78. );
  79. rcItem.DeflateRect(
  80. nMarginLeft,
  81. 0,
  82. nMarginRight,
  83. 0
  84. );
  85. } // if( bIncludeIndents )
  86. INT iter = 0;
  87. for( int i = 0;
  88. i < nIndex
  89. && iter != m_items_all.GetSize();
  90. i++, iter++
  91. )
  92. {
  93. MENUITEMDATA & mi = ItemGetInfo( iter );
  94. if( ! mi.IsDisplayed() )
  95. continue;
  96. const RECT & rcBase = mi.GetBaseRect();
  97. y += (rcBase.bottom - rcBase.top);
  98. INT nMarginTop = 0, nMarginBottom = 0;
  99. mi.GetOuterMargins(
  100. NULL,
  101. &nMarginTop,
  102. NULL,
  103. &nMarginBottom
  104. );
  105. if( mi.GetIndex() == ItemGetCount() - 1 )
  106. nMarginBottom--;
  107. y += (nMarginTop + nMarginBottom);
  108. }
  109. ASSERT( iter != m_items_all.GetSize() );
  110. rcItem.OffsetRect( 0, y + 1 );
  111. mi = ItemGetInfo( iter );
  112. ASSERT( mi.IsDisplayed() );
  113. const RECT & rcBase = mi.GetBaseRect();
  114. rcItem.bottom =
  115. rcItem.top + rcBase.bottom - rcBase.top;
  116. INT nMarginTop = 0, nMarginBottom = 0;
  117. mi.GetOuterMargins(
  118. NULL,
  119. &nMarginTop,
  120. NULL,
  121. &nMarginBottom
  122. );
  123. if( mi.GetIndex() == ItemGetCount() - 1 )
  124. nMarginBottom--;
  125. rcItem.bottom += (nMarginTop + nMarginBottom);
  126. if( bIncludeIndents )
  127. {
  128. rcItem.DeflateRect(
  129. 0,
  130. nMarginTop,
  131. 0,
  132. nMarginBottom
  133. );
  134. } // if( bIncludeIndents )
  135. // FIX for combined exclude area
  136. rcItem.OffsetRect( rcClient.TopLeft() );
  137. if( bTearOff )
  138. rcItem.OffsetRect( 0, nTearOffCaptionHeight );
  139. rectItem = rcItem;
  140. mi.CacheRect( rectItem, bIncludeIndents );
  141. }
  142. void CExtPopupMenuWnd::_GetItemRectPalette(
  143. int nIndex,
  144. RECT & rectItem,
  145. bool bIncludeIndents // = true
  146. )
  147. {
  148. ASSERT_VALID( this );
  149. int nCountOfItems = (int)m_items_all.GetSize();
  150. if( nCountOfItems == 0 )
  151. {
  152. ::SetRectEmpty( &rectItem );
  153. return;
  154. }
  155. if( nIndex < 0 || nIndex >= nCountOfItems )
  156. {
  157. CExtPopupMenuWnd::_GetItemRect(
  158. nIndex,
  159. rectItem,
  160. bIncludeIndents
  161. );
  162. return;
  163. }
  164. MENUITEMDATA & mi = ItemGetInfo( nIndex );
  165. if( ! mi.IsDisplayed() )
  166. {
  167. ::SetRectEmpty( &rectItem );
  168. return;
  169. }
  170. CRect rcCache = mi.GetCachedRect( bIncludeIndents );
  171. if( ! rcCache.IsRectEmpty() )
  172. {
  173. ::CopyRect( &rectItem, rcCache );
  174. return;
  175. }
  176. CRect rcClient;
  177. _GetClientRect( &rcClient );
  178. rcClient.left += m_nLeftAreaWidth;
  179. CRect rcMB = OnQueryMenuBorderMetrics();
  180. int y = m_nDyScrollOffset + rcMB.top;
  181. CRect rcItem;
  182. rcItem.SetRectEmpty();
  183. if( mi.IsSeparator() )
  184. {
  185. rcItem.left = rcItem.right = rcMB.left + 2; 
  186. }
  187. else if( mi.IsToolButton() )
  188. {
  189. rcItem.left = rcMB.left + 2; 
  190. rcItem.right = rcItem.left + mi.GetMeasuredWidth();
  191. }
  192. else
  193. {
  194. rcItem.left = rcMB.left;
  195. rcItem.right = m_sizeFullItems.cx + rcMB.left;
  196. }
  197. int x = rcItem.left;
  198. int xRow = x, dyRow = 0;
  199. int iter = 0, i = 0, nRowStart = 0;
  200. for( ; i < nIndex && iter != nCountOfItems; i++, iter++ )
  201. {
  202. MENUITEMDATA & mi = ItemGetInfo( iter );
  203. if( ! mi.IsDisplayed() )
  204. continue;
  205. bool bWrap = _IsPaletteItemWrap( iter );
  206. const RECT & rcBase = mi.GetBaseRect();
  207. if( mi.IsSeparator() )
  208. bWrap = true;
  209. int nWidth = rcBase.right - rcBase.left;
  210. int nHeight = rcBase.bottom - rcBase.top;
  211. dyRow = max( dyRow, nHeight );
  212. if( bWrap )
  213. {
  214. xRow = x;
  215. y += dyRow;
  216. dyRow = 0;
  217. if( mi.IsSeparator() )
  218. y +=
  219. PmBridge_GetPM()->GetSeparatorHeight()
  220. + __EXT_MENU_GAP
  221. ;
  222. if( i < nIndex )
  223. nRowStart = i+1;
  224. }
  225. else
  226. {
  227. xRow += nWidth;
  228. if( mi.IsInplaceEdit() )
  229. xRow += (iter == 0) ? __EXT_MENU_GAP : (__EXT_MENU_GAP*2);
  230. // else
  231. // xRow += (nRowStart == i) ? 0 : __EXT_MENU_GAP;
  232. xRow += 2;
  233. }
  234. } // for( ; i < nIndex && iter != nCountOfItems; i++, iter++ )
  235. ASSERT( iter != m_items_all.GetSize() );
  236. bool bTearOff = _IsTearOff();
  237. int nTearOffCaptionHeight = bTearOff ? _GetTearOffCaptionHeight() : 0;
  238. mi = ItemGetInfo( iter );
  239. ASSERT( mi.IsDisplayed() );
  240. if( mi.IsSeparator() )
  241. {
  242. rcItem.OffsetRect( 0, y + 2 );
  243. rcItem.OffsetRect( rcClient.TopLeft() );
  244. rcItem.right =
  245. rcClient.right
  246. - rcItem.left + rcClient.left 
  247. ;
  248. rcItem.top += __EXT_MENU_GAP / 2;
  249. rcItem.bottom =
  250. rcItem.top
  251. + PmBridge_GetPM()->GetSeparatorHeight()
  252. + __EXT_MENU_GAP;
  253. ;
  254. if( bTearOff )
  255. rcItem.OffsetRect( 0, nTearOffCaptionHeight );
  256. rectItem = rcItem;
  257. return;
  258. }
  259. rcItem.OffsetRect( xRow - rcItem.left, 0 );
  260. if( iter != 0 && mi.IsInplaceEdit() )
  261. rcItem.OffsetRect( __EXT_MENU_GAP, 0 );
  262. rcItem.OffsetRect( 0, y + 2 );
  263. const RECT & rcBase = mi.GetBaseRect();
  264. rcItem.bottom =
  265. rcItem.top + rcBase.bottom - rcBase.top;
  266. dyRow = 0;
  267. for( iter = nRowStart; iter != nCountOfItems; iter++ )
  268. {
  269. MENUITEMDATA & mi = ItemGetInfo( iter );
  270. if( ! mi.IsDisplayed() )
  271. continue;
  272. bool bWrap = _IsPaletteItemWrap( iter );
  273. const RECT & rcBase = mi.GetBaseRect();
  274. if( mi.IsSeparator() )
  275. bWrap = true;
  276. int nHeight = rcBase.bottom - rcBase.top;
  277. dyRow = max( dyRow, nHeight );
  278. if( bWrap )
  279. break;
  280. } // for( iter = nRowStart; iter != nCountOfItems; iter++ )
  281. if( dyRow > 0 )
  282. {
  283. ASSERT( iter >= nIndex );
  284. int nHeight = rcItem.Height();
  285. ASSERT( nHeight <= dyRow );
  286. rcItem.OffsetRect(
  287. 0,
  288. ( dyRow - nHeight ) / 2
  289. );
  290. }
  291. rcItem.OffsetRect( rcClient.TopLeft() );
  292. if( bTearOff )
  293. rcItem.OffsetRect( 0, nTearOffCaptionHeight );
  294. rectItem = rcItem;
  295. mi.CacheRect( rectItem, bIncludeIndents );
  296. }
  297. void CExtPopupMenuWnd::_GetVisibleItems(
  298. HDC hDcTest, // may be NULL
  299. visible_items_t & v
  300. )
  301. {
  302. ASSERT_VALID( this );
  303. if( _IsPalette() )
  304. {
  305. _GetVisibleItemsPalette( hDcTest, v );
  306. return;
  307. }
  308. v.RemoveAll();
  309. INT iter = 0;
  310. for( int nIndex = 0;
  311. iter != m_items_all.GetSize();
  312. iter++, nIndex++
  313. )
  314. { // find visible items
  315. MENUITEMDATA & mi = ItemGetInfo( iter );
  316. if( !mi.IsDisplayed() )
  317. continue;
  318. CRect rcItem;
  319. _GetItemRect( nIndex, rcItem, true );
  320. CRect rcItemWithIndents;
  321. _GetItemRect( nIndex, rcItemWithIndents, false );
  322. if( rcItem.IsRectEmpty() 
  323. || rcItemWithIndents.IsRectEmpty()
  324. )
  325. continue;
  326. if( hDcTest != NULL
  327. && ( !::RectVisible( hDcTest, &rcItem ) 
  328. || !::RectVisible( hDcTest, &rcItemWithIndents ) 
  329. )
  330. )
  331. continue;
  332. VisibleItemDefinition_t vi;
  333. vi.m_nIndex = nIndex;
  334. vi.m_nHelperCmdID = mi.GetCmdID();
  335. vi.m_rcItem = rcItem;
  336. vi.m_rcItemWithIndents = rcItemWithIndents;
  337. if( mi.IsSeparator() )
  338. {
  339. vi.m_bHelperIsSeparator = true;
  340. v.Add( vi );
  341. continue;
  342. }
  343. if( mi.IsPopup() )
  344. {
  345. vi.m_bHelperIsPopup = true;
  346. CExtCmdItem * pCmdItem = mi.GetCmd();
  347. if( pCmdItem != NULL )
  348. {
  349. vi.m_bRarelyUsed =
  350. ( (!_FindCustomizeMode())
  351. && pCmdItem->StateIsRarelyUsed()
  352. ) ? true : false;
  353. } // if( pCmdItem != NULL )
  354. else
  355. vi.m_bRarelyUsed =
  356. (!_FindCustomizeMode())
  357. && mi.IsAllItemsRarelyUsed()
  358. && (!mi.IsForceDisplayed())
  359. ;
  360. v.Add( vi );
  361. continue;
  362. }
  363. if( mi.IsExtraMark() )
  364. vi.m_bRarelyUsed = false;
  365. else
  366. {
  367. CExtCmdItem * pCmdItem = mi.GetCmd();
  368. if( pCmdItem != NULL )
  369. vi.m_bRarelyUsed =
  370. ( (!_FindCustomizeMode())
  371. && pCmdItem->StateIsRarelyUsed()
  372. ) ? true : false;
  373. else
  374. vi.m_bRarelyUsed = false;
  375. } // else from if( mi.IsExtraMark() )
  376. v.Add( vi );
  377. } // find visible items
  378. INT vis_iter = 0;
  379. for( ; vis_iter < v.GetSize(); ++vis_iter )
  380. { // setup prev/next rarely used flags
  381. VisibleItemDefinition_t & vi = v[ vis_iter ];
  382. INT iter_prev = vis_iter;
  383. INT iter_next = vis_iter;
  384. if( vis_iter != 0 )
  385. {
  386. --iter_prev;
  387. if( v[iter_prev].m_bRarelyUsed )
  388. vi.m_bRarelyUsedPrev = true;
  389. } // if( vis_iter != v.begin() )
  390. ++iter_next;
  391. if( iter_next != v.GetSize() )
  392. {
  393. if( v[iter_next].m_bRarelyUsed )
  394. vi.m_bRarelyUsedNext = true;
  395. } // if( iter_next != v.end() )
  396. if( vi.m_bHelperIsSeparator )
  397. {
  398. if( vi.m_bRarelyUsedPrev
  399. && vi.m_bRarelyUsedNext
  400. && (!_FindCustomizeMode())
  401. )
  402. {
  403. vi.m_bRarelyUsed = true;
  404. ASSERT( vis_iter != 0 );
  405. v[iter_prev].m_bRarelyUsedNext = true;
  406. ASSERT( iter_next != 0 );
  407. v[iter_next].m_bRarelyUsedPrev = true;
  408. }
  409. }
  410. } // setup prev/next rarely used flags
  411. }
  412. void CExtPopupMenuWnd::_GetVisibleItemsPalette(
  413. HDC hDcTest, // may be NULL
  414. CExtPopupMenuWnd::visible_items_t & v
  415. )
  416. {
  417. ASSERT_VALID( this );
  418. v.RemoveAll();
  419. int nItemIndex = 0, nItemCount = (int)m_items_all.GetSize();
  420. for( ; nItemIndex < nItemCount; nItemIndex++ )
  421. {
  422. MENUITEMDATA & mi = ItemGetInfo( nItemIndex );
  423. if( ! mi.IsDisplayed() )
  424. mi.SetDisplayed( true );
  425. CRect rcItem;
  426. _GetItemRect( nItemIndex, rcItem, true );
  427. if( hDcTest != NULL
  428. && (! ::RectVisible( hDcTest, &rcItem )  )
  429. )
  430. continue;
  431. VisibleItemDefinition_t vi;
  432. vi.m_nIndex = nItemIndex;
  433. vi.m_nHelperCmdID = mi.GetCmdID();
  434. vi.m_rcItem = rcItem;
  435. vi.m_rcItemWithIndents = rcItem;
  436. if( mi.IsSeparator() )
  437. vi.m_bHelperIsSeparator = true;
  438. else if( mi.IsPopup() )
  439. vi.m_bHelperIsPopup = true;
  440. v.Add( vi );
  441. } // for( ; nItemIndex < nItemCount; nItemIndex++ )
  442. }
  443. bool CExtPopupMenuWnd::_IsPaletteItemWrap(
  444. int nIndex
  445. ) const
  446. {
  447. ASSERT_VALID( this );
  448. if( ! _IsPalette() )
  449. return false;
  450. if( nIndex < 0 )
  451. return false;
  452. int nCountOfItems = ItemGetCount();
  453. if( nIndex >= nCountOfItems  )
  454. return false;
  455. if( nIndex < (nCountOfItems-1) )
  456. {
  457. const MENUITEMDATA & miNext = ItemGetInfo( nIndex + 1 );
  458. if( miNext.IsSeparator() )
  459. return true;
  460. }
  461. const MENUITEMDATA & mi = ItemGetInfo( nIndex );
  462. if( mi.IsToolWrap() )
  463. return true;
  464. return false;
  465. }
  466. void CExtPopupMenuWnd::stat_paint_combined_menu_toolbtn(
  467. LPVOID pCookie,
  468. CDC & dc,
  469. const CWnd & refWndMenu,
  470. const CRect & rcExcludeArea, // in screen coords
  471. int eCombineAlign // CExtPopupMenuWnd::e_combine_align_t values
  472. )
  473. {
  474. eCombineAlign;
  475. INT nIndex = (INT)(__EXT_MFC_INT_PTR)pCookie;
  476. ASSERT( refWndMenu.GetSafeHwnd() != NULL );
  477. ASSERT( ::IsWindow( refWndMenu.GetSafeHwnd() ) );
  478. ASSERT( dc.GetSafeHdc() != NULL );
  479. if( rcExcludeArea.IsRectEmpty() )
  480. return;
  481. ASSERT_KINDOF( CExtPopupMenuWnd, (&refWndMenu) );
  482. CExtPopupMenuWnd * pPopup =
  483. (CExtPopupMenuWnd *)(&refWndMenu);
  484. ASSERT_VALID( pPopup );
  485. ASSERT( ! pPopup->m_bTopLevel );
  486. CExtPopupMenuWnd * pPopup2 = pPopup->m_pWndParentMenu;
  487. ASSERT_VALID( pPopup2 );
  488. ASSERT( 0 <= nIndex && nIndex < pPopup2->ItemGetCount() );
  489. CExtPopupMenuWnd::MENUITEMDATA & mi = pPopup2->ItemGetInfo(nIndex);
  490. CRect rcItem;
  491. pPopup2->_GetItemRect( nIndex, rcItem );
  492. CRect rcClientExcludeArea( rcExcludeArea );
  493. pPopup->ScreenToClient( &rcClientExcludeArea );
  494. rcItem.OffsetRect( - rcItem.TopLeft() );
  495. rcItem.OffsetRect( rcClientExcludeArea.TopLeft() );
  496. CRect rcTargetClient;
  497. pPopup->_GetClientRect( &rcTargetClient );
  498. dc.ExcludeClipRect( &rcTargetClient );
  499. CExtPopupMenuWnd::DRAWITEMDATA _DrawItemData(
  500. &dc,
  501. &rcItem,
  502. &rcItem,
  503. &mi,
  504. pPopup,
  505. ( pPopup->GetSite()->m_dwTrackFlags&TPMX_OWNERDRAW_FIXED ) ? true : false,
  506. mi.IsPopup(),
  507. false, // g_bMenuHighlightRarely && vi.m_bRarelyUsed,
  508. false, // g_bMenuHighlightRarely && vi.m_bRarelyUsedPrev,
  509. false  // g_bMenuHighlightRarely && vi.m_bRarelyUsedNext
  510. );
  511. bool bPainted =
  512. (_DrawItemData.m_bMenuOwnerDrawFixed)
  513. ? _DrawItemData.DoOwnerDrawPainting()
  514. : false
  515. ;
  516. bool bForceNoIcon = false, bForceNoText = false;
  517. if( (pPopup2->TrackFlagsGet()&TPMX_PALETTE) != 0 )
  518. {
  519. CExtCmdIcon * pIcon = mi.GetIconPtr();
  520. if( pIcon != NULL && pIcon->IsEmpty() )
  521. pIcon = NULL;
  522. if( mi.IsInplaceEdit() )
  523. bForceNoIcon = bForceNoText = true;
  524. else if( pIcon == NULL || ( pIcon != NULL && (! mi.IsIconMode() ) ) )
  525. {
  526. //bForceNoIcon = true;
  527. }
  528. else
  529. bForceNoText = true;
  530. }
  531. if( ! bPainted )
  532. _DrawItemData.PaintDefault(
  533. bForceNoIcon,
  534. bForceNoText
  535. );
  536. dc.SelectClipRgn( NULL );
  537. }
  538. void CExtPopupMenuWnd::DRAWITEMDATA::PaintDefault(
  539. bool bForceNoIcon, // = false
  540. bool bForceNoText, // = false
  541. bool bForceNoCheck, // = false
  542. bool bForceEnabled, // = false
  543. bool bForceUnselected // = false
  544. )
  545. {
  546. ASSERT( m_pDC != NULL );
  547. ASSERT( m_pDC->GetSafeHdc() != NULL );
  548. ASSERT( m_pRectItem != NULL );
  549. ASSERT( m_pRectItemWithIndents != NULL );
  550. ASSERT( m_pItemData != NULL );
  551. ASSERT( m_pPopup != NULL );
  552. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  553. CExtCustomizeSite * pSite = NULL;
  554. bool bCustomizeMode = false;
  555. #if (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  556. bool bResizingNode = false;
  557. #endif // (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  558. if( m_pPopup->_FindCustomizeMode() )
  559. {
  560. pSite = m_pPopup->_FindCustomizeSite();
  561. ASSERT( pSite != NULL );
  562. bCustomizeMode = true;
  563. bForceNoCheck = bForceEnabled = true;
  564. bForceUnselected = m_pItemData->IsPopup() ? false : true;
  565. #if (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  566. CExtCustomizeCmdTreeNode * pNode = ((MENUITEMDATA *)m_pItemData)->GetCmdNode();
  567. if( pNode != NULL )
  568. {
  569. ASSERT_VALID( pNode );
  570. if( pNode == pSite->GetResizingNode() )
  571. bResizingNode = true;
  572. }
  573. #endif // (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  574. }
  575. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  576. if( m_pItemData->IsToolButton()
  577. && (! m_pItemData->IsInplaceEdit() )
  578. )
  579. {
  580. bool bSelDraw =
  581. bForceUnselected 
  582. ? false 
  583. : m_pItemData->IsSelected();
  584. bool bTransparent = ! m_pItemData->IsSelected();
  585. bool bIsPopupAndPopupVisible = false;
  586. if( m_pItemData->IsPopup() )
  587. {
  588. const CExtPopupMenuWnd * pChildPopup = m_pItemData->GetPopup();
  589. if( pChildPopup->GetSafeHwnd() != NULL
  590. && ::IsWindow( pChildPopup->GetSafeHwnd() )
  591. && (pChildPopup->GetStyle() & WS_VISIBLE) != 0
  592. )
  593. bIsPopupAndPopupVisible = true;
  594. }
  595. if( bSelDraw 
  596. && bIsPopupAndPopupVisible
  597. )
  598. {
  599. bSelDraw = false;
  600. bTransparent = true;
  601. }
  602. bool bPushed =
  603. bSelDraw
  604. && m_pItemData->IsPopup();
  605. if( (! bForceNoCheck)
  606. && ( m_pItemData->GetCheck()
  607. || m_pItemData->GetRadio()
  608. )
  609. )
  610. {
  611. bPushed = true;
  612. bTransparent = false;
  613. }
  614. bool bSeparatedDropDown = false;
  615. bool bPushedDropDown = false;
  616. bool bHoverDropDown = false;
  617. if( bSelDraw
  618. && m_pItemData->IsPopup() 
  619. && (!bIsPopupAndPopupVisible)
  620. )
  621. {
  622. bPushedDropDown = false;
  623. bHoverDropDown = true;
  624. }
  625. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  626. const CExtCustomizeCmdTreeNode * pNode =
  627. m_pItemData->GetCmdNode();
  628. if( pNode != NULL )
  629. {
  630. ASSERT_VALID( pNode );
  631. bSeparatedDropDown =
  632. (pNode->GetFlags() & __ECTN_TBB_SEPARATED_DROPDOWN)
  633. ? true : false;
  634. } // if( pNode != NULL )
  635. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  636. bool bCombiningEnabled = 
  637. m_pPopup->PmBridge_GetPM()->IsMenuMustCombineExcludeArea( 
  638. NULL // should be NULL
  639. );
  640. if( (!bCombiningEnabled)
  641. && bIsPopupAndPopupVisible
  642. )
  643. {
  644. bPushed = true;
  645. bTransparent = false;
  646. if( bSeparatedDropDown )
  647. {
  648. bHoverDropDown = true;
  649. bPushedDropDown = true;
  650. }
  651. }
  652. CExtCmdIcon _iconLarge;
  653. CExtCmdIcon * pIcon = ( bForceNoIcon ) ? NULL : ((MENUITEMDATA *)m_pItemData)->GetIconPtr();
  654. if( g_bMenuLargeIcons && pIcon != NULL )
  655. {
  656. CSize _sizeIcon = pIcon->GetSize();
  657. _sizeIcon.cx *= 2;
  658. _sizeIcon.cy *= 2;
  659. if( _iconLarge.CreateScaledCopy(
  660. *pIcon,
  661. _sizeIcon
  662. )
  663. )
  664. pIcon = &_iconLarge;
  665. #ifdef _DEBUG
  666. else
  667. {
  668. ASSERT( FALSE );
  669. }
  670. #endif // _DEBUG
  671. } // if( g_bMenuLargeIcons && pIcon != NULL )
  672. bool bDrawBorder =
  673. m_pItemData->IsSelected()
  674. || bPushed
  675. || bSelDraw
  676. ;
  677. CExtPaintManager::PAINTPUSHBUTTONDATA _ppbd(
  678. m_pPopup,
  679. true,
  680. *m_pRectItem,
  681. bForceNoText ? _T("") : m_pItemData->GetText(),
  682. pIcon,
  683. true,
  684. bSelDraw, // hover
  685. bPushed, // pushed
  686. false,
  687. bForceEnabled
  688. || m_pItemData->IsEnabled()
  689. || m_pItemData->IsForceEnabled()
  690. || m_pItemData->IsEnabledAppearance()
  691. ,
  692. bDrawBorder, // border
  693. false,
  694. false,
  695. 0,
  696. m_pItemData->IsBold()
  697. ? ((HFONT)(m_pPopup->PmBridge_GetPM()->m_FontBold.GetSafeHandle()))
  698. : NULL,
  699. m_pItemData->IsPopup() ? true : false,
  700. 0,
  701. bTransparent // transparent
  702. );
  703. _ppbd.m_rcBorderSizes = CRect( 1, 1, 1, 1 );
  704. _ppbd.m_nIconAlignment = ( CExtPaintManager::__ALIGN_HORIZ_LEFT | CExtPaintManager::__ALIGN_VERT_CENTER );
  705. _ppbd.m_nTextAlignment = ( CExtPaintManager::__ALIGN_HORIZ_CENTER | CExtPaintManager::__ALIGN_VERT_CENTER );
  706. _ppbd.m_rcIconMargins = CRect( 2, 1, 1, 1 );
  707. _ppbd.m_rcTextMargins = CRect( 1, 1, 1, 1 );
  708. _ppbd.m_bSeparatedDropDown = bSeparatedDropDown;
  709. _ppbd.m_bPushedDropDown = bPushedDropDown;
  710. _ppbd.m_bHoverDropDown = bHoverDropDown;
  711. m_pPopup->PmBridge_GetPM()->PaintPushButton( *m_pDC, _ppbd );
  712. } // if( m_pItemData->IsToolButton() ...
  713. else
  714. {
  715. CExtCmdIcon * pIcon =
  716. ( bForceNoIcon )
  717. ? NULL
  718. : ((MENUITEMDATA *)m_pItemData)->GetIconPtr();
  719. if( pIcon != NULL && pIcon->IsEmpty() )
  720. pIcon = NULL;
  721. CExtCmdIcon _iconLarge;
  722. if( g_bMenuLargeIcons && pIcon != NULL )
  723. {
  724. CSize _sizeIcon = pIcon->GetSize();
  725. _sizeIcon.cx *= 2;
  726. _sizeIcon.cy *= 2;
  727. if( _iconLarge.CreateScaledCopy(
  728. *pIcon,
  729. _sizeIcon
  730. )
  731. )
  732. pIcon = &_iconLarge;
  733. #ifdef _DEBUG
  734. else
  735. {
  736. ASSERT( FALSE );
  737. }
  738. #endif // _DEBUG
  739. } // if( g_bMenuLargeIcons && pIcon != NULL )
  740. CExtPaintManager::PAINTMENUITEMDATA _pmid(
  741. m_pPopup,
  742. CRect( *m_pRectItem ),
  743. CRect( *m_pRectItemWithIndents ),
  744. m_pItemData->GetIconAreaWidth(),
  745. bForceNoText ? _T("") : m_pItemData->GetText(),
  746. ( bForceNoText || ( m_pPopup->TrackFlagsGet() & TPMX_HIDE_KEYBOARD_ACCELERATORS ) != 0 )
  747. ? _T("") : m_pItemData->GetAccelText(),
  748. pIcon,
  749. m_bPopupItem,
  750. bForceUnselected ? false : m_pItemData->IsSelected(),
  751. bForceNoCheck ? false : m_pItemData->GetCheck(),
  752. bForceNoCheck ? false : m_pItemData->GetRadio(),
  753. m_pItemData->IsIndeterminated(),
  754. bForceEnabled
  755. || m_pItemData->IsEnabled()
  756. || m_pItemData->IsForceEnabled()
  757. || m_pItemData->IsEnabledAppearance()
  758. ,
  759. m_bRarelyUsed,
  760. m_bRarelyUsedPrevious,
  761. m_bRarelyUsedNext,
  762. m_pItemData->GetCmdID(),
  763. m_pItemData->IsBold()
  764. ? ((HFONT)(m_pPopup->PmBridge_GetPM()->m_FontBold.GetSafeHandle()))
  765. : NULL
  766. );
  767. _pmid.m_bBigAccent = m_pItemData->IsBigAccent();
  768. _pmid.m_bForceNoLeftGradient =
  769. ( m_pItemData->IsForceNoLeftGradient()
  770. || m_pPopup->IsNoHighlightIconArea()
  771. ) ? true : false;
  772. if( ((MENUITEMDATA *)m_pItemData)->IsInplaceEdit() )
  773. {
  774. _pmid.m_rcInPlaceWnd =
  775. m_pItemData->AdjustInplaceEditRect(
  776. *m_pRectItem,
  777. m_pPopup->OnQueryLayoutRTL()
  778. );
  779. _pmid.m_strInPlaceText =
  780. m_pItemData->GetInplaceEditText();
  781. } // if( ((MENUITEMDATA *)m_pItemData)->IsInplaceEdit() )
  782. if( m_pItemData->IsExtraMark()
  783. && (! m_pPopup->_FindHelpMode() )
  784. )
  785. {
  786. _pmid.m_bXtraMark = true;
  787. _pmid.m_bXtraChecked = m_pItemData->IsExtraChecked();
  788. } // if( m_pItemData->IsExtraMark() ...
  789. ASSERT( !_pmid.m_bHelperPopupDropped );
  790. if( m_pItemData->IsPopup()
  791. && m_pItemData->GetPopup()->GetSafeHwnd() != NULL
  792. && m_pItemData->GetPopup()->IsWindowVisible()
  793. )
  794. _pmid.m_bHelperPopupDropped = true;
  795. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  796. #if (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  797. if( bResizingNode )
  798. _pmid.m_bSelected = true;
  799. #endif // (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  800. const CExtCustomizeCmdTreeNode * pNode =
  801. m_pItemData->GetCmdNode();
  802. if( pNode != NULL )
  803. {
  804. ASSERT_VALID( pNode );
  805. _pmid.m_bSeparatedDropDown =
  806. (pNode->GetFlags() & __ECTN_TBB_SEPARATED_DROPDOWN)
  807. ? true : false;
  808. } // if( pNode != NULL )
  809. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  810. _pmid.m_sExtendedText = m_pItemData->GetExtendedText();
  811. m_pPopup->PmBridge_GetPM()->PaintMenuItem( *m_pDC, _pmid );
  812. } // else from if( m_pItemData->IsToolButton() )
  813. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  814. if( m_pPopup->m_nHelperDropIndexBefore >= 0 )
  815. {
  816. int nCount = m_pPopup->ItemGetCount();
  817. ASSERT( m_pPopup->m_nHelperDropIndexBefore <= nCount );
  818. int nAlignAt = 0;
  819. int nItemIndex = m_pItemData->GetIndex();
  820. if( nItemIndex == m_pPopup->m_nHelperDropIndexBefore )
  821. nAlignAt = -1;
  822. else if( nItemIndex == ( nCount - 1 )
  823. && m_pPopup->m_nHelperDropIndexBefore == nCount
  824. )
  825. nAlignAt = 1;
  826. else if( ( nItemIndex + 1 ) == m_pPopup->m_nHelperDropIndexBefore
  827. && m_pPopup->ItemGetInfo( nItemIndex + 1 ).IsSeparator()
  828. )
  829. {
  830. nItemIndex;
  831. nAlignAt = 1;
  832. }
  833. if( nAlignAt != 0 )
  834. { // if paint drop divider
  835. CSize _sizeDDM = m_pPopup->PmBridge_GetPM()->GetDropDividerMerics();
  836. CRect rcItem;
  837. ASSERT( !m_pPopup->ItemGetInfo(nItemIndex).IsSeparator() );
  838. m_pPopup->_GetItemRect( nItemIndex, rcItem );
  839. int nY =
  840. ( nAlignAt > 0 )
  841. ? rcItem.bottom - _sizeDDM.cy/2
  842. : rcItem.top + _sizeDDM.cy/2
  843. ;
  844. rcItem.top = rcItem.bottom = nY;
  845. m_pPopup->PmBridge_GetPM()->PaintDropDivider(
  846. *m_pDC,
  847. rcItem,
  848. true,
  849. false
  850. );
  851. } // if( nAlignAt != 0 )
  852. } // if( m_pPopup->m_nHelperDropIndexBefore >= 0 )
  853. if( bCustomizeMode )
  854. {
  855. ASSERT( pSite != NULL );
  856. if(
  857. (
  858. pSite != NULL
  859. &&
  860. ( pSite->CustomizedNodeGet() != NULL
  861. && pSite->CustomizedNodeGet()  == ((MENUITEMDATA*)m_pItemData)->GetCmdNode()
  862. )
  863. )
  864. ||
  865. ( m_pPopup->m_pDragSrcNode != NULL
  866. && ((MENUITEMDATA*)m_pItemData)->GetCmdNode() == m_pPopup->m_pDragSrcNode
  867. )
  868. #if (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  869. || bResizingNode
  870. #endif // (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  871. )
  872. {
  873. CRect rcItem = m_pRectItem;
  874. m_pPopup->PmBridge_GetPM()->PaintDragSourceRect(
  875. *m_pDC,
  876. rcItem
  877. );
  878. }
  879. } // if( bCustomizeMode )
  880. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  881. }
  882. bool CExtPopupMenuWnd::DRAWITEMDATA::DoOwnerDrawPainting()
  883. {
  884. ASSERT( m_pDC != NULL );
  885. ASSERT( m_pDC->GetSafeHdc() != NULL );
  886. ASSERT( m_pRectItem != NULL );
  887. ASSERT( m_pItemData != NULL );
  888. ASSERT( m_pPopup != NULL );
  889. HWND hWndNotify =
  890. m_pPopup->m_hWndCmdReceiver;
  891. ASSERT( hWndNotify != NULL );
  892. ASSERT( ::IsWindow(hWndNotify) );
  893. LRESULT lResult =
  894. ::SendMessage(
  895. hWndNotify,
  896. CExtPopupMenuWnd::g_nMsgPopupDrawItem,
  897. 0,
  898. LPARAM( *this )
  899. );
  900. return lResult ? true : false;
  901. }
  902. void CExtPopupMenuWnd::DRAWBACKGROUNDDATA::Notify()
  903. {
  904. ASSERT( m_DC.GetSafeHdc() != NULL );
  905. ASSERT( m_pPopup != NULL );
  906. ASSERT( m_pPopup != NULL );
  907. HWND hWndNotify =
  908. m_pPopup->GetCmdReceiverHWND();
  909. ASSERT( hWndNotify != NULL );
  910. ASSERT( ::IsWindow(hWndNotify) );
  911. ::SendMessage(
  912. hWndNotify,
  913. CExtPopupMenuWnd::g_nMsgPopupDrawBackground,
  914. 0,
  915. LPARAM( *this )
  916. );
  917. }
  918. bool CExtPopupMenuWnd::DRAWLEFTAREADATA::DoOwnerDrawPainting()
  919. {
  920. ASSERT( m_pDC != NULL );
  921. ASSERT( m_pDC->GetSafeHdc() != NULL );
  922. ASSERT( m_pRectLeftArea != NULL );
  923. ASSERT( m_pPopup != NULL );
  924. HWND hWndNotify =
  925. m_pPopup->m_hWndCmdReceiver;
  926. ASSERT( hWndNotify != NULL );
  927. ASSERT( ::IsWindow(hWndNotify) );
  928. LRESULT lResult =
  929. ::SendMessage(
  930. hWndNotify,
  931. CExtPopupMenuWnd::g_nMsgPopupDrawLeftArea,
  932. 0,
  933. LPARAM( *this )
  934. );
  935. return lResult ? true : false;
  936. }
  937. void CExtPopupMenuWnd::_DoPaint(
  938. CDC & dcPaint,
  939. bool bUseBackBuffer // = true
  940. )
  941. {
  942. ASSERT_VALID( this );
  943. ASSERT_VALID( (&dcPaint) );
  944. ASSERT( dcPaint.GetSafeHdc() != NULL );
  945. if( m_hWnd != NULL )
  946. {
  947. ASSERT( ::IsWindow(m_hWnd) );
  948. CExtPaintManager::stat_ExcludeChildAreas( dcPaint.GetSafeHdc(), m_hWnd );
  949. } // if( m_hWnd != NULL )
  950. ASSERT( m_hWndCmdReceiver != NULL );
  951. ASSERT( ::IsWindow(m_hWndCmdReceiver) );
  952. CRect rcMB = OnQueryMenuBorderMetrics();
  953. int nMenuShadowSize = OnQueryMenuShadowSize();
  954. CRect rcRealClient, rcClient;
  955. GetClientRect( &rcRealClient );
  956. _GetClientRect( &rcClient );
  957. CPalette * pOldPalette = NULL, * pOldPalette2 = NULL;
  958. if( ::GetDeviceCaps(dcPaint.m_hDC,RASTERCAPS) & RC_PALETTE )
  959.     {
  960.         pOldPalette = dcPaint.SelectPalette( &PmBridge_GetPM()->m_PaletteWide, FALSE );
  961.         dcPaint.RealizePalette();
  962.     }
  963. PmBridge_GetPM()->AdjustMenuDC( this, dcPaint, false );
  964. CSize _sizeCaption = MenuCaptionMeasure();
  965. CExtMemoryDC mdc;
  966. if( bUseBackBuffer )
  967. {
  968. CRect rcMemDC = rcClient;
  969. if( _sizeCaption.cx > 0 && _sizeCaption.cy > 0 )
  970. rcMemDC.top -= _sizeCaption.cy;
  971. mdc.__InitMemoryDC( &dcPaint, &rcMemDC );
  972. if( pOldPalette != NULL )
  973. {
  974. pOldPalette2 = mdc.SelectPalette( &PmBridge_GetPM()->m_PaletteWide, FALSE );
  975. mdc.RealizePalette();
  976. }
  977. PmBridge_GetPM()->AdjustMenuDC( this, dcPaint, true );
  978. }
  979. CDC & dcDummyRef = mdc;
  980. CDC & dc = bUseBackBuffer ? dcDummyRef : dcPaint;
  981. CFont * pOldFont = (CFont *) dc.SelectObject( &PmBridge_GetPM()->m_FontNormal );
  982. COLORREF clrFill = COLORREF(-1L);
  983. DRAWBACKGROUNDDATA _dbkgnd( dc, rcClient, this );
  984. _dbkgnd.Notify();
  985. if( ! _dbkgnd.m_bCustomBackgroundDrawn )
  986. {
  987. if( _IsPalette()
  988. && ( TrackFlagsGet() & TPMX_PALETTE_TB_BKGND ) != NULL
  989. )
  990. {
  991. CRgn rgnClient;
  992. if( rgnClient.CreateRectRgnIndirect( &rcClient ) )
  993. dc.SelectClipRgn( &rgnClient );
  994. if( ! PmBridge_GetPM()->PaintDockerBkgnd( true, dc, this ) )
  995. clrFill = PmBridge_GetPM()->GetColor( CExtPaintManager::CLR_3DFACE_OUT );
  996. dc.SelectClipRgn( NULL );
  997. }
  998. else
  999. clrFill = PmBridge_GetPM()->GetMenuFrameFillColor( this );
  1000. if( clrFill != COLORREF(-1L) )
  1001. dc.FillSolidRect( &rcClient, clrFill );
  1002. } // if( ! _dbkgnd.m_bCustomBackgroundDrawn )
  1003. if( ! _dbkgnd.m_bCustomBorderDrawn )
  1004. PmBridge_GetPM()->PaintMenuBorder( dc, rcClient, this );
  1005. if( _sizeCaption.cx > 0 && _sizeCaption.cy > 0 )
  1006. {
  1007. CRect rcMenuCaption = rcClient;
  1008. rcMenuCaption.DeflateRect( &rcMB );
  1009. rcMenuCaption.bottom = rcMenuCaption.top;
  1010. rcMenuCaption.top -= _sizeCaption.cy;
  1011. MenuCaptionPaint( dc, rcMenuCaption );
  1012. } // if( _sizeCaption.cx > 0 && _sizeCaption.cy > 0 )
  1013. if( (TrackFlagsGet()&TPMX_RIBBON_RESIZING) != 0 )
  1014. {
  1015. CRect rcMB = PmBridge_GetPM()->GetMenuBorderMetrics( (CWnd*)this );
  1016. ASSERT( rcMB.left >= 0 );
  1017. ASSERT( rcMB.top >= 0 );
  1018. ASSERT( rcMB.right >= 0 );
  1019. ASSERT( rcMB.bottom >= 0 );
  1020. CRect rcResizingArea = rcClient;
  1021. rcResizingArea.left += rcMB.left;
  1022. rcResizingArea.right -= rcMB.right;
  1023. rcResizingArea.bottom -= rcMB.bottom;
  1024. INT nMarginHeight = 0, nResizingCornerPartWidth = 0;
  1025. PmBridge_GetPM()->MenuBottomResizingMarginGetInfo( nMarginHeight, nResizingCornerPartWidth, this );
  1026. rcResizingArea.top = rcResizingArea.bottom - nMarginHeight;
  1027. PmBridge_GetPM()->MenuBottomResizingMarginPaint( dc, rcResizingArea, this );
  1028. }
  1029. CRect rcExpand;
  1030. if( m_bExpandAvailable )
  1031. {
  1032. _GetItemRect( IDX_EXPAND, rcExpand, false );
  1033. dc.ExcludeClipRect( rcExpand );
  1034. CRect rcExcludePart( rcExpand );
  1035. rcExcludePart.left = rcRealClient.left;
  1036. rcExcludePart.right = rcRealClient.right;
  1037. dc.ExcludeClipRect( rcExcludePart );
  1038. }
  1039. CRect rcTearOff(0,0,0,0);
  1040. bool bTearOff = _IsTearOff();
  1041. if( bTearOff )
  1042. {
  1043. _GetItemRect( IDX_TEAROFF, rcTearOff, false );
  1044. dc.ExcludeClipRect( rcTearOff );
  1045. CRect rcExcludePart( rcTearOff );
  1046. rcExcludePart.left = rcRealClient.left;
  1047. rcExcludePart.right = rcRealClient.right;
  1048. dc.ExcludeClipRect( rcExcludePart );
  1049. }
  1050. CRect rcScrollTop;
  1051. CRect rcScrollBottom;
  1052. int nMaxScrollPos = 0;
  1053. if( m_bScrollingAvailable )
  1054. {
  1055. if( m_nDyScrollOffset != 0 )
  1056. {
  1057. _GetItemRect( IDX_SCROLL_TOP, rcScrollTop );
  1058. dc.ExcludeClipRect( rcScrollTop );
  1059. CRect rcExcludePart( rcScrollTop );
  1060. rcExcludePart.InflateRect( 0, 1 );
  1061. rcExcludePart.left = rcRealClient.left;
  1062. rcExcludePart.right = rcRealClient.right;
  1063. dc.ExcludeClipRect( rcExcludePart );
  1064. }
  1065. nMaxScrollPos = _GetMaxScrollPos();
  1066. if( m_nDyScrollOffset != nMaxScrollPos )
  1067. {
  1068. _GetItemRect( IDX_SCROLL_BOTTOM, rcScrollBottom );
  1069. dc.ExcludeClipRect( rcScrollBottom );
  1070. CRect rcExcludePart( rcScrollBottom );
  1071. rcExcludePart.InflateRect( 0, 1 );
  1072. rcExcludePart.left = rcRealClient.left;
  1073. rcExcludePart.right = rcRealClient.right;
  1074. dc.ExcludeClipRect( rcExcludePart );
  1075. }
  1076. }
  1077. if( rcClient.top >= rcRealClient.top )
  1078. {
  1079. CRect rcExcludePart( rcRealClient );
  1080. rcExcludePart.bottom = rcClient.top + rcMB.top;
  1081. dc.ExcludeClipRect( rcExcludePart );
  1082. }
  1083. if( rcClient.bottom <= rcRealClient.bottom )
  1084. {
  1085. CRect rcExcludePart( rcRealClient );
  1086. rcExcludePart.top = rcClient.bottom - rcMB.bottom;
  1087. dc.ExcludeClipRect( rcExcludePart );
  1088. }
  1089. _DoPaintMenuItems( dc );
  1090. CPoint point( 0, 0 );
  1091. ::GetCursorPos( &point );
  1092. ScreenToClient( &point );
  1093. dc.SelectClipRgn( NULL );
  1094. if( m_bExpandAvailable )
  1095. {
  1096. bool bHover =
  1097. ( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON == NULL
  1098. && rcExpand.PtInRect(point)
  1099. ) ? true : false;
  1100. bool bPushed = bHover;
  1101. PmBridge_GetPM()->PaintMenuExpandButton( dc, rcExpand, bHover, bPushed, this );
  1102. } // if( m_bExpandAvailable )
  1103. if( bTearOff )
  1104. {
  1105. bool bHover = (rcTearOff.PtInRect(point))? true : false;
  1106. if( bHover && _FindCustomizeMode() )
  1107. bHover = false;
  1108. bool bPushed = bHover;
  1109. PmBridge_GetPM()->PaintMenuTearOffButton( dc, rcTearOff, bHover, bPushed, this );
  1110. }
  1111. if( m_bScrollingAvailable )
  1112. {
  1113. if( m_nDyScrollOffset != 0 )
  1114. {
  1115. bool bHover =
  1116. ( rcScrollTop.PtInRect(point)
  1117. && CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON == NULL
  1118. ) ? true : false;
  1119. bool bPushed = ( m_nScrollingDirection > 0 ) ? true : false;
  1120. PmBridge_GetPM()->PaintMenuScrollButton( dc, bHover, bPushed, true, rcScrollTop, this );
  1121. }
  1122. if( m_nDyScrollOffset != nMaxScrollPos )
  1123. {
  1124. bool bHover =
  1125. ( rcScrollBottom.PtInRect(point)
  1126. && CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON == NULL
  1127. ) ? true : false;
  1128. bool bPushed =
  1129. ( m_nScrollingDirection < 0 ) ? true : false;
  1130. PmBridge_GetPM()->PaintMenuScrollButton( dc, bHover, bPushed, false, rcScrollBottom, this );
  1131. }
  1132. } // if( m_bScrollingAvailable )
  1133. if( m_nLeftAreaWidth > 0 )
  1134. {
  1135. CRect rcLeftArea( rcClient );
  1136. rcLeftArea.right = rcLeftArea.left + m_nLeftAreaWidth;
  1137. rcLeftArea.OffsetRect( rcMB.left, 0 );
  1138. rcLeftArea.DeflateRect( 0, rcMB.top, 0, rcMB.bottom );
  1139. DRAWLEFTAREADATA _DrawLeftAreaData( &dc, &rcLeftArea, this );
  1140. _DrawLeftAreaData.DoOwnerDrawPainting();
  1141. }
  1142. if( m_bCombineWithEA )
  1143. {
  1144. ASSERT( m_eCombineAlign != __CMBA_NONE );
  1145. dc.SelectClipRgn( NULL );
  1146. CRect rcExcludeClient( m_rcExcludeArea );
  1147. ScreenToClient( &rcExcludeClient );
  1148. PmBridge_GetPM()->PaintMenuCombinedArea( dc, rcExcludeClient, rcClient, m_eCombineAlign, this );
  1149. dc.SelectClipRgn( NULL );
  1150. if( m_pCbPaintCombinedContent != NULL )
  1151. {
  1152. CExtMemoryDC dcCA( &dc, &rcExcludeClient, CExtMemoryDC::MDCOPT_TO_MEMORY|CExtMemoryDC::MDCOPT_FILL_BITS|CExtMemoryDC::MDCOPT_RTL_COMPATIBILITY );
  1153. m_pCbPaintCombinedContent( m_pCbPaintCombinedCookie, dcCA, *this, m_rcExcludeArea, m_eCombineAlign );
  1154. } // if( m_pCbPaintCombinedContent != NULL )
  1155. } // if( m_bCombineWithEA )
  1156. #ifdef _DEBUG_TEAROFF_TRANSPARENCY
  1157. if( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON != NULL
  1158. && (!CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->m_bHelperForceFloatInvisible)
  1159. && CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->m_hWndHelperFloat != NULL
  1160. && ::IsWindow( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->m_hWndHelperFloat )
  1161. )
  1162. {
  1163. CRect rcFloatingArea = CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->m_rcCustomFloatPos;
  1164. if( rcFloatingArea.IsRectEmpty() )
  1165. ::GetWindowRect(
  1166. CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->m_hWndHelperFloat,
  1167. &rcFloatingArea
  1168. );
  1169. if( _IsFloatingAreaInstersectsWithMenu( rcFloatingArea, false ) )
  1170. {
  1171. HBITMAP hBmpSufrace =
  1172. CExtPaintManager::stat_PrintWnd(
  1173. CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->m_hWndHelperFloat
  1174. );
  1175. if( hBmpSufrace != NULL )
  1176. {
  1177. CBitmap bmpSurface;
  1178. bmpSurface.Attach( hBmpSufrace );
  1179. CDC dcSurface;
  1180. if( dcSurface.CreateCompatibleDC(NULL) )
  1181. {
  1182. CBitmap * pBmpOld = dcSurface.SelectObject( &bmpSurface );
  1183. CRect rcWndThis;
  1184. GetWindowRect( &rcWndThis );
  1185. dc.BitBlt(
  1186. rcFloatingArea.left - rcWndThis.left,
  1187. rcFloatingArea.top - rcWndThis.top,
  1188. rcFloatingArea.Width(),
  1189. rcFloatingArea.Height(),
  1190. &dcSurface,
  1191. 0,
  1192. 0,
  1193. SRCCOPY
  1194. );
  1195. dcSurface.SelectObject( pBmpOld );
  1196. }
  1197. }
  1198. }
  1199. }
  1200. #endif // _DEBUG_TEAROFF_TRANSPARENCY
  1201. DWORD dwTrackFlags = TrackFlagsGet();
  1202. if( (dwTrackFlags&TPMX_RIBBON_FILE_MENU) != 0 )
  1203. {
  1204. if( (dwTrackFlags&TPMX_RIBBON_EXIT_BUTTON) != 0 )
  1205. {
  1206. dc.SelectClipRgn( NULL );
  1207. // dc.FillSolidRect( &m_rcRibbonBtnExit, 255 );
  1208. RIBBONFILEMENUBUTTONQUERY _rfmbq( this, TPMX_RIBBON_EXIT_BUTTON, &dc );
  1209. _rfmbq.m_rcButton = m_rcRibbonBtnExit;
  1210. _rfmbq.m_nMeasuredWidth = _rfmbq.m_rcButton.Width();
  1211. _rfmbq.m_bHover = ( m_nCurIndex == INT(IDX_RIBBON_FILE_MENU_EXIT_BUTTON) ) ? true : false;
  1212. _rfmbq.m_bPressed = ( _rfmbq.m_bHover && IsKeyPressed(VK_LBUTTON) ) ? true : false;
  1213. _rfmbq.Notify();
  1214. } // if( (dwTrackFlags&TPMX_RIBBON_EXIT_BUTTON) != 0 )
  1215. if( (dwTrackFlags&TPMX_RIBBON_OPTIONS_BUTTON) != 0 )
  1216. {
  1217. dc.SelectClipRgn( NULL );
  1218. // dc.FillSolidRect( &m_rcRibbonBtnOptions, 255 );
  1219. RIBBONFILEMENUBUTTONQUERY _rfmbq( this, TPMX_RIBBON_OPTIONS_BUTTON, &dc );
  1220. _rfmbq.m_rcButton = m_rcRibbonBtnOptions;
  1221. _rfmbq.m_nMeasuredWidth = _rfmbq.m_rcButton.Width();
  1222. _rfmbq.m_bHover = ( m_nCurIndex == INT(IDX_RIBBON_FILE_MENU_OPTIONS_BUTTON) ) ? true : false;
  1223. _rfmbq.m_bPressed = ( _rfmbq.m_bHover && IsKeyPressed(VK_LBUTTON) ) ? true : false;
  1224. _rfmbq.Notify();
  1225. } // if( (dwTrackFlags&TPMX_RIBBON_OPTIONS_BUTTON) != 0 )
  1226. } // if( (dwTrackFlags&TPMX_RIBBON_FILE_MENU) != 0 )
  1227. dc.SelectObject( pOldFont );
  1228. if( bUseBackBuffer )
  1229. {
  1230. ASSERT( mdc.GetSafeHdc() != NULL );
  1231. if( pOldPalette2 != NULL )
  1232. mdc.SelectPalette( pOldPalette2, FALSE );
  1233. mdc.__Flush();
  1234. }
  1235. if( _IsPopupWithShadows()
  1236. && m_bAnimFinished
  1237. && nMenuShadowSize > 0
  1238. )
  1239. { // if we need to paint shadow for client area (and combined exclude area)
  1240. dcPaint.SelectClipRgn(NULL);
  1241. //dcPaint.ExcludeClipRect( &rcClient );
  1242. CRect
  1243. rcExcludeClient( 0,0,0,0 ),
  1244. rcExcludeScreen( 0,0,0,0 ),
  1245. rcBaseScreen( 0,0,0,0 );
  1246. HWND hWndFloat = NULL;
  1247. if( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON != NULL
  1248. && (!CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->m_bHelperForceFloatInvisible)
  1249. && CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->m_hWndHelperFloat != NULL
  1250. && ::IsWindow( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->m_hWndHelperFloat )
  1251. )
  1252. {
  1253. hWndFloat = CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->m_hWndHelperFloat;
  1254. if( hWndFloat != NULL )
  1255. {
  1256. __EXT_MFC_LONG_PTR dwStyle = ::__EXT_MFC_GetWindowLong( hWndFloat, GWL_STYLE );
  1257. if( (dwStyle&WS_VISIBLE) == 0 )
  1258. hWndFloat = NULL;
  1259. }
  1260. }
  1261. if( m_bCombineWithEA )
  1262. {
  1263. if( _IsPopupWithShadows()
  1264. && m_bAnimFinished
  1265. && nMenuShadowSize > 0
  1266. && m_bTopLevel
  1267. )
  1268. { // if we need to paint shadow for combined exclude area
  1269. rcExcludeScreen = m_rcExcludeArea;
  1270. rcExcludeClient = rcExcludeScreen;
  1271. ScreenToClient( &rcExcludeClient );
  1272. dcPaint.ExcludeClipRect( &rcClient );
  1273. rcBaseScreen = rcClient;
  1274. ClientToScreen( &rcBaseScreen );
  1275. VERIFY(
  1276. m_ShadowCMBA.Paint(
  1277. PmBridge_GetPM(),
  1278. dcPaint,
  1279. rcExcludeClient,
  1280. rcExcludeScreen,
  1281. rcBaseScreen,
  1282. nMenuShadowSize,
  1283. CExtWndShadow::DEF_BRIGHTNESS_MIN,
  1284. CExtWndShadow::DEF_BRIGHTNESS_MAX,
  1285. true,
  1286. true,
  1287. false,
  1288. m_hWnd,
  1289. hWndFloat,
  1290. ( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON != NULL
  1291. && (! CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->m_rcCustomFloatPos.IsRectEmpty() )
  1292. )
  1293. ? (&CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->m_rcCustomFloatPos)
  1294. : NULL
  1295. )
  1296. );
  1297. dcPaint.SelectClipRgn(NULL);
  1298. } // if we need to paint shadow for combined exclude area
  1299. CRect rcExcludePart( m_rcExcludeArea );
  1300. ScreenToClient( &rcExcludePart );
  1301. dcPaint.ExcludeClipRect( &rcExcludePart );
  1302. } // if( m_bCombineWithEA )
  1303. VERIFY(
  1304. m_ShadowMain.Paint(
  1305. PmBridge_GetPM(),
  1306. dcPaint,
  1307. rcClient,
  1308. rcBaseScreen,
  1309. rcExcludeScreen,
  1310. nMenuShadowSize,
  1311. CExtWndShadow::DEF_BRIGHTNESS_MIN,
  1312. CExtWndShadow::DEF_BRIGHTNESS_MAX,
  1313. true,
  1314. true,
  1315. false,
  1316. m_hWnd,
  1317. hWndFloat,
  1318. ( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON != NULL
  1319. && (! CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->m_rcCustomFloatPos.IsRectEmpty() )
  1320. )
  1321. ? (&CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON->m_rcCustomFloatPos)
  1322. : NULL
  1323. )
  1324. );
  1325. } // if we need to paint shadow for client area (and combined exclude area)
  1326. if( m_bCombineWithEA )
  1327. {
  1328. ASSERT( m_eCombineAlign != __CMBA_NONE );
  1329. dcPaint.SelectClipRgn( NULL );
  1330. CRect rcExcludeClient( m_rcExcludeArea );
  1331. ScreenToClient( &rcExcludeClient );
  1332. CRect rx( rcExcludeClient );
  1333. CExtMemoryDC dc( &dcPaint, &rx );
  1334. PmBridge_GetPM()->PaintMenuCombinedArea(
  1335. dc,
  1336. rcExcludeClient,
  1337. rcClient,
  1338. m_eCombineAlign,
  1339. this
  1340. );
  1341. if( m_pCbPaintCombinedContent != NULL )
  1342. {
  1343. CExtMemoryDC dcCA( &dc, &rcExcludeClient, CExtMemoryDC::MDCOPT_TO_MEMORY|CExtMemoryDC::MDCOPT_FILL_BITS|CExtMemoryDC::MDCOPT_RTL_COMPATIBILITY );
  1344. m_pCbPaintCombinedContent(
  1345. m_pCbPaintCombinedCookie,
  1346. dcCA,
  1347. *this,
  1348. m_rcExcludeArea,
  1349. m_eCombineAlign
  1350. );
  1351. } // if( m_pCbPaintCombinedContent != NULL )
  1352. } // if( m_bCombineWithEA )
  1353. if( pOldPalette != NULL )
  1354. dcPaint.SelectPalette( pOldPalette, FALSE );
  1355. }
  1356. HWND CExtPopupMenuWnd::GetCmdReceiverHWND()
  1357. {
  1358. ASSERT_VALID( this );
  1359. ASSERT( m_hWndCmdReceiver != NULL );
  1360. ASSERT( ::IsWindow( m_hWndCmdReceiver ) );
  1361. return m_hWndCmdReceiver;
  1362. }
  1363. HWND CExtPopupMenuWnd::GetCmdReceiverHWND() const
  1364. {
  1365. ASSERT_VALID( this );
  1366. return
  1367. ( const_cast < CExtPopupMenuWnd * > ( this ) )
  1368. -> GetCmdReceiverHWND();
  1369. }
  1370. DWORD CExtPopupMenuWnd::TrackFlagsGet() const
  1371. {
  1372. ASSERT_VALID( this );
  1373. if( ! m_bTopLevel )
  1374. return (m_dwTrackFlags&(~(TPMX_RIBBON_FILE_MENU)));
  1375. return m_dwTrackFlags;
  1376. }
  1377. void CExtPopupMenuWnd::TrackFlagsSet(
  1378. DWORD dwTrackFlags // = 0
  1379. )
  1380. {
  1381. ASSERT_VALID( this );
  1382. m_dwTrackFlags = dwTrackFlags;
  1383. }
  1384. int CExtPopupMenuWnd::_GetTearOffCaptionHeight() const
  1385. {
  1386. ASSERT_VALID( this );
  1387. int nTearOffCaptionHeight =
  1388. PmBridge_GetPM()->TearOff_GetCaptionHeight();
  1389. return nTearOffCaptionHeight;
  1390. }
  1391. bool CExtPopupMenuWnd::_IsTearOff() const
  1392. {
  1393. ASSERT_VALID( this );
  1394. DWORD dwTrackFlags = TrackFlagsGet();
  1395. if( (dwTrackFlags&TPMX_TEAROFF) != 0 )
  1396. return true;
  1397. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1398. HWND hWndCmdReceiver = GetCmdReceiverHWND();
  1399. if( hWndCmdReceiver == NULL )
  1400. return false;
  1401. const CExtCustomizeCmdTreeNode * pNode = _CmdNodeGet();
  1402. if( pNode == NULL )
  1403. return false;
  1404. ASSERT_VALID( pNode );
  1405. UINT nCmdID = pNode->GetCmdID( false );
  1406. LPCTSTR strProfileName =
  1407. g_CmdManager->ProfileNameFromWnd( hWndCmdReceiver );
  1408. if( strProfileName == NULL )
  1409. return false;
  1410. CExtCmdItem * pCmdItem =
  1411. g_CmdManager->CmdGetPtr( strProfileName, nCmdID );
  1412. if( pCmdItem == NULL )
  1413. return false;
  1414. if( pCmdItem->StateIsTearOff() )
  1415. return true;
  1416. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1417. return false;
  1418. }
  1419. bool CExtPopupMenuWnd::_IsPalette() const
  1420. {
  1421. ASSERT_VALID( this );
  1422. DWORD dwTrackFlags = TrackFlagsGet();
  1423. if( (dwTrackFlags&TPMX_PALETTE) != 0 )
  1424. return true;
  1425. return false;
  1426. }
  1427. void CExtPopupMenuWnd::_DoPaintMenuItems( CDC & dc )
  1428. {
  1429. ASSERT_VALID( this );
  1430. ASSERT_VALID( (&dc) );
  1431. ASSERT( dc.GetSafeHdc() != NULL );
  1432. if( _IsPalette() )
  1433. {
  1434. _DoPaintMenuItemsPalette( dc );
  1435. return;
  1436. }
  1437. visible_items_t v;
  1438. _GetVisibleItems( dc.GetSafeHdc(), v );
  1439. INT vis_iter = 0;
  1440. bool bPrevToolButton = false;
  1441. for( ; vis_iter < v.GetSize(); ++vis_iter )
  1442. { // paint visible items
  1443. VisibleItemDefinition_t & vi = v[ vis_iter ];
  1444. ASSERT(
  1445. vi.m_nIndex >= 0
  1446. && vi.m_nIndex < m_items_all.GetSize()
  1447. );
  1448. ASSERT( !vi.m_rcItem.IsRectEmpty() );
  1449. ASSERT( !vi.m_rcItemWithIndents.IsRectEmpty() );
  1450. ASSERT( dc.RectVisible(&vi.m_rcItem) );
  1451. ASSERT( dc.RectVisible(&vi.m_rcItemWithIndents) );
  1452. MENUITEMDATA & mi =
  1453. ItemGetInfo( vi.m_nIndex );
  1454. ASSERT( mi.IsDisplayed() );
  1455. ASSERT( mi.GetCmdID() == vi.m_nHelperCmdID );
  1456. if( vi.m_bHelperIsSeparator )
  1457. {
  1458. ASSERT( mi.IsSeparator() );
  1459. if( bPrevToolButton )
  1460. {
  1461. PmBridge_GetPM()->PaintSeparator( dc, vi.m_rcItemWithIndents, false, true, this );
  1462. }
  1463. else
  1464. PmBridge_GetPM()->PaintMenuSeparator(
  1465. dc,
  1466. vi.m_rcItemWithIndents,
  1467. mi.GetIconAreaWidth(),
  1468. g_bMenuHighlightRarely && vi.m_bRarelyUsed,
  1469. ( mi.IsForceNoLeftGradient() || IsNoHighlightIconArea() ) ? true : false,
  1470. this
  1471. );
  1472. bPrevToolButton = false;
  1473. continue;
  1474. }
  1475. ASSERT( !mi.IsSeparator() );
  1476. ASSERT( mi.IsPopup() == vi.m_bHelperIsPopup );
  1477. DRAWITEMDATA _DrawItemData(
  1478. &dc,
  1479. &vi.m_rcItem,
  1480. &vi.m_rcItemWithIndents,
  1481. &mi,
  1482. this,
  1483. ( (! _FindCustomizeMode() )
  1484. && ( TrackFlagsGet()&TPMX_OWNERDRAW_FIXED ) != 0 // fix 2.23 ( == replaced with != )
  1485. ) ? true : false,
  1486. vi.m_bHelperIsPopup,
  1487. g_bMenuHighlightRarely && vi.m_bRarelyUsed,
  1488. g_bMenuHighlightRarely && vi.m_bRarelyUsedPrev,
  1489. g_bMenuHighlightRarely && vi.m_bRarelyUsedNext
  1490. );
  1491. bool bPainted =
  1492. (_DrawItemData.m_bMenuOwnerDrawFixed)
  1493. ? _DrawItemData.DoOwnerDrawPainting()
  1494. : false
  1495. ;
  1496. if( ! bPainted )
  1497. _DrawItemData.PaintDefault();
  1498. bPrevToolButton = mi.IsToolButton();
  1499. } // paint visible items
  1500. }
  1501. void CExtPopupMenuWnd::_DoPaintMenuItemsPalette( CDC & dc )
  1502. {
  1503. ASSERT_VALID( this );
  1504. ASSERT_VALID( (&dc) );
  1505. ASSERT( dc.GetSafeHdc() != NULL );
  1506. visible_items_t v;
  1507. _GetVisibleItems( dc.GetSafeHdc(), v );
  1508. INT vis_iter = 0;
  1509. for( ; vis_iter < v.GetSize(); ++vis_iter )
  1510. { // paint visible items
  1511. VisibleItemDefinition_t & vi = v[ vis_iter ];
  1512. ASSERT(
  1513. vi.m_nIndex >= 0
  1514. && vi.m_nIndex < m_items_all.GetSize()
  1515. );
  1516. ASSERT( !vi.m_rcItem.IsRectEmpty() );
  1517. ASSERT( !vi.m_rcItemWithIndents.IsRectEmpty() );
  1518. ASSERT( dc.RectVisible(&vi.m_rcItem) );
  1519. ASSERT( dc.RectVisible(&vi.m_rcItemWithIndents) );
  1520. MENUITEMDATA & mi =
  1521. ItemGetInfo( vi.m_nIndex );
  1522. ASSERT( mi.IsDisplayed() );
  1523. ASSERT( mi.GetCmdID() == vi.m_nHelperCmdID );
  1524. if( vi.m_bHelperIsSeparator )
  1525. {
  1526. ASSERT( mi.IsSeparator() );
  1527. CRect rc = vi.m_rcItemWithIndents;
  1528. PmBridge_GetPM()->PaintSeparator( dc, vi.m_rcItemWithIndents, false, true, this );
  1529. continue;
  1530. }
  1531. ASSERT( !mi.IsSeparator() );
  1532. ASSERT( mi.IsPopup() == vi.m_bHelperIsPopup );
  1533. DRAWITEMDATA _DrawItemData(
  1534. &dc,
  1535. &vi.m_rcItem,
  1536. &vi.m_rcItemWithIndents,
  1537. &mi,
  1538. this,
  1539. ( (! _FindCustomizeMode() )
  1540. && ( GetSite()->TrackFlagsGet()&TPMX_OWNERDRAW_FIXED ) != 0 // fix 2.23 ( == replaced with != )
  1541. ) ? true : false,
  1542. vi.m_bHelperIsPopup,
  1543. g_bMenuHighlightRarely && vi.m_bRarelyUsed,
  1544. g_bMenuHighlightRarely && vi.m_bRarelyUsedPrev,
  1545. g_bMenuHighlightRarely && vi.m_bRarelyUsedNext
  1546. );
  1547. bool bPainted =
  1548. (_DrawItemData.m_bMenuOwnerDrawFixed)
  1549. ? _DrawItemData.DoOwnerDrawPainting()
  1550. : false
  1551. ;
  1552. bool bForceNoIcon = false, bForceNoText = false;
  1553. CExtCmdIcon * pIcon = mi.GetIconPtr();
  1554. if( pIcon != NULL && pIcon->IsEmpty() )
  1555. pIcon = NULL;
  1556. if( mi.IsInplaceEdit() )
  1557. bForceNoIcon = bForceNoText = true;
  1558. else if( pIcon == NULL || ( pIcon != NULL && (! mi.IsIconMode() ) ) )
  1559. {
  1560. //bForceNoIcon = true;
  1561. }
  1562. else
  1563. bForceNoText = true;
  1564. if( ! bPainted )
  1565. _DrawItemData.PaintDefault( bForceNoIcon, bForceNoText );
  1566. } // paint visible items
  1567. }
  1568. #if _MFC_VER < 0x700
  1569. void CExtPopupMenuWnd::OnActivateApp(BOOL bActive, HTASK hTask) 
  1570. #else
  1571. void CExtPopupMenuWnd::OnActivateApp(BOOL bActive, DWORD hTask) 
  1572. #endif
  1573. {
  1574. ASSERT_VALID( this );
  1575. bActive;
  1576. hTask;
  1577. if( ( GetStyle() & WS_VISIBLE ) == 0 )
  1578. {
  1579. m_pWndParentMenu = NULL;
  1580. m_dwTrackFlags &= ~(TPMX_CUSTOMIZE_MODE);
  1581. }
  1582. _CancelingSet();
  1583. _OnCancelMode();
  1584. }
  1585. bool CExtPopupMenuWnd::_StartScrolling(int nButtonIndex)
  1586. {
  1587. ASSERT_VALID( this );
  1588. if( GetSafeHwnd() == NULL )
  1589. return FALSE;
  1590. if( (nButtonIndex == IDX_SCROLL_TOP
  1591. || nButtonIndex == IDX_SCROLL_BOTTOM)
  1592. )
  1593. {
  1594. ASSERT( m_bScrollingAvailable );
  1595. HWND hWndOwn = m_hWnd;
  1596. _ItemFocusDelay();
  1597. if( ! ::IsWindow( hWndOwn ) )
  1598. return true;
  1599. _ItemFocusCancel( FALSE );
  1600. if( ! ::IsWindow( hWndOwn ) )
  1601. return true;
  1602. m_nCurIndex = nButtonIndex;
  1603. Invalidate( FALSE );
  1604. m_nAcceleratedPixelsPerStepCurrent = __SCROLLING_PIXEL_STEP;
  1605. m_nAcceleratedMilliSecondsPassed = 0;
  1606. SetTimer(
  1607. ID_TIMER_SCROLLING,
  1608. ID_PERIOD_SCROLLING,
  1609. NULL
  1610. );
  1611. if( !_FindCustomizeMode() )
  1612. _SetCapture();
  1613. return true;
  1614. }
  1615. return false;
  1616. }
  1617. bool CExtPopupMenuWnd::_PtInWndArea( CPoint ptClient )
  1618. {
  1619. if( GetSafeHwnd() == NULL )
  1620. return false;
  1621. ClientToScreen( &ptClient );
  1622. HWND hWndFromPoint = ::WindowFromPoint(ptClient);
  1623. if( hWndFromPoint == NULL )
  1624. return false;
  1625. if( hWndFromPoint == m_hWnd )
  1626. return true;
  1627. return false;
  1628. }
  1629. LRESULT CExtPopupMenuWnd::WindowProc(
  1630. UINT message,
  1631. WPARAM wParam,
  1632. LPARAM lParam
  1633. )
  1634. {
  1635. switch( message )
  1636. {
  1637. case __WM_START_RESIZING:
  1638. //if( _IsResizingMode() )
  1639. {
  1640. m_bHelperResizingMode = true;
  1641. CPoint ptScreenClick( short(LOWORD(lParam)), short(HIWORD(lParam)) );
  1642. _DoResizing(
  1643. ptScreenClick,
  1644. ( (TrackFlagsGet()&TPMX_RIBBON_RESIZING_VERTICAL_ONLY) != 0 ) ? true : false
  1645. );
  1646. }
  1647. return 0;
  1648. //break;
  1649. case WM_NCDESTROY:
  1650. case WM_DESTROY:
  1651. m_bDelayedHiding = false;
  1652. if( m_ctrlShadow.GetSafeHwnd() != NULL )
  1653. m_ctrlShadow.DestroyWindow();
  1654. break;
  1655. } // switch( message )
  1656. LRESULT lResult = CExtPopupBaseWnd::WindowProc( message, wParam, lParam );
  1657. return lResult;
  1658. }
  1659. bool CExtPopupMenuWnd::_OnMouseClick(
  1660. UINT nFlags,
  1661. CPoint point,
  1662. bool & bNoEat
  1663. )
  1664. {
  1665. ASSERT_VALID( this );
  1666. if( GetSafeHwnd() == NULL )
  1667. return false;
  1668. // - 2.27 (for command processing in separated dropdown item)
  1669. // if( ! m_bAnimFinished )
  1670. // return true;
  1671. CExtPopupMenuSite & _site = GetSite();
  1672. if( _site.IsShutdownMode()
  1673. || _site.IsEmpty()
  1674. || _site.GetAnimated() != NULL
  1675. )
  1676. {
  1677. if( ( TrackFlagsGet() & TPMX_SYSMENU ) != 0 )
  1678. {
  1679. bNoEat = true;
  1680. return false;
  1681. }
  1682. return true;
  1683. }
  1684. TranslateMouseClickEventData_t _td( this, nFlags, point, bNoEat );
  1685. if( _td.Notify() )
  1686. {
  1687. bNoEat = _td.m_bNoEat;
  1688. return true;
  1689. }
  1690. bool bLButtonUpCall =
  1691. (nFlags==WM_LBUTTONUP || nFlags==WM_NCLBUTTONUP)
  1692. ? true : false;
  1693. CPoint ptScreenClick( point );
  1694. ClientToScreen( &ptScreenClick );
  1695. if( (TrackFlagsGet()&TPMX_RIBBON_RESIZING) != 0 )
  1696. {
  1697. UINT nHT = (UINT) ::SendMessage( m_hWnd, WM_NCHITTEST, 0L, MAKELPARAM(ptScreenClick.x,ptScreenClick.y) );
  1698. switch( nHT )
  1699. {
  1700. case HTLEFT:
  1701. case HTRIGHT:
  1702. case HTTOP:
  1703. case HTBOTTOM:
  1704. case HTTOPLEFT:
  1705. case HTTOPRIGHT:
  1706. case HTBOTTOMLEFT:
  1707. case HTBOTTOMRIGHT:
  1708. if( ! bLButtonUpCall )
  1709. {
  1710. m_bHelperResizingMode = true;
  1711. PostMessage( __WM_START_RESIZING, 0, MAKELPARAM(ptScreenClick.x,ptScreenClick.y) );
  1712. } // if( ! bLButtonUpCall )
  1713. m_bHelperResizingMode = false;
  1714. bNoEat = false;
  1715. return true;
  1716. } // switch( nHT )
  1717. m_bHelperResizingMode = false;
  1718. } // if( (TrackFlagsGet()&TPMX_RIBBON_RESIZING) != 0 )
  1719. HWND hWndFromPoint = ::WindowFromPoint( ptScreenClick );
  1720. if( hWndFromPoint != NULL )
  1721. {
  1722. if( (::__EXT_MFC_GetWindowLong(hWndFromPoint,GWL_STYLE)&WS_CHILD) != 0
  1723. && ::GetParent(hWndFromPoint) == m_hWnd
  1724. )
  1725. {
  1726. CWnd * pWnd = CWnd::FromHandlePermanent( hWndFromPoint );
  1727. if( pWnd != NULL )
  1728. {
  1729. int nCount = ItemGetCount();
  1730. for( int i = 0; i < nCount; i++ )
  1731. {
  1732. MENUITEMDATA & mi = ItemGetInfo( i );
  1733. if( !mi.IsInplaceEdit() )
  1734. continue;
  1735. if( ((LPVOID)mi.GetInplaceEditPtr()) != ((LPVOID)pWnd) )
  1736. continue;
  1737. if( m_nCurIndex == i )
  1738. break;
  1739. HWND hWndOwn = m_hWnd;
  1740. _ItemFocusSet( i, FALSE, TRUE, FALSE );
  1741. if( ! ::IsWindow( hWndOwn ) )
  1742. return true;
  1743. break;
  1744. } // for( int i = 0; i < nCount; i++ )
  1745. } // if( pWnd != NULL )
  1746. bNoEat = true;
  1747. return false;
  1748. }
  1749. if( ! bLButtonUpCall )
  1750. {
  1751. CWnd * pWndPermanent = CWnd::FromHandlePermanent( hWndFromPoint );
  1752. if( pWndPermanent != NULL )
  1753. {
  1754. if( pWndPermanent->IsKindOf( RUNTIME_CLASS( CExtMenuControlBar ) ) )
  1755. {
  1756. CPoint ptClientPermanent = ptScreenClick;
  1757. pWndPermanent->ScreenToClient( &ptClientPermanent );
  1758. int nBtnIdx = ((CExtMenuControlBar*)pWndPermanent)->HitTest( ptClientPermanent );
  1759. if( nBtnIdx >= 0 )
  1760. {
  1761. CExtBarButton * pTBB = ((CExtMenuControlBar*)pWndPermanent)->GetButton( nBtnIdx );
  1762. ASSERT_VALID( pTBB );
  1763. if( pTBB->IsKindOf( RUNTIME_CLASS( CExtBarMdiDocButton ) ) )
  1764. {
  1765. _OnCancelMode();
  1766. bNoEat = true;
  1767. return false;
  1768. } // if( pTBB->IsKindOf( RUNTIME_CLASS( CExtBarMdiDocButton ) ) )
  1769. } // if( nBtnIdx >= 0 )
  1770. } // if( pWndPermanent->IsKindOf( RUNTIME_CLASS( CExtMenuControlBar ) ) )
  1771. } // if( pWndPermanent != NULL )
  1772. } // if( ! bLButtonUpCall )
  1773. } // if( hWndFromPoint != NULL )
  1774. /*
  1775. CRect rectWindow;
  1776. GetWindowRect( &rectWindow );
  1777. ScreenToClient( &rectWindow );
  1778. if( !rectWindow.PtInRect(point) )
  1779. */
  1780. if( bLButtonUpCall && (!_PtInWndArea(point)) )
  1781. {
  1782. CExtPopupMenuTipWnd & _tipWnd = GetTip();
  1783. if( _tipWnd.GetSafeHwnd() != NULL )
  1784. {
  1785. CPoint ptScreen( point );
  1786. ClientToScreen( &ptScreen );
  1787. if( _tipWnd.GetSafeHwnd() == ::WindowFromPoint(ptScreen) )
  1788. return true; // eat!
  1789. }
  1790. HWND hWndOwn = GetSafeHwnd();
  1791. ASSERT( hWndOwn != NULL );
  1792. ASSERT( ::IsWindow(hWndOwn) );
  1793. if( m_pWndParentMenu != NULL
  1794. && m_pWndParentMenu->GetSafeHwnd() != NULL
  1795. )
  1796. {
  1797. ASSERT_VALID( m_pWndParentMenu );
  1798. ClientToScreen( &point );
  1799. m_pWndParentMenu->ScreenToClient( &point );
  1800. CExtPopupMenuWnd * pWndParentMenu = m_pWndParentMenu;
  1801. if( pWndParentMenu->_OnMouseClick(
  1802. nFlags,
  1803. point,
  1804. bNoEat
  1805. )
  1806. )
  1807. {
  1808. if( bNoEat )
  1809. return false;
  1810. if( ::IsWindow(hWndOwn) )
  1811. {
  1812. INT nSaved = m_nFadeOutAnimationStepCount;
  1813. m_nFadeOutAnimationStepCount = -1;
  1814. GetTopLevelMenuWnd()->PostMessage( WM_CANCELMODE );
  1815. _OnCancelMode();
  1816. m_nFadeOutAnimationStepCount = nSaved;
  1817. }
  1818. return true;
  1819. }
  1820. return false;
  1821. }
  1822. // fixed in v. 2.20
  1823. if( nFlags == WM_RBUTTONUP
  1824. || nFlags == WM_LBUTTONUP
  1825. )
  1826. {
  1827. // + 2.83
  1828. CExtPopupMenuWnd * pTopLevelPopup = GetTopLevelMenuWnd();
  1829. ASSERT_VALID( pTopLevelPopup );
  1830. bool bHelperMouseBtnDownOnStart = pTopLevelPopup->m_bHelperMouseBtnDownOnStart;
  1831. pTopLevelPopup->m_bHelperMouseBtnDownOnStart = false;
  1832. // + 2.25
  1833. if( ::IsWindow(hWndOwn)
  1834. && CExtToolControlBar::g_bMenuTracking
  1835. && hWndFromPoint != NULL
  1836. )
  1837. {
  1838. CWnd * pWndCmp =
  1839. CWnd::FromHandlePermanent( hWndFromPoint );
  1840. if( pWndCmp != NULL )
  1841. {
  1842. CExtToolControlBar * pToolBar =
  1843. DYNAMIC_DOWNCAST( CExtToolControlBar, pWndCmp );
  1844. if( pToolBar != NULL )
  1845. {
  1846. ASSERT_VALID( pToolBar );
  1847. int nBtnIdx = pToolBar->GetMenuTrackingButton();
  1848. if( nBtnIdx >= 0 )
  1849. {
  1850. CExtBarButton * pTBB = pToolBar->GetButton( nBtnIdx );
  1851. if( pTBB != NULL )
  1852. {
  1853. ASSERT_VALID( pTBB );
  1854. CRect rcBtn = pTBB->Rect();
  1855. pToolBar->ClientToScreen( &rcBtn );
  1856. if( rcBtn.PtInRect(ptScreenClick) )
  1857. return true;
  1858. } // if( pTBB != NULL )
  1859. } // if( nBtnIdx >= 0 )
  1860. } // if( pToolBar == pWndCmp )
  1861. } // if( pWndCmp != NULL )
  1862. if( ! bHelperMouseBtnDownOnStart ) // + 2.83
  1863. _OnCancelMode();
  1864. }
  1865. return true;
  1866. }
  1867. if( nFlags == WM_NCLBUTTONUP
  1868. && g_PaintManager.m_DWM.IsCompositionEnabled()
  1869. )
  1870. return true;
  1871. _OnCancelMode();
  1872. return false;
  1873. } // if( bLButtonUpCall && (!_PtInWndArea(point)) )
  1874. bool bInplaceControlArea = false, bInplaceDropDownArea = false;
  1875. int nHitTest =
  1876. _HitTest(
  1877. point,
  1878. &bInplaceControlArea,
  1879. &bInplaceDropDownArea
  1880. );
  1881. if( _IsTearOff() && nHitTest == IDX_TEAROFF )
  1882. {
  1883. bool bLButtonUpCall =
  1884. ( nFlags == WM_LBUTTONUP || nFlags == WM_NCLBUTTONUP )
  1885. ? true : false;
  1886. if( ! bLButtonUpCall )
  1887. _DoTearOff();
  1888. return true;
  1889. }
  1890. if( bLButtonUpCall )
  1891. {
  1892. HWND hWndOwn = m_hWnd;
  1893. if( _StartScrolling(nHitTest) )
  1894. return true;
  1895. if( ! ::IsWindow( hWndOwn ) )
  1896. return true;
  1897. }
  1898. if( nHitTest < 0 )
  1899. {
  1900. if( nHitTest == IDX_RIBBON_FILE_MENU_OPTIONS_BUTTON
  1901. || nHitTest == IDX_RIBBON_FILE_MENU_EXIT_BUTTON
  1902. )
  1903. {
  1904. if( bLButtonUpCall )
  1905. {
  1906. DWORD dwButtonType = 0;
  1907. switch( nHitTest )
  1908. {
  1909. case IDX_RIBBON_FILE_MENU_OPTIONS_BUTTON:
  1910. dwButtonType = TPMX_RIBBON_OPTIONS_BUTTON;
  1911. break;
  1912. case IDX_RIBBON_FILE_MENU_EXIT_BUTTON:
  1913. dwButtonType = TPMX_RIBBON_EXIT_BUTTON;
  1914. break;
  1915. } // switch( nHitTest )
  1916. RIBBONFILEMENUBUTTONINVOCATION _rfmbi( dwButtonType, this );
  1917. m_nCurIndex = IDX_NOTHING;
  1918. _SetCapture();
  1919. if( nHitTest == IDX_RIBBON_FILE_MENU_EXIT_BUTTON )
  1920. m_dwTrackFlags |= TPMX_NO_FADE_OUT_ANIMATION;
  1921. DestroyWindow();
  1922. g_SoundPlayer->PlaySound( CExtSoundPlayer::__ON_MENU_CMD_CLICKED );
  1923. _rfmbi.Notify();
  1924. } // if( bLButtonUpCall )
  1925. else
  1926. {
  1927. CRect rcItem;
  1928. _GetItemRect( nHitTest, rcItem );
  1929. if( ! rcItem.IsRectEmpty() )
  1930. InvalidateRect( &rcItem );
  1931. } // else from if( bLButtonUpCall )
  1932. return true;
  1933. }
  1934. if( bLButtonUpCall )
  1935. {
  1936. if( ( nHitTest == IDX_SCROLL_TOP
  1937. || nHitTest == IDX_SCROLL_BOTTOM
  1938. )
  1939. //&& m_nCurIndex != nHitTest
  1940. )
  1941. {
  1942. return true;
  1943. }
  1944. if( nHitTest == IDX_EXPAND )
  1945. {
  1946. if( ( ! m_bExpandWasPressed )
  1947. && m_bExpandAvailable
  1948. )
  1949. _DoExpand();
  1950. return true;
  1951. }
  1952. // fixed in v. 2.20
  1953. if( nFlags != WM_RBUTTONUP
  1954. && nFlags != WM_LBUTTONUP
  1955. )
  1956. {
  1957. _OnCancelMode();
  1958. return true;
  1959. }
  1960. } // if( bLButtonUpCall )
  1961. if( m_eCombineAlign != __CMBA_NONE
  1962. && m_bTopLevel
  1963. && (!bLButtonUpCall)
  1964. )
  1965. {
  1966. CRect rcExcludeAreaTest( m_rcExcludeArea );
  1967. ScreenToClient( &rcExcludeAreaTest );
  1968. if( rcExcludeAreaTest.PtInRect( point ) )
  1969. {
  1970. _OnCancelMode();
  1971. return true;
  1972. } // if( rcExcludeAreaTest.PtInRect( point ) )
  1973. } // if( m_eCombineAlign != __CMBA_NONE ...
  1974. if( nFlags != WM_LBUTTONUP
  1975. && nFlags != WM_LBUTTONDOWN
  1976. && nFlags != WM_NCLBUTTONUP
  1977. && nFlags != WM_NCLBUTTONDOWN
  1978. && nFlags != WM_RBUTTONDOWN
  1979. && nFlags != WM_NCRBUTTONDOWN
  1980. && nFlags != WM_MBUTTONDOWN
  1981. && nFlags != WM_NCMBUTTONDOWN
  1982. )
  1983. {
  1984. bNoEat = false;
  1985. return true;
  1986. }
  1987. return false;
  1988. }
  1989. ASSERT( nHitTest < m_items_all.GetSize() );
  1990. if( !bLButtonUpCall )
  1991. return true;
  1992. MENUITEMDATA & mi = ItemGetInfo(nHitTest);
  1993. if( ( ! mi.IsEnabled() ) || mi.IsSeparator() )
  1994. {
  1995. _ItemFocusCancel( TRUE );
  1996. _SetCapture();
  1997. return true;
  1998. }
  1999. if( mi.IsInplaceEdit()
  2000. && mi.IsPopup()
  2001. && (! mi.IsAllowInplaceEditActivation() )
  2002. )
  2003. {
  2004. bInplaceControlArea = false;
  2005. bInplaceDropDownArea = true;
  2006. }
  2007. if( mi.IsInplaceEdit()
  2008. && ( ! mi.IsPopup() )
  2009. && ( ! bInplaceDropDownArea )
  2010. && ( ! _FindHelpMode() )
  2011. )
  2012. {
  2013. _SetCapture();
  2014. HWND hWndOwn = m_hWnd;
  2015. _ItemFocusSet( nHitTest, FALSE, TRUE, FALSE );
  2016. if( ! ::IsWindow( hWndOwn ) )
  2017. return true;
  2018. CWnd * pWndInplace = mi.GetInplaceEditPtr();
  2019. if( pWndInplace != NULL )
  2020. {
  2021. ASSERT_VALID( pWndInplace );
  2022. ASSERT( pWndInplace->GetSafeHwnd() != NULL && (::IsWindow(pWndInplace->GetSafeHwnd())) );
  2023. if( mi.IsAllowInplaceEditActivation() )
  2024. {
  2025. if( (pWndInplace->GetStyle() & WS_VISIBLE) == 0 )
  2026. {
  2027. CRect rcInplaceEdit;
  2028. _GetItemRect( nHitTest, rcInplaceEdit );
  2029. rcInplaceEdit =
  2030. mi.AdjustInplaceEditRect(
  2031. rcInplaceEdit,
  2032. OnQueryLayoutRTL()
  2033. );
  2034. pWndInplace->SetWindowPos(
  2035. NULL,
  2036. rcInplaceEdit.left, rcInplaceEdit.top,
  2037. rcInplaceEdit.Width(), rcInplaceEdit.Height(),
  2038. SWP_NOZORDER|SWP_NOOWNERZORDER
  2039. |SWP_NOACTIVATE|SWP_SHOWWINDOW
  2040. );
  2041. } // if( (pWndInplace->GetStyle() & WS_VISIBLE) == 0 )
  2042. pWndInplace->SetFocus();
  2043. } // if( mi.IsAllowInplaceEditActivation() )
  2044. } // if( pWndInplace != NULL )
  2045. return true;
  2046. } // if( mi.IsInplaceEdit() ...
  2047. bool bContinueAsCommand = false;
  2048. if( mi.IsPopup() )
  2049. {
  2050. bool bPopupOpened = false;
  2051. if( mi.GetPopup()->GetSafeHwnd() != NULL )
  2052. bPopupOpened = true;
  2053. // if( bPopupOpened )
  2054. // return false;
  2055. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2056. if( (!bPopupOpened) && mi.IsInplaceEdit() && _FindHelpMode() )
  2057. {
  2058. CExtCustomizeCmdTreeNode * pNode = mi.GetCmdNode();
  2059. if( pNode != NULL )
  2060. _EndSequence(
  2061. pNode->GetCmdID( false ),
  2062. mi.GetCmdReceiver()
  2063. );
  2064. } // if( (!bPopupOpened) && mi.IsInplaceEdit() && _FindHelpMode() )
  2065. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2066. if( (!bPopupOpened) && mi.IsInplaceEdit() && bInplaceDropDownArea )
  2067. {
  2068. HWND hWndOwn = m_hWnd;
  2069. _ItemFocusCancel( FALSE );
  2070. if( ! ::IsWindow( hWndOwn ) )
  2071. return true;
  2072. }
  2073. // - 2.27 (for command processing in separated dropdown item)
  2074. // if( m_nDelayedFocusItemIndex < 0 )
  2075. {
  2076. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2077. bool bSeparatedDropDown = false;
  2078. const CExtCustomizeCmdTreeNode * pNode = mi.GetCmdNode();
  2079. if( pNode != NULL )
  2080. {
  2081. ASSERT_VALID( pNode );
  2082. bSeparatedDropDown =
  2083. (pNode->GetFlags() & __ECTN_TBB_SEPARATED_DROPDOWN)
  2084. ? true : false;
  2085. } // if( pNode != NULL )
  2086. if( bSeparatedDropDown )
  2087. {
  2088. bool bRTL = OnQueryLayoutRTL();
  2089. CRect rcItem;
  2090. _GetItemRect( nHitTest, rcItem );
  2091. CRect rcPopupArrow( rcItem );
  2092. //rcPopupArrow.DeflateRect(__EXT_MENU_GAP,__EXT_MENU_GAP);
  2093. if( bRTL )
  2094. rcPopupArrow.right = rcPopupArrow.left + __EXT_MENU_POPUP_ARROW_AREA_DX;
  2095. else
  2096. rcPopupArrow.left = rcPopupArrow.right - __EXT_MENU_POPUP_ARROW_AREA_DX;
  2097. ClientToScreen( &rcPopupArrow );
  2098. if( ! rcPopupArrow.PtInRect( ptScreenClick ) )
  2099. {
  2100. _SetCapture();
  2101. _ItemFocusCancel( FALSE, TRUE );
  2102. _ItemFocusSet( nHitTest, FALSE, FALSE, FALSE );
  2103. bContinueAsCommand = true;
  2104. }
  2105. } // if( bSeparatedDropDown )
  2106. else
  2107. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2108. if( ! bPopupOpened )
  2109. {
  2110. HWND hWndOwn = m_hWnd;
  2111. _ItemFocusSet(
  2112. nHitTest,
  2113. TRUE,
  2114. TRUE,
  2115. FALSE
  2116. );
  2117. if( ! ::IsWindow( hWndOwn ) )
  2118. return true;
  2119. }
  2120. else
  2121. return false;
  2122. } // if( m_nDelayedFocusItemIndex < 0 )
  2123. if( ! bContinueAsCommand )
  2124. {
  2125. _SetCapture();
  2126. return true;
  2127. }
  2128. } // if( mi.IsPopup() )
  2129. if( mi.IsExtraMark() && (! _FindHelpMode() ) )
  2130. {
  2131. ASSERT( mi.GetExtraMarkCallback() != NULL );
  2132. mi.GetExtraMarkCallback()( this, &mi );
  2133. CClientDC dc( this );
  2134. _DoPaint( dc );
  2135. } // if( mi.IsExtraMark() ...
  2136. else if(
  2137. mi.IsExecutableCmdID()
  2138. || bContinueAsCommand
  2139. || ( mi.IsPopup()
  2140. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2141. && mi.GetCmdNode() != NULL
  2142. && (mi.GetCmdNode()->GetFlags()&__ECTN_TBB_SEPARATED_DROPDOWN) != 0
  2143. && (mi.GetCmdNode()->GetFlags()&(__ECTN_TBB_COLOR|__ECTN_TBB_UNDO_REDO|__ECTN_TBB_DATE)) != 0
  2144. #else // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2145. && ( mi.GetPopup()->IsKindOf( RUNTIME_CLASS(CExtPopupColorMenuWnd) )
  2146. #if (!defined __EXT_MFC_NO_UNDO_REDO_POPUP)
  2147. || mi.GetPopup()->IsKindOf( RUNTIME_CLASS(CExtPopupUndoRedoMenuWnd) )
  2148. #endif // (!defined __EXT_MFC_NO_UNDO_REDO_POPUP)
  2149. #if (!defined __EXT_MFC_NO_DATE_PICKER_POPUP)
  2150. || mi.GetPopup()->IsKindOf( RUNTIME_CLASS(CExtPopupDatePickerMenuWnd) )
  2151. #endif // (!defined __EXT_MFC_NO_DATE_PICKER_POPUP)
  2152. )
  2153. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2154. )
  2155. )
  2156. {
  2157. CExtPopupMenuWnd * pTopLevelPopup = GetTopLevelMenuWnd();
  2158. ASSERT_VALID( pTopLevelPopup );
  2159. bool bHelperMouseBtnDownOnStart = pTopLevelPopup->m_bHelperMouseBtnDownOnStart;
  2160. pTopLevelPopup->m_bHelperMouseBtnDownOnStart = false;
  2161. bool bContinue = true;
  2162. if( mi.IsExecutableCmdID() )
  2163. {
  2164. if( bHelperMouseBtnDownOnStart )
  2165. {
  2166. CPoint pt;
  2167. ::GetCursorPos( &pt );
  2168. if( m_ptStartMousePos == pt )
  2169. bContinue = false;
  2170. }
  2171. }
  2172. if( bContinue )
  2173. {
  2174. if( !( mi.GetCmdDeliverCb() != NULL
  2175. && mi.GetCmdDeliverCb()( this, &mi )
  2176. )
  2177. )
  2178. {
  2179. _CancelingSet();
  2180. _EndSequenceEx( mi );
  2181. }
  2182. }
  2183. } // else if( mi.IsExecutableCmdID() ...
  2184. else
  2185. _OnCancelMode();
  2186. return true;
  2187. }
  2188. void CExtPopupMenuWnd::_EndSequenceEx(
  2189. CExtPopupMenuWnd::MENUITEMDATA & mi
  2190. )
  2191. {
  2192. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2193. _KeyTipsShow( false );
  2194. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2195. if( (! _IsFadeOutAnimation() )
  2196. && m_ctrlShadow.GetSafeHwnd() != NULL
  2197. )
  2198. m_ctrlShadow.DestroyWindow();
  2199. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2200. CExtCustomizeCmdTreeNode * pNode = mi.GetCmdNode();
  2201. CExtCustomizeSite * pSite =
  2202. CExtCustomizeSite::GetCustomizeSite(
  2203. mi.GetCmdReceiver()
  2204. );
  2205. if( pNode != NULL && pSite != NULL )
  2206. {
  2207. if( mi.IsExecutableCmdID() )
  2208. {
  2209. ASSERT_VALID( pNode );
  2210. if( ( pNode->GetFlags() & (__ECTN_TBB_COLOR|__ECTN_TBB_SEPARATED_DROPDOWN) ) == 0 )
  2211. {
  2212. CExtCustomizeCmdTreeNode * pNodeParent = pNode->GetParentNode();
  2213. if( pNodeParent != NULL )
  2214. {
  2215. ASSERT_VALID( pNodeParent );
  2216. if( ( pNodeParent->GetFlags() &
  2217. ( __ECTN_TBB_COLOR
  2218. | __ECTN_TBB_SEPARATED_DROPDOWN
  2219. | __ECTN_TBB_AUTOCHANGE_ID
  2220. )
  2221. )
  2222. == ( __ECTN_TBB_SEPARATED_DROPDOWN
  2223. | __ECTN_TBB_AUTOCHANGE_ID
  2224. )
  2225. )
  2226. {
  2227. pNodeParent->SetCmdID(
  2228. pNode->GetCmdID(),
  2229. true
  2230. );
  2231. HWND hWnd = mi.GetCmdReceiver();
  2232. if( hWnd != NULL && ::IsWindow( hWnd ) )
  2233. {
  2234. CExtCmdItem * pCmdItem = g_CmdManager->CmdGetPtr( g_CmdManager->ProfileNameFromWnd( hWnd ), pNode->GetCmdID() );
  2235. if( pCmdItem != NULL )
  2236. {
  2237. pNodeParent->SetTextInMenu(
  2238. pNode->GetTextInMenu( pCmdItem, true )
  2239. );
  2240. pNodeParent->SetTextInToolbar(
  2241. pNode->GetTextInToolbar( pCmdItem, true )
  2242. );
  2243. } // if( pCmdItem != NULL )
  2244. } // if( hWnd != NULL && ::IsWindow( hWnd ) )
  2245. }
  2246. } // if( pNodeParent != NULL )
  2247. } // if( ( pNode->GetFlags() & (__ECTN_TBB_COLOR|__ECTN_TBB_SEPARATED_DROPDOWN) ) == 0 )
  2248. } // if( mi.IsExecutableCmdID() )
  2249. else if( ( pNode->GetFlags() & (__ECTN_TBB_COLOR|__ECTN_TBB_SEPARATED_DROPDOWN) ) == (__ECTN_TBB_COLOR|__ECTN_TBB_SEPARATED_DROPDOWN) )
  2250. {
  2251. _EndSequence();
  2252. COLORREF clr;
  2253. if( pSite->OnColorItemValueGet(
  2254. NULL,
  2255. pNode,
  2256. clr,
  2257. true
  2258. )
  2259. )
  2260. pSite->OnColorItemValueSet(
  2261. NULL,
  2262. pNode,
  2263. clr,
  2264. true
  2265. );
  2266. return;
  2267. } // else if( ( pNode->GetFlags() & (__ECTN_TBB_COLOR|__ECTN_TBB_SEPARATED_DROPDOWN) ) == (__ECTN_TBB_COLOR|__ECTN_TBB_SEPARATED_DROPDOWN) )
  2268. } // if( pNode != NULL && pSite != NULL )
  2269. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2270. _EndSequence( mi.GetCmdID(), mi.GetCmdReceiver() );
  2271. }
  2272. void CExtPopupMenuWnd::_EndSequence(
  2273. UINT nCmdID, // = 0
  2274. HWND hWndDeliver // = NULL
  2275. )
  2276. {
  2277. __PROF_UIS_MANAGE_STATE;
  2278. ASSERT_VALID( this );
  2279. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2280. _KeyTipsShow( false );
  2281. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2282. HWND hWndOwn = GetSafeHwnd();
  2283. ASSERT( hWndOwn != NULL );
  2284. bool bCustomizeMode = _FindCustomizeMode();
  2285. if( (! _IsFadeOutAnimation() )
  2286. && m_ctrlShadow.GetSafeHwnd() != NULL
  2287. )
  2288. m_ctrlShadow.DestroyWindow();
  2289. #ifdef _DEBUG
  2290. if( hWndDeliver != NULL )
  2291. {
  2292. ASSERT( ::IsWindow(hWndDeliver) );
  2293. }
  2294. #endif // _DEBUG
  2295. ASSERT( m_hWndCmdReceiver != NULL );
  2296. ASSERT( ::IsWindow(m_hWndCmdReceiver) );
  2297. CExtPopupMenuSite & _site = GetSite();
  2298. UINT * lpnResultCmdID = _site.GetTargetCmdIdPtr();
  2299. if( lpnResultCmdID != NULL )
  2300. *lpnResultCmdID = nCmdID;
  2301. DWORD dwTrackFlags = TrackFlagsGet();
  2302. CExtCmdItem * pCmdItem = NULL;
  2303. if( nCmdID > 0 && ((dwTrackFlags&TPMX_NO_WM_COMMAND)==0) )
  2304. {
  2305. pCmdItem =
  2306. g_CmdManager->CmdGetPtr(
  2307. g_CmdManager->ProfileNameFromWnd( m_hWndCmdReceiver ),
  2308. nCmdID
  2309. );
  2310. //ASSERT( pCmdItem != NULL );
  2311. } // if( nCmdID > 0 && ((dwTrackFlags&TPMX_NO_WM_COMMAND)==0) )
  2312. CExtPopupMenuWnd * pTopPopup = _site.GetInstance();
  2313. ASSERT_VALID( pTopPopup );
  2314. HWND hWndTopPopup = pTopPopup->GetSafeHwnd();
  2315. ASSERT(
  2316. hWndTopPopup != NULL
  2317. && ::IsWindow( hWndTopPopup )
  2318. );
  2319. if( hWndDeliver == NULL )
  2320. hWndDeliver = m_hWndCmdReceiver;
  2321. CWnd * pTopLevelParent = GetTopLevelParent();
  2322. HWND hWndTopLevelParent = pTopLevelParent->GetSafeHwnd();
  2323. CRect rcBkUpdate( 0, 0, 0, 0 );
  2324. // hide all sequence
  2325. bool bFadeOut = _IsFadeOutAnimation();
  2326. if( ! bFadeOut )
  2327. {
  2328. CExtPopupMenuWnd * pPopup = this;
  2329. for( ; pPopup != NULL; pPopup = pPopup->m_pWndParentMenu )
  2330. {
  2331. ASSERT_VALID( pPopup );
  2332. ASSERT( pPopup->GetSafeHwnd() != NULL );
  2333. ASSERT( ::IsWindow( pPopup->GetSafeHwnd() ) );
  2334. CRect rcPopup;
  2335. pPopup->GetWindowRect( &rcPopup );
  2336. if( rcBkUpdate.IsRectEmpty() )
  2337. rcBkUpdate = rcPopup;
  2338. else
  2339. {
  2340. CRect rcPrev( rcBkUpdate );
  2341. rcBkUpdate.UnionRect( &rcPrev, &rcPopup );
  2342. }
  2343. CExtPopupMenuTipWnd & _tipWnd = pPopup->GetTip();
  2344. if( _tipWnd.GetSafeHwnd() != NULL
  2345. && ::IsWindow( _tipWnd.GetSafeHwnd() )
  2346. && _tipWnd.IsWindowVisible()
  2347. )
  2348. {
  2349. CRect rcToolTip;
  2350. _tipWnd.GetWindowRect( &rcToolTip );
  2351. CRect rcPrev( rcBkUpdate );
  2352. rcBkUpdate.UnionRect( &rcPrev, &rcToolTip );
  2353. }
  2354. pPopup->ShowWindow( SW_HIDE );
  2355. } // for( ; pPopup != NULL; pPopup = pPopup->m_pWndParentMenu )
  2356. if( ! g_PaintManager.m_bIsWin2000orLater )
  2357. CExtPaintManager::stat_PassPaintMessages();
  2358. // allow bottom windows repaint
  2359. if( !rcBkUpdate.IsRectEmpty()
  2360. && hWndTopLevelParent != NULL
  2361. && ::IsWindow(hWndTopLevelParent)
  2362. )
  2363. {
  2364. ::ScreenToClient(
  2365. hWndTopLevelParent, (LPPOINT)&rcBkUpdate);
  2366. ::ScreenToClient(
  2367. hWndTopLevelParent, ((LPPOINT)&rcBkUpdate)+1
  2368. );
  2369. }
  2370. } // if( ! bFadeOut )
  2371. if( m_hWndNotifyMenuClosed != NULL
  2372. && ::IsWindow( m_hWndNotifyMenuClosed )
  2373. )
  2374. ::SendMessage(
  2375. m_hWndNotifyMenuClosed,
  2376. g_nMsgNotifyMenuClosed,
  2377. WPARAM(nCmdID),
  2378. LPARAM( this )
  2379. );
  2380. // top popup (and all children) finally must be closed
  2381. if( ! bFadeOut )
  2382. {
  2383. if( ::IsWindow( hWndTopPopup ) )
  2384. ::PostMessage( hWndTopPopup, WM_CLOSE, 0, 0 );
  2385. CExtToolControlBar::_CloseCustomMenusAll();
  2386. if( CExtToolControlBar::g_bMenuTracking )
  2387. CExtToolControlBar::_CloseTrackingMenus();
  2388. } // if( ! bFadeOut )
  2389. bool bOwnWindowDestroyed = ::IsWindow( hWndOwn ) ? false : true;
  2390. if( ::IsWindow( hWndDeliver )
  2391. && ( bOwnWindowDestroyed || (! bCustomizeMode ) )
  2392. )
  2393. {
  2394. if( pCmdItem != NULL )
  2395. {
  2396. // if command target still exists -> deliver command to it
  2397. if( (dwTrackFlags&TPMX_NO_WM_COMMAND)==0 )
  2398. {
  2399. if( ! bFadeOut )
  2400. _site.DoneInstance();
  2401. VERIFY( pCmdItem->Deliver( hWndDeliver ) );
  2402. }
  2403. } // if( pCmdItem != NULL )
  2404. else
  2405. {
  2406. if( (! bOwnWindowDestroyed )
  2407. && bFadeOut
  2408. && m_nCurIndex >= 0
  2409. && ItemGetInfo( m_nCurIndex ).IsPopup()
  2410. )
  2411. {
  2412. CExtPopupMenuWnd * pPopup = ItemGetInfo( m_nCurIndex ).GetPopup();
  2413. if( pPopup->GetSafeHwnd() != NULL )
  2414. {
  2415. INT nSaved = pPopup->m_nFadeOutAnimationStepCount;
  2416. if( nCmdID == 0 )
  2417. pPopup->m_nFadeOutAnimationStepCount = -1;
  2418. pPopup->_EndSequence( nCmdID, hWndDeliver );
  2419. pPopup->m_nFadeOutAnimationStepCount = nSaved;
  2420. return;
  2421. }
  2422. }
  2423. if( (dwTrackFlags&TPMX_NO_WM_COMMAND) == 0 
  2424. && nCmdID != 0
  2425. )
  2426. ::PostMessage(
  2427. hWndDeliver,
  2428. WM_COMMAND,
  2429. WPARAM(nCmdID),
  2430. 0L
  2431. );
  2432. } // else from if( pCmdItem != NULL )
  2433. g_SoundPlayer->PlaySound( CExtSoundPlayer::__ON_MENU_CMD_CLICKED );
  2434. } // if( pCmdItem != NULL && ...
  2435. if( bOwnWindowDestroyed )
  2436. return;
  2437. if( bFadeOut )
  2438. DestroyWindow();
  2439. else
  2440. _site.DoneInstance();
  2441. }
  2442. void CExtPopupMenuWnd::OnMouseMove(UINT nFlags, CPoint point) 
  2443. {
  2444. nFlags;
  2445. point;
  2446. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2447. if( (!_FindCustomizeMode()) )
  2448. return;
  2449. int nIndex = _HitTest( point );
  2450. if( nIndex >= 0 )
  2451. return;
  2452. if( nIndex == IDX_SCROLL_TOP
  2453. || nIndex == IDX_SCROLL_BOTTOM
  2454. )
  2455. {
  2456. HWND hWndOwn = m_hWnd;
  2457. _StartScrolling( nIndex );
  2458. if( ! ::IsWindow( hWndOwn ) )
  2459. return;
  2460. }
  2461. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2462. }
  2463. void CExtPopupMenuWnd::OnLButtonDown(UINT nFlags, CPoint point)
  2464. {
  2465. nFlags;
  2466. point;
  2467. if( _IsResizingMode() )
  2468. return;
  2469. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2470. if( (!_FindCustomizeMode()) )
  2471. return;
  2472. int nIndex = _HitTest( point );
  2473. if( nIndex < 0 )
  2474. return;
  2475. ASSERT( nIndex < ItemGetCount() );
  2476. MENUITEMDATA & mi = ItemGetInfo( nIndex );
  2477. if( mi.IsSeparator() )
  2478. return;
  2479. CExtCustomizeSite * pSite = _FindCustomizeSite();
  2480. ASSERT( pSite != NULL );
  2481. CExtCustomizeCmdTreeNode * pClickedCmdNode = mi.GetCmdNode();
  2482. if( pClickedCmdNode == NULL )
  2483. return;
  2484. ASSERT_VALID( pClickedCmdNode );
  2485. #if (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  2486. if( mi.IsSelected()
  2487. && (pClickedCmdNode->GetFlags() & __ECTN_TBB_RESIZABLE) != 0
  2488. )
  2489. { // if button can be resized
  2490. int nDdWidth = PmBridge_GetPM()->GetDropDividerMerics().cx / 2;
  2491. if( nDdWidth < 2 )
  2492. nDdWidth = 2;
  2493. CRect rcItem( 0, 0, 0, 0 );
  2494. _GetItemRect( nIndex, rcItem );
  2495. CRect rcH( rcItem );
  2496. rcH.right = rcH.left + nDdWidth;
  2497. int nInitialResizingStateH = 0;
  2498. if( rcH.PtInRect(point) )
  2499. nInitialResizingStateH = -1;
  2500. else
  2501. {
  2502. rcH = rcItem;
  2503. rcH.left = rcH.right - nDdWidth;
  2504. if( rcH.PtInRect(point) )
  2505. nInitialResizingStateH = 1;
  2506. } // else from if( rcH.PtInRect(point) )
  2507. if( nInitialResizingStateH != 0 )
  2508. {
  2509. int nWidthMin = 0, nWidthMax = 0;
  2510. pSite->OnGetCmdItemMinMaxSizeH(
  2511. NULL,
  2512. pClickedCmdNode,
  2513. &nWidthMin,
  2514. &nWidthMax
  2515. );
  2516. CRect rcInplaceEdit =
  2517. mi.AdjustInplaceEditRect(
  2518. rcItem,
  2519. OnQueryLayoutRTL()
  2520. );
  2521. rcInplaceEdit.top = rcItem.top;
  2522. rcInplaceEdit.bottom = rcItem.bottom;
  2523. INT nDD = PmBridge_GetPM()->GetDropDownButtonWidth( this );
  2524. if( mi.IsPopup() )
  2525. rcInplaceEdit.right += nDD;
  2526. if( !pSite->OnCmdNodeResizeH(
  2527. nInitialResizingStateH,
  2528. m_hWnd,
  2529. NULL,
  2530. pClickedCmdNode,
  2531. nWidthMin,
  2532. nWidthMax,
  2533. rcInplaceEdit // rcItem
  2534. )
  2535. )
  2536. return; // resizing is canceled
  2537. // if( nDD != 0 )
  2538. // pClickedCmdNode->TextFieldWidthSet(
  2539. // pClickedCmdNode->TextFieldWidthGet() - nDD
  2540. // );
  2541. int nSavedIndex = m_nCurIndex;
  2542. m_nCurIndex = -1;
  2543. _BuildItems( NULL, m_bTopLevel );
  2544. VERIFY( UpdateFromCmdTree( m_hWndCmdReceiver, m_pNode, m_bTopLevel ) );
  2545. _SyncItems();
  2546. ShowWindow( SW_HIDE );
  2547. _RecalcLayoutImpl();
  2548. VERIFY( SetWindowRgn( NULL, FALSE ) );
  2549. ASSERT( !IsWindowVisible() );
  2550. _FreeWinObjects();
  2551. // adjust screen position
  2552. CRect rcWnd = _CalcTrackRect();
  2553. if( m_rgnWnd.GetSafeHandle() != NULL )
  2554. {
  2555. ASSERT( m_bExcludeAreaSpec );
  2556. ASSERT( m_bCombineWithEA );
  2557. ASSERT( m_eCombineAlign != __CMBA_NONE );
  2558. CRgn rgnTmp;
  2559. VERIFY( rgnTmp.CreateRectRgn(0,0,0,0) );
  2560. rgnTmp.CopyRgn( &m_rgnWnd );
  2561. ASSERT( rgnTmp.GetSafeHandle() != NULL );
  2562. VERIFY(
  2563. SetWindowRgn(
  2564. (HRGN)rgnTmp.Detach(),
  2565. FALSE
  2566. )
  2567. );
  2568. } // if( m_rgnWnd.GetSafeHandle() != NULL )
  2569. SetWindowPos(
  2570. NULL,
  2571. rcWnd.left, rcWnd.top, rcWnd.Width(), rcWnd.Height(),
  2572. SWP_NOACTIVATE
  2573. |SWP_NOZORDER //|SWP_NOOWNERZORDER
  2574. );
  2575. if( m_bScrollingAvailable )
  2576. _RecalcLayoutImpl();
  2577. ShowWindow( SW_SHOWNA );
  2578. UpdateWindow();
  2579. HWND hWndOwn = m_hWnd;
  2580. _ItemFocusSet( nSavedIndex, FALSE, FALSE, FALSE );
  2581. if( ! ::IsWindow( hWndOwn ) )
  2582. return;
  2583. ASSERT( m_pDragSrcNode == NULL );
  2584. m_pDragSrcNode = pClickedCmdNode;
  2585. CClientDC dc( this );
  2586. _DoPaint( dc );
  2587. m_pDragSrcNode = NULL;
  2588. return;
  2589. } // if( nInitialResizingStateH != 0 )
  2590. } // if button can be resized
  2591. #endif // (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  2592. ASSERT( m_pDragSrcNode == NULL );
  2593. ASSERT( m_nDragSrcIdx < 0 );
  2594. m_pDragSrcNode = pClickedCmdNode;
  2595. m_nDragSrcIdx = nIndex;
  2596. m_bHelperNoRemoveSrc = false;
  2597. CRect rcItem( 0, 0, 1, 1 );
  2598. _DoResetChainPositions();
  2599. m_ptHelperDragStart = point;
  2600. m_bHelperNoHideChild = true;
  2601. m_bHelperDragOverPassed = false;
  2602. HWND hWndOwn = m_hWnd;
  2603. _ItemFocusSet( nIndex, TRUE, TRUE, FALSE );
  2604. if( ! ::IsWindow( hWndOwn ) )
  2605. return;
  2606. ASSERT( hWndOwn != NULL && ::IsWindow(hWndOwn) );
  2607. if( ! CExtControlBar::stat_DoDragDetect( hWndOwn, point ) )
  2608. {
  2609. m_pDragSrcNode = NULL;
  2610. m_bHelperNoHideChild = false;
  2611. m_nDragSrcIdx = -1;
  2612. m_bHelperNoRemoveSrc = false;
  2613. m_bHelperDragOverPassed = false;
  2614. return;
  2615. }
  2616. pSite->DoDragCmdNode(
  2617. this,
  2618. NULL,
  2619. m_pDragSrcNode,
  2620. rcItem
  2621. );
  2622. if( ! ::IsWindow(hWndOwn) )
  2623. return;
  2624. m_pDragSrcNode = NULL;
  2625. m_bHelperNoHideChild = false;
  2626. m_nDragSrcIdx = -1;
  2627. m_bHelperNoRemoveSrc = false;
  2628. m_bHelperDragOverPassed = false;
  2629. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2630. }
  2631. void CExtPopupMenuWnd::OnRButtonDown(UINT nFlags, CPoint point) 
  2632. {
  2633. nFlags;
  2634. point;
  2635. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  2636. if( (!_FindCustomizeMode()) )
  2637. return;
  2638. int nIndex = _HitTest( point );
  2639. if( nIndex < 0 )
  2640. return;
  2641. ASSERT( nIndex < ItemGetCount() );
  2642. MENUITEMDATA & mi = ItemGetInfo( nIndex );
  2643. if( mi.IsSeparator() )
  2644. return;
  2645. HWND hWndOwn = m_hWnd;
  2646. _ItemFocusSet( mi.GetIndex(), TRUE, TRUE, FALSE );
  2647. if( ! ::IsWindow( hWndOwn ) )
  2648. return;
  2649. CExtCustomizeCmdTreeNode * pNode = mi.GetCmdNode();
  2650. ASSERT_VALID( pNode );
  2651. CExtCustomizeSite * pSite = _FindCustomizeSite();
  2652. ASSERT( pSite != NULL );
  2653. CRect rcItem( 0, 0, 1, 1 );
  2654. _DoResetChainPositions();
  2655. CExtCmdItem * pCmdItem =
  2656. g_CmdManager->CmdGetPtr(
  2657. g_CmdManager->ProfileNameFromWnd(m_hWnd),
  2658. pNode->GetCmdID( false )
  2659. );
  2660. ASSERT( pCmdItem != NULL );
  2661. if( !pSite->CustomizedNodeSet( pNode ) )
  2662. return;
  2663. { // BLOCK
  2664. CClientDC dc( this );
  2665. _DoPaint( dc );
  2666. } // BLOCK
  2667. bool bCanAddRemoveSeparator = (nIndex > 0) ? true : false;
  2668. bool bDelete = false;
  2669. ASSERT( hWndOwn != NULL && ::IsWindow(hWndOwn) );
  2670. if( !pSite->OnCustomizeTreeNode(
  2671. NULL,
  2672. pNode,
  2673. pCmdItem,
  2674. bDelete,
  2675. bCanAddRemoveSeparator,
  2676. this
  2677. )
  2678. )
  2679. {
  2680. if( pSite->CustomizedNodeGet() == pNode )
  2681. {
  2682. VERIFY( pSite->CustomizedNodeSet( NULL ) );
  2683. }
  2684. if( hWndOwn == NULL
  2685. || (! ::IsWindow(hWndOwn) )
  2686. )
  2687. return;
  2688. CClientDC dc( this );
  2689. _DoPaint( dc );
  2690. return;
  2691. }
  2692. VERIFY( pSite->CustomizedNodeSet( NULL ) );
  2693. if( !::IsWindow(hWndOwn) )
  2694. return;
  2695. m_nCurIndex = -1;
  2696. _BuildItems( NULL, m_bTopLevel );
  2697. if( bDelete )
  2698. {
  2699. ASSERT_VALID( pNode->GetParentNode() );
  2700. int nOwnNodeIndex = pNode->GetOwnIndex();
  2701. if( nOwnNodeIndex < (pNode->GetParentNode()->GetNodeCount()-1) )
  2702. pNode->GetParentNode()->ElementAt(nOwnNodeIndex+1)
  2703. ->ModifyFlags( 0, __ECTN_GROUP_START );
  2704. pNode->RemoveSelf( pCmdItem );
  2705. }
  2706. ASSERT_VALID( m_pNode );
  2707. VERIFY( UpdateFromCmdTree( m_hWndCmdReceiver, m_pNode, m_bTopLevel ) );
  2708. _SyncItems();
  2709. ShowWindow( SW_HIDE );
  2710. _RecalcLayoutImpl();
  2711. VERIFY( SetWindowRgn( NULL, FALSE ) );
  2712. ASSERT( !IsWindowVisible() );
  2713. _FreeWinObjects();
  2714. // adjust screen position
  2715. CRect rcWnd = _CalcTrackRect();
  2716. if( m_rgnWnd.GetSafeHandle() != NULL )
  2717. {
  2718. ASSERT( m_bExcludeAreaSpec );
  2719. ASSERT( m_bCombineWithEA );
  2720. ASSERT( m_eCombineAlign != __CMBA_NONE );
  2721. CRgn rgnTmp;
  2722. VERIFY( rgnTmp.CreateRectRgn(0,0,0,0) );
  2723. rgnTmp.CopyRgn( &m_rgnWnd );
  2724. ASSERT( rgnTmp.GetSafeHandle() != NULL );
  2725. VERIFY(
  2726. SetWindowRgn(
  2727. (HRGN)rgnTmp.Detach(),
  2728. FALSE
  2729. )
  2730. );
  2731. } // if( m_rgnWnd.GetSafeHandle() != NULL )
  2732. SetWindowPos(
  2733. NULL,
  2734. rcWnd.left, rcWnd.top, rcWnd.Width(), rcWnd.Height(),
  2735. SWP_NOACTIVATE
  2736. |SWP_NOZORDER //|SWP_NOOWNERZORDER
  2737. );
  2738. if( m_bScrollingAvailable )
  2739. _RecalcLayoutImpl();
  2740. ShowWindow( SW_SHOWNA );
  2741. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  2742. }
  2743. void CExtPopupMenuWnd::OnShowWindow(BOOL bShow, UINT nStatus) 
  2744. {
  2745. ASSERT_VALID( this );
  2746. HWND hWndThis = m_hWnd;
  2747. CExtPopupBaseWnd::OnShowWindow(bShow, nStatus);
  2748. if( ! ::IsWindow(hWndThis) )
  2749. return;
  2750. if( _FindCustomizeMode()
  2751. && bShow
  2752. )
  2753. {
  2754. CClientDC dc( this );
  2755. _DoPaint( dc );
  2756. }
  2757. }
  2758. void CExtPopupMenuWnd::OnCancelMode() 
  2759. {
  2760. ASSERT_VALID( this );
  2761. if( CExtPopupMenuWnd::TEAROFFNOTIFICATON::g_pCurrentTEAROFFNOTIFICATON != NULL )
  2762. return;
  2763. if( _FindCustomizeMode() )
  2764. return;
  2765. TrackFlagsSet( TrackFlagsGet() | TPMX_NO_FADE_OUT_ANIMATION );
  2766. HWND hWndOwn = GetSafeHwnd();
  2767. ASSERT( hWndOwn != NULL );
  2768. if( (TrackFlagsGet()&TPMX_NO_SITE) == 0
  2769. && (! m_bHelperAnimationControllerDetected )
  2770. )
  2771. {
  2772. CExtPopupMenuSite & _site = GetSite();
  2773. if( _site.GetInstance() == this )
  2774. _site.DoneInstance();
  2775. // ASSERT( _site.IsEmpty() );
  2776. // ASSERT( !_site.IsShutdownMode() );
  2777. }
  2778. if( ( ! ::IsWindow( hWndOwn ) )
  2779. // || ( ! _IsFadeOutAnimation() )
  2780. )
  2781. {
  2782. CExtToolControlBar::_CloseCustomMenusAll();
  2783. if( CExtToolControlBar::g_bMenuTracking )
  2784. CExtToolControlBar::_CloseTrackingMenus();
  2785. }
  2786. }
  2787. void CExtPopupMenuWnd::_FreeWinObjects()
  2788. {
  2789. ASSERT_VALID( this );
  2790. if( m_rgnWnd.GetSafeHandle() != NULL )
  2791. {
  2792. VERIFY(
  2793. m_rgnWnd.DeleteObject()
  2794. );
  2795. }
  2796. m_ShadowMain.Destroy();
  2797. m_ShadowCMBA.Destroy();
  2798. _SurfacesDelete();
  2799. if( !(::IsWindow(GetSafeHwnd())) )
  2800. return;
  2801. KillTimer(ID_TIMER_ANIMATION);
  2802. //KillTimer(ID_TIMER_DELAY_SHOW);
  2803. //KillTimer(ID_TIMER_ITEM_FOCUS_DELAY);
  2804. //KillTimer(ID_TIMER_ITEM_HIDE_DELAY);
  2805. //KillTimer(ID_TIMER_SCROLLING);
  2806. //m_nAcceleratedPixelsPerStepCurrent = __SCROLLING_PIXEL_STEP;
  2807. //m_nAcceleratedMilliSecondsPassed = 0;
  2808. //KillTimer(ID_TIMER_DELAY_KILL);
  2809. //KillTimer(ID_TIMER_LIFE_STEP);
  2810. }
  2811. void CExtPopupMenuWnd::_OnCancelMode(
  2812. bool bNcDestroy // = false
  2813. {
  2814. ASSERT_VALID( this );
  2815. // update status bar message
  2816. CExtControlBar::stat_SetMessageString(
  2817. GetSafeOwner()
  2818. );
  2819. bool bCusomizeMode = _FindCustomizeMode();
  2820. if( ! bCusomizeMode )
  2821. {
  2822. HWND hWndOwn = m_hWnd;
  2823. _CoolTipHide( false );
  2824. if( ! ::IsWindow( hWndOwn ) )
  2825. return;
  2826. _FreeWinObjects();
  2827. _ReleaseCapture();
  2828. } // if( !bCusomizeMode )
  2829. INT iter = 0;
  2830. for( ; iter < m_items_all.GetSize(); iter++ )
  2831. {
  2832. MENUITEMDATA & mi = ItemGetInfo( iter );
  2833. mi.SetSelected( false );
  2834. if( mi.IsPopup() )
  2835. {
  2836. if( mi.GetPopup()->GetSafeHwnd() != NULL )
  2837. mi.GetPopup()->_OnCancelMode();
  2838. }
  2839. }
  2840. m_nCurIndex = m_nLastMousePick = IDX_NOTHING;
  2841. if( bNcDestroy )
  2842. return;
  2843. HWND hWndOwn = GetSafeHwnd();
  2844. if( ! ::IsWindow( hWndOwn ) )
  2845. return;
  2846. // if( ( GetStyle() & WS_VISIBLE ) == 0 )
  2847. // return;
  2848. bool bFadeOut = _IsFadeOutAnimation();
  2849. bool bTopLevel = m_bTopLevel;
  2850. if( ! bFadeOut )
  2851. {
  2852. if( m_ctrlShadow.GetSafeHwnd() != NULL
  2853. && (m_ctrlShadow.GetStyle()&WS_VISIBLE)
  2854. )
  2855. m_ctrlShadow.ShowWindow( SW_HIDE );
  2856. ShowWindow( SW_HIDE );
  2857. }
  2858. if( ! bCusomizeMode )
  2859. {
  2860. HWND hWndOwn = m_hWnd;
  2861. _ItemFocusDelay();
  2862. if( ! ::IsWindow( hWndOwn ) )
  2863. return;
  2864. // INT nSaved = m_nFadeOutAnimationStepCount;
  2865. // m_nFadeOutAnimationStepCount = -1;
  2866. DestroyWindow();
  2867. // m_nFadeOutAnimationStepCount = nSaved;
  2868. } // if( ! bCusomizeMode )
  2869. if( CExtToolControlBar::g_bMenuTracking
  2870. && bTopLevel
  2871. && ( ! bCusomizeMode )
  2872. && ( ! bFadeOut )
  2873. )
  2874. {
  2875. CExtToolControlBar::_CloseCustomMenusAll();
  2876. CExtToolControlBar::_CloseTrackingMenus();
  2877. }
  2878. }
  2879. const UINT CExtPopupMenuWnd::g_nMsgRibbonFileMenuButtonInvocation =
  2880. ::RegisterWindowMessage(
  2881. _T("CExtPopupMenuWnd::g_nMsgRibbonFileMenuButtonInvocation")
  2882. );
  2883. CExtPopupMenuWnd::RIBBONFILEMENUBUTTONINVOCATION::RIBBONFILEMENUBUTTONINVOCATION(
  2884. DWORD dwButtonType,
  2885. CExtPopupMenuWnd * pPopup
  2886. )
  2887. : m_dwButtonType( dwButtonType )
  2888. , m_hWndTarget1( NULL )
  2889. , m_hWndTarget2( NULL )
  2890. , m_bQueryHandled( false )
  2891. {
  2892. ASSERT_VALID( pPopup );
  2893. m_hWndTarget1 = pPopup->GetCmdReceiverHWND();
  2894. m_hWndTarget2 = pPopup->m_hWndNotifyMenuClosed;
  2895. }
  2896. bool CExtPopupMenuWnd::RIBBONFILEMENUBUTTONINVOCATION::Notify()
  2897. {
  2898. m_bQueryHandled = false;
  2899. if( m_hWndTarget1 != NULL
  2900. && ::IsWindow( m_hWndTarget1 )
  2901. )
  2902. {
  2903. ::SendMessage(
  2904. m_hWndTarget1,
  2905. CExtPopupMenuWnd::g_nMsgRibbonFileMenuButtonInvocation,
  2906. *this,
  2907. 0L
  2908. );
  2909. if( m_bQueryHandled )
  2910. return true;
  2911. }
  2912. if( m_hWndTarget2 != NULL
  2913. && ::IsWindow( m_hWndTarget2 )
  2914. )
  2915. {
  2916. ::SendMessage(
  2917. m_hWndTarget2,
  2918. CExtPopupMenuWnd::g_nMsgRibbonFileMenuButtonInvocation,
  2919. *this,
  2920. 0L
  2921. );
  2922. if( m_bQueryHandled )
  2923. return true;
  2924. }
  2925. return false;
  2926. }
  2927. CExtPopupMenuWnd::RIBBONFILEMENUBUTTONINVOCATION::operator WPARAM() const
  2928. {
  2929. return WPARAM( this );
  2930. }
  2931. CExtPopupMenuWnd::RIBBONFILEMENUBUTTONINVOCATION * CExtPopupMenuWnd::RIBBONFILEMENUBUTTONINVOCATION::FromWPARAM( WPARAM wParam )
  2932. {
  2933. RIBBONFILEMENUBUTTONINVOCATION * pICN =
  2934. reinterpret_cast < RIBBONFILEMENUBUTTONINVOCATION * > ( wParam );
  2935. ASSERT( pICN != NULL );
  2936. return pICN;
  2937. }
  2938. const UINT CExtPopupMenuWnd::g_nMsgRibbonFileMenuButtonQuery =
  2939. ::RegisterWindowMessage(
  2940. _T("CExtPopupMenuWnd::g_nMsgRibbonFileMenuButtonQuery")
  2941. );
  2942. CExtPopupMenuWnd::RIBBONFILEMENUBUTTONQUERY::RIBBONFILEMENUBUTTONQUERY(
  2943. CExtPopupMenuWnd * pPopup,
  2944. DWORD dwButtonType,
  2945. CDC * pDC // = NULL
  2946. )
  2947. : m_pPopup( pPopup )
  2948. , m_dwButtonType( dwButtonType )
  2949. , m_pDC( pDC )
  2950. , m_nMeasuredWidth( 0 )
  2951. , m_rcButton( 0, 0, 0, 0 )
  2952. , m_bHover( false )
  2953. , m_bPressed( false )
  2954. , m_bQueryHandled( false )
  2955. {
  2956. }
  2957. bool CExtPopupMenuWnd::RIBBONFILEMENUBUTTONQUERY::Notify()
  2958. {
  2959. if( m_pPopup == NULL )
  2960. return false;
  2961. ASSERT_VALID( m_pPopup );
  2962. m_bQueryHandled = false;
  2963. HWND hWndTarget = m_pPopup->GetCmdReceiverHWND();
  2964. if( hWndTarget == NULL
  2965. || (! ::IsWindow( hWndTarget ) )
  2966. )
  2967. {
  2968. ::SendMessage(
  2969. hWndTarget,
  2970. CExtPopupMenuWnd::g_nMsgRibbonFileMenuButtonQuery,
  2971. *this,
  2972. 0L
  2973. );
  2974. if( m_bQueryHandled )
  2975. return true;
  2976. }
  2977. hWndTarget = m_pPopup->m_hWndNotifyMenuClosed;
  2978. if( hWndTarget == NULL
  2979. || (! ::IsWindow( hWndTarget ) )
  2980. )
  2981. return false;
  2982. ::SendMessage(
  2983. hWndTarget,
  2984. CExtPopupMenuWnd::g_nMsgRibbonFileMenuButtonQuery,
  2985. *this,
  2986. 0L
  2987. );
  2988. return m_bQueryHandled;
  2989. }
  2990. CExtPopupMenuWnd::RIBBONFILEMENUBUTTONQUERY::operator WPARAM() const
  2991. {
  2992. return WPARAM( this );
  2993. }
  2994. CExtPopupMenuWnd::RIBBONFILEMENUBUTTONQUERY * CExtPopupMenuWnd::RIBBONFILEMENUBUTTONQUERY::FromWPARAM( WPARAM wParam )
  2995. {
  2996. RIBBONFILEMENUBUTTONQUERY * pICN =
  2997. reinterpret_cast < RIBBONFILEMENUBUTTONQUERY * > ( wParam );
  2998. ASSERT( pICN != NULL );
  2999. return pICN;
  3000. }
  3001. const UINT CExtPopupMenuWnd::g_nMsgItemCoveringNotification =
  3002. ::RegisterWindowMessage(
  3003. _T("CExtPopupMenuWnd::g_nMsgItemCoveringNotification")
  3004. );
  3005. const UINT CExtPopupMenuWnd::g_nMsgTearOff =
  3006. ::RegisterWindowMessage(
  3007. _T("CExtPopupMenuWnd::g_nMsgTearOff")
  3008. );
  3009. const UINT CExtPopupMenuWnd::g_nMsgCustomFloatPos =
  3010. ::RegisterWindowMessage(
  3011. _T("CExtPopupMenuWnd::g_nMsgCustomFloatPos")
  3012. );
  3013. CExtPopupMenuWnd::ITEMCOVERINGNOTIFICATON::ITEMCOVERINGNOTIFICATON(
  3014. CExtPopupMenuWnd * pPopup,
  3015. CExtBarButton * pTBB,
  3016. CExtPopupMenuWnd::ITEMCOVERINGNOTIFICATON::eICN_t eICN,
  3017. INT nPopupItemIndex, // = -1
  3018. bool bEnableDropChild, // = false
  3019. bool bSelectAnyInChild // = false
  3020. )
  3021. : m_pPopup( pPopup )
  3022. , m_pTBB( pTBB )
  3023. , m_nPopupItemIndex( nPopupItemIndex )
  3024. , m_eICN( eICN )
  3025. , m_bEnableDropChild( bEnableDropChild )
  3026. , m_bSelectAnyInChild( bSelectAnyInChild )
  3027. , m_bSuspendTips( false )
  3028. {
  3029. #ifdef _DEBUG
  3030. if( m_pPopup != NULL )
  3031. {
  3032. ASSERT_VALID( m_pPopup );
  3033. ASSERT( m_pTBB == NULL );
  3034. INT nPopupItemCount = m_pPopup->ItemGetCount();
  3035. ASSERT( 0 <= m_nPopupItemIndex && m_nPopupItemIndex <= nPopupItemCount );
  3036. ASSERT(
  3037. m_eICN == __EICN_CANCEL
  3038. || m_eICN == __EICN_SET
  3039. || m_eICN == __EICN_DELAY
  3040. );
  3041. } // if( m_pPopup != NULL )
  3042. else
  3043. {
  3044. ASSERT( m_pPopup == NULL );
  3045. ASSERT_VALID( m_pTBB );
  3046. ASSERT( m_nPopupItemIndex == -1 );
  3047. ASSERT( m_bEnableDropChild == false );
  3048. ASSERT( m_bSelectAnyInChild == false );
  3049. ASSERT(
  3050. m_eICN == __EICN_CANCEL
  3051. || m_eICN == __EICN_SET
  3052. );
  3053. CExtToolControlBar * pToolBar = m_pTBB->GetBar();
  3054. ASSERT_VALID( pToolBar );
  3055. } // else from if( m_pPopup != NULL )
  3056. #endif // _DEBUG
  3057. }
  3058. bool CExtPopupMenuWnd::ITEMCOVERINGNOTIFICATON::Notify()
  3059. {
  3060. if( m_pPopup != NULL )
  3061. {
  3062. ASSERT_VALID( m_pPopup );
  3063. ASSERT( m_pTBB == NULL );
  3064. #ifdef _DEBUG
  3065. INT nPopupItemCount = m_pPopup->ItemGetCount();
  3066. ASSERT( 0 <= m_nPopupItemIndex && m_nPopupItemIndex <= nPopupItemCount );
  3067. #endif // _DEBUG
  3068. ASSERT(
  3069. m_eICN == __EICN_CANCEL
  3070. || m_eICN == __EICN_SET
  3071. || m_eICN == __EICN_DELAY
  3072. );
  3073. HWND hWndTarget = m_pPopup->GetCmdReceiverHWND();
  3074. if( hWndTarget == NULL
  3075. || (! ::IsWindow( hWndTarget ) )
  3076. )
  3077. return false;
  3078. if( m_pPopup->_FindHelpMode()
  3079. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3080. || m_pPopup->_FindCustomizeMode()
  3081. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3082. )
  3083. return false;
  3084. //
  3085. // CWnd * pWndTarget = CWnd::FromHandle( hWndTarget );
  3086. // CString strTrace;
  3087. // strTrace.Format(
  3088. // "   popup menu item covering notification to "%s" class, %d - code, %d - item index, id=%dn",
  3089. // pWndTarget->GetRuntimeClass()->m_lpszClassName,
  3090. // int(m_eICN),
  3091. // m_nPopupItemIndex,
  3092. // m_pPopup->ItemGetInfo(m_nPopupItemIndex).GetCmdID()
  3093. // );
  3094. // TRACE( LPCSTR(strTrace) );
  3095. //
  3096. ::SendMessage(
  3097. hWndTarget,
  3098. CExtPopupMenuWnd::g_nMsgItemCoveringNotification,
  3099. *this,
  3100. 0L
  3101. );
  3102. return true;
  3103. } // if( m_pPopup != NULL )
  3104. else
  3105. {
  3106. ASSERT( m_pPopup == NULL );
  3107. ASSERT_VALID( m_pTBB );
  3108. ASSERT( m_nPopupItemIndex == -1 );
  3109. ASSERT( m_bEnableDropChild == false );
  3110. ASSERT( m_bSelectAnyInChild == false );
  3111. ASSERT(
  3112. m_eICN == __EICN_CANCEL
  3113. || m_eICN == __EICN_SET
  3114. );
  3115. CExtToolControlBar * pToolBar = m_pTBB->GetBar();
  3116. ASSERT_VALID( pToolBar );
  3117. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3118. if( pToolBar->_IsDockSiteCustomizeMode() )
  3119. return false;
  3120. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3121. HWND hWndTarget = NULL;
  3122. if( pToolBar->m_pDockSite != NULL )
  3123. {
  3124. ASSERT_VALID( pToolBar->m_pDockSite );
  3125. hWndTarget = pToolBar->m_pDockSite->GetSafeHwnd();
  3126. if( hWndTarget != NULL
  3127. && pToolBar->m_pDockSite->m_bHelpMode
  3128. )
  3129. return false;
  3130. }
  3131. if( hWndTarget == NULL )
  3132. hWndTarget = pToolBar->GetParent()->GetSafeHwnd();
  3133. if( hWndTarget == NULL
  3134. || (! ::IsWindow( hWndTarget ) )
  3135. )
  3136. return false;
  3137. //
  3138. // CWnd * pWndTarget = CWnd::FromHandle( hWndTarget );
  3139. // CString strTrace;
  3140. // strTrace.Format(
  3141. // "   toolbar item covering notification: "%s" class, %d - code, id=%dn",
  3142. // pWndTarget->GetRuntimeClass()->m_lpszClassName,
  3143. // int(m_eICN),
  3144. // m_pTBB->GetCmdID( true )
  3145. // );
  3146. // TRACE( LPCSTR(strTrace) );
  3147. //
  3148. ::SendMessage(
  3149. hWndTarget,
  3150. CExtPopupMenuWnd::g_nMsgItemCoveringNotification,
  3151. *this,
  3152. 0L
  3153. );
  3154. return true;
  3155. } // else from if( m_pPopup != NULL )
  3156. }
  3157. CExtPopupMenuWnd::ITEMCOVERINGNOTIFICATON::operator WPARAM() const
  3158. {
  3159. return WPARAM( this );
  3160. }
  3161. CExtPopupMenuWnd::ITEMCOVERINGNOTIFICATON *
  3162. CExtPopupMenuWnd::ITEMCOVERINGNOTIFICATON::FromWPARAM( WPARAM wParam )
  3163. {
  3164. ITEMCOVERINGNOTIFICATON * pICN =
  3165. reinterpret_cast < ITEMCOVERINGNOTIFICATON * > ( wParam );
  3166. ASSERT( pICN != NULL );
  3167. return pICN;
  3168. }
  3169. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3170. bool CExtPopupMenuWnd::_KeyTipsEnabledGet() const
  3171. {
  3172. ASSERT_VALID( this );
  3173. if( ( TrackFlagsGet() & TPMX_RIBBON_KEYTIPS ) != 0 )
  3174. return true;
  3175. const CExtPopupMenuWnd * pParent = GetParentMenuWnd();
  3176. if( pParent != NULL )
  3177. return pParent->_KeyTipsEnabledGet();
  3178. return false;
  3179. }
  3180. void CExtPopupMenuWnd::_KeyTipsShow( bool bShow )
  3181. {
  3182. ASSERT_VALID( this );
  3183. if( ! _KeyTipsEnabledGet() )
  3184. return;
  3185. if( _FindCustomizeMode() )
  3186. return;
  3187. if( _FindHelpMode() )
  3188. return;
  3189. HDWP hPassiveModeDWP = NULL;
  3190. if( bShow
  3191. // && g_PaintManager.m_bIsWinVistaOrLater
  3192. // && g_PaintManager.m_DWM.IsCompositionEnabled()
  3193. )
  3194. hPassiveModeDWP = ::BeginDeferWindowPos( 64 );
  3195. visible_items_t v;
  3196. { // block for DC
  3197. CWindowDC dcDesktop( NULL );
  3198. _GetVisibleItems( dcDesktop.GetSafeHdc(), v );
  3199. } // block for DC
  3200. INT vis_iter, vis_count = INT( v.GetSize() );
  3201. for( vis_iter = 0; vis_iter < vis_count; vis_iter++ )
  3202. {
  3203. VisibleItemDefinition_t & vi = v[ vis_iter ];
  3204. ASSERT(
  3205. vi.m_nIndex >= 0
  3206. && vi.m_nIndex < m_items_all.GetSize()
  3207. );
  3208. ASSERT( !vi.m_rcItem.IsRectEmpty() );
  3209. ASSERT( !vi.m_rcItemWithIndents.IsRectEmpty() );
  3210. MENUITEMDATA & mi = ItemGetInfo( vi.m_nIndex );
  3211. ASSERT( mi.IsDisplayed() );
  3212. ASSERT( mi.GetCmdID() == vi.m_nHelperCmdID );
  3213. mi.KeyTipTrackingQuery( bShow, &m_keyTipChain, hPassiveModeDWP );
  3214. } // for( vis_iter = 0; vis_iter < vis_count; vis_iter++ )
  3215. if( ! bShow )
  3216. m_keyTipChain.KeyCodeRemoveAll();
  3217. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  3218. DWORD dwTrackFlags = TrackFlagsGet();
  3219. if( (dwTrackFlags&TPMX_RIBBON_OPTIONS_BUTTON) != 0
  3220. && m_keyTipOptionsButton.KeyCodeGetCount() > 0
  3221. )
  3222. {
  3223. if( bShow )
  3224. {
  3225. if( m_keyTipOptionsButton.KeyCodeGetCount() > 0 )
  3226. {
  3227. if( m_wndKeyTipOptionsButton.GetSafeHwnd() == NULL )
  3228. {
  3229. CExtSafeString strKeyTipText = m_keyTipOptionsButton.GetTipText();
  3230. ASSERT( ! strKeyTipText.IsEmpty() );
  3231. CRect rc;
  3232. _GetItemRect( IDX_RIBBON_FILE_MENU_OPTIONS_BUTTON, rc, false );
  3233. ClientToScreen( &rc );
  3234. CPoint ptGuideLines(
  3235. rc.left + ( rc.Width() / 2 ),
  3236. rc.bottom
  3237. );
  3238. if( m_wndKeyTipOptionsButton.Create(
  3239. this,
  3240. ptGuideLines,
  3241. strKeyTipText,
  3242. true,
  3243. hPassiveModeDWP
  3244. )
  3245. )
  3246. m_wndKeyTipOptionsButton.ShowWindow( SW_SHOWNOACTIVATE );
  3247. }
  3248. else
  3249. m_wndKeyTipOptionsButton.ShowWindow( SW_SHOWNOACTIVATE );
  3250. }
  3251. }
  3252. else
  3253. m_wndKeyTipOptionsButton.Hide();
  3254. }
  3255. if( (dwTrackFlags&TPMX_RIBBON_EXIT_BUTTON) != 0
  3256. && m_keyTipExitButton.KeyCodeGetCount() > 0
  3257. )
  3258. {
  3259. if( bShow )
  3260. {
  3261. if( m_keyTipExitButton.KeyCodeGetCount() > 0 )
  3262. {
  3263. if( m_wndKeyTipExitButton.GetSafeHwnd() == NULL )
  3264. {
  3265. CExtSafeString strKeyTipText = m_keyTipExitButton.GetTipText();
  3266. ASSERT( ! strKeyTipText.IsEmpty() );
  3267. CRect rc;
  3268. _GetItemRect( IDX_RIBBON_FILE_MENU_EXIT_BUTTON, rc, false );
  3269. ClientToScreen( &rc );
  3270. CPoint ptGuideLines(
  3271. rc.left + ( rc.Width() / 2 ),
  3272. rc.bottom
  3273. );
  3274. if( m_wndKeyTipExitButton.Create(
  3275. this,
  3276. ptGuideLines,
  3277. strKeyTipText,
  3278. true,
  3279. hPassiveModeDWP
  3280. )
  3281. )
  3282. m_wndKeyTipExitButton.ShowWindow( SW_SHOWNOACTIVATE );
  3283. }
  3284. else
  3285. m_wndKeyTipExitButton.ShowWindow( SW_SHOWNOACTIVATE );
  3286. }
  3287. }
  3288. else
  3289. m_wndKeyTipExitButton.Hide();
  3290. }
  3291. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  3292. if( hPassiveModeDWP != NULL )
  3293. {
  3294. ::EndDeferWindowPos( hPassiveModeDWP );
  3295. CExtPaintManager::stat_PassPaintMessages();
  3296. }
  3297. if( bShow )
  3298. CExtPopupMenuTipWnd::UpdateDelayedLayeredBehaviorAll();
  3299. }
  3300. bool CExtPopupMenuWnd::_KeyTipsTranslate(
  3301. DWORD dwKeyCode,
  3302. INT * p_nIndex // = NULL
  3303. )
  3304. {
  3305. ASSERT_VALID( this );
  3306. if( p_nIndex != NULL )
  3307. (*p_nIndex) = -1;
  3308. HWND hWndOwn = GetSafeHwnd();
  3309. if( hWndOwn == NULL
  3310. || ( ! ::IsWindow( hWndOwn ) )
  3311. )
  3312. return false;
  3313. if( ! _KeyTipsEnabledGet() )
  3314. return false;
  3315. if( _GetCapture() != this )
  3316. return false;
  3317. if( _FindCustomizeMode() )
  3318. return false;
  3319. if( _FindHelpMode() )
  3320. return false;
  3321. visible_items_t v;
  3322. { // block for DC
  3323. CWindowDC dcDesktop( NULL );
  3324. _GetVisibleItems( dcDesktop.GetSafeHdc(), v );
  3325. } // block for DC
  3326. INT vis_iter, vis_count = INT( v.GetSize() );
  3327. for( vis_iter = 0; vis_iter < vis_count; vis_iter++ )
  3328. {
  3329. VisibleItemDefinition_t & vi = v[ vis_iter ];
  3330. ASSERT(
  3331. vi.m_nIndex >= 0
  3332. && vi.m_nIndex < m_items_all.GetSize()
  3333. );
  3334. ASSERT( !vi.m_rcItem.IsRectEmpty() );
  3335. ASSERT( !vi.m_rcItemWithIndents.IsRectEmpty() );
  3336. MENUITEMDATA & mi = ItemGetInfo( vi.m_nIndex );
  3337. ASSERT( mi.IsDisplayed() );
  3338. ASSERT( mi.GetCmdID() == vi.m_nHelperCmdID );
  3339. INT nIndexOf = ItemGetIndexOf( &mi );
  3340. if( mi.KeyTipTranslate( dwKeyCode, &m_keyTipChain ) )
  3341. {
  3342. if( p_nIndex != NULL )
  3343. (*p_nIndex) = nIndexOf;
  3344. return true;
  3345. }
  3346. } // for( vis_iter = 0; vis_iter < vis_count; vis_iter++ )
  3347. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  3348. INT nKTI, nKeyCodeCountChain = m_keyTipChain.KeyCodeGetCount();
  3349. for( nKTI = 0; nKTI < 2; nKTI++ )
  3350. {
  3351. CExtPopupKeyTipWnd & wndKeyTip = ( nKTI == 0 ) ? m_wndKeyTipOptionsButton : m_wndKeyTipExitButton;
  3352. CExtCustomizeCmdKeyTip & keyTipInfo =  ( nKTI == 0 ) ? m_keyTipOptionsButton : m_keyTipExitButton;
  3353. if(  wndKeyTip.GetSafeHwnd() == NULL
  3354. || ( wndKeyTip.GetStyle() & WS_VISIBLE ) == 0
  3355. )
  3356. continue;
  3357. if( ! keyTipInfo.CompareWidthChain( m_keyTipChain ) )
  3358. continue;
  3359. INT nKeyCodeCountOwn = keyTipInfo.KeyCodeGetCount();
  3360. ASSERT( nKeyCodeCountOwn > nKeyCodeCountChain );
  3361. DWORD dwKeyCodeOwn = keyTipInfo.KeyCodeGetAt( nKeyCodeCountChain );
  3362. if( dwKeyCodeOwn != dwKeyCode )
  3363. continue;
  3364. m_keyTipChain.KeyCodeAdd( dwKeyCode );
  3365. nKeyCodeCountChain++;
  3366. if( nKeyCodeCountOwn > nKeyCodeCountChain )
  3367. continue;
  3368. INT nHitTest = ( nKTI == 0 ) ? IDX_RIBBON_FILE_MENU_OPTIONS_BUTTON : IDX_RIBBON_FILE_MENU_EXIT_BUTTON;
  3369. DWORD dwButtonType = 0;
  3370. switch( nHitTest )
  3371. {
  3372. case IDX_RIBBON_FILE_MENU_OPTIONS_BUTTON:
  3373. dwButtonType = TPMX_RIBBON_OPTIONS_BUTTON;
  3374. break;
  3375. case IDX_RIBBON_FILE_MENU_EXIT_BUTTON:
  3376. dwButtonType = TPMX_RIBBON_EXIT_BUTTON;
  3377. break;
  3378. } // switch( nHitTest )
  3379. RIBBONFILEMENUBUTTONINVOCATION _rfmbi( dwButtonType, this );
  3380. m_nCurIndex = IDX_NOTHING;
  3381. _SetCapture();
  3382. if( nHitTest == IDX_RIBBON_FILE_MENU_EXIT_BUTTON )
  3383. m_dwTrackFlags |= TPMX_NO_FADE_OUT_ANIMATION;
  3384. DestroyWindow();
  3385. _rfmbi.Notify();
  3386. return true;
  3387. } // for( nKTI = 0; nKTI < 2; nKTI++ )
  3388. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  3389. return false;
  3390. }
  3391. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3392. void CExtPopupMenuWnd::_ItemFocusSet(
  3393. int nCurIndex,
  3394. BOOL bEnableDropChild,
  3395. BOOL bRepaint,
  3396. BOOL bSelectAnyInChild, // = TRUE
  3397. BOOL bDelayHiding // = FALSE // delay hiding previous
  3398. )
  3399. {
  3400. ASSERT_VALID( this );
  3401. HWND hWndOwn = m_hWnd;
  3402. ItemFocusTracker_t _ift( this );
  3403. if( m_nCurIndex != nCurIndex )
  3404. {
  3405. _ItemFocusCancel( FALSE, TRUE, bDelayHiding );
  3406. //ASSERT( m_nCurIndex < 0 );
  3407. m_nCurIndex = nCurIndex;
  3408. if( m_nCurIndex < 0 )
  3409. return;
  3410. ITEMCOVERINGNOTIFICATON _icn(
  3411. this,
  3412. NULL,
  3413. ITEMCOVERINGNOTIFICATON::__EICN_SET,
  3414. m_nCurIndex,
  3415. bEnableDropChild ? true : false,
  3416. bSelectAnyInChild ? true : false
  3417. );
  3418. _icn.Notify();
  3419. m_bSuspendTips = _icn.m_bSuspendTips;
  3420. if( ! ::IsWindow( hWndOwn ) )
  3421. return;
  3422. }
  3423. if( (! bDelayHiding) && bEnableDropChild && nCurIndex >= 0 )
  3424. {
  3425. int nCount = ItemGetCount();
  3426. for( int i = 0; i < nCount; i++ )
  3427. {
  3428. if( i == nCurIndex )
  3429. continue;
  3430. MENUITEMDATA & mii_child = ItemGetInfo( i );
  3431. if( i == nCount )
  3432. continue;
  3433. if( ! mii_child.IsPopup() )
  3434. continue;
  3435. CExtPopupMenuWnd * pChildPopup = mii_child.GetPopup();
  3436. ASSERT_VALID( pChildPopup );
  3437. if( pChildPopup->GetSafeHwnd() == NULL )
  3438. continue;
  3439. INT nSaved = pChildPopup->m_nFadeOutAnimationStepCount;
  3440. pChildPopup->m_nFadeOutAnimationStepCount = -1;
  3441. pChildPopup->_OnCancelMode();
  3442. pChildPopup->m_nFadeOutAnimationStepCount = nSaved;
  3443. if( ! ::IsWindow( hWndOwn ) )
  3444. return;
  3445. }
  3446. KillTimer( ID_TIMER_ITEM_FOCUS_DELAY );
  3447. }
  3448. bool bResetMessageString = true;
  3449. bool bWasSet = false;
  3450. MENUITEMDATA & mi = ItemGetInfo(m_nCurIndex);
  3451. if( mi.IsEnabled() && mi.IsDisplayed() )
  3452. {
  3453. mi.SetSelected( true );
  3454. bWasSet = true;
  3455. // adjust scrolling
  3456. CRect rcMB = OnQueryMenuBorderMetrics();
  3457. if( m_bScrollingAvailable )
  3458. {
  3459. bool bResetRectsCache = false;
  3460. int nMetric;
  3461. int nMaxScrollPos = _GetMaxScrollPos();
  3462. CRect rcItem,rcClient,
  3463. rcScrollBtnUp,rcScrollBtnDown;
  3464. _GetItemRect( IDX_SCROLL_TOP, rcScrollBtnUp );
  3465. _GetItemRect( IDX_SCROLL_BOTTOM, rcScrollBtnDown );
  3466. _GetClientRect( rcClient );
  3467. _GetItemRect( m_nCurIndex, rcItem );
  3468. nMetric = rcClient.bottom;
  3469. if( m_nDyScrollOffset != nMaxScrollPos )
  3470. {
  3471. nMetric -= rcScrollBtnDown.Height();
  3472. if( m_bExpandAvailable )
  3473. {
  3474. CRect rcExpand;
  3475. _GetItemRect( IDX_EXPAND, rcExpand );
  3476. nMetric -= rcExpand.Height();
  3477. }
  3478. }
  3479. if( rcItem.bottom >= nMetric )
  3480. {
  3481. m_nDyScrollOffset -=
  3482. rcItem.bottom
  3483. - nMetric
  3484. + rcMB.top + rcMB.bottom
  3485. ;
  3486. bResetRectsCache = true;
  3487. }
  3488. nMetric = rcClient.top;
  3489. if( m_nDyScrollOffset != 0 )
  3490. {
  3491. nMetric += rcScrollBtnUp.Height();
  3492. }
  3493. if( rcItem.top <= nMetric )
  3494. {
  3495. m_nDyScrollOffset +=
  3496. nMetric
  3497. - rcItem.top
  3498. + rcMB.top + rcMB.bottom
  3499. ;
  3500. bResetRectsCache = true;
  3501. }
  3502. if( m_nDyScrollOffset > 0 )
  3503. {
  3504. m_nDyScrollOffset = 0;
  3505. bResetRectsCache = true;
  3506. }
  3507. else
  3508. {
  3509. if( m_nDyScrollOffset < nMaxScrollPos )
  3510. {
  3511. m_nDyScrollOffset = nMaxScrollPos;
  3512. bResetRectsCache = true;
  3513. }
  3514. }
  3515. if( bResetRectsCache )
  3516. _CachedRectsEmpty();
  3517. } // if( m_bScrollingAvailable )
  3518. } // if( mi.IsEnabled() && mi.IsDisplayed() )
  3519. bool bSetStatusMsg = bWasSet;
  3520. if( (! bSetStatusMsg) && (! mi.IsEnabled() ) && mi.IsDisplayed() && g_bShowStatusTipsOverDisabledItems )
  3521. bSetStatusMsg = true;
  3522. // update status bar message
  3523. CWnd * pWndOwner = GetOwner();
  3524. if( pWndOwner != NULL )
  3525. {
  3526. ASSERT_VALID( pWndOwner );
  3527. if( bSetStatusMsg && (!mi.IsPopup()) && (!mi.IsSeparator()) && (!mi.IsNoCmdUI()) )
  3528. {
  3529. UINT nCmdID = mi.GetCmdID();
  3530. if( CExtCmdManager::IsCommand( nCmdID ) )
  3531. {
  3532. UINT nCmdIDToSend = nCmdID;
  3533. bool bAbandonSend = false;
  3534. if( CExtCmdManager::IsSystemCommand( nCmdID ) )
  3535. {
  3536. switch( nCmdID )
  3537. {
  3538. case SC_CLOSE:
  3539. nCmdIDToSend = AFX_IDS_SCCLOSE;
  3540. break;
  3541. case SC_SIZE:
  3542. nCmdIDToSend = AFX_IDS_SCSIZE;
  3543. break;
  3544. case SC_MOVE:
  3545. nCmdIDToSend = AFX_IDS_SCMOVE;
  3546. break;
  3547. case SC_MINIMIZE:
  3548. nCmdIDToSend = AFX_IDS_SCMINIMIZE;
  3549. break;
  3550. case SC_MAXIMIZE:
  3551. nCmdIDToSend = AFX_IDS_SCMAXIMIZE;
  3552. break;
  3553. case SC_RESTORE:
  3554. nCmdIDToSend = AFX_IDS_SCRESTORE;
  3555. break;
  3556. case SC_NEXTWINDOW:
  3557. nCmdIDToSend = AFX_IDS_SCNEXTWINDOW;
  3558. break;
  3559. case SC_PREVWINDOW:
  3560. nCmdIDToSend = AFX_IDS_SCPREVWINDOW;
  3561. break;
  3562. case SC_TASKLIST:
  3563. nCmdIDToSend = AFX_IDS_SCTASKLIST;
  3564. break;
  3565. default:
  3566. bAbandonSend = true;
  3567. break;
  3568. } // switch( nCmdID )
  3569. } // if( CExtCmdManager::IsSystemCommand( nCmdID ) )
  3570. if( !bAbandonSend )
  3571. {
  3572. CExtControlBar::stat_SetMessageString(
  3573. pWndOwner,
  3574. nCmdIDToSend
  3575. );
  3576. bResetMessageString = false;
  3577. } // if( !bAbandonSend )
  3578. } // if( CExtCmdManager::IsCommand( nCmdID ) )
  3579. } // if( bSetStatusMsg && (!mi.IsPopup()) && (!mi.IsSeparator()) && (!mi.IsNoCmdUI()) )
  3580. if( bResetMessageString )
  3581. CExtControlBar::stat_SetMessageString( pWndOwner );
  3582. } // if( bWasSet )
  3583. if( bRepaint && ::IsWindowVisible( GetSafeHwnd() ) )
  3584. {
  3585. CClientDC dc( this );
  3586. _DoPaint( dc );
  3587. } // if( bRepaint && ::IsWindowVisible( GetSafeHwnd() ) )
  3588. if( mi.IsPopup() )
  3589. {
  3590. if( mi.IsInplaceEdit() )
  3591. {
  3592. HWND hWndInplaceEdit = mi.GetInplaceEditPtr()->GetSafeHwnd();
  3593. if( hWndInplaceEdit != NULL
  3594. && ::IsWindow( hWndInplaceEdit )
  3595. && (::__EXT_MFC_GetWindowLong(hWndInplaceEdit,GWL_STYLE)&WS_VISIBLE) != 0
  3596. )
  3597. bEnableDropChild = false;
  3598. } // if( mi.IsInplaceEdit() )
  3599. } // if( mi.IsPopup() )
  3600. else
  3601. bEnableDropChild = false;
  3602. bool bDelayExpanding = true;
  3603. if( bWasSet
  3604. && bEnableDropChild
  3605. && mi.GetPopup()->_CanStartLevelTracking()
  3606. )
  3607. { // if new popup tracking
  3608. if( !_FindCustomizeMode() )
  3609. _ReleaseCapture();
  3610. CRect rectItem;
  3611. _GetItemRect(
  3612. m_nCurIndex,
  3613. rectItem
  3614. );
  3615. rectItem.left -= m_nLeftAreaWidth;
  3616. CPoint point;
  3617. point.x = rectItem.right;
  3618. point.y = rectItem.top,
  3619. ClientToScreen(&point);
  3620. ClientToScreen( &rectItem );
  3621. ASSERT( mi.GetPopup()->m_pWndParentMenu == this );
  3622. bool bDisplayedSuccessfully = false;
  3623. if( mi.GetPopup()->GetSafeHwnd() == NULL )
  3624. {
  3625. DWORD dwChildTrackFlags =
  3626. mi.IsChildCombine() ? TPMX_COMBINE_DEFAULT : 0;
  3627. dwChildTrackFlags |=
  3628. m_dwTrackFlags &
  3629. ( TPMX_NO_SHADOWS
  3630. | TPMX_NO_DYNAMIC_SHADOWS
  3631. | TPMX_NO_CMD_UI
  3632. | TPMX_NO_WM_COMMAND
  3633. | TPMX_RIBBON_MODE
  3634. );
  3635. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3636. _KeyTipsShow( false );
  3637. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3638. bDisplayedSuccessfully = 
  3639. mi.GetPopup()->
  3640. _TrackPopupMenu(
  3641. dwChildTrackFlags,
  3642. point.x,point.y,
  3643. &rectItem,
  3644. (LPVOID)(__EXT_MFC_INT_PTR)m_nCurIndex,
  3645. stat_paint_combined_menu_toolbtn
  3646. ) ? true : false;
  3647. } // if( mi.GetPopup()->GetSafeHwnd() == NULL )
  3648. else
  3649. {
  3650. bDisplayedSuccessfully = true;
  3651. if( !mi.GetPopup()->IsWindowVisible() )
  3652. {
  3653. mi.GetPopup()->SetWindowPos(
  3654. &CWnd::wndTopMost, 0, 0, 0, 0,
  3655. SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE
  3656. |SWP_NOREDRAW
  3657. |SWP_SHOWWINDOW
  3658. );
  3659. CClientDC dc( mi.GetPopup() );
  3660. mi.GetPopup()->_DoPaint( dc );
  3661. } // if( !mi.GetPopup()->IsWindowVisible() )
  3662. } // else from
  3663. if( bDisplayedSuccessfully && bSelectAnyInChild )
  3664. { // if track-popup succeeded and we need to select any child item
  3665. int nCountOfPopupItems = (int)
  3666. mi.GetPopup()->m_items_all.GetSize();
  3667. if( nCountOfPopupItems > 0 )
  3668. {
  3669. int nIndex = mi.GetPopup()->_GetNextItem(__NI_ANY);
  3670. if( nIndex >= 0 )
  3671. {
  3672. mi.GetPopup()->_ItemFocusSet(
  3673. nIndex,
  3674. FALSE,
  3675. ( GetSite().GetAnimated() == NULL ) ?
  3676. TRUE : FALSE
  3677. );
  3678. if( ! ::IsWindow( hWndOwn ) )
  3679. return;
  3680. }
  3681. }
  3682. } // if track-popup succeeded and we need to select any child item
  3683. if( bDisplayedSuccessfully /*&& mi.IsInplaceEdit()*/ )
  3684. {
  3685. CClientDC dc( this );
  3686. _DoPaint( dc );
  3687. bDelayExpanding = false;
  3688. }
  3689. } // if new popup tracking
  3690. _ift.FocusChangingUnRegister();
  3691. KillTimer( ID_TIMER_AUTO_EXPAND );
  3692. if( bDelayExpanding )
  3693. {
  3694. if( m_bTopLevel && (! m_bExpandWasPressed ) && m_bExpandAvailable && g_nAutoExpandTime > 0 )
  3695. SetTimer( ID_TIMER_AUTO_EXPAND, g_nAutoExpandTime, NULL );
  3696. }
  3697. }
  3698. bool CExtPopupMenuWnd::_CoolTipIsVisible()
  3699. {
  3700. ASSERT_VALID( this );
  3701. if( _FindCustomizeMode() )
  3702. return false;
  3703. if( !(::IsWindow(GetSafeHwnd())) )
  3704. return false;
  3705. if( _IsRibbonMode() )
  3706. return false;
  3707. if( CExtPopupMenuSite::g_DefPopupMenuSite.GetCapture() != this )
  3708. return false;
  3709. CExtPopupMenuTipWnd & _tipWnd = GetTip();
  3710. HWND hWndToolTip = _tipWnd.GetSafeHwnd();
  3711. if( hWndToolTip != NULL
  3712. && ::IsWindow( hWndToolTip )
  3713. && ::IsWindowVisible( hWndToolTip )
  3714. )
  3715. return true;
  3716. return false;
  3717. }
  3718. void CExtPopupMenuWnd::_CoolTipHide(
  3719. bool bAdvOperation // = true
  3720. )
  3721. {
  3722. ASSERT_VALID( this );
  3723. if( !(::IsWindow(GetSafeHwnd())) )
  3724. return;
  3725. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  3726. CExtPopupScreenTipWnd & _wndScreenTip = GetScreenTip();
  3727. _wndScreenTip.Hide();
  3728. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  3729. CExtPopupMenuTipWnd & _tipWnd = GetTip();
  3730. HWND hWndToolTip = _tipWnd.GetSafeHwnd();
  3731. if( hWndToolTip == NULL
  3732. || (! ::IsWindow( hWndToolTip ) )
  3733. )