请问怎么样实现无标题窗体大小的改变(100分)
有一篇文章介绍了的,如下,可以我按照他的方法做时却不能改变大小,有谁能告诉我为什么吗
=================================
在VB中,BorderStyle属性为0的窗体没有边框,并且也没有与边框相关的元素。这种窗体具有简洁、占用空间少等优点,用它可以设计出某些富有个性的窗体。但是,由于它没有标题栏,窗体不能移动,同时也不能改变大小,在某些情况下会给使用者造成一定的麻烦。本文介绍在VB中如何用API函数操作无边框窗体。
移动窗体
新建一标准工程,设置Form1的BorderStyle属性为0。此时运行程序后,无法移动窗体。为能移动窗体,在Form1的代码窗口声明下列函数和常数:
Option Explicit
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
Const SC_MOVE = &HF012
在Form_MouseDown事件中输入以下代码:
Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
按下鼠标左键
If Button = vbLeftButton Then
为当前的应用程序释放鼠标捕获
ReleaseCapture
移动窗体
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MOVE, 0
End If
End Sub
注意:此时窗体上不能放置除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
鼠标位置变量
Private Type POINTAPI
x As Long
y As Long
End Type
窗体位置变量
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
所要执行的动作变量,是移动还是改变大小及从哪个方向改变大小
Dim Action As String
在Timer1控件的Timer事件过程中添加以下代码:
Private Sub Timer1_Timer()
Dim MyRect As RECT
Dim MyPoint As POINTAPI
MyRect返回当前窗口位置
Call GetWindowRect(Me.hwnd, MyRect)
MyPoint返回当前鼠标位置
Call GetCursorPos(MyPoint)
Select Case True
鼠标位于窗体左上方
Case MyPoint.x < MyRect.Left + 5 And MyPoint.y < MyRect.Top + 5
Screen.MousePointer = vbSizeNWSE
Action = “LeftUp”
鼠标位于窗体右下方
Case MyPoint.x > MyRect.Right - 5 And MyPoint.y > MyRect.Bottom - 5
Screen.MousePointer = vbSizeNWSE
Action = “RightDown”
鼠标位于窗体右上方
Case MyPoint.x > MyRect.Right - 5 And MyPoint.y < MyRect.Top + 5
’45度双向鼠标指针
Screen.MousePointer = vbSizeNESW
Action = “RightUp”
鼠标位于窗体左下方
Case MyPoint.x < MyRect.Left + 5 And MyPoint.y > MyRect.Bottom - 5
Screen.MousePointer = vbSizeNESW
Action = “LeftDown”
鼠标位于窗体左边
Case MyPoint.x < MyRect.Left + 5
水平双向鼠标指针
Screen.MousePointer = vbSizeWE
Action = “Left”
鼠标位于窗体右边
Case MyPoint.x > MyRect.Right - 5
Screen.MousePointer = vbSizeWE
Action = “Right”
鼠标位于窗体上方
Case MyPoint.y < MyRect.Top + 5
垂直双向鼠标指针
Screen.MousePointer = vbSizeNS
Action = “Up”
鼠标位于窗体下方
Case MyPoint.y > MyRect.Bottom - 5
Screen.MousePointer = vbSizeNS
Action = “Down”
鼠标位于窗体其他位置
Case Else
默认鼠标指针
Screen.MousePointer = 0
Action = “Move”
End Select
End Sub
当利用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
为当前的应用程序释放鼠标捕获
ReleaseCapture
Select Case Action
Case “Left”
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF001, 0
Case “Right”
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF002, 0
Case “Up”
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF003, 0
Case “LeftUp”
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF004, 0
Case “RightUp”
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF005, 0
Case “Down”
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF006, 0
Case “LeftDown”
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF007, 0
Case “RightDown”
SendMessage Me.hwnd, WM_SYSCOMMAND, &HF008, 0
Case “Move”
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MOVE, 0
End Select
End If
End Sub
问题点数:100、回复次数:9Top
1 楼3661512(.Net)回复于 2004-01-02 21:54:31 得分 0
直接调整窗口的Width和Height属性不行吗?例如长宽各增加100缇,
Private Sub Command1_Click()
Form1.Width = Form1.Width + 100
Form1.Height = Form1.Height + 100
End SubTop
2 楼aojin54(shirley)回复于 2004-01-02 22:41:47 得分 0
这种方法当然不行啦,操作又不方便,又不美观
要跟普通有标题窗口缩方一样的效果的Top
3 楼3661512(.Net)回复于 2004-01-02 22:57:04 得分 0
用SendMesage API函数
'窗体申明部分
Option Explicit
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
Private Const WM_SYSCOMMAND = &H112
Private Const SC_MINIMIZE = &HF020&
Private Const SC_MAXIMIZE = &HF030&
Private Const SC_RESTORE = &HF120&
Private Sub Command1_Click() '最大化
SendMessage Form1.hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0&
End Sub
Private Sub Command2_Click() '最小化
SendMessage Form1.hwnd, WM_SYSCOMMAND, SC_MINIMIZE, 0&
End Sub
Private Sub Command3_Click() '默认大小
SendMessage Form1.hwnd, WM_SYSCOMMAND, SC_RESTORE, 0&
End Sub
Private Sub Command4_Click() '具体的调节大小,这里是长宽各增加100缇
Form1.Width = Form1.Width + 100
Form1.Height = Form1.Height + 100
End Sub
Top
4 楼cpu54321(cpu)回复于 2004-01-02 22:58:29 得分 0
Dim lStyle As Long
lStyle = GetWindowLong(Me.hwnd, GWL_STYLE) And Not WS_BORDER
SetWindowLong Me.hwnd, GWL_STYLE, lStyle
SetWindowPos Me.hwnd, 0&, 0&, 0&, 0&, 0&, SWP_NOSIZE Or SWP_FRAMECHANGED Or SWP_NOMOVE
这样可以,不过在运行后要改窗体标题的话要用下面这样,不能直接改:
SetWindowText Me.hwnd, "Happy New Year!"
这个不能改大小:
lStyle = GetWindowLong(Me.hwnd, GWL_STYLE) And Not WS_BORDER And Not WS_DLGFRAME And Not WS_SIZEBOX
SetWindowLong Me.hwnd, GWL_STYLE, lStyle
SetWindowPos Me.hwnd, 0&, 0&, 0&, 0&, 0&, SWP_NOSIZE Or SWP_FRAMECHANGED Or SWP_NOMOVE
Top
5 楼hhjjhjhj(大头)(http://office.9zp.com)回复于 2004-01-02 23:14:37 得分 0
用控件也行啊
如下是底边的例子
随便画一个空Picture1
Private Sub Form_Load()
With Me.Picture1
.Width = Me.Width
.Height = 5
.MousePointer = 7
.Top = Me.ScaleHeight - 10
.Left = 0
End With
End Sub
Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Me.Height = Me.Height + Y
Me.Picture1.Top = Me.ScaleHeight - 10
End If
End SubTop
6 楼rainstormmaster(暴风雨 v2.0)回复于 2004-01-03 00:12:14 得分 100
//有一篇文章介绍了的,如下,可以我按照他的方法做时却不能改变大小,有谁能告诉我为什么吗
新建一标准工程,设置Form1的BorderStyle属性为0,并输入下面的代码:
Option Explicit
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'获取窗体结构信息函数
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_SIZEBOX = &H40000
Private Sub Form_Load()
Dim lStyle As Long
lStyle = GetWindowLong(Me.hwnd, GWL_STYLE)
lStyle = lStyle Or WS_SIZEBOX '为窗体增加 WS_SIZEBOX风格,可以改变大小
'按lStyle的值设置窗体信息
SetWindowLong Me.hwnd, GWL_STYLE, lStyle
'保持窗体的大小与位置不变
Me.Width = Me.Width + 100 '强制窗体刷新,当然还有别的刷新方法,但是这样容易
Me.Width = Me.Width - 100
End Sub
Top
7 楼rainstormmaster(暴风雨 v2.0)回复于 2004-01-03 00:12:58 得分 0
或者,设置Form1的BorderStyle属性为2,用setwindowlong去掉标题栏也可
Option Explicit
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'获取窗体结构信息函数
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Const GWL_STYLE = (-16)
Private Const WS_CAPTION = &HC00000
Private Sub Form_Load()
Dim lStyle As Long
lStyle = GetWindowLong(Me.hwnd, GWL_STYLE)
lStyle = lStyle And Not WS_CAPTION
'按lStyle的值设置窗体信息
SetWindowLong Me.hwnd, GWL_STYLE, lStyle
'保持窗体的大小与位置不变
Me.Width = Me.Width + 100 '强制窗体刷新,当然还有别的刷新方法,但是这样容易
Me.Width = Me.Width - 100
End Sub
Top
8 楼ChinaKable(Kable)回复于 2004-01-03 00:30:44 得分 0
学习学习!Top
9 楼liyan010(我是大坏蛋)回复于 2004-01-03 03:33:18 得分 0
save & thinking~Top




