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

界面编程

开发平台:

Visual C++

  1. // This is part of the Professional User Interface Suite library.
  2. // Copyright (C) 2001-2009 FOSS Software, Inc.
  3. // All rights reserved.
  4. //
  5. // http://www.prof-uis.com
  6. // mailto:support@prof-uis.com
  7. //
  8. // This source code can be used, modified and redistributed
  9. // under the terms of the license agreement that is included
  10. // in the Professional User Interface Suite package.
  11. //
  12. // Warranties and Disclaimers:
  13. // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
  14. // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  16. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
  17. // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
  18. // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
  19. // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
  20. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  21. #include "StdAfx.h"
  22. #if _MFC_VER < 0x700
  23. #include <../src/AfxImpl.h>
  24. #else
  25. #include <../src/mfc/AfxImpl.h>
  26. #endif
  27. #if (!defined __EXT_PAINT_MANAGER_H)
  28. #include <ExtPaintManager.h>
  29. #endif
  30. #if (!defined __ExtCmdManager_H)
  31. #include <ExtCmdManager.h>
  32. #endif
  33. #if (!defined __EXT_MEMORY_DC_H)
  34. #include <../Src/ExtMemoryDC.h>
  35. #endif
  36. #if (!defined __EXT_POPUP_MENU_WND_H)
  37. #include <ExtPopupMenuWnd.h>
  38. #endif
  39. #if (!defined __EXT_MENUCONTROLBAR_H)
  40. #include <ExtMenuControlBar.h>
  41. #endif
  42. #if (!defined __EXTDOCKBAR_H)
  43. #include <../Src/ExtDockBar.h>
  44. #endif
  45. #if (!defined __EXT_STATUSCONTROLBAR_H)
  46. #include <ExtStatusControlBar.h>
  47. #endif
  48. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  49. #if (!defined __EXT_CONTROLBAR_TABBED_FEATURES_H)
  50. #include "ExtControlBarTabbedFeatures.h"
  51. #endif // __EXT_CONTROLBAR_TABBED_FEATURES_H
  52. #endif
  53. #if( !defined __EXTMINIDOCKFRAMEWND_H)
  54. #include "ExtMiniDockFrameWnd.h"
  55. #endif
  56. #if (!defined __EXT_MFC_NO_SHORTCUTLIST_CTRL)
  57. #if (!defined __EXTSHORTCUTLISTWND_H)
  58. #include <ExtShortcutListWnd.h>
  59. #endif
  60. #endif // (!defined __EXT_MFC_NO_SHORTCUTLIST_CTRL)
  61. #if (!defined __EXT_BUTTON_H)
  62. #include <ExtButton.h>
  63. #endif
  64. #if (!defined __EXT_GROUPBOX_H)
  65. #include <ExtGroupBox.h>
  66. #endif
  67. #if (!defined __PROF_UIS_RES_2007_H)
  68. #include <Resources/Res2007/Res2007.h>
  69. #endif
  70. #if (!defined __PROF_UIS_RES_2010_OFFICE_H)
  71. #include <Resources/Res2010office/Res2010office.h>
  72. #endif
  73. #if (!defined __EXT_SCROLLWND_H)
  74. #include <ExtScrollWnd.h>
  75. #endif 
  76. #if (!defined __EXT_MFC_NO_REPORTGRIDWND)
  77. #if (!defined __EXT_REPORT_GRID_WND_H)
  78. #include <ExtReportGridWnd.h>
  79. #endif
  80. #endif 
  81. #if (!defined __EXT_MFC_NO_DATE_PICKER)
  82. #if (!defined __EXT_DATE_PICKER_H)
  83. #include <ExtDatePicker.h>
  84. #endif
  85. #endif 
  86. #if (!defined __EXT_MFC_NO_TOOLBOX_CTRL)
  87. #if (!defined __EXTTOOLBOXWND_H)
  88. #include <ExtToolBoxWnd.h>
  89. #endif
  90. #endif 
  91. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  92. #if (!defined __EXT_RIBBON_BAR_H)
  93. #include <ExtRibbonBar.h>
  94. #endif // (!defined __EXT_RIBBON_BAR_H)
  95. #endif
  96. #if (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  97. #if (!defined __EXT_POPUP_CTRL_MENU_H)
  98. #include <ExtPopupCtrlMenu.h>
  99. #endif
  100. #endif
  101. #if (!defined __EXT_MFC_NO_GRIDWND)
  102. #if (!defined __EXT_GRIDWND_H)
  103. #include <ExtGridWnd.h>
  104. #endif 
  105. #endif
  106. #if (!defined __EXT_TEMPL_H)
  107. #include <ExtTempl.h>
  108. #endif
  109. #if (!defined __EXT_SPIN_H)
  110. #include <ExtSpinWnd.h>
  111. #endif
  112. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  113. #if (!defined __EXTCUSTOMIZE_H)
  114. #include <ExtCustomize.h>
  115. #endif
  116. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  117. #if (!defined __EXT_MFC_NO_DURATIONWND)
  118. #if (!defined __EXT_DURATIONWND_H)
  119. #include "ExtDurationWnd.h"
  120. #endif
  121. #endif
  122. #if (!defined __EXT_MFC_NO_PAGECONTAINER_CTRL)
  123. #if (!defined __EXT_PAGECONTAINERWND_H)
  124. #include <ExtPageContainerWnd.h>
  125. #endif
  126. #endif
  127. #if (!defined __EXT_RESIZABLE_DIALOG_H)
  128. #include <ExtResizableDialog.h>
  129. #endif
  130. #if (!defined __EXT_EDIT_H)
  131. #include <ExtEdit.h>
  132. #endif
  133. #if (!defined __EXT_COMBO_BOX_H)
  134. #include <ExtComboBox.h>
  135. #endif
  136. #if (! defined __VSSYM32_H__)
  137. #include <vssym32/vssym32.h>
  138. #endif // (! defined __VSSYM32_H__)
  139. #include <math.h>
  140. #include <shlwapi.h>
  141. #include <Resources/Resource.h>
  142. #if (! defined CLEARTYPE_QUALITY )
  143. #define CLEARTYPE_QUALITY 5
  144. #endif
  145. #ifdef _DEBUG
  146. #define new DEBUG_NEW
  147. #undef THIS_FILE
  148. static char THIS_FILE[] = __FILE__;
  149. #endif
  150. // VC+ 6.0 static builds specific: disable warnings 4305, 4309
  151. // warning C4305: 'initializing' : truncation from 'int' to 'short'
  152. // warning C4309: 'initializing' : truncation of constant value
  153. #if _MFC_VER < 0x700
  154. #ifdef __EXT_PROFUIS_STATIC_LINK
  155. #pragma warning( push )
  156. #pragma warning ( disable : 4305 )
  157. #pragma warning ( disable : 4309 )
  158. #endif
  159. #endif
  160. // win9x balloon-rect region fix constants
  161. #define __WIN9X_FIXED_BAR_ROUNDED_AREA_SHIFT_X 2
  162. #define __WIN9X_FIXED_BAR_ROUNDED_AREA_SHIFT_Y 2
  163. #define __WIN9X_FIXED_BAR_ROUNDED_AREA_ADJUST_X 3
  164. #define __WIN9X_FIXED_BAR_ROUNDED_AREA_ADJUST_Y 3
  165. //#define __TRACE_PAINT_SESSIONS
  166. CExtPaintManager::CExtPaintManager()
  167. : m_bUseTahomaFont( g_PaintManager.m_bIsWin2000orLater )
  168. , m_eStyle2005( CExtPaintManager::__ES2005_RC )
  169. , m_bCustomBackgroundInheritanceEnabled( false )
  170. , m_clrForceSplitterBk( COLORREF(-1L) )
  171. , m_bScrollBarsHaveHoverEffectIn2kStyle( false )
  172. #if (!defined __EXT_MFC_NO_PAGECONTAINER_CTRL)
  173. , m_bPageContainerUseButtonStyle( false )
  174. , m_bPageContainerUseGroupBoxStyle( false )
  175. , m_bPageContainerNoEmbossDisabledText( false )
  176. #endif // (!defined __EXT_MFC_NO_PAGECONTAINER_CTRL)
  177. #if (!defined __EXT_MFC_NO_SHORTCUTLIST_CTRL)
  178. , m_bShortcutListUseButtonStyleInScrollButtons( false )
  179. , m_bShortcutListUseDockerBkgnd( false )
  180. , m_bShortcutListItemUseButtonStyle( false )
  181. , m_clrShortcutListItemAlternativeText( COLORREF(-1L) )
  182. #endif // (!defined __EXT_MFC_NO_SHORTCUTLIST_CTRL)
  183. {
  184. ASSERT( this != NULL );
  185. m_DSS_DISABLED_style = DSS_DISABLED;
  186. #define __3D_COLOR_DEPTH_R 7
  187. #define __3D_COLOR_DEPTH_G 6
  188. #define __3D_COLOR_DEPTH_B 6
  189. struct
  190. {
  191.     LOGPALETTE    LogPalette;
  192.     PALETTEENTRY  PalEntry[ (__3D_COLOR_DEPTH_R*__3D_COLOR_DEPTH_G*__3D_COLOR_DEPTH_B) ];
  193. } pal;
  194. LOGPALETTE * pLogPalette = (LOGPALETTE*) &pal;
  195. pLogPalette->palVersion    = 0x300;
  196. pLogPalette->palNumEntries = (WORD)(__3D_COLOR_DEPTH_R*__3D_COLOR_DEPTH_G*__3D_COLOR_DEPTH_B); 
  197. int i = 0;
  198.     for( int nX = 0; nX < __3D_COLOR_DEPTH_R; nX++ )
  199.     {
  200. for( int nY = 0; nY < __3D_COLOR_DEPTH_G; nY++ )
  201. {
  202. for( int nZ = 0; nZ < __3D_COLOR_DEPTH_B; nZ++ )
  203. {
  204. pLogPalette->palPalEntry[i].peRed   =
  205. BYTE( (nX*255)/(__3D_COLOR_DEPTH_R-1) );
  206. pLogPalette->palPalEntry[i].peGreen =
  207. BYTE( (nY*255)/(__3D_COLOR_DEPTH_G-1) );
  208. pLogPalette->palPalEntry[i].peBlue  =
  209. BYTE( (nZ*255)/(__3D_COLOR_DEPTH_B-1) );
  210. pLogPalette->palPalEntry[i].peFlags = 0;
  211. i++;
  212. }
  213. }
  214.     }
  215.     VERIFY( m_PaletteWide.CreatePalette(pLogPalette) );
  216. VERIFY( m_bmpFilterApplied.LoadBMP_Resource( MAKEINTRESOURCE( IDB_EXT_BITMAP_FILTER_APPLIED ) ) );
  217. VERIFY( m_bmpFilterApplied.Make32() );
  218. m_bmpFilterApplied.AlphaColor( RGB(255,0,255), RGB(0,0,0), BYTE(0) );
  219. VERIFY( m_bmpFilterUnApplied.LoadBMP_Resource( MAKEINTRESOURCE( IDB_EXT_BITMAP_FILTER_UNAPPLIED ) ) );
  220. VERIFY( m_bmpFilterUnApplied.Make32() );
  221. m_bmpFilterUnApplied.AlphaColor( RGB(255,0,255), RGB(0,0,0), BYTE(0) );
  222. }
  223. CExtPaintManager::~CExtPaintManager()
  224. {
  225. ASSERT( this != NULL );
  226. m_colors.RemoveAll();
  227. m_brushes.RemoveAll();
  228. }
  229. void CExtPaintManager::SerializeSynchronizationData( CArchive & ar )
  230. {
  231. ASSERT_VALID( this );
  232. ar;
  233. }
  234. bool CExtPaintManager::UiScalingIsEnabled(
  235. CExtPaintManager::e_ui_scaling_type_t eUIST
  236. ) const
  237. {
  238. ASSERT_VALID( this );
  239. ASSERT( __EUIST_MIN_VALUE <= eUIST && eUIST <= __EUIST_MAX_VALUE );
  240. bool bEnaled = false;
  241. switch( eUIST )
  242. {
  243. case __EUIST_X:
  244. bEnaled = g_PaintManager.m_bEnableUiScalingX;
  245. break;
  246. case __EUIST_Y:
  247. bEnaled = g_PaintManager.m_bEnableUiScalingY;
  248. break;
  249. case __EUIST_Z:
  250. bEnaled = g_PaintManager.m_bEnableUiScalingZ;
  251. break;
  252. #ifdef _DEBUG
  253. default:
  254. ASSERT( FALSE );
  255. break;
  256. #endif // _DEBUG
  257. } // switch( eUIST )
  258. return bEnaled;
  259. }
  260. INT CExtPaintManager::UiScalingDo(
  261. INT nValue,
  262. CExtPaintManager::e_ui_scaling_type_t eUIST
  263. ) const
  264. {
  265. ASSERT_VALID( this );
  266. ASSERT( __EUIST_MIN_VALUE <= eUIST && eUIST <= __EUIST_MAX_VALUE );
  267. INT nNewValue = nValue;
  268. if( UiScalingIsEnabled( eUIST ) )
  269. {
  270. switch( eUIST )
  271. {
  272. case __EUIST_X:
  273. nNewValue = ::MulDiv( nNewValue, g_PaintManager.m_nLPX, 96 );
  274. break;
  275. case __EUIST_Y:
  276. nNewValue = ::MulDiv( nNewValue, g_PaintManager.m_nLPY, 96 );
  277. break;
  278. case __EUIST_Z:
  279. nNewValue = ::MulDiv( nNewValue, g_PaintManager.m_nLPZ, 96 );
  280. break;
  281. #ifdef _DEBUG
  282. default:
  283. ASSERT( FALSE );
  284. break;
  285. #endif // _DEBUG
  286. } // switch( eUIST )
  287. } // if( UiScalingIsEnabled( eUIST ) )
  288. return nNewValue;
  289. }
  290. CExtPaintManagerXP::CExtPaintManagerXP()
  291. : m_bEnabledHoverIconShadows( true )
  292. , m_bHelperXpStyle8BitBarRect( true )
  293. , m_bExpBtnSwapVGlyphs( false )
  294. , m_pGlyphTbEpBtnH0( &g_glyph_btn_expand_bottom )
  295. , m_pGlyphTbEpBtnH1( &g_glyph_btn_expand_right2 )
  296. , m_pGlyphTbEpBtnV0( &g_glyph_btn_expand_left )
  297. , m_pGlyphTbEpBtnV1( &g_glyph_btn_expand_bottom2 )
  298. , m_nIdxClrMlaNormLeft( -1 )
  299. , m_nIdxClrMlaNormMiddle( -1 )
  300. , m_nIdxClrMlaNormRight( -1 )
  301. , m_nIdxClrMlaRarelyLeft( -1 )
  302. , m_nIdxClrMlaRarelyMiddle( -1 )
  303. , m_nIdxClrMlaRarelyRight( -1 )
  304. , m_nIdxClrBtnHoverLeft( -1 )
  305. , m_nIdxClrBtnHoverRight( -1 )
  306. , m_nIdxClrBtnPressedLeft( -1 )
  307. , m_nIdxClrBtnPressedRight( -1 )
  308. , m_nIdxClrBtnHovPresLeft( -1 )
  309. , m_nIdxClrBtnHovPresRight( -1 )
  310. , m_clrCustomDropDownGlyphEnabled( COLORREF(-1L) )
  311. , m_clrCustomDropDownGlyphDisabled( COLORREF(-1L) )
  312. {
  313. #if (!defined __EXT_MFC_NO_PAGECONTAINER_CTRL)
  314. m_bPageContainerNoEmbossDisabledText = true;
  315. #endif // (!defined __EXT_MFC_NO_PAGECONTAINER_CTRL)
  316. }
  317. CExtPaintManagerXP::~CExtPaintManagerXP()
  318. {
  319. }
  320. //////////////////////////////////////////////////////////////////////////
  321. // CExtPaintManagerOffice2003
  322. //////////////////////////////////////////////////////////////////////////
  323. CExtPaintManagerOffice2003::CExtPaintManagerOffice2003()
  324. : m_nIdxClrTbFillMargin( -1 )
  325. {
  326. m_bEnabledHoverIconShadows = false;
  327. m_bHelperXpStyle8BitBarRect = false;
  328. m_bExpBtnSwapVGlyphs = true;
  329. m_pGlyphTbEpBtnH0 = &g_glyph_btn_expand_bottom_2003;
  330. m_pGlyphTbEpBtnH1 = &g_glyph_btn_expand_right2_2003;
  331. m_pGlyphTbEpBtnV0 = &g_glyph_btn_expand_right_2003;
  332. m_pGlyphTbEpBtnV1 = &g_glyph_btn_expand_bottom2_2003;
  333. m_nIdxClrMlaNormLeft = _2003CLR_MLA_NORM_LEFT;
  334. m_nIdxClrMlaNormMiddle = _2003CLR_MLA_NORM_MIDDLE;
  335. m_nIdxClrMlaNormRight = _2003CLR_MLA_NORM_RIGHT;
  336. m_nIdxClrMlaRarelyLeft = _2003CLR_MLA_RARELY_LEFT;
  337. m_nIdxClrMlaRarelyMiddle = _2003CLR_MLA_RARELY_MIDDLE;
  338. m_nIdxClrMlaRarelyRight = _2003CLR_MLA_RARELY_RIGHT;
  339. #if (!defined __EXT_MFC_NO_PAGECONTAINER_CTRL)
  340. m_bPageContainerUseButtonStyle = true;
  341. m_bPageContainerUseGroupBoxStyle = true;
  342. m_bPageContainerNoEmbossDisabledText = true;
  343. #endif // (!defined __EXT_MFC_NO_PAGECONTAINER_CTRL)
  344. #if (!defined __EXT_MFC_NO_SHORTCUTLIST_CTRL)
  345. m_bShortcutListUseButtonStyleInScrollButtons = true;
  346. // m_bShortcutListUseDockerBkgnd = true;
  347. m_bShortcutListItemUseButtonStyle = true;
  348. #endif // (!defined __EXT_MFC_NO_SHORTCUTLIST_CTRL)
  349. }
  350. CExtPaintManagerOffice2003::~CExtPaintManagerOffice2003()
  351. {
  352. }
  353. bool CExtPaintManager::ScrollBar_GetMetrics(
  354. INT * p_nHorzBarHeight, // = NULL
  355. INT * p_nVertBarWidth, // = NULL
  356. INT * p_nHorzButtonWidth, // = NULL
  357. INT * p_nVertButtonHeight, // = NULL
  358. INT * p_nHorzThumbMinWidth, // = NULL
  359. INT * p_nVertThumbMinHeight, // = NULL
  360. CObject * pHelperSrc, // = NULL
  361. LPARAM lParam // = 0L
  362. ) const
  363. {
  364. ASSERT_VALID( this );
  365. p_nHorzBarHeight;
  366. p_nVertBarWidth;
  367. p_nHorzButtonWidth;
  368. p_nVertButtonHeight;
  369. p_nHorzThumbMinWidth;
  370. p_nVertThumbMinHeight;
  371. pHelperSrc;
  372. lParam;
  373. return false;
  374. }
  375. void CExtPaintManager::ScrollBar_Paint(
  376. CDC & dc,
  377. CExtPaintManager::PAINTSCROLLBARDATA & _psbd
  378. ) const
  379. {
  380. ASSERT_VALID( this );
  381. ASSERT( dc.GetSafeHdc() != NULL );
  382. _psbd.PaintDefault(
  383. dc,
  384. const_cast < CExtPaintManager * > ( this )
  385. );
  386. }
  387. CExtPaintManager::SCROLLBARSKINDATA * CExtPaintManager::ScrollBar_GetSkinData(
  388. bool bHorzBar,
  389. CObject * pHelperSrc,
  390. LPARAM lParam, // = 0L
  391. bool bLightAccent // = true
  392. )
  393. {
  394. ASSERT_VALID( this );
  395. bHorzBar;
  396. pHelperSrc;
  397. lParam;
  398. bLightAccent;
  399. return NULL;
  400. }
  401. #ifndef __EXT_MFC_NO_GRIDWND
  402. bool CExtPaintManager::Grid_PaintButton(
  403. CDC & dc,
  404. const RECT & rcButton,
  405. INT nButtonType,
  406. bool bPressed,
  407. bool bHovered,
  408. bool bFocused,
  409. bool bEnabled,
  410. COLORREF clrFace,
  411. COLORREF clrLight,
  412. COLORREF clrShadow,
  413. COLORREF clrWindow,
  414. COLORREF clrText,
  415. DWORD dwHelperPaintFlags,
  416. CObject * pHelperSrc,
  417. LPARAM lParam // = 0L
  418. )
  419. {
  420. ASSERT_VALID( this );
  421. ASSERT( dc.GetSafeHdc() != NULL );
  422. lParam;
  423. if( pHelperSrc == NULL )
  424. return false;
  425. ASSERT_VALID( pHelperSrc );
  426. CWnd * pWnd = DYNAMIC_DOWNCAST( CWnd, pHelperSrc );
  427. ASSERT( pWnd != NULL );
  428. bool bPaintPushButton = true;
  429. if( ( nButtonType == INT(CExtGridCell::__EBTT_FILTER_APPLIED)
  430. || nButtonType == INT(CExtGridCell::__EBTT_FILTER_UNAPPLIED)
  431. )
  432. && ( (! bEnabled )
  433. || (! ( bFocused || bHovered || bPressed ) )
  434. )
  435. )
  436. bPaintPushButton = false;
  437. CRect rc( rcButton );
  438. if( bPaintPushButton )
  439. dc.FillSolidRect( &rc, clrWindow );
  440. bool bDefaultDrawing = true;
  441. CExtPaintManager::glyph_t * pGlyph = NULL;
  442. CExtBitmap * pBitmap = NULL;
  443. if( g_PaintManager.m_UxTheme.IsControlsThemed() )
  444. {
  445. INT nPartID = -1;
  446. INT nState = 0;
  447. __EXT_UX_LPCWSTR pszClassList = NULL;
  448. switch( nButtonType ) 
  449. {
  450. case INT(CExtGridCell::__EBTT_DROPDOWN):
  451. pszClassList = VSCLASS_COMBOBOX;
  452. nPartID = CP_DROPDOWNBUTTON;
  453. nState = 
  454. (!bEnabled)
  455. ? CBXS_DISABLED
  456. : bPressed
  457. ? CBXS_PRESSED
  458. : bHovered
  459. ? CBXS_HOT
  460. : CBXS_NORMAL;
  461. break;
  462. case INT(CExtGridCell::__EBTT_ELLIPSIS):
  463. pszClassList = VSCLASS_BUTTON;
  464. nPartID = BP_PUSHBUTTON;
  465. nState = 
  466. (!bEnabled)
  467. ? PBS_DISABLED
  468. : bPressed
  469. ? PBS_PRESSED
  470. : bHovered
  471. ? PBS_HOT
  472. : ( bFocused )
  473. ? PBS_DEFAULTED
  474. : PBS_NORMAL;
  475. if( (dwHelperPaintFlags&__EGCPF_NO_BUTTON_ELLIPSIS_DOTS) == 0 )
  476. pGlyph = 
  477. CExtPaintManager::g_DockingCaptionGlyphs[
  478. (INT) CExtPaintManager::__DCBT_ELLIPSIS
  479. ];
  480. break;
  481. case INT(CExtGridCell::__EBTT_UPDOWN_UP):
  482. pszClassList = VSCLASS_SPIN;
  483. nPartID = SPNP_UP;
  484. nState = 
  485. (!bEnabled) 
  486. ? UPS_DISABLED 
  487. : bPressed 
  488. ? UPS_PRESSED 
  489. : bHovered
  490. ? UPS_HOT
  491. : UPS_NORMAL;
  492. break;
  493. case INT(CExtGridCell::__EBTT_UPDOWN_DOWN):
  494. pszClassList = VSCLASS_SPIN;
  495. nPartID = SPNP_DOWN;
  496. nState = 
  497. (!bEnabled) 
  498. ? DNS_DISABLED 
  499. : bPressed 
  500. ? DNS_PRESSED 
  501. : bHovered
  502. ? DNS_HOT
  503. : DNS_NORMAL;
  504. break;
  505. case INT(CExtGridCell::__EBTT_FILTER_APPLIED):
  506. pBitmap = &m_bmpFilterApplied;
  507. break;
  508. case INT(CExtGridCell::__EBTT_FILTER_UNAPPLIED):
  509. pBitmap = &m_bmpFilterUnApplied;
  510. break;
  511. } // switch( nButtonType ) 
  512. if( bPaintPushButton
  513. && nPartID != -1
  514. && pszClassList != NULL
  515. && g_PaintManager.m_UxTheme.OpenThemeData( pWnd->GetSafeHwnd(), pszClassList ) != NULL 
  516. {
  517. if( g_PaintManager.m_UxTheme.DrawThemeBackground(
  518. dc.GetSafeHdc(), 
  519. nPartID, 
  520. nState, 
  521. &rc, 
  522. &rcButton
  523. ) == S_OK
  524. )
  525. bDefaultDrawing = false;
  526. g_PaintManager.m_UxTheme.CloseThemeData( true );
  527. }
  528. }
  529. if( bDefaultDrawing )
  530. {
  531. COLORREF clrOuterLT =
  532. bPressed ? clrShadow : clrLight;
  533. COLORREF clrOuterRB =
  534. bPressed ? clrLight : clrShadow;
  535. if( bPaintPushButton )
  536. dc.FillSolidRect( &rc, clrFace );
  537. rc.DeflateRect( 2, 2 );
  538. if( bPaintPushButton )
  539. dc.Draw3dRect( 
  540. &rcButton, 
  541. clrOuterLT, 
  542. clrOuterRB
  543. );
  544. if( bPressed )
  545. rc.OffsetRect( 0, 1 );
  546. if( nButtonType == INT(CExtGridCell::__EBTT_DROPDOWN) )
  547. {
  548. if( (dwHelperPaintFlags&__EGCPF_NO_BUTTON_DROPDOWN_ARROW) == 0 )
  549. pGlyph = 
  550. CExtPaintManager::g_DockingCaptionGlyphs[
  551. (INT) CExtPaintManager::__DCBT_ARROW_DOWN
  552. ];
  553. }
  554. else if( nButtonType == INT(CExtGridCell::__EBTT_ELLIPSIS) )
  555. {
  556. if( (dwHelperPaintFlags&__EGCPF_NO_BUTTON_ELLIPSIS_DOTS) == 0 )
  557. pGlyph = 
  558. CExtPaintManager::g_DockingCaptionGlyphs[
  559. (INT) CExtPaintManager::__DCBT_ELLIPSIS
  560. ];
  561. }
  562. else if( nButtonType == INT(CExtGridCell::__EBTT_UPDOWN_UP) )
  563. {
  564. pGlyph = 
  565. CExtPaintManager::g_DockingCaptionGlyphs[
  566. (INT) CExtPaintManager::__DCBT_ARROW_SMALL_UP
  567. ];
  568. }
  569. else if( nButtonType == INT(CExtGridCell::__EBTT_UPDOWN_DOWN) )
  570. {
  571. pGlyph = 
  572. CExtPaintManager::g_DockingCaptionGlyphs[
  573. (INT) CExtPaintManager::__DCBT_ARROW_SMALL_DOWN
  574. ];
  575. }
  576. else if( nButtonType == INT(CExtGridCell::__EBTT_FILTER_APPLIED) )
  577. {
  578. pBitmap = &m_bmpFilterApplied;
  579. }
  580. else if( nButtonType == INT(CExtGridCell::__EBTT_FILTER_UNAPPLIED) )
  581. {
  582. pBitmap = &m_bmpFilterUnApplied;
  583. }
  584. } // if( bDefaultDrawing )
  585. if( pGlyph != NULL )
  586. {
  587. COLORREF ColorValues[2] =
  588. {
  589. RGB(0,0,0),
  590. RGB(0,0,0),
  591. };
  592. ColorValues[1] = 
  593. bEnabled ? clrText : clrLight;
  594. if( ! bEnabled )
  595. rc.OffsetRect( 1, 1 );
  596. PaintGlyphCentered(
  597. dc,
  598. rc,
  599. *pGlyph,
  600. ColorValues
  601. );
  602. if( ! bEnabled )
  603. {
  604. rc.OffsetRect( -1, -1 );
  605. ColorValues[1] = clrShadow;
  606. PaintGlyphCentered(
  607. dc,
  608. rc,
  609. *pGlyph,
  610. ColorValues
  611. );
  612. } // if( ! bEnabled )
  613. } // if( pGlyph != NULL )
  614. if( pBitmap != NULL
  615. && (! pBitmap->IsEmpty() )
  616. )
  617. {
  618. CRect rcDst( rc.TopLeft(), pBitmap->GetSize() );
  619. rcDst.OffsetRect(
  620. ( rc.Width() - rcDst.Width() ) / 2,
  621. ( rc.Height() - rcDst.Height() ) / 2
  622. );
  623. pBitmap->AlphaBlend( dc.m_hDC, rcDst );
  624. } // if( pBitmap != NULL ...
  625. if( bFocused 
  626. && nButtonType == INT(CExtGridCell::__EBTT_ELLIPSIS)
  627. )
  628. {
  629. CRect rcFocusRect( rcButton );
  630. if( bPressed )
  631. {
  632. CSize sizePushedOffset = GetPushedOffset();
  633. rcFocusRect.OffsetRect( -sizePushedOffset );
  634. }
  635. rcFocusRect.DeflateRect( 3, 3 );
  636. dc.DrawFocusRect( &rcFocusRect );
  637. }
  638. return true;
  639. }
  640. bool CExtPaintManagerOffice2007_Impl::Grid_PaintButton(
  641. CDC & dc,
  642. const RECT & rcButton,
  643. INT nButtonType,
  644. bool bPressed,
  645. bool bHovered,
  646. bool bFocused,
  647. bool bEnabled,
  648. COLORREF clrFace,
  649. COLORREF clrLight,
  650. COLORREF clrShadow,
  651. COLORREF clrWindow,
  652. COLORREF clrText,
  653. DWORD dwHelperPaintFlags,
  654. CObject * pHelperSrc,
  655. LPARAM lParam // = 0L
  656. )
  657. {
  658. ASSERT_VALID( this );
  659. ASSERT( dc.GetSafeHdc() != NULL );
  660. if( pHelperSrc == NULL )
  661. return false;
  662. ASSERT_VALID( pHelperSrc );
  663. if( IsHighContrast() )
  664. return 
  665. CExtPaintManagerXP::Grid_PaintButton(
  666. dc,
  667. rcButton,
  668. nButtonType,
  669. bPressed,
  670. bHovered,
  671. bFocused,
  672. bEnabled,
  673. clrFace,
  674. clrLight,
  675. clrShadow,
  676. clrWindow,
  677. clrText,
  678. dwHelperPaintFlags,
  679. pHelperSrc,
  680. lParam
  681. );
  682. CWnd * pWnd =
  683. DYNAMIC_DOWNCAST( CWnd, pHelperSrc );
  684. ASSERT( pWnd != NULL );
  685. CRect rc( rcButton );
  686. // dc.FillSolidRect( &rc, clrWindow );
  687. bool bPaintPushButton = true;
  688. if( ( nButtonType == INT(CExtGridCell::__EBTT_FILTER_APPLIED)
  689. || nButtonType == INT(CExtGridCell::__EBTT_FILTER_UNAPPLIED)
  690. )
  691. && ( (! bEnabled )
  692. || (! ( bFocused || bHovered || bPressed ) )
  693. )
  694. )
  695. bPaintPushButton = false;
  696. if( bPaintPushButton )
  697. {
  698. CExtPaintManager::PAINTPUSHBUTTONDATA _ppbd;
  699. _ppbd.m_pHelperSrc = pHelperSrc;
  700. _ppbd.m_rcClient = rc;
  701. _ppbd.m_bPushed = bPressed;
  702. _ppbd.m_bHover = bHovered;
  703. _ppbd.m_bDrawFocusRect = 
  704. (nButtonType == INT(CExtGridCell::__EBTT_ELLIPSIS)) ? bFocused : false;
  705. _ppbd.m_bEnabled = bEnabled;
  706. _ppbd.m_bTransparentBackground = true;
  707. PaintPushButton( dc, _ppbd );
  708. }
  709. CExtPaintManager::glyph_t * pGlyph = NULL;
  710. CExtBitmap * pBitmap = NULL;
  711. switch( nButtonType ) 
  712. {
  713. case INT(CExtGridCell::__EBTT_DROPDOWN):
  714. if( (dwHelperPaintFlags&__EGCPF_NO_BUTTON_DROPDOWN_ARROW) == 0 )
  715. pGlyph = 
  716. CExtPaintManager::g_DockingCaptionGlyphs[
  717. (INT) CExtPaintManager::__DCBT_ARROW_DOWN
  718. ];
  719. break;
  720. case INT(CExtGridCell::__EBTT_ELLIPSIS):
  721. if( (dwHelperPaintFlags&__EGCPF_NO_BUTTON_ELLIPSIS_DOTS) == 0 )
  722. pGlyph = 
  723. CExtPaintManager::g_DockingCaptionGlyphs[
  724. (INT) CExtPaintManager::__DCBT_ELLIPSIS
  725. ];
  726. break;
  727. case INT(CExtGridCell::__EBTT_UPDOWN_UP):
  728. pGlyph = 
  729. CExtPaintManager::g_DockingCaptionGlyphs[
  730. (INT) CExtPaintManager::__DCBT_ARROW_SMALL_UP
  731. ];
  732. break;
  733. case INT(CExtGridCell::__EBTT_UPDOWN_DOWN):
  734. pGlyph = 
  735. CExtPaintManager::g_DockingCaptionGlyphs[
  736. (INT) CExtPaintManager::__DCBT_ARROW_SMALL_DOWN
  737. ];
  738. break;
  739. case INT(CExtGridCell::__EBTT_FILTER_APPLIED):
  740. pBitmap = &m_bmpFilterApplied;
  741. break;
  742. case INT(CExtGridCell::__EBTT_FILTER_UNAPPLIED):
  743. pBitmap = &m_bmpFilterUnApplied;
  744. break;
  745. } // switch( nButtonType ) 
  746. if( pGlyph != NULL )
  747. {
  748. COLORREF ColorValues[2] =
  749. {
  750. RGB(0,0,0),
  751. RGB(0,0,0),
  752. };
  753. ColorValues[1] = 
  754. bEnabled ? clrText : clrLight;
  755. if( ! bEnabled )
  756. rc.OffsetRect( 1, 1 );
  757. PaintGlyphCentered(
  758. dc,
  759. rc,
  760. *pGlyph,
  761. ColorValues
  762. );
  763. if( ! bEnabled )
  764. {
  765. rc.OffsetRect( -1, -1 );
  766. ColorValues[1] = clrShadow;
  767. PaintGlyphCentered(
  768. dc,
  769. rc,
  770. *pGlyph,
  771. ColorValues
  772. );
  773. } // if( ! bEnabled )
  774. } // if( pGlyph != NULL )
  775. if( pBitmap != NULL
  776. && (! pBitmap->IsEmpty() )
  777. )
  778. {
  779. CRect rcDst( rc.TopLeft(), pBitmap->GetSize() );
  780. rcDst.OffsetRect(
  781. ( rc.Width() - rcDst.Width() ) / 2,
  782. ( rc.Height() - rcDst.Height() ) / 2
  783. );
  784. pBitmap->AlphaBlend( dc.m_hDC, rcDst );
  785. } // if( pBitmap != NULL ...
  786. return true;
  787. }
  788. bool CExtPaintManager::Grid_PaintHeaderSortArrow(
  789. CDC & dc,
  790. const RECT & rcSortArrow,
  791. bool bHorz,
  792. bool bAscending,
  793. COLORREF * pColorValues,
  794. CObject * pHelperSrc,
  795. LPARAM lParam // = 0L
  796. )
  797. {
  798. ASSERT_VALID( this );
  799. ASSERT( dc.GetSafeHdc() != NULL );
  800. pHelperSrc;
  801. lParam;
  802. if( pColorValues == NULL )
  803. {
  804. ASSERT( FALSE );
  805. return false;
  806. }
  807. PaintGlyphCentered(
  808. dc,
  809. rcSortArrow,
  810. *( g_DockingCaptionGlyphs[
  811. bHorz
  812. ? ( bAscending
  813. ? __DCBT_ARROW_SORT_LEFT
  814. : __DCBT_ARROW_SORT_RIGHT )
  815. : ( bAscending
  816. ? __DCBT_ARROW_SORT_UP
  817. : __DCBT_ARROW_SORT_DOWN )
  818. ] ),
  819. pColorValues
  820. );
  821. return true;
  822. }
  823. bool CExtPaintManagerNativeXP::Grid_PaintHeaderSortArrow(
  824. CDC & dc,
  825. const RECT & rcSortArrow,
  826. bool bHorz,
  827. bool bAscending,
  828. COLORREF * pColorValues,
  829. CObject * pHelperSrc,
  830. LPARAM lParam // = 0L
  831. )
  832. {
  833. ASSERT_VALID( this );
  834. ASSERT( dc.GetSafeHdc() != NULL );
  835. pColorValues;
  836. pHelperSrc;
  837. lParam;
  838. COLORREF ColorValues[2] =
  839. {
  840. RGB(0,0,0),
  841. ::GetSysColor(COLOR_3DSHADOW),
  842. };
  843. PaintGlyphCentered(
  844. dc,
  845. rcSortArrow,
  846. *( g_DockingCaptionGlyphs[
  847. bHorz
  848. ? ( bAscending
  849. ? __DCBT_2007_ARROW_SORT_LEFT
  850. : __DCBT_2007_ARROW_SORT_RIGHT )
  851. : ( bAscending
  852. ? __DCBT_2007_ARROW_SORT_UP
  853. : __DCBT_2007_ARROW_SORT_DOWN )
  854. ] ),
  855. ColorValues
  856. );
  857. return true;
  858. }
  859. bool CExtPaintManagerOffice2007_Impl::Grid_PaintHeaderSortArrow(
  860. CDC & dc,
  861. const RECT & rcSortArrow,
  862. bool bHorz,
  863. bool bAscending,
  864. COLORREF * pColorValues,
  865. CObject * pHelperSrc,
  866. LPARAM lParam // = 0L
  867. )
  868. {
  869. ASSERT_VALID( this );
  870. ASSERT( dc.GetSafeHdc() != NULL );
  871. if( IsHighContrast() )
  872. return 
  873. CExtPaintManagerXP::Grid_PaintHeaderSortArrow(
  874. dc,
  875. rcSortArrow,
  876. bHorz,
  877. bAscending,
  878. pColorValues,
  879. pHelperSrc,
  880. lParam
  881. );
  882. COLORREF ColorValues[2] =
  883. {
  884. RGB(0,0,0),
  885. m_clrGridHeaderSortArrow,
  886. };
  887. PaintGlyphCentered(
  888. dc,
  889. rcSortArrow,
  890. *( g_DockingCaptionGlyphs[
  891. bHorz
  892. ? ( bAscending
  893. ? __DCBT_2007_ARROW_SORT_LEFT
  894. : __DCBT_2007_ARROW_SORT_RIGHT )
  895. : ( bAscending
  896. ? __DCBT_2007_ARROW_SORT_UP
  897. : __DCBT_2007_ARROW_SORT_DOWN )
  898. ] ),
  899. ColorValues
  900. );
  901. return true;
  902. }
  903. COLORREF CExtPaintManager::Grid_OnQueryTextColor(
  904. const CExtGridCell & _cell,
  905. CDC & dc,
  906. LONG nVisibleColNo,
  907. LONG nVisibleRowNo,
  908. LONG nColNo,
  909. LONG nRowNo,
  910. INT nColType,
  911. INT nRowType,
  912. DWORD dwAreaFlags,
  913. DWORD dwHelperPaintFlags
  914. )
  915. {
  916. ASSERT_VALID( this );
  917. ASSERT_VALID( (&_cell) );
  918. // if( (dwHelperPaintFlags&__EGCPF_PRINTING_TARGET_MASK) != 0 )
  919. // return COLORREF(-1L);
  920. _cell;
  921. dc;
  922. nVisibleColNo;
  923. nVisibleRowNo;
  924. nColNo;
  925. nRowNo;
  926. nColType;
  927. nRowType;
  928. dwAreaFlags;
  929. dwHelperPaintFlags;
  930. // used default cell' text color computed
  931. // by the CExtGridCell::OnQueryTextColor() virtual method
  932. return COLORREF(-1L);
  933. }
  934. bool CExtPaintManager::Grid_PaintHeaderBackground(
  935. CDC & dc,
  936. const RECT & rcArea,
  937. LONG nColNo,
  938. LONG nRowNo,
  939. INT nColType,
  940. INT nRowType,
  941. DWORD dwAreaFlags,
  942. DWORD dwHelperPaintFlags,
  943. CObject * pHelperSrc,
  944. LPARAM lParam // = 0L
  945. )
  946. {
  947. ASSERT_VALID( this );
  948. ASSERT( dc.GetSafeHdc() != NULL );
  949. dc;
  950. rcArea;
  951. nColNo;
  952. nRowNo;
  953. nColType;
  954. nRowType;
  955. dwAreaFlags;
  956. dwHelperPaintFlags;
  957. pHelperSrc;
  958. lParam;
  959. return false;
  960. }
  961. bool CExtPaintManagerNativeXP::Grid_PaintHeaderBackground(
  962. CDC & dc,
  963. const RECT & rcArea,
  964. LONG nColNo,
  965. LONG nRowNo,
  966. INT nColType,
  967. INT nRowType,
  968. DWORD dwAreaFlags,
  969. DWORD dwHelperPaintFlags,
  970. CObject * pHelperSrc,
  971. LPARAM lParam // = 0L
  972. )
  973. {
  974. ASSERT_VALID( this );
  975. ASSERT( dc.GetSafeHdc() != NULL );
  976. dc;
  977. rcArea;
  978. nColNo;
  979. nRowNo;
  980. nColType;
  981. nRowType;
  982. dwAreaFlags;
  983. dwHelperPaintFlags;
  984. pHelperSrc;
  985. lParam;
  986. return false;
  987. }
  988. bool CExtPaintManagerOffice2007_Impl::Grid_PaintHeaderBackground(
  989. CDC & dc,
  990. const RECT & rcArea,
  991. LONG nColNo,
  992. LONG nRowNo,
  993. INT nColType,
  994. INT nRowType,
  995. DWORD dwAreaFlags,
  996. DWORD dwHelperPaintFlags,
  997. CObject * pHelperSrc,
  998. LPARAM lParam // = 0L
  999. )
  1000. {
  1001. ASSERT_VALID( this );
  1002. ASSERT( dc.GetSafeHdc() != NULL );
  1003. if( IsHighContrast() )
  1004. return 
  1005. CExtPaintManagerXP::Grid_PaintHeaderBackground(
  1006. dc,
  1007. rcArea,
  1008. nColNo,
  1009. nRowNo,
  1010. nColType,
  1011. nRowType,
  1012. dwAreaFlags,
  1013. dwHelperPaintFlags,
  1014. pHelperSrc,
  1015. lParam
  1016. );
  1017. CExtGridWnd * pGridWnd = ( pHelperSrc != NULL ) ? ( DYNAMIC_DOWNCAST( CExtGridWnd, pHelperSrc ) ) : NULL;
  1018. if( pGridWnd == NULL )
  1019. return false;
  1020. bool bHoverByColumn = ( (dwHelperPaintFlags&__EGCPF_HOVER_BY_COLUMN) != 0 ) ? true : false;
  1021. bool bHoverByRow = ( (dwHelperPaintFlags&__EGCPF_HOVER_BY_ROW) != 0 ) ? true : false;
  1022. bool bHighlightedBySelectedColumn = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_SELECTED_COLUMN) != 0 ) ? true : false;
  1023. bool bHighlightedBySelectedRow = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_SELECTED_ROW) != 0 ) ? true : false;
  1024. bool bHighlightedByFocusedColumn = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_FOCUSED_COLUMN) != 0 ) ? true : false;
  1025. bool bHighlightedByFocusedRow = ( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_FOCUSED_ROW) != 0 ) ? true : false;
  1026. // bool bFocusedControl = ( (dwHelperPaintFlags&__EGCPF_FOCUSED_CONTROL) != 0 ) ? true : false;
  1027. bool bHighlightPressing = ( (dwHelperPaintFlags&(__EGCPF_HIGHLIGHTED_BY_PRESSED_COLUMN|__EGCPF_HIGHLIGHTED_BY_PRESSED_ROW)) != 0 ) ? true : false;
  1028. COLORREF clrBack = COLORREF( -1L );
  1029. if( nColNo >= 0L && nRowNo >= 0L ) 
  1030. clrBack = 
  1031. pGridWnd->OnGbwQueryBackColor(
  1032. dc,
  1033. 0L,
  1034. 0L,
  1035. nColNo,
  1036. nRowNo,
  1037. nColType,
  1038. nRowType,
  1039. dwAreaFlags,
  1040. dwHelperPaintFlags
  1041. );
  1042. if( clrBack != COLORREF( -1L ) 
  1043. && (! bHighlightPressing )
  1044. )
  1045. dc.FillSolidRect(
  1046. &rcArea,
  1047. clrBack
  1048. );
  1049. else
  1050. stat_PaintGradientRect(
  1051. dc,
  1052. rcArea,
  1053. m_clrGridHeaderBkBottom,
  1054. m_clrGridHeaderBkTop,
  1055. true
  1056. );
  1057. if( clrBack != COLORREF( -1L ) )
  1058. {
  1059. dc.FillSolidRect(
  1060. &rcArea,
  1061. clrBack
  1062. );
  1063. }
  1064. else if( bHighlightPressing )
  1065. {
  1066. CRect rcHighlightPressing( rcArea );
  1067. if( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_PRESSED_COLUMN) != 0 )
  1068. rcHighlightPressing.DeflateRect( 0, 0, 1, 0 );
  1069. if( (dwHelperPaintFlags&__EGCPF_HIGHLIGHTED_BY_PRESSED_ROW) != 0 )
  1070. rcHighlightPressing.DeflateRect( 0, 0, 0, 1 );
  1071. dc.FillSolidRect(
  1072. &rcHighlightPressing, // &rcArea
  1073. pGridWnd->OnSiwGetSysColor( COLOR_3DDKSHADOW )
  1074. );
  1075. } // if( bHighlightPressing )
  1076. else if( bHighlightedByFocusedColumn || bHighlightedByFocusedRow )
  1077. {
  1078. dc.FillRect(
  1079. &rcArea,
  1080. &( pGridWnd->OnSiwGetLighterOrDarkerBrush( -3 ) )
  1081. );
  1082. }
  1083. else if( bHighlightedBySelectedColumn || bHighlightedBySelectedRow )
  1084. {
  1085. dc.FillRect(
  1086. &rcArea,
  1087. &( pGridWnd->OnSiwGetLighterOrDarkerBrush( -2 ) )
  1088. );
  1089. }
  1090. else if( bHoverByColumn || bHoverByRow )
  1091. {
  1092. if( nColType == 0 || nRowType == 0 )
  1093. dc.FillRect(
  1094. &rcArea,
  1095. &( pGridWnd->OnSiwGetLighterOrDarkerBrush( -1 ) )
  1096. );
  1097. }
  1098. bool bLineTop = false;
  1099. bool bLineLeft = false;
  1100. bool bLineRight = false;
  1101. bool bLineBottom = false;
  1102. bool bDrawBorder = false;
  1103. bool bDrawSeparator = false;
  1104. if( (dwHelperPaintFlags&__EGCPF_OUTER_DND) != 0 )
  1105. {
  1106. bDrawBorder = true;
  1107. }
  1108. else if( nColNo >= 0L && nRowNo >= 0L )
  1109. {
  1110. LONG nOuterColumnCountLeft = 0L;
  1111. LONG nOuterColumnCountRight = 0L;
  1112. if( pGridWnd != NULL )
  1113. {
  1114. nOuterColumnCountLeft = pGridWnd->OuterColumnCountLeftGet();
  1115. nOuterColumnCountRight = pGridWnd->OuterColumnCountRightGet();
  1116. }
  1117. if( dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_TOP)
  1118. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_TOP|__EGBWA_FROZEN_AREA_LEFT)
  1119. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_TOP|__EGBWA_FROZEN_AREA_RIGHT)
  1120. )
  1121. {
  1122. if( nRowNo == 0L )
  1123. bLineTop = true;
  1124. bLineBottom = true;
  1125. // LONG nColumnCount = pGridWnd->ColumnCountGet();
  1126. // if( nColumnCount < 0L || nColNo != ( nColumnCount - 1L ) )
  1127. bDrawSeparator = true;
  1128. }
  1129. else if( dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_LEFT)
  1130. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_LEFT|__EGBWA_FROZEN_AREA_TOP)
  1131. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_LEFT|__EGBWA_FROZEN_AREA_BOTTOM)
  1132. )
  1133. {
  1134. if( nColNo == 0L )
  1135. bLineLeft = true;
  1136. if( nColNo == nOuterColumnCountLeft - 1L )
  1137. bLineRight = true;
  1138. else
  1139. bDrawSeparator = true;
  1140. bLineBottom = true;
  1141. }
  1142. else if( dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_RIGHT)
  1143. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_RIGHT|__EGBWA_FROZEN_AREA_TOP)
  1144. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_RIGHT|__EGBWA_FROZEN_AREA_BOTTOM)
  1145. )
  1146. {
  1147. if( nColNo == 0L )
  1148. bLineLeft = true;
  1149. if( nColNo == nOuterColumnCountRight - 1L )
  1150. bLineRight = true;
  1151. else
  1152. bDrawSeparator = true;
  1153. bLineBottom = true;
  1154. }
  1155. else if( dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_BOTTOM)
  1156. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_BOTTOM|__EGBWA_FROZEN_AREA_LEFT)
  1157. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_BOTTOM|__EGBWA_FROZEN_AREA_RIGHT)
  1158. )
  1159. {
  1160. if( nRowNo == 0L )
  1161. bLineTop = true;
  1162. bLineBottom = true;
  1163. // LONG nColumnCount = pGridWnd->ColumnCountGet();
  1164. // if( nColumnCount < 0L || nColNo != ( nColumnCount - 1L ) )
  1165. bDrawSeparator = true;
  1166. }
  1167. else if(
  1168. dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_TOP|__EGBWA_OUTER_LEFT)
  1169. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_TOP|__EGBWA_OUTER_RIGHT)
  1170. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_BOTTOM|__EGBWA_OUTER_LEFT)
  1171. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_BOTTOM|__EGBWA_OUTER_RIGHT)
  1172. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_TOP|__EGBWA_FROZEN_AREA_LEFT)
  1173. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_TOP|__EGBWA_FROZEN_AREA_RIGHT)
  1174. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_BOTTOM|__EGBWA_FROZEN_AREA_LEFT)
  1175. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_BOTTOM|__EGBWA_FROZEN_AREA_RIGHT)
  1176. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_LEFT|__EGBWA_FROZEN_AREA_TOP)
  1177. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_LEFT|__EGBWA_FROZEN_AREA_BOTTOM)
  1178. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_RIGHT|__EGBWA_FROZEN_AREA_TOP)
  1179. || dwAreaFlags == (__EGBWA_OUTER_CELLS|__EGBWA_OUTER_RIGHT|__EGBWA_FROZEN_AREA_BOTTOM)
  1180. )
  1181. {
  1182. bLineLeft = bLineTop = bLineRight = bLineBottom = true;
  1183. }
  1184. }
  1185. else if( nColNo < 0L && nRowNo < 0L )
  1186. {
  1187. switch( dwAreaFlags )
  1188. {
  1189. case __EGBWA_OUTER_CELLS|__EGBWA_OUTER_TOP:
  1190. case __EGBWA_OUTER_CELLS|__EGBWA_OUTER_TOP|__EGBWA_FROZEN_AREA_LEFT:
  1191. case __EGBWA_OUTER_CELLS|__EGBWA_OUTER_TOP|__EGBWA_FROZEN_AREA_RIGHT:
  1192. bLineTop = true;
  1193. bLineBottom = true;
  1194. break;
  1195. case __EGBWA_OUTER_CELLS|__EGBWA_OUTER_BOTTOM:
  1196. case __EGBWA_OUTER_CELLS|__EGBWA_OUTER_BOTTOM|__EGBWA_FROZEN_AREA_LEFT:
  1197. case __EGBWA_OUTER_CELLS|__EGBWA_OUTER_BOTTOM|__EGBWA_FROZEN_AREA_RIGHT:
  1198. bLineTop = true;
  1199. bLineBottom = true;
  1200. break;
  1201. case __EGBWA_OUTER_CELLS|__EGBWA_OUTER_LEFT:
  1202. case __EGBWA_OUTER_CELLS|__EGBWA_OUTER_LEFT|__EGBWA_FROZEN_AREA_TOP:
  1203. case __EGBWA_OUTER_CELLS|__EGBWA_OUTER_LEFT|__EGBWA_FROZEN_AREA_BOTTOM:
  1204. bLineLeft = true;
  1205. bLineRight = true;
  1206. break;
  1207. case __EGBWA_OUTER_CELLS|__EGBWA_OUTER_RIGHT:
  1208. case __EGBWA_OUTER_CELLS|__EGBWA_OUTER_RIGHT|__EGBWA_FROZEN_AREA_TOP:
  1209. case __EGBWA_OUTER_CELLS|__EGBWA_OUTER_RIGHT|__EGBWA_FROZEN_AREA_BOTTOM:
  1210. bLineLeft = true;
  1211. bLineRight = true;
  1212. break;
  1213. case __EGBWA_OUTER_CELLS|__EGBWA_OUTER_LEFT|__EGBWA_OUTER_TOP:
  1214. case __EGBWA_OUTER_CELLS|__EGBWA_OUTER_LEFT|__EGBWA_OUTER_BOTTOM:
  1215. case __EGBWA_OUTER_CELLS|__EGBWA_OUTER_RIGHT|__EGBWA_OUTER_TOP:
  1216. case __EGBWA_OUTER_CELLS|__EGBWA_OUTER_RIGHT|__EGBWA_OUTER_BOTTOM:
  1217. bLineLeft = bLineTop = bLineRight = bLineBottom = true;
  1218. break;
  1219. } // switch( dwAreaFlags )
  1220. }
  1221. if( bDrawSeparator )
  1222. {
  1223. CRect rcSeparator(
  1224. rcArea.right - 1,
  1225. rcArea.top + 3,
  1226. rcArea.right,
  1227. rcArea.bottom - 3
  1228. );
  1229. if( (! rcSeparator.IsRectEmpty() )
  1230. && dc.RectVisible( &rcSeparator )
  1231. )
  1232. dc.FillSolidRect( &rcSeparator, m_clrGridHeaderSeparator );
  1233. }
  1234. if( bDrawBorder )
  1235. {
  1236. dc.Draw3dRect( 
  1237. &rcArea, 
  1238. m_clrGridHeaderBorder,
  1239. m_clrGridHeaderBorder
  1240. );
  1241. }
  1242. if( bLineLeft )
  1243. {
  1244. CRect rcLine(
  1245. rcArea.left,
  1246. rcArea.top,
  1247. rcArea.left + 1,
  1248. rcArea.bottom
  1249. );
  1250. if( (! rcLine.IsRectEmpty() )
  1251. && dc.RectVisible( &rcLine )
  1252. )
  1253. dc.FillSolidRect( &rcLine, m_clrGridHeaderBorder );
  1254. }
  1255. if( bLineTop )
  1256. {
  1257. CRect rcLine(
  1258. rcArea.left,
  1259. rcArea.top,
  1260. rcArea.right,
  1261. rcArea.top + 1
  1262. );
  1263. if( (! rcLine.IsRectEmpty() )
  1264. && dc.RectVisible( &rcLine )
  1265. )
  1266. dc.FillSolidRect( &rcLine, m_clrGridHeaderBorder );
  1267. }
  1268. if( bLineRight )
  1269. {
  1270. CRect rcLine(
  1271. rcArea.right - 1,
  1272. rcArea.top,
  1273. rcArea.right,
  1274. rcArea.bottom
  1275. );
  1276. if( (! rcLine.IsRectEmpty() )
  1277. && dc.RectVisible( &rcLine )
  1278. )
  1279. dc.FillSolidRect( &rcLine, m_clrGridHeaderBorder );
  1280. }
  1281. if( bLineBottom )
  1282. {
  1283. CRect rcLine(
  1284. rcArea.left,
  1285. rcArea.bottom - 1,
  1286. rcArea.right,
  1287. rcArea.bottom
  1288. );
  1289. if( (! rcLine.IsRectEmpty() )
  1290. && dc.RectVisible( &rcLine )
  1291. )
  1292. dc.FillSolidRect( &rcLine, m_clrGridHeaderBorder );
  1293. }
  1294. return true;
  1295. }
  1296. #endif // #ifndef __EXT_MFC_NO_GRIDWND
  1297. #if (!defined __EXT_MFC_NO_REPORTGRIDWND)
  1298. bool CExtPaintManager::ReportGrid_PaintHeaderRowBackground(
  1299. CDC & dc,
  1300. const RECT & rcArea,
  1301. CObject * pHelperSrc,
  1302. LPARAM lParam // = 0L
  1303. )
  1304. {
  1305. ASSERT_VALID( this );
  1306. ASSERT( dc.GetSafeHdc() != NULL );
  1307. dc;
  1308. rcArea;
  1309. pHelperSrc;
  1310. lParam;
  1311. return false;
  1312. }
  1313. bool CExtPaintManagerOffice2003::ReportGrid_PaintHeaderRowBackground(
  1314. CDC & dc,
  1315. const RECT & rcArea,
  1316. CObject * pHelperSrc,
  1317. LPARAM lParam // = 0L
  1318. )
  1319. {
  1320. ASSERT_VALID( this );
  1321. ASSERT( dc.GetSafeHdc() != NULL );
  1322. if( IsHighContrast() )
  1323. return 
  1324. CExtPaintManagerXP::ReportGrid_PaintHeaderRowBackground(
  1325. dc,
  1326. rcArea,
  1327. pHelperSrc,
  1328. lParam
  1329. );
  1330. if( ! CExtReportGridWnd::g_bmpHeaderAreaBk.IsEmpty() )
  1331. {
  1332. CExtReportGridWnd::g_bmpHeaderAreaBk.DrawSkinParts(
  1333. dc,
  1334. rcArea,
  1335. CExtReportGridWnd::g_rcHeaderAreaPadding,
  1336. CExtBitmap::__EDM_STRETCH
  1337. );
  1338. bool bDrawSeparator = false;
  1339. if( pHelperSrc != NULL )
  1340. {
  1341. if( pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtReportGridColumn)) )
  1342. {
  1343. CExtReportGridWnd * pRGW = ((CExtReportGridColumn*)pHelperSrc)->GetReportGrid();
  1344. ASSERT_VALID( pRGW );
  1345. if( !( pRGW->m_bHelperRenderingGroupArea
  1346. || pRGW->m_bHelperRenderingOuterDND
  1347. )
  1348. )
  1349. bDrawSeparator = true;
  1350. }
  1351. }
  1352. if( bDrawSeparator )
  1353. {
  1354. CRect rcSeparatorRight(
  1355. rcArea.right - 1,
  1356. rcArea.top + 2,
  1357. rcArea.right,
  1358. rcArea.bottom - 4
  1359. );
  1360. CRect rcSeparatorLeft(
  1361. rcArea.left,
  1362. rcArea.top + 2,
  1363. rcArea.left + 1,
  1364. rcArea.bottom - 4
  1365. );
  1366. dc.FillSolidRect(
  1367. &rcSeparatorLeft,
  1368. dc.GetNearestColor( RGB(255,255,255) )
  1369. );
  1370. dc.FillSolidRect(
  1371. &rcSeparatorRight,
  1372. dc.GetNearestColor( RGB(172,168,153) )
  1373. );
  1374. } // if( bDrawSeparator )
  1375. return true;
  1376. }
  1377. return
  1378. CExtPaintManagerXP::ReportGrid_PaintHeaderRowBackground(
  1379. dc,
  1380. rcArea,
  1381. pHelperSrc,
  1382. lParam
  1383. );
  1384. }
  1385. bool CExtPaintManagerNativeXP::ReportGrid_PaintHeaderRowBackground(
  1386. CDC & dc,
  1387. const RECT & rcArea,
  1388. CObject * pHelperSrc,
  1389. LPARAM lParam // = 0L
  1390. )
  1391. {
  1392. ASSERT_VALID( this );
  1393. ASSERT( dc.GetSafeHdc() != NULL );
  1394. bool bDefaultDrawing = true, bDrawCell = false;
  1395. if( pHelperSrc != NULL )
  1396. {
  1397. if( pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtReportGridColumn)) )
  1398. bDrawCell = true;
  1399. }
  1400. if( g_PaintManager.m_UxTheme.IsControlsThemed() )
  1401. {
  1402. HWND hWnd = NULL;
  1403. if( pHelperSrc != NULL )
  1404. {
  1405. if( pHelperSrc->IsKindOf( RUNTIME_CLASS(CWnd) ) )
  1406. hWnd = ((CWnd*)pHelperSrc)->GetSafeHwnd();
  1407. if( hWnd == NULL )
  1408. {
  1409. if( pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtReportGridColumn) ) )
  1410. hWnd = ((CExtReportGridColumn*)pHelperSrc)->GetReportGrid()->GetSafeHwnd();
  1411. if( hWnd == NULL )
  1412. hWnd = ::GetDesktopWindow();
  1413. } // if( hWnd == NULL )
  1414. } // if( pHelperSrc != NULL )
  1415. if( hWnd != NULL
  1416. && g_PaintManager.m_UxTheme.OpenThemeData( hWnd, VSCLASS_HEADER ) != NULL
  1417. )
  1418. {
  1419. if( g_PaintManager.m_UxTheme.DrawThemeBackground(
  1420. dc.GetSafeHdc(), 
  1421. HP_HEADERITEMRIGHT, 
  1422. HIRS_NORMAL, 
  1423. &rcArea, 
  1424. &rcArea
  1425. ) == S_OK
  1426. )
  1427. bDefaultDrawing = false;
  1428. g_PaintManager.m_UxTheme.CloseThemeData( true );
  1429. }
  1430. if( (! bDefaultDrawing ) && bDrawCell )
  1431. {
  1432. ASSERT( hWnd != NULL );
  1433. if( g_PaintManager.m_UxTheme.OpenThemeData( hWnd, VSCLASS_HEADER ) != NULL )
  1434. {
  1435. INT nStateID = HIS_NORMAL;
  1436. if( pHelperSrc != NULL
  1437. && pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtReportGridColumn) )
  1438. && ( (lParam&(__EGCPF_HOVER_BY_COLUMN|__EGCPF_OUTER_DND)) != 0
  1439. || ((CExtReportGridColumn*)pHelperSrc)->GetReportGrid()->m_bHelperRenderingOuterDND
  1440. )
  1441. )
  1442. nStateID = HIS_HOT;
  1443. if( g_PaintManager.m_UxTheme.DrawThemeBackground(
  1444. dc.GetSafeHdc(), 
  1445. HP_HEADERITEM, 
  1446. nStateID, 
  1447. &rcArea, 
  1448. &rcArea
  1449. ) == S_OK
  1450. )
  1451. bDefaultDrawing = false;
  1452. g_PaintManager.m_UxTheme.CloseThemeData( true );
  1453. }
  1454. } // if( (! bDefaultDrawing ) && bDrawCell )
  1455. } // if( g_PaintManager.m_UxTheme.IsControlsThemed() )
  1456. if( ! bDefaultDrawing )
  1457. return true;
  1458. return
  1459. CExtPaintManager::ReportGrid_PaintHeaderRowBackground(
  1460. dc,
  1461. rcArea,
  1462. pHelperSrc,
  1463. lParam
  1464. );
  1465. }
  1466. bool CExtPaintManagerOffice2007_Impl::ReportGrid_PaintHeaderRowBackground(
  1467. CDC & dc,
  1468. const RECT & rcArea,
  1469. CObject * pHelperSrc,
  1470. LPARAM lParam // = 0L
  1471. )
  1472. {
  1473. ASSERT_VALID( this );
  1474. ASSERT( dc.GetSafeHdc() != NULL );
  1475. if( IsHighContrast() )
  1476. return 
  1477. CExtPaintManagerXP::ReportGrid_PaintHeaderRowBackground(
  1478. dc,
  1479. rcArea,
  1480. pHelperSrc,
  1481. lParam
  1482. );
  1483. CRect rcAreaBk = rcArea;
  1484. rcAreaBk.DeflateRect( 1, 1 );
  1485. stat_PaintGradientRect(
  1486. dc,
  1487. rcAreaBk,
  1488. m_clrRgHeaderBkBottom,
  1489. m_clrRgHeaderBkTop,
  1490. true
  1491. );
  1492. // bool bDrawBorder = false, bDrawSeparator = false;
  1493. //  if( pHelperSrc != NULL )
  1494. //  {
  1495. //  if( pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtReportGridWnd)) )
  1496. //  bDrawBorder = true;
  1497. //  else if( pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtReportGridColumn)) )
  1498. //  {
  1499. //  CExtReportGridWnd * pRGW = ((CExtReportGridColumn*)pHelperSrc)->GetReportGrid();
  1500. //  ASSERT_VALID( pRGW );
  1501. //  if( pRGW->m_bHelperRenderingGroupArea
  1502. //  || pRGW->m_bHelperRenderingOuterDND
  1503. //  )
  1504. //  bDrawBorder = true;
  1505. //  else
  1506. //  bDrawSeparator = true;
  1507. //  }
  1508. //  }
  1509. //  if( bDrawBorder )
  1510. //  dc.Draw3dRect(
  1511. //  &rcArea,
  1512. //  m_clrRgHeaderBorder,
  1513. //  m_clrRgHeaderBorder
  1514. //  );
  1515. //  if( bDrawSeparator )
  1516. //  {
  1517. //  CRect rcSeparator(
  1518. //  rcArea.right - 1,
  1519. //  rcArea.top + 3,
  1520. //  rcArea.right,
  1521. //  rcArea.bottom - 3
  1522. //  );
  1523. //  if( (! rcSeparator.IsRectEmpty() )
  1524. //  && dc.RectVisible( &rcSeparator )
  1525. //  )
  1526. //  dc.FillSolidRect( &rcSeparator, m_clrRgHeaderSeparator );
  1527. //  } // if( bDrawSeparator )
  1528. bool bDrawSeparator = false, bDrawBorder = false;
  1529. if( pHelperSrc != NULL )
  1530. {
  1531. if( pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtReportGridColumn)) )
  1532. {
  1533. CExtReportGridWnd * pRGW = ((CExtReportGridColumn*)pHelperSrc)->GetReportGrid();
  1534. if( pRGW->m_bHelperRenderingGroupArea
  1535. || pRGW->m_bHelperRenderingOuterDND
  1536. )
  1537. bDrawBorder = true;
  1538. if( ( pRGW->BseGetStyleEx() & __EGBS_BSE_EX_PROPORTIONAL_COLUMN_WIDTHS ) == 0 )
  1539. bDrawSeparator = true;
  1540. else
  1541. {
  1542. LONG nColCount = pRGW->ColumnCountGet();
  1543. if( nColCount > 0L )
  1544. {
  1545. CExtGridCell * pCell = pRGW->GridCellGetOuterAtTop( nColCount - 1L, 0L );
  1546. ASSERT_VALID( pCell );
  1547. if( LPVOID(pHelperSrc) != LPVOID(pCell) )
  1548. bDrawSeparator = true;
  1549. }
  1550. }
  1551. }
  1552. else if( pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtReportGridWnd))
  1553. && ( ((CExtReportGridWnd*)pHelperSrc)->m_bHelperRenderingGroupArea
  1554. || ((CExtReportGridWnd*)pHelperSrc)->m_bHelperRenderingOuterDND
  1555. )
  1556. )
  1557. bDrawBorder = true;
  1558. } // if( pHelperSrc != NULL )
  1559. if( bDrawSeparator )
  1560. {
  1561. CRect rcSeparator(
  1562. rcArea.right - 1,
  1563. rcArea.top + 3,
  1564. rcArea.right,
  1565. rcArea.bottom - 3
  1566. );
  1567. if( (! rcSeparator.IsRectEmpty() )
  1568. && dc.RectVisible( &rcSeparator )
  1569. )
  1570. dc.FillSolidRect( &rcSeparator, m_clrRgHeaderSeparator );
  1571. } // if( bDrawSeparator )
  1572. if( bDrawBorder )
  1573. dc.Draw3dRect(
  1574. &rcArea,
  1575. m_clrRgHeaderBorder,
  1576. m_clrRgHeaderBorder
  1577. );
  1578. return true;
  1579. }
  1580. bool CExtPaintManager::ReportGrid_PaintHeaderSortArrow(
  1581. CDC & dc,
  1582. const RECT & rcSortArrow,
  1583. bool bAscending,
  1584. CObject * pHelperSrc,
  1585. LPARAM lParam // = 0L
  1586. )
  1587. {
  1588. ASSERT_VALID( this );
  1589. ASSERT( dc.GetSafeHdc() != NULL );
  1590. dc;
  1591. rcSortArrow;
  1592. bAscending;
  1593. pHelperSrc;
  1594. lParam;
  1595. return false;
  1596. }
  1597. bool CExtPaintManagerNativeXP::ReportGrid_PaintHeaderSortArrow(
  1598. CDC & dc,
  1599. const RECT & rcSortArrow,
  1600. bool bAscending,
  1601. CObject * pHelperSrc,
  1602. LPARAM lParam // = 0L
  1603. )
  1604. {
  1605. ASSERT_VALID( this );
  1606. ASSERT( dc.GetSafeHdc() != NULL );
  1607. //bool bDefaultDrawing = true;
  1608. // if( g_PaintManager.m_UxTheme.IsControlsThemed() )
  1609. // {
  1610. // HWND hWnd = NULL;
  1611. // if( pHelperSrc != NULL )
  1612. // {
  1613. // if( pHelperSrc->IsKindOf( RUNTIME_CLASS(CWnd) ) )
  1614. // hWnd = ((CWnd*)pHelperSrc)->GetSafeHwnd();
  1615. // if( hWnd == NULL )
  1616. // {
  1617. // if( pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtReportGridColumn) ) )
  1618. // hWnd = ((CExtReportGridColumn*)pHelperSrc)->GetReportGrid()->GetSafeHwnd();
  1619. // if( hWnd == NULL )
  1620. // hWnd = ::GetDesktopWindow();
  1621. // } // if( hWnd == NULL )
  1622. // } // if( pHelperSrc != NULL )
  1623. // if( hWnd != NULL
  1624. // && g_PaintManager.m_UxTheme.OpenThemeData( hWnd, VSCLASS_HEADER ) != NULL
  1625. // )
  1626. // {
  1627. // if( g_PaintManager.m_UxTheme.DrawThemeBackground(
  1628. // dc.GetSafeHdc(), 
  1629. // HP_HEADERSORTARROW, 
  1630. // bAscending ? HSAS_SORTEDUP : HSAS_SORTEDDOWN, 
  1631. // &rcSortArrow, 
  1632. // &rcSortArrow
  1633. // ) == S_OK
  1634. // )
  1635. // bDefaultDrawing = false;
  1636. // g_PaintManager.m_UxTheme.CloseThemeData( true );
  1637. // }
  1638. // } // if( g_PaintManager.m_UxTheme.IsControlsThemed() )
  1639. // if( ! bDefaultDrawing )
  1640. // return true;
  1641. // return
  1642. // CExtPaintManager::ReportGrid_PaintHeaderSortArrow(
  1643. // dc,
  1644. // rcSortArrow,
  1645. // bAscending,
  1646. // pHelperSrc,
  1647. // lParam
  1648. // );
  1649. pHelperSrc;
  1650. lParam;
  1651. COLORREF ColorValues[2] =
  1652. {
  1653. RGB(0,0,0),
  1654. ::GetSysColor(COLOR_3DSHADOW),
  1655. };
  1656. PaintGlyphCentered(
  1657. dc,
  1658. rcSortArrow,
  1659. *( g_DockingCaptionGlyphs[
  1660. bAscending
  1661. ? __DCBT_2007_ARROW_SORT_UP
  1662. : __DCBT_2007_ARROW_SORT_DOWN
  1663. ] ),
  1664. ColorValues
  1665. );
  1666. return true;
  1667. }
  1668. bool CExtPaintManagerOffice2007_Impl::ReportGrid_PaintHeaderSortArrow(
  1669. CDC & dc,
  1670. const RECT & rcSortArrow,
  1671. bool bAscending,
  1672. CObject * pHelperSrc,
  1673. LPARAM lParam // = 0L
  1674. )
  1675. {
  1676. ASSERT_VALID( this );
  1677. ASSERT( dc.GetSafeHdc() != NULL );
  1678. if( IsHighContrast() )
  1679. return 
  1680. CExtPaintManagerXP::ReportGrid_PaintHeaderSortArrow(
  1681. dc,
  1682. rcSortArrow,
  1683. bAscending,
  1684. pHelperSrc,
  1685. lParam
  1686. );
  1687. COLORREF ColorValues[2] =
  1688. {
  1689. RGB(0,0,0),
  1690. m_clrRgHeaderSortArrow,
  1691. };
  1692. PaintGlyphCentered(
  1693. dc,
  1694. rcSortArrow,
  1695. *( g_DockingCaptionGlyphs[
  1696. bAscending
  1697. ? __DCBT_2007_ARROW_SORT_UP
  1698. : __DCBT_2007_ARROW_SORT_DOWN
  1699. ] ),
  1700. ColorValues
  1701. );
  1702. return true;
  1703. }
  1704. bool CExtPaintManager::ReportGrid_PaintGroupAreaBackground(
  1705. CDC & dc,
  1706. const RECT & rcArea,
  1707. __EXT_MFC_SAFE_LPCTSTR strEmptyAreaCaption, // not NULL if area is empty
  1708. CObject * pHelperSrc,
  1709. LPARAM lParam // = 0L
  1710. )
  1711. {
  1712. ASSERT_VALID( this );
  1713. ASSERT( dc.GetSafeHdc() != NULL );
  1714. dc;
  1715. rcArea;
  1716. strEmptyAreaCaption;
  1717. pHelperSrc;
  1718. lParam;
  1719. return false;
  1720. }
  1721. bool CExtPaintManagerNativeXP::ReportGrid_PaintGroupAreaBackground(
  1722. CDC & dc,
  1723. const RECT & rcArea,
  1724. __EXT_MFC_SAFE_LPCTSTR strEmptyAreaCaption, // not NULL if area is empty
  1725. CObject * pHelperSrc,
  1726. LPARAM lParam // = 0L
  1727. )
  1728. {
  1729. ASSERT_VALID( this );
  1730. ASSERT( dc.GetSafeHdc() != NULL );
  1731. dc;
  1732. rcArea;
  1733. strEmptyAreaCaption;
  1734. pHelperSrc;
  1735. lParam;
  1736. return false;
  1737. }
  1738. bool CExtPaintManagerOffice2007_Impl::ReportGrid_PaintGroupAreaBackground(
  1739. CDC & dc,
  1740. const RECT & rcArea,
  1741. __EXT_MFC_SAFE_LPCTSTR strEmptyAreaCaption, // not NULL if area is empty
  1742. CObject * pHelperSrc,
  1743. LPARAM lParam // = 0L
  1744. )
  1745. {
  1746. ASSERT_VALID( this );
  1747. ASSERT( dc.GetSafeHdc() != NULL );
  1748. if( IsHighContrast() )
  1749. return 
  1750. CExtPaintManagerXP::ReportGrid_PaintGroupAreaBackground(
  1751. dc,
  1752. rcArea,
  1753. strEmptyAreaCaption,
  1754. pHelperSrc,
  1755. lParam
  1756. );
  1757. dc.FillSolidRect( &rcArea, m_clrRgGroupAreaBk );
  1758. INT nTextLen = 0;
  1759. if( strEmptyAreaCaption != NULL
  1760. && ( nTextLen = INT( _tcslen( strEmptyAreaCaption ) ) ) > 0
  1761. )
  1762. {
  1763. CRect rcCaption = rcArea;
  1764. rcCaption.DeflateRect( 5, 5, 0, 5 );
  1765. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  1766. COLORREF clrOldTextColor = dc.SetTextColor( m_clrRgGroupAreaText );
  1767. dc.DrawText(
  1768. LPCTSTR(strEmptyAreaCaption),
  1769. nTextLen,
  1770. rcCaption,
  1771. DT_SINGLELINE|DT_NOCLIP
  1772. );
  1773. dc.SetTextColor( clrOldTextColor );
  1774. dc.SetBkMode( nOldBkMode );
  1775. }
  1776. return true;
  1777. }
  1778. bool CExtPaintManager::ReportGrid_PaintGroupAreaItemBackground(
  1779. CDC & dc,
  1780. const RECT & rcItem,
  1781. CObject * pHelperSrc,
  1782. LPARAM lParam // = 0L
  1783. )
  1784. {
  1785. ASSERT_VALID( this );
  1786. dc;
  1787. rcItem;
  1788. pHelperSrc;
  1789. lParam;
  1790. return false;
  1791. }
  1792. COLORREF CExtPaintManager::ReportGrid_GetGroupConnectorColor(
  1793. CObject * pHelperSrc,
  1794. LPARAM lParam // = 0L
  1795. )
  1796. {
  1797. ASSERT_VALID( this );
  1798. pHelperSrc;
  1799. lParam;
  1800. return COLORREF(-1L);
  1801. }
  1802. COLORREF CExtPaintManager::ReportGrid_GetHeaderTextColor(
  1803. CObject * pHelperSrc,
  1804. LPARAM lParam // = 0L
  1805. )
  1806. {
  1807. ASSERT_VALID( this );
  1808. if( pHelperSrc != NULL
  1809. && pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtReportGridColumn) )
  1810. )
  1811. {
  1812. if( (lParam&__EGCPF_HIGHLIGHTED_BY_PRESSED_COLUMN) != 0 )
  1813. return GetColor( COLOR_HIGHLIGHTTEXT, pHelperSrc, lParam );
  1814. else
  1815. return GetColor( COLOR_BTNTEXT, pHelperSrc, lParam );
  1816. }
  1817. return COLORREF(-1L);
  1818. }
  1819. COLORREF CExtPaintManagerNativeXP::ReportGrid_GetHeaderTextColor(
  1820. CObject * pHelperSrc,
  1821. LPARAM lParam // = 0L
  1822. )
  1823. {
  1824. ASSERT_VALID( this );
  1825. if( pHelperSrc != NULL
  1826. && pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtReportGridColumn) )
  1827. )
  1828. {
  1829. if( (lParam&__EGCPF_HIGHLIGHTED_BY_PRESSED_COLUMN) != 0 )
  1830. return ::GetSysColor( COLOR_HIGHLIGHTTEXT );
  1831. else
  1832. return ::GetSysColor( COLOR_BTNTEXT );
  1833. }
  1834. return COLORREF(-1L);
  1835. }
  1836. COLORREF CExtPaintManagerOffice2007_Impl::ReportGrid_GetHeaderTextColor(
  1837. CObject * pHelperSrc,
  1838. LPARAM lParam // = 0L
  1839. )
  1840. {
  1841. ASSERT_VALID( this );
  1842. if( IsHighContrast() )
  1843. return 
  1844. CExtPaintManagerXP::ReportGrid_GetHeaderTextColor(
  1845. pHelperSrc,
  1846. lParam
  1847. );
  1848. if( pHelperSrc != NULL
  1849. && pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtReportGridColumn) )
  1850. )
  1851. {
  1852. if( (lParam&__EGCPF_HIGHLIGHTED_BY_PRESSED_COLUMN) != 0 )
  1853. return GetColor( COLOR_HIGHLIGHTTEXT, pHelperSrc, lParam );
  1854. else
  1855. return m_clrRgHeaderText;
  1856. }
  1857. return COLORREF(-1L);
  1858. }
  1859. #endif // (!defined __EXT_MFC_NO_REPORTGRIDWND)
  1860. CSize CExtPaintManager::GetTextSizes(
  1861. bool bBold // = false
  1862. )
  1863. {
  1864. ASSERT_VALID( this );
  1865. CWindowDC dc( NULL );
  1866. CFont * pOldFont =
  1867. dc.SelectObject(
  1868. bBold ? &m_FontBold : &m_FontNormal
  1869. );
  1870. ASSERT( pOldFont != NULL );
  1871. TEXTMETRIC tm;
  1872. dc.GetTextMetrics( &tm );
  1873. int nTextHeightHorz = tm.tmHeight + 2;
  1874. dc.SelectObject( &m_FontNormal );
  1875. dc.GetTextMetrics( &tm );
  1876. int nTextHeightVert = tm.tmHeight + 2;
  1877. dc.SelectObject( pOldFont );
  1878. return CSize(nTextHeightHorz,nTextHeightVert);
  1879. }
  1880. int CExtPaintManager::GetTextHeight(
  1881. bool bHorz
  1882. )
  1883. {
  1884. ASSERT_VALID( this );
  1885. CSize _size = GetTextSizes();
  1886. return bHorz ? _size.cx : _size.cy;
  1887. }
  1888. int CExtPaintManager::GetMenuExpandButtonHeight()
  1889. {
  1890. ASSERT_VALID( this );
  1891. int nHeight = ::GetSystemMetrics(SM_CYMENUCHECK);
  1892. ASSERT( nHeight > 0 );
  1893. return nHeight;
  1894. }
  1895. int CExtPaintManagerXP::GetMenuExpandButtonHeight()
  1896. {
  1897. ASSERT_VALID( this );
  1898. return CExtPaintManager::GetMenuExpandButtonHeight();
  1899. }
  1900. int CExtPaintManagerOffice2003::GetMenuExpandButtonHeight()
  1901. {
  1902. ASSERT_VALID( this );
  1903. if( IsHighContrast() )
  1904. return CExtPaintManagerXP::GetMenuExpandButtonHeight();
  1905. int nHeightNormal = CExtPaintManager::GetMenuExpandButtonHeight();
  1906. ASSERT( nHeightNormal > 0 );
  1907. return max( nHeightNormal, 18 );
  1908. }
  1909. void CExtPaintManager::PaintMenuScrollButton(
  1910. CDC & dc,
  1911. bool bHover,
  1912. bool bPushed,
  1913. bool bTopButton,
  1914. const RECT & rcScrollButton,
  1915. CObject * pHelperSrc,
  1916. LPARAM lParam // = 0L
  1917. )
  1918. {
  1919. ASSERT_VALID( this );
  1920. bPushed = bPushed || bHover;
  1921. CExtPaintManager::PAINTPUSHBUTTONDATA _ppbd(
  1922. pHelperSrc,
  1923. true,
  1924. rcScrollButton,
  1925. bTopButton ? _T("t") : _T("u"), // up arrow / down arrow
  1926. NULL,
  1927. true,
  1928. false, // bHover,
  1929. bPushed,
  1930. false,
  1931. true,true,false,false,
  1932. __ALIGN_HORIZ_CENTER | __ALIGN_VERT_CENTER,
  1933. (HFONT)m_FontMarlett.GetSafeHandle()
  1934. );
  1935. _ppbd.m_lParam = lParam;
  1936. PaintPushButton( dc, _ppbd );
  1937. }
  1938. void CExtPaintManagerXP::PaintMenuScrollButton(
  1939. CDC & dc,
  1940. bool bHover,
  1941. bool bPushed,
  1942. bool bTopButton,
  1943. const RECT & rcScrollButton,
  1944. CObject * pHelperSrc,
  1945. LPARAM lParam // = 0L
  1946. )
  1947. {
  1948. ASSERT_VALID( this );
  1949. bool bTransparentBk = false;
  1950. bool bDrawBorder = true;
  1951. bPushed = bPushed || bHover;
  1952. if( bPushed )
  1953. {
  1954. PAINTMENUITEMDATA _pmid; // fake
  1955. _pmid.m_bSelected = true;
  1956. if( PaintMenuItemBackgroundXP( dc, _pmid, rcScrollButton )
  1957. || PaintMenuItemSelectionAreaXP( dc, _pmid, rcScrollButton ) 
  1958. )
  1959. {
  1960. bTransparentBk = true;
  1961. bDrawBorder = false;
  1962. bPushed = bHover = false;
  1963. }
  1964. }
  1965. CExtPaintManager::PAINTPUSHBUTTONDATA _ppbd(
  1966. pHelperSrc,
  1967. true, // bHorz
  1968. rcScrollButton,
  1969. bTopButton ? _T("t") : _T("u"), // up arrow / down arrow
  1970. NULL, // pIcon
  1971. true, // bFlat
  1972. bHover,
  1973. bPushed,
  1974. false, // bIndeterminate
  1975. true, // bEnabled
  1976. bDrawBorder,
  1977. false, // bDrawFocusRect
  1978. false, // bDefaultPushButton
  1979. __ALIGN_HORIZ_CENTER | __ALIGN_VERT_CENTER,
  1980. (HFONT)m_FontMarlett.GetSafeHandle(),
  1981. false, // bDropDown
  1982. 0, // nHelperSysCmdID
  1983. bTransparentBk
  1984. );
  1985. _ppbd.m_lParam = lParam;
  1986. PaintPushButton( dc, _ppbd );
  1987. }
  1988. void CExtPaintManager::PaintMenuTearOffButton(
  1989. CDC & dc,
  1990. const RECT & rectButton,
  1991. bool bPushed,
  1992. bool bHover,
  1993. CObject * pHelperSrc,
  1994. LPARAM lParam // = 0L
  1995. )
  1996. {
  1997. ASSERT_VALID( this );
  1998. ASSERT( dc.GetSafeHdc() != NULL );
  1999. bPushed;
  2000. bHover;
  2001. pHelperSrc;
  2002. lParam;
  2003. CRect rcGlyph( rectButton );
  2004. rcGlyph.DeflateRect( 1, 0, 0, 1 );
  2005. dc.FillSolidRect(
  2006. &rcGlyph,
  2007. GetColor( COLOR_HIGHLIGHT )
  2008. );
  2009. }
  2010. void CExtPaintManagerXP::PaintMenuTearOffButton(
  2011. CDC & dc,
  2012. const RECT & rectButton,
  2013. bool bPushed,
  2014. bool bHover,
  2015. CObject * pHelperSrc,
  2016. LPARAM lParam // = 0L
  2017. )
  2018. {
  2019. ASSERT_VALID( this );
  2020. ASSERT( dc.GetSafeHdc() != NULL );
  2021. pHelperSrc;
  2022. lParam;
  2023. CRect rcGlyph( rectButton );
  2024. rcGlyph.DeflateRect( 0, 0, 0, 1 );
  2025. dc.FillSolidRect( &rcGlyph, GetColor( ( bHover || bPushed ) ? CLR_3DFACE_IN : XPCLR_3DFACE_DARK ) );
  2026. static const int g_nXpTearOffBtnLinesWidth = 33;
  2027. CRect rcLines = rcGlyph;
  2028. rcLines.OffsetRect( (rcLines.Width() - g_nXpTearOffBtnLinesWidth) / 2, 0 );
  2029. rcLines.right = rcLines.left + g_nXpTearOffBtnLinesWidth;
  2030. if( bHover || bPushed )
  2031. {
  2032. COLORREF clrBorder = GetColor( XPCLR_HILIGHT_BORDER );
  2033. dc.Draw3dRect( &rcGlyph, clrBorder, clrBorder );
  2034. rcLines.DeflateRect( 0, 2 );
  2035. COLORREF clrLine = GetColor( COLOR_BTNTEXT );
  2036. int yStep = rcLines.top;
  2037. for( ; yStep < rcLines.bottom; yStep += 2 )
  2038. dc.FillSolidRect( rcLines.left, yStep, rcLines.Width(), 1, clrLine );
  2039. } // if( bHover || bPushed )
  2040. else
  2041. {
  2042. rcLines.DeflateRect( 0, 1 );
  2043. COLORREF clrLine = GetColor( COLOR_3DSHADOW );
  2044. int yStep = rcLines.top;
  2045. for( ; yStep < rcLines.bottom; yStep += 2 )
  2046. dc.FillSolidRect( rcLines.left, yStep, rcLines.Width(), 1, clrLine );
  2047. } // else from if( bHover || bPushed )
  2048. }
  2049. void CExtPaintManagerOffice2003::PaintMenuTearOffButton(
  2050. CDC & dc,
  2051. const RECT & rectButton,
  2052. bool bPushed,
  2053. bool bHover,
  2054. CObject * pHelperSrc,
  2055. LPARAM lParam // = 0L
  2056. )
  2057. {
  2058. ASSERT_VALID( this );
  2059. ASSERT( dc.GetSafeHdc() != NULL );
  2060. if( IsHighContrast() )
  2061. {
  2062. CExtPaintManagerXP::PaintMenuTearOffButton( dc, rectButton, bPushed, bHover, pHelperSrc, lParam );
  2063. return;
  2064. }
  2065. CRect rcGlyph( rectButton );
  2066. rcGlyph.DeflateRect( 0, 0, 0, 1 );
  2067. dc.FillSolidRect( &rcGlyph, GetColor( ( bHover || bPushed ) ? CLR_3DFACE_IN : XPCLR_3DFACE_DARK ) );
  2068. static const int g_n2003TearOffBtnSpaceNormal = 36;
  2069. static const int g_n2003TearOffBtnSpaceSmall = 10;
  2070. CRect rcBoxes = rcGlyph;
  2071. rcBoxes.DeflateRect( g_n2003TearOffBtnSpaceNormal, 0 );
  2072. if( rcBoxes.Width() < g_n2003TearOffBtnSpaceSmall )
  2073. {
  2074. rcBoxes = rcGlyph;
  2075. rcBoxes.DeflateRect( g_n2003TearOffBtnSpaceSmall, 0 );
  2076. }
  2077. static const CSize g_sizeGripDot( 2, 2 );
  2078. static const CSize g_sizeGripDist( 1, 1 );
  2079. static const CSize g_sizeGripShadowOffset( 1, 1 );
  2080. rcBoxes.DeflateRect( 0, ( rcBoxes.Height() - g_sizeGripDot.cy - g_sizeGripShadowOffset.cy ) / 2 );
  2081. if( bHover || bPushed )
  2082. {
  2083. COLORREF clrBorder = GetColor( XPCLR_HILIGHT_BORDER );
  2084. dc.Draw3dRect( &rcGlyph, clrBorder, clrBorder );
  2085. } // if( bHover || bPushed )
  2086. if( rcBoxes.left < rcBoxes.right )
  2087. {
  2088. COLORREF clrDotShadow = GetColor( _2003CLR_GRIPPER_DOT_LIGHT );
  2089. COLORREF clrDotFace = GetColor( _2003CLR_GRIPPER_DOT_DARK );
  2090. CRect rcDotFace( rcBoxes.TopLeft(), g_sizeGripDot );
  2091. CRect rcDotShadow( rcDotFace );
  2092. rcDotShadow.OffsetRect( g_sizeGripShadowOffset );
  2093. int nStepH = g_sizeGripDot.cx + g_sizeGripDist.cx + g_sizeGripShadowOffset.cx;
  2094. for( ; (rcDotShadow.right+g_sizeGripDist.cx) < rcBoxes.right; )
  2095. {
  2096. dc.FillSolidRect( &rcDotShadow, clrDotShadow );
  2097. dc.FillSolidRect( &rcDotFace, clrDotFace );
  2098. rcDotFace.OffsetRect( nStepH, 0 );
  2099. rcDotShadow.OffsetRect( nStepH, 0 );
  2100. }
  2101. } // if( rcBoxes.left < rcBoxes.right )
  2102. }
  2103. void CExtPaintManager::PaintMenuExpandButton(
  2104. CDC & dc,
  2105. const RECT & rectButton,
  2106. bool bPushed,
  2107. bool bHover,
  2108. CObject * pHelperSrc,
  2109. LPARAM lParam // = 0L
  2110. )
  2111. {
  2112. ASSERT_VALID( this );
  2113. ASSERT( dc.GetSafeHdc() != NULL );
  2114. bHover;
  2115. CRect rcGlyph(rectButton);
  2116. rcGlyph.DeflateRect(1,0);
  2117. if( bPushed )
  2118. {
  2119. dc.FillRect(
  2120. &rcGlyph,
  2121. &m_brushLightDefault
  2122. );
  2123. dc.Draw3dRect(
  2124. &rcGlyph,
  2125. GetColor( CLR_3DHILIGHT_OUT, pHelperSrc, lParam ),
  2126. GetColor( CLR_3DSHADOW_OUT, pHelperSrc, lParam )
  2127. );
  2128. }
  2129. else
  2130. {
  2131. CExtPaintManager::PAINTMENUITEMDATA _pmid(
  2132. pHelperSrc,
  2133. rcGlyph, rectButton, 0, _T(""),
  2134. _T(""), NULL,
  2135. false, false, false,
  2136. false, false, true, false, false, false,
  2137. 0, NULL
  2138. );
  2139. PaintMenuItem( dc, _pmid );
  2140. }
  2141. COLORREF ColorValues[] =
  2142. {
  2143. RGB(0,0,0),
  2144. GetColor( CLR_MENUTEXT_OUT, pHelperSrc, lParam )
  2145. };
  2146. PaintGlyphCentered(
  2147. dc,
  2148. rcGlyph,
  2149. g_glyph_btn_expand_bottom2,
  2150. ColorValues
  2151. );
  2152. }
  2153. void CExtPaintManagerXP::PaintMenuExpandButton(
  2154. CDC & dc,
  2155. const RECT & rectButton,
  2156. bool bPushed,
  2157. bool bHover,
  2158. CObject * pHelperSrc,
  2159. LPARAM lParam // = 0L
  2160. )
  2161. {
  2162. ASSERT_VALID( this );
  2163. ASSERT( dc.GetSafeHdc() != NULL );
  2164. bHover;
  2165. bool bRTL = false;
  2166. if( pHelperSrc != NULL )
  2167. {
  2168. ASSERT_VALID( pHelperSrc );
  2169. CExtPopupMenuWnd * pPopup = DYNAMIC_DOWNCAST( CExtPopupMenuWnd, pHelperSrc );
  2170. if( pPopup != NULL )
  2171. bRTL = pPopup->OnQueryLayoutRTL();
  2172. } // if( pHelperSrc != NULL )
  2173. int nIconAreaWidth = 0;
  2174. if( pHelperSrc != NULL // (+ 2.23)
  2175. && pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtPopupMenuWnd) )
  2176. && ((CExtPopupMenuWnd*)pHelperSrc) ->
  2177. ItemGetCount() > 0
  2178. )
  2179. {
  2180. CExtPopupMenuWnd::MENUITEMDATA & _mii =
  2181. ((CExtPopupMenuWnd*)pHelperSrc) ->
  2182. ItemGetInfo(
  2183. ((CExtPopupMenuWnd*)pHelperSrc) ->
  2184. ItemGetCount()
  2185. - 1
  2186. );
  2187. if( ! _mii.IsToolButton() )
  2188. nIconAreaWidth = _mii.GetIconAreaWidth();
  2189. }
  2190. CRect rcGlyph(rectButton);
  2191. rcGlyph.DeflateRect( 1, 0 );
  2192. if( bPushed )
  2193. {
  2194. CExtPaintManager::PAINTMENUITEMDATA _pmid; // fake
  2195. _pmid.m_bSelected = true;
  2196. if( ! PaintMenuItemBackgroundXP( dc, _pmid, rcGlyph ) )
  2197. {
  2198. if( ! PaintMenuItemSelectionAreaXP( dc, _pmid, rcGlyph ) )
  2199. {
  2200. PAINTPUSHBUTTONDATA _ppbd(
  2201. pHelperSrc,
  2202. true,rcGlyph,_T(""),NULL,
  2203. true,false,bPushed,false,
  2204. false,true,false,false,
  2205. __ALIGN_HORIZ_CENTER | __ALIGN_VERT_CENTER,
  2206. NULL,
  2207. false
  2208. );
  2209. PaintPushButton( dc, _ppbd );
  2210. rcGlyph.OffsetRect(
  2211. GetPushedOffset()
  2212. );
  2213. }
  2214. }
  2215. }
  2216. else
  2217. {
  2218. CExtPaintManager::PAINTMENUITEMDATA _pmid(
  2219. pHelperSrc,
  2220. rcGlyph, rectButton, nIconAreaWidth, _T(""),
  2221. _T(""), NULL,
  2222. false, false, false,
  2223. false, false, true, false, false, false,
  2224. 0, NULL
  2225. );
  2226. PaintMenuItem( dc, _pmid );
  2227. }
  2228. COLORREF ColorValues[] =
  2229. {
  2230. RGB(0,0,0),
  2231. GetColor( CLR_MENUTEXT_OUT, pHelperSrc, lParam )
  2232. };
  2233. PaintGlyphCentered(
  2234. dc,
  2235. rcGlyph,
  2236. g_glyph_btn_expand_bottom2,
  2237. ColorValues
  2238. );
  2239. }
  2240. void CExtPaintManagerOffice2003::PaintMenuExpandButton(
  2241. CDC & dc,
  2242. const RECT & rectButton,
  2243. bool bPushed,
  2244. bool bHover,
  2245. CObject * pHelperSrc,
  2246. LPARAM lParam // = 0L
  2247. )
  2248. {
  2249. ASSERT_VALID( this );
  2250. ASSERT( dc.GetSafeHdc() != NULL );
  2251. if( IsHighContrast() )
  2252. {
  2253. CExtPaintManagerXP::PaintMenuExpandButton(
  2254. dc,
  2255. rectButton,
  2256. bPushed,
  2257. bHover,
  2258. pHelperSrc,
  2259. lParam
  2260. );
  2261. return;
  2262. }
  2263. bool bRTL = false;
  2264. CExtPopupMenuWnd * pPopup = NULL;
  2265. if( pHelperSrc != NULL )
  2266. {
  2267. ASSERT_VALID( pHelperSrc );
  2268. pPopup = DYNAMIC_DOWNCAST( CExtPopupMenuWnd, pHelperSrc );
  2269. if( pPopup != NULL )
  2270. bRTL = pPopup->OnQueryLayoutRTL();
  2271. } // if( pHelperSrc != NULL )
  2272. CRect rcButton( rectButton );
  2273. if( ( rcButton.Width() & 0x01 ) != 0 )
  2274. {
  2275. if( bRTL )
  2276. rcButton.left ++;
  2277. else
  2278. rcButton.right --;
  2279. } // if( ( rcButton.Width() & 0x01 ) != 0 )
  2280. int nIconAreaWidth = 0;
  2281. if( pPopup != NULL
  2282. && pPopup->ItemGetCount() > 0
  2283. )
  2284. {
  2285. CExtPopupMenuWnd::MENUITEMDATA & _mii =
  2286. pPopup->ItemGetInfo( pPopup->ItemGetCount() - 1 );
  2287. if( ! _mii.IsToolButton() )
  2288. nIconAreaWidth = _mii.GetIconAreaWidth();
  2289. }
  2290. if( ::GetDeviceCaps( dc.m_hDC, BITSPIXEL ) <= 8 )
  2291. {
  2292. CExtPaintManagerXP::PaintMenuExpandButton(
  2293. dc,
  2294. rectButton,
  2295. bPushed,
  2296. bHover,
  2297. pHelperSrc,
  2298. lParam
  2299. );
  2300. return;
  2301. }
  2302. CRect rcGlyph( rectButton );
  2303. rcGlyph.DeflateRect( 1, 0 );
  2304. if( bPushed )
  2305. {
  2306. CExtPaintManager::PAINTMENUITEMDATA _pmid; // fake
  2307. _pmid.m_bSelected = true;
  2308. if( ! PaintMenuItemBackgroundXP( dc, _pmid, rcGlyph ) )
  2309. {
  2310. if( ! PaintMenuItemSelectionAreaXP( dc, _pmid, rcGlyph ) )
  2311. {
  2312. PAINTPUSHBUTTONDATA _ppbd(
  2313. pHelperSrc,
  2314. true,rcGlyph,_T(""),NULL,
  2315. true,false,bPushed,false,
  2316. false,true,false,false,
  2317. __ALIGN_HORIZ_CENTER | __ALIGN_VERT_CENTER,
  2318. NULL,
  2319. false
  2320. );
  2321. PaintPushButton( dc, _ppbd );
  2322. rcGlyph.OffsetRect(
  2323. GetPushedOffset()
  2324. );
  2325. }
  2326. }
  2327. }
  2328. else
  2329. {
  2330. CExtPaintManager::PAINTMENUITEMDATA _pmid(
  2331. pHelperSrc,
  2332. rcGlyph, rectButton, nIconAreaWidth, _T(""),
  2333. _T(""), NULL,
  2334. false, bHover, false,
  2335. false, false, true, false, false, false,
  2336. 0, NULL
  2337. );
  2338. PaintMenuItem( dc, _pmid );
  2339. }
  2340. // paint expand circle with gradient
  2341. CRect rcCircle( rcButton );
  2342. rcCircle.NormalizeRect();
  2343. CPoint ptDest = rcCircle.TopLeft();
  2344. ptDest.x +=
  2345. (rcCircle.Width() - 16) / 2;
  2346. ptDest.y +=
  2347. (rcCircle.Height() - 16) / 2;
  2348. const BYTE _CircleMask[16*16] =
  2349. {
  2350. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xEA, 0xC6, 0xB4, 0xB4, 0xB4, 0xC6, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  2351. 0xFF, 0xFF, 0xFF, 0xEA, 0xEA, 0xEA, 0xEA, 0xC6, 0xB4, 0x90, 0x7E, 0x7E, 0xC6, 0xFF, 0xFF, 0xFF,
  2352. 0xFF, 0xFF, 0xEA, 0xFC, 0xFC, 0xEA, 0xEA, 0xC6, 0xB4, 0x90, 0x7E, 0x6C, 0x5A, 0x90, 0xFF, 0xFF,
  2353. 0xFF, 0xEA, 0xFC, 0xFC, 0xFC, 0xEA, 0xEA, 0xC6, 0xB4, 0x90, 0x7E, 0x6C, 0x5A, 0x36, 0x7E, 0xFF,
  2354. 0xFF, 0xFC, 0xFC, 0xFC, 0xFC, 0xEA, 0xEA, 0xC6, 0xB4, 0x90, 0x7E, 0x6C, 0x5A, 0x36, 0x24, 0xFF,
  2355. 0xEA, 0xFC, 0xFC, 0xFC, 0xFC, 0xEA, 0xEA, 0xC6, 0xB4, 0x90, 0x7E, 0x6C, 0x48, 0x36, 0x24, 0x5A,
  2356. 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xEA, 0xC6, 0xB4, 0x90, 0x90, 0x7E, 0x6C, 0x48, 0x24, 0x12, 0x24,
  2357. 0xC6, 0xEA, 0xEA, 0xEA, 0xC6, 0xC6, 0xC6, 0xB4, 0x90, 0x7E, 0x7E, 0x48, 0x36, 0x24, 0x12, 0x12,
  2358. 0xC6, 0xC6, 0xC6, 0xC6, 0xC6, 0xB4, 0xB4, 0x90, 0x7E, 0x7E, 0x6C, 0x48, 0x36, 0x12, 0x12, 0x00,
  2359. 0xC6, 0xB4, 0xB4, 0xB4, 0xB4, 0xB4, 0x90, 0x7E, 0x7E, 0x6C, 0x5A, 0x36, 0x24, 0x12, 0x00, 0x00,
  2360. 0xC6, 0x90, 0x90, 0x90, 0x90, 0x90, 0x7E, 0x7E, 0x6C, 0x6C, 0x48, 0x36, 0x24, 0x12, 0x00, 0x36,
  2361. 0xFF, 0x90, 0x7E, 0x7E, 0x7E, 0x7E, 0x6C, 0x6C, 0x5A, 0x5A, 0x36, 0x24, 0x12, 0x00, 0x00, 0xFF,
  2362. 0xFF, 0xC6, 0x6C, 0x6C, 0x6C, 0x6C, 0x5A, 0x5A, 0x5A, 0x48, 0x36, 0x24, 0x12, 0x00, 0x48, 0xFF,
  2363. 0xFF, 0xFF, 0xB4, 0x6C, 0x5A, 0x5A, 0x5A, 0x48, 0x48, 0x36, 0x24, 0x12, 0x00, 0x36, 0xFF, 0xFF,
  2364. 0xFF, 0xFF, 0xFF, 0xC6, 0x5A, 0x48, 0x48, 0x48, 0x36, 0x24, 0x24, 0x12, 0x6C, 0xFF, 0xFF, 0xFF,
  2365. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xB4, 0x6C, 0x48, 0x36, 0x5A, 0x7E, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  2366. };
  2367. COLORREF clrLight =
  2368. GetColor( CExtPaintManagerOffice2003::_2003CLR_EXPBTN_CIRCLE_LIGHT, pHelperSrc, lParam );
  2369. COLORREF clrDark =
  2370. GetColor( CExtPaintManagerOffice2003::_2003CLR_EXPBTN_CIRCLE_DARK, pHelperSrc, lParam );
  2371. for( int i = 0; i < 16 * 16; i++ )
  2372. {
  2373. int nPixel = _CircleMask[i];
  2374. int nRed = 
  2375. GetRValue(clrDark) - 
  2376. nPixel*(GetRValue(clrDark) - 
  2377. GetRValue(clrLight)) / 0xFF;
  2378. int nGreen = 
  2379. GetGValue(clrDark) - 
  2380. nPixel*( GetGValue(clrDark) - 
  2381. GetGValue(clrLight)) / 0xFF;
  2382. int nBlue = 
  2383. GetBValue(clrDark) - 
  2384. nPixel*( GetBValue(clrDark) - 
  2385. GetBValue(clrLight)) / 0xFF;
  2386. if( nPixel != 0xFF )
  2387. dc.SetPixel(
  2388. ptDest.x + i / 16, 
  2389. ptDest.y  + i % 16, 
  2390. RGB(nRed, nGreen, nBlue)
  2391. );
  2392. }
  2393. COLORREF ColorValues[] =
  2394. {
  2395. RGB(0,0,0),
  2396. GetColor( CLR_MENUTEXT_OUT, pHelperSrc, lParam )
  2397. };
  2398. PaintGlyphCentered(
  2399. dc,
  2400. rcButton,
  2401. g_glyph_btn_expand_bottom2,
  2402. ColorValues
  2403. );
  2404. }
  2405. void CExtPaintManagerNativeXP::PaintMenuExpandButton(
  2406. CDC & dc,
  2407. const RECT & rectButton,
  2408. bool bPushed,
  2409. bool bHover,
  2410. CObject * pHelperSrc,
  2411. LPARAM lParam // = 0L
  2412. )
  2413. {
  2414. ASSERT_VALID( this );
  2415. ASSERT( dc.GetSafeHdc() != NULL );
  2416. if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  2417. {
  2418. CExtPaintManager::PaintMenuExpandButton(
  2419. dc,
  2420. rectButton,
  2421. bPushed,
  2422. bHover,
  2423. pHelperSrc,
  2424. lParam
  2425. );
  2426. return;
  2427. } // if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  2428. CWnd * pWnd = DYNAMIC_DOWNCAST( CWnd, pHelperSrc );
  2429. ASSERT( pWnd != NULL );
  2430. ASSERT_VALID( pWnd );
  2431. CRect rcGlyph(rectButton);
  2432. rcGlyph.DeflateRect(1,0);
  2433. INT nPartID = TP_BUTTON;
  2434. INT nStateID = bHover ? TS_HOT : ( bPushed ? TS_PRESSED : TS_NORMAL );
  2435. if( g_PaintManager.m_UxTheme.OpenThemeData( pWnd->GetSafeHwnd(), VSCLASS_TOOLBAR ) != NULL )
  2436. {
  2437. VERIFY( 
  2438. g_PaintManager.m_UxTheme.DrawBackground(
  2439. pWnd->GetSafeHwnd(),
  2440. dc.GetSafeHdc(), 
  2441. nPartID, 
  2442. nStateID, 
  2443. &rcGlyph, 
  2444. &rcGlyph
  2445. ) == S_OK
  2446. );
  2447. g_PaintManager.m_UxTheme.CloseThemeData();
  2448. }
  2449. COLORREF ColorValues[] =
  2450. {
  2451. RGB(0,0,0),
  2452. ::GetSysColor( COLOR_BTNTEXT )
  2453. };
  2454. PaintGlyphCentered(
  2455. dc,
  2456. rcGlyph,
  2457. g_glyph_btn_expand_bottom2,
  2458. ColorValues
  2459. );
  2460. }
  2461. CSize CExtPaintManager::FixedBar_GetRoundedAreaMerics() const
  2462. {
  2463. ASSERT_VALID( this );
  2464. return CSize( 0, 0 );
  2465. }
  2466. CSize CExtPaintManagerXP::FixedBar_GetRoundedAreaMerics() const
  2467. {
  2468. ASSERT_VALID( this );
  2469. return CExtPaintManager::FixedBar_GetRoundedAreaMerics();
  2470. }
  2471. CSize CExtPaintManagerOffice2003::FixedBar_GetRoundedAreaMerics() const
  2472. {
  2473. ASSERT_VALID( this );
  2474. if( IsHighContrast() )
  2475. return CExtPaintManagerXP::FixedBar_GetRoundedAreaMerics();
  2476. return CSize( 4, 4 );
  2477. }
  2478. void CExtPaintManager::PaintToolbarExpandButton(
  2479. CDC & dc,
  2480. const RECT & rcButtonArea,
  2481. bool bHorz, // if false - down
  2482. bool bBarIsCompletelyVisible,
  2483. bool bEnabled,
  2484. bool bPushed,
  2485. bool bHover,
  2486. CObject * pHelperSrc,
  2487. LPARAM lParam, // = 0L
  2488. bool bTransparentBackground // = false
  2489. )
  2490. {
  2491. ASSERT_VALID( this );
  2492. ASSERT( dc.GetSafeHdc() != NULL );
  2493. CRect rect(rcButtonArea);
  2494. rect.NormalizeRect();
  2495. if( !dc.RectVisible( &rect ) )
  2496. return;
  2497. CRect rectButton(rect);
  2498. const glyph_t * pGlyph = NULL, * pGlyph2 = NULL;
  2499. if( bHorz )
  2500. {
  2501. pGlyph = &g_glyph_btn_expand_bottom;
  2502. if( !bBarIsCompletelyVisible )
  2503. pGlyph2 = &g_glyph_btn_expand_right2;
  2504. }
  2505. else
  2506. {
  2507. pGlyph = &g_glyph_btn_expand_left;
  2508. if( !bBarIsCompletelyVisible )
  2509. pGlyph2 = &g_glyph_btn_expand_bottom2;
  2510. }
  2511. ASSERT( pGlyph != NULL );
  2512. PAINTPUSHBUTTONDATA _ppbd(
  2513. pHelperSrc,
  2514. true,rect,_T(""),NULL,true,
  2515. bHover,bPushed,false,bEnabled,
  2516. true,false,false,
  2517. __ALIGN_HORIZ_CENTER | __ALIGN_VERT_CENTER,
  2518. NULL,false,0,bTransparentBackground
  2519. );
  2520. PaintPushButton( dc, _ppbd );
  2521. COLORREF clr =
  2522. GetColor(
  2523. bEnabled ? CLR_TEXT_OUT : COLOR_3DHILIGHT, pHelperSrc, lParam
  2524. );
  2525. COLORREF ColorValues[] =
  2526. {
  2527. 0,
  2528. clr
  2529. };
  2530. if( bPushed )
  2531. rect.OffsetRect(
  2532. GetPushedOffset()
  2533. );
  2534. CRect rectGlyph(rectButton.TopLeft(),pGlyph->Size());
  2535. CRect rectGlyph2(rectGlyph);
  2536. CSize sizePushedOffset = GetPushedOffset();
  2537. if( bPushed )
  2538. {
  2539. rectGlyph.OffsetRect( sizePushedOffset );
  2540. rectGlyph2.OffsetRect( sizePushedOffset );
  2541. }
  2542. if( bHorz )
  2543. {
  2544. int nGap = (max(sizePushedOffset.cy,1)) * 3;
  2545. rectGlyph.OffsetRect(
  2546. (rectButton.Size().cx - pGlyph->Size().cx) / 2,
  2547. rectButton.Size().cy - pGlyph->Size().cy - nGap
  2548. );
  2549. if( !bBarIsCompletelyVisible )
  2550. {
  2551. ASSERT( pGlyph2 != NULL );
  2552. rectGlyph2.OffsetRect(
  2553. (rectButton.Size().cx - pGlyph2->Size().cx) / 2,
  2554. nGap
  2555. );
  2556. }
  2557. }
  2558. else
  2559. {
  2560. int nGap = (max(sizePushedOffset.cx,1)) * 3;
  2561. rectGlyph.OffsetRect(
  2562. nGap,
  2563. (rectButton.Size().cy - pGlyph->Size().cy)/2
  2564. );
  2565. if( !bBarIsCompletelyVisible )
  2566. {
  2567. ASSERT( pGlyph2 != NULL );
  2568. rectGlyph2.OffsetRect(
  2569. rectButton.Size().cx - pGlyph2->Size().cx - nGap,
  2570. (rectButton.Size().cy - pGlyph2->Size().cy) / 2
  2571. );
  2572. }
  2573. }
  2574. if( bEnabled )
  2575. {
  2576. PaintGlyph(
  2577. dc,rectGlyph.TopLeft(),*pGlyph,ColorValues
  2578. );
  2579. if( !bBarIsCompletelyVisible )
  2580. {
  2581. ASSERT( pGlyph2 != NULL );
  2582. PaintGlyph(
  2583. dc,rectGlyph2.TopLeft(),*pGlyph2,ColorValues
  2584. );
  2585. }
  2586. } // if( bEnabled )
  2587. else
  2588. {
  2589. // rect.OffsetRect(1,1);
  2590. // PaintGlyphCentered(
  2591. // dc,rect,*pGlyph,ColorValues
  2592. // );
  2593. // ColorValues[1] = GetColor( COLOR_3DSHADOW, pHelperSrc, lParam );
  2594. // rect.OffsetRect(-1,-1);
  2595. // PaintGlyphCentered(
  2596. // dc,rect,*pGlyph,ColorValues
  2597. // );
  2598. rectGlyph.OffsetRect(1,1);
  2599. PaintGlyph(
  2600. dc,rectGlyph.TopLeft(),*pGlyph,ColorValues
  2601. );
  2602. rectGlyph.OffsetRect(-1,-1);
  2603. ColorValues[1] = GetColor( COLOR_3DSHADOW, pHelperSrc, lParam );
  2604. PaintGlyph(
  2605. dc,rectGlyph.TopLeft(),*pGlyph,ColorValues
  2606. );
  2607. } // else from if( bEnabled )
  2608. }
  2609. void CExtPaintManagerXP::PaintToolbarExpandButton(
  2610. CDC & dc,
  2611. const RECT & rcButtonArea,
  2612. bool bHorz, // if false - down
  2613. bool bBarIsCompletelyVisible,
  2614. bool bEnabled,
  2615. bool bPushed,
  2616. bool bHover,
  2617. CObject * pHelperSrc,
  2618. LPARAM lParam, // = 0L
  2619. bool bTransparentBackground // = false
  2620. )
  2621. {
  2622. ASSERT_VALID( this );
  2623. ASSERT( dc.GetSafeHdc() != NULL );
  2624. CRect rect(rcButtonArea);
  2625. rect.NormalizeRect();
  2626. if( !dc.RectVisible( &rect ) )
  2627. return;
  2628. CRect rectButton(rect);
  2629. const glyph_t * pGlyph = NULL, * pGlyph2 = NULL;
  2630. if( bHorz )
  2631. {
  2632. pGlyph = m_pGlyphTbEpBtnH0;
  2633. pGlyph2 = m_pGlyphTbEpBtnH1;
  2634. } // if( bHorz )
  2635. else
  2636. {
  2637. pGlyph = m_pGlyphTbEpBtnV0;
  2638. pGlyph2 = m_pGlyphTbEpBtnV1;
  2639. } // else from if( bHorz )
  2640. ASSERT( pGlyph != NULL );
  2641. ASSERT( pGlyph2 != NULL );
  2642. PAINTPUSHBUTTONDATA _ppbd(
  2643. pHelperSrc,
  2644. true,rect,_T(""),NULL,true,
  2645. bHover,bPushed,false,bEnabled,
  2646. true,false,false,
  2647. __ALIGN_HORIZ_CENTER | __ALIGN_VERT_CENTER,
  2648. NULL,false,0,bTransparentBackground
  2649. );
  2650. PaintPushButton( dc, _ppbd );
  2651. COLORREF clr =
  2652. GetColor(
  2653. bEnabled ? CLR_TEXT_OUT : COLOR_3DHILIGHT, pHelperSrc, lParam
  2654. );
  2655. COLORREF ColorValues[] =
  2656. {
  2657. 0,
  2658. clr
  2659. };
  2660. if( bPushed )
  2661. rect.OffsetRect( GetPushedOffset() );
  2662. CRect rectGlyph(rectButton.TopLeft(),pGlyph->Size());
  2663. CRect rectGlyph2(rectGlyph);
  2664. CSize sizePushedOffset = GetPushedOffset();
  2665. if( bPushed )
  2666. {
  2667. rectGlyph.OffsetRect( sizePushedOffset );
  2668. rectGlyph2.OffsetRect( sizePushedOffset );
  2669. } // if( bPushed )
  2670. if( bHorz )
  2671. {
  2672. int nGap = (max(sizePushedOffset.cy,1)) * 3;
  2673. rectGlyph.OffsetRect(
  2674. (rectButton.Size().cx - pGlyph->Size().cx) / 2, // + 1
  2675. rectButton.Size().cy - pGlyph->Size().cy - nGap
  2676. );
  2677. rectGlyph2.OffsetRect(
  2678. (rectButton.Size().cx - pGlyph2->Size().cx) / 2 + 1,
  2679. nGap
  2680. );
  2681. } // if( bHorz )
  2682. else
  2683. {
  2684. int nGap = (max(sizePushedOffset.cx,1)) * 3;
  2685. rectGlyph.OffsetRect(
  2686. nGap,
  2687. (rectButton.Size().cy - pGlyph->Size().cy)/2 // + 1
  2688. );
  2689. rectGlyph2.OffsetRect(
  2690. rectButton.Size().cx - pGlyph2->Size().cx - nGap,
  2691. (rectButton.Size().cy - pGlyph2->Size().cy) / 2 + 1
  2692. );
  2693. if( m_bExpBtnSwapVGlyphs )
  2694. {
  2695. CRect rcTmp( rectGlyph );
  2696. rectGlyph = rectGlyph2;
  2697. rectGlyph2 = rcTmp;
  2698. }
  2699. } // else from if( bHorz )
  2700. if( bEnabled )
  2701. {
  2702. // if( bHover && (!bPushed) )
  2703. // {
  2704. // COLORREF ColorValuesHover[] =
  2705. // {
  2706. // 0,
  2707. // GetColor( COLOR_3DDKSHADOW, pHelperSrc, lParam )
  2708. // };
  2709. // rectGlyph.OffsetRect(-1,-1);
  2710. // rectGlyph2.OffsetRect(-1,-1);
  2711. // PaintGlyph(
  2712. // dc,rectGlyph.TopLeft(),*pGlyph,ColorValuesHover
  2713. // );
  2714. // if( !bBarIsCompletelyVisible )
  2715. // PaintGlyph(
  2716. // dc,rectGlyph2.TopLeft(),*pGlyph2,ColorValuesHover
  2717. // );
  2718. // rectGlyph.OffsetRect(1,1);
  2719. // rectGlyph2.OffsetRect(1,1);
  2720. // }
  2721. PaintGlyph(
  2722. dc,rectGlyph.TopLeft(),*pGlyph,ColorValues
  2723. );
  2724. if( !bBarIsCompletelyVisible )
  2725. PaintGlyph(
  2726. dc,rectGlyph2.TopLeft(),*pGlyph2,ColorValues
  2727. );
  2728. } // if( bEnabled )
  2729. else
  2730. {
  2731. ColorValues[1] = GetColor( COLOR_3DSHADOW, pHelperSrc, lParam );
  2732. PaintGlyph(
  2733. dc,rectGlyph.TopLeft(),*pGlyph,ColorValues
  2734. );
  2735. } // else from if( bEnabled )
  2736. }
  2737. void CExtPaintManagerOffice2003::PaintToolbarExpandButton(
  2738. CDC & dc,
  2739. const RECT & rcButtonArea,
  2740. bool bHorz, // if false - down
  2741. bool bBarIsCompletelyVisible,
  2742. bool bEnabled,
  2743. bool bPushed,
  2744. bool bHover,
  2745. CObject * pHelperSrc,
  2746. LPARAM lParam, // = 0L
  2747. bool bTransparentBackground // = false
  2748. )
  2749. {
  2750. ASSERT_VALID( this );
  2751. ASSERT( dc.GetSafeHdc() != NULL );
  2752. if( IsHighContrast() )
  2753. {
  2754. CExtPaintManagerXP::PaintToolbarExpandButton(
  2755. dc,
  2756. rcButtonArea,
  2757. bHorz,
  2758. bBarIsCompletelyVisible,
  2759. bEnabled,
  2760. bPushed,
  2761. bHover,
  2762. pHelperSrc,
  2763. lParam,
  2764. bTransparentBackground
  2765. );
  2766. return;
  2767. }
  2768. CRect rect(rcButtonArea);
  2769. rect.NormalizeRect();
  2770. if( !dc.RectVisible( &rect ) )
  2771. return;
  2772. CExtToolControlBar * pToolBar = NULL;
  2773. bool bStyleOffice2003 = true;
  2774. if( pHelperSrc == NULL
  2775. || (! bEnabled)
  2776. || (! pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtBarContentExpandButton)) )
  2777. || (! GetCb2DbTransparentMode(pHelperSrc) )
  2778. || ::GetDeviceCaps( dc.m_hDC, BITSPIXEL ) <= 8
  2779. )
  2780. {
  2781. bStyleOffice2003 = false;
  2782. }
  2783. else
  2784. {
  2785. pToolBar = ((CExtBarContentExpandButton*)pHelperSrc)->GetBar();
  2786. ASSERT_VALID( pToolBar );
  2787. if( pToolBar->m_bPaletteMode
  2788. || pToolBar->IsFloating()
  2789. || pToolBar->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar))
  2790. || pToolBar->IsKindOf(RUNTIME_CLASS(CExtPanelControlBar))
  2791. || (
  2792. ( pToolBar->m_pDockSite == NULL || pToolBar->m_bPresubclassDialogMode )
  2793. && !pToolBar->m_bForceBalloonGradientInDialogs 
  2794. )
  2795. )
  2796. bStyleOffice2003 = false;
  2797. }
  2798. if( !bStyleOffice2003 )
  2799. {
  2800. CExtPaintManagerXP::PaintToolbarExpandButton(
  2801. dc,
  2802. rcButtonArea,
  2803. bHorz,
  2804. bBarIsCompletelyVisible,
  2805. bEnabled,
  2806. bPushed,
  2807. bHover,
  2808. pHelperSrc,
  2809. lParam,
  2810. bTransparentBackground
  2811. );
  2812. return;
  2813. }
  2814. ASSERT_VALID( pToolBar );
  2815. CRect rcToolbarClientArea;
  2816. pToolBar->GetClientRect( &rcToolbarClientArea );
  2817. CRect rectButton( rect );
  2818. CRect rcBaloonExclude( rcToolbarClientArea );
  2819. CSize _sizeRoundedAreaMerics =
  2820. FixedBar_GetRoundedAreaMerics();
  2821. CSize _sizeRoundedAreaShift( 0, 0 );
  2822. if( g_PaintManager.m_bIsWin9x )
  2823. { // region fix for Win9x
  2824. if( _sizeRoundedAreaMerics.cx > 0
  2825. && _sizeRoundedAreaMerics.cx <= 5
  2826. )
  2827. {
  2828. if( bHorz )
  2829. _sizeRoundedAreaShift.cx =
  2830. __WIN9X_FIXED_BAR_ROUNDED_AREA_SHIFT_X;
  2831. _sizeRoundedAreaMerics.cx +=
  2832. __WIN9X_FIXED_BAR_ROUNDED_AREA_ADJUST_X;
  2833. }
  2834. if( _sizeRoundedAreaMerics.cy > 0
  2835. && _sizeRoundedAreaMerics.cy <= 5
  2836. )
  2837. {
  2838. if( ! bHorz )
  2839. _sizeRoundedAreaShift.cy =
  2840. __WIN9X_FIXED_BAR_ROUNDED_AREA_SHIFT_Y;
  2841. _sizeRoundedAreaMerics.cy +=
  2842. __WIN9X_FIXED_BAR_ROUNDED_AREA_ADJUST_Y;
  2843. }
  2844. } // region fix for Win9x
  2845. if( bHorz )
  2846. {
  2847. rectButton.OffsetRect(
  2848. rcToolbarClientArea.right - rectButton.right,
  2849. 0
  2850. );
  2851. rectButton.InflateRect( 1, 0, 0, 0 );
  2852. rectButton.top = rcToolbarClientArea.top;
  2853. rectButton.bottom = rcToolbarClientArea.bottom - 1;
  2854. rcBaloonExclude.right = rectButton.left + 1;
  2855. rectButton.left -= _sizeRoundedAreaMerics.cx;
  2856. } // if( bHorz )
  2857. else
  2858. {
  2859. rectButton.OffsetRect(
  2860. 0,
  2861. rcToolbarClientArea.bottom - rectButton.bottom
  2862. );
  2863. rectButton.InflateRect( 0, 1, 0, 0 );
  2864. rectButton.left = rcToolbarClientArea.left;
  2865. rectButton.right = rcToolbarClientArea.right - 1;
  2866. rcBaloonExclude.bottom = rectButton.top + 1;
  2867. rectButton.top -= _sizeRoundedAreaMerics.cy;
  2868. } // else from if( bHorz )
  2869. CRgn rgnButton, rgnBE;
  2870. if( (! rgnButton.CreateRoundRectRgn(
  2871. rcToolbarClientArea.left, rcToolbarClientArea.top,
  2872. rcToolbarClientArea.right, rcToolbarClientArea.bottom,
  2873. _sizeRoundedAreaMerics.cx, _sizeRoundedAreaMerics.cy
  2874. )
  2875. )
  2876. || (! rgnBE.CreateRoundRectRgn(
  2877. rcBaloonExclude.left, rcBaloonExclude.top,
  2878. rcBaloonExclude.right, rcBaloonExclude.bottom,
  2879. _sizeRoundedAreaMerics.cx, _sizeRoundedAreaMerics.cy
  2880. )
  2881. )
  2882. || rgnButton.CombineRgn(
  2883. &rgnButton,
  2884. &rgnBE,
  2885. RGN_DIFF
  2886. ) == ERROR
  2887. )
  2888. {
  2889. ASSERT( FALSE );
  2890. CExtPaintManagerXP::PaintToolbarExpandButton(
  2891. dc,
  2892. rcButtonArea,
  2893. bHorz,
  2894. bBarIsCompletelyVisible,
  2895. bEnabled,
  2896. bPushed,
  2897. bHover,
  2898. pHelperSrc,
  2899. lParam,
  2900. bTransparentBackground
  2901. );
  2902. return;
  2903. }
  2904. dc.SelectClipRgn( &rgnButton );
  2905. if( bHover || bPushed )
  2906. {
  2907. CRect rcSolidFill( rectButton );
  2908. rcSolidFill.InflateRect( 1, 1 );
  2909. // dc.FillSolidRect(
  2910. // &rcSolidFill,
  2911. // GetColor(
  2912. // bPushed
  2913. // ? _2003CLR_EXPBTN_PRESSED
  2914. // : _2003CLR_EXPBTN_HOVER,
  2915. // pHelperSrc,
  2916. // lParam
  2917. // )
  2918. // );
  2919. stat_PaintGradientRect(
  2920. dc,
  2921. &rcSolidFill,
  2922. GetColor(
  2923. bPushed
  2924. ? ( bHorz ? _2003CLR_EXPBTN_PRESSED_LIGHT : _2003CLR_EXPBTN_PRESSED_DARK )
  2925. : ( bHorz ? _2003CLR_EXPBTN_HOVER_DARK : _2003CLR_EXPBTN_HOVER_LIGHT )
  2926. ,
  2927. pHelperSrc,
  2928. lParam
  2929. ),
  2930. GetColor(
  2931. bPushed
  2932. ? ( bHorz ? _2003CLR_EXPBTN_PRESSED_DARK : _2003CLR_EXPBTN_PRESSED_LIGHT )
  2933. : ( bHorz ? _2003CLR_EXPBTN_HOVER_LIGHT : _2003CLR_EXPBTN_HOVER_DARK )
  2934. ,
  2935. pHelperSrc,
  2936. lParam
  2937. ),
  2938. bHorz
  2939. );
  2940. } // if( bHover || bPushed )
  2941. else
  2942. {
  2943. if( OnQueryUseThemeColors() )
  2944. {
  2945. stat_PaintGradientRect(
  2946. dc,
  2947. rectButton,
  2948. GetColor(
  2949. bHorz
  2950. ? _2003CLR_EXPBTN_DARK
  2951. : _2003CLR_EXPBTN_LIGHT
  2952. ,
  2953. pHelperSrc,
  2954. lParam
  2955. ),
  2956. GetColor(
  2957. bHorz
  2958. ? _2003CLR_EXPBTN_LIGHT
  2959. : _2003CLR_EXPBTN_DARK
  2960. ,
  2961. pHelperSrc,
  2962. lParam
  2963. ),
  2964. bHorz
  2965. );
  2966. }
  2967. else
  2968. {
  2969. CRect rectButton1(rectButton), rectButton2(rectButton);
  2970. if( bHorz )
  2971. {
  2972. rectButton1.bottom =
  2973. rectButton1.top
  2974. + MulDiv( rectButton1.Height(), 3, 5 );
  2975. rectButton2.top = rectButton1.bottom;
  2976. } // if( bHorz )
  2977. else
  2978. {
  2979. rectButton1.right =
  2980. rectButton1.left
  2981. + MulDiv( rectButton1.Width(), 3, 5 );
  2982. rectButton2.left = rectButton1.right;
  2983. } // else from if( bHorz )
  2984. dc.FillSolidRect(
  2985. &rectButton2,
  2986. GetColor( _2003CLR_EXPBTN_DARK, pHelperSrc, lParam )
  2987. );
  2988. stat_PaintGradientRect(
  2989. dc,
  2990. rectButton1,
  2991. GetColor(
  2992. bHorz
  2993. ? _2003CLR_EXPBTN_DARK
  2994. : _2003CLR_EXPBTN_LIGHT
  2995. ,
  2996. pHelperSrc,
  2997. lParam
  2998. ),
  2999. GetColor(
  3000. bHorz
  3001. ? _2003CLR_EXPBTN_LIGHT
  3002. : _2003CLR_EXPBTN_DARK
  3003. ,
  3004. pHelperSrc,
  3005. lParam
  3006. ),
  3007. bHorz
  3008. );
  3009. }
  3010. } // else from if( bHover || bPushed )
  3011. const glyph_t * pGlyph = NULL, * pGlyph2 = NULL;
  3012. if( bHorz )
  3013. {
  3014. pGlyph = m_pGlyphTbEpBtnH0;
  3015. pGlyph2 = m_pGlyphTbEpBtnH1;
  3016. } // if( bHorz )
  3017. else
  3018. {
  3019. pGlyph = m_pGlyphTbEpBtnV0;
  3020. pGlyph2 = m_pGlyphTbEpBtnV1;
  3021. } // else from if( bHorz )
  3022. ASSERT( pGlyph != NULL );
  3023. ASSERT( pGlyph2 != NULL );
  3024. COLORREF ColorValuesLight[] =
  3025. {
  3026. 0,
  3027. GetColor( _2003CLR_EXPGLYPH_LIGHT, pHelperSrc, lParam )
  3028. };
  3029. COLORREF ColorValuesDark[] =
  3030. {
  3031. 0,
  3032. GetColor( _2003CLR_EXPGLYPH_DARK, pHelperSrc, lParam )
  3033. };
  3034. CRect rectGlyph(rectButton.TopLeft(),pGlyph->Size());
  3035. CRect rectGlyph2(rectGlyph);
  3036. CSize sizePushedOffset = GetPushedOffset();
  3037. if( bHorz )
  3038. {
  3039. int nGap = (max(sizePushedOffset.cy,1)) * 3;
  3040. rectGlyph.OffsetRect(
  3041. (rectButton.Size().cx - pGlyph->Size().cx) / 2 + 1,
  3042. rectButton.Size().cy - pGlyph->Size().cy - nGap - 1
  3043. );
  3044. rectGlyph2.OffsetRect(
  3045. (rectButton.Size().cx - pGlyph2->Size().cx) / 2 + 1,
  3046. nGap + 1
  3047. );
  3048. } // if( bHorz )
  3049. else
  3050. {
  3051. int nGap = (max(sizePushedOffset.cx,1)) * 3;
  3052. rectGlyph.OffsetRect(
  3053. nGap + 1,
  3054. (rectButton.Size().cy - pGlyph->Size().cy)/2 + 1
  3055. );
  3056. rectGlyph2.OffsetRect(
  3057. rectButton.Size().cx - pGlyph2->Size().cx - nGap - 1,
  3058. (rectButton.Size().cy - pGlyph2->Size().cy) / 2 + 1
  3059. );
  3060. ASSERT( m_bExpBtnSwapVGlyphs );
  3061. CRect rcTmp( rectGlyph );
  3062. rectGlyph = rectGlyph2;
  3063. rectGlyph2 = rcTmp;
  3064. } // else from if( bHorz )
  3065. rectGlyph.OffsetRect( _sizeRoundedAreaShift );
  3066. rectGlyph2.OffsetRect( _sizeRoundedAreaShift );
  3067. rectGlyph.OffsetRect( 1, 1 );
  3068. rectGlyph2.OffsetRect( 1, 1 );
  3069. PaintGlyph(
  3070. dc,
  3071. rectGlyph.TopLeft(),
  3072. *pGlyph,
  3073. ColorValuesLight
  3074. );
  3075. if( ! bBarIsCompletelyVisible )
  3076. PaintGlyph(
  3077. dc,
  3078. rectGlyph2.TopLeft(),
  3079. *pGlyph2,
  3080. ColorValuesLight
  3081. );
  3082. rectGlyph.OffsetRect( -1, -1 );
  3083. rectGlyph2.OffsetRect( -1, -1 );
  3084. PaintGlyph(
  3085. dc,
  3086. rectGlyph.TopLeft(),
  3087. *pGlyph,
  3088. ColorValuesDark
  3089. );
  3090. if( ! bBarIsCompletelyVisible )
  3091. PaintGlyph(
  3092. dc,
  3093. rectGlyph2.TopLeft(),
  3094. *pGlyph2,
  3095. ColorValuesDark
  3096. );
  3097. dc.SelectClipRgn( NULL );
  3098. }
  3099. void CExtPaintManagerNativeXP::PaintToolbarExpandButton(
  3100. CDC & dc,
  3101. const RECT & rcButtonArea,
  3102. bool bHorz, // if false - down
  3103. bool bBarIsCompletelyVisible,
  3104. bool bEnabled,
  3105. bool bPushed,
  3106. bool bHover,
  3107. CObject * pHelperSrc,
  3108. LPARAM lParam, // = 0L
  3109. bool bTransparentBackground // = false
  3110. )
  3111. {
  3112. ASSERT_VALID( this );
  3113. ASSERT( dc.GetSafeHdc() != NULL );
  3114. CRect rect(rcButtonArea);
  3115. rect.NormalizeRect();
  3116. if( !dc.RectVisible( &rect ) )
  3117. return;
  3118. if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  3119. {
  3120. CExtPaintManager::PaintToolbarExpandButton(
  3121. dc,
  3122. rcButtonArea,
  3123. bHorz,
  3124. bBarIsCompletelyVisible,
  3125. bEnabled,
  3126. bPushed,
  3127. bHover,
  3128. pHelperSrc,
  3129. lParam,
  3130. bTransparentBackground
  3131. );
  3132. return;
  3133. } // if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  3134. //CExtBarContentExpandButton * pTBB =
  3135. // DYNAMIC_DOWNCAST(
  3136. // CExtBarContentExpandButton,
  3137. // pHelperSrc
  3138. // );
  3139. // ASSERT( pTBB != NULL );
  3140. // ASSERT_VALID( pTBB );
  3141. CExtBarButton * pTBB =
  3142. DYNAMIC_DOWNCAST(
  3143. CExtBarButton,
  3144. pHelperSrc
  3145. );
  3146. ASSERT( pTBB != NULL );
  3147. ASSERT_VALID( pTBB );
  3148. CExtToolControlBar * pBar  = pTBB->GetSafeBar();
  3149. ASSERT( pBar != NULL );
  3150. ASSERT_VALID( pBar );
  3151. if( g_PaintManager.m_UxTheme.OpenThemeData( pBar->GetSafeHwnd(), VSCLASS_TOOLBAR ) != NULL )
  3152. {
  3153. INT nStateID = 
  3154. bHover
  3155. ? TS_HOT
  3156. : bPushed
  3157. ? TS_PRESSED
  3158. : TS_NORMAL;
  3159. //VERIFY( 
  3160. g_PaintManager.m_UxTheme.DrawBackground(
  3161. pBar->GetSafeHwnd(),
  3162. dc.GetSafeHdc(), 
  3163. TP_BUTTON, 
  3164. nStateID, 
  3165. &rcButtonArea, 
  3166. &rcButtonArea
  3167. //) == S_OK
  3168. );
  3169. g_PaintManager.m_UxTheme.CloseThemeData();
  3170. }
  3171. CRect rcButton( rect );
  3172. const glyph_t * pGlyph1 = NULL;
  3173. const glyph_t * pGlyph2 = NULL;
  3174. if( bHorz )
  3175. {
  3176. pGlyph1 = &g_glyph_btn_expand_bottom;
  3177. if( !bBarIsCompletelyVisible )
  3178. pGlyph2 = &g_glyph_btn_expand_right2;
  3179. }
  3180. else
  3181. {
  3182. pGlyph1 = &g_glyph_btn_expand_left;
  3183. if( !bBarIsCompletelyVisible )
  3184. pGlyph2 = &g_glyph_btn_expand_bottom2;
  3185. }
  3186. ASSERT( pGlyph1 != NULL );
  3187. COLORREF ColorValues[] = 
  3188. { 0, ::GetSysColor( bEnabled ? COLOR_BTNTEXT : COLOR_GRAYTEXT ) };
  3189. CRect rectGlyph1( rcButton.TopLeft(), pGlyph1->Size() );
  3190. CRect rectGlyph2( rectGlyph1 );
  3191. if( bHorz )
  3192. {
  3193. INT nGap = 3;
  3194. rectGlyph1.OffsetRect(
  3195. (rcButton.Size().cx - pGlyph1->Size().cx) / 2,
  3196. rcButton.Size().cy - pGlyph1->Size().cy - nGap
  3197. );
  3198. if( pGlyph2 != NULL )
  3199. rectGlyph2.OffsetRect(
  3200. (rcButton.Size().cx - pGlyph2->Size().cx) / 2,
  3201. nGap
  3202. );
  3203. }
  3204. else
  3205. {
  3206. INT nGap = 3;
  3207. rectGlyph1.OffsetRect(
  3208. nGap,
  3209. (rcButton.Size().cy - pGlyph1->Size().cy)/2
  3210. );
  3211. if( pGlyph2 != NULL )
  3212. rectGlyph2.OffsetRect(
  3213. rcButton.Size().cx - pGlyph2->Size().cx - nGap,
  3214. (rcButton.Size().cy - pGlyph2->Size().cy) / 2
  3215. );
  3216. }
  3217. PaintGlyph(
  3218. dc,
  3219. rectGlyph1.TopLeft(),
  3220. *pGlyph1,
  3221. ColorValues
  3222. );
  3223. if( pGlyph2 != NULL )
  3224. PaintGlyph(
  3225. dc,
  3226. rectGlyph2.TopLeft(),
  3227. *pGlyph2,
  3228. ColorValues
  3229. );
  3230. }
  3231. static int CALLBACK stat_FindFontByNameCallBack(
  3232. ENUMLOGFONT * pEnumLogFont,
  3233. NEWTEXTMETRIC * pNewTextMetric,
  3234. DWORD dwFontType,
  3235. LPARAM lParam // zero terminated string
  3236. )
  3237. {
  3238. ASSERT( pEnumLogFont != NULL );
  3239. pNewTextMetric;
  3240. dwFontType;
  3241. __EXT_MFC_SAFE_LPCTSTR sFontToFind =
  3242. reinterpret_cast < const TCHAR * > ( lParam );
  3243. ASSERT( sFontToFind != NULL );
  3244. return
  3245. _tcsicoll(
  3246. pEnumLogFont->elfLogFont.lfFaceName,
  3247. sFontToFind
  3248. );
  3249. }
  3250. static HFONT stat_menu_HFONT_from_current_NONCLIENTMETRICS(
  3251. bool bUseTahomaFont,
  3252. bool bUseCaptionFont
  3253. )
  3254. {
  3255. NONCLIENTMETRICS _ncNfo;
  3256. memset( &_ncNfo, 0, sizeof(NONCLIENTMETRICS) );
  3257. _ncNfo.cbSize = sizeof(NONCLIENTMETRICS);
  3258. if( ! ::SystemParametersInfo( SPI_GETNONCLIENTMETRICS, sizeof(_ncNfo), &_ncNfo, 0 ) )
  3259. {
  3260. return NULL;
  3261. }
  3262. _ncNfo.lfSmCaptionFont.lfCharSet = _ncNfo.lfMenuFont.lfCharSet = (BYTE)GetTextCharset( NULL );
  3263. LPCTSTR strDesiredFontFaceName = (LPCTSTR)g_ResourceManager->DesiredFont_GetFaceName();
  3264. if( LPCTSTR(strDesiredFontFaceName) != NULL
  3265. && INT(_tcslen(LPCTSTR(strDesiredFontFaceName))) > 0
  3266. )
  3267. {
  3268. if( ! ::EnumFontFamilies( NULL, NULL, (FONTENUMPROC)stat_FindFontByNameCallBack, reinterpret_cast < LPARAM > ( strDesiredFontFaceName ) ) )
  3269. {
  3270. __EXT_MFC_STRCPY( _ncNfo.lfMenuFont.lfFaceName, LF_FACESIZE, strDesiredFontFaceName );
  3271. bUseTahomaFont = false;
  3272. }
  3273. }
  3274. if( bUseTahomaFont )
  3275. {
  3276. static __EXT_MFC_SAFE_LPCTSTR g_sTahoma = _T("Tahoma");
  3277. if( ! ::EnumFontFamilies( NULL, NULL, (FONTENUMPROC)stat_FindFontByNameCallBack, reinterpret_cast < LPARAM > ( LPCTSTR( g_sTahoma ) ) ) )
  3278. __EXT_MFC_STRCPY( _ncNfo.lfMenuFont.lfFaceName, LF_FACESIZE, g_sTahoma );
  3279. } // else if( bUseTahomaFont )
  3280. if( bUseCaptionFont )
  3281. return CreateFontIndirect( &_ncNfo.lfSmCaptionFont );
  3282. return CreateFontIndirect( &_ncNfo.lfMenuFont );
  3283. }
  3284. bool CExtPaintManager::NcFrame_IsSupported(
  3285. const CWnd * pWnd,
  3286. LPARAM lParam // = 0L
  3287. ) const
  3288. {
  3289. ASSERT_VALID( this );
  3290. pWnd;
  3291. lParam;
  3292. return false;
  3293. }
  3294. HRGN CExtPaintManager::NcFrame_GenerateSkinFrameRGN(
  3295. const RECT & rcWnd,
  3296. const CWnd * pWnd,
  3297. LPARAM lParam // = 0L
  3298. ) const
  3299. {
  3300. ASSERT_VALID( this );
  3301. ASSERT_VALID( pWnd );
  3302. rcWnd;
  3303. pWnd;
  3304. lParam;
  3305. return ( (HRGN)NULL );
  3306. }
  3307. INT CExtPaintManager::NcFrame_GetCaptionHeight(
  3308. bool bActive,
  3309. const CWnd * pWnd,
  3310. LPARAM lParam // = 0L
  3311. ) const
  3312. {
  3313. ASSERT_VALID( this );
  3314. bActive;
  3315. pWnd;
  3316. lParam;
  3317. return 0;
  3318. }
  3319. INT CExtPaintManagerOffice2007_Impl::NcFrame_GetCaptionHeight(
  3320. bool bActive,
  3321. const CWnd * pWnd,
  3322. LPARAM lParam // = 0L
  3323. ) const
  3324. {
  3325. ASSERT_VALID( this );
  3326. if( IsHighContrast() )
  3327. return 
  3328. CExtPaintManagerXP::NcFrame_GetCaptionHeight(
  3329. bActive,
  3330. pWnd,
  3331. lParam
  3332. );
  3333. INT nCaptionHeight = bActive ? m_nCaptionHeightActive : m_nCaptionHeightInactive;
  3334. nCaptionHeight = UiScalingDo( nCaptionHeight, __EUIST_Y );
  3335. return nCaptionHeight;
  3336. }
  3337. void CExtPaintManager::NcFrame_GetMetrics(
  3338. RECT & rcNcBorders,
  3339. RECT & rcThemePadding,
  3340. const CWnd * pWnd,
  3341. LPARAM lParam // = 0L
  3342. ) const
  3343. {
  3344. ASSERT_VALID( this );
  3345. pWnd;
  3346. lParam;
  3347. ::SetRectEmpty( &rcNcBorders );
  3348. ::SetRectEmpty( &rcThemePadding );
  3349. }
  3350. CRect CExtPaintManager::NcFrame_GetHtRect(
  3351. UINT nHT,
  3352. bool bScreenMapping,
  3353. bool bLayoutBordersH,
  3354. bool bLayoutBordersV,
  3355. const CExtCmdIcon * pIcon,
  3356. const CWnd * pWnd,
  3357. LPMINMAXINFO pMinMaxInfo, // = NULL
  3358. LPARAM lParam // = 0L
  3359. ) const
  3360. {
  3361. ASSERT_VALID( this );
  3362. nHT;
  3363. bScreenMapping;
  3364. bLayoutBordersH,
  3365. bLayoutBordersV,
  3366. pIcon;
  3367. pWnd;
  3368. pMinMaxInfo,
  3369. lParam;
  3370. return CRect( 0, 0, 0, 0 );
  3371. }
  3372. void CExtPaintManager::NcFrame_Paint(
  3373. CDC & dc,
  3374. const CExtCmdIcon * pIcon,
  3375. __EXT_MFC_SAFE_LPCTSTR strCaption,
  3376. UINT nDrawTextAlignFlags,
  3377. const RECT & rcFrame,
  3378. const RECT & rcClient,
  3379. const RECT & rcIcon,
  3380. const RECT & rcText,
  3381. const RECT & rcHelp,
  3382. const RECT & rcMinimize,
  3383. const RECT & rcMaximizeRestore,
  3384. const RECT & rcClose,
  3385. bool bFrameActive,
  3386. bool bFrameEnabled,
  3387. bool bFrameMaximized,
  3388. CExtPaintManager::e_nc_button_state_t eStateButtonHelp,
  3389. CExtPaintManager::e_nc_button_state_t eStateButtonMinimize,
  3390. CExtPaintManager::e_nc_button_state_t eStateButtonMaximizeRestore,
  3391. CExtPaintManager::e_nc_button_state_t eStateButtonClose,
  3392. const CWnd * pWnd,
  3393. LPARAM lParam // = 0L
  3394. ) const
  3395. {
  3396. ASSERT_VALID( this );
  3397. ASSERT( dc.GetSafeHdc() != NULL );
  3398. dc;
  3399. pIcon;
  3400. strCaption;
  3401. nDrawTextAlignFlags;
  3402. rcFrame;
  3403. rcClient;
  3404. rcIcon;
  3405. rcText;
  3406. rcHelp;
  3407. rcMinimize;
  3408. rcMaximizeRestore;
  3409. rcClose;
  3410. bFrameActive;
  3411. bFrameEnabled;
  3412. bFrameMaximized;
  3413. eStateButtonHelp;
  3414. eStateButtonMinimize;
  3415. eStateButtonMaximizeRestore;
  3416. eStateButtonClose;
  3417. pWnd;
  3418. lParam;
  3419. }
  3420. void CExtPaintManager::NcFrame_GetRects(
  3421. CExtCmdIcon * pIcon,
  3422. __EXT_MFC_SAFE_LPCTSTR strCaption,
  3423. UINT nDrawTextAlignFlags,
  3424. RECT & rcIcon,
  3425. RECT & rcText,
  3426. RECT & rcHelp,
  3427. RECT & rcMinimize,
  3428. RECT & rcMaximizeRestore,
  3429. RECT & rcClose,
  3430. const CWnd * pWnd,
  3431. LPMINMAXINFO pMinMaxInfo, // = NULL
  3432. LPARAM lParam // = 0L
  3433. ) const
  3434. {
  3435. ASSERT_VALID( this );
  3436. pIcon;
  3437. strCaption;
  3438. nDrawTextAlignFlags;
  3439. pWnd;
  3440. pMinMaxInfo;
  3441. lParam;
  3442. ::SetRectEmpty( &rcIcon );
  3443. ::SetRectEmpty( &rcText );
  3444. ::SetRectEmpty( &rcHelp );
  3445. ::SetRectEmpty( &rcMinimize );
  3446. ::SetRectEmpty( &rcMaximizeRestore );
  3447. ::SetRectEmpty( &rcClose );
  3448. }
  3449. bool CExtPaintManager::Bar_MiniDockFrameNcCalcSize(
  3450. RECT & rcAdjust,
  3451. CExtMiniDockFrameWnd * pMiniFrameWnd,
  3452. CExtControlBar * pBar,
  3453. LPARAM lParam // = 0
  3454. ) const
  3455. {
  3456. ASSERT_VALID( this );
  3457. ASSERT_VALID( pMiniFrameWnd );
  3458. rcAdjust;
  3459. pMiniFrameWnd;
  3460. pBar;
  3461. lParam;
  3462. return false;
  3463. }
  3464. bool CExtPaintManager::Bar_MiniDockFrameGetNcMetrics(
  3465. INT & nResizingFrameDX,
  3466. INT & nResizingFrameDY,
  3467. INT & nCaptionDY,
  3468. CExtMiniDockFrameWnd * pMiniFrameWnd,
  3469. CExtControlBar * pBar,
  3470. LPARAM lParam // = 0
  3471. ) const
  3472. {
  3473. ASSERT_VALID( this );
  3474. ASSERT_VALID( pMiniFrameWnd );
  3475. pMiniFrameWnd;
  3476. pBar;
  3477. lParam;
  3478. nResizingFrameDX = 3;
  3479. nResizingFrameDY = 3;
  3480. nCaptionDY = 17;
  3481. return true;
  3482. }
  3483. bool CExtPaintManagerNativeXP::Bar_MiniDockFrameGetNcMetrics(
  3484. INT & nResizingFrameDX,
  3485. INT & nResizingFrameDY,
  3486. INT & nCaptionDY,
  3487. CExtMiniDockFrameWnd * pMiniFrameWnd,
  3488. CExtControlBar * pBar,
  3489. LPARAM lParam // = 0
  3490. ) const
  3491. {
  3492. ASSERT_VALID( this );
  3493. ASSERT_VALID( pMiniFrameWnd );
  3494. pMiniFrameWnd;
  3495. pBar;
  3496. lParam;
  3497. nResizingFrameDX = ::GetSystemMetrics( SM_CXSIZEFRAME );
  3498. nResizingFrameDY = ::GetSystemMetrics( SM_CYSIZEFRAME );
  3499. nCaptionDY = ::GetSystemMetrics( SM_CYSMCAPTION );
  3500. return true;
  3501. }
  3502. bool CExtPaintManager::Bar_MiniDockFrameCaptionCalcRect(
  3503. RECT & rcCaption,
  3504. CExtMiniDockFrameWnd * pMiniFrameWnd,
  3505. CExtControlBar * pBar,
  3506. LPARAM lParam // = 0
  3507. ) const
  3508. {
  3509. ASSERT_VALID( this );
  3510. ASSERT_VALID( pMiniFrameWnd );
  3511. if( pMiniFrameWnd == NULL )
  3512. return false;
  3513. INT nResizingFrameDX = 0;
  3514. INT nResizingFrameDY = 0;
  3515. INT nCaptionDY = 0;
  3516. Bar_MiniDockFrameGetNcMetrics(
  3517. nResizingFrameDX,
  3518. nResizingFrameDY,
  3519. nCaptionDY,
  3520. pMiniFrameWnd,
  3521. pBar,
  3522. lParam
  3523. );
  3524. CRect rcFrameCaption;
  3525. ::GetWindowRect( pMiniFrameWnd->GetSafeHwnd(), &rcFrameCaption );
  3526. rcFrameCaption -= rcFrameCaption.TopLeft();
  3527. rcFrameCaption.left  += nResizingFrameDX;
  3528. rcFrameCaption.right -= nResizingFrameDX;
  3529. rcFrameCaption.top   += nResizingFrameDY;
  3530. // rcFrameCaption.bottom =
  3531. // rcFrameCaption.top
  3532. // + nSmallCaptionDY
  3533. // - ::GetSystemMetrics( SM_CYSMSIZE );
  3534. rcFrameCaption.bottom =
  3535. rcFrameCaption.top
  3536. + nCaptionDY;
  3537. ::CopyRect( &rcCaption, &rcFrameCaption );
  3538. return true;
  3539. }
  3540. void CExtPaintManager::PaintResizableBarSeparator(
  3541. CDC & dc,
  3542. const RECT & rc,
  3543. bool bHorz,
  3544. CExtControlBar * pBar,
  3545. LPARAM lParam // = 0
  3546. )
  3547. {
  3548. ASSERT_VALID( this );
  3549. ASSERT_VALID( pBar );
  3550. ASSERT( dc.GetSafeHdc() != NULL );
  3551. dc;
  3552. rc;
  3553. bHorz;
  3554. pBar;
  3555. lParam;
  3556. }
  3557. bool CExtPaintManager::Bar_LayoutNcAreaButton(
  3558. RECT & rcButton,
  3559. const RECT & rcCaption,
  3560. CExtBarNcAreaButton * pLayoutBtn,
  3561. CExtBarNcAreaButton * pPrevBtn,
  3562. CObject * pHelperSrc,
  3563. LPARAM lParam // = 0L
  3564. ) const
  3565. {
  3566. ASSERT_VALID( this );
  3567. ASSERT_VALID( pLayoutBtn );
  3568. rcButton;
  3569. rcCaption;
  3570. pLayoutBtn;
  3571. pPrevBtn;
  3572. pHelperSrc;
  3573. lParam;
  3574. return false;
  3575. }
  3576. bool CExtPaintManagerNativeXP::Bar_LayoutNcAreaButton(
  3577. RECT & rcButton,
  3578. const RECT & rcCaption,
  3579. CExtBarNcAreaButton * pLayoutBtn,
  3580. CExtBarNcAreaButton * pPrevBtn,
  3581. CObject * pHelperSrc,
  3582. LPARAM lParam // = 0L
  3583. ) const
  3584. {
  3585. ASSERT_VALID( this );
  3586. ASSERT_VALID( pLayoutBtn );
  3587. if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  3588. return
  3589. CExtPaintManager::Bar_LayoutNcAreaButton(
  3590. rcButton,
  3591. rcCaption,
  3592. pLayoutBtn,
  3593. pPrevBtn,
  3594. pHelperSrc,
  3595. lParam
  3596. );
  3597. CSize szPart(0,0);
  3598. if( g_PaintManager.m_UxTheme.OpenThemeData( NULL, VSCLASS_WINDOW ) != NULL )
  3599. {
  3600. CWindowDC dc( NULL );
  3601. VERIFY(
  3602. g_PaintManager.m_UxTheme.GetThemePartSize(
  3603. dc.GetSafeHdc(), 
  3604. WP_SMALLCLOSEBUTTON, 
  3605. CBS_NORMAL, 
  3606. NULL, 
  3607. CExtUxTheme::__EXT_UX_TS_TRUE,
  3608. &szPart
  3609. ) == S_OK
  3610. );
  3611. g_PaintManager.m_UxTheme.CloseThemeData();
  3612. }
  3613. const int _nGapToBordersH = 2;
  3614. const int _nGapToBordersV = 3;
  3615. const int _nGapBetweenButtons = 3;
  3616. INT x = rcCaption.right - szPart.cx;
  3617. INT y = rcCaption.top;
  3618. CRect rc( x, y, x + szPart.cx, y + szPart.cy );
  3619. rc.OffsetRect( 
  3620. -_nGapToBordersH,
  3621. _nGapToBordersV 
  3622. );
  3623. if( pPrevBtn != NULL )
  3624. {
  3625. const CRect & rcPrev = *pPrevBtn;
  3626. rc.OffsetRect(
  3627. rcPrev.left - rc.right - _nGapBetweenButtons,
  3628. 0
  3629. );
  3630. }
  3631. rcButton = rc;
  3632. return true;
  3633. }
  3634. CRect CExtPaintManager::Bar_GetCaptionBordersForText(
  3635. CExtControlBar * pBar,
  3636. LPARAM lParam // = 0
  3637. ) const
  3638. {
  3639. ASSERT_VALID( this );
  3640. ASSERT_VALID( pBar );
  3641. pBar;
  3642. lParam;
  3643. return CRect( 0, 0, 0, 0 );
  3644. }
  3645. INT CExtPaintManager::Bar_SeparatorWidthGet(
  3646. CExtControlBar * pBar,
  3647. LPARAM lParam // = 0
  3648. ) const
  3649. {
  3650. ASSERT_VALID( this );
  3651. ASSERT_VALID( pBar );
  3652. pBar;
  3653. lParam;
  3654. return -1;
  3655. }
  3656. INT CExtPaintManager::Bar_SeparatorHeightGet(
  3657. CExtControlBar * pBar,
  3658. LPARAM lParam // = 0
  3659. ) const
  3660. {
  3661. ASSERT_VALID( this );
  3662. ASSERT_VALID( pBar );
  3663. pBar;
  3664. lParam;
  3665. return -1;
  3666. }
  3667. INT CExtPaintManager::Bar_GripperWidthAtLeftGet(
  3668. CExtControlBar * pBar,
  3669. LPARAM lParam // = 0
  3670. ) const
  3671. {
  3672. ASSERT_VALID( this );
  3673. ASSERT_VALID( pBar );
  3674. pBar;
  3675. lParam;
  3676. return -1;
  3677. }
  3678. INT CExtPaintManager::Bar_GripperHeightAtTopGet(
  3679. CExtControlBar * pBar,
  3680. LPARAM lParam // = 0
  3681. ) const
  3682. {
  3683. ASSERT_VALID( this );
  3684. ASSERT_VALID( pBar );
  3685. pBar;
  3686. lParam;
  3687. return -1;
  3688. }
  3689. HFONT CExtPaintManager::Bar_GetCaptionFont(
  3690. bool bHorz,
  3691. CExtToolControlBar * pBar,
  3692. LPARAM lParam // = 0
  3693. )
  3694. {
  3695. ASSERT_VALID( this );
  3696. ASSERT_VALID( pBar );
  3697. bHorz;
  3698. pBar;
  3699. lParam;
  3700. return NULL;
  3701. }
  3702. CSize CExtPaintManager::Toolbar_GetMinButtonSize(
  3703. CObject * pHelperSrc,
  3704. LPARAM lParam // = 0
  3705. )
  3706. {
  3707. ASSERT_VALID( this );
  3708. pHelperSrc;
  3709. lParam;
  3710. return CSize( 0, 0 );
  3711. }
  3712. void CExtPaintManager::Toolbar_AdjustButtonSize(
  3713. CExtBarButton * pTBB,
  3714. CSize & sizePreCalc
  3715. )
  3716. {
  3717. ASSERT_VALID( this );
  3718. ASSERT_VALID( pTBB );
  3719. pTBB;
  3720. sizePreCalc;
  3721. }
  3722. HFONT CExtPaintManager::Toolbar_GetFont(
  3723. bool bHorz,
  3724. CExtControlBar * pBar,
  3725. LPARAM lParam // = 0
  3726. )
  3727. {
  3728. ASSERT_VALID( this );
  3729. ASSERT_VALID( pBar );
  3730. bHorz;
  3731. pBar;
  3732. lParam;
  3733. return NULL;
  3734. }
  3735. bool CExtPaintManager::Toolbar_GetBGInfo(
  3736. RECT & rcBorders,
  3737. INT & nGripWidthAtLeft,
  3738. INT & nGripHeightAtTop,
  3739. CExtToolControlBar * pBar,
  3740. LPARAM lParam // = 0
  3741. ) const
  3742. {
  3743. ASSERT_VALID( this );
  3744. ASSERT_VALID( pBar );
  3745. rcBorders;
  3746. nGripWidthAtLeft;
  3747. nGripHeightAtTop;
  3748. pBar;
  3749. lParam;
  3750. return false;
  3751. }
  3752. bool CExtPaintManager::Toolbar_GetSizeOfCEB(
  3753. SIZE & sizeReal,
  3754. const SIZE & sizePreCalc,
  3755. CDC & dc,
  3756. BOOL bHorz,
  3757. CExtBarContentExpandButton * pTBB,
  3758. LPARAM lParam // = 0
  3759. )
  3760. {
  3761. ASSERT_VALID( this );
  3762. ASSERT_VALID( pTBB );
  3763. sizeReal;
  3764. sizePreCalc;
  3765. dc;
  3766. bHorz;
  3767. pTBB;
  3768. lParam;
  3769. return false;
  3770. }
  3771. bool CExtPaintManagerNativeXP::Toolbar_GetSizeOfCEB(
  3772. SIZE & sizeReal,
  3773. const SIZE & sizePreCalc,
  3774. CDC & dc,
  3775. BOOL bHorz,
  3776. CExtBarContentExpandButton * pTBB,
  3777. LPARAM lParam // = 0
  3778. )
  3779. {
  3780. ASSERT_VALID( this );
  3781. ASSERT_VALID( pTBB );
  3782. if( ! g_PaintManager.m_UxTheme.IsControlsThemed() )
  3783. return
  3784. CExtPaintManager::Toolbar_GetSizeOfCEB(
  3785. sizeReal,
  3786. sizePreCalc,
  3787. dc,
  3788. bHorz,
  3789. pTBB,
  3790. lParam
  3791. );
  3792. if( bHorz )
  3793. {
  3794. sizeReal.cx = 15;
  3795. sizeReal.cy = sizePreCalc.cy;
  3796. }
  3797. else
  3798. {
  3799. sizeReal.cx = sizePreCalc.cx;
  3800. sizeReal.cy = 15;
  3801. }
  3802. return true;
  3803. }
  3804. void CExtPaintManager::AdvTip_CalcRgn(
  3805. HRGN hRgnPrecalc,
  3806. const RECT & rcRectRgn,
  3807. bool bDynamicShadowApplied,
  3808. INT nSizeInnerShadowIncluded,
  3809. CObject * pHelperSrc,
  3810. LPARAM lParam // = 0L
  3811. )
  3812. {
  3813. ASSERT_VALID( this );
  3814. ASSERT( hRgnPrecalc != NULL );
  3815. ASSERT( nSizeInnerShadowIncluded >= 0 );
  3816. hRgnPrecalc;
  3817. rcRectRgn;
  3818. bDynamicShadowApplied;
  3819. nSizeInnerShadowIncluded;
  3820. pHelperSrc;
  3821. lParam;
  3822. }
  3823. void CExtPaintManagerNativeXP::AdvTip_CalcRgn(
  3824. HRGN hRgnPrecalc,
  3825. const RECT & rcRectRgn,
  3826. bool bDynamicShadowApplied,
  3827. INT nSizeInnerShadowIncluded,
  3828. CObject * pHelperSrc,
  3829. LPARAM lParam // = 0L
  3830. )
  3831. {
  3832. ASSERT_VALID( this );
  3833. ASSERT( hRgnPrecalc != NULL );
  3834. ASSERT( nSizeInnerShadowIncluded >= 0 );
  3835. CExtPaintManager::AdvTip_CalcRgn(
  3836. hRgnPrecalc,
  3837. rcRectRgn,
  3838. bDynamicShadowApplied,
  3839. nSizeInnerShadowIncluded,
  3840. pHelperSrc,
  3841. lParam
  3842. );
  3843. }
  3844. void CExtPaintManagerOffice2007_Impl::AdvTip_CalcRgn(
  3845. HRGN hRgnPrecalc,
  3846. const RECT & rcRectRgn,
  3847. bool bDynamicShadowApplied,
  3848. INT nSizeInnerShadowIncluded,
  3849. CObject * pHelperSrc,
  3850. LPARAM lParam // = 0L
  3851. )
  3852. {
  3853. ASSERT_VALID( this );
  3854. ASSERT( hRgnPrecalc != NULL );
  3855. ASSERT( nSizeInnerShadowIncluded >= 0 );
  3856. if( IsHighContrast() )
  3857. {
  3858. CExtPaintManagerXP::AdvTip_CalcRgn(
  3859. hRgnPrecalc,
  3860. rcRectRgn,
  3861. bDynamicShadowApplied,
  3862. nSizeInnerShadowIncluded,
  3863. pHelperSrc,
  3864. lParam
  3865. );
  3866. return;
  3867. }
  3868. if( ! m_bAdvTipOnePxExcludeMode)
  3869. return;
  3870. CRect rc = rcRectRgn;
  3871. rc.DeflateRect( 0, 0, nSizeInnerShadowIncluded, nSizeInnerShadowIncluded );
  3872. //CRgn _arrRgnOnePx[12];
  3873. // if( (! _arrRgnOnePx[0].CreateRectRgn( rc.left, rc.top, rc.left + 1, rc.top + 1 ) )
  3874. // || (! _arrRgnOnePx[1].CreateRectRgn( rc.left + 1, rc.top, rc.left + 2, rc.top + 1 ) )
  3875. // || (! _arrRgnOnePx[2].CreateRectRgn( rc.left, rc.top + 1, rc.left + 1, rc.top + 2 ) )
  3876. // || (! _arrRgnOnePx[3].CreateRectRgn( rc.right - 1, rc.top, rc.right, rc.top + 1 ) )
  3877. // || (! _arrRgnOnePx[4].CreateRectRgn( rc.right - 2, rc.top, rc.right - 1, rc.top + 1 ) )
  3878. // || (! _arrRgnOnePx[5].CreateRectRgn( rc.right - 1, rc.top + 1, rc.right, rc.top + 2 ) )
  3879. // || (! _arrRgnOnePx[6].CreateRectRgn( rc.left, rc.bottom - 1, rc.left + 1, rc.bottom ) )
  3880. // || (! _arrRgnOnePx[7].CreateRectRgn( rc.left + 1, rc.bottom - 1, rc.left + 2, rc.bottom ) )
  3881. // || (! _arrRgnOnePx[8].CreateRectRgn( rc.left, rc.bottom - 2, rc.left + 1, rc.bottom - 1 ) )
  3882. // || (! _arrRgnOnePx[9].CreateRectRgn( rc.right - 1, rc.bottom - 1, rc.right, rc.bottom ) )
  3883. // || (! _arrRgnOnePx[10].CreateRectRgn( rc.right - 2, rc.bottom - 1, rc.right - 1, rc.bottom ) )
  3884. // || (! _arrRgnOnePx[11].CreateRectRgn( rc.right - 1, rc.bottom - 2, rc.right, rc.bottom - 1 ) )
  3885. // )
  3886. // return;
  3887. CRgn _arrRgnOnePx[4];
  3888. if( (! _arrRgnOnePx[0].CreateRectRgn( rc.left, rc.top, rc.left + 1, rc.top + 1 ) )
  3889. || (! _arrRgnOnePx[1].CreateRectRgn( rc.right - 1, rc.top, rc.right, rc.top + 1 ) )
  3890. || (! _arrRgnOnePx[2].CreateRectRgn( rc.left, rc.bottom - 1, rc.left + 1, rc.bottom ) )
  3891. || (! _arrRgnOnePx[3].CreateRectRgn( rc.right - 1, rc.bottom - 1, rc.right, rc.bottom ) )
  3892. )
  3893. return;
  3894. INT nRgnIndex, nRgnCount = sizeof(_arrRgnOnePx) / sizeof(_arrRgnOnePx[0]);
  3895. if( nSizeInnerShadowIncluded > 0
  3896. || bDynamicShadowApplied
  3897. )
  3898. nRgnCount --; // -= 3;
  3899. for( nRgnIndex = 0; nRgnIndex < nRgnCount; nRgnIndex ++ )
  3900. ::CombineRgn( hRgnPrecalc, hRgnPrecalc, HRGN(_arrRgnOnePx[nRgnIndex].GetSafeHandle()), RGN_DIFF );
  3901. }
  3902. bool CExtPaintManager::AdvTip_PaintBackground(
  3903. CDC & dc,
  3904. const RECT & rcClient,
  3905. bool bAdvTipWithShadow,
  3906. CObject * pHelperSrc,
  3907. LPARAM lParam // = 0L
  3908. )
  3909. {
  3910. ASSERT_VALID( this );
  3911. ASSERT( dc.GetSafeHdc() != NULL );
  3912. dc;
  3913. rcClient;
  3914. bAdvTipWithShadow;
  3915. pHelperSrc;
  3916. lParam;
  3917. return false;
  3918. }
  3919. bool CExtPaintManagerNativeXP::AdvTip_PaintBackground(
  3920. CDC & dc,
  3921. const RECT & rcClient,
  3922. bool bAdvTipWithShadow,
  3923. CObject * pHelperSrc,
  3924. LPARAM lParam // = 0L
  3925. )
  3926. {
  3927. ASSERT_VALID( this );
  3928. ASSERT( dc.GetSafeHdc() != NULL );
  3929. return
  3930. CExtPaintManager::AdvTip_PaintBackground(
  3931. dc,
  3932. rcClient,
  3933. bAdvTipWithShadow,
  3934. pHelperSrc,
  3935. lParam
  3936. );
  3937. }
  3938. bool CExtPaintManagerOffice2007_Impl::AdvTip_PaintBackground(
  3939. CDC & dc,
  3940. const RECT & rcClient,
  3941. bool bAdvTipWithShadow,
  3942. CObject * pHelperSrc,
  3943. LPARAM lParam // = 0L
  3944. )
  3945. {
  3946. ASSERT_VALID( this );
  3947. ASSERT( dc.GetSafeHdc() != NULL );
  3948. if( IsHighContrast() )
  3949. return 
  3950. CExtPaintManagerXP::AdvTip_PaintBackground(
  3951. dc,
  3952. rcClient,
  3953. bAdvTipWithShadow,
  3954. pHelperSrc,
  3955. lParam
  3956. );
  3957. CRect rcGradient = rcClient;
  3958. rcGradient.DeflateRect(
  3959. m_rcAdvTipPaddingGradient.left,
  3960. m_rcAdvTipPaddingGradient.top,
  3961. m_rcAdvTipPaddingGradient.right,
  3962. m_rcAdvTipPaddingGradient.bottom
  3963. );
  3964. stat_PaintGradientRect(
  3965. dc,
  3966. rcGradient,
  3967. m_clrAdvTipGradientBottom,
  3968. m_clrAdvTipGradientTop,
  3969. true,
  3970. 255
  3971. );
  3972. m_bmpAdvTipBorder.AlphaBlendSkinParts(
  3973. dc,
  3974. rcClient,
  3975. m_rcAdvTipPaddingBorder,
  3976. CExtBitmap::__EDM_STRETCH,
  3977. true,
  3978. true
  3979. );
  3980. return true;
  3981. }
  3982. CFont * CExtPaintManager::AdvTip_GetFont(
  3983. CObject * pHelperSrc,
  3984. LPARAM lParam // = 0L
  3985. )
  3986. {
  3987. ASSERT_VALID( this );
  3988. pHelperSrc;
  3989. lParam;
  3990. return NULL;
  3991. }
  3992. CFont * CExtPaintManagerNativeXP::AdvTip_GetFont(
  3993. CObject * pHelperSrc,
  3994. LPARAM lParam // = 0L
  3995. )
  3996. {
  3997. ASSERT_VALID( this );
  3998. return
  3999. CExtPaintManager::AdvTip_GetFont(
  4000. pHelperSrc,
  4001. lParam
  4002. );
  4003. }
  4004. CFont * CExtPaintManagerOffice2007_Impl::AdvTip_GetFont(
  4005. CObject * pHelperSrc,
  4006. LPARAM lParam // = 0L
  4007. )
  4008. {
  4009. ASSERT_VALID( this );
  4010. if( IsHighContrast() )
  4011. return 
  4012. CExtPaintManagerXP::AdvTip_GetFont(
  4013. pHelperSrc,
  4014. lParam
  4015. );
  4016. return NULL;
  4017. }
  4018. COLORREF CExtPaintManager::AdvTip_GetTextColor(
  4019. CObject * pHelperSrc,
  4020. LPARAM lParam // = 0L
  4021. )
  4022. {
  4023. ASSERT_VALID( this );
  4024. pHelperSrc;
  4025. lParam;
  4026. return COLORREF(-1L);
  4027. }
  4028. COLORREF CExtPaintManagerNativeXP::AdvTip_GetTextColor(
  4029. CObject * pHelperSrc,
  4030. LPARAM lParam // = 0L
  4031. )
  4032. {
  4033. ASSERT_VALID( this );
  4034. pHelperSrc;
  4035. lParam;
  4036. return
  4037. CExtPaintManager::AdvTip_GetTextColor(
  4038. pHelperSrc,
  4039. lParam
  4040. );
  4041. }
  4042. COLORREF CExtPaintManagerOffice2007_Impl::AdvTip_GetTextColor(
  4043. CObject * pHelperSrc,
  4044. LPARAM lParam // = 0L
  4045. )
  4046. {
  4047. ASSERT_VALID( this );
  4048. if( IsHighContrast() )
  4049. return 
  4050. CExtPaintManagerXP::AdvTip_GetTextColor(
  4051. pHelperSrc,
  4052. lParam
  4053. );
  4054. return m_clrAdvTipText;
  4055. }
  4056. #ifndef __EXT_MFC_NO_STATUSBAR
  4057. bool CExtPaintManager::StatusBar_QuerySkinSupport(
  4058. const CExtStatusControlBar * pStatusBar,
  4059. LPARAM lParam // = 0
  4060. ) const
  4061. {
  4062. ASSERT_VALID( this );
  4063. ASSERT_VALID( pStatusBar );
  4064. pStatusBar;
  4065. lParam;
  4066. return false;
  4067. }
  4068. bool CExtPaintManager::StatusBar_EraseBackground(
  4069. CDC & dc,
  4070. const RECT & rcClient,
  4071. const CExtStatusControlBar * pStatusBar,
  4072. LPARAM lParam // = 0
  4073. ) const
  4074. {
  4075. ASSERT_VALID( this );
  4076. ASSERT( dc.GetSafeHdc() != NULL );
  4077. ASSERT_VALID( pStatusBar );
  4078. dc;
  4079. rcClient;