动态创建菜单及菜单项过程介绍
2016-10-16 15:20
323 查看
需求描述:
从键盘输入“姓名 电话”格式的电话信息,按回车结束输入。当是第一次完成输入,则在窗口菜单栏追加一个“PhoneBook”的子菜单,同时将姓名作为PhoneBook的菜单项,点击子菜单就输出这个姓名所对应的电话号码,这里最多支持5个菜单项。
第一步:
创建一个MFC单文档功能,我这里去的工程名是Menu2。
第二步:
以下是AppendMenu的函数声明,从MSDN可以得到函数的用法,这里nFlag设置为MF_STRING, 则我们需要预先给定子菜单的ID号,lpszNewItem是子菜单的名字;当nFlags设置为MF_POPUP时,nIDNewItem是菜单对象的句柄。
BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
在Resource.h中添加5个ID号,ID设置如下:
#define IDM_PHONE1 32771
#define IDM_PHONE2 32772
#define IDM_PHONE3 32773
#define IDM_PHONE4 32774
#define IDM_PHONE5 32775
第三步:
在视类中添加消息响应原型、消息映射宏、消息响应代码。
//消息响应原型
afx_msg void OnPhone1();
afx_msg void OnPhone2();
...
BEGIN_MESSAGE_MAP(CMenu2View, CView)
...
//菜单命令消息映射
ON_COMMAND(IDM_PHONE1, &OnPhone1)
ON_COMMAND(IDM_PHONE2, &OnPhone2)
END_MESSAGE_MAP()
//消息响应内容
void CMenu2View::OnPhone1()
{
CClientDC dc(this);
dc.TextOut(0,0,m_arrPhoneBook.GetAt(0));
}
void CMenu2View::OnPhone2()
{
CClientDC dc(this);
dc.TextOut(0,0,m_arrPhoneBook.GetAt(1));
}第四步:
WM_CHAR消息捕获、 子菜单创建、菜单添加,具体代码如下:
void CMenu2View::OnChar(UINT nChar, UINT nRepCnt,UINT nFlags)
{
CClientDC dc(this);
//回车符
if (0x0d == nChar)
{
//创建子菜单
if (0 == m_nIndex)
{
m_Menu.CreatePopupMenu();
CMenu *pMenu = GetParent()->GetMenu();
//子菜单是POPUP类型
pMenu->AppendMenu(MF_POPUP,(UINT_PTR)m_Menu.m_hMenu,"PhoneBook");
//框架类的菜单栏重绘
GetParent()->DrawMenuBar();
}
//添加子菜单
m_Menu.AppendMenu(MF_STRING,IDM_PHONE1 + m_nIndex, m_strText.Left(m_strText.Find(' ')));
//保存电话信息
m_arrPhoneBook.Add(m_strText);
//清空当前字符输入
m_strText.Empty();
m_nIndex++;
//使客户区失效,并背景重绘
Invalidate(TRUE);
}
else
{
//显示当前输入内容
m_strText += (unsigned char)nChar;
dc.TextOut(0,0, m_strText);
}
CView::OnChar(nChar, nRepCnt, nFlags);
}运行效果:
从键盘输入“姓名 电话”格式的电话信息,按回车结束输入。当是第一次完成输入,则在窗口菜单栏追加一个“PhoneBook”的子菜单,同时将姓名作为PhoneBook的菜单项,点击子菜单就输出这个姓名所对应的电话号码,这里最多支持5个菜单项。
第一步:
创建一个MFC单文档功能,我这里去的工程名是Menu2。
第二步:
以下是AppendMenu的函数声明,从MSDN可以得到函数的用法,这里nFlag设置为MF_STRING, 则我们需要预先给定子菜单的ID号,lpszNewItem是子菜单的名字;当nFlags设置为MF_POPUP时,nIDNewItem是菜单对象的句柄。
BOOL AppendMenu( UINT nFlags, UINT nIDNewItem = 0, LPCTSTR lpszNewItem = NULL );
在Resource.h中添加5个ID号,ID设置如下:
#define IDM_PHONE1 32771
#define IDM_PHONE2 32772
#define IDM_PHONE3 32773
#define IDM_PHONE4 32774
#define IDM_PHONE5 32775
第三步:
在视类中添加消息响应原型、消息映射宏、消息响应代码。
//消息响应原型
afx_msg void OnPhone1();
afx_msg void OnPhone2();
...
BEGIN_MESSAGE_MAP(CMenu2View, CView)
...
//菜单命令消息映射
ON_COMMAND(IDM_PHONE1, &OnPhone1)
ON_COMMAND(IDM_PHONE2, &OnPhone2)
END_MESSAGE_MAP()
//消息响应内容
void CMenu2View::OnPhone1()
{
CClientDC dc(this);
dc.TextOut(0,0,m_arrPhoneBook.GetAt(0));
}
void CMenu2View::OnPhone2()
{
CClientDC dc(this);
dc.TextOut(0,0,m_arrPhoneBook.GetAt(1));
}第四步:
WM_CHAR消息捕获、 子菜单创建、菜单添加,具体代码如下:
void CMenu2View::OnChar(UINT nChar, UINT nRepCnt,UINT nFlags)
{
CClientDC dc(this);
//回车符
if (0x0d == nChar)
{
//创建子菜单
if (0 == m_nIndex)
{
m_Menu.CreatePopupMenu();
CMenu *pMenu = GetParent()->GetMenu();
//子菜单是POPUP类型
pMenu->AppendMenu(MF_POPUP,(UINT_PTR)m_Menu.m_hMenu,"PhoneBook");
//框架类的菜单栏重绘
GetParent()->DrawMenuBar();
}
//添加子菜单
m_Menu.AppendMenu(MF_STRING,IDM_PHONE1 + m_nIndex, m_strText.Left(m_strText.Find(' ')));
//保存电话信息
m_arrPhoneBook.Add(m_strText);
//清空当前字符输入
m_strText.Empty();
m_nIndex++;
//使客户区失效,并背景重绘
Invalidate(TRUE);
}
else
{
//显示当前输入内容
m_strText += (unsigned char)nChar;
dc.TextOut(0,0, m_strText);
}
CView::OnChar(nChar, nRepCnt, nFlags);
}运行效果:
相关文章推荐
- 动态创建菜单和动态关联菜单项事件
- MFC中动态创建N级菜单以及响应事件——续——动态添加菜单/菜单项、子菜单、右键菜单
- C#入门学习-----菜单应用(添加剂快捷方式、设置菜单项是否可用、修改菜单字体、创建级联菜单、级联菜单的动态合并)
- ArcEngine java 如何创建自定义菜单、环境菜单、调色板以及动态菜单项
- 动态创建菜单和动态关联菜单项事件
- 动态创建菜单和动态关联菜单项事件
- 动态创建表存储过程
- 关于datagrid的使用以及动态修改,以及使用存储过程的介绍
- 动态创建SQL Server数据库、表、存储过程等架构信息
- 动态创建菜单,添加菜单,执行自己的菜单事件
- 动态菜单 动态地决定某个菜单项的显示与否(From Forum Nokia Wiki)
- 动态创建菜单项
- 动态创建菜单,添加菜单,执行自己的菜单事件
- 总结Asp.net中Page加载PostData的具体过程 进而解决"获取动态创建的控件的PostData数据"问题
- 用C#与XML创建动态分层菜单
- 总结Asp.net中Page加载PostData的具体过程 进而解决"获取动态创建的控件的PostData数据"问题
- 动态创建SQL Server数据库、表、存储过程等架构信息
- 菜单学习和动态创建菜单
- 用C#与XML创建动态分层菜单
- 两个存储过程:一、使用存储过程动态创建数据表。二、插入新记录。