MFC - 选中/取消选中菜单项

时间:2013-06-20 06:37:44

标签: menu mfc

我正在制作一个MFC应用程序,其中有两个菜单选项对应两个工具栏 - 菜单选项切换工具栏的可见性。如果工具栏当前可见,我需要检查菜单选项。这是我到目前为止所得到的:

BEGIN_MESSAGE_MAP(CLevelPackEditApp, CWinAppEx)
    // Standard file based document commands
    ON_UPDATE_COMMAND_UI(ID_LEVEL_PROPERTIES, &CLevelPackEditApp::OnViewLevelProperties)
END_MESSAGE_MAP()

void CLevelPackEditApp::OnViewLevelProperties(CCmdUI* pCmdUI)
{
    // Get a handle to the main window
    CMainFrame* main = ((CMainFrame*)m_pMainWnd);

    // Get a handle to the level properties toolbar for the main window
    CLevelProperties* obj = main->GetLevelProperties();

    if (obj->IsWindowVisible())
    {
        pCmdUI->SetCheck(0);
        obj->ShowPane(false, false, false);
    } else {
        pCmdUI->SetCheck();
        obj->ShowPane(true, false, true);
    }
}

它有效....它在已检查和未检查之间切换,但它每秒多次执行 - 我怀疑检查菜单项会导致菜单更新,因此未经检查,因此更新,因此检查,aaaannnd重复。我怎么能绕过这个?

1 个答案:

答案 0 :(得分:2)

ON_UPDATE_COMMAND_UI()功能只应设置/清除复选标记;仅在单击按钮时调用obj->ShowPane()

BEGIN_MESSAGE_MAP(CLevelPackEditApp, CWinAppEx)
    // Standard file based document commands
    ON_COMMAND_UI(ID_LEVEL_PROPERTIES, &CLevelPackEditApp::OnViewLevelProperties)
    ON_UPDATE_COMMAND_UI(ID_LEVEL_PROPERTIES, &CLevelPackEditApp::OnUpdateViewLevelProperties)
END_MESSAGE_MAP()

void CLevelPackEditApp::OnViewLevelProperties()
{
    // Get a handle to the main window
    CMainFrame* main = ((CMainFrame*)m_pMainWnd);

    // Get a handle to the level properties toolbar for the main window
    CLevelProperties* obj = main->GetLevelProperties();

    if (obj->IsWindowVisible())
        obj->ShowPane(false, false, false);
    else
        obj->ShowPane(true, false, true);
}

void CLevelPackEditApp::OnUpdateViewLevelProperties(CCmdUI* pCmdUI)
{
    // Get a handle to the main window
    CMainFrame* main = ((CMainFrame*)m_pMainWnd);

    // Get a handle to the level properties toolbar for the main window
    CLevelProperties* obj = main->GetLevelProperties();

    pCmdUI->SetCheck(obj->IsWindowVisible());
}