2013-02-24 34 views
2

我有一個wxWigets應用程序,使用contrib包中的wxGLCanvas小部件。每次部件刷新時,我都會在渲染場景之前重新創建投影矩陣和視口。問題是,在框架被調整大小後,無論是通過拖動還是最大化或w/e,小部件的大小都被正確調整,但視區或投影(無法真正辨別哪個大小)沒有調整大小,因此場景最終會被裁剪。視窗或投影沒有正確調整窗口大小在wxWidgets

現在有些代碼。

我wxGLCanvas部件的構造是這樣的:

int attrib_list[] = { WX_GL_RGBA, WX_GL_DOUBLEBUFFER }; 

RenderCanvas::RenderCanvas(wxFrame* parent) : wxGLCanvas(parent, idRender, wxPoint(200, -1), wxSize(800, 600), wxFULL_REPAINT_ON_RESIZE, wxT("GLCanvas"), attrib_list) 
{ 
    Connect(idRender, wxEVT_PAINT, wxPaintEventHandler(RenderCanvas::PaintIt)); 
    Connect(idRender, wxEVT_SIZE, wxSizeEventHandler(RenderCanvas::Resize)); 

    Connect(idRender, wxEVT_LEFT_DOWN, wxMouseEventHandler(RenderCanvas::OnMouseLeftDown)); 
    Connect(idRender, wxEVT_LEFT_UP, wxMouseEventHandler(RenderCanvas::OnMouseLeftUp)); 
    Connect(idRender, wxEVT_MOTION, wxMouseEventHandler(RenderCanvas::OnMouseMotion)); 
} 

我overriode的PaintIt方法,像這樣:

void RenderCanvas::PaintIt(wxPaintEvent& event) 
{ 
    SetCurrent(); 
    wxPaintDC(this); 

    Render(); 
    Refresh(false); 
} 

和大小調整方法:

void RenderCanvas::Resize(wxSizeEvent& event) 
{ 
    Refresh(); 
} 

渲染上面使用的方法如下所示:

void RenderCanvas::Render() 
{ 
    Prepare2DViewport(0,GetClientSize().y,GetClientSize().x, 0); 

    glClear(GL_COLOR_BUFFER_BIT); 

    //Renders stuff... 

    glFlush(); 
    SwapBuffers(); 
} 

最後,在Prepare2DViewport,其中glViewport和glOrtho功能被稱爲是:

void RenderCanvas::Prepare2DViewport(int x, int h, int w, int y) 
{ 
    glClearColor(0.7f, 0.7f, 0.7f, 1.0f); // Grey Background 
    glEnable(GL_TEXTURE_2D); // textures 

    glEnable(GL_BLEND); 
    glEnable(GL_LINE_SMOOTH); 
    glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 


    glViewport(x, y, w, -h); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(x, (float)w, y, (float)h, -1.0f, 1.0f); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

還應當指出的是,我使用的getSize(試圖),而不是GetClientSize(),但該作用是相同的。另外,我在Ubuntu 12.04和wxWidgets的使用GTK

UPDATE:

還應當指出的是,我有點擊/每次實施以及(未顯示)拖動功能,並且鼠標點擊或拖動,小部件被刷新。據說,我嘗試斷開wxEVT_SIZE事件,但在調整大小然後單擊並拖動後,仍然存在相同的效果。

回答

1

好吧,所以它原來是我的一個非常非常愚蠢的錯誤。

在此行

glViewport(x, y, w, -h); 

我意外地將高度設置爲負值。刪除負號解決了問題。我不確定它爲什麼會導致作物。我想高度爲負值會阻止我看到任何東西,但是它有效,所以我不能抱怨我猜。再次感謝所有的幫助!

3

快速瀏覽一下你的代碼,我注意到你的resize事件處理程序沒有做更多的事情,而是要求另一次刷新。這對我來說似乎不正確。調整大小處理程序通常會進行一些計算,在請求刷新之前調用一個或多個子窗口的調整大小處理程序等。所以,我認爲你的問題在於畫布在重新繪製之前沒有被調整大小。這可以解釋爲什麼你的場景被剪輯。不知道該修補程序會是什麼 - 希望這將是足夠的提示,所以你可以朝正確的方向看。

+0

我的印象是,調整大小處理程序在所有正常大小調整處理髮生後才被調用。像回調一樣。這不是這種情況嗎? – jonbonazza 2013-02-24 17:37:00

+0

此外,我嘗試修正您的建議後更新了我的帖子。 – jonbonazza 2013-02-24 17:40:41

+0

沒有。調整大小處理程序調整窗口的大小。你已經重新實現了原來的調整大小處理程序與一個新的不做調整大小。 – ravenspoint 2013-02-24 17:55:05