Как правильно отправить CMFCMenuButton выбранный идентификатор на карту сообщений?

Во -первых, позвольте мне описать, что у меня есть:
сценарий: CMFCMenuButton, загруженный с CMenu в диалоге
тест: нажмите на пункт меню
результат: карта сообщений получит идентификатор CMFCMenuButton а не идентификатор меню
как получить фактический идентификатор меню нажал: использовать CMFCMenuButton::m_nMenuResult

Идея состоит в том, что я хочу, чтобы в этом диалоговом окне были пункты и кнопки, а также были бы кнопки, которые делят идентификаторы с пунктами меню.

Так что в обработчике, который я создал для кнопки меню, я могу получить m_nMenuResult и отправить его в диалог или сделать все, что я хочу, но это не так, как CMFCMenuButton должно сработать. Как правильно это сделать?

Код

Ниже приведен пример того, как вы можете воспроизвести это.
Я использовал ON_COMMAND_RANGE также с IDC_MFCMENUBUTTON1 просто повторно использовать код для функции OnMenu

void CRepositionDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_MFCMENUBUTTON1, m_cmfcMenuButton);
}


BEGIN_MESSAGE_MAP(CRepositionDlg, CDialog)
    ON_COMMAND_RANGE(IDC_MFCMENUBUTTON1,IDC_MFCMENUBUTTON1,OnMenu)

    ON_COMMAND_RANGE(IDC_MENU1, IDC_MENU11, OnMenu)
END_MESSAGE_MAP()


// CRepositionDlg message handlers

afx_msg void CRepositionDlg::OnMenu(UINT nID)
{
    CString csMessage;
    csMessage.Format(L"OnMenu(%d)",nID);
    AfxMessageBox(csMessage);
    if(nID == IDC_MFCMENUBUTTON1)
    {
        OnMenu(m_cmfcMenuButton.m_nMenuResult);
    }
}


BOOL CRepositionDlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // TODO:  Add extra initialization here

    CMenu* pMenu = new CMenu;
    pMenu->CreatePopupMenu();
    for(int i = IDC_MENU1; i <= IDC_MENU11; i++)
    {
        CString csMenu;
        csMenu.Format(L"menu %d",i);
        pMenu->AppendMenuW(MF_STRING,i,csMenu);
    }
    m_cmfcMenuButton.m_hMenu = pMenu->GetSafeHmenu();
    return TRUE;  // return TRUE unless you set the focus to a control
    // EXCEPTION: OCX Property Pages should return FALSE
}

1 ответ

Решение

Если вы закодируете обработчик для BN_CLICKED для кнопки меню, он ответит 0 для m_nMenuResult, если щелчок по кнопке, или m_nMenuResult будет содержать идентификатор выбранного пункта меню. Если это не то, что вы хотели, я думаю, вы боретесь против того, как работает кнопка. Единственным другим вариантом будет создание собственного класса для представления кнопки меню и добавления желаемого поведения.

Другие вопросы по тегам