利用C++11结合Easyx简单实现并发接收键盘鼠标消息
说明:本示例开发环境为vs2019 & 且需要C++11语法支持,旨在帮助初学者能够以更便捷的方式使用IO设备。
头文件中的两个监听器专门用于监听鼠标、键盘消息。
两个监听器的参数均为函数指针,因此事件触发后具体执行哪些事情完全由你来决定。你只需要编写两个对应的处理函数并且其传递给对应的监听器即可。
鼠标处理函数声明式:
void deal_mousefunc(MOUSEMSG mouse_data);
键盘处理函数声明式:void deal_keyfunc(int keyboard_data);
具体请参考示例程序。
函数接口以及必要的函数类型定义:
IODevice.h:
#ifndef __IODEVICE__
#define __IODEVICE__
#include <graphics.h>
#include <conio.h>
#include <thread>
#include <memory>
typedef void deal_keyfunc(int);
typedef void deal_mousefunc(MOUSEMSG);
/*
* @function: 开辟一个新线程,用以监听键盘事件,考虑到避免内存泄漏,我们将新开辟的线程对象以unique_ptr封装返回。
* 对捕获到鼠标数据将其交于参数中的函数处理。
* @return value:指向开辟的新线程对象的一个unique_ptr;
* @第一参数:接收到鼠标数据后的处理函数(func pointer..),用于处理来自鼠标的数据
* for example:
* void deal_key_func(int key_data){...}//对接收到的鼠标数据进行处理
* auto thread_1 = listening_mouse(deal_mouse_func);
**/
std::unique_ptr<std::thread> listening_mouse(deal_mousefunc* func);
/*
* @function: 开辟一个新线程,用以监听鼠标事件,考虑到避免内存泄漏,我们将新开辟的线程对象以unique_ptr封装返回。
* @return value:指向开辟的新线程对象的一个unique_ptr;
* @第一参数:接收到键盘数据后的处理函数(func pointer..),用于处理来自键盘的数据
* for example:
* void deal_key_func(int from_key_data){...}//对接收到的键盘数据进行处理
* auto thread_2 = listening_key(deal_key_func);
*/
std::unique_ptr<std::thread> listening_key(deal_keyfunc* func);
#endif // __IODEVICE__
IODevice.cpp:文章来源:https://www.toymoban.com/news/detail-796444.html
#include "IODevice.h"
std::unique_ptr<std::thread> listening_mouse(deal_mousefunc* func) {
//Create a new thread...
std::unique_ptr<std::thread> u_ptr(new std::thread([func]() {
//loop listening the message from mouse.
while (1)
{
while (!MouseHit()) std::this_thread::yield();
func(GetMouseMsg());
}
}));
u_ptr->detach();
return u_ptr;
}
std::unique_ptr<std::thread> listening_key(deal_keyfunc* func) {
//Create a new thread...
std::unique_ptr<std::thread> u_ptr(new std::thread([func]() {
//loop listening the message from keyboard.
while (1) {
while (!_kbhit()) std::this_thread::yield();
func(_getch());
}
}));
u_ptr->detach();
return u_ptr;
}
程序示例:
#include <easyx.h>
#include <stdio.h>
#include <graphics.h>
#include "IODevice.h"
//键盘响应处理函数(这里由你根据自己的需要的功能自定义即可,我们只需将其传递给键盘监听器)----------------------->
void deal_key_func(int key_data) {
LOGFONT f;
gettextstyle(&f); // 获取当前字体设置
f.lfHeight = 20; // 设置字体高度
wcscpy_s(f.lfFaceName, _T("黑体")); // 设置字体为“黑体”(高版本 VC 推荐使用 _tcscpy_s 函数)
f.lfQuality = ANTIALIASED_QUALITY; // 设置输出效果为抗锯齿
settextstyle(&f); // 设置字体样式
switch (key_data)
{
case 'w':
outtextxy(100, 100, _T("I push button: w"));
break;
case 'a':
outtextxy(100, 100, _T("I push button: a"));
break;
case 'd':
outtextxy(100, 100, _T("I push button: d"));
break;
case 's':
outtextxy(100, 100, _T("I push button: s"));
break;
default:
break;
}
}
//鼠标响应处理函数(这里由你根据自己的需要的功能自定义即可,我们只需将其传递给鼠标监听器)---------------------->
void deal_mouse_func(MOUSEMSG mouse_message) {
TCHAR message__[100];
settextcolor(BLACK);
if (mouse_message.uMsg == WM_MOUSEMOVE)
{
swprintf_s(message__, _T("Mouse coordinate is: [%d,%d]"), mouse_message.x, mouse_message.y);
outtextxy(0, 0, message__);
}
}
int main()
{
initgraph(1200, 780);
setbkcolor(WHITE);
cleardevice();
settextcolor(BLACK);
auto thread1 = listening_key(deal_key_func); //这里调用键盘监听器并将自定义的处理函数传递过来
auto thread2 = listening_mouse(deal_mouse_func);//这里调用鼠标监听器并将自定义的处理函数传递过来
while (1);
return 0;
}
运行结果:
文章来源地址https://www.toymoban.com/news/detail-796444.html
到了这里,关于基于Easyx实现同时接收键盘鼠标消息的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!