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

В объявлении класса для 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.
Надеюсь, это поможет вам начать.
Кстати, учитывая, что вы, очевидно, НАМНОГО более продвинуты в кодировании C++ и знаниях wxWidgets, есть ли что-нибудь еще в моем фрагменте кода, что вы хотели бы предложить более новый и / или лучший способ сделать это? Поскольку я только начинаю, я хотел бы с самого начала встать на правильную ногу.
Ваш код выглядит неплохо. Я мог бы добавить 2 общих предложения. Во-первых, вам действительно не нужен макрос _T () для строк с wxWidgets 3.0 и выше. Во-вторых, в определении MainEditBox вы можете полностью опустить часть ', wxDefaultValidator, wxTextCtrlNameStr'. Когда вы опускаете такие параметры, конструктор будет использовать свой значения по умолчанию для отсутствующих аргументов. Обычно в wxWidgets последние несколько аргументов конструктора имеют значения по умолчанию, и вы можете проверить документацию, чтобы узнать, какие из них.
Спасибо за исчерпывающий ответ! Я был так близок, но просто промахнулся. Я попробую это сделать, когда вернусь к своему компьютеру. Еще раз спасибо.