两年前的文章,拿出来充充门面。
——————————————————————
用BCB改窗体系统菜单
( 作者:mikespook | 发布日期:2002-12-8 | 浏览次数:133 )
关键字:BCB,系统菜单,消息映射表 |
我们在用一些软件时会发现,这些软件的系统菜单并不是标准的,可能少几项,可能多几项,也可能默认的系统菜单已经变得面目全非。 图1是一个标准的系统菜单。图2是经过修改的系统菜单。下面我就用这个例子给大家简单介绍一下系统菜单的修改方法。 图1 图2 新建一个工程(New Application)。将主窗体命名为“frm_main”。在Tfrm_main::FormCreate()函数中添加以下代码: void __fastcall Tfrm_main::FormCreate(TObject *Sender) { HMENU system_menu = GetSystemMenu(Handle, false); //取得窗体系统菜单的句柄 DeleteMenu(system_menu, 4, MF_BYPOSITION);//删掉系统菜单的第一项 AppendMenu(system_menu, MF_STRING, ID_About_Menu, "关于(&A)");//添加一个“关于”菜单项 ModifyMenu(system_menu, 0, MF_STRING, ID_NULL_Menu, "NULL");//修改菜单项,将分隔符号改为“NULL” } 以上用到了GetSystemMenu()、DeleteMenu()、AppendMenu()、ModifyMenu()这四个API函数,具体用法请查阅MSDN或win32sdk.hlp帮助文件(BCB安装盘中有)。 好了,现在让我们运行一下看看。按F9运行程序,呼出系统菜单。正如我们所预期的那样,系统菜单已经修改成功。这样就完了么?你点击我们新添加的菜单项试试,什么也没有发生。这是因为我们没有对单击该菜单项这个消息进行处理。幸好功能强大的BCB给我们留了一个后门,允许我们拦截windows消息。 下面继续我们的手术。在主窗体头文件frmmain.h中Tfrm_main类定义的末尾加入消息映射表: BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_SYSCOMMAND, TMessage, sysmenuOnClick) END_MESSAGE_MAP(TForm) 其中WM_SYSCOMMAND就是我们要拦截处理的消息。当我们拦截到WM_SYSCOMMAND消息时就交由sysmenuOnClick()函数处理。 在Tfrm_main类定义中添加 private: void __fastcall sysmenuOnClick(TMessage &Message); 在主窗体文件frmmain.cpp中添加消息处理函数的内容,比如这里我们让点击菜单项后弹出“关于”对话框: void __fastcall Tfrm_main::sysmenuOnClick(TMessage &Message) { //这里判断WM_SYSCOMMAND消息是点击哪个菜单项发出的 switch(Message.WParam){ case ID_About_Menu: Application->MessageBoxA("作者:mikespook 2002.5.24", "关于", MB_OK); break; case ID_NULL_Menu: Application->MessageBoxA("你点击了名为“NULL”的菜单", "注意", MB_OK); break; default: break; } // 下面这句是让消息继续传递下去。没有这句的话,消息将被完全拦截,而造成程序出错。 TForm::Dispatch(&Message); } 好了,现在大家再运行程序试试。是不是一切OK了?相信你已经对修改系统菜单有了一个大概的了解。那么就充分发挥你的想象力,充分利用系统菜单吧。 |