Я реализую симуляцию перетаскивания в непрерывной форме.control ms access scrollbar в непрерывной форме
В основном, как это работает, есть список людей в стороне, и пользователь может перетащить человека из списка в поле (это список мест, с полями, такими как Seat1, Seat2, seat3 .. ., и каждый ряд сидений - новая запись).
Для базовой функции перетаскивания я использую инструкции по этой ссылке Drag And Drop, и он отлично работает.
сейчас вот моя проблема, чтобы узнать, на какой записи пользователь перемещает мышь Мне нужно рассчитать положение мыши, разделенное на раздел подробностей, так что пока форма не прокручивается вниз, она работает хорошо , но когда форма прокручивается вниз, мне нужно сначала знать, насколько форма не работает, и это может быть достигнуто только через API окон.
поэтому я обнаружил, что www.lebans.com/conformscurcontrol.htm имеет именно тот код, который мне нужен, но который работал только в более старых версиях ms-доступа, код, который ломается в новой версии, заключается в том, что он проверяет от имени класса окна «scrollbar» и призывая к нему API GetScrollInfo, но в более новых версиях нет класса с именем «scrollbar», но есть другой класс под названием NUIScrollbar See Here, но даже при смене его на это имя я не знаю, t вернуть действительный класс прокрутки (LPSCROLLINFO).
Вот код от 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
этот старый мир
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
это как я пытался заменить его
If fGetClassName(hWnd_VSB) = "NUIScrollbar" Then
If apiGetWindowLong(hWnd_VSB, GWL_STYLE) And 1107296256 Then
fIsScrollBar = hWnd_VSB
Exit Function
End If
End If
продолжить функцию
' 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 *********
Надеюсь, что я достаточно ясен, любая помощь оценена.
Какова ваша текущая версия MS-Access? Это на 64-битной системе? Это может быть изменение API. Я предполагаю, что вы работаете на 64-битной Windows. В одной статье рассматривается это по адресу http://www.catch22.net/tuts/64bit-scrollbars. – dbmitch
. Вы можете использовать элементы управления ListView, которые имеют встроенную поддержку Drag & Drop. – Andre