2016-09-02 4 views
2

Я реализую симуляцию перетаскивания в непрерывной форме.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 ********* 

Надеюсь, что я достаточно ясен, любая помощь оценена.

+1

Какова ваша текущая версия MS-Access? Это на 64-битной системе? Это может быть изменение API. Я предполагаю, что вы работаете на 64-битной Windows. В одной статье рассматривается это по адресу http://www.catch22.net/tuts/64bit-scrollbars. – dbmitch

+1

. Вы можете использовать элементы управления ListView, которые имеют встроенную поддержку Drag & Drop. – Andre

ответ

1

меня та же проблема, следующий, кажется, работает:

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

Я проверю, когда у меня есть шанс, спасибо –

Смежные вопросы