VB中控件拖放操作的教学研究

时间:2022-08-06 03:35:44

VB中控件拖放操作的教学研究

文章编号:1672-5913(2008)12-0097-03

摘要:在VB教学中,拖放操作是一个难点内容。本文介绍在教学过程中如何讲解通过修改拖放坐标和使用API函数,实现在不同容器之间拖放控件的操作,并给出了实例程序。

关键词:VB;拖放;坐标;API函数

中图分类号:G642

文献标识码:B

在Visual Basic应用程序中,为了实现更加灵活的用户控制,时常需要由用户自己安排一些控件的位置。在Windows操作系统中,经常使用拖动操作移动或复制文件;在一些应用程序中,可将工具栏中的控件按钮拖放到文档窗口中,实现插入对象操作;在Office软件中,还可以随意定制工具栏中的按钮。

在我多年的VB一线教学实践中,发现拖放操作的讲解难点在于拖放的目标位置设置。在拖放控件时,根据源位置和目标位置的容器控件不同分为两种情况:在同一容器对象中拖放控件,在不同容器对象中拖放控件。学生对于在不同容器中拖放控件有很多疑问,因此我在教学中采用了由浅入深、循序渐进的方法,分别讲解这两种情况的处理方法,并通过典型的实例让学生掌握拖放操作的相关概念和实现方法,收到了不错的效果,学生感觉比较容易理解,下面具体介绍一下这两种情况拖放操作的实现方法。

1在同一容器内部拖放控件

在教学过程中,我首先讲解拖放操作的相关概念,然后举例介绍与拖放操作相关的属性、方法和事件。拖放(Drag)操作是指在窗体中,将鼠标指针指向控件,按住鼠标按键移动鼠标,到达目标位置后松开鼠标按键,被拖放的控件移动到目标位置[1]。

在同一容器中拖放控件比较容易实现,可以通过设置控件的拖放属性,或调用控件的Drag方法来实现。在教学过程中以命令按钮(CommandButton)控件为例,在窗体上添加一个命令按钮Command1,设置DragMode属性为1-Automatic(自动拖放),运行程序后用鼠标左键拖动命令按钮,可以看到拖动时显示灰色控件边框,但控件并不真正移动到目标位置。若设置DragMode属性为0-Manual(手动拖放),则需要编写命令按钮的MouseDown事件调用其Drag方法,事件过程的代码如下:

Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

Command1.Drag 1 '开始拖动控件

End Sub

运行程序时演示拖放操作,让学生看到两种设置方法的效果相同,使学生了解DragMode属性的含义和Drag方法的用法。

为了真正实现控件的移动,还需要编写窗体的DragDrop事件过程,通过调用命令按钮的Move方法使其移动到目标位置。DragDrop事件过程的代码如下:

Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)

Source.Move X, Y '把命令按钮移到目标位置

End Sub

在程序运行时可以看到,拖放命令按钮时能够将其移动到目标位置。

2在不同容器之间拖放控件

上述的方法虽然可以改变控件的位置,但是控件的源位置和目标位置都是窗体,不能把控件从一个容器对象移到另一容器对象。为了实现控件在不同容器之间的拖放操作,可以通过修改坐标和修改容器对象的方法实现。

2.1修改拖放坐标

在教学过程中,要给学生强调目标位置坐标的设置方法。还以命令按钮为例,在窗体上添加一个图片框(PictureBox)控件Picture1,由于窗体和图片框都是容器对象,可以尝试通过修改对象的坐标,将命令按钮从窗体上拖放到图片框上。

首先给学生讲解DragDrop事件中参数的含义,Source表示被移动的控件对象,X和Y表示被拖动控件的停放位置,并通过画示意图让学生了解在不同容器之间拖放控件时坐标的变化。DragDrop事件中的控件停放坐标X和Y是指在本容器中的坐标,当命令按钮在窗体中移动时,坐标X和Y是相对于窗体而言的,而当命令按钮被拖放到图片框中时,坐标X和Y是相对于图片框而言的。如果仍旧使用Source.Move X, Y语句,则命令按钮无法移到目标位置。因此需要考虑命令按钮在图片框中的坐标与在窗体中的坐标之间的关系,即需要设置坐标的偏移,修改拖放坐标的程序代码如下:

Private Sub Picture1_DragDrop(Source As Control, X As Single, Y As Single)

'计算得到控件在图片框中的停放坐标

Source.Move X + Picture1.Left, Y + Picture1.Top

End Sub

运行此程序可以看到,拖放命令按钮能够将控件从窗体上移动到图片框上。

2.2修改容器对象

上述程序仍有一些弊端,就是当图片框位于命令按钮下层时,可以将命令按钮移动到图片框上,但当图片框的叠放次序位于命令按钮上层时,移动命令按钮到图片框时,命令按钮会被图片框覆盖。也就是说,修改拖放坐标的方法可以把命令按钮移动到图片框之上,却无法将命令按钮移动到图片框之中。为了实现将控件拖放到不同容器对象中的功能,需要修改控件的容器对象。

在VB的开发环境中,没有提供在程序运行时建立窗口及控件之间嫡属关系的方法和手段,因此要实现上面要求的功能,需要补充一点动态建立窗口及控件之间嫡属关系的能力。解决这个问题的方法是借助Windows系统调用,即使用API函数。

API(应用程序接口)是操作系统自带的一套功能强大的函数集,Windows API直接面对操作系统底层,可以实现VB所不能实现的功能。Visual Basic 6.0支持约1500个API函数,主要包括在3个DLL中,其中User32.dll中的函数主要用于窗口管理,SetParent函数就是其中一个函数[2]。

由于API函数不属于教学大纲的要求,因此在教学过程中可以简要介绍API函数的相关知识,只需举例讲解SetParent函数的含义和用法。

SetParent函数可以用来在程序运行时刻,动态建立两个容器对象及控件之间的嫡属关系。SetParent函数接收两个参数,第一个参数是子对象的句柄,第二个参数是父对象的句柄,若两个参数都是合法的句柄,则函数调用成功,为两者之间建立起嫡属关系[3]。

在本例中,当将命令按钮从窗体拖放到图片框时,父对象是图片框;当从图片框拖放到窗体时,父对象是窗体。因此需要根据鼠标拖放时的方向设置不同的父对象,在DragOver事件中,可用If语句来判断鼠标拖放的方向。另外,需要给学生强调在使用SetParent函数时,需要先声明再使用,如果只在窗体模块中使用,就在窗体代码的通用部分声明。相应的程序代码如下:

Private Declare Function SetParent Lib "User32" (ByVal hWndChild As Long, _

ByVal hWndNewParent As Long) As Long '使用前声明API函数SetParent

Private Sub Command1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)

If Button = 1 Then Command1.Drag 1 '如果按下的是左键则开始拖放

End Sub

Private Sub Form_DragDrop(Source As Control, X As Single, Y As Single)

Source.Move X, Y

End Sub

Private Sub Picture1_DragDrop(Source As Control, X As Single, Y As Single)

Source.Move X, Y

End Sub

Private Sub Picture1_DragOver(Source As Control, X As Single, Y As Single, State As Integer)

'当进入图片框时把图片框设置为容器对象

If State = 0 Then SetParent Command1.hWnd, Picture1.hWnd

'当进入窗体时把窗体设置为容器对象

If State = 1 Then SetParent Command1.hWnd, Form1.hWnd

End Sub

上面的程序能够实现在同一个窗体中的不同容器对象之间拖放控件。若对程序再做改进,还可以实现在不同窗体之间拖放控件。

3结束语

本文介绍了VB教学过程中鼠标拖放操作的有关问题,通过实例探讨了拖放操作由简单到复杂的实现过程,达到了理想的教学效果,学生能够更深刻地理解拖放操作的本质,更容易掌握拖放操作的实现方法。本文中的程序经过反复调试,仅用来验证拖放操作,并不是完整的应用程序,在开发实际应用程序时,还需要扩展程序功能,可将此作为大作业留给学生们课余时间完成。

参考文献

[1] 申石磊,张东生. Visual Basic程序设计[M]. 北京:中国科学技术出版社,2007:237-241.

[2] 求是科技. Visual Basic 6.0程序设计与开发技术大全[M]. 北京:人民邮电出版社,2005:212-216.

[3] 张智群. 在VB应用程序中实现动态控件移动[J]. 计算机世界报,1997,(18).

上一篇:RSS技术在现代远程教育中的应用 下一篇:浙江大学“高等院校计算机专业课程综合实验系...