static void hscrollto(uiArea *a, int pos) { struct scrollParams p; hscrollParams(a, &p); scrollto(a, SB_HORZ, &p, pos); }
static void vscrollto(uiArea *a, int pos) { struct scrollParams p; vscrollParams(a, &p); scrollto(a, SB_VERT, &p, pos); }
void MsgWin::eventhandle(NEvent* ev) //обработчик событий { NScrollView::eventhandle(ev); //предок if ( ev->done ) return; if ( ev->type == NEvent::evKB ) { ev->done = true; switch(ev->keycode) { case KEY_PPAGE: //wprintw(win,"PgUp"); scrollto(-getheight()/2); //вверх на полокна setautoscroll(false); break; case KEY_NPAGE: //wprintw(win,"PgDn"); if (!getautoscroll()) { int oldpos = startindex; scrollto(getheight()/2); //вниз на пол окна if ( oldpos == startindex) //позиция не изменилась (уже достигли конца) setautoscroll(true); //включаем автоскроллинг } break; case KEY_HOME: scrollto(-content.size()); setautoscroll(false); break; case KEY_END: scrollto(content.size()); setautoscroll(false); break; default: ev->done = false; //нет реакции на этот код } //switch if (ev->done) //если обработали, то нужно перерисоваться refresh(); } if ( ev->type == NEvent::evTIMER ) { updatedata(); //запросить данные с сервера refresh(); //перерисовать окно } }
static void scroll(uiArea *a, int which, struct scrollParams *p, WPARAM wParam, LPARAM lParam) { int pos; SCROLLINFO si; pos = *(p->pos); switch (LOWORD(wParam)) { case SB_LEFT: // also SB_TOP pos = 0; break; case SB_RIGHT: // also SB_BOTTOM pos = p->length - p->pagesize; break; case SB_LINELEFT: // also SB_LINEUP pos--; break; case SB_LINERIGHT: // also SB_LINEDOWN pos++; break; case SB_PAGELEFT: // also SB_PAGEUP pos -= p->pagesize; break; case SB_PAGERIGHT: // also SB_PAGEDOWN pos += p->pagesize; break; case SB_THUMBPOSITION: ZeroMemory(&si, sizeof (SCROLLINFO)); si.cbSize = sizeof (SCROLLINFO); si.fMask = SIF_POS; if (GetScrollInfo(a->hwnd, which, &si) == 0) logLastError(L"error getting thumb position for area"); pos = si.nPos; break; case SB_THUMBTRACK: ZeroMemory(&si, sizeof (SCROLLINFO)); si.cbSize = sizeof (SCROLLINFO); si.fMask = SIF_TRACKPOS; if (GetScrollInfo(a->hwnd, which, &si) == 0) logLastError(L"error getting thumb track position for area"); pos = si.nTrackPos; break; } scrollto(a, which, p, pos); }
static void scrollby(uiArea *a, int which, struct scrollParams *p, int delta) { scrollto(a, which, p, *(p->pos) + delta); }