Как SetOriginalState динамически создаваемой панели CMFCToolbar?

Я создал несколько панелей инструментов динамически в моем приложении mfc

m_cToolBarEx.CreateEx(this, TBSTYLE_FLAT , WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC | CBRS_HIDE_INPLACE);

на панели инструментов нет растрового изображения или идентификатора ресурса. Я использовал функцию InsertButton для добавления кнопок на панель инструментов.

Когда я пытаюсь сбросить эту панель инструментов с помощью кнопки Сбросить панель инструментов из меню. Панель инструментов не сбрасывается в исходное состояние, только запрашивается окно сообщения, и никакие изменения не восстанавливаются.

Я предполагаю, что проблема в том, что CMFCToolBar::RestoreOriginalstate() выполняет условие:

if (m_uiOriginalResID == 0)
    {
        return FALSE;
    }

получает значение true, а функция возвращает false, поскольку в m_uiOriginalResID нет идентификатора ресурса.

Есть ли способ загрузить динамически созданную панель инструментов или мне нужно унаследовать функцию RestoreOriginalstate и написать свою собственную.

Как указывает документация: "Этот метод загружает панель инструментов из файла ресурсов [...]". Если ваша панель инструментов не определена в ресурсе, вы не можете использовать этот член класса. В конце концов, откуда системе загружать макет? Вам придется воссоздать панель инструментов вручную, если у вас нет ресурса для загрузки. Попробуйте получить копию «Программирование Windows» Петцольда, чтобы узнать о ресурсах.

IInspectable 12.09.2018 14:35
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
279
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны переопределить RestoreOriginalstate (), как указано в Раздел примечаний:

This method is called when the user selects Reset from the customization menu.You can also manually call this method to programmatically reset the state of the menu bar.This method loads the original state from the resource file.

Override this method if you want to do any processing when the user selects the Reset option.

Вы также должны переопределить функцию CanBeRestored (), реализация по умолчанию возвращает FALSE, если идентификатор ресурса равен 0.

Вот пример функции RestoreOriginalstate ():

BOOL CLinksBar::RestoreOriginalstate ()
{
    RemoveAllButtons ();

    InsertButton (CLinkButton (_T("MSDN Home"), _T("http://www.msdn.com")));
    InsertButton (CLinkButton (_T("Microsoft Home"), _T("http://www.microsoft.com")));
    InsertButton (CLinkButton (_T("Visual C++ Developer Center"), _T("http://msdn2.microsoft.com/visualc/")));

    EnableCustomizeButton (TRUE, -1, _T(""));

    AdjustLayout ();
    Invalidate ();

    return TRUE;
} 

при переопределении этой функции я использую 'MFCToolBarButton * pButton = (CMFCToolBarButton *) m_Buttons.GetHead ();' и pButton-> SetVisible (); чтобы сделать первую кнопку видимой, и она работает. Может ли кто-нибудь сказать, как пройти по всем таким кнопкам и сделать их видимыми?

Fatema 12.09.2018 15:57

@fat: Если у вас есть новый вопрос, нажмите кнопку Задать вопрос.

IInspectable 12.09.2018 16:04

@IInspectable Нет, это не новый вопрос. Решение проблемы пока не найдено.

Fatema 12.09.2018 19:18

@fat: вы приняли этот ответ, тем самым указав, что он решил вашу проблему (игнорируя поддельный код). Заданный вами вопрос может быть частью более крупной проблемы, которую вы пытаетесь решить, но это новый вопрос, поэтому используйте кнопку Задать вопрос.

IInspectable 12.09.2018 19:27

@fat: чтобы сделать видимыми все кнопки в вашей коллекции m_Buttons, рекомендуется использовать цикл for, если это не помогает, покажите нам свои коды в другом вопросе.

tunglt 12.09.2018 22:45

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