我正在尝试使用ncurses用鼠标在屏幕上绘制一行字符。我能够在屏幕上区分BUTTON1_CLICKED事件和BUTTON1_RELEASED事件,但是还没有弄清楚如何在它们之间进行绘制。
以下代码在事件位置打印BUTTON1_CLICKED和BUTTON1_RELEASED:
void obstacle_draw(WINDOW * boardWin, int array[LINES][COLS]) {
int ch;
MEVENT event;
keypad(boardWin, TRUE);
mousemask(BUTTON1_CLICKED | BUTTON1_RELEASED | REPORT_MOUSE_POSITION, NULL);
mouseinterval(0);
while(1) {
ch = wgetch(boardWin);
if (ch == KEY_MOUSE) {
getmouse(&event);
if (event.bstate & BUTTON1_CLICKED) {
wattron(boardWin, COLOR_PAIR(BLACK_ON_WHITE) | A_REVERSE);
mvwprintw(boardWin, event.y, event.x, "CLICKED at %d,%d", event.y, event.x);
wrefresh(boardWin);
} else if (event.bstate & BUTTON1_RELEASED) {
wattron(boardWin, COLOR_PAIR(BLACK_ON_WHITE) | A_REVERSE);
mvwprintw(boardWin, event.y, event.x, "RELEASED at %d,%d", event.y, event.x);
wrefresh(boardWin);
}
}
if (ch == '\n') {
break;
}
}
return;
}
在while循环之前添加以下行,这使我可以在第一次单击鼠标时绘制这些坐标,而无需按住按钮。但是我似乎无法关闭它(我也不明白它是如何工作的):
printf("\033[?1003h\n");
我感觉我已经阅读了有关堆栈溢出的每个ncurses鼠标文章。我想念什么?
mousemask功能用于此:
要使鼠标事件可见,请使用
mousemask
函数。这将设置要报告的鼠标事件。默认情况下,没有鼠标事件报告。该函数将返回一个掩码,以指示哪个可以报告指定的鼠标事件;完全失败后返回0。如果oldmask为非NULL,则此函数填充指示的位置与给定窗口的鼠标事件掩码的先前值。作为副作用,设置为零mousemask可能会关闭鼠标指针;设置非零掩码可能会打开它。是否发生这种情况与设备有关。
这实际上是两个问题。 ncurses特有的一种是如何打开/关闭鼠标(保证使用printf
会令人失望)。另一个问题是如何启用“任何事件”,并且是特定于终端的,被ncurses视为鼠标的不同初始化字符串。端子说明xterm-1002和xterm-1003提供了此示例。 XM
功能(ncurses所查看的功能)在user_caps手册页中进行了描述。