共有回帖数  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,®s,®s); 
    oldX=regs.x.cx; 
    oldY=regs.x.dx; 
    size=imagesize(oldX, oldY, oldX+10, oldY+10); 
    buf=malloc(size); 
    while(1) 
  { 
        int86(0x33,®s,®s); 
        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,®s,®s); 
 return regs.x.cx;} 
int GetY() 
{int86(0x33,®s,®s); 
 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 回复
						 
						 
           
          
          
         
   
         
      
 
   
             
                  
                  
 
 
 
     
	 
  
	Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
	
	意见反馈 | 
	关于直线 | 
	版权声明 | 
	会员须知