签到

06月21日
尚未签到

共有回帖数 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 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知