【问题标题】:Using mouse to paint row of characters in ncurses使用鼠标在 ncurses 中绘制一行字符
【发布时间】:2020-09-19 03:16:24
【问题描述】:

我正在尝试使用 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】:

    mousemask 函数用于此目的:

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

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

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

    以防万一有第三个问题,bug-ncurses 邮件列表中多次提到了开启任意事件模式的利弊。

    【讨论】:

    • 谢谢。我已经包含了 mousemask 功能,但我不清楚如何检查 button1 的持续按下。点击和释放都是事件,而我认为我需要测试一个状态(抑郁/不抑郁)。关于这个特定问题似乎没有太多文档。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多