使用 Visual Studio 2010 并使用 MFC SDI应用程序。 我有一个主框架拥有的 CMFCToolbar 对象。
创建此应用程序中的文档时,MainFrame会调用一个函数,用 CMFCToolbarMenuButton 替换CMFCToolbar对象中的一个按钮。菜单按钮的内容填充有来自文档的信息。菜单创建始终有效。对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的一些基础知识。注册管理机构提出的许多错误。
有没有办法阻止某些对象的注册表设置,或者完全关闭此行为?否则,我想我的关机过程必须更加彻底,重置所有的视觉元素。注册表值似乎忽略,覆盖或绕过我的启动代码。我可以编写我希望对象在启动时查看的方式,但是如果注册表中有值,那就没有用。
答案 0 :(得分:0)
您发现CMFC代码有时令人讨厌。也就是工作区的概念。 Workspace管理应用程序状态的概念。我也有像你描述的那样的问题。但是,您可以通过重写LoadState()和SaveState()方法来灵活地管理这些对象的重建方式。