菜单项特别多,如果从数据库表中取权限,一个一个设置菜单项是否可用,代码量太大了,麻烦不怕,我就担心影响效率呀! 以下是我设置一个菜单项的代码:大家看看思路对否? '设置材料收发存明细 strsql = "select count(*) as jlts from quanxian where 登录名 = '" & g_loginname & "' and (grantid = '0001' or grantid='0003')" If conn.State <> adStateOpen Then '先看连接对象是否有效 Call mainmoudle.getconn '连接 End If If rslogin.State = adStateOpen Then '如果已经打开,就要先关闭 rslogin.Close End If rslogin.CursorLocation = adUseClient '使用本地游标 rslogin.Open strsql, conn, adOpenStatic, adLockOptimistic If rslogin("jlts").Value <> 2 Then sfcmxhz_menu.Enabled = False '禁入明细帐
Const MF_BYPOSITION = &H400& Const MF_POPUP = &H10& Const WM_SYSCOMMAND = &H112 Const MF_CHECKED = &H8& Const MF_APPEND = &H100& Const TPM_LEFTALIGN = &H0& Const TPM_RETURNCMD = &H100 Const MF_DISABLED = &H2& Const MF_GRAYED = &H1& Const MF_SEPARATOR = &H800& Const MF_STRING = &H0& Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long Private Declare Function InsertMenu Lib "user32" Alias "InsertMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) 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 RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long Private Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long Private Declare Function CreatePopupMenu Lib "user32" () As Long利用以上函数根据数据库中的菜单表,用户表,权限表动态创建用户菜单。 再在模块中声明 Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Const GWL_WNDPROC = (-4) Public Const WM_COMMAND = &H111 Public procOld As Long '重写你的主窗体窗口过程 Public Function WindowProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Select Case msg Case WM_COMMAND '响应菜单事件根据wParam识别菜单 Case Else
End Select WindowProc = CallWindowProc(procOld, hwnd, msg, wParam, lParam)
End Function在主窗体中form_load加 procOld = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)
以下是我设置一个菜单项的代码:大家看看思路对否?
'设置材料收发存明细
strsql = "select count(*) as jlts from quanxian where 登录名 = '" & g_loginname & "' and (grantid = '0001' or grantid='0003')"
If conn.State <> adStateOpen Then '先看连接对象是否有效
Call mainmoudle.getconn '连接
End If
If rslogin.State = adStateOpen Then '如果已经打开,就要先关闭
rslogin.Close
End If
rslogin.CursorLocation = adUseClient '使用本地游标
rslogin.Open strsql, conn, adOpenStatic, adLockOptimistic
If rslogin("jlts").Value <> 2 Then
sfcmxhz_menu.Enabled = False '禁入明细帐
然后用户有个字段是权限字段。如果权限字串里有a0,就可以添加。
所以权限字串到后来就是:a0a1a2a3b0b1b2b3b4b5b6c0c1c2c3c4c5....
哈哈哈和
Const MF_POPUP = &H10&
Const WM_SYSCOMMAND = &H112
Const MF_CHECKED = &H8&
Const MF_APPEND = &H100&
Const TPM_LEFTALIGN = &H0&
Const TPM_RETURNCMD = &H100
Const MF_DISABLED = &H2&
Const MF_GRAYED = &H1&
Const MF_SEPARATOR = &H800&
Const MF_STRING = &H0&
Private Declare Function GetMenu Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function InsertMenu Lib "user32" Alias "InsertMenuA" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long, ByVal wIDNewItem As Long, ByVal lpNewItem As Any) 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 RemoveMenu Lib "user32" (ByVal hMenu As Long, ByVal nPosition As Long, ByVal wFlags As Long) As Long
Private Declare Function DestroyMenu Lib "user32" (ByVal hMenu As Long) As Long
Private Declare Function CreatePopupMenu Lib "user32" () As Long利用以上函数根据数据库中的菜单表,用户表,权限表动态创建用户菜单。
再在模块中声明
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Const GWL_WNDPROC = (-4)
Public Const WM_COMMAND = &H111
Public procOld As Long
'重写你的主窗体窗口过程
Public Function WindowProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Select Case msg
Case WM_COMMAND
'响应菜单事件根据wParam识别菜单
Case Else
End Select
WindowProc = CallWindowProc(procOld, hwnd, msg, wParam, lParam)
End Function在主窗体中form_load加
procOld = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)