I potom, co jsme zjistili a nastavili správný počet řádků na displeji, nemůžeme si prohlédnout obsah celého bufferu. Jeho rozsah je mnohonásobně větší než možnosti, které nám dávají rozměry displeje kapesního počítače. Zobrazení většího množství souvislých dat v okně programu řeší operační systém Windows elegantně pomocí tzv. posuvníků.
Posuvníky znáte z běžného používání programů pro Windows. Jsou to pásky s šipkovými tlačítky na spodní a pravé straně okna, které umožňují rolování okna.
Vytvoření posuvníku v okně je velmi snadné - stačí o to požádat systém při vytváření okna. Ve funkci InitInstance je vložena funkce CreateWindow. Pokud v této funkci změníme třetí parametr tak, aby volání funkce bylo následující:
Doplněním parametru WS_SCROLL se okno programu po přeložení změní takto:
Bohužel, Windows CE považují nabídkový pruh za součást klientské oblasti okna a posuvník zasahuje i do nabídkového pruhu. Takový vzhled okna není obvyklý, ani my jej nebudeme akceptovat. Zrušte opět parametr WS_SCROLL. Musíme si vytvořit posuvník sami.
Jedna z možností je vytvořit si nové okno pokrývající klientskou oblast, které by mělo vlastní posuvníky. My vyzkoušíme jinou cestu - vytvoříme si posuvník jako dceřinné okno hlavního okna.
V lokálních proměnných funkce WndProc si doplníme statickou (posuvník budeme používat trvale) proměnnou handle posuvníku a další pomocné proměnné.
Na konec zprávy WM_CREATE doplníme vytvoření samostatného okna s posuvníkem:
Na konec zprávy WM_SIZE doplníme možnost změny velikosti posuvníku (a jeho vykreslení na nových pozicích) při případné změně okna. Současně naplníme parametry ve struktuře SCROLLINFO potřebné pro činnost posuvníku:
Pokud bychom nyní program přeložili, už se na obrazovce objeví svislý posuvník. Nebude však správně pracovat, protože není zajištěno zpracování zpráv, které posílá. Do WndProc doplníme další položku ve zpracování zpráv.
Hodnoty, které posuvník posílá v nižší polovině wParam, udávají požadovaný posun. Podle toho upravíme pozici posuvníku. Pozici dále zarovnáme na číslo dělitelné počtem sloupců a necháme nastavit novou pozici posuvníku - SetScrollInfo. Jestliže se pozice posuvníku skutečně změnila (kontrola pomocí GetScrollInfo), změníme proměnnou ukazující na zobrazovaný Byte a necháme obrazovku překreslit.
Protože zprávu WM_SCROLL nám může poslat pouze jediné okno, netestujeme,
kdo nám ji zaslal, ale hned ji zpracováváme.
Posuvník je dostatečně chytrý na to, aby zpracoval i vstupy z klávesnice, které
mu přijdou, a převedl je na jeho zprávy.
Po přeložení a spuštění by měl posuvník pracovat a my si můžeme konečně prohlédnout obsah celého našeho bufferu.
Pokud bychom v globálních proměnných změnili inicializaci nSloupce na hodnotu 16 a spustili program na HPC Pro, měli bychom dostat výsledek jako na obr.:
Zde je již vidět, že velikost jezdce posuvníku se mění s poměrem velikosti stránky k celkovému rozsahu.
Na závěr zbývá vyřešit drobnou vadu programu. Tentokrát po sobě nebudeme dceřiné
okno (posuvník) uklízet, i když jsme jej vytvořili my. Windows za nás při ukončení programu
automaticky zruší všechna dceřinná okna.
Místo toho musíme ošetřit jiný problém. Při ztrátě fokusu ztratí posuvník
vstup od klávesnice a přestane zpracovávat mačkání kurzorových tlačítek na přístroji.
Protože hlavní okno fokus a tedy vstup z klávesnice nepotřebuje, doplníme do řady
zpráv předání fokusu (pokud jej dostane) zpět na náš posuvník. Obdrží-li funkce WndProc
fokus zprávou WM_SETFOCUS, předá jej oknu posuvníku funkcí SetFocus.
Stránka načtena za 0.00183 sekund.