操作VB中的无边框窗体2005-10-06 12:39:00
【评论】
【打印】
【字体:大 中 小】
本文链接:http://blog.pfan.cn/iamben250/5777.html
操作VB中的无边框窗体
湖南省郴州市苏仙区信用联社(423000) 段岳辉
在VB中,BorderStyle属性为0的窗体没有边框,并且也没有与边框相关的元素。这种窗体具有简洁、占用空间少等优点,用它可以设计出某些富有个性的窗体。但是,由于它没有标题栏,窗体不能移动,同时也不能改变大小,在某些情况下会给使用者造成一定的麻烦。本文介绍在VB中如何用API函数操作无边框窗体。 |
新建一标准工程,设置Form1的BorderStyle属性为0。此时运行程序后,无法移动窗体。为能移动窗体,在Form1的代码窗口声明下列函数和常数: |
Private Declare Function ReleaseCapture Lib “user32” () As Long |
Private Declare Function SendMessage Lib “user32” Alias “SendMessageA” (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long |
Const WM_SYSCOMMAND = &H112 |
在Form_MouseDown事件中输入以下代码: |
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) |
If Button = vbLeftButton Then |
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MOVE, 0 |
注意:此时窗体上不能放置除Shape控件以外的任何控件,否则,在被控件遮住的地方点按鼠标还是无法移动窗体。要使点按控件也能移动窗体,需再添加一个该控件的MouseDown事件过程,代码与上述过程代码相似。 |
为了改变窗体的大小,需要添加一个Timer控件,以定时捕获鼠标在窗体中的位置。当鼠标位于窗体边缘时,改变鼠标的形状,以通知用户可以进行改变大小的操作。为此,将Timer控件的Interval属性设为100(即每过100毫秒检测一下鼠标位置),其他取默认值。 |
在Form1的代码窗口中再添加下列两个函数,并定义两个自定义变量和一个字符串变量: |
Private Declare Function GetWindowRect Lib “user32” (ByVal hwnd As Long, lpRect As RECT) As Long |
Private Declare Function GetCursorPos Lib “user32” (lpPoint As POINTAPI) As Long |
'所要执行的动作变量,是移动还是改变大小及从哪个方向改变大小 |
在Timer1控件的Timer事件过程中添加以下代码: |
Private Sub Timer1_Timer() |
Call GetWindowRect(Me.hwnd, MyRect) |
Call GetCursorPos(MyPoint) |
Case MyPoint.x < MyRect.Left + 5 And MyPoint.y < MyRect.Top + 5 |
Screen.MousePointer = vbSizeNWSE |
Case MyPoint.x > MyRect.Right - 5 And MyPoint.y > MyRect.Bottom - 5 |
Screen.MousePointer = vbSizeNWSE |
Case MyPoint.x > MyRect.Right - 5 And MyPoint.y < MyRect.Top + 5 |
Screen.MousePointer = vbSizeNESW |
Case MyPoint.x < MyRect.Left + 5 And MyPoint.y > MyRect.Bottom - 5 |
Screen.MousePointer = vbSizeNESW |
Case MyPoint.x < MyRect.Left + 5 |
Screen.MousePointer = vbSizeWE |
Case MyPoint.x > MyRect.Right - 5 |
Screen.MousePointer = vbSizeWE |
Case MyPoint.y < MyRect.Top + 5 |
Screen.MousePointer = vbSizeNS |
Case MyPoint.y > MyRect.Bottom - 5 |
Screen.MousePointer = vbSizeNS |
当利用SendMessage函数由系统向窗口发送改变大小的信息时,只要将上面移动窗体的语句“SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MOVE, 0”中的第3个参数改为相应的常数即可。 |
VB中&HF001~&HF008分别是从左、右、上、左上、右上、下、左下、右下8个方向改变窗体大小的常数。结合移动窗体的代码,将上述Form_MouseDown事件的代码综合如下(也可以把这8个常数声明为自定义常数): |
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, x As Single, y As Single) |
If Button = vbLeftButton Then |
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF001, 0 |
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF002, 0 |
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF003, 0 |
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF004, 0 |
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF005, 0 |
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF006, 0 |
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF007, 0 |
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF008, 0 |
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MOVE, 0 |
阅读(1815) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论