CListBox => OnVScroll => GetTopIndex
-
Wie der Titel schon sagt hab ich eine von CListBox abgeleitete Klasse in der ich die WM_VSCROLL überschreibe. Mit GetTopIndex hohle ich mir den obersten, sichtbaren Eintrag. Den übergebe ich dann an ein Control von mir das mir direkt daneben die Zeilennummer ausgibt. Soweit geht das auch ganz gut. Das Problem ist nur dass das ein wenig inkorrekt ist, da erst wenn ich die Maus wieder loslasse, also aufhöre zu Scrollen die Zahl korrekt ist. Vorher ist eine differenz von +/- 1 festzustellen. Jemand ne Idee wie ich das beheben kann?
-
Ich würde Dir empfehlen immer GetScrollInfo aufzurufen um die Werte zu bekommen.
Dir ist klar, dass der Scrollbar der CListBox bei 0 beginnt?
-
Ja ist mir klar
Sonnst würde er mir ja nicht am Ende die korrekten Werte geben ...Hmm also hab mir des mal kurz in der MSDN angeguckt. Ist denn ScrollRange / ListBox::ItemCount * pos == pos des 1. sichtbaren Elements?
-
Nein! Deine Kalkulation ist mir nicht klar.
1. Der Scrollrange ist nicht die Anzahl aller Items, sondern "Anzahl Items"-"Anzahl sichtbarer Items in einer Ansicht"+1.
2. Ist es gut möglich, dass Du erst Default() ausführen musst damit der Top-Index korrigiert wird. Du bekmmst ja WM_VSCROLL zuerst angeboten, bevor das ListCtrl/Box sie bekommt.
-
Nja wahr zu faul da groß was zu implementieren ^^ Das einzige was ich ändern musste (bin dank deinem Default()-Vorschlag drauf gekommen!) ... erstmal CListBox::OnVScroll aufzurufen, bevor ich es selbst verwerte ... das Problem ist auf jeden Fall gelöst!
