视窗或投影没有正确调整窗口大小在wxWidgets
我有一个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事件,但在调整大小然后单击并拖动后,仍然存在相同的效果。
好吧,所以它原来是我的一个非常非常愚蠢的错误。
在此行glViewport(x, y, w, -h);
我意外地将高度设置为负值。删除负号解决了问题。我不确定它为什么会导致作物。我想高度为负值会阻止我看到任何东西,但是它有效,所以我不能抱怨我猜。再次感谢所有的帮助!
快速浏览一下你的代码,我注意到你的resize事件处理程序没有做更多的事情,而是要求另一次刷新。这对我来说似乎不正确。调整大小处理程序通常会进行一些计算,在请求刷新之前调用一个或多个子窗口的调整大小处理程序等。所以,我认为你的问题在于画布在重新绘制之前没有被调整大小。这可以解释为什么你的场景被剪辑。不知道该修补程序会是什么 - 希望这将是足够的提示,所以你可以朝正确的方向看。
我的印象是,调整大小处理程序在所有正常大小调整处理发生后才被调用。像回调一样。这不是这种情况吗? – jonbonazza 2013-02-24 17:37:00
此外,我尝试修正您的建议后更新了我的帖子。 – jonbonazza 2013-02-24 17:40:41
没有。调整大小处理程序调整窗口的大小。你已经重新实现了原来的调整大小处理程序与一个新的不做调整大小。 – ravenspoint 2013-02-24 17:55:05