【问题标题】:wxWidgets -- Bind() to a resize eventwxWidgets -- Bind() 到一个 resize 事件
【发布时间】:2019-03-26 14:36:33
【问题描述】:

我一直在一起学习 wxWidgets 和 C++,这非常令人兴奋。我一直在使用我能找到的所有在线教程,并且已经购买并正在阅读这本书。我很清楚许多教程(和书)已经过时了,所以我学习的一部分是将示例带到当前的实践中。

例如,我已将 wxwidgets wiki 上的“您的第一个应用程序”教程转换为使用动态 Bind() 而不是事件表,并将对 wxEVT_COMMAND_MENU_SELECTED 的引用更新为更新和首选的 wxEVT_MENU:

MyFrame::MyFrame(const wxString &title) : wxFrame(nullptr, wxID_ANY, title) {

    MainMenu = new wxMenuBar();
    wxMenu *FileMenu = new wxMenu;
    MainMenu->Append(FileMenu, _T("File"));
    SetMenuBar(MainMenu);
    CreateStatusBar(1);

    FileMenu->Append(MENU_New, _T("&New"), _T("Create a new file"));
    FileMenu->Append(MENU_Open, _T("&Open"), _T("Open an existing file"));
    FileMenu->Append(MENU_Close, _T("&Close"), _T("Close the current document"));
    FileMenu->Append(MENU_Save, _T("&Save"), _T("Save the current document"));
    FileMenu->Append(MENU_SaveAs, _T("Save &As"), _T("Save current document with new name"));
    FileMenu->Append(MENU_Quit, _T("&Quit"), _T("Quit the editor"));

    Bind(wxEVT_MENU, &MyFrame::NewFile, this, MENU_New);
    Bind(wxEVT_MENU, &MyFrame::OpenFile, this, MENU_Open);
    Bind(wxEVT_MENU, &MyFrame::CloseFile, this, MENU_Close);
    Bind(wxEVT_MENU, &MyFrame::SaveFile, this, MENU_Save);
    Bind(wxEVT_MENU, &MyFrame::SaveAsFile, this, MENU_SaveAs);
    Bind(wxEVT_MENU, &MyFrame::Quit, this, MENU_Quit);

    MainEditBox = new wxTextCtrl(this, TEXT_Main, _T("Hi!\n"), wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxTE_RICH | wxNO_BORDER, wxDefaultValidator, wxTextCtrlNameStr);
}

现在,作为一个学习练习,我有兴趣弄清楚如何绑定到“调整大小”事件。我想做的,只是为了咧嘴笑,是在调整大小时在其状态栏中显示当前帧的大小:类似于(300:200),但随着帧大小的调整而动态变化。但是我没有弄清楚如何绑定到这个事件。

谁能给我一两个诱人的提示,告诉我如何实现这一点?提前谢谢你。

【问题讨论】:

    标签: binding wxwidgets


    【解决方案1】:

    在 MyFrame 的类声明中,再添加一个事件来处理 size 事件

    void OnSize( wxSizeEvent& event );
    

    或者你想怎么称呼它。

    然后在MyFrame::MyFrame 中,使用这样的调用绑定事件处理程序:

    Bind( wxEVT_SIZE, &MyFrame::OnSize, this );
    

    最后,如果你想在状态栏中显示框架的当前大小,事件处理程序的主体可能如下所示:

    void MyFrame::OnSize( wxSizeEvent& event )
    {
        wxStatusBar* sb=this->GetStatusBar();
    
        if (sb != NULL )
        {
            int j = sb->GetFieldsCount();
    
            sb->SetStatusText(
                                     wxString::Format("(%d:%d)",
                                                      event.GetSize().GetWidth(),
                                                      event.GetSize().GetHeight()),
                                      j-1);
        }
    
        event.Skip();
    }
    

    基本上,这只是查看状态栏中有多少部分,并更改最后一个部分的文本以显示框架的当前大小。如果您知道状态栏中的部分数量,则可以删除此步骤,而只需使用要使用的部分的从零开始的索引来显示对 SetStatusText 的调用中的文本。

    event.Skip() 和结尾是允许任何其他默认处理大小事件发生。通常,如果您处理 wxEVT_SIZE 事件,这样做总是一个好主意。

    如果您想探索除 size 事件之外的其他事件,您可以在相关文档页面的“此类发出的事件”部分中找到类支持的事件的完整列表。这是wxWindowwxTopLevelWindowwxFrame 的页面。

    我希望这能让你开始。

    【讨论】:

    • 感谢您的完整回答!我已经非常接近了,但只是错过了标记。当我回到我的电脑时,我会试试这个。再次感谢您。
    • 顺便说一句,鉴于您在 C++ 编码和 wxWidgets 知识方面显然要先进得多,我的代码 sn-p 中还有什么您想提出更新和/或更好的方法的吗去做吧?由于我刚刚开始,我想从一开始就右脚下车。
    • 您的代码看起来不错。我可以添加 2 条一般性建议。首先,在 wxWidgets 3.0 及更高版本中,您实际上并不需要围绕字符串的 '_T()' 宏。其次,在 MainEditBox 的定义中,您可以完全省略 ', wxDefaultValidator, wxTextCtrlNameStr' 部分。当你省略这样的参数时,构造函数将使用它的default values 来代替缺少的参数。通常在 wxWidgets 中,构造函数的最后几个参数将具有默认值,您可以查看文档以查看哪些参数。
    猜你喜欢
    • 2015-06-25
    • 2014-09-12
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 2021-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多