菜单消息知识
编译VC++6.0测试通过
1.菜单消息和外观控制
2.菜单动态添加,修改,删除
************************************************************
ON_COMMAND:添加菜单响应代码的消息
UPDATE_COMMAND_UI:添加外观菜单控制的消息
SetCheck:设置每个菜单是否有check
enable:设置此菜单是否可用
************************************************************
1.菜单消息和外观控制
如M2菜单,下面有AA,BB,CC,DD4个字菜单,
当我们用鼠标单击XX菜单它自动选中,
并显示一个选中标记?
代码案例:如何制作一组具有选项的菜单
*************************************************单文档界面代码:
第一步:
*.RC资源文件的菜单ID
一级菜单M2,子菜单ID分别为
ID:ID_2100
caption:AA
ID:ID_2200
caption:BB
ID:ID_2300
caption:CC
ID:ID_2400
caption:DD
在视图的头文件中定义下面代码
XXXVIEW.h 头文件开始处定义两个数组int变量
static int M2_ID[] = {ID_2100,ID_2200,ID_2300,ID_2400};//保存4个菜单ID,以方便调用
//添加一个私有变量,用于读取并保存4个菜单中任意一个ID
private:
int m_m2sub;
//添加一个公用函数
public:
void checkm2(); //处理菜单的单击消息
void OnUpdatem2(CCmdUI*); //处理菜单的外观是否有checked标记
/************************************************/
第二步:
在视图的*.CPP文件中定义下面代码
添加两个成员函数实现代码, ID_2100,ID_2200,ID_2300,ID_2400
//视图类名要根据自己的视图类改成自己的
如建立的工程为menu1,则视图类名::checkm2()变成CMenu1View::checkm2()
void 视图类名::checkm2()
//处理菜单的单击消息
{
int nID = (UINT) LOWORD( GetCurrentMessage()->wParam );
//取菜单消息ID
for( int i=0; i<sizeof(M2_ID)/sizeof(int); i++ )
//循环数组M2_ID[]元素个数
//如果菜单消息与M2_ID[]中一个相同,则把菜单ID存入类的私有变量m_m2sub
{if( nID == M2_ID[i] ){
m_m2sub = M2_ID[i]; break;} }
}
void 视图类名::OnUpdatem2(CCmdUI* pCmdUI)//处理菜单的外观是否有checked标记
{//m_nID 是CCmdUI类的一个成员,表示菜单的ID
for( int i=0; i<sizeof(M2_ID)/sizeof(int); i++ )
{
if( (int) pCmdUI->m_nID == M2_ID[i] )//如果当前菜单ID和M2_ID[]元素之一相同
//判断checkm2()函数m_m2sub变量的菜单ID是否与菜单名字相同,相同则设置checked标记
{pCmdUI->SetCheck( m_m2sub == M2_ID[i] );break;}
}
}
/************************************************/
第三步:
设置4个菜单的单击事件的消息指向一个函数checkm2
处理此视图的*.CPP文件的消息映射,把4个菜单的单击消息指向同一个消息处理函数
用类向导分别为ID_2100,ID_2200,ID_2300,ID_2400添加4个ON_COMMAND函数
ON_COMMAND(ID_2100, ID_2100)
ON_COMMAND(ID_2200, ID_2200)
ON_COMMAND(ID_2300, ID_2300)
ON_COMMAND(ID_2400, ID_2400)
//DECLARE_MESSAGE_MAP()
删除类向导生成的下面4个菜单消息处理函数
void CMenu1View::ID_2100(){}
void CMenu1View::ID_2200(){}
void CMenu1View::ID_2300(){}
void CMenu1View::ID_2400(){}
把消息映射的处理函数全修改为由checkm2函数来处理
ON_COMMAND(ID_2100, checkm2)
ON_COMMAND(ID_2200, checkm2)
ON_COMMAND(ID_2300, checkm2)
ON_COMMAND(ID_2400, checkm2)
/************************************************/
第四步:
设置4个菜单的外观界面控制enable/check属性的控制全指向一个函数
处理此视图的*.CPP文件的消息映射,把4个菜单的外观界面控制指向同一个消息处理函数
用类向导分别为ID_2100,ID_2200,ID_2300,ID_2400添加4个ON_UPDATE_COMMAND_UI函数
ON_UPDATE_COMMAND_UI(ID_2100, OnUpdate2100)
ON_UPDATE_COMMAND_UI(ID_2200, OnUpdate2200)
ON_UPDATE_COMMAND_UI(ID_2300, OnUpdate2300)
ON_UPDATE_COMMAND_UI(ID_2400, OnUpdate2400)
//DECLARE_MESSAGE_MAP()
删除类向导生成的下面4个消息处理函数
void CMenu1View::OnUpdate2100(){}
void CMenu1View::OnUpdate2200(){}
void CMenu1View::OnUpdate2300(){}
void CMenu1View::OnUpdate2400(){}
把消息映射的处理函数全修改为由OnUpdatem2函数来处理
ON_UPDATE_COMMAND_UI(ID_2100, OnUpdatem2)
ON_UPDATE_COMMAND_UI(ID_2200, OnUpdatem2)
ON_UPDATE_COMMAND_UI(ID_2300, OnUpdatem2)
ON_UPDATE_COMMAND_UI(ID_2400, OnUpdatem2)
***ON_UPDATE_COMMAND_UI生成的函数名字最好让类向导自动生成,菜单ID_2100就会生成update2100函数名字
/************************************************/
完成
3.管理菜单
获取子菜单
Cmenu* pmenu=GetMenu();
Cmenu* pmenusub=pmenu->GetSubMenu(1);
添加,删除菜单,弹出菜单
appendMenu()
GetMenuItemID()
GetMenuString()
EanbleMenutItem()
InsertItem()
RemoveItem()
更新客户区数据
InvalidateRect( NULL, TRUE );
UpdateWindow();