做了个c/s程序,想通过菜单限制用户的使用功能,如何做呀?急呀!
我想实现不同用户,有的菜单不能使用,变成灰的,或者根本不显示就更好了。
可是如何做呀?我看了一天书,没找到办法。
只好求大家了。

解决方案 »

  1.   

    菜单项特别多,如果从数据库表中取权限,一个一个设置菜单项是否可用,代码量太大了,麻烦不怕,我就担心影响效率呀!
    以下是我设置一个菜单项的代码:大家看看思路对否?
        '设置材料收发存明细
        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       '禁入明细帐
      

  2.   

    首先,建立一个权限表,里面的字段是 权限ID、窗口或模块ID、控件名、权限类型(比如enable\disable\visiable\hidden)、启用否然后是角色权限分配表 角色ID、权限ID、启用否接下来是用户角色分配表 ID、用户ID、角色ID、启用否最后编写函数及模块 例如get_role(用户ID,窗口ID) set_state(控件名,权限状态) 然后在窗体加载中调用。
      

  3.   

    呵呵。 我的方发是,把所有功能设置成一个标志串,比如添加客户“a0”,删除客户“a3"
    然后用户有个字段是权限字段。如果权限字串里有a0,就可以添加。
    所以权限字串到后来就是:a0a1a2a3b0b1b2b3b4b5b6c0c1c2c3c4c5....
    哈哈哈和
      

  4.   

    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)