2009-07-31 55 views
3

我想添加一個菜單項,使得它就像一個複選標記,用戶可以選中/取消,其他類可以看到該菜單項的複選標記狀態。我收到了一個爲菜單選項創建類的建議(帶有一個彈出選項),​​但是,當我在Visual Studio 2005中的資源佈局編輯器中時,我無法爲菜單選項創建類。這將會很棒聽到關於創建菜單項的最簡單方法的建議,這些菜單項可以完成我所描述的任務。MFC菜單項的複選框的行爲

回答

1

我最終使用GetMenu()方法從大型機中檢索菜單,然後使用該菜單對象和ID號來調用具有正確標誌的CheckMenuItem()以及GetMenuState()函數。

8

您應該使用CCmdUI::SetCheck函數將複選框添加到菜單項,通過ON_UPDATE_COMMAND_UI處理程序函數和ON_COMMAND處理程序更改複選框的狀態。此方法適用於您的應用程序的主菜單以及您可能創建的任何彈出式菜單。

假設你有一個MDI或SDI MFC應用程序,你應該先決定你要添加的處理功能,例如在應用程序中,主框架,文檔或視圖類。這取決於該標誌將用於:如果它控制應用程序範圍的行爲,將其放入應用程序類;如果它控制視圖特定的行爲,把它放在您的視圖類等

(另外,我建議你離開菜單項的經過屬性中設置爲資源編輯器。)

下面是一個使用視圖類控制ID_MY_COMMAND菜單項的複選框狀態的例子:

// MyView.h 

class CMyView : public CView 
{ 
private: 
    BOOL m_Flag; 

    afx_msg void OnMyCommand(); 
    afx_msg void OnUpdateMyCommand(CCmdUI* pCmdUI); 
    DECLARE_MESSAGE_MAP() 
}; 

// MyView.cpp 

BEGIN_MESSAGE_MAP(CMyView, CView) 
    ON_COMMAND(ID_MY_COMMAND, OnMyCommand) 
    ON_UPDATE_COMMAND_UI(ID_MY_COMMAND, OnUpdateMyCommand) 
END_MESSAGE_MAP() 

void CMyView::OnMyCommand() 
{ 
    m_Flag = !m_Flag; // Toggle the flag 
    // Use the new flag value. 
} 

void CMyView::OnUpdateMyCommand(CCmdUI* pCmdUI) 
{ 
    pCmdUI->SetCheck(m_Flag); 
} 

你應該確保m_Flag成員變量被初始化,例如,在CMyView構造函數或OnInitialUpdate函數。

我希望這有助於!

2

@ ChrisN的方法不適用於MFC對話框應用程序pCmdUI->SetCheck(m_Flag);沒有效果)。下面是對話的應用程序的解決方案:

// MyView.h 

class CMyView : public CView 
{ 
private: 
    BOOL m_Flag; 
    CMenu * m_menu; 

    virtual BOOL OnInitDialog(); 
    afx_msg void OnMyCommand(); 
    DECLARE_MESSAGE_MAP() 
}; 

// MyView.cpp 

BEGIN_MESSAGE_MAP(CMyView, CView) 
    ON_COMMAND(ID_MY_COMMAND, OnMyCommand) 
END_MESSAGE_MAP() 

BOOL CMyView::OnInitDialog() 
{ 
    m_menu = GetMenu(); 
} 

void CMyView::OnMyCommand() 
{ 
    m_Flag = !m_Flag; // Toggle the flag 

    if (m_flag) { 
     m_menu->CheckMenuItem(ID_MENUITEM, MF_CHECKED | MF_BYCOMMAND); 
    } else { 
     m_menu->CheckMenuItem(ID_MENUITEM, MF_UNCHECKED | MF_BYCOMMAND); 
    } 
} 

參考文獻:

http://www.codeguru.com/forum/showthread.php?t=322261