2016-04-22 15 views
2

Ich benutze Ncurses, um eine einfache TUI für meine Anwendung zu machen. Ich habe die Grundlagen zum Erstellen und Drucken in einem Fenster, aber ich habe Probleme mit der Eingabe.Cursor verlässt Fenster beim Tippen (ncurses)

wenn ich fertig zu schreiben, wird der Cursor am Ende der Zeichenfolge positioniert schrieb ich enter image description here

Aber wenn ich Eingabe beginnen, Cursor bewegt sich auf die linke obere Ecke der Terminal-Fenster.

enter image description here

Wie kann ich es an Ort und Stelle zu halten, während Sie tippen?

Hier ist mein Code:

#include <ncurses.h> 

WINDOW *win; 
int startx, starty, width, height; 
int cport; 


WINDOW *makewin(int h, int w, int y, int x) 
{ 
    WINDOW *lwin; 

    lwin = newwin(h, w, y, x); 
    box(lwin, 0 , 0); 
    wrefresh(lwin); 

    return lwin; 
} 

void dewin(WINDOW *lwin) 
{ 
    wborder(lwin, ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '); 
    wrefresh(lwin); 
    delwin(lwin); 
} 

void getPort(){ 
    win = makewin(height, width, starty, startx); 
    wbkgd(win, COLOR_PAIR(1)); 
    mvwprintw(win, 0, 8, "Port Settings"); 
    mvwprintw(win, 2, 4, "Set port server should"); 
    mvwprintw(win, 3, 4, "listen to: "); 
    wrefresh(win); 

    scanw("%d", &cport); 
} 

int main() 
{ 
    initscr(); 
    cbreak(); 
    keypad(stdscr, TRUE); 


     start_color(); 

     init_pair(1,COLOR_WHITE, COLOR_BLACK); 
     init_pair(2,COLOR_WHITE, COLOR_BLUE); 
     bkgd(COLOR_PAIR(2)); 
     refresh(); 

     height = 6; 
     width = 30; 
     starty = (LINES - height)/2; 
     startx = (COLS - width)/2; 

     getPort(); 


    getch(); 

    dewin(win); 
    endwin(); 
    return 0; 
} 
+0

Vielen Dank! Ich habe nicht einmal gedacht, dass Windows auch eine dedizierte Lesefunktion haben, wie es beim Drucken der Fall ist. Mit ** wscanw ** behob das Problem :) – Nidrax

Antwort

0

Es ist, weil Sie scanw(...) Funktion verwenden, die letztlich wie wscanw(stdscr, ...) funktioniert, die Eingabe von stdscr erhält. Verwenden Sie wscanw Funktion, um das Problem zu lösen.

1

scanw (und wscanw) wgetch schließlich nennen, die das Fenster als Parameter angegeben aktualisiert:

Wenn das Fenster nicht ein Pad ist, und es hat seit dem letzten Anruf zu wrefresh, wrefresh verschoben oder geändert worden sein wird aufgerufen, bevor ein anderes Zeichen gelesen wird.

Das heißt, alle anstehenden Veränderungen (einschließlich des Löschens aufgrund initscr) für stdscr würde durch eine ebene scanw angewendet werden. Der Cursor wird an der aktuellen Position in dem Fenster belassen, in dem das Programm nach Eingabe fragt.