CMFCToolbar ReplaceButton() вызывает исчезновение кнопки

Использование Visual Studio 2010 и работа с приложением MFC SDI. У меня есть объект CMFCToolbar, принадлежащий основному фрейму.

Когда документ в этом приложении создан, Main Frame вызывает функцию для замены одной из кнопок в объекте CMFCToolbar на CMFCToolbarMenuButton. Содержимое кнопки меню заполняется информацией из документа. Создание меню всегда работает. Вызов ReplaceButton всегда завершается успешно. Но есть визуальный признак вызова, который я еще не понял.

Каждый раз, когда вызывается ReplaceButton, кнопка исчезает. Он не только не нарисован, но и не кликабелен. Это временно прошло. Я предполагаю, что это потому, что есть свисающая ссылка на старую кнопку, которую я только что уничтожил при вызове ReplaceButton.

Я пытался вызвать Invalidate(), RecalcLayout(), чтобы вызвать повторное рисование, но ни один еще не сработал. Единственный надежный способ заставить кнопку отображаться - изменить размер окна приложения вручную или отстыковать / повторно закрепить панель инструментов. Я предполагаю, что в этих ситуациях происходит какое-то обновление нижнего уровня, но я не знаю, как запустить его вручную.

Есть ли способ убедиться, что моя кнопка нажата сразу?

Изменить: пример кода

Count = m_Doc->...->GetCount();
for (Index = 0; Index < Count; ++Index)
{
    Caption.Format(L"%s", m_Doc->...->GetName());
        m_pLayerMenu->AppendMenu(MF_ENABLED | MF_STRING, LAYER_DROP_SEED+Index, Caption.GetData());
}
m_wndBrushBar.ReplaceButton(ID_BRUSH_TERRAIN,
    CMFCToolBarMenuButton(ID_BRUSH_TERRAIN, *m_pLayerMenu, GetCmdMgr()->GetCmdImage(ID_BRUSH_TERRAIN)));

Обновить:

призвание m_wndBrushBar.AdjustLayout() кажется, стабилизирует визуальное поведение этих кнопок CMFCToolbar. Так что это частичное решение. Частично из-за следующего:

Трудно сказать, каково настоящее визуальное поведение. Оказывается, что все визуальные настройки / состояния хранятся в Реестре с этими объектами MFC, и он может хранить состояния динамически создаваемых объектов, которые действительно изменяют поведение при запуске приложения.

Я вошел, чтобы удалить значения реестра в

Current User -> "Local App-Wizard Generated Applications" -> [My App Name], Сделайте это несколько раз, просто чтобы узнать, каково реальное поведение моего приложения. Чувствую, что мне не хватает некоторых фундаментальных знаний с текущей версией MFC. Много ошибок, связанных с регистрацией сделки.

Есть ли способ запретить настройки реестра для определенных объектов или вообще отключить это поведение? В противном случае, я предполагаю, что мой процесс выключения должен быть ОЧЕНЬ более тщательным со сбросом всех визуальных элементов. Кажется, что значения реестра игнорируют, переопределяют или игнорируют мой код запуска. Я могу написать, как я хочу, чтобы объект смотрел при запуске, но если в реестре есть значения, это не помогает.

1 ответ

Вы обнаружили иногда раздражающий аспект для кода CMFC. То есть концепция рабочего пространства. Рабочая область управляет концепцией состояния приложения. У меня тоже были проблемы, подобные той, которую вы описали. Но у вас есть возможность управлять воссозданием этих объектов путем переопределения методов LoadState () и SaveState ().

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