正题:
EasyX提供了记录并判断玩家使用鼠标对窗体进行的操作,这些操作会放在操作列表中,等待被处理。
getmassage函数
getmassage函数是从消息列表中获取一个消息,并将该消息移除,程序会根据这条消息进行相关的响应。
这个函数有两次重载,但是功能相同
若getmessage()函数传入参数是-1,表示获取所有类型的消息。
如果不需要读取所有类型的消息,可以单独写某一种,或者利用|(或)运算符进行合并。
创建一个ExMessage变量
如果我们鼠标消息和键盘消息都想要,其他两种可以不读取
ExMessage msg; msg = getmessage(EX_MOUSE | EX_CHAR);
ExMessage结构体如下
消息标识:传入的参数为鼠标消息就使用鼠标的结构体,传入参数是什么,就调用哪个结构体。
消息标识:
我们这节课只讲鼠标消息类型,所以只举例说明鼠标消息标识
对照上表,实现鼠标移动时绘制一个半径为2的黑色的填充圆,左键按下绘制半径为20的蓝色填充圆,右键按下绘制黄色半径为50的填充五角星。
代码如下:
#include <stdio.h> #include <easyx.h> #include <stdlib.h> #include <math.h> #define Pai 3.14 int main() { initgraph(800, 600); setbkcolor(WHITE); cleardevice(); ExMessage msg; while (1) { msg = getmessage(EX_MOUSE); switch(msg.message) { case WM_MOUSEMOVE://在移动过程中 setfillcolor(BLACK); solidcircle(msg.x, msg.y, 2); break; case WM_LBUTTONDOWN://在移动过程中 setfillcolor(BLUE); solidcircle(msg.x, msg.y, 20); break; case WM_RBUTTONDOWN: setfillcolor(GREEN); int r = 50;//半径 //初始角度 double theta = Pai / 2; //递增角度 double delta = 2 * Pai / 5; POINT points[5];//定义一个数组,存放点的坐标 for (int i = 0; i < 5; i++) { points[i].x = cos(theta + i * delta * 2) * r+msg.x; points[i].y = sin(theta + i * delta * 2) * r+msg.y; } setfillcolor(YELLOW); setpolyfillmode(WINDING); solidpolygon(points, 5); break; } } return 0; }
运行后如图
之前的操作都默认为单击事件,不论我们点击的有多快,都还是会判定为单击事件。
在创建窗体时,加上EX_DBLCLKS即可识别双击事件。
initgraph(800, 600, EX_DBLCLKS);
要注意:EX_DBCLICKS这个版本已经不能在VS上使用了。
更改代码,双击出现五角星,左击蓝色圆,右击红色圆,左边双击黄色五角星。
while (1) { msg = getmessage(EX_MOUSE); switch(msg.message) { case WM_MOUSEMOVE://在移动过程中 setfillcolor(BLACK); solidcircle(msg.x, msg.y, 5); break; case WM_LBUTTONDOWN://在移动过程中 setfillcolor(BLUE); solidcircle(msg.x, msg.y, 20); break; case WM_RBUTTONDOWN://在移动过程中 setfillcolor(RED); solidcircle(msg.x, msg.y, 20); break; case WM_LBUTTONDBLCLK: setfillcolor(GREEN); int r = 50;//半径 //初始角度 double theta = Pai / 2; //递增角度 double delta = 2 * Pai / 5; POINT points[5];//定义一个数组,存放点的坐标 for (int i = 0; i < 5; i++) { points[i].x = cos(theta + i * delta * 2) * r+msg.x; points[i].y = sin(theta + i * delta * 2) * r+msg.y; } setfillcolor(YELLOW); setpolyfillmode(WINDING); solidpolygon(points, 5); break; } }
运行后如图
音频播放
v趣味化编程,只有画面可不行,我们要声色俱全,如果我们玩一个小游戏,一定会有相应的背景音乐。
认识一个新函数mciSendString
MCIERROR mciSendString( LPCTSTR lpszCommand,//命令字符串,如open,close, LPTSTR lpszReturnString,//接收返回信息的字符串,一般直接填NULL UINT cchReturn,//返回信息的长度,可以直接填零 HANDLE hwndCallback,//回调窗口句柄,一般直接填NULL );
在播放之前要将播放的歌曲放置在工程目录下。
当我们在使用时却会报错
这是因为这个函数在库winmm.lib中,默认情况下链接器不会输入这个库文件。
添加库winmm.lib
点击添加即可
将库添加即可
我们这里用到了汉语,所以要将字符集设置为未设置
代码如下
int main() { mciSendString("open 及你太美.mp3", NULL, 0, NULL);//打开音乐,没有进行播放 printf("打开音乐"); getchar(); mciSendString("play 及你太美.mp3", NULL, 0, NULL);//播放 printf("播放音乐"); getchar(); mciSendString("pause 及你太美.mp3", NULL, 0, NULL);//暂停播放 printf("暂停"); getchar(); mciSendString("resume 及你太美.mp3", NULL, 0, NULL);//继续播放 printf("继续"); getchar(); mciSendString("stop 及你太美.mp3", NULL, 0, NULL);//停止播放 printf("停止"); getchar(); mciSendString("close 及你太美.mp3", NULL, 0, NULL);//关闭音乐 printf("关闭"); getchar(); return 0; }
现在就可以实现一个坤坤播放器
创建窗体,将所用到的材料都放在工程目录里。
绘制坤坤.png作为背景
大概找出篮球的区域就可以编写程序了。
代码如下
int main() { int key = 1; initgraph(600,600, EX_DBLCLKS); IMAGE img; //创建窗体 loadimage(&img, "坤坤.png", 600, 600); putimage(0, 0, &img); mciSendString("open 及你太美.mp3", NULL, 0, NULL);//打开音乐,没有进行播放 //如果我们点击篮球,就会播放歌曲 ExMessage msg; while (key) { msg = getmessage(EX_MOUSE); switch(msg.message) { case WM_LBUTTONDOWN://左击 if (msg.x > 0 && msg.x < 600 && msg.y>450 && msg.y < 600) { mciSendString("play 及你太美.mp3", NULL, 0, NULL);//播放 } break; case WM_RBUTTONDOWN://右击 if (msg.x > 0 && msg.x < 600 && msg.y>450 && msg.y < 600) { mciSendString("pause 及你太美.mp3", NULL, 0, NULL);//暂停 } break; case WM_LBUTTONDBLCLK://右键双击关闭音乐 mciSendString("close 及你太美.mp3", NULL, 0, NULL);//关闭音乐 key = 0; break; } } closegraph(); return 0; }
运行后点击左键播放,点击右键暂停,双击右键就关闭音乐结束程序。
这个小程序虽然很短,但已经运用了今天的大部分所学,希望大家能够理解。
本文结束啦,下文见!