06-10-30,06-12-12

(06-10-30)

 學習了irrlicht 引擎的 UI 部分的設計。就這個引擎來說,個人覺得 UI部分設計上雖然有些問題,但是效果還是不錯的。於是寫了 Panel 類。開始他只是個控件容器,後來添加了拖拽功能,目的很明顯,我要通過他來實現窗口。

 所以,以前在事件上的處理部分需要改動。當幾個 Panel重疊的時候,會出現輸入事件處理上的一些問題,比如同時多個控件感應到輸入等。於是當某個控件接收並處理了輸入後應該返回一個信息。那麼我就這樣該動了事件處理接口:

 原來:
 virtual void processEvent (Event *e) = 0;
 現在:
 virtual bool processEvent (Event *e) = 0;

 當一個控件處理了輸入消息,並需要系統丟棄這個消息的時候 (因爲他已經處理了),返回true,否則返回false。

 另外,對於窗口的設計,需要窗口管理他自己的子控件的輸入事件的響應,於是不能讓每個子控件自己直接與輸入系統通信,輸入系統的信息由容納他的容器通知他。這樣可以將消除與輸入系統的綁定,很好。

(06-10-31)
   
 在客戶端事件的處理上,也就是使用UI控件的用戶處理來自UI控件的事件時,可能需要通過事件的具體實例來轉換成對應的事件,以便處理。
 比如有個APP類:
 class App : public CanListenEvent
 {
  bool processEvent (Event *e)
  {
   if (e->getRuntimeClassID()== ???:ClassID) //辨別事件
   {
    // 處理對應事件
   }
  }
 };

 這就要求不同的UI控件發出不同的事件,從而能彼此分離。所以設計的時候要注意。按照邏輯來說,不同的控件本來應該產生不同的事件,這是他們的本質。即便可以因爲重用以前的一些事件,也可能會給將來的擴展帶來麻煩。

(06-11-1)
   
 鑑於很多控件有被拖拽的能力, 我將這種能力獨立出來,形成類 IsDragable,來簡化鼠標拖拽事件的處理。這不僅使得代碼清晰,而且更具重用性。

 將鼠標和鍵盤事件以及輸入設備從UI包中獨立成INPUT包,雖然使UI包的使用綁定到了INPUT包上,但換來的好處是INPUT包的重利用性。

(06-12-12)

 對於模態窗口來說,他阻止了輸入事件的傳遞,也就是說,任何不屬於他處理的事件都將被丟棄。所以,我們可以在原來的panel類裏面稍微改進,即可實現模態效果。

 在處理鼠標和鍵盤事件的時候,先把事件交給他的子組件處理,然後,如果是模態panel,則丟掉事件。

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