前言:
EDF(EventsDistributionFrame)是本人在Access学习中开发的一个功能强大的程序,能够使许多不同类型的Access事件编程简化,为更好地介绍这个程序的使用方法,我将陆续介绍多个EDF的应用范例,及其代码的详细讲解。以便使用者更快地掌握其功能。
注:最新发布的EDF V1.2版本中已经包含了这个示例程序的最新版本,并且使用了1.2的新特性,不必再占用控件的Tags属性,改为使用EDF V1.2新增的自定义属性功能。
程序介绍:
本程序为EDF功能演示程序之一。本程序使用了EDF 1.11,实现了以下功能:
1、窗体上任何控件均能随意拖动。与多数拖动程序不同的是,开始拖动时,本程序将保持鼠标与控件的相对位置不变,而不是绑定到窗体左上角。当然前提是这个控件本身要支持鼠标事件。
2、选择控件后使用ALT加方向键,可以进行1缇为单位的位置微调。当前前提是这个控件本身要支持键盘事件。
3、可拖动的控件包括所有Access标准控件,包括窗体上已有的,和你自己加上去的控件。(你可以自己添加几个标准控件试试)
4、程序中使用了防错以避免超出窗体范围。
以上全部功能,使用EDF后,在不到30行代码内完成。
实现代码:
'定义EDF环境变量
Public edfCtls As New Collection
Public edfPorts As New Collection
Public Sub Form_Load()
'截获窗体所有控件的事件
edfInitEvents edfCtls, edfPorts, Me, 0
'设定事件处理程序为DragDrop
edfInitPorts edfPorts, AddressOf DragDrop, 0
End Sub
Public Sub DragDrop(ByRef acCtl As Control, ByRef strEvent As String, ByRef Params As Collection, ByRef reserved As Long)
Dim Tags() As String
'开始拖动,在标记中保存鼠标相对位置
If strEvent = "MouseDown" Then
acCtl.Tag = Params("X") & "," & Params("Y")
Exit Sub
End If
'结束拖动,清除标记
If strEvent = "MouseUp" Then acCtl.Tag = ""
'防止越界
On Error GoTo Exit_Sub
'键盘移动
If strEvent = "KeyDown" Then
Select Case Params("KeyCode").Value
Case 37: '左方向键
acCtl.Left = acCtl.Left - 1
Case 38: '上方向键
acCtl.Top = acCtl.Top - 1
Case 39: '右方向键
acCtl.Left = acCtl.Left + 1
Case 40: '下方向键
acCtl.Top = acCtl.Top + 1
End Select
End If
'鼠标拖动
If strEvent = "MouseMove" And acCtl.Tag <> "" Then
Tags = Split(acCtl.Tag, ",")
acCtl.Left = acCtl.Left + Params("X") - CLng(Tags(0))
acCtl.Top = acCtl.Top + Params("Y") - CLng(Tags(1))
End If
Exit_Sub:
End Sub
完整下载:(包含实现代码和EDF 1.11环境)
[此贴子已经被作者于2006-5-23 12:58:00编辑过]
|