EasyX是一个很出名的C++图形库,它的功能丰富。在我用它来做小游戏的时候,我发现它没有直接的按钮函数,如果要画弄按钮来会很费劲,因为后期还要检测和判断鼠标或键盘的一些事件,分开来操作会很麻烦,那能不能自己写一个函数呢?一个可以把那些繁琐的步骤缩减的Button函数?
当然可以,我经过许多此次修改(后期如果有问题还会修改),最后写出了一个Button函数,函数很简单,我还配备了用法(有批注):
1、首先是定义函数:
//定义 void button(int x, int y, int weight, int height, string way, int r = 0, int tx = 0, int ty = 0, const char* text = "", COLORREF c = WHITE) { //函数定义的值分别是:左上角横坐标,左上角纵坐标,宽度,高度,是否圆角(赋值"R"为圆角,赋值"G"则不做圆角处理),圆角半径,文本横坐标,文本纵坐标,文本内容,按钮颜色(以上所有int类型的值,单位都为:1像素) COLORREF in = getfillcolor();//先获取当前(原先)的填充颜色,用于备份,因为后面会篡改填充颜色用于绘制按钮 setfillcolor(c);//设置按钮(Button)填充颜色 if (way == "G") {//如果是"G",则绘制无圆角的按钮(Button),也就是无圆角的矩形 solidrectangle(x, y, x+weight-1, y+height-1); outtextxy(tx, ty, text); } if (way == "R") {//如果是"R",则绘制有圆角的按钮(Button),也就是有圆角的矩形 solidroundrect(x, y, x+weight-1, y+height-1, r, r); outtextxy(tx, ty, text); } setfillcolor(in);//用备份好的填充颜色变量恢复之前被篡改的填充颜色,防止对Button函数外需要填充的步骤产生影响 }2、然后是用法:
//用法 ExMessage Mou_N;//定义消息结构体,在这里用于获取鼠标信息(ExMessage为消息结构体,来自"easyx.h") struct mouse{ int x; int y; }mou;//然后创建用于储存鼠标坐标的结构体(x,y) button(300, 720, 400, 780, "R", 30, 305 , 745, "Click", GREEN);//绘制按钮(里面的数据为示例) while (true) { BeginBatchDraw();//开始批量绘图 peekmessage(&Mou_N); if (Mou_N.message == WM_MOUSEMOVE) {//如果鼠标移动,获取鼠标坐标 mou.x = Mou_N.x; mou.y = Mou_N.y; } if (mou.x >= 300 and mou.x <= 400 and mou.y >= 720 and mou.y <= 780) {//判断鼠标是否移到指定位置(if语句中的数值为示例) button(300, 720, 400, 780, "R", 30, 305, 745, "Click", RED);//如果移到指定位置,改变按钮(Button)颜色。(这里改变的颜色是RED) if (Mou_N.message == WM_LBUTTONDOWN) {//判断鼠标是否点击 //如果满足,则执行if语句里的内容(总结:按钮被点击) } } else { button(300, 720, 400, 780, "R", 30, 305 , 745, "Click", GREEN);//如果只是移到指定的位置,但没被点击,按钮(Button)保持原来的状态。(这里原色是GREEN) } FlushBatchDraw();//结束批量绘制 }如果大家想要方便套用模板,这里我也给大家搞了一个没有批注的:
1、定义:
void button(int x, int y, int weight, int height, string way, int r = 0, int tx = 0, int ty = 0, const char* text = "", COLORREF c = WHITE) { COLORREF in = getfillcolor(); setfillcolor(c); if (way == "G") { solidrectangle(x, y, x+weight-1, y+height-1); outtextxy(tx, ty, text); } if (way == "R") { solidroundrect(x, y, x+weight-1, y+height-1, r, r); outtextxy(tx, ty, text); } setfillcolor(in); }2、用法:
ExMessage Mou_N; struct mouse{ int x; int y; }mou; button(300, 720, 400, 780, "R", 30, 305 , 745, "Click", GREEN); while (true) { BeginBatchDraw(); peekmessage(&Mou_N); if (Mou_N.message == WM_MOUSEMOVE) { mou.x = Mou_N.x; mou.y = Mou_N.y; } if (mou.x >= 300 and mou.x <= 400 and mou.y >= 720 and mou.y <= 780) { button(300, 720, 400, 780, "R", 30, 305, 745, "Click", RED); if (Mou_N.message == WM_LBUTTONDOWN) { } } else { button(300, 720, 400, 780, "R", 30, 305 , 745, "Click", GREEN); } FlushBatchDraw(); }最后,感谢大家的观看,如果有什么问题可以在评论区指出或私信我。谢谢!!!