请问我想设置form1 只能在 mdiform1 窗体的右下角部分移动,请问怎么设置?
就是实现以下几点:
如果form1.left<=mdiform1.left+mdiform1.width/2  (就是向左移动靠到了中线)
那么 form1.left=mdiform1.left+mdiform1.width/2 (就是form1左边停止在中线上)
同样如果向上移动form1.top超过了mdiform1的高度的一半,
 那么   form1.top=mdiform1.top+mdiform1.height/2 (顶端停在中线上)
如果向右移动,form1右端碰到了mdiform1的右端则不能再右移动,防止继续移动有部分子窗体不能看见
如果向下移动也一样,底端碰到了低端就不能再移动了!上面如果不够清楚请看下面形象一点的说明:
mdiform1 就象一个“田” 字 子窗体只能够在 “田”字的右下那一快移动,*子窗体不能有部分被mdi父窗体遮住!(就2个窗体)!
用api函数什么都好!请详细代码指点,若确实行得通,分全给他!

解决方案 »

  1.   

    MDI窗体代码(父窗体):Option ExplicitPrivate Sub MDIForm_Load()
        With Me
            .WindowState = 2
        End With
    End SubForm1窗体代码(子窗体)Option Explicit
    Private Declare Function MoveWindow Lib "user32" (ByVal hwnd As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal bRepaint As Long) As Long
    '移动窗体到右下角
    Private Sub Command1_Click()
        Dim lngP As Long
        lngP = MoveWindow(Me.hwnd, (MDIForm1.ScaleWidth - Me.Width) / 15, (MDIForm1.ScaleHeight - Me.Height) / 15, Me.Width / 15, Me.Height / 15, True)
    End Sub
      

  2.   

    模块里
    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 LongDeclare Function SetWindowLong Lib "user32" Alias _
    "SetWindowLongA" (ByVal hwnd As Long, _
    ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Const GWL_WNDPROC = -4
    Public Const WM_MOVE = &H3
    Public Oldproc As LongPublic Function Newproc(ByVal hwnd As Long, _
    ByVal Msg As Long, ByVal wp As Long, _
    ByVal lp As Long) As LongIf Msg = WM_MOVE Then '捕获窗体移动事件
        Call sub_MoveForm1
    End IfNewproc = CallWindowProc(Oldproc, hwnd, Msg, wp, lp)
    End Function'Private Sub sub_MoveForm1()
    '
    '    If Form1.Left + Form1.Width > MDIForm1.Width Then
    '        Form1.Left = MDIForm1.Width - Form1.Width
    '    End If
    '
    '    If Form1.Top + Form1.Height > MDIForm1.Height Then
    '        Form1.Top = MDIForm1.Height - Form1.Height
    '    End If
    '
    '    If Form1.Left < MDIForm1.Width / 2 Then
    '        Form1.Left = MDIForm1.Width / 2
    '    End If
    '
    '    If Form1.Top < MDIForm1.Height / 2 Then
    '        Form1.Top = MDIForm1.Height / 2
    '    End If
    '
    'End SubPrivate Sub sub_MoveForm1()
        '不加差值mdi窗体会自动加滚动条,太丑了
        If Form1.Left + Form1.Width > MDIForm1.Width - 200 Then
            Form1.Left = MDIForm1.Width - Form1.Width - 200
        End If
        
        If Form1.Top + Form1.Height > MDIForm1.Height - 580 Then
            Form1.Top = MDIForm1.Height - Form1.Height - 580
        End If
        
        If Form1.Left < MDIForm1.Width / 2 Then
            Form1.Left = MDIForm1.Width / 2
        End If
        
        If Form1.Top < MDIForm1.Height / 2 Then
            Form1.Top = MDIForm1.Height / 2
        End If
        
    End Submdi窗体里Private Sub MDIForm_Load()
        Me.WindowState = 2
        Form1.Show
    End Submdi子窗体里Private Sub form_load()
        Me.Show
        Me.Move MDIForm1.Width / 2, MDIForm1.Height / 2
        Oldproc = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf Newproc)
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        SetWindowLong Form1.hwnd, GWL_WNDPROC, Oldproc
    End Sub
      

  3.   

    楼上大哥差不多了!就是运行没几秒就没有反映了!按ctrl+break 都退不出来!怎么回事?
      

  4.   

    没看到你说的效果,你加什么了?还是设置什么了?
    中间位置修改一下,这样中间位置效果准确Private Sub sub_MoveForm1()
        '不加差值mdi窗体会自动加滚动条,太丑了
        If Form1.Left + Form1.Width > MDIForm1.Width - 200 Then
            Form1.Left = MDIForm1.Width - Form1.Width - 200
        End If
        
        If Form1.Top + Form1.Height > MDIForm1.Height - 580 Then
            Form1.Top = MDIForm1.Height - Form1.Height - 580
        End If
        
        If Form1.Left < (MDIForm1.Width - 200) / 2 Then
            Form1.Left = (MDIForm1.Width - 200) / 2
        End If
        
        If Form1.Top < (MDIForm1.Height - 580) / 2 Then
            Form1.Top = (MDIForm1.Height - 580) / 2
        End If
        
    End Sub