2

最初に、私が持っているものを説明させてください:
シナリオ: CMFCMenuButtonをロードしたCMenu、ダイアログ
テスト:メニューの項目をクリック
結果:メッセージ マップはCMFCMenuButton、メニューの ID ではなく、の ID
を取得します 実際の取得方法クリックされたメニュー ID:使用CMFCMenuButton::m_nMenuResult

このダイアログにメニュー項目とボタンが必要であり、メニュー項目と ID を共有するボタンが必要です。

そのため、メニュー ボタン用に作成したハンドラーで、それを取得しm_nMenuResultてダイアログに送信したり、やりたいことを実行したりできますが、それがどのように機能するかはわかりませんCMFCMenuButton。それを行う正しい方法は何ですか?

コード

これを再現する方法の例を次に示します。
OnMenu関数のコードを再利用するためだけに使用しましON_COMMAND_RANGEIDC_MFCMENUBUTTON1

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
}
4

1 に答える 1

0

メニュー ボタンのBN_CLICKEDのハンドラーをコーディングすると、クリックがボタン上にある場合はm_nMenuResultに対して 0 で応答します。または、m_nMenuResultには選択されたメニュー項目の ID が含まれます。それがあなたが望んでいたものではない場合、ボタンの動作方法と戦っていると思います. 他の唯一のオプションは、独自のクラスを作成してメニュー ボタンを表し、必要な動作を追加することです。

于 2015-06-22T15:25:41.333 に答える