2013-07-17 145 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

我曾希望不是這樣。哦,謝謝你的幫助! –