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

界面编程

开发平台:

Visual C++

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