我的应用程序是使用MFC功能包(VS2012)编写的。它可以通过从资源dll加载数据来切换UI本地化。但是,CMFCMenuBar
菜单会在重新加载应用程序时恢复菜单项的原始文本。
如果我使用GetDockingManager()->DisableRestoreDockState(TRUE);
,它会阻止所有布局数据的恢复,而不仅仅是文本数据。
我知道MFC Feature Pack序列化了许多UI元素。如果可能,如何禁用文本数据序列化来实现此目的?
答案 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,可以打开或关闭保存文本。
如果没有办法在菜单中传递按钮类类型,那么你必须覆盖创建这些按钮的人。