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