消息处理——漂亮的按钮(鼠标)
用到的函数
1.消息结构体变量类型:使用ExMessage
ExMessage msg{ 0 };
定义一个变量名为msg的ExMessage结构体变量并初始化为0
2.获取消息函数:peekmessage函数
//获取消息
peekmessage(&msg, EX_MOUSE);
两个参数 1.代表获取位置,2。代表类型(EX_MOUSE代表鼠标;EX_KEY代表键盘)
3.双缓冲绘图: BeginBatchDraw()和EndBatchDraw()(所有的绘图代码必须放在begin和end之间)
使用鼠标操作需要在窗口函数initgraph第三个参数加上EX_DBLCLKS
initgraph(640, 480, EX_SHOWCONSOLE || EX_DBLCLKS);
制作鼠标按钮总代码
#include<stdio.h>
#include<graphics.h>//定义消息结构体变量
ExMessage msg{ 0 };//mx,my是否在指定的矩形区域
bool inarea(int mx, int my, int x, int y, int w, int h)
{if (mx > x && mx<x + w && my>y && my < y + h)return true;return false;
}bool button(int x, int y, int w, int h, const char* text)
{//绘制按钮颜色if (inarea(msg.x, msg.y, x, y, w, h))//鼠标在按钮内的颜色setfillcolor(RGB(93, 107, 153));elsesetfillcolor(RGB(230, 231, 232));//鼠标在按钮外的颜色fillroundrect(x, y, x + w, y + h, 8, 8);//制作圆角矩形//绘制按钮文本int hspace = (w - textwidth(text)) / 2;int vspace = (h - textheight(text)) / 2;outtextxy(x + hspace, y + vspace, text);//判断按钮是否被点击if (msg.message == WM_LBUTTONDOWN && inarea(msg.x, msg.y, x, y, w, h))return true;return false;
}int main()
{//创建一个图形窗口函数 宽度+高度initgraph(640, 480, EX_SHOWCONSOLE || EX_DBLCLKS);//设置窗口的颜色使用:setbkcolorsetbkcolor(RGB(67, 210, 255));//RGB三原色//用设置的背景颜色填充整个窗口cleardevice();//设置背景模式setbkmode(TRANSPARENT);while (true){//获取消息peekmessage(&msg, EX_MOUSE);//双缓冲绘图:所有的绘图代码必须放在begin和end之间BeginBatchDraw();cleardevice();//清屏if (button(20, 20, 150, 35, "start game!")){printf("start game!\n");}if (button(300, 20, 150, 35, "end game!")){printf("end game!\n");}EndBatchDraw();//把消息类型设置为0msg.message = 0;}//防止程序退出Sleep(100000);return 0;
}
鼠标在按钮外的样子
鼠标在按钮内的样子
可以设置鼠标左右键执行不同的操作
while (true){//获取消息if (peekmessage(&msg, EX_MOUSE))//bool类型{switch (msg.message){case WM_LBUTTONDOWN: //左键按下printf("鼠标左键按下\n");break;case WM_RBUTTONDOWN: //右键按下printf("右键按下 pos(%d,%d)\n", msg.x, msg.y);//输出鼠标点击的坐标break;case WM_MBUTTONDOWN: //中键按下printf("中键按下\n");break;case WM_MOUSEWHEEL: //滚轮滚动printf("滚轮滚动 dir(%d)\n", msg.wheel);//屏幕方向为正120break;case WM_LBUTTONDBLCLK: //左键双击printf("左键双击\n");break;case WM_MOUSEMOVE: //鼠标移动//printf("鼠标移动\n");break;}}}
msg.message是结构体内的一个成员
消息处理——按键消息
#include<stdio.h>
#include<graphics.h>//定义消息结构体变量
ExMessage msg{ 0 };int main()
{//创建一个图形窗口函数 宽度+高度initgraph(640, 480, EX_DBLCLKS);//设置窗口的颜色使用:setbkcolorsetbkcolor(RGB(67, 210, 255));//RGB三原色//用设置的背景颜色填充整个窗口cleardevice();//定义小球属性int x = 50, y = 50, r = 24;int speed = 4;//小球移动速度int vx = 0;//小球变化方向int vy = 0;//小球变化方向while (true){//获取消息peekmessage(&msg, EX_KEY);//判断按键消息if (msg.message == WM_KEYDOWN){//具体判断是哪个键按下switch (msg.vkcode){case VK_UP: //上键按下vy = -1;break;case VK_DOWN: //下键按下vy = 1;break;case VK_LEFT: //左键按下vx = -1;break;case VK_RIGHT: //右键按下vx = 1;break;case VK_SPACE: //空格break;case 'A': //字母键必须大写字符break;}}else if (msg.message == WM_KEYUP){switch (msg.vkcode){case VK_UP: //上键按下vy = 0;break;case VK_DOWN: //下键按下vy = 0;break;case VK_LEFT: //左键按下vx = 0;break;case VK_RIGHT: //右键按下vx = 0;break;}}//双缓冲绘图:所有的绘图代码必须放在begin和end之间BeginBatchDraw();cleardevice();//清屏//绘制小球setfillcolor(RGB(255, 278, 255));solidcircle(x, y, r);//更新小球的位置x += speed * vx;y += speed * vy;EndBatchDraw();Sleep(10);//防止小球移动太快//把消息类型设置为0msg.message = 0;}//防止程序退出Sleep(100000);return 0;
}
上面代码可以根据键盘上下左右移动一个小球
根据键盘上下左右移动小球,也可以修改小球的移动速度