Image
7.6.2016 0 Comments

ASSEMBLER pod Windows: ScrollBar I (19. časť)

Späť na úvod >> Späť na programovanie >> Späť na seriál

ScrollBar alebo jednoducho rolovací pruh sa v programoch pre Windows používa veľmi často. Väčšinou v aplikácii (príkladom môže byť program Microsoft Word) zobrazujeme texty, grafiku, ktorá presahuje rozmery okna. V tom prípade sa použije pre dané okno rolovací pruh a používateľ si tak môže prezrieť celý dokument. Teda scrollbar by ste mali použiť všade tam, kde klientska oblasť je väčšia než časť okna určená na jej zobrazenie. Ďalej rolovací pruh môžete použiť na zadávanie približných hodnôt (pozri príklad k tomuto článku – nájdete ho na www.pcrevue.sk).

ScrollBar je dcérske okno. ScrollBar sa vytvára pomocou funkcie CreateWindow alebo definovaním v resource súbore príkazom SCROLLBAR (pozri obrázok 2). ScrollBar je pripojený k okraju okna v okamihu, keď sa ScrollBar stáva viditeľným. Na tento účel sa používa funkcia ShowScrollBar, podobne ako ShowWindow pri iných typoch okien. Rozdiel je však v tom, že funkcia ShowScrollBar pripojí rolovací pruh k okraju okna podľa toho, či je určený štýl SB_HORZ alebo SB_VERT. Windows po zobrazení ScrollBaru automaticky odpočíta šírku rolovacieho pruhu z klientskej oblasti, a teda zápis do klientskej oblasti neprekreslí rolovací pruh. Iný spôsob, ako pripojiť rolovací pruh, je vytvoriť okno so štýlmi WS_HSCROLL a WS_VSCROLL. Rolovacie pruhy sú tiež automaticky pripájané k oknám typu list box, combo box, listview, treeview a pod. Zobrazia sa vždy, keď počet položiek prekročí rozmery daného okna.

Pri vytvorení rolovacieho pruhu je rozsah hodnôt reprezentovaný jednotlivými koncami tohto prvku. Je nastavený na 0 až 100. V mnohých prípadoch musí aplikácia toto nastavenie zmeniť, aby lepšie vystihla veľkosť daného dokumentu. Pozícia umiestnenia (thumb position) je potom hodnota vyjadrujúca pozíciu ukazovateľa na lište. Napríklad ak je rozsah nastavený medzi 0 a 100 a pozícia umiestnenia je 50, potom sa ukazovateľ bude nachádzať presne uprostred lišty medzi jej oboma koncami. Pri rolovacích pruhoch je aj možnosť nastaviť veľkosť strany. Veľkosť strany (Page Size) je číslo, ktoré určuje, o koľko jednotiek sa strana v nastavenom rozsahu posunie naraz. Ak zoberieme do úvahy rozsah od 0 do 100 a veľkosť strany 50, potom bude ukazovateľ na polovičnej veľkosti celého rolovacieho pruhu. Na nastavenie a zistenie rozsahu, pozície umiestnenia a veľkosti strany rolovacieho pruhu sa používajú funkcie SetScrollInfo a GetScrollInfo.

V prípade, že používateľ klikne na časť rolovacieho pruhu, Windows v závislosti od orientácie (rolovacieho pruhu) pošle správu WM_HSCROLL alebo WM_ VSCROLL.

WM_HSCROLL

nScrollCode = (int) LOWORD(wParam);  // scroll bar value

nPos = (short int) HIWORD(wParam);   // scroll box position

hwndScrollBar = (HWND) lParam;       // handle of scroll bar

nScrollCode – nižšie slovo parametra wParam (pozri obrázok 1). Reprezentuje hodnotu rolovacieho pruhu, táto hodnota môže byť jedna z nasledujúcich:

SB_BOTTOM – posun úplne vpravo alebo dole,

SB_TOP – posun úplne vľavo alebo hore,

SB_LINELEFT   – posun o šírku znaku vľavo,

SB_LINERIGHT  – posun o šírku znaku vpravo,

SB_PAGELEFT – posun vľavo o šírku okna,

SB_PAGERIGHT – posun vpravo o šírku okna.

SB_THUMBPOSITION – posun na absolútnu pozíciu. Aktuálna pozícia je špecifikovaná parametrom nPos.

SB_THUMBTRACK – thumb (ukazovateľ) je práve posúvaný myšou. Aktuálna pozícia je špecifikovaná parametrom nPos.

SB_ENDSCROLL – ukončenie posúvania.

 

nPos – vyššie slovo parametra wParam. Určuje aktuálnu pozíciu scroll boxu, ak je nScrollCode parameter  SB_THUMBPOSITION alebo SB_THUMBTRACK; inak, nPos je nevyužitý.

hwndScrollBar – hodnota lParam – handle scrollbaru. Identifikuje prvok, ak je správa WM_HSCROLL poslaná scrollbar prvku. V prípade poslania správy WM_HSCROLL štandardnému scrollbaru v oknách hwndScrollBar je nevyužitý.

Z parametra wParam získate hodnoty positionscroll code pomocou nasledujúcich riadkov v assembleri:

...

LOCAL code : DWORD, pos

...

.IF uMsg == WM_HSCROLL

    mov eax,wParam

    and eax,0ffffh

    mov code,eax   ;scroll code

    mov eax,wParam

    shr eax,16

    mov pos,eax    ;position

...

 

WM_VSCROLL

nScrollCode = (int) LOWORD(wParam); // scroll bar value

nPos = (short int) HIWORD(wParam);  // scroll box position

hwndScrollBar = (HWND) lParam;      // handle of scroll bar

 

Hodnoty nScrollCode, nPos a hwndScrollBar majú rovnaký význam. Hodnota nScrollCode však nadobúda trochu odlišné hodnoty, čo je spôsobené orientáciou Scrollbaru (vertikálny, horizontálny).

SB_LINEDOWN – posun o jeden riadok dole,

SB_LINEUP – posun o jeden  riadok hore,

SB_PAGEDOWN – posun o jednu stránku dole,

SB_PAGEUP – posun o jednu stránku hore.

 

EnableScrollBar

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia zakazuje alebo povoľuje činnosť jednej alebo obidvoch šípok scrollbaru. Pokiaľ je scrollbar takto odpojený a používateľ sa ho snaží použiť, nenastane nijaká akcia ani nie je poslaná žiadna správa.

Syntax: BOOL EnableScrollBar, HWND hWnd, UINT wSBflags, UINT wArrows

HWND hWnd: Handle na okno alebo scrollbar v závislosti od hodnoty parametra wSBflags.

UINT wSBflags: Typ scrollbaru, pri ktorom sa má povoliť či zakázať činnosť. Tento parameter môže nadobúdať jednu z nasledujúcich hodnôt.

SB_BOTH – povolí alebo zakáže činnosť horizontálneho aj vertikálneho scrollbaru spojeného s príslušným oknom. Parameter hWnd musí byť handle na dané okno.

SB_CTL – identifikuje scrollbar ako riadiaci prvok. Parameter hWnd musí byť handle na požadovaný scrollbar.

SB_HORZ – povolí alebo zakáže činnosť horizontálneho scrollbaru spojeného s daným oknom. Parameter hWnd musí byť handle na dané okno.

SB_VERT – povolí alebo zakáže činnosť vertikálneho scrollbaru spojeného s daným oknom. Parameter hWnd musí byť handle na dané okno.

UINT wArrows: Určuje, či činnosť šípok scrollbaru je povolená alebo zakázaná, a takisto ukazuje, ktoré šípky majú svoju činnosť povolenú, resp. zakázanú. Tento parameter môže nadobúdať jednu z nasledujúcich hodnôt.

 

ESB_DISABLE_BOTH – zakazuje činnosť obidvoch šípok scrollbaru.

ESB_DISABLE_DOWN – zakazuje činnosť spodnej šípky pri vertikálnom scrollbare.

ESB_DISABLE_LEFT – zakazuje činnosť ľavej šípky pri horizontálnom scrollbare.

ESB_DISABLE_LTUP – zakazuje činnosť ľavej šípky pri horizontálnom scrollbare alebo hornej šípky  pri vertikálnom scrollbare.

ESB_DISABLE_RIGHT – zakazuje činnosť pravej šípky pri horizontálnom scrollbare.

ESB_DISABLE_RTDN – zakazuje činnosť pravej šípky pri horizontálnom scrollbare alebo spodnej šípky pri vertikálnom scrollbare.

ESB_DISABLE_UP – zakazuje činnosť hornej šípky pri vertikálnom scrollbare.

ESB_ENABLE_BOTH – povoľuje činnosť obidvoch šípok scrollbaru.

 

Výsledok funkcie: BOOL: TRUE, pokiaľ je činnosť šípok scrollbaru povolená, resp. zakázaná podľa špecifikovaného parametra. FALSE, pokiaľ už šípky v danom stave boli, resp. v priebehu vykonávania funkcie nastala chyba.

 

GetScrollInfo

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia GetScrollInfo vráti parametre scrollbaru vrátane minimálnej a maximálnej pozície, veľkosti strany a súčasnej pozície.

Syntax: BOOL GetScrollInfo, HWND hwnd, int fnBar, LPSCROLLINFO lpsi

HWND hwnd: Handle na okno so štandardným scrollbarom, resp. riadiaci prvok typu SCROLLBAR, v závislosti od hodnoty parametra fnBar.

int fnBar: Typ scrollbaru, o ktorom chceme získať informácie. Tento parameter môže nadobúdať jednu z nasledujúcich hodnôt:

SB_CTL – vráti parametre riadiaceho prvku typu scrollbar. Parameter hwnd musí byť handle na požadovaný scrollbar.

SB_HORZ – vráti parametre štandardného horizontálneho scrollbaru príslušného okna.

SB_VERT – vráti parametre štandardného vertikálneho scrollbaru príslušného okna.

LPSCROLLINFO lpsi: Ukazovateľ na štruktúru SCROLLINFO, v ktorej sú uložené informácie o scrollbare. Pred volaním funkcie GetScrollInfo aplikácia musí nastaviť položky fMask a cbsize tejto štruktúry.

Definícia štruktúry SCROLLINFO.

SCROLLINFO STRUCT

  cbSize        DWORD      ?

  fMask         DWORD      ?

  nMin          DWORD      ?

  nMax          DWORD      ?

  nPage         DWORD      ?

  nPos          DWORD      ?

  nTrackPos     DWORD      ?

SCROLLINFO ENDS

 

cbsize – veľkosť štruktúry v bajtoch.

fMask – parametre scrollbaru, ktoré chceme získať. Táto hodnota môže byť kombináciou nasledujúcich hodnôt:

SIF_PAGE – vráti hodnotu nPage scrollbaru.

SIF_POS – vráti hodnotu nPos scrollbaru.

SIF_RANGE – vráti hodnoty nMin a nMax scrollbaru.

nMin – minimálna pozícia scrollbaru.

nMax – maximálna pozícia scrollbaru.

nPage – Veľkosť strany. Scrollbar používa túto hodnotu na určenie približnej veľkosti ukazovateľa (thumb).

nPos – pozícia umiestnenia ukazovateľa (thumb).

 

Výsledok funkcie: BOOL: Ak funkcia získala nejaké hodnoty, vráti TRUE, v opačnom prípade je vrátená hodnota FALSE.

 

GetScrollPos

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia vráti súčasnú pozíciu ukazovateľa (thumb) na danom scrollbare. Súčasná pozícia je relatívne číslo závislé od nastaveného rozsahu hodnôt scrollbaru. Táto funkcia bola zaradená pre zabezpečenie kompatibility s Windows NT 3.5 a predchádzajúcimi verziami Windows. Pri programovaní aplikácií pre Windows 95 používajte funkciu GetScrollInfo.

Syntax: int GetScrollPos, HWND hWnd, int nBar         

HWND hWnd: Handle na okno so štandardným scrollbarom alebo riadiaci prvok typu SCROLLBAR v závislosti od hodnoty parametra nBar.

int nBar: Scrollbar, o ktorom chceme získať informácie. Tento parameter môže nadobúdať jednu z nasledujúcich hodnôt:

SB_CTL – vráti pozíciu ukazovateľa (thumb) riadiaceho prvku typu scrollbar. Parameter hwnd musí byť handle na požadovaný scrollbar.

SB_HORZ – vráti pozíciu ukazovateľa (thumb) štandardného horizontálneho scrollbaru príslušného okna.

SB_VERT – vráti pozíciu ukazovateľa (thumb) štandardného vertikálneho scrollbaru príslušného okna.

Výsledok funkcie: int: V prípade úspešného vykonania funkcie je návratová hodnota pozícia ukazovateľa scrollbaru, v ostatných prípadoch sa vráti nula.

 

GetScrollRange

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia GetScrollRange vráti súčasné nastavenie minimálnej a maximálnej pozície daného scrollbaru. Táto funkcia bola zaradená pre zabezpečenie kompatibility s Windows NT 3.5 a predchádzajúcimi verziami Windows. Pri programovaní aplikácií pre Windows 95 používajte funkciu GetScrollInfo.

Syntax: BOOL GetScrollRange, HWND hWnd, int nBar, LPINT lpMinPos, LPINT lpMaxPos

HWND hWnd: Handle na okno so štandardným scrollbarom alebo riadiaci prvok typu SCROLLBAR v závislosti od hodnoty parametra nBar.

int nBar: Scrollbar, o ktorom chceme získať informácie. Tento parameter môže nadobúdať jednu z hodnôt uvedených pri funkcii GetScrollPos.

LPINT lpMinPos: Ukazovateľ na premennú typu integer, do ktorej sa uloží minimálna pozícia.

LPINT lpMaxPos: Ukazovateľ na premennú typu integer, do ktorej sa uloží maximálna pozícia.

Výsledok funkcie: BOOL: Ak funkcia skončila úspešne, je návratová hodnota TRUE, v opačnom prípade je vrátená hodnota FALSE.

 

ScrollDC

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia posúva obdĺžnik na danom kontexte zariadenia DC horizontálne alebo vertikálne. Túto funkciu používajte na posuv klientskej oblasti okna alebo na posuv celej bitovej mapy, resp. jej časti, v pamäťovom kontexte zariadenia.

Syntax: BOOL ScrollDC, HDC hDC, int dx, int dy, CONST RECT *lprcScroll, CONST RECT *lprcClip, HRGN hrgnUpdate, LPRECT lprcUpdate     

HDC hDC: Kontext zariadenia DC, ktorý sa má posunúť.

int dx: Počet grafických jednotiek, bodov, o ktorý sa má vykonať horizontálny posuv. Pri posuve doľava sa udáva táto hodnota záporne.

int dy: Počet grafických jednotiek, bodov, o ktorý sa má vykonať vertikálny posuv. Pri posuve hore sa udáva táto hodnota záporne.

CONST RECT *lprcScroll: Ukazovateľ na štruktúru RECT, ktorá obsahuje posúvaný obdĺžnik.

CONST RECT *lprcClip: Ukazovateľ na štruktúru RECT, ktorá obsahuje súradnice vystrihnutého pravouholníka. Posunutá je potom len oblasť v takto vybranom obdĺžniku.

HRGN hrgnUpdate: Oblasť, ktorá nie je zahrnutá do procesu posuvu. Funkcia ScrollDC definuje túto oblasť; nemusí to byť iba pravouholník. Tento parameter môže byť NULL.

LPRECT lprcUpdate: Ukazovateľ na štruktúru RECT, ktorá dostane súradnice pravouholníka, ktorý ohraničuje posunutím zasiahnutú oblasť. Táto oblasť je najväčší pravouholník v klientskych súradniciach, ktorý musí byť prekreslený. Tento parameter môže byť NULL.

Výsledok funkcie: BOOL: Ak sa funkcia skončila úspešne, je vrátená návratová hodnota TRUE, v opačnom prípade je vrátená hodnota FALSE.

 

ScrollWindowEx

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

user32.lib

user32.inc

Funkcia ScrollWindowEx posúva obsah danej klientskej oblasti okna. Táto funkcia je podobná funkcii ScrollDC, s tým rozdielom, že ScrollWindowEx pracuje s handle na okno a ScrollDC používa kontext zariadenia DC.

Syntax: int ScrollWindowEx, HWND hWnd, int dx, int dy, CONST RECT *prcScroll, CONST RECT *prcClip, HRGN hrgnUpdate, LPRECT prcUpdate, UINT flags    

HWND hWnd: Handle na okno, ktorého klientska oblasť sa má posunúť.

int dx: Počet grafických jednotiek, bodov, o ktorý sa má vykonať horizontálny posuv. Pri posuve doľava sa udáva táto hodnota záporne.

int dy: Počet grafických jednotiek, bodov, o ktorý sa má vykonať vertikálny posuv. Pri posuve hore sa udáva táto hodnota záporne.

CONST RECT *prcScroll: Ukazovateľ na štruktúru RECT, ktorá špecifikuje časť klientskej oblasti, ktorá sa bude presúvať. Ak je tento parameter NULL, potom je posunutá celá klientska oblasť.

CONST RECT *prcClip: Ukazovateľ na štruktúru RECT, ktorá obsahuje súradnice vystrihnutého pravouholníka. Iba oblasť v takto vybranom pravouholníku je potom posunutá.

HRGN hrgnUpdate: Oblasť, ktorá nie je zahrnutá do procesu posuvu. Nemusí to byť iba pravouholník. Tento parameter môže byť NULL.

LPRECT prcUpdate: Ukazovateľ na štruktúru RECT, ktorá dostane súradnice pravouholníka, ktorý ohraničuje posunutím zasiahnutú oblasť. Táto oblasť je najväčší pravouholník v klientskych súradniciach, ktorý musí byť prekreslený. Tento parameter môže byť NULL.

UINT flags: Príznak, ktorý riadi posuv. Tento parameter môže byť jedna alebo viacej nasledujúcich hodnôt, kombinovaných pomocou operátora OR.

SW_ERASE – pokiaľ tento príznak skombinujeme s príznakom SW_INVADATE, potom vymaže oblasť novo označenú za neplatnú.

SW_INVALIDATE – označí za neplatnú oblasť, ktorá sa odhalí po presune.

SW_SCROLLCHILDREN – posúva všetky dcérske okná, ktoré zasahujú do obdĺžnika špecifikovaného parametrom prcScroll. Dcérske okná sú posunuté o počet bodov určených parametrami dx a dy. Windows posiela správu WM_MOVE všetkým dcérskym oknám, ktoré zasahujú do oblasti špecifikovanej parametrom prcScroll, a to aj vtedy, keď sa neposúvajú.

Výsledok funkcie: int: Vráti SIMPLEREGION (pravouholníková neplatná oblasť), COMPLEXREGION (neplatná oblasť iného než pravouhlého tvaru; prekrývajúce sa pravouholníky), alebo NULLREGION (žiadna oblasť nie je neplatná). V ostatných prípadoch je návratová hodnota ERROR.

Prvú časť o scrollbaroch zakončíme jednoduchým príkladom (pozri obrázok 3). Samozrejme, zdrojový kód nájdete na stránke www.pcrevue.sk v sekcii Programujeme – Assembler pod Windows.

Literatúra

[1]  Simon, R. J. – Gouker, M. – Barnes, B. C.: Win32 API. Zväzok 1, 2, 3. UNIS Publishing, Brno 1997.

[2]  Richter, J.: Windows pro pokročilé a experty. Computer Press, Praha 1997.

[3]  Petzold, Ch.: Programování ve Windows – Win32 API. Computer Press, Praha 1999.

 


Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Tipy a triky: Ako na snímku obrazovky na akomkoľvek počítači s Windows?

02.12.2016 00:13

Ak snímky obrazovky robíte často apotrebujete napríklad funkcie na posun stránok alebo snímanie zobrazenia pri vyššom rozlíšení displeja, zrejme používate nejakú špecializovanú aplikáciu. Väčšina použ ...

Ako na to 1

Tipy a triky: Ako aplikácii prednastaviť spúšťanie s administrátorskými právami?

30.11.2016 00:10

Väčšina aspoň trochu skúsenejších používateľov vie, že aj keď máte na operačnom systéme Windows vytvorený administrátorský účet, aplikácie pre bezpečnosť nefungujú vždy splnými administrátorskými práv ...

Ako na to 2

Tipy a triky: Ako vypnúť uzamykaciu obrazovku vo Windows 10?

29.11.2016 00:10

Rozčuľuje vás, že pred každým prihlásením doúčtu vášho počítača musíte prejsť uzamykacou obrazovkou? Windows 10 na tejto obrazovke ukazuje čas,dátum anejakú zaujímavú fotografiu zrôznych kútov sveta. ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá