进入旧版 | 服务项目 | 成功案例 | 联系方式 | 过客留言 | 友情链接
   
设为首页
加入收藏
联系我们
网站首页 | 新闻资讯 | 操作系统 | 办公软件 | 网络软件 | 工具软件 | 媒体动画 | 网页制作 | 网站开发 | 程序开发 | 平面设计
Photoshop视频教程 | Word入门 | Flash入门 | JScript | VBScript | ASP | PHP | ADO | 网页特效 | 3DS MAX6.0命令 | 系统进程
您当前的位置:GOODSGY电脑学习网 -> 程序开发 -> C/C++ -> 文章内容  
资源DLL与语言选择菜单的实现

www.goodsgy.com

  以下是源代码: www.goodsgy.com

以下是引用片段:
LanguageSupport.h
  #pragma once
  #include 
  #define ID_LANGUAGE_FIRST 0x6F00
  #define ID_LANGUAGE_LAST 0x6FFF
  class CLanguageSupport
  {
  public:
  CLanguageSupport();
  ~CLanguageSupport();
  void CreateMenu(CCmdUI *pCmdUI, UINT nFirstItemId= ID_LANGUAGE_FIRST);
  void OnSwitchLanguage(UINT nId, bool bLoadNewLanguageImmediately= false);
  void LoadBestLanguage();
  protected:
  CWordArray m_aLanguages;
  LANGID m_nExeLanguage;
  LANGID m_nCurrentLanguage;
  HINSTANCE m_hDll;
  static const TCHAR szLanguageId[];
  static LANGID GetLangIdFromFile(LPCTSTR pszFilename);
  static CString GetLanguageName(LANGID wLangId);
  static LANGID GetUserUILanguage();
  static LANGID GetSystemUILanguage();
  void GetAvailableLanguages();
  bool LoadLanguage();
  bool LoadLanguageDll();
  void LookupExeLanguage();
  void UnloadResourceDll();
  static void SetResourceHandle(HINSTANCE hDll);
  };
  LanguageSupport.cpp
  #include "stdafx.h"
  #include "resource.h"
  #include "LanguageSupport.h"
  #include 
  #ifdef _DEBUG
  #define new DEBUG_NEW
  #undef THIS_FILE
  static char THIS_FILE[] = __FILE__;
  #endif
  #pragma comment(lib, "shlwapi.lib")
  #pragma comment(lib, "version.lib")
  const TCHAR CLanguageSupport::szLanguageId[]=_T("LanguageId");
  #ifndef countof
  #define countof(x) (sizeof(x)/sizeof((x)[0]))
  #endif
  void CLanguageSupport::LoadBestLanguage()
  {
  ASSERT(AfxGetApp()->m_pszRegistryKey!=NULL && AfxGetApp()->m_pszRegistryKey[0]!=0);
  m_nCurrentLanguage=(LANGID)AfxGetApp()->GetProfileInt(_T(""),szLanguageId,0);
  if (LoadLanguage())
  return;
  m_nCurrentLanguage= GetUserUILanguage();
  if (LoadLanguage())
  return;
  m_nCurrentLanguage= GetSystemUILanguage();
  if (LoadLanguage())
  return;
  m_nCurrentLanguage= GetUserDefaultLangID();
  if (LoadLanguage())
  return;
  m_nCurrentLanguage= GetSystemDefaultLangID();
  if (LoadLanguage())
  return;
  m_nCurrentLanguage= m_nExeLanguage;
  VERIFY(LoadLanguage());
  }
  bool CLanguageSupport::LoadLanguage()
  {
  if (m_nCurrentLanguage==0)
  return false;
  if (LoadLanguageDll())
  return true;
  WORD wSubLanguage= SUBLANGID(m_nCurrentLanguage);
  if (wSubLanguage!=SUBLANG_NEUTRAL)
  {
  m_nCurrentLanguage= MAKELANGID( PRIMARYLANGID(m_nCurrentLanguage), SUBLANG_NEUTRAL );
  if (LoadLanguageDll())
  return true;
  }
  if (wSubLanguage!=SUBLANG_DEFAULT)
  {
  m_nCurrentLanguage= MAKELANGID( PRIMARYLANGID(m_nCurrentLanguage), SUBLANG_DEFAULT );
  if (LoadLanguageDll())
  return true;
  }
  return false;
  }
  typedef LANGID (WINAPI*PFNGETUSERDEFAULTUILANGUAGE)();
  typedef LANGID (WINAPI*PFNGETSYSTEMDEFAULTUILANGUAGE)();
  #if _MFC_VER<0x0700 // for VC6 users. Depending on your version of the platform SDK, you may need these lines or not.
  typedef LPARAM LONG_PTR;
  #endif
  static BOOL CALLBACK _EnumResLangProc(HMODULE /*hModule*/, LPCTSTR /*pszType*/,
  LPCTSTR /*pszName*/, WORD langid, LONG_PTR lParam)
  { // Helper used to identify the language in NTDLL.DLL (used for NT4)
  if(lParam == NULL) // lParam = ptr to var that receives the LangId
  return FALSE;
  LANGID* plangid = reinterpret_cast< LANGID* >( lParam );
  *plangid = langid;
  return TRUE;
  }
  LANGID CLanguageSupport::GetUserUILanguage()
  {
  HINSTANCE hKernel32= ::GetModuleHandle(_T("kernel32.dll"));
  ASSERT(hKernel32 != NULL);
  PFNGETUSERDEFAULTUILANGUAGE pfnGetUserDefaultUILanguage =
  (PFNGETUSERDEFAULTUILANGUAGE)::GetProcAddress(hKernel32, "GetUserDefaultUILanguage"); // NB: GetProcAddress() takes an ANSI string
  if(pfnGetUserDefaultUILanguage != NULL)
  {
  return pfnGetUserDefaultUILanguage();
  }
  else
  {
  return 0;
  }
  }
  LANGID CLanguageSupport::GetSystemUILanguage()
  {
  HINSTANCE hKernel32= ::GetModuleHandle(_T("kernel32.dll"));
  ASSERT(hKernel32 != NULL);
  PFNGETSYSTEMDEFAULTUILANGUAGE pfnGetSystemDefaultUILanguage =
  (PFNGETSYSTEMDEFAULTUILANGUAGE)::GetProcAddress(hKernel32, "GetSystemDefaultUILanguage"); // NB: GetProcAddress() takes an ANSI string
  if(pfnGetSystemDefaultUILanguage != NULL)
  {
  return pfnGetSystemDefaultUILanguage();
  }
  else
  {
  if (::GetVersion()&0x80000000)
  {
  DWORD dwLangID= 0; // Assume error
  HKEY hKey = NULL;
  LONG nResult = ::RegOpenKeyEx(HKEY_CURRENT_USER,
  _T( "Control Panel\\Desktop\\ResourceLocale" ), 0, KEY_READ, &hKey);
  if (nResult == ERROR_SUCCESS)
  {
  DWORD dwType;
  TCHAR szValue[16];
  ULONG nBytes = sizeof( szValue );
  nResult = ::RegQueryValueEx(hKey, NULL, NULL, &dwType, LPBYTE( szValue ), &nBytes );
  if (nResult==ERROR_SUCCESS && dwType==REG_SZ)
  _stscanf( szValue, _T( "%x" ), &dwLangID );
  ::RegCloseKey(hKey);
  }
  return (LANGID)dwLangID;
  }
  else
  {
  LANGID LangId = 0;
  HMODULE hNTDLL = ::GetModuleHandle( _T( "ntdll.dll" ) );
  if (hNTDLL != NULL)
  {
  ::EnumResourceLanguages( hNTDLL, RT_VERSION, MAKEINTRESOURCE( 1 ),
  _EnumResLangProc, reinterpret_cast< LONG_PTR >( &LangId ) );
  }
  return LangId;
  }
  }
  }
  bool CLanguageSupport::LoadLanguageDll()
  {
  if (m_nCurrentLanguage==m_nExeLanguage)
  {
  TRACE0("Resource DLL is... the EXE.\n");
  UnloadResourceDll();
  return true;
  }
  TCHAR szAbbrevName[4];
  if (GetLocaleInfo(MAKELCID(m_nCurrentLanguage, SORT_DEFAULT), LOCALE_SABBREVLANGNAME, szAbbrevName, 4)==0)
  {
  TRACE1("Attempt to load DLL for unsupported language. Language = %u\n", m_nCurrentLanguage);
  return false;
  }
  TCHAR szFilename[MAX_PATH];
  DWORD cch= GetModuleFileName( NULL, szFilename, MAX_PATH);
  ASSERT(cch!=0);
  LPTSTR pszExtension= PathFindExtension(szFilename);
  lstrcpy(pszExtension, szAbbrevName);
  lstrcat(pszExtension, _T(".dll"));
  HINSTANCE hDll = LoadLibrary(szFilename);
  if (hDll != NULL)
  {
  TRACE1("Resource DLL %s loaded successfully\n",szFilename);
  UnloadResourceDll();
  m_hDll= hDll;
  SetResourceHandle(m_hDll);
  return true;
  }
  else
  return false;
  }
  CLanguageSupport::CLanguageSupport()
  {
  m_hDll= NULL;
  m_nCurrentLanguage= 0;
  LookupExeLanguage();
  }
  CLanguageSupport::~CLanguageSupport()
  {
  UnloadResourceDll();
  }
  void CLanguageSupport::UnloadResourceDll()
  {
  if (m_hDll!=NULL)
  {
  SetResourceHandle(AfxGetApp()->m_hInstance); FreeLibrary(m_hDll);
  m_hDll= NULL;
  }
  }
  void CLanguageSupport::SetResourceHandle(HINSTANCE hDll)
  {
  AfxSetResourceHandle(hDll);
  #if _MFC_VER>=0x0700
  _AtlBaseModule.SetResourceInstance(hDll);
  #endif
  }
  LANGID CLanguageSupport::GetLangIdFromFile(LPCTSTR pszFilename)
  {
  DWORD dwHandle;
  DWORD dwLength=GetFileVersionInfoSize((LPTSTR)pszFilename,&dwHandle);
  if (dwLength==0)
  {
  TRACE(_T("Failed to read file's version info. Error= %1!u!\n"), GetLastError());
  return 0;
  }
  LANGID nLangId=0;
  CByteArray abData;
  abData.SetSize(dwLength);
  if (GetFileVersionInfo((LPTSTR)pszFilename,dwHandle,dwLength,(LPVOID)abData.GetData()))
  {
  LANGID *pLanguageId; // NB: LANGID = WORD
  if (VerQueryValue(abData.GetData(),_T("\\VarFileInfo\\Translation"),(void**)&pLanguageId,(PUINT)&dwLength))
  nLangId=*pLanguageId;
  }
  return nLangId;
  }
  void CLanguageSupport::OnSwitchLanguage(UINT nId, bool bLoadNewLanguageImmediately)
  {
  int nLanguageIndex= nId-ID_LANGUAGE_FIRST;
  if (nLanguageIndex<0 || nLanguageIndex>=m_aLanguages.GetSize())
  return;
  LANGID LangId= m_aLanguages[nLanguageIndex];
  AfxGetApp()->WriteProfileInt(_T(""),szLanguageId,(int)LangId);
  if (bLoadNewLanguageImmediately)
  {
  LoadBestLanguage();
  }
  else
  {
  LANGID nCurrentLanguage= m_nCurrentLanguage;
  m_nCurrentLanguage= LangId;
  VERIFY(LoadLanguage());
  CString csFormat(MAKEINTRESOURCE(IDS_RESTART)); // Don't forget to add a string in the String Table :
  m_nCurrentLanguage= nCurrentLanguage;
  VERIFY(LoadLanguage());
  CString csMessage;
  csMessage.FormatMessage(csFormat, LPCTSTR(AfxGetAppName())); // IDS_RESTART : Please restart %1.
  AfxMessageBox(csMessage,MB_ICONINFORMATION); // Please restart MyApp.
  }
  }
  void CLanguageSupport::GetAvailableLanguages()
  {
  m_aLanguages.SetSize(0);
  if (m_nExeLanguage!=0)
  m_aLanguages.Add(m_nExeLanguage);
  TCHAR szFileMask[MAX_PATH+10];
  DWORD cch= GetModuleFileName( NULL, szFileMask, MAX_PATH);
  ASSERT(cch!=0);
  LPTSTR pszExtension= PathFindExtension(szFileMask);
  lstrcpy(pszExtension, _T("???.dll"));
  CFileFind finder;
  BOOL bWorking = finder.FindFile(szFileMask);
  while (bWorking)
  {
  bWorking = finder.FindNextFile();
  LANGID nLanguageID=GetLangIdFromFile(finder.GetFilePath());
  if (nLanguageID!=0)
  m_aLanguages.Add(nLanguageID);
  }
  }
  void CLanguageSupport::CreateMenu(CCmdUI *pCmdUI, UINT nFirstItemId)
  {
  GetAvailableLanguages();
  UINT nCurrentItem= 0;
  CMenu SubMenu;
  SubMenu.CreatePopupMenu();
  for (int i=0; i 
  {
  SubMenu.AppendMenu(MF_STRING, ID_LANGUAGE_FIRST+i, GetLanguageName(m_aLanguages[i]) );
  if (m_nCurrentLanguage==m_aLanguages[i])
  nCurrentItem= ID_LANGUAGE_FIRST+i;
  }
  if (nCurrentItem!=0)
  SubMenu.CheckMenuRadioItem(ID_LANGUAGE_FIRST, ID_LANGUAGE_FIRST+(int)m_aLanguages.GetSize()-1, nCurrentItem, MF_BYCOMMAND);
  MENUITEMINFO mii= { sizeof(mii) };
  mii.fMask= MIIM_SUBMENU;
  mii.hSubMenu= SubMenu.m_hMenu;
  ::SetMenuItemInfo(pCmdUI->m_pMenu->m_hMenu, pCmdUI->m_nID, FALSE, &mii);
  pCmdUI->Enable();
  SubMenu.Detach();
  }
  CString CLanguageSupport::GetLanguageName(LANGID wLangId)
  {
  TCHAR szLanguage[200], szCP[10];
  GetLocaleInfo( MAKELCID(wLangId, SORT_DEFAULT), LOCALE_IDEFAULTANSICODEPAGE, szCP, 10);
  int nAnsiCodePage= _ttoi(szCP);
  int cch= GetLocaleInfo( MAKELCID(wLangId, SORT_DEFAULT), LOCALE_SNATIVELANGNAME, szLanguage, countof(szLanguage));
  if (cch!=0)
  {
  #ifndef UNICODE
  wchar_t szLanguageW[200];
  cch= MultiByteToWideChar(nAnsiCodePage, MB_ERR_INVALID_CHARS, szLanguage, -1, szLanguageW, countof(szLanguageW));
  BOOL bUsed= FALSE;
  cch= WideCharToMultiByte(CP_ACP, 0, szLanguageW, -1, szLanguage, countof(szLanguage), "X", &bUsed);
  if (bUsed || nAnsiCodePage==0)
  {
  cch= 0;
  }
  #endif
  }
  if (cch==0)
  {
  cch= GetLocaleInfo( MAKELCID(wLangId, SORT_DEFAULT), LOCALE_SLANGUAGE, szLanguage, countof(szLanguage));
  if (cch==0)
  _stprintf(szLanguage, _T("%u - ???"), wLangId); // Ouch ! We can't even display the name in the current language !
  }
  return szLanguage;
  }
  void CLanguageSupport::LookupExeLanguage()
  {
  TCHAR szFilename[MAX_PATH]={0};
  DWORD cch= GetModuleFileName( NULL, szFilename, MAX_PATH);
  ASSERT(cch!=0);
  m_nExeLanguage= GetLangIdFromFile(szFilename);
  }
www.goodsgy.com

上一页  [1] [2] [3] 

在百度中搜索:资源DLL与语言选择菜单的实现
在Google中搜索:资源DLL与语言选择菜单的实现
在Yahoo中搜索:资源DLL与语言选择菜单的实现

收藏到网摘:新浪VIVI 365key 我摘 POCO网摘 博采中心 YouNote 和讯网摘 天天收藏
[] [返回上一页] [打 印] [收 藏]

 相关文章    最新文章
· 警惕网页黑手导致浏览器资源占用飚高
· 浏览器资源占用高 网页中谁在作怪
· 教你快速释放Windows系统资源的小绝招
· [图文] 中国电骡VeryCD版eMule 免费资源下..
· [组图] 找出迅雷专用免费资源的真实下载地..
· [图文] Vista“资源管理器停止工作”怎么办..
· [图文] 进程管理 优化你的系统资源占用
· flash制作过程中避免占用CPU资源过度的几..
· [组图] POPO新版网络资源功能再强化
· Windows 2003共享资源拒绝访问修复实录
 
· SOA与数据挖掘在税收系统的应用
· 微软架构师谈编程语言发展之二
· 微软架构师谈编程语言发展之一
· 浅谈C++/CLI中引用类型的栈对象
· [图文] 资源DLL与语言选择菜单的实现
· [图文] 用VSTS代码验证工具捕捉C/C++错误
· C/C++:如何在程序中加载JPG图片?
· 嵌入式系统中文输入法的设计
· 内存调试技巧:C 语言最大难点揭秘
· C程序实现汉字内码与GB码

∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
站内搜索

精彩图文
  网站导航  
操作系统 办公软件 网络软件
Vista Windows2003 WindowsXP Windows2000/NT Windows9X/ME Linux 其他 Word Excel Powerpoint Outlook 金山系列 其他 网页浏览 上传下载 联络聊天 邮件工具 服务器软件 网络辅助
工具软件 媒体动画 网页制作
系统工具 媒体工具 压缩工具 图文处理 文件管理 其他 3DMAX Authorware Director Maya 视频处理 其他 Flash Dreamweaver FireWorks FrontPage LiveMotion Golive HTML/CSS 其它
网站开发 平面设计 程序设计
ASP JSP PHP CGI JavaScript VBScript XML/SOAP Web服务器 Photoshop PhotoImpact CorelDraw Illustrator Freehand 设计欣赏 其他 VB VC .NET C/C++ DELPHI JAVA

冀ICP备05019428号
Copyright © 2004-2008 电脑学习网 Inc.All rights reserved.
TEL:13832340607
QQ:39873155
E_Mail:goodsgy(#)hotmail.com   (把(#)替换成@)
MSN:goodsgy(#)hotmail.com   (把(#)替换成@)