AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Scrollbar

Ein Thema von Nils_13 · begonnen am 31. Mai 2008 · letzter Beitrag vom 1. Jun 2008
Antwort Antwort
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#1

Scrollbar

  Alt 31. Mai 2008, 12:51
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.)
Angehängte Dateien
Dateityp: zip projekt_334.zip (499,2 KB, 36x aufgerufen)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

Re: Scrollbar

  Alt 31. Mai 2008, 23: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
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Scrollbar

  Alt 31. Mai 2008, 23:37
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.
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

Re: Scrollbar

  Alt 31. Mai 2008, 23:45
Zitat von bitsetter:
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.
Er will eine Scrollbar erstellen und die Value anhand der Einträge der Listbox berechnen
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
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Scrollbar

  Alt 1. Jun 2008, 00:02
Zitat von EWeiss:
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.
Er will nichts überdecken, er zeichnet die Listbox und die Scrollbar selbst. Ist weiter nichts wie ein TImage mit einer Stringliste.

Zitat von EWeiss:
Wäre dann nur eine berechnungs sache.
Ja und genau das will er wissen wie das geht.
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Nils_13

Registriert seit: 15. Nov 2004
2.647 Beiträge
 
#6

Re: Scrollbar

  Alt 1. Jun 2008, 10:17
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.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

Re: Scrollbar

  Alt 1. Jun 2008, 11:52
Zitat von Nils_13:
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.
Mag ja sein das du sie kennst ändert sich aber spätestens dann wenn die Schriftart gewechselt wird
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:44 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz