Мое приложение написано с помощью MFC Feature Pack (VS2012). Он может переключать локализацию пользовательского интерфейса путем загрузки данных из библиотеки ресурсов. Но CMFCMenuBar
menu восстанавливает исходный текст пунктов меню при перезагрузке приложения.
Если я использую GetDockingManager()->DisableRestoreDockState(TRUE);
он блокирует все данные макета от восстановления, а не только текстовые данные.
Я знаю, что MFC Feature Pack сериализует многие элементы пользовательского интерфейса. Если возможно, как я могу отключить сериализацию текстовых данных для достижения этой цели?
Как и в случае с сериализованным кодом, один объект сериализует другой.
Наконец, CMFCMenuBar сериализует элементы с помощью CBCGPToolbarButton :: Serialize. И если вы заглянете внутрь этого кода, вы обнаружите, что текст хранится и перезагружается там …
Так что единственный шанс, который у вас есть, — это изменить все элементы управления на панели инструментов, чтобы они соответствовали вашему классу. И это почти невозможно. Изменение поведения в сериализации не возможно.
Так что, с моей точки зрения, нет хорошего ответа на ваш вопрос, кроме выбора другого подхода.
Я нашел хорошее решение. Основная идея — хранить LANGID с данными кнопок меню. Когда строка меню выполняет процесс загрузки, нам нужно проверить сохраненный LANGID и текущий LANGID процесса и сбросить панель, если они не эквивалентны.
Код:
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 .:
Для лучшего результата вы должны добавить такой код сериализации на все ваши панели инструментов и классы закрепляемых панелей.
убрать ТОЛЬКО текст и при этом сохранить позиции / настройки меню …
вам придется перегрузить класс CMFCToolbarButton и использовать эту кнопку в тех местах, которые вы не хотите сохранять. В CMFCMenuBar может быть способ передать тип класса, используемый для кнопок. тогда у вашего класса кнопок может быть BOOL, который включает или выключает сохранение текста.
Если в меню нет способа передать тип класса кнопки, вам придется переопределить парня, создающего эти кнопки.