告诉我,你的心事……──用VB实现控件移动一例 杨克元 2001年 28期 不知大家在网上冲浪时是否见过这样一个小软件,软件界面很简单,一幅漂亮的背景上面有句问话:“你爱我吗?”然后是两个选择按钮:“是”与“否”,如果你选择“是”,那么程序会自动结束,但如果你要选择“否”的话,呵呵,哪怕你点上一天也点不上它──这个按钮会满屏幕跑(如图)!   触景生情,笔者也用VB编了这么一个小东东,同时也浅谈一下VB中控件的移动问题。   我们知道VB中控件的移动可以在MOUSE_MOVE事件中发生。以command控件为例,一种最简单的方法就是在该事件中改变command的坐标(这也是笔者今天要介绍的方法之一)。另外,一种方法就是利用VB中的容器控件,VB中可以作为容器的基本控件有picture(图片框)、frame(框架)和最常用的窗体form。这里笔者就介绍这两种不同的方法来制作这个小程序,下面是具体操作。   #1 一、利用容器控件   新建工程1,将窗体caption属性改为“告诉我,你的心事……”,并把controlbox属性设置为false,目的是屏蔽窗口的关闭、最大、最小按钮。在窗体顶部位置添加标签label1,caption属性为“Do You Love Me?”在窗体内添加一picture控件数组(具体方法就不再赘述),index值分别为0、1、2、3。并将其borderstyle属性设置为0-none,这样图片框的边框就不可见了。然后在picture1(0)控件中添加command1控件,caption属性设置为“否”,另再添加command2控件,caption为“是”。然后就是编写代码的过程了。在编写过程中,利用了api函数SetParent来实现command1控件在各个图片框间的移动。其代码如下:(^28020501a^)   Private Declare Function SetParent Lib "user32" _(ByVal hWndChild As Long,ByVal hWndNewParent As Long) As Long '利用api函数setparent实现控件的移动   Private Sub Command1_MouseMove(Button As Integer,Shift As Integer,X As Single,Y As Single)   Static w 'w为picture1控件数组的索引号(即index)   If w = 3 Then w = -1   w = w + 1   Select Case w   Case 0 '把command1从第一个图片框移到第二个内   Call SetParent(Command1.hWnd,Picture1(1).hWnd)   Case 1 '把command1从第二个图片框移到第三个内   Call SetParent(Command1.hWnd,Picture1(2).hWnd)   Case 2 '把command1从第三个图片框移到第四个内   Call SetParent(Command1.hWnd,Picture1(3).hWnd)   Case 3 '把command1从第四个图片框移到第一个内   Call SetParent(Command1.hWnd,Picture1(0).hWnd)   End Select   End Sub   Private Sub Command2_Click()   End '结束程序   End Sub   这个程序由于采用了多个图片框控件,所以其缺点是无法设置连续的背景图案,在笔者的这个程序里,是将其背景颜色全设为了黑色(是不是有点投机取巧^_^),并把command的style属性也设为了1-Graphical,设置了背景图案。这里顺便说一下,VB中设置的背景图案不一定要在程序的目录下,在生成.exe文件时,VB会自动加载。   #1 二、改变command1控件的坐标   在这个方法里,我们要用到api函数GetCursorPos来取得鼠标的坐标。其窗体界面设置与第一种方法一样,就不再赘述了,下面就是编写代码过程:   Private Declare Function GetCursorPos Lib "user32"(lppoint As POINTAPI)As Long   'Getcursorpos用于取得鼠标坐标   Private Type POINTAPI '定义变量类型   X As Long   Y As Long   End Type   Private Sub Command1_MouseMove(Button As Integer,Shift As Integer,X As Single,Y As Single)   Dim lppoint As POINTAPI   '在不超出窗体范围的情况下改变command1的坐标值   If Command1.Left <> Screen.Width And Command1.Top <> Screen.Height Then   Command1.Left = lppoint.X + 1000 * (1 + Rnd) 'rnd 取得的0到1之间的随机数   Command1.Top = lppoint.Y + 500 * (1 + Rnd)   End If   '将command1按钮限制在form容器以内   If Command1.Left = Screen.Width Then   Command1.Left = lppoint.X - 1000 * Rnd - 500   End If   If Command1.Top = Screen.Height Then   Command1.Top = lppoint.Y - 500 * Rnd - 250   End If   End Sub   Private Sub Command2_Click()   End   End Sub   Private Sub Form_click()   Command1.Left = 2880   Command1.Top = 1920 '单击窗体按钮command1回到原位置   End Sub   Private Sub Label1_Click()   Form_click   End Sub   这个程序与第一个相比,可以设置窗体的背景图案了,但所谓“尺有所短,寸有所长”,第一种方法的代码显然要简单些,对一个程序而言,这一点是相当重要的。   至此,这个程序算是大功告成了。把它生成.exe文件,发给自己的梦中情人,嘿嘿,说不定还能有事半功倍的成效呢,呵呵(以上程序在Windows 98中调试通过)!