📄 demo6.c
字号:
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 + -