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

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

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

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


person 23W    schedule 14.09.2015    source источник
comment
@spenibus, спасибо.   -  person 23W    schedule 15.09.2015
comment
Оглядываясь назад, я обнаружил, что кое-что упустил, поэтому уточнил вопрос. Очевидно, что если вы считаете, что мои изменения были слишком радикальными, вам следует без колебаний откатиться.   -  person spenibus    schedule 15.09.2015
comment
@spenibus, нет, ваши изменения полезны.   -  person 23W    schedule 15.09.2015
comment
Как и все с сериализацией кода, один объект сериализует другой. CMFCMenuBar наконец сериализует элементы с помощью CBCGPToolbarButton :: Serialize.   -  person xMRi    schedule 21.10.2015


Ответы (3)


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

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

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

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

person xMRi    schedule 21.10.2015
comment
Спасибо, я попробую перезаписать механизм сериализации для строки меню. - person 23W; 21.10.2015

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

person 23W    schedule 15.09.2015

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

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

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

person diox8tony    schedule 16.09.2015
comment
Итак, я должен создать подкласс CMFCToolbarButton и перезаписать метод Serialize () ... Затем я должен заменить все кнопки на панелях инструментов и меню на кнопку моего класса. Огромный труд для такой маленькой задачи! - person 23W; 16.09.2015
comment
Может быть, есть уловка, но это ИМХО плохой взлом, и он изменит пользовательский интерфейс и может не работать из-за ASSERT. Сохраните весь текст перед сериализацией, очистите его, восстановите. Проблема в том, что вы хотите предотвратить сохранение только текста, а текст сериализуется глубоко внутри базового класса. - person xMRi; 21.10.2015