CEGUI學習筆記六-- 使用CEGUI解決具體問題

本文講述瞭如何實現以下幾個具體問題:
1、設置控件的背景爲透明。
2、以D3D9爲渲染層的時候,Tooltip工作不正常(一閃而過)。
3、模擬MessageBox。


--------------------------------------------------------------------------------

1、設置控件的背景爲透明
有3種方法來解決這個問題:

1、修改Imageset文件,提供相關的透明位圖;
修改Looknfeel文件,使用透明位圖進行繪製;
修改Scheme文件,使用新的外觀配置。

2、在程序裏寫如下代碼:

d_framewindow->setProperty("FrameEnabled","false");
d_framewindow->setProperty("BackgroundEnabled","false");

3、在LayoutEdit 中配置對象的FrameEnabled,和BackgroundEnabled屬性都爲false。


--------------------------------------------------------------------------------

2、以D3D9爲渲染層的時候,Tooltip工作不正常(一閃而過)。
該問題是BUG引起的,但不是CEGUI本身的問題。

出問題的語句在CEGuiD3D9BaseApplication.cpp中的這句:


guiSystem.injectTimePulse(GetTickCount() - d_lastTime);

明顯是個有問題的語句。。。。這句話導致CEGUI內部的時間流逝記數完全是個亂的....並且比現實至少快1000倍。Tooltip默認顯示7.5秒,7.5S * 000.1 = 7.5ns,所以顯示的時候一閃而過。

改爲

unsigned int time_diff = GetTickCount() - d_lastTime;
d_lastTime = GetTickCount();
guiSystem.injectTimePulse( time_diff * 0.001f)
而以OpenGL或者OGRE的渲染層則不會出現這個問題。


--------------------------------------------------------------------------------

3、模擬MessageBox
 1、使用LayoutEdit 搭建一個MessageBox,然後在程序的適當位置加入如下代碼:

bool handleMessageBoxBtnOKClicked( const CEGUI::EventArgs& args);
void CEGUI_MessageBox();


bool handleMessageBoxBtnOKClicked( const CEGUI::EventArgs& args)
...{
    using namespace CEGUI;
    const WindowEvetArgs& WindowArgs = static_cast<const WindowEventArgs&>(args);
    WindowArgs.window->getParent()->setModalState(false);
    WindowArgs.window->getParent()->setVisible(false);
    WindowArgs.window->getParent()->destroy();  
}

void CEGUI_MessageBox(const CEGUI::String& layoutfileName)
...{
    using namespace CEGUI;
    // 讀取MessageBox的佈局文件
    Window* msgbox = CEGUI::WindowManager::getSingleton().loadWindowLayout( layoutfileName );
    // 註冊MessageBox的按鈕事件
    msgbox->getChild("Frame/OK")->subscribeEvent( Window::EventMouseClick, Event::Subscriber( &handleMessageBoxBtnOKClicked) );
    // 將MessageBox的屬性設置爲模態窗口
  msgbox->setModalState(true);
    // 顯示MessageBox
    CEGUI::System::getSingleton().getGUISheet()->addChildWindow(msgbox);
}

不要擔心關於刪除的問題,CEGUI採用延後一貞刪除的策略,任何Destory操作都延後了。可以查看CEGUISystem的代碼。

在MS裏我們一般這樣寫關於MBox的代碼:
int ret = MessageBox("123","123",NULL,MB_OKCANCEL);
if( ret == 6 )
{}
else
{}

別想實現象MS裏的MessageBox,否則將面臨相當複雜的“重入”問題。

而且因爲我們事先已經知道如果MessageBox的某按鈕被按下時需要做什麼事,所以只需要把這部分的邏輯事先寫好,然後註冊到MessageBox裏的相應按鈕對象上去就可以了。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/kun1234567/archive/2008/04/17/2301036.aspx

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