Как отключить восстановление текста в пунктах меню в приложении MFC Feature Pack?

Мое приложение написано с помощью MFC Feature Pack (VS2012). Он может переключать локализацию пользовательского интерфейса путем загрузки данных из библиотеки ресурсов. Но CMFCMenuBar menu восстанавливает исходный текст пунктов меню при перезагрузке приложения.

Если я использую GetDockingManager()->DisableRestoreDockState(TRUE);он блокирует все данные макета от восстановления, а не только текстовые данные.

Я знаю, что MFC Feature Pack сериализует многие элементы пользовательского интерфейса. Если возможно, как я могу отключить сериализацию текстовых данных для достижения этой цели?

1

Решение

Как и в случае с сериализованным кодом, один объект сериализует другой.

Наконец, CMFCMenuBar сериализует элементы с помощью CBCGPToolbarButton :: Serialize. И если вы заглянете внутрь этого кода, вы обнаружите, что текст хранится и перезагружается там …

Так что единственный шанс, который у вас есть, — это изменить все элементы управления на панели инструментов, чтобы они соответствовали вашему классу. И это почти невозможно. Изменение поведения в сериализации не возможно.

Так что, с моей точки зрения, нет хорошего ответа на ваш вопрос, кроме выбора другого подхода.

0

Другие решения

Я нашел хорошее решение. Основная идея — хранить 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 .:
Для лучшего результата вы должны добавить такой код сериализации на все ваши панели инструментов и классы закрепляемых панелей.

0

убрать ТОЛЬКО текст и при этом сохранить позиции / настройки меню …

вам придется перегрузить класс CMFCToolbarButton и использовать эту кнопку в тех местах, которые вы не хотите сохранять. В CMFCMenuBar может быть способ передать тип класса, используемый для кнопок. тогда у вашего класса кнопок может быть BOOL, который включает или выключает сохранение текста.

Если в меню нет способа передать тип класса кнопки, вам придется переопределить парня, создающего эти кнопки.

-1
По вопросам рекламы [email protected]