#include "stdio.h"
#include"dos.h"
#include"graphics.h"
#include"stdlib.h"
#include"bios.h"
#include"conio.h"
#include"string.h"
#include "malloc.h"
#include"mem.h"
#include"ctype.h"
#include"alloc.h"
#include"math.h"
#define BKCOLOR 0
#define mousecolor 4
#define R 15 /*鼠标的形态*/
#define W 5//橡皮宽度
int x0=0,y0=0;//全局变量记录画图中心点
int penx=0,peny=0;
int anniu=0,coloranniu=0;//标识变量
int stablex,stabley;
int pencolor=4;
int fillcolor=3;
char change[32];//鼠标指针中转存储
char curse[]={
0x00,0x00,0x40,0x00,0x30,0x00,0x3E,0x00,
0x1F,0xC0,0x1F,0xF8,0x1F,0xF0,0x0F,0xE0,
0x0F,0xC0,0x0F,0xE0,0x0F,0x70,0x06,0x38,
0x04,0x1C,0x00,0x0E,0x00,0x06,0x00,0x00
};
void cross(int bx1,int by1,int c)
{int co;
if(c==0)co=12;
else if(c==1)co=2;
else co=14;
setfillstyle(1,WHITE);
bar(bx1,by1,bx1+12,by1+12);
setfillstyle(1,co);
bar(bx1+1,by1+1,bx1+11,by1+11);
setcolor(WHITE);
outtextxy(bx1+3,by1+3,"X");
}
void maxwin(int bx1,int by1,int c)
{int co;
if(c==0)co=12;
else if(c==1)co=2;
else co=14;
setfillstyle(1,WHITE);
bar(bx1,by1,bx1+12,by1+12);
setfillstyle(1,co);
bar(bx1+1,by1+1,bx1+11,by1+11);
setcolor(WHITE);
outtextxy(bx1+3,by1+3,"O");
}
void minwin(int bx1,int by1,int c)
{ int co;
if(c==0)co=12;
else if(c==1)co=2;
else co=14;
setfillstyle(1,WHITE);
bar(bx1,by1,bx1+12,by1+12);
setfillstyle(1,co);
bar(bx1+1,by1+1,bx1+11,by1+11);
setcolor(WHITE);
outtextxy(bx1+3,by1+3,"_");
}
void hanzi(int x,int y,char *s,int colour) /* x,y为汉字坐标,s为字符串,colour为颜色值*/
{ FILE *fp;
char buffer[32];
register i,j,k;
unsigned char qh,wh; /*区位码*/
unsigned long location; /*汉字在字库中的位置*/
if((fp=fopen("c:\\hzk16","rb"))==NULL)
{ printf("Can't open hzk16!"); getch(); exit(0); }
while(*s)
{ qh=*s-0xa0;
wh=*(s+1)-0xa0;
location=(94*(qh-1)+(wh-1))*32L;
fseek(fp,location,SEEK_SET);
fread(buffer,32,1,fp);
for (i=0;i<16;i++)
for(j=0;j<2;j++)
for(k=0;k<8;k++)
if(((buffer[i*2+j]>>(7-k))&0x1)!=NULL)
putpixel(x+8*j+k,y+i,colour);
s+=2; /*下一个字*/
x+=16; /*汉字间距*/
}
fclose(fp);
}
void button(int bx1,int by1,int bx2,int by2,char *name,int stat)
{if(stat==0)
{ setcolor(0);
outtextxy(bx1,by1+4,name);
}
if(stat==1)
{setfillstyle(1,WHITE);
bar(bx1,by1,bx2,by2);
setfillstyle(1,DARKGRAY);
bar(bx1+1,by1+1,bx2,by2);
setfillstyle(1,LIGHTGRAY);
bar(bx1+1,by1+1,bx2-1,by2-1);
setcolor(14);
outtextxy(bx1,by1+4,name);
}
if(stat==2)
{setfillstyle(1,DARKGRAY);
bar(bx1,by1,bx2,by2);
setfillstyle(1,WHITE);
bar(bx1+1,by1+1,bx2,by2);
setfillstyle(1,5);
bar(bx1+1,by1+1,bx2-1,by2-1);
setcolor(14);
outtextxy(bx1,by1+4,name);
}
if(stat==3)
{setfillstyle(1,DARKGRAY);
bar(bx1,by1,bx2,by2);
setfillstyle(1,WHITE);
bar(bx1+1,by1+1,bx2,by2);
setfillstyle(1,BLUE);
bar(bx1+1,by1+1,bx2-1,by2-1);
setcolor(14);
outtextxy(bx1,by1+4,name);
}
}
void printcursor(int x,int y,int color,unsigned char *m)
{register unsigned char i,j,k;
for(i=0;i<16;i++)
for(j=0;j<2;j++)
{for(k=0;k<8;k++)
if((0x80>>k)&m[i*2+j])
putpixel(x+j*8+k,y+i,color);
}
}
/*获取鼠标位置和按键,key=1是左键,key=2是右键*/
void getmouse(int *x,int *y,int *key)
{
union REGS inregs,outregs;
inregs.x.ax=3; /*获取鼠标位置和状态也可以用3*/
int86(0x33,&inregs,&outregs); /*中断调用*/
*x=outregs.x.cx; /*cx寄存器中存的是横坐标*/
*y=outregs.x.dx; /*dx寄存器中存的是列坐标*/
*key=outregs.x.bx; /*bx寄存器是按键状态*/
}
void visbilemouse()
{
union REGS inregs,outregs;
inregs.x.ax=0x01; /*显示鼠标*/
int86(0x33,&inregs,&outregs);
}
/*按键后,返回当前鼠标的x,y和按键状态,知道按键后才返回*/
void mouse(int *x,int *y,int *z) /*画鼠标是利用将一个空矩形存入内存中,然后再在该空矩形中画鼠标形状*/
{
int i,j;
int a=0,b=0,c=0,a_old=0,b_old=0; /*a,b的值可以随便*/
int *ball; /*定义指向内存的存储图形的指针*/
ball=malloc(imagesize(a,b,a+R,b+R)); /*返回矩形的大小*/
getimage(a,b,a+R,b+R,ball); /*第一次将图形(一个空矩形)存入到内存中,内存中存入的是一个空矩形*/
/*setcolor(GREEN);
setlinestyle(0,0,1);
line(a,b,a+R,b+R/2);
line(a,b,a+R/2,b+R);
line(a+R,b+R/2,a+R/2,b+R);
line(a+R*3/4,b+R*3/4,a+R,b+R); 同样可要可不要,画鼠标*/
while(c==0) /*直到按键后才返回,不按键一直循环*/
{
getmouse(&a,&b,&c); /*a,为横坐标,b,为列坐标,c为按键状态*/
if(a<0) a=0; /*保证鼠标左边不出界*/
if(b<0) b=0; /*保证上面不出界*/
if(a>getmaxx()-R) a=getmaxx()-R; /*保证右边不出界*/
if(b>getmaxy()-R) b=getmaxy()-R; /*保证下边不出界*/
if(a!=a_old || b!=b_old) /*当鼠标移动时*/
{
putimage(a_old,b_old,ball,0); /*在a_old,b_old输出图形,用来擦掉原来的鼠标*/
getimage(a,b,a+R,b+R,ball);/*这条语句是将目前鼠标所在位置的图形存贮到ball里面试着看着有无这条语句的区别*/
/*不需要在获取了*/
printcursor(a,b,mousecolor,change);
setcolor(0);
line(a+1,b+2,a+5,b+12);
line(a+9,b+10,a+13,b+14);
line(a+5,b+12,a+8,b+9);
/*画鼠标*/
}
a_old=a;b_old=b;
} /*while()结束*/
*x=a;*y=b;*z=c; /*返回按键后鼠标的位置*/
putimage(a,b,ball,0); /*将鼠标擦掉,因为存在ball里面的是一个背景为缺省状态下的一个空矩形*/
free(ball);
}
/*主要思想是通过getimage,putimage,imagesize图形的存贮一个当前的图形来擦拭掉以前的鼠标图形,也可以用清屏部分屏幕来实现*/
int minvalue(int l,int r,int t,int b)
{ int min;
min=l;
if(min>r)min=r;
if(min>t)min=t;
if(min>b)min=b;
return min;
}
/****************************************************/
void movebmp(int*p,int deltx,int delty,int height,int width)
{ int *ball=malloc(sizeof(*p));
int mx=0,my=0,z=0,size;
int oldx,oldy;
do
{
oldx=mx;oldy=my;
mouse(&mx,&my,&z);
getimage(mx-deltx,my-delty,mx-deltx+width,my-delty+height,ball);
putimage(mx-deltx,my-delty,p,0);
if(mx==oldx&&my==oldy)break;
putimage(mx-deltx,my-delty,ball,0);
}while(z==1);
free(ball);
}
/***************************************************/
/*按键后,返回当前鼠标的x,y和按键状态,知道按键后才返回*/
void pubmouse(int *x,int *y,int *z,int i0,int j0,int k0,int l0,int n) /*画鼠标是利用将一个空矩形存入内存中,然后再在该空矩形中画鼠标形状*/
{int a=0,b=0,c=0,i,j,r,rx=0,ry=0,key;
int lcir,rcir,tcir,bcir,mincir;
int a_old=0,b_old=0,oa,ob,ao,bo; /*a,b的值可以随便*/
int *ball,*p; /*定义指向内存的存储图形的指针*/
int flag=0;
ball=malloc(imagesize(a,b,a+R,b+R)); /*返回矩形的大小*/
getimage(a,b,a+R,b+R,ball); /*第一次将图形(一个空矩形)存入到内存中,内存中存入的是一个空矩形*/
/*setcolor(GREEN);
setlinestyle(0,0,1);
line(a,b,a+R,b+R/2);
line(a,b,a+R/2,b+R);
line(a+R,b+R/2,a+R/2,b+R);
line(a+R*3/4,b+R*3/4,a+R,b+R); 同样可要可不要,画鼠标*/
//bar(i0+45,j0+56,k0-54,l0-53);//画布
while(c==0) /*直到按键后才返回,不按键一直循环*/
{
getmouse(&a,&b,&c); /*a,为横坐标,b,为列坐标,c为按键状态*/
if(a<i0+55) a=i0+55; /*保证鼠标左边不出界*/
if(b<j0+56) b=j0+56; /*保证上面不出界*/
if(a>k0-54) a=k0-54; /*保证右边不出界*/
if(b>l0-53) b=l0-53; /*保证下边不出界*/
if(a!=a_old || b!=b_old) /*当鼠标移动时*/
{
putimage(a_old,b_old,ball,0); /*在a_old,b_old输出图形,用来擦掉原来的鼠标*/
getimage(a,b,a+R,b+R,ball); /*这条语句是将目前鼠标所在位置的图形存贮到ball里面试着看着有无这条语句的区别*/
/*不需要在获取了*/
printcursor(a,b,mousecolor,curse);
setcolor(8);
line(a+1,b+2,a+5,b+12);
line(a+9,b+10,a+13,b+14);
line(a+5,b+12,a+8,b+9);
/*画鼠标*/
}
else break;
a_old=a;b_old=b;
} /*while()结束*/
putimage(a,b,ball,0);
free(ball);
if(c==0)
{
setcolor(pencolor);
setlinestyle(0,0,1);
switch(n) //bar(i0+45,j0+56,k0-54,l0-53);//画布
{case 0: r=sqrt(fabs(a-x0)*fabs(a-x0)+fabs(b-y0)*fabs(b-y0));//求出圆
一个DOS下的鼠标画图程序
5星 · 超过95%的资源 需积分: 10 179 浏览量
2008-11-05
13:56:11
上传
评论
收藏 7KB RAR 举报
thisado
- 粉丝: 1
- 资源: 4