2012-10-25 70 views
6

使用Visual Studio 2010和使用MFC SDI應用程序。 我有一個CMFCToolbar對象擁有的主架。CMFCToolbar ReplaceButton()導致按鈕消失

當創建此應用程序中的文檔時,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

這是一個很好的問題。你能添加一些相關的源代碼嗎? – dpassage

回答

0

您已經發現了CMFC代碼有時令人討厭的方面。也就是說,Workspace的概念。工作區管理應用程序狀態的概念。我也有類似你所描述的問題。但是,通過重寫LoadState()和SaveState()方法,您可以靈活地管理這些對象的重新創建方式。