说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

运行时改变控件大小的两种方法-VB资料

HTML文档下载 WORD文档下载 PDF文档下载
运行时改变控件大小的两种方法-VB资料


广东石碣源兴电脑 李法龙
  通常我们在设计应用程序时可以任意改变控件的大小( 除去象Timer这样的运行时不可显示的控件), 以使其满足我们的实际需要,使界面友好而且美观大方。但有些时候,我们为了方便用户,需要提供在运行时刻能够改变控件大小的功能,使用户能够根据程序显示,输出的需要通过鼠标的拖放改变控件的大小,从而方便用户的阅读浏览等。本文就此向诸位介绍两种方法来达到此目的。

  我们知道,运行时刻可见的控件都具有 Top, Left, Height, Width 等属性,用以定位其在窗体上的位置及大小,在运行时刻改变控件大小的原理也基于此。通过鼠标的拖放等操作,动态改变控件的Top, Left, Bottom, Height 属性值,从而定制控件的大小,甚至拖动整个控件。

  第一种方法需要 Win32 API 函数。所用到的 API 函数有:

Declare Function ScreenToClient Lib "user32"(ByVal hwnd As Long, lpPoint As POINTAPI) As Long
  获得鼠标的屏幕坐标放在lpPoint 中。

Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
  将屏幕坐标转化成客户区坐标系统的坐标,转换后的坐标仍在 lpPoint 中。

  新开一个工程,在 Form1 上放一个 TextBox 控件,命名为 Text1。在 Form 的 MouseMove 事件中捕获鼠标坐标,如果鼠标的位置与 Text1 的边界相距很近(比如说50 Twips,150 效果比较好),根据需要将 Form1 的MousePointer 属性值为 vbSizeNS (垂直尺寸线),或 vbSizeWE(水平尺寸线), 或 vbSizeNESW(右上-左下尺寸线),或 vbSizeNWSE(左上-右下尺寸线)。用户一看就知道可以改变该控件的尺寸。而在其余区域则将 Form1 的 MousePointer 属性设成缺省值(vbDefault)。当用户按下鼠标键并拖动鼠标时根据当前的 MousePointer 进行判断该如何改变控件的大小。具体操作可参看附带的例程。

  第二中方法不需要调用API 函数,但需要额外的控件。同样新开一个工程,在Form1 上放一个TextBox 控件,命名为Text1。然后紧靠Text1 的右侧放一个高度与Text1 相同但宽度尽量小的PictureBox 控件,命名为Picture1。宽度要小到看不见立体效果。将Picture1 的MousePointer 属性设置成9 (vbSizeWE) 。

  Picture1 的MouseMove 事件如下:

Private Sub Text1_MouseMove(Button As Integer,Shift As Integer, x As Single, y As Single)
If Button<>1 Then Exit Sub
Picture1.Left=Picture1.Left+X
'Move Picture
Text1.Width=Picture1.Left-Text1.Left
'Change TextBox's size
End Sub

  运行程序,将鼠标移到 Text1 的右边缘,这时鼠标变成水平尺寸线的样式,按住鼠标左键左右移动鼠标,你会看到 Text1 的大小可以自由改变。
  以上只是举一些简单的例子说明定制控件尺寸的基本方法,起到抛砖引玉的作用,读者可以根据需要增强相应的功能,但要注意建立错误陷阱捕获错误。

  附:

  第一种方法的源程序:

'API Function declare

Declare Function ScreenToClient Lib "user32"(ByVal hwnd As Long, lpPoint As POINTAPI) As Long
Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

Type POINTAPI
x As Long
y As Long
End Type

Private Sub Form_MouseMove(Button As Integer,Shift As Integer, x As Single, y As Single)
Dim Pnt As POINTAPI
Dim CurX As Long
Dim CurY As Long
Dim DistX As Long
Dim DistY As Long

Const mDist = 150 '150 twips

GetCursorPos Pnt
'Get mouse position
ScreenToClient Me.hwnd, Pnt
'Convert to client coordinate
CurX = Pnt.x * Screen.TwipsPerPixelX
'Pixels to Twips
CurY = Pnt.y * Screen.TwipsPerPixelY
DistX = Abs(CurX - (Text1.Left + Text1.Width))
'distance to text1's
DistY = Abs(CurY - (Text1.Top + Text1.Height))

If DistX < = mDist And DistY < = mDist Then
  'set mouse pointer
  'according to distance 
  Form1.MousePointer = vbSizeNWSE
ElseIf DistX <= mDist And DistY > mDist Then
  Form1.MousePointer = vbSizeWE
  ElseIf DistX > mDist And DistY <= mDist Then
  Form1.MousePointer = vbSizeNS
Else
  Form1.MousePointer = vbDefault
End If

If Button <> 1 Then Exit Sub
If Form1.MousePointer = vbSizeNWSE Then
  'change text1' size
  Text1.Width = CurX - Text1.Left
  Text1.Height = CurY - Text1.Top
End If
If Form1.MousePointer = vbSizeWE Then
  Text1.Width = CurX - Text1.Left
End If
If Form1.MousePointer = vbSizeNS Then
  Text1.Height = CurY - Text1.Top
End If
End Sub

Private Sub Text1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
Form1.MousePointer = vbDefault
'set default mouse pointer
End Sub

备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘