我做个几个语言包的dll,我的程序模式在2010下编写的。
用下面的代码替换语言包
  if (NULL != m_hRes)
  {
  ::AfxFreeLibrary(m_hRes);
  }  m_hRes = ::AfxLoadLibrary(_T("TK_CHN.dll"));
  if(m_hRes)
  {
  ::AfxSetResourceHandle(m_hRes);
  LoadMenu();
  }
void CMainFrame::LoadMenu()

  if(NULL != m_pmenu)
  {
  delete m_pmenu;
  }
    
  m_pmenu = new CMenu();
  m_pmenu->LoadMenu(IDR_MAINFRAME);
  m_wndMenuBar.CreateFromMenu(m_pmenu->GetSafeHmenu(), TRUE, TRUE);
}可以替换成功,但当我打开一个子窗体时,菜单栏会变回以前的语言,因为我的子窗体在创建时已经和开始的菜单关联上了
  m_pTempPic = new CMultiDocTemplate(IDR_MAINFRAME,
  RUNTIME_CLASS(CTKToolBoxDoc),
  RUNTIME_CLASS(CPictureFrame), // 自定义 MDI 子框架
  RUNTIME_CLASS(CPictureView));
  if (!m_pTempPic)
  return FALSE;
  AddDocTemplate(m_pTempPic);这个该怎么解决呢?或者2010下怎么实现替换语言包呢?谢谢!

解决方案 »

  1.   


    期待高手!我总结点我的想法:
    1. VS2010与VC6.0的菜单继承类不是同一个
    2. VS2010菜单项被保存在注册表里面
    3. 修改菜单代码只能修改当前的界面,当弹出子窗体时,由于已经关联了菜单,菜单还原了 
        修改代码:
            CMenu *pMenu = CMenu::FromHandle(m_wndMenuBar.GetHMenu());
            CString strConnectTitle = _T("连接:");
            pMenu->ModifyMenu(ID_CON_CONNECT, MF_BYCOMMAND, ID_CON_CONNECT, strConnectTitle);
            m_wndMenuBar.CreateFromMenu(pMenu->GetSafeHmenu(), TRUE, TRUE);
    4. 以上三个方面导致替换语言包出现错误。我感觉实质还是如何修改一个菜单的文字,使其在程序始终都保持一直,像VC6.0那样。我试过在
    int CTKToolBoxApp::ExitInstance()
    {
    //TODO: 处理可能已添加的附加资源
    AfxOleTerm(FALSE);
            this->CleanState();
           return CWinAppEx::ExitInstance();
    }添加红色的使其在关闭时不保存到注册表里面,但还是有上面现象。
    希望大家看到能发表一下,共同学习2010新特性。谢谢!
      

  2.   

    把不同语言的所有资源放到DLL中,要哪个就先LoadLibrary,然后AfxSetResourceHandle
      

  3.   


    我是在程序中动态转换    用的是2010,程序代码已经Load了,没有实现我的效果
      

  4.   

    这就是动态转换,在菜单项响应函数中实现,菜单需要重新SetMenu
      

  5.   

    2010中菜单是CMFCMenuBar类  
      

  6.   

    不过我放弃使用CMFCMenuBar类,因为不会操作里面的子项.
      

  7.   

    qiuxin425
    我和你问题有点类似,不知如何解决,vs2010在菜单 这一块好像知道的人不多,问不出结果。不知你如何解决的给你说一下啊。
      

  8.   

    看看QString
    http://hi.baidu.com/xiaole10368/item/01e26494c1f9f4db1a49df41
      

  9.   

    int CTKToolBoxApp::ExitInstance()
    {
    //TODO: 处理可能已添加的附加资源
    AfxOleTerm(FALSE);
            this->CleanState(); 
           return CWinAppEx::ExitInstance();
    }这种方法就可以,删掉以前的注册表。