2015-09-13 4 views
1

Я пытаюсь попасть в библиотеку Ncurses, но это, кажется, что независимо от того, что я код, я получаю это в Ncurses: screenshotNcurses не показывая ничего на Ubuntu Mate

С помощью этого кода:

#include <stdio.h> 
#include <ncurses.h> 

void main() 
{ 
    WINDOW *vin; 
    initscr(); 
    start_color(); 
    init_pair(1,COLOR_YELLOW,COLOR_BLUE); 
    init_pair(2,COLOR_BLUE,COLOR_YELLOW); 
    init_pair(3,COLOR_BLUE,COLOR_WHITE); 
    vin=newwin(12,40,13,0); 
    wmove(vin,0,5); 
    wprintw(vin,"Hello, World."); 
    wbkgd(vin,COLOR_PAIR(1)); 
    wrefresh(vin); 
    getch(); 
    delwin(vin); 
    endwin(); 
} 

Но, опять-таки, это, кажется, не будет проблемой, независимо от того, какой код я пишу всякий раз, когда я компилирую с этим:

gcc main.c -lncurses 

Является ли это ошибка с выпуском Ubuntu из ncurses? Или я забываю библиотеку?

+1

['void main' is wrong] (http://stackoverflow.com/questions/204476/what-should-main-return-in-c-and-c). – melpomene

+1

@melpomene: Правда, но чтобы быть ясным, это не причина проблемы. –

+0

Настоятельно рекомендуем: просто иметь одно окно, окно по умолчанию, без цветов, попробуйте wmove() и wprintw() Когда у вас это будет, добавьте внутреннее окно «vin» и получите эту работу. Затем добавьте цвет. Разрабатывая шаг за шагом, вы должны легко найти, где ваш код содержит логическую ошибку – user3629249

ответ

4

Необходимо позвонить по телефону wgetch(vin) вместо getch(). (И, поскольку wgetch автоматически вызовет wrefresh, вы можете удалить предыдущие wrefresh(vin).)

ncurses не позволяет использовать перекрывающиеся окна. Или, может быть, лучше сказать, вы можете использовать перекрывающиеся окна, но вы несете ответственность за их отображение в правильном порядке.

Все функции не w - в том числе getch - работа в главном окне (возвращается initscr), который охватывает весь экран. Если вы обновите главное окно, вы будете перезаписывать любые другие окна. Поэтому вам нужно убедиться, что другие окна обновлены после любого обновления главного окна. Если вы используете несколько окон, обычно лучше избегать использования главного окна; просто обновите его один раз в начале, а затем оставьте его в покое.

Поскольку (w) getch автоматически обновит любое окно, к которому оно относится, вызов getch() неявно называется refresh(); поскольку это произошло после вызова wrefresh(vin), ваш подзаголовок был перезаписан.

Смежные вопросы