请问各位前辈,我要将窗体的borderstyle属性设为0,然后在窗体四周放置一圈image控件,通过image的mouse_down并拖动鼠标改变窗体的大小,就象我们平时用鼠标拖动窗体边缘改变窗体大小一样,这个功能应该怎样实现?

解决方案 »

  1.   

    去msdn中查这个内容,WM_NCLBUTTONDOWN,这个消息是当鼠标在非工作区域按下时的消息,可以用sendmessage(me.hwnd,WM_NCLBUTTONDOWN,xx,0),好像是这么写,xx你可以挨个试,代表着鼠标从窗体的不同位置按下。
      

  2.   

    这个用setwindowlong可以解决,用不着image控件。将窗体的borderstyle属性设为0,然后添加下面的代码:Option ExplicitPrivate Const GWL_STYLE = (-16)
    Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private Const WS_SIZEBOX = &H40000
    Private Sub Form_Load()
        Dim style As Long
        style = GetWindowLong(Me.hwnd, GWL_STYLE)
        style = style Or WS_SIZEBOX
        SetWindowLong Me.hwnd, GWL_STYLE, style
        Me.Width = Me.Width + 10'也可用setwindowpos刷新窗体,这里我用的是改变窗体大小的方法刷新窗体
        Me.Width = Me.Width - 10
    End Sub
      

  3.   

    楼上是个好方法,但是3D边框却出来了,只有用变通的方法:
    这个例子展示了左右移动的方法,你可以自行加入上下移动,斜移动等
    Option Explicit
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Function ReleaseCapture Lib "user32" () As Long
    Private Const HTLEFT = 10
    Private Const HTRIGHT = 11
    Private Const WM_NCLBUTTONDOWN = &HA1Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim nParam As Long
    With Me
     If X > 0 And X < 100 Then
    nParam = HTLEFT
    ElseIf X > .Width - 100 And X < .Width Then
    nParam = HTRIGHT
    End If
    If nParam Then
    Call ReleaseCapture
    Call SendMessage(.hwnd, WM_NCLBUTTONDOWN, nParam, 0)
    End If
    End With
    End SubPrivate Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim Np As MousePointerConstants
    With Me
     If X > 0 And X < 100 Then
      Np = vbSizeWE
     ElseIf X > .Width - 100 And X < .Width Then
      Np = vbSizeWE
     Else '此处还可以继续加
     Np = vbDefault
     End If
    If Np <> .MousePointer Then
     .MousePointer = Np
    End If
    End With
    End Sub
      

  4.   

    我从来没有用过SendMessage函数,但我看到好多地方都有这个函数,请问这个函数都有哪些功能,应该怎样用。
      

  5.   

    sendmessage使用来发送消息,个人感觉在API中属于最基本、但也是最难用好的一个,因为我们接触到的很多需求都可以用sendmessage来进行控制。
    对于这个函数本身非常简单,只是向一个hwnd发送一个消息,同时允许传递两个参数过去。但因为windows中消息的数量之多、用途之广,所以,这个函数也是最复杂的。具体的各类消息,可以查看相关的控件和对象,比如基本控件textbox、listbox、treeview等都在msdn的user interface program一章中,可以自己仔细看看。