VS2010下怎样编写支持多国语言的程序?

qiuxin425 2011-02-14 09:10:01
我做个几个语言包的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下怎么实现替换语言包呢?谢谢!
...全文
774 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
u010690936 2013-05-17
  • 打赏
  • 举报
回复
int CTKToolBoxApp::ExitInstance() { //TODO: 处理可能已添加的附加资源 AfxOleTerm(FALSE); this->CleanState(); return CWinAppEx::ExitInstance(); } 这种方法就可以,删掉以前的注册表。
wilsonwangzengxin 2012-07-08
  • 打赏
  • 举报
回复
看看QString
http://hi.baidu.com/xiaole10368/item/01e26494c1f9f4db1a49df41
LZNJ06 2011-06-30
  • 打赏
  • 举报
回复
qiuxin425
我和你问题有点类似,不知如何解决,vs2010在菜单 这一块好像知道的人不多,问不出结果。不知你如何解决的给你说一下啊。
qiuxin425 2011-02-14
  • 打赏
  • 举报
回复

期待高手!

我总结点我的想法:
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新特性。谢谢!
beyonld 2011-02-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 qiuxin425 的回复:]

引用 7 楼 beyonld 的回复:
。。我用的是2008,2010具体我就不清楚了

你的菜单是集成的 哪个类?
[/Quote]
用CMenu
lin152 2011-02-14
  • 打赏
  • 举报
回复
不过我放弃使用CMFCMenuBar类,因为不会操作里面的子项.
lin152 2011-02-14
  • 打赏
  • 举报
回复
我现在的 做法是:不同语言用相关的语言XML文档保存字串。
更换语言时就读取相应的文档,并刷新显示。
qiuxin425 2011-02-14
  • 打赏
  • 举报
回复
2010中菜单是CMFCMenuBar类
qiuxin425 2011-02-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 beyonld 的回复:]
。。我用的是2008,2010具体我就不清楚了
[/Quote]
你的菜单是集成的 哪个类?

beyonld 2011-02-14
  • 打赏
  • 举报
回复
。。我用的是2008,2010具体我就不清楚了
qiuxin425 2011-02-14
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 beyonld 的回复:]
这就是动态转换,在菜单项响应函数中实现,菜单需要重新SetMenu
[/Quote]
VS2010对SetMenu是没有效果的。
beyonld 2011-02-14
  • 打赏
  • 举报
回复
这就是动态转换,在菜单项响应函数中实现,菜单需要重新SetMenu
qiuxin425 2011-02-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 beyonld 的回复:]
把不同语言的所有资源放到DLL中,要哪个就先LoadLibrary,然后AfxSetResourceHandle
[/Quote]

我是在程序中动态转换

用的是2010,程序代码已经Load了,没有实现我的效果
beyonld 2011-02-14
  • 打赏
  • 举报
回复
把不同语言的所有资源放到DLL中,要哪个就先LoadLibrary,然后AfxSetResourceHandle
qiuxin425 2011-02-14
  • 打赏
  • 举报
回复
顶上去 现在没有人用2010么?

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧