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

界面编程

开发平台:

Visual C++

  1. // This is part of the Professional User Interface Suite library.
  2. // Copyright (C) 2001-2009 FOSS Software, Inc.
  3. // All rights reserved.
  4. //
  5. // http://www.prof-uis.com
  6. // mailto:support@prof-uis.com
  7. //
  8. // This source code can be used, modified and redistributed
  9. // under the terms of the license agreement that is included
  10. // in the Professional User Interface Suite package.
  11. //
  12. // Warranties and Disclaimers:
  13. // THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND
  14. // INCLUDING, BUT NOT LIMITED TO, WARRANTIES OF MERCHANTABILITY,
  15. // FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
  16. // IN NO EVENT WILL FOSS SOFTWARE INC. BE LIABLE FOR ANY DIRECT,
  17. // INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES,
  18. // INCLUDING DAMAGES FOR LOSS OF PROFITS, LOSS OR INACCURACY OF DATA,
  19. // INCURRED BY ANY PERSON FROM SUCH PERSON'S USAGE OF THIS SOFTWARE
  20. // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
  21. #include "StdAfx.h"
  22. #if (defined __PROF_UIS_BUILTIN_MULTIMON_STUB)
  23. #define COMPILE_MULTIMON_STUBS
  24. #endif // __PROF_UIS_BUILTIN_MULTIMON_STUB
  25. // disable warning 4706
  26. #pragma warning( push )
  27. #pragma warning ( disable : 4706 )
  28. #include <multimon.h>
  29. // rollback warning 4706
  30. #pragma warning( pop )
  31. #if _MFC_VER < 0x700
  32. #include <../src/AfxImpl.h>
  33. #else
  34. #include <../src/mfc/AfxImpl.h>
  35. #endif
  36. #if (!defined __EXT_PAINT_MANAGER_H)
  37. #include <ExtPaintManager.h>
  38. #endif
  39. #if (!defined __ExtCmdManager_H)
  40. #include <ExtCmdManager.h>
  41. #endif
  42. #if (!defined __EXT_MEMORY_DC_H)
  43. #include <../Src/ExtMemoryDC.h>
  44. #endif
  45. #if (!defined __EXT_POPUP_MENU_WND_H)
  46. #include <ExtPopupMenuWnd.h>
  47. #endif
  48. #if (!defined __EXT_MENUCONTROLBAR_H)
  49. #include <ExtMenuControlBar.h>
  50. #endif
  51. #if (!defined __EXTDOCKBAR_H)
  52. #include <../Src/ExtDockBar.h>
  53. #endif
  54. #if (!defined __EXT_STATUSCONTROLBAR_H)
  55. #include <ExtStatusControlBar.h>
  56. #endif
  57. #if (!defined __EXT_MFC_NO_TAB_CONTROLBARS)
  58. #if (!defined __EXT_CONTROLBAR_TABBED_FEATURES_H)
  59. #include "ExtControlBarTabbedFeatures.h"
  60. #endif // __EXT_CONTROLBAR_TABBED_FEATURES_H
  61. #endif
  62. #if( !defined __EXTMINIDOCKFRAMEWND_H)
  63. #include "ExtMiniDockFrameWnd.h"
  64. #endif
  65. #if (!defined __EXT_MFC_NO_SHORTCUTLIST_CTRL)
  66. #if (!defined __EXTSHORTCUTLISTWND_H)
  67. #include <ExtShortcutListWnd.h>
  68. #endif
  69. #endif // (!defined __EXT_MFC_NO_SHORTCUTLIST_CTRL)
  70. #if (!defined __EXT_BUTTON_H)
  71. #include <ExtButton.h>
  72. #endif
  73. #if (!defined __EXT_GROUPBOX_H)
  74. #include <ExtGroupBox.h>
  75. #endif
  76. #if (!defined __PROF_UIS_RES_2007_H)
  77. #include <Resources/Res2007/Res2007.h>
  78. #endif
  79. #if (!defined __PROF_UIS_RES_2010_OFFICE_H)
  80. #include <Resources/Res2010office/Res2010office.h>
  81. #endif
  82. #if (!defined __EXT_SCROLLWND_H)
  83. #include <ExtScrollWnd.h>
  84. #endif 
  85. #if (!defined __EXT_MFC_NO_REPORTGRIDWND)
  86. #if (!defined __EXT_REPORT_GRID_WND_H)
  87. #include <ExtReportGridWnd.h>
  88. #endif
  89. #endif 
  90. #if (!defined __EXT_MFC_NO_DATE_PICKER)
  91. #if (!defined __EXT_DATE_PICKER_H)
  92. #include <ExtDatePicker.h>
  93. #endif
  94. #endif 
  95. #if (!defined __EXT_MFC_NO_TOOLBOX_CTRL)
  96. #if (!defined __EXTTOOLBOXWND_H)
  97. #include <ExtToolBoxWnd.h>
  98. #endif
  99. #endif 
  100. #if (!defined __EXT_MFC_NO_RIBBON_BAR)
  101. #if (!defined __EXT_RIBBON_BAR_H)
  102. #include <ExtRibbonBar.h>
  103. #endif // (!defined __EXT_RIBBON_BAR_H)
  104. #endif
  105. #if (!defined __EXT_MFC_NO_BUILTIN_TEXTFIELD)
  106. #if (!defined __EXT_POPUP_CTRL_MENU_H)
  107. #include <ExtPopupCtrlMenu.h>
  108. #endif
  109. #endif
  110. #if (!defined __EXT_MFC_NO_GRIDWND)
  111. #if (!defined __EXT_GRIDWND_H)
  112. #include <ExtGridWnd.h>
  113. #endif 
  114. #endif
  115. #if (!defined __EXT_TEMPL_H)
  116. #include <ExtTempl.h>
  117. #endif
  118. #if (!defined __EXT_SPIN_H)
  119. #include <ExtSpinWnd.h>
  120. #endif
  121. #if (!defined __EXT_MFC_NO_CUSTOMIZE)
  122. #if (!defined __EXTCUSTOMIZE_H)
  123. #include <ExtCustomize.h>
  124. #endif
  125. #endif // (!defined __EXT_MFC_NO_CUSTOMIZE)
  126. #if (!defined __EXT_MFC_NO_DURATIONWND)
  127. #if (!defined __EXT_DURATIONWND_H)
  128. #include "ExtDurationWnd.h"
  129. #endif
  130. #endif
  131. #if (!defined __EXT_MFC_NO_PAGECONTAINER_CTRL)
  132. #if (!defined __EXT_PAGECONTAINERWND_H)
  133. #include <ExtPageContainerWnd.h>
  134. #endif
  135. #endif
  136. #if (!defined __EXT_RESIZABLE_DIALOG_H)
  137. #include <ExtResizableDialog.h>
  138. #endif
  139. #if (!defined __EXT_EDIT_H)
  140. #include <ExtEdit.h>
  141. #endif
  142. #if (!defined __EXT_COMBO_BOX_H)
  143. #include <ExtComboBox.h>
  144. #endif
  145. #if (! defined __VSSYM32_H__)
  146. #include <vssym32/vssym32.h>
  147. #endif // (! defined __VSSYM32_H__)
  148. #include <math.h>
  149. #include <shlwapi.h>
  150. #include <Resources/Resource.h>
  151. #if (! defined CLEARTYPE_QUALITY )
  152. #define CLEARTYPE_QUALITY 5
  153. #endif
  154. #ifdef _DEBUG
  155. #define new DEBUG_NEW
  156. #undef THIS_FILE
  157. static char THIS_FILE[] = __FILE__;
  158. #endif
  159. // VC+ 6.0 static builds specific: disable warnings 4305, 4309
  160. // warning C4305: 'initializing' : truncation from 'int' to 'short'
  161. // warning C4309: 'initializing' : truncation of constant value
  162. #if _MFC_VER < 0x700
  163. #ifdef __EXT_PROFUIS_STATIC_LINK
  164. #pragma warning( push )
  165. #pragma warning ( disable : 4305 )
  166. #pragma warning ( disable : 4309 )
  167. #endif
  168. #endif
  169. IMPLEMENT_SERIAL(  CExtPaintManager,                         CObject,                                  VERSIONABLE_SCHEMA|1 );
  170. IMPLEMENT_SERIAL(  CExtPaintManagerXP,                       CExtPaintManager,                         VERSIONABLE_SCHEMA|1 );
  171. IMPLEMENT_SERIAL(  CExtPaintManagerOffice2003,               CExtPaintManagerXP,                       VERSIONABLE_SCHEMA|1 );
  172. IMPLEMENT_SERIAL(  CExtPaintManagerOffice2003NoThemes,       CExtPaintManagerOffice2003,               VERSIONABLE_SCHEMA|1 );
  173. IMPLEMENT_SERIAL(  CExtPaintManagerStudio2005,               CExtPaintManagerOffice2003,               VERSIONABLE_SCHEMA|1 );
  174. IMPLEMENT_SERIAL(  CExtPaintManagerStudio2008,               CExtPaintManagerStudio2005,               VERSIONABLE_SCHEMA|1 );
  175. IMPLEMENT_SERIAL(  CExtPaintManagerNativeXP,                 CExtPaintManager,                         VERSIONABLE_SCHEMA|1 );
  176. IMPLEMENT_DYNAMIC( CExtPaintManagerOffice2007_Impl,          CExtPaintManagerOffice2003 )
  177. IMPLEMENT_SERIAL(  CExtPaintManagerOffice2007_R1,            CExtPaintManagerOffice2007_Impl,          VERSIONABLE_SCHEMA|1 );
  178. IMPLEMENT_SERIAL(  CExtPaintManagerOffice2007_R2_LunaBlue,   CExtPaintManagerOffice2007_Impl,          VERSIONABLE_SCHEMA|1 );
  179. IMPLEMENT_SERIAL(  CExtPaintManagerOffice2007_R2_Obsidian,   CExtPaintManagerOffice2007_Impl,          VERSIONABLE_SCHEMA|1 );
  180. IMPLEMENT_SERIAL(  CExtPaintManagerOffice2007_R2_Silver,     CExtPaintManagerOffice2007_Impl,          VERSIONABLE_SCHEMA|1 );
  181. IMPLEMENT_SERIAL(  CExtPaintManagerOffice2007_R3_LunaBlue,   CExtPaintManagerOffice2007_R2_LunaBlue,   VERSIONABLE_SCHEMA|1 );
  182. IMPLEMENT_SERIAL(  CExtPaintManagerOffice2007_R3_Obsidian,   CExtPaintManagerOffice2007_R2_Obsidian,   VERSIONABLE_SCHEMA|1 );
  183. IMPLEMENT_SERIAL(  CExtPaintManagerOffice2007_R3_Silver,     CExtPaintManagerOffice2007_R2_Silver,     VERSIONABLE_SCHEMA|1 );
  184. IMPLEMENT_SERIAL(  CExtPaintManagerOffice2007_Blue,          CExtPaintManagerOffice2007_R3_LunaBlue,   VERSIONABLE_SCHEMA|1 );
  185. IMPLEMENT_SERIAL(  CExtPaintManagerOffice2007_Black,         CExtPaintManagerOffice2007_R3_Obsidian,   VERSIONABLE_SCHEMA|1 );
  186. IMPLEMENT_SERIAL(  CExtPaintManagerOffice2007_Silver,        CExtPaintManagerOffice2007_R3_Silver,     VERSIONABLE_SCHEMA|1 );
  187. IMPLEMENT_DYNAMIC( CExtPaintManagerOffice2010_Impl,          CExtPaintManagerOffice2007_Impl )
  188. IMPLEMENT_SERIAL(  CExtPaintManagerOffice2010_R1,            CExtPaintManagerOffice2010_Impl,          VERSIONABLE_SCHEMA|1 );
  189. IMPLEMENT_SERIAL(  CExtPaintManagerOffice2010_R2_Blue,       CExtPaintManagerOffice2010_Impl,          VERSIONABLE_SCHEMA|1 );
  190. IMPLEMENT_SERIAL(  CExtPaintManagerOffice2010_R2_Silver,     CExtPaintManagerOffice2010_Impl,          VERSIONABLE_SCHEMA|1 );
  191. IMPLEMENT_SERIAL(  CExtPaintManagerOffice2010_R2_Black,      CExtPaintManagerOffice2010_Impl,          VERSIONABLE_SCHEMA|1 );
  192. CExtPaintManager::CExtPaintManagerAutoPtr g_PaintManager;
  193. // CExtSWMR::CExtSWMR(
  194. // __EXT_MFC_SAFE_LPCTSTR strName //  = NULL
  195. // )
  196. // : m_bConstructed( false )
  197. // , m_hProtectWriter( NULL )
  198. // , m_hProtectReaders( NULL )
  199. // , m_hEnumReaders( NULL )
  200. // {
  201. // Create( strName );
  202. // }
  203. //
  204. // CExtSWMR::~CExtSWMR()
  205. // {
  206. // Destroy();
  207. // }
  208. //
  209. // LPCTSTR CExtSWMR::stat_GenerateObjectName(
  210. // __EXT_MFC_SAFE_LPCTSTR strPrefix,
  211. // __EXT_MFC_SAFE_LPCTSTR strSuffix,
  212. // __EXT_MFC_SAFE_LPTSTR strOutNameBuffer,
  213. // size_t nBufferSize,
  214. // bool & bConstructed
  215. // )
  216. // {
  217. // bConstructed = true;
  218. // if( strSuffix == NULL )
  219. // return NULL;
  220. // if( strPrefix == NULL )
  221. // strPrefix = _T("");
  222. // size_t nLenPrefix = size_t( _tcslen( strPrefix ) );
  223. // size_t nLenSuffix = size_t( _tcslen( strSuffix ) );
  224. // if( ( nLenPrefix + nLenSuffix ) >= nBufferSize )
  225. // {
  226. // bConstructed = false;
  227. // return NULL;
  228. // }
  229. // __EXT_MFC_STRCPY( strOutNameBuffer, nBufferSize, strPrefix );
  230. // __EXT_MFC_STRCAT( strOutNameBuffer, nBufferSize, strSuffix );
  231. // return strOutNameBuffer;
  232. // }
  233. //
  234. // bool CExtSWMR::Create(
  235. // __EXT_MFC_SAFE_LPCTSTR strName //  = NULL
  236. // )
  237. // {
  238. // Destroy();
  239. // TCHAR strObjectNameBuffer[ 512 ];
  240. // LPCTSTR strObjectName =
  241. // stat_GenerateObjectName(
  242. // _T("~CExtSWMR~ProtectWriter~"),
  243. // strName,
  244. // strObjectNameBuffer,
  245. // sizeof(strObjectNameBuffer)/sizeof(strObjectNameBuffer[0]),
  246. // m_bConstructed
  247. // );
  248. // if( m_bConstructed )
  249. // m_hProtectWriter =
  250. // ::CreateMutex(
  251. // NULL,
  252. // FALSE,
  253. // strObjectName
  254. // );
  255. // strObjectName =
  256. // stat_GenerateObjectName(
  257. // _T("~CExtSWMR~EventsNoReaders~"),
  258. // strName,
  259. // strObjectNameBuffer,
  260. // sizeof(strObjectNameBuffer)/sizeof(strObjectNameBuffer[0]),
  261. // m_bConstructed
  262. // );
  263. // if( m_bConstructed )
  264. // m_hProtectReaders =
  265. // ::CreateEvent(
  266. // NULL,
  267. // TRUE,
  268. // TRUE,
  269. // strObjectName
  270. // );
  271. // strObjectName =
  272. // stat_GenerateObjectName(
  273. // _T("~CExtSWMR~EnumReaders~"),
  274. // strName,
  275. // strObjectNameBuffer,
  276. // sizeof(strObjectNameBuffer)/sizeof(strObjectNameBuffer[0]),
  277. // m_bConstructed
  278. // );
  279. // if( m_bConstructed )
  280. // m_hEnumReaders =
  281. // ::CreateSemaphore(
  282. // NULL,
  283. // 0,
  284. // 0x7FFFFFFF,
  285. // strObjectName
  286. // );
  287. // if( m_hEnumReaders == NULL
  288. // || m_hProtectReaders == NULL
  289. // || m_hProtectWriter == NULL
  290. // )
  291. // {
  292. // Destroy();
  293. // m_bConstructed = false;
  294. // }
  295. // else
  296. // m_bConstructed = true;
  297. // return m_bConstructed;
  298. // }
  299. //
  300. // void CExtSWMR::Destroy()
  301. // {
  302. // if( m_hEnumReaders != NULL ) 
  303. // {
  304. // ::CloseHandle( m_hEnumReaders );
  305. // m_hEnumReaders = NULL;
  306. // }
  307. // if( m_hProtectReaders != NULL ) 
  308. // {
  309. // ::CloseHandle( m_hProtectReaders );
  310. // m_hProtectReaders = NULL;
  311. // }
  312. // if( m_hProtectWriter != NULL )
  313. // {
  314. // ::CloseHandle( m_hProtectWriter );
  315. // m_hProtectWriter = NULL;
  316. // }
  317. // m_bConstructed = false;
  318. // }
  319. //
  320. // bool CExtSWMR::IsConstructed() const
  321. // {
  322. // return m_bConstructed;
  323. // }
  324. //
  325. // CExtSWMR::LockSection::LockSection(
  326. // CExtSWMR & _SWMR,
  327. // bool bRead,
  328. // DWORD dwTimeout // = INFINITE
  329. // )
  330. // : m_SWMR( _SWMR )
  331. // , m_bRead( bRead )
  332. // , m_bLocked( false )
  333. // {
  334. // if( ! m_SWMR.IsConstructed() )
  335. // return;
  336. // DWORD dwWaitResult = WAIT_ABANDONED;
  337. // if( m_bRead )
  338. // dwWaitResult = m_SWMR.WaitToRead( dwTimeout );
  339. // else
  340. // dwWaitResult = m_SWMR.WaitToWrite( dwTimeout );
  341. // m_bLocked = ( dwWaitResult == WAIT_ABANDONED || dwWaitResult == WAIT_TIMEOUT ) ? false : true;
  342. // }
  343. //
  344. // CExtSWMR::LockSection::~LockSection()
  345. // {
  346. // if( ! m_bLocked )
  347. // return;
  348. // if( m_bRead )
  349. // m_SWMR.DoneReading();
  350. // else
  351. // m_SWMR.DoneWriting();
  352. // }
  353. //
  354. // bool CExtSWMR::LockSection::IsLocked() const
  355. // {
  356. // return m_bLocked;
  357. // }
  358. //
  359. // DWORD CExtSWMR::WaitToWrite(
  360. // DWORD dwTimeout // = INFINITE
  361. // )
  362. // {
  363. // HANDLE arrToWait[2];
  364. // arrToWait[0] = m_hProtectWriter;
  365. // arrToWait[1] = m_hProtectReaders;
  366. // DWORD dwWaitResult =
  367. // ::WaitForMultipleObjects(
  368. // 2,
  369. // arrToWait,
  370. // TRUE,
  371. // dwTimeout
  372. // );
  373. // return dwWaitResult;
  374. // }
  375. //
  376. // void CExtSWMR::DoneWriting()
  377. // {
  378. // ::ReleaseMutex( m_hProtectWriter );
  379. // }
  380. //
  381. // DWORD CExtSWMR::WaitToRead(
  382. // DWORD dwTimeout // = INFINITE
  383. // )
  384. // {
  385. // DWORD dwWaitResult =
  386. // ::WaitForSingleObject(
  387. // m_hProtectWriter,
  388. // dwTimeout
  389. // );
  390. // if( dwWaitResult != WAIT_TIMEOUT )
  391. // {
  392. // LONG nPrev = 0;
  393. // ::ReleaseSemaphore(
  394. // m_hEnumReaders,
  395. // 1,
  396. // &nPrev
  397. // );
  398. // if( nPrev == 0)
  399. // ::ResetEvent( m_hProtectReaders );
  400. // } // if( dwWaitResult != WAIT_TIMEOUT )
  401. // ::ReleaseMutex( m_hProtectWriter );
  402. // return dwWaitResult;
  403. // }
  404. //
  405. // void CExtSWMR::DoneReading()
  406. // {
  407. // HANDLE arrToWait[2];
  408. // arrToWait[0] = m_hProtectWriter;
  409. // arrToWait[1] = m_hEnumReaders;
  410. // ::WaitForMultipleObjects(
  411. // 2,
  412. // arrToWait,
  413. // TRUE,
  414. // INFINITE
  415. // );
  416. // DWORD dwWaitResult =
  417. // ::WaitForSingleObject(
  418. // m_hEnumReaders,
  419. // 0
  420. // );
  421. // bool bLast = ( dwWaitResult == WAIT_TIMEOUT ) ? true : false;
  422. // if( bLast )
  423. // ::SetEvent( m_hProtectReaders );
  424. // else
  425. // ::ReleaseSemaphore(
  426. // m_hEnumReaders,
  427. // 1,
  428. // NULL
  429. // );
  430. // ::ReleaseMutex( m_hProtectWriter );
  431. // }
  432. CExtPmSynchronizeSink::CExtPmSynchronizeSink()
  433. : m_bPmSynchronizeSinkIsSynchronizing( false )
  434. , m_dwPmSynchronizeSinkThreadID( ::GetCurrentThreadId() )
  435. {
  436. }
  437. CExtPmSynchronizeSink::~CExtPmSynchronizeSink()
  438. {
  439. }
  440. DWORD CExtPmSynchronizeSink::PmSynchronizeSink_GetThreadID()
  441. {
  442. return m_dwPmSynchronizeSinkThreadID;
  443. }
  444. bool CExtPmSynchronizeSink::PmSynchronizeSink_IsSynchronizing()
  445. {
  446. return m_bPmSynchronizeSinkIsSynchronizing;
  447. }
  448. bool CExtPmSynchronizeSink::PmSynchronizeSink_IsEqual(
  449. CExtPmSynchronizeSink * pOther
  450. )
  451. {
  452. if( this == pOther )
  453. return true;
  454. return false;
  455. }
  456. INT CExtPmSynchronizeSink::GetIndexOfPmSynchronizeSink(
  457. CExtPmSynchronizeSink * pPmSynchronizeSink
  458. )
  459. {
  460. __PROF_UIS_MANAGE_STATE;
  461. if( pPmSynchronizeSink == NULL )
  462. return -1;
  463. INT nIndex, nCount = INT( m_arrPmSynchronizeSink.GetSize() );
  464. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  465. {
  466. CExtPmSynchronizeSink * pRegistered = m_arrPmSynchronizeSink[ nIndex ];
  467. ASSERT( pRegistered != NULL );
  468. if( pRegistered->PmSynchronizeSink_IsEqual( pPmSynchronizeSink ) )
  469. return nIndex;
  470. } // for( nIndex = 0; nIndex < nCount; nIndex ++ )
  471. return -1;
  472. }
  473. bool CExtPaintManager::CExtPaintManagerAutoPtr::PmSynchronizeSink_PerformSynchronizationWith(
  474. CExtPmSynchronizeSink * pPmSynchronizeSink,
  475. bool bRegister, // = true
  476. bool bSynchronizeItNow // = true
  477. )
  478. {
  479. __PROF_UIS_MANAGE_STATE;
  480. if( bRegister )
  481. {
  482. if( pPmSynchronizeSink == NULL )
  483. return false;
  484. if( pPmSynchronizeSink->PmSynchronizeSink_IsEqual( this ) )
  485. return false;
  486. DWORD dwOwnThreadID = PmSynchronizeSink_GetThreadID();
  487. DWORD dwOtherThreadID = PmSynchronizeSink_GetThreadID();
  488. if( dwOwnThreadID != dwOtherThreadID )
  489. return false;
  490. INT nIndex = GetIndexOfPmSynchronizeSink( pPmSynchronizeSink );
  491. if( nIndex < 0 )
  492. m_arrPmSynchronizeSink.Add( pPmSynchronizeSink );
  493. if( bSynchronizeItNow )
  494. {
  495. LPSTREAM pStream = PmSynchronizeSink_GetData();
  496. if( pStream != NULL )
  497. {
  498. pPmSynchronizeSink ->
  499. PmSynchronizeSink_SynchronizeFrom(
  500. pStream
  501. );
  502. pStream->Release();
  503. } // if( pStream != NULL )
  504. } // if( bSynchronizeItNow )
  505. return true;
  506. } // if( bRegister )
  507. else
  508. {
  509. if( pPmSynchronizeSink == NULL )
  510. {
  511. m_arrPmSynchronizeSink.RemoveAll();
  512. return true;
  513. }
  514. INT nIndex = GetIndexOfPmSynchronizeSink( pPmSynchronizeSink );
  515. if( nIndex < 0 )
  516. return false;
  517. m_arrPmSynchronizeSink.RemoveAt( nIndex );
  518. return true;
  519. } // else from if( bRegister )
  520. }
  521. LPSTREAM CExtPaintManager::CExtPaintManagerAutoPtr::PmSynchronizeSink_GetData(
  522. HGLOBAL hGlobal // = NULL
  523. )
  524. {
  525. __PROF_UIS_MANAGE_STATE;
  526. CExtPaintManager * pPM = GetPM();
  527. if( pPM == NULL )
  528. return NULL;
  529. LPSTREAM pStream = NULL;
  530. SCODE sc =
  531. ::CreateStreamOnHGlobal(
  532. hGlobal,
  533. ( hGlobal != NULL ) ? FALSE : TRUE,
  534. &pStream
  535. );
  536. if( sc != S_OK )
  537. {
  538. ASSERT( FALSE );
  539. return NULL;
  540. }
  541. ASSERT( pStream != NULL );
  542. COleStreamFile _file;
  543. try
  544. {
  545. _file.Attach( pStream );
  546. CArchive ar( &_file, CArchive::store|CArchive::bNoFlushOnDelete );
  547. CRuntimeClass * pRTC = pPM->GetRuntimeClass();
  548. ASSERT( pRTC != NULL );
  549. ar.WriteClass( pRTC );
  550. pPM->SerializeSynchronizationData( ar );
  551. ar.Flush();
  552. ULARGE_INTEGER liNewPosition;
  553. LARGE_INTEGER liOff;
  554. LISet32( liOff, 0 );
  555. sc = pStream->Seek( liOff, STREAM_SEEK_SET, &liNewPosition );
  556. if( sc != S_OK )
  557. {
  558. ASSERT( FALSE );
  559. ::AfxThrowUserException();
  560. }
  561. return pStream;
  562. } // try
  563. catch( CException * pException )
  564. {
  565. pException->Delete();
  566. } // catch( CException * pException )
  567. catch( ... )
  568. {
  569. } // catch( ... )
  570. _file.Detach();
  571. pStream->Release();
  572. return NULL;
  573. }
  574. void CExtPaintManager::CExtPaintManagerAutoPtr::PmSynchronizeSink_SynchronizeFrom(
  575. LPSTREAM pStream
  576. )
  577. {
  578. __PROF_UIS_MANAGE_STATE;
  579. if( pStream == NULL )
  580. return;
  581. if( PmSynchronizeSink_IsSynchronizing() )
  582. return;
  583. m_bPmSynchronizeSinkIsSynchronizing = true;
  584. COleStreamFile _file;
  585. _file.Attach( pStream );
  586. try
  587. {
  588. CArchive ar( &_file, CArchive::load|CArchive::bNoFlushOnDelete, 0 );
  589. CRuntimeClass * pRTC = ar.ReadClass();
  590. ASSERT( pRTC != NULL );
  591. CObject * pObj = pRTC->CreateObject();
  592. if( pObj != NULL )
  593. {
  594. ASSERT_VALID( pObj );
  595. CExtPaintManager * pPaintManager =
  596. DYNAMIC_DOWNCAST( CExtPaintManager, pObj );
  597. if( pPaintManager == NULL )
  598. {
  599. ASSERT( FALSE );
  600. delete pObj;
  601. } // if( pPaintManager == NULL )
  602. else
  603. {
  604. pPaintManager->SerializeSynchronizationData( ar );
  605. InstallPaintManager( pPaintManager );
  606. PmSynchronizeSink_SynchronizeOthers();
  607. } // else from if( pPaintManager == NULL )
  608. } // if( pObj != NULL )
  609. } // try
  610. catch( CException * pException )
  611. {
  612. pException->Delete();
  613. } // catch( CException * pException )
  614. catch( ... )
  615. {
  616. } // catch( ... )
  617. _file.Detach();
  618. m_bPmSynchronizeSinkIsSynchronizing = false;
  619. }
  620. void CExtPmSynchronizeSink::PmSynchronizeSink_SynchronizeOthers(
  621. HGLOBAL hGlobal // = NULL
  622. )
  623. {
  624. __PROF_UIS_MANAGE_STATE;
  625. LPSTREAM pStream = PmSynchronizeSink_GetData( hGlobal );
  626. if( pStream == NULL )
  627. return;
  628. ULARGE_INTEGER liNewPosition;
  629. LARGE_INTEGER liOff;
  630. INT nIndex, nCount = INT( m_arrPmSynchronizeSink.GetSize() );
  631. for( nIndex = 0; nIndex < nCount; nIndex ++ )
  632. {
  633. CExtPmSynchronizeSink * pRegistered = m_arrPmSynchronizeSink[ nIndex ];
  634. ASSERT( pRegistered != NULL );
  635. pRegistered->PmSynchronizeSink_SynchronizeFrom( pStream );
  636. LISet32( liOff, 0 );
  637. SCODE sc = pStream->Seek( liOff, STREAM_SEEK_SET, &liNewPosition );
  638. if( sc != S_OK )
  639. {
  640. ASSERT( FALSE );
  641. break;
  642. }
  643. } // for( nIndex = 0; nIndex < nCount; nIndex ++ )
  644. pStream->Release();
  645. }
  646. CExtPaintManager::CExtPaintManagerAutoPtr::CExtPaintManagerAutoPtr()
  647. : m_pPaintManager( NULL )
  648. , m_bHaveScrollLines( false )
  649. , m_uCachedScrollLines( 0 )
  650. , m_bUxValidColorsExtracted( false )
  651. , m_eCurrentTheme( ThemeUnknown )
  652. , m_strOsVer( _T("Unknown") )
  653. , m_bIsWin32s( false )
  654. , m_bIsWin9x( false )
  655. , m_bIsWin95( false )
  656. , m_bIsWin98( false )
  657. , m_bIsWin98orLater( false )
  658. , m_bIsWinNT( false )
  659. , m_bIsWinNT4( false )
  660. , m_bIsWin2000( false )
  661. , m_bIsWinXP( false )
  662. , m_bIsWinNT4orLater( false )
  663. , m_bIsWin2000orLater( false )
  664. , m_bIsWinXPorLater( false )
  665. , m_bIsWinVista( false )
  666. , m_bIsWinVistaOrLater( false )
  667. , m_bIsWin7( false )
  668. , m_bIsWin7OrLater( false )
  669. , m_hDllMsImg( NULL )
  670. , m_hDllUser32( NULL )
  671. , m_pfnMsImgGradientFill( NULL )
  672. , m_pfnMsImgAlphaBlend( NULL )
  673. , m_pfnMsImgTransparentBlt( NULL )
  674. , m_pfnAnimateWindow( NULL )
  675. , m_pfnSetLayeredWindowAttributes( NULL )
  676. , m_pfnUpdateLayeredWindow( NULL )
  677. , m_pfnPrintWindow( NULL )
  678. , m_nLPX( 96 )
  679. , m_nLPY( 96 )
  680. , m_nLPZ( ( m_nLPX + m_nLPY ) / 2 )
  681. , m_bEnableUiScalingX( true )
  682. , m_bEnableUiScalingY( true )
  683. , m_bEnableUiScalingZ( true )
  684. , m_bLayeredHighlighting2005( false )
  685. , m_bAllowWndUpdateSourceDetection( true )
  686. , m_bAutoSkinScrollBars( true )
  687. , m_nInsallPaintManagerCounter( 0 )
  688. , m_nMsgPaintManagerChanged( ::RegisterWindowMessage( _T("CExtPaintManager::CExtPaintManagerAutoPtr::m_nMsgPaintManagerChanged") ) )
  689. {
  690. #ifdef WM_THEMECHANGED
  691. ASSERT( __ExtMfc_WM_THEMECHANGED == WM_THEMECHANGED );
  692. #endif // WM_THEMECHANGED
  693. memset((char *)&m_osVerData,0,sizeof(OSVERSIONINFO));
  694. m_osVerData.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  695. CExtSafeString sTmp( _T("") );
  696. VERIFY( ::GetVersionEx(&m_osVerData) );
  697. switch(m_osVerData.dwPlatformId)
  698. {
  699. case VER_PLATFORM_WIN32s:
  700. m_bIsWin32s = true;
  701. sTmp = _T("Win32s");
  702. break;
  703. case VER_PLATFORM_WIN32_WINDOWS:
  704. {
  705. m_bIsWin9x = true;
  706. m_bIsWin95 =
  707. ( ( m_osVerData.dwMajorVersion == 4 )
  708. && ( m_osVerData.dwMinorVersion == 0 )
  709. );
  710. m_bIsWin98orLater = 
  711. ( ( m_osVerData.dwMajorVersion > 4 )
  712. || ( ( m_osVerData.dwMajorVersion == 4 )
  713. && ( m_osVerData.dwMinorVersion > 0 )
  714. )
  715. );
  716. sTmp = _T("Windows ");
  717. if( m_bIsWin98orLater )
  718. {
  719. if( ( m_osVerData.dwMajorVersion == 4 )
  720. && ( m_osVerData.dwMinorVersion > 0 )
  721. )
  722. {
  723. m_bIsWin98 = true;
  724. sTmp += _T("98");
  725. }
  726. else
  727. sTmp += _T("98 or later");
  728. }
  729. else
  730. {
  731. sTmp += _T("95");
  732. }
  733. }
  734. break;
  735. case VER_PLATFORM_WIN32_NT:
  736. m_bIsWinNT = true;
  737. if( m_osVerData.dwMajorVersion == 6 )
  738. {
  739. if( m_osVerData.dwMinorVersion == 0 )
  740. {
  741. m_bIsWinVista = true;
  742. sTmp = _T("Windows Vista");
  743. }
  744. else
  745. {
  746. m_bIsWin7 = true;
  747. sTmp = _T("Windows 7");
  748. }
  749. }
  750. else if( m_osVerData.dwMajorVersion == 5 )
  751. {
  752. if( m_osVerData.dwMinorVersion == 0 )
  753. {
  754. m_bIsWin2000 = true;
  755. sTmp = _T("Windows 2000");
  756. }
  757. else if( m_osVerData.dwMinorVersion == 1 )
  758. {
  759. m_bIsWinXP = true;
  760. sTmp = _T("Windows XP");
  761. }
  762. }
  763. else if( m_osVerData.dwMajorVersion == 4 )
  764. {
  765. m_bIsWinNT4 = true;
  766. sTmp = _T("Windows NT");
  767. }
  768. else
  769. sTmp = _T("Windows NT");
  770. if( m_osVerData.dwMajorVersion >= 4 )
  771. m_bIsWinNT4orLater = true;
  772. if( m_osVerData.dwMajorVersion >= 5 )
  773. {
  774. m_bIsWin2000orLater = true;
  775. if( ! ( m_osVerData.dwMajorVersion == 5
  776. && m_osVerData.dwMinorVersion == 0
  777. )
  778. )
  779. m_bIsWinXPorLater = true;
  780. if( m_osVerData.dwMajorVersion >= 6 )
  781. {
  782. m_bIsWinVistaOrLater = true;
  783. if( m_osVerData.dwMinorVersion >= 1 )
  784. m_bIsWin7OrLater = true;
  785. }
  786. }
  787. break;
  788. } // switch(m_osVerData.dwPlatformId)
  789. if( ! m_bIsWin2000orLater )
  790. m_bAutoSkinScrollBars = false;
  791. m_strOsVer.Format(
  792. _T("%s v.%lu.%lu (build %lu) %s"),
  793. sTmp,
  794. m_osVerData.dwMajorVersion, 
  795. m_osVerData.dwMinorVersion, 
  796. m_osVerData.dwBuildNumber,
  797. m_osVerData.szCSDVersion
  798. );
  799. // init uxtheme.dll data
  800. InitUserExApi();
  801. // init msimg32.dll data
  802. if( m_bIsWin2000orLater )
  803. {
  804. m_hDllMsImg = ::LoadLibrary(_T("msimg32.dll"));
  805. if( m_hDllMsImg != NULL )
  806. {
  807. m_pfnMsImgGradientFill = (PFNGRADIENTFILL)
  808. ::GetProcAddress(
  809. m_hDllMsImg, 
  810. "GradientFill"
  811. );
  812. m_pfnMsImgAlphaBlend = (PFNALPHABLEND)
  813. ::GetProcAddress(
  814. m_hDllMsImg, 
  815. "AlphaBlend"
  816. );
  817. m_pfnMsImgAlphaDIBBlend = (PFNALPHADIBBLEND)
  818. ::GetProcAddress(
  819. m_hDllMsImg, 
  820. "AlphaDIBBlend"
  821. );
  822. m_pfnMsImgTransparentBlt = (PFNTRANSPARENTBLT)
  823. ::GetProcAddress(
  824. m_hDllMsImg, 
  825. "TransparentBlt"
  826. );
  827. m_pfnMsImgTransparentDIBits = (PFNTRANSPARENTDIBITS)
  828. ::GetProcAddress(
  829. m_hDllMsImg, 
  830. "TransparentDIBits"
  831. );
  832. }
  833. } // if( m_bIsWin2000orLater )
  834. // init user32.dll data
  835. m_hDllUser32 = ::LoadLibrary(_T("user32.dll"));
  836. if( m_hDllUser32 != NULL )
  837. {
  838. m_pfnAnimateWindow = (PFNANIMATEWINDOW)
  839. ::GetProcAddress(
  840. m_hDllUser32, 
  841. "AnimateWindow"
  842. );
  843. m_pfnSetLayeredWindowAttributes = (PFNSETLAYEREDWINDOWATTRIBUTES)
  844. ::GetProcAddress(
  845. m_hDllUser32, 
  846. "SetLayeredWindowAttributes"
  847. );
  848. m_pfnUpdateLayeredWindow = (PFNUPDATELAYEREDWINDOW)
  849. ::GetProcAddress(
  850. m_hDllUser32, 
  851. "UpdateLayeredWindow"
  852. );
  853. m_pfnPrintWindow = (PFNPRINTWINDOW)
  854. ::GetProcAddress(
  855. m_hDllUser32, 
  856. "PrintWindow"
  857. );
  858. BOOL ( WINAPI * pfnSetProcessDPIAware )( VOID ) =
  859. ( BOOL ( WINAPI * )( VOID ) )
  860. ::GetProcAddress(
  861. m_hDllUser32, 
  862. "SetProcessDPIAware"
  863. );
  864. if( pfnSetProcessDPIAware != NULL )
  865. pfnSetProcessDPIAware();
  866. //  VOID ( WINAPI * pfnDisableProcessWindowsGhosting )( VOID ) =
  867. //  ( VOID ( WINAPI * )( VOID ) )
  868. //  ::GetProcAddress(
  869. //  m_hDllUser32, 
  870. //  "DisableProcessWindowsGhosting"
  871. //  );
  872. //  if( pfnDisableProcessWindowsGhosting != NULL )
  873. //  pfnDisableProcessWindowsGhosting();
  874. } // if( m_hDllUser32 != NULL )
  875. //  VERIFY(
  876. //  InitPaintManagerInstance()
  877. //  );
  878. CWindowDC dcDesktop( NULL );
  879. m_nLPX = ::GetDeviceCaps( dcDesktop.m_hDC, LOGPIXELSX );
  880. m_nLPY = ::GetDeviceCaps( dcDesktop.m_hDC, LOGPIXELSY );
  881. m_nLPZ = ( m_nLPX + m_nLPY ) / 2;
  882. if( m_bIsWin2000orLater
  883. && CExtPaintManager::stat_GetBPP() >= 15
  884. && m_pfnUpdateLayeredWindow != NULL
  885. )
  886. m_bLayeredHighlighting2005 = true;
  887. }
  888. void CExtPaintManager::CExtPaintManagerAutoPtr::InitUserExApi()
  889. {
  890. m_bUxValidColorsExtracted = false;
  891. m_eCurrentTheme = ThemeUnknown;
  892. if( m_UxTheme.IsAppThemed() )
  893. {
  894. // theme name
  895. WCHAR pszThemeName[MAX_PATH] = L"";
  896. WCHAR pszColor[MAX_PATH] = L"";
  897. if( m_UxTheme.GetCurrentThemeName(
  898. pszThemeName, 
  899. MAX_PATH, 
  900. pszColor, 
  901. MAX_PATH, 
  902. NULL, 
  903. ) == S_OK
  904. )
  905. {
  906. if( wcsstr( __EXT_MFC_WCSLWR( pszThemeName, wcslen( pszThemeName ) + 1 ), L"luna.msstyles") != 0 )
  907. {
  908. if( wcscmp( __EXT_MFC_WCSLWR( pszColor, wcslen( pszColor ) + 1 ), L"normalcolor") == 0 )
  909. m_eCurrentTheme = ThemeLunaBlue;
  910. else if( wcscmp( __EXT_MFC_WCSLWR( pszColor, wcslen( pszColor ) + 1 ), L"homestead") == 0 )
  911. m_eCurrentTheme = ThemeLunaOlive;
  912. else if( wcscmp( __EXT_MFC_WCSLWR( pszColor, wcslen( pszColor ) + 1 ), L"metallic") == 0 )
  913. m_eCurrentTheme = ThemeLunaSilver;
  914. }
  915. else if( wcsstr( __EXT_MFC_WCSLWR( pszThemeName, wcslen( pszThemeName ) + 1 ), L"royale.msstyles") != 0 )
  916. {
  917. if( wcscmp( __EXT_MFC_WCSLWR( pszColor, wcslen( pszColor ) + 1 ), L"normalcolor") == 0 )
  918. m_eCurrentTheme = ThemeLunaRoyale;
  919. }
  920. }
  921. HWND hWndDesktop = ::GetDesktopWindow();
  922. ASSERT( hWndDesktop != NULL );
  923. if( m_UxTheme.OpenThemeData( hWndDesktop, L"TASKBAND" ) != NULL )
  924. {
  925. if( m_UxTheme.GetThemeColor(TDP_FLASHBUTTON,0,TMT_EDGELIGHTCOLOR,&m_clrUxTaskBandEdgeLightColor) == S_OK
  926. && m_UxTheme.GetThemeColor(TDP_FLASHBUTTON,0,TMT_EDGEHIGHLIGHTCOLOR,&m_clrUxTaskBandEdgeHighLightColor) == S_OK
  927. && m_UxTheme.GetThemeColor(TDP_FLASHBUTTON,0,TMT_EDGESHADOWCOLOR,&m_clrUxTaskBandEdgeShadowColor) == S_OK
  928. && m_UxTheme.GetThemeColor(TDP_FLASHBUTTON,0,TMT_EDGEDKSHADOWCOLOR,&m_clrUxTaskBandEdgeDkShadowColor) == S_OK
  929. && m_UxTheme.GetThemeColor(TDP_FLASHBUTTON,0,TMT_EDGEFILLCOLOR,&m_clrUxTaskBandEdgeFillColor) == S_OK
  930. && m_UxTheme.GetThemeColor(TDP_FLASHBUTTON,0,TMT_FILLCOLORHINT,&m_clrUxTaskBandFillColorHint) == S_OK
  931. && m_UxTheme.GetThemeColor(TDP_FLASHBUTTON,0,TMT_ACCENTCOLORHINT,&m_clrUxTaskBandAccentColorHint) == S_OK
  932. )
  933. m_bUxValidColorsExtracted = true;
  934. m_UxTheme.CloseThemeData();
  935. }
  936. } // if( m_UxTheme.IsAppThemed() )
  937. }
  938. CExtPaintManager::CExtPaintManagerAutoPtr::~CExtPaintManagerAutoPtr()
  939. {
  940. UnadviseAll();
  941. if( m_hDllMsImg != NULL )
  942. ::FreeLibrary( m_hDllMsImg );
  943. if( m_hDllUser32 != NULL )
  944. ::FreeLibrary( m_hDllUser32 );
  945. if( m_pPaintManager != NULL )
  946. delete m_pPaintManager;
  947. m_pPaintManager = NULL;
  948. }
  949. void CExtPaintManager::CExtPaintManagerAutoPtr::Advise(
  950. CExtPmBridge * pPmBridge,
  951. bool bAddTail // = true
  952. )
  953. {
  954. ASSERT( pPmBridge != NULL );
  955. if( bAddTail )
  956. m_listBridges.AddTail( pPmBridge );
  957. else
  958. m_listBridges.AddHead( pPmBridge );
  959. }
  960. void CExtPaintManager::CExtPaintManagerAutoPtr::Unadvise( CExtPmBridge * pPmBridge )
  961. {
  962. ASSERT( pPmBridge != NULL );
  963. POSITION pos = m_listBridges.Find( pPmBridge );
  964. if( pos != NULL )
  965. m_listBridges.RemoveAt( pos );
  966. }
  967. void CExtPaintManager::CExtPaintManagerAutoPtr::UnadviseAll()
  968. {
  969. m_listBridges.RemoveAll();
  970. }
  971. bool CExtPaintManager::CExtPaintManagerAutoPtr::InitPaintManagerInstance()
  972. {
  973. if( m_pPaintManager != NULL )
  974. return true;
  975. return
  976. InstallPaintManager(
  977. (CExtPaintManager *)NULL
  978. );
  979. }
  980. CExtPaintManager * CExtPaintManager::CExtPaintManagerAutoPtr::GetPM()
  981. {
  982. InitPaintManagerInstance();
  983. ASSERT( m_pPaintManager != NULL );
  984. return m_pPaintManager;
  985. }
  986. CExtPaintManager *
  987. CExtPaintManager::CExtPaintManagerAutoPtr::
  988. operator -> ()
  989. {
  990. return GetPM();
  991. }
  992. bool CExtPaintManager::CExtPaintManagerAutoPtr::
  993. InstallPaintManager(
  994. CExtPaintManager * pPaintManager
  995. )
  996. {
  997. ASSERT( m_nInsallPaintManagerCounter >= 0 );
  998. if( m_nInsallPaintManagerCounter != 0 )
  999. return false;
  1000. if( m_pPaintManager != NULL )
  1001. {
  1002. if( pPaintManager == m_pPaintManager )
  1003. return true;
  1004. if( m_pPaintManager != NULL )
  1005. {
  1006. delete m_pPaintManager;
  1007. m_pPaintManager = NULL;
  1008. }
  1009. } // if( m_pPaintManager != NULL )
  1010. if( pPaintManager != NULL )
  1011. m_pPaintManager = pPaintManager;
  1012. else
  1013. {
  1014. try
  1015. {
  1016. m_pPaintManager = new __DEFAULT_PAINT_MANAGER_CLASS;
  1017. }
  1018. catch( CException * pException )
  1019. {
  1020. pException->Delete();
  1021. }
  1022. catch( ... )
  1023. {
  1024. }
  1025. if( m_pPaintManager == NULL )
  1026. return false;
  1027. }
  1028. m_nInsallPaintManagerCounter ++;
  1029. m_pPaintManager->SyncSysColors();
  1030. m_pPaintManager->InitTranslatedColors();
  1031. m_pPaintManager->InitHelperBrushes();
  1032. g_CmdManager.OnGlobalPaintManagerChanged();
  1033. POSITION pos = m_listBridges.GetHeadPosition();
  1034. for( ; pos != NULL; )
  1035. {
  1036. CExtPmBridge * pPmBridge = m_listBridges.GetNext( pos );
  1037. ASSERT( pPmBridge != NULL );
  1038. pPmBridge->PmBridge_OnPaintManagerChanged(
  1039. m_pPaintManager
  1040. );
  1041. } // for( ; pos != NULL; )
  1042. PmSynchronizeSink_SynchronizeOthers();
  1043. m_nInsallPaintManagerCounter --;
  1044. return true;
  1045. }
  1046. bool CExtPaintManager::CExtPaintManagerAutoPtr::
  1047. InstallPaintManager(
  1048. CRuntimeClass * pRtcPaintManager
  1049. )
  1050. {
  1051. if( pRtcPaintManager == NULL )
  1052. return InitPaintManagerInstance();
  1053. CObject* pObj = pRtcPaintManager->CreateObject();
  1054. if( pObj == NULL )
  1055. {
  1056. ASSERT( FALSE );
  1057. return false;
  1058. }
  1059. ASSERT_VALID( pObj );
  1060. CExtPaintManager * pPaintManager =
  1061. DYNAMIC_DOWNCAST( CExtPaintManager, pObj );
  1062. if( pPaintManager == NULL )
  1063. {
  1064. delete pObj;
  1065. ASSERT( FALSE );
  1066. return false;
  1067. }
  1068. return InstallPaintManager( pPaintManager );
  1069. }
  1070. bool CExtPaintManager::CExtPaintManagerAutoPtr::PaintManagerStateLoad(
  1071. __EXT_MFC_SAFE_LPCTSTR sSectionNameCompany, // under HKEY_CURRENT_USERSoftware
  1072. __EXT_MFC_SAFE_LPCTSTR sSectionNameProduct, // under HKEY_CURRENT_USERSoftware%sSectionNameCompany%
  1073. __EXT_MFC_SAFE_LPCTSTR sSectionNameProfile, // under HKEY_CURRENT_USERSoftware%sSectionNameCompany%%sSectionNameProfile%
  1074. HKEY hKeyRoot, // = HKEY_CURRENT_USER
  1075. bool bEnableThrowExceptions // = false
  1076. )
  1077. {
  1078. ASSERT( sSectionNameCompany != NULL );
  1079. ASSERT( sSectionNameProduct != NULL );
  1080. ASSERT( sSectionNameProfile != NULL );
  1081. bool bRetVal = false;
  1082. try
  1083. {
  1084. CExtSafeString sRegKeyPath =
  1085. CExtCmdManager::GetSubSystemRegKeyPath(
  1086. __PROF_UIS_REG_PAINT_MANAGER,
  1087. sSectionNameProfile,
  1088. sSectionNameCompany,
  1089. sSectionNameProduct
  1090. );
  1091. CMemFile _file;
  1092. if( ! CExtCmdManager::FileObjFromRegistry(
  1093. _file,
  1094. LPCTSTR(sRegKeyPath),
  1095. hKeyRoot,
  1096. bEnableThrowExceptions
  1097. )
  1098. )
  1099. {
  1100. ASSERT( ! bEnableThrowExceptions );
  1101. return false;
  1102. }
  1103. CArchive ar(
  1104. &_file,
  1105. CArchive::load
  1106. );
  1107. bRetVal = 
  1108. PaintManagerStateSerialize(
  1109. ar,
  1110. bEnableThrowExceptions
  1111. );
  1112. ar.Close();
  1113. ASSERT( bRetVal || (! bEnableThrowExceptions ) );
  1114. }
  1115. catch( CException * pXept )
  1116. {
  1117. if( bEnableThrowExceptions )
  1118. throw;
  1119. pXept->Delete();
  1120. }
  1121. catch( ... )
  1122. {
  1123. if( bEnableThrowExceptions )
  1124. throw;
  1125. }
  1126. return bRetVal;
  1127. }
  1128. bool CExtPaintManager::CExtPaintManagerAutoPtr::PaintManagerStateSave(
  1129. __EXT_MFC_SAFE_LPCTSTR sSectionNameCompany, // under HKEY_CURRENT_USERSoftware
  1130. __EXT_MFC_SAFE_LPCTSTR sSectionNameProduct, // under HKEY_CURRENT_USERSoftware%sSectionNameCompany%
  1131. __EXT_MFC_SAFE_LPCTSTR sSectionNameProfile, // under HKEY_CURRENT_USERSoftware%sSectionNameCompany%%sSectionNameProfile%%sSectionNameProfile%
  1132. HKEY hKeyRoot, // = HKEY_CURRENT_USER
  1133. bool bEnableThrowExceptions // = false
  1134. )
  1135. {
  1136. ASSERT( sSectionNameCompany != NULL );
  1137. ASSERT( sSectionNameProduct != NULL );
  1138. ASSERT( sSectionNameProfile != NULL );
  1139. bool bRetVal = false;
  1140. try
  1141. {
  1142. CExtSafeString sRegKeyPath =
  1143. CExtCmdManager::GetSubSystemRegKeyPath(
  1144. __PROF_UIS_REG_PAINT_MANAGER,
  1145. sSectionNameProfile,
  1146. sSectionNameCompany,
  1147. sSectionNameProduct
  1148. );
  1149. CMemFile _file;
  1150. CArchive ar(
  1151. &_file,
  1152. CArchive::store
  1153. );
  1154. bRetVal = 
  1155. PaintManagerStateSerialize(
  1156. ar,
  1157. bEnableThrowExceptions
  1158. );
  1159. ASSERT( bRetVal || (! bEnableThrowExceptions ) );
  1160. if( ! bRetVal )
  1161. return false;
  1162. ar.Flush();
  1163. ar.Close();
  1164. bRetVal =
  1165. CExtCmdManager::FileObjToRegistry(
  1166. _file,
  1167. sRegKeyPath,
  1168. hKeyRoot,
  1169. bEnableThrowExceptions
  1170. );
  1171. ASSERT( bRetVal || (! bEnableThrowExceptions ) );
  1172. }
  1173. catch( CException * pXept )
  1174. {
  1175. if( bEnableThrowExceptions )
  1176. throw;
  1177. pXept->Delete();
  1178. }
  1179. catch( ... )
  1180. {
  1181. if( bEnableThrowExceptions )
  1182. throw;
  1183. }
  1184. return bRetVal;
  1185. }
  1186. bool CExtPaintManager::CExtPaintManagerAutoPtr::PaintManagerStateSerialize(
  1187. CArchive & ar,
  1188. bool bEnableThrowExceptions // = false
  1189. )
  1190. {
  1191. try
  1192. {
  1193. DWORD dwGeneralFlags = 0;
  1194. DWORD dwReserved = 0L;
  1195. if( ar.IsStoring() )
  1196. {
  1197. ar << dwGeneralFlags;
  1198. ar << dwReserved;
  1199. ar << dwReserved;
  1200. ar << dwReserved;
  1201. ar << dwReserved;
  1202. CExtPaintManager * pPM = g_PaintManager.GetPM();
  1203. CRuntimeClass * pRTC = pPM->GetRuntimeClass();
  1204. ASSERT( pRTC != NULL );
  1205. ar.WriteClass( pRTC );
  1206. pPM->OnStateSerialize(
  1207. ar,
  1208. bEnableThrowExceptions
  1209. );
  1210. } // if( ar.IsStoring() )
  1211. else
  1212. {
  1213. ar >> dwGeneralFlags;
  1214. ar >> dwReserved;
  1215. ar >> dwReserved;
  1216. ar >> dwReserved;
  1217. ar >> dwReserved;
  1218. CRuntimeClass * pRTC = ar.ReadClass();
  1219. ASSERT( pRTC != NULL );
  1220. CExtPaintManager * pPM = 
  1221. STATIC_DOWNCAST( CExtPaintManager, pRTC->CreateObject() );
  1222. ASSERT_VALID( pPM );
  1223. ASSERT_KINDOF( CExtPaintManager, pPM );
  1224. pPM->OnStateSerialize(
  1225. ar,
  1226. bEnableThrowExceptions
  1227. );
  1228. InstallPaintManager( pPM );
  1229. } // else from if( ar.IsStoring() )
  1230. dwGeneralFlags;
  1231. dwReserved;
  1232. return true;
  1233. }
  1234. catch( CException * pXept )
  1235. {
  1236. if( bEnableThrowExceptions )
  1237. throw;
  1238. pXept->Delete();
  1239. }
  1240. catch( ... )
  1241. {
  1242. if( bEnableThrowExceptions )
  1243. throw;
  1244. }
  1245. return false;
  1246. }
  1247. UINT CExtPaintManager::CExtPaintManagerAutoPtr::GetMouseWheelScrollLines()
  1248. {
  1249. if( m_bHaveScrollLines )
  1250. return m_uCachedScrollLines;
  1251. m_bHaveScrollLines = true;
  1252. m_uCachedScrollLines = 3;
  1253. #if _MFC_VER < 0x700
  1254. if( ! afxData.bWin4 )
  1255. {
  1256. HKEY hKey;
  1257. if( ::RegOpenKeyEx(
  1258. HKEY_CURRENT_USER,
  1259. _T("Control Panel\Desktop"),
  1260. 0,
  1261. KEY_QUERY_VALUE, &hKey) == ERROR_SUCCESS
  1262. )
  1263. {
  1264. TCHAR szData[256];
  1265. DWORD dwKeyDataType;
  1266. DWORD dwDataBufSize = _countof(szData);
  1267. if( RegQueryValueEx(
  1268. hKey,
  1269. _T("WheelScrollLines"),
  1270. NULL,
  1271. &dwKeyDataType,
  1272. (LPBYTE) &szData,
  1273. &dwDataBufSize
  1274. ) == ERROR_SUCCESS
  1275. )
  1276. {
  1277. m_uCachedScrollLines =
  1278. _tcstoul( szData, NULL, 10 );
  1279. }
  1280. RegCloseKey(hKey);
  1281. }
  1282. }
  1283. else
  1284. #endif // _MFC_VER < 0x700
  1285. if( ! m_bIsWin95 )
  1286. ::SystemParametersInfo(
  1287. SPI_GETWHEELSCROLLLINES,
  1288. 0,
  1289. &m_uCachedScrollLines,
  1290. 0
  1291. );
  1292. if( m_uCachedScrollLines < 2 )
  1293. m_uCachedScrollLines = 2;
  1294. return m_uCachedScrollLines;
  1295. }
  1296. bool CExtPaintManager::CExtPaintManagerAutoPtr::IsWndUpdateSource(
  1297. CWnd * pWndNotifySrc
  1298. )
  1299. {
  1300. ASSERT_VALID( pWndNotifySrc );
  1301. ASSERT( pWndNotifySrc->GetSafeHwnd() != NULL && ::IsWindow(pWndNotifySrc->GetSafeHwnd()) );
  1302. ASSERT( m_pPaintManager != NULL );
  1303. if( ! m_bAllowWndUpdateSourceDetection )
  1304. return false;
  1305. #ifndef __EXT_MFC_NO_STATUSBAR
  1306. if( pWndNotifySrc->IsKindOf(RUNTIME_CLASS(CExtStatusControlBar)) )
  1307. return true;
  1308. #endif // __EXT_MFC_NO_STATUSBAR
  1309. CFrameWnd * pFrame = DYNAMIC_DOWNCAST( CFrameWnd, pWndNotifySrc );
  1310. if( pFrame == NULL )
  1311. pFrame = pWndNotifySrc->GetParentFrame();
  1312. if( pFrame == NULL )
  1313. return true;
  1314. if( pFrame->IsKindOf(RUNTIME_CLASS(CExtMiniDockFrameWnd)) )
  1315. pFrame = pFrame->GetParentFrame();
  1316. if( pFrame == NULL
  1317. || pFrame->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd))
  1318. )
  1319. return true;
  1320. CWnd * pWnd = pFrame->GetControlBar( AFX_IDW_STATUS_BAR );
  1321. #ifndef __EXT_MFC_NO_STATUSBAR
  1322. if( pWnd != NULL
  1323. && pWnd->IsKindOf(RUNTIME_CLASS(CExtStatusControlBar))
  1324. )
  1325. {
  1326. if( pWnd == pWndNotifySrc )
  1327. return true;
  1328. return false;
  1329. }
  1330. #endif // __EXT_MFC_NO_STATUSBAR
  1331. pWnd = pFrame->GetControlBar( AFX_IDW_DOCKBAR_TOP );
  1332. if( pWnd != NULL
  1333. && pWnd->IsKindOf(RUNTIME_CLASS(CExtDockOuterBar))
  1334. )
  1335. {
  1336. if( pWnd == pWndNotifySrc )
  1337. return true;
  1338. return false;
  1339. }
  1340. pWnd = pFrame->GetControlBar( AFX_IDW_DOCKBAR_BOTTOM );
  1341. if( pWnd != NULL
  1342. && pWnd->IsKindOf(RUNTIME_CLASS(CExtDockOuterBar))
  1343. )
  1344. {
  1345. if( pWnd == pWndNotifySrc )
  1346. return true;
  1347. return false;
  1348. }
  1349. pWnd = pFrame->GetControlBar( AFX_IDW_DOCKBAR_LEFT );
  1350. if( pWnd != NULL
  1351. && pWnd->IsKindOf(RUNTIME_CLASS(CExtDockOuterBar))
  1352. )
  1353. {
  1354. if( pWnd == pWndNotifySrc )
  1355. return true;
  1356. return false;
  1357. }
  1358. pWnd = pFrame->GetControlBar( AFX_IDW_DOCKBAR_RIGHT );
  1359. if( pWnd != NULL
  1360. && pWnd->IsKindOf(RUNTIME_CLASS(CExtDockOuterBar))
  1361. )
  1362. {
  1363. if( pWnd == pWndNotifySrc )
  1364. return true;
  1365. return false;
  1366. }
  1367. #if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  1368. for( pWnd = pFrame->GetWindow(GW_CHILD);
  1369. pWnd != NULL;
  1370. pWnd = pWnd->GetWindow(GW_HWNDNEXT)
  1371. )
  1372. {
  1373. CExtTabWnd * pExtTabWnd = DYNAMIC_DOWNCAST( CExtTabMdiWnd, pWnd );
  1374. if( pExtTabWnd != NULL
  1375. && pExtTabWnd->_IsMdiTabCtrl()
  1376. )
  1377. {
  1378. if( pWnd == pWndNotifySrc )
  1379. return true;
  1380. return false;
  1381. }
  1382. }
  1383. #endif // if (!defined __EXT_MFC_NO_TABMDI_CTRL)
  1384. return true;
  1385. }
  1386. void CExtPaintManager::CExtPaintManagerAutoPtr::OnSysColorChange(
  1387. CWnd * pWndNotifySrc
  1388. )
  1389. {
  1390. ASSERT_VALID( pWndNotifySrc );
  1391. ASSERT( pWndNotifySrc->GetSafeHwnd() != NULL && ::IsWindow(pWndNotifySrc->GetSafeHwnd()) );
  1392. ASSERT( m_pPaintManager != NULL );
  1393. if( ! IsWndUpdateSource( pWndNotifySrc ) )
  1394. return;
  1395. m_pPaintManager->OnSysColorChange();
  1396. POSITION pos = m_listBridges.GetHeadPosition();
  1397. for( ; pos != NULL; )
  1398. {
  1399. CExtPmBridge * pPmBridge = m_listBridges.GetNext( pos );
  1400. ASSERT( pPmBridge != NULL );
  1401. pPmBridge->PmBridge_OnSysColorChange(
  1402. m_pPaintManager,
  1403. pWndNotifySrc
  1404. );
  1405. } // for( ; pos != NULL; )
  1406. }
  1407. void CExtPaintManager::CExtPaintManagerAutoPtr::OnSettingChange(
  1408. CWnd * pWndNotifySrc,
  1409. UINT uFlags,
  1410. __EXT_MFC_SAFE_LPCTSTR lpszSection
  1411. )
  1412. {
  1413. ASSERT_VALID( pWndNotifySrc );
  1414. ASSERT( pWndNotifySrc->GetSafeHwnd() != NULL && ::IsWindow(pWndNotifySrc->GetSafeHwnd()) );
  1415. ASSERT( m_pPaintManager != NULL );
  1416. if( ! IsWndUpdateSource( pWndNotifySrc ) )
  1417. return;
  1418. if( m_bIsWin2000orLater
  1419. && CExtPaintManager::stat_GetBPP() >= 15
  1420. && m_pfnUpdateLayeredWindow != NULL
  1421. )
  1422. m_bLayeredHighlighting2005 = true;
  1423. m_bHaveScrollLines = false;
  1424. m_pPaintManager->OnSettingChange( uFlags, lpszSection );
  1425. POSITION pos = m_listBridges.GetHeadPosition();
  1426. for( ; pos != NULL; )
  1427. {
  1428. CExtPmBridge * pPmBridge = m_listBridges.GetNext( pos );
  1429. ASSERT( pPmBridge != NULL );
  1430. pPmBridge->PmBridge_OnSettingChange(
  1431. m_pPaintManager,
  1432. pWndNotifySrc,
  1433. uFlags,
  1434. lpszSection
  1435. );
  1436. } // for( ; pos != NULL; )
  1437. }
  1438. void CExtPaintManager::CExtPaintManagerAutoPtr::OnDisplayChange(
  1439. CWnd * pWndNotifySrc,
  1440. INT nDepthBPP,
  1441. CPoint ptSizes
  1442. )
  1443. {
  1444. ASSERT_VALID( pWndNotifySrc );
  1445. ASSERT( pWndNotifySrc->GetSafeHwnd() != NULL && ::IsWindow(pWndNotifySrc->GetSafeHwnd()) );
  1446. ASSERT( m_pPaintManager != NULL );
  1447. if( ! IsWndUpdateSource( pWndNotifySrc ) )
  1448. return;
  1449. if( m_bIsWin2000orLater
  1450. && CExtPaintManager::stat_GetBPP() >= 15
  1451. && m_pfnUpdateLayeredWindow != NULL
  1452. )
  1453. m_bLayeredHighlighting2005 = true;
  1454. m_bHaveScrollLines = false;
  1455. m_pPaintManager->OnDisplayChange( nDepthBPP, ptSizes );
  1456. POSITION pos = m_listBridges.GetHeadPosition();
  1457. for( ; pos != NULL; )
  1458. {
  1459. CExtPmBridge * pPmBridge = m_listBridges.GetNext( pos );
  1460. ASSERT( pPmBridge != NULL );
  1461. pPmBridge->PmBridge_OnDisplayChange(
  1462. m_pPaintManager,
  1463. pWndNotifySrc,
  1464. nDepthBPP,
  1465. ptSizes
  1466. );
  1467. } // for( ; pos != NULL; )
  1468. }
  1469. void CExtPaintManager::CExtPaintManagerAutoPtr::OnThemeChanged(
  1470. CWnd * pWndNotifySrc,
  1471. WPARAM wParam,
  1472. LPARAM lParam
  1473. )
  1474. {
  1475. ASSERT_VALID( pWndNotifySrc );
  1476. ASSERT( pWndNotifySrc->GetSafeHwnd() != NULL && ::IsWindow(pWndNotifySrc->GetSafeHwnd()) );
  1477. ASSERT( m_pPaintManager != NULL );
  1478. if( ! IsWndUpdateSource( pWndNotifySrc ) )
  1479. return;
  1480. m_bHaveScrollLines = false;
  1481. m_pPaintManager->OnThemeChanged( wParam, lParam );
  1482. POSITION pos = m_listBridges.GetHeadPosition();
  1483. for( ; pos != NULL; )
  1484. {
  1485. CExtPmBridge * pPmBridge = m_listBridges.GetNext( pos );
  1486. ASSERT( pPmBridge != NULL );
  1487. pPmBridge->PmBridge_OnThemeChanged(
  1488. m_pPaintManager,
  1489. pWndNotifySrc,
  1490. wParam,
  1491. lParam
  1492. );
  1493. } // for( ; pos != NULL; )
  1494. }
  1495. const BYTE CExtPaintManager::g_arrWinXpTreeBoxExpandedBmpData_small[] = {
  1496. 0x42, 0x4D, 0x32, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
  1497. 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00,
  1498. 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  1499. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xC2, 0xB0, 0xB5, 0x98, 0x78, 0xB5, 0x98, 0x78, 0xB5,
  1500. 0x98, 0x78, 0xB5, 0x98, 0x78, 0xB5, 0x98, 0x78, 0xB5, 0x98, 0x78, 0xB5, 0x98, 0x78, 0xD3, 0xC2,
  1501. 0xB0, 0x00, 0xB5, 0x98, 0x78, 0xBF, 0xCC, 0xD2, 0xAE, 0xBE, 0xC6, 0xA8, 0xB8, 0xC2, 0xA7, 0xB8,
  1502. 0xC1, 0xA7, 0xB8, 0xC1, 0xA6, 0xB7, 0xC0, 0xAA, 0xBA, 0xC3, 0xB5, 0x98, 0x78, 0x00, 0xB5, 0x98,
  1503. 0x78, 0xD9, 0xE1, 0xE4, 0xCF, 0xD8, 0xDC, 0xC9, 0xD3, 0xD8, 0xC7, 0xD2, 0xD7, 0xC6, 0xD1, 0xD6,
  1504. 0xC0, 0xCC, 0xD2, 0xBB, 0xC8, 0xCF, 0xB5, 0x98, 0x78, 0x00, 0xB5, 0x98, 0x78, 0xEE, 0xF2, 0xF2,
  1505. 0xEC, 0xF0, 0xF0, 0xE7, 0xED, 0xED, 0xE6, 0xEB, 0xEC, 0xE3, 0xE9, 0xEA, 0xD9, 0xE0, 0xE3, 0xCC,
  1506. 0xD6, 0xDB, 0xB5, 0x98, 0x78, 0x00, 0xB5, 0x98, 0x78, 0xF1, 0xF5, 0xF5, 0x00, 0x00, 0x00, 0x00,
  1507. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0xDB, 0xDF, 0xB5, 0x98,
  1508. 0x78, 0x00, 0xB5, 0x98, 0x78, 0xF5, 0xF7, 0xF7, 0xF5, 0xF7, 0xF7, 0xF4, 0xF7, 0xF7, 0xF4, 0xF7,
  1509. 0xF7, 0xF4, 0xF6, 0xF6, 0xEB, 0xF0, 0xF1, 0xDA, 0xE1, 0xE5, 0xB5, 0x98, 0x78, 0x00, 0xB5, 0x98,
  1510. 0x78, 0xFB, 0xFC, 0xFC, 0xFB, 0xFD, 0xFD, 0xFB, 0xFD, 0xFD, 0xFB, 0xFD, 0xFD, 0xFB, 0xFC, 0xFC,
  1511. 0xFA, 0xFC, 0xFC, 0xF3, 0xF6, 0xF7, 0xB5, 0x98, 0x78, 0x00, 0xB5, 0x98, 0x78, 0xFF, 0xFF, 0xFF,
  1512. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
  1513. 0xFF, 0xFF, 0xB5, 0x98, 0x78, 0x00, 0xD3, 0xC2, 0xB0, 0xB5, 0x98, 0x78, 0xB5, 0x98, 0x78, 0xB5,
  1514. 0x98, 0x78, 0xB5, 0x98, 0x78, 0xB5, 0x98, 0x78, 0xB5, 0x98, 0x78, 0xB5, 0x98, 0x78, 0xD3, 0xC2,
  1515. 0xB0, 0x00,
  1516. };
  1517. const BYTE CExtPaintManager::g_arrWinXpTreeBoxCollapsedBmpData_small[] = {
  1518. 0x42, 0x4D, 0x32, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00, 
  1519. 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 
  1520. 0x00, 0x00, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  1521. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD3, 0xC2, 0xB0, 0xB5, 0x98, 0x78, 0xB5, 0x98, 0x78, 0xB5, 
  1522. 0x98, 0x78, 0xB5, 0x98, 0x78, 0xB5, 0x98, 0x78, 0xB5, 0x98, 0x78, 0xB5, 0x98, 0x78, 0xD3, 0xC2, 
  1523. 0xB0, 0x00, 0xB5, 0x98, 0x78, 0xBF, 0xCC, 0xD2, 0xAE, 0xBE, 0xC6, 0xA8, 0xB8, 0xC2, 0xA7, 0xB8, 
  1524. 0xC1, 0xA7, 0xB8, 0xC1, 0xA6, 0xB7, 0xC0, 0xAA, 0xBA, 0xC3, 0xB5, 0x98, 0x78, 0x00, 0xB5, 0x98, 
  1525. 0x78, 0xD9, 0xE1, 0xE4, 0xCF, 0xD8, 0xDC, 0xC9, 0xD3, 0xD8, 0x00, 0x00, 0x00, 0xC6, 0xD1, 0xD6, 
  1526. 0xC0, 0xCC, 0xD2, 0xBB, 0xC8, 0xCF, 0xB5, 0x98, 0x78, 0x00, 0xB5, 0x98, 0x78, 0xEE, 0xF2, 0xF2, 
  1527. 0xEC, 0xF0, 0xF0, 0xE7, 0xED, 0xED, 0x00, 0x00, 0x00, 0xE3, 0xE9, 0xEA, 0xD9, 0xE0, 0xE3, 0xCC, 
  1528. 0xD6, 0xDB, 0xB5, 0x98, 0x78, 0x00, 0xB5, 0x98, 0x78, 0xF1, 0xF5, 0xF5, 0x00, 0x00, 0x00, 0x00, 
  1529. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD2, 0xDB, 0xDF, 0xB5, 0x98, 
  1530. 0x78, 0x00, 0xB5, 0x98, 0x78, 0xF5, 0xF7, 0xF7, 0xF5, 0xF7, 0xF7, 0xF4, 0xF7, 0xF7, 0x00, 0x00, 
  1531. 0x00, 0xF4, 0xF6, 0xF6, 0xEB, 0xF0, 0xF1, 0xDA, 0xE1, 0xE5, 0xB5, 0x98, 0x78, 0x00, 0xB5, 0x98, 
  1532. 0x78, 0xFB, 0xFC, 0xFC, 0xFB, 0xFD, 0xFD, 0xFB, 0xFD, 0xFD, 0x00, 0x00, 0x00, 0xFB, 0xFC, 0xFC, 
  1533. 0xFA, 0xFC, 0xFC, 0xF3, 0xF6, 0xF7, 0xB5, 0x98, 0x78, 0x00, 0xB5, 0x98, 0x78, 0xFF, 0xFF, 0xFF, 
  1534. 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 
  1535. 0xFF, 0xFF, 0xB5, 0x98, 0x78, 0x00, 0xD3, 0xC2, 0xB0, 0xB5, 0x98, 0x78, 0xB5, 0x98, 0x78, 0xB5, 
  1536. 0x98, 0x78, 0xB5, 0x98, 0x78, 0xB5, 0x98, 0x78, 0xB5, 0x98, 0x78, 0xB5, 0x98, 0x78, 0xD3, 0xC2, 
  1537. 0xB0, 0x00,
  1538. };
  1539. const BYTE CExtPaintManager::g_arrWinXpTreeBoxExpandedBmpData_big[] = {
  1540. 0x42,0x4D,0xC2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x28,0x00,
  1541. 0x00,0x00,0x0B,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x00,
  1542. 0x00,0x00,0x8C,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  1543. 0x00,0x00,0x00,0x00,0x00,0x00,0xD7,0xD1,0xCB,0x60,0x48,0x30,0x60,0x48,0x30,0x60,
  1544. 0x48,0x30,0x60,0x48,0x30,0x60,0x48,0x30,0x60,0x48,0x30,0x60,0x48,0x30,0x60,0x48,
  1545. 0x30,0x60,0x48,0x30,0xD7,0xD1,0xCB,0x00,0x00,0x00,0xC0,0xA8,0x90,0xF0,0xE0,0xE0,
  1546. 0xF0,0xE0,0xD0,0xF0,0xD8,0xD0,0xF0,0xD8,0xD0,0xF0,0xD0,0xC0,0xF0,0xD0,0xC0,0xF0,
  1547. 0xD0,0xC0,0xF0,0xC8,0xC0,0xF0,0xC8,0xB0,0x60,0x48,0x30,0x00,0x00,0x00,0xC0,0xA8,
  1548. 0x90,0xF0,0xE8,0xE0,0xF0,0xE0,0xE0,0xF0,0xE0,0xD0,0xF0,0xD8,0xD0,0xF0,0xD8,0xD0,
  1549. 0xF0,0xD0,0xC0,0xF0,0xD0,0xC0,0xF0,0xD0,0xC0,0xF0,0xC8,0xC0,0x60,0x48,0x30,0x00,
  1550. 0x00,0x00,0xC0,0xA8,0x90,0xFF,0xF0,0xE0,0xF0,0xE8,0xE0,0xF0,0xE0,0xE0,0xF0,0xE0,
  1551. 0xD0,0xF0,0xD8,0xD0,0xF0,0xD8,0xD0,0xF0,0xD0,0xC0,0xF0,0xD0,0xC0,0xF0,0xD0,0xC0,
  1552. 0x60,0x48,0x30,0x00,0x00,0x00,0xC0,0xA8,0x90,0xFF,0xF0,0xF0,0xFF,0xF0,0xE0,0xF0,
  1553. 0xE8,0xE0,0xF0,0xE0,0xE0,0xF0,0xE0,0xD0,0xF0,0xD8,0xD0,0xF0,0xD8,0xD0,0xF0,0xD0,
  1554. 0xC0,0xF0,0xD0,0xC0,0x60,0x48,0x30,0x00,0x00,0x00,0xC0,0xA8,0x90,0xFF,0xF8,0xF0,
  1555. 0xFF,0xF0,0xF0,0x60,0x48,0x30,0x60,0x48,0x30,0x60,0x48,0x30,0x60,0x48,0x30,0x60,
  1556. 0x48,0x30,0xF0,0xD8,0xD0,0xF0,0xD0,0xC0,0x60,0x48,0x30,0x00,0x00,0x00,0xC0,0xA8,
  1557. 0xA0,0xFF,0xF8,0xF0,0xFF,0xF8,0xF0,0xFF,0xF0,0xF0,0xFF,0xF0,0xE0,0xF0,0xE8,0xE0,
  1558. 0xF0,0xE0,0xE0,0xF0,0xE0,0xD0,0xF0,0xD8,0xD0,0xF0,0xD8,0xD0,0x60,0x48,0x30,0x00,
  1559. 0x00,0x00,0xC0,0xA8,0xA0,0xFF,0xF8,0xFF,0xFF,0xF8,0xF0,0xFF,0xF8,0xF0,0xFF,0xF0,
  1560. 0xF0,0xFF,0xF0,0xE0,0xF0,0xE8,0xE0,0xF0,0xE0,0xE0,0xF0,0xE0,0xD0,0xF0,0xD8,0xD0,
  1561. 0x60,0x48,0x30,0x00,0x00,0x00,0xC0,0xB0,0xA0,0xFF,0xFF,0xFF,0xFF,0xF8,0xFF,0xFF,
  1562. 0xF8,0xF0,0xFF,0xF8,0xF0,0xFF,0xF0,0xF0,0xFF,0xF0,0xE0,0xF0,0xE8,0xE0,0xF0,0xE0,
  1563. 0xE0,0xF0,0xE0,0xD0,0x60,0x48,0x30,0x00,0x00,0x00,0xC0,0xB0,0xA0,0xFF,0xFF,0xFF,
  1564. 0xFF,0xFF,0xFF,0xFF,0xF8,0xFF,0xFF,0xF8,0xF0,0xFF,0xF8,0xF0,0xFF,0xF0,0xF0,0xFF,
  1565. 0xF0,0xE0,0xF0,0xE8,0xE0,0xF0,0xE0,0xE0,0x60,0x48,0x30,0x00,0x00,0x00,0xEF,0xEB,
  1566. 0xE7,0xC0,0xB0,0xA0,0xC0,0xB0,0xA0,0xC0,0xA8,0xA0,0xC0,0xA8,0xA0,0xC0,0xA8,0xA0,
  1567. 0xC0,0xA8,0x90,0xC0,0xA0,0x90,0xC0,0xA0,0x90,0xC0,0xA0,0x90,0xD7,0xD1,0xCB,0x00,
  1568. 0x00,0x00,0x00
  1569. };
  1570. const BYTE CExtPaintManager::g_arrWinXpTreeBoxCollapsedBmpData_big[] = {
  1571. 0x42,0x4D,0xC2,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00,0x28,0x00,
  1572. 0x00,0x00,0x0B,0x00,0x00,0x00,0x0B,0x00,0x00,0x00,0x01,0x00,0x18,0x00,0x00,0x00,
  1573. 0x00,0x00,0x8C,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  1574. 0x00,0x00,0x00,0x00,0x00,0x00,0xD7,0xD1,0xCB,0x60,0x48,0x30,0x60,0x48,0x30,0x60,
  1575. 0x48,0x30,0x60,0x48,0x30,0x60,0x48,0x30,0x60,0x48,0x30,0x60,0x48,0x30,0x60,0x48,
  1576. 0x30,0x60,0x48,0x30,0xD7,0xD1,0xCB,0x00,0x00,0x00,0xC0,0xA8,0x90,0xF0,0xE0,0xE0,
  1577. 0xE0,0xD0,0xC0,0xE0,0xC8,0xB0,0xE0,0xC0,0xB0,0xE0,0xC0,0xB0,0xD0,0xB8,0xA0,0xD0,
  1578. 0xB8,0xA0,0xD0,0xB8,0xA0,0xD0,0xB8,0xA0,0x60,0x48,0x30,0x00,0x00,0x00,0xC0,0xA8,
  1579. 0x90,0xF0,0xE8,0xE0,0xF0,0xE0,0xE0,0xF0,0xE0,0xD0,0xF0,0xD8,0xD0,0xF0,0xD8,0xD0,
  1580. 0xF0,0xD0,0xC0,0xF0,0xD0,0xC0,0xF0,0xD0,0xC0,0xD0,0xB8,0xA0,0x60,0x48,0x30,0x00,
  1581. 0x00,0x00,0xC0,0xA8,0x90,0xFF,0xF0,0xE0,0xF0,0xE8,0xE0,0xF0,0xE0,0xE0,0xF0,0xE0,
  1582. 0xD0,0x60,0x48,0x30,0xF0,0xD8,0xD0,0xF0,0xD0,0xC0,0xF0,0xD0,0xC0,0xD0,0xB8,0xA0,
  1583. 0x60,0x48,0x30,0x00,0x00,0x00,0xC0,0xA8,0x90,0xFF,0xF0,0xF0,0xFF,0xF0,0xE0,0xF0,
  1584. 0xE8,0xE0,0xF0,0xE0,0xE0,0x60,0x48,0x30,0xF0,0xD8,0xD0,0xF0,0xD8,0xD0,0xF0,0xD0,
  1585. 0xC0,0xD0,0xB8,0xA0,0x60,0x48,0x30,0x00,0x00,0x00,0xC0,0xA8,0x90,0xFF,0xF8,0xF0,
  1586. 0xFF,0xF0,0xF0,0x60,0x48,0x30,0x60,0x48,0x30,0x60,0x48,0x30,0x60,0x48,0x30,0x60,
  1587. 0x48,0x30,0xF0,0xD8,0xD0,0xE0,0xC0,0xB0,0x60,0x48,0x30,0x00,0x00,0x00,0xC0,0xA8,
  1588. 0xA0,0xFF,0xF8,0xF0,0xFF,0xF8,0xF0,0xFF,0xF0,0xF0,0xFF,0xF0,0xE0,0x60,0x48,0x30,
  1589. 0xF0,0xE0,0xE0,0xF0,0xE0,0xD0,0xF0,0xD8,0xD0,0xE0,0xC0,0xB0,0x60,0x48,0x30,0x00,
  1590. 0x00,0x00,0xC0,0xA8,0xA0,0xFF,0xF8,0xFF,0xFF,0xF8,0xF0,0xFF,0xF8,0xF0,0xFF,0xF0,
  1591. 0xF0,0x60,0x48,0x30,0xF0,0xE8,0xE0,0xF0,0xE0,0xE0,0xF0,0xE0,0xD0,0xE0,0xC0,0xB0,
  1592. 0x60,0x48,0x30,0x00,0x00,0x00,0xC0,0xB0,0xA0,0xFF,0xFF,0xFF,0xFF,0xF8,0xFF,0xFF,
  1593. 0xF8,0xF0,0xFF,0xF8,0xF0,0xFF,0xF0,0xF0,0xFF,0xF0,0xE0,0xF0,0xE8,0xE0,0xF0,0xE0,
  1594. 0xE0,0xE0,0xD0,0xC0,0x60,0x48,0x30,0x00,0x00,0x00,0xC0,0xB0,0xA0,0xFF,0xFF,0xFF,
  1595. 0xFF,0xFF,0xFF,0xFF,0xF8,0xFF,0xFF,0xF8,0xF0,0xFF,0xF8,0xF0,0xFF,0xF0,0xF0,0xFF,
  1596. 0xF0,0xE0,0xF0,0xE8,0xE0,0xF0,0xE0,0xE0,0x60,0x48,0x30,0x00,0x00,0x00,0xEF,0xEB,
  1597. 0xE7,0xC0,0xB0,0xA0,0xC0,0xB0,0xA0,0xC0,0xA8,0xA0,0xC0,0xA8,0xA0,0xC0,0xA8,0xA0,
  1598. 0xC0,0xA8,0x90,0xC0,0xA0,0x90,0xC0,0xA0,0x90,0xC0,0xA0,0x90,0xD7,0xD1,0xCB,0x00,
  1599. 0x00,0x00,0x00
  1600. };
  1601. void CExtPaintManager::LoadWinXpTreeBox(
  1602. CExtCmdIcon & _icon,
  1603. bool bExpanded,
  1604. bool bBig // = false
  1605. )
  1606. {
  1607. ASSERT_VALID( this );
  1608. _icon.Empty();
  1609. if( bBig )
  1610. {
  1611. if( bExpanded )
  1612. _icon.m_bmpNormal.LoadBMP_Buffer(
  1613. g_arrWinXpTreeBoxExpandedBmpData_big,
  1614. sizeof(g_arrWinXpTreeBoxExpandedBmpData_big) / sizeof( g_arrWinXpTreeBoxExpandedBmpData_big[0] ),
  1615. true
  1616. );
  1617. else
  1618. _icon.m_bmpNormal.LoadBMP_Buffer(
  1619. g_arrWinXpTreeBoxCollapsedBmpData_big,
  1620. sizeof(g_arrWinXpTreeBoxCollapsedBmpData_big) / sizeof( g_arrWinXpTreeBoxCollapsedBmpData_big[0] ),
  1621. true
  1622. );
  1623. CSize _size = _icon.m_bmpNormal.GetSize();
  1624. RECT rc;
  1625. ::SetRect( &rc, 0, 0, 1, 1 );
  1626. _icon.m_bmpNormal.AlphaRect( rc, 0x20 );
  1627. ::SetRect( &rc, _size.cx-1, 0, _size.cx, 1 );
  1628. _icon.m_bmpNormal.AlphaRect( rc, 0x20 );
  1629. ::SetRect( &rc, 0, _size.cy-1, 1, _size.cy );
  1630. _icon.m_bmpNormal.AlphaRect( rc, 0x20 );
  1631. ::SetRect( &rc, _size.cx-1, _size.cy-1, _size.cx, _size.cy );
  1632. _icon.m_bmpNormal.AlphaRect( rc, 0x20 );
  1633. }
  1634. else
  1635. {
  1636. if( bExpanded )
  1637. _icon.m_bmpNormal.LoadBMP_Buffer(
  1638. g_arrWinXpTreeBoxExpandedBmpData_small,
  1639. sizeof(g_arrWinXpTreeBoxExpandedBmpData_small) / sizeof( g_arrWinXpTreeBoxExpandedBmpData_small[0] ),
  1640. true
  1641. );
  1642. else
  1643. _icon.m_bmpNormal.LoadBMP_Buffer(
  1644. g_arrWinXpTreeBoxCollapsedBmpData_small,
  1645. sizeof(g_arrWinXpTreeBoxCollapsedBmpData_small) / sizeof( g_arrWinXpTreeBoxCollapsedBmpData_small[0] ),
  1646. true
  1647. );
  1648. _icon.m_bmpNormal.AlphaColor( RGB(255,0,255), RGB(0,0,0), 0 );
  1649. }
  1650. }
  1651. bool CExtPaintManager::glyph_t::stat_DefGlyphRgnTransparencyFunc(
  1652. const glyph_t & _glyph,
  1653. int x,
  1654. int y,
  1655. UINT nColor,
  1656. LPVOID lpCookie
  1657. )
  1658. {
  1659. _glyph;
  1660. x;
  1661. y;
  1662. lpCookie;
  1663. return (nColor == 0) ? true : false;
  1664. }
  1665. CExtPaintManager::glyph_t::glyph_t()
  1666. {
  1667. _Init();
  1668. }
  1669. CExtPaintManager::glyph_t::glyph_t(
  1670. const SIZE & _size,
  1671. UINT nColors,
  1672. const UINT * pColorIndexes
  1673. )
  1674. {
  1675. m_bDynamicData = false;
  1676. ASSERT( _size.cx > 0 );
  1677. ASSERT( _size.cy > 0 );
  1678. m_size.cx = _size.cx;
  1679. m_size.cy = _size.cy;
  1680. ASSERT( nColors > 0 );
  1681. m_nColors = nColors;
  1682. ASSERT( pColorIndexes != NULL );
  1683. m_pColorIndexes = pColorIndexes;
  1684. }
  1685. CExtPaintManager::glyph_t::glyph_t(
  1686. int cx,
  1687. int cy,
  1688. UINT nColors,
  1689. const UINT * pColorIndexes
  1690. )
  1691. {
  1692. m_bDynamicData = false;
  1693. ASSERT( cx > 0 );
  1694. ASSERT( cy > 0 );
  1695. m_size.cx = cx;
  1696. m_size.cy = cy;
  1697. ASSERT( nColors > 0 );
  1698. m_nColors = nColors;
  1699. ASSERT( pColorIndexes != NULL );
  1700. m_pColorIndexes = pColorIndexes;
  1701. }
  1702. CExtPaintManager::glyph_t::glyph_t(
  1703. const glyph_t & other,
  1704. UINT nRotateAngle // = 0
  1705. )
  1706. {
  1707. _Init();
  1708. _CopyFromOther(other);
  1709. #ifdef _DEBUG
  1710. if( other.m_pColorIndexes != NULL )
  1711. {
  1712. ASSERT( m_pColorIndexes != NULL );
  1713. ASSERT( m_pColorIndexes != other.m_pColorIndexes );
  1714. ASSERT( m_bDynamicData );
  1715. }
  1716. #endif // _DEBUG
  1717. ASSERT(
  1718. nRotateAngle == 0
  1719. || nRotateAngle == 90
  1720. || nRotateAngle == 180
  1721. || nRotateAngle == 270
  1722. );
  1723. Rotate(nRotateAngle);
  1724. }
  1725. CExtPaintManager::glyph_t::~glyph_t()
  1726. {
  1727. _Done();
  1728. }
  1729. UINT CExtPaintManager::glyph_t::GetColorPixel(
  1730. int x,
  1731. int y
  1732. ) const
  1733. {
  1734. ASSERT( x >= 0 && x < m_size.cx );
  1735. ASSERT( y >= 0 && y < m_size.cy );
  1736. ASSERT( m_size.cx > 0 );
  1737. ASSERT( m_size.cy > 0 );
  1738. ASSERT( m_nColors > 0 );
  1739. ASSERT( m_pColorIndexes != NULL );
  1740. int nOffset =
  1741. y * m_size.cx + x;
  1742. UINT nValue =
  1743. *( m_pColorIndexes + nOffset );
  1744. return nValue;
  1745. }
  1746. void CExtPaintManager::glyph_t::Rotate(UINT nRotateAngle)
  1747. {
  1748. ASSERT(
  1749. nRotateAngle == 0
  1750. || nRotateAngle == 90
  1751. || nRotateAngle == 180
  1752. || nRotateAngle == 270
  1753. );
  1754. ASSERT( m_bDynamicData );
  1755. ASSERT( m_size.cx > 0 );
  1756. ASSERT( m_size.cy > 0 );
  1757. ASSERT( m_nColors > 0 );
  1758. ASSERT( m_pColorIndexes != NULL );
  1759. if( nRotateAngle == 0 )
  1760. return;
  1761. int nBufferSize =
  1762. m_size.cx * m_size.cy;
  1763. ASSERT( nBufferSize > 0 );
  1764. UINT * pNew = new UINT[nBufferSize];
  1765. ASSERT( pNew != NULL );
  1766. if( pNew == NULL )
  1767. return;
  1768. int x, y;
  1769. UINT * pOld = (UINT *)m_pColorIndexes;
  1770. switch( nRotateAngle )
  1771. {
  1772. case 90:
  1773. {
  1774. for( y = 0; y<m_size.cy; y++ )
  1775. {
  1776. for( x = 0; x<m_size.cx; x++, pOld++ )
  1777. {
  1778. int nNewOffset =
  1779. x*m_size.cy + (m_size.cy - y - 1);
  1780. ASSERT(
  1781. nNewOffset >= 0
  1782. &&
  1783. nNewOffset < nBufferSize
  1784. );
  1785. UINT * p = pNew + nNewOffset;
  1786. *p = *pOld;
  1787. } // for( x = 0; x<m_size.cx; x++, pOld++ )
  1788. } // for( y = 0; y<m_size.cy; y++ )
  1789. m_size = CSize(m_size.cy,m_size.cx);
  1790. }
  1791. break; // case 90
  1792. case 180:
  1793. {
  1794. for( y = 0; y<m_size.cy; y++ )
  1795. {
  1796. for( x = 0; x<m_size.cx; x++, pOld++ )
  1797. {
  1798. int nNewOffset =
  1799. (m_size.cy-y-1)*m_size.cx
  1800. + (m_size.cx-x-1);
  1801. ASSERT(
  1802. nNewOffset >= 0
  1803. &&
  1804. nNewOffset < nBufferSize
  1805. );
  1806. UINT * p = pNew + nNewOffset;
  1807. *p = *pOld;
  1808. } // for( x = 0; x<m_size.cx; x++, pOld++ )
  1809. } // for( y = 0; y<m_size.cy; y++ )
  1810. }
  1811. break; // case 180
  1812. case 270:
  1813. {
  1814. for( y = 0; y<m_size.cy; y++ )
  1815. {
  1816. for( x = 0; x<m_size.cx; x++, pOld++ )
  1817. {
  1818. int nNewOffset =
  1819. (m_size.cx-x-1)*m_size.cy + y;
  1820. ASSERT(
  1821. nNewOffset >= 0
  1822. &&
  1823. nNewOffset < nBufferSize
  1824. );
  1825. UINT * p = pNew + nNewOffset;
  1826. *p = *pOld;
  1827. } // for( x = 0; x<m_size.cx; x++, pOld++ )
  1828. } // for( y = 0; y<m_size.cy; y++ )
  1829. m_size = CSize(m_size.cy,m_size.cx);
  1830. }
  1831. break; // case 270
  1832. } // switch( nRotateAngle )
  1833. UINT nSizeInBytes = 
  1834. nBufferSize * sizeof(UINT);
  1835. __EXT_MFC_MEMCPY(
  1836. (UINT *)m_pColorIndexes,
  1837. nSizeInBytes,
  1838. pNew,
  1839. nSizeInBytes
  1840. );
  1841. delete [] pNew; // ::free(pNew);
  1842. }
  1843. CSize CExtPaintManager::glyph_t::Size() const
  1844. {
  1845. return m_size;
  1846. }
  1847. const UINT * CExtPaintManager::glyph_t::GetSurface() const
  1848. {
  1849. ASSERT( m_size.cx > 0 );
  1850. ASSERT( m_size.cy > 0 );
  1851. ASSERT( m_nColors > 0 );
  1852. ASSERT( m_pColorIndexes != NULL );
  1853. return m_pColorIndexes;
  1854. }
  1855. UINT CExtPaintManager::glyph_t::GetColorsCount() const
  1856. {
  1857. ASSERT( m_size.cx > 0 );
  1858. ASSERT( m_size.cy > 0 );
  1859. ASSERT( m_nColors > 0 );
  1860. ASSERT( m_pColorIndexes != NULL );
  1861. return m_nColors;
  1862. }
  1863. void CExtPaintManager::glyph_t::_Init()
  1864. {
  1865. m_size.cx = m_size.cy = 0;
  1866. m_nColors = 1;
  1867. m_pColorIndexes = NULL;
  1868. m_bDynamicData = false;
  1869. }
  1870. void CExtPaintManager::glyph_t::_Done()
  1871. {
  1872. if( m_bDynamicData )
  1873. {
  1874. ASSERT( m_pColorIndexes != NULL );
  1875. delete [] ((UINT *)m_pColorIndexes); // ::free( (void *)m_pColorIndexes );
  1876. m_pColorIndexes = NULL;
  1877. }
  1878. _Init();
  1879. }
  1880. bool CExtPaintManager::glyph_t::_CopyFromOther( const glyph_t & other )
  1881. {
  1882. _Done();
  1883. if( other.m_pColorIndexes != NULL )
  1884. {
  1885. int nBufferSize =
  1886. other.m_size.cx * other.m_size.cy;
  1887. ASSERT( nBufferSize > 0 );
  1888. m_pColorIndexes = new UINT[nBufferSize];
  1889. ASSERT( m_pColorIndexes != NULL );
  1890. if( m_pColorIndexes == NULL )
  1891. return false;
  1892. UINT nSizeInBytes = 
  1893. nBufferSize * sizeof(UINT);
  1894. __EXT_MFC_MEMCPY(
  1895. (void *)m_pColorIndexes,
  1896. nSizeInBytes,
  1897. other.m_pColorIndexes,
  1898. nSizeInBytes
  1899. );
  1900. m_bDynamicData = true;
  1901. }
  1902. m_size.cx = other.m_size.cx;
  1903. m_size.cy = other.m_size.cy;
  1904. m_nColors = other.m_nColors;
  1905. return true;
  1906. }
  1907. void CExtPaintManager::glyph_t::_SetColorPixel(
  1908. int x,
  1909. int y,
  1910. UINT nValue
  1911. )
  1912. {
  1913. ASSERT( x >= 0 && x < m_size.cx );
  1914. ASSERT( y >= 0 && y < m_size.cy );
  1915. ASSERT( m_bDynamicData );
  1916. ASSERT( m_size.cx > 0 );
  1917. ASSERT( m_size.cy > 0 );
  1918. ASSERT( m_nColors > 0 );
  1919. ASSERT( m_pColorIndexes != NULL );
  1920. int nOffset =
  1921. y * m_size.cx + x;
  1922. UINT * ptr =
  1923. (UINT *)m_pColorIndexes + nOffset;
  1924. *ptr = nValue;
  1925. }
  1926. CRgn & CExtPaintManager::glyph_t::GenerateRgn(
  1927. CRgn & rgn,
  1928. bool (*pGlyphRgnTransparencyFunc)(
  1929. const glyph_t & _glyph,
  1930. int x,
  1931. int y,
  1932. UINT nColor,
  1933. LPVOID lpCookie
  1934. ), // = stat_DefGlyphRgnTransparencyFunc
  1935. LPVOID lpCallbackCookie, // = NULL
  1936. LPLONG pMinNonTransparentX, // = NULL
  1937. LPLONG pMinNonTransparentY, // = NULL
  1938. LPLONG pMaxNonTransparentX, // = NULL
  1939. LPLONG pMaxNonTransparentY, // = NULL
  1940. LPLONG pMinTransparentX, // = NULL
  1941. LPLONG pMinTransparentY, // = NULL
  1942. LPLONG pMaxTransparentX, // = NULL
  1943. LPLONG pMaxTransparentY // = NULL
  1944. ) const
  1945. {
  1946. if( pMinNonTransparentX != NULL )
  1947. *pMinNonTransparentX = 0;
  1948. if( pMinNonTransparentY != NULL )
  1949. *pMinNonTransparentY = 0;
  1950. if( pMaxNonTransparentX != NULL )
  1951. *pMaxNonTransparentX = 0;
  1952. if( pMaxNonTransparentY != NULL )
  1953. *pMaxNonTransparentY;
  1954. if( pMinTransparentX != NULL )
  1955. *pMinTransparentX = 0;
  1956. if( pMinTransparentY != NULL )
  1957. *pMinTransparentY = 0;
  1958. if( pMaxTransparentX != NULL )
  1959. *pMaxTransparentX = 0;
  1960. if( pMaxTransparentY != NULL )
  1961. *pMaxTransparentY;
  1962. if( rgn.GetSafeHandle() != NULL )
  1963. rgn.DeleteObject();
  1964. ASSERT( rgn.GetSafeHandle() == NULL );
  1965. CSize _size = Size();
  1966. if( _size.cx == 0 || _size.cy == 0 )
  1967. {
  1968. ASSERT( FALSE );
  1969. return rgn;
  1970. }
  1971. if( !rgn.CreateRectRgn(0,0,0,0) )
  1972. {
  1973. ASSERT( FALSE );
  1974. return rgn;
  1975. }
  1976. for( int x = 0; x < _size.cx; x++ )
  1977. {
  1978. for( int y = 0; y < _size.cy; y++ )
  1979. {
  1980. UINT nColor = GetColorPixel( x, y );
  1981. if( pGlyphRgnTransparencyFunc(
  1982. *this,
  1983. x,
  1984. y,
  1985. nColor,
  1986. lpCallbackCookie
  1987. )
  1988. )
  1989. { // if pixel transparent
  1990. if( pMinTransparentX != NULL
  1991. && (*pMinTransparentX) > x
  1992. )
  1993. (*pMinTransparentX) = x;
  1994. if( pMinTransparentY != NULL
  1995. && (*pMinTransparentY) > y
  1996. )
  1997. (*pMinTransparentY) = y;
  1998. if( pMaxTransparentX != NULL
  1999. && (*pMaxTransparentX) < x
  2000. )
  2001. (*pMaxTransparentX) = x;
  2002. if( pMaxTransparentY != NULL
  2003. && (*pMaxTransparentY) < y
  2004. )
  2005. (*pMaxTransparentY) = y;
  2006. continue;
  2007. } // if pixel transparent
  2008. if( pMinNonTransparentX != NULL
  2009. && (*pMinNonTransparentX) > x
  2010. )
  2011. (*pMinNonTransparentX) = x;
  2012. if( pMinNonTransparentY != NULL
  2013. && (*pMinNonTransparentY) > y
  2014. )
  2015. (*pMinNonTransparentY) = y;
  2016. if( pMaxNonTransparentX != NULL
  2017. && (*pMaxNonTransparentX) < x
  2018. )
  2019. (*pMaxNonTransparentX) = x;
  2020. if( pMaxNonTransparentY != NULL
  2021. && (*pMaxNonTransparentY) < y
  2022. )
  2023. (*pMaxNonTransparentY) = y;
  2024. CRgn rgnPixel;
  2025. if( !rgnPixel.CreateRectRgn(
  2026. x,
  2027. y,
  2028. x+1,
  2029. y+1
  2030. )
  2031. )
  2032. {
  2033. ASSERT( FALSE );
  2034. return rgn;
  2035. }
  2036. rgn.CombineRgn( &rgn, &rgnPixel, RGN_OR );
  2037. } // for( int y = 0; y < _size.cy; y++ )
  2038. } // for( int x = 0; x < _size.cx; x++ )
  2039. return rgn;
  2040. }
  2041. DWORD CExtPaintManager::stat_DllGetVersion( __EXT_MFC_SAFE_LPCTSTR lpszDllName )
  2042. {
  2043.     HINSTANCE hinstDll = NULL;
  2044.     DWORD dwVersion = 0;
  2045.     // For security purposes, LoadLibrary should be provided with a 
  2046.     // fully-qualified path to the DLL. The lpszDllName variable should be
  2047.     // tested to ensure that it is a fully qualified path before it is used.
  2048.     hinstDll = ::LoadLibrary(lpszDllName);
  2049.     if( hinstDll != NULL )
  2050.     {
  2051.         DLLGETVERSIONPROC pDllGetVersion;
  2052.         pDllGetVersion = 
  2053. (DLLGETVERSIONPROC) ::GetProcAddress( hinstDll, "DllGetVersion" );
  2054. // Because some DLLs might not implement this function, you
  2055.         // must test for it explicitly. Depending on the particular 
  2056.         // DLL, the lack of a DllGetVersion function can be a useful
  2057.         // indicator of the version.
  2058.         if( pDllGetVersion != NULL )
  2059.         {
  2060.             DLLVERSIONINFO dvi;
  2061.             HRESULT hr = 0;
  2062.             ZeroMemory(&dvi, sizeof(dvi));
  2063.             dvi.cbSize = sizeof(dvi);
  2064.             hr = (*pDllGetVersion)(&dvi);
  2065.             if( SUCCEEDED(hr) )
  2066.                dwVersion = MAKELONG( dvi.dwMinorVersion, dvi.dwMajorVersion );
  2067.         }
  2068.         ::FreeLibrary( hinstDll );
  2069.     }
  2070.     return dwVersion;
  2071. }
  2072. HBITMAP CExtPaintManager::stat_GetScreenSurfacePart(
  2073. const RECT & rcScreenSurfacePart,
  2074. COLORREF ** ppClrSurface // = NULL
  2075. )
  2076. {
  2077. if( ppClrSurface != NULL )
  2078. (*ppClrSurface) = NULL;
  2079. INT cx = rcScreenSurfacePart.right - rcScreenSurfacePart.left;
  2080. if( cx <= 0 )
  2081. return NULL;
  2082. INT cy = rcScreenSurfacePart.bottom - rcScreenSurfacePart.top;
  2083. if( cy <= 0 )
  2084. return NULL;
  2085. CDC dcmm;
  2086. if( ! dcmm.CreateCompatibleDC( NULL ) )
  2087. return NULL;
  2088. BITMAPINFOHEADER bih;
  2089. bih.biSize = sizeof(BITMAPINFOHEADER);
  2090. bih.biWidth          = cx;
  2091. bih.biHeight         = cy;
  2092. bih.biPlanes         = 1;
  2093. bih.biBitCount       = 32;
  2094. bih.biCompression    = BI_RGB;
  2095. bih.biSizeImage      = cx * cy;
  2096. bih.biXPelsPerMeter  = 0;
  2097. bih.biYPelsPerMeter  = 0;
  2098. bih.biClrUsed        = 0;
  2099. bih.biClrImportant   = 0;
  2100. HBITMAP hDIB =
  2101. ::CreateDIBSection(
  2102. dcmm.GetSafeHdc(),
  2103. (LPBITMAPINFO)&bih,
  2104. DIB_RGB_COLORS,
  2105. (void **)ppClrSurface,
  2106. NULL,
  2107. NULL
  2108. );
  2109. if( hDIB == NULL )
  2110. return NULL;
  2111. HGDIOBJ hOldBmp = ::SelectObject( dcmm.m_hDC, ((HGDIOBJ)hDIB) );
  2112. CWindowDC dcDesktop( NULL );
  2113. VERIFY(
  2114. dcmm.BitBlt(
  2115. 0,
  2116. 0,
  2117. cx,
  2118. cy,
  2119. &dcDesktop,
  2120. rcScreenSurfacePart.left,
  2121. rcScreenSurfacePart.top,
  2122. SRCCOPY
  2123. )
  2124. );
  2125. ::SelectObject( dcmm.m_hDC, hOldBmp );
  2126. dcmm.DeleteDC();
  2127. return hDIB;
  2128. }
  2129. HBITMAP CExtPaintManager::stat_PrintWnd(
  2130. HWND hWnd,
  2131. UINT nMessage, // = WM_PRINTCLIENT
  2132. LPARAM lParamPrint, // = PRF_NONCLIENT|PRF_CLIENT|PRF_ERASEBKGND|PRF_CHILDREN
  2133. HDC hSrcDC, // = NULL
  2134. const RECT * pRectFillSrc // = NULL
  2135. )
  2136. {
  2137. ASSERT( hWnd != NULL && ::IsWindow(hWnd) );
  2138. ASSERT( nMessage == WM_PRINT || nMessage == WM_PRINTCLIENT );
  2139. CRect rcWnd, rcClient;
  2140. ::GetWindowRect( hWnd, &rcWnd );
  2141. ::GetClientRect( hWnd, &rcClient );
  2142. CSize _sizeDest =
  2143. ( (lParamPrint&PRF_NONCLIENT) != 0 )
  2144. ? rcWnd.Size()
  2145. : rcClient.Size()
  2146. ;
  2147. HDC hDC = ::CreateCompatibleDC( NULL );
  2148. if( hDC == NULL )
  2149. {
  2150. ASSERT( FALSE );
  2151. return NULL;
  2152. }
  2153. BITMAPINFOHEADER bih;
  2154. ::memset( &bih, 0, sizeof(BITMAPINFOHEADER) );
  2155. bih.biSize = sizeof(BITMAPINFOHEADER);
  2156. bih.biWidth = _sizeDest.cx;
  2157. bih.biHeight = _sizeDest.cy;
  2158. bih.biPlanes = 1;
  2159. bih.biBitCount = 32;
  2160. bih.biCompression = BI_RGB;
  2161. bih.biSizeImage = _sizeDest.cx * _sizeDest.cy;
  2162. COLORREF * pSurface = NULL;
  2163. HBITMAP hBmpSufrace =
  2164. ::CreateDIBSection(
  2165. hDC,
  2166. (LPBITMAPINFO)&bih,
  2167. DIB_RGB_COLORS,
  2168. (void **)&pSurface,
  2169. NULL,
  2170. NULL
  2171. );
  2172. ASSERT( hBmpSufrace != NULL );
  2173. if( hBmpSufrace == NULL )
  2174. {
  2175. ::DeleteDC( hDC );
  2176. ASSERT( FALSE );
  2177. return NULL;
  2178. }
  2179. ASSERT( pSurface != NULL );
  2180. HGDIOBJ hBmpOld = ::SelectObject( hDC, (HGDIOBJ)hBmpSufrace );
  2181. if( hSrcDC != NULL
  2182. && pRectFillSrc != NULL
  2183. && pRectFillSrc->left < pRectFillSrc->right
  2184. && pRectFillSrc->top < pRectFillSrc->bottom
  2185. )
  2186. ::BitBlt(
  2187. hDC,
  2188. 0,
  2189. 0,
  2190. pRectFillSrc->right - pRectFillSrc->left,
  2191. pRectFillSrc->bottom - pRectFillSrc->top,
  2192. hSrcDC,
  2193. pRectFillSrc->left,
  2194. pRectFillSrc->top,
  2195. SRCCOPY
  2196. );
  2197. LRESULT lResult =
  2198. ::SendMessage(
  2199. hWnd,
  2200. nMessage,
  2201. (WPARAM)hDC,
  2202. lParamPrint
  2203. );
  2204. lResult;
  2205. // if( lResult != 0 )
  2206. // {
  2207. // bool bOverPaint = true;
  2208. // CWnd * pWnd = CWnd::FromHandlePermanent( hWnd );
  2209. // if( pWnd != NULL )
  2210. // {
  2211. // CRuntimeClass * pRTC = pWnd->GetRuntimeClass();
  2212. // ASSERT( pRTC != NULL );
  2213. // if( ::strncmp( pRTC->m_lpszClassName, "CExt", 4 ) == 0 )
  2214. // bOverPaint = false;
  2215. // }
  2216. // if( bOverPaint )
  2217. // {
  2218. // COLORREF clrBk = ::GetSysColor( COLOR_WINDOW );
  2219. // COLORREF clrBkOld = ::SetBkColor( hDC, clrBk );
  2220. // CRect rect( 0, 0, _sizeDest.cx, _sizeDest.cy );
  2221. // ::ExtTextOut( hDC, 0, 0, ETO_OPAQUE, &rect, NULL, 0, NULL );
  2222. // ::SetBkColor( hDC, clrBkOld );
  2223. // }
  2224. // }
  2225. ::SelectObject( hDC, (HGDIOBJ)hBmpOld );
  2226. ::DeleteDC( hDC );
  2227. return hBmpSufrace;
  2228. }
  2229. void CExtPaintManager::stat_PrintChildren(
  2230. HWND hWndStart,
  2231. UINT nMessage,
  2232. HDC hDC,
  2233. LPARAM lParamPrint,
  2234. bool bDeepTreeWalk, // = true
  2235. CObject * pHelperSrc, // = NULL
  2236. LPARAM lParam // = 0L
  2237. )
  2238. {
  2239. ASSERT( hWndStart != NULL && ::IsWindow(hWndStart) );
  2240. ASSERT( nMessage == WM_PRINT || nMessage == WM_PRINTCLIENT );
  2241. ASSERT( hDC != NULL );
  2242. ASSERT( (lParamPrint&PRF_CHILDREN) != 0 );
  2243. CRect rcStartWnd, rcStartClient;
  2244. ::GetWindowRect( hWndStart, &rcStartWnd );
  2245. ::GetClientRect( hWndStart, &rcStartClient );
  2246. ::ClientToScreen( hWndStart, ((LPPOINT)(&rcStartClient)) );
  2247. ::ClientToScreen( hWndStart, ((LPPOINT)(&rcStartClient))+1 );
  2248. CPoint ptStartNcOffset(
  2249. rcStartWnd.left - rcStartClient.left,
  2250. rcStartWnd.top - rcStartClient.top
  2251. );
  2252. if( (lParamPrint&PRF_NONCLIENT) != 0
  2253. && ( ptStartNcOffset.x != 0
  2254. || ptStartNcOffset.y != 0
  2255. )
  2256. )
  2257. ::OffsetViewportOrgEx(
  2258. hDC,
  2259. -ptStartNcOffset.x,
  2260. -ptStartNcOffset.y,
  2261. NULL
  2262. );
  2263. HWND hWndChild = ::GetWindow( hWndStart, GW_CHILD );
  2264. for( ; hWndChild != NULL; hWndChild = ::GetWindow( hWndChild, GW_HWNDNEXT ) )
  2265. {
  2266. __EXT_MFC_LONG_PTR dwChildStyle = ::__EXT_MFC_GetWindowLong( hWndChild, GWL_STYLE );
  2267. if( (dwChildStyle&WS_VISIBLE) == 0 )
  2268. continue;
  2269. CRect rcChildWnd, rcChildClient;
  2270. ::GetWindowRect( hWndChild, &rcChildWnd );
  2271. ::GetClientRect( hWndChild, &rcChildClient );
  2272. ::ClientToScreen( hWndChild, ((LPPOINT)(&rcChildClient)) );
  2273. ::ClientToScreen( hWndChild, ((LPPOINT)(&rcChildClient))+1 );
  2274. CPoint ptChildNcOffset(
  2275. rcChildWnd.left - rcChildClient.left,
  2276. rcChildWnd.top - rcChildClient.top
  2277. );
  2278. CPoint ptChildRenderOffset( 0, 0 );
  2279. if( (lParamPrint&PRF_NONCLIENT) != 0 )
  2280. {
  2281. ptChildRenderOffset.x = rcStartClient.left - rcChildWnd.left;
  2282. ptChildRenderOffset.y = rcStartClient.top - rcChildWnd.top;
  2283. }
  2284. else
  2285. {
  2286. ptChildRenderOffset.x = rcStartClient.left - rcChildClient.left;
  2287. ptChildRenderOffset.y = rcStartClient.top - rcChildClient.top;
  2288. }
  2289. if( ptChildRenderOffset.x != 0
  2290. || ptChildRenderOffset.y != 0
  2291. )
  2292. ::OffsetViewportOrgEx(
  2293. hDC,
  2294. -ptChildRenderOffset.x,
  2295. -ptChildRenderOffset.y,
  2296. NULL
  2297. );
  2298. ::SendMessage(
  2299. hWndChild,
  2300. nMessage,
  2301. (WPARAM)hDC,
  2302. lParamPrint
  2303. );
  2304. if( bDeepTreeWalk )
  2305. stat_PrintChildren(
  2306. hWndChild,
  2307. nMessage,
  2308. hDC,
  2309. lParamPrint,
  2310. bDeepTreeWalk,
  2311. pHelperSrc,
  2312. lParam
  2313. );
  2314. if( ptChildRenderOffset.x != 0
  2315. || ptChildRenderOffset.y != 0
  2316. )
  2317. ::OffsetViewportOrgEx(
  2318. hDC,
  2319. ptChildRenderOffset.x,
  2320. ptChildRenderOffset.y,
  2321. NULL
  2322. );
  2323. } // for( ; hWndChild != NULL; hWndChild = ::GetWindow( hWndChild, GW_HWNDNEXT ) )
  2324. if( (lParamPrint&PRF_NONCLIENT) != 0
  2325. && ( ptStartNcOffset.x != 0
  2326. || ptStartNcOffset.y != 0
  2327. )
  2328. )
  2329. ::OffsetViewportOrgEx(
  2330. hDC,
  2331. ptStartNcOffset.x,
  2332. ptStartNcOffset.y,
  2333. NULL
  2334. );
  2335. }
  2336. CExtPaintManager::SCROLLBARSKINDATA::SCROLLBARSKINDATA()
  2337. {
  2338. Empty();
  2339. }
  2340. CExtPaintManager::SCROLLBARSKINDATA::~SCROLLBARSKINDATA()
  2341. {
  2342. Empty();
  2343. }
  2344. void CExtPaintManager::SCROLLBARSKINDATA::Empty()
  2345. {
  2346. m_clrZsLineLightEnabled = COLORREF(-1L);
  2347. m_clrZsLineDarkEnabled = COLORREF(-1L);
  2348. m_clrZsLineLightDisabled = COLORREF(-1L);
  2349. m_clrZsLineDarkDisabled = COLORREF(-1L);
  2350. m_bmpEntireArea.Empty();
  2351. m_rcEntirePaddingR.SetRect( 0, 0, 0, 0 );
  2352. m_rcEntirePaddingC.SetRect( 0, 0, 0, 0 );
  2353. INT i, j;
  2354. for( i = 0; i < INT(__ESBSPT_PART_COUNT); i++ )
  2355. {
  2356. for( j = 0; j < INT(__ESBMHT_PART_COUNT); j++ )
  2357. {
  2358. CRect & rcPadding = m_arrPartPadding[i][j];
  2359. rcPadding.SetRect( 0, 0, 0, 0 );
  2360. CExtBitmap & _bmp = m_arrPartBmp[i][j];
  2361. _bmp.Empty();
  2362. m_arrClrSolidBackground[i][j] = COLORREF(-1L);
  2363. }
  2364. }
  2365. }
  2366. CExtBitmap & CExtPaintManager::SCROLLBARSKINDATA::GetPart(
  2367. CExtPaintManager::e_scroll_bar_skin_part_t ePartState,
  2368. CExtPaintManager::e_scroll_bar_mouse_hover_type_t eSBMHT, // part type
  2369. RECT * pRectPadding, // = NULL
  2370. COLORREF * pClrSolidBackground // = NULL
  2371. )
  2372. {
  2373. CExtBitmap & _bmp =
  2374. m_arrPartBmp
  2375. [ INT(ePartState) ]
  2376. [ INT(eSBMHT) ]
  2377. ;
  2378. COLORREF clrSolidBackground =
  2379. m_arrClrSolidBackground
  2380. [ INT(ePartState) ]
  2381. [ INT(eSBMHT) ]
  2382. ;
  2383. if( pClrSolidBackground != NULL )
  2384. (*pClrSolidBackground) = clrSolidBackground;
  2385. if( pRectPadding != NULL )
  2386. {
  2387. const RECT & rcPadding =
  2388. m_arrPartPadding
  2389. [ INT(ePartState) ]
  2390. [ INT(eSBMHT) ]
  2391. ;
  2392. ::CopyRect( pRectPadding, &rcPadding );
  2393. } // if( pRectPadding != NULL )
  2394. if( _bmp.IsEmpty() && INT(ePartState) > 0 )
  2395. {
  2396. return
  2397. GetPart(
  2398. (CExtPaintManager::e_scroll_bar_skin_part_t)(INT(ePartState)-1),
  2399. eSBMHT,
  2400. pRectPadding,
  2401. ( clrSolidBackground == COLORREF(-1L) )
  2402. ? pClrSolidBackground
  2403. : NULL
  2404. );
  2405. } // if( _bmp.IsEmpty() && INT(ePartState) > 0 )
  2406. return _bmp;
  2407. }
  2408. const CExtBitmap & CExtPaintManager::SCROLLBARSKINDATA::GetPart(
  2409. CExtPaintManager::e_scroll_bar_skin_part_t ePartState,
  2410. CExtPaintManager::e_scroll_bar_mouse_hover_type_t eSBMHT, // part type
  2411. RECT * pRectPadding, // = NULL
  2412. COLORREF * pClrSolidBackground // = NULL
  2413. ) const
  2414. {
  2415. return
  2416. ( const_cast < SCROLLBARSKINDATA * > ( this ) )
  2417. -> GetPart( ePartState, eSBMHT, pRectPadding, pClrSolidBackground );
  2418. }
  2419. void CExtPaintManager::SCROLLBARSKINDATA::Load2007_R2(
  2420. UINT nResourceID_BumpyGlyphStack,
  2421. INT nBumpyGlyphStackItemHeight,
  2422. UINT nResourceID_GripperStack,
  2423. INT nGripperStackItemHeight,
  2424. const RECT & rcBumpyGlyphStackItemPadding,
  2425. COLORREF clrSolidBackground,
  2426. COLORREF clrPressedPageAreas,
  2427. UINT nResourceID_ArrowUp_Normal,
  2428. UINT nResourceID_ArrowUp_Disabled,
  2429. UINT nResourceID_ArrowDown_Normal,
  2430. UINT nResourceID_ArrowDown_Disabled,
  2431. bool bRotateArrowsAndBk270,
  2432. UINT nResourceID_BkEntire,
  2433. UINT nResourceID_BkPage,
  2434. const RECT & rcEntirePaddingR,
  2435. const RECT & rcEntirePaddingC
  2436. )
  2437. {
  2438. Empty();
  2439. INT i, j;
  2440. for( i = 0; i < INT(__ESBSPT_PART_COUNT); i++ )
  2441. {
  2442. for( j = 0; j < INT(__ESBMHT_PART_COUNT); j++ )
  2443. {
  2444. CRect & rcPadding = m_arrPartPadding[i][j];
  2445. rcPadding.SetRect( 0, 0, 0, 0 );
  2446. CExtBitmap & _bmp = m_arrPartBmp[i][j];
  2447. _bmp.Empty();
  2448. m_arrClrSolidBackground[i][j] = clrSolidBackground;
  2449. if( ( j == INT(__ESBMHT_PAGE_UP) || j == INT(__ESBMHT_PAGE_DOWN) )
  2450. && i == INT(__ESBSPT_PRESSED)
  2451. )
  2452. m_arrClrSolidBackground[i][j] = clrPressedPageAreas;
  2453. }
  2454. }
  2455. CExtBitmap _bmpBumpyGlyphStack, _bmpGripperStack;
  2456. VERIFY( _bmpBumpyGlyphStack.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_BumpyGlyphStack) ) );
  2457. VERIFY( _bmpGripperStack.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_GripperStack) ) );
  2458. _bmpBumpyGlyphStack.PreMultipliedRGBChannelsSet( true );
  2459. _bmpGripperStack.PreMultipliedRGBChannelsSet( true );
  2460. CSize _sizeBumpyGlyph = _bmpBumpyGlyphStack.GetSize();
  2461. CSize _sizeGripper = _bmpGripperStack.GetSize();
  2462. CRect rcBumpyGlyph( 0, 0, _sizeBumpyGlyph.cx, nBumpyGlyphStackItemHeight );
  2463. CRect rcGripper( 0, 0, _sizeGripper.cx, nGripperStackItemHeight );
  2464. // cold parts
  2465. VERIFY(
  2466. m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_THUMB)].
  2467. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  2468. );
  2469. m_arrPartPadding[INT(__ESBSPT_COLD)][INT(__ESBMHT_THUMB)] = rcBumpyGlyphStackItemPadding;
  2470. VERIFY(
  2471. m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_GLYPH_THUMB_GRIPPER)].
  2472. FromBitmap( _bmpGripperStack, rcGripper )
  2473. );
  2474. // normal parts
  2475. VERIFY(
  2476. m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_UP)].
  2477. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  2478. );
  2479. m_arrPartPadding[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_UP)] = rcBumpyGlyphStackItemPadding;
  2480. VERIFY(
  2481. m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_DOWN)].
  2482. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  2483. );
  2484. m_arrPartPadding[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_DOWN)] = rcBumpyGlyphStackItemPadding;
  2485. // hot parts
  2486. rcBumpyGlyph.OffsetRect( 0, nBumpyGlyphStackItemHeight );
  2487. rcGripper.OffsetRect( 0, nGripperStackItemHeight );
  2488. VERIFY(
  2489. m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_BUTTON_UP)].
  2490. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  2491. );
  2492. m_arrPartPadding[INT(__ESBSPT_HOT)][INT(__ESBMHT_BUTTON_UP)] = rcBumpyGlyphStackItemPadding;
  2493. VERIFY(
  2494. m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_BUTTON_DOWN)].
  2495. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  2496. );
  2497. m_arrPartPadding[INT(__ESBSPT_HOT)][INT(__ESBMHT_BUTTON_DOWN)] = rcBumpyGlyphStackItemPadding;
  2498. VERIFY(
  2499. m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_THUMB)].
  2500. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  2501. );
  2502. m_arrPartPadding[INT(__ESBSPT_HOT)][INT(__ESBMHT_THUMB)] = rcBumpyGlyphStackItemPadding;
  2503. VERIFY(
  2504. m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_GLYPH_THUMB_GRIPPER)].
  2505. FromBitmap( _bmpGripperStack, rcGripper )
  2506. );
  2507. // pressed parts
  2508. rcBumpyGlyph.OffsetRect( 0, nBumpyGlyphStackItemHeight );
  2509. rcGripper.OffsetRect( 0, nGripperStackItemHeight );
  2510. VERIFY(
  2511. m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_BUTTON_UP)].
  2512. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  2513. );
  2514. m_arrPartPadding[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_BUTTON_UP)] = rcBumpyGlyphStackItemPadding;
  2515. VERIFY(
  2516. m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_BUTTON_DOWN)].
  2517. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  2518. );
  2519. m_arrPartPadding[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_BUTTON_DOWN)] = rcBumpyGlyphStackItemPadding;
  2520. VERIFY(
  2521. m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_THUMB)].
  2522. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  2523. );
  2524. m_arrPartPadding[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_THUMB)] = rcBumpyGlyphStackItemPadding;
  2525. VERIFY(
  2526. m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_GLYPH_THUMB_GRIPPER)].
  2527. FromBitmap( _bmpGripperStack, rcGripper )
  2528. );
  2529. // arrows
  2530. CExtBitmap _bmpArrowUpNormal, _bmpArrowUpDisabled, _bmpArrowDownNormal, _bmpArrowDownDisabled;
  2531. VERIFY( _bmpArrowUpNormal.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ArrowUp_Normal) ) );
  2532. VERIFY( _bmpArrowUpDisabled.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ArrowUp_Disabled) ) );
  2533. VERIFY( _bmpArrowDownNormal.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ArrowDown_Normal) ) );
  2534. VERIFY( _bmpArrowDownDisabled.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ArrowDown_Disabled) ) );
  2535. _bmpArrowUpNormal.PreMultipliedRGBChannelsSet( true );
  2536. _bmpArrowUpDisabled.PreMultipliedRGBChannelsSet( true );
  2537. _bmpArrowDownNormal.PreMultipliedRGBChannelsSet( true );
  2538. _bmpArrowDownDisabled.PreMultipliedRGBChannelsSet( true );
  2539. CSize _sizeArrowUpNormal = _bmpArrowUpNormal.GetSize();
  2540. CSize _sizeArrowUpDisabled = _bmpArrowUpDisabled.GetSize();
  2541. CSize _sizeArrowDownNormal = _bmpArrowDownNormal.GetSize();
  2542. CSize _sizeArrowDownDisabled = _bmpArrowDownDisabled.GetSize();
  2543. VERIFY(
  2544. m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_GLYPH_ARROW_UP)].
  2545. CreateRotated9xStack(
  2546. _bmpArrowUpNormal,
  2547. bRotateArrowsAndBk270 ? 270 : 0,
  2548. 1,
  2549. _sizeArrowUpNormal.cx,
  2550. _sizeArrowUpNormal.cy,
  2551. false,
  2552. false
  2553. )
  2554. );
  2555. VERIFY(
  2556. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_GLYPH_ARROW_UP)].
  2557. CreateRotated9xStack(
  2558. _bmpArrowUpDisabled,
  2559. bRotateArrowsAndBk270 ? 270 : 0,
  2560. 1,
  2561. _sizeArrowUpDisabled.cx,
  2562. _sizeArrowUpDisabled.cy,
  2563. false,
  2564. false
  2565. )
  2566. );
  2567. VERIFY(
  2568. m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_GLYPH_ARROW_DOWN)].
  2569. CreateRotated9xStack(
  2570. _bmpArrowDownNormal,
  2571. bRotateArrowsAndBk270 ? 270 : 0,
  2572. 1,
  2573. _sizeArrowDownNormal.cx,
  2574. _sizeArrowDownNormal.cy,
  2575. false,
  2576. false
  2577. )
  2578. );
  2579. VERIFY(
  2580. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_GLYPH_ARROW_DOWN)].
  2581. CreateRotated9xStack(
  2582. _bmpArrowDownDisabled,
  2583. bRotateArrowsAndBk270 ? 270 : 0,
  2584. 1,
  2585. _sizeArrowDownDisabled.cx,
  2586. _sizeArrowDownDisabled.cy,
  2587. false,
  2588. false
  2589. )
  2590. );
  2591. // backgrounds
  2592. CExtBitmap _bmpBkEntire, _bmpBkPage;
  2593. VERIFY( _bmpBkEntire.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_BkEntire) ) );
  2594. VERIFY( _bmpBkPage.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_BkPage) ) );
  2595. _bmpBkEntire.PreMultipliedRGBChannelsSet( true );
  2596. _bmpBkPage.PreMultipliedRGBChannelsSet( true );
  2597. CSize _sizeBkEntire = _bmpBkEntire.GetSize();
  2598. CSize _sizeBkPage = _bmpBkPage.GetSize();
  2599. VERIFY(
  2600. m_bmpEntireArea.
  2601. CreateRotated9xStack(
  2602. _bmpBkEntire,
  2603. bRotateArrowsAndBk270 ? 270 : 0,
  2604. 1,
  2605. _sizeBkEntire.cx,
  2606. _sizeBkEntire.cy,
  2607. false,
  2608. false
  2609. )
  2610. );
  2611. VERIFY(
  2612. m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_PAGE_DOWN)].
  2613. CreateRotated9xStack(
  2614. _bmpBkPage,
  2615. bRotateArrowsAndBk270 ? 270 : 0,
  2616. 1,
  2617. _sizeBkPage.cx,
  2618. _sizeBkPage.cy,
  2619. false,
  2620. false
  2621. )
  2622. );
  2623. VERIFY(
  2624. m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_PAGE_UP)].AssignFromOther(
  2625. m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_PAGE_DOWN)]
  2626. )
  2627. );
  2628. m_rcEntirePaddingR = rcEntirePaddingR;
  2629. m_rcEntirePaddingC = rcEntirePaddingC;
  2630. }
  2631. void CExtPaintManager::SCROLLBARSKINDATA::Load2007_Zoom(
  2632. UINT nResourceID_ButtonPlus,
  2633. UINT nResourceID_ButtonMinus,
  2634. UINT nResourceID_ButtonThumb,
  2635. COLORREF clrZsLineLightEnabled,
  2636. COLORREF clrZsLineDarkEnabled,
  2637. COLORREF clrZsLineLightDisabled,
  2638. COLORREF clrZsLineDarkDisabled,
  2639. UINT nDockID,
  2640. bool bResourceColorChannelsPreMultiplied // = true
  2641. )
  2642. {
  2643. Empty();
  2644. ASSERT(
  2645. nDockID == AFX_IDW_DOCKBAR_TOP
  2646. || nDockID == AFX_IDW_DOCKBAR_BOTTOM
  2647. || nDockID == AFX_IDW_DOCKBAR_LEFT
  2648. || nDockID == AFX_IDW_DOCKBAR_RIGHT
  2649. );
  2650. INT nAngleCw90 = 0;
  2651. if(      nDockID == AFX_IDW_DOCKBAR_BOTTOM )
  2652.  nAngleCw90 = 180;
  2653. else if( nDockID == AFX_IDW_DOCKBAR_LEFT )
  2654.  nAngleCw90 = 270;
  2655. else if( nDockID == AFX_IDW_DOCKBAR_RIGHT )
  2656.  nAngleCw90 = 90;
  2657. INT i, j;
  2658. for( i = 0; i < INT(__ESBSPT_PART_COUNT); i++ )
  2659. {
  2660. for( j = 0; j < INT(__ESBMHT_PART_COUNT); j++ )
  2661. {
  2662. CRect & rcPadding = m_arrPartPadding[i][j];
  2663. rcPadding.SetRect( 0, 0, 0, 0 );
  2664. CExtBitmap & _bmp = m_arrPartBmp[i][j];
  2665. _bmp.Empty();
  2666. m_arrClrSolidBackground[i][j] = COLORREF(-1L);
  2667. }
  2668. }
  2669. m_clrZsLineLightEnabled = clrZsLineLightEnabled;
  2670. m_clrZsLineDarkEnabled = clrZsLineDarkEnabled;
  2671. m_clrZsLineLightDisabled = clrZsLineLightDisabled;
  2672. m_clrZsLineDarkDisabled = clrZsLineDarkDisabled;
  2673. CRect rcGlyph;
  2674. CExtBitmap _bmpGlyphStack;
  2675. VERIFY( _bmpGlyphStack.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ButtonPlus) ) );
  2676. _bmpGlyphStack.PreMultipliedRGBChannelsSet( bResourceColorChannelsPreMultiplied );
  2677. rcGlyph.SetRect( 0, 0, _bmpGlyphStack.GetSize().cx, _bmpGlyphStack.GetSize().cy / 3 );
  2678. VERIFY( m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_DOWN)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2679.         m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_BUTTON_DOWN)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_DOWN)];
  2680.         m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_DOWN)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_DOWN)];
  2681. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_DOWN)].MakeMono();
  2682. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_DOWN)].AdjustAlpha( -0.25 );
  2683. rcGlyph.OffsetRect( 0, rcGlyph.Height() );
  2684. VERIFY( m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_BUTTON_DOWN)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2685. rcGlyph.OffsetRect( 0, rcGlyph.Height() );
  2686. VERIFY( m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_BUTTON_DOWN)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2687. VERIFY( _bmpGlyphStack.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ButtonMinus) ) );
  2688. _bmpGlyphStack.PreMultipliedRGBChannelsSet( bResourceColorChannelsPreMultiplied );
  2689. rcGlyph.SetRect( 0, 0, _bmpGlyphStack.GetSize().cx, _bmpGlyphStack.GetSize().cy / 3 );
  2690. VERIFY( m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_UP)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2691.         m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_BUTTON_UP)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_UP)];
  2692.         m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_UP)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_UP)];
  2693. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_UP)].MakeMono();
  2694. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_UP)].AdjustAlpha( -0.25 );
  2695. rcGlyph.OffsetRect( 0, rcGlyph.Height() );
  2696. VERIFY( m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_BUTTON_UP)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2697. rcGlyph.OffsetRect( 0, rcGlyph.Height() );
  2698. VERIFY( m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_BUTTON_UP)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2699. VERIFY( _bmpGlyphStack.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ButtonThumb) ) );
  2700. _bmpGlyphStack.PreMultipliedRGBChannelsSet( bResourceColorChannelsPreMultiplied );
  2701. rcGlyph.SetRect( 0, 0, _bmpGlyphStack.GetSize().cx, _bmpGlyphStack.GetSize().cy / 3 );
  2702. VERIFY( m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_THUMB)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2703.         m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_THUMB)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_THUMB)];
  2704.         m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_THUMB)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_THUMB)];
  2705. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_THUMB)].MakeMono();
  2706. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_THUMB)].AdjustAlpha( -0.25 );
  2707. rcGlyph.OffsetRect( 0, rcGlyph.Height() );
  2708. VERIFY( m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_THUMB)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2709. rcGlyph.OffsetRect( 0, rcGlyph.Height() );
  2710. VERIFY( m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_THUMB)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2711. if( nAngleCw90 != 0 )
  2712. {
  2713. for( i = 0; i < INT(__ESBSPT_PART_COUNT); i++ )
  2714. {
  2715. CExtBitmap & _bmp1 = m_arrPartBmp[i][__ESBMHT_THUMB];
  2716. if( _bmp1.IsEmpty() )
  2717. continue;
  2718. CExtBitmap _bmp2;
  2719. VERIFY( _bmp2.CreateRotated9xStack( _bmp1, nAngleCw90, 1, _bmp1.GetSize().cx, _bmp1.GetSize().cy, false, false ) );
  2720. _bmp1 = _bmp2;
  2721. }
  2722. }
  2723. }
  2724. void CExtPaintManager::SCROLLBARSKINDATA::Load2010_Zoom_R1(
  2725. UINT nResourceID_ButtonPlus,
  2726. UINT nResourceID_ButtonMinus,
  2727. UINT nResourceID_ButtonThumb,
  2728. COLORREF clrZsLineLightEnabled,
  2729. COLORREF clrZsLineDarkEnabled,
  2730. COLORREF clrZsLineLightDisabled,
  2731. COLORREF clrZsLineDarkDisabled,
  2732. UINT nDockID,
  2733. bool bResourceColorChannelsPreMultiplied // = true
  2734. )
  2735. {
  2736. Empty();
  2737. ASSERT(
  2738. nDockID == AFX_IDW_DOCKBAR_TOP
  2739. || nDockID == AFX_IDW_DOCKBAR_BOTTOM
  2740. || nDockID == AFX_IDW_DOCKBAR_LEFT
  2741. || nDockID == AFX_IDW_DOCKBAR_RIGHT
  2742. );
  2743. INT nAngleCw90 = 0;
  2744. if(      nDockID == AFX_IDW_DOCKBAR_BOTTOM )
  2745.  nAngleCw90 = 180;
  2746. else if( nDockID == AFX_IDW_DOCKBAR_LEFT )
  2747.  nAngleCw90 = 270;
  2748. else if( nDockID == AFX_IDW_DOCKBAR_RIGHT )
  2749.  nAngleCw90 = 90;
  2750. INT i, j;
  2751. for( i = 0; i < INT(__ESBSPT_PART_COUNT); i++ )
  2752. {
  2753. for( j = 0; j < INT(__ESBMHT_PART_COUNT); j++ )
  2754. {
  2755. CRect & rcPadding = m_arrPartPadding[i][j];
  2756. rcPadding.SetRect( 0, 0, 0, 0 );
  2757. CExtBitmap & _bmp = m_arrPartBmp[i][j];
  2758. _bmp.Empty();
  2759. m_arrClrSolidBackground[i][j] = COLORREF(-1L);
  2760. }
  2761. }
  2762. m_clrZsLineLightEnabled = clrZsLineLightEnabled;
  2763. m_clrZsLineDarkEnabled = clrZsLineDarkEnabled;
  2764. m_clrZsLineLightDisabled = clrZsLineLightDisabled;
  2765. m_clrZsLineDarkDisabled = clrZsLineDarkDisabled;
  2766. CRect rcGlyph;
  2767. CExtBitmap _bmpGlyphStack;
  2768. VERIFY( _bmpGlyphStack.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ButtonPlus) ) );
  2769. _bmpGlyphStack.PreMultipliedRGBChannelsSet( bResourceColorChannelsPreMultiplied );
  2770. rcGlyph.SetRect( 0, 0, _bmpGlyphStack.GetSize().cx, _bmpGlyphStack.GetSize().cy / 3 );
  2771. VERIFY( m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_DOWN)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2772. m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_DOWN)].MakeMono();
  2773.         m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_BUTTON_DOWN)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_DOWN)];
  2774.         m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_DOWN)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_DOWN)];
  2775. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_DOWN)].MakeMono();
  2776. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_DOWN)].AdjustAlpha( -0.25 );
  2777. //rcGlyph.OffsetRect( 0, rcGlyph.Height() );
  2778. VERIFY( m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_BUTTON_DOWN)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2779. rcGlyph.OffsetRect( 0, rcGlyph.Height() );
  2780. VERIFY( m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_BUTTON_DOWN)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2781. VERIFY( _bmpGlyphStack.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ButtonMinus) ) );
  2782. _bmpGlyphStack.PreMultipliedRGBChannelsSet( bResourceColorChannelsPreMultiplied );
  2783. rcGlyph.SetRect( 0, 0, _bmpGlyphStack.GetSize().cx, _bmpGlyphStack.GetSize().cy / 3 );
  2784. VERIFY( m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_UP)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2785. m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_UP)].MakeMono();
  2786.         m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_BUTTON_UP)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_UP)];
  2787.         m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_UP)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_UP)];
  2788. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_UP)].MakeMono();
  2789. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_UP)].AdjustAlpha( -0.25 );
  2790. //rcGlyph.OffsetRect( 0, rcGlyph.Height() );
  2791. VERIFY( m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_BUTTON_UP)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2792. rcGlyph.OffsetRect( 0, rcGlyph.Height() );
  2793. VERIFY( m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_BUTTON_UP)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2794. VERIFY( _bmpGlyphStack.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ButtonThumb) ) );
  2795. _bmpGlyphStack.PreMultipliedRGBChannelsSet( bResourceColorChannelsPreMultiplied );
  2796. rcGlyph.SetRect( 0, 0, _bmpGlyphStack.GetSize().cx, _bmpGlyphStack.GetSize().cy / 2 /*3*/ );
  2797. VERIFY( m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_THUMB)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2798. m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_THUMB)].MakeMono();
  2799.         m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_THUMB)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_THUMB)];
  2800.         m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_THUMB)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_THUMB)];
  2801. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_THUMB)].MakeMono();
  2802. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_THUMB)].AdjustAlpha( -0.25 );
  2803. //rcGlyph.OffsetRect( 0, rcGlyph.Height() );
  2804. VERIFY( m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_THUMB)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2805. rcGlyph.OffsetRect( 0, rcGlyph.Height() );
  2806. VERIFY( m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_THUMB)].FromBitmap( _bmpGlyphStack, rcGlyph ) );
  2807. if( nAngleCw90 != 0 )
  2808. {
  2809. for( i = 0; i < INT(__ESBSPT_PART_COUNT); i++ )
  2810. {
  2811. CExtBitmap & _bmp1 = m_arrPartBmp[i][__ESBMHT_THUMB];
  2812. if( _bmp1.IsEmpty() )
  2813. continue;
  2814. CExtBitmap _bmp2;
  2815. VERIFY( _bmp2.CreateRotated9xStack( _bmp1, nAngleCw90, 1, _bmp1.GetSize().cx, _bmp1.GetSize().cy, false, false ) );
  2816. _bmp1 = _bmp2;
  2817. }
  2818. }
  2819. }
  2820. void CExtPaintManager::SCROLLBARSKINDATA::Load2010_Zoom_R2(
  2821. UINT nResourceID_ButtonPlus,
  2822. UINT nResourceID_ButtonMinus,
  2823. UINT nResourceID_ButtonThumb,
  2824. COLORREF clrZsLineLightEnabled,
  2825. COLORREF clrZsLineDarkEnabled,
  2826. COLORREF clrZsLineLightDisabled,
  2827. COLORREF clrZsLineDarkDisabled,
  2828. UINT nDockID,
  2829. bool bResourceColorChannelsPreMultiplied // = true
  2830. )
  2831. {
  2832. Empty();
  2833. ASSERT(
  2834. nDockID == AFX_IDW_DOCKBAR_TOP
  2835. || nDockID == AFX_IDW_DOCKBAR_BOTTOM
  2836. || nDockID == AFX_IDW_DOCKBAR_LEFT
  2837. || nDockID == AFX_IDW_DOCKBAR_RIGHT
  2838. );
  2839. INT nAngleCw90 = 0;
  2840. if(      nDockID == AFX_IDW_DOCKBAR_BOTTOM )
  2841.  nAngleCw90 = 180;
  2842. else if( nDockID == AFX_IDW_DOCKBAR_LEFT )
  2843.  nAngleCw90 = 270;
  2844. else if( nDockID == AFX_IDW_DOCKBAR_RIGHT )
  2845.  nAngleCw90 = 90;
  2846. INT i, j;
  2847. for( i = 0; i < INT(__ESBSPT_PART_COUNT); i++ )
  2848. {
  2849. for( j = 0; j < INT(__ESBMHT_PART_COUNT); j++ )
  2850. {
  2851. CRect & rcPadding = m_arrPartPadding[i][j];
  2852. rcPadding.SetRect( 0, 0, 0, 0 );
  2853. CExtBitmap & _bmp = m_arrPartBmp[i][j];
  2854. _bmp.Empty();
  2855. m_arrClrSolidBackground[i][j] = COLORREF(-1L);
  2856. }
  2857. }
  2858. m_clrZsLineLightEnabled = clrZsLineLightEnabled;
  2859. m_clrZsLineDarkEnabled = clrZsLineDarkEnabled;
  2860. m_clrZsLineLightDisabled = clrZsLineLightDisabled;
  2861. m_clrZsLineDarkDisabled = clrZsLineDarkDisabled;
  2862. CExtBitmap _bmpGlyphStack;
  2863. VERIFY( _bmpGlyphStack.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ButtonPlus) ) );
  2864. _bmpGlyphStack.PreMultipliedRGBChannelsSet( bResourceColorChannelsPreMultiplied );
  2865. CSize sizeStack = _bmpGlyphStack.GetSize();
  2866. CSize sizeGryph( sizeStack.cx, sizeStack.cy / 3 );
  2867. CRect rc1( 0, 0, sizeGryph.cx, sizeGryph.cy );
  2868. CRect rc2 = rc1; rc2.OffsetRect( 0, sizeGryph.cy );
  2869. CRect rc3 = rc2; rc3.OffsetRect( 0, sizeGryph.cy );
  2870. VERIFY( m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_DOWN)].FromBitmap( _bmpGlyphStack, rc3 ) );
  2871. //m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_DOWN)].MakeMono();
  2872.         m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_BUTTON_DOWN)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_DOWN)];
  2873.         m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_DOWN)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_DOWN)];
  2874. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_DOWN)].MakeMono();
  2875. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_DOWN)].AdjustAlpha( -0.25 );
  2876. VERIFY( m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_BUTTON_DOWN)].FromBitmap( _bmpGlyphStack, rc1 ) );
  2877. VERIFY( m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_BUTTON_DOWN)].FromBitmap( _bmpGlyphStack, rc2 ) );
  2878. VERIFY( _bmpGlyphStack.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ButtonMinus) ) );
  2879. _bmpGlyphStack.PreMultipliedRGBChannelsSet( bResourceColorChannelsPreMultiplied );
  2880. sizeStack = _bmpGlyphStack.GetSize();
  2881. sizeGryph.cx = sizeStack.cx; sizeGryph.cy = sizeStack.cy / 3;
  2882. rc1.SetRect( 0, 0, sizeGryph.cx, sizeGryph.cy );
  2883. rc2 = rc1; rc2.OffsetRect( 0, sizeGryph.cy );
  2884. rc3 = rc2; rc3.OffsetRect( 0, sizeGryph.cy );
  2885. VERIFY( m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_UP)].FromBitmap( _bmpGlyphStack, rc3 ) );
  2886. //m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_UP)].MakeMono();
  2887.         m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_BUTTON_UP)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_UP)];
  2888.         m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_UP)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_UP)];
  2889. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_UP)].MakeMono();
  2890. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_BUTTON_UP)].AdjustAlpha( -0.25 );
  2891. VERIFY( m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_BUTTON_UP)].FromBitmap( _bmpGlyphStack, rc1 ) );
  2892. VERIFY( m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_BUTTON_UP)].FromBitmap( _bmpGlyphStack, rc2 ) );
  2893. VERIFY( _bmpGlyphStack.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ButtonThumb) ) );
  2894. _bmpGlyphStack.PreMultipliedRGBChannelsSet( bResourceColorChannelsPreMultiplied );
  2895. sizeStack = _bmpGlyphStack.GetSize();
  2896. sizeGryph.cx = sizeStack.cx; sizeGryph.cy = sizeStack.cy / 3;
  2897. rc1.SetRect( 0, 0, sizeGryph.cx, sizeGryph.cy );
  2898. rc2 = rc1; rc2.OffsetRect( 0, sizeGryph.cy );
  2899. rc3 = rc2; rc3.OffsetRect( 0, sizeGryph.cy );
  2900. VERIFY( m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_THUMB)].FromBitmap( _bmpGlyphStack, rc1 ) );
  2901. //m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_THUMB)].MakeMono();
  2902.         m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_THUMB)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_THUMB)];
  2903.         m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_THUMB)] = m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_THUMB)];
  2904. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_THUMB)].MakeMono();
  2905. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_THUMB)].AdjustAlpha( -0.25 );
  2906. VERIFY( m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_THUMB)].FromBitmap( _bmpGlyphStack, rc2 ) );
  2907. VERIFY( m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_THUMB)].FromBitmap( _bmpGlyphStack, rc3 ) );
  2908. if( nAngleCw90 != 0 )
  2909. {
  2910. for( i = 0; i < INT(__ESBSPT_PART_COUNT); i++ )
  2911. {
  2912. CExtBitmap & _bmp1 = m_arrPartBmp[i][__ESBMHT_THUMB];
  2913. if( _bmp1.IsEmpty() )
  2914. continue;
  2915. CExtBitmap _bmp2;
  2916. VERIFY( _bmp2.CreateRotated9xStack( _bmp1, nAngleCw90, 1, _bmp1.GetSize().cx, _bmp1.GetSize().cy, false, false ) );
  2917. _bmp1 = _bmp2;
  2918. }
  2919. }
  2920. }
  2921. void CExtPaintManager::SCROLLBARSKINDATA::Load2007_R1(
  2922. UINT nResourceID_BumpyGlyphStack,
  2923. INT nBumpyGlyphStackItemHeight,
  2924. UINT nResourceID_GripperStack,
  2925. const RECT & rcBumpyGlyphStackItemPadding,
  2926. COLORREF clrSolidBackground,
  2927. COLORREF clrPressedPageAreas,
  2928. UINT nResourceID_ArrowUp_Normal,
  2929. UINT nResourceID_ArrowUp_Disabled,
  2930. UINT nResourceID_ArrowDown_Normal,
  2931. UINT nResourceID_ArrowDown_Disabled,
  2932. bool bRotateArrowsAndBk270,
  2933. UINT nResourceID_BkEntire,
  2934. UINT nResourceID_BkPage,
  2935. const RECT & rcEntirePaddingR,
  2936. const RECT & rcEntirePaddingC
  2937. )
  2938. {
  2939. Empty();
  2940. INT i, j;
  2941. for( i = 0; i < INT(__ESBSPT_PART_COUNT); i++ )
  2942. {
  2943. for( j = 0; j < INT(__ESBMHT_PART_COUNT); j++ )
  2944. {
  2945. CRect & rcPadding = m_arrPartPadding[i][j];
  2946. rcPadding.SetRect( 0, 0, 0, 0 );
  2947. CExtBitmap & _bmp = m_arrPartBmp[i][j];
  2948. _bmp.Empty();
  2949. m_arrClrSolidBackground[i][j] = clrSolidBackground;
  2950. if( ( j == INT(__ESBMHT_PAGE_UP) || j == INT(__ESBMHT_PAGE_DOWN) )
  2951. && i == INT(__ESBSPT_PRESSED)
  2952. )
  2953. m_arrClrSolidBackground[i][j] = clrPressedPageAreas;
  2954. }
  2955. }
  2956. CExtBitmap _bmpBumpyGlyphStack, _bmpGripperStack;
  2957. VERIFY( _bmpBumpyGlyphStack.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_BumpyGlyphStack) ) );
  2958. VERIFY( _bmpGripperStack.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_GripperStack) ) );
  2959. _bmpBumpyGlyphStack.PreMultipliedRGBChannelsSet( true );
  2960. _bmpGripperStack.PreMultipliedRGBChannelsSet( true );
  2961. CSize _sizeBumpyGlyph = _bmpBumpyGlyphStack.GetSize();
  2962. CSize _sizeGripper = _bmpGripperStack.GetSize();
  2963. CRect rcBumpyGlyph( 0, 0, _sizeBumpyGlyph.cx, nBumpyGlyphStackItemHeight );
  2964. CRect rcGripper( 0, 0, _sizeGripper.cx, _sizeGripper.cy );
  2965. // cold parts
  2966. rcBumpyGlyph.OffsetRect( 0, nBumpyGlyphStackItemHeight );
  2967. VERIFY(
  2968. m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_THUMB)].
  2969. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  2970. );
  2971. m_arrPartPadding[INT(__ESBSPT_COLD)][INT(__ESBMHT_THUMB)] = rcBumpyGlyphStackItemPadding;
  2972. VERIFY(
  2973. m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_GLYPH_THUMB_GRIPPER)].
  2974. FromBitmap( _bmpGripperStack, rcGripper )
  2975. );
  2976. // normal parts
  2977. VERIFY(
  2978. m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_UP)].
  2979. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  2980. );
  2981. m_arrPartPadding[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_UP)] = rcBumpyGlyphStackItemPadding;
  2982. VERIFY(
  2983. m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_DOWN)].
  2984. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  2985. );
  2986. m_arrPartPadding[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_DOWN)] = rcBumpyGlyphStackItemPadding;
  2987. // hot parts
  2988. rcBumpyGlyph.OffsetRect( 0, nBumpyGlyphStackItemHeight );
  2989. //rcGripper.OffsetRect( 0, nGripperStackItemHeight );
  2990. VERIFY(
  2991. m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_BUTTON_UP)].
  2992. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  2993. );
  2994. m_arrPartPadding[INT(__ESBSPT_HOT)][INT(__ESBMHT_BUTTON_UP)] = rcBumpyGlyphStackItemPadding;
  2995. VERIFY(
  2996. m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_BUTTON_DOWN)].
  2997. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  2998. );
  2999. m_arrPartPadding[INT(__ESBSPT_HOT)][INT(__ESBMHT_BUTTON_DOWN)] = rcBumpyGlyphStackItemPadding;
  3000. VERIFY(
  3001. m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_THUMB)].
  3002. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  3003. );
  3004. m_arrPartPadding[INT(__ESBSPT_HOT)][INT(__ESBMHT_THUMB)] = rcBumpyGlyphStackItemPadding;
  3005. VERIFY(
  3006. m_arrPartBmp[INT(__ESBSPT_HOT)][INT(__ESBMHT_GLYPH_THUMB_GRIPPER)].
  3007. FromBitmap( _bmpGripperStack, rcGripper )
  3008. );
  3009. // pressed parts
  3010. rcBumpyGlyph.OffsetRect( 0, nBumpyGlyphStackItemHeight );
  3011. //rcGripper.OffsetRect( 0, nGripperStackItemHeight );
  3012. VERIFY(
  3013. m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_BUTTON_UP)].
  3014. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  3015. );
  3016. m_arrPartPadding[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_BUTTON_UP)] = rcBumpyGlyphStackItemPadding;
  3017. VERIFY(
  3018. m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_BUTTON_DOWN)].
  3019. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  3020. );
  3021. m_arrPartPadding[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_BUTTON_DOWN)] = rcBumpyGlyphStackItemPadding;
  3022. VERIFY(
  3023. m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_THUMB)].
  3024. FromBitmap( _bmpBumpyGlyphStack, rcBumpyGlyph )
  3025. );
  3026. m_arrPartPadding[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_THUMB)] = rcBumpyGlyphStackItemPadding;
  3027. VERIFY(
  3028. m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_GLYPH_THUMB_GRIPPER)].
  3029. FromBitmap( _bmpGripperStack, rcGripper )
  3030. );
  3031. // arrows
  3032. CExtBitmap _bmpArrowUpNormal, _bmpArrowUpDisabled, _bmpArrowDownNormal, _bmpArrowDownDisabled;
  3033. VERIFY( _bmpArrowUpNormal.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ArrowUp_Normal) ) );
  3034. VERIFY( _bmpArrowUpDisabled.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ArrowUp_Disabled) ) );
  3035. VERIFY( _bmpArrowDownNormal.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ArrowDown_Normal) ) );
  3036. VERIFY( _bmpArrowDownDisabled.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_ArrowDown_Disabled) ) );
  3037. //  _bmpArrowUpNormal.PreMultipliedRGBChannelsSet( true );
  3038. //  _bmpArrowUpDisabled.PreMultipliedRGBChannelsSet( true );
  3039. //  _bmpArrowDownNormal.PreMultipliedRGBChannelsSet( true );
  3040. //  _bmpArrowDownDisabled.PreMultipliedRGBChannelsSet( true );
  3041. CSize _sizeArrowUpNormal = _bmpArrowUpNormal.GetSize();
  3042. CSize _sizeArrowUpDisabled = _bmpArrowUpDisabled.GetSize();
  3043. CSize _sizeArrowDownNormal = _bmpArrowDownNormal.GetSize();
  3044. CSize _sizeArrowDownDisabled = _bmpArrowDownDisabled.GetSize();
  3045. VERIFY(
  3046. m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_GLYPH_ARROW_UP)].
  3047. CreateRotated9xStack(
  3048. _bmpArrowUpNormal,
  3049. bRotateArrowsAndBk270 ? 270 : 0,
  3050. 1,
  3051. _sizeArrowUpNormal.cx,
  3052. _sizeArrowUpNormal.cy,
  3053. false,
  3054. false
  3055. )
  3056. );
  3057. VERIFY(
  3058. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_GLYPH_ARROW_UP)].
  3059. CreateRotated9xStack(
  3060. _bmpArrowUpDisabled,
  3061. bRotateArrowsAndBk270 ? 270 : 0,
  3062. 1,
  3063. _sizeArrowUpDisabled.cx,
  3064. _sizeArrowUpDisabled.cy,
  3065. false,
  3066. false
  3067. )
  3068. );
  3069. VERIFY(
  3070. m_arrPartBmp[INT(__ESBSPT_COLD)][INT(__ESBMHT_GLYPH_ARROW_DOWN)].
  3071. CreateRotated9xStack(
  3072. _bmpArrowDownNormal,
  3073. bRotateArrowsAndBk270 ? 270 : 0,
  3074. 1,
  3075. _sizeArrowDownNormal.cx,
  3076. _sizeArrowDownNormal.cy,
  3077. false,
  3078. false
  3079. )
  3080. );
  3081. VERIFY(
  3082. m_arrPartBmp[INT(__ESBSPT_DISABLED)][INT(__ESBMHT_GLYPH_ARROW_DOWN)].
  3083. CreateRotated9xStack(
  3084. _bmpArrowDownDisabled,
  3085. bRotateArrowsAndBk270 ? 270 : 0,
  3086. 1,
  3087. _sizeArrowDownDisabled.cx,
  3088. _sizeArrowDownDisabled.cy,
  3089. false,
  3090. false
  3091. )
  3092. );
  3093. // backgrounds
  3094. CExtBitmap _bmpBkEntire, _bmpBkPage;
  3095. VERIFY( _bmpBkEntire.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_BkEntire) ) );
  3096. VERIFY( _bmpBkPage.LoadBMP_Resource( MAKEINTRESOURCE(nResourceID_BkPage) ) );
  3097. _bmpBkEntire.PreMultipliedRGBChannelsSet( true );
  3098. _bmpBkPage.PreMultipliedRGBChannelsSet( true );
  3099. CSize _sizeBkEntire = _bmpBkEntire.GetSize();
  3100. CSize _sizeBkPage = _bmpBkPage.GetSize();
  3101. VERIFY(
  3102. m_bmpEntireArea.
  3103. CreateRotated9xStack(
  3104. _bmpBkEntire,
  3105. bRotateArrowsAndBk270 ? 270 : 0,
  3106. 1,
  3107. _sizeBkEntire.cx,
  3108. _sizeBkEntire.cy,
  3109. false,
  3110. false
  3111. )
  3112. );
  3113. VERIFY(
  3114. m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_PAGE_DOWN)].
  3115. CreateRotated9xStack(
  3116. _bmpBkPage,
  3117. bRotateArrowsAndBk270 ? 270 : 0,
  3118. 1,
  3119. _sizeBkPage.cx,
  3120. _sizeBkPage.cy,
  3121. false,
  3122. false
  3123. )
  3124. );
  3125. VERIFY(
  3126. m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_PAGE_UP)].AssignFromOther(
  3127. m_arrPartBmp[INT(__ESBSPT_PRESSED)][INT(__ESBMHT_PAGE_DOWN)]
  3128. )
  3129. );
  3130. m_rcEntirePaddingR = rcEntirePaddingR;
  3131. m_rcEntirePaddingC = rcEntirePaddingC;
  3132. }
  3133. CExtPaintManager::PAINTSCROLLBARDATA::PAINTSCROLLBARDATA()
  3134. : m_bHorzBar( false )
  3135. , m_bEnabled( false )
  3136. , m_bHoveredAreaIsPressed( false )
  3137. , m_bHelperLightAccent( true )
  3138. , m_eSBMHT( CExtPaintManager::__ESBMHT_NOWHERE )
  3139. , m_rcBar( 0, 0, 0, 0 )
  3140. , m_rcButtonUp( 0, 0, 0, 0 )
  3141. , m_rcButtonDown( 0, 0, 0, 0 )
  3142. , m_rcThumb( 0, 0, 0, 0 )
  3143. , m_rcPageUp( 0, 0, 0, 0 )
  3144. , m_rcPageDown( 0, 0, 0, 0 )
  3145. , m_pHelperSrc( NULL )
  3146. , m_lParam( 0L )
  3147. , m_rcScrollableArea( 0, 0, 0, 0 )
  3148. {
  3149. m_DSI.cbSize = sizeof(SCROLLINFO);
  3150. ::memset( &m_DSI, 0, sizeof(SCROLLINFO) );
  3151. }
  3152. CExtPaintManager::PAINTSCROLLBARDATA::PAINTSCROLLBARDATA(
  3153. bool bHorzBar,
  3154. bool bEnabled,
  3155. bool bHoveredAreaIsPressed,
  3156. CExtPaintManager::e_scroll_bar_mouse_hover_type_t eSBMHT,
  3157. const RECT & rcBar,
  3158. const RECT & rcButtonUp,
  3159. const RECT & rcButtonDown,
  3160. const RECT & rcThumb,
  3161. const RECT & rcPageUp,
  3162. const RECT & rcPageDown,
  3163. CObject * pHelperSrc, // = NULL
  3164. LPARAM lParam // = 0L
  3165. )
  3166. : m_bHorzBar( bHorzBar )
  3167. , m_bEnabled( bEnabled )
  3168. , m_bHoveredAreaIsPressed( bHoveredAreaIsPressed )
  3169. , m_bHelperLightAccent( true )
  3170. , m_eSBMHT( eSBMHT )
  3171. , m_rcBar( rcBar )
  3172. , m_rcButtonUp( rcButtonUp )
  3173. , m_rcButtonDown( rcButtonDown )
  3174. , m_rcThumb( rcThumb )
  3175. , m_rcPageUp( rcPageUp )
  3176. , m_rcPageDown( rcPageDown )
  3177. , m_pHelperSrc( pHelperSrc )
  3178. , m_lParam( lParam )
  3179. {
  3180. if( m_bHorzBar )
  3181. m_rcScrollableArea.SetRect(
  3182. m_rcButtonUp.right,
  3183. m_rcButtonUp.top,
  3184. m_rcButtonDown.left,
  3185. m_rcButtonDown.bottom
  3186. );
  3187. else
  3188. m_rcScrollableArea.SetRect(
  3189. m_rcButtonUp.left,
  3190. m_rcButtonUp.bottom,
  3191. m_rcButtonDown.right,
  3192. m_rcButtonDown.top
  3193. );
  3194. m_DSI.cbSize = sizeof(SCROLLINFO);
  3195. ::memset( &m_DSI, 0, sizeof(SCROLLINFO) );
  3196. }
  3197. CExtPaintManager::PAINTSCROLLBARDATA::PAINTSCROLLBARDATA(
  3198. CExtScrollBar * pExtScrollBar,
  3199. bool bHoveredAreaIsPressed, // false
  3200. CExtPaintManager::e_scroll_bar_mouse_hover_type_t eSBMHT, // = CExtPaintManager::__ESBMHT_NOWHERE
  3201. LPARAM lParam // = 0L
  3202. )
  3203. : m_bHorzBar( false )
  3204. , m_bEnabled( false )
  3205. , m_bHoveredAreaIsPressed( bHoveredAreaIsPressed )
  3206. , m_bHelperLightAccent( true )
  3207. , m_eSBMHT( eSBMHT )
  3208. , m_rcBar( 0, 0, 0, 0 )
  3209. , m_rcButtonUp( 0, 0, 0, 0 )
  3210. , m_rcButtonDown( 0, 0, 0, 0 )
  3211. , m_rcThumb( 0, 0, 0, 0 )
  3212. , m_rcPageUp( 0, 0, 0, 0 )
  3213. , m_rcPageDown( 0, 0, 0, 0 )
  3214. , m_pHelperSrc( pExtScrollBar )
  3215. , m_lParam( lParam )
  3216. {
  3217. m_DSI.cbSize = sizeof(SCROLLINFO);
  3218. ::memset( &m_DSI, 0, sizeof(SCROLLINFO) );
  3219. if( pExtScrollBar == NULL )
  3220. return;
  3221. ASSERT_VALID( pExtScrollBar );
  3222. CExtScrollBar::eScrollerOrientation_t _eSO = pExtScrollBar->GetScrollerOrientation();
  3223. if( _eSO != CExtScrollBar::__ESO_TOP
  3224. && _eSO != CExtScrollBar::__ESO_BOTTOM
  3225. && _eSO != CExtScrollBar::__ESO_LEFT
  3226. && _eSO != CExtScrollBar::__ESO_RIGHT
  3227. )
  3228. return;
  3229. m_bHorzBar =
  3230. ( _eSO == CExtScrollBar::__ESO_TOP
  3231. || _eSO == CExtScrollBar::__ESO_BOTTOM
  3232. )
  3233. ? true : false;
  3234. pExtScrollBar->GetClientRect( &m_rcBar );
  3235. SCROLLINFO _scroll_info;
  3236. ::memset( &_scroll_info, 0, sizeof(SCROLLINFO) );
  3237. if( pExtScrollBar->IsWindowEnabled() )
  3238. {
  3239. m_bEnabled = true;
  3240. _scroll_info.cbSize = sizeof(SCROLLINFO);
  3241. if( ! pExtScrollBar->GetScrollInfo(
  3242. &_scroll_info,
  3243. SIF_ALL
  3244. )
  3245. )
  3246. {
  3247. pExtScrollBar->GetScrollRange(
  3248. &_scroll_info.nMin,
  3249. &_scroll_info.nMax
  3250. );
  3251. _scroll_info.nPage = 0;
  3252. _scroll_info.nTrackPos
  3253. = _scroll_info.nPos
  3254. = pExtScrollBar->GetScrollPos();
  3255. }
  3256. // if( pExtScrollBar->m_nHelperTrackPos != -1 )
  3257. // _scroll_info.nTrackPos = pExtScrollBar->m_nHelperTrackPos;
  3258. __EXT_MFC_MEMCPY( 
  3259. &m_DSI,
  3260. sizeof(SCROLLINFO),
  3261. &_scroll_info, 
  3262. sizeof(SCROLLINFO) 
  3263. );
  3264. _scroll_info.nTrackPos -= _scroll_info.nMin;
  3265. _scroll_info.nPos -= _scroll_info.nMin;
  3266. _scroll_info.nMax -= _scroll_info.nMin;
  3267. _scroll_info.nMin = 0;
  3268. } // if( pExtScrollBar->IsWindowEnabled() )
  3269. else
  3270. __EXT_MFC_MEMCPY( 
  3271. &m_DSI,
  3272. sizeof(SCROLLINFO),
  3273. &_scroll_info, 
  3274. sizeof(SCROLLINFO) 
  3275. );
  3276. if( _scroll_info.nMin < _scroll_info.nMax
  3277. && _scroll_info.nMax < (INT_MAX-1)
  3278. && _scroll_info.nPage > 0
  3279. && _scroll_info.nPage == UINT( _scroll_info.nMax - _scroll_info.nMin )
  3280. )
  3281. {
  3282. // layout issue
  3283. _scroll_info.nMax ++;
  3284. if( _scroll_info.nPos > 0 )
  3285. _scroll_info.nPos ++;
  3286. if( _scroll_info.nTrackPos > 0 )
  3287. _scroll_info.nTrackPos ++;
  3288. }
  3289. INT nScrollLimit = 0, nExtentMD = 0, nExtentThumb = 0, nExtentBtn = 0, nExtentThumbMin = 4;
  3290. nScrollLimit =
  3291.   _scroll_info.nMax
  3292. - _scroll_info.nMin
  3293. - _scroll_info.nPage
  3294. + 1
  3295. ;
  3296. ASSERT( nScrollLimit >= 0 );
  3297. INT nScrollTotalRange = _scroll_info.nMax;
  3298. if( pExtScrollBar->IsKindOf( RUNTIME_CLASS(CExtZoomScrollBar) ) )
  3299. {
  3300. CExtPaintManager::SCROLLBARSKINDATA * _pSBSD =
  3301. pExtScrollBar->PmBridge_GetPM()->
  3302. ScrollBar_GetSkinData(
  3303. m_bHorzBar, pExtScrollBar, lParam, false );
  3304. if( _pSBSD != NULL )
  3305. {
  3306. CExtBitmap & _bmpSkinnedButtonUp =
  3307. _pSBSD->m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_BUTTON_UP)];
  3308. ASSERT( ! _bmpSkinnedButtonUp.IsEmpty() );
  3309. CExtBitmap & _bmpSkinnedButtonThumb =
  3310. _pSBSD->m_arrPartBmp[INT(__ESBSPT_NORMAL)][INT(__ESBMHT_THUMB)];
  3311. ASSERT( ! _bmpSkinnedButtonUp.IsEmpty() );
  3312. CExtPaintManager * pPM = pExtScrollBar->PmBridge_GetPM();
  3313. ASSERT_VALID( pPM );
  3314. if( m_bHorzBar )
  3315. {
  3316. nExtentBtn   = _bmpSkinnedButtonUp.GetSize().cx;
  3317. nExtentThumb = nExtentThumbMin = _bmpSkinnedButtonThumb.GetSize().cx;
  3318. nExtentBtn   = pPM->UiScalingDo( nExtentBtn, CExtPaintManager::__EUIST_X );
  3319. nExtentThumb = pPM->UiScalingDo( nExtentThumb, CExtPaintManager::__EUIST_X );
  3320. }
  3321. else
  3322. {
  3323. nExtentBtn = _bmpSkinnedButtonUp.GetSize().cy;
  3324. nExtentThumb = nExtentThumbMin = _bmpSkinnedButtonThumb.GetSize().cy;
  3325. nExtentBtn   = pPM->UiScalingDo( nExtentBtn, CExtPaintManager::__EUIST_Y );
  3326. nExtentThumb = pPM->UiScalingDo( nExtentThumb, CExtPaintManager::__EUIST_Y );
  3327. }
  3328. } // if( _pSBSD != NULL )
  3329. else
  3330. {
  3331. if( m_bHorzBar )
  3332. {
  3333. nExtentBtn = pExtScrollBar->m_nHorzButtonWidth;
  3334. nExtentThumb = nExtentThumbMin = pExtScrollBar->m_nHorzThumbMinWidth;
  3335. }
  3336. else
  3337. {
  3338. nExtentBtn = pExtScrollBar->m_nVertButtonHeight;
  3339. nExtentThumb = nExtentThumbMin = pExtScrollBar->m_nVertThumbMinHeight;
  3340. }
  3341. } // else from if( _pSBSD != NULL )
  3342. } // if( pExtScrollBar->IsKindOf( RUNTIME_CLASS(CExtZoomScrollBar) ) )
  3343. else
  3344. {
  3345. if( m_bHorzBar )
  3346. {
  3347. nExtentBtn = pExtScrollBar->m_nHorzButtonWidth;
  3348. nExtentThumbMin = pExtScrollBar->m_nHorzThumbMinWidth;
  3349. }
  3350. else
  3351. {
  3352. nExtentBtn = pExtScrollBar->m_nVertButtonHeight;
  3353. nExtentThumbMin = pExtScrollBar->m_nVertThumbMinHeight;
  3354. }
  3355. if( nScrollLimit > 0L )
  3356. {
  3357. if( _scroll_info.nPage == 0 )
  3358. {
  3359. nExtentThumb = nExtentBtn;
  3360. if( nExtentThumb == 0 )
  3361. nExtentThumb = 6;
  3362. } // if( _scroll_info.nPage == 0 )
  3363. else
  3364. {
  3365. if( nScrollTotalRange > INT(_scroll_info.nPage) )
  3366. {
  3367. nExtentMD = nScrollTotalRange/_scroll_info.nPage;
  3368. } // if( nScrollTotalRange > _scroll_info.nPage )
  3369. } // else from if( _scroll_info.nPage == 0 )
  3370. } // if( nScrollLimit > 0L )
  3371. } // else from if( pExtScrollBar->IsKindOf( RUNTIME_CLASS(CExtZoomScrollBar) ) )
  3372. if( ! m_bEnabled )
  3373. nExtentThumb = nExtentThumbMin = 0;
  3374. CRect rcScrollable = m_rcBar;
  3375. m_rcButtonUp = m_rcBar;
  3376. m_rcButtonDown = m_rcBar;
  3377. if( m_bHorzBar )
  3378. {
  3379. rcScrollable.DeflateRect( nExtentBtn, 0 );
  3380. m_rcButtonUp.right = m_rcButtonUp.left + nExtentBtn;
  3381. m_rcButtonDown.left = m_rcButtonDown.right - nExtentBtn;
  3382. if( rcScrollable.Width() > 5 )
  3383. {
  3384. if( nExtentThumb == 0 && nExtentMD != 0L )
  3385. nExtentThumb =
  3386. ::MulDiv( rcScrollable.Width(), _scroll_info.nPage, nScrollTotalRange );
  3387. if( m_bEnabled && /*nExtentThumb != 0 &&*/ nExtentThumb < nExtentThumbMin )
  3388. nExtentThumb = nExtentThumbMin;
  3389. if( nExtentThumb != 0 )
  3390. {
  3391. m_rcThumb = rcScrollable;
  3392. m_rcThumb.right = m_rcThumb.left + nExtentThumb;
  3393. if( nScrollLimit > 0 )
  3394. {
  3395. INT nRestSpace = rcScrollable.Width() - m_rcThumb.Width();
  3396. if( nRestSpace < 0 )
  3397. nRestSpace = 0;
  3398. INT nOffset = ::MulDiv( nRestSpace, _scroll_info.nTrackPos, nScrollLimit );
  3399. m_rcThumb.OffsetRect( nOffset, 0 );
  3400. if( _scroll_info.nTrackPos > 0 )
  3401. {
  3402. m_rcPageUp = rcScrollable;
  3403. m_rcPageUp.right = m_rcThumb.left;
  3404. }
  3405. if( _scroll_info.nTrackPos < nScrollLimit )
  3406. {
  3407. m_rcPageDown = rcScrollable;
  3408. m_rcPageDown.left = m_rcThumb.right;
  3409. }
  3410. } // if( nScrollLimit > 0 )
  3411. } // if( nExtentThumb != 0 )
  3412. } // if( rcScrollable.Width() > 5 )
  3413. if( (! m_rcButtonUp.IsRectEmpty() )
  3414. && (! m_rcButtonDown.IsRectEmpty() )
  3415. && m_rcButtonUp.right > m_rcButtonDown.left
  3416. )
  3417. {
  3418. m_rcButtonUp.right
  3419. = m_rcButtonDown.left
  3420. = m_rcButtonUp.left
  3421. + ( m_rcButtonDown.right - m_rcButtonUp.left ) / 2;
  3422. m_rcPageUp.SetRect( 0, 0, 0, 0 );
  3423. m_rcPageDown.SetRect( 0, 0, 0, 0 );
  3424. m_rcThumb.SetRect( 0, 0, 0, 0 );
  3425. }
  3426. } // if( m_bHorzBar )
  3427. else
  3428. {
  3429. rcScrollable.DeflateRect( 0, nExtentBtn );
  3430. m_rcButtonUp.bottom = m_rcButtonUp.top + nExtentBtn;
  3431. m_rcButtonDown.top = m_rcButtonDown.bottom - nExtentBtn;
  3432. if( rcScrollable.Height() > 5 )
  3433. {
  3434. if( nExtentThumb == 0 && nExtentMD != 0L )
  3435. nExtentThumb =
  3436. ::MulDiv( rcScrollable.Height(), _scroll_info.nPage, nScrollTotalRange );
  3437. if( m_bEnabled && /*nExtentThumb != 0 &&*/ nExtentThumb < nExtentThumbMin )
  3438. nExtentThumb = nExtentThumbMin;
  3439. if( nExtentThumb != 0 )
  3440. {
  3441. m_rcThumb = rcScrollable;
  3442. m_rcThumb.bottom = m_rcThumb.top + nExtentThumb;
  3443. if( nScrollLimit > 0 )
  3444. {
  3445. INT nRestSpace = rcScrollable.Height() - m_rcThumb.Height();
  3446. if( nRestSpace < 0 )
  3447. nRestSpace = 0;
  3448. INT nOffset = ::MulDiv( nRestSpace, _scroll_info.nTrackPos, nScrollLimit );
  3449. m_rcThumb.OffsetRect( 0, nOffset );
  3450. if( _scroll_info.nTrackPos > 0 )
  3451. {
  3452. m_rcPageUp = rcScrollable;
  3453. m_rcPageUp.bottom = m_rcThumb.top;
  3454. }
  3455. if( _scroll_info.nTrackPos < nScrollLimit )
  3456. {
  3457. m_rcPageDown = rcScrollable;
  3458. m_rcPageDown.top = m_rcThumb.bottom;
  3459. }
  3460. } // if( nScrollLimit > 0 )
  3461. } // if( nExtentThumb != 0 )
  3462. } // if( rcScrollable.Height() > 5 )
  3463. if( (! m_rcButtonUp.IsRectEmpty() )
  3464. && (! m_rcButtonDown.IsRectEmpty() )
  3465. && m_rcButtonUp.bottom > m_rcButtonDown.top
  3466. )
  3467. {
  3468. m_rcButtonUp.bottom
  3469. = m_rcButtonDown.top
  3470. = m_rcButtonUp.top
  3471. + ( m_rcButtonDown.bottom - m_rcButtonUp.top ) / 2;
  3472. m_rcPageUp.SetRect( 0, 0, 0, 0 );
  3473. m_rcPageDown.SetRect( 0, 0, 0, 0 );
  3474. m_rcThumb.SetRect( 0, 0, 0, 0 );
  3475. }
  3476. } // else from if( m_bHorzBar )
  3477. if( m_bHorzBar )
  3478. m_rcScrollableArea.SetRect(
  3479. m_rcButtonUp.right,
  3480. m_rcButtonUp.top,
  3481. m_rcButtonDown.left,
  3482. m_rcButtonDown.bottom
  3483. );
  3484. else
  3485. m_rcScrollableArea.SetRect(
  3486. m_rcButtonUp.left,
  3487. m_rcButtonUp.bottom,
  3488. m_rcButtonDown.right,
  3489. m_rcButtonDown.top
  3490. );
  3491. }
  3492. CExtPaintManager::PAINTSCROLLBARDATA::~PAINTSCROLLBARDATA()
  3493. {
  3494. }
  3495. COLORREF CExtPaintManager::stat_PaintShadedEllipse_ComputeColorValue(
  3496. double lfA,
  3497. COLORREF clrShadeAccentLight,
  3498. COLORREF clrShadeAccentDark
  3499. )
  3500. {
  3501. double lfD = - 2.356 - lfA;
  3502. if( lfD < ( - 3.1415926535897932384626433832795 ) )
  3503. lfD = 6.293 + lfD;
  3504. else if( lfD > 3.1415926535897932384626433832795 )
  3505. lfD = 6.293 - lfD;
  3506. double lfW = ( ::cos( lfD ) + 1.0 ) *  0.5;
  3507. return
  3508. RGB(
  3509. BYTE( lfW * GetRValue( clrShadeAccentLight ) + ( 1.0 - lfW ) * GetRValue( clrShadeAccentDark ) ),
  3510. BYTE( lfW * GetGValue( clrShadeAccentLight ) + ( 1.0 - lfW ) * GetGValue( clrShadeAccentDark ) ),
  3511. BYTE( lfW * GetBValue( clrShadeAccentLight ) + ( 1.0 - lfW ) * GetBValue( clrShadeAccentDark ) )
  3512. );
  3513. }
  3514. void CExtPaintManager::stat_PaintShadedEllipse(
  3515. HDC hDC,
  3516. const POINT & ptEllipseCenter,
  3517. LONG nRadiusH,
  3518. LONG nRadiusV,
  3519. COLORREF clrShadeAccentLight,
  3520. COLORREF clrShadeAccentDark
  3521. )
  3522. {
  3523. ASSERT(
  3524. hDC != NULL
  3525. && ( ptEllipseCenter.x + nRadiusH <= LONG_MAX )
  3526. && ( ptEllipseCenter.y + nRadiusV <= LONG_MAX )
  3527. && ( ptEllipseCenter.x - nRadiusH  >= LONG_MIN )
  3528. && ( ptEllipseCenter.y - nRadiusV  >= LONG_MIN )
  3529. );
  3530. LONG nX = nRadiusH, nY = 0, nBoxSquare = nRadiusH * nRadiusH;
  3531. LONG nTemp0 = 8 * nRadiusH * nRadiusV * nRadiusV; 
  3532. LONG nTemp1 = 0;
  3533. LONG nTemp2 = 4 * nBoxSquare - nRadiusH * 4 * nRadiusV * nRadiusV + nRadiusV * nRadiusV; 
  3534. LONG nTemp3 = nBoxSquare - nTemp0 + 4 * nRadiusV * nRadiusV;
  3535. for( ; nTemp3 < 0; )
  3536. {
  3537. double lfA = double( ::atan2( double(nY), double(nX) ) );
  3538. COLORREF clr = stat_PaintShadedEllipse_ComputeColorValue( lfA, clrShadeAccentLight, clrShadeAccentDark );
  3539. ::SetPixelV( hDC, ptEllipseCenter.x + nX, ptEllipseCenter.y + nY, clr );
  3540. clr = stat_PaintShadedEllipse_ComputeColorValue( 3.1415926535897932384626433832795 - lfA, clrShadeAccentLight, clrShadeAccentDark );
  3541. ::SetPixelV( hDC, ptEllipseCenter.x - nX, ptEllipseCenter.y + nY, clr );
  3542. clr = stat_PaintShadedEllipse_ComputeColorValue( -3.1415926535897932384626433832795 + lfA, clrShadeAccentLight, clrShadeAccentDark );
  3543. ::SetPixelV( hDC, ptEllipseCenter.x - nX, ptEllipseCenter.y - nY, clr );
  3544. clr = stat_PaintShadedEllipse_ComputeColorValue( -lfA, clrShadeAccentLight, clrShadeAccentDark );
  3545. ::SetPixelV( hDC, ptEllipseCenter.x + nX, ptEllipseCenter.y - nY, clr );
  3546. nY ++; 
  3547. nTemp1 = nTemp1 + 8 * nBoxSquare; 
  3548. if( nTemp2 < 0 )
  3549. {
  3550. nTemp2 = nTemp2 + nTemp1 + 4 * nBoxSquare;
  3551. nTemp3 = nTemp3 + nTemp1;
  3552. }
  3553. else 
  3554. {
  3555. nX --;
  3556. nTemp0 = nTemp0 - 8 * nRadiusV * nRadiusV;
  3557. nTemp2 = nTemp2 - nTemp0 + nTemp1 + 4 * nBoxSquare;
  3558. nTemp3 = nTemp3 - nTemp0 + nTemp1 + 4 * nRadiusV * nRadiusV; 
  3559. }  // for( ; nTemp3 < 0; )
  3560. for( ; true; )
  3561. {
  3562. double lfA = double( ::atan2( double(nY), double(nX) ) );
  3563. COLORREF clr = stat_PaintShadedEllipse_ComputeColorValue( lfA, clrShadeAccentLight, clrShadeAccentDark );
  3564. ::SetPixelV( hDC, ptEllipseCenter.x + nX, ptEllipseCenter.y + nY, clr );
  3565. clr = stat_PaintShadedEllipse_ComputeColorValue( 3.1415926535897932384626433832795 - lfA, clrShadeAccentLight, clrShadeAccentDark );
  3566. ::SetPixelV( hDC, ptEllipseCenter.x - nX, ptEllipseCenter.y + nY, clr );
  3567. clr = stat_PaintShadedEllipse_ComputeColorValue( -3.1415926535897932384626433832795 + lfA, clrShadeAccentLight, clrShadeAccentDark );
  3568. ::SetPixelV( hDC, ptEllipseCenter.x - nX, ptEllipseCenter.y - nY, clr );
  3569. clr = stat_PaintShadedEllipse_ComputeColorValue( -lfA, clrShadeAccentLight, clrShadeAccentDark );
  3570. ::SetPixelV( hDC, ptEllipseCenter.x + nX, ptEllipseCenter.y - nY, clr );
  3571. nX --;
  3572. nTemp0 = nTemp0 - 8 * nRadiusV * nRadiusV; 
  3573. if( nTemp3 < 0 ) 
  3574. nY ++;
  3575. nTemp1 = nTemp1 + 8 * nBoxSquare;
  3576. nTemp3 = nTemp3 - nTemp0 + 4 * nRadiusV * nRadiusV + nTemp1; 
  3577. }
  3578. else 
  3579. nTemp3 = nTemp3 - nTemp0 + 4 * nRadiusV * nRadiusV; 
  3580. if( nX < 0 )
  3581. break;
  3582. } // for( ; true; )
  3583. void CExtPaintManager::PAINTSCROLLBARDATA::PaintDefault(
  3584. CDC & dc,
  3585. CExtPaintManager * pPM
  3586. )
  3587. {
  3588. ASSERT( dc.GetSafeHdc() != NULL );
  3589. ASSERT_VALID( pPM );
  3590. if( m_rcBar.IsRectEmpty()
  3591. || (! dc.RectVisible( &m_rcBar ) )
  3592. )
  3593. return;
  3594. CExtPaintManager::SCROLLBARSKINDATA * pSBSD =
  3595. pPM->ScrollBar_GetSkinData(
  3596. m_bHorzBar,
  3597. m_pHelperSrc,
  3598. m_lParam,
  3599. m_bHelperLightAccent
  3600. );
  3601. if( pSBSD != NULL )
  3602. {
  3603. PaintSkinned(
  3604. dc,
  3605. pPM,
  3606. *pSBSD
  3607. );
  3608. return;
  3609. } // if( pSBSD != NULL )
  3610. if( m_pHelperSrc != NULL )
  3611. {
  3612. ASSERT_VALID( m_pHelperSrc );
  3613. if( m_pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtZoomScrollBar) ) )
  3614. {
  3615. bool bTransparent = false;
  3616. #if (!defined __EXT_MFC_NO_STATUSBAR)
  3617. CExtStatusControlBar * pWndParent = DYNAMIC_DOWNCAST( CExtStatusControlBar, (((CExtZoomScrollBar*)m_pHelperSrc)->GetParent()) );
  3618. if( pWndParent != NULL )
  3619. {
  3620. CExtPaintManager * pPM = ((CExtZoomScrollBar*)m_pHelperSrc)->PmBridge_GetPM();
  3621. ASSERT_VALID( pPM );
  3622. CRect rcPaint, _rcClient;
  3623. pWndParent->GetWindowRect( &rcPaint );
  3624. ((CExtZoomScrollBar*)m_pHelperSrc)->ScreenToClient( &rcPaint );
  3625. ((CExtZoomScrollBar*)m_pHelperSrc)->GetClientRect( &_rcClient );
  3626. ((CExtZoomScrollBar*)m_pHelperSrc)->ClientToScreen( &_rcClient );
  3627. pWndParent->ScreenToClient( &_rcClient );
  3628. if( pWndParent->m_bCompleteRepaint )
  3629. {
  3630. dc.OffsetViewportOrg(   _rcClient.left, 0 );
  3631. bool bRet = pPM->StatusBar_EraseBackground( dc, rcPaint, pWndParent );
  3632. dc.OffsetViewportOrg( - _rcClient.left, 0 );
  3633. if( ! bRet )
  3634. {
  3635. bool bTransparent = false;
  3636. if( pPM->GetCb2DbTransparentMode(pWndParent) )
  3637. {
  3638. if( pPM->PaintDockerBkgnd( true, dc, ((CExtZoomScrollBar*)m_pHelperSrc) ) )
  3639. bTransparent = true;
  3640. }
  3641. if( ! bTransparent )
  3642. dc.FillSolidRect( 
  3643. &rcPaint, 
  3644. pPM->GetColor( CExtPaintManager::CLR_3DFACE_OUT, pWndParent ) 
  3645. );
  3646. }
  3647. INT nIndex = pWndParent->CommandToIndex( ((CExtZoomScrollBar*)m_pHelperSrc)->GetDlgCtrlID() );
  3648. if( nIndex >= 0 )
  3649. {
  3650. dc.OffsetViewportOrg( _rcClient.left, 0 );
  3651. pPM->StatusBar_ErasePaneBackground( dc, nIndex, rcPaint, pWndParent );
  3652. dc.OffsetViewportOrg( -_rcClient.left, 0 );
  3653. bTransparent = true;
  3654. }
  3655. } // if( pWndParent->m_bCompleteRepaint )
  3656. } // if( pWndParent != NULL )
  3657. #endif // (!defined __EXT_MFC_NO_STATUSBAR)
  3658. if( ! bTransparent )
  3659. {
  3660. if( (! bTransparent )
  3661. && pPM->GetCb2DbTransparentMode( m_pHelperSrc )
  3662. )
  3663. {
  3664. CExtPaintManager::stat_ExcludeChildAreas(
  3665. dc,
  3666. ((CExtZoomScrollBar*)m_pHelperSrc)->GetSafeHwnd(),
  3667. CExtPaintManager::stat_DefExcludeChildAreaCallback
  3668. );
  3669. if( pPM->PaintDockerBkgnd( true, dc, ((CExtZoomScrollBar*)m_pHelperSrc) ) )
  3670. bTransparent = true;
  3671. }
  3672. if( ! bTransparent )
  3673. dc.FillSolidRect(
  3674. &m_rcBar,
  3675. pPM->GetColor( CExtPaintManager::CLR_3DFACE_OUT, ((CExtZoomScrollBar*)m_pHelperSrc) ) 
  3676. );
  3677. } // if( ! bTransparent )
  3678. CRect rcLineH( m_rcScrollableArea );
  3679. CRect rcLineV( m_rcScrollableArea );
  3680. if( m_bHorzBar )
  3681. {
  3682. rcLineH.bottom = rcLineH.top + 1;
  3683. rcLineH.OffsetRect( 0, m_rcScrollableArea.Height() / 2 + 1 );
  3684. rcLineV.right = rcLineV.left + 1;
  3685. rcLineV.OffsetRect( m_rcScrollableArea.Width() / 2, 0 );
  3686. rcLineV.bottom = rcLineV.top + 7;
  3687. rcLineV.OffsetRect( 0, (m_rcScrollableArea.Height() - 7 ) / 2 + 2 );
  3688. }
  3689. else
  3690. {
  3691. rcLineH.right = rcLineH.left + 1;
  3692. rcLineH.OffsetRect( m_rcScrollableArea.Width() / 2 + 1, 0 );
  3693. rcLineV.right = rcLineV.left + 7;
  3694. rcLineV.OffsetRect( (m_rcScrollableArea.Width() - 7 ) / 2 + 1 , 0 );
  3695. rcLineV.bottom = rcLineV.top + 1;
  3696. rcLineV.OffsetRect( 0, m_rcScrollableArea.Height() / 2 );
  3697. }
  3698. COLORREF clrZsLineLight = pPM->GetColor( COLOR_3DHIGHLIGHT );
  3699. COLORREF clrZsLineDark =  pPM->GetColor( COLOR_3DSHADOW );
  3700. rcLineH.OffsetRect( 
  3701. m_bHorzBar ? 0 : -1, 
  3702. m_bHorzBar ? -1 : 0
  3703. );
  3704. rcLineV.OffsetRect(
  3705. m_bHorzBar ? -2 : 0,
  3706. m_bHorzBar ? -2 : -1
  3707. );
  3708. if( m_bHorzBar )
  3709. rcLineV.OffsetRect( 2, 0 );
  3710. else
  3711. rcLineV.OffsetRect( 0, 2 );
  3712. if( clrZsLineDark !=  COLORREF(-1L) )
  3713. {
  3714. dc.FillSolidRect( &rcLineH, clrZsLineDark );
  3715. dc.FillSolidRect( &rcLineV, clrZsLineDark );
  3716. } // if( clrZsLineDark !=  COLORREF(-1L) )
  3717. if( clrZsLineLight !=  COLORREF(-1L) )
  3718. {
  3719. rcLineH.OffsetRect( 1, 1 );
  3720. rcLineV.OffsetRect( 1, 1 );
  3721. dc.FillSolidRect( &rcLineH, clrZsLineLight );
  3722. dc.FillSolidRect( &rcLineV, clrZsLineLight );
  3723. } // if( clrZsLineLight !=  COLORREF(-1L) )
  3724. COLORREF clrButtonBk = pPM->GetColor( COLOR_3DFACE, m_pHelperSrc, m_lParam );
  3725. CBrush _brushBkDefault( clrButtonBk );
  3726. HGDIOBJ hOldPen = ::SelectObject( dc.m_hDC, ::GetStockObject( NULL_PEN ) );
  3727. CRect arrRcButtons[] = { m_rcButtonDown, m_rcButtonUp, m_rcThumb };
  3728. INT nButtonIndex, nButtonCount = INT( sizeof(arrRcButtons)/sizeof(arrRcButtons[0]) );
  3729. for( nButtonIndex = 0; nButtonIndex < nButtonCount; nButtonIndex ++ )
  3730. {
  3731. CRect rcButton = arrRcButtons[ nButtonIndex ];
  3732. INT nMetric = min( rcButton.Width(), rcButton.Height() );
  3733. nMetric &= ~1;
  3734. rcButton.left += ( rcButton.Width() - nMetric ) / 2;
  3735. rcButton.right = rcButton.left + nMetric;
  3736. rcButton.top += ( rcButton.Height() - nMetric ) / 2;
  3737. rcButton.bottom = rcButton.top + nMetric;
  3738. bool bHover = false;
  3739. bool bPressed = false;
  3740. if( m_bEnabled )
  3741. {
  3742. switch( nButtonIndex )
  3743. {
  3744. case 0:
  3745. if( m_eSBMHT == __ESBMHT_BUTTON_DOWN )
  3746. bHover = true;
  3747. break;
  3748. case 1:
  3749. if( m_eSBMHT == __ESBMHT_BUTTON_UP )
  3750. bHover = true;
  3751. break;
  3752. case 2:
  3753. if( m_eSBMHT == __ESBMHT_THUMB )
  3754. bHover = true;
  3755. break;
  3756. } // switch( nButtonIndex )
  3757. if( bHover )
  3758. bPressed = m_bHoveredAreaIsPressed;
  3759. } // if( m_bEnabled )
  3760. COLORREF clrButtonText = pPM->GetColor( m_bEnabled ? COLOR_BTNTEXT : CLR_TEXT_DISABLED, m_pHelperSrc, m_lParam );
  3761. COLORREF clrButtonShadeOuterTL = pPM->GetColor( COLOR_3DHIGHLIGHT, m_pHelperSrc, m_lParam );
  3762. COLORREF clrButtonShadeOuterRB = pPM->GetColor( COLOR_3DDKSHADOW, m_pHelperSrc, m_lParam );
  3763. COLORREF clrButtonShadeInnerTL = clrButtonShadeOuterTL;
  3764. COLORREF clrButtonShadeInnerRB = pPM->GetColor( COLOR_3DSHADOW, m_pHelperSrc, m_lParam );
  3765. if( bPressed )
  3766. {
  3767. COLORREF clrTmp;
  3768. //clrTmp = clrButtonShadeOuterTL;
  3769. //clrButtonShadeOuterTL = clrButtonShadeOuterRB;
  3770. //clrButtonShadeOuterRB = clrTmp;
  3771. clrTmp = clrButtonShadeInnerTL;
  3772. clrButtonShadeInnerTL = clrButtonShadeInnerRB;
  3773. clrButtonShadeInnerRB = clrTmp;
  3774. } // if( bPressed )
  3775. CBrush * pOldBrush =
  3776. dc.SelectObject(
  3777. ( m_bEnabled && ( bPressed || bHover ) )
  3778. ? ( bPressed ? (&(pPM->m_brushDarkerDefault)) : (&(pPM->m_brushLighterDefault)) )
  3779. : (&_brushBkDefault)
  3780. );
  3781. if( nButtonIndex == 2 )
  3782. rcButton.InflateRect( 0, 0, 1, 1 );
  3783. dc.Ellipse( &rcButton );
  3784. dc.SelectObject( pOldBrush );
  3785. if( nButtonIndex == 2 )
  3786. rcButton.DeflateRect( 0, 0, 1, 1 );
  3787. CPoint ptCenter = rcButton.CenterPoint();
  3788. INT nHalfMetricToDraw = nMetric/2;
  3789. stat_PaintShadedEllipse(
  3790. dc.m_hDC,
  3791. ptCenter,
  3792. nHalfMetricToDraw,
  3793. nHalfMetricToDraw,
  3794. clrButtonShadeOuterTL,
  3795. clrButtonShadeOuterRB
  3796. );
  3797. nHalfMetricToDraw --;
  3798. stat_PaintShadedEllipse(
  3799. dc.m_hDC,
  3800. ptCenter,
  3801. nHalfMetricToDraw,
  3802. nHalfMetricToDraw,
  3803. clrButtonShadeInnerTL,
  3804. clrButtonShadeInnerRB
  3805. );
  3806. nHalfMetricToDraw /= 2;
  3807. if( nHalfMetricToDraw > 0 )
  3808. {
  3809. switch( nButtonIndex )
  3810. {
  3811. case 0:
  3812. dc.FillSolidRect(
  3813. ptCenter.x,
  3814. ptCenter.y - nHalfMetricToDraw,
  3815. 1,
  3816. nHalfMetricToDraw * 2 + 1,
  3817. clrButtonText
  3818. );
  3819. case 1: // continuing case 0
  3820. dc.FillSolidRect(
  3821. ptCenter.x - nHalfMetricToDraw,
  3822. ptCenter.y,
  3823. nHalfMetricToDraw * 2 + 1,
  3824. 1,
  3825. clrButtonText
  3826. );
  3827. break;
  3828. } // switch( nButtonIndex )
  3829. } // if( nHalfMetricToDraw > 0 )
  3830. } // for( nButtonIndex = 0; nButtonIndex < nButtonCount; nButtonIndex ++ )
  3831. ::SelectObject( dc.m_hDC, hOldPen );
  3832. return;
  3833. } // if( m_pHelperSrc->IsKindOf( RUNTIME_CLASS(CExtZoomScrollBar) ) )
  3834. } // if( m_pHelperSrc != NULL )
  3835. dc.FillRect(
  3836. &m_rcBar,
  3837. &pPM->m_brushLightSystem
  3838. );
  3839. //m_bEnabled = false;
  3840. //m_eSBMHT = __ESBMHT_BUTTON_UP;
  3841. //m_eSBMHT = __ESBMHT_PAGE_DOWN;
  3842. //m_eSBMHT = __ESBMHT_THUMB;
  3843. //m_bHoveredAreaIsPressed = true;
  3844. if( g_PaintManager.m_UxTheme.IsControlsThemed() )
  3845. {
  3846. HWND hWnd = NULL;
  3847. if( m_pHelperSrc != NULL )
  3848. {
  3849. CWnd * pWnd = DYNAMIC_DOWNCAST( CWnd, m_pHelperSrc );
  3850. hWnd = pWnd->GetSafeHwnd();