MFC 功能区面板名称问题

Posted

技术标签:

【中文标题】MFC 功能区面板名称问题【英文标题】:MFC Ribbon Panel name issue 【发布时间】:2014-09-04 10:29:51 【问题描述】:

How do I rename the MFC ribbon panel?我有一个相关的问题。我的功能区在资源中的原始标题使用语言 A。我用语言 B 翻译所有内容,包括面板的名称(使用类似于上述主题中提供的方法)。但是当我缩小窗口以使部分(或全部)面板折叠时,它们的名称会返回到语言 A。当我扩大窗口时,面板的名称会再次转换为语言 B。还没有找到解决办法。有人有想法吗? :/ 编辑:我们使用一个与标志一起使用的翻译器类,因此,根据语言标志,它翻译字符串,然后将其应用于类别、按钮等。我制作了自己的面板类,它派生自 CMFCRibbonPanel。我添加了这个方法:

void CRibbonPanel::setName(CString name)  
  
    m_strName = name;  
  

然后我循环查找和编辑每个面板的名称:

(CRibbonPanel*)thePanel->setName(theNewName);  

它工作正常,但是当面板折叠时,它们的标题会恢复为默认语言。

【问题讨论】:

您使用哪种翻译方式?附属 DLL? 你能贴出你用来重命名面板的代码吗? 不,我们没有使用附属 DLL,我们使用了一个与标志一起工作的翻译器类,因此,根据语言标志,它翻译字符串,然后应用到类别、按钮等。我制作了自己的面板类,它派生自 CMFCRibbonPanel。我添加了这个方法:void CRibbonPanel::setName(CString name)m_strName = name;它工作正常,但是当面板折叠时,它们的标题会回到默认语言。 呃,markdown 不能正常工作。我不能把代码放在不同的行:/ 那么您为 CMFCRibbonPanel 做了自己的 Wrapper?但是从您的代码中不清楚您的 m_strName 如何与基类交互。最好将整个课程发布到您原始问题的编辑中,以便我拍照。 【参考方案1】:

折叠的面板标题存储在“默认面板按钮”中。像这样扩展访问器类:

class CRibbonPanel : public CMFCRibbonPanel

public:
    void SetName(CString& name ) 
     m_strName = name; ;

    CMFCRibbonDefaultPanelButton & GetDefBtn() 
     return m_btnDefault; 
;

然后像这样使用:

void ChangeText(CMFCRibbonPanel * pPanel, CString & newText)

    auto pMyPanel = (CRibbonPanel *)(pPanel);
    auto & defBtn = pMyPanel->GetDefBtn();
    defBtn.SetText(newText);

MFC 功能区界面并不是一个完美的抽象。幸运的是,Microsoft 分发了功能区实现的源代码。在我的机器上,面板代码位于:

C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\src\mfc\afxribbonpanel.cpp

【讨论】:

谢谢!我不再在那里工作,但我只是给他们发了链接。看来他们已经以这种或另一种方式解决了问题:)

以上是关于MFC 功能区面板名称问题的主要内容,如果未能解决你的问题,请参考以下文章

MFC - 停用除一个以外的所有按钮

Mfc 功能包 CMFCOutlookBar 未显示

MFC 是不是有等效的 JPanel

视觉工作室 MFC

MFC 功能区在 Windows 2008 中崩溃

MFC 6.0 新增功能区不显示