2016-03-26 3 views
0

Ich möchte eine 1x8-Zelle in Ncurses ohne Rahmen machen. Das erste, was ich tat, macht ein FensterMachen Sie eine 1x8-Zelle in Ncurses ohne Rahmen

WINDOW*win = newwin(height, width, 0, 0); 

mit der Höhe 24 und Breite 80 Ich möchte einen Spaltenkopf machen und eine Reihe header.In die Spalte I Strings ‚A‘ wollen ‚I‘ und in der Zeilenheader Ich möchte Strings '1' bis '23'. Das bedeutet, dass alle Zellen die Höhe 1 und die Breite 8 haben und sich auf der Position (0,0) eine leere Zelle befindet. Ich möchte jede Zelle in der Kopfzeile mit der Eigenschaft STANDOUT. Also habe ich eine Funktion DrawCell() geschrieben. Das ist, was ich versuchte

void DrawCell(int x , int y, const char* ch){ 
    clear(); 
    wattron(win, A_STANDOUT); 
    mvwprintw(win, x,y,ch); 
    wrefresh(win); 
    getchar(); 
    endwin(); 
}//DrawCell 

Das Problem ist, dass diese Funktion nur die Zeichenfolge ‚ch‘ Anzeige in STANDOUT. Aber ich kann nicht herausfinden, wie diese Zeichenfolge platzieren in einer Zelle mit der Höhe 1 und Breite 8.

Antwort

0

der Beschreibung angegeben, es klingt, als ob Sie etwas wollen, wie

#define CELL_WIDE 8 
#define CELL_HIGH 1 

void DrawCell(int col , int row, const char* ch) { 
    int y = row * CELL_HIGH; 
    int x = col * CELL_WIDE; 
    wattron(win, A_STANDOUT); 
    wmove(win, y, x);     // tidier to be separate... 
    wprintw("%*s", " ");    // fill the cell with blanks 
    wprintw("%.*s", CELL_WIDE, ch); // write new text in the cell 
    wrefresh(win); 
#if 0 
    getchar(); 
    endwin(); 
#endif 
}//DrawCell 

, weil Sie die Zelle haben zu übersetzen Zeilen- und Spaltenposition in x- und y-Koordinaten.

Ein paar Anmerkungen:

  • ich ifdef'd den Anruf zu getchar, weil das etwas, das Sie für das Debuggen verwendet zu sein scheint.

  • Wenn Sie viele Zellen zeichnen, sollten Sie auch die wrefresh(win) aus dieser Funktion verschieben, z. B. zu dem, wo Sie das gesamte Fenster aktualisieren.

  • das Fenster Löschen zu vermeiden, sollten Sie wgetch(win) verwenden, anstatt getch(), da letztere Auffrischungen stdscr, und es kann Ihr Fenster überschreiben.

Adressierung Kommentar, wenn die Funktion zu

void DrawCell(int col , int row, const char* ch) { 
    int y = row * CELL_HIGH; 
    int x = col * CELL_WIDE; 
    wmove(win, y, x);     // tidier to be separate... 
    wprintw("%*s", " ");    // fill the cell with blanks 
    wattron(win, A_STANDOUT); 
    wprintw("%.*s", CELL_WIDE, ch); // write new text in the cell 
    wattroff(win, A_STANDOUT); 
    wrefresh(win); 
#if 0 
    getchar(); 
    endwin(); 
#endif 
}//DrawCell 

dann geändert wird, wird nur der Text der Zelle in herausragenden Modus gezeigt wird.

+0

Wenn ich Ihren Code ausführen mein ganzes Fenster ist STANDOUT erwarten die erste Hälfte der ersten Zeile im Fenster. Was ich will, ist, dass DrawCell() eine Zelle der Höhe 1 und der Breite 8 macht, wo eine Zeichenfolge platziert werden kann. – Qas

+0

Ich dachte, du wolltest, dass die ganze Zelle hervorstechen würde. Um nur den Text in jeder Zelle hervorzuheben, verschieben Sie den WATTRON-Aufruf nach dem ersten Ausdruck. In jedem Fall sagt die Frage, dass die Zellen keinen Rand haben (was den gesamten Bildschirm mit Text bedeckt). –

+0

Ich möchte die 1x8 Zelle STANDOUT nicht das ganze Fenster außer der Zelle sein. Wenn ich den WATTRON-Aufruf verschiebe, drucke ich nur den Cursor. – Qas