VB程序员博客

VB程序开发

Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As Long
Private Declare Function PtInRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Boolean
Private Declare Function ReleaseCapture Lib "user32" () As Long
Private Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function GetCapture Lib "user32" () As Long
Private Declare Function PtInRegion Lib "gdi32" (ByVal hRgn As Long, ByVal x As Long, ByVal y As Long) As Long
Private Type RECT
        Left As Long
        Top As Long
        Right As Long
        Bottom As Long
End Type
Private Type POINTAPI
        x As Long
        y As Long
End Type
Private Sub Command1_MouseMove(Button As Integer, Shift As Integer, x As Single, y As Single)
        Dim pt    As POINTAPI
        Dim Rc    As RECT
       
        pt.x = Me.ScaleX(x, vbTwips, vbPixels)
        pt.y = Me.ScaleY(y, vbTwips, vbPixels)
       
       
        Call GetWindowRect(Me.Command1.hwnd, Rc)

        If Not PtInRect(Rc, pt.x, pt.y) Then
            Me.Command1.Caption = "Error"
            ReleaseCapture
        Else
            Me.Command1.Caption = "OK"
            If GetCapture <> Me.Command1.hwnd Then SetCapture Me.Command1.hwnd
        End If
 
End Sub

注:
当PtInRect声明为以下格式时总返回0
Private Declare Function PtInRect Lib "user32" (lpRect As RECT, ByVal x As Long, ByVal y As Long) As Long
当PtInRect声明为以下格式时总报Bad DLL calling convention错误
Private Declare Function PtInRect Lib "user32" (lpRect As RECT, pt As POINTAPI) As Long
请大家帮忙解释一下

还有 PtInRect() 的返回值:
ⷃ 中的 BOOL 是 4 字节,VB 中不是用 Boolean 而是用 Long 对应。
̤ⷨ𘔠C 中用 {0,1} 表示 {false,true} ,在 C 中取 Not 为 {1,0};但是到 VB 中取 Not 为 {-1,-2} 都为 True,所以对 API 的 BOOL 返回值 VB 中应该用是否为 0 进行判断,不能等同于 Boolean。


标签: ,