【问题标题】:scrollable window ncurses ruby可滚动窗口 ncurses ruby
【发布时间】:2013-07-17 20:33:13
【问题描述】:

我创建了一个类,我试图在 Windows 窗体上模拟 Richtextbox。这意味着当您将新数据添加到表单/richtextbox 时,它会添加到框/窗口的底部,其余部分会向上滚动一行。

我尝试启用scrollok(),但它似乎不想滚动。我不确定它是否被窃听或者我的实现方式是错误的。

class Textpad
        attr_accessor :data, :name, :window
        def initialize(name, height, width, startx, starty)
                @data   = []
                @name   = name
                @height = height
                @width  = width
                @startx = startx
                @starty = starty
                Ncurses.refresh
                @window =  Ncurses.newwin(height, width, starty, startx)
                @window.scrollok true
                @window.wrefresh
        end

        def add(packetid, username, message)
                @data.push [Time.new.strftime('[%T]'), packetid, username, message]
                @data.shift if @data.length > 500
        end

       def draw
                Ncurses.init_pair(1, Ncurses::COLOR_YELLOW, Ncurses::COLOR_BLACK)
                Ncurses.init_pair(2, Ncurses::COLOR_CYAN, Ncurses::COLOR_BLACK)
                Ncurses.init_pair(3, Ncurses::COLOR_RED, Ncurses::COLOR_BLACK)
                Ncurses.init_pair(4, Ncurses::COLOR_WHITE, Ncurses::COLOR_BLACK)

                @window.wclear
                position = 0
                @data.each do |timestamp, packetid, username, message|
                        case packetid
                                when '1005'
                                        @window.mvwprintw(1*position, 1, "#{timestamp} «#{username}» #{message}")
                                        @window.mvchgat(1*position, timestamp.length+2, 1, Ncurses::A_NORMAL, 3, NIL)
                                        @window.mvchgat(1*position, timestamp.length+3+username.length, 1, Ncurses::A_NORMAL, 3, NIL) #colorize the symboles around the username

                        end
                        position += 1
                end
                @window.wrefresh
        end
end

问题出在我的 Textpad 类的 draw 方法中。我可以用数百个条目填充 Textpad 类的数据数组,但只有数组的最顶部被写入(直到它到达窗口的底部)而没有滚动。我是否必须手动滚动屏幕或其他东西?从文档中它说它应该在光标到达底部并添加另一行时自动滚动。

【问题讨论】:

  • 搞定了。显然mvwprintw() 没有移动光标或其他东西,所以我不得不切换到正常的wprintw(),这不是问题,因为我可以添加一个 \n 来换行它。唯一的缺点是我的 mvchgat() 函数现在缩进文本而不是为特定位置着色。

标签: ruby ncurses


【解决方案1】:

引用手册页:

scrollok 选项控制当窗口的光标移出窗口边缘或滚动区域时发生的情况,无论是由于底行上的换行操作,还是键入最后一行的最后一个字符。如果禁用,(bf 为 FALSE),光标将留在底行。如果启用,(bf 为 TRUE),窗口将向上滚动一行...

您的代码中发生的情况是您试图在窗口外打印,这是一个错误,但该错误会通过不打印任何内容来处理。

您可以在到达窗口底部时打印一个新行,或者在到达窗口底部时调用@window.scroll。

如果您明确设置位置,无论哪种方式,您都需要在最后一行继续打印。

【讨论】:

  • 是的,我意识到这一点,我已经修复了那部分。我现在遇到的问题是我无法为该行/窗口上的特定字符着色。在它输出 [11.23.92] <username> this is some message 之前,用户名周围的两个括号都将被着色为红色。现在它正在缩进行,然后打印文本。我将mvwprintw() 调用更改为wprintw() 调用,并在我的字符串末尾附加了一个\n,现在滚动正在工作。有没有办法在一个函数调用中为字符着色,还是我必须多次调用attr_on() 才能使线条风格化
  • 你需要多次调用attr_*函数。
  • 我希望不是这样。哦,好的,谢谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
相关资源
最近更新 更多