WxWidgets - Bind () к событию изменения размера

Я вместе изучал 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), но динамически изменяющееся при изменении размера кадра. Но мне не удалось выяснить, как привязать к этому событию.

Может ли кто-нибудь дать мне пару заманчивых советов, как мне этого добиться? Заранее спасибо.

Привязка маршрутной модели в Laravel
Привязка маршрутной модели в Laravel
Laravel - один из самых популярных на сегодняшний день PHP-фреймворков. Одной из его многочисленных функций является Route Model Binding, которая...
4
0
1 222
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В объявлении класса для 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();

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

    event.Skip();
}

В основном это просто смотрит, сколько разделов в строке состояния, и изменяет текст последнего, чтобы отобразить текущий размер фрейма. Если вы знаете количество разделов в строке состояния, вы можете удалить этот шаг и просто использовать отсчитываемый от нуля индекс раздела, который вы хотите использовать для отображения текста в вызове SetStatusText.

event.Skip() и конец - разрешить любую другую обработку по умолчанию для события размера. Как правило, это всегда рекомендуется делать, если вы обрабатываете событие wxEVT_SIZE.

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

Надеюсь, это поможет вам начать.

Спасибо за исчерпывающий ответ! Я был так близок, но просто промахнулся. Я попробую это сделать, когда вернусь к своему компьютеру. Еще раз спасибо.

ConleeC 22.10.2018 21:22

Кстати, учитывая, что вы, очевидно, НАМНОГО более продвинуты в кодировании C++ и знаниях wxWidgets, есть ли что-нибудь еще в моем фрагменте кода, что вы хотели бы предложить более новый и / или лучший способ сделать это? Поскольку я только начинаю, я хотел бы с самого начала встать на правильную ногу.

ConleeC 22.10.2018 21:32

Ваш код выглядит неплохо. Я мог бы добавить 2 общих предложения. Во-первых, вам действительно не нужен макрос _T () для строк с wxWidgets 3.0 и выше. Во-вторых, в определении MainEditBox вы можете полностью опустить часть ', wxDefaultValidator, wxTextCtrlNameStr'. Когда вы опускаете такие параметры, конструктор будет использовать свой значения по умолчанию для отсутствующих аргументов. Обычно в wxWidgets последние несколько аргументов конструктора имеют значения по умолчанию, и вы можете проверить документацию, чтобы узнать, какие из них.

New Pagodi 22.10.2018 22:11

Другие вопросы по теме