[오리지널] MFC에서 메뉴 항목 동적 추가 및 응답 메뉴 이벤트

4828 단어

새 단일 문서 프로그램
보기 메뉴 항목에 숨김 도구막대(ID HIDE), 새 메뉴(ID NEWMENU) 등 두 개의 하위 메뉴를 추가합니다.
Resource에서h에 ID 하나 추가NEWMENU 매크로
#define ID_NEWMENU        WM_USER+101
 
작업 도구 모음 및 상태 표시줄
GetDescendantWindow 함수를 사용하여 도구막대 및 상태막대 포인터 가져오기
IDHIDE는 다음과 같은 메시지 매핑을 추가합니다.
    static bool m_Hide=false;
    m_Hide=!m_Hide;
    //       
    CWnd* pWndToolBar=(CWnd*)GetDescendantWindow(AFX_IDW_TOOLBAR);
    //       
    CWnd* pWndStatusBar=(CWnd*)GetDescendantWindow(AFX_IDW_STATUS_BAR);
    CMenu* pMenu=GetMenu();
    CMenu* pSubMenu=pMenu->GetSubMenu(2);
    if(m_Hide)
    {
        pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"     ");
        if(pWndStatusBar!=NULL)    pWndStatusBar->SetWindowText("     ");
        if(pWndToolBar!=NULL)    pWndToolBar->ShowWindow(SW_HIDE);
    }
    else
    {
        pSubMenu->ModifyMenu(ID_HIDE,MF_BYCOMMAND,ID_HIDE,"     ");
        if(pWndStatusBar!=NULL)    pWndStatusBar->SetWindowText("     ");
        if(pWndToolBar!=NULL)    pWndToolBar->ShowWindow(SW_SHOW);
    }

 
동적 추가 하위 메뉴
IDNEWMENU는 다음과 같이 메시지 매핑을 추가합니다.
    static UINT m_NewMenu=ID_NEWMENU+1;
    //    
    CMenu* pMenu=GetMenu();
    //     2    ,  3   
    CMenu* pSubMenu=pMenu->GetSubMenu(2);
    char buffer[1];
    itoa(m_NewMenu-ID_NEWMENU,buffer,10);
    if(m_NewMenu<=ID_NEWMENU+5)
    {
        pSubMenu->AppendMenu(MF_SEPARATOR); //   
        pSubMenu->AppendMenu(MF_STRING | MF_ENABLED,m_NewMenu++,
                                    CString("     ")+buffer);    
    }
    //  m_bAutoMenuEnable true,      View、Document、Frame 
    //                         ,                 
    m_bAutoMenuEnable=false;

 
OnCommand 메시지 맵을 추가하여 추가된 하위 메뉴 항목에 응답합니다. 코드는 다음과 같습니다.
UINT uMsg=LOWORD(wParam);
    for(UINT i=ID_NEWMENU+1;i<=ID_NEWMENU+5;i++)
        if(uMsg==i)
        {
            char buffer[1];
            itoa(i-ID_NEWMENU,buffer,10);
            MessageBox(CString("     ") + buffer);
        }

 
마우스 오른쪽 버튼 클릭 메뉴
View 클래스에 다음과 같은 OnRButtonDown 메시지 매핑을 추가합니다.
    CMenu pPopMenu;
    pPopMenu.CreatePopupMenu();
    if(pPopMenu==NULL);
    pPopMenu.AppendMenu(MF_STRING,ID_NEWMENU+6,"    ");
    this->ClientToScreen(&point);
    pPopMenu.TrackPopupMenu(TPM_LEFTALIGN,point.x,point.y,this);

View 클래스에 OnCommand 메시지 매핑을 추가하여 마우스 오른쪽 버튼 메뉴의 이벤트에 대응
UINT uMsg=LOWORD(wParam);
    if(uMsg==ID_NEWMENU+6)
        MessageBox(CString("    "));

전재 대상:https://www.cnblogs.com/mx113/archive/2009/12/05/1617678.html

좋은 웹페이지 즐겨찾기