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