2012-10-25 14 views
6

Visual Studio 2010を使用し、MFC SDIアプリケーションを使用しています。 私はCMFCToolbarオブジェクトをメインフレームが所有しています。CMFCToolbar ReplaceButton()によってボタンが消えます

このアプリケーションのドキュメントが作成されると、MainFrameはCMFCToolbarオブジェクトのボタンの1つをCMFCToolbarMenuButtonに置き換える関数を呼び出します。メニューボタンの内容には、文書の情報が入力されます。メニュー作成は常に機能します。 ReplaceButtonの呼び出しは常に成功します。しかし、私がまだ把握していない呼び出しの視覚的な症状があります。

ReplaceButtonが呼び出されると、ボタンが消えます。描画されないだけでなく、クリック可能でもありません。一時的に消えてしまった。これは、ReplaceButtonの呼び出しで破棄した古いボタンへの参照がないためです。

私は、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コードで時々面倒なことを発見しました。つまり、ワークスペースの概念です。ワークスペースはアプリケーション状態の概念を管理します。私もあなたが描いたような問題を抱えていました。しかし、LoadState()メソッドとSaveState()メソッドをオーバーライドすることによって、オブジェクトの再作成方法を柔軟に管理できます。

関連する問題