鼠标光标制作程序

     该程序使用特定算法几次转换将图形转成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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值