该程序使用特定算法几次转换将图形转成16位16进制数据存储在磁盘文件上在使用时将其重文件读出放于相应的结构中就可使用中断来改变光标。
我没加多少注释请各位朋友自己找出转换算法,请注意I,J的变化
#include <stdio.h>
#include <graphics.h>
#include <bios.h>
#include <dos.h>
void Init();/*初始函数*/
void Cursor();/*光标移动函数*/
void Save();/*记录函数*/
int New();/*新建文件函数*/
int KeyUp();/*键盘函数*/
typedef struct
{
int shape[32];
char hotx;/*X热点坐标*/
char hoty;/*Y热点坐标*/
}SHAPE;/*鼠标光标结构*/
typedef struct
{
char *m_Two[16];
}TtoS;
char FileName[12]="Noname.csr";
int main()
{
char hotx,hoty;
int x=240,y=150,ox,oy,i=0,j=0,hx=0,hy=0,key,marking=0;
char Ctemp[64][5];
Init(Ctemp);
do
{
ox=x; oy=y;
key=KeyUp();
switch(key)
{
case 77: {
if(x<390)
{
j++; x+=10;
hx++;
if(j>3&&x<390)
{
i++; j=0;
}
}
break;
}
case 75: {
if(x>240)
{
j--; x-=10;
hx--;
if(j<0&&x>240)
{
i--; j=3;
}
}
break;
}
case 72: {
if(y>150)
{
i-=4; y-=10;
hy--;
}
break;
}
case 80: {
if(y<300)
{
i+=4; y+=10;
hy++;
}
break;
}
case 81: {
if(x<390&&y<300)
{
i+=4; j++;
x+=10; y+=10;
hx++; hy++;
}
if(j>3)
{
i++; j=0;
}
break;
}
case 71: {
if(x>240&&y>150)
i-=4; j--;
x-=10; y-=10;
hx--; hy--;
}
if(j<0)
{
i--; j=3;
}
break;
}
case 79: {
if(x>240&&y<300)
{
i+=4; j--;
x-=10; y+=10;
hx--; hy++;
}
if(j<0)
{
i--; j=3;
}
break;
}
case 73: {
if(x<390&&y>150)
{
i-=4; j++;
x+=10; y-=10;
hx++; hy--;
}
if(j>3)
{
i++; j=0;
}
break;
}
case 24: marking=1; break;
case 44: marking=0; break;
case 31: Save(Ctemp,hotx,hoty); break;
case 49: marking=New(Ctemp); break;
case 35: hotx=hx; hoty=hy; break;
};
Cursor(x,y,ox,oy,marking);
gotoxy(3,2);
printf("%d %d %d %d %d",key,j,i,x,y);
if(marking) Ctemp[i][j]='1';
else Ctemp[i][j]='0';
}while(key!=1);
closegraph();
}
void Init(char Ct[64][5])
{
int px=240,py=150,pi,pj;
int graphdrive=0,graphmode=0;
initgraph(&graphdrive,&graphmode,"");
rectangle(40,50,140,150);
rectangle(42,52,138,148);
outtextxy(55,65,"New File");
outtextxy(55,85,"Save File");
outtextxy(55,105,"Hot Point");
outtextxy(55,125,"Esc Quit");
setcolor(14);
outtextxy(55,65,"N");
outtextxy(55,85,"S");
outtextxy(55,105,"H");
outtextxy(55,125,"E");
setcolor(15);
setfillstyle(1,1);
for(pi=0; pi<16; pi++)
{
for(pj=0; pj<16; pj++)
{
bar(px-3,py-3,px+3,py+3);
px+=10;
py+=10;
px=240;
}
for(pi=0; pi<64; pi++)
for(pj=0; pj<5; pj++)
{
if(pj>=4) Ct[pi][pj]=NULL;
else Ct[pi][pj]='0';
}
px=240; py=150;
setcolor(15);
rectangle(px-5,py-5,px+5,py+5);
}
int KeyUp()
{
return bioskey(0)>>8;
}
void Cursor(int cx,int cy,int ocx,int ocy,int cmarking)
{
int color;
if(cmarking) color=15;
else color=1;
setfillstyle(1,color);
bar(cx-3,cy-3,cx+3,cy+3);
setcolor(0);
rectangle(ocx-5,ocy-5,ocx+5,ocy+5);
setcolor(15);
rectangle(cx-5,cy-5,cx+5,cy+5);
}
void Save(char Sct[64][5],int hx,int hy)
{
FILE *fp;
SHAPE Spe;
TtoS ttos={{"0000","0001","0010","0011",
"0100","0101","0110","0111",
"1000","1001","1010","1011",
"1100","1101","1110","1111"}};
int si,sj;
int Temp[64],six[16];
for(si=0; si<64; si++)
for(sj=0; sj<16; sj++)
{
if(!strcmp(ttos.m_Two[sj],Sct[si]))
Temp[si]=sj;
}
sj=0;
for(si=0; si<64; si+=4)
six[sj++]=Temp[si]<<12|Temp[si+1]<<8|Temp[si+2]<<4|Temp[si+3];
for(si=0; si<16; si++)
{
Spe.shape[si]=~six[si];
Spe.shape[si+16]=six[si];
}
Spe.hotx=hx;
Spe.hoty=hy;
fp=fopen(FileName,"wb");
fwrite(&Spe,sizeof(Spe),1,fp);
fclose(fp);
}
int New(char Nct[64][5])
{
int ni,nj,nx=240,ny=150;
outtextxy(200,40,"New File Name");
rectangle(150,35,350,100);
gotoxy(25,5);
scanf("%s",FileName);
setfillstyle(0,1);
bar(150,35,350,100);
setfillstyle(1,1);
for(ni=0; ni<16; ni++)
{
for(nj=0; nj<16; nj++)
{
bar(nx-3,ny-3,nx+3,ny+3);
nx+=10;
}
ny+=10;
nx=240;
}
for(ni=0; ni<64; ni++)
for(nj=0; nj<5; nj++)
{
if(nj>=4) Nct[ni][nj]=NULL;
else Nct[ni][nj]='0';
}
return 0;
}
更多分享请关注:软信网-编程-http://www.iis365.net.cn