一个编程函数集(包含大量C实用函数)

又一个编程函数集(包含大量实用函数)

编程函数集,详细内容如下:


格式化字符串转换
鼠标驱动
西文模式下输出汉字(BGI)
三维窗体
时钟中断服务
取得键盘扫描码
文本模式光标定位
显示的关闭与开启
文本模式的直接写屏技术
TVGA直接写屏图形引擎
/*-------------------------------------------------------------------------*/
/* Head */
/*-------------------------------------------------------------------------*/

#include 
< stdio.h >
#include 
< conio.h >
#include 
< stdarg.h >
#include 
< dos.h >
#include 
< graphics.h >
#include 
< stdio.h >
#include 
< iostream.h >
#include 
< stdlib.h >
#include 
< time.h >
#include 
< bios.h >
#include 
< string .h >
#include 
< math.h >


/*---------------------------格式化字符串转换------------------------------*/

int  vsprint( char   * buffer, char   * fmt, )
{
va_list argptr;
int cnt;
va_start(argptr, fmt);
cnt 
= vsprintf(buffer, fmt, argptr);
va_end(argptr);
return(cnt);
}


/*-------------------------------鼠标驱动----------------------------------*/

int  mouse( int  a, int  b, int  c, int  d)
{
asm mov ax,a
asm mov bx,b
asm mov cx,c
asm mov dx,d
asm 
int 33h
return _AX;
}


#if  defined(MOUSESHAPE)  // 光标形状设定
typedef 
struct
{
unsigned 
int shape[32];
char hotx;
char hoty;
}
SHAPE;

SHAPE pen1
= {{0x0fff,0x07ff,0x03ff,0x01ff,0x80ff,0xc07f,0xe03f,0xf01f,
0xf80f,0xfc07,0xfe03,0xff01,0xff80,0xffc1,0xffe3,0xfff7,
0xf000,0xe800,0xd400,0xaa00,0x5500,0x2a80,0x1540,0x0aa0,
0x0550,0x02a8,0x0154,0x00aa,0x0055,0x002a,0x0014,0x0008}
,0,0 }
;
SHAPE pen2
= {{0xe1ff,0xe1ff,0xe1ff,0xe1ff,0xe000,0xe000,0xe000,0xe000,
0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
0x1e00,0x1200,0x1200,0x1200,0x1200,0x13ff,0x1249,0x1249,
0x1249,0x9001,0x9001,0x9001,0x8001,0x8001,0x8001,0xffff}
,5,0}
;


void  mouseshape(SHAPE sp)
{
_BX
=sp.hotx;
_CX
=sp.hoty;
_ES
=FP_SEG(&sp.shape);
_DX
=FP_OFF(&sp.shape);
_AX
=0x09;
geninterrupt(
0x33);
}

#endif

/*--------------------------西文模式下输出汉字(BGI)------------------------*/

void  initgraphics( int  gdriver, int  gmode, char   * drvpath = "" )
{
initgraph(
&gdriver,&gmode,drvpath);
}


couttextxy(FILE 
* library, int  x, int  y,unsigned  char  far  * string , char  color)
{
register 
int i,j;
unsigned 
long int locate;
int k=0;
char l=0,buffer[32];
if(library==NULL) return 0;
while(string[k]!='\0')
{
locate
=(string[k]-161)*94+string[k+1]-161;
fseek(library,(
long int)locate*32,SEEK_SET);
fread(buffer,
32,sizeof(char),library);
k
+=2;
for(i=0;i<16;i++)
for(j=0;j<2;j++)
{
l
=buffer[i*2+j];
if((l&0x80)!=0) putpixel(x+j*8,y+i,color);
if((l&0x40)!=0) putpixel(x+j*8+1,y+i,color);
if((l&0x20)!=0) putpixel(x+j*8+2,y+i,color);
if((l&0x10)!=0) putpixel(x+j*8+3,y+i,color);
if((l&0x08)!=0) putpixel(x+j*8+4,y+i,color);
if((l&0x04)!=0) putpixel(x+j*8+5,y+i,color);
if((l&0x02)!=0) putpixel(x+j*8+6,y+i,color);
if((l&0x01)!=0) putpixel(x+j*8+7,y+i,color);
}

x
+=16;
}

return 1;
}


/*-------------------------------三维窗体----------------------------------*/

void  window3d( int  x, int  y, int  length, int  width, char   * title)
{
setcolor(
7);
line(x,y,x
+length,y);
line(x,y,x,y
+width);
setcolor(
0);
line(x,y
+width,x+length,y+width);
line(x
+length,y,x+length,y+width);
setcolor(
15);
line(x
+1,y+1,x+length-1,y+1);
line(x
+1,y+1,x+1,y+width-1);
setcolor(
8);
line(x
+1,y+width-1,x+length-1,y+width-1);
line(x
+length-1,y+1,x+length-1,y+width-1);
setfillstyle(
1,7);
bar(x
+2,y+2,x+length-2,y+width-2);
setfillstyle(
1,1);
bar(x
+4,y+4,x+length-4,y+20);
setcolor(
15);
outtextxy(x
+8,y+8,title);
}


void  textwindow3d( int  x, int  y, int  length, int  width, char   * title, int  bargin)
{
window3d(x,y,length,width,title);
setfillstyle(
1,15);
bar(x
+bargin,y+bargin+20,x+length-bargin,y+width-bargin);
setcolor(
0);
line(x
+bargin-1,y+bargin+19,x+length-bargin+1,y+bargin+19);
line(x
+bargin-1,y+bargin+19,x+bargin-1,y+width-bargin+1);
setcolor(
7);
line(x
+length-bargin+1,y+bargin+19,x+1+length-bargin,y+width-bargin+1);
line(x
+bargin-1,y+width-bargin+1,x+1+length-bargin,y+width-bargin+1);
setcolor(
8);
line(x
+bargin-2,y+bargin+18,x+2+length-bargin,y+18+bargin);
line(x
+bargin-2,y+18+bargin,x+bargin-2,y+2+width-bargin);
setcolor(
15);
line(x
+2+length-bargin,y+18+bargin,x+2+length-bargin,y+2+width-bargin);
line(x
+bargin-2,y+2+width-bargin,x+2+length-bargin,y+2+width-bargin);
}


/*-----------------------------时钟中断服务--------------------------------*/

#if  defined(INTERRUPT)
void  interrupt ( * old)();
// void interrupt hand(){(*old)();}

void  uninstall()
{
disable();
setvect(
0x1c,(*old));
enable();
}


void  install()
{
disable();
old
=getvect(0x1c);
setvect(
0x1c,hand);
enable();
}

#endif

/*-----------------------------取得键盘扫描码------------------------------*/

int  keydown()
{
int key;
if(bioskey(1)==0return -1;
else 
key
=bioskey(0);
key
=key&0xff?key&0xff:key>>8;
return key;
}


/*----------------------------文本模式光标定位-----------------------------*/

void  goto_xy( char  x, char  y)
{
asm mov ah,
2
asm mov dl,x
asm mov dh,y
asm mov bh,
0
asm 
int 10h
}


/*----------------------------显示的关闭与开启-----------------------------*/

#define  CLOSE 0x1201
#define  OPEN 0x1200
void  video( int  mode)
{
asm mov bl,36h
asm mov ax,mode
asm 
int 10h
}


/*---------------------------文本模式的直接写屏技术------------------------*/

int  video_mode( void )
{
union REGS r;
r.h.ah
=15;
return int86(0x10,&r,&r)&255;
}


char  far  * set_v_ptr()
{
int vmode;
char far *vid_mem;
vmode
=video_mode();
if((vmode!=2)&&(vmode!=3)&&(vmode!=7))
{
printf(
"Video must be in 80 column text mode!");
exit(
1);
}

if(vmode==7) vid_mem=(char far *)0xb0000000;
else vid_mem=(char far *)0xb8000000;
return vid_mem;
}


void  write_char( char  far  * vid_mem, int  x, int  y, char  ch, int  attrib)
{
char far *v;
v
=vid_mem;
v
+=(y*160)+x*2;
*v++=ch;
*v=attrib;
}


void  write_string( char  far  * vid_mem, int  x, int  y, char   * string , int  color)
{
int i;
for(i=0;i<strlen(string);i++)
write_char(vid_mem,x
+i,y,*(string+i),color);
}


int  read_color( char  far  * vid_mem, int  x, int  y)
{
char far *v;
v
=vid_mem;
v
+=(y*160)+x*2;
return *(++v);
}


char  read_char( char  far  * vid_mem, int  x, int  y)
{
char far *v;
v
=vid_mem;
v
+=(y*160)+x*2;
return *v;
}


/*-------------------------TVGA直接写屏图形引擎--------------------------*/

void  _setgraphmode( int  mode, int   * xmax, int   * ymax)
{
union REGS regs;
unsigned 
char video;
switch(mode)
{
case 0: video=0x5c;
*xmax=640;
*ymax=400;break//640x400
case 1: video=0x5d;
*xmax=640;
*ymax=480;break//640x480
case 2: video=0x5e;
*xmax=800;
*ymax=600;break//800x600
case 3: video=0x62;
*xmax=1024;
*ymax=768;break//1024x768
default:video=0x5d;
*xmax=640;
*ymax=480;break//Default: 640x480
}

regs.h.ah
=0;
regs.h.al
=video;
int86(
0x10,®s,®s);
outportb(
0x3c4,0x0b);
inportb(
0x3c5);
return;
}


void  _putpixel( int  x, int  y, int  color, int  xmax)
{
unsigned 
long int result=y;
char far *offset;
char temp;
result
*=xmax;
result
+=x;
offset
=(char far *)MK_FP(0xa000,(unsigned)result&0xffff);
outportb(
0x3c4,0x0e);
temp
=((result>>16)&0x0f)^0x02;
outportb(
0x3c5,temp);
temp
=*offset;
*offset=(char)color;
return;
}


int  _getpixel( int  x, int  y, int  xamx)
{
unsigned 
long int result=y;
char far *offset;
char temp;
result
*=xmax;
result
+=x;
offset
=(char far *)MK_FP(0xa000,(unsigned)result&0xffff);
outportb(
0x3c4,0x0e);
temp
=((result>>16)&0x0f)^0x02;
outportb(
0x3c5,temp);
temp
=*offset;
return (int)temp;
}


void  _closegraph()
{
union REGS regs;
regs.h.ah
=0x00;
regs.h.al
=0x03;
int86(
0x10,®s,®s);
return;
}


void  _outtextxy( int  x, int  y, char  far  * string , int  color, int  xmax)
{
register 
int i,j;
char huge *ptr;
int k=0;
while(string[k]!='\0')
{
ptr
=(char huge *)MK_FP(0xf000,0xfa6e+(string[k]<<3));
for(i=0;i<8;i++)
for(j=0;j<8;j++)
if((ptr[i]&(0x80>>j))!=0)
_putpixel(x
+(k<<3)+j,y+i,color,xmax);
k
++;
}

return;
}


int  _couttextxy(FILE  * library, int  x, int  y,unsigned  char  far  * string , char  color, int  xmax)
{
register 
int i,j;
unsigned 
long int locate;
int k=0;
char l=0,buffer[32];
if(library==NULL) return 0;
while(string[k]!='\0')
{
locate
=(string[k]-161)*94+string[k+1]-161;
fseek(library,(
long int)locate*32,SEEK_SET);
fread(buffer,
32,sizeof(char),library);
k
+=2;
for(i=0;i<16;i++)
for(j=0;j<2;j++)
{
l
=buffer[i*2+j];
if((l&0x80)!=0) _putpixel(x+j*8,y+i,color,xmax);
if((l&0x40)!=0) _putpixel(x+j*8+1,y+i,color,xmax);
if((l&0x20)!=0) _putpixel(x+j*8+2,y+i,color,xmax);
if((l&0x10)!=0) _putpixel(x+j*8+3,y+i,color,xmax);
if((l&0x08)!=0) _putpixel(x+j*8+4,y+i,color,xmax);
if((l&0x04)!=0) _putpixel(x+j*8+5,y+i,color,xmax);
if((l&0x02)!=0) _putpixel(x+j*8+6,y+i,color,xmax);
if((l&0x01)!=0) _putpixel(x+j*8+7,y+i,color,xmax);
}

x
+=16;
}

return 1;
}


#if  defined(TVGAMOUSE)
char  image[ 55 ];
char  cursorshape[ 55 ] = {14,14,14,14,0,14,
14,0,0,14,14,0,
0,0,14,14,0,0,
0,0,14,14,0,0,
0,0,0,14,14,0,
0,0,0,0,0,14,14,
0,0,0,0,0,0,0,14,
14,14,14,14,14,14,
14,14,14,14}
;

void  _putimage( int  x, int  y)
{
int i,j,k=0;
for(j=y;j<y+10;j++)
for(i=x;i-x<j-y+1;i++)
{
_putpixel(i,j,image[k
++]);
}

return;
}


void  cursor( int  x, int  y)
{
static int cf=0,oldx=-1,oldy=-1;
if(!cf) cf=1;
else if(x!=oldx||y!=oldy) _putimage(oldx,oldy);
if(x!=oldx||y!=oldy) draw(x,y);
oldx
=x;oldy=y;
return;
}

#endif

/*-------------------------------------------------------------------------*/

你可能感兴趣的:(编程)