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

界面编程

开发平台:

Visual C++

  1. sCaption
  2. );
  3. if( nAvailableWidth >= nWidth 
  4. || sCaption.IsEmpty()
  5. )
  6. break;
  7. sCaption.Delete( sCaption.GetLength() - 1 );
  8. if( sCaption.GetLength() > 0 )
  9. dc.DrawText(
  10. sCaption,
  11. sCaption.GetLength(),
  12. (LPRECT)&_pgd.m_rcText,
  13. nDtAlign|DT_SINGLELINE|DT_VCENTER|DT_NOCLIP
  14. );
  15. } // if( bFloatingFixedBar )
  16. else
  17. {
  18. dc.DrawText(
  19. _pgd.m_sCaption,
  20. nTextLen,
  21. (LPRECT)&_pgd.m_rcText,
  22. nDtAlign|DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS
  23. );
  24. } // else if( bFloatingFixedBar )
  25. } // if text is horizontal
  26. else
  27. { // if text is vertical
  28. LOGFONT lf;
  29. ::memset(&lf,0,sizeof(LOGFONT));
  30. pCurrFont->GetLogFont(&lf);
  31. int _cyHorzFont = abs(lf.lfHeight);
  32. int _cyTextMargin =
  33. (_pgd.m_rcText.Width() - _cyHorzFont)  / 2
  34. ;
  35. CRect rcString = 
  36. CRect(
  37. CPoint(
  38. _pgd.m_rcText.left + _cyTextMargin - -1,//__ExtMfc_CXTEXTMARGIN,
  39. _pgd.m_rcText.bottom - 0//__ExtMfc_CYTEXTMARGIN
  40. ),
  41. _pgd.m_rcText.Size() //m_sizeHorz
  42. );
  43. rcString.DeflateRect(2,2);
  44. CRect rcExclude;
  45. rcExclude.SetRect(
  46. _pgd.m_rcGripper.left,
  47. _pgd.m_rcGripper.top,
  48. _pgd.m_rcGripper.right,
  49. _pgd.m_rcText.top
  50. );
  51. dc.ExcludeClipRect( &rcExclude );
  52. rcString.OffsetRect( -2, -3 );
  53. dc.DrawText(
  54. _pgd.m_sCaption,
  55. nTextLen,
  56. rcString,
  57. DT_SINGLELINE //|DT_CENTER|DT_VCENTER
  58. |DT_NOCLIP |DT_NOPREFIX
  59. ); // don't forget DT_NOCLIP
  60. //dc.IntersectClipRect( &rectGripper );
  61. dc.SelectClipRgn(NULL);
  62. } // if text is vertical
  63. dc.SelectObject( pOldFont );
  64. dc.SetBkMode(nOldBkMode);
  65. dc.SetTextColor(clrOldText);
  66. } // if( ! CaptionTextColor.IsHollow() )
  67. }
  68. } // if( _pgd.m_bSideBar || _pgd.m_bFloating )
  69. else
  70. {
  71. CExtSkinGlyph * pGripperGlyph = NULL;
  72. _GetDockedToolBarGlyph(
  73. STATIC_DOWNCAST( CExtToolControlBar, _pgd.m_pHelperSrc ),
  74. &pGripperGlyph
  75. );
  76. ASSERT( pGripperGlyph != NULL );
  77. pGripperGlyph->Draw( dc.m_hDC, rectGripper2 );
  78. } // else from if( _pgd.m_bSideBar || _pgd.m_bFloating )
  79. }
  80. void CExtPaintManagerSkin::PaintDockingCaptionButton(
  81. CDC & dc,
  82. CExtPaintManager::PAINTDOCKINGCAPTIONBUTTONDATA & _pdcbd
  83. )
  84. {
  85. LPCTSTR strButtonType = _T("");
  86. switch( _pdcbd.m_eType )
  87. {
  88. case CExtPaintManager::__DCBT_CLOSE:
  89. strButtonType = _T("Close");
  90. break;
  91. case CExtPaintManager::__DCBT_ARROW_DOWN:
  92. strButtonType = _T("Options");
  93. break;
  94. case CExtPaintManager::__DCBT_WND_KEEP:
  95. strButtonType = _T("PinOn");
  96. break;
  97. case CExtPaintManager::__DCBT_WND_UNKEEP:
  98. strButtonType = _T("PinOff");
  99. break;
  100. default:
  101. CExtPaintManager::PaintDockingCaptionButton( dc, _pdcbd );
  102. return;
  103. }
  104. LPCTSTR strButtonState = _T("");
  105. if( !_pdcbd.m_bEnabled )
  106. strButtonState = _T("Disabled");
  107. else if( _pdcbd.m_bPushed )
  108. strButtonState = _T("Pressed");
  109. else if( _pdcbd.m_bHover )
  110. strButtonState = _T("Hover");
  111. else
  112. strButtonState = _T("Normal");
  113. LPCTSTR strBarActiveState =
  114. _pdcbd.m_bBarWndActive ? _T("Active") : _T("Inactive");
  115. CExtSkinGlyph & ButtonFrameGlyph = 
  116. m_Skin[_T("Caption")][_T("CaptionButton")]
  117. [strButtonState][strButtonType][strBarActiveState].Glyph( _T("Frame") );
  118. ButtonFrameGlyph.Draw( dc.m_hDC, _pdcbd.m_rcClient );
  119. CExtSkinGlyph & ButtonGlyph = 
  120. m_Skin[_T("Caption")][_T("CaptionButton")]
  121. [strButtonState][strButtonType][strBarActiveState].Glyph( strButtonType );
  122. ButtonGlyph.Draw( dc.m_hDC, _pdcbd.m_rcClient );
  123. }
  124. INT CExtPaintManagerSkin::GetSeparatorHeight()
  125. {
  126. ASSERT_VALID( this );
  127. CExtSkinGlyph & SeparatorGlyph = m_Skin[_T("MenuItem")][_T("Separator")].Glyph( _T("Separator") );
  128. return SeparatorGlyph.GetSize().cy;
  129. }
  130. CSize CExtPaintManagerSkin::GetResizingGriperSize(
  131. CObject * pHelperSrc,
  132. LPARAM lParam // = 0L
  133. ) const
  134. {
  135. ASSERT_VALID( this );
  136. pHelperSrc;
  137. lParam;
  138. return CSize( 18, 18 );
  139. }
  140. void CExtPaintManagerSkin::PaintResizingGripper(
  141. CDC & dc,
  142. const RECT & rcGrip,
  143. CObject * pHelperSrc,
  144. LPARAM lParam // = 0L
  145. )
  146. {
  147. ASSERT_VALID( this );
  148. ASSERT( dc.GetSafeHdc() != NULL );
  149. if( rcGrip.left > rcGrip.right
  150. || rcGrip.top > rcGrip.bottom
  151. || ( ! dc.RectVisible(&rcGrip) )
  152. )
  153. return;
  154. lParam;
  155. //COLORREF clrLineShadow = GetColor( COLOR_WINDOW, pHelperSrc, lParam );
  156. //COLORREF clrLineFace = GetColor( COLOR_3DSHADOW, pHelperSrc, lParam );
  157. //CPen penLineShadow(PS_SOLID, 1, clrLineShadow);
  158. //CPen penLineFace(PS_SOLID, 1, clrLineFace);
  159. //CPen * pOldPen = NULL;
  160. //
  161. //CPoint ptTop = CPoint( rcGrip.right, rcGrip.bottom - 3 );
  162. //CPoint ptBottom = CPoint( rcGrip.right - 2, rcGrip.bottom - 1 );
  163. //
  164. // for( int nLine = 0; nLine < 3; nLine++ )
  165. // {
  166. // pOldPen = dc.SelectObject( &penLineFace );
  167. // dc.MoveTo( ptBottom );
  168. // dc.LineTo( ptTop );
  169. // ptBottom.Offset( -1, 0 );
  170. // ptTop.Offset( 0, -1 );
  171. // dc.MoveTo( ptBottom );
  172. // dc.LineTo( ptTop );
  173. // dc.SelectObject( pOldPen );
  174. //
  175. // pOldPen = dc.SelectObject( &penLineShadow );
  176. // ptBottom.Offset( -1, 0 );
  177. // ptTop.Offset( 0, -1 );
  178. // dc.MoveTo( ptBottom );
  179. // dc.LineTo( ptTop );
  180. // dc.SelectObject( pOldPen );
  181. //
  182. // ptBottom.Offset( -2, 0 );
  183. // ptTop.Offset( 0, -2 );
  184. // }
  185. LPCTSTR strWindowType = _T("Generic");
  186. if( pHelperSrc != NULL )
  187. {
  188. ASSERT_VALID( pHelperSrc );
  189. #ifndef __EXT_MFC_NO_STATUSBAR
  190. if( pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtStatusControlBar)) )
  191. strWindowType = _T("StatusBar");
  192. else
  193. #endif // ifndef __EXT_MFC_NO_STATUSBAR
  194. if( pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtResizableDialog)) )
  195. strWindowType = _T("Dialog");
  196. } // if( pHelperSrc != NULL )
  197. CExtSkinGlyph & ResizingGripperGlyph = 
  198. m_Skin[_T("ResizingGripper")][strWindowType]
  199. .Glyph( _T("ResizingGripper") );
  200. ResizingGripperGlyph.Draw( dc.m_hDC, rcGrip );
  201. }
  202. #ifndef __EXT_MFC_NO_STATUSBAR
  203. bool CExtPaintManagerSkin::StatusBar_QuerySkinSupport(
  204. const CExtStatusControlBar * pStatusBar,
  205. LPARAM lParam // = 0
  206. ) const
  207. {
  208. ASSERT_VALID( this );
  209. ASSERT_VALID( pStatusBar );
  210. pStatusBar;
  211. lParam;
  212. return true;
  213. }
  214. bool CExtPaintManagerSkin::StatusBar_ErasePaneBackground(
  215. CDC & dc,
  216. int nPaneIdx,
  217. const RECT & rcPane,
  218. const CExtStatusControlBar * pStatusBar,
  219. LPARAM lParam // = 0
  220. ) const
  221. {
  222. ASSERT_VALID( this );
  223. ASSERT( dc.GetSafeHdc() != NULL );
  224. ASSERT_VALID( pStatusBar );
  225. dc;
  226. nPaneIdx;
  227. rcPane;
  228. pStatusBar;
  229. lParam;
  230. int iWidth = 0;
  231. UINT nIndex = 0, nPaneStyle = 0;
  232. pStatusBar->GetPaneInfo( nPaneIdx, nIndex, nPaneStyle, iWidth );
  233. bool bDisabled = ( ( nPaneStyle & SBPS_DISABLED ) != 0 ) ? true : false;
  234. LPCTSTR strPaneState = bDisabled ? _T("Disabled") : _T("Enabled");
  235. const CExtSkinGlyph & PaneGlyph = 
  236. m_Skin[_T("ImageCollection")][_T("ControlBar")][_T("StatusBar")][strPaneState].Glyph( _T("Pane") );
  237. CExtSkinGlyph * pPaneGlyph = const_cast<CExtSkinGlyph*>( &PaneGlyph );
  238. pPaneGlyph->Draw( dc.m_hDC, rcPane );
  239. return false;
  240. }
  241. bool CExtPaintManagerSkin::StatusBar_PaintPane(
  242. CDC & dc,
  243. int nPaneIdx,
  244. const RECT & rcPane,
  245. DWORD dwPaneStyle,
  246. HICON hIcon,
  247. __EXT_MFC_SAFE_LPCTSTR sPaneText,
  248. UINT nDrawTextFlags,
  249. COLORREF clrText,
  250. const CExtStatusControlBar * pStatusBar,
  251. LPARAM lParam // = 0
  252. ) const
  253. {
  254. ASSERT_VALID( this );
  255. ASSERT( dc.GetSafeHdc() != NULL );
  256. ASSERT_VALID( pStatusBar );
  257. nPaneIdx;
  258. clrText;
  259. pStatusBar;
  260. lParam;
  261. bool bDisabled = ( ( dwPaneStyle & SBPS_DISABLED ) != 0 ) ? true : false;
  262. LPCTSTR strPaneState = bDisabled ? _T("Disabled") : _T("Enabled");
  263. const CExtSkinGlyph & PaneGlyph = 
  264. m_Skin[_T("ImageCollection")][_T("ControlBar")][_T("StatusBar")][strPaneState].Glyph( _T("Pane") );
  265. CRect rectPane( rcPane );
  266. rectPane.DeflateRect(
  267. &PaneGlyph.GetContentPadding()
  268. );
  269. CRect rcText( rectPane );
  270. if( hIcon != NULL )
  271. {
  272. CExtCmdIcon _icon;
  273. _icon.AssignFromHICON( hIcon, true );
  274. CSize sizeIcon = _icon.GetSize();
  275. ASSERT( sizeIcon.cx > 0 && sizeIcon.cy > 0 );
  276. rcText.left += sizeIcon.cx + PaneGlyph.GetIconIndent();
  277. _icon.Paint(
  278. const_cast < CExtPaintManagerSkin * > ( this ),
  279. dc,
  280. rectPane.left,
  281. rectPane.top + ( rectPane.Height() - sizeIcon.cy ) / 2,
  282. -1,
  283. -1
  284. );
  285. } // if( hIcon != NULL )
  286. int nPaneTextLen =
  287. (sPaneText == NULL)
  288. ? int(0)
  289. : int(_tcslen(sPaneText))
  290. ;
  291. if( ( !bDisabled )
  292. ||  ( bDisabled && ( !pStatusBar->m_bHideTextOnDisabledPanes ) )
  293. && nPaneTextLen > 0
  294. )
  295. { // if text painting is allowed
  296. if( rcText.right > rcText.left )
  297. {
  298. const CExtSkinColor & PaneTextColor = 
  299. m_Skin[_T("ImageCollection")][_T("ControlBar")][_T("StatusBar")][strPaneState].Color( _T("Text") );
  300. if( ! PaneTextColor.IsHollow() )
  301. {
  302. COLORREF clrTextCustom = // RGB( 212, 220, 220 );
  303. PaneTextColor;
  304. COLORREF clrTextRestore = dc.SetTextColor( clrTextCustom );
  305. dc.DrawText(
  306. LPCTSTR(sPaneText),
  307. nPaneTextLen,
  308. &rcText,
  309. nDrawTextFlags
  310. );
  311. if( clrTextRestore != COLORREF(-1L) )
  312. dc.SetTextColor( clrTextRestore );
  313. } // if( ! PaneTextColor.IsHollow() )
  314. } // if( rcText.right > rcText.left )
  315. } // if text painting is allowed
  316. return true;
  317. }
  318. bool CExtPaintManagerSkin::StatusBar_PaintSeparator(
  319. CDC & dc,
  320. int nPaneIdxAfterSep,
  321. const RECT & rcPaneBefore,
  322. const RECT & rcPaneAfter,
  323. const CExtStatusControlBar * pStatusBar,
  324. LPARAM lParam // = 0
  325. ) const
  326. {
  327. ASSERT_VALID( this );
  328. ASSERT( dc.GetSafeHdc() != NULL );
  329. ASSERT_VALID( pStatusBar );
  330. nPaneIdxAfterSep;
  331. rcPaneBefore;
  332. rcPaneAfter;
  333. pStatusBar;
  334. lParam;
  335. int iWidth = 0;
  336. UINT nIndex = 0, nPaneStyle = 0;
  337. pStatusBar->GetPaneInfo( nPaneIdxAfterSep, nIndex, nPaneStyle, iWidth );
  338. bool bDisabled = ( ( nPaneStyle & SBPS_DISABLED ) != 0 ) ? true : false;
  339. LPCTSTR strPaneState = bDisabled ? _T("Disabled") : _T("Enabled");
  340. CRect rcSeparator(
  341. rcPaneBefore.right,
  342. rcPaneAfter.top,
  343. rcPaneAfter.left,
  344. rcPaneAfter.bottom
  345. );
  346. const CExtSkinGlyph & SeparatorGlyph = 
  347. m_Skin[_T("ImageCollection")][_T("ControlBar")][_T("StatusBar")][strPaneState].Glyph( _T("Separator") );
  348. CExtSkinGlyph * pGlyph = const_cast<CExtSkinGlyph*>( &SeparatorGlyph );
  349. CSize _sizeGlyph = pGlyph->GetSize();
  350. int nWidth = rcSeparator.Width();
  351. if( nWidth != _sizeGlyph.cx )
  352. {
  353. rcSeparator.left += ( nWidth - _sizeGlyph.cx ) / 2;
  354. rcSeparator.right = rcSeparator.left + _sizeGlyph.cx;
  355. }
  356. pGlyph->Draw( dc.m_hDC, rcSeparator );
  357. return true;
  358. }
  359. #endif // ifndef __EXT_MFC_NO_STATUSBAR
  360. void CExtPaintManagerSkin::PaintIcon(
  361. CDC & dc,
  362. bool bHorz,
  363. CExtCmdIcon * pIcon,
  364. const CRect & rcClient,
  365. bool bPushed,
  366. bool bEnabled,
  367. bool bHover, // = false
  368. INT nIconAlignment, // = 0
  369. bool bRTL, // = false
  370. CRect * prcIcon, // = NULL
  371. CRect * prcText, // = NULL
  372. CRect * prcIconMargins, // = NULL
  373. COLORREF clrCustomAccentEffectForIcon // = COLORREF(-1L)
  374. )
  375. {
  376. ASSERT_VALID( this );
  377. ASSERT( dc.GetSafeHdc() != NULL );
  378. bHorz;
  379. bHover;
  380. bRTL;
  381. if( pIcon == NULL || pIcon->IsEmpty() )
  382. {
  383. if( prcIcon != NULL )
  384. *prcIcon = CRect( 0, 0, 0, 0 );
  385. if( prcText != NULL )
  386. *prcText = rcClient;
  387. return;
  388. }
  389. CSize _sizeIcon = pIcon->GetSize();
  390. ASSERT( _sizeIcon.cx > 0 && _sizeIcon.cy > 0 );
  391. CRect rcIconMargins( 0, 0, 0, 0 );
  392. if( prcIconMargins != NULL )
  393. rcIconMargins = *prcIconMargins;
  394. CRect rcTextLocation( rcClient );
  395. CRect rcIconLocation( 0, 0, _sizeIcon.cx, _sizeIcon.cy );
  396. if( bHorz )
  397. {
  398. rcIconLocation.OffsetRect( 
  399. rcClient.left, 
  400. rcClient.top 
  401. );
  402. if( ( _sizeIcon.cx + rcIconMargins.left + rcIconMargins.right ) > rcClient.Width() )
  403. {
  404. nIconAlignment &= ~__ALIGN_HORIZ_MASK;
  405. nIconAlignment |= __ALIGN_HORIZ_CENTER;
  406. }
  407. if( ( _sizeIcon.cy + rcIconMargins.top + rcIconMargins.bottom ) > rcClient.Height() )
  408. {
  409. nIconAlignment &= ~__ALIGN_VERT_MASK;
  410. nIconAlignment |= __ALIGN_VERT_CENTER;
  411. }
  412. if( (nIconAlignment&__ALIGN_HORIZ_MASK) == __ALIGN_HORIZ_RIGHT )
  413. {
  414. rcIconLocation.OffsetRect( rcClient.right - rcIconLocation.right - rcIconMargins.right, 0 );
  415. rcTextLocation.right = rcIconLocation.left - rcIconMargins.left;
  416. }
  417. else if( (nIconAlignment&__ALIGN_HORIZ_MASK) == __ALIGN_HORIZ_CENTER )
  418. {
  419. rcIconLocation.OffsetRect( ( rcClient.right - rcIconLocation.right ) / 2 + rcIconMargins.left - rcIconMargins.right, 0 );
  420. }
  421. else if( (nIconAlignment&__ALIGN_HORIZ_MASK) == __ALIGN_HORIZ_LEFT )
  422. {
  423. rcIconLocation.OffsetRect( rcIconMargins.left, 0 );
  424. rcTextLocation.left = rcIconLocation.right + rcIconMargins.right;
  425. }
  426. if( (nIconAlignment&__ALIGN_VERT_MASK) == __ALIGN_VERT_TOP )
  427. {
  428. rcIconLocation.OffsetRect( 0, rcIconMargins.top );
  429. if( (nIconAlignment&__ALIGN_HORIZ_MASK) == __ALIGN_HORIZ_CENTER )
  430. rcTextLocation.top = rcIconLocation.bottom + rcIconMargins.bottom;
  431. }
  432. else if( (nIconAlignment&__ALIGN_VERT_MASK) == __ALIGN_VERT_CENTER )
  433. {
  434. rcIconLocation.OffsetRect( 0, ( rcClient.bottom - rcIconLocation.bottom ) / 2 + rcIconMargins.top - rcIconMargins.bottom );
  435. }
  436. else if( (nIconAlignment&__ALIGN_VERT_MASK) == __ALIGN_VERT_BOTTOM )
  437. {
  438. rcIconLocation.OffsetRect( 0, rcClient.bottom - rcIconLocation.bottom - rcIconMargins.bottom );
  439. if( (nIconAlignment&__ALIGN_HORIZ_MASK) == __ALIGN_HORIZ_CENTER )
  440. rcTextLocation.bottom = rcIconLocation.top - rcIconMargins.top;
  441. }
  442. }
  443. else
  444. {
  445. rcIconLocation.OffsetRect( 
  446. rcClient.right - rcIconLocation.Width(), 
  447. rcClient.top 
  448. );
  449. if( ( _sizeIcon.cy + rcIconMargins.top + rcIconMargins.bottom ) > rcClient.Height() )
  450. {
  451. nIconAlignment &= ~__ALIGN_HORIZ_MASK;
  452. nIconAlignment |= __ALIGN_HORIZ_CENTER;
  453. }
  454. if( ( _sizeIcon.cx + rcIconMargins.left + rcIconMargins.right ) > rcClient.Width() )
  455. {
  456. nIconAlignment &= ~__ALIGN_VERT_MASK;
  457. nIconAlignment |= __ALIGN_VERT_CENTER;
  458. }
  459. if( (nIconAlignment&__ALIGN_HORIZ_MASK) == __ALIGN_HORIZ_RIGHT )
  460. {
  461. rcIconLocation.OffsetRect( 0, rcClient.bottom - rcIconLocation.bottom - rcIconMargins.bottom );
  462. rcTextLocation.bottom = rcIconLocation.top - rcIconMargins.top;
  463. }
  464. else if( (nIconAlignment&__ALIGN_HORIZ_MASK) == __ALIGN_HORIZ_CENTER )
  465. {
  466. rcIconLocation.OffsetRect( 0, ( rcClient.bottom - rcIconLocation.bottom ) / 2 + rcIconMargins.top - rcIconMargins.bottom );
  467. }
  468. else if( (nIconAlignment&__ALIGN_HORIZ_MASK) == __ALIGN_HORIZ_LEFT )
  469. {
  470. rcIconLocation.OffsetRect( 0, rcIconMargins.top );
  471. rcTextLocation.top = rcIconLocation.bottom;
  472. }
  473. if( (nIconAlignment&__ALIGN_VERT_MASK) == __ALIGN_VERT_TOP )
  474. {
  475. rcIconLocation.OffsetRect( rcIconMargins.right, 0 );
  476. if( (nIconAlignment&__ALIGN_HORIZ_MASK) == __ALIGN_HORIZ_CENTER )
  477. rcTextLocation.right = rcIconLocation.left;
  478. }
  479. else if( (nIconAlignment&__ALIGN_VERT_MASK) == __ALIGN_VERT_CENTER )
  480. {
  481. rcIconLocation.OffsetRect( ( rcClient.left - rcIconLocation.left ) / 2 + rcIconMargins.right - rcIconMargins.left, 0 );
  482. }
  483. else if( (nIconAlignment&__ALIGN_VERT_MASK) == __ALIGN_VERT_BOTTOM )
  484. {
  485. rcIconLocation.OffsetRect( rcClient.left - rcIconLocation.left - rcIconMargins.left, 0 );
  486. if( (nIconAlignment&__ALIGN_HORIZ_MASK) == __ALIGN_HORIZ_CENTER )
  487. rcTextLocation.left = rcIconLocation.right;
  488. }
  489. }
  490. if( (nIconAlignment&__ALIGN_HORIZ_MASK) == __ALIGN_HORIZ_CENTER 
  491. && (nIconAlignment&__ALIGN_VERT_MASK) == __ALIGN_VERT_CENTER
  492. )
  493. rcTextLocation.SetRectEmpty();
  494. if( rcTextLocation.top >= rcTextLocation.bottom
  495. || rcTextLocation.left >= rcTextLocation.right
  496. )
  497. rcTextLocation.SetRectEmpty();
  498.     
  499. // if button is pressed then press the icon also
  500. if( bPushed )
  501. {
  502. CSize sizePushedOffset = GetPushedOffset();
  503. rcIconLocation.OffsetRect( sizePushedOffset.cx, sizePushedOffset.cy );
  504. }
  505. if( ( ! bEnabled )
  506. && clrCustomAccentEffectForIcon != COLORREF(-1L)
  507. )
  508. {
  509. pIcon->PaintAccentColorized(
  510. this,
  511. dc.GetSafeHdc(),
  512. clrCustomAccentEffectForIcon,
  513. rcIconLocation.left,
  514. rcIconLocation.top
  515. );
  516. }
  517. else
  518. {
  519. pIcon->Paint(
  520. this,
  521. dc.GetSafeHdc(),
  522. rcIconLocation.left,
  523. rcIconLocation.top,
  524. -1,
  525. -1,
  526. (! bEnabled )
  527. ? CExtCmdIcon::__PAINT_DISABLED
  528. : bPushed
  529. ? CExtCmdIcon::__PAINT_PRESSED
  530. : bHover
  531. ? CExtCmdIcon::__PAINT_HOVER
  532. : CExtCmdIcon::__PAINT_NORMAL
  533. );
  534. }
  535. if( prcIcon != NULL )
  536. *prcIcon = rcIconLocation;
  537. if( prcText != NULL )
  538. *prcText = rcTextLocation;
  539. }
  540. #if (!defined __EXT_MFC_NO_TAB_CTRL)
  541. bool CExtPaintManagerSkin::QueryTabWndHoverChangingRedraw(
  542. const CExtTabWnd * pWndTab,
  543. LPARAM lParam // = 0L
  544. )
  545. {
  546. ASSERT_VALID( this );
  547. ASSERT_VALID( pWndTab );
  548. pWndTab;
  549. lParam;
  550. return true;
  551. }
  552. void CExtPaintManagerSkin::PaintTabbedTabClientArea(
  553. CDC & dc,
  554. CRect & rcClient,
  555. CRect & rcTabItemsArea,
  556. CRect & rcTabNearBorderArea,
  557. DWORD dwOrientation,
  558. bool bGroupedMode,
  559. CObject * pHelperSrc,
  560. LPARAM lParam // = 0L
  561. )
  562. {
  563. ASSERT_VALID( this);
  564. ASSERT( dc.GetSafeHdc() != NULL );
  565. if( pHelperSrc == NULL
  566. || (! pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtTabWnd ) ) )
  567. )
  568. CExtPaintManager::PaintTabbedTabClientArea(
  569. dc,
  570. rcClient,
  571. rcTabItemsArea,
  572. rcTabNearBorderArea,
  573. dwOrientation,
  574. bGroupedMode,
  575. pHelperSrc,
  576. lParam
  577. );
  578. PaintTabClientArea(
  579. dc,
  580. rcClient,
  581. rcTabItemsArea,
  582. rcTabNearBorderArea,
  583. dwOrientation,
  584. bGroupedMode,
  585. pHelperSrc,
  586. lParam
  587. );
  588. }
  589. __EXT_MFC_SAFE_LPCTSTR CExtPaintManagerSkin::GetSkinnedTabControlType(
  590. const CExtTabWnd * pWndTab
  591. )
  592. {
  593. ASSERT_VALID( this );
  594. if( pWndTab == NULL )
  595. return _T("Control");
  596. ASSERT_VALID( pWndTab );
  597. if( pWndTab->IsKindOf( RUNTIME_CLASS( CExtDynAutoHideArea ) ) )
  598. return _T("AutoHideArea");
  599. if( pWndTab->IsKindOf( RUNTIME_CLASS( CExtDynTabWnd ) ) )
  600. return _T("ResizableBarGroup");
  601. if( pWndTab->_IsMdiTabCtrl() )
  602. return _T("MDI");
  603. if( pWndTab->GetSafeHwnd() == NULL )
  604. return _T("Control");
  605. CWnd * pWndParent = pWndTab->GetParent();
  606. if( pWndParent != NULL
  607. && pWndParent->IsKindOf( RUNTIME_CLASS( CExtTabPageContainerWnd ) )
  608. )
  609. return _T("PageContainer");
  610. return _T("Control");
  611. }
  612. __EXT_MFC_SAFE_LPCTSTR CExtPaintManagerSkin::GetSkinnedTabControlOrientation(
  613. const CExtTabWnd * pWndTab
  614. )
  615. {
  616. ASSERT_VALID( this );
  617. if( pWndTab == NULL )
  618. return _T("Top");
  619. ASSERT_VALID( pWndTab );
  620. DWORD dwOrientation = pWndTab->OrientationGet();
  621. if( dwOrientation == __ETWS_ORIENT_BOTTOM )
  622. return _T("Bottom");
  623. if( dwOrientation == __ETWS_ORIENT_LEFT )
  624. return _T("Left");
  625. if( dwOrientation == __ETWS_ORIENT_RIGHT )
  626. return _T("Right");
  627. return _T("Top");
  628. }
  629. void CExtPaintManagerSkin::PaintTabClientArea(
  630. CDC & dc,
  631. CRect & rcClient,
  632. CRect & rcTabItemsArea,
  633. CRect & rcTabNearBorderArea,
  634. DWORD dwOrientation,
  635. bool bGroupedMode,
  636. CObject * pHelperSrc,
  637. LPARAM lParam // = 0L
  638. )
  639. {
  640. ASSERT_VALID( this);
  641. ASSERT( dc.GetSafeHdc() != NULL );
  642. if( pHelperSrc == NULL
  643. || (! pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtTabWnd ) ) )
  644. || (! PaintDockerBkgnd( true, dc, (CExtTabWnd*)pHelperSrc, lParam ) )
  645. )
  646. {
  647. CExtPaintManager::PaintTabClientArea(
  648. dc,
  649. rcClient,
  650. rcTabItemsArea,
  651. rcTabNearBorderArea,
  652. dwOrientation,
  653. bGroupedMode,
  654. pHelperSrc,
  655. lParam
  656. );
  657. return;
  658. }
  659. CWnd * pGen = STATIC_DOWNCAST( CWnd, pHelperSrc );
  660. CExtTabWnd * pExtTabWnd = DYNAMIC_DOWNCAST( CExtTabWnd, pGen );
  661. LPCTSTR strSkinnedTabControlType = GetSkinnedTabControlType( pExtTabWnd );
  662. LPCTSTR strSkinnedTabControlOrientation = GetSkinnedTabControlOrientation( pExtTabWnd );
  663. CExtSkinGlyph & tabAreaEntire = 
  664. m_Skin[_T("Background")][_T("Tab")][_T("EntireArea")]
  665. [strSkinnedTabControlOrientation][strSkinnedTabControlType]
  666. .Glyph( _T("Area") );
  667. tabAreaEntire.Draw( dc.m_hDC, rcClient );
  668. CExtSkinGlyph & tabAreaItems = 
  669. m_Skin[_T("Background")][_T("Tab")][_T("ItemsArea")]
  670. [strSkinnedTabControlOrientation][strSkinnedTabControlType]
  671. .Glyph( _T("Area") );
  672. tabAreaItems.Draw( dc.m_hDC, rcTabItemsArea );
  673. CExtSkinGlyph & tabAreaNearBorder = 
  674. m_Skin[_T("Background")][_T("Tab")][_T("NearBorder")]
  675. [strSkinnedTabControlOrientation][strSkinnedTabControlType]
  676. .Glyph( _T("Area") );
  677. CRect rcTabNearBorderArea2 = rcTabNearBorderArea;
  678. CRect rcOffset = tabAreaNearBorder.GetOffset();
  679. rcTabNearBorderArea2.OffsetRect( rcOffset.left, rcOffset.top );
  680. tabAreaNearBorder.Draw( dc.m_hDC, rcTabNearBorderArea2 );
  681. }
  682. void CExtPaintManagerSkin::PaintTabItem(
  683. CDC & dc,
  684. CRect & rcTabItemsArea,
  685. bool bTopLeft,
  686. bool bHorz,
  687. bool bSelected,
  688. bool bCenteredText,
  689. bool bGroupedMode,
  690. bool bInGroupActive,
  691. bool bInvertedVerticalMode,
  692. const CRect & rcEntireItem,
  693. CSize sizeTextMeasured,
  694. CFont * pFont,
  695. __EXT_MFC_SAFE_LPCTSTR sText,
  696. CExtCmdIcon * pIcon,
  697. CObject * pHelperSrc,
  698. LPARAM lParam, // = 0L
  699. COLORREF clrForceText, // = COLORREF(-1L)
  700. COLORREF clrForceTabBk, // = COLORREF(-1L)
  701. COLORREF clrForceTabBorderLT, // = COLORREF(-1L)
  702. COLORREF clrForceTabBorderRB, // = COLORREF(-1L)
  703. COLORREF clrForceTabSeparator, // = COLORREF(-1L)
  704. bool bDwmMode // = false
  705. )
  706. {
  707. ASSERT_VALID( this );
  708. ASSERT( dc.GetSafeHdc() != NULL );
  709. bDwmMode;
  710. if( pHelperSrc == NULL
  711. // || ( (! pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtTabWnd ) ) )
  712. // && (! pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtBarButton ) ) )
  713. // )
  714. || IsHighContrast()
  715. )
  716. {
  717. CExtPaintManager::PaintTabItem(
  718. dc,
  719. rcTabItemsArea,
  720. bTopLeft,
  721. bHorz,
  722. bSelected,
  723. bCenteredText,
  724. bGroupedMode,
  725. bInGroupActive,
  726. bInvertedVerticalMode,
  727. rcEntireItem,
  728. sizeTextMeasured,
  729. pFont,
  730. sText,
  731. pIcon,
  732. pHelperSrc,
  733. lParam, // = 0L
  734. clrForceText, // = COLORREF(-1L)
  735. clrForceTabBk, // = COLORREF(-1L)
  736. clrForceTabBorderLT, // = COLORREF(-1L)
  737. clrForceTabBorderRB, // = COLORREF(-1L)
  738. clrForceTabSeparator // = COLORREF(-1L)
  739. );
  740. return;
  741. }
  742. LPCTSTR _sText = LPCTSTR(sText);
  743. CExtTabWnd * pWndTab = DYNAMIC_DOWNCAST( CExtTabWnd, pHelperSrc );
  744. CExtBarButton * pTBB = DYNAMIC_DOWNCAST( CExtBarButton, pHelperSrc );
  745. bool bDrawIcon =
  746. ( pWndTab != NULL
  747. && pIcon != NULL 
  748. && (! pIcon->IsEmpty() ) 
  749. && (pWndTab->GetTabWndStyle()&__ETWS_HIDE_ICONS) == 0 
  750. )
  751. ? true : false;
  752. LPCTSTR strGroupped = _T("Simple"); // bGroupedMode ? _T("Groupped") : _T("Simple");
  753. if( bGroupedMode )
  754. bSelected = false;
  755. LPCTSTR strItemType = _T("Disabled");
  756. bool bHover = false, bEnabled = false;
  757. CExtTabWnd::TAB_ITEM_INFO * pTII = NULL;
  758. bool bNoPrefix = false;
  759. if( pWndTab != NULL )
  760. {
  761. ASSERT_VALID( pWndTab );
  762. pTII = pWndTab->ItemGet( LONG( lParam ) );
  763. ASSERT( pTII != NULL );
  764. ASSERT_VALID( pTII );
  765. if( pTII->EnabledGet() )
  766. {
  767. bEnabled = true;
  768. strItemType = bSelected ? _T("Selected") : _T("Default");
  769. bHover = ( pWndTab->GetHoverTrackingItem() == lParam ) ? true : false;
  770. }
  771. bNoPrefix = ( ( pWndTab->GetTabWndStyleEx() & __ETWS_EX_NO_PREFIX ) != 0 ) ? true : false;
  772. }
  773. else if( pTBB != NULL )
  774. {
  775. if( pTBB->IsEnabled() )
  776. {
  777. bEnabled = true;
  778. strItemType = bSelected ? _T("Selected") : _T("Default");
  779. bHover = pTBB->IsHover();
  780. }
  781. }
  782. LPCTSTR strHover = bHover ? _T("Hover") : _T("Normal");
  783. LPCTSTR strSkinnedTabControlType = GetSkinnedTabControlType( pWndTab );
  784. LPCTSTR strSkinnedTabControlOrientation = GetSkinnedTabControlOrientation( pWndTab );
  785. CExtSkinGlyph & tabItem = 
  786. m_Skin[_T("TabItem")][strGroupped][strItemType][strHover]
  787. [strSkinnedTabControlOrientation][strSkinnedTabControlType]
  788. .Glyph( _T("Area") );
  789. CExtSkinColor & tabText = 
  790. m_Skin[_T("TabItem")][strGroupped][strItemType][strHover]
  791. [strSkinnedTabControlOrientation][strSkinnedTabControlType]
  792. .Color( _T("Text") );
  793. COLORREF clrText = RGB(0,0,0);
  794. if( tabText.IsHollow() )
  795. _sText = _T("");
  796. else
  797. clrText = tabText;
  798. CRect rcEntireItemA = rcEntireItem;
  799. rcEntireItemA.top += tabItem.GetOffset().top;
  800. rcEntireItemA.bottom += tabItem.GetOffset().bottom;
  801. rcEntireItemA.left += tabItem.GetOffset().left;
  802. rcEntireItemA.right += tabItem.GetOffset().right;
  803. #if (!defined __EXT_MFC_NO_DYNAMIC_BAR_SITE)
  804. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  805. bool bDetectedDynTPC = false;
  806. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  807. if( pTII != NULL )
  808. {
  809. CObject * pObject = pTII->EventProviderGet();
  810. if( pObject != NULL )
  811. {
  812. CExtDynamicControlBar * pBar = DYNAMIC_DOWNCAST( CExtDynamicControlBar, pObject );
  813. if( pBar != NULL )
  814. {
  815. bool bFlashCaptionHighlightedState = false;
  816. if( pBar->FlashCaptionIsInProgress( &bFlashCaptionHighlightedState ) )
  817. {
  818. if( bFlashCaptionHighlightedState )
  819. {
  820. clrForceText = pBar->m_clrFlashCaptionText;
  821. clrForceTabBk = pBar->m_clrFlashCaptionBackground;
  822. bSelected = true;
  823. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  824. bDetectedDynTPC = true;
  825. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  826. }
  827. }
  828. }
  829. }
  830. }
  831. #endif// (!defined __EXT_MFC_NO_DYNAMIC_BAR_SITE)
  832. COLORREF clrColorizeTabShape = COLORREF(-1L);
  833. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  834. if( pHelperSrc != NULL
  835. && clrForceTabBk != COLORREF(-1L)
  836. && ( bDetectedDynTPC
  837. || pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDynTabWnd ) )
  838. || pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDynAutoHideArea ) )
  839. )
  840. )
  841. {
  842. if( clrForceText != COLORREF(-1L) )
  843. clrText = clrForceText;
  844. clrColorizeTabShape = clrForceTabBk;
  845. }
  846. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  847. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  848. if( pHelperSrc != NULL
  849. && clrForceTabBk != COLORREF(-1L)
  850. && pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtTabWnd ) )
  851. && ((CExtTabWnd*)pHelperSrc)->_IsMdiTabCtrl()
  852. )
  853. {
  854. if( clrForceText != COLORREF(-1L) )
  855. clrText = clrForceText;
  856. clrColorizeTabShape = clrForceTabBk;
  857. }
  858. #endif // (!defined __EXT_MFC_NO_TABMDI_CTRL)
  859. tabItem.Draw( dc.m_hDC, rcEntireItemA, false, BYTE(0xFF), clrColorizeTabShape );
  860. CRect rcEntireItemB = rcEntireItem;
  861. CRect rcDeflate = tabItem.GetContentPadding();
  862. if( bHorz )
  863. rcEntireItemB.OffsetRect( rcDeflate.left, 0 );
  864. else
  865. rcEntireItemB.OffsetRect( 0, rcDeflate.top );
  866. CExtCmdIcon * pIconTabItemCloseButton = NULL;
  867. CExtTabWnd * pTabWnd = DYNAMIC_DOWNCAST( CExtTabWnd, pHelperSrc );
  868. CRect rcTabItemCloseButton( 0, 0, 0, 0 );
  869. CExtCmdIcon::e_paint_type_t ePaintStateITICB = CExtCmdIcon::__PAINT_NORMAL;
  870. if( pTabWnd != NULL && ::IsWindow(pTabWnd->m_hWnd) )
  871. {
  872. ASSERT_VALID( pTabWnd );
  873. CExtTabWnd::TAB_ITEM_INFO * pTii = pTabWnd->ItemGet( LONG( lParam ) );
  874. ASSERT( pTii != NULL );
  875. ASSERT_VALID( pTii );
  876. pIconTabItemCloseButton =
  877. pTabWnd->OnTabWndQueryItemCloseButtonShape( pTii );
  878. ePaintStateITICB =
  879. (CExtCmdIcon::e_paint_type_t)
  880. pTabWnd->OnTabWndQueryItemCloseButtonPaintState( pTii );
  881. if( pIconTabItemCloseButton != NULL )
  882. rcTabItemCloseButton = pTii->CloseButtonRectGet();
  883. }
  884. CExtPaintManager::stat_PaintTabItemImpl(
  885. dc,
  886. rcTabItemsArea,
  887. bTopLeft,
  888. bHorz,
  889. bSelected,
  890. bEnabled,
  891. bCenteredText,
  892. bGroupedMode,
  893. bInGroupActive,
  894. bInvertedVerticalMode,
  895. bDrawIcon,
  896. rcEntireItemB, //rcEntireItem,
  897. sizeTextMeasured,
  898. pFont,
  899. _sText,
  900. bNoPrefix,
  901. pIcon,
  902. pIconTabItemCloseButton,
  903. INT(ePaintStateITICB),
  904. rcTabItemCloseButton,
  905. clrText,
  906. COLORREF(-1L), // clrTabBk,
  907. COLORREF(-1L), // clrTabBorderLT,
  908. COLORREF(-1L), // clrTabBorderRB,
  909. COLORREF(-1L), // clrTabSeparator
  910. true,
  911. pHelperSrc
  912. );
  913. }
  914. void CExtPaintManagerSkin::PaintTabButton(
  915. CDC & dc,
  916. CRect & rcButton,
  917. LONG nHitTest,
  918. bool bTopLeft,
  919. bool bHorz,
  920. bool bEnabled,
  921. bool bHover,
  922. bool bPushed,
  923. bool bGroupedMode,
  924. CObject * pHelperSrc,
  925. LPARAM lParam, // = 0L
  926. bool bFlat // = false
  927. )
  928. {
  929. ASSERT_VALID( this );
  930. ASSERT( dc.GetSafeHdc() != NULL );
  931. bTopLeft;
  932. bHorz;
  933. lParam;
  934. if( pHelperSrc == NULL
  935. || (! pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtTabWnd ) ) )
  936. )
  937. {
  938. CExtPaintManager::PaintTabButton(
  939. dc,
  940. rcButton,
  941. nHitTest,
  942. bTopLeft,
  943. bHorz,
  944. bEnabled,
  945. bHover,
  946. bPushed,
  947. bGroupedMode,
  948. pHelperSrc,
  949. lParam,
  950. bFlat
  951. );
  952. return;
  953. }
  954. LPCTSTR strButtonType = _T("Close");
  955. switch( nHitTest )
  956. {
  957. case __ETWH_BUTTON_LEFTUP:
  958. strButtonType = _T("Up");
  959. break;
  960. case __ETWH_BUTTON_RIGHTDOWN:
  961. strButtonType = _T("Down");
  962. break;
  963. case __ETWH_BUTTON_HELP:
  964. strButtonType = _T("Help");
  965. break;
  966. case __ETWH_BUTTON_CLOSE:
  967. strButtonType = _T("Close");
  968. break;
  969. case __ETWH_BUTTON_TAB_LIST:
  970. strButtonType = _T("TabList");
  971. break;
  972. case __ETWH_BUTTON_SCROLL_HOME:
  973. strButtonType = _T("Home");
  974. break;
  975. case __ETWH_BUTTON_SCROLL_END:
  976. strButtonType = _T("End");
  977. break;
  978. default:
  979. CExtPaintManager::PaintTabButton(
  980. dc,
  981. rcButton,
  982. nHitTest,
  983. bTopLeft,
  984. bHorz,
  985. bEnabled,
  986. bHover,
  987. bPushed,
  988. bGroupedMode,
  989. pHelperSrc,
  990. lParam,
  991. bFlat
  992. );
  993. return;
  994. } // switch( nHitTest )
  995. CExtTabWnd * pWndTab = STATIC_DOWNCAST( CExtTabWnd, pHelperSrc );
  996. LPCTSTR strGroupped = _T("Simple"); // bGroupedMode ? _T("Groupped") : _T("Simple");
  997. LPCTSTR strState =
  998. bEnabled
  999. ? ( bPushed
  1000. ? _T("Pressed")
  1001. : bHover ? _T("Hover") : _T("Normal")
  1002. )
  1003. : _T("Disabled")
  1004. ;
  1005. //LPCTSTR strSkinnedTabControlType = GetSkinnedTabControlType( pWndTab );
  1006. LPCTSTR strSkinnedTabControlOrientation = GetSkinnedTabControlOrientation( pWndTab );
  1007. CExtSkinGlyph & tabItem = 
  1008. m_Skin[_T("TabButton")][strGroupped][strButtonType][strState]
  1009. [strSkinnedTabControlOrientation] //[strSkinnedTabControlType]
  1010. .Glyph( _T("Area") );
  1011. tabItem.Draw( dc.m_hDC, rcButton );
  1012. }
  1013. void CExtPaintManagerSkin::PaintTabNcAreaRect(
  1014. CDC & dc,
  1015. const RECT & rc,
  1016. CObject * pHelperSrc,
  1017. LPARAM lParam // = 0L
  1018. )
  1019. {
  1020. ASSERT_VALID( this );
  1021. ASSERT( dc.GetSafeHdc() != NULL );
  1022. if( pHelperSrc == NULL
  1023. || (! pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtTabWnd ) ) )
  1024. )
  1025. {
  1026. CExtPaintManager::PaintTabNcAreaRect(
  1027. dc,
  1028. rc,
  1029. pHelperSrc,
  1030. lParam
  1031. );
  1032. return;
  1033. }
  1034. PaintDockerBkgnd( false, dc, (CWnd*)pHelperSrc, lParam );
  1035. }
  1036. void CExtPaintManagerSkin::TabWnd_MeasureItemAreaMargins(
  1037. CExtTabWnd * pTabWnd,
  1038. LONG & nSpaceBefore,
  1039. LONG & nSpaceAfter,
  1040. LONG & nSpaceOver
  1041. )
  1042. {
  1043. ASSERT_VALID( this );
  1044. ASSERT( pTabWnd != NULL && ::IsWindow(pTabWnd->m_hWnd) );
  1045. ASSERT_VALID( pTabWnd );
  1046. CExtPaintManager::TabWnd_MeasureItemAreaMargins(
  1047. pTabWnd,
  1048. nSpaceBefore,
  1049. nSpaceAfter,
  1050. nSpaceOver
  1051. );
  1052. }
  1053. void CExtPaintManagerSkin::TabWnd_UpdateItemMeasure(
  1054. CExtTabWnd * pTabWnd,
  1055. CExtTabWnd::TAB_ITEM_INFO * pTii,
  1056. CDC & dcMeasure,
  1057. CSize & sizePreCalc
  1058. )
  1059. {
  1060. ASSERT_VALID( this );
  1061. ASSERT_VALID( pTii );
  1062. ASSERT( dcMeasure.GetSafeHdc() != NULL );
  1063. ASSERT( pTii->GetTabWnd() == pTabWnd );
  1064. CExtPaintManager::TabWnd_UpdateItemMeasure(
  1065. pTabWnd,
  1066. pTii,
  1067. dcMeasure,
  1068. sizePreCalc
  1069. );
  1070. }
  1071. void CExtPaintManagerSkin::GetThemeAccentTabColors(
  1072. COLORREF * pClrSetectedTabItemText,
  1073. COLORREF * pClrSetectedTabItemFace, // = NULL
  1074. COLORREF * pClrSetectedTabItemBorderLight, // = NULL
  1075. COLORREF * pClrSetectedTabItemBorderDark, // = NULL
  1076. CObject * pHelperSrc, // = NULL
  1077. LPARAM lParam // = 0L
  1078. )
  1079. {
  1080. ASSERT_VALID( this );
  1081. CExtPaintManager::GetThemeAccentTabColors(
  1082. pClrSetectedTabItemText,
  1083. pClrSetectedTabItemFace,
  1084. pClrSetectedTabItemBorderLight,
  1085. pClrSetectedTabItemBorderDark,
  1086. pHelperSrc,
  1087. lParam
  1088. );
  1089. }
  1090. #endif // (!defined __EXT_MFC_NO_TAB_CTRL)
  1091. void CExtPaintManagerSkin::PaintSeparator(
  1092. CDC & dc,
  1093. const RECT & rectItem,
  1094. bool bHorz,
  1095. bool bTransparentBk,
  1096. CObject * pHelperSrc,
  1097. LPARAM lParam // = 0L
  1098. )
  1099. {
  1100. ASSERT_VALID( this );
  1101. ASSERT( dc.GetSafeHdc() != NULL );
  1102. CExtToolControlBar * pToolBar = DYNAMIC_DOWNCAST( CExtToolControlBar, pHelperSrc );
  1103. if( pToolBar == NULL )
  1104. {
  1105. CExtPaintManager::PaintSeparator(  
  1106. dc, 
  1107. rectItem, 
  1108. bHorz, 
  1109. bTransparentBk, 
  1110. pHelperSrc, 
  1111. lParam
  1112. );
  1113. return;
  1114. }
  1115. LPCTSTR strBarType = _T("ToolBar");
  1116. if( pToolBar->IsKindOf( RUNTIME_CLASS( CExtMenuControlBar ) ) )
  1117. strBarType = _T("MenuBar");
  1118. LPCTSTR strSeparatorType = bHorz ? _T("SeparatorV") : _T("SeparatorH");
  1119. CExtSkinGlyph & SeparatorGlyph = 
  1120. m_Skin[_T("ImageCollection")][_T("ControlBar")][strBarType].Glyph( strSeparatorType );
  1121. CSize _size = SeparatorGlyph.GetSize();
  1122. if( _size.cx == 0 || _size.cy == 0 )
  1123. return;
  1124. CRect rectItemA = rectItem;
  1125. if( bHorz )
  1126. {
  1127. rectItemA.left += ( rectItemA.Width() - _size.cx ) / 2;
  1128. rectItemA.right = rectItemA.left + _size.cx;
  1129. }
  1130. else
  1131. {
  1132. rectItemA.top += ( rectItemA.Height() - _size.cy ) / 2;
  1133. rectItemA.bottom = rectItemA.top + _size.cy;
  1134. }
  1135. SeparatorGlyph.Draw( dc.m_hDC, rectItemA );
  1136. }
  1137. COLORREF CExtPaintManagerSkin::GetIconAlphaColor() const
  1138. {
  1139. ASSERT_VALID( this );
  1140. COLORREF clrIconAlpha = m_Skin[ _T("General") ].Color( _T("IconAlphaColor") );
  1141. return clrIconAlpha;
  1142. }
  1143. double CExtPaintManagerSkin::GetIconAlphaAdjustPercent() const
  1144. {
  1145. ASSERT_VALID( this );
  1146. // return 0.70; // 70% enlighten
  1147. return -0.50;
  1148. }
  1149. bool CExtPaintManagerSkin::AdjustIcon( 
  1150. CExtCmdIcon * pIcon
  1151. )
  1152. {
  1153. ASSERT_VALID( this );
  1154. if( pIcon == NULL )
  1155. return false;
  1156. if( (pIcon->m_dwFlags&__EXT_ICON_PERSISTENT_BITMAP_DISABLED) == 0 )
  1157. {
  1158. pIcon->m_bmpDisabled.Empty();
  1159. pIcon->m_bmpDisabled = pIcon->m_bmpNormal;
  1160. pIcon->m_bmpDisabled.Make32();
  1161. COLORREF clrAlpha = GetIconAlphaColor();
  1162. if( clrAlpha == COLORREF(-1L) )
  1163. {
  1164. pIcon->m_bmpDisabled.MakeMono( GetColor( COLOR_3DFACE ) );
  1165. pIcon->m_bmpDisabled.AdjustAlpha( -0.70 ); // -0.50
  1166. }
  1167. else
  1168. {
  1169. double H = 0.0, S = 0.0, L = 0.0;
  1170. CExtBitmap::stat_RGBtoHSL( clrAlpha, &H, &S, &L );
  1171. S = 0.3;
  1172. clrAlpha = CExtBitmap::stat_HLStoRGB( H, L, S );
  1173. pIcon->m_bmpDisabled.MakeMono( clrAlpha );
  1174. double lfAlphaAdjustPercent = GetIconAlphaAdjustPercent();
  1175. pIcon->m_bmpDisabled.AdjustAlpha( lfAlphaAdjustPercent );
  1176. }
  1177. return true;
  1178. }
  1179. return false;
  1180. }
  1181. CSize CExtPaintManagerSkin::GetCheckButtonBoxSize(
  1182. CDC & dc,
  1183. CExtPaintManager::PAINTCHECKRADIOBUTTONDATA & _pcbd
  1184. ) const
  1185. {
  1186. ASSERT_VALID( this );
  1187. dc;
  1188. _pcbd;
  1189. const CExtSkinGlyph & _glyph = m_Skin[_T("Button")][_T("CheckAndRadio")][_T("Check")][_T("Unchecked")].Glyph(_T("Normal"));
  1190. CSize _size = _glyph.GetSize();
  1191. return _size;
  1192. }
  1193. CSize CExtPaintManagerSkin::GetRadioButtonBoxSize(
  1194. CDC & dc,
  1195. CExtPaintManager::PAINTCHECKRADIOBUTTONDATA & _pcbd
  1196. ) const
  1197. {
  1198. ASSERT_VALID( this );
  1199. dc;
  1200. _pcbd;
  1201. const CExtSkinGlyph & _glyph = m_Skin[_T("Button")][_T("CheckAndRadio")][_T("Radio")][_T("Unchecked")].Glyph(_T("Normal"));
  1202. CSize _size = _glyph.GetSize();
  1203. return _size;
  1204. }
  1205. COLORREF CExtPaintManagerSkin::QueryObjectTextColor(
  1206. CDC & dc,
  1207. bool bEnabled,
  1208. bool bFocused,
  1209. bool bHovered,
  1210. bool bPressed,
  1211. CObject * pHelperSrc,
  1212. LPARAM lParam // = 0L
  1213. )
  1214. {
  1215. ASSERT_VALID( this );
  1216. ASSERT( dc.GetSafeHdc() != NULL );
  1217. if( pHelperSrc == NULL )
  1218. return
  1219. CExtPaintManager::QueryObjectTextColor(
  1220. dc,
  1221. bEnabled,
  1222. bFocused,
  1223. bHovered,
  1224. bPressed,
  1225. pHelperSrc,
  1226. lParam
  1227. );
  1228. ASSERT_VALID( pHelperSrc );
  1229. if( pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtHyperLinkButton) ) )
  1230. { // hyper-link
  1231. if( ! bEnabled )
  1232. return COLORREF(m_Skin[_T("Button")][_T("HyperLink")].Color(_T("Disabled")));
  1233. if( bPressed )
  1234. return COLORREF(m_Skin[_T("Button")][_T("HyperLink")].Color(_T("Pressed")));
  1235. if( bHovered )
  1236. return COLORREF(m_Skin[_T("Button")][_T("HyperLink")].Color(_T("Hover")));
  1237. if( bFocused )
  1238. return COLORREF(m_Skin[_T("Button")][_T("HyperLink")].Color(_T("Focused")));
  1239. return COLORREF(m_Skin[_T("Button")][_T("HyperLink")].Color(_T("Normal")));
  1240. } // hyper-link
  1241. if( pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtCheckBox) ) )
  1242. { // check box button
  1243. if( ! bEnabled )
  1244. return COLORREF(m_Skin[_T("Button")][_T("CheckAndRadio")][_T("Check")][_T("Unchecked")].Color(_T("Disabled")));
  1245. if( bPressed )
  1246. return COLORREF(m_Skin[_T("Button")][_T("CheckAndRadio")][_T("Check")][_T("Unchecked")].Color(_T("Pressed")));
  1247. if( bHovered )
  1248. return COLORREF(m_Skin[_T("Button")][_T("CheckAndRadio")][_T("Check")][_T("Unchecked")].Color(_T("Hover")));
  1249. if( bFocused )
  1250. return COLORREF(m_Skin[_T("Button")][_T("CheckAndRadio")][_T("Check")][_T("Unchecked")].Color(_T("Focused")));
  1251. return COLORREF(m_Skin[_T("Button")][_T("CheckAndRadio")][_T("Check")][_T("Unchecked")].Color(_T("Normal")));
  1252. } // check box button
  1253. if( pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtRadioButton) ) )
  1254. { // check box button
  1255. if( ! bEnabled )
  1256. return COLORREF(m_Skin[_T("Button")][_T("CheckAndRadio")][_T("Radio")][_T("Unchecked")].Color(_T("Disabled")));
  1257. if( bPressed )
  1258. return COLORREF(m_Skin[_T("Button")][_T("CheckAndRadio")][_T("Radio")][_T("Unchecked")].Color(_T("Pressed")));
  1259. if( bHovered )
  1260. return COLORREF(m_Skin[_T("Button")][_T("CheckAndRadio")][_T("Radio")][_T("Unchecked")].Color(_T("Hover")));
  1261. if( bFocused )
  1262. return COLORREF(m_Skin[_T("Button")][_T("CheckAndRadio")][_T("Radio")][_T("Unchecked")].Color(_T("Focused")));
  1263. return COLORREF(m_Skin[_T("Button")][_T("CheckAndRadio")][_T("Radio")][_T("Unchecked")].Color(_T("Normal")));
  1264. } // check box button
  1265. if( pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtLabel) ) )
  1266. { // static
  1267. if( ! bEnabled )
  1268. return COLORREF(m_Skin[_T("Label")].Color(_T("Disabled")));
  1269. return COLORREF(m_Skin[_T("Label")].Color(_T("Normal")));
  1270. } // static
  1271. return
  1272. CExtPaintManager::QueryObjectTextColor(
  1273. dc,
  1274. bEnabled,
  1275. bFocused,
  1276. bHovered,
  1277. bPressed,
  1278. pHelperSrc,
  1279. lParam
  1280. );
  1281. }
  1282. void CExtPaintManagerSkin::PaintCheckButtonBox(
  1283. CDC & dc,
  1284. CExtPaintManager::PAINTCHECKRADIOBUTTONDATA & _pcbd
  1285. )
  1286. {
  1287. ASSERT_VALID( this );
  1288. ASSERT( dc.GetSafeHdc() != NULL );
  1289. LPCTSTR strState = _T("Normal");
  1290. if( ! _pcbd.m_bEnabled )
  1291. strState = _T("Disabled");
  1292. else if( _pcbd.m_bPushed )
  1293. strState = _T("Pressed");
  1294. else if( _pcbd.m_bHover )
  1295. strState = _T("Hover");
  1296. // else if( _pcbd.m_bFocus )
  1297. // strState = _T("Focused");
  1298. LPCTSTR strChecked = _T("Unchecked");
  1299. switch( _pcbd.m_eState )
  1300. {
  1301. case CExtPaintManager::BOX_UNCHECKED:
  1302. case CExtPaintManager::BOX_LDOWN_UNCHECKED:
  1303. case CExtPaintManager::BOX_DISABLED_UNCHECKED:
  1304. case CExtPaintManager::BOX_MOUSE_HOVER_UNCHECKED:
  1305. break;
  1306. case CExtPaintManager::BOX_CHECKED:
  1307. case CExtPaintManager::BOX_LDOWN_CHECKED:
  1308. case CExtPaintManager::BOX_MOUSE_HOVER_CHECKED:
  1309. case CExtPaintManager::BOX_DISABLED_CHECKED:
  1310. strChecked = _T("Checked");
  1311. break;
  1312. case CExtPaintManager::BOX_INDETERMINATE:
  1313. case CExtPaintManager::BOX_LDOWN_INDETERMINATE:
  1314. case CExtPaintManager::BOX_MOUSE_HOVER_INDETERMINATE:
  1315. case CExtPaintManager::BOX_DISABLED_INDETERMINATE:
  1316. strChecked = _T("Indeterminate");
  1317. break;
  1318. } // switch( _pcrbd.m_eState )
  1319. const CExtSkinGlyph & _glyph = m_Skin[_T("Button")][_T("CheckAndRadio")][_T("Check")][strChecked].Glyph(strState);
  1320. _glyph.Draw( dc.m_hDC, _pcbd.m_rcBox );
  1321. }
  1322. void CExtPaintManagerSkin::PaintRadioButtonBox(
  1323. CDC & dc,
  1324. CExtPaintManager::PAINTCHECKRADIOBUTTONDATA & _pcbd
  1325. )
  1326. {
  1327. ASSERT_VALID( this );
  1328. ASSERT( dc.GetSafeHdc() != NULL );
  1329. LPCTSTR strState = _T("Normal");
  1330. if( ! _pcbd.m_bEnabled )
  1331. strState = _T("Disabled");
  1332. else if( _pcbd.m_bPushed )
  1333. strState = _T("Pressed");
  1334. else if( _pcbd.m_bHover )
  1335. strState = _T("Hover");
  1336. // else if( _pcbd.m_bFocus )
  1337. // strState = _T("Focused");
  1338. LPCTSTR strChecked = _T("Unchecked");
  1339. switch( _pcbd.m_eState )
  1340. {
  1341. case CExtPaintManager::BOX_UNCHECKED:
  1342. case CExtPaintManager::BOX_LDOWN_UNCHECKED:
  1343. case CExtPaintManager::BOX_DISABLED_UNCHECKED:
  1344. case CExtPaintManager::BOX_MOUSE_HOVER_UNCHECKED:
  1345. break;
  1346. case CExtPaintManager::BOX_CHECKED:
  1347. case CExtPaintManager::BOX_LDOWN_CHECKED:
  1348. case CExtPaintManager::BOX_MOUSE_HOVER_CHECKED:
  1349. case CExtPaintManager::BOX_DISABLED_CHECKED:
  1350. strChecked = _T("Checked");
  1351. break;
  1352. case CExtPaintManager::BOX_INDETERMINATE:
  1353. case CExtPaintManager::BOX_LDOWN_INDETERMINATE:
  1354. case CExtPaintManager::BOX_MOUSE_HOVER_INDETERMINATE:
  1355. case CExtPaintManager::BOX_DISABLED_INDETERMINATE:
  1356. strChecked = _T("Checked");
  1357. break;
  1358. } // switch( _pcrbd.m_eState )
  1359. const CExtSkinGlyph & _glyph = m_Skin[_T("Button")][_T("CheckAndRadio")][_T("Radio")][strChecked].Glyph(strState);
  1360. _glyph.Draw( dc.m_hDC, _pcbd.m_rcBox );
  1361. }
  1362. bool CExtPaintManagerSkin::PaintGroupBoxFrame(
  1363. CDC & dc,
  1364. const RECT & rcBorder,
  1365. COLORREF clrFrame, // = COLORREF(-1L)
  1366. CObject * pHelperSrc, // = NULL
  1367. LPARAM lParam // = 0L
  1368. )
  1369. {
  1370. ASSERT_VALID( this );
  1371. ASSERT( dc.GetSafeHdc() != NULL );
  1372. clrFrame;
  1373. pHelperSrc;
  1374. lParam;
  1375. if( rcBorder.left >= rcBorder.right
  1376. || rcBorder.top >= rcBorder.bottom
  1377. || (! dc.RectVisible( &rcBorder ) )
  1378. )
  1379. return true;
  1380. const CExtSkinGlyph & _glyph = m_Skin[_T("GroupBox")].Glyph(_T("Border"));
  1381. _glyph.Draw( dc.m_hDC, rcBorder );
  1382. return true;
  1383. }
  1384. bool CExtPaintManagerSkin::PaintGroupBoxLabel(
  1385. CDC & dc,
  1386. __EXT_MFC_SAFE_LPCTSTR strText,
  1387. COLORREF clrText,
  1388. HFONT hFont,
  1389. DWORD dwDrawTextFlags,
  1390. bool bEnabled,
  1391. const RECT & rcText,
  1392. CObject * pHelperSrc,
  1393. LPARAM lParam // = 0L
  1394. )
  1395. {
  1396. ASSERT_VALID( this );
  1397. ASSERT( dc.GetSafeHdc() != NULL );
  1398. pHelperSrc;
  1399. lParam;
  1400. int nLenText = int( ( strText != NULL ) ? _tcslen(strText) : 0 );
  1401. if( nLenText == 0
  1402. || rcText.left >= rcText.right
  1403. || rcText.top >= rcText.bottom
  1404. || (! dc.RectVisible( &rcText ) )
  1405. )
  1406. return true;
  1407. if( clrText == COLORREF(-1L) )
  1408. {
  1409. clrText =
  1410. QueryObjectTextColor(
  1411. dc,
  1412. bEnabled,
  1413. false,
  1414. false,
  1415. false,
  1416. pHelperSrc
  1417. );
  1418. if( clrText == COLORREF(-1L) )
  1419. clrText =
  1420. GetColor(
  1421. bEnabled
  1422. ? COLOR_BTNTEXT
  1423. : CExtPaintManager::CLR_TEXT_DISABLED,
  1424. pHelperSrc
  1425. );
  1426. }
  1427. // if( clrText == COLORREF(-1L) )
  1428. // {
  1429. CExtSkinColor & skinColor =
  1430. m_Skin[_T("GroupBox")].Color(
  1431. bEnabled ? _T("Enabled") : _T("Disabled") );
  1432. if( skinColor.IsHollow() )
  1433. return true;
  1434. clrText = COLORREF( skinColor );
  1435. // } // if( clrText == COLORREF(-1L) )
  1436. HFONT hDrawFont = ( hFont != NULL ) ? hFont : ( (HFONT) m_FontNormal.GetSafeHandle() );
  1437. HGDIOBJ hOldFont = dc.SelectObject( hDrawFont );
  1438. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  1439. COLORREF clrOldText = dc.SetTextColor( clrText );
  1440. CRect rc( rcText );
  1441. dc.DrawText(
  1442. LPCTSTR(strText),
  1443. int(_tcslen(strText)),
  1444. rc,
  1445. dwDrawTextFlags
  1446. );
  1447. dc.SetBkMode( nOldBkMode );
  1448. dc.SetTextColor( clrOldText );
  1449. dc.SelectObject( hOldFont );
  1450. return true;
  1451. }
  1452. #if( !defined __EXT_MFC_NO_SPIN || !defined __EXT_MFC_NO_DURATIONWND )
  1453. void CExtPaintManagerSkin::PaintSpinButtonArrow(
  1454. CDC & dc,
  1455. const CRect & rcButton,
  1456. bool bUp,
  1457. bool bHorz,
  1458. bool bEnabled,
  1459. bool bPushed,
  1460. bool bHover,
  1461. bool bHotTrack,
  1462. CObject * pHelperSrc,
  1463. LPARAM lParam // = 0L
  1464. )
  1465. {
  1466. ASSERT_VALID( this );
  1467. ASSERT( dc.GetSafeHdc() != NULL );
  1468. bHotTrack;
  1469. pHelperSrc;
  1470. lParam;
  1471. LPCTSTR strState = _T("Disabled");
  1472. if( bEnabled )
  1473. {
  1474. if( bPushed )
  1475. strState = _T("Pressed");
  1476. else if( bHover )
  1477. strState = _T("Hover");
  1478. else
  1479. strState = _T("Normal");
  1480. } // if( bEnabled )
  1481. LPCTSTR strHorzVert = NULL, strUpDown = NULL;
  1482. if( bHorz )
  1483. {
  1484. strHorzVert = _T("Horizontal");
  1485. strUpDown = bUp ? _T("Left") : _T("Right");
  1486. } // if( bHorz )
  1487. else
  1488. {
  1489. strHorzVert = _T("Vertical");
  1490. strUpDown = bUp ? _T("Up") : _T("Down");
  1491. } // else from if( bHorz )
  1492. const CExtSkinGlyph & _glyph =
  1493. m_Skin[_T("Button")][_T("Spin")][strHorzVert][strUpDown][_T("Arrow")]
  1494. .Glyph(strState);
  1495. _glyph.Draw( dc.m_hDC, rcButton );
  1496. }
  1497. void CExtPaintManagerSkin::PaintSpinButton(
  1498. CDC & dc,
  1499. const CRect & rcButton,
  1500. bool bUp,
  1501. bool bHorz,
  1502. bool bEnabled,
  1503. bool bFlat,
  1504. bool bDrawBorder,
  1505. bool bPushed,
  1506. bool bHover,
  1507. bool bHotTrack,
  1508. CObject * pHelperSrc,
  1509. LPARAM lParam // = 0L
  1510. )
  1511. {
  1512. ASSERT_VALID( this );
  1513. ASSERT( dc.GetSafeHdc() != NULL );
  1514. bFlat;
  1515. bDrawBorder;
  1516. LPCTSTR strState = _T("Disabled");
  1517. if( bEnabled )
  1518. {
  1519. if( bPushed )
  1520. strState = _T("Pressed");
  1521. else if( bHover )
  1522. strState = _T("Hover");
  1523. else
  1524. strState = _T("Normal");
  1525. } // if( bEnabled )
  1526. LPCTSTR strHorzVert = NULL, strUpDown = NULL;
  1527. if( bHorz )
  1528. {
  1529. strHorzVert = _T("Horizontal");
  1530. strUpDown = bUp ? _T("Left") : _T("Right");
  1531. } // if( bHorz )
  1532. else
  1533. {
  1534. strHorzVert = _T("Vertical");
  1535. strUpDown = bUp ? _T("Up") : _T("Down");
  1536. } // else from if( bHorz )
  1537. const CExtSkinGlyph & _glyph =
  1538. m_Skin[_T("Button")][_T("Spin")][strHorzVert][strUpDown][_T("Button")]
  1539. .Glyph(strState);
  1540. _glyph.Draw( dc.m_hDC, rcButton );
  1541. CRect rcContentPadding = _glyph.GetContentPadding();
  1542. CRect rcArrow = rcButton;
  1543. rcArrow.DeflateRect(
  1544. rcContentPadding.left,
  1545. rcContentPadding.top,
  1546. rcContentPadding.right,
  1547. rcContentPadding.bottom
  1548. );
  1549. PaintSpinButtonArrow(
  1550. dc,
  1551. rcArrow, // rcButton,
  1552. bUp,
  1553. bHorz,
  1554. bEnabled,
  1555. bPushed,
  1556. bHover,
  1557. bHotTrack,
  1558. pHelperSrc,
  1559. lParam
  1560. );
  1561. }
  1562. #endif // #if( !defined __EXT_MFC_NO_SPIN || !defined __EXT_MFC_NO_DURATIONWND )
  1563. void CExtPaintManagerSkin::PaintControlFrame(
  1564. CDC & dc,
  1565. CExtPaintManager::PAINTCONTROLFRAMEDATA & _pcfd
  1566. )
  1567. {
  1568. ASSERT_VALID( this );
  1569. ASSERT( dc.GetSafeHdc() != NULL );
  1570. CRect rcItem( _pcfd.m_rcClient );
  1571. LPCTSTR strControlType = _T("Generic");
  1572. if( _pcfd.m_pHelperSrc != NULL )
  1573. {
  1574. if( _pcfd.m_pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtEdit)) )
  1575. strControlType = _T("Edit");
  1576. }
  1577. LPCTSTR strState = _T("Disabled");
  1578. LPCTSTR strActive = _T("Inactive");
  1579. LPCTSTR strHover = _T("Normal");
  1580. if( _pcfd.m_bEnabled )
  1581. {
  1582. strState = _T("Normal");
  1583. if( _pcfd.m_bFocus )
  1584. strActive = _T("Active");
  1585. if( _pcfd.m_bHover )
  1586. strHover = _T("Hover");
  1587. }
  1588. const CExtSkinGlyph & _glyph =
  1589. m_Skin[_T("ControlFrame")][strActive][strControlType].Glyph(strState);
  1590. _glyph.Draw( dc.m_hDC, rcItem );
  1591. COLORREF clrInner = 
  1592. GetColor( 
  1593. ( ! _pcfd.m_bEnabled ) 
  1594. ? COLOR_3DFACE 
  1595. : COLOR_WINDOW,
  1596. _pcfd.m_pHelperSrc, 
  1597. _pcfd.m_lParam 
  1598. );
  1599. rcItem.DeflateRect(2,2);
  1600. dc.Draw3dRect( rcItem, clrInner, clrInner );
  1601. }
  1602. bool CExtPaintManagerSkin::AdjustControlFont(
  1603. HFONT & hFont,
  1604. CObject * pHelperSrc,
  1605. LPARAM lParam // = 0L
  1606. )
  1607. {
  1608. ASSERT_VALID( this );
  1609. ASSERT( hFont != NULL );
  1610. hFont;
  1611. pHelperSrc;
  1612. lParam;
  1613. //LOGFONT _lf;
  1614. // ::memset( &_lf, 0, sizeof(LOGFONT) );
  1615. // ::GetObject( (HGDIOBJ)hFont, sizeof(LOGFONT), (LPVOID) &_lf );
  1616. // hFont = ::CreateFontIndirect( &_lf );
  1617. // ASSERT( hFont != NULL );
  1618. // return true;
  1619. return false;
  1620. }
  1621. DLGTEMPLATE * CExtPaintManagerSkin::AdjustDialogTemplate(
  1622. const DLGTEMPLATE * lpDialogTemplate,
  1623. CObject * pHelperSrc,
  1624. bool bWizard, // = false
  1625. LPARAM lParam // = 0L
  1626. )
  1627. {
  1628. ASSERT( lpDialogTemplate != NULL );
  1629. bWizard;
  1630. lParam;
  1631. LPCTSTR strSkinnedFontType = NULL;
  1632. if( pHelperSrc != NULL )
  1633. {
  1634. if( pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtResDlg) ) )
  1635. {
  1636. strSkinnedFontType =
  1637. ((CExtResDlg *)pHelperSrc) ->
  1638. OnQuerySkinnedFontParmName();
  1639. }
  1640. else if( pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtResPP) ) )
  1641. {
  1642. strSkinnedFontType =
  1643. ((CExtResPP *)pHelperSrc) ->
  1644. OnQuerySkinnedFontParmName();
  1645. }
  1646. else if( pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtResPS) ) )
  1647. {
  1648. strSkinnedFontType =
  1649. ((CExtResPS *)pHelperSrc) ->
  1650. OnQuerySkinnedFontParmName();
  1651. }
  1652. } // if( pHelperSrc != NULL )
  1653. if( strSkinnedFontType == NULL )
  1654. return NULL;
  1655. ASSERT( _tcslen(strSkinnedFontType) > 0 );
  1656. CExtSkinFont & skinFont =
  1657. m_Skin[_T("DialogTemplate")].Font(strSkinnedFontType);
  1658. const LOGFONT & lf = skinFont.LogFontGet();
  1659. if( _tcslen(lf.lfFaceName) == 0 )
  1660. return NULL;
  1661. if( lf.lfHeight == 0 )
  1662. return NULL;
  1663. CDialogTemplate dlgTemplate( lpDialogTemplate );
  1664. dlgTemplate.SetFont(
  1665. lf.lfFaceName,
  1666. WORD( abs( lf.lfHeight ) )
  1667. );
  1668. return (DLGTEMPLATE*)dlgTemplate.Detach();
  1669. }
  1670. #if (!defined __EXT_MFC_NO_DATE_PICKER)
  1671. void CExtPaintManagerSkin::PaintDatePickerPushButton(
  1672. CDC & dc,
  1673. const CRect & rcButton,
  1674. LONG nButtonType, // __EDPWH_BTN_NONE or __EDPWH_BTN_TODAY
  1675. __EXT_MFC_SAFE_LPCTSTR strCaption,
  1676. bool bFlat,
  1677. bool bDrawBorder,
  1678. bool bPushed,
  1679. bool bHover,
  1680. HFONT hFont,
  1681. CObject * pHelperSrc,
  1682. LPARAM lParam // = 0L
  1683. )
  1684. {
  1685. ASSERT_VALID( this );
  1686. ASSERT( dc.GetSafeHdc() != NULL );
  1687. CExtMemoryDC dcMem( &dc, &rcButton );
  1688. CExtPaintManager::PaintDatePickerPushButton(
  1689. dcMem,
  1690. rcButton,
  1691. nButtonType,
  1692. strCaption,
  1693. bFlat,
  1694. bDrawBorder,
  1695. bPushed,
  1696. bHover,
  1697. hFont,
  1698. pHelperSrc,
  1699. lParam
  1700. );
  1701. }
  1702. void CExtPaintManagerSkin::PaintDatePickerClientArea(
  1703. CDC & dc,
  1704. const RECT & rcTotalClient,
  1705. const RECT & rcUsedClient,
  1706. CObject * pHelperSrc,
  1707. LPARAM lParam // = 0L
  1708. )
  1709. {
  1710. ASSERT_VALID( this );
  1711. ASSERT( dc.GetSafeHdc() != NULL );
  1712. if( ! dc.RectVisible(&rcTotalClient) )
  1713. return;
  1714. dc.FillSolidRect(
  1715. &rcTotalClient,
  1716. GetColor( CExtPaintManager::CLR_3DFACE_OUT, pHelperSrc, lParam )
  1717. );
  1718. dc.FillSolidRect(
  1719. &rcUsedClient,
  1720. GetColor( COLOR_WINDOW, pHelperSrc, lParam )
  1721. );
  1722. }
  1723. #endif // (!defined __EXT_MFC_NO_DATE_PICKER)
  1724. #if (!defined __EXT_MFC_NO_SHORTCUTLIST_CTRL)
  1725. void CExtPaintManagerSkin::PaintShortcutListItem(
  1726. CDC & dc,
  1727. CExtPaintManager::PAINTSHORTCUTLISTITEMSDATA & _pslid
  1728. )
  1729. {
  1730. ASSERT_VALID( this );
  1731. ASSERT( dc.GetSafeHdc() != NULL );
  1732. CExtSkinItem * pButton = (&(m_Skin[_T("Button")][_T("Simple")]));
  1733. CExtSkinItem * pSkinItem =
  1734. (&((*pButton)
  1735. [_T("PushButton")][_T("ControlBar")][_T("Horizontal")]
  1736. [_T("ToolBar")][_T("MenuBar")][_T("Normal")]
  1737. ));
  1738. const CExtSkinColor & skinColor =
  1739. pSkinItem->Color( _T("Normal") );
  1740. if( skinColor.IsHollow() )
  1741. m_clrShortcutListItemAlternativeText = COLORREF( -1L );
  1742. else
  1743. m_clrShortcutListItemAlternativeText = COLORREF( skinColor );
  1744. CExtPaintManager::PaintShortcutListItem( dc, _pslid );
  1745. }
  1746. #endif // (!defined __EXT_MFC_NO_SHORTCUTLIST_CTRL)
  1747. CExtPaintManager::SCROLLBARSKINDATA * CExtPaintManagerSkin::ScrollBar_GetSkinData(
  1748. bool bHorzBar,
  1749. CObject * pHelperSrc,
  1750. LPARAM lParam, // = 0L
  1751. bool bLightAccent // = true
  1752. )
  1753. {
  1754. ASSERT_VALID( this );
  1755. bLightAccent;
  1756. if( IsHighContrast() )
  1757. return
  1758. CExtPaintManager::ScrollBar_GetSkinData(
  1759. bHorzBar,
  1760. pHelperSrc,
  1761. lParam,
  1762. bLightAccent
  1763. );
  1764. if( pHelperSrc != NULL )
  1765. {
  1766. ASSERT_VALID( pHelperSrc );
  1767. if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtZoomScrollBar ) ) )
  1768. {
  1769. switch( ((CExtZoomScrollBar*)pHelperSrc)->m_eSO )
  1770. {
  1771. case CExtScrollBar::__ESO_TOP:
  1772. case CExtScrollBar::__ESO_BOTTOM:
  1773. return (&m_Skin.m_SBSD_ZoomH);
  1774. case CExtScrollBar::__ESO_LEFT:
  1775. case CExtScrollBar::__ESO_RIGHT:
  1776. return (&m_Skin.m_SBSD_ZoomV);
  1777. default:
  1778. return bHorzBar ? (&m_Skin.m_SBSD_ZoomH) : (&m_Skin.m_SBSD_ZoomV);
  1779. } // switch( ((CExtZoomScrollBar*)pHelperSrc)->m_eSO )
  1780. } // if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtZoomScrollBar ) ) )
  1781. } // if( pHelperSrc != NULL )
  1782. return bHorzBar ? (&m_Skin.m_SBSD_ClassicH) : (&m_Skin.m_SBSD_ClassicV);
  1783. }
  1784. bool CExtPaintManagerSkin::ScrollBar_GetMetrics(
  1785. INT * p_nHorzBarHeight, // = NULL
  1786. INT * p_nVertBarWidth, // = NULL
  1787. INT * p_nHorzButtonWidth, // = NULL
  1788. INT * p_nVertButtonHeight, // = NULL
  1789. INT * p_nHorzThumbMinWidth, // = NULL
  1790. INT * p_nVertThumbMinHeight, // = NULL
  1791. CObject * pHelperSrc, // = NULL
  1792. LPARAM lParam // = 0L
  1793. ) const
  1794. {
  1795. ASSERT_VALID( this );
  1796. bool bDefaultMetricsRetrived =
  1797. CExtPaintManager::ScrollBar_GetMetrics(
  1798. p_nHorzBarHeight,
  1799. p_nVertBarWidth,
  1800. p_nHorzButtonWidth,
  1801. p_nVertButtonHeight,
  1802. p_nHorzThumbMinWidth,
  1803. p_nVertThumbMinHeight,
  1804. pHelperSrc,
  1805. lParam
  1806. );
  1807. if( IsHighContrast() )
  1808. return bDefaultMetricsRetrived;
  1809. if( ! bDefaultMetricsRetrived )
  1810. {
  1811. if( p_nHorzBarHeight != NULL )
  1812. (*p_nHorzBarHeight) = ::GetSystemMetrics( SM_CYHSCROLL );
  1813. if( p_nVertBarWidth != NULL )
  1814. (*p_nVertBarWidth) = ::GetSystemMetrics( SM_CXVSCROLL );
  1815. if( p_nHorzButtonWidth != NULL )
  1816. (*p_nHorzButtonWidth) = ::GetSystemMetrics( SM_CXHSCROLL );
  1817. if( p_nVertButtonHeight != NULL )
  1818. (*p_nVertButtonHeight) = ::GetSystemMetrics( SM_CYVSCROLL );
  1819. } // if( ! bDefaultMetricsRetrived )
  1820. if( p_nHorzThumbMinWidth != NULL )
  1821. {
  1822. CExtPaintManager::SCROLLBARSKINDATA * pSBSD =
  1823. ( const_cast < CExtPaintManagerSkin * > ( this ) ) ->
  1824. ScrollBar_GetSkinData( true, pHelperSrc, lParam, true );
  1825. if( pSBSD != NULL )
  1826. {
  1827. CRect rcPaddingOfThumbButton =
  1828. pSBSD->m_arrPartPadding[INT(__ESBSPT_COLD)][INT(__ESBMHT_THUMB)];
  1829. INT nMinExtent = rcPaddingOfThumbButton.left + rcPaddingOfThumbButton.right;
  1830. if( (*p_nHorzThumbMinWidth) < nMinExtent )
  1831. (*p_nHorzThumbMinWidth) = nMinExtent;
  1832. } // if( pSBSD != NULL )
  1833. } // if( p_nHorzThumbMinWidth != NULL )
  1834. if( p_nVertThumbMinHeight != NULL )
  1835. {
  1836. CExtPaintManager::SCROLLBARSKINDATA * pSBSD =
  1837. ( const_cast < CExtPaintManagerSkin * > ( this ) ) ->
  1838. ScrollBar_GetSkinData( false, pHelperSrc, lParam, true );
  1839. if( pSBSD != NULL )
  1840. {
  1841. CRect rcPaddingOfThumbButton =
  1842. pSBSD->m_arrPartPadding[INT(__ESBSPT_COLD)][INT(__ESBMHT_THUMB)];
  1843. INT nMinExtent = rcPaddingOfThumbButton.top + rcPaddingOfThumbButton.bottom;
  1844. if( (*p_nVertThumbMinHeight) < nMinExtent )
  1845. (*p_nVertThumbMinHeight) = nMinExtent;
  1846. } // if( pSBSD != NULL )
  1847. } // if( p_nVertThumbMinHeight != NULL )
  1848. return true;
  1849. }
  1850. bool CExtPaintManagerSkin::PaintDocumentClientAreaBkgnd(
  1851. CDC & dc,
  1852. CWnd * pWnd,
  1853. LPARAM lParam // = NULL
  1854. )
  1855. {
  1856. ASSERT_VALID( this );
  1857. ASSERT( dc.GetSafeHdc() != NULL );
  1858. ASSERT( pWnd->GetSafeHwnd() != NULL && ::IsWindow(pWnd->GetSafeHwnd()) );
  1859. return PaintDockerBkgnd( true, dc, pWnd, lParam );
  1860. }
  1861. #ifndef __EXT_MFC_NO_GRIDWND
  1862. bool CExtPaintManagerSkin::Grid_PaintButton(
  1863. CDC & dc,
  1864. const RECT & rcButton,
  1865. INT nButtonType,
  1866. bool bPressed,
  1867. bool bHovered,
  1868. bool bFocused,
  1869. bool bEnabled,
  1870. COLORREF clrFace,
  1871. COLORREF clrLight,
  1872. COLORREF clrShadow,
  1873. COLORREF clrWindow,
  1874. COLORREF clrText,
  1875. DWORD dwHelperPaintFlags,
  1876. CObject * pHelperSrc,
  1877. LPARAM lParam // = 0L
  1878. )
  1879. {
  1880. ASSERT_VALID( this );
  1881. ASSERT( dc.GetSafeHdc() != NULL );
  1882. if( pHelperSrc == NULL )
  1883. return false;
  1884. ASSERT_VALID( pHelperSrc );
  1885. if( IsHighContrast() )
  1886. return 
  1887. CExtPaintManager::Grid_PaintButton(
  1888. dc,
  1889. rcButton,
  1890. nButtonType,
  1891. bPressed,
  1892. bHovered,
  1893. bFocused,
  1894. bEnabled,
  1895. clrFace,
  1896. clrLight,
  1897. clrShadow,
  1898. clrWindow,
  1899. clrText,
  1900. dwHelperPaintFlags,
  1901. pHelperSrc,
  1902. lParam
  1903. );
  1904. CRect rc( rcButton );
  1905. // dc.FillSolidRect( &rc, clrWindow );
  1906. LPCTSTR strState = _T("Disabled");
  1907. if( bEnabled )
  1908. {
  1909. if( bPressed )
  1910. strState = _T("Pressed");
  1911. else if( bHovered )
  1912. strState = _T("Hover");
  1913. else
  1914. strState = _T("Normal");
  1915. } // if( bEnabled )
  1916. CExtSafeString strGlyphBackground = strState;
  1917. strGlyphBackground += _T("-Background");
  1918. CExtSafeString strGlyphArrow = strState;
  1919. strGlyphArrow += _T("-Arrow");
  1920. LPCTSTR strButtonType = NULL, strArrow = NULL;
  1921. CExtBitmap * pBitmap = NULL;
  1922. switch( nButtonType ) 
  1923. {
  1924. case INT(CExtGridCell::__EBTT_DROPDOWN):
  1925. strButtonType = _T("DropDown");
  1926. if( (dwHelperPaintFlags&__EGCPF_NO_BUTTON_DROPDOWN_ARROW) == 0 )
  1927. strArrow = LPCTSTR(strGlyphArrow);
  1928. break;
  1929. case INT(CExtGridCell::__EBTT_ELLIPSIS):
  1930. strButtonType = _T("Ellipsis");
  1931. if( (dwHelperPaintFlags&__EGCPF_NO_BUTTON_ELLIPSIS_DOTS) == 0 )
  1932. strArrow = LPCTSTR(strGlyphArrow);
  1933. break;
  1934. case INT(CExtGridCell::__EBTT_UPDOWN_UP):
  1935. strButtonType = _T("Up");
  1936. strArrow = LPCTSTR(strGlyphArrow);
  1937. break;
  1938. case INT(CExtGridCell::__EBTT_UPDOWN_DOWN):
  1939. strButtonType = _T("Down");
  1940. strArrow = LPCTSTR(strGlyphArrow);
  1941. break;
  1942. case INT(CExtGridCell::__EBTT_FILTER_APPLIED):
  1943. //strButtonType = _T("DropDown");
  1944. pBitmap = &m_bmpFilterApplied;
  1945. break;
  1946. case INT(CExtGridCell::__EBTT_FILTER_UNAPPLIED):
  1947. //strButtonType = _T("DropDown");
  1948. pBitmap = &m_bmpFilterUnApplied;
  1949. break;
  1950. } // switch( nButtonType ) 
  1951. if( strButtonType != NULL )
  1952. {
  1953. const CExtSkinGlyph & _glyph =
  1954. m_Skin[_T("Button")][_T("Grid")][strButtonType]
  1955. .Glyph( LPCTSTR(strGlyphBackground) );
  1956. _glyph.Draw( dc.m_hDC, rcButton );
  1957. } // if( strButtonType != NULL )
  1958. if( strArrow != NULL )
  1959. {
  1960. const CExtSkinGlyph & _glyph =
  1961. m_Skin[_T("Button")][_T("Grid")][strButtonType]
  1962. .Glyph( LPCTSTR(strArrow) );
  1963. _glyph.Draw( dc.m_hDC, rcButton );
  1964. } // if( strArrow != NULL )
  1965. if( pBitmap != NULL
  1966. && (! pBitmap->IsEmpty() )
  1967. )
  1968. {
  1969. CRect rcDst( rc.TopLeft(), pBitmap->GetSize() );
  1970. rcDst.OffsetRect(
  1971. ( rc.Width() - rcDst.Width() ) / 2,
  1972. ( rc.Height() - rcDst.Height() ) / 2
  1973. );
  1974. pBitmap->AlphaBlend( dc.m_hDC, rcDst );
  1975. } // if( pBitmap != NULL ...
  1976. return true;
  1977. }
  1978. bool CExtPaintManagerSkin::Grid_PaintHeaderSortArrow(
  1979. CDC & dc,
  1980. const RECT & rcSortArrow,
  1981. bool bHorz,
  1982. bool bAscending,
  1983. COLORREF * pColorValues,
  1984. CObject * pHelperSrc,
  1985. LPARAM lParam // = 0L
  1986. )
  1987. {
  1988. ASSERT_VALID( this );
  1989. ASSERT( dc.GetSafeHdc() != NULL );
  1990. if( IsHighContrast() )
  1991. return 
  1992. CExtPaintManager::Grid_PaintHeaderSortArrow(
  1993. dc,
  1994. rcSortArrow,
  1995. bHorz,
  1996. bAscending,
  1997. pColorValues,
  1998. pHelperSrc,
  1999. lParam
  2000. );
  2001. if( pColorValues == NULL )
  2002. {
  2003. ASSERT( FALSE );
  2004. return false;
  2005. }
  2006. const CExtSkinGlyph & _glyph =
  2007. m_Skin[_T("Grid")][_T("SortArrow")]
  2008. .Glyph(
  2009. bHorz
  2010. ? ( bAscending ? _T("AscendingLeftRight") : _T("DescendingLeftRight") )
  2011. : ( bAscending ? _T("AscendingTopBottom") : _T("DescendingTopBottom") )
  2012. );
  2013. _glyph.Draw( dc.m_hDC, rcSortArrow );
  2014. return true;
  2015. }
  2016. bool CExtPaintManagerSkin::Grid_PaintHeaderBackground(
  2017. CDC & dc,
  2018. const RECT & rcArea,
  2019. LONG nColNo,
  2020. LONG nRowNo,
  2021. INT nColType,
  2022. INT nRowType,
  2023. DWORD dwAreaFlags,
  2024. DWORD dwHelperPaintFlags,
  2025. CObject * pHelperSrc,
  2026. LPARAM lParam // = 0L
  2027. )
  2028. {
  2029. ASSERT_VALID( this );
  2030. ASSERT( dc.GetSafeHdc() != NULL );
  2031. if( IsHighContrast() )
  2032. return 
  2033. CExtPaintManager::Grid_PaintHeaderBackground(
  2034. dc,
  2035. rcArea,
  2036. nColNo,
  2037. nRowNo,
  2038. nColType,
  2039. nRowType,
  2040. dwAreaFlags,
  2041. dwHelperPaintFlags,
  2042. pHelperSrc,
  2043. lParam
  2044. );
  2045. CExtGridWnd * pGridWnd = ( pHelperSrc != NULL ) ? ( DYNAMIC_DOWNCAST( CExtGridWnd, pHelperSrc ) ) : NULL;
  2046. if( pGridWnd == NULL )
  2047. return false;
  2048. bool bHoverByColumn = ( (dwHelperPaintFlags&__EGCPF_HOVER_BY_COLUMN) != 0 ) ? true : false;
  2049. bool bHoverByRow = ( (dwHelperPaintFlags&__EGCPF_HOVER_BY_ROW) != 0 ) ? true : false;
  2050. bool bHighlightedBySelectedColumn = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_SELECTED_COLUMN) != 0 ) ? true : false;
  2051. bool bHighlightedBySelectedRow = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_SELECTED_ROW) != 0 ) ? true : false;
  2052. bool bHighlightedByFocusedColumn = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_FOCUSED_COLUMN) != 0 ) ? true : false;
  2053. bool bHighlightedByFocusedRow = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_FOCUSED_ROW) != 0 ) ? true : false;
  2054. // bool bFocusedControl = ( (dwHelperPaintFlags&__EGCPF_FOCUSED_CONTROL) != 0 ) ? true : false;
  2055. bool bHighlightPressing = ( (dwHelperPaintFlags&(__EGCPF_HIGHLIGHTED_BY_PRESSED_COLUMN|__EGCPF_HIGHLIGHTED_BY_PRESSED_ROW)) != 0 ) ? true : false;
  2056. LPCTSTR strOuterAreaLocation = NULL;
  2057. if( nColType == 0 && nRowType == 0 )
  2058. {
  2059. if( nColNo >= 0 && nRowNo >= 0 )
  2060. return false;
  2061. strOuterAreaLocation = _T("GeneralOuterBackground");
  2062. }
  2063. else if( nColType ==  0 && nRowType == -1 )
  2064. strOuterAreaLocation = _T("Top");
  2065. else if( nColType ==  0 && nRowType ==  1 )
  2066. strOuterAreaLocation = _T("Bottom");
  2067. else if( nColType == -1 && nRowType ==  0 )
  2068. strOuterAreaLocation = _T("Left");
  2069. else if( nColType ==  1 && nRowType ==  0 )
  2070. strOuterAreaLocation = _T("Right");
  2071. else if( nColType == -1 && nRowType == -1 )
  2072. strOuterAreaLocation = _T("TopLeft");
  2073. else if( nColType ==  1 && nRowType == -1 )
  2074. strOuterAreaLocation = _T("TopRight");
  2075. else if( nColType == -1 && nRowType ==  1 )
  2076. strOuterAreaLocation = _T("BottomLeft");
  2077. else if( nColType ==  1 && nRowType ==  1 )
  2078. strOuterAreaLocation = _T("BottomRight");
  2079. if( strOuterAreaLocation == NULL )
  2080. return false;
  2081. if( nColNo >= 0L && nRowNo >= 0L ) 
  2082. {
  2083. LPCTSTR strHeaderCellState = _T("Normal");
  2084. if( bHighlightPressing )
  2085. strHeaderCellState = _T("Pressed");
  2086. else if( bHoverByColumn && bHoverByRow )
  2087. strHeaderCellState = _T("Hover");
  2088. else if( bHighlightedByFocusedColumn || bHighlightedByFocusedRow )
  2089. strHeaderCellState = _T("HighlightedByFocus");
  2090. else if( bHighlightedBySelectedColumn || bHighlightedBySelectedRow )
  2091. strHeaderCellState = _T("HighlightedBySelection");
  2092. else if( bHoverByColumn || bHoverByRow )
  2093. {
  2094. if( nColType == 0 || nRowType == 0 )
  2095. strHeaderCellState = _T("HighlightedByHover");
  2096. }
  2097. const CExtSkinGlyph & _glyph =
  2098. m_Skin[_T("Grid")][_T("HeaderCell")][strOuterAreaLocation]
  2099. .Glyph( strHeaderCellState );
  2100. _glyph.Draw( dc.m_hDC, rcArea );
  2101. } // if( nColNo >= 0L && nRowNo >= 0L ) 
  2102. else
  2103. {
  2104. const CExtSkinGlyph & _glyph =
  2105. m_Skin[_T("Grid")][_T("OuterBackground")][strOuterAreaLocation]
  2106. .Glyph( _T("Background") );
  2107. _glyph.Draw( dc.m_hDC, rcArea );
  2108. } // else from if( nColNo >= 0L && nRowNo >= 0L ) 
  2109. return true;
  2110. }
  2111. COLORREF CExtPaintManagerSkin::Grid_OnQueryTextColor(
  2112. const CExtGridCell & _cell,
  2113. CDC & dc,
  2114. LONG nVisibleColNo,
  2115. LONG nVisibleRowNo,
  2116. LONG nColNo,
  2117. LONG nRowNo,
  2118. INT nColType,
  2119. INT nRowType,
  2120. DWORD dwAreaFlags,
  2121. DWORD dwHelperPaintFlags
  2122. )
  2123. {
  2124. ASSERT_VALID( this );
  2125. ASSERT_VALID( (&_cell) );
  2126. if( (dwHelperPaintFlags&__EGCPF_PRINTING_TARGET_MASK) != 0 )
  2127. return COLORREF(-1L);
  2128. if( IsHighContrast() )
  2129. return
  2130. CExtPaintManager::Grid_OnQueryTextColor(
  2131. _cell,
  2132. dc,
  2133. nVisibleColNo,
  2134. nVisibleRowNo,
  2135. nColNo,
  2136. nRowNo,
  2137. nColType,
  2138. nRowType,
  2139. dwAreaFlags,
  2140. dwHelperPaintFlags
  2141. );
  2142. LPCTSTR strOuterAreaLocation = NULL;
  2143. if( nColType == 0 && nRowType == 0 )
  2144. return COLORREF(-1L);
  2145. else if( nColType ==  0 && nRowType == -1 )
  2146. strOuterAreaLocation = _T("Top");
  2147. else if( nColType ==  0 && nRowType ==  1 )
  2148. strOuterAreaLocation = _T("Bottom");
  2149. else if( nColType == -1 && nRowType ==  0 )
  2150. strOuterAreaLocation = _T("Left");
  2151. else if( nColType ==  1 && nRowType ==  0 )
  2152. strOuterAreaLocation = _T("Right");
  2153. else if( nColType == -1 && nRowType == -1 )
  2154. strOuterAreaLocation = _T("TopLeft");
  2155. else if( nColType ==  1 && nRowType == -1 )
  2156. strOuterAreaLocation = _T("TopRight");
  2157. else if( nColType == -1 && nRowType ==  1 )
  2158. strOuterAreaLocation = _T("BottomLeft");
  2159. else if( nColType ==  1 && nRowType ==  1 )
  2160. strOuterAreaLocation = _T("BottomRight");
  2161. if( strOuterAreaLocation == NULL )
  2162. return COLORREF(-1L);
  2163. bool bHoverByColumn = ( (dwHelperPaintFlags&__EGCPF_HOVER_BY_COLUMN) != 0 ) ? true : false;
  2164. bool bHoverByRow = ( (dwHelperPaintFlags&__EGCPF_HOVER_BY_ROW) != 0 ) ? true : false;
  2165. bool bHighlightedBySelectedColumn = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_SELECTED_COLUMN) != 0 ) ? true : false;
  2166. bool bHighlightedBySelectedRow = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_SELECTED_ROW) != 0 ) ? true : false;
  2167. bool bHighlightedByFocusedColumn = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_FOCUSED_COLUMN) != 0 ) ? true : false;
  2168. bool bHighlightedByFocusedRow = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_FOCUSED_ROW) != 0 ) ? true : false;
  2169. // bool bFocusedControl = ( (dwHelperPaintFlags&__EGCPF_FOCUSED_CONTROL) != 0 ) ? true : false;
  2170. bool bHighlightPressing = ( (dwHelperPaintFlags&(__EGCPF_HIGHLIGHTED_BY_PRESSED_COLUMN|__EGCPF_HIGHLIGHTED_BY_PRESSED_ROW)) != 0 ) ? true : false;
  2171. LPCTSTR strHeaderCellState = _T("Normal");
  2172. if( bHighlightPressing )
  2173. strHeaderCellState = _T("Pressed");
  2174. else if( bHoverByColumn && bHoverByRow )
  2175. strHeaderCellState = _T("Hover");
  2176. else if( bHighlightedByFocusedColumn || bHighlightedByFocusedRow )
  2177. strHeaderCellState = _T("HighlightedByFocus");
  2178. else if( bHighlightedBySelectedColumn || bHighlightedBySelectedRow )
  2179. strHeaderCellState = _T("HighlightedBySelection");
  2180. else if( bHoverByColumn || bHoverByRow )
  2181. strHeaderCellState = _T("HighlightedByHover");
  2182. const CExtSkinColor & colorText =
  2183. m_Skin[_T("Grid")][_T("HeaderCell")][strOuterAreaLocation]
  2184. .Color( strHeaderCellState );
  2185. if( colorText.IsHollow() )
  2186. return COLORREF(-1L);
  2187. COLORREF clr = COLORREF( colorText );
  2188. return clr;
  2189. }
  2190. #endif // #ifndef __EXT_MFC_NO_GRIDWND
  2191. #if (!defined __EXT_MFC_NO_REPORTGRIDWND)
  2192. bool CExtPaintManagerSkin::ReportGrid_PaintHeaderRowBackground(
  2193. CDC & dc,
  2194. const RECT & rcArea,
  2195. CObject * pHelperSrc,
  2196. LPARAM lParam // = 0L
  2197. )
  2198. {
  2199. ASSERT_VALID( this );
  2200. ASSERT( dc.GetSafeHdc() != NULL );
  2201. // dc;
  2202. // rcArea;
  2203. // pHelperSrc;
  2204. // lParam;
  2205. // return false;
  2206. return
  2207. CExtPaintManagerSkin::Grid_PaintHeaderBackground(
  2208. dc,
  2209. rcArea,
  2210. -1L,
  2211. -1L,
  2212. 0,
  2213. 0,
  2214. 0,
  2215. 0,
  2216. pHelperSrc,
  2217. lParam
  2218. );
  2219. }
  2220. bool CExtPaintManagerSkin::ReportGrid_PaintHeaderSortArrow(
  2221. CDC & dc,
  2222. const RECT & rcSortArrow,
  2223. bool bAscending,
  2224. CObject * pHelperSrc,
  2225. LPARAM lParam // = 0L
  2226. )
  2227. {
  2228. ASSERT_VALID( this );
  2229. ASSERT( dc.GetSafeHdc() != NULL );
  2230. if( IsHighContrast() )
  2231. return 
  2232. CExtPaintManager::ReportGrid_PaintHeaderSortArrow(
  2233. dc,
  2234. rcSortArrow,
  2235. bAscending,
  2236. pHelperSrc,
  2237. lParam
  2238. );
  2239. static COLORREF ColorValues[4] =
  2240. {
  2241. RGB(0,0,0),
  2242. RGB(0,0,0),
  2243. RGB(0,0,0),
  2244. RGB(0,0,0),
  2245. };
  2246. return Grid_PaintHeaderSortArrow( dc, rcSortArrow, false, bAscending, ColorValues, pHelperSrc, lParam );
  2247. }
  2248. bool CExtPaintManagerSkin::ReportGrid_PaintGroupAreaBackground(
  2249. CDC & dc,
  2250. const RECT & rcArea,
  2251. __EXT_MFC_SAFE_LPCTSTR strEmptyAreaCaption, // not NULL if area is empty
  2252. CObject * pHelperSrc,
  2253. LPARAM lParam // = 0L
  2254. )
  2255. {
  2256. ASSERT_VALID( this );
  2257. ASSERT( dc.GetSafeHdc() != NULL );
  2258. if( IsHighContrast() )
  2259. return 
  2260. CExtPaintManager::ReportGrid_PaintGroupAreaBackground(
  2261. dc,
  2262. rcArea,
  2263. strEmptyAreaCaption,
  2264. pHelperSrc,
  2265. lParam
  2266. );
  2267. bool bSomeThemedBackground = false;
  2268. CExtSkinGlyph & glyphBack = m_Skin[_T("Background")][_T("ReportGroupArea")].Glyph( _T("Background") );
  2269. if( glyphBack.IsEmpty() )
  2270. {
  2271. CWnd * pWnd = DYNAMIC_DOWNCAST( CWnd, pHelperSrc );
  2272. if( pWnd != NULL
  2273. && PaintDockerBkgnd( true, dc, pWnd, lParam )
  2274. )
  2275. bSomeThemedBackground = true;
  2276. }
  2277. else
  2278. {
  2279. glyphBack.Draw( dc.m_hDC, rcArea );
  2280. bSomeThemedBackground = true;
  2281. }
  2282. if( bSomeThemedBackground )
  2283. {
  2284. CExtSkinColor & skinColor = m_Skin[_T("Grid")].Color( _T("ReportEmptyMessageColor") );
  2285. if( ! skinColor.IsHollow() )
  2286. {
  2287. INT nTextLen = 0;
  2288. if( strEmptyAreaCaption != NULL
  2289. && ( nTextLen = INT( _tcslen( strEmptyAreaCaption ) ) ) > 0
  2290. )
  2291. {
  2292. COLORREF clrEmptyMessageText = COLORREF( skinColor );
  2293. CRect rcCaption = rcArea;
  2294. rcCaption.DeflateRect( 5, 5, 0, 5 );
  2295. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  2296. COLORREF clrOldTextColor = dc.SetTextColor( clrEmptyMessageText );
  2297. dc.DrawText(
  2298. LPCTSTR(strEmptyAreaCaption),
  2299. nTextLen,
  2300. rcCaption,
  2301. DT_SINGLELINE|DT_NOCLIP
  2302. );
  2303. dc.SetTextColor( clrOldTextColor );
  2304. dc.SetBkMode( nOldBkMode );
  2305. }
  2306. }
  2307. return true;
  2308. }
  2309. return false;
  2310. }
  2311. COLORREF CExtPaintManagerSkin::ReportGrid_GetHeaderTextColor(
  2312. CObject * pHelperSrc,
  2313. LPARAM lParam // = 0L
  2314. )
  2315. {
  2316. ASSERT_VALID( this );
  2317. pHelperSrc;
  2318. lParam;
  2319. return COLORREF(-1L);
  2320. }
  2321. COLORREF CExtPaintManagerSkin::ReportGrid_GetGroupConnectorColor(
  2322. CObject * pHelperSrc,
  2323. LPARAM lParam // = 0L
  2324. )
  2325. {
  2326. ASSERT_VALID( this );
  2327. pHelperSrc;
  2328. lParam;
  2329. CExtSkinColor & skinColor = m_Skin[_T("Grid")].Color( _T("ReportGroupConnector") );
  2330. if( ! skinColor.IsHollow() )
  2331. {
  2332. COLORREF clr = COLORREF( skinColor );
  2333. return clr;
  2334. }
  2335. return COLORREF(-1L);
  2336. }
  2337. bool CExtPaintManagerSkin::ReportGrid_PaintGroupAreaItemBackground(
  2338. CDC & dc,
  2339. const RECT & rcItem,
  2340. CObject * pHelperSrc,
  2341. LPARAM lParam // = 0L
  2342. )
  2343. {
  2344. ASSERT_VALID( this );
  2345. pHelperSrc;
  2346. lParam;
  2347. const CExtSkinGlyph & _glyph =
  2348. m_Skin[_T("Grid")][_T("OuterBackground")][_T("ReportGroupAreaItem")]
  2349. .Glyph( _T("Background") );
  2350. _glyph.Draw( dc.m_hDC, rcItem );
  2351. return true;
  2352. }
  2353. #endif // (!defined __EXT_MFC_NO_REPORTGRIDWND)
  2354. CFont * CExtPaintManagerSkin::MenuCaptionGetFont(
  2355. CExtPopupMenuWnd * pPopup,
  2356. LPARAM lParam // = 0L
  2357. ) const
  2358. {
  2359. ASSERT_VALID( this );
  2360. ASSERT_VALID( pPopup );
  2361. if( IsHighContrast() )
  2362. return CExtPaintManager::MenuCaptionGetFont( pPopup, lParam );
  2363. return (CFont *)(&m_FontBold);
  2364. }
  2365. CSize CExtPaintManagerSkin::MenuCaption_Measure(
  2366. CDC & dc,
  2367. __EXT_MFC_SAFE_LPCTSTR sMenuCaptionText,
  2368. CExtPopupMenuWnd * pPopup,
  2369. LPARAM lParam // = 0L
  2370. ) const
  2371. {
  2372. ASSERT_VALID( this );
  2373. ASSERT( dc.GetSafeHdc() != NULL );
  2374. ASSERT_VALID( pPopup );
  2375. if( sMenuCaptionText == NULL )
  2376. return CSize( 0, 0 );
  2377. CExtSafeString _sText = sMenuCaptionText;
  2378. if( _sText.GetLength() == 0 )
  2379. return CSize( 0, 0 );
  2380. if( IsHighContrast() )
  2381. return
  2382. CExtPaintManager::MenuCaption_Measure(
  2383. dc,
  2384. sMenuCaptionText,
  2385. pPopup,
  2386. lParam
  2387. );
  2388. CFont * pFont = MenuCaptionGetFont( pPopup, lParam );
  2389. ASSERT( pFont->GetSafeHandle() != NULL );
  2390. CSize _size =
  2391. stat_CalcTextDimension(
  2392. dc,
  2393. *pFont,
  2394. _sText,
  2395. DT_SINGLELINE|DT_TOP|DT_LEFT
  2396. ).Size();
  2397. const CExtSkinGlyph & _glyph = m_Skin[_T("MenuCaption")].Glyph( _T("Background") );
  2398. const CRect & rcContentPadding = _glyph.GetContentPadding();
  2399. _size.cx += rcContentPadding.left + rcContentPadding.right;
  2400. _size.cy += rcContentPadding.top + rcContentPadding.bottom;
  2401. return _size;
  2402. }
  2403. void CExtPaintManagerSkin::MenuCaption_Paint(
  2404. CDC & dc,
  2405. const RECT & rcMenuCaption,
  2406. __EXT_MFC_SAFE_LPCTSTR sMenuCaptionText,
  2407. CExtPopupMenuWnd * pPopup,
  2408. LPARAM lParam // = 0L
  2409. ) const
  2410. {
  2411. ASSERT_VALID( this );
  2412. ASSERT( dc.GetSafeHdc() != NULL );
  2413. // ASSERT_VALID( pPopup );
  2414. if( ( ! dc.RectVisible( &rcMenuCaption ) )
  2415. //|| sMenuCaptionText == NULL
  2416. )
  2417. return;
  2418. if( IsHighContrast() )
  2419. {
  2420. CExtPaintManager::MenuCaption_Paint(
  2421. dc,
  2422. rcMenuCaption,
  2423. sMenuCaptionText,
  2424. pPopup,
  2425. lParam
  2426. );
  2427. return;
  2428. }
  2429. INT nTextLen = ( sMenuCaptionText != NULL ) ? INT( _tcslen( sMenuCaptionText ) ) : 0;
  2430. // if( nTextLen == 0 )
  2431. // return;
  2432. CRect _rcMenuCaption = rcMenuCaption;
  2433. if( _rcMenuCaption.IsRectEmpty()
  2434. || ( ! dc.RectVisible( &_rcMenuCaption ) )
  2435. )
  2436. return;
  2437. CRect _rcMenuCaptionBk = _rcMenuCaption;
  2438. //_rcMenuCaptionBk.InflateRect( 2, 2, 2, 0 );
  2439. const CExtSkinGlyph & _glyph = m_Skin[_T("MenuCaption")].Glyph( _T("Background") );
  2440. _glyph.Draw( dc.m_hDC, _rcMenuCaptionBk );
  2441. const CExtSkinColor & _color = m_Skin[_T("MenuCaption")].Color( _T("TextColor") );
  2442. if( ! _color.IsHollow() )
  2443. {
  2444. COLORREF clrMenuCaptionText = _color;
  2445. const CRect & rcContentPadding = _glyph.GetContentPadding();
  2446. _rcMenuCaption.DeflateRect( &rcContentPadding );
  2447. if( nTextLen != 0 )
  2448. {
  2449. bool bRTL = ( pPopup != NULL ) ? pPopup->OnQueryLayoutRTL() : false;
  2450. UINT nDT = DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS|DT_NOCLIP
  2451. | ( bRTL ? DT_RIGHT : DT_LEFT );
  2452. CFont * pFont = MenuCaptionGetFont( pPopup, lParam );
  2453. ASSERT( pFont->GetSafeHandle() != NULL );
  2454. CFont * pOldFont = dc.SelectObject( pFont );
  2455. COLORREF clrOldText = dc.SetTextColor( clrMenuCaptionText );
  2456. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  2457. dc.DrawText(
  2458. LPCTSTR( sMenuCaptionText ),
  2459. nTextLen,
  2460. &_rcMenuCaption,
  2461. nDT
  2462. );
  2463. dc.SetBkMode( nOldBkMode );
  2464. dc.SetTextColor( clrOldText );
  2465. dc.SelectObject( pOldFont );
  2466. } // if( nTextLen != 0 )
  2467. } // if( ! _color.IsHollow() )
  2468. }
  2469. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  2470. bool CExtPaintManagerSkin::Ribbon_OptionsPageBackgroundIsDefault() const
  2471. {
  2472. ASSERT_VALID( this );
  2473. return true;
  2474. }
  2475. CFont * CExtPaintManagerSkin::RibbonGallery_GetItemFont(
  2476. CExtRibbonGalleryWnd * pGalleryWnd,
  2477. LPVOID pGalleryItemData,
  2478. LPARAM lParam // = 0L
  2479. )
  2480. {
  2481. ASSERT_VALID( this );
  2482. ASSERT_VALID( pGalleryWnd );
  2483. if( IsHighContrast() )
  2484. return 
  2485. CExtPaintManager::RibbonGallery_GetItemFont(
  2486. pGalleryWnd,
  2487. pGalleryItemData,
  2488. lParam
  2489. );
  2490. CExtToolBoxWnd::TOOLBOX_ITEM_DATA * pTBCI =
  2491. (CExtToolBoxWnd::TOOLBOX_ITEM_DATA *)pGalleryItemData;
  2492. if( pTBCI->ItemGetNext( __TBCGN_PARENT ) == pGalleryWnd->ItemGetRoot() )
  2493. return (&m_FontBold);
  2494. else
  2495. return (&m_FontNormal);
  2496. }
  2497. CSize CExtPaintManagerSkin::RibbonGallery_MeasureItem(
  2498. CDC & dc,
  2499. CExtRibbonGalleryWnd * pGalleryWnd,
  2500. LPVOID pGalleryItemData,
  2501. LPARAM lParam // = 0L
  2502. )
  2503. {
  2504. ASSERT_VALID( this );
  2505. ASSERT( dc.GetSafeHdc() != NULL );
  2506. ASSERT_VALID( pGalleryWnd );
  2507. return 
  2508. CExtPaintManager::RibbonGallery_MeasureItem(
  2509. dc,
  2510. pGalleryWnd,
  2511. pGalleryItemData,
  2512. lParam
  2513. );
  2514. }
  2515. bool CExtPaintManagerSkin::RibbonGallery_DrawItem(
  2516. CDC & dc,
  2517. CExtRibbonGalleryWnd * pGalleryWnd,
  2518. const RECT & rcItem,
  2519. LPVOID pGalleryItemData,
  2520. LPARAM lParam // = 0L
  2521. )
  2522. {
  2523. ASSERT_VALID( this );
  2524. ASSERT( dc.GetSafeHdc() != NULL );
  2525. ASSERT_VALID( pGalleryWnd );
  2526. if( IsHighContrast() )
  2527. return 
  2528. CExtPaintManager::RibbonGallery_DrawItem(
  2529. dc,
  2530. pGalleryWnd,
  2531. rcItem,
  2532. pGalleryItemData,
  2533. lParam
  2534. );
  2535. CExtToolBoxWnd::TOOLBOX_ITEM_DATA * pTBCI =
  2536. (CExtToolBoxWnd::TOOLBOX_ITEM_DATA *)pGalleryItemData;
  2537. DWORD dwItemStyle = pTBCI->GetItemStyle();
  2538. CRect _rcItem = rcItem;
  2539. CSize sizeItem = _rcItem.Size();
  2540. if( (dwItemStyle & __TBWI_VISIBLE) == 0
  2541. || _rcItem.IsRectEmpty()
  2542. || (! dc.RectVisible( &_rcItem ) )
  2543. )
  2544. return true;
  2545. __EXT_MFC_SAFE_LPCTSTR sText = pTBCI->TextGet();
  2546. DWORD dwToolBoxWndStyles = pGalleryWnd->GetToolBoxWndStyle();
  2547. bool bTreeBoxes = ( (dwToolBoxWndStyles&__TBWS_TREE_BOXES) != 0 ) ? true : false;
  2548. bool bListViewMode = false;
  2549. CExtToolBoxWnd::TOOLBOX_ITEM_DATA * pTBCI_Parent = pTBCI->ItemGetNext( __TBCGN_PARENT );
  2550. CExtToolBoxWnd::TOOLBOX_ITEM_DATA * pTBCI_Root = pGalleryWnd->ItemGetRoot();
  2551. ASSERT( pTBCI_Parent != NULL );
  2552. if( pTBCI_Parent != pTBCI_Root )
  2553. {
  2554. bTreeBoxes = false;
  2555. ASSERT( pTBCI_Parent->ItemGetNext( __TBCGN_PARENT ) == pTBCI_Root );
  2556. if( pTBCI_Parent->GetItemStyle() & __TBWI_LISTBOX_VIEW )
  2557. bListViewMode = true;
  2558. LPCTSTR strItemState = _T("Disabled");
  2559. if( (dwItemStyle & __TBWI_ENABLED) != 0 )
  2560. {
  2561. strItemState = _T("Normal");
  2562. if( (dwItemStyle & (__TBWI_PRESSED|__TBWI_SELECTED) ) != 0 )
  2563. {
  2564. if( (dwItemStyle & __TBWI_HOVER) != 0 )
  2565. strItemState = _T("Hover");
  2566. else
  2567. strItemState = _T("Pressed");;
  2568. }
  2569. else if( (dwItemStyle & __TBWI_HOVER) != 0 )
  2570. strItemState = _T("Hover");
  2571. } // else if( _ppbd.m_bEnabled )
  2572. CExtSkinGlyph & _glyph = m_Skin[_T("Button")][_T("RibbonGallery")][strItemState].Glyph( _T("Background") );
  2573. _glyph.Draw( dc.m_hDC, rcItem );
  2574. } // if( pTBCI_Parent != pTBCI_Root )
  2575. else
  2576. {
  2577. bListViewMode = true;
  2578. MenuCaption_Paint(
  2579. dc,
  2580. rcItem,
  2581. sText,
  2582. ( pGalleryWnd->GetSafeHwnd() != NULL )
  2583. ? ( DYNAMIC_DOWNCAST( CExtPopupMenuWnd, pGalleryWnd->GetParent() ) )
  2584. : NULL
  2585. );
  2586. return true;
  2587. } // else from if( pTBCI_Parent != pTBCI_Root )
  2588. bool bMultipleExp = ( (dwToolBoxWndStyles&__TBWS_MULTIPLE_EXPANDED_GROUPS) != 0 ) ? true : false;
  2589. bool bAllowSelectionDrawing = true;
  2590. if( bMultipleExp
  2591. && pTBCI->ItemGetNext( __TBCGN_PARENT ) != pGalleryWnd->ItemGetActive()
  2592. )
  2593. bAllowSelectionDrawing = false;
  2594. bool bEnabled = (dwItemStyle & __TBWI_ENABLED) ? true : false;
  2595. CSize sizeIcon( 0, 0 );
  2596. CExtCmdIcon & _icon = pTBCI->IconGet();
  2597. sizeIcon = _icon.GetSize();
  2598. sizeIcon.cx = UiScalingDo( sizeIcon.cx, __EUIST_X );
  2599. sizeIcon.cy = UiScalingDo( sizeIcon.cy, __EUIST_Y );
  2600. if( bListViewMode )
  2601. {
  2602. if( (dwToolBoxWndStyles&(__TBWS_FLAT_GROUPS_2005|__TBWS_PM_BUTTONS)) != 0 )
  2603. _rcItem.DeflateRect( __EXT_TOOLBOXWND_2005_MARGIN_DX, 0 );
  2604. if( bTreeBoxes )
  2605. {
  2606. int nTreeBoxAreaDX = max( sizeItem.cy, __EXT_TOOLBOXWND_TREE_BOX_AREA_DY );
  2607. CRect rcTreeBox = _rcItem;
  2608. rcTreeBox.right = rcTreeBox.left + nTreeBoxAreaDX;
  2609. bool bPlus = true;
  2610. if( bMultipleExp )
  2611. {
  2612. if( (dwItemStyle&__TBWI_EXPANDED) != 0 )
  2613. bPlus = false;
  2614. } // if( bMultipleExp )
  2615. else
  2616. {
  2617. if( (dwItemStyle&__TBWI_ACTIVE) != 0 )
  2618. bPlus = false;
  2619. } // else from if( bMultipleExp )
  2620. pGalleryWnd->OnToolBoxWndDrawTreeBox(
  2621. pTBCI,
  2622. _rcItem,
  2623. rcTreeBox,
  2624. (! bPlus ),
  2625. dc
  2626. );
  2627. _rcItem.left += nTreeBoxAreaDX;
  2628. } // if( bTreeBoxes )
  2629. CRect rcText = _rcItem;
  2630. rcText.DeflateRect(
  2631. __EXT_TOOLBOXWND_ITEM_MARGIN_DX,
  2632. __EXT_TOOLBOXWND_ITEM_MARGIN_DY
  2633. );
  2634. if( ( ! _icon.IsEmpty() ) && sizeIcon.cx > 0 && sizeIcon.cy > 0 )
  2635. {
  2636. CRect rcIcon = rcText;
  2637. rcIcon.right = rcIcon.left + sizeIcon.cx;
  2638. rcText.left += sizeIcon.cx + __EXT_TOOLBOXWND_ICON2TEXT_DX;
  2639. rcIcon.top += (rcIcon.Height() - sizeIcon.cy) / 2;
  2640. _icon.Paint(
  2641. this,
  2642. dc.GetSafeHdc(),
  2643. rcIcon,
  2644. bEnabled
  2645. ? CExtCmdIcon::__PAINT_NORMAL
  2646. : CExtCmdIcon::__PAINT_DISABLED
  2647. );
  2648. }
  2649. if( (rcText.right - rcText.left > 6)
  2650. && (rcText.bottom - rcText.top > 6)
  2651. )
  2652. {
  2653. INT nTextLen = 0;
  2654. if( sText != NULL
  2655. && ( nTextLen = INT(_tcslen(sText)) ) > 0
  2656. )
  2657. {
  2658. CFont * pOldFont = dc.SelectObject( pTBCI->ItemGetFont() );
  2659. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  2660. CExtSkinItem & _item =  m_Skin[_T("MenuItem")][_T("MenuItem")][_T("Normal")];
  2661. COLORREF clrText = COLORREF( _item.Color( _T("TextColor") ) );
  2662. COLORREF clrTextOld = dc.SetTextColor( clrText );
  2663. CRect _rcText = rcText;
  2664. _rcText.OffsetRect( 0, -1 );
  2665. dc.DrawText(
  2666. sText,
  2667. nTextLen,
  2668. _rcText,
  2669. DT_SINGLELINE|DT_LEFT|DT_VCENTER|DT_END_ELLIPSIS
  2670. );
  2671. dc.SetTextColor( clrTextOld );
  2672. dc.SetBkMode( nOldBkMode );
  2673. dc.SelectObject( pOldFont );
  2674. }
  2675. }
  2676. } // if( bListViewMode )
  2677. else
  2678. {
  2679. if( ( ! _icon.IsEmpty() ) && sizeIcon.cx > 0 && sizeIcon.cy > 0 )
  2680. {
  2681. CRect rcIcon = _rcItem;
  2682. rcIcon.DeflateRect(
  2683. (rcIcon.Width() - sizeIcon.cx) / 2,
  2684. (rcIcon.Height() - sizeIcon.cy) / 2
  2685. );
  2686. rcIcon.right = rcIcon.left + sizeIcon.cx;
  2687. rcIcon.bottom = rcIcon.top + sizeIcon.cy;
  2688. _icon.Paint(
  2689. this,
  2690. dc.GetSafeHdc(),
  2691. rcIcon,
  2692. bEnabled
  2693. ? CExtCmdIcon::__PAINT_NORMAL
  2694. : CExtCmdIcon::__PAINT_DISABLED 
  2695. );
  2696. }
  2697. } // else from if( bListViewMode )
  2698. CWnd * pWnd = pGalleryWnd->GetParent();
  2699. if( pWnd != NULL
  2700. && pWnd->IsKindOf( RUNTIME_CLASS( CExtRibbonGalleryPopupMenuWnd ) )
  2701. && (((CExtRibbonGalleryPopupMenuWnd*)pWnd)->TrackFlagsGet()&TPMX_RIBBON_FILE_MENU)
  2702. )
  2703. {
  2704. CRect rcClient;
  2705. pGalleryWnd->GetClientRect( &rcClient );
  2706. dc.FillSolidRect( rcClient.left, rcClient.top, 1, rcClient.Height(), RGB(197,197,197) );
  2707. dc.FillSolidRect( rcClient.left+1, rcClient.top, 1, rcClient.Height(), RGB(245,245,245) );
  2708. }
  2709. return true;
  2710. }
  2711. bool CExtPaintManagerSkin::RibbonGallery_EraseEntireBk(
  2712. CDC & dc,
  2713. const CRect & rcClient,
  2714. const CRect & rcActiveChildArea,
  2715. CRgn & rgnActiveChildArea,
  2716. const CRect & rcActiveChildArea2,
  2717. CRgn & rgnActiveChildArea2,
  2718. CExtRibbonGalleryWnd * pGalleryWnd,
  2719. LPARAM lParam // = 0L
  2720. )
  2721. {
  2722. ASSERT_VALID( this );
  2723. ASSERT( dc.GetSafeHdc() != NULL );
  2724. ASSERT_VALID( pGalleryWnd );
  2725. return 
  2726. CExtPaintManager::RibbonGallery_EraseEntireBk(
  2727. dc,
  2728. rcClient,
  2729. rcActiveChildArea,
  2730. rgnActiveChildArea,
  2731. rcActiveChildArea2,
  2732. rgnActiveChildArea2,
  2733. pGalleryWnd,
  2734. lParam
  2735. );
  2736. }
  2737. void CExtPaintManagerSkin::RibbonGallery_PaintScrollArea(
  2738. CDC & dc,
  2739. CExtRibbonGalleryInplaceScrollBar * pSB,
  2740. LPARAM lParam // = 0L
  2741. )
  2742. {
  2743. ASSERT_VALID( this );
  2744. ASSERT( dc.GetSafeHdc() != NULL );
  2745. ASSERT_VALID( pSB );
  2746. ASSERT( pSB->GetSafeHwnd() != NULL );
  2747. if( IsHighContrast() )
  2748. {
  2749. CExtPaintManager::RibbonGallery_PaintScrollArea(
  2750. dc,
  2751. pSB,
  2752. lParam
  2753. );
  2754. return;
  2755. }
  2756. PaintDockerBkgnd( true, dc, pSB, lParam );
  2757. CRect rcClient;
  2758. pSB->GetClientRect( &rcClient );
  2759. bool bKeyFocusMode = false;
  2760. CExtRibbonGalleryWnd * pRibbonGalleryWnd =
  2761. STATIC_DOWNCAST( CExtRibbonGalleryWnd, pSB->GetParent() );
  2762. if( pRibbonGalleryWnd->m_bInPlaceGallery
  2763. && pRibbonGalleryWnd->_IsKeyFocusGallery()
  2764. )
  2765. bKeyFocusMode = true;
  2766. INT nIndex, nCount = sizeof(pSB->m_arrButtons) / sizeof(pSB->m_arrButtons[0]);
  2767. INT nNextTop = 0;
  2768. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  2769. {
  2770. bool bForceHover = false;
  2771. CRect rc = pSB->RgBtnGetRect( (CExtRibbonGalleryInplaceScrollBar::e_ButtonType_t)nIndex );
  2772. INT nBtnHeightSrc = -1;
  2773. INT nBtnHeightDst = -1; // UiScalingDo( nBtnHeightSrc, __EUIST_X );
  2774. LPCTSTR strSubPath = NULL;
  2775. switch( nIndex )
  2776. {
  2777. case INT(CExtRibbonGalleryInplaceScrollBar::__BTT_UP):
  2778. strSubPath = _T("ButtonUp");
  2779. if( nBtnHeightSrc < 0 )
  2780. {
  2781. nBtnHeightSrc = 21;
  2782. nBtnHeightDst = UiScalingDo( nBtnHeightSrc, __EUIST_X );
  2783. }
  2784. break;
  2785. case INT(CExtRibbonGalleryInplaceScrollBar::__BTT_DOWN):
  2786. strSubPath = _T("ButtonDown");
  2787. if( nBtnHeightSrc < 0 )
  2788. {
  2789. nBtnHeightSrc = 19;
  2790. nBtnHeightDst = UiScalingDo( nBtnHeightSrc, __EUIST_X );
  2791. }
  2792. break;
  2793. case INT(CExtRibbonGalleryInplaceScrollBar::__BTT_MENU):
  2794. strSubPath = _T("ButtonMenu");
  2795. if( nBtnHeightSrc < 0 )
  2796. {
  2797. nBtnHeightSrc = 20;
  2798. nBtnHeightDst = UiScalingDo( nBtnHeightSrc, __EUIST_X );
  2799. }
  2800. if( bKeyFocusMode )
  2801. bForceHover = true;
  2802. break;
  2803. } // switch( nIndex )
  2804. if( strSubPath == NULL )
  2805. continue;
  2806. ASSERT( nBtnHeightSrc > 0 );
  2807. ASSERT( nBtnHeightDst > 0 );
  2808. LPCTSTR strState = _T("Normal");
  2809. rc.top = nNextTop;
  2810. rc.bottom = rc.top + nBtnHeightDst;
  2811. CExtRibbonGalleryInplaceScrollBar::e_ButtonState_t eBST = pSB->m_arrButtons[ nIndex ];
  2812. if( bForceHover )
  2813. eBST = CExtRibbonGalleryInplaceScrollBar::__BST_HOVER;
  2814. switch( eBST )
  2815. {
  2816. case CExtRibbonGalleryInplaceScrollBar::__BST_DISABLED:
  2817. strState = _T("Disabled");
  2818. break;
  2819. case CExtRibbonGalleryInplaceScrollBar::__BST_NORMAL:
  2820. break;
  2821. case CExtRibbonGalleryInplaceScrollBar::__BST_HOVER:
  2822. strState = _T("Hover");
  2823. break;
  2824. case CExtRibbonGalleryInplaceScrollBar::__BST_PRESSED:
  2825. strState = _T("Pressed");
  2826. break;
  2827. } // switch( eBST )
  2828. CExtSkinGlyph & _glyphButtonBackground = m_Skin[_T("RibbonScrollBar")][strSubPath][strState].Glyph(_T("Background"));
  2829. CExtSkinGlyph & _glyphButtonArrow = m_Skin[_T("RibbonScrollBar")][strSubPath][strState].Glyph(_T("Arrow"));
  2830. if( rc.bottom > rcClient.bottom )
  2831. rc.bottom = rcClient.bottom;
  2832. _glyphButtonBackground.Draw( dc.m_hDC, rc );
  2833. _glyphButtonArrow.Draw( dc.m_hDC, rc );
  2834. nNextTop = rc.bottom;
  2835. }
  2836. }
  2837. bool CExtPaintManagerSkin::Ribbon_GroupCaptionIsAtTop(
  2838. const CExtRibbonButtonGroup * pGroupTBB,
  2839. LPARAM lParam // = 0L
  2840. ) const
  2841. {
  2842. ASSERT_VALID( this );
  2843. pGroupTBB;
  2844. lParam;
  2845. return false;
  2846. }
  2847. void CExtPaintManagerSkin::Ribbon_PaintGroupBk(
  2848. CDC & dc,
  2849. const RECT & rcGroupBk,
  2850. const CExtRibbonButtonGroup * pGroupTBB,
  2851. LPARAM lParam // = 0L
  2852. )
  2853. {
  2854. ASSERT_VALID( this );
  2855. if( IsHighContrast() )
  2856. {
  2857. CExtPaintManager::Ribbon_PaintGroupBk( dc, rcGroupBk, pGroupTBB, lParam );
  2858. return;
  2859. }
  2860. //  if( pGroupTBB->ParentButtonGet() != NULL )
  2861. //  return;
  2862. //  if( pGroupTBB->GetBar()->GetParent()->IsKindOf( RUNTIME_CLASS(CExtPopupMenuWnd) ) )
  2863. //  return;
  2864. // CExtSkinGlyph & _glyph = m_Skin[_T("Ribbon")][_T("Group")].Glyph(_T("Background"));
  2865. //  _glyph.Draw( dc.m_hDC, rcGroupBk );
  2866. ASSERT_VALID( this );
  2867. ASSERT( dc.GetSafeHdc() != NULL );
  2868. ASSERT_VALID( pGroupTBB );
  2869. if( pGroupTBB->ParentButtonGet() != NULL )
  2870. return;
  2871. if( ::IsRectEmpty( &rcGroupBk ) )
  2872. return;
  2873. if( ! dc.RectVisible( &rcGroupBk ) )
  2874. return;
  2875. CRect _rcGroupBk = rcGroupBk;
  2876. _rcGroupBk.InflateRect( 0, 0, 1, 1 );
  2877. CExtSafeString strCaptionText = pGroupTBB->GetText();
  2878. INT nCaptionTextLength = strCaptionText.GetLength();
  2879. bool bEnabled = pGroupTBB->IsEnabled();
  2880. bool bHover = ( bEnabled && pGroupTBB->IsHover() ) ? true : false;
  2881. if( bHover && pGroupTBB->GetBar()->GetMenuTrackingButton() >= 0 )
  2882. bHover = false;
  2883. bool bCollapsed = pGroupTBB->TopCollapsedStateGet();
  2884. if( bCollapsed )
  2885. {
  2886. bool bPressed = false;
  2887. if( bEnabled )
  2888. bPressed = pGroupTBB->IsPressed();
  2889. PAINTPUSHBUTTONDATA _ppbd;
  2890. _ppbd.m_rcClient = _rcGroupBk;
  2891. _ppbd.m_bFlat = false;
  2892. _ppbd.m_bEnabled = bEnabled;
  2893. _ppbd.m_bHover = bHover;
  2894. _ppbd.m_bPushed = bPressed;
  2895. _ppbd.m_bHorz = true;
  2896. PaintPushButton( dc, _ppbd );
  2897. CExtCmdIcon * pCmdIcon = Ribbon_GetGroupCollapsedIcon( pGroupTBB, lParam );
  2898. //CExtCmdIcon * pCmdIcon = ((CExtBarButton*)pGroupTBB)->GetIconPtr();
  2899. CRect rcIconArea = _rcGroupBk, rcTextArea = _rcGroupBk;
  2900. if( pCmdIcon != NULL && (! pCmdIcon->IsEmpty() ) )
  2901. {
  2902. CSize _sizeIcon = pCmdIcon->GetSize();
  2903. rcIconArea.left += ( rcIconArea.Width() - _sizeIcon.cx ) / 2;
  2904. rcIconArea.top += ( rcIconArea.Height() - _sizeIcon.cy ) / 2 - 6;
  2905. rcIconArea.right = rcIconArea.left + _sizeIcon.cx;
  2906. rcIconArea.bottom = rcIconArea.top + _sizeIcon.cy;
  2907. rcTextArea.top = rcIconArea.bottom + 7;
  2908. } // if( pCmdIcon != NULL && (! pCmdIcon->IsEmpty() ) )
  2909. else
  2910. rcTextArea.top += 16;
  2911. rcIconArea.OffsetRect( 0, -10 );
  2912. if( pCmdIcon != NULL && (! pCmdIcon->IsEmpty() ) )
  2913. {
  2914. pCmdIcon->Paint(
  2915. this,
  2916. dc,
  2917. rcIconArea.left,
  2918. rcIconArea.top,
  2919. -1,
  2920. -1
  2921. );
  2922. } // if( pCmdIcon != NULL && (! pCmdIcon->IsEmpty() ) )
  2923. if( nCaptionTextLength > 0 )
  2924. {
  2925. LPCTSTR strState = _T("Normal");
  2926. if( bPressed )
  2927. strState = _T("Pressed");
  2928. else if( bHover )
  2929. strState = _T("Hover");
  2930.   const CExtSkinColor & skinTextColor = m_Skin[_T("Ribbon")][_T("Group")][_T("Collapsed")][strState].Color( _T("RibbonGroupCaptionTextColor") );
  2931. if( ! skinTextColor.IsHollow() )
  2932. {
  2933. CExtRibbonPage * pRibbonPage = const_cast < CExtRibbonPage * > ( pGroupTBB->GetRibbonPage() );
  2934. ASSERT_VALID( pRibbonPage );
  2935. ASSERT( pRibbonPage->GetSafeHwnd() != NULL );
  2936. CFont * pFont = pRibbonPage->OnGetToolbarFont( false, false );
  2937. ASSERT( pFont->GetSafeHandle() != NULL );
  2938. //CFont * pOldFont = dc.SelectObject( pFont );
  2939. CFont * pOldFont = dc.SelectObject( &m_FontRibbonGroupCaption );
  2940. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  2941. COLORREF clrOldTextColor = dc.SetTextColor( COLORREF(skinTextColor) );
  2942. CRect rcCaption = rcTextArea;
  2943. rcCaption.OffsetRect( 0, -5 );
  2944. // dc.DrawText(
  2945. // LPCTSTR( strCaptionText ),
  2946. // nCaptionTextLength,
  2947. // &rcCaption,
  2948. // DT_CENTER|DT_TOP //m_nRibbonGroupCaptionTextDF
  2949. // );
  2950. Ribbon_PaintText(
  2951. dc,
  2952. LPCTSTR( strCaptionText ),
  2953. rcCaption,
  2954. DT_CENTER|DT_TOP,
  2955. true,
  2956. NULL,
  2957. (CObject*)pGroupTBB,
  2958. lParam
  2959. );
  2960. dc.SetTextColor( clrOldTextColor );
  2961. dc.SetBkMode( nOldBkMode );
  2962. dc.SelectObject( pOldFont );
  2963. } // if( ! skinTextColor.IsHollow() )
  2964. } // if( nCaptionTextLength > 0 )
  2965. } // if( bCollapsed )
  2966. else
  2967. {
  2968. const CExtRibbonPage * pRibbonPage = pGroupTBB->GetRibbonPage();
  2969. ASSERT_VALID( pRibbonPage );
  2970. CWnd * pWndParent = pRibbonPage->GetParent();
  2971. bool bDrawCaption = true, bPopupMode =
  2972. ( pWndParent != NULL
  2973. && pWndParent->IsKindOf( RUNTIME_CLASS( CExtRibbonPopupMenuWnd ) )
  2974. && (! ((CExtRibbonPopupMenuWnd*)pWndParent)->m_wndRibbonPage.m_bHelperAutoHideMode )
  2975. ) ? true : false;
  2976. INT nCaptionHeight = 0;
  2977. if( bPopupMode && (! Ribbon_IsPopupGroupWithCaption( (CObject*) pRibbonPage ) ) )
  2978. {
  2979. bDrawCaption = false;
  2980. strCaptionText.Empty();
  2981. nCaptionTextLength = 0;
  2982. }
  2983. else
  2984. {
  2985. strCaptionText.Replace( _T("r"), _T(" ") );
  2986. strCaptionText.Replace( _T("n"), _T(" ") );
  2987. strCaptionText.Replace( _T("t"), _T(" ") );
  2988. strCaptionText.Replace( _T("  "), _T(" ") );
  2989. strCaptionText.TrimLeft( _T(" ") );
  2990. strCaptionText.TrimRight( _T(" ") );
  2991. nCaptionHeight = Ribbon_GroupCaptionGetHeight( pGroupTBB, lParam );
  2992. ASSERT( nCaptionHeight >= 0 );
  2993. }
  2994. //  COLORREF clrBorder = RGB(0,0,0);
  2995. //  if( bEnabled )
  2996. //  {
  2997. //  if( bHover )
  2998. //  {
  2999. //  clrBorder = GetColor( COLOR_3DDKSHADOW );
  3000. //  dc.FillRect( &_rcGroupBk, &m_brushLighterDefault );
  3001. //  } // if( bHover )
  3002. //  else
  3003. //  clrBorder = GetColor( COLOR_3DSHADOW );
  3004. //  } // if( bEnabled )
  3005. //  else
  3006. //  clrBorder = GetColor( COLOR_3DSHADOW );
  3007. if( nCaptionHeight > 0 && nCaptionTextLength > 0 )
  3008. {
  3009. CRect rcCaption = _rcGroupBk;
  3010. bool bTopCaption = Ribbon_GroupCaptionIsAtTop( pGroupTBB );
  3011. if( bTopCaption )
  3012. rcCaption.bottom = rcCaption.top + nCaptionHeight;
  3013. else
  3014. rcCaption.top = rcCaption.bottom - nCaptionHeight;
  3015. //  dc.FillSolidRect( &rcCaption, GetColor( COLOR_3DSHADOW ) );
  3016. //  dc.Draw3dRect( &rcCaption, clrBorder, clrBorder );
  3017. if( pGroupTBB->ParentButtonGet() != NULL )
  3018. return;
  3019. if( pGroupTBB->GetBar()->GetParent()->IsKindOf( RUNTIME_CLASS(CExtPopupMenuWnd) ) )
  3020. return;
  3021. CExtSkinGlyph & _glyph = m_Skin[_T("Ribbon")][_T("Group")].Glyph(_T("Background"));
  3022. _glyph.Draw( dc.m_hDC, rcGroupBk );
  3023. CExtRibbonPage * pRibbonPage = const_cast < CExtRibbonPage * > ( pGroupTBB->GetRibbonPage() );
  3024. ASSERT_VALID( pRibbonPage );
  3025. ASSERT( pRibbonPage->GetSafeHwnd() != NULL );
  3026. CFont * pFont = pRibbonPage->OnGetToolbarFont( false, false );
  3027. ASSERT( pFont->GetSafeHandle() != NULL );
  3028. CRect rcCaptionTextAlignmentDLB =
  3029. pGroupTBB->GetCaptionTextAlignmentRect();
  3030. if( ! rcCaptionTextAlignmentDLB.IsRectEmpty() )
  3031. {
  3032. rcCaption.left =
  3033. max(
  3034. rcCaption.left,
  3035. rcCaptionTextAlignmentDLB.left
  3036. );
  3037. rcCaption.right =
  3038. min(
  3039. rcCaption.right,
  3040. rcCaptionTextAlignmentDLB.right
  3041. );
  3042. } // if( ! rcCaptionTextAlignmentDLB.IsRectEmpty() )
  3043. /// CExtSkinColor & skinTextColor = m_Skin[_T("Button")][_T("Simple")][_T("Control")].Color( _T("Normal") );
  3044. LPCTSTR strState = _T("Normal");
  3045. if( bHover )
  3046. strState = _T("Hover");
  3047. const CExtSkinColor & skinTextColor = m_Skin[_T("Ribbon")][_T("Group")][_T("Expanded")][strState].Color( _T("RibbonGroupCaptionTextColor") );
  3048. if( ! skinTextColor.IsHollow() )
  3049. {
  3050. CFont * pOldFont = dc.SelectObject( &m_FontRibbonGroupCaption );
  3051. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  3052. COLORREF clrOldTextColor = dc.SetTextColor( COLORREF(skinTextColor) );
  3053. UINT nRibbonGroupCaptionTextShadowDF = DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_END_ELLIPSIS;
  3054. dc.DrawText(
  3055. LPCTSTR( strCaptionText ),
  3056. nCaptionTextLength,
  3057. &rcCaption,
  3058. nRibbonGroupCaptionTextShadowDF
  3059. );
  3060. dc.SetTextColor( clrOldTextColor );
  3061. dc.SetBkMode( nOldBkMode );
  3062. dc.SelectObject( pOldFont );
  3063. }
  3064. } // if( nCaptionHeight > 0 && nCaptionTextLength > 0 )
  3065. } // else from if( bCollapsed )
  3066. }
  3067. void CExtPaintManagerSkin::Ribbon_PaintPageBk(
  3068. CDC & dc,
  3069. const RECT & rcPageBk,
  3070. const CExtRibbonPage * pRibbonPage,
  3071. LPARAM lParam // = 0L
  3072. )
  3073. {
  3074. ASSERT_VALID( this );
  3075. if( IsHighContrast() )
  3076. {
  3077. CExtPaintManager::Ribbon_PaintPageBk( dc, rcPageBk, pRibbonPage, lParam );
  3078. return;
  3079. }
  3080. if( pRibbonPage->GetParent()->IsKindOf( RUNTIME_CLASS(CExtPopupMenuWnd) ) )
  3081. return;
  3082. CExtSkinGlyph & _glyph = m_Skin[_T("Ribbon")][_T("Page")].Glyph(_T("Background"));
  3083. _glyph.Draw( dc.m_hDC, rcPageBk );
  3084. }
  3085. void CExtPaintManagerSkin::Ribbon_PaintPushButton(
  3086. CDC & dc,
  3087. CExtPaintManager::PAINTPUSHBUTTONDATA & _ppbd
  3088. )
  3089. {
  3090. ASSERT_VALID( this );
  3091. ASSERT( dc.GetSafeHdc() != NULL );
  3092. if( _ppbd.m_rcClient.IsRectEmpty() )
  3093. return;
  3094. if( ! dc.RectVisible( &_ppbd.m_rcClient ) )
  3095. return;
  3096. if( IsHighContrast() )
  3097. {
  3098. CExtPaintManager::Ribbon_PaintPushButton( dc, _ppbd );
  3099. return;
  3100. }
  3101. ASSERT_VALID( _ppbd.m_pHelperSrc );
  3102. CExtBarButton * pTBB = DYNAMIC_DOWNCAST( CExtBarButton, _ppbd.m_pHelperSrc );
  3103. ASSERT( pTBB != NULL );
  3104. CExtBarButton * pParentTBB = pTBB->ParentButtonGet();
  3105. CExtRibbonButton * pRibbonTBB = DYNAMIC_DOWNCAST( CExtRibbonButton, _ppbd.m_pHelperSrc );
  3106. CExtSafeString strText = pTBB->GetText();
  3107. INT nTextLength = strText.GetLength();
  3108. bool bDLB = false;
  3109. if( nTextLength == 0
  3110. && _ppbd.m_pHelperSrc != NULL
  3111. && _ppbd.m_pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonDialogLauncher ) )
  3112. )
  3113. {
  3114. bDLB = true;
  3115. strText = _T("...");
  3116. nTextLength = strText.GetLength();
  3117. }
  3118. enum e_layout_case_t
  3119. {
  3120. __ELC_TOOL,
  3121. __ELC_SMALL,
  3122. __ELC_LARGE,
  3123. };
  3124. e_layout_case_t eLC = __ELC_TOOL;
  3125. if( bDLB )
  3126. eLC = __ELC_SMALL;
  3127. else if( pRibbonTBB != NULL )
  3128. {
  3129. if( pParentTBB == NULL
  3130. || pParentTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonToolGroup ) )
  3131. )
  3132. {
  3133. if( pParentTBB == NULL )
  3134. {
  3135. const CExtRibbonNode * pRibbonNode = pTBB->Ribbon_GetNode();
  3136. if( pRibbonNode != NULL )
  3137. {
  3138. const CExtCustomizeCmdTreeNode * pParentNode = pRibbonNode->GetParentNode();
  3139. if( pParentNode != NULL
  3140. && ( pParentNode->IsKindOf( RUNTIME_CLASS( CExtRibbonNodeRightButtonsCollection ) )
  3141. || pParentNode->IsKindOf( RUNTIME_CLASS( CExtRibbonNodeQuickAccessButtonsCollection ) )
  3142. )
  3143. )
  3144. eLC = __ELC_SMALL;
  3145. } // if( pRibbonNode != NULL )
  3146. } // if( pParentTBB == NULL )
  3147. }
  3148. else
  3149. {
  3150. if( pRibbonTBB->RibbonILV_Get() == __EXT_RIBBON_ILV_SIMPLE_LARGE )
  3151. eLC = __ELC_LARGE;
  3152. else
  3153. eLC = __ELC_SMALL;
  3154. }
  3155. } // else if( pRibbonTBB != NULL )
  3156. else
  3157. {
  3158. if( pParentTBB == NULL
  3159. || ( ! pParentTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonToolGroup ) ) )
  3160. )
  3161. eLC = __ELC_SMALL;
  3162. } // if( pRibbonTBB != NULL )
  3163. //_ppbd.m_bDropDown = true;
  3164. //_ppbd.m_bSeparatedDropDown = true;
  3165. //_ppbd.m_bPushedDropDown = true;
  3166. INT nILV = pTBB->RibbonILV_Get();
  3167. CRect rcCP = pTBB->OnRibbonGetContentPadding();
  3168. CRect rcIcon = _ppbd.m_rcClient;
  3169. rcIcon.DeflateRect(
  3170. rcCP.left,
  3171. rcCP.top,
  3172. rcCP.right,
  3173. rcCP.bottom
  3174. );
  3175. INT nTextToIconDistance = 0;
  3176. CRect rcText =  rcIcon;
  3177. CSize _sizeIcon( 0, 0 );
  3178. CExtCmdIcon * pCmdIcon = pTBB->GetIconPtr();
  3179. if( pCmdIcon != NULL && (! pCmdIcon->IsEmpty() ) )
  3180. {
  3181. _sizeIcon = Ribbon_GetIconSize( pTBB, nILV, _ppbd.m_lParam );
  3182. if( nTextLength >= 0 )
  3183. nTextToIconDistance = Ribbon_GetTextToIconDistance( dc, nILV, pTBB, _ppbd.m_lParam );
  3184. if( eLC == __ELC_LARGE )
  3185. {
  3186. rcIcon.bottom = rcIcon.top + _sizeIcon.cy;
  3187. rcIcon.OffsetRect( ( rcIcon.Width() - _sizeIcon.cx ) / 2, 4 );
  3188. if( nTextLength > 0 )
  3189. {
  3190. rcText.top = rcIcon.bottom;
  3191. rcText.top += nTextToIconDistance;
  3192. };
  3193. } // if( eLC == __ELC_LARGE )
  3194. else
  3195. {
  3196. if( nTextLength > 0 )
  3197. {
  3198. rcIcon.right = rcText.left = rcIcon.left + _sizeIcon.cx;
  3199. rcText.left += nTextToIconDistance;
  3200. }
  3201. else
  3202. {
  3203. rcIcon = _ppbd.m_rcClient;
  3204. if( pTBB->IsAbleToTrackMenu()
  3205. //&& _ppbd.m_bSeparatedDropDown
  3206. && (! pTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonGroup ) ) )
  3207. )
  3208. rcIcon.right -= GetDropDownButtonWidth( _ppbd.m_pHelperSrc, _ppbd.m_lParam );
  3209. rcIcon.OffsetRect( ( rcIcon.Width() - _sizeIcon.cx ) / 2 + 1, 0 );
  3210. }
  3211. rcIcon.OffsetRect( 0, ( rcIcon.Height() - _sizeIcon.cy ) / 2 );
  3212. } // else from if( eLC == __ELC_LARGE )
  3213. } // if( pCmdIcon != NULL && (! pCmdIcon->IsEmpty() ) )
  3214. else
  3215. pCmdIcon = NULL;
  3216. const CExtSkinColor * pSkinTextColor = NULL;
  3217. bool bDrawDropDownWithText = _ppbd.m_bDropDown;
  3218. switch( eLC )
  3219. {
  3220. case __ELC_LARGE:
  3221. ASSERT_VALID( pTBB );
  3222. rcText = Ribbon_CalcLargeDropDownRect( pTBB );
  3223. if( ! pTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButton ) ) )
  3224. bDrawDropDownWithText = false;
  3225. if( _ppbd.m_bSeparatedDropDown )
  3226. {
  3227. LPCTSTR strState1 = _T("Normal");
  3228. if( ! _ppbd.m_bEnabled )
  3229. strState1 = _T("Disabled");
  3230. else if( ( _ppbd.m_bPushed && (!_ppbd.m_bPushedDropDown) ) || _ppbd.m_bIndeterminate )
  3231. strState1 = _T("Pressed");
  3232. else if( _ppbd.m_bPushed && _ppbd.m_bPushedDropDown )
  3233. strState1 = _T("Hover");
  3234. else if( _ppbd.m_bHover && (!_ppbd.m_bHoverDropDown) )
  3235. strState1 = _T("Hover");
  3236. else if( _ppbd.m_bHover && _ppbd.m_bHoverDropDown )
  3237. strState1 = _T("HoverNP");
  3238. LPCTSTR strState2 = _T("Normal");
  3239. if( ! _ppbd.m_bEnabled )
  3240. strState2 = _T("Disabled");
  3241. else if( _ppbd.m_bPushed || _ppbd.m_bIndeterminate )
  3242. strState2 = _T("Pressed");
  3243. else if( _ppbd.m_bHover && _ppbd.m_bHoverDropDown )
  3244. strState2 = _T("Hover");
  3245. else if( _ppbd.m_bHover && (!_ppbd.m_bHoverDropDown) )
  3246. strState2 = _T("HoverNP");
  3247. CRect rcB = _ppbd.m_rcClient;
  3248. CRect rcD = _ppbd.m_rcClient;
  3249. rcB.bottom = rcD.top = rcText.top;
  3250. const CExtSkinGlyph & _glyphB = m_Skin[_T("Button")][_T("RibbonButton")][_T("Large")][_T("SplitButton")][_T("PushButton")][strState1].Glyph( _T("Background") );
  3251. _glyphB.Draw( dc.m_hDC, rcB );
  3252. const CExtSkinGlyph & _glyphD = m_Skin[_T("Button")][_T("RibbonButton")][_T("Large")][_T("SplitButton")][_T("DropDownButton")][strState2].Glyph( _T("Background") );
  3253. _glyphD.Draw( dc.m_hDC, rcD );
  3254. const CExtSkinColor & skinTextColor = m_Skin[_T("Button")][_T("RibbonButton")][_T("Large")][_T("SplitButton")][_T("DropDownButton")][strState2].Color( _T("RibbonButtonTextColor") );
  3255. pSkinTextColor = &skinTextColor;
  3256. }
  3257. else
  3258. {
  3259. LPCTSTR strState = _T("Normal");
  3260. if( ! _ppbd.m_bEnabled )
  3261. strState = _T("Disabled");
  3262. else if( _ppbd.m_bPushed || _ppbd.m_bIndeterminate )
  3263. strState = _T("Pressed");
  3264. else if( _ppbd.m_bHover )
  3265. strState = _T("Hover");
  3266. const CExtSkinGlyph & _glyph = m_Skin[_T("Button")][_T("RibbonButton")][_T("Large")][ _ppbd.m_bDropDown ? _T("DropDownButton") : _T("PushButton") ][strState].Glyph( _T("Background") );
  3267. _glyph.Draw( dc.m_hDC, _ppbd.m_rcClient );
  3268. const CExtSkinColor & skinTextColor = m_Skin[_T("Button")][_T("RibbonButton")][_T("Large")][ _ppbd.m_bDropDown ? _T("DropDownButton") : _T("PushButton") ][strState].Color( _T("RibbonButtonTextColor") );
  3269. pSkinTextColor = &skinTextColor;
  3270. }
  3271. break; // case __ELC_LARGE
  3272. case __ELC_TOOL:
  3273. case __ELC_SMALL:
  3274. {
  3275. LPCTSTR strBT = ( eLC == __ELC_TOOL ) ? _T("Tool") : _T("Small");
  3276. if( _ppbd.m_bSeparatedDropDown )
  3277. {
  3278. LPCTSTR strState1 = _T("Normal");
  3279. if( ! _ppbd.m_bEnabled )
  3280. strState1 = _T("Disabled");
  3281. else if( ( _ppbd.m_bPushed && (!_ppbd.m_bPushedDropDown) ) || _ppbd.m_bIndeterminate )
  3282. strState1 = _T("Pressed");
  3283. else if( _ppbd.m_bPushed && _ppbd.m_bPushedDropDown )
  3284. strState1 = _T("Hover");
  3285. else if( _ppbd.m_bHover && (!_ppbd.m_bHoverDropDown) )
  3286. strState1 = _T("Hover");
  3287. else if( _ppbd.m_bHover && _ppbd.m_bHoverDropDown )
  3288. strState1 = _T("HoverNP");
  3289. LPCTSTR strState2 = _T("Normal");
  3290. if( ! _ppbd.m_bEnabled )
  3291. strState2 = _T("Disabled");
  3292. else if( _ppbd.m_bPushed || _ppbd.m_bIndeterminate )
  3293. strState2 = _T("Pressed");
  3294. else if( _ppbd.m_bHover && _ppbd.m_bHoverDropDown )
  3295. strState2 = _T("Hover");
  3296. else if( _ppbd.m_bHover && (!_ppbd.m_bHoverDropDown) )
  3297. strState2 = _T("HoverNP");
  3298. INT nDropDownButtonWidth = GetDropDownButtonWidth( _ppbd.m_pHelperSrc, _ppbd.m_lParam );
  3299. CRect rcB = _ppbd.m_rcClient;
  3300. CRect rcD = _ppbd.m_rcClient;
  3301. rcB.right -= nDropDownButtonWidth;
  3302. rcD.left = rcB.right;
  3303. const CExtSkinGlyph & _glyphB = m_Skin[_T("Button")][_T("RibbonButton")][strBT][_T("SplitButton")][_T("PushButton")][strState1].Glyph( _T("Background") );
  3304. _glyphB.Draw( dc.m_hDC, rcB );
  3305. const CExtSkinGlyph & _glyphD = m_Skin[_T("Button")][_T("RibbonButton")][strBT][_T("SplitButton")][_T("DropDownButton")][strState2].Glyph( _T("Background") );
  3306. _glyphD.Draw( dc.m_hDC, rcD );
  3307. const CExtSkinColor & skinTextColor = m_Skin[_T("Button")][_T("RibbonButton")][strBT][_T("SplitButton")][_T("PushButton")][strState1].Color( _T("RibbonButtonTextColor") );
  3308. pSkinTextColor = &skinTextColor;
  3309. }
  3310. else
  3311. {
  3312. LPCTSTR strState = _T("Normal");
  3313. if( ! _ppbd.m_bEnabled )
  3314. strState = _T("Disabled");
  3315. else if( _ppbd.m_bPushed || _ppbd.m_bIndeterminate )
  3316. strState = _T("Pressed");
  3317. else if( _ppbd.m_bHover )
  3318. strState = _T("Hover");
  3319. const CExtSkinGlyph & _glyph = m_Skin[_T("Button")][_T("RibbonButton")][strBT][ _ppbd.m_bDropDown ? _T("DropDownButton") : _T("PushButton") ][strState].Glyph( _T("Background") );
  3320. _glyph.Draw( dc.m_hDC, _ppbd.m_rcClient );
  3321. const CExtSkinColor & skinTextColor = m_Skin[_T("Button")][_T("RibbonButton")][strBT][ _ppbd.m_bDropDown ? _T("DropDownButton") : _T("PushButton") ][strState].Color( _T("RibbonButtonTextColor") );
  3322. pSkinTextColor = &skinTextColor;
  3323. }
  3324. }
  3325. break; // cases __ELC_TOOL and __ELC_SMALL
  3326. } // switch( eLC )
  3327. if( pCmdIcon != NULL )
  3328. {
  3329. ASSERT( ! pCmdIcon->IsEmpty() );
  3330. CSize _sizeRealIcon = pCmdIcon->GetSize();
  3331. if( _sizeRealIcon != _sizeIcon )
  3332. rcIcon.OffsetRect(
  3333. ( _sizeIcon.cx - _sizeRealIcon.cx ) / 2,
  3334. ( _sizeIcon.cy - _sizeRealIcon.cy) / 2
  3335. );
  3336. rcIcon.right = rcIcon.left + _sizeRealIcon.cx;
  3337. rcIcon.bottom = rcIcon.top + _sizeRealIcon.cy;
  3338. bool bCenterBigIconVerticallyMode = ( eLC == __ELC_LARGE && nTextLength == 0 && ( ! _ppbd.m_bDropDown ) ) ? true : false;
  3339. if( bCenterBigIconVerticallyMode)
  3340. rcIcon.OffsetRect(
  3341. 0,
  3342. _ppbd.m_rcClient.top - rcIcon.top + ( _ppbd.m_rcClient.Height() - rcIcon.Height() ) / 2
  3343. );
  3344. CExtCmdIcon::e_paint_type_t ePT = CExtCmdIcon::__PAINT_DISABLED;
  3345. if( _ppbd.m_bEnabled )
  3346. {
  3347. if( _ppbd.m_bPushed )
  3348. ePT = CExtCmdIcon::__PAINT_PRESSED;
  3349. else if( _ppbd.m_bHover )
  3350. ePT = CExtCmdIcon::__PAINT_HOVER;
  3351. else
  3352. ePT = CExtCmdIcon::__PAINT_NORMAL;
  3353. } // if( _ppbd.m_bEnabled )
  3354. pCmdIcon->Paint(
  3355. this,
  3356. dc.m_hDC,
  3357. rcIcon,
  3358. ePT
  3359. );
  3360. } // if( pCmdIcon != NULL )
  3361. if( nTextLength > 0 || _ppbd.m_bDropDown )
  3362. {
  3363. UINT nDT = 0;
  3364. if( eLC != __ELC_LARGE )
  3365. {
  3366. strText.Replace( _T("r"), _T(" ") );
  3367. strText.Replace( _T("n"), _T(" ") );
  3368. strText.Replace( _T("t"), _T(" ") );
  3369. strText.Replace( _T("  "), _T(" ") );
  3370. strText.TrimLeft( _T(" ") );
  3371. strText.TrimRight( _T(" ") );
  3372. nTextLength = INT( strText.GetLength() );
  3373. nDT = DT_CENTER|DT_VCENTER|DT_SINGLELINE;
  3374. } // if( eLC != __ELC_LARGE )
  3375. else
  3376. nDT = DT_CENTER|DT_TOP;
  3377. if( nTextLength > 0 || _ppbd.m_bDropDown )
  3378. {
  3379. CFont * pFont = pTBB->GetBar()->OnGetToolbarFont( false, false );
  3380. ASSERT( pFont->GetSafeHandle() != NULL );
  3381. CFont * pOldFont = dc.SelectObject( pFont );
  3382. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  3383. COLORREF clrText =
  3384. ( pSkinTextColor != NULL && (! pSkinTextColor->IsHollow() ) )
  3385. ? COLORREF( (*pSkinTextColor) )
  3386. : GetColor( _ppbd.m_bEnabled ? COLOR_BTNTEXT : CLR_TEXT_DISABLED )
  3387. ;
  3388. COLORREF clrOldText = dc.SetTextColor( clrText );
  3389. // if( eLC == __ELC_LARGE )
  3390. Ribbon_PaintText(
  3391. dc,
  3392. ( nTextLength > 0 ) ? LPCTSTR(strText) : _T(""),
  3393. rcText,
  3394. nDT,
  3395. bDrawDropDownWithText,
  3396. NULL,
  3397. _ppbd.m_pHelperSrc,
  3398. _ppbd.m_lParam
  3399. );
  3400. // else
  3401. // dc.DrawText(
  3402. // LPCTSTR(strText),
  3403. // nTextLength,
  3404. // rcText,
  3405. // nDT
  3406. // );
  3407. dc.SetTextColor( clrOldText );
  3408. dc.SetBkMode( nOldBkMode );
  3409. dc.SelectObject( pOldFont );
  3410. } // if( nTextLength > 0 || _ppbd.m_bDropDown )
  3411. } // if( nTextLength > 0 || _ppbd.m_bDropDown )
  3412. }
  3413. INT CExtPaintManagerSkin::Ribbon_GetTabIntersectionHeight(
  3414. const CExtRibbonPage * pRibbonPage,
  3415. LPARAM lParam // = 0L
  3416. ) const
  3417. {
  3418. ASSERT_VALID( this );
  3419. if( IsHighContrast() )
  3420. return CExtPaintManager::Ribbon_GetTabIntersectionHeight( pRibbonPage, lParam );
  3421. return 0;
  3422. }
  3423. void CExtPaintManagerSkin::Ribbon_PaintTabItem(
  3424. CDC & dc,
  3425. CRect & rcTabItemsArea,
  3426. bool bSelected,
  3427. const CRect & rcEntireItem,
  3428. CFont * pFont,
  3429. __EXT_MFC_SAFE_LPCTSTR sText,
  3430. CExtCmdIcon * pIcon,
  3431. CObject * pHelperSrc,
  3432. LPARAM lParam, // = 0L
  3433. COLORREF clrForceText, // = COLORREF(-1L)
  3434. COLORREF clrForceTabBk, // = COLORREF(-1L)
  3435. COLORREF clrForceTabBorderLT, // = COLORREF(-1L)
  3436. COLORREF clrForceTabBorderRB, // = COLORREF(-1L)
  3437. COLORREF clrForceTabSeparator // = COLORREF(-1L)
  3438. )
  3439. {
  3440. ASSERT_VALID( this );
  3441. CRect _rcEntireItem = rcEntireItem;
  3442. if( ! IsHighContrast() )
  3443. {
  3444. if( bSelected )
  3445. _rcEntireItem.bottom += 1;
  3446. else
  3447. _rcEntireItem.bottom += 3;
  3448. }
  3449. CExtPaintManager::Ribbon_PaintTabItem(
  3450. dc,
  3451. rcTabItemsArea,
  3452. bSelected,
  3453. _rcEntireItem,
  3454. pFont,
  3455. sText,
  3456. pIcon,
  3457. pHelperSrc,
  3458. lParam,
  3459. clrForceText,
  3460. clrForceTabBk,
  3461. clrForceTabBorderLT,
  3462. clrForceTabBorderRB,
  3463. clrForceTabSeparator
  3464. );
  3465. }
  3466. void CExtPaintManagerSkin::Ribbon_PaintText(
  3467. CDC & dc,
  3468. __EXT_MFC_SAFE_LPCTSTR strText,
  3469. const RECT & rcText,
  3470. UINT nDrawTextFlags,
  3471. bool bDrawDropDownArrow,
  3472. CExtBitmap * pBmpAlternativeDropDownArrow,
  3473. CObject * pHelperSrc,
  3474. LPARAM lParam // = 0L
  3475. )
  3476. {
  3477. ASSERT_VALID( this );
  3478. CExtPaintManager::Ribbon_PaintText(
  3479. dc,
  3480. strText,
  3481. rcText,
  3482. nDrawTextFlags,
  3483. bDrawDropDownArrow,
  3484. pBmpAlternativeDropDownArrow,
  3485. pHelperSrc,
  3486. lParam
  3487. );
  3488. }
  3489. bool CExtPaintManagerSkin::Ribbon_FileButtonIsItegrationSupported() const
  3490. {
  3491. ASSERT_VALID( this );
  3492. if( IsHighContrast() )
  3493. return CExtPaintManager::Ribbon_FileButtonIsItegrationSupported();
  3494. return false;
  3495. }
  3496. void CExtPaintManagerSkin::Ribbon_NcOverPaint(
  3497. CDC & dc,
  3498. bool bFrameActive,
  3499. INT nWidthFromLeft,
  3500. bool bDwmMode,
  3501. LPCRECT pRectDwmText,
  3502. __EXT_MFC_SAFE_LPCTSTR strDwmCaptionTitle,
  3503. CObject * pHelperSrc,
  3504. LPARAM lParam // = 0L
  3505. )
  3506. {
  3507. ASSERT_VALID( this );
  3508. ASSERT( dc.GetSafeHdc() != NULL );
  3509. if( IsHighContrast() )
  3510. {
  3511. CExtPaintManager::Ribbon_NcOverPaint(
  3512. dc,
  3513. bFrameActive,
  3514. nWidthFromLeft,
  3515. bDwmMode,
  3516. pRectDwmText,
  3517. strDwmCaptionTitle,
  3518. pHelperSrc,
  3519. lParam
  3520. );
  3521. return;
  3522. }
  3523. bool bZoomedMode = false;
  3524. if( pHelperSrc != NULL )
  3525. {
  3526. CExtRibbonBar * pRibbonBar = DYNAMIC_DOWNCAST( CExtRibbonBar, pHelperSrc );
  3527. if( pRibbonBar != NULL )
  3528. {
  3529. if( pRibbonBar->GetParent()->IsZoomed() )
  3530. bZoomedMode = true;
  3531. } // if( pRibbonBar != NULL )
  3532. } // if( pHelperSrc != NULL )
  3533. nWidthFromLeft += 15;
  3534. INT nTextLen = 0;
  3535. if( pHelperSrc != NULL
  3536. && pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtRibbonBar) )
  3537. )
  3538. {
  3539. CExtRibbonBar * pRibbonBar = STATIC_DOWNCAST( CExtRibbonBar, pHelperSrc );
  3540. CRect rcIcon( 0, 0, 0, 0 );
  3541. if( bDwmMode
  3542. && pRectDwmText != NULL
  3543. && LPCTSTR(strDwmCaptionTitle) != NULL
  3544. && ( nTextLen = INT(_tcslen(LPCTSTR(strDwmCaptionTitle))) ) > 0
  3545. //  && pRectDwmText->left < pRectDwmText->right
  3546. //  && pRectDwmText->top < pRectDwmText->bottom
  3547. //  && dc.RectVisible( pRectDwmText )
  3548. )
  3549. {
  3550. CWnd * pWnd = (CWnd*)pHelperSrc;
  3551. bool bRTL = ( (pWnd->GetExStyle()&WS_EX_LAYOUTRTL) != 0 ) ? true : false;
  3552. for( ; (pWnd->GetStyle()&WS_CHILD) != 0; pWnd = pWnd->GetParent() );
  3553. if( pWnd != NULL )
  3554. {
  3555. CRect rcText = *pRectDwmText;
  3556. if( pRibbonBar->m_pExtNcFrameImpl != NULL )
  3557. {
  3558. CRect rcIcon( 0, 0, 0, 0 );
  3559. CExtCmdIcon _icon;
  3560. pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_GetIcon( _icon );
  3561. if( ! _icon.IsEmpty() )
  3562. {
  3563. CSize _sizeIcon = _icon.GetSize();
  3564. ASSERT( _sizeIcon.cx > 0 && _sizeIcon.cy > 0 );
  3565. INT nIconTop = rcText.top + ( rcText.Height() - _sizeIcon.cy ) / 2;
  3566. rcIcon.SetRect(
  3567. rcText.left,
  3568. nIconTop,
  3569. rcText.left + _sizeIcon.cx,
  3570. nIconTop + _sizeIcon.cy
  3571. );
  3572. INT nV = ::GetSystemMetrics( SM_CXFRAME );
  3573. rcIcon.OffsetRect( nV, 0 );
  3574. rcText.left = rcIcon.right + nV;
  3575. if( dc.RectVisible( &rcIcon ) )
  3576. {
  3577. DWORD dwOldRTF = 0;
  3578. CExtCmdIcon::e_paint_type_t ePT = CExtCmdIcon::__PAINT_NORMAL;
  3579. CWnd * pFrameWnd = pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_GetFrameWindow();
  3580. if( pFrameWnd != NULL
  3581. && (! pFrameWnd->IsWindowEnabled() )
  3582. )
  3583. ePT = CExtCmdIcon::__PAINT_DISABLED;
  3584. CExtBitmap & _bmp = _icon.GetBitmap( ePT, this );
  3585. if( bDwmMode && bRTL )
  3586. {
  3587. dwOldRTF = _bmp.RunTimeFlagsGet();
  3588. _bmp.RunTimeFlagsSet( dwOldRTF | __EXT_BMP_FLAG_NO_RTL_DETECTION );
  3589. }
  3590. if( bRTL )
  3591. {
  3592. CExtBitmap _bmp2 = _bmp;
  3593. _bmp2.FlipHorizontal();
  3594. if( ! _bmp2.IsEmpty() )
  3595. {
  3596. CSize _size = _bmp2.GetSize();
  3597. _bmp2.AlphaBlend(
  3598. dc.m_hDC,
  3599. rcIcon.left,
  3600. rcIcon.top,
  3601. rcIcon.Width(),
  3602. rcIcon.Height(),
  3603. 0,
  3604. 0,
  3605. rcIcon.Width(),
  3606. rcIcon.Height()
  3607. );
  3608. }
  3609. }
  3610. else
  3611. {
  3612. _icon.Paint(
  3613. this,
  3614. dc,
  3615. rcIcon,
  3616. pWnd->IsWindowEnabled()
  3617. ? CExtCmdIcon::__PAINT_NORMAL
  3618. : CExtCmdIcon::__PAINT_DISABLED
  3619. );
  3620. }
  3621. if( bDwmMode && bRTL )
  3622. {
  3623. _bmp.RunTimeFlagsSet( dwOldRTF );
  3624. }
  3625. }
  3626. } // if( ! _icon.IsEmpty() )
  3627. }
  3628. if( pRectDwmText->left < pRectDwmText->right
  3629. && pRectDwmText->top < pRectDwmText->bottom
  3630. && dc.RectVisible( pRectDwmText )
  3631. )
  3632. {
  3633. HWND hWndOpenThemeData = pWnd->m_hWnd;
  3634. if( g_PaintManager.m_UxTheme.OpenThemeDataEx(
  3635. hWndOpenThemeData,
  3636. VSCLASS_WINDOW,
  3637. __EXT_UX_OTD_NONCLIENT
  3638. ) != NULL
  3639. )
  3640. { // if extended theme data was open successfully
  3641. static const int g_nDwmGlowSize2007 = 10;
  3642. CExtSafeString strWindowText = LPCTSTR(strDwmCaptionTitle);
  3643. CFont * pOldFont = dc.SelectObject( &m_FontCaption );
  3644. INT nTextWidthRequredPX = rcText.Width() - g_nDwmGlowSize2007 * 2;
  3645. CExtUxTheme::__EXT_UX_DTTOPTS dtoMeasure = { sizeof(CExtUxTheme::__EXT_UX_DTTOPTS) };
  3646. dtoMeasure.dwFlags = __EXT_UX_DTT_COMPOSITED | __EXT_UX_DTT_GLOWSIZE;
  3647. dtoMeasure.iGlowSize = g_nDwmGlowSize2007;
  3648. CRect rcTextMeasure;
  3649. rcTextMeasure.SetRect( 0, 0, 0, 0 );
  3650. g_PaintManager.m_UxTheme.GetThemeTextExtent(
  3651. dc.m_hDC,
  3652. 0,
  3653. 0,
  3654. strWindowText,
  3655. -1,
  3656. DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOPREFIX|DT_CALCRECT,
  3657. NULL,
  3658. &rcTextMeasure
  3659. );
  3660. INT nTextWidthCurrentPX = rcTextMeasure.Width();
  3661.   bool bDrawText = true;
  3662.   if( nTextWidthCurrentPX > nTextWidthRequredPX )
  3663. {
  3664.   bDrawText = false;
  3665. INT nLenCalc = strWindowText.GetLength() - 1;
  3666. for( ; nLenCalc > 0; nLenCalc -- )
  3667. {
  3668. CExtSafeString strCalc = strWindowText.Left( nLenCalc );
  3669. //  if( bRTL )
  3670. //  {
  3671. //  CString strTmp = strCalc;
  3672. //  strCalc = _T("...");
  3673. //  strCalc += strTmp;
  3674. //  } // if( bRTL )
  3675. //  else
  3676. strCalc += _T("...");
  3677. rcTextMeasure.SetRect( 0, 0, 0, 0 );
  3678. g_PaintManager.m_UxTheme.GetThemeTextExtent(
  3679. dc.m_hDC,
  3680. 0,
  3681. 0,
  3682. strCalc,
  3683. -1,
  3684. DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOPREFIX|DT_CALCRECT,
  3685. NULL,
  3686. &rcTextMeasure
  3687. );
  3688. INT nTextWidthCurrentPX = rcTextMeasure.Width();
  3689. if( nTextWidthCurrentPX <= nTextWidthRequredPX )
  3690. {
  3691. strWindowText = strCalc;
  3692. bDrawText = true;
  3693. break;
  3694. } // if( nTextWidthCurrentPX <= nTextWidthRequredPX )
  3695. } // for( ; nLenCalc > 0; nLenCalc -- )
  3696. } // if( nTextWidthCurrentPX > nTextWidthRequredPX )
  3697. dc.SelectObject( &pOldFont );
  3698. if( bDrawText )
  3699. {
  3700. DWORD dwOldLayout1 = LAYOUT_LTR, dwOldLayout2 = LAYOUT_LTR;
  3701. if( bRTL )
  3702. dwOldLayout1 = dc.SetLayout( LAYOUT_RTL );
  3703. CExtMemoryDC dc32(
  3704. &dc,
  3705. &rcText,
  3706. CExtMemoryDC::MDCOPT_TO_MEMORY
  3707. | CExtMemoryDC::MDCOPT_FORCE_DIB
  3708. | CExtMemoryDC::MDCOPT_FILL_BITS
  3709. | CExtMemoryDC::MDCOPT_DIB_NEGATIVE_HEIGHT
  3710. );
  3711. ASSERT( dc32.GetSafeHdc() != NULL );
  3712. dc.FillSolidRect( &rcText, RGB(0,0,0) );
  3713. if( bRTL )
  3714. dwOldLayout2 = dc32.SetLayout( LAYOUT_RTL );
  3715. pOldFont = dc32.SelectObject( &m_FontCaption );
  3716. CExtUxTheme::__EXT_UX_DTTOPTS dto = { sizeof(CExtUxTheme::__EXT_UX_DTTOPTS) };
  3717. dto.dwFlags = __EXT_UX_DTT_TEXTCOLOR;
  3718. dto.iGlowSize = g_nDwmGlowSize2007;
  3719. if( ( ! g_PaintManager.m_bIsWin7OrLater ) && pWnd->IsZoomed() )
  3720. dto.crText = RGB(0x0FF,0x0FF,0x0FF);
  3721. else
  3722. {
  3723. dto.dwFlags |= __EXT_UX_DTT_COMPOSITED | __EXT_UX_DTT_GLOWSIZE;
  3724. dto.crText = bFrameActive ? RGB(0,0,0) : RGB(0x060,0x060,0x060);
  3725. }
  3726. g_PaintManager.m_UxTheme.DrawThemeTextEx(
  3727. dc32.m_hDC,
  3728. 0,
  3729. 0,
  3730. strWindowText,
  3731. -1,
  3732. DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_NOPREFIX,
  3733. rcText,
  3734. &dto
  3735. );
  3736. dc32.SelectObject( pOldFont );
  3737. if( bRTL )
  3738. {
  3739. dc.SetLayout( dwOldLayout1 );
  3740. dc32.SetLayout( dwOldLayout2 );
  3741. } // if( bRTL )
  3742. } // if( bDrawText )
  3743. g_PaintManager.m_UxTheme.CloseThemeData();
  3744. } // if extended theme data was open successfully
  3745. }
  3746. } // if( pWnd != NULL )
  3747. } // if( bDwmMode ...
  3748. //  if( pRibbonBar->m_pExtNcFrameImpl != NULL
  3749. //  && pRibbonBar->RibbonLayout_IsFrameIntegrationEnabled()
  3750. //  && pRibbonBar->RibbonQuickAccessBar_AboveTheRibbonGet()
  3751. //  && Ribbon_IsSystemMenuIconPresent()
  3752. //  )
  3753. //  {
  3754. //  CWnd * pWndFrameImpl = pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_GetFrameWindow();
  3755. //  if( pWndFrameImpl->GetSafeHwnd() != NULL )
  3756. //  {
  3757. //  CRect rcSeparator( 0, 0, 0, 0 );
  3758. //  if( bDwmMode )
  3759. //  rcSeparator.SetRect( rcIcon.right, rcIcon.top, rcIcon.right + 2, rcIcon.bottom );
  3760. //  else
  3761. //  {
  3762. //  CRect rcWnd;
  3763. //  pWndFrameImpl->GetWindowRect( &rcWnd );
  3764. //  rcIcon = pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_GetNcHtRect(HTSYSMENU,false,false,false,NULL,&rcWnd);
  3765. //  rcSeparator.SetRect( rcIcon.right + 0, rcIcon.top, rcIcon.right + 2, rcIcon.bottom - 3 );
  3766. //  if( pWndFrameImpl->IsZoomed() )
  3767. //  rcSeparator.OffsetRect( m_rcNcFrameBordersActive.left, m_rcNcFrameBordersActive.top );
  3768. //  }
  3769. //  Ribbon_PaintSeparator( dc, rcSeparator, NULL );
  3770. //  //rcSeparator.InflateRect( 2, 2 ); dc.FillSolidRect( rcSeparator, 255 );
  3771. //  }
  3772. // 
  3773. //  }
  3774. }
  3775. }
  3776. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  3777. bool CExtPaintManagerSkin::_PaintHeaderPartImpl(
  3778. CDC & dc,
  3779. CRect rc,
  3780. CObject * pHelperSrc,
  3781. LPARAM lParam,
  3782. bool bDrawItemLikeBackground, // = false
  3783. bool bHover, // = false
  3784. bool bPressed // = false
  3785. )
  3786. {
  3787. ASSERT( dc.GetSafeHdc() != NULL );
  3788. pHelperSrc;
  3789. lParam;
  3790. LPCTSTR strOuterAreaLocation = bDrawItemLikeBackground ? _T("Top") : _T("GeneralOuterBackground");
  3791. if( bDrawItemLikeBackground ) 
  3792. {
  3793. LPCTSTR strHeaderCellState = _T("Normal");
  3794. if( bPressed )
  3795. strHeaderCellState = _T("Pressed");
  3796. else if( bHover )
  3797. strHeaderCellState = _T("Hover");
  3798. const CExtSkinGlyph & _glyph =
  3799. m_Skin[_T("Grid")][_T("HeaderCell")][strOuterAreaLocation]
  3800. .Glyph( strHeaderCellState );
  3801. _glyph.Draw( dc.m_hDC, rc );
  3802. } // if( bDrawItemLikeBackground ) 
  3803. else
  3804. {
  3805. const CExtSkinGlyph & _glyph =
  3806. m_Skin[_T("Grid")][_T("OuterBackground")][strOuterAreaLocation]
  3807. .Glyph( _T("Background") );
  3808. _glyph.Draw( dc.m_hDC, rc );
  3809. } // else from if( bDrawItemLikeBackground ) 
  3810. return true;
  3811. }
  3812. INT CExtPaintManagerSkin::GetDropDownButtonWidth(
  3813. CObject * pHelperSrc, // = NULL
  3814. LPARAM lParam // = 0L
  3815. ) const
  3816. {
  3817. ASSERT_VALID( this );
  3818. #ifdef _DEBUG
  3819. if( pHelperSrc != NULL )
  3820. {
  3821. ASSERT_VALID( pHelperSrc );
  3822. }
  3823. #endif // _DEBUG
  3824. if( IsHighContrast() )
  3825. return CExtPaintManager::GetDropDownButtonWidth( pHelperSrc, lParam );
  3826. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  3827. bool bRibbonMode = false;
  3828. if( pHelperSrc != NULL )
  3829. {
  3830. if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtRibbonButton ) ) )
  3831. bRibbonMode = true;
  3832. else if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtBarButton ) ) )
  3833. {
  3834. CExtToolControlBar * pToolBar = ((CExtBarButton*)pHelperSrc)->GetSafeBar();
  3835. if( pToolBar != NULL
  3836. && pToolBar->IsKindOf( RUNTIME_CLASS( CExtRibbonPage ) )
  3837. )
  3838. bRibbonMode = true;
  3839. }
  3840. }
  3841. if( bRibbonMode )
  3842. {
  3843. INT nDD = 9;
  3844. nDD = UiScalingDo( nDD, __EUIST_X );
  3845. return nDD;
  3846. }
  3847. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  3848. return CExtPaintManager::GetDropDownButtonWidth( pHelperSrc, lParam );
  3849. }
  3850. void CExtPaintManagerSkin::Header_PaintBackground(
  3851. CDC & dc,
  3852. CRect rc,
  3853. CObject * pHelperSrc,
  3854. LPARAM lParam // = 0L
  3855. )
  3856. {
  3857. ASSERT_VALID( this );
  3858. ASSERT( dc.GetSafeHdc() != NULL );
  3859. if( IsHighContrast() )
  3860. {
  3861. CExtPaintManager::Header_PaintBackground( dc, rc, pHelperSrc, lParam );
  3862. return;
  3863. }
  3864. if( ! _PaintHeaderPartImpl( dc, rc, pHelperSrc, lParam ) )
  3865. CExtPaintManager::Header_PaintBackground( dc, rc, pHelperSrc, lParam );
  3866. }
  3867. void CExtPaintManagerSkin::Header_PaintItem(
  3868. CDC & dc,
  3869. CRect rcItemEntire,
  3870. CRect rcItemData,
  3871. CRect rcIcon,
  3872. CRect rcText,
  3873. CRect rcSortArrow,
  3874. CRect rcButton,
  3875. CRect rcButtonIcon,
  3876. bool bSorted,
  3877. bool bSortedAscending,
  3878. INT nColNo,
  3879. INT nColCount,
  3880. const CExtCmdIcon & iconItem,
  3881. const CExtCmdIcon & iconButton,
  3882. bool bHover,
  3883. bool bPressed,
  3884. bool bButtonEvent,
  3885. __EXT_MFC_SAFE_LPCTSTR strItemText,
  3886. CObject * pHelperSrc,
  3887. LPARAM lParam // = 0L
  3888. )
  3889. {
  3890. ASSERT_VALID( this );
  3891. ASSERT( dc.GetSafeHdc() != NULL );
  3892. if( IsHighContrast() )
  3893. {
  3894. CExtPaintManager::Header_PaintItem(
  3895. dc, rcItemEntire, rcItemData, rcIcon, rcText, rcSortArrow, rcButton, rcButtonIcon,
  3896. bSorted, bSortedAscending, nColNo, nColCount, iconItem, iconButton, bHover, bPressed, bButtonEvent,
  3897. strItemText, pHelperSrc, lParam
  3898. );
  3899. return;
  3900. }
  3901. COLORREF clrLT1 = GetColor( COLOR_3DHIGHLIGHT, pHelperSrc, lParam );
  3902. COLORREF clrRB1 = GetColor( COLOR_3DSHADOW,  pHelperSrc, lParam );
  3903. CRect rcDraw = rcItemEntire;
  3904. if( ! rcButton.IsRectEmpty() )
  3905. rcDraw.right = rcButton.left;
  3906. if( ! _PaintHeaderPartImpl(
  3907. dc, rcDraw, pHelperSrc, lParam, true,
  3908. bHover && (!bButtonEvent),
  3909. bPressed && (!bButtonEvent) )
  3910. )
  3911. {
  3912. bool bDrawBorder = true;
  3913. if( (!bButtonEvent) && ( bHover || bPressed ) )
  3914. {
  3915. bDrawBorder = !bPressed;
  3916. if( bPressed && bHover )
  3917. dc.FillRect( &rcDraw, &m_brushDarkerDefault );
  3918. else if( bPressed )
  3919. dc.FillRect( &rcDraw, &m_brushDarkDefault );
  3920. else if( bHover )
  3921. dc.FillRect( &rcDraw, &m_brushLighterDefault );
  3922. }
  3923. if( bDrawBorder )
  3924. dc.Draw3dRect( &rcDraw, clrLT1, clrRB1 );
  3925. }
  3926. if( (! rcButton.IsRectEmpty() )
  3927. && dc.RectVisible( &rcButton )
  3928. )
  3929. {
  3930. rcDraw = rcButton;
  3931. if( ! _PaintHeaderPartImpl(
  3932. dc, rcDraw, pHelperSrc, lParam, true,
  3933. bHover && bButtonEvent,
  3934. bPressed && bButtonEvent
  3935. )
  3936. )
  3937. {
  3938. bool bDrawBorder = true;
  3939. if( bButtonEvent && ( bHover || bPressed ) )
  3940. {
  3941. bDrawBorder = !bPressed;
  3942. if( bPressed && bHover )
  3943. dc.FillRect( &rcDraw, &m_brushDarkerDefault );
  3944. else if( bPressed )
  3945. dc.FillRect( &rcDraw, &m_brushDarkDefault );
  3946. else if( bHover )
  3947. dc.FillRect( &rcDraw, &m_brushLighterDefault );
  3948. }
  3949. if( bDrawBorder )
  3950. dc.Draw3dRect( &rcDraw, clrLT1, clrRB1 );
  3951. }
  3952. if( (! iconButton.IsEmpty() )
  3953. && (! rcButtonIcon.IsRectEmpty() )
  3954. && dc.RectVisible( &rcButtonIcon )
  3955. )
  3956. iconButton.Paint( this, dc, rcButtonIcon );
  3957. }
  3958. if( (! iconItem.IsEmpty() )
  3959. && (! rcIcon.IsRectEmpty() )
  3960. && dc.RectVisible( &rcIcon )
  3961. )
  3962. iconItem.Paint( this, dc, rcIcon );
  3963. if( bSorted
  3964. && (! rcSortArrow.IsRectEmpty() )
  3965. && dc.RectVisible( &rcSortArrow )
  3966. )
  3967. {
  3968. const CExtSkinGlyph & _glyph =
  3969. m_Skin[_T("Grid")][_T("SortArrow")]
  3970. .Glyph( bSortedAscending ? _T("AscendingTopBottom") : _T("DescendingTopBottom") );
  3971. _glyph.Draw( dc.m_hDC, rcSortArrow );
  3972. }
  3973. INT nTextLen = ( LPCTSTR(strItemText) != NULL ) ? INT( _tcslen(LPCTSTR(strItemText)) ) : 0;
  3974. if( nTextLen > 0
  3975. && (! rcText.IsRectEmpty() )
  3976. && dc.RectVisible( &rcText )
  3977. )
  3978. {
  3979. LPCTSTR strOuterAreaLocation = _T("Top");
  3980. LPCTSTR strHeaderCellState = _T("Normal");
  3981. if( ! bButtonEvent )
  3982. {
  3983. if( bPressed )
  3984. strHeaderCellState = _T("Pressed");
  3985. else if( bHover )
  3986. strHeaderCellState = _T("Hover");
  3987. }
  3988. const CExtSkinColor & colorText =
  3989. m_Skin[_T("Grid")][_T("HeaderCell")][strOuterAreaLocation]
  3990. .Color( strHeaderCellState );
  3991. if( ! colorText.IsHollow() )
  3992. {
  3993. COLORREF clrTextColor = COLORREF( colorText );
  3994. CFont * pItemFont = & m_FontNormal;
  3995. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  3996. COLORREF clrOldText = dc.SetTextColor( clrTextColor );
  3997. CFont * pOldFont = dc.SelectObject( pItemFont );
  3998. dc.DrawText( LPCTSTR(strItemText), nTextLen, (LPRECT)&rcText, DT_LEFT|DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS );
  3999. dc.SelectObject( pOldFont );
  4000. dc.SetTextColor( clrOldText );
  4001. dc.SetBkMode( nOldBkMode );
  4002. }
  4003. }
  4004. }