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

界面编程

开发平台:

Visual C++

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