首页 > 解决方案 > Ncurses mvwaddch() 在 getch() 之前不起作用

问题描述

当我运行此代码时,for()没有绘制绘制框的两个循环。我已经用 gdb 进行了测试,它表明程序确实执行了这两个循环,但不知何故它没有出现。如果while(true)删除循环,则绘制框。所以为什么?

#include <iostream>
#include <curses.h>
int main(){
    std::pair<int,int> csr_pos{1,1};
    initscr();
    cbreak();
    noecho();
    keypad(stdscr, TRUE);
    curs_set(0);
    WINDOW *win = newwin(50,80,0,0);
    if(has_colors()){
        start_color();
        init_pair(1,COLOR_CYAN,COLOR_BLACK);
        init_pair(2,COLOR_RED,COLOR_BLACK);
        init_pair(3,COLOR_WHITE,COLOR_RED);
        init_pair(4,COLOR_YELLOW,COLOR_BLACK);
    }
    for(int i = 0; i<80; i++){
        mvwaddch(win,0,i,'#');
        mvwaddch(win,49,i,'#');
        wrefresh(win);
    }
    for(int i = 1; i<49; i++){
        mvwaddch(win,i,0,'#');
        mvwaddch(win,i,79,'#');
        wrefresh(win);
    }
    mvwaddch(win,csr_pos.first,csr_pos.second,'@');
    while(true){
        int ch = getch();
        if(ch==KEY_LEFT){
            mvwaddch(win,csr_pos.first,csr_pos.second,' ');
            csr_pos.second--;
            mvwaddch(win,csr_pos.first,csr_pos.second,'@');
        }
        if(ch==KEY_RIGHT){
            mvwaddch(win,csr_pos.first,csr_pos.second,' ');
            csr_pos.second++;
            mvwaddch(win,csr_pos.first,csr_pos.second,'@');
        }
        wrefresh(win);
    }
}

标签: c++ncurses

解决方案


问题是您使用getch()而不是wgetch(win). 要注意的另一件事是您声明的窗口的大小,这可能会导致类似的错误。


推荐阅读