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

界面编程

开发平台:

Visual C++

  1. CDC & dc,
  2. const RECT & rcGroupBk,
  3. const CExtRibbonButtonGroup * pGroupTBB,
  4. LPARAM lParam // = 0L
  5. )
  6. {
  7. ASSERT_VALID( this );
  8. ASSERT( dc.GetSafeHdc() != NULL );
  9. ASSERT_VALID( pGroupTBB );
  10. if( ::IsRectEmpty( &rcGroupBk ) )
  11. return true;
  12. if( ! dc.RectVisible( &rcGroupBk ) )
  13. return true;
  14. if( IsHighContrast() )
  15. return 
  16. CExtPaintManagerXP::Ribbon_PaintQuickAccessGroupButton(
  17. dc,
  18. rcGroupBk,
  19. pGroupTBB,
  20. lParam
  21. );
  22. bool bEnabled = pGroupTBB->IsEnabled();
  23. bool bHover = ( bEnabled && pGroupTBB->IsHover() ) ? true : false;
  24. if( bHover && pGroupTBB->GetBar()->GetMenuTrackingButton() >= 0 )
  25. bHover = false;
  26. bool bPressed = false;
  27. if( bEnabled )
  28. bPressed = pGroupTBB->IsPressed();
  29. bool bSelTrackingMode = false;
  30. const CExtToolControlBar * pToolBar = pGroupTBB->GetBar();
  31. if( pToolBar != NULL )
  32. {
  33. CExtMenuControlBar * pMenuBar = DYNAMIC_DOWNCAST( CExtMenuControlBar, pToolBar );
  34. if( pMenuBar != NULL
  35. && pMenuBar->IsMenuBarTracking()
  36. )
  37. {
  38. int nFlatTrackingIndex = pMenuBar->_FlatTrackingIndexGet();
  39. if( nFlatTrackingIndex >= 0 )
  40. {
  41. int nIndexOfTBB = pMenuBar->_GetIndexOf( (CExtBarButton*)pGroupTBB );
  42. if( nFlatTrackingIndex == nIndexOfTBB )
  43. bSelTrackingMode = true;
  44. }
  45. }
  46. }
  47. CExtBitmap & _bmp1 = m_bmpRibbonGroupBkQATB[ bSelTrackingMode ? 3 : ( bPressed ? 2 : ( bHover ? 1 : 0 ) ) ];
  48. CExtBitmap & _bmp2 = m_bmpRibbonGroupBkCollapsed[ bSelTrackingMode ? 3 : ( bPressed ? 2 : ( bHover ? 1 : 0 ) ) ];
  49. CExtBitmap & _bmp = _bmp1.IsEmpty() ? _bmp2 : _bmp1;
  50. if( _bmp.IsEmpty() )
  51. return false;
  52. CRect rcPadding(3,3,3,3);
  53. //CExtMemoryDC dcMem( &dc, &rcGroupBk, CExtMemoryDC::MDCOPT_FORCE_DIB|CExtMemoryDC::MDCOPT_TO_MEMORY|CExtMemoryDC::MDCOPT_FILL_BITS|CExtMemoryDC::MDCOPT_RTL_COMPATIBILITY );
  54. _bmp.AlphaBlendSkinParts(
  55. dc.m_hDC, // dcMem.m_hDC
  56. rcGroupBk,
  57. rcPadding, //m_rcRibbonGroupPaddingBkCollapsed,
  58. CExtBitmap::__EDM_STRETCH,
  59. true,
  60. true
  61. );
  62. // dcMem.__Flush();
  63. //CExtCmdIcon * pCmdIcon = Ribbon_GetGroupCollapsedIcon( pGroupTBB, lParam );
  64. //CExtCmdIcon * pCmdIcon = ((CExtBarButton*)pGroupTBB)->GetIconPtr();
  65. CExtRibbonNode * pRibbonNode = (CExtRibbonNode *)pGroupTBB->Ribbon_GetNode();
  66. if( pRibbonNode == NULL )
  67. return true;
  68. ASSERT_VALID( pRibbonNode );
  69. if( pRibbonNode->m_iconSmall.IsEmpty() )
  70. {
  71. if( pRibbonNode->m_iconBig.IsEmpty() )
  72. return true;
  73. CSize _size = Ribbon_GetIconSize( pGroupTBB, __EXT_RIBBON_ILV_SIMPLE_SMALL );
  74. pRibbonNode->m_iconSmall = pRibbonNode->m_iconBig;
  75. pRibbonNode->m_iconSmall.Scale( _size );
  76. }
  77. CExtCmdIcon *  pCmdIcon = & pRibbonNode->m_iconSmall;
  78. if( pCmdIcon == NULL || pCmdIcon->IsEmpty() )
  79. return true;
  80. CSize _sizeIcon = pCmdIcon->GetSize();
  81. pCmdIcon->Paint(
  82. this,
  83. dc,
  84. rcGroupBk.left + ( rcGroupBk.right - rcGroupBk.left - _sizeIcon.cx ) / 2,
  85. rcGroupBk.top + ( rcGroupBk.bottom - rcGroupBk.top - _sizeIcon.cy ) / 2,
  86. -1,
  87. -1
  88. );
  89. return true;
  90. }
  91. void CExtPaintManager::Ribbon_PaintGroupBk(
  92. CDC & dc,
  93. const RECT & rcGroupBk,
  94. const CExtRibbonButtonGroup * pGroupTBB,
  95. LPARAM lParam // = 0L
  96. )
  97. {
  98. ASSERT_VALID( this );
  99. ASSERT( dc.GetSafeHdc() != NULL );
  100. ASSERT_VALID( pGroupTBB );
  101. if( pGroupTBB->ParentButtonGet() != NULL )
  102. return;
  103. if( ::IsRectEmpty( &rcGroupBk ) )
  104. return;
  105. if( ! dc.RectVisible( &rcGroupBk ) )
  106. return;
  107. CRect _rcGroupBk = rcGroupBk;
  108. _rcGroupBk.InflateRect( 0, 0, 1, 1 );
  109. CExtSafeString strCaptionText = pGroupTBB->GetText();
  110. INT nCaptionTextLength = strCaptionText.GetLength();
  111. bool bEnabled = pGroupTBB->IsEnabled();
  112. bool bHover = ( bEnabled && pGroupTBB->IsHover() ) ? true : false;
  113. if( bHover && pGroupTBB->GetBar()->GetMenuTrackingButton() >= 0 )
  114. bHover = false;
  115. bool bCollapsed = pGroupTBB->TopCollapsedStateGet();
  116. if( bCollapsed )
  117. {
  118. bool bPressed = false;
  119. if( bEnabled )
  120. bPressed = pGroupTBB->IsPressed();
  121. PAINTPUSHBUTTONDATA _ppbd;
  122. _ppbd.m_rcClient = _rcGroupBk;
  123. _ppbd.m_bFlat = false;
  124. _ppbd.m_bEnabled = bEnabled;
  125. _ppbd.m_bHover = bHover;
  126. _ppbd.m_bPushed = bPressed;
  127. _ppbd.m_bHorz = true;
  128. PaintPushButton( dc, _ppbd );
  129. CExtCmdIcon * pCmdIcon = Ribbon_GetGroupCollapsedIcon( pGroupTBB, lParam );
  130. //CExtCmdIcon * pCmdIcon = ((CExtBarButton*)pGroupTBB)->GetIconPtr();
  131. CRect rcIconArea = _rcGroupBk, rcTextArea = _rcGroupBk;
  132. if( pCmdIcon != NULL && (! pCmdIcon->IsEmpty() ) )
  133. {
  134. CSize _sizeIcon = pCmdIcon->GetSize();
  135. rcIconArea.left += ( rcIconArea.Width() - _sizeIcon.cx ) / 2;
  136. rcIconArea.top += ( rcIconArea.Height() - _sizeIcon.cy ) / 2 - 6;
  137. rcIconArea.right = rcIconArea.left + _sizeIcon.cx;
  138. rcIconArea.bottom = rcIconArea.top + _sizeIcon.cy;
  139. rcTextArea.top = rcIconArea.bottom + 7;
  140. } // if( pCmdIcon != NULL && (! pCmdIcon->IsEmpty() ) )
  141. else
  142. rcTextArea.top += 16;
  143. rcIconArea.OffsetRect( 0, -10 );
  144. if( pCmdIcon != NULL && (! pCmdIcon->IsEmpty() ) )
  145. {
  146. pCmdIcon->Paint(
  147. this,
  148. dc,
  149. rcIconArea.left,
  150. rcIconArea.top,
  151. -1,
  152. -1
  153. );
  154. } // if( pCmdIcon != NULL && (! pCmdIcon->IsEmpty() ) )
  155. if( nCaptionTextLength > 0 )
  156. {
  157. CExtRibbonPage * pRibbonPage =
  158. const_cast < CExtRibbonPage * >
  159. ( pGroupTBB->GetRibbonPage() );
  160. ASSERT_VALID( pRibbonPage );
  161. ASSERT( pRibbonPage->GetSafeHwnd() != NULL );
  162. CFont * pFont = pRibbonPage->OnGetToolbarFont( false, false );
  163. ASSERT( pFont->GetSafeHandle() != NULL );
  164. //CFont * pOldFont = dc.SelectObject( pFont );
  165. CFont * pOldFont = dc.SelectObject( &m_FontRibbonGroupCaption );
  166. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  167. COLORREF clrOldTextColor = dc.SetTextColor( GetColor( COLOR_BTNTEXT ) );
  168. CRect rcCaption = rcTextArea;
  169. rcCaption.OffsetRect( 0, -5 );
  170. // dc.DrawText(
  171. // LPCTSTR( strCaptionText ),
  172. // nCaptionTextLength,
  173. // &rcCaption,
  174. // DT_CENTER|DT_TOP //m_nRibbonGroupCaptionTextDF
  175. // );
  176. Ribbon_PaintText(
  177. dc,
  178. LPCTSTR( strCaptionText ),
  179. rcCaption,
  180. DT_CENTER|DT_TOP,
  181. true,
  182. NULL,
  183. (CObject*)pGroupTBB,
  184. lParam
  185. );
  186. dc.SetTextColor( clrOldTextColor );
  187. dc.SetBkMode( nOldBkMode );
  188. dc.SelectObject( pOldFont );
  189. } // if( nCaptionTextLength > 0 )
  190. } // if( bCollapsed )
  191. else
  192. {
  193. const CExtRibbonPage * pRibbonPage = pGroupTBB->GetRibbonPage();
  194. ASSERT_VALID( pRibbonPage );
  195. CWnd * pWndParent = pRibbonPage->GetParent();
  196. bool bDrawCaption = true, bPopupMode =
  197. ( pWndParent != NULL
  198. && pWndParent->IsKindOf( RUNTIME_CLASS( CExtRibbonPopupMenuWnd ) )
  199. && (! ((CExtRibbonPopupMenuWnd*)pWndParent)->m_wndRibbonPage.m_bHelperAutoHideMode )
  200. ) ? true : false;
  201. INT nCaptionHeight = 0;
  202. if( bPopupMode && (! Ribbon_IsPopupGroupWithCaption( (CObject*) pRibbonPage ) ) )
  203. {
  204. bDrawCaption = false;
  205. strCaptionText.Empty();
  206. nCaptionTextLength = 0;
  207. }
  208. else
  209. {
  210. strCaptionText.Replace( _T("r"), _T(" ") );
  211. strCaptionText.Replace( _T("n"), _T(" ") );
  212. strCaptionText.Replace( _T("t"), _T(" ") );
  213. strCaptionText.Replace( _T("  "), _T(" ") );
  214. strCaptionText.TrimLeft( _T(" ") );
  215. strCaptionText.TrimRight( _T(" ") );
  216. nCaptionHeight = Ribbon_GroupCaptionGetHeight( pGroupTBB, lParam );
  217. ASSERT( nCaptionHeight >= 0 );
  218. }
  219. COLORREF clrBorder = RGB(0,0,0);
  220. if( bEnabled )
  221. {
  222. if( bHover )
  223. {
  224. clrBorder = GetColor( COLOR_3DDKSHADOW );
  225. dc.FillRect( &_rcGroupBk, &m_brushLighterDefault );
  226. } // if( bHover )
  227. else
  228. clrBorder = GetColor( COLOR_3DSHADOW );
  229. } // if( bEnabled )
  230. else
  231. clrBorder = GetColor( COLOR_3DSHADOW );
  232. if( nCaptionHeight > 0 && nCaptionTextLength > 0 )
  233. {
  234. CRect rcCaption = _rcGroupBk;
  235. bool bTopCaption = Ribbon_GroupCaptionIsAtTop( pGroupTBB );
  236. if( bTopCaption )
  237. rcCaption.bottom = rcCaption.top + nCaptionHeight;
  238. else
  239. rcCaption.top = rcCaption.bottom - nCaptionHeight;
  240. dc.FillSolidRect( &rcCaption, GetColor( COLOR_3DSHADOW ) );
  241. dc.Draw3dRect( &rcCaption, clrBorder, clrBorder );
  242. CExtRibbonPage * pRibbonPage =
  243. const_cast < CExtRibbonPage * >
  244. ( pGroupTBB->GetRibbonPage() );
  245. ASSERT_VALID( pRibbonPage );
  246. ASSERT( pRibbonPage->GetSafeHwnd() != NULL );
  247. CFont * pFont = pRibbonPage->OnGetToolbarFont( false, false );
  248. ASSERT( pFont->GetSafeHandle() != NULL );
  249. CRect rcCaptionTextAlignmentDLB =
  250. pGroupTBB->GetCaptionTextAlignmentRect();
  251. if( ! rcCaptionTextAlignmentDLB.IsRectEmpty() )
  252. {
  253. rcCaption.left =
  254. max(
  255. rcCaption.left,
  256. rcCaptionTextAlignmentDLB.left
  257. );
  258. rcCaption.right =
  259. min(
  260. rcCaption.right,
  261. rcCaptionTextAlignmentDLB.right
  262. );
  263. } // if( ! rcCaptionTextAlignmentDLB.IsRectEmpty() )
  264. //CFont * pOldFont = dc.SelectObject( pFont );
  265. CFont * pOldFont = dc.SelectObject( &m_FontRibbonGroupCaption );
  266. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  267. COLORREF clrOldTextColor = dc.SetTextColor( GetColor( COLOR_3DDKSHADOW ) );
  268. rcCaption.OffsetRect( 1, 1 );
  269. UINT nRibbonGroupCaptionTextShadowDF = DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_END_ELLIPSIS;
  270. dc.DrawText(
  271. LPCTSTR( strCaptionText ),
  272. nCaptionTextLength,
  273. &rcCaption,
  274. nRibbonGroupCaptionTextShadowDF
  275. );
  276. rcCaption.OffsetRect( -1, -1 );
  277. dc.SetTextColor( GetColor( COLOR_3DHIGHLIGHT ) );
  278. dc.DrawText(
  279. LPCTSTR( strCaptionText ),
  280. nCaptionTextLength,
  281. &rcCaption,
  282. nRibbonGroupCaptionTextShadowDF
  283. );
  284. dc.SetTextColor( clrOldTextColor );
  285. dc.SetBkMode( nOldBkMode );
  286. dc.SelectObject( pOldFont );
  287. } // if( nCaptionHeight > 0 && nCaptionTextLength > 0 )
  288. // dc.Draw3dRect( &_rcGroupBk, clrBorder, clrBorder );
  289. } // else from if( bCollapsed )
  290. }
  291. void CExtPaintManagerOffice2007_Impl::Ribbon_PaintGroupBk(
  292. CDC & dc,
  293. const RECT & rcGroupBk,
  294. const CExtRibbonButtonGroup * pGroupTBB,
  295. LPARAM lParam // = 0L
  296. )
  297. {
  298. ASSERT_VALID( this );
  299. ASSERT( dc.GetSafeHdc() != NULL );
  300. ASSERT_VALID( pGroupTBB );
  301. if( pGroupTBB->ParentButtonGet() != NULL )
  302. return;
  303. if( ::IsRectEmpty( &rcGroupBk ) )
  304. return;
  305. if( ! dc.RectVisible( &rcGroupBk ) )
  306. return;
  307. if( IsHighContrast() )
  308. {
  309. CExtPaintManagerXP::Ribbon_PaintGroupBk(
  310. dc,
  311. rcGroupBk,
  312. pGroupTBB,
  313. lParam
  314. );
  315. return;
  316. }
  317. CExtSafeString strCaptionText = pGroupTBB->GetText();
  318. INT nCaptionTextLength = strCaptionText.GetLength();
  319. bool bEnabled = pGroupTBB->IsEnabled();
  320. bool bHover = ( bEnabled && pGroupTBB->IsHover() ) ? true : false;
  321. if( bHover && pGroupTBB->GetBar()->GetMenuTrackingButton() >= 0 )
  322. bHover = false;
  323. bool bCollapsed = pGroupTBB->TopCollapsedStateGet();
  324. if( bCollapsed )
  325. {
  326. bool bPressed = false;
  327. if( bEnabled )
  328. bPressed = pGroupTBB->IsPressed();
  329. bool bSelTrackingMode = false;
  330. const CExtToolControlBar * pToolBar = pGroupTBB->GetBar();
  331. if( pToolBar != NULL )
  332. {
  333. CExtMenuControlBar * pMenuBar = DYNAMIC_DOWNCAST( CExtMenuControlBar, pToolBar );
  334. if( pMenuBar != NULL
  335. && pMenuBar->IsMenuBarTracking()
  336. )
  337. {
  338. int nFlatTrackingIndex = pMenuBar->_FlatTrackingIndexGet();
  339. if( nFlatTrackingIndex >= 0 )
  340. {
  341. int nIndexOfTBB = pMenuBar->_GetIndexOf( (CExtBarButton*)pGroupTBB );
  342. if( nFlatTrackingIndex == nIndexOfTBB )
  343. bSelTrackingMode = true;
  344. }
  345. }
  346. }
  347. CExtBitmap & _bmp = m_bmpRibbonGroupBkCollapsed[ bSelTrackingMode ? 3 : ( bPressed ? 2 : ( bHover ? 1 : 0 ) ) ];
  348. _bmp.AlphaBlendSkinParts(
  349. dc.m_hDC,
  350. rcGroupBk,
  351. m_rcRibbonGroupPaddingBkCollapsed,
  352. CExtBitmap::__EDM_STRETCH
  353. );
  354. CExtCmdIcon * pCmdIcon = Ribbon_GetGroupCollapsedIcon( pGroupTBB, lParam );
  355. //CExtCmdIcon * pCmdIcon = ((CExtBarButton*)pGroupTBB)->GetIconPtr();
  356. CRect rcIconArea = rcGroupBk, rcTextArea = rcGroupBk;
  357. //CExtBitmap & _bmpIconBk = m_bmpRibbonIconBkCollapsed[ bPressed ? 2 : ( bHover ? 1 : 0 ) ];
  358. CExtBitmap & _bmpIconBk = m_bmpRibbonIconBkCF;
  359. if( ! _bmpIconBk.IsEmpty() )
  360. {
  361. CSize _sizeIconBk = _bmpIconBk.GetSize();
  362. rcIconArea.left = rcGroupBk.left + ( rcGroupBk.right - rcGroupBk.left - _sizeIconBk.cx ) / 2;
  363. rcIconArea.top = rcGroupBk.top + m_nRibbonGroupIconBkVertOffset;
  364. rcIconArea.right = rcIconArea.left + _sizeIconBk.cx;
  365. rcIconArea.bottom = rcIconArea.top + _sizeIconBk.cy;
  366. _bmpIconBk.AlphaBlend(
  367. dc.m_hDC,
  368. rcIconArea.left,
  369. rcIconArea.top,
  370. _sizeIconBk.cx,
  371. _sizeIconBk.cy
  372. );
  373. if( pCmdIcon != NULL && (! pCmdIcon->IsEmpty() ) )
  374. {
  375. CSize _sizeIcon = pCmdIcon->GetSize();
  376. rcIconArea.left += ( rcIconArea.Width() - _sizeIcon.cx ) / 2;
  377. rcIconArea.top += ( rcIconArea.Height() - _sizeIcon.cy - 8 ) / 2;
  378. rcTextArea.top = rcIconArea.bottom + 2;
  379. rcIconArea.right = rcIconArea.left + _sizeIcon.cx;
  380. rcIconArea.bottom = rcIconArea.top + _sizeIcon.cy;
  381. } // if( pCmdIcon != NULL && (! pCmdIcon->IsEmpty() ) )
  382. else
  383. rcTextArea.top += 16;
  384. } // if( ! _bmpIconBk.IsEmpty() )
  385. else
  386. {
  387. if( pCmdIcon != NULL && (! pCmdIcon->IsEmpty() ) )
  388. {
  389. CSize _sizeIcon = pCmdIcon->GetSize();
  390. rcIconArea.left += ( rcIconArea.Width() - _sizeIcon.cx ) / 2;
  391. rcIconArea.top += ( rcIconArea.Height() - _sizeIcon.cy ) / 2 - 6;
  392. rcIconArea.right = rcIconArea.left + _sizeIcon.cx;
  393. rcIconArea.bottom = rcIconArea.top + _sizeIcon.cy;
  394. rcTextArea.top = rcIconArea.bottom + 7;
  395. } // if( pCmdIcon != NULL && (! pCmdIcon->IsEmpty() ) )
  396. else
  397. rcTextArea.top += 16;
  398. } // else from if( ! _bmpIconBk.IsEmpty() )
  399. if( pCmdIcon != NULL && (! pCmdIcon->IsEmpty() ) )
  400. {
  401. pCmdIcon->Paint(
  402. this,
  403. dc,
  404. rcIconArea.left,
  405. rcIconArea.top,
  406. -1,
  407. -1
  408. );
  409. } // if( pCmdIcon != NULL && (! pCmdIcon->IsEmpty() ) )
  410. if( nCaptionTextLength > 0 )
  411. {
  412. CExtRibbonPage * pRibbonPage =
  413. const_cast < CExtRibbonPage * >
  414. ( pGroupTBB->GetRibbonPage() );
  415. ASSERT_VALID( pRibbonPage );
  416. ASSERT( pRibbonPage->GetSafeHwnd() != NULL );
  417. CFont * pFont = pRibbonPage->OnGetToolbarFont( false, false );
  418. ASSERT( pFont->GetSafeHandle() != NULL );
  419. //CFont * pOldFont = dc.SelectObject( pFont );
  420. CFont * pOldFont = dc.SelectObject( &m_FontRibbonGroupCaption );
  421. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  422. COLORREF clrOldTextColor = dc.SetTextColor( m_clrRibbonGroupCaptionTextCollapsed );
  423. CRect rcCaption = rcTextArea;
  424. if( IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R1 ) ) )
  425. rcCaption.OffsetRect( 0, -5 );
  426. else if( g_PaintManager.m_nLPY > 96 )
  427. rcCaption.top += 10;
  428. // dc.DrawText(
  429. // LPCTSTR( strCaptionText ),
  430. // nCaptionTextLength,
  431. // &rcCaption,
  432. // DT_CENTER|DT_TOP //m_nRibbonGroupCaptionTextDF
  433. // );
  434. Ribbon_PaintText(
  435. dc,
  436. LPCTSTR( strCaptionText ),
  437. rcCaption,
  438. DT_CENTER|DT_TOP,
  439. true,
  440. &m_bmpRibbonDDA,
  441. (CObject*)pGroupTBB,
  442. lParam
  443. );
  444. dc.SetTextColor( clrOldTextColor );
  445. dc.SetBkMode( nOldBkMode );
  446. dc.SelectObject( pOldFont );
  447. } // if( nCaptionTextLength > 0 )
  448. } // if( bCollapsed )
  449. else
  450. {
  451. const CExtRibbonPage * pRibbonPage = pGroupTBB->GetRibbonPage();
  452. ASSERT_VALID( pRibbonPage );
  453. CWnd * pWndParent = pRibbonPage->GetParent();
  454. bool bDrawCaption = true, bPopupMode =
  455. ( pWndParent != NULL
  456. && pWndParent->IsKindOf( RUNTIME_CLASS( CExtRibbonPopupMenuWnd ) )
  457. && (! ((CExtRibbonPopupMenuWnd*)pWndParent)->m_wndRibbonPage.m_bHelperAutoHideMode )
  458. ) ? true : false;
  459. INT nCaptionHeight = 0;
  460. if( bPopupMode && (! Ribbon_IsPopupGroupWithCaption( (CObject*) pRibbonPage ) ) )
  461. {
  462. bDrawCaption = false;
  463. strCaptionText.Empty();
  464. nCaptionTextLength = 0;
  465. }
  466. else
  467. {
  468. strCaptionText.Replace( _T("r"), _T(" ") );
  469. strCaptionText.Replace( _T("n"), _T(" ") );
  470. strCaptionText.Replace( _T("t"), _T(" ") );
  471. strCaptionText.Replace( _T("  "), _T(" ") );
  472. strCaptionText.TrimLeft( _T(" ") );
  473. strCaptionText.TrimRight( _T(" ") );
  474. nCaptionHeight = Ribbon_GroupCaptionGetHeight( pGroupTBB, lParam );
  475. ASSERT( nCaptionHeight >= 0 );
  476. }
  477. CExtBitmap & _bmp = m_bmpRibbonGroupBkExpanded[ bHover ? 1 : 0 ];
  478. if( nCaptionHeight == 0 )
  479. {
  480. CSize _size = _bmp.GetSize();
  481. CRect rcSrc( 0, 0, _size.cx, _size.cy );
  482. if( ! bDrawCaption )
  483. {
  484. bool bTopCaption = Ribbon_GroupCaptionIsAtTop( pGroupTBB );
  485. if( bTopCaption )
  486. rcSrc.top += m_nRibbonCaptionPartHeight;
  487. else
  488. rcSrc.bottom += m_nRibbonCaptionPartHeight;
  489. rcSrc.DeflateRect( 2, 2 );
  490. }
  491. _bmp.AlphaBlendSkinParts(
  492. dc.m_hDC,
  493. rcGroupBk,
  494. rcSrc,
  495. m_rcRibbonGroupPaddingBkExpanded,
  496. CExtBitmap::__EDM_STRETCH
  497. );
  498. } // if( nCaptionHeight == 0 )
  499. else
  500. {
  501. CSize _size = _bmp.GetSize();
  502. CRect rcDstGroupBk( rcGroupBk ),
  503. rcSrcGroupBk( 0, 0, _size.cx, _size.cy ),
  504. rcDstCaptionBk( rcGroupBk ),
  505. rcSrcCaptionBk( 0, 0, _size.cx, _size.cy );
  506. bool bTopCaption = Ribbon_GroupCaptionIsAtTop( pGroupTBB );
  507. if( bTopCaption )
  508. {
  509. rcDstGroupBk.top += nCaptionHeight;
  510. rcDstCaptionBk.bottom = rcDstGroupBk.top;
  511. rcSrcGroupBk.top += m_nRibbonCaptionPartHeight;
  512. rcSrcCaptionBk.bottom = rcSrcGroupBk.top;
  513. } // if( bTopCaption )
  514. else
  515. {
  516. rcDstGroupBk.bottom -= nCaptionHeight;
  517. rcDstCaptionBk.top = rcDstGroupBk.bottom;
  518. rcSrcGroupBk.bottom -= m_nRibbonCaptionPartHeight;
  519. rcSrcCaptionBk.top = rcSrcGroupBk.bottom;
  520. } // else from if( bTopCaption )
  521. _bmp.AlphaBlendSkinParts(
  522. dc.m_hDC,
  523. rcDstGroupBk,
  524. rcSrcGroupBk,
  525. m_rcRibbonGroupPaddingBkExpanded,
  526. CExtBitmap::__EDM_STRETCH
  527. );
  528. _bmp.AlphaBlendSkinParts(
  529. dc.m_hDC,
  530. rcDstCaptionBk,
  531. rcSrcCaptionBk,
  532. m_rcRibbonGroupPaddingBkExpanded,
  533. CExtBitmap::__EDM_STRETCH
  534. );
  535. if( nCaptionTextLength > 0 )
  536. {
  537. CExtRibbonPage * pRibbonPage =
  538. const_cast < CExtRibbonPage * >
  539. ( pGroupTBB->GetRibbonPage() );
  540. ASSERT_VALID( pRibbonPage );
  541. ASSERT( pRibbonPage->GetSafeHwnd() != NULL );
  542. CFont * pFont = pRibbonPage->OnGetToolbarFont( false, false );
  543. ASSERT( pFont->GetSafeHandle() != NULL );
  544. //CFont * pOldFont = dc.SelectObject( pFont );
  545. CFont * pOldFont = dc.SelectObject( &m_FontRibbonGroupCaption );
  546. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  547. COLORREF clrOldTextColor =
  548. dc.SetTextColor(
  549. ( m_clrRibbonGroupCaptionTextShadowExpanded == COLORREF(-1L) )
  550. ? m_clrRibbonGroupCaptionTextExpanded
  551. : m_clrRibbonGroupCaptionTextShadowExpanded
  552. );
  553. CRect rcCaption = rcDstCaptionBk;
  554. rcCaption.DeflateRect(
  555. m_rcRibbonGroupPaddingBkExpanded.left,
  556. 2,
  557. m_rcRibbonGroupPaddingBkExpanded.right,
  558. 2
  559. );
  560. if( ! bTopCaption )
  561. rcCaption.OffsetRect( 0, -1 );
  562. if( m_clrRibbonGroupCaptionTextShadowExpanded != COLORREF(-1L) )
  563. {
  564. rcCaption.OffsetRect(
  565. m_sizeRibbonGroupCaptionTextOffset.cx,
  566. m_sizeRibbonGroupCaptionTextOffset.cy
  567. );
  568. dc.DrawText(
  569. LPCTSTR( strCaptionText ),
  570. nCaptionTextLength,
  571. &rcCaption,
  572. m_nRibbonGroupCaptionTextShadowDF
  573. );
  574. rcCaption.OffsetRect(
  575. - m_sizeRibbonGroupCaptionTextOffset.cx,
  576. - m_sizeRibbonGroupCaptionTextOffset.cy
  577. );
  578. dc.SetTextColor( m_clrRibbonGroupCaptionTextExpanded );
  579. } // if( m_clrRibbonGroupCaptionTextShadowExpanded != COLORREF(-1L) )
  580. CRect rcCaptionTextAlignmentDLB =
  581. pGroupTBB->GetCaptionTextAlignmentRect();
  582. if( ! rcCaptionTextAlignmentDLB.IsRectEmpty() )
  583. {
  584. rcCaption.left =
  585. max(
  586. rcCaption.left,
  587. rcCaptionTextAlignmentDLB.left
  588. );
  589. rcCaption.right =
  590. min(
  591. rcCaption.right,
  592. rcCaptionTextAlignmentDLB.right
  593. );
  594. } // if( ! rcCaptionTextAlignmentDLB.IsRectEmpty() )
  595. dc.DrawText(
  596. LPCTSTR( strCaptionText ),
  597. nCaptionTextLength,
  598. &rcCaption,
  599. m_nRibbonGroupCaptionTextDF
  600. );
  601. dc.SetTextColor( clrOldTextColor );
  602. dc.SetBkMode( nOldBkMode );
  603. dc.SelectObject( pOldFont );
  604. } // if( nCaptionTextLength > 0 )
  605. } // else from if( nCaptionHeight == 0 )
  606. } // else from if( bCollapsed )
  607. }
  608. CRect CExtPaintManager::Ribbon_GetPageOuterContentPadding(
  609. const CExtRibbonPage * pRibbonPage,
  610. LPARAM lParam // = 0L
  611. )
  612. {
  613. ASSERT_VALID( this );
  614. ASSERT_VALID( pRibbonPage );
  615. pRibbonPage;
  616. lParam;
  617. return CRect( 3, 3, 3, 3 );
  618. }
  619. CRect CExtPaintManagerNativeXP::Ribbon_GetPageOuterContentPadding(
  620. const CExtRibbonPage * pRibbonPage,
  621. LPARAM lParam // = 0L
  622. )
  623. {
  624. ASSERT_VALID( this );
  625. ASSERT_VALID( pRibbonPage );
  626. CRect rc =
  627. CExtPaintManager::Ribbon_GetPageOuterContentPadding( pRibbonPage, lParam );
  628. e_system_theme_t eST = OnQuerySystemTheme();
  629. if( eST == ThemeLunaRoyale       // +2.87
  630. || eST == ThemeVistaOrLaterUX   // +2.87
  631. || eST == ThemeVistaOrLaterDWM  // +2.87
  632. || eST == ThemeLunaBlue
  633. || eST == ThemeLunaOlive
  634. || eST == ThemeLunaSilver
  635. )
  636. rc.bottom += 2;
  637. return rc;
  638. }
  639. CRect CExtPaintManagerOffice2007_Impl::Ribbon_GetPageOuterContentPadding(
  640. const CExtRibbonPage * pRibbonPage,
  641. LPARAM lParam // = 0L
  642. )
  643. {
  644. ASSERT_VALID( this );
  645. ASSERT_VALID( pRibbonPage );
  646. if( IsHighContrast() )
  647. return 
  648. CExtPaintManagerXP::Ribbon_GetPageOuterContentPadding(
  649. pRibbonPage,
  650. lParam
  651. );
  652. return m_rcRibbonPageOuterContentPadding;
  653. }
  654. void CExtPaintManager::Ribbon_PaintPageBk(
  655. CDC & dc,
  656. const RECT & rcPageBk,
  657. const CExtRibbonPage * pRibbonPage,
  658. LPARAM lParam // = 0L
  659. )
  660. {
  661. ASSERT_VALID( this );
  662. ASSERT( dc.GetSafeHdc() != NULL );
  663. ASSERT_VALID( pRibbonPage );
  664. lParam;
  665. if( ! dc.RectVisible( &rcPageBk ) )
  666. return;
  667. if( pRibbonPage->GetSafeHwnd() != NULL )
  668. {
  669. CWnd * pWndParent = pRibbonPage->GetParent();
  670. if( pWndParent != NULL
  671. && pWndParent->IsKindOf( RUNTIME_CLASS( CExtPopupMenuWnd ) )
  672. )
  673. return;
  674. } // if( pRibbonPage->GetSafeHwnd() != NULL )
  675. CRect rc = rcPageBk;
  676. rc.DeflateRect( 2, 0 );
  677. stat_PaintGradientRect(
  678. dc,
  679. rc,
  680. GetColor( COLOR_3DHILIGHT ),
  681. GetColor( COLOR_3DFACE ),
  682. true
  683. );
  684. dc.Draw3dRect(
  685. &rc,
  686. GetColor( COLOR_3DHIGHLIGHT ),
  687. GetColor( COLOR_3DSHADOW )
  688. );
  689. }
  690. void CExtPaintManagerStudio2005::Ribbon_PaintPageBk(
  691. CDC & dc,
  692. const RECT & rcPageBk,
  693. const CExtRibbonPage * pRibbonPage,
  694. LPARAM lParam // = 0L
  695. )
  696. {
  697. ASSERT_VALID( this );
  698. ASSERT( dc.GetSafeHdc() != NULL );
  699. ASSERT_VALID( pRibbonPage );
  700. if( IsHighContrast() )
  701. {
  702. CExtPaintManagerXP::Ribbon_PaintPageBk(
  703. dc,
  704. rcPageBk,
  705. pRibbonPage,
  706. lParam
  707. );
  708. return;
  709. }
  710. if( ! dc.RectVisible( &rcPageBk ) )
  711. return;
  712. if( pRibbonPage->GetSafeHwnd() != NULL )
  713. {
  714. CWnd * pWndParent = pRibbonPage->GetParent();
  715. if( pWndParent != NULL
  716. && pWndParent->IsKindOf( RUNTIME_CLASS( CExtPopupMenuWnd ) )
  717. )
  718. return;
  719. } // if( pRibbonPage->GetSafeHwnd() != NULL )
  720. CRect rc = rcPageBk;
  721. rc.DeflateRect( 2, 0 );
  722. //  dc.FillSolidRect(
  723. //  &rc,
  724. //  GetColor( COLOR_3DHILIGHT )
  725. //  );
  726. stat_PaintGradientRect(
  727. dc,
  728. rc,
  729. GetColor( COLOR_3DFACE ),
  730. GetColor( COLOR_3DHILIGHT ),
  731. true
  732. );
  733. COLORREF clrBorder = GetColor( COLOR_3DSHADOW );
  734. dc.Draw3dRect(
  735. &rc,
  736. clrBorder,
  737. clrBorder
  738. );
  739. }
  740. void CExtPaintManagerNativeXP::Ribbon_PaintPageBk(
  741. CDC & dc,
  742. const RECT & rcPageBk,
  743. const CExtRibbonPage * pRibbonPage,
  744. LPARAM lParam // = 0L
  745. )
  746. {
  747. ASSERT_VALID( this );
  748. ASSERT( dc.GetSafeHdc() != NULL );
  749. ASSERT_VALID( pRibbonPage );
  750. lParam;
  751. if( ! dc.RectVisible( &rcPageBk ) )
  752. return;
  753. if( pRibbonPage->GetSafeHwnd() != NULL )
  754. {
  755. CWnd * pWndParent = pRibbonPage->GetParent();
  756. if( pWndParent != NULL
  757. && pWndParent->IsKindOf( RUNTIME_CLASS( CExtPopupMenuWnd ) )
  758. )
  759. return;
  760. } // if( pRibbonPage->GetSafeHwnd() != NULL )
  761. if( g_PaintManager.m_UxTheme.IsAppThemed() )
  762. {
  763. HWND hWndOpenTheme = pRibbonPage->GetSafeHwnd();
  764. if( hWndOpenTheme != NULL )
  765. hWndOpenTheme = ::GetDesktopWindow();
  766. ASSERT( hWndOpenTheme != NULL );
  767. if( g_PaintManager.m_UxTheme.OpenThemeData( hWndOpenTheme, VSCLASS_TAB ) != NULL )
  768. {
  769. CRect rcItem = rcPageBk;
  770. rcItem.DeflateRect( 2, 0 );
  771. INT nPartID = TABP_PANE;
  772. INT nStateID = 0;
  773. VERIFY( 
  774. g_PaintManager.m_UxTheme.DrawBackground(
  775. hWndOpenTheme,
  776. dc.GetSafeHdc(), 
  777. nPartID, 
  778. nStateID, 
  779. &rcItem, 
  780. &rcItem
  781. ) == S_OK
  782. );
  783. g_PaintManager.m_UxTheme.CloseThemeData();
  784. }
  785. } // if( g_PaintManager.m_UxTheme.IsAppThemed() )
  786. }
  787. void CExtPaintManagerOffice2007_Impl::Ribbon_PaintPageBk(
  788. CDC & dc,
  789. const RECT & rcPageBk,
  790. const CExtRibbonPage * pRibbonPage,
  791. LPARAM lParam // = 0L
  792. )
  793. {
  794. ASSERT_VALID( this );
  795. ASSERT( dc.GetSafeHdc() != NULL );
  796. ASSERT_VALID( pRibbonPage );
  797. pRibbonPage;
  798. lParam;
  799. if( IsHighContrast() )
  800. {
  801. CExtPaintManagerXP::Ribbon_PaintPageBk( dc, rcPageBk, pRibbonPage, lParam );
  802. return;
  803. }
  804. if( m_bmpRibbonPageBk.IsEmpty() )
  805. return;
  806. if( ::IsRectEmpty( &rcPageBk ) )
  807. return;
  808. if( ! dc.RectVisible( &rcPageBk ) )
  809. return;
  810. CRect _rcPageBk = rcPageBk;
  811. if( m_rcRibbonPageBkPadding.bottom > 1 )
  812. {
  813. CFont * pFont = ((CExtToolControlBar*)pRibbonPage)->OnGetToolbarFont( false, true );
  814. LOGFONT _lf;
  815. ::memset( &_lf, 0, sizeof(LOGFONT) );
  816. pFont->GetLogFont( &_lf );
  817. if( _tcscmp( _lf.lfFaceName, _T("Segoe UI") ) != 0 )
  818. _rcPageBk.bottom ++;
  819. }
  820. m_bmpRibbonPageBk.AlphaBlendSkinParts(
  821. dc.m_hDC,
  822. _rcPageBk,
  823. m_rcRibbonPageBkPadding,
  824. CExtBitmap::__EDM_STRETCH
  825. );
  826. }
  827. void CExtPaintManagerOffice2007_R1::Ribbon_PaintPageBk(
  828. CDC & dc,
  829. const RECT & rcPageBk,
  830. const CExtRibbonPage * pRibbonPage,
  831. LPARAM lParam // = 0L
  832. )
  833. {
  834. ASSERT_VALID( this );
  835. ASSERT( dc.GetSafeHdc() != NULL );
  836. ASSERT_VALID( pRibbonPage );
  837. if( ! dc.RectVisible( &rcPageBk ) )
  838. return;
  839. if( IsHighContrast() )
  840. {
  841. CExtPaintManagerXP::Ribbon_PaintPageBk(
  842. dc,
  843. rcPageBk,
  844. pRibbonPage,
  845. lParam
  846. );
  847. return;
  848. }
  849. CExtPaintManagerOffice2007_Impl::Ribbon_PaintPageBk(
  850. dc,
  851. rcPageBk,
  852. pRibbonPage,
  853. lParam
  854. );
  855. INT nCaptionHeight = Ribbon_GroupCaptionGetHeight( NULL, lParam );
  856. ASSERT( nCaptionHeight >= 0 );
  857. if( nCaptionHeight == 0 )
  858. return;
  859. CRect rcPageBkAtEnd = rcPageBk;
  860. INT nPos, nCount = pRibbonPage->RibbonGroupButton_GetCount();
  861. for( nPos = 0; nPos < nCount; nPos ++ )
  862. {
  863. const CExtRibbonButtonGroup * pTBB =
  864. pRibbonPage->RibbonGroupButton_GetAt( nPos );
  865. ASSERT_VALID( pTBB );
  866. if( ! pTBB->IsVisible() )
  867. continue;
  868. if( ( pTBB->GetStyle() & TBBS_HIDDEN ) != 0 )
  869. continue;
  870. CRect rcTBB = *pTBB;
  871. rcPageBkAtEnd.left = rcTBB.right;
  872. } // for( nPos = 0; nPos < nCount; nPos ++ )
  873. CExtBitmap & _bmp = m_bmpRibbonGroupBkExpanded[ 0 ];
  874. CSize _size = _bmp.GetSize();
  875. CRect rcDstGroupBk( rcPageBkAtEnd ),
  876. rcSrcGroupBk( 0, 0, _size.cx, _size.cy ),
  877. rcDstCaptionBk( rcPageBkAtEnd ),
  878. rcSrcCaptionBk( 0, 0, _size.cx, _size.cy );
  879. bool bTopCaption = Ribbon_GroupCaptionIsAtTop( NULL );
  880. if( bTopCaption )
  881. {
  882. rcDstGroupBk.top += nCaptionHeight;
  883. rcDstCaptionBk.bottom = rcDstGroupBk.top;
  884. rcSrcGroupBk.top += m_nRibbonCaptionPartHeight;
  885. rcSrcCaptionBk.bottom = rcSrcGroupBk.top;
  886. } // if( bTopCaption )
  887. else
  888. {
  889. rcDstGroupBk.bottom -= nCaptionHeight;
  890. rcDstCaptionBk.top = rcDstGroupBk.bottom;
  891. rcSrcGroupBk.bottom -= m_nRibbonCaptionPartHeight;
  892. rcSrcCaptionBk.top = rcSrcGroupBk.bottom;
  893. } // else from if( bTopCaption )
  894. _bmp.AlphaBlendSkinParts(
  895. dc.m_hDC,
  896. rcDstGroupBk,
  897. rcSrcGroupBk,
  898. m_rcRibbonGroupPaddingBkExpanded,
  899. CExtBitmap::__EDM_STRETCH
  900. );
  901. _bmp.AlphaBlendSkinParts(
  902. dc.m_hDC,
  903. rcDstCaptionBk,
  904. rcSrcCaptionBk,
  905. m_rcRibbonGroupPaddingBkExpanded,
  906. CExtBitmap::__EDM_STRETCH
  907. );
  908. }
  909. bool CExtPaintManager::Ribbon_HaveSeparatorsBetweenToolGroups() const
  910. {
  911. ASSERT_VALID( this );
  912. return false;
  913. }
  914. void CExtPaintManager::Ribbon_PaintSeparator(
  915. CDC & dc,
  916. const RECT & rcTBB,
  917. const CExtBarButton * pSepTBB, // can be NULL
  918. LPARAM lParam // = 0L
  919. )
  920. {
  921. ASSERT_VALID( this );
  922. ASSERT( dc.GetSafeHdc() != NULL );
  923. pSepTBB;
  924. lParam;
  925. CRect _rcTBB = rcTBB;
  926. if( ! dc.RectVisible( &_rcTBB ) )
  927. return;
  928. for( ; _rcTBB.Width() < 3; _rcTBB.InflateRect( 1, 0 ) );
  929. for( ; _rcTBB.Height() < 3; _rcTBB.InflateRect( 0, 1 ) );
  930. PaintSeparator(
  931. dc,
  932. _rcTBB,
  933. ( _rcTBB.Width() < _rcTBB.Height() ) ? true : false,
  934. true,
  935. (CObject*)pSepTBB,
  936. lParam
  937. );
  938. }
  939. void CExtPaintManagerOffice2007_Impl::Ribbon_PaintSeparator(
  940. CDC & dc,
  941. const RECT & rcTBB,
  942. const CExtBarButton * pSepTBB, // can be NULL
  943. LPARAM lParam // = 0L
  944. )
  945. {
  946. ASSERT_VALID( this );
  947. ASSERT( dc.GetSafeHdc() != NULL );
  948. pSepTBB;
  949. if( IsHighContrast() )
  950. {
  951. CExtPaintManagerXP::Ribbon_PaintSeparator(
  952. dc,
  953. rcTBB,
  954. pSepTBB,
  955. lParam
  956. );
  957. return;
  958. }
  959. CRect _rcTBB = rcTBB;
  960. if( ! dc.RectVisible( &_rcTBB ) )
  961. return;
  962. if( _rcTBB.Width() > _rcTBB.Height() )
  963. {
  964. if( ! m_bmpRibbonSeparatorH.IsEmpty() )
  965. {
  966. CSize _size = m_bmpRibbonSeparatorH.GetSize();
  967. INT nY = _rcTBB.top + ( _rcTBB.Height() - _size.cy ) / 2;
  968. CRect rc(
  969. _rcTBB.left,
  970. nY,
  971. _rcTBB.right,
  972. nY + _size.cy
  973. );
  974. m_bmpRibbonSeparatorH.AlphaBlendSkinParts(
  975. dc.m_hDC,
  976. rc,
  977. m_rcRibbonSeparatorPaddingH,
  978. CExtBitmap::e_DrawMethod_t( m_nRibbonSeparatorDrawModeH )
  979. );
  980. } // if( ! m_bmpRibbonSeparatorH.IsEmpty() )
  981. } // if( _rcTBB.Width() > _rcTBB.Height() )
  982. else
  983. {
  984. if( ! m_bmpRibbonSeparatorV.IsEmpty() )
  985. {
  986. CSize _size = m_bmpRibbonSeparatorV.GetSize();
  987. INT nX = _rcTBB.left + ( _rcTBB.Width() - _size.cx ) / 2;
  988. CRect rc(
  989. nX,
  990. _rcTBB.top,
  991. nX + _size.cx,
  992. _rcTBB.bottom
  993. );
  994. m_bmpRibbonSeparatorV.AlphaBlendSkinParts(
  995. dc.m_hDC,
  996. rc,
  997. m_rcRibbonSeparatorPaddingV,
  998. CExtBitmap::e_DrawMethod_t( m_nRibbonSeparatorDrawModeV )
  999. );
  1000. } // if( ! m_bmpRibbonSeparatorV.IsEmpty() )
  1001. } // else from if( _rcTBB.Width() > _rcTBB.Height() )
  1002. }
  1003. void CExtPaintManager::Ribbon_SyncFonts()
  1004. {
  1005. ASSERT_VALID( this );
  1006. ASSERT( m_FontNormal.GetSafeHandle() != NULL );
  1007. if( m_FontRibbonNormal.GetSafeHandle() != NULL )
  1008. m_FontRibbonNormal.DeleteObject();
  1009. if( m_FontRibbonGroupCaption.GetSafeHandle() != NULL )
  1010. m_FontRibbonGroupCaption.DeleteObject();
  1011. if( m_FontRibbonTabItem.GetSafeHandle() != NULL )
  1012. m_FontRibbonTabItem.DeleteObject();
  1013. //bool bUseDesiredRibbonFontFaceName = false;
  1014. //static __EXT_MFC_SAFE_LPCTSTR
  1015. // g_sDesiredRibbonFontFaceName = _T("Segoe UI");
  1016. //CWindowDC dc( NULL );
  1017. // if( ! ::EnumFontFamilies(
  1018. // dc.m_hDC,
  1019. // NULL,
  1020. // (FONTENUMPROC)stat_FindFontByNameCallBack,
  1021. // reinterpret_cast < LPARAM > ( LPCTSTR(g_sDesiredRibbonFontFaceName) )
  1022. // )
  1023. // )
  1024. // bUseDesiredRibbonFontFaceName = true;
  1025. LOGFONT _lf;
  1026. ::memset( &_lf, 0, sizeof(LOGFONT) );
  1027. m_FontNormal.GetLogFont( &_lf );
  1028. // if( bUseDesiredRibbonFontFaceName )
  1029. // {
  1030. // __EXT_MFC_STRCPY( _lf.lfFaceName, LF_FACESIZE, g_sDesiredRibbonFontFaceName );
  1031. // _lf.lfWidth = 0;
  1032. // _lf.lfHeight = -11;
  1033. // }
  1034. // else
  1035. // {
  1036. // __EXT_MFC_STRCPY( _lf.lfFaceName, LF_FACESIZE, _T("Arial") );
  1037. // _lf.lfWidth = 5;
  1038. // _lf.lfHeight = 14;
  1039. // _lf.lfWeight = 550;
  1040. // }
  1041. if( g_PaintManager.m_bIsWinXPorLater )
  1042. _lf.lfQuality = CLEARTYPE_QUALITY;
  1043. if( g_PaintManager.m_bIsWinVistaOrLater )
  1044. {
  1045. static __EXT_MFC_SAFE_LPCTSTR g_sDesiredRibbonFontFaceName = _T("Segoe UI");
  1046. CWindowDC dc( NULL );
  1047. if( ! ::EnumFontFamilies(
  1048. dc.m_hDC,
  1049. NULL,
  1050. (FONTENUMPROC)stat_FindFontByNameCallBack,
  1051. reinterpret_cast < LPARAM > ( LPCTSTR(g_sDesiredRibbonFontFaceName) )
  1052. )
  1053. )
  1054. {
  1055. __EXT_MFC_STRCPY( _lf.lfFaceName, LF_FACESIZE, g_sDesiredRibbonFontFaceName );
  1056. _lf.lfWidth = 0;
  1057. if( UiScalingIsEnabled( __EUIST_Y )
  1058. && g_PaintManager.m_nLPY > 96
  1059. )
  1060. _lf.lfHeight = -13;
  1061. else
  1062. _lf.lfHeight = -11;
  1063. }
  1064. }
  1065. VERIFY( m_FontRibbonNormal.CreateFontIndirect( &_lf ) );
  1066. VERIFY( m_FontRibbonGroupCaption.CreateFontIndirect( &_lf ) );
  1067. VERIFY( m_FontRibbonTabItem.CreateFontIndirect( &_lf ) );
  1068. }
  1069. void CExtPaintManagerOffice2007_R1::Ribbon_SyncFonts()
  1070. {
  1071. ASSERT_VALID( this );
  1072. ASSERT( m_FontNormal.GetSafeHandle() != NULL );
  1073. if( IsHighContrast() )
  1074. {
  1075. CExtPaintManagerXP::Ribbon_SyncFonts();
  1076. return;
  1077. }
  1078. CExtPaintManagerOffice2003::Ribbon_SyncFonts();
  1079. ASSERT( m_FontRibbonTabItem.GetSafeHandle() != NULL );
  1080. LOGFONT _lf;
  1081. ::memset( &_lf, 0, sizeof(LOGFONT) );
  1082. m_FontRibbonTabItem.GetLogFont( &_lf );
  1083. m_FontRibbonTabItem.DeleteObject();
  1084. _lf.lfWidth = 0;
  1085. _lf.lfHeight = -13;
  1086. VERIFY( m_FontRibbonTabItem.CreateFontIndirect( &_lf ) );
  1087. }
  1088. CRect CExtPaintManager::Ribbon_GetPopupGroupBorderMetrics(
  1089. const CExtRibbonPage * pRibbonPage,
  1090. LPARAM lParam // = 0L
  1091. )
  1092. {
  1093. ASSERT_VALID( this );
  1094. ASSERT_VALID( pRibbonPage );
  1095. pRibbonPage; lParam;
  1096. return CRect( 2, 2, 2, 2 );
  1097. }
  1098. CRect CExtPaintManagerXP::Ribbon_GetPopupGroupBorderMetrics(
  1099. const CExtRibbonPage * pRibbonPage,
  1100. LPARAM lParam // = 0L
  1101. )
  1102. {
  1103. ASSERT_VALID( this );
  1104. ASSERT_VALID( pRibbonPage );
  1105. pRibbonPage; lParam;
  1106. return CRect( 1, 1, 1, 1 );
  1107. }
  1108. CRect CExtPaintManagerOffice2007_Impl::Ribbon_GetPopupGroupBorderMetrics(
  1109. const CExtRibbonPage * pRibbonPage,
  1110. LPARAM lParam // = 0L
  1111. )
  1112. {
  1113. ASSERT_VALID( this );
  1114. ASSERT_VALID( pRibbonPage );
  1115. if( IsHighContrast() )
  1116. return CExtPaintManagerXP::Ribbon_GetPopupGroupBorderMetrics( pRibbonPage, lParam );
  1117. return CRect( -1, 0, -1, -2 );
  1118. }
  1119. CRect CExtPaintManagerOffice2007_R1::Ribbon_GetPopupGroupBorderMetrics(
  1120. const CExtRibbonPage * pRibbonPage,
  1121. LPARAM lParam // = 0L
  1122. )
  1123. {
  1124. ASSERT_VALID( this );
  1125. ASSERT_VALID( pRibbonPage );
  1126. if( IsHighContrast() )
  1127. return CExtPaintManagerXP::Ribbon_GetPopupGroupBorderMetrics( pRibbonPage, lParam );
  1128. return CRect( 1, 1, 1, 1 );
  1129. }
  1130. bool CExtPaintManager::Ribbon_IsPopupGroupWithCaption(
  1131. CObject * pHelperSrc,
  1132. LPARAM lParam // = 0L
  1133. ) const
  1134. {
  1135. ASSERT_VALID( this );
  1136. pHelperSrc; lParam;
  1137. return false;
  1138. }
  1139. bool CExtPaintManagerOffice2007_Impl::Ribbon_IsPopupGroupWithCaption(
  1140. CObject * pHelperSrc,
  1141. LPARAM lParam // = 0L
  1142. ) const
  1143. {
  1144. ASSERT_VALID( this );
  1145. if( IsHighContrast() )
  1146. return CExtPaintManagerXP::Ribbon_IsPopupGroupWithCaption( pHelperSrc, lParam );
  1147. return true;
  1148. }
  1149. bool CExtPaintManagerOffice2007_R1::Ribbon_IsPopupGroupWithCaption(
  1150. CObject * pHelperSrc,
  1151. LPARAM lParam // = 0L
  1152. ) const
  1153. {
  1154. ASSERT_VALID( this );
  1155. if( IsHighContrast() )
  1156. return CExtPaintManagerXP::Ribbon_IsPopupGroupWithCaption( pHelperSrc, lParam );
  1157. return false;
  1158. }
  1159. INT CExtPaintManager::RibbonQuickAccessBar_GetBottomHeight(
  1160. const CExtRibbonPage * pRibbonPage,
  1161. LPARAM lParam // = 0L
  1162. ) const
  1163. {
  1164. ASSERT_VALID( this );
  1165. ASSERT_VALID( pRibbonPage );
  1166. pRibbonPage; lParam;
  1167. INT nHeight = UiScalingDo( 24, __EUIST_Y );
  1168. return nHeight;
  1169. }
  1170. INT CExtPaintManagerOffice2007_R2_LunaBlue::RibbonQuickAccessBar_GetBottomHeight(
  1171. const CExtRibbonPage * pRibbonPage,
  1172. LPARAM lParam // = 0L
  1173. ) const
  1174. {
  1175. ASSERT_VALID( this );
  1176. ASSERT_VALID( pRibbonPage );
  1177. if( IsHighContrast() )
  1178. return CExtPaintManagerXP::RibbonQuickAccessBar_GetBottomHeight( pRibbonPage, lParam );
  1179. INT nHeight = UiScalingDo( 26, __EUIST_Y );
  1180. return nHeight;
  1181. }
  1182. INT CExtPaintManagerOffice2007_R2_Silver::RibbonQuickAccessBar_GetBottomHeight(
  1183. const CExtRibbonPage * pRibbonPage,
  1184. LPARAM lParam // = 0L
  1185. ) const
  1186. {
  1187. ASSERT_VALID( this );
  1188. ASSERT_VALID( pRibbonPage );
  1189. if( IsHighContrast() )
  1190. return CExtPaintManagerXP::RibbonQuickAccessBar_GetBottomHeight( pRibbonPage, lParam );
  1191. INT nHeight = UiScalingDo( 24, __EUIST_Y );
  1192. return nHeight;
  1193. }
  1194. INT CExtPaintManagerOffice2007_R2_Obsidian::RibbonQuickAccessBar_GetBottomHeight(
  1195. const CExtRibbonPage * pRibbonPage,
  1196. LPARAM lParam // = 0L
  1197. ) const
  1198. {
  1199. ASSERT_VALID( this );
  1200. ASSERT_VALID( pRibbonPage );
  1201. if( IsHighContrast() )
  1202. return CExtPaintManagerXP::RibbonQuickAccessBar_GetBottomHeight( pRibbonPage, lParam );
  1203. INT nHeight = UiScalingDo( 24, __EUIST_Y );
  1204. return nHeight;
  1205. }
  1206. INT CExtPaintManager::RibbonQuickAccessBar_GetButtonsAlignment(
  1207. const CExtRibbonPage * pRibbonPage,
  1208. LPARAM lParam // = 0L
  1209. ) const
  1210. {
  1211. ASSERT_VALID( this );
  1212. ASSERT_VALID( pRibbonPage );
  1213. pRibbonPage; lParam;
  1214. return 0;
  1215. }
  1216. INT CExtPaintManagerOffice2007_Impl::RibbonQuickAccessBar_GetButtonsAlignment(
  1217. const CExtRibbonPage * pRibbonPage,
  1218. LPARAM lParam // = 0L
  1219. ) const
  1220. {
  1221. ASSERT_VALID( this );
  1222. ASSERT_VALID( pRibbonPage );
  1223. if( IsHighContrast() )
  1224. return CExtPaintManagerXP::RibbonQuickAccessBar_GetButtonsAlignment( pRibbonPage, lParam );
  1225. return m_nRibbonQuickAccessBarButtonsAlignment;
  1226. }
  1227. void CExtPaintManager::RibbonQuickAccessBar_PaintBkAtTheBottom(
  1228. CDC & dc,
  1229. CRect rcQATB,
  1230. const CExtRibbonPage * pRibbonPage,
  1231. LPARAM lParam // = 0L
  1232. ) const
  1233. {
  1234. ASSERT_VALID( this );
  1235. ASSERT( dc.GetSafeHdc() != NULL );
  1236. ASSERT_VALID( pRibbonPage );
  1237. dc; rcQATB; pRibbonPage; lParam;
  1238. }
  1239. void CExtPaintManagerNativeXP::RibbonQuickAccessBar_PaintBkAtTheBottom(
  1240. CDC & dc,
  1241. CRect rcQATB,
  1242. const CExtRibbonPage * pRibbonPage,
  1243. LPARAM lParam // = 0L
  1244. ) const
  1245. {
  1246. ASSERT_VALID( this );
  1247. ASSERT( dc.GetSafeHdc() != NULL );
  1248. ASSERT_VALID( pRibbonPage );
  1249. pRibbonPage;
  1250. lParam;
  1251. if( g_PaintManager.m_UxTheme.OpenThemeData( pRibbonPage->GetSafeHwnd(), VSCLASS_REBAR ) != NULL )
  1252. {
  1253. CRect rcPaint = rcQATB;
  1254. VERIFY( 
  1255. g_PaintManager.m_UxTheme.DrawBackground(
  1256. pRibbonPage->GetSafeHwnd(),
  1257. dc.GetSafeHdc(), 
  1258. 0, 
  1259. 0, 
  1260. &rcPaint, 
  1261. &rcPaint
  1262. ) == S_OK
  1263. );
  1264. g_PaintManager.m_UxTheme.CloseThemeData();
  1265. }
  1266. }
  1267. void CExtPaintManagerOffice2007_Impl::RibbonQuickAccessBar_PaintBkAtTheBottom(
  1268. CDC & dc,
  1269. CRect rcQATB,
  1270. const CExtRibbonPage * pRibbonPage,
  1271. LPARAM lParam // = 0L
  1272. ) const
  1273. {
  1274. ASSERT_VALID( this );
  1275. ASSERT( dc.GetSafeHdc() != NULL );
  1276. ASSERT_VALID( pRibbonPage );
  1277. if( IsHighContrast() )
  1278. {
  1279. CExtPaintManagerXP::RibbonQuickAccessBar_PaintBkAtTheBottom( dc, rcQATB, pRibbonPage, lParam );
  1280. return;
  1281. }
  1282. if( m_bmpRibbonQuickAccessBarBkAtTheBottom.IsEmpty() )
  1283. return;
  1284. m_bmpRibbonQuickAccessBarBkAtTheBottom.AlphaBlendSkinParts(
  1285. dc.m_hDC,
  1286. rcQATB,
  1287. m_rcPaddingRibbonQuickAccessBarBkAtTheBottom,
  1288. CExtBitmap::__EDM_STRETCH,
  1289. true,
  1290. true
  1291. );
  1292. }
  1293. void CExtPaintManager::RibbonQuickAccessBar_AdjustButtonLocation(
  1294. CExtBarButton * pTBB,
  1295. CRect & rcTBB,
  1296. LPARAM lParam // = 0L
  1297. )
  1298. {
  1299. ASSERT_VALID( this );
  1300. ASSERT_VALID( pTBB );
  1301. pTBB; rcTBB; lParam;
  1302. }
  1303. void CExtPaintManagerOffice2007_Impl::RibbonQuickAccessBar_AdjustButtonLocation(
  1304. CExtBarButton * pTBB,
  1305. CRect & rcTBB,
  1306. LPARAM lParam // = 0L
  1307. )
  1308. {
  1309. ASSERT_VALID( this );
  1310. ASSERT_VALID( pTBB );
  1311. if( IsHighContrast() )
  1312. {
  1313. CExtPaintManagerXP::RibbonQuickAccessBar_AdjustButtonLocation( pTBB, rcTBB, lParam );
  1314. return;
  1315. }
  1316. if( g_PaintManager.m_DWM.IsCompositionEnabled()
  1317. && Ribbon_FileButtonIsItegrationSupported()
  1318. )
  1319. {
  1320. CExtRibbonBar * pRibbonBar = STATIC_DOWNCAST( CExtRibbonBar, pTBB->GetBar() );
  1321. if( pRibbonBar != NULL
  1322. && pRibbonBar->m_pExtNcFrameImpl != NULL
  1323. && pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement()
  1324. && pRibbonBar->RibbonQuickAccessBar_AboveTheRibbonGet()
  1325. )
  1326. {
  1327. bool bZoomedMode = false;
  1328. if( pRibbonBar->GetParent()->IsZoomed() )
  1329. bZoomedMode = true;
  1330. rcTBB.OffsetRect( 0, bZoomedMode ? 3 : 2 );
  1331. //  if( ( ! IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R3_LunaBlue ) ) )
  1332. //  && ( ! IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R3_Obsidian ) ) )
  1333. //  && ( ! IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R3_Silver ) ) )
  1334. //  )
  1335. //  rcTBB.OffsetRect( 0, 3 );
  1336. //  else
  1337. //  {
  1338. //  if( UiScalingIsEnabled( __EUIST_Y )
  1339. //  && g_PaintManager.m_nLPY > 96
  1340. //  )
  1341. //  rcTBB.OffsetRect( 0, 1 );
  1342. //  }
  1343. }
  1344. } // if( g_PaintManager.m_DWM.IsCompositionEnabled() ...
  1345. }
  1346. INT CExtPaintManager::RibbonQuickAccessBar_GetAdditionalSpaceAtRight(
  1347. bool bDwmMode,
  1348. CObject * pHelperSrc,
  1349. LPARAM lParam // = 0L
  1350. )
  1351. {
  1352. ASSERT_VALID( this );
  1353. bDwmMode; pHelperSrc; lParam;
  1354. return 0;
  1355. }
  1356. INT CExtPaintManagerOffice2007_Impl::RibbonQuickAccessBar_GetAdditionalSpaceAtRight(
  1357. bool bDwmMode,
  1358. CObject * pHelperSrc,
  1359. LPARAM lParam // = 0L
  1360. )
  1361. {
  1362. ASSERT_VALID( this );
  1363. pHelperSrc; lParam;
  1364. return bDwmMode ? m_nQatbAdditionalSpaceAtRightDWM : m_nQatbAdditionalSpaceAtRight;
  1365. }
  1366. void CExtPaintManager::Ribbon_PaintTabItem(
  1367. CDC & dc,
  1368. CRect & rcTabItemsArea,
  1369. bool bSelected,
  1370. const CRect & rcEntireItem,
  1371. CFont * pFont,
  1372. __EXT_MFC_SAFE_LPCTSTR sText,
  1373. CExtCmdIcon * pIcon,
  1374. CObject * pHelperSrc,
  1375. LPARAM lParam, // = 0L
  1376. COLORREF clrForceText, // = COLORREF(-1L)
  1377. COLORREF clrForceTabBk, // = COLORREF(-1L)
  1378. COLORREF clrForceTabBorderLT, // = COLORREF(-1L)
  1379. COLORREF clrForceTabBorderRB, // = COLORREF(-1L)
  1380. COLORREF clrForceTabSeparator // = COLORREF(-1L)
  1381. )
  1382. {
  1383. ASSERT_VALID( this );
  1384. ASSERT( dc.GetSafeHdc() != NULL );
  1385. ASSERT( pFont->GetSafeHandle() != NULL );
  1386. if( ! dc.RectVisible( &rcEntireItem ) )
  1387. return;
  1388. if( clrForceText == COLORREF(-1L) )
  1389. clrForceText = GetColor( COLOR_BTNTEXT );
  1390. if( clrForceTabSeparator == COLORREF(-1L) )
  1391. clrForceTabSeparator = GetColor( COLOR_BTNTEXT );
  1392. CRect _rcEntireItem = rcEntireItem;
  1393. if( bSelected )
  1394. _rcEntireItem.DeflateRect( 0, 2, 0, 0 );
  1395. //  else if(
  1396. //  pHelperSrc != NULL
  1397. //  && pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtBarButton ) )
  1398. //  && ((CExtBarButton*)pHelperSrc)->IsHover()
  1399. //  )
  1400. //  {
  1401. //  bSelected = true;
  1402. //  _rcEntireItem.DeflateRect( 2, 1, 3, 1 );
  1403. //  clrForceText = GetColor( COLOR_3DHIGHLIGHT );
  1404. //  clrForceTabBk = clrForceTabBorderLT = clrForceTabBorderRB =
  1405. //  GetColor( COLOR_3DDKSHADOW );
  1406. //  }
  1407. else
  1408. _rcEntireItem.DeflateRect( 0, 2, 0, 2 );
  1409. CSize sizeTextMeasured = stat_CalcTextDimension( dc, *pFont, CExtSafeString(sText), DT_SINGLELINE|DT_LEFT|DT_TOP ).Size();
  1410. PaintTabItem(
  1411. dc,
  1412. rcTabItemsArea,
  1413. true,
  1414. true,
  1415. bSelected,
  1416. true,
  1417. false,
  1418. false,
  1419. false,
  1420. _rcEntireItem,
  1421. sizeTextMeasured,
  1422. pFont,
  1423. sText,
  1424. pIcon,
  1425. pHelperSrc,
  1426. lParam,
  1427. clrForceText,
  1428. clrForceTabBk,
  1429. clrForceTabBorderLT,
  1430. clrForceTabBorderRB,
  1431. clrForceTabSeparator
  1432. );
  1433. }
  1434. void CExtPaintManagerNativeXP::Ribbon_PaintTabItem(
  1435. CDC & dc,
  1436. CRect & rcTabItemsArea,
  1437. bool bSelected,
  1438. const CRect & rcEntireItem,
  1439. CFont * pFont,
  1440. __EXT_MFC_SAFE_LPCTSTR sText,
  1441. CExtCmdIcon * pIcon,
  1442. CObject * pHelperSrc,
  1443. LPARAM lParam, // = 0L
  1444. COLORREF clrForceText, // = COLORREF(-1L)
  1445. COLORREF clrForceTabBk, // = COLORREF(-1L)
  1446. COLORREF clrForceTabBorderLT, // = COLORREF(-1L)
  1447. COLORREF clrForceTabBorderRB, // = COLORREF(-1L)
  1448. COLORREF clrForceTabSeparator // = COLORREF(-1L)
  1449. )
  1450. {
  1451. ASSERT_VALID( this );
  1452. ASSERT( dc.GetSafeHdc() != NULL );
  1453. ASSERT( pFont->GetSafeHandle() != NULL );
  1454. if( ! dc.RectVisible( &rcEntireItem ) )
  1455. return;
  1456. if( clrForceText == COLORREF(-1L) )
  1457. clrForceText = GetColor( COLOR_BTNTEXT );
  1458. if( clrForceTabSeparator == COLORREF(-1L) )
  1459. clrForceTabSeparator = GetColor( COLOR_BTNTEXT );
  1460. CRect _rcEntireItem = rcEntireItem;
  1461. _rcEntireItem.DeflateRect( 0, 2, 0, 2 );
  1462. CSize sizeTextMeasured = stat_CalcTextDimension( dc, *pFont, CExtSafeString(sText), DT_SINGLELINE|DT_LEFT|DT_TOP ).Size();
  1463. PaintTabItem(
  1464. dc,
  1465. rcTabItemsArea,
  1466. true,
  1467. true,
  1468. bSelected,
  1469. true,
  1470. false,
  1471. false,
  1472. false,
  1473. _rcEntireItem,
  1474. sizeTextMeasured,
  1475. pFont,
  1476. sText,
  1477. pIcon,
  1478. pHelperSrc,
  1479. lParam,
  1480. clrForceText,
  1481. clrForceTabBk,
  1482. clrForceTabBorderLT,
  1483. clrForceTabBorderRB,
  1484. clrForceTabSeparator
  1485. );
  1486. }
  1487. void CExtPaintManagerOffice2007_Impl::Ribbon_PaintTabItem(
  1488. CDC & dc,
  1489. CRect & rcTabItemsArea,
  1490. bool bSelected,
  1491. const CRect & rcEntireItem,
  1492. CFont * pFont,
  1493. __EXT_MFC_SAFE_LPCTSTR sText,
  1494. CExtCmdIcon * pIcon,
  1495. CObject * pHelperSrc,
  1496. LPARAM lParam, // = 0L
  1497. COLORREF clrForceText, // = COLORREF(-1L)
  1498. COLORREF clrForceTabBk, // = COLORREF(-1L)
  1499. COLORREF clrForceTabBorderLT, // = COLORREF(-1L)
  1500. COLORREF clrForceTabBorderRB, // = COLORREF(-1L)
  1501. COLORREF clrForceTabSeparator // = COLORREF(-1L)
  1502. )
  1503. {
  1504. ASSERT_VALID( this );
  1505. ASSERT( dc.GetSafeHdc() != NULL );
  1506. ASSERT( pFont->GetSafeHandle() != NULL );
  1507. if( ! dc.RectVisible( &rcEntireItem ) )
  1508. return;
  1509. if( IsHighContrast() )
  1510. {
  1511. CExtPaintManagerXP::Ribbon_PaintTabItem(
  1512. dc,
  1513. rcTabItemsArea,
  1514. bSelected,
  1515. rcEntireItem,
  1516. pFont,
  1517. sText,
  1518. pIcon,
  1519. pHelperSrc,
  1520. lParam,
  1521. clrForceText,
  1522. clrForceTabBk,
  1523. clrForceTabBorderLT,
  1524. clrForceTabBorderRB,
  1525. clrForceTabSeparator
  1526. );
  1527. return;
  1528. }
  1529. bool bDwmMode = false;
  1530. if( g_PaintManager.m_bIsWinVistaOrLater
  1531. && g_PaintManager.m_DWM.IsCompositionEnabled()
  1532. && pHelperSrc != NULL
  1533. && pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtBarButton) )
  1534. )
  1535. {
  1536. CExtToolControlBar * pToolBar = ((CExtBarButton*)pHelperSrc)->GetSafeBar();
  1537. if( pToolBar != NULL )
  1538. {
  1539. CExtRibbonBar * pRibbonBar = DYNAMIC_DOWNCAST( CExtRibbonBar, pToolBar );
  1540. if( pRibbonBar != NULL )
  1541. {
  1542. if( pRibbonBar->m_pExtNcFrameImpl != NULL
  1543. && pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement()
  1544. )
  1545. bDwmMode = true;
  1546. }
  1547. }
  1548. }
  1549. CDC * pDC = &dc;
  1550. CExtMemoryDC * p_dc32 = NULL;
  1551. if( bDwmMode )
  1552. {
  1553. if( ! g_PaintManager.m_UxTheme.OpenThemeDataEx( ::GetDesktopWindow(), VSCLASS_WINDOW, __EXT_UX_OTD_NONCLIENT ) != NULL )
  1554. bDwmMode = false;
  1555. else
  1556. {
  1557. p_dc32 = new CExtMemoryDC(
  1558. &dc,
  1559. &rcEntireItem,
  1560. CExtMemoryDC::MDCOPT_TO_MEMORY
  1561. | CExtMemoryDC::MDCOPT_FORCE_DIB
  1562. | CExtMemoryDC::MDCOPT_FILL_BITS
  1563. | CExtMemoryDC::MDCOPT_DIB_NEGATIVE_HEIGHT
  1564. );
  1565. ASSERT( p_dc32->GetSafeHdc() != NULL );
  1566. pDC = p_dc32;
  1567. }
  1568. }
  1569. CSize sizeTextMeasured = stat_CalcTextDimension( dc, *pFont, CExtSafeString(sText), DT_SINGLELINE|DT_LEFT|DT_TOP ).Size();
  1570. PaintTabItem(
  1571. *pDC,
  1572. rcTabItemsArea,
  1573. true,
  1574. true,
  1575. bSelected,
  1576. true,
  1577. false,
  1578. false,
  1579. false,
  1580. rcEntireItem,
  1581. sizeTextMeasured,
  1582. pFont,
  1583. sText,
  1584. pIcon,
  1585. pHelperSrc,
  1586. lParam,
  1587. clrForceText,
  1588. clrForceTabBk,
  1589. clrForceTabBorderLT,
  1590. clrForceTabBorderRB,
  1591. clrForceTabSeparator,
  1592. bDwmMode
  1593. );
  1594. if( bDwmMode )
  1595. {
  1596. ASSERT( p_dc32 != NULL );
  1597. delete p_dc32;
  1598. g_PaintManager.m_UxTheme.CloseThemeData();
  1599. }
  1600. }
  1601. void CExtPaintManagerOffice2007_R1::Ribbon_PaintTabItem(
  1602. CDC & dc,
  1603. CRect & rcTabItemsArea,
  1604. bool bSelected,
  1605. const CRect & rcEntireItem,
  1606. CFont * pFont,
  1607. __EXT_MFC_SAFE_LPCTSTR sText,
  1608. CExtCmdIcon * pIcon,
  1609. CObject * pHelperSrc,
  1610. LPARAM lParam, // = 0L
  1611. COLORREF clrForceText, // = COLORREF(-1L)
  1612. COLORREF clrForceTabBk, // = COLORREF(-1L)
  1613. COLORREF clrForceTabBorderLT, // = COLORREF(-1L)
  1614. COLORREF clrForceTabBorderRB, // = COLORREF(-1L)
  1615. COLORREF clrForceTabSeparator // = COLORREF(-1L)
  1616. )
  1617. {
  1618. ASSERT_VALID( this );
  1619. ASSERT( dc.GetSafeHdc() != NULL );
  1620. ASSERT( pFont->GetSafeHandle() != NULL );
  1621. if( IsHighContrast() )
  1622. {
  1623. CExtPaintManagerXP::Ribbon_PaintTabItem(
  1624. dc,
  1625. rcTabItemsArea,
  1626. bSelected,
  1627. rcEntireItem,
  1628. pFont,
  1629. sText,
  1630. pIcon,
  1631. pHelperSrc,
  1632. lParam,
  1633. clrForceText,
  1634. clrForceTabBk,
  1635. clrForceTabBorderLT,
  1636. clrForceTabBorderRB,
  1637. clrForceTabSeparator
  1638. );
  1639. return;
  1640. }
  1641. CRect _rcEntireItem = rcEntireItem;
  1642. _rcEntireItem.top ++;
  1643. if( ! dc.RectVisible( &_rcEntireItem ) )
  1644. return;
  1645. CExtPaintManagerOffice2007_Impl::Ribbon_PaintTabItem(
  1646. dc,
  1647. rcTabItemsArea,
  1648. bSelected,
  1649. _rcEntireItem,
  1650. pFont,
  1651. sText,
  1652. pIcon,
  1653. pHelperSrc,
  1654. lParam,
  1655. clrForceText,
  1656. clrForceTabBk,
  1657. clrForceTabBorderLT,
  1658. clrForceTabBorderRB,
  1659. clrForceTabSeparator
  1660. );
  1661. }
  1662. void CExtPaintManager::Ribbon_PaintTabClientArea(
  1663. CDC & dc,
  1664. CRect & rcClient,
  1665. CRect & rcTabItemsArea,
  1666. CRect & rcTabNearBorderArea,
  1667. CObject * pHelperSrc,
  1668. LPARAM lParam // = 0L
  1669. )
  1670. {
  1671. ASSERT_VALID( this );
  1672. ASSERT( dc.GetSafeHdc() != NULL );
  1673. dc;
  1674. rcClient;
  1675. rcTabItemsArea;
  1676. rcTabNearBorderArea;
  1677. pHelperSrc;
  1678. lParam;
  1679. }
  1680. void CExtPaintManagerOffice2007_R1::Ribbon_PaintTabClientArea(
  1681. CDC & dc,
  1682. CRect & rcClient,
  1683. CRect & rcTabItemsArea,
  1684. CRect & rcTabNearBorderArea,
  1685. CObject * pHelperSrc,
  1686. LPARAM lParam // = 0L
  1687. )
  1688. {
  1689. ASSERT_VALID( this );
  1690. ASSERT( dc.GetSafeHdc() != NULL );
  1691. if( IsHighContrast() )
  1692. {
  1693. CExtPaintManagerXP::Ribbon_PaintTabClientArea(
  1694. dc,
  1695. rcClient,
  1696. rcTabItemsArea,
  1697. rcTabNearBorderArea,
  1698. pHelperSrc,
  1699. lParam
  1700. );
  1701. return;
  1702. }
  1703. if( pHelperSrc == NULL )
  1704. return;
  1705. ASSERT_VALID( pHelperSrc );
  1706. CExtRibbonBar * pRibbonBar = DYNAMIC_DOWNCAST( CExtRibbonBar, pHelperSrc );
  1707. if( pRibbonBar == NULL )
  1708. return;
  1709. CRect rcLine(
  1710. rcClient.left,
  1711. rcTabItemsArea.top,
  1712. rcClient.right,
  1713. rcTabItemsArea.top + 1
  1714. );
  1715. if( dc.RectVisible( &rcLine ) )
  1716. dc.FillSolidRect(
  1717. rcLine,
  1718. RGB(216,214,214)
  1719. );
  1720. if( m_bmpRibbonFileButtonArea.IsEmpty() )
  1721. return;
  1722. CExtRibbonButtonFile * pFileTBB = pRibbonBar->Ribbon_FileButtonGet();
  1723. if( pFileTBB == NULL )
  1724. return;
  1725. ASSERT_VALID( pFileTBB );
  1726. CRect rcTBB = *pFileTBB;
  1727. CRect rcDst(
  1728. rcClient.left,
  1729. rcTabItemsArea.top,
  1730. rcTBB.right + 6,
  1731. rcTabItemsArea.bottom
  1732. );
  1733. CRect rcPadding( 0, 0, 10, 0 );
  1734. if( dc.RectVisible( &rcDst ) )
  1735. m_bmpRibbonFileButtonArea.AlphaBlendSkinParts(
  1736. dc.m_hDC,
  1737. rcDst,
  1738. rcPadding,
  1739. CExtBitmap::__EDM_STRETCH,
  1740. true,
  1741. true
  1742. );
  1743. }
  1744. void CExtPaintManagerOffice2007_Impl::Ribbon_PaintTabClientArea(
  1745. CDC & dc,
  1746. CRect & rcClient,
  1747. CRect & rcTabItemsArea,
  1748. CRect & rcTabNearBorderArea,
  1749. CObject * pHelperSrc,
  1750. LPARAM lParam // = 0L
  1751. )
  1752. {
  1753. ASSERT_VALID( this );
  1754. ASSERT( dc.GetSafeHdc() != NULL );
  1755. CExtPaintManagerOffice2003::Ribbon_PaintTabClientArea(
  1756. dc,
  1757. rcClient,
  1758. rcTabItemsArea,
  1759. rcTabNearBorderArea,
  1760. pHelperSrc,
  1761. lParam
  1762. );
  1763. if( IsHighContrast() )
  1764. return;
  1765. if( pHelperSrc == NULL )
  1766. return;
  1767. ASSERT_VALID( pHelperSrc );
  1768. CExtRibbonBar * pRibbonBar = DYNAMIC_DOWNCAST( CExtRibbonBar, pHelperSrc );
  1769. if( pRibbonBar == NULL )
  1770. return;
  1771. if( Ribbon_DwmAreaCoversTabs() )
  1772. {
  1773. bool bDrawDefaultTabClientArea = true;
  1774. if( (! m_bmpRibbonTabAreaBlur.IsEmpty() ) && g_PaintManager.m_DWM.IsCompositionEnabled() )
  1775. {
  1776. bool bDwmMode = false;
  1777. if( pRibbonBar->m_pExtNcFrameImpl != NULL
  1778. && pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement()
  1779. )
  1780. bDwmMode = true;
  1781. if( bDwmMode )
  1782. {
  1783. bDrawDefaultTabClientArea = false;
  1784. CRect rcBlur = rcTabItemsArea;
  1785. rcBlur.top = min( rcBlur.top, rcClient.top );
  1786. DWORD dwDcLayout = dc.GetLayout();
  1787. dc.SetLayout( LAYOUT_LTR );
  1788. m_bmpRibbonTabAreaBlur.AlphaBlendSkinParts(
  1789. dc.m_hDC,
  1790. rcBlur,
  1791. m_rcRibbonTabAreaBlurPadding,
  1792. CExtBitmap::__EDM_STRETCH,
  1793. true,
  1794. true
  1795. );
  1796. dc.SetLayout( dwDcLayout );
  1797. }
  1798. }
  1799. if( bDrawDefaultTabClientArea && pHelperSrc != NULL && ( m_clrRibbonTabClientAreaActive != COLORREF(-1L) || m_clrRibbonTabClientAreaInactive != COLORREF(-1L) ) )
  1800. {
  1801. CExtRibbonBar * pRibbonBar = DYNAMIC_DOWNCAST( CExtRibbonBar, pHelperSrc );
  1802. if( pRibbonBar != NULL && pRibbonBar->m_pExtNcFrameImpl != NULL )
  1803. {
  1804. COLORREF clrFill = pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_IsActive() ? m_clrRibbonTabClientAreaActive : m_clrRibbonTabClientAreaInactive;
  1805. dc.FillSolidRect( &rcTabItemsArea, clrFill );
  1806. }
  1807. }
  1808. }
  1809. }
  1810. INT CExtPaintManager::Ribbon_GetTabIntersectionHeight(
  1811. const CExtRibbonPage * pRibbonPage,
  1812. LPARAM lParam // = 0L
  1813. ) const
  1814. {
  1815. ASSERT_VALID( this );
  1816. ASSERT_VALID( pRibbonPage );
  1817. pRibbonPage;
  1818. lParam;
  1819. return 0;
  1820. }
  1821. INT CExtPaintManagerNativeXP::Ribbon_GetTabIntersectionHeight(
  1822. const CExtRibbonPage * pRibbonPage,
  1823. LPARAM lParam // = 0L
  1824. ) const
  1825. {
  1826. ASSERT_VALID( this );
  1827. ASSERT_VALID( pRibbonPage );
  1828. pRibbonPage;
  1829. lParam;
  1830. return 0;
  1831. }
  1832. INT CExtPaintManagerOffice2007_Impl::Ribbon_GetTabIntersectionHeight(
  1833. const CExtRibbonPage * pRibbonPage,
  1834. LPARAM lParam // = 0L
  1835. ) const
  1836. {
  1837. ASSERT_VALID( this );
  1838. ASSERT_VALID( pRibbonPage );
  1839. if( IsHighContrast() )
  1840. return 
  1841. CExtPaintManagerXP::Ribbon_GetTabIntersectionHeight(
  1842. pRibbonPage,
  1843. lParam
  1844. );
  1845. return m_nRibbonTabIntersectionHeight;
  1846. }
  1847. INT CExtPaintManager::Ribbon_GetTabLineHeight(
  1848. const CExtRibbonPage * pRibbonPage,
  1849. LPARAM lParam // = 0L
  1850. ) const
  1851. {
  1852. ASSERT_VALID( this );
  1853. ASSERT_VALID( pRibbonPage );
  1854. pRibbonPage;
  1855. lParam;
  1856. CFont * pMeasureFont = (CFont*)&m_FontRibbonNormal;
  1857. ASSERT( pMeasureFont->GetSafeHandle() != NULL );
  1858. CWindowDC dc( NULL );
  1859. CFont * pOldFont = dc.SelectObject( pMeasureFont );
  1860. TEXTMETRIC _TxtM;
  1861. ::memset( &_TxtM, 0, sizeof(TEXTMETRIC) );
  1862. if( ! dc.GetTextMetrics( &_TxtM ) )
  1863. _TxtM.tmHeight = 17;
  1864. dc.SelectObject( pOldFont );
  1865. //  INT nBasicHeight = _TxtM.tmHeight + 10;
  1866. //  INT nTabLineHeight = UiScalingDo( nBasicHeight, __EUIST_Y );
  1867. INT nTabLineHeight = _TxtM.tmHeight + UiScalingDo( 10, __EUIST_Y );
  1868. return nTabLineHeight;
  1869. }
  1870. INT CExtPaintManagerOffice2007_R1::Ribbon_GetTabLineHeight(
  1871. const CExtRibbonPage * pRibbonPage,
  1872. LPARAM lParam // = 0L
  1873. ) const
  1874. {
  1875. ASSERT_VALID( this );
  1876. ASSERT_VALID( pRibbonPage );
  1877. if( IsHighContrast() )
  1878. return CExtPaintManagerXP::Ribbon_GetTabLineHeight( pRibbonPage, lParam );
  1879. INT nTabLineHeight = CExtPaintManagerOffice2007_Impl::Ribbon_GetTabLineHeight( pRibbonPage, lParam );
  1880. return nTabLineHeight;
  1881. }
  1882. HRGN CExtPaintManager::Ribbon_GetRgnCornerExclude(
  1883. CObject * pHelperSrc,
  1884. LPARAM lParam // = 0L
  1885. )
  1886. {
  1887. ASSERT_VALID( this );
  1888. pHelperSrc;
  1889. lParam;
  1890. return ((HRGN)NULL);
  1891. }
  1892. HRGN CExtPaintManagerOffice2007_Impl::Ribbon_GetRgnCornerExclude(
  1893. CObject * pHelperSrc,
  1894. LPARAM lParam // = 0L
  1895. )
  1896. {
  1897. ASSERT_VALID( this );
  1898. if( IsHighContrast() )
  1899. return 
  1900. CExtPaintManagerXP::Ribbon_GetRgnCornerExclude(
  1901. pHelperSrc,
  1902. lParam
  1903. );
  1904. if( pHelperSrc != 0
  1905. && pHelperSrc->IsKindOf( RUNTIME_CLASS(CWnd) )
  1906. && ((CWnd*)pHelperSrc)->IsZoomed()
  1907. )
  1908. return NULL;
  1909. HRGN hRgn = (HRGN)m_rgnRibbonNcCornerExclude.GetSafeHandle();
  1910. if( hRgn != NULL )
  1911. return hRgn;
  1912. if( m_bmpRibbonNcCornerHT.IsEmpty() )
  1913. return  ((HRGN)NULL);
  1914. HRGN hRgnBmp = m_bmpRibbonNcCornerHT.GenerateColorHRGN( false, RGB(255,0,255) );
  1915. if( hRgnBmp == NULL )
  1916. return NULL;
  1917. CSize _size = m_bmpRibbonNcCornerHT.GetSize();
  1918. hRgn = ::CreateRectRgn( 0, 0, _size.cx, _size.cy );
  1919. ::CombineRgn( hRgn, hRgn, hRgnBmp, RGN_DIFF );
  1920. ::DeleteObject( hRgnBmp );
  1921. m_rgnRibbonNcCornerExclude.Attach( hRgn );
  1922. return hRgn;
  1923. }
  1924. HRGN CExtPaintManager::Ribbon_GetRgnCornerResizing(
  1925. CObject * pHelperSrc,
  1926. LPARAM lParam // = 0L
  1927. )
  1928. {
  1929. ASSERT_VALID( this );
  1930. pHelperSrc;
  1931. lParam;
  1932. return ((HRGN)NULL);
  1933. }
  1934. HRGN CExtPaintManagerOffice2007_Impl::Ribbon_GetRgnCornerResizing(
  1935. CObject * pHelperSrc,
  1936. LPARAM lParam // = 0L
  1937. )
  1938. {
  1939. ASSERT_VALID( this );
  1940. if( IsHighContrast() )
  1941. return 
  1942. CExtPaintManagerXP::Ribbon_GetRgnCornerResizing(
  1943. pHelperSrc,
  1944. lParam
  1945. );
  1946. HRGN hRgn = (HRGN)m_rgnRibbonNcCornerResizing.GetSafeHandle();
  1947. if( hRgn != NULL )
  1948. return hRgn;
  1949. if( m_bmpRibbonNcCornerHT.IsEmpty() )
  1950. return  ((HRGN)NULL);
  1951. bool bRTL = false;
  1952. if( pHelperSrc != NULL
  1953. && pHelperSrc->IsKindOf( RUNTIME_CLASS(CWnd) )
  1954. && (((CWnd*)pHelperSrc)->GetExStyle()&WS_EX_LAYOUTRTL) != 0
  1955. )
  1956. bRTL = true;
  1957. HRGN hRgnBmp = m_bmpRibbonNcCornerHT.GenerateColorHRGN( bRTL, RGB(0,255,0) );
  1958. if( hRgnBmp == NULL )
  1959. return NULL;
  1960. CSize _size = m_bmpRibbonNcCornerHT.GetSize();
  1961. hRgn = ::CreateRectRgn( 0, 0, _size.cx, _size.cy );
  1962. ::CombineRgn( hRgn, hRgn, hRgnBmp, RGN_DIFF );
  1963. ::DeleteObject( hRgnBmp );
  1964. m_rgnRibbonNcCornerResizing.Attach( hRgn );
  1965. return hRgn;
  1966. }
  1967. void CExtPaintManager::Ribbon_EmbeddedCaptionPaintText(
  1968. CDC & dc,
  1969. __EXT_MFC_SAFE_LPCTSTR strCaption,
  1970. CRect rcDrawText,
  1971. __EXT_MFC_SAFE_LPCTSTR strCaptionDelimiter,
  1972. const CExtRibbonBar * pRibbonBar,
  1973. LPARAM lParam // = 0L
  1974. )
  1975. {
  1976. ASSERT_VALID( this );
  1977. ASSERT_VALID( pRibbonBar );
  1978. dc;
  1979. pRibbonBar;
  1980. strCaption;
  1981. rcDrawText;
  1982. strCaptionDelimiter;
  1983. pRibbonBar;
  1984. lParam;
  1985. }
  1986. void CExtPaintManagerOffice2007_Impl::Ribbon_EmbeddedCaptionPaintText(
  1987. CDC & dc,
  1988. __EXT_MFC_SAFE_LPCTSTR strCaption,
  1989. CRect rcDrawText,
  1990. __EXT_MFC_SAFE_LPCTSTR strCaptionDelimiter,
  1991. const CExtRibbonBar * pRibbonBar,
  1992. LPARAM lParam // = 0L
  1993. )
  1994. {
  1995. ASSERT_VALID( this );
  1996. ASSERT_VALID( pRibbonBar );
  1997. if( strCaption == NULL
  1998. || (! dc.RectVisible(&rcDrawText) )
  1999. )
  2000. return;
  2001. if( IsHighContrast() )
  2002. {
  2003. CExtPaintManagerXP::Ribbon_EmbeddedCaptionPaintText(
  2004. dc,
  2005. strCaption,
  2006. rcDrawText,
  2007. strCaptionDelimiter,
  2008. pRibbonBar,
  2009. lParam
  2010. );
  2011. return;
  2012. }
  2013. INT nLenCaption = INT( _tcslen( strCaption ) );
  2014. if( nLenCaption == 0 )
  2015. return;
  2016. bool bRTL = ( (pRibbonBar->GetExStyle()&WS_EX_LAYOUTRTL) != 0 ) ? true : false;;
  2017. if( ! IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R1 ) ) )
  2018. {
  2019. if( bRTL )
  2020. {
  2021. CRect rcClient;
  2022. pRibbonBar->GetClientRect( &rcClient );
  2023. rcDrawText.OffsetRect(
  2024. rcClient.right - rcDrawText.left * 2 - rcDrawText.Width(),
  2025. 0
  2026. );
  2027. } // if( bRTL )
  2028. } // if( ! IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R1 ) ) )
  2029. UINT nBaseDT = Ribbon_EmbeddedCaptionGetTextAlignmentFlags( pRibbonBar );
  2030. //UINT nAlignDT = nBaseDT & (DT_LEFT|DT_CENTER|DT_RIGHT);
  2031. UINT nDT = nBaseDT & (~(DT_CALCRECT));
  2032. if( bRTL )
  2033. {
  2034. if( (nDT&3) == DT_RIGHT )
  2035. {
  2036. nDT &= ~3;
  2037. nDT |= DT_LEFT;
  2038. }
  2039. else if( (nDT&3) == DT_LEFT )
  2040. {
  2041. nDT &= ~3;
  2042. nDT |= DT_RIGHT;
  2043. }
  2044. } // if( bRTL )
  2045. CExtSafeString strLeft = strCaption, strMiddle, strRight;
  2046. INT nLenDelimiter = 0;
  2047. if( strCaptionDelimiter != NULL )
  2048. {
  2049. nLenDelimiter = INT( _tcslen( strCaptionDelimiter ) );
  2050. if( nLenDelimiter > 0 )
  2051. {
  2052. INT nPos = strLeft.Find( strCaptionDelimiter );
  2053. if( nPos >= 0 )
  2054. {
  2055. strRight = strLeft.Right( nLenCaption - nPos - nLenDelimiter );
  2056. strLeft = strLeft.Left( nPos );
  2057. if( ! strRight.IsEmpty() )
  2058. strMiddle = strCaptionDelimiter;
  2059. } // if( nPos >= 0 )
  2060. } // if( nLenDelimiter > 0 )
  2061. } // if( strCaptionDelimiter != NULL )
  2062. CFont * pOldFont = dc.SelectObject( &m_FontCaption );
  2063. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  2064. COLORREF clrOldText = dc.GetTextColor();
  2065. nDT &= ~(DT_END_ELLIPSIS);
  2066. INT nWidthLeft = stat_CalcTextDimension( dc, m_FontCaption, strLeft, DT_SINGLELINE|DT_LEFT|DT_TOP|DT_CALCRECT ).Width();
  2067. INT nWidthMiddle = 0, nWidthRight = 0, nWidthAvailable = rcDrawText.Width();
  2068. if( ! strRight.IsEmpty() )
  2069. {
  2070. nWidthMiddle = stat_CalcTextDimension( dc, m_FontCaption, strMiddle, DT_SINGLELINE|DT_LEFT|DT_TOP|DT_CALCRECT ).Width();
  2071. nWidthRight  = stat_CalcTextDimension( dc, m_FontCaption, strRight, DT_SINGLELINE|DT_LEFT|DT_TOP|DT_CALCRECT ).Width();
  2072. }
  2073. dc.SetTextColor( m_clrRibbon_EmbeddedCaptionTextLeft );
  2074. if( nWidthAvailable > ( nWidthLeft + nWidthMiddle + nWidthRight ) && (! strRight.IsEmpty() ) )
  2075. {
  2076. if( (nDT&DT_RIGHT) != 0 )
  2077. rcDrawText.left = rcDrawText.right - ( nWidthLeft + nWidthMiddle + nWidthRight );
  2078. else if( (nDT&DT_CENTER) != 0 )
  2079. rcDrawText.left += ( rcDrawText.Width() - ( nWidthLeft + nWidthMiddle + nWidthRight ) ) / 2; 
  2080. nDT &= ~(DT_RIGHT|DT_CENTER);
  2081. nDT |= DT_LEFT;
  2082. dc.DrawText( strLeft, strLeft.GetLength(), rcDrawText, nDT );
  2083. rcDrawText.left += nWidthLeft;
  2084. dc.DrawText( strMiddle, strMiddle.GetLength(), rcDrawText, nDT );
  2085. dc.SetTextColor( m_clrRibbon_EmbeddedCaptionTextRight );
  2086. rcDrawText.left += nWidthMiddle;
  2087. nDT |= DT_END_ELLIPSIS;
  2088. dc.DrawText( strRight, strRight.GetLength(), rcDrawText, nDT );
  2089. } // if( nWidthAvailable > ( nWidthLeft + nWidthMiddle ) && (! strRight.IsEmpty() ) )
  2090. else
  2091. {
  2092. nDT &= ~(DT_LEFT|DT_CENTER|DT_RIGHT);
  2093. nDT |= DT_LEFT; // nDT |= nAlignDT;
  2094. nDT |= DT_END_ELLIPSIS;
  2095. if( bRTL )
  2096. nDT |= DT_RTLREADING;
  2097. dc.DrawText( strLeft, strLeft.GetLength(), rcDrawText, nDT );
  2098. if(! strRight.IsEmpty() )
  2099. {
  2100. rcDrawText.left += nWidthLeft;
  2101. if( ( rcDrawText.Width() + nWidthMiddle ) > 0 )
  2102. {
  2103. dc.DrawText( strMiddle, strMiddle.GetLength(), rcDrawText, nDT );
  2104. dc.SetTextColor( m_clrRibbon_EmbeddedCaptionTextRight );
  2105. rcDrawText.left += nWidthMiddle;
  2106. dc.DrawText( strRight, strRight.GetLength(), rcDrawText, nDT );
  2107. }
  2108. }
  2109. } // else from if( nWidthAvailable > ( nWidthLeft + nWidthMiddle ) && (! strRight.IsEmpty() ) )
  2110. dc.SetTextColor( clrOldText );
  2111. dc.SetBkMode( nOldBkMode );
  2112. dc.SelectObject( &pOldFont );
  2113. }
  2114. UINT CExtPaintManager::Ribbon_EmbeddedCaptionGetTextAlignmentFlags(
  2115. const CExtRibbonBar * pRibbonBar,
  2116. LPARAM lParam // = 0L
  2117. )
  2118. {
  2119. ASSERT_VALID( this );
  2120. ASSERT_VALID( pRibbonBar );
  2121. pRibbonBar;
  2122. lParam;
  2123. return (DT_SINGLELINE|DT_CENTER|DT_VCENTER);
  2124. }
  2125. UINT CExtPaintManagerOffice2007_Impl::Ribbon_EmbeddedCaptionGetTextAlignmentFlags(
  2126. const CExtRibbonBar * pRibbonBar,
  2127. LPARAM lParam // = 0L
  2128. )
  2129. {
  2130. ASSERT_VALID( this );
  2131. ASSERT_VALID( pRibbonBar );
  2132. if( IsHighContrast() )
  2133. return 
  2134. CExtPaintManagerXP::Ribbon_EmbeddedCaptionGetTextAlignmentFlags(
  2135. pRibbonBar,
  2136. lParam
  2137. );
  2138. return m_nRibbonEmbeddedCaptionTextAlignmentFlags;
  2139. }
  2140. void CExtPaintManager::Ribbon_EmbeddedCaptionAdjustTextRect(
  2141. CRect & rcAdjust,
  2142. const CExtRibbonBar * pRibbonBar,
  2143. LPARAM lParam // = 0L
  2144. )
  2145. {
  2146. ASSERT_VALID( this );
  2147. ASSERT_VALID( pRibbonBar );
  2148. rcAdjust;
  2149. pRibbonBar;
  2150. lParam;
  2151. }
  2152. void CExtPaintManagerOffice2007_Impl::Ribbon_EmbeddedCaptionAdjustTextRect(
  2153. CRect & rcAdjust,
  2154. const CExtRibbonBar * pRibbonBar,
  2155. LPARAM lParam // = 0L
  2156. )
  2157. {
  2158. ASSERT_VALID( this );
  2159. ASSERT_VALID( pRibbonBar );
  2160. if( IsHighContrast() )
  2161. {
  2162. CExtPaintManagerXP::Ribbon_EmbeddedCaptionAdjustTextRect(
  2163. rcAdjust,
  2164. pRibbonBar,
  2165. lParam
  2166. );
  2167. return;
  2168. }
  2169. bool bDwmMode = false;
  2170. if( pRibbonBar->m_pExtNcFrameImpl != NULL
  2171. && pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement()
  2172. )
  2173. bDwmMode = true;
  2174. if( ( ! bDwmMode )
  2175. && pRibbonBar->GetParent()->IsZoomed()
  2176. )
  2177. {
  2178. rcAdjust.OffsetRect( 0, 3 );
  2179. }
  2180. }
  2181. void CExtPaintManager::Ribbon_NcOverPaint(
  2182. CDC & dc,
  2183. bool bFrameActive,
  2184. INT nWidthFromLeft,
  2185. bool bDwmMode,
  2186. LPCRECT pRectDwmText,
  2187. __EXT_MFC_SAFE_LPCTSTR strDwmCaptionTitle,
  2188. CObject * pHelperSrc,
  2189. LPARAM lParam // = 0L
  2190. )
  2191. {
  2192. ASSERT_VALID( this );
  2193. ASSERT( dc.GetSafeHdc() != NULL );
  2194. dc; bFrameActive; nWidthFromLeft; bDwmMode; pRectDwmText; strDwmCaptionTitle; pHelperSrc; lParam;
  2195. }
  2196. void CExtPaintManagerOffice2007_Impl::Ribbon_NcOverPaint(
  2197. CDC & dc,
  2198. bool bFrameActive,
  2199. INT nWidthFromLeft,
  2200. bool bDwmMode,
  2201. LPCRECT pRectDwmText,
  2202. __EXT_MFC_SAFE_LPCTSTR strDwmCaptionTitle,
  2203. CObject * pHelperSrc,
  2204. LPARAM lParam // = 0L
  2205. )
  2206. {
  2207. ASSERT_VALID( this );
  2208. ASSERT( dc.GetSafeHdc() != NULL );
  2209. if( IsHighContrast() )
  2210. {
  2211. CExtPaintManagerXP::Ribbon_NcOverPaint( dc, bFrameActive, nWidthFromLeft, bDwmMode, pRectDwmText, strDwmCaptionTitle, pHelperSrc, lParam );
  2212. return;
  2213. }
  2214. bool bZoomedMode = false;
  2215. bool bThirdRelease = false, bSecondRelease = false, bDrawQatbBackground = true;
  2216. if( IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R3_LunaBlue ) )
  2217. || IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R3_Silver ) )
  2218. || IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R3_Obsidian ) )
  2219. )
  2220. {
  2221. bThirdRelease = true;
  2222. if( pHelperSrc != NULL )
  2223. {
  2224. CExtRibbonBar * pRibbonBar = DYNAMIC_DOWNCAST( CExtRibbonBar, pHelperSrc );
  2225. if( pRibbonBar != NULL )
  2226. {
  2227. if( ! pRibbonBar->RibbonQuickAccessBar_AboveTheRibbonGet() )
  2228. bDrawQatbBackground = false;
  2229. if( pRibbonBar->GetParent()->IsZoomed() )
  2230. bZoomedMode = true;
  2231. } // if( pRibbonBar != NULL )
  2232. } // if( pHelperSrc != NULL )
  2233. }
  2234. else
  2235. if( IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R2_LunaBlue ) )
  2236. || IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R2_Silver ) )
  2237. || IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R2_Obsidian ) )
  2238. )
  2239. {
  2240. bSecondRelease = true;
  2241. if( pHelperSrc != NULL )
  2242. {
  2243. CExtRibbonBar * pRibbonBar = DYNAMIC_DOWNCAST( CExtRibbonBar, pHelperSrc );
  2244. if( pRibbonBar != NULL )
  2245. {
  2246. if( pRibbonBar->GetParent()->IsZoomed() )
  2247. bZoomedMode = true;
  2248. } // if( pRibbonBar != NULL )
  2249. } // if( pHelperSrc != NULL )
  2250. }
  2251. nWidthFromLeft += 15;
  2252. bool bActiveGlyph = bFrameActive && ( ! ( bDwmMode && bThirdRelease ) );
  2253. CExtBitmap & _bmpLeft = ( bDwmMode && ( ! m_bmpRibbonNcCornerDwmLeft.IsEmpty() ) ) ? m_bmpRibbonNcCornerDwmLeft : ( bActiveGlyph ? m_bmpRibbonNcCornerActiveLeft : m_bmpRibbonNcCornerInactiveLeft );
  2254. CExtBitmap & _bmpRight = ( bDwmMode && ( ! m_bmpRibbonNcCornerDwmRight.IsEmpty() ) ) ? m_bmpRibbonNcCornerDwmRight : ( bActiveGlyph ? m_bmpRibbonNcCornerActiveRight : m_bmpRibbonNcCornerInactiveRight );
  2255. if( _bmpLeft.IsEmpty() || _bmpRight.IsEmpty() )
  2256. bDrawQatbBackground = false;
  2257. if( bDrawQatbBackground )
  2258. {
  2259. CSize _sizeLeft = _bmpLeft.GetSize();
  2260. CSize _sizeRight = _bmpRight.GetSize();
  2261. if( bThirdRelease )
  2262. {
  2263. _sizeLeft.cy = UiScalingDo( _sizeLeft.cy, __EUIST_Y );
  2264. _sizeRight.cy = UiScalingDo( _sizeRight.cy, __EUIST_Y );
  2265. } // if( bThirdRelease )
  2266. INT nMinWidthFromLeft = _sizeLeft.cx + _sizeRight.cx;
  2267. if( nWidthFromLeft < nMinWidthFromLeft )
  2268. nWidthFromLeft = nMinWidthFromLeft;
  2269. CRect rcRibbonNcCornerLeftCP = m_rcRibbonNcCornerLeftCP;
  2270. CRect rcRibbonNcCornerRightCP = m_rcRibbonNcCornerRightCP;
  2271. BYTE nSCA = BYTE(0x0FF);
  2272. CRect rcDstLeft( 0, 0, _sizeLeft.cx, _sizeLeft.cy );
  2273. CRect rcDstRight( _sizeLeft.cx, 0, nWidthFromLeft, _sizeRight.cy );
  2274. if( bThirdRelease )
  2275. {
  2276. if( g_PaintManager.m_nLPY > 96 )
  2277. rcDstLeft.left += 10;
  2278. if( bDwmMode )
  2279. {
  2280. POINT ptOffset = { 4, -2 };
  2281. if( bZoomedMode )
  2282. {
  2283. ptOffset.x -= ::GetSystemMetrics( SM_CXFRAME )/4;
  2284. ptOffset.y += ::GetSystemMetrics( SM_CYFRAME ) - 2;
  2285. }
  2286. rcDstLeft. OffsetRect( ptOffset );
  2287. rcDstRight.OffsetRect( ptOffset );
  2288. if( UiScalingIsEnabled( __EUIST_Y )
  2289. && g_PaintManager.m_nLPY > 96
  2290. )
  2291. {
  2292. rcDstLeft. bottom -= 1;
  2293. rcDstRight.bottom -= 1;
  2294. }
  2295. else
  2296. {
  2297. rcDstLeft. bottom += 1;
  2298. rcDstRight.bottom += 1;
  2299. }
  2300. rcRibbonNcCornerRightCP.left = 0;
  2301. } // if( bDwmMode )
  2302. else
  2303. {
  2304. if( bZoomedMode )
  2305. {
  2306. const POINT ptOffset = { -4, -4 };
  2307. rcDstLeft. OffsetRect( ptOffset );
  2308. rcDstRight.OffsetRect( ptOffset );
  2309. }
  2310. if( ! g_PaintManager.m_bIsWin2000orLater )
  2311. {
  2312. rcRibbonNcCornerRightCP.left = 0;
  2313. } // if( ! g_PaintManager.m_bIsWin2000orLater )
  2314. } // else from if( bDwmMode )
  2315. } // if( bThirdRelease )
  2316. else
  2317. {
  2318. if( bDwmMode )
  2319. {
  2320. POINT ptOffset = { 8, -1 };
  2321. if( bZoomedMode )
  2322. ptOffset.y += ::GetSystemMetrics( SM_CYFRAME );
  2323. rcDstLeft. OffsetRect( ptOffset );
  2324. rcDstRight.OffsetRect( ptOffset );
  2325. if( ! bZoomedMode )
  2326. {
  2327. rcDstLeft. top += 4;
  2328. rcDstRight.top += 4;
  2329. }
  2330. } // if( bDwmMode )
  2331. else
  2332. {
  2333. if( bSecondRelease )
  2334. {
  2335. if( bZoomedMode )
  2336. {
  2337. const POINT ptOffset = { -5, -4 };
  2338. rcDstLeft. OffsetRect( ptOffset );
  2339. rcDstRight.OffsetRect( ptOffset );
  2340. }
  2341. } // if( bSecondRelease )
  2342. } // if( bDwmMode )
  2343. } // else from if( bThirdRelease )
  2344. DWORD dwOldRTF = 0;
  2345. if( bDwmMode )
  2346. {
  2347. dwOldRTF = _bmpLeft.RunTimeFlagsGet();
  2348. _bmpLeft.RunTimeFlagsSet( dwOldRTF | __EXT_BMP_FLAG_NO_RTL_DETECTION );
  2349. }
  2350. _bmpLeft.AlphaBlendSkinParts( dc.m_hDC, rcDstLeft, m_rcRibbonNcCornerLeftCP, CExtBitmap::__EDM_STRETCH, true, true, nSCA );
  2351. if( bDwmMode )
  2352. {
  2353. _bmpLeft.RunTimeFlagsSet( dwOldRTF );
  2354. dwOldRTF = _bmpRight.RunTimeFlagsGet();
  2355. _bmpRight.RunTimeFlagsSet( dwOldRTF | __EXT_BMP_FLAG_NO_RTL_DETECTION );
  2356. // if( bSecondRelease )
  2357. // rcDstRight.right -= rcRibbonNcCornerRightCP.left + rcRibbonNcCornerRightCP.right;
  2358. }
  2359. rcDstRight.right -= RibbonQuickAccessBar_GetAdditionalSpaceAtRight( bDwmMode, pHelperSrc );
  2360. _bmpRight.AlphaBlendSkinParts( dc.m_hDC, rcDstRight, rcRibbonNcCornerRightCP, CExtBitmap::__EDM_STRETCH, true, true, nSCA );
  2361. if( bDwmMode )
  2362. _bmpRight.RunTimeFlagsSet( dwOldRTF );
  2363. } // if( bDrawQatbBackground )
  2364. INT nTextLen = 0;
  2365. if( pHelperSrc != NULL
  2366. && pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtRibbonBar) )
  2367. )
  2368. {
  2369. CExtRibbonBar * pRibbonBar = STATIC_DOWNCAST( CExtRibbonBar, pHelperSrc );
  2370. CRect rcIcon( 0, 0, 0, 0 );
  2371. if( bDwmMode
  2372. && pRectDwmText != NULL
  2373. && LPCTSTR(strDwmCaptionTitle) != NULL
  2374. && ( nTextLen = INT(_tcslen(LPCTSTR(strDwmCaptionTitle))) ) > 0
  2375. //  && pRectDwmText->left < pRectDwmText->right
  2376. //  && pRectDwmText->top < pRectDwmText->bottom
  2377. //  && dc.RectVisible( pRectDwmText )
  2378. )
  2379. {
  2380. CWnd * pWnd = (CWnd*)pHelperSrc;
  2381. bool bRTL = ( (pWnd->GetExStyle()&WS_EX_LAYOUTRTL) != 0 ) ? true : false;
  2382. for( ; (pWnd->GetStyle()&WS_CHILD) != 0; pWnd = pWnd->GetParent() );
  2383. if( pWnd != NULL )
  2384. {
  2385. CRect rcText = *pRectDwmText;
  2386. if( pRibbonBar->m_pExtNcFrameImpl != NULL )
  2387. {
  2388. bool bMode2007_R1 = IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R1 ) ) ? true : false;
  2389. bool bMode2010    = IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2010_Impl ) )    ? true : false;
  2390. if( bMode2007_R1 || bMode2010 )
  2391. {
  2392. CExtCmdIcon _icon;
  2393. pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_GetIcon( _icon );
  2394. if( ! _icon.IsEmpty() )
  2395. {
  2396. CSize _sizeIcon = _icon.GetSize();
  2397. ASSERT( _sizeIcon.cx > 0 && _sizeIcon.cy > 0 );
  2398. INT nIconTop = rcText.top + ( rcText.Height() - _sizeIcon.cy ) / 2;
  2399. if( bMode2010 )
  2400. {
  2401. //  if( bRTL )
  2402. //  {
  2403. //  rcIcon = pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_GetNcHtRect( HTCAPTION, false );
  2404. //  rcIcon.left = rcIcon.right - _sizeIcon.cx;
  2405. //  rcIcon.bottom = rcIcon.top + _sizeIcon.cy;
  2406. //  rcIcon.OffsetRect( - ::GetSystemMetrics( SM_CXFRAME ), rcText.top - rcIcon.top + ( rcText.Height() - _sizeIcon.cy ) / 2 + ( pWnd->IsZoomed() ? (-2) : 1 ) );
  2407. //  }
  2408. //  else
  2409. {
  2410. rcIcon = pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_GetNcHtRect( HTSYSMENU, false );
  2411. rcIcon.right = rcIcon.left + _sizeIcon.cx;
  2412. rcIcon.bottom = rcIcon.top + _sizeIcon.cy;
  2413. if( bRTL )
  2414. {
  2415. CRect rcWnd;
  2416. pWnd->GetWindowRect( &rcWnd );
  2417. rcIcon.OffsetRect( - rcWnd.Width() + _sizeIcon.cx * 2 , 0 );
  2418. }
  2419. else
  2420. rcIcon.OffsetRect( ::GetSystemMetrics( SM_CXFRAME ), 0 );
  2421. rcIcon.OffsetRect( 0, rcText.top - rcIcon.top + ( rcText.Height() - _sizeIcon.cy ) / 2 + ( pWnd->IsZoomed() ? (-2) : 1 ) );
  2422. }
  2423. }
  2424. else
  2425. {
  2426. rcIcon.SetRect( rcText.left, nIconTop, rcText.left + _sizeIcon.cx, nIconTop + _sizeIcon.cy );
  2427. INT nV = ::GetSystemMetrics( SM_CXFRAME );
  2428. rcIcon.OffsetRect( nV, 0 );
  2429. rcText.left = rcIcon.right + nV;
  2430. }
  2431. if( dc.RectVisible( &rcIcon ) )
  2432. {
  2433. DWORD dwOldRTF = 0;
  2434. CExtCmdIcon::e_paint_type_t ePT = CExtCmdIcon::__PAINT_NORMAL;
  2435. CWnd * pFrameWnd = pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_GetFrameWindow();
  2436. if( pFrameWnd != NULL
  2437. && (! pFrameWnd->IsWindowEnabled() )
  2438. )
  2439. ePT = CExtCmdIcon::__PAINT_DISABLED;
  2440. CExtBitmap & _bmp = _icon.GetBitmap( ePT, this );
  2441. if( bDwmMode && bRTL )
  2442. {
  2443. dwOldRTF = _bmp.RunTimeFlagsGet();
  2444. _bmp.RunTimeFlagsSet( dwOldRTF | __EXT_BMP_FLAG_NO_RTL_DETECTION );
  2445. }
  2446. if( bRTL )
  2447. {
  2448. CExtBitmap _bmp2 = _bmp;
  2449. _bmp2.FlipHorizontal();
  2450. if( ! _bmp2.IsEmpty() )
  2451. {
  2452. CSize _size = _bmp2.GetSize();
  2453. _bmp2.AlphaBlend(
  2454. dc.m_hDC,
  2455. rcIcon.left, rcIcon.top, rcIcon.Width(), rcIcon.Height(),
  2456. 0, 0, rcIcon.Width(), rcIcon.Height()
  2457. );
  2458. }
  2459. }
  2460. else
  2461. {
  2462. _icon.Paint(
  2463. this,
  2464. dc,
  2465. rcIcon,
  2466. pWnd->IsWindowEnabled() ? CExtCmdIcon::__PAINT_NORMAL : CExtCmdIcon::__PAINT_DISABLED
  2467. );
  2468. }
  2469. if( bDwmMode && bRTL )
  2470. _bmp.RunTimeFlagsSet( dwOldRTF );
  2471. }
  2472. } // if( ! _icon.IsEmpty() )
  2473. } // if( bMode2007_R1 || bMode2010 )
  2474. }
  2475. if( pRectDwmText->left < pRectDwmText->right
  2476. && pRectDwmText->top < pRectDwmText->bottom
  2477. && dc.RectVisible( pRectDwmText )
  2478. )
  2479. {
  2480. HWND hWndOpenThemeData = pWnd->m_hWnd;
  2481. if( g_PaintManager.m_UxTheme.OpenThemeDataEx( hWndOpenThemeData, VSCLASS_WINDOW, __EXT_UX_OTD_NONCLIENT ) != NULL )
  2482. { // if extended theme data was open successfully
  2483. static const int g_nDwmGlowSize2007 = 10;
  2484. CExtSafeString strWindowText = LPCTSTR(strDwmCaptionTitle);
  2485. CFont * pOldFont = dc.SelectObject( &m_FontCaption );
  2486. INT nTextWidthRequredPX = rcText.Width() - g_nDwmGlowSize2007 * 2;
  2487. CExtUxTheme::__EXT_UX_DTTOPTS dtoMeasure = { sizeof(CExtUxTheme::__EXT_UX_DTTOPTS) };
  2488. dtoMeasure.dwFlags = __EXT_UX_DTT_COMPOSITED | __EXT_UX_DTT_GLOWSIZE;
  2489. dtoMeasure.iGlowSize = g_nDwmGlowSize2007;
  2490. CRect rcTextMeasure;
  2491. rcTextMeasure.SetRect( 0, 0, 0, 0 );
  2492. g_PaintManager.m_UxTheme.GetThemeTextExtent(
  2493. dc.m_hDC,
  2494. 0,
  2495. 0,
  2496. strWindowText,
  2497. -1,
  2498. DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOPREFIX|DT_CALCRECT,
  2499. NULL,
  2500. &rcTextMeasure
  2501. );
  2502. INT nTextWidthCurrentPX = rcTextMeasure.Width();
  2503.   bool bDrawText = true;
  2504.   if( nTextWidthCurrentPX > nTextWidthRequredPX )
  2505. {
  2506.   bDrawText = false;
  2507. INT nLenCalc = strWindowText.GetLength() - 1;
  2508. for( ; nLenCalc > 0; nLenCalc -- )
  2509. {
  2510. CExtSafeString strCalc = strWindowText.Left( nLenCalc );
  2511. //  if( bRTL )
  2512. //  {
  2513. //  CString strTmp = strCalc;
  2514. //  strCalc = _T("...");
  2515. //  strCalc += strTmp;
  2516. //  } // if( bRTL )
  2517. //  else
  2518. strCalc += _T("...");
  2519. rcTextMeasure.SetRect( 0, 0, 0, 0 );
  2520. g_PaintManager.m_UxTheme.GetThemeTextExtent(
  2521. dc.m_hDC,
  2522. 0,
  2523. 0,
  2524. strCalc,
  2525. -1,
  2526. DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOPREFIX|DT_CALCRECT,
  2527. NULL,
  2528. &rcTextMeasure
  2529. );
  2530. INT nTextWidthCurrentPX = rcTextMeasure.Width();
  2531. if( nTextWidthCurrentPX <= nTextWidthRequredPX )
  2532. {
  2533. strWindowText = strCalc;
  2534. bDrawText = true;
  2535. break;
  2536. } // if( nTextWidthCurrentPX <= nTextWidthRequredPX )
  2537. } // for( ; nLenCalc > 0; nLenCalc -- )
  2538. } // if( nTextWidthCurrentPX > nTextWidthRequredPX )
  2539. dc.SelectObject( &pOldFont );
  2540. if( bDrawText )
  2541. {
  2542. DWORD dwOldLayout1 = LAYOUT_LTR, dwOldLayout2 = LAYOUT_LTR;
  2543. if( bRTL )
  2544. dwOldLayout1 = dc.SetLayout( LAYOUT_RTL );
  2545. CExtMemoryDC dc32(
  2546. &dc,
  2547. &rcText,
  2548. CExtMemoryDC::MDCOPT_TO_MEMORY
  2549. | CExtMemoryDC::MDCOPT_FORCE_DIB
  2550. | CExtMemoryDC::MDCOPT_FILL_BITS
  2551. | CExtMemoryDC::MDCOPT_DIB_NEGATIVE_HEIGHT
  2552. );
  2553. ASSERT( dc32.GetSafeHdc() != NULL );
  2554. dc.FillSolidRect( &rcText, RGB(0,0,0) );
  2555. if( bRTL )
  2556. dwOldLayout2 = dc32.SetLayout( LAYOUT_RTL );
  2557. pOldFont = dc32.SelectObject( &m_FontCaption );
  2558. CExtUxTheme::__EXT_UX_DTTOPTS dto = { sizeof(CExtUxTheme::__EXT_UX_DTTOPTS) };
  2559. dto.dwFlags = __EXT_UX_DTT_TEXTCOLOR;
  2560. dto.iGlowSize = g_nDwmGlowSize2007;
  2561. if( ( ! g_PaintManager.m_bIsWin7OrLater ) && pWnd->IsZoomed() )
  2562. dto.crText = RGB(0x0FF,0x0FF,0x0FF);
  2563. else
  2564. {
  2565. dto.dwFlags |= __EXT_UX_DTT_COMPOSITED | __EXT_UX_DTT_GLOWSIZE;
  2566. dto.crText = bFrameActive ? RGB(0,0,0) : RGB(0x060,0x060,0x060);
  2567. }
  2568. g_PaintManager.m_UxTheme.DrawThemeTextEx(
  2569. dc32.m_hDC,
  2570. 0,
  2571. 0,
  2572. strWindowText,
  2573. -1,
  2574. DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_NOPREFIX,
  2575. rcText,
  2576. &dto
  2577. );
  2578. dc32.SelectObject( pOldFont );
  2579. if( bRTL )
  2580. {
  2581. dc.SetLayout( dwOldLayout1 );
  2582. dc32.SetLayout( dwOldLayout2 );
  2583. } // if( bRTL )
  2584. } // if( bDrawText )
  2585. g_PaintManager.m_UxTheme.CloseThemeData();
  2586. } // if extended theme data was open successfully
  2587. }
  2588. } // if( pWnd != NULL )
  2589. } // if( bDwmMode ...
  2590. if( pRibbonBar->m_pExtNcFrameImpl != NULL
  2591. && pRibbonBar->RibbonLayout_IsFrameIntegrationEnabled()
  2592. && pRibbonBar->RibbonQuickAccessBar_AboveTheRibbonGet()
  2593. && Ribbon_IsSystemMenuIconPresent()
  2594. )
  2595. {
  2596. CWnd * pWndFrameImpl = pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_GetFrameWindow();
  2597. if( pWndFrameImpl->GetSafeHwnd() != NULL )
  2598. {
  2599. CRect rcSeparator( 0, 0, 0, 0 );
  2600. if( bDwmMode )
  2601. {
  2602. rcSeparator.SetRect( rcIcon.right + 2, rcIcon.top, rcIcon.right + 3, rcIcon.bottom );
  2603. CExtMemoryDC dc32(
  2604. &dc,
  2605. &rcSeparator,
  2606. CExtMemoryDC::MDCOPT_TO_MEMORY
  2607. | CExtMemoryDC::MDCOPT_FORCE_DIB
  2608. | CExtMemoryDC::MDCOPT_FILL_BITS
  2609. | CExtMemoryDC::MDCOPT_DIB_NEGATIVE_HEIGHT
  2610. );
  2611. ASSERT( dc32.GetSafeHdc() != NULL );
  2612. dc32.FillSolidRect( &rcSeparator, RGB(0,0,0) );
  2613. CPen _penGray( PS_SOLID, 1, RGB(64,64,64) ), _penWhite( PS_SOLID, 1, RGB(128,128,128) );
  2614. CPen * pPenOld = dc32.SelectObject( &_penGray );
  2615. dc32.MoveTo( rcSeparator.left, rcSeparator.top );
  2616. dc32.LineTo( rcSeparator.left, rcSeparator.bottom );
  2617. dc32.SelectObject( &_penWhite );
  2618. dc32.MoveTo( rcSeparator.right, rcSeparator.top );
  2619. dc32.LineTo( rcSeparator.right, rcSeparator.bottom );
  2620. dc32.SelectObject( pPenOld );
  2621. }
  2622. else
  2623. {
  2624. CRect rcWnd;
  2625. pWndFrameImpl->GetWindowRect( &rcWnd );
  2626. rcIcon = pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_GetNcHtRect(HTSYSMENU,false,false,false,NULL,&rcWnd);
  2627. rcSeparator.SetRect( rcIcon.right + 0, rcIcon.top, rcIcon.right + 2, rcIcon.bottom - 3 );
  2628. if( pWndFrameImpl->IsZoomed() )
  2629. rcSeparator.OffsetRect( m_rcNcFrameBordersActive.left, m_rcNcFrameBordersActive.top );
  2630. Ribbon_PaintSeparator( dc, rcSeparator, NULL );
  2631. }
  2632. }
  2633. }
  2634. }
  2635. }
  2636. bool CExtPaintManager::Ribbon_QuickAccessContentExpandButtonCalcLayout(
  2637. CDC & dc,
  2638. CExtRibbonButtonQuickAccessContentExpand * pQACEB,
  2639. LPARAM lParam // = 0L
  2640. )
  2641. {
  2642. ASSERT_VALID( this );
  2643. ASSERT_VALID( pQACEB );
  2644. dc;
  2645. lParam;
  2646. pQACEB->Size( CSize(13,22) );
  2647. return true;
  2648. }
  2649. bool CExtPaintManagerOffice2007_Impl::Ribbon_QuickAccessContentExpandButtonCalcLayout(
  2650. CDC & dc,
  2651. CExtRibbonButtonQuickAccessContentExpand * pQACEB,
  2652. LPARAM lParam // = 0L
  2653. )
  2654. {
  2655. ASSERT_VALID( this );
  2656. ASSERT_VALID( pQACEB );
  2657. if( IsHighContrast() )
  2658. return
  2659. CExtPaintManagerXP::Ribbon_QuickAccessContentExpandButtonCalcLayout(
  2660. dc,
  2661. pQACEB,
  2662. lParam
  2663. );
  2664. if( m_bmpArrRibbonQACEB.IsEmpty()
  2665. || m_nRibbonHeightOfQACEB <= 0
  2666. )
  2667. return
  2668. CExtPaintManagerOffice2003::Ribbon_QuickAccessContentExpandButtonCalcLayout(
  2669. dc,
  2670. pQACEB,
  2671. lParam
  2672. );
  2673. CSize _size = m_bmpArrRibbonQACEB.GetSize();
  2674. _size.cy = m_nRibbonHeightOfQACEB;
  2675. _size.cx = UiScalingDo( _size.cx, __EUIST_X );
  2676. _size.cy = UiScalingDo( _size.cy, __EUIST_Y );
  2677. CSize _sizeAboveTheRibbonShiftQACEB =
  2678. Ribbon_QuickAccessContentExpandGetShift(
  2679. dc,
  2680. pQACEB,
  2681. lParam
  2682. );
  2683. _size.cx += _sizeAboveTheRibbonShiftQACEB.cx;
  2684. _size.cy += _sizeAboveTheRibbonShiftQACEB.cy;
  2685. pQACEB->Size( _size );
  2686. return true;
  2687. }
  2688. bool CExtPaintManager::Ribbon_QuickAccessContentExpandButtonPaint(
  2689. CDC & dc,
  2690. CExtRibbonButtonQuickAccessContentExpand * pQACEB,
  2691. LPARAM lParam // = 0L
  2692. )
  2693. {
  2694. ASSERT_VALID( this );
  2695. ASSERT_VALID( pQACEB );
  2696. CRect rcTBB = *pQACEB;
  2697. // PaintToolbarExpandButton(
  2698. // dc,
  2699. // rcTBB,
  2700. // true,
  2701. // true,
  2702. // true,
  2703. // pQACEB->IsPressed(),
  2704. // pQACEB->IsHover(),
  2705. // pQACEB,
  2706. // lParam,
  2707. // true
  2708. // );
  2709. CExtPaintManager::PAINTPUSHBUTTONDATA _ppbd(
  2710. pQACEB,
  2711. true,
  2712. rcTBB,
  2713. _T(""),
  2714. NULL,
  2715. true,
  2716. pQACEB->IsHover(),
  2717. pQACEB->IsPressed(),
  2718. false,
  2719. pQACEB->IsEnabled(),
  2720. true,false,false,
  2721. __ALIGN_HORIZ_CENTER | __ALIGN_VERT_CENTER,
  2722. NULL,
  2723. true,
  2724. 0,
  2725. true
  2726. );
  2727. _ppbd.m_lParam = lParam;
  2728. PaintPushButton( dc, _ppbd );
  2729. return true;
  2730. }
  2731. bool CExtPaintManagerOffice2007_Impl::Ribbon_QuickAccessContentExpandButtonPaint(
  2732. CDC & dc,
  2733. CExtRibbonButtonQuickAccessContentExpand * pQACEB,
  2734. LPARAM lParam // = 0L
  2735. )
  2736. {
  2737. ASSERT_VALID( this );
  2738. ASSERT_VALID( pQACEB );
  2739. if( IsHighContrast() )
  2740. return 
  2741. CExtPaintManagerXP::Ribbon_QuickAccessContentExpandButtonPaint(
  2742. dc,
  2743. pQACEB,
  2744. lParam
  2745. );
  2746. if( m_bmpArrRibbonQACEB.IsEmpty()
  2747. || m_nRibbonHeightOfQACEB <= 0
  2748. )
  2749. return 
  2750. CExtPaintManagerOffice2003::Ribbon_QuickAccessContentExpandButtonPaint(
  2751. dc,
  2752. pQACEB,
  2753. lParam
  2754. );
  2755. INT nBmpIdx = m_nIdxRibbonQACEB_Normal;
  2756. bool bSelTrackingMode = false;
  2757. const CExtToolControlBar * pToolBar = pQACEB->GetBar();
  2758. if( pToolBar != NULL )
  2759. {
  2760. CExtMenuControlBar * pMenuBar = DYNAMIC_DOWNCAST( CExtMenuControlBar, pToolBar );
  2761. if( pMenuBar != NULL
  2762. && pMenuBar->IsMenuBarTracking()
  2763. )
  2764. {
  2765. int nFlatTrackingIndex = pMenuBar->_FlatTrackingIndexGet();
  2766. if( nFlatTrackingIndex >= 0 )
  2767. {
  2768. int nIndexOfTBB = pMenuBar->_GetIndexOf( pQACEB );
  2769. if( nFlatTrackingIndex == nIndexOfTBB )
  2770. bSelTrackingMode = true;
  2771. }
  2772. }
  2773. }
  2774. if( bSelTrackingMode )
  2775. nBmpIdx = m_nIdxRibbonQACEB_Hover;
  2776. else if( pQACEB->IsEnabled() )
  2777. {
  2778. if( pQACEB->IsPressed() )
  2779. nBmpIdx = m_nIdxRibbonQACEB_Pressed;
  2780. else if( pQACEB->IsHover() )
  2781. nBmpIdx = m_nIdxRibbonQACEB_Hover;
  2782. }
  2783. CSize _sizeAboveTheRibbonShiftQACEB =
  2784. Ribbon_QuickAccessContentExpandGetShift(
  2785. dc,
  2786. pQACEB,
  2787. lParam
  2788. );
  2789. CRect rcTBB = *pQACEB;
  2790. rcTBB.left += _sizeAboveTheRibbonShiftQACEB.cx;
  2791. rcTBB.top  += _sizeAboveTheRibbonShiftQACEB.cy;
  2792. CRect rcSrc( 0, 0, m_bmpArrRibbonQACEB.GetSize().cx, m_nRibbonHeightOfQACEB );
  2793. rcSrc.OffsetRect( 0, m_nRibbonHeightOfQACEB*nBmpIdx );
  2794. m_bmpArrRibbonQACEB.AlphaBlendSkinParts(
  2795. dc.m_hDC,
  2796. rcTBB,
  2797. rcSrc,
  2798. m_rcRibbonPaddingQACEB,
  2799. CExtBitmap::__EDM_STRETCH,
  2800. true,
  2801. true
  2802. );
  2803. return true;
  2804. }
  2805. CSize CExtPaintManager::Ribbon_QuickAccessContentExpandGetShift(
  2806. CDC & dc,
  2807. CExtRibbonButtonQuickAccessContentExpand * pQACEB,
  2808. LPARAM lParam // = 0L
  2809. )
  2810. {
  2811. ASSERT_VALID( this );
  2812. ASSERT_VALID( pQACEB );
  2813. dc;
  2814. pQACEB;
  2815. lParam;
  2816. return CSize( 0, 0 );
  2817. }
  2818. CSize CExtPaintManagerOffice2007_Impl::Ribbon_QuickAccessContentExpandGetShift(
  2819. CDC & dc,
  2820. CExtRibbonButtonQuickAccessContentExpand * pQACEB,
  2821. LPARAM lParam // = 0L
  2822. )
  2823. {
  2824. ASSERT_VALID( this );
  2825. ASSERT_VALID( pQACEB );
  2826. if( IsHighContrast() )
  2827. return 
  2828. CExtPaintManagerXP::Ribbon_QuickAccessContentExpandGetShift(
  2829. dc,
  2830. pQACEB,
  2831. lParam
  2832. );
  2833. CExtRibbonBar * pRibbonBar =
  2834. DYNAMIC_DOWNCAST(
  2835. CExtRibbonBar,
  2836. pQACEB->GetSafeBar()
  2837. );
  2838. if( pRibbonBar == NULL )
  2839. return CSize( 0, 0 );
  2840. if( ! pRibbonBar->RibbonQuickAccessBar_AboveTheRibbonGet() )
  2841. return CSize( 0, 0 );
  2842. if( pRibbonBar->RibbonLayout_GetFrameCaptionHeight() <= 0 )
  2843. return CSize( 0, 0 );
  2844. if( ! Ribbon_FileButtonIsItegrationSupported() )
  2845. return CSize( 0, 0 );
  2846. CSize _size = m_sizeAboveTheRibbonShiftQACEB;
  2847. _size.cx = UiScalingDo( _size.cx, __EUIST_X );
  2848. _size.cy = UiScalingDo( _size.cy, __EUIST_Y );
  2849. return _size;
  2850. }
  2851. bool CExtPaintManager::Ribbon_DLB_IsVisible(
  2852. CExtRibbonButtonDialogLauncher * pTBB,
  2853. LPARAM lParam // = 0L
  2854. ) const
  2855. {
  2856. ASSERT_VALID( this );
  2857. ASSERT_VALID( pTBB );
  2858. lParam;
  2859. CExtToolControlBar * pBar = pTBB->GetSafeBar();
  2860. if( pBar == NULL )
  2861. return false;
  2862. CExtRibbonPage * pRibbonPage =
  2863. DYNAMIC_DOWNCAST( CExtRibbonPage, pBar );
  2864. if( pRibbonPage == NULL )
  2865. return false;
  2866. if( pRibbonPage->m_bHelperPopupMode
  2867. && ( ! pRibbonPage->m_bHelperAutoHideMode )
  2868. )
  2869. return false;
  2870. return true;
  2871. }
  2872. bool CExtPaintManagerOffice2007_Impl::Ribbon_DLB_IsVisible(
  2873. CExtRibbonButtonDialogLauncher * pTBB,
  2874. LPARAM lParam // = 0L
  2875. ) const
  2876. {
  2877. ASSERT_VALID( this );
  2878. ASSERT_VALID( pTBB );
  2879. if( IsHighContrast() )
  2880. return 
  2881. CExtPaintManagerXP::Ribbon_DLB_IsVisible(
  2882. pTBB,
  2883. lParam
  2884. );
  2885. if( ! IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R1 ) ) )
  2886. return true;
  2887. return
  2888. CExtPaintManagerOffice2003::Ribbon_DLB_IsVisible( pTBB, lParam );
  2889. }
  2890. CSize CExtPaintManager::Ribbon_DLB_CalcSize(
  2891. CDC & dc,
  2892. CExtRibbonButtonDialogLauncher * pTBB,
  2893. LPARAM lParam // = 0L
  2894. )
  2895. {
  2896. ASSERT_VALID( this );
  2897. ASSERT_VALID( (&dc) );
  2898. ASSERT( dc.GetSafeHdc() != NULL );
  2899. ASSERT_VALID( pTBB );
  2900. dc;
  2901. pTBB;
  2902. lParam;
  2903. CSize _size( 17, 15 );
  2904. _size.cx = UiScalingDo( _size.cx, __EUIST_X );
  2905. _size.cy = UiScalingDo( _size.cy, __EUIST_Y );
  2906. return _size;
  2907. }
  2908. CSize CExtPaintManagerOffice2007_Impl::Ribbon_DLB_CalcSize(
  2909. CDC & dc,
  2910. CExtRibbonButtonDialogLauncher * pTBB,
  2911. LPARAM lParam // = 0L
  2912. )
  2913. {
  2914. ASSERT_VALID( this );
  2915. ASSERT_VALID( (&dc) );
  2916. ASSERT( dc.GetSafeHdc() != NULL );
  2917. ASSERT_VALID( pTBB );
  2918. if( IsHighContrast() )
  2919. return 
  2920. CExtPaintManagerXP::Ribbon_DLB_CalcSize(
  2921. dc,
  2922. pTBB,
  2923. lParam
  2924. );
  2925. if( m_arrBmpRibbonDLB.IsEmpty()
  2926. || m_nRibbonHeightOfOneDLB <= 0
  2927. || m_nDlbIdxDisabled < 0
  2928. || m_nDlbIdxNormal < 0
  2929. || m_nDlbIdxHover < 0
  2930. || m_nDlbIdxPressed < 0
  2931. )
  2932. return
  2933. CExtPaintManagerOffice2003::Ribbon_DLB_CalcSize(
  2934. dc,
  2935. pTBB,
  2936. lParam
  2937. );
  2938. CSize _size = m_arrBmpRibbonDLB.GetSize();
  2939. _size.cy = m_nRibbonHeightOfOneDLB;
  2940. _size.cx = UiScalingDo( _size.cx, __EUIST_X );
  2941. _size.cy = UiScalingDo( _size.cy, __EUIST_Y );
  2942. return _size;
  2943. }
  2944. void CExtPaintManager::Ribbon_DLB_Paint(
  2945. CDC & dc,
  2946. CExtRibbonButtonDialogLauncher * pTBB,
  2947. LPARAM lParam // = 0L
  2948. )
  2949. {
  2950. ASSERT_VALID( this );
  2951. ASSERT_VALID( (&dc) );
  2952. ASSERT( dc.GetSafeHdc() != NULL );
  2953. ASSERT_VALID( pTBB );
  2954. lParam;
  2955. CExtPaintManager::PAINTPUSHBUTTONDATA _ppbd(
  2956. pTBB,
  2957. true,
  2958. *pTBB,
  2959. _T("..."),
  2960. NULL,
  2961. false,
  2962. pTBB->IsHover(),
  2963. pTBB->IsPressed(),
  2964. false,
  2965. pTBB->IsEnabled(),
  2966. true,false,false,
  2967. __ALIGN_HORIZ_CENTER | __ALIGN_VERT_CENTER,
  2968. NULL,
  2969. false,
  2970. 0,
  2971. false
  2972. );
  2973. PaintPushButton( dc, _ppbd );
  2974. }
  2975. void CExtPaintManagerOffice2007_Impl::Ribbon_DLB_Paint(
  2976. CDC & dc,
  2977. CExtRibbonButtonDialogLauncher * pTBB,
  2978. LPARAM lParam // = 0L
  2979. )
  2980. {
  2981. ASSERT_VALID( this );
  2982. ASSERT_VALID( (&dc) );
  2983. ASSERT( dc.GetSafeHdc() != NULL );
  2984. ASSERT_VALID( pTBB );
  2985. if( IsHighContrast() )
  2986. {
  2987. CExtPaintManagerXP::Ribbon_DLB_Paint(
  2988. dc,
  2989. pTBB,
  2990. lParam
  2991. );
  2992. return;
  2993. }
  2994. if( m_arrBmpRibbonDLB.IsEmpty()
  2995. || m_nRibbonHeightOfOneDLB <= 0
  2996. || m_nDlbIdxDisabled < 0
  2997. || m_nDlbIdxNormal < 0
  2998. || m_nDlbIdxHover < 0
  2999. || m_nDlbIdxPressed < 0
  3000. )
  3001. {
  3002. CExtPaintManagerOffice2003::Ribbon_DLB_Paint(
  3003. dc,
  3004. pTBB,
  3005. lParam
  3006. );
  3007. return;
  3008. }
  3009. INT nBmpIdx = m_nDlbIdxDisabled;
  3010. if( pTBB->IsEnabled() )
  3011. {
  3012. if( pTBB->IsPressed() )
  3013. nBmpIdx = m_nDlbIdxPressed;
  3014. else if( pTBB->IsHover() )
  3015. nBmpIdx = m_nDlbIdxHover;
  3016. else
  3017. nBmpIdx = m_nDlbIdxNormal;
  3018. } // if( pTBB->IsEnabled() )
  3019. ASSERT( nBmpIdx >= 0 );
  3020. CRect rcDst = *pTBB;
  3021. CRect rcSrc( 0, 0, m_arrBmpRibbonDLB.GetSize().cx, m_nRibbonHeightOfOneDLB );
  3022. rcSrc.OffsetRect( 0, nBmpIdx*m_nRibbonHeightOfOneDLB );
  3023. m_arrBmpRibbonDLB.AlphaBlendSkinParts(
  3024. dc.m_hDC,
  3025. rcDst,
  3026. rcSrc,
  3027. rcRibbonContentPaddingDLB,
  3028. CExtBitmap::__EDM_STRETCH,
  3029. true,
  3030. true
  3031. );
  3032. }
  3033. void CExtPaintManager::Ribbon_FileMenuButtonQuery(
  3034. LPVOID pData,
  3035. CExtCmdIcon * pIcon, // = NULL
  3036. __EXT_MFC_SAFE_LPCTSTR sText, // = NULL
  3037. LPARAM lParam // = 0L
  3038. )
  3039. {
  3040. ASSERT_VALID( this );
  3041. ASSERT( pData != NULL );
  3042. CExtPopupMenuWnd::RIBBONFILEMENUBUTTONQUERY & _rfmbq = *((CExtPopupMenuWnd::RIBBONFILEMENUBUTTONQUERY*)pData);
  3043. _rfmbq.m_bQueryHandled = true;
  3044. if( _rfmbq.m_pDC != NULL )
  3045. {
  3046. ASSERT( _rfmbq.m_pDC->GetSafeHdc() != NULL );
  3047. PAINTPUSHBUTTONDATA _ppbd(
  3048. _rfmbq.m_pPopup,
  3049. true,
  3050. _rfmbq.m_rcButton,
  3051. sText,
  3052. pIcon,
  3053. false,
  3054. _rfmbq.m_bHover,
  3055. _rfmbq.m_bPressed,
  3056. false,
  3057. true,
  3058. true,
  3059. false,
  3060. false,
  3061. __ALIGN_HORIZ_CENTER | __ALIGN_VERT_CENTER,
  3062. NULL,
  3063. false,
  3064. 0,
  3065. false
  3066. );
  3067. _ppbd.m_lParam = lParam;
  3068. PaintPushButton( *_rfmbq.m_pDC, _ppbd );
  3069. } // if( _rfmbq.m_pDC != NULL )
  3070. else
  3071. {
  3072. CSize _sizeIcon( 0, 0 ), _sizeText( 0, 0 );
  3073. if( pIcon != NULL
  3074. && ( ! pIcon->IsEmpty() )
  3075. )
  3076. _sizeIcon = pIcon->GetSize();
  3077. if( sText != NULL
  3078. && INT( _tcslen( sText ) ) > 0
  3079. )
  3080. {
  3081. CWindowDC dc( NULL );
  3082. CExtSafeString s = sText;
  3083. _sizeText = stat_CalcTextDimension( dc, m_FontNormal, s, DT_SINGLELINE|DT_LEFT|DT_TOP ).Size();
  3084. }
  3085. _rfmbq.m_nMeasuredWidth = _sizeIcon.cx + _sizeText.cx + 10;
  3086. if( _sizeIcon.cx > 0 )
  3087. _rfmbq.m_nMeasuredWidth += 5;
  3088. } // else from if( _rfmbq.m_pDC != NULL )
  3089. }
  3090. void CExtPaintManagerOffice2007_Impl::Ribbon_FileMenuButtonQuery(
  3091. LPVOID pData,
  3092. CExtCmdIcon * pIcon, // = NULL
  3093. __EXT_MFC_SAFE_LPCTSTR sText, // = NULL
  3094. LPARAM lParam // = 0L
  3095. )
  3096. {
  3097. ASSERT_VALID( this );
  3098. ASSERT( pData != NULL );
  3099. if( IsHighContrast() )
  3100. {
  3101. CExtPaintManagerXP::Ribbon_FileMenuButtonQuery(
  3102. pData,
  3103. pIcon,
  3104. sText,
  3105. lParam
  3106. );
  3107. return;
  3108. }
  3109. CExtPopupMenuWnd::RIBBONFILEMENUBUTTONQUERY & _rfmbq = *((CExtPopupMenuWnd::RIBBONFILEMENUBUTTONQUERY*)pData);
  3110. _rfmbq.m_bQueryHandled = true;
  3111. if( _rfmbq.m_pDC != NULL )
  3112. {
  3113. ASSERT( _rfmbq.m_pDC->GetSafeHdc() != NULL );
  3114. //  PAINTPUSHBUTTONDATA _ppbd(
  3115. //  _rfmbq.m_pPopup,
  3116. //  true,
  3117. //  _rfmbq.m_rcButton,
  3118. //  sText,
  3119. //  pIcon,
  3120. //  false,
  3121. //  _rfmbq.m_bHover,
  3122. //  _rfmbq.m_bPressed,
  3123. //  false,
  3124. //  true,
  3125. //  true,
  3126. //  false,
  3127. //  false,
  3128. //  __ALIGN_HORIZ_CENTER
  3129. //  | __ALIGN_VERT_CENTER,
  3130. //  NULL,
  3131. //  false,
  3132. //  0,
  3133. //  false
  3134. //  );
  3135. //  _ppbd.m_lParam = lParam;
  3136. //  PaintPushButton( *_rfmbq.m_pDC, _ppbd );
  3137. INT nImgIndex = INT(__E07BI_NORMAL);
  3138. if( _rfmbq.m_bPressed )
  3139. nImgIndex = INT(__E07BI_PRESSED);
  3140. else if( _rfmbq.m_bHover )
  3141. nImgIndex = INT(__E07BI_HOVER);
  3142. nImgIndex = m_arrIndicesButtonTS[nImgIndex];
  3143. CExtBitmap & _bmp = m_bmpArrButtonTS[ INT(__EBTSA_SOLID) ];
  3144. CSize _sizeBmp = _bmp.GetSize();
  3145. CRect rcSrc( 0, 0, _sizeBmp.cx, m_nHeightOfButtonTS );
  3146. rcSrc.OffsetRect( 0, m_nHeightOfButtonTS*nImgIndex );
  3147. if( (! _bmp.IsEmpty() )
  3148. && (! rcSrc.IsRectEmpty() )
  3149. && _rfmbq.m_pDC->RectVisible( &_rfmbq.m_rcButton )
  3150. )
  3151. _bmp.AlphaBlendSkinParts(
  3152. *_rfmbq.m_pDC,
  3153. _rfmbq.m_rcButton,
  3154. rcSrc,
  3155. m_rcPaddingOfButtonTS,
  3156. CExtBitmap::__EDM_STRETCH,
  3157. true
  3158. );
  3159. CRect rcText = _rfmbq.m_rcButton;
  3160. rcText.DeflateRect( 10, 0 );
  3161. if( pIcon != NULL && ( ! pIcon->IsEmpty() ) )
  3162. {
  3163. CSize _sizeIcon = pIcon->GetSize();
  3164. CRect rcIcon(
  3165. rcText.left,
  3166. rcText.top,
  3167. rcText.left + _sizeIcon.cx,
  3168. rcText.bottom
  3169. );
  3170. rcIcon.OffsetRect(
  3171. 0,
  3172. ( rcIcon.Height() - _sizeIcon.cy ) / 2
  3173. );
  3174. rcIcon.bottom = rcIcon.top + _sizeIcon.cy;
  3175. rcText.left = rcIcon.right + 3;
  3176. CExtCmdIcon::e_paint_type_t ePT = CExtCmdIcon::__PAINT_NORMAL;
  3177. if( _rfmbq.m_bPressed )
  3178. ePT = CExtCmdIcon::__PAINT_PRESSED;
  3179. else if( _rfmbq.m_bHover )
  3180. ePT = CExtCmdIcon::__PAINT_HOVER;
  3181. pIcon->Paint(
  3182. this,
  3183. _rfmbq.m_pDC->m_hDC,
  3184. rcIcon,
  3185. ePT
  3186. );
  3187. } // if( pIcon != NULL && ( ! pIcon->IsEmpty() ) )
  3188. INT nTextLength = ( sText == NULL ) ? 0 : INT( _tcslen( sText ) );
  3189. if( nTextLength > 0 )
  3190. {
  3191. CExtSafeString s = sText;
  3192. CSize _sizeText = stat_CalcTextDimension( *_rfmbq.m_pDC, m_FontRibbonNormal, s, DT_SINGLELINE|DT_LEFT|DT_TOP ).Size();
  3193. rcText.OffsetRect(
  3194. 0,
  3195. ( rcText.Height() - _sizeText.cy ) / 2
  3196. );
  3197. rcText.bottom = rcText.top + _sizeText.cy;
  3198. CFont * pOldFont = _rfmbq.m_pDC->SelectObject( &m_FontRibbonNormal );
  3199. int nOldBkMode = _rfmbq.m_pDC->SetBkMode( TRANSPARENT );
  3200. COLORREF clrOldText = _rfmbq.m_pDC->SetTextColor( m_clrRibbonButtonNormal );
  3201. Ribbon_PaintText(
  3202. *_rfmbq.m_pDC,
  3203. sText,
  3204. rcText,
  3205. DT_SINGLELINE|DT_LEFT|DT_TOP,
  3206. false,
  3207. &m_bmpRibbonDDA,
  3208. _rfmbq.m_pPopup,
  3209. lParam
  3210. );
  3211. _rfmbq.m_pDC->SetTextColor( clrOldText );
  3212. _rfmbq.m_pDC->SetBkMode( nOldBkMode );
  3213. _rfmbq.m_pDC->SelectObject( pOldFont );
  3214. } // if( nTextLength > 0 || _ppbd.m_bDropDown )
  3215. } // if( _rfmbq.m_pDC != NULL )
  3216. else
  3217. {
  3218. CSize _sizeIcon( 0, 0 ), _sizeText( 0, 0 );
  3219. if( pIcon != NULL
  3220. && ( ! pIcon->IsEmpty() )
  3221. )
  3222. _sizeIcon = pIcon->GetSize();
  3223. if( sText != NULL
  3224. && INT( _tcslen( sText ) ) > 0
  3225. )
  3226. {
  3227. CWindowDC dc( NULL );
  3228. CExtSafeString s = sText;
  3229. _sizeText = stat_CalcTextDimension( dc, m_FontRibbonNormal, s, DT_SINGLELINE|DT_LEFT|DT_TOP ).Size();
  3230. }
  3231. _rfmbq.m_nMeasuredWidth = _sizeIcon.cx + _sizeText.cx + 20;
  3232. if( _sizeIcon.cx > 0 )
  3233. _rfmbq.m_nMeasuredWidth += 3;
  3234. } // else from if( _rfmbq.m_pDC != NULL )
  3235. }
  3236. bool CExtPaintManager::Ribbon_FileButtonIsItegrationSupported() const
  3237. {
  3238. ASSERT_VALID( this );
  3239. return false;
  3240. }
  3241. bool CExtPaintManagerOffice2007_Impl::Ribbon_FileButtonIsItegrationSupported() const
  3242. {
  3243. ASSERT_VALID( this );
  3244. if( IsHighContrast() )
  3245. return CExtPaintManagerXP::Ribbon_FileButtonIsItegrationSupported();
  3246. return m_bRibbonFileButtonItegrationSupported;
  3247. }
  3248. INT CExtPaintManager::Ribbon_FileButtonGetMenuIntersectionHeight() const
  3249. {
  3250. ASSERT_VALID( this );
  3251. return 0;
  3252. }
  3253. INT CExtPaintManagerOffice2007_Impl::Ribbon_FileButtonGetMenuIntersectionHeight() const
  3254. {
  3255. ASSERT_VALID( this );
  3256. if( IsHighContrast() )
  3257. return CExtPaintManagerXP::Ribbon_FileButtonGetMenuIntersectionHeight();
  3258. if( ! Ribbon_FileButtonIsItegrationSupported() )
  3259. return 0;
  3260. INT nRibbonFileButtonMenuIntersectionHeight =
  3261. UiScalingDo( m_nRibbonFileButtonMenuIntersectionHeight, __EUIST_Y );
  3262. return nRibbonFileButtonMenuIntersectionHeight;
  3263. }
  3264. bool CExtPaintManager::Ribbon_FileButtonCalcLayout(
  3265. CDC & dc,
  3266. CExtNcFrameImpl * pExtNcFrameImpl,
  3267. CExtRibbonButtonFile * pFileTBB,
  3268. LPARAM lParam // = 0L
  3269. )
  3270. {
  3271. ASSERT_VALID( this );
  3272. ASSERT( dc.GetSafeHdc() != NULL );
  3273. ASSERT( pExtNcFrameImpl != NULL );
  3274. ASSERT_VALID( pFileTBB );
  3275. dc;
  3276. pExtNcFrameImpl;
  3277. pFileTBB;
  3278. lParam;
  3279. return false;
  3280. }
  3281. bool CExtPaintManagerOffice2007_Impl::Ribbon_FileButtonCalcLayout(
  3282. CDC & dc,
  3283. CExtNcFrameImpl * pExtNcFrameImpl,
  3284. CExtRibbonButtonFile * pFileTBB,
  3285. LPARAM lParam // = 0L
  3286. )
  3287. {
  3288. ASSERT_VALID( this );
  3289. ASSERT( dc.GetSafeHdc() != NULL );
  3290. ASSERT( pExtNcFrameImpl != NULL );
  3291. ASSERT_VALID( pFileTBB );
  3292. if( IsHighContrast() )
  3293. return 
  3294. CExtPaintManagerXP::Ribbon_FileButtonCalcLayout(
  3295. dc,
  3296. pExtNcFrameImpl,
  3297. pFileTBB,
  3298. lParam
  3299. );
  3300. if( m_bmpArrRibbonFileButton.IsEmpty() )
  3301. return false;
  3302. CPoint ptTopLeftTBB( 0, 0 );
  3303. CExtRibbonBar * pRibbonBar = DYNAMIC_DOWNCAST( CExtRibbonBar, pFileTBB->GetBar() );
  3304. if( pRibbonBar != NULL
  3305. && pRibbonBar->RibbonLayout_IsFrameIntegrationEnabled()
  3306. && (! pRibbonBar->RibbonLayout_IsDwmCaptionIntegration() )
  3307. )
  3308. {
  3309. INT nTopBorderHeight = 0;
  3310. INT nFrameCaptionHeight = pRibbonBar->RibbonLayout_GetFrameCaptionHeight( &nTopBorderHeight );
  3311. ptTopLeftTBB.y += nFrameCaptionHeight + nTopBorderHeight;
  3312. }
  3313. CSize _sizeTBB( m_bmpArrRibbonFileButton.GetSize().cx, m_nRibbonFileButtonHeight );
  3314. _sizeTBB.cx = UiScalingDo( _sizeTBB.cx, __EUIST_X );
  3315. _sizeTBB.cy = UiScalingDo( _sizeTBB.cy, __EUIST_Y );
  3316. CRect rcTBB( ptTopLeftTBB, _sizeTBB );
  3317. if( pRibbonBar != NULL
  3318. && pRibbonBar->m_pExtNcFrameImpl != NULL
  3319. && pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement()
  3320. )
  3321. {
  3322. bool bZoomed = false;
  3323. CWnd * pWnd = pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_GetFrameWindow();
  3324. if( pWnd->GetSafeHwnd() != NULL && pWnd->IsZoomed() )
  3325. bZoomed = true;
  3326. if( bZoomed )
  3327. {
  3328. POINT ptOffset = { ::GetSystemMetrics(SM_CXFRAME)/4, ::GetSystemMetrics(SM_CYFRAME) };
  3329. rcTBB.OffsetRect( ptOffset );
  3330. }
  3331. if( IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R3_LunaBlue ) )
  3332. || IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R3_Silver ) )
  3333. || IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R3_Obsidian ) )
  3334. )
  3335. rcTBB.OffsetRect( bZoomed ? (-4) : 0, 3 );
  3336. else
  3337. rcTBB.OffsetRect( 3, bZoomed ? 0 : 6 );
  3338. }
  3339. pFileTBB->Size( _sizeTBB );
  3340. pFileTBB->SetRect( rcTBB );
  3341. return true;
  3342. }
  3343. bool CExtPaintManagerOffice2010_Impl::Ribbon_FileButtonCalcLayout(
  3344. CDC & dc,
  3345. CExtNcFrameImpl * pExtNcFrameImpl,
  3346. CExtRibbonButtonFile * pFileTBB,
  3347. LPARAM lParam // = 0L
  3348. )
  3349. {
  3350. ASSERT_VALID( this );
  3351. ASSERT( dc.GetSafeHdc() != NULL );
  3352. ASSERT( pExtNcFrameImpl != NULL );
  3353. ASSERT_VALID( pFileTBB );
  3354. if( IsHighContrast() )
  3355. return 
  3356. CExtPaintManagerXP::Ribbon_FileButtonCalcLayout(
  3357. dc,
  3358. pExtNcFrameImpl,
  3359. pFileTBB,
  3360. lParam
  3361. );
  3362. if( m_bmpArrRibbonFileButton.IsEmpty() )
  3363. return false;
  3364. CExtRibbonBar * pRibbonBar = DYNAMIC_DOWNCAST( CExtRibbonBar, pFileTBB->GetBar() );
  3365. if( pRibbonBar == NULL )
  3366. return false;
  3367. ASSERT_VALID( pRibbonBar );
  3368. CSize _sizeTBB( m_bmpArrRibbonFileButton.GetSize().cx, m_nRibbonFileButtonHeight - 1 );
  3369. _sizeTBB.cx = UiScalingDo( _sizeTBB.cx, __EUIST_X );
  3370. _sizeTBB.cy = UiScalingDo( _sizeTBB.cy, __EUIST_Y );
  3371. INT nPageIndex, nPageCount = pRibbonBar->RibbonTabPageButton_GetCount();
  3372. for( nPageIndex = 0; nPageIndex < nPageCount; nPageIndex ++ )
  3373. {
  3374. CExtRibbonButtonTabPage * pTabPageTBB = pRibbonBar->RibbonTabPageButton_GetAt( nPageIndex );
  3375. ASSERT( pTabPageTBB );
  3376. if( ( pTabPageTBB->GetStyle() & TBBS_HIDDEN ) != 0 )
  3377. continue;
  3378. if( ! pTabPageTBB->IsVisible() )
  3379. continue;
  3380. CSize sizeTabPageButton = pTabPageTBB->Size();
  3381. _sizeTBB.cy = max( _sizeTBB.cy, sizeTabPageButton.cy );
  3382. break;
  3383. } // for( . . .
  3384. INT nTabLineHeight = pRibbonBar->RibbonLayout_GetTabLineHeight();
  3385. INT nTopBorderHeight = 0;
  3386. INT nFrameCaptionHeight = pRibbonBar->RibbonLayout_GetFrameCaptionHeight( &nTopBorderHeight );
  3387. INT nHeightAtTheTop = nTabLineHeight + nFrameCaptionHeight;
  3388. INT nBottomLineHeight = pRibbonBar->RibbonLayout_GetBottomLineHeight();
  3389. CRect rcClient;
  3390. pRibbonBar->GetClientRect( &rcClient );
  3391. CRect rcPageBk = rcClient;
  3392. rcPageBk.top += nHeightAtTheTop;
  3393. rcPageBk.bottom -= nBottomLineHeight;
  3394. if( pRibbonBar->RibbonLayout_IsFrameIntegrationEnabled()
  3395. && (! pRibbonBar->RibbonLayout_IsDwmCaptionIntegration() )
  3396. )
  3397. rcPageBk.top += nFrameCaptionHeight + nTopBorderHeight;
  3398. CRect rcTabLine(
  3399. rcPageBk.left,
  3400. rcPageBk.top - nTabLineHeight,
  3401. rcPageBk.right,
  3402. rcPageBk.top
  3403. );
  3404. pRibbonBar->RibbonLayout_AdjustTabLineRect( rcTabLine );
  3405. // CRect rcTabNearBorderArea = rcTabLine;
  3406. //  rcTabNearBorderArea.top = rcTabNearBorderArea.bottom;
  3407. //  rcTabNearBorderArea.bottom += pRibbonBar->RibbonLayout_GetTabIntersectionHeight();
  3408. INT nHorzOffset = UiScalingDo( 2, __EUIST_X );
  3409. CRect rcTBB(
  3410. nHorzOffset,
  3411. rcTabLine.bottom - _sizeTBB.cy,
  3412. nHorzOffset + _sizeTBB.cx,
  3413. rcTabLine.bottom
  3414. );
  3415. pFileTBB->Size( _sizeTBB );
  3416. pFileTBB->SetRect( rcTBB );
  3417. return true;
  3418. }
  3419. bool CExtPaintManagerOffice2007_R1::Ribbon_FileButtonCalcLayout(
  3420. CDC & dc,
  3421. CExtNcFrameImpl * pExtNcFrameImpl,
  3422. CExtRibbonButtonFile * pFileTBB,
  3423. LPARAM lParam // = 0L
  3424. )
  3425. {
  3426. ASSERT_VALID( this );
  3427. ASSERT( dc.GetSafeHdc() != NULL );
  3428. ASSERT( pExtNcFrameImpl != NULL );
  3429. ASSERT_VALID( pFileTBB );
  3430. if( IsHighContrast() )
  3431. return 
  3432. CExtPaintManagerXP::Ribbon_FileButtonCalcLayout(
  3433. dc,
  3434. pExtNcFrameImpl,
  3435. pFileTBB,
  3436. lParam
  3437. );
  3438. return false;
  3439. }
  3440. bool CExtPaintManager::Ribbon_FileButtonPaint(
  3441. CDC & dc,
  3442. CExtRibbonButtonFile * pFileTBB,
  3443. LPARAM lParam // = 0L
  3444. )
  3445. {
  3446. ASSERT_VALID( this );
  3447. ASSERT( dc.GetSafeHdc() != NULL );
  3448. ASSERT_VALID( pFileTBB );
  3449. dc;
  3450. pFileTBB;
  3451. lParam;
  3452. return false;
  3453. }
  3454. bool CExtPaintManagerOffice2007_Impl::Ribbon_FileButtonPaint(
  3455. CDC & dc,
  3456. CExtRibbonButtonFile * pFileTBB,
  3457. LPARAM lParam // = 0L
  3458. )
  3459. {
  3460. ASSERT_VALID( this );
  3461. ASSERT( dc.GetSafeHdc() != NULL );
  3462. ASSERT_VALID( pFileTBB );
  3463. if( IsHighContrast() )
  3464. return 
  3465. CExtPaintManagerXP::Ribbon_FileButtonPaint(
  3466. dc,
  3467. pFileTBB,
  3468. lParam
  3469. );
  3470. if( m_bmpArrRibbonFileButton.IsEmpty() )
  3471. return false;
  3472. CRect rcTBB = *pFileTBB;
  3473. if( ! dc.RectVisible( &rcTBB ) )
  3474. return true;
  3475. INT nBmpIndex = 0;
  3476. CExtCmdIcon::e_paint_type_t ePT = CExtCmdIcon::__PAINT_DISABLED;
  3477. bool bSelTrackingMode = false;
  3478. const CExtToolControlBar * pToolBar = pFileTBB->GetBar();
  3479. if( pToolBar != NULL )
  3480. {
  3481. CExtMenuControlBar * pMenuBar = DYNAMIC_DOWNCAST( CExtMenuControlBar, pToolBar );
  3482. if( pMenuBar != NULL
  3483. && pMenuBar->IsMenuBarTracking()
  3484. )
  3485. {
  3486. int nFlatTrackingIndex = pMenuBar->_FlatTrackingIndexGet();
  3487. if( nFlatTrackingIndex >= 0 )
  3488. {
  3489. int nIndexOfTBB = pMenuBar->_GetIndexOf( pFileTBB );
  3490. if( nFlatTrackingIndex == nIndexOfTBB )
  3491. bSelTrackingMode = true;
  3492. }
  3493. }
  3494. }
  3495. if( bSelTrackingMode )
  3496. {
  3497. nBmpIndex = 1;
  3498. ePT = CExtCmdIcon::__PAINT_HOVER;
  3499. }
  3500. else if( pFileTBB->IsEnabled() )
  3501. {
  3502. if( pFileTBB->IsPressed() )
  3503. {
  3504. nBmpIndex = 2;
  3505. ePT = CExtCmdIcon::__PAINT_PRESSED;
  3506. }
  3507. else if( pFileTBB->IsHover() )
  3508. {
  3509. nBmpIndex = 1;
  3510. ePT = CExtCmdIcon::__PAINT_HOVER;
  3511. }
  3512. else
  3513. {
  3514. ePT = CExtCmdIcon::__PAINT_NORMAL;
  3515. }
  3516. }
  3517. bool bRTL = false;
  3518. if( (dc.GetLayout()&LAYOUT_RTL) == LAYOUT_RTL )
  3519. bRTL = true;
  3520. bool bDwmMode = false;
  3521. CExtRibbonBar * pRibbonBar = DYNAMIC_DOWNCAST( CExtRibbonBar, pFileTBB->GetSafeBar() );
  3522. if( pRibbonBar != NULL
  3523. && pRibbonBar->RibbonLayout_IsDwmCaptionIntegration()
  3524. )
  3525. bDwmMode = true;
  3526. DWORD dwOldRTF = 0;
  3527. CRect rcSrc( 0, 0, m_bmpArrRibbonFileButton.GetSize().cx, m_nRibbonFileButtonHeight );
  3528. rcSrc.OffsetRect( 0, nBmpIndex * m_nRibbonFileButtonHeight );
  3529. CRect rcPadding( 0, 0, 0, 0 );
  3530. if( rcSrc.Size() != rcTBB.Size() )
  3531. {
  3532. CExtBitmap _bmp;
  3533. _bmp.FromBitmap( m_bmpArrRibbonFileButton, rcSrc );
  3534. CRect _rcSrc( 0, 0, rcTBB.Width(), rcTBB.Height() );
  3535. CExtBitmap::Filter _f( CExtBitmap::Filter::gaussian );
  3536. _f.FilterWidthSet( 2.0 );
  3537. _bmp.Scale( rcTBB.Width(), rcTBB.Height(), _f );
  3538. if( bDwmMode && bRTL )
  3539. {
  3540. dwOldRTF = _bmp.RunTimeFlagsGet();
  3541. _bmp.RunTimeFlagsSet( dwOldRTF | __EXT_BMP_FLAG_NO_RTL_DETECTION );
  3542. }
  3543. _bmp.AlphaBlendSkinParts(
  3544. dc.m_hDC,
  3545. rcTBB,
  3546. _rcSrc,
  3547. rcPadding,
  3548. CExtBitmap::__EDM_STRETCH,
  3549. true,
  3550. true
  3551. );
  3552. if( bDwmMode && bRTL )
  3553. {
  3554. _bmp.RunTimeFlagsSet( dwOldRTF );
  3555. }
  3556. }
  3557. else
  3558. {
  3559. if( bDwmMode && bRTL )
  3560. {
  3561. dwOldRTF = m_bmpArrRibbonFileButton.RunTimeFlagsGet();
  3562. m_bmpArrRibbonFileButton.RunTimeFlagsSet( dwOldRTF | __EXT_BMP_FLAG_NO_RTL_DETECTION );
  3563. }
  3564. m_bmpArrRibbonFileButton.AlphaBlendSkinParts(
  3565. dc.m_hDC,
  3566. rcTBB,
  3567. rcSrc,
  3568. rcPadding,
  3569. CExtBitmap::__EDM_STRETCH,
  3570. true,
  3571. true
  3572. );
  3573. if( bDwmMode && bRTL )
  3574. {
  3575. m_bmpArrRibbonFileButton.RunTimeFlagsSet( dwOldRTF );
  3576. }
  3577. }
  3578. if( ! pFileTBB->m_iconForLargeMode.IsEmpty() )
  3579. {
  3580. CRect rc( rcTBB.TopLeft(), pFileTBB->m_iconForLargeMode.GetSize() );
  3581. rc.OffsetRect(
  3582. ( rcTBB.Width() - rc.Width() ) / 2,
  3583. ( rcTBB.Height() - rc.Height() ) / 2
  3584. );
  3585. CExtBitmap & _bmp = pFileTBB->m_iconForLargeMode.GetBitmap( ePT, this );
  3586. if( bDwmMode && bRTL )
  3587. {
  3588. dwOldRTF = _bmp.RunTimeFlagsGet();
  3589. _bmp.RunTimeFlagsSet( dwOldRTF | __EXT_BMP_FLAG_NO_RTL_DETECTION );
  3590. }
  3591. if( bRTL )
  3592. {
  3593. CExtBitmap _bmp2 = _bmp;
  3594. _bmp2.FlipHorizontal();
  3595. if( ! _bmp2.IsEmpty() )
  3596. {
  3597. CSize _size = _bmp2.GetSize();
  3598. _bmp2.AlphaBlend(
  3599. dc.m_hDC,
  3600. rc.left,
  3601. rc.top,
  3602. rc.Width(),
  3603. rc.Height(),
  3604. 0,
  3605. 0,
  3606. rc.Width(),
  3607. rc.Height()
  3608. );
  3609. }
  3610. }
  3611. else
  3612. {
  3613. pFileTBB->m_iconForLargeMode.Paint(
  3614. this,
  3615. dc.m_hDC,
  3616. rc,
  3617. ePT
  3618. );
  3619. }
  3620. if( bDwmMode && bRTL )
  3621. {
  3622. _bmp.RunTimeFlagsSet( dwOldRTF );
  3623. }
  3624. } // if( ! pFileTBB->m_iconForLargeMode.IsEmpty() )
  3625. return true;
  3626. }
  3627. bool CExtPaintManagerOffice2007_R1::Ribbon_FileButtonPaint(
  3628. CDC & dc,
  3629. CExtRibbonButtonFile * pFileTBB,
  3630. LPARAM lParam // = 0L
  3631. )
  3632. {
  3633. ASSERT_VALID( this );
  3634. ASSERT( dc.GetSafeHdc() != NULL );
  3635. ASSERT_VALID( pFileTBB );
  3636. if( IsHighContrast() )
  3637. return 
  3638. CExtPaintManagerXP::Ribbon_FileButtonPaint(
  3639. dc,
  3640. pFileTBB,
  3641. lParam
  3642. );
  3643. CExtBitmap * pBmp = NULL;
  3644. CRect rcSrc( 0, 0, 35, 22 );
  3645. CRect rcTBB = *pFileTBB;
  3646. rcTBB.InflateRect( 2, 0, 1, 0 );
  3647. bool bSelTrackingMode = false;
  3648. const CExtToolControlBar * pToolBar = pFileTBB->GetBar();
  3649. if( pToolBar != NULL )
  3650. {
  3651. CExtMenuControlBar * pMenuBar = DYNAMIC_DOWNCAST( CExtMenuControlBar, pToolBar );
  3652. if( pMenuBar != NULL
  3653. && pMenuBar->IsMenuBarTracking()
  3654. )
  3655. {
  3656. int nFlatTrackingIndex = pMenuBar->_FlatTrackingIndexGet();
  3657. if( nFlatTrackingIndex >= 0 )
  3658. {
  3659. int nIndexOfTBB = pMenuBar->_GetIndexOf( pFileTBB );
  3660. if( nFlatTrackingIndex == nIndexOfTBB )
  3661. bSelTrackingMode = true;
  3662. }
  3663. }
  3664. }
  3665. if( bSelTrackingMode )
  3666. pBmp = &m_bmpArrRibbonFileButtonR1;
  3667. else if( pFileTBB->IsEnabled() )
  3668. {
  3669. if( pFileTBB->IsPressed() )
  3670. {
  3671. pBmp = &m_bmpArrRibbonFileButtonR1;
  3672. rcSrc.OffsetRect( 0, rcSrc.Height() );
  3673. }
  3674. else if( pFileTBB->IsHover() )
  3675. pBmp = &m_bmpArrRibbonFileButtonR1;
  3676. }
  3677. if( pBmp != NULL
  3678. && (! pBmp->IsEmpty() )
  3679. )
  3680. {
  3681. CRect rcPadding( 3, 3, 3, 3 );
  3682. pBmp->AlphaBlendSkinParts(
  3683. dc.m_hDC,
  3684. rcTBB,
  3685. rcSrc,
  3686. rcPadding,
  3687. CExtBitmap::__EDM_STRETCH,
  3688. true,
  3689. true
  3690. );
  3691. }
  3692. CExtSafeString sText = pFileTBB->GetText();
  3693. if( ! sText.IsEmpty() )
  3694. {
  3695. CFont * pFont = pFileTBB->GetBar()->OnGetToolbarFont( false, false );
  3696. ASSERT( pFont->GetSafeHandle() != NULL );
  3697. CFont * pOldFont = dc.SelectObject( pFont );
  3698. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  3699. COLORREF clrOldTextColor = dc.SetTextColor( m_clrRibbonGroupCaptionTextCollapsed );
  3700. rcTBB.DeflateRect( 0, 0, 3, 0 );
  3701. Ribbon_PaintText(
  3702. dc,
  3703. LPCTSTR( sText ),
  3704. rcTBB,
  3705. DT_SINGLELINE|DT_CENTER|DT_VCENTER,
  3706. true,
  3707. &m_bmpRibbonDDA,
  3708. (CObject*)pFileTBB,
  3709. lParam
  3710. );
  3711. dc.SetTextColor( clrOldTextColor );
  3712. dc.SetBkMode( nOldBkMode );
  3713. dc.SelectObject( pOldFont );
  3714. } // if( ! sText.IsEmpty() )
  3715. return true;
  3716. }
  3717. INT CExtPaintManager::RibbonLayout_CalcQatbAboveRibbonHorzStart(
  3718. CExtRibbonBar * pRibbonBar,
  3719. LPARAM lParam //= 0L
  3720. )
  3721. {
  3722. ASSERT_VALID( this );
  3723. ASSERT_VALID( pRibbonBar );
  3724. pRibbonBar;
  3725. lParam;
  3726. return -1;
  3727. }
  3728. INT CExtPaintManagerOffice2010_Impl::RibbonLayout_CalcQatbAboveRibbonHorzStart(
  3729. CExtRibbonBar * pRibbonBar,
  3730. LPARAM lParam //= 0L
  3731. )
  3732. {
  3733. ASSERT_VALID( this );
  3734. ASSERT_VALID( pRibbonBar );
  3735. lParam;
  3736. INT nRetVal = (16+4);
  3737. if( pRibbonBar != NULL
  3738. && pRibbonBar->m_pExtNcFrameImpl != NULL
  3739. && pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement()
  3740. )
  3741. nRetVal += 4;
  3742. return nRetVal;
  3743. }
  3744. bool CExtPaintManager::Ribbon_IsSystemMenuIconPresent() const
  3745. {
  3746. ASSERT_VALID( this );
  3747. return false;
  3748. }
  3749. bool CExtPaintManagerOffice2010_Impl::Ribbon_IsSystemMenuIconPresent() const
  3750. {
  3751. ASSERT_VALID( this );
  3752. return true;
  3753. }
  3754. CFont * CExtPaintManager::RibbonGallery_GetItemFont(
  3755. CExtRibbonGalleryWnd * pGalleryWnd,
  3756. LPVOID pGalleryItemData,
  3757. LPARAM lParam // = 0L
  3758. )
  3759. {
  3760. ASSERT_VALID( this );
  3761. ASSERT_VALID( pGalleryWnd );
  3762. pGalleryWnd; pGalleryItemData; lParam;
  3763. return NULL;
  3764. }
  3765. CFont * CExtPaintManagerOffice2007_Impl::RibbonGallery_GetItemFont(
  3766. CExtRibbonGalleryWnd * pGalleryWnd,
  3767. LPVOID pGalleryItemData,
  3768. LPARAM lParam // = 0L
  3769. )
  3770. {
  3771. ASSERT_VALID( this );
  3772. ASSERT_VALID( pGalleryWnd );
  3773. if( IsHighContrast() )
  3774. return CExtPaintManagerXP::RibbonGallery_GetItemFont( pGalleryWnd, pGalleryItemData, lParam );
  3775. CExtToolBoxWnd::TOOLBOX_ITEM_DATA * pTBCI =
  3776. (CExtToolBoxWnd::TOOLBOX_ITEM_DATA *)pGalleryItemData;
  3777. if( pTBCI->ItemGetNext( __TBCGN_PARENT ) == pGalleryWnd->ItemGetRoot() )
  3778. return (&m_FontBold);
  3779. else
  3780. return (&m_FontNormal);
  3781. }
  3782. CSize CExtPaintManager::RibbonGallery_MeasureItem(
  3783. CDC & dc,
  3784. CExtRibbonGalleryWnd * pGalleryWnd,
  3785. LPVOID pGalleryItemData,
  3786. LPARAM lParam // = 0L
  3787. )
  3788. {
  3789. ASSERT_VALID( this );
  3790. ASSERT( dc.GetSafeHdc() != NULL );
  3791. ASSERT_VALID( pGalleryWnd );
  3792. dc; pGalleryWnd; pGalleryItemData; lParam;
  3793. return CSize( -1, -1 );
  3794. }
  3795. CSize CExtPaintManagerOffice2007_Impl::RibbonGallery_MeasureItem(
  3796. CDC & dc,
  3797. CExtRibbonGalleryWnd * pGalleryWnd,
  3798. LPVOID pGalleryItemData,
  3799. LPARAM lParam // = 0L
  3800. )
  3801. {
  3802. ASSERT_VALID( this );
  3803. ASSERT( dc.GetSafeHdc() != NULL );
  3804. ASSERT_VALID( pGalleryWnd );
  3805. if( IsHighContrast() )
  3806. return CExtPaintManagerXP::RibbonGallery_MeasureItem( dc, pGalleryWnd, pGalleryItemData, lParam );
  3807. CExtToolBoxWnd::TOOLBOX_ITEM_DATA * pTBCI = (CExtToolBoxWnd::TOOLBOX_ITEM_DATA *)pGalleryItemData;
  3808. CExtToolBoxWnd::TOOLBOX_ITEM_DATA * pTBCI_Parent = pTBCI->ItemGetNext( __TBCGN_PARENT );
  3809. CExtToolBoxWnd::TOOLBOX_ITEM_DATA * pTBCI_Root = pGalleryWnd->ItemGetRoot();
  3810. ASSERT( pTBCI_Parent != NULL );
  3811. if( pTBCI_Parent != pTBCI_Root )
  3812. return CSize( -1, -1 );
  3813. else
  3814. {
  3815. if( (pGalleryWnd->GetToolBoxWndStyle()&__TBWS_ZERO_HEIGHT_CAPTIONS) != 0 )
  3816. return CSize( 0, 0 );
  3817. __EXT_MFC_SAFE_LPCTSTR sText = pTBCI->TextGet();
  3818. CFont * pFont = RibbonGallery_GetItemFont( pGalleryWnd, pGalleryItemData, lParam );
  3819. ASSERT( pFont->GetSafeHandle() != NULL );
  3820. CSize _size = stat_CalcTextDimension( dc, *pFont, sText, DT_SINGLELINE|DT_TOP|DT_LEFT ).Size();
  3821. _size.cx += 20;
  3822. _size.cy += 8;
  3823. return _size;
  3824. } // else from if( pTBCI_Parent != pTBCI_Root )
  3825. }
  3826. bool CExtPaintManager::RibbonGallery_DrawItem(
  3827. CDC & dc,
  3828. CExtRibbonGalleryWnd * pGalleryWnd,
  3829. const RECT & rcItem,
  3830. LPVOID pGalleryItemData,
  3831. LPARAM lParam // = 0L
  3832. )
  3833. {
  3834. ASSERT_VALID( this );
  3835. ASSERT( dc.GetSafeHdc() != NULL );
  3836. ASSERT_VALID( pGalleryWnd );
  3837. dc; pGalleryWnd; rcItem; pGalleryItemData; lParam;
  3838. return false;
  3839. }
  3840. bool CExtPaintManagerOffice2007_Impl::RibbonGallery_DrawItem(
  3841. CDC & dc,
  3842. CExtRibbonGalleryWnd * pGalleryWnd,
  3843. const RECT & rcItem,
  3844. LPVOID pGalleryItemData,
  3845. LPARAM lParam // = 0L
  3846. )
  3847. {
  3848. ASSERT_VALID( this );
  3849. ASSERT( dc.GetSafeHdc() != NULL );
  3850. ASSERT_VALID( pGalleryWnd );
  3851. if( IsHighContrast() )
  3852. return CExtPaintManagerXP::RibbonGallery_DrawItem( dc, pGalleryWnd, rcItem, pGalleryItemData, lParam );
  3853. CExtToolBoxWnd::TOOLBOX_ITEM_DATA * pTBCI = (CExtToolBoxWnd::TOOLBOX_ITEM_DATA *)pGalleryItemData;
  3854. DWORD dwItemStyle = pTBCI->GetItemStyle();
  3855. CRect _rcItem = rcItem;
  3856. CSize sizeItem = _rcItem.Size();
  3857. if( (dwItemStyle & __TBWI_VISIBLE) == 0
  3858. || _rcItem.IsRectEmpty()
  3859. || (! dc.RectVisible( &_rcItem ) )
  3860. )
  3861. return true;
  3862. __EXT_MFC_SAFE_LPCTSTR sText = pTBCI->TextGet();
  3863. DWORD dwToolBoxWndStyles = pGalleryWnd->GetToolBoxWndStyle();
  3864. bool bTreeBoxes = ( (dwToolBoxWndStyles&__TBWS_TREE_BOXES) != 0 ) ? true : false;
  3865. bool bListViewMode = false;
  3866. CExtToolBoxWnd::TOOLBOX_ITEM_DATA * pTBCI_Parent = pTBCI->ItemGetNext( __TBCGN_PARENT );
  3867. CExtToolBoxWnd::TOOLBOX_ITEM_DATA * pTBCI_Root = pGalleryWnd->ItemGetRoot();
  3868. ASSERT( pTBCI_Parent != NULL );
  3869. if( pTBCI_Parent != pTBCI_Root )
  3870. {
  3871. bTreeBoxes = false;
  3872. ASSERT( pTBCI_Parent->ItemGetNext( __TBCGN_PARENT ) == pTBCI_Root );
  3873. if( pTBCI_Parent->GetItemStyle() & __TBWI_LISTBOX_VIEW )
  3874. bListViewMode = true;
  3875. INT nImgIndex1 = INT(__E07BI_NORMAL);
  3876. // if( bSelTrackingMode )
  3877. // nImgIndex1 = INT(__E07BI_SEL_T);
  3878. // else
  3879. if( (dwItemStyle & __TBWI_ENABLED) != 0 )
  3880. {
  3881. if( (dwItemStyle & (__TBWI_PRESSED|__TBWI_SELECTED) ) != 0 )
  3882. {
  3883. if( (dwItemStyle & __TBWI_HOVER) != 0 )
  3884. nImgIndex1 = INT(__E07BI_HDD);
  3885. else
  3886. nImgIndex1 = INT(__E07BI_PRESSED);
  3887. }
  3888. else if( (dwItemStyle & __TBWI_HOVER) != 0 )
  3889. nImgIndex1 = INT(__E07BI_HOVER);
  3890. } // else if( _ppbd.m_bEnabled )
  3891. if( nImgIndex1 != __E07BI_NORMAL )
  3892. {
  3893. nImgIndex1 = m_arrIndicesButtonLSM[nImgIndex1];
  3894. CSize _sizeBmp = m_bmpArrButtonLSM.GetSize();
  3895. CRect rcSrc( 0, 0, _sizeBmp.cx, m_nHeightOfButtonLSM );
  3896. rcSrc.OffsetRect( 0, m_nHeightOfButtonLSM*nImgIndex1 );
  3897. m_bmpArrButtonLSM.AlphaBlendSkinParts(
  3898. dc.m_hDC,
  3899. rcItem,
  3900. rcSrc,
  3901. m_rcPaddingOfButtonLSM,
  3902. CExtBitmap::__EDM_STRETCH,
  3903. true,
  3904. true
  3905. );
  3906. } // if( nImgIndex1 != __E07BI_NORMAL )
  3907. } // if( pTBCI_Parent != pTBCI_Root )
  3908. else
  3909. {
  3910. bListViewMode = true;
  3911. MenuCaption_Paint(
  3912. dc,
  3913. rcItem,
  3914. NULL,
  3915. ( pGalleryWnd->GetSafeHwnd() != NULL )
  3916. ? ( DYNAMIC_DOWNCAST( CExtPopupMenuWnd, pGalleryWnd->GetParent() ) )
  3917. : NULL
  3918. );
  3919. } // else from if( pTBCI_Parent != pTBCI_Root )
  3920. bool bMultipleExp = ( (dwToolBoxWndStyles&__TBWS_MULTIPLE_EXPANDED_GROUPS) != 0 ) ? true : false;
  3921. bool bAllowSelectionDrawing = true;
  3922. if( bMultipleExp
  3923. && pTBCI->ItemGetNext( __TBCGN_PARENT ) != pGalleryWnd->ItemGetActive()
  3924. )
  3925. bAllowSelectionDrawing = false;
  3926. bool bEnabled = (dwItemStyle & __TBWI_ENABLED) ? true : false;
  3927. CSize sizeIcon( 0, 0 );
  3928. CExtCmdIcon & _icon = pTBCI->IconGet();
  3929. sizeIcon = _icon.GetSize();
  3930. sizeIcon.cx = UiScalingDo( sizeIcon.cx, __EUIST_X );
  3931. sizeIcon.cy = UiScalingDo( sizeIcon.cy, __EUIST_Y );
  3932. if( bListViewMode )
  3933. {
  3934. if( (dwToolBoxWndStyles&(__TBWS_FLAT_GROUPS_2005|__TBWS_PM_BUTTONS)) != 0 )
  3935. _rcItem.DeflateRect( __EXT_TOOLBOXWND_2005_MARGIN_DX, 0 );
  3936. if( bTreeBoxes )
  3937. {
  3938. int nTreeBoxAreaDX = max( sizeItem.cy, __EXT_TOOLBOXWND_TREE_BOX_AREA_DY );
  3939. CRect rcTreeBox = _rcItem;
  3940. rcTreeBox.right = rcTreeBox.left + nTreeBoxAreaDX;
  3941. bool bPlus = true;
  3942. if( bMultipleExp )
  3943. {
  3944. if( (dwItemStyle&__TBWI_EXPANDED) != 0 )
  3945. bPlus = false;
  3946. } // if( bMultipleExp )
  3947. else
  3948. {
  3949. if( (dwItemStyle&__TBWI_ACTIVE) != 0 )
  3950. bPlus = false;
  3951. } // else from if( bMultipleExp )
  3952. pGalleryWnd->OnToolBoxWndDrawTreeBox( pTBCI, _rcItem, rcTreeBox, (! bPlus ), dc );
  3953. _rcItem.left += nTreeBoxAreaDX;
  3954. } // if( bTreeBoxes )
  3955. CRect rcText = _rcItem;
  3956. rcText.DeflateRect( __EXT_TOOLBOXWND_ITEM_MARGIN_DX, __EXT_TOOLBOXWND_ITEM_MARGIN_DY );
  3957. if( ( ! _icon.IsEmpty() ) && sizeIcon.cx > 0 && sizeIcon.cy > 0 )
  3958. {
  3959. CRect rcIcon = rcText;
  3960. rcIcon.right = rcIcon.left + sizeIcon.cx;
  3961. rcText.left += sizeIcon.cx + __EXT_TOOLBOXWND_ICON2TEXT_DX;
  3962. rcIcon.top += (rcIcon.Height() - sizeIcon.cy) / 2;
  3963. _icon.Paint(
  3964. this,
  3965. dc.GetSafeHdc(),
  3966. rcIcon,
  3967. bEnabled ? CExtCmdIcon::__PAINT_NORMAL : CExtCmdIcon::__PAINT_DISABLED
  3968. );
  3969. }
  3970. if( (rcText.right - rcText.left > 6)
  3971. && (rcText.bottom - rcText.top > 6)
  3972. )
  3973. {
  3974. INT nTextLen = 0;
  3975. if( sText != NULL
  3976. && ( nTextLen = INT(_tcslen(sText)) ) > 0
  3977. )
  3978. {
  3979. CFont * pOldFont = dc.SelectObject( pTBCI->ItemGetFont() );
  3980. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  3981. COLORREF clrTextOld = dc.SetTextColor( m_clrRibbonModeMenuTextNormal );
  3982. CRect _rcText = rcText;
  3983. _rcText.OffsetRect( 0, -1 );
  3984. dc.DrawText( sText, nTextLen, _rcText, DT_SINGLELINE|DT_LEFT|DT_VCENTER|DT_END_ELLIPSIS );
  3985. dc.SetTextColor( clrTextOld );
  3986. dc.SetBkMode( nOldBkMode );
  3987. dc.SelectObject( pOldFont );
  3988. }
  3989. }
  3990. } // if( bListViewMode )
  3991. else
  3992. {
  3993. if( ( ! _icon.IsEmpty() ) && sizeIcon.cx > 0 && sizeIcon.cy > 0 )
  3994. {
  3995. CRect rcIcon = _rcItem;
  3996. rcIcon.DeflateRect( (rcIcon.Width() - sizeIcon.cx) / 2, (rcIcon.Height() - sizeIcon.cy) / 2 );
  3997. rcIcon.right = rcIcon.left + sizeIcon.cx;
  3998. rcIcon.bottom = rcIcon.top + sizeIcon.cy;
  3999. _icon.Paint(
  4000. this,
  4001. dc.GetSafeHdc(),
  4002. rcIcon,
  4003. bEnabled ? CExtCmdIcon::__PAINT_NORMAL : CExtCmdIcon::__PAINT_DISABLED 
  4004. );
  4005. }
  4006. } // else from if( bListViewMode )
  4007. CWnd * pWnd = pGalleryWnd->GetParent();
  4008. if( pWnd != NULL
  4009. && pWnd->IsKindOf( RUNTIME_CLASS( CExtRibbonGalleryPopupMenuWnd ) )
  4010. && (((CExtRibbonGalleryPopupMenuWnd*)pWnd)->TrackFlagsGet()&TPMX_RIBBON_FILE_MENU)
  4011. )
  4012. {
  4013. CRect rcClient;
  4014. pGalleryWnd->GetClientRect( &rcClient );
  4015. dc.FillSolidRect( rcClient.left, rcClient.top, 1, rcClient.Height(), RGB(197,197,197) );
  4016. dc.FillSolidRect( rcClient.left+1, rcClient.top, 1, rcClient.Height(), RGB(245,245,245) );
  4017. }
  4018. return true;
  4019. }
  4020. bool CExtPaintManager::RibbonGallery_EraseEntireBk(
  4021. CDC & dc,
  4022. const CRect & rcClient,
  4023. const CRect & rcActiveChildArea,
  4024. CRgn & rgnActiveChildArea,
  4025. const CRect & rcActiveChildArea2,
  4026. CRgn & rgnActiveChildArea2,
  4027. CExtRibbonGalleryWnd * pGalleryWnd,
  4028. LPARAM lParam // = 0L
  4029. )
  4030. {
  4031. ASSERT_VALID( this );
  4032. ASSERT( dc.GetSafeHdc() != NULL );
  4033. ASSERT_VALID( pGalleryWnd );
  4034. rcActiveChildArea; rgnActiveChildArea; rcActiveChildArea2; rgnActiveChildArea2; pGalleryWnd; lParam;
  4035. rcClient;
  4036. CRect _rcClient;
  4037. pGalleryWnd->GetClientRect( &_rcClient );
  4038. COLORREF clrBkgnd = GetColor( COLOR_WINDOW );
  4039. if( pGalleryWnd->m_bInPlaceGallery
  4040. && pGalleryWnd->_IsKeyFocusGallery()
  4041. )
  4042. clrBkgnd = GetColor( COLOR_HIGHLIGHT );
  4043. dc.FillSolidRect( &_rcClient, clrBkgnd );
  4044. return true;
  4045. }
  4046. bool CExtPaintManagerOffice2007_Impl::RibbonGallery_EraseEntireBk(
  4047. CDC & dc,
  4048. const CRect & rcClient,
  4049. const CRect & rcActiveChildArea,
  4050. CRgn & rgnActiveChildArea,
  4051. const CRect & rcActiveChildArea2,
  4052. CRgn & rgnActiveChildArea2,
  4053. CExtRibbonGalleryWnd * pGalleryWnd,
  4054. LPARAM lParam // = 0L
  4055. )
  4056. {
  4057. ASSERT_VALID( this );
  4058. ASSERT( dc.GetSafeHdc() != NULL );
  4059. ASSERT_VALID( pGalleryWnd );
  4060. if( IsHighContrast() )
  4061. return CExtPaintManagerXP::RibbonGallery_EraseEntireBk( dc, rcClient, rcActiveChildArea, rgnActiveChildArea, rcActiveChildArea2, rgnActiveChildArea2, pGalleryWnd, lParam );
  4062. if( pGalleryWnd->m_bInPlaceGallery )
  4063. {
  4064. COLORREF clrBorder = m_clrRibbonGalleryInplaceBorderNormal;
  4065. COLORREF clrBkgnd = m_clrRibbonGalleryInplaceBkgndNormal;
  4066. if( pGalleryWnd->_IsKeyFocusGallery() )
  4067. clrBkgnd = CExtBitmap::stat_HLS_Adjust( clrBkgnd, 0.0, 0.5 );
  4068. CPoint ptCursor;
  4069. if( ::GetCursorPos( &ptCursor ) )
  4070. {
  4071. HWND hWnd = ::WindowFromPoint( ptCursor );
  4072. if( hWnd != NULL
  4073. && ( hWnd == pGalleryWnd->m_hWnd
  4074. || hWnd == pGalleryWnd->GetScrollBarCtrl(SB_VERT)->GetSafeHwnd()
  4075. )
  4076. )
  4077. {
  4078. clrBorder = m_clrRibbonGalleryInplaceBorderHover;
  4079. clrBkgnd = m_clrRibbonGalleryInplaceBkgndHover;
  4080. }
  4081. }
  4082. dc.FillSolidRect( &rcClient, clrBkgnd );
  4083. CRect _rcClient;
  4084. pGalleryWnd->GetClientRect( &_rcClient );
  4085. dc.Draw3dRect( &_rcClient, clrBorder, clrBorder );
  4086. return true;
  4087. } // if( pGalleryWnd->m_bInPlaceGallery )
  4088. CWnd * pWnd = pGalleryWnd->GetParent();
  4089. if( pWnd != NULL
  4090. && pWnd->IsKindOf( RUNTIME_CLASS( CExtRibbonGalleryPopupMenuWnd ) )
  4091. && (((CExtRibbonGalleryPopupMenuWnd*)pWnd)->TrackFlagsGet()&TPMX_RIBBON_FILE_MENU)
  4092. )
  4093. {
  4094. dc.FillSolidRect( &rcClient, RGB(233,234,238) );
  4095. dc.FillSolidRect( rcClient.left, rcClient.top, 1, rcClient.Height(), RGB(197,197,197) );
  4096. dc.FillSolidRect( rcClient.left+1, rcClient.top, 1, rcClient.Height(), RGB(245,245,245) );
  4097. return true;
  4098. }
  4099. dc.FillSolidRect( &rcClient, GetColor( COLOR_WINDOW ) );
  4100. return true;
  4101. }
  4102. void CExtPaintManager::RibbonGallery_AdjustClientRect(
  4103. CRect & rcClient,
  4104. const CExtRibbonGalleryWnd * pGalleryWnd,
  4105. LPARAM lParam // = 0L
  4106. )
  4107. {
  4108. ASSERT_VALID( this );
  4109. ASSERT_VALID( pGalleryWnd );
  4110. lParam;
  4111. if( pGalleryWnd->m_bInPlaceGallery
  4112. && pGalleryWnd->GetScrollBarCtrl(SB_VERT)->GetSafeHwnd() != NULL
  4113. )
  4114. rcClient.DeflateRect( 1, 1, 0, 1 );
  4115. }
  4116. void CExtPaintManager::RibbonGallery_PaintScrollArea(
  4117. CDC & dc,
  4118. CExtRibbonGalleryInplaceScrollBar * pSB,
  4119. LPARAM lParam // = 0L
  4120. )
  4121. {
  4122. ASSERT_VALID( this );
  4123. ASSERT( dc.GetSafeHdc() != NULL );
  4124. ASSERT_VALID( pSB );
  4125. ASSERT( pSB->GetSafeHwnd() != NULL );
  4126. bool bKeyFocusMode = false;
  4127. CExtRibbonGalleryWnd * pRibbonGalleryWnd =
  4128. STATIC_DOWNCAST( CExtRibbonGalleryWnd, pSB->GetParent() );
  4129. if( pRibbonGalleryWnd->m_bInPlaceGallery
  4130. && pRibbonGalleryWnd->_IsKeyFocusGallery()
  4131. )
  4132. bKeyFocusMode = true;
  4133. INT nIndex, nCount = sizeof(pSB->m_arrButtons) / sizeof(pSB->m_arrButtons[0]);
  4134. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  4135. {
  4136. CRect rc = pSB->RgBtnGetRect( (CExtRibbonGalleryInplaceScrollBar::e_ButtonType_t)nIndex );
  4137. LPCTSTR strText = NULL;
  4138. switch( nIndex )
  4139. {
  4140. case INT(CExtRibbonGalleryInplaceScrollBar::__BTT_UP):
  4141. strText = _T("t");
  4142. break;
  4143. case INT(CExtRibbonGalleryInplaceScrollBar::__BTT_DOWN):
  4144. strText = _T("u");
  4145. break;
  4146. case INT(CExtRibbonGalleryInplaceScrollBar::__BTT_MENU):
  4147. strText = _T("7");
  4148. break;
  4149. } // switch( nIndex )
  4150. CExtPaintManager::PAINTPUSHBUTTONDATA _ppbd(
  4151. pSB,
  4152. true,
  4153. rc,
  4154. strText, //bTopButton ? _T("t") : _T("u"), // up arrow / down arrow
  4155. NULL,
  4156. true,
  4157. ( pSB->m_arrButtons[ nIndex ] == CExtRibbonGalleryInplaceScrollBar::__BST_HOVER || ( bKeyFocusMode && nIndex == INT(CExtRibbonGalleryInplaceScrollBar::__BTT_MENU) ) ) ? true : false,
  4158. ( pSB->m_arrButtons[ nIndex ] == CExtRibbonGalleryInplaceScrollBar::__BST_PRESSED ) ? true : false,
  4159. false,
  4160. ( pSB->m_arrButtons[ nIndex ] != CExtRibbonGalleryInplaceScrollBar::__BST_DISABLED ) ? true : false,
  4161. true,false,false,
  4162. __ALIGN_HORIZ_CENTER | __ALIGN_VERT_CENTER,
  4163. (HFONT)m_FontMarlett.GetSafeHandle()
  4164. );
  4165. _ppbd.m_lParam = lParam;
  4166. PaintPushButton( dc, _ppbd );
  4167. }
  4168. }
  4169. void CExtPaintManagerOffice2007_Impl::RibbonGallery_PaintScrollArea(
  4170. CDC & dc,
  4171. CExtRibbonGalleryInplaceScrollBar * pSB,
  4172. LPARAM lParam // = 0L