CEGUI很難響應雙擊事件的解決方法

項目中,某一天突然出現了這樣的問題:CEGUI中的控件很難響應到雙擊事件。之前雙擊一下房間列表中的圖片很容易就進到某一房間了,而現在要在控間上連續猛擊N下才僥倖進的去。昨天,好好的研究了一下這個問題,最後終於解決掉。

首先,cegui內部支持兩種方式產生鼠標雙擊事件:

  • 第一種,接受window直接發送的雙擊事件,與之對應,外部要有一個消息注入: {%highlight c++%} case WM_LBUTTONDBLCLK: CEGUI::System::getSingleton().injectMouseButtonDoubleClick(CEGUI::LeftButton); break; {%endhighlight%}
  • 第二種,連續接收到兩次鼠標單擊的事件,如果間隔事件小於某一臨界值,則被cegui整合爲一個雙擊事件;

其次,windows中有一個WNDCLASSEX,它的style成員的值決定了會不會產生雙擊消息;

如果出現了wndClassex.style = CS_DBLCLKS這樣的形式,則間隔時間夠短的兩次鼠標單擊事件會產生一次單擊消息和一次雙擊消息(也就是說此時第二次單擊被判斷爲了一次雙擊);

如果wndClassex.style = 0(或其他值),則windows不會發送出雙擊消息,再快的兩次單擊事件也只能夠產生兩次單擊消息;

回到我們的問題,之前,客戶端的代碼是這樣的,wndClassex.style = 0,因此兩次很快的單擊事件被注入到cegui內部時,會被cegui判斷成一次雙擊事件,正常觸發相應的雙擊事件處理函數;(對應着CEGUI上面第二種產生雙擊事件的方式)

而現在,客戶端的代碼是這樣的,wndClassex.style = CS_DBLCLKS,也就是說很快的兩次單擊事件,產生了一個單擊消息和一個雙擊消息,這當然也沒有問題,問題是,客戶端那邊竟然搞忘了將雙擊消息注入到cegui內部,即缺少了上面貼出的那段代碼;最終導致cegui既不能以第一種方式產生雙擊事件,也不能以第二種方式產生雙擊事件;(此時當然應該是以第一種方式產生雙擊事件)

一開始以爲是cegui自己的bug,看了人家的代碼之後發現沒有問題,才從客戶端入手。。看似簡單的問題調試了多半天的時間,功力遠遠不夠,仍需努力!

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