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

界面编程

开发平台:

Visual C++

  1. }
  2. if( hWnd == NULL )
  3. hWnd = ::GetDesktopWindow();
  4. if( hWnd != NULL )
  5. {
  6. bool bVistaThemeMode =
  7. ( g_PaintManager.m_bIsWinVistaOrLater
  8. && g_PaintManager.m_UxTheme.IsControlsThemed()
  9. ) ? true : false;
  10. if( g_PaintManager.m_UxTheme.OpenThemeData( hWnd, VSCLASS_SCROLLBAR ) != NULL )
  11. {
  12. if( (! m_rcButtonUp.IsRectEmpty() )
  13. && dc.RectVisible( &m_rcButtonUp )
  14. )
  15. {
  16. INT nStateID = 0;
  17. if( m_bHorzBar )
  18. {
  19. if( m_bEnabled )
  20. {
  21. if( m_eSBMHT == __ESBMHT_BUTTON_UP )
  22. nStateID =
  23. m_bHoveredAreaIsPressed
  24. ? ABS_LEFTPRESSED
  25. : ABS_LEFTHOT
  26. ;
  27. else
  28. nStateID =
  29. ( bVistaThemeMode && m_eSBMHT != __ESBMHT_NOWHERE )
  30. ? ABS_LEFTHOVER
  31. : ABS_LEFTNORMAL
  32. ;
  33. }
  34. else
  35. nStateID = ABS_LEFTDISABLED;
  36. }
  37. else
  38. {
  39. if( m_bEnabled )
  40. {
  41. if( m_eSBMHT == __ESBMHT_BUTTON_UP )
  42. nStateID =
  43. m_bHoveredAreaIsPressed
  44. ? ABS_UPPRESSED
  45. : ABS_UPHOT
  46. ;
  47. else
  48. nStateID =
  49. ( bVistaThemeMode && m_eSBMHT != __ESBMHT_NOWHERE )
  50. ? ABS_UPHOVER
  51. : ABS_UPNORMAL
  52. ;
  53. }
  54. else
  55. nStateID = ABS_UPDISABLED;
  56. }
  57. VERIFY( 
  58. g_PaintManager.m_UxTheme.DrawBackground(
  59. hWnd,
  60. dc.GetSafeHdc(),
  61. SBP_ARROWBTN,
  62. nStateID,
  63. &m_rcButtonUp,
  64. &m_rcButtonUp
  65. ) == S_OK
  66. );
  67. }
  68. if( (! m_rcButtonDown.IsRectEmpty() )
  69. && dc.RectVisible( &m_rcButtonDown )
  70. )
  71. {
  72. INT nStateID = 0;
  73. if( m_bHorzBar )
  74. {
  75. if( m_bEnabled )
  76. {
  77. if( m_eSBMHT == __ESBMHT_BUTTON_DOWN )
  78. nStateID =
  79. m_bHoveredAreaIsPressed
  80. ? ABS_RIGHTPRESSED
  81. : ABS_RIGHTHOT
  82. ;
  83. else
  84. nStateID =
  85. ( bVistaThemeMode && m_eSBMHT != __ESBMHT_NOWHERE )
  86. ? ABS_RIGHTHOVER
  87. : ABS_RIGHTNORMAL
  88. ;
  89. }
  90. else
  91. nStateID = ABS_RIGHTDISABLED;
  92. }
  93. else
  94. {
  95. if( m_bEnabled )
  96. {
  97. if( m_eSBMHT == __ESBMHT_BUTTON_DOWN )
  98. nStateID =
  99. m_bHoveredAreaIsPressed
  100. ? ABS_DOWNPRESSED
  101. : ABS_DOWNHOT
  102. ;
  103. else
  104. nStateID =
  105. ( bVistaThemeMode && m_eSBMHT != __ESBMHT_NOWHERE )
  106. ? ABS_DOWNHOVER
  107. : ABS_DOWNNORMAL
  108. ;
  109. }
  110. else
  111. nStateID = ABS_DOWNDISABLED;
  112. }
  113. VERIFY( 
  114. g_PaintManager.m_UxTheme.DrawBackground(
  115. hWnd,
  116. dc.GetSafeHdc(),
  117. SBP_ARROWBTN,
  118. nStateID,
  119. &m_rcButtonDown,
  120. &m_rcButtonDown
  121. ) == S_OK
  122. );
  123. }
  124. if( (! m_rcPageDown.IsRectEmpty() )
  125. && dc.RectVisible( &m_rcPageDown )
  126. )
  127. {
  128. INT nPartID =
  129. m_bHorzBar
  130. ? SBP_LOWERTRACKHORZ
  131. : SBP_LOWERTRACKVERT
  132. ;
  133. INT nStateID = 0;
  134. if( m_bEnabled )
  135. {
  136. if( m_eSBMHT == __ESBMHT_PAGE_DOWN )
  137. nStateID =
  138. m_bHoveredAreaIsPressed
  139. ? SCRBS_PRESSED
  140. : SCRBS_HOT
  141. ;
  142. else
  143. nStateID = SCRBS_NORMAL;
  144. }
  145. else
  146. nStateID = SCRBS_DISABLED;
  147. VERIFY( 
  148. g_PaintManager.m_UxTheme.DrawBackground(
  149. hWnd,
  150. dc.GetSafeHdc(),
  151. nPartID,
  152. nStateID,
  153. &m_rcPageDown,
  154. &m_rcPageDown
  155. ) == S_OK
  156. );
  157. }
  158. if( (! m_rcPageUp.IsRectEmpty() )
  159. && dc.RectVisible( &m_rcPageUp )
  160. )
  161. {
  162. INT nPartID =
  163. m_bHorzBar
  164. ? SBP_UPPERTRACKHORZ
  165. : SBP_UPPERTRACKVERT
  166. ;
  167. INT nStateID = 0;
  168. if( m_bEnabled )
  169. {
  170. if( m_eSBMHT == __ESBMHT_PAGE_UP )
  171. nStateID =
  172. m_bHoveredAreaIsPressed
  173. ? SCRBS_PRESSED
  174. : SCRBS_HOT
  175. ;
  176. else
  177. nStateID = SCRBS_NORMAL;
  178. }
  179. else
  180. nStateID = SCRBS_DISABLED;
  181. VERIFY( 
  182. g_PaintManager.m_UxTheme.DrawBackground(
  183. hWnd,
  184. dc.GetSafeHdc(),
  185. nPartID,
  186. nStateID,
  187. &m_rcPageUp,
  188. &m_rcPageUp
  189. ) == S_OK
  190. );
  191. }
  192. if( (! m_rcThumb.IsRectEmpty() )
  193. && dc.RectVisible( &m_rcThumb )
  194. )
  195. {
  196. INT nPartID =
  197. m_bHorzBar
  198. ? SBP_THUMBBTNHORZ
  199. : SBP_THUMBBTNVERT
  200. ;
  201. INT nStateID = 0;
  202. if( m_bEnabled )
  203. {
  204. if( m_eSBMHT == __ESBMHT_THUMB )
  205. nStateID =
  206. m_bHoveredAreaIsPressed
  207. ? SCRBS_PRESSED
  208. : SCRBS_HOT
  209. ;
  210. else
  211. nStateID = SCRBS_NORMAL;
  212. }
  213. else
  214. nStateID = SCRBS_DISABLED;
  215. if( m_bEnabled )
  216. {
  217. CRect rcXpGrip = m_rcThumb;
  218. VERIFY( 
  219. g_PaintManager.m_UxTheme.DrawBackground(
  220. hWnd,
  221. dc.GetSafeHdc(),
  222. nPartID,
  223. nStateID,
  224. &m_rcThumb,
  225. &m_rcThumb
  226. ) == S_OK
  227. );
  228. VERIFY( 
  229. g_PaintManager.m_UxTheme.DrawBackground(
  230. hWnd,
  231. dc.GetSafeHdc(),
  232. m_bHorzBar ? SBP_GRIPPERHORZ : SBP_GRIPPERVERT,
  233. 0,
  234. &rcXpGrip,
  235. &rcXpGrip
  236. ) == S_OK
  237. );
  238. } // if( m_bEnabled )
  239. }
  240. g_PaintManager.m_UxTheme.CloseThemeData();
  241. return;
  242. }
  243. } // if( hWnd != NULL )
  244. } // if( g_PaintManager.m_UxTheme.IsControlsThemed() )
  245. UINT nStateBase = 0;
  246. if( m_bEnabled )
  247. {
  248. if( m_eSBMHT == __ESBMHT_NOWHERE )
  249. {
  250. if( pPM->m_bScrollBarsHaveHoverEffectIn2kStyle )
  251. nStateBase = DFCS_FLAT;
  252. }
  253. }
  254. else
  255. nStateBase = DFCS_INACTIVE;
  256. if( (! m_rcButtonUp.IsRectEmpty() )
  257. && dc.RectVisible( &m_rcButtonUp )
  258. )
  259. {
  260. UINT nState = m_bHorzBar ? DFCS_SCROLLLEFT : DFCS_SCROLLUP;
  261. if( m_bEnabled
  262. && m_bHoveredAreaIsPressed
  263. && m_eSBMHT == __ESBMHT_BUTTON_UP
  264. )
  265. nState |= DFCS_PUSHED|DFCS_FLAT;
  266. dc.DrawFrameControl(
  267. m_rcButtonUp,
  268. DFC_SCROLL,
  269. nState | nStateBase
  270. );
  271. }
  272. if( (! m_rcButtonDown.IsRectEmpty() )
  273. && dc.RectVisible( &m_rcButtonDown )
  274. )
  275. {
  276. UINT nState = m_bHorzBar ? DFCS_SCROLLRIGHT : DFCS_SCROLLDOWN;
  277. if( m_bEnabled
  278. && m_bHoveredAreaIsPressed
  279. && m_eSBMHT == __ESBMHT_BUTTON_DOWN
  280. )
  281. nState |= DFCS_PUSHED|DFCS_FLAT;
  282. dc.DrawFrameControl(
  283. m_rcButtonDown,
  284. DFC_SCROLL,
  285. nState | nStateBase
  286. );
  287. }
  288. if( m_bEnabled
  289. && m_eSBMHT == __ESBMHT_PAGE_UP
  290. && (! m_rcPageUp.IsRectEmpty() )
  291. && dc.RectVisible( &m_rcPageUp )
  292. && ( m_bHoveredAreaIsPressed
  293. || pPM->m_bScrollBarsHaveHoverEffectIn2kStyle
  294. )
  295. )
  296. dc.FillRect(
  297. &m_rcPageUp,
  298. m_bHoveredAreaIsPressed
  299. ? (&(pPM->m_brushDarkestSystem))
  300. : (&(pPM->m_brushDarkSystem))
  301. );
  302. if( m_bEnabled
  303. && m_eSBMHT == __ESBMHT_PAGE_DOWN
  304. && (! m_rcPageDown.IsRectEmpty() )
  305. && dc.RectVisible( &m_rcPageDown )
  306. && ( m_bHoveredAreaIsPressed
  307. || pPM->m_bScrollBarsHaveHoverEffectIn2kStyle
  308. )
  309. )
  310. dc.FillRect(
  311. &m_rcPageDown,
  312. m_bHoveredAreaIsPressed
  313. ? (&(pPM->m_brushDarkestSystem))
  314. : (&(pPM->m_brushDarkSystem))
  315. );
  316. if( m_bEnabled
  317. && (! m_rcThumb.IsRectEmpty() )
  318. && dc.RectVisible( &m_rcThumb )
  319. )
  320. {
  321. UINT nState = DFCS_BUTTONPUSH;
  322. if( m_bHoveredAreaIsPressed
  323. && pPM->m_bScrollBarsHaveHoverEffectIn2kStyle
  324. && m_eSBMHT == __ESBMHT_THUMB
  325. )
  326. nState |= DFCS_PUSHED|DFCS_FLAT;
  327. dc.DrawFrameControl(
  328. m_rcThumb,
  329. DFC_BUTTON,
  330. nState | nStateBase
  331. );
  332. }
  333. }
  334. void CExtPaintManager::PAINTSCROLLBARDATA::PaintSkinned(
  335. CDC & dc,
  336. CExtPaintManager * pPM,
  337. const SCROLLBARSKINDATA & _sbsd,
  338. BYTE nConstantAlpha // = 0x0FF
  339. )
  340. {
  341. ASSERT( dc.GetSafeHdc() != NULL );
  342. ASSERT_VALID( pPM );
  343. pPM;
  344. if( m_rcBar.IsRectEmpty()
  345. || (! dc.RectVisible( &m_rcBar ) )
  346. )
  347. return;
  348. //CExtScrollBar * pExtScrollBar = DYNAMIC_DOWNCAST( CExtScrollBar, m_pHelperSrc );
  349. CExtZoomScrollBar * pZoomer = DYNAMIC_DOWNCAST( CExtZoomScrollBar, m_pHelperSrc );
  350. if( pZoomer != NULL )
  351. { // zoom scroll bar background and lines
  352. ASSERT_VALID( pZoomer );
  353. if( pPM == NULL )
  354. {
  355. pPM = pZoomer->PmBridge_GetPM();
  356. ASSERT_VALID( pPM );
  357. } // if( pPM == NULL )
  358. bool bTransparent = false;
  359. #if (!defined __EXT_MFC_NO_STATUSBAR)
  360. CExtStatusControlBar * pWndParent = DYNAMIC_DOWNCAST( CExtStatusControlBar, pZoomer->GetParent() );
  361. if( pWndParent != NULL )
  362. {
  363. CRect rcPaint, _rcClient;
  364. pWndParent->GetWindowRect( &rcPaint );
  365. pZoomer->ScreenToClient( &rcPaint );
  366. pZoomer->GetClientRect( &_rcClient );
  367. pZoomer->ClientToScreen( &_rcClient );
  368. pWndParent->ScreenToClient( &_rcClient );
  369. if( pWndParent->m_bCompleteRepaint )
  370. {
  371. dc.OffsetViewportOrg(   _rcClient.left, 0 );
  372. bool bRet = pPM->StatusBar_EraseBackground( dc, rcPaint, pWndParent );
  373. dc.OffsetViewportOrg( - _rcClient.left, 0 );
  374. if( ! bRet )
  375. {
  376. bool bTransparent = false;
  377. if( pPM->GetCb2DbTransparentMode(pWndParent) )
  378. {
  379. if( pPM->PaintDockerBkgnd( true, dc, pZoomer ) )
  380. bTransparent = true;
  381. }
  382. if( ! bTransparent )
  383. dc.FillSolidRect( 
  384. &rcPaint, 
  385. pPM->GetColor( CExtPaintManager::CLR_3DFACE_OUT, pWndParent ) 
  386. );
  387. }
  388. INT nIndex = pWndParent->CommandToIndex( pZoomer->GetDlgCtrlID() );
  389. if( nIndex >= 0 )
  390. {
  391. dc.OffsetViewportOrg( _rcClient.left, 0 );
  392. pPM->StatusBar_ErasePaneBackground( dc, nIndex, rcPaint, pWndParent );
  393. dc.OffsetViewportOrg( -_rcClient.left, 0 );
  394. bTransparent = true;
  395. }
  396. } // if( pWndParent->m_bCompleteRepaint )
  397. } // if( pWndParent != NULL )
  398. #endif // (!defined __EXT_MFC_NO_STATUSBAR)
  399. if( ! bTransparent )
  400. {
  401. if( (! bTransparent )
  402. && pPM->GetCb2DbTransparentMode( m_pHelperSrc )
  403. )
  404. {
  405. CExtPaintManager::stat_ExcludeChildAreas(
  406. dc,
  407. pZoomer->GetSafeHwnd(),
  408. CExtPaintManager::stat_DefExcludeChildAreaCallback
  409. );
  410. if( pPM->PaintDockerBkgnd( true, dc, pZoomer ) )
  411. bTransparent = true;
  412. }
  413. if( ! bTransparent )
  414. dc.FillSolidRect(
  415. &m_rcBar,
  416. pPM->GetColor( CExtPaintManager::CLR_3DFACE_OUT, pZoomer ) 
  417. );
  418. } // if( ! bTransparent )
  419. CRect rcLineH( m_rcScrollableArea );
  420. CRect rcLineV( m_rcScrollableArea );
  421. if( m_bHorzBar )
  422. {
  423. rcLineH.bottom = rcLineH.top + 1;
  424. rcLineH.OffsetRect( 0, m_rcScrollableArea.Height() / 2 + 1 );
  425. rcLineV.right = rcLineV.left + 1;
  426. rcLineV.OffsetRect( m_rcScrollableArea.Width() / 2, 0 );
  427. rcLineV.bottom = rcLineV.top + 7;
  428. rcLineV.OffsetRect( 0, (m_rcScrollableArea.Height() - 7 ) / 2 + 2 );
  429. }
  430. else
  431. {
  432. rcLineH.right = rcLineH.left + 1;
  433. rcLineH.OffsetRect( m_rcScrollableArea.Width() / 2 + 1, 0 );
  434. rcLineV.right = rcLineV.left + 7;
  435. rcLineV.OffsetRect( (m_rcScrollableArea.Width() - 7 ) / 2 + 1 , 0 );
  436. rcLineV.bottom = rcLineV.top + 1;
  437. rcLineV.OffsetRect( 0, m_rcScrollableArea.Height() / 2 );
  438. }
  439. COLORREF clrZsLineLight = 
  440. m_bEnabled 
  441. ? _sbsd.m_clrZsLineLightEnabled 
  442. : _sbsd.m_clrZsLineLightDisabled; 
  443. COLORREF clrZsLineDark = 
  444. m_bEnabled 
  445. ? _sbsd.m_clrZsLineDarkEnabled 
  446. : _sbsd.m_clrZsLineDarkDisabled; 
  447. rcLineH.OffsetRect( 
  448. m_bHorzBar ? 0 : -1, 
  449. m_bHorzBar ? -1 : 0
  450. );
  451. rcLineV.OffsetRect(
  452. m_bHorzBar ? -2 : 0,
  453. m_bHorzBar ? -2 : -1
  454. );
  455. if( m_bHorzBar )
  456. rcLineV.OffsetRect( _sbsd.m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_THUMB)].GetSize().cx / 2 - 2, 0 );
  457. else
  458. rcLineV.OffsetRect( 0, _sbsd.m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_THUMB)].GetSize().cy / 2 - 2 );
  459. if( clrZsLineDark !=  COLORREF(-1L) )
  460. {
  461. dc.FillSolidRect( &rcLineH, clrZsLineDark );
  462. dc.FillSolidRect( &rcLineV, clrZsLineDark );
  463. } // if( clrZsLineDark !=  COLORREF(-1L) )
  464. if( clrZsLineLight !=  COLORREF(-1L) )
  465. {
  466. rcLineH.OffsetRect( 1, 1 );
  467. rcLineV.OffsetRect( 1, 1 );
  468. dc.FillSolidRect( &rcLineH, clrZsLineLight );
  469. dc.FillSolidRect( &rcLineV, clrZsLineLight );
  470. } // if( clrZsLineLight !=  COLORREF(-1L) )
  471. } // zoom scroll bar background and lines
  472. if( ! _sbsd.m_bmpEntireArea.IsEmpty() )
  473. _sbsd.m_bmpEntireArea.DrawSkinParts(
  474. dc.m_hDC,
  475. m_rcBar,
  476. _sbsd.m_rcEntirePaddingR,
  477. CExtBitmap::__EDM_STRETCH,
  478. true,
  479. true
  480. );
  481. INT nDefaultStateIndex = INT(__ESBSPT_DISABLED);
  482. if( m_bEnabled )
  483. nDefaultStateIndex =
  484. ( m_eSBMHT == __ESBMHT_NOWHERE )
  485. ? INT(__ESBSPT_COLD)
  486. : INT(__ESBSPT_NORMAL)
  487. ;
  488. INT nPartNumberEffective, nPartNumber, nPartCount = INT(__ESBMHT_PART_COUNT);
  489. //  if( pPM == NULL && pExtScrollBar != NULL )
  490. //  {
  491. //  pPM = pExtScrollBar->PmBridge_GetPM();
  492. //  ASSERT_VALID( pPM );
  493. //  } // if( pPM == NULL && pExtScrollBar != NULL )
  494. for( nPartNumber = 0; nPartNumber < nPartCount; nPartNumber ++ )
  495. {
  496. bool bForceNoFillColor = false;
  497. CRect rcPart( 0, 0, 0, 0 );
  498. CExtBitmap::e_DrawMethod_t eDM = CExtBitmap::__EDM_STRETCH;
  499. nPartNumberEffective = nPartNumber;
  500. switch( nPartNumber )
  501. {
  502. case INT(__ESBMHT_BUTTON_UP):
  503. nPartNumberEffective = INT(__ESBMHT_PAGE_UP);
  504. break;
  505. case INT(__ESBMHT_BUTTON_DOWN):
  506. nPartNumberEffective = INT(__ESBMHT_PAGE_DOWN);
  507. break;
  508. case INT(__ESBMHT_THUMB):
  509. nPartNumberEffective = INT(__ESBMHT_BUTTON_UP);
  510. break;
  511. case INT(__ESBMHT_PAGE_UP):
  512. nPartNumberEffective = INT(__ESBMHT_BUTTON_DOWN);
  513. break;
  514. case INT(__ESBMHT_PAGE_DOWN):
  515. nPartNumberEffective = INT(__ESBMHT_THUMB);
  516. break;
  517. } // switch( nPartNumber )
  518. INT nCheckHoverPartNumber = nPartNumberEffective;
  519. switch( nPartNumberEffective )
  520. {
  521. case __ESBMHT_SOLID_SCROLLABLE_AREA:
  522. rcPart = m_rcScrollableArea;
  523. break;
  524. case __ESBMHT_GLYPH_ARROW_UP:
  525. eDM = CExtBitmap::__EDM_CENTER;
  526. bForceNoFillColor = true;
  527. case __ESBMHT_BUTTON_UP:
  528. if( pZoomer != NULL )
  529. eDM = CExtBitmap::__EDM_CENTER;
  530. nCheckHoverPartNumber = __ESBMHT_BUTTON_UP;
  531. rcPart = m_rcButtonUp;
  532. if( m_bHorzBar )
  533. rcPart.DeflateRect(
  534. _sbsd.m_rcEntirePaddingC.left,
  535. _sbsd.m_rcEntirePaddingC.top,
  536. 0,
  537. _sbsd.m_rcEntirePaddingC.bottom
  538. );
  539. else
  540. rcPart.DeflateRect(
  541. _sbsd.m_rcEntirePaddingC.left,
  542. _sbsd.m_rcEntirePaddingC.top,
  543. _sbsd.m_rcEntirePaddingC.right,
  544. 0
  545. );
  546. break;
  547. case __ESBMHT_GLYPH_ARROW_DOWN:
  548. eDM = CExtBitmap::__EDM_CENTER;
  549. bForceNoFillColor = true;
  550. case __ESBMHT_BUTTON_DOWN:
  551. if( pZoomer != NULL )
  552. eDM = CExtBitmap::__EDM_CENTER;
  553. nCheckHoverPartNumber = __ESBMHT_BUTTON_DOWN;
  554. rcPart = m_rcButtonDown;
  555. if( m_bHorzBar )
  556. rcPart.DeflateRect(
  557. 0,
  558. _sbsd.m_rcEntirePaddingC.top,
  559. _sbsd.m_rcEntirePaddingC.right,
  560. _sbsd.m_rcEntirePaddingC.bottom
  561. );
  562. else
  563. rcPart.DeflateRect(
  564. _sbsd.m_rcEntirePaddingC.left,
  565. 0,
  566. _sbsd.m_rcEntirePaddingC.right,
  567. _sbsd.m_rcEntirePaddingC.bottom
  568. );
  569. break;
  570. case __ESBMHT_GLYPH_THUMB_GRIPPER:
  571. eDM = CExtBitmap::__EDM_CENTER;
  572. bForceNoFillColor = true;
  573. case __ESBMHT_THUMB:
  574. if( pZoomer != NULL )
  575. eDM = CExtBitmap::__EDM_CENTER;
  576. nCheckHoverPartNumber = __ESBMHT_THUMB;
  577. rcPart = m_rcThumb;
  578. if( m_bHorzBar )
  579. rcPart.DeflateRect(
  580. 0,
  581. _sbsd.m_rcEntirePaddingC.top,
  582. 0,
  583. _sbsd.m_rcEntirePaddingC.bottom
  584. );
  585. else
  586. rcPart.DeflateRect(
  587. _sbsd.m_rcEntirePaddingC.left,
  588. 0,
  589. _sbsd.m_rcEntirePaddingC.right,
  590. 0
  591. );
  592. break;
  593. case __ESBMHT_PAGE_UP:
  594. rcPart = m_rcPageUp;
  595. break;
  596. case __ESBMHT_PAGE_DOWN:
  597. rcPart = m_rcPageDown;
  598. break;
  599. } // switch( nPartNumberEffective )
  600. INT nStateIndex = nDefaultStateIndex;
  601. if( m_bEnabled 
  602. && INT(m_eSBMHT) == nCheckHoverPartNumber
  603. )
  604. nStateIndex =
  605. m_bHoveredAreaIsPressed
  606. ? INT(__ESBSPT_PRESSED)
  607. : INT(__ESBSPT_HOT)
  608. ;
  609. if( rcPart.left >= rcPart.right
  610. || rcPart.top >= rcPart.bottom
  611. )
  612. continue;
  613. COLORREF clrSolidBackground = COLORREF(-1L);
  614. CRect rcPadding( 0, 0, 0, 0 );
  615. const CExtBitmap & _bmp =
  616. _sbsd.GetPart(
  617. e_scroll_bar_skin_part_t(nStateIndex),
  618. e_scroll_bar_mouse_hover_type_t(nPartNumberEffective),
  619. &rcPadding,
  620. &clrSolidBackground
  621. );
  622. if( (! bForceNoFillColor ) && clrSolidBackground != COLORREF(-1L) )
  623. dc.FillSolidRect( &rcPart, clrSolidBackground );
  624. if( ! _bmp.IsEmpty() )
  625. {
  626. bool bDraw = true;
  627. if( eDM == CExtBitmap::__EDM_CENTER
  628. && ( m_pHelperSrc == NULL
  629. || pZoomer == NULL
  630. )
  631. )
  632. {
  633. CSize _sizeBmp = _bmp.GetSize();
  634. CSize _sizeMin = rcPart.Size();
  635. _sizeMin.cx -= rcPadding.left + rcPadding.right;
  636. _sizeMin.cy -= rcPadding.top + rcPadding.bottom;
  637. if( _sizeBmp.cx >= _sizeMin.cx
  638. || _sizeBmp.cy >= _sizeMin.cy
  639. )
  640. bDraw = false;
  641. }
  642. if( bDraw && nPartNumberEffective == __ESBMHT_GLYPH_THUMB_GRIPPER )
  643. {
  644. if( ! m_rcThumb.IsRectEmpty() )
  645. {
  646. CSize _sizeBmp = _bmp.GetSize();
  647. if( m_bHorzBar )
  648. {
  649. if( _sizeBmp.cx >= m_rcThumb.Width()-4 )
  650. bDraw = false;
  651. } // if( m_bHorzBar )
  652. else
  653. {
  654. if( _sizeBmp.cy >= m_rcThumb.Height()-4 )
  655. bDraw = false;
  656. } // if( m_bHorzBar )
  657. } // if( ! m_rcThumb.IsRectEmpty() )
  658. } // if( bDraw && nPartNumberEffective == __ESBMHT_GLYPH_THUMB_GRIPPER )
  659. if( bDraw )
  660. {
  661. if( pZoomer != NULL )
  662. {
  663. ASSERT( pPM != NULL );
  664. if( pPM->UiScalingIsEnabled( CExtPaintManager::__EUIST_X )
  665. && pPM->UiScalingIsEnabled( CExtPaintManager::__EUIST_Y )
  666. && g_PaintManager.m_nLPX > 96
  667. && g_PaintManager.m_nLPY > 96
  668. )
  669. {
  670. CSize _sizeOld = _bmp.GetSize(); // rcPart.Size();
  671. CSize _sizeNew(
  672. pPM->UiScalingDo( _sizeOld.cx, CExtPaintManager::__EUIST_X ),
  673. pPM->UiScalingDo( _sizeOld.cy, CExtPaintManager::__EUIST_Y )
  674. );
  675. _sizeNew.cx = ::MulDiv( _sizeNew.cx, 7, 8 );
  676. _sizeNew.cy = ::MulDiv( _sizeNew.cy, 7, 8 );
  677. if( _sizeNew != _sizeOld )
  678. {
  679. CRect rcPartNew(
  680. rcPart.left,
  681. rcPart.top,
  682. rcPart.left + _sizeNew.cx,
  683. rcPart.top + _sizeNew.cy
  684. );
  685. rcPartNew.OffsetRect(
  686. - ( _sizeNew.cx - _sizeOld.cx ) / 2,
  687. - ( _sizeNew.cy - _sizeOld.cy ) / 2
  688. );
  689. rcPart = rcPartNew;
  690. eDM = CExtBitmap::__EDM_STRETCH;
  691. } // if( _sizeNew != _sizeOld )
  692. }
  693. } // if( pZoomer != NULL )
  694. _bmp.AlphaBlendSkinParts(
  695. dc.m_hDC,
  696. rcPart,
  697. rcPadding,
  698. eDM,
  699. true,
  700. true,
  701. nConstantAlpha
  702. );
  703. } // if( bDraw )
  704. } // if( ! _bmp.IsEmpty() )
  705. } // for( nPartNumber = 0; nPartNumber < nPartCount; nPartNumber ++ )
  706. }
  707. CExtPaintManager::e_scroll_bar_mouse_hover_type_t
  708. CExtPaintManager::PAINTSCROLLBARDATA::GetHT(
  709. const POINT & pt
  710. ) const
  711. {
  712. if( m_rcBar.IsRectEmpty() )
  713. return __ESBMHT_NOWHERE;
  714. if( (! m_rcButtonUp.IsRectEmpty() )
  715. && m_rcButtonUp.PtInRect( pt )
  716. )
  717. return __ESBMHT_BUTTON_UP;
  718. if( (! m_rcButtonDown.IsRectEmpty() )
  719. && m_rcButtonDown.PtInRect( pt )
  720. )
  721. return __ESBMHT_BUTTON_DOWN;
  722. if( (! m_rcThumb.IsRectEmpty() )
  723. && m_rcThumb.PtInRect( pt )
  724. )
  725. return __ESBMHT_THUMB;
  726. if( (! m_rcPageUp.IsRectEmpty() )
  727. && m_rcPageUp.PtInRect( pt )
  728. )
  729. return __ESBMHT_PAGE_UP;
  730. if( (! m_rcPageDown.IsRectEmpty() )
  731. && m_rcPageDown.PtInRect( pt )
  732. )
  733. return __ESBMHT_PAGE_DOWN;
  734. return __ESBMHT_NOWHERE;
  735. }
  736. CExtPaintManager::e_scroll_bar_mouse_hover_type_t
  737. CExtPaintManager::PAINTSCROLLBARDATA::AdjustHT(
  738. const POINT & pt
  739. )
  740. {
  741. m_eSBMHT = GetHT( pt );
  742. return m_eSBMHT;
  743. }
  744. CRect CExtPaintManager::PAINTSCROLLBARDATA::GetAreaRect(
  745. CExtPaintManager::e_scroll_bar_mouse_hover_type_t eSBMHT
  746. ) const
  747. {
  748. switch( eSBMHT )
  749. {
  750. case __ESBMHT_BUTTON_UP:
  751. return m_rcButtonUp;
  752. case __ESBMHT_BUTTON_DOWN:
  753. return m_rcButtonDown;
  754. case __ESBMHT_THUMB:
  755. return m_rcThumb;
  756. case __ESBMHT_PAGE_UP:
  757. return m_rcPageUp;
  758. case __ESBMHT_PAGE_DOWN:
  759. return m_rcPageDown;
  760. } // switch( eSBMHT )
  761. return CRect( 0, 0, 0, 0 );
  762. }
  763. CRect CExtPaintManager::PAINTSCROLLBARDATA::GetAreaRectHT() const
  764. {
  765. return GetAreaRect( m_eSBMHT );
  766. }
  767. LONG CExtPaintManager::stat_PassPaintMessages(
  768. bool bPassNcPaint, // = true
  769. bool bPassEraseBkgnd, // = true
  770. bool bPassPaint // = true
  771. )
  772. {
  773. return
  774. stat_PassPaintMessages(
  775. (HWND)NULL,
  776. bPassNcPaint,
  777. bPassEraseBkgnd,
  778. bPassPaint
  779. );
  780. }
  781. LONG CExtPaintManager::stat_PassPaintMessages(
  782. HWND hWnd,
  783. bool bPassNcPaint, // = true
  784. bool bPassEraseBkgnd, // = true
  785. bool bPassPaint // = true
  786. )
  787. {
  788. LONG nCountPassed = 0L;
  789. MSG msg;
  790. if( bPassNcPaint )
  791. {
  792. while( ::PeekMessage( &msg, hWnd, WM_NCPAINT, WM_NCPAINT, PM_NOREMOVE ) )
  793. {
  794. if( ! ::PeekMessage( &msg, hWnd, WM_NCPAINT, WM_NCPAINT, PM_REMOVE ) )
  795. break;
  796. ::DispatchMessage( &msg );
  797. nCountPassed ++;
  798. } // while( ::PeekMessage( &msg, NULL, WM_NCPAINT, WM_NCPAINT, PM_NOREMOVE ) )
  799. } // if( bPassNcPaint )
  800. if( bPassEraseBkgnd )
  801. {
  802. while( ::PeekMessage( &msg, hWnd, WM_ERASEBKGND, WM_ERASEBKGND, PM_NOREMOVE ) )
  803. {
  804. if( ! ::PeekMessage( &msg, hWnd, WM_ERASEBKGND, WM_ERASEBKGND, PM_REMOVE ) )
  805. break;
  806. ::DispatchMessage( &msg );
  807. nCountPassed ++;
  808. } // while( ::PeekMessage( &msg, NULL, WM_ERASEBKGND, WM_ERASEBKGND, PM_NOREMOVE ) )
  809. } // if( bPassEraseBkgnd )
  810. if( bPassPaint )
  811. {
  812. while( ::PeekMessage( &msg, hWnd, WM_PAINT, WM_PAINT, PM_NOREMOVE ) )
  813. {
  814. if( ! ::PeekMessage( &msg, hWnd, WM_PAINT, WM_PAINT, PM_REMOVE ) )
  815. break;
  816. ::DispatchMessage( &msg );
  817. nCountPassed ++;
  818. } // while( ::PeekMessage( &msg, NULL, WM_PAINT, WM_PAINT, PM_NOREMOVE ) )
  819. } // if( bPassPaint )
  820. return nCountPassed;
  821. }
  822. #if (defined __EXT_PM_BACK_COMPATIBILITY_BITMAP_API)
  823. bool CExtPaintManager::stat_ResizeBitmap(
  824. CBitmap & bmpSrc,
  825. CSize _size,
  826. CBrush & brushFill
  827. )
  828. {
  829. ASSERT( bmpSrc.GetSafeHandle() != NULL );
  830. CDC dcSrc, dcDst;
  831. CBitmap * pBmpOldSrc, *pBmpOldDst, bmpNew;
  832. { // block
  833. if( (! dcSrc.CreateCompatibleDC( NULL ) )
  834. || (! dcDst.CreateCompatibleDC( NULL ) )
  835. )
  836. {
  837. ASSERT( FALSE );
  838. return false;
  839. }
  840. pBmpOldSrc = dcSrc.SelectObject( &bmpSrc );
  841. if( !bmpNew.CreateCompatibleBitmap(
  842. &dcSrc,
  843. _size.cx,
  844. _size.cy
  845. )
  846. )
  847. {
  848. ASSERT( FALSE );
  849. dcSrc.SelectObject( pBmpOldSrc );
  850. return false;
  851. }
  852. pBmpOldDst = dcSrc.SelectObject( &bmpNew );
  853. } // block
  854. CRect rcFill( 0, 0, _size.cx, _size.cy );
  855. dcDst.FillRect( &rcFill, &brushFill );
  856. VERIFY(
  857. dcDst.BitBlt(
  858. 0, 0, _size.cx, _size.cy,
  859. &dcSrc,
  860. 0, 0,
  861. SRCCOPY
  862. )
  863. );
  864. dcSrc.SelectObject( pBmpOldSrc );
  865. dcDst.SelectObject( pBmpOldDst );
  866. bmpSrc.DeleteObject();
  867. bmpSrc.Attach( bmpNew.Detach() );
  868. return true;
  869. }
  870. HICON CExtPaintManager::stat_HBITMAPtoHICON(
  871. HBITMAP hBmpSrc,
  872. COLORREF clrTransparent,
  873. const RECT * pRcPart, // = NULL
  874. bool bReplaceSysColors // = true
  875. )
  876. {
  877. if( hBmpSrc == NULL )
  878. {
  879. ASSERT( FALSE );
  880. return NULL;
  881. }
  882. BITMAP bmpDescription;
  883. ::memset( &bmpDescription, 0, sizeof(BITMAP) );
  884. ::GetObject( hBmpSrc, sizeof(BITMAP), &bmpDescription );
  885. ASSERT( bmpDescription.bmWidth > 0 && bmpDescription.bmHeight > 0 );
  886. CImageList _il;
  887. if( !_il.Create(
  888. bmpDescription.bmWidth,
  889. bmpDescription.bmHeight,
  890. ILC_COLOR32|ILC_MASK,
  891. 0,
  892. 1
  893. )
  894. )
  895. {
  896. ASSERT( FALSE );
  897. return NULL;
  898. }
  899. COLORREF * pSurface = NULL;
  900. HBITMAP hBmpExtracted = stat_CloneBitmap( hBmpSrc, pRcPart, &pSurface );
  901. if( hBmpExtracted == NULL || pSurface == NULL )
  902. {
  903. ASSERT( FALSE );
  904. return NULL;
  905. }
  906. CBitmap bmpExtracted;
  907. bmpExtracted.Attach( hBmpExtracted );
  908. if( bReplaceSysColors )
  909. {
  910. COLORREF quadClrTransparent =
  911. RGB(
  912. GetBValue(clrTransparent),
  913. GetGValue(clrTransparent),
  914. GetRValue(clrTransparent)
  915. );
  916. struct
  917. {
  918. COLORREF m_quadClrSrc;
  919. COLORREF m_quadClrDst;
  920. INT m_nDstSysColorIdx;
  921. bool m_bReplace;
  922. } _repl_arr[] =
  923. {
  924. { RGB(128,128,128), RGB(0,0,0), COLOR_3DSHADOW, true },
  925. { RGB(192,192,192), RGB(0,0,0), COLOR_3DFACE, true },
  926. { RGB(223,223,223), RGB(0,0,0), COLOR_3DLIGHT, true },
  927. };
  928. const int nReplCount =
  929. sizeof(_repl_arr) / sizeof(_repl_arr[0]);
  930. int nReplReal = 0;
  931. for( int n = 0; n < nReplCount; n++ )
  932. {
  933. if( _repl_arr[n].m_quadClrSrc == quadClrTransparent )
  934. {
  935. _repl_arr[n].m_bReplace = false;
  936. continue;
  937. }
  938. _repl_arr[n].m_quadClrDst =
  939. ::GetSysColor( _repl_arr[n].m_nDstSysColorIdx );
  940. _repl_arr[n].m_quadClrDst =
  941. RGB(
  942. GetBValue(_repl_arr[n].m_quadClrDst),
  943. GetGValue(_repl_arr[n].m_quadClrDst),
  944. GetRValue(_repl_arr[n].m_quadClrDst)
  945. );
  946. if( _repl_arr[n].m_quadClrDst == _repl_arr[n].m_quadClrSrc )
  947. {
  948. _repl_arr[n].m_bReplace = false;
  949. continue;
  950. }
  951. nReplReal++;
  952. } // for( int n = 0; n < nReplCount; n++ )
  953. if( nReplReal > 0 )
  954. {
  955. LONG nPixelCount =
  956. bmpDescription.bmWidth * bmpDescription.bmHeight;
  957. for( LONG nPos = 0; nPos < nPixelCount; nPos++ )
  958. {
  959. if( pSurface[nPos] == quadClrTransparent )
  960. continue;
  961. for( int n = 0; n < nReplCount; n++ )
  962. {
  963. if( ! (_repl_arr[n].m_bReplace) )
  964. continue;
  965. if( pSurface[nPos] != _repl_arr[n].m_quadClrSrc )
  966. continue;
  967. pSurface[nPos] = _repl_arr[n].m_quadClrDst;
  968. } // for( int n = 0; n < nReplCount; n++ )
  969. } // for( LONG nPos = 0; nPos < nPixelCount; nPos++ )
  970. } // if( nReplReal > 0 )
  971. } // if( bReplaceSysColors )
  972. // first method creates icon indirect
  973. // (this way is needed for older Windows OS versions)
  974. if( g_PaintManager.m_bIsWin9x || (!g_PaintManager.m_bIsWin2000orLater) )
  975. {
  976. ICONINFO ii;
  977. ::memset( &ii, 0, sizeof(ICONINFO) );
  978. ii.fIcon = TRUE;
  979. ii.xHotspot = bmpDescription.bmWidth;
  980. ii.yHotspot = bmpDescription.bmHeight;
  981. ii.hbmColor = (HBITMAP)bmpExtracted.GetSafeHandle();
  982. ii.hbmMask =
  983. ::CreateBitmap(
  984. bmpDescription.bmWidth,
  985. bmpDescription.bmHeight,
  986. 1,
  987. 1,
  988. NULL
  989. );
  990. ASSERT( ii.hbmMask != NULL );
  991. if( ii.hbmMask != NULL )
  992. {
  993. HICON hIcon = NULL;
  994. CDC dcMask, dcColor;
  995. if( dcMask.CreateCompatibleDC( NULL )
  996. && dcColor.CreateCompatibleDC( NULL )
  997. )
  998. {
  999. HGDIOBJ hBmpMaskOld =
  1000. ::SelectObject( dcMask.m_hDC, ii.hbmMask );
  1001. HGDIOBJ hBmpColorOld =
  1002. ::SelectObject( dcColor.m_hDC, ii.hbmColor );
  1003. HBRUSH hStockWhiteBrush = (HBRUSH)
  1004. ::GetStockObject( WHITE_BRUSH );
  1005. CRect rcSurface(
  1006. 0,
  1007. 0,
  1008. bmpDescription.bmWidth,
  1009. bmpDescription.bmHeight
  1010. );
  1011. ::FillRect( dcMask.m_hDC, &rcSurface, hStockWhiteBrush );
  1012. int x, y;
  1013. for( x = 0; x < bmpDescription.bmWidth; x++ )
  1014. {
  1015. for( y = 0; y < bmpDescription.bmHeight; y++ )
  1016. {
  1017. COLORREF clr = dcColor.GetPixel( x, y );
  1018. if( clr != clrTransparent )
  1019. dcMask.SetPixel( x, y, RGB(0,0,0) );
  1020. else
  1021. dcColor.SetPixel( x, y, RGB(0,0,0) );
  1022. } // for( y = 0; y < bmpDescription.bmHeight; y++ )
  1023. } // for( x = 0; x < bmpDescription.bmWidth; x++ )
  1024. ::SelectObject( dcMask.m_hDC, hBmpMaskOld );
  1025. ::SelectObject( dcColor.m_hDC, hBmpColorOld );
  1026. hIcon = ::CreateIconIndirect( &ii );
  1027. ASSERT( hIcon != NULL );
  1028. } // if( dcMask.CreateCompatibleDC( NULL ) ...
  1029. #ifdef _DEBUG
  1030. else
  1031. {
  1032. ASSERT( FALSE );
  1033. } // else from if( dcMask.CreateCompatibleDC( NULL ) )
  1034. #endif // _DEBUG
  1035. ::DeleteObject( ii.hbmColor );
  1036. ::DeleteObject( ii.hbmMask );
  1037. if( hIcon != NULL )
  1038. return hIcon;
  1039. } // if( ii.hbmMask != NULL )
  1040. } // if( g_PaintManager.m_bIsWin9x || (!g_PaintManager.m_bIsWin2000orLater) )
  1041. // second method creates icon via image list
  1042. // (this way is better for Windows 2000 or higher NT OS branch)
  1043. int nImgIdx =
  1044. _il.Add( &bmpExtracted, clrTransparent );
  1045. if( nImgIdx < 0 )
  1046. {
  1047. ASSERT( FALSE );
  1048. return NULL;
  1049. }
  1050. HICON hIcon = _il.ExtractIcon( nImgIdx );
  1051. ASSERT( hIcon != NULL );
  1052. return hIcon;
  1053. }
  1054. HBITMAP CExtPaintManager::stat_CloneBitmap(
  1055. HBITMAP hBmpSrc,
  1056. const RECT * pRcPart, // = NULL
  1057. COLORREF ** ppSurface // = NULL // if not NULL - create 32 bit surface
  1058. )
  1059. {
  1060. return
  1061. CExtBitmap::stat_CloneBitmap(
  1062. hBmpSrc,
  1063. pRcPart,
  1064. ppSurface
  1065. );
  1066. }
  1067. bool CExtPaintManager::stat_CloneBitmap(
  1068. CBitmap & bmpDst,
  1069. const CBitmap & bmpSrc,
  1070. const RECT * pRcPart, // = NULL
  1071. COLORREF ** ppSurface // = NULL // if not NULL - create 32 bit surface
  1072. )
  1073. {
  1074. return
  1075. CExtBitmap::stat_CloneBitmap(
  1076. bmpDst,
  1077. bmpSrc,
  1078. pRcPart,
  1079. ppSurface
  1080. );
  1081. }
  1082. INT CExtPaintManager::stat_GetBitmapColorMap( // returns bitmap's color bit count or zero if error
  1083. HBITMAP hBmpSrc,
  1084. CMap < COLORREF, COLORREF, DWORD, DWORD > & _map // key is color, value is count of color entries in bitmap
  1085. )
  1086. {
  1087. _map.RemoveAll();
  1088. if( hBmpSrc == NULL )
  1089. {
  1090. ASSERT( FALSE );
  1091. return 0;
  1092. }
  1093. BITMAP bmpSrcDescription;
  1094. ::memset( &bmpSrcDescription, 0, sizeof(BITMAP) );
  1095. ::GetObject( hBmpSrc, sizeof(BITMAP), &bmpSrcDescription );
  1096. ASSERT( bmpSrcDescription.bmWidth > 0 && bmpSrcDescription.bmHeight > 0 );
  1097. HDC hSrcDC = ::CreateCompatibleDC( NULL );
  1098. if( hSrcDC == NULL )
  1099. {
  1100. ASSERT( FALSE );
  1101. return 0;
  1102. }
  1103. LONG nPixelCount =
  1104. bmpSrcDescription.bmWidth*bmpSrcDescription.bmHeight;
  1105. HGDIOBJ hBmpSrcOld = ::SelectObject( hSrcDC, (HGDIOBJ)hBmpSrc );
  1106. BITMAPINFOHEADER bih;
  1107. ::memset( &bih, 0, sizeof(BITMAPINFOHEADER) );
  1108. bih.biSize = sizeof(BITMAPINFOHEADER);
  1109. bih.biWidth = bmpSrcDescription.bmWidth;
  1110. bih.biHeight = bmpSrcDescription.bmHeight;
  1111. bih.biPlanes = 1;
  1112. bih.biBitCount = 32;
  1113. bih.biCompression = BI_RGB;
  1114. bih.biSizeImage = nPixelCount;
  1115. RGBQUAD * pColor = NULL;
  1116. HBITMAP hBmpDst =
  1117. ::CreateDIBSection(
  1118. hSrcDC,
  1119. (LPBITMAPINFO)&bih,
  1120. DIB_RGB_COLORS,
  1121. (void **)&pColor,
  1122. NULL,
  1123. NULL
  1124. );
  1125. if( hBmpDst == NULL )
  1126. {
  1127. ASSERT( FALSE );
  1128. ::SelectObject( hSrcDC, (HGDIOBJ)hBmpSrcOld );
  1129. ::DeleteDC( hSrcDC );
  1130. return 0;
  1131. }
  1132. ASSERT( pColor != NULL );
  1133. HDC hDstDC = ::CreateCompatibleDC( NULL );
  1134. if( hDstDC == NULL )
  1135. {
  1136. ASSERT( FALSE );
  1137. ::DeleteObject( hBmpDst );
  1138. ::SelectObject( hSrcDC, (HGDIOBJ)hBmpSrcOld );
  1139. ::DeleteDC( hSrcDC );
  1140. return NULL;
  1141. }
  1142. HGDIOBJ hBmpDstOld = ::SelectObject( hDstDC, (HGDIOBJ)hBmpDst );
  1143. VERIFY(
  1144. ::BitBlt(
  1145. hDstDC,
  1146. 0, 0,
  1147. bmpSrcDescription.bmWidth, bmpSrcDescription.bmHeight,
  1148. hSrcDC,
  1149. 0, 0,
  1150. SRCCOPY
  1151. )
  1152. );
  1153. for( ; nPixelCount > 0; pColor++, nPixelCount-- )
  1154. {
  1155. COLORREF clrToInsert =
  1156. RGB(
  1157. pColor->rgbRed,
  1158. pColor->rgbGreen,
  1159. pColor->rgbBlue
  1160. );
  1161. DWORD dwEntries = 0;
  1162. if( _map.Lookup( clrToInsert, dwEntries ) )
  1163. {
  1164. ASSERT( dwEntries > 0 );
  1165. dwEntries++;
  1166. _map.SetAt( clrToInsert, dwEntries );
  1167. } // if( _map.Lookup( clrToInsert, dwEntries ) )
  1168. else
  1169. _map.SetAt( clrToInsert, 1 );
  1170. } // for( ; nPixelCount > 0; pColor++, nPixelCount-- )
  1171. ::SelectObject( hDstDC, (HGDIOBJ)hBmpDstOld );
  1172. ::DeleteDC( hDstDC );
  1173. ::SelectObject( hSrcDC, (HGDIOBJ)hBmpSrcOld );
  1174. ::DeleteDC( hSrcDC );
  1175. ::DeleteObject( hBmpDst );
  1176. return bmpSrcDescription.bmBitsPixel;
  1177. }
  1178. INT CExtPaintManager::stat_GetBitmapColorArray( // returns bitmap's color bit count or zero if error
  1179. HBITMAP hBmpSrc,
  1180. CArray < COLORREF, COLORREF > & arr,
  1181. bool bMakeUniqueColors // = true // used only if bit count <= 8
  1182. )
  1183. {
  1184. arr.RemoveAll();
  1185. if( hBmpSrc == NULL )
  1186. {
  1187. ASSERT( FALSE );
  1188. return 0;
  1189. }
  1190. BITMAP bmpSrcDescription;
  1191. ::memset( &bmpSrcDescription, 0, sizeof(BITMAP) );
  1192. ::GetObject( hBmpSrc, sizeof(BITMAP), &bmpSrcDescription );
  1193. ASSERT( bmpSrcDescription.bmWidth > 0 && bmpSrcDescription.bmHeight > 0 );
  1194. if( bmpSrcDescription.bmBitsPixel <= 8 )
  1195. {
  1196. HGLOBAL hGlobalDst = stat_HBITMAPtoHGLOBAL( hBmpSrc );
  1197. if( hGlobalDst == NULL )
  1198. {
  1199. ASSERT( FALSE );
  1200. return 0;
  1201. }
  1202. INT nBitCount =  (INT) ((LPBITMAPINFOHEADER)hGlobalDst)->biBitCount;
  1203. ASSERT( nBitCount <= 8 );
  1204. INT nColorCount = 1L << nBitCount;
  1205. RGBQUAD * pColor = (RGBQUAD *)
  1206. ( ((LPBYTE)hGlobalDst)
  1207. + ((LPBITMAPINFOHEADER)hGlobalDst)->biSize
  1208. );
  1209. for( INT i = 0; i < nColorCount; i++ )
  1210. {
  1211. COLORREF clrToInsert =
  1212. RGB(
  1213. pColor[i].rgbRed,
  1214. pColor[i].rgbGreen,
  1215. pColor[i].rgbBlue
  1216. );
  1217. arr.Add( clrToInsert );
  1218. } // for( INT i = 0; i < nColorCount; i++ )
  1219. ::GlobalFree( hGlobalDst );
  1220. if( bMakeUniqueColors )
  1221. {
  1222. INT nCount = (INT)arr.GetSize();
  1223. if( nCount < 2 )
  1224. return bmpSrcDescription.bmBitsPixel;
  1225. for( INT i = 0; i < (nCount-1); i++ )
  1226. {
  1227. COLORREF clrTest = arr[i];
  1228. for( INT j = i+1; j < nCount;  )
  1229. {
  1230. COLORREF clrToCmp = arr[j];
  1231. if( clrTest == clrToCmp )
  1232. {
  1233. arr.RemoveAt( j, 1 );
  1234. nCount --;
  1235. } // if( clrTest == clrToCmp )
  1236. else
  1237. j++;
  1238. } // for( INT j = i+1; j < nCount; )
  1239. } // for( INT i = 0; i < (nCount-1); i++ )
  1240. } // if( bMakeUniqueColors )
  1241. return bmpSrcDescription.bmBitsPixel;
  1242. } // if( bmpSrcDescription.bmBitsPixel <= 8 )
  1243. CMap < COLORREF, COLORREF, DWORD, DWORD > _map;
  1244. INT nVal = stat_GetBitmapColorMap( hBmpSrc, _map );
  1245. if( nVal == 0 )
  1246. {
  1247. ASSERT( FALSE );
  1248. return 0;
  1249. }
  1250. ASSERT( nVal == bmpSrcDescription.bmBitsPixel );
  1251. #ifdef _DEBUG
  1252. INT nCount = (INT)_map.GetCount();
  1253. #endif // _DEBUG
  1254. ASSERT( nCount > 0 );
  1255. POSITION pos = _map.GetStartPosition();
  1256. ASSERT( pos != NULL );
  1257. for( ; pos != NULL; )
  1258. {
  1259. COLORREF clrToInsert = RGB(0,0,0);
  1260. DWORD dwEntries = 0;
  1261. _map.GetNextAssoc( pos, clrToInsert, dwEntries );
  1262. ASSERT( dwEntries > 0 );
  1263. arr.Add( clrToInsert );
  1264. } // for( ; pos != NULL; )
  1265. ASSERT( nCount == arr.GetSize() );
  1266. return bmpSrcDescription.bmBitsPixel;
  1267. }
  1268. HGLOBAL CExtPaintManager::stat_HBITMAPtoHGLOBAL(
  1269. HBITMAP hBmpSrc,
  1270.     HPALETTE hPalDst // = NULL
  1271. )
  1272. {
  1273. return CExtBitmap::stat_HBITMAPtoHGLOBAL( hBmpSrc, hPalDst );
  1274. }
  1275. HBITMAP CExtPaintManager::stat_LoadBitmapFromMemoryData(
  1276. const BYTE * pDataBmp,
  1277. DWORD dwSizeDataBmp
  1278. )
  1279. {
  1280. if( pDataBmp == NULL || dwSizeDataBmp == 0 )
  1281. {
  1282. ASSERT( FALSE );
  1283. return NULL;
  1284. } // if( pDataBmp == NULL || dwSizeDataBmp == 0 )
  1285. try
  1286. {
  1287. CMemFile _file( (BYTE *)pDataBmp, UINT(dwSizeDataBmp), 0 );
  1288. CArchive ar( &_file, CArchive::load );
  1289. HBITMAP hBmp = NULL;
  1290. if( ! stat_SerializeBitmap( ar, &hBmp ) )
  1291. {
  1292. ASSERT( FALSE );
  1293. return NULL;
  1294. } // if( ! stat_SerializeBitmap( ar, &hBmp ) )
  1295. ASSERT( hBmp != NULL );
  1296. return hBmp;
  1297. } // try
  1298. catch( CException * pException )
  1299. {
  1300. ASSERT( FALSE );
  1301. pException->Delete();
  1302. } // catch( CException * pException )
  1303. catch( ... )
  1304. {
  1305. ASSERT( FALSE );
  1306. } // catch( ... )
  1307. return NULL;
  1308. }
  1309. bool CExtPaintManager::stat_SerializeBitmap(
  1310. CArchive & ar,
  1311. HBITMAP * p_hBmp,
  1312. DWORD dwResourceSize // = 0L // not 0 only if loaded from resources
  1313. )
  1314. {
  1315. ASSERT( p_hBmp != NULL );
  1316. if( ar.IsStoring() )
  1317. {
  1318. ASSERT( (*p_hBmp) != NULL );
  1319. CExtBitmap _bitmap;
  1320. if( ! _bitmap.FromBitmap( *p_hBmp ) )
  1321. return false;
  1322. if( ! _bitmap.SaveBMP( ar, false, false ) )
  1323. return false;
  1324. } // if( ar.IsStoring() )
  1325. else
  1326. {
  1327. ASSERT( (*p_hBmp) == NULL );
  1328. CExtBitmap _bitmap;
  1329. if( ! _bitmap.LoadBMP( ar, true, false, dwResourceSize ? true : false ) )
  1330. return false;
  1331. (*p_hBmp) = _bitmap.CreateBitmap( false );
  1332. } // else from if( ar.IsStoring() )
  1333. return true;
  1334. }
  1335. bool CExtPaintManager::stat_SerializeBitmap(
  1336. __EXT_MFC_SAFE_LPCTSTR strFileName,
  1337. bool bRead,
  1338. HBITMAP * p_hBmp
  1339. )
  1340. {
  1341. ASSERT( strFileName != NULL );
  1342. if( strFileName == NULL )
  1343. return false;
  1344. bool bRetVal = true;
  1345. try
  1346. {
  1347. CFile _file(
  1348. strFileName,
  1349. bRead
  1350. ? (CFile::modeRead | CFile::typeBinary)
  1351. : (CFile::modeWrite | CFile::modeCreate | CFile::typeBinary)
  1352. );
  1353. CArchive ar(
  1354. &_file,
  1355. bRead ? CArchive::load : CArchive::store
  1356. );
  1357. bRetVal = stat_SerializeBitmap( ar, p_hBmp );
  1358. ASSERT( bRetVal );
  1359. if( !bRead )
  1360. ar.Flush();
  1361. ar.Close();
  1362. _file.Close();
  1363. } // try
  1364. catch( CException * pXept )
  1365. {
  1366. ASSERT( FALSE );
  1367. pXept->Delete();
  1368. return false;
  1369. } // catch( CException * pXept )
  1370. catch( ... )
  1371. {
  1372. ASSERT( FALSE );
  1373. return false;
  1374. } // catch( ... )
  1375. return bRetVal;
  1376. }
  1377. HBITMAP CExtPaintManager::stat_LoadBitmapResource(
  1378. HINSTANCE hInst,
  1379. HRSRC hRsrc
  1380. )
  1381. {
  1382. if( hInst == NULL || hRsrc == NULL )
  1383. return NULL;
  1384. HGLOBAL hGlobal = ::LoadResource( hInst, hRsrc );
  1385. if( hGlobal == NULL )
  1386. return NULL;
  1387. LPBYTE pData = (LPBYTE)::LockResource( hGlobal );
  1388. if( pData == NULL )
  1389. {
  1390. ::FreeResource( hGlobal );
  1391. return NULL;
  1392. } // if( pData == NULL )
  1393. DWORD dwResourceSize = ::SizeofResource( hInst, hRsrc );
  1394. ASSERT( dwResourceSize > 0 );
  1395. CMemFile _file;
  1396. _file.Attach( pData, dwResourceSize );
  1397. _file.Seek( 0, CFile::begin );
  1398. CArchive ar( &_file, CArchive::load );
  1399. HBITMAP hBmp = NULL;
  1400. bool bSerializationPassed =
  1401. stat_SerializeBitmap( ar, &hBmp, dwResourceSize );
  1402. ASSERT( bSerializationPassed );
  1403. ar.Close();
  1404. _file.Detach();
  1405. ::UnlockResource( hGlobal );
  1406. ::FreeResource( hGlobal );
  1407. if( !bSerializationPassed )
  1408. return NULL;
  1409. ASSERT( hBmp != NULL );
  1410. return hBmp;
  1411. }
  1412. HBITMAP CExtPaintManager::stat_LoadBitmapResource(
  1413. __EXT_MFC_SAFE_LPCTSTR sResourceID,
  1414. __EXT_MFC_SAFE_LPCTSTR sResourceType, // = RT_BITMAP, // default bitmap section
  1415. HINSTANCE hInst // = NULL // find it automatically
  1416. )
  1417. {
  1418. if( hInst == NULL )
  1419. {
  1420. hInst =
  1421. ::AfxFindResourceHandle(
  1422. sResourceID,
  1423. sResourceType
  1424. );
  1425. if( hInst == NULL )
  1426. return NULL;
  1427. } // if( hInst == NULL )
  1428. HRSRC hRsrc =
  1429. ::FindResource(
  1430. hInst,
  1431. sResourceID,
  1432. sResourceType
  1433. );
  1434. if( hRsrc == NULL )
  1435. return NULL;
  1436. return stat_LoadBitmapResource( hInst, hRsrc );
  1437. }
  1438. #endif // __EXT_PM_BACK_COMPATIBILITY_BITMAP_API
  1439. void CExtPaintManager::stat_GetMonitorParms(
  1440. CExtPaintManager::monitor_parms_t & _mp
  1441. )
  1442. {
  1443. VERIFY(
  1444. ::GetWindowRect(
  1445. ::GetDesktopWindow(),
  1446. &_mp.m_rcMonitor
  1447. )
  1448. );
  1449. VERIFY(
  1450. ::SystemParametersInfo(
  1451. SPI_GETWORKAREA,
  1452. 0,
  1453. PVOID(&_mp.m_rcWorkArea),
  1454. 0
  1455. )
  1456. );
  1457. _mp.m_bPrimaryMonitor = true;
  1458. }
  1459. void CExtPaintManager::stat_GetMonitorParms(
  1460. CExtPaintManager::monitor_parms_t & _mp,
  1461. const POINT & _ptScreenFrom
  1462. )
  1463. {
  1464. MONITORINFO _MonitorInfo;
  1465. ::memset( &_MonitorInfo, 0, sizeof(MONITORINFO) );
  1466. _MonitorInfo.cbSize = sizeof(MONITORINFO);
  1467. if( !::GetMonitorInfo(
  1468. MonitorFromPoint(
  1469. _ptScreenFrom, 
  1470. MONITOR_DEFAULTTONEAREST
  1471. ),
  1472. &_MonitorInfo
  1473. )
  1474. )
  1475. {
  1476. ASSERT( FALSE );
  1477. stat_GetMonitorParms( _mp );
  1478. return;
  1479. }
  1480. _mp.m_rcMonitor = _MonitorInfo.rcMonitor;
  1481. _mp.m_rcWorkArea = _MonitorInfo.rcWork;
  1482. _mp.m_bPrimaryMonitor = 
  1483. ( (_MonitorInfo.dwFlags&MONITORINFOF_PRIMARY) != 0 )
  1484. ? true
  1485. : false
  1486. ;
  1487. }
  1488. void CExtPaintManager::stat_GetMonitorParms(
  1489. CExtPaintManager::monitor_parms_t & _mp,
  1490. const RECT & _rcScreenFrom
  1491. )
  1492. {
  1493. MONITORINFO _MonitorInfo;
  1494. ::memset( &_MonitorInfo, 0, sizeof(MONITORINFO) );
  1495. _MonitorInfo.cbSize = sizeof(MONITORINFO);
  1496. if( !::GetMonitorInfo(
  1497. MonitorFromRect(
  1498. &_rcScreenFrom, 
  1499. MONITOR_DEFAULTTONEAREST
  1500. ),
  1501. &_MonitorInfo
  1502. )
  1503. )
  1504. {
  1505. ASSERT( FALSE );
  1506. stat_GetMonitorParms( _mp );
  1507. return;
  1508. }
  1509. _mp.m_rcMonitor = _MonitorInfo.rcMonitor;
  1510. _mp.m_rcWorkArea = _MonitorInfo.rcWork;
  1511. _mp.m_bPrimaryMonitor = 
  1512. ( (_MonitorInfo.dwFlags&MONITORINFOF_PRIMARY) != 0 )
  1513. ? true
  1514. : false
  1515. ;
  1516. }
  1517. void CExtPaintManager::stat_GetMonitorParms(
  1518. monitor_parms_t & _mp,
  1519. HWND hWndFrom
  1520. )
  1521. {
  1522. ASSERT( hWndFrom != NULL && ::IsWindow(hWndFrom) );
  1523. RECT rcWnd = { 0, 0, 0, 0 };
  1524. if( ::IsIconic( hWndFrom ) )
  1525. {
  1526. WINDOWPLACEMENT _wp;
  1527. ::memset( &_wp, 0, sizeof(WINDOWPLACEMENT) );
  1528. _wp.length = sizeof(WINDOWPLACEMENT);
  1529. if( ::GetWindowPlacement( hWndFrom, &_wp ) )
  1530. ::memcpy( &rcWnd, &_wp.rcNormalPosition, sizeof(RECT) );
  1531. else
  1532. VERIFY(
  1533. ::GetWindowRect(
  1534. ::GetDesktopWindow(),
  1535. &rcWnd
  1536. )
  1537. );
  1538. }
  1539. else
  1540. {
  1541. VERIFY( ::GetWindowRect( hWndFrom, &rcWnd ) );
  1542. }
  1543. stat_GetMonitorParms( _mp, rcWnd );
  1544. }
  1545. void CExtPaintManager::stat_GetMonitorParms(
  1546. monitor_parms_t & _mp,
  1547. CWnd * pWndFrom
  1548. )
  1549. {
  1550. ASSERT_VALID( pWndFrom );
  1551. stat_GetMonitorParms( _mp, pWndFrom->GetSafeHwnd() );
  1552. }
  1553. CRect CExtPaintManager::stat_AlignWndRectToMonitor(
  1554. CRect rcInitial,
  1555. bool bUseWorkArea, // = true // if false - use all monitor area
  1556. bool bNoPartialVisibility // = false
  1557. )
  1558. {
  1559. monitor_parms_t _mp;
  1560. stat_GetMonitorParms( _mp, rcInitial );
  1561. CRect rcDesktop = bUseWorkArea ? _mp.m_rcWorkArea : _mp.m_rcMonitor;
  1562. if( rcInitial.left >= rcDesktop.right )
  1563. rcInitial.OffsetRect( rcDesktop.right - rcInitial.right, 0 );
  1564. if( rcInitial.top >= rcDesktop.bottom )
  1565. rcInitial.OffsetRect( 0, rcDesktop.bottom - rcInitial.bottom );
  1566. if( rcInitial.right <= rcDesktop.left )
  1567. rcInitial.OffsetRect( rcDesktop.left - rcInitial.left, 0 );
  1568. if( rcInitial.bottom <= rcDesktop.top )
  1569. rcInitial.OffsetRect( 0, rcDesktop.top - rcInitial.top );
  1570. if( bNoPartialVisibility )
  1571. {
  1572. if( rcInitial.right > rcDesktop.right )
  1573. rcInitial.OffsetRect( rcDesktop.right - rcInitial.right, 0 );
  1574. if( rcInitial.bottom > rcDesktop.bottom )
  1575. rcInitial.OffsetRect( 0, rcDesktop.bottom - rcInitial.bottom );
  1576. if( rcInitial.left < rcDesktop.left )
  1577. rcInitial.OffsetRect( rcDesktop.left - rcInitial.left, 0 );
  1578. if( rcInitial.top < rcDesktop.top )
  1579. rcInitial.OffsetRect( 0, rcDesktop.top - rcInitial.top );
  1580. } // if( bNoPartialVisibility )
  1581. return rcInitial;
  1582. }
  1583. void CExtPaintManager::stat_DrawDotLineH(
  1584. CDC & dc,
  1585. int x1,
  1586. int x2,
  1587. int y,
  1588. COLORREF clrDots
  1589. )
  1590. {
  1591. ASSERT_VALID( (&dc) );
  1592. ASSERT( dc.GetSafeHdc() != NULL );
  1593. if( (x1&1) != 0 )
  1594. x1++;
  1595. for( ; x1 < x2; x1 += 2 )
  1596. dc.SetPixel( x1, y, clrDots );
  1597. }
  1598. void CExtPaintManager::stat_DrawDotLineV(
  1599. CDC & dc,
  1600. int x,
  1601. int y1,
  1602. int y2,
  1603. COLORREF clrDots
  1604. )
  1605. {
  1606. ASSERT_VALID( (&dc) );
  1607. ASSERT( dc.GetSafeHdc() != NULL );
  1608. if( (y1&1) != 0 )
  1609. y1++;
  1610. for( ; y1 < y2; y1 += 2 )
  1611. dc.SetPixel( x, y1, clrDots );
  1612. }
  1613. #if (defined __EXT_PM_BACK_COMPATIBILITY_COLOR_API)
  1614. COLORREF CExtPaintManager::stat_RGBtoCMY( COLORREF clr )
  1615. {
  1616. return CExtBitmap::stat_RGBtoCMY( clr );
  1617. }
  1618. COLORREF CExtPaintManager::stat_CMYtoRGB( COLORREF clr )
  1619. {
  1620. return CExtBitmap::stat_CMYtoRGB( clr );
  1621. }
  1622. //----------------------------------------------------------------------
  1623. // Conversion between the HSL (Hue, Saturation, and Luminosity) 
  1624. // and RBG color model.
  1625. //----------------------------------------------------------------------
  1626. // The conversion algorithms presented here come from the book by 
  1627. // Fundamentals of Interactive Computer Graphics by Foley and van Dam. 
  1628. // In the example code, HSL values are represented as floating point 
  1629. // number in the range 0 to 1. RGB tridrants use the Windows convention 
  1630. // of 0 to 255 of each element. 
  1631. //----------------------------------------------------------------------
  1632. double CExtPaintManager::stat_HuetoRGB(double m1, double m2, double h )
  1633. {
  1634. return CExtBitmap::stat_HuetoRGB( m1,  m2,  h );
  1635. }
  1636. COLORREF CExtPaintManager::stat_HLStoRGB( double H, double L, double S )
  1637. {
  1638. return CExtBitmap::stat_HLStoRGB( H, L, S );
  1639. }
  1640. void CExtPaintManager::stat_RGBtoHSL( COLORREF rgb, double *H, double *S, double *L )
  1641. {   
  1642. CExtBitmap::stat_RGBtoHSL( rgb, H, S, L );
  1643. }
  1644. BYTE CExtPaintManager::stat_GetRGBFromHue(float rm1, float rm2, float rh)
  1645. {
  1646. return CExtBitmap::stat_GetRGBFromHue( rm1,  rm2,  rh );
  1647. }
  1648. COLORREF CExtPaintManager::stat_GetRGBFromHLSExtend( double H, double L, double S )
  1649. {
  1650. return CExtBitmap::stat_GetRGBFromHLSExtend( H, L, S );
  1651. }
  1652. COLORREF CExtPaintManager::stat_HLS_Adjust(
  1653. COLORREF clr,
  1654. double percentH, // = 0.0
  1655. double percentL, // = 0.0
  1656. double percentS  // = 0.0
  1657. )
  1658. {
  1659. return CExtBitmap::stat_HLS_Adjust( clr, percentH, percentL, percentS );
  1660. }
  1661. COLORREF CExtPaintManager::stat_RGB_Enlight( 
  1662. COLORREF clrLight, 
  1663. COLORREF clrDark, 
  1664. INT nEnlighten
  1665. )
  1666. {
  1667. return CExtBitmap::stat_RGB_Enlight( clrLight, clrDark, nEnlighten );
  1668. }
  1669. COLORREF CExtPaintManager::stat_RGB_Blend( 
  1670. COLORREF clrFrom, 
  1671. COLORREF clrTo, 
  1672. INT nAlpha
  1673. )
  1674. {
  1675. return CExtBitmap::stat_RGB_Blend( clrFrom, clrTo, nAlpha );
  1676. }
  1677. #endif // (defined __EXT_PM_BACK_COMPATIBILITY_COLOR_API)
  1678. BOOL CExtPaintManager::stat_PaintParentBk(
  1679. HWND hWnd,
  1680. HDC hDC,
  1681. LPCRECT rectClip // = NULL
  1682. )
  1683. {
  1684. ASSERT( hDC != NULL );
  1685. ASSERT( ::IsWindow(hWnd) );
  1686. if( rectClip != NULL )
  1687. {
  1688. CRgn rgn;
  1689. rgn.CreateRectRgnIndirect( rectClip );
  1690. ::SelectClipRgn( hDC, (HRGN)rgn.GetSafeHandle() );
  1691. }
  1692. HWND hWndParent = ::GetParent( hWnd );
  1693. ASSERT( ::IsWindow(hWndParent) );
  1694. CPoint pt( 0, 0 );
  1695. ::MapWindowPoints(hWnd,hWndParent,&pt,1);
  1696. VERIFY(
  1697. ::OffsetWindowOrgEx(
  1698. hDC,
  1699. pt.x,
  1700. pt.y,
  1701. &pt
  1702. )
  1703. );
  1704. LRESULT lRes =
  1705. ::SendMessage(
  1706. hWndParent,
  1707. WM_ERASEBKGND,
  1708. (WPARAM)hDC,
  1709. 0
  1710. );
  1711. VERIFY(
  1712. ::SetWindowOrgEx(
  1713. hDC,
  1714. pt.x,
  1715. pt.y,
  1716. &pt
  1717. )
  1718. );
  1719. ::SelectClipRgn( hDC, NULL );
  1720. return (BOOL)lRes;
  1721. }
  1722. bool CExtPaintManager::stat_DefIsHwndNeedsDirectRepaint(
  1723. HWND hWndChild
  1724. )
  1725. {
  1726. DWORD dwChildStyle =
  1727. DWORD( ::__EXT_MFC_GetWindowLong( hWndChild, GWL_STYLE ) );
  1728. CExtSafeString sClassName;
  1729. ::GetClassName(
  1730. hWndChild,
  1731. sClassName.GetBuffer( _MAX_PATH + 1 ),
  1732. _MAX_PATH
  1733. );
  1734. sClassName.ReleaseBuffer();
  1735. if( sClassName.CompareNoCase( __EXT_SIZE_GRIPPER_CLASS_NAME ) == 0
  1736. || sClassName.CompareNoCase( WC_TABCONTROL ) == 0
  1737. || sClassName.CompareNoCase( TRACKBAR_CLASS ) == 0
  1738. || sClassName.CompareNoCase( _T("Static") ) == 0
  1739. )
  1740. return true;
  1741. if( sClassName.CompareNoCase( _T("Button") ) == 0
  1742. && ( g_PaintManager.m_bUxValidColorsExtracted
  1743. || (dwChildStyle&0x0F) == BS_DEFPUSHBUTTON
  1744. || (dwChildStyle&0x0F) == BS_PUSHBUTTON
  1745. || (dwChildStyle&0x0F) == BS_CHECKBOX
  1746. || (dwChildStyle&0x0F) == BS_AUTOCHECKBOX
  1747. || (dwChildStyle&0x0F) == BS_RADIOBUTTON
  1748. || (dwChildStyle&0x0F) == BS_3STATE
  1749. || (dwChildStyle&0x0F) == BS_AUTO3STATE
  1750. || (dwChildStyle&0x0F) == BS_GROUPBOX
  1751. || (dwChildStyle&0x0F) == BS_AUTORADIOBUTTON
  1752. )
  1753. )
  1754. return true;
  1755. return false;
  1756. }
  1757. bool CExtPaintManager::stat_DefExcludeChildAreaCallback(
  1758. HDC hDC,
  1759. HWND hWnd,
  1760. HWND hWndChild,
  1761. LPVOID pCookie
  1762. )
  1763. {
  1764. ASSERT( hDC != NULL );
  1765. ASSERT( hWnd != NULL );
  1766. ASSERT( IsWindow(hWnd) );
  1767. ASSERT( hWndChild != NULL );
  1768. ASSERT( IsWindow(hWndChild) );
  1769. hDC;
  1770. hWnd;
  1771. hWndChild;
  1772. pCookie;
  1773. return stat_DefIsHwndNeedsDirectRepaint( hWndChild );
  1774. }
  1775. int CExtPaintManager::stat_GetBPP()
  1776. {
  1777. CWindowDC dc_desktop( NULL );
  1778. int nBitsPerPixel = ::GetDeviceCaps( dc_desktop.m_hDC, BITSPIXEL );
  1779. return nBitsPerPixel;
  1780. }
  1781. static const UINT stat_pixels_glyph_btn_expand_bottom[] =
  1782. {
  1783. 1,1,1,1,1,
  1784. 0,1,1,1,0,
  1785. 0,0,1,0,0,
  1786. };
  1787. static const UINT stat_pixels_glyph_btn_expand_bottom_2003[] =
  1788. {
  1789. 1,1,1,1,1,
  1790. 0,0,0,0,0,
  1791. 0,0,0,0,0,
  1792. 1,1,1,1,1,
  1793. 0,1,1,1,0,
  1794. 0,0,1,0,0,
  1795. };
  1796. const CExtPaintManager::glyph_t
  1797. CExtPaintManager::g_glyph_btn_expand_bottom(
  1798. 5,3,2,
  1799. stat_pixels_glyph_btn_expand_bottom
  1800. );
  1801. const CExtPaintManager::glyph_t
  1802. CExtPaintManager::g_glyph_btn_expand_bottom_2003(
  1803. 5,6,2,
  1804. stat_pixels_glyph_btn_expand_bottom_2003
  1805. );
  1806. static const UINT stat_pixels_glyph_btn_expand_right2[] =
  1807. {
  1808. 1,1,0,0,1,1,0,0,
  1809. 0,1,1,0,0,1,1,0,
  1810. 0,0,1,1,0,0,1,1,
  1811. 0,1,1,0,0,1,1,0,
  1812. 1,1,0,0,1,1,0,0,
  1813. };
  1814. static const UINT stat_pixels_glyph_btn_expand_right2_2003[] =
  1815. {
  1816. 0,0,0,0,0,0,
  1817. 1,0,0,0,1,0,
  1818. 1,1,0,0,1,1,
  1819. 1,0,0,0,1,0,
  1820. 0,0,0,0,0,0,
  1821. };
  1822. const CExtPaintManager::glyph_t
  1823. CExtPaintManager::g_glyph_btn_expand_right2(
  1824. 8,5,2,
  1825. stat_pixels_glyph_btn_expand_right2
  1826. );
  1827. const CExtPaintManager::glyph_t
  1828. CExtPaintManager::g_glyph_btn_expand_right2_2003(
  1829. 6,5,2,
  1830. stat_pixels_glyph_btn_expand_right2_2003
  1831. );
  1832. const CExtPaintManager::glyph_t
  1833. CExtPaintManager::g_glyph_btn_expand_left(
  1834. CExtPaintManager::g_glyph_btn_expand_bottom,
  1835. 90
  1836. );
  1837. const CExtPaintManager::glyph_t
  1838. CExtPaintManager::g_glyph_btn_expand_left_2003(
  1839. CExtPaintManager::g_glyph_btn_expand_bottom_2003,
  1840. 90
  1841. );
  1842. const CExtPaintManager::glyph_t
  1843. CExtPaintManager::g_glyph_btn_expand_right(
  1844. CExtPaintManager::g_glyph_btn_expand_bottom,
  1845. 270
  1846. );
  1847. const CExtPaintManager::glyph_t
  1848. CExtPaintManager::g_glyph_btn_expand_right_2003(
  1849. CExtPaintManager::g_glyph_btn_expand_bottom_2003,
  1850. 270
  1851. );
  1852. const CExtPaintManager::glyph_t
  1853. CExtPaintManager::g_glyph_btn_expand_bottom2(
  1854. CExtPaintManager::g_glyph_btn_expand_right2,
  1855. 90
  1856. );
  1857. const CExtPaintManager::glyph_t
  1858. CExtPaintManager::g_glyph_btn_expand_bottom2_2003(
  1859. CExtPaintManager::g_glyph_btn_expand_right2_2003,
  1860. 90
  1861. );
  1862. static const UINT stat_pixels_glyph_customize_popup_src[] =
  1863. {
  1864. 0,0,0,0,0,0,0,0,0,0,0,0,
  1865. 0,0,0,0,0,0,0,0,0,0,0,0,
  1866. 0,0,0,0,0,0,0,0,0,0,0,0,
  1867. 0,0,0,0,0,0,1,0,0,0,0,0,
  1868. 0,0,0,0,0,0,1,1,0,0,0,0,
  1869. 0,0,0,0,0,0,1,1,1,0,0,0,
  1870. 0,0,0,0,0,0,1,1,1,1,0,0,
  1871. 0,0,0,0,0,0,1,1,1,1,1,0,
  1872. 0,0,0,0,0,0,1,1,1,1,1,1,
  1873. 0,0,0,0,0,0,1,1,1,1,1,0,
  1874. 0,0,0,0,0,0,1,1,1,1,0,0,
  1875. 0,0,0,0,0,0,1,1,1,0,0,0,
  1876. 0,0,0,0,0,0,1,1,0,0,0,0,
  1877. 0,0,0,0,0,0,1,0,0,0,0,0,
  1878. 0,0,0,0,0,0,0,0,0,0,0,0,
  1879. 0,0,0,0,0,0,0,0,0,0,0,0,
  1880. };
  1881. const CExtPaintManager::glyph_t
  1882. CExtPaintManager::g_glyph_customize_popup_src(
  1883. 12,16,2,
  1884. stat_pixels_glyph_customize_popup_src
  1885. );
  1886. static const UINT stat_pixels_glyph_customize_dropdown_src[] =
  1887. {
  1888. 1,0,0,0,0,0,0,0,0,0,0,0,
  1889. 1,0,0,0,0,0,0,0,0,0,0,0,
  1890. 1,0,0,0,0,0,0,0,0,0,0,0,
  1891. 1,0,0,0,0,0,1,0,0,0,0,0,
  1892. 1,0,0,0,0,0,1,1,0,0,0,0,
  1893. 1,0,0,0,0,0,1,1,1,0,0,0,
  1894. 1,0,0,0,0,0,1,1,1,1,0,0,
  1895. 1,0,0,0,0,0,1,1,1,1,1,0,
  1896. 1,0,0,0,0,0,1,1,1,1,1,1,
  1897. 1,0,0,0,0,0,1,1,1,1,1,0,
  1898. 1,0,0,0,0,0,1,1,1,1,0,0,
  1899. 1,0,0,0,0,0,1,1,1,0,0,0,
  1900. 1,0,0,0,0,0,1,1,0,0,0,0,
  1901. 1,0,0,0,0,0,1,0,0,0,0,0,
  1902. 1,0,0,0,0,0,0,0,0,0,0,0,
  1903. 1,0,0,0,0,0,0,0,0,0,0,0,
  1904. };
  1905. const CExtPaintManager::glyph_t
  1906. CExtPaintManager::g_glyph_customize_dropdown_src(
  1907. 12,16,2,
  1908. stat_pixels_glyph_customize_dropdown_src
  1909. );
  1910. static const UINT stat_pixels_glyph_task_pane_btn_expand_up[] =
  1911. {
  1912. 0,0,0,1,0,0,0,
  1913. 0,0,1,1,1,0,0,
  1914. 0,1,1,0,1,1,0,
  1915. 1,1,0,0,0,1,1,
  1916. 0,0,0,1,0,0,0,
  1917. 0,0,1,1,1,0,0,
  1918. 0,1,1,0,1,1,0,
  1919. 1,1,0,0,0,1,1,
  1920. };
  1921. const CExtPaintManager::glyph_t
  1922. CExtPaintManager::g_glyph_task_pane_btn_expand_up(
  1923. 7,8,2,
  1924. stat_pixels_glyph_task_pane_btn_expand_up
  1925. );
  1926. static const UINT stat_pixels_glyph_task_pane_btn_expand_down[] =
  1927. {
  1928. 1,1,0,0,0,1,1,
  1929. 0,1,1,0,1,1,0,
  1930. 0,0,1,1,1,0,0,
  1931. 0,0,0,1,0,0,0,
  1932. 1,1,0,0,0,1,1,
  1933. 0,1,1,0,1,1,0,
  1934. 0,0,1,1,1,0,0,
  1935. 0,0,0,1,0,0,0,
  1936. };
  1937. const CExtPaintManager::glyph_t
  1938. CExtPaintManager::g_glyph_task_pane_btn_expand_down(
  1939. 7,8,2,
  1940. stat_pixels_glyph_task_pane_btn_expand_down
  1941. );
  1942. void CExtPaintManager::PaintGlyph(
  1943. CDC & dc,
  1944. POINT ptDest,
  1945. const glyph_t & glyph,
  1946. COLORREF * pColorValues
  1947. )
  1948. {
  1949. ASSERT( dc.GetSafeHdc() != NULL );
  1950. ASSERT( pColorValues != NULL );
  1951. ASSERT( glyph.Size().cx > 0 );
  1952. ASSERT( glyph.Size().cy > 0 );
  1953. CRect rcTestVisiblity(ptDest,glyph.Size());
  1954. if( !dc.RectVisible(&rcTestVisiblity) )
  1955. return;
  1956. int x_dest = ptDest.x + glyph.Size().cx;
  1957. int y_dest = ptDest.y + glyph.Size().cy;
  1958. const UINT * pColorIndex = glyph.GetSurface();
  1959. ASSERT( pColorIndex != NULL );
  1960. for( int y = ptDest.y; y < y_dest; y++ )
  1961. {
  1962. for( int x = ptDest.x; x < x_dest; x++, pColorIndex++ )
  1963. {
  1964. UINT nColorIndex = *pColorIndex;
  1965. ASSERT( nColorIndex < glyph.GetColorsCount() );
  1966. if( nColorIndex == 0 )
  1967. continue;
  1968. COLORREF clr = pColorValues[nColorIndex];
  1969. dc.SetPixel( x, y, clr );
  1970. }
  1971. }
  1972. }
  1973. void CExtPaintManager::PaintGlyphCentered(
  1974. CDC & dc,
  1975. const RECT & rect,
  1976. const glyph_t & glyph,
  1977. COLORREF * pColorValues
  1978. )
  1979. {
  1980. ASSERT_VALID( this );
  1981. ASSERT( dc.GetSafeHdc() != NULL );
  1982. CRect _rect(rect);
  1983. _rect.NormalizeRect();
  1984. if( _rect.IsRectEmpty() )
  1985. return;
  1986. ASSERT( glyph.Size().cx > 0 );
  1987. ASSERT( glyph.Size().cy > 0 );
  1988. if( glyph.Size().cx > _rect.Width()
  1989. || glyph.Size().cy > _rect.Height()
  1990. )
  1991. return;
  1992. CPoint ptDest = _rect.TopLeft();
  1993. ptDest.x +=
  1994. (_rect.Width() - glyph.Size().cx) / 2;
  1995. ptDest.y +=
  1996. (_rect.Height() - glyph.Size().cy) / 2;
  1997. PaintGlyph(
  1998. dc,
  1999. ptDest,
  2000. glyph,
  2001. pColorValues
  2002. );
  2003. }
  2004. void CExtPaintManager::stat_ExcludeChildAreas(
  2005. HDC hDC,
  2006. HWND hWnd,
  2007. CExtPaintManager::pfnExcludeChildAreaCallback pCallback, // = NULL
  2008. LPVOID pCallbackCookie // = NULL
  2009. )
  2010. {
  2011. if( hDC == NULL || !IsWindow(hWnd) )
  2012. return;
  2013. HWND hWndChild = GetWindow( hWnd, GW_CHILD );
  2014. for( ; hWndChild != NULL; hWndChild = GetWindow( hWndChild, GW_HWNDNEXT ) )
  2015. {
  2016. if( !IsWindowVisible(hWndChild) )
  2017. continue;
  2018. __EXT_MFC_LONG_PTR dwChildStyle = __EXT_MFC_GetWindowLong( hWndChild, GWL_STYLE );
  2019. if( (dwChildStyle & WS_CHILD) == 0 )
  2020. continue;
  2021. RECT rc;
  2022. if( !::GetWindowRect(hWndChild,&rc) )
  2023. continue;
  2024. if( !::ScreenToClient(hWnd, (LPPOINT)(&rc)) )
  2025. continue;
  2026. if( !::ScreenToClient(hWnd, ((LPPOINT)(&rc))+1) )
  2027. continue;
  2028. if( pCallback != NULL )
  2029. {
  2030. if( pCallback(
  2031. hDC,
  2032. hWnd,
  2033. hWndChild,
  2034. pCallbackCookie
  2035. )
  2036. )
  2037. continue;
  2038. }
  2039. ExcludeClipRect(
  2040. hDC,
  2041. rc.left,rc.top,
  2042. rc.right,rc.bottom
  2043. );
  2044. } // for( ; hWndChild != NULL; hWndChild = GetWindow( hWndChild, GW_HWNDNEXT ) )
  2045. }
  2046. void CExtPaintManager::stat_TransparentBlt(
  2047. HDC hdcDest,        // handle to destination DC
  2048. int nXOriginDest,   // x-coord of destination upper-left corner
  2049. int nYOriginDest,   // y-coord of destination upper-left corner
  2050. int nWidthDest,     // width of destination rectangle
  2051. int hHeightDest,    // height of destination rectangle
  2052. HDC hdcSrc,         // handle to source DC
  2053. int nXOriginSrc,    // x-coord of source upper-left corner
  2054. int nYOriginSrc,    // y-coord of source upper-left corner
  2055. int nWidthSrc,      // width of source rectangle
  2056. int nHeightSrc,     // height of source rectangle
  2057. UINT crTransparent  // color to make transparent
  2058. )
  2059. {
  2060. ASSERT( hdcDest != NULL && hdcSrc != NULL );
  2061. // if( g_PaintManager.m_pfnMsImgTransparentBlt != NULL )
  2062. // {
  2063. // g_PaintManager.m_pfnMsImgTransparentBlt(
  2064. // hdcDest,
  2065. // nXOriginDest,
  2066. // nYOriginDest,
  2067. // nWidthDest,
  2068. // hHeightDest,
  2069. // hdcSrc,
  2070. // nXOriginSrc,
  2071. // nYOriginSrc,
  2072. // nWidthSrc,
  2073. // nHeightSrc,
  2074. // crTransparent
  2075. // );
  2076. // return;
  2077. // } // if( g_PaintManager.m_pfnMsImgTransparentBlt != NULL )
  2078. CDC * pDcDest = CDC::FromHandle( hdcDest );
  2079. ASSERT( pDcDest != NULL );
  2080. CExtMemoryDC
  2081. dcmm( pDcDest ),
  2082. dcmsk(
  2083. pDcDest,
  2084. NULL,
  2085. /// CExtMemoryDC::MDCOPT_RTL_COMPATIBILITY
  2086. /// |
  2087. CExtMemoryDC::MDCOPT_TO_MEMORY
  2088. |CExtMemoryDC::MDCOPT_FORCE_BLACK
  2089. )
  2090. ;
  2091. if( ( nWidthDest != nWidthSrc || hHeightDest != nHeightSrc )
  2092. && nWidthDest >= 0
  2093. && hHeightDest >= 0
  2094. )
  2095. {
  2096. VERIFY(
  2097. ::StretchBlt(
  2098. dcmm.GetSafeHdc(),
  2099. 0,
  2100. 0,
  2101. nWidthDest,
  2102. hHeightDest,
  2103. hdcSrc,
  2104. nXOriginSrc,
  2105. nYOriginSrc,
  2106. nWidthSrc,
  2107. nHeightSrc,
  2108. SRCCOPY
  2109. )
  2110. );
  2111. }
  2112. else
  2113. {
  2114. VERIFY(
  2115. ::BitBlt(
  2116. dcmm.GetSafeHdc(),
  2117. 0,
  2118. 0,
  2119. nWidthSrc,
  2120. nHeightSrc,
  2121. hdcSrc,
  2122. nXOriginSrc,
  2123. nYOriginSrc,
  2124. SRCCOPY
  2125. )
  2126. );
  2127. }
  2128. int nRealWidthDest  =
  2129. (nWidthDest < 0) ? nWidthSrc : nWidthDest;
  2130. int nRealHeightDest =
  2131. (hHeightDest < 0) ? nHeightSrc : hHeightDest;
  2132. dcmm.SetBkColor( crTransparent );
  2133. VERIFY(
  2134. dcmsk.BitBlt(
  2135. 0,
  2136. 0,
  2137. nRealWidthDest,
  2138. nRealHeightDest,
  2139. &dcmm,
  2140. 0,
  2141. 0,
  2142. SRCCOPY
  2143. )
  2144. );
  2145. dcmm.SetBkColor( RGB(0,0,0) );
  2146. dcmm.SetTextColor( RGB(255,255,255) );
  2147. VERIFY(
  2148. dcmm.BitBlt(
  2149. 0,
  2150. 0,
  2151. nRealWidthDest,
  2152. nRealHeightDest,
  2153. &dcmsk,
  2154. 0,
  2155. 0,
  2156. SRCAND
  2157. )
  2158. );
  2159. COLORREF clrBkOld = ::SetBkColor( hdcDest, RGB(255,255,255) );
  2160. COLORREF clrTextOld = ::SetTextColor( hdcDest, RGB(0,0,0) );
  2161. VERIFY(
  2162. ::BitBlt(
  2163. hdcDest,
  2164. nXOriginDest,
  2165. nYOriginDest,
  2166. nRealWidthDest,
  2167. nRealHeightDest,
  2168. dcmsk.GetSafeHdc(),
  2169. 0,
  2170. 0,
  2171. SRCAND
  2172. )
  2173. );
  2174. VERIFY(
  2175. ::BitBlt(
  2176. hdcDest,
  2177. nXOriginDest,
  2178. nYOriginDest,
  2179. nRealWidthDest,
  2180. nRealHeightDest,
  2181. dcmm.GetSafeHdc(),
  2182. 0,
  2183. 0,
  2184. SRCPAINT
  2185. )
  2186. );
  2187. dcmm.__Flush( FALSE );
  2188. dcmsk.__Flush( FALSE );
  2189. ::SetBkColor( hdcDest, clrBkOld );
  2190. ::SetTextColor( hdcDest, clrTextOld );
  2191. }
  2192. // generate DIB for UI light brush (when BPP <= 8 )
  2193. HBITMAP CExtPaintManager::stat_GenLBDIB(
  2194. COLORREF clrDarker, // = COLORREF(-1) // by default COLORREF(-1) is changed to ::GetSysColor(COLOR_BTNFACE)
  2195. COLORREF clrLighter, // = COLORREF(-1) // by default COLORREF(-1) is changed to ::GetSysColor(COLOR_BTNHIGHLIGHT)
  2196. int nColorMaskHorz, // = 1
  2197. int nColorMaskVert, // = 1
  2198. int nSkipMaskHorz, // = 0
  2199. int nSkipMaskVert, // = 0
  2200. COLORREF clrSkip // = COLORREF(-1L) // // default COLORREF(-1) is changed to clrDarker
  2201. )
  2202. {
  2203. if( clrSkip == COLORREF(-1L) )
  2204. clrSkip = clrDarker;
  2205. CWindowDC dcAlign( NULL );
  2206. CDC dc;
  2207. if( !dc.CreateCompatibleDC( &dcAlign ) )
  2208. {
  2209. ASSERT( FALSE );
  2210. return NULL;
  2211. }
  2212. CBitmap bmp;
  2213. if( !bmp.CreateCompatibleBitmap( &dcAlign, 16, 16 ) )
  2214. {
  2215. ASSERT( FALSE );
  2216. return NULL;
  2217. }
  2218. CBitmap * pOldBmp = dc.SelectObject( &bmp );
  2219. COLORREF clrEffectiveDarker =
  2220. ( clrDarker == COLORREF(-1) )
  2221. ? ( ::GetSysColor( COLOR_BTNFACE ) )
  2222. : clrDarker
  2223. ;
  2224. COLORREF clrEffectiveLighter =
  2225. ( clrLighter == COLORREF(-1) )
  2226. ? ( ::GetSysColor( COLOR_BTNHIGHLIGHT ) )
  2227. : clrLighter
  2228. ;
  2229. for( int nY = 0; nY < 16; nY++ )
  2230. {
  2231. for( int nX = 0; nX < 16; nX++ )
  2232. {
  2233. if( (nX & nSkipMaskHorz) != 0
  2234. || (nY & nSkipMaskVert) != 0
  2235. )
  2236. {
  2237. dc.SetPixel( nX, nY, clrSkip );
  2238. continue;
  2239. }
  2240. COLORREF clr = ( (nY&nColorMaskVert) != 0 )
  2241. ? ( ( (nX&nColorMaskHorz) != 0 ) ? clrEffectiveDarker : clrEffectiveLighter )
  2242. : ( ( (nX&nColorMaskHorz) != 0 ) ? clrEffectiveLighter : clrEffectiveDarker )
  2243. ;
  2244. dc.SetPixel( nX, nY, clr );
  2245. }
  2246. }
  2247. dc.SelectObject( pOldBmp );
  2248. return (HBITMAP)bmp.Detach();
  2249. }
  2250. void CExtPaintManager::stat_PaintGradientRect(
  2251. CDC & dc,
  2252. const CRect & rcPaintGradient,
  2253. COLORREF clrLeft,
  2254. COLORREF clrRight,
  2255. bool bHorz, // = false
  2256. UINT nCountOfSteps // = 256
  2257. )
  2258. {
  2259. if( g_PaintManager.m_pfnMsImgGradientFill != NULL && g_PaintManager.m_bIsWinNT )
  2260. {
  2261. COLORREF clr1 = bHorz ? clrRight : clrLeft;
  2262. COLORREF clr2 = bHorz ? clrLeft : clrRight;
  2263. TRIVERTEX vert[2];
  2264. vert[0].x      = rcPaintGradient.left;
  2265. vert[0].y      = rcPaintGradient.top;
  2266. vert[0].Red    = (COLOR16)(GetRValue(clr1) << 8);
  2267. vert[0].Green  = (COLOR16)(GetGValue(clr1) << 8);
  2268. vert[0].Blue   = (COLOR16)(GetBValue(clr1) << 8);
  2269. vert[0].Alpha  = 0x0000;
  2270. vert[1].x      = rcPaintGradient.right;
  2271. vert[1].y      = rcPaintGradient.bottom; 
  2272. vert[1].Red    = (COLOR16)(GetRValue(clr2) << 8);
  2273. vert[1].Green  = (COLOR16)(GetGValue(clr2) << 8);
  2274. vert[1].Blue   = (COLOR16)(GetBValue(clr2) << 8);
  2275. vert[1].Alpha  = 0x0000;
  2276. GRADIENT_RECT gRect = { 0, 1 };
  2277. g_PaintManager.m_pfnMsImgGradientFill(
  2278. dc, 
  2279. vert, 
  2280. 2, 
  2281. &gRect, 
  2282. 1, 
  2283. (!bHorz) ? GRADIENT_FILL_RECT_H : GRADIENT_FILL_RECT_V
  2284. );
  2285. }
  2286. else
  2287. {
  2288. if( rcPaintGradient.left >= rcPaintGradient.right
  2289. || rcPaintGradient.top >= rcPaintGradient.bottom
  2290. )
  2291. return;
  2292. ASSERT( nCountOfSteps > 0 && nCountOfSteps <= 256 );
  2293. UINT nWidth = rcPaintGradient.Width();
  2294. UINT nHeight = rcPaintGradient.Height();
  2295. if( bHorz )
  2296. {
  2297. if( nCountOfSteps > nHeight )
  2298. nCountOfSteps = nHeight;
  2299. } // if( bHorz )
  2300. else
  2301. {
  2302. if( nCountOfSteps > nWidth )
  2303. nCountOfSteps = nWidth;
  2304. } // else from if( bHorz )
  2305. int nBitsPerPixel = ::GetDeviceCaps( dc.m_hDC, BITSPIXEL );
  2306. if( nBitsPerPixel <= 8 )
  2307. {
  2308. UINT nCalcStepSize = 
  2309. bHorz
  2310. ? nHeight / nCountOfSteps
  2311. : nWidth  / nCountOfSteps
  2312. ;
  2313. static const UINT nLowColorStepMinSize = 4;
  2314. if( nCalcStepSize < nLowColorStepMinSize )
  2315. nCountOfSteps =
  2316. bHorz
  2317. ? nHeight / nLowColorStepMinSize
  2318. : nWidth  / nLowColorStepMinSize
  2319. ;
  2320. } // if( nBitsPerPixel <= 8 )
  2321. CRect rcItem = rcPaintGradient;
  2322. for( UINT nStep = 0, nBackStep = nCountOfSteps;
  2323. nStep < nCountOfSteps;
  2324. nStep++, nBackStep--
  2325. )
  2326. {
  2327. COLORREF clrItem =
  2328. RGB(
  2329. ( GetRValue(clrLeft)*nBackStep
  2330. + GetRValue(clrRight)*nStep
  2331. ) / nCountOfSteps,
  2332. ( GetGValue(clrLeft)*nBackStep
  2333. + GetGValue(clrRight)*nStep
  2334. ) / nCountOfSteps,
  2335. ( GetBValue(clrLeft)*nBackStep
  2336. + GetBValue(clrRight)*nStep
  2337. ) / nCountOfSteps
  2338. );
  2339. if( bHorz )
  2340. {
  2341. rcItem.top =
  2342. rcPaintGradient.bottom -
  2343. MulDiv( nStep, nHeight, nCountOfSteps )
  2344. ;
  2345. rcItem.top--;
  2346. if( nStep == (nCountOfSteps - 1) )
  2347. {
  2348. rcItem.top = rcPaintGradient.top;
  2349. if( rcItem.top > rcItem.bottom )
  2350. break;
  2351. } // if( nStep == (nCountOfSteps - 1) )
  2352. ASSERT( rcItem.Height() >= 1 );
  2353. if( nBitsPerPixel <= 8 )
  2354. {
  2355. CBrush _brushStepRect( clrItem );
  2356. dc.FillRect( rcItem, &_brushStepRect );
  2357. } // if( nBitsPerPixel <= 8 )
  2358. else
  2359. dc.FillSolidRect( rcItem, clrItem );
  2360. rcItem.bottom = rcItem.top;
  2361. } // if( bHorz )
  2362. else
  2363. {
  2364. rcItem.right =
  2365. MulDiv( nStep, nWidth, nCountOfSteps )
  2366. + rcPaintGradient.left
  2367. ;
  2368. rcItem.right++;
  2369. if( nStep == (nCountOfSteps - 1) )
  2370. {
  2371. rcItem.right = rcPaintGradient.right;
  2372. if( rcItem.right < rcItem.left )
  2373. break;
  2374. } // if( nStep == (nCountOfSteps - 1) )
  2375. ASSERT( rcItem.Width() >= 1 );
  2376. if( nBitsPerPixel <= 8 )
  2377. {
  2378. CBrush _brushStepRect( clrItem );
  2379. dc.FillRect( rcItem, &_brushStepRect );
  2380. } // if( nBitsPerPixel <= 8 )
  2381. else
  2382. dc.FillSolidRect( rcItem, clrItem );
  2383. rcItem.left = rcItem.right;
  2384. } // else from if( bHorz )
  2385. }
  2386. }
  2387. }
  2388. #if (!defined __EXT_MFC_NO_TAB_CTRL)
  2389. void CExtPaintManager::stat_PaintTabItemImpl(
  2390. CDC & dc,
  2391. CRect & rcTabItemsArea,
  2392. bool bTopLeft,
  2393. bool bHorz,
  2394. bool bSelected,
  2395. bool bEnabled,
  2396. bool bCenteredText,
  2397. bool bGroupedMode,
  2398. bool bInGroupActive,
  2399. bool bInvertedVerticalMode,
  2400. bool bDrawIcon,
  2401. const CRect & rcEntireItem,
  2402. CSize sizeTextMeasured,
  2403. CFont * pFont,
  2404. __EXT_MFC_SAFE_LPCTSTR sText,
  2405. bool bNoPrefix,
  2406. CExtCmdIcon * pIcon,
  2407. CExtCmdIcon * pIconTabItemCloseButton,
  2408. INT nPaintStateITICB,
  2409. CRect & rcTabItemCloseButton,
  2410. COLORREF clrText,
  2411. COLORREF clrTabBk,
  2412. COLORREF clrTabBorderLT,
  2413. COLORREF clrTabBorderRB,
  2414. COLORREF clrTabSeparator,
  2415. bool bEnableEndEllipsis, // = true
  2416. CObject * pHelperSrc, // = NULL
  2417. bool bDwmMode // = false
  2418. )
  2419. {
  2420. ASSERT( dc.GetSafeHdc() != NULL );
  2421. pHelperSrc;
  2422. rcTabItemsArea;
  2423. sizeTextMeasured;
  2424. bInGroupActive;
  2425. CRect rcItem( rcEntireItem );
  2426. CRect rcTabSel( rcItem );
  2427. if( bGroupedMode )
  2428. {
  2429. CRect rcTabMargin( rcItem );
  2430. rcTabMargin.InflateRect(
  2431. 0,
  2432. 0,
  2433. bHorz ? 1 : 0,
  2434. bHorz ? 0 : 1
  2435. );
  2436. rcTabMargin.InflateRect(
  2437. bHorz ? 0 : 2,
  2438. bHorz ? 2 : 0
  2439. );
  2440. if( clrTabBk != COLORREF(-1L) )
  2441. dc.FillSolidRect(
  2442. &rcTabMargin,
  2443. clrTabBk
  2444. );
  2445. if( clrTabBorderLT != COLORREF(-1L)
  2446. && clrTabBorderRB != COLORREF(-1L)
  2447. )
  2448. dc.Draw3dRect(
  2449. rcTabMargin,
  2450. clrTabBorderLT,
  2451. clrTabBorderRB
  2452. );
  2453. } // if( bGroupedMode )
  2454. else
  2455. {
  2456. if( bSelected )
  2457. {
  2458. rcTabSel.InflateRect(
  2459. bHorz ? __EXTTAB_SEPARATOR_DX : 0,
  2460. bHorz ? 0 : __EXTTAB_SEPARATOR_DY,
  2461. 0,
  2462. 0
  2463. );
  2464. CRect rcSetMargins(
  2465. ( (!bHorz) && (!bTopLeft) ) ? 1 : 0,
  2466. (   bHorz  && (!bTopLeft) ) ? 1 : 0,
  2467. ( (!bHorz) &&   bTopLeft  ) ? 1 : 0,
  2468. (   bHorz  &&   bTopLeft  ) ? 1 : 0
  2469. );
  2470. rcTabSel.InflateRect(
  2471. rcSetMargins.left,
  2472. rcSetMargins.top,
  2473. rcSetMargins.right,
  2474. rcSetMargins.bottom
  2475. );
  2476. if( clrTabBorderLT != COLORREF(-1L)
  2477. && clrTabBorderRB != COLORREF(-1L)
  2478. )
  2479. {
  2480. CPen penTabBorderLT(PS_SOLID,1,clrTabBorderLT);
  2481. CPen penTabBorderRB(PS_SOLID,1,clrTabBorderRB);
  2482. if( bHorz )
  2483. {
  2484. if( bTopLeft )
  2485. {
  2486. CPen * pOldPen = dc.SelectObject( &penTabBorderLT );
  2487. dc.MoveTo( rcTabSel.left, rcTabSel.bottom );
  2488. dc.LineTo( rcTabSel.left, rcTabSel.top );
  2489. dc.LineTo( rcTabSel.right, rcTabSel.top );
  2490. dc.SelectObject( &penTabBorderRB );
  2491. dc.MoveTo( rcTabSel.right-1, rcTabSel.top );
  2492. dc.LineTo( rcTabSel.right-1, rcTabSel.bottom-1 );
  2493. dc.SelectObject( pOldPen );
  2494. }
  2495. else
  2496. {
  2497. CPen * pOldPen = dc.SelectObject( &penTabBorderLT );
  2498. dc.MoveTo( rcTabSel.left, rcTabSel.top-1 );
  2499. dc.LineTo( rcTabSel.left, rcTabSel.bottom );
  2500. dc.SelectObject( &penTabBorderRB );
  2501. dc.MoveTo( rcTabSel.left, rcTabSel.bottom-1 );
  2502. dc.LineTo( rcTabSel.right-1, rcTabSel.bottom-1 );
  2503. dc.LineTo( rcTabSel.right-1, rcTabSel.top-1 );
  2504. dc.SelectObject( pOldPen );
  2505. }
  2506. }
  2507. else
  2508. {
  2509. if( bTopLeft )
  2510. {
  2511. CPen * pOldPen = dc.SelectObject( &penTabBorderLT );
  2512. dc.MoveTo( rcTabSel.right-1, rcTabSel.top );
  2513. dc.LineTo( rcTabSel.left, rcTabSel.top );
  2514. dc.LineTo( rcTabSel.left, rcTabSel.bottom );
  2515. dc.SelectObject( &penTabBorderRB );
  2516. dc.MoveTo( rcTabSel.left, rcTabSel.bottom-1 );
  2517. dc.LineTo( rcTabSel.right-1, rcTabSel.bottom-1 );
  2518. dc.SelectObject( pOldPen );
  2519. }
  2520. else
  2521. {
  2522. CPen * pOldPen = dc.SelectObject( &penTabBorderLT );
  2523. dc.MoveTo( rcTabSel.left, rcTabSel.top );
  2524. dc.LineTo( rcTabSel.right, rcTabSel.top );
  2525. dc.SelectObject( &penTabBorderRB );
  2526. dc.MoveTo( rcTabSel.right-1, rcTabSel.top );
  2527. dc.LineTo( rcTabSel.right-1, rcTabSel.bottom-1 );
  2528. dc.LineTo( rcTabSel.left, rcTabSel.bottom-1 );
  2529. dc.SelectObject( pOldPen );
  2530. }
  2531. }
  2532. }
  2533. rcTabSel.DeflateRect(
  2534. (rcSetMargins.left == 0) ? 1 : 0,
  2535. (rcSetMargins.top == 0) ? 1 : 0,
  2536. (rcSetMargins.right == 0) ? 1 : 0,
  2537. (rcSetMargins.bottom == 0) ? 1 : 0
  2538. );
  2539. if( clrTabBk != COLORREF(-1L) )
  2540. dc.FillSolidRect( &rcTabSel, clrTabBk );
  2541. } // if( bSelected )
  2542. else
  2543. {
  2544. CRect rcSeparator( rcItem );
  2545. if( bHorz )
  2546. {
  2547. rcSeparator.left = rcSeparator.right - 1;
  2548. rcSeparator.DeflateRect( 0, __EXTTAB_SEPARATOR_GAP_HORZ );
  2549. }
  2550. else
  2551. {
  2552. rcSeparator.top = rcSeparator.bottom - 1;
  2553. rcSeparator.DeflateRect( __EXTTAB_SEPARATOR_GAP_VERT, 0 );
  2554. }
  2555. if( clrTabSeparator != COLORREF(-1L) )
  2556. dc.FillSolidRect( &rcSeparator, clrTabSeparator );
  2557. } // else from if( bSelected )
  2558. } // else from if( bGroupedMode )
  2559. rcItem.DeflateRect(
  2560. bHorz ? __EXTTAB_MARGIN_BORDER_HX : __EXTTAB_MARGIN_BORDER_VX,
  2561. bHorz ? __EXTTAB_MARGIN_BORDER_HY : __EXTTAB_MARGIN_BORDER_VY
  2562. );
  2563. CSize _sizeIcon( 0, 0 );
  2564. if( bDrawIcon )
  2565. {
  2566. _sizeIcon = pIcon->GetSize();
  2567. ASSERT( _sizeIcon.cx > 0 && _sizeIcon.cy > 0 );
  2568. } // if( bDrawIcon )
  2569. CExtSafeString sItemText( (sText == NULL) ? _T("") : sText );
  2570. // IMPORTANT:  the rcText calculation fixed by Genka
  2571. CRect rcText(
  2572. rcItem.left
  2573. + ( bHorz
  2574. ? (_sizeIcon.cx +
  2575. ((_sizeIcon.cx > 0) ? __EXTTAB_MARGIN_ICON2TEXT_X : 0)
  2576. )
  2577. : 0
  2578. ),
  2579. rcItem.top
  2580. + ( bHorz
  2581. ? 0
  2582. : (_sizeIcon.cy +
  2583. ((_sizeIcon.cy > 0) ? __EXTTAB_MARGIN_ICON2TEXT_Y : 0)
  2584. )
  2585. ),
  2586. rcItem.right,
  2587. rcItem.bottom
  2588. );
  2589. if( !bHorz )
  2590. {
  2591. if( pIconTabItemCloseButton != NULL )
  2592. rcText.bottom = min( rcText.bottom, rcTabItemCloseButton.top );
  2593. int nWidth0 = rcText.Width();
  2594. int nWidth1 = rcItem.Width() + __EXTTAB_MARGIN_ICON2TEXT_X*2;
  2595. if( nWidth1 > nWidth0 )
  2596. {
  2597. if( bInvertedVerticalMode )
  2598. {
  2599. //rcText.right -= __EXTTAB_MARGIN_ICON2TEXT_X;
  2600. rcText.left = rcText.right - nWidth1;
  2601. } // if( bInvertedVerticalMode )
  2602. else
  2603. {
  2604. //rcText.left += __EXTTAB_MARGIN_ICON2TEXT_X;
  2605. rcText.right = rcText.left + nWidth1;
  2606. } // else from if( bInvertedVerticalMode )
  2607. } // if( nWidth1 > nWidth0 )
  2608. } // if( !bHorz )
  2609. else
  2610. {
  2611. if( pIconTabItemCloseButton != NULL )
  2612. rcText.right = min( rcText.right, rcTabItemCloseButton.left );
  2613. }
  2614. bool bDrawText = ( ( ! sItemText.IsEmpty() ) && rcText.Width() > 0 && rcText.Height() > 0 ) ? true : false;
  2615. if( bDrawIcon )
  2616. {
  2617. INT nIconAlignment = __ALIGN_VERT_TOP;
  2618. if( (!bDrawText) && !( bGroupedMode && (!bInGroupActive) ) )
  2619. {
  2620. if( bCenteredText )
  2621. nIconAlignment = __ALIGN_HORIZ_CENTER|__ALIGN_VERT_CENTER;
  2622. else
  2623. nIconAlignment |= __ALIGN_HORIZ_CENTER;
  2624. }
  2625. if( (bHorz && rcItem.Width() >= _sizeIcon.cx )
  2626. || (!bHorz && rcItem.Height() >= _sizeIcon.cy)
  2627. )
  2628. {
  2629. g_PaintManager->PaintIcon(
  2630. dc,
  2631. bHorz,
  2632. pIcon,
  2633. rcItem,
  2634. false,
  2635. bEnabled,
  2636. false,
  2637. nIconAlignment
  2638. );
  2639. }
  2640. } // if( bDrawIcon )
  2641. if( bDrawText )
  2642. { // if we have sense to paint text on tab item
  2643. ASSERT( pFont != NULL );
  2644. ASSERT( pFont->GetSafeHandle() != NULL );
  2645. COLORREF clrOldText = dc.SetTextColor( clrText );
  2646. INT nOldBkMode = dc.SetBkMode( TRANSPARENT );
  2647. CFont * pOldFont = dc.SelectObject( pFont );
  2648. if( ! bHorz )
  2649. {
  2650. CExtSafeString _sRederedTextV = sItemText;
  2651. if( ! bNoPrefix )
  2652. _sRederedTextV.Replace( _T("&"), _T("") );
  2653. if( bCenteredText )
  2654. {
  2655. UINT nOldTA = dc.SetTextAlign(
  2656. TA_CENTER | TA_BASELINE
  2657. );
  2658. rcText.OffsetRect(
  2659. bInvertedVerticalMode
  2660. ?   sizeTextMeasured.cy/2
  2661. : - sizeTextMeasured.cy/2
  2662. ,
  2663. 0
  2664. );
  2665. CPoint ptCenter = rcText.CenterPoint();
  2666. dc.ExtTextOut(
  2667. ptCenter.x,
  2668. ptCenter.y,
  2669. ETO_CLIPPED,
  2670. &rcText,
  2671. _sRederedTextV,
  2672. _sRederedTextV.GetLength(),
  2673. NULL
  2674. );
  2675. dc.SetTextAlign( nOldTA );
  2676. } // if( bCenteredText )
  2677. else
  2678. {
  2679. UINT nOldTA = dc.SetTextAlign(
  2680. TA_TOP | TA_BASELINE
  2681. );
  2682. rcText.OffsetRect(
  2683. bInvertedVerticalMode
  2684. ?   sizeTextMeasured.cy/2
  2685. : - sizeTextMeasured.cy/2
  2686. ,
  2687. 0
  2688. );
  2689. CPoint ptCenter = rcText.CenterPoint();
  2690. if( bInvertedVerticalMode )
  2691. ptCenter.y =
  2692. rcText.bottom - 4
  2693. - (rcText.Height() - sizeTextMeasured.cx)
  2694. ;
  2695. else
  2696. ptCenter.y =
  2697. rcText.top + 4
  2698. ;
  2699. dc.ExtTextOut(
  2700. ptCenter.x,
  2701. ptCenter.y,
  2702. ETO_CLIPPED,
  2703. &rcText,
  2704. _sRederedTextV,
  2705. _sRederedTextV.GetLength(),
  2706. NULL
  2707. );
  2708. dc.SetTextAlign( nOldTA );
  2709. } // else from if( bCenteredText )
  2710. if( bCenteredText )
  2711. rcText.OffsetRect(
  2712. 0,
  2713. ( rcText.Height() - sizeTextMeasured.cx ) / 2
  2714. );
  2715. if( ! bNoPrefix )
  2716. {
  2717. int nTextLength = sItemText.GetLength();
  2718. int nAmpIndex = bNoPrefix ? (-1) : int( sItemText.Find( _T('&') ) );
  2719. if( nAmpIndex  >= 0 )
  2720. {
  2721. CExtSafeString sBtn =
  2722. sItemText.Left( nAmpIndex )
  2723. + sItemText.Right( nTextLength - ( nAmpIndex + 1 ) );
  2724. static TCHAR stat_strDummyAmpSeq[] = _T("0101");
  2725. sBtn.Replace( _T("&&"), stat_strDummyAmpSeq );
  2726. sBtn.Remove( _T('&') );
  2727. sBtn.Replace( stat_strDummyAmpSeq, _T("&") );
  2728. LOGFONT lf;
  2729. ::memset(&lf,0,sizeof(LOGFONT));
  2730. pFont->GetLogFont( &lf );
  2731. int _cyHorzFont = abs( lf.lfHeight );
  2732. int _cyTextMargin =
  2733. (rcText.Width() - _cyHorzFont)  / 2
  2734. ;
  2735. CPoint ptLineFrom(0,0), ptLineTo(0,0);
  2736. ptLineFrom =
  2737. CPoint(
  2738. __ExtMfc_CXTEXTMARGIN
  2739. + _cyTextMargin,
  2740. __ExtMfc_CYTEXTMARGIN
  2741. + stat_CalcTextWidth(
  2742. dc,
  2743. *pFont,
  2744. sBtn.Left(nAmpIndex)
  2745. )
  2746. );
  2747. ptLineTo =
  2748. CPoint(
  2749. __ExtMfc_CXTEXTMARGIN
  2750. + _cyTextMargin,
  2751. __ExtMfc_CYTEXTMARGIN
  2752. + stat_CalcTextWidth(
  2753. dc,
  2754. *pFont,
  2755. sBtn.Left(nAmpIndex+1)
  2756. )
  2757. );
  2758. int nXOffsPlus =
  2759. rcText.Width()
  2760. - stat_CalcTextDimension(
  2761. dc,
  2762. *pFont,
  2763. sBtn
  2764. ).Height();
  2765. nXOffsPlus /= 2;
  2766. nXOffsPlus -= 4;
  2767. ptLineFrom.x += nXOffsPlus;
  2768. ptLineTo.x   += nXOffsPlus;
  2769. CRect rcString = 
  2770. CRect(
  2771. CPoint(
  2772. rcText.right - _cyTextMargin + __ExtMfc_CXTEXTMARGIN,
  2773. rcText.top + __ExtMfc_CYTEXTMARGIN
  2774. ),
  2775. rcText.Size() //m_sizeHorz
  2776. );
  2777. rcString.DeflateRect( 2, 2 );
  2778. if( bInvertedVerticalMode )
  2779. {
  2780. rcString.OffsetRect( 0, -2 );
  2781. CSize ptFix( -rcString.Width() - 1, 0 );
  2782. ptLineFrom.x += sizeTextMeasured.cy - 2;
  2783. ptLineFrom.y = - ptLineFrom.y + sizeTextMeasured.cx - 4;
  2784. ptLineTo.x += sizeTextMeasured.cy - 2;
  2785. ptLineTo.y = - ptLineTo.y + sizeTextMeasured.cx - 4;
  2786. ptLineFrom += rcString.TopLeft() + ptFix;
  2787. ptLineTo += rcString.TopLeft() + ptFix;
  2788. rcString.OffsetRect(
  2789. - sizeTextMeasured.cy + 3,
  2790. sizeTextMeasured.cx - 3
  2791. );
  2792. }
  2793. else
  2794. {
  2795. rcString.OffsetRect( -2, 0 );
  2796. CSize ptFix( -rcString.Width() + 8, 2 );
  2797. ptLineFrom += rcString.TopLeft() + ptFix;
  2798. ptLineTo += rcString.TopLeft() + ptFix;
  2799. }
  2800. CPen pen(
  2801. PS_SOLID,
  2802. 0,
  2803. dc.GetTextColor()
  2804. );
  2805. CPen * pOldPen = dc.SelectObject( &pen );
  2806. dc.MoveTo( ptLineFrom );
  2807. dc.LineTo( ptLineTo );
  2808. dc.SelectObject( pOldPen );
  2809. } // if( nAmpIndex >= 0 )
  2810. } // if( ! bNoPrefix )
  2811. } // if( ! bHorz )
  2812. else
  2813. {
  2814. UINT nFormat =
  2815. DT_SINGLELINE
  2816. | DT_VCENTER
  2817. | ( bEnableEndEllipsis ? (DT_END_ELLIPSIS) : 0 )
  2818. ;
  2819. INT nTextLen = sItemText.GetLength();
  2820. if( bDwmMode )
  2821. {
  2822. //  DWORD dwOldLayout1 = LAYOUT_LTR, dwOldLayout2 = LAYOUT_LTR;
  2823. //  if( bRTL )
  2824. //  dwOldLayout1 = dc.SetLayout( LAYOUT_RTL );
  2825. // dc.FillSolidRect( &rcText, RGB(0,0,0) );
  2826. //  if( bRTL )
  2827. //  dwOldLayout2 = dc.SetLayout( LAYOUT_RTL );
  2828. CFont * pOldFont = dc.SelectObject( pFont );
  2829. CExtUxTheme::__EXT_UX_DTTOPTS dto = { sizeof(CExtUxTheme::__EXT_UX_DTTOPTS) };
  2830. dto.dwFlags = __EXT_UX_DTT_TEXTCOLOR;
  2831. //static const int g_nDwmGlowSize2007 = 10;
  2832. //dto.iGlowSize = g_nDwmGlowSize2007;
  2833. dto.iGlowSize = 0;
  2834. dto.dwFlags |= __EXT_UX_DTT_COMPOSITED | __EXT_UX_DTT_GLOWSIZE;
  2835. //clrText = 255;
  2836. dto.crText = clrText;
  2837. int nOldBkMode = dc.SetBkMode( TRANSPARENT );
  2838. g_PaintManager.m_UxTheme.DrawThemeTextEx(
  2839. dc.m_hDC,
  2840. 0,
  2841. 0,
  2842. sItemText,
  2843. -1,
  2844. DT_SINGLELINE|DT_CENTER|DT_VCENTER|DT_NOPREFIX,
  2845. rcText,
  2846. &dto
  2847. );
  2848. dc.SetBkMode( nOldBkMode );
  2849. dc.SelectObject( pOldFont );
  2850. // if( bRTL )
  2851. // {
  2852. // dc.SetLayout( dwOldLayout1 );
  2853. // dc.SetLayout( dwOldLayout2 );
  2854. // } // if( bRTL )
  2855. } // if( bDwmMode )
  2856. else
  2857. {
  2858. if( bCenteredText )
  2859. {
  2860. CRect rcMeasure( 0, 0, 0, 0 );
  2861. dc.DrawText(
  2862. LPCTSTR(sItemText),
  2863. nTextLen,
  2864. rcMeasure,
  2865. DT_SINGLELINE|DT_LEFT|DT_TOP|DT_CALCRECT
  2866. );
  2867. INT nMeasuredWidth = rcMeasure.Width();
  2868. INT nTextAreaWidth = rcText.Width();
  2869. if( nTextAreaWidth < nMeasuredWidth )
  2870. bCenteredText = false;
  2871. }
  2872. if( bCenteredText )
  2873. nFormat |= DT_CENTER;
  2874. else
  2875. nFormat |= DT_LEFT;
  2876. if( bNoPrefix )
  2877. nFormat |= DT_NOPREFIX;
  2878. dc.DrawText(
  2879. LPCTSTR(sItemText),
  2880. nTextLen,
  2881. rcText,
  2882. nFormat
  2883. );
  2884. } // else from if( bDwmMode )
  2885. } // else from if( ! bHorz )
  2886. dc.SelectObject( pOldFont );
  2887. dc.SetBkMode( nOldBkMode );
  2888. dc.SetTextColor( clrOldText );
  2889. } // if we have sense to paint text on tab item
  2890. if( pIconTabItemCloseButton != NULL )
  2891. {
  2892. ASSERT( ! pIconTabItemCloseButton->IsEmpty() );
  2893. if( dc.RectVisible( &rcTabItemCloseButton ) )
  2894. pIconTabItemCloseButton->Paint(
  2895. g_PaintManager.GetPM(),
  2896. dc.m_hDC,
  2897. rcTabItemCloseButton,
  2898. (CExtCmdIcon::e_paint_type_t)nPaintStateITICB
  2899. );
  2900. } // if( pIconTabItemCloseButton != NULL )
  2901. }
  2902. void CExtPaintManager::stat_PaintTabClientAreaImpl(
  2903. CDC & dc,
  2904. CRect & rcClient,
  2905. CRect & rcTabItemsArea,
  2906. CRect & rcTabNearBorderArea,
  2907. DWORD dwOrientation,
  2908. bool bGroupedMode,
  2909. COLORREF clrTabItemsAreaBk,
  2910. COLORREF clrTabNearBorderAreaBk,
  2911. COLORREF clrTabNearMargin
  2912. )
  2913. {
  2914. ASSERT( dc.GetSafeHdc() != NULL );
  2915. rcTabItemsArea;
  2916. CRect rcTabNearMargin( rcTabNearBorderArea ); // prepare tab border margin rect
  2917. switch( dwOrientation )
  2918. {
  2919. case __ETWS_ORIENT_TOP:
  2920. rcTabNearMargin.bottom = rcTabNearMargin.top + 1;
  2921. break;
  2922. case __ETWS_ORIENT_BOTTOM:
  2923. rcTabNearMargin.top = rcTabNearMargin.bottom - 1;
  2924. break;
  2925. case __ETWS_ORIENT_LEFT:
  2926. rcTabNearMargin.right = rcTabNearMargin.left + 1;
  2927. break;
  2928. case __ETWS_ORIENT_RIGHT:
  2929. rcTabNearMargin.left = rcTabNearMargin.right - 1;
  2930. break;
  2931. #ifdef _DEBUG
  2932. default:
  2933. ASSERT( FALSE );
  2934. break;
  2935. #endif // _DEBUG
  2936. } // switch( dwOrientation )
  2937. // fill all area with tab items background color
  2938. dc.FillSolidRect(
  2939. &rcClient,
  2940. clrTabItemsAreaBk
  2941. );
  2942. if( !bGroupedMode )
  2943. {
  2944. // fill tab border area
  2945. dc.FillSolidRect(
  2946. &rcTabNearBorderArea,
  2947. clrTabNearBorderAreaBk
  2948. );
  2949. // paint tab border margin
  2950. dc.FillSolidRect(
  2951. &rcTabNearMargin,
  2952. clrTabNearMargin
  2953. );
  2954. } // if( !bGroupedMode )
  2955. }
  2956. void CExtPaintManager::stat_PaintTabButtonImpl(
  2957. CDC & dc,
  2958. CRect & rcButton,
  2959. LONG nHitTest,
  2960. bool bTopLeft,
  2961. bool bHorz,
  2962. bool bEnabled,
  2963. bool bHover,
  2964. bool bPushed,
  2965. bool bGroupedMode,
  2966. COLORREF clrGlyph,
  2967. COLORREF clrTL,
  2968. COLORREF clrBR,
  2969. bool bFlat // = false
  2970. )
  2971. {
  2972. bTopLeft;
  2973. bGroupedMode;
  2974. CExtPaintManager::glyph_t * pGlyph = NULL;
  2975. switch( nHitTest )
  2976. {
  2977. case __ETWH_BUTTON_LEFTUP:
  2978. pGlyph =
  2979. CExtPaintManager::g_DockingCaptionGlyphs[
  2980. bHorz
  2981. ? ( bEnabled
  2982. ? CExtPaintManager::__DCBT_ARROW_LEFT
  2983. : CExtPaintManager::__DCBT_HOLLOW_LEFT
  2984. )
  2985. : ( bEnabled
  2986. ? CExtPaintManager::__DCBT_ARROW_UP
  2987. : CExtPaintManager::__DCBT_HOLLOW_UP
  2988. )
  2989. ];
  2990. ASSERT( pGlyph != NULL );
  2991. break;
  2992. case __ETWH_BUTTON_RIGHTDOWN:
  2993. pGlyph =
  2994. CExtPaintManager::g_DockingCaptionGlyphs[
  2995. bHorz
  2996. ? ( bEnabled
  2997. ? CExtPaintManager::__DCBT_ARROW_RIGHT
  2998. : CExtPaintManager::__DCBT_HOLLOW_RIGHT
  2999. )
  3000. : ( bEnabled
  3001. ? CExtPaintManager::__DCBT_ARROW_DOWN
  3002. : CExtPaintManager::__DCBT_HOLLOW_DOWN
  3003. )
  3004. ];
  3005. ASSERT( pGlyph != NULL );
  3006. break;
  3007. case __ETWH_BUTTON_HELP:
  3008. pGlyph =
  3009. CExtPaintManager::g_DockingCaptionGlyphs[
  3010. CExtPaintManager::__DCBT_WND_CONTEXTHELP
  3011. ];
  3012. ASSERT( pGlyph != NULL );
  3013. break;
  3014. case __ETWH_BUTTON_CLOSE:
  3015. pGlyph =
  3016. CExtPaintManager::g_DockingCaptionGlyphs[
  3017. CExtPaintManager::__DCBT_CLOSE
  3018. ];
  3019. ASSERT( pGlyph != NULL );
  3020. break;
  3021. case __ETWH_BUTTON_TAB_LIST:
  3022. pGlyph =
  3023. CExtPaintManager::g_DockingCaptionGlyphs[
  3024. CExtPaintManager::__DCBT_TABS_LIST_ARROW
  3025. ];
  3026. ASSERT( pGlyph != NULL );
  3027. break;
  3028. case __ETWH_BUTTON_SCROLL_HOME:
  3029. pGlyph =
  3030. CExtPaintManager::g_DockingCaptionGlyphs[
  3031. bHorz
  3032. ? CExtPaintManager::__DCBT_SCROLL_LEFT
  3033. : CExtPaintManager::__DCBT_SCROLL_TOP
  3034. ];
  3035. ASSERT( pGlyph != NULL );
  3036. break;
  3037. case __ETWH_BUTTON_SCROLL_END:
  3038. pGlyph =
  3039. CExtPaintManager::g_DockingCaptionGlyphs[
  3040. bHorz
  3041. ? CExtPaintManager::__DCBT_SCROLL_RIGHT
  3042. : CExtPaintManager::__DCBT_SCROLL_BOTTOM
  3043. ];
  3044. ASSERT( pGlyph != NULL );
  3045. break;
  3046. #ifdef _DEBUG
  3047. default:
  3048. ASSERT( FALSE );
  3049. break;
  3050. #endif // _DEBUG
  3051. } // switch( nHitTest )
  3052. ASSERT( pGlyph != NULL );
  3053. //dc.FillSolidRect( &rcButton, RGB( 255, 128, 128 ) );
  3054. COLORREF ColorValues[2] =
  3055. {
  3056. RGB(0,0,0),
  3057. clrGlyph
  3058. };
  3059. g_PaintManager->PaintGlyphCentered(
  3060. dc,
  3061. rcButton,
  3062. *pGlyph,
  3063. ColorValues
  3064. );
  3065. if( (!bFlat) 
  3066. && (bHover || bPushed) 
  3067. )
  3068. dc.Draw3dRect( &rcButton, clrTL, clrBR );
  3069. }
  3070. #endif // (!defined __EXT_MFC_NO_TAB_CTRL)
  3071. CRect CExtPaintManager::stat_CalcTextDimension(
  3072. CDC & dc,
  3073. CFont & font,
  3074. const CExtSafeString & strText,
  3075. UINT uFlags // = DT_SINGLELINE|DT_LEFT|DT_CALCRECT
  3076. )
  3077. {
  3078. ASSERT( dc.GetSafeHdc() != NULL );
  3079. ASSERT( font.GetSafeHandle() != NULL );
  3080. CRect rcText(0,0,0,0);
  3081. CFont * pOldFont = dc.SelectObject(
  3082. &font
  3083. );
  3084. ASSERT( pOldFont != NULL );
  3085. if( (uFlags&DT_CALCRECT) == 0 )
  3086. uFlags |= DT_CALCRECT;
  3087. if( strText.Find( _T('t') ) != -1 ) // do tabs expanding
  3088. uFlags |= DT_EXPANDTABS;
  3089.  
  3090. dc.DrawText(
  3091. strText,
  3092. strText.GetLength(),
  3093. &rcText,
  3094. uFlags
  3095. );
  3096. dc.SelectObject(pOldFont);
  3097. rcText.OffsetRect( -rcText.TopLeft() );
  3098. return rcText;
  3099. }
  3100. int CExtPaintManager::stat_CalcTextWidth(
  3101. CDC & dc,
  3102. CFont & font,
  3103. const CExtSafeString & strText
  3104. )
  3105. {
  3106. return
  3107. CExtPaintManager::stat_CalcTextDimension(
  3108. dc,
  3109. font,
  3110. strText
  3111. ).Width();
  3112. }
  3113. void CExtPaintManager::stat_PaintDotNet3dRect(
  3114. CDC & dc,
  3115. LPCRECT lpRect,
  3116. COLORREF clrTopLeft,
  3117. COLORREF clrBottomRight
  3118. )
  3119. {
  3120. stat_PaintDotNet3dRect(
  3121. dc,
  3122. lpRect->left,
  3123. lpRect->top,
  3124. lpRect->right - lpRect->left,
  3125. lpRect->bottom - lpRect->top,
  3126. clrTopLeft,
  3127. clrBottomRight
  3128. );
  3129. }
  3130. void CExtPaintManager::stat_PaintDotNet3dRect(
  3131. CDC & dc,
  3132. int x,
  3133. int y,
  3134. int cx,
  3135. int cy,
  3136. COLORREF clrTopLeft,
  3137. COLORREF clrBottomRight
  3138. )
  3139. {
  3140. const int nPixelGap = 1;
  3141. dc.FillSolidRect(
  3142. x + nPixelGap,
  3143. y,
  3144. cx - 1 - nPixelGap,
  3145. 1,
  3146. clrTopLeft
  3147. );
  3148. dc.FillSolidRect(
  3149. x,
  3150. y + nPixelGap,
  3151. 1,
  3152. cy - 1 - nPixelGap,
  3153. clrTopLeft
  3154. );
  3155. dc.FillSolidRect(
  3156. x + cx,
  3157. y + nPixelGap,
  3158. -1,
  3159. cy - nPixelGap*2,
  3160. clrBottomRight
  3161. );
  3162. dc.FillSolidRect(
  3163. x + nPixelGap,
  3164. y + cy,
  3165. cx - nPixelGap*2,
  3166. -1,
  3167. clrBottomRight
  3168. );
  3169. }
  3170. void CExtPaintManager::stat_PaintRadioDot( CDC & dc, int x, int y, COLORREF color )
  3171. {
  3172. CBrush brush,*pOldBrush;
  3173. CPen pen,*pOldPen;
  3174. CRect rcDot(x,y,x+6,y+6);
  3175. COLORREF color2 =
  3176. dc.GetNearestColor(
  3177. RGB(
  3178. 255-GetRValue(color),
  3179. 255-GetGValue(color),
  3180. 255-GetBValue(color)
  3181. )
  3182. );
  3183. rcDot.OffsetRect(1,1);
  3184. brush.CreateSolidBrush(color2);
  3185. pen.CreatePen(PS_SOLID,0,color2);
  3186. pOldBrush=dc.SelectObject(&brush);
  3187. pOldPen=dc.SelectObject(&pen);
  3188. dc.Ellipse(&rcDot);
  3189. pen.DeleteObject();
  3190. brush.DeleteObject();
  3191. rcDot.OffsetRect(-1,-1);
  3192. brush.CreateSolidBrush(color);
  3193. pen.CreatePen(PS_SOLID,0,color);
  3194. dc.SelectObject(&brush);
  3195. dc.SelectObject(&pen);
  3196. dc.Ellipse(&rcDot);
  3197. dc.SelectObject(pOldBrush);
  3198. dc.SelectObject(pOldPen);
  3199. pen.DeleteObject();
  3200. brush.DeleteObject();
  3201. }
  3202. void CExtPaintManager::stat_PaintIndeterminatedSquare( CDC & dc, int x, int y, COLORREF color )
  3203. {
  3204. CBrush brush,*pOldBrush;
  3205. CPen pen,*pOldPen;
  3206. CRect rcSquare(x,y,x+6,y+6);
  3207. COLORREF color2 =
  3208. dc.GetNearestColor(
  3209. RGB(
  3210. 255-GetRValue(color),
  3211. 255-GetGValue(color),
  3212. 255-GetBValue(color)
  3213. )
  3214. );
  3215. rcSquare.OffsetRect(1,1);
  3216. brush.CreateSolidBrush(color2);
  3217. pen.CreatePen(PS_SOLID,0,color2);
  3218. pOldBrush=dc.SelectObject(&brush);
  3219. pOldPen=dc.SelectObject(&pen);
  3220. dc.Rectangle(&rcSquare);
  3221. pen.DeleteObject();
  3222. brush.DeleteObject();
  3223. rcSquare.OffsetRect(-1,-1);
  3224. brush.CreateSolidBrush(color);
  3225. pen.CreatePen(PS_SOLID,0,color);
  3226. dc.SelectObject(&brush);
  3227. dc.SelectObject(&pen);
  3228. dc.Rectangle(&rcSquare);
  3229. dc.SelectObject(pOldBrush);
  3230. dc.SelectObject(pOldPen);
  3231. pen.DeleteObject();
  3232. brush.DeleteObject();
  3233. }
  3234. void CExtPaintManager::stat_PaintCheckMark( CDC & dc, int x, int y, COLORREF color )
  3235. {
  3236. COLORREF color2 =
  3237. dc.GetNearestColor(
  3238. RGB(
  3239. 255-GetRValue(color),
  3240. 255-GetGValue(color),
  3241. 255-GetBValue(color)
  3242. )
  3243. );
  3244.   dc.SetPixel(x,y+2,color);
  3245. dc.SetPixel(x,y+3,color);
  3246. dc.SetPixel(x,y+4,color2);
  3247. dc.SetPixel(x+1,y+3,color);
  3248. dc.SetPixel(x+1,y+4,color);
  3249. dc.SetPixel(x+1,y+5,color2);
  3250. dc.SetPixel(x+2,y+4,color);
  3251. dc.SetPixel(x+2,y+5,color);
  3252. dc.SetPixel(x+2,y+6,color2);
  3253. dc.SetPixel(x+3,y+3,color);
  3254. dc.SetPixel(x+3,y+4,color);
  3255. dc.SetPixel(x+3,y+5,color2);
  3256. dc.SetPixel(x+4,y+2,color);
  3257. dc.SetPixel(x+4,y+3,color);
  3258. dc.SetPixel(x+4,y+4,color2);
  3259. dc.SetPixel(x+5,y+1,color);
  3260. dc.SetPixel(x+5,y+2,color);
  3261. dc.SetPixel(x+5,y+3,color2);
  3262. dc.SetPixel(x+6,y,color);
  3263. dc.SetPixel(x+6,y+1,color);
  3264. dc.SetPixel(x+6,y+2,color2);
  3265. }
  3266. void CExtPaintManager::stat_PaintGradientRect2steps(
  3267. CDC & dc,
  3268. const CRect & rcPaintGradient,
  3269. COLORREF clrLeft,
  3270. COLORREF clrMiddle,
  3271. COLORREF clrRight,
  3272. bool bHorz, // = false
  3273. INT nNumerator, // = 2 
  3274. INT nDenominator, // = 5
  3275. UINT nCountOfSteps // = 256
  3276. )
  3277. {
  3278. ASSERT( dc.GetSafeHdc() != NULL );
  3279. CRect rcPaintGradient1( rcPaintGradient );
  3280. CRect rcPaintGradient2( rcPaintGradient );
  3281. if( bHorz )
  3282. {
  3283. rcPaintGradient1.bottom = 
  3284. rcPaintGradient1.top + ::MulDiv( rcPaintGradient.Height(), nNumerator, nDenominator);
  3285. rcPaintGradient2.top = rcPaintGradient1.bottom;
  3286. }
  3287. else
  3288. {
  3289. rcPaintGradient1.right = 
  3290. rcPaintGradient1.left + ::MulDiv( rcPaintGradient.Width(), nNumerator, nDenominator);
  3291. rcPaintGradient2.left = rcPaintGradient1.right;
  3292. }
  3293. stat_PaintGradientRect( 
  3294. dc, 
  3295. rcPaintGradient1, 
  3296. !bHorz ? clrLeft : clrMiddle, 
  3297. bHorz ? clrLeft : clrMiddle, 
  3298. bHorz,
  3299. nCountOfSteps
  3300.   );
  3301. stat_PaintGradientRect( 
  3302. dc, 
  3303. rcPaintGradient2, 
  3304. bHorz ? clrRight : clrMiddle, 
  3305. !bHorz ? clrRight : clrMiddle, 
  3306. bHorz,
  3307. nCountOfSteps
  3308.   );
  3309. }
  3310. HICON CExtPaintManager::stat_GenerateColorIconBox(
  3311. COLORREF clrIcon
  3312. )
  3313. {
  3314. CWindowDC dc( NULL );
  3315. ICONINFO iiNewIcon;
  3316. iiNewIcon.fIcon = true;
  3317. HDC hIconDC = ::CreateCompatibleDC( dc.GetSafeHdc() );
  3318. HDC hMaskDC = ::CreateCompatibleDC( dc.GetSafeHdc() );
  3319. ASSERT(
  3320. hIconDC != NULL && hMaskDC != NULL
  3321. );
  3322. iiNewIcon.hbmColor =
  3323. ::CreateCompatibleBitmap(
  3324. dc.GetSafeHdc(),
  3325. 16,
  3326. 16
  3327. );
  3328. ASSERT( iiNewIcon.hbmColor != NULL );
  3329. iiNewIcon.hbmMask =
  3330. ::CreateBitmap(
  3331. 16,
  3332. 16,
  3333. 1,
  3334. 1,
  3335. NULL
  3336. );
  3337. ASSERT( iiNewIcon.hbmMask != NULL );
  3338. HGDIOBJ hOldIconDC =
  3339. ::SelectObject(
  3340. hIconDC,
  3341. iiNewIcon.hbmColor
  3342. );
  3343. ASSERT( hOldIconDC != NULL );
  3344. HGDIOBJ hOldMaskDC =
  3345. ::SelectObject(
  3346. hMaskDC,
  3347. iiNewIcon.hbmMask
  3348. );
  3349. ASSERT( hOldMaskDC != NULL );
  3350. HBRUSH hStockWhiteBrush = (HBRUSH)
  3351. ::GetStockObject( WHITE_BRUSH );
  3352. HBRUSH hStockBlackBrush = (HBRUSH)
  3353. ::GetStockObject( BLACK_BRUSH );
  3354. CBrush brColorItem( clrIcon );
  3355. CRect rcColorItem(0,0,16,16);
  3356. ::FillRect(
  3357. hMaskDC,
  3358. &rcColorItem,
  3359. hStockWhiteBrush
  3360. );
  3361. ::FillRect(
  3362. hIconDC,
  3363. &rcColorItem,
  3364. hStockBlackBrush
  3365. );
  3366. //  rcColorItem.DeflateRect( 1, 2 );
  3367. ::FillRect(
  3368. hMaskDC,
  3369. &rcColorItem,
  3370. hStockBlackBrush
  3371. );
  3372. ::FillRect(
  3373. hIconDC,
  3374. &rcColorItem,
  3375. (HBRUSH)brColorItem.GetSafeHandle()
  3376. );
  3377. //  rcColorItem.DeflateRect( 2, 2 );
  3378. //  ::FillRect(
  3379. //  hMaskDC,
  3380. //  &rcColorItem,
  3381. //  hStockWhiteBrush
  3382. //  );
  3383. //  ::FillRect(
  3384. //  hIconDC,
  3385. //  &rcColorItem,
  3386. //  hStockBlackBrush
  3387. //  );
  3388. ::SelectObject(hIconDC,hOldIconDC);
  3389. ::SelectObject(hMaskDC,hOldMaskDC);
  3390. HICON hIcon = ::CreateIconIndirect(&iiNewIcon);
  3391. ASSERT( hIcon != NULL );
  3392. ::DeleteObject(iiNewIcon.hbmColor);
  3393. ::DeleteObject(iiNewIcon.hbmMask);
  3394. ::DeleteDC(hMaskDC);
  3395. ::DeleteDC(hIconDC);
  3396. return hIcon;
  3397. /*
  3398. CWindowDC dc( NULL );
  3399. ICONINFO iiNewIcon;
  3400. ::memset( &iiNewIcon, 0, sizeof(ICONINFO) );
  3401. iiNewIcon.fIcon = true;
  3402. HDC hIconDC = ::CreateCompatibleDC( dc.GetSafeHdc() );
  3403. HDC hMaskDC = ::CreateCompatibleDC( dc.GetSafeHdc() );
  3404. ASSERT(
  3405. hIconDC != NULL && hMaskDC != NULL
  3406. );
  3407. iiNewIcon.hbmColor =
  3408. ::CreateCompatibleBitmap(
  3409. dc.GetSafeHdc(),
  3410. 16,
  3411. 16
  3412. );
  3413. ASSERT( iiNewIcon.hbmColor != NULL );
  3414. iiNewIcon.hbmMask =
  3415. ::CreateBitmap(
  3416. 16,
  3417. 16,
  3418. 1,
  3419. 1,
  3420. NULL
  3421. );
  3422. ASSERT( iiNewIcon.hbmMask != NULL );
  3423. HGDIOBJ hOldIconDC =
  3424. ::SelectObject(
  3425. hIconDC,
  3426. iiNewIcon.hbmColor
  3427. );
  3428. ASSERT( hOldIconDC != NULL );
  3429. HGDIOBJ hOldMaskDC =
  3430. ::SelectObject(
  3431. hMaskDC,
  3432. iiNewIcon.hbmMask
  3433. );
  3434. ASSERT( hOldMaskDC != NULL );
  3435. CRect rcColorItem(0,0,16,16);
  3436. CRect rcColorBox(0,1,16,15);
  3437. ::FillRect(
  3438. hMaskDC,
  3439. &rcColorItem,
  3440. (HBRUSH)::GetStockObject( WHITE_BRUSH )
  3441. );
  3442. ::FillRect(
  3443. hMaskDC,
  3444. &rcColorBox,
  3445. (HBRUSH)::GetStockObject( BLACK_BRUSH )
  3446. );
  3447. CBrush brColorItem( clrIcon );
  3448. ::FillRect(
  3449. hIconDC,
  3450. &rcColorBox,
  3451. (HBRUSH)::GetStockObject( BLACK_BRUSH )
  3452. );
  3453. rcColorBox.DeflateRect( 1, 1, 1, 1 );
  3454. ::FillRect(
  3455. hIconDC,
  3456. &rcColorBox,
  3457. (HBRUSH)brColorItem.GetSafeHandle()
  3458. );
  3459. ::SelectObject(hIconDC,hOldIconDC);
  3460. ::SelectObject(hMaskDC,hOldMaskDC);
  3461. HICON hIcon = ::CreateIconIndirect(&iiNewIcon);
  3462. ASSERT( hIcon != NULL );
  3463. ::DeleteObject(iiNewIcon.hbmColor);
  3464. ::DeleteObject(iiNewIcon.hbmMask);
  3465. ::DeleteDC(hMaskDC);
  3466. ::DeleteDC(hIconDC);
  3467. return hIcon;
  3468. */
  3469. }
  3470. HICON CExtPaintManager::stat_GenerateColorIconFrame(
  3471. COLORREF clrIcon
  3472. )
  3473. {
  3474. CWindowDC dc( NULL );
  3475. ICONINFO iiNewIcon;
  3476. iiNewIcon.fIcon = true;
  3477. HDC hIconDC = ::CreateCompatibleDC( dc.GetSafeHdc() );
  3478. HDC hMaskDC = ::CreateCompatibleDC( dc.GetSafeHdc() );
  3479. ASSERT(
  3480. hIconDC != NULL && hMaskDC != NULL
  3481. );
  3482. iiNewIcon.hbmColor =
  3483. ::CreateCompatibleBitmap(
  3484. dc.GetSafeHdc(),
  3485. 16,
  3486. 16
  3487. );
  3488. ASSERT( iiNewIcon.hbmColor != NULL );
  3489. iiNewIcon.hbmMask =
  3490. ::CreateBitmap(
  3491. 16,
  3492. 16,
  3493. 1,
  3494. 1,
  3495. NULL
  3496. );
  3497. ASSERT( iiNewIcon.hbmMask != NULL );
  3498. HGDIOBJ hOldIconDC =
  3499. ::SelectObject(
  3500. hIconDC,
  3501. iiNewIcon.hbmColor
  3502. );
  3503. ASSERT( hOldIconDC != NULL );
  3504. HGDIOBJ hOldMaskDC =
  3505. ::SelectObject(
  3506. hMaskDC,
  3507. iiNewIcon.hbmMask
  3508. );
  3509. ASSERT( hOldMaskDC != NULL );
  3510. HBRUSH hStockWhiteBrush = (HBRUSH)
  3511. ::GetStockObject( WHITE_BRUSH );
  3512. HBRUSH hStockBlackBrush = (HBRUSH)
  3513. ::GetStockObject( BLACK_BRUSH );
  3514. CBrush brColorItem( clrIcon );
  3515. CRect rcColorItem(0,0,16,16);
  3516. ::FillRect(
  3517. hMaskDC,
  3518. &rcColorItem,
  3519. hStockWhiteBrush
  3520. );
  3521. ::FillRect(
  3522. hIconDC,
  3523. &rcColorItem,
  3524. hStockBlackBrush
  3525. );
  3526. rcColorItem.DeflateRect( 1, 2 );
  3527. ::FillRect(
  3528. hMaskDC,
  3529. &rcColorItem,
  3530. hStockBlackBrush
  3531. );
  3532. ::FillRect(
  3533. hIconDC,
  3534. &rcColorItem,
  3535. (HBRUSH)brColorItem.GetSafeHandle()
  3536. );
  3537. rcColorItem.DeflateRect( 2, 2 );
  3538. ::FillRect(
  3539. hMaskDC,
  3540. &rcColorItem,
  3541. hStockWhiteBrush
  3542. );
  3543. ::FillRect(
  3544. hIconDC,
  3545. &rcColorItem,
  3546. hStockBlackBrush
  3547. );
  3548. ::SelectObject(hIconDC,hOldIconDC);
  3549. ::SelectObject(hMaskDC,hOldMaskDC);
  3550. HICON hIcon = ::CreateIconIndirect(&iiNewIcon);
  3551. ASSERT( hIcon != NULL );
  3552. ::DeleteObject(iiNewIcon.hbmColor);
  3553. ::DeleteObject(iiNewIcon.hbmMask);
  3554. ::DeleteDC(hMaskDC);
  3555. ::DeleteDC(hIconDC);
  3556. return hIcon;
  3557. }
  3558. HICON CExtPaintManager::stat_GenerateColorIconChar(
  3559. COLORREF clrIcon,
  3560. HFONT hFontForLetter,
  3561. __EXT_MFC_SAFE_TCHAR tChr
  3562. )
  3563. {
  3564. ASSERT( tChr != _T('') );
  3565. ASSERT( hFontForLetter != NULL );
  3566. CWindowDC dc( NULL );
  3567. ICONINFO iiNewIcon;
  3568. ::memset( &iiNewIcon, 0, sizeof(ICONINFO) );
  3569. iiNewIcon.fIcon = true;
  3570. HDC hIconDC = ::CreateCompatibleDC( dc.GetSafeHdc() );
  3571. HDC hMaskDC = ::CreateCompatibleDC( dc.GetSafeHdc() );
  3572. ASSERT(
  3573. hIconDC != NULL && hMaskDC != NULL
  3574. );
  3575. iiNewIcon.hbmColor =
  3576. ::CreateCompatibleBitmap(
  3577. dc.GetSafeHdc(),
  3578. 16,
  3579. 16
  3580. );
  3581. ASSERT( iiNewIcon.hbmColor != NULL );
  3582. iiNewIcon.hbmMask =
  3583. ::CreateBitmap(
  3584. 16,
  3585. 16,
  3586. 1,
  3587. 1,
  3588. NULL
  3589. );
  3590. ASSERT( iiNewIcon.hbmMask != NULL );
  3591. HGDIOBJ hOldIconDC =
  3592. ::SelectObject(
  3593. hIconDC,
  3594. iiNewIcon.hbmColor
  3595. );
  3596. ASSERT( hOldIconDC != NULL );
  3597. HGDIOBJ hOldMaskDC =
  3598. ::SelectObject(
  3599. hMaskDC,
  3600. iiNewIcon.hbmMask
  3601. );
  3602. ASSERT( hOldMaskDC != NULL );
  3603. HBRUSH hStockWhiteBrush = (HBRUSH)
  3604. ::GetStockObject( WHITE_BRUSH );
  3605. HBRUSH hStockBlackBrush = (HBRUSH)
  3606. ::GetStockObject( BLACK_BRUSH );
  3607. CRect rcColorItem(0,0,16,16);
  3608. ::FillRect(
  3609. hMaskDC,
  3610. &rcColorItem,
  3611. hStockWhiteBrush
  3612. );
  3613. ::FillRect(
  3614. hIconDC,
  3615. &rcColorItem,
  3616. hStockBlackBrush
  3617. );
  3618. ASSERT( hFontForLetter != NULL );
  3619. HGDIOBJ hOldFontIconDC =
  3620. ::SelectObject( hIconDC, hFontForLetter );
  3621. HGDIOBJ hOldFontMaskDC =
  3622. ::SelectObject( hMaskDC, hFontForLetter );
  3623. CRect rcText( rcColorItem );
  3624. rcText.bottom -= 4;
  3625. CExtSafeString sText( (TCHAR)tChr, 1 );
  3626. ::SetTextColor( hIconDC, RGB(0,0,0) );
  3627. ::SetBkMode( hIconDC, TRANSPARENT );
  3628. ::DrawText(
  3629. hIconDC,
  3630. sText,
  3631. sText.GetLength(),
  3632. &rcText,
  3633. DT_SINGLELINE|DT_CENTER|DT_VCENTER
  3634. );
  3635. ::SetTextColor( hMaskDC, RGB(0,0,0) );
  3636. ::SetBkMode( hMaskDC, TRANSPARENT );
  3637. ::DrawText(
  3638. hMaskDC,
  3639. sText,
  3640. sText.GetLength(),
  3641. &rcText,
  3642. DT_SINGLELINE|DT_CENTER|DT_VCENTER
  3643. );
  3644. ::SelectObject( hIconDC, hOldFontIconDC );
  3645. ::SelectObject( hMaskDC, hOldFontMaskDC );
  3646. CRect rcColorBar( rcText );
  3647. rcColorBar.OffsetRect( 0, rcColorBar.Height() + 1 );
  3648. rcColorBar.bottom = rcColorBar.top + 3;
  3649. rcColorBar.DeflateRect( 2, 0 );
  3650. CBrush brColor( clrIcon );
  3651. ::FillRect(
  3652. hIconDC,
  3653. &rcColorBar,
  3654. (HBRUSH)brColor.GetSafeHandle()
  3655. );
  3656. ::FillRect(
  3657. hMaskDC,
  3658. &rcColorBar,
  3659. hStockBlackBrush
  3660. );
  3661. ::SelectObject(hIconDC,hOldIconDC);
  3662. ::SelectObject(hMaskDC,hOldMaskDC);
  3663. HICON hIcon = ::CreateIconIndirect(&iiNewIcon);
  3664. ASSERT( hIcon != NULL );
  3665. ::DeleteObject(iiNewIcon.hbmColor);
  3666. ::DeleteObject(iiNewIcon.hbmMask);
  3667. ::DeleteDC(hMaskDC);
  3668. ::DeleteDC(hIconDC);
  3669. return hIcon;
  3670. }
  3671. HICON CExtPaintManager::stat_GenerateColorIconChar(
  3672. COLORREF clrIcon,
  3673. HFONT hFontForLetter
  3674. )
  3675. {
  3676. return stat_GenerateColorIconChar( clrIcon, hFontForLetter, _T('A') );
  3677. }
  3678. #if (defined __EXT_PM_BACK_COMPATIBILITY_BITMAP_API)
  3679. HBITMAP CExtPaintManager::stat_ColorizeMonochromeBitmap(
  3680. HBITMAP hBitmapSrc,
  3681. COLORREF clrTransparent,
  3682. COLORREF clrTarget
  3683. )
  3684. {
  3685. if( hBitmapSrc == NULL )
  3686. return NULL;
  3687. HDC hDstDC =
  3688. ::CreateCompatibleDC( NULL );
  3689. if( hDstDC == NULL )
  3690. {
  3691. ASSERT( FALSE );
  3692. return NULL;
  3693. } // if( hDstDC == NULL )
  3694. BITMAP _bmpInfoSrcBmp;
  3695. ::memset(
  3696. &_bmpInfoSrcBmp,
  3697. 0,
  3698. sizeof(BITMAP)
  3699. );
  3700. ::GetObject(
  3701. hBitmapSrc,
  3702. sizeof(BITMAP),
  3703. &_bmpInfoSrcBmp
  3704. );
  3705. BITMAPINFOHEADER _bmpInfoHdr =
  3706. {
  3707. sizeof(BITMAPINFOHEADER),
  3708. _bmpInfoSrcBmp.bmWidth,
  3709. _bmpInfoSrcBmp.bmHeight,
  3710. 1,
  3711. 32,
  3712. BI_RGB,
  3713. 0,
  3714. 0,
  3715. 0,
  3716. 0,
  3717. 0
  3718. };
  3719. LPVOID p32bitColorSurface = NULL; 
  3720. HBITMAP hDstDIB =
  3721. ::CreateDIBSection(
  3722. hDstDC,
  3723. (BITMAPINFO *)&_bmpInfoHdr,
  3724. DIB_RGB_COLORS,
  3725. &p32bitColorSurface,
  3726. NULL,
  3727. 0
  3728. );
  3729. if( hDstDIB == NULL )
  3730. {
  3731. ASSERT( FALSE );
  3732. ::DeleteDC( hDstDC );
  3733. return NULL;
  3734. } // if( hDstDIB == NULL )
  3735. ASSERT( p32bitColorSurface != NULL );
  3736. HBITMAP hOldDst = (HBITMAP)
  3737. ::SelectObject( hDstDC, hDstDIB );
  3738. HDC hSrcDC =
  3739. ::CreateCompatibleDC( hDstDC );
  3740. if( hSrcDC == NULL )
  3741. {
  3742. ASSERT( FALSE );
  3743. ::DeleteObject(
  3744. ::SelectObject(
  3745. hDstDC,
  3746. hOldDst
  3747. )
  3748. );
  3749. ::DeleteDC( hDstDC );
  3750. return NULL;
  3751. } // if( hSrcDC == NULL )
  3752. BITMAP _bmpInfoDstDIB;
  3753. ::memset(
  3754. &_bmpInfoDstDIB,
  3755. 0,
  3756. sizeof(BITMAP)
  3757. );
  3758. ::GetObject(
  3759. hDstDIB,
  3760. sizeof(BITMAP),
  3761. &_bmpInfoDstDIB
  3762. );
  3763. for( ; (_bmpInfoDstDIB.bmWidthBytes % 4) != 0; _bmpInfoDstDIB.bmWidthBytes ++ );
  3764. HBITMAP hOldSrc = (HBITMAP)
  3765. ::SelectObject(
  3766. hSrcDC,
  3767. hBitmapSrc
  3768. );
  3769. ::BitBlt(
  3770. hDstDC,
  3771. 0,
  3772. 0,
  3773. _bmpInfoSrcBmp.bmWidth,
  3774. _bmpInfoSrcBmp.bmHeight,
  3775. hSrcDC,
  3776. 0,
  3777. 0,
  3778. SRCCOPY
  3779. );
  3780. double dHTarget = 0.0, dSTarget = 0.0, dLTarget = 0.0;
  3781. CExtBitmap::stat_RGBtoHSL( clrTarget, &dHTarget, &dSTarget, &dLTarget );
  3782. BYTE * pDstColorSurface =
  3783. (BYTE *)_bmpInfoDstDIB.bmBits
  3784. + (_bmpInfoDstDIB.bmHeight - 1) * _bmpInfoDstDIB.bmWidthBytes;
  3785. for( int nY = 0; nY < _bmpInfoSrcBmp.bmHeight; nY++ )
  3786. {
  3787. for( int nX = 0; nX < _bmpInfoSrcBmp.bmWidth; nX++ )
  3788. {
  3789. LPLONG ptrLinePart = (LPLONG)pDstColorSurface + nX;
  3790. COLORREF clr = (COLORREF)(*ptrLinePart);
  3791. if( clr != clrTransparent )
  3792. {
  3793. double dHPixel = 0.0, dSPixel = 0.0, dLPixel = 0.0;
  3794. CExtBitmap::stat_RGBtoHSL( clr, &dHPixel, &dSPixel, &dLPixel );
  3795. clr = CExtBitmap::stat_HLStoRGB( dHTarget, dLPixel, dSTarget );
  3796. }
  3797. INT nR = GetBValue( clr );
  3798. INT nG = GetGValue( clr );
  3799. INT nB = GetRValue( clr );
  3800. (*ptrLinePart) = RGB( nR, nG, nB );
  3801. } // for( int nX = 0; nX < _bmpInfoSrcBmp.bmWidth; nX++ )
  3802. pDstColorSurface -= _bmpInfoDstDIB.bmWidthBytes;
  3803. } // for( int nY = 0; nY < _bmpInfoSrcBmp.bmHeight; nY++ )
  3804. ::SelectObject(
  3805. hSrcDC,
  3806. hOldSrc
  3807. );
  3808. ::DeleteDC( hSrcDC );
  3809. ::SelectObject(
  3810. hDstDC,
  3811. hOldDst
  3812. );
  3813. ::DeleteDC( hDstDC );
  3814. return hDstDIB;
  3815. }
  3816. HBITMAP CExtPaintManager::stat_HLS_Adjust_Bitmap(
  3817. HBITMAP hBitmapSrc,
  3818. COLORREF clrTransparent, // = RGB(0,0,0)
  3819. COLORREF clrTolerance, // = RGB(0,0,0)
  3820. double percentH, // = 0.0
  3821. double percentL, // = 0.0
  3822. double percentS // = 0.0
  3823. )
  3824. {
  3825. if( hBitmapSrc == NULL )
  3826. return NULL;
  3827. if( percentH == 0.0
  3828. && percentL == 0.0
  3829. && percentS == 0.0
  3830. )
  3831. return NULL;
  3832. HDC hDstDC =
  3833. ::CreateCompatibleDC( NULL );
  3834. if( hDstDC == NULL )
  3835. {
  3836. ASSERT( FALSE );
  3837. return NULL;
  3838. } // if( hDstDC == NULL )
  3839. BITMAP _bmpInfoSrcBmp;
  3840. ::memset(
  3841. &_bmpInfoSrcBmp,
  3842. 0,
  3843. sizeof(BITMAP)
  3844. );
  3845. ::GetObject(
  3846. hBitmapSrc,
  3847. sizeof(BITMAP),
  3848. &_bmpInfoSrcBmp
  3849. );
  3850. BITMAPINFOHEADER _bmpInfoHdr =
  3851. {
  3852. sizeof(BITMAPINFOHEADER),
  3853. _bmpInfoSrcBmp.bmWidth,
  3854. _bmpInfoSrcBmp.bmHeight,
  3855. 1,
  3856. 32,
  3857. BI_RGB,
  3858. 0,
  3859. 0,
  3860. 0,
  3861. 0,
  3862. 0
  3863. };
  3864. LPVOID p32bitColorSurface = NULL; 
  3865. HBITMAP hDstDIB =
  3866. ::CreateDIBSection(
  3867. hDstDC,
  3868. (BITMAPINFO *)&_bmpInfoHdr,
  3869. DIB_RGB_COLORS,
  3870. &p32bitColorSurface,
  3871. NULL,
  3872. 0
  3873. );
  3874. if( hDstDIB == NULL )
  3875. {
  3876. ASSERT( FALSE );
  3877. ::DeleteDC( hDstDC );
  3878. return NULL;
  3879. } // if( hDstDIB == NULL )
  3880. ASSERT( p32bitColorSurface != NULL );
  3881. HBITMAP hOldDst = (HBITMAP)
  3882. ::SelectObject( hDstDC, hDstDIB );
  3883. HDC hSrcDC =
  3884. ::CreateCompatibleDC( hDstDC );
  3885. if( hSrcDC == NULL )
  3886. {