📄 asix_sb.c
字号:
else if ( size == PPSM_INPUT_DRAG_UP ) trans_msg->message = WM_PENDRAGUP;
else if ( size == PPSM_INPUT_PEN_UP ) trans_msg->message = WM_PENUP;
//else trans_msg->message is equal to zero ;
break;
case ASIX_PEN:
if ( areaId != sbctrl->slider_id ) return ASIX_NO_MSG;
GetPosData(data, &sbctrl->penx, &sbctrl->peny);
trans_msg->lparam = sbctrl->windowid;
trans_msg->data = (void *)sbctrl;
trans_msg->wparam = (U16)WNDCLASS_SCROLL;
trans_msg->message = WM_PENXY;
break;
default:
return ASIX_NO_MSG;
}
return ASIX_OK;
}
STATUS sb_msgproc( U32 win_id, U16 asix_msg, U32 lparam, void *data, U16 wparam,
void *reserved)
{
U16 xSrc,ySrc,xDest,yDest;
register struct sb_ctrl *sbctrl;
static MSG sb_msg; //it will be sent by SB
U32 areaid;
U8 needscroll;
S16 oldpos;//newpos;
S16 pixmoved;
U16 penpos, oldpenpos; //it is a temp,
//just to accelerate
U32 pGC;
ASIX_WINDOW *wndptr;
// if (asix_msg != WM_PENDOWN && asix_msg != WM_PENDRAG &&
// asix_msg != WM_PENDRAGUP && asix_msg != WM_PENUP &&
// asix_msg != WM_PENXY )
// return ASIX_OK;
wndptr = (ASIX_WINDOW *)win_id;
//It is not for me, Just go away! By LingMing 2001/11/27
if( wndptr == NULL )
return ASIX_ERROR;
if( wndptr->wndclass == NULL || wndptr->wndclass->wndclass_id != WNDCLASS_SCROLL )
return ASIX_ERROR;
// if ( wparam != WNDCLASS_SCROLL )
// return ASIX_OK;
// sbctrl = (struct sb_ctrl *)data;
sbctrl = (struct sb_ctrl *)wndptr->ctrl_str;
/*we should add some param checking here. By Lingming 2001/11/27*/
if ( sbctrl == NULL ) return ASIX_ERROR;
//it maybe another scroll bar's msg
// if ( lparam != sbctrl->windowid) return ASIX_OK;
pGC =GetGC();
memset( (void *)&sb_msg, 0x0, sizeof(MSG) );
sb_msg.messageType = ASIX_MESSAGE;
switch ( asix_msg )
{
case WM_PENDOWN:
//prepare for scrolling or change-color
//this value is used to distinguish
//drag(dragup) and penup(down)
sbctrl->enablescroll = 1;
//pessia2002/3/15:
//when got WM_PENDOWN while scrolling,
//end scrolling!
if(sbctrl->keepscroll == 1)
{
sbctrl->keepscroll = 0;
sbctrl->haveinversed = 0;
sbctrl->oldpenx = -1000;
sbctrl->oldpeny = -1000;
}
case WM_PENDRAG:
case WM_PENDRAGUP:
if ( sbctrl->areaselect == SB_UPRIGHT ||
sbctrl->areaselect == SB_DOWNLEFT )
{
//pessia2002/3/15 while scrolling,
//buttons will not be pressed!
if(sbctrl->keepscroll == 0)
{
//inverse upright button or downleft button
if( sbctrl->areaselect == SB_UPRIGHT )
areaid = sbctrl->upright_id;
else
areaid = sbctrl->downleft_id;
ActiveAreaRead( areaid, &xSrc, &ySrc, &xDest, &yDest);
InvRec( pGC, xSrc, ySrc, xDest-xSrc+1, yDest-ySrc+1);
}
sbctrl->areaselect = 0;
} else if( sbctrl->areaselect == SB_SLIDER )
{ //it is for protection
//because when DRAGUP happens,
//there maybe some color-changed area in slider_area,
//we should restore it!!!
if( sbctrl->haveinversed == 1 )
goto ClearInverse;
}
break;
case WM_PENUP:
if ( sbctrl->areaselect == SB_UPRIGHT ||
sbctrl->areaselect == SB_DOWNLEFT )
{
//pessia2002/3/15 while scrolling,
//buttons will not be pressed!
if(sbctrl->keepscroll == 0)
{
//inverse upright button or downleft button
if( sbctrl->areaselect == SB_UPRIGHT )
areaid = sbctrl->upright_id;
else
areaid = sbctrl->downleft_id;
ActiveAreaRead( areaid, &xSrc, &ySrc, &xDest, &yDest);
InvRec( pGC, xSrc, ySrc, xDest-xSrc+1, yDest-ySrc+1);
//send message
if (sbctrl->style & SBS_HORZ) {
sb_msg.message = WM_HSCROLL;
if ( sbctrl->areaselect == SB_UPRIGHT)
sb_msg.wparam = SB_LINERIGHT;
else
sb_msg.wparam = SB_LINELEFT;
} else if (sbctrl->style & SBS_VERT) {
sb_msg.message = WM_VSCROLL;
if ( sbctrl->areaselect == SB_UPRIGHT)
sb_msg.wparam = SB_LINEUP;
else
sb_msg.wparam = SB_LINEDOWN;
}
sb_msg.lparam = sbctrl->windowid;
AdvSendMessage(GetCurTask()->id, (P_MESSAGE)(&sb_msg), NO_SWAP_TASK);
}
sbctrl->areaselect = 0;
break;
} else if ( sbctrl->areaselect == SB_SLIDER )//penup in slider area
{
//indicate this scrolling or color-changed have finished!
sbctrl->enablescroll = 0;
//if the bar is scrolling now
if( sbctrl->keepscroll == 1 )
{
sbctrl->keepscroll = 0;
//set new logcurpos
sbctrl->logcurpos = (sbctrl->curpos - sbctrl->slider_area_start)
* sbctrl->logrange
/ (sbctrl->slider_area_range - sbctrl->thumblen )
+ sbctrl->minpos ;
if(sbctrl->logcurpos > sbctrl->maxpos )
sbctrl->logcurpos = sbctrl->maxpos;
sbctrl->oldpenx = -1000;
sbctrl->oldpeny = -1000;
//send SB_ENDSCROLL message (which includes current logical position)
sb_msg.message = (sbctrl->style&SBS_HORZ)?WM_HSCROLL:WM_VSCROLL;
sb_msg.wparam = SB_ENDSCROLL;
sb_msg.data = (P_VOID)&sbctrl->logcurpos;
sb_msg.lparam = sbctrl->windowid;
AdvSendMessage(GetCurTask()->id, (P_MESSAGE)(&sb_msg), NO_SWAP_TASK);
} else {
// it is not scrolling, so there maybe some color-changed area
// after last PENDOWN happened
// PENUP happens out of slider bar, so send message and
// restore color-changed area
ClearInverse:
penpos = (sbctrl->style&SBS_HORZ)?sbctrl->oldpenx:sbctrl->oldpeny ;
if( penpos < sbctrl->curpos || penpos > sbctrl->thumbend )
{
//if no color-changed area, break
if( sbctrl->haveinversed == 0 ) break;
sbctrl->haveinversed = 0;
//restore color-changed area, and send corresponding message
//move down/right
if( penpos > sbctrl->thumbend )
{
if( sbctrl->style & SBS_HORZ )//right
{
ClearRec( pGC, ColorTheme.form_backcolor,
sbctrl->thumbend+2,
sbctrl->y + 1,
sbctrl->slider_area_end - sbctrl->thumbend-1,
sbctrl->boxw ,
GPC_REPLACE_STYLE);
sb_msg.message = WM_HSCROLL;
sb_msg.wparam = SB_PAGERIGHT;
} else { //down
ClearRec( pGC, ColorTheme.form_backcolor,
sbctrl->x + 1,
sbctrl->thumbend+2,
sbctrl->boxw,
sbctrl->slider_area_end - sbctrl->thumbend-1,
GPC_REPLACE_STYLE);
sb_msg.message = WM_VSCROLL;
sb_msg.wparam = SB_PAGEDOWN;
}
} else
//move up/left
if( penpos < sbctrl->curpos )
{
if( sbctrl->style & SBS_HORZ )//left
{
ClearRec( pGC, ColorTheme.form_backcolor,
sbctrl->slider_area_start ,
sbctrl->y + 1,
sbctrl->curpos - ( sbctrl->slider_area_start + 1 ),
sbctrl->boxw,
GPC_REPLACE_STYLE);
sb_msg.message = WM_HSCROLL;
sb_msg.wparam = SB_PAGELEFT;
} else {//up
ClearRec( pGC, ColorTheme.form_backcolor,
sbctrl->x + 1,
sbctrl->slider_area_start ,
sbctrl->boxw,
sbctrl->curpos - ( sbctrl->slider_area_start + 1 ),
GPC_REPLACE_STYLE);
sb_msg.message = WM_VSCROLL;
sb_msg.wparam = SB_PAGEUP;
}
}
//oldpen & oldpeny should be back to initial value (-1000)
sbctrl->oldpenx = -1000;
sbctrl->oldpeny = -1000;
sb_msg.lparam = sbctrl->windowid;
AdvSendMessage(GetCurTask()->id, (P_MESSAGE)(&sb_msg), NO_SWAP_TASK);
}
}
}
break;
case WM_PENXY:
//only Pen in slider_area is allowed to cause scrolling or change-color
if (sbctrl->areaselect != SB_SLIDER )
break;
//PENUP or PENDRAGUP happened!
if( sbctrl->penx == -1 || sbctrl->peny == -1 ) break;
if ( sbctrl->enablescroll ==1 ) //it means PENDOWN happened
{
//both scrolling and change-color is not permitted!
if(sbctrl->keepscroll == 1 && sbctrl->haveinversed == 1) break;
//check whether Pen's position is in slider bar or out of it,
//if in, it is scrolling
//if out, it is change-color
penpos = (sbctrl->style&SBS_HORZ)?sbctrl->penx:sbctrl->peny ;
oldpenpos = (sbctrl->style&SBS_HORZ)?sbctrl->oldpenx:sbctrl->oldpeny ;
if( penpos > sbctrl->curpos && penpos < sbctrl->thumbend )
{
//it is scrolling the slider bar!!!!!!!!
if( sbctrl->oldpenx==-1000 && sbctrl->oldpeny==-1000 )
{//first touch, the slider bar needn't move
//just record the Pen's position
sbctrl->oldpenx=sbctrl->penx;
sbctrl->oldpeny=sbctrl->peny;
sbctrl->keepscroll = 1;
sbctrl->haveinversed = 0;
break;
}
ScrollHandler:
if( sbctrl->keepscroll == 0 && sbctrl->haveinversed == 1 )
goto ClickHandler;
//needscroll is a value to sign whether it need PutRect or not
needscroll=0;
//save slider bar's current position
oldpos=sbctrl->curpos;
//pen is not moved!
if( oldpenpos == penpos ) break;
if( penpos > oldpenpos ) //right or down
{
pixmoved = penpos - oldpenpos;
//height should be boxw
if( sbctrl->thumbend+pixmoved < sbctrl->slider_area_end )
{
sbctrl->curpos+=pixmoved;
sbctrl->thumbend=sbctrl->curpos+sbctrl->thumblen-1;
needscroll=1;
} else {
if( sbctrl->logcurpos == sbctrl->maxpos) break;
sbctrl->curpos = sbctrl->slider_area_end - sbctrl->thumblen;
sbctrl->thumbend=sbctrl->slider_area_end-1;
needscroll=1;
}
} else if( oldpenpos > penpos ){//left or up
pixmoved = oldpenpos - penpos;
//height should be boxw
if( sbctrl->curpos > pixmoved &&
sbctrl->curpos-pixmoved > sbctrl->slider_area_start )
{
sbctrl->curpos-=pixmoved;
sbctrl->thumbend=sbctrl->curpos+sbctrl->thumblen-1;
needscroll=1;
} else {
if( sbctrl->logcurpos == sbctrl->minpos) break;
sbctrl->curpos = sbctrl->slider_area_start + 1;
sbctrl->thumbend=sbctrl->curpos+sbctrl->thumblen-1;
needscroll=1;
}
}else break; //do not care such penxy
if(needscroll)
{
ClearRec( pGC, ColorTheme.form_backcolor,
(sbctrl->style&SBS_HORZ)?oldpos:(sbctrl->x+1),
(sbctrl->style&SBS_HORZ)?(sbctrl->y+1):oldpos,
(sbctrl->style&SBS_HORZ)?sbctrl->thumblen:sbctrl->boxw,
(sbctrl->style&SBS_HORZ)?sbctrl->boxw:sbctrl->thumblen,
GPC_REPLACE_STYLE);
sbctrl->logcurpos = (sbctrl->curpos - sbctrl->slider_area_start)
* sbctrl->logrange
/ (sbctrl->slider_area_range - sbctrl->thumblen )
+ sbctrl->minpos ;
if(sbctrl->logcurpos > sbctrl->maxpos )
sbctrl->logcurpos = sbctrl->maxpos;
PutRec( pGC, sbctrl->slider_map,
(sbctrl->style&SBS_HORZ)?sbctrl->curpos:(sbctrl->x+1),
(sbctrl->style&SBS_HORZ)?(sbctrl->y+1):sbctrl->curpos,
(sbctrl->style&SBS_HORZ)?sbctrl->thumblen:sbctrl->boxw,
(sbctrl->style&SBS_HORZ)?sbctrl->boxw:sbctrl->thumblen,
GPC_REPLACE_STYLE,0);
dbgoutput( "*** v%d ****", sbctrl->logcurpos );
sb_msg.message = (sbctrl->style&SBS_HORZ)?WM_HSCROLL:WM_VSCROLL;
sb_msg.wparam = SB_THUMBTRACK;
sb_msg.data = (P_VOID)&sbctrl->logcurpos;
sb_msg.lparam = sbctrl->windowid;
AdvSendMessage(GetCurTask()->id, (P_MESSAGE)(&sb_msg), NO_SWAP_TASK);
}
sbctrl->oldpenx=sbctrl->penx;
sbctrl->oldpeny=sbctrl->peny;
} else if( penpos < sbctrl->curpos || penpos > sbctrl->thumbend ){
//it is change-color
ClickHandler:
if( sbctrl->keepscroll == 1 ) goto ScrollHandler;
//check if it is first touch or not
//if first touch, change-color
//if not, do nothing
if ( sbctrl->oldpenx == -1000 && sbctrl->oldpeny == -1000 )
{
//double inverse is not permitted!
if ( sbctrl->haveinversed == 1 )
goto ClearInverse;
sbctrl->keepscroll = 0;
sbctrl->haveinversed = 1;
//move down/right
if( penpos > sbctrl->thumbend )
{
if( sbctrl->style & SBS_HORZ )//right
{
ClearRec( pGC, ColorTheme.form_board,
sbctrl->thumbend+2,
sbctrl->y + 1,
sbctrl->slider_area_end - sbctrl->thumbend-1,
sbctrl->boxw,
GPC_REPLACE_STYLE );
} else { //down
ClearRec( pGC, ColorTheme.form_board,
sbctrl->x + 1,
sbctrl->thumbend+2,
sbctrl->boxw,
sbctrl->slider_area_end - sbctrl->thumbend-1,
GPC_REPLACE_STYLE );
}
} else
//move up/left
if( penpos < sbctrl->curpos )
{
if( sbctrl->style & SBS_HORZ )//left
{
ClearRec( pGC, ColorTheme.form_board,
sbctrl->slider_area_start ,
sbctrl->y + 1,
sbctrl->curpos - ( sbctrl->slider_area_start + 1 ),
sbctrl->boxw,
GPC_REPLACE_STYLE);
} else {//up
ClearRec( pGC, ColorTheme.form_board,
sbctrl->x + 1,
sbctrl->slider_area_start ,
sbctrl->boxw,
sbctrl->curpos - ( sbctrl->slider_area_start + 1 ),
GPC_REPLACE_STYLE);
}
}
//record the current PEN's position
sbctrl->oldpenx = sbctrl->penx;
sbctrl->oldpeny = sbctrl->peny;
}
} else break;//on the border!
}
break;
default:
break;
}
return ASIX_OK;
}
STATUS SetScrollRange(U32 windowid,U16 minpos, U16 maxpos)
{
register struct sb_ctrl *sbctrl;
U16 newpos,oldmaxpos,oldminpos;
U32 pGC;
if ( maxpos < minpos ) return ASIX_ERROR;
sbctrl = ((ASIX_WINDOW *)windowid)->ctrl_str;
if ( sbctrl->minpos == minpos && sbctrl->maxpos == maxpos )
return ASIX_OK;
pGC =GetGC();
oldminpos = sbctrl->minpos;
oldmaxpos = sbctrl->maxpos;
//Set new logical range!
sbctrl->minpos = minpos;//logical min
sbctrl->maxpos = maxpos;//logical max
sbctrl->logrange = maxpos - minpos + 1;
//pessia2002/3/16:
//when maxpos == minpos,
//clear slider bar(thumb), and disable scroll bar,
//then return.
if ( maxpos == minpos)
{
ClearRec( pGC, ColorTheme.form_backcolor,
(sbctrl->style&SBS_HORZ)?sbctrl->curpos:(sbctrl->x+1),
(sbctrl->style&SBS_HORZ)?(sbctrl->y+1):sbctrl->curpos,
(sbctrl->style&SBS_HORZ)?sbctrl->thumblen:sbctrl->boxw,
(sbctrl->style&SBS_HORZ)?sbctrl->boxw:sbctrl->thumblen,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -