MFC动态添加菜单并响应,优缺点(响应函数不能动态添加)

方案一:在视类中处理

头文件部分(不全)

public:
afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
private:
// 用来记录当前是第几次按下回车键
int m_nIndex;
// 为视类增加一个CMenu 类成员变量,用于动态创建新的子菜单
CMenu m_menu;
// 用于保存输入的字符
CString m_strLine;
public:
// 用来保存所有的字符串,即输入的所有联系方式
CStringArray m_strArray;
afx_msg void OnPhone1();
afx_msg void OnPhone2();
afx_msg void OnPhone3();
afx_msg void OnPhone4();

映射管理:

ON_COMMAND(ID_32771, &CMFC_PhoneBookView::OnPhone1)
ON_COMMAND(ID_32772, &CMFC_PhoneBookView::OnPhone2)
ON_COMMAND(ID_32773, &CMFC_PhoneBookView::OnPhone3)
ON_COMMAND(ID_32774, &CMFC_PhoneBookView::OnPhone4)

字符响应函数(动态添加菜单项):

void CMFC_PhoneBookView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{
// TODO: Add your message handler code here and/or call default
CClientDC dc(this);
if (0x0d==nChar)
{
if (0==++m_nIndex)
{
m_menu.CreatePopupMenu();
GetParent()->GetMenu()->AppendMenu(MF_POPUP,(UINT)m_menu.m_hMenu,_T("通讯录(P)"));
GetParent()->DrawMenuBar();
MessageBox(_T("通讯录"));
}
//动态添加子菜单
m_menu.AppendMenu(MF_STRING,32771+m_nIndex,m_strLine.Left(m_strLine.Find(_T(" "))));
m_strArray.Add(m_strLine);
m_strLine.Empty();
//更新窗口,让窗口的客户区无效
Invalidate();
}
else
{
// CFont font;
// font.CreatePointFont(300,_T("华文行楷"),NULL);
// CFont *pOldFont=dc.SelectObject(&font);
m_strLine+=char(nChar);
dc.TextOut(0,0,m_strLine);
// dc.SelectObject(pOldFont);
}
// dc.TextOut(0,20,_T("0123456789"));


CView::OnChar(nChar, nRepCnt, nFlags);

}


方案二:在框架类窗口中截获菜单命令消息(OnCommand函数是重写父类的虚函数,体现了C++的多态性),如果有错误出现,一般是框架类头文件没有添加视类头文件,视类头文件也应该添加Doc类头文件

BOOL CMainFrame::OnCommand(WPARAM wParam, LPARAM lParam)
{
int MenuCmdID=LOWORD(wParam);
CMFC_PhoneBookView *pView=(CMFC_PhoneBookView*)GetActiveView();
if (MenuCmdID>=ID_32771&&MenuCmdID<ID_32771+pView->m_strArray.GetSize())
{
MessageBox(_T("Test"));
CClientDC dc(pView);
dc.TextOut(0,0,pView->m_strArray.GetAt(MenuCmdID-ID_32771));
return TRUE;
}

return 0;

}


//四个响应函数,故只能响应前四个输入的值,即前四项子菜单
void CMFC_PhoneBookView::OnPhone1()
{
// TODO: Add your command handler code here
CClientDC dc(this);
dc.TextOut(0,0,m_strArray.GetAt(0));
}


void CMFC_PhoneBookView::OnPhone2()
{
// TODO: Add your command handler code here
CClientDC dc(this);
dc.TextOut(0,0,m_strArray.GetAt(1));
}


void CMFC_PhoneBookView::OnPhone3()
{
// TODO: Add your command handler code here
CClientDC dc(this);
dc.TextOut(0,0,m_strArray.GetAt(2));
}


void CMFC_PhoneBookView::OnPhone4()
{
// TODO: Add your command handler code here
CClientDC dc(this);
dc.TextOut(0,0,m_strArray.GetAt(3));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值