Как отключить восстановление текста в пунктах меню в приложении 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, который включает или выключает сохранение текста.

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

Другие вопросы по тегам