/* scrollba.c */ /***************************************************************************** PROGRAM: scrollba.c PURPOSE: ScrollBarien käyttö yhteneväisesti riippumatta siitä, ovatko ne omia liukuja vaiko ikkunan liukuja. Ikkunan liuilla on valmiit numerot, jotka ovat SB_VERT ja SB_HORZ. Editor: Vesa Lappalainen 22.8.1994 Käyttö: Projektiin ALI\scrollba.c ja pääohjelmaan #include "scrollba.h" Funktiot: Parametrit: hWnd - ikkunan kahva (esim. dialogi) jossa liuku sijaitsee id - liun tunnus (ikkunan liut SB_HORX ja SB_VERT) nPos - uusi paikka fRepaint - päivitetäänkö samalla liuan asento näytössä pagesize - hyppyaskeleen koko sivun siirrossa (SB_PAGEDOWN ja SB_PAGEUP) cmd - liulle viestinä tullut komento modify - muutetaanko samalla liun paikka int SetScrollPosID(HWND hWnd,int id,int nPos,BOOL fRepaint) - asetetaan liun paikka int SendScrollPosID(HWND hWnd,int id,int nPos) - lähetetään liun ikkunalle viesti liun uudesta paikasta. Jos liun paikka ei muuta, ei viestiä lähetetä. Näin voidaan estää rekursio yhteenkoplatuista liuista, joissa toisen muuttuminen lähettää viestin toiselle. (Osaa nykyisin vain VERT-liut ja SB_VERT ja SB_HORZ-liut) int GetScrollPosID(HWND hWnd,int id) - luetaan liun paikka int SetNewScrollPosID(HWND hWnd,int id,int pagesize,int cmd,int nPos,BOOL modify) - asetetaan liun paikka liun ikkunalle tulleen visetin perusteella. nPos olisi syytä olla GET_WM_VSCROLL_POS(wParam,lParam) Viestin käsittelijän on osattava erottaa toisistaan WM_VSCROLL ja WM_HSCROLL viestit, jotta ikkunan liuille saadaan oikeat ID:t. (Esim tabhand.c -tekee tämän) int GetScrollRangeID(HWND hWnd,int id,LPINT smin,LPINT smax) - luetana liun rajat int SetScrollRangeID(HWND hWnd,int id,int smin,int smax,BOOL fRedraw) - asetetaan liun rajat /*****************************************************************************/ #include #include #include "scrollba.h" /*****************************************************************************/ typedef struct { /* Tietue jonka avulla hWnd id -pari voidaan muuttaa: */ HWND hWnd; /* Liun kahva SetScrollPos yms. varten */ HWND shWnd; /* Liun kahva SendMessage-viuestä varten */ int id; /* Liun tunnus */ int fnBar; /* Lippu SetScrollPos yms. varten */ UINT message; /* Liukua vastaava viesti */ } tScroll; /*****************************************************************************/ static tScroll GetScroll(HWND hWnd,int id,tScroll *s) { s->shWnd = NULL; s->id = id; s->hWnd = hWnd; s->fnBar = id; if ( id == SB_VERT ) { s->message = WM_VSCROLL; } else if ( id == SB_HORZ ) { s->message = WM_HSCROLL; } else { /* Omat liut */ long style; s->hWnd = GetDlgItem(hWnd,id); s->shWnd = s->hWnd; s->fnBar = SB_CTL; style = GetWindowLong(s->hWnd,GWL_STYLE); if ( style & SBS_VERT ) s->message = WM_VSCROLL; else s->message = WM_HSCROLL; } return *s; } /*****************************************************************************/ int SetScrollPosID(HWND hWnd,int id,int nPos,BOOL fRepaint) { tScroll s = GetScroll(hWnd,id,&s); return SetScrollPos(s.hWnd,s.fnBar,nPos,fRepaint); } /*****************************************************************************/ int GetScrollPosID(HWND hWnd,int id) { tScroll s = GetScroll(hWnd,id,&s); return GetScrollPos(s.hWnd,s.fnBar); } /*****************************************************************************/ int SendScrollPosID(HWND hWnd,int id,int nPos) /* Käsitellään viesti vain, mikäli arvot muuttuvat. Näin voidan estää ** rekursio yhteenkoplatuista liuista. -----------------------------------------------------------------------------*/ { tScroll s = GetScroll(hWnd,id,&s); int pos = GetScrollPos(s.hWnd,s.fnBar); int smin,smax; GetScrollRange(s.hWnd,s.fnBar,&smin,&smax); if ( nPos < smin ) nPos = smin; if ( smax < nPos ) nPos = smax; if ( pos == nPos ) return 0; return (int)SendMessage(hWnd,s.message, GET_WM_VSCROLL_MPS(SB_THUMBPOSITION,nPos,s.shWnd)); } /*****************************************************************************/ int SetNewScrollPosID(HWND hWnd,int id,int pagesize,int cmd,int nPos,BOOL modify) { tScroll s = GetScroll(hWnd,id,&s); int value = GetScrollPosID(hWnd,id); int smin,smax; GetScrollRange(s.hWnd,s.fnBar,&smin,&smax); switch ( cmd ) { case SB_BOTTOM : value = smin; break; case SB_TOP : value = smax; break; case SB_LINEDOWN : value++; break; case SB_PAGEDOWN : value += pagesize; break; case SB_LINEUP : value--; break; case SB_PAGEUP : value -= pagesize; break; case SB_THUMBPOSITION: case SB_THUMBTRACK : value = nPos; break; } if ( value < smin ) value = smin; if ( smax < value ) value = smax; if ( modify ) { SetScrollPos(s.hWnd,s.fnBar,value,TRUE); } return value; } /*****************************************************************************/ int GetScrollRangeID(HWND hWnd,int id,int *smin,int *smax) { tScroll s = GetScroll(hWnd,id,&s); GetScrollRange(s.hWnd,s.fnBar,smin,smax); return 0; } /*****************************************************************************/ int SetScrollRangeID(HWND hWnd,int id,int smin,int smax,BOOL fRedraw) { tScroll s = GetScroll(hWnd,id,&s); SetScrollRange(s.hWnd,s.fnBar,smin,smax,fRedraw); return 0; }