我试图编写代码以使用鼠标运动和鼠标轮旋。事实证明,鼠标拖动和车轮旋转产生的事件完全相同 - report_mouse_position(8000000) - 我不能从另一个事件中告诉一个事件。我缺少什么?
MEVENT e;
mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL);
while ( (c = getch()) != 27 ){ // 27 = ESC
if (c == KEY_MOUSE){
if (getmouse(&e) == OK){
// e.bstate produces 8000000 for both wheel and mouse movement
按照惯例,鼠标事件被视为按钮4和5。"全事件"标志包括。如果您将标志的组合用于您感兴趣的按钮,则将获得所需的结果。
手动页面列出了可用标志(您也可以在ncurses.h标题文件中看到),但是只有一个按钮的全事件都没有等效的预定义符号。
顺便说一句,在NCURSES5(NCURSES6于2015年8月发布)中,由于分配了钻头,因此无法检测到按钮5。在标题文件中,本节与您的问题相关,因为按钮5将使用蒙版的相同部分与报告鼠标位置:
/*
* In 32 bits the version-1 scheme does not provide enough space for a 5th
* button, unless we choose to change the ABI by omitting the reserved-events.
*/
#if NCURSES_MOUSE_VERSION > 1
#define BUTTON5_RELEASED NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_RELEASED)
#define BUTTON5_PRESSED NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_PRESSED)
#define BUTTON5_CLICKED NCURSES_MOUSE_MASK(5, NCURSES_BUTTON_CLICKED)
#define BUTTON5_DOUBLE_CLICKED NCURSES_MOUSE_MASK(5, NCURSES_DOUBLE_CLICKED)
#define BUTTON5_TRIPLE_CLICKED NCURSES_MOUSE_MASK(5, NCURSES_TRIPLE_CLICKED)
#define BUTTON_CTRL NCURSES_MOUSE_MASK(6, 0001L)
#define BUTTON_SHIFT NCURSES_MOUSE_MASK(6, 0002L)
#define BUTTON_ALT NCURSES_MOUSE_MASK(6, 0004L)
#define REPORT_MOUSE_POSITION NCURSES_MOUSE_MASK(6, 0010L)
#else
#define BUTTON1_RESERVED_EVENT NCURSES_MOUSE_MASK(1, NCURSES_RESERVED_EVENT)
#define BUTTON2_RESERVED_EVENT NCURSES_MOUSE_MASK(2, NCURSES_RESERVED_EVENT)
#define BUTTON3_RESERVED_EVENT NCURSES_MOUSE_MASK(3, NCURSES_RESERVED_EVENT)
#define BUTTON4_RESERVED_EVENT NCURSES_MOUSE_MASK(4, NCURSES_RESERVED_EVENT)
#define BUTTON_CTRL NCURSES_MOUSE_MASK(5, 0001L)
#define BUTTON_SHIFT NCURSES_MOUSE_MASK(5, 0002L)
#define BUTTON_ALT NCURSES_MOUSE_MASK(5, 0004L)
#define REPORT_MOUSE_POSITION NCURSES_MOUSE_MASK(5, 0010L)
#endif
您将使用ncurses5获得按钮4,但是按钮5落在裂缝中(您可能会从中看到一些事件,但是没有办法告诉它是按钮5)。面具是在任何人要讨论的车轮之前设置的(1995年末)。