wxWidgets -- Bind() 到调整大小事件
wxWidgets -- Bind() to a resize event
我一直在一起学习 wxWidgets 和 C++,这非常令人兴奋。我一直在使用我能找到的所有在线教程,并且已经购买并正在阅读这本书。我很清楚许多教程(和书)已经过时,所以我学习的一部分是将示例带到当前实践中。
例如,我已将 wxwidgets wiki 上的 "Your First App" 教程转换为使用动态 Bind() 而不是事件 table,并将对 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);
}
现在,作为一项学习练习,我有兴趣了解如何绑定到 'resize' 事件。我想做的是在调整大小时在状态栏中显示当前框架的大小,只是为了咧嘴一笑:类似于(300:200),但随着框架的调整大小时动态变化。但是我没有弄清楚如何绑定到这个事件。
任何人都可以提供一两个关于如何实现这一目标的诱人提示吗?提前谢谢你。
在 MyFrame 的 class 声明中,再添加一个事件来处理尺寸事件
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
事件,这样做总是一个好主意。
如果您想探索除大小事件之外的其他事件,您可以在相关文档页面的 'Events emitted by this class' 部分找到 class 支持的完整事件列表。这是 wxWindow, wxTopLevelWindow, and wxFrame.
的页面
希望这能让你入门。
我一直在一起学习 wxWidgets 和 C++,这非常令人兴奋。我一直在使用我能找到的所有在线教程,并且已经购买并正在阅读这本书。我很清楚许多教程(和书)已经过时,所以我学习的一部分是将示例带到当前实践中。
例如,我已将 wxwidgets wiki 上的 "Your First App" 教程转换为使用动态 Bind() 而不是事件 table,并将对 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);
}
现在,作为一项学习练习,我有兴趣了解如何绑定到 'resize' 事件。我想做的是在调整大小时在状态栏中显示当前框架的大小,只是为了咧嘴一笑:类似于(300:200),但随着框架的调整大小时动态变化。但是我没有弄清楚如何绑定到这个事件。
任何人都可以提供一两个关于如何实现这一目标的诱人提示吗?提前谢谢你。
在 MyFrame 的 class 声明中,再添加一个事件来处理尺寸事件
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
事件,这样做总是一个好主意。
如果您想探索除大小事件之外的其他事件,您可以在相关文档页面的 'Events emitted by this class' 部分找到 class 支持的完整事件列表。这是 wxWindow, wxTopLevelWindow, and wxFrame.
的页面希望这能让你入门。