扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
在VB中,BorderStyle属性为0的窗体没有边框,并且也没有与边框相关的元素。这种窗体具有简洁、占用空间少等优点,用它可以设计出某些富有个性的窗体。但是,由于它没有标题栏,窗体不能移动,同时也不能改变大小,在某些情况下会给使用者造成一定的麻烦。本文介绍在VB中如何用API函数操作无边框窗体。
创新互联专注于府谷网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供府谷营销型网站建设,府谷网站制作、府谷网页设计、府谷网站官网定制、微信平台小程序开发服务,打造府谷网络公司原创品牌,更为您提供府谷网站排名全网营销落地服务。
移动窗体
新建一标准工程,设置Form1的BorderStyle属性为0。此时运行程序后,无法移动窗体。为能移动窗体,在Form1的代码窗口声明下列函数和常数:
Option Explicit
Private Declare Function ReleaseCapture Lib “user32” ()AsLong
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,XAs Single, Y As Single)
按下鼠标左键
If Button = vbcenterButton 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 hwndAsLong, lpRect As RECT) As Long
取得鼠标位置的函数
Private Declare Function GetCursorPos Lib “user32” (lpPointAsPOINTAPI) As Long
鼠标位置变量
Private Type POINTAPI
x As Long
y As Long
End Type
窗体位置变量
Private Type RECT
center As Long
Top As Long
center 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.center + 5 And MyPoint.y ="" p=""
Screen.MousePointer = vbSizeNWSE
Action = “centerUp”
鼠标位于窗体右下方
Case MyPoint.x MyRect.center - 5 And MyPoint.yMyRect.Bottom - 5
Screen.MousePointer = vbSizeNWSE
Action = “centerDown”
鼠标位于窗体右上方
Case MyPoint.x MyRect.center - 5 And MyPoint.y="" p="" +=""
’45度双向鼠标指针
Screen.MousePointer = vbSizeNESW
Action = “centerUp”
鼠标位于窗体左下方
Case MyPoint.x MyRect.center + 5 And MyPoint.yMyRect.Bottom - 5
Screen.MousePointer = vbSizeNESW
Action = “centerDown”
鼠标位于窗体左边
Case MyPoint.x MyRect.center + 5
水平双向鼠标指针
Screen.MousePointer = vbSizeWE
Action = “center”
鼠标位于窗体右边热门推荐: C++程序设计之四书五经 谈谈JAVA程序的反编译1 2
MyRect.center - 5
Screen.MousePointer = vbSizeWE
Action = “center”
鼠标位于窗体上方
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函数由系统向窗口发送改变大小的信息时,只要将上面移动窗体的语句“SendMessageMe.hwnd,WM_SYSCOMMAND, SC_MOVE, 0”中的第3个参数改为相应的常数即可。
VB中HF001~HF008分别是从左、右、上、左上、右上、下、左下、右下8个方向改变窗体大小的常数。结合移动窗体的代码,将上述Form_MouseDown事件的代码综合如下(也可以把这8个常数声明为自定义常数):
Private Sub Form_MouseDown(Button As Integer, Shift As Integer,xAs Single, y As Single)
按下鼠标左键
If Button = vbcenterButton Then
为当前的应用程序释放鼠标捕获
ReleaseCapture
Select Case Action
Case “center”
SendMessage Me.hwnd, WM_SYSCOMMAND, HF001, 0
Case “center”
SendMessage Me.hwnd, WM_SYSCOMMAND, HF002, 0
Case “Up”
SendMessage Me.hwnd, WM_SYSCOMMAND, HF003, 0
Case “centerUp”
SendMessage Me.hwnd, WM_SYSCOMMAND, HF004, 0
Case “centerUp”
SendMessage Me.hwnd, WM_SYSCOMMAND, HF005, 0
Case “Down”
SendMessage Me.hwnd, WM_SYSCOMMAND, HF006, 0
Case “centerDown”
SendMessage Me.hwnd, WM_SYSCOMMAND, HF007, 0
Case “centerDown”
SendMessage Me.hwnd, WM_SYSCOMMAND, HF008, 0
Case “Move”
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MOVE, 0
End Select
End If
End Sub
这个问题,如有可能你应当先把大的控件停靠在窗体的某部分,其他的控件用form的resize事件触发控件宽高的数值或控件位置坐标的数值。例:
Private Sub Form1_Resize(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Resize
Dim pLabel1, pTextBox1, pButton1 As New Point
pLabel1.X = CInt(Me.Width / 7)
pLabel1.Y = CInt(Me.Height / 8) + 4
pTextBox1.X = CInt(Me.Width / 5)
pTextBox1.Y = CInt(Me.Height / 8)
pButton1.X = CInt(Me.Width / 3)
pButton1.Y = CInt(Me.Height / 8) - 1
Me.Label1.Location = pLabel1
Me.TextBox1.Location = pTextBox1
Me.Button1.Location = pButton1
End Sub
以上只是改变了控件的位置,如需改变控件的大小,重新定义计算控件的size属性
考虑换个方式吧,用工具栏,工具栏
有个按钮叫
splitbutton,还有另一种忘记叫什么,就是这个样子的按钮。两个样子接近,但是实际操作有点区别,一种是务必下拉,一种可以直接点击。
这样山寨出来的肯定问题多多,就算外观弄好了,操作起来可能又有意想不到的意外。如果实在要这样做,combobox是无法调高度的,看一下属性栏他的高度是多少,把那个值复制给按钮,如果还不一致,就一点一点调,好像高度是22,你就23试一下,21试一下。
可以用窗体的Resize事件来实现,改变窗体大小时,控件大小跟窗体成比例,不过如果最小化的时候就会出错,所以还得把最小化的事件给去了,代码如下:
Private Sub Form_Resize()
If Me.WindowState 1 Then '如果不是最小化
Command1.Width = Me.Width / 5 '按钮宽度是窗体的1/5
Command1.Height = Me.Height / 5 '按钮高度是窗体的1/5
End If
End Sub
参数可以自己设定,其它的也是如此,细节还得自己弄了,如果想让控件居中可以这样:
Private Sub Form_Resize()
If Me.WindowState 1 Then '如果不是最小化
Command1.Width = Me.Width / 5 '按钮宽度是窗体的1/5
Command1.Height = Me.Height / 5 '按钮高度是窗体的1/5
Command1.Left = (Me.Width - Command1.Width) / 2 '按钮左边
Command1.Top = (Me.Height - Command1.Height) / 2 '按钮顶边
End If
End Sub
这样就可以随窗体改变而改变了。
以下代码添加到你需要触发的事件里:
1,把你的textbox的Multiline改成True(如果此处不修改你后面修改大小的时候只能修改width,而不能修改height),如果希望自动修改height,你的字体也要修改
2,添加这句代码(假设你要修改大小的textbox就是textbox1):
TextBox1.Location = New System.Drawing.Point(5, 20) '5, 20是你定义的针对窗体左上角点的X和Y位置
textbox1.size= New System.Drawing.Size(500, 600)‘500, 600是你自己定义的宽(width)和高(height)
3,或者直接写成:
TextBox1.Multiline = True’允许修改多行文本框
TextBox1.Location = New Point(5, 20) '5, 20是你定义的针对窗体左上角点的水平X和垂直Y位置
TextBox1.Size = New System.Drawing.Size(500, 600)‘500, 600是你自己定义的宽(width)和高(height)
动态生成的控件是不是忘记加到夫控件里面了?你可以加上一句me.controls.add(tablelayoutpanel1)
你可以在窗体设计器里添加一个label到tablelayoutpanel里,用记事本打开这个窗体的.design.vb文件查看系统添加的方式
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流