如何禁用MFC Feature Pack应用程序中MenuBar项目中文本的恢复?

时间:2015-09-14 17:11:33

标签: c++ mfc mfc-feature-pack

我的应用程序是使用MFC功能包(VS2012)编写的。它可以通过从资源dll加载数据来切换UI本地化。但是,CMFCMenuBar菜单会在重新加载应用程序时恢复菜单项的原始文本。

如果我使用GetDockingManager()->DisableRestoreDockState(TRUE);,它会阻止所有布局数据的恢复,而不仅仅是文本数据。

我知道MFC Feature Pack序列化了许多UI元素。如果可能,如何禁用文本数据序列化来实现此目的?

3 个答案:

答案 0 :(得分:0)

我找到了很好的解决方案。主要思想是将LANGID与菜单按钮数据一起存储。当菜单栏执行加载过程时,我们需要检查存储的LANGID和当前进程LANGID,如果它们不相等则重置bar。

<强>代码:

class CLocalyMenuBar
    : public CMFCMenuBar
{
    DECLARE_SERIAL(CLocalyMenuBar)

public:
    typedef CMFCMenuBar TBase;

public:
    CLocalyMenuBar();
    virtual ~CLocalyMenuBar();

    virtual void        Serialize(CArchive& ar);
};



IMPLEMENT_SERIAL(CLocalyMenuBar, CLocalyMenuBar::TBase, VERSIONABLE_SCHEMA | 1)

CLocalyMenuBar::CLocalyMenuBar()
{}

CLocalyMenuBar::~CLocalyMenuBar()
{}

void CLocalyMenuBar::Serialize(CArchive& ar)
{
    TBase::Serialize(ar);

    if (ar.IsLoading()) {

        LANGID nID = MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL);
        ar >> nID;

        if ((nID != Locality::GetCurResourceLANGID()) && CanBeRestored()) {
            RestoreOriginalState();
        }
    }
    else {
        ar << Locality::GetCurResourceLANGID();
    }
}


namespace Locality {

    LANGID GetCurResourceLANGID()
    {
        // You should return current resource LANGID for your app process!
        return MY_PROCESS_CURRENT_LANGID;
    }
}

P.S .: 为了获得更好的结果,您应该将所有序列化代码添加到所有工具栏和可停靠栏类中。

答案 1 :(得分:0)

与序列化代码一样,一个对象序列化其他对象。

CMFCMenuBar最终使用CBCGPToolbarButton :: Serialize序列化项目。如果您查看此代码,您会发现文本已存储并重新加载...

因此,您唯一的机会就是将工具栏中的所有控件更改为您的班级。这几乎是不可能的。更改序列化中的行为不是一种可能的方式。

因此,从我的观点来看,除了选择不同的方法之外,对你的问题没有好的答案。

答案 2 :(得分:-1)

仅删除文本并仍然保存菜单的位置/自定义...

你必须超越CMFCToolbarButton类并在你不想保存的地方使用该按钮。在CMFCMenuBar中,可能有一种方法可以传递用于按钮的类类型。那么你的按钮类可以有一个BOOL,可以打开或关闭保存文本。

如果没有办法在菜单中传递按钮类类型,那么你必须覆盖创建这些按钮的人。