2

我一直在玩 ncurses,我在网上发现很少有用的信息来处理垫子。我知道垫子是一种较大的屏幕外窗口,其中的部分可以打印在屏幕上较小的窗口上。

我编写了一个程序来在屏幕上打印 pad 的上下文。问题是该程序似乎只打印“逐行”并且不环绕文本。

程序的输出是这样的:

abcdefghij

abcdefghij

abcdefghij

但它应该是这样的:

abcdefghij

klmnopqrst

uvwxyzabc

在后一种情况下,同一行“环绕”而不是打印多行。

任何 ncurses 大师都可以告诉我如何实现这种包装功能吗?(即:魔法?)

询问您是否需要更多详细信息,程序的源代码:

#include <unistd.h>
#include <curses.h>

int main()
{
    WINDOW *pad_ptr;
    int x, y;
    int pad_lines;
    int pad_cols;
    char disp_char;

    initscr();

    pad_lines = LINES + 50;
    pad_cols = COLS + 50;

    pad_ptr = newpad(pad_lines, pad_cols);

    disp_char = 'a';
    for(x = 0; x < pad_lines; x++)
    {
            for(y = 0; y < pad_cols; y++)
            {
                    mvwaddch(pad_ptr, x, y, disp_char);
                    if(disp_char == 'z')
                            disp_char = 'a';
                    else
                            disp_char++;
            }
    }

/* We just filled the pad with letters from the alphabet. */

/* Now we will fill part of the main window with a 10x10 section
 * of the pad.
 * Notice that the text does not wrap around. (Where is 'k'?)
 */

    prefresh(pad_ptr, 0, 0, 3, 3, 9+3, 9+3);
    sleep(3000);

//  prefresh(pad_ptr, LINES + 5, COLS + 7, 5, 5, 21, 19);
//  sleep(4);

    delwin(pad_ptr);

    endwin();

    exit(0);
}
4

2 回答 2

2

您误解了护垫的工作方式。

垫允许您创建一个窗口(可能大于物理屏幕),然后显示窗口的一个子集。当您显示带有预刷新的焊盘时,您正在显示焊盘子集的视图。当您显示 pad 的子集时,内容不会改变(或包装)。

如果您将下面的代码添加到您的示例中,您将看到每次按下键时视口都会移动,但垫的内容不会改变。

for (x=0; x<10; x++) {
    prefresh(pad_ptr, 0, x, 3, 3, 9+3, 9+3);
    wgetch(pad_ptr);
}
于 2012-04-13T15:40:15.737 回答
0

将 pad_lines 和 pad_cols 更改为 9,看看你是否更快乐。

假设您的系统上的 LINES 和 COLS 为 100。您正在焊盘中创建一个 10+k 数组,例如:

a-z..a-z..a-z..a-k
l-z..a-z..a-z..a-d  
e-z..a-z..a-z..a-o //etc

然后在prefresh()屏幕上显示前 9 列(共 9 行)。

于 2012-04-13T00:46:48.067 回答