最初に、私が持っているものを説明させてください:
シナリオ: CMFCMenuButton
をロードしたCMenu
、ダイアログ
テスト:メニューの項目をクリック
結果:メッセージ マップはCMFCMenuButton
、メニューの ID ではなく、の ID
を取得します 実際の取得方法クリックされたメニュー ID:使用CMFCMenuButton::m_nMenuResult
このダイアログにメニュー項目とボタンが必要であり、メニュー項目と ID を共有するボタンが必要です。
そのため、メニュー ボタン用に作成したハンドラーで、それを取得しm_nMenuResult
てダイアログに送信したり、やりたいことを実行したりできますが、それがどのように機能するかはわかりませんCMFCMenuButton
。それを行う正しい方法は何ですか?
コード
これを再現する方法の例を次に示します。OnMenu関数のコードを再利用するためだけに使用しまし
ON_COMMAND_RANGE
たIDC_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
}