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

这篇具有很好参考价值的文章主要介绍了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()函数支持斜向移动文章来源地址https://www.toymoban.com/news/detail-773955.html

#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;
}

到了这里,关于easyx学习笔记(五):键盘消息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • easyx图形库基础:2.基本运动+键盘交互

    1.如何实现动画: 相信大家已经对动画的原理已经不陌生了。想要目标物体动起来,只需要逐个播放目标物体每一时刻位置的图片。只要播放的速度足够快,人们就会在视觉上认为目标物体动起来了。 帧率:具有连续性的一些图片在1秒中绘制的个数。 物体运动的速度单位一

    2024年02月12日
    浏览(30)
  • EasyX图形库note4,动画及键盘交互

    大家好,这里是Dark Flame Master,专栏从这篇开始就会变得很有意思,我们可以利用今天所学的只是实现很多功能,同样为之后的更加好玩的内容打下基础,从这届开始将会利用所学的知识制作一些小游戏,废话不多说,开始今天的内容。 专栏:EasyX图形化编程 在之前的笔记中

    2024年02月08日
    浏览(36)
  • EasyX 创建输入框,支持多行,中文输入,鼠标操作。

    自绘输入框的方法就不说了,这里介绍一下 hieasyx,一个基于 EasyX 的扩展库,这个库的 github 链接是: https://github.com/zouhuidong/HiEasyX HiEasyX 支持创建多绘图窗口,拥有相对完善的控件库,支持透明通道,封装了画布、图层和场景。 这个库把 Win32 控件封装了起来,可以很方便地

    2024年02月11日
    浏览(31)
  • Easyx趣味编程7,鼠标消息读取及音频播放

    hello大家好,这里是dark flame master,今天给大家带来Easyx图形库最后一节功能实现的介绍,前边介绍了绘制各种图形及键盘交互,文字,图片等操作,今天就可以使写出的程序更加生动且容易操控。一起学习吧! 由于会用到前边的内容 专栏:Easyx趣味编程 正题: EasyX提供了记

    2024年02月08日
    浏览(35)
  • Matlab键盘鼠标输入学习及PsychToolBox对刺激反应结果的保存

    包括键盘监听 KbWait KbCheck 、鼠标监听 GetMouse 如图为鼠标绘制的图像: 之前的代码参考上一篇文章:Psychtoolbox使用Screen时间控制以帧随机播放图片 在反应收集部分添加键盘输入项,对应保存结果。被试者对图片刺激进行判断给出反应结果。 被试者反应结果( 键位、匹配结果

    2024年02月16日
    浏览(26)
  • LVGL学习笔记 28 - 键盘keyboard

    目录 1. 设置关联文本框 2. 设置模式 2.1 LV_KEYBOARD_MODE_TEXT_LOWER 2.2 LV_KEYBOARD_MODE_TEXT_UPPER 2.3 LV_KEYBOARD_MODE_SPECIAL 2.4 LV_KEYBOARD_MODE_NUMBER 2.5 LV_KEYBOARD_MODE_USER_1 ~ LV_KEYBOARD_MODE_USER_4 3. 使能弹窗模式 4. 更改按键布局 5. 事件 键盘是一个特殊的按键矩阵,自身实现了按键(map)映射和其他

    2024年02月13日
    浏览(32)
  • 51单片机学习笔记-4矩阵键盘

    [toc] 注:笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 注:工程及代码文件放在了本人的Github仓库。 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。采用逐行或逐列的“扫描”,就可以读

    2024年02月06日
    浏览(38)
  • STM32学习笔记——3*3矩阵键盘

    1. 键盘的焊接 键盘正面 键盘背面 键盘原理图: 3*3的矩阵键盘共计三行三列,所以共计需要六个阵脚,每一行/每一列连接相应的一个阵脚。 制作注意事项: 要注意开关的四个针脚,了解清楚哪两个针脚之间是连通的。     四角按键开关原理可以参考博客: 四脚按键开关

    2024年02月11日
    浏览(26)
  • 按键输入实验--GPIO做输入-学习笔记

    按键输入实验 1.首先,按键实验是GPIO口的另一应用,上一次的跑马灯实验是将GPIO口作为输出,此次按键实验是将GPIO口作为输入。 2.GPIO作为输入时和输入的不同: (1)首先,上拉电阻是为了保证在没有信号输入的时候,IO口保持高电平,若按键为低电平有效,则没有信号的

    2024年02月09日
    浏览(36)
  • 消息队列学习笔记

    异步处理:处理完关键步骤后直接返回结果,后续放入队列慢慢处理 流量控制: 使用消息队列隔离网关和后端服务,以达到流量控制和保护后端服务的目的。能根据下游的处理能力自动调节流量,达到“削峰填谷”的作用 网关在收到请求后,将请求放入请求消息队列; 后端

    2024年02月12日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包