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

📄 asix_sb.c

📁 基于东南大学开发的SEP3203的ARM7中的所有驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
			GPC_REPLACE_STYLE);
		
		//disable scrollbar
		sbctrl->scrollstatus = 0;

		return ASIX_OK;
	}

	//pessia2002/3/16:
	//when sbctrl->minpos == sbctrl->maxpos,
	//init and draw slider bar(thumb), then enable scroll bar.
	if( oldminpos == oldmaxpos )
	{
		/* Initial the slider bar's position */
		sbctrl->curpos = sbctrl->slider_area_start + 1;
		sbctrl->thumbend = sbctrl->curpos + sbctrl->thumblen - 1;
		sbctrl->logcurpos = sbctrl->minpos;
		
		if( sbctrl->slider_map == NULL )
		{
			sbctrl->slider_map = (U8 *)GetBlock( sbctrl->boxw, sbctrl->thumblen );
			if( sbctrl->slider_map == NULL )
			{
				asix_sb_memdbgprintf( "scrollbar free mem of itself" );
				return ASIX_NO_MEM;
			}
		}

		/* Draw slider bar */
		DrawRec( pGC, ColorTheme.form_line, 
			(sbctrl->style&SBS_HORZ)?(sbctrl->x+1+sbctrl->boxw):(sbctrl->x+1), 
			(sbctrl->style&SBS_HORZ)?(sbctrl->y+1):(sbctrl->y+sbctrl->boxw+1), 
			(sbctrl->style&SBS_HORZ)?sbctrl->thumbend:(sbctrl->x+sbctrl->boxw), 
			(sbctrl->style&SBS_HORZ)?(sbctrl->y+sbctrl->boxw):sbctrl->thumbend, 
			GPC_SOLID_LINE, GPC_REPLACE_STYLE);	

		ClearRec( pGC,ColorTheme.obj3D,
			(sbctrl->style&SBS_HORZ)?(sbctrl->x+sbctrl->boxw+2):(sbctrl->x+2),
			(sbctrl->style&SBS_HORZ)?(sbctrl->y+2):(sbctrl->y+sbctrl->boxw+2), 
			(sbctrl->style&SBS_HORZ)?(sbctrl->thumblen-2):(sbctrl->boxw-2),
			(sbctrl->style&SBS_HORZ)?(sbctrl->boxw-2):(sbctrl->thumblen-2),
			GPC_REPLACE_STYLE);	
		
		SaveRec( pGC, sbctrl->slider_map, 
			(sbctrl->style&SBS_HORZ)?(sbctrl->x+1+sbctrl->boxw):(sbctrl->x+1),
			(sbctrl->style&SBS_HORZ)?(sbctrl->y+1):(sbctrl->y+sbctrl->boxw+1), 
			(sbctrl->style&SBS_HORZ)?sbctrl->thumblen:(sbctrl->boxw),
			(sbctrl->style&SBS_HORZ)?(sbctrl->boxw):sbctrl->thumblen, 0);

		//enable scrollbar
		sbctrl->scrollstatus = 1;
	}else{
		if(sbctrl->logcurpos > maxpos)
			sbctrl->logcurpos = maxpos;
		else if(sbctrl->logcurpos == minpos ||
				sbctrl->logcurpos == oldmaxpos)
			return ASIX_OK;

		newpos = sbctrl->slider_area_start + 1 +
		 (sbctrl->logcurpos - sbctrl->minpos ) * 
		 (sbctrl->slider_area_range - sbctrl->thumblen)
		 /( sbctrl->logrange - 1 );

		if( newpos == sbctrl->curpos ) return ASIX_OK;

		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, 
			GPC_REPLACE_STYLE);

		if( newpos + sbctrl->thumblen - 1 < sbctrl->slider_area_end )
		{	
			sbctrl->curpos = newpos;
			sbctrl->thumbend = sbctrl->curpos + sbctrl->thumblen -1 ;
		} else {
			sbctrl->curpos = sbctrl->slider_area_end - sbctrl->thumblen;
			sbctrl->thumbend = sbctrl->slider_area_end - 1;
		}
		
		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);
	}
		
	return ASIX_OK;
	
}

STATUS sb_repaint(void *ctrl_str, U32 lparam)
{
	register struct sb_ctrl *sbctrl;	
	U32		pGC, style;
	U16		x, y, width, height;

	pGC =GetGC();
	
	sbctrl = (struct sb_ctrl *)ctrl_str;

	x = sbctrl->x;
	y = sbctrl->y;
	width = sbctrl->width;
	height = sbctrl->height;
	style = sbctrl->style;

	ClearRec( pGC,ColorTheme.form_backcolor, 
		x, 
		y, 
		width, 
		height,
		GPC_REPLACE_STYLE);
	
	//draw two icons
	if ( style & SBS_VERT) {
//		DrawMonoImage( pGC, up10X10, 
//			sbctrl->x +sbctrl->width/2 - BMP_WIDTH/2, 
//			sbctrl->y + sbctrl->boxw/2 - BMP_HEIGHT/2, 
//			BMP_WIDTH, 
//			BMP_HEIGHT, 
//			ColorTheme.form_frontcolor, ColorTheme.form_backcolor);
		{
			U32	hbmp;
			//U32	trColor;
			U16 lx = x + width/2 - BMP_WIDTH/2;
			U16 ly = y + sbctrl->boxw/2 - BMP_HEIGHT/2;
			U32 palette[2];
			palette[0] = ColorTheme.form_client;
			palette[1] = ColorTheme.form_frontcolor;

			hbmp = LoadBitmap( up10X10, palette );
			if( hbmp != 0 )
			{
				SetBMPPalette( hbmp, palette, NULL );
				//SetBkFillMode( pGC, MAKELONG( GPC_REPLACE_STYLE, GPC_TRANSPARENT_STYLE ) );
				//GetBMPPixel( pGC, 0, 0, hbmp, &trColor );
				//DisplayBMPEx( pGC, x, y, hbmp, GPC_TRANSPARENT_STYLE, trColor );
				DisplayBMP( pGC, lx, ly, hbmp );
				FreeBitmap( hbmp );
			}
		}
//		DrawMonoImage( pGC, down10X10, 
//			sbctrl->x +sbctrl->width/2 - BMP_WIDTH/2, 
//			sbctrl->y + sbctrl->height-sbctrl->boxw/2-BMP_HEIGHT/2, 
//			BMP_WIDTH, 
//			BMP_HEIGHT, 
//			ColorTheme.form_frontcolor, ColorTheme.form_backcolor);
		{
			U32	hbmp;
			//U32	trColor;
			U16 lx = x + width/2 - BMP_WIDTH/2;
			U16 ly = y + height-sbctrl->boxw/2-BMP_HEIGHT/2;
			U32 palette[2];
			
			palette[0] = ColorTheme.form_client;
			palette[1] = ColorTheme.form_frontcolor;

			hbmp = LoadBitmap( down10X10, palette );
			if( hbmp != 0 )
			{
				SetBMPPalette( hbmp, palette, NULL );
				//SetBkFillMode( pGC, MAKELONG( GPC_REPLACE_STYLE, GPC_TRANSPARENT_STYLE ) );
				//GetBMPPixel( pGC, 0, 0, hbmp, &trColor );
				//DisplayBMPEx( pGC, x, y, hbmp, GPC_TRANSPARENT_STYLE, trColor );
				DisplayBMP( pGC, lx, ly, hbmp );
				FreeBitmap( hbmp );
			}
		}
	} else {
//		DrawMonoImage( pGC, left10X10, 
//			sbctrl->x +sbctrl->boxw/2 - BMP_WIDTH/2, 
//			sbctrl->y + sbctrl->height/2 - BMP_HEIGHT/2, 
//			BMP_WIDTH, 
//			BMP_HEIGHT, 
//			ColorTheme.form_frontcolor, ColorTheme.form_backcolor);
		{
			U32	hbmp;
			//U32	trColor;
			U16 lx = x + sbctrl->boxw/2 - BMP_WIDTH/2;
			U16 ly = y +  height/2 - BMP_HEIGHT/2;
			U32 palette[2];
			
			palette[0] = ColorTheme.form_client;
			palette[1] = ColorTheme.form_frontcolor;

			hbmp = LoadBitmap( left10X10, palette );
			if( hbmp != 0 )
			{
				SetBMPPalette( hbmp, palette, NULL );
				//SetBkFillMode( pGC, MAKELONG( GPC_REPLACE_STYLE, GPC_TRANSPARENT_STYLE ) );
				//GetBMPPixel( pGC, 0, 0, hbmp, &trColor );
				//DisplayBMPEx( pGC, x, y, hbmp, GPC_TRANSPARENT_STYLE, trColor );
				DisplayBMP( pGC, lx, ly, hbmp );
				FreeBitmap( hbmp );
			}
		}
//		DrawMonoImage( pGC, right10X10, 
//			sbctrl->x +sbctrl->width - sbctrl->boxw/2- BMP_WIDTH/2, 
//			sbctrl->y + sbctrl->height/2 - BMP_HEIGHT/2, 
//			BMP_WIDTH, 
//			BMP_HEIGHT, 
//			ColorTheme.form_frontcolor, ColorTheme.form_backcolor);
		{
			U32	hbmp;
			//U32	trColor;
			U16 lx = x + width - sbctrl->boxw/2- BMP_WIDTH/2;
			U16 ly = y + height/2 - BMP_HEIGHT/2;
			U32 palette[2];
			
			palette[0] = ColorTheme.form_client;
			palette[1] = ColorTheme.form_frontcolor;

			hbmp = LoadBitmap( right10X10, palette );
			if( hbmp != 0 )
			{
				SetBMPPalette( hbmp, palette, NULL );
				//SetBkFillMode( pGC, MAKELONG( GPC_REPLACE_STYLE, GPC_TRANSPARENT_STYLE ) );
				//GetBMPPixel( pGC, 0, 0, hbmp, &trColor );
				//DisplayBMPEx( pGC, x, y, hbmp, GPC_TRANSPARENT_STYLE, trColor );
				DisplayBMP( pGC, lx, ly, hbmp );
				FreeBitmap( hbmp );
			}
		}
	}

	//draw the rectangle of the Scroll Bar's window
	DrawRec( pGC, ColorTheme.form_line, 
				x, 
				y, 
				x+width-1, 
				y+height-1, 
		GPC_SOLID_LINE, GPC_REPLACE_STYLE);
	
	//draw slider bar
	if( sbctrl->slider_map )
	{
		PutRec( pGC, sbctrl->slider_map,
				(sbctrl->style&SBS_HORZ)?sbctrl->curpos:(x+1),
				(sbctrl->style&SBS_HORZ)?(y+1):sbctrl->curpos,
				(sbctrl->style&SBS_HORZ)?sbctrl->thumblen:(sbctrl->boxw),
				(sbctrl->style&SBS_HORZ)?(sbctrl->boxw):sbctrl->thumblen, 
				GPC_REPLACE_STYLE,0);	
	}
	else
	{
		sbctrl->slider_map = (U8 *)GetBlock( sbctrl->boxw, sbctrl->thumblen );
		if( sbctrl->slider_map == NULL )
		{
			asix_sb_memdbgprintf( "scrollbar free mem of itself" );
			return ASIX_NO_MEM;
		}

		DrawRec( pGC, ColorTheme.form_line, 
				(style&SBS_HORZ)?(x+1+sbctrl->boxw):(x+1), 
				(style&SBS_HORZ)?(y+1):(y+sbctrl->boxw+1), 
				(style&SBS_HORZ)?sbctrl->thumbend:(x+sbctrl->boxw), 
				(style&SBS_HORZ)?(y+sbctrl->boxw):sbctrl->thumbend, 
				GPC_SOLID_LINE, GPC_REPLACE_STYLE);	

		ClearRec( pGC,ColorTheme.obj3D,
				(style&SBS_HORZ)?(x+sbctrl->boxw+2):(x+2),
				(style&SBS_HORZ)?(y+2):(y+sbctrl->boxw+2), 
				(style&SBS_HORZ)?(sbctrl->thumblen-2):(sbctrl->boxw-2),
				(style&SBS_HORZ)?(sbctrl->boxw-2):(sbctrl->thumblen-2),
				GPC_REPLACE_STYLE);	
		
		SaveRec( pGC,  sbctrl->slider_map, 
				(style&SBS_HORZ)?(x+1+sbctrl->boxw):(x+1),
				(style&SBS_HORZ)?(y+1):(y+sbctrl->boxw+1), 
				(style&SBS_HORZ)?sbctrl->thumblen:(sbctrl->boxw),
				(style&SBS_HORZ)?(sbctrl->boxw):sbctrl->thumblen, 0);
	}

	return ASIX_OK;	
}

/*
STATUS sb_enable(void *ctrl_str, U8 enable)
		
		enable = 1	:enable
		enable = 0  :disable
*/
STATUS sb_enable(void *ctrl_str, U8 enable)
{
	register struct sb_ctrl *sbctrl;
	sbctrl = (struct sb_ctrl *)ctrl_str;
	
	if(enable>1) return ASIX_ERROR;//enable must be only 0 or 1;
	
	sbctrl->scrollstatus=enable;
	return ASIX_OK;	
}

STATUS 	GetScrollRange(U32 windowid, P_U16 minpos,P_U16 maxpos)
{
	register struct sb_ctrl *sbctrl;	
	sbctrl = ((ASIX_WINDOW *)windowid)->ctrl_str;
	
	*minpos = sbctrl->minpos;
	*maxpos = sbctrl->maxpos;
	
	return ASIX_OK;	
}

/*
U16 	GetScrollPos()
				U32 windowid	:id of scroll bar's window 
				U16 message 	:not used
				U16 wparam 		:not used
				U8 flag			:not used
		
		return  slider bar's current logical position
*/
U16 	GetScrollPos(U32 windowid, U16 message, U16 wparam, U8 flag)
{
	register struct sb_ctrl *sbctrl;	
	sbctrl = ((ASIX_WINDOW *)windowid)->ctrl_str;
	
	return sbctrl->logcurpos;
}

/*
STATUS 	SetScrollPos()
				U32 windowid	:id of scroll bar's window
				U16 wparam		:new logical position to be set
				U32 menu 		:not used
				U16 message		:not used
*/
STATUS 	SetScrollPos(U32 windowid, U16 wparam, U32 menu, U16 message)
{
	//wparam determine the logic position to be set
	register struct sb_ctrl *sbctrl;	
	U16 			newpos;
//	U16				sblen, boxw,startpix;
//	U16				slider_area_len;
	U32				pGC;

	pGC =GetGC();
	
	sbctrl = ((ASIX_WINDOW *)windowid)->ctrl_str;
	
	//pessia2002/3/16:if scrollbar is disabled, just return.
	if(sbctrl->scrollstatus == 0) return ASIX_OK;

	if( wparam < sbctrl->minpos ) return ASIX_ERROR;
	if( wparam > sbctrl->maxpos ) return ASIX_ERROR;
	
	//it is to prevent some unpredictable cause which can disturb change-color operation!!!
	//so, everytime that User use SetScrollPos(),
	//it will clear the slider_area except slider bar.
	if( sbctrl->haveinversed )
	{
		ClearRec( pGC, ColorTheme.form_backcolor,
				(sbctrl->style&SBS_HORZ)?(sbctrl->slider_area_start+1):(sbctrl->x+1),
				(sbctrl->style&SBS_HORZ)?(sbctrl->y+1):(sbctrl->slider_area_start+1),
				(sbctrl->style&SBS_HORZ)?(sbctrl->curpos-sbctrl->slider_area_start-1):sbctrl->boxw,
				(sbctrl->style&SBS_HORZ)?sbctrl->boxw:(sbctrl->curpos-sbctrl->slider_area_start-1),
				GPC_REPLACE_STYLE);
		ClearRec( pGC, ColorTheme.form_backcolor,
				(sbctrl->style&SBS_HORZ)?(sbctrl->thumbend+1):(sbctrl->x+1),
				(sbctrl->style&SBS_HORZ)?(sbctrl->y+1):(sbctrl->thumbend+1),
				(sbctrl->style&SBS_HORZ)?(sbctrl->slider_area_end-sbctrl->thumbend-1):sbctrl->boxw,
				(sbctrl->style&SBS_HORZ)?sbctrl->boxw:(sbctrl->slider_area_end-sbctrl->thumbend-1),
				GPC_REPLACE_STYLE);	
		sbctrl->haveinversed = 0;
	}
			
	newpos = sbctrl->slider_area_start + 1 +
			 (wparam - sbctrl->minpos ) * (sbctrl->slider_area_range - sbctrl->thumblen)
			 /( sbctrl->logrange - 1 );
	
	//check new position
	if( newpos == sbctrl->curpos ) 
		return ASIX_OK;

	if( newpos > sbctrl->curpos && 
		sbctrl->thumbend == sbctrl->slider_area_end - 1) 
		return ASIX_OK;	

	if( newpos < sbctrl->curpos && 
		sbctrl->curpos == sbctrl->slider_area_start + 1) 
		return ASIX_OK;	
	
	if( sbctrl->slider_map )
	{
		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, 
				GPC_REPLACE_STYLE);

		if( newpos + sbctrl->thumblen - 1 < sbctrl->slider_area_end 
			&& newpos > sbctrl->slider_area_start )
			sbctrl->curpos = newpos;
		else if( newpos < sbctrl->slider_area_start + 1 )
			sbctrl->curpos = sbctrl->slider_area_start + 1;
		else
			sbctrl->curpos = sbctrl->slider_area_end - sbctrl->thumblen;
			
		sbctrl->thumbend = sbctrl->curpos + sbctrl->thumblen -1 ;
	
		sbctrl->logcurpos = wparam;
		if( sbctrl->logcurpos == sbctrl->maxpos )
		{
			sbctrl->thumbend = sbctrl->slider_area_end - 1 ;
			sbctrl->curpos = sbctrl->thumbend - sbctrl->thumblen + 1;
		}
		if( sbctrl->logcurpos == sbctrl->minpos )
		{
			sbctrl->curpos = sbctrl->slider_area_start + 1;
			sbctrl->thumbend = sbctrl->curpos + sbctrl->thumblen - 1;
		}

		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);
	}
	else return ASIX_ERROR;	
	
	
	return ASIX_OK;	
}


STATUS	sb_destroy(void *ctrl_str)
{
	struct sb_ctrl *sbctrl;
	P_U32	classcheck;
	U32		pGC;

	
	if (ctrl_str == NULL)
		return	ASIX_ERROR;
	classcheck = (P_U32)ctrl_str;
	/* In Debuging , we do not check*/
	//if (*classcheck != ((U32)WNDCLASS_SCROLL) )
	//	return	ASIX_ERROR;

	pGC =GetGC();
	
	sbctrl = (struct sb_ctrl *)ctrl_str;
	
	if (sbctrl->upright_id!=0) ActiveAreaDisable(sbctrl->upright_id);		
	if (sbctrl->downleft_id!=0) ActiveAreaDisable(sbctrl->downleft_id);	
	if (sbctrl->slider_id!=0) ActiveAreaDisable(sbctrl->slider_id);
	
	if (sbctrl->sb_coveredmap != NULL) {
		PutRec( pGC, sbctrl->sb_coveredmap, sbctrl->x, sbctrl->y,
				sbctrl->width, sbctrl->height, GPC_REPLACE_STYLE, 0); 
		asix_sb_memdbgprintf( "scrollbar free mem of coveredmap" );
		Lfree(sbctrl->sb_coveredmap); 
	} else {
		ClearRec( pGC, ColorTheme.form_backcolor, 
			sbctrl->x, sbctrl->y, sbctrl->width, sbctrl->height, 
			GPC_REPLACE_STYLE );
	}	
	
	if (sbctrl->slider_map != NULL) {
		asix_sb_memdbgprintf( "scrollbar free mem of slidermap" );
		Lfree(sbctrl->slider_map); 
	}
	
	asix_sb_memdbgprintf( "scrollbar free mem of itself" );
	Lfree(sbctrl);
	
	return ASIX_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -