【问题标题】:NCURSES - colors in padNCURSES - 垫上的颜色
【发布时间】:2015-08-01 10:18:51
【问题描述】:

我正在 ncurses 中编写一个应用程序,并且我正在处理垫子中的颜色显示。我在 pad p 中添加了一些文本,颜色属性如下:

    if(has_colors())
        start_color();
    init_pair(0, COLOR_GREEN, COLOR_BLACK);
    attron(COLOR_PAIR(0));
    while( (ch=fgetc(f)) != EOF){
            waddch(p,ch);
    }
    attroff(COLOR_PAIR(0));
    fclose(f);

但是,当我使用prefresh(p,0, 0, 0,0, LINES-1,COLS-1); 显示部分选项卡时,会打印文本而没有任何更改。 (只有背景有点不同,因为我启动了颜色模式)。恐怕当文本从pad复制到屏幕时,它不会复制格式,是吗?如果是这样,有什么办法可以做到这一点?

谢谢!

|||-----编辑------||| 因此,即使我将密钥更改为不同于零的值,它也不起作用。我用这个打印到垫子上:

    init_pair(3,COLOR_RED,COLOR_CYAN);
    attron(COLOR_PAIR(3));
    for (i=0;i<str.length();i++){
        waddch(p,str[i]);
    }
    attroff(COLOR_PAIR(3)); 

prefresh后面的文字正常显示。

【问题讨论】:

  • 这实际上是两个问题,由于没有完整的测试程序,所以没有什么可以回答的。
  • 我看不懂,为什么是这两个问题。但无论如何我已经让它工作了,所以你是对的,没有什么可以回答的了。我将粘贴解决方案并关闭问题。
  • 我现在正在写解决方案。

标签: c ncurses


【解决方案1】:

颜色对 0 很特殊,因为(参考manual page)它始终是默认的前景色和背景色:

颜色对 0 假定为黑底白字,但 实际上,无论终端在颜色之前实现什么 被初始化。它不能被应用程序修改。

颜色对的三个组成部分结合起来形成一个单元格的颜色(参见manual page):

  • 背景字符
  • 通过wattron等设置窗口属性
  • 在参数中传递给 waddch 的视频属性(包括 COLOR_PAIR 值)。

如果传递了非零颜色对,则最后两个会影响结果;否则他们不会(并且使用列表中的前一项)。这些都是 window 操作。 attron/attron 函数适用于stdscr,不适用于pad 或窗口p。如果改成wattron(p,COLOR_PAIR(3));等,效果会更好。

【讨论】:

  • 即使我将密钥对更改为不同于 0 的值,它也没有任何效果。
【解决方案2】:

ncurses 手册页的这段摘录表明问题在于使用颜色对 0。

init_pair 例程更改颜色对的定义。它需要三个参数:要更改的颜色对数、前景色数和背景色数。对于便携式应用:

第一个参数的值必须介于 1 和 COLOR_PAIRS-1 之间,除非如果使用默认颜色(请参阅 use_default_colors),则调整上限以允许使用默认颜色的额外对前景和/或背景中的颜色。 " 强调我的

【讨论】:

  • 我再次尝试更改密钥的编号,但没有任何改变。请查看编辑。
  • 建议刷新pad 'prefresh();更改垫的内容后
  • 我认为...在定义 init_color(3...) 之前需要定义 1 和 2 的条目
  • 这是将颜色属性包含到 char 中的一种方法:' waddch( p, str[i] | COLOR_PAIR(3) )'
  • 您可能想在 attron() 函数之后使用 'touchwin()' 函数(并在 attoff() 函数之后再次更新 pad 属性
猜你喜欢
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 2012-05-16
  • 2019-05-17
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
相关资源
最近更新 更多