运行时改变控件大小的两种方法
通常我们在设计应用程序时可以任意改变控件的大小( 除去象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
Tags:
作者:佚名评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论