opengl键盘回调函数不能获取Ctrl+c的问题
我要令窗口在按下 Ctrl+c 之后关闭。
关键代码如下:
/* 这段代码位于键盘回调函数中 */
if ((glutGetModifiers() == GLUT_ACTIVE_CTRL) && (key == 'c' || key == ‘C’))
{
exit(0);
}
但是我按下ctrl+c之后没有反应。
我的操作系统是 ubuntu 12。
出现这个问题的原因是加上 Ctrl 键之后,key大值发生了变化。
比如说 a 的 Ascii 码值是 97,但是 Ctrl+A 之后变成了 1。
我们可以试验一下。
由于在命令行中按下 Ctrl+key 会发生许多奇奇怪怪的事情,比如 Ctrl+z 暂停程序,Ctrl+d 结束输入,Ctrl+i 制表符,等。而在图形窗口中就没有这个问题,所以我们直接在刚才写的 opengl 程序中察看。
将下列代码插入键盘回调函数中:
int modifier = glutGetModifiers();
printf("modifier: %d\n", modifier);
printf("key: %d\n", (int)key); /* 注意要将 key 转化为 int 型,因为某些 char 是不能显示的。 */
运行之后,我们按下 a,会出现:(无修饰键时 modifier 为 0)
modifier: 0
key: 97
按下 Ctrl+a,会出现:(修饰键为 Ctrl 时 modifier 为 2)
modifier: 2
key: 1
读者可以多试验一下。值得注意的是 Ctrl+a 与 Ctrl+A 的 key 值是一样的。
我自己从 Ctrl+A 一路按到 Ctrl+Z,显示的值是 1 到 26。我也试验过 Shift 和 Alt 修饰键,它们没有这种效果。
好了进入正题。我们看到,当使用 Ctrl+c 时,key 的值不再是 'c',而是 '\x03'。所以修改代码如下:
if ((glutGetModifiers() == GLUT_ACTIVE_CTRL) && (key == 'c' || key == ‘C’ || key == '\x03'))
{
exit(0);
}
编译运行,最后达到了想要的效果。
我是在 ubuntu 中试验的,并不知道其它操作系统是个什么情况。
opengl键盘回调函数不能获取Ctrl+c的问题的更多相关文章
- OpenCV学习3-----利用鼠标、键盘回调函数实现标定人体关节点
最近做实验,需要一些人体关节点的ground truth,需要自己手动标定,于是尝试使用OpenCV的鼠标键盘回调函数实现. 期间遇到不少问题,记录一下. 首先就是鼠标回调函数注册, namedWin ...
- IT小鲜肉 Widgets Tree 单选、多选、相关回调函数、获取选中的节点功能
写一个树控件并没有想象中的那么容易,今天又花了我一个1个多小时,主要为IT小鲜肉 Widgets Tree控件添加了 单选.多选.选择前和选择后两个回调函数.获取选中节点的功能.后面会继续努力完善这个 ...
- WPF异步回调时回调函数如何获取异步函数产生的变量
有这么一个问题,WPF在使用异步回调的时候,回调函数需要用到异步函数里产生的一个变量,例如异步函数里查询数据库得到了一个DataTable,如何传递给回调函数呢? [方案一]使用全局变量 很容易想到的 ...
- layer 点击yes后在回调函数里获取layer.open({})iframe里面元素
参考:http://fly.layui.com/jie/19690/ yes: function(index, layero) { uid.value = $(layero).find('iframe ...
- OpenGL的GLUT注册回调函数[转]
OpenGL的注册回调函数 void glutDisplayFunc(void (*func)(void) ); 为当前窗口设置显示回调函数 void glutOverlayDisplayFunc(v ...
- Opengl中的GLUT下的回调函数
void glutDisplayFunc(void (*func)(void)); 注册当前窗口的显示回调函数 参数: func:形为void func()的函数,完成具体的绘制操作 这个函数告诉GL ...
- Glut 回调函数小结
2014-04-08 16:25:50 void glutDisplayFunc(void (*func)(void)); 注册当前窗口的显示回调函数 参数: func:形为void func( ...
- [转]理解与使用Javascript中的回调函数
在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...
- 【JavaScript】理解与使用Javascript中的回调函数
在Javascript中,函数是第一类对象,这意味着函数可以像对象一样按照第一类管理被使用.既然函数实际上是对象:它们能被“存储”在变量中,能作为函数参数被传递,能在函数中被创建,能从函数中返回. 因 ...
随机推荐
- [Lua快速了解一下]Lua的控制语句
-Lua中没有++或者--的骚操作 -while loop sum = num = do sum = sum + num num = num + end print("sum =" ...
- HTML 5+CSS 3网站布局应用教程 (赵振方) 随书光盘
<HTML5+CSS3网站布局应用教程>全面介绍HTML 5与CSS 3进行Web设计的知识.全书由16章组成.主要内容包括:主流浏览器对HTML 5的支持情况.HTML 5与HTML4在 ...
- Markdown使用心得
1. 标题的使用 在使用标题时,如果为了层次清晰,可以在"#"后加上"1. "或者"1.1. "这种序号. 每一级标题的正文结束后,最好加一 ...
- 「HEOI2016/TJOI2016」序列
题目链接 戳这 Solution 首先考虑最暴力的dp 我们设: \(f[i]\)表示选择\(i\)以后所能形成的满足条件的子序列的最大值 \(minx[i]\)表示\(i\)能转换为的最小值 \(m ...
- L - Ch’s gift HDU - 6162
Ch’s gift Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- vs2015+opencv3.3.1+ c++实现 静态背景下多运动目标提取,检测
静止背景下运动物体的提取,跟踪出运动轨迹 下载地址 https://download.csdn.net/download/li_haoren/10761361 1.两遍扫描法得到第n帧的连通域,分离出 ...
- 数据库处理session类
<?php /* * 使用数据库处理session * php.ini 中 session.save_handler 设为 "user" */ class Dbsession ...
- k8s(未完待续)
K8s简介Kubernetes(k8s)是自动化容器操作的开源平台,这些操作包括部署,调度和节点集群间扩展. 使用Kubernetes可以 自动化容器的部署和复制 随时扩展或收缩容器规模 将容器 ...
- 简单的 socket 代码
TCP 编程 客户端代码 将键盘输入的字符发送到服务端,并将从服务端接收到的字符输出到终端 #!/usr/python3 import socket def socket_client(): s = ...
- cf555e
cf555e(缩点) 给一个 n 个点 m 条边的图,以及 q 对点 (s,t),让你给 m 条边定向.问是否存在一种方案,使每对点的 s 能走到 t. \(n,m,q≤ 2×10^5\). 首先,在 ...