Language.cpp
上传用户:dengkfang
上传日期:2008-12-30
资源大小:5233k
文件大小:23k
源码类别:

CA认证

开发平台:

Visual C++

  1. #include "stdafx.h"
  2. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  3. // 预处理
  4. #include "Language.h"
  5. #include "../Resource.h"
  6. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  7. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  8. // 语言文件节名和键名
  9. #define LIN_Language TEXT("Language")
  10. #define LIN_Description TEXT("Description")
  11. #define LIN_FontName TEXT("FontName")
  12. #define LIN_FontSize TEXT("FontSize")
  13. #define LIN_Text TEXT("Text")
  14. #define LIN_String TEXT("String")
  15. #define EXT_Lng TEXT(".lng")
  16. #define _NumberOf(v) (sizeof(v) / sizeof(v[0]))
  17. #define _LengthOf(s) (_NumberOf(s) - 1)
  18. #define _StrEnd(t) (t + lstrlen(t))
  19. #ifdef _UNICODE
  20. #define _StrStr(t1, t2) wcsstr(t1, t2)
  21. #define _StrChr(t, c) wcschr(t, c)
  22. #define _StrRChr(t, c) wcsrchr(t, c)
  23. #else if // _UNICODE
  24. #define _StrStr(t1, t2) strstr(t1, t2)
  25. #define _StrChr(t, c) strchr(t, c)
  26. #define _StrRChr(t, c) strrchr(t, c)
  27. #endif // _UNICODE
  28. #define _WStrToAStrN(a, w, n) WideCharToMultiByte(CP_ACP, 0, w, -1, a, n, NULL, NULL)
  29. #define _AStrToWStrN(w, a, n) MultiByteToWideChar(CP_ACP, 0, a, -1, w, n)
  30. #ifdef _UNICODE
  31. #define _WStrToStrN(t, w, n) lstrcpyn(t, w, n)
  32. #else // _UNICODE
  33. #define _WStrToStrN(t, w, n) _WStrToAStrN(t, w, n)
  34. #endif // _UNICODE
  35. #define _WStrToStr(t, w) _WStrToStrN(t, w, _NumberOf(t))
  36. #ifndef IS_INTRESOURCE
  37. #define IS_INTRESOURCE(r) (((ULONG) (r) >> 16) == 0)
  38. #endif
  39. #ifndef CDSIZEOF_STRUCT
  40. #define CDSIZEOF_STRUCT(s, m) (((INT) ((PBYTE) (&((s *) 0)->m) - ((PBYTE) ((s *) 0)))) + sizeof(((s *) 0)->m))
  41. #endif
  42. extern HINSTANCE g_hInst;
  43. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  44. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  45. // CLanguage 类静态变量
  46. UINT CLanguage::m_uLang = IDM_View_Default;
  47. UINT CLanguage::m_uMax = IDM_View_Default;
  48. HFONT CLanguage::m_hFont = NULL;
  49. TCHAR CLanguage::m_tzText[1024] = {0};
  50. TCHAR CLanguage::m_tzFileName[MAX_PATH] = {0};
  51. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  52. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  53. // 初始化语言
  54. LANGID CLanguage::Initialize()
  55. {
  56. HANDLE hFind;
  57. LANGID liLang;
  58. LANGID liResult;
  59. WIN32_FIND_DATA fdFind;
  60. TCHAR tzPath[MAX_PATH];
  61. // 获取语言标识
  62. liResult = 0;
  63. // 下列配置文件名为临时代码,根据需要更改
  64. GetModuleFileName(NULL, tzPath, MAX_PATH);
  65. lstrcpy(tzPath + lstrlen(tzPath) - 4, TEXT(".ini"));
  66. // 从配置文件中获取语言设置
  67. liLang = GetPrivateProfileInt(TEXT("LANG"), LIN_Language, GetUserDefaultLangID(), tzPath);
  68. if (liLang)
  69. {
  70. // 查找语言文件
  71. GetModuleFileName(NULL, tzPath, MAX_PATH);
  72. lstrcpy(_StrRChr(tzPath, '\') + 1, TEXT("*") EXT_Lng);
  73. hFind = FindFirstFile(tzPath, &fdFind);
  74. if (hFind != INVALID_HANDLE_VALUE)
  75. {
  76. do
  77. {
  78. // 如果是指定的语言
  79. lstrcpy(_StrRChr(tzPath, '\') + 1, fdFind.cFileName);
  80. if (liLang == GetPrivateProfileInt(LIN_Language, LIN_Language, 0, tzPath))
  81. {
  82. // 设置语言文件名
  83. liResult = liLang;
  84. lstrcpy(m_tzFileName, tzPath);
  85. Set(NULL, liResult);
  86. break;
  87. }
  88. }
  89. while (FindNextFile(hFind, &fdFind));
  90. FindClose(hFind);
  91. }
  92. }
  93. return liResult;
  94. }
  95. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  96. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  97. // 列出语言
  98. UINT CLanguage::List(HMENU hMenu)
  99. {
  100. HANDLE hFind;
  101. LANGID liLang;
  102. LANGID liTemp;
  103. WIN32_FIND_DATA fdFind;
  104. TCHAR tzPath[MAX_PATH];
  105. // 下列配置文件名为临时代码,根据需要更改
  106. GetModuleFileName(NULL, tzPath, MAX_PATH);
  107. lstrcpy(tzPath + lstrlen(tzPath) - 4, TEXT(".ini"));
  108. // 从配置文件中获取语言设置
  109. liLang = GetPrivateProfileInt(TEXT("LANG"), LIN_Language, 0, tzPath);
  110. //liLang = CIni::GetInt(INI_Language);
  111. // 查找语言文件
  112. GetModuleFileName(NULL, tzPath, MAX_PATH);
  113. lstrcpy(_StrRChr(tzPath, '\') + 1, TEXT("*") EXT_Lng);
  114. hFind = FindFirstFile(tzPath, &fdFind);
  115. if (hFind != INVALID_HANDLE_VALUE)
  116. {
  117. do
  118. {
  119. // 获取语言标识,判断是否为有效
  120. lstrcpy(_StrRChr(tzPath, '\') + 1, fdFind.cFileName);
  121. liTemp = GetPrivateProfileInt(LIN_Language, LIN_Language, 0, tzPath);
  122. if (liTemp)
  123. {
  124. // 第一次添加,插入分隔符;大于 50 条,跳出
  125. if (m_uMax == IDM_View_Default)
  126. {
  127. AppendMenu(hMenu, MF_SEPARATOR, 0, NULL);
  128. }
  129. else if (m_uMax >= IDM_View_Default + 50)
  130. {
  131. break;
  132. }
  133. // 添加菜单项
  134. m_uMax++;
  135. fdFind.cFileName[lstrlen(fdFind.cFileName) - _LengthOf(EXT_Lng)] = 0;
  136. AppendMenu(hMenu, MF_BYCOMMAND, m_uMax, fdFind.cFileName);
  137. if (liTemp == liLang)
  138. {
  139. // 记录指定语言
  140. m_uLang = m_uMax;
  141. lstrcpy(m_tzFileName, tzPath);
  142. }
  143. }
  144. }
  145. while (FindNextFile(hFind, &fdFind));
  146. FindClose(hFind);
  147. }
  148. // 选择菜单项
  149. CheckMenuRadioItem(hMenu, IDM_View_Default, m_uMax, m_uLang, MF_BYCOMMAND); //5309 IDM_View_Default
  150. return m_uLang;
  151. }
  152. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  153. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  154. // 设置语言
  155. VOID CLanguage::Set(HMENU hMenu, UINT uLang)
  156. {
  157. // HDC hDC;
  158. LANGID liLang;
  159. // LOGFONT lfFont;
  160. TCHAR tzName[MAX_PATH];
  161. // 如果是初始化中设置语言
  162. if (hMenu == NULL)
  163. {
  164. liLang = uLang;
  165. }
  166. else
  167. {
  168. if((uLang <= IDM_View_Default) || (uLang > m_uMax))
  169. {
  170. // 切换到默认语言
  171. liLang = 0;
  172. m_tzFileName[0] = 0;
  173. m_uLang = IDM_View_Default;
  174. }
  175. else
  176. {
  177. // 切换到其它语言
  178. m_uLang = uLang;
  179. GetModuleFileName(NULL, m_tzFileName, MAX_PATH);
  180. GetMenuString(hMenu, uLang, tzName, MAX_PATH, MF_BYCOMMAND);
  181. wsprintf(_StrRChr(m_tzFileName, '\'), TEXT("\%s%s"), tzName, EXT_Lng);
  182. liLang = GetPrivateProfileInt(LIN_Language, LIN_Language, 0, m_tzFileName);
  183. }
  184. // 选择菜单项
  185. CheckMenuRadioItem(hMenu, IDM_View_Default, m_uMax, m_uLang, MF_BYCOMMAND);
  186. }
  187. // 下列配置文件名为临时代码,根据需要更改
  188. TCHAR tzPath[MAX_PATH];
  189. GetModuleFileName(NULL, tzPath, MAX_PATH);
  190. lstrcpy(tzPath + lstrlen(tzPath) - 4, TEXT(".ini"));
  191. // 保存语言标识到配置文件中
  192. wsprintf(tzName, TEXT("%d"), liLang);
  193. liLang = WritePrivateProfileString(TEXT("LANG"), LIN_Language, tzName, tzPath);
  194. //CIni::SetInt(INI_Language, liLang);
  195. // 创建字体
  196. /* Destroy();
  197. ZeroMemory(&lfFont, sizeof(LOGFONT));
  198. if (GetPrivateProfileString(LIN_Language, LIN_FontName, NULL, lfFont.lfFaceName, LF_FACESIZE, m_tzFileName))
  199. {
  200. lfFont.lfCharSet = DEFAULT_CHARSET;
  201. lfFont.lfHeight = GetPrivateProfileInt(LIN_Language, LIN_FontSize, 0, m_tzFileName);
  202. if (lfFont.lfHeight)
  203. {
  204. hDC = CreateIC(TEXT("DISPLAY"), NULL, NULL, NULL);
  205. lfFont.lfHeight = -MulDiv(lfFont.lfHeight, GetDeviceCaps(hDC, LOGPIXELSY), 72);
  206. DeleteDC(hDC);
  207. }
  208. m_hFont = CreateFontIndirect(&lfFont);
  209. }*/
  210. }
  211. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  212. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  213. // 从菜单中获取语言文件名
  214. PTSTR CLanguage::GetDescription(HMENU hMenu, UINT uLang)
  215. {
  216. TCHAR tzName[MAX_PATH];
  217. GetModuleFileName(NULL, m_tzText, MAX_PATH);
  218. GetMenuString(hMenu, uLang, tzName, MAX_PATH, MF_BYCOMMAND);
  219. wsprintf(_StrRChr(m_tzText, '\'), TEXT("\%s%s"), tzName, EXT_Lng);
  220. if (GetPrivateProfileString(LIN_Language, LIN_Description, NULL, m_tzText, _NumberOf(m_tzText), m_tzText) == 0)
  221. {
  222. TranslateString(IDM_View_FirstLang);
  223. }
  224. return m_tzText;
  225. }
  226. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  227. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  228. // 获取常规字符串
  229. CString CLanguage::TranslateText(PCTSTR ptzName, PCTSTR ptzDefault)
  230. {
  231. #ifdef _MAKELANG
  232. WritePrivateProfileString(LIN_Text, ptzName, ptzDefault, m_tzFileName);
  233. return (PTSTR) ptzDefault;
  234. #else // _MAKELANG
  235. CString str;
  236. if ((m_tzFileName[0] == 0) ||
  237. (GetPrivateProfileString(LIN_Text, ptzName, NULL, m_tzText, _NumberOf(m_tzText), m_tzFileName) == 0))
  238. {
  239. str.Format("%s", ptzDefault);
  240. }
  241. else
  242. str.Format("%s", m_tzText);
  243. return str;
  244. #endif // _MAKELANG
  245. }
  246. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  247. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  248. // 获取常规字符串,并替换特殊字符
  249. PTSTR CLanguage::TranslateTextEx(PCTSTR ptzName, PCTSTR ptzDefault)
  250. {
  251. #ifdef _MAKELANG
  252. // 判断是否有两个空字符
  253. BOOL bDoubleNull = FALSE;
  254. CopyMemory(m_tzText, ptzDefault, sizeof(m_tzText));
  255. for (UINT i = 0; i < _LengthOf(m_tzText); i++)
  256. {
  257. if ((m_tzText[i] == 0) && (m_tzText[i + 1] == 0))
  258. {
  259. bDoubleNull = TRUE;
  260. break;
  261. }
  262. }
  263. for (PTSTR p = m_tzText; ; p++)
  264. {
  265. if (*p == 'n')
  266. {
  267. *p = '~';
  268. }
  269. else if (*p == 0)
  270. {
  271. if (bDoubleNull)
  272. {
  273. *p = '`';
  274. if (*(p + 1) == 0)
  275. {
  276. break;
  277. }
  278. }
  279. else
  280. {
  281. break;
  282. }
  283. }
  284. }
  285. WritePrivateProfileString(LIN_Text, ptzName, m_tzText, m_tzFileName);
  286. return (PTSTR) ptzDefault;
  287. #else // _MAKELANG
  288. if ((m_tzFileName[0] == 0) ||
  289. (GetPrivateProfileString(LIN_Text, ptzName, NULL, m_tzText, _NumberOf(m_tzText), m_tzFileName) == 0))
  290. {
  291. return (PTSTR) ptzDefault;
  292. }
  293. for (PTSTR p = m_tzText; *p; p++)
  294. {
  295. if (*p == '~')
  296. {
  297. *p = 'n';
  298. }
  299. else if (*p == '`')
  300. {
  301. *p = 0;
  302. }
  303. }
  304. return m_tzText;
  305. #endif // _MAKELANG
  306. }
  307. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  308. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  309. // 获取资源字符串
  310. PTSTR CLanguage::TranslateString(UINT uResID)
  311. {
  312. TCHAR tzName[32];
  313. wsprintf(tzName, TEXT("%u"), uResID);
  314. #ifdef _MAKELANG
  315. LoadString(g_hInst, uResID, m_tzText, _NumberOf(m_tzText));
  316. if (m_tzText[0])
  317. {
  318. WritePrivateProfileString(LIN_String, tzName, m_tzText, m_tzFileName);
  319. }
  320. #else // _MAKELANG
  321. if ((m_tzFileName[0] == 0) ||
  322. (GetPrivateProfileString(LIN_String, tzName, NULL, m_tzText, _NumberOf(m_tzText), m_tzFileName) == 0))
  323. {
  324. if (LoadString(g_hInst, uResID, m_tzText, _NumberOf(m_tzText)) == 0)
  325. {
  326. return NULL;
  327. }
  328. }
  329. #endif // _MAKELANG
  330. return m_tzText;
  331. }
  332. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  333. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  334. // 更新菜单
  335. VOID CLanguage::TranslateMenu(HMENU hMenu, PCTSTR ptzResName)
  336. {
  337. TCHAR tzSection[32];
  338. if (m_tzFileName[0])
  339. {
  340. // 获取节名
  341. if (IS_INTRESOURCE(ptzResName))
  342. {
  343. wsprintf(tzSection, TEXT("%u"), ptzResName);
  344. }
  345. else
  346. {
  347. lstrcpy(tzSection, ptzResName);
  348. }
  349. // 从语言文件中更新菜单
  350. UpdateMenuFromLanguage(hMenu, tzSection);
  351. }
  352. else
  353. {
  354. // 从资源中更新菜单
  355. UpdateMenuFromResource(hMenu, ptzResName);
  356. }
  357. }
  358. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  359. // 更新菜单BCMenu
  360. VOID CLanguage::TranslateMenu(BCMenu * pBMenu, PCTSTR ptzResName)
  361. {
  362. TCHAR tzSection[32];
  363. if (m_tzFileName[0])
  364. {
  365. // 获取节名
  366. if (IS_INTRESOURCE(ptzResName))
  367. {
  368. wsprintf(tzSection, TEXT("%u"), ptzResName);
  369. }
  370. else
  371. {
  372. lstrcpy(tzSection, ptzResName);
  373. }
  374. // 从语言文件中更新菜单
  375. UpdateMenuFromLanguage(pBMenu, tzSection);
  376. }
  377. else
  378. {
  379. // 从资源中更新菜单
  380. // UpdateBMenuFromResource(hMenu, ptzResName);
  381. }
  382. }
  383. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  384. // 更新对话框
  385. VOID CLanguage::TranslateDialog(HWND hWnd, PCTSTR ptzResName)
  386. {
  387. TCHAR tzSection[32];
  388. if (m_tzFileName[0]) //如果语言文件存在
  389. {
  390. // 获取节名
  391. if (IS_INTRESOURCE(ptzResName))
  392. {
  393. wsprintf(tzSection, TEXT("%u"), ptzResName);
  394. }
  395. else
  396. {
  397. lstrcpy(tzSection, ptzResName);
  398. }
  399. // 修改对话框字符串
  400. UpdateDialogFromLanguage(hWnd, tzSection);
  401. #ifndef _TRANSRECUR
  402. // 枚举并修改子窗口字符串
  403. EnumChildWindows(hWnd, (WNDENUMPROC) UpdateDialogFromLanguage, (LPARAM) tzSection);
  404. #endif // _TRANSRECUR
  405. }
  406. else
  407. {
  408. // UpdateDialogFromResource(hWnd, ptzResName);
  409. }
  410. }
  411. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  412. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  413. // 设置菜单字符串
  414. BOOL CLanguage::SetMenuString(HMENU hMenu, UINT uItemID, PCTSTR ptzString, BOOL bByPosition)
  415. {
  416. MENUITEMINFO miiItem;
  417. miiItem.cbSize = CDSIZEOF_STRUCT(MENUITEMINFO, cch);
  418. #if (_WINVER >= 0x0410)
  419. miiItem.fMask = MIIM_STRING;
  420. #else (_WINVER >= 0x0410)
  421. miiItem.fMask = MIIM_TYPE;
  422. miiItem.cch = 0;
  423. miiItem.dwTypeData = NULL;
  424. GetMenuItemInfo(hMenu, uItemID, bByPosition, &miiItem);
  425. #endif (_WINVER >= 0x0410)
  426. miiItem.dwTypeData = (PTSTR) ptzString;
  427. return SetMenuItemInfo(hMenu, uItemID, bByPosition, &miiItem);
  428. }
  429. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  430. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  431. // 从语言文件中更新菜单
  432. VOID CLanguage::UpdateMenuFromLanguage(HMENU hMenu, PCTSTR ptzSection, PCTSTR ptzPath)
  433. {
  434. INT i;
  435. INT iNum;
  436. TCHAR tzName[256];
  437. TCHAR tzText[1024];
  438. MENUITEMINFO miiItem;
  439. // 初始化变量,获取菜单项数量
  440. miiItem.cbSize = CDSIZEOF_STRUCT(MENUITEMINFO, cch);
  441. miiItem.fMask = MIIM_SUBMENU | MIIM_ID;
  442. iNum = GetMenuItemCount(hMenu);
  443. for (i = 0; i < iNum; i++)
  444. {
  445. // 获取弹出菜单句柄和标识
  446. GetMenuItemInfo(hMenu, i, TRUE, &miiItem);
  447. if (miiItem.wID)
  448. {
  449. // 获取菜单标识文本
  450. if (miiItem.hSubMenu)
  451. {
  452. /*_Assert(ptzPath);
  453. _Assert(lstrlen(ptzPath) < _NumberOf(tzName) - 16);*/
  454. wsprintf(tzName, TEXT("%s|%u"), ptzPath, i);
  455. }
  456. else
  457. {
  458. wsprintf(tzName, TEXT("%u"), miiItem.wID);
  459. }
  460. #ifdef _MAKELANG
  461. // 生成语言文件,递归修改菜单字符串
  462. if ((miiItem.wID <= IDM_View_Default) || (miiItem.wID >= IDM_View_Default + 50) &&
  463. (miiItem.wID <= IDM_File_Recent) || (miiItem.wID >= IDM_File_Recent + 50))
  464. {
  465. GetMenuString(hMenu, i, tzText, _NumberOf(tzText), MF_BYPOSITION);
  466. WritePrivateProfileString(ptzSection, tzName, tzText, m_tzFileName);
  467. }
  468. #else // _MAKELANG
  469. // 设置菜单字符串
  470. if (GetPrivateProfileString(ptzSection, tzName, NULL, tzText, _NumberOf(tzText), m_tzFileName))
  471. {
  472. SetMenuString(hMenu, i, tzText, TRUE);
  473. }
  474. #endif // _MAKELANG
  475. // 递归修改菜单字符串
  476. if (miiItem.hSubMenu)
  477. {
  478. UpdateMenuFromLanguage(miiItem.hSubMenu, ptzSection, tzName);
  479. }
  480. }
  481. }
  482. }
  483. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  484. // 从语言文件中更新菜单
  485. VOID CLanguage::UpdateMenuFromLanguage(BCMenu * pBMenu, PCTSTR ptzSection, PCTSTR ptzPath)
  486. {
  487. //得到子菜單
  488. CMenu * pTempMenu = pBMenu->GetSubMenu(0);
  489. if (pTempMenu)
  490. {
  491. UINT uNum = pTempMenu->GetMenuItemCount();
  492. for(int i = 0; i < uNum; i++)
  493. {
  494. UINT uMenuID = pTempMenu->GetMenuItemID(i);
  495. CString strName;
  496. strName.Format("%u", uMenuID);
  497. TCHAR tzText[1024];
  498. if (GetPrivateProfileString(ptzSection, strName, NULL, tzText, _NumberOf(tzText), m_tzFileName))
  499. {
  500. pBMenu->ModifyODMenu(tzText, uMenuID);
  501. }
  502. }
  503. }
  504. }////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  505. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  506. // 从资源中更新菜单
  507. VOID CLanguage::UpdateMenuFromResource(HMENU hMenu, PCTSTR ptzResName)
  508. {
  509. PBYTE p;
  510. PBYTE pbEnd;
  511. BOOL bMenuEx;
  512. WORD wOptions;
  513. DWORD dwMenuID;
  514. HRSRC hResource;
  515. HGLOBAL hGlobal;
  516. TCHAR tzText[1024];
  517. // 菜单层次堆栈,用于更新弹出菜单字符串
  518. INT i = 0; // 层次
  519. INT iPos[32] = {0}; // 位置
  520. BOOL bHilite[32] = {FALSE}; // 回退
  521. HMENU hMenus[32] = {hMenu}; // 句柄
  522. // 载入资源
  523. hResource = FindResource(g_hInst, ptzResName, RT_MENU);
  524. if(!hResource)
  525. return;
  526. //_Assert(hResource);
  527. hGlobal = LoadResource(g_hInst, hResource);
  528. if(!hGlobal)
  529. return;
  530. //_Assert(hGlobal);
  531. // 获取资源的起始地址、终止地址和版本
  532. p = (PBYTE) LockResource(hGlobal);
  533. pbEnd = p + SizeofResource(g_hInst, hResource);
  534. bMenuEx = ((PMENUITEMTEMPLATEHEADER) p)->versionNumber;
  535. // 转到菜单项数据
  536. p += ((PMENUITEMTEMPLATEHEADER) p)->offset + sizeof(MENUITEMTEMPLATEHEADER);
  537. if (bMenuEx)
  538. {
  539. p += sizeof(DWORD);
  540. }
  541. // 更新菜单
  542. while (p < pbEnd)
  543. {
  544. // 获取菜单项标识、参数
  545. if (bMenuEx)
  546. {
  547. p += 3 * sizeof(DWORD);
  548. dwMenuID =  *((PDWORD) p);
  549. p += sizeof(DWORD) + sizeof(WORD);
  550. }
  551. else
  552. {
  553. wOptions = *((PWORD) p);
  554. p += sizeof(WORD);
  555. if ((wOptions & MF_POPUP) == FALSE)
  556. {
  557. dwMenuID = *((PWORD) p);
  558. p += sizeof(WORD);
  559. }
  560. }
  561. // 获取菜单项文本,转到下一个菜单项
  562. for (_WStrToStr(tzText, (PWSTR) p); *((PWSTR) p); p += sizeof(WCHAR));
  563. p += sizeof(WCHAR);
  564. if (bMenuEx)
  565. {
  566. // 根据命令标识设置菜单文本
  567. SetMenuString(hMenu, dwMenuID, tzText);
  568. }
  569. else
  570. {
  571. // 如果是弹出菜单项
  572. //_Assert(i < _NumberOf(iPos));
  573. iPos[i]++;
  574. if (wOptions & MF_POPUP)
  575. {
  576. // 根据位置设置菜单文本
  577. SetMenuString(hMenus[i], iPos[i] - 1, tzText, TRUE);
  578. // 获取下一级菜单,并把相关数据压入堆栈
  579. bHilite[i] = wOptions & MF_HILITE;
  580. hMenus[i + 1] = GetSubMenu(hMenus[i], iPos[i] - 1);
  581. i++;
  582. iPos[i] = 0;
  583. //_Assert(hMenus[i]);
  584. }
  585. else
  586. {
  587. // 根据命令标识设置菜单文本
  588. SetMenuString(hMenu, dwMenuID, tzText);
  589. if (wOptions & MF_HILITE)
  590. {
  591. // 弹出堆栈,如果已经完成则退出
  592. for (i--; (i >= 0) && bHilite[i]; i--);
  593. if (i < 0)
  594. {
  595. break;
  596. }
  597. }
  598. }
  599. }
  600. }
  601. FreeResource(hGlobal);
  602. }
  603. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  604. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  605. // 从语言文件中更新对话框
  606. BOOL CALLBACK CLanguage::UpdateDialogFromLanguage(HWND hWnd, PCTSTR ptzSection)
  607. {
  608. TCHAR tzText[1024];
  609. TCHAR tzName[MAX_PATH];
  610. // 获取窗口标识字符串
  611. wsprintf(tzName, TEXT("%u"), GetDlgCtrlID(hWnd));
  612. // 设置窗口标题
  613. #ifdef _MAKELANG
  614. GetWindowText(hWnd, tzText, _NumberOf(tzText));
  615. if (tzText[0] && ((tzText[0] < '0') || (tzText[0] > '9')))
  616. {
  617. WritePrivateProfileString(ptzSection, tzName, tzText, m_tzFileName);
  618. }
  619. #else // _MAKELANG
  620. if (GetPrivateProfileString(ptzSection, tzName, NULL, tzText, _NumberOf(tzText), m_tzFileName))
  621. {
  622. SetWindowText(hWnd, tzText);
  623. }
  624. #endif // _MAKELANG
  625. #ifdef _TRANSRECUR
  626. // 枚举并修改子窗口字符串
  627. EnumChildWindows(hWnd, (WNDENUMPROC) UpdateDialogFromLanguage, (LPARAM) ptzSection);
  628. #endif // _TRANSRECUR
  629. if (m_hFont)
  630. {
  631. SendMessage(hWnd, WM_SETFONT, (WPARAM) m_hFont, FALSE);
  632. }
  633. return TRUE;
  634. }
  635. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  636. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  637. // 从资源中更新对话框
  638. VOID CLanguage::UpdateDialogFromResource(HWND hWnd, PCTSTR ptzResName)
  639. {
  640. /* PBYTE p;
  641. PBYTE pbEnd;
  642. BOOL bMenuEx;
  643. WORD wOptions;
  644. DWORD dwMenuID;
  645. HRSRC hResource;
  646. HGLOBAL hGlobal;
  647. TCHAR tzText[1024];
  648. CRes m_Res(g_hInst);
  649. res.FindResource(IDD_PROPPAGE_CAINI, RT_DIALOG);
  650. res.LoadAllResource();
  651. if (!m_Res.FindResource (IDD_PROPPAGE_CAINI, RT_DIALOG))
  652.         return ;
  653.     if (!m_Res.LoadResource ())
  654.         return ;
  655. m_Res.LoadAllResource ();
  656. int n = m_Res.m_Infos.GetSize ();
  657.     for ( int i =0 ;i< n ;i++)
  658.     {
  659.  __ResInfo rest = m_Res.m_Infos.GetAt(i);
  660.     }
  661. // 载入资源
  662. hResource = FindResource(g_hInst,);
  663. if(!hResource)
  664. return;
  665. //_Assert(hResource);
  666. hGlobal = LoadResource(g_hInst, hResource);
  667. if(!hGlobal)
  668. return;
  669. //_Assert(hGlobal);
  670. // 获取资源的起始地址、终止地址和版本
  671. p = (PBYTE) LockResource(hGlobal);
  672. pbEnd = p + SizeofResource(g_hInst, hResource);
  673. bMenuEx = ((PMENUITEMTEMPLATEHEADER) p)->versionNumber;
  674. // 转到菜单项数据
  675. p += ((PMENUITEMTEMPLATEHEADER) p)->offset + sizeof(MENUITEMTEMPLATEHEADER);
  676. if (bMenuEx)
  677. {
  678. p += sizeof(DWORD);
  679. }
  680. // 更新菜单
  681. while (p < pbEnd)
  682. {
  683. // 获取菜单项标识、参数
  684. if (bMenuEx)
  685. {
  686. p += 3 * sizeof(DWORD);
  687. dwMenuID =  *((PDWORD) p);
  688. p += sizeof(DWORD) + sizeof(WORD);
  689. }
  690. else
  691. {
  692. wOptions = *((PWORD) p);
  693. p += sizeof(WORD);
  694. if ((wOptions & MF_POPUP) == FALSE)
  695. {
  696. dwMenuID = *((PWORD) p);
  697. p += sizeof(WORD);
  698. }
  699. }
  700. // 获取菜单项文本,转到下一个菜单项
  701. for (_WStrToStr(tzText, (PWSTR) p); *((PWSTR) p); p += sizeof(WCHAR));
  702. p += sizeof(WCHAR);
  703. if (bMenuEx)
  704. {
  705. // 根据命令标识设置菜单文本
  706. SetMenuString(hMenu, dwMenuID, tzText);
  707. }
  708. else
  709. {
  710. // 如果是弹出菜单项
  711. //_Assert(i < _NumberOf(iPos));
  712. iPos[i]++;
  713. if (wOptions & MF_POPUP)
  714. {
  715. // 根据位置设置菜单文本
  716. SetMenuString(hMenus[i], iPos[i] - 1, tzText, TRUE);
  717. // 获取下一级菜单,并把相关数据压入堆栈
  718. bHilite[i] = wOptions & MF_HILITE;
  719. hMenus[i + 1] = GetSubMenu(hMenus[i], iPos[i] - 1);
  720. i++;
  721. iPos[i] = 0;
  722. //_Assert(hMenus[i]);
  723. }
  724. else
  725. {
  726. // 根据命令标识设置菜单文本
  727. SetMenuString(hMenu, dwMenuID, tzText);
  728. if (wOptions & MF_HILITE)
  729. {
  730. // 弹出堆栈,如果已经完成则退出
  731. for (i--; (i >= 0) && bHilite[i]; i--);
  732. if (i < 0)
  733. {
  734. break;
  735. }
  736. }
  737. }
  738. }
  739. }
  740. */
  741. // FreeResource(hGlobal);
  742. }
  743. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////