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