雖然你的想法是在 LoginBtn_Click 事件中將復(fù)雜的操作分離出去以減輕UI的負(fù)擔(dān), 這很好完全沒(méi)有問(wèn)題.

創(chuàng)新互聯(lián)擁有網(wǎng)站維護(hù)技術(shù)和項(xiàng)目管理團(tuán)隊(duì),建立的售前、實(shí)施和售后服務(wù)體系,為客戶提供定制化的成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、服務(wù)器托管解決方案。為客戶網(wǎng)站安全和日常運(yùn)維提供整體管家式外包優(yōu)質(zhì)服務(wù)。我們的網(wǎng)站維護(hù)服務(wù)覆蓋集團(tuán)企業(yè)、上市公司、外企網(wǎng)站、成都商城網(wǎng)站開(kāi)發(fā)、政府網(wǎng)站等各類(lèi)型客戶群體,為全球上1000家企業(yè)提供全方位網(wǎng)站維護(hù)、服務(wù)器維護(hù)解決方案。
但是問(wèn)題在于 Me.Invoke(dh)這里,若是ChkLogin里面仍然是大規(guī)模的操作呢 你的代碼就又變成將很復(fù)雜的操作扔給了UI, 當(dāng)然會(huì)出現(xiàn)窗體無(wú)法拖動(dòng)的情況了.
解決辦法很簡(jiǎn)單, 很多種. 將ChkLogin()里的操作直接放在DelegateLogin()里面吧 me.invoke僅僅只是做簡(jiǎn)單的輕量的刷新之類(lèi)的操作就好了.
希望能幫上你的忙.
VB6.0寫(xiě)的,代碼很簡(jiǎn)單,無(wú)意中寫(xiě)成的。應(yīng)該可以參考。不需要任何api函數(shù)。在無(wú)邊框窗體頂部中放入一個(gè)label標(biāo)簽。然后用label的 mouse down 和mouse move事件實(shí)現(xiàn)
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
End Sub
很簡(jiǎn)單,通過(guò)WindowsAPI,刪除窗體菜單項(xiàng)就行了
首先在窗體類(lèi)中聲明API:
Declare Function GetSystemMenu Lib "user32" (ByVal hWnd As IntPtr, ByVal bRevert As Boolean) As IntPtr
Declare Function RemoveMenu Lib "user32" (ByVal lngHmenu As IntPtr, ByVal nPosition As Integer, ByVal wFlags As Integer) As Integer
其次聲明API參數(shù)常量:
Const MF_BYPOSITION As Integer = H400
然后在窗體類(lèi)中寫(xiě)入過(guò)程:
Private Sub UserForm_Initialize_stopmove() '禁止窗體移動(dòng)
? 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代表菜單中從上往下數(shù)第一個(gè)菜單項(xiàng)
? End If
End Sub
Private Sub UserForm_Initialize_onmove() '恢復(fù)窗體移動(dòng)
? Dim lngHwnd As IntPtr
? Dim lngHmenu As IntPtr
? lngHwnd = Me.Handle
? If lngHwnd 0 Then
? ? ? lngHmenu = GetSystemMenu(lngHwnd, True)
RemoveMenu(lngHmenu, 0, MF_BYPOSITION) '這里的0與禁止代碼中的數(shù)值同步,原因時(shí)雖然表面上刪除了菜單項(xiàng),實(shí)則為隱藏了菜單項(xiàng),各個(gè)菜單的索引值并沒(méi)有變,所以0依然代表初始菜單的第一個(gè)菜單項(xiàng),即被刪除的那個(gè)菜單項(xiàng)
? End If
End Sub
然后如果你的窗口菜單是動(dòng)態(tài)變化的,建議聲明常數(shù):
Const MF_BYPOSITION As Integer = H0
然后使用相關(guān)的Windows功能的常數(shù)進(jìn)行刪除菜單。常數(shù)需要自行查看winuser.h頭文件
如果找不到該頭文件,可以看這里:網(wǎng)頁(yè)鏈接
其余信息詳見(jiàn)MSDN:網(wǎng)頁(yè)鏈接
最后說(shuō)一下,不建議前面網(wǎng)友說(shuō)的重寫(xiě)WndProc的方法,因?yàn)檫@樣攔截標(biāo)題欄點(diǎn)擊消息會(huì)導(dǎo)致窗體本身的菜單也無(wú)法顯示出來(lái),有損窗體功能,并且像雙擊左上角圖標(biāo)關(guān)閉窗體這樣的功能也會(huì)跟著攔截消息的操作一起被吞掉。
在VB中,BorderStyle屬性為0的窗體沒(méi)有邊框,并且也沒(méi)有與邊框相關(guān)的元素。這種窗體具有簡(jiǎn)潔、占用空間少等優(yōu)點(diǎn),用它可以設(shè)計(jì)出某些富有個(gè)性的窗體。但是,由于它沒(méi)有標(biāo)題欄,窗體不能移動(dòng),同時(shí)也不能改變大小,在某些情況下會(huì)給使用者造成一定的麻煩。本文介紹在VB中如何用API函數(shù)操作無(wú)邊框窗體。
移動(dòng)窗體
新建一標(biāo)準(zhǔn)工程,設(shè)置Form1的BorderStyle屬性為0。此時(shí)運(yùn)行程序后,無(wú)法移動(dòng)窗體。為能移動(dòng)窗體,在Form1的代碼窗口聲明下列函數(shù)和常數(shù):
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)
按下鼠標(biāo)左鍵
If Button = vbcenterButton Then
為當(dāng)前的應(yīng)用程序釋放鼠標(biāo)捕獲
ReleaseCapture
移動(dòng)窗體
SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MOVE, 0
End If
End Sub
注意:此時(shí)窗體上不能放置除Shape控件以外的任何控件,否則,在被控件遮住的地方點(diǎn)按鼠標(biāo)還是無(wú)法移動(dòng)窗體。要使點(diǎn)按控件也能移動(dòng)窗體,需再添加一個(gè)該控件的MouseDown事件過(guò)程,代碼與上述過(guò)程代碼相似。
改變窗體的大小
為了改變窗體的大小,需要添加一個(gè)Timer控件,以定時(shí)捕獲鼠標(biāo)在窗體中的位置。當(dāng)鼠標(biāo)位于窗體邊緣時(shí),改變鼠標(biāo)的形狀,以通知用戶可以進(jìn)行改變大小的操作。為此,將Timer控件的Interval屬性設(shè)為100(即每過(guò)100毫秒檢測(cè)一下鼠標(biāo)位置),其他取默認(rèn)值。
在Form1的代碼窗口中再添加下列兩個(gè)函數(shù),并定義兩個(gè)自定義變量和一個(gè)字符串變量:
取得窗體位置的函數(shù)
Private Declare Function GetWindowRect Lib “user32” (ByVal hwndAsLong, lpRect As RECT) As Long
取得鼠標(biāo)位置的函數(shù)
Private Declare Function GetCursorPos Lib “user32” (lpPointAsPOINTAPI) As Long
鼠標(biāo)位置變量
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
所要執(zhí)行的動(dòng)作變量,是移動(dòng)還是改變大小及從哪個(gè)方向改變大小
Dim Action As String
在Timer1控件的Timer事件過(guò)程中添加以下代碼:
Private Sub Timer1_Timer()
Dim MyRect As RECT
Dim MyPoint As POINTAPI
MyRect返回當(dāng)前窗口位置
Call GetWindowRect(Me.hwnd, MyRect)
MyPoint返回當(dāng)前鼠標(biāo)位置
Call GetCursorPos(MyPoint)
Select Case True
鼠標(biāo)位于窗體左上方
Case MyPoint.x MyRect.center + 5 And MyPoint.y ="" p=""
Screen.MousePointer = vbSizeNWSE
Action = “centerUp”
鼠標(biāo)位于窗體右下方
Case MyPoint.x MyRect.center - 5 And MyPoint.yMyRect.Bottom - 5
Screen.MousePointer = vbSizeNWSE
Action = “centerDown”
鼠標(biāo)位于窗體右上方
Case MyPoint.x MyRect.center - 5 And MyPoint.y="" p="" +=""
’45度雙向鼠標(biāo)指針
Screen.MousePointer = vbSizeNESW
Action = “centerUp”
鼠標(biāo)位于窗體左下方
Case MyPoint.x MyRect.center + 5 And MyPoint.yMyRect.Bottom - 5
Screen.MousePointer = vbSizeNESW
Action = “centerDown”
鼠標(biāo)位于窗體左邊
Case MyPoint.x MyRect.center + 5
水平雙向鼠標(biāo)指針
Screen.MousePointer = vbSizeWE
Action = “center”
鼠標(biāo)位于窗體右邊熱門(mén)推薦: C++程序設(shè)計(jì)之四書(shū)五經(jīng) 談?wù)凧AVA程序的反編譯1 2
MyRect.center - 5
Screen.MousePointer = vbSizeWE
Action = “center”
鼠標(biāo)位于窗體上方
Case MyPoint.y MyRect.Top + 5
垂直雙向鼠標(biāo)指針
Screen.MousePointer = vbSizeNS
Action = “Up”
鼠標(biāo)位于窗體下方
Case MyPoint.y MyRect.Bottom - 5
Screen.MousePointer = vbSizeNS
Action = “Down”
鼠標(biāo)位于窗體其他位置
Case Else
默認(rèn)鼠標(biāo)指針
Screen.MousePointer = 0
Action = “Move”
End Select
End Sub
當(dāng)利用SendMessage函數(shù)由系統(tǒng)向窗口發(fā)送改變大小的信息時(shí),只要將上面移動(dòng)窗體的語(yǔ)句“SendMessageMe.hwnd,WM_SYSCOMMAND, SC_MOVE, 0”中的第3個(gè)參數(shù)改為相應(yīng)的常數(shù)即可。
VB中HF001~HF008分別是從左、右、上、左上、右上、下、左下、右下8個(gè)方向改變窗體大小的常數(shù)。結(jié)合移動(dòng)窗體的代碼,將上述Form_MouseDown事件的代碼綜合如下(也可以把這8個(gè)常數(shù)聲明為自定義常數(shù)):
Private Sub Form_MouseDown(Button As Integer, Shift As Integer,xAs Single, y As Single)
按下鼠標(biāo)左鍵
If Button = vbcenterButton Then
為當(dāng)前的應(yīng)用程序釋放鼠標(biāo)捕獲
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
控件是可以顯示在里面的,你只要加個(gè)label,把label的屬性設(shè)為visualble=fause就行。設(shè)置鼠標(biāo)經(jīng)過(guò)頭像的mouseHover和mouseLeave事件,當(dāng)mouseHover時(shí)label的屬性visualble=true,當(dāng)mouseLeave時(shí)label的屬性visualble=fause即可。窗體的鼠標(biāo)事件可以設(shè)置控件的cursor屬性,里面可以選擇許多種鼠標(biāo)圖形。 只要是正常的Form都可以改變窗體大小,但是無(wú)邊框的窗體只能用函數(shù)改變或者設(shè)置屬性,在debug后是不能改變的。拖動(dòng)窗體需要在窗體的load時(shí)間里面寫(xiě)入當(dāng)鼠標(biāo)單擊不放時(shí)的事件即可,不難。
分享標(biāo)題:拖動(dòng)窗體vb.net,懸浮窗怎么拖動(dòng)
網(wǎng)頁(yè)URL:http://chinadenli.net/article26/hsjocg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)、網(wǎng)站內(nèi)鏈、品牌網(wǎng)站設(shè)計(jì)、ChatGPT、網(wǎng)頁(yè)設(shè)計(jì)公司、網(wǎng)站設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容
營(yíng)銷(xiāo)型網(wǎng)站建設(shè)知識(shí)