Skocz do zawartości

Problem z utworzeniem paska przewijania


Obsidian

Recommended Posts

Witam...
Od niedawna zajmuję się programowaniem w WinAPI, a korzystam przy tym z języka C++. I napisałem sobie program. Robi wszystko to co chcę, poza tym jednym - nie wiem jak zmusić scrolla do działania.
Mój program to prosta baza danych - zawiera dane uczniów i ich oceny. Ich dane zapisane są w kontrolkach edit (każda dana w osobnym) i chodzi o to, że gdy dodam więcej tych kontrolek, to nie mieszczą się w oknie programu. Dlatego muszę utworzyć pionowy pasek przewijania, ale opis na winapi.org jest dla mnie - zielonego - zbyt lakoniczny...
Ilość uczniów jest określona przez zmienną int a. Gdy chcę dodać nowy wpis wywołuję funkcję nowy_rekord. Każdy edit ma wysokość 30 + 10 przerwy. Do tego na górze są pola static - jako nagłówki kolumn.

Będę bardzo wdzięczny o wyjaśnienie jak w tej sytuacji utworzyć pasek przewijania...

Link do komentarza
Udostępnij na innych stronach

  • 3 weeks later...

hmm ciężko to opisać po krótce, ale postaram się naprowadzić
otóż pierwsza rzecz jaką robisz to przy wywołaniu CreateWindow (głównego okna) dodajesz styl WS_VSCROLL i teraz przechwytujesz dwa komunikaty:
WM_SIZE oraz WM_VSCROLL; obsługa pierwszego zwykle wygląda tak: cxOkno = LOWORD(lParam); cyOkno = HIWORD(lParam).
A teraz coś wiecej o paskach otóż każdy pasek przewijania ma swój że tak powiem zasięg, tzn istnieje x pozycji tego szarego prostokąta w tym pasku, np zakładając że okno ma 160 pikseli wysokości to możesz w nim wyświetlić tylko 4 rzędy swoich kontrolek edit, a zakładając że wszystkich rzędów masz 10 to suwak może być ustawiony w 6 pozycjach, gdy jest w pozycji 0 wyświetla pierwsze cztery, gdy jest w pozycji 1 wyświetla od drugiego do 5 rzędu, a gdy jest w pozycji 5 wyświetla ostatnie 4 rzędy kontrolek. Właśnie ilość tych pozycji ustawiasz za pomocą funkcji SetScrollRange (w tym przypadku podasz jej wartość ilośćwszystkich - cxOkno/40 - 1). Przechwytując komunikat WM_VSCROLL z wyrażnie LOWORD(wParam) otrzymujesz jakieś powiadomienie, może to być SB_LINEUP, SB_PAGEDOWN itp gdy otrzymasz np SB_LINEDOWN to wiesz że musisz teraz wyświetlić o kolejny rząd niżej tych kontrolek. Ukrywać kontrolki możesz np za pomocą funkcji ShowWindow. Jak widzisz nie jest to zbyt krótki temat, więc starałem się tylko dać Ci jakiś obraz tej sytuacji, po szczegóły odsyłam do dokumentacji poszczególnych funkcji, bądź do Petzolda :)
Pozdrawiam

Link do komentarza
Udostępnij na innych stronach

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gość
Odpowiedz...

×   Wkleiłeś zawartość bez formatowania.   Usuń formatowanie

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Utwórz nowe...