⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asix_sb.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
			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 + -