1,如何使MDIFORM中的最大化按钮失效 
    2,如何使一个做出一个就象VB里面的工程窗口和属性窗口那样,可以一直可见,在做前面,不会被打开的其他的子form盖住,但又不影响其他子FORM的显示,而且还可以移动那样的。
    3,如何使子form不超出mdiform的范围,因为一旦把它移动到比较靠外的地方,mdiform就会出现难看的滚动条,请问这个东西怎么做,最好能给个例子
    4,怎么在菜单中加入就象word中那样的横条可以把不同类别的菜单项分开。

解决方案 »

  1.   

    4,  在菜单编辑器中在标题栏中加入“-”就可以实现的。
    我也曾经想要做一个类似vb界面,但是没有成功,
    不过可以使用setparent API 函数设置设置从属关系。
    胡说一气的,别介意。
      

  2.   

    4.caption里面输入"-",其它同平常菜单项
      

  3.   

    '始终将窗口放于最前端
    Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags 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 conHwndTopmost = -1
    Const conHwndNoTopmost = -2
    Const conSwpNoActivate = &H10
    Const conSwpShowWindow = &H40Private Sub Combo1_GotFocus()
       '无论何时只要 ComboBox 收到焦点
       '在这个例子中都会自动放下 ComboBox 控件的列表部分,用TAB键测试
       Const CB_SHOWDROPDOWN = &H14F
       Dim Tmp
       Tmp = SendMessage(Combo1.hwnd, CB_SHOWDROPDOWN, 1, ByVal 0&)
    End SubPrivate Sub munTopMost_Click()
    ' 从菜单中加入或删除检查标志.
       munTopMost.Checked = Not munTopMost.Checked
       If munTopMost.Checked Then
          ' 打开 TopMost 属性.
          SetWindowPos hwnd, conHwndTopmost, 0, 0, 0, 0, conSwpNoActivate Or conSwpShowWindow
       Else
          ' 关闭 TopMost 属性.
          SetWindowPos hwnd, conHwndNoTopmost, 0, 0, 0, 0, conSwpNoActivate Or conSwpShowWindow
       End If
    End Sub
      

  4.   

    'In Module
    '=====================================
    Public Const GWL_STYLE = (-16)
    Public Const GWL_WNDPROC = (-4)
    Public Const WS_MAXIMIZEBOX = &H10000
    Public Const HWND_TOPMOST = -1
    Public Const HWND_NOTOPMOST = -2
    Public Const SWP_NOMOVE = &H2
    Public Const SWP_NOSIZE = &H1
    Public Const SWP_NOACTIVATE = &H10
    Public Const SWP_SHOWWINDOW = &H40
    Public Const WM_MOVING = &H216
    Public Const WM_MOVE = &H3Private Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
    End TypeDeclare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" ( _
        ByVal hwnd As Long, _
        ByVal nIndex As Long, _
        ByVal dwNewLong As Long) As Long
    Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" ( _
        ByVal hwnd As Long, _
        ByVal nIndex As Long) As Long
    Declare Function SetWindowPos Lib "user32" ( _
        ByVal hwnd As Long, _
        ByVal hWndInsertAfter As Long, _
        ByVal x As Long, _
        ByVal y As Long, _
        ByVal cx As Long, _
        ByVal cy As Long, _
        ByVal wFlags As Long) As Long
    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
    Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
        ByRef pDst As Any, _
        ByRef pSrc As Any, _
        ByVal nLen As Long)
    Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
        ByVal hwnd As Long, _
        ByVal wMsg As Long, _
        ByVal wParam As Long, _
        lParam As Any) As LongPrivate mpfnWndProc     As Long
    Private mfrmHooked      As FormPublic Sub EnableMaxButton(ByVal frm As Form, ByVal Enabled As Boolean)
        If frm Is Nothing Then Exit Sub
        Dim lngWndStyle As Long
        lngWndStyle = GetWindowLong(frm.hwnd, GWL_STYLE)
        If Enabled Then
            SetWindowLong frm.hwnd, GWL_STYLE, lngWndStyle Or WS_MAXIMIZEBOX
        Else
            mlngWndStyle = GetWindowLong(frm.hwnd, GWL_STYLE)
            SetWindowLong frm.hwnd, GWL_STYLE, lngWndStyle And (Not WS_MAXIMIZEBOX)
        End If
    End SubPublic Sub KeepTopMost(ByVal frm As Form, ByVal TopMost As Boolean)
        If frm Is Nothing Then Exit Sub
        If TopMost Then
            SetWindowPos frm.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
        Else
            SetWindowPos frm.hwnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE
        End If
    End SubPublic Sub HookForm(ByVal frm As Form, ByVal HookFlag As Boolean)
        If frm Is Nothing Then Exit Sub
        If HookFlag Then
            Set mfrmHooked = frm
            mpfnWndProc = SetWindowLong(frm.hwnd, GWL_WNDPROC, AddressOf WndProc)
        Else
            Set mfrmHooked = Nothing
            SetWindowLong frm.hwnd, GWL_WNDPROC, mpfnWndProc
        End If
    End SubPublic Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Select Case uMsg
        Case WM_MOVE
        Case WM_MOVING
            Dim rc As RECT
            CopyMemory rc, ByVal lParam, Len(rc)
            Debug.Print rc.Left, rc.Top, rc.Right, rc.Bottom
        End Select
        WndProc = CallWindowProc(mpfnWndProc, hwnd, uMsg, wParam, lParam)
    End Function
    '=====================================
    '=====================================
    'In MDIForm
    '=====================================
    Private Sub MDIForm_Load()
        EnableMaxButton Me, False
        Form1.Show 'Form1.MDIChild = True
        Form3.Show , Me 'Form3.MDIChild = False
        KeepTopMost Form3, True
    End Sub
    '=====================================
      

  5.   

    1 上例
    2 上例
    3 暂时没做出来 
    4 Caption可以使用"-"来分割菜单项
      

  6.   

    3,可以把MDI属性的ScrollBars设为False就没有滚动条了嘛!!
    如果想子窗体不超过MDI用代码,控制坐标看看,应该可以的!!
    乱说!别介意!
      

  7.   

    第3个问题的代码(不用API拖动):
    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
       
       If (Button = vbLeftButton) And (Me.WindowState = 0) Then
          MousePointer = vbSizeAll
          mX = X
          mY = Y
       End IfEnd SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
       Dim H As Long
       Dim V As Long
       On Error Resume Next
       
       If (Button = vbLeftButton) And (Me.WindowState = 0) Then
          '如果鼠标位置没有变化,表示没有移动。此时当退出过程,提高程序运行效果。
          If (X = mY) And (Y = mY) Then Exit Sub
          
          H = Me.Left + X - mX
          V = Me.Top + Y - mY
          
          If H <= 0 Then
             H = 0
          ElseIf H >= (MDIform.Width - Me.Width) Then
             H = MDIform.Width - Me.Width
          End If
               
          If V <= 0 Then
             V = 0
          ElseIf V >= (MDIform.Height - Me.Height) Then
             V = MDIform.Height - Me.Height
          End If      Me.Move H, V
          
       End If
       
    End SubPrivate Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
       MousePointer = vbDefault
       '如果有右键菜单,在这里弹出右键菜单
       If Button = vbRightButton Then
           Call PopupMenu(mnuRight)
       End If
       
    End Sub
      

  8.   

    上面要定义模块变量
       dim mX as long
       dim mY as long