wxWidgets在wxPanel上绘制wxGLCanvas

时间:2014-08-19 09:17:06

标签: c++ opengl user-interface wxwidgets

我正在尝试在面板中绘制我的wxGLCanvas并填充面板区域,但结果如下图所示。我让OpenGL立方体样本运行正常,但在该示例中,wxGLCanvas是wxFrame的父级。当我尝试将它父级化为wxPanel时,我得到一小部分面板显示我的wxGLCanvas。

enter image description here

红色框应填充图像中的面板。 这是我的窗口的构造函数,它创建了图像中的所有内容。

wxBEGIN_EVENT_TABLE(MainWindow, wxFrame)
EVT_MENU(wxID_NEW, MainWindow::OnNewWindow)
EVT_MENU(wxID_CLOSE, MainWindow::OnClose)
wxEND_EVENT_TABLE()

MainWindow::MainWindow()
: wxFrame(NULL, wxID_ANY, wxT("OpenGL Project Test"),
wxDefaultPosition,wxDefaultSize)
{
    this->SetSizeHints( wxDefaultSize, wxDefaultSize );

    m_statusBar1 = this->CreateStatusBar( 1, wxST_SIZEGRIP, wxID_ANY );
    m_menubar1 = new wxMenuBar( 0 );
    m_menu1 = new wxMenu();
    m_menubar1->Append( m_menu1, wxT("MyMenu") ); 

    m_menu2 = new wxMenu();
    m_menubar1->Append( m_menu2, wxT("MyMenu") ); 

    m_menu3 = new wxMenu();
    m_menubar1->Append( m_menu3, wxT("MyMenu") ); 

    m_menu4 = new wxMenu();
    m_menubar1->Append( m_menu4, wxT("MyMenu") ); 

    this->SetMenuBar( m_menubar1 );

    m_toolBar4 = this->CreateToolBar( wxTB_HORIZONTAL, wxID_ANY ); 
    m_tool1 = m_toolBar4->AddTool( wxID_ANY, wxT("tool"), wxNullBitmap, wxNullBitmap,   wxITEM_NORMAL,  wxEmptyString, wxEmptyString, NULL ); 

    m_toolBar4->Realize(); 

    wxBoxSizer* bSizer1;
    bSizer1 = new wxBoxSizer( wxHORIZONTAL );

    // ######### Here is where I try to set the panel as a parent of MyGLCanvas ##########
    m_panel2 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize,          wxFULL_REPAINT_ON_RESIZE );
    bSizer1->Add( m_panel2, 1, wxEXPAND | wxALL, 5 );
    MyGLCanvas * glCanvas = new MyGLCanvas(m_panel2);


    m_ribbonBar2 = new wxRibbonBar( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxRIBBON_BAR_FLOW_VERTICAL );
    m_ribbonBar2->SetArtProvider(new wxRibbonDefaultArtProvider); 
    m_ribbonPage8 = new wxRibbonPage( m_ribbonBar2, wxID_ANY, wxT("MyRibbonPage") , wxNullBitmap , 0 );
    m_ribbonPage8->SetMinSize( wxSize( 400,400 ) );

    m_ribbonPanel16 = new wxRibbonPanel( m_ribbonPage8, wxID_ANY, wxT("MyRibbonPanel") ,wxBitmap() , wxDefaultPosition, wxDefaultSize, wxRIBBON_PANEL_DEFAULT_STYLE );
    m_ribbonButtonBar7 = new wxRibbonButtonBar( m_ribbonPanel16, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
    m_ribbonButtonBar7->AddButton( wxID_ANY, wxT("MyRibbonButton"), wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonButtonBar7->AddButton( wxID_ANY, wxT("MyRibbonButton"), wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonButtonBar7->AddButton( wxID_ANY, wxT("MyRibbonButton"), wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonButtonBar7->AddButton( wxID_ANY, wxT("MyRibbonButton"), wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonButtonBar7->AddButton( wxID_ANY, wxT("MyRibbonButton"), wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonButtonBar7->AddButton( wxID_ANY, wxT("MyRibbonButton"), wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonPanel17 = new wxRibbonPanel( m_ribbonPage8, wxID_ANY, wxT("MyRibbonPanel") , wxNullBitmap , wxDefaultPosition, wxDefaultSize, wxRIBBON_PANEL_DEFAULT_STYLE );
    m_ribbonToolBar2 = new wxRibbonToolBar( m_ribbonPanel17, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
    m_ribbonToolBar2->AddTool( wxID_ANY, wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonToolBar2->AddTool( wxID_ANY, wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonToolBar2->AddTool( wxID_ANY, wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonToolBar2->AddTool( wxID_ANY, wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonToolBar2->AddTool( wxID_ANY, wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonToolBar2->AddTool( wxID_ANY, wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonToolBar2->AddTool( wxID_ANY, wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonPanel18 = new wxRibbonPanel( m_ribbonPage8, wxID_ANY, wxT("MyRibbonPanel") , wxNullBitmap , wxDefaultPosition, wxDefaultSize, wxRIBBON_PANEL_DEFAULT_STYLE );
    m_ribbonToolBar3 = new wxRibbonToolBar( m_ribbonPanel18, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 );
    m_ribbonToolBar3->AddDropdownTool( wxID_ANY, wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonToolBar3->AddHybridTool( wxID_ANY, wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonToolBar3->AddHybridTool( wxID_ANY, wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonToolBar3->AddHybridTool( wxID_ANY, wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonToolBar3->AddDropdownTool( wxID_ANY, wxArtProvider::GetBitmap(wxART_QUESTION, wxART_OTHER, wxSize(32, 32)), wxEmptyString);
    m_ribbonBar2->Realize();

    bSizer1->Add( m_ribbonBar2, 0, wxALL, 5 );


    this->SetSizer( bSizer1 );
    this->Layout();

    this->Centre( wxBOTH );

    Show();

}

这让我感到困惑

m_panel2 = new wxPanel( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE );
bSizer1->Add( m_panel2, 1, wxEXPAND | wxALL, 5 );
MyGLCanvas * glCanvas = new MyGLCanvas(m_panel2);

1 个答案:

答案 0 :(得分:1)

你永远不会指明你的glCanvas应该如何布局 - 所以事实并非如此。最简单的解决方案是为面板使用sizer,并将画布添加到此sizer中,比例为1并展开标记。