XTPResourceManager.cpp
上传用户:szled88
上传日期:2015-04-09
资源大小:43957k
文件大小:33k
源码类别:

对话框与窗口

开发平台:

Visual C++

  1. // XTPResourceManager.cpp: implementation of the CXTPResourceManager class.
  2. //
  3. // This file is a part of the XTREME TOOLKIT PRO MFC class library.
  4. // (c)1998-2008 Codejock Software, All Rights Reserved.
  5. //
  6. // THIS SOURCE FILE IS THE PROPERTY OF CODEJOCK SOFTWARE AND IS NOT TO BE
  7. // RE-DISTRIBUTED BY ANY MEANS WHATSOEVER WITHOUT THE EXPRESSED WRITTEN
  8. // CONSENT OF CODEJOCK SOFTWARE.
  9. //
  10. // THIS SOURCE CODE CAN ONLY BE USED UNDER THE TERMS AND CONDITIONS OUTLINED
  11. // IN THE XTREME TOOLKIT PRO LICENSE AGREEMENT. CODEJOCK SOFTWARE GRANTS TO
  12. // YOU (ONE SOFTWARE DEVELOPER) THE LIMITED RIGHT TO USE THIS SOFTWARE ON A
  13. // SINGLE COMPUTER.
  14. //
  15. // CONTACT INFORMATION:
  16. // support@codejock.com
  17. // http://www.codejock.com
  18. //
  19. /////////////////////////////////////////////////////////////////////////////
  20. #include "stdafx.h"
  21. #include "XTPVC80Helpers.h"
  22. #include "XTPVC50Helpers.h"
  23. #include "XTPResourceManager.h"
  24. #include "XTPMacros.h"
  25. #include "XTPPropExchange.h"
  26. #include "XTPSystemHelpers.h"
  27. #ifdef _DEBUG
  28. #define new DEBUG_NEW
  29. #undef THIS_FILE
  30. static char THIS_FILE[] = __FILE__;
  31. #endif
  32. #define MAKELANGINFO(l, s, w, e, c, f) {MAKELANGID(l, s), w, e, c, _T(#l), _T(#s), f}
  33. #define ENGLISH_CHARSET ANSI_CHARSET
  34. const WORD cwXTPResManDefLangID = MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US);
  35. static XTP_RESOURCEMANAGER_LANGINFO langinfo[] =
  36. {
  37. MAKELANGINFO(LANG_RUSSIAN, SUBLANG_DEFAULT, 1251, _T("windows-1251"), _T("Russian"), RUSSIAN_CHARSET),
  38. MAKELANGINFO(LANG_JAPANESE, SUBLANG_DEFAULT, 932, _T("shift-jis"), _T("Japanese"), SHIFTJIS_CHARSET),
  39. MAKELANGINFO(LANG_ARABIC, SUBLANG_ARABIC_SAUDI_ARABIA, 1256, _T("windows-1256"), _T("Arabic (Saudi Arabia)"), ARABIC_CHARSET),
  40. MAKELANGINFO(LANG_CZECH, SUBLANG_DEFAULT, 1250, _T("windows-1250"), _T("Czech"), EASTEUROPE_CHARSET),
  41. MAKELANGINFO(LANG_DANISH, SUBLANG_DEFAULT, 1252, _T("windows-1252"), _T("Danish"), ENGLISH_CHARSET),
  42. MAKELANGINFO(LANG_GERMAN, SUBLANG_GERMAN, 1252, _T("windows-1252"), _T("German (Germany)"), ENGLISH_CHARSET),
  43. MAKELANGINFO(LANG_GREEK, SUBLANG_DEFAULT, 1253, _T("windows-1253"), _T("Greek"), GREEK_CHARSET),
  44. MAKELANGINFO(LANG_ENGLISH, SUBLANG_ENGLISH_US, CP_ACP, _T("windows-1252"), _T("English (United States)"), ENGLISH_CHARSET),
  45. MAKELANGINFO(LANG_SPANISH, SUBLANG_SPANISH_MODERN, 1252, _T("windows-1252"), _T("Spanish (Spain - Modern Sort)"), ENGLISH_CHARSET),
  46. MAKELANGINFO(LANG_ESTONIAN, SUBLANG_DEFAULT, 1257, _T("windows-1257"), _T("Estonian"), BALTIC_CHARSET),
  47. MAKELANGINFO(LANG_FINNISH, SUBLANG_DEFAULT, 1252, _T("windows-1252"), _T("Finnish"), ENGLISH_CHARSET),
  48. MAKELANGINFO(LANG_FRENCH, SUBLANG_FRENCH, 1252, _T("windows-1252"), _T("French (France)"), ENGLISH_CHARSET),
  49. MAKELANGINFO(LANG_HEBREW, SUBLANG_DEFAULT, 1255, _T("windows-1255"), _T("Hebrew"), HEBREW_CHARSET),
  50. MAKELANGINFO(LANG_CROATIAN, SUBLANG_DEFAULT, 1250, _T("windows-1250"), _T("Croatian"), EASTEUROPE_CHARSET),
  51. MAKELANGINFO(LANG_HUNGARIAN, SUBLANG_DEFAULT, 1250, _T("windows-1250"), _T("Hungarian"), EASTEUROPE_CHARSET),
  52. MAKELANGINFO(LANG_ITALIAN, SUBLANG_ITALIAN, 1252, _T("windows-1252"), _T("Italian (Italy)"), ENGLISH_CHARSET),
  53. MAKELANGINFO(LANG_KOREAN, SUBLANG_DEFAULT, 949, _T("ks_c_5601"), _T("Korean"), HANGEUL_CHARSET),
  54. MAKELANGINFO(LANG_LITHUANIAN, SUBLANG_LITHUANIAN, 1257, _T("windows-1257"), _T("Lithuanian"), BALTIC_CHARSET),
  55. MAKELANGINFO(LANG_LATVIAN, SUBLANG_DEFAULT, 1257, _T("windows-1257"), _T("Latvian"), BALTIC_CHARSET),
  56. MAKELANGINFO(LANG_DUTCH, SUBLANG_DUTCH, 1252, _T("windows-1252"), _T("Dutch"), ENGLISH_CHARSET),
  57. MAKELANGINFO(LANG_NORWEGIAN, SUBLANG_NORWEGIAN_BOKMAL, 1252, _T("windows-1252"), _T("Norwegian (Bokmal)"), ENGLISH_CHARSET),
  58. MAKELANGINFO(LANG_POLISH, SUBLANG_DEFAULT, 1250, _T("windows-1250"), _T("Polish"), EASTEUROPE_CHARSET),
  59. MAKELANGINFO(LANG_PORTUGUESE, SUBLANG_PORTUGUESE, 1252, _T("windows-1252"), _T("Portuguese (Portugal)"), ENGLISH_CHARSET),
  60. MAKELANGINFO(LANG_PORTUGUESE, SUBLANG_PORTUGUESE_BRAZILIAN, 1252, _T("windows-1252"), _T("Portuguese (Brazil)"), ENGLISH_CHARSET),
  61. MAKELANGINFO(LANG_ROMANIAN, SUBLANG_DEFAULT, 1250, _T("windows-1250"), _T("Romanian"), EASTEUROPE_CHARSET),
  62. MAKELANGINFO(LANG_SLOVAK, SUBLANG_DEFAULT, 1250, _T("windows-1250"), _T("Slovak"), EASTEUROPE_CHARSET),
  63. MAKELANGINFO(LANG_SLOVENIAN, SUBLANG_DEFAULT, 1250, _T("windows-1250"), _T("Slovenian"), EASTEUROPE_CHARSET),
  64. MAKELANGINFO(LANG_SWEDISH, SUBLANG_DEFAULT, 1252, _T("windows-1252"), _T("Swedish"), ENGLISH_CHARSET),
  65. MAKELANGINFO(LANG_THAI, SUBLANG_DEFAULT, 874, _T("windows-874"), _T("Thai"), THAI_CHARSET),
  66. MAKELANGINFO(LANG_TURKISH, SUBLANG_DEFAULT, 1254, _T("windows-1254"), _T("Turkish"), TURKISH_CHARSET),
  67. MAKELANGINFO(LANG_UKRAINIAN, SUBLANG_DEFAULT, 1251, _T("windows-1251"), _T("Ukrainian "), RUSSIAN_CHARSET),
  68. MAKELANGINFO(LANG_BULGARIAN, SUBLANG_DEFAULT, 1251, _T("windows-1251"), _T("Bulgarian"), RUSSIAN_CHARSET),
  69. MAKELANGINFO(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED, 936, _T("gb2312"), _T("Chinese (PRC)"), GB2312_CHARSET),
  70. MAKELANGINFO(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL, 950, _T("big5"), _T("Chinese (Taiwan)"), CHINESEBIG5_CHARSET)
  71. };
  72. //////////////////////////////////////////////////////////////////////////
  73. // CW2CT
  74. CXTPResourceManager::CXTPW2A::CXTPW2A(LPCWSTR lpwstr)
  75. {
  76. UINT nCodePage = XTPResourceManager()->GetLanguageInfo()->nCodePage;
  77. int nDestLen = WideCharToMultiByte(nCodePage, 0, lpwstr, -1, NULL, 0, NULL, NULL);
  78. m_lpsrt = new CHAR[nDestLen + 1];
  79. WideCharToMultiByte(nCodePage, 0, lpwstr, -1, m_lpsrt, nDestLen, NULL, NULL);
  80. m_lpsrt[nDestLen] = 0;
  81. }
  82. CXTPResourceManager::CXTPW2A::~CXTPW2A()
  83. {
  84. delete[] m_lpsrt;
  85. }
  86. CXTPResourceManager::CXTPW2A::operator LPCSTR() const
  87. {
  88. return m_lpsrt;
  89. }
  90. CXTPResourceManager::CXTPA2W::CXTPA2W(LPCSTR lptstr)
  91. {
  92. UINT nCodePage = XTPResourceManager()->GetLanguageInfo()->nCodePage;
  93. int nDestLen = MultiByteToWideChar(nCodePage, 0, lptstr, -1, NULL, 0);
  94. m_lpwsrt = new WCHAR[nDestLen + 1];
  95. MultiByteToWideChar(nCodePage, 0, lptstr, -1, m_lpwsrt, nDestLen);
  96. m_lpwsrt[nDestLen] = 0;
  97. }
  98. CXTPResourceManager::CXTPA2W::~CXTPA2W()
  99. {
  100. delete[] m_lpwsrt;
  101. }
  102. CXTPResourceManager::CXTPA2W::operator LPCWSTR() const
  103. {
  104. return m_lpwsrt;
  105. }
  106. //////////////////////////////////////////////////////////////////////////
  107. // CXTPResourceManager
  108. CProcessLocal<CXTPResourceManager> CXTPResourceManager::m_managerInstance;
  109. CXTPResourceManager* AFX_CDECL XTPResourceManager()
  110. {
  111. return CXTPResourceManager::m_managerInstance.GetData();
  112. }
  113. BOOL CXTPResourceManager::SetResourceManager(CXTPResourceManager* pResourceManager)
  114. {
  115. if (pResourceManager == NULL)
  116. return FALSE;
  117. if (!pResourceManager->m_bValid)
  118. {
  119. delete pResourceManager;
  120. return FALSE;
  121. }
  122. pResourceManager->UpdateResourcesLangID();
  123. if (m_managerInstance.m_pObject != NULL)
  124. delete m_managerInstance.m_pObject;
  125. m_managerInstance.m_pObject = pResourceManager;
  126. return TRUE;
  127. }
  128. /////////////////////////////////////////////////////////////////////////
  129. // CXTPResourceManager
  130. HINSTANCE CXTPResourceManager::m_hModXTResource = NULL;
  131. CXTPResourceManager::CManageState::CManageState()
  132. {
  133. m_bSet = false;
  134. Redo();
  135. }
  136. CXTPResourceManager::CManageState::~CManageState()
  137. {
  138. Undo();
  139. m_hModOldResource = NULL;
  140. }
  141. void CXTPResourceManager::CManageState::Undo()
  142. {
  143. if (!m_bSet)
  144. return;
  145. AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
  146. pModuleState->m_hCurrentResourceHandle = m_hModOldResource;
  147. m_bSet = false;
  148. }
  149. void CXTPResourceManager::CManageState::Redo()
  150. {
  151. if (XTPResourceManager()->GetResourceHandle() == NULL)
  152. {
  153. m_bSet = false;
  154. return;
  155. }
  156. AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
  157. m_hModOldResource = pModuleState->m_hCurrentResourceHandle;
  158. pModuleState->m_hCurrentResourceHandle = XTPResourceManager()->GetResourceHandle();
  159. m_bSet = true;
  160. }
  161. CXTPResourceManager::CXTPResourceManager()
  162. {
  163. m_bValid = TRUE;
  164. m_hResourceFile = 0;
  165. m_pLanguageInfo = GetLanguageInfo(cwXTPResManDefLangID);
  166. }
  167. CXTPResourceManager::~CXTPResourceManager()
  168. {
  169. Close();
  170. }
  171. void CXTPResourceManager::Close()
  172. {
  173. if (m_hResourceFile != 0)
  174. {
  175. FreeLibrary(m_hResourceFile);
  176. m_hResourceFile = 0;
  177. }
  178. }
  179. HMODULE CXTPResourceManager::GetResourceHandle() const
  180. {
  181. return m_hModXTResource;
  182. }
  183. void CXTPResourceManager::SetResourceHandle(HMODULE hModRes)
  184. {
  185. m_hModXTResource = hModRes;
  186. UpdateResourcesLangID();
  187. }
  188. void CXTPResourceManager::SetResourceFile(const CString& strResourceFile)
  189. {
  190. CString strExtension = strResourceFile.GetLength() > 3 ? strResourceFile.Right(3) : _T("");
  191. strExtension.MakeLower();
  192. if (strExtension == _T("xml"))
  193. {
  194. SetResourceManager(new CXTPResourceManagerXML(strResourceFile));
  195. }
  196. else
  197. {
  198. CXTPResourceManager* pResourceManager = new CXTPResourceManager;
  199. pResourceManager->m_hResourceFile = strResourceFile.IsEmpty() ? 0 : LoadLibrary(strResourceFile);
  200. if (pResourceManager->m_hResourceFile)
  201. {
  202. SetResourceHandle(pResourceManager->m_hResourceFile);
  203. }
  204. else
  205. {
  206. SetResourceHandle(AfxGetInstanceHandle());
  207. }
  208. SetResourceManager(pResourceManager);
  209. }
  210. }
  211. void CXTPResourceManager::UpdateResourcesLangID()
  212. {
  213. HMODULE hResModule = GetResourceHandle();
  214. WORD wLangID = GetResourceLanguage(hResModule);
  215. ASSERT(wLangID);
  216. SetResourceLanguage(wLangID);
  217. }
  218. void CXTPResourceManager::SetResourceLanguage(WORD wLangID)
  219. {
  220. m_pLanguageInfo = GetLanguageInfo(wLangID);
  221. if (!m_pLanguageInfo)
  222. m_pLanguageInfo = GetLanguageInfo(cwXTPResManDefLangID);
  223. }
  224. WORD CXTPResourceManager::GetResourceLanguage(HMODULE hResModule)
  225. {
  226. WORD wLangID = 0;
  227. ::EnumResourceTypes(hResModule, &CXTPResourceManager::EnumResTypeProc, (LONG_PTR)&wLangID);
  228. return wLangID;
  229. }
  230. BOOL CXTPResourceManager::EnumResTypeProc(HMODULE hModule, LPTSTR lpszType, LONG_PTR lParam)
  231. {
  232. WORD* pwLangID = (WORD*)lParam;
  233. ASSERT(pwLangID);
  234. if (!pwLangID)
  235. return FALSE;
  236. ::EnumResourceNames(hModule, lpszType, &CXTPResourceManager::EnumResNameProc, lParam);
  237. if(*pwLangID == LANG_NEUTRAL)
  238. return TRUE; // continue if neutral
  239. return *pwLangID == cwXTPResManDefLangID; // continue if default
  240. }
  241. BOOL CXTPResourceManager::EnumResNameProc(HMODULE hModule, LPCTSTR lpszType, LPTSTR lpszName,
  242.   LONG_PTR lParam)
  243. {
  244. WORD* pwLangID = (WORD*)lParam;
  245. ASSERT(pwLangID);
  246. if (!pwLangID)
  247. return FALSE;
  248. ::EnumResourceLanguages(hModule, lpszType, lpszName,
  249. &CXTPResourceManager::EnumResLangProc, lParam);
  250. if(*pwLangID == LANG_NEUTRAL)
  251. return TRUE; // continue if neutral
  252. return *pwLangID == cwXTPResManDefLangID; // continue if default
  253. }
  254. BOOL CXTPResourceManager::EnumResLangProc(HMODULE hModule, LPCTSTR lpszType,
  255.  LPCTSTR lpszName, WORD wIDLanguage, LONG_PTR lParam)
  256. {
  257. UNREFERENCED_PARAMETER(hModule); UNREFERENCED_PARAMETER(lpszType); UNREFERENCED_PARAMETER(lpszName);
  258. WORD* pwLangID = (WORD*)lParam;
  259. ASSERT(pwLangID);
  260. if (!pwLangID)
  261. return FALSE; // stop emuneration
  262. if(wIDLanguage == LANG_NEUTRAL)
  263. return TRUE; // continue if neutral
  264. *pwLangID = wIDLanguage;
  265. return *pwLangID == cwXTPResManDefLangID; // continue if default
  266. }
  267. BOOL CXTPResourceManager::LoadFailed()
  268. {
  269. #ifdef _LIB
  270. //TRACE(_T("WARNING: Make sure to include XTToolkitPro.rc in your .rc2 filen"));
  271. #endif
  272. return FALSE;
  273. }
  274. BOOL CXTPResourceManager::LoadString(CString* pString, UINT nIDResource)
  275. {
  276. HMODULE hResourceInstanse = GetResourceHandle();
  277. if (hResourceInstanse && ::FindResource(hResourceInstanse, MAKEINTRESOURCE((nIDResource >> 4)+1), RT_STRING))
  278. {
  279. if (LoadLocaleString(hResourceInstanse, nIDResource, *pString))
  280. return TRUE;
  281. }
  282. if (pString->LoadString(nIDResource))
  283. return TRUE;
  284. return LoadFailed();
  285. }
  286. BOOL CXTPResourceManager::LoadMenu(CMenu* lpMenu, UINT nIDResource)
  287. {
  288. HMODULE hResourceInstanse = GetResourceHandle();
  289. if (hResourceInstanse && ::FindResource(hResourceInstanse, MAKEINTRESOURCE(nIDResource), RT_MENU))
  290. {
  291. CManageState state;
  292. if (lpMenu->LoadMenu(nIDResource))
  293. return TRUE;
  294. }
  295. if (lpMenu->LoadMenu(nIDResource))
  296. return TRUE;
  297. return LoadFailed();
  298. }
  299. BOOL CXTPResourceManager::LoadToolBar(CToolBar* pToolBar, UINT nIDResource)
  300. {
  301. CManageState state;
  302. if (pToolBar->LoadToolBar(nIDResource))
  303. return TRUE;
  304. return LoadFailed();
  305. }
  306. BOOL CXTPResourceManager::LoadBitmap(CBitmap* pBitmap, UINT nIDResource)
  307. {
  308. HMODULE hResourceInstanse = GetResourceHandle();
  309. if (hResourceInstanse && ::FindResource(hResourceInstanse, MAKEINTRESOURCE(nIDResource), RT_BITMAP))
  310. {
  311. CManageState state;
  312. if (pBitmap->LoadBitmap(nIDResource))
  313. return TRUE;
  314. }
  315. if (pBitmap->LoadBitmap(nIDResource))
  316. return TRUE;
  317. return LoadFailed();
  318. }
  319. HCURSOR CXTPResourceManager::LoadCursor(UINT nIDResource)
  320. {
  321. HMODULE hResourceInstanse = GetResourceHandle();
  322. if (hResourceInstanse && ::FindResource(hResourceInstanse, MAKEINTRESOURCE(nIDResource), RT_GROUP_CURSOR))
  323. {
  324. CManageState state;
  325. HCURSOR hCursor = AfxGetApp()->LoadCursor(nIDResource);
  326. if (hCursor)
  327. return hCursor;
  328. }
  329. HCURSOR hCursor = AfxGetApp()->LoadCursor(nIDResource);
  330. if (hCursor)
  331. return hCursor;
  332. LoadFailed();
  333. return NULL;
  334. }
  335. HGLOBAL CXTPResourceManager::LoadDialogTemplate2(LPCTSTR pszTemplate)
  336. {
  337. HINSTANCE hResourceInstanse = GetResourceHandle();
  338. HRSRC hResource = hResourceInstanse ? FindResource(hResourceInstanse, pszTemplate, RT_DIALOG) : NULL;
  339. if (hResource == NULL)
  340. {
  341. hResourceInstanse = AfxFindResourceHandle(pszTemplate, RT_DIALOG);
  342. hResource = hResourceInstanse ? FindResource(hResourceInstanse, pszTemplate, RT_DIALOG) : NULL;
  343. }
  344. if (hResource)
  345. {
  346. HGLOBAL hTemplate = LoadResource(hResourceInstanse, hResource);
  347. return hTemplate;
  348. }
  349. LoadFailed();
  350. return NULL;
  351. }
  352. LPCDLGTEMPLATE CXTPResourceManager::LoadDialogTemplate(UINT nIDResource)
  353. {
  354. LPCTSTR pszTemplate = MAKEINTRESOURCE(nIDResource);
  355. HGLOBAL hTemplate = LoadDialogTemplate2(pszTemplate);
  356. return (LPCDLGTEMPLATE)LockResource(hTemplate);
  357. }
  358. BOOL CXTPResourceManager::LoadHTML(CString* pText, UINT nIDResource)
  359. {
  360. if (pText == NULL)
  361. return FALSE;
  362. HMODULE hResourceInstanse = GetResourceHandle();
  363. HRSRC hResource = ::FindResource(hResourceInstanse, MAKEINTRESOURCE(nIDResource), RT_HTML);
  364. if (hResource == NULL)
  365. {
  366. hResourceInstanse = AfxFindResourceHandle(MAKEINTRESOURCE(nIDResource), RT_HTML);
  367. if (hResourceInstanse == NULL)
  368. return FALSE;
  369. hResource = ::FindResource(hResourceInstanse, MAKEINTRESOURCE(nIDResource), RT_HTML);
  370. }
  371. if (!hResource)
  372. return FALSE;
  373. HGLOBAL hMem = ::LoadResource(hResourceInstanse, hResource);
  374. if (!hMem)
  375. return FALSE;
  376. DWORD dwSize = ::SizeofResource(hResourceInstanse, hResource);
  377. char *pSrc = (char*)::LockResource(hMem);
  378. if (!pSrc)
  379. return FALSE;
  380. const DWORD dwDstSize = (dwSize + 1) * sizeof(TCHAR);
  381. TCHAR *pDst = pText->GetBuffer(dwDstSize);
  382. if (pDst == NULL)
  383. return FALSE;
  384. ::ZeroMemory((BYTE*)pDst, dwDstSize);
  385. #ifdef _UNICODE
  386. int nLen = ::MultiByteToWideChar(CP_ACP, 0, (LPCSTR)pSrc, dwSize,
  387. pDst, dwDstSize);
  388. #else
  389. ::CopyMemory(pDst, pSrc, dwSize);
  390. int nLen = dwSize;
  391. #endif
  392. pText->ReleaseBuffer();
  393. return nLen > 0;
  394. }
  395. HICON CXTPResourceManager::CreateIconFromResource(HMODULE hModule, LPCTSTR lpszID, CSize iconSize)
  396. {
  397. // Find the icon directory whose identifier is lpszID.
  398. HRSRC hResource = ::FindResource(hModule,
  399. lpszID, RT_GROUP_ICON);
  400. if (hResource == NULL)
  401. return NULL;
  402. // Load and lock the icon directory.
  403. HGLOBAL hMem = ::LoadResource(hModule, hResource);
  404. if (!hMem)
  405. return NULL;
  406. LPVOID lpResource = ::LockResource(hMem);
  407. // Get the identifier of the icon that is most appropriate
  408. // for the video display.
  409. int nID = ::LookupIconIdFromDirectoryEx((PBYTE) lpResource, TRUE,
  410. iconSize.cx, iconSize.cy, LR_DEFAULTCOLOR);
  411. // Find the bits for the nID icon.
  412. hResource = ::FindResource(hModule,
  413. MAKEINTRESOURCE(nID), MAKEINTRESOURCE(RT_ICON));
  414. if (hResource == NULL)
  415. return NULL;
  416. // Load and lock the icon.
  417. hMem = ::LoadResource(hModule, hResource);
  418. if (!hMem)
  419. return NULL;
  420. lpResource = ::LockResource(hMem);
  421. // Create a handle to the icon.
  422. HICON hIcon = ::CreateIconFromResourceEx((PBYTE)lpResource,
  423. ::SizeofResource(hModule, hResource), TRUE, 0x00030000,
  424. iconSize.cx, iconSize.cy, LR_DEFAULTCOLOR);
  425. return hIcon;
  426. }
  427. HICON CXTPResourceManager::LoadIcon(LPCTSTR lpszID, CSize iconSize)
  428. {
  429. HICON hIcon = NULL;
  430. HMODULE hResource = GetResourceHandle();
  431. if (hResource && ::FindResource(hResource, lpszID, RT_GROUP_ICON))
  432. {
  433. CManageState state;
  434. hIcon = (HICON)::LoadImage(hResource, lpszID,
  435. IMAGE_ICON, iconSize.cx, iconSize.cy, 0);
  436. if (hIcon != NULL)
  437. return hIcon;
  438. }
  439. hResource = AfxFindResourceHandle(lpszID, RT_GROUP_ICON);
  440. if (hResource)
  441. {
  442. hIcon = (HICON)::LoadImage(hResource, lpszID,
  443. IMAGE_ICON, iconSize.cx, iconSize.cy, 0);
  444. if (hIcon != NULL)
  445. return hIcon;
  446. }
  447. return NULL;
  448. }
  449. HICON CXTPResourceManager::LoadIcon(int nID, CSize iconSize)
  450. {
  451. return LoadIcon(MAKEINTRESOURCE(nID), iconSize);
  452. }
  453. int CXTPResourceManager::ShowMessageBox(UINT nIDPrompt, UINT nType)
  454. {
  455. CString strPrompt;
  456. VERIFY(LoadString(&strPrompt, nIDPrompt));
  457. return ShowMessageBox(strPrompt, nType);
  458. }
  459. int CXTPResourceManager::ShowMessageBox(LPCTSTR lpszText, UINT nType)
  460. {
  461. if (m_pLanguageInfo && (m_pLanguageInfo->nCodePage == 1256 || m_pLanguageInfo->nCodePage == 1255)) // Arabic or Hebrew ?
  462. nType |= MB_RTLREADING;
  463. return AfxMessageBox(lpszText, nType);
  464. }
  465. //////////////////////////////////////////////////////////////////////////
  466. // Locale methods
  467. XTP_RESOURCEMANAGER_LANGINFO* CXTPResourceManager::GetLanguageInfo(UINT nLangId)
  468. {
  469. for (int i = 0; i < _countof(langinfo); i++)
  470. {
  471. if (nLangId == langinfo[i].wLanguage)
  472. return &langinfo[i];
  473. }
  474. return 0;
  475. }
  476. int CXTPResourceManager::GetMenuLocaleString(CMenu* pMenu, UINT nIDItem, CString& rString, UINT nFlags) const
  477. {
  478. if (!pMenu || !pMenu->m_hMenu)
  479. return 0;
  480. ASSERT(m_pLanguageInfo);
  481. if (!m_pLanguageInfo)
  482. {
  483. return pMenu->GetMenuString(nIDItem, rString, nFlags);
  484. }
  485. ASSERT(::IsMenu(pMenu->m_hMenu));
  486. // offer no buffer first
  487. int nStringLen = ::GetMenuString(pMenu->m_hMenu, nIDItem, NULL, 0, nFlags);
  488. // use exact buffer length
  489. if (nStringLen > 0)
  490. {
  491. #ifndef _UNICODE
  492. if (XTPSystemVersion()->IsWin2KOrGreater())
  493. {
  494. LPWSTR lpwstr = new WCHAR[nStringLen + 1];
  495. ::GetMenuStringW(pMenu->m_hMenu, nIDItem, lpwstr, nStringLen + 1, nFlags);
  496. int nDestLen = WideCharToMultiByte(m_pLanguageInfo->nCodePage, 0, lpwstr, nStringLen, NULL, 0, NULL, NULL);
  497. LPTSTR pstrString = rString.GetBufferSetLength(nDestLen);
  498. WideCharToMultiByte(m_pLanguageInfo->nCodePage, 0, lpwstr, nStringLen, pstrString, nDestLen, NULL, NULL);
  499. pstrString[nDestLen] = 0;
  500. delete[] lpwstr;
  501. rString.ReleaseBuffer();
  502. }
  503. else
  504. #endif
  505. {
  506. LPTSTR pstrString = rString.GetBufferSetLength(nStringLen);
  507. ::GetMenuString(pMenu->m_hMenu, nIDItem, pstrString, nStringLen + 1, nFlags);
  508. rString.ReleaseBuffer(nStringLen);
  509. }
  510. }
  511. else
  512. rString.Empty();
  513. return nStringLen;
  514. }
  515. int CXTPResourceManager::LoadLocaleString(HINSTANCE hInstance, UINT nID, CString& rString) const
  516. {
  517. rString.Empty();
  518. HRSRC hResource = ::FindResource(hInstance, MAKEINTRESOURCE(((nID >> 4) + 1)), RT_STRING);
  519. if (!hResource)
  520. return 0;
  521. HGLOBAL hGlobal = ::LoadResource(hInstance, hResource);
  522. if (!hGlobal)
  523. return 0;
  524. LPWORD pImage = (LPWORD)::LockResource(hGlobal);
  525. if (!pImage)
  526. return 0;
  527. ULONG nResourceSize = ::SizeofResource(hInstance, hResource);
  528. WORD* pImageEnd = (LPWORD)(LPBYTE(pImage) + nResourceSize);
  529. UINT iIndex = nID & 0x000F;
  530. while ((iIndex > 0) && (pImage < pImageEnd))
  531. {
  532. pImage = (LPWORD)(LPBYTE(pImage) + (sizeof(WORD) + (*pImage * sizeof(WCHAR))));
  533. iIndex--;
  534. }
  535. if (pImage >= pImageEnd)
  536. return 0;
  537. int nLength = *pImage;
  538. if (nLength == 0)
  539. return 0;
  540. #ifdef _UNICODE
  541. LPTSTR lpsz = rString.GetBufferSetLength(nLength);
  542. MEMCPY_S(lpsz, (LPWSTR)(pImage + 1), nLength * sizeof(WCHAR));
  543. rString.ReleaseBuffer(nLength);
  544. return nLength;
  545. #else
  546. UINT nCodePage = m_pLanguageInfo ? m_pLanguageInfo->nCodePage : CP_ACP;
  547. int nDestLen = WideCharToMultiByte(nCodePage, 0, (LPWSTR)(pImage + 1), nLength, NULL, 0, NULL, NULL);
  548. LPTSTR lpsz = rString.GetBufferSetLength(nDestLen);
  549. WideCharToMultiByte(nCodePage, 0, (LPWSTR)(pImage + 1), nLength, lpsz, nDestLen, NULL, NULL);
  550. rString.ReleaseBuffer(nDestLen);
  551. return nDestLen;
  552. #endif
  553. }
  554. #ifndef  _XTP_EXCLUDE_XML
  555. //////////////////////////////////////////////////////////////////////////
  556. // CXTPResourceManagerXML
  557. CXTPResourceManagerXML::CXTPResourceManagerXML(LPCTSTR strFileName)
  558. {
  559. m_pResourceRoot = new CXTPPropExchangeXMLNode(TRUE, 0, _T("resource"));
  560. m_bValid = FALSE;
  561. if (!m_pResourceRoot->LoadFromFile(strFileName))
  562. return;
  563. if (!m_pResourceRoot->OnBeforeExchange())
  564. return;
  565. m_bValid = TRUE;
  566. }
  567. CXTPResourceManagerXML::CXTPResourceManagerXML(CXTPPropExchangeXMLNode* pResourceRoot)
  568. {
  569. m_bValid = FALSE;
  570. m_pResourceRoot = pResourceRoot;
  571. if (m_pResourceRoot == NULL)
  572. return;
  573. if (!m_pResourceRoot->OnBeforeExchange())
  574. return;
  575. m_bValid = TRUE;
  576. }
  577. CXTPResourceManagerXML::~CXTPResourceManagerXML()
  578. {
  579. Close();
  580. }
  581. void CXTPResourceManagerXML::Close()
  582. {
  583. CXTPResourceManager::Close();
  584. CMDTARGET_RELEASE(m_pResourceRoot);
  585. POSITION pos = m_mapDialogs.GetStartPosition();
  586. while (pos)
  587. {
  588. DLGTEMPLATE* pDlgTemplate;
  589. UINT nIDResource;
  590. m_mapDialogs.GetNextAssoc(pos, nIDResource, pDlgTemplate);
  591. free (pDlgTemplate);
  592. }
  593. m_mapDialogs.RemoveAll();
  594. m_bValid = FALSE;
  595. }
  596. void CXTPResourceManagerXML::UpdateResourcesLangID()
  597. {
  598. long wResourcesLangID = cwXTPResManDefLangID;
  599. PX_Long(m_pResourceRoot, _T("LANGID"), wResourcesLangID);
  600. SetResourceLanguage((WORD)wResourcesLangID);
  601. }
  602. BOOL CXTPResourceManagerXML::LoadString(CString* pString, UINT nIDResource)
  603. {
  604. if (!m_bValid || m_pResourceRoot == NULL)
  605. return CXTPResourceManager::LoadString(pString, nIDResource);
  606. CString strPattern;
  607. strPattern.Format(_T("string[@id = "%i"]"), nIDResource);
  608. if (!m_pResourceRoot->IsSectionExists(strPattern))
  609. return CXTPResourceManager::LoadString(pString, nIDResource);
  610. CXTPPropExchangeSection secString(m_pResourceRoot->GetSection(strPattern));
  611. PX_String(&secString, _T("value"), *pString);
  612. return TRUE;
  613. }
  614. struct CXTPResourceManagerXML::MENUITEMTEMPLATEINFO : public MENUITEMTEMPLATE
  615. {
  616. BSTR lpszCaption;
  617. public:
  618. MENUITEMTEMPLATEINFO()
  619. {
  620. mtOption = 0;
  621. lpszCaption = NULL;
  622. }
  623. ~MENUITEMTEMPLATEINFO()
  624. {
  625. if (lpszCaption)
  626. {
  627. SysFreeString(lpszCaption);
  628. }
  629. }
  630. UINT GetLength() const
  631. {
  632. return sizeof(mtOption) + sizeof(WCHAR) * ((int)wcslen(lpszCaption) + 1) +
  633. (mtOption & MF_POPUP ? 0 : sizeof(mtID));
  634. }
  635. };
  636. struct CXTPResourceManagerXML::MENUTEMPLATEINFO
  637. {
  638. CArray<MENUITEMTEMPLATEINFO*, MENUITEMTEMPLATEINFO*> aItems;
  639. public:
  640. ~MENUTEMPLATEINFO()
  641. {
  642. for (int i = 0; i < (int)aItems.GetSize(); i++)
  643. {
  644. delete aItems[i];
  645. }
  646. }
  647. UINT GetLength() const
  648. {
  649. int nLength = sizeof(MENUITEMTEMPLATEHEADER);
  650. for (int i = 0; i < aItems.GetSize(); i++)
  651. {
  652. nLength += aItems[i]->GetLength();
  653. }
  654. return nLength;
  655. }
  656. };
  657. /////////////////////////////////////////////////////////////////////////////
  658. // Extended dialog templates (new in Win95)
  659. #pragma pack(push, 1)
  660. struct CXTPResourceManagerXML::DLGTEMPLATEEX
  661. {
  662. WORD dlgVer;
  663. WORD signature;
  664. DWORD helpID;
  665. DWORD exStyle;
  666. DWORD style;
  667. WORD cDlgItems;
  668. short x;
  669. short y;
  670. short cx;
  671. short cy;
  672. };
  673. struct CXTPResourceManagerXML::DLGITEMTEMPLATEEX
  674. {
  675. DWORD helpID;
  676. DWORD exStyle;
  677. DWORD style;
  678. short x;
  679. short y;
  680. short cx;
  681. short cy;
  682. DWORD id;
  683. };
  684. #pragma pack(pop)
  685. struct CXTPResourceManagerXML::DLGITEMTEMPLATEINFO : public DLGITEMTEMPLATEEX
  686. {
  687. BSTR lpszCaption;
  688. CString strClassName;
  689. int nCaptionID;
  690. public:
  691. DLGITEMTEMPLATEINFO()
  692. {
  693. lpszCaption = NULL;
  694. nCaptionID = 0;
  695. }
  696. ~DLGITEMTEMPLATEINFO()
  697. {
  698. if (lpszCaption)
  699. {
  700. SysFreeString(lpszCaption);
  701. }
  702. }
  703. ULONG AlignDWord(ULONG uLong) const
  704. {
  705. return ((uLong + 3) & ~3);
  706. }
  707. UINT GetLength() const
  708. {
  709. return AlignDWord(sizeof(DLGITEMTEMPLATEEX)
  710. + ((nCaptionID != 0 ? 1 : (int)wcslen(lpszCaption)) * sizeof(WORD)) +  sizeof(WORD)
  711. + strClassName.GetLength() * sizeof(WORD) +  sizeof(WORD)
  712. + 0
  713. + sizeof(WORD)
  714. );
  715. }
  716. };
  717. struct CXTPResourceManagerXML::DLGTEMPLATEINFO : public DLGTEMPLATEEX
  718. {
  719. BSTR lpszCaption;
  720. CString strFaceName;
  721. int nPointSize;
  722. CArray<DLGITEMTEMPLATEINFO*, DLGITEMTEMPLATEINFO*> aItems;
  723. public:
  724. DLGTEMPLATEINFO()
  725. {
  726. lpszCaption = NULL;
  727. }
  728. ~DLGTEMPLATEINFO()
  729. {
  730. if (lpszCaption)
  731. {
  732. SysFreeString(lpszCaption);
  733. }
  734. for (int i = 0; i < (int)aItems.GetSize(); i++)
  735. {
  736. delete aItems[i];
  737. }
  738. }
  739. ULONG AlignDWord(ULONG uLong) const
  740. {
  741. return ((uLong + 3) & ~3);
  742. }
  743. UINT GetHeaderLength() const
  744. {
  745. return AlignDWord(sizeof(DLGTEMPLATEEX)
  746. + sizeof(WORD)
  747. + sizeof(WORD)
  748. + ((int)wcslen(lpszCaption) * sizeof(WORD) +  sizeof(WORD))
  749. + (style & DS_SETFONT ? strFaceName.GetLength() * sizeof(WORD) + sizeof(WORD)
  750. + sizeof(WORD) + sizeof(WORD) + sizeof(BYTE) + sizeof(BYTE)
  751. : 0)
  752. );
  753. }
  754. UINT GetLength() const
  755. {
  756. int nLength = GetHeaderLength();
  757. for (int i = 0; i < aItems.GetSize(); i++)
  758. {
  759. nLength += aItems[i]->GetLength();
  760. }
  761. return nLength;
  762. }
  763. };
  764. void CXTPResourceManagerXML::AddMenuItems(CXTPPropExchange* pPX, MENUTEMPLATEINFO* pItems)
  765. {
  766. CXTPPropExchangeEnumeratorPtr enumerator(pPX->GetEnumerator(_T("menuitem")));
  767. POSITION pos = enumerator->GetPosition();
  768. while (pos)
  769. {
  770. CXTPPropExchangeSection sec(enumerator->GetNext(pos));
  771. int id = 0;
  772. MENUITEMTEMPLATEINFO* pItemInfo = new MENUITEMTEMPLATEINFO;
  773. PX_Int(&sec, _T("id"), id, 0);
  774. PX_Bstr(&sec, _T("caption"), pItemInfo->lpszCaption, L"");
  775. pItemInfo->mtID = (WORD)id;
  776. pItems->aItems.Add(pItemInfo);
  777. CXTPPropExchangeEnumeratorPtr enumeratorChilds(sec->GetEnumerator(_T("menuitem")));
  778. if (enumeratorChilds->GetPosition())
  779. {
  780. pItemInfo->mtOption |= MF_POPUP;
  781. AddMenuItems(&sec, pItems);
  782. }
  783. else if (id == 0)
  784. {
  785. pItemInfo->mtOption |= MF_SEPARATOR;
  786. }
  787. if (!pos)
  788. {
  789. pItemInfo->mtOption |= MF_END;
  790. }
  791. }
  792. }
  793. BOOL CXTPResourceManagerXML::CreateMenu(CMenu& menu, CXTPPropExchange* pPX)
  794. {
  795. MENUTEMPLATEINFO menuTemplate;
  796. AddMenuItems(pPX, &menuTemplate);
  797. if (menuTemplate.aItems.GetSize() == 0)
  798. return FALSE;
  799. ASSERT(menuTemplate.aItems[menuTemplate.aItems.GetSize() - 1]->mtOption & MF_END);
  800. int nLength = menuTemplate.GetLength() + sizeof(MENUITEMTEMPLATE);
  801. LPVOID lpDlgTemplate = malloc(nLength);
  802. ZeroMemory(lpDlgTemplate, nLength);
  803. MENUITEMTEMPLATE* mitem = (MENUITEMTEMPLATE*) ((BYTE*)lpDlgTemplate + sizeof(MENUITEMTEMPLATEHEADER));
  804. for (int i = 0; i < menuTemplate.aItems.GetSize(); i++)
  805. {
  806. MENUITEMTEMPLATEINFO& itemInfo = *menuTemplate.aItems[i];
  807. mitem->mtOption = itemInfo.mtOption;
  808. if (itemInfo.mtOption & MF_POPUP)
  809. {
  810. MEMCPY_S((BYTE*)mitem + sizeof(mitem->mtOption), itemInfo.lpszCaption, (wcslen(itemInfo.lpszCaption) + 1) * sizeof(WORD));
  811. }
  812. else
  813. {
  814. mitem->mtID = itemInfo.mtID;
  815. MEMCPY_S(mitem->mtString, itemInfo.lpszCaption, (wcslen(itemInfo.lpszCaption) + 1) * sizeof(WORD));
  816. }
  817. mitem = (MENUITEMTEMPLATE*) ((BYTE*)mitem + itemInfo.GetLength());
  818. }
  819. mitem->mtOption = MF_END;
  820. BOOL bResult = menu.LoadMenuIndirect(lpDlgTemplate);
  821. free(lpDlgTemplate);
  822. return bResult;
  823. }
  824. BOOL CXTPResourceManagerXML::LoadMenu(CMenu* lpMenu, UINT nIDResource)
  825. {
  826. if (!m_bValid || m_pResourceRoot == NULL)
  827. return CXTPResourceManager::LoadMenu(lpMenu, nIDResource);
  828. CString strPattern;
  829. strPattern.Format(_T("menu[@id = "%i"]"), nIDResource);
  830. if (!m_pResourceRoot->IsSectionExists(strPattern))
  831. return CXTPResourceManager::LoadMenu(lpMenu, nIDResource);
  832. CXTPPropExchangeSection secMenu(m_pResourceRoot->GetSection(strPattern));
  833. if (CreateMenu(*lpMenu, &secMenu))
  834. return TRUE;
  835. return CXTPResourceManager::LoadMenu(lpMenu, nIDResource);
  836. }
  837. //////////////////////////////////////////////////////////////////////////
  838. // Utils
  839. LPDLGTEMPLATE CXTPResourceManagerXML::CreateDialogTemplate(DLGTEMPLATEINFO& dlgTemplate)
  840. {
  841. int nDlgLength = dlgTemplate.GetLength();
  842. DLGTEMPLATEEX* lpDlgTemplate = (DLGTEMPLATEEX*)malloc(nDlgLength);
  843. if (lpDlgTemplate == NULL)
  844. return NULL;
  845. ZeroMemory(lpDlgTemplate, nDlgLength);
  846. *lpDlgTemplate = dlgTemplate;
  847. BYTE* pMain = (BYTE*) lpDlgTemplate + sizeof(DLGTEMPLATEEX) + sizeof(WORD) * 2;
  848. // Caption
  849. ASSERT(dlgTemplate.lpszCaption != 0);
  850. if (!dlgTemplate.lpszCaption)
  851. return NULL;
  852. size_t nLength = (wcslen(dlgTemplate.lpszCaption) + 1) * sizeof(WORD);
  853. MEMCPY_S(pMain, dlgTemplate.lpszCaption, nLength);
  854. pMain += nLength;
  855. if (dlgTemplate.style & DS_SETFONT)
  856. {
  857. *((WORD *)pMain) = (WORD)dlgTemplate.nPointSize;
  858. pMain += sizeof(WORD);
  859. pMain += sizeof(WORD) + sizeof(BYTE) + sizeof(BYTE);
  860. MBSTOWCS_S((LPWSTR)pMain, dlgTemplate.strFaceName, dlgTemplate.strFaceName.GetLength() + 1);
  861. }
  862. pMain = (BYTE*) lpDlgTemplate + dlgTemplate.GetHeaderLength();
  863. ASSERT(dlgTemplate.cDlgItems == dlgTemplate.aItems.GetSize());
  864. CArray<DLGITEMTEMPLATEINFO*, DLGITEMTEMPLATEINFO*>& aItems = dlgTemplate.aItems;
  865. for (int i = 0; i < aItems.GetSize(); i++)
  866. {
  867. DLGITEMTEMPLATEINFO& itemInfo = *aItems[i];
  868. // Copy constant part of the template
  869. *(DLGITEMTEMPLATEEX*)pMain = itemInfo;
  870. BYTE* pControlMain = pMain + sizeof(DLGITEMTEMPLATEEX);
  871. // Class
  872. MBSTOWCS_S((LPWSTR)pControlMain, itemInfo.strClassName, itemInfo.strClassName.GetLength() + 1);
  873. pControlMain += (itemInfo.strClassName.GetLength() + 1) * sizeof(WORD);
  874. // Copy Caption
  875. if (itemInfo.nCaptionID != 0)
  876. {
  877. *((PWORD)pControlMain) = 0xFFFF;
  878. *((PWORD)pControlMain + 1) = (WORD)itemInfo.nCaptionID;
  879. pControlMain += sizeof(WORD) * 2;
  880. }
  881. else
  882. {
  883. ASSERT(itemInfo.lpszCaption != 0);
  884. if (itemInfo.lpszCaption)
  885. {
  886. nLength = (wcslen(itemInfo.lpszCaption) + 1) * sizeof(WORD);
  887. MEMCPY_S(pControlMain, itemInfo.lpszCaption, nLength);
  888. pControlMain += nLength;
  889. }
  890. else
  891. {
  892. pControlMain += sizeof(WORD);
  893. }
  894. }
  895. // Init Data length
  896. *((WORD *)pControlMain) = 0;
  897. pControlMain += sizeof(WORD);
  898. pMain += itemInfo.GetLength();
  899. }
  900. return (LPDLGTEMPLATE)lpDlgTemplate;
  901. }
  902. LPDLGTEMPLATE CXTPResourceManagerXML::CreateDialogTemplate(CXTPPropExchange* pPX)
  903. {
  904. DLGTEMPLATEINFO dlgTemplate;
  905. CString strPos;
  906. CRect rc;
  907. DWORD dwStyle = 0, dwExtendedStyle = 0, id;
  908. PX_DWord(pPX, _T("style"), dwStyle, 0);
  909. PX_DWord(pPX, _T("styleex"), dwExtendedStyle, 0);
  910. PX_Rect(pPX, _T("position"), rc, CRect(0, 0, 0, 0));
  911. PX_String(pPX, _T("fontface"), dlgTemplate.strFaceName, _T("MS Sans Serif"));
  912. PX_Int(pPX, _T("fontsize"), dlgTemplate.nPointSize, 8);
  913. PX_Bstr(pPX, _T("caption"), dlgTemplate.lpszCaption, L"");
  914. PX_DWord(pPX, _T("id"), id, 0);
  915. dlgTemplate.x = (short)rc.left;
  916. dlgTemplate.y = (short)rc.top;
  917. dlgTemplate.cx = (short)rc.right;
  918. dlgTemplate.cy = (short)rc.bottom;
  919. dlgTemplate.style = dwStyle;
  920. dlgTemplate.exStyle = dwExtendedStyle;
  921. dlgTemplate.helpID = id;
  922. dlgTemplate.cDlgItems = 0;
  923. dlgTemplate.style |= DS_SETFONT;
  924. dlgTemplate.dlgVer = 1;
  925. dlgTemplate.signature = 0xFFFF;
  926. CArray<DLGITEMTEMPLATEINFO*, DLGITEMTEMPLATEINFO*>& aItems = dlgTemplate.aItems;
  927. CXTPPropExchangeEnumeratorPtr enumerator(pPX->GetEnumerator(_T("control")));
  928. POSITION pos = enumerator->GetPosition();
  929. while (pos)
  930. {
  931. CXTPPropExchangeSection sec(enumerator->GetNext(pos));
  932. DLGITEMTEMPLATEINFO* pItemInfo = new DLGITEMTEMPLATEINFO;
  933. PX_DWord(&sec, _T("style"), dwStyle, WS_CHILD | WS_VISIBLE | WS_GROUP);
  934. PX_DWord(&sec, _T("styleex"), dwExtendedStyle, 0);
  935. PX_Rect(&sec, _T("position"), rc, CRect(0, 0, 0, 0));
  936. PX_Bstr(&sec, _T("caption"), pItemInfo->lpszCaption, L"");
  937. PX_String(&sec, _T("class"), pItemInfo->strClassName, _T("STATIC"));
  938. PX_DWord(&sec, _T("id"), id, (DWORD)IDC_STATIC);
  939. PX_Int(&sec, _T("resource"), pItemInfo->nCaptionID, 0);
  940. pItemInfo->x = (short)rc.left;
  941. pItemInfo->y = (short)rc.top;
  942. pItemInfo->cx = (short)rc.right;
  943. pItemInfo->cy = (short)rc.bottom;
  944. pItemInfo->style = dwStyle;
  945. pItemInfo->exStyle = dwExtendedStyle;
  946. pItemInfo->helpID = 0;
  947. pItemInfo->id = id;
  948. aItems.Add(pItemInfo);
  949. dlgTemplate.cDlgItems++;
  950. }
  951. return CreateDialogTemplate(dlgTemplate);
  952. }
  953. LPCDLGTEMPLATE CXTPResourceManagerXML::LoadDialogTemplate(UINT nIDResource)
  954. {
  955. if (!m_bValid || m_pResourceRoot == NULL)
  956. return CXTPResourceManager::LoadDialogTemplate(nIDResource);
  957. CString strPattern;
  958. strPattern.Format(_T("dialog[@id = "%i"]"), nIDResource);
  959. DLGTEMPLATE* pTemplate = 0;
  960. if (m_mapDialogs.Lookup(nIDResource, (DLGTEMPLATE*&)pTemplate))
  961. return pTemplate;
  962. if (!m_pResourceRoot->IsSectionExists(strPattern))
  963. return CXTPResourceManager::LoadDialogTemplate(nIDResource);
  964. CXTPPropExchangeSection secDialog(m_pResourceRoot->GetSection(strPattern));
  965. pTemplate = CreateDialogTemplate(&secDialog);
  966. if (pTemplate)
  967. {
  968. m_mapDialogs.SetAt(nIDResource, pTemplate);
  969. return pTemplate;
  970. }
  971. return CXTPResourceManager::LoadDialogTemplate(nIDResource);
  972. }
  973. #endif