www.pudn.com > sysmenu1.zip > Form1.frm


VERSION 5.00 
Begin VB.Form Form1  
   BorderStyle     =   1  'Fixed Single 
   Caption         =   "Form1" 
   ClientHeight    =   2790 
   ClientLeft      =   5760 
   ClientTop       =   3675 
   ClientWidth     =   5490 
   Icon            =   "Form1.frx":0000 
   LinkTopic       =   "Form1" 
   MaxButton       =   0   'False 
   ScaleHeight     =   2790 
   ScaleWidth      =   5490 
   Begin VB.Label Label1  
      Caption         =   $"Form1.frx":030A 
      BeginProperty Font  
         Name            =   "宋体" 
         Size            =   12 
         Charset         =   134 
         Weight          =   400 
         Underline       =   0   'False 
         Italic          =   0   'False 
         Strikethrough   =   0   'False 
      EndProperty 
      Height          =   1095 
      Left            =   120 
      TabIndex        =   0 
      Top             =   240 
      Width           =   5055 
   End 
End 
Attribute VB_Name = "Form1" 
Attribute VB_GlobalNameSpace = False 
Attribute VB_Creatable = False 
Attribute VB_PredeclaredId = True 
Attribute VB_Exposed = False 
'------------------------------------------- 
'          一个改变系统菜单的例子 
'------------------------------------------- 
'           洪恩在线  求知无限 
'------------------------------------------- 
'程序说明: 
'系统菜单是点击窗体右上角图标时所弹出的菜单,这个 
'菜单的选项一般是固定的,而本例通过API函数的调用 
'改变了系统菜单的选项,在其中加入了新的菜单项。 
'程序实现有两个关键: 
'1、通过AppendMenu和GetSystemMenu两个API函数的 
'应用,在系统菜单上添加项目; 
'2、通过子类化窗体技术的应用,当我们点击添加的条 
'时,能得到消息并做出响应。 
'------------------------------------------- 
Option Explicit 
 
 
 
Private Sub Form_Load() 
     
    OldWindowProc = GetWindowLong(Form1.hwnd, GWL_WNDPROC) 
    ' 取得窗口函数的地址  标记 GWL_WNDPROC 表示要取得  该窗口的窗口函数的地址 
    Call SetWindowLong(Form1.hwnd, GWL_WNDPROC, AddressOf WindowProc) 
    ' 用 WindowProc函数 代替 窗口函数 处理消息,标记 GWL_WNDPROC 表示要设置 该窗口的窗口函数的地址 
    ' 其实际效果是一旦操作系统向窗体发送消息,都会跳转到 WindowProc函数 中进行判断和处理 
     
    '**********************这段文字要理解******************************************* 
    '    这里要仔细理解一下,我们为窗体新指定了窗体函数地址,也就是说操作系统发送给窗体的 
    '消息将被 WindowProc函数 所截获(而改变前消息是被默认的 窗体函数 所获得并作相应处理的) 
    '    这样我们在 WindowProc函数 中对所截获的消息进行判断,会有三种情况: 
    '<1>如果是需要通过程序来处理的消息就通过 WindowProc函数 中的相应语句处理; 
    '<2>如果是要原来的 窗体函数 来处理则把这个消息传递给原窗体函数(其实是指针指向的改变); 
    '<3>如果不是我们需要的消息,也传递给原 窗体函数 来处理。 
    '******************************************************************************* 
     
    '得到窗体的系统菜单的句柄 
    SysMenuHwnd = GetSystemMenu(Form1.hwnd, False) 
     
    '在系统菜单上添加条目,两个相关的函数DeleteMenu、ModifyMenu同样用来修改菜单项 
    Call AppendMenu(SysMenuHwnd, MF_SEPARATOR, 2000, vbNullString)  '插入一条分隔线 
    Call AppendMenu(SysMenuHwnd, MF_STRING, 2001, "帮助(&A)")       '插入“帮助”项 
    Call AppendMenu(SysMenuHwnd, MF_SEPARATOR, 2002, vbNullString)  '插入一条分隔线 
    Call AppendMenu(SysMenuHwnd, MF_STRING, 2003, "恢复(&R)")       '插入“恢复”项 
     
End Sub 
 
Private Sub Form_Unload(Cancel As Integer) 
     
    '如果当前的窗体属性已经被改变,则恢复原来的设置 
    If OldWindowProc <> GetWindowLong(Form1.hwnd, GWL_WNDPROC) Then 
        Call SetWindowLong(Form1.hwnd, GWL_WNDPROC, OldWindowProc) 
    End If 
     
End Sub