![]() |
Scrollbar
Liste der Anhänge anzeigen (Anzahl: 1)
Hi,
eine eigene Komponente, welche eine Listbox darstellt, enthält zwei Variablen: Sichtbar1 und Sichtbar2. Diese beiden Variablen beziehen sich auf die Stringlist Items. Items enthält wie bei einer normalen Listbox die Einträge. Sichtbar1 ist also der oberste zu sehende Eintrag und Sichtbar2 der unterste zu sehende (die beiden Variablen sind sozusagen Indizes zu Items). Ich habe auch eine eigene Scrollbar. Die Scrollbar hat als Max die Anzahl der Einträge der Listbox. Mit MouseMove der Scrollbar möchte ich die Scrollbar zum laufen kriegen. Als relevante Angaben hat man folglich den Y-Wert der Maus in Pixeln (umgerechnet auf die ScrollBar), die Höhe der Scrollbar in Pixeln, den Max-Wert in der Dimension der Einträge -> keine Pixelangabe. Theoretisch könnte man daraus folgendermaßen Sichtbar1 (lokal auch als Pos bekannt) berechnen: (Y/Height)*Max (<- Klammern nur zur Vereinfachung). Nun stellt sich allerdings die Frage, wie man die Position des Reglers der Scrollbar in Pixeln berechnen könnte. Mir ist außerdem noch sehr wichtig, dass die Scrollbar ein normales verhalten zeigt: Je nach Eintragsanzahl soll sie Sprünge machen. Ich habe mir zwar Mühe gegeben, alles möglichst einfach zu erklären, aber um nochmal sicher zu gehen, dass es jeder verstanden hat, habe ich im Anhang ein Projekt mit dem ihr selbst experimentieren könnt. Falls Missverständnisse vorliegen, sollte dieses auch noch helfen. Die drei Anmerkungen in den ersten Zeilen der code.pas (frmMain) sind sehr hilfreich. Viele Units werden nur derzeit benötigt und in Zukunft wegfallen, sie sind alle irrelevant für euch (außer euch interessiert das umständliche Laden von PNGs und anderen für euch unwichtigen Mist), daher sind diese Anmerkungen sehr hilfreich. In der MouseOver der SkinTrackBar in uSkinDraw seht ihr meinen Versuch. Er funktioniert allerdings nicht einmal annähernd. (Ich benötige keine Hinweise zum Laden von PNGs, da ich das demnächst endgültig beseitigen werde.) |
Re: Scrollbar
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
Delphi-Quellcode:
Jetzt hast du die höhe der einträge
SendMessage(listbox.handle,LB_GETITEMHEIGHT,0,0)
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:
die max und min einträge mußt du von außen zuweisen...
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 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:
So weißt du zumindest schon mal wo du ansetzen mußt.
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 Sorry kann es dir auf der schnelle nur mit VB demonstieren keine zeit das jetzt zu übersetzen. gruss Emil |
Re: Scrollbar
Wenn ich das richtig sehe, dann will er eine komplette Listbox durch selber zeichnen nachbilden, also nichts mit Handle. Also so eine Art eigene GUI. Seine Listbox ist in Wirklichkeit ein TImage.
|
Re: Scrollbar
Zitat:
Nichts anderes habe ich ihm hier demonstiert. Auch meine Listbox(Scrollbar) ist eine eigenen GUI welche nicht auf TImage sondern unter VB aus einem Image besteht. Er will quasi die normal Scrollbar mit einer selbsterstellten überdecken damit die GUI einheitlich aussieht. Wenn er seine Listbox auch selbst zeichnet ist das eine andere sache dann erübrigt sich seine frage da ihm in dem fall alle Positionen bekannt sein müßten. Wäre dann nur eine berechnungs sache. gruss Emil |
Re: Scrollbar
Zitat:
Zitat:
|
Re: Scrollbar
Danke Emil für deine Antwort, sie ist sicherlich nützlich für andere. Für mich nicht, da ich die Höhe schon weiß. Und genau wie bitsetter es sagte, möchte ich wissen, wie man die Berechnungen durchführt. Ich probiere das schon seit zwei Wochen, manchmal hatte ich das Gefühl, ich käme näher, dann festgestellt, wie schlecht das war und wieder von vorne. Dabei kann das gar nicht so schwierig sein, denke ich. Ich sage hier ganz klar: Ihr müsst euch nicht an meine Vorgaben halten. Mir ist es egal, ob mir mit einem Codebeispiel oder Worten geholfen wird und ebenso ob eure "Variablen" die gleichen Namen tragen. Das Demonstationsprojekt dient wirklich nur als Hilfe.
|
Re: Scrollbar
Zitat:
So einfach ist das nicht. Deshalb habe ich mir das mühsame erstellen einer Listbox erspart ich erstelle lediglich den Rahmen als Skin um eine standard Listbox herum. Da die Scrollbar nicht so einfach zu überschreiben geht wird sie quasi mit meiner überlager so sieht niemand das sich die Originale noch darunter befindet. Der zweite vorteil ist das ich unabhängig von der Listbox bin da ich ein Object übergebe und das Handle davon (Listbox, Flexgrid) oder was es sonst noch gibt kann ich die Scrollbar für alles verwenden und mein Skin sieht immer gleich aus lediglich die funktionalität ändert sich. Bei dir fängt das Problem ja schon damit an das du nicht in der lage bist(zur zeit) den richtigen Eintrag in der Stringlist mit der Maus zu selektieren. Wie willst du dann den Regler kontrollieren ? So wie dich das sehe kontrollierst du mit den Einträgen die position des Reglers das sollte aber genau umgekehrt sein oder warum verschwindet der Regler wenn ich ihn verschiebe ? Ich kann ihn dann nicht mehr sehn. EDIT: Schau dir erstmal im JEDI Quelltext an wie man eine Listbox korrekt erstellt ohne Skin Engine Dann kannst du den Skin drum herum aufbauen. Aber dann hast du das was eigentlich schon existiert eine Listbox so wie die Originale Nur mit einem Skin als umrandung... oder was denkst du was es sonst ist ? Da frag ich mich ob der aufwand lohnt. gruss Emil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz