签到

05月06日
尚未签到

共有回帖数 0

    孤单的狼

    等级:
    大家好,很久没来了,c吧还是这个样子呵呵。
       学习Windows编程的时候,受了点影响,想在DOS下编个漂亮一点的程序,最初是想编个想windows附件里带的那个画笔,可是最后越编越凌乱。于是就改了一下,改成了一个模板(再改一下就是一个函数库了)。以后大家在DOS下编有鼠标的图形编程的话,用这个模板就方便多了。
       模板写在这里,具体的功能就要大家自己添加了,该程序模仿了Windows中的消息机制,例如:你要让鼠标单击一下就在鼠标单击的地方画一个圆,那么只需要在处理消息的函数中单击消息下面加上画圆函数circle就ok了,具体还有很多功能我发了代码再和大家慢慢讲��
    *
     Name:       winDOS
     Copyright:  pT
     Author:     pT
     Date:       29-07-05 19:40
     Description:It's for baidu cbar.thank you.
    */
    #includestdio.h
    #includeconio.h
    #includedos.h
    #includegraphics.h
    #includemalloc.h

    /*SendMessage define*/
    #define SendMessage IF_break=DOSProc

    /*BOOL define*/
    typedef int BOOL;
    #define TRUE  1
    #define FALSE 0

    /*flags define*/
    #define COOR     0
    #define BUTTONID 1

    /*Mouse message define*/
    typedef int MSG;
    #define D_MOVE       -1
    #define D_RELEASE    -2
    #define D_RIGHTPRESS -3
    #define D_LEFTPRESS  -4
    #define D_RIGHTPRESS_MOVE -5
    #define D_LEFTPRESS_MOVE  -6

    /*ADD YOUR Button ID define HRER:*/

    /*按钮结构*/
    typedef struct Button
    {
       int x1;/*左上x*/
       int y1;/*左上x*/
       int x2;/*右下y*/
       int y2;/*右下y*/
       BOOL enable;/*可用性*/
       MSG ButID;/*按钮ID,用于处理消息*/
       struct Button *next;/*链表结构要用的*/
    }Button;

    /* 内部函数*/
    void InitGraphics();          /* 初始化图像*/
    void MainFunction();          /* 主体函数,循环检测鼠标动作*/
    void DrawMouse(int x, int y); /*画呀嘛画呀嘛画鼠标*/
    BOOL DOSProc(MSG message);    /* 处理消息*/
    BOOL CheckClick(int x, int y);/* 处理鼠标按键状态*/
    BOOL DoWithButID(MSG mess);   /* 检查是否符合按钮触发的条件*/

    /*可以用的函数*/
    int GetX();  int GetY();                                  /*得到当前鼠标的坐标*/
    void AddButton(int x1,int y1,int x2,int y2,/*按钮的范围*/
                  BOOL enable,/*按钮是否可用*/
                  MSG  ButID/*按钮的ID*/);                   /*添加按钮到按钮链表*/
    BOOL GetButByXY (int x, int y, Button *But);              /*得到第一个包含坐标x,y的按钮的结构*/

    BOOL GetButByMSG(MSG ButID, Button *But);                 /*得到按钮ID是ButID的按钮的结构*/
    BOOL DelButtonByXY (int x,int y);                         /*删除第一个包含坐标x,y的按钮的结构*/
    BOOL DelButtonByMSG(MSG ButID);                           /*删除按钮ID是ButID的按钮的结构*/
    void EnableButtonByXY (int x,int y, BOOL enable);         /*改变第一个包含坐标x,y的按钮的可用性*/
    void EnableButtonByMSG(MSG ButID,   BOOL enable);         /*改变按钮ID是ButID的按钮的可用性*/
    void ChangeButtonByXY (int x,int y, int flags,   Button* But);   /*把But赋值给相应的按钮*/
    void ChangeButtonByMSG(MSG ButID,   int flags,   Button* But);   /*把But赋值给相应的按钮*/

    /*所有全局变量*/
    union REGS regs;/* 鼠标要用的 */
    Button ButHead; /* 按钮结构链表的首部 */

    int main()
    {
       InitGraphics();
       /*ADD YOUR CODE HERE:*/
       MainFunction();
    }

    void DrawMouse(int x, int y) /*就在此地画呀嘛画呀嘛画鼠标*/
    {
       /*x,y是鼠标的坐标*/
       /*ADD YOUR CODE HERE:*/
    }

    BOOL DOSProc(MSG message)/*处理消息的函数*/
    {
       static void *buf;
       static BOOL once=FALSE;
       static size;
       switch (message)
       {
           /*ADD YOUR CODE HERE:*/
       }
       return FALSE;
    }

    void InitGraphics()
    {
       int gd = DETECT, gm = 0;
       registerbgidriver(EGAVGA_driver);
       initgraph(&gd, &gm, "");
    }

    void MainFunction()
    {
       void DoWithClick();
       int oldX,oldY;
       int size;
       void *buf;

       regs.x.ax=3;
       int86(0x33,&regs,&regs);
       oldX=regs.x.cx;
       oldY=regs.x.dx;
       size=imagesize(oldX, oldY, oldX+10, oldY+10);
       buf=malloc(size);
       while(1)

      {
           int86(0x33,&regs,&regs);
           if (oldX!=regs.x.cx || oldY!=regs.x.dx || regs.x.bx!=0)
           {
               putimage(oldX, oldY, buf, COPY_PUT);
               if (CheckClick(regs.x.cx, regs.x.dx)==TRUE) break;
               getimage(regs.x.cx, regs.x.dx, regs.x.cx+10, regs.x.dx+10,buf);
               DrawMouse(regs.x.cx,regs.x.dx);
               oldX=regs.x.cx; oldY=regs.x.dx;
           }
       }
    }

    BOOL CheckClick(int x, int y)
    {
       BOOL ret;
       BOOL IF_break=FALSE;
       Button But;
       static BOOL IF_Press=FALSE;

       ret = GetButByXY(x,y,&But);
       if (ret==FALSE)
       {
           if(regs.x.bx==0)
           {
               if (IF_Press==TRUE)  {IF_Press=FALSE; SendMessage(D_RELEASE);}
               else {IF_Press=FALSE; SendMessage(D_MOVE);}
           }
           else if(regs.x.bx==1)
           {
               if (IF_Press==FALSE) {IF_Press=TRUE; SendMessage(D_LEFTPRESS);}
               else {IF_Press=TRUE; SendMessage(D_LEFTPRESS_MOVE);}
           }
           else if(regs.x.bx==2)
           {
               if (IF_Press==FALSE) {IF_Press=TRUE; SendMessage(D_RIGHTPRESS);}
               else {IF_Press=TRUE; SendMessage(D_RIGHTPRESS_MOVE);}
           }
       }
       else if(DoWithButID(But.ButID)==TRUE && But.enable==TRUE) SendMessage(But.ButID);
       if (IF_break==TRUE) return TRUE;
       else return FALSE;
    }

    BOOL DoWithButID(MSG mess)
    {
       static MSG reg;
       if (regs.x.bx==0) reg = mess;
       else if (regs.x.bx==1) {if (mess==reg) return TRUE;}
       return FALSE;
    }
    /*下面是外部函数*/
    int GetX()
    {int86(0x33,&regs,&regs);
    return regs.x.cx;}

    int GetY()
    {int86(0x33,&regs,&regs);
    return regs.x.dx;}

    void AddButton(int x1, int y1, int x2, int y2, BOOL enable, MSG ButID)
    {
       static Button *pr = &ButHead;
       pr-next = (Button*)malloc(sizeof(Button));
       pr = pr-next;
       pr-x1 = x1; pr-y1 = y1;
       pr-x2 = x2; pr-y2 = y2;
       pr-enable = enable;
       pr-ButID  = ButID;
       pr-next = NULL;
    }

    BOOL GetButByXY(int x, int y, Button *But)
    {
       Button *pBut = &ButHead;
       while (pBut!=NULL)
       {
           if ((x = (pBut-x1)) && (y = (pBut-y1)) &&
               (x = (pBut-x2)) && (y = (pBut-y2))   )
              {*But=*pBut;return TRUE;}
           else pBut=pBut-next;
       }
       return FALSE;
    }

    BOOL GetButByMSG(MSG ButID, Button *But)
    {
       Button *pBut = &ButHead;
       while (pBut!=NULL)
       {
           if (ButID==pBut-ButID) {*But=*pBut; return TRUE;}
           else pBut=pBut-next;
       }
       return FALSE;
    }

    BOOL DelButtonByXY(int x,int y)
    {
       Button *pBut = &ButHead;
       Button *fBut = &ButHead;
       while (pBut!=NULL)
       {
           if ((x  (pBut-x1)) && (y  (pBut-y1)) &&
               (x  (pBut-x2)) && (y  (pBut-y2))   )
              {
                  fBut-next=pBut-next;
                  free(pBut);
                  return TRUE;

        }
           else {fBut=pBut; pBut=pBut-next;}
       }
       return FALSE;
    }

    BOOL DelButtonByMSG(MSG ButID)
    {
       Button *pBut = &ButHead;
       Button *fBut = &ButHead;
       while (pBut!=NULL)
       {
           if (ButID==pBut-ButID)
           {
                  fBut-next=pBut-next;
                  free(pBut);
                  return TRUE;
           }
           else {fBut=pBut; pBut=pBut-next;}
       }
       return FALSE;
    }

    void EnableButtonByXY(int x,int y, BOOL enable)
    {
       Button *pBut = &ButHead;
       while (pBut!=NULL)
       {
           if ((x  (pBut-x1)) && (y  (pBut-y1)) &&
               (x  (pBut-x2)) && (y  (pBut-y2))   )
               {pBut-enable=enable; return; }
           else pBut=pBut-next;
       }
    }
    void EnableButtonByMSG(MSG ButID,   BOOL enable)
    {
       Button *pBut = &ButHead;
       while (pBut!=NULL)
       {
           if (ButID==pBut-ButID) {pBut-enable=enable; return; }
           else pBut=pBut-next;
       }
    }
    void ChangeButtonByXY (int x,int y, int flags,   Button* But)
    {
       Button *pBut = &ButHead;
       while (pBut!=NULL)
       {
           if ((x  (pBut-x1)) && (y  (pBut-y1)) &&
               (x  (pBut-x2)) && (y  (pBut-y2))   )
           {
               if (flags==COOR)

          {
                   pBut-x1 = But-x1;  pBut-x2 = But-x2;
                   pBut-y1 = But-y1;  pBut-y2 = But-y2;
                   return;
               }
               else if(flags==BUTTONID) {pBut-ButID=But-ButID; return;}
               return;
           }
           else pBut=pBut-next;
       }
    }

    void ChangeButtonByMSG (MSG ButID, int flags,   Button* But)
    {
       Button *pBut = &ButHead;
       while (pBut!=NULL)
       {
           if (ButID==pBut-ButID)
           {
               if (flags==COOR)
               {
                   pBut-x1 = But-x1;  pBut-x2 = But-x2;
                   pBut-y1 = But-y1;  pBut-y2 = But-y2;
                   return;
               }
               else if(flags==BUTTONID) {pBut-ButID=But-ButID; return;}
               return;
           }
           else pBut=pBut-next;
       }
    }
    Ok发完了,别看代码这么多,其实真正要你添加代码的只有3个地方。
       第一个地方就是main主函数下面,在调用MainFunction之前添加代码,因为调用MainFunction后就进入检查鼠标的无限循环状态,一些比如说画背景的代码啊,欢迎的代码啊都要在该函数之前。但一般在这个地方建立几个按钮。
       第二个地方就是DrawMouse函数中,顾名思义,这个函数是画鼠标的,当中有2个参数是鼠标的坐标,这个应该很简单。我在模板中没有添加画鼠标的代码。所以你要是直接运行的话会啥都看不到。
       第三个地方是DOSProc函数,也就是处理消息的函数,大多数代码要在这里添加。

       按顺序,先说按钮,按钮的结构注释中已经讲的很清楚了。几个操作按钮的函数说一下:
    AddButton函数:建立一个按钮并把它添加到按钮链表。
    DelButtonByXY或DelButtonByMSG函数:把按钮从链表中删除,成功返回TRUE,失败返回FALSE。
    GetButByXY或GetButByMSG函数:得到按钮的消息,成功返回TRUE,失败返回FALSE。
    EnableButtonByXY或EnableButtonByMSG函数:使按钮变得可用或不可用,也就是改变按钮的enable值。
    ChangeButtonByXY或ChangeButtonByMSG函数:改变按钮的值,如果flags是COOR则把参数But的坐标值赋给该按钮,如果为BUTTONID则把其ID赋值给该坐标。
    上面的函数中ByXY就是说在按钮链表里搜出第一个包含参数x,y的按钮,ByMSG的意思是搜出按钮链表里第一个按钮ID符合参数ButID的按钮。

       消息机制,也就是DOSProc,模仿Windows程序里的winProc,呵呵。大概的用法也是一样的,在swicth语句中添加处理消息的代码,我给了大家几个鼠标所产生的消息,如下:
    #define D_MOVE       -1     鼠标不按任何键则发出该消息
    #define D_RELEASE    -2     鼠标释放时发出
    #define D_RIGHTPRESS -3     鼠标按左键时发出,只在按的开始发出
    #define D_LEFTPRESS  -4     鼠标按右键时发出,只在按的开始发出
    #define D_RIGHTPRESS_MOVE -5鼠标按右键时发出
    #define D_LEFTPRESS_MOVE  -6鼠标按左键时发出
    如果你定义了按钮则会发出该按钮的ID,这个ID将作为一个消息。
    格式:这个不用多说了吧,
    case MESSAGE1:
    .......
    break;
    case MESSAGE2:
    ......
    break;
    ......
    default:break;
    要注意的是每个case后一定要加break��

    楼主 2016-03-09 13:31 回复

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

登录直线网账号

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