⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demo6.c

📁 用TC做的一个
💻 C
📖 第 1 页 / 共 2 页
字号:
  head=(_headline *)malloc(size);
  work_win=head;
  p=head;
  for(i=0;i<=21;i++)
  {p->next=(_headline *)malloc(size);
   q=p;
   p=p->next;
  }
  q->next=NULL;
  p=head;
  p->win=pic_win;p->win_name=PIC_WIN;p=p->next;
  p->win=color0_win;p->win_name=COLOR0_WIN;p=p->next;
  p->win=color1_win;p->win_name=COLOR1_WIN;p=p->next;
  p->win=color2_win;p->win_name=COLOR2_WIN;p=p->next;
  p->win=color3_win;p->win_name=COLOR3_WIN;p=p->next;
  p->win=color4_win;p->win_name=COLOR4_WIN;p=p->next;
  p->win=color5_win;p->win_name=COLOR5_WIN;p=p->next;
  p->win=color6_win;p->win_name=COLOR6_WIN;p=p->next;
  p->win=color7_win;p->win_name=COLOR7_WIN;p=p->next;
  p->win=color8_win;p->win_name=COLOR8_WIN;p=p->next;
  p->win=color9_win;p->win_name=COLOR9_WIN;p=p->next;
  p->win=color10_win;p->win_name=COLOR10_WIN;p=p->next;
  p->win=color11_win;p->win_name=COLOR11_WIN;p=p->next;
  p->win=color12_win;p->win_name=COLOR12_WIN;p=p->next;
  p->win=color13_win;p->win_name=COLOR13_WIN;p=p->next;
  p->win=color14_win;p->win_name=COLOR14_WIN;p=p->next;
  p->win=color15_win;p->win_name=COLOR15_WIN;p=p->next;
  p->win=pen_win;p->win_name=PEN_WIN;p=p->next;
  p->win=line_win;p->win_name=LINE_WIN;p=p->next;
  p->win=rectangle_win;p->win_name=RECTANGLE_WIN;p=p->next;
  p->win=ellipse_win;p->win_name=ELLIPSE_WIN;p=p->next;
  p->win=lineto_win;p->win_name=LINETO_WIN;p=p->next;
}


/* 把数转化为字符的函数(用于显示鼠标的当前坐标,在屏幕右下方) */
char *getstr(long x)  
{char k,*a="0000000000";
      int i,j=10;
      if(x==0)
return("0");
      for(i=0;x>=1;i++)
      {a[i]='0'+ (x % 10);
       x=x/10;
       }
       i--;
      for(j=0;j<=i/2;j++)
      {k=a[j];
       a[j]=a[i-j];
       a[i-j]=k;
       }
       a[i+1]='\0';
     return(a);
}

/* 在一个小窗口中显示鼠标坐标 */
void outpoint()
{   
if(Pre_x!=Cp_x||Pre_y!=Cp_y)
  {setfillstyle(SOLID_FILL,LIGHTGRAY);
    bar(585,462,628,468);
  setcolor(BLACK);
  outtextxy(585,460,getstr(Cp_x));
  outtextxy(610,460,getstr(Cp_y));
}
}

/* 检测鼠标在哪个工作窗口内,并返回窗口代码 */
int where()
{_headline *p;
p=work_win;
for(;p!=NULL;p=p->next)
  {if(Cp_x>((p->win).lt).x&&Cp_x<((p->win).rb).x
    &&Cp_y>((p->win).lt).y&&Cp_y<((p->win).rb).y)
    return p->win_name;
  }
  return 0;
}

/* 改变窗口的凹凸(凸变凹或者凹变凸) */
void anti_win(_win *p)
{setcolor(WHITE*(p->condition));
line((p->lt).x,(p->lt).y,(p->rb).x,(p->lt).y);
line((p->lt).x,(p->lt).y,(p->lt).x,(p->rb).y);
setcolor(WHITE*!(p->condition));
line((p->rb).x,(p->rb).y,(p->rb).x,(p->lt).y);
line((p->rb).x,(p->rb).y,(p->lt).x,(p->rb).y);
setcolor(Thecolor);
}


/* 处理画笔模式改变的函数 */
void pre_draw_win(int k)
{switch(k)
  {case PEN_WIN:
    Pen_win.condition=!(Pen_win.condition);
    anti_win(&Pen_win);
    break;
   case LINE_WIN:
    Line_win.condition=!(Line_win.condition);
    anti_win(&Line_win);
    break;
   case RECTANGLE_WIN:
    Rectangle_win.condition=!(Rectangle_win.condition);
    anti_win(&Rectangle_win);
    break;
   case ELLIPSE_WIN:
    Ellipse_win.condition=!(Ellipse_win.condition);
    anti_win(&Ellipse_win);
    break;
   case LINETO_WIN:
    Lineto_win.condition=!(Lineto_win.condition);
    anti_win(&Lineto_win);
    break;
   default:break;
  }
}

/* 画笔模式改变 */
void change_win(int k)
{if(Pen_mode!=k)
  {pre_draw_win(Pen_mode);
   pre_draw_win(k);
   Pen_mode=k;
  }
}

/* 判断鼠标左键是否按下 */
int isleft()
{
_AX=6;
geninterrupt(0x33);
return _BX&1;
}

/* 双点画线模式终止 */
void mode_reset()
{Startx=-1;
}

/* 绘制链表存储的图象 */
void putpoint(_point *head)
{int i;
_point *p;                                
p=head;
for(i=0;p!=NULL;i++)
{putpixel(p->x,p->y,p->color);
p=p->next;
}
}

/* 绘制椭圆 */
void draw_ellipse(int x0,int y0,int x1,int y1)
{int x,y,a,b;
  x=(x0+x1)/2;
  y=(y0+y1)/2;
  a=abs((x0-x1)/2);
  b=abs((y0-y1)/2);
  ellipse(x,y,0,360,a,b);
}
/* 绘制模式图形 */
void fam_pic(int x0,int y0,int x1,int y1)
{int t,_x1,_y1;
int size1,size2,size3,size4;
_x1=x0;_y1=y0;Image_x=x1;Image_y=y1;
if(x0>x1)
  {t=x0;x0=x1;x1=t;}
if(y0>y1)
  {t=y0;y0=y1;y1=t;}
  size1=imagesize(x0-1,y0-1,(x1+x0)/2+1,(y1+y0)/2+1);
  size2=imagesize((x1+x0)/2,y0-1,x1+1,(y1+y0)/2+1);
  size3=imagesize(x0-1,(y1+y0)/2,(x1+x0)/2+1,y1+1);
  size4=imagesize((x1+x0)/2,(y1+y0)/2,x1+1,y1+1);
  Buf1=malloc(size1);
  Buf2=malloc(size2);
  Buf3=malloc(size3);
  Buf4=malloc(size4);
  if(Buf1==NULL)
   {closegraph();
    printf("not enough space!\n");
    exit(1);
    }
  getimage(x0-1,y0-1,(x1+x0)/2+1,(y1+y0)/2+1,Buf1);
  getimage((x1+x0)/2,y0-1,x1+1,(y1+y0)/2+1,Buf2);
  getimage(x0-1,(y1+y0)/2,(x1+x0)/2+1,y1+1,Buf3);
  getimage((x1+x0)/2,(y1+y0)/2,x1+1,y1+1,Buf4);
  setcolor(Thecolor);
  switch(Pen_mode)
   {case RECTANGLE_WIN:
    rectangle(x0,y0,x1,y1);
    break;
    case ELLIPSE_WIN:
    draw_ellipse(x0,y0,x1,y1);
    break;
    case LINETO_WIN:
    line(_x1,_y1,Image_x,Image_y);
    break;
    default:break;
   }
}

/* 恢复模式作图时的背景图象   */
void put_fam(int x0,int y0,int x1,int y1)
{int t;
if(Buf1!=NULL)
{if(x0>x1)
  {t=x0;x0=x1;x1=t;}
if(y0>y1)
  {t=y0;y0=y1;y1=t;}
  putimage(x0-1,y0-1,Buf1,COPY_PUT);
  putimage((x1+x0)/2,y0-1,Buf2,COPY_PUT);
  putimage(x0-1,(y1+y0)/2,Buf3,COPY_PUT);
  putimage((x1+x0)/2,(y1+y0)/2,Buf4,COPY_PUT);
  freeall();
}
}

/* 后台工作 */
void underwork(int k)
{
if(isleft())
{put_cp(Pre_x,Pre_y,Tempcp_head);
  if(k>=COLOR0_WIN&&k<=COLOR15_WIN)
  {Pen_flag=0;
   Thecolor=k-10;
   setcolor(Thecolor);
   Color_win.color=Thecolor;
   draw_win(&Color_win);
  }
  else
   {switch(k)
    {case PEN_WIN:
      mode_reset();
      change_win(k);
      break;
     case LINE_WIN:
      mode_reset();
      change_win(k);
      break;
     case RECTANGLE_WIN:
      mode_reset();
      change_win(k);
      break;
     case ELLIPSE_WIN:
      mode_reset();
      change_win(k);
      break;
     case LINETO_WIN:
      mode_reset();
      change_win(k);
      break;
     case PIC_WIN:
      switch(Pen_mode)
       {case LINE_WIN:
          setcolor(Thecolor);
          if(Startx==-1)
           {Startx=Cp_x;
            Starty=Cp_y;
            putpixel(Cp_x,Cp_y,Thecolor);
           }
          else
           {line(Startx,Starty,Cp_x,Cp_y);
            Startx=Cp_x;
            Starty=Cp_y;
    }
    break;
  case PEN_WIN:
           Pen_flag=!Pen_flag;
            Pointx=Cp_x;
     Pointy=Cp_y;
     break;
  case RECTANGLE_WIN:
    Rectangle_flag=!Rectangle_flag;
    Fam_x=Cp_x;
    Fam_y=Cp_y;
    freeall();
    break;
  case ELLIPSE_WIN:
    Ellipse_flag=!Ellipse_flag;
    Fam_x=Cp_x;
    Fam_y=Cp_y;
    freeall();
    break;
  case LINETO_WIN:
    Lineto_flag=!Lineto_flag;
           Fam_x=Cp_x;
    Fam_y=Cp_y;
    freeall();
    break;
default: break;
       }/* inter switch end */
      default: break;
     }/* end of wide switch */
    }/* end of wide else */
   gettemp_cp(Cp_x,Cp_y,Tempcp_head);
   }/* end of if(isleft()) */
  else
     {if(Pen_flag==1&&Pen_mode==PEN_WIN&&
      Cp_x>60&&Cp_x<629&&Cp_y>20&&Cp_y<419)
       {put_cp(Pre_x,Pre_y,Tempcp_head);
        setcolor(Thecolor);
line(Pointx,Pointy,Cp_x,Cp_y);
         Pointx=Cp_x;
  Pointy=Cp_y;
         gettemp_cp(Cp_x,Cp_y,Tempcp_head);
}
      else if(Rectangle_flag==1&&Pen_mode==RECTANGLE_WIN&&
       Cp_x>61&&Cp_x<628&&Cp_y>21&&Cp_y<418&&(Cp_x!=Pre_x||Cp_y!=Pre_y))
       {put_cp(Pre_x,Pre_y,Tempcp_head);
  put_fam(Fam_x,Fam_y,Image_x,Image_y);
  fam_pic(Fam_x,Fam_y,Cp_x,Cp_y);
         gettemp_cp(Cp_x,Cp_y,Tempcp_head);
       }
      else if(Ellipse_flag==1&&Pen_mode==ELLIPSE_WIN&&
       Cp_x>61&&Cp_x<628&&Cp_y>21&&Cp_y<418&&(Cp_x!=Pre_x||Cp_y!=Pre_y))
       {put_cp(Pre_x,Pre_y,Tempcp_head);
  put_fam(Fam_x,Fam_y,Image_x,Image_y);
  fam_pic(Fam_x,Fam_y,Cp_x,Cp_y);
  gettemp_cp(Cp_x,Cp_y,Tempcp_head);
       }
      else if(Lineto_flag==1&&Pen_mode==LINETO_WIN&&
       Cp_x>61&&Cp_x<628&&Cp_y>21&&Cp_y<418&&(Cp_x!=Pre_x||Cp_y!=Pre_y))
       {put_cp(Pre_x,Pre_y,Tempcp_head);
  put_fam(Fam_x,Fam_y,Image_x,Image_y);
  fam_pic(Fam_x,Fam_y,Cp_x,Cp_y);
         gettemp_cp(Cp_x,Cp_y,Tempcp_head);
       }
     }
}/* end of underwork() */

/* 显示鼠标 */
void cpon()
{if(Cp_x!=Pre_x||Cp_y!=Pre_y)
  {gettemp_cp(Cp_x,Cp_y,Tempcp_head);
   put_cp(Cp_x,Cp_y,Cp_head);
   Pre_x=Cp_x;
   Pre_y=Cp_y;
  }
}

/* 隐藏鼠标 */
void cpoff()
{if(Cp_x!=Pre_x||Cp_y!=Pre_y)
put_cp(Pre_x,Pre_y,Tempcp_head);
}

/* 设定鼠标移动量 */
void setcpspeed(int x,int y)
{_CX=x;
_DX=y;
_AX=16;
geninterrupt(0x33);
}

/* 放大窗,size表示放大倍数 */
void zoomon()
{int i,j,m,n,u,v,color,size=3,zoo;
if((Pre_x!=Cp_x||Pre_y!=Cp_y)&&Cp_x>60&&Cp_x<629&&Cp_y>20&&Cp_y<419)
{  if(58%size==0)
   zoo=58/size;
   else zoo=58/size+1;
  for(n=Cp_y-zoo/2;n<=Cp_y+zoo/2-!(zoo%2);n++)
  for(m=Cp_x-zoo/2;m<=Cp_x+zoo/2-!(zoo%2);m++)
  {color=getpixel(m,n);
   u=(n-Cp_y)*size+size*zoo/2+421;
   v=(m-Cp_x)*size+size*zoo/2+1;
    for(j=u;j<u+size;j++)
    for(i=v;i<v+size;i++)
     if(j<=479&&i<=58)
      putpixel(i,j,color);
   }
}
}

/*主函数,按任意键退出*/
void main()                   
{
win_make();
start();
settextstyle(SMALL_FONT,HORIZ_DIR,4);
setcolor(BLACK);
outtextxy(605,460,",");
while(!kbhit())
{
   GETXY 
   outpoint();
   zoomon();
     cpoff();
  underwork(where());
    cpon();
}
closegraph();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -