共有回帖数 0 个
-
由4个.c文件组成,代码如下:
************index.c*****************
#include dos.h
#include draw.c
#include stdio.h
#include window.c
#include fun.c
#include mouse.c
/*设置图形模式为13H,320*200分辨率,256色*/
void setvideomode()
{
union REGS inregs,outregs;
inregs.h.ah=0;
inregs.h.al=0x13;
int86(0x10,&inregs,&outregs);
}
/*主程序*/
main()
{
unsigned char far *video_buffer; /*指针变量video_buffer用于指向显存初地址A0000H*/
int *x,*y,i,j;
windows_ptr head;
windows_ptr now;
windows_ptr pre;
setvideomode(); /*进入图形模式*/
video_buffer=(char far *)0xa0000000;
x=(int *)malloc(42); /*为数组x[20]申请内存空间*/
for(i=0;i21;i++)
x=80+i*7;
y=(int *)malloc(42); /*为数组y[20]申请内存空间*/
for(i=0;i21;i++)
y=10+i*7;
drawnet(x,y,24,video_buffer);
now=pre=(struct windows *)malloc(sizeof(struct windows));
initstruct(now,BAR,0,185,319,199,15,24,"",0,win); /*绘制BAR*/
drawbartool(now,video_buffer);
head=now;
now=(struct windows *)malloc(sizeof(struct windows));
initstruct(now,BUTTON,5,186,45,198,15,0,"Line",0,menu1);
drawbartool(now,video_buffer);
pre-next=now;
now-pre=pre;
pre=now;
now=(struct windows *)malloc(sizeof(struct windows));
initstruct(now,BUTTON,50,186,100,198,15,0,"Circle",0,menu2);
drawbartool(now,video_buffer);
pre-next=now;
now-pre=pre;
pre=now;
now=(struct windows *)malloc(sizeof(struct windows));
initstruct(now,BUTTON,274,186,314,198,15,0,"Exit",0,endpro);
drawbartool(now,video_buffer);
pre-next=now;
now-pre=pre;
pre=now;
pre-next=NULL;
setmouse(head);
}
**********************************************
***************window.c***************
#define BAR 1
#define BUTTON 2
#define MIN 0
#define MAX 1
typedef struct point
{
int x;
int y;
};
typedef struct windows
{
int kind;
struct point top;
struct point move;
int color;
int bk_color;
unsigned char *word;
int status;
void (*windows)(struct windows *win);
struct windows *next;
struct windows *pre;
struct windows *father;
}windows,*windows_ptr;
/*初始化工具栏和按钮函数*/
void initstruct(windows_ptr ptr,int kind,int x,int y,int move_x,int move_y,int color,int bk_color,unsigned char *word,int status,void (far *windows))
{
ptr-kind=kind;
ptr-top.x=x;
ptr-top.y=y;
ptr-move.x=move_x;
ptr-move.y=move_y;
ptr-color=color;
ptr-bk_color=bk_color;
ptr-word=word;
ptr-status=status;
ptr-windows=windows;
}
/*绘制工具栏和按钮函数*/
void drawbartool(windows_ptr win,unsigned char far *video_buffer)
{
int i,j;
switch(win-kind)
{
case BAR:
{
for(i=win-top.y;i=win-move.y;i++)
for(j=win-top.x;j=win-move.x;j++)
video_buffer[((i8)+(i6))+j]=win-bk_color;
}
case BUTTON:
{
for(i=win-top.y;i=win-move.y;i++)
for(j=win-top.x;j=win-move.x;j++)
video_buffer[((i8)+(i6))+j]=win-bk_color;
outstring(win-top.x+2,win-top.y+3,win-color,win-word,video_buffer);
}
}
}
/*字符输出函数*/
outromc(int cx,int cy,unsigned char c,int color,unsigned char far *video_buffer)
{
int offset,x,y;
unsigned char far *work_char;
unsigned char far *romchar=(char far *)0xf000fa6e; /*rom字符集首地址*/
unsigned char bit_mask=0x80; /*用于位比较*/
work_char=romchar+c*8;
offset=(cy8)+(cy6)+cx;
for(y=1;y9;y++) /*读取字符点阵*/
{
bit_mask=0x80;
for(x=0;x8;x++)
{
if((*work_char&bit_mask)==bit_mask)
video_buffer[offset+x]=color;
else
video_buffer[offset+x]=0;
bit_mask=(bit_mask1);
}
offset=((cy+y)8)+((cy+y)6)+cx;
work_char++;
}
}
/*字符串输出函数*/
outstring(int sx,int sy,int color,unsigned char *string,unsigned char far *video_buffer)
{
int i=0;
while(string!=' ')
{
outromc(sx,sy,string,color,video_buffer);
sx=sx+8;
i++;
}
}
/*绘制网格*/
drawnet(int *x,int *y,int color,unsigned char far *video_buffer)
{
int i;
for(i=0;i=20;i++)
{
bline(x,y[0],x,y[20],color,video_buffer);
bline(x[0],y,x[20],y,color,video_buffer);
}
}
win()
{}
*****************************************
*************draw.c**********************
void bline(int x0,int y0,int x1,int y1,int color,unsigned char far *video_buffer)
{
int dx,dy,x,y,i,tp,e;
float k;
dx=x1-x0;
dy=y1-y0;
/*垂直线绘制*/
if(dx==0)
{
if(y1y0)
{
tp=y0;y0=y1;y1=tp;
};
for(i=y0;i=y1;i++)
video_buffer[((i8)+(i6))+x0]=color;
}
/*横线绘制*/
if(dy==0)
{
if(x1x0)
{
tp=x0;x0=x1;x1=tp;
}
for(i=x0;i=x1;i++)
video_buffer[((y08)+(y06))+i]=color;
}
if(dx0&&dy0) /*如果x,y都是减小的,则改为增大的*/
{
tp=x0;x0=x1;x1=tp;
tp=y0;y0=y1;y1=tp;
dx=-dx;dy=-dy;
}
if(dx0&&dy0) /*如果x减小y增大,则改为x增大y减小*/
{
tp=x0;x0=x1;x1=tp;
tp=y0;y0=y1;y1=tp;
dx=-dx;dy=-dy;
}
if(dx!=0&&dy!=0)
{
k=(float)dy/(float)dx;
if(k(float)0&&k=(float)1)
{
e=-dx;x=x0;y=y0;
while(x=x1)
{
video_buffer[((y8)+(y6))+x]=color;
x++;
e=e+2*dy;
if(e0){y++;e=e-2*dx;}
}
}
if(k(float)1)
{
e=-dy;x=x0;y=y0;
while(y=y1)
{
video_buffer[((y8)+(y6))+x]=color;
y++;
e=e+2*dx;
if(e0){x++;e=e-2*dy;}
}
}
if(k=(float)-1&&k(float)0)
{
e=-dx;x=x0;y=y0;
while(x=x1)
{
video_buffer[((y8)+(y6))+x]=color;
x++;
e=e-2*dy;
if(e0){y--;e=e-2*dx;}
}
}
if(k(float)-1)
{
e=-dy;x=x0;y=y0;
while(y=y1)
{
video_buffer[((y8)+(y6))+x]=color;
y--;
e=e-2*dx;
if(e0){x++;e=e-2*dy;}
}
}
}
}
*********************************
***********mouse.c**************
mouse(int x,int y,int color,unsigned char far *video_buffer) /*绘制光标*/
{
bline(x-3,y,x+3,y,color,video_buffer);
bline(x,y-3,x,y+3,color,video_buffer);
}
setmouse(windows_ptr head)
{
windows_ptr test;
int mx,my,ox,oy,button=0,px,py;
int savepoint[7][7],i,j; /*保存光标覆盖区域的值的数组*/
union REGS inregs,outregs;
unsigned char far *video_buffer=(char far *)0xa0000000;
inregs.x.ax=7; /*设置最大横向位移*/
inregs.x.cx=3;
inregs.x.dx=316;
int86(0x33,&inregs,&inregs);
inregs.x.ax=8; /*设置最大纵向位移*/
inregs.x.cx=3;
inregs.x.dx=196;
int86(0x33,&inregs,&inregs);
inregs.x.ax=3;
int86(0x33,&inregs,&inregs);
mx=inregs.x.cx;
my=inregs.x.dx;
for(i=0;i=6;i++)
for(j=0;j=6;j++)
savepoint[j]=video_buffer[((my-3+i)8)+((my-3+i)6)+(mx-3+j)]; /*保存光标要覆盖的区域的背景*/
mouse(mx,my,6,video_buffer);
ox=mx;oy=my;
while(ox==mx&&oy==my)
{
inregs.x.ax=3;
int86(0x33,&inregs,&inregs);
mx=inregs.x.cx;my=inregs.x.dx; /*获取鼠标当前位置*/
button=inregs.x.bx;
delay(100);
if(ox!=mx||oy!=my)
{
for(i=0;i=6;i++)
for(j=0;j=6;j++)
video_buffer[((oy-3+i)8)+((oy-3+i)6)+(ox-3+j)]=savepoint[j]; /*当鼠标移动后,将原来位置的背景恢复*/
for(i=0;i=6;i++)
for(j=0;j=6;j++)
savepoint[j]=video_buffer[((my-3+i)8)+((my-3+i)6)+(mx-3+j)]; /*得到新坐标下的背景*/
}
mouse(mx,my,6,video_buffer);
ox=mx;oy=my;
if(button==1)
{
test=head;
inregs.x.ax=3;
int86(0x33,&inregs,&inregs);
px=inregs.x.cx;
py=inregs.x.dx;
if((pxtest-top.x&&pxtest-move.x)&&(pytest-top.y&&pytest-move.y)) /*若有按键时在对象区域内*/
{
test-windows(test);
}
while(test-next!=NULL)
{
test=test-next;
if((pxtest-top.x&&pxtest-move.x)&&(pytest-top.y&&pytest-move.y)) /*若有按键时在对象区域内*/
{
test-windows(test);
}
}
do
{
inregs.x.ax=3; /*检测鼠标左键是否仍然按下*/
int86(0x33,&inregs,&inregs);
button=inregs.x.bx;
}while(button==1);
}
}
}
**************************************
************fun.c********************
/*关闭程序*/
endpro(struct windows *win)
{
exit(0);
}
/*Line选项触发程序*/
knd1(struct windows *win)
{
unsigned char far *video_buffer=(char far *)0xa0000000;
int x,y,e,dx,dy,x1,y1,x0,y0,i,j;
int *q,*p;
q=(int *)malloc(42); /*为数组q[20]申请内存空间*/
for(i=0;i21;i++)
q=80+i*7;
p=(int *)malloc(42); /*为数组p[20]申请内存空间*/
for(i=0;i21;i++)
p=10+i*7;
drawnet(q,p,24,video_buffer); /*重画网格*/
x0=87;y0=45;
x1=199;y1=94;
dx=x1-x0;
dy=y1-y0;
e=-dx;
x=x0;y=y0;
while(x=x1)
{
for(i=0;i=2;i++)
for(j=0;j=2;j++)
video_buffer[((y-1+i)8)+((y-1+i)6)+(x-1+j)]=4;
x=x+7;
e=e+2*dy;
if(e0){y=y+7;e=e-2*dx;}
sleep(1);
}
}
knd2(struct windows *win)
{
unsigned char far *video_buffer=(char far *)0xa0000000;
int x,y,e,dx,dy,x1,y1,x0,y0,i,j;
int *q,*p;
q=(int *)malloc(42); /*为数组q[20]申请内存空间*/
for(i=0;i21;i++)
q=80+i*7;
p=(int *)malloc(42); /*为数组p[20]申请内存空间*/
for(i=0;i21;i++)
p=10+i*7;
drawnet(q,p,24,video_buffer); /*重画网格*/
x0=101;y0=24;
x1=150;y1=136;
dx=x1-x0;
dy=y1-y0;
e=-dy;
x=x0;y=y0;
while(y=y1)
{
for(i=0;i=2;i++)
for(j=0;j=2;j++)
video_buffer[((y-1+i)8)+((y-1+i)6)+(x-1+j)]=4;
y=y+7;
e=e+2*dx;
if(e0){x=x+7;e=e-2*dy;}
sleep(1);
}
}
knd3(struct windows *win)
{
unsigned char far *video_buffer=(char far *)0xa0000000;
int x,y,e,dx,dy,x1,y1,x0,y0,i,j;
int *q,*p;
q=(int *)malloc(42); /*为数组q[20]申请内存空间*/
for(i=0;i21;i++)
q=80+i*7;
p=(int *)malloc(42); /*为数组p[20]申请内存空间*/
for(i=0;i21;i++)
p=10+i*7;
drawnet(q,p,24,video_buffer); /*重画网格*/
x0=94;y0=94;
x1=199;y1=45;
dx=x1-x0;
dy=y1-y0;
e=-dx;
x=x0;y=y0;
while(x=x1)
{
for(i=0;i=2;i++)
for(j=0;j=2;j++)
video_buffer[((y-1+i)8)+((y-1+i)6)+(x-1+j)]=4;
x=x+7;
e=e-2*dy;
if(e0){y=y-7;e=e-2*dx;}
sleep(1);
}
}
knd4(struct windows *win)
{
unsigned char far *video_buffer=(char far *)0xa0000000;
int x,y,e,dx,dy,x1,y1,x0,y0,i,j;
int *q,*p;
q=(int *)malloc(42); /*为数组q[20]申请内存空间*/
for(i=0;i21;i++)
q=80+i*7;
p=(int *)malloc(42); /*为数组p[20]申请内存空间*/
for(i=0;i21;i++)
p=10+i*7;
drawnet(q,p,24,video_buffer); /*重画网格*/
x0=101;y0=136;
x1=150;y1=24;
dx=x1-x0;
dy=y1-y0;
e=-dy;
x=x0;y=y0;
while(y=y1)
{
for(i=0;i=2;i++)
for(j=0;j=2;j++)
video_buffer[((y-1+i)8)+((y-1+i)6)+(x-1+j)]=4;
y=y-7;
e=e-2*dx;
if(e0){x=x+7;e=e-2*dy;}
sleep(1);
}
}
/*circle选项触发函数*/
knd5(struct windows *win)
{
printf("kind5 pressed");
}
knd6(struct windows *win)
{
printf("kind6 pressed");
}
/*菜单Line按钮对象函数*/
menu1(struct windows *win) /*win为Line按钮对象*/
{
windows_ptr now;
windows_ptr pre;
windows_ptr head;
windows_ptr cho;
unsigned char far *video_buffer=(char far *)0xa0000000;
int i,j;
now=win;
cho=win-next; /*cho指向circle*/
if(win-status==MIN) /*菜单未打开*/
{
if(cho-status==MAX)
menu2(cho);
while(now-next!=NULL)
now=now-next; /*将now放在链表最后一个(窗口初始化的结构体-exit对象)*/
head=now;
pre=now;
for(i=0;i=55;i++)
for(j=0;j=43;j++)
video_buffer[((129+i)8)+((129+i)6)+(4+j)]=24; /*绘制菜单背景*/
now=(struct windows *)malloc(sizeof(struct windows));
initstruct(now,BUTTON,5,172,46,184,15,0,"kind1",0,knd1);
drawbartool(now,video_buffer);
now-father=win;
pre-next=now;
now-pre=head;
pre=now;
now=(struct windows *)malloc(sizeof(struct windows));
initstruct(now,BUTTON,5,158,46,170,15,0,"kind2",0,knd2);
drawbartool(now,video_buffer);
pre-next=now;
now-pre=pre;
pre=now;
now=(struct windows *)malloc(sizeof(struct windows));
initstruct(now,BUTTON,5,144,46,156,15,0,"kind3",0,knd3);
drawbartool(now,video_buffer);
pre-next=now;
now-pre=pre;
pre=now;
now=(struct windows *)malloc(sizeof(struct windows));
initstruct(now,BUTTON,5,130,46,142,15,0,"kind4",0,knd4);
drawbartool(now,video_buffer);
pre-next=now;
now-pre=pre;
pre=now;
pre-next=NULL;
win-status=MAX;
}
else if(win-status==MAX)
{
for(i=0;i=55;i++)
for(j=0;j=43;j++)
video_buffer[((129+i)8)+((129+i)6)+(4+j)]=0;
now=now-next;
now=now-next;
head=now; /*head指向Exit结构体*/
while(now-next!=NULL)
now=now-next;
while(now-pre!=head)
{
now=now-pre;
free(now-next); /*释放最后一个结构体空间*/
}
free(now); /*释放表尾*/
head-next=NULL; /*Exit指向空*/
win-status=MIN;
}
}
/*Circle对象函数*/
menu2(struct windows *win) /*win为Line按钮对象*/
{
windows_ptr now;
windows_ptr pre;
windows_ptr head;
windows_ptr cho;
unsigned char far *video_buffer=(char far *)0xa0000000;
int i,j;
now=win;
cho=win-pre;
if(win-status==MIN) /*菜单未打开*/
{
if(cho-status==MAX)
menu1(cho);
while(now-next!=NULL)
now=now-next; /*将now放在链表最后一个(窗口初始化的结构体-exit对象)*/
head=now;
pre=now;
for(i=0;i=27;i++)
for(j=0;j=52;j++)
video_buffer[((157+i)8)+((157+i)6)+(49+j)]=24; /*绘制菜单背景*/
now=(struct windows *)malloc(sizeof(struct windows));
initstruct(now,BUTTON,50,172,100,184,15,0,"kind1",0,knd5);
drawbartool(now,video_buffer);
pre-next=now;
now-pre=pre;
pre=now;
now=(struct windows *)malloc(sizeof(struct windows));
initstruct(now,BUTTON,50,158,100,170,15,0,"kind2",0,knd6);
drawbartool(now,video_buffer);
pre-next=now;
now-pre=pre;
pre=now;
pre-next=NULL;
win-status=MAX;
}
else if(win-status==MAX)
{
for(i=0;i=27;i++)
for(j=0;j=52;j++)
video_buffer[((157+i)8)+((157+i)6)+(49+j)]=0;
now=now-next;
head=now; /*head指向Exit结构体*/
while(now-next!=NULL)
now=now-next;
while(now-pre!=head)
{
now=now-pre;
free(now-next); /*释放最后一个结构体空间*/
}
free(now); /*释放表尾*/
head-next=NULL; /*Exit指向空*/
win-status=MIN;
}
}
********************************
楼主 2016-02-12 15:17 回复
Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
意见反馈 |
关于直线 |
版权声明 |
会员须知