微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题告诉我,你的心事……──用VB实现控件移动一例
栏目软件世界
作者杨克元
发布2001年28期
  不知大家在网上冲浪时是否见过这样一个小软件,软件界面很简单,一幅漂亮的背景上面有句问话:“你爱我吗?”然后是两个选择按钮:“是”与“否”,如果你选择“是”,那么程序会自动结束,但如果你要选择“否”的话,呵呵,哪怕你点上一天也点不上它──这个按钮会满屏幕跑(如图)!
  触景生情,笔者也用VB编了这么一个小东东,同时也浅谈一下VB中控件的移动问题。
  我们知道VB中控件的移动可以在MOUSE_MOVE事件中发生。以command控件为例,一种最简单的方法就是在该事件中改变command的坐标(这也是笔者今天要介绍的方法之一)。另外,一种方法就是利用VB中的容器控件,VB中可以作为容器的基本控件有picture(图片框)、frame(框架)和最常用的窗体form。这里笔者就介绍这两种不同的方法来制作这个小程序,下面是具体操作。
  一、利用容器控件
  新建工程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控件在各个图片框间的移动。其代码如下:(

)
  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会自动加载。
  二、改变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中调试通过)!