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

界面编程

开发平台:

Visual C++

  1. // This is part of the Professional User Interface Suite library.
  2. // Copyright (C) 2001-2009 FOSS Software, Inc.
  3. // All rights reserved.
  4. //
  5. // http://www.prof-uis.com
  6. // mailto:support@prof-uis.com
  7. //
  8. // This source code can be used, modified and redistributed
  9. // under the terms of the license agreement that is included
  10. // in the Professional User Interface Suite package.
  11. //
  12. // Warranties and Disclaimers:
  13. // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
  14. // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  16. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
  17. // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
  18. // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
  19. // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
  20. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  21. #include "StdAfx.h"
  22. #if (!defined __PROF_SKIN_PAINT_MANAGER_H)
  23. #include <../ProfSkin/ExtSkinPaintManager.h>
  24. #endif
  25. #if (! defined __EXTMINIDOCKFRAMEWND_H)
  26. #include <../Src/ExtMiniDockFrameWnd.h>
  27. #endif
  28. #if (!defined __EXTDOCKBAR_H)
  29. #include <../Src/ExtDockBar.h>
  30. #endif
  31. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  32. #if (!defined __EXT_CONTROLBAR_TABBED_FEATURES_H)
  33. #include <../Src/ExtControlBarTabbedFeatures.h>
  34. #endif // __EXT_CONTROLBAR_TABBED_FEATURES_H
  35. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  36. #if (! defined __VSSYM32_H__)
  37. #include <vssym32/vssym32.h>
  38. #endif // (! defined __VSSYM32_H__)
  39. #ifdef _DEBUG
  40. #define new DEBUG_NEW
  41. #undef THIS_FILE
  42. static char THIS_FILE[] = __FILE__;
  43. #endif
  44. IMPLEMENT_SERIAL( CExtPaintManagerSkin, CExtPaintManager, VERSIONABLE_SCHEMA|1 );
  45. CExtPaintManagerSkin::CExtPaintManagerSkin(void)
  46. {
  47. m_bUseTahomaFont = false;
  48. #if (!defined __EXT_MFC_NO_PAGECONTAINER_CTRL)
  49. m_bPageContainerUseButtonStyle = true;
  50. m_bPageContainerUseGroupBoxStyle = true;
  51. m_bPageContainerNoEmbossDisabledText = true;
  52. #endif // (!defined __EXT_MFC_NO_PAGECONTAINER_CTRL)
  53. #if (!defined __EXT_MFC_NO_SHORTCUTLIST_CTRL)
  54. m_bShortcutListUseButtonStyleInScrollButtons = true;
  55. m_bShortcutListUseDockerBkgnd = true;
  56. m_bShortcutListItemUseButtonStyle = true;
  57. #endif // (!defined __EXT_MFC_NO_SHORTCUTLIST_CTRL)
  58. }
  59. CExtPaintManagerSkin::~CExtPaintManagerSkin(void)
  60. {
  61. }
  62. void CExtPaintManagerSkin::SerializeSynchronizationData( CArchive & ar )
  63. {
  64. ASSERT_VALID( this );
  65. m_Skin.Serialize( ar );
  66. }
  67. bool CExtPaintManagerSkin::OnStateSerialize(
  68. CArchive & ar,
  69. bool bEnableThrowExceptions // = false
  70. )
  71. {
  72. try
  73. {
  74. m_Skin.SerializeCompressedBlock( ar, bEnableThrowExceptions );
  75. return true;
  76. }
  77. catch( CException * pXept )
  78. {
  79. if( bEnableThrowExceptions )
  80. throw;
  81. pXept->Delete();
  82. }
  83. catch( ... )
  84. {
  85. if( bEnableThrowExceptions )
  86. throw;
  87. }
  88. return false;
  89. }
  90. bool CExtPaintManagerSkin::NcFrame_IsSupported(
  91. const CWnd * pWnd,
  92. LPARAM lParam // = 0L
  93. ) const
  94. {
  95. ASSERT_VALID( this );
  96. lParam;
  97. if( pWnd == NULL )
  98. return false;
  99. //ASSERT_VALID( pWnd );
  100. if( pWnd->GetSafeHwnd() == NULL )
  101. return false;
  102. //DWORD dwStyle = pWnd->GetStyle();
  103. // if( (dwStyle&WS_CHILD) != 0 )
  104. // return false;
  105. return true;
  106. }
  107. HRGN CExtPaintManagerSkin::NcFrame_GenerateSkinFrameRGN(
  108. const RECT & rcWnd,
  109. const CWnd * pWnd,
  110. LPARAM lParam // = 0L
  111. ) const
  112. {
  113. ASSERT_VALID( this );
  114. ASSERT_VALID( pWnd );
  115. rcWnd;
  116. lParam;
  117. const CExtSkinGlyph & glyphFrame = m_Skin[_T("NcFrame")][_T("NcArea")].Glyph(_T("Inactive"));
  118. //CRect rcNcBorders = glyphFrame.GetContentPadding();
  119. CRect rcThemePadding = glyphFrame.GetPadding();
  120. bool bRTL = ( (pWnd->GetExStyle()&WS_EX_LAYOUTRTL) != 0 ) ? true : false;
  121. HRGN hRgn =
  122. glyphFrame.GetBitmap().GenerateSkinFrameAlphaRGN(
  123. bRTL,
  124. rcWnd,
  125. rcThemePadding
  126. );
  127. return hRgn;
  128. }
  129. INT CExtPaintManagerSkin::NcFrame_GetCaptionHeight(
  130. bool bActive,
  131. const CWnd * pWnd,
  132. LPARAM lParam // = 0L
  133. ) const
  134. {
  135. ASSERT_VALID( this );
  136. bActive;
  137. pWnd;
  138. lParam;
  139. CRect rcCaption =
  140. NcFrame_GetHtRect(
  141. HTCAPTION,
  142. false,
  143. true,
  144. true,
  145. NULL,
  146. pWnd,
  147. NULL
  148. );
  149. return rcCaption.Height();
  150. }
  151. void CExtPaintManagerSkin::NcFrame_GetMetrics(
  152. RECT & rcNcBorders,
  153. RECT & rcThemePadding,
  154. const CWnd * pWnd,
  155. LPARAM lParam // = 0L
  156. ) const
  157. {
  158. ASSERT_VALID( this );
  159. ASSERT( NcFrame_IsSupported( pWnd ) );
  160. rcNcBorders;
  161. rcThemePadding;
  162. pWnd;
  163. lParam;
  164. const CExtSkinGlyph & glyphFrame = m_Skin[_T("NcFrame")][_T("NcArea")].Glyph(_T("Inactive"));
  165. rcNcBorders = glyphFrame.GetContentPadding();
  166. rcThemePadding = glyphFrame.GetPadding();
  167. }
  168. CRect CExtPaintManagerSkin::NcFrame_GetHtRect(
  169. UINT nHT,
  170. bool bScreenMapping,
  171. bool bLayoutBordersH,
  172. bool bLayoutBordersV,
  173. const CExtCmdIcon * pIcon,
  174. const CWnd * pWnd,
  175. LPMINMAXINFO pMinMaxInfo, // = NULL
  176. LPARAM lParam // = 0L
  177. ) const
  178. {
  179. ASSERT_VALID( this );
  180. ASSERT( NcFrame_IsSupported( pWnd ) );
  181. CRect rcNcBorders, rcThemePadding;
  182. NcFrame_GetMetrics(
  183. rcNcBorders,
  184. rcThemePadding,
  185. pWnd,
  186. lParam
  187. );
  188. CRect rcWnd;
  189. pWnd->GetWindowRect( &rcWnd );
  190. if( ! bScreenMapping )
  191. rcWnd.OffsetRect( -rcWnd.TopLeft() );
  192. bool bZoomed = pWnd->IsZoomed()? true : false;
  193. bool bSupportsResizingH = bLayoutBordersH;
  194. bool bSupportsResizingV = bLayoutBordersV;
  195. DWORD dwWndStyle = pWnd->GetStyle();
  196. if( (dwWndStyle&WS_THICKFRAME) != 0
  197. && ( (! bSupportsResizingH )
  198. || (! bSupportsResizingV )
  199. )
  200. )
  201. {
  202. bool bHaveMinMaxInfo = false;
  203. MINMAXINFO _mmi;
  204. if( pMinMaxInfo != NULL )
  205. {
  206. bHaveMinMaxInfo = true;
  207. __EXT_MFC_MEMCPY( 
  208. &_mmi, 
  209. sizeof(MINMAXINFO),
  210. pMinMaxInfo, 
  211. sizeof(MINMAXINFO) 
  212. );
  213. } // if( pMinMaxInfo != NULL )
  214. else
  215. {
  216. ::memset( &_mmi, 0, sizeof(MINMAXINFO) );
  217. monitor_parms_t _mp;
  218. stat_GetMonitorParms( _mp, (CWnd*)pWnd );
  219. _mmi.ptMaxPosition.x = _mp.m_rcWorkArea.left;
  220. _mmi.ptMaxPosition.y = _mp.m_rcWorkArea.top;
  221. _mmi.ptMaxTrackSize.x = _mp.m_rcWorkArea.Width(); // ::GetSystemMetrics( SM_CXMAXTRACK );
  222. _mmi.ptMaxTrackSize.y = _mp.m_rcWorkArea.Height(); // ::GetSystemMetrics( SM_CYMAXTRACK );
  223. _mmi.ptMinTrackSize.x = ::GetSystemMetrics( SM_CXMINTRACK );
  224. _mmi.ptMinTrackSize.y = ::GetSystemMetrics( SM_CYMINTRACK );
  225. _mmi.ptMaxSize.x = _mmi.ptMaxTrackSize.x;
  226. _mmi.ptMaxSize.y = _mmi.ptMaxTrackSize.y;
  227. if( ((CWnd*)pWnd)->SendMessage( WM_GETMINMAXINFO, 0, LPARAM(&_mmi) ) == 0 )
  228. bHaveMinMaxInfo = true;
  229. } // else from if( pMinMaxInfo != NULL )
  230. if( bHaveMinMaxInfo )
  231. {
  232. if( _mmi.ptMinTrackSize.x < _mmi.ptMaxTrackSize.x )
  233. bSupportsResizingH = true;
  234. if( _mmi.ptMinTrackSize.y < _mmi.ptMaxTrackSize.y )
  235. bSupportsResizingV = true;
  236. } // if( bHaveMinMaxInfo )
  237. } // if( (dwWndStyle&WS_THICKFRAME) != 0 ...
  238. switch( nHT )
  239. {
  240. case HTSYSMENU:
  241. {
  242. if( (dwWndStyle&WS_SYSMENU) == 0 )
  243. break;
  244. int nIconAreaWidth = 0;
  245. if( pIcon != NULL && (! pIcon->IsEmpty() ) )
  246. nIconAreaWidth = pIcon->GetSize().cx + 2;
  247. return
  248. CRect(
  249. rcWnd.left + ( bSupportsResizingH ? rcNcBorders.left : 0 ),
  250. rcWnd.top + ( bSupportsResizingV ? rcNcBorders.top : 0 ),
  251. rcWnd.left + ( bSupportsResizingH ? rcNcBorders.left : 0 )
  252. + nIconAreaWidth,
  253. rcWnd.top + rcThemePadding.top
  254. );
  255. }
  256. case HTCAPTION:
  257. // if( (dwWndStyle&WS_CAPTION) == 0 )
  258. // break;
  259. return
  260. CRect(
  261. rcWnd.left + (bZoomed ? 0 : ( bSupportsResizingH ? rcNcBorders.left : 0 ) ),
  262. rcWnd.top + (bZoomed ? 0 : ( bSupportsResizingV ? rcNcBorders.top : 0 ) ),
  263. rcWnd.right - (bZoomed ? 0 : ( bSupportsResizingH ? rcNcBorders.right : 0 ) ),
  264. rcWnd.top + rcThemePadding.top
  265. );
  266. case HTTOP:
  267. if( bZoomed || (! bSupportsResizingV ) )
  268. break;
  269. return
  270. CRect(
  271. rcWnd.left + ( bSupportsResizingH ? rcNcBorders.left : 0 ),
  272. rcWnd.top,
  273. rcWnd.right - ( bSupportsResizingH ? rcNcBorders.right : 0 ),
  274. rcWnd.top + rcNcBorders.top
  275. );
  276. case HTBOTTOM:
  277. if( bZoomed || (! bSupportsResizingV ) )
  278. break;
  279. return
  280. CRect(
  281. rcWnd.left + ( bSupportsResizingH ? rcNcBorders.left : 0 ),
  282. rcWnd.bottom - rcNcBorders.bottom,
  283. rcWnd.right - ( bSupportsResizingH ? rcNcBorders.right : 0 ),
  284. rcWnd.bottom
  285. );
  286. case HTLEFT:
  287. if( bZoomed || (! bSupportsResizingH ) )
  288. break;
  289. return
  290. CRect(
  291. rcWnd.left,
  292. rcWnd.top + ( bSupportsResizingV ? rcNcBorders.top : 0 ),
  293. rcWnd.left + rcNcBorders.left,
  294. rcWnd.bottom - ( bSupportsResizingV ? rcNcBorders.bottom : 0 )
  295. );
  296. case HTRIGHT:
  297. if( bZoomed || (! bSupportsResizingH ) )
  298. break;
  299. return
  300. CRect(
  301. rcWnd.right - rcNcBorders.right,
  302. rcWnd.top + ( bSupportsResizingV ? rcNcBorders.top : 0 ),
  303. rcWnd.right,
  304. rcWnd.bottom - ( bSupportsResizingV ? rcNcBorders.bottom : 0 )
  305. );
  306. case HTTOPLEFT:
  307. if( bZoomed || (! bSupportsResizingH ) || (! bSupportsResizingV ) )
  308. break;
  309. return
  310. CRect(
  311. rcWnd.left,
  312. rcWnd.top,
  313. rcWnd.left + rcNcBorders.left,
  314. rcWnd.top + rcNcBorders.top
  315. );
  316. case HTTOPRIGHT:
  317. if( bZoomed || (! bSupportsResizingH ) || (! bSupportsResizingV ) )
  318. break;
  319. return
  320. CRect(
  321. rcWnd.right - rcNcBorders.right,
  322. rcWnd.top,
  323. rcWnd.right,
  324. rcWnd.top + rcNcBorders.top
  325. );
  326. case HTBOTTOMLEFT:
  327. if( bZoomed || (! bSupportsResizingH ) || (! bSupportsResizingV ) )
  328. break;
  329. return
  330. CRect(
  331. rcWnd.left,
  332. rcWnd.bottom - rcNcBorders.bottom,
  333. rcWnd.left + rcNcBorders.left,
  334. rcWnd.bottom
  335. );
  336. case HTBOTTOMRIGHT:
  337. if( bZoomed || (! bSupportsResizingH ) || (! bSupportsResizingV ) )
  338. break;
  339. return
  340. CRect(
  341. rcWnd.right - rcNcBorders.right,
  342. rcWnd.bottom - rcNcBorders.bottom,
  343. rcWnd.right,
  344. rcWnd.bottom
  345. );
  346. } // switch( nHT )
  347. return CRect( 0, 0, 0, 0 );
  348. }
  349. __EXT_MFC_SAFE_LPCTSTR CExtPaintManagerSkin::stat_NcFrameButton_NameFromState(
  350. CExtPaintManager::e_nc_button_state_t eState
  351. )
  352. {
  353. if( eState == __ENCBS_DISABLED )
  354. return _T("Disabled");
  355. if( eState == __ENCBS_HOVER )
  356. return _T("Hover");
  357. if( eState == __ENCBS_PRESSED )
  358. return _T("Pressed");
  359. ASSERT( eState == __ENCBS_NORMAL );
  360. return _T("Normal");
  361. }
  362. void CExtPaintManagerSkin::NcFrame_Paint(
  363. CDC & dc,
  364. const CExtCmdIcon * pIcon,
  365. __EXT_MFC_SAFE_LPCTSTR strCaption,
  366. UINT nDrawTextAlignFlags,
  367. const RECT & rcFrame,
  368. const RECT & rcClient,
  369. const RECT & rcIcon,
  370. const RECT & rcText,
  371. const RECT & rcHelp,
  372. const RECT & rcMinimize,
  373. const RECT & rcMaximizeRestore,
  374. const RECT & rcClose,
  375. bool bFrameActive,
  376. bool bFrameEnabled,
  377. bool bFrameMaximized,
  378. CExtPaintManager::e_nc_button_state_t eStateButtonHelp,
  379. CExtPaintManager::e_nc_button_state_t eStateButtonMinimize,
  380. CExtPaintManager::e_nc_button_state_t eStateButtonMaximizeRestore,
  381. CExtPaintManager::e_nc_button_state_t eStateButtonClose,
  382. const CWnd * pWnd,
  383. LPARAM lParam // = 0L
  384. ) const
  385. {
  386. ASSERT_VALID( this );
  387. ASSERT( dc.GetSafeHdc() != NULL );
  388. // pIcon;
  389. // strCaption;
  390. // nDrawTextAlignFlags;
  391. // rcFrame;
  392. rcClient;
  393. // rcIcon;
  394. // rcText;
  395. // rcHelp;
  396. // rcMinimize;
  397. // rcMaximizeRestore;
  398. // rcClose;
  399. // bFrameActive;
  400. bFrameEnabled;
  401. // bFrameMaximized;
  402. // eStateButtonHelp;
  403. // eStateButtonMinimize;
  404. // eStateButtonMaximizeRestore;
  405. // eStateButtonClose;
  406. pWnd;
  407. lParam;
  408. LPCTSTR strFrameActive =
  409. bFrameActive ? _T("Active") : _T("Inactive");
  410. const CExtSkinGlyph & glyphFrame =
  411. m_Skin[_T("NcFrame")][_T("NcArea")].Glyph(strFrameActive);
  412. const CExtSkinColor & colorFrameText =
  413. m_Skin[_T("NcFrame")][_T("NcArea")].Color(strFrameActive);
  414. glyphFrame.Draw( dc.m_hDC, rcFrame, true );
  415. if( pIcon != NULL
  416. && (! pIcon->IsEmpty() )
  417. && ( ! ::IsRectEmpty( &rcIcon ) )
  418. && dc.RectVisible( &rcIcon )
  419. )
  420. pIcon->Paint(
  421. const_cast < CExtPaintManagerSkin * > ( this ),
  422. dc.m_hDC,
  423. rcIcon.left,
  424. rcIcon.top,
  425. -1,
  426. -1
  427. );
  428. if( ! colorFrameText.IsHollow() )
  429. {
  430. int nLenCaption =
  431. int( ( strCaption == NULL ) ? 0 : _tcslen( strCaption ) );
  432. if( nLenCaption > 0
  433. && ( ! ::IsRectEmpty( &rcText ) )
  434. && dc.RectVisible( &rcText )
  435. )
  436. {
  437. const CExtSkinFont & fontFrameText =
  438. m_Skin[_T("NcFrame")][_T("NcArea")].Font(strFrameActive);
  439. CFont _font;
  440. if( fontFrameText.CreateFont( _font ) )
  441. {
  442. COLORREF clrText =
  443. //RGB( 255, 255, 255 );
  444. COLORREF( colorFrameText );
  445. CFont * pOldFont = dc.SelectObject(
  446. //(CFont*)&m_FontBold
  447. &_font
  448. );
  449. COLORREF clrOldText = dc.SetTextColor( clrText );
  450. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  451. dc.DrawText(
  452. strCaption,
  453. nLenCaption,
  454. (LPRECT)&rcText,
  455. nDrawTextAlignFlags|DT_SINGLELINE|DT_END_ELLIPSIS|DT_NOPREFIX
  456. );
  457. dc.SetBkMode( nOldBkMode );
  458. dc.SetTextColor( clrOldText );
  459. dc.SelectObject( pOldFont );
  460. } // if( fontFrameText.CreateFont( _font ) )
  461. #ifdef _DEBUG
  462. else
  463. {
  464. ASSERT( FALSE );
  465. } // else from if( fontFrameText.CreateFont( _font ) )
  466. #endif // _DEBUG
  467. }
  468. } // if( ! colorFrameText.IsHollow() )
  469. if( ( ! ::IsRectEmpty( &rcHelp ) )
  470. && dc.RectVisible( &rcHelp )
  471. )
  472. {
  473. LPCTSTR strGlyph = stat_NcFrameButton_NameFromState( eStateButtonHelp );
  474. const CExtSkinGlyph & glyph = m_Skin[_T("Button")][_T("FrameNcButton")][_T("Help")][strFrameActive].Glyph(strGlyph);
  475. glyph.Draw( dc.m_hDC, rcHelp );
  476. }
  477. if( ( ! ::IsRectEmpty( &rcMinimize ) )
  478. && dc.RectVisible( &rcMinimize )
  479. )
  480. {
  481. LPCTSTR strGlyph = stat_NcFrameButton_NameFromState( eStateButtonMinimize );
  482. const CExtSkinGlyph & glyph = m_Skin[_T("Button")][_T("FrameNcButton")]
  483. [
  484. ( pWnd != NULL && pWnd->IsIconic() )
  485. ? _T("Restore")
  486. : _T("Minimize")
  487. ]
  488. [strFrameActive].Glyph(strGlyph);
  489. glyph.Draw( dc.m_hDC, rcMinimize );
  490. }
  491. if( ( ! ::IsRectEmpty( &rcMaximizeRestore ) )
  492. && dc.RectVisible( &rcMaximizeRestore )
  493. )
  494. {
  495. LPCTSTR strGlyph = stat_NcFrameButton_NameFromState( eStateButtonMaximizeRestore );
  496. const CExtSkinGlyph & glyph = m_Skin[_T("Button")][_T("FrameNcButton")][ bFrameMaximized ? _T("Restore") : _T("Maximize") ][strFrameActive].Glyph(strGlyph);
  497. glyph.Draw( dc.m_hDC, rcMaximizeRestore );
  498. }
  499. if( ( ! ::IsRectEmpty( &rcClose ) )
  500. && dc.RectVisible( &rcClose )
  501. )
  502. {
  503. LPCTSTR strGlyph = stat_NcFrameButton_NameFromState( eStateButtonClose );
  504. const CExtSkinGlyph & glyph = m_Skin[_T("Button")][_T("FrameNcButton")][_T("Close")][strFrameActive].Glyph(strGlyph);
  505. glyph.Draw( dc.m_hDC, rcClose );
  506. }
  507. }
  508. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  509. void CExtPaintManagerSkin::Ribbon_EmbeddedCaptionPaintText(
  510. CDC & dc,
  511. __EXT_MFC_SAFE_LPCTSTR strCaption,
  512. CRect rcDrawText,
  513. __EXT_MFC_SAFE_LPCTSTR strCaptionDelimiter,
  514. const CExtRibbonBar * pRibbonBar,
  515. LPARAM lParam // = 0L
  516. )
  517. {
  518. ASSERT_VALID( this );
  519. ASSERT_VALID( pRibbonBar );
  520. if( strCaption == NULL
  521. || (! dc.RectVisible(&rcDrawText) )
  522. )
  523. return;
  524. if( IsHighContrast() )
  525. {
  526. CExtPaintManager::Ribbon_EmbeddedCaptionPaintText(
  527. dc,
  528. strCaption,
  529. rcDrawText,
  530. strCaptionDelimiter,
  531. pRibbonBar,
  532. lParam
  533. );
  534. return;
  535. }
  536. INT nLenCaption = INT( _tcslen( strCaption ) );
  537. if( nLenCaption == 0 )
  538. return;
  539. bool bFrameActive = true;
  540. if( pRibbonBar->m_pExtNcFrameImpl != NULL )
  541. bFrameActive = pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_IsActive();
  542. LPCTSTR strFrameActive =
  543. bFrameActive ? _T("Active") : _T("Inactive");
  544. const CExtSkinColor & colorFrameText =
  545. m_Skin[_T("NcFrame")][_T("NcArea")].Color(strFrameActive);
  546. if( colorFrameText.IsHollow() )
  547. return;
  548. bool bRTL = ( (pRibbonBar->GetExStyle()&WS_EX_LAYOUTRTL) != 0 ) ? true : false;;
  549. UINT nBaseDT = Ribbon_EmbeddedCaptionGetTextAlignmentFlags( pRibbonBar );
  550. //UINT nAlignDT = nBaseDT & (DT_LEFT|DT_CENTER|DT_RIGHT);
  551. UINT nDT = nBaseDT & (~(DT_CALCRECT));
  552. if( bRTL )
  553. {
  554. if( (nDT&3) == DT_RIGHT )
  555. {
  556. nDT &= ~3;
  557. nDT |= DT_LEFT;
  558. }
  559. else if( (nDT&3) == DT_LEFT )
  560. {
  561. nDT &= ~3;
  562. nDT |= DT_RIGHT;
  563. }
  564. } // if( bRTL )
  565. CExtSafeString strLeft = strCaption, strMiddle, strRight;
  566. INT nLenDelimiter = 0;
  567. if( strCaptionDelimiter != NULL )
  568. {
  569. nLenDelimiter = INT( _tcslen( strCaptionDelimiter ) );
  570. if( nLenDelimiter > 0 )
  571. {
  572. INT nPos = strLeft.Find( strCaptionDelimiter );
  573. if( nPos >= 0 )
  574. {
  575. strRight = strLeft.Right( nLenCaption - nPos - nLenDelimiter );
  576. strLeft = strLeft.Left( nPos );
  577. if( ! strRight.IsEmpty() )
  578. strMiddle = strCaptionDelimiter;
  579. } // if( nPos >= 0 )
  580. } // if( nLenDelimiter > 0 )
  581. } // if( strCaptionDelimiter != NULL )
  582. CFont * pOldFont = dc.SelectObject( &m_FontCaption );
  583. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  584. COLORREF clrOldText = dc.GetTextColor();
  585. nDT &= ~(DT_END_ELLIPSIS);
  586. INT nWidthLeft = stat_CalcTextDimension( dc, m_FontCaption, strLeft, DT_SINGLELINE|DT_LEFT|DT_TOP|DT_CALCRECT ).Width();
  587. INT nWidthMiddle = 0, nWidthRight = 0, nWidthAvailable = rcDrawText.Width();
  588. if( ! strRight.IsEmpty() )
  589. {
  590. nWidthMiddle = stat_CalcTextDimension( dc, m_FontCaption, strMiddle, DT_SINGLELINE|DT_LEFT|DT_TOP|DT_CALCRECT ).Width();
  591. nWidthRight  = stat_CalcTextDimension( dc, m_FontCaption, strRight, DT_SINGLELINE|DT_LEFT|DT_TOP|DT_CALCRECT ).Width();
  592. }
  593. COLORREF clrRibbon_EmbeddedCaptionTextLeft = colorFrameText;
  594. double lfHue = 0.0, lfSat = 0.0, lfLum = 0.0, lfAdjustmedLum = 0.25;
  595. stat_RGBtoHSL( clrRibbon_EmbeddedCaptionTextLeft, &lfHue, &lfSat, &lfLum );
  596. if( lfLum > 0.50 )
  597. {
  598. lfAdjustmedLum = -lfAdjustmedLum;
  599. if( lfLum > 0.75 )
  600. lfAdjustmedLum *= 0.25;
  601. }
  602. else
  603. {
  604. if( lfLum < 0.25 )
  605. lfAdjustmedLum *= 0.25;
  606. }
  607. COLORREF clrRibbon_EmbeddedCaptionTextRight = stat_HLS_Adjust( clrRibbon_EmbeddedCaptionTextLeft, 0.0, lfAdjustmedLum, 0.0 );
  608. dc.SetTextColor( clrRibbon_EmbeddedCaptionTextLeft );
  609. if( nWidthAvailable > ( nWidthLeft + nWidthMiddle + nWidthRight ) && (! strRight.IsEmpty() ) )
  610. {
  611. if( (nDT&DT_RIGHT) != 0 )
  612. rcDrawText.left = rcDrawText.right - ( nWidthLeft + nWidthMiddle + nWidthRight );
  613. else if( (nDT&DT_CENTER) != 0 )
  614. rcDrawText.left += ( rcDrawText.Width() - ( nWidthLeft + nWidthMiddle + nWidthRight ) ) / 2; 
  615. nDT &= ~(DT_RIGHT|DT_CENTER);
  616. nDT |= DT_LEFT;
  617. dc.DrawText( strLeft, strLeft.GetLength(), rcDrawText, nDT );
  618. rcDrawText.left += nWidthLeft;
  619. dc.DrawText( strMiddle, strMiddle.GetLength(), rcDrawText, nDT );
  620. dc.SetTextColor( clrRibbon_EmbeddedCaptionTextRight );
  621. rcDrawText.left += nWidthMiddle;
  622. nDT |= DT_END_ELLIPSIS;
  623. dc.DrawText( strRight, strRight.GetLength(), rcDrawText, nDT );
  624. } // if( nWidthAvailable > ( nWidthLeft + nWidthMiddle ) && (! strRight.IsEmpty() ) )
  625. else
  626. {
  627. nDT &= ~(DT_LEFT|DT_CENTER|DT_RIGHT);
  628. nDT |= DT_LEFT; // nDT |= nAlignDT;
  629. nDT |= DT_END_ELLIPSIS;
  630. if( bRTL )
  631. nDT |= DT_RTLREADING;
  632. dc.DrawText( strLeft, strLeft.GetLength(), rcDrawText, nDT );
  633. if(! strRight.IsEmpty() )
  634. {
  635. rcDrawText.left += nWidthLeft;
  636. if( ( rcDrawText.Width() + nWidthMiddle ) > 0 )
  637. {
  638. dc.DrawText( strMiddle, strMiddle.GetLength(), rcDrawText, nDT );
  639. dc.SetTextColor( clrRibbon_EmbeddedCaptionTextRight );
  640. rcDrawText.left += nWidthMiddle;
  641. dc.DrawText( strRight, strRight.GetLength(), rcDrawText, nDT );
  642. }
  643. }
  644. } // else from if( nWidthAvailable > ( nWidthLeft + nWidthMiddle ) && (! strRight.IsEmpty() ) )
  645. dc.SetTextColor( clrOldText );
  646. dc.SetBkMode( nOldBkMode );
  647. dc.SelectObject( &pOldFont );
  648. }
  649. UINT CExtPaintManagerSkin::Ribbon_EmbeddedCaptionGetTextAlignmentFlags(
  650. const CExtRibbonBar * pRibbonBar,
  651. LPARAM lParam // = 0L
  652. )
  653. {
  654. ASSERT_VALID( this );
  655. ASSERT_VALID( pRibbonBar );
  656. if( IsHighContrast() )
  657. return 
  658. CExtPaintManager::Ribbon_EmbeddedCaptionGetTextAlignmentFlags(
  659. pRibbonBar,
  660. lParam
  661. );
  662. return DT_SINGLELINE|DT_CENTER|DT_VCENTER;
  663. }
  664. void CExtPaintManagerSkin::Ribbon_EmbeddedCaptionAdjustTextRect(
  665. CRect & rcAdjust,
  666. const CExtRibbonBar * pRibbonBar,
  667. LPARAM lParam // = 0L
  668. )
  669. {
  670. ASSERT_VALID( this );
  671. ASSERT_VALID( pRibbonBar );
  672. if( IsHighContrast() )
  673. {
  674. CExtPaintManager::Ribbon_EmbeddedCaptionAdjustTextRect(
  675. rcAdjust,
  676. pRibbonBar,
  677. lParam
  678. );
  679. return;
  680. }
  681. bool bDwmMode = false;
  682. if( pRibbonBar->m_pExtNcFrameImpl != NULL
  683. && pRibbonBar->m_pExtNcFrameImpl->NcFrameImpl_IsDwmCaptionReplacement()
  684. )
  685. bDwmMode = true;
  686. if( ( ! bDwmMode )
  687. && pRibbonBar->GetParent()->IsZoomed()
  688. )
  689. {
  690. rcAdjust.OffsetRect( 0, 3 );
  691. }
  692. }
  693. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  694. #define __EXT_MFC_SKINNED_CAPTION_TEXT_GAP 4
  695. void CExtPaintManagerSkin::NcFrame_GetRects(
  696. CExtCmdIcon * pIcon,
  697. __EXT_MFC_SAFE_LPCTSTR strCaption,
  698. UINT nDrawTextAlignFlags,
  699. RECT & rcIcon,
  700. RECT & rcText,
  701. RECT & rcHelp,
  702. RECT & rcMinimize,
  703. RECT & rcMaximizeRestore,
  704. RECT & rcClose,
  705. const CWnd * pWnd,
  706. LPMINMAXINFO pMinMaxInfo, // = NULL
  707. LPARAM lParam // = 0L
  708. ) const
  709. {
  710. ASSERT_VALID( this );
  711. strCaption;
  712. nDrawTextAlignFlags;
  713. ::SetRectEmpty( &rcIcon );
  714. ::SetRectEmpty( &rcText );
  715. ::SetRectEmpty( &rcHelp );
  716. ::SetRectEmpty( &rcMinimize );
  717. ::SetRectEmpty( &rcMaximizeRestore );
  718. ::SetRectEmpty( &rcClose );
  719. ASSERT( NcFrame_IsSupported( pWnd ) );
  720. DWORD dwWndStyle = pWnd->GetStyle();
  721. // if( (dwWndStyle&WS_CAPTION) == 0 )
  722. // return;
  723. DWORD dwWndStyleEx = pWnd->GetExStyle();
  724. CRect rcNcBorders, rcThemePadding;
  725. NcFrame_GetMetrics(
  726. rcNcBorders,
  727. rcThemePadding,
  728. pWnd,
  729. lParam
  730. );
  731. CRect rcCaption =
  732. NcFrame_GetHtRect(
  733. HTCAPTION,
  734. false,
  735. true,
  736. true,
  737. pIcon,
  738. pWnd,
  739. pMinMaxInfo
  740. );
  741. CRect rc = rcCaption;
  742. ::CopyRect( &rcText, &rcCaption );
  743. bool bZoomed = pWnd->IsZoomed()? true : false;
  744. if( (dwWndStyle&WS_SYSMENU) != 0 )
  745. {
  746. LPCTSTR strFrameActive = _T("Active");
  747. const CExtSkinGlyph & glyphClose = m_Skin[_T("Button")][_T("FrameNcButton")][_T("Close")][strFrameActive].Glyph(_T("Normal"));
  748. CSize _sizeScClose = glyphClose.GetSize();
  749. CRect _rcOffsetScClose = glyphClose.GetOffset();
  750. rc.right -= bZoomed ? rcThemePadding.right : 1;
  751. rc.right -= _rcOffsetScClose.right;
  752. rc.left = rc.right - _sizeScClose.cx;
  753. rc.top = rcCaption.top + _rcOffsetScClose.top + ( bZoomed ? _rcOffsetScClose.bottom : 0 );
  754. rc.bottom = rc.top + _sizeScClose.cy;
  755. ::CopyRect( &rcClose, &rc );
  756. rc.OffsetRect( -_sizeScClose.cx, 0 );
  757. rcText.right = rcCaption.right - __EXT_MFC_SKINNED_CAPTION_TEXT_GAP;
  758. if( (dwWndStyle&WS_MAXIMIZEBOX) != 0 )
  759. {
  760. const CExtSkinGlyph & glyphMaximize = m_Skin[_T("Button")][_T("FrameNcButton")][_T("Maximize")][strFrameActive].Glyph(_T("Normal"));
  761. CSize _sizeScMaximize = glyphMaximize.GetSize();
  762. CRect _rcOffsetScMaximize = glyphMaximize.GetOffset();
  763. rc.right -= _rcOffsetScMaximize.right;
  764. rc.top = rcCaption.top + _rcOffsetScMaximize.top + ( bZoomed ? _rcOffsetScMaximize.bottom : 0 );
  765. rc.left = rc.right - _sizeScMaximize.cx;
  766. rc.bottom = rc.top + _sizeScMaximize.cy;
  767. ::CopyRect( &rcMaximizeRestore, &rc );
  768. rc.OffsetRect( -_sizeScMaximize.cx, 0 );
  769. rcText.right = rcMaximizeRestore.left - __EXT_MFC_SKINNED_CAPTION_TEXT_GAP;
  770. } // if( (dwWndStyle&WS_MAXIMIZEBOX) != 0 )
  771. if( (dwWndStyle&WS_MINIMIZEBOX) != 0 )
  772. {
  773. const CExtSkinGlyph & glyphMinimize = m_Skin[_T("Button")][_T("FrameNcButton")][_T("Minimize")][strFrameActive].Glyph(_T("Normal"));
  774. CSize _sizeScMinimize = glyphMinimize.GetSize();
  775. CRect _rcOffsetScMinimize = glyphMinimize.GetOffset();
  776. rc.right -= _rcOffsetScMinimize.right;
  777. rc.top = rcCaption.top + _rcOffsetScMinimize.top + ( bZoomed ? _rcOffsetScMinimize.bottom : 0 );
  778. rc.left = rc.right - _sizeScMinimize.cx;
  779. rc.bottom = rc.top + _sizeScMinimize.cy;
  780. ::CopyRect( &rcMinimize, &rc );
  781. rc.OffsetRect( -_sizeScMinimize.cx, 0 );
  782. rcText.right = rcMinimize.left - __EXT_MFC_SKINNED_CAPTION_TEXT_GAP;
  783. } // if( (dwWndStyle&WS_MINIMIZEBOX) != 0 )
  784. if( (dwWndStyleEx&WS_EX_CONTEXTHELP) != 0 )
  785. {
  786. const CExtSkinGlyph & glyphHelp = m_Skin[_T("Button")][_T("FrameNcButton")][_T("Help")][strFrameActive].Glyph(_T("Normal"));
  787. CSize _sizeScHelp = glyphHelp.GetSize();
  788. CRect _rcOffsetScHelp = glyphHelp.GetOffset();
  789. rc.right -= _rcOffsetScHelp.right;
  790. rc.top = rcCaption.top + _rcOffsetScHelp.top + ( bZoomed ? _rcOffsetScHelp.bottom : 0 );
  791. rc.left = rc.right - _sizeScHelp.cx;
  792. rc.bottom = rc.top + _sizeScHelp.cy;
  793. ::CopyRect( &rcHelp, &rc );
  794. rcText.right = rcHelp.left - __EXT_MFC_SKINNED_CAPTION_TEXT_GAP;
  795. } // if( (dwWndStyleEx&WS_EX_CONTEXTHELP) != 0 )
  796. if( pIcon != NULL
  797. && (! pIcon->IsEmpty() )
  798. )
  799. {
  800. CSize _sizeIcon = pIcon->GetSize();
  801. if( _sizeIcon.cx > 0 && _sizeIcon.cy > 0 )
  802. {
  803. int x = rcCaption.left + (bZoomed ? rcNcBorders.left : 0 );
  804. int y = rcCaption.top + ( rcCaption.Height() - _sizeIcon.cy ) / 2;
  805. ::SetRect(
  806. &rcIcon,
  807. x,
  808. y,
  809. x + _sizeIcon.cx,
  810. y + _sizeIcon.cy
  811. );
  812. rcText.left = rcIcon.right + __EXT_MFC_SKINNED_CAPTION_TEXT_GAP;
  813. } // if( _sizeIcon.cx > 0 && _sizeIcon.cy > 0 )
  814. else
  815. rcText.left += __EXT_MFC_SKINNED_CAPTION_TEXT_GAP;
  816. } // if( pIcon != NULL ...
  817. else
  818. rcText.left += __EXT_MFC_SKINNED_CAPTION_TEXT_GAP + (bZoomed ? rcNcBorders.left : 0 );
  819. } // if( (dwWndStyle&WS_SYSMENU) != 0 )
  820. else
  821. {
  822. rcText.left += __EXT_MFC_SKINNED_CAPTION_TEXT_GAP + (bZoomed ? rcNcBorders.left : 0 );
  823. rcText.right -= __EXT_MFC_SKINNED_CAPTION_TEXT_GAP;
  824. }
  825. }
  826. bool CExtPaintManagerSkin::Bar_MiniDockFrameGetNcMetrics(
  827. INT & nResizingFrameDX,
  828. INT & nResizingFrameDY,
  829. INT & nCaptionDY,
  830. CExtMiniDockFrameWnd * pMiniFrameWnd,
  831. CExtControlBar * pBar,
  832. LPARAM lParam // = 0
  833. ) const
  834. {
  835. ASSERT_VALID( this );
  836. ASSERT_VALID( pMiniFrameWnd );
  837. pMiniFrameWnd;
  838. lParam;
  839. LPCTSTR strBarType = _T("ResizableBar");
  840. CExtToolControlBar * pToolCB = DYNAMIC_DOWNCAST( CExtToolControlBar, pBar );
  841. if( pToolCB )
  842. {
  843. strBarType = _T("ToolBar");
  844. if( pToolCB->IsKindOf( RUNTIME_CLASS( CExtMenuControlBar ) ) )
  845. strBarType = _T("MenuBar");
  846. }
  847. const CExtSkinItem & Frame = 
  848. m_Skin[_T("Frame")][_T("MiniFrame")][_T("ControlBar")][strBarType][_T("Active")];
  849. const CExtSkinItem & Caption =
  850. m_Skin[_T("Caption")][_T("Frame")][_T("MiniFrame")][_T("ControlBar")][strBarType][_T("Active")];
  851. const CExtSkinGlyph & FrameGlyph = Frame.Glyph( _T("Frame") );
  852. const CExtSkinGlyph & CaptionGlyph = Caption.Glyph( _T("Caption") );
  853. CRect rcFramePadding = FrameGlyph.GetPadding();
  854. CSize szCaption = CaptionGlyph.GetSize();
  855. nResizingFrameDX = rcFramePadding.left;
  856. nResizingFrameDY = rcFramePadding.top;
  857. nCaptionDY = szCaption.cy;
  858. return true;
  859. }
  860. bool CExtPaintManagerSkin::Bar_MiniDockFrameNcCalcSize(
  861. RECT & rcAdjust,
  862. CExtMiniDockFrameWnd * pMiniFrameWnd,
  863. CExtControlBar * pBar,
  864. LPARAM lParam // = 0
  865. ) const
  866. {
  867. ASSERT_VALID( this );
  868. ASSERT_VALID( pMiniFrameWnd );
  869. rcAdjust;
  870. pMiniFrameWnd;
  871. pBar;
  872. lParam;
  873. LPCTSTR strBarType = _T("ResizableBar");
  874. CExtToolControlBar * pToolCB = DYNAMIC_DOWNCAST( CExtToolControlBar, pBar );
  875. if( pToolCB )
  876. {
  877. strBarType = _T("ToolBar");
  878. if( pToolCB->IsKindOf( RUNTIME_CLASS( CExtMenuControlBar ) ) )
  879. strBarType = _T("MenuBar");
  880. }
  881. const CExtSkinItem & Frame = 
  882. m_Skin[_T("Frame")][_T("MiniFrame")][_T("ControlBar")][strBarType][_T("Active")];
  883. const CExtSkinItem & Caption =
  884. m_Skin[_T("Caption")][_T("Frame")][_T("MiniFrame")][_T("ControlBar")][strBarType][_T("Active")];
  885. const CExtSkinGlyph & FrameGlyph = Frame.Glyph( _T("Frame") );
  886. const CExtSkinGlyph & CaptionGlyph = Caption.Glyph( _T("Caption") );
  887. CRect rcFramePadding = FrameGlyph.GetPadding();
  888. CSize szCaption = CaptionGlyph.GetSize();
  889. rcAdjust.left += rcFramePadding.left;
  890. rcAdjust.top += rcFramePadding.top + szCaption.cy;
  891. rcAdjust.right -= rcFramePadding.right;
  892. rcAdjust.bottom -= rcFramePadding.bottom;
  893. return true;
  894. }
  895. bool CExtPaintManagerSkin::Bar_MiniDockFrameCaptionCalcRect(
  896. RECT & rcCaption,
  897. CExtMiniDockFrameWnd * pMiniFrameWnd,
  898. CExtControlBar * pBar,
  899. LPARAM lParam // = 0
  900. ) const
  901. {
  902. ASSERT_VALID( this );
  903. ASSERT_VALID( pMiniFrameWnd );
  904. pMiniFrameWnd;
  905. pBar;
  906. lParam;
  907. if( pMiniFrameWnd == NULL )
  908. return false;
  909. LPCTSTR strBarType = _T("ResizableBar");
  910. CExtToolControlBar * pToolCB = DYNAMIC_DOWNCAST( CExtToolControlBar, pBar );
  911. if( pToolCB )
  912. {
  913. strBarType = _T("ToolBar");
  914. if( pToolCB->IsKindOf( RUNTIME_CLASS( CExtMenuControlBar ) ) )
  915. strBarType = _T("MenuBar");
  916. }
  917. const CExtSkinItem & Frame = 
  918. m_Skin[_T("Frame")][_T("MiniFrame")][_T("ControlBar")][strBarType][_T("Active")];
  919. const CExtSkinItem & Caption =
  920. m_Skin[_T("Caption")][_T("Frame")][_T("MiniFrame")][_T("ControlBar")][strBarType][_T("Active")];
  921. const CExtSkinGlyph & FrameGlyph = Frame.Glyph( _T("Frame") );
  922. const CExtSkinGlyph & CaptionGlyph = Caption.Glyph( _T("Caption") );
  923. CRect rcFramePadding = FrameGlyph.GetPadding();
  924. CSize szCaption = CaptionGlyph.GetSize();
  925. CRect rcFrameCaption;
  926. ::GetWindowRect( pMiniFrameWnd->GetSafeHwnd(), &rcFrameCaption );
  927. rcFrameCaption -= rcFrameCaption.TopLeft();
  928. rcFrameCaption.left += rcFramePadding.left;
  929. rcFrameCaption.top += rcFramePadding.top;
  930. rcFrameCaption.right -= rcFramePadding.right;
  931. rcFrameCaption.bottom = rcFrameCaption.top + szCaption.cy;
  932. ::CopyRect( &rcCaption, &rcFrameCaption );
  933. return true;
  934. }
  935. void CExtPaintManagerSkin::PaintResizableBarSeparator(
  936. CDC & dc,
  937. const RECT & rc,
  938. bool bHorz,
  939. CExtControlBar * pBar,
  940. LPARAM lParam // = 0
  941. )
  942. {
  943. ASSERT_VALID( this );
  944. ASSERT_VALID( pBar );
  945. ASSERT( dc.GetSafeHdc() != NULL );
  946. dc;
  947. rc;
  948. bHorz;
  949. pBar;
  950. lParam;
  951. LPCTSTR strSeparatorType = _T("SeparatorV");
  952. if( bHorz )
  953. strSeparatorType = _T("SeparatorH");
  954. CExtSkinGlyph & SeparatorGlyph = 
  955. m_Skin[_T("ImageCollection")][_T("ControlBar")][_T("ResizableBar")].Glyph( strSeparatorType );
  956. SeparatorGlyph.Draw( dc.m_hDC, rc );
  957. }
  958. bool CExtPaintManagerSkin::Bar_LayoutNcAreaButton(
  959. RECT & rcButton,
  960. const RECT & rcCaption,
  961. CExtBarNcAreaButton * pLayoutBtn,
  962. CExtBarNcAreaButton * pPrevBtn,
  963. CObject * pHelperSrc,
  964. LPARAM lParam // = 0L
  965. ) const
  966. {
  967. ASSERT_VALID( this );
  968. ASSERT_VALID( pLayoutBtn );
  969. pHelperSrc;
  970. lParam;
  971. LPCTSTR strButtonType = _T("");
  972. if( pLayoutBtn->IsKindOf( RUNTIME_CLASS( CExtBarNcAreaButtonClose ) ) )
  973. strButtonType = _T("Close");
  974. else
  975. if( pLayoutBtn->IsKindOf( RUNTIME_CLASS( CExtBarNcAreaButtonExpand ) )
  976. || pLayoutBtn->IsKindOf( RUNTIME_CLASS( CExtBarNcAreaButtonMenu ) )
  977. )
  978. strButtonType = _T("Options");
  979. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  980. else
  981. if( pLayoutBtn->IsKindOf( RUNTIME_CLASS( CExtBarNcAreaButtonAutoHide ) ) )
  982. strButtonType = _T("PinOff");
  983. #endif // (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  984. else
  985. return false;
  986. LPCTSTR strBarActiveState =
  987. pLayoutBtn->IsBarWndActive() ? _T("Active") : _T("Inactive");
  988. const CExtSkinGlyph & ButtonFrameGlyph = 
  989. m_Skin[_T("Caption")][_T("CaptionButton")][_T("Normal")]
  990. [strButtonType][strBarActiveState].Glyph( _T("Frame") );
  991. if( ButtonFrameGlyph.IsEmpty() )
  992. return false;
  993. CSize _size = ButtonFrameGlyph.GetSize();
  994. INT x = rcCaption.right - _size.cx - ButtonFrameGlyph.GetPadding().right;
  995. INT y = rcCaption.top;
  996. CRect rc( x, y, x + _size.cx, y + _size.cy );
  997. if( pPrevBtn != NULL )
  998. {
  999. const CRect & rcPrev = *pPrevBtn;
  1000. rc.OffsetRect(
  1001. rcPrev.left - rc.right,
  1002. 0
  1003. );
  1004. }
  1005. rc.OffsetRect( 
  1006. -ButtonFrameGlyph.GetOffset().right,
  1007. ButtonFrameGlyph.GetOffset().top 
  1008. );
  1009. rcButton = rc;
  1010. return true;
  1011. }
  1012. CRect CExtPaintManagerSkin::Bar_GetCaptionBordersForText(
  1013. CExtControlBar * pBar,
  1014. LPARAM lParam // = 0
  1015. ) const
  1016. {
  1017. ASSERT_VALID( this );
  1018. ASSERT_VALID( pBar );
  1019. pBar;
  1020. lParam;
  1021. // EG - TO DO - RETURN RESIZABLE BAR CAPTION PADDING
  1022. return CRect( 2, 1, 2, 1 );
  1023. }
  1024. INT CExtPaintManagerSkin::Bar_SeparatorWidthGet(
  1025. CExtControlBar * pBar,
  1026. LPARAM lParam // = 0
  1027. ) const
  1028. {
  1029. ASSERT_VALID( this );
  1030. ASSERT_VALID( pBar );
  1031. pBar;
  1032. lParam;
  1033. const CExtSkinGlyph & SeparatorGlyph = 
  1034. m_Skin[_T("ImageCollection")][_T("ControlBar")][_T("ResizableBar")].Glyph( _T("SeparatorV") );
  1035. return SeparatorGlyph.GetSize().cx;
  1036. }
  1037. INT CExtPaintManagerSkin::Bar_SeparatorHeightGet(
  1038. CExtControlBar * pBar,
  1039. LPARAM lParam // = 0
  1040. ) const
  1041. {
  1042. ASSERT_VALID( this );
  1043. ASSERT_VALID( pBar );
  1044. pBar;
  1045. lParam;
  1046. const CExtSkinGlyph & SeparatorGlyph = 
  1047. m_Skin[_T("ImageCollection")][_T("ControlBar")][_T("ResizableBar")].Glyph( _T("SeparatorH") );
  1048. return SeparatorGlyph.GetSize().cy;
  1049. }
  1050. INT CExtPaintManagerSkin::Bar_GripperWidthAtLeftGet(
  1051. CExtControlBar * pBar,
  1052. LPARAM lParam // = 0
  1053. ) const
  1054. {
  1055. ASSERT_VALID( this );
  1056. ASSERT_VALID( pBar );
  1057. pBar;
  1058. lParam;
  1059. return 0;
  1060. }
  1061. INT CExtPaintManagerSkin::Bar_GripperHeightAtTopGet(
  1062. CExtControlBar * pBar,
  1063. LPARAM lParam // = 0
  1064. ) const
  1065. {
  1066. ASSERT_VALID( this );
  1067. ASSERT_VALID( pBar );
  1068. lParam;
  1069. bool bFloating = true;
  1070. LPCTSTR strBarType = _T("ResizableBar");
  1071. if( pBar )
  1072. {
  1073. if( pBar->IsKindOf( RUNTIME_CLASS( CExtToolControlBar ) ) )
  1074. {
  1075. if( pBar->IsKindOf( RUNTIME_CLASS( CExtMenuControlBar ) ) )
  1076. strBarType = _T("MenuBar");
  1077. else
  1078. strBarType = _T("ToolBar");
  1079. }
  1080. bFloating = pBar->IsFloating();
  1081. }
  1082. const CExtSkinItem & Caption = bFloating 
  1083. ? m_Skin[_T("Caption")][_T("ControlBar")][strBarType][_T("Floating")][_T("Active")]
  1084. : m_Skin[_T("Caption")][_T("ControlBar")][strBarType][_T("Active")];
  1085. const CExtSkinGlyph & CaptionGlyph = Caption.Glyph( _T("Caption") );
  1086. return CaptionGlyph.GetSize().cy;
  1087. }
  1088. HFONT CExtPaintManagerSkin::Bar_GetCaptionFont(
  1089. bool bHorz,
  1090. CExtToolControlBar * pBar,
  1091. LPARAM lParam // = 0
  1092. )
  1093. {
  1094. ASSERT_VALID( this );
  1095. ASSERT_VALID( pBar );
  1096. bHorz;
  1097. pBar;
  1098. lParam;
  1099. return NULL;
  1100. }
  1101. HFONT CExtPaintManagerSkin::CreateDefaultFont()
  1102. {
  1103. const CExtSkinFont & skinFont = m_Skin[_T("Button")].Font(_T("Measure"));
  1104. CFont _font;
  1105. if( ! skinFont.CreateFont( _font ) )
  1106. return CExtPaintManager::CreateDefaultFont();
  1107. return (HFONT)_font.Detach();
  1108. }
  1109. CSize CExtPaintManagerSkin::Toolbar_GetMinButtonSize(
  1110. CObject * pHelperSrc,
  1111. LPARAM lParam // = 0
  1112. )
  1113. {
  1114. ASSERT_VALID( this );
  1115. if( pHelperSrc != NULL )
  1116. {
  1117. if( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtPopupMenuWnd ) )
  1118. || ( pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtBarButton ) )
  1119. && ( (!( ((CExtBarButton*)pHelperSrc)->GetBar() ) -> IsDockedVertically() )
  1120. || ( ((CExtBarButton*)pHelperSrc)->GetNoRotateVerticalLayout() )
  1121. )
  1122. )
  1123. )
  1124. {
  1125. CExtSkinGlyph & g =
  1126. m_Skin[_T("Button")][_T("Simple")]
  1127. [_T("PushButton")][_T("ControlBar")][_T("Horizontal")]
  1128. [_T("ToolBar")][_T("Normal")].Glyph( _T("PushButton") )
  1129. ;
  1130. CRect rcPaddingImage = g.GetPadding();
  1131. CRect rcPaddingContent = g.GetContentPadding();
  1132. CSize _size(
  1133. rcPaddingContent.left + rcPaddingContent.right,
  1134. rcPaddingImage.top + rcPaddingImage.bottom
  1135. );
  1136. return _size;
  1137. }
  1138. else if(
  1139. pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtBarButton ) )
  1140. )
  1141. {
  1142. CExtSkinGlyph & g =
  1143. m_Skin[_T("Button")][_T("Simple")]
  1144. [_T("PushButton")][_T("ControlBar")][_T("Vertical")]
  1145. [_T("ToolBar")][_T("Normal")].Glyph( _T("PushButton") )
  1146. ;
  1147. CRect rcPaddingImage = g.GetContentPadding();
  1148. CRect rcPaddingContent = g.GetPadding();
  1149. CSize _size(
  1150. rcPaddingImage.left + rcPaddingImage.right,
  1151. rcPaddingContent.top + rcPaddingContent.bottom
  1152. );
  1153. }
  1154. } // if( pHelperSrc != NULL )
  1155. return
  1156. CExtPaintManager::Toolbar_GetMinButtonSize(
  1157. pHelperSrc,
  1158. lParam
  1159. );
  1160. }
  1161. void CExtPaintManagerSkin::Toolbar_AdjustButtonSize(
  1162. CExtBarButton * pTBB,
  1163. CSize & sizePreCalc
  1164. )
  1165. {
  1166. ASSERT_VALID( this );
  1167. ASSERT_VALID( pTBB );
  1168. if( pTBB->IsKindOf( RUNTIME_CLASS( CExtBarContentExpandButton ) ) )
  1169. return;
  1170. CExtToolControlBar * pBar = pTBB->GetBar();
  1171. if( pBar == NULL )
  1172. {
  1173. CExtPaintManager::Toolbar_AdjustButtonSize(
  1174. pTBB,
  1175. sizePreCalc
  1176. );
  1177. return;
  1178. }
  1179. bool bHorizontal = ( (! pTBB->GetNoRotateVerticalLayout() ) && pBar->IsDockedVertically() ) ? false : true;
  1180. LPCTSTR strDockingType = bHorizontal ? _T("Horizontal") : _T("Vertical");
  1181. bool bDockSiteCustomizeMode =
  1182. pBar->_IsDockSiteCustomizeMode();
  1183. bool bPushed =
  1184. ( pTBB->IsPressed() && (!bDockSiteCustomizeMode) )
  1185. ? true : false;
  1186. bool bEnabled =
  1187. ( pTBB->IsDisabled() && (!bDockSiteCustomizeMode) )
  1188. ? false : true;
  1189. bool bHover =
  1190. ( pTBB->IsHover() && (!bDockSiteCustomizeMode) )
  1191. ? true : false;
  1192. if( ! bDockSiteCustomizeMode )
  1193. {
  1194. if( CExtToolControlBar::g_bMenuTracking
  1195. || CExtPopupMenuWnd::IsMenuTracking()
  1196. )
  1197. bHover = false;
  1198. else if( !bHover )
  1199. bHover = pTBB->IsPressedTracking();
  1200. //if( bPushed && bHover && IsPressedTracking() )
  1201. //bHover = false;
  1202. } // if( ! bDockSiteCustomizeMode )
  1203. CExtSkinItem * pButton = NULL; 
  1204. if( pTBB->GetSeparatedDropDown() )
  1205. pButton = (&(m_Skin[_T("Button")][_T("SeparatedDropDown")]));
  1206. else if( pTBB->IsAbleToTrackMenu() )
  1207. pButton = (&(m_Skin[_T("Button")][_T("DropDown")]));
  1208. else
  1209. pButton = (&(m_Skin[_T("Button")][_T("Simple")]));
  1210. LPCTSTR strState = _T("Normal");
  1211. if( ! bEnabled )
  1212. strState = _T("Disabled");
  1213. else if( bPushed )
  1214. strState = _T("Pressed");
  1215. else if( bHover /*|| _ppbd.m_bDrawFocusRect*/ )
  1216. strState = _T("Hover");
  1217. // else if( _ppbd.m_bDefaultPushButton )
  1218. // strState = _T("Default");
  1219. pButton =
  1220. (&((*pButton)
  1221. [_T("PushButton")][_T("ControlBar")][strDockingType]
  1222. [_T("ToolBar")][strState]
  1223. ));
  1224. CExtSkinGlyph & PushButtonGlyph =
  1225. pButton->Glyph( _T("PushButton") );
  1226. CSize sizeSkin = PushButtonGlyph.GetSize();
  1227. if( sizePreCalc.cx < sizeSkin.cx )
  1228. sizePreCalc.cx = sizeSkin.cx;
  1229. if( sizePreCalc.cy < sizeSkin.cy )
  1230. sizePreCalc.cy = sizeSkin.cy;
  1231. }
  1232. HFONT CExtPaintManagerSkin::Toolbar_GetFont(
  1233. bool bHorz,
  1234. CExtControlBar * pBar,
  1235. LPARAM lParam // = 0
  1236. )
  1237. {
  1238. ASSERT_VALID( this );
  1239. ASSERT_VALID( pBar );
  1240. pBar;
  1241. lParam;
  1242. if( bHorz )
  1243. return ( (HFONT) m_FontNormal.GetSafeHandle() );
  1244. else
  1245. return ( (HFONT) m_FontNormalVert.GetSafeHandle() );
  1246. }
  1247. bool CExtPaintManagerSkin::Toolbar_GetBGInfo(
  1248. RECT & rcBorders,
  1249. INT & nGripWidthAtLeft,
  1250. INT & nGripHeightAtTop,
  1251. CExtToolControlBar * pBar,
  1252. LPARAM lParam // = 0
  1253. ) const
  1254. {
  1255. ASSERT_VALID( this );
  1256. ASSERT_VALID( pBar );
  1257. lParam;
  1258. DWORD dwBarStyle = pBar->GetBarStyle();
  1259. nGripWidthAtLeft = 0;
  1260. nGripHeightAtTop = 0;
  1261. if( (dwBarStyle&CBRS_FLOATING) != 0
  1262. || pBar->IsFloating()
  1263. )
  1264. {
  1265. rcBorders.left = 0;
  1266. rcBorders.top = 0;
  1267. rcBorders.right = 0;
  1268. rcBorders.bottom = 0;
  1269. return true;
  1270. }
  1271. const CExtSkinGlyph * pGripperGlyph = NULL;
  1272. const CExtSkinGlyph & BkGlyph = _GetDockedToolBarGlyph( pBar, &pGripperGlyph );
  1273. ASSERT( pGripperGlyph != NULL );
  1274. rcBorders = BkGlyph.GetPadding();
  1275. if( (dwBarStyle&CBRS_ORIENT_HORZ) != 0 )
  1276. {
  1277. if( (dwBarStyle&CBRS_GRIPPER) != 0 )
  1278. nGripWidthAtLeft = pGripperGlyph->GetSize().cx;
  1279. rcBorders.top = 0;
  1280. rcBorders.bottom = 0;
  1281. } // if( (dwBarStyle&CBRS_ORIENT_HORZ) != 0 )
  1282. else
  1283. {
  1284. if( (dwBarStyle&CBRS_GRIPPER) != 0 )
  1285. nGripHeightAtTop = pGripperGlyph->GetSize().cy;
  1286. rcBorders.left = 0;
  1287. rcBorders.right = 0;
  1288. } // else from if( (dwBarStyle&CBRS_ORIENT_HORZ) != 0 )
  1289. return true;
  1290. }
  1291. const CExtSkinGlyph & CExtPaintManagerSkin::_GetDockedToolBarGlyph(
  1292. CExtToolControlBar * pBar,
  1293. const CExtSkinGlyph ** ppGlyphGripper // = NULL
  1294. ) const
  1295. {
  1296. return
  1297. (
  1298. ( const_cast < CExtPaintManagerSkin * > ( this ) ) ->
  1299. _GetDockedToolBarGlyph(
  1300. pBar,
  1301. const_cast < CExtSkinGlyph ** > ( ppGlyphGripper )
  1302. )
  1303. );
  1304. }
  1305. CExtSkinGlyph & CExtPaintManagerSkin::_GetDockedToolBarGlyph(
  1306. CExtToolControlBar * pBar,
  1307. CExtSkinGlyph ** ppGlyphGripper // = NULL
  1308. )
  1309. {
  1310. ASSERT_VALID( pBar );
  1311. ASSERT( ! pBar->IsFloating() );
  1312. LPCTSTR strBarType = _T("ToolBar");
  1313. if( pBar->IsKindOf( RUNTIME_CLASS( CExtMenuControlBar ) ) )
  1314. strBarType = _T("MenuBar");
  1315. LPCTSTR strDockingType = _T("Horizontal");
  1316. if( pBar->IsDockedVertically() )
  1317. strDockingType = _T("Vertical");
  1318. LPCTSTR strDockingAbility = _T("Dockable");
  1319. if( pBar->m_pDockSite == NULL )
  1320. strDockingAbility = _T("Static");
  1321. CExtSkinGlyph & ToolBarBk =
  1322. m_Skin[_T("Background")][_T("ControlBar")][strBarType][strDockingType][strDockingAbility]
  1323. .Glyph( _T("Background") );
  1324. if( ppGlyphGripper != NULL )
  1325. {
  1326. LPCTSTR strGlyphType = _T("GripperV");
  1327. if( pBar->IsDockedVertically() )
  1328. strGlyphType = _T("GripperH");
  1329. CExtSkinGlyph & GripperGlyph =
  1330. m_Skin[_T("ImageCollection")][_T("ControlBar")][strBarType][strDockingType]
  1331. .Glyph( strGlyphType );
  1332. (*ppGlyphGripper) = &GripperGlyph;
  1333. }
  1334. return ToolBarBk;
  1335. }
  1336. bool CExtPaintManagerSkin::Toolbar_GetSizeOfCEB(
  1337. SIZE & sizeReal,
  1338. const SIZE & sizePreCalc,
  1339. CDC & dc,
  1340. BOOL bHorz,
  1341. CExtBarContentExpandButton * pTBB,
  1342. LPARAM lParam // = 0
  1343. )
  1344. {
  1345. ASSERT_VALID( this );
  1346. ASSERT_VALID( pTBB );
  1347. sizeReal;
  1348. sizePreCalc;
  1349. dc;
  1350. bHorz;
  1351. pTBB;
  1352. lParam;
  1353. LPCTSTR strToolBarType = bHorz ? _T("Horizontal") : _T("Vertical");
  1354. LPCTSTR strDockingAbility = _T("Dockable");
  1355. CExtToolControlBar * pToolBar = pTBB->GetBar();
  1356. if( pToolBar && pToolBar->m_pDockSite == NULL )
  1357. strDockingAbility = _T("Static");
  1358. CExtSkinGlyph & ChevronGlyph = 
  1359. m_Skin[_T("ImageCollection")][_T("ControlBar")][_T("ToolBar")][strToolBarType][strDockingAbility]
  1360. .Glyph( _T("ChevronPartial") );
  1361. if( bHorz )
  1362. {
  1363. sizeReal.cx = ChevronGlyph.GetSize().cx;
  1364. sizeReal.cy = sizePreCalc.cy;
  1365. } // if( bHorz )
  1366. else
  1367. {
  1368. sizeReal.cx = sizePreCalc.cx;
  1369. sizeReal.cy = ChevronGlyph.GetSize().cy;
  1370. } // else from if( bHorz )
  1371. return true;
  1372. }
  1373. void CExtPaintManagerSkin::PaintToolbarExpandButton(
  1374. CDC & dc,
  1375. const RECT & rcButtonArea,
  1376. bool bHorz, // if false - down
  1377. bool bBarIsCompletelyVisible,
  1378. bool bEnabled,
  1379. bool bPushed,
  1380. bool bHover,
  1381. CObject * pHelperSrc,
  1382. LPARAM lParam, // = 0L
  1383. bool bTransparentBackground // = false
  1384. )
  1385. {
  1386. ASSERT_VALID( this );
  1387. ASSERT( dc.GetSafeHdc() != NULL );
  1388. dc;
  1389. rcButtonArea;
  1390. bHorz;
  1391. bBarIsCompletelyVisible;
  1392. bEnabled;
  1393. bPushed;
  1394. bHover;
  1395. pHelperSrc;
  1396. lParam;
  1397. bTransparentBackground;
  1398. CRect rect(rcButtonArea);
  1399. rect.NormalizeRect();
  1400. if( !dc.RectVisible( &rect ) )
  1401. return;
  1402. CRect rectButton( rect );
  1403. PAINTPUSHBUTTONDATA _ppbd(
  1404. pHelperSrc, bHorz, rectButton, NULL, 
  1405. NULL, false, bHover, bPushed, false, 
  1406. bEnabled, false, false, false, 0
  1407. );
  1408. PaintPushButton( dc, _ppbd );
  1409. LPCTSTR strToolBarType = bHorz ? _T("Horizontal") : _T("Vertical");
  1410. LPCTSTR strChevronType = bBarIsCompletelyVisible ? _T("ChevronAll") : _T("ChevronPartial");
  1411. LPCTSTR strDockingAbility = _T("Dockable");
  1412. CExtToolControlBar * pToolBar = DYNAMIC_DOWNCAST( CExtToolControlBar, pHelperSrc );
  1413. if( pToolBar && pToolBar->m_pDockSite == NULL )
  1414. strDockingAbility = _T("Static");
  1415. CExtSkinGlyph & ChevronGlyph = 
  1416. m_Skin[_T("ImageCollection")][_T("ControlBar")][_T("ToolBar")][strToolBarType][strDockingAbility]
  1417. .Glyph( strChevronType );
  1418. ChevronGlyph.Draw( dc.m_hDC, rcButtonArea );
  1419. }
  1420. void CExtPaintManagerSkin::PaintToolbarTextField(
  1421. CDC & dc,
  1422. PAINTTOOLBARTEXTFIELDDATA & _ptbtfd
  1423. )
  1424. {
  1425. ASSERT_VALID( this );
  1426. ASSERT( dc.GetSafeHdc() != NULL );
  1427. CRect rcTextField( _ptbtfd.m_rcButton );
  1428. if( ! _ptbtfd.m_bEnabled )  
  1429. rcTextField.DeflateRect( 1, 2 );
  1430. if( _ptbtfd.m_bComboField )
  1431. {
  1432. PAINTCOMBOFRAMEDATA _pcfd(
  1433. _ptbtfd.m_pHelperSrc,
  1434. rcTextField,
  1435. _ptbtfd.m_bHover,
  1436. _ptbtfd.m_bPushed,
  1437. _ptbtfd.m_bEnabled
  1438. );
  1439. _pcfd.m_bNoTopOuterBorder = true;
  1440. PaintComboFrame( dc, _pcfd );
  1441. dc.SelectClipRgn( NULL );
  1442. } // if( _ptbtfd.m_bComboField )
  1443. else
  1444. {
  1445. } // else from if( _ptbtfd.m_bComboField )
  1446. CRect rcBk( _ptbtfd.m_rcTextField );
  1447. if( ! _ptbtfd.m_bEnabled )
  1448. rcBk.DeflateRect( 0, 1 );
  1449. // dc.FillSolidRect(
  1450. // &rcBk,
  1451. // GetColor( _ptbtfd.m_bEnabled ? COLOR_WINDOW : COLOR_3DFACE, _ptbtfd.m_pHelperSrc, _ptbtfd.m_lParam )
  1452. // );
  1453. if( ! _ptbtfd.m_sText.IsEmpty() )
  1454. {
  1455. COLORREF clrTextOld =
  1456. dc.SetTextColor( 
  1457. ::GetSysColor( _ptbtfd.m_bEnabled ? COLOR_WINDOWTEXT : COLOR_GRAYTEXT )
  1458. );
  1459. CFont * pFontOld =
  1460. dc.SelectObject( &m_FontNormal );
  1461. int nBkModeOld = dc.SetBkMode( TRANSPARENT );
  1462. CRect rcText( _ptbtfd.m_rcTextField );
  1463. rcText.left += 5;
  1464. rcText.top += 2;
  1465. bool bRTL = ( (g_ResourceManager->OnQueryLangLayout()&LAYOUT_RTL) != 0 ) ? true : false;
  1466. DWORD dwDtAlignFlags = bRTL ? (DT_RTLREADING|DT_RIGHT) : 0;
  1467. dc.DrawText(
  1468. _ptbtfd.m_sText,
  1469. _ptbtfd.m_sText.GetLength(),
  1470. &rcText,
  1471. _ptbtfd.m_nDrawTextFlags|dwDtAlignFlags
  1472. );
  1473. dc.SetBkMode( nBkModeOld );
  1474. dc.SelectObject( pFontOld );
  1475. dc.SetTextColor( clrTextOld );
  1476. } // if( !_ptbtfd.m_sText.IsEmpty() )
  1477. }
  1478. void CExtPaintManagerSkin::PaintComboFrame(
  1479. CDC & dc,
  1480. CExtPaintManager::PAINTCOMBOFRAMEDATA & _pcfd
  1481. )
  1482. {
  1483. ASSERT_VALID( this );
  1484. ASSERT( dc.GetSafeHdc() != NULL );
  1485. INT nDD = GetSystemMetrics(SM_CXHTHUMB);
  1486. CRect rectClient( _pcfd.m_rcClient );
  1487. if( _pcfd.m_pHelperSrc != NULL
  1488. && _pcfd.m_pHelperSrc->IsKindOf( RUNTIME_CLASS(CComboBox) )
  1489. )
  1490. {
  1491. CRect rcExclude( rectClient );
  1492. rcExclude.DeflateRect( 2, 2 );
  1493. if( _pcfd.m_bRightText )
  1494. rcExclude.left += nDD;
  1495. else
  1496. rcExclude.right -= nDD;
  1497. dc.ExcludeClipRect( &rcExclude );
  1498. PaintDockerBkgnd(
  1499. true,
  1500. dc,
  1501. (CWnd*)_pcfd.m_pHelperSrc,
  1502. _pcfd.m_lParam
  1503. );
  1504. }
  1505. LPCTSTR strGlyphName = _T("Disabled");
  1506. if( _pcfd.m_bEnabled )
  1507. {
  1508. if( _pcfd.m_bPushed )
  1509. strGlyphName = _T("Pressed");
  1510. else if( _pcfd.m_bHover )
  1511. strGlyphName = _T("Hover");
  1512. else
  1513. strGlyphName = _T("Normal");
  1514. } // if( _pcfd.m_bEnabled )
  1515. CRect rectFrame = rectClient;
  1516. CRect rcDDButton( rectClient );
  1517. rcDDButton.left = rcDDButton.right - nDD;
  1518. rectFrame.right = rcDDButton.left;
  1519. CExtSkinGlyph & glyphFrame = 
  1520. m_Skin[_T("ComboBox")][_T("ComboBoxFrame")].Glyph( strGlyphName );
  1521. CExtSkinGlyph & glyphDropDownButton = 
  1522. m_Skin[_T("ComboBox")][_T("ComboBoxDropDownButton")].Glyph( strGlyphName );
  1523. CExtSkinGlyph & glyphDropDownArrow = 
  1524. m_Skin[_T("ComboBox")][_T("ComboBoxDropDownArrow")].Glyph( strGlyphName );
  1525. if( _pcfd.m_bRightText )
  1526. {
  1527. CDC dcX;
  1528. VERIFY( dcX.CreateCompatibleDC( NULL ) );
  1529. CExtBitmap _bmpBk;
  1530. VERIFY( _bmpBk.FromSurface( dc.m_hDC, rectClient ) );
  1531.    COLORREF * pClrSurface = NULL;
  1532. HBITMAP hBitmap = _bmpBk.CreateBitmap( &pClrSurface );
  1533. ASSERT( hBitmap != NULL && pClrSurface != NULL );
  1534. CBitmap _bmp;
  1535. _bmp.Attach( hBitmap );
  1536. CBitmap * pOldBmp = dcX.SelectObject( CBitmap::FromHandle( hBitmap ) );
  1537. glyphFrame.Draw( dcX.GetSafeHdc(), rectFrame );
  1538. glyphDropDownButton.Draw( dcX.GetSafeHdc(), rcDDButton );
  1539.   glyphDropDownArrow.Draw( dcX.GetSafeHdc(), rcDDButton );
  1540. dcX.SelectObject( pOldBmp );
  1541. CExtBitmap _bmpData;
  1542. VERIFY( _bmpData.FromBitmap( hBitmap ) );
  1543. _bmpData.FlipHorizontal();
  1544.   _bmpData.Draw( dc.m_hDC, rectClient );
  1545. }
  1546. else
  1547. {
  1548. glyphFrame.Draw( dc.m_hDC, rectFrame );
  1549. glyphDropDownButton.Draw( dc.m_hDC, rcDDButton );
  1550. glyphDropDownArrow.Draw( dc.m_hDC, rcDDButton );
  1551. }
  1552. }
  1553. void CExtPaintManagerSkin::PaintPushButton(
  1554. CDC & dc,
  1555. CExtPaintManager::PAINTPUSHBUTTONDATA & _ppbd
  1556. )
  1557. {
  1558. ASSERT_VALID( this );
  1559. ASSERT( dc.GetSafeHdc() != NULL );
  1560. if( _ppbd.m_rcClient.IsRectEmpty() )
  1561. return;
  1562. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  1563. if( _ppbd.m_pHelperSrc != NULL )
  1564. {
  1565. CExtBarButton * pTBB = DYNAMIC_DOWNCAST( CExtBarButton, _ppbd.m_pHelperSrc );
  1566. if( pTBB != NULL )
  1567. {
  1568. if( pTBB->IsRibbonPaintingMode()
  1569. || pTBB->IsKindOf( RUNTIME_CLASS( CExtRibbonButtonDialogLauncher ) )
  1570. )
  1571. {
  1572. Ribbon_PaintPushButton( dc, _ppbd );
  1573. return;
  1574. }
  1575. CExtToolControlBar * pBar = pTBB->GetBar();
  1576. if( pBar != NULL
  1577. && pBar->IsKindOf( RUNTIME_CLASS( CExtRibbonPage ) )
  1578. && (! pTBB->IsNoRibbonLayout() )
  1579. && (! pTBB->IsKindOf( RUNTIME_CLASS( CExtBarMdiRightButton ) ) )
  1580. )
  1581. {
  1582. Ribbon_PaintPushButton( dc, _ppbd );
  1583. return;
  1584. }
  1585. } // if( pTBB != NULL )
  1586. } // if( _ppbd.m_pHelperSrc != NULL )
  1587. #endif // (!defined __EXT_MFC_NO_RIBBON_BAR)
  1588. if( _ppbd.m_pHelperSrc != NULL
  1589. && ( ( _ppbd.m_pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtPopupColorMenuWnd) )
  1590. && _ppbd.m_bHelperColorCellButton
  1591. )
  1592. #if (!defined __EXT_MFC_NO_DATE_PICKER)
  1593. || _ppbd.m_pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtDatePickerWnd) )
  1594. #endif
  1595. )
  1596. )
  1597. {
  1598. CExtPaintManager::PaintPushButton( dc, _ppbd );
  1599. return;
  1600. }
  1601. enum ButtonDrawingMode
  1602. {
  1603. eModeControl,
  1604. eModeToolBar,
  1605. eModeMenuBar,
  1606. eModePopupMenu,
  1607. };
  1608. bool bHorizontal = true;
  1609. ButtonDrawingMode aDrawingMode = eModeControl;
  1610. if( _ppbd.m_pHelperSrc != NULL  )
  1611. {
  1612. if( _ppbd.m_pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtBarButton ) ) )
  1613. {
  1614. CExtBarButton * pBarButton = (CExtBarButton*)_ppbd.m_pHelperSrc;
  1615. CExtToolControlBar * pToolBar = DYNAMIC_DOWNCAST( CExtToolControlBar, pBarButton->GetBar() );
  1616. ASSERT( pToolBar != NULL );
  1617. if( pToolBar->IsKindOf(RUNTIME_CLASS(CExtMenuControlBar)) )
  1618. aDrawingMode = eModeMenuBar;
  1619. else
  1620. aDrawingMode = eModeToolBar;
  1621. if( ! pBarButton->GetNoRotateVerticalLayout() )
  1622. {
  1623. if( pToolBar->IsDockedVertically() )
  1624. bHorizontal = false;
  1625. }
  1626. }
  1627. else if( _ppbd.m_pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtPopupMenuWnd ) ) )
  1628. {
  1629. aDrawingMode = eModePopupMenu;
  1630. }
  1631. else if( _ppbd.m_pHelperSrc->IsKindOf( RUNTIME_CLASS( CWnd ) ) )
  1632. {
  1633. PaintDockerBkgnd( true, dc, (CWnd*)_ppbd.m_pHelperSrc );
  1634. }
  1635. }
  1636. CExtSkinItem 
  1637. * pButton = NULL, 
  1638. * pPushButton = NULL,
  1639. * pDropDownButton = NULL,
  1640. * pDropDownArrow = NULL;
  1641. if( _ppbd.m_bSeparatedDropDown )
  1642. pButton = (&(m_Skin[_T("Button")][_T("SeparatedDropDown")]));
  1643. else if( _ppbd.m_bDropDown )
  1644. pButton = (&(m_Skin[_T("Button")][_T("DropDown")]));
  1645. else
  1646. pButton = (&(m_Skin[_T("Button")][_T("Simple")]));
  1647. LPCTSTR strDockingType = bHorizontal ? _T("Horizontal") : _T("Vertical");
  1648. if( ! _ppbd.m_bEnabled )
  1649. {
  1650. _ppbd.m_bHover = false;
  1651. _ppbd.m_bDrawFocusRect = false;
  1652. _ppbd.m_bIndeterminate = false;
  1653. }
  1654. if( _ppbd.m_bSeparatedDropDown && (_ppbd.m_bPushed || _ppbd.m_bPushedDropDown) )
  1655. _ppbd.m_bHover = false;
  1656. LPCTSTR strState = _T("Normal");
  1657. if( ! _ppbd.m_bEnabled )
  1658. strState = _T("Disabled");
  1659. // else if( _ppbd.m_bPushed )
  1660. else if( _ppbd.m_bPushed || _ppbd.m_bIndeterminate )
  1661. strState = _T("Pressed");
  1662. else if( _ppbd.m_bHover || _ppbd.m_bDrawFocusRect )
  1663. strState = _T("Hover");
  1664. // else if( _ppbd.m_bIndeterminate )
  1665. // strState = _T("Indeterminate");
  1666. else if( _ppbd.m_bDefaultPushButton )
  1667. strState = _T("Default");
  1668. switch( aDrawingMode )
  1669. {
  1670. case eModeControl:
  1671. {
  1672. pPushButton = &(*pButton)[_T("PushButton")][_T("Control")][strState];
  1673. if( _ppbd.m_bDropDown )
  1674. {
  1675.                 pDropDownButton = &(*pButton)[_T("DropDownButton")][_T("Control")][strState];
  1676. pDropDownArrow = &(*pButton)[_T("DropDownArrow")][_T("Control")][strState];
  1677. }
  1678. break;
  1679. }
  1680. case eModePopupMenu:
  1681. case eModeToolBar:
  1682. {
  1683. pPushButton =
  1684. (&((*pButton)
  1685. [_T("PushButton")][_T("ControlBar")][strDockingType]
  1686. [_T("ToolBar")][strState]
  1687. ));
  1688. if( aDrawingMode == eModePopupMenu )
  1689. pPushButton =
  1690. (&((*pPushButton)[_T("PaletteMenu")]));
  1691. if( _ppbd.m_bDropDown )
  1692. {
  1693. pDropDownButton = 
  1694. (&((*pButton)
  1695. [_T("DropDownButton")][_T("ControlBar")][strDockingType]
  1696. [_T("ToolBar")][strState]
  1697. ));
  1698. pDropDownArrow = 
  1699. (&((*pButton)
  1700. [_T("DropDownArrow")][_T("ControlBar")][strDockingType]
  1701. [_T("ToolBar")][strState]
  1702. ));
  1703. if( aDrawingMode == eModePopupMenu )
  1704. {
  1705. pDropDownButton =
  1706. (&((*pDropDownButton)[_T("PaletteMenu")]));
  1707. pDropDownArrow =
  1708. (&((*pDropDownArrow)[_T("PaletteMenu")]));
  1709. }
  1710. } // if( _ppbd.m_bDropDown )
  1711. else
  1712. {
  1713. if( _ppbd.m_pHelperSrc != NULL
  1714. && _ppbd.m_pHelperSrc->IsKindOf( RUNTIME_CLASS( CExtBarContentExpandButton ) )
  1715. )
  1716. pPushButton =
  1717. (&((*pPushButton)[_T("Chevron")]));
  1718. } // else from if( _ppbd.m_bDropDown )
  1719. break;
  1720. }
  1721. case eModeMenuBar:
  1722. {
  1723. pPushButton =
  1724. (&((*pButton)
  1725. [_T("PushButton")][_T("ControlBar")][strDockingType]
  1726. [_T("ToolBar")][_T("MenuBar")][strState]
  1727. ));
  1728. if( _ppbd.m_bDropDown )
  1729. {
  1730. pDropDownButton = 
  1731. (&((*pButton)
  1732. [_T("DropDownButton")][_T("ControlBar")][strDockingType]
  1733. [_T("ToolBar")][_T("MenuBar")][strState]
  1734. ));
  1735. pDropDownArrow = 
  1736. (&((*pButton)
  1737. [_T("DropDownArrow")][_T("ControlBar")][strDockingType]
  1738. [_T("ToolBar")][_T("MenuBar")][strState]
  1739. ));
  1740. }
  1741. break;
  1742. }
  1743. }
  1744. ASSERT( pPushButton != NULL );
  1745. ASSERT( _ppbd.m_bDropDown ? ( pDropDownButton != NULL ) : true );
  1746. ASSERT( _ppbd.m_bDropDown ? ( pDropDownArrow != NULL ) : true );
  1747. if( (! _ppbd.m_bPushed )
  1748. && pDropDownButton
  1749. && _ppbd.m_bPushedDropDown
  1750. )
  1751. pDropDownButton =
  1752. (&( pDropDownButton->GetParent()->Nested( _T("Pressed") ) ));
  1753. BYTE nScaPushButton = BYTE(0x0FF), nScaDropDownButton = BYTE(0x0FF), nScaDropDownArrow = BYTE(0x0FF);
  1754. if( _ppbd.m_bIndeterminate )
  1755. {
  1756. if( pPushButton != NULL )
  1757. {
  1758. CExtSkinItem * pIndeterminate = pPushButton->NestedGet( _T("Indeterminate") );
  1759. if( pIndeterminate != NULL )
  1760. pPushButton = pIndeterminate;
  1761. else
  1762. nScaPushButton = BYTE(0x080);
  1763. }
  1764. if( pDropDownButton != NULL )
  1765. {
  1766. CExtSkinItem * pIndeterminate = pDropDownButton->NestedGet( _T("Indeterminate") );
  1767. if( pIndeterminate != NULL )
  1768. pDropDownButton = pIndeterminate;
  1769. else
  1770. nScaDropDownButton = BYTE(0x080);
  1771. }
  1772. if( pDropDownArrow != NULL )
  1773. {
  1774. CExtSkinItem * pIndeterminate = pDropDownArrow->NestedGet( _T("Indeterminate") );
  1775. if( pIndeterminate != NULL )
  1776. pDropDownArrow = pIndeterminate;
  1777. else
  1778. nScaDropDownArrow = BYTE(0x080);
  1779. }
  1780. }
  1781. bool bRTL = _ppbd.IsRTL();
  1782. CRect rectClient( _ppbd.m_rcClient );
  1783. // rectClient.DeflateRect( _ppbd.m_rcBorderSizes );
  1784. CRect rectCaption( &rectClient );
  1785. if( _ppbd.m_bDropDown )
  1786. {
  1787. CRect rectDeflateSimpleDropDown( 0, 0, 0, 0 );
  1788. if( ! _ppbd.m_bSeparatedDropDown )
  1789. {
  1790. CExtSkinGlyph & PushButtonGlyph =
  1791. pPushButton->Glyph( _T("PushButton") );
  1792. PushButtonGlyph.Draw( dc.m_hDC, rectClient );
  1793. rectDeflateSimpleDropDown =
  1794. PushButtonGlyph.GetContentPadding();
  1795. rectClient.DeflateRect( &rectDeflateSimpleDropDown );
  1796. } // if( ! _ppbd.m_bSeparatedDropDown )
  1797. CRect rectDropDown( rectClient );
  1798. if( _ppbd.m_bHorz )
  1799. {
  1800. if( bRTL )
  1801. {
  1802. rectCaption.left +=
  1803. __DROPDOWN_ARROW_GAP*2
  1804. + g_glyph_btn_expand_bottom.Size().cx
  1805. ;
  1806. rectDropDown.right = rectCaption.left;
  1807. } // if( bRTL )
  1808. else
  1809. {
  1810. rectCaption.right -=
  1811. __DROPDOWN_ARROW_GAP*2
  1812. + g_glyph_btn_expand_bottom.Size().cx
  1813. ;
  1814. rectDropDown.left = rectCaption.right;
  1815. } // else from if( bRTL )
  1816. } // if( _ppbd.m_bHorz )
  1817. else
  1818. {
  1819. rectCaption.bottom -=
  1820. __DROPDOWN_ARROW_GAP*2
  1821. + g_glyph_btn_expand_right.Size().cy
  1822. ;
  1823. rectDropDown.top = rectCaption.bottom;
  1824. } // if( _ppbd.m_bHorz )
  1825. rectClient = rectCaption;
  1826. if( _ppbd.m_bSeparatedDropDown )
  1827. {
  1828. CExtSkinGlyph & PushButtonGlyph =
  1829. pPushButton->Glyph( _T("PushButton") );
  1830. PushButtonGlyph.Draw( dc.m_hDC, rectClient, false, nScaPushButton );
  1831. rectClient.DeflateRect( 
  1832. &PushButtonGlyph.GetContentPadding()
  1833. );
  1834. CExtSkinGlyph & DropDownButtonGlyph =
  1835. pDropDownButton->Glyph( _T("DropDownButton") );
  1836. DropDownButtonGlyph.Draw( dc.m_hDC, rectDropDown, false, nScaDropDownButton );
  1837. CRect rectDropDownArrow( rectDropDown );
  1838. rectDropDownArrow.DeflateRect(
  1839. DropDownButtonGlyph.GetContentPadding()
  1840. );
  1841. CExtSkinGlyph & DropDownArrowGlyph =
  1842. pDropDownArrow->Glyph( _T("DropDownArrow") );
  1843. if( ! _ppbd.m_bNoDropDownArrow )
  1844. DropDownArrowGlyph.Draw( dc.m_hDC, rectDropDownArrow, false, nScaDropDownArrow );
  1845. }
  1846. else
  1847. {
  1848. CExtSkinGlyph & DropDownArrowGlyph =
  1849. pDropDownArrow->Glyph( _T("DropDownArrow") );
  1850. if( ! _ppbd.m_bNoDropDownArrow )
  1851. DropDownArrowGlyph.Draw( dc.m_hDC, rectDropDown, false, nScaDropDownArrow );
  1852. rectClient.DeflateRect( &rectDeflateSimpleDropDown );
  1853. rectCaption = rectClient;
  1854. }
  1855. } // if( _ppbd.m_bDropDown )
  1856. else
  1857. {
  1858. CExtSkinGlyph & PushButtonGlyph =
  1859. pPushButton->Glyph( _T("PushButton") );
  1860. PushButtonGlyph.Draw( dc.m_hDC, rectClient, false, nScaPushButton );
  1861. rectClient.DeflateRect( 
  1862. &PushButtonGlyph.GetContentPadding()
  1863. );
  1864. rectCaption = rectClient;
  1865. } // else from if( _ppbd.m_bDropDown )
  1866. CRect rcFocus( rectCaption );
  1867. CExtSafeString sTitle = _T("");
  1868. if( _ppbd.m_sText != NULL )
  1869. sTitle = _ppbd.m_sText;
  1870. COLORREF clrOldText = dc.GetTextColor();
  1871. COLORREF clrOldBk = dc.GetBkColor();
  1872. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  1873. COLORREF bgColor = 0;
  1874. if( _ppbd.m_clrForceBk != ((COLORREF)-1L) )
  1875. bgColor = _ppbd.m_clrForceBk;
  1876. else if( _ppbd.m_bHover || _ppbd.m_bPushed )
  1877. bgColor = GetColor( CLR_3DFACE_IN, _ppbd.m_pHelperSrc, _ppbd.m_lParam );
  1878. else
  1879. bgColor = GetColor( CLR_3DFACE_OUT, _ppbd.m_pHelperSrc, _ppbd.m_lParam );
  1880. // Draw the icon
  1881. if( rectClient.bottom > rectClient.top
  1882. && rectClient.right > rectClient.left
  1883. )
  1884. {
  1885. if( _ppbd.m_pIcon != NULL && (! _ppbd.m_pIcon->IsEmpty()) )
  1886. {
  1887. PaintIcon(
  1888. dc,
  1889. _ppbd.m_bHorz,
  1890. _ppbd.m_pIcon,
  1891. rectClient,
  1892. _ppbd.m_bPushed,
  1893. _ppbd.m_bEnabled,
  1894. _ppbd.m_bHover,
  1895. _ppbd.m_nIconAlignment,
  1896. _ppbd.m_bForceRtlLayout && _ppbd.m_bHorz,
  1897. NULL,
  1898. &rectCaption,
  1899. &_ppbd.m_rcIconMargins,
  1900. _ppbd.m_clrCustomAccentEffectForIcon
  1901. );
  1902. if( _ppbd.m_nFocusMode == __EBFM_CAPTION_AREA )
  1903. rcFocus = rectCaption;
  1904. if( _ppbd.m_bHorz
  1905. && _ppbd.m_pHelperSrc != NULL
  1906. && _ppbd.m_pHelperSrc->IsKindOf(RUNTIME_CLASS(CExtPopupMenuWnd))
  1907. )
  1908. // if painting tool button with icon in popup menu
  1909. if( bRTL )
  1910. rectCaption.right -= 3;
  1911. else
  1912. rectCaption.left += 3;
  1913. }
  1914. if( ! rectCaption.IsRectEmpty() )
  1915. {
  1916. if( _ppbd.m_bHorz )
  1917. {
  1918. rectCaption.DeflateRect( 
  1919. _ppbd.m_rcTextMargins.left,
  1920. _ppbd.m_rcTextMargins.top,
  1921. _ppbd.m_rcTextMargins.right,
  1922. _ppbd.m_rcTextMargins.bottom
  1923. );
  1924. }
  1925. else
  1926. {
  1927. rectCaption.DeflateRect( 
  1928. _ppbd.m_rcTextMargins.top,
  1929. _ppbd.m_rcTextMargins.right,
  1930. _ppbd.m_rcTextMargins.bottom,
  1931. _ppbd.m_rcTextMargins.left
  1932. );
  1933. }
  1934. }
  1935. } // if( _ppbd.m_pIcon != NULL && (! _ppbd.m_pIcon->IsEmpty()) )
  1936. else
  1937. {
  1938. // -2.62
  1939. //  if( _ppbd.m_bHorz )
  1940. //  rectCaption.DeflateRect( 2, 0 );
  1941. //  else
  1942. //  rectCaption.DeflateRect( 0, 2 );
  1943. PaintSysCmdGlyph(
  1944. dc,
  1945. _ppbd.m_nHelperSysCmdID,
  1946. rectClient,
  1947. false,
  1948. _ppbd.m_bPushed,
  1949. _ppbd.m_bEnabled
  1950. );
  1951. } // else from if( _ppbd.m_pIcon != NULL && (! _ppbd.m_pIcon->IsEmpty()) )
  1952. }
  1953. if( rectCaption.bottom > rectCaption.top
  1954. && rectCaption.right > rectCaption.left
  1955. )
  1956. { // if we have valid area for text
  1957. if( ! sTitle.IsEmpty() )
  1958. {
  1959. if( _ppbd.m_bPushed )
  1960. {
  1961. CSize sizePushedOffset = GetPushedOffset();
  1962. rectCaption.OffsetRect(sizePushedOffset);
  1963. }
  1964. dc.SetBkColor( bgColor );
  1965. COLORREF clrText = COLORREF(-1L);
  1966. if( _ppbd.m_bEnabled )
  1967. {
  1968. if( _ppbd.m_bPushed )
  1969. {
  1970. if( _ppbd.m_clrForceTextPressed == COLORREF(-1L) )
  1971. {
  1972. const CExtSkinColor & skinColor =
  1973. pPushButton->Color( _T("Pressed") );
  1974. if( ! skinColor.IsHollow() )
  1975. clrText = COLORREF( skinColor );
  1976. }
  1977. else
  1978. clrText = _ppbd.m_clrForceTextPressed;
  1979. }
  1980. else if( _ppbd.m_bHover )
  1981. {
  1982. if( _ppbd.m_clrForceTextHover == COLORREF(-1L) )
  1983. {
  1984. const CExtSkinColor & skinColor =
  1985. pPushButton->Color( _T("Hover") );
  1986. if( ! skinColor.IsHollow() )
  1987. clrText = COLORREF( skinColor );
  1988. }
  1989. else
  1990. clrText = _ppbd.m_clrForceTextHover;
  1991. }
  1992. else
  1993. {
  1994. if( _ppbd.m_clrForceTextNormal == COLORREF(-1L) )
  1995. {
  1996. const CExtSkinColor & skinColor =
  1997. pPushButton->Color( _T("Normal") );
  1998. if( ! skinColor.IsHollow() )
  1999. clrText = COLORREF( skinColor );
  2000. }
  2001. else
  2002. clrText = _ppbd.m_clrForceTextNormal;
  2003. }
  2004. } // if( _ppbd.m_bEnabled )
  2005. else
  2006. {
  2007. if( _ppbd.m_clrForceTextDisabled == COLORREF(-1L) )
  2008. {
  2009. const CExtSkinColor & skinColor =
  2010. pPushButton->Color( _T("Disabled") );
  2011. if( ! skinColor.IsHollow() )
  2012. clrText = COLORREF( skinColor );
  2013. }
  2014. else
  2015. clrText = _ppbd.m_clrForceTextDisabled;
  2016. } // else from if( _ppbd.m_bEnabled )
  2017. if( clrText != COLORREF(-1L) )
  2018. { // if skinned color is not hollow
  2019. dc.SetTextColor( clrText );
  2020. CFont _font, * pCurrFont = NULL;
  2021. if( _ppbd.m_hFont != NULL )
  2022. {
  2023. if( _ppbd.m_bHorz )
  2024. pCurrFont = CFont::FromHandle(_ppbd.m_hFont);
  2025. else
  2026. {
  2027. LOGFONT lf;
  2028. ::memset(&lf,0,sizeof(LOGFONT));
  2029. ::GetObject(_ppbd.m_hFont, sizeof(LOGFONT), &lf);
  2030. if( lf.lfEscapement == 0 )
  2031. {
  2032. lf.lfEscapement = __EXT_VERT_FONT_ESCAPEMENT__;
  2033. VERIFY( _font.CreateFontIndirect(&lf) );
  2034. pCurrFont = &_font;
  2035. }
  2036. else
  2037. {
  2038. // suppose font already prepared
  2039. pCurrFont = CFont::FromHandle( _ppbd.m_hFont );
  2040. }
  2041. }
  2042. } // if( _ppbd.m_hFont != NULL )
  2043. else
  2044. {
  2045. if( _ppbd.m_bEnabled )
  2046. {
  2047. if( _ppbd.m_bPushed )
  2048. {
  2049. const CExtSkinFont & skinFont =
  2050. pPushButton->Font(
  2051. _ppbd.m_bDefaultPushButton
  2052. ? _T("PressedDefault")
  2053. : _T("Pressed")
  2054. );
  2055. if( skinFont.CreateFont(
  2056. _font,
  2057. _ppbd.m_bHorz
  2058. ? 0
  2059. : __EXT_VERT_FONT_ESCAPEMENT__
  2060. )
  2061. )
  2062. pCurrFont = &_font;
  2063. #ifdef _DEBUG
  2064. else
  2065. {
  2066. ASSERT( FALSE );
  2067. }
  2068. #endif // _DEBUG
  2069. }
  2070. else if( _ppbd.m_bHover )
  2071. {
  2072. const CExtSkinFont & skinFont =
  2073. pPushButton->Font(
  2074. _ppbd.m_bDefaultPushButton
  2075. ? _T("HoverDefault")
  2076. : _T("Hover")
  2077. );
  2078. if( skinFont.CreateFont(
  2079. _font,
  2080. _ppbd.m_bHorz
  2081. ? 0
  2082. : __EXT_VERT_FONT_ESCAPEMENT__
  2083. )
  2084. )
  2085. pCurrFont = &_font;
  2086. #ifdef _DEBUG
  2087. else
  2088. {
  2089. ASSERT( FALSE );
  2090. }
  2091. #endif // _DEBUG
  2092. }
  2093. else
  2094. {
  2095. const CExtSkinFont & skinFont =
  2096. pPushButton->Font(
  2097. _ppbd.m_bDefaultPushButton
  2098. ? _T("NormalDefault")
  2099. : _T("Normal")
  2100. );
  2101. if( skinFont.CreateFont(
  2102. _font,
  2103. _ppbd.m_bHorz
  2104. ? 0
  2105. : __EXT_VERT_FONT_ESCAPEMENT__
  2106. )
  2107. )
  2108. pCurrFont = &_font;
  2109. #ifdef _DEBUG
  2110. else
  2111. {
  2112. ASSERT( FALSE );
  2113. }
  2114. #endif // _DEBUG
  2115. }
  2116. } // if( _ppbd.m_bEnabled )
  2117. else
  2118. {
  2119. const CExtSkinFont & skinFont =
  2120. pPushButton->Font(
  2121. _ppbd.m_bDefaultPushButton
  2122. ? _T("DisabledDefault")
  2123. : _T("Disabled")
  2124. );
  2125. if( skinFont.CreateFont(
  2126. _font,
  2127. _ppbd.m_bHorz
  2128. ? 0
  2129. : __EXT_VERT_FONT_ESCAPEMENT__
  2130. )
  2131. )
  2132. pCurrFont = &_font;
  2133. #ifdef _DEBUG
  2134. else
  2135. {
  2136. ASSERT( FALSE );
  2137. }
  2138. #endif // _DEBUG
  2139. } // else from if( _ppbd.m_bEnabled )
  2140. } // else from if( _ppbd.m_hFont != NULL )
  2141. if( pCurrFont->GetSafeHandle() != NULL )
  2142. {
  2143. CFont * pOldFont = dc.SelectObject( pCurrFont );
  2144. CExtSafeString sBtn( sTitle );
  2145. if( _ppbd.m_bHorz )
  2146. {
  2147. CRect rcTextLocation( 0, 0, 0, 0);
  2148. UINT nDtMeasureFlags =
  2149. DT_LEFT | DT_TOP | DT_CALCRECT | ((bRTL || _ppbd.m_bForceRtlText) ? DT_RTLREADING : 0);
  2150. if( _ppbd.m_bWordBreak )
  2151. {
  2152. rcTextLocation = rectCaption;
  2153. rcTextLocation.OffsetRect( -rcTextLocation.TopLeft() );
  2154. rcTextLocation.bottom = rcTextLocation.top;
  2155. nDtMeasureFlags |= DT_WORDBREAK;
  2156. }
  2157. else
  2158. nDtMeasureFlags |= DT_SINGLELINE;
  2159. dc.DrawText(
  2160. sBtn, 
  2161. -1,
  2162. rcTextLocation,
  2163. nDtMeasureFlags
  2164. );
  2165. rcTextLocation.OffsetRect(
  2166. rectCaption.TopLeft() - rcTextLocation.TopLeft()
  2167. );
  2168. UINT nDtDrawFlags = 0;
  2169. if( (_ppbd.m_nTextAlignment&__ALIGN_HORIZ_MASK) == __ALIGN_HORIZ_RIGHT )
  2170. {
  2171. nDtDrawFlags |= DT_RIGHT;
  2172. rcTextLocation.OffsetRect(
  2173. rectCaption.Width() - rcTextLocation.Width(),
  2174. 0
  2175. );
  2176. }
  2177. else if( (_ppbd.m_nTextAlignment&__ALIGN_HORIZ_MASK) == __ALIGN_HORIZ_CENTER )
  2178. {
  2179. nDtDrawFlags |= DT_CENTER;
  2180. rcTextLocation.OffsetRect(
  2181. ( rectCaption.Width() - rcTextLocation.Width() ) / 2,
  2182. 0
  2183. );
  2184. }
  2185. else
  2186. nDtDrawFlags |= DT_LEFT;
  2187. if( (_ppbd.m_nTextAlignment&__ALIGN_VERT_MASK) == __ALIGN_VERT_BOTTOM )
  2188. {
  2189. nDtDrawFlags |= DT_BOTTOM;
  2190. rcTextLocation.OffsetRect(
  2191. 0,
  2192. rectCaption.Height() - rcTextLocation.Height()
  2193. );
  2194. }
  2195. else if( (_ppbd.m_nTextAlignment&__ALIGN_VERT_MASK) == __ALIGN_VERT_TOP )
  2196. {
  2197. nDtDrawFlags |= DT_TOP;
  2198. }
  2199. else
  2200. {
  2201. nDtDrawFlags |= DT_VCENTER;
  2202. rcTextLocation.OffsetRect(
  2203. 0,
  2204. ( rectCaption.Height() - rcTextLocation.Height() ) / 2
  2205. );
  2206. }
  2207. if( _ppbd.m_bWordBreak )
  2208. nDtDrawFlags |= DT_WORDBREAK;
  2209. else
  2210. nDtDrawFlags |= DT_SINGLELINE;
  2211. if( _ppbd.m_bPushed )
  2212. {
  2213. CSize szPushedOffset = GetPushedOffset();
  2214. rcTextLocation.OffsetRect( szPushedOffset );
  2215. }
  2216. if( _ppbd.m_bForceUseDrawTextApiH )
  2217. {
  2218. dc.DrawText(
  2219. sTitle,
  2220. -1,
  2221. &rcTextLocation,
  2222. nDtDrawFlags
  2223. );
  2224. } // if( _ppbd.m_bForceUseDrawTextApiH )
  2225. else
  2226. {
  2227. if( _ppbd.m_bEnabled 
  2228. || _ppbd.m_clrForceTextDisabled != ((COLORREF)-1L)
  2229. )
  2230. {
  2231. dc.DrawText(
  2232. LPCTSTR(sTitle),
  2233. sTitle.GetLength(),
  2234. &rcTextLocation,
  2235. nDtDrawFlags
  2236. );
  2237. }
  2238. else
  2239. {
  2240. CRect rcDrawTextOffs = rcTextLocation;
  2241. rcDrawTextOffs.OffsetRect( 1, 1 );
  2242. COLORREF clrTextRestore =
  2243. dc.SetTextColor(
  2244. GetColor(
  2245. COLOR_3DHILIGHT,
  2246. _ppbd.m_pHelperSrc,
  2247. _ppbd.m_lParam
  2248. )
  2249. );
  2250. dc.DrawText(
  2251. LPCTSTR(sTitle),
  2252. sTitle.GetLength(),
  2253. &rcDrawTextOffs,
  2254. nDtDrawFlags
  2255. );
  2256. dc.SetTextColor(
  2257. GetColor(
  2258. COLOR_3DSHADOW,
  2259. _ppbd.m_pHelperSrc,
  2260. _ppbd.m_lParam
  2261. )
  2262. );
  2263. dc.DrawText(
  2264. LPCTSTR(sTitle),
  2265. sTitle.GetLength(),
  2266. rcTextLocation,
  2267. nDtDrawFlags
  2268. );
  2269. dc.SetTextColor( clrTextRestore );
  2270. } // else from if( _ppbd.m_bEnabled )
  2271. } // else from if( _ppbd.m_bForceUseDrawTextApiH )
  2272. } // if( _ppbd.m_bHorz )
  2273. else
  2274. {
  2275. INT nTextLength = sTitle.GetLength();
  2276. INT nAmpIndex = sTitle.Find( _T('&') );
  2277.   if( nAmpIndex >= 0 )
  2278. sBtn =
  2279. sTitle.Left( nAmpIndex )
  2280. + sTitle.Right( nTextLength - ( nAmpIndex + 1 ) );
  2281. static TCHAR stat_strDummyAmpSeq[] = _T("0101");
  2282. sBtn.Replace( _T("&&"), stat_strDummyAmpSeq );
  2283. sBtn.Remove( _T('&') );
  2284. sBtn.Replace( stat_strDummyAmpSeq, _T("&") );
  2285. CFont * pFont = 
  2286. _ppbd.m_bDefaultPushButton 
  2287. ? &m_FontBold 
  2288. : &m_FontNormal;
  2289. CRect rcText =
  2290. stat_CalcTextDimension( dc, *pFont, sBtn );
  2291. CRect rcTextLocation( 
  2292. 0, 0, 
  2293. rcText.Height(), rcText.Width()
  2294. );
  2295. rcTextLocation.OffsetRect(
  2296. rectCaption.TopLeft()
  2297. );
  2298. if( (_ppbd.m_nTextAlignment&__ALIGN_HORIZ_MASK) == __ALIGN_HORIZ_RIGHT )
  2299. {
  2300. rcTextLocation.OffsetRect(
  2301. 0,
  2302. rectCaption.Height() - rcTextLocation.Height()
  2303. );
  2304. }
  2305. else if( (_ppbd.m_nTextAlignment&__ALIGN_HORIZ_MASK) == __ALIGN_HORIZ_CENTER )
  2306. {
  2307. rcTextLocation.OffsetRect(
  2308. 0,
  2309. ( rectCaption.Height() - rcTextLocation.Height() ) / 2
  2310. );
  2311. }
  2312. if( (_ppbd.m_nTextAlignment&__ALIGN_VERT_MASK) == __ALIGN_VERT_TOP )
  2313. {
  2314. rcTextLocation.OffsetRect(
  2315. rectCaption.Width() - rcTextLocation.Width(),
  2316. 0
  2317. );
  2318. }
  2319. else if( (_ppbd.m_nTextAlignment&__ALIGN_VERT_MASK) == __ALIGN_VERT_CENTER )
  2320. {
  2321. rcTextLocation.OffsetRect(
  2322. ( rectCaption.Width() - rcTextLocation.Width() ) / 2,
  2323. 0
  2324. );
  2325. }
  2326. rcTextLocation.OffsetRect( 1, 0 );
  2327. COLORREF clrText = GetColor( COLOR_3DSHADOW, _ppbd.m_pHelperSrc, _ppbd.m_lParam );
  2328. COLORREF clrShadow = GetColor( COLOR_3DHILIGHT, _ppbd.m_pHelperSrc, _ppbd.m_lParam );
  2329. CPoint ptOffset( 1, 1 );
  2330. if( nAmpIndex >= 0 )
  2331. {
  2332. CPoint ptLineFrom = 
  2333. CPoint(
  2334. rcTextLocation.left,
  2335. rcTextLocation.top + stat_CalcTextWidth( dc, *pFont, sBtn.Left( nAmpIndex ) )
  2336. );
  2337. CPoint ptLineTo =
  2338. CPoint(
  2339. rcTextLocation.left,
  2340. rcTextLocation.top + stat_CalcTextWidth( dc, *pFont, sBtn.Left( nAmpIndex + 1 ) )
  2341. );
  2342. CPen pen;
  2343. CPen * pOldPen = NULL;
  2344. if( _ppbd.m_bEnabled 
  2345. || _ppbd.m_clrForceTextDisabled != ((COLORREF)-1L) 
  2346. )
  2347. {
  2348. pen.CreatePen( PS_SOLID, 0, dc.GetTextColor() );
  2349. pOldPen = dc.SelectObject( &pen );
  2350. dc.MoveTo( ptLineFrom );
  2351. dc.LineTo( ptLineTo );
  2352. dc.SelectObject( pOldPen );
  2353. }
  2354. else
  2355. {
  2356. ptLineFrom += ptOffset;
  2357. ptLineTo += ptOffset;
  2358. pen.CreatePen( PS_SOLID, 0, clrShadow );
  2359. pOldPen = dc.SelectObject( &pen );
  2360. dc.MoveTo( ptLineFrom );
  2361. dc.LineTo( ptLineTo );
  2362. pen.DeleteObject();
  2363. ptLineFrom -= ptOffset;
  2364. ptLineTo -= ptOffset;
  2365. pen.CreatePen( PS_SOLID, 0, clrText );
  2366. dc.SelectObject( &pen );
  2367. dc.MoveTo( ptLineFrom );
  2368. dc.LineTo( ptLineTo );
  2369. pen.DeleteObject();
  2370. dc.SelectObject( pOldPen );
  2371. }
  2372. }
  2373. rcTextLocation.OffsetRect(
  2374. rcTextLocation.Width() + 1,
  2375. 0
  2376. );
  2377. if( _ppbd.m_bEnabled 
  2378. || _ppbd.m_clrForceTextDisabled != ((COLORREF)-1L) 
  2379. )
  2380. {
  2381. dc.DrawText(
  2382. sBtn,
  2383. sBtn.GetLength(),
  2384. rcTextLocation,
  2385. DT_SINGLELINE | DT_NOCLIP | DT_NOPREFIX
  2386. );
  2387. }
  2388. else
  2389. {
  2390. rcTextLocation.OffsetRect( ptOffset.x, ptOffset.y );
  2391. COLORREF clrTextOld = dc.SetTextColor( clrShadow );
  2392. dc.DrawText(
  2393. sBtn,
  2394. sBtn.GetLength(),
  2395. rcTextLocation,
  2396. DT_SINGLELINE | DT_NOCLIP | DT_NOPREFIX
  2397. );
  2398. rcTextLocation.OffsetRect( -ptOffset.x, -ptOffset.y );
  2399. dc.SetTextColor( clrText );
  2400. dc.DrawText(
  2401. sBtn,
  2402. sBtn.GetLength(),
  2403. rcTextLocation,
  2404. DT_SINGLELINE | DT_NOCLIP | DT_NOPREFIX
  2405. );
  2406. dc.SetTextColor( clrTextOld );
  2407. }
  2408. } // else from if( _ppbd.m_bHorz )
  2409. dc.SelectObject( pOldFont );
  2410. } // if( pCurrFont->GetSafeHandle() != NULL )
  2411. } // if skinned color is not hollow
  2412. } // if( !sTitle.IsEmpty() )
  2413. } // if we have valid area for text
  2414. if( _ppbd.m_bDrawFocusRect 
  2415. && ( ( !sTitle.IsEmpty() ) || _ppbd.m_nFocusMode == __EBFM_CLIENT_AREA )
  2416. && rcFocus.bottom > rcFocus.top 
  2417. && rcFocus.right > rcFocus.left
  2418. )
  2419. {
  2420. rcFocus.DeflateRect( 2, 2 );
  2421. dc.DrawFocusRect( &rcFocus );
  2422. }
  2423. dc.SetBkMode( nOldBkMode );
  2424. dc.SetBkColor( clrOldBk );
  2425. dc.SetTextColor( clrOldText );
  2426. }
  2427. bool CExtPaintManagerSkin::GetCb2DbTransparentMode(
  2428. CObject * pObjHelperSrc,
  2429. LPARAM lParam /*= 0L*/
  2430. )
  2431. {
  2432. pObjHelperSrc;
  2433. lParam;
  2434. return true;
  2435. }
  2436. bool CExtPaintManagerSkin::PaintDockerBkgnd(
  2437. bool bClientMapping,
  2438. CDC & dc,
  2439. CWnd * pWnd,
  2440. LPARAM lParam // = NULL
  2441. )
  2442. {
  2443. ASSERT_VALID( this );
  2444. ASSERT( dc.GetSafeHdc() != NULL );
  2445. ASSERT( pWnd->GetSafeHwnd() != NULL && ::IsWindow(pWnd->GetSafeHwnd()) );
  2446. if( RenderCustomBackground(
  2447. bClientMapping,
  2448. dc,
  2449. pWnd,
  2450. lParam
  2451. )
  2452. )
  2453. return true;
  2454. if( ! GetCb2DbTransparentMode( pWnd ) )
  2455. return false;
  2456. CRect rcBarSpecificShade( 0, 0, 0, 0 );
  2457. CExtToolControlBar * pToolBar = NULL;
  2458. #ifndef __EXT_MFC_NO_STATUSBAR
  2459. CExtStatusControlBar * pStatusBar = NULL;
  2460. #endif // ifndef __EXT_MFC_NO_STATUSBAR
  2461. CWnd * pFrame = pWnd;
  2462. for( ;
  2463. pFrame != NULL;
  2464. pFrame = pFrame->GetParent()
  2465. )
  2466. {
  2467. if( (pFrame->GetStyle() & WS_CHILD) == 0 )
  2468. {
  2469. // (- 2.25)
  2470. // if(! pFrame->IsKindOf(RUNTIME_CLASS(CFrameWnd)) )
  2471. // return false;
  2472. break;
  2473. }
  2474. else // frame features - design mode
  2475. if( pFrame->IsKindOf(RUNTIME_CLASS(CFrameWnd)) )
  2476. {
  2477. CMDIChildWnd * pWndMdiChild =
  2478. DYNAMIC_DOWNCAST( CMDIChildWnd, pFrame );
  2479. if( pWndMdiChild != NULL )
  2480. {
  2481. CMDIFrameWnd * pWndMdiFrame =
  2482. STATIC_DOWNCAST( CMDIFrameWnd, pFrame->GetParentFrame() );
  2483. BOOL bMax = FALSE;
  2484. pWndMdiFrame->MDIGetActive( &bMax );
  2485. if( bMax )
  2486. pFrame = pWndMdiFrame;
  2487. } // if( pWndMdiChild != NULL )
  2488. break;
  2489. }
  2490. if( pFrame->IsKindOf( RUNTIME_CLASS(CExtToolControlBar) ) )
  2491. {
  2492. if( ((CExtToolControlBar*)pFrame)->m_pDockSite != NULL )
  2493. {
  2494. // if( (!( pFrame->IsKindOf( RUNTIME_CLASS(CExtPanelControlBar) )
  2495. // || pFrame->IsKindOf( RUNTIME_CLASS(CExtMenuControlBar) )
  2496. // ) )
  2497. // && (! ((CExtToolControlBar*)pFrame)->m_bForceNoBalloonWhenRedockable)
  2498. // )
  2499. {
  2500. if( ((CExtToolControlBar*)pFrame)->m_pDockBar == NULL )
  2501. continue;
  2502. if( pToolBar == NULL )
  2503. {
  2504. pToolBar = (CExtToolControlBar*)pFrame;
  2505. pFrame->GetWindowRect( &rcBarSpecificShade );
  2506. }
  2507. }
  2508. }
  2509. //break;
  2510. }
  2511. #ifndef __EXT_MFC_NO_STATUSBAR
  2512. else
  2513. if( pFrame->IsKindOf( RUNTIME_CLASS(CExtStatusControlBar) ) )
  2514. {
  2515. if( pStatusBar == NULL )
  2516. {
  2517. pStatusBar = (CExtStatusControlBar*)pFrame;
  2518. pFrame->GetWindowRect( &rcBarSpecificShade );
  2519. }
  2520. //break;
  2521. }
  2522. #endif // ifndef __EXT_MFC_NO_STATUSBAR
  2523. }
  2524. if( pFrame == NULL )
  2525. return false;
  2526. // CExtToolControlBar::FtLayoutQuery _FtLayoutQuery;
  2527. // if( _FtLayoutQuery.Query( pWnd->m_hWnd ) )
  2528. // {
  2529. // if( bClientMapping )
  2530. // _FtLayoutQuery.ReMapRectsToTargetClient();
  2531. // else
  2532. // _FtLayoutQuery.ReMapRectsToTargetWindow();
  2533. // _FtLayoutQuery.DrawRects( dc );
  2534. // return true;
  2535. // } // if( _FtLayoutQuery.Query( pWnd->m_hWnd ) )
  2536. CRect rcPaintGradient;
  2537. // pFrame->GetClientRect( &rcPaintGradient );
  2538. // pFrame->ClientToScreen( &rcPaintGradient );
  2539. pFrame->GetWindowRect( &rcPaintGradient );
  2540. if( bClientMapping )
  2541. {
  2542. pWnd->ScreenToClient( &rcPaintGradient );
  2543. pWnd->ScreenToClient( &rcBarSpecificShade );
  2544. } // if( bClientMapping )
  2545. else
  2546. {
  2547. CRect rc;
  2548. pWnd->GetWindowRect( &rc );
  2549. rcPaintGradient.OffsetRect( -rc.left, -rc.top );
  2550. rcBarSpecificShade.OffsetRect( -rc.left, -rc.top );
  2551. } // else from if( bClientMapping )
  2552. if( ::IsRectEmpty( &rcPaintGradient )
  2553. || ( ! dc.RectVisible( &rcPaintGradient ) )
  2554. )
  2555. return true;
  2556. // if( clrSolidShade0 != ((COLORREF)(-1L)) )
  2557. // {
  2558. // if( clrSolidShade1 != ((COLORREF)(-1L)) )
  2559. // {
  2560. // bool bRTL = ( (dc.GetLayout()&LAYOUT_RTL) != 0 ) ? true : false;
  2561. // if( bRTL )
  2562. // {
  2563. // COLORREF clrTmp = clrSolidShade0;
  2564. // clrSolidShade0 = clrSolidShade1;
  2565. // clrSolidShade1 = clrTmp;
  2566. // } // if( bRTL )
  2567. // stat_PaintGradientRect(
  2568. // dc,
  2569. // rcPaintGradient,
  2570. // clrSolidShade0,
  2571. // clrSolidShade1,
  2572. // true
  2573. // );
  2574. // } // if( clrSolidShade1 != ((COLORREF)(-1L)) )
  2575. // else
  2576. // dc.FillSolidRect( rcPaintGradient, clrSolidShade0 );
  2577. // return true;
  2578. // } // if( clrSolidShade0 != ((COLORREF)(-1L)) )
  2579. CExtSkinGlyph & BkColorGlyph = m_Skin[_T("Background")].Glyph( _T("Background") );
  2580. BkColorGlyph.Draw( dc.m_hDC, rcPaintGradient );
  2581. if( pToolBar != NULL )
  2582. {
  2583. // if( OnQueryUseThemeColors() )
  2584. // {
  2585. // // if use WinXP themed colors
  2586. // COLORREF clrFillHint;
  2587. // OnQueryThemeColors( &clrFillHint );
  2588. // COLORREF clrLeft = stat_HLS_Adjust( clrFillHint,  0.00, 0.77, 0.15 );
  2589. // COLORREF clrMiddle = stat_HLS_Adjust( clrFillHint,  0.00, 0.58, 0.15 );
  2590. // COLORREF clrRight = stat_HLS_Adjust( clrFillHint,  0.00,-0.25,-0.25 );
  2591. // if( OnQuerySystemTheme() == ThemeLunaSilver )
  2592. // clrRight = stat_HLS_Adjust( clrRight, 0.05, 0.00, 0.05 );
  2593. // stat_PaintGradientRect2steps( 
  2594. // dc, 
  2595. // rcPaintGradient, 
  2596. // clrLeft, 
  2597. // clrMiddle, 
  2598. // clrRight,
  2599. // bToolbarHorz 
  2600. //  );
  2601. // } // if( OnQueryUseThemeColors() )
  2602. // else
  2603. // {
  2604. // COLORREF clrLeft = 
  2605. // bToolbarHorz 
  2606. // ? GetColor( _2003CLR_MLA_NORM_RIGHT, pWnd, lParam )
  2607. // : GetColor( _2003CLR_MLA_NORM_LEFT, pWnd, lParam )
  2608. // ;
  2609. // COLORREF clrRight = 
  2610. // bToolbarHorz 
  2611. // ? GetColor( _2003CLR_MLA_NORM_LEFT, pWnd, lParam )
  2612. // : GetColor( _2003CLR_MLA_NORM_RIGHT, pWnd, lParam )
  2613. // ;
  2614. // stat_PaintGradientRect( 
  2615. // dc,
  2616. // rcPaintGradient,
  2617. // clrLeft,
  2618. // clrRight,
  2619. // bToolbarHorz 
  2620. // );
  2621. // } // else from if( OnQueryUseThemeColors() )
  2622. ASSERT_VALID( pToolBar );
  2623. if( pToolBar->IsFloating() )
  2624. {
  2625. // EG - TO DO - PAINT FLOATING TOOLBAR'S CLIENT AREA
  2626. }
  2627. else
  2628. {
  2629. // LPCTSTR strBarType = _T("ToolBar");
  2630. // if( pToolBar->IsKindOf( RUNTIME_CLASS( CExtMenuControlBar ) ) )
  2631. // strBarType = _T("MenuBar");
  2632. //
  2633. // LPCTSTR strDockingType;
  2634. // if( pToolBar->IsDockedVertically() )
  2635. // strDockingType = _T("Vertical");
  2636. // else
  2637. // strDockingType = _T("Horizontal");
  2638. //
  2639. // LPCTSTR strDockingAbility;
  2640. // if( pToolBar->m_pDockSite == NULL )
  2641. // strDockingAbility = _T("Static");
  2642. // else
  2643. // strDockingAbility = _T("Dockable");
  2644. //
  2645. // CExtSkinGlyph & ToolBarBk =
  2646. // m_Skin[_T("Background")][_T("ControlBar")][strBarType][strDockingType][strDockingAbility]
  2647. // .Glyph( _T("Background") );
  2648. //
  2649. // ToolBarBk.Draw( dc.m_hDC, rcBarSpecificShade );
  2650. _GetDockedToolBarGlyph( pToolBar ).Draw( dc.m_hDC, rcBarSpecificShade ); 
  2651. } // if( pToolBar->IsFloating() )
  2652. } // if( pToolBar != NULL )
  2653. #ifndef __EXT_MFC_NO_STATUSBAR
  2654. else if( pStatusBar != NULL )
  2655. {
  2656. // EG - TO DO - PAINT STATUS BAR ENTIRE BACKGROUND !!! ALREADY IMPLEMENTED
  2657. CExtSkinGlyph & StatusBarBk =
  2658. m_Skin[_T("Background")][_T("ControlBar")][_T("StatusBar")][_T("EntireBackground")]
  2659. .Glyph( _T("Background") );
  2660. StatusBarBk.Draw( dc.m_hDC, rcBarSpecificShade );
  2661. } // if( pStatusBar != NULL )
  2662. #endif // ifndef __EXT_MFC_NO_STATUSBAR
  2663. else
  2664. {
  2665. // CRect rcWnd;
  2666. // pWnd->GetClientRect( &rcWnd );
  2667. // pFrame->ClientToScreen( &rcWnd );
  2668. // PaintDockerBkgnd( 
  2669. // bClientMapping,
  2670. // dc,  
  2671. // rcPaintGradient,
  2672. // rcWnd
  2673. // );
  2674. } // else from ...
  2675. return true;
  2676. }
  2677. void CExtPaintManagerSkin::PaintControlBarBorders(
  2678. CDC & dc,
  2679. CExtPaintManager::PAINTCONTROLBARBORDERSDATA & _pcbbd
  2680. )
  2681. {
  2682. ASSERT_VALID( this );
  2683. ASSERT( dc.GetSafeHdc() != NULL );
  2684. _pcbbd;
  2685. dc;
  2686. // if( _pcbbd.m_eCBBT == __CB_INNER_STATUSBAR_ITEM )
  2687. // {
  2688. // COLORREF clr = GetColor( _2003CLR_STATUSBAR_ITEM, _pcbbd.m_pHelperSrc, _pcbbd.m_lParam );
  2689. // dc.Draw3dRect( &_pcbbd.m_rc, clr, clr );
  2690. // return;
  2691. // } // if( _pcbbd.m_eCBBT == __CB_INNER_STATUSBAR_ITEM )
  2692. // CExtPaintManagerXP::PaintControlBarBorders( dc, _pcbbd );
  2693. }
  2694. void CExtPaintManagerSkin::PaintDockBarClientArea(
  2695. CDC & dc,
  2696. const RECT & rcClient,
  2697. CObject * pHelperSrc,
  2698. LPARAM lParam // = 0L
  2699. )
  2700. {
  2701. ASSERT_VALID( this );
  2702. ASSERT( dc.GetSafeHdc() != NULL );
  2703. if( ::IsRectEmpty( &rcClient )
  2704. || ( ! dc.RectVisible( &rcClient ) )
  2705. )
  2706. return;
  2707. CRect rcPaintGradient( 0, 0, 0, 0 );
  2708. CExtDockOuterBar * pOuterDocker = NULL;
  2709. if( pHelperSrc != NULL )
  2710. {
  2711. pOuterDocker =
  2712. DYNAMIC_DOWNCAST(
  2713. CExtDockOuterBar,
  2714. pHelperSrc
  2715. );
  2716. if( pOuterDocker != NULL )
  2717. {
  2718. CFrameWnd * pFrame =
  2719. pOuterDocker->GetParentFrame();
  2720. ASSERT_VALID( pFrame );
  2721. pFrame->GetClientRect( &rcPaintGradient );
  2722. pFrame->ClientToScreen( &rcPaintGradient );
  2723. pOuterDocker->ScreenToClient( &rcPaintGradient );
  2724. if( ::IsRectEmpty( &rcPaintGradient )
  2725. || ( ! dc.RectVisible( &rcPaintGradient ) )
  2726. )
  2727. return;
  2728. }
  2729. }
  2730. // if( pOuterDocker == NULL
  2731. // || dc.GetDeviceCaps( BITSPIXEL ) <= 8
  2732. // )
  2733. // {
  2734. // CExtPaintManagerXP::PaintDockBarClientArea(
  2735. // dc,
  2736. // rcClient,
  2737. // pHelperSrc,
  2738. // lParam
  2739. // );
  2740. // return;
  2741. // }
  2742. if( RenderCustomBackground(
  2743. true,
  2744. dc,
  2745. pHelperSrc,
  2746. lParam
  2747. )
  2748. )
  2749. return;
  2750. if( pHelperSrc != NULL )
  2751. {
  2752. CWnd * pWnd = DYNAMIC_DOWNCAST( CWnd, pHelperSrc );
  2753. if( pWnd != NULL
  2754. && pWnd->GetSafeHwnd() != NULL
  2755. && PaintDockerBkgnd(
  2756. true,
  2757. dc,
  2758. pWnd,
  2759. lParam
  2760. )
  2761. )
  2762. return;
  2763. }
  2764. CExtPaintManager::PaintDockBarClientArea(
  2765. dc,
  2766. rcClient,
  2767. pHelperSrc,
  2768. lParam
  2769. );
  2770. }
  2771. void CExtPaintManagerSkin::PaintDockingFrame(
  2772. CDC & dc,
  2773. CExtPaintManager::PAINTDOCKINGFRAMEDATA & _pdfd
  2774. )
  2775. {
  2776. ASSERT_VALID( this );
  2777. ASSERT( dc.GetSafeHdc() != NULL );
  2778. CExtMiniDockFrameWnd * pMiniFrame =
  2779. DYNAMIC_DOWNCAST(
  2780. CExtMiniDockFrameWnd,
  2781. _pdfd.m_pHelperSrc
  2782. );
  2783. if( pMiniFrame != NULL )
  2784. {
  2785. CExtSkinGlyph & BkColorGlyph = 
  2786. m_Skin[_T("Background")][_T("Frame")][_T("MiniFrame")].Glyph( _T("Background") );
  2787. BkColorGlyph.Draw( dc.m_hDC, _pdfd.m_rcWindow );
  2788.  
  2789. LPCTSTR strBarType = _T("ResizableBar");
  2790. CExtControlBar *pBar = NULL;
  2791. CWnd * pWnd = pMiniFrame->GetWindow( GW_CHILD );
  2792. if( pWnd )
  2793. {
  2794. pWnd = pWnd->GetWindow( GW_CHILD );
  2795. pBar = DYNAMIC_DOWNCAST( CExtControlBar, pWnd );
  2796. if( pWnd && pWnd->IsKindOf( RUNTIME_CLASS( CExtToolControlBar ) ) )
  2797. {
  2798. if( pWnd->IsKindOf( RUNTIME_CLASS( CExtMenuControlBar ) ) )
  2799. strBarType = _T("MenuBar");
  2800. else
  2801. strBarType = _T("ToolBar");
  2802. }
  2803. }
  2804. LPCTSTR strActiveBarState = _T("Active");
  2805. if( pBar && !pBar->IsBarWindowActive() )
  2806. strActiveBarState = _T("Inactive");
  2807. CExtSkinItem & Frame = 
  2808. m_Skin[_T("Frame")][_T("MiniFrame")][_T("ControlBar")][strBarType][strActiveBarState];
  2809. CExtSkinItem & Caption =
  2810. m_Skin[_T("Caption")][_T("Frame")][_T("MiniFrame")][_T("ControlBar")][strBarType][strActiveBarState];
  2811. CExtSkinGlyph & FrameGlyph = Frame.Glyph( _T("Frame") );
  2812. CExtSkinGlyph & CaptionGlyph = Caption.Glyph( _T("Caption") );
  2813. FrameGlyph.Draw( dc.m_hDC, _pdfd.m_rcWindow );
  2814. CRect rcCaption;
  2815. VERIFY(
  2816. Bar_MiniDockFrameCaptionCalcRect(
  2817. rcCaption,
  2818. pMiniFrame,
  2819. pBar
  2820. )
  2821. );
  2822. COLORREF clrColorize = COLORREF(-1L);
  2823. bool bFlashCaptionHighlightedState = false;
  2824. if( _pdfd.m_pHelperSrc != NULL
  2825. && _pdfd.m_pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtMiniDockFrameWnd) )
  2826. )
  2827. {
  2828. CExtControlBar * pBar = ((CExtMiniDockFrameWnd*)_pdfd.m_pHelperSrc)->FindSingleVisbleFlatingBar();
  2829. if( pBar != NULL
  2830. && pBar->FlashCaptionIsInProgress( &bFlashCaptionHighlightedState )
  2831. )
  2832. {
  2833. if( bFlashCaptionHighlightedState )
  2834. clrColorize = pBar->m_clrFlashCaptionBackground;
  2835. }
  2836. }
  2837. if( ! CaptionGlyph.Draw( dc.m_hDC, rcCaption, false, BYTE(0xFF), clrColorize ) )
  2838. {
  2839. if( clrColorize != COLORREF(-1L) )
  2840. dc.FillSolidRect( &rcCaption, clrColorize );
  2841. }
  2842. return;
  2843. } // if( pMiniFrame != NULL )
  2844. CExtToolControlBar * pToolBar =
  2845. DYNAMIC_DOWNCAST(
  2846. CExtToolControlBar,
  2847. _pdfd.m_pHelperSrc
  2848. );
  2849. if( pToolBar != NULL )
  2850. {
  2851. LPCTSTR strBarType = _T("ToolBar");
  2852. if( pToolBar->IsKindOf( RUNTIME_CLASS(CExtMenuControlBar) ) )
  2853. strBarType = _T("MenuBar");
  2854. CExtSkinItem & Frame = 
  2855. m_Skin[_T("Frame")][_T("ToolControlBar")][strBarType];
  2856. CExtSkinGlyph & FrameGlyph = Frame.Glyph( _T("Frame") );
  2857. FrameGlyph.Draw( dc.m_hDC, _pdfd.m_rcWindow );
  2858. } // if( pToolBar != NULL )
  2859. }
  2860. void CExtPaintManagerSkin::PaintControlBarClientArea(
  2861. CDC & dc,
  2862. const RECT & rcClient,
  2863. CObject * pHelperSrc,
  2864. LPARAM lParam // = 0L
  2865. )
  2866. {
  2867. ASSERT_VALID( this );
  2868. ASSERT( dc.GetSafeHdc() != NULL );
  2869. if( ::IsRectEmpty( &rcClient )
  2870. || ( ! dc.RectVisible( &rcClient ) )
  2871. )
  2872. return;
  2873. if( pHelperSrc != NULL )
  2874. {
  2875. ASSERT_VALID( pHelperSrc );
  2876. CExtToolControlBar * pToolBar =
  2877. DYNAMIC_DOWNCAST(
  2878. CExtToolControlBar,
  2879. pHelperSrc
  2880. );
  2881. if( pToolBar != NULL )
  2882. {
  2883. if( ( ((CExtToolControlBar*)pHelperSrc)->m_bForceNoBalloonWhenRedockable )
  2884. && RenderCustomBackground(
  2885. true,
  2886. dc,
  2887. pHelperSrc,
  2888. lParam
  2889. )
  2890. )
  2891. return;
  2892. PaintDockerBkgnd(
  2893. true,
  2894. dc,
  2895. pToolBar
  2896. );
  2897. LPCTSTR strBarType = _T("");
  2898. if( pToolBar->IsKindOf( RUNTIME_CLASS( CExtMenuControlBar ) ) )
  2899. strBarType = _T("MenuBar");
  2900. else
  2901. if( pToolBar->IsKindOf( RUNTIME_CLASS( CExtStatusControlBar ) ) )
  2902. strBarType = _T("SatatusBar");
  2903. else
  2904. strBarType = _T("ToolBar");
  2905. CExtSkinItem & BkBase = 
  2906. m_Skin[_T("Background")][_T("ClientArea")][_T("ControlBar")][strBarType];
  2907. if( pToolBar->IsFloating() )
  2908. {
  2909. CExtSkinGlyph & BackgroundGlyph = BkBase[_T("Floating")].Glyph( _T("Background") );
  2910. BackgroundGlyph.Draw( dc.m_hDC, rcClient );
  2911. }
  2912. else
  2913. {
  2914. LPCTSTR strDockingType = _T("Horizontal");
  2915. if( pToolBar->IsDockedVertically() )
  2916. strDockingType = _T("Vertical");
  2917. LPCTSTR strDockingAbility = _T("Dockable");
  2918. if( pToolBar->m_pDockSite == NULL )
  2919. strDockingAbility = _T("Static");
  2920. CExtSkinGlyph & BackgroundGlyph 
  2921. = BkBase[strDockingType][strDockingAbility].Glyph( _T("Background") );
  2922. BackgroundGlyph.Draw( dc.m_hDC, rcClient );
  2923. }
  2924. return;
  2925. } // if( pToolBar != NULL )
  2926. CWnd * pWnd = DYNAMIC_DOWNCAST( CWnd, pHelperSrc );
  2927. if( pWnd != NULL
  2928. && pWnd->GetSafeHwnd() != NULL
  2929. && PaintDockerBkgnd(
  2930. true,
  2931. dc,
  2932. pWnd,
  2933. lParam
  2934. )
  2935. )
  2936. return;
  2937. } // if( pHelperSrc != NULL )
  2938. CExtPaintManager::PaintControlBarClientArea(
  2939. dc,
  2940. rcClient,
  2941. pHelperSrc,
  2942. lParam
  2943. );
  2944. }
  2945. void CExtPaintManagerSkin::PaintMenuItem(
  2946. CDC & dc,
  2947. CExtPaintManager::PAINTMENUITEMDATA & _pmid
  2948. )
  2949. {
  2950. ASSERT_VALID( this );
  2951. ASSERT( dc.GetSafeHdc() != NULL );
  2952. if( _pmid.m_rcItem.IsRectEmpty() )
  2953. return;
  2954. if( IsHighContrast() )
  2955. {
  2956. CExtPaintManager::PaintMenuItem(
  2957. dc,
  2958. _pmid
  2959. );
  2960. return;
  2961. }
  2962. bool bRTL = false;
  2963. if( _pmid.m_pHelperSrc != NULL )
  2964. {
  2965. ASSERT_VALID( _pmid.m_pHelperSrc );
  2966. CExtPopupMenuWnd * pPopup =
  2967. DYNAMIC_DOWNCAST( CExtPopupMenuWnd, _pmid.m_pHelperSrc );
  2968. if( pPopup != NULL )
  2969. bRTL = pPopup->OnQueryLayoutRTL();
  2970. } // if( _pmid.m_pHelperSrc != NULL )
  2971. CExtSafeString _sText =
  2972. ( _pmid.m_sText == NULL ) ? _T("") : _pmid.m_sText;
  2973. CExtSafeString _sAccelText =
  2974. ( _pmid.m_sAccelText == NULL ) ? _T("") : _pmid.m_sAccelText;
  2975. //COLORREF clr3dFace = GetColor( CLR_3DFACE_OUT, _pmid.m_pHelperSrc, _pmid.m_lParam );
  2976. //COLORREF clrText = GetColor( CLR_TEXT_OUT, _pmid.m_pHelperSrc, _pmid.m_lParam );
  2977. //COLORREF clrBk = clr3dFace;
  2978. CRect rcBk( _pmid.m_rcItemWithIndents );
  2979. CRect rcBkWithIndents( _pmid.m_rcItemWithIndents );
  2980. CRect rcDDArea( _pmid.m_rcItemWithIndents );
  2981. CRect rcIconArea( _pmid.m_rcItemWithIndents );
  2982. if( bRTL )
  2983. rcIconArea.left = rcIconArea.right - _pmid.m_nIconAreaWidth;
  2984. else
  2985. rcIconArea.right = rcIconArea.left + _pmid.m_nIconAreaWidth;
  2986. LPCTSTR strMenuItemType = _T("MenuItem");
  2987. if( _pmid.m_bSeparatedDropDown )
  2988. strMenuItemType = _T("SeparatedDropDownMenuItem");
  2989. else if( _pmid.m_bPopup )
  2990. strMenuItemType = _T("PopupMenuItem");
  2991. CExtSkinItem & SkinItemMenuItem = m_Skin[_T("MenuItem")][strMenuItemType];
  2992. LPCTSTR strSkinItemType = _T("");
  2993. if( !_pmid.m_bEnabled )
  2994. strSkinItemType = _T("Disabled");
  2995. else if( _pmid.m_bSelected )
  2996. strSkinItemType = _T("Selected");
  2997. else
  2998. strSkinItemType = _T("Normal");
  2999. CExtSkinItem & SkinItem = 
  3000. _pmid.m_bRarelyUsed 
  3001. ? SkinItemMenuItem[strSkinItemType][_T("RarelyUsed")]
  3002. : SkinItemMenuItem[strSkinItemType];
  3003. CExtSkinGlyph & IconAreaGlyph = SkinItem.Glyph( _T("IconArea") );
  3004. IconAreaGlyph.Draw( dc.m_hDC, rcIconArea );
  3005. if( bRTL )
  3006. rcBk.right -= _pmid.m_nIconAreaWidth;
  3007. else
  3008. rcBk.left += _pmid.m_nIconAreaWidth;
  3009. CRect rcMenuItemRect( rcBk );
  3010. if( _pmid.m_bPopup )
  3011. {
  3012. if( bRTL )
  3013. {
  3014. rcDDArea.right = rcDDArea.left + __EXT_MENU_POPUP_ARROW_AREA_DX;
  3015. rcDDArea.right += __EXT_MENU_GAP;
  3016. if( _pmid.m_bSeparatedDropDown )
  3017. rcMenuItemRect.left = rcDDArea.right;
  3018. }
  3019. else
  3020. {
  3021.             rcDDArea.left = rcDDArea.right - __EXT_MENU_POPUP_ARROW_AREA_DX;
  3022. rcDDArea.left -= __EXT_MENU_GAP;
  3023. if( _pmid.m_bSeparatedDropDown )
  3024. rcMenuItemRect.right = rcDDArea.left;
  3025. }
  3026. }
  3027. CExtSkinGlyph & MenuItemGlyph = SkinItem.Glyph( _T("MenuItem") );
  3028. MenuItemGlyph.Draw( dc.m_hDC, rcMenuItemRect );
  3029. // if( _pmid.m_bSelected )
  3030. // {
  3031. // ASSERT( _pmid.m_bEnabled );
  3032. // clrBk = GetColor( COLOR_HIGHLIGHT, _pmid.m_pHelperSrc, _pmid.m_lParam );
  3033. // clrText = GetColor( COLOR_MENUTEXT, _pmid.m_pHelperSrc, _pmid.m_lParam  );
  3034. // }
  3035. COLORREF clrText = COLORREF( SkinItem.Color( _T("TextColor") ) );
  3036. rcBk.DeflateRect( __EXT_MENU_GAP, __EXT_MENU_GAP );
  3037. COLORREF clrOldText = dc.SetTextColor( clrText );
  3038. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  3039. rcBk.DeflateRect( __EXT_MENU_GAP, 0 );
  3040. CFont * pRenderFont =
  3041. ( _pmid.m_hCustomFont == NULL )
  3042. ? (&m_FontNormal)
  3043. : CFont::FromHandle(_pmid.m_hCustomFont)
  3044. ;
  3045. CFont * pOldFont = dc.SelectObject( pRenderFont );
  3046. ASSERT( pOldFont != NULL );
  3047. DWORD dwDtAlignFlags = bRTL ? (DT_RIGHT|DT_RTLREADING) : DT_LEFT;
  3048. CRect rcMeasureText( 0, 0, 0, 0 );
  3049. dc.DrawText(
  3050. _sText,
  3051. _sText.GetLength(),
  3052. &rcMeasureText,
  3053. DT_CALCRECT|DT_SINGLELINE|dwDtAlignFlags
  3054. );
  3055. CRect rcDrawText( rcBk ), rcDrawTextExtended( rcBk );
  3056. INT nLenTextExtended = ( _pmid.m_sExtendedText != NULL ) ? INT( _tcslen( _pmid.m_sExtendedText ) ) : 0;
  3057. if( nLenTextExtended > 0 )
  3058. {
  3059. rcDrawText.bottom
  3060. = rcDrawTextExtended.top
  3061. = rcDrawText.top + rcMeasureText.Height();
  3062. }
  3063. else
  3064. {
  3065. rcDrawText.OffsetRect(
  3066. 0,
  3067. ( rcDrawText.Height() - rcMeasureText.Height() ) / 2
  3068. );
  3069. }
  3070. if( bRTL )
  3071. rcDrawText.left = rcDrawText.right - rcMeasureText.Width();
  3072. dc.DrawText(
  3073. _sText,
  3074. _sText.GetLength(),
  3075. &rcDrawText,
  3076. DT_SINGLELINE|dwDtAlignFlags
  3077. );
  3078. if( nLenTextExtended > 0 )
  3079. {
  3080. CFont * pOldFont = dc.SelectObject( &m_FontNormal );
  3081. dc.DrawText(
  3082. _pmid.m_sExtendedText,
  3083. nLenTextExtended,
  3084. &rcDrawTextExtended,
  3085. dwDtAlignFlags
  3086. );
  3087. dc.SelectObject( pOldFont );
  3088. }
  3089. if( ! _sAccelText.IsEmpty() )
  3090. {
  3091. rcMeasureText.SetRect( 0, 0, 0, 0 );
  3092. dc.DrawText(
  3093. _sAccelText,
  3094. _sAccelText.GetLength(),
  3095. &rcMeasureText,
  3096. DT_CALCRECT|DT_SINGLELINE|dwDtAlignFlags
  3097. );
  3098. rcDrawText = rcBk;
  3099. rcDrawText.OffsetRect(
  3100. 0,
  3101. ( rcDrawText.Height() - rcMeasureText.Height() ) / 2
  3102. );
  3103. if( bRTL )
  3104. {
  3105. rcDrawText.right =
  3106. rcDrawText.left
  3107. + rcMeasureText.Width()
  3108. + __EXT_MENU_POPUP_ARROW_AREA_DX
  3109. ;
  3110. rcBk.right = rcDrawText.right;
  3111. } // if( bRTL )
  3112. else
  3113. {
  3114. rcDrawText.left =
  3115. rcDrawText.right
  3116. - rcMeasureText.Width()
  3117. - __EXT_MENU_POPUP_ARROW_AREA_DX
  3118. ;
  3119. rcBk.left = rcDrawText.left;
  3120. } // else from if( bRTL )
  3121. if( bRTL )
  3122. {
  3123. rcDrawText.left = rcDrawText.right - rcMeasureText.Width();
  3124. if( _pmid.m_bEnabled )
  3125. dc.DrawText(
  3126. _sAccelText,
  3127. _sAccelText.GetLength(),
  3128. &rcDrawText,
  3129. DT_SINGLELINE|dwDtAlignFlags
  3130. );
  3131. else
  3132. {
  3133. CRect rcDrawTextOffs = rcDrawText;
  3134. rcDrawTextOffs.OffsetRect( 1, 1 );
  3135. COLORREF clrTextRestore =
  3136. dc.SetTextColor(
  3137. GetColor(
  3138. COLOR_3DHILIGHT,
  3139. _pmid.m_pHelperSrc,
  3140. _pmid.m_lParam
  3141. )
  3142. );
  3143. dc.DrawText(
  3144. _sAccelText,
  3145. _sAccelText.GetLength(),
  3146. &rcDrawTextOffs,
  3147. DT_SINGLELINE|dwDtAlignFlags
  3148. );
  3149. dc.SetTextColor(
  3150. GetColor(
  3151. COLOR_3DSHADOW,
  3152. _pmid.m_pHelperSrc,
  3153. _pmid.m_lParam
  3154. )
  3155. );
  3156. dc.DrawText(
  3157. _sAccelText,
  3158. _sAccelText.GetLength(),
  3159. &rcDrawText,
  3160. DT_SINGLELINE|dwDtAlignFlags
  3161. );
  3162. dc.SetTextColor( clrTextRestore );
  3163. } // else from if( _pmid.m_bEnabled )
  3164. } // if( bRTL )
  3165. else
  3166. dc.DrawState(
  3167. rcDrawText.TopLeft(),
  3168. rcDrawText.Size(),
  3169. _sAccelText,
  3170. (_pmid.m_bEnabled ? DSS_NORMAL : m_DSS_DISABLED_style), 
  3171. TRUE,
  3172. 0,
  3173. (CBrush*)NULL
  3174. );
  3175. } // if( ! _sAccelText.IsEmpty() )
  3176. if( _pmid.m_bPopup )
  3177. {
  3178. CRect rcPopupArrow( _pmid.m_rcItem );
  3179. rcPopupArrow.DeflateRect( __EXT_MENU_GAP, __EXT_MENU_GAP );
  3180. if( bRTL )
  3181. rcPopupArrow.right =
  3182. rcPopupArrow.left + __EXT_MENU_POPUP_ARROW_AREA_DX;
  3183. else
  3184. rcPopupArrow.left =
  3185. rcPopupArrow.right - __EXT_MENU_POPUP_ARROW_AREA_DX;
  3186. if( _pmid.m_bCustomizeListMode )
  3187. {
  3188. COLORREF ColorValues[2] =
  3189. {
  3190. RGB(0,0,0),
  3191. GetColor(
  3192. _pmid.m_bSelected ? CLR_MENUTEXT_IN : CLR_MENUTEXT_OUT,
  3193. _pmid.m_pHelperSrc,
  3194. _pmid.m_lParam 
  3195. )
  3196. };
  3197. PaintGlyphCentered(
  3198. dc,
  3199. rcPopupArrow,
  3200. _pmid.m_bSeparatedDropDown
  3201. ? g_glyph_customize_dropdown_src
  3202. : g_glyph_customize_popup_src,
  3203. ColorValues
  3204. );
  3205. } // if( _pmid.m_bCustomizeListMode )
  3206. else
  3207. {
  3208. if( _pmid.m_bSeparatedDropDown )
  3209. {
  3210. CExtSkinGlyph & DropDownArea = SkinItem.Glyph( _T("DropDownArea") );
  3211. DropDownArea.Draw( dc.m_hDC, rcDDArea );
  3212. CExtSkinGlyph & DropDownArrow = SkinItem.Glyph( _T("DropDownArrow") );
  3213. DropDownArrow.Draw( dc.m_hDC, rcDDArea );
  3214. } // else from if( _pmid.m_bCustomizeListMode )
  3215. } // if( _pmid.m_bPopup )
  3216. dc.SelectObject( pOldFont );
  3217. dc.SetBkMode( nOldBkMode );
  3218. dc.SetTextColor( clrOldText );
  3219. CSize sizeIcon( __EXT_MENU_ICON_CX, __EXT_MENU_ICON_CY );
  3220. if( _pmid.m_pIcon != NULL && (! _pmid.m_pIcon->IsEmpty()) )
  3221. {
  3222. sizeIcon = _pmid.m_pIcon->GetSize();
  3223. if( sizeIcon.cx <= 18 && sizeIcon.cy < sizeIcon.cx )
  3224. sizeIcon.cy = sizeIcon.cx;
  3225. }
  3226. CRect rcIcon( _pmid.m_rcItem.TopLeft(), sizeIcon );
  3227. if( bRTL )
  3228. rcIcon.OffsetRect( _pmid.m_rcItem.Width() - sizeIcon.cx, 0 );
  3229. if( _pmid.m_bXtraMark )
  3230. {
  3231. rcIcon.OffsetRect(
  3232. ( ( _pmid.m_nIconAreaWidth/2 - rcIcon.Width() ) / 2 + _pmid.m_nIconAreaWidth/2 - 2 )
  3233. * (bRTL ? (-1) : 1),
  3234. ( _pmid.m_rcItem.Height() - rcIcon.Height() ) / 2
  3235. );
  3236. if( _pmid.m_bXtraChecked )
  3237. {
  3238. CRect rcXtraMark(
  3239. bRTL ? (_pmid.m_rcItem.right - _pmid.m_rcItem.Height() - 1) : (_pmid.m_rcItem.left + 1),
  3240. _pmid.m_rcItem.top + 1,
  3241. bRTL ? (_pmid.m_rcItem.right - 1) : (_pmid.m_rcItem.left + _pmid.m_rcItem.Height() - 1),
  3242. _pmid.m_rcItem.bottom - 1
  3243. );
  3244. CExtSkinGlyph & XtraMarkFrameGlyph = 
  3245. m_Skin[_T("MenuItem")][_T("CheckMark")][strSkinItemType].Glyph( _T("Frame") );
  3246. XtraMarkFrameGlyph.Draw( dc.m_hDC, rcXtraMark );
  3247. CExtSkinGlyph & XtraMarkGlyph = 
  3248. m_Skin[_T("MenuItem")][_T("CheckMark")][strSkinItemType].Glyph( _T("CheckMark") );
  3249. XtraMarkGlyph.Draw( dc.m_hDC, rcXtraMark );
  3250. } // if( _pmid.m_bXtraMark )
  3251. else
  3252. {
  3253. rcIcon.OffsetRect(
  3254. ( ( _pmid.m_nIconAreaWidth - rcIcon.Width() ) / 2 - 1) * ( bRTL ? (-1) : 1 ),
  3255. ( _pmid.m_rcItem.Height() - rcIcon.Height() ) / 2
  3256. );
  3257. } // else from if( _pmid.m_bXtraMark )
  3258. CRect rcIconFrame( rcIcon );
  3259. rcIconFrame.InflateRect(
  3260. __EXT_MENU_IMG_RECT_OUT_GAP,
  3261. __EXT_MENU_IMG_RECT_OUT_GAP
  3262. );
  3263. if( _pmid.m_bPushedCheck || _pmid.m_bIndeterminate || _pmid.m_bPushedRadio )
  3264. {
  3265. if( _pmid.m_bPushedCheck || _pmid.m_bIndeterminate )
  3266. {
  3267. BYTE nScaCheck = BYTE(0x0FF);
  3268. CExtSkinItem * pItem = &(m_Skin[_T("MenuItem")][_T("CheckMark")][strSkinItemType]);
  3269. if( _pmid.m_bIndeterminate )
  3270. {
  3271. CExtSkinItem * pIndeterminate = pItem->NestedGet( _T("Indeterminate") );
  3272. if( pIndeterminate != NULL )
  3273. pItem = pIndeterminate;
  3274. else
  3275. nScaCheck = BYTE(0x080);
  3276. }
  3277. CExtSkinGlyph & MarkFrameGlyph = 
  3278. pItem->Glyph( _T("Frame") );
  3279. MarkFrameGlyph.Draw( dc.m_hDC, rcIconFrame, false, nScaCheck );
  3280. }
  3281. else
  3282. {
  3283. CExtSkinGlyph & MarkFrameGlyph = 
  3284. m_Skin[_T("MenuItem")][_T("RadioDot")][strSkinItemType].Glyph( _T("Frame") );
  3285. MarkFrameGlyph.Draw( dc.m_hDC, rcIconFrame );
  3286. }
  3287. if( _pmid.m_pIcon == NULL || _pmid.m_pIcon->IsEmpty() )
  3288. {
  3289. if( _pmid.m_bPushedCheck || _pmid.m_bIndeterminate )
  3290. {
  3291. // CExtSkinGlyph & MarkGlyph = 
  3292. // m_Skin[_T("MenuItem")][_T("CheckMark")][strSkinItemType].Glyph( _T("CheckMark") );
  3293. BYTE nScaCheck = BYTE(0x0FF);
  3294. CExtSkinItem * pItem = &(m_Skin[_T("MenuItem")][_T("CheckMark")][strSkinItemType]);
  3295. if( _pmid.m_bIndeterminate )
  3296. {
  3297. CExtSkinItem * pIndeterminate = pItem->NestedGet( _T("Indeterminate") );
  3298. if( pIndeterminate != NULL )
  3299. pItem = pIndeterminate;
  3300. else
  3301. nScaCheck = BYTE(0x080);
  3302. }
  3303. CExtSkinGlyph & MarkGlyph = 
  3304. pItem->Glyph( _T("CheckMark") );
  3305. MarkGlyph.Draw( dc.m_hDC, rcIconFrame, false, nScaCheck );
  3306. }
  3307. else
  3308. {
  3309. CExtSkinGlyph & MarkGlyph = 
  3310. m_Skin[_T("MenuItem")][_T("RadioDot")][strSkinItemType].Glyph( _T("RadioDot") );
  3311. MarkGlyph.Draw( dc.m_hDC, rcIconFrame );
  3312. }
  3313. } // if( _pmid.m_pIcon == NULL || _pmid.m_pIcon->IsEmpty() )
  3314. }
  3315. if( _pmid.m_pIcon != NULL && (! _pmid.m_pIcon->IsEmpty()) )
  3316. {
  3317. _pmid.m_pIcon->Paint(
  3318. this,
  3319. dc,
  3320. rcIcon.left,
  3321. rcIcon.top,
  3322. -1,
  3323. -1,
  3324. _pmid.m_bEnabled
  3325. ? ( _pmid.m_bSelected
  3326. ? CExtCmdIcon::__PAINT_HOVER
  3327. : CExtCmdIcon::__PAINT_NORMAL
  3328. )
  3329. : CExtCmdIcon::__PAINT_DISABLED
  3330. );
  3331. } // if( _pmid.m_pIcon != NULL && (! _pmid.m_pIcon->IsEmpty()) )
  3332. else
  3333. {
  3334. PaintSysCmdGlyph(
  3335. dc,
  3336. _pmid.m_nHelperSysCmdID,
  3337. rcIcon,
  3338. _pmid.m_bSelected,
  3339. false,
  3340. _pmid.m_bEnabled
  3341. );
  3342. } // else from if( _pmid.m_pIcon != NULL && (! _pmid.m_pIcon->IsEmpty()) )
  3343. if( ! _pmid.m_rcInPlaceWnd.IsRectEmpty() )
  3344. {
  3345. CRect rcInPlaceWndOuterBorder( _pmid.m_rcInPlaceWnd );
  3346. rcInPlaceWndOuterBorder.InflateRect( 2, 2, 2, 3 );
  3347. INT nDD = (INT)::GetSystemMetrics( SM_CXHTHUMB );
  3348. CRect rcBk( rcInPlaceWndOuterBorder );
  3349. if( _pmid.m_bPopup )
  3350. rcBk.right += nDD;
  3351. dc.FillSolidRect(
  3352. &rcBk,
  3353. GetColor(
  3354. _pmid.m_bEnabled ? COLOR_WINDOW : COLOR_3DFACE,
  3355. _pmid.m_pHelperSrc,
  3356. _pmid.m_lParam
  3357. )
  3358. );
  3359. if( _pmid.m_bPopup )
  3360. {
  3361. rcInPlaceWndOuterBorder.right += nDD;
  3362. if( _pmid.m_bEnabled )
  3363. {
  3364. PAINTCOMBOFRAMEDATA _pcfd(
  3365. _pmid.m_pHelperSrc,
  3366. rcInPlaceWndOuterBorder,
  3367. _pmid.m_bSelected, // hover
  3368. _pmid.m_bSelected && _pmid.m_bHelperPopupDropped, // pushed
  3369. _pmid.m_bEnabled
  3370. );
  3371. _pcfd.m_bNoTopOuterBorder = true;
  3372. PaintComboFrame( dc, _pcfd );
  3373. } // if( _pmid.m_bEnabled )
  3374. else
  3375. {
  3376. CRect rcBorder( rcInPlaceWndOuterBorder );
  3377. rcBorder.DeflateRect( 2, 2 );
  3378. COLORREF clrBorder =
  3379. GetColor( COLOR_WINDOW, _pmid.m_pHelperSrc, _pmid.m_lParam );
  3380. dc.Draw3dRect(
  3381. &rcBorder,
  3382. clrBorder,
  3383. clrBorder
  3384. );
  3385. // paint arrow down
  3386. CRect rcBtn( rcBorder );
  3387. rcBtn.left = rcBtn.right - nDD;
  3388. glyph_t * pGlyph = g_DockingCaptionGlyphs[ __DCBT_ARROW_SMALL_DOWN ];
  3389. ASSERT( pGlyph != NULL );
  3390. COLORREF ColorValues[2] =
  3391. {
  3392. RGB(0,0,0),
  3393. GetColor( COLOR_WINDOWTEXT, _pmid.m_pHelperSrc, _pmid.m_lParam )
  3394. };
  3395. PaintGlyphCentered(
  3396. dc,
  3397. rcBtn,
  3398. *pGlyph,
  3399. ColorValues
  3400. );
  3401. } // else from if( _pmid.m_bEnabled )
  3402. rcInPlaceWndOuterBorder.DeflateRect( 1, 1 );
  3403. rcInPlaceWndOuterBorder.right -= nDD;
  3404. } // if( _pmid.m_bPopup )
  3405. else
  3406. {
  3407. if( _pmid.m_bEnabled )
  3408. {
  3409. COLORREF clrFace = GetColor( COLOR_3DFACE, _pmid.m_pHelperSrc, _pmid.m_lParam );
  3410. dc.Draw3dRect(
  3411. rcInPlaceWndOuterBorder,
  3412. clrFace,
  3413. clrFace
  3414. );
  3415. rcInPlaceWndOuterBorder.DeflateRect( 1, 1 );
  3416. if( _pmid.m_bSelected )
  3417. dc.Draw3dRect(
  3418. rcInPlaceWndOuterBorder,
  3419. GetColor( COLOR_3DSHADOW, _pmid.m_pHelperSrc, _pmid.m_lParam ),
  3420. GetColor( COLOR_3DHIGHLIGHT, _pmid.m_pHelperSrc, _pmid.m_lParam )
  3421. );
  3422. else
  3423. dc.Draw3dRect(
  3424. rcInPlaceWndOuterBorder,
  3425. clrFace,
  3426. clrFace
  3427. );
  3428. } // if( _pmid.m_bEnabled )
  3429. else
  3430. {
  3431. CRect rcBorder( rcInPlaceWndOuterBorder );
  3432. rcBorder.DeflateRect( 2, 2 );
  3433. COLORREF clrBorder = GetColor( COLOR_WINDOW, _pmid.m_pHelperSrc, _pmid.m_lParam );
  3434. dc.Draw3dRect(
  3435. &rcBorder,
  3436. clrBorder,
  3437. clrBorder
  3438. );
  3439. } // else from if( _pmid.m_bEnabled )
  3440. } // else from if( _pmid.m_bPopup )
  3441. if( ! _pmid.m_strInPlaceText.IsEmpty() )
  3442. {
  3443. rcInPlaceWndOuterBorder.DeflateRect( 5, 2, 2, 2 );
  3444. COLORREF clrOldText =
  3445. dc.SetTextColor(
  3446. ::GetSysColor( _pmid.m_bEnabled ? COLOR_WINDOWTEXT : COLOR_GRAYTEXT )
  3447. );
  3448. int nOldBkMode = dc.SetBkMode(TRANSPARENT);
  3449. CFont * pOldFont = dc.SelectObject( pRenderFont );
  3450. ASSERT( pOldFont != NULL );
  3451. dc.DrawText(
  3452. _pmid.m_strInPlaceText,
  3453. _pmid.m_strInPlaceText.GetLength(),
  3454. &rcInPlaceWndOuterBorder,
  3455. DT_SINGLELINE|DT_NOPREFIX|DT_TOP|dwDtAlignFlags
  3456. );
  3457. dc.SelectObject( pOldFont );
  3458. dc.SetBkMode( nOldBkMode );
  3459. dc.SetTextColor( clrOldText );
  3460. } // if( _pmid.m_bEnabled )
  3461. } // if( ! _pmid.m_rcInPlaceWnd.IsRectEmpty() )
  3462. }
  3463. void CExtPaintManagerSkin::PaintMenuSeparator(
  3464. CDC & dc,
  3465. const RECT & rectItem,
  3466. int nIconAreaWidth,
  3467. bool bRarelyUsed,
  3468. bool bIsForceNoLeftGradient,
  3469. CObject * pHelperSrc,
  3470. LPARAM lParam // = 0L
  3471. )
  3472. {
  3473. lParam;
  3474. ASSERT_VALID( this );
  3475. ASSERT( dc.GetSafeHdc() != NULL );
  3476. nIconAreaWidth;
  3477. bIsForceNoLeftGradient;
  3478. if( ::IsRectEmpty(&rectItem) )
  3479. return;
  3480. bool bRTL = false;
  3481. if( pHelperSrc != NULL )
  3482. {
  3483. ASSERT_VALID( pHelperSrc );
  3484. CExtPopupMenuWnd * pPopup =
  3485. DYNAMIC_DOWNCAST( CExtPopupMenuWnd, pHelperSrc );
  3486. if( pPopup != NULL )
  3487. bRTL = pPopup->OnQueryLayoutRTL();
  3488. } // if( pHelperSrc != NULL )
  3489. CRect rcIconArea( rectItem );
  3490. if( bRTL )
  3491. rcIconArea.left = rcIconArea.right - nIconAreaWidth;
  3492. else
  3493. rcIconArea.right = rcIconArea.left + nIconAreaWidth;
  3494. CExtSkinItem & SeparatorItem = 
  3495. bRarelyUsed
  3496. ? m_Skin[_T("MenuItem")][_T("Separator")][_T("RarelyUsed")]
  3497. : m_Skin[_T("MenuItem")][_T("Separator")];
  3498. CExtSkinGlyph & IconAreaGlyph = SeparatorItem.Glyph( _T("IconArea") );
  3499. IconAreaGlyph.Draw( dc.m_hDC, rcIconArea );
  3500. CRect rectSeparator( rectItem );
  3501. rectSeparator.DeflateRect( 
  3502. rcIconArea.Width(),
  3503. 0,
  3504. 0,
  3505. 1  // conflict with default outer margins
  3506. );
  3507. CExtSkinGlyph & SeparatorGlyph = SeparatorItem.Glyph( _T("Separator") );
  3508. SeparatorGlyph.Draw( dc.m_hDC, rectSeparator );
  3509. }
  3510. CRect CExtPaintManagerSkin::GetMenuBorderMetrics(
  3511. CWnd * pWnd,
  3512. LPARAM lParam // = 0
  3513. ) const
  3514. {
  3515. ASSERT_VALID( this );
  3516. pWnd;
  3517. lParam;
  3518. const CExtSkinGlyph & FrameGlyph = m_Skin[_T("Frame")][_T("Menu")].Glyph( _T("Frame") );
  3519. CRect rc = FrameGlyph.GetPadding();
  3520. if( pWnd != NULL
  3521. && pWnd->IsKindOf( RUNTIME_CLASS( CExtPopupMenuWnd ) )
  3522. && ((CExtPopupMenuWnd*)pWnd)->_IsRibbonMode()
  3523. && ( ((CExtPopupMenuWnd*)pWnd)->TrackFlagsGet() & TPMX_RIBBON_FILE_MENU ) != 0
  3524. )
  3525. rc.bottom += 28;
  3526. return rc;
  3527. }
  3528. void CExtPaintManagerSkin::PaintMenuBorder(
  3529. CDC & dc,
  3530. const RECT & rectClient,
  3531. CObject * pHelperSrc,
  3532. LPARAM lParam // = 0L
  3533. )
  3534. {
  3535. pHelperSrc;lParam;
  3536. CRect rcClient( rectClient );
  3537. CExtSkinGlyph & MenuFrameGlyph = m_Skin[_T("Frame")][_T("Menu")].Glyph( _T("Frame") );
  3538. MenuFrameGlyph.Draw( dc.m_hDC, rcClient );
  3539. rcClient.DeflateRect( 
  3540. MenuFrameGlyph.GetPadding()
  3541. );
  3542. CExtSkinGlyph & MenuBkGlyph = m_Skin[_T("Background")][_T("Menu")].Glyph( _T("Background") );
  3543. MenuBkGlyph.Draw( dc.m_hDC, rcClient );
  3544. }
  3545. void CExtPaintManagerSkin::PaintMenuExpandButton(
  3546. CDC & dc,
  3547. const RECT & rectButton,
  3548. bool bPushed,
  3549. bool bHover,
  3550. CObject * pHelperSrc,
  3551. LPARAM lParam // = 0L
  3552. )
  3553. {
  3554. ASSERT_VALID( this );
  3555. ASSERT( dc.GetSafeHdc() != NULL );
  3556. bPushed;
  3557. lParam;
  3558. bool bRTL = false;
  3559. if( pHelperSrc != NULL )
  3560. {
  3561. ASSERT_VALID( pHelperSrc );
  3562. CExtPopupMenuWnd * pPopup =
  3563. DYNAMIC_DOWNCAST( CExtPopupMenuWnd, pHelperSrc );
  3564. if( pPopup != NULL )
  3565. bRTL = pPopup->OnQueryLayoutRTL();
  3566. }
  3567. int nIconAreaWidth = 0;
  3568. if( pHelperSrc != NULL // (+ 2.23)
  3569. && pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtPopupMenuWnd) )
  3570. && ((CExtPopupMenuWnd*)pHelperSrc) ->
  3571. ItemGetCount() > 0
  3572. )
  3573. {
  3574. CExtPopupMenuWnd::MENUITEMDATA & _mii =
  3575. ((CExtPopupMenuWnd*)pHelperSrc) ->
  3576. ItemGetInfo(
  3577. ((CExtPopupMenuWnd*)pHelperSrc) ->
  3578. ItemGetCount()
  3579. - 1
  3580. );
  3581. if( ! _mii.IsToolButton() )
  3582. nIconAreaWidth = _mii.GetIconAreaWidth();
  3583. }
  3584. CRect rcButton( rectButton );
  3585. LPCTSTR strExpandButtonType = _T("");
  3586. if( bHover )
  3587. strExpandButtonType = _T("Selected");
  3588. else
  3589. strExpandButtonType = _T("Normal");
  3590. CExtSkinItem & ExpandButtonSkinItem = m_Skin[_T("MenuItem")][_T("ExpandButton")][strExpandButtonType];
  3591. CRect rcIconArea( rcButton );
  3592. if( bRTL )
  3593. {
  3594. rcIconArea.left = rcIconArea.right - nIconAreaWidth;
  3595. rcButton.right -= nIconAreaWidth;
  3596. }
  3597. else
  3598. {
  3599. rcIconArea.right = rcIconArea.left + nIconAreaWidth;
  3600. rcButton.left += nIconAreaWidth;
  3601. }
  3602. CExtSkinGlyph & IconAreaGlyph = ExpandButtonSkinItem.Glyph( _T("IconArea") );
  3603. IconAreaGlyph.Draw( dc.m_hDC, rcIconArea );
  3604. CExtSkinGlyph & MenuItemGlyph = ExpandButtonSkinItem.Glyph( _T("MenuItem") );
  3605. MenuItemGlyph.Draw( dc.m_hDC, rcButton );
  3606. CExtSkinGlyph & ExpandButtonGlyph = ExpandButtonSkinItem.Glyph( _T("ExpandButton") );
  3607. ExpandButtonGlyph.Draw( dc.m_hDC, rectButton );
  3608. }
  3609. void CExtPaintManagerSkin::PaintMenuScrollButton(
  3610. CDC & dc,
  3611. bool bHover,
  3612. bool bPushed,
  3613. bool bTopButton,
  3614. const RECT & rcScrollButton,
  3615. CObject * pHelperSrc,
  3616. LPARAM lParam // = 0L
  3617. )
  3618. {
  3619. ASSERT_VALID( this );
  3620. ASSERT( dc.GetSafeHdc() != NULL );
  3621. bPushed;
  3622. lParam;
  3623. bool bRTL = false;
  3624. if( pHelperSrc != NULL )
  3625. {
  3626. ASSERT_VALID( pHelperSrc );
  3627. CExtPopupMenuWnd * pPopup =
  3628. DYNAMIC_DOWNCAST( CExtPopupMenuWnd, pHelperSrc );
  3629. if( pPopup != NULL )
  3630. bRTL = pPopup->OnQueryLayoutRTL();
  3631. }
  3632. int nIconAreaWidth = 0;
  3633. if( pHelperSrc != NULL // (+ 2.23)
  3634. && pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtPopupMenuWnd) )
  3635. && ((CExtPopupMenuWnd*)pHelperSrc) ->
  3636. ItemGetCount() > 0
  3637. )
  3638. {
  3639. CExtPopupMenuWnd::MENUITEMDATA & _mii =
  3640. ((CExtPopupMenuWnd*)pHelperSrc) ->
  3641. ItemGetInfo(
  3642. ((CExtPopupMenuWnd*)pHelperSrc) ->
  3643. ItemGetCount()
  3644. - 1
  3645. );
  3646. if( ! _mii.IsToolButton() )
  3647. nIconAreaWidth = _mii.GetIconAreaWidth();
  3648. }
  3649. CRect rcButton( rcScrollButton );
  3650. // Temporary fix
  3651. if( bTopButton )
  3652. rcButton.bottom += 1;
  3653. else
  3654. rcButton.top -= 1;
  3655. rcButton.left -= 1;
  3656. rcButton.right += 1;
  3657. // Temporary fix
  3658. LPCTSTR strScrollButtonType = _T("");
  3659. if( bHover )
  3660. strScrollButtonType = _T("Selected");
  3661. else
  3662. strScrollButtonType = _T("Normal");
  3663. CExtSkinItem & ScrollButtonSkinItem = m_Skin[_T("MenuItem")][_T("ScrollButton")][strScrollButtonType];
  3664. CRect rcIconArea( rcButton );
  3665. if( bRTL )
  3666. {
  3667. rcIconArea.left = rcIconArea.right - nIconAreaWidth;
  3668. rcButton.right -= nIconAreaWidth;
  3669. }
  3670. else
  3671. {
  3672. rcIconArea.right = rcIconArea.left + nIconAreaWidth;
  3673. rcButton.left += nIconAreaWidth;
  3674. }
  3675. CExtSkinGlyph & IconAreaGlyph = ScrollButtonSkinItem.Glyph( _T("IconArea") );
  3676. IconAreaGlyph.Draw( dc.m_hDC, rcIconArea );
  3677. CExtSkinGlyph & MenuItemGlyph = ScrollButtonSkinItem.Glyph( _T("MenuItem") );
  3678. MenuItemGlyph.Draw( dc.m_hDC, rcButton );
  3679. CExtSkinGlyph & ScrollButtonGlyph = 
  3680. ScrollButtonSkinItem.Glyph( 
  3681. bTopButton ? _T("ScrollButtonTop") : _T("ScrollButtonBottom") 
  3682. );
  3683. ScrollButtonGlyph.Draw( dc.m_hDC, rcScrollButton );
  3684. }
  3685. void CExtPaintManagerSkin::PaintMenuTearOffButton(
  3686. CDC & dc,
  3687. const RECT & rectButton,
  3688. bool bPushed,
  3689. bool bHover,
  3690. CObject * pHelperSrc,
  3691. LPARAM lParam // = 0L
  3692. )
  3693. {
  3694. ASSERT_VALID( this );
  3695. ASSERT( dc.GetSafeHdc() != NULL );
  3696. bPushed;
  3697. lParam;
  3698. bool bRTL = false;
  3699. if( pHelperSrc != NULL )
  3700. {
  3701. ASSERT_VALID( pHelperSrc );
  3702. CExtPopupMenuWnd * pPopup =
  3703. DYNAMIC_DOWNCAST( CExtPopupMenuWnd, pHelperSrc );
  3704. if( pPopup != NULL )
  3705. bRTL = pPopup->OnQueryLayoutRTL();
  3706. }
  3707. int nIconAreaWidth = 0;
  3708. if( pHelperSrc != NULL // (+ 2.23)
  3709. && pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtPopupMenuWnd) )
  3710. && ((CExtPopupMenuWnd*)pHelperSrc) ->
  3711. ItemGetCount() > 0
  3712. )
  3713. {
  3714. CExtPopupMenuWnd::MENUITEMDATA & _mii =
  3715. ((CExtPopupMenuWnd*)pHelperSrc) ->
  3716. ItemGetInfo(
  3717. ((CExtPopupMenuWnd*)pHelperSrc) ->
  3718. ItemGetCount()
  3719. - 1
  3720. );
  3721. if( ! _mii.IsToolButton() )
  3722. nIconAreaWidth = _mii.GetIconAreaWidth();
  3723. }
  3724. CRect rcButton( rectButton );
  3725. rcButton.left -= 1; // Temporary fix
  3726. rcButton.right += 1;// Temporary fix
  3727. LPCTSTR strTearOffButtonType = _T("");
  3728. if( bHover )
  3729. strTearOffButtonType = _T("Selected");
  3730. else
  3731. strTearOffButtonType = _T("Normal");
  3732. CExtSkinItem & TearOffButtonSkinItem = m_Skin[_T("MenuItem")][_T("TearOffButton")][strTearOffButtonType];
  3733. CRect rcIconArea( rcButton );
  3734. if( bRTL )
  3735. {
  3736. rcIconArea.left = rcIconArea.right - nIconAreaWidth;
  3737. rcButton.right -= nIconAreaWidth;
  3738. }
  3739. else
  3740. {
  3741. rcIconArea.right = rcIconArea.left + nIconAreaWidth;
  3742. rcButton.left += nIconAreaWidth;
  3743. }
  3744. CExtSkinGlyph & IconAreaGlyph = TearOffButtonSkinItem.Glyph( _T("IconArea") );
  3745. IconAreaGlyph.Draw( dc.m_hDC, rcIconArea );
  3746. CExtSkinGlyph & MenuItemGlyph = TearOffButtonSkinItem.Glyph( _T("MenuItem") );
  3747. MenuItemGlyph.Draw( dc.m_hDC, rcButton );
  3748. CExtSkinGlyph & TearOffButtonGlyph = TearOffButtonSkinItem.Glyph( _T("TearOffButton") );
  3749. TearOffButtonGlyph.Draw( dc.m_hDC, rectButton );
  3750. }
  3751. void CExtPaintManagerSkin::PaintGripper(
  3752. CDC & dc,
  3753. CExtPaintManager::PAINTGRIPPERDATA & _pgd
  3754. )
  3755. {
  3756. ASSERT_VALID( this );
  3757. ASSERT( dc.GetSafeHdc() != NULL );
  3758. CRect rectGripper2( _pgd.m_rcGripper );
  3759. if( _pgd.m_bSideBar || _pgd.m_bFloating )
  3760. {
  3761. if( ! _pgd.m_bFloating )
  3762. rectGripper2.DeflateRect( 1, 1 );
  3763. #if (defined COLOR_GRADIENTACTIVECAPTION && defined COLOR_GRADIENTACTIVECAPTION)
  3764. ASSERT( COLOR_GRADIENTACTIVECAPTION == 27 );
  3765. ASSERT( COLOR_GRADIENTINACTIVECAPTION == 28 );
  3766. #endif
  3767. LPCTSTR strBarType = _T("");
  3768. if( _pgd.m_bSideBar )
  3769. strBarType = _T("ResizableBar");
  3770. else
  3771. {
  3772. strBarType = _T("ToolBar");
  3773. if( _pgd.m_pHelperSrc )
  3774. {
  3775. CWnd * pWnd = DYNAMIC_DOWNCAST( CWnd, _pgd.m_pHelperSrc );
  3776. if( pWnd )
  3777. {
  3778. pWnd = pWnd->GetWindow( GW_CHILD );
  3779. if( pWnd )
  3780. {
  3781. pWnd = pWnd->GetWindow( GW_CHILD );
  3782. if( pWnd && pWnd->IsKindOf( RUNTIME_CLASS( CExtMenuControlBar ) ) )
  3783. strBarType = _T("MenuBar");
  3784. }
  3785. }
  3786. }
  3787. }
  3788. LPCTSTR strBarState = _T("");
  3789. if( _pgd.m_bActive )
  3790. strBarState = _T("Active");
  3791. else
  3792. strBarState = _T("Inactive");
  3793. CExtSkinItem & Caption = _pgd.m_bFloating 
  3794. ? m_Skin[_T("Caption")][_T("ControlBar")][strBarType][_T("Floating")][strBarState]
  3795. : m_Skin[_T("Caption")][_T("ControlBar")][strBarType][strBarState];
  3796. CExtSkinGlyph & CaptionGlyph = Caption.Glyph( _T("Caption") );
  3797. COLORREF clrColorize = COLORREF(-1L);
  3798. if( _pgd.m_bFlashCaptionHighlightedState )
  3799. {
  3800. ASSERT( _pgd.m_clrFlashCaptionBackground != COLORREF(-1L) );
  3801. ASSERT( _pgd.m_clrFlashCaptionText != COLORREF(-1L) );
  3802. clrColorize = _pgd.m_clrFlashCaptionBackground;
  3803. } // if( _pgd.m_bFlashCaptionHighlightedState )
  3804. CaptionGlyph.Draw( dc.m_hDC, _pgd.m_rcGripper, false, BYTE(0xFF), clrColorize );
  3805. // INT nTextColorIndex = COLOR_HIGHLIGHTTEXT;
  3806. int nTextLen = 0;
  3807. if( _pgd.m_sCaption != NULL
  3808. && ( nTextLen = int(_tcslen(_pgd.m_sCaption)) ) > 0
  3809. && (! _pgd.m_rcText.IsRectEmpty() )
  3810. && _pgd.m_rcText.right > _pgd.m_rcText.left
  3811. && _pgd.m_rcText.bottom > _pgd.m_rcText.top
  3812. )
  3813. {
  3814. // COLORREF clrText =
  3815. // GetColor(
  3816. // nTextColorIndex,
  3817. // _pgd.m_pHelperSrc,
  3818. // _pgd.m_lParam 
  3819. // );
  3820. CExtSkinColor & CaptionTextColor = Caption.Color( _T("Text") );
  3821. if( ! CaptionTextColor.IsHollow() )
  3822. {
  3823. // COLORREF clrText = CaptionTextColor;
  3824. COLORREF clrText =
  3825. _pgd.m_bFlashCaptionHighlightedState
  3826. ? _pgd.m_clrFlashCaptionText
  3827. : CaptionTextColor
  3828. ;
  3829. COLORREF clrOldText = dc.SetTextColor( clrText );
  3830. int nOldBkMode = dc.SetBkMode(TRANSPARENT);
  3831. CFont * pCurrFont =
  3832. ( _pgd.m_bSideBar && (!_pgd.m_bFloating) )
  3833. ? ( (!_pgd.m_bHorz) ? &m_FontNormalBC : &m_FontNormalVertXBC )
  3834. : ( (!_pgd.m_bHorz) ? &m_FontBoldBC : &m_FontBoldVertXBC )
  3835. ;
  3836. CFont * pOldFont =
  3837. dc.SelectObject( pCurrFont );
  3838. ASSERT( pOldFont != NULL );
  3839. if( ! _pgd.m_bHorz )
  3840. { // if text is horizontal
  3841. UINT nDtAlign = _pgd.m_bForceRTL ? DT_RIGHT : DT_LEFT;
  3842. bool bFloatingFixedBar = false;
  3843. if( _pgd.m_pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtMiniDockFrameWnd) ) )
  3844. {
  3845. CExtControlBar * pBar = 
  3846. ((CExtMiniDockFrameWnd *)_pgd.m_pHelperSrc)->GetControlBarExt();
  3847. if( pBar != NULL 
  3848. && pBar->IsFixedMode()
  3849. )
  3850. bFloatingFixedBar = true;
  3851. }
  3852. if( bFloatingFixedBar )
  3853. {
  3854. CExtSafeString sCaption( _pgd.m_sCaption );
  3855. INT nAvailableWidth = _pgd.m_rcText.Width();
  3856. for(;;) 
  3857. {
  3858. INT nWidth =
  3859. stat_CalcTextWidth( 
  3860. dc,
  3861. *pCurrFont,