wxWidgets - привязка () к событию изменения размера - PullRequest
0 голосов
/ 22 октября 2018

Я вместе изучал wxWidgets и C ++, и это было супер захватывающе.Я использовал все онлайн-учебники, которые смог найти, купил и читаю книгу.Я хорошо знаю, что многие учебные пособия (и книга) устарели, поэтому часть моего обучения состоит в том, чтобы привести примеры в соответствие с текущей практикой.

Я преобразовал учебник "Ваше первое приложение"в вики wxwidgets использовать динамический 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 голосов
/ 22 октября 2018

В объявлении класса для MyFrame добавьте еще одно событие для обработки события размера

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() и конец - разрешить любую другую обработку по умолчанию для события size.Обычно это всегда хорошая идея, если вы обрабатываете событие wxEVT_SIZE.

Если вы хотите исследовать другие события в дополнение к событию size, вы можете найти полный список событий, поддерживаемых для классав разделе «События, испускаемые этим классом» соответствующей страницы документации.Вот страницы для wxWindow , wxTopLevelWindow и wxFrame .

Я надеюсь, что вы начали.

...