我创建了一个类,我正在尝试创建一个类来模拟windows窗体上的richtextbox。这意味着当您向form/richtextbox添加新数据时,它会被添加到框/窗口的底部,而其余数据则向上滚动一行。
我已尝试启用scrollok(),但它似乎不想滚动。我不确定它是被sure了还是我实现它的方式是错误的。
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类的数据数组,但只有数组的最顶部(直到它到达窗口底部)才会被写入,而不会滚动。我是否需要手动滚动屏幕或其他什么?在文档中,它说当光标到达底部并添加另一行时,它应该自动滚动。
发布于 2013-07-18 05:30:23
引用手册页:
scrollok选项控制当窗口的光标移出窗口边缘或滚动区域时发生的情况,无论是由于在底行上执行换行符操作,还是由于键入最后一行的最后一个字符。如果禁用(bf为FALSE),光标将留在底线上。如果启用(bf为TRUE),窗口将向上滚动一行...
在您的代码中发生的情况是,您试图在窗口外打印,这是一个错误,但这是一个通过不打印任何东西来处理的错误。
您可以在到达窗口底部时打印新行,也可以在到达窗口底部时调用@window.scroll。
无论采用哪种方式,如果要显式设置位置,都需要在最后一行上继续打印。
https://stackoverflow.com/questions/17709672
复制相似问题