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

界面编程

开发平台:

Visual C++

  1. )
  2. {
  3. ASSERT_VALID( this );
  4. ASSERT( dc.GetSafeHdc() != NULL );
  5. ASSERT_VALID( pSB );
  6. ASSERT( pSB->GetSafeHwnd() != NULL );
  7. if( IsHighContrast() )
  8. {
  9. CExtPaintManagerXP::RibbonGallery_PaintScrollArea( dc, pSB, lParam );
  10. return;
  11. }
  12. CRect rcClient;
  13. pSB->GetClientRect( &rcClient );
  14. if( m_rcRibbonGalleryScrollFill != COLORREF(-1L) )
  15. dc.FillSolidRect( &rcClient, m_rcRibbonGalleryScrollFill );
  16. bool bKeyFocusMode = false;
  17. CExtRibbonGalleryWnd * pRibbonGalleryWnd =
  18. STATIC_DOWNCAST( CExtRibbonGalleryWnd, pSB->GetParent() );
  19. if( pRibbonGalleryWnd->m_bInPlaceGallery
  20. && pRibbonGalleryWnd->_IsKeyFocusGallery()
  21. )
  22. bKeyFocusMode = true;
  23. INT nIndex, nCount = sizeof(pSB->m_arrButtons) / sizeof(pSB->m_arrButtons[0]);
  24. INT nNextTop = 0;
  25. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  26. {
  27. bool bForceHover = false;
  28. CRect rc = pSB->RgBtnGetRect( (CExtRibbonGalleryInplaceScrollBar::e_ButtonType_t)nIndex );
  29. INT nBtnHeightSrc = m_nHeightRibbonGalleryScrollButton;
  30. INT nBtnHeightDst = UiScalingDo( nBtnHeightSrc, __EUIST_X );
  31. CExtBitmap * pBmp = NULL;
  32. switch( nIndex )
  33. {
  34. case INT(CExtRibbonGalleryInplaceScrollBar::__BTT_UP):
  35. pBmp = &m_bmpArrRibbonGalleryScrollButtonUp;
  36. if( nBtnHeightSrc < 0 )
  37. {
  38. nBtnHeightSrc = 21;
  39. nBtnHeightDst = UiScalingDo( nBtnHeightSrc, __EUIST_X );
  40. }
  41. break;
  42. case INT(CExtRibbonGalleryInplaceScrollBar::__BTT_DOWN):
  43. pBmp = &m_bmpArrRibbonGalleryScrollButtonDown;
  44. if( nBtnHeightSrc < 0 )
  45. {
  46. nBtnHeightSrc = 19;
  47. nBtnHeightDst = UiScalingDo( nBtnHeightSrc, __EUIST_X );
  48. }
  49. break;
  50. case INT(CExtRibbonGalleryInplaceScrollBar::__BTT_MENU):
  51. pBmp = &m_bmpArrRibbonGalleryScrollButtonMenu;
  52. if( nBtnHeightSrc < 0 )
  53. {
  54. nBtnHeightSrc = 20;
  55. nBtnHeightDst = UiScalingDo( nBtnHeightSrc, __EUIST_X );
  56. }
  57. if( bKeyFocusMode )
  58. bForceHover = true;
  59. break;
  60. } // switch( nIndex )
  61. if( pBmp != NULL && (! pBmp->IsEmpty() ) && nBtnHeightSrc > 0 )
  62. {
  63. rc.top = nNextTop;
  64. rc.bottom = rc.top + nBtnHeightDst;
  65. INT nOffsetIndex = 0;
  66. CExtRibbonGalleryInplaceScrollBar::e_ButtonState_t eBST = pSB->m_arrButtons[ nIndex ];
  67. if( bForceHover )
  68. eBST = CExtRibbonGalleryInplaceScrollBar::__BST_HOVER;
  69. switch( eBST )
  70. {
  71. case CExtRibbonGalleryInplaceScrollBar::__BST_DISABLED:
  72. nOffsetIndex = m_nIndexRibbonGalleryScrollButtonDisabled;
  73. break;
  74. case CExtRibbonGalleryInplaceScrollBar::__BST_NORMAL:
  75. nOffsetIndex = m_nIndexRibbonGalleryScrollButtonNormal;
  76. break;
  77. case CExtRibbonGalleryInplaceScrollBar::__BST_HOVER:
  78. nOffsetIndex = m_nIndexRibbonGalleryScrollButtonHover;
  79. break;
  80. case CExtRibbonGalleryInplaceScrollBar::__BST_PRESSED:
  81. nOffsetIndex = m_nIndexRibbonGalleryScrollButtonPressed;
  82. break;
  83. } // switch( eBST )
  84. if( rc.bottom > rcClient.bottom )
  85. rc.bottom = rcClient.bottom;
  86. CRect rcSrc( 0, 0, pBmp->GetSize().cx, nBtnHeightSrc );
  87. rcSrc.OffsetRect( 0, nBtnHeightSrc*nOffsetIndex );
  88. pBmp->AlphaBlendSkinParts(
  89. dc.m_hAttribDC,
  90. rc,
  91. rcSrc,
  92. m_rcRibbonGalleryScrollButtonPadding,
  93. CExtBitmap::__EDM_STRETCH,
  94. true,
  95. true
  96. );
  97. nNextTop = rc.bottom;
  98. continue;
  99. } // if( pBmp != NULL ..
  100. CExtPaintManager::PAINTPUSHBUTTONDATA _ppbd(
  101. pSB,
  102. true,
  103. rc,
  104. NULL,
  105. NULL,
  106. true,
  107. ( pSB->m_arrButtons[ nIndex ] == CExtRibbonGalleryInplaceScrollBar::__BST_HOVER ) ? true : false,
  108. ( pSB->m_arrButtons[ nIndex ] == CExtRibbonGalleryInplaceScrollBar::__BST_PRESSED ) ? true : false,
  109. false,
  110. ( pSB->m_arrButtons[ nIndex ] != CExtRibbonGalleryInplaceScrollBar::__BST_DISABLED ) ? true : false,
  111. true,false,false,
  112. __ALIGN_HORIZ_CENTER | __ALIGN_VERT_CENTER,
  113. (HFONT)m_FontMarlett.GetSafeHandle()
  114. );
  115. _ppbd.m_lParam = lParam;
  116. PaintPushButton( dc, _ppbd );
  117. }
  118. }
  119. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  120. void CExtPaintManagerOffice2007_Impl::PaintMenuItem(
  121. CDC & dc,
  122. CExtPaintManager::PAINTMENUITEMDATA & _pmid
  123. )
  124. {
  125. ASSERT_VALID( this );
  126. ASSERT( dc.GetSafeHdc() != NULL );
  127. if( _pmid.m_rcItem.IsRectEmpty() )
  128. return;
  129. if( IsHighContrast() )
  130. {
  131. CExtPaintManagerXP::PaintMenuItem( dc, _pmid );
  132. return;
  133. }
  134. if( _pmid.m_pHelperSrc != NULL
  135. && _pmid.m_pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtPopupMenuWnd ) )
  136. && ((CExtPopupMenuWnd*)_pmid.m_pHelperSrc)->_IsRibbonMode()
  137. )
  138. {
  139. if( _pmid.m_bEnabled
  140. && m_clrRibbonModeMenuTextNormal != COLORREF(-1L)
  141. && _pmid.m_clrForceMenuText == COLORREF(-1L)
  142. )
  143. _pmid.m_clrForceMenuText = m_clrRibbonModeMenuTextNormal;
  144. }
  145. CExtPaintManagerOffice2003::PaintMenuItem( dc, _pmid );
  146. }
  147. CRect CExtPaintManagerOffice2007_Impl::GetMenuBorderMetrics(
  148. CWnd * pWnd,
  149. LPARAM lParam // = 0
  150. ) const
  151. {
  152. ASSERT_VALID( this );
  153. if( IsHighContrast() )
  154. return 
  155. CExtPaintManagerXP::GetMenuBorderMetrics(
  156. pWnd,
  157. lParam
  158. );
  159. if( pWnd != NULL
  160. && pWnd->IsKindOf( RUNTIME_CLASS( CExtPopupMenuWnd ) )
  161. && ((CExtPopupMenuWnd*)pWnd)->_IsRibbonMode()
  162. )
  163. {
  164. if( ( ((CExtPopupMenuWnd*)pWnd)->TrackFlagsGet() & TPMX_RIBBON_FILE_MENU ) != 0 )
  165. return m_rcPaddingRibbonFileMenuBigBorder;
  166. return m_rcRibbonModeMenuMetrics;
  167. }
  168. return CExtPaintManagerOffice2003::GetMenuBorderMetrics( pWnd, lParam );
  169. }
  170. void CExtPaintManagerOffice2007_Impl::PaintMenuBorder(
  171. CDC & dc,
  172. const RECT & rectClient,
  173. CObject * pHelperSrc,
  174. LPARAM lParam // = 0L
  175. )
  176. {
  177. ASSERT_VALID( this );
  178. ASSERT( dc.GetSafeHdc() != NULL );
  179. if( ::IsRectEmpty( &rectClient ) )
  180. return;
  181. if( IsHighContrast() )
  182. {
  183. CExtPaintManagerXP::PaintMenuBorder(
  184. dc,
  185. rectClient,
  186. pHelperSrc,
  187. lParam
  188. );
  189. return;
  190. }
  191. if( pHelperSrc != NULL
  192. && pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtPopupMenuWnd ) )
  193. && ((CExtPopupMenuWnd*)pHelperSrc)->_IsRibbonMode()
  194. )
  195. {
  196. if( ( ((CExtPopupMenuWnd*)pHelperSrc)->TrackFlagsGet() & TPMX_RIBBON_FILE_MENU ) != 0 )
  197. {
  198. m_bmpRibbonFileMenuBigBorder.AlphaBlendSkinParts(
  199. dc.m_hDC,
  200. rectClient,
  201. m_rcPaddingRibbonFileMenuBigBorder,
  202. CExtBitmap::__EDM_STRETCH,
  203. false,
  204. true
  205. );
  206. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  207. CExtRibbonGalleryPopupMenuWnd * pGalleryPopup =
  208. DYNAMIC_DOWNCAST( CExtRibbonGalleryPopupMenuWnd, pHelperSrc );
  209. if( pGalleryPopup != NULL
  210. && pGalleryPopup != NULL
  211. && pGalleryPopup->m_pRibbonSrcTrackingButton != NULL
  212. && pGalleryPopup->m_pRibbonSrcTrackingButton->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonFile ) )
  213. && pGalleryPopup->m_pRibbonSrcTrackingButton->GetSafeBar() != NULL
  214. && pGalleryPopup->m_pRibbonSrcTrackingButton->GetBar()->IsKindOf( RUNTIME_CLASS( CExtRibbonBar) )
  215. )
  216. {
  217. CExtRibbonButtonFile * pFileTBB =
  218. STATIC_DOWNCAST(
  219. CExtRibbonButtonFile,
  220. pGalleryPopup->m_pRibbonSrcTrackingButton
  221. );
  222. CExtRibbonBar * pRibbonBar = DYNAMIC_DOWNCAST( CExtRibbonBar, pFileTBB->GetBar() );
  223. if( pRibbonBar != NULL
  224. //&& Ribbon_FileButtonIsItegrationSupported()
  225. && pRibbonBar->m_pExtNcFrameImpl != NULL
  226. && pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_IsSupported()
  227. && pRibbonBar->RibbonLayout_IsFrameIntegrationEnabled()
  228. )
  229. {
  230. INT nRibbonFileButtonMenuIntersectionHeight =
  231. Ribbon_FileButtonGetMenuIntersectionHeight();
  232. if( nRibbonFileButtonMenuIntersectionHeight != 0 )
  233. {
  234. CRect rcTBB = *pFileTBB;
  235. pFileTBB->GetBar()->ClientToScreen( &rcTBB );
  236. pGalleryPopup->ScreenToClient( &rcTBB );
  237. if( rcTBB.top <= rectClient.top && rectClient.top <= rcTBB.bottom )
  238. {
  239. CRect _rcTBB = rcTBB;
  240. if( pRibbonBar->m_pExtNcFrameImpl != NULL
  241. && pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement()
  242. )
  243. {
  244. if( IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R3_LunaBlue ) )
  245. || IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R3_Silver ) )
  246. || IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R3_Obsidian ) )
  247. )
  248. _rcTBB.OffsetRect( 0, -3 );
  249. }
  250. INT nTopBorderHeight = 0;
  251. INT nFrameCaptionHeight = pRibbonBar->RibbonLayout_GetFrameCaptionHeight( &nTopBorderHeight );
  252. if( pRibbonBar->RibbonLayout_IsDwmCaptionIntegration() )
  253. {
  254. bool bZoomed = false;
  255. CWnd * pWnd = pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_GetFrameWindow();
  256. if( pWnd->GetSafeHwnd() != NULL && pWnd->IsZoomed() )
  257. bZoomed = true;
  258. if( bZoomed )
  259. {
  260. POINT ptOffset = { - ::GetSystemMetrics(SM_CXFRAME)/4 + 4, - ::GetSystemMetrics(SM_CYFRAME) };
  261. _rcTBB.OffsetRect( ptOffset );
  262. }
  263. }
  264. else
  265. {
  266. _rcTBB.OffsetRect( 0, - nFrameCaptionHeight - nTopBorderHeight );
  267. }
  268. dc.OffsetViewportOrg(
  269. _rcTBB.left,
  270. _rcTBB.top //- nFrameCaptionHeight - nTopBorderHeight
  271. );
  272. pFileTBB->AnimationClient_SiteGet()->AnimationSite_ClientProgressStop( pFileTBB );
  273. pFileTBB->Paint( dc );
  274. dc.OffsetViewportOrg(
  275. -_rcTBB.left,
  276. -_rcTBB.top //+ nFrameCaptionHeight + nTopBorderHeight
  277. );
  278. } // if( rcTBB.top <= rectClient.top && rectClient.top <= rcTBB.bottom )
  279. } // if( nRibbonFileButtonMenuIntersectionHeight != 0 )
  280. } // if( pRibbonBar != NULL ...
  281. }
  282. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  283. return;
  284. }
  285. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  286. if( ((CExtPopupMenuWnd*)pHelperSrc)->IsKindOf( RUNTIME_CLASS( CExtRibbonPopupMenuWnd ) )
  287. && IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R1 ) )
  288. )
  289. {
  290. }
  291. else
  292. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  293. {
  294. m_bmpRibbonModeMenuBorder.AlphaBlendSkinParts(
  295. dc.m_hDC,
  296. rectClient,
  297. m_rcRibbonModeMenuBorderPadding,
  298. CExtBitmap::__EDM_STRETCH,
  299. false,
  300. true
  301. );
  302. return;
  303. }
  304. }
  305. CExtPaintManagerOffice2003::PaintMenuBorder( dc, rectClient, pHelperSrc, lParam );
  306. }
  307. CExtAnimationParameters CExtPaintManager::g_DefAnimationParametersEmpty( 0, 0 );
  308. CExtAnimationParameters CExtPaintManager::g_DefAnimationParametersNormal( __EXT_MFC_DEF_ANIMATION_STEP_COUNT, __EXT_MFC_DEF_ANIMATION_TIMER_ELAPSE );
  309. CExtAnimationParameters CExtPaintManager::g_DefAnimationParametersSlow( __EXT_MFC_DEF_ANIMATION_STEP_COUNT+1, __EXT_MFC_DEF_ANIMATION_TIMER_ELAPSE );
  310. CExtAnimationParameters CExtPaintManager::g_DefAnimationParametersVerySlow( __EXT_MFC_DEF_ANIMATION_STEP_COUNT+2, __EXT_MFC_DEF_ANIMATION_TIMER_ELAPSE );
  311. //CExtAnimationParameters CExtPaintManager::g_DefAnimationParametersVerySlowAndSmooth( __EXT_MFC_DEF_ANIMATION_STEP_COUNT+4, __EXT_MFC_DEF_ANIMATION_TIMER_ELAPSE );
  312. CExtAnimationParameters CExtPaintManager::g_DefAnimationParametersVerySlowAndSmooth( 4, 80 );
  313. const CExtAnimationParameters *
  314. CExtPaintManager::Animation_GetParameters(
  315. INT eAPT, // __EAPT_*** animation type
  316. CObject * pHelperSrc,
  317. const CExtAnimationClient * pAC,
  318. LPARAM lParam // = 0L
  319. ) const
  320. {
  321. ASSERT_VALID( this );
  322. ASSERT( pAC != NULL );
  323. eAPT;
  324. pHelperSrc;
  325. pAC;
  326. lParam;
  327. // if( ! g_PaintManager.m_bIsWin2000orLater )
  328. // return (&g_PaintManager->g_DefAnimationParametersEmpty);
  329. // if( pHelperSrc != NULL )
  330. // {
  331. // ASSERT_VALID( pHelperSrc );
  332. // if( g_PaintManager.m_DWM.IsCompositionEnabled() )
  333. // {
  334. // if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtScrollBar ) ) )
  335. // return (&g_PaintManager->g_DefAnimationParametersVerySlow);
  336. // } // if( g_PaintManager.m_DWM.IsCompositionEnabled() )
  337. // #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  338. // CExtBarButton * pTBB = DYNAMIC_DOWNCAST( CExtBarButton, pHelperSrc );
  339. // if( pTBB != NULL )
  340. // {
  341. // CExtToolControlBar * pToolBar = pTBB->GetBar();
  342. // if( pToolBar != NULL )
  343. // {
  344. // ASSERT_VALID( pToolBar );
  345. // CExtRibbonPage * pRibbonPage = DYNAMIC_DOWNCAST( CExtRibbonPage, pToolBar );
  346. // if( pRibbonPage != NULL )
  347. // {
  348. // if( pTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonDialogLauncher ) ) )
  349. // {
  350. // if( eAPT == __EAPT_BY_HOVERED_STATE_TURNED_ON
  351. // || eAPT == __EAPT_BY_HOVERED_STATE_TURNED_OFF
  352. // )
  353. // return (&g_DefAnimationParametersEmpty);
  354. // }
  355. // CExtBarButton * pParentTBB = pTBB->ParentButtonGet();
  356. // CExtRibbonButtonGroup * pGroupTBB = DYNAMIC_DOWNCAST( CExtRibbonButtonGroup, pTBB );
  357. // if( pGroupTBB != NULL )
  358. // {
  359. // if( pParentTBB != NULL )
  360. // return (&g_DefAnimationParametersEmpty);
  361. // // if( pGroupTBB->TopCollapsedStateGet() )
  362. // return (&g_DefAnimationParametersNormal);
  363. // // return (&g_DefAnimationParametersVerySlowAndSmooth);
  364. // }
  365. // if( pTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonTabPage ) ) )
  366. // {
  367. // if( eAPT == __EAPT_BY_HOVERED_STATE_TURNED_ON )
  368. // return (&g_DefAnimationParametersEmpty);
  369. // return (&g_DefAnimationParametersVerySlow);
  370. // }
  371. // if( ( pParentTBB != NULL
  372. // && pParentTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonToolGroup ) )
  373. // )
  374. // || pTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonFile ) )
  375. // || pTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonQuickAccessContentExpand ) )
  376. // )
  377. // return (&g_DefAnimationParametersNormal);
  378. // // final case
  379. // if( eAPT == __EAPT_BY_HOVERED_STATE_TURNED_ON )
  380. // return (&g_DefAnimationParametersEmpty);
  381. // return (&g_DefAnimationParametersNormal);
  382. // } // if( pRibbonPage != NULL )
  383. // } // if( pToolBar != NULL )
  384. // } // if( pTBB != NULL )
  385. // #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  386. // } // if( pHelperSrc != NULL )
  387. return (&g_DefAnimationParametersEmpty);
  388. }
  389. const CExtAnimationParameters *
  390. CExtPaintManagerNativeXP::Animation_GetParameters(
  391. INT eAPT, // __EAPT_*** animation type
  392. CObject * pHelperSrc,
  393. const CExtAnimationClient * pAC,
  394. LPARAM lParam // = 0L
  395. ) const
  396. {
  397. ASSERT_VALID( this );
  398. ASSERT( pAC != NULL );
  399. if( ! g_PaintManager.m_bIsWin2000orLater )
  400. return (&g_PaintManager->g_DefAnimationParametersEmpty);
  401. if( pHelperSrc != NULL )
  402. {
  403. ASSERT_VALID( pHelperSrc );
  404. if( g_PaintManager.m_DWM.IsCompositionEnabled() )
  405. {
  406. if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtButton ) ) )
  407. return (&g_PaintManager->g_DefAnimationParametersVerySlow);
  408. #if (!defined __EXT_MFC_NO_SPIN)
  409. if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtSpinWnd ) ) )
  410. return (&g_PaintManager->g_DefAnimationParametersVerySlow);
  411. #endif // (!defined __EXT_MFC_NO_SPIN)
  412. } // if( g_PaintManager.m_DWM.IsCompositionEnabled() )
  413. } // if( pHelperSrc != NULL )
  414. const CExtAnimationParameters * pAnimationParameters =
  415. CExtPaintManager::Animation_GetParameters(
  416. eAPT,
  417. pHelperSrc,
  418. pAC,
  419. lParam
  420. );
  421. return pAnimationParameters;
  422. }
  423. const CExtAnimationParameters *
  424. CExtPaintManagerOffice2007_Impl::Animation_GetParameters(
  425. INT eAPT, // __EAPT_*** animation type
  426. CObject * pHelperSrc,
  427. const CExtAnimationClient * pAC,
  428. LPARAM lParam // = 0L
  429. ) const
  430. {
  431. ASSERT_VALID( this );
  432. if( IsHighContrast() )
  433. return 
  434. CExtPaintManagerXP::Animation_GetParameters(
  435. eAPT,
  436. pHelperSrc,
  437. pAC,
  438. lParam
  439. );
  440. if( ! g_PaintManager.m_bIsWin2000orLater )
  441. return (&g_PaintManager->g_DefAnimationParametersEmpty);
  442. if( pHelperSrc != NULL )
  443. {
  444. ASSERT_VALID( pHelperSrc );
  445. if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtButton ) ) )
  446. return (&g_PaintManager->g_DefAnimationParametersVerySlow);
  447. if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtScrollBar ) ) )
  448. return (&g_PaintManager->g_DefAnimationParametersVerySlow);
  449. #if (!defined __EXT_MFC_NO_DATE_PICKER)
  450. if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDatePickerWnd ) ) )
  451. return (&g_PaintManager->g_DefAnimationParametersSlow);
  452. #endif // (!defined __EXT_MFC_NO_DATE_PICKER)
  453. #if (!defined __EXT_MFC_NO_DURATIONWND)
  454. if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDurationWnd ) ) )
  455. return (&g_PaintManager->g_DefAnimationParametersSlow);
  456. #endif // (!defined __EXT_MFC_NO_DURATIONWND)
  457. #if (!defined __EXT_MFC_NO_SPIN)
  458. if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtSpinWnd ) ) )
  459. return (&g_PaintManager->g_DefAnimationParametersSlow);
  460. #endif // (!defined __EXT_MFC_NO_SPIN)
  461. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  462. if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtRibbonGalleryWnd ) ) )
  463. return (&g_PaintManager->g_DefAnimationParametersNormal);
  464. CExtBarButton * pTBB = DYNAMIC_DOWNCAST( CExtBarButton, pHelperSrc );
  465. if( pTBB != NULL )
  466. {
  467. bool bCheckEmpty = false;
  468. if( pTBB->ParentButtonGet() != NULL )
  469. bCheckEmpty = true;
  470. else
  471. {
  472. CExtRibbonBar * pRibbonBar = DYNAMIC_DOWNCAST( CExtRibbonBar, pTBB->GetBar() );
  473. if( pRibbonBar != NULL )
  474. {
  475. if( pTBB->IsKindOf( RUNTIME_CLASS(CExtRibbonButtonFile) ) )
  476. bCheckEmpty = true;
  477. else
  478. {
  479. INT nQatbIndex = pRibbonBar->RibbonQuickAccessButton_GetIndexOf( pTBB );
  480. if( nQatbIndex >= 0 )
  481. bCheckEmpty = true;
  482. }
  483. } // if( pRibbonBar != NULL )
  484. } // else from if( ((CExtBarButton*)pHelperSrc)->ParentButtonGet() != NULL )
  485. if( bCheckEmpty )
  486. {
  487. if( IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R3_LunaBlue ) )
  488. || IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R3_Silver ) )
  489. || IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2007_R3_Obsidian ) )
  490. || IsKindOf( RUNTIME_CLASS( CExtPaintManagerOffice2010_Impl ) )
  491. )
  492. return (&g_PaintManager->g_DefAnimationParametersEmpty);
  493. } // if( bCheckEmpty )
  494. } // if( pTBB != NULL )
  495. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  496. } // if( pHelperSrc != NULL )
  497. //const CExtAnimationParameters * pAnimationParameters =
  498. // CExtPaintManagerOffice2003::Animation_GetParameters(
  499. // eAPT,
  500. // pHelperSrc,
  501. // pAC,
  502. // lParam
  503. // );
  504. // return pAnimationParameters;
  505. if( ! g_PaintManager.m_bIsWin2000orLater )
  506. return (&g_PaintManager->g_DefAnimationParametersEmpty);
  507. if( pHelperSrc != NULL )
  508. {
  509. ASSERT_VALID( pHelperSrc );
  510. if( g_PaintManager.m_DWM.IsCompositionEnabled() )
  511. {
  512. if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtScrollBar ) ) )
  513. return (&g_PaintManager->g_DefAnimationParametersVerySlow);
  514. } // if( g_PaintManager.m_DWM.IsCompositionEnabled() )
  515. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  516. CExtBarButton * pTBB = DYNAMIC_DOWNCAST( CExtBarButton, pHelperSrc );
  517. if( pTBB != NULL )
  518. {
  519. CExtToolControlBar * pToolBar = pTBB->GetBar();
  520. if( pToolBar != NULL )
  521. {
  522. ASSERT_VALID( pToolBar );
  523. CExtRibbonPage * pRibbonPage = DYNAMIC_DOWNCAST( CExtRibbonPage, pToolBar );
  524. if( pRibbonPage != NULL )
  525. {
  526. if( pTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonDialogLauncher ) ) )
  527. {
  528. if( eAPT == __EAPT_BY_HOVERED_STATE_TURNED_ON
  529. || eAPT == __EAPT_BY_HOVERED_STATE_TURNED_OFF
  530. )
  531. return (&g_DefAnimationParametersEmpty);
  532. }
  533. CExtBarButton * pParentTBB = pTBB->ParentButtonGet();
  534. if( pParentTBB == NULL
  535. && Ribbon_DwmAreaCoversTabs()
  536. && (! pTBB->IsKindOf( RUNTIME_CLASS(CExtRibbonButtonGroup) ) )
  537. )
  538. return (&g_DefAnimationParametersEmpty);
  539. CExtRibbonButtonGroup * pGroupTBB = DYNAMIC_DOWNCAST( CExtRibbonButtonGroup, pTBB );
  540. if( pGroupTBB != NULL )
  541. {
  542. if( pParentTBB != NULL )
  543. return (&g_DefAnimationParametersEmpty);
  544. // if( pGroupTBB->TopCollapsedStateGet() )
  545. return (&g_DefAnimationParametersNormal);
  546. // return (&g_DefAnimationParametersVerySlowAndSmooth);
  547. }
  548. if( pTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonTabPage ) ) )
  549. {
  550. if( eAPT == __EAPT_BY_HOVERED_STATE_TURNED_ON )
  551. return (&g_DefAnimationParametersEmpty);
  552. return (&g_DefAnimationParametersVerySlow);
  553. }
  554. if( ( pParentTBB != NULL
  555. && pParentTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonToolGroup ) )
  556. )
  557. || pTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonFile ) )
  558. || pTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonQuickAccessContentExpand ) )
  559. )
  560. return (&g_DefAnimationParametersNormal);
  561. // final case
  562. if( eAPT == __EAPT_BY_HOVERED_STATE_TURNED_ON )
  563. return (&g_DefAnimationParametersEmpty);
  564. return (&g_DefAnimationParametersNormal);
  565. } // if( pRibbonPage != NULL )
  566. } // if( pToolBar != NULL )
  567. } // if( pTBB != NULL )
  568. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  569. } // if( pHelperSrc != NULL )
  570. return (&g_DefAnimationParametersEmpty);
  571. }
  572. void CExtPaintManager::MenuBottomResizingMarginGetInfo(
  573. INT & nMarginHeight,
  574. INT & nResizingCornerPartWidth,
  575. CExtPopupMenuWnd * pPopup,
  576. LPARAM lParam // = 0L
  577. )
  578. {
  579. ASSERT_VALID( this );
  580. ASSERT_VALID( pPopup );
  581. lParam;
  582. nMarginHeight = 0;
  583. nResizingCornerPartWidth = 0;
  584. DWORD dwTrackFlags = pPopup->TrackFlagsGet();
  585. if( (dwTrackFlags&TPMX_RIBBON_RESIZING) != 0 )
  586. {
  587. nMarginHeight = 10;
  588. if( (dwTrackFlags&TPMX_RIBBON_RESIZING_VERTICAL_ONLY) == 0 )
  589. nResizingCornerPartWidth = 10;
  590. }
  591. }
  592. void CExtPaintManagerOffice2007_Impl::MenuBottomResizingMarginGetInfo(
  593. INT & nMarginHeight,
  594. INT & nResizingCornerPartWidth,
  595. CExtPopupMenuWnd * pPopup,
  596. LPARAM lParam // = 0L
  597. )
  598. {
  599. ASSERT_VALID( this );
  600. ASSERT_VALID( pPopup );
  601. if( IsHighContrast() )
  602. {
  603. CExtPaintManagerXP::MenuBottomResizingMarginGetInfo(
  604. nMarginHeight,
  605. nResizingCornerPartWidth,
  606. pPopup,
  607. lParam
  608. );
  609. return;
  610. }
  611. DWORD dwTrackFlags = pPopup->TrackFlagsGet();
  612. if( (dwTrackFlags&TPMX_RIBBON_RESIZING) != 0 )
  613. {
  614. if( (dwTrackFlags&TPMX_RIBBON_RESIZING_VERTICAL_ONLY) != 0 )
  615. {
  616. if( m_bmpRibbonMenuResizingMarginV.IsEmpty() )
  617. nMarginHeight = m_bmpResizingGripper.GetSize().cy;
  618. else
  619. nMarginHeight = m_bmpRibbonMenuResizingMarginV.GetSize().cy;
  620. }
  621. else
  622. {
  623. if( m_bmpRibbonMenuResizingMarginHV.IsEmpty() )
  624. nMarginHeight = m_bmpResizingGripper.GetSize().cy;
  625. else
  626. nMarginHeight = m_bmpRibbonMenuResizingMarginHV.GetSize().cy;
  627. if( m_bmpRibbonMenuResizingGripperHV.IsEmpty() )
  628. nResizingCornerPartWidth = m_bmpResizingGripper.GetSize().cx;
  629. else
  630. nResizingCornerPartWidth = m_bmpRibbonMenuResizingGripperHV.GetSize().cx;
  631. }
  632. }
  633. }
  634. void CExtPaintManager::MenuBottomResizingMarginPaint(
  635. CDC & dc,
  636. const RECT & rcResizingArea,
  637. CExtPopupMenuWnd * pPopup,
  638. LPARAM lParam // = 0L
  639. )
  640. {
  641. ASSERT_VALID( this );
  642. ASSERT( dc.GetSafeHdc() != NULL );
  643. ASSERT_VALID( pPopup );
  644. lParam;
  645. if( ! dc.RectVisible( &rcResizingArea ) )
  646. return;
  647. DWORD dwTrackFlags = pPopup->TrackFlagsGet();
  648. if( (dwTrackFlags&TPMX_RIBBON_RESIZING) == 0 )
  649. return;
  650. if( (dwTrackFlags&TPMX_RIBBON_RESIZING_VERTICAL_ONLY) != 0 )
  651. {
  652. PaintMenuTearOffButton( dc, rcResizingArea, false, false, pPopup, lParam );
  653. return;
  654. }
  655. INT nMarginHeight = 0, nResizingCornerPartWidth = 0;
  656. MenuBottomResizingMarginGetInfo( nMarginHeight, nResizingCornerPartWidth, pPopup, lParam );
  657. CRect rcGrip = rcResizingArea;
  658. rcGrip.left = rcGrip.right - nResizingCornerPartWidth;
  659. if( ! dc.RectVisible( &rcGrip ) )
  660. return;
  661. PaintResizingGripper( dc, rcGrip, pPopup, lParam );
  662. }
  663. void CExtPaintManagerOffice2007_Impl::MenuBottomResizingMarginPaint(
  664. CDC & dc,
  665. const RECT & rcResizingArea,
  666. CExtPopupMenuWnd * pPopup,
  667. LPARAM lParam // = 0L
  668. )
  669. {
  670. ASSERT_VALID( this );
  671. ASSERT( dc.GetSafeHdc() != NULL );
  672. ASSERT_VALID( pPopup );
  673. if( ! dc.RectVisible( &rcResizingArea ) )
  674. return;
  675. if( IsHighContrast() )
  676. {
  677. CExtPaintManagerXP::MenuBottomResizingMarginPaint( dc, rcResizingArea, pPopup, lParam );
  678. return;
  679. }
  680. DWORD dwTrackFlags = pPopup->TrackFlagsGet();
  681. if( (dwTrackFlags&TPMX_RIBBON_RESIZING) == 0 )
  682. return;
  683. if( (dwTrackFlags&TPMX_RIBBON_RESIZING_VERTICAL_ONLY) != 0 )
  684. {
  685. if( m_bmpRibbonMenuResizingMarginV.IsEmpty() )
  686. {
  687. INT nMarginHeight = 0, nResizingCornerPartWidth = 0;
  688. MenuBottomResizingMarginGetInfo( nMarginHeight, nResizingCornerPartWidth, pPopup, lParam );
  689. CRect rcGrip = rcResizingArea;
  690. rcGrip.left = rcGrip.right - nResizingCornerPartWidth;
  691. if( ! dc.RectVisible( &rcGrip ) )
  692. return;
  693. PaintResizingGripper( dc, rcGrip, pPopup, lParam );
  694. return;
  695. }
  696. m_bmpRibbonMenuResizingMarginV.AlphaBlendSkinParts(
  697. dc.m_hDC,
  698. rcResizingArea,
  699. m_rcPaddingRibbonMenuResizingMarginV,
  700. CExtBitmap::__EDM_STRETCH,
  701. true,
  702. true
  703. );
  704. m_bmpRibbonMenuResizingGripperV.AlphaBlendSkinParts(
  705. dc.m_hDC,
  706. rcResizingArea,
  707. CRect(0,0,0,0),
  708. CExtBitmap::__EDM_CENTER,
  709. true,
  710. true
  711. );
  712. }
  713. else
  714. {
  715. if( m_bmpRibbonMenuResizingMarginHV.IsEmpty() )
  716. {
  717. INT nMarginHeight = 0, nResizingCornerPartWidth = 0;
  718. MenuBottomResizingMarginGetInfo( nMarginHeight, nResizingCornerPartWidth, pPopup, lParam );
  719. CRect rcGrip = rcResizingArea;
  720. rcGrip.left = rcGrip.right - nResizingCornerPartWidth;
  721. if( ! dc.RectVisible( &rcGrip ) )
  722. return;
  723. PaintResizingGripper( dc, rcGrip, pPopup, lParam );
  724. return;
  725. }
  726. m_bmpRibbonMenuResizingMarginHV.AlphaBlendSkinParts(
  727. dc.m_hDC,
  728. rcResizingArea,
  729. m_rcPaddingRibbonMenuResizingMarginHV,
  730. CExtBitmap::__EDM_STRETCH,
  731. true,
  732. true
  733. );
  734. CSize _size = m_bmpRibbonMenuResizingGripperHV.GetSize();
  735. CRect rcGrip(
  736. rcResizingArea.right - _size.cx,
  737. rcResizingArea.bottom - _size.cy,
  738. rcResizingArea.right,
  739. rcResizingArea.bottom
  740. );
  741. if( ! dc.RectVisible( &rcGrip ) )
  742. return;
  743. m_bmpRibbonMenuResizingGripperHV.AlphaBlendSkinParts(
  744. dc.m_hDC,
  745. rcGrip,
  746. CRect(0,0,0,0),
  747. CExtBitmap::__EDM_CENTER,
  748. true,
  749. true
  750. );
  751. }
  752. }
  753. CFont * CExtPaintManager::MenuCaptionGetFont(
  754. CExtPopupMenuWnd * pPopup,
  755. LPARAM lParam // = 0L
  756. ) const
  757. {
  758. ASSERT_VALID( this );
  759. ASSERT_VALID( pPopup );
  760. pPopup;
  761. lParam;
  762. return ( const_cast < CFont * > ( & m_FontNormal ) );
  763. }
  764. CSize CExtPaintManager::MenuCaption_Measure(
  765. CDC & dc,
  766. __EXT_MFC_SAFE_LPCTSTR sMenuCaptionText,
  767. CExtPopupMenuWnd * pPopup,
  768. LPARAM lParam // = 0L
  769. ) const
  770. {
  771. ASSERT_VALID( this );
  772. ASSERT( dc.GetSafeHdc() != NULL );
  773. ASSERT_VALID( pPopup );
  774. if( sMenuCaptionText == NULL )
  775. return CSize( 0, 0 );
  776. CExtSafeString _sText = sMenuCaptionText;
  777. if( _sText.GetLength() == 0 )
  778. return CSize( 0, 0 );
  779. CFont * pFont = MenuCaptionGetFont( pPopup, lParam );
  780. ASSERT( pFont->GetSafeHandle() != NULL );
  781. CSize _size =
  782. stat_CalcTextDimension(
  783. dc,
  784. *pFont,
  785. _sText,
  786. DT_SINGLELINE|DT_TOP|DT_LEFT
  787. ).Size();
  788. _size.cx += 20;
  789. _size.cy += 8;
  790. return _size;
  791. }
  792. void CExtPaintManager::MenuCaption_Paint(
  793. CDC & dc,
  794. const RECT & rcMenuCaption,
  795. __EXT_MFC_SAFE_LPCTSTR sMenuCaptionText,
  796. CExtPopupMenuWnd * pPopup,
  797. LPARAM lParam // = 0L
  798. ) const
  799. {
  800. ASSERT_VALID( this );
  801. ASSERT( dc.GetSafeHdc() != NULL );
  802. if( ( ! dc.RectVisible( &rcMenuCaption ) )
  803. //|| sMenuCaptionText == NULL
  804. )
  805. return;
  806. INT nTextLen = ( sMenuCaptionText != NULL ) ? INT( _tcslen( sMenuCaptionText ) ) : 0;
  807. // if( nTextLen == 0 )
  808. // return;
  809. CRect _rcMenuCaption = rcMenuCaption;
  810. if( _rcMenuCaption.IsRectEmpty()
  811. || ( ! dc.RectVisible( &_rcMenuCaption ) )
  812. )
  813. return;
  814. _rcMenuCaption.DeflateRect( 2, 2, 2, 0 );
  815. dc.FillSolidRect( &_rcMenuCaption, GetColor( COLOR_3DSHADOW ) );
  816. _rcMenuCaption.DeflateRect( 8, 0 );
  817. if( nTextLen )
  818. {
  819. bool bRTL = (pPopup != NULL) ? pPopup->OnQueryLayoutRTL() : false;
  820. UINT nDT = DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS|DT_NOCLIP
  821. | ( bRTL ? DT_RIGHT : DT_LEFT );
  822. CFont * pFont = MenuCaptionGetFont( pPopup, lParam );
  823. ASSERT( pFont->GetSafeHandle() != NULL );
  824. CFont * pOldFont = dc.SelectObject( pFont );
  825. COLORREF clrOldText = dc.SetTextColor( GetColor( COLOR_3DHIGHLIGHT ) );
  826. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  827. dc.DrawText(
  828. LPCTSTR( sMenuCaptionText ),
  829. nTextLen,
  830. &_rcMenuCaption,
  831. nDT
  832. );
  833. dc.SetBkMode( nOldBkMode );
  834. dc.SetTextColor( clrOldText );
  835. dc.SelectObject( pOldFont );
  836. } // if( nTextLen )
  837. }
  838. void CExtPaintManagerOffice2007_Impl::MenuCaption_Paint(
  839. CDC & dc,
  840. const RECT & rcMenuCaption,
  841. __EXT_MFC_SAFE_LPCTSTR sMenuCaptionText,
  842. CExtPopupMenuWnd * pPopup,
  843. LPARAM lParam // = 0L
  844. ) const
  845. {
  846. ASSERT_VALID( this );
  847. ASSERT( dc.GetSafeHdc() != NULL );
  848. // ASSERT_VALID( pPopup );
  849. if( ( ! dc.RectVisible( &rcMenuCaption ) )
  850. //|| sMenuCaptionText == NULL
  851. )
  852. return;
  853. if( IsHighContrast() )
  854. {
  855. CExtPaintManagerXP::MenuCaption_Paint(
  856. dc,
  857. rcMenuCaption,
  858. sMenuCaptionText,
  859. pPopup,
  860. lParam
  861. );
  862. return;
  863. }
  864. INT nTextLen = ( sMenuCaptionText != NULL ) ? INT( _tcslen( sMenuCaptionText ) ) : 0;
  865. // if( nTextLen == 0 )
  866. // return;
  867. CRect _rcMenuCaption = rcMenuCaption;
  868. if( _rcMenuCaption.IsRectEmpty()
  869. || ( ! dc.RectVisible( &_rcMenuCaption ) )
  870. )
  871. return;
  872. CRect _rcMenuCaptionBk = _rcMenuCaption;
  873. //_rcMenuCaptionBk.InflateRect( 2, 2, 2, 0 );
  874. m_bmpMenuCaptionBk.AlphaBlendSkinParts(
  875. dc.m_hDC,
  876. _rcMenuCaptionBk,
  877. m_rcMenuCaptionBmpPadding,
  878. CExtBitmap::__EDM_STRETCH,
  879. true,
  880. true
  881. );
  882. _rcMenuCaption.DeflateRect( 10, 0 );
  883. if( nTextLen != 0 )
  884. {
  885. bool bRTL = ( pPopup != NULL ) ? pPopup->OnQueryLayoutRTL() : false;
  886. UINT nDT = DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS|DT_NOCLIP
  887. | ( bRTL ? DT_RIGHT : DT_LEFT );
  888. CFont * pFont = MenuCaptionGetFont( pPopup, lParam );
  889. ASSERT( pFont->GetSafeHandle() != NULL );
  890. CFont * pOldFont = dc.SelectObject( pFont );
  891. COLORREF clrOldText = dc.SetTextColor( m_clrMenuCaptionText );
  892. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  893. dc.DrawText(
  894. LPCTSTR( sMenuCaptionText ),
  895. nTextLen,
  896. &_rcMenuCaption,
  897. nDT
  898. );
  899. dc.SetBkMode( nOldBkMode );
  900. dc.SetTextColor( clrOldText );
  901. dc.SelectObject( pOldFont );
  902. }
  903. }
  904. CExtPaintManagerOffice2007_Blue::CExtPaintManagerOffice2007_Blue()
  905. {
  906. }
  907. CExtPaintManagerOffice2007_Blue::~CExtPaintManagerOffice2007_Blue()
  908. {
  909. }
  910. CExtPaintManagerOffice2007_Black::CExtPaintManagerOffice2007_Black()
  911. {
  912. }
  913. CExtPaintManagerOffice2007_Black::~CExtPaintManagerOffice2007_Black()
  914. {
  915. }
  916. CExtPaintManagerOffice2007_Silver::CExtPaintManagerOffice2007_Silver()
  917. {
  918. }
  919. CExtPaintManagerOffice2007_Silver::~CExtPaintManagerOffice2007_Silver()
  920. {
  921. }
  922. bool CExtPaintManager::PaintProgress(
  923. CDC & dc,
  924. CExtPaintManager::PAINTPROGRESSDATA & _ppd
  925. )
  926. {
  927. ASSERT_VALID( this );
  928. ASSERT_VALID( (&dc) );
  929. ASSERT( dc.GetSafeHdc() != NULL );
  930. dc;
  931. _ppd;
  932. return false;
  933. }
  934. bool CExtPaintManagerNativeXP::PaintProgress(
  935. CDC & dc,
  936. CExtPaintManager::PAINTPROGRESSDATA & _ppd
  937. )
  938. {
  939. ASSERT_VALID( this );
  940. ASSERT_VALID( (&dc) );
  941. ASSERT( dc.GetSafeHdc() != NULL );
  942. if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  943. return CExtPaintManager::PaintProgress( dc, _ppd );
  944. if( g_PaintManager.m_UxTheme.OpenThemeData( ::GetDesktopWindow(), L"PROGRESS" ) == NULL )
  945. return false;
  946. CRect rcProgress( _ppd.m_rcClient );
  947. if( g_PaintManager.m_UxTheme.DrawThemeBackground(
  948. dc.GetSafeHdc(), 
  949. _ppd.m_bHorz ? PP_BAR : PP_BARVERT, 
  950. 0, 
  951. &rcProgress, 
  952. &rcProgress
  953. ) == S_OK
  954. )
  955. {
  956. if( _ppd.m_bEndlessMode )
  957. {
  958. ASSERT( _ppd.m_nEndlessNominator > 0 );
  959. ASSERT( _ppd.m_nEndlessDenominator > 0 );
  960. ASSERT( _ppd.m_nEndlessNominator < _ppd.m_nEndlessDenominator );
  961. if( _ppd.m_bHorz )
  962. {
  963. LONG nBasic = rcProgress.Width();
  964. LONG nCross = rcProgress.Height();
  965. if( nCross <= 0 )
  966. nCross = 1;
  967. LONG nAll = nBasic - nBasic % nCross;
  968. LONG nPart = ::MulDiv( nAll, _ppd.m_nEndlessNominator, _ppd.m_nEndlessDenominator );
  969. LONG nExt = nAll - nPart;
  970. rcProgress.left += ::MulDiv( nExt, _ppd.m_nPos, _ppd.m_nRange );
  971. rcProgress.right = rcProgress.left + nPart;
  972. }
  973. else
  974. {
  975. LONG nBasic = rcProgress.Height();
  976. LONG nCross = rcProgress.Width();
  977. if( nCross <= 0 )
  978. nCross = 1;
  979. LONG nAll = nBasic - nBasic % nCross;
  980. LONG nPart = ::MulDiv( nAll, _ppd.m_nEndlessNominator, _ppd.m_nEndlessDenominator );
  981. LONG nExt = nAll - nPart;
  982. rcProgress.bottom -= ::MulDiv( nExt, _ppd.m_nPos, _ppd.m_nRange );
  983. rcProgress.top = rcProgress.bottom - nPart;
  984. }
  985. } // if( _ppd.m_bEndlessMode )
  986. else
  987. {
  988. if( _ppd.m_bHorz )
  989. rcProgress.right =
  990.   rcProgress.left
  991. + ::MulDiv( rcProgress.Width(), _ppd.m_nPos, _ppd.m_nRange );
  992. else
  993. rcProgress.top =
  994.   rcProgress.bottom
  995. - ::MulDiv( rcProgress.Height(), _ppd.m_nPos, _ppd.m_nRange );
  996. } // else from if( _ppd.m_bEndlessMode )
  997. INT nChunkSize = 0; // The size of the progress control "chunk" shapes that define how far an operation has progressed
  998. INT nSpaceSize = 0; // The total size of all of the progress control "chunks"
  999. if( g_PaintManager.m_UxTheme.GetThemeMetric(
  1000. dc.GetSafeHdc(), 
  1001. _ppd.m_bHorz ? PP_CHUNK : PP_CHUNKVERT,
  1002. 0, 
  1003. TMT_PROGRESSCHUNKSIZE, 
  1004. &nChunkSize
  1005. ) == S_OK
  1006. && g_PaintManager.m_UxTheme.GetThemeMetric(
  1007. dc.GetSafeHdc(), 
  1008. _ppd.m_bHorz ? PP_CHUNK : PP_CHUNKVERT,
  1009. 0, 
  1010. TMT_PROGRESSSPACESIZE, 
  1011. &nSpaceSize
  1012. ) == S_OK
  1013. )
  1014. {
  1015. rcProgress.DeflateRect( 2, 2 );
  1016. CRect rcChunk( rcProgress );
  1017. INT nChunkShift = nChunkSize + nSpaceSize;
  1018. rcChunk.SetRect(
  1019. _ppd.m_bHorz ? rcChunk.left : rcChunk.left,
  1020. _ppd.m_bHorz ? rcChunk.top  : (rcChunk.bottom - nChunkSize ),
  1021. _ppd.m_bHorz ? ( rcChunk.left + nChunkSize ) : rcChunk.right,
  1022. _ppd.m_bHorz ? rcChunk.bottom : rcChunk.bottom
  1023. );
  1024. ASSERT( 
  1025. ( (!_ppd.m_bHorz) && rcChunk.Height() == nChunkSize )
  1026. || ( _ppd.m_bHorz    && rcChunk.Width() == nChunkSize )
  1027. );
  1028. while( true )
  1029. {
  1030. CRect rcProgressFullClip = rcProgress;
  1031. rcProgressFullClip.DeflateRect( 2, 2 );
  1032. CRect rcChunkClip;
  1033. rcChunkClip.IntersectRect( &rcProgressFullClip, rcChunk );
  1034. if( g_PaintManager.m_UxTheme.DrawThemeBackground(
  1035. dc.GetSafeHdc(), 
  1036. _ppd.m_bHorz ? PP_CHUNK : PP_CHUNKVERT,
  1037. 0, 
  1038. &rcChunk, 
  1039. &rcChunkClip
  1040. ) != S_OK
  1041. )
  1042. break;
  1043. if( _ppd.m_bHorz )
  1044. {
  1045. if( rcChunk.right > rcProgress.right )
  1046. break;
  1047. }
  1048. else
  1049. {
  1050. if( rcChunk.top < rcProgress.top )
  1051. break;
  1052. }
  1053. rcChunk.OffsetRect( 
  1054. _ppd.m_bHorz ? nChunkShift : 0, 
  1055. _ppd.m_bHorz ? 0 : ( - nChunkShift )
  1056. );
  1057. }
  1058. }
  1059. }
  1060. g_PaintManager.m_UxTheme.CloseThemeData( true );
  1061. return true;
  1062. }
  1063. bool CExtPaintManagerOffice2007_Impl::PaintProgress(
  1064. CDC & dc,
  1065. CExtPaintManager::PAINTPROGRESSDATA & _ppd
  1066. )
  1067. {
  1068. ASSERT_VALID( this );
  1069. ASSERT_VALID( (&dc) );
  1070. ASSERT( dc.GetSafeHdc() != NULL );
  1071. if( IsHighContrast() )
  1072. return 
  1073. CExtPaintManagerXP::PaintProgress(
  1074. dc,
  1075. _ppd
  1076. );
  1077. if( _ppd.m_rcClient.Width() <= 0
  1078. || _ppd.m_rcClient.Height() <= 0
  1079. || ( ! dc.RectVisible( &_ppd.m_rcClient ) )
  1080. )
  1081. return false;
  1082. CExtBitmap & bmpProgressMain = _ppd.m_bHorz ? m_bmpProgressMainH : m_bmpProgressMainV;
  1083. if( bmpProgressMain.IsEmpty() )
  1084. return false;
  1085. CRect rcProgress( _ppd.m_rcClient );
  1086. // if( _ppd.m_pHelperSrc == NULL
  1087. // || ( ! _ppd.m_pHelperSrc->IsKindOf( RUNTIME_CLASS( CWnd ) ) )
  1088. // || ( ! GetCb2DbTransparentMode( _ppd.m_pHelperSrc, _ppd.m_lParam ) )
  1089. // || ( ! PaintDockerBkgnd( true, dc, (CWnd*)_ppd.m_pHelperSrc, _ppd.m_lParam ) )
  1090. // )
  1091. // {
  1092. // COLORREF clrBackgroundArea = GetColor( COLOR_3DFACE, _ppd.m_pHelperSrc, _ppd.m_lParam );
  1093. // clrBackgroundArea = dc.GetNearestColor( clrBackgroundArea );
  1094. // dc.FillSolidRect( &rcProgress, clrBackgroundArea );
  1095. // }
  1096. if( _ppd.m_bBorder )
  1097. {
  1098. CExtBitmap & bmpProgressBorder = _ppd.m_bHorz ? m_bmpProgressBorderH : m_bmpProgressBorderV;
  1099. if( bmpProgressBorder.IsEmpty() )
  1100. return false;
  1101. CRect rcProgressBorderPadding = _ppd.m_bHorz ? m_rcProgressBorderPaddingH : m_rcProgressBorderPaddingV;
  1102. if( ! bmpProgressBorder.AlphaBlendSkinParts(
  1103. dc.m_hDC,
  1104. rcProgress,
  1105. rcProgressBorderPadding,
  1106. CExtBitmap::__EDM_STRETCH,
  1107. true,
  1108. true
  1109. )
  1110. )
  1111. return false;
  1112. rcProgress.DeflateRect(
  1113. rcProgressBorderPadding.left,
  1114. rcProgressBorderPadding.top,
  1115. rcProgressBorderPadding.right,
  1116. rcProgressBorderPadding.bottom
  1117. );
  1118. } // if( _ppd.m_bBorder )
  1119. if( rcProgress.Width() <= 0
  1120. || rcProgress.Height() <= 0
  1121. || ( ! dc.RectVisible( &rcProgress ) )
  1122. )
  1123. return true;
  1124. CExtMemoryDC dcX( &dc, &rcProgress, CExtMemoryDC::MDCOPT_TO_MEMORY|CExtMemoryDC::MDCOPT_RTL_COMPATIBILITY );
  1125. CRect rcProgressBackgroundPadding = _ppd.m_bHorz ? m_rcProgressBackgroundPaddingH : m_rcProgressBackgroundPaddingV;
  1126. CRect rcProgressBackgroundPart = _ppd.m_bHorz ? m_rcProgressBackgroundPartH : m_rcProgressBackgroundPartV;
  1127. if( ! bmpProgressMain.AlphaBlendSkinParts(
  1128. dcX.m_hDC,
  1129. rcProgress,
  1130. rcProgressBackgroundPart,
  1131. rcProgressBackgroundPadding,
  1132. CExtBitmap::__EDM_STRETCH,
  1133. true,
  1134. true
  1135. )
  1136. )
  1137. return false;
  1138. CRect rcProgressBarPadding = _ppd.m_bHorz ? m_rcProgressBarPaddingH : m_rcProgressBarPaddingV;
  1139. if( _ppd.m_bEndlessMode )
  1140. {
  1141. ASSERT( _ppd.m_nEndlessNominator > 0 );
  1142. ASSERT( _ppd.m_nEndlessDenominator > 0 );
  1143. ASSERT( _ppd.m_nEndlessNominator < _ppd.m_nEndlessDenominator );
  1144. if( _ppd.m_bHorz )
  1145. {
  1146. LONG nAll = rcProgress.Width();;
  1147. LONG nPart = ::MulDiv( nAll, _ppd.m_nEndlessNominator, _ppd.m_nEndlessDenominator );
  1148. LONG nExt = nAll - nPart;
  1149. rcProgress.left += ::MulDiv( nExt, _ppd.m_nPos, _ppd.m_nRange );
  1150. rcProgress.right = rcProgress.left + nPart;
  1151. }
  1152. else
  1153. {
  1154. LONG nAll = rcProgress.Height();
  1155. LONG nPart = ::MulDiv( nAll, _ppd.m_nEndlessNominator, _ppd.m_nEndlessDenominator );
  1156. LONG nExt = nAll - nPart;
  1157. rcProgress.bottom -= ::MulDiv( nExt, _ppd.m_nPos, _ppd.m_nRange );
  1158. rcProgress.top = rcProgress.bottom - nPart;
  1159. }
  1160. } // if( _ppd.m_bEndlessMode )
  1161. else
  1162. {
  1163. if( _ppd.m_bHorz )
  1164. rcProgress.right =
  1165.   rcProgress.left
  1166. + ::MulDiv( rcProgress.Width(), _ppd.m_nPos, _ppd.m_nRange )
  1167. + rcProgressBarPadding.right
  1168. ;
  1169. else
  1170. rcProgress.top =
  1171.   rcProgress.bottom
  1172. - ::MulDiv( rcProgress.Height(), _ppd.m_nPos, _ppd.m_nRange )
  1173. - rcProgressBarPadding.top
  1174. ;
  1175. } // else from if( _ppd.m_bEndlessMode )
  1176. if( rcProgress.Width() <= 0
  1177. || rcProgress.Height() <= 0
  1178. || ( ! dcX.RectVisible( &rcProgress ) )
  1179. )
  1180. return true;
  1181. CRect rcProgressBarPart = _ppd.m_bHorz ? m_rcProgressBarPartH : m_rcProgressBarPartV;
  1182. if( ! bmpProgressMain.AlphaBlendSkinParts(
  1183. dcX.m_hDC,
  1184. rcProgress,
  1185. rcProgressBarPart,
  1186. rcProgressBarPadding,
  1187. CExtBitmap::__EDM_STRETCH,
  1188. true,
  1189. true
  1190. )
  1191. )
  1192. return false;
  1193. return true;
  1194. }
  1195. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  1196. CFont & CExtPaintManager::ScreenTip_GetFont(
  1197. bool bCaption,
  1198. bool bMainPart,
  1199. CExtCustomizeCmdScreenTip & _CCST,
  1200. CObject * pHelperSrc, // = NULL
  1201. LPARAM lParam // = 0L
  1202. )
  1203. {
  1204. ASSERT_VALID( this );
  1205. ASSERT_VALID( &_CCST );
  1206. bMainPart;
  1207. _CCST;
  1208. pHelperSrc;
  1209. lParam;
  1210. return bCaption ? m_FontBold : m_FontNormal;
  1211. }
  1212. CRect CExtPaintManager::ScreenTip_GetPaddingOuter(
  1213. CExtCustomizeCmdScreenTip & _CCST,
  1214. CObject * pHelperSrc, // = NULL
  1215. LPARAM lParam // = 0L
  1216. )
  1217. {
  1218. ASSERT_VALID( this );
  1219. ASSERT_VALID( &_CCST );
  1220. pHelperSrc;
  1221. lParam;
  1222. bool bMainTextMode = false;
  1223. CExtSafeString strCaptionMain = _CCST.CaptionMainGet();
  1224. CExtSafeString strTextMain = _CCST.TextMainGet();
  1225. CExtSafeString strCaptionSecondary = _CCST.CaptionSecondaryGet();
  1226. CExtSafeString strTextSecondary = _CCST.TextSecondaryGet();
  1227. if( strCaptionMain.IsEmpty()
  1228. && (! strTextMain.IsEmpty() )
  1229. && strCaptionSecondary.IsEmpty()
  1230. && strTextSecondary.IsEmpty()
  1231. )
  1232. bMainTextMode = true;
  1233. INT n = bMainTextMode ? 0 : 5;
  1234. CRect rcPadding( n, n, n, n );
  1235. rcPadding.left = UiScalingDo( rcPadding.left, __EUIST_X );
  1236. rcPadding.top = UiScalingDo( rcPadding.top, __EUIST_Y );
  1237. rcPadding.right = UiScalingDo( rcPadding.right, __EUIST_X );
  1238. rcPadding.bottom = UiScalingDo( rcPadding.bottom, __EUIST_Y );
  1239. return rcPadding;
  1240. }
  1241. CRect CExtPaintManager::ScreenTip_GetPaddingInnerBmp(
  1242. bool bMainPart,
  1243. CExtCustomizeCmdScreenTip & _CCST,
  1244. CObject * pHelperSrc, // = NULL
  1245. LPARAM lParam // = 0L
  1246. )
  1247. {
  1248. ASSERT_VALID( this );
  1249. ASSERT_VALID( &_CCST );
  1250. bMainPart;
  1251. _CCST;
  1252. pHelperSrc;
  1253. lParam;
  1254. CRect rcPadding( 2, 2, 2, 2 );
  1255. rcPadding.left = UiScalingDo( rcPadding.left, __EUIST_X );
  1256. rcPadding.top = UiScalingDo( rcPadding.top, __EUIST_Y );
  1257. rcPadding.right = UiScalingDo( rcPadding.right, __EUIST_X );
  1258. rcPadding.bottom = UiScalingDo( rcPadding.bottom, __EUIST_Y );
  1259. return rcPadding;
  1260. }
  1261. CRect CExtPaintManager::ScreenTip_GetPaddingInnerText(
  1262. bool bCaption,
  1263. bool bMainPart,
  1264. CExtCustomizeCmdScreenTip & _CCST,
  1265. CObject * pHelperSrc, // = NULL
  1266. LPARAM lParam // = 0L
  1267. )
  1268. {
  1269. ASSERT_VALID( this );
  1270. ASSERT_VALID( &_CCST );
  1271. bCaption;
  1272. bMainPart;
  1273. _CCST;
  1274. pHelperSrc;
  1275. lParam;
  1276. CRect rcPadding( 3, 3, 3, 3 );
  1277. if( ! bCaption )
  1278. rcPadding.left += 10;
  1279. rcPadding.left = UiScalingDo( rcPadding.left, __EUIST_X );
  1280. rcPadding.top = UiScalingDo( rcPadding.top, __EUIST_Y );
  1281. rcPadding.right = UiScalingDo( rcPadding.right, __EUIST_X );
  1282. rcPadding.bottom = UiScalingDo( rcPadding.bottom, __EUIST_Y );
  1283. return rcPadding;
  1284. }
  1285. INT CExtPaintManager::ScreenTip_GetSeparatorHeight(
  1286. CExtCustomizeCmdScreenTip & _CCST,
  1287. CObject * pHelperSrc, // = NULL
  1288. LPARAM lParam // = 0L
  1289. )
  1290. {
  1291. ASSERT_VALID( this );
  1292. ASSERT_VALID( &_CCST );
  1293. pHelperSrc;
  1294. lParam;
  1295. bool bHaveSeparator = ( (_CCST.GetFlags()&__ECCST_SEPARATOR) != 0 ) ? true : false;
  1296. if( ! bHaveSeparator )
  1297. return 0;
  1298. INT nSeparatorHeight = UiScalingDo( 11, __EUIST_Y );
  1299. return nSeparatorHeight;
  1300. }
  1301. COLORREF CExtPaintManager::ScreenTip_GetTextColor(
  1302. bool bCaption,
  1303. bool bMainPart,
  1304. CExtCustomizeCmdScreenTip & _CCST,
  1305. CObject * pHelperSrc, // = NULL
  1306. LPARAM lParam // = 0L
  1307. )
  1308. {
  1309. ASSERT_VALID( this );
  1310. ASSERT_VALID( &_CCST );
  1311. bCaption;
  1312. bMainPart;
  1313. _CCST;
  1314. COLORREF clrText = GetColor( COLOR_INFOTEXT, pHelperSrc, lParam );
  1315. return clrText;
  1316. }
  1317. COLORREF CExtPaintManagerOffice2007_Impl::ScreenTip_GetTextColor(
  1318. bool bCaption,
  1319. bool bMainPart,
  1320. CExtCustomizeCmdScreenTip & _CCST,
  1321. CObject * pHelperSrc, // = NULL
  1322. LPARAM lParam // = 0L
  1323. )
  1324. {
  1325. ASSERT_VALID( this );
  1326. ASSERT_VALID( &_CCST );
  1327. if( IsHighContrast() )
  1328. return 
  1329. CExtPaintManagerXP::ScreenTip_GetTextColor(
  1330. bCaption,
  1331. bMainPart,
  1332. _CCST,
  1333. pHelperSrc,
  1334. lParam
  1335. );
  1336. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  1337. return m_clrRibbonGroupCaptionTextCollapsed;
  1338. #else
  1339. return RGB(0,0,0);
  1340. #endif
  1341. }
  1342. CSize CExtPaintManager::ScreenTip_Measure(
  1343. CDC & dc,
  1344. CExtCustomizeCmdScreenTip & _CCST,
  1345. CObject * pHelperSrc, // = NULL
  1346. LPARAM lParam // = 0L
  1347. )
  1348. {
  1349. ASSERT_VALID( this );
  1350. ASSERT( dc.GetSafeHdc() != NULL );
  1351. ASSERT_VALID( &_CCST );
  1352. if( _CCST.IsEmpty() )
  1353. return CSize( 0, 0 );
  1354. bool bMainPartEmpty = true, bSecondaryPartEmpty = true;
  1355. CSize _sizeBmpMain = _CCST.BmpMainGet().GetSize();
  1356. _sizeBmpMain.cx = UiScalingDo( _sizeBmpMain.cx, __EUIST_X );
  1357. _sizeBmpMain.cy = UiScalingDo( _sizeBmpMain.cy, __EUIST_Y );
  1358. if( _sizeBmpMain.cx > 0 && _sizeBmpMain.cy > 0 )
  1359. {
  1360. CRect rcPadding = ScreenTip_GetPaddingInnerBmp( true, _CCST, pHelperSrc, lParam );
  1361. _sizeBmpMain.cx += rcPadding.left + rcPadding.right;
  1362. _sizeBmpMain.cy += rcPadding.top + rcPadding.bottom;
  1363. bMainPartEmpty = false;
  1364. }
  1365. CSize _sizeBmpSecondary = _CCST.BmpSecondaryGet().GetSize();
  1366. _sizeBmpSecondary.cx = UiScalingDo( _sizeBmpSecondary.cx, __EUIST_X );
  1367. _sizeBmpSecondary.cy = UiScalingDo( _sizeBmpSecondary.cy, __EUIST_Y );
  1368. if( _sizeBmpSecondary.cx > 0 && _sizeBmpSecondary.cy > 0 )
  1369. {
  1370. CRect rcPadding = ScreenTip_GetPaddingInnerBmp( false, _CCST, pHelperSrc, lParam );
  1371. _sizeBmpSecondary.cx += rcPadding.left + rcPadding.right;
  1372. _sizeBmpSecondary.cy += rcPadding.top + rcPadding.bottom;
  1373. bSecondaryPartEmpty = false;
  1374. }
  1375. CExtSafeString str;
  1376. str = _CCST.CaptionMainGet();
  1377. CSize _sizeCaptionMain( 0, 0 );
  1378. if( str.GetLength() > 0 )
  1379. {
  1380. CRect rcPadding = ScreenTip_GetPaddingInnerText( true, true, _CCST, pHelperSrc, lParam );
  1381. CFont & _font = ScreenTip_GetFont( true, true, _CCST, pHelperSrc, lParam );
  1382. _sizeCaptionMain = stat_CalcTextDimension( dc, _font, str, DT_CALCRECT|DT_SINGLELINE|DT_LEFT|DT_TOP ).Size();
  1383. _sizeCaptionMain.cx += rcPadding.left + rcPadding.right;
  1384. _sizeCaptionMain.cy += rcPadding.top + rcPadding.bottom;
  1385. bMainPartEmpty = false;
  1386. }
  1387. str = _CCST.CaptionSecondaryGet();
  1388. CSize _sizeCaptionSecondary( 0, 0 );
  1389. if( str.GetLength() > 0 )
  1390. {
  1391. CRect rcPadding = ScreenTip_GetPaddingInnerText( true, false, _CCST, pHelperSrc, lParam );
  1392. CFont & _font = ScreenTip_GetFont( true, false, _CCST, pHelperSrc, lParam );
  1393. _sizeCaptionSecondary = stat_CalcTextDimension( dc, _font, str, DT_CALCRECT|DT_SINGLELINE|DT_LEFT|DT_TOP ).Size();
  1394. _sizeCaptionSecondary.cx += rcPadding.left + rcPadding.right;
  1395. _sizeCaptionSecondary.cy += rcPadding.top + rcPadding.bottom;
  1396. bSecondaryPartEmpty = false;
  1397. }
  1398. CSize _sizeTextMain( 0, 0 );
  1399. str = _CCST.TextMainGet();
  1400. if( str.GetLength() > 0 )
  1401. {
  1402. CRect rcPadding = ScreenTip_GetPaddingInnerText( false, true, _CCST, pHelperSrc, lParam );
  1403. CFont & _font = ScreenTip_GetFont( false, true, _CCST, pHelperSrc, lParam );
  1404. _sizeTextMain = stat_CalcTextDimension( dc, _font, str, DT_CALCRECT|DT_LEFT|DT_TOP ).Size();
  1405. _sizeTextMain.cx += rcPadding.left + rcPadding.right;
  1406. _sizeTextMain.cy += rcPadding.top + rcPadding.bottom;
  1407. bMainPartEmpty = false;
  1408. }
  1409. CSize _sizeTextSecondary( 0, 0 );
  1410. str = _CCST.TextSecondaryGet();
  1411. if( str.GetLength() > 0 )
  1412. {
  1413. CRect rcPadding = ScreenTip_GetPaddingInnerText( false, false, _CCST, pHelperSrc, lParam );
  1414. CFont & _font = ScreenTip_GetFont( false, false, _CCST, pHelperSrc, lParam );
  1415. _sizeTextSecondary = stat_CalcTextDimension( dc, _font, str, DT_CALCRECT|DT_LEFT|DT_TOP ).Size();
  1416. _sizeTextSecondary.cx += rcPadding.left + rcPadding.right;
  1417. _sizeTextSecondary.cy += rcPadding.top + rcPadding.bottom;
  1418. bSecondaryPartEmpty = false;
  1419. }
  1420. if( bMainPartEmpty && bSecondaryPartEmpty )
  1421. return CSize( 0, 0 );
  1422. CRect rcPadding = ScreenTip_GetPaddingOuter( _CCST, pHelperSrc, lParam );
  1423. CSize _sizeAll( rcPadding.left + rcPadding.right, rcPadding.top + rcPadding.bottom ), _sizeMain( 0, 0 ), _sizeSecondary( 0, 0 );
  1424. if( ! ( bMainPartEmpty || bSecondaryPartEmpty ) )
  1425. _sizeAll.cy += ScreenTip_GetSeparatorHeight( _CCST, pHelperSrc, lParam );
  1426. if( ! bMainPartEmpty )
  1427. {
  1428. _sizeMain = _sizeCaptionMain;
  1429. INT nWidth = _sizeBmpMain.cx + _sizeTextMain.cx;
  1430. _sizeMain.cx = max( _sizeMain.cx, nWidth );
  1431. INT nHeight = max( _sizeBmpMain.cy, _sizeTextMain.cy );
  1432. _sizeMain.cy += nHeight;
  1433. }
  1434. if( ! bSecondaryPartEmpty )
  1435. {
  1436. _sizeSecondary.cx = max( _sizeCaptionSecondary.cx, _sizeTextSecondary.cx );
  1437. _sizeSecondary.cx += _sizeBmpSecondary.cx;
  1438. _sizeSecondary.cy = _sizeCaptionSecondary.cy + _sizeTextSecondary.cy;
  1439. _sizeSecondary.cy = max( _sizeBmpSecondary.cy, _sizeSecondary.cy );
  1440. }
  1441. _sizeAll.cx += max( _sizeMain.cx, _sizeSecondary.cx );
  1442. _sizeAll.cy += _sizeMain.cy + _sizeSecondary.cy;
  1443. return _sizeAll;
  1444. }
  1445. void CExtPaintManager::ScreenTip_PaintBackground(
  1446. CDC & dc,
  1447. const RECT & rcScreenTip,
  1448. CExtCustomizeCmdScreenTip & _CCST,
  1449. CObject * pHelperSrc, // = NULL
  1450. LPARAM lParam // = 0L
  1451. )
  1452. {
  1453. ASSERT_VALID( this );
  1454. ASSERT( dc.GetSafeHdc() != NULL );
  1455. ASSERT_VALID( &_CCST );
  1456. _CCST;
  1457. COLORREF clrOldText = dc.GetTextColor();
  1458. COLORREF clrBk = GetColor( COLOR_INFOBK, pHelperSrc, lParam );
  1459. dc.FillSolidRect( &rcScreenTip, clrBk );
  1460. COLORREF clrLT = GetColor( COLOR_3DFACE, pHelperSrc, lParam );
  1461. COLORREF clrRB = GetColor( COLOR_3DSHADOW, pHelperSrc, lParam );
  1462. dc.Draw3dRect( &rcScreenTip, clrLT, clrRB );
  1463. dc.SetTextColor( clrOldText );
  1464. }
  1465. void CExtPaintManagerOffice2007_Impl::ScreenTip_PaintBackground(
  1466. CDC & dc,
  1467. const RECT & rcScreenTip,
  1468. CExtCustomizeCmdScreenTip & _CCST,
  1469. CObject * pHelperSrc, // = NULL
  1470. LPARAM lParam // = 0L
  1471. )
  1472. {
  1473. ASSERT_VALID( this );
  1474. ASSERT( dc.GetSafeHdc() != NULL );
  1475. ASSERT_VALID( &_CCST );
  1476. if( IsHighContrast() )
  1477. {
  1478. CExtPaintManagerXP::ScreenTip_PaintBackground(
  1479. dc,
  1480. rcScreenTip,
  1481. _CCST,
  1482. pHelperSrc,
  1483. lParam
  1484. );
  1485. return;
  1486. }
  1487. CRect rcGradient = rcScreenTip;
  1488. rcGradient.DeflateRect(
  1489. m_rcAdvTipPaddingGradient.left,
  1490. m_rcAdvTipPaddingGradient.top,
  1491. m_rcAdvTipPaddingGradient.right,
  1492. m_rcAdvTipPaddingGradient.bottom
  1493. );
  1494. stat_PaintGradientRect(
  1495. dc,
  1496. rcGradient,
  1497. m_clrAdvTipGradientBottom,
  1498. m_clrAdvTipGradientTop,
  1499. true,
  1500. 255
  1501. );
  1502. m_bmpAdvTipBorder.AlphaBlendSkinParts(
  1503. dc,
  1504. rcScreenTip,
  1505. m_rcAdvTipPaddingBorder,
  1506. CExtBitmap::__EDM_STRETCH,
  1507. true,
  1508. true
  1509. );
  1510. }
  1511. void CExtPaintManager::ScreenTip_Paint(
  1512. CDC & dc,
  1513. const RECT & rcScreenTip,
  1514. CExtCustomizeCmdScreenTip & _CCST,
  1515. CObject * pHelperSrc, // = NULL
  1516. LPARAM lParam // = 0L
  1517. )
  1518. {
  1519. ASSERT_VALID( this );
  1520. ASSERT( dc.GetSafeHdc() != NULL );
  1521. ASSERT_VALID( &_CCST );
  1522. if( ! dc.RectVisible( &rcScreenTip ) )
  1523. return;
  1524. bool bPaintBackGround = true;
  1525. if( pHelperSrc != NULL
  1526. && pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtPopupMenuTipWnd ) )
  1527. )
  1528. {
  1529. CExtPopupMenuTipWnd::e_tip_style_t eTS = ((CExtPopupMenuTipWnd*)pHelperSrc)->GetTipStyle();
  1530. if( eTS == CExtPopupMenuTipWnd::__ETS_BALLOON
  1531. || eTS == CExtPopupMenuTipWnd::__ETS_BALLOON
  1532. )
  1533. bPaintBackGround = false;
  1534. }
  1535. if( bPaintBackGround )
  1536. ScreenTip_PaintBackground(
  1537. dc,
  1538. rcScreenTip,
  1539. _CCST,
  1540. pHelperSrc,
  1541. lParam
  1542. );
  1543. if( _CCST.IsEmpty() )
  1544. return;
  1545. bool bMainPartEmpty = true, bSecondaryPartEmpty = true;
  1546. CSize _sizeBmpMain = _CCST.BmpMainGet().GetSize();
  1547. _sizeBmpMain.cx = UiScalingDo( _sizeBmpMain.cx, __EUIST_X );
  1548. _sizeBmpMain.cy = UiScalingDo( _sizeBmpMain.cy, __EUIST_Y );
  1549. if( _sizeBmpMain.cx > 0 && _sizeBmpMain.cy > 0 )
  1550. {
  1551. CRect rcPadding = ScreenTip_GetPaddingInnerBmp( true, _CCST, pHelperSrc, lParam );
  1552. _sizeBmpMain.cx += rcPadding.left + rcPadding.right;
  1553. _sizeBmpMain.cy += rcPadding.top + rcPadding.bottom;
  1554. bMainPartEmpty = false;
  1555. }
  1556. CSize _sizeBmpSecondary = _CCST.BmpSecondaryGet().GetSize();
  1557. _sizeBmpSecondary.cx = UiScalingDo( _sizeBmpSecondary.cx, __EUIST_X );
  1558. _sizeBmpSecondary.cy = UiScalingDo( _sizeBmpSecondary.cy, __EUIST_Y );
  1559. if( _sizeBmpSecondary.cx > 0 && _sizeBmpSecondary.cy > 0 )
  1560. {
  1561. CRect rcPadding = ScreenTip_GetPaddingInnerBmp( false, _CCST, pHelperSrc, lParam );
  1562. _sizeBmpSecondary.cx += rcPadding.left + rcPadding.right;
  1563. _sizeBmpSecondary.cy += rcPadding.top + rcPadding.bottom;
  1564. bSecondaryPartEmpty = false;
  1565. }
  1566. CExtSafeString str;
  1567. str = _CCST.CaptionMainGet();
  1568. CSize _sizeCaptionMain( 0, 0 );
  1569. if( str.GetLength() > 0 )
  1570. {
  1571. CRect rcPadding = ScreenTip_GetPaddingInnerText( true, true, _CCST, pHelperSrc, lParam );
  1572. CFont & _font = ScreenTip_GetFont( true, true, _CCST, pHelperSrc, lParam );
  1573. _sizeCaptionMain = stat_CalcTextDimension( dc, _font, str, DT_CALCRECT|DT_SINGLELINE|DT_LEFT|DT_TOP ).Size();
  1574. _sizeCaptionMain.cx += rcPadding.left + rcPadding.right;
  1575. _sizeCaptionMain.cy += rcPadding.top + rcPadding.bottom;
  1576. bMainPartEmpty = false;
  1577. }
  1578. str = _CCST.CaptionSecondaryGet();
  1579. CSize _sizeCaptionSecondary( 0, 0 );
  1580. if( str.GetLength() > 0 )
  1581. {
  1582. CRect rcPadding = ScreenTip_GetPaddingInnerText( true, false, _CCST, pHelperSrc, lParam );
  1583. CFont & _font = ScreenTip_GetFont( true, false, _CCST, pHelperSrc, lParam );
  1584. _sizeCaptionSecondary = stat_CalcTextDimension( dc, _font, str, DT_CALCRECT|DT_SINGLELINE|DT_LEFT|DT_TOP ).Size();
  1585. _sizeCaptionSecondary.cx += rcPadding.left + rcPadding.right;
  1586. _sizeCaptionSecondary.cy += rcPadding.top + rcPadding.bottom;
  1587. bSecondaryPartEmpty = false;
  1588. }
  1589. CSize _sizeTextMain( 0, 0 );
  1590. str = _CCST.TextMainGet();
  1591. if( str.GetLength() > 0 )
  1592. {
  1593. CRect rcPadding = ScreenTip_GetPaddingInnerText( false, true, _CCST, pHelperSrc, lParam );
  1594. CFont & _font = ScreenTip_GetFont( false, true, _CCST, pHelperSrc, lParam );
  1595. _sizeTextMain = stat_CalcTextDimension( dc, _font, str, DT_CALCRECT|DT_LEFT|DT_TOP ).Size();
  1596. _sizeTextMain.cx += rcPadding.left + rcPadding.right;
  1597. _sizeTextMain.cy += rcPadding.top + rcPadding.bottom;
  1598. bMainPartEmpty = false;
  1599. }
  1600. CSize _sizeTextSecondary( 0, 0 );
  1601. str = _CCST.TextSecondaryGet();
  1602. if( str.GetLength() > 0 )
  1603. {
  1604. CRect rcPadding = ScreenTip_GetPaddingInnerText( false, false, _CCST, pHelperSrc, lParam );
  1605. CFont & _font = ScreenTip_GetFont( false, false, _CCST, pHelperSrc, lParam );
  1606. _sizeTextSecondary = stat_CalcTextDimension( dc, _font, str, DT_CALCRECT|DT_LEFT|DT_TOP ).Size();
  1607. _sizeTextSecondary.cx += rcPadding.left + rcPadding.right;
  1608. _sizeTextSecondary.cy += rcPadding.top + rcPadding.bottom;
  1609. bSecondaryPartEmpty = false;
  1610. }
  1611. if( bMainPartEmpty && bSecondaryPartEmpty )
  1612. return;
  1613. CSize _sizeMain( 0, 0 ), _sizeSecondary( 0, 0 );
  1614. if( ! bMainPartEmpty )
  1615. {
  1616. _sizeMain = _sizeCaptionMain;
  1617. INT nWidth = _sizeBmpMain.cx + _sizeTextMain.cx;
  1618. _sizeMain.cx = max( _sizeMain.cx, nWidth );
  1619. INT nHeight = max( _sizeBmpMain.cy, _sizeTextMain.cy );
  1620. _sizeMain.cy += nHeight;
  1621. }
  1622. if( ! bSecondaryPartEmpty )
  1623. {
  1624. _sizeSecondary.cx = max( _sizeCaptionSecondary.cx, _sizeTextSecondary.cx );
  1625. _sizeSecondary.cx += _sizeBmpSecondary.cx;
  1626. _sizeSecondary.cy = _sizeCaptionSecondary.cy + _sizeTextSecondary.cy;
  1627. _sizeSecondary.cy = max( _sizeBmpSecondary.cy, _sizeSecondary.cy );
  1628. }
  1629. INT nSeparatorHeight = 0;
  1630. if( ! ( bMainPartEmpty || bSecondaryPartEmpty ) )
  1631. nSeparatorHeight = ScreenTip_GetSeparatorHeight( _CCST, pHelperSrc, lParam );
  1632. CRect rcPadding = ScreenTip_GetPaddingOuter( _CCST, pHelperSrc, lParam );
  1633. CRect rcMainAll = rcScreenTip;
  1634. rcMainAll.DeflateRect( rcPadding.left, rcPadding.top, rcPadding.right, 0 );
  1635. rcMainAll.bottom = rcMainAll.top + _sizeMain.cy;
  1636. CRect rcSecondaryAll( rcMainAll.left, rcMainAll.bottom, rcMainAll.right, rcMainAll.bottom + _sizeSecondary.cy );
  1637. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  1638. CRect rcCaption = rcMainAll, rcBmp = rcMainAll, rcText = rcMainAll;
  1639. if( _sizeMain.cx > 0 && _sizeMain.cy > 0 )
  1640. {
  1641. str = _CCST.CaptionMainGet();
  1642. rcCaption.bottom = rcBmp.top = rcText.top = rcCaption.top + _sizeCaptionMain.cy;
  1643. rcBmp.right = rcText.left = rcBmp.left + _sizeBmpMain.cx;
  1644. if( _sizeCaptionMain.cx > 0 && _sizeCaptionMain.cy > 0 )
  1645. {
  1646. CRect rcPadding = ScreenTip_GetPaddingInnerText( true, true, _CCST, pHelperSrc, lParam );
  1647. rcCaption.DeflateRect( rcPadding.left, rcPadding.top, rcPadding.right, rcPadding.bottom );
  1648. COLORREF clrText = ScreenTip_GetTextColor( true, true, _CCST, pHelperSrc, lParam );
  1649. COLORREF clrOld = dc.SetTextColor( clrText );
  1650. CFont & _font = ScreenTip_GetFont( true, true, _CCST, pHelperSrc, lParam );
  1651. CFont * pOldFont = dc.SelectObject( &_font );
  1652. str = _CCST.CaptionMainGet();
  1653. ASSERT( str.GetLength() > 0 );
  1654. dc.DrawText(
  1655. LPCTSTR( str ),
  1656. str.GetLength(),
  1657. &rcCaption,
  1658. DT_SINGLELINE|DT_LEFT|DT_TOP
  1659. );
  1660. dc.SelectObject( pOldFont );
  1661. dc.SetTextColor( clrOld );
  1662. }
  1663. if( _sizeTextMain.cx > 0 && _sizeTextMain.cy > 0 )
  1664. {
  1665. UINT nDT = DT_CENTER|DT_VCENTER|DT_SINGLELINE;
  1666. if( ! str.IsEmpty() )
  1667. {
  1668. nDT = DT_LEFT|DT_TOP;
  1669. CRect rcPadding = ScreenTip_GetPaddingInnerText( false, true, _CCST, pHelperSrc, lParam );
  1670. rcText.DeflateRect( rcPadding.left, rcPadding.top, rcPadding.right, rcPadding.bottom );
  1671. }
  1672. COLORREF clrText = ScreenTip_GetTextColor( false, true, _CCST, pHelperSrc, lParam );
  1673. COLORREF clrOld = dc.SetTextColor( clrText );
  1674. CFont & _font = ScreenTip_GetFont( false, true, _CCST, pHelperSrc, lParam );
  1675. CFont * pOldFont = dc.SelectObject( &_font );
  1676. str = _CCST.TextMainGet();
  1677. ASSERT( str.GetLength() > 0 );
  1678. dc.DrawText(
  1679. LPCTSTR( str ),
  1680. str.GetLength(),
  1681. &rcText,
  1682. nDT
  1683. );
  1684. dc.SelectObject( pOldFont );
  1685. dc.SetTextColor( clrOld );
  1686. }
  1687. if( _sizeBmpMain.cx > 0 && _sizeBmpMain.cy > 0 )
  1688. {
  1689. CRect rcPadding = ScreenTip_GetPaddingInnerBmp( true, _CCST, pHelperSrc, lParam );
  1690. rcBmp.DeflateRect( rcPadding.left, rcPadding.top, rcPadding.right, rcPadding.bottom );
  1691. CSize _size = _CCST.BmpMainGet().GetSize();
  1692. rcBmp.right = rcBmp.left + _size.cx;
  1693. rcBmp.bottom = rcBmp.top + _size.cy;
  1694. _CCST.BmpMainGet().AlphaBlend( dc.m_hDC, rcBmp );
  1695. }
  1696. }
  1697. if( nSeparatorHeight != 0 )
  1698. {
  1699. CRect rcSeparator(
  1700. rcMainAll.left,
  1701. rcMainAll.top + _sizeMain.cy,
  1702. rcMainAll.right,
  1703. rcMainAll.top + _sizeMain.cy + nSeparatorHeight
  1704. );
  1705. rcSeparator.DeflateRect( 0, rcSeparator.Height() / 2 );
  1706. rcSeparator.bottom = rcSeparator.top + 2;
  1707. // COLORREF clrLT = GetColor( COLOR_3DDKSHADOW, pHelperSrc, lParam );
  1708. // COLORREF clrRB = GetColor( COLOR_3DHILIGHT, pHelperSrc, lParam );
  1709. dc.Draw3dRect(
  1710. &rcSeparator,
  1711. RGB(145,153,164), // clrLT,
  1712. RGB(224,224,224) // clrRB
  1713. );
  1714. }
  1715. if( _sizeSecondary.cx > 0 && _sizeSecondary.cy > 0 )
  1716. {
  1717. rcCaption = rcMainAll;
  1718. rcCaption.top += _sizeMain.cy + nSeparatorHeight;
  1719. rcBmp = rcCaption;
  1720. rcCaption.left += _sizeBmpSecondary.cx;
  1721. rcText = rcCaption;
  1722. rcCaption.bottom = rcText.top = rcCaption.top + _sizeCaptionSecondary.cy;
  1723. rcText.bottom = rcBmp.bottom = rcMainAll.bottom + _sizeSecondary.cy + nSeparatorHeight;
  1724. if( _sizeCaptionSecondary.cx > 0 && _sizeCaptionSecondary.cy > 0 )
  1725. {
  1726. CRect rcPadding = ScreenTip_GetPaddingInnerText( true, false, _CCST, pHelperSrc, lParam );
  1727. rcCaption.DeflateRect( rcPadding.left, rcPadding.top, rcPadding.right, rcPadding.bottom );
  1728. COLORREF clrText = ScreenTip_GetTextColor( true, false, _CCST, pHelperSrc, lParam );
  1729. COLORREF clrOld = dc.SetTextColor( clrText );
  1730. CFont & _font = ScreenTip_GetFont( true, false, _CCST, pHelperSrc, lParam );
  1731. CFont * pOldFont = dc.SelectObject( &_font );
  1732. str = _CCST.CaptionSecondaryGet();
  1733. ASSERT( str.GetLength() > 0 );
  1734. dc.DrawText(
  1735. LPCTSTR( str ),
  1736. str.GetLength(),
  1737. &rcCaption,
  1738. DT_SINGLELINE|DT_LEFT|DT_TOP
  1739. );
  1740. dc.SelectObject( pOldFont );
  1741. dc.SetTextColor( clrOld );
  1742. }
  1743. if( _sizeTextSecondary.cx > 0 && _sizeTextSecondary.cy > 0 )
  1744. {
  1745. CRect rcPadding = ScreenTip_GetPaddingInnerText( false, false, _CCST, pHelperSrc, lParam );
  1746. rcText.DeflateRect( rcPadding.left, rcPadding.top, rcPadding.right, rcPadding.bottom );
  1747. COLORREF clrText = ScreenTip_GetTextColor( false, false, _CCST, pHelperSrc, lParam );
  1748. COLORREF clrOld = dc.SetTextColor( clrText );
  1749. CFont & _font = ScreenTip_GetFont( false, false, _CCST, pHelperSrc, lParam );
  1750. CFont * pOldFont = dc.SelectObject( &_font );
  1751. str = _CCST.TextSecondaryGet();
  1752. ASSERT( str.GetLength() > 0 );
  1753. dc.DrawText(
  1754. LPCTSTR( str ),
  1755. str.GetLength(),
  1756. &rcText,
  1757. DT_LEFT|DT_TOP
  1758. );
  1759. dc.SelectObject( pOldFont );
  1760. dc.SetTextColor( clrOld );
  1761. }
  1762. if( _sizeBmpSecondary.cx > 0 && _sizeBmpSecondary.cy > 0 )
  1763. {
  1764. CRect rcPadding = ScreenTip_GetPaddingInnerBmp( false, _CCST, pHelperSrc, lParam );
  1765. rcBmp.DeflateRect( rcPadding.left, rcPadding.top, rcPadding.right, rcPadding.bottom );
  1766. CSize _size = _CCST.BmpSecondaryGet().GetSize();
  1767. rcBmp.right = rcBmp.left + _size.cx;
  1768. rcBmp.bottom = rcBmp.top + _size.cy;
  1769. _CCST.BmpSecondaryGet().AlphaBlend( dc.m_hDC, rcBmp );
  1770. }
  1771. }
  1772. dc.SetBkMode( nOldBkMode );
  1773. }
  1774. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  1775. #if (!defined __EXT_MFC_NO_PAGECONTAINER_CTRL)
  1776. void CExtPaintManager::PageContainer_EraseEntire(
  1777. CDC & dc,
  1778. CRect rcClient,
  1779. CExtPageContainerWnd * pWndPageContainer,
  1780. LPARAM lParam // = 0L
  1781. )
  1782. {
  1783. ASSERT_VALID( this );
  1784. ASSERT( dc.GetSafeHdc() != NULL );
  1785. ASSERT_VALID( pWndPageContainer );
  1786. if( ! dc.RectVisible( &rcClient ) )
  1787. return;
  1788. if( (! GetCb2DbTransparentMode( pWndPageContainer, lParam ) )
  1789. || (! PaintDockerBkgnd( true, dc, pWndPageContainer, lParam ) )
  1790. )
  1791. dc.FillSolidRect(
  1792. &rcClient,
  1793. GetColor( CExtPaintManager::CLR_3DFACE_OUT, pWndPageContainer, lParam )
  1794. );
  1795. }
  1796. void CExtPaintManager::PageContainer_EraseScrollPosArea(
  1797. CDC & dc,
  1798. CRect rcScrollPosArea,
  1799. LONG nScrollPos,
  1800. LONG nScrollSize,
  1801. CExtPageContainerWnd * pWndPageContainer,
  1802. LPARAM lParam // = 0L
  1803. )
  1804. {
  1805. ASSERT_VALID( this );
  1806. ASSERT( dc.GetSafeHdc() != NULL );
  1807. ASSERT_VALID( pWndPageContainer );
  1808. ASSERT( nScrollPos <= nScrollSize );
  1809. nScrollPos;
  1810. nScrollSize;
  1811. if( (rcScrollPosArea.right - rcScrollPosArea.left) <= 1
  1812. || (rcScrollPosArea.bottom - rcScrollPosArea.top) <= 1
  1813. )
  1814. return;
  1815. if( ! dc.RectVisible( &rcScrollPosArea ) )
  1816. return;
  1817. COLORREF clrLight = GetColor( COLOR_3DHIGHLIGHT, pWndPageContainer, lParam );
  1818. COLORREF clrShadow = GetColor( COLOR_3DDKSHADOW, pWndPageContainer, lParam );
  1819. COLORREF clrFace = GetColor( COLOR_3DSHADOW, pWndPageContainer, lParam );
  1820. dc.FillSolidRect(
  1821. &rcScrollPosArea,
  1822. clrFace
  1823. );
  1824. dc.Draw3dRect(
  1825. &rcScrollPosArea,
  1826. clrShadow,
  1827. clrLight
  1828. );
  1829. }
  1830. void CExtPaintManager::PageContainer_DrawScrollPosArea(
  1831. CDC & dc,
  1832. CRect rcScrollPosArea,
  1833. LONG nScrollPos,
  1834. LONG nScrollSize,
  1835. CExtPageContainerWnd * pWndPageContainer,
  1836. LPARAM lParam // = 0L
  1837. )
  1838. {
  1839. ASSERT_VALID( this );
  1840. ASSERT( dc.GetSafeHdc() != NULL );
  1841. ASSERT_VALID( pWndPageContainer );
  1842. ASSERT( nScrollPos <= nScrollSize );
  1843. if( (rcScrollPosArea.right - rcScrollPosArea.left) <= 1
  1844. || (rcScrollPosArea.bottom - rcScrollPosArea.top) <= 1
  1845. )
  1846. return;
  1847. if( ! dc.RectVisible( &rcScrollPosArea ) )
  1848. return;
  1849. CRect rcScrollBtn( rcScrollPosArea );
  1850. rcScrollBtn.DeflateRect( 1, 1 );
  1851. if( (rcScrollBtn.right - rcScrollBtn.left) <= 1
  1852. || (rcScrollBtn.bottom - rcScrollBtn.top) <= 1
  1853. )
  1854. return;
  1855. if( nScrollSize > 0 )
  1856. {
  1857. ASSERT( nScrollPos <= nScrollSize );
  1858. bool bHorzLayout = pWndPageContainer->IsHorizontalLayout();
  1859. LONG nScrollPecrent =
  1860. ::MulDiv(
  1861. nScrollPos,
  1862. 100,
  1863. nScrollSize
  1864. );
  1865. LONG nWindowMetric =
  1866. bHorzLayout
  1867. ? rcScrollPosArea.Width()
  1868. : rcScrollPosArea.Height()
  1869. ;
  1870. LONG nBtnMetric =
  1871. ::MulDiv(
  1872. nWindowMetric,
  1873. 100,
  1874. ( nScrollSize + nWindowMetric )
  1875. );
  1876. nBtnMetric =
  1877. ::MulDiv(
  1878. nBtnMetric,
  1879. nWindowMetric,
  1880. 100
  1881. );
  1882. if( nBtnMetric < 10L )
  1883. nBtnMetric = 10L;
  1884. LONG nBtnMetricMax =
  1885. bHorzLayout
  1886. ? rcScrollBtn.Width()
  1887. : rcScrollBtn.Height()
  1888. ;
  1889. LONG nBtnOffset = 0L;
  1890. if( nBtnMetric >= nBtnMetricMax
  1891. || nBtnMetric >= ( nWindowMetric - 2 )
  1892. )
  1893. nBtnMetric =
  1894. min(
  1895. nBtnMetricMax,
  1896. ( nWindowMetric - 2 )
  1897. );
  1898. else
  1899. {
  1900. nBtnOffset =
  1901. ::MulDiv(
  1902. nWindowMetric - nBtnMetric,
  1903. nScrollPecrent,
  1904. 100
  1905. );
  1906. } // else from if( nBtnMetric >= nBtnMetricMax )
  1907. if( bHorzLayout )
  1908. {
  1909. rcScrollBtn.left += nBtnOffset;
  1910. rcScrollBtn.right =
  1911. rcScrollBtn.left + nBtnMetric;
  1912. if( (rcScrollBtn.right+1) >= rcScrollPosArea.right )
  1913. rcScrollBtn.right =
  1914. rcScrollPosArea.right - 1;
  1915. } // if( bHorzLayout )
  1916. else
  1917. {
  1918. rcScrollBtn.top += nBtnOffset;
  1919. rcScrollBtn.bottom =
  1920. rcScrollBtn.top + nBtnMetric;
  1921. if( (rcScrollBtn.bottom+1) >= rcScrollPosArea.bottom )
  1922. rcScrollBtn.bottom =
  1923. rcScrollPosArea.bottom - 1;
  1924. } // else from if( bHorzLayout )
  1925. } // if( nScrollSize > 0 )
  1926. COLORREF clrLight = GetColor( COLOR_3DHIGHLIGHT, pWndPageContainer, lParam );
  1927. COLORREF clrShadow = GetColor( COLOR_3DDKSHADOW, pWndPageContainer, lParam );
  1928. COLORREF clrFace = GetColor( COLOR_3DFACE, pWndPageContainer, lParam );
  1929. dc.FillSolidRect(
  1930. &rcScrollBtn,
  1931. clrFace
  1932. );
  1933. dc.Draw3dRect(
  1934. &rcScrollBtn,
  1935. clrLight,
  1936. clrShadow
  1937. );
  1938. }
  1939. void CExtPaintManager::PageContainer_EraseItem(
  1940. CDC & dc,
  1941. LPVOID pPageInfo, // CExtPageContainerWnd::PAGE_ITEM_INFO
  1942. CRect rcPage,
  1943. CRect rcCaption,
  1944. CRect rcWnd,
  1945. CExtPageContainerWnd * pWndPageContainer,
  1946. LPARAM lParam // = 0L
  1947. )
  1948. {
  1949. ASSERT_VALID( this );
  1950. ASSERT( dc.GetSafeHdc() != NULL );
  1951. ASSERT( pPageInfo != NULL );
  1952. ASSERT( ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->IsVisible() );
  1953. ASSERT_VALID( pWndPageContainer );
  1954. rcCaption;
  1955. rcWnd;
  1956. if( rcPage.left >= rcPage.right
  1957. || rcPage.top >= rcPage.bottom
  1958. )
  1959. return;
  1960. if( ! dc.RectVisible( &rcPage ) )
  1961. return;
  1962. DWORD dwPageContainerStyle = pWndPageContainer->GetPageContainerStyle();
  1963. if( (dwPageContainerStyle & __EPCWS_PAGE_BORDERS) == 0 )
  1964. return;
  1965. bool bPageIsExpanded = ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->IsExpanded();
  1966. if( ! bPageIsExpanded )
  1967. return;
  1968. ASSERT(
  1969. rcPage.left <= rcWnd.left
  1970. && rcPage.top <= rcWnd.top
  1971. && rcPage.right >= rcWnd.right
  1972. && rcPage.bottom >= rcWnd.bottom
  1973. );
  1974. CRect rcMiddle(
  1975. (rcPage.left + rcWnd.left) / 2,
  1976. (rcPage.top + rcWnd.top) / 2,
  1977. (rcPage.right + rcWnd.right) / 2,
  1978. (rcPage.bottom + rcWnd.bottom) / 2
  1979.    );
  1980. if( m_bPageContainerUseGroupBoxStyle )
  1981. {
  1982. PaintGroupBoxFrame(
  1983. dc,
  1984. rcMiddle,
  1985. COLORREF(-1L),
  1986. pWndPageContainer,
  1987. lParam
  1988. );
  1989. } // if( m_bPageContainerUseGroupBoxStyle )
  1990. else
  1991. {
  1992. if( rcMiddle.left < rcMiddle.right
  1993. && rcMiddle.top < rcMiddle.bottom
  1994. )
  1995. {
  1996. if( ( dwPageContainerStyle & __EPCWS_CAPTION_FLAT ) != 0
  1997. && (! ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->IsCaptionHover() )
  1998. && (! ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->IsCaptionPressed() )
  1999. )
  2000. {
  2001. HWND hWndPage = ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->GetSafePageHwnd();
  2002. ASSERT( hWndPage != NULL );
  2003. ASSERT( ::IsWindow( hWndPage ) );
  2004. bool bEnabled = ( ::IsWindowEnabled( hWndPage ) ) ? true : false;
  2005. COLORREF clrFrame =
  2006. GetColor(
  2007. bEnabled
  2008. ? COLOR_3DDKSHADOW
  2009. : COLOR_3DSHADOW
  2010. ,
  2011. pWndPageContainer,
  2012. lParam
  2013. );
  2014. dc.Draw3dRect( &rcMiddle, clrFrame, clrFrame );
  2015. }
  2016. else
  2017. {
  2018. COLORREF clrLight = GetColor( COLOR_3DHIGHLIGHT, pWndPageContainer, lParam );
  2019. COLORREF clrShadow = GetColor( COLOR_3DSHADOW, pWndPageContainer, lParam );
  2020. dc.Draw3dRect( &rcMiddle, clrShadow, clrLight );
  2021. rcMiddle.DeflateRect( 1, 1 );
  2022. dc.Draw3dRect( &rcMiddle, clrLight, clrShadow );
  2023. }
  2024. }
  2025. } // else from if( m_bPageContainerUseGroupBoxStyle )
  2026. }
  2027. void CExtPaintManager::PageContainer_DrawItem(
  2028. CDC & dc,
  2029. LPVOID pPageInfo, // CExtPageContainerWnd::PAGE_ITEM_INFO
  2030. CRect rcPage,
  2031. CRect rcCaption,
  2032. CRect rcWnd,
  2033. CExtPageContainerWnd * pWndPageContainer,
  2034. LPARAM lParam // = 0L
  2035. )
  2036. {
  2037. ASSERT_VALID( this );
  2038. ASSERT( dc.GetSafeHdc() != NULL );
  2039. ASSERT( pPageInfo != NULL );
  2040. ASSERT_VALID( pWndPageContainer );
  2041. dc;
  2042. pPageInfo; // CExtPageContainerWnd::PAGE_ITEM_INFO
  2043. rcPage;
  2044. rcCaption;
  2045. rcWnd;
  2046. pWndPageContainer;
  2047. lParam;
  2048. }
  2049. void CExtPaintManager::PageContainer_EraseCaption(
  2050. CDC & dc,
  2051. LPVOID pPageInfo, // CExtPageContainerWnd::PAGE_ITEM_INFO
  2052. CRect rcCaption,
  2053. CExtPageContainerWnd * pWndPageContainer,
  2054. LPARAM lParam // = 0L
  2055. )
  2056. {
  2057. ASSERT_VALID( this );
  2058. ASSERT( dc.GetSafeHdc() != NULL );
  2059. ASSERT( pPageInfo != NULL );
  2060. ASSERT_VALID( pWndPageContainer );
  2061. ASSERT( pPageInfo != NULL );
  2062. ASSERT( ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->IsVisible() );
  2063. pPageInfo;
  2064. if( (rcCaption.right - rcCaption.left) <= 4 
  2065. || (rcCaption.bottom - rcCaption.top) <= 4 
  2066. )
  2067. return;
  2068. if( ! dc.RectVisible( &rcCaption ) )
  2069. return;
  2070. if( m_bPageContainerUseButtonStyle )
  2071. {
  2072. HWND hWndPage = ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->GetSafePageHwnd();
  2073. ASSERT( hWndPage != NULL );
  2074. ASSERT( ::IsWindow( hWndPage ) );
  2075. bool bEnabled = ( ::IsWindowEnabled( hWndPage ) ) ? true : false;
  2076. DWORD dwPageContainerStyle = pWndPageContainer->GetPageContainerStyle();
  2077. PAINTPUSHBUTTONDATA _ppbd(
  2078. pWndPageContainer,
  2079. true, // bHorz
  2080. rcCaption,
  2081. NULL, // sText
  2082. NULL, // hIcon
  2083. ( dwPageContainerStyle & __EPCWS_CAPTION_FLAT ) ? true : false, //bool bFlat
  2084. ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->IsCaptionHover(),
  2085. ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->IsCaptionPressed(),
  2086. false, // bIndeterminate
  2087. bEnabled,
  2088. true, // bDrawBorder
  2089. false, // bDrawFocusRect
  2090. false,
  2091. __ALIGN_HORIZ_CENTER,
  2092. NULL,
  2093. false,
  2094. 0,
  2095. false
  2096. );
  2097. CExtMemoryDC dcX( &dc, &rcCaption );
  2098. PaintPushButton( dcX, _ppbd );
  2099. } // if( m_bPageContainerUseButtonStyle )
  2100. else
  2101. {
  2102. COLORREF clrFace = GetColor( CExtPaintManager::CLR_3DFACE_OUT, pWndPageContainer, lParam );
  2103. dc.FillSolidRect( &rcCaption, clrFace );
  2104. } // else from if( m_bPageContainerUseButtonStyle )
  2105. }
  2106. void CExtPaintManager::PageContainer_DrawCaption(
  2107. CDC & dc,
  2108. LPVOID pPageInfo, // CExtPageContainerWnd::PAGE_ITEM_INFO
  2109. CRect rcCaption,
  2110. CExtPageContainerWnd * pWndPageContainer,
  2111. LPARAM lParam // = 0L
  2112. )
  2113. {
  2114. ASSERT_VALID( this );
  2115. ASSERT( dc.GetSafeHdc() != NULL );
  2116. ASSERT( pPageInfo != NULL );
  2117. ASSERT_VALID( pWndPageContainer );
  2118. ASSERT( pPageInfo != NULL );
  2119. ASSERT( ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->IsVisible() );
  2120. if( (rcCaption.right - rcCaption.left) <= 4 
  2121. || (rcCaption.bottom - rcCaption.top) <= 4 
  2122. )
  2123. return;
  2124. if( ! dc.RectVisible( &rcCaption ) )
  2125. return;
  2126. CRgn rgnCaption;
  2127. if( rgnCaption.CreateRectRgnIndirect( &rcCaption ) )
  2128. {
  2129. ASSERT( rgnCaption.GetSafeHandle() != NULL );
  2130. dc.SelectClipRgn( &rgnCaption );
  2131. }
  2132. HWND hWndPage = ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->GetSafePageHwnd();
  2133. ASSERT( hWndPage != NULL );
  2134. ASSERT( ::IsWindow( hWndPage ) );
  2135. bool bEnabled = ( ::IsWindowEnabled( hWndPage ) ) ? true : false;
  2136. COLORREF clrLight = GetColor( COLOR_3DHIGHLIGHT, pWndPageContainer, lParam );
  2137. COLORREF clrFace = GetColor( CExtPaintManager::CLR_3DFACE_OUT, pWndPageContainer, lParam );
  2138. COLORREF clrShadow = GetColor( COLOR_3DSHADOW, pWndPageContainer, lParam );
  2139. COLORREF clrDkShadow = GetColor( COLOR_3DDKSHADOW, pWndPageContainer, lParam );
  2140. CRect rcCaptBorder( rcCaption );
  2141. bool bHorzLayout = pWndPageContainer->IsHorizontalLayout();
  2142. if( bHorzLayout )
  2143. {
  2144. rcCaption.DeflateRect(
  2145. __EXT_PAGECONTAINERWND_CAPT_HBORDER_DX,
  2146. __EXT_PAGECONTAINERWND_CAPT_HBORDER_DY
  2147. );
  2148. rcCaption.bottom -= __EXT_PAGECONTAINERWND_CAPT_BEFORE_DY;
  2149. rcCaption.top += __EXT_PAGECONTAINERWND_CAPT_AFTER_DY;
  2150. } // if( bHorzLayout )
  2151. else
  2152. {
  2153. rcCaption.DeflateRect(
  2154. __EXT_PAGECONTAINERWND_CAPT_VBORDER_DX,
  2155. __EXT_PAGECONTAINERWND_CAPT_VBORDER_DY
  2156. );
  2157. rcCaption.left += __EXT_PAGECONTAINERWND_CAPT_BEFORE_DX;
  2158. rcCaption.right -= __EXT_PAGECONTAINERWND_CAPT_AFTER_DX;
  2159. } // else from if( bHorzLayout )
  2160. DWORD dwPageContainerStyle = pWndPageContainer->GetPageContainerStyle();
  2161. if( ( dwPageContainerStyle & __EPCWS_CAPTION_EXPBTN ) != 0 )
  2162. {
  2163. CExtPaintManager::glyph_t & _glyph =
  2164. pWndPageContainer->OnPageContainerQueryItemGlyph(
  2165. ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo),
  2166. ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->IsExpanded()
  2167. );
  2168. CSize sizeGlyph = _glyph.Size();
  2169. if( sizeGlyph.cx > 0 && sizeGlyph.cy > 0 )
  2170. {
  2171. CRect rcGlyph( rcCaption );
  2172. if( bHorzLayout )
  2173. {
  2174. rcGlyph.left += (rcCaption.Width() - sizeGlyph.cx)/2;
  2175. rcGlyph.top = rcGlyph.bottom - sizeGlyph.cy;
  2176. rcGlyph.right = rcGlyph.left + sizeGlyph.cx;
  2177. rcCaption.bottom = rcGlyph.top - __EXT_PAGECONTAINERWND_CAPT_ICON2TEXT_DY;
  2178. } // if( bHorzLayout )
  2179. else
  2180. {
  2181. rcGlyph.right = rcGlyph.left + sizeGlyph.cx;
  2182. rcGlyph.top += (rcCaption.Height() - sizeGlyph.cy)/2;
  2183. rcGlyph.bottom = rcGlyph.top + sizeGlyph.cy;
  2184. rcCaption.left = rcGlyph.right + __EXT_PAGECONTAINERWND_CAPT_ICON2TEXT_DX;
  2185. } // else from if( bHorzLayout )
  2186. COLORREF ColorValues[] =
  2187. {
  2188. RGB(0,0,0),
  2189. GetColor( bEnabled ? COLOR_BTNTEXT : CLR_TEXT_DISABLED, pWndPageContainer, lParam )
  2190. };
  2191. PaintGlyphCentered( dc, rcGlyph, _glyph, ColorValues );
  2192. } // if( sizeGlyph.cx > 0 && sizeGlyph.cy > 0 )
  2193. // if( bHorzLayout )
  2194. // {
  2195. // if( sizeGlyph.cy > 0 )
  2196. // rcCaption.top +=
  2197. // sizeGlyph.cy
  2198. // + __EXT_PAGECONTAINERWND_CAPT_AFTER_GLYPH_DY
  2199. // ;
  2200. // } // if( bHorzLayout )
  2201. // else
  2202. // {
  2203. // if( sizeGlyph.cx > 0 )
  2204. // rcCaption.left +=
  2205. // sizeGlyph.cx
  2206. // + __EXT_PAGECONTAINERWND_CAPT_AFTER_GLYPH_DX
  2207. // ;
  2208. // } // else from if( bHorzLayout )
  2209. } // if( ( dwPageContainerStyle & __EPCWS_CAPTION_EXPBTN ) != 0 )
  2210. CExtCmdIcon & _icon = ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->IconGet();
  2211. CSize sizeIcon = _icon.GetSize();
  2212. if( sizeIcon.cx > 0 && sizeIcon.cy > 0 )
  2213. {
  2214. CRect rcIcon( rcCaption );
  2215. if( bHorzLayout )
  2216. {
  2217. rcIcon.left += (rcCaption.Width() - sizeIcon.cx)/2;
  2218. rcIcon.top = rcIcon.bottom - sizeIcon.cy;
  2219. rcIcon.right = rcIcon.left + sizeIcon.cx;
  2220. rcCaption.bottom = rcIcon.top - __EXT_PAGECONTAINERWND_CAPT_ICON2TEXT_DY;
  2221. } // if( bHorzLayout )
  2222. else
  2223. {
  2224. rcIcon.right = rcIcon.left + sizeIcon.cx;
  2225. rcIcon.top += (rcCaption.Height() - sizeIcon.cy)/2;
  2226. rcIcon.bottom = rcIcon.top + sizeIcon.cy;
  2227. rcCaption.left = rcIcon.right + __EXT_PAGECONTAINERWND_CAPT_ICON2TEXT_DX;
  2228. } // else from if( bHorzLayout )
  2229. if( rcIcon.right > rcIcon.left
  2230. && rcIcon.bottom > rcIcon.top
  2231. )
  2232. {
  2233. // ICON 2.53
  2234. //  dc.DrawState(
  2235. //  rcIcon.TopLeft(),
  2236. //  rcIcon.Size(), 
  2237. //  hItemIcon, 
  2238. //  bEnabled ? DSS_NORMAL : DSS_DISABLED, 
  2239. //  (CBrush*)NULL
  2240. //  );
  2241. _icon.Paint(
  2242. this,
  2243. dc.GetSafeHdc(),
  2244. rcIcon,
  2245. bEnabled
  2246. ? CExtCmdIcon::__PAINT_NORMAL
  2247. : CExtCmdIcon::__PAINT_DISABLED
  2248. );
  2249. }
  2250. } // if( sizeIcon.cx > 0 && sizeIcon.cy > 0 )
  2251. bool bCenteredText =
  2252. (dwPageContainerStyle & __EPCWS_CAPTION_CENTER_TEXT)
  2253. ? true :  false;
  2254. __EXT_MFC_SAFE_LPCTSTR sItemText = ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->TextGet();
  2255. LONG nItemTextLen = 0;
  2256. if( sItemText != NULL
  2257. && ( nItemTextLen = LONG(_tcslen(sItemText)) ) > 0
  2258. && rcCaption.right > rcCaption.left
  2259. && rcCaption.bottom > rcCaption.top
  2260. )
  2261. { // if can draw text
  2262. CFont * pItemFont = ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->GetCaptionFont( bHorzLayout );
  2263. ASSERT( pItemFont != NULL );
  2264. ASSERT( pItemFont->GetSafeHandle() != NULL );
  2265. CFont * pOldFont = dc.SelectObject( pItemFont );
  2266. COLORREF clrTextOld =
  2267. dc.SetTextColor(
  2268. GetColor(
  2269. bEnabled ? COLOR_BTNTEXT : ( m_bPageContainerNoEmbossDisabledText ? CLR_TEXT_DISABLED : COLOR_3DHILIGHT ),
  2270. pWndPageContainer,
  2271. lParam
  2272. )
  2273. );
  2274. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  2275. if( bHorzLayout )
  2276. {
  2277. rcCaption.InflateRect( 3, 0 );
  2278. rcCaption.OffsetRect( -2, 0 );
  2279. CSize sizeTextMeasured = ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->GetLastMeasuredTextSize();
  2280. if( bCenteredText )
  2281. {
  2282. UINT nOldTA = dc.SetTextAlign( TA_CENTER | TA_BASELINE );
  2283. rcCaption.OffsetRect(
  2284. ( (dwPageContainerStyle & __EPCWS_CAPTION_INV_VFONT) == 0 )
  2285. ?   sizeTextMeasured.cy/2
  2286. : - sizeTextMeasured.cy/2
  2287. ,
  2288. 0
  2289. );
  2290. CPoint ptCenter = rcCaption.CenterPoint();
  2291. dc.ExtTextOut(
  2292. ptCenter.x,
  2293. ptCenter.y,
  2294. ETO_CLIPPED,
  2295. &rcCaption,
  2296. sItemText,
  2297. nItemTextLen,
  2298. NULL
  2299. );
  2300. if( ( ! bEnabled ) && ( ! m_bPageContainerNoEmbossDisabledText ) )
  2301. {
  2302. dc.SetTextColor( GetColor( CLR_TEXT_DISABLED, pWndPageContainer, lParam ) );
  2303. ptCenter.x--;
  2304. ptCenter.y--;
  2305. rcCaption.OffsetRect( -1, -1 );
  2306. dc.ExtTextOut(
  2307. ptCenter.x,
  2308. ptCenter.y,
  2309. ETO_CLIPPED,
  2310. &rcCaption,
  2311. sItemText,
  2312. nItemTextLen,
  2313. NULL
  2314. );
  2315. } // if( ( ! bEnabled ) && ( ! m_bPageContainerNoEmbossDisabledText ) )
  2316. dc.SetTextAlign( nOldTA );
  2317. } // if( bCenteredText )
  2318. else
  2319. {
  2320. UINT nOldTA = dc.SetTextAlign( TA_TOP | TA_BASELINE );
  2321. rcCaption.OffsetRect(
  2322. ( (dwPageContainerStyle & __EPCWS_CAPTION_INV_VFONT) == 0 )
  2323. ?   sizeTextMeasured.cy/2
  2324. : - sizeTextMeasured.cy/2
  2325. ,
  2326. 0
  2327. );
  2328. CPoint ptCenter = rcCaption.CenterPoint();
  2329. if( (dwPageContainerStyle & __EPCWS_CAPTION_INV_VFONT) == 0 )
  2330. ptCenter.y =
  2331. rcCaption.bottom - 4
  2332. - (rcCaption.Height() - sizeTextMeasured.cx)
  2333. ;
  2334. else
  2335. ptCenter.y =
  2336. rcCaption.top + 4
  2337. ;
  2338. dc.ExtTextOut(
  2339. ptCenter.x,
  2340. ptCenter.y,
  2341. ETO_CLIPPED,
  2342. &rcCaption,
  2343. sItemText,
  2344. nItemTextLen,
  2345. NULL
  2346. );
  2347. if( ( ! bEnabled ) && ( ! m_bPageContainerNoEmbossDisabledText ) )
  2348. {
  2349. dc.SetTextColor( GetColor( CLR_TEXT_DISABLED, pWndPageContainer, lParam ) );
  2350. ptCenter.x--;
  2351. ptCenter.y--;
  2352. rcCaption.OffsetRect( -1, -1 );
  2353. dc.ExtTextOut(
  2354. ptCenter.x,
  2355. ptCenter.y,
  2356. ETO_CLIPPED,
  2357. &rcCaption,
  2358. sItemText,
  2359. nItemTextLen,
  2360. NULL
  2361. );
  2362. } // if( ( ! bEnabled ) && ( ! m_bPageContainerNoEmbossDisabledText ) )
  2363. dc.SetTextAlign( nOldTA );
  2364. } // else from if( bCenteredText )
  2365. } // if( bHorzLayout )
  2366. else
  2367. {
  2368. UINT nFormat = DT_SINGLELINE|DT_END_ELLIPSIS;
  2369. if( bCenteredText )
  2370. nFormat |= DT_CENTER|DT_VCENTER;
  2371. else
  2372. nFormat |= DT_VCENTER|DT_LEFT;
  2373. dc.DrawText( sItemText, nItemTextLen, &rcCaption, nFormat );
  2374. if( ( ! bEnabled ) && ( ! m_bPageContainerNoEmbossDisabledText ) )
  2375. {
  2376. dc.SetTextColor( GetColor( CLR_TEXT_DISABLED, pWndPageContainer, lParam ) );
  2377. rcCaption.OffsetRect( -1, -1 );
  2378. dc.DrawText( sItemText, nItemTextLen, &rcCaption, nFormat );
  2379. } // if( ( ! bEnabled ) && ( ! m_bPageContainerNoEmbossDisabledText ) )
  2380. } // else from if( bHorzLayout )
  2381. dc.SetBkMode( nOldBkMode );
  2382. dc.SetTextColor( clrTextOld );
  2383. dc.SelectObject( pOldFont );
  2384. } // if can draw text
  2385. if( ! m_bPageContainerUseButtonStyle )
  2386. {
  2387. if( ( dwPageContainerStyle & __EPCWS_CAPTION_FLAT ) != 0 )
  2388. { // if flat captions
  2389. if( ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->IsCaptionPressed() )
  2390. { // if caption is pressed
  2391. dc.Draw3dRect(
  2392. &rcCaptBorder,
  2393. clrShadow,
  2394. clrLight
  2395. );
  2396. } // if caption is pressed
  2397. else if( ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->IsCaptionHover() )
  2398. { // if caption is under mouse pointer
  2399. dc.Draw3dRect(
  2400. &rcCaptBorder,
  2401. clrLight,
  2402. clrShadow
  2403. );
  2404. } // if caption is under mouse pointer
  2405. else
  2406. { // if caption is neither pressed nor under mouse pointer
  2407. dc.Draw3dRect(
  2408. &rcCaptBorder,
  2409. bEnabled ? clrDkShadow : clrShadow,
  2410. bEnabled ? clrDkShadow : clrShadow
  2411. );
  2412. } // if caption is neither pressed nor under mouse pointer
  2413. } // if flat captions
  2414. else
  2415. { // if semi-flat captions
  2416. if( ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->IsCaptionPressed() )
  2417. { // if caption is pressed
  2418. dc.Draw3dRect(
  2419. &rcCaptBorder,
  2420. clrDkShadow,
  2421. clrLight
  2422. );
  2423. rcCaptBorder.DeflateRect( 1, 1 );
  2424. dc.Draw3dRect(
  2425. &rcCaptBorder,
  2426. clrShadow,
  2427. clrFace
  2428. );
  2429. } // if caption is pressed
  2430. else if( ((CExtPageContainerWnd::PAGE_ITEM_INFO*)pPageInfo)->IsCaptionHover() )
  2431. { // if caption is under mouse pointer
  2432. dc.Draw3dRect(
  2433. &rcCaptBorder,
  2434. clrLight,
  2435. clrDkShadow
  2436. );
  2437. rcCaptBorder.DeflateRect( 1, 1 );
  2438. dc.Draw3dRect(
  2439. &rcCaptBorder,
  2440. clrFace,
  2441. clrShadow
  2442. );
  2443. } // if caption is under mouse pointer
  2444. else
  2445. { // if caption is neither pressed nor under mouse pointer
  2446. dc.Draw3dRect(
  2447. &rcCaptBorder,
  2448. clrLight,
  2449. clrShadow
  2450. );
  2451. } // if caption is neither pressed nor under mouse pointer
  2452. } // if semi-flat captions
  2453. } // if( ! m_bPageContainerUseButtonStyle )
  2454. dc.SelectClipRgn( NULL );
  2455. }
  2456. #endif // (!defined __EXT_MFC_NO_PAGECONTAINER_CTRL)
  2457. //////////////////////////////////////////////////////////////////////////
  2458. // CExtPaintManagerStudio2008
  2459. //////////////////////////////////////////////////////////////////////////
  2460. CExtPaintManagerStudio2008::CExtPaintManagerStudio2008()
  2461. {
  2462. VERIFY(
  2463. m_bmpMenuItemLunaBlue.LoadBMP_Resource(
  2464. MAKEINTRESOURCE( IDB_EXT_VS2008_MENU_ITEM_LUNA_BLUE )
  2465. )
  2466. );
  2467. m_bmpMenuItemLunaBlue.Make32();
  2468. m_bmpMenuItemLunaBlue.AlphaColor( RGB(255,0,255), RGB(0,0,0), BYTE(0) );
  2469. VERIFY(
  2470. m_bmpMenuItemLunaOliveGreen.LoadBMP_Resource(
  2471. MAKEINTRESOURCE( IDB_EXT_VS2008_MENU_ITEM_LUNA_OLIVE_GREEN )
  2472. )
  2473. );
  2474. m_bmpMenuItemLunaOliveGreen.Make32();
  2475. m_bmpMenuItemLunaOliveGreen.AlphaColor( RGB(255,0,255), RGB(0,0,0), BYTE(0) );
  2476. VERIFY(
  2477. m_bmpMenuItemLunaSilver.LoadBMP_Resource(
  2478. MAKEINTRESOURCE( IDB_EXT_VS2008_MENU_ITEM_LUNA_SILVER )
  2479. )
  2480. );
  2481. m_bmpMenuItemLunaSilver.Make32();
  2482. m_bmpMenuItemLunaSilver.AlphaColor( RGB(255,0,255), RGB(0,0,0), BYTE(0) );
  2483. VERIFY(
  2484. m_bmpMenuItemLunaRoyale.LoadBMP_Resource(
  2485. MAKEINTRESOURCE( IDB_EXT_VS2008_MENU_ITEM_LUNA_ROYALE )
  2486. )
  2487. );
  2488. m_bmpMenuItemLunaRoyale.Make32();
  2489. m_bmpMenuItemLunaRoyale.AlphaColor( RGB(255,0,255), RGB(0,0,0), BYTE(0) );
  2490. VERIFY(
  2491. m_bmpMenuItemVista.LoadBMP_Resource(
  2492. MAKEINTRESOURCE( IDB_EXT_VS2008_MENU_ITEM_VISTA )
  2493. )
  2494. );
  2495. m_bmpMenuItemVista.Make32();
  2496. m_bmpMenuItemVista.AlphaColor( RGB(255,0,255), RGB(0,0,0), BYTE(0) );
  2497. }
  2498. CExtPaintManagerStudio2008::~CExtPaintManagerStudio2008()
  2499. {
  2500. }
  2501. int CExtPaintManagerStudio2008::GetMenuIconAreaWidth() const
  2502. {
  2503. ASSERT_VALID( this );
  2504. return 28;
  2505. }
  2506. bool CExtPaintManagerStudio2008::OnQueryUseThemeColors() const
  2507. {
  2508. ASSERT_VALID( this );
  2509. if( IsHighContrast() )
  2510. return CExtPaintManagerXP::OnQueryUseThemeColors();
  2511. e_system_theme_t eCurrentTheme = OnQuerySystemTheme();
  2512. bool bUseThemedColors = (
  2513. g_PaintManager.m_UxTheme.IsAppThemed()
  2514. && g_PaintManager.m_bUxValidColorsExtracted
  2515. && ( eCurrentTheme == ThemeLunaRoyale       // +2.87
  2516. || eCurrentTheme == ThemeVistaOrLaterUX   // +2.87
  2517. || eCurrentTheme == ThemeVistaOrLaterDWM  // +2.87
  2518. || eCurrentTheme == ThemeLunaBlue
  2519. || eCurrentTheme == ThemeLunaOlive
  2520. || eCurrentTheme == ThemeLunaSilver
  2521. )
  2522. //&& eCurrentTheme != ThemeLunaRoyale // -2.87
  2523. );
  2524. return bUseThemedColors;
  2525. }
  2526. void CExtPaintManagerStudio2008::InitTranslatedColors()
  2527. {
  2528. ASSERT_VALID( this );
  2529. CExtPaintManagerStudio2005::InitTranslatedColors();
  2530. VERIFY( m_bmpMenuItemOther.LoadBMP_Resource( MAKEINTRESOURCE( IDB_EXT_VS2008_MENU_ITEM_OTHER ) ) );
  2531. if( stat_GetBPP() > 8 )
  2532. {
  2533. COLORREF clrMlaNormLeft    = COLORREF(-1L);
  2534. COLORREF clrMlaNormMiddle  = COLORREF(-1L);
  2535. COLORREF clrMlaNormRight   = COLORREF(-1L);
  2536. COLORREF clrMlaMarginLeft  = COLORREF(-1L);
  2537. COLORREF clrMlaMarginRight = COLORREF(-1L);
  2538. COLORREF clrMlaRarelyLeft    = COLORREF(-1L);
  2539. COLORREF clrMlaRarelyRight   = COLORREF(-1L);
  2540. COLORREF clrMlaRarelyMiddle  = COLORREF(-1L);
  2541. e_system_theme_t eCurrentTheme = OnQuerySystemTheme();
  2542. switch( eCurrentTheme ) 
  2543. {
  2544. // case ThemeVistaOrLaterUX:   // +2.87 -2.88
  2545. // case ThemeVistaOrLaterDWM:  // +2.87 -2.88
  2546. case ThemeLunaBlue:
  2547. clrMlaNormLeft     = RGB( 241, 241, 241 );
  2548. clrMlaNormMiddle   = RGB( 241, 241, 241 );
  2549. clrMlaNormRight    = RGB( 241, 241, 241 );
  2550. clrMlaMarginLeft   = RGB( 197, 194, 184 );
  2551. clrMlaMarginRight  = RGB( 255, 255, 255 );
  2552. break;
  2553. case ThemeLunaOlive:
  2554. clrMlaNormLeft     = RGB( 247, 246, 239 );
  2555. clrMlaNormMiddle   = RGB( 242, 240, 229 );
  2556. clrMlaNormRight    = RGB( 233, 230, 214 );
  2557. clrMlaMarginLeft   = RGB( 197, 194, 184 );
  2558. clrMlaMarginRight  = RGB( 255, 255, 255 );
  2559. break;
  2560. case ThemeVistaOrLaterUX:   // +2.88
  2561. case ThemeVistaOrLaterDWM:  // +2.88
  2562. m_mapColorTranslate[_2003CLR_EXPBTN_LIGHT]   = InstallColor( RGB(195, 202, 218) );
  2563. m_mapColorTranslate[_2003CLR_EXPBTN_DARK]    = InstallColor( RGB(233, 236, 250) );
  2564. m_mapColorTranslate[_2003CLR_GRADIENT_LIGHT] = InstallColor( RGB(244, 247, 252) );
  2565. m_mapColorTranslate[_2003CLR_GRADIENT_DARK]  = InstallColor( RGB(233, 236, 250) );
  2566. clrMlaNormLeft      = RGB(243, 245, 248);
  2567. clrMlaNormRight     = RGB(213, 217, 231);
  2568. clrMlaNormMiddle    = RGB(233, 236, 250);
  2569. clrMlaRarelyLeft    = CExtBitmap::stat_HLS_Adjust( clrMlaNormLeft,   0.00, -0.10, 0.00 );
  2570. clrMlaRarelyRight   = CExtBitmap::stat_HLS_Adjust( clrMlaNormRight,  0.00, -0.10, 0.00 );
  2571. clrMlaRarelyMiddle  = CExtBitmap::stat_HLS_Adjust( clrMlaNormMiddle, 0.00, -0.10, 0.00 );
  2572. clrMlaMarginLeft   = RGB( 170, 171, 190 );
  2573. clrMlaMarginRight  = RGB( 252, 252, 252 );
  2574. m_mapColorTranslate[_2003CLR_TOOLBAR_GRADIENT_LIGHT]   = InstallColor( RGB(250, 250, 253) );
  2575. m_mapColorTranslate[_2003CLR_TOOLBAR_GRADIENT_MIDDLE]  = InstallColor( RGB(223, 227, 241) );
  2576. m_mapColorTranslate[_2003CLR_TOOLBAR_GRADIENT_DARK]    = InstallColor( RGB(196, 203, 219) );
  2577. m_mapColorTranslate[_2003CLR_TOOLBAR_BOTTOM_LINE]      = InstallColor( RGB(181, 190, 206) );
  2578. break;
  2579. case ThemeLunaSilver:
  2580. clrMlaNormLeft     = RGB( 232, 233, 242 );
  2581. clrMlaNormMiddle   = RGB( 216, 216, 227 );
  2582. clrMlaNormRight    = RGB( 193, 193, 211 );
  2583. clrMlaMarginLeft   = RGB( 110, 109, 143 );
  2584. clrMlaMarginRight  = RGB( 255, 255, 255 );
  2585. break;
  2586. case ThemeLunaRoyale:
  2587. clrMlaNormLeft     = RGB( 247, 246, 248 );
  2588. clrMlaNormMiddle   = RGB( 241, 240, 242 );
  2589. clrMlaNormRight    = RGB( 241, 240, 242 );
  2590. clrMlaMarginLeft   = RGB( 193, 193, 196 );
  2591. clrMlaMarginRight  = RGB( 255, 255, 255 );
  2592. break;
  2593. default:
  2594. clrMlaMarginLeft   = GetColor( COLOR_3DSHADOW, this );
  2595. clrMlaMarginRight  = GetColor( COLOR_WINDOW, this );
  2596. break;
  2597. } // switch( eCurrentTheme ) 
  2598. if( clrMlaNormLeft != COLORREF(-1L) )
  2599. {
  2600. m_mapColorTranslate[_2003CLR_MLA_NORM_LEFT]   = InstallColor( clrMlaNormLeft );
  2601. m_mapColorTranslate[_2003CLR_MLA_RARELY_LEFT] = InstallColor( CExtBitmap::stat_HLS_Adjust( clrMlaNormLeft, 0.00, -0.10, 0.0 ) );
  2602. }
  2603. if( clrMlaNormMiddle != COLORREF(-1L) )
  2604. {
  2605. m_mapColorTranslate[_2003CLR_MLA_NORM_MIDDLE]   = InstallColor( clrMlaNormMiddle );
  2606. m_mapColorTranslate[_2003CLR_MLA_RARELY_MIDDLE] = InstallColor( CExtBitmap::stat_HLS_Adjust( clrMlaNormMiddle, 0.00, -0.10, 0.0 ) );
  2607. }
  2608. if( clrMlaNormRight != COLORREF(-1L) )
  2609. {
  2610. m_mapColorTranslate[_2003CLR_MLA_NORM_RIGHT]    = InstallColor( clrMlaNormRight );
  2611. m_mapColorTranslate[_2003CLR_MLA_RARELY_RIGHT]  = InstallColor( CExtBitmap::stat_HLS_Adjust( clrMlaNormRight, 0.00, -0.10, 0.0 ) );
  2612. }
  2613. m_mapColorTranslate[_STUDIO_2008CLR_MENU_ITEM_LEFT_AREA_MARGIN_LEFT]  = InstallColor( clrMlaMarginLeft );
  2614. m_mapColorTranslate[_STUDIO_2008CLR_MENU_ITEM_LEFT_AREA_MARGIN_RIGHT] = InstallColor( clrMlaMarginRight );
  2615. if( clrMlaRarelyLeft != COLORREF(-1L) )
  2616. m_mapColorTranslate[_2003CLR_MLA_RARELY_LEFT]          = InstallColor( clrMlaRarelyLeft );
  2617. if( clrMlaRarelyMiddle != COLORREF(-1L) )
  2618. m_mapColorTranslate[_2003CLR_MLA_RARELY_MIDDLE]        = InstallColor( clrMlaRarelyMiddle );
  2619. if( clrMlaRarelyRight != COLORREF(-1L) )
  2620. m_mapColorTranslate[_2003CLR_MLA_RARELY_RIGHT]         = InstallColor( clrMlaRarelyRight );
  2621. // colorize menu item selection bitmap
  2622. if( (!g_PaintManager.m_bIsWinVistaOrLater)
  2623. && eCurrentTheme == ThemeUnknown
  2624. )
  2625. {
  2626. m_mapColorTranslate[CLR_MENUTEXT_IN] = COLOR_HIGHLIGHTTEXT;
  2627. COLORREF clrHighlight = GetColor( COLOR_HIGHLIGHT, this );
  2628. BYTE nRed   = BYTE( GetRValue( clrHighlight ) );
  2629. BYTE nGreen = BYTE( GetGValue( clrHighlight ) );
  2630. BYTE nBlue  = BYTE( GetBValue( clrHighlight ) );
  2631. CSize _sizeBmp = m_bmpMenuItemOther.GetSize();
  2632. INT nX, nY;
  2633. for( nY = 0; nY < _sizeBmp.cy; nY++ )
  2634. {
  2635. for( nX = 0; nX < _sizeBmp.cx; nX++ )
  2636. {
  2637. RGBQUAD _pixel;
  2638. m_bmpMenuItemOther.GetPixel( nX, nY, _pixel );
  2639. _pixel.rgbRed   = nRed;
  2640. _pixel.rgbGreen = nGreen;
  2641. _pixel.rgbBlue  = nBlue;
  2642. m_bmpMenuItemOther.SetPixel( nX, nY, _pixel );
  2643. }
  2644. }
  2645. }
  2646. else
  2647. m_mapColorTranslate[CLR_MENUTEXT_IN] = COLOR_WINDOWTEXT;
  2648. } // if( stat_GetBPP() > 8 )
  2649. else
  2650. {
  2651. m_mapColorTranslate[_STUDIO_2008CLR_MENU_ITEM_LEFT_AREA_MARGIN_LEFT]  = COLOR_3DSHADOW;
  2652. m_mapColorTranslate[_STUDIO_2008CLR_MENU_ITEM_LEFT_AREA_MARGIN_RIGHT] = COLOR_WINDOW;
  2653. } // else from if( stat_GetBPP() > 8 )
  2654. }
  2655. int CExtPaintManagerStudio2008::GetThemeDockingType() const
  2656. {
  2657. ASSERT_VALID( this );
  2658. if( (! g_PaintManager.m_bIsWin2000orLater )
  2659. || stat_GetBPP() < 24
  2660. || IsHighContrast()
  2661. )
  2662. return CExtPaintManagerStudio2005::GetThemeDockingType();
  2663. #if (!defined __EXT_MFC_NO_DOCK_MARKERS)
  2664. return int(CExtControlBar::__RESIZABLE_DOCKING_TYPE_STUDIO_2008_AUTO);
  2665. #else
  2666. return CExtPaintManagerStudio2005::GetThemeDockingType();
  2667. #endif
  2668. }
  2669. bool CExtPaintManagerStudio2008::IsMenuMustCombineExcludeArea(
  2670. const CObject * pMenuTrackerObject // = NULL
  2671. ) const
  2672. {
  2673. ASSERT_VALID( this );
  2674. pMenuTrackerObject;
  2675. return false;
  2676. }
  2677. void CExtPaintManagerStudio2008::PaintMenuItemLeftAreaMarginXP(
  2678. CDC & dc,
  2679. CExtPaintManager::PAINTMENUITEMDATA & _pmid,
  2680. const RECT & rcFillLeftPart,
  2681. const RECT & rcFillRightPart
  2682. )
  2683. {
  2684. ASSERT_VALID( this );
  2685. if( _pmid.m_bForceNoLeftGradient )
  2686. return;
  2687. if( IsHighContrast() )
  2688. {
  2689. CExtPaintManagerXP::PaintMenuItemLeftAreaMarginXP(
  2690. dc,
  2691. _pmid,
  2692. rcFillLeftPart,
  2693. rcFillRightPart
  2694. );
  2695. return;
  2696. }
  2697. dc.FillSolidRect(
  2698. rcFillLeftPart.right - 1,
  2699. rcFillLeftPart.top,
  2700. 1,
  2701. rcFillLeftPart.bottom - rcFillLeftPart.top,
  2702. GetColor( 
  2703. _STUDIO_2008CLR_MENU_ITEM_LEFT_AREA_MARGIN_LEFT, 
  2704. _pmid.m_pHelperSrc, 
  2705. _pmid.m_lParam 
  2706. )
  2707. );
  2708. dc.FillSolidRect(
  2709. rcFillLeftPart.right,
  2710. rcFillLeftPart.top,
  2711. 1,
  2712. rcFillLeftPart.bottom - rcFillLeftPart.top,
  2713. GetColor( 
  2714. _STUDIO_2008CLR_MENU_ITEM_LEFT_AREA_MARGIN_RIGHT, 
  2715. _pmid.m_pHelperSrc, 
  2716. _pmid.m_lParam 
  2717. )
  2718. );
  2719. }
  2720. bool CExtPaintManagerStudio2008::PaintMenuItemSelectionAreaXP(
  2721. CDC & dc,
  2722. CExtPaintManager::PAINTMENUITEMDATA & _pmid,
  2723. const RECT & rcSelectionArea
  2724. )
  2725. {
  2726. ASSERT_VALID( this );
  2727. if( IsHighContrast() )
  2728. return CExtPaintManagerXP::PaintMenuItemBackgroundXP( dc, _pmid, rcSelectionArea );
  2729. if( ! _pmid.m_bSelected )
  2730. return false;
  2731. CExtPopupMenuWnd * pPopup = NULL;
  2732. if( _pmid.m_pHelperSrc != NULL )
  2733. {
  2734. ASSERT_VALID( _pmid.m_pHelperSrc );
  2735. pPopup = DYNAMIC_DOWNCAST( CExtPopupMenuWnd, _pmid.m_pHelperSrc );
  2736. }
  2737. CExtBitmapCache * pbmpMenuItem = NULL;
  2738. if( ! g_PaintManager.m_bIsWinVistaOrLater )
  2739. {
  2740. e_system_theme_t eCurrentTheme = OnQuerySystemTheme();
  2741. switch( eCurrentTheme ) 
  2742. {
  2743. // case ThemeVistaOrLaterUX:   // +2.87 -2.88
  2744. // case ThemeVistaOrLaterDWM:  // +2.87 -2.88
  2745. case ThemeLunaBlue:
  2746. pbmpMenuItem = &m_bmpMenuItemLunaBlue;
  2747. break;
  2748. case ThemeLunaOlive:
  2749. pbmpMenuItem = &m_bmpMenuItemLunaOliveGreen;
  2750. break;
  2751. case ThemeVistaOrLaterUX:   // +2.88
  2752. case ThemeVistaOrLaterDWM:  // +2.88
  2753. case ThemeLunaSilver:
  2754. pbmpMenuItem = &m_bmpMenuItemLunaSilver;
  2755. break;
  2756. case ThemeLunaRoyale:
  2757. pbmpMenuItem = &m_bmpMenuItemLunaRoyale;
  2758. break;
  2759. default:
  2760. pbmpMenuItem = &m_bmpMenuItemOther;
  2761. break;
  2762. } // switch( eCurrentTheme ) 
  2763. } // if( ! g_PaintManager.m_bIsWinVistaOrLater )
  2764. else
  2765. pbmpMenuItem = &m_bmpMenuItemVista;
  2766. ASSERT( pbmpMenuItem != NULL );
  2767. if( pbmpMenuItem != NULL )
  2768. pbmpMenuItem->AlphaBlendSkinParts(
  2769. dc.m_hDC,
  2770. rcSelectionArea,
  2771. CRect(3,3,3,3),
  2772. CExtBitmap::__EDM_STRETCH,
  2773. true,
  2774. false
  2775. );
  2776. return true;
  2777. }
  2778. void CExtPaintManagerStudio2008::PaintPushButton(
  2779. CDC & dc,
  2780. CExtPaintManager::PAINTPUSHBUTTONDATA & _ppbd
  2781. )
  2782. {
  2783. ASSERT_VALID( this );
  2784. ASSERT( dc.GetSafeHdc() != NULL );
  2785. if( _ppbd.m_rcClient.IsRectEmpty() )
  2786. return;
  2787. bool bMenuBar = false;
  2788. if( _ppbd.m_pHelperSrc != NULL  )
  2789. {
  2790. if( _ppbd.m_pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtBarButton ) ) 
  2791. && (! (_ppbd.m_pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtBarSliderButton ) )
  2792. && _ppbd.m_lParam == CExtBarSliderButton::__ESA_THUMB) )
  2793. )
  2794. {
  2795. CExtBarButton * pBarButton = (CExtBarButton*)_ppbd.m_pHelperSrc;
  2796. CExtToolControlBar * pToolBar = DYNAMIC_DOWNCAST( CExtToolControlBar, pBarButton->GetBar() );
  2797. ASSERT( pToolBar != NULL );
  2798. if( pToolBar->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) )
  2799. bMenuBar = true;
  2800. }
  2801. }
  2802. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  2803. if( _ppbd.m_pHelperSrc != NULL )
  2804. {
  2805. CExtBarButton * pTBB = DYNAMIC_DOWNCAST( CExtBarButton, _ppbd.m_pHelperSrc );
  2806. if( pTBB != NULL )
  2807. {
  2808. if( pTBB->IsRibbonPaintingMode() )
  2809. {
  2810. Ribbon_PaintPushButton( dc, _ppbd );
  2811. return;
  2812. }
  2813. CExtToolControlBar * pBar = pTBB->GetBar();
  2814. if( pBar != NULL
  2815. && pBar->IsKindOf( RUNTIME_CLASS( CExtRibbonPage ) )
  2816. && (! pTBB->IsNoRibbonLayout() )
  2817. && (! pTBB->IsKindOf( RUNTIME_CLASS( CExtBarMdiRightButton ) ) )
  2818. )
  2819. {
  2820. Ribbon_PaintPushButton( dc, _ppbd );
  2821. return;
  2822. }
  2823. } // if( pTBB != NULL )
  2824. } // if( _ppbd.m_pHelperSrc != NULL )
  2825. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  2826. bool bRTL = _ppbd.IsRTL();
  2827. if( !_ppbd.m_bEnabled )
  2828. {
  2829. _ppbd.m_bHover = false;
  2830. _ppbd.m_bDrawFocusRect = false;
  2831. _ppbd.m_bIndeterminate = false;
  2832. } // if( ! _ppbd.m_bEnabled )
  2833. COLORREF clrOldText = dc.GetTextColor();
  2834. COLORREF clrOldBk = dc.GetBkColor();
  2835. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  2836. int nIdxMainGradientLeft = -1;
  2837. int nIdxMainGradientRight = -1;
  2838. COLORREF bgColor, bgColorDD;
  2839. if( _ppbd.m_clrForceBk != ((COLORREF)-1L) )
  2840. bgColor = bgColorDD = _ppbd.m_clrForceBk;
  2841. else if(_ppbd.m_bHover 
  2842. || _ppbd.m_bPushed 
  2843. || _ppbd.m_bIndeterminate
  2844. || _ppbd.m_bPushedDropDown 
  2845. || _ppbd.m_bDefaultPushButton
  2846. )
  2847. {
  2848. bgColor = bgColorDD = GetColor( CLR_3DFACE_IN, _ppbd.m_pHelperSrc, _ppbd.m_lParam  );
  2849. if( _ppbd.m_bPushed || _ppbd.m_bPushedDropDown || _ppbd.m_bDefaultPushButton )
  2850. {
  2851. if( _ppbd.m_bDefaultPushButton )
  2852. bgColorDD = bgColor = dc.GetNearestColor( stat_HLS_Adjust( GetColor( XPCLR_HILIGHT ), 0.0, 0.2, 0.0 ) );
  2853. (( _ppbd.m_bPushedDropDown ) ? bgColorDD : bgColor) =
  2854. GetColor( _ppbd.m_bHover ? XPCLR_HILIGHT : CLR_3DFACE_IN, _ppbd.m_pHelperSrc, _ppbd.m_lParam );
  2855. }
  2856. if( (!_ppbd.m_bHover)
  2857. && _ppbd.m_bPushed
  2858. && (!_ppbd.m_bPushedDropDown)
  2859. && _ppbd.m_bSeparatedDropDown
  2860. )
  2861. bgColorDD =  GetColor( CLR_3DFACE_OUT, _ppbd.m_pHelperSrc, _ppbd.m_lParam );
  2862. if( _ppbd.m_bIndeterminate && ( !_ppbd.m_bHover ) && ( !_ppbd.m_bPushed ) )
  2863. bgColor = dc.GetNearestColor( stat_HLS_Adjust( bgColor, 0.0, 0.5, 0.5 ) );
  2864. if( _ppbd.m_bHover )
  2865. {
  2866. if( _ppbd.m_bPushed )
  2867. {
  2868. nIdxMainGradientLeft = m_nIdxClrBtnHovPresLeft;
  2869. nIdxMainGradientRight = m_nIdxClrBtnHovPresRight;
  2870. } // if( _ppbd.m_bPushed )
  2871. else
  2872. {
  2873. nIdxMainGradientLeft = m_nIdxClrBtnHoverLeft;
  2874. nIdxMainGradientRight = m_nIdxClrBtnHoverRight;
  2875. } // else from if( _ppbd.m_bPushed )
  2876. } // if( _ppbd.m_bHover )
  2877. else if( _ppbd.m_bPushed )
  2878. {
  2879. nIdxMainGradientLeft = m_nIdxClrBtnPressedLeft;
  2880. nIdxMainGradientRight = m_nIdxClrBtnPressedRight;
  2881. } // else if( _ppbd.m_bPushed )
  2882. } // if( _ppbd.m_bHover || _ppbd.m_bPushed || _ppbd.m_bIndeterminate || _ppbd.m_bPushedDropDown )
  2883. else
  2884. {
  2885. bgColor = bgColorDD =
  2886. GetColor(
  2887. _ppbd.m_bFlat ? CLR_3DFACE_OUT : COLOR_3DFACE,
  2888. _ppbd.m_pHelperSrc,
  2889. _ppbd.m_lParam 
  2890. );
  2891. }
  2892. COLORREF clrDkBorder =
  2893. GetColor(
  2894. (_ppbd.m_bHover || _ppbd.m_bPushed || _ppbd.m_bPushedDropDown )
  2895. ? XPCLR_HILIGHT_BORDER
  2896. : ( _ppbd.m_bFlat ? XPCLR_HILIGHT_BORDER : COLOR_3DSHADOW )
  2897. ,
  2898. _ppbd.m_pHelperSrc,
  2899. _ppbd.m_lParam 
  2900. );
  2901. bool bPushedDropDown = false;
  2902. if( (_ppbd.m_bPushed && !_ppbd.m_bSeparatedDropDown)
  2903. || _ppbd.m_bPushedDropDown
  2904. )
  2905. bPushedDropDown = true;
  2906. CRect rectClient( _ppbd.m_rcClient );
  2907. CRect rectCaption( _ppbd.m_rcClient );
  2908. CRect rectDropDown( 0, 0, 0, 0 );
  2909. if( _ppbd.m_bDropDown )
  2910. {
  2911. rectDropDown = rectClient;
  2912. if( _ppbd.m_bHorz )
  2913. {
  2914. if( bRTL )
  2915. {
  2916. rectCaption.left +=
  2917. __DROPDOWN_ARROW_GAP*2
  2918. + g_glyph_btn_expand_bottom.Size().cx
  2919. ;
  2920. rectDropDown.right = rectCaption.left + 1;
  2921. } // if( bRTL )
  2922. else
  2923. {
  2924. rectCaption.right -=
  2925. __DROPDOWN_ARROW_GAP*2
  2926. + g_glyph_btn_expand_bottom.Size().cx
  2927. ;
  2928. rectDropDown.left = rectCaption.right - 1;
  2929. } // else from if( bRTL )
  2930. } // if( _ppbd.m_bHorz )
  2931. else
  2932. {
  2933. rectCaption.bottom -=
  2934. __DROPDOWN_ARROW_GAP*2
  2935. + g_glyph_btn_expand_right.Size().cy
  2936. ;
  2937. rectDropDown.top = rectCaption.bottom - 1;
  2938. } // if( _ppbd.m_bHorz )
  2939. if( (! _ppbd.m_bTransparentBackground )
  2940. && ( _ppbd.m_bHover || _ppbd.m_bPushedDropDown )
  2941. || _ppbd.m_clrForceBk != ((COLORREF)-1L)
  2942. )
  2943. dc.FillSolidRect( &rectDropDown, bgColorDD );
  2944. if( _ppbd.m_bSeparatedDropDown )
  2945. {
  2946. rectClient = rectCaption;
  2947. if( bPushedDropDown )
  2948. {
  2949. if( (!_ppbd.m_bFlat) || _ppbd.m_bDrawBorder )
  2950. dc.Draw3dRect( rectDropDown, clrDkBorder, clrDkBorder );
  2951. } // if( bPushedDropDown )
  2952. else
  2953. {
  2954. if( (!_ppbd.m_bFlat) || (_ppbd.m_bHover && _ppbd.m_bDrawBorder) )
  2955. dc.Draw3dRect( rectDropDown, clrDkBorder, clrDkBorder );
  2956. } // else from if( bPushedDropDown )
  2957. } // if( _ppbd.m_bSeparatedDropDown )
  2958. } // if( _ppbd.m_bDropDown )
  2959. if( bMenuBar )
  2960. {
  2961. if( ( ! _ppbd.m_bTransparentBackground ) 
  2962. && ( _ppbd.m_bHover || _ppbd.m_bPushed )
  2963. )
  2964. {
  2965. CRect rcButton( rectClient );
  2966. COLORREF clrBack = RGB(255,255,255);
  2967. CBrush br( clrBack );
  2968. CBrush * pOldBrush = dc.SelectObject( &br );
  2969. CPen pen( PS_SOLID, 1, clrBack );
  2970. CPen * pOldPen = dc.SelectObject( &pen );
  2971. dc.RoundRect( rcButton, CPoint(2,2) );
  2972. rcButton.DeflateRect( 1, 1 );
  2973. br.DeleteObject();
  2974. br.CreateSolidBrush( bgColor );
  2975. dc.SelectObject( &br );
  2976. pen.DeleteObject();
  2977. pen.CreatePen( PS_SOLID, 1, clrDkBorder );
  2978. dc.SelectObject( &pen );
  2979. dc.RoundRect( rcButton, CPoint(2,2) );
  2980. if( _ppbd.m_bPushed )
  2981. {
  2982. rcButton.DeflateRect( 1, 1 );
  2983. if( ::GetDeviceCaps( dc.m_hDC, BITSPIXEL ) > 8 )
  2984. stat_PaintGradientRect( 
  2985. dc, 
  2986. rcButton, 
  2987. GetColor( _2003CLR_TBB_BK_COMBINED_BOTTOM, _ppbd.m_pHelperSrc, _ppbd.m_lParam ), 
  2988. GetColor( _2003CLR_TBB_BK_COMBINED_TOP, _ppbd.m_pHelperSrc, _ppbd.m_lParam ), 
  2989. true
  2990. );
  2991. else
  2992. dc.FillSolidRect( 
  2993. &rcButton, 
  2994. GetColor( COLOR_WINDOW, _ppbd.m_pHelperSrc, _ppbd.m_lParam )
  2995. );
  2996. }
  2997.   dc.SelectObject( pOldBrush );
  2998. dc.SelectObject( pOldPen );
  2999. }
  3000. }
  3001. else
  3002. {
  3003. if( ( ! _ppbd.m_bTransparentBackground ) 
  3004. || _ppbd.m_bIndeterminate
  3005. || _ppbd.m_clrForceBk != ((COLORREF)-1L)
  3006. )
  3007. {
  3008. if( nIdxMainGradientLeft >= 0 
  3009. && nIdxMainGradientRight >= 0 
  3010. && ::GetDeviceCaps( dc.m_hDC, BITSPIXEL ) > 8
  3011. )
  3012. {
  3013. stat_PaintGradientRect(
  3014. dc,
  3015. rectClient,
  3016. GetColor( _ppbd.m_bHorz ? nIdxMainGradientRight : nIdxMainGradientLeft, _ppbd.m_pHelperSrc, _ppbd.m_lParam ),
  3017. GetColor( _ppbd.m_bHorz ? nIdxMainGradientLeft : nIdxMainGradientRight, _ppbd.m_pHelperSrc, _ppbd.m_lParam ),
  3018. _ppbd.m_bHorz
  3019. );
  3020. }
  3021. else
  3022. dc.FillSolidRect( &rectClient, bgColor );
  3023. }
  3024. // Draw pressed button
  3025. if( _ppbd.m_bPushed || _ppbd.m_bIndeterminate || _ppbd.m_bPushedDropDown )
  3026. {
  3027. if( (!_ppbd.m_bFlat) || _ppbd.m_bDrawBorder )
  3028. dc.Draw3dRect( rectClient, clrDkBorder, clrDkBorder );
  3029. }
  3030. else
  3031. {
  3032. if( _ppbd.m_bFlat )
  3033. {
  3034. if( _ppbd.m_bHover && _ppbd.m_bDrawBorder )
  3035. dc.Draw3dRect( rectClient, clrDkBorder, clrDkBorder );
  3036. }
  3037. else
  3038. {
  3039. dc.Draw3dRect( rectClient, clrDkBorder, clrDkBorder );
  3040. if( _ppbd.m_bHover )
  3041. dc.Draw3dRect( _ppbd.m_rcClient, clrDkBorder, clrDkBorder );
  3042. }
  3043. }
  3044. }
  3045. if( _ppbd.m_bDropDown && (! _ppbd.m_bNoDropDownArrow ) )
  3046. {
  3047. CRect rectGlyph( rectDropDown );
  3048. if( bPushedDropDown )
  3049. rectGlyph.OffsetRect( GetPushedOffset() );
  3050. COLORREF ColorValues[2] =
  3051. {
  3052. RGB(0,0,0),
  3053. RGB(0,0,0),
  3054. };
  3055. bool bSetDefaultColorForDD = true;
  3056. if( _ppbd.m_bEnabled )
  3057. {
  3058. if( m_clrCustomDropDownGlyphEnabled != COLORREF(-1L) )
  3059. {
  3060. ColorValues[1] = m_clrCustomDropDownGlyphEnabled;
  3061. bSetDefaultColorForDD = false;
  3062. }
  3063. }
  3064. else
  3065. {
  3066. if( m_clrCustomDropDownGlyphDisabled != COLORREF(-1L) )
  3067. {
  3068. ColorValues[1] = m_clrCustomDropDownGlyphDisabled;
  3069. bSetDefaultColorForDD = false;
  3070. }
  3071. }
  3072. if( bSetDefaultColorForDD )
  3073. ColorValues[1] =
  3074. GetColor(
  3075. _ppbd.m_bEnabled
  3076. ? COLOR_BTNTEXT
  3077. : COLOR_3DSHADOW
  3078. ,
  3079. _ppbd.m_pHelperSrc,
  3080. _ppbd.m_lParam 
  3081. );
  3082. if( bRTL && (rectGlyph.Width()&1) == 0 )
  3083. rectGlyph.right++;
  3084. PaintGlyphCentered(
  3085. dc,
  3086. rectGlyph,
  3087. _ppbd.m_bHorz ? g_glyph_btn_expand_bottom : g_glyph_btn_expand_right,
  3088. ColorValues
  3089. );
  3090. } // if( _ppbd.m_bDropDown && (! _ppbd.m_bNoDropDownArrow ) )
  3091. dc.SetBkColor( bgColor );
  3092. rectCaption.DeflateRect( _ppbd.m_rcBorderSizes );
  3093. rectClient = rectCaption;
  3094. CRect rcFocus( rectCaption );
  3095. // Draw icon
  3096. if( rectClient.bottom > rectClient.top
  3097. && rectClient.right > rectClient.left
  3098. )
  3099. PaintPushButtonIcon(
  3100. dc,
  3101. rectClient,
  3102. rectCaption,
  3103. rcFocus,
  3104. _ppbd
  3105. );
  3106. CExtSafeString sTitle( _T("") );
  3107. if( _ppbd.m_sText != NULL )
  3108. sTitle = _ppbd.m_sText;
  3109. // Draw text
  3110. if( rectCaption.bottom > rectCaption.top
  3111. && rectCaption.right > rectCaption.left
  3112. && (!sTitle.IsEmpty())
  3113. )
  3114. PaintPushButtonText(
  3115. dc,
  3116. rectCaption,
  3117. _ppbd
  3118. );
  3119. // Draw focus rectangle
  3120. if( _ppbd.m_bDrawFocusRect 
  3121. && ( ( !sTitle.IsEmpty() ) || _ppbd.m_nFocusMode == __EBFM_CLIENT_AREA )
  3122. && rcFocus.bottom > rcFocus.top 
  3123. && rcFocus.right > rcFocus.left
  3124. )
  3125. {
  3126. rcFocus.DeflateRect( 2, 2 );
  3127. dc.DrawFocusRect( &rcFocus );
  3128. }
  3129. dc.SetBkMode( nOldBkMode );
  3130. dc.SetBkColor( clrOldBk );
  3131. dc.SetTextColor( clrOldText );
  3132. }
  3133. #if (!defined __EXT_MFC_NO_TAB_CTRL)
  3134. void CExtPaintManagerStudio2008::PaintTabItem(
  3135. CDC & dc,
  3136. CRect & rcTabItemsArea,
  3137. bool bTopLeft,
  3138. bool bHorz,
  3139. bool bSelected,
  3140. bool bCenteredText,
  3141. bool bGroupedMode,
  3142. bool bInGroupActive,
  3143. bool bInvertedVerticalMode,
  3144. const CRect & rcEntireItem,
  3145. CSize sizeTextMeasured,
  3146. CFont * pFont,
  3147. __EXT_MFC_SAFE_LPCTSTR sText,
  3148. CExtCmdIcon * pIcon,
  3149. CObject * pHelperSrc,
  3150. LPARAM lParam, // = 0L
  3151. COLORREF clrForceText, // = COLORREF(-1L)
  3152. COLORREF clrForceTabBk, // = COLORREF(-1L)
  3153. COLORREF clrForceTabBorderLT, // = COLORREF(-1L)
  3154. COLORREF clrForceTabBorderRB, // = COLORREF(-1L)
  3155. COLORREF clrForceTabSeparator, // = COLORREF(-1L)
  3156. bool bDwmMode // = false
  3157. )
  3158. {
  3159. ASSERT_VALID( this );
  3160. ASSERT( dc.GetSafeHdc() != NULL );
  3161. if( IsHighContrast() )
  3162. {
  3163. CExtPaintManagerXP::PaintTabItem(
  3164. dc,
  3165. rcTabItemsArea,
  3166. bTopLeft,
  3167. bHorz,
  3168. bSelected,
  3169. bCenteredText,
  3170. bGroupedMode,
  3171. bInGroupActive,
  3172. bInvertedVerticalMode,
  3173. rcEntireItem,
  3174. sizeTextMeasured,
  3175. pFont,
  3176. sText,
  3177. pIcon,
  3178. pHelperSrc,
  3179. lParam,
  3180. clrForceText,
  3181. clrForceTabBk,
  3182. clrForceTabBorderLT,
  3183. clrForceTabBorderRB,
  3184. clrForceTabSeparator,
  3185. bDwmMode
  3186. );
  3187. return;
  3188. }
  3189. LONG nItemIndex = 1;
  3190. CExtCmdIcon * pIconTabItemCloseButton = NULL;
  3191. CExtCmdIcon::e_paint_type_t ePaintStateITICB =
  3192. (CExtCmdIcon::e_paint_type_t) CExtCmdIcon::__PAINT_INVISIBLE;
  3193. CRect rcTabItemCloseButton( 0, 0, 0, 0 );
  3194. CExtBarButton * pTBB = NULL;
  3195. CExtTabWnd * pTabs = NULL;
  3196. CExtTabWnd::TAB_ITEM_INFO * pTII = NULL;
  3197. bool bNoPrefix = false;
  3198. if( pHelperSrc != NULL )
  3199. {
  3200. pTabs = DYNAMIC_DOWNCAST( CExtTabWnd, pHelperSrc );
  3201. if( pTabs != NULL )
  3202. {
  3203. ASSERT_VALID( pTabs );
  3204. pTII = pTabs->ItemGet( LONG( lParam ) );
  3205. ASSERT( pTII != NULL );
  3206. ASSERT_VALID( pTII );
  3207. nItemIndex = (LONG)lParam;
  3208. pIconTabItemCloseButton =
  3209. pTabs->OnTabWndQueryItemCloseButtonShape( pTII );
  3210. if( pIconTabItemCloseButton != NULL )
  3211. {
  3212. rcTabItemCloseButton = pTII->CloseButtonRectGet();
  3213. ePaintStateITICB = (CExtCmdIcon::e_paint_type_t)
  3214. pTabs->OnTabWndQueryItemCloseButtonPaintState( pTII );
  3215. } // if( pIconTabItemCloseButton != NULL )
  3216. bNoPrefix = ( ( pTabs->GetTabWndStyleEx() & __ETWS_EX_NO_PREFIX ) != 0 ) ? true : false;
  3217. } // if( pTabs != NULL )
  3218. else
  3219. {
  3220. pTBB = DYNAMIC_DOWNCAST( CExtBarButton, pHelperSrc );
  3221. #ifdef _DEBUG
  3222. if( pTBB != NULL )
  3223. {
  3224. ASSERT_VALID( pTBB );
  3225. } // if( pTBB != NULL )
  3226. #endif // _DEBUG
  3227. } // else from if( pTabs != NULL )
  3228. } // if( pHelperSrc != NULL )
  3229. LONG nSelectionIndex = -1;
  3230. if( pTabs != NULL )
  3231. nSelectionIndex = pTabs->SelectionGet();
  3232. bool bInGroupFirst = false;
  3233. bool bInGroupLast = false;
  3234. if( bGroupedMode && pTII != NULL )
  3235. {
  3236. ASSERT( pTabs != NULL );
  3237. CExtTabWnd::TAB_ITEM_INFO * pTiiFirst = pTII->GetInGroupFirst();
  3238. CExtTabWnd::TAB_ITEM_INFO * pTiiLast = pTII->GetInGroupLast();
  3239. ASSERT_VALID( pTiiFirst );
  3240. ASSERT_VALID( pTiiLast );
  3241. bInGroupFirst = ( nItemIndex == pTabs->ItemGetIndexOf( pTiiFirst ) );
  3242. bInGroupLast = ( nItemIndex == pTabs->ItemGetIndexOf( pTiiLast ) );
  3243. }
  3244. bool bFirstItem = false, bLastItem = false;
  3245. if( pTII != NULL )
  3246. {
  3247. ASSERT( pTabs != NULL );
  3248. bFirstItem =
  3249. ( nItemIndex == 0
  3250. || ( bInGroupFirst
  3251. && nItemIndex != nSelectionIndex
  3252. )
  3253. );
  3254. bLastItem = 
  3255. ( nItemIndex == pTabs->ItemGetCount() - 1
  3256. || ( bInGroupLast
  3257. && nItemIndex != nSelectionIndex
  3258. )
  3259. );
  3260. }
  3261. bool bDrawIcon = (
  3262. pIcon != NULL 
  3263. && (! pIcon->IsEmpty() ) 
  3264. && ( pTabs == NULL || (pTabs->GetTabWndStyle()&__ETWS_HIDE_ICONS) == 0  ) 
  3265. );
  3266. if( bGroupedMode )
  3267. bSelected = false;
  3268. bool bHover = false;
  3269. bool bPressed = false;
  3270. bool bEnabled = true;
  3271. if( pTII != NULL )
  3272. {
  3273. ASSERT( pTabs != NULL );
  3274. bEnabled = pTII->EnabledGet();
  3275. bHover = ( pTabs->GetHoverTrackingItem() == nItemIndex && bEnabled ) ? true : false;
  3276. bPressed = ( pTabs->GetPushedTrackingItem() == nItemIndex && bEnabled ) ? true : false;
  3277. }
  3278. else if( pTBB != NULL )
  3279. {
  3280. bEnabled = pTBB->IsEnabled();
  3281. bHover = pTBB->IsHover();
  3282. bPressed = pTBB->IsPressed();
  3283. }
  3284. bool bDetectedDynTPC = false;
  3285. bDetectedDynTPC;
  3286. #if (!defined __EXT_MFC_NO_DYNAMIC_BAR_SITE)
  3287. if( pTII != NULL )
  3288. {
  3289. CObject * pObject = pTII->EventProviderGet();
  3290. if( pObject != NULL )
  3291. {
  3292. CExtDynamicControlBar * pBar = DYNAMIC_DOWNCAST( CExtDynamicControlBar, pObject );
  3293. if( pBar != NULL )
  3294. {
  3295. bool bFlashCaptionHighlightedState = false;
  3296. if( pBar->FlashCaptionIsInProgress( &bFlashCaptionHighlightedState ) )
  3297. {
  3298. if( bFlashCaptionHighlightedState )
  3299. {
  3300. clrForceText = pBar->m_clrFlashCaptionText;
  3301. clrForceTabBk = pBar->m_clrFlashCaptionBackground;
  3302. bSelected = true;
  3303. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3304. bDetectedDynTPC = true;
  3305. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3306. }
  3307. }
  3308. }
  3309. }
  3310. }
  3311. #endif// (!defined __EXT_MFC_NO_DYNAMIC_BAR_SITE)
  3312. COLORREF clrColorizeTabShape = COLORREF(-1L);
  3313. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3314. if( pHelperSrc != NULL
  3315. && clrForceTabBk != COLORREF(-1L)
  3316. && ( bDetectedDynTPC
  3317. || pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDynTabWnd ) )
  3318. || pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDynAutoHideArea ) )
  3319. )
  3320. )
  3321. clrColorizeTabShape = clrForceTabBk;
  3322. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3323. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  3324. if( pHelperSrc != NULL
  3325. && clrForceTabBk != COLORREF(-1L)
  3326. && pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtTabWnd ) )
  3327. && ((CExtTabWnd*)pHelperSrc)->_IsMdiTabCtrl()
  3328. )
  3329. clrColorizeTabShape = clrForceTabBk;
  3330. #endif // (!defined __EXT_MFC_NO_TABMDI_CTRL)
  3331. enum e_TabOrientation_t
  3332. {
  3333. __ETO_TOP = 0,
  3334. __ETO_BOTTOM = 1,
  3335. __ETO_LEFT = 2,
  3336. __ETO_RIGHT = 3,
  3337. };
  3338. e_TabOrientation_t eTO = __ETO_TOP;
  3339. if( bTopLeft )
  3340. {
  3341. if( bHorz )
  3342. eTO = __ETO_TOP;
  3343. else
  3344. eTO = __ETO_LEFT;
  3345. }
  3346. else
  3347. {
  3348. if( bHorz )
  3349. eTO = __ETO_BOTTOM;
  3350. else
  3351. eTO = __ETO_RIGHT;
  3352. }
  3353. if( bGroupedMode )
  3354. {
  3355. switch( eTO )
  3356. {
  3357. case __ETO_TOP:
  3358. eTO = __ETO_BOTTOM;
  3359. break;
  3360. case __ETO_BOTTOM:
  3361. eTO = __ETO_TOP;
  3362. break;
  3363. case __ETO_LEFT:
  3364. eTO = __ETO_RIGHT;
  3365. break;
  3366. case __ETO_RIGHT:
  3367. eTO = __ETO_LEFT;
  3368. break;
  3369. }
  3370. }
  3371. CRect rcItem( rcEntireItem );
  3372. if( g_PaintManager.m_UxTheme.IsControlsThemed() )
  3373. {
  3374. HWND hWndOpenTheme = pTabs->GetSafeHwnd();
  3375. if( hWndOpenTheme == NULL )
  3376. hWndOpenTheme = ::GetDesktopWindow();
  3377. if( g_PaintManager.m_UxTheme.OpenThemeData( hWndOpenTheme, VSCLASS_TAB ) != NULL )
  3378. {
  3379. INT nPartID = TABP_TABITEM;
  3380. INT nStateID = 
  3381. (!bEnabled)
  3382. ? TIS_DISABLED
  3383. : bSelected
  3384. ? TIS_SELECTED
  3385. : bPressed
  3386. ? TIS_FOCUSED
  3387. : bHover
  3388. ? TIS_HOT
  3389. : TIS_NORMAL;
  3390. CExtBitmap _bmp1, _bmp2;
  3391. COLORREF * pClrSurface = NULL;
  3392. CBitmap _bmp;
  3393. CBitmap * pOldBmp = NULL;
  3394. CDC dcX;
  3395. if( eTO == __ETO_TOP || eTO == __ETO_BOTTOM )
  3396. {
  3397. if( eTO == __ETO_TOP 
  3398. && clrColorizeTabShape == COLORREF(-1L) 
  3399. )
  3400. {
  3401. rcItem.OffsetRect( 0, 2 );
  3402. if( bSelected )
  3403. rcItem.InflateRect(
  3404. bFirstItem ? 0 : 2,
  3405. ( eTO == __ETO_TOP ) ? 2 : 0,
  3406. bLastItem ? 0 : 2,
  3407. ( eTO == __ETO_BOTTOM ) ? 2 : 0
  3408. );
  3409. VERIFY( 
  3410. g_PaintManager.m_UxTheme.DrawBackground(
  3411. hWndOpenTheme,
  3412. dc.GetSafeHdc(), 
  3413. nPartID, 
  3414. nStateID, 
  3415. &rcItem, 
  3416. &rcItem
  3417. ) == S_OK
  3418. );
  3419. }
  3420. else
  3421. {
  3422. if( eTO == __ETO_BOTTOM )
  3423. {
  3424. if( g_PaintManager.m_bIsWinVista )
  3425. rcItem.DeflateRect( 0, -2, 0, 2 );
  3426. else
  3427. rcItem.OffsetRect( 0, -1 );
  3428. }
  3429. if( bSelected )
  3430. rcItem.InflateRect(
  3431. bFirstItem ? 0 : 2,
  3432. ( eTO == __ETO_TOP ) ? 2 : 0,
  3433. bLastItem ? 0 : 2,
  3434. ( eTO == __ETO_BOTTOM ) ? 2 : 0
  3435. );
  3436. VERIFY( _bmp1.FromSurface( dc.m_hDC, rcItem ) );
  3437. if( eTO != __ETO_TOP )
  3438. {
  3439. VERIFY(
  3440. _bmp2.CreateRotated9xStack(
  3441. _bmp1,
  3442. 180,
  3443. 1,
  3444. rcItem.Width(),
  3445. rcItem.Height(),
  3446. false,
  3447. false
  3448. )
  3449. );
  3450. }
  3451. else
  3452. _bmp2 = _bmp1;
  3453. HBITMAP hBmp = _bmp2.CreateBitmap( &pClrSurface );
  3454. ASSERT( hBmp != NULL && pClrSurface != NULL );
  3455. _bmp.Attach( hBmp );
  3456. VERIFY( dcX.CreateCompatibleDC( NULL ) );
  3457. pOldBmp = dcX.SelectObject( &_bmp );
  3458. CRect rcItemX( 0, 0, rcItem.Width(), rcItem.Height() );
  3459. VERIFY( 
  3460. g_PaintManager.m_UxTheme.DrawBackground(
  3461. hWndOpenTheme,
  3462. dcX.GetSafeHdc(), 
  3463. nPartID, 
  3464. nStateID, 
  3465. &rcItemX, 
  3466. &rcItemX
  3467. ) == S_OK
  3468. );
  3469. dcX.SelectObject( pOldBmp );
  3470. _bmp2.Empty();
  3471. VERIFY( _bmp2.FromBitmap( hBmp ) );
  3472. _bmp1.Empty();
  3473. if( eTO != __ETO_TOP )
  3474. {
  3475. VERIFY(
  3476. _bmp1.CreateRotated9xStack(
  3477. _bmp2,
  3478. 180,
  3479. 1,
  3480. rcItem.Width(),
  3481. rcItem.Height(),
  3482. false,
  3483. false
  3484. )
  3485. );
  3486. }
  3487. else
  3488. _bmp1 = _bmp2;
  3489. if( clrColorizeTabShape != COLORREF(-1L) )
  3490. {
  3491. _bmp1.Make32();
  3492. _bmp1.AdjustHLS( COLORREF(-1L), COLORREF(-1L), 0.0, -0.5 );
  3493. _bmp1.MakeMono( clrColorizeTabShape );
  3494. _bmp1.AlphaBlend( dc.m_hDC, rcItem, 64 );
  3495. }
  3496. else
  3497. _bmp1.Draw( dc.m_hDC, rcItem );
  3498. }
  3499. } // if( eTO == __ETO_TOP || eTO == __ETO_BOTTOM )
  3500. else
  3501. {
  3502. if( eTO == __ETO_LEFT
  3503. && clrColorizeTabShape == COLORREF(-1L) 
  3504. )
  3505. {
  3506. rcItem.OffsetRect( 2, 0 );
  3507. if( g_PaintManager.m_bIsWinVista && eTO == __ETO_RIGHT )
  3508. rcItem.DeflateRect( -2, 0, 2, 0 );
  3509. if( bSelected )
  3510. rcItem.InflateRect( 2, bFirstItem ? 0 : 2, 2, bLastItem ? 0 : 2 );
  3511. VERIFY( _bmp1.FromSurface( dc.m_hDC, rcItem ) );
  3512. VERIFY(
  3513. _bmp2.CreateRotated9xStack(
  3514. _bmp1,
  3515. 90,
  3516. 1,
  3517. rcItem.Width(),
  3518. rcItem.Height(),
  3519. false,
  3520. false
  3521. )
  3522. );
  3523. HBITMAP hBmp = _bmp2.CreateBitmap( &pClrSurface );
  3524. ASSERT( hBmp != NULL && pClrSurface != NULL );
  3525. _bmp.Attach( hBmp );
  3526. VERIFY( dcX.CreateCompatibleDC( NULL ) );
  3527. pOldBmp = dcX.SelectObject( &_bmp );
  3528. CRect rcItemX( 0, 0, rcItem.Height(), rcItem.Width() );
  3529. VERIFY( 
  3530. g_PaintManager.m_UxTheme.DrawBackground(
  3531. hWndOpenTheme,
  3532. dcX.GetSafeHdc(), 
  3533. nPartID, 
  3534. nStateID, 
  3535. &rcItemX, 
  3536. &rcItemX
  3537. ) == S_OK
  3538. );
  3539. dcX.SelectObject( pOldBmp );
  3540. _bmp2.Empty();
  3541. VERIFY( _bmp2.FromBitmap( hBmp ) );
  3542. _bmp1.Empty();
  3543. VERIFY(
  3544. _bmp1.CreateRotated9xStack(
  3545. _bmp2,
  3546. 270,
  3547. 1,
  3548. rcItem.Height(),
  3549. rcItem.Width(),
  3550. false,
  3551. false
  3552. )
  3553. );
  3554. _bmp1.Draw( dc.m_hDC, rcItem );
  3555. }
  3556. else
  3557. {
  3558. if( g_PaintManager.m_bIsWinVista && eTO == __ETO_RIGHT )
  3559. rcItem.DeflateRect( -2, 0, 2, 0 );
  3560. if( bSelected )
  3561. rcItem.InflateRect( 2, bFirstItem ? 0 : 2, 2, bLastItem ? 0 : 2 );
  3562. VERIFY( _bmp1.FromSurface( dc.m_hDC, rcItem ) );
  3563. if( eTO != __ETO_LEFT )
  3564. {
  3565. VERIFY(
  3566. _bmp2.CreateRotated9xStack(
  3567. _bmp1,
  3568. 270,
  3569. 1,
  3570. rcItem.Width(),
  3571. rcItem.Height(),
  3572. false,
  3573. false
  3574. )
  3575. );
  3576. }
  3577. else
  3578. _bmp2 = _bmp1;
  3579. HBITMAP hBmp = _bmp2.CreateBitmap( &pClrSurface );
  3580. ASSERT( hBmp != NULL && pClrSurface != NULL );
  3581. _bmp.Attach( hBmp );
  3582. VERIFY( dcX.CreateCompatibleDC( NULL ) );
  3583. pOldBmp = dcX.SelectObject( &_bmp );
  3584. CRect rcItemX( 0, 0, rcItem.Height(), rcItem.Width() );
  3585. VERIFY( 
  3586. g_PaintManager.m_UxTheme.DrawBackground(
  3587. hWndOpenTheme,
  3588. dcX.GetSafeHdc(), 
  3589. nPartID, 
  3590. nStateID, 
  3591. &rcItemX, 
  3592. &rcItemX
  3593. ) == S_OK
  3594. );
  3595. dcX.SelectObject( pOldBmp );
  3596. _bmp2.Empty();
  3597. VERIFY( _bmp2.FromBitmap( hBmp ) );
  3598. _bmp1.Empty();
  3599. if( eTO != __ETO_LEFT )
  3600. {
  3601. VERIFY(
  3602. _bmp1.CreateRotated9xStack(
  3603. _bmp2,
  3604. 90,
  3605. 1,
  3606. rcItem.Height(),
  3607. rcItem.Width(),
  3608. false,
  3609. false
  3610. )
  3611. );
  3612. }
  3613. else
  3614. _bmp1 = _bmp2;
  3615. if( clrColorizeTabShape != COLORREF(-1L) )
  3616. {
  3617. _bmp1.Make32();
  3618. _bmp1.AdjustHLS( COLORREF(-1L), COLORREF(-1L), 0.0, -0.5 );
  3619. _bmp1.MakeMono( clrColorizeTabShape );
  3620. _bmp1.AlphaBlend( dc.m_hDC, rcItem, 64 );
  3621. }
  3622. else
  3623. _bmp1.Draw( dc.m_hDC, rcItem );
  3624. }
  3625. } // else if( eTO == __ETO_TOP || eTO == __ETO_BOTTOM )
  3626. if( _bmp.GetSafeHandle() != NULL )
  3627. _bmp.DeleteObject();
  3628. if( dcX.GetSafeHdc() != NULL )
  3629. dcX.DeleteDC();
  3630. g_PaintManager.m_UxTheme.CloseThemeData();
  3631. } // if( g_PaintManager.m_UxTheme.OpenThemeData( ...
  3632. }
  3633. else // if( g_PaintManager.m_UxTheme.IsControlsThemed() )
  3634. {
  3635. POINT arrPointsBorders[4] = { {0,0}, {0,0}, {0,0}, {0,0} };
  3636. if( eTO == __ETO_TOP || eTO == __ETO_BOTTOM )
  3637. {
  3638. if( eTO == __ETO_TOP )
  3639. {
  3640. rcItem.OffsetRect( 0, 2 );
  3641. if( bSelected )
  3642. rcItem.InflateRect(
  3643. bFirstItem ? 0 : 2,
  3644. 2,
  3645. bLastItem ? 0 : 2,
  3646. -2
  3647. );
  3648. arrPointsBorders[0] = CPoint(rcItem.left, rcItem.bottom );
  3649. arrPointsBorders[1] = CPoint(rcItem.left, rcItem.top );
  3650. arrPointsBorders[2] = CPoint(rcItem.right, rcItem.top );
  3651. arrPointsBorders[3] = CPoint(rcItem.right, rcItem.bottom );
  3652. if( bSelected || bGroupedMode )
  3653. {
  3654. arrPointsBorders[0].y += 1;
  3655. arrPointsBorders[3].y += 1;
  3656. }
  3657. }
  3658. else
  3659. {
  3660. if( bSelected )
  3661. rcItem.InflateRect(
  3662. bFirstItem ? 0 : 2,
  3663. 0,
  3664. bLastItem ? 0 : 2,
  3665. 2
  3666. );
  3667. rcItem.bottom -= 3;
  3668. arrPointsBorders[0] = CPoint(rcItem.left, rcItem.top );
  3669. arrPointsBorders[1] = CPoint(rcItem.left, rcItem.bottom );
  3670. arrPointsBorders[2] = CPoint(rcItem.right, rcItem.bottom );
  3671. arrPointsBorders[3] = CPoint(rcItem.right, rcItem.top - 1 );
  3672. if( bSelected || bGroupedMode )
  3673. {
  3674. arrPointsBorders[0].y -= 1;
  3675. arrPointsBorders[3].y -= 1;
  3676. }
  3677. }
  3678. else
  3679. {
  3680. if( eTO == __ETO_LEFT )
  3681. {
  3682. rcItem.OffsetRect( 2, 0 );
  3683. if( bSelected )
  3684. rcItem.InflateRect(
  3685. 2,
  3686. bFirstItem ? 0 : 2,
  3687. 2,
  3688. bLastItem ? 0 : 2
  3689. );
  3690. arrPointsBorders[0] = CPoint(rcItem.right, rcItem.top );
  3691. arrPointsBorders[1] = CPoint(rcItem.left, rcItem.top );
  3692. arrPointsBorders[2] = CPoint(rcItem.left, rcItem.bottom );
  3693. arrPointsBorders[3] = CPoint(rcItem.right, rcItem.bottom );
  3694. if( bSelected || bGroupedMode )
  3695. {
  3696. arrPointsBorders[0].x += 1;
  3697. arrPointsBorders[3].x += 1;
  3698. }
  3699. }
  3700. else
  3701. {
  3702. if( bSelected )
  3703. rcItem.InflateRect(
  3704. 2,
  3705. bFirstItem ? 0 : 2,
  3706. 2,
  3707. bLastItem ? 0 : 2
  3708. );
  3709. rcItem.right -= 3;
  3710. arrPointsBorders[0] = CPoint(rcItem.left, rcItem.top );
  3711. arrPointsBorders[1] = CPoint(rcItem.right, rcItem.top );
  3712. arrPointsBorders[2] = CPoint(rcItem.right, rcItem.bottom );
  3713. arrPointsBorders[3] = CPoint(rcItem.left - 1, rcItem.bottom );
  3714. if( bSelected || bGroupedMode )
  3715. {
  3716. arrPointsBorders[0].x -= 1;
  3717. arrPointsBorders[3].x -= 1;
  3718. }
  3719. }
  3720. }
  3721. CRgn rgnBk;
  3722. VERIFY( rgnBk.CreatePolygonRgn( arrPointsBorders, 4, ALTERNATE ) );
  3723. if( bSelected 
  3724. || ( bHover && bGroupedMode )
  3725. )
  3726. {
  3727. COLORREF clrBrushBk = RGB(252,252,254);
  3728. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3729. if( pHelperSrc != NULL
  3730. && clrForceTabBk != COLORREF(-1L)
  3731. && ( bDetectedDynTPC
  3732. || pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDynTabWnd ) )
  3733. || pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDynAutoHideArea ) )
  3734. )
  3735. )
  3736. clrBrushBk = clrForceTabBk;
  3737. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3738. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  3739. if( pHelperSrc != NULL
  3740. && clrForceTabBk != COLORREF(-1L)
  3741. && pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtTabWnd ) )
  3742. && ((CExtTabWnd*)pHelperSrc)->_IsMdiTabCtrl()
  3743. )
  3744. clrBrushBk = clrForceTabBk;
  3745. #endif // (!defined __EXT_MFC_NO_TABMDI_CTRL)
  3746. CBrush brushBk( clrBrushBk );
  3747. dc.FillRgn( &rgnBk, &brushBk );
  3748. }
  3749. // draw item border 
  3750. CPen pen(PS_SOLID, 1, GetColor( COLOR_3DSHADOW, this ) );
  3751. CPen * pOldPen = dc.SelectObject( &pen );
  3752. for( int i = 0 ; i < sizeof(arrPointsBorders)/sizeof(arrPointsBorders[0]) - 1; i++ )
  3753. {
  3754. dc.MoveTo( arrPointsBorders[i] );
  3755. dc.LineTo( arrPointsBorders[i + 1] );
  3756. }
  3757. dc.SelectObject( pOldPen );
  3758. } // if( g_PaintManager.m_UxTheme.IsControlsThemed() )
  3759. COLORREF clrText = clrForceText;
  3760. if( clrText == COLORREF(-1L) )
  3761. clrText =
  3762. GetColor(
  3763. bEnabled ? COLOR_BTNTEXT : CLR_TEXT_DISABLED,
  3764. pHelperSrc,
  3765. lParam
  3766. );
  3767. #define __EXTTAB_INDENT_TOP 2
  3768. #define __EXTTAB_INDENT_BOTTOM 2
  3769. #define __EXTTAB_INDENT_LEFT 2
  3770. #define __EXTTAB_INDENT_RIGHT 2
  3771. rcItem.DeflateRect(
  3772. bHorz 
  3773. ? __EXTTAB_INDENT_LEFT 
  3774. : __EXTTAB_INDENT_TOP,
  3775. bHorz 
  3776. ? __EXTTAB_INDENT_TOP 
  3777. : __EXTTAB_INDENT_LEFT,
  3778. bHorz 
  3779. ? __EXTTAB_INDENT_RIGHT 
  3780. : __EXTTAB_INDENT_TOP,
  3781. bHorz 
  3782. ? __EXTTAB_INDENT_BOTTOM 
  3783. : __EXTTAB_INDENT_RIGHT
  3784. );
  3785. CSize _sizeIcon( 0, 0 );
  3786. if( bDrawIcon )
  3787. {
  3788. _sizeIcon = pIcon->GetSize();
  3789. ASSERT( _sizeIcon.cx > 0 && _sizeIcon.cy > 0 );
  3790. }
  3791. CRect rcItemForIcon( rcItem );
  3792. if( bDrawIcon
  3793. && _sizeIcon.cx > 0
  3794. && _sizeIcon.cy > 0
  3795. )
  3796. {
  3797. // rcItemForIcon.DeflateRect(
  3798. // bHorz ? 0 : ( rcItem.Width() - _sizeIcon.cx),
  3799. // bHorz ? ( rcItem.Height() - _sizeIcon.cy) : 0
  3800. // );
  3801. rcItemForIcon.right = rcItemForIcon.left + _sizeIcon.cx;
  3802. rcItemForIcon.bottom = rcItemForIcon.top + _sizeIcon.cy;
  3803. rcItemForIcon.OffsetRect(
  3804. bHorz ? 0 : ((rcItem.Width() - _sizeIcon.cx) / 2),
  3805. bHorz ? ((rcItem.Height() - _sizeIcon.cy) / 2) : 0
  3806. );
  3807. if( rcItemForIcon.left < (rcItem.left+1) )
  3808. rcItemForIcon.left = (rcItem.left+1);
  3809. if( rcItemForIcon.right < (rcItem.right-1) )
  3810. rcItemForIcon.right = (rcItem.right-1);
  3811. if( rcItemForIcon.top < (rcItem.top+1) )
  3812. rcItemForIcon.top = (rcItem.top+1);
  3813. if( rcItemForIcon.bottom < (rcItem.bottom-1) )
  3814. rcItemForIcon.bottom = (rcItem.bottom-1);
  3815. }
  3816. CExtSafeString sItemText( (sText == NULL) ? _T("") : sText );
  3817. // IMPORTANT:  the rcText calculation fixed by Genka
  3818. CRect rcText(
  3819. rcItem.left // rcItemForIcon.left
  3820. + ( bHorz
  3821. ? (_sizeIcon.cx +
  3822. ((_sizeIcon.cx > 0) ? __EXTTAB_MARGIN_ICON2TEXT_X : 0)
  3823. )
  3824. : 0
  3825. ),
  3826. rcItem.top // rcItemForIcon.left
  3827. + ( bHorz
  3828. ? 0
  3829. : (_sizeIcon.cy +
  3830. ((_sizeIcon.cy > 0) ? __EXTTAB_MARGIN_ICON2TEXT_Y : 0)
  3831. )
  3832. ),
  3833. rcItem.right,
  3834. rcItem.bottom
  3835. );
  3836. if( !bHorz )
  3837. {
  3838. if( pIconTabItemCloseButton != NULL )
  3839. rcText.bottom = min( rcText.bottom, rcTabItemCloseButton.top );
  3840. int nWidth0 = rcText.Width();
  3841. int nWidth1 = rcItem.Width() + __EXTTAB_MARGIN_ICON2TEXT_X*2;
  3842. if( nWidth1 > nWidth0 )
  3843. {
  3844. if( bInvertedVerticalMode )
  3845. {
  3846. //rcText.right -= __EXTTAB_MARGIN_ICON2TEXT_X;
  3847. rcText.left = rcText.right - nWidth1;
  3848. } // if( bInvertedVerticalMode )
  3849. else
  3850. {
  3851. //rcText.left += __EXTTAB_MARGIN_ICON2TEXT_X;
  3852. rcText.right = rcText.left + nWidth1;
  3853. } // else from if( bInvertedVerticalMode )
  3854. } // if( nWidth1 > nWidth0 )
  3855. } // if( !bHorz )
  3856. else
  3857. {
  3858. if( pIconTabItemCloseButton != NULL )
  3859. rcText.right = min( rcText.right, rcTabItemCloseButton.left );
  3860. }
  3861. bool bDrawText = ( ( ! sItemText.IsEmpty() ) && rcText.Width() > 0 && rcText.Height() > 0 ) ? true : false;
  3862. INT nIconAlignment = __ALIGN_HORIZ_LEFT | __ALIGN_VERT_TOP;
  3863. if( (!bDrawText) && !( bGroupedMode && (!bInGroupActive) ) )
  3864. {
  3865. if( bCenteredText )
  3866. nIconAlignment = __ALIGN_HORIZ_CENTER|__ALIGN_VERT_CENTER;
  3867. else
  3868. rcItemForIcon.OffsetRect(
  3869. bHorz ? (rcItem.Width() - _sizeIcon.cx)/2 : 0,
  3870. bHorz ? 0 : (rcItem.Height() - _sizeIcon.cy)/2
  3871. );
  3872. }
  3873. if( bDrawIcon )
  3874. {
  3875. if( (bHorz && rcItemForIcon.Width() >= _sizeIcon.cx )
  3876. || (!bHorz && rcItemForIcon.Height() >= _sizeIcon.cy)
  3877. )
  3878. {
  3879. PaintIcon(
  3880. dc,
  3881. true,
  3882. pIcon,
  3883. rcItemForIcon,
  3884. false,
  3885. bEnabled,
  3886. false,
  3887. nIconAlignment
  3888. );
  3889. }
  3890. } // if( bDrawIcon )
  3891. if( bDrawText )
  3892. { // if we have sense to paint text on tab item
  3893. ASSERT( pFont != NULL );
  3894. ASSERT( pFont->GetSafeHandle() != NULL );
  3895. COLORREF clrOldText = dc.SetTextColor( clrText );
  3896. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  3897. CFont * pOldFont = dc.SelectObject( pFont );
  3898. if( !bHorz )
  3899. {
  3900. if( bCenteredText )
  3901. rcText.OffsetRect(
  3902. 0,
  3903. ( rcText.Height() - sizeTextMeasured.cx ) / 2
  3904. );
  3905. int nTextLength = sItemText.GetLength();
  3906. int nAmpIndex = bNoPrefix ? (-1) : int( sItemText.Find( _T('&') ) );
  3907. CExtSafeString sBtn;
  3908. if( nAmpIndex < 0 || bNoPrefix )
  3909. sBtn = sItemText;
  3910. else
  3911. sBtn =
  3912. sItemText.Left( nAmpIndex )
  3913. + sItemText.Right( nTextLength - ( nAmpIndex + 1 ) );
  3914. if( ! bNoPrefix )
  3915. {
  3916. static TCHAR stat_strDummyAmpSeq[] = _T("0101");
  3917. sBtn.Replace( _T("&&"), stat_strDummyAmpSeq );
  3918. sBtn.Remove( _T('&') );
  3919. sBtn.Replace( stat_strDummyAmpSeq, _T("&") );
  3920. }
  3921. LOGFONT lf;
  3922. ::memset(&lf,0,sizeof(LOGFONT));
  3923. pFont->GetLogFont(&lf);
  3924. int _cyHorzFont = abs(lf.lfHeight);
  3925. int _cyTextMargin =
  3926. (rcText.Width() - _cyHorzFont)  / 2
  3927. ;
  3928. CPoint
  3929. ptLineFrom(0,0),
  3930. ptLineTo(0,0);
  3931. if( nAmpIndex >= 0 && ( ! bNoPrefix ) )
  3932. {
  3933. ptLineFrom =
  3934. CPoint(
  3935. __ExtMfc_CXTEXTMARGIN
  3936. + _cyTextMargin,
  3937. __ExtMfc_CYTEXTMARGIN
  3938. + stat_CalcTextWidth(
  3939. dc,
  3940. *pFont,
  3941. sBtn.Left(nAmpIndex)
  3942. )
  3943. );
  3944. ptLineTo =
  3945. CPoint(
  3946. __ExtMfc_CXTEXTMARGIN
  3947. + _cyTextMargin,
  3948. __ExtMfc_CYTEXTMARGIN
  3949. + stat_CalcTextWidth(
  3950. dc,
  3951. *pFont,
  3952. sBtn.Left(nAmpIndex+1)
  3953. )
  3954. );
  3955. int nXOffsPlus =
  3956. rcText.Width()
  3957. - stat_CalcTextDimension(
  3958. dc,
  3959. *pFont,
  3960. sBtn
  3961. ).Height();
  3962. nXOffsPlus /= 2;
  3963. nXOffsPlus -= 4;
  3964. ptLineFrom.x += nXOffsPlus;
  3965. ptLineTo.x   += nXOffsPlus;
  3966. } // if( nAmpIndex >= 0 )
  3967. CRect rcString = 
  3968. CRect(
  3969. CPoint(
  3970. rcText.right - _cyTextMargin + __ExtMfc_CXTEXTMARGIN,
  3971. rcText.top + __ExtMfc_CYTEXTMARGIN
  3972. ),
  3973. rcText.Size() //m_sizeHorz
  3974. );
  3975. rcString.DeflateRect(2,2);
  3976. if( bInvertedVerticalMode )
  3977. {
  3978. rcString.OffsetRect( 0, -2 );
  3979. CSize ptFix( -rcString.Width() + 1, 0 );
  3980. ptLineFrom.x += sizeTextMeasured.cy - 2;
  3981. ptLineFrom.y = - ptLineFrom.y + sizeTextMeasured.cx - 4;
  3982. ptLineTo.x += sizeTextMeasured.cy - 2;
  3983. ptLineTo.y = - ptLineTo.y + sizeTextMeasured.cx - 4;
  3984. ptLineFrom += rcString.TopLeft() + ptFix;
  3985. ptLineTo += rcString.TopLeft() + ptFix;
  3986. rcString.OffsetRect(
  3987. - sizeTextMeasured.cy + 3,
  3988. sizeTextMeasured.cx - 3
  3989. );
  3990. }
  3991. else
  3992. {
  3993. rcString.OffsetRect( -2, 0 );
  3994. CSize ptFix( -rcString.Width() + 1, 0 );
  3995. ptLineFrom += rcString.TopLeft() + ptFix;
  3996. ptLineTo += rcString.TopLeft() + ptFix;
  3997. }
  3998. dc.DrawText(
  3999. sBtn,
  4000. sBtn.GetLength(),
  4001. rcString,
  4002. DT_SINGLELINE |DT_NOCLIP | ( bNoPrefix ? (DT_NOPREFIX) : 0 )
  4003. );
  4004. if( nAmpIndex >= 0 )
  4005. {
  4006. CPen pen(
  4007. PS_SOLID,
  4008. 0,
  4009. dc.GetTextColor()
  4010. );
  4011. CPen * pOldPen = dc.SelectObject( &pen );
  4012. dc.MoveTo( ptLineFrom );
  4013. dc.LineTo( ptLineTo );
  4014. dc.SelectObject( pOldPen );
  4015. } // if( nAmpIndex >= 0 )
  4016. } // if( !bHorz )
  4017. else
  4018. {
  4019. UINT nFormat =
  4020. DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS;
  4021. if( bCenteredText )
  4022. nFormat |= DT_CENTER;
  4023. else
  4024. nFormat |= DT_LEFT;
  4025. if( bNoPrefix )
  4026. nFormat |= DT_NOPREFIX;
  4027. dc.DrawText(
  4028. sItemText,
  4029. sItemText.GetLength(),
  4030. rcText,
  4031. nFormat
  4032. );
  4033. }
  4034. dc.SelectObject( pOldFont );
  4035. dc.SetBkMode( nOldBkMode );
  4036. dc.SetTextColor( clrOldText );
  4037. } // if we have sense to paint text on tab item
  4038. if( pIconTabItemCloseButton != NULL )
  4039. {
  4040. ASSERT( ! pIconTabItemCloseButton->IsEmpty() );
  4041. if( dc.RectVisible( &rcTabItemCloseButton ) )
  4042. {
  4043. CRect _rcTabItemCloseButton = rcTabItemCloseButton;
  4044. if( bHorz )
  4045. {
  4046. if( bTopLeft )
  4047. _rcTabItemCloseButton.OffsetRect( 0, 2 );
  4048. }
  4049. else
  4050. {
  4051. if( bTopLeft )
  4052. _rcTabItemCloseButton.OffsetRect( 2, 0 );
  4053. }
  4054. pIconTabItemCloseButton->Paint(
  4055. g_PaintManager.GetPM(),
  4056. dc.m_hDC,
  4057. _rcTabItemCloseButton,
  4058. ePaintStateITICB
  4059. );
  4060. }
  4061. } // if( pIconTabItemCloseButton != NULL )
  4062. }
  4063. bool CExtPaintManagerStudio2008::QueryTabWndHoverChangingRedraw(
  4064. const CExtTabWnd * pWndTab,
  4065. LPARAM lParam // = 0L
  4066. )
  4067. {
  4068. ASSERT_VALID( this );
  4069. ASSERT_VALID( pWndTab );
  4070. pWndTab;
  4071. lParam;
  4072. if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  4073. return false;
  4074. return true;
  4075. }
  4076. void CExtPaintManagerStudio2008::TabWnd_MeasureItemAreaMargins(
  4077. CExtTabWnd * pTabWnd,
  4078. LONG & nSpaceBefore,
  4079. LONG & nSpaceAfter,
  4080. LONG & nSpaceOver
  4081. )
  4082. {
  4083. ASSERT_VALID( this );
  4084. ASSERT( pTabWnd != NULL && ::IsWindow(pTabWnd->m_hWnd) );
  4085. ASSERT_VALID( pTabWnd );
  4086. nSpaceBefore = 0;
  4087. nSpaceAfter = 0;
  4088. nSpaceOver = 0;
  4089. bool bGroupedMode =
  4090. (pTabWnd->GetTabWndStyle() & __ETWS_GROUPED) ? true : false;
  4091. if( (! g_PaintManager.m_UxTheme.IsControlsThemed()) 
  4092. && (! bGroupedMode)
  4093. )
  4094. nSpaceOver = 2;
  4095. }
  4096. void CExtPaintManagerStudio2008::TabWnd_UpdateItemMeasure(
  4097. CExtTabWnd * pTabWnd,
  4098. CExtTabWnd::TAB_ITEM_INFO * pTii,
  4099. CDC & dcMeasure,
  4100. CSize & sizePreCalc
  4101. )
  4102. {
  4103. ASSERT_VALID( this );
  4104. ASSERT_VALID( pTii );
  4105. ASSERT( dcMeasure.GetSafeHdc() != NULL );
  4106. ASSERT( pTii->GetTabWnd() == pTabWnd );
  4107. pTii;
  4108. bool bGroupedMode =
  4109. (pTabWnd->GetTabWndStyle() & __ETWS_GROUPED) ? true : false;
  4110. if( bGroupedMode )
  4111. return;
  4112. CSize szPart( 18, 18 );
  4113.   if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  4114. szPart = CSize( 21, 21 );
  4115. if( g_PaintManager.m_UxTheme.OpenThemeData( NULL, VSCLASS_TAB ) != NULL )
  4116. {
  4117. VERIFY(
  4118. g_PaintManager.m_UxTheme.GetThemePartSize(
  4119. dcMeasure.GetSafeHdc(), 
  4120. TABP_TABITEM, 
  4121. TIS_NORMAL, 
  4122. NULL, 
  4123. CExtUxTheme::__EXT_UX_TS_TRUE,
  4124. &szPart
  4125. ) == S_OK
  4126. );
  4127. g_PaintManager.m_UxTheme.CloseThemeData();
  4128. }
  4129. INT nPartHeight = szPart.cy;
  4130. if( pTabWnd->OrientationIsHorizontal() )
  4131. {
  4132. sizePreCalc.cy = nPartHeight;
  4133. sizePreCalc.cx += 2*2;
  4134. }
  4135. else
  4136. {
  4137. sizePreCalc.cx = nPartHeight;
  4138. sizePreCalc.cy += 2*2;
  4139. }
  4140. }
  4141. bool CExtPaintManagerStudio2008::TabWnd_GetParentSizingMargin(
  4142. INT & nMargin,
  4143. DWORD dwOrientation,
  4144. CExtTabWnd * pTabWnd
  4145. ) const
  4146. {
  4147. ASSERT_VALID( this );
  4148. ASSERT_VALID( pTabWnd );
  4149. if( (! g_PaintManager.m_UxTheme.IsControlsThemed() )
  4150. || pTabWnd->_IsCustomLayoutTabWnd() 
  4151. )
  4152. return CExtPaintManager::TabWnd_GetParentSizingMargin( nMargin, dwOrientation, pTabWnd );
  4153. nMargin = 1;
  4154. return true;
  4155. }
  4156. #endif // (!defined __EXT_MFC_NO_TAB_CTRL)