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