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

界面编程

开发平台:

Visual C++

  1. return;
  2. }
  3. OnPaintToolBarGradient( dc, rcRowBk, true, (CObject*)pBar );
  4. }
  5. void CExtPaintManager::OnSysColorChange()
  6. {
  7. ASSERT_VALID( this );
  8. OnPaintSessionComplete( this );
  9. SyncSysColors();
  10. InitTranslatedColors();
  11. InitHelperBrushes();
  12. }
  13. void CExtPaintManager::OnSettingChange(
  14. UINT uFlags,
  15. __EXT_MFC_SAFE_LPCTSTR lpszSection
  16. )
  17. {
  18. ASSERT_VALID( this );
  19. uFlags;
  20. lpszSection;
  21. OnPaintSessionComplete( this );
  22. SyncSysColors();
  23. InitTranslatedColors();
  24. InitHelperBrushes();
  25. }
  26. void CExtPaintManager::OnDisplayChange(
  27. INT nDepthBPP,
  28. CPoint ptSizes
  29. )
  30. {
  31. ASSERT_VALID( this );
  32. nDepthBPP;
  33. ptSizes;
  34. OnPaintSessionComplete( this );
  35. SyncSysColors();
  36. InitTranslatedColors();
  37. InitHelperBrushes();
  38. }
  39. void CExtPaintManager::OnThemeChanged(
  40. WPARAM wParam,
  41. LPARAM lParam
  42. )
  43. {
  44. ASSERT_VALID( this );
  45. wParam;
  46. lParam;
  47. OnPaintSessionComplete( this );
  48. SyncSysColors();
  49. InitTranslatedColors();
  50. InitHelperBrushes();
  51. }
  52. void CExtPaintManager::OnPaintSessionComplete(
  53. CObject * pHelperSrc,
  54. LPARAM lParam // = 0L
  55. )
  56. {
  57. ASSERT_VALID( this );
  58. #ifdef __TRACE_PAINT_SESSIONS
  59. TRACE( "   PAINT_SESSION: Completen" );
  60. #endif // __TRACE_PAINT_SESSIONS
  61. pHelperSrc;
  62. lParam;
  63. }
  64. bool CExtPaintManager::OnStateSerialize(
  65. CArchive & ar,
  66. bool bEnableThrowExceptions // = false
  67. )
  68. {
  69. ar;
  70. bEnableThrowExceptions;
  71. return true;
  72. }
  73. CExtPaintManager::PAINTTOOLBARTEXTFIELDDATA::PAINTTOOLBARTEXTFIELDDATA()
  74. : m_pHelperSrc( NULL )
  75. , m_lParam( 0L )
  76. , m_nDrawTextFlags( DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOPREFIX )
  77. , m_sText( _T("") )
  78. , m_rcButton( 0, 0, 0, 0 )
  79. , m_rcTextField( 0, 0, 0, 0 )
  80. , m_bComboField( false )
  81. , m_bHover( false )
  82. , m_bPushed( false )
  83. , m_bEnabled( false )
  84. {
  85. }
  86. CExtPaintManager::PAINTTOOLBARTEXTFIELDDATA::PAINTTOOLBARTEXTFIELDDATA(
  87. CObject * pHelperSrc,
  88. __EXT_MFC_SAFE_LPCTSTR sText,
  89. const RECT & rcButton,
  90. const RECT & rcTextField,
  91. bool bComboField,
  92. bool bHover,
  93. bool bPushed,
  94. bool bEnabled
  95. )
  96. : m_pHelperSrc( pHelperSrc )
  97. , m_lParam( 0L )
  98. , m_nDrawTextFlags( DT_SINGLELINE|DT_LEFT|DT_TOP|DT_NOPREFIX )
  99. , m_sText( (sText == NULL) ? _T("") : sText )
  100. , m_rcButton( rcButton )
  101. , m_rcTextField( rcTextField )
  102. , m_bComboField( bComboField )
  103. , m_bHover( bHover )
  104. , m_bPushed( bPushed )
  105. , m_bEnabled( bEnabled )
  106. {
  107. }
  108. void CExtPaintManager::PaintToolbarTextField(
  109. CDC & dc,
  110. PAINTTOOLBARTEXTFIELDDATA & _ptbtfd
  111. )
  112. {
  113. ASSERT_VALID( this );
  114. ASSERT( dc.GetSafeHdc() != NULL );
  115. COLORREF clrWindow = GetColor( _ptbtfd.m_bEnabled ? COLOR_WINDOW : COLOR_3DFACE, _ptbtfd.m_pHelperSrc, _ptbtfd.m_lParam );
  116. CRect rcTextField( _ptbtfd.m_rcButton );
  117. if( !_ptbtfd.m_bEnabled )  
  118. rcTextField.DeflateRect( 1, 1 );
  119. if( _ptbtfd.m_bComboField )
  120. {
  121. if( _ptbtfd.m_bEnabled )
  122. {
  123. dc.FillSolidRect( &rcTextField, clrWindow );
  124. PAINTCOMBOFRAMEDATA _pcfd( _ptbtfd.m_pHelperSrc, rcTextField, _ptbtfd.m_bHover, _ptbtfd.m_bPushed, _ptbtfd.m_bEnabled );
  125. _pcfd.m_bNoTopOuterBorder = true;
  126. PaintComboFrame( dc, _pcfd );
  127. dc.SelectClipRgn( NULL );
  128. }
  129. else
  130. {
  131. dc.Draw3dRect(
  132. &rcTextField,
  133. GetColor( COLOR_WINDOW, _ptbtfd.m_pHelperSrc, _ptbtfd.m_lParam ),
  134. GetColor( COLOR_WINDOW, _ptbtfd.m_pHelperSrc, _ptbtfd.m_lParam )
  135. );
  136. INT nDD = GetDropDownButtonWidth( _ptbtfd.m_pHelperSrc, _ptbtfd.m_lParam );
  137. CRect rcBtn( rcTextField );
  138. rcBtn.left = rcBtn.right - nDD;
  139. // paint arrow down
  140. glyph_t* pGlyph = g_DockingCaptionGlyphs[ __DCBT_ARROW_SMALL_DOWN ];
  141. ASSERT( pGlyph != NULL );
  142. COLORREF ColorValues[2] = { RGB(0,0,0), ::GetSysColor( COLOR_WINDOWTEXT ) };
  143. PaintGlyphCentered( dc, rcBtn, *pGlyph, ColorValues );
  144. }
  145. } // if( _ptbtfd.m_bComboField )
  146. else
  147. {
  148. if( _ptbtfd.m_bEnabled )
  149. {
  150. PAINTCONTROLFRAMEDATA _pcfd( _ptbtfd.m_pHelperSrc, rcTextField, true, _ptbtfd.m_bHover, _ptbtfd.m_bEnabled, false, false );
  151. PaintControlFrame( dc, _pcfd );
  152. }
  153. else
  154. {
  155. COLORREF clrBorder = GetColor( COLOR_WINDOW, _ptbtfd.m_pHelperSrc, _ptbtfd.m_lParam );
  156. dc.Draw3dRect( &rcTextField, clrBorder, clrBorder );
  157. }
  158. } // else from if( _ptbtfd.m_bComboField )
  159. CRect rcBk( _ptbtfd.m_rcTextField );
  160. if( ! _ptbtfd.m_bEnabled )
  161. rcBk.DeflateRect( 0, 1 );
  162. dc.FillSolidRect( &rcBk, clrWindow );
  163. if( ! _ptbtfd.m_sText.IsEmpty() )
  164. {
  165. COLORREF clrTextOld = dc.SetTextColor( ::GetSysColor( _ptbtfd.m_bEnabled ? COLOR_WINDOWTEXT : COLOR_GRAYTEXT ) );
  166. CFont * pFontOld = dc.SelectObject( &m_FontNormal );
  167. int nBkModeOld = dc.SetBkMode( TRANSPARENT );
  168. CRect rcText( _ptbtfd.m_rcTextField );
  169. rcText.left += 5;
  170. rcText.top += 2;
  171. bool bRTL = ( (g_ResourceManager->OnQueryLangLayout()&LAYOUT_RTL) != 0 ) ? true : false;
  172. DWORD dwDtAlignFlags = bRTL ? (DT_RTLREADING|DT_RIGHT) : 0;
  173. dc.DrawText( _ptbtfd.m_sText, _ptbtfd.m_sText.GetLength(), &rcText, _ptbtfd.m_nDrawTextFlags|dwDtAlignFlags );
  174. dc.SetBkMode( nBkModeOld );
  175. dc.SelectObject( pFontOld );
  176. dc.SetTextColor( clrTextOld );
  177. } // if( !_ptbtfd.m_sText.IsEmpty() )
  178. }
  179. void CExtPaintManagerXP::PaintToolbarTextField(
  180. CDC & dc,
  181. PAINTTOOLBARTEXTFIELDDATA & _ptbtfd
  182. )
  183. {
  184. ASSERT_VALID( this );
  185. ASSERT( dc.GetSafeHdc() != NULL );
  186. COLORREF clrDkBorder = GetColor( XPCLR_HILIGHT_BORDER, _ptbtfd.m_pHelperSrc, _ptbtfd.m_lParam );
  187. CRect rcTextFieldOuter( _ptbtfd.m_rcTextField );
  188. if( _ptbtfd.m_bHover 
  189. || _ptbtfd.m_bPushed 
  190. || (!_ptbtfd.m_bEnabled) 
  191. )
  192. rcTextFieldOuter.InflateRect( 1, 1 );
  193. if( _ptbtfd.m_bComboField )
  194. {
  195. // paint combo or date field
  196. INT nDD = GetDropDownButtonWidth( _ptbtfd.m_pHelperSrc, _ptbtfd.m_lParam );
  197. rcTextFieldOuter.right += nDD;
  198. CRect rcBtn( rcTextFieldOuter );
  199. rcBtn.left = rcBtn.right - nDD;
  200. if( (!(_ptbtfd.m_bHover || _ptbtfd.m_bPushed)) && _ptbtfd.m_bEnabled  ) 
  201. {
  202. rcBtn.DeflateRect( 3, 1, 1, 1 );
  203. dc.ExcludeClipRect( &rcBtn );
  204. }
  205. dc.FillSolidRect( &rcTextFieldOuter, ::GetSysColor( _ptbtfd.m_bEnabled ? COLOR_WINDOW : COLOR_3DFACE ) );
  206. dc.SelectClipRgn( NULL );
  207. if( _ptbtfd.m_bHover && _ptbtfd.m_bEnabled )
  208. {
  209. PAINTPUSHBUTTONDATA _ppbd(
  210. _ptbtfd.m_pHelperSrc,
  211. true,
  212. rcBtn,
  213. _T(""),
  214. NULL,
  215. true,
  216. _ptbtfd.m_bHover,
  217. _ptbtfd.m_bPushed,
  218. false,
  219. _ptbtfd.m_bEnabled,
  220. true,
  221. false,
  222. false,
  223. 0
  224. );
  225. PaintPushButton( dc, _ppbd );
  226. dc.Draw3dRect( &rcTextFieldOuter, clrDkBorder, clrDkBorder );
  227. }
  228. else
  229. {
  230. if( ! _ptbtfd.m_bEnabled )
  231. {
  232. COLORREF clrBorder = GetColor( XPCLR_TEXT_FIELD_BORDER_DISABLED, _ptbtfd.m_pHelperSrc, _ptbtfd.m_lParam );
  233. dc.Draw3dRect( &rcTextFieldOuter, clrBorder, clrBorder );
  234. }
  235. }
  236. // paint arrow down
  237. rcBtn.top++;
  238. if( ! _ptbtfd.m_bEnabled )
  239. rcBtn.left++;
  240. glyph_t* pGlyph = g_DockingCaptionGlyphs[ __DCBT_ARROW_SMALL_DOWN ];
  241. ASSERT( pGlyph != NULL );
  242. COLORREF ColorValues[2] =
  243. {
  244. RGB(0,0,0),
  245. _ptbtfd.m_bEnabled 
  246. ? GetColor( _ptbtfd.m_bPushed ? COLOR_3DDKSHADOW : COLOR_WINDOWTEXT, _ptbtfd.m_pHelperSrc, _ptbtfd.m_lParam )
  247. : ::GetSysColor( COLOR_GRAYTEXT )
  248. };
  249. PaintGlyphCentered( dc, rcBtn, *pGlyph, ColorValues );
  250. rcTextFieldOuter.right -= nDD;
  251. }
  252. else
  253. {
  254. // paint text field
  255. dc.FillSolidRect( &rcTextFieldOuter, ::GetSysColor( _ptbtfd.m_bEnabled ? COLOR_WINDOW : COLOR_3DFACE ) );
  256. if( _ptbtfd.m_bEnabled )
  257. {
  258. if( _ptbtfd.m_bHover || _ptbtfd.m_bPushed )
  259. dc.Draw3dRect( &rcTextFieldOuter, clrDkBorder, clrDkBorder );
  260. }
  261. else
  262. {
  263. COLORREF clrBorder = GetColor( XPCLR_TEXT_FIELD_BORDER_DISABLED, _ptbtfd.m_pHelperSrc, _ptbtfd.m_lParam );
  264. dc.Draw3dRect( &rcTextFieldOuter, clrBorder, clrBorder );
  265. }
  266. }
  267. if( ! _ptbtfd.m_sText.IsEmpty() )
  268. {
  269. COLORREF clrTextOld = dc.SetTextColor( ::GetSysColor( _ptbtfd.m_bEnabled ? COLOR_WINDOWTEXT : COLOR_GRAYTEXT ) );
  270. CFont * pFontOld = dc.SelectObject( &m_FontNormal );
  271. int nBkModeOld = dc.SetBkMode( TRANSPARENT );
  272. CRect rcText( _ptbtfd.m_rcTextField );
  273. rcText.left += 5;
  274. rcText.top += 2;
  275. bool bRTL = ( (g_ResourceManager->OnQueryLangLayout()&LAYOUT_RTL) != 0 ) ? true : false;
  276. DWORD dwDtAlignFlags = bRTL ? (DT_RTLREADING|DT_RIGHT) : 0;
  277. dc.DrawText( _ptbtfd.m_sText, _ptbtfd.m_sText.GetLength(), &rcText, _ptbtfd.m_nDrawTextFlags|dwDtAlignFlags );
  278. dc.SetBkMode( nBkModeOld );
  279. dc.SelectObject( pFontOld );
  280. dc.SetTextColor( clrTextOld );
  281. } // if( !_ptbtfd.m_sText.IsEmpty() )
  282. }
  283. COLORREF CExtPaintManager::QueryObjectTextColor(
  284. CDC & dc,
  285. bool bEnabled,
  286. bool bFocused,
  287. bool bHovered,
  288. bool bPressed,
  289. CObject * pHelperSrc,
  290. LPARAM lParam // = 0L
  291. )
  292. {
  293. ASSERT_VALID( this );
  294. dc; bEnabled; bFocused; bHovered; bPressed; pHelperSrc; lParam;
  295. return COLORREF(-1L);
  296. }
  297. COLORREF CExtPaintManager::GetIconAlphaColor() const
  298. {
  299. ASSERT_VALID( this );
  300. return (COLORREF(-1L)); // no alpha icon effect
  301. }
  302. COLORREF CExtPaintManagerXP::GetIconAlphaColor() const
  303. {
  304. ASSERT_VALID( this );
  305. return (COLORREF(-1L)); // no alpha icon effect
  306. }
  307. COLORREF CExtPaintManagerOffice2003::GetIconAlphaColor() const
  308. {
  309. ASSERT_VALID( this );
  310. if( IsHighContrast() )
  311. return CExtPaintManagerXP::GetIconAlphaColor();
  312. COLORREF clrAlpha = ( const_cast < CExtPaintManagerOffice2003 * > ( this ) ) -> GetColor( COLOR_3DFACE, (CObject*)this );
  313. return clrAlpha;
  314. }
  315. COLORREF CExtPaintManagerStudio2005::GetIconAlphaColor() const
  316. {
  317. ASSERT_VALID( this );
  318. if( IsHighContrast() )
  319. return CExtPaintManagerXP::GetIconAlphaColor();
  320. e_system_theme_t eCurrentTheme = OnQuerySystemTheme();
  321. if( eCurrentTheme == ThemeLunaOlive )
  322. return RGB(164,164,144);
  323. else if( eCurrentTheme != ThemeUnknown )
  324. return RGB(0,0,128);
  325. return CExtPaintManagerOffice2003::GetIconAlphaColor();
  326. }
  327. double CExtPaintManager::GetIconAlphaAdjustPercent() const
  328. {
  329. ASSERT_VALID( this );
  330. return 0.0; // no alpha adjustment
  331. }
  332. double CExtPaintManagerXP::GetIconAlphaAdjustPercent() const
  333. {
  334. ASSERT_VALID( this );
  335. return 0.0; // no alpha adjustment
  336. }
  337. double CExtPaintManagerOffice2003::GetIconAlphaAdjustPercent() const
  338. {
  339. ASSERT_VALID( this );
  340. if( IsHighContrast() )
  341. return CExtPaintManagerXP::GetIconAlphaAdjustPercent();
  342. return -0.50;
  343. }
  344. double CExtPaintManagerStudio2005::GetIconAlphaAdjustPercent() const
  345. {
  346. ASSERT_VALID( this );
  347. if( IsHighContrast() )
  348. return CExtPaintManagerXP::GetIconAlphaAdjustPercent();
  349. e_system_theme_t eCurrentTheme = OnQuerySystemTheme();
  350. if( eCurrentTheme != ThemeUnknown )
  351. return -0.70;
  352. return CExtPaintManagerOffice2003::GetIconAlphaAdjustPercent();
  353. }
  354. bool CExtPaintManager::AdjustIcon( 
  355. CExtCmdIcon * pIcon
  356. )
  357. {
  358. ASSERT_VALID( this );
  359. if( pIcon == NULL )
  360. {
  361. ASSERT( FALSE );
  362. return false;
  363. }
  364. if( (pIcon->m_dwFlags&__EXT_ICON_PERSISTENT_BITMAP_DISABLED) == 0 )
  365. {
  366. pIcon->m_bmpDisabled.Empty();
  367. pIcon->m_bmpDisabled = pIcon->m_bmpNormal;
  368. pIcon->m_bmpDisabled.Make32();
  369. pIcon->m_bmpDisabled.MakeMono();
  370. pIcon->m_bmpDisabled.AdjustAlpha( -0.75 );
  371. return true;
  372. }
  373. return false;
  374. }
  375. bool CExtPaintManagerXP::AdjustIcon( 
  376. CExtCmdIcon * pIcon
  377. )
  378. {
  379. ASSERT_VALID( this );
  380. if( pIcon == NULL )
  381. {
  382. ASSERT( FALSE );
  383. return false;
  384. }
  385. if( (pIcon->m_dwFlags&__EXT_ICON_PERSISTENT_BITMAP_DISABLED) == 0 )
  386. {
  387. pIcon->m_bmpDisabled.Empty();
  388. pIcon->m_bmpDisabled = pIcon->m_bmpNormal;
  389. pIcon->m_bmpDisabled.Make32();
  390. COLORREF clrAccent = GetColor( XPCLR_3DFACE_NORMAL );
  391. double H = 0.0, S = 0.0, L = 0.0;
  392. CExtBitmap::stat_RGBtoHSL( clrAccent, &H, &S, &L );
  393. clrAccent = CExtBitmap::stat_HLStoRGB( H, L, S );
  394. pIcon->m_bmpDisabled.AlphaColor( RGB(255,255,255), RGB(32,32,32), 0 );
  395. pIcon->m_bmpDisabled.AdjustHLS( COLORREF(-1L), 0, 0.0, -1.0, -1.0 );
  396. pIcon->m_bmpDisabled.MakeMono( clrAccent );
  397. pIcon->m_bmpDisabled.AdjustHLS( COLORREF(-1L), 0, 0.0, 0.5, 0.0 );
  398. pIcon->m_bmpDisabled.AdjustAlpha( -0.5 );
  399. return true;
  400. }
  401. return false;
  402. }
  403. bool CExtPaintManagerOffice2003::AdjustIcon( 
  404. CExtCmdIcon * pIcon
  405. )
  406. {
  407. ASSERT_VALID( this );
  408. if( pIcon == NULL )
  409. {
  410. ASSERT( FALSE );
  411. return false;
  412. }
  413. if( (pIcon->m_dwFlags&__EXT_ICON_PERSISTENT_BITMAP_DISABLED) == 0 )
  414. {
  415. pIcon->m_bmpDisabled.Empty();
  416. pIcon->m_bmpDisabled = pIcon->m_bmpNormal;
  417. pIcon->m_bmpDisabled.Make32();
  418. COLORREF clrAlpha = GetIconAlphaColor();
  419. if( clrAlpha == COLORREF(-1L) )
  420. {
  421. pIcon->m_bmpDisabled.MakeMono( GetColor( COLOR_3DFACE ) );
  422. pIcon->m_bmpDisabled.AdjustAlpha( -0.70 );
  423. }
  424. else
  425. {
  426. double H = 0.0, S = 0.0, L = 0.0;
  427. CExtBitmap::stat_RGBtoHSL( clrAlpha, &H, &S, &L );
  428. S = 0.3;
  429. clrAlpha = CExtBitmap::stat_HLStoRGB( H, L, S );
  430. pIcon->m_bmpDisabled.MakeMono( clrAlpha );
  431. double lfAlphaAdjustPercent = GetIconAlphaAdjustPercent();
  432. pIcon->m_bmpDisabled.AdjustAlpha( lfAlphaAdjustPercent );
  433. }
  434. return true;
  435. }
  436. return false;
  437. }
  438. CSize CExtPaintManager::GetResizingGriperSize(
  439. CObject * pHelperSrc,
  440. LPARAM lParam // = 0L
  441. ) const
  442. {
  443. ASSERT_VALID( this );
  444. pHelperSrc; lParam;
  445. return CSize( 16, 16 );
  446. }
  447. void CExtPaintManager::PaintResizingGripper(
  448. CDC & dc,
  449. const RECT & rcGrip,
  450. CObject * pHelperSrc,
  451. LPARAM lParam // = 0L
  452. )
  453. {
  454. ASSERT_VALID( this );
  455. ASSERT( dc.GetSafeHdc() != NULL );
  456. if( rcGrip.left > rcGrip.right
  457. || rcGrip.top > rcGrip.bottom
  458. || ( ! dc.RectVisible(&rcGrip) )
  459. )
  460. return;
  461. COLORREF clrLineShadow = GetColor( COLOR_WINDOW, pHelperSrc, lParam );
  462. COLORREF clrLineFace = GetColor( COLOR_3DSHADOW, pHelperSrc, lParam );
  463. CPen penLineShadow(PS_SOLID, 1, clrLineShadow);
  464. CPen penLineFace(PS_SOLID, 1, clrLineFace);
  465. CPen * pOldPen = NULL;
  466. CPoint ptTop = CPoint( rcGrip.right, rcGrip.bottom - 3 );
  467. CPoint ptBottom = CPoint( rcGrip.right - 2, rcGrip.bottom - 1 );
  468. for( int nLine = 0; nLine < 3; nLine++ )
  469. {
  470. pOldPen = dc.SelectObject( &penLineFace );
  471. dc.MoveTo( ptBottom );
  472. dc.LineTo( ptTop );
  473. ptBottom.Offset( -1, 0 );
  474. ptTop.Offset( 0, -1 );
  475. dc.MoveTo( ptBottom );
  476. dc.LineTo( ptTop );
  477. dc.SelectObject( pOldPen );
  478. pOldPen = dc.SelectObject( &penLineShadow );
  479. ptBottom.Offset( -1, 0 );
  480. ptTop.Offset( 0, -1 );
  481. dc.MoveTo( ptBottom );
  482. dc.LineTo( ptTop );
  483. dc.SelectObject( pOldPen );
  484. ptBottom.Offset( -2, 0 );
  485. ptTop.Offset( 0, -2 );
  486. }
  487. }
  488. void CExtPaintManagerOffice2003::PaintResizingGripper(
  489. CDC & dc,
  490. const RECT & rcGrip,
  491. CObject * pHelperSrc,
  492. LPARAM lParam // = 0L
  493. )
  494. {
  495. ASSERT_VALID( this );
  496. ASSERT( dc.GetSafeHdc() != NULL );
  497. if( IsHighContrast() )
  498. {
  499. CExtPaintManagerXP::PaintResizingGripper( dc, rcGrip, pHelperSrc, lParam );
  500. return;
  501. }
  502. if( ::GetDeviceCaps( dc.m_hDC, BITSPIXEL ) <= 8 )
  503. {
  504. CExtPaintManagerXP::PaintResizingGripper( dc, rcGrip, pHelperSrc, lParam );
  505. return;
  506. }
  507. COLORREF clrDotShadow = GetColor( _2003CLR_GRIPPER_DOT_LIGHT, pHelperSrc, lParam );
  508. COLORREF clrDotFace = GetColor( _2003CLR_GRIPPER_DOT_DARK, pHelperSrc, lParam );
  509. static const CSize g_sizeGripDot( 2, 2 );
  510. static const CSize g_sizeGripDist( 1, 1 );
  511. static const CSize g_sizeGripShadowOffset( 1, 1 );
  512. CRect rcDotFace( CPoint(rcGrip.right, rcGrip.bottom), g_sizeGripDot );
  513. rcDotFace.OffsetRect( -g_sizeGripDot );
  514. CRect rcDotShadow( rcDotFace );
  515. rcDotFace.OffsetRect( -g_sizeGripShadowOffset );
  516. CRect rcDotFaceSave( rcDotFace );
  517. CRect rcDotShadowSave( rcDotShadow );
  518. int nStepH = -(g_sizeGripDot.cx + g_sizeGripDist.cx + g_sizeGripShadowOffset.cx);
  519. int nStepV = -(g_sizeGripDot.cy + g_sizeGripDist.cy + g_sizeGripShadowOffset.cy);
  520. int nDot = 0;
  521. for( nDot = 0; nDot < 3; nDot++ )
  522. {
  523. dc.FillSolidRect( &rcDotShadow, clrDotShadow );
  524. dc.FillSolidRect( &rcDotFace, clrDotFace );
  525. rcDotFace.OffsetRect( 0, nStepV );
  526. rcDotShadow.OffsetRect( 0, nStepV );
  527. } // for( nDot = 0; nDot < nDotCount; nDot++ )
  528. rcDotFace = rcDotFaceSave;
  529. rcDotShadow = rcDotShadowSave;
  530. rcDotFace.OffsetRect( nStepH, 0 );
  531. rcDotShadow.OffsetRect( nStepH, 0 );
  532. for( nDot = 0; nDot < 2; nDot++ )
  533. {
  534. dc.FillSolidRect( &rcDotShadow, clrDotShadow );
  535. dc.FillSolidRect( &rcDotFace, clrDotFace );
  536. rcDotFace.OffsetRect( 0, nStepV );
  537. rcDotShadow.OffsetRect( 0, nStepV );
  538. } // for( nDot = 0; nDot < 2; nDot++ )
  539. rcDotFace = rcDotFaceSave;
  540. rcDotShadow = rcDotShadowSave;
  541. rcDotFace.OffsetRect( nStepH*2, 0 );
  542. rcDotShadow.OffsetRect( nStepH*2, 0 );
  543. dc.FillSolidRect( &rcDotShadow, clrDotShadow );
  544. dc.FillSolidRect( &rcDotFace, clrDotFace );
  545. }
  546. void CExtPaintManagerOffice2007_Impl::PaintResizingGripper(
  547. CDC & dc,
  548. const RECT & rcGrip,
  549. CObject * pHelperSrc,
  550. LPARAM lParam // = 0L
  551. )
  552. {
  553. ASSERT_VALID( this );
  554. ASSERT( dc.GetSafeHdc() != NULL );
  555. if( IsHighContrast() )
  556. {
  557. CExtPaintManagerXP::PaintResizingGripper( dc, rcGrip, pHelperSrc, lParam );
  558. return;
  559. }
  560. if( ::GetDeviceCaps( dc.m_hDC, BITSPIXEL ) <= 8
  561. || m_bmpResizingGripper.IsEmpty()
  562. )
  563. {
  564. CExtPaintManagerOffice2003::PaintResizingGripper( dc, rcGrip, pHelperSrc, lParam );
  565. return;
  566. }
  567. CRect _rc = rcGrip;
  568. CSize _size = m_bmpResizingGripper.GetSize();
  569. _rc.left = _rc.right - _size.cx;
  570. _rc.top = _rc.bottom - _size.cy;
  571. int nOldStretchBltMode = ::GetStretchBltMode( dc.m_hDC );
  572. ::SetStretchBltMode( dc.m_hDC, ( g_PaintManager.m_bIsWinNT ) ? HALFTONE : COLORONCOLOR );
  573. //CExtBitmap _bmp1;
  574. CExtBitmap * pBmp = &m_bmpResizingGripper;
  575. // if( dc.GetLayout() == LAYOUT_RTL )
  576. // {
  577. // _bmp1 = m_bmpResizingGripper;
  578. // _bmp1.FlipHorizontal();
  579. // pBmp = &_bmp1;
  580. // } // if( dc.GetLayout() == LAYOUT_RTL )
  581. pBmp->AlphaBlend(
  582. dc.m_hDC,
  583. _rc.left,
  584. _rc.top,
  585. _rc.Width(),
  586. _rc.Height(),
  587. 0,
  588. 0,
  589. _size.cx,
  590. _size.cy
  591. );
  592. ::SetStretchBltMode(
  593. dc.m_hDC,
  594. nOldStretchBltMode
  595. );
  596. }
  597. void CExtPaintManagerNativeXP::PaintResizingGripper(
  598. CDC & dc,
  599. const RECT & rcGrip,
  600. CObject * pHelperSrc,
  601. LPARAM lParam // = 0L
  602. )
  603. {
  604. ASSERT_VALID( this );
  605. ASSERT( dc.GetSafeHdc() != NULL );
  606. if( rcGrip.left > rcGrip.right
  607. || rcGrip.top > rcGrip.bottom
  608. || ( ! dc.RectVisible(&rcGrip) )
  609. )
  610. return;
  611. if( (! g_PaintManager.m_UxTheme.IsControlsThemed() )
  612. || ( pHelperSrc != NULL
  613. && pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtPopupMenuWnd) )
  614. )
  615. )
  616. {
  617. CExtPaintManager::PaintResizingGripper( dc, rcGrip, pHelperSrc, lParam );
  618. return;
  619. }
  620. CWnd * pWnd = DYNAMIC_DOWNCAST( CWnd, pHelperSrc );
  621. ASSERT( pWnd != NULL );
  622. ASSERT_VALID( pWnd );
  623. if( g_PaintManager.m_UxTheme.OpenThemeData( pWnd->GetSafeHwnd(), VSCLASS_STATUS ) != NULL )
  624. {
  625. VERIFY( 
  626. g_PaintManager.m_UxTheme.DrawBackground(
  627. pWnd->GetSafeHwnd(), 
  628. dc.GetSafeHdc(), 
  629. SP_GRIPPER, 
  630. 0, 
  631. &rcGrip, 
  632. &rcGrip
  633. ) == S_OK
  634. );
  635. g_PaintManager.m_UxTheme.CloseThemeData();
  636. }
  637. }
  638. #if (!defined __EXT_MFC_NO_DATE_PICKER)
  639. void CExtPaintManager::PaintDatePickerPushButton(
  640. CDC & dc,
  641. const CRect & rcButton,
  642. LONG nButtonType, // __EDPWH_BTN_NONE or __EDPWH_BTN_TODAY
  643. __EXT_MFC_SAFE_LPCTSTR strCaption,
  644. bool bFlat,
  645. bool bDrawBorder,
  646. bool bPushed,
  647. bool bHover,
  648. HFONT hFont,
  649. CObject * pHelperSrc,
  650. LPARAM lParam // = 0L
  651. )
  652. {
  653. ASSERT_VALID( this );
  654. ASSERT( dc.GetSafeHdc() != NULL );
  655. lParam;
  656. ASSERT( strCaption != NULL );
  657. nButtonType;
  658. if( ! dc.RectVisible(&rcButton) )
  659. return;
  660. CExtPaintManager::PAINTPUSHBUTTONDATA _ppbd(
  661. pHelperSrc,
  662. true, rcButton, strCaption,
  663. NULL, bFlat, bHover, bPushed,
  664. false, true,
  665. bDrawBorder,
  666. false, false, 
  667. __ALIGN_HORIZ_CENTER | __ALIGN_VERT_CENTER,
  668. hFont
  669. );
  670. PaintPushButton( dc, _ppbd );
  671. }
  672. void CExtPaintManager::PaintDatePickerButtonsSeparator(
  673. CDC & dc,
  674. const RECT & rcSeparator,
  675. CObject * pHelperSrc,
  676. LPARAM lParam // = 0L
  677. )
  678. {
  679. ASSERT_VALID( this );
  680. ASSERT( dc.GetSafeHdc() != NULL );
  681. pHelperSrc;
  682. lParam;
  683. if( ! dc.RectVisible(&rcSeparator) )
  684. return;
  685. dc.FillSolidRect( 
  686. &rcSeparator, 
  687. ::GetSysColor( COLOR_3DSHADOW )
  688. );
  689. }
  690. void CExtPaintManager::PaintDatePickerClientArea(
  691. CDC & dc,
  692. const RECT & rcTotalClient,
  693. const RECT & rcUsedClient,
  694. CObject * pHelperSrc,
  695. LPARAM lParam // = 0L
  696. )
  697. {
  698. ASSERT_VALID( this );
  699. ASSERT( dc.GetSafeHdc() != NULL );
  700. if( ! dc.RectVisible(&rcTotalClient) )
  701. return;
  702. bool bTransparent = false;
  703. CWnd * pWnd = NULL;
  704. if( pHelperSrc != NULL )
  705. {
  706. ASSERT_VALID( pHelperSrc );
  707. pWnd = DYNAMIC_DOWNCAST( CWnd, pHelperSrc );
  708. if( pWnd->GetSafeHwnd() != NULL )
  709. {
  710. if( GetCb2DbTransparentMode( pWnd ) )
  711. {
  712. CExtPaintManager::stat_ExcludeChildAreas(
  713. dc,
  714. pWnd->GetSafeHwnd(),
  715. CExtPaintManager::stat_DefExcludeChildAreaCallback
  716. );
  717. if( PaintDockerBkgnd( true, dc, pWnd ) )
  718. bTransparent = true;
  719. } // if( GetCb2DbTransparentMode( pWnd ) )
  720. } // if( pWnd->GetSafeHwnd() != NULL )
  721. } // if( pHelperSrc != NULL )
  722. if( ! bTransparent )
  723. dc.FillSolidRect(
  724. &rcTotalClient,
  725. GetColor( CExtPaintManager::CLR_3DFACE_OUT, pHelperSrc, lParam )
  726. );
  727. dc.FillSolidRect(
  728. &rcUsedClient,
  729. GetColor( COLOR_WINDOW, pHelperSrc, lParam )
  730. );
  731. }
  732. void CExtPaintManager::PaintDatePickerBorder(
  733. CDC & dc,
  734. const RECT & rcControl,
  735. CObject * pHelperSrc,
  736. LPARAM lParam // = 0L
  737. )
  738. {
  739. ASSERT_VALID( this );
  740. ASSERT( dc.GetSafeHdc() != NULL );
  741. if( ! dc.RectVisible(&rcControl) )
  742. return;
  743. COLORREF clrFace = GetColor( COLOR_BTNFACE, pHelperSrc, lParam );
  744. COLORREF clrShadow = GetColor( COLOR_3DSHADOW, pHelperSrc, lParam );
  745. COLORREF clrDkShadow = GetColor( COLOR_3DDKSHADOW, pHelperSrc, lParam );
  746. COLORREF clrLight = RGB(255,255,255);
  747. CRect rcBorders( rcControl );
  748. dc.Draw3dRect( rcBorders, clrFace, clrDkShadow );
  749. rcBorders.DeflateRect(1,1);
  750. dc.Draw3dRect( rcBorders, clrLight, clrShadow );
  751. rcBorders.DeflateRect(1,1);
  752. dc.Draw3dRect( rcBorders, clrFace, clrFace );
  753. rcBorders.DeflateRect(1,1);
  754. dc.Draw3dRect( rcBorders, clrShadow, clrLight );
  755. }
  756. void CExtPaintManagerXP::PaintDatePickerBorder(
  757. CDC & dc,
  758. const RECT & rcControl,
  759. CObject * pHelperSrc,
  760. LPARAM lParam // = 0L
  761. )
  762. {
  763. ASSERT_VALID( this );
  764. ASSERT( dc.GetSafeHdc() != NULL );
  765. CExtPaintManager::PaintDatePickerBorder(
  766. dc,
  767. rcControl,
  768. pHelperSrc,
  769. lParam
  770. );
  771. }
  772. void CExtPaintManagerOffice2003::PaintDatePickerBorder(
  773. CDC & dc,
  774. const RECT & rcControl,
  775. CObject * pHelperSrc,
  776. LPARAM lParam // = 0L
  777. )
  778. {
  779. ASSERT_VALID( this );
  780. ASSERT( dc.GetSafeHdc() != NULL );
  781. if( ! dc.RectVisible(&rcControl) )
  782. return;
  783. if( IsHighContrast() )
  784. {
  785. CExtPaintManagerXP::PaintDatePickerBorder(
  786. dc,
  787. rcControl,
  788. pHelperSrc,
  789. lParam
  790. );
  791. return;
  792. }
  793. CBrush brBorder( GetColor( COLOR_3DSHADOW, pHelperSrc, lParam ) );
  794. dc.FrameRect( &rcControl, &brBorder );
  795. }
  796. void CExtPaintManager::PaintDatePickerHeaderBackground(
  797. INT nCol,
  798. INT nRow,
  799. CDC & dc,
  800. INT nYear,
  801. INT nMonth,
  802. const RECT & rcHeader,
  803. const RECT & rcHeaderWithoutBorders,
  804. const RECT & rcHeaderDate,
  805. const RECT & rcScrollBtnBackward,
  806. const RECT & rcScrollBtnForward,
  807. CObject * pHelperSrc,
  808. LPARAM lParam // = 0L
  809. )
  810. {
  811. ASSERT_VALID( this );
  812. ASSERT( dc.GetSafeHdc() != NULL );
  813. nCol;
  814. nRow;
  815. nYear;
  816. nMonth;
  817. rcHeaderDate;
  818. rcScrollBtnBackward;
  819. rcScrollBtnForward;
  820. dc.Draw3dRect(
  821. &rcHeader,
  822. RGB(255,255,255),
  823. GetColor( COLOR_3DSHADOW, pHelperSrc, lParam )
  824. );
  825. dc.FillSolidRect(
  826. &rcHeaderWithoutBorders,
  827. GetColor( CExtPaintManager::CLR_3DFACE_OUT, pHelperSrc, lParam )
  828. );
  829. }
  830. void CExtPaintManagerXP::PaintDatePickerHeaderBackground(
  831. INT nCol,
  832. INT nRow,
  833. CDC & dc,
  834. INT nYear,
  835. INT nMonth,
  836. const RECT & rcHeader,
  837. const RECT & rcHeaderWithoutBorders,
  838. const RECT & rcHeaderDate,
  839. const RECT & rcScrollBtnBackward,
  840. const RECT & rcScrollBtnForward,
  841. CObject * pHelperSrc,
  842. LPARAM lParam // = 0L
  843. )
  844. {
  845. ASSERT_VALID( this );
  846. ASSERT( dc.GetSafeHdc() != NULL );
  847. CExtPaintManager::PaintDatePickerHeaderBackground(
  848. nCol,
  849. nRow,
  850. dc,
  851. nYear,
  852. nMonth,
  853. rcHeader,
  854. rcHeaderWithoutBorders,
  855. rcHeaderDate,
  856. rcScrollBtnBackward,
  857. rcScrollBtnForward,
  858. pHelperSrc,
  859. lParam
  860. );
  861. }
  862. void CExtPaintManagerOffice2003::PaintDatePickerHeaderBackground(
  863. INT nCol,
  864. INT nRow,
  865. CDC & dc,
  866. INT nYear,
  867. INT nMonth,
  868. const RECT & rcHeader,
  869. const RECT & rcHeaderWithoutBorders,
  870. const RECT & rcHeaderDate,
  871. const RECT & rcScrollBtnBackward,
  872. const RECT & rcScrollBtnForward,
  873. CObject * pHelperSrc,
  874. LPARAM lParam // = 0L
  875. )
  876. {
  877. ASSERT_VALID( this );
  878. ASSERT( dc.GetSafeHdc() != NULL );
  879. if( IsHighContrast() )
  880. {
  881. CExtPaintManagerXP::PaintDatePickerHeaderBackground(
  882. nCol,
  883. nRow,
  884. dc,
  885. nYear,
  886. nMonth,
  887. rcHeader,
  888. rcHeaderWithoutBorders,
  889. rcHeaderDate,
  890. rcScrollBtnBackward,
  891. rcScrollBtnForward,
  892. pHelperSrc,
  893. lParam
  894. );
  895. return;
  896. }
  897. dc.FillSolidRect(
  898. &rcHeaderWithoutBorders,
  899. GetColor( CExtPaintManager::CLR_3DFACE_OUT, pHelperSrc, lParam )
  900. );
  901. }
  902. #endif // (!defined __EXT_MFC_NO_DATE_PICKER)
  903. #ifndef __EXT_MFC_NO_UNDO_REDO_POPUP
  904. void CExtPaintManager::PaintUndoRedoCaption(
  905. CDC & dc,
  906. const CRect & rcCaption,
  907. __EXT_MFC_SAFE_LPCTSTR strCaption,
  908. CObject * pHelperSrc,
  909. LPARAM lParam // = 0L
  910. )
  911. {
  912. ASSERT_VALID( this );
  913. ASSERT( dc.GetSafeHdc() != NULL );
  914. dc.FillSolidRect(
  915. &rcCaption,
  916. GetMenuFrameFillColor( this )
  917. );
  918. CRect rcFrame( rcCaption );
  919. rcFrame.DeflateRect( 3, 3 );
  920. rcFrame.OffsetRect( 0, 1 );
  921. dc.Draw3dRect( 
  922. &rcFrame,
  923. GetColor( COLOR_3DSHADOW, pHelperSrc, lParam ),
  924. GetColor( COLOR_WINDOW, pHelperSrc, lParam )
  925. );
  926. LOGFONT lf = { sizeof(LOGFONT) };
  927. VERIFY(
  928. ::SystemParametersInfo(
  929. SPI_GETICONTITLELOGFONT,
  930. sizeof(LOGFONT), 
  931. &lf, 
  932. 0 )
  933. );
  934. lf.lfWeight = FW_NORMAL;
  935. CFont font;
  936. font.CreateFontIndirect(&lf);
  937. CFont * pOldFont = dc.SelectObject( &font );
  938. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  939. COLORREF clrOldText =
  940. dc.SetTextColor( GetColor( COLOR_WINDOWTEXT, pHelperSrc, lParam ) );
  941. // text metrics
  942. CExtSafeString sText( strCaption );
  943. UINT nFormat = 
  944. DT_LEFT
  945. | DT_TOP
  946. ;
  947. if( sText.Find( _T('t') ) != -1 ) // do tabs expanding
  948. nFormat |= DT_EXPANDTABS;
  949. CRect rcMeasureText( rcCaption );
  950. dc.DrawText(
  951. sText, 
  952. sText.GetLength(),
  953. rcMeasureText,
  954. (nFormat|DT_CALCRECT)
  955. );
  956. // align text
  957. CRect rcText( 
  958. rcFrame.left + ( rcFrame.Width() - rcMeasureText.Width() ) / 2,
  959. rcFrame.top + ( rcFrame.Height() - rcMeasureText.Height() ) / 2,
  960. rcFrame.right,
  961. rcFrame.bottom
  962. );
  963. dc.DrawText(
  964. strCaption,
  965. int(_tcslen(strCaption)),
  966. &rcText,
  967. (nFormat|DT_END_ELLIPSIS)
  968. );
  969. dc.SetTextColor( clrOldText );
  970. dc.SetBkMode( nOldBkMode );
  971. dc.SelectObject( pOldFont );
  972. }
  973. void CExtPaintManagerXP::PaintUndoRedoCaption(
  974. CDC & dc,
  975. const CRect & rcCaption,
  976. __EXT_MFC_SAFE_LPCTSTR strCaption,
  977. CObject * pHelperSrc,
  978. LPARAM lParam // = 0L
  979. )
  980. {
  981. ASSERT_VALID( this );
  982. ASSERT( dc.GetSafeHdc() != NULL );
  983. dc.FillSolidRect(
  984. &rcCaption,
  985. GetMenuFrameFillColor( this )
  986. );
  987. if( strCaption == NULL )
  988. return;
  989. LOGFONT lf = { sizeof(LOGFONT) };
  990. VERIFY(
  991. ::SystemParametersInfo(
  992. SPI_GETICONTITLELOGFONT,
  993. sizeof(LOGFONT), 
  994. &lf, 
  995. 0 )
  996. );
  997. lf.lfWeight = FW_NORMAL;
  998. CFont font;
  999. font.CreateFontIndirect(&lf);
  1000. CFont * pOldFont = dc.SelectObject( &font );
  1001. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  1002. COLORREF clrOldText =
  1003. dc.SetTextColor( GetColor( COLOR_WINDOWTEXT, pHelperSrc, lParam ) );
  1004. // text metrics
  1005. CExtSafeString sText( strCaption );
  1006. UINT nFormat = 
  1007. DT_LEFT
  1008. | DT_TOP
  1009. ;
  1010. if( sText.Find( _T('t') ) != -1 ) // do tabs expanding
  1011. nFormat |= DT_EXPANDTABS;
  1012. CRect rcMeasureText( rcCaption );
  1013. dc.DrawText(
  1014. sText, 
  1015. sText.GetLength(),
  1016. rcMeasureText,
  1017. (nFormat|DT_CALCRECT)
  1018. );
  1019. // align text
  1020. CRect rcText( 
  1021. rcCaption.left + ( rcCaption.Width() - rcMeasureText.Width() ) / 2,
  1022. rcCaption.top + ( rcCaption.Height() - rcMeasureText.Height() ) / 2,
  1023. rcCaption.right,
  1024. rcCaption.bottom
  1025. );
  1026. dc.DrawText(
  1027. strCaption,
  1028. int(_tcslen(strCaption)),
  1029. &rcText,
  1030. (nFormat|DT_END_ELLIPSIS)
  1031. );
  1032. dc.SetTextColor( clrOldText );
  1033. dc.SetBkMode( nOldBkMode );
  1034. dc.SelectObject( pOldFont );
  1035. }
  1036. #endif // __EXT_MFC_NO_UNDO_REDO_POPUP
  1037. #if( !defined __EXT_MFC_NO_SPIN || !defined __EXT_MFC_NO_DURATIONWND )
  1038. CRect CExtPaintManager::Spin_QueryNcAreaMargins(
  1039. bool bSpinAlignRight,
  1040. bool bSpinAlignLeft,
  1041. bool bHasScrolBars
  1042. ) const
  1043. {
  1044. ASSERT_VALID( this );
  1045. CRect rcNcAreaMargins( 0, 0, 0, 0 );
  1046.   rcNcAreaMargins.SetRect( 0, 3, 0, 3 );
  1047. if( bSpinAlignRight )
  1048. {
  1049. rcNcAreaMargins.left = bHasScrolBars ? 2 : 0;
  1050. rcNcAreaMargins.right = 3;
  1051. }
  1052. else if( bSpinAlignLeft )
  1053. {
  1054. rcNcAreaMargins.left = 3;
  1055. rcNcAreaMargins.right = bHasScrolBars ? 2 : 0;
  1056. }
  1057. return rcNcAreaMargins;
  1058. }
  1059. CRect CExtPaintManagerNativeXP::Spin_QueryNcAreaMargins(
  1060. bool bSpinAlignRight,
  1061. bool bSpinAlignLeft,
  1062. bool bHasScrolBars
  1063. ) const
  1064. {
  1065. ASSERT_VALID( this );
  1066. if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  1067. return 
  1068. CExtPaintManager::Spin_QueryNcAreaMargins(
  1069. bSpinAlignRight,
  1070. bSpinAlignLeft,
  1071. bHasScrolBars
  1072. );
  1073. CRect rcNcAreaMargins( 0, 0, 0, 0 );
  1074.   rcNcAreaMargins.SetRect( 0, 1, 0, 1 );
  1075. if( bSpinAlignRight )
  1076. {
  1077. rcNcAreaMargins.left = bHasScrolBars ? 2 : 0;
  1078. rcNcAreaMargins.right = 1;
  1079. }
  1080. else if( bSpinAlignLeft )
  1081. {
  1082. rcNcAreaMargins.left = 1;
  1083. rcNcAreaMargins.right = bHasScrolBars ? 2 : 0;
  1084. }
  1085. return rcNcAreaMargins;
  1086. }
  1087. void CExtPaintManager::PaintSpinButtonArrow(
  1088. CDC & dc,
  1089. const CRect & rcButton,
  1090. bool bUp,
  1091. bool bHorz,
  1092. bool bEnabled,
  1093. bool bPushed,
  1094. bool bHover,
  1095. bool bHotTrack,
  1096. CObject * pHelperSrc,
  1097. LPARAM lParam // = 0L
  1098. )
  1099. {
  1100. ASSERT_VALID( this );
  1101. ASSERT( dc.GetSafeHdc() != NULL );
  1102. CFont font;
  1103. INT nPt = max( 6, ::MulDiv( min( rcButton.Width(), rcButton.Height() ), 2, 3 ) );
  1104. INT nPPI = ::GetDeviceCaps( dc.m_hDC, LOGPIXELSX );
  1105. INT nPointSize = ::MulDiv( nPt * 10, 96, nPPI );
  1106. font.CreatePointFont( nPointSize, _T("Marlett") );
  1107. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  1108. CFont * pOldFont = dc.SelectObject( &font );
  1109. CString sArrow = 
  1110. bHorz 
  1111. ? ( bUp ? _T("3") : _T("4") )
  1112. : ( bUp ? _T("5") : _T("6") );
  1113. UINT nFormat = DT_LEFT | DT_TOP | DT_SINGLELINE;
  1114. CRect rcTextDimension( rcButton );
  1115. dc.DrawText(
  1116. sArrow,
  1117. sArrow.GetLength(),
  1118. rcTextDimension,
  1119. (nFormat | DT_CALCRECT)
  1120. );
  1121. CRect rcText( rcButton );
  1122. rcText.OffsetRect(
  1123. ( rcButton.Width() - rcTextDimension.Width() ) / 2,
  1124. ( rcButton.Height() - rcTextDimension.Height() ) / 2
  1125. );
  1126. if( ( rcTextDimension.Width() & 0x01 ) == 0 )
  1127. rcText.left ++;
  1128. if( bPushed )
  1129. rcText.OffsetRect( GetPushedOffset() );
  1130. rcText.right = rcText.left + rcTextDimension.Width();
  1131. rcText.bottom = rcText.top + rcTextDimension.Height();
  1132. if( !bEnabled )
  1133. {
  1134. COLORREF clrTextBk = GetColor( COLOR_WINDOW, pHelperSrc, lParam );
  1135. COLORREF clrTextBkOld = dc.SetTextColor( clrTextBk );
  1136. CRect rcTextBk( rcText );
  1137. rcTextBk.OffsetRect(1,1);
  1138. dc.DrawText(
  1139. sArrow,
  1140. -1,
  1141. rcTextBk,
  1142. nFormat
  1143. );
  1144. dc.SetTextColor( clrTextBkOld );
  1145. }
  1146. COLORREF clrText = 
  1147. bEnabled 
  1148. ? ( (bHover && bHotTrack) ? RGB(0,0,128) : GetColor( COLOR_BTNTEXT, pHelperSrc, lParam ) )
  1149. : GetColor( CLR_TEXT_DISABLED, pHelperSrc, lParam );
  1150. COLORREF clrTextOld = dc.SetTextColor( clrText );
  1151. dc.DrawText( sArrow, -1, rcText, nFormat );
  1152. dc.SetTextColor( clrTextOld );
  1153. dc.SelectObject( pOldFont );
  1154. dc.SetBkMode( nOldBkMode );
  1155. }
  1156. void CExtPaintManager::PaintSpinButton(
  1157. CDC & dc,
  1158. const CRect & rcButton,
  1159. bool bUp,
  1160. bool bHorz,
  1161. bool bEnabled,
  1162. bool bFlat,
  1163. bool bDrawBorder,
  1164. bool bPushed,
  1165. bool bHover,
  1166. bool bHotTrack,
  1167. CObject * pHelperSrc,
  1168. LPARAM lParam // = 0L
  1169. )
  1170. {
  1171. ASSERT_VALID( this );
  1172. ASSERT( dc.GetSafeHdc() != NULL );
  1173. if( !bEnabled )
  1174. bHover = bPushed = false;
  1175. dc.FillSolidRect( &rcButton, GetColor( COLOR_3DFACE, pHelperSrc, lParam ) );
  1176. // Draw border
  1177. if( bPushed )
  1178. {
  1179. if( (!bFlat) || bDrawBorder )
  1180. dc.Draw3dRect(
  1181. rcButton,
  1182. GetColor( CLR_3DSHADOW_IN, pHelperSrc, lParam ),
  1183. GetColor( CLR_3DHILIGHT_IN, pHelperSrc, lParam )
  1184. );
  1185. }
  1186. else
  1187. {
  1188. if( (!bFlat) || (bHover && bDrawBorder) )
  1189. dc.Draw3dRect(
  1190. rcButton,
  1191. GetColor( CLR_3DHILIGHT_OUT, pHelperSrc, lParam ),
  1192. GetColor( CLR_3DSHADOW_OUT, pHelperSrc, lParam )
  1193. );
  1194. if( (!bFlat) && bHover )
  1195. {
  1196. CRect rcTemp( rcButton );
  1197. dc.Draw3dRect(
  1198. rcTemp,
  1199. GetColor( CLR_3DSHADOW_OUT, pHelperSrc, lParam ),
  1200. GetColor( CLR_3DDKSHADOW_OUT, pHelperSrc, lParam )
  1201. );
  1202. rcTemp.DeflateRect(1,1);
  1203. dc.Draw3dRect(
  1204. rcTemp,
  1205. GetColor( CLR_3DHILIGHT_OUT, pHelperSrc, lParam ),
  1206. GetColor( CLR_3DSHADOW_OUT, pHelperSrc, lParam )
  1207. );
  1208. }
  1209. }
  1210. // Draw arrow
  1211. PaintSpinButtonArrow(
  1212. dc,
  1213. rcButton,
  1214. bUp,
  1215. bHorz,
  1216. bEnabled,
  1217. bPushed,
  1218. bHover,
  1219. bHotTrack,
  1220. pHelperSrc,
  1221. lParam
  1222. );
  1223. }
  1224. void CExtPaintManagerXP::PaintSpinButton(
  1225. CDC & dc,
  1226. const CRect & rcButton,
  1227. bool bUp,
  1228. bool bHorz,
  1229. bool bEnabled,
  1230. bool bFlat,
  1231. bool bDrawBorder,
  1232. bool bPushed,
  1233. bool bHover,
  1234. bool bHotTrack,
  1235. CObject * pHelperSrc,
  1236. LPARAM lParam // = 0L
  1237. )
  1238. {
  1239. ASSERT_VALID( this );
  1240. ASSERT( dc.GetSafeHdc() != NULL );
  1241. if( !bEnabled )
  1242. bHover = bPushed = false;
  1243. COLORREF clrBk = GetColor( bFlat ? CLR_3DFACE_OUT : COLOR_3DFACE, pHelperSrc, lParam );
  1244. if( bHover )
  1245. clrBk = GetColor( bPushed ? XPCLR_HILIGHT : CLR_3DFACE_IN, pHelperSrc, lParam );
  1246. else if( bPushed )
  1247. clrBk = GetColor( XPCLR_HILIGHT, pHelperSrc, lParam );
  1248. dc.FillSolidRect( &rcButton, clrBk );
  1249. COLORREF clrDkBorder =
  1250. GetColor(
  1251. ( bHover || bPushed )
  1252. ? XPCLR_HILIGHT_BORDER
  1253. : ( bFlat ? XPCLR_HILIGHT_BORDER : COLOR_3DSHADOW )
  1254. ,
  1255. pHelperSrc,
  1256. lParam 
  1257. );
  1258. // Draw border
  1259. if( bPushed )
  1260. {
  1261. if( (!bFlat) || bDrawBorder )
  1262. dc.Draw3dRect( rcButton, clrDkBorder, clrDkBorder );
  1263. }
  1264. else
  1265. {
  1266. if( (!bFlat) || ( bHover && bDrawBorder ) )
  1267. dc.Draw3dRect( rcButton, clrDkBorder, clrDkBorder );
  1268. }
  1269. // Draw arrow
  1270. PaintSpinButtonArrow(
  1271. dc,
  1272. rcButton,
  1273. bUp,
  1274. bHorz,
  1275. bEnabled,
  1276. bPushed,
  1277. bHover,
  1278. bHotTrack,
  1279. pHelperSrc,
  1280. lParam
  1281. );
  1282. }
  1283. void CExtPaintManagerOffice2003::PaintSpinButton(
  1284. CDC & dc,
  1285. const CRect & rcButton,
  1286. bool bUp,
  1287. bool bHorz,
  1288. bool bEnabled,
  1289. bool bFlat,
  1290. bool bDrawBorder,
  1291. bool bPushed,
  1292. bool bHover,
  1293. bool bHotTrack,
  1294. CObject * pHelperSrc,
  1295. LPARAM lParam // = 0L
  1296. )
  1297. {
  1298. ASSERT_VALID( this );
  1299. ASSERT( dc.GetSafeHdc() != NULL );
  1300. if( IsHighContrast() )
  1301. {
  1302. CExtPaintManagerXP::PaintSpinButton(
  1303. dc,
  1304. rcButton,
  1305. bUp,
  1306. bHorz,
  1307. bEnabled,
  1308. bFlat,
  1309. bDrawBorder,
  1310. bPushed,
  1311. bHover,
  1312. bHotTrack,
  1313. pHelperSrc,
  1314. lParam
  1315. );
  1316. return;
  1317. }
  1318. if( !bEnabled )
  1319. bHover = bPushed = false;
  1320. COLORREF clrBkLeft = COLORREF( -1L );
  1321. COLORREF clrBkRight = COLORREF( -1L );
  1322. if( bHover )
  1323. {
  1324. clrBkLeft = GetColor( bPushed ? _2003CLR_BTN_HP_LEFT : _2003CLR_BTN_HOVER_LEFT, pHelperSrc, lParam );
  1325. clrBkRight = GetColor( bPushed ? _2003CLR_BTN_HP_RIGHT : _2003CLR_BTN_HOVER_RIGHT, pHelperSrc, lParam );
  1326. }
  1327. else if( bPushed )
  1328. {
  1329. clrBkLeft = GetColor( _2003CLR_BTN_PRESSED_LEFT, pHelperSrc, lParam );
  1330. clrBkRight = GetColor( _2003CLR_BTN_PRESSED_RIGHT, pHelperSrc, lParam );
  1331. }
  1332. if( clrBkLeft != COLORREF( -1L ) 
  1333. && clrBkRight != COLORREF( -1L ) 
  1334. )
  1335. {
  1336. stat_PaintGradientRect(
  1337. dc,
  1338. rcButton,
  1339. bHorz ? clrBkLeft : clrBkRight,
  1340. bHorz ? clrBkRight : clrBkLeft,
  1341. !bHorz
  1342. );
  1343. }
  1344. else
  1345. {
  1346. dc.FillSolidRect( 
  1347. &rcButton, 
  1348. GetColor( bFlat ? CLR_3DFACE_OUT : COLOR_3DFACE, pHelperSrc, lParam )
  1349. );
  1350. }
  1351. COLORREF clrDkBorder =
  1352. GetColor(
  1353. ( bHover || bPushed ) ? XPCLR_HILIGHT_BORDER : COLOR_3DSHADOW,
  1354. pHelperSrc,
  1355. lParam 
  1356. );
  1357. // Draw border
  1358. if( bPushed )
  1359. {
  1360. if( (!bFlat) || bDrawBorder )
  1361. dc.Draw3dRect( rcButton, clrDkBorder, clrDkBorder );
  1362. }
  1363. else
  1364. {
  1365. if( (!bFlat) || ( bHover && bDrawBorder ) )
  1366. dc.Draw3dRect( rcButton, clrDkBorder, clrDkBorder );
  1367. }
  1368. // Draw arrow
  1369. PaintSpinButtonArrow(
  1370. dc,
  1371. rcButton,
  1372. bUp,
  1373. bHorz,
  1374. bEnabled,
  1375. bPushed,
  1376. bHover,
  1377. bHotTrack,
  1378. pHelperSrc,
  1379. lParam
  1380. );
  1381. }
  1382. void CExtPaintManagerNativeXP::PaintSpinButton(
  1383. CDC & dc,
  1384. const CRect & rcButton,
  1385. bool bUp,
  1386. bool bHorz,
  1387. bool bEnabled,
  1388. bool bFlat,
  1389. bool bDrawBorder,
  1390. bool bPushed,
  1391. bool bHover,
  1392. bool bHotTrack,
  1393. CObject * pHelperSrc,
  1394. LPARAM lParam // = 0L
  1395. )
  1396. {
  1397. ASSERT_VALID( this );
  1398. ASSERT( dc.GetSafeHdc() != NULL );
  1399. if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  1400. {
  1401. CExtPaintManager::PaintSpinButton(
  1402. dc,
  1403. rcButton,
  1404. bUp,
  1405. bHorz,
  1406. bEnabled,
  1407. bFlat,
  1408. bDrawBorder,
  1409. bPushed,
  1410. bHover,
  1411. bHotTrack,
  1412. pHelperSrc,
  1413. lParam
  1414. );
  1415. return;
  1416. } // if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  1417. HWND hWnd = NULL;
  1418. if( pHelperSrc != NULL )
  1419. {
  1420. if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CWnd ) ) )
  1421. {
  1422. CWnd * pWnd = DYNAMIC_DOWNCAST( CWnd, pHelperSrc );
  1423. ASSERT_VALID( pWnd );
  1424. hWnd = pWnd->GetSafeHwnd();
  1425. }
  1426. else if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtBarButton ) ) )
  1427. {
  1428. CExtBarButton * pTBB = DYNAMIC_DOWNCAST( CExtBarButton, pHelperSrc );
  1429. ASSERT_VALID( pTBB );
  1430. hWnd = pTBB->GetBar()->GetSafeHwnd();
  1431. }
  1432. }
  1433. ASSERT( hWnd != NULL );
  1434. INT nPartID = 0;
  1435. INT nStateID = 0;
  1436. if( bUp )
  1437. {
  1438. if( bHorz )
  1439. {
  1440. nPartID = SPNP_UPHORZ;
  1441. nStateID = 
  1442. (!bEnabled) 
  1443. ? UPHZS_DISABLED 
  1444. : bPushed 
  1445. ? UPHZS_PRESSED 
  1446. : bHover
  1447. ? UPHZS_HOT
  1448. : UPHZS_NORMAL;
  1449. }
  1450. else
  1451. {
  1452. nPartID = SPNP_UP;
  1453. nStateID = 
  1454. (!bEnabled) 
  1455. ? UPS_DISABLED 
  1456. : bPushed 
  1457. ? UPS_PRESSED 
  1458. : bHover
  1459. ? UPS_HOT
  1460. : UPS_NORMAL;
  1461. }
  1462. }
  1463. else
  1464. {
  1465. if( bHorz )
  1466. {
  1467. nPartID = SPNP_DOWNHORZ;
  1468. nStateID = 
  1469. (!bEnabled) 
  1470. ? DNHZS_DISABLED 
  1471. : bPushed 
  1472. ? DNHZS_PRESSED 
  1473. : bHover
  1474. ? DNHZS_HOT
  1475. : DNHZS_NORMAL;
  1476. }
  1477. else
  1478. {
  1479. nPartID = SPNP_DOWN;
  1480. nStateID = 
  1481. (!bEnabled) 
  1482. ? DNS_DISABLED 
  1483. : bPushed 
  1484. ? DNS_PRESSED 
  1485. : bHover
  1486. ? DNS_HOT
  1487. : DNS_NORMAL;
  1488. }
  1489. }
  1490. if( g_PaintManager.m_UxTheme.OpenThemeData( hWnd, VSCLASS_SPIN ) != NULL )
  1491. {
  1492. VERIFY( 
  1493. g_PaintManager.m_UxTheme.DrawBackground(
  1494. hWnd, 
  1495. dc.GetSafeHdc(), 
  1496. nPartID, 
  1497. nStateID, 
  1498. &rcButton, 
  1499. &rcButton
  1500. ) == S_OK
  1501. );
  1502. g_PaintManager.m_UxTheme.CloseThemeData();
  1503. }
  1504. }
  1505. void CExtPaintManagerOffice2007_Impl::PaintSpinButton(
  1506. CDC & dc,
  1507. const CRect & rcButton,
  1508. bool bUp,
  1509. bool bHorz,
  1510. bool bEnabled,
  1511. bool bFlat,
  1512. bool bDrawBorder,
  1513. bool bPushed,
  1514. bool bHover,
  1515. bool bHotTrack,
  1516. CObject * pHelperSrc,
  1517. LPARAM lParam // = 0L
  1518. )
  1519. {
  1520. ASSERT_VALID( this );
  1521. ASSERT( dc.GetSafeHdc() != NULL );
  1522. if( IsHighContrast() )
  1523. {
  1524. CExtPaintManagerXP::PaintSpinButton(
  1525. dc,
  1526. rcButton,
  1527. bUp,
  1528. bHorz,
  1529. bEnabled,
  1530. bFlat,
  1531. bDrawBorder,
  1532. bPushed,
  1533. bHover,
  1534. bHotTrack,
  1535. pHelperSrc,
  1536. lParam
  1537. );
  1538. return;
  1539. }
  1540. CExtPaintManager::PAINTPUSHBUTTONDATA _ppbd;
  1541. _ppbd.m_pHelperSrc = pHelperSrc;
  1542. _ppbd.m_rcClient = rcButton;
  1543. _ppbd.m_bFlat = bFlat;
  1544. _ppbd.m_bDrawBorder = bDrawBorder;
  1545. _ppbd.m_bHover = bHover;
  1546. _ppbd.m_bPushed = bPushed;
  1547. _ppbd.m_bEnabled = bEnabled;
  1548. _ppbd.m_bTransparentBackground = true;
  1549. PaintPushButton( dc, _ppbd );
  1550. // Draw arrow
  1551. PaintSpinButtonArrow(
  1552. dc,
  1553. rcButton,
  1554. bUp,
  1555. bHorz,
  1556. bEnabled,
  1557. bPushed,
  1558. bHover,
  1559. bHotTrack,
  1560. pHelperSrc,
  1561. lParam
  1562. );
  1563. }
  1564. #endif // #if( !defined __EXT_MFC_NO_SPIN || !defined __EXT_MFC_NO_DURATIONWND )
  1565. #ifndef __EXT_MFC_NO_DURATIONWND
  1566. INT CExtPaintManager::Duration_GetSpinButtonWidth(
  1567. const CObject * pHelperSrc,
  1568. LPARAM lParam // = 0L
  1569. ) const
  1570. {
  1571. ASSERT_VALID( this );
  1572. pHelperSrc;
  1573. lParam;
  1574. return 15;
  1575. }
  1576. INT CExtPaintManagerNativeXP::Duration_GetSpinButtonWidth(
  1577. const CObject * pHelperSrc,
  1578. LPARAM lParam // = 0L
  1579. ) const
  1580. {
  1581. ASSERT_VALID( this );
  1582. if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  1583. return 
  1584. CExtPaintManager::Duration_GetSpinButtonWidth(
  1585. pHelperSrc,
  1586. lParam
  1587. );
  1588. HWND hWnd = NULL;
  1589. CWnd * pWnd = DYNAMIC_DOWNCAST( CWnd, pHelperSrc );
  1590. if( pWnd != NULL )
  1591. {
  1592. ASSERT_VALID( pWnd );
  1593. hWnd = pWnd->GetSafeHwnd();
  1594. }
  1595. if( g_PaintManager.m_UxTheme.OpenThemeData( hWnd, VSCLASS_SPIN ) != NULL )
  1596. {
  1597. CWindowDC dc( NULL );
  1598. CSize szPart(0,0);
  1599. if( g_PaintManager.m_UxTheme.GetThemePartSize(
  1600. dc.GetSafeHdc(), 
  1601. SPNP_UPHORZ, 
  1602. 0, 
  1603. NULL, 
  1604. CExtUxTheme::__EXT_UX_TS_TRUE,
  1605. &szPart
  1606. ) == S_OK
  1607. )
  1608. return szPart.cy;
  1609. }
  1610. return 15;
  1611. }
  1612. INT CExtPaintManager::Duration_GetDropDownButtonWidth(
  1613. const CObject * pHelperSrc,
  1614. LPARAM lParam // = 0L
  1615. ) const
  1616. {
  1617. ASSERT_VALID( this );
  1618. pHelperSrc;
  1619. lParam;
  1620. return 15;
  1621. }
  1622. INT CExtPaintManagerNativeXP::Duration_GetDropDownButtonWidth(
  1623. const CObject * pHelperSrc,
  1624. LPARAM lParam // = 0L
  1625. ) const
  1626. {
  1627. ASSERT_VALID( this );
  1628. if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  1629. return 
  1630. CExtPaintManager::Duration_GetDropDownButtonWidth(
  1631. pHelperSrc,
  1632. lParam
  1633. );
  1634. //HWND hWnd = NULL;
  1635. //CWnd * pWnd = DYNAMIC_DOWNCAST( CWnd, pHelperSrc );
  1636. // if( pWnd != NULL )
  1637. // {
  1638. // ASSERT_VALID( pWnd );
  1639. // hWnd = pWnd->GetSafeHwnd();
  1640. // }
  1641. //
  1642. // if( g_PaintManager.m_UxTheme.OpenThemeData( hWnd, VSCLASS_COMBOBOX ) != NULL )
  1643. // {
  1644. // CWindowDC dc( NULL );
  1645. // CSize szPart(0,0);
  1646. // if( g_PaintManager.m_UxTheme.GetThemePartSize(
  1647. // dc.GetSafeHdc(), 
  1648. // CP_DROPDOWNBUTTON, 
  1649. // CBXS_NORMAL, 
  1650. // NULL, 
  1651. // CExtUxTheme::__EXT_UX_TS_TRUE,
  1652. // &szPart
  1653. // ) == S_OK
  1654. // )
  1655. // return szPart.cx;
  1656. // }
  1657. //
  1658. // return 15;
  1659. return  Duration_GetSpinButtonWidth( pHelperSrc, lParam );
  1660. }
  1661. CRect CExtPaintManager::Duration_GetSpinButtonExtraSpace(
  1662. const CObject * pHelperSrc,
  1663. LPARAM lParam // = 0L
  1664. ) const
  1665. {
  1666. ASSERT_VALID( this );
  1667. pHelperSrc;
  1668. lParam;
  1669. return CRect( 1, 1, 1, 1 );
  1670. }
  1671. CRect CExtPaintManagerNativeXP::Duration_GetSpinButtonExtraSpace(
  1672. const CObject * pHelperSrc,
  1673. LPARAM lParam // = 0L
  1674. ) const
  1675. {
  1676. ASSERT_VALID( this );
  1677. pHelperSrc;
  1678. lParam;
  1679. return CRect( 0, 0, 0, 0 );
  1680. }
  1681. CRect CExtPaintManager::Duration_GetDropDownButtonExtraSpace(
  1682. const CObject * pHelperSrc,
  1683. LPARAM lParam // = 0L
  1684. ) const
  1685. {
  1686. ASSERT_VALID( this );
  1687. pHelperSrc;
  1688. lParam;
  1689. return CRect( 1, 1, 1, 1 );
  1690. }
  1691. CRect CExtPaintManagerNativeXP::Duration_GetDropDownButtonExtraSpace(
  1692. const CObject * pHelperSrc,
  1693. LPARAM lParam // = 0L
  1694. ) const
  1695. {
  1696. ASSERT_VALID( this );
  1697. pHelperSrc;
  1698. lParam;
  1699. return CRect( 1, 0, 0, 0 );
  1700. }
  1701. void CExtPaintManager::Duration_PaintSpinButton(
  1702. CDC & dc,
  1703. const CRect & rcButton,
  1704. bool bUp,
  1705. bool bEnabled,
  1706. bool bPushed,
  1707. bool bHovered,
  1708. CObject * pHelperSrc,
  1709. LPARAM lParam // = 0L
  1710. )
  1711. {
  1712. ASSERT_VALID( this );
  1713. ASSERT( dc.GetSafeHdc() != NULL );
  1714. if( ! dc.RectVisible( &rcButton ) )
  1715. return;
  1716. PaintSpinButton(
  1717. dc,
  1718. rcButton,
  1719. bUp,
  1720. false,
  1721. bEnabled,
  1722. false,
  1723. false,
  1724. bPushed,
  1725. bHovered,
  1726. false,
  1727. pHelperSrc,
  1728. lParam
  1729. );
  1730. }
  1731. void CExtPaintManagerNativeXP::Duration_PaintSpinButton(
  1732. CDC & dc,
  1733. const CRect & rcButton,
  1734. bool bUp,
  1735. bool bEnabled,
  1736. bool bPushed,
  1737. bool bHovered,
  1738. CObject * pHelperSrc,
  1739. LPARAM lParam // = 0L
  1740. )
  1741. {
  1742. ASSERT_VALID( this );
  1743. ASSERT( dc.GetSafeHdc() != NULL );
  1744. if( ! dc.RectVisible( &rcButton ) )
  1745. return;
  1746. if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  1747. {
  1748. CExtPaintManager::Duration_PaintSpinButton(
  1749. dc,
  1750. rcButton,
  1751. bUp,
  1752. bEnabled,
  1753. bPushed,
  1754. bHovered,
  1755. pHelperSrc,
  1756. lParam
  1757. );
  1758. return;
  1759. }
  1760. HWND hWnd = NULL;
  1761. CWnd * pWnd = DYNAMIC_DOWNCAST( CWnd, pHelperSrc );
  1762. if( pWnd != NULL )
  1763. {
  1764. ASSERT_VALID( pWnd );
  1765. hWnd = pWnd->GetSafeHwnd();
  1766. }
  1767. if( g_PaintManager.m_UxTheme.OpenThemeData( hWnd, VSCLASS_SPIN ) != NULL )
  1768. {
  1769. INT nPartID = 0;
  1770. INT nStateID = 0;
  1771. if( bUp )
  1772. {
  1773. nPartID = SPNP_UP;
  1774. nStateID = 
  1775. (!bEnabled) 
  1776. ? UPS_DISABLED 
  1777. : bPushed 
  1778. ? UPS_PRESSED 
  1779. : bHovered
  1780. ? UPS_HOT
  1781. : UPS_NORMAL;
  1782. }
  1783. else
  1784. {
  1785. nPartID = SPNP_DOWN;
  1786. nStateID = 
  1787. (!bEnabled) 
  1788. ? DNS_DISABLED 
  1789. : bPushed 
  1790. ? DNS_PRESSED 
  1791. : bHovered
  1792. ? DNS_HOT
  1793. : DNS_NORMAL;
  1794. }
  1795. CRect rc( rcButton );
  1796. rc.InflateRect( 1, bUp ? 1 : -1 , 1, bUp ? -1 : 1 );
  1797. // drop spin button
  1798. VERIFY( 
  1799. g_PaintManager.m_UxTheme.DrawBackground(
  1800. hWnd,
  1801. dc.GetSafeHdc(), 
  1802. nPartID, 
  1803. nStateID, 
  1804. &rc, 
  1805. &rc
  1806. ) == S_OK
  1807. );
  1808. g_PaintManager.m_UxTheme.CloseThemeData();
  1809. }
  1810. }
  1811. void CExtPaintManager::Duration_PaintDropDownButton(
  1812. CDC & dc,
  1813. const CRect & rcButton,
  1814. bool bEnabled,
  1815. bool bPushed,
  1816. bool bHovered,
  1817. CObject * pHelperSrc,
  1818. LPARAM lParam // = 0L
  1819. )
  1820. {
  1821. ASSERT_VALID( this );
  1822. ASSERT( dc.GetSafeHdc() != NULL );
  1823. if( ! dc.RectVisible( &rcButton ) )
  1824. return;
  1825. PaintSpinButton(
  1826. dc,
  1827. rcButton,
  1828. false,
  1829. false,
  1830. bEnabled,
  1831. false,
  1832. false,
  1833. bPushed,
  1834. bHovered,
  1835. false,
  1836. pHelperSrc,
  1837. lParam
  1838. );
  1839. }
  1840. void CExtPaintManagerNativeXP::Duration_PaintDropDownButton(
  1841. CDC & dc,
  1842. const CRect & rcButton,
  1843. bool bEnabled,
  1844. bool bPushed,
  1845. bool bHovered,
  1846. CObject * pHelperSrc,
  1847. LPARAM lParam // = 0L
  1848. )
  1849. {
  1850. ASSERT_VALID( this );
  1851. ASSERT( dc.GetSafeHdc() != NULL );
  1852. if( ! dc.RectVisible( &rcButton ) )
  1853. return;
  1854. if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  1855. {
  1856. CExtPaintManager::Duration_PaintDropDownButton(
  1857. dc,
  1858. rcButton,
  1859. bEnabled,
  1860. bPushed,
  1861. bHovered,
  1862. pHelperSrc,
  1863. lParam
  1864. );
  1865. return;
  1866. }
  1867. HWND hWnd = NULL;
  1868. CWnd * pWnd = DYNAMIC_DOWNCAST( CWnd, pHelperSrc );
  1869. if( pWnd != NULL )
  1870. {
  1871. ASSERT_VALID( pWnd );
  1872. hWnd = pWnd->GetSafeHwnd();
  1873. }
  1874. if( g_PaintManager.m_UxTheme.OpenThemeData( hWnd, VSCLASS_COMBOBOX ) != NULL )
  1875. {
  1876. INT nStateID = 
  1877. (!bEnabled)
  1878. ? CBXS_DISABLED
  1879. : bPushed
  1880. ? CBXS_PRESSED
  1881. : bHovered
  1882. ? CBXS_HOT
  1883. : CBXS_NORMAL;
  1884. CRect rc( rcButton );
  1885. if( ! g_PaintManager.m_bIsWinVistaOrLater )
  1886. rc.InflateRect( 1, 1 );
  1887. // drop down button
  1888. VERIFY( 
  1889. g_PaintManager.m_UxTheme.DrawBackground(
  1890. hWnd,
  1891. dc.GetSafeHdc(), 
  1892. CP_DROPDOWNBUTTON, 
  1893. nStateID, 
  1894. &rc, 
  1895. &rc
  1896. ) == S_OK
  1897. );
  1898. g_PaintManager.m_UxTheme.CloseThemeData();
  1899. }
  1900. }
  1901. #endif // __EXT_MFC_NO_DURATIONWND
  1902. #ifndef __EXT_MFC_NO_SLIDER
  1903. bool CExtPaintManager::PaintSliderChannel(
  1904. CDC & dc,
  1905. const CRect & rcChannel,
  1906. bool bHorz,
  1907. bool bEnabled,
  1908. CObject * pHelperSrc,
  1909. LPARAM lParam // = 0L
  1910. )
  1911. {
  1912. ASSERT_VALID( this );
  1913. ASSERT( dc.GetSafeHdc() != NULL );
  1914. bHorz;
  1915. bEnabled;
  1916. if( ! dc.RectVisible( &rcChannel ) )
  1917. return false;
  1918. dc.FillSolidRect(
  1919. &rcChannel,
  1920. GetColor( CLR_3DFACE_OUT, pHelperSrc, lParam ) 
  1921. );
  1922. dc.Draw3dRect(
  1923. &rcChannel,
  1924. GetColor( CLR_3DSHADOW_OUT, pHelperSrc, lParam ), 
  1925. GetColor( CLR_3DSHADOW_OUT, pHelperSrc, lParam )
  1926. );
  1927. return true;
  1928. }
  1929. bool CExtPaintManagerNativeXP::PaintSliderChannel(
  1930. CDC & dc,
  1931. const CRect & rcChannel,
  1932. bool bHorz,
  1933. bool bEnabled,
  1934. CObject * pHelperSrc,
  1935. LPARAM lParam // = 0L
  1936. )
  1937. {
  1938. ASSERT_VALID( this );
  1939. ASSERT( dc.GetSafeHdc() != NULL );
  1940. if( ! dc.RectVisible( &rcChannel ) )
  1941. return false;
  1942. if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  1943. return 
  1944. CExtPaintManager::PaintSliderChannel(
  1945. dc,
  1946. rcChannel,
  1947. bHorz,
  1948. bEnabled,
  1949. pHelperSrc,
  1950. lParam
  1951. );
  1952. CWnd * pWnd =
  1953. DYNAMIC_DOWNCAST(
  1954. CWnd,
  1955. pHelperSrc
  1956. );
  1957. ASSERT( pWnd != NULL );
  1958. ASSERT_VALID( pWnd );
  1959. if( g_PaintManager.m_UxTheme.OpenThemeData( pWnd->GetSafeHwnd(), VSCLASS_TRACKBAR ) != NULL )
  1960. {
  1961. INT nPartID = 
  1962. bHorz ? TKP_TRACK : TKP_TRACKVERT;
  1963. INT nStateID = 
  1964. bHorz ? TKS_NORMAL : TRVS_NORMAL;
  1965. VERIFY( 
  1966. g_PaintManager.m_UxTheme.DrawBackground(
  1967. pWnd->GetSafeHwnd(),
  1968. dc.GetSafeHdc(), 
  1969. nPartID, 
  1970. nStateID, 
  1971. &rcChannel, 
  1972. &rcChannel
  1973. ) == S_OK
  1974. );
  1975. g_PaintManager.m_UxTheme.CloseThemeData();
  1976. return true;
  1977. }
  1978. return false;
  1979. }
  1980. bool CExtPaintManager::PaintSliderThumb(
  1981. CDC & dc,
  1982. const CRect & rcThumb,
  1983. bool bHorz,
  1984. bool bLeft,
  1985. bool bRight,
  1986. bool bEnabled,
  1987. bool bPushed,
  1988. bool bFocused,
  1989. bool bHover,
  1990. CObject * pHelperSrc,
  1991. LPARAM lParam // = 0L
  1992. )
  1993. {
  1994. ASSERT_VALID( this );
  1995. ASSERT( dc.GetSafeHdc() != NULL );
  1996. lParam;
  1997. bLeft;
  1998. bRight;
  1999. bFocused;
  2000. if( ! dc.RectVisible( &rcThumb ) )
  2001. return false;
  2002. PAINTPUSHBUTTONDATA _ppbd(
  2003. pHelperSrc,
  2004. bHorz,
  2005. rcThumb,
  2006. _T(""),
  2007. NULL, // pIcon
  2008. false, // bFlat
  2009. bHover,
  2010. bPushed,
  2011. false, // bIndeterminate
  2012. bEnabled,
  2013. false, // bDrawBorder
  2014. false, // bDrawFocusRect
  2015. false, // bDefaultPushButton
  2016. 0,
  2017. NULL, // hFont
  2018. false, // bDropDown
  2019. 0,
  2020. false // bTransparentBackground
  2021. );
  2022. PaintPushButton( dc, _ppbd );
  2023. return true;
  2024. }
  2025. bool CExtPaintManagerNativeXP::PaintSliderThumb(
  2026. CDC & dc,
  2027. const CRect & rcThumb,
  2028. bool bHorz,
  2029. bool bLeft,
  2030. bool bRight,
  2031. bool bEnabled,
  2032. bool bPushed,
  2033. bool bFocused,
  2034. bool bHover,
  2035. CObject * pHelperSrc,
  2036. LPARAM lParam // = 0L
  2037. )
  2038. {
  2039. ASSERT_VALID( this );
  2040. ASSERT( dc.GetSafeHdc() != NULL );
  2041. if( ! dc.RectVisible( &rcThumb ) )
  2042. return false;
  2043. if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  2044. return 
  2045. CExtPaintManager::PaintSliderThumb(
  2046. dc,
  2047. rcThumb,
  2048. bHorz,
  2049. bLeft,
  2050. bRight,
  2051. bEnabled,
  2052. bPushed,
  2053. bFocused,
  2054. bHover,
  2055. pHelperSrc,
  2056. lParam
  2057. );
  2058. CWnd * pWnd =
  2059. DYNAMIC_DOWNCAST(
  2060. CWnd,
  2061. pHelperSrc
  2062. );
  2063. ASSERT( pWnd != NULL );
  2064. ASSERT_VALID( pWnd );
  2065. if( g_PaintManager.m_UxTheme.OpenThemeData( pWnd->GetSafeHwnd(), VSCLASS_TRACKBAR ) != NULL )
  2066. {
  2067. INT nPartID = 
  2068. bHorz 
  2069. ? (bLeft && bRight) 
  2070. ? TKP_THUMB
  2071. : bLeft
  2072. ? TKP_THUMBTOP
  2073. : TKP_THUMBBOTTOM
  2074. : (bLeft && bRight) 
  2075. ? TKP_THUMBVERT
  2076. : bLeft
  2077. ? TKP_THUMBLEFT
  2078. : TKP_THUMBRIGHT;
  2079. INT nStateID = 
  2080. (!bEnabled)
  2081. ? TUS_DISABLED
  2082. : bPushed
  2083. ? TUS_PRESSED
  2084. : bHover
  2085. ? TUS_HOT
  2086. : bFocused
  2087. ? TUS_FOCUSED
  2088. : TUS_NORMAL;
  2089.   VERIFY( 
  2090. g_PaintManager.m_UxTheme.DrawBackground(
  2091. pWnd->GetSafeHwnd(),
  2092. dc.GetSafeHdc(), 
  2093. nPartID, 
  2094. nStateID, 
  2095. &rcThumb, 
  2096. &rcThumb
  2097. ) == S_OK
  2098. );
  2099. g_PaintManager.m_UxTheme.CloseThemeData();
  2100. return true;
  2101. }
  2102. return false;
  2103. }
  2104. bool CExtPaintManagerOffice2007_Impl::PaintSliderThumb(
  2105. CDC & dc,
  2106. const CRect & rcThumb,
  2107. bool bHorz,
  2108. bool bLeft,
  2109. bool bRight,
  2110. bool bEnabled,
  2111. bool bPushed,
  2112. bool bFocused,
  2113. bool bHover,
  2114. CObject * pHelperSrc,
  2115. LPARAM lParam // = 0L
  2116. )
  2117. {
  2118. ASSERT_VALID( this );
  2119. ASSERT( dc.GetSafeHdc() != NULL );
  2120. if( ! dc.RectVisible( &rcThumb ) )
  2121. return false;
  2122. if( IsHighContrast() )
  2123. return 
  2124. CExtPaintManagerXP::PaintSliderThumb(
  2125. dc,
  2126. rcThumb,
  2127. bHorz,
  2128. bLeft,
  2129. bRight,
  2130. bEnabled,
  2131. bPushed,
  2132. bFocused,
  2133. bHover,
  2134. pHelperSrc,
  2135. lParam
  2136. );
  2137. PAINTPUSHBUTTONDATA _ppbd(
  2138. pHelperSrc,
  2139. bHorz,
  2140. rcThumb,
  2141. _T(""),
  2142. NULL, // pIcon
  2143. false, // bFlat
  2144. bHover,
  2145. bPushed,
  2146. false, // bIndeterminate
  2147. bEnabled,
  2148. false, // bDrawBorder
  2149. false, // bDrawFocusRect
  2150. false, // bDefaultPushButton
  2151. 0,
  2152. NULL, // hFont
  2153. false, // bDropDown
  2154. 0,
  2155. true // bTransparentBackground
  2156. );
  2157. PaintPushButton( dc, _ppbd );
  2158. return true;
  2159. }
  2160. bool CExtPaintManager::PaintSliderTics(
  2161. CDC & dc,
  2162. const CRect & rcClient,
  2163. bool bHorz,
  2164. bool bEnabled,
  2165. CObject * pHelperSrc,
  2166. LPARAM lParam // = 0L
  2167. )
  2168. {
  2169. ASSERT_VALID( this );
  2170. ASSERT( dc.GetSafeHdc() != NULL );
  2171. bHorz;
  2172. bEnabled;
  2173. pHelperSrc;
  2174. lParam;
  2175. if( ! dc.RectVisible( &rcClient ) )
  2176. return false;
  2177. return false;
  2178. }
  2179. #endif // __EXT_MFC_NO_SLIDER
  2180. bool CExtPaintManager::PaintGroupBoxFrame(
  2181. CDC & dc,
  2182. const RECT & rcBorder,
  2183. COLORREF clrFrame, // = COLORREF(-1L)
  2184. CObject * pHelperSrc, // = NULL
  2185. LPARAM lParam // = 0L
  2186. )
  2187. {
  2188. ASSERT_VALID( this );
  2189. ASSERT( dc.GetSafeHdc() != NULL );
  2190. CWnd * pWnd =
  2191. DYNAMIC_DOWNCAST(
  2192. CWnd,
  2193. pHelperSrc
  2194. );
  2195. ASSERT( pWnd != NULL );
  2196. ASSERT_VALID( pWnd );
  2197. if( ! g_PaintManager.m_UxTheme.IsControlsThemed() ) 
  2198. {
  2199. if( clrFrame == COLORREF(-1L) )
  2200. clrFrame = GetColor( CLR_GROUP_BOX_FRAME, pHelperSrc, lParam );
  2201. CRect rcClient( rcBorder );
  2202. dc.Draw3dRect(
  2203. &rcClient,
  2204. clrFrame,
  2205. GetColor( COLOR_WINDOW, pHelperSrc, lParam )
  2206. );
  2207. rcClient.DeflateRect(1,1);
  2208. dc.Draw3dRect(
  2209. &rcClient,
  2210. GetColor( COLOR_WINDOW, pHelperSrc, lParam ),
  2211. clrFrame
  2212. );
  2213. } // if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  2214. else
  2215. {
  2216. if( clrFrame == COLORREF(-1L) )
  2217. {
  2218. if( g_PaintManager.m_UxTheme.OpenThemeData( pWnd->GetSafeHwnd(), VSCLASS_BUTTON ) != NULL )
  2219. {
  2220. VERIFY( 
  2221. g_PaintManager.m_UxTheme.DrawThemeBackground(
  2222. dc.GetSafeHdc(), 
  2223. BP_GROUPBOX, 
  2224. pWnd->IsWindowEnabled() 
  2225. ? GBS_NORMAL 
  2226. : GBS_DISABLED, 
  2227. &rcBorder, 
  2228. &rcBorder
  2229. ) == S_OK
  2230. );
  2231. g_PaintManager.m_UxTheme.CloseThemeData();
  2232. }
  2233. }
  2234. else
  2235. {
  2236. CBrush * pBrush =
  2237. CBrush::FromHandle( (HBRUSH)::GetStockObject(NULL_BRUSH) );
  2238. CBrush * pOldBrush = dc.SelectObject( pBrush );
  2239. CPen pen;
  2240. pen.CreatePen(
  2241. PS_SOLID,
  2242. 1,
  2243. clrFrame
  2244. );
  2245. CPen * pOldPen = dc.SelectObject( &pen );
  2246. dc.RoundRect(
  2247. &rcBorder,
  2248. CPoint( 10, 10 )
  2249. );
  2250. dc.SelectObject( pOldPen );
  2251. dc.SelectObject( pOldBrush );
  2252. }
  2253. } // else from if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  2254. return true;
  2255. }
  2256. bool CExtPaintManagerOffice2007_Impl::PaintGroupBoxFrame(
  2257. CDC & dc,
  2258. const RECT & rcBorder,
  2259. COLORREF clrFrame, // = COLORREF(-1L)
  2260. CObject * pHelperSrc, // = NULL
  2261. LPARAM lParam // = 0L
  2262. )
  2263. {
  2264. ASSERT_VALID( this );
  2265. ASSERT( dc.GetSafeHdc() != NULL );
  2266. if( IsHighContrast() )
  2267. return 
  2268. CExtPaintManagerXP::PaintGroupBoxFrame(
  2269. dc,
  2270. rcBorder,
  2271. clrFrame,
  2272. pHelperSrc,
  2273. lParam
  2274. );
  2275. if( clrFrame == COLORREF(-1L) )
  2276. clrFrame = GetColor( CLR_GROUP_BOX_FRAME, pHelperSrc, lParam );
  2277. CBrush * pBrush =
  2278. CBrush::FromHandle( (HBRUSH)::GetStockObject(NULL_BRUSH) );
  2279. CBrush * pOldBrush = dc.SelectObject( pBrush );
  2280. CPen pen;
  2281. pen.CreatePen(
  2282. PS_SOLID,
  2283. 1,
  2284. clrFrame
  2285. );
  2286. CPen * pOldPen = dc.SelectObject( &pen );
  2287. dc.RoundRect(
  2288. &rcBorder,
  2289. CPoint( 10, 10 )
  2290. );
  2291. dc.SelectObject( pOldPen );
  2292. dc.SelectObject( pOldBrush );
  2293. return true;
  2294. }
  2295. bool CExtPaintManager::PaintGroupBoxLabel(
  2296. CDC & dc,
  2297. __EXT_MFC_SAFE_LPCTSTR strText,
  2298. COLORREF clrText,
  2299. HFONT hFont,
  2300. DWORD dwDrawTextFlags,
  2301. bool bEnabled,
  2302. const RECT & rcText,
  2303. CObject * pHelperSrc,
  2304. LPARAM lParam // = 0L
  2305. )
  2306. {
  2307. ASSERT_VALID( this );
  2308. ASSERT( dc.GetSafeHdc() != NULL );
  2309. lParam;
  2310. CWnd * pWnd =
  2311. DYNAMIC_DOWNCAST(
  2312. CWnd,
  2313. pHelperSrc
  2314. );
  2315. ASSERT( pWnd != NULL );
  2316. ASSERT_VALID( pWnd );
  2317. HGDIOBJ hOldFont = NULL;
  2318. if( hFont != NULL )
  2319. hOldFont = ::SelectObject( dc, (HGDIOBJ)hFont );
  2320. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  2321. if( clrText == COLORREF(-1L) )
  2322. clrText =
  2323. QueryObjectTextColor(
  2324. dc,
  2325. bEnabled,
  2326. false,
  2327. false,
  2328. false,
  2329. pHelperSrc
  2330. );
  2331. if( (! g_PaintManager.m_UxTheme.IsControlsThemed()) 
  2332. || clrText != COLORREF(-1L)
  2333. )
  2334. {
  2335. if( clrText == COLORREF(-1L) )
  2336. clrText = GetColor( bEnabled ? COLOR_BTNTEXT : CLR_TEXT_DISABLED, pHelperSrc );
  2337. COLORREF clrOldText = dc.SetTextColor( clrText );
  2338. CRect rc( rcText );
  2339. dc.DrawText(
  2340. LPCTSTR(strText),
  2341. int(_tcslen(strText)),
  2342. rc,
  2343. dwDrawTextFlags
  2344. );
  2345. dc.SetTextColor( clrOldText );
  2346. } // if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  2347. else
  2348. {
  2349. if( g_PaintManager.m_UxTheme.OpenThemeData( pWnd->GetSafeHwnd(), VSCLASS_BUTTON ) != NULL )
  2350. {
  2351. VERIFY( 
  2352. g_PaintManager.m_UxTheme.DrawThemeText(
  2353. dc.GetSafeHdc(), 
  2354. BP_GROUPBOX, 
  2355. bEnabled 
  2356. ? GBS_NORMAL 
  2357. : GBS_DISABLED, 
  2358. LPCTSTR(strText),
  2359. -1,
  2360. dwDrawTextFlags,
  2361. NULL,
  2362. &rcText
  2363. ) == S_OK
  2364. );
  2365. g_PaintManager.m_UxTheme.CloseThemeData();
  2366. }
  2367. } // else from if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  2368. dc.SetBkMode( nOldBkMode );
  2369. if( hOldFont != NULL )
  2370. ::SelectObject( dc, hOldFont );
  2371. return false;
  2372. }
  2373. bool CExtPaintManagerOffice2003::OnQueryThemeColors(
  2374. COLORREF *pclrFillHint,
  2375. COLORREF *pclrAccentHint // = NULL
  2376. )
  2377. {
  2378. ASSERT_VALID( this );
  2379. if( OnQueryUseThemeColors() )
  2380. {
  2381. if( pclrFillHint == NULL && pclrAccentHint == NULL )
  2382. return true;
  2383. e_system_theme_t eCurrentTheme = OnQuerySystemTheme();
  2384. if( eCurrentTheme == ThemeLunaRoyale       // +2.87
  2385. || eCurrentTheme == ThemeVistaOrLaterUX   // +2.87
  2386. || eCurrentTheme == ThemeVistaOrLaterDWM  // +2.87
  2387. )
  2388. {
  2389. if( pclrFillHint != NULL )
  2390. (*pclrFillHint) = RGB(131,175,235);
  2391. if( pclrAccentHint != NULL )
  2392. (*pclrAccentHint) = RGB(255,200,91);
  2393. return true;
  2394. }
  2395. if( pclrFillHint != NULL )
  2396. {
  2397. double lfEdgeLightHue, lfEdgeLightSat, lfEdgeLightLum, lfEdgeShadowHue, lfEdgeShadowSat, lfEdgeShadowLum, lfCustFillHue, lfCustFillSat, lfCustFillLum;
  2398. CExtBitmap::stat_RGBtoHSL( g_PaintManager.m_clrUxTaskBandEdgeLightColor, &lfEdgeLightHue, &lfEdgeLightSat, &lfEdgeLightLum );
  2399. CExtBitmap::stat_RGBtoHSL( g_PaintManager.m_clrUxTaskBandEdgeShadowColor, &lfEdgeShadowHue, &lfEdgeShadowSat, &lfEdgeShadowLum );
  2400. CExtBitmap::stat_RGBtoHSL( g_PaintManager.m_clrUxTaskBandFillColorHint, &lfCustFillHue, &lfCustFillSat, &lfCustFillLum );
  2401. (*pclrFillHint) = CExtBitmap::stat_HLStoRGB( lfCustFillHue, (lfEdgeLightLum+lfEdgeShadowLum)/2.0, lfCustFillSat );
  2402. }
  2403. if( pclrAccentHint != NULL )
  2404. (*pclrAccentHint) = CExtBitmap::stat_HLS_Adjust( g_PaintManager.m_clrUxTaskBandAccentColorHint, 0.01, 0.00, 0.00 );
  2405. return true;
  2406. }
  2407. return false;
  2408. }
  2409. bool CExtPaintManagerOffice2003::OnQueryUseThemeColors() const
  2410. {
  2411. ASSERT_VALID( this );
  2412. if( IsHighContrast() )
  2413. return CExtPaintManagerXP::OnQueryUseThemeColors();
  2414. e_system_theme_t eCurrentTheme = OnQuerySystemTheme();
  2415. bool bUseThemedColors = (
  2416. g_PaintManager.m_UxTheme.IsAppThemed()
  2417. && g_PaintManager.m_bUxValidColorsExtracted
  2418. && ( eCurrentTheme == ThemeLunaRoyale       // +2.87
  2419. || eCurrentTheme == ThemeVistaOrLaterUX   // +2.87
  2420. || eCurrentTheme == ThemeVistaOrLaterDWM  // +2.87
  2421. || eCurrentTheme == ThemeLunaBlue
  2422. || eCurrentTheme == ThemeLunaOlive
  2423. || eCurrentTheme == ThemeLunaSilver
  2424. )
  2425. );
  2426. return bUseThemedColors;
  2427. }
  2428. //////////////////////////////////////////////////////////////////////////
  2429. // CExtPaintManagerStudio2005
  2430. //////////////////////////////////////////////////////////////////////////
  2431. CExtPaintManagerStudio2005::CExtPaintManagerStudio2005()
  2432. {
  2433. }
  2434. CExtPaintManagerStudio2005::~CExtPaintManagerStudio2005()
  2435. {
  2436. }
  2437. #if (!defined __EXT_MFC_NO_TAB_CTRL)
  2438. void CExtPaintManagerStudio2005::TabWnd_MeasureItemAreaMargins(
  2439. CExtTabWnd * pTabWnd,
  2440. LONG & nSpaceBefore,
  2441. LONG & nSpaceAfter,
  2442. LONG & nSpaceOver
  2443. )
  2444. {
  2445. ASSERT_VALID( this );
  2446. ASSERT( pTabWnd != NULL && ::IsWindow(pTabWnd->m_hWnd) );
  2447. ASSERT_VALID( pTabWnd );
  2448. if( IsHighContrast() )
  2449. {
  2450. CExtPaintManagerXP::TabWnd_MeasureItemAreaMargins(
  2451. pTabWnd,
  2452. nSpaceBefore,
  2453. nSpaceAfter,
  2454. nSpaceOver
  2455. );
  2456. return;
  2457. }
  2458. nSpaceAfter = 2;
  2459. nSpaceOver = 2;
  2460. if( (pTabWnd->GetTabWndStyle() & __ETWS_GROUPED) != 0 )
  2461. nSpaceBefore = 3;
  2462. else
  2463. nSpaceBefore = 0;
  2464. }
  2465. void CExtPaintManagerStudio2005::TabWnd_UpdateItemMeasure(
  2466. CExtTabWnd * pTabWnd,
  2467. CExtTabWnd::TAB_ITEM_INFO * pTii,
  2468. CDC & dcMeasure,
  2469. CSize & sizePreCalc
  2470. )
  2471. {
  2472. ASSERT_VALID( this );
  2473. ASSERT( pTabWnd != NULL && ::IsWindow(pTabWnd->m_hWnd) );
  2474. ASSERT_VALID( pTabWnd );
  2475. ASSERT_VALID( pTii );
  2476. ASSERT( dcMeasure.GetSafeHdc() != NULL );
  2477. ASSERT( pTii->GetTabWnd() == pTabWnd );
  2478. if( IsHighContrast() )
  2479. {
  2480. CExtPaintManagerXP::TabWnd_UpdateItemMeasure(
  2481. pTabWnd,
  2482. pTii,
  2483. dcMeasure,
  2484. sizePreCalc
  2485. );
  2486. return;
  2487. }
  2488. bool bHorz = pTabWnd->OrientationIsHorizontal();
  2489. LONG nItemIndex = pTii->GetIndexOf();
  2490. switch( m_eStyle2005 )
  2491. {
  2492. case __ES2005_BETA1:
  2493. case __ES2005_RC:
  2494. break;
  2495. case __ES2005_BETA2:
  2496. if( bHorz )
  2497. {
  2498. if( nItemIndex == 0 
  2499. || nItemIndex == pTabWnd->ItemGetCount() - 1 
  2500. )
  2501. sizePreCalc.cx += 6*2;
  2502. sizePreCalc.cy = 19;//20;
  2503. }
  2504. else
  2505. {
  2506. if( nItemIndex == 0 
  2507. || nItemIndex == pTabWnd->ItemGetCount() - 1 
  2508. )
  2509. sizePreCalc.cy += 6*2;
  2510. sizePreCalc.cx = 19;//20;
  2511. }
  2512. break;
  2513. default:
  2514. {
  2515. ASSERT( FALSE );
  2516. AfxThrowNotSupportedException();
  2517. }
  2518. } // switch( m_eStyle2005 )
  2519. }
  2520. void CExtPaintManagerStudio2005::TabWnd_AdjustItemCloseButtonRect(
  2521. CRect & rcCloseButton,
  2522. CExtTabWnd * pTabWnd
  2523. )
  2524. {
  2525. ASSERT_VALID( this );
  2526. pTabWnd;
  2527. rcCloseButton.OffsetRect( 1, 0 );
  2528. }
  2529. void CExtPaintManagerNativeXP::TabWnd_UpdateItemMeasure(
  2530. CExtTabWnd * pTabWnd,
  2531. CExtTabWnd::TAB_ITEM_INFO * pTii,
  2532. CDC & dcMeasure,
  2533. CSize & sizePreCalc
  2534. )
  2535. {
  2536. ASSERT_VALID( this );
  2537. ASSERT_VALID( pTii );
  2538. ASSERT( dcMeasure.GetSafeHdc() != NULL );
  2539. ASSERT( pTii->GetTabWnd() == pTabWnd );
  2540. bool bGroupedMode =
  2541. (pTabWnd->GetTabWndStyle() & __ETWS_GROUPED) ? true : false;
  2542. if( bGroupedMode
  2543. || (! g_PaintManager.m_UxTheme.IsControlsThemed() )
  2544. )
  2545. {
  2546. CExtPaintManager::TabWnd_UpdateItemMeasure(
  2547. pTabWnd,
  2548. pTii,
  2549. dcMeasure,
  2550. sizePreCalc
  2551. );
  2552. return;
  2553. }
  2554. CSize szPart( 18, 18 );
  2555. if( g_PaintManager.m_UxTheme.OpenThemeData( NULL, VSCLASS_TAB ) != NULL )
  2556. {
  2557. VERIFY(
  2558. g_PaintManager.m_UxTheme.GetThemePartSize(
  2559. dcMeasure.GetSafeHdc(), 
  2560. TABP_TABITEM, 
  2561. TIS_NORMAL, 
  2562. NULL, 
  2563. CExtUxTheme::__EXT_UX_TS_TRUE,
  2564. &szPart
  2565. ) == S_OK
  2566. );
  2567. g_PaintManager.m_UxTheme.CloseThemeData();
  2568. }
  2569. INT nPartHeight = szPart.cy;
  2570. if( pTabWnd->OrientationIsHorizontal() )
  2571. {
  2572. sizePreCalc.cy = nPartHeight;
  2573. sizePreCalc.cx += 2*2;
  2574. }
  2575. else
  2576. {
  2577. sizePreCalc.cx = nPartHeight;
  2578. sizePreCalc.cy += 2*2;
  2579. }
  2580. }
  2581. void CExtPaintManagerStudio2005::GetThemeAccentTabColors(
  2582. COLORREF * pClrSetectedTabItemText,
  2583. COLORREF * pClrSetectedTabItemFace, // = NULL
  2584. COLORREF * pClrSetectedTabItemBorderLight, // = NULL
  2585. COLORREF * pClrSetectedTabItemBorderDark, // = NULL
  2586. CObject * pHelperSrc, // = NULL
  2587. LPARAM lParam // = 0L
  2588. )
  2589. {
  2590. ASSERT_VALID( this );
  2591. if( IsHighContrast() )
  2592. {
  2593. CExtPaintManagerXP::GetThemeAccentTabColors(
  2594. pClrSetectedTabItemText,
  2595. pClrSetectedTabItemFace,
  2596. pClrSetectedTabItemBorderLight,
  2597. pClrSetectedTabItemBorderDark,
  2598. pHelperSrc,
  2599. lParam
  2600. );
  2601. return;
  2602. }
  2603. if( pClrSetectedTabItemText != NULL )
  2604. (*pClrSetectedTabItemText) = GetColor( COLOR_BTNTEXT, pHelperSrc, lParam );
  2605. if( pClrSetectedTabItemFace != NULL )
  2606. (*pClrSetectedTabItemFace) = GetColor( COLOR_3DHILIGHT, pHelperSrc, lParam );
  2607. if( pClrSetectedTabItemBorderLight != NULL )
  2608. (*pClrSetectedTabItemBorderLight) = GetColor( COLOR_3DSHADOW, pHelperSrc, lParam );
  2609. if( pClrSetectedTabItemBorderDark != NULL )
  2610. (*pClrSetectedTabItemBorderDark) = GetColor( COLOR_3DSHADOW, pHelperSrc, lParam );
  2611. }
  2612. void CExtPaintManagerStudio2005::PaintTabClientArea(
  2613. CDC & dc,
  2614. CRect & rcClient,
  2615. CRect & rcTabItemsArea,
  2616. CRect & rcTabNearBorderArea,
  2617. DWORD dwOrientation,
  2618. bool bGroupedMode,
  2619. CObject * pHelperSrc,
  2620. LPARAM lParam // = 0L
  2621. )
  2622. {
  2623. ASSERT_VALID( this );
  2624. ASSERT( dc.GetSafeHdc() != NULL );
  2625. if( IsHighContrast() )
  2626. {
  2627. CExtPaintManagerXP::PaintTabClientArea(
  2628. dc,
  2629. rcClient,
  2630. rcTabItemsArea,
  2631. rcTabNearBorderArea,
  2632. dwOrientation,
  2633. bGroupedMode,
  2634. pHelperSrc,
  2635. lParam
  2636. );
  2637. return;
  2638. }
  2639. CExtTabWnd * pExtTabWnd = DYNAMIC_DOWNCAST( CExtTabWnd, pHelperSrc );
  2640. bool bFrameBackground = false;
  2641. if( pHelperSrc != NULL
  2642. && pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtTabWnd))
  2643. && ::GetDeviceCaps( dc.m_hDC, BITSPIXEL ) > 8
  2644. )
  2645. {
  2646. if( pExtTabWnd != NULL
  2647. && ( pExtTabWnd->m_bReflectParentSizing
  2648. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  2649. || pExtTabWnd->_IsMdiTabCtrl()
  2650. #endif // (!defined __EXT_MFC_NO_TABMDI_CTRL)
  2651. )
  2652. )
  2653. bFrameBackground = true;
  2654. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2655. else if( pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtDynTabWnd))
  2656. || pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtDynAutoHideArea))
  2657. )
  2658. bFrameBackground = true;
  2659. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2660. }
  2661. if( bFrameBackground )
  2662. {
  2663. CRect rcTabNearMargin( rcTabNearBorderArea ); // prepare tab border margin rect
  2664. switch( dwOrientation )
  2665. {
  2666. case __ETWS_ORIENT_TOP:
  2667. rcTabNearMargin.bottom = rcTabNearMargin.top + 1;
  2668. break;
  2669. case __ETWS_ORIENT_BOTTOM:
  2670. rcTabNearMargin.top = rcTabNearMargin.bottom - 1;
  2671. break;
  2672. case __ETWS_ORIENT_LEFT:
  2673. rcTabNearMargin.right = rcTabNearMargin.left + 1;
  2674. break;
  2675. case __ETWS_ORIENT_RIGHT:
  2676. rcTabNearMargin.left = rcTabNearMargin.right - 1;
  2677. break;
  2678. #ifdef _DEBUG
  2679. default:
  2680. ASSERT( FALSE );
  2681. break;
  2682. #endif // _DEBUG
  2683. } // switch( dwOrientation )
  2684. CWnd * pWnd = STATIC_DOWNCAST( CExtTabWnd, pHelperSrc );
  2685. if( ! PaintDockerBkgnd(
  2686. true,
  2687. dc, 
  2688. pWnd
  2689. )
  2690. )
  2691. {
  2692. CWnd * pFrame = pWnd->GetParentFrame();
  2693. if( pFrame == NULL )
  2694. pFrame = pWnd->GetParent();
  2695. ASSERT_VALID( pFrame );
  2696. CRect rcPaintGradient;
  2697. pFrame->GetClientRect( &rcPaintGradient );
  2698. pFrame->ClientToScreen( &rcPaintGradient );
  2699. ((CExtTabWnd*)pHelperSrc)->ScreenToClient( &rcPaintGradient );
  2700. PaintDockerBkgnd( 
  2701. true,
  2702. dc,  
  2703. rcPaintGradient,
  2704. rcClient
  2705. );
  2706. }
  2707. if( ! bGroupedMode )
  2708. {
  2709. COLORREF clrTabNearMargin = 
  2710. GetColor( COLOR_3DSHADOW, pHelperSrc, lParam );
  2711. COLORREF clrTabNearBorderAreaBk = 
  2712. (pExtTabWnd->SelectionGet() >= 0)
  2713. ? RGB(252,252,254)
  2714. : GetColor( CLR_3DFACE_OUT, pHelperSrc, lParam );
  2715. // fill tab border area
  2716. dc.FillSolidRect(
  2717. &rcTabNearBorderArea,
  2718. clrTabNearBorderAreaBk
  2719. );
  2720. // paint tab border margin
  2721. dc.FillSolidRect(
  2722. &rcTabNearMargin,
  2723. clrTabNearMargin
  2724. );
  2725. } // if( !bGroupedMode )
  2726. return;
  2727. } // if( bFrameBackground )
  2728. CExtPaintManagerXP::PaintTabClientArea(
  2729. dc,
  2730. rcClient,
  2731. rcTabItemsArea,
  2732. rcTabNearBorderArea,
  2733. dwOrientation,
  2734. bGroupedMode,
  2735. pHelperSrc,
  2736. lParam
  2737. );
  2738. }
  2739. void CExtPaintManagerNativeXP::PaintTabClientArea(
  2740. CDC & dc,
  2741. CRect & rcClient,
  2742. CRect & rcTabItemsArea,
  2743. CRect & rcTabNearBorderArea,
  2744. DWORD dwOrientation,
  2745. bool bGroupedMode,
  2746. CObject * pHelperSrc,
  2747. LPARAM lParam // = 0L
  2748. )
  2749. {
  2750. ASSERT_VALID( this );
  2751. ASSERT( dc.GetSafeHdc() != NULL );
  2752. if( bGroupedMode
  2753. || pHelperSrc == NULL
  2754. || (! g_PaintManager.m_UxTheme.IsControlsThemed() )
  2755. )
  2756. {
  2757. CExtPaintManager::PaintTabClientArea( dc, rcClient, rcTabItemsArea, rcTabNearBorderArea, dwOrientation, bGroupedMode, pHelperSrc, lParam );
  2758. return;
  2759. }
  2760. CWnd * pGenWnd = DYNAMIC_DOWNCAST( CExtTabWnd, pHelperSrc );
  2761. //CExtTabWnd * pWndTabs = NULL;
  2762. if( pGenWnd != NULL )
  2763. {
  2764. ASSERT_VALID( pGenWnd );
  2765. PaintDockerBkgnd( true, dc, pGenWnd );
  2766. // pWndTabs = DYNAMIC_DOWNCAST( CExtTabWnd, pGenWnd );
  2767. }
  2768. CRect rcTabNearMargin( rcTabNearBorderArea ); // prepare tab border margin rect
  2769. switch( dwOrientation )
  2770. {
  2771. case __ETWS_ORIENT_TOP:
  2772. rcTabNearMargin.bottom = rcTabNearMargin.top + 1;
  2773. break;
  2774. case __ETWS_ORIENT_BOTTOM:
  2775. rcTabNearMargin.top = rcTabNearMargin.bottom - 1;
  2776. break;
  2777. case __ETWS_ORIENT_LEFT:
  2778. rcTabNearMargin.right = rcTabNearMargin.left + 1;
  2779. break;
  2780. case __ETWS_ORIENT_RIGHT:
  2781. rcTabNearMargin.left = rcTabNearMargin.right - 1;
  2782. break;
  2783. #ifdef _DEBUG
  2784. default:
  2785. ASSERT( FALSE );
  2786. break;
  2787. #endif // _DEBUG
  2788. } // switch( dwOrientation )
  2789. if( g_PaintManager.m_UxTheme.OpenThemeData( pGenWnd->GetSafeHwnd(), VSCLASS_EDIT ) != NULL )
  2790. {
  2791. COLORREF clrBorder = COLORREF(-1L);
  2792. VERIFY( g_PaintManager.m_UxTheme.GetThemeColor( EP_EDITTEXT, 0, TMT_BORDERCOLOR, &clrBorder ) == S_OK );
  2793. g_PaintManager.m_UxTheme.CloseThemeData();
  2794. dc.FillSolidRect( &rcTabNearMargin, clrBorder );
  2795. }
  2796. }
  2797. void CExtPaintManagerStudio2005::PaintTabItem(
  2798. CDC & dc,
  2799. CRect & rcTabItemsArea,
  2800. bool bTopLeft,
  2801. bool bHorz,
  2802. bool bSelected,
  2803. bool bCenteredText,
  2804. bool bGroupedMode,
  2805. bool bInGroupActive,
  2806. bool bInvertedVerticalMode,
  2807. const CRect & rcEntireItem,
  2808. CSize sizeTextMeasured,
  2809. CFont * pFont,
  2810. __EXT_MFC_SAFE_LPCTSTR sText,
  2811. CExtCmdIcon * pIcon,
  2812. CObject * pHelperSrc,
  2813. LPARAM lParam, // = 0L
  2814. COLORREF clrForceText, // = COLORREF(-1L)
  2815. COLORREF clrForceTabBk, // = COLORREF(-1L)
  2816. COLORREF clrForceTabBorderLT, // = COLORREF(-1L)
  2817. COLORREF clrForceTabBorderRB, // = COLORREF(-1L)
  2818. COLORREF clrForceTabSeparator, // = COLORREF(-1L)
  2819. bool bDwmMode // = false
  2820. )
  2821. {
  2822. ASSERT_VALID( this );
  2823. ASSERT( dc.GetSafeHdc() != NULL );
  2824. if( IsHighContrast() )
  2825. {
  2826. CExtPaintManagerXP::PaintTabItem(
  2827. dc,
  2828. rcTabItemsArea,
  2829. bTopLeft,
  2830. bHorz,
  2831. bSelected,
  2832. bCenteredText,
  2833. bGroupedMode,
  2834. bInGroupActive,
  2835. bInvertedVerticalMode,
  2836. rcEntireItem,
  2837. sizeTextMeasured,
  2838. pFont,
  2839. sText,
  2840. pIcon,
  2841. pHelperSrc,
  2842. lParam,
  2843. clrForceText,
  2844. clrForceTabBk,
  2845. clrForceTabBorderLT,
  2846. clrForceTabBorderRB,
  2847. clrForceTabSeparator,
  2848. bDwmMode
  2849. );
  2850. return;
  2851. }
  2852. CExtCmdIcon * pIconTabItemCloseButton = NULL;
  2853. CExtCmdIcon::e_paint_type_t ePaintStateITICB =
  2854. (CExtCmdIcon::e_paint_type_t) CExtCmdIcon::__PAINT_INVISIBLE;
  2855. CRect rcTabItemCloseButton( 0, 0, 0, 0 );
  2856. INT nItemIndex = 1;
  2857. CExtBarButton * pTBB = NULL;
  2858. CExtTabWnd * pTabs = NULL;
  2859. CExtTabWnd::TAB_ITEM_INFO * pTII = NULL;
  2860. bool bNoPrefix = false;
  2861. if( pHelperSrc != NULL )
  2862. {
  2863. pTabs = DYNAMIC_DOWNCAST( CExtTabWnd, pHelperSrc );
  2864. if( pTabs != NULL )
  2865. {
  2866. ASSERT_VALID( pTabs );
  2867. pTII = pTabs->ItemGet( LONG( lParam ) );
  2868. ASSERT( pTII != NULL );
  2869. ASSERT_VALID( pTII );
  2870. nItemIndex = INT(lParam);
  2871. pIconTabItemCloseButton =
  2872. pTabs->OnTabWndQueryItemCloseButtonShape( pTII );
  2873. if( pIconTabItemCloseButton != NULL )
  2874. {
  2875. rcTabItemCloseButton = pTII->CloseButtonRectGet();
  2876. ePaintStateITICB = (CExtCmdIcon::e_paint_type_t)
  2877. pTabs->OnTabWndQueryItemCloseButtonPaintState( pTII );
  2878. } // if( pIconTabItemCloseButton != NULL )
  2879. bNoPrefix = ( ( pTabs->GetTabWndStyleEx() & __ETWS_EX_NO_PREFIX ) != 0 ) ? true : false;
  2880. } // if( pTabs != NULL )
  2881. else
  2882. {
  2883. pTBB = DYNAMIC_DOWNCAST( CExtBarButton, pHelperSrc );
  2884. #ifdef _DEBUG
  2885. if( pTBB != NULL )
  2886. {
  2887. ASSERT_VALID( pTBB );
  2888. } // if( pTBB != NULL )
  2889. #endif // _DEBUG
  2890. } // else from if( pTabs != NULL )
  2891. } // if( pHelperSrc != NULL )
  2892. bool bEnabled = true;
  2893. if( pTII != NULL )
  2894. bEnabled = pTII->EnabledGet();
  2895. else if( pTBB != NULL )
  2896. bEnabled = pTBB->IsEnabled();
  2897. LONG nSelectionIndex = -1;
  2898. if( pTabs != NULL )
  2899. nSelectionIndex = pTabs->SelectionGet();
  2900. bool bDetectedDynTPC = false;
  2901. bDetectedDynTPC;
  2902. #if (!defined __EXT_MFC_NO_DYNAMIC_BAR_SITE)
  2903. if( pTII != NULL )
  2904. {
  2905. CObject * pObject = pTII->EventProviderGet();
  2906. if( pObject != NULL )
  2907. {
  2908. CExtDynamicControlBar * pBar = DYNAMIC_DOWNCAST( CExtDynamicControlBar, pObject );
  2909. if( pBar != NULL )
  2910. {
  2911. bool bFlashCaptionHighlightedState = false;
  2912. if( pBar->FlashCaptionIsInProgress( &bFlashCaptionHighlightedState ) )
  2913. {
  2914. if( bFlashCaptionHighlightedState )
  2915. {
  2916. clrForceText = pBar->m_clrFlashCaptionText;
  2917. clrForceTabBk = pBar->m_clrFlashCaptionBackground;
  2918. bSelected = true;
  2919. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2920. bDetectedDynTPC = true;
  2921. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  2922. }
  2923. }
  2924. }
  2925. }
  2926. }
  2927. #endif// (!defined __EXT_MFC_NO_DYNAMIC_BAR_SITE)
  2928. COLORREF clrText = clrForceText;
  2929. if( clrText == COLORREF(-1L) )
  2930. clrText = GetColor( bEnabled ? COLOR_BTNTEXT : CLR_TEXT_DISABLED, pHelperSrc, lParam );
  2931. COLORREF clrTabBorderLT = clrForceTabBorderLT;
  2932. if( clrTabBorderLT == COLORREF(-1L) )
  2933. clrTabBorderLT = GetColor( bGroupedMode ? COLOR_3DSHADOW : COLOR_3DHILIGHT, pHelperSrc, lParam  );
  2934. COLORREF clrTabBorderRB = clrForceTabBorderRB;
  2935. if( clrTabBorderRB == COLORREF(-1L) )
  2936. clrTabBorderRB = GetColor( COLOR_3DSHADOW, pHelperSrc, lParam );
  2937. COLORREF clrBkLight = clrForceTabBk;
  2938. if( clrBkLight == COLORREF(-1L) )
  2939. clrBkLight = GetColor( COLOR_3DHILIGHT, this );
  2940. COLORREF clrBkDark = clrForceTabBk;
  2941. if( clrBkDark == COLORREF(-1L) )
  2942. clrBkDark = GetColor( COLOR_3DLIGHT, this );
  2943. bool bInGroupFirst = false;
  2944. bool bInGroupLast = false;
  2945. if( bGroupedMode && pTII != NULL )
  2946. {
  2947. ASSERT( pTabs != NULL );
  2948. CExtTabWnd::TAB_ITEM_INFO * pTiiFirst = pTII->GetInGroupFirst();
  2949. CExtTabWnd::TAB_ITEM_INFO * pTiiLast = pTII->GetInGroupLast();
  2950. ASSERT_VALID( pTiiFirst );
  2951. ASSERT_VALID( pTiiLast );
  2952. bInGroupFirst = ( nItemIndex == pTabs->ItemGetIndexOf( pTiiFirst ) );
  2953. bInGroupLast = ( nItemIndex == pTabs->ItemGetIndexOf( pTiiLast ) );
  2954. }
  2955. bool bFirstItem = false, bLastItem = false;
  2956. if( pTII != NULL )
  2957. {
  2958. ASSERT( pTabs != NULL );
  2959. bFirstItem =
  2960. ( nItemIndex == 0
  2961. || ( bInGroupFirst
  2962. && nItemIndex != nSelectionIndex
  2963. )
  2964. );
  2965. bLastItem = 
  2966. ( nItemIndex == pTabs->ItemGetCount() - 1
  2967. || ( bInGroupLast
  2968. && nItemIndex != nSelectionIndex
  2969. )
  2970. );
  2971. }
  2972. CRect rcItem( rcEntireItem );
  2973. if( m_eStyle2005 == __ES2005_BETA2 )
  2974. {
  2975. POINT arrPointsBorders[10] =
  2976. { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
  2977. { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
  2978. { 0, 0 }, { 0, 0 },
  2979. };
  2980. POINT arrPointsClipArea[10] =
  2981. { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
  2982. { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
  2983. { 0, 0 }, { 0, 0 },
  2984. };
  2985. POINT arrPointsInnerArea[10] =
  2986. { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
  2987. { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 },
  2988. { 0, 0 }, { 0, 0 },
  2989. };
  2990. POINT arrPointsSelectedLine[2] =
  2991. { { 0, 0 }, { 0, 0 },
  2992. };
  2993. if( bHorz )
  2994. {
  2995. if( (bTopLeft && !bGroupedMode) || (!bTopLeft && bGroupedMode) )
  2996. {
  2997. // BORDERS
  2998. // right side
  2999. arrPointsBorders[0] = CPoint( rcItem.right + 6, rcItem.bottom );
  3000. arrPointsBorders[1] = CPoint( rcItem.right, rcItem.top + 6 );
  3001. arrPointsBorders[2] = CPoint( rcItem.right - 5, rcItem.top + 1 );
  3002. arrPointsBorders[3] = CPoint( rcItem.right - 6, rcItem.top + 1 );
  3003. arrPointsBorders[4] = CPoint( rcItem.right - 7, rcItem.top );
  3004. // left side
  3005. arrPointsBorders[5] = CPoint( rcItem.left + 7, rcItem.top );
  3006. arrPointsBorders[6] = CPoint( rcItem.left + 6, rcItem.top + 1 );
  3007. arrPointsBorders[7] = CPoint( rcItem.left + 5, rcItem.top + 1 );
  3008. arrPointsBorders[8] = CPoint( rcItem.left, rcItem.top + 6 );
  3009. arrPointsBorders[9] = CPoint( rcItem.left - 6, rcItem.bottom );
  3010. if( nSelectionIndex > nItemIndex && !bGroupedMode )
  3011. {
  3012. if( !bLastItem )
  3013. arrPointsBorders[0] = CPoint( rcItem.right - 6, rcItem.bottom );
  3014. }
  3015. else if( nSelectionIndex < nItemIndex || bGroupedMode )
  3016. {
  3017. if( !bFirstItem && !bInGroupFirst )
  3018. arrPointsBorders[9] = CPoint( rcItem.left + 6, rcItem.bottom );
  3019. }
  3020. if( nItemIndex == 0 )
  3021. {
  3022. // first item in tab window
  3023. for( int i = 5; i < sizeof(arrPointsBorders)/sizeof(arrPointsBorders[0]); i++ )
  3024. arrPointsBorders[i].x += 6;
  3025. }
  3026. else if( pTabs != NULL && nItemIndex == ( pTabs->ItemGetCount() - 1 ) ) 
  3027. {
  3028. // last item in tab window
  3029. for( int i = 0; i < 5; i++ )
  3030. arrPointsBorders[i].x -= 6;
  3031. }
  3032. // CLIP REGION
  3033. // right side
  3034. arrPointsClipArea[0] = CPoint( rcItem.right + 5, rcItem.bottom + 1 );
  3035. arrPointsClipArea[1] = CPoint( rcItem.right - 1, rcItem.top + 7 );
  3036. arrPointsClipArea[2] = CPoint( rcItem.right - 4, rcItem.top + 3 );
  3037. arrPointsClipArea[3] = CPoint( rcItem.right - 5, rcItem.top + 3 );
  3038. arrPointsClipArea[4] = CPoint( rcItem.right - 6, rcItem.top + 2 );
  3039. // left side
  3040. arrPointsClipArea[5] = CPoint( rcItem.left + 7, rcItem.top + 2 );
  3041. arrPointsClipArea[6] = CPoint( rcItem.left + 6, rcItem.top + 3 );
  3042. arrPointsClipArea[7] = CPoint( rcItem.left + 5, rcItem.top + 3 );
  3043. arrPointsClipArea[8] = CPoint( rcItem.left + 1, rcItem.top + 7 );
  3044. arrPointsClipArea[9] = CPoint( rcItem.left - 5, rcItem.bottom + 1);
  3045. if( nSelectionIndex > nItemIndex && !bGroupedMode )
  3046. {
  3047. if( !bLastItem )
  3048. {
  3049. arrPointsClipArea[0] = CPoint( rcItem.right - 6, rcItem.bottom );
  3050. arrPointsClipArea[1] = CPoint( rcItem.right - 1, rcItem.top + 7 );
  3051. }
  3052. }
  3053. else if( nSelectionIndex < nItemIndex || bGroupedMode )
  3054. {
  3055. if( !bFirstItem && !bInGroupFirst )
  3056. {
  3057. arrPointsClipArea[8] = CPoint( rcItem.left + 1, rcItem.top + 7 );
  3058. arrPointsClipArea[9] = CPoint( rcItem.left + 7, rcItem.bottom );
  3059. }
  3060. }
  3061. if( nItemIndex == 0 )
  3062. {
  3063. // first item in tab window
  3064. for( int i = 5; i < sizeof(arrPointsClipArea)/sizeof(arrPointsClipArea[0]); i++ )
  3065. arrPointsClipArea[i].x += 6;
  3066. }
  3067. else if( pTabs != NULL && nItemIndex == ( pTabs->ItemGetCount() - 1 ) ) 
  3068. {
  3069. // last item in tab window
  3070. for( int i = 0; i < 5; i++ )
  3071. arrPointsClipArea[i].x -= 6;
  3072. }
  3073. // INNER AREA
  3074. // right side
  3075. arrPointsInnerArea[0] = CPoint( rcItem.right + 5, rcItem.bottom );
  3076. arrPointsInnerArea[1] = CPoint( rcItem.right - 1, rcItem.top + 6 );
  3077. arrPointsInnerArea[2] = CPoint( rcItem.right - 5, rcItem.top + 2 );
  3078. arrPointsInnerArea[3] = CPoint( rcItem.right - 6, rcItem.top + 2 );
  3079. arrPointsInnerArea[4] = CPoint( rcItem.right - 7, rcItem.top + 1 );
  3080. // left side
  3081. arrPointsInnerArea[5] = CPoint( rcItem.left + 7, rcItem.top + 1 );
  3082. arrPointsInnerArea[6] = CPoint( rcItem.left + 6, rcItem.top + 2 );
  3083. arrPointsInnerArea[7] = CPoint( rcItem.left + 5, rcItem.top + 2 );
  3084. arrPointsInnerArea[8] = CPoint( rcItem.left + 1, rcItem.top + 6 );
  3085. arrPointsInnerArea[9] = CPoint( rcItem.left - 5, rcItem.bottom );
  3086. if( nSelectionIndex > nItemIndex && !bGroupedMode )
  3087. {
  3088. if( !bLastItem )
  3089. arrPointsInnerArea[0] = CPoint( rcItem.right - 1, rcItem.top + 7 );
  3090. }
  3091. else if( nSelectionIndex < nItemIndex || bGroupedMode )
  3092. {
  3093. if( !bFirstItem && !bInGroupFirst )
  3094. arrPointsInnerArea[9] = CPoint( rcItem.left + 1, rcItem.top + 7 );
  3095. }
  3096. if( nItemIndex == 0 )
  3097. {
  3098. // first item in tab window
  3099. for( int i = 5; i < sizeof(arrPointsInnerArea)/sizeof(arrPointsInnerArea[0]); i++ )
  3100. arrPointsInnerArea[i].x += 6;
  3101. }
  3102. else if( pTabs != NULL && nItemIndex == ( pTabs->ItemGetCount() - 1 ) ) 
  3103. {
  3104. // last item in tab window
  3105. for( int i = 0; i < 5; i++ )
  3106. arrPointsInnerArea[i].x -= 6;
  3107. }
  3108. arrPointsSelectedLine[0] = CPoint( arrPointsBorders[0].x, arrPointsBorders[0].y + 1 );
  3109. arrPointsSelectedLine[1] = CPoint( arrPointsBorders[9].x - 1, arrPointsBorders[9].y + 1 );
  3110. }
  3111. else
  3112. {
  3113. // BORDERS
  3114. // right side
  3115. arrPointsBorders[0] = CPoint( rcItem.right + 6, rcItem.top );
  3116. arrPointsBorders[1] = CPoint( rcItem.right, rcItem.bottom - 6 );
  3117. arrPointsBorders[2] = CPoint( rcItem.right - 5, rcItem.bottom - 1 );
  3118. arrPointsBorders[3] = CPoint( rcItem.right - 6, rcItem.bottom - 1 );
  3119. arrPointsBorders[4] = CPoint( rcItem.right - 7, rcItem.bottom );
  3120. // left side
  3121. arrPointsBorders[5] = CPoint( rcItem.left + 7, rcItem.bottom );
  3122. arrPointsBorders[6] = CPoint( rcItem.left + 6, rcItem.bottom - 1 );
  3123. arrPointsBorders[7] = CPoint( rcItem.left + 5, rcItem.bottom - 1 );
  3124. arrPointsBorders[8] = CPoint( rcItem.left, rcItem.bottom - 6 );
  3125. arrPointsBorders[9] = CPoint( rcItem.left - 6, rcItem.top );
  3126. if( nSelectionIndex > nItemIndex && !bGroupedMode )
  3127. {
  3128. if( !bLastItem )
  3129. arrPointsBorders[0] = CPoint( rcItem.right - 6, rcItem.top );
  3130. }
  3131. else if( nSelectionIndex < nItemIndex || bGroupedMode )
  3132. {
  3133. if( !bFirstItem && !bInGroupFirst )
  3134. arrPointsBorders[9] = CPoint( rcItem.left + 6, rcItem.top );
  3135. }
  3136. if( nItemIndex == 0 )
  3137. {
  3138. // first item in tab window
  3139. for( int i = 5; i < sizeof(arrPointsBorders)/sizeof(arrPointsBorders[0]); i++ )
  3140. arrPointsBorders[i].x += 6;
  3141. }
  3142. else if( pTabs != NULL && nItemIndex == ( pTabs->ItemGetCount() - 1 ) ) 
  3143. {
  3144. // last item in tab window
  3145. for( int i = 0; i < 5; i++ )
  3146. arrPointsBorders[i].x -= 6;
  3147. }
  3148. // CLIP REGION
  3149. // right side
  3150. arrPointsClipArea[0] = CPoint( rcItem.right + 5, rcItem.top );
  3151. arrPointsClipArea[1] = CPoint( rcItem.right - 2, rcItem.bottom - 5 );
  3152. arrPointsClipArea[2] = CPoint( rcItem.right - 5, rcItem.bottom - 2 );
  3153. arrPointsClipArea[3] = CPoint( rcItem.right - 6, rcItem.bottom - 2 );
  3154. arrPointsClipArea[4] = CPoint( rcItem.right - 7, rcItem.bottom - 1 );
  3155. // left side
  3156. arrPointsClipArea[5] = CPoint( rcItem.left + 7, rcItem.bottom - 1 );
  3157. arrPointsClipArea[6] = CPoint( rcItem.left + 6, rcItem.bottom - 2 );
  3158. arrPointsClipArea[7] = CPoint( rcItem.left + 5, rcItem.bottom - 2 );
  3159. arrPointsClipArea[8] = CPoint( rcItem.left + 2, rcItem.bottom - 6 );
  3160. arrPointsClipArea[9] = CPoint( rcItem.left - 5, rcItem.top );
  3161. if( nSelectionIndex > nItemIndex && !bGroupedMode )
  3162. {
  3163. if( !bLastItem )
  3164. {
  3165. arrPointsClipArea[0] = CPoint( rcItem.right - 6, rcItem.top );
  3166. arrPointsClipArea[1] = CPoint( rcItem.right, rcItem.bottom - 7 );
  3167. }
  3168. }
  3169. else if( nSelectionIndex < nItemIndex || bGroupedMode )
  3170. {
  3171. if( !bFirstItem && !bInGroupFirst )
  3172. {
  3173. arrPointsClipArea[8] = CPoint( rcItem.left + 1, rcItem.bottom - 7 );
  3174. arrPointsClipArea[9] = CPoint( rcItem.left + 7, rcItem.top );
  3175. }
  3176. }
  3177. if( nItemIndex == 0 )
  3178. {
  3179. // first item in tab window
  3180. for( int i = 5; i < sizeof(arrPointsClipArea)/sizeof(arrPointsClipArea[0]); i++ )
  3181. arrPointsClipArea[i].x += 6;
  3182. }
  3183. else if( pTabs != NULL && nItemIndex == ( pTabs->ItemGetCount() - 1 ) ) 
  3184. {
  3185. // last item in tab window
  3186. for( int i = 0; i < 5; i++ )
  3187. arrPointsClipArea[i].x -= 6;
  3188. }
  3189. // INNER AREA
  3190. // right side
  3191. arrPointsInnerArea[0] = CPoint( rcItem.right + 5, rcItem.top );
  3192. arrPointsInnerArea[1] = CPoint( rcItem.right - 1, rcItem.bottom - 6 );
  3193. arrPointsInnerArea[2] = CPoint( rcItem.right - 5, rcItem.bottom - 2 );
  3194. arrPointsInnerArea[3] = CPoint( rcItem.right - 6, rcItem.bottom - 2 );
  3195. arrPointsInnerArea[4] = CPoint( rcItem.right - 7, rcItem.bottom - 1 );
  3196. // left side
  3197. arrPointsInnerArea[5] = CPoint( rcItem.left + 7, rcItem.bottom - 1 );
  3198. arrPointsInnerArea[6] = CPoint( rcItem.left + 6, rcItem.bottom - 2 );
  3199. arrPointsInnerArea[7] = CPoint( rcItem.left + 5, rcItem.bottom - 2 );
  3200. arrPointsInnerArea[8] = CPoint( rcItem.left + 1, rcItem.bottom - 6 );
  3201. arrPointsInnerArea[9] = CPoint( rcItem.left - 5, rcItem.top );
  3202. if( nSelectionIndex > nItemIndex && !bGroupedMode )
  3203. {
  3204. if( !bLastItem )
  3205. arrPointsInnerArea[0] = CPoint( rcItem.right - 1, rcItem.bottom - 7 );
  3206. }
  3207. else if( nSelectionIndex < nItemIndex || bGroupedMode )
  3208. {
  3209. if( !bFirstItem && !bInGroupFirst )
  3210. arrPointsInnerArea[9] = CPoint( rcItem.left + 1, rcItem.bottom - 7 );
  3211. }
  3212. if( nItemIndex == 0 )
  3213. {
  3214. // first item in tab window
  3215. for( int i = 5; i < sizeof(arrPointsInnerArea)/sizeof(arrPointsInnerArea[0]); i++ )
  3216. arrPointsInnerArea[i].x += 6;
  3217. }
  3218. else if( pTabs != NULL && nItemIndex == ( pTabs->ItemGetCount() - 1 ) ) 
  3219. {
  3220. // last item in tab window
  3221. for( int i = 0; i < 5; i++ )
  3222. arrPointsInnerArea[i].x -= 6;
  3223. }
  3224. arrPointsSelectedLine[0] = CPoint( arrPointsBorders[0].x, arrPointsBorders[0].y - 1 );
  3225. arrPointsSelectedLine[1] = CPoint( arrPointsBorders[9].x - 1, arrPointsBorders[9].y - 1 );
  3226. }
  3227. } // if( bHorz )
  3228. else
  3229. {
  3230. if( (bTopLeft && !bGroupedMode) || (!bTopLeft && bGroupedMode) )
  3231. {
  3232. // BORDERS
  3233. // right side
  3234. arrPointsBorders[0] = CPoint( rcItem.right, rcItem.bottom + 6 );
  3235. arrPointsBorders[1] = CPoint( rcItem.left + 6, rcItem.bottom );
  3236. arrPointsBorders[2] = CPoint( rcItem.left + 1, rcItem.bottom - 5 );
  3237. arrPointsBorders[3] = CPoint( rcItem.left + 1, rcItem.bottom - 6 );
  3238. arrPointsBorders[4] = CPoint( rcItem.left, rcItem.bottom - 7 );
  3239. // left side
  3240. arrPointsBorders[5] = CPoint( rcItem.left, rcItem.top + 7 );
  3241. arrPointsBorders[6] = CPoint( rcItem.left + 1, rcItem.top + 6 );  
  3242. arrPointsBorders[7] = CPoint( rcItem.left + 1, rcItem.top + 5 );
  3243. arrPointsBorders[8] = CPoint( rcItem.left + 6, rcItem.top );
  3244. arrPointsBorders[9] = CPoint( rcItem.right, rcItem.top - 6 );
  3245. if( nSelectionIndex > nItemIndex && !bGroupedMode )
  3246. {
  3247. if( !bLastItem )
  3248. arrPointsBorders[0] = CPoint( rcItem.right, rcItem.bottom - 6 );
  3249. }
  3250. else if( nSelectionIndex < nItemIndex || bGroupedMode )
  3251. {
  3252. if( !bFirstItem && !bInGroupFirst )
  3253. arrPointsBorders[9] = CPoint( rcItem.right, rcItem.top + 6 );
  3254. }
  3255. if( nItemIndex == 0 )
  3256. {
  3257. // first item in tab window
  3258. for( int i = 5; i < sizeof(arrPointsBorders)/sizeof(arrPointsBorders[0]); i++ )
  3259. arrPointsBorders[i].y += 6;
  3260. }
  3261. else if( pTabs != NULL && nItemIndex == ( pTabs->ItemGetCount() - 1 ) ) 
  3262. {
  3263. // last item in tab window
  3264. for( int i = 0; i < 5; i++ )
  3265. arrPointsBorders[i].y -= 6;
  3266. }
  3267. // CLIP REGION
  3268. // right side
  3269. arrPointsClipArea[0] = CPoint( rcItem.right + 1,rcItem.bottom + 5 );
  3270. arrPointsClipArea[1] = CPoint( rcItem.left + 6, rcItem.bottom - 2 );
  3271. arrPointsClipArea[2] = CPoint( rcItem.left + 3, rcItem.bottom - 5 );
  3272. arrPointsClipArea[3] = CPoint( rcItem.left + 3, rcItem.bottom - 6 );
  3273. arrPointsClipArea[4] = CPoint( rcItem.left + 2, rcItem.bottom - 7 );
  3274. // left side
  3275. arrPointsClipArea[5] = CPoint( rcItem.left + 2, rcItem.top + 7 );
  3276. arrPointsClipArea[6] = CPoint( rcItem.left + 3, rcItem.top + 6 );  
  3277. arrPointsClipArea[7] = CPoint( rcItem.left + 3, rcItem.top + 5 );
  3278. arrPointsClipArea[8] = CPoint( rcItem.left + 6, rcItem.top + 2 );
  3279. arrPointsClipArea[9] = CPoint( rcItem.right + 1,rcItem.top - 5 );
  3280. if( nSelectionIndex > nItemIndex && !bGroupedMode )
  3281. {
  3282. if( !bLastItem )
  3283. {
  3284. arrPointsClipArea[0] = CPoint( rcItem.right + 1,rcItem.bottom - 7 );
  3285. arrPointsClipArea[1] = CPoint( rcItem.left + 7, rcItem.bottom - 1 );
  3286. }
  3287. }
  3288. else if( nSelectionIndex < nItemIndex || bGroupedMode )
  3289. {
  3290. if( !bFirstItem && !bInGroupFirst )
  3291. {
  3292. arrPointsClipArea[8] = CPoint( rcItem.left + 7, rcItem.top + 1 );
  3293. arrPointsClipArea[9] = CPoint( rcItem.right + 1,rcItem.top + 7 );
  3294. }
  3295. }
  3296. if( nItemIndex == 0 )
  3297. {
  3298. // first item in tab window
  3299. for( int i = 5; i < sizeof(arrPointsClipArea)/sizeof(arrPointsClipArea[0]); i++ )
  3300. arrPointsClipArea[i].y += 6;
  3301. }
  3302. else if( pTabs != NULL && nItemIndex == ( pTabs->ItemGetCount() - 1 ) ) 
  3303. {
  3304. // last item in tab window
  3305. for( int i = 0; i < 5; i++ )
  3306. arrPointsClipArea[i].y -= 6;
  3307. }
  3308. // INNER AREA
  3309. // right side
  3310. arrPointsInnerArea[0] = CPoint( rcItem.right, rcItem.bottom + 5 );
  3311. arrPointsInnerArea[1] = CPoint( rcItem.left + 6, rcItem.bottom - 1 );
  3312. arrPointsInnerArea[2] = CPoint( rcItem.left + 2, rcItem.bottom - 5 );
  3313. arrPointsInnerArea[3] = CPoint( rcItem.left + 2, rcItem.bottom - 6 );
  3314. arrPointsInnerArea[4] = CPoint( rcItem.left + 1, rcItem.bottom - 7 );
  3315. // left side
  3316. arrPointsInnerArea[5] = CPoint( rcItem.left + 1, rcItem.top + 7 );
  3317. arrPointsInnerArea[6] = CPoint( rcItem.left + 2, rcItem.top + 6 );  
  3318. arrPointsInnerArea[7] = CPoint( rcItem.left + 2, rcItem.top + 5 );
  3319. arrPointsInnerArea[8] = CPoint( rcItem.left + 6, rcItem.top + 1 );
  3320. arrPointsInnerArea[9] = CPoint( rcItem.right, rcItem.top - 5 );
  3321. if( nSelectionIndex > nItemIndex && !bGroupedMode )
  3322. {
  3323. if( !bLastItem )
  3324. arrPointsInnerArea[0] = CPoint( rcItem.right, rcItem.bottom - 5 );
  3325. }
  3326. else if( nSelectionIndex < nItemIndex || bGroupedMode )
  3327. {
  3328. if( !bFirstItem && !bInGroupFirst )
  3329. arrPointsInnerArea[9] = CPoint( rcItem.right, rcItem.top + 7 );
  3330. }
  3331. if( nItemIndex == 0 )
  3332. {
  3333. // first item in tab window
  3334. for( int i = 5; i < sizeof(arrPointsInnerArea)/sizeof(arrPointsInnerArea[0]); i++ )
  3335. arrPointsInnerArea[i].y += 6;
  3336. }
  3337. else if( pTabs != NULL && nItemIndex == ( pTabs->ItemGetCount() - 1 ) ) 
  3338. {
  3339. // last item in tab window
  3340. for( int i = 0; i < 5; i++ )
  3341. arrPointsInnerArea[i].y -= 6;
  3342. }
  3343. arrPointsSelectedLine[0] = CPoint( arrPointsInnerArea[0].x + 1, arrPointsInnerArea[0].y + 1 );
  3344. arrPointsSelectedLine[1] = CPoint( arrPointsInnerArea[9].x + 1, arrPointsInnerArea[9].y - 2 );
  3345. }
  3346. else
  3347. {
  3348. // BORDERS
  3349. // right side
  3350. arrPointsBorders[0] = CPoint( rcItem.left, rcItem.bottom + 6 );
  3351. arrPointsBorders[1] = CPoint( rcItem.right - 6, rcItem.bottom );
  3352. arrPointsBorders[2] = CPoint( rcItem.right - 1, rcItem.bottom - 5 );
  3353. arrPointsBorders[3] = CPoint( rcItem.right - 1, rcItem.bottom - 6 );
  3354. arrPointsBorders[4] = CPoint( rcItem.right, rcItem.bottom - 7 );
  3355. // left side
  3356. arrPointsBorders[5] = CPoint( rcItem.right, rcItem.top + 7 );
  3357. arrPointsBorders[6] = CPoint( rcItem.right - 1, rcItem.top + 6 );  
  3358. arrPointsBorders[7] = CPoint( rcItem.right - 1, rcItem.top + 5 );
  3359. arrPointsBorders[8] = CPoint( rcItem.right - 6, rcItem.top );
  3360. arrPointsBorders[9] = CPoint( rcItem.left, rcItem.top - 6 );
  3361. if( nSelectionIndex > nItemIndex && !bGroupedMode )
  3362. {
  3363. if( !bLastItem )
  3364. arrPointsBorders[0] = CPoint( rcItem.left, rcItem.bottom - 6 );
  3365. }
  3366. else if( nSelectionIndex < nItemIndex || bGroupedMode )
  3367. {
  3368. if( !bFirstItem && !bInGroupFirst )
  3369. arrPointsBorders[9] = CPoint( rcItem.left, rcItem.top + 6 );
  3370. }
  3371. if( nItemIndex == 0 )
  3372. {
  3373. // first item in tab window
  3374. for( int i = 5; i < sizeof(arrPointsBorders)/sizeof(arrPointsBorders[0]); i++ )
  3375. arrPointsBorders[i].y += 6;
  3376. }
  3377. else if( pTabs != NULL && nItemIndex == ( pTabs->ItemGetCount() - 1 ) ) 
  3378. {
  3379. // last item in tab window
  3380. for( int i = 0; i < 5; i++ )
  3381. arrPointsBorders[i].y -= 6;
  3382. }
  3383. // CLIP REGION
  3384. // right side
  3385. arrPointsClipArea[0] = CPoint( rcItem.left - 0, rcItem.bottom + 5 );
  3386. arrPointsClipArea[1] = CPoint( rcItem.right - 5, rcItem.bottom - 2 );
  3387. arrPointsClipArea[2] = CPoint( rcItem.right - 2, rcItem.bottom - 5 );
  3388. arrPointsClipArea[3] = CPoint( rcItem.right - 2, rcItem.bottom - 6 );
  3389. arrPointsClipArea[4] = CPoint( rcItem.right - 1, rcItem.bottom - 7 );
  3390. // left side
  3391. arrPointsClipArea[5] = CPoint( rcItem.right - 1, rcItem.top + 7 );
  3392. arrPointsClipArea[6] = CPoint( rcItem.right - 2, rcItem.top + 6 );  
  3393. arrPointsClipArea[7] = CPoint( rcItem.right - 2, rcItem.top + 5 );
  3394. arrPointsClipArea[8] = CPoint( rcItem.right - 5, rcItem.top + 2 );
  3395. arrPointsClipArea[9] = CPoint( rcItem.left - 0, rcItem.top - 5 );
  3396. if( nSelectionIndex > nItemIndex && !bGroupedMode )
  3397. {
  3398. if( !bLastItem )
  3399. {
  3400. arrPointsClipArea[0] = CPoint( rcItem.left - 0,rcItem.bottom - 7 );
  3401. arrPointsClipArea[1] = CPoint( rcItem.right - 7, rcItem.bottom - 1 );
  3402. }
  3403. }
  3404. else if( nSelectionIndex < nItemIndex || bGroupedMode )
  3405. {
  3406. if( !bFirstItem && !bInGroupFirst )
  3407. {
  3408. arrPointsClipArea[8] = CPoint( rcItem.right - 7, rcItem.top + 1 );
  3409. arrPointsClipArea[9] = CPoint( rcItem.left - 0,rcItem.top + 7 );
  3410. }
  3411. }
  3412. if( nItemIndex == 0 )
  3413. {
  3414. // first item in tab window
  3415. for( int i = 5; i < sizeof(arrPointsClipArea)/sizeof(arrPointsClipArea[0]); i++ )
  3416. arrPointsClipArea[i].y += 6;
  3417. }
  3418. else if( pTabs != NULL && nItemIndex == ( pTabs->ItemGetCount() - 1 ) ) 
  3419. {
  3420. // last item in tab window
  3421. for( int i = 0; i < 5; i++ )
  3422. arrPointsClipArea[i].y -= 6;
  3423. }
  3424. // INNER AREA
  3425. // right side
  3426. arrPointsInnerArea[0] = CPoint( rcItem.left, rcItem.bottom + 5 );
  3427. arrPointsInnerArea[1] = CPoint( rcItem.right - 6, rcItem.bottom - 1 );
  3428. arrPointsInnerArea[2] = CPoint( rcItem.right - 2, rcItem.bottom - 5 );
  3429. arrPointsInnerArea[3] = CPoint( rcItem.right - 2, rcItem.bottom - 6 );
  3430. arrPointsInnerArea[4] = CPoint( rcItem.right - 1, rcItem.bottom - 7 );
  3431. // left side
  3432. arrPointsInnerArea[5] = CPoint( rcItem.right - 1, rcItem.top + 7 );
  3433. arrPointsInnerArea[6] = CPoint( rcItem.right - 2, rcItem.top + 6 );  
  3434. arrPointsInnerArea[7] = CPoint( rcItem.right - 2, rcItem.top + 5 );
  3435. arrPointsInnerArea[8] = CPoint( rcItem.right - 6, rcItem.top + 1 );
  3436. arrPointsInnerArea[9] = CPoint( rcItem.left, rcItem.top - 5 );
  3437. if( nSelectionIndex > nItemIndex && !bGroupedMode )
  3438. {
  3439. if( !bLastItem )
  3440. arrPointsInnerArea[0] = CPoint( rcItem.left, rcItem.bottom - 5 );
  3441. }
  3442. else if( nSelectionIndex < nItemIndex || bGroupedMode )
  3443. {
  3444. if( !bFirstItem && !bInGroupFirst )
  3445. arrPointsInnerArea[9] = CPoint( rcItem.left, rcItem.top + 7 );
  3446. }
  3447. if( nItemIndex == 0 )
  3448. {
  3449. // first item in tab window
  3450. for( int i = 5; i < sizeof(arrPointsInnerArea)/sizeof(arrPointsInnerArea[0]); i++ )
  3451. arrPointsInnerArea[i].y += 6;
  3452. }
  3453. else if( pTabs != NULL && nItemIndex == ( pTabs->ItemGetCount() - 1 ) ) 
  3454. {
  3455. // last item in tab window
  3456. for( int i = 0; i < 5; i++ )
  3457. arrPointsInnerArea[i].y -= 6;
  3458. }
  3459. arrPointsSelectedLine[0] = CPoint( arrPointsBorders[0].x - 1, arrPointsBorders[0].y );
  3460. arrPointsSelectedLine[1] = CPoint( arrPointsBorders[9].x - 1, arrPointsBorders[9].y - 1 );
  3461. }
  3462. } // else if( bHorz )
  3463. // draw item borders
  3464. CPen pen( PS_SOLID, 1, clrTabBorderRB );
  3465. CPen * pOldPen = dc.SelectObject( &pen );
  3466. INT nPointsBordersCount = sizeof(arrPointsBorders)/sizeof(arrPointsBorders[0]);
  3467. int i = 0;
  3468. for( i = 0; i < nPointsBordersCount - 1; i++ )
  3469. {
  3470. dc.MoveTo( arrPointsBorders[i] );
  3471. dc.LineTo( arrPointsBorders[i + 1] );
  3472. }
  3473. dc.MoveTo( arrPointsBorders[ nPointsBordersCount - 1 ] );
  3474. dc.LineTo( arrPointsBorders[ nPointsBordersCount - 2 ] );
  3475. dc.SelectObject( pOldPen );
  3476. pen.DeleteObject();
  3477. // draw inner item borders
  3478. COLORREF clrInnerDark = GetColor( COLOR_3DFACE, this );
  3479. COLORREF clrInnerLight = RGB(252,252,254);
  3480. if( nItemIndex == nSelectionIndex && !bGroupedMode )
  3481. clrInnerDark = clrInnerLight;
  3482. pen.CreatePen( PS_SOLID, 1, clrInnerDark );
  3483. pOldPen = dc.SelectObject( &pen );
  3484. int nLastDarkPoint = bGroupedMode && bTopLeft ? 5 : 4;
  3485. for( i = 0; i <= nLastDarkPoint; i++ )
  3486. {
  3487. dc.MoveTo( arrPointsInnerArea[i] );
  3488. dc.LineTo( arrPointsInnerArea[i + 1] );
  3489. }
  3490. dc.SelectObject( pOldPen );
  3491. pen.DeleteObject();
  3492. pen.CreatePen( PS_SOLID, 1, clrInnerLight );
  3493. pOldPen = dc.SelectObject( &pen );
  3494. int nFirstLightPoint = bGroupedMode && bTopLeft ? 6 : 4;
  3495. for( i = nFirstLightPoint; i <= 8; i++ )
  3496. {
  3497. dc.MoveTo( arrPointsInnerArea[i] );
  3498. dc.LineTo( arrPointsInnerArea[i + 1] );
  3499. }
  3500. dc.SelectObject( pOldPen );
  3501. pen.DeleteObject();
  3502. // selected item
  3503. if( nItemIndex == nSelectionIndex && !bGroupedMode )
  3504. {
  3505. pen.CreatePen( PS_SOLID, 1, RGB(252,252,254) ); 
  3506. pOldPen = dc.SelectObject( &pen );
  3507. dc.MoveTo( arrPointsSelectedLine[0] );
  3508. dc.LineTo( arrPointsSelectedLine[1] );
  3509. dc.SelectObject( pOldPen );
  3510. pen.DeleteObject();
  3511. }
  3512. CRgn rgnClipArea;
  3513. VERIFY( rgnClipArea.CreatePolygonRgn( arrPointsClipArea, 10, ALTERNATE ) );
  3514. // fill item background 
  3515. CRect rcFill( rcTabItemsArea );
  3516. dc.SelectClipRgn( &rgnClipArea, RGN_AND );
  3517. if( !(nItemIndex == nSelectionIndex && !bGroupedMode) 
  3518. && ::GetDeviceCaps( dc.m_hDC, BITSPIXEL ) > 8 
  3519. )
  3520. {
  3521. COLORREF clr1 =
  3522. bHorz
  3523. ? ( bTopLeft && !bGroupedMode ? clrBkDark : clrBkLight ) 
  3524. : ( bTopLeft && !bGroupedMode ? clrBkLight : clrBkDark )
  3525. ;
  3526. COLORREF clr2 =
  3527. bHorz
  3528. ? ( bTopLeft && !bGroupedMode ? clrBkLight : clrBkDark ) 
  3529. : ( bTopLeft && !bGroupedMode ? clrBkDark : clrBkLight )
  3530. ;
  3531. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3532. if( pHelperSrc != NULL
  3533. && clrForceTabBk != COLORREF(-1L)
  3534. && ( bDetectedDynTPC
  3535. || pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDynTabWnd ) )
  3536. || pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDynAutoHideArea ) )
  3537. )
  3538. )
  3539. clr1 = clr2 = clrForceTabBk;
  3540. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3541. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  3542. if( pHelperSrc != NULL
  3543. && clrForceTabBk != COLORREF(-1L)
  3544. && pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtTabWnd ) )
  3545. && ((CExtTabWnd*)pHelperSrc)->_IsMdiTabCtrl()
  3546. )
  3547. clr1 = clr2 = clrForceTabBk;
  3548. #endif // (!defined __EXT_MFC_NO_TABMDI_CTRL)
  3549. stat_PaintGradientRect(
  3550. dc,
  3551. &rcFill,
  3552. clr1,
  3553. clr2,
  3554. bHorz
  3555. );
  3556. }
  3557. else 
  3558. {
  3559. COLORREF clrFill =
  3560. ( nItemIndex == nSelectionIndex )
  3561. ? RGB(252,252,254)
  3562. : GetColor( COLOR_3DFACE, this )
  3563. ;
  3564. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3565. if( pHelperSrc != NULL
  3566. && clrForceTabBk != COLORREF(-1L)
  3567. && ( bDetectedDynTPC
  3568. || pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDynTabWnd ) )
  3569. || pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDynAutoHideArea ) )
  3570. )
  3571. )
  3572. clrFill = clrForceTabBk;
  3573. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3574. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  3575. if( pHelperSrc != NULL
  3576. && clrForceTabBk != COLORREF(-1L)
  3577. && pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtTabWnd ) )
  3578. && ((CExtTabWnd*)pHelperSrc)->_IsMdiTabCtrl()
  3579. )
  3580. clrFill = clrForceTabBk;
  3581. #endif // (!defined __EXT_MFC_NO_TABMDI_CTRL)
  3582. dc.FillSolidRect( &rcFill, clrFill );
  3583. }
  3584. #define __EXTTAB_BETA2_INDENT_TOP 2
  3585. #define __EXTTAB_BETA2_INDENT_BOTTOM 2
  3586. #define __EXTTAB_BETA2_INDENT_LEFT 3
  3587. #define __EXTTAB_BETA2_INDENT_RIGHT 1
  3588. rcItem.DeflateRect(
  3589. bHorz 
  3590. ? __EXTTAB_BETA2_INDENT_LEFT 
  3591. : __EXTTAB_BETA2_INDENT_TOP,
  3592. bHorz 
  3593. ? __EXTTAB_BETA2_INDENT_TOP 
  3594. : __EXTTAB_BETA2_INDENT_LEFT,
  3595. bHorz 
  3596. ? __EXTTAB_BETA2_INDENT_RIGHT 
  3597. : __EXTTAB_BETA2_INDENT_TOP,
  3598. bHorz 
  3599. ? __EXTTAB_BETA2_INDENT_BOTTOM 
  3600. : __EXTTAB_BETA2_INDENT_RIGHT
  3601. );
  3602. // first item indent
  3603. if( nItemIndex == 0 )
  3604. rcItem.DeflateRect(
  3605. bHorz ? 6 : 0,
  3606. !bHorz ? 6 : 0,
  3607. bHorz ? 6 : 0,
  3608. !bHorz ? 6 : 0
  3609. );
  3610. }
  3611. else if( m_eStyle2005 == __ES2005_BETA1 
  3612. || m_eStyle2005 == __ES2005_RC
  3613. )
  3614. {
  3615. POINT arrPointsBorders[6] = { {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0} };
  3616. POINT arrPointsInnerArea[6] = { {0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0} };
  3617. POINT arrPointsItemsSeparator[2] = { {0,0}, {0,0} };
  3618. if( bHorz )
  3619. {
  3620. bool bNewTopLeft = bGroupedMode ? !bTopLeft : bTopLeft;
  3621. if( bNewTopLeft )
  3622. {
  3623. arrPointsBorders[0] = CPoint(rcItem.left, rcItem.bottom - 1 );
  3624. arrPointsBorders[1] = CPoint(rcItem.left, rcItem.top + 2 );
  3625. arrPointsBorders[2] = CPoint(rcItem.left + 2, rcItem.top );
  3626. arrPointsBorders[3] = CPoint(rcItem.right - 2, rcItem.top );
  3627. arrPointsBorders[4] = CPoint(rcItem.right, rcItem.top + 2 );
  3628. arrPointsBorders[5] = CPoint(rcItem.right, rcItem.bottom );
  3629. arrPointsInnerArea[0] = CPoint(rcItem.left + 1, rcItem.bottom + 1 );
  3630. arrPointsInnerArea[1] = CPoint(rcItem.left + 1, rcItem.top + 2 );
  3631. arrPointsInnerArea[2] = CPoint(rcItem.left + 2, rcItem.top + 1 );
  3632. arrPointsInnerArea[3] = CPoint(rcItem.right - 1,rcItem.top + 1 );
  3633. arrPointsInnerArea[4] = CPoint(rcItem.right, rcItem.top + 2 );
  3634. arrPointsInnerArea[5] = CPoint(rcItem.right, rcItem.bottom + 1 );
  3635. arrPointsItemsSeparator[0] = CPoint(rcItem.right, rcItem.top + 3 );
  3636. arrPointsItemsSeparator[1] = CPoint(rcItem.right, rcItem.bottom - 2 );
  3637. } // if( bNewTopLeft )
  3638. else
  3639. {
  3640. rcItem.bottom--;
  3641. arrPointsBorders[0] = CPoint(rcItem.left, rcItem.top );
  3642. arrPointsBorders[1] = CPoint(rcItem.left, rcItem.bottom - 2 );
  3643. arrPointsBorders[2] = CPoint(rcItem.left + 2, rcItem.bottom );
  3644. arrPointsBorders[3] = CPoint(rcItem.right - 2, rcItem.bottom );
  3645. arrPointsBorders[4] = CPoint(rcItem.right, rcItem.bottom - 2 );
  3646. arrPointsBorders[5] = CPoint(rcItem.right, rcItem.top - 1 );
  3647. arrPointsInnerArea[0] = CPoint(rcItem.left + 1, rcItem.top - 1);
  3648. arrPointsInnerArea[1] = CPoint(rcItem.left + 1, rcItem.bottom - 2 );
  3649. arrPointsInnerArea[2] = CPoint(rcItem.left + 2, rcItem.bottom );
  3650. arrPointsInnerArea[3] = CPoint(rcItem.right - 2,rcItem.bottom );
  3651. arrPointsInnerArea[4] = CPoint(rcItem.right, rcItem.bottom - 2 );
  3652. arrPointsInnerArea[5] = CPoint(rcItem.right, rcItem.top - 1 );
  3653. arrPointsItemsSeparator[0] = CPoint(rcItem.right, rcItem.bottom - 3 );
  3654. arrPointsItemsSeparator[1] = CPoint(rcItem.right, rcItem.top + 1 );
  3655. }
  3656. else
  3657. {
  3658. bool bNewTopLeft = bGroupedMode ? !bTopLeft : bTopLeft;
  3659. if( bNewTopLeft )
  3660. {
  3661. arrPointsBorders[0] = CPoint(rcItem.right - 1, rcItem.top );
  3662. arrPointsBorders[1] = CPoint(rcItem.left + 2, rcItem.top );
  3663. arrPointsBorders[2] = CPoint(rcItem.left, rcItem.top + 2 );
  3664. arrPointsBorders[3] = CPoint(rcItem.left, rcItem.bottom - 2 );
  3665. arrPointsBorders[4] = CPoint(rcItem.left + 2, rcItem.bottom );
  3666. arrPointsBorders[5] = CPoint(rcItem.right, rcItem.bottom );
  3667. arrPointsInnerArea[0] = CPoint(rcItem.right + 1,rcItem.top + 1 );
  3668. arrPointsInnerArea[1] = CPoint(rcItem.left + 2, rcItem.top + 1 );
  3669. arrPointsInnerArea[2] = CPoint(rcItem.left + 1, rcItem.top + 2 );
  3670. arrPointsInnerArea[3] = CPoint(rcItem.left + 1, rcItem.bottom - 2 );
  3671. arrPointsInnerArea[4] = CPoint(rcItem.left + 2, rcItem.bottom );
  3672. arrPointsInnerArea[5] = CPoint(rcItem.right + 1,rcItem.bottom );
  3673. arrPointsItemsSeparator[0] = CPoint(rcItem.left + 3, rcItem.bottom );
  3674. arrPointsItemsSeparator[1] = CPoint(rcItem.right - 2, rcItem.bottom );
  3675. } // if( bNewTopLeft )
  3676. else
  3677. {
  3678. rcItem.right--;
  3679. arrPointsBorders[0] = CPoint(rcItem.left, rcItem.top );
  3680. arrPointsBorders[1] = CPoint(rcItem.right - 2, rcItem.top );
  3681. arrPointsBorders[2] = CPoint(rcItem.right, rcItem.top + 2 );
  3682. arrPointsBorders[3] = CPoint(rcItem.right, rcItem.bottom - 2 );
  3683. arrPointsBorders[4] = CPoint(rcItem.right - 2, rcItem.bottom );
  3684. arrPointsBorders[5] = CPoint(rcItem.left - 1, rcItem.bottom );
  3685. arrPointsInnerArea[0] = CPoint(rcItem.left - 1, rcItem.top + 1 );
  3686. arrPointsInnerArea[1] = CPoint(rcItem.right - 2,rcItem.top );
  3687. arrPointsInnerArea[2] = CPoint(rcItem.right, rcItem.top + 2 );
  3688. arrPointsInnerArea[3] = CPoint(rcItem.right, rcItem.bottom - 2 );
  3689. arrPointsInnerArea[4] = CPoint(rcItem.right - 2,rcItem.bottom );
  3690. arrPointsInnerArea[5] = CPoint(rcItem.left - 1, rcItem.bottom );
  3691. arrPointsItemsSeparator[0] = CPoint(rcItem.right - 3, rcItem.bottom );
  3692. arrPointsItemsSeparator[1] = CPoint(rcItem.left + 1, rcItem.bottom );
  3693. }
  3694. }
  3695. // draw item border 
  3696. CPen pen(PS_SOLID, 1, GetColor( COLOR_3DSHADOW, this ) );
  3697. CPen * pOldPen = dc.SelectObject( &pen );
  3698. if( m_eStyle2005 != __ES2005_RC 
  3699. || bSelected
  3700. || bGroupedMode
  3701. )
  3702. {
  3703. for( int i = 0 ; i < sizeof(arrPointsBorders)/sizeof(arrPointsBorders[0]) - 1; i++ )
  3704. {
  3705. dc.MoveTo( arrPointsBorders[i] );
  3706. dc.LineTo( arrPointsBorders[i + 1] );
  3707. }
  3708. }
  3709. else if( pTabs != NULL && nItemIndex < pTabs->ItemGetCount() - 1 )
  3710. {
  3711. dc.MoveTo( arrPointsItemsSeparator[0] );
  3712. dc.LineTo( arrPointsItemsSeparator[1] );
  3713. }
  3714. dc.SelectObject( pOldPen );
  3715. CRgn rgnBk;
  3716. VERIFY( rgnBk.CreatePolygonRgn( arrPointsInnerArea, 6, ALTERNATE ) );
  3717. if( m_eStyle2005 != __ES2005_RC )
  3718. {
  3719. if( (!bSelected || bGroupedMode ) 
  3720. && ::GetDeviceCaps( dc.m_hDC, BITSPIXEL ) > 8
  3721. )
  3722. {
  3723. dc.SelectClipRgn( &rgnBk, RGN_AND );
  3724. CRect rcFill( rcTabItemsArea );
  3725. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3726. if( pHelperSrc != NULL
  3727. && clrForceTabBk != COLORREF(-1L)
  3728. && ( bDetectedDynTPC
  3729. || pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDynTabWnd ) )
  3730. || pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDynAutoHideArea ) )
  3731. )
  3732. )
  3733. clrBkLight = clrBkDark = clrForceTabBk;
  3734. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3735. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  3736. if( pHelperSrc != NULL
  3737. && clrForceTabBk != COLORREF(-1L)
  3738. && pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtTabWnd ) )
  3739. && ((CExtTabWnd*)pHelperSrc)->_IsMdiTabCtrl()
  3740. )
  3741. clrBkLight = clrBkDark = clrForceTabBk;
  3742. #endif // (!defined __EXT_MFC_NO_TABMDI_CTRL)
  3743. stat_PaintGradientRect(
  3744. dc,
  3745. &rcFill,
  3746. clrBkLight,
  3747. clrBkDark,
  3748. bHorz
  3749. );
  3750. }
  3751. else 
  3752. {
  3753. COLORREF clrBrushBk = 
  3754. (bSelected && !bGroupedMode)
  3755. ? clrTabBorderLT
  3756. : GetColor( COLOR_BTNFACE, this )
  3757. ;
  3758. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3759. if( pHelperSrc != NULL
  3760. && clrForceTabBk != COLORREF(-1L)
  3761. && ( bDetectedDynTPC
  3762. || pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDynTabWnd ) )
  3763. || pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDynAutoHideArea ) )
  3764. )
  3765. )
  3766. clrBrushBk = clrForceTabBk;
  3767. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3768. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  3769. if( pHelperSrc != NULL
  3770. && clrForceTabBk != COLORREF(-1L)
  3771. && pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtTabWnd ) )
  3772. && ((CExtTabWnd*)pHelperSrc)->_IsMdiTabCtrl()
  3773. )
  3774. clrBrushBk = clrForceTabBk;
  3775. #endif // (!defined __EXT_MFC_NO_TABMDI_CTRL)
  3776. CBrush brushBk( clrBrushBk );
  3777. dc.FillRgn( &rgnBk, &brushBk );
  3778. }
  3779. }
  3780. else if( bSelected && !bGroupedMode )
  3781. {
  3782. COLORREF clrBrushBk = RGB(252,252,254);
  3783. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3784. if( pHelperSrc != NULL
  3785. && clrForceTabBk != COLORREF(-1L)
  3786. && ( bDetectedDynTPC
  3787. || pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDynTabWnd ) )
  3788. || pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtDynAutoHideArea ) )
  3789. )
  3790. )
  3791. clrBrushBk = clrForceTabBk;
  3792. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  3793. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  3794. if( pHelperSrc != NULL
  3795. && clrForceTabBk != COLORREF(-1L)
  3796. && pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtTabWnd ) )
  3797. && ((CExtTabWnd*)pHelperSrc)->_IsMdiTabCtrl()
  3798. )
  3799. clrBrushBk = clrForceTabBk;
  3800. #endif // (!defined __EXT_MFC_NO_TABMDI_CTRL)
  3801. CBrush brushBk( clrBrushBk );
  3802. dc.FillRgn( &rgnBk, &brushBk );
  3803. }
  3804. rcItem.DeflateRect(
  3805. __EXTTAB_MARGIN_BORDER_HX+1,
  3806. bHorz ? __EXTTAB_MARGIN_BORDER_VY : __EXTTAB_MARGIN_BORDER_VY+1,
  3807. __EXTTAB_MARGIN_BORDER_HX,
  3808. __EXTTAB_MARGIN_BORDER_VY
  3809. );
  3810. } // else if( m_eStyle2005 == __ES2005_BETA1 ...
  3811. else
  3812. {
  3813. ASSERT( FALSE );
  3814. AfxThrowNotSupportedException();
  3815. }
  3816. CSize _sizeIcon( 0, 0 );
  3817. bool bDrawIcon = (
  3818.   pIcon != NULL 
  3819.   && (!pIcon->IsEmpty()) 
  3820.   && ( pTabs == NULL || (pTabs->GetTabWndStyle()&__ETWS_HIDE_ICONS) == 0  ) 
  3821.   );
  3822. if( bDrawIcon )
  3823. {
  3824. _sizeIcon = pIcon->GetSize();
  3825. ASSERT( _sizeIcon.cx > 0 && _sizeIcon.cy > 0 );
  3826. }
  3827. CExtSafeString sItemText( (sText == NULL) ? _T("") : sText );
  3828. // IMPORTANT:  the rcText calculation fixed by Genka
  3829. CRect rcText(
  3830. rcItem.left
  3831. + ( bHorz
  3832. ? (_sizeIcon.cx +
  3833. ((_sizeIcon.cx > 0) ? __EXTTAB_MARGIN_ICON2TEXT_X : 0)
  3834. )
  3835. : 0
  3836. ),
  3837. rcItem.top
  3838. + ( bHorz
  3839. ? 0
  3840. : (_sizeIcon.cy +
  3841. ((_sizeIcon.cy > 0) ? __EXTTAB_MARGIN_ICON2TEXT_Y : 0)
  3842. )
  3843. ),
  3844. rcItem.right,
  3845. rcItem.bottom
  3846. );
  3847. if( !bHorz )
  3848. {
  3849. int nWidth0 = rcText.Width();
  3850. int nWidth1 = rcItem.Width() + __EXTTAB_MARGIN_ICON2TEXT_X*2;
  3851. if( nWidth1 > nWidth0 )
  3852. {
  3853. if( bInvertedVerticalMode )
  3854. rcText.left = rcText.right - nWidth1;
  3855. else
  3856. rcText.right = rcText.left + nWidth1;
  3857. }
  3858. }
  3859. bool bDrawText = ( ( ! sItemText.IsEmpty() ) && rcText.Width() > 0 && rcText.Height() > 0 ) ? true : false;
  3860. if( bDrawIcon )
  3861. {
  3862. INT nIconAlignment = __ALIGN_VERT_TOP;
  3863. if( (!bDrawText) && !( bGroupedMode && (!bInGroupActive) ) )
  3864. {
  3865. if( bCenteredText )
  3866. nIconAlignment = __ALIGN_HORIZ_CENTER|__ALIGN_VERT_CENTER;
  3867. else
  3868. nIconAlignment |= __ALIGN_HORIZ_CENTER;
  3869. }
  3870. if( (bHorz && rcItem.Width() >= _sizeIcon.cx )
  3871. || (!bHorz && rcItem.Height() >= _sizeIcon.cy)
  3872. )
  3873. {
  3874. PaintIcon(
  3875. dc,
  3876. bHorz,
  3877. pIcon,
  3878. rcItem,
  3879. false,
  3880. bEnabled,
  3881. false,
  3882. nIconAlignment
  3883. );
  3884. }
  3885. } // if( bDrawIcon )
  3886. if( bDrawText )
  3887. { // if we have sense to paint text on tab item
  3888. ASSERT( pFont != NULL );
  3889. ASSERT( pFont->GetSafeHandle() != NULL );
  3890. COLORREF clrOldText = dc.SetTextColor( clrText );
  3891. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  3892. CFont * pOldFont = dc.SelectObject( pFont );
  3893. if( ! bHorz )
  3894. {
  3895. if( bCenteredText )
  3896. rcText.OffsetRect(
  3897. 0,
  3898. ( rcText.Height() - sizeTextMeasured.cx ) / 2
  3899. );
  3900. int nTextLength = sItemText.GetLength();
  3901. int nAmpIndex = bNoPrefix ? (-1) : int( sItemText.Find( _T('&') ) );
  3902. CExtSafeString sBtn;
  3903. if( nAmpIndex < 0 || bNoPrefix )
  3904. sBtn = sItemText;
  3905. else
  3906. sBtn =
  3907. sItemText.Left( nAmpIndex )
  3908. + sItemText.Right( nTextLength - ( nAmpIndex + 1 ) );
  3909. if( ! bNoPrefix )
  3910. {
  3911. static TCHAR stat_strDummyAmpSeq[] = _T("0101");
  3912. sBtn.Replace( _T("&&"), stat_strDummyAmpSeq );
  3913. sBtn.Remove( _T('&') );
  3914. sBtn.Replace( stat_strDummyAmpSeq, _T("&") );
  3915. }
  3916. LOGFONT lf;
  3917. ::memset(&lf,0,sizeof(LOGFONT));
  3918. pFont->GetLogFont(&lf);
  3919. int _cyHorzFont = abs(lf.lfHeight);
  3920. int _cyTextMargin =
  3921. (rcText.Width() - _cyHorzFont)  / 2
  3922. ;
  3923. CPoint
  3924. ptLineFrom(0,0),
  3925. ptLineTo(0,0);
  3926. if( nAmpIndex >= 0 && ( ! bNoPrefix ) )
  3927. {
  3928. ptLineFrom =
  3929. CPoint(
  3930. __ExtMfc_CXTEXTMARGIN
  3931. + _cyTextMargin,
  3932. __ExtMfc_CYTEXTMARGIN
  3933. + stat_CalcTextWidth(
  3934. dc,
  3935. *pFont,
  3936. sBtn.Left(nAmpIndex)
  3937. )
  3938. );
  3939. ptLineTo =
  3940. CPoint(
  3941. __ExtMfc_CXTEXTMARGIN
  3942. + _cyTextMargin,
  3943. __ExtMfc_CYTEXTMARGIN
  3944. + stat_CalcTextWidth(
  3945. dc,
  3946. *pFont,
  3947. sBtn.Left(nAmpIndex+1)
  3948. )
  3949. );
  3950. int nXOffsPlus =
  3951. rcText.Width()
  3952. - stat_CalcTextDimension(
  3953. dc,
  3954. *pFont,
  3955. sBtn
  3956. ).Height();
  3957. nXOffsPlus /= 2;
  3958. nXOffsPlus -= 4;
  3959. ptLineFrom.x += nXOffsPlus;
  3960. ptLineTo.x   += nXOffsPlus;
  3961. } // if( nAmpIndex >= 0 )
  3962. CRect rcString = 
  3963. CRect(
  3964. CPoint(
  3965. rcText.right - _cyTextMargin + __ExtMfc_CXTEXTMARGIN,
  3966. rcText.top + __ExtMfc_CYTEXTMARGIN
  3967. ),
  3968. rcText.Size() //m_sizeHorz
  3969. );
  3970. rcString.DeflateRect(2,2);
  3971. if( bInvertedVerticalMode )
  3972. {
  3973. rcString.OffsetRect( 0, -2 );
  3974. CSize ptFix( -rcString.Width() + 1, 0 );
  3975. ptLineFrom.x += sizeTextMeasured.cy - 2;
  3976. ptLineFrom.y = - ptLineFrom.y + sizeTextMeasured.cx - 4;
  3977. ptLineTo.x += sizeTextMeasured.cy - 2;
  3978. ptLineTo.y = - ptLineTo.y + sizeTextMeasured.cx - 4;
  3979. ptLineFrom += rcString.TopLeft() + ptFix;
  3980. ptLineTo += rcString.TopLeft() + ptFix;
  3981. rcString.OffsetRect(
  3982. - sizeTextMeasured.cy + 3,
  3983. sizeTextMeasured.cx - 3
  3984. );
  3985. }
  3986. else
  3987. {
  3988. rcString.OffsetRect( -2, 0 );
  3989. CSize ptFix( -rcString.Width() + 1, 0 );
  3990. ptLineFrom += rcString.TopLeft() + ptFix;
  3991. ptLineTo += rcString.TopLeft() + ptFix;
  3992. }
  3993. dc.DrawText(
  3994. sBtn,
  3995. sBtn.GetLength(),
  3996. rcString,
  3997. DT_SINGLELINE | DT_NOCLIP | ( bNoPrefix ? (DT_NOPREFIX) : 0 )
  3998. );
  3999. if( nAmpIndex >= 0 )
  4000. {
  4001. CPen pen(
  4002. PS_SOLID,
  4003. 0,
  4004. dc.GetTextColor()
  4005. );
  4006. CPen * pOldPen = dc.SelectObject( &pen );
  4007. dc.MoveTo( ptLineFrom );
  4008. dc.LineTo( ptLineTo );
  4009. dc.SelectObject( pOldPen );
  4010. } // if( nAmpIndex >= 0 )
  4011. } // if( !bHorz )
  4012. else
  4013. {
  4014. if( pIconTabItemCloseButton != NULL )
  4015. rcText.right = min( rcText.right, rcTabItemCloseButton.left );
  4016. UINT nFormat =
  4017. DT_SINGLELINE|DT_VCENTER|DT_END_ELLIPSIS;
  4018. if( bCenteredText )
  4019. nFormat |= DT_CENTER;
  4020. else
  4021. nFormat |= DT_LEFT;
  4022. if( bNoPrefix )
  4023. nFormat |= DT_NOPREFIX;