MFC1.菜单消息

来源:互联网 发布:软件著作权网上 编辑:程序博客网 时间:2024/06/08 01:14

菜单消息知识

编译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();
 
 
原创粉丝点击