smg*_*den 6 mfc visual-studio-2010 cmfctoolbar
使用Visual Studio 2010并使用MFC SDI应用程序.我有一个主框架拥有的CMFCToolbar对象.
当创建在本申请文件,大型机调用一个函数来替换与所述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)));
Run Code Online (Sandbox Code Playgroud)
更新:
调用m_wndBrushBar.AdjustLayout()
似乎可以稳定这些CMFCToolbar按钮的视觉行为.这是一个部分解决方案.部分原因如下:
很难说出真正的视觉行为是什么.事实证明,所有可视化设置/状态都与这些MFC对象一起存储在注册表中,并且它可以保持动态创建的对象的状态,这些对象真正改变了应用程序的启动行为.
我已经删除了下面的注册表值
Current User -> "Local App-Wizard Generated Applications" -> [My App Name]
.做了很多次,只是为了找出我的应用程序的真实行为.感觉我错过了当前版本的MFC的一些基础知识.注册管理机构交易引发了很多错误.
有没有办法阻止某些对象的注册表设置,或完全关闭此行为?否则,我想我的关机过程必须更加彻底,重置所有的视觉元素.注册表值似乎忽略,覆盖或绕过我的启动代码.我可以编写我希望对象在启动时查看的方式,但是如果注册表中有值,则没有用.
您已经发现了 CMFC 代码有时令人烦恼的方面。即工作空间的概念。工作区管理应用程序状态的概念。我也遇到过像你描述的这样的问题。但是,您可以通过重写 LoadState () 和 SaveState () 方法来灵活地管理如何重新创建这些对象。
归档时间: |
|
查看次数: |
1404 次 |
最近记录: |