6

Visual Studio 2010を使用し、MFC SDI アプリケーションを操作します。メイン フレームが所有するCMFCToolbarオブジェクトがあります。

このアプリケーションでドキュメントが作成されると、MainFrame は関数を呼び出して、CMFCToolbar オブジェクトのボタンの 1 つを 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 に関する基本的な知識が欠けているように感じます。レジストリ契約に起因する多くのバグ。

特定のオブジェクトのレジストリ設定を防止する方法、またはこの動作を完全に停止する方法はありますか? それ以外の場合は、すべての視覚要素をリセットして、シャットダウン プロセスをより徹底する必要があると思います。レジストリ値がスタートアップ コードを無視、オーバーライド、またはバイパスしているようです。オブジェクトが起動時にどのように見えるかをコーディングすることはできますが、レジストリに値がある場合、それは役に立ちません。

4

1 に答える 1

0

CMFC コードの厄介な側面を発見しました。つまり、ワークスペースの概念です。ワークスペースは、アプリケーションの状態の概念を管理します。私も、あなたが説明したような問題を抱えていました。ただし、LoadState () および SaveState () メソッドをオーバーライドすることで、これらのオブジェクトを再作成する方法を柔軟に管理できます。

于 2014-04-10T20:04:15.003 に答える