告诉我,你的心事……──用VB实现控件移动一例

Author: 杨克元 Date: 2001年 28期

?牐牪恢蠹以谕铣謇耸笔欠窦庋桓鲂∪砑砑缑婧芗虻ィ环恋谋尘吧厦嬗芯湮驶埃骸澳惆衣穑俊比缓笫橇礁鲅≡癜磁ィ骸笆恰庇搿胺瘛保绻阊≡瘛笆恰保敲闯绦蚧嶙远崾绻阋≡瘛胺瘛钡幕埃呛牵呐履愕闵弦惶煲驳悴簧纤ぉふ飧霭磁セ崧聊慌埽ㄈ缤迹?!
  ?牐牬ゾ吧椋收咭灿肰B编了这么一个小东东,同时也浅谈一下VB中控件的移动问题。
  ?牐犖颐侵繴B中控件的移动可以在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^)??
  ?牐燩rivate Declare Function SetParent Lib "user32" _(ByVal hWndChild As Long,ByVal hWndNewParent As Long) As Long '利用api函数setparent实现控件的移动
  ?牐燩rivate Sub Command1_MouseMove(Button As Integer,Shift As Integer,X As Single,Y As Single)
  ?牐燬tatic w 'w为picture1控件数组的索引号(即index)
  ?牐營f w = 3 Then w = -1
  ?牐爓 = w + 1
  ?牐燬elect Case w
  ?牐燙ase 0 '把command1从第一个图片框移到第二个内
  ?牐燙all SetParent(Command1.hWnd,Picture1(1).hWnd)
  ?牐燙ase 1 '把command1从第二个图片框移到第三个内
  ?牐燙all SetParent(Command1.hWnd,Picture1(2).hWnd)
  ?牐燙ase 2 '把command1从第三个图片框移到第四个内
  ?牐燙all SetParent(Command1.hWnd,Picture1(3).hWnd)
  ?牐燙ase 3 '把command1从第四个图片框移到第一个内
  ?牐燙all SetParent(Command1.hWnd,Picture1(0).hWnd)
  ?牐燛nd Select
  ?牐燛nd Sub
  ?牐燩rivate Sub Command2_Click()
  ?牐燛nd '结束程序
  ?牐燛nd Sub
  ?牐犝飧龀绦蛴捎诓捎昧硕喔鐾计蚩丶云淙钡闶俏薹ㄉ柚昧谋尘巴及福诒收叩恼飧龀绦蚶铮墙浔尘把丈栉撕谏ㄊ遣皇怯械阃痘∏蒦_^),并把command的style属性也设为了1-Graphical,设置了背景图案。这里顺便说一下,VB中设置的背景图案不一定要在程序的目录下,在生成.exe文件时,VB会自动加载。
  #1    二、改变command1控件的坐标
  ?牐犜谡飧龇椒ɡ铮颐且玫絘pi函数GetCursorPos来取得鼠标的坐标。其窗体界面设置与第一种方法一样,就不再赘述了,下面就是编写代码过程:
  ?牐燩rivate Declare Function GetCursorPos Lib "user32"(lppoint As POINTAPI)As Long
  ?牐牐?Getcursorpos用于取得鼠标坐标
  ?牐燩rivate Type POINTAPI '定义变量类型
  ?牐燲 As Long
  ?牐燳 As Long
  ?牐燛nd Type
  ?牐燩rivate Sub Command1_MouseMove(Button As Integer,Shift As Integer,X As Single,Y As Single)
  ?牐燚im lppoint As POINTAPI
  ?牐牐г诓怀龃疤宸段У那榭鱿赂谋鋍ommand1的坐标值
  ?牐營f Command1.Left <> Screen.Width And Command1.Top <> Screen.Height Then
  ?牐燙ommand1.Left = lppoint.X + 1000 * (1 + Rnd) 'rnd 取得的0到1之间的随机数
  ?牐燙ommand1.Top = lppoint.Y + 500 * (1 + Rnd)
  ?牐燛nd If
  ?牐牐Ы玞ommand1按钮限制在form容器以内
  ?牐營f Command1.Left = Screen.Width Then
  ?牐燙ommand1.Left = lppoint.X - 1000 * Rnd - 500
  ?牐燛nd If
  ?牐營f Command1.Top = Screen.Height Then
  ?牐燙ommand1.Top = lppoint.Y - 500 * Rnd - 250
  ?牐燛nd If
  ?牐燛nd Sub
  ?牐燩rivate Sub Command2_Click()
  ?牐燛nd
  ?牐燛nd Sub
  ?牐燩rivate Sub Form_click()
  ?牐燙ommand1.Left = 2880
  ?牐燙ommand1.Top = 1920 '单击窗体按钮command1回到原位置
  ?牐燛nd Sub
  ?牐燩rivate Sub Label1_Click()
  ?牐燜orm_click
  ?牐燛nd Sub
  ?牐犝飧龀绦蛴氲谝桓鱿啾龋梢陨柚么疤宓谋尘巴及噶耍健俺哂兴蹋缬兴ぁ保谝恢址椒ǖ拇胂匀灰虻バ?,对一个程序而言,这一点是相当重要的。
  ?牐犞链耍飧龀绦蛩闶谴蠊Ω娉闪恕0阉桑甧xe文件,发给自己的梦中情人,嘿嘿,说不定还能有事半功倍的成效呢,呵呵(以上程序在Windows 98中调试通过)!