如何在Ncurses中使用derwin()子窗口函数填充完整背景色?
在Ncurses中用derwin()子窗口实现完整背景色填充
可以实现完整背景色填充,你的代码问题在于设置背景色后未将属性应用到子窗口的全部区域。
derwin创建的子窗口与父窗口共享字符缓冲区,wbkgd()仅设置窗口的默认背景属性,但不会自动填充整个窗口——只有被写入内容(如边框、文字)或显式刷新全部区域的位置才会应用该属性。
修改方案
在设置子窗口背景色后,调用wclear(sonny)用当前背景色填充整个子窗口区域,再执行后续绘制操作:
#include <ncurses.h> int main(void) { WINDOW *pops,*sonny; int x2, y2, x4, y4; initscr(); start_color(); init_pair(1, COLOR_WHITE, COLOR_BLUE); init_pair(2, COLOR_BLACK, COLOR_WHITE); x2 = COLS >> 1; y2 = LINES >> 1; x4 = (COLS - x2) / 2; y4 = (LINES - y2) / 2; /* create parent and subwindow with derwin() */ pops = newwin(y2, x2, y4, x4); sonny = derwin(pops, y4, x4, 7, 5); if (sonny == NULL) { endwin(); puts("Unable to create subwindow\n"); return(1); } /* color windows and splash some text */ wbkgd(pops,COLOR_PAIR(1)); mvwaddstr(pops, 2, 2, "Hello, son."); wrefresh(pops); wbkgd(sonny,COLOR_PAIR(2)); wclear(sonny); // 用当前背景色填充整个子窗口 wborder(sonny, 0, 0, 0, 0, 0, 0, 0, 0); mvwaddstr(sonny, 3, 3, "Hello, Dad."); wrefresh(sonny); wgetch(sonny); endwin(); return 0; }
原理说明
wclear()会将子窗口的所有区域用wbkgd()设置的背景色(COLOR_PAIR(2),黑字白底)填充,确保整个子窗口区域都应用该背景属性,之后绘制的边框和文字会叠加在这个背景上,最终实现完整的白色背景效果。你也可以用werase(sonny)替代wclear(sonny),二者效果一致,都会清空窗口并填充背景色。
内容的提问来源于stack exchange,提问作者ordinary_guy
相关产品推荐
相关产品推荐

