2009-07-31 4 views
3

사용자가 체크 표시/체크 해제 할 수있는 체크 표시와 같은 역할을하는 메뉴 항목을 추가하려고 시도하고 다른 클래스는 해당 메뉴 항목의 체크 표시 상태를 볼 수 있습니다. 그러나 팝업 옵션을 사용하여 메뉴 옵션에 대한 클래스를 만드는 제안을 받았지만 Visual Studio 2005의 리소스 레이아웃 편집기에있을 때 메뉴 옵션에 대한 클래스를 만들 수 없습니다. 내가 설명한 것을 할 수있는 메뉴 항목을 만드는 가장 쉬운 방법에 대한 제안을 듣고.MFC 메뉴 항목 체크 박스 동작

답변

1

GetMenu() 메서드를 사용하여 메인 프레임에서 메뉴를 검색 한 다음 해당 메뉴 개체와 ID 번호를 사용하여 올바른 플래그와 GetMenuState() 함수를 사용하여 CheckMenuItem()을 호출했습니다.

8

ON_UPDATE_COMMAND_UI 처리기 기능과 ON_COMMAND 처리기를 통해 확인란의 상태를 변경하려면 메뉴 항목에 확인란을 추가하려면 CCmdUI::SetCheck 함수를 사용해야합니다. 이 방법은 응용 프로그램의 주 메뉴 및 만들 수있는 팝업 메뉴에서 모두 작동합니다.

MDI 또는 SDI MFC 응용 프로그램이 있다고 가정하면 먼저 응용 프로그램, 기본 프레임, 문서 또는 뷰 클래스와 같은 처리기 기능을 추가 할 위치를 결정해야합니다. 이것은 플래그가 사용될 대상에 따라 달라집니다. 응용 프로그램 전반의 동작을 제어하는 ​​경우 응용 프로그램 클래스에 넣습니다. 이 뷰 특정 동작을 제어하는 ​​경우, (나는 거짓로 설정 리소스 편집기에서 메뉴 항목의 검사 속성을 떠날 것을 권 해드립니다, 또한.)

등, 뷰 클래스에 넣어

, 예를 들어, 초기화되어

// 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 멤버 변수를 확인해야합니다 :

다음은 ID_MY_COMMAND 메뉴 항목의 체크 박스의 상태를 제어하는 ​​뷰 클래스를 사용하는 예입니다생성자 또는 OnInitialUpdate 함수.

도움이 되었기를 바랍니다.

2

@ ChrisN의 접근 방식은 (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

다음 대화 애플리케이션을위한 솔루션입니다
관련 문제