用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心编程技巧VisualBasic

运行时改变控件大小的两种方法

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 19:49:19
广东石碣源兴电脑 李法龙
   通常我们在设计应用程序时可以任意改变控件的大小( 除去象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 分) 查看完整评论
PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:17,062.50000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号