VB輔導(dǎo):窗體遷移大法

字號(hào):

有很多軟件為了實(shí)現(xiàn)特殊的顯示效果,采用非矩形的窗體,而這些窗體往往沒有標(biāo)題欄。想要移動(dòng)一個(gè)沒有標(biāo)題欄的窗口是不那么容易的。下面我介紹兩種在VB中采取不同原理的方法移動(dòng)一個(gè)沒有標(biāo)題欄的窗口。
    方法一
    這種方法是在窗體的MouseDown、MouseUp和MouseMove等事件的處理過程中添加代碼,實(shí)現(xiàn)在鼠標(biāo)左鍵按下后移動(dòng)時(shí),改變窗體的Left和Top屬性,實(shí)現(xiàn)移動(dòng)無標(biāo)題欄的窗體。
    進(jìn)入VB,把窗體Form1的BorderStyle屬性設(shè)置為0-None(無標(biāo)題欄),再窗體上添加一個(gè)ButtonCommand組件,用來關(guān)閉程序。代碼如下:
    Private Type POINT
     X As Single
     Y As Single
    End Type
    Dim FormP As POINT
    '記錄窗體原始位置
    Dim MouseP As POINT
    '記錄鼠標(biāo)按下時(shí)的位置
    Dim MouseLButtonDown As Boolean
    '記錄鼠標(biāo)左鍵是否按下
    Private Sub Command1_Click()
     End '退出程序
    End Sub
    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
     FormP.X = Form1.Left
    '記下窗體原始坐標(biāo)位置
     FormP.Y = Form1.Top
     MouseP.X = X
    '記下鼠標(biāo)按下時(shí)的位置
     MouseP.Y = Y
     If Button = 1 Then
     MouseLButtonDown = True
    '鼠標(biāo)左鍵按下
     End If
    End Sub
    Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
     If MouseLButtonDown Then
     Form1.Left = FormP.X + (X - MouseP.X) '移動(dòng)窗體
     Form1.Top = FormP.Y + (Y - MouseP.Y)
     End If
    End Sub
    Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single)
     MouseLButtonDown = False
    '鼠標(biāo)左鍵彈起
    End Sub
    上述方法不是很完善,制作出的窗體被拖動(dòng)時(shí),窗體會(huì)隨鼠標(biāo)的移動(dòng)而移動(dòng)。而在默認(rèn)的Windows設(shè)置中拖動(dòng)窗體時(shí),被拖動(dòng)的窗體不會(huì)隨窗體的移動(dòng)而移動(dòng),隨窗體移動(dòng)的僅是一個(gè)與窗體形狀、大小一樣的虛框,只有釋放鼠標(biāo)后,窗體才會(huì)移動(dòng)到釋放鼠標(biāo)時(shí)虛框的所在處。要實(shí)現(xiàn)這種效果,請(qǐng)看第二種方法。
    方法二
    這種方法通過消息的發(fā)送實(shí)現(xiàn)移動(dòng)無標(biāo)題窗體。當(dāng)鼠標(biāo)按下、移動(dòng)或釋放時(shí),將鼠標(biāo)在窗體上按下的消息(消息值為HTCAPTION)發(fā)出,就可以拖動(dòng)窗體了。代碼如下:
    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
    Private Const WM_NCLBUTTONDOWN = &&HA1
    Private Const HTCAPTION = 2
    '以上API函數(shù)和常數(shù)的聲明可在VB自帶的“API 瀏覽器”中找到
    Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
     '在窗體的MouseDown事件中添加以下代碼
     If Button = 1 Then
     Call ReleaseCapture
     Call SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0)
     End If
    End Sub
    Private Sub Command1_Click()
    End   '退出程序
    End Sub
    這種方法實(shí)現(xiàn)起來比第一種方法更容易,只有幾行代碼,并且沒有那么多的變量,窗體被拖動(dòng)時(shí)與普通窗體一樣,只有一個(gè)虛框隨鼠標(biāo)的移動(dòng)而移動(dòng),當(dāng)釋放鼠標(biāo)時(shí)窗體才移動(dòng)到相應(yīng)的位置。用到了兩個(gè)API函數(shù)。
    以上程序在VB 6.0和Windows 98SE下調(diào)試通過。