在程序代码中可以实现,要求窗体不动,你可以设置窗体的moveable属性为false,
在窗体中添加一命令按钮,假设为command1,编写其代码为
private sub command1_click()
form1.move x,y
end sub
其中x,y为你想要移动到的位置

解决方案 »

  1.   

    只要将属性窗口中的BorderStyle项从默认的sizable改为None即可
      

  2.   

    啊啊啊...blldw一语道破,我怎么没想到vb本身就能做到呢,还找api找了几天,竟...竟......我说csdn的email通知怎么这么慢,人都已经回复了,还收不到信,要不是我不放心来看看,还不知道已经被回答了呢。
      

  3.   

    (忘了说了,我要的就是那个moveable,下面的move不知道你为何而写...)
      

  4.   

    但是如何在程序运行之时移动窗体?是不是也要move方法移动窗体呢?
      

  5.   

    不对不对!!!moveable是设计时的,运行是只读,不能更改!太早给你分了,这下你可非要帮我解决不可了!
      

  6.   

    属性窗口中设置窗体的moveable属性为false,不要在运行时设。
      

  7.   

    prefix,move之所以编写是因为VB不支持form1.moveable=true的运行,所以如果你要在程序运行之时移动窗体要用move方法来使窗体达到指定位置。
      

  8.   

    不好!这样不能解决问题。用move的方法有很多问题,而且窗体一多,要一个个写,效果也不好。我是要把move交给windows自己处理,只是在运行时更改其可移动的状态。你知不知道这个moveable是调用哪个api(或参数)来实现的?
      

  9.   

    居然花了半小时,退步了,唉。一时想不起直接设置窗体样式的办法了,只好绕圈子子分类截取WM_NCLBUTTONDOWN消息,反正也能实现你要的功能,可以在运行时改变。'API函数
    Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
        (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As LongDeclare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" _
        (ByVal hwnd As Long, ByVal nIndex As Long) As LongDeclare 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 HT_CAPTION = 2
    Public Const WM_NCLBUTTONDOWN = &HA1
      
    '全局变量,存放控件标志性数据
    Public preWinProc As Long
      
    '本函数就是用来接收子分类时截取的消息的
    Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
      If Form1.NewCheck.Value = vbChecked Then
        wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
        Exit Function
      End If
      '截取下来的消息存放在msg参数中.
      If (Msg = WM_NCLBUTTONDOWN) And (wParam = HT_CAPTION) Then
        '检测到鼠标消息,这里就可以加入我们的处理代码
        '如果这儿不加入任何代码,则相当于吃掉了这条消息.
      Else
        '如果我们不是我们需要处理的消息,则将之送回原来的程序.
        wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
      End If
    End Function'======================================================'以下代码在窗体中:
    Public WithEvents NewCheck As CheckBoxPrivate Sub NewCheck_Click()
      If NewCheck.Value = vbUnchecked Then
        NewCheck.Caption = "禁止移动"
      Else: NewCheck.Caption = "允许移动"
      End If
    End SubPrivate Sub subclass()
    Dim ret As Long
     
      '记录Window Procedure的地址
      preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
      '开始截取消息,并将消息交给wndproc过程处理.
      ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
    End Sub
    Private Sub EndSubclass()
    Dim ret As Long
      '取消消息截取,结束子分类过程.
      ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
    End Sub
      
    '当要截取其它控件的消息时,只需要将subclass与EndSubclass过程中的Me.hwnd换成该控件的控件.hwnd即可.
    '调试过程中注意存盘,因为如果一时不慎会造成死机或VB环境崩溃,不要按stop按钮结束Private Sub Form_Load()
    '这里动态加入一个CheckBox,不用在设计时添加
      If NewCheck Is Nothing Then
         Set NewCheck = Controls.Add("VB.CheckBox", "chkNew", Me)
         With NewCheck
            .Move 50, 50, 1500, 255
            .Caption = "禁止移动"
            .Visible = True
         End With
        End If
      Call subclassEnd SubPrivate Sub Form_Unload(Cancel As Integer)
     Call EndSubclass
    End Sub