Thema: Delphi Scrollbar

Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#2

Re: Scrollbar

  Alt 31. Mai 2008, 22:29
hi

Du mußt erstmal mit der constanze LB_GETITEMHEIGHT anfangen
Diese liefert dir die höhe der einzelnen einträge der Listbox abhängig von der schrifthöhe.

Dann holst du dir den GetClientRect und übergibst als HWND das handle der Listbox
Die höhe erhälst du wenn du eine Sendmessage an die Listbox schickst

SendMessage(listbox.handle,LB_GETITEMHEIGHT,0,0) Jetzt hast du die höhe der einträge

Aussehen könnte das dann so..
srcControl.hwnd ist das der Listbox
das \15 kannst du übersehen das sind die Twips in Pixel ... das braucht man in Delphi nicht
da hier alles in pixel berechnet wird was die Formvorlage und Kontrolls angeht.

Code:
Public Sub ItemsVisible(srcControl As Control)

Dim ReturnValue As Long
Dim myrect    As RECT
Dim ItemHeight As Integer

    blnListBox = True
    'get height of the control in pixels
    'myrect type receives the window dimensions
    ReturnValue = GetClientRect(srcControl.hwnd, myrect) / 15
    ItemHeight = SendMessage(srcControl.hwnd, LB_GETITEMHEIGHT, 0&, 0&)
    If ItemHeight = 0 Then
        ItemHeight = Int(srcControl.Height / srcControl.RowHeight(1))
    End If
    'calculate number of visible items (not listcount)
    LargeChange = Int(myrect.Bottom \ ItemHeight)
    m_MaxValue = IIf(m_TotalItems - m_LargeChange < 0, 0, m_TotalItems - m_LargeChange)
    min = 0

End Sub
die max und min einträge mußt du von außen zuweisen...
Sorry VB von meinem Listbox Control
ist einfach zu übersetzen...
Habe es von der Namensgebung so gestaltet das man in etwa weiss was gemeint ist.

Code:
Public Property Let max(ByVal lNewValue As Long)

    m_TotalItems = lNewValue
    m_MaxValue = lNewValue - IIf(blnListBox = False, 0, m_LargeChange)
    value = m_Value
    If max = 0 Then
        picSlider.Visible = False
    Else
        picSlider.Visible = True
    End If
    PropertyChanged "Max"

End Property

Public Property Get max() As Long

    max = m_TotalItems

End Property

Public Property Let min(ByVal lNewValue As Long)

    m_MinValue = lNewValue
    value = m_Value
    PropertyChanged "Min"

End Property

Public Property Get min() As Long

    min = m_MinValue

End Property
So weißt du zumindest schon mal wo du ansetzen mußt.
Sorry kann es dir auf der schnelle nur mit VB demonstieren keine zeit das jetzt zu übersetzen.

gruss Emil
  Mit Zitat antworten Zitat