基於Ogre::Bites實現自己的GUI系統(3)

       今天考慮實現自己的EditBox.今天很鬱悶,走了很多彎路....

      Ogre實現了一個默認的TextBox,在這個基礎上增加功能大概就可以實現EditBox.首先修改Widget的虛函數,增加響應鍵盤輸出的方法,然後在EditBox中實現他.TextBox有個默認的方法AppendText(),大概可以直接拿來用,或者使用setText(mText+input)也可以.運行了下demo,感覺效果不錯.但是輸入的字符是從上面輸入的,並且當整個box都被字符填充滿之後,後繼的字符不會自動換行顯示.本來我打算修改setText()的源代碼,不過後來發現一個取巧的辦法,只需要在每次輸入的時候把那個下拉條的位置設置到最後就可以了.後來我又覺得文本顯示一開始是從第一排開始顯示的,但有時候我希望能夠從最後1排開始顯示,解決這個問題也有個取巧的辦法...那就是在輸入文本的開頭默認添加幾個回車"/n".

      一切搞定後按照這個思路開始編碼.英文狀態下工作良好,輸入OK,沒問題.然後考慮試圖改變下字體的顏色,也沒問題.接下來考慮增加中文支持.使用一個鉤子來截取windows對應的消息.結果編碼完成後debug老是提示找不到ttf文件...費了我2個多小時多終於發現原來ttf文件拷貝錯文件夾了..無語啊~~再次DEBUG發現能輸入中文了,可以還沒高興多久馬上發現輸入第3個漢字的時候就絕對要出錯.百思不得其解,跟蹤代碼發現...Ogre的textbox在判斷換行邏輯的地方是把utfString轉換成std::string來計算長度...於是到這個第3個漢字的時候,textBox就要插入一個換行符,然後就出錯了,而插入換行符的這個位置恰好是一個漢字的正中間..

      唉 沒辦法,看來有些代碼還是要自己寫了.考慮到更多的一般性和實用性,Editbox的實現不再使用一個單獨的TextAreaOverlayElement了,而是一行文字就使用一個TextAreaOverlayElement.這樣的好處在於每行的文字的顏色大概可以設置成不一樣,每行的文字高度也可以設置成不一樣.而且也方便以後在裏面插入圖片等功能.今天實現了一部分功能,但是還是有很多BUG,明天來考慮繼續更改.

      另外今天看了下boost::bind,感覺可以用他來簡化工廠模式,明天有時間的話,使用bind把widget和windows的創建加到OESystem的功能中去.

      下面放一段代碼,如何在程序中動態改變一個TextArea的文字.這段程序的執行不需要任何腳本.只需要Ogre的資源路徑中能找到對應的ttf文件.一般比較普遍的做法是拷貝...不過也許把windows的字體目錄加到資源路徑中也是一個選擇.

 

 

這裏順便放一張EditBox重寫代碼後的測試截圖:

EditBox 成功測試截圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章