您当前位置为:鲲鹏学习主页>>文档中心>>C/C++文章>>详细文章 提示:双击鼠标滚屏
C语言编程技巧汇萃

------------------------
C语言编程技巧汇萃(一)

注意:该函数集省略了不少TC标准头文件,读者使用时要自行添加。而且由于该函数集内部函数间有的有调用关系,读者拆卸时要谨慎。

/*编程技巧荟萃*/
读键盘扫描码
获取机器日期
将浮点数转化为字符串
清除屏幕
显示时间
打印一个矩形
砍掉字符串中所有空格
取子字符串
从文件中读取字符
字符串左靠齐
取左字符串
向文件写数据
取右字符串
打开或关闭光标
喇叭发声
/*从键盘中读取字符 功能:按下普通键时,返回其ASCII码 扫描码CODE=0*/
int INKEY(int *code)
{
int m;
while(!bioskey(1))/*可加入无按键时代码*/;
*code=bioskey(0);
m=*code*255;
if(!m) m=*code>>8;
*code=*code&255;
return m;
}

/*获取机器日期*/
int DATE(char *s,char type)
{
char dat[30];
int num;
struct tm *tblock;
time_t t;
t=time(NULL);
tblock=localtime(&t);
strcpy(dt,asctime(tblock));
strcpy(s,"");
switch(type)
{
case 'N':
num=(*tblock).tm_year+1900;
itoa(num,s,10);
break;
case 'Y':
num=(*tblock).tm_mon+1;
itoa(num,s,10);
break;
case 'R':
num=(*tblock).tm_mday;
itoa(num,s,10);
break;
case 'S':
strcpy(dt,asctime(tblock));
MID(s,dt,12,8);
break;
}
}
return num;
}

/*将浮点数转化为字符串*/
/* 参数说明 data:需转换的浮点数;s:输出字符串;len:转换后的长度*/
void f_to_s(double data,char *s,int len)
{
int dec,sign,i;
char *s1,s2[100],s3[100];
s1=0;
s2[0]=0;
s3[0]=0;
s1=fcvt(data,len,&dec,&sign);
if (!sign&&data>=1)
{
MID(s2,s1,dec+1,-1);
MID(s3,s1,1,dec);
strcpy(s,"+");
strcat(s,s3);
strcat(s,".");
strcat(s,s2);
}
if (sign&&fabs(data)>=1)
{
MID(s2,s1,dec+1,-1);
strcpy(s,"-");
MID(s3,s1,1,dec);
strcat(s,s3);
strcat(s,".");
strcat(s,s2);
}
if (!sign&&dec==0)
{
strcpy(s,"+0.");
strcat(s,s1);
}
if (sign&&dec==0)
{
strcpy(s,"-0.");
strcat(s,s1);
}
if (!sign&&dec<0)
{
strcpy(s,"+0.");
for(i=1;i<=fabs(dec);i++)
strcat(s,"0");
strcat(s,s1);
}
if (sign&&dec<0)
{
strcpy(s,"-0.");
for(i=1;i<=fabs(dec);i++)
strcat(s,"0");
strcat(s,s1);
}
if (strlen(s)>len) s[len]=0;
}

/*清除屏幕*/
void CLSXY(int color,int x,int y,int xl,int yl)
{
int x1,y1;
union REGS r;
if(x<1||y<1) return;
y--;
x--;
y1=y+yl-1;
x1=x+xl-1;
if (y1>25||x1>80)
return;
r.h.ah=6; /*子功能号*/
r.h.al=0; /*滚动行数*/
r.h.ch=y;
r.h.cl=x;
r.h.dh=y1;
r.h.dl=x1;
r.h.bh=color*16;
int86(16,&r,&r);
}


/*显示时间*/
void display_time(int color,int back_color,int y,int x)
{
static char oldtime[9]="";
char newtime[9];
if(y<1||x<1) return;
settextstyle(1,0,1);
DATA(newtime,'S');
back_color=7;
if(strcmp(newtime,oldtime))
{
setfillstyle(1,back_color);
setcolor(color);
bar(535,458,635,475);
outtextxy(x,y,newtime);
strcpy(oldtime,newtime);
}
}


/*打印一个矩形*/
void PRINT_KJ(int x,int y,int wide,int high)
{
int i;
for(i=x;i<x+wide;i+=2)
{
gotoxy(i,y);
cprintf("");
}
gotoxy(x,y+high);
cprintf("");
gotoxy(x+wide,y+high);
cprintf("");
gotoxy(x,y);
cprintf("");
gotoxy(x+wide,y);
cprintf("");
for(i=x+2;i<x+wide;i+=2)
{
gotoxy(i,y+high);
cprintf("");
}
for(i=y+1;i<y+high;i++)
{
gotoxy(x,i);
cprintf("");
}
for(i=y+1;i<y+high;i++)
{
gotoxy(x+wide,i);
cprintf("");
}
}

/*砍掉字符串中所有空格*/
void CUT_ALL_SPC(char *s)
{
int i,n;
char d[10000];
n=0;
for(i=0;i<strlen(s);i++)
if(s[i]!=32)
{
d[n]=s[i];
n++;
}
d[n]=0;
strcpy(s,d);
}


/*取子字符串*/
void MID(char *s,char *t,int n,int m)
{
int i,j,p;
if(n<1) n=1;
i=strlen(s);
if(i<n) m=0;
if(m<0) m=i;
else m=n+m-1;
if(m>i) m=i;
p=m-n+1;
if(p<0) p=0;
for(i=n-1,j=0;i<m;i++,j++)
t[j]=s[i];
t[p]=0;
}


/*从文件中读取字符*/
int READ_STR(char *s,FILE *fp)
{
int i=0;
if(!fp) return 0;
if(fgets(s,10000,fp)) i=1;
s[strlen(s)-1]=0;
return i;
}

/*字符串左靠齐*/
void MOVE_LEFT(char *d,char *s,int n)
{
int i,l;
l=strlen(s);
if(n>l) n=l;
for(i=0;i<l;i++)
*d++=*s++;
*d=0;
}

/*取左字符串*/
void LEFT(char *d,char *s,int n)
{
int i,l;
i=0;
l=strlen(s);
if(n>l) n=l;
for(i=0;i<n;i++)
d[i]=s[i];
d[n]=0;
}


/*向文件写数据*/
void WRITE_STR(char *s,FILE *fp)
{
char c=10;
if(!fp) return;
fputs(s,fp);
fputc(c,fp);
}

/*取右字符串*/
void RIGHT(char *dest,char *source,int num)
{
int i,j;
if (num<1) num=0;
num=strlen(source)-num;
if (num<0) num=0;
for(i=0,j=num;j<=strlen(source);i++,j++) dest[i]=source[j];
}


/*打开或关闭光标*/
void CURSOR(int on2off)
{
union REGS r;
if (on2off!=OFF) on2off=10;
r.h.ah=1;
r.h.ch=3;
r.h.cl=on2off;
int86(16,&r,&r);
}

/*喇叭发声*/
void SOUND(int frequency,int time)
{
int i;
i=time*50;
if (i>30000) i=30000;
if (i<50) i=50;
sound(frequency);
MYDELAY(i);
nosound();
}
---------------------------------

---------------------------------
C语言编程技巧汇萃(二)

注意:该函数集省略了不少TC标准头文件,读者使用时要自行添加。而且由于该函数集内部函数间有的有调用关系,读者拆卸时要谨慎。

时间延迟
正点报时
写整数于文件中
从文件中读取整数
报警
字符串右靠齐
字符串居中
删除子字符串
查找指定字符串
产生空格
产生字符串
砍掉字符串左边空格
砍掉字符串右边空格
显示一个字符串
定义屏幕颜色
/*时间延迟*/
void MYDELAY(long t)
{
time_t OldTime;
long t0;
t0=t/55;
if (t0<1) t0=1;
OldTime=clock();
while(clock()-OldTime<t0);
}


/*正点报时*/
void REPORT_CLOCK(void)
{
int i;
for(i=0;i<5;i++);
{
SOUND(500,10);
MYDELAY(1000);
}
SOUND(800,10);
}


/*写整数于文件中*/
void WRITE_INT(int num,FILE *p)
{
char s[20],a=10;
if (!p) return;
itoa(num,s,10);
fputs(s,p);
fputc(a,p);
}


/*从文件中读取整数*/
int READ_INT(int *num,FILE *p)
{
int i;
char s[30]="";
if (!p) return 0;
if (fgets(s,10000,p))
{
i=-1;
s[strlen(s)-1]=0;
*num=atoi(s);
}
else i=0;
return i;
}


/*报警 */
void WARN(void)
{
SOUND(300,1);
SOUND(100,1);
}


/*字符串右靠齐*/
void MOVE_RIGHT(char *s,int wide)
{
int i,l,n;
l=strlen(s);
n=wide-l;
if (n>0)
{
for(i=l;i>-1;i--) s[i+n]=s[i];
for(i=0;i<n;i++) s[i]=32;
}
}


/*字符串居中*/
void MOVE_MIDDLE(char *s,int wide)
{
int i,l,n;
l=strlen(s);
if (wide>l)
{
wide=wide-1;
n=wide/2;
wide=wide-n;
for(i=l;i>-1;i--) s[i+n]=s[i];
for(i=0;i<n;i++) s[i]=32;
for(i=0;i<wide;i++) s[l+n+i]=32;
s[l+n+i]=0;
}
}

/*删除子字符串*/
void Delete_SubString(char *source,int start,int num)
{
int i,l;
l=strlen(source);
if (num>l-start+1||num==-1) num=l-start+1;
if (start<1||start>1) return;
for(i=start;i<l-num+2;i++)
source[i-1]=source[i+num-1];
}

/*查找指定字符串*/
int INSTR(int n,char *source,char *dest)
{
int i,j,k1,k2,p;
int start=0;
if (n==0) n=1;
k1=strlen(source);
k2=strlen(dest);
if (n<0)
{
char s[100];
n=-n;
MID(s,source,n,k2);
if (strcmp(s,dest)) return 0;
return n;
}
if (k1-n+1<k2) return start;
for(i=n-1;i<k1;i++)
{
p=0;
for(j=0;j<k2;j++)
if (source[i+j]!=dest[j]) break;
else p++;
if (p==k2)
{
start=i+1;
break;
}
}
return start;
}


/*产生空格*/
void SPACE(char *s,int n)
{
int i;
if (n<0) n=0;
for(i=0;i<n;i++) *s++=32;
*s=0;
}


/*产生字符串*/
void STRING(int n,char *s1,char *s2)
{
int i;
if (n<0) n=0;
s1[0]=0;
for(i=1;i<=n;i++) strcat(s1,s2);
}


/*砍掉字符串左边空格*/
void CUT_LEFT_SPACE(char *s)
{
int i,j,k=0;
i=strlen(s)+1;
for(j=0;j<i;j++) if (s[j]!=' ') break;
for(k=0;j<i;k++,j++) s[k]=s[j];
}


/*砍掉字符串右边空格*/
void CUT_RIGHT_SPACE(char *s)
{
int i,j;
i=strlen(s)-1;
for(j=i;j>-1;j--) if (s[j]!=' ') break;
s[j+1]=0;
}

/*显示一个字符串*/
void DISPLAY(char *s)
{
union REGS regs;
int color,x,y;
x=wherex();
y=wherey();
color=16*bjys+qjys;
while(*s)
{
if(x>80) break;
regs.h.ah=9;
regs.h.al=*s;
regs.h.bh=0;
regs.h.bl=color;
regs.x.cx=1; /*显示的次数,不改变光标位置*/
int86(16,&regs,&regs);
x++;
if(x>80)
{
x=1;
y++;
if(y>25) y=25;
}
gotoxy(x,y);
s++;
}
}

/*定义屏幕颜色*/
void COLOR(int ForeColor,int BackColor)
{
if(ForeColor<0||ForeColor>15) return;
if(BackColor<0||BackColor>15) return;
qjys=ForeColor;
bjys=BackColor;
}
---------------------------------


---------------------------------
C语言编程技巧汇萃(三)

注意:该函数集省略了不少TC标准头文件,读者使用时要自行添加。而且由于该函数集内部函数间有的有调用关系,读者拆卸时要谨慎。

显示提示窗口显示警告窗口
得到文件长度
窗口滚屏
扫描键盘
插入字符串
检测磁盘是否准备就绪
检测磁盘是否写保护
修改文件的某一行
成批拷贝文件
拷贝一个文件
建立目录
得到目录
得到文件名
任意两个正整数相加(<80位)
任意两个正整数相乘

/*显示提示窗口*/
void quit_YesNo(char *s1,char *s2)
{
char buffer[2000],jx;
gettext(30,8,76,16,buffer);
textbackground(3);
CLSXY(8,32,9,30,6);
CLSXY(4,30,8,30,6);
COLOR(15,4);
gotoxy(35,10);
DISPLAY(s1);
gotoxy(35,12);
DISPLAY(s2);
gotoxy(35+strlen(s2)+1,12);
jx=getch();
puttext(30,8,76,16,buffer);
if (jx=='n'||jx=='N') return;
textbackground(0);
textcolor(15);
clrscr();
CURSOR(ON);
exit(0);
}

/*显示警告窗口*/
void warn_message(char *s1,char *s2)
{
char buffer[2000];
gettext(30,8,76,16,buffer);
CLSXY(8,32,9,30,6);
CLSXY(4,30,8,30,6);
COLOR(15,4);
gotoxy(35,10);
DISPLAY(s1);
gotoxy(35,12);
DISPLAY(s2);
gotoxy(40,13);
DISPLAY("按任意键继续...");
getch();
puttext(30,8,76,16,buffer);
}

/*得到文件长度*/
long GetFileLength(char *file)
{
FILE *fp;
int i;
if ((fp=fopen(file,"rb"))==NULL)
{
clrscr();
printf("Can't open the file %s .",file);
return 0;
}
i=0;
while(!feof(fp))
{
i++;
fgetc(fp);
}
fclose(fp);
return (i-1);
}

/*窗口滚屏*/
void WINDOW_ROLL(int y1,int x1,int yl,int xl,int direct)
{
union REGS regs;
int x2,y2;
x1--;
y1--;
x2=x1+xl-1;
y2=y1+yl-1;
regs.h.ah=5+direct; /*ah=06h 向上滚动当前页*/
/*ah=07h 向下。。。 */
regs.h.al=1;
regs.h.bh=16*pmbj+pmqj;
regs.h.ch=y1; /*左上角行*/
regs.h.cl=x1; /*列*/
regs.h.dh=y2; /*右下角行*/
regs.h.dl=x2; /*列*/
int86(16,&regs,&regs);
}

/*扫描键盘*/
int scan_keyboard(int *m)
{
union inkey
{
unsigned char ch[2];
int ii;
}cc;
while(!bioskey(1))
{;}
cc.ii=bioskey(0);
*m=cc.ch[1];
return cc.ch[0];
}

/*插入字符串*/
void INSERT_STRING(char *ds,char *ss,int n)
{
char s[100];
MID(ds,s,n,-1);
ds[n-1]=0;
strcat(ds,ss);
strcat(ds,s);
}
void STR_ADD_CHAR(char *s,char ch)
{
char s1[2];
s1[0]=ch;
s1[1]=0;
strcat(s,s1);
}

/*检测磁盘是否准备就绪*/
int CheckDiskReading(int n)
{
int result;
char buffer[512];
result=biosdisk(4,n,0,0,0,1,buffer);
result=result&0x02;
if (result!=0x02) return 0;
return 1;
}

/*检测磁盘是否写保护*/
int CheckDiskWriteProf(void)
{
int result;
char buffer[512];
result=biosdisk(5,0,0,0,0,1,buffer);
if (result==0x03) return 0;
return 1;
}

/*修改文件的某一行*/
int ModifyFileLine(char *filename,char *s,int n)
{
char data[20][80];
int i;
FILE *fp;
if ((fp=fopen(filename,"r"))==NULL) return 0;
i=0;
while(READ_STR(data[i],fp))
i++;
fclose(fp);
fp=fopen(filename,"w");
strcpy(data[n-1],s);
n=i-1;
for(i=0;i<=n;i++)
WRITE_STR(data[i],fp);
fclose(fp);
return 1;
}

/*成批拷贝文件*/
int CopyFile(char *sfile,char *dfile,int f2d,int barlong,int height,int x,int y)
{
int Copyfile(char *sf,char *df);
int MakeNdir(char *Dir);
char filename[200][13],d[40],s[40],s1[40];
struct ffblk ffblk;
int done,i,j,l,len;
i=0;
done=findfirst(sfile,&ffblk,0);
if (!done) strcpy(filename[i],ffblk.ff_name);
while(!done)
{
done=findnext(&ffblk);
if (!done)
{
i++;
strcpy(filename[i],ffblk.ff_name);
}
}
if (f2d)
{
Copyfile(sfile,dfile);
return 1;
}
strcpy(s,sfile);
l=strlen(sfile);
for(j=l-1;j>=0;j--)
if (s[j]=='\\')
{
s[j+1]=0;
break;
}

/*拷贝一个文件*/
int Copyfile(char *sf,char *df)
{
FILE *in,*out;
char ch;
in=0;
out=0;
if ((in=fopen(sf,"rb"))==NULL)
exit(0);
if ((out=fopen(df,"wb"))==NULL)
exit(0);
while(!feof(in))
{
ch=fgetc(in);
if (ferror(in)) return 0;
fputc(ch,out);
if (ferror(out)) return 0;
}
fclose(in);
fclose(out);
return 1;
}

/*建立目录*/
int MakeNdir(char *Dir)
{
int i,l,j;
char s[10][40];
j=0;
l=strlen(Dir);
for(i=0;i<l;i++)
if (Dir[i]=='\\')
{
LEFT(s[j],Dir,i);
j++;
}
strcpy(s[j],Dir);
for(i=0;i<=j;i++)
if (access(s[i],0)) mkdir(s[i]);
return 1;
}

/*得到目录*/
int GetDir(char *dirF,char dataK[][14])
{
struct ffblk ffblk;
int done;
int i;
i=0;
done=findfirst(dirF,&ffblk,FA_DIREC);
while(!done)
{
if (ffblk.ff_attrib==16||ffblk.ff_attrib==17)
{
strcpy(dataK[i],ffblk.ff_name);
strcat(dataK[i],"\\");
i++;
}
done=findnext(&ffblk);
}
return i;
}

/*得到文件名*/
int GetFile(char *dirF,char dataK[][14])
{
struct ffblk ffblk;
int done;
int i;
i=0;
done=findfirst(dirF,&ffblk,0);
while(!done)
{
strcpy(dataK[i],ffblk.ff_name);
done=findnext(&ffblk);
i++;
}
return i;
}

/*任意两个正整数相加(<80位)*/
/*参数说明:numA,numB分别为加数和被加数,result存放相加后的结果*/
void add(char *numA,char *numB,char *result)
{
int i,j,a,b,c,jw,Alen,Blen; /*定义变量*/
char num[81];
char numC[81]; /*定义新的字串,长度与numA相同*/
char ch;
char s[1];
num[0]=0;
numC[0]=0;
if (strlen(numA)>=80) return;
if (strlen(numB)>=80) return;
for(i=0;i<strlen(numA);i++) /*判断输入数是否非法*/
if (!isdigit(numA[i])) return; /*如果非法返回结果为空*/
for(i=0;i<strlen(numB);i++)
if (!isdigit(numB[i])) return;
if (strlen(numA)<strlen(numB)) /*将较大的数放入numA中*/
{
strcpy(num,numA);
strcpy(numA,numB);
strcpy(numB,num);
num[0]=0;
}
Alen=strlen(numA);
Blen=strlen(numB);
strcpy(numC,numB);
for(i=0;i<Alen;i++)
numC[Alen-i-1]=numC[Blen-i-1];
for(i=0;i<Alen-Blen;i++) /*在numC中插入n个0,使其长度等于numA*/
numC[i]='0';
jw=0; /*进位*/
for(i=0;i<Alen;i++)
{
s[0]=numA[Alen-i-1];
s[1]=0;
a=atoi(s);
s[0]=numC[Alen-i-1];
s[1]=0;
b=atoi(s);
c=a+b+jw;
if (c>=10)
{
jw=1;
c=c-10;
}
else jw=0;
itoa(c,s,10);
num[i]=s[0];
}
if (jw==1) {num[i]='1';num[i+1]=0;}
else num[i]=0;
j=strlen(num);
for(i=0;i<j/2;i++)
{
ch=num[i];
num[i]=num[j-i-1]; /*将num反转*/
num[j-i-1]=ch;
}
strcpy(result,num);
return; /*返回相加结果*/
}

/*任意两个正整数相乘*/
/*参数说明:numA,numB 分别为乘数和被乘数,resultm存放积*/
void mult(char *numA,char *numB,char *resultm)
{
int i,j,k,l,m,a,b,c,jw,Alen,Blen,f; /*定义变量*/
char resulta[82];
char num[161];
char ch;
char s[1];
num[0]=0;
f=0;
if (strlen(numA)>=80) return;
if (strlen(numB)>=80) return;
for(i=0;i<strlen(numA);i++) /*判断输入数是否非法*/
if (!isdigit(numA[i])) return; /*如果非法返回结果为空*/
for(i=0;i<strlen(numB);i++)
if (!isdigit(numB[i])) return;
if (strlen(numA)<strlen(numB)) /*将较大的数放入numA中*/
{
strcpy(num,numA);
strcpy(numA,numB);
strcpy(numB,num);
num[0]=0;
}
Alen=strlen(numA);
Blen=strlen(numB);
strcpy(resultm,"0");
for(i=0;i<Blen;i++)
{
s[0]=numB[Blen-i-1];
s[1]=0;
c=atoi(s);
strcpy(resulta,numA);
if (c==0) strcpy(resulta,"0");
for(j=0;j<c-1;j++) {add(resulta,numA,resulta);}
l=strlen(resulta);
for(k=0;k<i;k++)
{
resulta[l+k]='0';
resulta[l+k+1]=0;
}
add(resultm,resulta,resultm);
}
}
------------------------------


C语言编程技巧汇萃(四)

注意:该函数集省略了不少TC标准头文件,读者使用时要自行添加。而且由于该函数集内部函数间有的有调用关系,读者拆卸时要谨慎。

格式化字符串转换
鼠标驱动
西文模式下输出汉字(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)==0) return -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,&regs,&regs);
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,&regs,&regs);
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

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

关闭本窗口 | 上一篇:有关Turbo C 2.0集成开发环境的使用 | 下一篇:解析C语言中的sizeof | TOP↑
如本文牵涉到版权问题,请联系站长.谢谢!