easyx学习笔记(五):键盘消息

 学习视频【C/C++/EasyX】学编程,做游戏,小白快速入门图形编编程

目录

getch();需要使用返回值来判断

        控制圆形移动:

        代码问题1:

        代码问题2:

GetAsyncKeyState(键值);


非easyx函数:

 用于获取键盘消息的函数

 getch();                                需要头文件conio.h

GetAsyncKeyState(键值);  需要头文件windows.h,由于EasyX包含了Windows头文件,所以无需自己包含

getch();需要使用返回值来判断

        与非ASCII表字符的按键比较,需要使用虚拟键值        上:72        下:80        左:75        右:77

        与字母比较直接写字母

        getch()函数只支持上下左右移动

        如:

char key = _getch();

		switch (key)
		{
			//上键  
		case 72:    //对应向上箭头
		case 'w':
		case 'W':
			cout << "上" << endl;
			break;

			//下键
		case 80:    //对应向下箭头
		case 's':
		case 'S':
			cout << "下" << endl;
			break;

			//左键
		case 75:    //对应向左箭头
		case 'a':
		case 'A':
			cout << "左" << endl;
			break;

			//右键
		case 77:    //对应向右箭头
		case 'd':
		case 'D':
			cout << "右" << endl;
			break;
		}

        控制圆形移动:

#include<iostream>
#include<graphics.h>//包含图形库头文件
#include<easyx.h>//包含图形库头文件
#include<conio.h>//使用_getch()
using namespace std;

//绘制按钮  x,y为左上角坐标  w为按钮宽度,h为按钮高度
void button(int x, int y, int w, int h,const char* text)
{
	setfillcolor(RGB(0, 162, 232));//圆角矩形填充颜色
	fillroundrect(x, y, x + w, y + h, 10, 10);//绘制圆角矩形

	char arr[50];
	strcpy_s(arr, text);//将text中的字符拷贝到arr里

	setbkmode(TRANSPARENT);//文字背景透明
	settextstyle(30, 0, "楷体");//文字样式
	outtextxy(x + ((w - textwidth(arr) )/2), y + (h-textheight(arr))/2, arr);//居中绘制文字
}

//绘制图片
void image()
{
	IMAGE img;
	loadimage(&img, "./图片1.png",200,150);
	putimage(0, 0, &img);
}


int main()
{
	//创建一个窗口,确定窗口大小
	initgraph(640, 480,EW_SHOWCONSOLE);

	ExMessage msg;//结构体 用于保存鼠标消息

	int x = 0, y = 0;

	//控制球移动
	while (1)
	{
		setbkcolor(RGB(225, 127, 39));//设置背景颜色
		cleardevice();//清屏 设置背景颜色后要清屏才能将背景颜色设置好
		button(200, 200, 150, 100, "button");//绘制按钮  用于测试
		image();//绘制图片	用于引出BeginBatchDraw()	EndBatchDraw()	FlushBatchDraw()三个函数

		setfillcolor(BROWN);
		fillcircle(x, y, 50);//绘制圆


		char key = _getch();

		//控制圆移动
		switch (key)
		{
			//上键
		case 72:
		case 'w':
		case 'W':
			cout << "上" << endl;
			y-=5;//如果按上键 y坐标向上移动5	因为向下为正所以是-5
			break;

			//下键
		case 80:
		case 's':
		case 'S':
			cout << "下" << endl;
			y+=5;
			break;

			//左键
		case 75:
		case 'a':
		case 'A':
			cout << "左" << endl;
			x-=5;
			break;

			//右键
		case 77:
		case 'd':
		case 'D':
			cout << "右" << endl;
			x+=5;
			break;
		}


        //鼠标操作
		if (peekmessage(&msg, EM_MOUSE))
		{
			switch (msg.message)
			{
				//如果左键按下
			case WM_LBUTTONDOWN:
				if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
				{
					cout << "点击了左键" << endl;
				}
				break;
			case WM_RBUTTONDOWN:
				if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
				{
					cout << "点击了右键" << endl;
				}
				break;
			}
		}
		
	}
	
	
	//防止闪退
	getchar();

	//关闭窗口
	closegraph();

	return 0;
}

       

        代码问题1:

        设备在不断进行绘图操作时会出现闪屏现象(图片闪烁)可使用

                                BeginBatchDraw()        // 开始批量绘图。

                                        绘图代码

                                EndBatchDraw()        //用于结束批量绘制,并执行未完成的绘制任务。

        以解决这个问题

//前面的代码就不重复啦直接从while开始

//控制球移动
	while (1)
	{
		//绘制操作前加上BeginBatchDraw();
		BeginBatchDraw();

		setbkcolor(RGB(225, 127, 39));//设置背景颜色
		cleardevice();//清屏 设置背景颜色后要清屏才能将背景颜色设置好
		button(200, 200, 150, 100, "button");//绘制按钮  用于测试
		image();//绘制图片	用于引出BeginBatchDraw()	EndBatchDraw()	FlushBatchDraw()三个函数

		setfillcolor(BROWN);
		fillcircle(x, y, 50);//绘制圆

		//绘制完成后加上  EndBatchDraw();或者FlushBatchDraw();
		EndBatchDraw();//或者FlushBatchDraw();
		

		char key = _getch();

		//控制圆移动
		switch (key)
		{
			//上键
		case 72:
		case 'w':
		case 'W':
			cout << "上" << endl;
			y-=5;//如果按上键 y坐标向上移动5	因为向下为正所以是-5
			break;

			//下键
		case 80:
		case 's':
		case 'S':
			cout << "下" << endl;
			y+=5;
			break;

			//左键
		case 75:
		case 'a':
		case 'A':
			cout << "左" << endl;
			x-=5;
			break;

			//右键
		case 77:
		case 'd':
		case 'D':
			cout << "右" << endl;
			x+=5;
			break;
		}

		if (peekmessage(&msg, EM_MOUSE))
		{
			switch (msg.message)
			{
				//如果左键按下
			case WM_LBUTTONDOWN:
				if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
				{
					cout << "点击了左键" << endl;
				}
				break;
			case WM_RBUTTONDOWN:
				if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
				{
					cout << "点击了右键" << endl;
				}
				break;
			}
		}
		
	}

        代码问题2:

        getch()为阻塞函数,不输入就一直在getch()处等待(运行上文代码的时候可以发现,鼠标在按钮处点击没有反应)

        解决方案

        使用kbhit()函数:检查当前是否有键盘输入,若有则返回一个非0值,否则返回0。

//继续修改while内代码    将switch部分用if(kbhit())包含起来

//控制球移动
	while (1)
	{
		//绘制操作前加上BeginBatchDraw();
		BeginBatchDraw();

		setbkcolor(RGB(225, 127, 39));//设置背景颜色
		cleardevice();//清屏 设置背景颜色后要清屏才能将背景颜色设置好
		button(200, 200, 150, 100, "button");//绘制按钮  用于测试
		image();//绘制图片	用于引出BeginBatchDraw()	EndBatchDraw()	FlushBatchDraw()三个函数

		setfillcolor(BROWN);
		fillcircle(x, y, 50);//绘制圆

		//绘制完成后加上  EndBatchDraw();或者FlushBatchDraw();
		EndBatchDraw();//或者FlushBatchDraw();
		
		//如果检测到有键盘输入再读入
		if (_kbhit())
		{
			char key = _getch();

			//控制圆移动
			switch (key)
			{
				//上键
			case 72:
			case 'w':
			case 'W':
				cout << "上" << endl;
				y -= 5;//如果按上键 y坐标向上移动5	因为向下为正所以是-5
				break;

				//下键
			case 80:
			case 's':
			case 'S':
				cout << "下" << endl;
				y += 5;
				break;

				//左键
			case 75:
			case 'a':
			case 'A':
				cout << "左" << endl;
				x -= 5;
				break;

				//右键
			case 77:
			case 'd':
			case 'D':
				cout << "右" << endl;
				x += 5;
				break;
			}
		}

GetAsyncKeyState(键值);

需要传入一个键值,如果按下返回真                上:VK_UP        下:VK_DOWN        左:VK_LEFT        右:VK_RIGHT

GetAsyncKeyState()函数支持斜向移动

#include<iostream>
#include<graphics.h>//包含图形库头文件
#include<easyx.h>//包含图形库头文件
#include<conio.h>//使用_getch()
using namespace std;

//绘制按钮  x,y为左上角坐标  w为按钮宽度,h为按钮高度
void button(int x, int y, int w, int h,const char* text)
{
	setfillcolor(RGB(0, 162, 232));//圆角矩形填充颜色
	fillroundrect(x, y, x + w, y + h, 10, 10);//绘制圆角矩形

	char arr[50];
	strcpy_s(arr, text);//将text中的字符拷贝到arr里

	setbkmode(TRANSPARENT);//文字背景透明
	settextstyle(30, 0, "楷体");//文字样式
	outtextxy(x + ((w - textwidth(arr) )/2), y + (h-textheight(arr))/2, arr);//居中绘制文字
}

//绘制图片
void image()
{
	IMAGE img;
	loadimage(&img, "./图片1.png",200,150);
	putimage(0, 0, &img);
}


int main()
{
	//创建一个窗口,确定窗口大小
	initgraph(640, 480,EW_SHOWCONSOLE);


	ExMessage msg;//结构体 用于保存鼠标消息

	int x = 0, y = 0;

	//控制球移动
	while (1)
	{
		//绘制操作前加上BeginBatchDraw();
		BeginBatchDraw();

		setbkcolor(RGB(225, 127, 39));//设置背景颜色
		cleardevice();//清屏 设置背景颜色后要清屏才能将背景颜色设置好
		button(200, 200, 150, 100, "button");//绘制按钮  用于测试
		image();//绘制图片	用于引出BeginBatchDraw()	EndBatchDraw()	FlushBatchDraw()三个函数

		setfillcolor(BROWN);
		fillcircle(x, y, 50);//绘制圆

		//绘制完成后加上  EndBatchDraw();或者FlushBatchDraw();
		EndBatchDraw();//或者FlushBatchDraw();
		

		//上键
		if (GetAsyncKeyState(VK_UP))
		{
			cout << "上" << endl;
			y -= 1;//如果按上键 y坐标向上移动5	因为向下为正所以是-5
		}
		//下键
		if (GetAsyncKeyState(VK_DOWN))
		{
			cout << "下" << endl;
			y += 1;
		}
		//左键
		if (GetAsyncKeyState(VK_LEFT))
		{
			cout << "左" << endl;
			x -= 1;
		}
		//右键
		if (GetAsyncKeyState(VK_RIGHT))
		{
			cout << "右" << endl;
			x += 1;
		}
		if (peekmessage(&msg, EM_MOUSE))
		{
			switch (msg.message)
			{
				//如果左键按下
			case WM_LBUTTONDOWN:
				if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
				{
					cout << "点击了左键" << endl;
				}
				break;
			case WM_RBUTTONDOWN:
				if (msg.x >= 200 && msg.x <= 200 + 150 && msg.y >= 200 && msg.y <= 200 + 100)//判断鼠标点击是否在按钮内
				{
					cout << "点击了右键" << endl;
				}
				break;
			}
		}
		
	}
	
	
	//防止闪退
	getchar();

	//关闭窗口
	closegraph();

	return 0;
}

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值