我有一個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事件,但在調整大小然後單擊並拖動後,仍然存在相同的效果。
我的印象是,調整大小處理程序在所有正常大小調整處理髮生後才被調用。像回調一樣。這不是這種情況嗎? – jonbonazza 2013-02-24 17:37:00
此外,我嘗試修正您的建議後更新了我的帖子。 – jonbonazza 2013-02-24 17:40:41
沒有。調整大小處理程序調整窗口的大小。你已經重新實現了原來的調整大小處理程序與一個新的不做調整大小。 – ravenspoint 2013-02-24 17:55:05