(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,則丟掉事件。
06-10-30,06-12-12
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.