使窗体右上角的X按钮失效 
   
  
  窗体右上角的X按钮通常用来关闭一个程序,这个小X按钮实际上是和系统菜单的“关闭”菜单项关联在一起的,什么?不知道什么是系统菜单,系统菜单是指我们点击窗体左上角的小图标时所弹出的菜单,其中好象有“恢复”、“移动”、“最大化”、“最小化”、“关闭”这么几个按钮。这个菜单用普通的方法是不能编辑和改变的,但是我们可以通过API函数GetSystemMenu来得到它的句柄,然后通过菜单相关的API函数就能改变它了,下面一起看看怎么做吧。    程序中用到了两个API函数GetSystemMenu、RemoveMenu,其中GetSystemMenu函数用来得到系统菜单的句柄,RemoveMenu用来删除指定的菜单条目,我们先来看看这个函数的声明和参数:   Private Declare Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long   Private Declare Function RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long  其中各GetSystemMenu参数的意义如下表:参数: 意义 
hwnd Long, 系统菜单所在窗口的句柄
 
bRevert Long,如设为TRUE,表示恢复原始的系统菜单
 
返回值 Long,如执行成功,返回系统菜单的句柄;零意味着出错。如bRevert设为TRUE,也会返回零(简单的恢复原始的系统菜单)   而RemoveMenu参数的意义如下表:参数: 意义 
hMenu Long,菜单的句柄
 
nPosition Long,欲改变的菜单条目的标识符。如在wFlags参数中指定了MF_BYCOMMAND,这个参数就代表欲改变的菜单条目的命令ID。如设置的是MF_BYPOSITION,这个参数就代表菜单条目在菜单中的位置(第一个条目的位置为零)
 
wFlags Long,常数MF_BYCOMMAND=&H0&或MF_BYPOSITION=&H400&,取决于nPosition参数 
返回值 Long,非零表示成功,零表示失败。   然后就可以在程序中使用这两个函数了,我们在窗体的Form_Load()过程中加入如下代码:   MyMenu = GetSystemMenu(Me.hwnd,0)    '得到系统菜单的句柄,Me.hwnd表示当前窗体的句柄   RemoveMenu MyMenu, &HF060, MF_BYCOMMAND '移去“关闭”菜单项,&HF060“关闭”菜单项的命令ID  接着我们运行程序,看看窗体右上角的X按钮是不是已经不可点击了,系统菜单中的“关闭”项也消失了,很有趣,不过一定记着为程序留一个“退出”按钮哦!

解决方案 »

  1.   

    如何使窗体右上角的"X"无效?   
          
        要Disable Form "X" -->Close的功能(便暗灰色),事实上便是从Form左上方的SystemMenu将关闭的MenuItem去除掉便可以了,去除后,又该如何,那便是在将关闭(Close)的MenuItem加回去 但这里有个小问题,加回去之后"X"仍是暗灰色,要等到我们做了某些固定的动作之后(如TittleBar上Click一下,或选一下SystemMenu等), 我不知道让TittleBar上的这些东西Refresh要送什么消息,所以现在我暂且Send一个在TittleBar上按下Mouse左键的消息给窗体,令"X"能出现的Enable颜色
    在窗体上放置一个Command Button,输入以下代码,运行,点击一下Command Button 就可使"X" Enable.
    Private Declare Function GetSystemMenu Lib "User32" (ByVal hwnd As Long, ByVal bRevert As Long) As Long
    Private Declare Function DeleteMenu Lib "User32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
    Private Declare Function AppendMenu Lib "User32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long
    Private Declare Function GetMenuString Lib "User32" Alias "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, ByVal nMaxCount As Long, ByVal wFlag As Long) As Long
    Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Const WM_NCLBUTTONDBLCLK = &HA3
    Const WM_NCLBUTTONDOWN = &HA1
    Const HTCAPTION = 2
    Const MF_STRING = &H0&
    Const MF_BYCOMMAND = &H0&
    Const SC_CLOSE = &HF060
    Private hMenu As Long
    Private CloseStr As String '纪录Close MenuItem的字符串
    Private Sub Command1_Click()
    '将"关闭"的那个MenuItem重新加入
    Call AppendMenu(hMenu, MF_STRING, SC_CLOSE, CloseStr)
    '令"X"出现Enable的颜色
    Call SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
    End Sub
    Private Sub Form_Load()
    hMenu = GetSystemMenu(Me.hwnd, 0)
    CloseStr = String(255, 0)
    'SC_CLOSE即是"关闭"的MenuItem ID
    Call GetMenuString(hMenu, SC_CLOSE, CloseStr, 256, MF_BYCOMMAND)
    CloseStr = Left(CloseStr, InStr(1, CloseStr, Chr(0)) - 1)
    Call DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
    End Sub
      

  2.   

    form1.controlbox=false 
    不能给只读的 赋值
      

  3.   

    '同意楼上的
    'API函数的声明。
    Private Declare Function GetSystemMenu Lib "User32" (ByVal hWnd As Long, ByVal bRevert As Long) As Long
    Private Declare Function DeleteMenu Lib "User32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
    Private Declare Function AppendMenu Lib "User32" Alias "AppendMenuA" (ByVal hMenu As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) As Long
    Private Declare Function GetMenuString Lib "User32" Alias "GetMenuStringA" (ByVal hMenu As Long, ByVal wIDItem As Long, ByVal lpString As String, ByVal nMaxCount As Long, ByVal wFlag As Long) As Long
    Private Declare Function SendMessage Lib "User32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongConst WM_NCLBUTTONDBLCLK = &HA3
    Const WM_NCLBUTTONDOWN = &HA1
    Const HTCAPTION = 2
    Const MF_STRING = &H0&
    Const MF_BYCOMMAND = &H0&
    Const SC_CLOSE = &HF060
    '变量的声明
    Private hMenu As Long
    '记录Close MenuItem的字串
    Private CloseStr As String'Command1的Click事件将"关闭"的那一个MenuItem 加回来
    Private Sub Command1_Click()
        Call AppendMenu(hMenu, MF_STRING, SC_CLOSE, CloseStr)
        '令"×"能出现Enable的颜色
        Call SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
    End Sub'Command2的Click事件去除"关闭"菜单功能。
    Private Sub Command2_Click()
        '取得系统菜单的句柄。
        hMenu = GetSystemMenu(Form1.hWnd, 0)
        CloseStr = String(255, 0)
        'SC_CLOSE指的便是"关闭"的那一个MenuItem ID
        Call GetMenuString(hMenu, SC_CLOSE, CloseStr, 256, MF_BYCOMMAND)
        '处理数据。
        CloseStr = Left(CloseStr, InStr(1, CloseStr, Chr(0)) - 1)
        '调用函数。
        Call DeleteMenu(hMenu, SC_CLOSE, MF_BYCOMMAND)
        '发送一个信息,使"×"出现Disable颜色。
        Call SendMessage(hWnd, WM_NCLBUTTONDOWN, HTCAPTION, 0&)
    End SubPrivate Sub Form_Load()
        '初始化。
        Form1.Caption = "菜单操作"
        Command1.Caption = "恢复"
        Command2.Caption = "去除"
    End Sub