2013-07-17 199 views
0

我创建了一个类,我正在尝试模拟richtextbox,在Windows窗体上排序。这意味着当您向窗体/ richtextbox添加新数据时,它将添加到框/窗口的底部,其余部分将向上滚动一行。我试过启用scrollok(),但它似乎不想滚动。我不确定它是否被窃听或我的实施方式是错误的。可滚动窗口ncurses ruby​​

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类的绘图方法中。我可以用数百个条目填充Textpad类的数据数组,但只有数组的顶部才会被写入(直到它到达窗口的底部)而没有滚动。我手动滚动屏幕还是什么?从文档说它应该自动滚动,当光标到达底部,并添加另一条线。

+0

得到它的工作。显然'mvwprintw()'不会移动光标或者所以我不得不切换到正常的'wprintw()'这不是一个问题,因为我可以添加一个\ n到换行符。唯一的缺点是我的'mvchgat()'函数现在会缩进文本,而不是给特定的位置着色。 –

回答

0

引述手册页:

的scrollok选项控制当窗口的光标离开窗口或滚动区域的边缘会发生什么,无论是作为对新行操作的结果底线或输入最后一行的最后一个字符。如果禁用,(bf为FALSE),光标留在最后一行。如果启用(bf为TRUE),则窗口向上滚动一行...

代码中发生的情况是您试图在窗口之外打印这是一个错误,但是出现错误curses通过不打印任何东西来处理。

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

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

+0

是的,我意识到这一点,我有这部分固定。我现在遇到的麻烦是,我不能在该行/窗口着色特定字符。在它输出'[11.23.92] 这是一些消息',并且围绕用户名的括号将被着色为红色。现在它正在缩进这些行然后打印文本。我将'mvwprintw()'调用改为'wprintw()'调用,并在我的字符串末尾附加了一个\ n,并且滚动现在正在工作。有一种方法可以在一个函数调用中对字符进行着色,或者我必须多次调用'attr_on()'来设置行的风格 –

+0

您需要多次调用'attr_ *'函数。 – Craig

+0

我曾希望不是这样。哦,谢谢你的帮助! –