hxmullan.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:24k
源码类别:

Symbian

开发平台:

Visual C++

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