我刚刚发现了ncurses并且刚刚开始学习它,但是我的教程中的示例不能在我的计算机上编译.
我必须手动安装ncurses,并输入"apt-get install libncurses5-dev libncursesw5-dev".我不得不这样做,因为在这样做之前我得到一个错误,说我不能"#include".
安装它工作,但现在我得到此错误:
touzen@comp:~/learning_ncurses$ g++ -o hello_world hello_world.cpp
/tmp/ccubZbvK.o: In function `main':
hello_world.cpp:(.text+0xa): undefined reference to `initscr'
hello_world.cpp:(.text+0x16): undefined reference to `printw'
hello_world.cpp:(.text+0x1b): undefined reference to `refresh'
hello_world.cpp:(.text+0x20): undefined reference to `stdscr'
hello_world.cpp:(.text+0x28): undefined reference to `wgetch'
hello_world.cpp:(.text+0x2d): undefined reference to `endwin'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
我编译的代码如下所示:
#include <ncurses.h>
int main(){
initscr();
printw("Hai thar world...");
refresh();
getch();
endwin();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么我会收到此错误.更重要的是,我该如何解决这个问题呢?
有几个像ncurses这样的库可以帮助制作命令行GUI.
简单地说,它们是如何工作的?
我的第一个想法是ncurses拦截所有键盘输入,并通过逐行输出来绘制每个"帧".然而,仔细检查发现每个新框架都会覆盖前一个框架.它如何修改已经输出的行?此外,它如何处理颜色?
编辑:同样的问题适用于任何具有"花哨"界面的东西,比如vim和emacs.
我想在我的Haskell程序中使用基于文本的UI.我找到了ncurses库的一些绑定(另请参阅hscurses或ncurses,使用哪一个?).在hscurses和nanocurses包都是围绕C库只是简单的包装,而vty不是非常有据可查,并有点难看(例如混合snake_case和驼峰).
ncursesHackage上的库看起来更漂亮,并且提供了非常适合Haskell的API.问题是它似乎没有实现一些关键功能,如调整大小或刷新窗口.
所以我的问题是:
ncursesHaskell库至少支持窗口刷新和调整大小?(这可能应该与项目所有者协商,但我需要快速解决方案)编辑:
我终于在nscurses没有窗户(和面板)的情况下使用,以避免让他们感到烦恼.输出到窗口的右下角我遇到了问题(Python的ncurses绑定报告了一个非常类似的问题).我没有写那里解决它:).
我一直在寻找相当于kbhit()的东西,我已经阅读了几个关于这个主题的论坛,大多数人似乎建议使用ncurses.
我应该如何使用ncurses检查是否在c ++中按下了某个键.
ncurses提供的函数getch()从窗口中读取字符.我想编写一个函数,只检查是否有按键然后我想做getch().
提前致谢.
我正在尝试从www.marcansoft.com编译openlase库并且遇到了CMake的问题.CMake正在返回一个错误,指出它无法找到Curses,经过大量的审视后,我仍然对这个问题感到难过.我已经检查过我安装了各种ncurses软件包,但仍然存在错误.我对CMake不太熟悉,但我能够解决在此之前出现的其他依赖性问题.以下是终端输出.
tom@SILVER:~/dev/openlase$ cmake ./
-- Found JACK
CMake Error at /usr/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:70 (MESSAGE):
Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH)
Call Stack (most recent call first):
/usr/share/cmake-2.8/Modules/FindCurses.cmake:159 (FIND_PACKAGE_HANDLE_STANDARD_ARGS)
examples/27c3_slides/CMakeLists.txt:3 (find_package)
-- Configuring incomplete, errors occurred!
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激.
如何获得Ctrl,Shift或Alt与getch()ncurses?
我无法得到它的工作得到Ctrl,Shift或Alt与getch()使用ncurses的?我想念那个男人的东西吗?
我的一个程序使用ncurses绘制一个小的tui.我的目标之一是使其可以移植到其他curses实现.这意味着我想在自己的调整大小操作上捕获终端模拟器发出的SIGWINCH,并更新我的tui以遵守更改的几何(并且不依赖于ncurses的调整大小设施).由于POSIX(据我所知)只允许访问sig_atomic_t信号处理程序中的变量,因此我将其设置为不同的状态.在主循环中,我的程序检查状态是否已更改并在必要时更新tui.
但是现在,getch当信号到达时,我遇到了我的程序挂起的问题.ncurses文档声明处理信号永远不会中断它.这意味着在按下输入键之前不会更新tui的大小.
是否有任何可移植的中断方式getch?我目前的方法是ungetch在信号处理程序中使用虚拟键,但我不确定是否允许这样做.实际上我找不到任何关于是否可以在信号处理程序中使用curses函数的文档.知道如何正确处理这件事吗?
问候
我正在尝试注册一个函数,该函数返回一个int在程序结束时使用该atexit()函数调用的函数.(具体来说,endwin()来自ncurses 的功能.)
但由于atexit()需要一个指向void函数的指针,我遇到了一个问题.我尝试了以下方法:
static_cast<void (*)()>(endwin)
Run Code Online (Sandbox Code Playgroud)
但似乎不允许static_cast从int功能到void功能.
我想要完成的是什么,如果是的话,怎么样?
注意:我愿意忽略函数的返回值.
编辑:我也尝试创建一个lambda函数,它似乎做我想要的:
atexit([]{ endwin(); });
Run Code Online (Sandbox Code Playgroud)
与包装/转发功能相比,这是一个很好的解决方案吗?(除此之外,它需要C++ 11并避免定义一个新功能,其唯一目的只是转发另一个功能.)