使窗体右上角的X按钮失效 |
|||||||||||||||||||||
窗体右上角的X按钮通常用来关闭一个程序,这个小X按钮实际上是和系统菜单的“关闭”菜单项关联在一起的,什么?不知道什么是系统菜单,系统菜单是指我们点击窗体左上角的小图标时所弹出的菜单,其中好象有“恢复”、“移动”、“最大化”、“最小化”、“关闭”这么几个按钮。这个菜单用普通的方法是不能编辑和改变的,但是我们可以通过API函数GetSystemMenu来得到它的句柄,然后通过菜单相关的API函数就能改变它了,下面一起看看怎么做吧。 为了学习方便,下面先给出源码,并且已经作了详细的中文注释: ------------------------------------------- 使窗体右上角的X按钮失效 ------------------------------------------- 程序说明: 本例利用API函数GetSystemMenu得到系统菜单的句柄 X按钮是系统菜单的一菜单项,然后用RemoveMenu函数 删去这一菜单项,也就是使X按钮失效了。 ------------------------------------------- 【VB声明】
【说明】 取得指定窗口的系统菜单的句柄。在vb环境,“系统菜单”的正式名称为“控制菜单”,即单击窗口左上角的控制框时出现的菜单 【返回值】 Long,如执行成功,返回系统菜单的句柄;零意味着出错。如bRevert设为TRUE,也会返回零(简单的恢复原始的系统菜单) 【备注】 在vb里使用:系统菜单会向窗口发送一条WM_SYSCOMMAND消息,而不是WM_COMMAND消息 【参数表】 hwnd ----------- Long,窗口的句柄 bRevert -------- Long,如设为TRUE,表示接收原始的系统菜单
【VB声明】
【说明】 删除指定的菜单条目。如删除的条目属于一个弹出式菜单,那么这个函数不会同时删除弹出式菜单。首先应该用GetSubMenu函数取得弹出式菜单的句柄,再在以后将其删除 【返回值】 Long,非零表示成功,零表示失败。会设置GetLastError 【备注】 强烈建议大家使用vb菜单的visible属性从菜单中删除条目,而不要用这个函数,否则会造成指定菜单中其他菜单条目的visible属性对错误的菜单条目产生影响 【参数表】 hMenu ---------- Long,菜单的句柄 nPosition ------ Long,欲改变的菜单条目的标识符。如在wFlags参数中指定了MF_BYCOMMAND,这个参数就代表欲改变的菜单条目的命令ID。如设置的是MF_BYPOSITION,这个参数就代表菜单条目在菜单中的位置(第一个条目的位置为零) wFlags --------- Long,常数MF_BYCOMMAND或MF_BYPOSITION,取决于nPosition参数
程序中用到了两个API函数GetSystemMenu、RemoveMenu,其中GetSystemMenu函数用来得到系统菜单的句柄,RemoveMenu用来删除指定的菜单条目,我们先来看看这个函数的声明和参数:
其中各GetSystemMenu参数的意义如下表:
而RemoveMenu参数的意义如下表:
然后就可以在程序中使用这两个函数了,我们在窗体的Form_Load()过程中加入如下代码: MyMenu = GetSystemMenu(Me.hwnd,0) 得到系统菜单的句柄,Me.hwnd表示当前窗体的句柄 RemoveMenu MyMenu, &HF060, MF_BYCOMMAND 移去“关闭”菜单项,&HF060“关闭”菜单项的命令ID 接着我们运行程序,看看窗体右上角的X按钮是不是已经不可点击了,系统菜单中的“关闭”项也消失了,很有趣,不过一定记着为程序留一个“退出”按钮哦! |