none
VC2010 multiple languages problems RRS feed

  • 问题

  • the purpose: I want to make multiple languages exe program using VC2010.

    problem: I want to change this popup menu's language to english or just delete this menu, but I did not find this popup menu. I just can not find the menu ID. how can I do ?

    the dockpane's popup menu like this:

    1.float(浮动)

    2.stop(停靠)

    3.tabbed documents(选项卡式文档)

    4.Autohide(自动隐藏)

    5.hide(隐藏)

    • 已移动 ChiYau 2011年7月14日 12:37 這應該是C++ 的問題, 發在C++ 的版塊中應該更快得到解決方法 (发件人:Visual Studio 2010)
    2011年7月14日 8:26

答案

  • 您需要在您的主框架CMainFrame类过滤WM_CONTEXTMENU消息(当然可能需要判断一下当前您激活的是哪个窗口),类似下面这样:
    // 主框架类中
    BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
    {
    	// TODO: Add your specialized code here and/or call the base class
    	if(WM_RBUTTONUP == pMsg->message)
    	{
    		AfxMessageBox(_T("MAIN!")); // 这里弹出你的右键消息
    		return TRUE;
    	}
    	return CFrameWndEx::PreTranslateMessage(pMsg);
    }
    
    


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    • 已标记为答案 Rob Pan 2011年7月27日 9:56
    2011年7月18日 2:58
    版主

全部回复

  • 这个弹出菜单是MFC已经定义好了的,在CPane类OnShowControlBarMenu()函数中您可以看到
    BOOL CPane::OnShowControlBarMenu(CPoint point)
    {
    	if (afxContextMenuManager == NULL)
    	{
    		return FALSE;
    	}
    
    	if ((GetEnabledAlignment() & CBRS_ALIGN_ANY) == 0 && !CanFloat())
    	{
    		return FALSE;
    	}
    
    	const UINT idFloating = (UINT) -102;
    	const UINT idDocking = (UINT) -103;
    	const UINT idAutoHide = (UINT) -104;
    	const UINT idHide = (UINT) -105;
    	const UINT idTabbed = (UINT) -106;
    
    	CMenu menu;
    	menu.CreatePopupMenu();
    
    	{
    		CString strItem;
    
    		ENSURE(strItem.LoadString(IDS_AFXBARRES_FLOATING));
    		menu.AppendMenu(MF_STRING, idFloating, strItem);
    
    		ENSURE(strItem.LoadString(IDS_AFXBARRES_DOCKING));
    		menu.AppendMenu(MF_STRING, idDocking, strItem);
    
    		ENSURE(strItem.LoadString(IDS_AFXBARRES_TABBED));
    		menu.AppendMenu(MF_STRING, idTabbed, strItem);
    
    		ENSURE(strItem.LoadString(IDS_AFXBARRES_AUTOHIDE));
    		menu.AppendMenu(MF_STRING, idAutoHide, strItem);
    
    		ENSURE(strItem.LoadString(IDS_AFXBARRES_HIDE));
    		menu.AppendMenu(MF_STRING, idHide, strItem);
    	}
    
    	if (!CanFloat())
    	{
    		menu.EnableMenuItem(idFloating, MF_GRAYED);
    	}
    
    	if (!CanAutoHide() || GetParentMiniFrame() != NULL)
    	{
    		menu.EnableMenuItem(idAutoHide, MF_GRAYED);
    	}
    
    	if (IsAutoHideMode())
    	{
    		menu.EnableMenuItem(idFloating, MF_GRAYED);
    		menu.EnableMenuItem(idDocking, MF_GRAYED);
    		menu.CheckMenuItem(idAutoHide, MF_CHECKED);
    		menu.EnableMenuItem(idHide, MF_GRAYED);
    	}
    
    	CMDIFrameWndEx* pFrame = DYNAMIC_DOWNCAST(CMDIFrameWndEx, GetDockSiteFrameWnd());
    	if (!CanBeTabbedDocument() || pFrame != NULL && pFrame->IsFullScreen())
    	{
    		menu.EnableMenuItem(idTabbed, MF_GRAYED);
    	}
    
    	if (IsMDITabbed())
    	{
    		menu.EnableMenuItem(idFloating, MF_GRAYED);
    		menu.EnableMenuItem(idDocking, MF_GRAYED);
    		menu.CheckMenuItem(idTabbed, MF_CHECKED);
    	}
    
    	if (IsFloating())
    	{
    		menu.CheckMenuItem(idFloating, MF_CHECKED);
    	}
    	else if (!IsAutoHideMode() && !IsMDITabbed())
    	{
    		menu.CheckMenuItem(idDocking, MF_CHECKED);
    	}
    
    	if ((GetEnabledAlignment() & CBRS_ALIGN_ANY) == 0)
    	{
    		menu.EnableMenuItem(idDocking, MF_GRAYED);
    	}
    
    	if (!CanBeClosed())
    	{
    		menu.EnableMenuItem(idHide, MF_GRAYED);
    	}
    
    	if (!OnBeforeShowPaneMenu(menu))
    	{
    		return FALSE;
    	}
    
    	HWND hwndThis = GetSafeHwnd();
    
    	int nMenuResult = afxContextMenuManager->TrackPopupMenu(
    		menu, point.x, point.y, this);
    
    	if (!::IsWindow(hwndThis))
    	{
    		return TRUE;
    	}
    
    	if (!OnAfterShowPaneMenu(nMenuResult))
    	{
    		return TRUE;
    	}
    
    	switch(nMenuResult)
    	{
    	case idDocking:
    		if (IsFloating())
    		{
    			CPaneFrameWnd* pMiniFrame = GetParentMiniFrame();
    			if (pMiniFrame != NULL)
    			{
    				pMiniFrame->OnDockToRecentPos();
    			}
    		}
    		break;
    
    	case idFloating:
    		{
    			BOOL bWasFloated = FALSE;
    
    			CBaseTabbedPane* pTabbedBar = DYNAMIC_DOWNCAST(CBaseTabbedPane, IsTabbed() ? GetParentTabbedPane() : this);
    
    			if (pTabbedBar != NULL)
    			{
    				ASSERT_VALID(pTabbedBar);
    
    				CMFCBaseTabCtrl* pTabWnd = pTabbedBar->GetUnderlyingWindow();
    				if (pTabWnd != NULL)
    				{
    					ASSERT_VALID(pTabWnd);
    
    					const int nTabID = pTabWnd->GetActiveTab();
    					CWnd* pWnd = pTabWnd->GetTabWnd(nTabID);
    
    					if (pWnd != NULL && pTabWnd->IsTabDetachable(nTabID))
    					{
    						bWasFloated = pTabbedBar->DetachPane(pWnd, FALSE);
    						if (bWasFloated)
    						{
    							if (pTabWnd->GetTabsNum() > 0 &&
    								pTabWnd->GetVisibleTabsNum() == 0)
    							{
    								pTabbedBar->ShowPane(FALSE, FALSE, FALSE);
    							}
    						}
    					}
    				}
    			}
    
    			if (!bWasFloated)
    			{
    				FloatPane(m_recentDockInfo.m_rectRecentFloatingRect);
    			}
    		}
    		break;
    
    	case idAutoHide:
    		ToggleAutoHide();
    		break;
    
    	case idHide:
    		OnPressCloseButton();
    		break;
    
    	case idTabbed:
    		if (IsMDITabbed())
    		{
    			CMDIChildWndEx* pMDIChild = DYNAMIC_DOWNCAST(CMDIChildWndEx, GetParent());
    			if (pMDIChild == NULL)
    			{
    				ASSERT(FALSE);
    				return FALSE;
    			}
    
    			CMDIFrameWndEx* pTabbedFrame = DYNAMIC_DOWNCAST(CMDIFrameWndEx, GetDockSiteFrameWnd());
    			if (pTabbedFrame == NULL)
    			{
    				ASSERT(FALSE);
    				return FALSE;
    			}
    
    			pTabbedFrame->TabbedDocumentToControlBar(pMDIChild);
    		}
    		else
    		{
    			ConvertToTabbedDocument();
    		}
    	}
    
    	return TRUE;
    }
    
    您在CDockablePane上右键,会响应对应类的OnContextMenu()在OnContextMenu中会调用CDockablePane::OnContextMenu(),在CDockablePane::OnContextMenu()函数中又会调用CPane::OnContextMenu(),在CPane::OnContextMenu()函数中会调用CPane::OnShowControlBarMenu(),就是上面贴出来的函数。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年7月14日 13:28
    版主
  • 你好,非常感谢。

    那么,怎么让它不运行onshowcontrolbarmenu()了?你说的这些在程序里我都没有找到。

    2011年7月15日 8:15
  • 我就是想删除cdockablepane里面的默认右键菜单,或者能够操作该菜单,进行中英文切换。但是在资源文件里都没有找到这个菜单的相关资源
    2011年7月15日 9:13
  • 我就是想删除cdockablepane里面的默认右键菜单,或者能够操作该菜单,进行中英文切换。但是在资源文件里都没有找到这个菜单的相关资源

    上面也提到过了,这个菜单不是从资源里加载的,它是在 CPane::OnShowControlBarMenu这个函数中创建中,您也可以从这个函数中看到创建的代码。如果您多语言切换,您完全可以自己参照 CPane::OnShowControlBarMenu()函数的做法自己定义一个Menu资源,然后加载它。
    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年7月15日 12:49
    版主
  • 你好,非常感谢。

    那么,怎么让它不运行onshowcontrolbarmenu()了?你说的这些在程序里我都没有找到。


    对应的类的OnContextMenu函数中应该找到的,WM_CONTEXTMENU消息的响应函数。
    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    2011年7月15日 12:52
    版主
  • 我的这个工程是按visual studio的模式自动创建的。在dockablepane上放了两个面板,fileview和classview(基类是cdockablepane),所以就只有fileview和classview的WM_CONTEXTMENU消息,而且这两个类的WM_CONTEXTMENU我已经找到了,这两个面板的右键菜单我也已经去掉了,但是面板的标题栏上右键还是会弹出我文中所说的菜单。真找不到那个函数。

    2011年7月18日 0:54
  • 您需要在您的主框架CMainFrame类过滤WM_CONTEXTMENU消息(当然可能需要判断一下当前您激活的是哪个窗口),类似下面这样:
    // 主框架类中
    BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
    {
    	// TODO: Add your specialized code here and/or call the base class
    	if(WM_RBUTTONUP == pMsg->message)
    	{
    		AfxMessageBox(_T("MAIN!")); // 这里弹出你的右键消息
    		return TRUE;
    	}
    	return CFrameWndEx::PreTranslateMessage(pMsg);
    }
    
    


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    • 已标记为答案 Rob Pan 2011年7月27日 9:56
    2011年7月18日 2:58
    版主
  • 我还想请教一个问题:

                          我的工程是用VC2010创建的基于选项卡式的MDI程序,可是每个选项卡右边都有一个关闭按钮,我现在想做多语言的程序,不知道怎么将这个关闭按钮的tooltip改为"Close".看了下用了cmditabinfo类,不知道怎么解决,望赐教,多谢~

    2011年8月3日 3:24