菜单问题:为什么不支持多语言DLL

Kaile 2005-10-26 06:55:00
我是用了GUILIB这个开放源码的界面库,现在其他正常,只是如果把资源换成繁体做到资源DLL中,菜单中的文字并不能变成繁体,仍然是EXE文件中的简体。但是对话框中的文字一切正常。

请教高手如何修改?


GUILIB把菜单当作toolbar来处理,菜单很漂亮

    if (!m_wndMenuBar.CreateEx(this, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_SIZE_DYNAMIC ) ||
!m_wndMenuBar.LoadMenuBar(IDR_MAINFRAME))   // 加载菜单资源
{
TRACE0("Failed to create menubar\n");
return -1; // fail to create
}

/* 用这几句来代替上面的几句,可以实现语言转换,但菜单不美观
CMenu menu;
menu.LoadMenu(IDR_MAINFRAME);
SetMenu(&menu);
DrawMenuBar();
menu.Detach();
*/
m_NewMenu.LoadMenu(IDR_MAINFRAME); //加载阴影风格图标等
m_wndCool.Install(this);
m_wndCool.LoadToolbar(IDR_MAINFRAME);

m_wndMenuBar.EnableDocking(CBRS_ALIGN_TOP);
DockControlBar(&m_wndMenuBar,m_dockTop);


是否可以通过修改它的LoadMenuBar或其他方法来实现我要的功能?

以下是这个库的相关代码:

//******************************************************************
BOOL CMenuBar::LoadMenuBar(UINT nIDResource)
{
ASSERT(m_hMenu == NULL);

ASSERT_VALID(m_pDockSite);
if (m_pDockSite->GetMenu()) {
PostMessage(MB_SET_MENU_NULL, (WPARAM)m_pDockSite->GetSafeHwnd());
}

m_hMenu = ::LoadMenu(AfxGetInstanceHandle(), MAKEINTRESOURCE(nIDResource));
if (m_hMenu == NULL) {
TRACE(_T("Failed to load menu\n"));
return FALSE;
}

return InitItems();
}


HMENU CMenuBar::LoadMenu(HMENU hMenu, HMENU hWindowMenu)
{
ASSERT(::IsMenu(hMenu));
ASSERT_VALID(this);

CFrameWnd* pFrame = GetParentFrame();
if (::GetMenu(pFrame->GetSafeHwnd()) != NULL) {
// not to make MFC ignore SetMenu(NULL), post it.
PostMessage(MB_SET_MENU_NULL, (WPARAM)pFrame->GetSafeHwnd());
}

HMENU hOldMenu = m_hMenu;
m_hMenu = hMenu;// menu is shared with MFC

// initialize Items
VERIFY(InitItems());

if (hMenu) {
m_hWindowMenu = hWindowMenu;
RefreshBar();// and menubar itself
}

return hOldMenu;
}


//******************************************************************
BOOL CMenuBar::InitItems()
{
ASSERT(m_hMenu);

// clean up all items
DeleteItems();

// buttons
for (int i = 0; i < ::GetMenuItemCount(m_hMenu); ++i) {
m_arrItem.Add(new CMenuButton(m_hMenu, i,this));
}

if (m_bMDIApp) {
// icon
CWnd* pFrame = GetTopLevelFrame();
ASSERT_VALID(pFrame);
CMDIFrameWnd* pMDIFrame = STATIC_DOWNCAST(CMDIFrameWnd, pFrame);
HWND hWndMDIClient = pMDIFrame->m_hWndMDIClient;
ASSERT(::IsWindow(hWndMDIClient));

HWND hWndChild = (HWND)::SendMessage(hWndMDIClient,
WM_MDIGETACTIVE, 0, 0);
if ((!bIsTabbed) )
{

m_pMenuIcon = new CMenuIcon(this);
m_arrItem.InsertAt(0, m_pMenuIcon);
// frame control
m_pMenuControl = new CMenuControl(this);
m_arrItem.Add(m_pMenuControl);

// reinitializing
m_pMenuIcon->OnActivateChildWnd();
m_pMenuControl->OnActivateChildWnd();
}
}

return TRUE;
}


下载网址是:
http://www.beyondata.com/
...全文
281 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
runnersun 2006-06-21
  • 打赏
  • 举报
回复
可以做成多种语言资源DLL, 动态加载就可以
Kaile 2006-06-21
  • 打赏
  • 举报
回复
要钱的都不要。
郑再鹏 2006-06-16
  • 打赏
  • 举报
回复
GUILIB有很多Bug,很多Windows的消息都被其截获了,处理起来很麻烦,除非你对GUILIB的代码很熟悉。用BCG吧,最强的商业界面库。
farer01 2006-04-22
  • 打赏
  • 举报
回复
多语言支持组件LocNuke(国际通本地化核武器)


一、概述

欢迎使用全球领先的多语言解决方案。
这是一个创新的多语言软件开发工具,它使用类似于文本文件的外挂语言包提供Win32软件的多语言支持。
它是一个领先的具有丰富特色的解决方案满足您软件全球化的需要。
通过LocNuke,您可以轻易迅速地拥有完全多语言支持的应用程序。仅需一会就可以创建首个您的全球通行的应用程序;也仅需很少的代码就可以使现有的应用程序拥有多语言功能。

支持Unicode/ANSI变异,同时支持Unicode/ANSI语言包,拥有智能语言技术并支持多语言平台

二、功能
1.低成本灵活方便动态支持多语言:增加和修改语种文字仅需文员用记事本增修外挂语言包;
2.比普通的语言资源Dll的多语言支持能力更为超强和灵活便利成本低廉;
2.编程方便、代价小、入门要求低;
3.支持操作系统范围广:支持Windows9x/Me和Windows2K/XP;
4.支持语言种类众多:只要Windows记事本支持显示的文字,一般都可以通用支持,在Win2K/XP上甚至能支持连Windows记事本也不能显示的文字。


国外比我的差但是很来钱License copies Price per copy Subscription renewal

1-4 licenses US $249.95 US $70.00

5-10 licenses US $219.95 US $60.00 11-Unlimited licenses US $179.95 US $50.00

Corporate License US $3000.00 US $750.00
szvc@163.com
qq:9815283
msn:szvb@163.com
Kaile 2005-11-14
  • 打赏
  • 举报
回复
thanks
shadowWind 2005-11-12
  • 打赏
  • 举报
回复
mark
Kaile 2005-11-10
  • 打赏
  • 举报
回复
顶!
Kaile 2005-10-28
  • 打赏
  • 举报
回复
有人知道吗?
Kaile 2005-10-26
  • 打赏
  • 举报
回复
应该重载了,CMenuBar中间有一段代码:
是不是重载引起的问题?


//******************************************************************
/////////////////////////////////////////////////////////////////////////////
// CMenuBar OLE menu support
// MFC does'nt do command routing for other process server.
// ::TrackPopupMenuEx won't accept HWND of other process and
// we have to determine a message target(ole server window or not)
// as ::OleCreateMenuDescriptor do.
// This is a hard coding.
// First menu(ordinarily File menu) and WindowMenu regarded as container's own menu.
// Some components can't update toolbar button and statusbar pane.
HWND CMenuBar::OleMenuDescriptor(BOOL& bSend, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
CWnd* pOleWnd = GetCmdSentOleWnd();
if (pOleWnd == NULL)
return NULL;
HWND hWndSentCmd = NULL;

HMENU hMenu = NULL;
if (nMsg == WM_INITMENUPOPUP || nMsg == WM_INITMENU)
hMenu = (HMENU)wParam;
else if (nMsg == WM_MENUSELECT)
hMenu = (HMENU)lParam;

switch (nMsg) {
case WM_INITMENUPOPUP:
case WM_INITMENU:
case WM_MENUSELECT:
bSend = TRUE;
if (m_nTrackingState == popup) {
LTRACE2(_T(" now popup\n"));
if (m_bMDIApp) {
LTRACE2(_T(" this is MDI\n"));
if (m_nCurIndex == 0 || m_nCurIndex == 1 || hMenu == m_hWindowMenu) {
LTRACE2(_T(" it's container menu, send to frame\n"));
return NULL;
}
}
else {
LTRACE2(_T(" it's container menu, send to frame\n"));
if (m_nCurIndex == 0) {
return NULL;
}
}
LTRACE2(_T(" it's server menu, send to server\n"));
return pOleWnd->GetSafeHwnd();
}
break;

case WM_COMMAND:
bSend = FALSE;
if (m_bMDIApp) {
LTRACE2(_T(" this is MDI\n"));
if (_nPrevIndexForCmd == 0 || _nPrevIndexForCmd == 1 || _bWindowMenuSendCmd) {
LTRACE2(_T(" it's container menu, send to frame\n"));
return NULL;
}
}
else {
if (_nPrevIndexForCmd == 0) {
LTRACE2(_T(" it's container menu, send to frame\n"));
return NULL;
}
}
LTRACE2(_T(" it's server menu, send to server\n"));
return pOleWnd->GetSafeHwnd();
}

return NULL;// send to frame
}
vcmute 2005-10-26
  • 打赏
  • 举报
回复
不知道该库重载了WM_INITMENU和WM_INITMENUPOPUP没有

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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