📄 asix_sb.c
字号:
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 + -