0

我创建了一个类,我试图在 Windows 窗体上模拟富文本框。这意味着当您将新数据添加到表单/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 类的数据数组,但只有数组的最顶部被写入(直到它到达窗口的底部)而没有滚动。我是否必须手动滚动屏幕或其他东西?从文档中它说当光标到达底部并添加另一行时它应该自动滚动。

4

1 回答 1

0

引用手册页:

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

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

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

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

于 2013-07-17T21:30:22.723 回答