문제

사용자가 확인/선택 취소 할 수있는 체크 마크처럼 작동하는 메뉴 항목을 추가하려고하며 다른 클래스는 해당 메뉴 항목의 체크 마크 상태를 볼 수 있습니다. 메뉴 옵션 (팝업 옵션 포함)을위한 클래스를 만드는 제안을 받았지만 Visual Studio 2005의 리소스 레이아웃 편집기에있을 때 메뉴 옵션을위한 클래스를 만들 수 없습니다. 내가 설명한 것을 수행 할 수있는 메뉴 항목을 만드는 가장 쉬운 방법에 대한 제안을 듣습니다.

도움이 되었습니까?

해결책 3

getMenu () 메소드를 사용하여 메인 프레임에서 메뉴를 검색 한 다음 해당 메뉴 객체와 ID 번호를 사용하여 getMenustate () 함수뿐만 아니라 올바른 플래그로 CheckMenuitem ()을 호출했습니다.

다른 팁

당신은 사용해야합니다 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 기능.

이게 도움이 되길 바란다!

@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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top