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

界面编程

开发平台:

Visual C++

  1. {
  2. _file.Attach( pStream );
  3. CArchive ar( &_file, CArchive::store|CArchive::bNoFlushOnDelete );
  4. CRuntimeClass * pRTC = pRM->GetRuntimeClass();
  5. ASSERT( pRTC != NULL );
  6. ar.WriteClass( pRTC );
  7. pRM->SerializeSynchronizationData( ar );
  8. ar.Flush();
  9. ULARGE_INTEGER liNewPosition;
  10. LARGE_INTEGER liOff;
  11. LISet32( liOff, 0 );
  12. sc = pStream->Seek( liOff, STREAM_SEEK_SET, &liNewPosition );
  13. if( sc != S_OK )
  14. {
  15. ASSERT( FALSE );
  16. ::AfxThrowUserException();
  17. }
  18. return pStream;
  19. } // try
  20. catch( CException * pException )
  21. {
  22. pException->Delete();
  23. } // catch( CException * pException )
  24. catch( ... )
  25. {
  26. } // catch( ... )
  27. _file.Detach();
  28. pStream->Release();
  29. return NULL;
  30. }
  31. void CExtResourceManager::CExtResourceManagerAutoPtr::PmSynchronizeSink_SynchronizeFrom(
  32. LPSTREAM pStream
  33. )
  34. {
  35. __PROF_UIS_MANAGE_STATE;
  36. if( pStream == NULL )
  37. return;
  38. if( PmSynchronizeSink_IsSynchronizing() )
  39. return;
  40. m_bPmSynchronizeSinkIsSynchronizing = true;
  41. COleStreamFile _file;
  42. _file.Attach( pStream );
  43. try
  44. {
  45. CArchive ar( &_file, CArchive::load|CArchive::bNoFlushOnDelete, 0 );
  46. CRuntimeClass * pRTC = ar.ReadClass();
  47. ASSERT( pRTC != NULL );
  48. CObject * pObj = pRTC->CreateObject();
  49. if( pObj != NULL )
  50. {
  51. ASSERT_VALID( pObj );
  52. CExtResourceManager * pResourceManager =
  53. DYNAMIC_DOWNCAST( CExtResourceManager, pObj );
  54. if( pResourceManager == NULL )
  55. {
  56. ASSERT( FALSE );
  57. delete pObj;
  58. } // if( pPaintManager == NULL )
  59. else
  60. {
  61. pResourceManager->SerializeSynchronizationData( ar );
  62. InstallResourceManager( pResourceManager );
  63. PmSynchronizeSink_SynchronizeOthers();
  64. } // else from if( pPaintManager == NULL )
  65. } // if( pObj != NULL )
  66. } // try
  67. catch( CException * pException )
  68. {
  69. pException->Delete();
  70. } // catch( CException * pException )
  71. catch( ... )
  72. {
  73. } // catch( ... )
  74. _file.Detach();
  75. m_bPmSynchronizeSinkIsSynchronizing = false;
  76. }
  77. CExtResourceManager::CExtResourceMemoryBuffer::CExtResourceMemoryBuffer()
  78. : m_pBuffer( NULL )
  79. , m_dwBufferSize( 0 )
  80. {
  81. }
  82. CExtResourceManager::CExtResourceMemoryBuffer::CExtResourceMemoryBuffer(
  83. const CExtResourceManager::CExtResourceMemoryBuffer & other
  84. )
  85. : m_pBuffer( NULL )
  86. , m_dwBufferSize( 0 )
  87. {
  88. AssignFromOther( other );
  89. }
  90. CExtResourceManager::CExtResourceMemoryBuffer::~CExtResourceMemoryBuffer()
  91. {
  92. Empty();
  93. }
  94. #ifdef _DEBUG
  95. void CExtResourceManager::CExtResourceMemoryBuffer::Dump()
  96. {
  97. for( DWORD i = 0; i < m_dwBufferSize; i++ )
  98. {
  99. TCHAR _tchr[2] = { m_pBuffer[ i ], _T('') };
  100. afxDump << _tchr;
  101. afxDump.Flush();
  102. }
  103. }
  104. #endif // _DEBUG
  105. CExtResourceManager::CExtResourceMemoryBuffer &
  106. CExtResourceManager::CExtResourceMemoryBuffer::operator = (
  107. const CExtResourceManager::CExtResourceMemoryBuffer & other
  108. )
  109. {
  110. AssignFromOther( other );
  111. return (*this);
  112. }
  113. bool CExtResourceManager::CExtResourceMemoryBuffer::operator ! () const
  114. {
  115. return (! IsEmpty() );
  116. }
  117. bool CExtResourceManager::CExtResourceMemoryBuffer::operator == (
  118. const CExtResourceManager::CExtResourceMemoryBuffer & other
  119. ) const
  120. {
  121. return ( CompareWithOther( other ) == 0 ) ? true : false;
  122. }
  123. bool CExtResourceManager::CExtResourceMemoryBuffer::operator != (
  124. const CExtResourceManager::CExtResourceMemoryBuffer & other
  125. ) const
  126. {
  127. return ( CompareWithOther( other ) != 0 ) ? true : false;
  128. }
  129. bool CExtResourceManager::CExtResourceMemoryBuffer::operator < (
  130. const CExtResourceManager::CExtResourceMemoryBuffer & other
  131. ) const
  132. {
  133. return ( CompareWithOther( other ) < 0 ) ? true : false;
  134. }
  135. bool CExtResourceManager::CExtResourceMemoryBuffer::operator <= (
  136. const CExtResourceManager::CExtResourceMemoryBuffer & other
  137. ) const
  138. {
  139. return ( CompareWithOther( other ) <= 0 ) ? true : false;
  140. }
  141. bool CExtResourceManager::CExtResourceMemoryBuffer::operator > (
  142. const CExtResourceManager::CExtResourceMemoryBuffer & other
  143. ) const
  144. {
  145. return ( CompareWithOther( other ) > 0 ) ? true : false;
  146. }
  147. bool CExtResourceManager::CExtResourceMemoryBuffer::operator >= (
  148. const CExtResourceManager::CExtResourceMemoryBuffer & other
  149. ) const
  150. {
  151. return ( CompareWithOther( other ) >= 0 ) ? true : false;
  152. }
  153. BYTE CExtResourceManager::CExtResourceMemoryBuffer::operator [] ( DWORD dwByteIndex ) const
  154. {
  155. ASSERT( m_pBuffer != NULL && dwByteIndex < m_dwBufferSize );
  156. return m_pBuffer[ dwByteIndex ];
  157. }
  158. CExtResourceManager::CExtResourceMemoryBuffer::operator BYTE * ()
  159. {
  160. return m_pBuffer;
  161. }
  162. CExtResourceManager::CExtResourceMemoryBuffer::operator const BYTE * ()
  163. {
  164. return m_pBuffer;
  165. }
  166. void CExtResourceManager::CExtResourceMemoryBuffer::AssignFromOther(
  167. const CExtResourceManager::CExtResourceMemoryBuffer & other
  168. )
  169. {
  170. if( LPVOID(this) == LPVOID(&other) )
  171. return;
  172. Empty();
  173. if( other.IsEmpty() )
  174. return;
  175. DWORD dwBufferSize = other.GetSize();
  176. if( ! Alloc( dwBufferSize, false ) )
  177. return;
  178. __EXT_MFC_MEMCPY( 
  179. GetBuffer(), 
  180. GetSize(),
  181. other.GetBuffer(), 
  182. dwBufferSize 
  183. );
  184. }
  185. int CExtResourceManager::CExtResourceMemoryBuffer::CompareWithOther(
  186. const CExtResourceManager::CExtResourceMemoryBuffer & other
  187. ) const
  188. {
  189. if( IsEmpty() )
  190. {
  191. if( other.IsEmpty() )
  192. return 0;
  193. return -1;
  194. } // if( IsEmpty() )
  195. else
  196. {
  197. if( other.IsEmpty() )
  198. return 1;
  199. DWORD dwSizeThis = GetSize();
  200. DWORD dwSizeOther = other.GetSize();
  201. DWORD dwCmpSize = min( dwSizeThis, dwSizeOther );
  202. ASSERT( dwCmpSize > 0 );
  203. int nCmpResult = ::memcmp( GetBuffer(), other.GetBuffer(), dwCmpSize );
  204. if( nCmpResult != 0 )
  205. return nCmpResult;
  206. if( dwSizeThis == dwSizeOther )
  207. return 0;
  208. if( dwSizeThis < dwSizeOther )
  209. return -1;
  210. return 1;
  211. } // else from if( IsEmpty() )
  212. }
  213. DWORD CExtResourceManager::CExtResourceMemoryBuffer::GetSize() const
  214. {
  215. return m_dwBufferSize;
  216. }
  217. BYTE * CExtResourceManager::CExtResourceMemoryBuffer::GetBuffer()
  218. {
  219. return m_pBuffer;
  220. }
  221. const BYTE * CExtResourceManager::CExtResourceMemoryBuffer::GetBuffer() const
  222. {
  223. return m_pBuffer;
  224. }
  225. HGLOBAL CExtResourceManager::CExtResourceMemoryBuffer::AllocGlobalBufferBuffer(
  226. UINT nFlags // = GPTR
  227. ) const
  228. {
  229. if( IsEmpty() )
  230. return NULL;
  231. HGLOBAL hGlobal = ::GlobalAlloc( nFlags, GetSize() );
  232. ASSERT( hGlobal != NULL );
  233. if( hGlobal == NULL )
  234. return NULL;
  235. LPVOID pMem = ::GlobalLock( hGlobal );
  236. ASSERT( pMem != NULL );
  237. __EXT_MFC_MEMCPY( 
  238. pMem, 
  239. GetSize(),
  240. GetBuffer(), 
  241. GetSize() 
  242. );
  243. ::GlobalUnlock( hGlobal );
  244. return hGlobal;
  245. }
  246. bool CExtResourceManager::CExtResourceMemoryBuffer::IsEmpty() const
  247. {
  248. return (m_dwBufferSize == 0) ? true : false;
  249. }
  250. void CExtResourceManager::CExtResourceMemoryBuffer::Empty()
  251. {
  252. if( m_pBuffer != NULL )
  253. {
  254. ASSERT( m_dwBufferSize > 0 );
  255. ::free( m_pBuffer );
  256. m_pBuffer = NULL;
  257. m_dwBufferSize = 0;
  258. }
  259. #ifdef _DEBUG
  260. else
  261. {
  262. ASSERT( m_dwBufferSize == 0 );
  263. }
  264. #endif // _DEBUG
  265. }
  266. bool CExtResourceManager::CExtResourceMemoryBuffer::Alloc(
  267. DWORD dwBufferSize,
  268. bool bZeroMemory // = true
  269. )
  270. {
  271. ASSERT( dwBufferSize > 0 );
  272. if( dwBufferSize == 0 )
  273. return false;
  274. Empty();
  275. m_pBuffer = (BYTE *)::malloc( dwBufferSize );
  276. if( m_pBuffer == NULL )
  277. return false;
  278. m_dwBufferSize = dwBufferSize;
  279. if( bZeroMemory )
  280. ::memset( m_pBuffer, 0, m_dwBufferSize );
  281. return true;
  282. }
  283. bool CExtResourceManager::CExtResourceMemoryBuffer::Load(
  284. HINSTANCE hModule,
  285. HRSRC hResource
  286. )
  287. {
  288. HGLOBAL hGlobal = LoadResource( hModule, hResource );
  289. if( hGlobal == NULL )
  290. return false;
  291. LPVOID pResourceData = LockResource( hGlobal );
  292. bool bRetVal = false;
  293. if( pResourceData != NULL )
  294. {
  295. DWORD dwSizeofResource = SizeofResource( hModule, hResource );
  296. if( dwSizeofResource == 0 )
  297. {
  298. Empty();
  299. bRetVal = true;
  300. } // if( dwSizeofResource == 0 )
  301. else if( Alloc( dwSizeofResource ) )
  302. {
  303. __EXT_MFC_MEMCPY(
  304. m_pBuffer,
  305. GetSize(),
  306. pResourceData,
  307. dwSizeofResource
  308. );
  309. bRetVal = true;
  310. } // else if( Alloc( dwSizeofResource ) )
  311. UnlockResource( hGlobal );
  312. } // if( pResourceData != NULL )
  313. FreeResource( hGlobal );
  314. return bRetVal;
  315. }
  316. bool CExtResourceManager::CExtResourceMemoryBuffer::FindAndLoad(
  317. HINSTANCE hModule,
  318.     __EXT_MFC_SAFE_LPCTSTR strResourceType,
  319.     UINT nResourceName,
  320. WORD nLangIdDesired
  321. )
  322. {
  323. Empty();
  324. HRSRC hResource =
  325. ::FindResourceEx(
  326. hModule,
  327. strResourceType,
  328. MAKEINTRESOURCE(nResourceName),
  329. nLangIdDesired
  330. );
  331. if( hResource == NULL )
  332. return false;
  333. return Load( hModule, hResource );
  334. }
  335. CExtResourceManager::CExtResourceManager(
  336. bool bAllowCustomLang, // = false
  337. WORD nLangIdDesired, // = __EXT_MFC_LANG_ID_DEFAULT_NEUTRAL
  338. DWORD nLangLayout // = DWORD(-1)  // if nLangLayout == DWORD(-1), get language layout from the locale information
  339. )
  340. : m_bAllowCustomLang( bAllowCustomLang )
  341. , m_nLangIdDesired( nLangIdDesired )
  342. , m_nLangLayout( nLangLayout )
  343. {
  344. }
  345. CExtResourceManager::~CExtResourceManager()
  346. {
  347. RscInst_RemoveAll();
  348. }
  349. void CExtResourceManager::SerializeSynchronizationData( CArchive & ar )
  350. {
  351. ASSERT_VALID( this );
  352. DWORD dwBasicData[3];
  353. ::memset( &dwBasicData, 0, sizeof(dwBasicData) );
  354. if( ar.IsStoring() )
  355. {
  356. if( IsCustomLangAllowed() )
  357. dwBasicData[0] |= 0x00000001;
  358. dwBasicData[1] = (DWORD)GetLangIdDesired();
  359. ar.Write( &dwBasicData, sizeof(dwBasicData) );
  360. } // if( ar.IsStoring() )
  361. else
  362. {
  363. ar.Read( &dwBasicData, sizeof(dwBasicData) );
  364. bool bAllow = ( ( dwBasicData[0] & 0x00000001 ) != 0 ) ? true : false;
  365. AllowCustomLang( bAllow );
  366. SetLangIdDesired( (WORD)dwBasicData[1] );
  367. } // else from if( ar.IsStoring() )
  368. }
  369. DLGTEMPLATE * CExtResourceManager::OnAdjustDialogTemplate(
  370. const DLGTEMPLATE * lpDialogTemplate,
  371. CObject * pHelperSrc,
  372. bool bWizard, // = false
  373. LPARAM lParam // = 0L
  374. )
  375. {
  376. ASSERT_VALID( this );
  377. ASSERT( lpDialogTemplate != NULL );
  378. lpDialogTemplate;
  379. pHelperSrc;
  380. bWizard;
  381. lParam;
  382. return NULL;
  383. }
  384. bool CExtResourceManager::IsCustomLangAllowed() const
  385. {
  386. ASSERT_VALID( this );
  387. return m_bAllowCustomLang;
  388. }
  389. void CExtResourceManager::AllowCustomLang(
  390. bool bAllow // = true
  391. )
  392. {
  393. ASSERT_VALID( this );
  394. m_bAllowCustomLang = bAllow;
  395. }
  396. WORD CExtResourceManager::GetLangIdDesired() const
  397. {
  398. ASSERT_VALID( this );
  399. return m_nLangIdDesired;
  400. }
  401. void CExtResourceManager::SetLangIdDesired(
  402. WORD nLangIdDesired
  403. )
  404. {
  405. ASSERT_VALID( this );
  406. m_nLangIdDesired = nLangIdDesired;
  407. }
  408. WORD CExtResourceManager::GetLangIdNeutral() const
  409. {
  410. ASSERT_VALID( this );
  411. return g_nLangIdNeutral;
  412. }
  413. DWORD CExtResourceManager::OnQueryLangLayout() const
  414. {
  415. ASSERT_VALID( this );
  416. if( m_nLangLayout == DWORD(-1) )
  417. {
  418. LANGID nLangID;
  419. if( IsCustomLangAllowed() )
  420. nLangID = GetLangIdDesired();
  421. else
  422. nLangID = ::GetUserDefaultLangID();
  423. switch( nLangID ) 
  424. {
  425. case MAKELANGID( LANG_ARABIC, SUBLANG_ARABIC_SAUDI_ARABIA ): // Arabic (Saudi Arabia)
  426. case MAKELANGID( LANG_ARABIC, SUBLANG_ARABIC_IRAQ         ): // Arabic (Iraq)
  427. case MAKELANGID( LANG_ARABIC, SUBLANG_ARABIC_EGYPT        ): // Arabic (Egypt)
  428. case MAKELANGID( LANG_ARABIC, SUBLANG_ARABIC_LIBYA        ): // Arabic (Libya)
  429. case MAKELANGID( LANG_ARABIC, SUBLANG_ARABIC_ALGERIA      ): // Arabic (Algeria)
  430. case MAKELANGID( LANG_ARABIC, SUBLANG_ARABIC_MOROCCO      ): // Arabic (Morocco)
  431. case MAKELANGID( LANG_ARABIC, SUBLANG_ARABIC_TUNISIA      ): // Arabic (Tunisia)
  432. case MAKELANGID( LANG_ARABIC, SUBLANG_ARABIC_OMAN         ): // Arabic (Oman)
  433. case MAKELANGID( LANG_ARABIC, SUBLANG_ARABIC_YEMEN        ): // Arabic (Yemen)
  434. case MAKELANGID( LANG_ARABIC, SUBLANG_ARABIC_SYRIA        ): // Arabic (Syria)
  435. case MAKELANGID( LANG_ARABIC, SUBLANG_ARABIC_JORDAN       ): // Arabic (Jordan)
  436. case MAKELANGID( LANG_ARABIC, SUBLANG_ARABIC_LEBANON      ): // Arabic (Lebanon)
  437. case MAKELANGID( LANG_ARABIC, SUBLANG_ARABIC_KUWAIT       ): // Arabic (Kuwait)
  438. case MAKELANGID( LANG_ARABIC, SUBLANG_ARABIC_UAE          ): // Arabic (U.A.E)
  439. case MAKELANGID( LANG_ARABIC, SUBLANG_ARABIC_BAHRAIN      ): // Arabic (Bahrain)
  440. case MAKELANGID( LANG_ARABIC, SUBLANG_ARABIC_QATAR        ): // Arabic (Qatar)
  441. case MAKELANGID( LANG_HEBREW, SUBLANG_DEFAULT             ): // Israel
  442. case MAKELANGID( LANG_URDU, SUBLANG_URDU_PAKISTAN       ): // Urdu (Pakistan)
  443. case MAKELANGID( LANG_URDU, SUBLANG_URDU_INDIA          ): // Urdu (India)
  444. case MAKELANGID( LANG_FARSI, SUBLANG_DEFAULT             ): // Iran (Persian)
  445. case MAKELANGID( LANG_PUNJABI, SUBLANG_DEFAULT             ): // India
  446. case MAKELANGID( LANG_KASHMIRI, SUBLANG_DEFAULT             ): // Kashmiri
  447. case MAKELANGID( LANG_KASHMIRI, SUBLANG_KASHMIRI_INDIA      ): // Kashmiri (India)
  448. case MAKELANGID( LANG_SINDHI, SUBLANG_DEFAULT             ):
  449. return LAYOUT_RTL;
  450. default:
  451. return LAYOUT_LTR;
  452. } // switch( nLangID ) 
  453. } // if( m_nLangLayout == DWORD(-1) )
  454. else
  455. return m_nLangLayout;
  456. }
  457. DWORD CExtResourceManager::GetLangLayout() const
  458. {
  459. ASSERT_VALID( this );
  460. return m_nLangLayout;
  461. }
  462. DWORD CExtResourceManager::SetLangLayout(
  463. DWORD nLangLayout // = DWORD(-1)
  464. )
  465. {
  466. ASSERT_VALID( this );
  467. ASSERT(
  468. nLangLayout == DWORD(-1)
  469. || nLangLayout == LAYOUT_LTR 
  470. || nLangLayout == LAYOUT_RTL 
  471. || nLangLayout == (LAYOUT_RTL|LAYOUT_BITMAPORIENTATIONPRESERVED)
  472. );
  473. DWORD nLangLayoutOld = m_nLangLayout;
  474. m_nLangLayout = nLangLayout;
  475. return nLangLayoutOld;
  476. }
  477. int CExtResourceManager::GetLocaleInfo(
  478. LCTYPE LCType,
  479. __EXT_MFC_SAFE_LPTSTR lpLCData,
  480. int cchData
  481. )
  482. {
  483. ASSERT_VALID( this );
  484. int nRetVal = 0;
  485. if( IsCustomLangAllowed() )
  486. {
  487. nRetVal =
  488. ::GetLocaleInfo(
  489. ( MAKELCID( GetLangIdDesired(), SORT_DEFAULT ) ),
  490. LCType,
  491. lpLCData,
  492. cchData
  493. );
  494. if( nRetVal != 0 )
  495. return nRetVal;
  496. nRetVal =
  497. ::GetLocaleInfo(
  498. ( MAKELCID( GetLangIdNeutral(), SORT_DEFAULT ) ),
  499. LCType,
  500. lpLCData,
  501. cchData
  502. );
  503. if( nRetVal != 0 )
  504. return nRetVal;
  505. } // if( IsCustomLangAllowed() )
  506. nRetVal =
  507. ::GetLocaleInfo(
  508. LOCALE_USER_DEFAULT,
  509. LCType,
  510. lpLCData,
  511. cchData
  512. );
  513. if( nRetVal != 0 )
  514. return nRetVal;
  515. nRetVal =
  516. ::GetLocaleInfo(
  517. LOCALE_SYSTEM_DEFAULT,
  518. LCType,
  519. lpLCData,
  520. cchData
  521. );
  522. if( nRetVal != 0 )
  523. return nRetVal;
  524. nRetVal =
  525. ::GetLocaleInfo(
  526. LOCALE_NEUTRAL,
  527. LCType,
  528. lpLCData,
  529. cchData
  530. );
  531. return nRetVal;
  532. }
  533. INT CExtResourceManager::GetTimeFormat(
  534. DWORD dwFlags,
  535. const SYSTEMTIME * lpTime,
  536. __EXT_MFC_SAFE_LPCTSTR lpFormat,
  537. __EXT_MFC_SAFE_LPTSTR lpTimeStr,
  538. INT cchTime
  539. )
  540. {
  541. ASSERT_VALID( this );
  542. INT nRetVal = 0;
  543. if( IsCustomLangAllowed() )
  544. {
  545. nRetVal =
  546. ::GetTimeFormat(
  547. ( MAKELCID( GetLangIdDesired(), SORT_DEFAULT ) ),
  548. dwFlags,
  549. lpTime,
  550. lpFormat,
  551. lpTimeStr,
  552. cchTime
  553. );
  554. if( nRetVal != 0 )
  555. return nRetVal;
  556. nRetVal =
  557. ::GetTimeFormat(
  558. ( MAKELCID( GetLangIdNeutral(), SORT_DEFAULT ) ),
  559. dwFlags,
  560. lpTime,
  561. lpFormat,
  562. lpTimeStr,
  563. cchTime
  564. );
  565. if( nRetVal != 0 )
  566. return nRetVal;
  567. } // if( IsCustomLangAllowed() )
  568. nRetVal =
  569. ::GetTimeFormat(
  570. LOCALE_USER_DEFAULT,
  571. dwFlags,
  572. lpTime,
  573. lpFormat,
  574. lpTimeStr,
  575. cchTime
  576. );
  577. if( nRetVal != 0 )
  578. return nRetVal;
  579. nRetVal =
  580. ::GetTimeFormat(
  581. LOCALE_SYSTEM_DEFAULT,
  582. dwFlags,
  583. lpTime,
  584. lpFormat,
  585. lpTimeStr,
  586. cchTime
  587. );
  588. if( nRetVal != 0 )
  589. return nRetVal;
  590. nRetVal =
  591. ::GetTimeFormat(
  592. LOCALE_NEUTRAL,
  593. dwFlags,
  594. lpTime,
  595. lpFormat,
  596. lpTimeStr,
  597. cchTime
  598. );
  599. return nRetVal;
  600. }
  601. INT CExtResourceManager::GetDateFormat(
  602. DWORD dwFlags,
  603. const SYSTEMTIME * lpDate,
  604. __EXT_MFC_SAFE_LPCTSTR lpFormat,
  605. __EXT_MFC_SAFE_LPTSTR lpDateStr,
  606. INT cchDate
  607. )
  608. {
  609. ASSERT_VALID( this );
  610. INT nRetVal = 0;
  611. if( IsCustomLangAllowed() )
  612. {
  613. nRetVal =
  614. ::GetDateFormat(
  615. ( MAKELCID( GetLangIdDesired(), SORT_DEFAULT ) ),
  616. dwFlags,
  617. lpDate,
  618. lpFormat,
  619. lpDateStr,
  620. cchDate
  621. );
  622. if( nRetVal != 0 )
  623. return nRetVal;
  624. nRetVal =
  625. ::GetDateFormat(
  626. ( MAKELCID( GetLangIdNeutral(), SORT_DEFAULT ) ),
  627. dwFlags,
  628. lpDate,
  629. lpFormat,
  630. lpDateStr,
  631. cchDate
  632. );
  633. if( nRetVal != 0 )
  634. return nRetVal;
  635. } // if( IsCustomLangAllowed() )
  636. nRetVal =
  637. ::GetDateFormat(
  638. LOCALE_USER_DEFAULT,
  639. dwFlags,
  640. lpDate,
  641. lpFormat,
  642. lpDateStr,
  643. cchDate
  644. );
  645. if( nRetVal != 0 )
  646. return nRetVal;
  647. nRetVal =
  648. ::GetDateFormat(
  649. LOCALE_SYSTEM_DEFAULT,
  650. dwFlags,
  651. lpDate,
  652. lpFormat,
  653. lpDateStr,
  654. cchDate
  655. );
  656. if( nRetVal != 0 )
  657. return nRetVal;
  658. nRetVal =
  659. ::GetDateFormat(
  660. LOCALE_NEUTRAL,
  661. dwFlags,
  662. lpDate,
  663. lpFormat,
  664. lpDateStr,
  665. cchDate
  666. );
  667. return nRetVal;
  668. }
  669. INT CExtResourceManager::GetNumberFormat(
  670. DWORD dwFlags,
  671. __EXT_MFC_SAFE_LPCTSTR lpValue,
  672. const NUMBERFMT * lpFormat,
  673. __EXT_MFC_SAFE_LPTSTR lpNumberStr,
  674. INT cchNumber
  675. )
  676. {
  677. ASSERT_VALID( this );
  678. INT nRetVal = 0;
  679. if( IsCustomLangAllowed() )
  680. {
  681. nRetVal =
  682. ::GetNumberFormat(
  683. ( MAKELCID( GetLangIdDesired(), SORT_DEFAULT ) ),
  684. dwFlags,
  685. lpValue,
  686. lpFormat,
  687. lpNumberStr,
  688. cchNumber
  689. );
  690. if( nRetVal != 0 )
  691. return nRetVal;
  692. nRetVal =
  693. ::GetNumberFormat(
  694. ( MAKELCID( GetLangIdNeutral(), SORT_DEFAULT ) ),
  695. dwFlags,
  696. lpValue,
  697. lpFormat,
  698. lpNumberStr,
  699. cchNumber
  700. );
  701. if( nRetVal != 0 )
  702. return nRetVal;
  703. } // if( IsCustomLangAllowed() )
  704. nRetVal =
  705. ::GetNumberFormat(
  706. LOCALE_USER_DEFAULT,
  707. dwFlags,
  708. lpValue,
  709. lpFormat,
  710. lpNumberStr,
  711. cchNumber
  712. );
  713. if( nRetVal != 0 )
  714. return nRetVal;
  715. nRetVal =
  716. ::GetNumberFormat(
  717. LOCALE_SYSTEM_DEFAULT,
  718. dwFlags,
  719. lpValue,
  720. lpFormat,
  721. lpNumberStr,
  722. cchNumber
  723. );
  724. if( nRetVal != 0 )
  725. return nRetVal;
  726. nRetVal =
  727. ::GetNumberFormat(
  728. LOCALE_NEUTRAL,
  729. dwFlags,
  730. lpValue,
  731. lpFormat,
  732. lpNumberStr,
  733. cchNumber
  734. );
  735. return nRetVal;
  736. }
  737. INT CExtResourceManager::GetCurrencyFormat(
  738. DWORD dwFlags,
  739. __EXT_MFC_SAFE_LPCTSTR lpValue,
  740. const CURRENCYFMT * lpFormat,
  741. __EXT_MFC_SAFE_LPTSTR lpCurrencyStr,
  742. INT cchCurrency
  743. )
  744. {
  745. ASSERT_VALID( this );
  746. INT nRetVal = 0;
  747. if( IsCustomLangAllowed() )
  748. {
  749. nRetVal =
  750. ::GetCurrencyFormat(
  751. ( MAKELCID( GetLangIdDesired(), SORT_DEFAULT ) ),
  752. dwFlags,
  753. lpValue,
  754. lpFormat,
  755. lpCurrencyStr,
  756. cchCurrency
  757. );
  758. if( nRetVal != 0 )
  759. return nRetVal;
  760. nRetVal =
  761. ::GetCurrencyFormat(
  762. ( MAKELCID( GetLangIdNeutral(), SORT_DEFAULT ) ),
  763. dwFlags,
  764. lpValue,
  765. lpFormat,
  766. lpCurrencyStr,
  767. cchCurrency
  768. );
  769. if( nRetVal != 0 )
  770. return nRetVal;
  771. } // if( IsCustomLangAllowed() )
  772. nRetVal =
  773. ::GetCurrencyFormat(
  774. LOCALE_USER_DEFAULT,
  775. dwFlags,
  776. lpValue,
  777. lpFormat,
  778. lpCurrencyStr,
  779. cchCurrency
  780. );
  781. if( nRetVal != 0 )
  782. return nRetVal;
  783. nRetVal =
  784. ::GetCurrencyFormat(
  785. LOCALE_SYSTEM_DEFAULT,
  786. dwFlags,
  787. lpValue,
  788. lpFormat,
  789. lpCurrencyStr,
  790. cchCurrency
  791. );
  792. if( nRetVal != 0 )
  793. return nRetVal;
  794. nRetVal =
  795. ::GetCurrencyFormat(
  796. LOCALE_NEUTRAL,
  797. dwFlags,
  798. lpValue,
  799. lpFormat,
  800. lpCurrencyStr,
  801. cchCurrency
  802. );
  803. return nRetVal;
  804. }
  805. //////////////////////////////////////////////////////////////////////////
  806. // CExtResourceManager::RscInstEntry
  807. CExtResourceManager::RscInstEntry::RscInstEntry(
  808. HINSTANCE hInstance,
  809. bool bFreeInstance // = true
  810. )
  811. : m_hInstance( hInstance )
  812. , m_bFreeInstance( bFreeInstance )
  813. {
  814. }
  815. CExtResourceManager::RscInstEntry::RscInstEntry(
  816. __EXT_MFC_SAFE_LPCTSTR strModulePathToLoad,
  817. bool bFreeInstance // = true
  818. )
  819. : m_hInstance( NULL )
  820. , m_bFreeInstance( bFreeInstance )
  821. {
  822. if( LPCTSTR(strModulePathToLoad) != NULL
  823. && INT(_tcslen(LPCTSTR(strModulePathToLoad))) > 0
  824. )
  825. {
  826. m_hInstance = ::LoadLibrary( strModulePathToLoad );
  827. //ASSERT( m_hInstance != NULL );
  828. }
  829. }
  830. CExtResourceManager::RscInstEntry::~RscInstEntry()
  831. {
  832. if( m_hInstance != NULL )
  833. {
  834. if( m_bFreeInstance )
  835. ::FreeLibrary( m_hInstance );
  836. m_hInstance = NULL;
  837. }
  838. }
  839. HINSTANCE CExtResourceManager::RscInstEntry::GetInstance() const
  840. {
  841. return m_hInstance;
  842. }
  843. bool CExtResourceManager::RscInstEntry::IsEmpty() const
  844. {
  845. return ( GetInstance() == NULL ) ? true : false;
  846. }
  847. INT CExtResourceManager::RscInst_GetCount() const
  848. {
  849. __PROF_UIS_MANAGE_STATE;
  850. ASSERT_VALID( this );
  851. return INT( m_arrRscInst.GetSize() );
  852. }
  853. bool CExtResourceManager::RscInst_Insert(
  854. HINSTANCE hInstance,
  855. bool bFreeInstance, // = true
  856. INT nInsertPos // = -1 // -1 - Append
  857. )
  858. {
  859. __PROF_UIS_MANAGE_STATE;
  860. ASSERT_VALID( this );
  861. if( hInstance == NULL )
  862. return false;
  863. RscInstEntry * pRscInstEntry =
  864. new RscInstEntry( hInstance, bFreeInstance );
  865. bool bRetVal =
  866. RscInst_Insert(
  867. pRscInstEntry,
  868. nInsertPos
  869. );
  870. if( ! bRetVal )
  871. delete pRscInstEntry;
  872. return bRetVal;
  873. }
  874. bool CExtResourceManager::RscInst_Insert(
  875. __EXT_MFC_SAFE_LPCTSTR strModulePathToLoad,
  876. bool bFreeInstance, // = true
  877. INT nInsertPos // = -1 // -1 - Append
  878. )
  879. {
  880. __PROF_UIS_MANAGE_STATE;
  881. ASSERT_VALID( this );
  882. if( LPCTSTR(strModulePathToLoad) == NULL
  883. || INT(_tcslen(LPCTSTR(strModulePathToLoad))) == 0
  884. )
  885. return false;
  886. RscInstEntry * pRscInstEntry =
  887. new RscInstEntry( strModulePathToLoad, bFreeInstance );
  888. bool bRetVal =
  889. RscInst_Insert(
  890. pRscInstEntry,
  891. nInsertPos
  892. );
  893. if( ! bRetVal )
  894. delete pRscInstEntry;
  895. return bRetVal;
  896. }
  897. bool CExtResourceManager::RscInst_Insert(
  898. RscInstEntry * pRscInstEntry,
  899. INT nInsertPos // = -1 // -1 - Append
  900. )
  901. {
  902. __PROF_UIS_MANAGE_STATE;
  903. ASSERT_VALID( this );
  904. if( pRscInstEntry == NULL
  905. || pRscInstEntry->IsEmpty()
  906. )
  907. return false;
  908. INT nCount = INT( m_arrRscInst.GetSize() );
  909. if( nInsertPos < 0 || nInsertPos > nCount )
  910. nInsertPos = nCount;
  911. m_arrRscInst.InsertAt( nInsertPos, pRscInstEntry );
  912. return true;
  913. }
  914. bool CExtResourceManager::RscInst_RemoveAt(
  915. INT nRemovePos
  916. )
  917. {
  918. __PROF_UIS_MANAGE_STATE;
  919. ASSERT_VALID( this );
  920. if( nRemovePos < 0 || nRemovePos >= INT( m_arrRscInst.GetSize() ) )
  921. return false;
  922. RscInstEntry * pRscInstEntry =
  923. m_arrRscInst[ nRemovePos ];
  924. if( pRscInstEntry != NULL )
  925. delete pRscInstEntry;
  926. m_arrRscInst.RemoveAt( nRemovePos );
  927. return true;
  928. }
  929. void CExtResourceManager::RscInst_RemoveAll()
  930. {
  931. __PROF_UIS_MANAGE_STATE;
  932. ASSERT_VALID( this );
  933. INT nIndex, nCount = INT( m_arrRscInst.GetSize() );
  934. for( nIndex = 0; nIndex < nCount; nIndex++ )
  935. {
  936. RscInstEntry * pRscInstEntry =
  937. m_arrRscInst[ nIndex ];
  938. if( pRscInstEntry != NULL )
  939. delete pRscInstEntry;
  940. } // for( nIndex = 0; nIndex < nCount; nIndex++ )
  941. m_arrRscInst.RemoveAll();
  942. }
  943. const CExtResourceManager::RscInstEntry * CExtResourceManager::RscInst_GetAt(
  944. INT nPos
  945. ) const
  946. {
  947. __PROF_UIS_MANAGE_STATE;
  948. ASSERT_VALID( this );
  949. return
  950. ( const_cast < CExtResourceManager * > ( this ) )
  951. -> RscInst_GetAt( nPos );
  952. }
  953. CExtResourceManager::RscInstEntry * CExtResourceManager::RscInst_GetAt(
  954. INT nPos
  955. )
  956. {
  957. __PROF_UIS_MANAGE_STATE;
  958. ASSERT_VALID( this );
  959. if( nPos < 0 || nPos >= INT( m_arrRscInst.GetSize() ) )
  960. return NULL;
  961. return m_arrRscInst.GetAt( nPos );
  962. }
  963. bool CExtResourceManager::RscInst_LoadResourceBufferSingleLanguage(
  964. CExtResourceMemoryBuffer & bufferOut,
  965. __EXT_MFC_SAFE_LPCTSTR strResourceType,
  966. UINT nResourceName,
  967. WORD nLangIdDesired,
  968. WORD * p_wLangIdOut, // = NULL
  969. HINSTANCE * p_hInstOut // = NULL
  970. )
  971. {
  972. __PROF_UIS_MANAGE_STATE;
  973. ASSERT_VALID( this );
  974. ASSERT( strResourceType != NULL );
  975. if( p_wLangIdOut != NULL )
  976. (*p_wLangIdOut) = GetLangIdNeutral();
  977. if( p_hInstOut != NULL )
  978. (*p_hInstOut) = NULL;
  979. INT nIndex, nCount = RscInst_GetCount();
  980. for( nIndex = 0; nIndex < nCount; nIndex++ )
  981. {
  982. RscInstEntry * pRscInstEntry = RscInst_GetAt( nIndex );
  983. if( pRscInstEntry == NULL
  984. || pRscInstEntry->IsEmpty()
  985. )
  986. continue;
  987. HINSTANCE hInstance = pRscInstEntry->GetInstance();
  988. if( bufferOut.FindAndLoad(
  989. hInstance,
  990. strResourceType,
  991. nResourceName,
  992. nLangIdDesired
  993. )
  994. )
  995. {
  996. if( p_wLangIdOut != NULL )
  997. (*p_wLangIdOut) = nLangIdDesired;
  998. if( p_hInstOut != NULL )
  999. (*p_hInstOut) = hInstance;
  1000. return true;
  1001. }
  1002. } // for( nIndex = 0; nIndex < nCount; nIndex++ )
  1003. return false;
  1004. }
  1005. HINSTANCE CExtResourceManager::RscInst_FindResourceHandleSingleLanguage(
  1006. __EXT_MFC_SAFE_LPCTSTR strResourceType,
  1007. UINT nResourceName,
  1008. WORD nLangIdDesired,
  1009. WORD * p_wLangIdOut, // = NULL
  1010. HRSRC * p_hResourceOut // = NULL
  1011. )
  1012. {
  1013. __PROF_UIS_MANAGE_STATE;
  1014. ASSERT_VALID( this );
  1015. ASSERT( strResourceType != NULL );
  1016. if( p_wLangIdOut != NULL )
  1017. (*p_wLangIdOut) = GetLangIdNeutral();
  1018. if( p_hResourceOut != NULL )
  1019. (*p_hResourceOut) = NULL;
  1020. INT nIndex, nCount = RscInst_GetCount();
  1021. for( nIndex = 0; nIndex < nCount; nIndex++ )
  1022. {
  1023. RscInstEntry * pRscInstEntry = RscInst_GetAt( nIndex );
  1024. if( pRscInstEntry == NULL
  1025. || pRscInstEntry->IsEmpty()
  1026. )
  1027. continue;
  1028. HINSTANCE hInstance = pRscInstEntry->GetInstance();
  1029. HRSRC hResource =
  1030. ::FindResourceEx(
  1031. hInstance,
  1032. LPCTSTR(strResourceType),
  1033. LPCTSTR(__EXT_MFC_UINT_PTR(nResourceName)),
  1034. nLangIdDesired
  1035. );
  1036. if( hResource != NULL )
  1037. {
  1038. if( p_wLangIdOut != NULL )
  1039. (*p_wLangIdOut) = nLangIdDesired;
  1040. if( p_hResourceOut != NULL )
  1041. (*p_hResourceOut) = hResource;
  1042. return hInstance;
  1043. } // if( hResource != NULL )
  1044. } // for( nIndex = 0; nIndex < nCount; nIndex++ )
  1045. return NULL;
  1046. }
  1047. __EXT_MFC_SAFE_LPCTSTR CExtResourceManager::DesiredFont_GetFaceName() const
  1048. {
  1049. __PROF_UIS_MANAGE_STATE;
  1050. ASSERT_VALID( this );
  1051. if( m_strHelperDesiredFontFaceName.IsEmpty() )
  1052. return LPCTSTR(NULL);
  1053. return LPCTSTR(m_strHelperDesiredFontFaceName);
  1054. }
  1055. void CExtResourceManager::DesiredFont_SetFaceName(
  1056. __EXT_MFC_SAFE_LPCTSTR strDesiredFontFaceName // = NULL // NULL = no font replacement
  1057. )
  1058. {
  1059. __PROF_UIS_MANAGE_STATE;
  1060. ASSERT_VALID( this );
  1061. if( LPCTSTR(strDesiredFontFaceName) == NULL
  1062. || _tcslen( LPCTSTR(strDesiredFontFaceName) ) == 0
  1063. )
  1064. {
  1065. m_strHelperDesiredFontFaceName.Empty();
  1066. m_helperFontDesired.DeleteObject();
  1067. return;
  1068. }
  1069. if( m_strHelperDesiredFontFaceName == LPCTSTR(strDesiredFontFaceName) )
  1070. return;
  1071. m_strHelperDesiredFontFaceName = strDesiredFontFaceName;
  1072. m_helperFontDesired.DeleteObject(); // will be re-created on the fly if needed
  1073. }
  1074. HFONT CExtResourceManager::DesiredFont_GetHandle() const
  1075. {
  1076. __PROF_UIS_MANAGE_STATE;
  1077. ASSERT_VALID( this );
  1078. LPCTSTR strDesiredFontFaceName = DesiredFont_GetFaceName();
  1079. if( strDesiredFontFaceName == NULL
  1080. || INT(_tcslen(strDesiredFontFaceName)) == 0
  1081. )
  1082. return NULL;
  1083. HFONT hFont = (HFONT)m_helperFontDesired.GetSafeHandle();
  1084. if( hFont != NULL )
  1085. return hFont;
  1086. LOGFONT _lf;
  1087. ::memset( &_lf, 0, sizeof(LOGFONT) );
  1088. g_PaintManager->m_FontNormal.GetLogFont( &_lf );
  1089. __EXT_MFC_STRCPY( _lf.lfFaceName, LF_FACESIZE, strDesiredFontFaceName );
  1090. m_helperFontDesired.CreateFontIndirect( &_lf );
  1091. hFont = (HFONT)m_helperFontDesired.GetSafeHandle();
  1092. return hFont;
  1093. }
  1094. void CExtResourceManager::DesiredFont_ChangeWindow(
  1095. HWND hWnd,
  1096. INT nNestedDepth, // = 0 // 0 - only hWnd, 1 - +all its children, 2 - ...
  1097. bool bRedrawWindow // = true
  1098. )
  1099. {
  1100. __PROF_UIS_MANAGE_STATE;
  1101. ASSERT_VALID( this );
  1102. ASSERT( nNestedDepth >= 0 );
  1103. if( hWnd == NULL || (! ::IsWindow( hWnd ) ) )
  1104. return;
  1105. HFONT hFont = DesiredFont_GetHandle();
  1106. if( hFont == NULL )
  1107. return;
  1108. ::SendMessage(
  1109. hWnd,
  1110. WM_SETFONT,
  1111. (WPARAM)hFont,
  1112. bRedrawWindow ? (!0) : 0
  1113. );
  1114. if( nNestedDepth == 0 )
  1115. return;
  1116. nNestedDepth --;
  1117. hWnd = ::GetWindow( hWnd, GW_CHILD );
  1118. for( ; hWnd != NULL; hWnd = ::GetWindow( hWnd, GW_HWNDNEXT ) )
  1119. DesiredFont_ChangeWindow(
  1120. hWnd,
  1121. nNestedDepth,
  1122. bRedrawWindow
  1123. );
  1124. }
  1125. HINSTANCE CExtResourceManager::FindResourceHandleSingleLanguage(
  1126. __EXT_MFC_SAFE_LPCTSTR strResourceType,
  1127. UINT nResourceName,
  1128. WORD nLangIdDesired,
  1129. WORD * p_wLangIdOut, // = NULL
  1130. HRSRC * p_hResourceOut // = NULL
  1131. )
  1132. {
  1133. __PROF_UIS_MANAGE_STATE;
  1134. ASSERT_VALID( this );
  1135. ASSERT( strResourceType != NULL );
  1136. if( p_wLangIdOut != NULL )
  1137. (*p_wLangIdOut) = GetLangIdNeutral();
  1138. if( p_hResourceOut != NULL )
  1139. (*p_hResourceOut) = NULL;
  1140. if( ! IsCustomLangAllowed() )
  1141. {
  1142. HINSTANCE hInst =
  1143. ::AfxFindResourceHandle(
  1144. LPCTSTR(__EXT_MFC_UINT_PTR(nResourceName)),
  1145. LPCTSTR(strResourceType)
  1146. );
  1147. if( hInst == NULL )
  1148. return NULL;
  1149. HRSRC hResource = 
  1150. ::FindResource(
  1151. hInst,
  1152. LPCTSTR(__EXT_MFC_UINT_PTR(nResourceName)),
  1153. LPCTSTR(strResourceType)
  1154. );
  1155. if( hResource == NULL )
  1156. return NULL;
  1157. if( p_hResourceOut != NULL )
  1158. (*p_hResourceOut) = hResource;
  1159. return hInst;
  1160. } // if( ! IsCustomLangAllowed() )
  1161. HINSTANCE hInstance =
  1162. RscInst_FindResourceHandleSingleLanguage(
  1163. strResourceType,
  1164. nResourceName,
  1165. nLangIdDesired,
  1166. p_wLangIdOut,
  1167. p_hResourceOut
  1168. );
  1169. if( hInstance != NULL )
  1170. return hInstance;
  1171. AFX_MODULE_STATE * pModuleState = ::AfxGetModuleState();
  1172. if( ! pModuleState->m_bSystem )
  1173. {
  1174. hInstance = AfxGetResourceHandle();
  1175. HRSRC hResource =
  1176. ::FindResourceEx(
  1177. hInstance,
  1178. LPCTSTR(strResourceType),
  1179. LPCTSTR(__EXT_MFC_UINT_PTR(nResourceName)),
  1180. nLangIdDesired
  1181. );
  1182. if( hResource != NULL )
  1183. {
  1184. if( p_wLangIdOut != NULL )
  1185. (*p_wLangIdOut) = nLangIdDesired;
  1186. if( p_hResourceOut != NULL )
  1187. (*p_hResourceOut) = hResource;
  1188. return hInstance;
  1189. } // if( hResource != NULL )
  1190. } // if( ! pModuleState->m_bSystem )
  1191. #if (!defined __EXT_PROFUIS_STATIC_LINK)
  1192. AfxLockGlobals( CRIT_DYNLINKLIST );
  1193. CDynLinkLibrary * pDLL = NULL;
  1194. for( pDLL = pModuleState->m_libraryList;
  1195. pDLL != NULL;
  1196. pDLL = pDLL->m_pNextDLL
  1197. )
  1198. {
  1199. if( (! pDLL->m_bSystem)
  1200. && pDLL->m_hResource != NULL
  1201. )
  1202. {
  1203. HRSRC hResource =
  1204. ::FindResourceEx(
  1205. pDLL->m_hResource,
  1206. LPCTSTR(strResourceType),
  1207. LPCTSTR(__EXT_MFC_UINT_PTR(nResourceName)),
  1208. nLangIdDesired
  1209. );
  1210. if( hResource != NULL )
  1211. {
  1212. if( p_wLangIdOut != NULL )
  1213. (*p_wLangIdOut) = nLangIdDesired;
  1214. if( p_hResourceOut != NULL )
  1215. (*p_hResourceOut) = hResource;
  1216. AfxUnlockGlobals(CRIT_DYNLINKLIST);
  1217. return pDLL->m_hResource;
  1218. } // if( hResource != NULL )
  1219. }
  1220. }
  1221. AfxUnlockGlobals( CRIT_DYNLINKLIST );
  1222. hInstance = pModuleState->m_appLangDLL;
  1223. if( hInstance != NULL )
  1224. {
  1225. HRSRC hResource =
  1226. ::FindResourceEx(
  1227. hInstance,
  1228. LPCTSTR(strResourceType),
  1229. LPCTSTR(__EXT_MFC_UINT_PTR(nResourceName)),
  1230. nLangIdDesired
  1231. );
  1232. if( hResource != NULL )
  1233. {
  1234. if( p_wLangIdOut != NULL )
  1235. (*p_wLangIdOut) = nLangIdDesired;
  1236. if( p_hResourceOut != NULL )
  1237. (*p_hResourceOut) = hResource;
  1238. return hInstance;
  1239. } // if( hResource != NULL )
  1240. }
  1241. #endif // (!defined __EXT_PROFUIS_STATIC_LINK)
  1242. if( pModuleState->m_bSystem )
  1243. {
  1244. hInstance = AfxGetResourceHandle();
  1245. HRSRC hResource =
  1246. ::FindResourceEx(
  1247. hInstance,
  1248. LPCTSTR(strResourceType),
  1249. LPCTSTR(__EXT_MFC_UINT_PTR(nResourceName)),
  1250. nLangIdDesired
  1251. );
  1252. if( hResource != NULL )
  1253. {
  1254. if( p_wLangIdOut != NULL )
  1255. (*p_wLangIdOut) = nLangIdDesired;
  1256. if( p_hResourceOut != NULL )
  1257. (*p_hResourceOut) = hResource;
  1258. return hInstance;
  1259. } // if( hResource != NULL )
  1260. } // if( pModuleState->m_bSystem )
  1261. #if (!defined __EXT_PROFUIS_STATIC_LINK)
  1262. AfxLockGlobals(CRIT_DYNLINKLIST);
  1263. for( pDLL = pModuleState->m_libraryList;
  1264. pDLL != NULL;
  1265. pDLL = pDLL->m_pNextDLL
  1266. )
  1267. {
  1268. if( pDLL->m_bSystem
  1269. && pDLL->m_hResource != NULL
  1270. )
  1271. {
  1272. HRSRC hResource =
  1273. ::FindResourceEx(
  1274. pDLL->m_hResource,
  1275. LPCTSTR(strResourceType),
  1276. LPCTSTR(__EXT_MFC_UINT_PTR(nResourceName)),
  1277. nLangIdDesired
  1278. );
  1279. if( hResource != NULL )
  1280. {
  1281. if( p_wLangIdOut != NULL )
  1282. (*p_wLangIdOut) = nLangIdDesired;
  1283. if( p_hResourceOut != NULL )
  1284. (*p_hResourceOut) = hResource;
  1285. AfxUnlockGlobals(CRIT_DYNLINKLIST);
  1286. return pDLL->m_hResource;
  1287. } // if( hResource != NULL )
  1288. }
  1289. }
  1290. AfxUnlockGlobals( CRIT_DYNLINKLIST );
  1291. #endif // (!defined __EXT_PROFUIS_STATIC_LINK)
  1292. hInstance = AfxGetResourceHandle();
  1293. HRSRC hResource =
  1294. ::FindResourceEx(
  1295. hInstance,
  1296. LPCTSTR(strResourceType),
  1297. LPCTSTR(__EXT_MFC_UINT_PTR(nResourceName)),
  1298. nLangIdDesired
  1299. );
  1300. if( hResource != NULL )
  1301. {
  1302. if( p_wLangIdOut != NULL )
  1303. (*p_wLangIdOut) = nLangIdDesired;
  1304. if( p_hResourceOut != NULL )
  1305. (*p_hResourceOut) = hResource;
  1306. return hInstance;
  1307. } // if( hResource != NULL )
  1308. return NULL;
  1309. }
  1310. HINSTANCE CExtResourceManager::FindResourceHandleEx(
  1311. __EXT_MFC_SAFE_LPCTSTR strResourceType,
  1312. UINT nResourceName,
  1313. WORD nLangIdDesired,
  1314. WORD nLangIdNeutral, // = CExtResourceManager::g_nLangIdNeutral
  1315. WORD * p_wLangIdOut, // = NULL
  1316. HRSRC * p_hResourceOut // = NULL
  1317. )
  1318. {
  1319. __PROF_UIS_MANAGE_STATE;
  1320. ASSERT_VALID( this );
  1321. ASSERT( strResourceType != NULL );
  1322. if( p_wLangIdOut != NULL )
  1323. (*p_wLangIdOut) = GetLangIdNeutral();
  1324. if( p_hResourceOut != NULL )
  1325. (*p_hResourceOut) = NULL;
  1326. if( ! IsCustomLangAllowed() )
  1327. {
  1328. HINSTANCE hInst =
  1329. ::AfxFindResourceHandle(
  1330. LPCTSTR(__EXT_MFC_UINT_PTR(nResourceName)),
  1331. LPCTSTR(strResourceType)
  1332. );
  1333. if( hInst == NULL )
  1334. return NULL;
  1335. HRSRC hResource = 
  1336. ::FindResource(
  1337. hInst,
  1338. LPCTSTR(__EXT_MFC_UINT_PTR(nResourceName)),
  1339. LPCTSTR(strResourceType)
  1340. );
  1341. if( hResource == NULL )
  1342. return NULL;
  1343. if( p_hResourceOut != NULL )
  1344. (*p_hResourceOut) = hResource;
  1345. return hInst;
  1346. } // if( ! IsCustomLangAllowed() )
  1347. HINSTANCE hInst =
  1348. FindResourceHandleSingleLanguage(
  1349. strResourceType,
  1350. nResourceName,
  1351. nLangIdDesired,
  1352. p_wLangIdOut,
  1353. p_hResourceOut
  1354. );
  1355. if( hInst != NULL )
  1356. return hInst;
  1357. if( nLangIdDesired == nLangIdNeutral )
  1358. return NULL;
  1359. hInst = 
  1360. FindResourceHandleSingleLanguage(
  1361. strResourceType,
  1362. nResourceName,
  1363. nLangIdNeutral,
  1364. p_wLangIdOut,
  1365. p_hResourceOut
  1366. );
  1367. return hInst;
  1368. }
  1369. HINSTANCE CExtResourceManager::FindResourceHandle(
  1370. __EXT_MFC_SAFE_LPCTSTR strResourceType,
  1371. UINT nResourceName,
  1372. WORD * p_wLangIdOut, // = NULL
  1373. HRSRC * p_hResourceOut // = NULL
  1374. )
  1375. {
  1376. __PROF_UIS_MANAGE_STATE;
  1377. ASSERT_VALID( this );
  1378. ASSERT( strResourceType != NULL );
  1379. if( p_wLangIdOut != NULL )
  1380. (*p_wLangIdOut) = GetLangIdNeutral();
  1381. if( p_hResourceOut != NULL )
  1382. (*p_hResourceOut) = NULL;
  1383. if( ! IsCustomLangAllowed() )
  1384. {
  1385. HINSTANCE hInst =
  1386. ::AfxFindResourceHandle(
  1387. LPCTSTR(__EXT_MFC_UINT_PTR(nResourceName)),
  1388. LPCTSTR(strResourceType)
  1389. );
  1390. if( hInst == NULL )
  1391. return NULL;
  1392. HRSRC hResource = 
  1393. ::FindResource(
  1394. hInst,
  1395. LPCTSTR(__EXT_MFC_UINT_PTR(nResourceName)),
  1396. LPCTSTR(strResourceType)
  1397. );
  1398. if( hResource == NULL )
  1399. return NULL;
  1400. if( p_hResourceOut != NULL )
  1401. (*p_hResourceOut) = hResource;
  1402. return hInst;
  1403. } // if( ! IsCustomLangAllowed() )
  1404. return
  1405. FindResourceHandleEx(
  1406. strResourceType,
  1407. nResourceName,
  1408. GetLangIdDesired(),
  1409. GetLangIdNeutral(),
  1410. p_wLangIdOut,
  1411. p_hResourceOut
  1412. );
  1413. }
  1414. bool CExtResourceManager::LoadResourceBufferSingleLanguage(
  1415. CExtResourceManager::CExtResourceMemoryBuffer & bufferOut,
  1416. __EXT_MFC_SAFE_LPCTSTR strResourceType,
  1417. UINT nResourceName,
  1418. WORD nLangIdDesired,
  1419. WORD * p_wLangIdOut, // = NULL
  1420. HINSTANCE * p_hInstOut // = NULL
  1421. )
  1422. {
  1423. __PROF_UIS_MANAGE_STATE;
  1424. ASSERT_VALID( this );
  1425. if( ! IsCustomLangAllowed() )
  1426. {
  1427. if( p_wLangIdOut != NULL )
  1428. (*p_wLangIdOut) = GetLangIdNeutral();
  1429. HINSTANCE hInst =
  1430. ::AfxFindResourceHandle(
  1431. LPCTSTR(__EXT_MFC_UINT_PTR(nResourceName)),
  1432. strResourceType
  1433. );
  1434. if( p_hInstOut != NULL )
  1435. (*p_hInstOut) = hInst;
  1436. if( hInst == NULL )
  1437. return false;
  1438. bufferOut.Empty();
  1439. return
  1440. bufferOut.FindAndLoad(
  1441. hInst,
  1442. strResourceType,
  1443. nResourceName,
  1444. MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT)
  1445. );
  1446. } // if( ! IsCustomLangAllowed() )
  1447. ASSERT( strResourceType != NULL );
  1448. if( p_wLangIdOut != NULL )
  1449. (*p_wLangIdOut) = GetLangIdNeutral();
  1450. if( p_hInstOut != NULL )
  1451. (*p_hInstOut) = NULL;
  1452. if( RscInst_LoadResourceBufferSingleLanguage(
  1453. bufferOut,
  1454. strResourceType,
  1455. nResourceName,
  1456. nLangIdDesired,
  1457. p_wLangIdOut = NULL,
  1458. p_hInstOut
  1459. )
  1460. )
  1461. return true;
  1462. HINSTANCE hInstance = NULL;
  1463. AFX_MODULE_STATE * pModuleState = ::AfxGetModuleState();
  1464. if( ! pModuleState->m_bSystem )
  1465. {
  1466. hInstance = AfxGetResourceHandle();
  1467. if( bufferOut.FindAndLoad(
  1468. hInstance,
  1469. strResourceType,
  1470. nResourceName,
  1471. nLangIdDesired
  1472. )
  1473. )
  1474. {
  1475. if( p_wLangIdOut != NULL )
  1476. (*p_wLangIdOut) = nLangIdDesired;
  1477. if( p_hInstOut != NULL )
  1478. (*p_hInstOut) = hInstance;
  1479. return true;
  1480. }
  1481. } // if( ! pModuleState->m_bSystem )
  1482. #if (!defined __EXT_PROFUIS_STATIC_LINK)
  1483. AfxLockGlobals( CRIT_DYNLINKLIST );
  1484. CDynLinkLibrary * pDLL = NULL;
  1485. for( pDLL = pModuleState->m_libraryList;
  1486. pDLL != NULL;
  1487. pDLL = pDLL->m_pNextDLL
  1488. )
  1489. {
  1490. if( (! pDLL->m_bSystem)
  1491. && pDLL->m_hResource != NULL
  1492. )
  1493. {
  1494. if( bufferOut.FindAndLoad(
  1495. pDLL->m_hResource,
  1496. strResourceType,
  1497. nResourceName,
  1498. nLangIdDesired
  1499. )
  1500. )
  1501. {
  1502. if( p_wLangIdOut != NULL )
  1503. (*p_wLangIdOut) = nLangIdDesired;
  1504. if( p_hInstOut != NULL )
  1505. (*p_hInstOut) = pDLL->m_hResource;
  1506. AfxUnlockGlobals(CRIT_DYNLINKLIST);
  1507. return true;
  1508. }
  1509. }
  1510. }
  1511. AfxUnlockGlobals( CRIT_DYNLINKLIST );
  1512. hInstance = pModuleState->m_appLangDLL;
  1513. if( hInstance != NULL )
  1514. {
  1515. if( bufferOut.FindAndLoad(
  1516. hInstance,
  1517. strResourceType,
  1518. nResourceName,
  1519. nLangIdDesired
  1520. )
  1521. )
  1522. {
  1523. if( p_wLangIdOut != NULL )
  1524. (*p_wLangIdOut) = nLangIdDesired;
  1525. if( p_hInstOut != NULL )
  1526. (*p_hInstOut) = hInstance;
  1527. return true;
  1528. }
  1529. }
  1530. #endif // (!defined __EXT_PROFUIS_STATIC_LINK)
  1531. if( pModuleState->m_bSystem )
  1532. {
  1533. hInstance = AfxGetResourceHandle();
  1534. if( bufferOut.FindAndLoad(
  1535. hInstance,
  1536. strResourceType,
  1537. nResourceName,
  1538. nLangIdDesired
  1539. )
  1540. )
  1541. {
  1542. if( p_wLangIdOut != NULL )
  1543. (*p_wLangIdOut) = nLangIdDesired;
  1544. if( p_hInstOut != NULL )
  1545. (*p_hInstOut) = hInstance;
  1546. return true;
  1547. }
  1548. } // if( pModuleState->m_bSystem )
  1549. #if (!defined __EXT_PROFUIS_STATIC_LINK)
  1550. AfxLockGlobals(CRIT_DYNLINKLIST);
  1551. for( pDLL = pModuleState->m_libraryList;
  1552. pDLL != NULL;
  1553. pDLL = pDLL->m_pNextDLL
  1554. )
  1555. {
  1556. if( pDLL->m_bSystem
  1557. && pDLL->m_hResource != NULL
  1558. )
  1559. {
  1560. if( bufferOut.FindAndLoad(
  1561. pDLL->m_hResource,
  1562. strResourceType,
  1563. nResourceName,
  1564. nLangIdDesired
  1565. )
  1566. )
  1567. {
  1568. if( p_wLangIdOut != NULL )
  1569. (*p_wLangIdOut) = nLangIdDesired;
  1570. if( p_hInstOut != NULL )
  1571. (*p_hInstOut) = pDLL->m_hResource;
  1572. AfxUnlockGlobals(CRIT_DYNLINKLIST);
  1573. return true;
  1574. }
  1575. }
  1576. }
  1577. AfxUnlockGlobals( CRIT_DYNLINKLIST );
  1578. #endif // (!defined __EXT_PROFUIS_STATIC_LINK)
  1579. hInstance = AfxGetResourceHandle();
  1580. if( bufferOut.FindAndLoad(
  1581. hInstance,
  1582. strResourceType,
  1583. nResourceName,
  1584. nLangIdDesired
  1585. )
  1586. )
  1587. {
  1588. if( p_wLangIdOut != NULL )
  1589. (*p_wLangIdOut) = nLangIdDesired;
  1590. if( p_hInstOut != NULL )
  1591. (*p_hInstOut) = hInstance;
  1592. return true;
  1593. }
  1594. return false;
  1595. }
  1596. bool CExtResourceManager::LoadResourceBufferEx(
  1597. CExtResourceManager::CExtResourceMemoryBuffer & bufferOut,
  1598. __EXT_MFC_SAFE_LPCTSTR strResourceType,
  1599. UINT nResourceName,
  1600. WORD nLangIdDesired,
  1601. WORD nLangIdNeutral, // = CExtResourceManager::g_nLangIdNeutral
  1602. WORD * p_wLangIdOut, // = NULL
  1603. HINSTANCE * p_hInstOut // = NULL
  1604. )
  1605. {
  1606. __PROF_UIS_MANAGE_STATE;
  1607. ASSERT_VALID( this );
  1608. if( p_wLangIdOut != NULL )
  1609. (*p_wLangIdOut) = GetLangIdNeutral();
  1610. if( p_hInstOut != NULL )
  1611. (*p_hInstOut) = NULL;
  1612. if( ! IsCustomLangAllowed() )
  1613. {
  1614. if( p_wLangIdOut != NULL )
  1615. (*p_wLangIdOut) = GetLangIdNeutral();
  1616. HINSTANCE hInst =
  1617. ::AfxFindResourceHandle(
  1618. LPCTSTR(__EXT_MFC_UINT_PTR(nResourceName)),
  1619. strResourceType
  1620. );
  1621. if( p_hInstOut != NULL )
  1622. (*p_hInstOut) = hInst;
  1623. if( hInst == NULL )
  1624. return false;
  1625. bufferOut.Empty();
  1626. return
  1627. bufferOut.FindAndLoad(
  1628. hInst,
  1629. strResourceType,
  1630. nResourceName,
  1631. MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT)
  1632. );
  1633. } // if( ! IsCustomLangAllowed() )
  1634. if( LoadResourceBufferSingleLanguage(
  1635. bufferOut,
  1636. strResourceType,
  1637. nResourceName,
  1638. nLangIdDesired,
  1639. p_wLangIdOut,
  1640. p_hInstOut
  1641. )
  1642. )
  1643. return true;
  1644. if( nLangIdDesired == nLangIdNeutral )
  1645. return false;
  1646. return
  1647. LoadResourceBufferSingleLanguage(
  1648. bufferOut,
  1649. strResourceType,
  1650. nResourceName,
  1651. nLangIdNeutral,
  1652. p_wLangIdOut,
  1653. p_hInstOut
  1654. );
  1655. }
  1656. bool CExtResourceManager::LoadResourceBuffer(
  1657. CExtResourceManager::CExtResourceMemoryBuffer & bufferOut,
  1658. __EXT_MFC_SAFE_LPCTSTR strResourceType,
  1659. UINT nResourceName,
  1660. WORD * p_wLangIdOut, // = NULL
  1661. HINSTANCE * p_hInstOut // = NULL
  1662. )
  1663. {
  1664. ASSERT_VALID( this );
  1665. if( ! IsCustomLangAllowed() )
  1666. {
  1667. __PROF_UIS_MANAGE_STATE;
  1668. if( p_wLangIdOut != NULL )
  1669. (*p_wLangIdOut) = GetLangIdNeutral();
  1670. HINSTANCE hInst =
  1671. ::AfxFindResourceHandle(
  1672. LPCTSTR(__EXT_MFC_UINT_PTR(nResourceName)),
  1673. strResourceType
  1674. );
  1675. if( p_hInstOut != NULL )
  1676. (*p_hInstOut) = hInst;
  1677. if( hInst == NULL )
  1678. return false;
  1679. bufferOut.Empty();
  1680. return
  1681. bufferOut.FindAndLoad(
  1682. hInst,
  1683. strResourceType,
  1684. nResourceName,
  1685. MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT)
  1686. );
  1687. } // if( ! IsCustomLangAllowed() )
  1688. return
  1689. LoadResourceBufferEx(
  1690. bufferOut,
  1691. strResourceType,
  1692. nResourceName,
  1693. GetLangIdDesired(),
  1694. GetLangIdNeutral(),
  1695. p_wLangIdOut,
  1696. p_hInstOut
  1697. );
  1698. }
  1699. bool CExtResourceManager::LoadStringEx(
  1700. CExtSafeString & strOut,
  1701. UINT nResourceName,
  1702. WORD nLangIdDesired,
  1703. WORD nLangIdNeutral, // = CExtResourceManager::g_nLangIdNeutral
  1704. WORD * p_wLangIdOut, // = NULL
  1705. HINSTANCE * p_hInstOut // = NULL
  1706. )
  1707. {
  1708. ASSERT_VALID( this );
  1709. if( ! IsCustomLangAllowed() )
  1710. {
  1711. __PROF_UIS_MANAGE_STATE;
  1712. if( p_wLangIdOut != NULL )
  1713. (*p_wLangIdOut) = GetLangIdNeutral();
  1714. if( p_hInstOut != NULL )
  1715. (*p_hInstOut) = ::AfxGetResourceHandle();
  1716. return strOut.LoadString( nResourceName ) ? true : false;
  1717. } // if( ! IsCustomLangAllowed() )
  1718. strOut.Empty();
  1719. CExtResourceMemoryBuffer bufferOut;
  1720. if( ! LoadResourceBufferEx(
  1721. bufferOut,
  1722. RT_STRING,
  1723. (nResourceName>>4)+1,
  1724. nLangIdDesired,
  1725. nLangIdNeutral,
  1726. p_wLangIdOut,
  1727. p_hInstOut
  1728. )
  1729. )
  1730. {
  1731. //ASSERT( FALSE );
  1732. return false;
  1733. }
  1734. ASSERT( ! bufferOut.IsEmpty() );
  1735. ASSERT( bufferOut.GetBuffer() > 0 );
  1736. LPWORD pSource = (LPWORD)bufferOut.GetBuffer();
  1737. ASSERT( pSource != NULL );
  1738. UINT nTableEntryIdx = nResourceName&0x0F;
  1739. for( UINT nIdx = 0; nIdx < nTableEntryIdx; nIdx++ )
  1740. {
  1741. WORD wStrLen = pSource[0];
  1742. pSource += wStrLen + 1;
  1743. } // for( UINT nIdx = 0; nIdx < nTableEntryIdx; nIdx++ )
  1744. WORD wStrLen = pSource[0];
  1745. if( wStrLen == 0 )
  1746. return true;
  1747. pSource ++;
  1748. #if (defined _UNICODE) || ( _MFC_VER < 0x700 )
  1749. CExtSafeString strTemp(
  1750. reinterpret_cast < wchar_t * > ( pSource ),
  1751. wStrLen
  1752. );
  1753. strOut = strTemp;
  1754. #else
  1755. strOut.Empty();
  1756. if( wStrLen == 0 )
  1757. return true;
  1758. LPSTR pStrOut = strOut.GetBuffer( wStrLen+1 );
  1759. if( pStrOut == NULL )
  1760. return false;
  1761. ::memset( pStrOut, 0, wStrLen+1 );
  1762. int nResult =
  1763. ::WideCharToMultiByte(
  1764. CP_ACP,
  1765. 0,
  1766. reinterpret_cast < wchar_t * > ( pSource ),
  1767. wStrLen, // -1
  1768. pStrOut,
  1769. wStrLen,
  1770. NULL,
  1771. NULL
  1772. );
  1773. strOut.ReleaseBuffer();
  1774. if( nResult < 0 )
  1775. return false;
  1776. #endif
  1777. return true;
  1778. }
  1779. bool CExtResourceManager::LoadString(
  1780. CExtSafeString & strOut,
  1781. __EXT_MFC_SAFE_LPCTSTR strResourceName,
  1782. WORD * p_wLangIdOut, // = NULL
  1783. HINSTANCE * p_hInstOut // = NULL
  1784. )
  1785. {
  1786. ASSERT_VALID( this );
  1787. if( ! IsCustomLangAllowed() )
  1788. {
  1789. __PROF_UIS_MANAGE_STATE;
  1790. if( p_wLangIdOut != NULL )
  1791. (*p_wLangIdOut) = GetLangIdNeutral();
  1792. if( p_hInstOut != NULL )
  1793. (*p_hInstOut) = ::AfxGetResourceHandle();
  1794. return
  1795. strOut.LoadString( UINT(__EXT_MFC_UINT_PTR(LPCTSTR(strResourceName))) ) ? true : false;
  1796. } // if( ! IsCustomLangAllowed() )
  1797. return
  1798. LoadStringEx(
  1799. strOut,
  1800. UINT(__EXT_MFC_UINT_PTR(LPCTSTR(strResourceName))),
  1801. GetLangIdDesired(),
  1802. GetLangIdNeutral(),
  1803. p_wLangIdOut,
  1804. p_hInstOut
  1805. );
  1806. }
  1807. bool CExtResourceManager::LoadString(
  1808. CExtSafeString & strOut,
  1809. UINT nResourceName,
  1810. WORD * p_wLangIdOut, // = NULL
  1811. HINSTANCE * p_hInstOut // = NULL
  1812. )
  1813. {
  1814. ASSERT_VALID( this );
  1815. if( ! IsCustomLangAllowed() )
  1816. {
  1817. __PROF_UIS_MANAGE_STATE;
  1818. if( p_wLangIdOut != NULL )
  1819. (*p_wLangIdOut) = GetLangIdNeutral();
  1820. if( p_hInstOut != NULL )
  1821. (*p_hInstOut) = ::AfxGetResourceHandle();
  1822. return strOut.LoadString( nResourceName ) ? true : false;
  1823. } // if( ! IsCustomLangAllowed() )
  1824. return
  1825. LoadStringEx(
  1826. strOut,
  1827. nResourceName,
  1828. GetLangIdDesired(),
  1829. GetLangIdNeutral(),
  1830. p_wLangIdOut,
  1831. p_hInstOut
  1832. );
  1833. }
  1834. bool CExtResourceManager::LoadMenuEx(
  1835. CMenu & menuOut,
  1836. UINT nResourceName,
  1837. WORD nLangIdDesired,
  1838. WORD nLangIdNeutral, // = CExtResourceManager::g_nLangIdNeutral
  1839. WORD * p_wLangIdOut, // = NULL
  1840. HINSTANCE * p_hInstOut // = NULL
  1841. )
  1842. {
  1843. ASSERT_VALID( this );
  1844. if( menuOut.GetSafeHmenu() != NULL )
  1845. menuOut.DestroyMenu();
  1846. if( ! IsCustomLangAllowed() )
  1847. {
  1848. __PROF_UIS_MANAGE_STATE;
  1849. if( p_wLangIdOut != NULL )
  1850. (*p_wLangIdOut) = GetLangIdNeutral();
  1851. if( p_hInstOut != NULL )
  1852. (*p_hInstOut) = ::AfxGetResourceHandle();
  1853. return menuOut.LoadMenu( nResourceName ) ? true : false;
  1854. } // if( ! IsCustomLangAllowed() )
  1855. CExtResourceMemoryBuffer bufferOut;
  1856. if( ! LoadResourceBufferEx(
  1857. bufferOut,
  1858. RT_MENU,
  1859. nResourceName,
  1860. nLangIdDesired,
  1861. nLangIdNeutral,
  1862. p_wLangIdOut,
  1863. p_hInstOut
  1864. )
  1865. )
  1866. {
  1867. //ASSERT( FALSE );
  1868. return false;
  1869. }
  1870. ASSERT( ! bufferOut.IsEmpty() );
  1871. ASSERT( bufferOut.GetBuffer() > 0 );
  1872. LPMENUTEMPLATE pTemplate = LPMENUTEMPLATE( bufferOut.GetBuffer() );
  1873. HMENU hMenu = ::LoadMenuIndirect( pTemplate );
  1874. if( hMenu == NULL )
  1875. {
  1876. ASSERT( FALSE );
  1877. return FALSE;
  1878. }
  1879. menuOut.Attach( hMenu );
  1880. return true;
  1881. }
  1882. bool CExtResourceManager::LoadMenu(
  1883. CMenu & menuOut,
  1884. __EXT_MFC_SAFE_LPCTSTR strResourceName,
  1885. WORD * p_wLangIdOut, // = NULL
  1886. HINSTANCE * p_hInstOut // = NULL
  1887. )
  1888. {
  1889. ASSERT_VALID( this );
  1890. if( ! IsCustomLangAllowed() )
  1891. {
  1892. __PROF_UIS_MANAGE_STATE;
  1893. if( p_wLangIdOut != NULL )
  1894. (*p_wLangIdOut) = GetLangIdNeutral();
  1895. if( p_hInstOut != NULL )
  1896. (*p_hInstOut) = ::AfxGetResourceHandle();
  1897. if( menuOut.GetSafeHmenu() != NULL )
  1898. menuOut.DestroyMenu();
  1899. return menuOut.LoadMenu( strResourceName ) ? true : false;
  1900. } // if( ! IsCustomLangAllowed() )
  1901. return
  1902. LoadMenuEx(
  1903. menuOut,
  1904. UINT(__EXT_MFC_UINT_PTR(LPCTSTR(strResourceName))),
  1905. GetLangIdDesired(),
  1906. GetLangIdNeutral(),
  1907. p_wLangIdOut,
  1908. p_hInstOut
  1909. );
  1910. }
  1911. bool CExtResourceManager::LoadMenu(
  1912. CMenu & menuOut,
  1913. UINT nResourceName,
  1914. WORD * p_wLangIdOut, // = NULL
  1915. HINSTANCE * p_hInstOut // = NULL
  1916. )
  1917. {
  1918. ASSERT_VALID( this );
  1919. if( ! IsCustomLangAllowed() )
  1920. {
  1921. __PROF_UIS_MANAGE_STATE;
  1922. if( p_wLangIdOut != NULL )
  1923. (*p_wLangIdOut) = GetLangIdNeutral();
  1924. if( p_hInstOut != NULL )
  1925. (*p_hInstOut) = ::AfxGetResourceHandle();
  1926. if( menuOut.GetSafeHmenu() != NULL )
  1927. menuOut.DestroyMenu();
  1928. return menuOut.LoadMenu( nResourceName ) ? true : false;
  1929. } // if( ! IsCustomLangAllowed() )
  1930. return
  1931. LoadMenuEx(
  1932. menuOut,
  1933. nResourceName,
  1934. GetLangIdDesired(),
  1935. GetLangIdNeutral(),
  1936. p_wLangIdOut,
  1937. p_hInstOut
  1938. );
  1939. }
  1940. HACCEL CExtResourceManager::LoadAcceleratorsEx(
  1941. UINT nResourceName,
  1942. WORD nLangIdDesired,
  1943. WORD nLangIdNeutral, // = CExtResourceManager::g_nLangIdNeutral
  1944. WORD * p_wLangIdOut, // = NULL
  1945. HINSTANCE * p_hInstOut // = NULL
  1946. )
  1947. {
  1948. ASSERT_VALID( this );
  1949. if( ! IsCustomLangAllowed() )
  1950. {
  1951. __PROF_UIS_MANAGE_STATE;
  1952. if( p_wLangIdOut != NULL )
  1953. (*p_wLangIdOut) = GetLangIdNeutral();
  1954. HINSTANCE hInstResource =
  1955. ::AfxFindResourceHandle(
  1956. MAKEINTRESOURCE(nResourceName),
  1957. RT_ACCELERATOR
  1958. );
  1959. if( hInstResource == NULL )
  1960. return NULL;
  1961. if( p_hInstOut != NULL )
  1962. (*p_hInstOut) = hInstResource;
  1963. HACCEL hAccel =
  1964. ::LoadAccelerators(
  1965. hInstResource,
  1966. MAKEINTRESOURCE(nResourceName)
  1967. );
  1968. return hAccel;
  1969. } // if( ! IsCustomLangAllowed() )
  1970. CExtResourceMemoryBuffer bufferOut;
  1971. if( ! LoadResourceBufferEx(
  1972. bufferOut,
  1973. RT_ACCELERATOR,
  1974. nResourceName,
  1975. nLangIdDesired,
  1976. nLangIdNeutral,
  1977. p_wLangIdOut,
  1978. p_hInstOut
  1979. )
  1980. )
  1981. {
  1982. //ASSERT( FALSE );
  1983. return NULL;
  1984. }
  1985. ASSERT( ! bufferOut.IsEmpty() );
  1986. ASSERT( bufferOut.GetBuffer() > 0 );
  1987. struct res_accel_t
  1988. {
  1989.     WORD   fVirt;
  1990.     WORD   key;
  1991.     DWORD  cmd;
  1992. };
  1993. int i, nCount = bufferOut.GetSize() / sizeof( res_accel_t );
  1994. ASSERT( nCount > 0 );
  1995. CExtResourceMemoryBuffer bufferTmp;
  1996. bufferTmp.Alloc( nCount * sizeof(ACCEL) );
  1997. res_accel_t * pResourceData = (res_accel_t *)( bufferOut.GetBuffer() );
  1998. LPACCEL pTemplate = LPACCEL( bufferTmp.GetBuffer() );
  1999. for( i = 0; i < nCount; i++ )
  2000. {
  2001. pTemplate[i].fVirt = (BYTE)pResourceData[i].fVirt;
  2002. pTemplate[i].key = pResourceData[i].key;
  2003. pTemplate[i].cmd = (WORD)pResourceData[i].cmd;
  2004. } // for( i = 0; i < nCount; i++ )
  2005. HACCEL hAccel =
  2006. ::CreateAcceleratorTable(
  2007. pTemplate,
  2008. nCount
  2009. );
  2010. return hAccel;
  2011. }
  2012. HACCEL CExtResourceManager::LoadAccelerators(
  2013. __EXT_MFC_SAFE_LPCTSTR strResourceName,
  2014. WORD * p_wLangIdOut, // = NULL
  2015. HINSTANCE * p_hInstOut // = NULL
  2016. )
  2017. {
  2018. ASSERT_VALID( this );
  2019. if( ! IsCustomLangAllowed() )
  2020. {
  2021. __PROF_UIS_MANAGE_STATE;
  2022. if( p_wLangIdOut != NULL )
  2023. (*p_wLangIdOut) = GetLangIdNeutral();
  2024. HINSTANCE hInstResource =
  2025. ::AfxFindResourceHandle(
  2026. strResourceName,
  2027. RT_ACCELERATOR
  2028. );
  2029. if( hInstResource == NULL )
  2030. return NULL;
  2031. if( p_hInstOut != NULL )
  2032. (*p_hInstOut) = hInstResource;
  2033. HACCEL hAccel =
  2034. ::LoadAccelerators(
  2035. hInstResource,
  2036. strResourceName
  2037. );
  2038. return hAccel;
  2039. } // if( ! IsCustomLangAllowed() )
  2040. return
  2041. LoadAcceleratorsEx(
  2042. UINT(__EXT_MFC_UINT_PTR(LPCTSTR(strResourceName))),
  2043. GetLangIdDesired(),
  2044. GetLangIdNeutral(),
  2045. p_wLangIdOut,
  2046. p_hInstOut
  2047. );
  2048. }
  2049. HACCEL CExtResourceManager::LoadAccelerators(
  2050. UINT nResourceName,
  2051. WORD * p_wLangIdOut, // = NULL
  2052. HINSTANCE * p_hInstOut // = NULL
  2053. )
  2054. {
  2055. ASSERT_VALID( this );
  2056. if( ! IsCustomLangAllowed() )
  2057. {
  2058. __PROF_UIS_MANAGE_STATE;
  2059. if( p_wLangIdOut != NULL )
  2060. (*p_wLangIdOut) = GetLangIdNeutral();
  2061. HINSTANCE hInstResource =
  2062. ::AfxFindResourceHandle(
  2063. MAKEINTRESOURCE(nResourceName),
  2064. RT_ACCELERATOR
  2065. );
  2066. if( hInstResource == NULL )
  2067. return NULL;
  2068. if( p_hInstOut != NULL )
  2069. (*p_hInstOut) = hInstResource;
  2070. HACCEL hAccel =
  2071. ::LoadAccelerators(
  2072. hInstResource,
  2073. MAKEINTRESOURCE(nResourceName)
  2074. );
  2075. return hAccel;
  2076. } // if( ! IsCustomLangAllowed() )
  2077. return
  2078. LoadAcceleratorsEx(
  2079. nResourceName,
  2080. GetLangIdDesired(),
  2081. GetLangIdNeutral(),
  2082. p_wLangIdOut,
  2083. p_hInstOut
  2084. );
  2085. }
  2086. bool CExtResourceManager::LoadBitmapEx(
  2087. CExtBitmap & _bitmap,
  2088. UINT nResourceName,
  2089. WORD nLangIdDesired,
  2090. WORD nLangIdNeutral, // = CExtResourceManager::g_nLangIdNeutral
  2091. WORD * p_wLangIdOut, // = NULL
  2092. HINSTANCE * p_hInstOut // = NULL
  2093. )
  2094. {
  2095. ASSERT_VALID( this );
  2096. _bitmap.Empty();
  2097. if( ! IsCustomLangAllowed() )
  2098. {
  2099. __PROF_UIS_MANAGE_STATE;
  2100. if( p_wLangIdOut != NULL )
  2101. (*p_wLangIdOut) = GetLangIdNeutral();
  2102. HINSTANCE hInstResource =
  2103. ::AfxFindResourceHandle(
  2104. MAKEINTRESOURCE(nResourceName),
  2105. RT_BITMAP
  2106. );
  2107. if( hInstResource == NULL )
  2108. return NULL;
  2109. if( p_hInstOut != NULL )
  2110. (*p_hInstOut) = hInstResource;
  2111. // HBITMAP hBitmap =
  2112. // ::LoadBitmap(
  2113. // hInstResource,
  2114. // MAKEINTRESOURCE(nResourceName)
  2115. // );
  2116. // if( hBitmap == NULL )
  2117. // return false;
  2118. // _bitmap.FromBitmap( hBitmap );
  2119. // ::DeleteObject( hBitmap );
  2120. _bitmap.LoadBMP_Resource(
  2121. MAKEINTRESOURCE(nResourceName),
  2122. RT_BITMAP,
  2123. hInstResource
  2124. );
  2125. return ( ! _bitmap.IsEmpty() );
  2126. } // if( ! IsCustomLangAllowed() )
  2127. HRSRC hResource = NULL;
  2128. HINSTANCE hInst =
  2129. FindResourceHandleEx(
  2130. RT_BITMAP,
  2131. nResourceName,
  2132. nLangIdDesired,
  2133. nLangIdNeutral,
  2134. p_wLangIdOut,
  2135. &hResource
  2136. );
  2137. if( hInst == NULL )
  2138. return NULL;
  2139. if( p_hInstOut != NULL )
  2140. (*p_hInstOut) = hInst;
  2141. ASSERT( hResource != NULL );
  2142. _bitmap.LoadBMP_Resource(
  2143. hInst,
  2144. hResource
  2145. );
  2146. return ( ! _bitmap.IsEmpty() );
  2147. }
  2148. bool CExtResourceManager::LoadBitmap(
  2149. CExtBitmap & _bitmap,
  2150. __EXT_MFC_SAFE_LPCTSTR strResourceName,
  2151. WORD * p_wLangIdOut, // = NULL
  2152. HINSTANCE * p_hInstOut // = NULL
  2153. )
  2154. {
  2155. ASSERT_VALID( this );
  2156. _bitmap.Empty();
  2157. if( ! IsCustomLangAllowed() )
  2158. {
  2159. __PROF_UIS_MANAGE_STATE;
  2160. if( p_wLangIdOut != NULL )
  2161. (*p_wLangIdOut) = GetLangIdNeutral();
  2162. HINSTANCE hInstResource =
  2163. ::AfxFindResourceHandle(
  2164. strResourceName,
  2165. RT_BITMAP
  2166. );
  2167. if( hInstResource == NULL )
  2168. return NULL;
  2169. if( p_hInstOut != NULL )
  2170. (*p_hInstOut) = hInstResource;
  2171. // HBITMAP hBitmap =
  2172. // ::LoadBitmap(
  2173. // hInstResource,
  2174. // strResourceName
  2175. // );
  2176. // if( hBitmap == NULL )
  2177. // return false;
  2178. // _bitmap.FromBitmap( hBitmap );
  2179. // ::DeleteObject( hBitmap );
  2180. _bitmap.LoadBMP_Resource(
  2181. strResourceName,
  2182. RT_BITMAP,
  2183. hInstResource
  2184. );
  2185. return ( ! _bitmap.IsEmpty() );
  2186. } // if( ! IsCustomLangAllowed() )
  2187. return
  2188. LoadBitmapEx(
  2189. _bitmap,
  2190. UINT(__EXT_MFC_UINT_PTR(LPCTSTR(strResourceName))),
  2191. GetLangIdDesired(),
  2192. GetLangIdNeutral(),
  2193. p_wLangIdOut,
  2194. p_hInstOut
  2195. );
  2196. }
  2197. bool CExtResourceManager::LoadBitmap(
  2198. CExtBitmap & _bitmap,
  2199. UINT nResourceName,
  2200. WORD * p_wLangIdOut, // = NULL
  2201. HINSTANCE * p_hInstOut // = NULL
  2202. )
  2203. {
  2204. ASSERT_VALID( this );
  2205. _bitmap.Empty();
  2206. if( ! IsCustomLangAllowed() )
  2207. {
  2208. __PROF_UIS_MANAGE_STATE;
  2209. if( p_wLangIdOut != NULL )
  2210. (*p_wLangIdOut) = GetLangIdNeutral();
  2211. HINSTANCE hInstResource =
  2212. ::AfxFindResourceHandle(
  2213. MAKEINTRESOURCE(nResourceName),
  2214. RT_BITMAP
  2215. );
  2216. if( hInstResource == NULL )
  2217. return NULL;
  2218. if( p_hInstOut != NULL )
  2219. (*p_hInstOut) = hInstResource;
  2220. // HBITMAP hBitmap =
  2221. // ::LoadBitmap(
  2222. // hInstResource,
  2223. // MAKEINTRESOURCE(nResourceName)
  2224. // );
  2225. // if( hBitmap == NULL )
  2226. // return false;
  2227. // _bitmap.FromBitmap( hBitmap );
  2228. // ::DeleteObject( hBitmap );
  2229. _bitmap.LoadBMP_Resource(
  2230. MAKEINTRESOURCE(nResourceName),
  2231. RT_BITMAP,
  2232. hInstResource
  2233. );
  2234. return ( ! _bitmap.IsEmpty() );
  2235. } // if( ! IsCustomLangAllowed() )
  2236. return
  2237. LoadBitmapEx(
  2238. _bitmap,
  2239. nResourceName,
  2240. GetLangIdDesired(),
  2241. GetLangIdNeutral(),
  2242. p_wLangIdOut,
  2243. p_hInstOut
  2244. );
  2245. }
  2246. /////////////////////////////////////////////////////////////////////////////
  2247. // CExtResDlg window
  2248. IMPLEMENT_DYNCREATE( CExtResDlg, CDialog )
  2249. IMPLEMENT_CExtPmBridge_MEMBERS( CExtResDlg );
  2250. CExtResDlg::CExtResDlg()
  2251. : m_lpszTemplateName_SAVED( NULL )
  2252. , m_sizeDLUCVT( 0, 0 )
  2253. {
  2254. PmBridge_Install();
  2255. }
  2256. CExtResDlg::CExtResDlg(
  2257. UINT nIDTemplate,
  2258. CWnd * pParentWnd // = NULL
  2259. )
  2260. : CDialog( nIDTemplate, pParentWnd )
  2261. , m_lpszTemplateName_SAVED( NULL )
  2262. , m_sizeDLUCVT( 0, 0 )
  2263. {
  2264. PmBridge_Install();
  2265. }
  2266. CExtResDlg::CExtResDlg(
  2267. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  2268. CWnd * pParentWnd // = NULL
  2269. )
  2270. : CDialog( lpszTemplateName, pParentWnd )
  2271. , m_lpszTemplateName_SAVED( NULL )
  2272. , m_sizeDLUCVT( 0, 0 )
  2273. {
  2274. PmBridge_Install();
  2275. }
  2276. CExtResDlg::~CExtResDlg()
  2277. {
  2278. PmBridge_Uninstall();
  2279. }
  2280. int CExtResDlg::_DLU2PxHorz( int nX )
  2281. {
  2282. ASSERT_VALID( this );
  2283. if( m_sizeDLUCVT.cx == 0 )
  2284. {
  2285. RECT rc = { 0, 0, __EXT_MFC_DLU_BASE_CVT_CX, __EXT_MFC_DLU_BASE_CVT_CY };
  2286. MapDialogRect( &rc );
  2287. m_sizeDLUCVT.cx = rc.right - rc.left;
  2288. m_sizeDLUCVT.cy = rc.bottom - rc.top;
  2289. }
  2290. return ::MulDiv( nX, m_sizeDLUCVT.cx, __EXT_MFC_DLU_BASE_CVT_CX );
  2291. }
  2292. int CExtResDlg::_DLU2PxVert( int nY )
  2293. {
  2294. ASSERT_VALID( this );
  2295. if( m_sizeDLUCVT.cy == 0 )
  2296. {
  2297. RECT rc = { 0, 0, __EXT_MFC_DLU_BASE_CVT_CX, __EXT_MFC_DLU_BASE_CVT_CY };
  2298. MapDialogRect( &rc );
  2299. m_sizeDLUCVT.cx = rc.right - rc.left;
  2300. m_sizeDLUCVT.cy = rc.bottom - rc.top;
  2301. }
  2302. return ::MulDiv( nY, m_sizeDLUCVT.cy, __EXT_MFC_DLU_BASE_CVT_CY );
  2303. }
  2304. void CExtResDlg::_DLU2Px( POINT & _pt )
  2305. {
  2306. ASSERT_VALID( this );
  2307. _pt.x = _DLU2PxHorz( _pt.x );
  2308. _pt.y = _DLU2PxVert( _pt.y );
  2309. }
  2310. void CExtResDlg::_DLU2Px( SIZE & _size )
  2311. {
  2312. ASSERT_VALID( this );
  2313. _size.cx = _DLU2PxHorz( _size.cx );
  2314. _size.cy = _DLU2PxVert( _size.cy );
  2315. }
  2316. void CExtResDlg::_DLU2Px( RECT & _rc )
  2317. {
  2318. ASSERT_VALID( this );
  2319. _rc.left   = _DLU2PxHorz( _rc.left );
  2320. _rc.top    = _DLU2PxVert( _rc.top );
  2321. _rc.right  = _DLU2PxHorz( _rc.right );
  2322. _rc.bottom = _DLU2PxVert( _rc.bottom );
  2323. }
  2324. __EXT_MFC_SAFE_LPCTSTR CExtResDlg::OnQuerySkinnedFontParmName() const
  2325. {
  2326. ASSERT_VALID( this );
  2327. return NULL;
  2328. }
  2329. void CExtResDlg::PmBridge_OnPaintManagerChanged(
  2330. CExtPaintManager * pGlobalPM
  2331. )
  2332. {
  2333. CExtPmBridge::PmBridge_OnPaintManagerChanged( pGlobalPM );
  2334. HWND hWndOwn = GetSafeHwnd();
  2335. if( hWndOwn == NULL )
  2336. return;
  2337. HWND hWndParent = ::GetParent( hWndOwn );
  2338. if( hWndParent != NULL
  2339. && ( ::__EXT_MFC_GetWindowLong( hWndOwn, GWL_STYLE ) & WS_POPUP ) != 0 
  2340. )
  2341. {
  2342. ::SetWindowPos(
  2343. hWndOwn, NULL, 0, 0, 0, 0,
  2344. SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE
  2345. |SWP_NOZORDER|SWP_NOOWNERZORDER
  2346. |SWP_FRAMECHANGED
  2347. );
  2348. ::RedrawWindow(
  2349. hWndOwn,
  2350. NULL,
  2351. NULL,
  2352. RDW_INVALIDATE|RDW_ERASE|RDW_ALLCHILDREN
  2353. );
  2354. }
  2355. }
  2356. BEGIN_MESSAGE_MAP(CExtResDlg, CDialog)
  2357. //{{AFX_MSG_MAP(CExtResDlg)
  2358. ON_WM_ACTIVATE()
  2359. //}}AFX_MSG_MAP
  2360. END_MESSAGE_MAP()
  2361. void CExtResDlg::OnActivate( UINT nState, CWnd* pWndOther, BOOL bMinimized )
  2362. {
  2363. __PROF_UIS_MANAGE_STATE;
  2364. ASSERT_VALID( this );
  2365. nState;
  2366. pWndOther;
  2367. bMinimized;
  2368. }
  2369. BOOL CExtResDlg::Create(
  2370. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  2371. CWnd * pParentWnd // = NULL
  2372. )
  2373. {
  2374. __PROF_UIS_MANAGE_STATE;
  2375. ASSERT(
  2376. HIWORD(lpszTemplateName) == 0
  2377. || AfxIsValidString( lpszTemplateName )
  2378. );
  2379. m_lpszTemplateName = lpszTemplateName;  // used for help
  2380. if( HIWORD(m_lpszTemplateName) == 0
  2381. && m_nIDHelp == 0
  2382. )
  2383. m_nIDHelp = LOWORD((DWORD)(__EXT_MFC_DWORD_PTR)m_lpszTemplateName);
  2384. m_lpszTemplateName_SAVED = m_lpszTemplateName;
  2385. HRSRC hResource = NULL;
  2386. HINSTANCE hInst = 
  2387. g_ResourceManager->FindResourceHandle(
  2388. RT_DIALOG,
  2389. UINT(__EXT_MFC_UINT_PTR(LPCTSTR(lpszTemplateName))),
  2390. NULL,
  2391. &hResource
  2392. );
  2393. ASSERT( hInst != NULL );
  2394. ASSERT( hResource != NULL );
  2395. if( hInst == NULL )
  2396. return FALSE;
  2397. HGLOBAL hTemplate = LoadResource( hInst, hResource );
  2398. ASSERT( hTemplate != NULL );
  2399. BOOL bResult = CreateIndirect( hTemplate, pParentWnd, hInst );
  2400. FreeResource( hTemplate );
  2401. return bResult;
  2402. }
  2403. BOOL CExtResDlg::Create(
  2404. UINT nIDTemplate,
  2405. CWnd * pParentWnd // = NULL
  2406. )
  2407. {
  2408. return Create( MAKEINTRESOURCE(nIDTemplate), pParentWnd );
  2409. }
  2410. DLGTEMPLATE * CExtResDlg::stat_ChangeDlgFont(
  2411. const DLGTEMPLATE * pTemplate
  2412. )
  2413. {
  2414. CDialogTemplate dlgTemplate( pTemplate );
  2415. CExtSafeString strFaceDefault, strFace;
  2416. WORD wSizeDefault, wSize;
  2417. if( CExtResPP::stat_GetPropSheetFont(
  2418. strFaceDefault,
  2419. wSizeDefault,
  2420. FALSE
  2421. )
  2422. )
  2423. {
  2424. CString _strFaceBuffer;
  2425. BOOL bFontFetched =
  2426. CDialogTemplate::GetFont(
  2427. pTemplate,
  2428. _strFaceBuffer,
  2429. wSize
  2430. );
  2431. strFace = LPCTSTR( _strFaceBuffer );
  2432. if( ( (! bFontFetched )
  2433. || (strFace != strFaceDefault)
  2434. || (wSize != wSizeDefault)
  2435. )
  2436. && ( ( _tcscmp( strFace, _T("MS Sans Serif") ) == 0
  2437. || _tcscmp( strFace, _T("MS Shell Dlg") ) == 0
  2438. )
  2439. && (wSize == wSizeDefault)
  2440. )
  2441. )
  2442. dlgTemplate.SetFont(
  2443. strFaceDefault,
  2444. wSizeDefault
  2445. );
  2446. // else if(
  2447. // _tcscmp( strFace, _T("Khmer OS") ) == 0
  2448. // || _tcscmp( strFace, _T("Khmer OS System") ) == 0
  2449. // )
  2450. // dlgTemplate.SetFont(
  2451. // strFace,
  2452. // wSize
  2453. // );
  2454. }
  2455. return (DLGTEMPLATE*)dlgTemplate.Detach();
  2456. }
  2457. __EXT_MFC_INT_PTR CExtResDlg::DoModal()
  2458. {
  2459. __PROF_UIS_MANAGE_STATE;
  2460. m_lpszTemplateName_SAVED = m_lpszTemplateName;
  2461. return _DoModalImpl();
  2462. }
  2463. __EXT_MFC_INT_PTR CExtResDlg::_DoModalImpl()
  2464. {
  2465. ASSERT(
  2466. m_lpszTemplateName != NULL
  2467. || m_hDialogTemplate != NULL
  2468. || m_lpDialogTemplate != NULL
  2469. );
  2470. LPCDLGTEMPLATE lpDialogTemplate = m_lpDialogTemplate;
  2471. HGLOBAL hDialogTemplate = m_hDialogTemplate;
  2472. HINSTANCE hInst = ::AfxGetResourceHandle();
  2473. if( m_lpszTemplateName != NULL )
  2474. {
  2475. HRSRC hResource = NULL;
  2476. hInst = 
  2477. g_ResourceManager->FindResourceHandle(
  2478. RT_DIALOG,
  2479. UINT(__EXT_MFC_UINT_PTR(LPCTSTR(m_lpszTemplateName))),
  2480. NULL,
  2481. &hResource
  2482. );
  2483. ASSERT( hInst != NULL );
  2484. ASSERT( hResource != NULL );
  2485. //hInst = AfxFindResourceHandle( m_lpszTemplateName, RT_DIALOG );
  2486. //HRSRC hResource = ::FindResource( hInst, m_lpszTemplateName, RT_DIALOG );
  2487. hDialogTemplate = ::LoadResource( hInst, hResource );
  2488. } // if( m_lpszTemplateName != NULL )
  2489. if( hDialogTemplate != NULL )
  2490. lpDialogTemplate = (LPCDLGTEMPLATE)LockResource( hDialogTemplate );
  2491. if( lpDialogTemplate == NULL )
  2492. return -1;
  2493. HWND hWndParent = PreModal();
  2494. ::AfxUnhookWindowCreate();
  2495. BOOL bEnableParent = FALSE;
  2496. if( hWndParent != NULL && ::IsWindowEnabled( hWndParent ) )
  2497. {
  2498. ::EnableWindow( hWndParent, FALSE );
  2499. bEnableParent = TRUE;
  2500. } // if( hWndParent != NULL && ::IsWindowEnabled( hWndParent ) )
  2501. TRY
  2502. {
  2503. ::AfxHookWindowCreate( this );
  2504. if( CreateDlgIndirect(
  2505. lpDialogTemplate,
  2506. CWnd::FromHandle( hWndParent ),
  2507. hInst
  2508. )
  2509. )
  2510. {
  2511. if( (m_nFlags&WF_CONTINUEMODAL) != 0 )
  2512. {
  2513. DWORD dwFlags = MLF_SHOWONIDLE;
  2514. if( (GetStyle()&DS_NOIDLEMSG) != 0 )
  2515. dwFlags |= MLF_NOIDLEMSG;
  2516. int nModalResult = RunModalLoop( dwFlags );
  2517. VERIFY( nModalResult == m_nModalResult );
  2518. nModalResult;
  2519. } // if( (m_nFlags&WF_CONTINUEMODAL) != 0 )
  2520. if( m_hWnd != NULL )
  2521. SetWindowPos(
  2522. NULL, 0, 0, 0, 0,
  2523. SWP_HIDEWINDOW
  2524. |SWP_NOSIZE|SWP_NOMOVE
  2525. |SWP_NOACTIVATE|SWP_NOZORDER
  2526. );
  2527. }
  2528. }
  2529. CATCH_ALL(e)
  2530. {
  2531. DELETE_EXCEPTION( e );
  2532. m_nModalResult = -1;
  2533. }
  2534. END_CATCH_ALL
  2535. if( bEnableParent )
  2536. ::EnableWindow( hWndParent, TRUE );
  2537. if( hWndParent != NULL && ::GetActiveWindow() == m_hWnd )
  2538. ::SetActiveWindow( hWndParent );
  2539. DestroyWindow();
  2540. PostModal();
  2541. if( m_lpszTemplateName != NULL || m_hDialogTemplate != NULL )
  2542. UnlockResource( hDialogTemplate );
  2543. if (m_lpszTemplateName != NULL)
  2544. FreeResource( hDialogTemplate );
  2545. return m_nModalResult;
  2546. }
  2547. DLGTEMPLATE * CExtResDlg::OnAdjustDialogTemplate(
  2548. const DLGTEMPLATE * lpDialogTemplate
  2549. )
  2550. {
  2551. ASSERT( lpDialogTemplate != NULL);
  2552. DLGTEMPLATE * lpDialogTemplateOut =
  2553. g_ResourceManager->OnAdjustDialogTemplate(
  2554. lpDialogTemplate,
  2555. this
  2556. );
  2557. if( lpDialogTemplateOut != NULL )
  2558. return lpDialogTemplateOut;
  2559. lpDialogTemplateOut =
  2560. PmBridge_GetPM()->AdjustDialogTemplate(
  2561. lpDialogTemplate,
  2562. this
  2563. );
  2564. if( lpDialogTemplateOut != NULL )
  2565. return lpDialogTemplateOut;
  2566. lpDialogTemplateOut =
  2567. stat_ChangeDlgFont(
  2568. lpDialogTemplate
  2569. );
  2570. return lpDialogTemplateOut;
  2571. }
  2572. BOOL CExtResDlg::CreateDlgIndirect(
  2573. LPCDLGTEMPLATE lpDialogTemplate,
  2574. CWnd * pParentWnd,
  2575. HINSTANCE hInst
  2576. )
  2577. {
  2578. ASSERT( lpDialogTemplate != NULL);
  2579. lpDialogTemplate = (LPCDLGTEMPLATE)
  2580. OnAdjustDialogTemplate( lpDialogTemplate );
  2581. #ifdef _DEBUG
  2582. if( pParentWnd != NULL )
  2583. ASSERT_VALID( pParentWnd );
  2584. #endif // _DEBUG
  2585. if( hInst == NULL )
  2586. {
  2587. hInst = ::AfxGetResourceHandle();
  2588. if( hInst == NULL )
  2589. hInst = ::AfxGetInstanceHandle();
  2590. }
  2591. _AFX_OCC_DIALOG_INFO occDialogInfo;
  2592. COccManager * pOccManager = afxOccManager;
  2593. HGLOBAL hTemplate = NULL;
  2594. HWND hWnd = NULL;
  2595. #ifdef _DEBUG
  2596. DWORD dwError = 0;
  2597. #endif
  2598. TRY
  2599. {
  2600. VERIFY( AfxDeferRegisterClass( AFX_WNDCOMMCTLS_REG ) );
  2601. AfxDeferRegisterClass( AFX_WNDCOMMCTLSNEW_REG );
  2602. if( pOccManager != NULL )
  2603. {
  2604. if( ! SetOccDialogInfo( &occDialogInfo ) )
  2605. return FALSE;
  2606. lpDialogTemplate =
  2607. pOccManager->PreCreateDialog(
  2608. &occDialogInfo,
  2609. lpDialogTemplate
  2610. );
  2611. }
  2612. if( lpDialogTemplate == NULL )
  2613. return FALSE;
  2614. CString strFace;
  2615. WORD wSize = 0;
  2616. CString _strFaceBuffer;
  2617. BOOL bFontFetched =
  2618. CDialogTemplate::GetFont(
  2619. lpDialogTemplate,
  2620. _strFaceBuffer,
  2621. wSize
  2622. );
  2623. strFace = LPCTSTR( _strFaceBuffer );
  2624. BOOL bSetSysFont = ! bFontFetched;
  2625. if( (!bSetSysFont)
  2626. && GetSystemMetrics( SM_DBCSENABLED )
  2627. )
  2628. {
  2629. bSetSysFont =
  2630. (strFace == _T("MS Shell Dlg")
  2631. || strFace == _T("MS Sans Serif")
  2632. || strFace == _T("Helv")
  2633. );
  2634. if( bSetSysFont && (wSize == 8) )
  2635. wSize = 0;
  2636. }
  2637. if( bSetSysFont )
  2638. {
  2639. CDialogTemplate dlgTemp( lpDialogTemplate );
  2640. dlgTemp.SetSystemFont( wSize );
  2641. hTemplate = dlgTemp.Detach();
  2642. }
  2643. if( hTemplate != NULL )
  2644. lpDialogTemplate = (LPCDLGTEMPLATE)GlobalLock( hTemplate );
  2645. m_nModalResult = -1;
  2646. m_nFlags |= WF_CONTINUEMODAL;
  2647. ::AfxHookWindowCreate( this );
  2648. if( OnQueryAutomaticRTLTransform() )
  2649. {
  2650. if( (g_ResourceManager->OnQueryLangLayout()&LAYOUT_RTL) != 0 )
  2651. {
  2652. if( ((DLGTEMPLATEEX*)lpDialogTemplate)->signature == 0x0FFFF )
  2653. ((DLGTEMPLATEEX*)lpDialogTemplate)->exStyle |= WS_EX_LAYOUTRTL;
  2654. else
  2655. ((DLGTEMPLATE*)lpDialogTemplate)->dwExtendedStyle |= WS_EX_LAYOUTRTL;
  2656. }
  2657. }
  2658. hWnd =
  2659. ::CreateDialogIndirect(
  2660. hInst,
  2661. lpDialogTemplate,
  2662. pParentWnd->GetSafeHwnd(),
  2663. AfxDlgProc
  2664. );
  2665. #ifdef _DEBUG
  2666. dwError = ::GetLastError();
  2667. #endif
  2668. }
  2669. CATCH_ALL(e)
  2670. {
  2671. DELETE_EXCEPTION(e);
  2672. m_nModalResult = -1;
  2673. }
  2674. END_CATCH_ALL
  2675. if( pOccManager != NULL )
  2676. {
  2677. pOccManager->PostCreateDialog( &occDialogInfo );
  2678. if( hWnd != NULL )
  2679. SetOccDialogInfo( NULL );
  2680. }
  2681. if( !AfxUnhookWindowCreate() )
  2682. PostNcDestroy();
  2683. if( hWnd != NULL
  2684. && ( (m_nFlags&WF_CONTINUEMODAL) == 0 )
  2685. )
  2686. {
  2687. ::DestroyWindow(hWnd);
  2688. hWnd = NULL;
  2689. }
  2690. if( hTemplate != NULL )
  2691. {
  2692. GlobalUnlock( hTemplate );
  2693. GlobalFree( hTemplate );
  2694. }
  2695. if( hWnd == NULL && (m_nFlags&WF_CONTINUEMODAL) != 0 )
  2696. {
  2697. #ifdef _DEBUG
  2698. if (afxOccManager == NULL)
  2699. {
  2700. TRACE0(">>> If this dialog has OLE controls:n");
  2701. TRACE0(">>> AfxEnableControlContainer has not been called yet.n");
  2702. TRACE0(">>> You should call it in your app's InitInstance function.n");
  2703. }
  2704. else if( dwError != 0 )
  2705. {
  2706. TRACE1("Warning: Dialog creation failed!  GetLastError returns 0x%8.8Xn", dwError);
  2707. }
  2708. #endif //_DEBUG
  2709. return FALSE;
  2710. }
  2711. ASSERT( hWnd == m_hWnd );
  2712. return TRUE;
  2713. }
  2714. BOOL CExtResDlg::CreateDlgIndirect(
  2715. LPCDLGTEMPLATE lpDialogTemplate,
  2716. CWnd * pParentWnd
  2717. )
  2718. {
  2719. return CreateDlgIndirect( lpDialogTemplate, pParentWnd, NULL );
  2720. }
  2721. BOOL CExtResDlg::CreateIndirect(
  2722. LPCDLGTEMPLATE lpDialogTemplate,
  2723. CWnd * pParentWnd, // = NULL
  2724. void * lpDialogInit // = NULL
  2725. )
  2726. {
  2727. return
  2728. CreateIndirect(
  2729. lpDialogTemplate,
  2730. pParentWnd,
  2731. lpDialogInit,
  2732. NULL
  2733. );
  2734. }
  2735. BOOL CExtResDlg::CreateIndirect(
  2736. HGLOBAL hDialogTemplate,
  2737. CWnd * pParentWnd // = NULL
  2738. )
  2739. {
  2740. return
  2741. CreateIndirect(
  2742. hDialogTemplate,
  2743. pParentWnd,
  2744. NULL
  2745. );
  2746. }
  2747. BOOL CExtResDlg::CreateIndirect(
  2748. LPCDLGTEMPLATE lpDialogTemplate,
  2749. CWnd * pParentWnd,
  2750. void * lpDialogInit,
  2751. HINSTANCE hInst
  2752. )
  2753. {
  2754. ASSERT( lpDialogTemplate != NULL );
  2755. if( pParentWnd == NULL )
  2756. pParentWnd = ::AfxGetMainWnd();
  2757. m_lpDialogInit = lpDialogInit;
  2758. return
  2759. CreateDlgIndirect(
  2760. lpDialogTemplate,
  2761. pParentWnd,
  2762. hInst
  2763. );
  2764. }
  2765. BOOL CExtResDlg::CreateIndirect(
  2766. HGLOBAL hDialogTemplate,
  2767. CWnd * pParentWnd,
  2768. HINSTANCE hInst
  2769. )
  2770. {
  2771. ASSERT(hDialogTemplate != NULL);
  2772. LPCDLGTEMPLATE lpDialogTemplate =
  2773. (LPCDLGTEMPLATE)LockResource( hDialogTemplate );
  2774. BOOL bResult =
  2775. CreateIndirect(
  2776. lpDialogTemplate,
  2777. pParentWnd,
  2778. NULL,
  2779. hInst
  2780. );
  2781. UnlockResource( hDialogTemplate );
  2782. return bResult;
  2783. }
  2784. BOOL CExtResDlg::OnInitDialog()
  2785. {
  2786. if( m_lpszTemplateName_SAVED != NULL )
  2787. {
  2788. m_lpDialogInit = NULL;
  2789. ExecuteDlgInit( m_lpszTemplateName_SAVED );
  2790. }
  2791. void * _lpDialogInit = m_lpDialogInit;
  2792. m_lpDialogInit = NULL;
  2793. LPCTSTR _lpszTemplateName = m_lpszTemplateName;
  2794. m_lpszTemplateName = NULL;
  2795. BOOL bRetVal = CDialog::OnInitDialog();
  2796. m_lpDialogInit = _lpDialogInit;
  2797. m_lpszTemplateName = _lpszTemplateName;
  2798. return bRetVal;
  2799. }
  2800. BOOL CExtResDlg::stat_ExecuteDlgInit(
  2801. CWnd * pWnd,
  2802. LPVOID pResource
  2803. )
  2804. {
  2805. BOOL bSuccess = TRUE;
  2806. if( pResource != NULL )
  2807. {
  2808. UNALIGNED WORD * pResWalk = (WORD*)pResource;
  2809. for( ; bSuccess && (*pResWalk) != 0; )
  2810. {
  2811. WORD nIDC = *pResWalk++;
  2812. WORD nMsg = *pResWalk++;
  2813. DWORD dwLen = *((UNALIGNED DWORD*&)pResWalk)++;
  2814. #define WIN16_LB_ADDSTRING  0x0401
  2815. #define WIN16_CB_ADDSTRING  0x0403
  2816. #define AFX_CB_ADDSTRING    0x1234
  2817. if( nMsg == AFX_CB_ADDSTRING )
  2818. nMsg = CBEM_INSERTITEM;
  2819. else if (nMsg == WIN16_LB_ADDSTRING)
  2820. nMsg = LB_ADDSTRING;
  2821. else if (nMsg == WIN16_CB_ADDSTRING)
  2822. nMsg = CB_ADDSTRING;
  2823. #ifdef _DEBUG
  2824. if( nMsg == LB_ADDSTRING
  2825. || nMsg == CB_ADDSTRING
  2826. || nMsg == CBEM_INSERTITEM
  2827. )
  2828. ASSERT( *((LPBYTE)pResWalk + (UINT)dwLen - 1) == 0 );
  2829. #endif
  2830. if( nMsg == CBEM_INSERTITEM )
  2831. {
  2832. USES_CONVERSION;
  2833. COMBOBOXEXITEM item;
  2834. item.mask = CBEIF_TEXT;
  2835. item.iItem = -1;
  2836. item.pszText = A2T( LPSTR(pResWalk) );
  2837. if( ::SendDlgItemMessage(
  2838. pWnd->m_hWnd,
  2839. nIDC,
  2840. nMsg,
  2841. 0,
  2842. (LPARAM)&item
  2843. ) == - 1
  2844. )
  2845. bSuccess = FALSE;
  2846. } // if( nMsg == CBEM_INSERTITEM )
  2847. else if( nMsg == LB_ADDSTRING || nMsg == CB_ADDSTRING )
  2848. {
  2849. LPCSTR strToInsert = LPSTR(pResWalk);
  2850. if( ::SendDlgItemMessageA(
  2851. pWnd->m_hWnd,
  2852. nIDC,
  2853. nMsg,
  2854. 0,
  2855. (LPARAM)strToInsert
  2856. ) == -1
  2857. )
  2858. bSuccess = FALSE;
  2859. } // else if( nMsg == LB_ADDSTRING || nMsg == CB_ADDSTRING )
  2860. pResWalk = (WORD*)((LPBYTE)pResWalk + (UINT)dwLen);
  2861. } // for( ; bSuccess && (*pResWalk) != 0; )
  2862. } // if( pResource != NULL )
  2863. if( bSuccess )
  2864. pWnd->SendMessageToDescendants(
  2865. WM_INITIALUPDATE,
  2866. 0,
  2867. 0,
  2868. FALSE,
  2869. FALSE
  2870. );
  2871. return bSuccess;
  2872. }
  2873. BOOL CExtResDlg::ExecuteDlgInit( __EXT_MFC_SAFE_LPCTSTR lpszResourceName )
  2874. {
  2875. LPVOID pResource = NULL;
  2876. HGLOBAL hGlobalResource = NULL;
  2877. if (lpszResourceName != NULL)
  2878. {
  2879. HRSRC hResource = NULL;
  2880. HINSTANCE hInst = 
  2881. g_ResourceManager->FindResourceHandle(
  2882. RT_DLGINIT,
  2883. UINT(__EXT_MFC_UINT_PTR(LPCTSTR(m_lpszTemplateName))),
  2884. NULL,
  2885. &hResource
  2886. );
  2887. if( hInst != NULL )
  2888. {
  2889. ASSERT( hResource != NULL );
  2890. hGlobalResource = LoadResource( hInst, hResource );
  2891. if( hGlobalResource == NULL )
  2892. return FALSE;
  2893. pResource = LockResource( hGlobalResource );
  2894. ASSERT( pResource != NULL );
  2895. } // if( hInst != NULL )
  2896. }
  2897. BOOL bResult = ExecuteDlgInit( pResource );
  2898. if( pResource != NULL && hGlobalResource != NULL )
  2899. {
  2900. UnlockResource( hGlobalResource );
  2901. FreeResource( hGlobalResource );
  2902. }
  2903. return bResult;
  2904. }
  2905. BOOL CExtResDlg::ExecuteDlgInit( LPVOID pResource )
  2906. {
  2907. return stat_ExecuteDlgInit( this, pResource );
  2908. }
  2909. /////////////////////////////////////////////////////////////////////////////
  2910. // CExtResPP window
  2911. IMPLEMENT_DYNCREATE( CExtResPP, CPropertyPage )
  2912. IMPLEMENT_CExtPmBridge_MEMBERS( CExtResPP );
  2913. CExtResPP::CExtResPP()
  2914. : m_lpszTemplateName_SAVED( NULL )
  2915. {
  2916. CommonConstruct( NULL, 0 );
  2917. PmBridge_Install();
  2918. }
  2919. CExtResPP::CExtResPP(
  2920. UINT nIDTemplate,
  2921. UINT nIDCaption // = 0
  2922. )
  2923. {
  2924. ASSERT( nIDTemplate != 0 );
  2925. CommonConstruct( MAKEINTRESOURCE(nIDTemplate), nIDCaption );
  2926. PmBridge_Install();
  2927. }
  2928. CExtResPP::CExtResPP(
  2929. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  2930. UINT nIDCaption // = 0
  2931. )
  2932. {
  2933. ASSERT(
  2934. HIWORD(lpszTemplateName) == 0
  2935. || AfxIsValidString( lpszTemplateName )
  2936. );
  2937. CommonConstruct( lpszTemplateName, nIDCaption );
  2938. PmBridge_Install();
  2939. }
  2940. CExtResPP::~CExtResPP()
  2941. {
  2942. PmBridge_Uninstall();
  2943. }
  2944. __EXT_MFC_SAFE_LPCTSTR CExtResPP::OnQuerySkinnedFontParmName() const
  2945. {
  2946. ASSERT_VALID( this );
  2947. return NULL;
  2948. }
  2949. BEGIN_MESSAGE_MAP(CExtResPP, CPropertyPage)
  2950. //{{AFX_MSG_MAP(CExtResPP)
  2951. //}}AFX_MSG_MAP
  2952. END_MESSAGE_MAP()
  2953. BOOL CExtResPP::OnInitDialog()
  2954. {
  2955. if( m_lpszTemplateName_SAVED != NULL )
  2956. {
  2957. m_lpDialogInit = NULL;
  2958. ExecuteDlgInit( m_lpszTemplateName_SAVED );
  2959. }
  2960. void * _lpDialogInit = m_lpDialogInit;
  2961. m_lpDialogInit = NULL;
  2962. LPCTSTR _lpszTemplateName = m_lpszTemplateName;
  2963. m_lpszTemplateName = NULL;
  2964. BOOL bRetVal = CPropertyPage::OnInitDialog();
  2965. m_lpDialogInit = _lpDialogInit;
  2966. m_lpszTemplateName = _lpszTemplateName;
  2967. g_ResourceManager->DesiredFont_ChangeWindow( GetSafeHwnd(), 32766 );
  2968. return bRetVal;
  2969. }
  2970. BOOL CExtResPP::ExecuteDlgInit( __EXT_MFC_SAFE_LPCTSTR lpszResourceName )
  2971. {
  2972. LPVOID pResource = NULL;
  2973. HGLOBAL hGlobalResource = NULL;
  2974. if (lpszResourceName != NULL)
  2975. {
  2976. HRSRC hResource = NULL;
  2977. HINSTANCE hInst = 
  2978. g_ResourceManager->FindResourceHandle(
  2979. RT_DLGINIT,
  2980. UINT(__EXT_MFC_UINT_PTR(LPCTSTR(m_lpszTemplateName))),
  2981. NULL,
  2982. &hResource
  2983. );
  2984. if( hInst != NULL )
  2985. {
  2986. ASSERT( hResource != NULL );
  2987. hGlobalResource = LoadResource( hInst, hResource );
  2988. if( hGlobalResource == NULL )
  2989. return FALSE;
  2990. pResource = LockResource( hGlobalResource );
  2991. ASSERT( pResource != NULL );
  2992. } // if( hInst != NULL )
  2993. }
  2994. BOOL bResult = ExecuteDlgInit( pResource );
  2995. if( pResource != NULL && hGlobalResource != NULL )
  2996. {
  2997. UnlockResource( hGlobalResource );
  2998. FreeResource( hGlobalResource );
  2999. }
  3000. return bResult;
  3001. }
  3002. BOOL CExtResPP::ExecuteDlgInit( LPVOID pResource )
  3003. {
  3004. return CExtResDlg::stat_ExecuteDlgInit( this, pResource );
  3005. }
  3006. #define IDD_PROPSHEET   1006
  3007. #define IDD_WIZARD      1020
  3008. BOOL CExtResPP::stat_GetPropSheetFont(
  3009. CExtSafeString & strFace,
  3010. WORD & wSize,
  3011. BOOL bWizard
  3012. )
  3013. {
  3014. //HFONT hFont = g_ResourceManager->DesiredFont_GetHandle();
  3015. // if( hFont != NULL )
  3016. // {
  3017. // LOGFONT _lf;
  3018. // ::memset( &_lf, 0, sizeof(LOGFONT) );
  3019. // ::GetObject( hFont, sizeof(LOGFONT), &_lf );
  3020. // strFace = _lf.lfFaceName;
  3021. // wSize = 8;
  3022. // return TRUE;
  3023. // } // if( hFont != NULL )
  3024. struct FAKE_PROPPAGEFONTINFO : public CNoTrackObject
  3025. {
  3026. LPTSTR m_pszFaceName;
  3027. WORD m_wSize;
  3028. FAKE_PROPPAGEFONTINFO() : m_pszFaceName(NULL), m_wSize(0) {}
  3029. ~FAKE_PROPPAGEFONTINFO() { GlobalFree(m_pszFaceName); }
  3030. };
  3031. static FAKE_PROPPAGEFONTINFO _afxPropPageFontInfo;
  3032. FAKE_PROPPAGEFONTINFO * pFontInfo = &_afxPropPageFontInfo;
  3033. if( pFontInfo->m_wSize == 0 )
  3034. {
  3035. ASSERT( pFontInfo->m_pszFaceName == NULL );
  3036. HINSTANCE hInst =
  3037. ::GetModuleHandleA( "COMCTL32.DLL" );
  3038. if( hInst != NULL )
  3039. {
  3040. // HRSRC hResource =
  3041. // ::FindResource(
  3042. // hInst,
  3043. // MAKEINTRESOURCE( (bWizard ? IDD_WIZARD : IDD_PROPSHEET) ),
  3044. // RT_DIALOG
  3045. // );
  3046. // HGLOBAL hTemplate = ::LoadResource( hInst, hResource );
  3047. // if( hTemplate != NULL )
  3048. // CDialogTemplate::GetFont(
  3049. // (DLGTEMPLATE*)hTemplate,
  3050. // strFace,
  3051. // wSize
  3052. // );
  3053. CExtResourceManager::CExtResourceMemoryBuffer bufferOut;
  3054. if( bufferOut.FindAndLoad(
  3055. hInst,
  3056. RT_DIALOG,
  3057. bWizard ? IDD_WIZARD : IDD_PROPSHEET,
  3058. g_ResourceManager->GetLangIdNeutral()
  3059. )
  3060. )
  3061. {
  3062. CString _strFace;
  3063. CDialogTemplate::GetFont(
  3064. (DLGTEMPLATE*)bufferOut.GetBuffer(),
  3065. _strFace,
  3066. wSize
  3067. );
  3068. strFace = LPCTSTR( _strFace );
  3069. }
  3070. } // if( hInst != NULL )
  3071. pFontInfo->m_pszFaceName =
  3072. (LPTSTR)::GlobalAlloc(
  3073. GPTR,
  3074. sizeof(TCHAR) * ( strFace.GetLength() + 1 )
  3075. );
  3076. lstrcpy( pFontInfo->m_pszFaceName, LPCTSTR(strFace) );
  3077. pFontInfo->m_wSize = wSize;
  3078. } // if( pFontInfo->m_wSize == 0 )
  3079. strFace = pFontInfo->m_pszFaceName;
  3080. wSize = pFontInfo->m_wSize;
  3081. return ( wSize != 0xFFFF) ? TRUE : FALSE;
  3082. }
  3083. DLGTEMPLATE * CExtResPP::OnAdjustDialogTemplate(
  3084. const DLGTEMPLATE * pTemplate,
  3085. BOOL bWizard
  3086. )
  3087. {
  3088. ASSERT( pTemplate != NULL);
  3089. DLGTEMPLATE * lpDialogTemplateOut =
  3090. g_ResourceManager->OnAdjustDialogTemplate(
  3091. pTemplate,
  3092. this,
  3093. bWizard ? true : false
  3094. );
  3095. if( lpDialogTemplateOut != NULL )
  3096. return lpDialogTemplateOut;
  3097. lpDialogTemplateOut =
  3098. PmBridge_GetPM()->AdjustDialogTemplate(
  3099. pTemplate,
  3100. this,
  3101. bWizard ? true : false
  3102. );
  3103. if( lpDialogTemplateOut != NULL )
  3104. return lpDialogTemplateOut;
  3105. return
  3106. stat_ChangePropPageFont( pTemplate, bWizard );
  3107. }
  3108. DLGTEMPLATE * CExtResPP::stat_ChangePropPageFont(
  3109. const DLGTEMPLATE * pTemplate,
  3110. BOOL bWizard
  3111. )
  3112. {
  3113. CExtSafeString strFaceDefault;
  3114. WORD wSizeDefault;
  3115. //HFONT hFont = g_ResourceManager->DesiredFont_GetHandle();
  3116. // if( hFont != NULL )
  3117. // {
  3118. // LOGFONT _lf;
  3119. // ::memset( &_lf, 0, sizeof(LOGFONT) );
  3120. // ::GetObject( hFont, sizeof(LOGFONT), &_lf );
  3121. // strFaceDefault = _lf.lfFaceName;
  3122. // wSizeDefault = 8;
  3123. // } // if( hFont != NULL )
  3124. // else
  3125. {
  3126. if( ! stat_GetPropSheetFont(
  3127. strFaceDefault,
  3128. wSizeDefault,
  3129. bWizard
  3130. )
  3131. )
  3132. return NULL;
  3133. } // else from if( hFont != NULL )
  3134. WORD wSize;
  3135. CExtSafeString strFace;
  3136. CString _strFaceBuffer;
  3137. BOOL bFontFetched =
  3138. CDialogTemplate::GetFont(
  3139. pTemplate,
  3140. _strFaceBuffer,
  3141. wSize
  3142. );
  3143. strFace = LPCTSTR( _strFaceBuffer );
  3144. if( (! bFontFetched )
  3145. || (strFace != strFaceDefault)
  3146. || (wSize != wSizeDefault)
  3147. )
  3148. {
  3149. CDialogTemplate dlgTemplate( pTemplate );
  3150. dlgTemplate.SetFont( strFaceDefault, wSizeDefault );
  3151. return (DLGTEMPLATE*)dlgTemplate.Detach();
  3152. }
  3153. return NULL;
  3154. }
  3155. void CExtResPP::PreProcessPageTemplate(
  3156. PROPSHEETPAGE & psp,
  3157. BOOL bWizard
  3158. )
  3159. {
  3160. const DLGTEMPLATE * pTemplate;
  3161. CExtResourceManager::CExtResourceMemoryBuffer bufferOut;
  3162. if( psp.dwFlags & PSP_DLGINDIRECT )
  3163. {
  3164. pTemplate = psp.pResource;
  3165. m_lpszTemplateName_SAVED = NULL;
  3166. }
  3167. else
  3168. {
  3169. // HRSRC hResource =
  3170. // ::FindResource(
  3171. // psp.hInstance,
  3172. // psp.pszTemplate,
  3173. // RT_DIALOG
  3174. // );
  3175. // HGLOBAL hTemplate = LoadResource(psp.hInstance,
  3176. // hResource);
  3177. // pTemplate = (LPCDLGTEMPLATE)LockResource(hTemplate);
  3178. HRSRC hResource = NULL;
  3179. HINSTANCE hInst = 
  3180. g_ResourceManager->FindResourceHandle(
  3181. RT_DIALOG,
  3182. UINT(__EXT_MFC_UINT_PTR(LPCTSTR(psp.pszTemplate))),
  3183. NULL,
  3184. &hResource
  3185. );
  3186. ASSERT( hInst != NULL );
  3187. ASSERT( hResource != NULL );
  3188. ASSERT( psp.hInstance == hInst );
  3189. HGLOBAL hTemplate = LoadResource(psp.hInstance,
  3190. hResource);
  3191. pTemplate = (LPCDLGTEMPLATE)LockResource(hTemplate);
  3192. }
  3193. ASSERT( pTemplate != NULL );
  3194. #ifdef _DEBUG
  3195. if( ( ( DLGTEMPLATEEX*)pTemplate )->signature == 0xFFFF )
  3196. {
  3197. DWORD dwVersion = ::GetVersion();
  3198. if( dwVersion & 0x80000000 )
  3199. {
  3200. HINSTANCE hInst = LoadLibrary(_T("COMCTL32.DLL"));
  3201. ASSERT(hInst != NULL);
  3202. if (hInst != NULL)
  3203. {
  3204. FARPROC proc = GetProcAddress(hInst, "DllGetVersion");
  3205. if (proc == NULL)
  3206. ASSERT( FALSE );
  3207. FreeLibrary(hInst);
  3208. }
  3209. } // if( dwVersion & 0x80000000 )
  3210. else if (LOBYTE(LOWORD(dwVersion)) == 3)
  3211. {
  3212. ASSERT( FALSE );
  3213. } // else from if( dwVersion & 0x80000000 )
  3214. } // if( ( ( DLGTEMPLATEEX*)pTemplate )->signature == 0xFFFF )
  3215. #endif // _DEBUG
  3216. if( afxOccManager != NULL )
  3217. pTemplate = InitDialogInfo( pTemplate );
  3218. HGLOBAL hTemplate =
  3219. OnAdjustDialogTemplate(
  3220. pTemplate,
  3221. bWizard
  3222. );
  3223. if( m_hDialogTemplate != NULL )
  3224. {
  3225. GlobalFree( m_hDialogTemplate );
  3226. m_hDialogTemplate = NULL;
  3227. }
  3228. if( hTemplate != NULL )
  3229. {
  3230. pTemplate = (LPCDLGTEMPLATE)hTemplate;
  3231. m_hDialogTemplate = hTemplate;
  3232. }
  3233. psp.pResource = pTemplate;
  3234. psp.dwFlags |= PSP_DLGINDIRECT;
  3235. }
  3236. void CExtResPP::Construct(
  3237. UINT nIDTemplate,
  3238. UINT nIDCaption
  3239. )
  3240. {
  3241. ASSERT( nIDTemplate != 0 );
  3242. CommonConstruct( MAKEINTRESOURCE(nIDTemplate), nIDCaption );
  3243. }
  3244. void CExtResPP::Construct(
  3245. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  3246. UINT nIDCaption
  3247. )
  3248. {
  3249. ASSERT(
  3250. HIWORD(lpszTemplateName) == 0
  3251. || AfxIsValidString( lpszTemplateName )
  3252. );
  3253. CommonConstruct( lpszTemplateName, nIDCaption );
  3254. }
  3255. UINT CALLBACK CExtResPP::stat_PropPageCallback( HWND, UINT message, LPPROPSHEETPAGE pPropPage )
  3256. {
  3257. switch (message)
  3258. {
  3259. case PSPCB_CREATE:
  3260. {
  3261. #if _MFC_VER < 0x700
  3262. ASSERT( AfxIsValidAddress( pPropPage, sizeof(AFX_OLDPROPSHEETPAGE) ) );
  3263. #endif
  3264. ASSERT( AfxIsValidAddress( pPropPage, pPropPage->dwSize ) );
  3265. CPropertyPage * pPage =
  3266. STATIC_DOWNCAST( CPropertyPage, (CObject*)(pPropPage->lParam) );
  3267. ASSERT_VALID( pPage );
  3268. TRY
  3269. {
  3270. AfxHookWindowCreate( pPage );
  3271. }
  3272. CATCH_ALL( e )
  3273. {
  3274. return FALSE;
  3275. }
  3276. END_CATCH_ALL
  3277. }
  3278. return TRUE;
  3279. case PSPCB_RELEASE:
  3280. AfxUnhookWindowCreate();
  3281. break;
  3282. }
  3283. return 0;
  3284. }
  3285. void CExtResPP::CommonConstruct(
  3286. __EXT_MFC_SAFE_LPCTSTR lpszTemplateName,
  3287. UINT nIDCaption
  3288. )
  3289. {
  3290. memset( &m_psp, 0, sizeof(m_psp) );
  3291. m_psp.dwSize = sizeof(m_psp);
  3292. m_psp.dwFlags = PSP_USECALLBACK;
  3293. if( lpszTemplateName != NULL )
  3294. //m_psp.hInstance = AfxFindResourceHandle(lpszTemplateName, RT_DIALOG);
  3295. m_psp.hInstance =
  3296. g_ResourceManager->FindResourceHandle(
  3297. RT_DIALOG,
  3298. UINT(__EXT_MFC_UINT_PTR(LPCTSTR(lpszTemplateName)))
  3299. );
  3300. m_psp.pszTemplate = lpszTemplateName;
  3301. m_psp.pfnDlgProc = AfxDlgProc;
  3302. m_psp.lParam = (LPARAM)this;
  3303. m_psp.pfnCallback = stat_PropPageCallback;
  3304. if( nIDCaption != 0 )
  3305. {
  3306. CExtSafeString _strCaption;
  3307. VERIFY( g_ResourceManager->LoadString( _strCaption, nIDCaption ) );
  3308. m_strCaption = LPCTSTR(_strCaption);
  3309. m_psp.pszTitle = m_strCaption;
  3310. m_psp.dwFlags |= PSP_USETITLE;
  3311. }
  3312. if( AfxHelpEnabled() )
  3313. m_psp.dwFlags |= PSP_HASHELP;
  3314. if( HIWORD(lpszTemplateName) == 0 )
  3315. m_nIDHelp = LOWORD((DWORD)(__EXT_MFC_DWORD_PTR)lpszTemplateName);
  3316. m_lpszTemplateName = m_psp.pszTemplate;
  3317. m_bFirstSetActive = TRUE;
  3318. }
  3319. #ifdef _DEBUG
  3320. void CExtResPP::AssertValid() const
  3321. {
  3322. CWnd::AssertValid();
  3323. }
  3324. #endif
  3325. /////////////////////////////////////////////////////////////////////////////
  3326. // CExtResPS window
  3327. IMPLEMENT_DYNCREATE( CExtResPS, CPropertySheet )
  3328. IMPLEMENT_CExtPmBridge_MEMBERS( CExtResPS );
  3329. CExtResPS::CExtResPS()
  3330. {
  3331. PmBridge_Install();
  3332. }
  3333. CExtResPS::CExtResPS(
  3334. UINT nIDCaption,
  3335. CWnd * pParentWnd, // = NULL
  3336. UINT iSelectPage // = 0
  3337. )
  3338. : CPropertySheet( nIDCaption, pParentWnd, iSelectPage )
  3339. {
  3340. CExtSafeString strCaption;
  3341. if( g_ResourceManager->LoadString( strCaption, nIDCaption ) )
  3342. {
  3343. m_strCaption = LPCTSTR( strCaption );
  3344. m_psh.pszCaption = m_strCaption;
  3345. }
  3346. PmBridge_Install();
  3347. }
  3348. CExtResPS::CExtResPS(
  3349. __EXT_MFC_SAFE_LPCTSTR pszCaption,
  3350. CWnd * pParentWnd, // = NULL
  3351. UINT iSelectPage // = 0
  3352. )
  3353. : CPropertySheet( LPCTSTR(pszCaption), pParentWnd, iSelectPage )
  3354. {
  3355. PmBridge_Install();
  3356. }
  3357. CExtResPS::~CExtResPS()
  3358. {
  3359. PmBridge_Uninstall();
  3360. }
  3361. __EXT_MFC_SAFE_LPCTSTR CExtResPS::OnQuerySkinnedFontParmName() const
  3362. {
  3363. ASSERT_VALID( this );
  3364. return NULL;
  3365. }
  3366. BEGIN_MESSAGE_MAP(CExtResPS, CPropertySheet)
  3367. //{{AFX_MSG_MAP(CExtResPS)
  3368. //}}AFX_MSG_MAP
  3369. END_MESSAGE_MAP()
  3370. void CExtResPS::InitLocalizedChildren()
  3371. {
  3372. // TO DO: NOT IMPL YET
  3373. // HINSTANCE hInst =
  3374. // ::GetModuleHandleA( "COMCTL32.DLL" );
  3375. // if( hInst != NULL )
  3376. // {
  3377. // CExtResourceManager::CExtResourceMemoryBuffer bufferOut;
  3378. // if( bufferOut.FindAndLoad(
  3379. // hInst,
  3380. // RT_DIALOG,
  3381. // IDD_WIZARD,
  3382. // g_ResourceManager->GetLangIdNeutral()
  3383. // )
  3384. // )
  3385. // {
  3386. // //CDialogTemplate dlgTemplate( (DLGTEMPLATE*)bufferOut.GetBuffer() );
  3387. // //dlgTemplate.
  3388. // }
  3389. // } // if( hInst != NULL )
  3390. }
  3391. LRESULT CExtResPS::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  3392. {
  3393. LRESULT lResult = CPropertySheet::WindowProc( message,  wParam, lParam );
  3394. switch( message )
  3395. {
  3396. case WM_CREATE:
  3397. InitLocalizedChildren();
  3398. break;
  3399. } // switch( message )
  3400. return lResult;
  3401. }
  3402. BOOL CExtResPS::OnInitDialog()
  3403. {
  3404. BOOL bRetVal = CPropertySheet::OnInitDialog();
  3405. InitLocalizedChildren();
  3406. //g_ResourceManager->DesiredFont_ChangeWindow( GetSafeHwnd(), 32766 );
  3407. HWND hWnd = GetSafeHwnd();
  3408. if( hWnd != NULL )
  3409. {
  3410. hWnd = ::GetWindow( hWnd, GW_CHILD );
  3411. for( ; hWnd != NULL; hWnd = ::GetWindow( hWnd, GW_HWNDNEXT ) )
  3412. g_ResourceManager->DesiredFont_ChangeWindow(
  3413. hWnd,
  3414. 32766
  3415. );
  3416. } // if( hWnd != NULL )
  3417. return bRetVal;
  3418. }
  3419. void CExtResPS::BuildPropPageArray()
  3420. {
  3421. #if _MFC_VER < 0x700
  3422. if( m_psh.ppsp != NULL )
  3423. delete [] (PROPSHEETPAGE *) m_psh.ppsp;
  3424. m_psh.ppsp = NULL;
  3425. AFX_OLDPROPSHEETPAGE * ppsp =
  3426. new AFX_OLDPROPSHEETPAGE[ m_pages.GetSize() ];
  3427. ::memset( ppsp, 0, m_pages.GetSize() * sizeof(AFX_OLDPROPSHEETPAGE) );
  3428. m_psh.ppsp = (LPPROPSHEETPAGE) ppsp;
  3429. BOOL bWizard = ( m_psh.dwFlags & (PSH_WIZARD | __EXT_MFC_PSH_WIZARD97_MASK) );
  3430. for( int i = 0; i < m_pages.GetSize(); i++ )
  3431. {
  3432. CPropertyPage * pPage = GetPage(i);
  3433. __EXT_MFC_MEMCPY(
  3434. &ppsp[i], 
  3435. sizeof(AFX_OLDPROPSHEETPAGE),
  3436. & pPage->m_psp, 
  3437. pPage->m_psp.dwSize 
  3438. );
  3439. CExtResPP * pExtResourcePropertyPage =
  3440. DYNAMIC_DOWNCAST( CExtResPP, pPage );
  3441. if( pExtResourcePropertyPage != NULL )
  3442. pExtResourcePropertyPage->PreProcessPageTemplate(
  3443. (PROPSHEETPAGE&) ppsp[i],
  3444. bWizard
  3445. );
  3446. else
  3447. {
  3448. struct friendly_property_page_t : public CPropertyPage
  3449. {
  3450. public:
  3451. friend class CExtResPS;
  3452. };
  3453. ((friendly_property_page_t *)pPage)->PreProcessPageTemplate(
  3454. (PROPSHEETPAGE&) ppsp[i],
  3455. bWizard
  3456. );
  3457. }
  3458. } // for( int i = 0; i < m_pages.GetSize(); i++ )
  3459. m_psh.nPages = m_pages.GetSize();
  3460. #else
  3461. if( m_psh.ppsp != NULL )
  3462. {
  3463. free((void*)m_psh.ppsp);
  3464. m_psh.ppsp = NULL;
  3465. }
  3466. int i;
  3467. int nBytes = 0;
  3468. for( i = 0; i < m_pages.GetSize(); i++ )
  3469. {
  3470. CPropertyPage* pPage = GetPage(i);
  3471. nBytes += pPage->m_psp.dwSize;
  3472. }
  3473. PROPSHEETPAGE * ppsp = (PROPSHEETPAGE *)malloc( nBytes );
  3474. if( ppsp == NULL )
  3475. AfxThrowMemoryException();
  3476. ::memset( ppsp, 0, nBytes );
  3477. m_psh.ppsp = ppsp;
  3478. BOOL bWizard = (m_psh.dwFlags & (PSH_WIZARD | __EXT_MFC_PSH_WIZARD97_MASK));
  3479. for( i = 0; i < m_pages.GetSize(); i++ )
  3480. {
  3481. struct friendly_property_page_t : public CPropertyPage
  3482. {
  3483. public:
  3484. friend class CExtResPS;
  3485. };
  3486. friendly_property_page_t * pPage =
  3487. (friendly_property_page_t *) GetPage(i);
  3488. __EXT_MFC_MEMCPY( 
  3489. ppsp, 
  3490. sizeof(PROPSHEETPAGE),
  3491. &pPage->m_psp, 
  3492. pPage->m_psp.dwSize 
  3493. );
  3494. if (!pPage->m_strHeaderTitle.IsEmpty())
  3495. {
  3496. ppsp->pszHeaderTitle = pPage->m_strHeaderTitle;
  3497. ppsp->dwFlags |= PSP_USEHEADERTITLE;
  3498. }
  3499. if (!pPage->m_strHeaderSubTitle.IsEmpty())
  3500. {
  3501. ppsp->pszHeaderSubTitle = pPage->m_strHeaderSubTitle;
  3502. ppsp->dwFlags |= PSP_USEHEADERSUBTITLE;
  3503. }
  3504. CExtResPP * pExtResourcePropertyPage =
  3505. DYNAMIC_DOWNCAST( CExtResPP, pPage );
  3506. if( pExtResourcePropertyPage != NULL )
  3507. pExtResourcePropertyPage->PreProcessPageTemplate(
  3508. *ppsp,
  3509. bWizard
  3510. );
  3511. else
  3512. pPage->PreProcessPageTemplate(
  3513. *ppsp,
  3514. bWizard
  3515. );
  3516. (BYTE*&)ppsp += ppsp->dwSize;
  3517. } // for( i = 0; i < m_pages.GetSize(); i++ )
  3518. m_psh.nPages = (int)m_pages.GetSize();
  3519. #endif
  3520. }