欢迎来到天天文库
浏览记录
ID:41033565
大小:90.00 KB
页数:5页
时间:2019-08-14
《系统菜单编程》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、系统菜单系统菜单是每个Windows程序的标准特性。通常系统菜单由Windows系统来管理,所以我们平时写程序时很少去碰它。但是,有的时候,我们确实想定制自己的系统菜单项。这样就涉及到定制菜单的处理问题,因为Windows无法自动处理我们定制的系统菜单。而且,系统菜单的处理方式与常规的菜单处理是不同的。添加菜单项首先在资源定义文件resource.h中定义菜单项标识,也可以在标准头文件中定义。菜单项标识必须具有唯一性。其次,Windows对系统菜单的处理与常规菜单的处理方法是不同的,不管是缺省的
2、菜单还是定制的菜单,它们都没有像常规菜单命令那样的消息处理例程。假设我们要添加两个定制的系统单:#defineIDM_EXIT0x0020添加菜单项的命令是在对话框的初始化例程以及窗口创建函数(OnInitDialog(),OnCreate())中进行的。如:BOOLCBabelOnDlg::OnInitDialog(){CDialog::OnInitDialog();//在系统菜单中添加"退出"菜单项//解决Windows95中的bugASSERT((IDM_EXIT&0xFFF0)==IDM
3、_EXIT);//命令ID必须在预定义的系统菜单之后ASSERT(IDM_EXIT<0xF000);CMenu*pSysMenu=GetSystemMenu(false);if(pSysMenu!=NULL){pSysMenu->AppendMenu(MF_STRING,IDM_EXIT,"退出(&x)");}//otherinitialization}这里在添加每个菜单前都有两个ASSERT语句,第一个ASSERT的目的是修复Windows95中存在的Bug,第二个ASSERT保证定制的命令I
4、D是在预定义的系统菜单之后,以免发生冲突。查一下MSDN库的MFC文档关于系统菜单的描述,你会发现下面的内容:“......所有预定义的控制菜单项(也就是系统菜单)的ID号必须大于0xF000。如果某个应用程序要添加系统菜单,其系统菜单的ID号必须小于F000。”接下来,用GetSystemMenu函数获取系统菜单指针。调用时使用参数false获取指针。如果用true作为参数,那么该函数会将菜单重置回缺省状态。如果得到的指针有效,接着调用菜单添加命令在系统菜单后面添加菜单项,传递菜单ID以及菜单
5、显示时所用的字符串。处理定制的系统菜单命令 为了让这些系统菜单命令工作起来,我们不能依赖常规的菜单消息处理机制----即便菜单项相同。通常系统菜单通过WM_SYSCOMMAND消息处理:voidCBabelOnDlg::OnSysCommand(UINTnID,LPARAMlParam){//trapourownsystemmenumessagesif((nID&0xFFF0)==IDM_ABOUTBOX){CAboutDlgdlgAbout;dlgAbout.DoModal();}else
6、if((nID&0xFFF0)==SC_CLOSE){OnClose();}elseif((nID&0xFFF0)==IDM_EXIT){AfxMessageBox(_T("您已经退出了系统!"));}else{CDialog::OnSysCommand(nID,lParam);}}通过比较传入的菜单ID进行相应的处理。注意代码中又有两个“nID&0xFFF0”,这主要也是解决Windows95的bug。如果选择“退出”,那么会弹出"您已经退出了系统!"注意第一个条件检查:SC_CLOSE是个预
7、定义的菜单常量。一般它是由Windows处理的。如果传入的菜单ID不等于任何定制的菜单项,那么就让Windows对它进行默认处理:CDialog::OnSysCommand(nID,lParam);下面是几个最常用的系统菜单命令: 菜单说明SC_CLOSE关闭CWnd对象SC_MAXIMIZE或者SC_ZOOM最大化CWnd对象SC_MINIMIZE或者SC_ICON最小化CWnd对象SC_MOVE移动CWnd对象SC_RESTORE恢复窗口的正常位置和大小SC_SIZE改变CWnd对象大小其它
8、的几个系统菜单命令一般都是在特殊情况下才使用,有关细节请参考有关WM_SYSCOMMAND的文档。修改现有的菜单命令我们已经看到,系统菜单本身默认的处理行为是可以改变的,除此之外,系统菜单项的描述文本也是可以改变的,甚至还可以删除它们。为了修改菜单命令的描述文本,我们可以用pSysMenu指针调用ModifyMenu()函数。例如,如果想要把“关闭”菜单项改成“隐藏”,可以象下面这么做:在OnInitDialog()中加入如下语句:pSysMenu->ModifyMenu(SC_CLOSE,MF
此文档下载收益归作者所有