2016-09-02 5 views
2

Ich implementiere eine Drag-and-Drop-Simulation in einer kontinuierlichen Form.Kontrolle ms Zugriff scrollbar in kontinuierlicher Form

im Grunde die Art, wie es funktioniert, gibt es eine Liste von Personen in der Seite und der Benutzer kann eine Person aus der Liste in ein Feld ziehen (das ist eine Sitzliste, mit Feldern wie Seat1, Seat2, Seat3 .. ., und jede Sitzreihe ist ein neuer Rekord).

Für die grundlegende Drag & Drop-Funktionalität verwende ich die Anweisungen von diesem Link Drag And Drop, und es funktioniert gut.

jetzt hier ist mein Problem, um zu wissen, auf welchem ​​Datensatz der Benutzer die Maus bewegt, muss ich die Position der Maus durch den Detailabschnitt zu berechnen, so während das Formular nicht gescrollt ist funktioniert es gut , aber wenn das Formular gescrollt wird, muss ich zuerst wissen, wie stark das Formular ist, und dies kann nur durch eine Windows-API erreicht werden.

so fand ich, dass www.lebans.com/conformscurcontrol.htm genau den Code ich brauche, aber das funktionierte nur in älteren Versionen von MS-Zugriff, der Code, der in der neueren Version einbricht, ist, dass er überprüft von einem Fenster Klassenname "scrollbar" und Aufruf der GetScrollInfo API, aber in neueren Versionen gibt es keine Klasse namens "scrollbar", aber es gibt eine andere Klasse namens NUIScrollbar See Here, aber auch wenn ich es auf diesen Namen ändere t erhalten Sie eine gültige Scrollbar-Klasse (LPSCROLLINFO) zurück. Hier

ist der Code von Stephen Lebans

Public Function fGetScrollBarPos(frm As Form) As Long 
' Return ScrollBar Thumb position 
' for the Vertical Scrollbar attached to the 
' Form passed to this Function. 

Dim hWndSB As Long 
Dim lngRet As Long 
Dim sinfo As SCROLLINFO 

    ' Init SCROLLINFO structure 
    sinfo.fMask = SIF_ALL 
    sinfo.cbSize = Len(sinfo) 
    sinfo.nPos = 0 
    sinfo.nTrackPos = 0 

    ' Call function to get handle to 
    ' ScrollBar control if it is visible 
    hWndSB = fIsScrollBar(frm) 
    If hWndSB = -1 Then 
     fGetScrollBarPos = False 
     Exit Function 
    End If 

    ' Get the window's ScrollBar position 
    lngRet = apiGetScrollInfo(hWndSB, SB_CTL, sinfo) 
    'Debug.Print "nPos:" & sInfo.nPos & " nPage:" & sInfo.nPage & " nMax:" & sInfo.nMax 
    fGetScrollBarPos = sinfo.nPos + 1 

End Function 

Private Function fIsScrollBar(frm As Form) As Long 
' Get ScrollBar's hWnd 
Dim hWnd_VSB As Long 
Dim hWnd As Long 

hWnd = frm.hWnd 

    ' Let's get first Child Window of the FORM 
    hWnd_VSB = apiGetWindow(hWnd, GW_CHILD) 

    ' Let's walk through every sibling window of the Form 
    Do 
     ' Thanks to Terry Kreft for explaining 
     ' why the apiGetParent acll is not required. 
     ' Terry is in a Class by himself! :-) 
     'If apiGetParent(hWnd_VSB) <> hWnd Then Exit Do 

dies der alte Frieden

 If fGetClassName(hWnd_VSB) = "scrollBar" Then 
      If apiGetWindowLong(hWnd_VSB, GWL_STYLE) And SBS_VERT Then 
       fIsScrollBar = hWnd_VSB 
       Exit Function 
      End If 
     End If 

dies, wie ich es

 If fGetClassName(hWnd_VSB) = "NUIScrollbar" Then 
      If apiGetWindowLong(hWnd_VSB, GWL_STYLE) And 1107296256 Then 
       fIsScrollBar = hWnd_VSB 
       Exit Function 
      End If 
     End If 

weiterhin die Funktion zu ersetzen versucht

' Let's get the NEXT SIBLING Window 
    hWnd_VSB = apiGetWindow(hWnd_VSB, GW_HWNDNEXT) 

    ' Let's Start the process from the Top again 
    ' Really just an error check 
    Loop While hWnd_VSB <> 0 

    ' SORRY - NO Vertical ScrollBar control 
    ' is currently visible for this Form 
    fIsScrollBar = -1 
End Function 


' From Dev Ashish's Site 
' The Access Web 
' http://www.mvps.org/access/ 

'******* Code Start ********* 
Private Function fGetClassName(hWnd As Long) 
Dim strBuffer As String 
Dim lngLen As Long 
Const MAX_LEN = 255 
    strBuffer = Space$(MAX_LEN) 
    lngLen = apiGetClassName(hWnd, strBuffer, MAX_LEN) 
    If lngLen > 0 Then fGetClassName = Left$(strBuffer, lngLen) 
End Function 
'******* Code End ********* 

Hoffe ich bin klar genug, jede Hilfe geschätzt.

+1

Was ist Ihre aktuelle Version von MS-Access? Ist es auf einem 64-Bit-System? Es könnte API-Änderungen sein. Ich gehe davon aus, dass Sie auf 64-Bit-Windows laufen. Ein Artikel befasst sich damit unter http://www.catch22.net/tuts/64bit-scrollbars – dbmitch

+1

Sie könnten die Verwendung von ListView-Steuerelementen mit integrierter Drag & Drop-Unterstützung in Betracht ziehen. – Andre

Antwort

1

Haben Sie das gleiche Problem, so scheint folgende zu arbeiten:

Public Const SB_HORZ As Long = 0    ' &H0 (32 bit) 
Public Const SB_VERT As Long = 1    ' &H1 (32 bit) 
Public Const SB_CTL As Long = 2 
Public Const SB_BOTH As Long = 3 
Public Const SB_HORZ64_0 As Long = 1107296256 ' &H42000000 (64 bit - invisible) 
Public Const SB_VERT64_0 As Long = 1107296257 ' &H42000001 (64 bit - invisible) 
Public Const SB_HORZ64_1 As Long = 1375731712 ' &H52000000 (64 bit - visible) 
Public Const SB_VERT64_1 As Long = 1375731713 ' &H52000001 (64 bit - visible) 
... 
eWindowStyle = GetWindowLong(ehWnd, GWL_STYLE) 
Select Case eWindowStyle 
Case SB_HORZ, SB_HORZ64_0, SB_HORZ64_1 
    ' *** Horizontal 
    wWinAPIhWndScrollbarHorz = ehWnd 
Case SB_VERT, SB_VERT64_0, SB_VERT64_1 
    ' *** Vertikal 
    wWinAPIhWndScrollbarVert = ehWnd 
End Select 
... 
+0

Ich werde es überprüfen, wenn ich eine Chance habe, Danke –