使用鼠标在ncurses中绘制字符行

问题描述 投票:0回答:1

我正在尝试使用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鼠标文章。我想念什么?

c mouseevent mouse drag ncurses
1个回答
0
投票

mousemask功能用于此:

要使鼠标事件可见,请使用mousemask函数。这将设置要报告的鼠标事件。默认情况下,没有鼠标事件报告。该函数将返回一个掩码,以指示哪个可以报​​告指定的鼠标事件;完全失败后返回0。如果oldmask为非NULL,则此函数填充指示的位置与给定窗口的鼠标事件掩码的先前值。

作为副作用,设置为零mousemask可能会关闭鼠标指针;设置非零掩码可能会打开它。是否发生这种情况与设备有关。

这实际上是两个问题。 ncurses特有的一种是如何打开/关闭鼠标(保证使用printf会令人失望)。另一个问题是如何启用“任何事件”,并且是特定于终端的,被ncurses视为鼠标的不同初始化字符串。端子说明xterm-1002xterm-1003提供了此示例。 XM功能(ncurses所查看的功能)在user_caps手册页中进行了描述。

© www.soinside.com 2019 - 2024. All rights reserved.