c语言交互窗口,交互式窗口求解

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

我这一段程序的结果为什么和预想的不一样,请高手指点一下

#include

#include

#include

#include

#include

void initgr(void);

void restore_scr(char *buffer,int x1,int y1,int x2,int y2);

void save_scr(char *buffer,int x1,int y1,int x2,int y2);

void wn_cls(int x1,int y1,int x2,int y2);

void box(int,int);

char getkey(void);

int SC_color=2;

int Bar_color=12;

int WDX=64;

int WDY=80;

main()

{

int x1,y1,x2,y2,x0,y0;

int size;

int ch,a;

char *buffer;

initgr();

setfillstyle(1,SC_color);

bar(0,0,639,479);

rectangle(0,0,639,479);

setfillstyle(1,0);

bar(74,444,640,452);

setcolor(4);

rectangle(5,30,634,474);

setfillstyle(1,Bar_color);

bar(70,440,640,448);

setcolor(8);

outtextxy(100,80,"Welcome");

x1=48;

y1=50;

x2=x1+WDX;

y2=y1+WDY;

size=(x2-x1)/8*(y2-y1+1)*4;

buffer=(char *)malloc(size);

if(buffer==NULL){

printf("Noenough memory!\n");

exit(1);

}

save_scr(buffer,x1,y1,x1+WDX,y1+WDY);

box(x1,y1);

do{

x0=x1;y0=y1;

ch=getkey();

switch(ch){

case 75:   x0-=8;  break;

case 77:   x0+=8;   break;

case 72:   y0-=8;  break;

case 80:   y0+=8;   break;

default:   break;

}

if(x0<0)x0=0;

if(y0<0)y0=0;

if(x0>640-WDX)x0=640-WDX;

if(y0>480-WDY)y0=480-WDY;

if(x1!=x0||y1!=y0){

restore_scr(buffer,x1,y1,x1+WDX,y1+WDY);

x1=x0;y1=y0;

save_scr(buffer,x1,y1,x1+WDX,y1+WDY);

box(x1,y1);}

}while(ch!=1);

getch();

free(buffer);

closegraph();

}

void box(int x1,int y1)

{

setfillstyle(1,RED);

bar(x1,y1,x1+WDX-1,y1+WDY-1);

}

void save_scr(char *buffer,int x1,int y1,int x2,int y2)

{

int i;

register long j,k;

char far *ptr;

for(i=0;i<4;i++)

{

outportb(0x3ce,4);

outportb(0x3cf,0);

outportb(0x3c3,4);

outportb(0x3cf,i);

ptr=(char far*)0xA0000000L+((long)y1*80L+x1/8);

for(j=1;j

{

for(k=1;k<=(x2-x1)/8;k++)

{

*buffer=*ptr;

ptr++;

buffer++;

}

ptr+=8L-(long)((x2-x1)/8);

}

}

outportb(0x3cf,0);

}

void restore_scr(char *buffer,int x1,int y1,int x2,int y2)

{

int i,k=1;

register long j,j1;

char far *ptr;

long int dp;

int dx;

dx=(x2-x1)/8;

dp=80L-(long)((x2-x1)/8);

for(i=0;i<4;i++)

{

outportb(0x3c4,2);

outportb(0x3c5,k);

ptr=(char far*)0xA0000000L+((long)y1*80L+(x1)/9);

for(j=y1;j

{

for(j1=1;j1<=dx;j1++)

{*ptr=*buffer;

buffer++;

ptr++;}

ptr+=dp;

}

k*=2;

}

outportb(0x3c4,2);

outportb(0x3c5,0x0f);

}

void initgr(void)

{int gdriver=DETECT,gmode,errorcode;

initgraph(&gdriver,&gmode,"");

errorcode=graphresult();

if(errorcode!=grOk){

printf("Graphics System Error:%s\n",grapherrormsg(errorcode));

exit(1);

}

}

char getkey(void)

{

union key{

int i;

char ch[2];

}k;

k.ch[1]=bioskey(0);

return k.ch[1];

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值