[允许以ncurses编辑表单字段时,我还希望使用箭头键移动光标。哪个工作很棒。
但是,当按下KEY_RIGHT
时,我叫form_driver(form, REQ_NEXT_CHAR);
,它允许光标移到字段内容的末尾。这是我(几乎)最小的工作示例。
#include <stdio.h>
#include <curses.h>
#include <form.h>
int main(void) {
FIELD *fields[2] = {NULL};
FORM *form;
int ch, cont, err;
initscr();
cbreak();
noecho();
curs_set(1);
keypad(stdscr, TRUE);
fields[0] = new_field(1, 10, 0, 0, 0, 0);
set_field_back(fields[0], A_UNDERLINE);
field_opts_off(fields[0], O_AUTOSKIP);
field_opts_off(fields[0], O_NULLOK);
field_opts_off(fields[0], O_PASSOK);
set_field_type(fields[0], TYPE_ALNUM, 1);
form = new_form(fields);
post_form(form);
cont = 1;
while (cont) {
ch = getch();
switch (ch) {
case KEY_LEFT:
form_driver(form, REQ_PREV_CHAR);
break;
case KEY_RIGHT:
form_driver(form, REQ_NEXT_CHAR);
break;
case KEY_HOME:
form_driver(form, REQ_BEG_LINE);
break;
case KEY_END:
form_driver(form, REQ_END_LINE);
break;
case KEY_BACKSPACE:
form_driver(form, REQ_DEL_PREV);
break;
case KEY_DC:
form_driver(form, REQ_DEL_CHAR);
break;
case KEY_ENTER:
case '\n':
err = form_driver(form, REQ_VALIDATION);
if (err == E_OK)
cont = 0;
break;
default:
form_driver(form, ch);
break;
}
}
unpost_form(form);
endwin();
printf("entered: %s\n", field_buffer(fields[0], 0));
free_form(form);
free_field(fields[0]);
return 0;
}
如何将REQ_NEXT_CHAR
的光标移动限制为该字段的实际内容?
我个人是通过:]计算字段的有效长度。
leneff=strlen(suppr_espaces(field_buffer(field[iet2],0),0));
其中suppr_espaces是以下函数:
// ==== suppr_espaces ====== suppress spaces in the end of a string ===== char * suppr_espaces(char * chan,char cara) // the last space is replaced by { char *ptc=chan; size_t len,len0; //.. the char cara len0=len=strlen(ptc); while(len>0 && ptc[--len]==' ') ptc[len]='\0'; if (len && ++len<len0) ptc[len]=cara; return chan; } // fin de la fonction suppr_espaces
然后,您可以将光标的位置与变量leneff进行比较,以使光标不会移动到字段实际内容的右侧