2014-04-03 230 views
5

我正在爲我的gamedev項目製作一個非常小的遊戲內部GUI庫,但我無法找到處理焦點的乾淨方式。圖書館圖書館:如何正確處理重點?

我的庫支持嵌套列表框和小部件層次結構,但我似乎無法找到一種方法來防止在處理小部件焦點時出現奇怪的行爲。例如形式:

|------------| 
| Form [X] | 
|------------| 
|   | 
| [Button01] | 
|   | 
| [List1][v] | 
|   | 
| [Button02] | 
|   | 
|------------| 

我的設計採用了Context對象存儲Widget對象的列表。 A Widget可以有任意數量的孩子。我有設施遞歸迭代Widget的所有孩子/父母。

我關注的邏輯是目前:

  1. 如果上下文忙(拖動,縮放,編輯......),不改變焦點

  2. 如果按下鼠標的上下文之外或上下文是重點不突出,無焦點的一切

  3. 找到最上面的壓制孩子,如果任何

  4. 找到「最深」層次結構中的壓制孩子

  5. 無焦點的一切,但小部件一樣深,像最深的孩子,並注重上下文

然而,這在很多場合失敗,尤其是與嵌套的列表和文本框。我試圖在網上找到一個很好的解決方案,但找不到任何文章/教程。我不確定我是否應該專注於特殊的小部件,或者是否存在可以在任何情況下正常工作的「良好」算法。


GUI庫通常如何處理窗口小部件焦點?

是否有特別的說明,讓小工具(如ListBoxes或ComboBoxes)獨家專注?

這是我的GUI庫的source codevideo here

+0

嗯..這與回答你的問題無關。這只是對您的代碼/存儲庫的評論。不知道是否合適的C++ ..包括實現在內的每一行代碼都在頭文件或類聲明中。一切聲明爲內聯。你等待它編譯多少個小時?接下來幾乎沒有任何行有任何評論或沒有文檔/自述任何地方..一切都被命名爲SSV/SSU/SSVU ..噸的模板沒有..更改源代碼鏈接指向正確的文件(S)你想要檢查。該鏈接指向包含許多文件的文件夾.. – Brandon

+0

* GUI庫通常如何處理小部件焦點?*您可以隨時查看開源GUI庫,例如[MyGUI](http://mygui.info /)。 –

+0

「但是,這在許多場合都失敗了」 - 它有什麼作用?你期望它做什麼?雖然我們處在這個位置,但是「重點」是什麼意思?這個名字有不同的概念。 –

回答

2

我建議定義一個像數據結構一樣的樹,該數據結構將節點定義爲數據(窗口句柄,bool isFocus和一些額外的數據,如需要)以及節點 - 父,另外,將節點指針存儲在窗口數據區域內,以便從給定的窗口句柄中檢索節點指針。無論如何,從節點指針,數據會給你窗口句柄。現在,無論何時根窗口失去焦點,因爲您在其他應用程序上單擊鼠標或點擊alt +選項卡或其他東西,主窗口會失去焦點,並且您會收到殺死焦點的相應消息。處理,從窗口句柄重置所有isFocus爲節點樹。無論何時您點擊某個窗口,您都會收到gainfocus消息,從窗口句柄中找出該節點,並將isFocus設置爲true。並將其父親的所有副本isFocus設置爲true,直到到達頂層節點(root)。它有幫助嗎?

1

我不知道任何UI算法或用戶界面的正確方式,但是我很久以前就實現了一個通用的用戶界面庫(不是最好的,但它在那個時候已經達到了目的),也許使用的方法可以滿足您的需求。

爲了處理從父母到孩子的事件,使用兩種功能,具有以下原型:在一個枚舉發現

int handleEventReceived(int eventType, void* data); 
int getEventConsumers(int eventType, vector<IConsumers*>& consumers); 

OFC事件類型。

隨着所有孩子都實現了第一個函數,可以使用遞歸函數來爲每個孩子和孩子的孩子(如此廣播)發送事件。 當孩子回答事件時,它返回0,否則返回一些錯誤代碼(例如ERRROR_EVENT_NOT_TREATED)。

但是,如果您只希望UI的特定部分響應某個事件,請使用第二個函數。

第二個函數返回「最大響應優先級」,以及與此優先級相關的使用者。例如,如果您的聯繫人有3個優先級爲5的按鈕和2個優先級爲6的按鈕,則它將返回6以及包含兩個按鈕的數組,您可以向其發送事件。

就你而言,你說你需要爲子組件處理焦點。使用上述方法,我將創建一個事件ET_FOCUS_RECEIVED,並根據需要爲每個UI元素上的此事件設置不同的優先級。

在您的情況中,如果您將事件的優先級設置爲隨着元素在層次結構中的深度增加而增加,則來自同一深度的元素將具有相同的優先級(因此小部件與深度最小的子元素都將處理該事件)。