无法使用箭头键在诅咒中移动光标 (C)
Posted
技术标签:
【中文标题】无法使用箭头键在诅咒中移动光标 (C)【英文标题】:Cannot get arrow keys to move cursor in curses (C) 【发布时间】:2018-04-28 23:38:33 【问题描述】:下面是我的代码。我有一个主窗口,有两个选择,我希望用户能够来回键入以仅使用 KEY_LEFT 和 KEY_RIGHT。我现在以一种简单的方式(或者我认为)通过将光标直接移动到其中一个选项来设置它。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <curses.h>
#include <time.h>
int main()
int j = 0, highlight = 0, choice;
int x = 0, y = 0;
initscr();
noecho();
cbreak();
WINDOW * mainwin = newwin(20, 52, 0, 0);
refresh();
while (1)
keypad(mainwin, TRUE);
box(mainwin, 0, 0);
mvwprintw(mainwin, 1, 1, " L I C E N S E P L A T E");
mvwprintw(mainwin, 3, 2, "RAW ADDITION COMPARISON");
wmove(mainwin, 3, 2);
wattron(mainwin, A_BLINK);
refresh();
wrefresh(mainwin);
choice = wgetch(mainwin);
switch(choice)
case KEY_LEFT:
wmove(mainwin, 3, 2);
wrefresh(mainwin);
case KEY_RIGHT:
wmove(mainwin, 3, 26);
wrefresh(mainwin);
default:
wmove(mainwin, 3, 2);
wattroff(mainwin, A_BLINK);
wrefresh(mainwin);
if (choice == '\n')
if (highlight == 0) // RAW ADDITION
char lp[8];
char num[10];
int n;
WINDOW * win = subwin(mainwin, 30, 45, 1, 1);
refresh();
box(win, 1, 1);
mvwprintw(win, 2, 2, "RAW ADDITION");
mvwprintw(win, 3, 2, "Enter a license plate and an integer.");
mvwprintw(win, 5, 3, "._________. ._____________.");
mvwprintw(win, 6, 3, "| | | |");
mvwprintw(win, 7, 3, "'---------' '-------------'");
wmove(win, 6, 5);
wrefresh(win);
mvwgetnstr(win, 6, 5, lp, 7);
wrefresh(win);
wmove(win, 6, 26);
wrefresh(win);
mvwgetnstr(win, 6, 26, num, 10);
wrefresh(win);
n = atoi(num);
else // COMPARISON
if (toupper(choice) == 'Q')
break;
else if (choice == KEY_LEFT)
wmove(mainwin, 3, 2);
wrefresh(mainwin);
else if (choice == KEY_RIGHT)
wmove(mainwin, 3, 26);
wrefresh(mainwin);
endwin();
exit(EXIT_SUCCESS);
return 0;
在上面的代码中,我必须尝试捕捉用户按下左箭头或右箭头键时的代码块,并将窗口中的光标移动到适当的选择(RAW ADDRESS 或 COMPARISON)。但是,由于某种原因,我无法响应箭头键。 wmove() 函数或 keypad() 函数是否缺少我的东西?我在这里不明白什么?移动功能是否相对于光标上次的位置移动?
谢谢!
【问题讨论】:
【参考方案1】:switch 语句中的wmove
调用没有太大效果,因为导致wgetch
的逻辑将光标移回同一点:
wmove(mainwin, 3, 2);
wattron(mainwin, A_BLINK);
refresh();
wrefresh(mainwin);
choice = wgetch(mainwin);
顺便说一句,refresh()
调用似乎不需要,在快速阅读源代码...
【讨论】:
以上是关于无法使用箭头键在诅咒中移动光标 (C)的主要内容,如果未能解决你的问题,请参考以下文章