如何使用ncurses获得明亮的白色背景色?

如何使用ncurses获得明亮的白色背景色?,c,ncurses,C,Ncurses,如何在ncurses中获得明亮的白色背景和黑色文本,类似于nano中的标题栏?尽管有以下几点,我似乎能做到的(这与在黑色背景上获得明亮的白色文本有关,与我想要实现的相反),就是一个丑陋的米色背景 图像: GNU nano的标题栏,我想要的 我从下面的程序中得到了什么。(使用gcc-lncursesw-I/usr/include minimal_example.c构建) #包括 #包括 int main(){ setlocale(LC_ALL,“”); //初始化诅咒库 initscr();

如何在
ncurses
中获得明亮的白色背景和黑色文本,类似于
nano
中的标题栏?尽管有以下几点,我似乎能做到的(这与在黑色背景上获得明亮的白色文本有关,与我想要实现的相反),就是一个丑陋的米色背景

图像:

GNU nano的标题栏,我想要的

我从下面的程序中得到了什么。(使用
gcc-lncursesw-I/usr/include minimal_example.c构建)

#包括
#包括
int main(){
setlocale(LC_ALL,“”);
//初始化诅咒库
initscr();
//启用颜色
启动颜色();
//尝试推荐https://stackoverflow.com/questions/1896162/how-to-get-a-brightwhite-color-in-ncurses 以及网络上的其他地方
使用默认颜色();
//使颜色对0xFF指向白色前景、黑色背景窗口。
//在我的情况下,使用-1将不起作用,因为我希望与默认值(白色背景上的黑色文本)相反,而不是与默认值(黑色背景上的白色文本)相反。
初始对(0xFF,颜色为黑色,颜色为白色);
刷新();
//获取我们的术语高度和宽度。
int x;
int-y;
//不需要,因为这是一个宏(&N)
getmaxyx(stdscr,y,x);
//创建一个新窗口。
//TODO:在术语调整大小时调整窗口大小。
WINDOW*WINDOW=newwin(y,x,0,0);
//尝试在线推荐的其他属性,不要掷骰子。在调用wbkgd()后放置此属性只会使文本看起来很奇怪,不会改变背景。
wattron(窗口,一个粗体的,一个突出的);
//设置窗口颜色。
wbkgd(窗口,颜色对(0xff));
//在窗户周围画一个漂亮的盒子。
框(窗口,0,0);
//写一些文字。
mvwprintw(窗口,1,1,“背景:不白");
新鲜水(窗户);
//等待按键退出。
getch();
//取消初始化ncurses。
endwin();
返回0;
}
我想我的终端配置可能有问题(
termite
),但我能够在
xfce4终端
xterm
中重现该问题,这两种配置都使用默认配置。解决此问题的唯一方法是将我的
color7
color15
设置为与
前景
相同的颜色,这显然是我不想做的,因为这是非标准的,我想发布i将此代码用于更大的应用程序

(带有错误的xfce4终端)

终端模拟器中的颜色有点乱。您的问题是,根据您的终端,灰色背景实际上是“白色”的!请查看上的此表。查看所有不同终端模拟器中“白色”行的灰色外观。您真正想要的是“亮白色”“,它超出了8种初始颜色。问题在于,根据:

一些终端支持八(8)种以上的“ANSI”颜色 这些附加颜色没有标准名称

所以你只需要按数字使用它们,并希望每个人的终端都符合维基百科上的表格(我想大多数人都是这样)

这就是你所需要的,所以你可以摆脱所有其他的
使用默认颜色和
粗体的东西


旧答案:

手册上说

请注意,通过颜色对设置隐式背景色只会影响字符写入操作显式接触的字符单元

A_BLINK属性在理论上应该使背景变亮

事实上,如果你只是改变

wbkgd(window, COLOR_PAIR(0xff) | A_BLINK);
您将获得明亮的白色背景,但仅在绘制文本的区域(包括窗口边框)。我不确定如何在整个窗口背景上获得相同的效果,但希望这可以帮助您开始。此更改(假设
TERM=xterm-256color
)会满足以下要求:

> diff -u foo.c foo2.c
--- foo.c       2017-10-06 15:59:56.000000000 -0400
+++ foo2.c      2017-10-06 16:10:11.893529758 -0400
@@ -7,10 +7,9 @@
     initscr();
     // Enable colors
     start_color();
-    // Attempt recommendation in https://stackoverflow.com/questions/1896162/how-to-get-a-brightwhite-color-in-ncurses and other places on the web
-    use_default_colors();
-    // Make the COLOR_PAIR 0xFF refer to a white foreground, black background window.
-    // Using -1 will not work in my case, because I want the opposite of the default (black text  on white bg), not the default (white text on black bg).
+    // redefine colors, using the initc capability in TERM=xterm-256color
+    init_color(COLOR_BLACK, 0, 0, 0);
+    init_color(COLOR_WHITE, 999, 999, 999);
     init_pair(0xFF, COLOR_BLACK, COLOR_WHITE);
     refresh();
     // Get our term height and width.

但是
nano
不能做到这一点。您可能会发现阅读它会很有帮助,看看它通过使用终端的默认颜色来解决问题。

如果至少有16种颜色,我的建议是定义明亮的颜色(9到15),并且
可以改变颜色()
返回真值。否则返回非明亮的颜色:

#include <stdlib.h>
#include <locale.h>
#include <ncurses.h>

#define PAIR_BW       1
#define BRIGHT_WHITE  15

int main(void) {
    int rows, cols;

    setlocale(LC_ALL, "");
    initscr();

    start_color();
    use_default_colors();
    if (can_change_color() && COLORS >= 16)
        init_color(BRIGHT_WHITE, 1000,1000,1000);

    if (COLORS >= 16) {
        init_pair(PAIR_BW, COLOR_BLACK, BRIGHT_WHITE);
    } else {
        init_pair(PAIR_BW, COLOR_BLACK, COLOR_WHITE);
    }

    refresh();
    getmaxyx(stdscr, rows, cols); 
    WINDOW *window = newwin(rows,cols,0,0);
    wbkgd(window, COLOR_PAIR(PAIR_BW));
    box(window, 0, 0); 
    mvwprintw(window, 1, 1, "背景:不白");
    wrefresh(window);

    getch(); 
    endwin();
    return EXIT_SUCCESS;
}
#包括
#包括
#包括
#定义对1
#定义亮白15
内部主(空){
int行,cols;
setlocale(LC_ALL,“”);
initscr();
启动颜色();
使用默认颜色();
如果(可以更改颜色()&&COLORS>=16)
初始颜色(明亮的白色,10001000);
如果(颜色>=16){
初始配对(配对BW,颜色为黑色,亮白色);
}否则{
初始配对(配对BW、颜色黑色、颜色白色);
}
刷新();
getmaxyx(stdscr、rows、cols);
WINDOW*WINDOW=newwin(行,列,0,0);
wbkgd(窗口、颜色对(颜色对));
框(窗口,0,0);
mvwprintw(窗口,1,1,“背景:不白");
新鲜水(窗户);
getch();
endwin();
返回退出成功;
}

这已在Gnome终端3.18.3和XTerm 322中测试过,如果使用ncursesw,它应该可以在所有支持颜色的终端中工作(尽管在一些奇怪的终端上,您可能仍然会得到非明亮的白色背景)。

您引用的答案恰好不适用于几乎所有终端(包括屏幕截图中显示的终端)。我的答案基本上是一样的,只是人们可以检查终端是否能够使用
can\u change\u color()
重新定义颜色,并且最大颜色分量是1000,而不是999。您好,我觉得您的答案最好,我只有一个问题。为什么
can\u change\u color()在同一句话中,
COLORS>=16
在我看来,最好有一个if/else if/else,所以
if(can_change_color()){do so;}else if(COLORS>=15){用明亮的白色代替白色}否则{用颜色{u白色}> diff -u foo.c foo2.c
--- foo.c       2017-10-06 15:59:56.000000000 -0400
+++ foo2.c      2017-10-06 16:10:11.893529758 -0400
@@ -7,10 +7,9 @@
     initscr();
     // Enable colors
     start_color();
-    // Attempt recommendation in https://stackoverflow.com/questions/1896162/how-to-get-a-brightwhite-color-in-ncurses and other places on the web
-    use_default_colors();
-    // Make the COLOR_PAIR 0xFF refer to a white foreground, black background window.
-    // Using -1 will not work in my case, because I want the opposite of the default (black text  on white bg), not the default (white text on black bg).
+    // redefine colors, using the initc capability in TERM=xterm-256color
+    init_color(COLOR_BLACK, 0, 0, 0);
+    init_color(COLOR_WHITE, 999, 999, 999);
     init_pair(0xFF, COLOR_BLACK, COLOR_WHITE);
     refresh();
     // Get our term height and width.
#include <stdlib.h>
#include <locale.h>
#include <ncurses.h>

#define PAIR_BW       1
#define BRIGHT_WHITE  15

int main(void) {
    int rows, cols;

    setlocale(LC_ALL, "");
    initscr();

    start_color();
    use_default_colors();
    if (can_change_color() && COLORS >= 16)
        init_color(BRIGHT_WHITE, 1000,1000,1000);

    if (COLORS >= 16) {
        init_pair(PAIR_BW, COLOR_BLACK, BRIGHT_WHITE);
    } else {
        init_pair(PAIR_BW, COLOR_BLACK, COLOR_WHITE);
    }

    refresh();
    getmaxyx(stdscr, rows, cols); 
    WINDOW *window = newwin(rows,cols,0,0);
    wbkgd(window, COLOR_PAIR(PAIR_BW));
    box(window, 0, 0); 
    mvwprintw(window, 1, 1, "背景:不白");
    wrefresh(window);

    getch(); 
    endwin();
    return EXIT_SUCCESS;
}