共有回帖数  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号
	
	意见反馈 | 
	关于直线 | 
	版权声明 | 
	会员须知