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

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


格式化字符串转换
鼠标驱动
西文模式下输出汉字(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

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

posted on 2007-02-15 02:44  张尹  阅读(502)  评论(0编辑  收藏  举报