功能为:往view窗口输入 信息(姓名 电话)然后回车,则在子菜单的菜单项增加一项。通过点击增加的菜单项,又可以显示 窗口输入的信息(姓名 电话)
1. 在View类中增加一个windows消息响应WM_CHAR,这样所有键盘的消息都会在OnChar消息响应函数中被捕获。实现函数 参看代码注释
void CxxxxView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CClientDC dc(this);
if(0x0d == nChar)
{
if(0 == ++m_nIndex)//m_nIndex 为view类 新增加的的成员变量,在构造函数中初始化为-1.
//第一次回车增加一个子菜单
{
m_menu.CreatePopupMenu();//m_menu 为CMenu的对象 为view类新增的成员变量
//创建弹出菜单
GetParent()->GetMenu()->AppendMenuW(MF_POPUP,(UINT)m_menu.m_hMenu,L"PhoneBook");//在view类中获取属于框架类的菜单栏
GetParent()->DrawMenuBar();//让框架类去刷新menu bar.
}
m_menu.AppendMenuW(MF_STRING,ID_ABC_PHONE1+m_nIndex,m_strLine.Left(m_strLine.Find(' ')));//往子菜单m_menu追加菜单项
//取空格' '左边的字符作为菜单项名字
//ID_ABC_PHONE1为创建的第一个子菜单项ID
m_strArray.Add(m_strLine);// m_strArray 为view类public, CStringArray 类型.(CSting的集合类)
//保存回车后strLine上的串字符,所有的输入的字符串就保留在数组中了.
m_strLine.Empty();//回车后清空之前的字符串
Invalidate();//默认就是TRUE ,所以不用给参数。先前输入的内容会被擦除,视类窗口看不到。
}
else//增加子菜单项
{
m_strLine +=(char)nChar; //m_strLine是View类新增的CString成员对象,在构造函数中初始化为"";
dc.TextOutW(0,0,m_strLine);//使用ClientDC 在0,0位置逐步输出
}
CView::OnChar(nChar, nRepCnt, nFlags);
}
2. 采用先在 资源视图 增加一个子菜单和子菜单的菜单项,然后给菜单项增加事件处理,最后删除的子菜单的方式(这种方式请自行理解) ,分别增加了4个OnAbcPhoneN (n=1,2,3,4)的响应函数;参看代码注释.
void Cvs2008_SX_JiaoCheng06_1View::OnAbcPhone1()
{
// TODO: 在此添加命令处理程序代码
CClientDC dc(this);
dc.TextOutW(0,0,m_strArray.GetAt(0));//获取全局成员输出中保存的字符,通过dc打印出来
}
void Cvs2008_SX_JiaoCheng06_1View::OnAbcPhont2()
{
// TODO: 在此添加命令处理程序代码
CClientDC dc(this);
dc.TextOutW(0,0,m_strArray.GetAt(1));//获取全局成员输出中保存的字符,通过dc打印出来。
}
void Cvs2008_SX_JiaoCheng06_1View::OnAbcPhone3()
{
// TODO: 在此添加命令处理程序代码
CClientDC dc(this);
dc.TextOutW(0,0,m_strArray.GetAt(2));//获取全局成员输出中保存的字符,通过dc打印出来。
}
void Cvs2008_SX_JiaoCheng06_1View::OnAbcPhone4()
{
// TODO: 在此添加命令处理程序代码
CClientDC dc(this);
dc.TextOutW(0,0,m_strArray.GetAt(3));//获取全局成员输出中保存的字符,通过dc打印出来。
}
注意:相关类及类成员 可以查看MSDN文件,还是有帮助的。
链接:https://pan.baidu.com/s/1UPpu61qQMQGk4kLjYl5WbQ
提取码:a620