自制按键显示的程序

自制按键显示的程序

文章目录

  • 自制按键显示的程序
    • 0. 介绍
    • 1. 界面设计
    • 2. 代码
    • 3. 效果
    • 4. 总结
    • References

0. 介绍

在看一些 up 主讲解 vim/emacs 等软件的界面操作时,使用了显示按键的软件。

据说蒋炎炎讲课用的是自己写的,一度以为很神奇。 现在我们用 SFML 手搓一个极其简陋的 demo 版本。

1. 界面设计

不需要复杂界面, 不需要托管图标, 不需要隐藏窗口, 不需要动态变化的窗口。

就弄一个长条形的窗口即可。 不考虑多行显示。

清除内容: 每当用户超过1秒没有输入内容, 或者本次输入内容和上次输入相差了1秒以上, 就清空以前的内容。

如果连续两次按下的按键,在1秒之内, 那么追加内容。 判断1秒, 是通过判断60帧来决定的, 因为我设定了 fps=60.

2. 代码

严格说,用 SFML 的 text 显示输入文本,不是特别合适, 比如可能只需要一次渲染而不是每个字符渲染一次。 但是没关系, 原型设计,20分钟写出代码验证想法。

关于键盘按键的表示:看一下官方 tutorial 文档,以及 SFML 源代码中 include/SFML/Window/keyboard.hpp . 简单起见我只处理了A-Z的字符, 以及Ctrl, Esc, [ 和 ].

#include <iostream>
#include <vector>
#include <iterator>
#include <SFML/Graphics.hpp>int main()
{constexpr int win_width = 800;constexpr int win_height = 200;const std::string title = "show typed keys - SFML";sf::RenderWindow window(sf::VideoMode(win_width, win_height), title);window.setFramerateLimit(60);sf::Font font;const std::string asset_dir = "../../games/Resources";if (!font.loadFromFile(asset_dir + "/Arial.ttf")){std::cerr << "failed to load font\n";return 1;}std::vector<std::string> keys;int frame_index = 0;int prev_press_frame = 0;while (window.isOpen()){int press_frame = -1;sf::Event event;std::vector<std::string> cur_keys;while (window.pollEvent(event)){switch (event.type){case sf::Event::Closed: window.close(); break;case sf::Event::KeyReleased: // see include/SFML/Window/Keyboard.hpp for refif (event.key.code >= sf::Keyboard::Key::A && event.key.code <= sf::Keyboard::Key::Z){std::string key(1, 'A' + (event.key.code - sf::Keyboard::Key::A));cur_keys.push_back(key);}if (event.key.code == sf::Keyboard::Key::Space) cur_keys.push_back(" ");if (event.key.code == sf::Keyboard::Key::LControl) cur_keys.push_back("Ctrl");if (event.key.code == sf::Keyboard::Key::RControl) cur_keys.push_back("Ctrl");if (event.key.code == sf::Keyboard::Key::Escape) cur_keys.push_back("Esc");if (event.key.code == sf::Keyboard::Key::LBracket) cur_keys.push_back("[");if (event.key.code == sf::Keyboard::Key::RBracket) cur_keys.push_back("]");press_frame = frame_index;break;default:break;}}window.clear();printf("[debug] frame_index=%d, press_frame=%d, prev_press_frame=%d\n",frame_index, press_frame, prev_press_frame);if (cur_keys.size() > 0){if (press_frame - prev_press_frame >= 60){keys.clear();keys = cur_keys;}else{std::copy(cur_keys.begin(), cur_keys.end(), std::back_inserter(keys));}prev_press_frame = press_frame;}else if (cur_keys.size() == 0){if (frame_index - prev_press_frame >= 60){keys.clear();frame_index = 0;prev_press_frame = 0;}}std::string content = "";for (int i = 0; i < keys.size(); i++){content = content + keys[i];}sf::Text text;text.setFont(font);text.setString(content);text.setCharacterSize(30);text.setFillColor(sf::Color::White);text.setPosition(20, 20);window.draw(text);window.display();frame_index++;}return 0;
}

3. 效果

请添加图片描述

4. 总结

由于先前几篇的练习, 对 SFML 有了基本的使用经验的情况下, 对于显示按键的实现能够快速上手。 主要思考点在于,怎样显示按键内容, 怎样清空内容。 通过判断相邻两次按键的时间差,大于1秒就清空, 否则保持原内容。 通过使用 switch case 语句,简化了 A-Z 的26个字母的判断。

这是一个非常简陋的 demo, 有时间的话可以做改进:

  • 界面改进: 显示多行, 把空格显示为 |-| 的字符
  • 框架库的更换: 使用 GUI 库,例如 imgui 作为替代
  • 添加托盘:需要为每个操作系统分别适配

References

  • https://www.sfml-dev.org/tutorials/2.6/window-inputs.php
  • https://cloud.tencent.com/developer/article/2167806

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/469413.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PhP+vue企业原材料采购系统_cxg0o

伴随着我国社会的发展&#xff0c;人民生活质量日益提高。互联网逐步进入千家万户&#xff0c;改变传统的管理方式&#xff0c;原材料采购系统以互联网为基础&#xff0c;利用php技术&#xff0c;结合vue框架和MySQL数据库开发设计一套原材料采购系统&#xff0c;提高工作效率的…

平时积累的FPGA知识点(6)

平时在FPGA群聊等积累的FPGA知识点&#xff0c;第六期&#xff1a; 1 万兆网接口&#xff0c;发三十万包&#xff0c;会出现掉几包的情况&#xff0c;为什么&#xff1f; 原因&#xff1a;没做时钟约束&#xff0c;万兆网接口的实现&#xff0c;本质上都是高速serdes&#xf…

小白学Halcon100例:如何获取物品中心坐标并展示

文章目录 *读入彩色图片*分解彩色图片为三通道*阈值分割*链接*选择特征*提取目标中心*绘制目标中心--*设置线宽为1*创建十字轮廓*清空窗体*设置绘制模式为绘制边缘*显示目标*显示目标中心*读入彩色图片

快速搭建PyTorch环境:Miniconda一步到位

快速搭建PyTorch环境&#xff1a;Miniconda一步到位 &#x1f335;文章目录&#x1f335; &#x1f333;一、为何选择Miniconda搭建PyTorch环境&#xff1f;&#x1f333;&#x1f333;二、Miniconda安装指南&#xff1a;轻松上手&#x1f333;&#x1f333;三、PyTorch与Minic…

【HTML】交友软件上照片的遮罩是如何做的

笑谈 我不知道大家有没有在夜深人静的时候感受到孤苦难耐&#xff0c;&#x1f436;。于是就去下了一些交友软件来排遣寂寞。可惜的是&#xff0c;有些交友软件真不够意思&#xff0c;连一些漂亮小姐姐的图片都要进行遮罩&#xff0c;完全不考虑兄弟们的感受,&#x1f620;。所…

嵌入式C语言学习——基于Linux与GCC(二)

系列文章目录 一.C语言常用关键字及运算符操作 文章目录 系列文章目录内存四区指针指针概述指针 修饰符constvoliatiletypedef 指针运算符多级指针 数组数组空间字符空间及地址 结构体、共用体定义、字节对齐位域 内存分布图段错误分析 内存四区 C/C语言的内存四区&#xff…

[WinForm开源]概率计算器 - Genshin Impact(V1.0)

创作目的&#xff1a;为方便旅行者估算自己拥有的纠缠之缘能否达到自己的目的&#xff0c;作者使用C#开发了一款小型软件供旅行者参考使用。 创作说明&#xff1a;此软件所涉及到的一切概率与规则完全按照游戏《原神》(V4.4.0)内公示的概率与规则&#xff08;包括保底机制&…

SpringBoot整合第三方技术-缓存

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;程序员老茶 &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开心好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;…

mysql5.6安装---windows版本

安装包下载 链接&#xff1a;https://pan.baidu.com/s/1L4ONMw-40HhAeWrE6kluXQ 提取码&#xff1a;977q 安装视频 1.解压完成之后将其放到你喜欢的地址当中去&#xff0c;这里我默认放在了D盘&#xff0c;这是我的根目录 2.配置环境变量 我的电脑->属性->高级->环境…

一周学会Django5 Python Web开发-Django5应用配置

锋哥原创的Python Web开发 Django5视频教程&#xff1a; 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计14条视频&#xff0c;包括&#xff1a;2024版 Django5 Python we…

COM初体验——新建文档并写入内容。

我想在程序里和Word交互。老师跟我说不要学COM&#xff0c;因为它已经过时了。但是我不想再把代码移植到C#上面&#xff0c;然后用VSTO——已经用了std::unordered_set&#xff01;因为我使用了Copilot&#xff0c;结合我的思考&#xff0c;写了下面的代码&#xff1a; #impor…

【JavaEE】网络原理: UDP协议和TCP协议的相关内容

目录 1. 应用层 2. 传输层 2.1 端口号 2.2 UDP协议 2.3 TCP协议 1.确认应答 2.超时重传 3.连接管理 三次握手 四次挥手 状态转换 4.滑动窗口 5.流量控制 6.拥塞控制 7.延迟应答 8.捎带应答 9.面向字节流 粘包问题 10.异常情况 网络通信中, 协议是一个非常重…