hxmullan.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:23k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hxtypes.h"
  36. #ifdef _WINDOWS
  37. #include "hlxclib/windows.h"
  38. #endif
  39. #include "hxcom.h"
  40. #include "hxver.h"
  41. #include "hxmullan.h" // The API we are implementing
  42. #include <string.h> // Needed for strchr()
  43. #include <stdlib.h> // Needed for atol()
  44. #include <stdio.h> // Needed for sprintf()
  45. #include "hxstrutl.h"
  46. #ifndef _WIN32
  47. #include <shellapi.h> // Needed for Registry Stuff
  48. #endif
  49. #include "hxheap.h"
  50. #ifdef _DEBUG
  51. #undef HX_THIS_FILE
  52. static const char HX_THIS_FILE[] = __FILE__;
  53. #endif
  54. //
  55. // Function prototypes for load and create font from satellite DLL
  56. //
  57. #define NAME_CREATE_FONT "Create_Font"
  58. #define NAME_LOAD_FONT   "Load_Font"
  59. static char Name_Create_Font [] = NAME_CREATE_FONT;
  60. static char Name_Load_Font [] = NAME_LOAD_FONT;
  61. typedef HFONT     (FAR PASCAL * CREATE_FONT)(int, int , int , int ,
  62. int , DWORD , DWORD , DWORD ,
  63. DWORD , DWORD , DWORD , DWORD ,
  64.                                                                                         DWORD , LPCSTR );
  65. typedef HFONT   (FAR PASCAL * LOAD_FONT) (int);
  66. BOOL g_bWindows31 = FALSE; // We need to know about Win3.1 
  67. // since it's registry is kinda
  68. // messed up.
  69. HINSTANCE g_hInstBase = NULL;
  70. LCID g_locale = HX_DEFAULT_LOCALE;
  71. HINSTANCE g_hLangDLLs[MAX_LANG_DLLS];
  72. int g_nLangDLLs = 0;
  73. ////////////////////////////////////////////
  74. //
  75. // Quick Class to dynamically load the National Language support
  76. // under Win 16 and Win 32.
  77. //
  78. ////////////////////////////////////////////
  79. typedef int (HXEXPORT_PTR FPGETLOCALEINFOA)(LCID LCID, LCTYPE LCType, LPSTR lpLCData, int cchData);
  80. class CDynamicLoadLanguageService
  81. {
  82. private:
  83. HINSTANCE m_hInstance;
  84. FPGETLOCALEINFOA fpGetLocaleInfoA;
  85. public:
  86. CDynamicLoadLanguageService();
  87. ~CDynamicLoadLanguageService();
  88. BOOL IsValidCodePage(UINT CodePage) const;
  89. int GetLocaleInfoA(LCID LCID, LCTYPE LCType, LPSTR lpLCData, 
  90. int cchData) const;
  91. BOOL IsValid() const { return (m_hInstance > (HINSTANCE)32 && fpGetLocaleInfoA != NULL);};
  92. };
  93. CDynamicLoadLanguageService::CDynamicLoadLanguageService()
  94. {
  95. #ifdef _WIN32
  96. m_hInstance = LoadLibrary(OS_STRING("Kernel32.dll"));
  97. #else
  98. m_hInstance = LoadLibrary(OS_STRING("ole2nls.dll"));
  99. #endif
  100. if (m_hInstance > (HINSTANCE)32)
  101. {
  102. fpGetLocaleInfoA = (FPGETLOCALEINFOA)GetProcAddress(m_hInstance, OS_STRING("GetLocaleInfoA"));
  103. }
  104. }
  105. CDynamicLoadLanguageService::~CDynamicLoadLanguageService()
  106. {
  107. FreeLibrary(m_hInstance);
  108. fpGetLocaleInfoA = NULL;
  109. }
  110. BOOL CDynamicLoadLanguageService::IsValidCodePage(UINT CodePage) const
  111. {
  112. // There doesn't appear to be a good way to determine in a 16bit application
  113. // whether or not a particular code page is supported, therefore, we will
  114. // just assume it is for 16bit apps, and only check for 32bit apps
  115. #ifdef _WIN32
  116. return ::IsValidCodePage(CodePage);
  117. #else
  118. return TRUE;
  119. #endif
  120. }
  121. int CDynamicLoadLanguageService::GetLocaleInfoA(LCID theLCID, LCTYPE LCType, LPSTR lpLCData, 
  122. int cchData) const
  123. {
  124. LCID lLCID = theLCID;
  125. LCTYPE lLCType = LCType;
  126. LPSTR llpLCData = lpLCData;
  127. int lcchData = cchData;
  128. int retVal = fpGetLocaleInfoA(lLCID, lLCType, llpLCData, lcchData);
  129. return retVal;
  130. }
  131. /////////////////////////////////////////
  132. //
  133. // Forward Declarations of some local functions!
  134. //
  135. /////////////////////////////////////////
  136. void WriteLocaleToRegistry(LCID locale);
  137. void ChangeSpaces(char* pString);
  138. LCID ReadLocaleFromRegistry();
  139. void UnloadLanguageDLLs();
  140. void HXSetupMulLang(HINSTANCE hInstBase, BOOL bWin31)
  141. {
  142. g_hInstBase = hInstBase;
  143. g_bWindows31 = bWin31;
  144. }
  145. void HXCleanupMulLang()
  146. {
  147. UnloadLanguageDLLs();
  148. }
  149. void UnloadLanguageDLLs()
  150. {
  151. // First unload any and all previously loaded DLLs!
  152. for (int ndx = 0; ndx < g_nLangDLLs; ndx++)
  153. {
  154. if (g_hLangDLLs[ndx])
  155. {
  156. FreeLibrary(g_hLangDLLs[ndx]);
  157. g_hLangDLLs[ndx] = NULL;
  158. }
  159. }
  160. g_nLangDLLs = 0;
  161. }
  162. // This function loads satalite DLL list.
  163. void HXSetLocale(LCID locale)
  164. {
  165. if (locale != g_locale)
  166. {
  167. // First unload any and all previously loaded DLLs!
  168. UnloadLanguageDLLs();
  169. // Now search registry and load DLLs for this locale!
  170. HKEY hKey;
  171. char* pKeyName = new char[256];
  172. char szLocaleCode[20]; /* Flawfinder: ignore */
  173. char szDLLPath[256]; /* Flawfinder: ignore */
  174. int nRegCount = 0;
  175. sprintf(szLocaleCode,"%d",locale); /* Flawfinder: ignore */
  176. //GetLocaleInfoA(locale,LOCALE_SABBREVLANGNAME,szSLang,4);
  177. SafeSprintf(pKeyName, 256, "Software\%s\Languages\", HXVER_COMMUNITY);
  178. #ifdef _WIN32
  179. SafeStrCat(pKeyName, "32bit\", 256);
  180. #else
  181. SafeStrCat(pKeyName, "16bit\", 256);
  182. #endif
  183. SafeStrCat(pKeyName, szLocaleCode, 256);
  184. ChangeSpaces(pKeyName);
  185. long lResult;
  186. if(RegOpenKey(HKEY_CLASSES_ROOT, pKeyName, &hKey) == ERROR_SUCCESS)
  187. {
  188. lResult = RegEnumKey(hKey, nRegCount, szDLLPath, sizeof(szDLLPath));
  189. while(lResult == ERROR_SUCCESS)
  190. {
  191. g_hLangDLLs[g_nLangDLLs] = LoadLibrary(OS_STRING(szDLLPath));
  192. if (g_hLangDLLs[g_nLangDLLs] > (HINSTANCE)32)
  193. {
  194. g_nLangDLLs++;
  195. }
  196. nRegCount++;
  197. lResult = RegEnumKey(hKey, nRegCount, szDLLPath, sizeof(szDLLPath));
  198. }
  199. RegCloseKey(hKey);
  200. }
  201. delete[] pKeyName;
  202. // Now, we need to set our stored locale setting
  203. g_locale = locale;
  204. // We should also set the preferred locale in the registry!
  205. WriteLocaleToRegistry(locale);
  206. }
  207. }
  208. void WriteLocaleToRegistry(LCID locale)
  209. {
  210. HKEY hKey;
  211. char* pKeyName = new char[256];
  212. char szLocaleCode[20]; /* Flawfinder: ignore */
  213. sprintf(szLocaleCode,"%d",locale); /* Flawfinder: ignore */
  214. SafeSprintf(pKeyName, 256, "Software\%s\Languages\Locale", HXVER_COMMUNITY);
  215. ChangeSpaces(pKeyName);
  216. long lResult;
  217. if(RegCreateKey(HKEY_CLASSES_ROOT, pKeyName, &hKey) == ERROR_SUCCESS)
  218. {
  219. lResult = RegSetValue(hKey, "", REG_SZ, szLocaleCode, strlen(szLocaleCode));
  220. RegCloseKey(hKey);
  221. }
  222. delete[] pKeyName;
  223. }
  224. LCID ReadLocaleFromRegistry()
  225. {
  226. HKEY hKey;
  227. char* pKeyName = new char[256];
  228. char szLocaleCode[20]; /* Flawfinder: ignore */
  229. long    lSize;
  230. int nRegCount = 1;
  231. LCID locale = HX_DEFAULT_LOCALE;
  232. SafeSprintf(pKeyName, 256, "Software\%s\Languages\Locale", HXVER_COMMUNITY);
  233. ChangeSpaces(pKeyName);
  234. long lResult;
  235. if(RegOpenKey(HKEY_CLASSES_ROOT, pKeyName, &hKey) == ERROR_SUCCESS)
  236. {
  237. lSize = 20;
  238. lResult = RegQueryValue(hKey, "", szLocaleCode, &lSize);
  239. if (lResult == ERROR_SUCCESS)
  240. {
  241. locale = atol(szLocaleCode);
  242. }
  243. RegCloseKey(hKey);
  244. }
  245. delete[] pKeyName;
  246. return locale;
  247. }
  248. void ChangeSpaces(char* pString)
  249. {
  250. // For Windows 3.1 we are using '_' instead of spaces
  251. if (g_bWindows31)
  252. {
  253.     char * pSpace;
  254.     while((pSpace = strchr(pString, ' ')) != NULL)
  255.         *pSpace = '_';
  256. }
  257. }
  258. // This function returns current locale global.
  259. LCID HXGetLocale()
  260. {
  261. return g_locale;
  262. }
  263. // This function checks current locale global against 
  264. // preference, if they are different, calls HXSetLocale().
  265. LCID HXCheckLocale()
  266. {
  267. LCID localeFromPrefs = ReadLocaleFromRegistry();
  268. if (localeFromPrefs != g_locale)
  269. {
  270. HXSetLocale(localeFromPrefs);
  271. }
  272. return g_locale;
  273. }
  274. static const char LOCALE_FORMAT_STRING[] = "%s (%s)";
  275. // returns TRUE if the current item is selected!
  276. BOOL AddLocaleListbox(HWND hwndListBox, LCID locale)
  277. {
  278. char* pLocaleName = new char[256];
  279. char* pEnglishName = new char[256];
  280. BOOL bSelected = FALSE;
  281. CDynamicLoadLanguageService LanguageService;
  282. if(LanguageService.IsValid())
  283. {
  284. // First we want to make sure this machine can handle this
  285. // language at all. To do this it needs to have the code page
  286. // correctly installed.
  287. char szCodePage[7]; /* Flawfinder: ignore */
  288. // Ask NLS for the Country Name!
  289. if (LanguageService.GetLocaleInfoA(locale, LOCALE_IDEFAULTCODEPAGE, szCodePage, sizeof(szCodePage)-1))
  290. {
  291. int nCodePage = atoi(szCodePage);
  292. if (LanguageService.IsValidCodePage(nCodePage))
  293. {
  294. // Ask NLS for the Country Name!
  295. if (LanguageService.GetLocaleInfoA(locale, LOCALE_SNATIVELANGNAME, pLocaleName, 255) &&
  296. LanguageService.GetLocaleInfoA(locale, LOCALE_SENGLANGUAGE, pEnglishName, 255))
  297. {
  298. // Compose the string; it will look like "NATIVELANGNAME (ENGLANGUAGE)"
  299.                                         UINT32 ulFullDescBufLen =  strlen (pLocaleName) +
  300.                                                                    strlen (pEnglishName) +
  301.                                                                    strlen (LOCALE_FORMAT_STRING) + 1;
  302. char* pFullDescription = new char [ulFullDescBufLen];
  303. SafeSprintf (pFullDescription, ulFullDescBufLen, LOCALE_FORMAT_STRING, pLocaleName, pEnglishName);
  304. // First Add the String...
  305. int nLBIndex = (int)SendMessage(hwndListBox,LB_ADDSTRING,0,(LPARAM)pFullDescription);
  306. // Then set the item data...
  307. SendMessage(hwndListBox,LB_SETITEMDATA,nLBIndex,(LPARAM)locale);
  308. // If this is the current locale, then select it!
  309. if (locale == g_locale)
  310. {
  311. SendMessage(hwndListBox,LB_SETCURSEL,nLBIndex,0);
  312. bSelected = TRUE;
  313. }
  314. delete [] pFullDescription;
  315. }
  316. }
  317. }
  318. }
  319. delete [] pLocaleName;
  320. delete [] pEnglishName;
  321. return bSelected;
  322. }
  323. // Fills in listbox with all installed languages
  324. void HXLoadLocaleListbox(HWND hwndListBox)
  325. {
  326. // Now search registry and load DLLs for this locale!
  327. HKEY hKey;
  328. char* pKeyName = new char[256];
  329. char szLocaleCode[20]; /* Flawfinder: ignore */
  330. int nRegCount = 0;
  331. LCID thisLocale;
  332. BOOL bSomethingSelected = FALSE;
  333. LCID englishLocale = HX_MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_NEUTRAL));
  334. SafeSprintf(pKeyName, 256, "Software\%s\Languages\", HXVER_COMMUNITY);
  335. #ifdef _WIN32
  336. SafeStrCat(pKeyName, "32bit", 256);
  337. #else
  338. SafeStrCat(pKeyName, "16bit", 256);
  339. #endif
  340. ChangeSpaces(pKeyName);
  341. long lResult;
  342. if(RegOpenKey(HKEY_CLASSES_ROOT, pKeyName, &hKey) == ERROR_SUCCESS)
  343. {
  344. lResult = RegEnumKey(hKey, nRegCount, szLocaleCode, sizeof(szLocaleCode));
  345. while(lResult == ERROR_SUCCESS)
  346. {
  347. // The Locale is coded in the key name!
  348. thisLocale = (LCID)(atol(szLocaleCode));
  349. // If this is english, then don't add it yet, but remember 
  350. // so we can add it at the end. We do this so that we will
  351. // be able to set english as the selected language.
  352. if (thisLocale != englishLocale)
  353. {
  354. // Add it, this will check for validity, current settings, etc.
  355. if (AddLocaleListbox(hwndListBox,thisLocale))
  356. {
  357. bSomethingSelected = TRUE;
  358. }
  359. }
  360. nRegCount++;
  361. lResult = RegEnumKey(hKey, nRegCount, szLocaleCode, sizeof(szLocaleCode));
  362. }
  363. RegCloseKey(hKey);
  364. }
  365. //////////////////////////////////////////////////
  366. // Last, but not least, don't forget English. 
  367. // We always support English! <g>
  368. //////////////////////////////////////////////////
  369. // If something else hasn't yet been selected, then
  370. // we will make sure English is selected!
  371. if (!bSomethingSelected)
  372. {
  373. g_locale = englishLocale;
  374. }
  375. AddLocaleListbox(hwndListBox,englishLocale);
  376. // Finally, clean up any mess we made!
  377. delete[] pKeyName;
  378. }
  379. ////////////////////////////////////////////////////////////////////////////////
  380. //
  381. //
  382. //
  383. //
  384. int HXLoadString(UINT idResource, LPSTR lpszBuffer, int cbBuffer)
  385. {
  386. BOOL bLoaded = FALSE;
  387. int output = 0;
  388. HXCheckLocale();
  389. HINSTANCE hTempDLL;
  390. // First Check in Language DLLs
  391. for (int ndx = 0; ndx < g_nLangDLLs; ndx++)
  392. {
  393. if (g_hLangDLLs[ndx])
  394. {
  395. hTempDLL = g_hLangDLLs[ndx];
  396. output = LoadString(hTempDLL, idResource, 
  397.     OS_STRING2(lpszBuffer, cbBuffer), 
  398.     cbBuffer);
  399. if (output)
  400. {
  401. bLoaded = TRUE;
  402. break; // for
  403. } // if output
  404. } // if some handle
  405. } // for
  406. if (!bLoaded)
  407. {
  408. output = LoadString(g_hInstBase, idResource, 
  409.     OS_STRING2(lpszBuffer, cbBuffer), 
  410.     cbBuffer);
  411. }
  412. return output;
  413. }
  414. HBITMAP HXLoadBitmap(LPCSTR pszName)
  415. {
  416. BOOL bLoaded = FALSE;
  417. HBITMAP output = NULL;
  418. HXCheckLocale();
  419. HINSTANCE hTempDLL;
  420. // First Check in Language DLLs
  421. for (int ndx = 0; ndx < g_nLangDLLs; ndx++)
  422. {
  423. if (g_hLangDLLs[ndx])
  424. {
  425. hTempDLL = g_hLangDLLs[ndx];
  426. output = LoadBitmap(hTempDLL, OS_STRING(pszName));
  427. if (output)
  428. {
  429. bLoaded = TRUE;
  430. break; // for
  431. } // if output
  432. } // if some handle
  433. } // for
  434. if (!bLoaded)
  435. {
  436. output = LoadBitmap(g_hInstBase, OS_STRING(pszName));
  437. }
  438. return output;
  439. }
  440. HICON HXLoadIcon(LPCSTR pszName)
  441. {
  442. BOOL bLoaded = FALSE;
  443. HICON output = NULL;
  444. HXCheckLocale();
  445. HINSTANCE hTempDLL;
  446. // First Check in Language DLLs
  447. for (int ndx = 0; ndx < g_nLangDLLs; ndx++)
  448. {
  449. if (g_hLangDLLs[ndx])
  450. {
  451. hTempDLL = g_hLangDLLs[ndx];
  452. output = LoadIcon(hTempDLL, OS_STRING(pszName));
  453. if (output)
  454. {
  455. bLoaded = TRUE;
  456. break; // for
  457. } // if output
  458. } // if some handle
  459. } // for
  460. if (!bLoaded)
  461. {
  462. output = LoadIcon(g_hInstBase, OS_STRING(pszName));
  463. }
  464. return output;
  465. }
  466. HCURSOR HXLoadCursor(LPCSTR pszName)
  467. {
  468. BOOL bLoaded = FALSE;
  469. HCURSOR output = NULL;
  470. HXCheckLocale();
  471. HINSTANCE hTempDLL;
  472. // First Check in Language DLLs
  473. for (int ndx = 0; ndx < g_nLangDLLs; ndx++)
  474. {
  475. if (g_hLangDLLs[ndx])
  476. {
  477. hTempDLL = g_hLangDLLs[ndx];
  478. output = LoadCursor(hTempDLL, OS_STRING(pszName));
  479. if (output)
  480. {
  481. bLoaded = TRUE;
  482. break; // for
  483. } // if output
  484. } // if some handle
  485. } // for
  486. if (!bLoaded)
  487. {
  488. output = LoadCursor(g_hInstBase, OS_STRING(pszName));
  489. }
  490. return output;
  491. }
  492. HMENU HXLoadMenu(LPCSTR pszName)
  493. {
  494. BOOL bLoaded = FALSE;
  495. HMENU output = NULL;
  496. HXCheckLocale();
  497. HINSTANCE hTempDLL;
  498. // First Check in Language DLLs
  499. for (int ndx = 0; ndx < g_nLangDLLs; ndx++)
  500. {
  501. if (g_hLangDLLs[ndx])
  502. {
  503. hTempDLL = g_hLangDLLs[ndx];
  504. output = LoadMenu(hTempDLL, OS_STRING(pszName));
  505. if (output)
  506. {
  507. bLoaded = TRUE;
  508. break; // for
  509. } // if output
  510. } // if some handle
  511. } // for
  512. if (!bLoaded)
  513. {
  514. output = LoadMenu(g_hInstBase, OS_STRING(pszName));
  515. }
  516. return output;
  517. }
  518. void * LoadDialogBoxTemplate(HINSTANCE hInst, LPCSTR pszName, HGLOBAL * pHMem)
  519. {
  520. *pHMem = NULL;
  521. HRSRC hRsrc = FindResource(hInst, OS_STRING(pszName),RT_DIALOG);
  522. if (hRsrc)
  523. {
  524. *pHMem = LoadResource(hInst,hRsrc);
  525. return LockResource(*pHMem);
  526. }
  527. return NULL;
  528. }
  529. void * HXLoadDialogBoxTemplate(LPCSTR pszName, HGLOBAL * pHMem)
  530. {
  531. BOOL bLoaded = FALSE;
  532. void *  pTemplate = NULL;
  533. *pHMem = NULL;
  534. HXCheckLocale();
  535. HINSTANCE hTempDLL;
  536. // First Check in Language DLLs
  537. for (int ndx = 0; ndx < g_nLangDLLs; ndx++)
  538. {
  539. if (g_hLangDLLs[ndx])
  540. {
  541. hTempDLL = g_hLangDLLs[ndx];
  542. pTemplate = LoadDialogBoxTemplate(hTempDLL, pszName, pHMem);
  543. if (pTemplate)
  544. {
  545. bLoaded = TRUE;
  546. break; // for
  547. } // if output
  548. } // if some handle
  549. } // for
  550. if (!bLoaded)
  551. {
  552. pTemplate = LoadDialogBoxTemplate(g_hInstBase, pszName, pHMem);
  553. }
  554. return pTemplate;
  555. }
  556. int HXDialogBox(LPCSTR pszName, HWND hwndOwner, DLGPROC dlgprc)
  557. {
  558. int output = 0;                                                   
  559. HGLOBAL hMem;
  560. #ifdef _WIN32
  561. LPDLGTEMPLATE pDlgTemp = (LPDLGTEMPLATE)HXLoadDialogBoxTemplate(pszName, &hMem);
  562. #else
  563. void * pDlgTemp = HXLoadDialogBoxTemplate(pszName, &hMem);
  564. #endif
  565. if (pDlgTemp && hMem)
  566. {
  567. #ifdef _WIN32
  568. output = DialogBoxIndirect(g_hInstBase, pDlgTemp, hwndOwner, dlgprc);
  569. #else                                                                  
  570.        output = DialogBoxIndirect(g_hInstBase, hMem, hwndOwner, dlgprc);
  571. UnlockResource(hMem);
  572. FreeResource(hMem);
  573. #endif        
  574. }
  575. return output;
  576. }
  577. int HXDialogBoxParam(LPCSTR pszName, HWND hwndOwner, DLGPROC dlgprc, LPARAM lParamInit)
  578. {
  579. int output = 0;   
  580. HGLOBAL hMem;
  581. #ifdef _WIN32
  582. LPDLGTEMPLATE pDlgTemp = (LPDLGTEMPLATE)HXLoadDialogBoxTemplate(pszName, &hMem);
  583. #else
  584. void * pDlgTemp = HXLoadDialogBoxTemplate(pszName, &hMem);
  585. #endif
  586. if (pDlgTemp && hMem)
  587. {
  588. #ifdef _WIN32
  589. output = DialogBoxIndirectParam(g_hInstBase, pDlgTemp, hwndOwner, dlgprc, lParamInit);
  590. #else                                                                  
  591.        output = DialogBoxIndirectParam(g_hInstBase, hMem, hwndOwner, dlgprc, lParamInit);
  592. UnlockResource(hMem);
  593. FreeResource(hMem);
  594. #endif        
  595. }
  596. return output;
  597. }
  598. HWND HXCreateDialog(LPCSTR pszName, HWND hwndOwner, DLGPROC dlgprc)
  599. {
  600. HWND output = 0;  
  601. HGLOBAL hMem;
  602. #ifdef _WIN32
  603. LPDLGTEMPLATE pDlgTemp = (LPDLGTEMPLATE)HXLoadDialogBoxTemplate(pszName, &hMem);
  604. #else
  605. void * pDlgTemp = HXLoadDialogBoxTemplate(pszName, &hMem);
  606. #endif
  607. if (pDlgTemp && hMem)
  608. {
  609. output = CreateDialogIndirect(g_hInstBase, pDlgTemp, hwndOwner, dlgprc);
  610. #ifdef _WIN16
  611.                 UnlockResource(hMem);
  612. FreeResource(hMem);
  613. #endif
  614. }
  615. return output;
  616. }
  617. HWND HXCreateDialogParam(LPCSTR pszName, HWND hwndOwner, DLGPROC dlgprc, LPARAM lParamInit)
  618. {
  619. HWND output = 0;
  620. HGLOBAL hMem;
  621. #ifdef _WIN32
  622. LPDLGTEMPLATE pDlgTemp = (LPDLGTEMPLATE)HXLoadDialogBoxTemplate(pszName, &hMem);
  623. #else
  624. void * pDlgTemp = HXLoadDialogBoxTemplate(pszName, &hMem);
  625. #endif
  626. if (pDlgTemp && hMem)
  627. {
  628. output = CreateDialogIndirectParam(g_hInstBase, pDlgTemp, hwndOwner, dlgprc, lParamInit);
  629. #ifdef _WIN16
  630. UnlockResource(hMem);
  631. FreeResource(hMem);
  632. #endif
  633. }
  634. return output;
  635. }
  636. void HXResetWindowText(HWND hwnd, UINT idResource)
  637. {
  638. char szText[256]; /* Flawfinder: ignore */
  639. int nCharCount = HXLoadString(idResource,szText,255);
  640. if (nCharCount > 0)
  641. {
  642. // Try and set the new text
  643. SetWindowText(hwnd, OS_STRING(szText));
  644. }
  645. }
  646. #ifndef WIN32_PLATFORM_PSPC
  647. void HXResetWindowMenu(HWND hwnd, LPCSTR pszName)
  648. {
  649. HMENU hNewMenu = HXLoadMenu(pszName);
  650. HMENU hOldMenu = GetMenu(hwnd);
  651. // Try and set the new menu
  652. if (SetMenu(hwnd,hNewMenu))
  653. {
  654. hNewMenu = NULL;
  655. }
  656. // If we succesfully set the new menu than it
  657. // will be NULL, otherwise we need to clean it
  658. // up correctly.
  659. if (hNewMenu)
  660. {
  661. DestroyMenu(hNewMenu);
  662. }
  663. // Normally we got the old menu and we need to
  664. // clean it up. Otherwise we don't need to do
  665. // anything.
  666. if (hOldMenu)
  667. {
  668. DestroyMenu(hOldMenu);
  669. }
  670. }
  671. HMENU HXLoadPopupMenu(LPCSTR pMenuName)
  672. {
  673. HMENU hPopup = NULL;
  674. HMENU hMenu = HXLoadMenu(pMenuName);
  675. if (hMenu)
  676. {
  677. hPopup = CreatePopupMenu();
  678. int nItemCount = GetMenuItemCount(hMenu);
  679. for (int nItem = 0; nItem < nItemCount; nItem++)
  680. {
  681. char buffer[256]; /* Flawfinder: ignore */
  682. UINT unID = GetMenuItemID(hMenu,nItem);
  683. UINT unState = GetMenuState(hMenu,nItem,MF_BYPOSITION);
  684. GetMenuString(hMenu,nItem,buffer,sizeof(buffer)-1,MF_BYPOSITION);
  685. AppendMenu(hPopup,unState | MF_STRING,unID,buffer);
  686.     }
  687. }
  688. return hPopup;
  689. }
  690. HFONT HXCreateFont (int nHeight,
  691. int nWidth,
  692. int nEscapement,
  693. int nOrientation,
  694. int fnWeight,  
  695. DWORD fdwItalic,
  696. DWORD fdwUnderline,
  697. DWORD fdwStrikeOut,
  698. DWORD fdwCharSet,
  699. DWORD fdwOutputPrecision,
  700. DWORD fdwClipPrecision,
  701. DWORD fdwQuality,
  702. DWORD fdwPitchAndFamily,
  703. LPCSTR lpszFace)
  704. {
  705. HINSTANCE hTempDLL;
  706. HFONT rtnFont;
  707. CREATE_FONT Create_Font_Func = NULL;
  708. BOOL bLoaded = FALSE;
  709. int output = 0;
  710. HXCheckLocale();
  711. // First Check in Language DLLs
  712. for (int ndx = 0; ndx < g_nLangDLLs; ndx++)
  713. {
  714. if (g_hLangDLLs[ndx])
  715. {
  716. hTempDLL = g_hLangDLLs[ndx];
  717. Create_Font_Func = (CREATE_FONT)GetProcAddress((HINSTANCE)hTempDLL, OS_STRING(Name_Create_Font));  
  718. if (Create_Font_Func)
  719. {
  720. bLoaded = TRUE;
  721. rtnFont = (* Create_Font_Func) (nHeight, nWidth, nEscapement,
  722. nOrientation, fnWeight, fdwItalic,
  723. fdwUnderline, fdwStrikeOut, fdwCharSet,
  724. fdwOutputPrecision, fdwClipPrecision,
  725. fdwQuality, fdwPitchAndFamily,
  726. lpszFace);
  727. break; // for
  728. } // if output
  729. } // if some handle
  730. } // for
  731. if (!bLoaded)
  732. {
  733. // NOTE: Win32 and Win16 versions take different sized parameters!
  734. rtnFont = CreateFont(nHeight, nWidth, nEscapement, nOrientation, fnWeight, 
  735. #ifdef _WIN32
  736. fdwItalic, fdwUnderline, fdwStrikeOut, fdwCharSet, 
  737. fdwOutputPrecision, fdwClipPrecision, fdwQuality, 
  738. fdwPitchAndFamily,
  739. #else
  740. (BYTE)fdwItalic, (BYTE)fdwUnderline, (BYTE)fdwStrikeOut, 
  741. (BYTE)fdwCharSet, (BYTE)fdwOutputPrecision, (BYTE)fdwClipPrecision,
  742. (BYTE)fdwQuality, (BYTE)fdwPitchAndFamily,
  743. #endif
  744. lpszFace);
  745. }
  746. return rtnFont;
  747. }
  748. HFONT HXGetStockFont ( int stockFontId )
  749. {
  750. HINSTANCE hTempDLL;
  751. HFONT rtnFont;
  752. LOAD_FONT Load_Font_Func = NULL;
  753. BOOL bLoaded = FALSE;
  754. int output = 0;
  755. HXCheckLocale();
  756. // First Check in Language DLLs
  757. for (int ndx = 0; ndx < g_nLangDLLs; ndx++)
  758. {
  759. if (g_hLangDLLs[ndx])
  760. {
  761. hTempDLL = g_hLangDLLs[ndx];
  762.     Load_Font_Func = (LOAD_FONT)GetProcAddress((HINSTANCE)hTempDLL, OS_STRING(Name_Load_Font));  
  763. if (Load_Font_Func)
  764. {
  765. bLoaded = TRUE;
  766. rtnFont = (* Load_Font_Func) ( stockFontId );
  767. break;
  768. }
  769. }
  770. }
  771. if (!bLoaded)
  772. {
  773. return (HFONT) GetStockObject ( stockFontId );
  774. }
  775. return rtnFont;
  776. }
  777. #endif