消息处理——漂亮的按钮(鼠标)
用到的函数
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));
else
setfillcolor(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);
//设置窗口的颜色使用:setbkcolor
setbkcolor(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();
//把消息类型设置为0
msg.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);//屏幕方向为正120
break;
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);
//设置窗口的颜色使用:setbkcolor
setbkcolor(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);//防止小球移动太快
//把消息类型设置为0
msg.message = 0;
}
//防止程序退出
Sleep(100000);
return 0;
}
上面代码可以根据键盘上下左右移动一个小球
根据键盘上下左右移动小球,也可以修改小球的移动速度