//Бегаем за курсором...чтобы за экран не уходил... void SetVisibleScreen() { int **curpos = &clistm->*curpos; unsigned int **itemFromDisp = &clistm->*itemFromDisp; unsigned int *curpage = &clistm->curpage; unsigned int **totalItems = &clistm->*totalItems; unsigned int **startItems = &clistm->*startItem; if(VIEW_MODE) { if(**curpos > **itemFromDisp) { int i = 1; int j = **curpos; if(**itemFromDisp == **totalItems) *curpage = 1; else { while(j>**itemFromDisp) { j-=**itemFromDisp; i++; } *curpage=i; } } else *curpage=1; } else { if(**totalItems != **itemFromDisp && **curpos > **itemFromDisp) { unsigned int start = (sdiv(2,*itemFromDisp)+1) > 5 ? (sdiv(2,*itemFromDisp)+1) : (5); if(*curpos > start && *curpos < *totalItems - *itemFromDisp) **startItems = *curpos - start; else if(*curpos > *totalItems - *itemFromDisp) **startItems = *totalItems - *itemFromDisp; } } } //Если не в два столбика void MoveUp2(int i) { int start = (**itemFromDisp/2)+1; if(start < 5) start = 0; if( *curpos > *itemFromDisp + 2 && *totalItems!=*itemFromDisp ) { *curpos-=i; if(*startItem > 0 && *curpos > start && *curpos < *totalItems-start ) *startItem-=i; } else if(*curpos > 0) { *curpos-=i; if(*startItem > 0 && *curpos > start && *totalItems != *itemFromDisp) *startItem -= i; else if(*curpos < start) *startItem = 0; } else { *curpos = *totalItems; if( *totalItems == *itemFromDisp ) *startItem=0; else *startItem = *totalItems - *itemFromDisp; } } void MoveDown2(int i) { int &*curpos = **curpos; int &*itemFromDisp = clist->*itemFromDisp int &curpage = *curpage; int start = *itemFromDisp/2+1;//(**itemFromDisp/2+1 > 5 ? **itemFromDisp/2+1 : 0); if(start==0) *startItem=0; if( *curpos < start && *totalItems!=*itemFromDisp ) *curpos+=i; else if( *curpos < *totalItems - 1 ) { if( *totalItems - *itemFromDisp > 0 ) { if(*startItem < (*totalItems - *itemFromDisp)) *startItem+=i; } *curpos+=i; } else { *curpos=0; *startItem=0; } } void MoveUp(int i) { int &*curpos = **curpos; int &*itemFromDisp = clist->*itemFromDisp int &curpage = *curpage; if(!*itemFromDisp)return; if(i) **curpos-=2; else **curpos--; if(**curpos < 0) { **curpos=**totalItems-1; if(**itemFromDisp == **totalItems)//если кол-во контактов на экране равно общему количеству контактов *curpage = 1;//не меняем страницу else *curpage = sdiv(**itemFromDisp,**totalItems)+1;//иначе на последнюю страницу } else { if(**curpos < (*curpage-1)*(**itemFromDisp)){ **curpos+=1; *curpage--; } } } void MoveDown(int i) { if(!**totalItems) return; if(i) **curpos+=2; else **curpos++; if(**curpos >= **totalItems) { **curpos=0; *curpage=1; } if(**curpos >= *curpage*(**itemFromDisp+(i?1:0))) { **curpos-=(i?1:0); *curpage++; } }