虽然你的想法是在 LoginBtn_Click 事件中将复杂的操作分离出去以减轻UI的负担, 这很好完全没有问题.
但是问题在于 Me.Invoke(dh)这里,若是ChkLogin里面仍然是大规模的操作呢 你的代码就又变成将很复杂的操作扔给了UI, 当然会出现窗体无法拖动的情况了.
解决办法很简单, 很多种. 将ChkLogin()里的操作直接放在DelegateLogin()里面吧 me.invoke仅仅只是做简单的轻量的刷新之类的操作就好了.
希望能帮上你的忙.
Dim a, b As Single
Private Sub Label1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
a = X
b = Y
End Sub
Private Sub Label1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
If Button = 1 Then
Form1.Move Left + X - a, Top + Y - b
End If
很简单,通过WindowsAPI,删除窗体菜单项就行了
首先在窗体类中声明API:
其次声明API参数常量:
然后在窗体类中写入过程:
Private Sub UserForm_Initialize_stopmove() '禁止窗体移动
? ? Dim lngHwnd As IntPtr
? ? Dim lngHmenu As IntPtr
? ? lngHwnd = Me.Handle
? ? If lngHwnd 0 Then
? ? ? ? lngHmenu = GetSystemMenu(lngHwnd, False)
? ? ? ? RemoveMenu(lngHmenu, 0, MF_BYPOSITION) '这里的0代表菜单中从上往下数第一个菜单项
? ? End If
Private Sub UserForm_Initialize_onmove() '恢复窗体移动
? ? ? ? lngHmenu = GetSystemMenu(lngHwnd, True)
RemoveMenu(lngHmenu, 0, MF_BYPOSITION) '这里的0与禁止代码中的数值同步,原因时虽然表面上删除了菜单项,实则为隐藏了菜单项,各个菜单的索引值并没有变,所以0依然代表初始菜单的第一个菜单项,即被删除的那个菜单项
然后如果你的窗口菜单是动态变化的,建议声明常数:
Const MF_BYPOSITION As Integer = H0
然后使用相关的Windows功能的常数进行删除菜单.常数需要自行查看winuser.h头文件
如果找不到该头文件,可以看这里:网页链接
其余信息详见MSDN:网页链接
在VB中,BorderStyle属性为0的窗体没有边框,并且也没有与边框相关的元素.这种窗体具有简洁、占用空间少等优点,用它可以设计出某些富有个性的窗体.但是,由于它没有标题栏,窗体不能移动,同时也不能改变大小,在某些情况下会给使用者造成一定的麻烦.本文介绍在VB中如何用API函数操作无边框窗体.
移动窗体
新建一标准工程,设置Form1的BorderStyle属性为0.此时运行程序后,无法移动窗体.为能移动窗体,在Form1的代码窗口声明下列函数和常数:
Option Explicit
ByVal wParam As Long, lParam As Any) As Long
在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
注意:此时窗体上不能放置除Shape控件以外的任何控件,否则,在被控件遮住的地方点按鼠标还是无法移动窗体.要使点按控件也能移动窗体,需再添加一个该控件的MouseDown事件过程,代码与上述过程代码相似.
改变窗体的大小
为了改变窗体的大小,需要添加一个Timer控件,以定时捕获鼠标在窗体中的位置.当鼠标位于窗体边缘时,改变鼠标的形状,以通知用户可以进行改变大小的操作.为此,将Timer控件的Interval属性设为100(即每过100毫秒检测一下鼠标位置),其他取默认值.
在Form1的代码窗口中再添加下列两个函数,并定义两个自定义变量和一个字符串变量:
取得窗体位置的函数
取得鼠标位置的函数
鼠标位置变量
Private Type POINTAPI
x As Long
y As Long
End Type
窗体位置变量
Private Type RECT
center As Long
Top As Long
Bottom As Long
所要执行的动作变量,是移动还是改变大小及从哪个方向改变大小
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
鼠标位于窗体左上方
Screen.MousePointer = vbSizeNWSE
Action = "centerUp"
鼠标位于窗体右下方
Action = "centerDown"
鼠标位于窗体右上方
Screen.MousePointer = vbSizeNESW
鼠标位于窗体左下方
鼠标位于窗体左边
水平双向鼠标指针
Screen.MousePointer = vbSizeWE
Action = "center"
鼠标位于窗体上方
垂直双向鼠标指针
Screen.MousePointer = vbSizeNS
Action = "Up"
鼠标位于窗体下方
Action = "Down"
鼠标位于窗体其他位置
Case Else
默认鼠标指针
Screen.MousePointer = 0
Action = "Move"
End Select
Private Sub Form_MouseDown(Button As Integer, Shift As Integer,xAs Single, y As Single)
Select Case Action
Case "center"
SendMessage Me.hwnd, WM_SYSCOMMAND, HF001, 0
Case "Up"
Case "centerUp"
Case "Down"
Case "centerDown"
Case "Move"
控件是可以显示在里面的,你只要加个label,把label的属性设为visualble=fause就行.设置鼠标经过头像的mouseHover和mouseLeave事件,当mouseHover时label的属性visualble=true,当mouseLeave时label的属性visualble=fause即可.窗体的鼠标事件可以设置控件的cursor属性,里面可以选择许多种鼠标图形. 只要是正常的Form都可以改变窗体大小,但是无边框的窗体只能用函数改变或者设置属性,在debug后是不能改变的.拖动窗体需要在窗体的load时间里面写入当鼠标单击不放时的事件即可,不难.
以上就是土嘎嘎小编为大家整理的拖动窗体vb.net相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!