打开wxDialog trough事件并为其添加一个面板

时间:2014-05-26 07:13:36

标签: wxwidgets

我尝试(自4天以来)通过ClickOnEvent在菜单项中打开wxDialog(在自己的类中声明)。

我已经设法得到一个空的wxDialog并打开它Nonmodal,所以我可以同时使用MainFrame。

但是当我尝试将面板添加到wxDialog但是出现错误时:

错误:无法直接调用构造函数'SideFrame :: SideFrame'[-fpermissive]

void MainFrame::f_SF2(wxCommandEvent& event)
{
  SideFrame::SideFrame("SF2")
       : wxDialog(NULL, -1, title, wxDefaultPosition, wxSize(250, 230))
  {
    sf_p = new wxPanel(this, -1);

    wxColour col1;
    col1.Set(_T("#000000"));

    sf_p->SetBackgroundColour(col1);

    sf2->Show();
  }
}

当我在下面尝试时,我收到了另一个错误:

对'SideFrame :: SideFrame(wxString const&)'的未定义引用

void MainFrame::f_SF2(wxCommandEvent& event)
{
SideFrame *sf2 = new SideFrame(_T("SF2"));


  wxPanel *sf_p = new wxPanel(sf2);

  wxColour col1;
  col1.Set(_T("#000000"));

  sf_p->SetBackgroundColour(col1);

  sf2->Show();
}

有人可以帮助我,并说我该怎么做? 我正在使用wxWidgets 2.9.4和g ++ - 编译器

1 个答案:

答案 0 :(得分:0)

  1. ctor不能直接在C ++中调用。请改用运算符new

  2. 检查SideFrame::SideFrame的签名。

  3. 下面是一个可能有用的示例。

    #include <wx/wx.h>
    
    class SideFrame : public wxDialog
    {
    public:
        SideFrame(wxString sTitle) : wxDialog(NULL, wxID_ANY, sTitle) {}
    protected:
        void OnClose(wxCloseEvent &) {
            this->Destroy(); // Ask wxWidgets to `delete this;`
        }
    private:
    wxDECLARE_EVENT_TABLE();
    };
    wxBEGIN_EVENT_TABLE(SideFrame, wxDialog)
        EVT_CLOSE(SideFrame::OnClose)
    wxEND_EVENT_TABLE()
    
    class CApp : public wxApp
    {
    public:
        bool OnInit() {
            wxFrame * frame = new wxFrame(NULL, wxID_ANY, "demo");
            // Double click the main frame to create a modeless dialog.
            frame->Bind(wxEVT_LEFT_DCLICK, [](wxMouseEvent &)->void{
                // Create and display a modeless dialog.
                SideFrame * sf2 = new SideFrame("untitled"); // Note, a modeless dialog MUST be dynamically-allocated.
                (new wxPanel(sf2))->SetBackgroundColour(wxColour("#000000"));
                sf2->Show(true);
            });
            frame->Show(true);
            return this->wxApp::OnInit();
        }
    };
    DECLARE_APP(CApp)
    IMPLEMENT_APP(CApp)
    

    请注意如何创建和删除无模式对话框。通常我们将它创建为普通的动态对象,然后以合适的处理方法释放它,我们将this->Destroy();