wxWidgets-Bind()调整大小事件

时间:2018-10-22 13:33:18

标签: binding wxwidgets

我一直在一起学习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),但随着调整帧的大小而动态变化。但是我没办法弄清楚如何绑定到该事件。

有人可以为我提供一两个诱人的建议,以提示我如何实现这一目标吗?预先谢谢你。

1 个答案:

答案 0 :(得分:4)

在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();

        statusBar->SetStatusText(
                                 wxString::Format("(%d:%d)",
                                                  event.GetSize().GetWidth(),
                                                  event.GetSize().GetHeight()),
                                  j-1);
    }

    event.Skip();
}

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

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

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

我希望这可以帮助您入门。