我創建了一個類,我正在嘗試模擬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類的數據數組,但只有數組的頂部纔會被寫入(直到它到達窗口的底部)而沒有滾動。我手動滾動屏幕還是什麼?從文檔說它應該自動滾動,當光標到達底部,並添加另一條線。
得到它的工作。顯然'mvwprintw()'不會移動光標或者所以我不得不切換到正常的'wprintw()'這不是一個問題,因爲我可以添加一個\ n到換行符。唯一的缺點是我的'mvchgat()'函數現在會縮進文本,而不是給特定的位置着色。 –