📄 bkpic.c
字号:
void PutPoint(int x,int y,unsigned long color)
{
long bytesperline=1024*4;
int bank,curbank;
char far *scr;
unsigned char far *ScreenPtr = (unsigned char far *)0xA0000000;
long addr;
addr=(long)y*bytesperline+x*4;
scr=ScreenPtr+(unsigned)addr;
if((bank=addr>>16)!=curbank)
selectpage(curbank=bank);
*scr++=color;
*scr++=color>>8;
*scr=color>>16;
}
unsigned long getpixel(int x,int y)
{
long bytesperline=1024*4;
int bank;
int curbank;
unsigned char far *scr;
long addr;
unsigned long color;
unsigned char far *ScreenPtr = (unsigned char far *)0xA0000000;
addr=(long)(y*bytesperline+x*4);
scr=ScreenPtr+(unsigned)addr;
if((bank=addr>>16)!=curbank)
selectpage(curbank=bank);
color=*scr++; //R
color+=(unsigned)*scr++<<8; //G
color+=(unsigned long)*scr<<16; //B
return(color);
}
void getline(int x,int y)
{
int i,n;
int x_min=24,x_max=823,y_min=100,y_max=699;
for(i=x_min,n=0;i<=x_max;i++,n++)
{
colorx[n]=getpixel(i,y);
}
for(i=y_min,n=0;i<=y_max;i++,n++)
{
colory[n]=getpixel(x,i);
}
}
void putline(int x,int y,unsigned long color)
{
long oldcolor;
long VRAMStartY=0,VRAMStartX=0;
long bytesperline=1024*4;
int x_min=24,x_max=823,y_min=100,y_max=699;
int curbank,bank;
int i;
char far *scr;
unsigned char far *ScreenPtr = (unsigned char far *)0xA0000000;
long addr[1000];
for(i=x_min;i<=x_max;i++)
{
addr[i]=(long)(y+VRAMStartY)*bytesperline+(i+VRAMStartX)*4;
scr=ScreenPtr+(unsigned)addr[i];
if((bank=addr[i]>>16)!=curbank)
selectpage(curbank=bank);
*scr++=color;
*scr++=color>>8;
*scr=color>>16;
}
for(i=y_min;i<=y_max;i++)
{
addr[i]=(long)(i+VRAMStartY)*bytesperline+(x+VRAMStartX)*4;
scr=ScreenPtr+(unsigned)addr[i];
if((bank=addr[i]>>16)!=curbank)
selectpage(curbank=bank);
*scr++=color;
*scr++=color>>8;
*scr=color>>16;
}
}
void hideline(int x,int y)
{
long VRAMStartY=0,VRAMStartX=0;
long bytesperline=1024*4;
int x_min=24,x_max=823,y_min=100,y_max=699;
int curbank,bank;
int i,n;
char far *scr;
unsigned char far *ScreenPtr = (unsigned char far *)0xA0000000;
long addr[1000];
for(i=x_min,n=0;i<=x_max;i++,n++)
{
addr[i]=(long)(y+VRAMStartY)*bytesperline+(i+VRAMStartX)*4;
scr=ScreenPtr+(unsigned)addr[i];
if((bank=addr[i]>>16)!=curbank)
selectpage(curbank=bank);
*scr++=colorx[n]; /*向显存中写入颜色值*/
*scr++=colorx[n]>>8;
*scr=colorx[n]>>16;
}
for(i=y_min,n=0;i<=y_max;i++,n++)
{
addr[i]=(long)(i+VRAMStartY)*bytesperline+(x+VRAMStartX)*4;
scr=ScreenPtr+(unsigned)addr[i];
if((bank=addr[i]>>16)!=curbank)
selectpage(curbank=bank);
*scr++=colory[n];
*scr++=colory[n]>>8;
*scr=colory[n]>>16;
}
}
//x position, y position, character height, character width, character space, colour, string
void hanzi16(int xp,int yp,int charh,int charw,int charsp,unsigned long clo,char *sl)
{
int x, y, ascii, flag;
char *s=sl, cha1;
FILE *fp;
char buffen[16], *p; //16Byte buffen用来储存一个英文字符
char buffer[32]; //32Byte,buffer用来存储一个汉字
register m,n,i,j,k;
unsigned char qh,wh;
unsigned long offset;
if ((fp=fopen("d:\\svga\\hzk16","rb"))==NULL)/* 打开汉字库,该字库可以在ucdos中找到 */
{printf("Can't open haz16,Please add it");getch();exit(0);}
x=xp; y=yp; //显示位置设置
flag=1; //标志是否是第一个字,若是flag=1
while(*s!=0)
{
cha1=*s;
if(0x80&(int)cha1)
{
qh=*(s)-0xa0; //汉字区位码
wh=*(s+1)-0xa0;
offset=(94*(qh-1)+(wh-1))*32L; //计算该汉字在字库中偏移量 , L表示长整型(偏移量可能比较大)
fseek(fp,offset,SEEK_SET);
fread(buffer,32,1,fp); //取出汉字32字节的点阵字模存入buffer中(一个汉字)
x+=charsp;
if(flag==1)
x-=charsp;
for(i=0;i<16;i++)//i行,将32位字节的点阵按位在屏幕上打印出来(1:打印,0:不打印),显示汉字
for(n=0;n<charh;n++)
for(j=0;j<2;j++)//i行的第j个字节
for(k=0;k<8;k++)//每个字节中的第k位
for(m=0;m<charw;m++)
if (((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
PutPoint(x+8*j*charw+k*charw+m,y+i*charh+n,clo);
else
PutPoint(x+8*j*charw+k*charw+m,y+i*charh+n,0X000000);
s+=2;//因为一个汉字内码占用两个字节,所以s必须加2
flag=0;
}
else
{
ascii=(int)cha1;
p=Asc_Font + (ascii-0x20)*16;
memcpy(buffen,p,16);
x+=(charsp/2);
if(flag==1)
x-=(charsp/2);
for(i=0;i<16;i++)
for(n=0;n<charh;n++)
for(k=0;k<8;k++)//每个字节中的第k位
for(m=0;m<charw;m++)
if (((buffen[i]>>(7-k))&0x1)!=NULL)
PutPoint(x+8*charw+k*charw+m,y+i*charh+n,clo);
else
PutPoint(x+8*charw+k*charw+m,y+i*charh+n,0X000000);
s+=1;
flag=0;
}
}
}
void hanzi24(int x,int y,char *s,unsigned long colour)
{
FILE *fp;
char buffer[24][3];
register i,j,k;
unsigned char qh,wh;
unsigned long location;
if((fp=fopen("d:\\svga\\hzk24","rb"))==NULL)
{printf("can't open hzk24");getch();exit(0);}
while(*s)
{
qh=*s-0xa0;
wh=*(s+1)-0xa0;
location=(94*(qh-1)+(wh-1))*72L;
fseek(fp,location,SEEK_SET);
fread(buffer,72,1,fp);
for(i=0;i<24;i++)
for(j=0;j<24;j++)
if(buffer[j][i/8]&(0x80>>i%8))
PutPoint(x+i,y+j,colour);
s+=2;
x+=24;
}
fclose(fp);
}
void cleararea(int x0, int y0, int width, int height, unsigned long colour)
{
int i,j;
for(j=0;j<height;j++)
for(i=0;i<width;i++)
PutPoint(x0+i,y0+j,colour);
}
void DrawLine (int x0, int y0, int length, int flag, unsigned long color)//flag=0, horizontal line; flag=1, vertical line
{
int i;
if(flag==0)
{
for (i=x0;i<=(x0+length);i++)
PutPoint(i, y0, color);
}
else
{
for (i=y0;i<=(y0+length);i++)
PutPoint(x0, i, color);
}
}
void rectangle (int x0, int y0, int x1, int y1, unsigned long color)
{
DrawLine(x0,y0,x1-x0,0,color);
DrawLine(x0,y1,x1-x0,0,color);
DrawLine(x0,y0,y1-y0,1,color);
DrawLine(x1,y0,y1-y0,1,color);
}
void MountMouse(void)
{
_AX=0x00; //功能00H*/
geninterrupt(0x33);//0x33:鼠标中断类型*/
}
void UnmountMouse(void)
{
_AX=0x02; /*功能02H*/
geninterrupt(0x33); /*0x33:鼠标中断类型*/
return ;
}
int GetMouseSta(void) //判断鼠标按键状态
{
int MouseMSG=0;
_AX=0x03;
geninterrupt(0x33);
MouseX=_CX; //将鼠标水平方向位置存放到MouseX
MouseY=_DX; //将鼠标垂直方向位置存放到MouseY
if((_BX&1) && !(_BX&2)) //鼠标左键被按下同时右键没有按下,左键
MouseMSG=1;
if((_BX&2) && !(_BX&1)) //鼠标右键被按下同时左键没有按下,右键
MouseMSG=2;
if(_BX&1 && _BX&2) //鼠标左键和右键同时被按下
MouseMSG=0;
return MouseMSG;
}
void SetMouseXY(int x, int y)
{
_AX=0x04;
_CX=x;
_DX=y;
geninterrupt(0x33);
return;
}
//设置鼠标水平边界
void SetMouseBound(int mouseMinX, int mouseMaxX, int mouseMinY, int mouseMaxY)
{
_AX=0x07;
_CX=mouseMinX;
_DX=mouseMaxX;
geninterrupt(0x33);
_AX=0x08;
_CX=mouseMinY;
_DX=mouseMaxY;
geninterrupt(0x33);
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -